ZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzk3YWQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjRkMmUuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGQyYzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlIEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIEJhc2UgRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTUwMDUuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZHJhdzJkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZ2VmIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmludHJvIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5pY3UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vc2dpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscC5iYXNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5sdWNlbmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbiIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVpLmludHJvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS8ucHJvamVjdCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OWI1MTQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmNGQyZS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWEyMjEuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgRG9jIEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIERvY3VtZW50YXRpb24gRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM1N2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmRvYyIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTNkMjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y0ZDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1YjkyNi4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmVhdHVyZU5hbWU9RVBGIFBsYXRmb3JtIEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIFBsYXRmb3JtIEZlYXR1cmUuCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMDA4OTkuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0iCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmpjcmFmdC5qc2NoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXguc2VydmxldCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnNlcnZsZXQuanNwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5qYXNwZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuZWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYW50IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW50LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ib290IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUubmV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyLnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZWFyY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudG9tY2F0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzY2guY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRybyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYnJvd3NlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlLmFwcGxpY2F0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyIgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLm1vcnRiYXkuamV0dHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uaWJtLmljdSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5iZWFucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuam9icyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yY3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW50LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5tYW5pcHVsYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuZGVidWciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jdnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUuZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm9jbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5xdWVyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5xdWVyeS5vY2wiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJuZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub2NsLmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZHJhdzJkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ2VmIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuYWN0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLmFjdGlvbi5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmRuZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5kbmQuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5kbmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvcGVydGllcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLnJlbmRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIuYXd0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNsaXBib2FyZC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5wcm92aWRlcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkucHJpbnRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkucHJpbnRpbmcud2luMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuZG9tLnN2ZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuYnJpZGdlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay5kb20iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrLnN2Z2dlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsudXRpbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy53M2MuZG9tLnN2ZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUueGVyY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS54bWwucmVzb2x2ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrLmNzcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrLnBhcnNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsueG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnczYy5jc3Muc2FjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnczYy5kb20uc21pbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVtbDIuY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi5jb21tb24uZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVtbDIudW1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi51bWwuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTc0MDYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS9mZWF0dXJlLnhtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQ4NTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJFUEYgUHJvZHVjdCBmZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+Ci0gICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+Ci0gICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9saWNlbnNlIj4KLSAgICAgIFtFbnRlciBMaWNlbnNlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRiNGE5Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjRkMmUuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYyODFmLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmVhdHVyZU5hbWU9RVBGIFJDUCBGZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWRlc2NyaXB0aW9uPUVQRiBSQ1AgRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBSQ1AgVXBkYXRlcwotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9mZWF0dXJlLnhtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTQ5M2EuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucmNwIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjIuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTUzMjkuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y0ZDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Nzk3MC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmVhdHVyZU5hbWU9RVBGIFJpY2h0ZXh0IEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIFJpY2h0ZXh0IEZlYXR1cmUuCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjkxMTIuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uaWN1Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyMDViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9ImNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9CU0VkaXRvclZpZXcuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvQ29udGVudFBhY2thZ2VUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvR3VpZGFuY2VUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUHJvZHVjdEVkaXRvclZpZXcuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUHJvZHVjdFZpZXdlci5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Sb2xlRG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Sb2xlVGFza3NUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUm9sZVdvcmtQcm9kdWN0c1RhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrRGlzY2lwbGluZVRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrRG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrR3VpZGFuY2VzVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tTdGVwVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1dvcmtQcm9kdWN0RG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Xb3JrUHJvZHVjdEd1aWRhbmNlc1RhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Xb3JrUHJvZHVjdFRhc2tzVGFiLmphdmEiIGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTliMzI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIEF1dGhvcmluZyBVSSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjMzNTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiYjJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDI5IDE4OjA5OjQ5IFBTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDEwNTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZ2VmLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLnVpLmludHJvLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIuYXd0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWJiYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGhlbHAvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9oZWxwL2Jvb2sueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9oZWxwL2Jvb2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2IwODE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaGVscC9ib29rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIE1ldGhvZCBBdXRocm9pbmcgSGVscCBQYWdlIiAgdG9waWM9Imh0bWwvYm9vay5odG1sIj4KLQk8dG9waWMgbGFiZWw9Ik10aG9kIEF1dGhvcmluZyBPdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJBdXRob3JpbmcgVHV0b3JpYWwiIGhyZWY9Imh0bWwvdHV0b3JpYWwuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9JdGVyYXRpb24xNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1BoYXNlMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTk0NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1N5bmNoQmFyMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzk5NDRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5M2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5MjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRBbGxEZXBlbmRlbnRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRyZWZfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRyZWZfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQwY2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkcmVmX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NoZWNrZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjM0NGRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jbG9zdXJlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1NTQxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb2xsYXBzZWFsbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29sbGFwc2VkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0YzhiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24xNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24xNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmExMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE1ZmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbndhcm5fY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUwYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1YTViNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZGVjbm9kZV9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NmVhYTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY1MDZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lbmRub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxNzdmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lcnJvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlN2E5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNWIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRkOWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiODEzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnJlZXRleHRfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjRlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zaG93X2VtcHR5X3VpX2ZvbGRlcnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2R0b29sMTYvc2hvd19lbXB0eV91aV9mb2xkZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlMmFlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zaG93X2VtcHR5X3VpX2ZvbGRlcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvUHJlc19uYW1lX3RvZ2dsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwYWZhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1ZGU3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2EwNGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvU3RvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwODIzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2ZsYXRMYXlvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjc0Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDNlMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGRjZjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc0NzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV91cF9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyZGYxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODRmN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50X2Rpc2FibGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdmOGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd191aV9mb2xkZXJzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfdWlfZm9sZGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTRlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd191aV9mb2xkZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE3NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGVfbWV0aG9kX2xpYl9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NjRlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OTcyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NvbGxhcHNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzM2MzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9EaXNhYmxlQ2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjczNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZVVuY2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyYTc4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZVVuY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0V4cGFuZGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTc0NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0V4cGFuZGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZhOTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9VbmNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTEyNDE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9BdXRob3JpbmdQZXJzcGVjdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiNjM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uVmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29udGVudFZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0xpYnJhcnlWaWV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9oaWRlVW5jaGVja2VkRWxlbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwOTM0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxMzdlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Zjg3NWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdkNzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjgzNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbW92ZV91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMGMyYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1Y2FmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGZjZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zZWxlY3RfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvYXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NhcGFiaWxpdHlwYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBiMWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU5NWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbnRlbnRwYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2FkOTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIyZDhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY3VzdG9tY2F0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmE3ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyeXByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTVhOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MzA2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2Rpc2NpcGxpbmVncm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTI1N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZ3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21ldGhvZGxpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RsaWJyYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0Zjk3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21ldGhvZGxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTFhMjNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWV0aG9kcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL291dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9vdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL291dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9waGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb21wb25lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjZiNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTdmYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3NwbGFubmluZ3RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA2ODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWJkZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTI0YWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVkZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEyMmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZXNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjY3YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjMzZDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDllZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrZGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTEzNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZWNobmlxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3YTdlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzU1YTJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2xtZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sbWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2xtZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93aGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZTQ4ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93aGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya2Rlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZWE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNWViYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3Jrb3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd3BndWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjYzN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaG93Q29uZmlnRXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIyZjRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2YjFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N0bm9kZV9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5ZDBmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwN2QwN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2FybmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUyMGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dmX2VkaXRvcl9pY29uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGRjMWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93aXpiYW4vc3luY2hyb25pemF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93aXpiYW4vc3luY2hyb25pemF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTlhMzI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBBdXRob3JpbmcgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIENhdGVnb3J5Ci1tZXRob2RDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgUGVyc3BlY3RpdmUKLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRob3JpbmcKLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPUJyb3dzaW5nCi0KLSMgVmlld3MKLWxpYnJhcnlWaWV3TmFtZT1MaWJyYXJ5Ci1jb25maWd1cmF0aW9uVmlld05hbWU9Q29uZmlndXJhdGlvbgotY29udGVudFZpZXdOYW1lPUNvbnRlbnQKLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPUNvbmZpZ3VyYXRpb24gRXJyb3IgTG9nCi0KLSMgRWRpdG9ycwotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9TWV0aG9kIEVsZW1lbnQgRWRpdG9yCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1Db25maWd1cmF0aW9uIEVkaXRvcgotcHJvY2Vzc0VkaXRvck5hbWU9UHJvY2VzcyBFZGl0b3IKLWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWU9QWN0aXZpdHkgRGlhZ3JhbSBFZGl0b3IKLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gRWRpdG9yCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gRWRpdG9yCi0KLSMgV2l6YXJkcwotbmV3TWV0aG9kTGlicmFyeVdpemFyZE5hbWU9TWV0aG9kIExpYnJhcnkKLW5ld01ldGhvZExpYnJhcnlXaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1uZXdNZXRob2RQbHVnaW5XaXphcmROYW1lPU1ldGhvZCBQbHVnLWluCi1uZXdNZXRob2RQbHVnaW5XaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbWV0aG9kIHBsdWctaW4uCi1uZXdDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1NZXRob2QgQ29uZmlndXJhdGlvbgotbmV3Q29uZmlndXJhdGlvbldpemFyZERlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLQotIyBDaGVhdCBTaGVldHMKLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1NZXRob2QgQXV0aG9yaW5nIENoZWF0IFNoZWV0cwotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9R2V0dGluZyBTdGFydGVkCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PUNyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1Xcml0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1Xb3JrIHdpdGggUHJvY2Vzc2VzCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PU5hdmlnYXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1BZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVRhaWxvciBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkgVXNpbmcgQ29udHJpYnV0aW9uCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVJlcGxhY2UgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9QWRkIGEgTWV0aG9kIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsgKFVSTCkKLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1DcmVhdGUgYSBQcm9jZXNzIChDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcykKLQotIyBBY3Rpb24gU2V0Ci1hdXRob3JpbmdBY3Rpb25TZXQ9QXV0aG9yaW5nCi1jaGVhdFNoZWV0c0FjdGlvblNldD1DaGVhdCBTaGVldHMKLQotIyBHbG9iYWwgQWN0aW9ucwotbmV3TGlicmFyeUFjdGlvbj1NZXRob2QgJkxpYnJhcnkKLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPUNyZWF0ZSBhIG5ldyBNZXRob2QgTGlicmFyeQotbmV3UGx1Z2luQWN0aW9uPU1ldGhvZCAmUGx1Zy1pbgotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1DcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW4KLW5ld0NvbmZpZ0FjdGlvbj1NZXRob2QgJkNvbmZpZ3VyYXRpb24KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IE1ldGhvZCBDb25maWd1cmF0aW9uCi1vcGVuTGlicmFyeUFjdGlvbj1NZXRob2QgJkxpYnJhcnkKLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1PcGVuIGFuIGV4aXN0aW5nIE1ldGhvZCBMaWJyYXJ5Ci1vcGVuQ29uZmlnQWN0aW9uPU1ldGhvZCAmQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3BlbiBhbiBleGlzdGluZyBNZXRob2QgQ29uZmlndXJhdGlvbgotb3BlbkNoZWF0U2hlZXRzPSZDaGVhdCBTaGVldHMuLi4KLQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucwotbGlua1dpdGhFZGl0b3I9TGluayB3aXRoIEVkaXRvcgotbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgd2l0aCBFZGl0b3IKLXNob3dQcmVzZW50YXRpb25OYW1lcz1TaG93IFByZXNlbnRhdGlvbiBOYW1lcwotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1TaG93IFByZXNlbnRhdGlvbiBOYW1lcwotCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zCi1yZWZyZXNoQ29uZmlnPVJlZnJlc2gKLXJlZnJlc2hDb25maWdUb29sdGlwPVJlZnJlc2ggQ29uZmlndXJhdGlvbgotCi0jIFByZWZlcmVuY2UgUGFnZQotYXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2U9QXV0aG9yaW5nCi1wcm9jZXNzRWRpdG9yPVByb2Nlc3MgRWRpdG9yCi1saWJyYXJ5T3B0aW9ucz1MaWJyYXJ5IE9wdGlvbnMKLXN0YXJ0dXBBbmRTaHV0ZG93bj1TdGFydHVwIGFuZCBTaHV0ZG93bgotZGVidWc9RGVidWcKLW1vZGVsaW5nT3B0aW9ucz1Nb2RlbGluZyBPcHRpb25zCi1kaWFncmFtQXBwZWFyYW5jZT1EaWFncmFtIEFwcGVhcmFuY2UKLWJyZWFrZG93bkVsZW1lbnRBdHRyaWJ1dGVzPUJyZWFrZG93biBFbGVtZW50IEF0dHJpYnV0ZXMKLWxpYnJhcnlWaWV3T3B0aW9ucz1MaWJyYXJ5IFZpZXcgT3B0aW9ucwotCi0jIENvbW1hbmQgSGFuZGxlcgotc2VsZWN0QWxsPVNlbGVjdCBBbGwKLQotIyBQcm9wZXJ0aWVzIFZpZXcKLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9UHJvY2VzcwotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV3IENoaWxkCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldyBTaWJsaW5nCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1TaG93IFByb3BlcnRpZXMgJlZpZXcKLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1SZSZmcmVzaAotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmFsCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPURvY3VtZW50YXRpb24KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUd1aWRhbmNlCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1Xb3JrIFJvbGx1cAotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9VGVhbSBSb2xsdXAKLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1Xb3JrIFByb2R1Y3QgUm9sbHVwCi1fVUlfUHJvcGVydGllc19Sb2xlcz1Sb2xlcwotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVdvcmsgUHJvZHVjdHMKLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVN0ZXBzCi1fVUlfUHJvcGVydGllc19UZWFtcz1UZWFtcwotCi1SaWNoVGV4dE1hcmtlclR5cGVOYW1lPUhUTUwgUHJvYmxlbXMKLUNvbmZpZ3VyYXRpb25NYXJrZXJUeXBlTmFtZT1Db25maWd1cmF0aW9uIFByb2JsZW1zCi1FeHBsYW5hdGlvblRleHQ9RXhwbGFuYXRpb24KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWU2NjA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9Im5ld1BsdWdpbldpemFyZCIKLSAgICAgICAgIG5hbWU9Ik5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQgRXh0ZW5zaW9uIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvTmV3UGx1Z2luV2l6YXJkLmV4c2QiIC8+Ci0gICAgICAgICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJuZXdDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgbmFtZT0iTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZCBFeHRlbnNpb24iCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmV4c2QiIC8+ICAgICAgICAgCi0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJkZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciIKLSAgICAgICAgIG5hbWU9IkVkaXRvciBEZXNjcmlwdGlvbiBQYWdlIENvbHVtbiBQcm92aWRlciIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL2Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmV4c2QiLz4KLSAgICAgICAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImRlc2NyaXB0aW9uUGFnZVNlY3Rpb25Qcm92aWRlciIKLSAgICAgICAgIG5hbWU9IkVkaXRvciBEZXNjcmlwdGlvbiBQYWdlIFNlY3Rpb24gUHJvdmlkZXIiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9kZXNjcmlwdGlvblBhZ2VTZWN0aW9uUHJvdmlkZXIuZXhzZCIvPgotICAgICAgICAgCi0gIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJjb25maWd1cmF0aW9uVmlld01lbnVQcm92aWRlciIKLSAgICAgICAgIG5hbWU9IkNvbmZpZ3VyYXRpb24gVmlldyBNZW51IFByb3ZpZGVyIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvY29uZmlndXJhdGlvblZpZXdNZW51UHJvdmlkZXIuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0id2l6YXJkUmVnaXN0cnlQcm92aWRlciIKLSAgICAgICAgIG5hbWU9IldpemFyZCBSZWdpc3RlcnkgUHJvdmlkZXIiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS93aXphcmRSZWdpc3RyeVByb3ZpZGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkVkaXRvck9wZW5lciIgbmFtZT0iRWRpdG9yIE9wZW5lciIgc2NoZW1hPSJzY2hlbWEvZWRpdG9yT3BlbmVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkN1c3RvbWl6ZWRMb2NrZXIiIG5hbWU9IkN1c3RvbWl6ZWQgTG9ja2VyIiBzY2hlbWE9InNjaGVtYS9DdXN0b21pemVkTG9ja2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1ldGhvZFJpY2hUZXh0IiBuYW1lPSJNZXRob2QgUmljaCBUZXh0IEV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvbWV0aG9kUmljaFRleHQuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibWV0aG9kUmljaFRleHRFZGl0b3IiIG5hbWU9Ik1ldGhvZCBSaWNoIFRleHQgRWRpdG9yIEV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvbWV0aG9kUmljaFRleHRFZGl0b3IuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29udGVudFByb3ZpZGVyRmFjdG9yaWVzIiBuYW1lPSJDb250ZW50IFByb3ZpZGVyIEZhY3RvcmllcyIgc2NoZW1hPSJzY2hlbWEvY29udGVudFByb3ZpZGVyRmFjdG9yaWVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Ik1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzIiBuYW1lPSJNZXRob2QgRWxlbWVudCBFZGl0b3IgUGFnZSBQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL01ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzLmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBmaXhlZD0iZmFsc2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9BdXRob3JpbmdQZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIG5hbWU9IiVhdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWUiLz4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGZpeGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIG5hbWU9IiVicm93c2luZ1BlcnNwZWN0aXZlTmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9MaWJyYXJ5Vmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVsaWJyYXJ5Vmlld05hbWUiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uVmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVjb25maWd1cmF0aW9uVmlld05hbWUiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db250ZW50VmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVjb250ZW50Vmlld05hbWUiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3IgotICAgICAgICAgICAgICAgbW92ZWFibGU9InRydWUiCi0gICAgICAgICAgICAgICByYXRpbz0iMC41ZiIKLSAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD0iYm90dG9tIgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciLz4KLSAgICAgICAgIDx2aWV3U2hvcnRjdXQKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ii8+Ci0gICAgICAgICA8dmlld1Nob3J0Y3V0Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIvPgotICAgICAgICAgPHNob3dJblBhcnQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICAKLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgY2xvc2VhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3IgotICAgICAgICAgICAgICAgbW92ZWFibGU9InRydWUiCi0gICAgICAgICAgICAgICByYXRpbz0iMC43MGYiCi0gICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9InJpZ2h0IgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIi8+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlbWV0aG9kRWxlbWVudEVkaXRvck5hbWUiCi0gICAgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3kiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlY29uZmlndXJhdGlvbkVkaXRvck5hbWUiCi0gICAgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3kiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJXByb2Nlc3NFZGl0b3JOYW1lIi8+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdvcmtmbG93RWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdvcmtmbG93RWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JOYW1lIi8+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld01ldGhvZExpYnJhcnlXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVuZXdNZXRob2RMaWJyYXJ5V2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4gICAgICAgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld1BsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld01ldGhvZFBsdWdpbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJW5ld01ldGhvZFBsdWdpbldpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld0NvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVuZXdDb25maWd1cmF0aW9uV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eUNvbnRyaWJ1dG9yIj4KLSAgICAgIDxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0gICAgICAgICAgICB0eXBlTWFwcGVyPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRWxlbWVudFR5cGVNYXBwZXIiCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5FbGVtZW50TGFiZWxQcm92aWRlciI+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0iZWxlbWVudCIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkgY2F0ZWdvcnk9Im90aGVyIi8+Ci0gICAgICA8L3Byb3BlcnR5Q29udHJpYnV0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIj4KLSAgICAgICAgIDwhLS0gU1RBUlQgR0VORVJBTCAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLldvcmtCcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuV29ya1Byb2R1Y3REZXNjcmlwdG9yLkdlbmVyYWwiLz4KLQkJIDwhLS0gRU5EIEdFTkVSQUwtLT4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBTVEFSVCBET0NVTUVOVEFUSU9OIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuR2VuZXJhbCIvPgotCQkgPCEtLSBFTkQgRE9DVU1FTlRBVElPTiAtLT4KLQkJCi0JCSA8IS0tIFNUQVJUIEdVSURBTkNFIC0tPgotCQkgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50Lkd1aWRhbmNlIi8+ICAKLSAgICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2UiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5Lkd1aWRhbmNlIi8+IAotICAgICAgICAgPCEtLSBFTkQgR1VJREFOQ0UtLT4KLSAgICAgICAgIAotCQkgPCEtLSBBQ1RJVklUWSAtLT4gICAgICAgCi0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Xb3JrUm9sbHVwIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Xb3JrUm9sbHVwIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LlRlYW1Sb2xsdXAiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19XUF9Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5UZWFtUm9sbHVwIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtQcm9kdWN0c1JvbGx1cCIvPgotICAgICAgICAKLSAgICAgICAgIDwhLS0gVEFTSyBERVNDUklQVE9SIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1JvbGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuRGVzY3JpcHRvci5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlJvbGUiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5Sb2xlIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfU3RlcHMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvciBSZWxhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5TdGVwIi8+Ci0gICAgICAgICAKLSAgICAgICAgIDwhLS0gUk9MRSBERVNDUklQVE9SIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRhc2siCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19UZWFtcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLldvcmtQcm9kdWN0IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRlYW0iLz4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBURUFNIFBST0ZJTEUgLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfUm9sZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UZWFtUHJvZmlsZS5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRlYW1Qcm9maWxlLlJvbGUiLz4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBDT01QT1NJVEUgUk9MRSAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Sb2xlcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRlYW0iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQ29tcG9zaXRlUm9sZS5Sb2xlIi8+Ci0gICAgICA8L3Byb3BlcnR5VGFicz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVNlY3Rpb25zIj4KLSAgICAgIDxwcm9wZXJ0eVNlY3Rpb25zCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciI+Ci0gICAgICAgICA8IS0tIFNUQVJUIEdFTkVSQUwgU0VDVElPTiAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlHZW5lcmFsU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuR2VuZXJhbCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Sb2xlRGVzY3JpcHRvci5HZW5lcmFsIgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Xb3JrUHJvZHVjdERlc2NyaXB0b3IuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuV29ya1Byb2R1Y3REZXNjcmlwdG9yLkdlbmVyYWwiPiAgICAgIAotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAgICAgICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuV29ya0JyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uV29ya0JyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5CcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDwhLS0gRU5EIEdFTkVSQUwgU0VDVElPTiAtLT4KLSAgICAgICAgCi0gICAgICAgICA8IS0tIFNUQVJUIERPQ1VNRU5UQVRJT04gU0VDVElPTiAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5LkRvY3VtZW50YXRpb24iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuRGVzY3JpcHRvci5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkJyZWFrZG93bkVsZW1lbnQuRG9jdW1lbnQiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAgICAgIAotICAgICAgICAgPCEtLSBFTkQgRE9DVU1FTlRBVElPTiBTRUNUSU9OIC0tPgotICAgICAgCi0gICAgICAgICA8IS0tIFNUQVJUIEdVSURBTkNFIFNFQ1RJT04gLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuR3VpZGFuY2UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHdWlkYW5jZVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkJyZWFrZG93bkVsZW1lbnQuR3VpZGFuY2UiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5Lkd1aWRhbmNlIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8IS0tIEVORCBHVUlEQU5DRSBTRUNUSU9OIC0tPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIEFDVElWSVRZIC0tPiAgICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuV29ya1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuV29ya1JvbGx1cCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5UZWFtUm9sbHVwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5UZWFtUm9sbHVwIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtQcm9kdWN0c1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5Xb3JrUHJvZHVjdHNSb2xsdXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDwhLS0gRU5EIEFDVElWSVRZIC0tPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNlY3Rpb25zIGZvciBUYXNrRGVzY3JpcHRvciAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuUm9sZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uVGFza0Rlc2NyaXB0b3IuUm9sZSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAgCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLldvcmtQcm9kdWN0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uVGFza0Rlc2NyaXB0b3IuV29ya1Byb2R1Y3QiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlN0ZXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlRhc2tEZXNjcmlwdG9yU3RlcFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlRhc2tEZXNjcmlwdG9yLlN0ZXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICAKLSAgICAgICAgIDwhLS0gU2VjdGlvbnMgZm9yIFJvbGVEZXNjcmlwdG9yIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5Xb3JrUHJvZHVjdCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlJvbGVEZXNjcmlwdG9yLldvcmtQcm9kdWN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGVhbSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uUm9sZURlc2NyaXB0b3IuVGVhbSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgIAotCi0gICAgICAgICA8IS0tIFNlY3Rpb24gZm9yIFRlYW1Qcm9maWxlIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UZWFtUHJvZmlsZS5Sb2xlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UZWFtUHJvZmlsZVJvbGVTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UZWFtUHJvZmlsZS5Sb2xlIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNlY3Rpb24gZm9yIENvbXBvc2l0ZVJvbGUgLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkNvbXBvc2l0ZVJvbGUuUm9sZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Db21wb3NpdGVSb2xlLlJvbGUiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICA8L3Byb3BlcnR5U2VjdGlvbnM+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5Sb290UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlYXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVwcm9jZXNzRWRpdG9yIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQnJlYWtkb3duRWxlbWVudFByZWZQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQnJlYWtkb3duRWxlbWVudFByZWZQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIiAgICAgICAgICAgIAotICAgICAgICAgICAgbmFtZT0iJWJyZWFrZG93bkVsZW1lbnRBdHRyaWJ1dGVzIi8+ICAgICAgICAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5Vmlld1ByZWZQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVZpZXdQcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVsaWJyYXJ5Vmlld09wdGlvbnMiLz4KLSAgICAgIDwhLS0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Sb290UHJlZlBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLmxpYnJhcnlwcmVmcGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVsaWJyYXJ5T3B0aW9ucyIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkRlYnVnUHJlZlBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5EZWJ1Z1ByZWZQYWdlIgotICAgICAgICAgICAgbmFtZT0iJWRlYnVnIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTW9kZWxpbmdPcHRpb25zUHJlZlBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Nb2RlbGluZ09wdGlvbnNQcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVtb2RlbGluZ09wdGlvbnMiLz4KLSAgICAgIC0tPgotCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyI+Ci0gICAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld0NvbnRyaWJ1dGlvbi5yZWZyZXNoQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUmVmcmVzaENvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IisiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvUmVmcmVzaC5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLnJlZnJlc2giCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hDb25maWciCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hDb25maWdUb29sdGlwIi8+Ci0gICAgICA8L3ZpZXdDb250cmlidXRpb24+Ci0gICAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld0NvbnRyaWJ1dGlvbi5saW5rV2l0aEVkaXRvciIKLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlua1dpdGhFZGl0b3IiCi0gICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLmxpbmtXaXRoRWRpdG9yIgotICAgICAgICAgICAgICAgbGFiZWw9IiVsaW5rV2l0aEVkaXRvciIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0idG9nZ2xlIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVsaW5rV2l0aEVkaXRvclRvb2x0aXAiLz4KLSAgICAgIDwvdmlld0NvbnRyaWJ1dGlvbj4KLSAgICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3Q29udHJpYnV0aW9uLnNob3dQcmVzTmFtZXMiCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlNob3dQcmVzZW50YXRpb25OYW1lcyIKLSAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5zaG93UHJlc05hbWVzIgotICAgICAgICAgICAgICAgbGFiZWw9IiVzaG93UHJlc2VudGF0aW9uTmFtZXMiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InRvZ2dsZSIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcCIvPgotICAgICAgPC92aWV3Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmhhbmRsZXJzLlNlbGVjdEFsbEhhbmRsZXIiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJXNlbGVjdEFsbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnNlbGVjdEFsbEIiCi0gICAgICAgICAgICBuYW1lPSJzZWxlY3RBbGwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuc2VsZWN0QWxsQiIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICBzZXF1ZW5jZT0iQ3RybCtBIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iJWNoZWF0U2hlZXRzQWN0aW9uU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5hY3Rpb25TZXQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVvcGVuQ2hlYXRTaGVldHMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5DaGVhdFNoZWV0SGVscE1lbnVBY3Rpb24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9ncm91cC5hc3Npc3QiIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5hY3Rpb25zLkNoZWF0U2hlZXRIZWxwTWVudUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBsYWJlbD0iTWV0aG9kIEVsZW1lbnQgTGlnaHR3ZWlnaHQgTGFiZWwgRGVjb3JhdG9yIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclJlc29sdXRpb24iPgotICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgotICAgICAgCW1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnVucmVzb2x2ZWRQcm94eU1hcmtlciIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJtZXRob2RSaWNoVGV4dCIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiIG5hbWU9IiVSaWNoVGV4dE1hcmtlclR5cGVOYW1lIj4gCi0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0iZmFsc2UiLz4gCi0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPiAKLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ3VpZCIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNZXRob2RGaWVsZE5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbiBpZD0iY29uZmlndXJhdGlvbiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiIG5hbWU9IiVDb25maWd1cmF0aW9uTWFya2VyVHlwZU5hbWUiPiAKLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJmYWxzZSIvPiAKLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+IAotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlcnJvcklEIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmZpZ0d1aWQiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZWxlbWVudEd1aWQiLz4gCi0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdXNlR3VpZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclJlc29sdXRpb24iPgotICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKLSAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY29uZmlndXJhdGlvbiIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51c2VySW50ZXJhY3Rpb25IYW5kbGVyIj4KLSAgICAgIDx1c2VySW50ZXJhY3Rpb25IYW5kbGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5tZXRob2RSaWNoVGV4dCI+Ci0gICAgICA8bWV0aG9kUmljaFRleHQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kUmljaFRleHQiCi0gICAgICAgICAgICB2ZXJzaW9uPSIwIj4KLSAgICAgIDwvbWV0aG9kUmljaFRleHQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm1ldGhvZFJpY2hUZXh0RWRpdG9yIj4KLSAgICAgIDxtZXRob2RSaWNoVGV4dEVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RSaWNoVGV4dEVkaXRvciIKLSAgICAgICAgICAgIHZlcnNpb249IjAiPgotICAgICAgPC9tZXRob2RSaWNoVGV4dEVkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9DdXN0b21pemVkTG9ja2VyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9DdXN0b21pemVkTG9ja2VyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYzAzMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvQ3VzdG9taXplZExvY2tlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJDdXN0b21pemVkTG9ja2VyIiBuYW1lPSJDdXN0b21pemVkIExvY2tlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJDdXN0b21pemVkTG9ja2VyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IkN1c3RvbWl6ZWRMb2NrZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL01ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9NZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGJmNzJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL01ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9Ik1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzIiBuYW1lPSJNZXRob2QgRWxlbWVudCBFZGl0b3IgUGFnZSBQcm92aWRlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZW5hYmxlcyBhIHBsdWctaW4gdG8gYWRkLCByZW1vdmUsIG9yIHJlcGxhY2Ugb25lIG9yIG1vcmUgcGFnZXMgaW4gdGhlIGF1dGhvcmluZyBlZGl0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRvclBhZ2UiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdG9yUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLklNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24KLSAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5DdXN0b21DYXRlZ29yeUVkaXRvclBhZ2VQcm92aWRlciZxdW90OyZndDsKLSAgJmx0O2VkaXRvclBhZ2UKLSAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQ3VzdG9tQ2F0ZWdvcnlFc3RpbWF0aW9uUGFnZSZxdW90OwotICAgbmFtZT0mcXVvdDtFc3RpbWF0aW9uJnF1b3Q7Ci0gICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkN1c3RvbUNhdGVnb3J5RXN0aW1hdGlvblBhZ2UmcXVvdDsmZ3Q7Ci0gICZsdDsvZWRpdG9yUGFnZSZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjRhZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTmV3Q29uZmlndXJhdGlvbldpemFyZC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJuZXdQbHVnaW5XaXphcmQiIG5hbWU9Ik5ldyBNZXRob2QgUGx1Z2luIFdpemFyZCBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gZXh0ZW5kIHRoZSBOZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkIGJ5IHJlcGxhY2luZyBleGlzdGluZyB3aXphcmQgcGFnZXMgb3IgYWRkaW5nIG5ldyBvbmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRFeHRlbmRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRFeHRlbmRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZFBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIGV4dGVuZGVyLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLklQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRQYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIGV4dGVuc2lvbiAtICZxdW90O3JlcGxhY2UmcXVvdDsgb3IgJnF1b3Q7bmV3JnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0byBiZSByZXBsYWNlZCBvciB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBpbnNlcnRpbmcgYSBuZXcgd2l6YXJkIHBhZ2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpbnNlcnRpb24gdHlwZSBmb3IgYSBuZXcgd2l6YXJkIHBhZ2UgLSAmcXVvdDtiZWZvcmUmcXVvdDsgb3IgJnF1b3Q7YWZ0ZXImcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIHVzZWQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5ld0NvbmZpZ3VyYXRpb25XaXphcmQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2l6YXJkCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbldpemFyZEV4dGVuZGVyJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDbmZpZ3VyYXRpb25XaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2VsZWN0T3B0aW9uc1BhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7bmV3JnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSZxdW90OwotICAgICAgICAgICAgICAgaW5zZXJ0PSZxdW90O2FmdGVyJnF1b3Q7LyZndDsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICZsdDsvd2l6YXJkJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL05ld1BsdWdpbldpemFyZC5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTmV3UGx1Z2luV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNTYyNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTmV3UGx1Z2luV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9Im5ld1BsdWdpbldpemFyZCIgbmFtZT0iTmV3IE1ldGhvZCBQbHVnaW4gV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBleHRlbmQgdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmV3UGx1Z2luV2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld1BsdWdpbldpemFyZEV4dGVuZGVyJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5XaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luTWFpblBhZ2UmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TZWxlY3RPcHRpb25zUGFnZSZxdW90OwotICAgICAgICAgICAgICAgdHlwZT0mcXVvdDtuZXcmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luTWFpblBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIGluc2VydD0mcXVvdDthZnRlciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAmbHQ7L3dpemFyZCZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9jb25maWd1cmF0aW9uVmlld01lbnVQcm92aWRlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvY29uZmlndXJhdGlvblZpZXdNZW51UHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiMmUzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9jb25maWd1cmF0aW9uVmlld01lbnVQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJjb25maWd1cmF0aW9uVmlld01lbnVQcm92aWRlciIgbmFtZT0iQ29uZmlndXJhdGlvbiBWaWV3IE1lbnUgUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZW5hYmxlcyBhIHBsdWctaW4gdG8gcmVnaXN0ZXIgbW9yZSBtZW51IGNvbnRyaWJ1dGlvbnMgZm9yIGNvbmZpZ3VyYXRpb24gdmlldy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iTWVudUFjdGlvbiIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJNZW51QWN0aW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTWVudUFjdGlvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjUKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uCi0gIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY29uZmlndXJhdGlvblZpZXdNZW51UHJvdmlkZXImcXVvdDsmZ3Q7Ci0gICZsdDtzZWN0aW9uCi0gICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiZxdW90OwotICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24mcXVvdDsmZ3Q7Ci0gICZsdDsvc2VjdGlvbiZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9jb250ZW50UHJvdmlkZXJGYWN0b3JpZXMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2NvbnRlbnRQcm92aWRlckZhY3Rvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2I4NmI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2NvbnRlbnRQcm92aWRlckZhY3Rvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJjb250ZW50UHJvdmlkZXJGYWN0b3JpZXMiIG5hbWU9IkNvbnRlbnQgUHJvdmlkZXIgRmFjdG9yaWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLklDb250ZW50UHJvdmlkZXJGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlldyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJlYmJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9ImRlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIiBuYW1lPSJFZGl0b3IgRGVzY3JpcHRpb24gUGFnZSBDb2x1bW4gUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZW5hYmxlcyBhIHBsdWctaW4gdG8gcmVnaXN0ZXIgbW9yZSBjb2x1bW5zIGluIGRlc2NyaXB0aW9uIHBhZ2VzIG9mIHRoZSBhdXRob3JpbmcgZWRpdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb2x1bW4iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29sdW1uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2lkdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxpZ24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklDb2x1bW5Qcm92aWRlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjUKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uCi0gIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXImcXVvdDsmZ3Q7Ci0gICZsdDtjb2x1bW4KLSAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25UYWJFeHRyYUNvbHVtbiZxdW90OwotICAgd2lkdGg9JnF1b3Q7MjAmcXVvdDsKLSAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25UYWJFeHRyYUNvbHVtbiZxdW90OyZndDsKLSAgJmx0Oy9jb2x1bW4mZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZGVzY3JpcHRpb25QYWdlU2VjdGlvblByb3ZpZGVyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9kZXNjcmlwdGlvblBhZ2VTZWN0aW9uUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1MjNkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9kZXNjcmlwdGlvblBhZ2VTZWN0aW9uUHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0iZGVzY3JpcHRpb25QYWdlU2VjdGlvblByb3ZpZGVyIiBuYW1lPSJFZGl0b3IgRGVzY3JpcHRpb24gUGFnZSBTZWN0aW9uIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGVuYWJsZXMgYSBwbHVnLWluIHRvIHJlZ2lzdGVyIG1vcmUgc2VjdGlvbnMgaW4gZGVzY3JpcHRpb24gcGFnZXMgb2YgdGhlIGF1dGhvcmluZyBlZGl0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlY3Rpb24iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VjdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JU2VjdGlvblByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24KLSAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kZXNjcmlwdGlvblBhZ2VTZWN0aW9uUHJvdmlkZXImcXVvdDsmZ3Q7Ci0gICZsdDtzZWN0aW9uCi0gICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uVGFiRXh0cmFTZWN0aW9uJnF1b3Q7Ci0gICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uVGFiRXh0cmFTZWN0aW9uJnF1b3Q7Jmd0OwotICAmbHQ7L3NlY3Rpb24mZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZWRpdG9yT3BlbmVyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9lZGl0b3JPcGVuZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMTlkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9lZGl0b3JPcGVuZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0iZWRpdG9yT3BlbmVyIiBuYW1lPSJFZGl0b3IgT3BlbmVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIGV4dGVuc2lvbiB0byBkZWZpbmUgZWRpdG9yIG9wZW5lZC4gVGhlIG9wZW5lciBpcyBhc3NvY2lhdGVkIHdpdGggYW4gSUQgdGhhdCBtYXRjaGVzIHdpdGggdGhlIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBuYW1lLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJFZGl0b3JPcGVuZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iRWRpdG9yT3BlbmVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9tZXRob2RSaWNoVGV4dC5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvbWV0aG9kUmljaFRleHQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5NDEzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9tZXRob2RSaWNoVGV4dC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJtZXRob2RSaWNoVGV4dCIgbmFtZT0iTWV0aG9kIFJpY2ggVGV4dCBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGEgcGx1Zy1pbiB0byBkZWZpbmUgd2hpY2ggY2xhc3MgaXMgdXNlZCBmb3IgYSBNZXRob2QgUmljaCBUZXh0IHdpZGdldC4gIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBJTWV0aG9kUmljaFRleHQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1ldGhvZFJpY2hUZXh0Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1ldGhvZFJpY2hUZXh0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFZlcnNpb24gbXVzdCBiZSBhbiBpbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0RWRpdG9yLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9tZXRob2RSaWNoVGV4dEVkaXRvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWY2MGY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0RWRpdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9Im1ldGhvZFJpY2hUZXh0RWRpdG9yIiBuYW1lPSJNZXRob2QgUmljaCBUZXh0IEVkaXRvciBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGEgcGx1Zy1pbiB0byBkZWZpbmUgd2hpY2ggY2xhc3MgaXMgdXNlZCBmb3IgYSBNZXRob2QgUmljaCBUZXh0IEVkaXRvciB3aWRnZXQuICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtZXRob2RSaWNoVGV4dEVkaXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtZXRob2RSaWNoVGV4dEVkaXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBWZXJzaW9uIG11c3QgYmUgYW4gaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS93aXphcmRSZWdpc3RyeVByb3ZpZGVyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS93aXphcmRSZWdpc3RyeVByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTY4ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvd2l6YXJkUmVnaXN0cnlQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJ3aXphcmRSZWdpc3RyeVByb3ZpZGVyIiBuYW1lPSJXaXphcmQgUmVnaXN0ZXJ5IFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZFJlZ2lzdHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRSZWdpc3RyeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLklXaXphcmRSZWdpc3RyeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlQm91bmRzQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlQm91bmRzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRjMmVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZUJvdW5kc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlQm91bmRzQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBOb2RlIG5vZGU7Ci0KLQlwcml2YXRlIFBvaW50IG5ld0xvY2F0aW9uLCBvbGRMb2NhdGlvbjsKLQotCXByaXZhdGUgaW50IG5ld1dpZHRoLCBvbGRXaWR0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jaGFuZ2VCb3VuZHNDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBDaGFuZ2VCb3VuZHNDb21tYW5kKE5vZGUgbm9kZSwgUG9pbnQgbmV3TG9jYXRpb24sIGludCBuZXdXaWR0aCkgewotCQlzdXBlcihDaGFuZ2VCb3VuZHNDb21tYW5kLkxBQkVMKTsKLQkJc2V0Tm9kZShub2RlKTsKLQkJc2V0TmV3TG9jYXRpb24obmV3TG9jYXRpb24uZ2V0Q29weSgpKTsKLQkJdGhpcy5uZXdXaWR0aCA9IG5ld1dpZHRoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBub2RlICE9IG51bGwKLQkJCQkmJiBuZXdMb2NhdGlvbiAhPSBudWxsCi0JCQkJJiYgKG5ld1dpZHRoICE9IG9sZFdpZHRoIHx8ICEobm9kZS5nZXRMb2NhdGlvbigpCi0JCQkJCQkuZXF1YWxzKG5ld0xvY2F0aW9uKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZExvY2F0aW9uID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQlvbGRXaWR0aCA9IG5vZGUuZ2V0V2lkdGgoKTsKLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCW5vZGUuc2V0TG9jYXRpb24obmV3TG9jYXRpb24pOwotCQlub2RlLnNldFdpZHRoKG5ld1dpZHRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ld0xvY2F0aW9uKFBvaW50IGxvYykgewotCQluZXdMb2NhdGlvbiA9IGxvYzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlub2RlLnNldFdpZHRoKG9sZFdpZHRoKTsKLQkJbm9kZS5zZXRMb2NhdGlvbihvbGRMb2NhdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlSGVpZ2h0Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlSGVpZ2h0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGQ0OTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZUhlaWdodENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIENvbW1hbmQgdG8gaGFuZGxlIE5vZGUncyBoZWlnaHQgY2hhbmdlcy4KLSAqIENoYW5nZUJvdW5kc0NvbW1hbmQgaGFuZGxlcyBOb2RlJ3Mgd2lkdGggY2hhbmdlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VIZWlnaHRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE5vZGUgbm9kZTsKLQotCXByaXZhdGUgUG9pbnQgbmV3TG9jYXRpb24sIG9sZExvY2F0aW9uOwotCi0JcHJpdmF0ZSBpbnQgbmV3SGVpZ2h0LCBvbGRIZWlnaHQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAiQ2hhbmdlIEhlaWdodCBDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENoYW5nZUhlaWdodENvbW1hbmQoTm9kZSBub2RlLCBQb2ludCBuZXdMb2NhdGlvbiwgaW50IG5ld0hlaWdodCkgewotCQlzdXBlcihDaGFuZ2VIZWlnaHRDb21tYW5kLkxBQkVMKTsKLQkJc2V0Tm9kZShub2RlKTsKLQkJc2V0TmV3TG9jYXRpb24obmV3TG9jYXRpb24uZ2V0Q29weSgpKTsKLQkJdGhpcy5uZXdIZWlnaHQgPSBuZXdIZWlnaHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIG5vZGUgIT0gbnVsbAotCQkJCSYmIG5ld0xvY2F0aW9uICE9IG51bGwKLQkJCQkmJiAobmV3SGVpZ2h0ICE9IG9sZEhlaWdodCB8fCAhKG5vZGUuZ2V0TG9jYXRpb24oKQotCQkJCQkJLmVxdWFscyhuZXdMb2NhdGlvbikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRMb2NhdGlvbiA9IG5vZGUuZ2V0TG9jYXRpb24oKTsKLQkJb2xkSGVpZ2h0ID0gbm9kZS5nZXRIZWlnaHQoKTsKLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCW5vZGUuc2V0TG9jYXRpb24obmV3TG9jYXRpb24pOwotCQlub2RlLnNldEhlaWdodChuZXdIZWlnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKSB7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3TG9jYXRpb24oUG9pbnQgbG9jKSB7Ci0JCW5ld0xvY2F0aW9uID0gbG9jOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vZGUuc2V0SGVpZ2h0KG9sZEhlaWdodCk7Ci0JCW5vZGUuc2V0TG9jYXRpb24ob2xkTG9jYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZU5hbWVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VOYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDk1NmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZU5hbWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VOYW1lQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBOYW1lZE5vZGUgZWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWUsIG9sZE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE9fTUVTU0FHRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZTsKLQotCXB1YmxpYyBDaGFuZ2VOYW1lQ29tbWFuZChOYW1lZE5vZGUgZWxlbSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQllbGVtZW50ID0gZWxlbTsKLQkJb2xkTmFtZSA9IGVsZW0uZ2V0TmFtZSgpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIVN0clV0aWwuaXNCbGFuayhvbGROYW1lKSkgewotCQkJZWxlbWVudC5zZXROYW1lKG9sZE5hbWUpOwotCQl9IGVsc2UgewotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBQcm9tcHRFZGl0KG51bGwsIFVORE9fTUVTU0FHRSkpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOYW1lZE5vZGVFZGl0UGFydCBwYXJ0LCBTdHJpbmcgbXNnKSB7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2FybmluZ0RpYWxvZ190aXRsZTsKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1NGQxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE5vZGUgZWxlbWVudDsKLQotCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBuZXdOYW1lLCBvbGROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZChOb2RlRWRpdFBhcnQgZWxlbSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlwYXJ0ID0gZWxlbTsKLQkJZWxlbWVudCA9IChOb2RlKSBlbGVtLmdldE1vZGVsKCk7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBlbGVtZW50LmdldEdyYXBoTm9kZSgpOwotCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0UHJvcGVydHkoKTsKLQkJb2xkTmFtZSA9ICgoUHJvcGVydHkpIGxpc3QuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCSgoUHJvcGVydHkpIGVsZW1lbnQuZ2V0R3JhcGhOb2RlKCkuZ2V0UHJvcGVydHkoKS5nZXQoMCkpCi0JCQkJLnNldFZhbHVlKG5ld05hbWUpOwotCQlwYXJ0LnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkoKFByb3BlcnR5KSBlbGVtZW50LmdldEdyYXBoTm9kZSgpLmdldFByb3BlcnR5KCkuZ2V0KDApKQotCQkJCS5zZXRWYWx1ZShvbGROYW1lKTsKLQkJcGFydC5yZWZyZXNoKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDRjMzJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUJlbmRwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUJlbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBBYnNvbHV0ZUJlbmRwb2ludCBwb2ludDsKLQotCXByaXZhdGUgaW50IGluZGV4ID0gLTE7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZChMaW5rIGxpbmssIFBvaW50IGxvY2F0aW9uLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQlwb2ludCA9IG5ldyBBYnNvbHV0ZUJlbmRwb2ludChsb2NhdGlvbik7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gbGluayAhPSBudWxsICYmIHBvaW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKGluZGV4LCBwb2ludCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVMaW5rQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTGlua0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlNGQwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUxpbmtDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgTm9kZSBzb3VyY2UsIHRhcmdldDsKLQotCXByaXZhdGUgUG9pbnQgdGFyZ2V0RW5kUG9pbnQ7Ci0KLQlwcml2YXRlIFBvaW50IHNvdXJjZUVuZFBvaW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBDcmVhdGVMaW5rQ29tbWFuZChMaW5rIG5ld09iaiwgTm9kZSBzcmMpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlsaW5rID0gbmV3T2JqOwotCQlzb3VyY2UgPSBzcmM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCAmJiBsaW5rICE9IG51bGw7Ci0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlTdHJpbmcgbXNnID0gVmFsaWRhdGlvbi5jaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQsIGxpbmspOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAoc291cmNlID09IHRhcmdldCkgewotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKAotCQkJCQluZXcgQWJzb2x1dGVCZW5kcG9pbnQoc291cmNlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQktMTAsIDEwKSkpOwotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKAotCQkJCQluZXcgQWJzb2x1dGVCZW5kcG9pbnQoc291cmNlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQktMTAsIC0xMCkpKTsKLQkJCWxpbmsuZ2V0QmVuZHBvaW50cygpLmFkZCgKLQkJCQkJbmV3IEFic29sdXRlQmVuZHBvaW50KHNvdXJjZS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJMTAsIC0xMCkpKTsKLQkJfQotCi0JCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQodGFyZ2V0RW5kUG9pbnQpOwotCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KHNvdXJjZUVuZFBvaW50KTsKLQkJbGluay5zZXRTb3VyY2Uoc291cmNlKTsKLQkJbGluay5zZXRUYXJnZXQodGFyZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm9kZSB0YXJnZXQpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW5kUG9pbnQoUG9pbnQgcCkgewotCQl0YXJnZXRFbmRQb2ludCA9IHA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlRW5kUG9pbnQoUG9pbnQgcCkgewotCQlzb3VyY2VFbmRQb2ludCA9IHA7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldFRhcmdldEVuZFBvaW50KCkgewotCQlyZXR1cm4gdGFyZ2V0RW5kUG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzb3VyY2VFbmRQb2ludC4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U291cmNlRW5kUG9pbnQoKSB7Ci0JCXJldHVybiBzb3VyY2VFbmRQb2ludDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KG51bGwpOwotCQlsaW5rLnNldFRhcmdldEVuZFBvaW50KG51bGwpOwotCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0KSB7Ci0JCQlsaW5rLmdldEJlbmRwb2ludHMoKS5jbGVhcigpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTm9kZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZU5vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDc3ODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTm9kZUNvbW1hbmQgZXh0ZW5kcyBEaWFncmFtTW9kaWZ5Q29tbWFuZCB7Ci0KLQlwcml2YXRlIFBvaW50IGxvYzsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIENyZWF0ZU5vZGVDb21tYW5kKE5vZGUgbmV3T2JqZWN0LCBEaWFncmFtIHBhcmVudCwgUG9pbnQgbG9jYXRpb24pIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlub2RlID0gbmV3T2JqZWN0OwotCQlkaWFncmFtID0gcGFyZW50OwotCQlsb2MgPSBsb2NhdGlvbi5nZXRDb3B5KCk7Ci0JCXNldERpYWdyYW0ocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlub2RlLnNldExvY2F0aW9uKG51bGwpOwotCQlub2RlLnNldERpYWdyYW0obnVsbCk7Ci0JCWRpYWdyYW0uZ2V0Tm9kZXMoKS5yZW1vdmUobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EaWFncmFtTW9kaWZ5Q29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihsb2MpOwotCQlub2RlLnNldERpYWdyYW0oZGlhZ3JhbSk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQlkaWFncmFtLnNldERlZmF1bHROYW1lKChOYW1lZE5vZGUpIG5vZGUpOwotCQl9Ci0JCWRpYWdyYW0uZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKGRpYWdyYW0gaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQlpZiAoZGlhZ3JhbS5pc1JlYWRPbmx5KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVCZW5kcG9pbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVCZW5kcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDE2MzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVCZW5kcG9pbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgQWJzb2x1dGVCZW5kcG9pbnQgYmVuZHBvaW50OwotCi0JcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgRGVsZXRlQmVuZHBvaW50Q29tbWFuZChMaW5rIGxpbmssIGludCBpbmRleCkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJYmVuZHBvaW50ID0gbGluay5nZXRCZW5kcG9pbnRzKCkuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gaW5kZXggPj0gMCAmJiBiZW5kcG9pbnQgIT0gbnVsbCAmJiBsaW5rICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoaW5kZXgsIGJlbmRwb2ludCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTMzM2NhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgQ29tbWFuZCBkZWxlZ2F0ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9kZWxldGVDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QRVJNX0RFTEVURSA9ICJnZWYuZWRpYWdyYW0uJHBlcm0iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRGVsZXRlQ29tbWFuZChib29sZWFuIGhhcmREZWxldGUpIHsKLQkJc3VwZXIoTEFCRUwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZSAhPSBudWxsICYmIGRlbGVnYXRlLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlkZWxlZ2F0ZS5leGVjdXRlKCk7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgc2V0UGFydFRvQmVEZWxldGVkKE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOb2RlKQotCQkJZGVsZWdhdGUgPSBuZXcgRGVsZXRlTm9kZUNvbW1hbmQobW9kZWwpOwotCQllbHNlCi0JCQlkZWxlZ2F0ZSA9IG51bGw7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWRlbGVnYXRlLnVuZG8oKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWxldGVOb2RlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCQlwcm90ZWN0ZWQgTWFwIGluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZTsKLQotCQlwcm90ZWN0ZWQgTWFwIG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldDsKLQotCQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lciBjb250YWluZXI7Ci0KLQkJcHJvdGVjdGVkIE5vZGUgbm9kZTsKLQotCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCi0JCXB1YmxpYyBEZWxldGVOb2RlQ29tbWFuZChPYmplY3Qgbm9kZSkgewotCQkJdGhpcy5ub2RlID0gKE5vZGUpIG5vZGU7Ci0JCQljb250YWluZXIgPSAoTm9kZUNvbnRhaW5lcikgdGhpcy5ub2RlLmVDb250YWluZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlpbmRleCA9IGNvbnRhaW5lci5nZXROb2RlcygpLmluZGV4T2Yobm9kZSk7Ci0JCQkvLyBUaGVyZSdzIGFsd2F5cyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGlzIG5vZGUgaGFzIGFscmVhZHkgYmVlbgotCQkJLy8gZGVsZXRlZCBieSB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgKGVnLiwgd2hlbiB0aGUKLQkJCS8vIHBhY2thZ2UgY29udGFpbmluZyB0aGlzIGNsYXNzIGlzIGFsc28gc2VsZWN0ZWQpLiBIZW5jZSwgd2UgY2hlY2sKLQkJCS8vIHRvIHNlZSBpZiB0aGUgbm9kZSBleGlzdHMgaW4gdGhlIGRpYWdyYW0uIElmIG5vdCwgZG8gbm90aGluZy4KLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQlyZXR1cm47Ci0JCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UgPSBuZXcgSGFzaE1hcCgpOwotCQkJb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0ID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0LnB1dChsaW5rLCBsaW5rLmdldFRhcmdldCgpKTsKLQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlLnB1dChsaW5rLCBsaW5rLmdldFNvdXJjZSgpKTsKLQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCX0KLQkJCS8vIENvbW1lbnRpbmcgYmVsb3cgdHdvIGxpbmVzLCBMaW5rcyBnZXQgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbAotCQkJLy8gd2hlbiBsaW5rLnNldFRhcmdldChudWxsKSBvciBsaW5rLnNldFNvdXJjZShudWxsKSBpcyBkb25lLiAgRm9yIAotCQkJLy8gTm9kZSBpZiB3ZSBjbGVhciBpbmNvbWluZy9vdXRnb2luZyBjb25uZWN0aW9ucywgVW5kbyBjb21tYW5kIHdpbGwgbm90IHdvcmsuCi0JCQkKLQkJCS8vbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCS8vbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCWNvbnRhaW5lci5nZXROb2RlcygpLnJlbW92ZShpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCXJldHVybjsKLQkJCWNvbnRhaW5lci5nZXROb2RlcygpLmFkZChpbmRleCwgbm9kZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQua2V5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlsaW5rLnNldFRhcmdldCgoTm9kZSkgb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0LmdldChsaW5rKSk7Ci0JCQkJbGluay5zZXRTb3VyY2Uobm9kZSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2Uua2V5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlsaW5rLnNldFRhcmdldChub2RlKTsKLQkJCQlsaW5rLnNldFNvdXJjZSgoTm9kZSkgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlLmdldChsaW5rKSk7Ci0JCQl9Ci0JCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQgPSBudWxsOwotCQkJaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlID0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2NhbkV4ZWN1dGUoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJCWlmIChWYWxpZGF0aW9uLmNoZWNrRGVsZXRlKG5vZGUpICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQkJfQotCX0KLQkvKgotCSAqIE5vdCBpbiB1c2UuIE5lZWQgbW9kaWZpY2F0aW9uIGZvciBmdXR1cmUgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbnMuIAotCSAqIENvbXBvdW5kIENvbW1hbmQgZGVsZXRpb24gZG8gdGhlIHJlY3Vyc2l2ZSBkZWxldGlvbiBhbmQgdW5kby4gCi0JICovCi0vLwlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWxldGVOb2RlQ29tcG91bmRDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIHsKLS8vCQlwcm90ZWN0ZWQgTWFwIGluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZTsKLS8vCi0vLwkJcHJvdGVjdGVkIE1hcCBvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQ7Ci0vLwotLy8JCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyIGNvbnRhaW5lcjsKLS8vCi0vLwkJcHJvdGVjdGVkIE5vZGUgbm9kZTsKLS8vCi0vLwkJcHJvdGVjdGVkIGludCBpbmRleDsKLS8vCi0vLwkJcHVibGljIERlbGV0ZU5vZGVDb21wb3VuZENvbW1hbmQoT2JqZWN0IG5vZGUpIHsKLS8vCQkJdGhpcy5ub2RlID0gKE5vZGUpIG5vZGU7Ci0vLwkJCWNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKSB0aGlzLm5vZGUuZUNvbnRhaW5lcigpOwotLy8JCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotLy8JCQkJb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0LnB1dChsaW5rLCBsaW5rLmdldFRhcmdldCgpKTsKLS8vCQkJCWFkZChuZXcgRGVsZXRlTGlua0NvbW1hbmQoIGxpbmssIGZhbHNlKSk7Ci0vLwkJCX0KLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5ub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLS8vCQkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZS5wdXQobGluaywgbGluay5nZXRTb3VyY2UoKSk7Ci0vLwkJCQlhZGQobmV3IERlbGV0ZUxpbmtDb21tYW5kKCBsaW5rLCBmYWxzZSkpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotLy8JCQlpbmRleCA9IGNvbnRhaW5lci5nZXROb2RlcygpLmluZGV4T2Yobm9kZSk7Ci0vLwkJCS8vIFRoZXJlJ3MgYWx3YXlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoaXMgbm9kZSBoYXMgYWxyZWFkeSBiZWVuCi0vLwkJCS8vIGRlbGV0ZWQgYnkgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIChlZy4sIHdoZW4gdGhlCi0vLwkJCS8vIHBhY2thZ2UgY29udGFpbmluZyB0aGlzIGNsYXNzIGlzIGFsc28gc2VsZWN0ZWQpLiBIZW5jZSwgd2UgY2hlY2sKLS8vCQkJLy8gdG8gc2VlIGlmIHRoZSBub2RlIGV4aXN0cyBpbiB0aGUgZGlhZ3JhbS4gSWYgbm90LCBkbyBub3RoaW5nLgotLy8JCQlpZiAoaW5kZXggPT0gLTEpCi0vLwkJCQlyZXR1cm47Ci0vLwotLy8JCQlzdXBlci5leGVjdXRlKCk7Ci0vLwkJCWNvbnRhaW5lci5nZXROb2RlcygpLnJlbW92ZShpbmRleCk7Ci0vLwkJCQotLy8JCX0KLS8vCi0vLwkJcHVibGljIHZvaWQgdW5kbygpIHsKLS8vCQkJaWYgKGluZGV4ID09IC0xKQotLy8JCQkJcmV0dXJuOwotLy8JCQljb250YWluZXIuZ2V0Tm9kZXMoKS5hZGQoaW5kZXgsIG5vZGUpOwotLy8JCQlzdXBlci51bmRvKCk7Ci0vLwkJfQotLy8KLS8vCQkvKioKLS8vCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2NhbkV4ZWN1dGUoKQotLy8JCSAqLwotLy8JCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0vLwkJCWlmIChWYWxpZGF0aW9uLmNoZWNrRGVsZXRlKG5vZGUpICE9IG51bGwpCi0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0vLwkJfQotLy8JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlTGlua0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUxpbmtDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMGNmZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlTGlua0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVMaW5rQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIE5vZGUgc3JjLCB0YXJnZXQ7Ci0KLQlwcml2YXRlIGludCBzcmNJbmRleCwgdGFyZ2V0SW5kZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIERlbGV0ZUxpbmtDb21tYW5kKExpbmsgbGluaywgYm9vbGVhbiBpc0hhcmREZWxldGUpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQlzcmMgPSBsaW5rLmdldFNvdXJjZSgpOwotCQl0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmIChWYWxpZGF0aW9uLmNoZWNrRGVsZXRlKGxpbmspICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgc3JjICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gaWYgdGhlIGxpbmsgKHZpZXcpIHdhcyBkZWxldGVkLiBFZy4sIHVzZXIgc2VsZWN0cyBhCi0JICogY2xhc3MgYW5kIG9uZSBvZiBpdHMgcmVmZXJlbmNlcywgYW5kIGhpdHMgQ3RybCtEZWwuIFRoZSBjbGFzcyB3aWxsIGJlCi0JICogZGVsZXRlZCBmaXJzdCBhbmQgaXQgd2lsbCBkZWxldGUgYWxsIGl0cyByZWZlcmVuY2VzLiBXaGVuIHRoaXMgY29tbWFuZCBpcwotCSAqIGV4ZWN1dGVkLCBpdCBzaG91bGQgZG8gdGhlIGhhcmQtZGVsZXRlIHBhcnQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJc3JjSW5kZXggPSBzcmMuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCXRhcmdldEluZGV4ID0gdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pbmRleE9mKGxpbmspOwotCQlpZiAoc3JjSW5kZXggIT0gLTEgJiYgdGFyZ2V0SW5kZXggIT0gLTEpIHsKLQkJCXNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKHNyY0luZGV4KTsKLQkJCXRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKHRhcmdldEluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChzcmNJbmRleCAhPSAtMSAmJiB0YXJnZXRJbmRleCAhPSAtMSkgewotCQkJc3JjLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5hZGQoc3JjSW5kZXgsIGxpbmspOwotCQkJdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5hZGQodGFyZ2V0SW5kZXgsIGxpbmspOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGlhZ3JhbU1vZGlmeUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RpYWdyYW1Nb2RpZnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjE2YmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGlhZ3JhbU1vZGlmeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWdyYW1Nb2RpZnlDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIEVPYmplY3Qgb2JqZWN0OwotCi0JcHJpdmF0ZSBib29sZWFuIGNhblVuZG8gPSB0cnVlOwotCi0JcHVibGljIERpYWdyYW1Nb2RpZnlDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJT2JqZWN0IG9iaiA9IGRpYWdyYW0uZ2V0T2JqZWN0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlvYmplY3QgPSAoRU9iamVjdCkgb2JqOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZUV4ZWN1dGUoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KG9iamVjdCwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5jb21tYW5kX2Nhbm5vdEVkaXQsIAotCQkJCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChwcmVwYXJlRXhlY3V0ZSgpKSB7Ci0JCQlkb0V4ZWN1dGUoKTsKLQkJCWNhblVuZG8gPSB0cnVlOwotCQl9IGVsc2UgewotCQkJY2FuVW5kbyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNjYW5VbmRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gY2FuVW5kbzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0V4ZWN1dGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvTW92ZUJlbmRwb2ludENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL01vdmVCZW5kcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjc1YzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvTW92ZUJlbmRwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQmVuZHBvaW50IG1hbmlwdWxhdGlvbiBjb21tYW5kcyBjYW5ub3QgYmUgY2hhaW5lZCBvciBjb21wb3VuZGVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZUJlbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLQlwcml2YXRlIEFic29sdXRlQmVuZHBvaW50IG9sZEJlbmRwb2ludDsKLQotCUFic29sdXRlQmVuZHBvaW50IG5ld0JlbmRwb2ludDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgTW92ZUJlbmRwb2ludENvbW1hbmQoTGluayBsaW5rLCBQb2ludCBsb2NhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQluZXdCZW5kcG9pbnQgPSBuZXcgQWJzb2x1dGVCZW5kcG9pbnQobG9jYXRpb24pOwotCQlvbGRCZW5kcG9pbnQgPSBsaW5rLmdldEJlbmRwb2ludHMoKS5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgaW5kZXggPj0gMCAmJiBuZXdCZW5kcG9pbnQgIT0gbnVsbAotCQkJCSYmIG9sZEJlbmRwb2ludCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnNldChpbmRleCwgbmV3QmVuZHBvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5zZXQoaW5kZXgsIG9sZEJlbmRwb2ludCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlY29ubmVjdExpbmtDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTMyOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUmVjb25uZWN0TGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZTsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIG5ld05vZGUsIG9sZE5vZGU7Ci0KLQlwcml2YXRlIGludCB2aWV3SW5kZXg7Ci0KLQlwcml2YXRlIFBvaW50IGVuZFBvaW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBSZWNvbm5lY3RMaW5rQ29tbWFuZChMaW5rIGxpbmssIE5vZGUgbmV3Tm9kZSwgYm9vbGVhbiBpc1NvdXJjZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXRoaXMubmV3Tm9kZSA9IG5ld05vZGU7Ci0JCXRoaXMuaXNTb3VyY2UgPSBpc1NvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRQb2ludChQb2ludCBwKSB7Ci0JCWVuZFBvaW50ID0gcC5nZXRDb3B5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBsaW5rICE9IG51bGwgJiYgbmV3Tm9kZSAhPSBudWxsOwotCQlpZiAoIXJlc3VsdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpc1NvdXJjZSkgewotCQkJcmV0dXJuIFZhbGlkYXRpb24uY2hlY2tSZWNvbm5lY3QobmV3Tm9kZSwgbGluay5nZXRUYXJnZXQoKSwgbGluaykgPT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBWYWxpZGF0aW9uLmNoZWNrUmVjb25uZWN0KGxpbmsuZ2V0U291cmNlKCksIG5ld05vZGUsIGxpbmspID09IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCS8vIExpbmsKLQkJaWYgKGlzU291cmNlKSB7Ci0JCQlvbGROb2RlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCWlmIChvbGROb2RlICE9IG51bGwpIHsgLy8gc2FmZXR5IGNoZWNrIHRvIGhhbmRsZSBkYW5nbGluZyBsaW5rCi0JCQkJdmlld0luZGV4ID0gb2xkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaW5kZXhPZihsaW5rKTsKLQkJCX0KLQkJCWxpbmsuc2V0U291cmNlKG5ld05vZGUpOwotCQkJbGluay5zZXRTb3VyY2VFbmRQb2ludChlbmRQb2ludCk7Ci0JCX0gZWxzZSB7Ci0JCQlvbGROb2RlID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCWlmIChvbGROb2RlICE9IG51bGwpIHsgLy8gc2FmZXR5IGNoZWNrIHRvIGhhbmRsZSBkYW5nbGluZyBsaW5rCi0JCQkJdmlld0luZGV4ID0gb2xkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaW5kZXhPZihsaW5rKTsKLQkJCX0KLQkJCWxpbmsuc2V0VGFyZ2V0KG5ld05vZGUpOwotCQkJbGluay5zZXRUYXJnZXRFbmRQb2ludChlbmRQb2ludCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChpc1NvdXJjZSkgewotCQkJbmV3Tm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKGxpbmspOwotCQkJb2xkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuYWRkKHZpZXdJbmRleCwgbGluayk7Ci0JCX0gZWxzZSB7Ci0JCQluZXdOb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5yZW1vdmUobGluayk7Ci0JCQlvbGROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5hZGQodmlld0luZGV4LCBsaW5rKTsKLQkJfQotCQlvbGROb2RlID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzNTY1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWZyZXNoRGlhZ3JhbUZyb21CYXNlQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoRGlhZ3JhbUZyb21CYXNlQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBEaWFncmFtVUlSZXNvdXJjZXMucmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsOyAKLQotCXB1YmxpYyBSZWZyZXNoRGlhZ3JhbUZyb21CYXNlQWN0aXZpdHlDb21tYW5kKCkgewotCQlzdXBlcihMQUJFTCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTJkN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbWFuZHMgZm9yIGVkaXRpbmcgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MDQzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgRGlhZ3JhbUVkaXRQYXJ0IHsKLQotCWludCB5ID0gNjA7Ci0KLQlib29sZWFuIHhheGlzYmVnaW4gPSBmYWxzZTsKLQotCWJvb2xlYW4gbG9hZGluZyA9IHRydWU7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IHNwYWNpbmcgPSA0MDsKLQotCWZpbmFsIHN0YXRpYyBpbnQgeXNwYWNpbmcgPSAyMDsKLQotCWJvb2xlYW4gbWlzY2VsbGFuZW91cyA9IGZhbHNlOwotCi0JaW50IHggPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVFMgPSAib3V0cHV0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUUyA9ICJpbnB1dHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3QgcmVjZW50bHlBZGRlZFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqIAotCSAqIEVkaXRQYXJ0IGZvciBBY3Rpdml0eURldGFpbERpYWdyYW0uCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgbWV0aG9kIHN1cGVyLnJlc2V0Q2hpbGRyZW5Mb2NhdGlvbnMuIEluIHRoaXMsIEFsbCB0aGUgVGFzaydzCi0JICogTWFuZGF0b3J5SW5wdXQgd29ya3Byb2R1Y3RzIHBsYWNlZCBvbiB0b3AuIGFuZCBSb2xlVGFzayBjb21wb3NpdGUgaW4gdGhlCi0JICogbWlkZGxlLiBhbmQgVGFzaydzIG91dHB1dCB3b3JrcHJvZHVjdHMgc291dGguCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpIHsKLQkJZmluYWwgaW50IHlzcGFjaW5nID0gNDA7Ci0JCUxpc3Qgcm9sZWNvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1pc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRhc2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLnJlY2VudGx5QWRkZWRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJTm9kZSBuID0gKE5vZGUpICgoRWRpdFBhcnQpIGNoaWxkKS5nZXRNb2RlbCgpOwotCQkJaWYgKG4uZ2V0TG9jYXRpb24oKSA9PSBudWxsIHx8IG4uZ2V0TG9jYXRpb24oKS54ID09IC0xKSB7Ci0JCQkJdGhpcy5yZWNlbnRseUFkZGVkUGFydHMuYWRkKGNoaWxkKTsKLQkJCX0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQlyb2xlY29tcG9zaXRlTGlzdC5hZGQoY2hpbGQpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCQlOb2RlIG9iak5vZGUgPSAoTm9kZSkgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG9iak5vZGUgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQkJdGFza0xpc3QuYWRkKG9iak5vZGUpOwotCQkJCQkJSGFzaE1hcCB0YXNrTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCUxpc3QgaW5wdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTGlzdCBvdXRwdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJdGFza01hcC5wdXQoImlucHV0cyIsIGlucHV0TGlzdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRhc2tNYXAucHV0KCJvdXRwdXRzIiwgb3V0cHV0TGlzdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1hcC5wdXQob2JqTm9kZSwgdGFza01hcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSBub2RlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBwYXJ0Ci0JCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCWlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJCX0gZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJY2FsY1NpemUoY2hpbGQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWlzY0xpc3QuYWRkKGNoaWxkKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNldCBzaXplIGZvciB0aGUgcm9sZWNvbXBvc2l0ZS4KLQkJaWYgKCFyb2xlY29tcG9zaXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVjb21wb3NpdGVMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCQlMaXN0IGxpc3QgPSAoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIG9iamVjdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IxID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yMS5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlpZiAoKChEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQkJCVRhc2tOb2RlIHRhc2tOb2RlID0gKFRhc2tOb2RlKSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2sgPSAoVGFza0Rlc2NyaXB0b3IpIHRhc2tOb2RlCi0JCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciB3cGl0b3IgPSBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IHdwaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgd3BFZGl0UGFydCA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB3cGl0b3IKLQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cENvbXBvc2l0ZU5vZGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCQkJT2JqZWN0IHdwT2JqZWN0ID0gd3BDb21wb3NpdGVOb2RlLmdldE9iamVjdCgpOwotCQkJCQkJCQlpZiAod3BPYmplY3QuZXF1YWxzKHRhc2spKSB7Ci0JCQkJCQkJCQlpbnQgd2lkdGggPSB3cEVkaXRQYXJ0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCQkJCQlpbnQgaGVpZ2h0ID0gKChEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KSBvYmopCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJCQkJKChEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KSBvYmopCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQkJCQkJCQkJCQluZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpKTsKLQkJCQkJCQkJCWlmICgoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB3cEVkaXRQYXJ0Ci0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQkJCQkJTGlzdCBpbnB1dExpc3QgPSAoTGlzdCkgKChIYXNoTWFwKSBtYXAKLQkJCQkJCQkJCQkJCS5nZXQodGFza05vZGUpKS5nZXQoSU5QVVRTKTsKLQkJCQkJCQkJCQlpbnB1dExpc3QuYWRkKHdwRWRpdFBhcnQpOwotCQkJCQkJCQkJfSBlbHNlIGlmICgoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB3cEVkaXRQYXJ0Ci0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJCQkJCUxpc3Qgb3V0cHV0TGlzdCA9IChMaXN0KSAoKEhhc2hNYXApIG1hcAotCQkJCQkJCQkJCQkJLmdldCh0YXNrTm9kZSkpLmdldChPVVRQVVRTKTsKLQkJCQkJCQkJCQlvdXRwdXRMaXN0LmFkZCh3cEVkaXRQYXJ0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcm9sZWNvbXBvc2l0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVjb21wb3NpdGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTGlzdCBjb25maXJtZWRTZXFJbnB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBjb25maXJtZWRTZXFPdXRwdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgcm9sZWNvbXBvc2l0ZUxpc3QKLQkJCQkJCS5nZXQoaSkpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCURlc2NyaXB0b3JOb2RlRWRpdFBhcnQgdGFzayA9IChEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KSBsaXN0Ci0JCQkJCQkJLmdldChqKTsKLQkJCQkJaWYgKHRhc2suZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQlUYXNrTm9kZSB0YXNrbm9kZSA9IChUYXNrTm9kZSkgdGFzay5nZXRNb2RlbCgpOwotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGNvbXAgPSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuZ2V0KGspKS5nZXRNb2RlbCgpKTsKLQkJCQkJCQlpZiAod3Bjb21wLmdldE9iamVjdCgpLmVxdWFscyh0YXNrbm9kZS5nZXRPYmplY3QoKSkpIHsKLQkJCQkJCQkJaWYgKHdwY29tcC5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQkJCQljb25maXJtZWRTZXFJbnB1dExpc3QKLQkJCQkJCQkJCQkJLmFkZChpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJCQkJCS5nZXQoaykpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3Bjb21wID0gKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5nZXQoaykpLmdldE1vZGVsKCkpOwotCQkJCQkJCWlmICh3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKHRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQlpZiAod3Bjb21wLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQkJCQljb25maXJtZWRTZXFPdXRwdXRMaXN0Ci0JCQkJCQkJCQkJCS5hZGQob3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJLmdldChrKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFjb25maXJtZWRTZXFJbnB1dExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNldE9iamVjdHNMb2NhdGlvbnMoY29uZmlybWVkU2VxSW5wdXRMaXN0KTsKLQkJCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQl9Ci0JCQkJTGlzdCByb2xlQyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyb2xlQy5hZGQocm9sZWNvbXBvc2l0ZUxpc3QuZ2V0KGkpKTsKLQkJCQlzZXRPYmplY3RzTG9jYXRpb25zKHJvbGVDKTsKLQotCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJaWYgKCFjb25maXJtZWRTZXFPdXRwdXRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlzZXRPYmplY3RzTG9jYXRpb25zKGNvbmZpcm1lZFNlcU91dHB1dExpc3QpOwotCQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJaWYgKCFtaXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJpbnQgU2l6ZSBvZiBtaXNjOiAiICsgbWlzY0xpc3Quc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCFsb2FkaW5nKSB7Ci0JCQkJbWlzY2VsbGFuZW91cyA9IHRydWU7Ci0JCQl9Ci0JCQlzZXRPYmplY3RzTG9jYXRpb25zKG1pc2NMaXN0KTsKLQkJCW1pc2NlbGxhbmVvdXMgPSBmYWxzZTsKLQkJfQotCi0JCWxvYWRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY1NpemUoT2JqZWN0IGNoaWxkKSB7Ci0JCUxpc3QgbGlzdCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkKS5nZXRDaGlsZHJlbigpOwotCQlpbnQgbGFyZ2VzdFdpZHRoID0gMDsKLQkJaW50IGxhcmdlc3RIZWlnaHQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJTm9kZSBvYmpOb2RlID0gKE5vZGUpICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIHsKLQkJCQlpbnQgbm9kZVdpZHRoID0gKChEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KSBvYmopLmdldEZpZ3VyZSgpCi0JCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCWludCBub2RlSGVpZ2h0ID0gKChEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KSBvYmopLmdldEZpZ3VyZSgpCi0JCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQlpZiAobm9kZVdpZHRoID4gbGFyZ2VzdFdpZHRoKQotCQkJCQlsYXJnZXN0V2lkdGggPSBub2RlV2lkdGg7Ci0JCQkJaWYgKG5vZGVIZWlnaHQgPiBsYXJnZXN0SGVpZ2h0KQotCQkJCQlsYXJnZXN0SGVpZ2h0ID0gbm9kZUhlaWdodDsKLQkJCX0KLQkJfQotCQkoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCW5ldyBEaW1lbnNpb24obGFyZ2VzdFdpZHRoICogMiArIDEwLCAyMCArIGxhcmdlc3RIZWlnaHQKLQkJCQkJCSogKGxpc3Quc2l6ZSgpIC8gMiArIDEpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE9iamVjdHNMb2NhdGlvbnMoTGlzdCBsaXN0KSB7Ci0KLQkJeGF4aXNiZWdpbiA9IHRydWU7Ci0JCXggPSAxMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZDsKLQkJCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJCQlQb2ludCBwID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAueCA9PSAtMSkgewotCQkJCQkJaW50IHZpZXdlcldpZHRoID0gcGFydC5nZXRSb290KCkuZ2V0Vmlld2VyKCkKLQkJCQkJCQkJLmdldENvbnRyb2woKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJCWlmICgheGF4aXNiZWdpbikgewotCQkJCQkJCXggPSBjYWNoZWRQb2ludC54ICsgY2FjaGVkV2lkdGggKyBzcGFjaW5nOwotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2sgaWYgcCBpcyBudWxsLCBjcmVhdGUgUG9pbnQuCi0JCQkJCQlpZiAocCA9PSBudWxsKQotCQkJCQkJCXAgPSBuZXcgUG9pbnQoKTsKLQotCQkJCQkJaWYgKCFsb2FkaW5nICYmIG1pc2NlbGxhbmVvdXMpIHsKLQkJCQkJCQlwLnggPSB4OwotCQkJCQkJCXAueSA9IDEwOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwLnggPSB4OwotCQkJCQkJCXAueSA9IHk7Ci0JCQkJCQl9Ci0JCQkJCQlub2RlLnNldExvY2F0aW9uKHApOwotCQkJCQkJaWYgKCFtaXNjZWxsYW5lb3VzKQotCQkJCQkJCWNhY2hlZFBvaW50ID0gcDsKLQkJCQkJCWNhY2hlZFdpZHRoID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCQlpZiAocGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0ID4gY2FjaGVkSGVpZ2h0KQotCQkJCQkJCWNhY2hlZEhlaWdodCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXhheGlzYmVnaW4gPSBmYWxzZTsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJQb2ludCA6ICIgKyBuZXcgUG9pbnQoeCwgeSkudG9TdHJpbmcoKSArICJBbmQgd2lkdGg9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJKyBjYWNoZWRXaWR0aAotCQkJCQkJCQkJCQkrICIsIEhlaWdodD0iICsgY2FjaGVkSGVpZ2h0ICsgIiwgV2lkdGggb2YgVmlld2VyOiAiICsgdmlld2VyV2lkdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcmVjZW50bHkgYWRkZGVkIGVkaXRwYXJ0cy4gVXN1YWxseSBjYWxsZWQgCi0JICogYnkgZGlhZ3JhbSBzZXJ2aWNlcyB0byBkbyBhdXRvbGF5b3V0IGFkanVzdG1lbnQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkgewotCQlyZXR1cm4gcmVjZW50bHlBZGRlZFBhcnRzOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSByZWNlbnRseSBhZGRlZCBlZGl0cGFydHMgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJlY2VudGx5QWRkZWRQYXJ0cygpIHsKLQkJcmVjZW50bHlBZGRlZFBhcnRzLmNsZWFyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0NmY1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBBY3Rpdml0eURldGFpbERpYWdyYW0ncyBFZGl0UGFydC4gQ3JlYXRlcyBhbiBFZGl0UGFydCBmb3IKLSAqIEFjdGl2aXR5IERldGFpbCBEaWFncmFtJ3MgY2hpbGRyZW4uICAKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gRWRpdFBhcnQgZm9yIGEgY2hpbGQgd2l0aCBpbiB0aGUgY29udGV4dC4KLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCgKLQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUpIHsKLQkJCXJldHVybiBuZXcgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCgoUm9sZVRhc2tDb21wb3NpdGUpIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQoCi0JCQkJCShXb3JrUHJvZHVjdENvbXBvc2l0ZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgUm9sZU5vZGUgfHwgbW9kZWwgaW5zdGFuY2VvZiBUYXNrTm9kZQotCQkJCXx8IG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KChOYW1lZE5vZGUpIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIExpbmspIHsKLQkJCXJldHVybiBuZXcgTGlua0VkaXRQYXJ0KChMaW5rKSBtb2RlbCk7Ci0JCX0KLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQlUeXBlZE5vZGUgbm9kZSA9IChUeXBlZE5vZGUpIG1vZGVsOwotCQkJc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotCQkJY2FzZSBUeXBlZE5vZGUuU1RBUlQ6Ci0JCQkJcmV0dXJuIG5ldyBTdGFydE5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkVORDoKLQkJCQlyZXR1cm4gbmV3IEVuZE5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOgotCQkJCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6Ci0JCQkJcmV0dXJuIG5ldyBTeW5jaEJhck5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDoKLQkJCQlyZXR1cm4gbmV3IEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDc5ZjkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci0KLS8qKgotICogRWRpdFBhcnQgZm9yIEFjdGl2aXR5RGlhZ3JhbS4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZWRpdHBhcnQgZm9yIEFjdGl2aXR5IERpYWdyYW0uIAotCSAqIAotCSAqIEBwYXJhbSBtb2RlbCB7QGxpbmsgQWN0aXZpdHlEaWFncmFtfQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydChBY3Rpdml0eURpYWdyYW0gbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWM5NzZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGVkaXRwYXJ0IGZvciBBY3Rpdml0eURpYWdyYW0ncyBjaGlsZHJlbi4gCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5I2NyZWF0ZUVkaXRQYXJ0KG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQoKEFjdGl2aXR5RGlhZ3JhbSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0KChOYW1lZE5vZGUpIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIExpbmspIHsKLQkJCXJldHVybiBuZXcgTGlua0VkaXRQYXJ0KChMaW5rKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCVR5cGVkTm9kZSBub2RlID0gKFR5cGVkTm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCQlyZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJCXJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLlNZTkNIX0JBUjoKLQkJCQlyZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRlJFRV9URVhUOgotCQkJCXJldHVybiBuZXcgRnJlZVRleHROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Jhc2VFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9CYXNlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxOTdkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Jhc2VFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuVGV4dEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkxhYmVsU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotCi0vKioKLSAqIFByb3ZpZGVzIGluZnJhc3RydWN0dXJlIGZvciBkZWxldGlvbiwgZGlyZWN0LWVkaXRpbmcsIHByb3BlcnR5IHNvdXJjZSBhbmQKLSAqIG1vZGVsLWxpc3RlbmluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgewotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBtb2RlbExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIAotCSAqIEBwYXJhbSBvYmoge0BsaW5rIEVPYmplY3R9Ci0JICovCi0JcHVibGljIEJhc2VFZGl0UGFydChFT2JqZWN0IG9iaikgewotCQlzdXBlcigpOwotCQlzZXRNb2RlbChvYmopOwotCX0KLQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQkoKEVPYmplY3QpIGdldE1vZGVsKCkpLmVBZGFwdGVycygpLmFkZChtb2RlbExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsCi0JCQkJbmV3IExhYmVsU2VsZWN0aW9uRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0YWJsZUxhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0I2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCSgoRU9iamVjdCkgZ2V0TW9kZWwoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGVsTGlzdGVuZXIpOwotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gZ2V0RmlndXJlKCk7Ci0JfQotCi0JU3RyaW5nIGdldERpcmVjdEVkaXRUZXh0KCkgewotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlnKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoZmlnIGluc3RhbmNlb2YgVGV4dEZsb3cpIHsKLQkJCXJldHVybiAoKFRleHRGbG93KSBmaWcpLmdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZyk7Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCW1hbmFnZXIgPSBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXREaXJlY3RFZGl0TWFuYWdlcigpOwotCi0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuc2hvdygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Cb3R0b21BbmNob3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQm90dG9tQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2Y1NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Cb3R0b21BbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGJvdHRvbSBhbmNob3IgZm9yIGEgZmlndXJlJ3MgYm90dG9tIGxvY2F0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1jbGFzcyBCb3R0b21BbmNob3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25BbmNob3IgewotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0OwotCi0JQm90dG9tQW5jaG9yKElGaWd1cmUgc291cmNlLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpIHsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlpbnQgb2ZmID0gb2Zmc2V0OwotCQlpZiAob2ZmID09IC0xKQotCQkJb2ZmID0gci53aWR0aCAvIDI7Ci0JCWlmIChyLmNvbnRhaW5zKHJlZmVyZW5jZSkgfHwgci5ib3R0b20oKSA+IHJlZmVyZW5jZS55KQotCQkJcmV0dXJuIHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZShvZmYsIDApOwotCQllbHNlCi0JCQlyZXR1cm4gci5nZXRCb3R0b21MZWZ0KCkudHJhbnNsYXRlKG9mZiwgLTEpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQ2xvc2VzdEFuY2hvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9DbG9zZXN0QW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDRhNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9DbG9zZXN0QW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQW5jaG9yVXRpbDsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IHRvIGZpbmQgdGhlIGNsb3Nlc3QgbG9jYXRpb24gaW4gZmlndXJlCi0gKiBmb3IgYW5jaG9yLiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENsb3Nlc3RBbmNob3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25BbmNob3IgewotCi0JcHVibGljIENsb3Nlc3RBbmNob3IoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJc3VwZXIoZmlndXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yI2dldExvY2F0aW9uKFBvaW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uKGdldE93bmVyKCksIHJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGxvY2F0aW9uIGluIHRoZSBjbG9zZXN0IGxvY2F0aW9uIGluIGZpZ3VyZSwgYmFzZWQgb24gCi0JICogZmlndXJlIGJvdW5kcyBhbmQgdGhlIHJlZmVyZW5jZSBwb2ludC4gICAKLQkgKiAKLQkgKiBAcGFyYW0gZmlndXJlIHtAbGluayBJRmlndXJlfSAgRmlndXJlIHRvIHdoaWNoIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoaW5nLgotCSAqIEBwYXJhbSByZWZlcmVuY2Uge0BsaW5rIFBvaW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0TG9jYXRpb24oSUZpZ3VyZSBmaWd1cmUsIFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGZpZ3VyZS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCWZpZ3VyZS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlSZWN0YW5nbGUgYWJzb2x1dGVCb3VuZHMgPSByLmdldENvcHkoKTsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCXN3aXRjaCAoci5nZXRQb3NpdGlvbihyZWZlcmVuY2UpKSB7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuTk9SVEg6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKHJlZmVyZW5jZS54IC0gci54LCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIX0VBU1Q6Ci0JCQlwID0gci5nZXRUb3BSaWdodCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuRUFTVDoKLQkJCXAgPSByLmdldFRvcFJpZ2h0KCkudHJhbnNsYXRlKDAsIHJlZmVyZW5jZS55IC0gci55KTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIX0VBU1Q6Ci0JCQlwID0gci5nZXRCb3R0b21SaWdodCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEg6Ci0JCQlwID0gci5nZXRCb3R0b21MZWZ0KCkudHJhbnNsYXRlKHJlZmVyZW5jZS54IC0gci54LCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIX1dFU1Q6Ci0JCQlwID0gci5nZXRCb3R0b21MZWZ0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUOgotCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZSgwLCByZWZlcmVuY2UueSAtIHIueSk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSF9XRVNUOgotCQkJcCA9IHIuZ2V0VG9wTGVmdCgpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpbnQgdG9wRGlzdGFuY2UgPSByZWZlcmVuY2UueSAtIHIueTsKLQkJCWludCByaWdodERpc3RhbmNlID0gci5yaWdodCgpIC0gcmVmZXJlbmNlLng7Ci0JCQlpbnQgYm90dG9tRGlzdGFuY2UgPSByLmJvdHRvbSgpIC0gcmVmZXJlbmNlLnk7Ci0JCQlpbnQgbGVmdERpc3RhbmNlID0gcmVmZXJlbmNlLnggLSByLng7Ci0JCQlpbnRbXSBkaXN0YW5jZXMgPSB7IHRvcERpc3RhbmNlLCByaWdodERpc3RhbmNlLCBib3R0b21EaXN0YW5jZSwKLQkJCQkJbGVmdERpc3RhbmNlIH07Ci0JCQlpbnQgaWQgPSBBbmNob3JVdGlsLm1pbihkaXN0YW5jZXMpOwotCQkJc3dpdGNoIChpZCkgewotCQkJY2FzZSAwOgotCQkJCXAgPSByLmdldFRvcExlZnQoKS50cmFuc2xhdGUobGVmdERpc3RhbmNlLCAwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlwID0gci5nZXRUb3BSaWdodCgpLnRyYW5zbGF0ZSgwLCB0b3BEaXN0YW5jZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcCA9IHIuZ2V0Qm90dG9tTGVmdCgpLnRyYW5zbGF0ZShsZWZ0RGlzdGFuY2UsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCXAgPSByLmdldFRvcExlZnQoKS50cmFuc2xhdGUodG9wRGlzdGFuY2UsIDApOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXAucGVyZm9ybVRyYW5zbGF0ZSgtYWJzb2x1dGVCb3VuZHMueCwgLWFic29sdXRlQm91bmRzLnkpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWUyYWJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5EaWFtb25kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQW5jaG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBFZGl0UGFydCBmb3IgIERlY2lzaW9uTm9kZSwgdXNlZCBpbiBhY3Rpdml0eSBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgaW1wbGVtZW50cwotCQlDb25uZWN0aW9uQW5jaG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCAyNTQsIDIwNCwgMTUzKTsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0KLQlwcml2YXRlIFBvaW50IHJlY2VudFRhcmdldEVuZFBvaW50OwotCi0JcHVibGljIERlY2lzaW9uTm9kZUVkaXRQYXJ0KFR5cGVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZUZpZ3VyZSgpCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlEaWFtb25kIGZpZ3VyZSA9IG5ldyBEaWFtb25kKCk7Ci0JCWZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQkdfQ09MT1IpOwotCQlmaWd1cmUuc2V0U2l6ZSg0OCwgMjQpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFNvdXJjZUNvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydCkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJYm9vbGVhbiBpc1JlbGF0aXZlID0gZmFsc2U7Ci0JCVBvaW50IHNvdXJjZUVuZFBvaW50OwotCQlpZiAocmVjZW50U291cmNlRW5kUG9pbnQgPT0gbnVsbCkgewotCQkJLy8gZ2V0IHNvdXJjZSBlbmQgcG9pbnQgZnJvbSB0aGUgbW9kZWwKLQkJCUxpbmsgbGluayA9IChMaW5rKSBjb25uZWN0aW9uLmdldE1vZGVsKCk7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IGxpbmsuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCWlzUmVsYXRpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJc291cmNlRW5kUG9pbnQgPSByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQkJfQotCQlpZiAoc291cmNlRW5kUG9pbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCBzb3VyY2VFbmRQb2ludCwgaXNSZWxhdGl2ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFNvdXJjZUVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFNvdXJjZUVuZFBvaW50LCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihyZXF1ZXN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFRhcmdldENvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydCkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJYm9vbGVhbiBpc1JlbGF0aXZlID0gZmFsc2U7Ci0JCVBvaW50IHRhcmdldEVuZFBvaW50OwotCQlpZiAocmVjZW50VGFyZ2V0RW5kUG9pbnQgPT0gbnVsbCkgewotCQkJLy8gZ2V0IHRhcmdldCBlbmQgcG9pbnQgZnJvbSBtb2RlbAotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXRhcmdldEVuZFBvaW50ID0gbGluay5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IHJlY2VudFRhcmdldEVuZFBvaW50OwotCQl9Ci0JCWlmICh0YXJnZXRFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHRhcmdldEVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBwID0gbnVsbDsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgewotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxID0gKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSByZXF1ZXN0OwotCQkJcCA9IHJlcS5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpIHsKLQkJCXAgPSAoKExvY2F0aW9uUmVxdWVzdCkgcmVxdWVzdCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlpZiAocCAhPSBudWxsKSB7Ci0JCQlyZWNlbnRUYXJnZXRFbmRQb2ludCA9IGdldExvY2F0aW9uKHApOwotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCByZWNlbnRUYXJnZXRFbmRQb2ludCwgdHJ1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlEaWFtb25kIGYgPSAoKERpYW1vbmQpIGdldEZpZ3VyZSgpKTsKLQotCQkvLyB0cmFuc2xhdGUgcG9pbnRzIHRvIGFic29sdXRlCi0JCVBvaW50W10gcG9pbnRzID0gbmV3IFBvaW50W2YuZ2V0UG9pbnRzKCkuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IGYuZ2V0UG9pbnRzKCkuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVBvaW50IHAgPSBmLmdldFBvaW50cygpLmdldFBvaW50KGkpOwotCQkJZi50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotCQkJcG9pbnRzW2ldID0gcDsKLQkJfQotCi0JCVBvaW50IHAgPSBBbmNob3JVdGlsLmdldENsb3Nlc3RQb2ludChwb2ludHMsIHJlZmVyZW5jZSk7Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSByID0gZi5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlmLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCQlwLnBlcmZvcm1UcmFuc2xhdGUoLXIueCwgLXIueSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Rlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTdhNjRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBFZGl0UGFydCBmb3IgV29ya0JyZWFrZG93biBFbGVtZW50cyBpbiBhbiBBY3Rpdml0eS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JOb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgRGVzY3JpcHRvck5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNnZXRJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlTm9kZSkgewotCQkJaWYoKChOb2RlKW1vZGVsKS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJcmV0dXJuIEltYWdlcy5ST0xFX0RFU0NSSVBUT1JfMTY7Ci0JCQlyZXR1cm4gSW1hZ2VzLlJPTEU7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJaWYoKChOb2RlKW1vZGVsKS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJcmV0dXJuIEltYWdlcy5UQVNLX0RFU0NSSVBUT1JfMTY7Ci0JCQlyZXR1cm4gSW1hZ2VzLlRBU0tfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIHsKLQkJCWlmKCgoTm9kZSltb2RlbCkuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKQotCQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgKChMaW5rZWRPYmplY3QpIG1vZGVsKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQkJfSBlbHNlIGlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJcmV0dXJuIEltYWdlcy5ERUxJVkVSQUJMRTsKLQkJCX0gZWxzZSBpZiAod3AgaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQkJcmV0dXJuIEltYWdlcy5PVVRDT01FOwotCQkJfQotCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpICoKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCUxhYmVsIGwgPSAoTGFiZWwpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbmV3IFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IobCksIGwpIHsKLQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQllLCB0eHQsIG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShlLAotCQkJCQkJCXR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrUm9sZURlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKGUsIHR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNvdXJjZUNvbm5lY3Rpb25zKCkgewotCQlzdXBlci5yZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBudWxsKTsKLQl9Ci0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldERpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1BY3Rpb25TZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1BY3Rpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzQ1NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtQWN0aW9uU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLlJlY29ubmVjdExpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIFNlcnZpY2UgY2xhc3MgdG8gYWxsb3cgY3JlYXRlIGFuZCByZWdpc3RlciBjb21tb24gYWN0aW9uIHRvIHRoZSBhY3Rpb24KLSAqIHJlZ2lzdGVyLiBNb3N0IG9mIHRoZSBjb2RlIGFyZSBtb3ZlZCBmcm9tIHRoZSBFZGl0b3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQWN0aW9uU2VydmljZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0FWRVJBR0UgPSAiYWxpZ25faG9yaXpvbnRhbF90b19hdmVyYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRCA9ICJhbGlnbl9ob3Jpem9udGFsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX1ZFUlRfQVZFUkFHRSA9ICJhbGlnbl92ZXJ0aWNhbF90b19hdmVyYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCA9ICJhbGlnbl92ZXJ0aWNhbF90b19maXJzdF9zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW47Ci0KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXI7Ci0KLQlwcml2YXRlIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgCi0JICogQHBhcmFtIGdyYXBoaWNhbFZpZXdlciB7QGxpbmsgR3JhcGhpY2FsVmlld2VyfQotCSAqIEBwYXJhbSBlZGl0RG9tYWluIAl7QGxpbmsgRGVmYXVsdEVkaXREb21haW59Ci0JICogQHBhcmFtIGFjdGlvblJlZ2lzdHJ5IAl7QGxpbmsgQWN0aW9uUmVnaXN0cnl9Ci0JICovCi0JcHVibGljIERpYWdyYW1BY3Rpb25TZXJ2aWNlKEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIsCi0JCQlEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluLCBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSkgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IGdyYXBoaWNhbFZpZXdlcjsKLQkJdGhpcy5lZGl0RG9tYWluID0gZWRpdERvbWFpbjsKLQkJdGhpcy5hY3Rpb25SZWdpc3RyeSA9IGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEdyYXBoaWNhbFZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaGljYWxWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcikgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIEdyYXBoaWNhbFZpZXdlcgotCSAqLwotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIGdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0IGRvbWFpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlZGl0IGRvbWFpbgotCSAqLwotCXByb3RlY3RlZCBEZWZhdWx0RWRpdERvbWFpbiBnZXRFZGl0RG9tYWluKCkgewotCQlyZXR1cm4gZWRpdERvbWFpbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0QWN0aW9uUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uIGFjdGlvbi4gCi0JICogSG9yaXpvbnRhbEFpZ25BdmVyYWdlIEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHRvIGhvcml6b250YWwgYXZlcmFnZS4gIAotCSAqLwotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVySG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbigpIHsKLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIGF2ZXJhZ2UgeS12YWx1ZSBvZiBhbGwgbm9kZXMKLQkJSUFjdGlvbiBoQWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fSE9SWl9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFjdGlvbi4gCi0JICogSG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHdpdGggCi0JICogcmVzcGVjdCB0byBmaXJzdCBzZWxlY3RlZCBlZGl0cGFydC4gCi0JICovCi0KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3Rlckhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIGhvcml6b250YWxseSB0byB5LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJSUFjdGlvbiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob3J6QWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlyZXR1cm4gaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgdmVydGlhbEFsaWduQXZlcmFnZUFjdGlvbiBhY3Rpb24uIAotCSAqIHZlcnRpYWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWxpZ25zIHNlbGVjdGVkIGVkaXRwYXJ0cyB2ZXJ0aWNhbGx5IHcuci50IGF2ZXJhZ2UuCi0JICogCi0JICovCi0JCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJWZXJ0aWNhbEFsaWduQXZlcmFnZUFjdGlvbigpIHsKLQkJLy8gYWxpZ24gdmVydGljYWxseSB0byBhdmVyYWdlIHgtdmFsdWUgb2YgYWxsIHNlbGVjdGVkIG5vZGVzCi0JCUlBY3Rpb24gdkFsaWduQXZlcmFnZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEFMSUdOX1ZFUlRfQVZFUkFHRTsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25BdmVyYWdlQWN0aW9uKTsKLQotCQlyZXR1cm4gdkFsaWduQXZlcmFnZUFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFjdGlvbi4gCi0JICogdmVydGlhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHZlcnRpY2FsbHkgdy5yLnQgZmlyc3Qgc2VsZWN0ZWQuCi0JICogCi0JICovCi0KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCkgewotCQkvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIHgtdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQlJQWN0aW9uIHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0KSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlyZXR1cm4gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbjsKLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gYWN0aW9uIG1ldGhvZHMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIGhvcml6b250YWxBbGlnbkZpcnN0ZVNFbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgc2VsZWN0ZWQgaXRlbXMsIHJlbWVtYmVyIHRoZSB5LXZhbHVlIG9mIHRoZQotCQkvLyBmaXJzdCBub2RlLAotCQkvLyBzZXQgdGhlIGZvbGxvd2luZyBub2RlcyB0byB0aGUgc2FtZSB5LXZhbHVlCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodCkgLyAyLjApOwotCQkJCQkvLyBpcyB0aGlzIG5vZGUgaW4gYSBjb250YWluZXI/Ci0JCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJLy8gbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQl9Ci0JCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChib3VuZHMueCwgZmlyc3RQYXJ0Ci0JCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueQotCQkJCQkJCQkJLSBvZmZzZXQpLCBib3VuZHMud2lkdGgpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgeXN1bSA9IDA7Ci0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJeXN1bSArPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJCXRvdGFsKys7Ci0JCQl9Ci0JCX0KLQkJLy8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHktdmFsdWUgZm9yIGFsbCBub2RlcwotCQlpbnQgeWF2ZSA9IChpbnQpICgoZG91YmxlKSB5c3VtIC8gKGRvdWJsZSkgdG90YWwpOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBub2RlcyBhZ2FpbiBhbmQgc2V0IHRoZW0KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyBjYWxjdWxhdGUgdGhlIGhlaWdodCBkaWZmZXJlbmNlLCBzbyB0aGF0IGVsZW1lbnRzIGFyZSBhbGlnbmVkCi0JCQkJLy8gdGhyb3VnaCB0aGUgY2VudGVybGluZQotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJLy8gaXMgdGhpcyBub2RlIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJLy8gd2UgbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54LCB5YXZlIC0gb2Zmc2V0KSwgYm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VBY3Rpb24uCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgeHN1bSA9IDA7Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgc2VsZWN0ZWQgcGFydHMKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCS8vIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gbm9kZXMgYW5kIGNvbnRhaW5lcnMKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQlpZiAoZmlyc3RQYXJ0ID09IG51bGwpIHsKLQkJCQkJZmlyc3RQYXJ0ID0gZXA7Ci0JCQkJfQotCQkJCS8vIHN1bSB0aGUgeCBjb29yZGluYXRlcyBvZiBlYWNoIGVsZW1lbnQKLQkJCQl4c3VtICs9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLng7Ci0JCQkJLy8gcmVtZW1iZXIgaG93IG1hbnkgc2VsZWN0ZWQgZWxlbWVudHMgYXBwbGllZCB0byB0aGlzIG9wZXJhdGlvbgotCQkJCXRvdGFsKys7Ci0JCQl9Ci0JCX0KLQkJLy8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHgtdmFsdWUgZm9yIGFsbCBub2RlcwotCQlpbnQgeGF2ZSA9IChpbnQpICgoZG91YmxlKSB4c3VtIC8gKGRvdWJsZSkgdG90YWwpOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBub2RlcyBhZ2FpbiBhbmQgc2V0IHRoZW0KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLndpZHRoIC0gZmlyc3RQYXJ0Ci0JCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGgpIC8gMi4wKTsKLQkJCQkvLyBhcmUgd2UgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkvLyBhZGp1c3QgdGhlIG9mZnNldCBzaW5jZSB3ZSBoYXZlIHRvIG1vdmUgdGhlIGNvbnRhaW5lcgotCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCX0KLQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCW5ldyBQb2ludCh4YXZlIC0gb2Zmc2V0LCBib3VuZHMueSksIGJvdW5kcy53aWR0aCk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJLy8gZ2V0IHRoZSBzZWxlY3RlZCBpdGVtcwotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgYWxpZ25Ub1BhcnQgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBmaXJzdCBkaWFncmFtIHBhcnQgd2UgY2FuIGFsaWduIHRvCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGFsaWduVG9QYXJ0ID09IG51bGwpIHsKLQkJCQkJLy8gcmVtZW1iZXIgaXQgYW5kIHN0b3AKLQkJCQkJYWxpZ25Ub1BhcnQgPSBlcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHNldCB0aGVpciBuZXcgcG9zaXRpb24KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyB3ZSBjYW4gc2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIHRoaXMgaXMgYW4gYWxpZ24tdG8KLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQKLQkJCQkJCSYmICEoYWxpZ25Ub1BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkpIHsKLQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJCWlmICghKGVwIGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpKSB7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMud2lkdGggLSBhbGlnblRvUGFydAotCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGgpIC8gMi4wKTsKLQkJCQkJCS8vIGlzIHRoaXMgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCQkJLy8gYWRqdXN0IHRoZSBvZmZzZXQgc2luY2Ugd2UgYXJlIG1vdmluZyB0aGUKLQkJCQkJCQkvLyBjb250YWluZXIKLQkJCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy54IC0gcGFyZW50Qm91bmRzLng7Ci0JCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQkJfQotCQkJCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBlbGVtZW50Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCBuZXcgUG9pbnQoYWxpZ25Ub1BhcnQKLQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueAotCQkJCQkJCQkJCS0gb2Zmc2V0LCBib3VuZHMueSksIGJvdW5kcy53aWR0aCk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24oCi0JCQkJCQkJCW5ldyBQb2ludChhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlQb2ludCB0cCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBzb3VyY2UgPSBmYWxzZTsKLQkJCQkJCVBvaW50IGVuZFBvaW50ID0gbnVsbDsKLQkJCQkJCUxpbmtFZGl0UGFydCBscCA9IG51bGw7Ci0JCQkJCQkvLyBjaGVjayB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGFsaWduVG9QYXJ0KSkgewotCQkJCQkJCQllbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQkJdHAgPSB0cC5nZXRUcmFuc2xhdGVkKGVuZFBvaW50KTsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2sgc291cmNlIGNvbm5lY3Rpb25zIGlmIG5vdCBmb3VuZCBpbiB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQkJbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCWxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCQllbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkJLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQoZW5kUG9pbnQpOwotCQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJCXNvdXJjZSA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChjb25uZWN0ZWQgJiYgKGFsaWduVG9QYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSkgewotCQkJCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQkJCQlpbnQgZGVsdGEgPSBjZW50ZXJQb2ludC54IC0gdHAueDsKLQkJCQkJCQllbmRQb2ludC54ICs9IGRlbHRhOwotCQkJCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgYyA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJCShMaW5rKSBscC5nZXRNb2RlbCgpLCAoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJCXNvdXJjZSk7Ci0JCQkJCQkJYy5zZXRFbmRQb2ludChlbmRQb2ludCk7Ci0JCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSWYgZmlyc3Qgc2VsZWN0ZWQgZWRpdCBwYXJ0IGlzIHN5bmNiYXJub2RlZWRpdHBhcnQsIG5lZWQgdG8KLQkJCQkvLyBoYW5kbGUgZGlmZmVyZW50bHkKLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQKLQkJCQkJCSYmIChhbGlnblRvUGFydCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSkgewotCi0JCQkJCVBvaW50IHNwID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHBhcnQgaXMgY29ubmVjdGVkIHZpYSBzb3VyY2UgY29ubmVjdGlvbnMKLQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCQkJc3AgPSBzcC5nZXRUcmFuc2xhdGVkKHNvdXJjZUVuZFBvaW50KTsKLQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGlmIG5vdCBmb3VuZCBhYm92ZSwgY2hlY2sgaWYgaXQgaXMgY29ubmVjdGVkIHZpYSB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJaWYgKCFjb25uZWN0ZWQpIHsKLQkJCQkJCWxpc3QgPSAoKE5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQkJc3AgPSBzcC5nZXRUcmFuc2xhdGVkKHRhcmdldEVuZFBvaW50KTsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChlcCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlQb2ludCB0cCA9ICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkuZ2V0Q29weSgpOwotCQkJCQkJUG9pbnQgYWxpZ25Ub0NlbnRlciA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCWludCBkZWx0YSA9IGFsaWduVG9DZW50ZXIueCAtIGNlbnRlclBvaW50Lng7Ci0JCQkJCQl0cC54ID0gdHAueCArIGRlbHRhOwotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgdHAsIGVwLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCQl9IGVsc2UgaWYgKGVwIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlQb2ludCB0cCA9ICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkuZ2V0Q29weSgpOwotCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlpbnQgZGVsdGEgPSBzcC54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludCh0cC54LCB0cC55KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU3NDFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkRpYWdyYW1MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuUm9vdENvbXBvbmVudEVkaXRQb2xpY3k7Ci0KLS8qKgotICogUHJvdmlkZXMgRWRpdFBhcnQgZm9yIERpYWdyYW0uIEhhbmRsZXMgdGhlIGJhc2ljIGxheW91dCBtZWNoYW5pc20KLSAqIGlmIHRoZSBjaGlsZHJlbiBsb2NhdGlvbiBpcyBub3Qgc2V0IGluIHRoZSBkaWFncmFtLiAgCi0gKiAgIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydCBleHRlbmRzIE5vZGVDb250YWluZXJFZGl0UGFydCB7Ci0KLQlQb2ludCBjYWNoZWRQb2ludCA9IG5ldyBQb2ludCgtMSwgLTEpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWFya0RpcnR5ID0gZmFsc2U7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZFdpZHRoID0gMTA7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZEhlaWdodCA9IDEwOwotCi0JcHVibGljIERpYWdyYW1FZGl0UGFydChEaWFncmFtIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJZGVidWcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZpZ3VyZSBmID0gbmV3IEZyZWVmb3JtTGF5ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoKSB7Ci0JCQkJaWYgKGhhc01pc3BsYWNlZENoaWxkcmVuKCkpIHsKLQkJCQkJcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpOwotCQkJCX0KLQkJCQlzdXBlci5sYXlvdXQoKTsKLQkJCX0KLQotCQl9OwotCi0JCWYuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMjApKTsKLQkJZi5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpKTsKLQkJcmV0dXJuIGY7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpIHsKLQkJaW50IHkgPSAxMDsKLQkJZmluYWwgaW50IHNwYWNpbmcgPSA0MDsKLQkJaW50IG9jY3VwaWVkID0gMDsKLQkJaW50IHhlbGVtZW50cyA9IDA7Ci0JCWludCB4ID0gMTA7Ci0JCWJvb2xlYW4gbG9ja2VkID0gVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkoKERpYWdyYW0pZ2V0TW9kZWwoKSkuZ2V0T2JqZWN0KCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWludCB3aWR0aCA9IHBhcnQuZ2V0Um9vdCgpLmdldFZpZXdlcigpLmdldENvbnRyb2woKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJCQlQb2ludCBwID0gbm9kZS5nZXRMb2NhdGlvbigpLmdldENvcHkoKTsKLQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwLnggPT0gLTEpIHsKLQkJCQkJCWlmICh4ICsgcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGggPiB3aWR0aCkgewotCQkJCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgc3BhY2luZzsKLQkJCQkJCQl4ZWxlbWVudHMgPSAwOwotCQkJCQkJCXggPSAxMDsKLQkJCQkJCQljYWNoZWRQb2ludC54ID0gLTE7Ci0JCQkJCQkJb2NjdXBpZWQgPSAwOwotCQkJCQkJfQotCQkJCQkJaWYgKGNhY2hlZFBvaW50LnggIT0gLTEpIHsKLQkJCQkJCQl4ID0gY2FjaGVkUG9pbnQueCArIGNhY2hlZFdpZHRoICsgc3BhY2luZzsKLQkJCQkJCX0KLQkJCQkJCSsreGVsZW1lbnRzOwotCQkJCQkJaWYgKHAgPT0gbnVsbCkgewotCQkJCQkJCXAgPSBuZXcgUG9pbnQoLTEsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCXAueCA9IHg7Ci0JCQkJCQlwLnkgPSB5OwotCQkJCQkJLy9ub2RlLnNldExvY2F0aW9uKHApOwotCQkJCQkJLy9PbiBvcGVuaW5nIGEgQUQgZGlhZ3JhbSwgZWRpdG9yIHNob3VsZCBiZSBtYXJrZWQgZGlydHkuCi0JCQkJCQkvL0lmIGRpYWdyYW0gaXMgbm90IHNhdmVkLCBjYW5ub3QgYmUgYnJvd3NlZC4gRm9yY2luZyB0byBzYXZlIHRoZSBkaWFncmFtIG9uY2UuCi0JCQkJCQlpZiAoIWxvY2tlZCAmJiAoKERpYWdyYW0pIGdldE1vZGVsKCkpLmlzTmV3KCkKLQkJCQkJCQkJJiYgISgoRGlhZ3JhbSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpCi0JCQkJCQkJCSYmIG1hcmtEaXJ0eSkgewotCQkJCQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQobm9kZSwgcCwgcGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoKTsKLQkJCQkJCQlnZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkKLQkJCQkJCQkJCS5leGVjdXRlKGNiYyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIElmIFBsdWdpbiBpcyBMb2NrZWQ6IERvIGF1dG8tbGF5b3V0IGFuZCBkb25vdAotCQkJCQkJCS8vIHNhdmUgdG8gbW9kZWwuCi0JCQkJCQkJbm9kZS5zZXRMb2NhdGlvbihwKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJY2FjaGVkUG9pbnQgPSBwOwotCQkJCQkJY2FjaGVkV2lkdGggPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCWNhY2hlZEhlaWdodCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJQb2ludCA6ICIgKyBuZXcgUG9pbnQoeCwgeSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiQ2FjaGVkIDogd2lkdGg6ICIgKyBjYWNoZWRXaWR0aCArICIgSGVpZ2h0IDogIiArIGNhY2hlZEhlaWdodCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJb2NjdXBpZWQgKz0geDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc01pc3BsYWNlZENoaWxkcmVuKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCU9iamVjdCBtb2RlbCA9ICgoRWRpdFBhcnQpIGNoaWxkKS5nZXRNb2RlbCgpOwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG1vZGVsOwotCQkJCQlQb2ludCBwID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAueCA9PSAtMSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLAotCQkJCW5ldyBSb290Q29tcG9uZW50RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSwKLQkJCQluZXcgRGlhZ3JhbUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydCNhZGRQYXJ0VG9FZGl0KENvbGxlY3Rpb24sCi0JICogICAgICBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFydFRvRWRpdChDb2xsZWN0aW9uIHBhcnRzVG9FZGl0LCBPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCU5vZGVDb250YWluZXJFZGl0UGFydCBlZGl0UGFydCA9IChOb2RlQ29udGFpbmVyRWRpdFBhcnQpIGZpbmRDaGlsZEJ5TW9kZWwobm9kZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKE5vZGVDb250YWluZXIpIG5vZGUpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWVkaXRQYXJ0LmFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgY29tcGxldGUgZGlhZ3JhbSBjaGlsZHJlbiB0byBnaXZlbiBkZWx0YS4gCi0JICogQHBhcmFtIGludCAgKFgtYXhpcyBkZWx0YSkKLQkgKiBAcGFyYW0gaW50ICAoWS1heGlzIGRlbHRhKQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVGaWd1cmUoaW50IG1vdmVYLCBpbnQgbW92ZVkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShuZXcgUG9pbnQoYm91bmRzLnggKyBtb3ZlWCwKLQkJCQkJCWJvdW5kcy55ICsgbW92ZVkpLCBib3VuZHMuZ2V0U2l6ZSgpKTsKLQotCQkJCS8vIGFsc28gbmVlZCB0byBtb3ZlIHRoZSBiZW5kIHBvaW50cwotCQkJCUxpc3QgbGlzdCA9IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGlua3BhcnQgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJTGluayBsaW5rID0gKExpbmspIGxpbmtwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCQlQb2ludExpc3QgcGxpc3QgPSAoKFBvbHlsaW5lQ29ubmVjdGlvbikgbGlua3BhcnQKLQkJCQkJCQkJLmdldEZpZ3VyZSgpKS5nZXRQb2ludHMoKTsKLQkJCQkJCUxpc3QgcG9pbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwbGlzdC5zaXplKCkgLSAxOyBpKyspIHsKLQkJCQkJCQlQb2ludCBwID0gcGxpc3QuZ2V0UG9pbnQoaSk7Ci0JCQkJCQkJcCA9IHAudHJhbnNsYXRlKG5ldyBQb2ludChtb3ZlWCwgbW92ZVkpKTsKLQotCQkJCQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQoCi0JCQkJCQkJCQlwKTsKLQkJCQkJCQlwb2ludHMuYWRkKGJwKTsKLQkJCQkJCX0KLQotCQkJCQkJbGlua3BhcnQuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldFJvdXRpbmdDb25zdHJhaW50KAotCQkJCQkJCQlwb2ludHMpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJdGhpcy5zZXRMYXlvdXRDb25zdHJhaW50KHBhcnQsIHBhcnQuZ2V0RmlndXJlKCksIHIpOwotCi0JCQl9IGVsc2UgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGFydCBub3QgbW92ZWQ6ICIgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCS8qKgotCSAqIE9uIG9wZW5pbmcgYSBkaWFncmFtLCBlZGl0b3Igc2hvdWxkIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJbnZva2VyIG9mIERpYWdyYW1FZGl0UGFydCBzaG91bGQgZXhwbGljaXRseSBzZXQgdGhlIGZsYWcgdG8gbWFyayBlZGl0b3IgZGlydHkKLQkgKiBvciBub3QuIFdpdGhvdSBoYW5kbGluZyB0aGlzIHdpbGwgY2F1c2UgYnJvd3NpbmcgcGVyc3BlY3RpdmUgaW4gY29uc2lzdGVudC4gICAgCi0JICogRm9yIGRlZmVjdDogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjAyOQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtEaXJ0eShib29sZWFuIG1hcmtEaXJ0eSl7Ci0JCXRoaXMubWFya0RpcnR5ICA9IG1hcmtEaXJ0eTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtVXBkYXRlU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtVXBkYXRlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc4YTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbVVwZGF0ZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogU2VydmljZSBjbGFzcyB0byBhbGxvdyB1cGRhdGluZyBkaWFncmFtIHRvIGEgZGVmYXVsdCBsYXlvdXQuIE1vc3Qgb2YgdGhlIGNvZGUKLSAqIGFyZSBtb3ZlZCBmcm9tIHRoZSBFZGl0b3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVXBkYXRlU2VydmljZSB7Ci0KLQlwcml2YXRlIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW47Ci0KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXI7Ci0KLQlwcml2YXRlIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5OwotCi0JcHVibGljIERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlciwgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbiwKLQkJCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCS8qKgotCSAqIExhemlseSBjcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JICovCi0JcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgb25seSBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gb3IgYW55IGRpYWdyYW0gbmVlZCBhdXRvLWxheW91dC4KLQkgKiBNZXRob2Qgd2lsbCB2ZXJpZnkgcmVjZW50bHkgYWRkZWQgZWRpdHBhcnRzIGluIHRoZSBBY3Rpdml0eWRldGFpbGRpYWdyYW0gZWRpdHBhcnQKLQkgKiBpbmRpcmVjdGx5IGZyb20gV29ya0JyZWFrZG93blN0cnVjdHVyZSAobWVhbnMgYW55IGRlc2NyaXB0b3JzIGNyZWF0ZWQgaW4gd2JzLCBjb3JyZXNwb25kaW5nCi0JICogRWRpdFBhcnQgd2lsbCBnZXQgY3JlYXRlZCBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gVmlld2VyKSBhbmQgZG9lcyBhdXRvLWxheW91dAotCSAqIGFsbCB0aGUgbmV3IGFkZGVkIGVkaXRwYXJ0cyBhbmQgZXhpc3Rpbmcgb25lcy4gCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCWlmIChnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQlMaXN0IGNoaWxkcmVuID0gZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQkJaWYgKCFjaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJCQlpbnQgcmMgPSAwOwotCQkJCQkJaWYgKGFyZzAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJaWYgKCEoYXJnMSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpKQotCQkJCQkJCQlyYyA9IC0xOwotCQkJCQkJfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkKLQkJCQkJCQlyYyA9IDE7Ci0JCQkJCQlyZXR1cm4gcmM7Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQlPYmplY3RbXSBhcnJheSA9IGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQkJZm9yIChpbnQgYSA9IDA7IGEgPCBhcnJheS5sZW5ndGg7IGErKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2FdOwotCQkJCQlhZGp1c3RTaXplKGVwKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBhcnJheS5sZW5ndGg7IGIrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2JdOwotCQkJCQljbGVhblVwKGVwKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBhcnJheS5sZW5ndGg7IGMrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2NdOwotCQkJCQlyZWR1Y2VMaW5rTGVuZ3RoKGVwKTsKLQkJCQl9Ci0vLwkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7Ci0vLwkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVtjXTsKLS8vCQkJCQlpZihlcCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpewotLy8JCQkJCQlyZXNldFNpemVzKGVwLCBlcCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCXBhY2tEaWFncmFtKCk7Ci0JCQkJZGVwLmNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQlwcml2YXRlIHZvaWQgcmVzZXRTaXplcyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwLCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcmVudCkgewotCQlpZiAoIShlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpKSB7Ci0JCQlMaXN0IHNvdXJjZUxpbmtzID0gZXAuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWlmIChzb3VyY2VMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBzb3VyY2VMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHNvdXJjZUxpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaW50IHcgPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPiBldykgewotCQkJCQkJUG9pbnQgbG9jYXRpb24gPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlsb2NhdGlvbi54Kz0ody1ldykvMjsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQl0YXJnZXQgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCB0YXJnZXRMaW5rcyA9IGVwLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAodGFyZ2V0TGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgdGFyZ2V0TGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmsgPSAoTGlua0VkaXRQYXJ0KSB0YXJnZXRMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCWludCB3ID0gc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3ID4gZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQlzb3VyY2UgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJcGFyZW50LmdldEZpZ3VyZSgpLmdldExheW91dE1hbmFnZXIoKS5sYXlvdXQocGFyZW50LmdldEZpZ3VyZSgpKTsKLQkJCWlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGQgPSAwOyBkIDwgY2hpbGRyZW4uc2l6ZSgpOyBkKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkJLmdldChkKTsKLQkJCQkJcmVzZXRTaXplcyhwLCBlcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCSovCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGEgdmVydGljYWwgYWxpZ25tZW50IG9mIGFsbCBub2RlcyB3aXRoIGxpbmtzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCkgewotCQlpZiAoIShlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpKSB7Ci0JCQlMaXN0IHNvdXJjZUxpbmtzID0gZXAuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWlmIChzb3VyY2VMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBzb3VyY2VMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHNvdXJjZUxpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaW50IHcgPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPCBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQl0YXJnZXQgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCB0YXJnZXRMaW5rcyA9IGVwLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAodGFyZ2V0TGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgdGFyZ2V0TGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmsgPSAoTGlua0VkaXRQYXJ0KSB0YXJnZXRMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCWludCB3ID0gc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3IDwgZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gc291cmNlLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyBlcCwKLQkJCQkJCQkJCQkJc291cmNlIH0pKTsKLQkJCQkJSUFjdGlvbiB2YWxpZ24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKTsKLQkJCQkJdmFsaWduLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGQgPSAwOyBkIDwgY2hpbGRyZW4uc2l6ZSgpOyBkKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkJLmdldChkKTsKLQkJCQkJY2xlYW5VcChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgRm9yIGF1dG8tbGF5b3V0LCBuZWVkIHRvIGFkanVzdCBjb25uZWN0aW9uKG9yIGxpbmspIGxlbmd0aCwgYmFzZWQgb24KLQkgKiAgY29ubmVjdGluZyBlZGl0cGFydHMoZmlndXJlcykuCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZHVjZUxpbmtMZW5ndGgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwYXJ0KSB7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJLy8gb25seSBtb3ZlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBlbGVtZW50cwotCQlpZiAocGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IG51bGw7Ci0JCQlpbnQgcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVI7Ci0JCQkvLyBpcyB0aGlzIGVsZW1lbnQgbGlua2VkIHRvIGFub3RoZXIgaXRlbT8KLQkJCWlmIChwYXJ0LmdldFRhcmdldENvbm5lY3Rpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChMaW5rRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpLmdldCgwKSkuZ2V0U291cmNlKCk7Ci0JCQkJcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDsKLQkJCX0gZWxzZSBpZiAocGFydC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoMCkpLmdldFRhcmdldCgpOwotCQkJCXBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuU09VVEg7Ci0JCQl9Ci0JCQlpZiAobGlua2VkUGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEobGlua2VkUGFydC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rZWRQYXJ0Ci0JCQkJCQkJLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQkvLyBnZXQgdGhlIHBhcnQncyBwb3NpdGlvbgotCQkJCVJlY3RhbmdsZSBwYXJ0Qm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkvLyBnZXQgdGhlIGxpbmtlZCBwYXJ0J3MgcG9zaXRpb24KLQkJCQlSZWN0YW5nbGUgbGlua2VkUGFydEJvdW5kcyA9IGxpbmtlZFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJLy8gZGV0ZXJtaW5lIGluIHdoaWNoIGRpcmVjdGlvbiBpcyB0aGUgbGlua2VkIHBhcnQKLQkJCQkvLyBpbnQgcG9zaXRpb24gPSBwYXJ0Qm91bmRzLmdldFBvc2l0aW9uKGxpbmtlZFBhcnRCb3VuZHMKLQkJCQkvLyAuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJLy8gYXNzdW1lIGl0IGlzIGJlbG93IHVzLCBzbyB0aGlzIHBhcnQgbW92ZXMgdXAKLQkJCQlpbnQgZGlyZWN0aW9uID0gLTE7Ci0JCQkJaWYgKChwb3NpdGlvbiAmIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSAotCQkJCQkJfHwgKHBvc2l0aW9uICYgUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpIHsKLQkJCQkJLy8gYWJvdmUgdXMsIG1vdmUgZG93bgotCQkJCQlkaXJlY3Rpb24gPSAxOwotCQkJCX0KLQkJCQkvLyBzZXQgbmV3IGJvdW5kcyBmb3IgdGhlIHBhcnQgc28gdGhhdCBpdCBzaXRlcyBqdXN0IG91dHNpZGUgb2YKLQkJCQkvLyB0aGUgbGlua2VkIHBhcnQKLQkJCQlSZWN0YW5nbGUgdGVzdEJvdW5kcyA9IHBhcnRCb3VuZHMuZ2V0Q29weSgpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gMSkgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgKyBsaW5rZWRQYXJ0Qm91bmRzLmhlaWdodAotCQkJCQkJCSsgVkVSVF9QSVhfUEFERElORzsKLQkJCQl9IGVsc2UgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgLSBWRVJUX1BJWF9QQURESU5HCi0JCQkJCQkJLSBwYXJ0Qm91bmRzLmhlaWdodDsKLQkJCQl9Ci0JCQkJLy8gc2V0IHRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBwYXJ0IGluIHRoZSBtb2RlbAotCQkJCVBvaW50IG5wID0gbmV3IFBvaW50KHRlc3RCb3VuZHMueCwgdGVzdEJvdW5kcy55KTsKLQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5wKTsKLQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoTm9kZSkgcGFydC5nZXRNb2RlbCgpLCBucCwKLQkJCQkJCXBhcnRCb3VuZHMud2lkdGgpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vdmVkOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBhZGp1c3QgdGhlIHNpemUgb2YgZWRpdHBhcnQuICAKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZShBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIDEpOwotCQl9Ci0JCS8vIEJlbG93IENvZGUgZ2VuZXJpYyBOb2RlQ29udGFpbmVyRWRpdFBhcnQgbW9kaWZpY2F0aW9uLgotCQllbHNlIGlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJLy8gVGhpcyBpcyB0byBhbGxvdyB1c2VyIGN1c3RvbWl6YWJsZSAKLS8vCQkJU3RyaW5nIGNvdW50ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0vLwkJCQkJCQkuZ2V0U3RyaW5nKFRlbXBsYXRlQ29uc3RhbnRzLkFERF9ST0xFX1RBU0tTX0NPVU5UKTsKLS8vCQkJaWYoY291bnQgIT0gbnVsbCB8fCBjb3VudCAhPSAiIil7Ci0vLwkJCQlpbnQgaSA9IEludGVnZXIucGFyc2VJbnQoY291bnQpOwotLy8JCQkJaWYoaSA+IDApewotLy8JCQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIGkpOwotLy8JCQkJfQotLy8JCQl9ZWxzZXsKLS8vCQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIDUwKTsKLS8vCQkJfQotCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgNTApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSE9SSVpfUElYX1BBRERJTkcgPSAzMDsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFZFUlRfUElYX1BBRERJTkcgPSAyMDsKLQotCS8qKgotCSAqIEFkanVzdHMgdGhlIHNpemUgb2YgQ29udGFpbmVyRWRpdFBhcnQgdG8gYWNjb21vZGF0ZSBudW1iZXIgb2YgZWRpdHBhcnRzIGluIGEgcm93LAotCSAqIHB1c2ggdGhlIHJlbWFpbmluZyB0aGUgZWRpdHBhcnRzIGluIHR3byBzZWNvbmQgcm93LiAKLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3Ige0BsaW5rIFRvb2xiYXJMYXlvdXR9Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoTm9kZUNvbnRhaW5lckVkaXRQYXJ0IGVwLCBpbnQgaG9yaXpDb3VudCkgewotCQlpbnQgcmVxdWlyZWRXaWR0aCA9IDA7Ci0JCWludCByb3dNYXhIZWlnaHQgPSAwOwotCQlpbnQgcm93cyA9IDA7Ci0JCWludCB3aWR0aFN1bSA9IDA7Ci0JCWludCBoZWlnaHRTdW0gPSAwOwotCQlpbnQgY29sdW1uID0gMDsKLQkJLy9pbnQgb3JpZ2luYWxXaWR0aCA9IGVwLmdldEZpZ3VyZSgpLmdldFNpemUoKS53aWR0aDsKLQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgY2hpbGRyZW4uc2l6ZSgpOykgewotCQkJaWYgKGNvbHVtbiA9PSAwKSB7Ci0JCQkJcm93cysrOwotCQkJfQotCQkJaWYgKGNvbHVtbiA8IGhvcml6Q291bnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkuZ2V0KHApOwotCQkJCURpbWVuc2lvbiBkID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCQkJCXdpZHRoU3VtICs9IGQud2lkdGg7Ci0JCQkJaWYgKGQuaGVpZ2h0ID4gcm93TWF4SGVpZ2h0KSB7Ci0JCQkJCXJvd01heEhlaWdodCA9IGQuaGVpZ2h0OwotCQkJCX0KLQkJCQlwKys7Ci0JCQkJY29sdW1uKys7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3aWR0aFN1bSA+IHJlcXVpcmVkV2lkdGgpIHsKLQkJCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQkJCX0KLQkJCQloZWlnaHRTdW0gKz0gcm93TWF4SGVpZ2h0OwotCQkJCXJvd01heEhlaWdodCA9IDA7Ci0JCQkJd2lkdGhTdW0gPSAwOwotCQkJCWNvbHVtbiA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoU3VtID4gcmVxdWlyZWRXaWR0aCkgewotCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQl9Ci0JCWhlaWdodFN1bSArPSByb3dNYXhIZWlnaHQ7Ci0JCXJlcXVpcmVkV2lkdGggKz0gSE9SSVpfUElYX1BBRERJTkcKLQkJCQkqIE1hdGgubWluKGhvcml6Q291bnQsIGNoaWxkcmVuLnNpemUoKSk7Ci0JCWludCByZXF1aXJlZEhlaWdodCA9IGhlaWdodFN1bSArIChWRVJUX1BJWF9QQURESU5HICogcm93cyk7Ci0JCUNvbW1hbmQgY21kID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcC5nZXRNb2RlbCgpKSwgZXAKLQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgcmVxdWlyZWRXaWR0aCk7Ci0JCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCSgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHJlcXVpcmVkSGVpZ2h0KTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCQllcC5nZXRGaWd1cmUoKS5nZXRMYXlvdXRNYW5hZ2VyKCkubGF5b3V0KGVwLmdldEZpZ3VyZSgpKTsKLQkJLy8gYWZ0ZXIgbGF5b3V0LCBjaGVjayB0aGUgYm90dG9tLW1vc3QgY2hpbGQgZmlndXJlIGFnYWluc3QgdGhlIGJvdHRvbQotCQkvLyBvZiB0aGUgY29udGFpbmVyLCBhZGp1c3QgdGhlIGJvdHRvbSBvZiB0aGUgY29udGFpbmVyIGlzIG5lY2Vzc2FyeQotCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0ICYmIGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGxhc3QgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuLmdldChjaGlsZHJlbgotCQkJCQkuc2l6ZSgpIC0gMSk7Ci0JCQlQb2ludCBjaGlsZEJvdHRvbSA9IGxhc3QuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JCQlQb2ludCBwYXJlbnRCb3R0b20gPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQkJCWludCBkZWx0YSA9IHBhcmVudEJvdHRvbS55IC0gY2hpbGRCb3R0b20ueSAtIChWRVJUX1BJWF9QQURESU5HIC8gMik7Ci0JCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpKTsKLQkJCSgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpOwotCQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZSgKLQkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCAtIGRlbHRhKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsCi0JCQlMaXN0IGNvbm5lY3RlZCkgewotCQkvLyBvbmx5IGFkZCBwYXJ0cyBkaXJlY3RseSBvbiB0aGUgZGlhZ3JhbSBzdXJmYWNlCi0JCWlmICghY29ubmVjdGVkLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQlpZiAoIShwYXJ0LmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCWlmICghY29ubmVjdGVkLmNvbnRhaW5zKHBhcnQuZ2V0UGFyZW50KCkpKSB7Ci0JCQkJCWNvbm5lY3RlZC5hZGQocGFydC5nZXRQYXJlbnQoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb25uZWN0ZWQuYWRkKHBhcnQpOwotCQkJfQotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gbnVsbDsKLQkJCUxpc3QgY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGNoaWxkcmVuLnNpemUoKTsgeCsrKSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkuZ2V0KHgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKHAsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCQkvLyBpcyB0aGlzIGVsZW1lbnQgbGlua2VkIHRvIGFub3RoZXIgaXRlbT8KLQkJCWZvciAoaW50IHggPSAwOyB4IDwgcGFydC5nZXRUYXJnZXRDb25uZWN0aW9ucygpLnNpemUoKTsgeCsrKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKExpbmtFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCkuZ2V0KHgpKS5nZXRTb3VyY2UoKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhsaW5rZWRQYXJ0LCBjb25uZWN0ZWQpOwotCQkJfQotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuc2l6ZSgpOyB4KyspIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFRhcmdldCgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBmaW5kcyBzaW5nbGUgZWxlbWVudHMgYW5kIGdyb3VwcyBvZiBlbGVtZW50cywgYW5kIHBvc2l0aW9ucwotCSAqIHRoZW0gc3RhcnRpbmcgZnJvbSB0aGUgdG9wIG9mIHRoZSBkaWFncmFtIGFuZCBjb250aW51b3VzbHkgZG93biB0aGUgcGFnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFja0RpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCS8vIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIGRpYWdyYW0KLQkJLy8gRGltZW5zaW9uIGRpYWdyYW1TaXplID0gZGlhZ3JhbS5nZXRGaWd1cmUoKS5nZXRTaXplKCk7Ci0JCS8vIG5vIG5ldyBzaGFwZXMgY2FuIGJlIG1vdmVkIGFib3ZlIHRoaXMgeS1heGlzIHZhbHVlCi0JCWludCByZXNlcnZlZCA9IDA7Ci0JCS8vIHRoZXNlIGFyZSBlbGVtZW50cyB3aXRob3V0IGNvbm5lY3Rpb25zCi0JCUxpc3Qgc3RyYWdnbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gdGhlc2UgYXJlIGdyb3VwcyBvZiBlbGVtZW50cyBjb25uZWN0ZWQgd2l0aCBsaW5rcwotCQlMaXN0IGdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gdGhlc2UgYXJlIHRvcCBsZXZlbCBwYXJ0cyBvbiB0aGUgZGlhZ3JhbSB0aGF0IGhhdmUgYmVlbiBhZGRlZAotCQlMaXN0IGRpYWdyYW1QYXJ0cyA9IGRpYWdyYW0uZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGlhZ3JhbVBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZGlhZ3JhbVBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBnID0gMDsgZyA8IGdyb3Vwcy5zaXplKCkgJiYgZm91bmQgPT0gZmFsc2U7IGcrKykgewotCQkJCUxpc3QgZ3JvdXAgPSAoTGlzdCkgZ3JvdXBzLmdldChnKTsKLQkJCQlpZiAoZ3JvdXAuY29udGFpbnMocCkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJTGlzdCBjb25uZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMocCwgY29ubmVjdGVkKTsKLQkJCQlpZiAoY29ubmVjdGVkLnNpemUoKSA9PSAxKSB7Ci0JCQkJCXN0cmFnZ2xlcnMuYWRkKHApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdyb3Vwcy5hZGQoY29ubmVjdGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcHJvY2VzcyBlYWNoIGdyb3VwIGNsb3Nlc3QgdG8gdGhlIHRvcCAobWluIHkgdmFsdWUpCi0JCXdoaWxlIChncm91cHMuc2l6ZSgpID4gMCkgewotCQkJTGlzdCB0b3AgPSAoTGlzdCkgZ3JvdXBzLmdldCgwKTsKLQkJCWludCB0b3BZID0gZ2V0VmVydGljYWxNaW5QYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZ3JvdXBzLnNpemUoKTsgeCsrKSB7Ci0JCQkJTGlzdCBnID0gKExpc3QpIGdyb3Vwcy5nZXQoeCk7Ci0JCQkJaW50IHkgPSBnZXRWZXJ0aWNhbE1pblBhcnQoZykuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCQlpZiAoeSA8IHRvcFkpIHsKLQkJCQkJdG9wID0gZzsKLQkJCQkJdG9wWSA9IHk7Ci0JCQkJfQotCQkJfQotCQkJaW50IGxpbWl0ID0gcmVzZXJ2ZWQgKyAxOwotCQkJaW50IHZlcnRpY2FsRGVsdGEgPSBsaW1pdCAtIHRvcFk7Ci0JCQlpbnQgbGVmdFggPSBnZXRIb3Jpem9udGFsTWluUGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLng7Ci0JCQlpbnQgaG9yaXpvbnRhbERlbHRhID0gSE9SSVpfUElYX1BBRERJTkcgLSBsZWZ0WDsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgdG9wLnNpemUoKTsgeCsrKSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHRvcAotCQkJCQkJLmdldCh4KTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKChOb2RlKSBwCi0JCQkJCQkuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGJvdW5kcy54ICsgaG9yaXpvbnRhbERlbHRhLAotCQkJCQkJYm91bmRzLnkgKyB2ZXJ0aWNhbERlbHRhKSwgYm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNiYyk7Ci0JCQkJcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCW5ldyBQb2ludChib3VuZHMueCArIGhvcml6b250YWxEZWx0YSwgYm91bmRzLnkKLQkJCQkJCQkJKyB2ZXJ0aWNhbERlbHRhKSk7Ci0JCQl9Ci0JCQlpbnQgYm90dG9tWSA9IGdldFZlcnRpY2FsTWF4UGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCS5ib3R0b20oKTsKLQkJCXJlc2VydmVkID0gYm90dG9tWSArIChWRVJUX1BJWF9QQURESU5HICogMik7Ci0JCQlncm91cHMucmVtb3ZlKHRvcCk7Ci0JCX0KLQkJaW50IG5leHQgPSBIT1JJWl9QSVhfUEFERElORzsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBzdHJhZ2dsZXJzLnNpemUoKTsgeCsrKSB7Ci0JCQlpbnQgbGltaXQgPSByZXNlcnZlZCArIDE7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgc3RyYWdnbGVycwotCQkJCQkuZ2V0KHgpOwotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKChOb2RlKSBwCi0JCQkJCS5nZXRNb2RlbCgpLCBuZXcgUG9pbnQobmV4dCwgbGltaXQpLCBib3VuZHMud2lkdGgpOwotCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjYmMpOwotCQkJcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQobmV4dCwgbGltaXQpKTsKLQkJCW5leHQgKz0gYm91bmRzLndpZHRoICsgSE9SSVpfUElYX1BBRERJTkc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0VmVydGljYWxNaW5QYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkgPCByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55KSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0SG9yaXpvbnRhbE1pblBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCA8IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRWZXJ0aWNhbE1heFBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuYm90dG9tKCkgPiByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkuYm90dG9tKCkpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9FbmROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRW5kTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGJkOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9FbmROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5FbmROb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci0KLS8qKgotICogRWRpdFBhcnQgZm9yIEZpbmFsKG9yIEVuZCkgbm9kZSAKLSAqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW5kTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBFbmROb2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUVuZE5vZGVGaWd1cmUgZiA9IG5ldyBFbmROb2RlRmlndXJlKCk7Ci0JCWYuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJZi5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMucmVkKTsKLQkJZi5zZXRTaXplKDI0LCAyNCk7Ci0JCXJldHVybiBmOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhOTJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRnJlZVRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAKLSAqIENvbnN0cmFpbnQgZm9yIHBsYWNpbmcgRnJlZVRleHQgQ2VsbCBFZGl0b3IuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JSUZpZ3VyZSBmaWd1cmU7Ci0JLyoKLQkgKiBDcmVhdGVzIGEgbmV3IEZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IgCi0JICogCi0JICogQHBhcmFtIGxhYmVsIHRoZSBMYWJlbAotCSAqLwotCXB1YmxpYyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yKElGaWd1cmUgZmlndXJlKSB7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlGcmVlVGV4dEZpZ3VyZSBmaWcgPSAoRnJlZVRleHRGaWd1cmUpZmlndXJlOwotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2UuZ2V0Q29udHJvbCgpOwotCQlTdHJpbmcgbiA9IChTdHJpbmcpIGNlLmdldFZhbHVlKCk7Ci0JCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChuKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlpZiAoc2l6ZS54ICE9IDApCi0JCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJdGV4dC5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJUmVjdGFuZ2xlIHRleHRCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Q2xpZW50QXJlYSgpLngsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHRleHQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQlSZWN0YW5nbGUgZmlnQm91bmRzID0gZmlnLmdldENsaWVudEFyZWEoKTsKLQkJZmlnLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZmlnQm91bmRzKTsKLQkJaW50IGRlbHRhID0gKGZpZ0JvdW5kcy53aWR0aCAtIHRleHRCb3VuZHMud2lkdGgpIC8gMjsKLQkJaW50IHkgPSBmaWcuZ2V0VGV4dEZsb3dQYWdlKCkuZ2V0TG9jYXRpb24oKS55OwotCQl0ZXh0LnNldExvY2F0aW9uKGZpZ0JvdW5kcy54ICsgZGVsdGEsIHkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpZ3VyZShJRmlndXJlIGZpZ3VyZSkgewotCQl0aGlzLmZpZ3VyZSA9IGZpZ3VyZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWd1cmUuCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlyZXR1cm4gZmlndXJlOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNWQwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgZGlyZWN0IGVkaXQgb3BlcmF0aW9uIGJ5IGNyZWF0aW5nIGFuZCBtYWludGFpbmluZyB0aGUgCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yfSBhbmQgZXhlY3V0aW5nIHRoZSByZXN1bHRpbmcgY29tbWFuZCBpZiAKLSAqIHRoZSBjZWxsIGVkaXRvciB2YWx1ZSBoYXMgY2hhbmdlZC4gU3BlY2lmaWNhbGx5IGZvciBGcmVlVGV4dC4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQkKLQkvKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQlwcml2YXRlIEZvbnQgc2NhbGVkRm9udDsKLQlwcm90ZWN0ZWQgSUZpZ3VyZSBmaWd1cmU7Ci0JCi0JcHVibGljIEZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBDbGFzcyBlZGl0b3JUeXBlLCBDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yLCBJRmlndXJlIGZpZ3VyZSkgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCQl0aGlzLmZpZ3VyZSA9IGZpZ3VyZTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKSB7Ci0JCWJyaW5nRG93bih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bihib29sZWFuIGNoZWNrKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIG1pZ2h0IGJlIHJlLWVudGVyZWQgd2hlbiBzdXBlci5icmluZ0Rvd24oKSBpcyBjYWxsZWQuCi0JCUZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotCQlzY2FsZWRGb250ID0gbnVsbDsKLQkJc3VwZXIuYnJpbmdEb3duKCk7Ci0JCWlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotCQkJZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCQlpZiAoY2hlY2spIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkvLyBUT0RPOiBSZW1vdmUgdGhpcyBjaGVjayAKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCkpIHsKLQkJCQkJbmFtZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCk7Ci0JCQkJfQotCi0JCQl9Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgVHlwZWROb2RlICYmICgoVHlwZWROb2RlKW5vZGUpLmdldFR5cGUoKT09VHlwZWROb2RlLkZSRUVfVEVYVCl7Ci0JCQkJR3JhcGhOb2RlIGdub2RlID0gKChOb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpOwotCQkJCW5hbWUgPSAoKFByb3BlcnR5KSBnbm9kZS5nZXRQcm9wZXJ0eSgpLmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCURpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkKLQkJCQkJCS5hc3luY0V4ZWMoCi0JCQkJCQkJCW5ldyBQcm9tcHRFZGl0KAotCQkJCQkJCQkJCShOb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksCi0JCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmVycl9uYW1lX2VtcHR5KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNpbml0Q2VsbEVkaXRvcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHRDZWxsRWRpdG9yIGVkaXRvciA9IChUZXh0Q2VsbEVkaXRvcikgZ2V0Q2VsbEVkaXRvcigpOwotCQllZGl0b3Iuc2V0U3R5bGUoU1dULk1VTFRJKTsKLQkJVGV4dCB0ID0gKFRleHQpIGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSAoKE5vZGVFZGl0UGFydCkgdGhpcy5nZXRFZGl0UGFydCgpKQotCQkJCS5nZXREaXJlY3RFZGl0VGV4dCgpOwotCQllZGl0b3Iuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCUZvbnQgZiA9IGZpZ3VyZS5nZXRGb250KCk7Ci0JCUZvbnRNZXRyaWNzIGZtID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGYpOwotCQlpbnQgaCA9IGZtLmdldEhlaWdodCgpOwotCQlpbnQgdyA9IGZtLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJdC5zZXRTaXplKGluaXRpYWxMYWJlbFRleHQubGVuZ3RoKCkqdysxMDAsIGgrNTApOwotCQotCQlpZihmICE9IG51bGwpCi0JCQl0LnNldEZvbnQoZik7Ci0JCWVsc2UKLQkJCXQuc2V0Rm9udChUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQl0LnNlbGVjdEFsbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI3VuaG9va0xpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5ob29rTGlzdGVuZXJzKCkgewotCQlzdXBlci51bmhvb2tMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldENlbGxFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCWlmICh2ZXJpZnlMaXN0ZW5lciAhPSBudWxsKQotCQkJCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQkJdmVyaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdHh0Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNjb21taXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbW1pdCgpIHsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRlKChTdHJpbmcpIGdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlicmluZ0Rvd24oZmFsc2UpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUHJvbXB0RWRpdCgoTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLCBtc2cpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5jb21taXQoKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotCQlwcml2YXRlIE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5vZGVFZGl0UGFydCBwYXJ0LCBTdHJpbmcgbXNnKSB7Ci0JCQl0aGlzLnBhcnQgPSBwYXJ0OwotCQkJdGhpcy5tc2cgPSBtc2c7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVN0cmluZyB0aXRsZSA9IERpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwOyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxYzA1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgZGlyZWN0IGVkaXRpbmcsIGZyZWUgdGV4dCBwcm9wZXJ0aWVzIGNoYW5nZXMgbGlrZSBmb250LCBjb2xvciBhbmQgdGV4dC4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dEVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXByaXZhdGUgRm9udCBmb250OwotCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotCXByaXZhdGUgRm9udERhdGEgZkRhdGE7Ci0KLQlwcml2YXRlIE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JcHVibGljIEZyZWVUZXh0RWRpdFBhcnQoTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXBhcnQgPSB0aGlzOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJTGFiZWwgbCA9IG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQkJbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJbC5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJcmV0dXJuIGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpZiAoISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJCWNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbmV3IERpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZChwYXJ0LCAoU3RyaW5nKSByZXF1ZXN0Ci0JCQkJCQkuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJCSgoTGFiZWwpIGZpZykuc2V0VGV4dCgoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKQotCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJZmlnLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUCi0JCQkJJiYgISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgbCA9IChMYWJlbCkgZmlnOwotCQkJTGlzdCBhbGlzdCA9ICgoTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCkuZ2V0UHJvcGVydHkoKTsKLQkJCVN0cmluZyBmb250TmFtZSA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9OQU1FOwotCQkJaW50IGZvbnRTdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQlpbnQgZm9udEhlaWdodCA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9TSVpFOwotCQkJaW50IGZvbnRSZWQgPSBTV1QuQ09MT1JfUkVEOwotCQkJaW50IGZvbnRCbHVlID0gU1dULkNPTE9SX0JMVUU7Ci0JCQlpbnQgZm9udEdyZWVuID0gU1dULkNPTE9SX0dSRUVOOwotCi0JCQlpZiAoYWxpc3Quc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gYWxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgaW9yLm5leHQoKTsKLQkJCQkJaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9GUkVFX1RFWFQpKSB7Ci0JCQkJCQlsLnNldFRleHQocHJvcC5nZXRWYWx1ZSgpKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUpKSB7Ci0JCQkJCQlmb250TmFtZSA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1NUWUxFKSkgewotCQkJCQkJZm9udFN0eWxlID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfSEVJR0hUKSkgewotCQkJCQkJZm9udEhlaWdodCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCkpIHsKLQkJCQkJCWZvbnRSZWQgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9CTFVFKSkgewotCQkJCQkJZm9udEJsdWUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTikpIHsKLQkJCQkJCWZvbnRHcmVlbiA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbC5zZXRUZXh0KCgoTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpZiAoY29sb3IgIT0gbnVsbCAmJiAhY29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQkJZkRhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIGZvbnRIZWlnaHQsIGZvbnRTdHlsZSk7Ci0JCQlmb250ID0gbmV3IEZvbnQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCksIGZEYXRhKTsKLQkJCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIGZvbnRSZWQsIGZvbnRHcmVlbiwgZm9udEJsdWUpOwotCQkJbC5zZXRGb250KGZvbnQpOwotCi0JCQlsLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCUxhYmVsIGwgPSAoTGFiZWwpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbmV3IFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gZ2V0RmlndXJlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZvbnQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTllZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5GcmVlVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgZGlyZWN0IGVkaXRpbmcsIHRleHQgZm9udCwgY29sb3IgYW5kIHNpemUgY2hhbmdlcy4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkuCi0gKi8KLQotcHVibGljIGNsYXNzIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQlwcml2YXRlIEZvbnQgZm9udDsKLQotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0KLQlwcml2YXRlIEZvbnREYXRhIGZEYXRhOwotCi0JcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCXB1YmxpYyBGcmVlVGV4dE5vZGVFZGl0UGFydChOb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJcGFydCA9IHRoaXM7IAotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGcmVlVGV4dEZpZ3VyZSBsID0gbmV3IEZyZWVUZXh0RmlndXJlKCk7Ci0JCXJldHVybiBsOwotCi0JfQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWlmICghKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQkJY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBuZXcgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQocGFydCwgKFN0cmluZykgcmVxdWVzdAotCQkJCQkJLmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQkJCWlmIChmaWcgaW5zdGFuY2VvZiBGcmVlVGV4dEZpZ3VyZSkgewotCQkJCQkoKEZyZWVUZXh0RmlndXJlKSBmaWcpLnNldFRleHQoKFN0cmluZykgcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkKLQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCWZpZy5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQKLQkJCQkmJiAhKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIEZyZWVUZXh0RmlndXJlKSB7Ci0JCQlGcmVlVGV4dEZpZ3VyZSBsID0gKEZyZWVUZXh0RmlndXJlKSBmaWc7Ci0JCQlMaXN0IGFsaXN0ID0gKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpOwotCQkJU3RyaW5nIGZvbnROYW1lID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX05BTUU7Ci0JCQlpbnQgZm9udFN0eWxlID0gU1dULk5PUk1BTDsKLQkJCWludCBmb250SGVpZ2h0ID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX1NJWkU7Ci0JCQlpbnQgZm9udFJlZCA9IFNXVC5DT0xPUl9SRUQ7Ci0JCQlpbnQgZm9udEJsdWUgPSBTV1QuQ09MT1JfQkxVRTsKLQkJCWludCBmb250R3JlZW4gPSBTV1QuQ09MT1JfR1JFRU47Ci0KLQkJCWlmIChhbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBhbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpb3IubmV4dCgpOwotCQkJCQlpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCkpIHsKLQkJCQkJCWwuc2V0VGV4dChwcm9wLmdldFZhbHVlKCkpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSkpIHsKLQkJCQkJCWZvbnROYW1lID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUpKSB7Ci0JCQkJCQlmb250U3R5bGUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpKSB7Ci0JCQkJCQlmb250SGVpZ2h0ID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVEKSkgewotCQkJCQkJZm9udFJlZCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpKSB7Ci0JCQkJCQlmb250Qmx1ZSA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKSkgewotCQkJCQkJZm9udEdyZWVuID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsLnNldFRleHQoKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQljb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmRGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgZm9udEhlaWdodCwgZm9udFN0eWxlKTsKLQkJCWZvbnQgPSBuZXcgRm9udChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKSwgZkRhdGEpOwotCQkJY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgZm9udFJlZCwgZm9udEdyZWVuLCBmb250Qmx1ZSk7Ci0JCQlsLnNldEZvbnQoZm9udCk7Ci0KLQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJRnJlZVRleHRGaWd1cmUgbCA9IChGcmVlVGV4dEZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gZ2V0RmlndXJlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNkZWFjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0JU3RyaW5nIGdldERpcmVjdEVkaXRUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vcmV0dXJuIHN1cGVyLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgRnJlZVRleHRGaWd1cmUpIHsKLQkJCXJldHVybiAoKEZyZWVUZXh0RmlndXJlKSBmaWcpLmdldFRleHQoKTsKLQkJfSAKLQkJcmV0dXJuICIiOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5ODQxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBMYWJlbCBwbGFjaW5nLiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotZmluYWwgcHVibGljIGNsYXNzIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIElGaWd1cmUgZmlnOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFdJTl9YX09GRlNFVCA9IC00OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFdJTl9XX09GRlNFVCA9IDU7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgR1RLX1hfT0ZGU0VUID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBHVEtfV19PRkZTRVQgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BQ19YX09GRlNFVCA9IC0zOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BQ19XX09GRlNFVCA9IDk7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFDX1lfT0ZGU0VUID0gLTM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFDX0hfT0ZGU0VUID0gNjsKLQotCXB1YmxpYyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKElGaWd1cmUgZmlndXJlKSB7Ci0JCWZpZyA9IGZpZ3VyZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCi0JcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQotCQlSZWN0YW5nbGUgcmVjdCA9IG51bGw7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkKLQkJCXJlY3QgPSAoKExhYmVsKSBmaWcpLmdldFRleHRCb3VuZHMoKS5pbnRlcnNlY3QoZmlnLmdldENsaWVudEFyZWEoKSk7Ci0JCWVsc2UKLQkJCXJlY3QgPSBmaWcuZ2V0Q2xpZW50QXJlYShSZWN0YW5nbGUuU0lOR0xFVE9OKTsKLQkJZmlnLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0KLQkJaW50IHhPZmZzZXQgPSAwOwotCQlpbnQgd09mZnNldCA9IDA7Ci0JCWludCB5T2Zmc2V0ID0gMDsKLQkJaW50IGhPZmZzZXQgPSAwOwotCi0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHNJZ25vcmVDYXNlKCJndGsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl4T2Zmc2V0ID0gR1RLX1hfT0ZGU0VUOwotCQkJd09mZnNldCA9IEdUS19XX09GRlNFVDsKLQkJfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHNJZ25vcmVDYXNlKCJjYXJib24iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl4T2Zmc2V0ID0gTUFDX1hfT0ZGU0VUOwotCQkJd09mZnNldCA9IE1BQ19XX09GRlNFVDsKLQkJCXlPZmZzZXQgPSBNQUNfWV9PRkZTRVQ7Ci0JCQloT2Zmc2V0ID0gTUFDX0hfT0ZGU0VUOwotCQl9IGVsc2UgewotCQkJeE9mZnNldCA9IFdJTl9YX09GRlNFVDsKLQkJCXdPZmZzZXQgPSBXSU5fV19PRkZTRVQ7Ci0JCX0KLQotCQl0ZXh0LnNldEJvdW5kcyhyZWN0LnggKyB4T2Zmc2V0LCByZWN0LnkgKyB5T2Zmc2V0LAotCQkJCXJlY3Qud2lkdGggKyB3T2Zmc2V0LCByZWN0LmhlaWdodCArIGhPZmZzZXQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMGY5MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGRpcmVjdCBlZGl0IG9wZXJhdGlvbiBieSBjcmVhdGluZyBhbmQgbWFpbnRhaW5pbmcgdGhlIAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcn0gYW5kIGV4ZWN1dGluZyB0aGUgcmVzdWx0aW5nIGNvbW1hbmQgaWYgCi0gKiB0aGUgY2VsbCBlZGl0b3IgdmFsdWUgaGFzIGNoYW5nZWQuIEZvciB7QGxpbmsgTGFiZWx9LgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExhYmVsRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlGb250IHNjYWxlZEZvbnQ7Ci0KLQlwdWJsaWMgTGFiZWxEaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIENsYXNzIGVkaXRvclR5cGUsCi0JCQlDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIG1pZ2h0IGJlIHJlLWVudGVyZWQgd2hlbiBzdXBlci5icmluZ0Rvd24oKSBpcyBjYWxsZWQuCi0JCUZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotCQlzY2FsZWRGb250ID0gbnVsbDsKLQkJc3VwZXIuYnJpbmdEb3duKCk7Ci0JCWlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotCQkJZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQotCQlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoZ2V0SW5pdGlhbFRleHQoKSk7Ci0JCUlGaWd1cmUgZmlndXJlID0gZ2V0RWRpdFBhcnQoKS5nZXRGaWd1cmUoKTsKLQkJc2NhbGVkRm9udCA9IGZpZ3VyZS5nZXRGb250KCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBzY2FsZWRGb250LmdldEZvbnREYXRhKClbMF07Ci0JCURpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0JCWdldERpcmVjdEVkaXRGaWd1cmUoKS50cmFuc2xhdGVUb0Fic29sdXRlKGZvbnRTaXplKTsKLQkJZGF0YS5zZXRIZWlnaHQoZm9udFNpemUuaGVpZ2h0KTsKLQkJc2NhbGVkRm9udCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCi0JCXRleHQuc2V0Rm9udChzY2FsZWRGb250KTsKLQkJdGV4dC5zZWxlY3RBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjZWxsIGVkaXRvciBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlLiBUaGUgY2VsbCBlZGl0b3IgaXMKLQkgKiBjcmVhdGVkIGJ5IGluc3RhbnRpYXRpbmcgdGhlIGNlbGwgZWRpdG9yIHR5cGUgcGFzc2VkIGludG8gdGhpcwotCSAqIERpcmVjdEVkaXRNYW5hZ2VyJ3MgY29uc3R1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgY29tcG9zaXRlIHRvIGNyZWF0ZSB0aGUgY2VsbCBlZGl0b3Igb24KLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNlbGwgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvck9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvcihjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSB0ZXh0IHNob3duIGluIHRoZSBjZWxsIGVkaXRvciBmb3IKLQkgKiAgICAgICAgIGRpcmVjdC1lZGl0aW5nOyBjYW5ub3QgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsVGV4dCgpIHsKLQkJcmV0dXJuICgoQmFzZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXREaXJlY3RFZGl0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbml0aWFsIHRleHQgb2YgdGhlIGNlbGwgZWRpdG9yIGFuZCB0byBkZXRlcm1pbmUKLQkgKiB0aGUgZm9udCBzaXplIG9mIHRoZSB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpZ3VyZSBiZWluZyBlZGl0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gKChCYXNlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpLmdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMWVkNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ29uc3RyYWludCBmb3IgVGV4dCBwbGFjaW5nLiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yIGZvciB0aGUgZ2l2ZW4gTGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBMYWJlbAotCSAqLwotCXB1YmxpYyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkgewotCQlzZXRMYWJlbChsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDZWxsRWRpdG9yTG9jYXRvciNyZWxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJUG9pbnQgcHJlZiA9IHRleHQuY29tcHV0ZVNpemUoLTEsIC0xKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBsYWJlbC5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlsYWJlbC50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQl0ZXh0LnNldEJvdW5kcyhyZWN0LnggLSAxLCByZWN0LnkgLSAxLCBwcmVmLnggKyAxLCBwcmVmLnkgKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBMYWJlbCBmaWd1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgTGFiZWwKLQkgKi8KLQlwcm90ZWN0ZWQgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIFRoZSBsYWJlbCB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbChMYWJlbCBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xpbmtFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MaW5rRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiY2JkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xpbmtFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlnb25EZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUxpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTGlua0JlbmRwb2ludEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5MaW5rRW5kcG9pbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IHRvIHVwZGF0ZSB0aGUgYXBwZWFyYW5jZSwgYW5kIGluc3RhbGxzIHRoZSBlZGl0cG9saWNpZXMKLSAqIHNwZWNpZmljIHRoZSB7QGxpbmsgTGlua30gYW5kIGxpc3RlbnMgdG8gY2hhbmdlcyBpbiB0aGUgZGlhZ3JhbSBtb2RlbC4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBtb2RlbExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBMaW5rRWRpdFBhcnQoTGluayBjb25uKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE1vZGVsKGNvbm4pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlnZXRMaW5rKCkuZUFkYXB0ZXJzKCkuYWRkKG1vZGVsTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05ORUNUSU9OX0VORFBPSU5UU19ST0xFLAotCQkJCW5ldyBMaW5rRW5kcG9pbnRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTk5FQ1RJT05fUk9MRSwKLQkJCQluZXcgQ29ubmVjdGlvbkVkaXRQb2xpY3koKSB7Ci0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoR3JvdXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSByZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLmdldCgKLQkJCQkJCQkJRGVsZXRlQ29tbWFuZC5LRVlfUEVSTV9ERUxFVEUpOwotCQkJCQkJYm9vbGVhbiBwZXJtRGVsZXRlID0gYm9vbCA9PSBudWxsID8gZmFsc2UgOiBib29sCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCXJldHVybiBuZXcgRGVsZXRlTGlua0NvbW1hbmQoKExpbmspIGdldEhvc3QoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKSwgcGVybURlbGV0ZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05ORUNUSU9OX0JFTkRQT0lOVFNfUk9MRSwKLQkJCQluZXcgTGlua0JlbmRwb2ludEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlQb2x5bGluZUNvbm5lY3Rpb24gY29ubiA9IG5ldyBQb2x5bGluZUNvbm5lY3Rpb24oKTsKLQkJY29ubi5zZXRUYXJnZXREZWNvcmF0aW9uKG5ldyBQb2x5Z29uRGVjb3JhdGlvbigpKTsKLQkJdXBkYXRlQXBwZWFyYW5jZSgpOwotCQlyZXR1cm4gY29ubjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQXBwZWFyYW5jZSgpIHsKLQkJaWYgKGZpZ3VyZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlMaW5rIGxpbmsgPSAoTGluaykgZ2V0TW9kZWwoKTsKLQkJaWYgKFZhbGlkYXRpb24uaXNSZWFkT25seShsaW5rKSkgewotCQkJZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvcnMuSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlnZXRMaW5rKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGVsTGlzdGVuZXIpOwotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgZ2V0TGluaygpIHsKLQkJcmV0dXJuIChMaW5rKSBnZXRNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChMaW5rLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJcmVmcmVzaFRhcmdldEFuY2hvcigpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQlyZWZyZXNoU291cmNlQW5jaG9yKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQl1cGRhdGVBcHBlYXJhbmNlKCk7Ci0JCWdldENvbm5lY3Rpb25GaWd1cmUoKS5zZXRSb3V0aW5nQ29uc3RyYWludChnZXRMaW5rKCkuZ2V0QmVuZHBvaW50cygpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05hbWVkTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05hbWVkTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjUyMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9OYW1lZE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5UZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotCi0vKioKLSAqIERpYWdyYW0gY2hpbGRyZW4gc2hvdWxkIGV4dGVuZCB0aGlzIE5hbWVkTm9kZUVkaXRQYXJ0IGluIG9yZGVyIHRvIHN1cHBvcnQgbmFtZSBmb3IgZmlndXJlLgotICogTmFtZWROb2RlRWRpdFBhcnQgcHJvdmlkZXMgaW5zdHJ1Y3R1cmUgdG8gaGFuZGxlIHRoZSBuYW1lIHdyYXBwaW5nIGFuZCBjb2xvci4gU3VwcG9ydCBkaXJlY3QgCi0gKiBlZGl0aW5nIGZlZWRiYWNrLiAgIAotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5hbWVkTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBOYW1lZE5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJTGFiZWwgbCA9IG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQkJbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJaWYgKGdldEltYWdlKCkgIT0gbnVsbCkgewotCQkJbC5zZXRJY29uKGdldEltYWdlKCkpOwotCQl9Ci0JCWwuc2V0VGV4dFBsYWNlbWVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0JCWwuc2V0Rm9udChUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQlzZXRMYWJlbEZvcmVncm91bmRDb2xvcihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldExhYmVsRm9yZWdyb3VuZENvbG9yKExhYmVsIGwpIHsKLQkJTmFtZWROb2RlIG5vZGUgPSAoTmFtZWROb2RlKSBnZXRNb2RlbCgpOwotCQkvLyBPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCS8vIGJvb2xlYW4gc3VwcHJlc3NlZCA9IGlzU3VwcHJlc3NlZChlKTsKLQkJYm9vbGVhbiBzdXBwcmVzc2VkID0gbm9kZS5pc1N1cHByZXNzZWQoKTsKLQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKSB7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQlsLnNldEZvcmVncm91bmRDb2xvcihDb2xvcnMuSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCFzdXBwcmVzc2VkKSB7Ci0JCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQkJfQotCQl9Ci0JCWlmIChzdXBwcmVzc2VkKSB7Ci0JCQlsLnNldEZvcmVncm91bmRDb2xvcihDb2xvcnMuU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpZiAoISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJCWNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbmV3IERpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBDaGFuZ2VOYW1lQ29tbWFuZCgoTmFtZWROb2RlKSBnZXRNb2RlbCgpLAotCQkJCQkJKFN0cmluZykgcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHNob3dDdXJyZW50RWRpdFZhbHVlKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJCSgoTGFiZWwpIGZpZykuc2V0VGV4dChzKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZmlnIGluc3RhbmNlb2YgVGV4dEZpZ3VyZSkgewotCQkJCQkoKFRleHRGaWd1cmUpIGZpZykuc2V0VGV4dChzKTsKLQkJCQl9Ci0JCQkJZmlnLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5hbWVkTm9kZS5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVAotCQkJCSYmICEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9XSURUSCA9IDEyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgV09SS19QUk9EVUNUX1dSQVBfV0lEVEggPSAzOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGwgPSAoTGFiZWwpIGZpZzsKLQkJCXNldExhYmVsRm9yZWdyb3VuZENvbG9yKGwpOwotCQkJU3RyaW5nIHRleHQ7Ci0JCQkvLyBCZWxvdyBjaGVjayBpcyByZXF1aXJlZCBmb3IgRXh0ZW5kZWQgQWN0aXZpdHkgcHJlc2VudGF0aW9uIG5hbWUKLQkJCS8vIHNob3VsZCBiZSB1c2VkIGZyb20gYmFzZS4KLQkJCWlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSBnZXRNb2RlbCgpOwotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCXRleHQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRleHQgPSAoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Ci0JCQkJCQl8fCBnZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCWludCB3ID0gV1JBUF9XSURUSDsKLQkJCQkJaWYgKHRoaXMuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpCi0JCQkJCQl3ID0gV09SS19QUk9EVUNUX1dSQVBfV0lEVEg7Ci0JCQkJCQotCQkJCQlpZih0aGlzLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBUYXNrTm9kZSAmJiAKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmlzQXV0b0xheW91dCgKLQkJCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldE1vZGVsKCkpKXsKLQkJCQkJCS8vIFVzZWQgMTYgYXMgbWluIGxlbmd0aCBmb3IgdGFza25hbWUsIGVsc2UgYWRkIHNwYWNlcyB0byBpdC4KLQkJCQkJCS8vIFRPRE86IGZpbmQgYmV0dGVyIHNvbHV0aW9uIGZvciB0aGlzLgotCQkJCQkJaWYodGV4dC5sZW5ndGgoKSA8IDE2KXsKLQkJCQkJCQlpbnQgZ2FwID0gMTYgLSB0ZXh0Lmxlbmd0aCgpOwotCQkJCQkJCWZvcihpbnQgaT0wOyBpPGdhcC8yOyBpKyspewotCQkJCQkJCQl0ZXh0Kz0iICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJZm9yKGludCBpPTA7IGk8Z2FwLzI7IGkrKyl7Ci0JCQkJCQkJCXRleHQgPSAiICIrdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0ZXh0ID0gd3JhcCh0ZXh0LCB3KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLQkJCX0KLQkJCWwuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgd3JhcChTdHJpbmcgcywgaW50IHdyYXBXaWR0aCkgewotCQlTdHJpbmcgd3JhcHBlZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUJyZWFrSXRlcmF0b3IgYmkgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwotCQlTdHJpbmcgcmVtYWluaW5nID0gczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChyZW1haW5pbmcubGVuZ3RoKCkgPD0gd3JhcFdpZHRoKSB7Ci0JCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJpLnNldFRleHQocmVtYWluaW5nKTsKLQkJCQlpbnQgcG9zID0gYmkuZm9sbG93aW5nKHdyYXBXaWR0aCk7Ci0JCQkJaWYgKHBvcyA9PSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwb3MgPj0gcmVtYWluaW5nLmxlbmd0aCgpKSB7Ci0JCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmcuc3Vic3RyaW5nKDAsIHBvcykgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKHBvcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdyYXBwZWQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlQ29udGFpbmVyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTm9kZUNvbnRhaW5lckVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjE4NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlQ29udGFpbmVyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GYW5Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5Ob2RlQ29udGFpbmVyRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLk5vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbXBvbmVudEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci0KLS8qKgotICogTm9kZUNvbnRhaW5lckVkaXRQYXJ0IG1hbmFnZXMgdGhlIGNoaWxkIGVkaXRwYXJ0cyBpbiBhIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9LgotICogUHJvdmlkZXMgaW5zdHJ1Y3R1cmUgdG8gaGFuZGxlIHRoZSBub3RpZmljYXRpb25zIGZyb20gbW9kZWwuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlQ29udGFpbmVyRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgTGF5ZXJDb25zdGFudHMgewotCi0JcHJpdmF0ZSBCZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyIGNSb3V0ZXI7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBtb2RlbExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBOb2RlQ29udGFpbmVyRWRpdFBhcnQoTm9kZUNvbnRhaW5lciBtb2RlbCkgewotCQlzdXBlcigpOwotCQlzZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU5vZGVDb250YWluZXIgbW9kZWwgPSAoTm9kZUNvbnRhaW5lcikgKChFT2JqZWN0KSBnZXRNb2RlbCgpKTsKLQkJbW9kZWwuZUFkYXB0ZXJzKCkuYWRkKG1vZGVsTGlzdGVuZXIpOwotCQltb2RlbC5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG5ldyBDb21wb25lbnRFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBkZWxldGVSZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLmdldCgKLQkJCQkJCURlbGV0ZUNvbW1hbmQuS0VZX1BFUk1fREVMRVRFKTsKLQkJCQlib29sZWFuIHBlcm1EZWxldGUgPSBib29sID09IG51bGwgPyBmYWxzZSA6IGJvb2wuYm9vbGVhblZhbHVlKCk7Ci0JCQkJRGVsZXRlQ29tbWFuZCBjbWQgPSBuZXcgRGVsZXRlQ29tbWFuZChwZXJtRGVsZXRlKTsKLQkJCQljbWQuc2V0UGFydFRvQmVEZWxldGVkKGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJCQlyZXR1cm4gY21kOwotCQkJfQotCQl9KTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbnVsbCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUsCi0JCQkJbmV3IE5vZGVDb250YWluZXJFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Lk5PREVfUk9MRSwgbnVsbCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsCi0JCQkJbmV3IE5vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlOb2RlQ29udGFpbmVyIG1vZGVsID0gKE5vZGVDb250YWluZXIpICgoRU9iamVjdCkgZ2V0TW9kZWwoKSk7Ci0JCW1vZGVsLmVBZGFwdGVycygpLnJlbW92ZShtb2RlbExpc3RlbmVyKTsKLQkJbW9kZWwucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0KLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBmaW5kQ2hpbGRCeU1vZGVsKE9iamVjdCBtb2RlbCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gbW9kZWwpIHsKLQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFydFRvRWRpdChDb2xsZWN0aW9uIHBhcnRzVG9FZGl0LCBPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBmaW5kQ2hpbGRCeU1vZGVsKG5vZGUpOwotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQmFzZUVkaXRQYXJ0KSB7Ci0JCQkJRGlyZWN0RWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSAoKEJhc2VFZGl0UGFydCkgZWRpdFBhcnQpCi0JCQkJCQkuZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKTsKLQkJCQlpZiAoZWRpdE1hbmFnZXIgaW5zdGFuY2VvZiBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJCSYmICgoVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKSBlZGl0TWFuYWdlcikKLQkJCQkJCQkJLnZhbGlkYXRlKCgoTmFtZWROb2RlKSBub2RlKS5nZXROYW1lKCkpICE9IG51bGwpIHsKLQkJCQkJcGFydHNUb0VkaXQuYWRkKGVkaXRQYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZUNvbnRhaW5lci5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCXJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0KLQkJCUxpc3QgcGFydHNUb0VkaXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuaXNGb2N1c0NvbnRyb2woKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcnRzVG9FZGl0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlCYXNlRWRpdFBhcnQgZWRpdFBhcnQgPSAoQmFzZUVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCQkJZWRpdFBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBnZXRNb2RlbCgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24obm9kZS5nZXRXaWR0aCgpLCBub2RlLmdldEhlaWdodCgpKTsKLQkJaWYgKHNpemUgPT0gbnVsbCkgewotCQkJc2l6ZSA9IG5ldyBEaW1lbnNpb24oNjAsIDEwMCk7Ci0JCX0KLQkJUG9pbnQgbG9jID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jID09IG51bGwpIHsKLQkJCWxvYyA9IG5ldyBQb2ludCgxMCwgMTApOwotCQl9Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShsb2MsIHNpemUpOwotCi0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIHIpOwotCi0JCWlmIChjUm91dGVyID09IG51bGwpIHsKLQkJCUNvbm5lY3Rpb25MYXllciBjTGF5ZXIgPSAoQ29ubmVjdGlvbkxheWVyKSBnZXRMYXllcihDT05ORUNUSU9OX0xBWUVSKTsKLQkJCUZhblJvdXRlciByb3V0ZXIgPSBuZXcgRmFuUm91dGVyKCk7Ci0JCQlyb3V0ZXIuc2V0U2VwYXJhdGlvbigzMCk7Ci0JCQljUm91dGVyID0gbmV3IEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIoKTsKLQkJCXJvdXRlci5zZXROZXh0Um91dGVyKGNSb3V0ZXIpOwotCQkJY0xheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIocm91dGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAoKE5vZGVDb250YWluZXIpIGdldE1vZGVsKCkpLmdldE5vZGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIE9ubHkgdXNlZnVsIGluIGNhc2Ugb2YgQURELiBQbGFjZWQgaGVyZSBpbiBvcmRlciB0byBpbnZva2UgaW4gc3ViIGNsYXNzZXMuCi0JICogVE9ETzogIE1vdmUgdGhpcyBtZXRob2QgdG8gdXRpbGl0eSBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbShFZGl0UGFydCBwYXJ0KSB7Ci0JCUVkaXRQYXJ0IGRlcCA9IChFZGl0UGFydCkgcGFydC5nZXRQYXJlbnQoKTsKLQkJaWYoZGVwIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgKXsKLQkJCQotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgYWRkID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydClkZXApOwotCQkJaWYoISgoRGlhZ3JhbSlhZGQuZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKXsKLQkJCQlhZGQuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGRlcC5nZXRDaGlsZHJlbigpKTsKLQkJCi0JCQkJLy8gY2xlYW4gdXAgdGhlIGRpYWdyYW0KLQkJCQlEZWZhdWx0RWRpdERvbWFpbiBlZGl0aW5nRG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKG51bGwpOwotCQkJCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5ID0gbmV3IEFjdGlvblJlZ2lzdHJ5KCk7Ci0JCQotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvblNlcnZpY2UoCi0JCQkJCQkoR3JhcGhpY2FsVmlld2VyKWdldFBhcmVudCgpLmdldFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCQotCQkJCURpYWdyYW1VcGRhdGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQkJCQkoR3JhcGhpY2FsVmlld2VyKWdldFBhcmVudCgpLmdldFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OTg3ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNob3Bib3hBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlTGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbXBvbmVudEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgY29ubmVjdGlvbnMsIGFuZCBpbnN0YWxscyBFZGl0UG9saWN5IGZvciAoCi0gKiB7QGxpbmsgRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRX0sIHtAbGluayBFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEV9LAotICoge0BsaW5rRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRX0pCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5nZWYuTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBOb2RlRWRpdFBhcnQoTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbmV3IENvbXBvbmVudEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIGRlbGV0ZVJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkuZ2V0KAotCQkJCQkJRGVsZXRlQ29tbWFuZC5LRVlfUEVSTV9ERUxFVEUpOwotCQkJCWJvb2xlYW4gcGVybURlbGV0ZSA9IGJvb2wgPT0gbnVsbCA/IGZhbHNlIDogYm9vbC5ib29sZWFuVmFsdWUoKTsKLQkJCQlEZWxldGVDb21tYW5kIGNtZCA9IG5ldyBEZWxldGVDb21tYW5kKHBlcm1EZWxldGUpOwotCQkJCWNtZC5zZXRQYXJ0VG9CZURlbGV0ZWQoZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCXJldHVybiBjbWQ7Ci0JCQl9Ci0JCX0pOwotCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSB7Ci0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQoCi0JCQkJCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQ3JlYXRlTGlua0NvbW1hbmQgY21kID0gKENyZWF0ZUxpbmtDb21tYW5kKSByZXF1ZXN0Ci0JCQkJCQkJCS5nZXRTdGFydENvbW1hbmQoKTsKLQkJCQkJCWNtZC5zZXRUYXJnZXQoKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKS5lcXVhbHMoCi0JCQkJCQkJCQlyZXF1ZXN0LmdldFNvdXJjZUVkaXRQYXJ0KCkpKSB7Ci0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljbWQKLQkJCQkJCQkJCQkuc2V0VGFyZ2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkJLmdldFRhcmdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25DcmVhdGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IG5ldyBDcmVhdGVMaW5rQ29tbWFuZCgKLQkJCQkJCQkJTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCksCi0JCQkJCQkJCShOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQKLQkJCQkJCQkJCS5zZXRTb3VyY2VFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNtZC5zZXRTb3VyY2VFbmRQb2ludChyZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfQotCQkJCQkJcmVxdWVzdC5zZXRTdGFydENvbW1hbmQoY21kKTsKLQotCQkJCQkJcmV0dXJuIGNtZDsKLQotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0U291cmNlQ29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIHRydWUpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZWNvbm5lY3RUYXJnZXRDb21tYW5kKAotCQkJCQkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjbWQgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCWxpbmssIChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgZmFsc2UpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbnVsbCk7Ci0JCS8vIEJ5IGRlZmF1bHQsIGNhbid0IGFkZCBhbnl0aGluZyB0byBhIG5vZGUKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlRGVwZW5kYW50Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBnZXRNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsVGFyZ2V0Q29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZS5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6CQkJCi0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRUYXJnZXRDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubiA9IChDb25uZWN0aW9uRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJCWNvbm4ucmVmcmVzaCgpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQlyZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlSZWN0YW5nbGUgY29uc3RyYWludCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJaWYgKGdldE5vZGUoKS5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQljb25zdHJhaW50LnNldExvY2F0aW9uKGdldE5vZGUoKS5nZXRMb2NhdGlvbigpKTsKLQkJY29uc3RyYWludC53aWR0aCA9IGdldE5vZGUoKS5nZXRXaWR0aCgpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBjb25zdHJhaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2FjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJKChOb2RlKSBnZXRNb2RlbCgpKS5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCSgoTm9kZSkgZ2V0TW9kZWwoKSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SYWlzZWRNYXJnaW5Cb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyZDBhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2UgIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqICBBIGJvcmRlciB3aXRoIGEgcmFpc2VkIG1hcmdpbi4KLSAqICAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmFpc2VkTWFyZ2luQm9yZGVyIGV4dGVuZHMgTWFyZ2luQm9yZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEluc2V0cyBERUZBVUxUX0lOU0VUUyA9IG5ldyBJbnNldHMoMTAsIDEwLCAxMCwgMTApOwotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcigpIHsKLQkJdGhpcyhERUZBVUxUX0lOU0VUUyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihJbnNldHMgaW5zZXRzKSB7Ci0JCXN1cGVyKGluc2V0cyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihpbnQgdCwgaW50IGwsIGludCBiLCBpbnQgcikgewotCQlzdXBlcih0LCBsLCBiLCByKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjZ2V0SW5zZXRzKElGaWd1cmUpCi0JICovCi0JcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJcmV0dXJuIGluc2V0czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI2lzT3BhcXVlKCkKLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBnLCBJbnNldHMgaW5zZXRzKSB7Ci0JCWcuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfU09MSUQpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJZy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uTGlnaHRlc3QpOwotCQlSZWN0YW5nbGUgciA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJci5yZXNpemUoLTEsIC0xKTsKLQkJZy5kcmF3TGluZShyLngsIHIueSwgci5yaWdodCgpLCByLnkpOwotCQlnLmRyYXdMaW5lKHIueCwgci55LCByLngsIHIuYm90dG9tKCkpOwotCQlnLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQlnLmRyYXdMaW5lKHIueCwgci5ib3R0b20oKSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQkJZy5kcmF3TGluZShyLnJpZ2h0KCksIHIueSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmVsYXRpdmVYWUFuY2hvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SZWxhdGl2ZVhZQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2I3NWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SZWxhdGl2ZVhZQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByZWxhdGl2ZSBhbmNob3IgZm9yIGEgZmlndXJlJ3MgbG9jYXRpb24uIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVYWUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIFBvaW50IHJlbGF0aXZlTG9jYXRpb247Ci0KLQlwdWJsaWMgUmVsYXRpdmVYWUFuY2hvcihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgbG9jYXRpb24sIGJvb2xlYW4gaXNSZWxhdGl2ZSkgewotCQlzdXBlcihmaWd1cmUpOwotCQlyZWxhdGl2ZUxvY2F0aW9uID0gbG9jYXRpb24uZ2V0Q29weSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlQb2ludCBwID0gcmVsYXRpdmVMb2NhdGlvbi5nZXRDb3B5KCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXAucGVyZm9ybVRyYW5zbGF0ZShyLngsIHIueSk7Ci0JCWdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yI2dldFJlZmVyZW5jZVBvaW50KCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbihudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDgxMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBpcyBjb250YWluZXIgd2l0aCB7QGxpbmsgRmxvd0xheW91dH0sIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy9yZW1vdmluZyBjaGlsZCBlZGl0cGFydC4gCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBleHRlbmRzIE5vZGVDb250YWluZXJFZGl0UGFydCB7Ci0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0vLwkJCTI1NSwgMTU2KTsKLQkKLQlwcml2YXRlIHN0YXRpYyAgQ29sb3IgQkdfQ09MT1I7Ci0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQoUm9sZVRhc2tDb21wb3NpdGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLQkJRmxvd0xheW91dCBsYXlvdXQgPSBuZXcgRmxvd0xheW91dCgpOwotCQlsYXlvdXQuc2V0TWlub3JTcGFjaW5nKDIwKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJZmlndXJlLnNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKGdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJZmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0I2hhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGVDb250YWluZXIuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCi0JCQkvLyByZWZyZXNoIGRpYWdyYW0ncyBjaGlsZHJlbgotCQkJRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0UGFyZW50KCk7Ci0vLwkJCWlmIChkaWFncmFtRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotLy8JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBkaWFncmFtRWRpdFBhcnQKLS8vCQkJCQkJLmdldE1vZGVsKCk7Ci0vLwotLy8JCQkJaWYgKCFHcmFwaGljYWxEYXRhSGVscGVyLmlzQXV0b0xheW91dChkaWFncmFtKSkgewotLy8JCQkJCSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGRpYWdyYW1FZGl0UGFydCkKLS8vCQkJCQkJCS5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoCi0vLwkJCQkJCQkJCWRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpKTsKLS8vCQkJCQlEZWZhdWx0RWRpdERvbWFpbiBlZCA9IChEZWZhdWx0RWRpdERvbWFpbikgZGlhZ3JhbUVkaXRQYXJ0Ci0vLwkJCQkJCQkuZ2V0Vmlld2VyKCkuZ2V0RWRpdERvbWFpbigpOwotLy8JCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGVkLmdldEVkaXRvclBhcnQoKTsKLS8vCQkJCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKSB7Ci0vLwkJCQkJCSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKSBlZGl0b3IpLmNsZWFuVXBEaWFncmFtKCk7Ci0vLwkJCQkJfQotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlkaWFncmFtRWRpdFBhcnQucmVmcmVzaCgpOwotLy8JCQkJfQotLy8JCQl9Ci0JCQlkaWFncmFtRWRpdFBhcnQucmVmcmVzaCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjY3JlYXRlRWRpdFBvbGljaWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBuZXcgUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbnVsbCk7Ci0JfQotCXByb3RlY3RlZCBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKXsKLQkJaWYoQkdfQ09MT1IgIT0gbnVsbCkgcmV0dXJuIEJHX0NPTE9SOwotCQkKLQkJaWYoQkdfQ09MT1IgPT0gbnVsbCl7Ci0JCQlTdHJpbmcgY29sb3JTdHJpbmcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5BRERfUk9MRV9UQVNLU19CT1hfQkdfQ09MT1JfUkdCKTsKLQkJCWlmKGNvbG9yU3RyaW5nICE9IG51bGwgJiYgY29sb3JTdHJpbmcubGVuZ3RoKCkgPiAwKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2xvclN0cmluZywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWludCByID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCWludCBnID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCWludCBiID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCUJHX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIHIsZyxiKTsKLQkJCQlyZXR1cm4gQkdfQ09MT1I7Ci0JCQl9Ci0JCX0KLQkJaWYoQkdfQ09MT1IgPT0gbnVsbCl7Ci0JCQlCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCQkJCQkJCTI1NSwgMTU2KTsKLQkJfQotCQlyZXR1cm4gQkdfQ09MT1I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TdGFydE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TdGFydE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWFiY2IzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvU3RhcnROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBjcmVhdGluZyBmaWd1cmUgZm9yIHtAbGluayBUeXBlZE5vZGUuU1RBUlR9Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFydE5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgU3RhcnROb2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUVsbGlwc2UgZiA9IG5ldyBFbGxpcHNlKCk7Ci0JCWYuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJZi5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMucmVkKTsKLQkJZi5zZXRTaXplKDIwLCAyMCk7Ci0JCXJldHVybiBmOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TeW5jaEJhck5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TeW5jaEJhck5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZjMDAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvU3luY2hCYXJOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgY3JlYXRpbmcgZmlndXJlIGFuZCBjcmVhdGluZyByZWxhdGl2ZSBhbmNob3JzCi0gKiBmb3Ige0BsaW5rIFR5cGVkTm9kZS5TWU5DX0JBUn0KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaEJhck5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUNvbm5lY3Rpb25BbmNob3JMb2NhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIDUxLCAxMDIsIDEwMik7Ci0KLQlwcml2YXRlIFBvaW50IHJlY2VudFRhcmdldEVuZFBvaW50OwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQotCXB1YmxpYyBTeW5jaEJhck5vZGVFZGl0UGFydChUeXBlZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlSZWN0YW5nbGVGaWd1cmUgZiA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJZi5zZXRCYWNrZ3JvdW5kQ29sb3IoQkdfQ09MT1IpOwotCQlmLnNldFNpemUoMTAwLCA1KTsKLQkJcmV0dXJuIGY7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCWJvb2xlYW4gaXNSZWxhdGl2ZSA9IGZhbHNlOwotCQlQb2ludCBzb3VyY2VFbmRQb2ludCA9IG51bGw7Ci0JCWlmIChyZWNlbnRTb3VyY2VFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgc291cmNlIGVuZCBwb2ludCBmcm9tIHRoZSBtb2RlbAotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXNvdXJjZUVuZFBvaW50ID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCQl9Ci0JCWlmIChzb3VyY2VFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHNvdXJjZUVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBwID0gbnVsbDsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgewotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxID0gKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSByZXF1ZXN0OwotCQkJcCA9IHJlcS5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpIHsKLQkJCXAgPSAoKExvY2F0aW9uUmVxdWVzdCkgcmVxdWVzdCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlpZiAocCAhPSBudWxsKSB7Ci0JCQlyZWNlbnRTb3VyY2VFbmRQb2ludCA9IGdldExvY2F0aW9uKHApOwotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCByZWNlbnRTb3VyY2VFbmRQb2ludCwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IocmVxdWVzdCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCWJvb2xlYW4gaXNSZWxhdGl2ZSA9IGZhbHNlOwotCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9IG51bGw7Ci0JCWlmIChyZWNlbnRUYXJnZXRFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJdGFyZ2V0RW5kUG9pbnQgPSBsaW5rLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldEVuZFBvaW50ID0gcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHRhcmdldEVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgdGFyZ2V0RW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50VGFyZ2V0RW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50VGFyZ2V0RW5kUG9pbnQsIHRydWUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldENvbm5lY3Rpb25BbmNob3IocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yI2dldExvY2F0aW9uKFBvaW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpIHsKLQkJcmV0dXJuIENsb3Nlc3RBbmNob3IuZ2V0TG9jYXRpb24oZ2V0RmlndXJlKCksIHJlZmVyZW5jZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1ZTdkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5UZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ29uc3RyYWludCBmb3IgVGV4dEZsb3cgcGxhY2luZy4KLSAqIEBhdXRob3IgSmFtZXMgVGhhcmlvCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIFRleHRGaWd1cmUgZmlndXJlOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yIGZvciB0aGUgZ2l2ZW4gdGV4dCBmaWd1cmUKLQkgKiBAcGFyYW0gdGYKLQkgKi8KLQlwdWJsaWMgVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yKFRleHRGaWd1cmUgdGYpIHsKLQkJc2V0RmlndXJlKHRmKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENlbGxFZGl0b3JMb2NhdG9yI3JlbG9jYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yLmRvTG9jYXRlKGNlbGxlZGl0b3IsIGZpZ3VyZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRvTG9jYXRlKENlbGxFZGl0b3IgY2UsIFRleHRGaWd1cmUgZmlnKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBjZS5nZXRDb250cm9sKCk7Ci0JCVN0cmluZyBuID0gKFN0cmluZykgY2UuZ2V0VmFsdWUoKTsKLQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KG4pOwotCQlnYy5kaXNwb3NlKCk7Ci0JCWlmIChzaXplLnggIT0gMCkKLQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQl0ZXh0LnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQlSZWN0YW5nbGUgdGV4dEJvdW5kcyA9IG5ldyBSZWN0YW5nbGUodGV4dC5nZXRDbGllbnRBcmVhKCkueCwgdGV4dAotCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgdGV4dC5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCVJlY3RhbmdsZSBmaWdCb3VuZHMgPSBmaWcuZ2V0Q2xpZW50QXJlYSgpOwotCQlmaWcudHJhbnNsYXRlVG9BYnNvbHV0ZShmaWdCb3VuZHMpOwotCQlpbnQgZGVsdGEgPSAoZmlnQm91bmRzLndpZHRoIC0gdGV4dEJvdW5kcy53aWR0aCkgLyAyOwotCQlpbnQgeSA9IGZpZy5nZXRUZXh0Rmxvd1BhZ2UoKS5nZXRMb2NhdGlvbigpLnk7Ci0JCXRleHQuc2V0TG9jYXRpb24oZmlnQm91bmRzLnggKyBkZWx0YSwgeSk7Ci0JfQotCi0JcHVibGljIFRleHRGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpZ3VyZShUZXh0RmlndXJlIGZpZ3VyZSkgewotCQl0aGlzLmZpZ3VyZSA9IGZpZ3VyZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZiMjdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5UZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogTWFuYWdlcyBkaXJlY3QgZWRpdGluZyBhbmQgY3JlYXRpbmcgY2VsbGVkaXRvciBmb3Ige0BsaW5rIFRleHRGaWd1cmV9Ci0gKiAKLSAqIEBhdXRob3IgSmFtZXMgVGhhcmlvCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlGb250IHNjYWxlZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgdmVyaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgVGV4dEZpZ3VyZSBmaWd1cmUgPSBudWxsOwotCi0JcHVibGljIFRleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsCi0JCQlDbGFzcyBlZGl0b3JUeXBlLCBDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yLCBUZXh0RmlndXJlIGZpZ3VyZSkgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCQl0aGlzLmZpZ3VyZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJTmFtZWROb2RlIG5vZGUgPSAoTmFtZWROb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCURpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkKLQkJCQkJCS5hc3luY0V4ZWMoCi0JCQkJCQkJCW5ldyBQcm9tcHRFZGl0KAotCQkJCQkJCQkJCShOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsgCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNpbml0Q2VsbEVkaXRvcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHRDZWxsRWRpdG9yIGVkaXRvciA9IChUZXh0Q2VsbEVkaXRvcikgZ2V0Q2VsbEVkaXRvcigpOwotCQllZGl0b3Iuc2V0U3R5bGUoU1dULk1VTFRJKTsKLQkJVGV4dCB0ID0gKFRleHQpIGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSAoKE5hbWVkTm9kZUVkaXRQYXJ0KSB0aGlzLmdldEVkaXRQYXJ0KCkpCi0JCQkJLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JCWVkaXRvci5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJdC5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJaWYgKHZlcmlmeUxpc3RlbmVyICE9IG51bGwpCi0JCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOYW1lZE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7IAotCQkJcGFydC5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVG9wQW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RvcEFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjgyODJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVG9wQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBDb25uZWN0aW9uIGFuY2hvciBmb3IgdG9wIG9mIHRoZSBmaWd1cmUuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1jbGFzcyBUb3BBbmNob3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25BbmNob3IgewotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0OwotCi0JVG9wQW5jaG9yKElGaWd1cmUgc291cmNlLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpIHsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlpbnQgb2ZmID0gb2Zmc2V0OwotCQlpZiAob2ZmID09IC0xKQotCQkJb2ZmID0gci53aWR0aCAvIDI7Ci0JCWlmIChyLmNvbnRhaW5zKHJlZmVyZW5jZSkgfHwgci55IDwgcmVmZXJlbmNlLnkpCi0JCQlyZXR1cm4gci5nZXRCb3R0b21MZWZ0KCkudHJhbnNsYXRlKG9mZiwgLTEpOwotCQllbHNlCi0JCQlyZXR1cm4gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKG9mZiwgMCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9WYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MmQwMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9WYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIE1hbmFnZXMgZGlyZWN0IGVkaXRpbmcgYW5kIGNyZWF0aW5nIGNlbGwgZWRpdG9yIGZvciB0aGUge0BsaW5rIExhYmVsfQotICogYW5kIHZhbGlkYXRlcyB0aGUgaW5wdXQuIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBMYWJlbCBhY3Rpdml0eUxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBY3Rpdml0eURpcmVjdEVkaXRNYW5hZ2VyIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBFZGl0UGFydAotCSAqIEBwYXJhbSBlZGl0b3JUeXBlCi0JICogICAgICAgICAgICB0eXBlIG9mIGVkaXRvcgotCSAqIEBwYXJhbSBsb2NhdG9yCi0JICogICAgICAgICAgICB0aGUgQ2VsbEVkaXRvckxvY2F0b3IKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIExhYmVsIGxhYmVsKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCWFjdGl2aXR5TGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJTmFtZWROb2RlIG5vZGUgPSAoTmFtZWROb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCURpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkKLQkJCQkJCS5hc3luY0V4ZWMoCi0JCQkJCQkJCW5ldyBQcm9tcHRFZGl0KAotCQkJCQkJCQkJCShOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsgCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNpbml0Q2VsbEVkaXRvcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQl2ZXJpZnlMaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCVN0cmluZyBsZWZ0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKDAsIGV2ZW50LnN0YXJ0KTsKLQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoZXZlbnQuZW5kLCBvbGRUZXh0Ci0JCQkJCQkubGVuZ3RoKCkpOwotCQkJCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQkJCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KGxlZnRUZXh0ICsgZXZlbnQudGV4dCArIHJpZ2h0VGV4dCk7Ci0JCQkJZ2MuZGlzcG9zZSgpOwotCQkJCWlmIChzaXplLnggIT0gMCkKLQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCQkJZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKS5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCX0KLQkJfTsKLQkJdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSBhY3Rpdml0eUxhYmVsLmdldFRleHQoKTsKLQkJZ2V0Q2VsbEVkaXRvcigpLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotCQlJRmlndXJlIGZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpLmdldEZpZ3VyZSgpOwotCQlzY2FsZWRGb250ID0gZmlndXJlLmdldEZvbnQoKTsKLQkJRm9udERhdGEgZGF0YSA9IHNjYWxlZEZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLQkJRGltZW5zaW9uIGZvbnRTaXplID0gbmV3IERpbWVuc2lvbigwLCBkYXRhLmdldEhlaWdodCgpKTsKLQkJYWN0aXZpdHlMYWJlbC50cmFuc2xhdGVUb0Fic29sdXRlKGZvbnRTaXplKTsKLQkJZGF0YS5zZXRIZWlnaHQoZm9udFNpemUuaGVpZ2h0KTsKLQkJc2NhbGVkRm9udCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCi0JCXRleHQuc2V0Rm9udChzY2FsZWRGb250KTsKLQkJdGV4dC5zZWxlY3RBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciN1bmhvb2tMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuaG9va0xpc3RlbmVycygpIHsKLQkJc3VwZXIudW5ob29rTGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRDZWxsRWRpdG9yKCkgIT0gbnVsbCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJCXZlcmlmeUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHR4dAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQoKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLCBtc2cpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5jb21taXQoKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotCQlwcml2YXRlIE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTmFtZWROb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsgCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9WYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9WYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODBlMzgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIE1hbmFnZXMgZGlyZWN0IGVkaXRpbmcgYW5kIGNyZWF0aW5nIGNlbGwgZWRpdG9yIGZvciB0aGUge0BsaW5rIExhYmVsfQotICogYW5kIHZhbGlkYXRlcyB0aGUgaW5wdXQuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBMYWJlbCBhY3Rpdml0eUxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBY3Rpdml0eURpcmVjdEVkaXRNYW5hZ2VyIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBFZGl0UGFydAotCSAqIEBwYXJhbSBlZGl0b3JUeXBlCi0JICogICAgICAgICAgICB0eXBlIG9mIGVkaXRvcgotCSAqIEBwYXJhbSBsb2NhdG9yCi0JICogICAgICAgICAgICB0aGUgQ2VsbEVkaXRvckxvY2F0b3IKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLAotCQkJQ2xhc3MgZWRpdG9yVHlwZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvciwgTGFiZWwgbGFiZWwpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQkJYWN0aXZpdHlMYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9ICgoTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKTsKLQkJCVN0cmluZyBuYW1lID0gKChQcm9wZXJ0eSkgbm9kZS5nZXRQcm9wZXJ0eSgpLmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCURpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkKLQkJCQkJCS5hc3luY0V4ZWMoCi0JCQkJCQkJCW5ldyBQcm9tcHRFZGl0KAotCQkJCQkJCQkJCShOb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdCkpOyAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGFjdGl2aXR5TGFiZWwuZ2V0VGV4dCgpOwotCQlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RmlndXJlKCk7Ci0JCXNjYWxlZEZvbnQgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlhY3Rpdml0eUxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotCQlkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotCQlzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI3VuaG9va0xpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5ob29rTGlzdGVuZXJzKCkgewotCQlzdXBlci51bmhvb2tMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldENlbGxFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQkJdmVyaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdHh0Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNjb21taXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbW1pdCgpIHsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRlKChTdHJpbmcpIGdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlicmluZ0Rvd24oZmFsc2UpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUHJvbXB0RWRpdCgoTmFtZWROb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksIG1zZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmNvbW1pdCgpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IAotCQkJU3RyaW5nIHByb2JsZW0gPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnOyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtc2cpOyAKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0NzdmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtLiBTdXBwb3J0IGNyZWF0aW9uIAotICogb2YgY2hpbGQgZWRpdHBhcnQgaW4gV29ya1BSb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JcHVibGljIFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3RvcnkjY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiBuZXcgRGlhZ3JhbUVkaXRQYXJ0KChEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfQotCQkvLyB0eXBlZCBub2RlIGNyZWF0aW9uCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJCXJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQkJcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJCXJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQkJcmV0dXJuIG5ldyBGcmVlVGV4dE5vZGVFZGl0UGFydChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MWViZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5XUENvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkIAotICogQHNlZSBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydAotICovCi1wdWJsaWMgY2xhc3MgV1BOb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlpbnQgdHlwZSA9IDE7Ci0KLQlwdWJsaWMgV1BOb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCWlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQl0eXBlID0gKChXb3JrUHJvZHVjdE5vZGUpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJfQotCQlMYWJlbCBsID0gbmV3IFNlbGVjdGFibGVMYWJlbCgpOwotCQlsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQlsLnNldFRleHRQbGFjZW1lbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQlsLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KG51bGwsICJBcmlhbCIsIDksIFNXVC5OT1JNQUwpOyAvLyROT04tTkxTLTEkCi0JCWwuc2V0Rm9udChmb250KTsKLQkJaWYgKHR5cGUgPT0gMSkKLQkJCWwuc2V0SWNvbihJbWFnZXMuQVJUSUZBQ1QpOwotCQllbHNlIGlmICh0eXBlID09IDIpCi0JCQlsLnNldEljb24oSW1hZ2VzLkRFTElWRVJBQkxFKTsKLQkJZWxzZSBpZiAodHlwZSA9PSAzKQotCQkJbC5zZXRJY29uKEltYWdlcy5PVVRDT01FKTsKLQkJZWxzZQotCQkJbC5zZXRJY29uKEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUik7Ci0JCWwuc2V0SWNvblRleHRHYXAoNSk7Ci0KLQkJV1BDb21wYXJ0bWVudEZpZ3VyZSB3cGZpZ3VyZSA9IG5ldyBXUENvbXBhcnRtZW50RmlndXJlKGwsIHR5cGUpOwotCQlyZXR1cm4gd3BmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlMYWJlbCBsID0gKExhYmVsKSAoKChXUENvbXBhcnRtZW50RmlndXJlKSBnZXRGaWd1cmUoKSkuZ2V0TGFiZWwoKSk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gKCgoV1BDb21wYXJ0bWVudEZpZ3VyZSkgZ2V0RmlndXJlKCkpLmdldExhYmVsKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTliZTc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQWN0aXZpdHlGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5UZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIENvbW1vbiBlZGl0cGFydCBmb3IgZGlmZmVyZW50IHtAbGluayBEZXNjcmlwdG9yfQotICogUHJvdmlkZXMgc3VwcG9ydCBmb3Igd29yZC13cmFwIG9mIGVkaXRwYXJ0J3Mgb2JqZWN0IG5hbWUuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJSW1hZ2UgaW1nID0gbnVsbDsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGdldE1vZGVsKCk7Ci0JCU9iamVjdCBvYmogPSBub2RlLmdldE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCWltZyA9IEltYWdlcy5QSEFTRTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCWltZyA9IEltYWdlcy5JVEVSQVRJT047Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWltZyA9IEltYWdlcy5BQ1RJVklUWTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJaW1nID0gSW1hZ2VzLlRBU0tfREVTQ1JJUFRPUjsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCWltZyA9IEltYWdlcy5NSUxFU1RPTkU7Ci0JCX0KLQkJcmV0dXJuIGltZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUFjdGl2aXR5RmlndXJlIGZpZ3VyZSA9IG5ldyBBY3Rpdml0eUZpZ3VyZSgpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlKCk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlmaWd1cmUuYWRkKGltYWdlKTsKLQkJfQotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCVN0cmluZyBnZXREaXJlY3RFZGl0VGV4dCgpIHsKLQkJVGV4dEZpZ3VyZSBub3RlID0gKFRleHRGaWd1cmUpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbm90ZS5nZXRUZXh0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgQWN0aXZpdHlGaWd1cmUpIHsKLQkJCUFjdGl2aXR5RmlndXJlIGwgPSAoQWN0aXZpdHlGaWd1cmUpIGZpZzsKLQkJCWZpZy5zZXRGb3JlZ3JvdW5kQ29sb3IoZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotCQkJU3RyaW5nIHRleHQ7Ci0JCQkvLyBCZWxvdyBjaGVjayBpcyByZXF1aXJlZCBmb3IgRXh0ZW5kZWQgQWN0aXZpdHkgcHJlc2VudGF0aW9uIG5hbWUKLQkJCS8vIHNob3VsZCBiZSB1c2VkIGZyb20gYmFzZS4KLQkJCWlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSBnZXRNb2RlbCgpOwotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCXRleHQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Ci0JCQkJCQl8fCBnZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCWludCB3ID0gV1JBUF9XSURUSDsKLQkJCQkJaWYgKHRoaXMuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpCi0JCQkJCQl3ID0gV09SS19QUk9EVUNUX1dSQVBfV0lEVEg7Ci0JCQkJCXRleHQgPSB3cmFwKHRleHQsIHcpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLQkJCX0KLQkJCWwuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29sb3IgZ2V0Rm9yZWdyb3VuZENvbG9yKCkgewotCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldE1vZGVsKCk7Ci0JCWlmIChub2RlLmlzU3VwcHJlc3NlZCgpKSB7Ci0JCQlyZXR1cm4gQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMOwotCQl9Ci0JCWlmIChub2RlLmlzUmVhZE9ubHkoKSkgewotCQkJcmV0dXJuIENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xvckNvbnN0YW50cy5ibGFjazsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyKChHcmFwaGljYWxFZGl0UGFydCkgdGhpcywKLQkJCQlUZXh0Q2VsbEVkaXRvci5jbGFzcywgbmV3IFRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvcigKLQkJCQkJCShUZXh0RmlndXJlKSBnZXRGaWd1cmUoKSksIChUZXh0RmlndXJlKSBnZXRGaWd1cmUoKSkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV0JTQWN0aXZpdHlQcmVzZW50YXRpb25OYW1lKGUsIHR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbAotCQkJCQkJCQkuY2hlY2tXb3JrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoZSwKLQkJCQkJCQkJCQl0eHQsIG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTFjNmZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ2hvcGJveEFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCBpcyBjb250YWluZXIgd2l0aCB7QGxpbmsgRmxvd0xheW91dH0sIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy9yZW1vdmluZyBjaGlsZCBlZGl0cGFydC4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlQ29udGFpbmVyRWRpdFBhcnQKLQkJaW1wbGVtZW50cyBOb2RlRWRpdFBhcnQgewotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCS8vCQkyNTUsIDIwNSk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29sb3IgQkdfQ09MT1I7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydChXb3JrUHJvZHVjdENvbXBvc2l0ZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGaWd1cmUgZmlndXJlID0gbmV3IEZpZ3VyZSgpOwotCQlGbG93TGF5b3V0IGxheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCWxheW91dC5zZXRNaW5vclNwYWNpbmcoMjApOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlmaWd1cmUuc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCWZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQlmaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZUNvbnRhaW5lci5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0JCQkKLQkJCWFkanVzdFNpemUoKTsKLQkJCQotCQkJLy8gcmVmcmVzaCBkaWFncmFtJ3MgY2hpbGRyZW4KLQkJCUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldFBhcmVudCgpOwotCQkJZGlhZ3JhbUVkaXRQYXJ0LnJlZnJlc2goKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCWludCB0SGVpZ2h0ID0gMjA7Ci0JCWludCB0V2lkdGggPSAyMDsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KWl0ZXJhdG9yLm5leHQoKTsKLQkJCXRIZWlnaHQrPWVkaXRwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQlpZih0V2lkdGggPCBlZGl0cGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGgpewotCQkJCXRXaWR0aCA9IGVkaXRwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCX0KLQkJfQotCQkoKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHRIZWlnaHQpOwotCQkoKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKSkuc2V0V2lkdGgodFdpZHRoKzIwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkgewotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IChDcmVhdGVMaW5rQ29tbWFuZCkgcmVxdWVzdAotCQkJCQkJCQkuZ2V0U3RhcnRDb21tYW5kKCk7Ci0JCQkJCQljbWQuc2V0VGFyZ2V0KChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0KLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkuZXF1YWxzKAotCQkJCQkJCQkJcmVxdWVzdC5nZXRTb3VyY2VFZGl0UGFydCgpKSkgewotCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY21kCi0JCQkJCQkJCQkJLnNldFRhcmdldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uQ3JlYXRlQ29tbWFuZCgKLQkJCQkJCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlDcmVhdGVMaW5rQ29tbWFuZCBjbWQgPSBuZXcgQ3JlYXRlTGlua0NvbW1hbmQoCi0JCQkJCQkJCU1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpLAotCQkJCQkJCQkoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kCi0JCQkJCQkJCQkuc2V0U291cmNlRW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKHJlcXVlc3QuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljbWQuc2V0U291cmNlRW5kUG9pbnQocmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJCXJlcXVlc3Quc2V0U3RhcnRDb21tYW5kKGNtZCk7Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0KLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldFJlY29ubmVjdFNvdXJjZUNvbW1hbmQoCi0JCQkJCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcmVxdWVzdC5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGNtZCA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJbGluaywgKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpLCB0cnVlKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQuc2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJLmdldFRhcmdldCgpKS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0VGFyZ2V0Q29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIGZhbHNlKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQuc2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJLmdldFRhcmdldCgpKS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCQkJCX0pOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBudWxsKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsVGFyZ2V0Q29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiAoTm9kZSkgZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpewotCQlpZihCR19DT0xPUiAhPSBudWxsKSByZXR1cm4gQkdfQ09MT1I7Ci0JCQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCVN0cmluZyBjb2xvclN0cmluZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkFERF9XUF9CT1hfQkdfQ09MT1JfUkdCKTsKLQkJCWlmKGNvbG9yU3RyaW5nICE9IG51bGwgJiYgY29sb3JTdHJpbmcubGVuZ3RoKCkgPiAwKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2xvclN0cmluZywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWludCByID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCWludCBnID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCWludCBiID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCUJHX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIHIsZyxiKTsKLQkJCQlyZXR1cm4gQkdfQ09MT1I7Ci0JCQl9Ci0JCX0KLQkJaWYoQkdfQ09MT1IgPT0gbnVsbCl7Ci0JCQlCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCQkJCQkJCTI1NSwgMjA1KTsKLQkJfQotCQlyZXR1cm4gQkdfQ09MT1I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc4MTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3Ige0BsaW5rIFdvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgTmFtZWROb2RlRWRpdFBhcnQgewotCi0JcHVibGljIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2dldEltYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJV29ya1Byb2R1Y3ROb2RlIG5vZGUgPSAoV29ya1Byb2R1Y3ROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlLkFSVElGQUNUOgotCQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCQljYXNlIFdvcmtQcm9kdWN0Tm9kZS5ERUxJVkVSQUJMRToKLQkJCQlyZXR1cm4gSW1hZ2VzLkRFTElWRVJBQkxFOwotCQkJY2FzZSBXb3JrUHJvZHVjdE5vZGUuT1VUQ09NRToKLQkJCQlyZXR1cm4gSW1hZ2VzLk9VVENPTUU7Ci0JCQl9Ci0JCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCUxhYmVsIGwgPSAoTGFiZWwpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbmV3IFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IobCksIGwpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCWUsIHR4dCwgc3VwcHJlc3Npb24pOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMWZmMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaXNwbGF5IGFuZCBlZGl0aW5nIHN1cHBvcnQgZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0RpYWdyYW1MYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0RpYWdyYW1MYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDlkYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9EaWFncmFtTGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUhlaWdodENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuTW92ZUJlbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29uc3RyYWluZWRMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBBbiBFZGl0UG9saWN5IGZvciB1c2Ugd2l0aCA8Y29kZT5GaWd1cmVzPC9jb2RlPiBpbiB7QGxpbmsgWFlMYXlvdXR9IG9mIGRpYWdyYW0uIFRoZSBjb25zdHJhaW50IGZvcgotICogWFlMYXlvdXQgaXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZX0uIEltcGxlbWVudHMgdGhlIGNoYW5nZWNvbnN0cmFpbnQsIGRlbGV0ZSwKLSAqIHJlc2l6ZSBjb21tYW5kcyBvZiB7QGxpbmsgQ29uc3RyYWluZWRMYXlvdXRFZGl0UG9saWN5fQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsCi0JCQlPYmplY3QgY29uc3RyYWludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZCgKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwgRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KSB7Ci0JCQotCQkvLyBzcGVjaWFsIGZvciBBREQKLQkJRWRpdFBhcnQgcGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50KCk7Ci0JCWlmKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KXsKLQkJCVN0cmluZyBhdXRvbGF5b3V0ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRBdXRvTGF5b3V0RmxhZygoQWN0aXZpdHlEZXRhaWxEaWFncmFtKShOb2RlKXBhcmVudC5nZXRNb2RlbCgpKTsKLQkJCWlmKGF1dG9sYXlvdXQgIT0gbnVsbCl7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eSgoKE5vZGUpcGFyZW50LmdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpLAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQsIAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfRkFMU0UpOwotCQkJfQotCQl9Ci0JCQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgY2hpbGQuZ2V0TW9kZWwoKTsKLQkJaW50IGRpcmVjdGlvbnMgPSByZXF1ZXN0LmdldFJlc2l6ZURpcmVjdGlvbigpOwotCQkKLQkJaWYgKChkaXJlY3Rpb25zICYgUG9zaXRpb25Db25zdGFudHMuTk9SVEhfU09VVEgpIAotCQkJCT09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKXsKLQkJCVBvaW50IG5ld0xvY2F0aW9uID0gbm9kZS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCXJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQkJaW50IG5ld0hlaWdodCA9IHJlcXVlc3QuZ2V0U2l6ZURlbHRhKCkuaGVpZ2h0OwotCQkJaWYgKG5ld0hlaWdodCAhPSAwKSB7Ci0JCQkJbmV3SGVpZ2h0ICs9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCQkJaWYgKG5ld0hlaWdodCA8IDEwKQotCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0gZWxzZQotCQkJCW5ld0hlaWdodCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCQlyZXR1cm4gbmV3IENoYW5nZUhlaWdodENvbW1hbmQobm9kZSwgbmV3TG9jYXRpb24sIG5ld0hlaWdodCk7Ci0JCX0KLQkJZWxzZXsKLQkJCS8vIE90aGVyIGRpcmVjdGlvbnMgYXJlIEVBU1QgV0VTVC4gCi0JCQlQb2ludCBuZXdMb2NhdGlvbiA9IG5vZGUuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQlyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJCWludCBuZXdXaWR0aCA9IHJlcXVlc3QuZ2V0U2l6ZURlbHRhKCkud2lkdGg7Ci0JCQlpZiAobmV3V2lkdGggIT0gMCkgewotCQkJCW5ld1dpZHRoICs9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQlpZiAobmV3V2lkdGggPCAxMCkKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9IGVsc2UKLQkJCQluZXdXaWR0aCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCXJldHVybiBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZChub2RlLCBuZXdMb2NhdGlvbiwgbmV3V2lkdGgpOwotCQl9IAotCX0KLQotCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQlSZXNpemFibGVFZGl0UG9saWN5IGNoaWxkUG9saWN5ID0gbmV3IFJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IHx8Ci0JCQkJY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KXsKLQkJCWNoaWxkUG9saWN5LnNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuTlNFVyk7Ci0JCX1lbHNlewotCQkJY2hpbGRQb2xpY3kuc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5FQVNUX1dFU1QpOwotCQl9Ci0JCXJldHVybiBjaGlsZFBvbGljeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCVBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJCWdldEhvc3RGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCQlyZXR1cm4gbmV3IENyZWF0ZU5vZGVDb21tYW5kKChOb2RlKSByZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkJCQkoRGlhZ3JhbSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIGxvYyk7Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlRGVwZW5kYW50Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVzaXplQ2hpbGRyZW5Db21tYW5kKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgewotCQlDb21wb3VuZENvbW1hbmQgcmVzaXplID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQlDb21tYW5kIGM7Ci0JCUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkOwotCQlMaXN0IGNoaWxkcmVuID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQljaGlsZCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJYyA9IGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKAotCQkJCQlyZXF1ZXN0LAotCQkJCQljaGlsZCwKLQkJCQkJdHJhbnNsYXRlVG9Nb2RlbENvbnN0cmFpbnQoZ2V0Q29uc3RyYWludEZvcihyZXF1ZXN0LCBjaGlsZCkpKTsKLQkJCXJlc2l6ZS5hZGQoYyk7Ci0JCQlpZiAoIWNoaWxkLmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCBsaXN0ID0gY2hpbGQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJCUVkaXRQYXJ0IHJvb3RlZGl0ID0gY2hpbGQuZ2V0UGFyZW50KCk7Ci0JCQkJCQlMaXN0IHNlbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWlmIChyb290ZWRpdCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkgewotCQkJCQkJCXNlbCA9ICgoRGlhZ3JhbUVkaXRQYXJ0KSByb290ZWRpdCkuZ2V0Vmlld2VyKCkKLQkJCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCQkJfQotCQkJCQkJRWRpdFBhcnQgcGFydCA9ICgoTGlua0VkaXRQYXJ0KSBvYmopLmdldFRhcmdldCgpOwotCQkJCQkJaWYgKHNlbC5jb250YWlucyhwYXJ0KSkgewotCQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSAoKExpbmtFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJCQkJCSgoRGlhZ3JhbUVkaXRQYXJ0KSByb290ZWRpdCkuZ2V0Vmlld2VyKCkKLQkJCQkJCQkJCS5hcHBlbmRTZWxlY3Rpb24oKExpbmtFZGl0UGFydCkgb2JqKTsKLQkJCQkJCQlMaXN0IGJsaXN0ID0gbGluay5nZXRCZW5kcG9pbnRzKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBibGlzdC5zaXplKCk7IGorKykgewotCQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBhYnBvaW50ID0gKEFic29sdXRlQmVuZHBvaW50KSBibGlzdAotCQkJCQkJCQkJCS5nZXQoaik7Ci0JCQkJCQkJCVBvaW50IGRlbHRhUG9pbnQgPSByZXF1ZXN0LmdldE1vdmVEZWx0YSgpOwotCQkJCQkJCQkoKExpbmtFZGl0UGFydCkgb2JqKS5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCS50cmFuc2xhdGVUb0Fic29sdXRlKGRlbHRhUG9pbnQpOwotCQkJCQkJCQlQb2ludCBwID0gYWJwb2ludC5nZXRUcmFuc2xhdGVkKHJlcXVlc3QKLQkJCQkJCQkJCQkuZ2V0TW92ZURlbHRhKCkpOwotCQkJCQkJCQlDb21tYW5kIGJlbmRjb21tYW5kID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJCWxpbmssIHAsIGopOwotCQkJCQkJCQlyZXNpemUuYWRkKGJlbmRjb21tYW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc2l6ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xhYmVsU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MYWJlbFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2OTNjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xhYmVsU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLS8qKgotICogSGFuZGxlcyBzZWxlY3Rpb24gb2YgYWN0aXZpdGVzLiBQcmltYXJ5IHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodCBhbmQKLSAqIGEgZm9jdXMgcmVjdGFuZ2xlLiBOb3JtYWwgc2VsZWN0aW9uIGlzIGRlbm90ZWQgYnkgaGlnaGxpZ2h0IG9ubHkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYWJlbFNlbGVjdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBOb25SZXNpemFibGVFZGl0UG9saWN5IHsKLQotCXByaXZhdGUgU2VsZWN0YWJsZUxhYmVsIGdldExhYmVsKCkgewotCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JCXJldHVybiAoKFNlbGVjdGFibGVMYWJlbCkgcGFydC5nZXRGaWd1cmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3kjaGlkZUZvY3VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSNoaWRlU2VsZWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlnZXRMYWJlbCgpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJZ2V0TGFiZWwoKS5zZXRGb2N1cyhmYWxzZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeSNzaG93Rm9jdXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJZ2V0TGFiZWwoKS5zZXRGb2N1cyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kjc2hvd1NlbGVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWdldExhYmVsKCkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5I3Nob3dTZWxlY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWdldExhYmVsKCkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXMoZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rQmVuZHBvaW50RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rQmVuZHBvaW50RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRiZjg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0JlbmRwb2ludEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EZWxldGVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLk1vdmVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5CZW5kcG9pbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5CZW5kcG9pbnRSZXF1ZXN0OwotCi0vKioKLSAqIEEgRWRpdFBvbGljeSB0byBoYW5kbGUgdGhlIGNyZWF0ZSwgbW92ZSBhbmQgZGVsZXRlIGJlbmRwb2ludHMgYWN0aXZpdGllcyBvZiBMaW5rLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlua0JlbmRwb2ludEVkaXRQb2xpY3kgZXh0ZW5kcyBCZW5kcG9pbnRFZGl0UG9saWN5IHsKLQotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUJlbmRwb2ludENvbW1hbmQoQmVuZHBvaW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJZ2V0Q29ubmVjdGlvbigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJcmV0dXJuIG5ldyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kKAotCQkJCShMaW5rKSByZXF1ZXN0LmdldFNvdXJjZSgpLmdldE1vZGVsKCksIGxvYywgcmVxdWVzdC5nZXRJbmRleCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVCZW5kcG9pbnRDb21tYW5kKEJlbmRwb2ludFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZUJlbmRwb2ludENvbW1hbmQoKExpbmspIGdldEhvc3QoKS5nZXRNb2RlbCgpLCByZXF1ZXN0Ci0JCQkJLmdldEluZGV4KCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVCZW5kcG9pbnRDb21tYW5kKEJlbmRwb2ludFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCWdldENvbm5lY3Rpb24oKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCXJldHVybiBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoKExpbmspIHJlcXVlc3QuZ2V0U291cmNlKCkuZ2V0TW9kZWwoKSwKLQkJCQlsb2MsIHJlcXVlc3QuZ2V0SW5kZXgoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rRW5kcG9pbnRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtFbmRwb2ludEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwNWFkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtFbmRwb2ludEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29ubmVjdGlvbkVuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLQotLyoqCi0gKiBBIEVkaXRQb2xpY3kgdG8gaGFuZGxlIHRoZSBzZWxlY3Rpb24gaGFuZGxlcyBmb3IgY29ubmVjdGlvbi4gCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VuZHBvaW50RWRpdFBvbGljeSBleHRlbmRzIENvbm5lY3Rpb25FbmRwb2ludEVkaXRQb2xpY3kgewotCi0JcHJpdmF0ZSBzdGF0aWMgRm9udCBCT0xEX0ZPTlQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlzdXBlci5hZGRTZWxlY3Rpb25IYW5kbGVzKCk7Ci0JCWdldENvbm5lY3Rpb25GaWd1cmUoKS5zZXRMaW5lV2lkdGgoMik7Ci0JfQotCi0JcHJvdGVjdGVkIFBvbHlsaW5lQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uRmlndXJlKCkgewotCQlyZXR1cm4gKFBvbHlsaW5lQ29ubmVjdGlvbikgZ2V0SG9zdEZpZ3VyZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCXN1cGVyLmhpZGVTZWxlY3Rpb24oKTsKLQkJZ2V0SG9zdEZpZ3VyZSgpLnNldEZvbnQobnVsbCk7Ci0JCWdldEhvc3RGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCXN1cGVyLnJlbW92ZVNlbGVjdGlvbkhhbmRsZXMoKTsKLQkJZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldExpbmVXaWR0aCgwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlzdXBlci5zaG93U2VsZWN0aW9uKCk7Ci0JCWlmIChCT0xEX0ZPTlQgPT0gbnVsbCkgewotCQkJRm9udERhdGFbXSBkYXRhID0gZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLmdldEZvbnQoKS5nZXRGb250RGF0YSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKQotCQkJCWlmICgoZGF0YVtpXS5nZXRTdHlsZSgpICYgU1dULkJPTEQpID09IDApCi0JCQkJCWRhdGFbaV0uc2V0U3R5bGUoZGF0YVtpXS5nZXRTdHlsZSgpIHwgU1dULkJPTEQpOwotCQkJQk9MRF9GT05UID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLnNldEZvbnQoQk9MRF9GT05UKTsKLQkJZ2V0SG9zdEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWYwNWY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTm9kZUNvbnRhaW5lckVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbnRhaW5lckVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IGZvciB7QGxpbmsgTm9kZUNvbnRhaW5lckVkaXRQYXJ0fSBmb3IgZGlzYWJsaW5nIGRpcmVjdCBjaGlsZCBjcmVhdGlvbi4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlQ29udGFpbmVyRWRpdFBvbGljeSBleHRlbmRzIENvbnRhaW5lckVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbnRhaW5lckVkaXRQb2xpY3kjZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjQ4MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5GbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBBIEVkaXRQb2xpY3kgZm9yIHtAbGluayBOb2RlQ29udGFpbmVyRWRpdFBhcnR9IHRvIGRpc2FibGUgdGhlIGFsbCBlZGl0aW5nIGZlYXR1cmVzLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIEZsb3dMYXlvdXRFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5PcmRlcmVkTGF5b3V0RWRpdFBvbGljeSNjcmVhdGVBZGRDb21tYW5kKEVkaXRQYXJ0LAotCSAqICAgICAgRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZU1vdmVDaGlsZENvbW1hbmQoRWRpdFBhcnQsCi0JICogICAgICBFZGl0UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ2hpbGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBFZGl0UGFydCBhZnRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSNnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kjZ2V0RGVsZXRlRGVwZW5kYW50Q29tbWFuZChSZXF1ZXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlbGV0ZURlcGVuZGFudENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL1JvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmZTg3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL1JvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkZsb3dMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi0vKioKLSAqIEVkaXRQb2xpY3kgdG8gZGlzYWJsZSB0aGUgZWRpdGluZyBmZWF0dXJlIGluIGEge0BsaW5rIEZsb3dMYXlvdXR9Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgRmxvd0xheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3koKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuT3JkZXJlZExheW91dEVkaXRQb2xpY3kjY3JlYXRlQWRkQ29tbWFuZChvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQsIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBFZGl0UGFydCBhZnRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuT3JkZXJlZExheW91dEVkaXRQb2xpY3kjY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQsIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ2hpbGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBFZGl0UGFydCBhZnRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSNnZXRDcmVhdGVDb21tYW5kKG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Q4NTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZ3JhcGhpY2FsIGVkaXQgcG9saWNpZXMgZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0FjdGl2aXR5RmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0FjdGl2aXR5RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTRmN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9BY3Rpdml0eUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotLyoqCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmlndXJlIGV4dGVuZHMgVGV4dEZpZ3VyZSB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlGaWd1cmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9DZW50cmVkTGFiZWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ2VudHJlZExhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDlmODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9DZW50cmVkTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDZW50cmVkTGFiZWwgZXh0ZW5kcyBMYWJlbCB7Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDZW50cmVkTGFiZWwoU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JcHVibGljIENlbnRyZWRMYWJlbChJbWFnZSBpKSB7Ci0JCXN1cGVyKGkpOwotCX0KLQotCXB1YmxpYyBDZW50cmVkTGFiZWwoU3RyaW5nIHMsIEltYWdlIGkpIHsKLQkJc3VwZXIocywgaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI3BhaW50RmlndXJlKEdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCWlmIChpc09wYXF1ZSgpKQotCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy55ZWxsb3cpOwotCQlncmFwaGljcy50cmFuc2xhdGUoYm91bmRzLngsIGJvdW5kcy55KTsKLQkJaWYgKCFpc0VuYWJsZWQoKSkgewotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKDEsIDEpOwotCQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uTGlnaHRlc3QpOwotCQkJZ3JhcGhpY3MuZHJhd1RleHQoZ2V0U3ViU3RyaW5nVGV4dCgpLCBnZXRUZXh0TG9jYXRpb24oKSk7Ci0JCQlncmFwaGljcy50cmFuc2xhdGUoLTEsIC0xKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQl9Ci0JCWdyYXBoaWNzLmRyYXdUZXh0KGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0VGV4dExvY2F0aW9uKCkpOwotCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJZ3JhcGhpY3MudHJhbnNsYXRlKC1ib3VuZHMueCwgLWJvdW5kcy55KTsKLQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db2xvcnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29sb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2UwMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db2xvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIFRoZSBjb2xvciBjb25zdGFudHMgcmVmZXJlbmNlZCBieSB0aGUgZGlhZ3JhbSBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sb3JzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUwgPSBDb2xvckNvbnN0YW50cy5kYXJrR3JlZW47Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMID0gQ29sb3JDb25zdGFudHMuZ3JheTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db21wb3NpdGVGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29tcG9zaXRlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMmZjY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db21wb3NpdGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5SYWlzZWRNYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCTI1NSwgMjA1KTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9XSURUSCA9IDUwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNQQUNJTkcgPSAxMDsKLQotCXByaXZhdGUgaW50IG1heFdpZHRoID0gREVGQVVMVF9NQVhfV0lEVEg7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlRmlndXJlKCkgewotCQlUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0JCWxheW91dC5zZXRNaW5vckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCWxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLQkJbGF5b3V0LnNldFNwYWNpbmcoU1BBQ0lORyk7Ci0JCWxheW91dC5zZXRPYnNlcnZlVmlzaWJpbGl0eSh0cnVlKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlzZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJc2V0QmFja2dyb3VuZENvbG9yKEJHX0NPTE9SKTsKLQkJc2V0T3BhcXVlKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1heFdpZHRoKGludCB3KSB7Ci0JCW1heFdpZHRoID0gdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjZ2V0UHJlZmVycmVkU2l6ZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsKLQkJaWYgKHdIaW50ID4gbWF4V2lkdGgpIHsKLQkJCXdIaW50ID0gbWF4V2lkdGg7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRGlhbW9uZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9EaWFtb25kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZmU0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9EaWFtb25kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogQSBmaWd1cmUgZm9yIGRpYW1vbmQgc2hhcGUuICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFtb25kIGV4dGVuZHMgU2hhcGUgewotCi0JcHJpdmF0ZSBQb2ludExpc3QgZGlhbW9uZCA9IG5ldyBQb2ludExpc3QoNCk7Ci0KLQkvKioKLQkgKiBAc2VlIFNoYXBlI2ZpbGxTaGFwZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZykgewotCQlnLmZpbGxQb2x5Z29uKGRpYW1vbmQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2hhcGUjb3V0bGluZVNoYXBlKEdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBnKSB7Ci0JCWcuZHJhd1BvbHlnb24oZGlhbW9uZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI3ZhbGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXIuY3JvcChnZXRJbnNldHMoKSk7Ci0JCXIucmVzaXplKC0xLCAtMSk7Ci0JCWRpYW1vbmQucmVtb3ZlQWxsUG9pbnRzKCk7Ci0JCWRpYW1vbmQuYWRkUG9pbnQoci5nZXRUb3AoKSk7Ci0JCWRpYW1vbmQuYWRkUG9pbnQoci5nZXRSaWdodCgpKTsKLQkJZGlhbW9uZC5hZGRQb2ludChyLmdldEJvdHRvbSgpKTsKLQkJZGlhbW9uZC5hZGRQb2ludChyLmdldExlZnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmUjcHJpbVRyYW5zbGF0ZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVHJhbnNsYXRlKGludCB4LCBpbnQgeSkgewotCQlzdXBlci5wcmltVHJhbnNsYXRlKHgsIHkpOwotCQlkaWFtb25kLnRyYW5zbGF0ZSh4LCB5KTsKLQl9Ci0KLQlwdWJsaWMgUG9pbnRMaXN0IGdldFBvaW50cygpIHsKLQkJcmV0dXJuIGRpYW1vbmQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzAxYTA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLQotLyoqCi0gKiBGaWd1cmUgZm9yIHtAbGluayBUeXBlZE5vZGV9IGVuZC4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmROb2RlRmlndXJlIGV4dGVuZHMgRWxsaXBzZSB7Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZSNmaWxsU2hhcGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBncmFwaGljcykgewotCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJci5zaHJpbmsoci53aWR0aCAvIDgsIHIuaGVpZ2h0IC8gOCk7Ci0JCWdyYXBoaWNzLmZpbGxPdmFsKHIpOwotCX0KLQotCS8qKgotCSAqIE91dGxpbmVzIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlI291dGxpbmVTaGFwZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3V0bGluZVNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCXN1cGVyLm91dGxpbmVTaGFwZShncmFwaGljcyk7Ci0KLQkJUmVjdGFuZ2xlIHIgPSBSZWN0YW5nbGUuU0lOR0xFVE9OOwotCQlyLnNldEJvdW5kcyhnZXRCb3VuZHMoKSk7Ci0JCXIuc2hyaW5rKGdldEJvdW5kcygpLndpZHRoIC8gOCwgZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gOCk7Ci0JCXIud2lkdGgtLTsKLQkJci5oZWlnaHQtLTsKLQkJci5zaHJpbmsoKGxpbmVXaWR0aCAtIDEpIC8gMiwgKGxpbmVXaWR0aCAtIDEpIC8gMik7Ci0JCWdyYXBoaWNzLmRyYXdPdmFsKHIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9GcmVlVGV4dEZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9GcmVlVGV4dEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQ4ZTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRnJlZVRleHRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVsYXRpdmVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5GbG93UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5QYXJhZ3JhcGhUZXh0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlRleHRGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotLyoqCi0gKiBGaWd1cmUgdG8gc3VwcG9ydCBmcmVlIHRleHQgaW4gdGhlIGRpYWdyYW0sIHdpdGhvdXQgYW4gaW1hZ2UgYXR0YWNoZWQgdG8gaXQuCi0gKiBGcmVlVGV4dEZpZ3VyZSB3cmFwcGVyIG92ZXIge0BsaW5rIEZsb3dQYWdlfSBhbmQge0BsaW5rIFRleHRGbG93fS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBrYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEZyZWVUZXh0RmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXByaXZhdGUgRmxvd1BhZ2UgdGV4dEZsb3dQYWdlOwotCi0JcHJpdmF0ZSBUZXh0RmxvdyB0ZXh0RmxvdzsKLQotCXB1YmxpYyBGcmVlVGV4dEZpZ3VyZSgpIHsKLQkJdGV4dEZsb3dQYWdlID0gbmV3IEZsb3dQYWdlKCk7Ci0JCXRleHRGbG93UGFnZS5zZXRIb3Jpem9udGFsQWxpZ21lbnQoUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCWFkZCh0ZXh0Rmxvd1BhZ2UsIG5ldyBSZWxhdGl2ZUxvY2F0b3IodGV4dEZsb3dQYWdlLAotCQkJCVBvc2l0aW9uQ29uc3RhbnRzLkFMV0FZU19MRUZUKSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHRGbG93LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCXRleHRGbG93UGFnZS5yZW1vdmVBbGwoKTsKLQkJdGV4dEZsb3cgPSBuZXcgVGV4dEZsb3coKTsKLQkJdGV4dEZsb3cuc2V0Rm9udChUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQl0ZXh0Rmxvdy5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBQYXJhZ3JhcGhUZXh0TGF5b3V0KHRleHRGbG93LAotCQkJCVBhcmFncmFwaFRleHRMYXlvdXQuV09SRF9XUkFQX1RSVU5DQVRFKSk7Ci0JCXRleHRGbG93LnNldFRleHQobmV3VGV4dCk7Ci0JCXRleHRGbG93UGFnZS5hZGQodGV4dEZsb3cpOwotCX0KLQotCXB1YmxpYyBGbG93UGFnZSBnZXRUZXh0Rmxvd1BhZ2UoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvd1BhZ2U7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2V0Rm9udChmKTsKLQkJdGV4dEZsb3cuc2V0Rm9udChmKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGZnKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2V0Rm9yZWdyb3VuZENvbG9yKGZnKTsKLQkJdGV4dEZsb3cuc2V0Rm9yZWdyb3VuZENvbG9yKGZnKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEZsb3cgZ2V0VGV4dEZsb3coKSB7Ci0JCXJldHVybiB0ZXh0RmxvdzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ltYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0ZTAxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEltYWdlIGxvY2F0aW9uIGNvbnN0YW50cyByZWZlcmVuY2VkIGluIGRpYWdyYW0uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW1hZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQUNUSVZJVFkgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvYWN0aXZpdHkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSVRFUkFUSU9OID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL2l0ZXJhdGlvbi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBQSEFTRSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgKLQkJCSJzaGFwZS9waGFzZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBNSUxFU1RPTkUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvbWlsZXN0b25lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFJPTEUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkic2hhcGUvcm9sZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBUQVNLID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKAotCQkJInNoYXBlL3Rhc2suZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgVEFTS19ERVNDUklQVE9SID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNoYXBlL3dvcmtwcm9kdWN0ZGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBUlRJRkFDVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9hcnRpZmFjdC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBERUxJVkVSQUJMRSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9kZWxpdmVyYWJsZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBPVVRDT01FID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL291dGNvbWUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgV09SS19QUk9EVUNUID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoIldvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBUQVNLX0RFU0NSSVBUT1JfMTYgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2hhcGUvdGFza2Rlc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgUk9MRV9ERVNDUklQVE9SXzE2ID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNoYXBlL3JvbGVkZXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2ID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNoYXBlL3dvcmtkZXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvTm90ZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Ob3RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YWIxZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Ob3RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgSmFtZXMgVGhhcmlvCi0gKiBAc2luY2UgIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5vdGVGaWd1cmUKLSAgICAgICAgZXh0ZW5kcyBUZXh0RmlndXJlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09STkVSX1NJWkUgPSA0OwotCi0gICAgcHVibGljIE5vdGVGaWd1cmUoKSB7Ci0gICAgICAgIHNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy50b29sdGlwQmFja2dyb3VuZCk7Ci0gICAgICAgIHNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0KLSAgICAgICAgc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoQ09STkVSX1NJWkUpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLQotICAgICAgICBncmFwaGljcy50cmFuc2xhdGUoZ2V0TG9jYXRpb24oKSk7Ci0KLSAgICAgICAgLy8gZmlsbCB0aGUgbm90ZQotICAgICAgICBQb2ludExpc3Qgb3V0bGluZSA9IG5ldyBQb2ludExpc3QoKTsKLQotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KDAsIDApOwotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSwgMCk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIENPUk5FUl9TSVpFKTsKLSAgICAgICAgb3V0bGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gMSwgcmVjdC5oZWlnaHQgLSAxKTsKLSAgICAgICAgb3V0bGluZS5hZGRQb2ludCgwLCByZWN0LmhlaWdodCAtIDEpOwotCi0gICAgICAgIGdyYXBoaWNzLmZpbGxQb2x5Z29uKG91dGxpbmUpOwotCi0gICAgICAgIC8vIGRyYXcgdGhlIGlubmVyIG91dGxpbmUKLSAgICAgICAgUG9pbnRMaXN0IGlubmVyTGluZSA9IG5ldyBQb2ludExpc3QoKTsKLQotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIENPUk5FUl9TSVpFIC0gMSwgMCk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gQ09STkVSX1NJWkUgLSAxLCBDT1JORVJfU0laRSk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gMSwgQ09STkVSX1NJWkUpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIENPUk5FUl9TSVpFIC0gMSwgMCk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludCgwLCAwKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KDAsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gMSwgcmVjdC5oZWlnaHQgLSAxKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCBDT1JORVJfU0laRSk7Ci0KLSAgICAgICAgZ3JhcGhpY3MuZHJhd1BvbHlnb24oaW5uZXJMaW5lKTsKLQotICAgICAgICBncmFwaGljcy50cmFuc2xhdGUoZ2V0TG9jYXRpb24oKS5nZXROZWdhdGVkKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljOGE1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1JvbGVUYXNrQ29tcG9zaXRlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEZpZ3VyZSBmb3Ige0BsaW5rIFJvbGVUYXNrQ29tcG9zaXRlfS4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCQkJMjU1LCAxNTYpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XSURUSCA9IDUwMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5PUl9TUEFDSU5HID0gMjA7Ci0KLQlwcml2YXRlIEZpZ3VyZSB0YXNrc0ZpZ3VyZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSgpIHsKLQkJRmxvd0xheW91dCBsYXlvdXQgPSBuZXcgRmxvd0xheW91dCh0cnVlKTsKLQkJbGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KEZsb3dMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLQkJbGF5b3V0LnNldE1ham9yQWxpZ25tZW50KEZsb3dMYXlvdXQuQUxJR05fTEVGVFRPUCk7Ci0JCWxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLQkJbGF5b3V0LnNldE1pbm9yU3BhY2luZyhNSU5PUl9TUEFDSU5HKTsKLQkJbGF5b3V0LnNldE9ic2VydmVWaXNpYmlsaXR5KHRydWUpOwotCi0JCXNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCXNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCXNldE9wYXF1ZSh0cnVlKTsKLQotCQl0YXNrc0ZpZ3VyZSA9IG5ldyBGaWd1cmUoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNnZXRQcmVmZXJyZWRTaXplKGludCwgaW50KQotCQkJICovCi0JCQlwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsKLQkJCQlJRmlndXJlIGZpcnN0Q2hpbGQgPSAoSUZpZ3VyZSkgZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0JCQkJaWYgKGZpcnN0Q2hpbGQgIT0gdGhpcykgewotCQkJCQlpbnQgb2Zmc2V0ID0gZmlyc3RDaGlsZC5nZXRTaXplKCkud2lkdGg7IC8vIGZpcnN0Q2hpbGQuZ2V0U2l6ZSgpLndpZHRoCi0JCQkJCS8vICsKLQkJCQkJLy8gUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUudGhpcy5nZXRJbnNldHMoKS5nZXRXaWR0aCgpCi0JCQkJCS8vICsKLQkJCQkJLy8gTUlOT1JfU1BBQ0lORzsKLQkJCQkJaWYgKHdIaW50IDwgb2Zmc2V0KSB7Ci0KLQkJCQkJfQotCQkJCQl3SGludCA9IHdIaW50IC0gb2Zmc2V0OwotCQkJCQlpZiAod0hpbnQgPiBNQVhfV0lEVEgpIHsKLQkJCQkJCXdIaW50ID0gTUFYX1dJRFRIOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpbWVuc2lvbiBkaW0gPSBzdXBlci5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ci0JCQkJcmV0dXJuIGRpbTsKLQkJCX0KLQkJfTsKLQkJRmxvd0xheW91dCBmbG93TGF5b3V0ID0gbmV3IEZsb3dMYXlvdXQoKTsKLQkJZmxvd0xheW91dC5zZXRNaW5vclNwYWNpbmcoMTApOwotCQlmbG93TGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KEZsb3dMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLQkJdGFza3NGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihmbG93TGF5b3V0KTsKLQkJdGFza3NGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQlzdXBlci5hZGQodGFza3NGaWd1cmUsIG51bGwsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjYWRkKElGaWd1cmUsIE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChJRmlndXJlIGZpZ3VyZSwgT2JqZWN0IGNvbnN0cmFpbnQsIGludCBpbmRleCkgewotCQlpZiAoZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMSkgewotCQkJc3VwZXIuYWRkKGZpZ3VyZSwgY29uc3RyYWludCwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQl0YXNrc0ZpZ3VyZS5hZGQoZmlndXJlLCBjb25zdHJhaW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0Zsb3dMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tGbG93TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZDc4NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0Zsb3dMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrRmxvd0xheW91dCBleHRlbmRzIEZsb3dMYXlvdXQgewotCi0JYm9vbGVhbiBhZGp1c3QgPSBmYWxzZTsKLQlXb3JraW5nRGF0YSBkYXRhOwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0Zsb3dMYXlvdXQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpc0hvcml6b250YWwKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tGbG93TGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsKSB7Ci0JCXN1cGVyKGlzSG9yaXpvbnRhbCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQlwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBwYXJlbnQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZihhZGp1c3QpewotCQkJYWRqdXN0TGF5b3V0KHBhcmVudCk7Ci0JCX1lbHNlCi0JCQlzdXBlci5sYXlvdXQocGFyZW50KTsKLQl9Ci0JY2xhc3MgV29ya2luZ0RhdGEgewotCQlpbnQgcm93SGVpZ2h0LCByb3dXaWR0aCwgcm93Q291bnQsIHJvd1gsIHJvd1ksIG1heFdpZHRoOwotCQlSZWN0YW5nbGUgYm91bmRzW10sIGFyZWE7Ci0JCUlGaWd1cmUgcm93W107Ci0JfQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBzdGF0ZSBvZiByb3cgZGF0YSwgd2hpY2ggaXMgaW50ZXJuYWwgdG8gdGhlIGxheW91dCBwcm9jZXNzLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdFJvdygpIHsKLQkJZGF0YS5yb3dYID0gMDsKLQkJZGF0YS5yb3dIZWlnaHQgPSAwOwotCQlkYXRhLnJvd1dpZHRoID0gMDsKLQkJZGF0YS5yb3dDb3VudCA9IDA7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGUgZGF0YSBmb3IgbGF5aW5nIG91dCBjaGlsZHJlbiwgYmFzZWQgb24gdGhlIEZpZ3VyZSBnaXZlbiBhcyBpbnB1dC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBmaWd1cmUKLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0VmFyaWFibGVzKElGaWd1cmUgcGFyZW50KSB7Ci0JCWRhdGEucm93ID0gbmV3IElGaWd1cmVbcGFyZW50LmdldENoaWxkcmVuKCkuc2l6ZSgpXTsKLQkJZGF0YS5ib3VuZHMgPSBuZXcgUmVjdGFuZ2xlW2RhdGEucm93Lmxlbmd0aF07Ci0JCWRhdGEubWF4V2lkdGggPSBkYXRhLmFyZWEud2lkdGg7Ci0JfQotCXByaXZhdGUgdm9pZCBhZGp1c3RMYXlvdXQoSUZpZ3VyZSBwYXJlbnQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlkYXRhID0gbmV3IFdvcmtpbmdEYXRhKCk7Ci0JCVJlY3RhbmdsZSByZWxhdGl2ZUFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQlkYXRhLmFyZWEgPSB0cmFuc3Bvc2VyLnQocmVsYXRpdmVBcmVhKTsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCWludCBkeDsKLQotCQkvL0NhbGN1bGF0ZSB0aGUgaGludHMgdG8gYmUgcGFzc2VkIHRvIGNoaWxkcmVuCi0JCWludCB3SGludCA9IC0xOwotCQlpbnQgaEhpbnQgPSAtMTsKLQkJaWYgKGlzSG9yaXpvbnRhbCgpKQotCQkJd0hpbnQgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQllbHNlCi0JCQloSGludCA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0OwotCi0JCWluaXRWYXJpYWJsZXMocGFyZW50KTsKLQkJaW5pdFJvdygpOwotCQlpbnQgaSA9IDA7IAotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJRmlndXJlIGYgPSAoSUZpZ3VyZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlEaW1lbnNpb24gcHJlZiA9IHRyYW5zcG9zZXIudChnZXRDaGlsZFNpemUoZiwgd0hpbnQsIGhIaW50KSk7Ci0JCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgcHJlZi53aWR0aCwgcHJlZi5oZWlnaHQpOwotCi0JCQlpZiAoZGF0YS5yb3dDb3VudCA+IDApIHsKLQkJCQlpZiAoZGF0YS5yb3dXaWR0aCArIHByZWYud2lkdGggPiBkYXRhLm1heFdpZHRoKQotCQkJCQlsYXlvdXRSb3cocGFyZW50KTsKLQkJCX0KLQkJCXIueCA9IGRhdGEucm93WDsKLQkJCXIueSA9IGRhdGEucm93WTsKLQkJCWR4ID0gci53aWR0aCArIGdldE1pbm9yU3BhY2luZygpOwotCQkJZGF0YS5yb3dYICs9IGR4OwotCQkJZGF0YS5yb3dXaWR0aCArPSBkeDsKLQkJCWRhdGEucm93SGVpZ2h0ID0gTWF0aC5tYXgoZGF0YS5yb3dIZWlnaHQsIHIuaGVpZ2h0KTsKLQkJCWRhdGEucm93IFtkYXRhLnJvd0NvdW50XSA9IGY7Ci0JCQlkYXRhLmJvdW5kc1tkYXRhLnJvd0NvdW50XSA9IHI7Ci0JCQlkYXRhLnJvd0NvdW50Kys7Ci0JCQlpKys7Ci0JCX0KLQkJaWYgKGRhdGEucm93Q291bnQgIT0gMCkKLQkJCWxheW91dFJvdyhwYXJlbnQpOwotCQlkYXRhID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBZGp1c3QoYm9vbGVhbiBhZGp1c3QpIHsKLQkJdGhpcy5hZGp1c3QgPSBhZGp1c3Q7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9TZWxlY3RhYmxlTGFiZWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvU2VsZWN0YWJsZUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTI1YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9TZWxlY3RhYmxlTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogQSBjdXN0b21pemVkIExhYmVsIGZvciBzZWxlY3Rpb24uIFByaW1hcnkgc2VsZWN0aW9uIGlzIGRlbm90ZWQgYnkgaGlnaGxpZ2h0Ci0gKiBhbmQgZm9jdXMgcmVjdGFuZ2xlLiBOb3JtYWwgc2VsZWN0aW9uIGlzIGRlbm90ZWQgYnkgaGlnaGxpZ2h0IG9ubHkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RhYmxlTGFiZWwgZXh0ZW5kcyBMYWJlbCB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRm9jdXM7Ci0KLQlwcml2YXRlIFJlY3RhbmdsZSBnZXRTZWxlY3Rpb25SZWN0YW5nbGUoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBnZXRUZXh0Qm91bmRzKCk7Ci0JCWJvdW5kcy5leHBhbmQobmV3IEluc2V0cygyLCAyLCAwLCAwKSk7Ci0JCXRyYW5zbGF0ZVRvUGFyZW50KGJvdW5kcyk7Ci0JCWJvdW5kcy5pbnRlcnNlY3QoZ2V0Qm91bmRzKCkpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsI3BhaW50RmlndXJlKEdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0JCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlncmFwaGljcy5maWxsUmVjdGFuZ2xlKGdldFNlbGVjdGlvblJlY3RhbmdsZSgpKTsKLQkJCWdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotCQl9Ci0JCWlmIChoYXNGb2N1cykgewotCQkJZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0JCQlncmFwaGljcy5zZXRYT1JNb2RlKHRydWUpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRTZWxlY3Rpb25SZWN0YW5nbGUoKS5yZXNpemUoLTEsIC0xKSk7Ci0JCQlncmFwaGljcy5wb3BTdGF0ZSgpOwotCQl9Ci0JCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhpcyBTaW1wbGVBY3Rpdml0eUxhYmVsCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUgd2lsbCBjYXVzZSB0aGUgbGFiZWwgdG8gYXBwZWFyIHNlbGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBiKSB7Ci0JCXNlbGVjdGVkID0gYjsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvY3VzIHN0YXRlIG9mIHRoaXMgU2ltcGxlQWN0aXZpdHlMYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgYSBmb2N1cyByZWN0YW5nbGUgdG8gYmUgZHJhd24gYXJvdW5kIHRoZSB0ZXh0Ci0JICogICAgICAgICAgICBvZiB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGIpIHsKLQkJaGFzRm9jdXMgPSBiOwotCQlyZXBhaW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1RleHRGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvVGV4dEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWUxYThhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvVGV4dEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkltYWdlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlbGF0aXZlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5GbG93UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5QYXJhZ3JhcGhUZXh0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlRleHRGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRleHRGaWd1cmUgaXMgY3VzdG9taXphYmxlIGZpZ3VyZSB0byBhbGxvdyB3b3JkLXdyYXBpbmcgYW5kIHdpdGggaW1hZ2UuIAotICoge0BsaW5rIExhYmVsfSBkbyBub3Qgc3VwcG9ydCB3b3JkLXdyYXAuICBUZXh0RmlndXJlIGlzIHdyYXBwZXIgb3ZlciB7QGxpbmsgVGV4dEZsb3d9Ci0gKiBhbmQge0BsaW5rIEZsb3dQYWdlfSB0byBzdXBwb3J0IHdvcmQtd3JhcCBhbmQgaW1hZ2UuIAotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXByaXZhdGUgRmxvd1BhZ2UgdGV4dEZsb3dQYWdlOwotCi0JcHJpdmF0ZSBUZXh0RmxvdyB0ZXh0RmxvdzsKLQotCXByaXZhdGUgSW1hZ2VGaWd1cmUgaW1hZ2VGaWd1cmU7Ci0KLQlwdWJsaWMgVGV4dEZpZ3VyZSgpIHsKLQkJdGV4dEZsb3dQYWdlID0gbmV3IEZsb3dQYWdlKCk7Ci0JCXRleHRGbG93UGFnZS5zZXRIb3Jpem9udGFsQWxpZ21lbnQoUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpKTsKLQkJaW1hZ2VGaWd1cmUgPSBuZXcgSW1hZ2VGaWd1cmUoKTsKLQkJYWRkKGltYWdlRmlndXJlLCBuZXcgUmVsYXRpdmVMb2NhdG9yKGltYWdlRmlndXJlLAotCQkJCVBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUikpOwotCQlhZGQodGV4dEZsb3dQYWdlLCBuZXcgUmVsYXRpdmVMb2NhdG9yKHRleHRGbG93UGFnZSwKLQkJCQlQb3NpdGlvbkNvbnN0YW50cy5BTFdBWVNfTEVGVCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChJbWFnZSBpbWFnZSkgewotCQlpbWFnZUZpZ3VyZS5zZXRJbWFnZShpbWFnZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dEZsb3cuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJdGV4dEZsb3dQYWdlLnJlbW92ZUFsbCgpOwotCQl0ZXh0RmxvdyA9IG5ldyBUZXh0RmxvdygpOwotCQl0ZXh0Rmxvdy5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXRleHRGbG93LnNldExheW91dE1hbmFnZXIobmV3IFBhcmFncmFwaFRleHRMYXlvdXQodGV4dEZsb3csCi0JCQkJUGFyYWdyYXBoVGV4dExheW91dC5XT1JEX1dSQVBfSEFSRCkpOwotCQl0ZXh0Rmxvdy5zZXRUZXh0KG5ld1RleHQpOwotCQl0ZXh0Rmxvd1BhZ2UuYWRkKHRleHRGbG93KTsKLQl9Ci0KLQlwdWJsaWMgRmxvd1BhZ2UgZ2V0VGV4dEZsb3dQYWdlKCkgewotCQlyZXR1cm4gdGV4dEZsb3dQYWdlOwotCX0KLQotCXB1YmxpYyBUZXh0RmxvdyBnZXRUZXh0RmxvdygpIHsKLQkJcmV0dXJuIHRleHRGbG93OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BDb21wYXJ0bWVudEZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUENvbXBhcnRtZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2VkNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUENvbXBhcnRtZW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5SYWlzZWRNYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXUENvbXBhcnRtZW50RmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3Igd3BDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCQkJMjU1LCAxNTYpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBhcnRpZmFjdENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJMjU1LCAyNTUsIDE1Nik7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGRlbGl2ZXJhYmxlQ29sb3IgPSBuZXcgQ29sb3IoCi0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjA2LCAyNTUsIDIxNik7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIG91dGNvbWVDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwKLQkJCTIwNiwgMjU1LCAxMDApOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgbmV3V1BOYW1lID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV1BDb21wYXJ0bWVudEZpZ3VyZV8wOyAKLQotCXB1YmxpYyBMYWJlbCBsYWJlbDsKLQotCVdQRmlndXJlIGZpZ3VyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBXb3JrUHJvZHVjdCBDb21wYXJ0bWVudCAtIFdpdGggYmFja2dyb3VuZCBmaWxsZWQgZGVwZW5kaW5nIG9uIFR5cGUgb2YgdGhlCi0JICogV29ya1Byb2R1Y3QuCi0JICovCi0JcHVibGljIFdQQ29tcGFydG1lbnRGaWd1cmUoTGFiZWwgbmFtZSwgaW50IHR5cGUpIHsKLQkJbGFiZWwgPSBuYW1lOwotCQlUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0JCXNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJc2V0T3BhcXVlKHRydWUpOwotCQlzZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJaWYgKHR5cGUgPT0gMSkKLQkJCXNldEJhY2tncm91bmRDb2xvcihhcnRpZmFjdENvbG9yKTsKLQkJZWxzZSBpZiAodHlwZSA9PSAyKQotCQkJc2V0QmFja2dyb3VuZENvbG9yKGRlbGl2ZXJhYmxlQ29sb3IpOwotCQllbHNlIGlmICh0eXBlID09IDMpCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3Iob3V0Y29tZUNvbG9yKTsKLQkJZWxzZQotCQkJc2V0QmFja2dyb3VuZENvbG9yKHdwQ29sb3IpOwotCQlsYWJlbC5zZXRUZXh0KG5ld1dQTmFtZSk7Ci0JCWFkZChsYWJlbCk7Ci0JfQotCi0JcHVibGljIExhYmVsIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWxOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWxhYmVsLnNldFRleHQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUEZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmExMGMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1BGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHVibGljIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCk7Ci0KLQlwdWJsaWMgV1BGaWd1cmUoTGFiZWwgbCkgewotCQlzdXBlcigpOwotCQlhZGQobCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZykgewotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdldENsaWVudEFyZWEoKTsKLQkJUmVjdGFuZ2xlIGJhciA9IGNsaWVudEFyZWEuZ2V0Q29weSgpOwotCQliYXIuY3JvcChuZXcgSW5zZXRzKDAsIDUsIDUsIDUpKTsKLQkJZy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZ3JheSk7Ci0JCWcuZmlsbFJlY3RhbmdsZShiYXIuZ2V0VHJhbnNsYXRlZCg2LCA2KSk7Ci0JCWcuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0JCWcuZmlsbFJlY3RhbmdsZShiYXIpOwotCQlnLnNldExpbmVTdHlsZSgyKTsKLQkJZy5zZXRMaW5lV2lkdGgoMSk7Ci0JCXN1cGVyLnBhaW50RmlndXJlKGcpOwotCX0KLQotCXB1YmxpYyBMYWJlbCBnZXRGaWd1cmUoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbGFiZWwuc2V0VGV4dChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChMYWJlbCBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JY2xhc3MgQm94IGV4dGVuZHMgRmlndXJlIHsKLQkJcHVibGljIEJveChJbnNldHMgaW5zZXRzKSB7Ci0JCQlzZXRCb3JkZXIobmV3IEJveEJvcmRlcihpbnNldHMpKTsKLQkJCVRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0JCQl0b29sYmFyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotCQkJc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5yZWQpOwotCi0JCX0KLQotCQlwcml2YXRlIGNsYXNzIEJveEJvcmRlciBleHRlbmRzIEFic3RyYWN0Qm9yZGVyIHsKLQotCQkJcHVibGljIEluc2V0cyBpbnNldHMgPSBuZXcgSW5zZXRzKDEsIDAsIDAsIDApOwotCi0JCQlwdWJsaWMgQm94Qm9yZGVyKEluc2V0cyBpbnNldHMpIHsKLQkJCQl0aGlzLmluc2V0cyA9IGluc2V0czsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjZ2V0SW5zZXRzKElGaWd1cmUpCi0JCQkgKi8KLQkJCXB1YmxpYyBJbnNldHMgZ2V0SW5zZXRzKElGaWd1cmUgZmlndXJlKSB7Ci0JCQkJcmV0dXJuIGluc2V0czsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjcGFpbnQoSUZpZ3VyZSwgR3JhcGhpY3MsIEluc2V0cykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcGFpbnQoSUZpZ3VyZSBmaWd1cmUsIEdyYXBoaWNzIGdyYXBoaWNzLCBJbnNldHMgaW5zZXRzKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRQYWludFJlY3RhbmdsZShmaWd1cmUsIGluc2V0cyk7Ci0JCQkJZ3JhcGhpY3MuZHJhd0xpbmUocmVjdC5nZXRUb3BMZWZ0KCksIHJlY3QuZ2V0VG9wUmlnaHQoKSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwTGFiZWxuSW1hZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcExhYmVsbkltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODBkZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwTGFiZWxuSW1hZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JbWFnZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LkZsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlBhcmFncmFwaFRleHRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuVGV4dEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdyYXBMYWJlbG5JbWFnZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQkvLyBUaGUgaW5uZXIgVGV4dEZsb3cKLQlwcml2YXRlIFRleHRGbG93IHRleHRGbG93OwotCi0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQotCXB1YmxpYyBXcmFwTGFiZWxuSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMykpOwotCQlJbWFnZUZpZ3VyZSBmaWcgPSBuZXcgSW1hZ2VGaWd1cmUoKTsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCQlmaWcuc2V0SW1hZ2UoaW1hZ2UpOwotCQlhZGQoZmlnKTsKLQkJRmxvd1BhZ2UgZmxvd1BhZ2UgPSBuZXcgRmxvd1BhZ2UoKTsKLQotCQl0ZXh0RmxvdyA9IG5ldyBUZXh0RmxvdygpOwotCi0JCXRleHRGbG93LnNldExheW91dE1hbmFnZXIobmV3IFBhcmFncmFwaFRleHRMYXlvdXQodGV4dEZsb3csCi0JCQkJUGFyYWdyYXBoVGV4dExheW91dC5XT1JEX1dSQVBfU09GVCkpOwotCQkKLQkJZmxvd1BhZ2UuYWRkKHRleHRGbG93KTsKLQkJZmxvd1BhZ2Uuc2V0U2l6ZSg0MCw0MCk7Ci0KLQkJc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpKTsKLQkJYWRkKGZsb3dQYWdlKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgaW5zaWRlIHRoZSBUZXh0Rmxvdy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGZsb3cgaW5zaWRlIHRoZSB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHRGbG93LmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBUZXh0RmxvdyB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0JICogCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdGV4dCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCXRleHRGbG93LnNldFRleHQobmV3VGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQlwdWJsaWMgVGV4dEZsb3cgZ2V0VGV4dEZsb3coKXsKLQkJcmV0dXJuIHRleHRGbG93OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwcGFibGVMYWJlbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwcGFibGVMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTg3M2M4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcHBhYmxlTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQnJlYWtJdGVyYXRvcjsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciB0ZXh0IHdyYXAgaW4gYSBsYWJlbC4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdyYXBwYWJsZUxhYmVsIGV4dGVuZHMgRmlndXJlIGltcGxlbWVudHMgUG9zaXRpb25Db25zdGFudHMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVMTElQU0lTID0gIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW1hZ2UgaWNvbjsKLQotCXByaXZhdGUgU3RyaW5nIHRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgc3ViU3RyaW5nVGV4dDsKLQotCXByaXZhdGUgRGltZW5zaW9uIHRleHRTaXplOwotCi0JcHJpdmF0ZSBEaW1lbnNpb24gc3ViU3RyaW5nVGV4dFNpemU7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBpY29uU2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgMCk7Ci0KLQlwcml2YXRlIFBvaW50IGljb25Mb2NhdGlvbjsKLQotCXByaXZhdGUgUG9pbnQgdGV4dExvY2F0aW9uOwotCi0JcHJpdmF0ZSBpbnQgdGV4dEFsaWdubWVudCA9IENFTlRFUjsKLQotCXByaXZhdGUgaW50IGljb25BbGlnbm1lbnQgPSBDRU5URVI7Ci0KLQlwcml2YXRlIGludCBsYWJlbEFsaWdubWVudCA9IENFTlRFUjsKLQotCXByaXZhdGUgaW50IHRleHRQbGFjZW1lbnQgPSBTT1VUSDsKLQotCXByaXZhdGUgaW50IGljb25UZXh0R2FwID0gMzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1NFTEVDVEVEID0gTUFYX0ZMQUcgPDwgMSwKLQkJCUZMQUdfSEFTRk9DVVMgPSBNQVhfRkxBRyA8PCAyLCBGTEFHX1dSQVAgPSBNQVhfRkxBRyA8PCA1LAotCQkJRkxBR19XUkFQX0FMSUdOID0gTUFYX0ZMQUcgPDwgNjsKLQotCS8vIFRoZSBwcmltYXJ5IGRpbWVuc2lvbnMgdXNlZCB0byBjYWxjdWxhdGUgdGV4dCBzaXplLgotCXByaXZhdGUgRGltZW5zaW9uIHRleHREaW1lbnNpb24gPSBuZXcgRGltZW5zaW9uKC0xLCAtMSk7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBwcmVmU2l6ZURpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oLTEsIC0xKTsKLQotCXByaXZhdGUgaW50IHdyYXBXaWR0aDsKLQotCXB1YmxpYyBXcmFwcGFibGVMYWJlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBMYWJlbCB3aXRoIHBhc3NlZCBTdHJpbmcgYXMgaXRzIHRleHQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBXcmFwcGFibGVMYWJlbChTdHJpbmcgcykgewotCQlzZXRUZXh0KHMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFdyYXBwZWRMYWJlbCB3aXRoIHBhc3NlZCBJbWFnZSBhcyBpdHMgaWNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgdGhlIFdyYXBwZWRMYWJlbCBpbWFnZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgV3JhcHBhYmxlTGFiZWwoSW1hZ2UgaSkgewotCQlzZXRJY29uKGkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFdyYXBwZWRMYWJlbCB3aXRoIHBhc3NlZCBTdHJpbmcgYXMgdGV4dCBhbmQgcGFzc2VkIEltYWdlIGFzCi0JICogaXRzIGljb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIHRoZSBXcmFwcGVkTGFiZWwgdGV4dAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICB0aGUgV3JhcHBlZExhYmVsIGltYWdlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBXcmFwcGFibGVMYWJlbChTdHJpbmcgcywgSW1hZ2UgaSkgewotCQlzZXRUZXh0KHMpOwotCQlzZXRJY29uKGkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhbGlnbk9uSGVpZ2h0KFBvaW50IGxvYywgRGltZW5zaW9uIHNpemUsIGludCBhbGlnbm1lbnQpIHsKLQkJSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotCQlzd2l0Y2ggKGFsaWdubWVudCkgewotCQljYXNlIFRPUDoKLQkJCWxvYy55ID0gaW5zZXRzLnRvcDsKLQkJCWJyZWFrOwotCQljYXNlIEJPVFRPTToKLQkJCWxvYy55ID0gYm91bmRzLmhlaWdodCAtIHNpemUuaGVpZ2h0IC0gaW5zZXRzLmJvdHRvbTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbG9jLnkgPSAoYm91bmRzLmhlaWdodCAtIHNpemUuaGVpZ2h0KSAvIDI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWxpZ25PbldpZHRoKFBvaW50IGxvYywgRGltZW5zaW9uIHNpemUsIGludCBhbGlnbm1lbnQpIHsKLQkJSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotCQlzd2l0Y2ggKGFsaWdubWVudCkgewotCQljYXNlIExFRlQ6Ci0JCQlsb2MueCA9IGluc2V0cy5sZWZ0OwotCQkJYnJlYWs7Ci0JCWNhc2UgUklHSFQ6Ci0JCQlsb2MueCA9IGJvdW5kcy53aWR0aCAtIHNpemUud2lkdGggLSBpbnNldHMucmlnaHQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWxvYy54ID0gKGJvdW5kcy53aWR0aCAtIHNpemUud2lkdGgpIC8gMjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVBbGlnbm1lbnQoKSB7Ci0JCXN3aXRjaCAodGV4dFBsYWNlbWVudCkgewotCQljYXNlIEVBU1Q6Ci0JCWNhc2UgV0VTVDoKLQkJCWFsaWduT25IZWlnaHQodGV4dExvY2F0aW9uLCBnZXRUZXh0U2l6ZSgpLCB0ZXh0QWxpZ25tZW50KTsKLQkJCWFsaWduT25IZWlnaHQoaWNvbkxvY2F0aW9uLCBpY29uU2l6ZSwgaWNvbkFsaWdubWVudCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJY2FzZSBTT1VUSDoKLQkJCWFsaWduT25XaWR0aCh0ZXh0TG9jYXRpb24sIGdldFN1YlN0cmluZ1RleHRTaXplKCksIHRleHRBbGlnbm1lbnQpOwotCQkJYWxpZ25PbldpZHRoKGljb25Mb2NhdGlvbiwgaWNvblNpemUsIGljb25BbGlnbm1lbnQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwgdXNpbmcgdGhlIHBhc3NlZCBEaW1lbnNpb24gYXMgdGhlCi0JICogc2l6ZSBvZiB0aGUgV3JhcHBlZExhYmVsJ3MgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHh0U2l6ZQotCSAqICAgICAgICAgICAgdGhlIHByZWNhbGN1bGF0ZWQgc2l6ZSBvZiB0aGUgV3JhcHBlZExhYmVsJ3MgdGV4dAotCSAqIEByZXR1cm4gdGhlIFdyYXBwZWRMYWJlbCdzIHNpemUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVMYWJlbFNpemUoRGltZW5zaW9uIHR4dFNpemUpIHsKLQkJaW50IGdhcCA9IGljb25UZXh0R2FwOwotCQlpZiAoZ2V0SWNvbigpID09IG51bGwgfHwgZ2V0VGV4dCgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCWdhcCA9IDA7Ci0JCURpbWVuc2lvbiBkID0gbmV3IERpbWVuc2lvbigwLCAwKTsKLQkJaWYgKHRleHRQbGFjZW1lbnQgPT0gV0VTVCB8fCB0ZXh0UGxhY2VtZW50ID09IEVBU1QpIHsKLQkJCWQud2lkdGggPSBpY29uU2l6ZS53aWR0aCArIGdhcCArIHR4dFNpemUud2lkdGg7Ci0JCQlkLmhlaWdodCA9IE1hdGgubWF4KGljb25TaXplLmhlaWdodCwgdHh0U2l6ZS5oZWlnaHQpOwotCQl9IGVsc2UgewotCQkJZC53aWR0aCA9IE1hdGgubWF4KGljb25TaXplLndpZHRoLCB0eHRTaXplLndpZHRoKTsKLQkJCWQuaGVpZ2h0ID0gaWNvblNpemUuaGVpZ2h0ICsgZ2FwICsgdHh0U2l6ZS5oZWlnaHQ7Ci0JCX0KLQkJcmV0dXJuIGQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUxvY2F0aW9ucygpIHsKLQkJdGV4dExvY2F0aW9uID0gbmV3IFBvaW50KCk7Ci0JCWljb25Mb2NhdGlvbiA9IG5ldyBQb2ludCgpOwotCi0JCWNhbGN1bGF0ZVBsYWNlbWVudCgpOwotCQljYWxjdWxhdGVBbGlnbm1lbnQoKTsKLQkJRGltZW5zaW9uIG9mZnNldCA9IGdldFNpemUoKS5nZXREaWZmZXJlbmNlKGdldFByZWZlcnJlZFNpemUoKSk7Ci0JCW9mZnNldC53aWR0aCArPSBnZXRUZXh0U2l6ZSgpLndpZHRoIC0gZ2V0U3ViU3RyaW5nVGV4dFNpemUoKS53aWR0aDsKLQkJc3dpdGNoIChsYWJlbEFsaWdubWVudCkgewotCQljYXNlIENFTlRFUjoKLQkJCW9mZnNldC5zY2FsZSgwLjVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRlQ6Ci0JCQlvZmZzZXQuc2NhbGUoMC4wZik7Ci0JCQlicmVhazsKLQkJY2FzZSBSSUdIVDoKLQkJCW9mZnNldC5zY2FsZSgxLjBmKTsKLQkJCWJyZWFrOwotCQljYXNlIFRPUDoKLQkJCW9mZnNldC5oZWlnaHQgPSAwOwotCQkJb2Zmc2V0LnNjYWxlKDAuNWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJb2Zmc2V0LmhlaWdodCA9IG9mZnNldC5oZWlnaHQgKiAyOwotCQkJb2Zmc2V0LnNjYWxlKDAuNWYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN3aXRjaCAodGV4dFBsYWNlbWVudCkgewotCQljYXNlIEVBU1Q6Ci0JCWNhc2UgV0VTVDoKLQkJCW9mZnNldC5oZWlnaHQgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTk9SVEg6Ci0JCWNhc2UgU09VVEg6Ci0JCQlvZmZzZXQud2lkdGggPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQl0ZXh0TG9jYXRpb24udHJhbnNsYXRlKG9mZnNldCk7Ci0JCWljb25Mb2NhdGlvbi50cmFuc2xhdGUob2Zmc2V0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlUGxhY2VtZW50KCkgewotCQlpbnQgZ2FwID0gaWNvblRleHRHYXA7Ci0JCWlmIChpY29uID09IG51bGwgfHwgdGV4dC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlnYXAgPSAwOwotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0KLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJCWljb25Mb2NhdGlvbi54ID0gaW5zZXRzLmxlZnQ7Ci0JCQl0ZXh0TG9jYXRpb24ueCA9IGljb25TaXplLndpZHRoICsgZ2FwICsgaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBXRVNUOgotCQkJdGV4dExvY2F0aW9uLnggPSBpbnNldHMubGVmdDsKLQkJCWljb25Mb2NhdGlvbi54ID0gZ2V0U3ViU3RyaW5nVGV4dFNpemUoKS53aWR0aCArIGdhcCArIGluc2V0cy5sZWZ0OwotCQkJYnJlYWs7Ci0JCWNhc2UgTk9SVEg6Ci0JCQl0ZXh0TG9jYXRpb24ueSA9IGluc2V0cy50b3A7Ci0JCQlpY29uTG9jYXRpb24ueSA9IGdldFRleHRTaXplKCkuaGVpZ2h0ICsgZ2FwICsgaW5zZXRzLnRvcDsKLQkJCWJyZWFrOwotCQljYXNlIFNPVVRIOgotCQkJdGV4dExvY2F0aW9uLnkgPSBpY29uU2l6ZS5oZWlnaHQgKyBnYXAgKyBpbnNldHMudG9wOwotCQkJaWNvbkxvY2F0aW9uLnkgPSBpbnNldHMudG9wOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgc2l6ZSBvZiB0aGUgTGFiZWwncyB0ZXh0IHNpemUuIFRoZSB0ZXh0IHNpemUgY2FsY3VsYXRlZAotCSAqIHRha2VzIGludG8gY29uc2lkZXJhdGlvbiBpZiB0aGUgTGFiZWwncyB0ZXh0IGlzIGN1cnJlbnRseSB0cnVuY2F0ZWQuIElmCi0JICogdGV4dCBzaXplIHdpdGhvdXQgY29uc2lkZXJpbmcgY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZQotCSAqIHtAbGluayAjY2FsY3VsYXRlVGV4dFNpemUoKX0uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbGFiZWwncyB0ZXh0LCB0YWtpbmcgaW50byBhY2NvdW50IHRydW5jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVTdWJTdHJpbmdUZXh0U2l6ZSgpIHsKLQkJcmV0dXJuIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhnZXRTdWJTdHJpbmdUZXh0KCksIGdldEZvbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgTGFiZWwncyB0ZXh0LiBOb3RlIHRoYXQgdGhpcwotCSAqIERpbWVuc2lvbiBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBMYWJlbCdzIGZ1bGwgdGV4dCwgcmVnYXJkbGVzcyBvZgotCSAqIHdoZXRoZXIgb3Igbm90IGl0cyB0ZXh0IGlzIGN1cnJlbnRseSB0cnVuY2F0ZWQuIElmIHRleHQgc2l6ZSBjb25zaWRlcmluZwotCSAqIGN1cnJlbnQgdHJ1bmNhdGlvbiBpcyBkZXNpcmVkLCB1c2Uge0BsaW5rICNjYWxjdWxhdGVTdWJTdHJpbmdUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIHRleHQsIGlnbm9yaW5nIHRydW5jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVUZXh0U2l6ZSgpIHsKLQkJLy8gcmV0dXJuIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhnZXRUZXh0KCksIGdldEZvbnQoKSk7Ci0JCXJldHVybiBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoZ2V0V3JhcHBlZFRleHQoZ2V0U2l6ZSgpLndpZHRoLAotCQkJCWdldFNpemUoKS5oZWlnaHQpLCBnZXRGb250KCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyTG9jYXRpb25zKCkgewotCQlpY29uTG9jYXRpb24gPSB0ZXh0TG9jYXRpb24gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIExhYmVsJ3MgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCBpY29uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJY29uKCkgewotCQlyZXR1cm4gaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgTGFiZWwncyBpY29uLiBUaGUgZGVmYXVsdCBpcwotCSAqIHtAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGljb24gYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWNvbkFsaWdubWVudCgpIHsKLQkJcmV0dXJuIGljb25BbGlnbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm91bmRzIG9mIHRoZSBMYWJlbCdzIGljb24uCi0JICogCi0JICogQHJldHVybiB0aGUgaWNvbidzIGJvdW5kcwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlIGdldEljb25Cb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBnZXRCb3VuZHMoKTsKLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoYm91bmRzLmdldExvY2F0aW9uKCkudHJhbnNsYXRlKGdldEljb25Mb2NhdGlvbigpKSwKLQkJCQlpY29uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIExhYmVsJ3MgaWNvbiByZWxhdGl2ZSB0byB0aGUgTGFiZWwuCi0JICogCi0JICogQHJldHVybiB0aGUgaWNvbidzIGxvY2F0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRJY29uTG9jYXRpb24oKSB7Ci0JCWlmIChpY29uTG9jYXRpb24gPT0gbnVsbCkKLQkJCWNhbGN1bGF0ZUxvY2F0aW9ucygpOwotCQlyZXR1cm4gaWNvbkxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdhcCBpbiBwaXhlbHMgYmV0d2VlbiB0aGUgTGFiZWwncyBpY29uIGFuZCBpdHMgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBnYXAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRJY29uVGV4dEdhcCgpIHsKLQkJcmV0dXJuIGljb25UZXh0R2FwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUZpZ3VyZSNnZXRNaW5pbXVtU2l6ZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldE1pbmltdW1TaXplKGludCB3LCBpbnQgaCkgewotCQlpZiAobWluU2l6ZSAhPSBudWxsKQotCQkJcmV0dXJuIG1pblNpemU7Ci0JCW1pblNpemUgPSBuZXcgRGltZW5zaW9uKCk7Ci0JCWlmIChnZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCW1pblNpemUuc2V0U2l6ZShnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0TWluaW11bVNpemUodGhpcywgdywgaCkpOwotCi0JCURpbWVuc2lvbiBsYWJlbFNpemUgPSBjYWxjdWxhdGVMYWJlbFNpemUoRmlndXJlVXRpbGl0aWVzCi0JCQkJLmdldFRleHRFeHRlbnRzKEVMTElQU0lTLCBnZXRGb250KCkpLmludGVyc2VjdCgKLQkJCQkJCUZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhnZXRUZXh0KCksIGdldEZvbnQoKSkpKTsKLQkJSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotCQlsYWJlbFNpemUuZXhwYW5kKGluc2V0cy5nZXRXaWR0aCgpLCBpbnNldHMuZ2V0SGVpZ2h0KCkpOwotCQltaW5TaXplLnVuaW9uKGxhYmVsU2l6ZSk7Ci0JCXJldHVybiBtaW5TaXplOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUZpZ3VyZSNnZXRQcmVmZXJyZWRTaXplKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgewotCQlpZiAocHJlZlNpemUgPT0gbnVsbCB8fCB3SGludCAhPSBwcmVmU2l6ZURpbWVuc2lvbi53aWR0aAotCQkJCXx8IGhIaW50ICE9IHByZWZTaXplRGltZW5zaW9uLmhlaWdodCkgewotCQkJcHJlZlNpemUgPSBjYWxjdWxhdGVMYWJlbFNpemUoZ2V0VGV4dFNpemUod0hpbnQsIGhIaW50KSk7Ci0JCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCQlwcmVmU2l6ZS5leHBhbmQoaW5zZXRzLmdldFdpZHRoKCksIGluc2V0cy5nZXRIZWlnaHQoKSk7Ci0JCQlpZiAoZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpCi0JCQkJcHJlZlNpemUudW5pb24oZ2V0TGF5b3V0TWFuYWdlcigpLmdldFByZWZlcnJlZFNpemUodGhpcywgd0hpbnQsCi0JCQkJCQloSGludCkpOwotCQl9Ci0JCWlmICh3SGludCA+PSAwICYmIHdIaW50IDwgcHJlZlNpemUud2lkdGgpIHsKLQkJCURpbWVuc2lvbiBtaW5TaXplID0gZ2V0TWluaW11bVNpemUod0hpbnQsIGhIaW50KTsKLQkJCURpbWVuc2lvbiByZXN1bHQgPSBwcmVmU2l6ZS5nZXRDb3B5KCk7Ci0JCQlyZXN1bHQud2lkdGggPSBNYXRoLm1pbihyZXN1bHQud2lkdGgsIHdIaW50KTsKLQkJCXJlc3VsdC53aWR0aCA9IE1hdGgubWF4KG1pblNpemUud2lkdGgsIHJlc3VsdC53aWR0aCk7Ci0JCQlwcmVmU2l6ZURpbWVuc2lvbi53aWR0aCA9IHJlc3VsdC53aWR0aDsKLQkJCXByZWZTaXplRGltZW5zaW9uLmhlaWdodCA9IHJlc3VsdC53aWR0aDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHByZWZTaXplOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIGFtb3VudCBvZiB0aGUgTGFiZWwncyBjdXJyZW50IHRleHQgd2lsbCBmaXQgaW4gdGhlIExhYmVsLAotCSAqIGluY2x1ZGluZyBhbiBlbGlwc2lzICIuLi4iIGlmIHRydW5jYXRpb24gaXMgcmVxdWlyZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgc3Vic3RyaW5nCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ViU3RyaW5nVGV4dCgpIHsKLQkJaWYgKHN1YlN0cmluZ1RleHQgIT0gbnVsbCkKLQkJCXJldHVybiBzdWJTdHJpbmdUZXh0OwotCi0JCXN1YlN0cmluZ1RleHQgPSB0ZXh0OwotCQlEaW1lbnNpb24gc2hyaW5rID0gZ2V0UHJlZmVycmVkU2l6ZShnZXRTaXplKCkud2lkdGgsIGdldFNpemUoKS5oZWlnaHQpCi0JCQkJLmdldERpZmZlcmVuY2UoZ2V0U2l6ZSgpKTsKLQkJRGltZW5zaW9uIGVmZmVjdGl2ZVNpemUgPSBnZXRUZXh0U2l6ZSgpLmdldEV4cGFuZGVkKC1zaHJpbmsud2lkdGgsCi0JCQkJLXNocmluay5oZWlnaHQpOwotCQlGb250IGN1cnJlbnRGb250ID0gZ2V0Rm9udCgpOwotCQlpbnQgZm9udEhlaWdodCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhjdXJyZW50Rm9udCkKLQkJCQkuZ2V0SGVpZ2h0KCk7Ci0JCWludCBtYXhMaW5lcyA9IChpbnQpIChlZmZlY3RpdmVTaXplLmhlaWdodCAvIChkb3VibGUpIGZvbnRIZWlnaHQpOwotCi0JCVN0cmluZ0J1ZmZlciBhY2N1bWxhdGVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nQnVmZmVyIHJlbWFpbmluZ1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRleHQoKSk7Ci0JCWludCBpID0gMCwgaiA9IDA7Ci0KLQkJd2hpbGUgKHJlbWFpbmluZ1RleHQubGVuZ3RoKCkgPiAwICYmIGorKyA8IG1heExpbmVzKSB7Ci0JCQlpID0gZ2V0TGluZVdyYXBQb3NpdGlvbihyZW1haW5pbmdUZXh0LnRvU3RyaW5nKCksIGN1cnJlbnRGb250LAotCQkJCQllZmZlY3RpdmVTaXplLndpZHRoKTsKLQotCQkJaWYgKGFjY3VtbGF0ZWRUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGkgPT0gMCB8fCAocmVtYWluaW5nVGV4dC5sZW5ndGgoKSA+IGkgJiYgaiA9PSBtYXhMaW5lcykpIHsKLQkJCQlpbnQgZG90c1dpZHRoID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKEVMTElQU0lTLAotCQkJCQkJY3VycmVudEZvbnQpLndpZHRoOwotCQkJCWkgPSBnZXRMYXJnZXN0U3Vic3RyaW5nQ29uZmluZWRUbyhyZW1haW5pbmdUZXh0LnRvU3RyaW5nKCksCi0JCQkJCQljdXJyZW50Rm9udCwgTWF0aC5tYXgoZWZmZWN0aXZlU2l6ZS53aWR0aCAtIGRvdHNXaWR0aCwKLQkJCQkJCQkJMCkpOwotCQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZChyZW1haW5pbmdUZXh0LnN1YnN0cmluZygwLCBpKSk7Ci0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKEVMTElQU0lTKTsKLQkJCX0gZWxzZQotCQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZChyZW1haW5pbmdUZXh0LnN1YnN0cmluZygwLCBpKSk7Ci0JCQlyZW1haW5pbmdUZXh0LmRlbGV0ZSgwLCBpKTsKLQkJfQotCQlyZXR1cm4gc3ViU3RyaW5nVGV4dCA9IGFjY3VtbGF0ZWRUZXh0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgTGFiZWwncyBjdXJyZW50IHRleHQuIElmIHRoZSB0ZXh0IGlzIGN1cnJlbnRseQotCSAqIHRydW5jYXRlZCwgdGhlIHRydW5jYXRlZCB0ZXh0IHdpdGggaXRzIGVsbGlwc2lzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQotCSAqIHNpemUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGxhYmVsJ3MgdGV4dCwgdGFraW5nIGludG8gYWNjb3VudCB0cnVuY2F0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gZ2V0U3ViU3RyaW5nVGV4dFNpemUoKSB7Ci0JCWlmIChzdWJTdHJpbmdUZXh0U2l6ZSA9PSBudWxsKQotCQkJc3ViU3RyaW5nVGV4dFNpemUgPSBjYWxjdWxhdGVTdWJTdHJpbmdUZXh0U2l6ZSgpOwotCQlyZXR1cm4gc3ViU3RyaW5nVGV4dFNpemU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgbGFiZWwuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoZQotCSAqIGxhYmVsLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgY3VycmVudGx5IGJlaW5nIHRydW5jYXRlZC4gQ2FsbAotCSAqIHtAbGluayAjZ2V0U3ViU3RyaW5nVGV4dCgpfSB0byByZXR1cm4gdGhlIGxhYmVsJ3MgY3VycmVudCB0ZXh0IGNvbnRlbnRzCi0JICogd2l0aCB0cnVuY2F0aW9uIGNvbnNpZGVyZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIGxhYmVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBhbGlnbm1lbnQgb2YgdGhlIExhYmVsJ3MgdGV4dC4gVGhlIGRlZmF1bHQgdGV4dAotCSAqIGFsaWdubWVudCBpcyB7QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQ0VOVEVSfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGFsaWdubWVudAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEFsaWdubWVudCgpIHsKLQkJcmV0dXJuIHRleHRBbGlnbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm91bmRzIG9mIHRoZSBsYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGUgYm91bmRzIGFyZQotCSAqIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGxhYmVsJ3MgY29tcGxldGUgdGV4dCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCi0JICogbGFiZWwncyB0ZXh0IGlzIGN1cnJlbnRseSB0cnVuY2F0ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoaXMgbGFiZWwncyBjb21wbGV0ZSB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0VGV4dEJvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZShib3VuZHMuZ2V0TG9jYXRpb24oKS50cmFuc2xhdGUoZ2V0VGV4dExvY2F0aW9uKCkpLAotCQkJCXRleHRTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFiZWwncyB0ZXh0IHJlbGF0aXZlIHRvIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGxvY2F0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRUZXh0TG9jYXRpb24oKSB7Ci0JCWlmICh0ZXh0TG9jYXRpb24gIT0gbnVsbCkKLQkJCXJldHVybiB0ZXh0TG9jYXRpb247Ci0JCWNhbGN1bGF0ZUxvY2F0aW9ucygpOwotCQlyZXR1cm4gdGV4dExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGxhY2VtZW50IG9mIHRoZSBsYWJlbCdzIHRleHQgcmVsYXRpdmUgdG8gaXRzIGljb24uCi0JICogVGhlIGRlZmF1bHQgdGV4dCBwbGFjZW1lbnQgaXMge0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0VBU1R9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgcGxhY2VtZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dFBsYWNlbWVudCgpIHsKLQkJcmV0dXJuIHRleHRQbGFjZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0LiBOb3RlIHRoYXQgdGhlIHRleHQgdXNlZCB0bwotCSAqIG1ha2UgdGhpcyBjYWxjdWxhdGlvbiBpcyB0aGUgbGFiZWwncyBmdWxsIHRleHQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IGJlaW5nIHRydW5jYXRlZCBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcy4KLQkgKiBJZiB0aGUgc2l6ZSBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgY2FsbAotCSAqIHtAbGluayAjZ2V0U3ViU3RyaW5nVGV4dFNpemUoKX0uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGxhYmVsJ3MgY29tcGxldGUgdGV4dAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGdldFRleHRTaXplKCkgewotCQlpZiAodGV4dFNpemUgPT0gbnVsbCkKLQkJCXRleHRTaXplID0gY2FsY3VsYXRlVGV4dFNpemUoKTsKLQkJcmV0dXJuIHRleHRTaXplOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgY29tcGxldGUgdGV4dC4gTm90ZSB0aGF0IHRoZSB0ZXh0IHVzZWQgdG8KLQkgKiBtYWtlIHRoaXMgY2FsY3VsYXRpb24gaXMgdGhlIGxhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCi0JICogbGFiZWwncyB0ZXh0IGlzIGN1cnJlbnRseSBiZWluZyB0cnVuY2F0ZWQgYW5kIGlzIGRpc3BsYXlpbmcgYW4gZWxsaXBzaXMuCi0JICogSWYgdGhlIHNpemUgY29uc2lkZXJpbmcgY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIGNhbGwKLQkgKiB7QGxpbmsgI2dldFN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyBsYWJlbCdzIGNvbXBsZXRlIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBnZXRUZXh0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaWYgKHRleHRTaXplID09IG51bGwpIHsKLQkJCXRleHRTaXplID0gY2FsY3VsYXRlVGV4dFNpemUod2lkdGgsIGhlaWdodCk7Ci0JCQl0ZXh0RGltZW5zaW9uLndpZHRoID0gd2lkdGg7Ci0JCQl0ZXh0RGltZW5zaW9uLmhlaWdodCA9IGhlaWdodDsKLQkJfQotCQlyZXR1cm4gdGV4dFNpemU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2ludmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7Ci0JCXByZWZTaXplID0gbnVsbDsKLQkJbWluU2l6ZSA9IG51bGw7Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXRleHRTaXplID0gbnVsbDsKLQkJc3ViU3RyaW5nVGV4dFNpemUgPSBudWxsOwotCQlzdWJTdHJpbmdUZXh0ID0gbnVsbDsKLQkJc3VwZXIuaW52YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxhYmVsJ3MgdGV4dCBpcyBjdXJyZW50bHkgdHJ1bmNhdGVkCi0JICogYW5kIGlzIGRpc3BsYXlpbmcgYW4gZWxsaXBzaXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwncyB0ZXh0IGlzIHRydW5jYXRlZAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RleHRUcnVuY2F0ZWQoKSB7Ci0JCXJldHVybiAhZ2V0U3ViU3RyaW5nVGV4dFNpemUoKS5lcXVhbHMoZ2V0VGV4dFNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBGaWd1cmUjcGFpbnRGaWd1cmUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJaWYgKGlzU2VsZWN0ZWQoKSkgewotCQkJZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0JCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlncmFwaGljcy5maWxsUmVjdGFuZ2xlKGdldFNlbGVjdGlvblJlY3RhbmdsZSgpKTsKLQkJCWdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotCQl9Ci0JCWlmIChoYXNGb2N1cygpKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldFhPUk1vZGUodHJ1ZSk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldFNlbGVjdGlvblJlY3RhbmdsZSgpLnJlc2l6ZSgtMSwgLTEpKTsKLQkJCWdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0JCX0KLQkJaWYgKGlzT3BhcXVlKCkpCi0JCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBnZXRCb3VuZHMoKTsKLQkJZ3JhcGhpY3MudHJhbnNsYXRlKGJvdW5kcy54LCBib3VuZHMueSk7Ci0JCWlmIChpY29uICE9IG51bGwpCi0JCQlncmFwaGljcy5kcmF3SW1hZ2UoaWNvbiwgZ2V0SWNvbkxvY2F0aW9uKCkpOwotCi0JCWlmICghaXNFbmFibGVkKCkpIHsKLQkJCWdyYXBoaWNzLnRyYW5zbGF0ZSgxLCAxKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25MaWdodGVzdCk7Ci0JCQlncmFwaGljc2RyYXdUZXh0KGdyYXBoaWNzKTsKLQkJCWdyYXBoaWNzLmRyYXdUZXh0KGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0VGV4dExvY2F0aW9uKCkpOwotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKC0xLCAtMSk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uRGFya2VyKTsKLQkJfQotCQlncmFwaGljc2RyYXdUZXh0KGdyYXBoaWNzKTsKLQkJZ3JhcGhpY3MudHJhbnNsYXRlKC1ib3VuZHMueCwgLWJvdW5kcy55KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCdzIGljb24gdG8gdGhlIHBhc3NlZCBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbGFiZWwgaW1hZ2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvbihJbWFnZSBpbWFnZSkgewotCQlpZiAoaWNvbiA9PSBpbWFnZSkKLQkJCXJldHVybjsKLQkJaWNvbiA9IGltYWdlOwotCQkvLyBDYWxsIHJlcGFpbnQsIGluIGNhc2UgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIHRoZSBzYW1lLgotCQlyZXBhaW50KCk7Ci0JCWlmIChpY29uID09IG51bGwpCi0JCQlzZXRJY29uRGltZW5zaW9uKG5ldyBEaW1lbnNpb24oKSk7Ci0JCWVsc2UKLQkJCXNldEljb25EaW1lbnNpb24obmV3IERpbWVuc2lvbihpbWFnZSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGFsaWdubWVudCBvZiB0aGUgaWNvbiB3aXRoaW4gdGhlIGljb24gZGltZW5zaW9uLiBUaGUKLQkgKiBkaW1lbnNpb24gc2hvdWxkIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIEltYWdlIGl0c2VsZiwgc28gY2FsbGluZyB0aGlzCi0JICogbWV0aG9kIHNob3VsZCBoYXZlIG5vIGFmZmVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWxpZ24KLQkgKiAgICAgICAgICAgIHRoZSBpY29uIGFsaWdubWVudAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uQWxpZ25tZW50KGludCBhbGlnbikgewotCQlpZiAoaWNvbkFsaWdubWVudCA9PSBhbGlnbikKLQkJCXJldHVybjsKLQkJaWNvbkFsaWdubWVudCA9IGFsaWduOwotCQljbGVhckxvY2F0aW9ucygpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwncyBpY29uIHNpemUgdG8gdGhlIHBhc3NlZCBEaW1lbnNpb24uCi0JICogCi0JICogQHBhcmFtIGQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaWNvbiBzaXplCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb25EaW1lbnNpb24oRGltZW5zaW9uIGQpIHsKLQkJaWYgKGQuZXF1YWxzKGljb25TaXplKSkKLQkJCXJldHVybjsKLQkJaWNvblNpemUgPSBkOwotCQlyZXZhbGlkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ2FwIGluIHBpeGVscyBiZXR3ZWVuIHRoZSBsYWJlbCdzIGljb24gYW5kIHRleHQgdG8gdGhlIHBhc3NlZAotCSAqIHZhbHVlLiBUaGUgZGVmYXVsdCBpcyA0LgotCSAqIAotCSAqIEBwYXJhbSBnYXAKLQkgKiAgICAgICAgICAgIHRoZSBnYXAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvblRleHRHYXAoaW50IGdhcCkgewotCQlpZiAoaWNvblRleHRHYXAgPT0gZ2FwKQotCQkJcmV0dXJuOwotCQlpY29uVGV4dEdhcCA9IGdhcDsKLQkJcmVwYWludCgpOwotCQlyZXZhbGlkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSBlbnRpcmUgbGFiZWwgKGljb24gYW5kIHRleHQpLiBJZiB0aGlzIGZpZ3VyZSdzCi0JICogYm91bmRzIGFyZSBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBuZWVkZWQgdG8gZGlzcGxheSB0aGUgbGFiZWwsIHRoZSBsYWJlbAotCSAqIHdpbGwgYmUgYWxpZ25lZCBhY2NvcmRpbmdseS4gVmFsaWQgdmFsdWVzIGFyZToKLQkgKiA8VUw+Ci0JICogPExJPjxFTT57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQ0VOVEVSfTwvRU0+Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNUT1B9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNCT1RUT019Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNMRUZUfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjUklHSFR9Ci0JICogPC9VTD4KLQkgKiAKLQkgKiBAcGFyYW0gYWxpZ24KLQkgKiAgICAgICAgICAgIGxhYmVsIGFsaWdubWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsQWxpZ25tZW50KGludCBhbGlnbikgewotCQlpZiAobGFiZWxBbGlnbm1lbnQgPT0gYWxpZ24pCi0JCQlyZXR1cm47Ci0JCWxhYmVsQWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCdzIHRleHQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbGFiZWwgdGV4dAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzKSB7Ci0JCS8vICJ0ZXh0IiB3aWxsIG5ldmVyIGJlIG51bGwuCi0JCWlmIChzID09IG51bGwpCi0JCQlzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRleHQuZXF1YWxzKHMpKQotCQkJcmV0dXJuOwotCQl0ZXh0ID0gczsKLQkJcmV2YWxpZGF0ZSgpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSBUZXh0IHJlbGF0aXZlIHRvIHRoZSBpY29uLiBUaGUgdGV4dCBhbGlnbm1lbnQKLQkgKiBtdXN0IGJlIG9ydGhvZ29uYWwgdG8gdGhlIHRleHQgcGxhY2VtZW50LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHBsYWNlbWVudAotCSAqIGlzIEVBU1QsIHRoZW4gdGhlIHRleHQgY2FuIGJlIGFsaWduZWQgdXNpbmcgVE9QLCBDRU5URVIsIG9yIEJPVFRPTS4gVmFsaWQKLQkgKiB2YWx1ZXMgYXJlOgotCSAqIDxVTD4KLQkgKiA8TEk+PEVNPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1RPUH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0JPVFRPTX0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0xFRlR9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNSSUdIVH0KLQkgKiA8L1VMPgotCSAqIAotCSAqIEBzZWUgI3NldExhYmVsQWxpZ25tZW50KGludCkKLQkgKiBAcGFyYW0gYWxpZ24KLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGFsaWdubWVudAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0QWxpZ25tZW50KGludCBhbGlnbikgewotCQlpZiAodGV4dEFsaWdubWVudCA9PSBhbGlnbikKLQkJCXJldHVybjsKLQkJdGV4dEFsaWdubWVudCA9IGFsaWduOwotCQljbGVhckxvY2F0aW9ucygpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGxhY2VtZW50IG9mIHRleHQgcmVsYXRpdmUgdG8gdGhlIGxhYmVsJ3MgaWNvbi4gVmFsaWQgdmFsdWVzCi0JICogYXJlOgotCSAqIDxVTD4KLQkgKiA8TEk+PEVNPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNFQVNUfTwvRU0+Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNOT1JUSH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1NPVVRIfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjV0VTVH0KLQkgKiA8L1VMPgotCSAqIAotCSAqIEBwYXJhbSB3aGVyZQotCSAqICAgICAgICAgICAgdGhlIHRleHQgcGxhY2VtZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRQbGFjZW1lbnQoaW50IHdoZXJlKSB7Ci0JCWlmICh0ZXh0UGxhY2VtZW50ID09IHdoZXJlKQotCQkJcmV0dXJuOwotCQl0ZXh0UGxhY2VtZW50ID0gd2hlcmU7Ci0JCXJldmFsaWRhdGUoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCXByaXZhdGUgUmVjdGFuZ2xlIGdldFNlbGVjdGlvblJlY3RhbmdsZSgpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldFRleHRCb3VuZHMoKTsKLQkJYm91bmRzLmV4cGFuZChuZXcgSW5zZXRzKDIsIDIsIDAsIDApKTsKLQkJdHJhbnNsYXRlVG9QYXJlbnQoYm91bmRzKTsKLQkJYm91bmRzLmludGVyc2VjdChnZXRCb3VuZHMoKSk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgTGFiZWwncyB0ZXh0LiBOb3RlIHRoYXQgdGhpcwotCSAqIERpbWVuc2lvbiBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBMYWJlbCdzIGZ1bGwgdGV4dCwgcmVnYXJkbGVzcyBvZgotCSAqIHdoZXRoZXIgb3Igbm90IGl0cyB0ZXh0IGlzIGN1cnJlbnRseSB0cnVuY2F0ZWQuIElmIHRleHQgc2l6ZSBjb25zaWRlcmluZwotCSAqIGN1cnJlbnQgdHJ1bmNhdGlvbiBpcyBkZXNpcmVkLCB1c2Uge0BsaW5rICNjYWxjdWxhdGVTdWJTdHJpbmdUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIHRleHQsIGlnbm9yaW5nIHRydW5jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVUZXh0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJcmV0dXJuIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhnZXRXcmFwcGVkVGV4dCh3aWR0aCwgaGVpZ2h0KSwKLQkJCQlnZXRGb250KCkpOwotCX0KLQotCS8vIENvZGUgZm9yIHRoZSBUZXh0IFdyYXAuCi0JLy8gU3RhcnRzIGhlcmUuCi0KLQlwcml2YXRlIFN0cmluZyBnZXRXcmFwcGVkVGV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaWYgKCFpc1RleHRXcmFwcGVkKCkgfHwgd2lkdGggPT0gLTEpCi0JCQlyZXR1cm4gZ2V0VGV4dCgpOwotCi0JCWlmIChpc0ljb25FeGlzdCgpKSB7Ci0JCQlzd2l0Y2ggKHRleHRQbGFjZW1lbnQpIHsKLQkJCWNhc2UgRUFTVDoKLQkJCWNhc2UgV0VTVDoKLQkJCQl3aWR0aCAtPSBpY29uU2l6ZS53aWR0aCArIGdldEljb25UZXh0R2FwKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5PUlRIOgotCQkJY2FzZSBTT1VUSDoKLQkJCQlpZiAoaGVpZ2h0ICE9IC0xKQotCQkJCQloZWlnaHQgLT0gaWNvblNpemUuaGVpZ2h0ICsgZ2V0SWNvblRleHRHYXAoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUZvbnQgZiA9IGdldEZvbnQoKTsKLQkJaW50IG1heExpbmVzID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCWlmIChoZWlnaHQgIT0gLTEpIHsKLQkJCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGYpLmdldEhlaWdodCgpOwotCQkJbWF4TGluZXMgPSAoaW50KSAoaGVpZ2h0IC8gKGRvdWJsZSkgZm9udEhlaWdodCk7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYWNjdW1sYXRlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ0J1ZmZlciByZW1haW5pbmdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUZXh0KCkpOwotCQlpbnQgaSA9IDAsIGogPSAwOwotCi0JCXdoaWxlIChyZW1haW5pbmdUZXh0Lmxlbmd0aCgpID4gMCAmJiBqKysgPCBtYXhMaW5lcykgewotCQkJaWYgKChpID0gZ2V0TGluZVdyYXBQb3NpdGlvbihyZW1haW5pbmdUZXh0LnRvU3RyaW5nKCksIGYsIGhlaWdodCkpID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChhY2N1bWxhdGVkVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQocmVtYWluaW5nVGV4dC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJcmVtYWluaW5nVGV4dC5kZWxldGUoMCwgaSk7Ci0JCX0KLQkJcmV0dXJuIGFjY3VtbGF0ZWRUZXh0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSWNvbkV4aXN0KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRMaW5lV3JhcFBvc2l0aW9uKFN0cmluZyBzdHJpbmcsIEZvbnQgZiwgaW50IHdpZHRoKSB7Ci0JCUJyZWFrSXRlcmF0b3IgaXRlciA9IEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCk7Ci0JCWl0ZXIuc2V0VGV4dChzdHJpbmcpOwotCQlpbnQgc3RhcnQgPSBpdGVyLmZpcnN0KCk7Ci0JCWludCBlbmQgPSBpdGVyLm5leHQoKTsKLQotCQkvLyBpZiB0aGUgZmlyc3QgbGluZSBzZWdtZW50IGRvZXMgbm90IGZpdCBpbiB0aGUgd2lkdGgsCi0JCS8vIGRldGVybWluZSB0aGUgcG9zaXRpb24gd2l0aGluIGl0IHdoZXJlIHdlIG5lZWQgdG8gY3V0Ci0JCWlmIChGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKSwgZikud2lkdGggPiB3aWR0aCkgewotCQkJaXRlciA9IEJyZWFrSXRlcmF0b3IuZ2V0Q2hhcmFjdGVySW5zdGFuY2UoKTsKLQkJCWl0ZXIuc2V0VGV4dChzdHJpbmcpOwotCQkJc3RhcnQgPSBpdGVyLmZpcnN0KCk7Ci0JCX0KLQotCQkvLyBrZWVwIGl0ZXJhdGluZyBhcyBsb25nIGFzIHdpZHRoIHBlcm1pdHMKLQkJZG8KLQkJCWVuZCA9IGl0ZXIubmV4dCgpOwotCQl3aGlsZSAoZW5kICE9IEJyZWFrSXRlcmF0b3IuRE9ORQotCQkJCSYmIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLAotCQkJCQkJZikud2lkdGggPD0gd2lkdGgpOwotCQlyZXR1cm4gKGVuZCA9PSBCcmVha0l0ZXJhdG9yLkRPTkUpID8gaXRlci5sYXN0KCkgOiBpdGVyLnByZXZpb3VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFyZ2VzdCBzdWJzdHJpbmcgb2YgPGk+czwvaT4gaW4gRm9udCA8aT5mPC9pPiB0aGF0IGNhbiBiZQotCSAqIGNvbmZpbmVkIHRvIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIDxpPmF2YWlsYWJsZVdpZHRoPGk+LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgc3RyaW5nCi0JICogQHBhcmFtIGYKLQkgKiAgICAgICAgICAgIHRoZSBmb250Ci0JICogQHBhcmFtIGF2YWlsYWJsZVdpZHRoCi0JICogICAgICAgICAgICB0aGUgYXZhaWxhYmxlIHdpZHRoCi0JICogQHJldHVybiB0aGUgbGFyZ2VzdCBzdWJzdHJpbmcgdGhhdCBmaXRzIGluIHRoZSBnaXZlbiB3aWR0aAotCSAqIEBzaW5jZSAyLjAgQ29waWVkIGZyb20gPGNsYXNzPkZpZ3VyZVV0aWxpdGllczxjbGFzcz4gQ2xhc3MsIHRvIGF2b2lkCi0JICogICAgICAgIGNhbGwgb2Ygc3RhdGljLgotCSAqLwotCXN0YXRpYyBpbnQgZ2V0TGFyZ2VzdFN1YnN0cmluZ0NvbmZpbmVkVG8oU3RyaW5nIHMsIEZvbnQgZiwKLQkJCWludCBhdmFpbGFibGVXaWR0aCkgewotCQlGb250TWV0cmljcyBtZXRyaWNzID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGYpOwotCQlpbnQgbWluLCBtYXg7Ci0JCWZsb2F0IGF2ZyA9IG1ldHJpY3MuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQltaW4gPSAwOwotCQltYXggPSBzLmxlbmd0aCgpICsgMTsKLQotCQkvLyBUaGUgc2l6ZSBvZiB0aGUgY3VycmVudCBndWVzcwotCQlpbnQgZ3Vlc3MgPSAwLCBndWVzc1NpemUgPSAwOwotCQl3aGlsZSAoKG1heCAtIG1pbikgPiAxKSB7Ci0JCQkvLyBQaWNrIGEgbmV3IGd1ZXNzIHNpemUKLQkJCS8vIE5ldyBndWVzcyBpcyB0aGUgbGFzdCBndWVzcyBwbHVzIHRoZSBtaXNzaW5nIHdpZHRoIGluIHBpeGVscwotCQkJLy8gZGl2aWRlZCBieSB0aGUgYXZlcmFnZSBjaGFyYWN0ZXIgc2l6ZSBpbiBwaXhlbHMKLQkJCWd1ZXNzID0gZ3Vlc3MgKyAoaW50KSAoKGF2YWlsYWJsZVdpZHRoIC0gZ3Vlc3NTaXplKSAvIGF2Zyk7Ci0KLQkJCWlmIChndWVzcyA+PSBtYXgpCi0JCQkJZ3Vlc3MgPSBtYXggLSAxOwotCQkJaWYgKGd1ZXNzIDw9IG1pbikKLQkJCQlndWVzcyA9IG1pbiArIDE7Ci0KLQkJCS8vIE1lYXN1cmUgdGhlIGN1cnJlbnQgZ3Vlc3MKLQkJCWd1ZXNzU2l6ZSA9IEZpZ3VyZVV0aWxpdGllcwotCQkJCQkuZ2V0VGV4dEV4dGVudHMocy5zdWJzdHJpbmcoMCwgZ3Vlc3MpLCBmKS53aWR0aDsKLQotCQkJaWYgKGd1ZXNzU2l6ZSA8IGF2YWlsYWJsZVdpZHRoKQotCQkJCS8vIFdlIGRpZCBub3QgdXNlIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkJCQltaW4gPSBndWVzczsKLQkJCWVsc2UKLQkJCQkvLyBXZSBleGNlZWRlZCB0aGUgYXZhaWxhYmxlIHdpZHRoCi0JCQkJbWF4ID0gZ3Vlc3M7Ci0JCX0KLQkJcmV0dXJuIG1pbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRvIHdyYXAgdGV4dCBpbiBMYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdHJ1ZS9mYWxzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRXcmFwKGJvb2xlYW4gYikgewotCQlpZiAoaXNUZXh0V3JhcHBlZCgpID09IGIpCi0JCQlyZXR1cm47Ci0JCXNldEZsYWcoRkxBR19XUkFQLCBiKTsKLQkJcmV2YWxpZGF0ZSgpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0ZXh0IHdyYXAuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXh0V3JhcHBlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRleHQgd3JhcCB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgVGhlIGxhYmVsIHRleHQgd3JhcCB3aWR0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRXcmFwV2lkdGgoaW50IGkpIHsKLQkJaWYgKHRoaXMud3JhcFdpZHRoID09IGkpCi0JCQlyZXR1cm47Ci0JCXRoaXMud3JhcFdpZHRoID0gaTsKLQkJcmV2YWxpZGF0ZSgpOwotCQlyZXBhaW50KCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUZXh0IFdyYXAgQWxpZ25tZW50LCB1c2Ugb25seSBhZnRlciB1c2luZyA8bWV0aG9kPnNldFRleHRXcmFwKGJvb2xlYW4pPC9tZXRob2Q+Ci0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIFRoZSBsYWJlbCB0ZXh0IHdyYXBwaW5nIHdpZHRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXBBbGlnbm1lbnQoaW50IGkpIHsKLQkJaWYgKGdldFRleHRXcmFwQWxpZ25tZW50KCkgPT0gaSkKLQkJCXJldHVybjsKLQotCQlzZXRBbGlnbm1lbnRGbGFncyhpLCBGTEFHX1dSQVBfQUxJR04pOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogc2V0QWxpZ25tZW50RmxhZ3MKLQkgKiAKLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBhbGlnbgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGZsYWdPZmZzZXQKLQkgKiAKLQkgKiAtLS0gVE9ETyAtIGNvcGllZCBuZWVkcyB0byBtb2RpZnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWxpZ25tZW50RmxhZ3MoaW50IGFsaWduLCBpbnQgZmxhZ09mZnNldCkgewotCQlmbGFncyAmPSB+KDB4NyAqIGZsYWdPZmZzZXQpOwotCQlzd2l0Y2ggKGFsaWduKSB7Ci0JCWNhc2UgQ0VOVEVSOgotCQkJZmxhZ3MgfD0gMHgxICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIFRPUDoKLQkJCWZsYWdzIHw9IDB4MiAqIGZsYWdPZmZzZXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBMRUZUOgotCQkJZmxhZ3MgfD0gMHgzICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIFJJR0hUOgotCQkJZmxhZ3MgfD0gMHg0ICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIEJPVFRPTToKLQkJCWZsYWdzIHw9IDB4NSAqIGZsYWdPZmZzZXQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB3cmFwVmFsdWUKLQkgKiBAcmV0dXJuIFBvc2l0aW9uQ29uc3RhbnQgcmVwcmVzZW50aW5nIHRoZSBhbGlnbm1lbnQKLQkgKi8KLQlwcml2YXRlIGludCBnZXRBbGlnbm1lbnQoaW50IGZsYWdPZmZzZXQpIHsKLQkJaW50IHdyYXBWYWx1ZSA9IGZsYWdzICYgKDB4NyAqIGZsYWdPZmZzZXQpOwotCQlpZiAod3JhcFZhbHVlID09IDB4MSAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gQ0VOVEVSOwotCQllbHNlIGlmICh3cmFwVmFsdWUgPT0gMHgyICogZmxhZ09mZnNldCkKLQkJCXJldHVybiBUT1A7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDMgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIExFRlQ7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDQgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIFJJR0hUOwotCQllbHNlIGlmICh3cmFwVmFsdWUgPT0gMHg1ICogZmxhZ09mZnNldCkKLQkJCXJldHVybiBCT1RUT007Ci0KLQkJcmV0dXJuIENFTlRFUjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCB0ZXh0IHdyYXBwaW5nIHdpZHRoCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0V3JhcEFsaWdubWVudCgpIHsKLQkJcmV0dXJuIGdldEFsaWdubWVudChGTEFHX1dSQVBfQUxJR04pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGZvY3VzIHN0YXRlIG9mIHRoaXMgbGFiZWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLQkJcmV0dXJuIChmbGFncyAmIEZMQUdfSEFTRk9DVVMpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoaXMgbGFiZWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotCQlyZXR1cm4gKGZsYWdzICYgRkxBR19TRUxFQ1RFRCkgIT0gMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ3JhcGhpY3NkcmF3VGV4dChHcmFwaGljcyBncmFwaGljcykgewotCQlTdHJpbmcgc3ViU3RyaW5nID0gZ2V0U3ViU3RyaW5nVGV4dCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdWJTdHJpbmcsICJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJRm9udCBmID0gZ2V0Rm9udCgpOwotCQlpbnQgZm9udEhlaWdodCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKS5nZXRIZWlnaHQoKTsKLQkJaW50IHRleHRXaWR0aCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhzdWJTdHJpbmcsIGYpLndpZHRoOwotCQlpbnQgeSA9IGdldFRleHRMb2NhdGlvbigpLnk7Ci0KLQkJLy8gSWYgdGhlIGZvbnQncyBsZWFkaW5nIGFyZWEgaXMgMCB0aGVuIHdlIG5lZWQgdG8gYWRkIGFuIG9mZnNldCB0bwotCQkvLyBhdm9pZCB0cnVuY2F0aW5nIGF0IHRoZSB0b3AgKGUuZy4gS29yZWFuIGZvbnRzKQotCQlpZiAoMCA9PSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZikuZ2V0TGVhZGluZygpKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gMjsgLy8gMiBpcyB0aGUgbGVhZGluZyBhcmVhIGZvciBkZWZhdWx0IEVuZ2xpc2gKLQkJCXkgKz0gb2Zmc2V0OwotCQl9Ci0KLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGV4dCBhZGRlZCB0byBkcmF3IiArIHRva2VuKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHRva2VuV2lkdGggPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHModG9rZW4sIGYpLndpZHRoOwotCQkJaW50IHggPSBnZXRUZXh0TG9jYXRpb24oKS54OwotCQkJc3dpdGNoIChnZXRUZXh0V3JhcEFsaWdubWVudCgpKSB7Ci0JCQljYXNlIENFTlRFUjoKLQkJCQl4ICs9ICh0ZXh0V2lkdGggLSB0b2tlbldpZHRoKSAvIDI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJJR0hUOgotCQkJCXggKz0gdGV4dFdpZHRoIC0gdG9rZW5XaWR0aDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWdyYXBoaWNzLmRyYXdUZXh0KHRva2VuLCB4LCB5KTsKLQkJCXkgKz0gZm9udEhlaWdodDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvY3VzIHN0YXRlIG9mIHRoaXMgbGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdHJ1ZSB3aWxsIGNhdXNlIGEgZm9jdXMgcmVjdGFuZ2xlIHRvIGJlIGRyYXduIGFyb3VuZCB0aGUgdGV4dAotCSAqICAgICAgICAgICAgb2YgdGhlIExhYmVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoYm9vbGVhbiBiKSB7Ci0JCWlmIChoYXNGb2N1cygpID09IGIpCi0JCQlyZXR1cm47Ci0JCXNldEZsYWcoRkxBR19IQVNGT0NVUywgYik7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgdGhlIGxhYmVsIHRvIGFwcGVhciBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQlpZiAoaXNTZWxlY3RlZCgpID09IGIpCi0JCQlyZXR1cm47Ci0JCXNldEZsYWcoRkxBR19TRUxFQ1RFRCwgYik7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDhkZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBncmFwaGljYWwgZmlndXJlcyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvQW5jaG9yVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9BbmNob3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTFkYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9BbmNob3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFuY2hvcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbmNob3JVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0Q2xvc2VzdFBvaW50KFBvaW50W10gcG9pbnRzLCBQb2ludCBwb2ludCkgewotCQlpbnQgc2l6ZSA9IHBvaW50cy5sZW5ndGg7Ci0JCWRvdWJsZVtdIGRpc3RhbmNlcyA9IG5ldyBkb3VibGVbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlkaXN0YW5jZXNbaV0gPSBwb2ludHNbaV0uZ2V0RGlzdGFuY2UocG9pbnQpOwotCQl9Ci0JCXJldHVybiBwb2ludHNbbWluKGRpc3RhbmNlcyldOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IG1pbihkb3VibGVbXSBudW1iZXJzKSB7Ci0JCWlmIChudW1iZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlkb3VibGUgbWluID0gbnVtYmVyc1swXTsKLQkJaW50IGlkID0gMDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb3VibGUgbiA9IG51bWJlcnNbaV07Ci0JCQlpZiAobiA8IG1pbikgewotCQkJCW1pbiA9IG47Ci0JCQkJaWQgPSBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbnVtYmVycwotCSAqIEByZXR1cm4KLQkgKiAJCWluZGV4IG9mIHRoZSBzbWFsbGVzdCBudW1iZXIgaW4gdGhlIGdpdmVuIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGludFtdIG51bWJlcnMpIHsKLQkJaWYgKG51bWJlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWludCBtaW4gPSBudW1iZXJzWzBdOwotCQlpbnQgaWQgPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBuID0gbnVtYmVyc1tpXTsKLQkJCWlmIChuIDwgbWluKSB7Ci0JCQkJbWluID0gbjsKLQkJCQlpZCA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9Db25uZWN0aW9uQW5jaG9yTG9jYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9Db25uZWN0aW9uQW5jaG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjM0ZmY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLS8qKgotICogQ29uc3RyYWludCBmb3IgcGxhY2luZyBhbmNob3IgbG9jYXRpb24uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yIHsKLQotCS8qKgotCSAqIEdldHMgcmVsYXRpdmUgbG9jYXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIHJlZmVyZW5jZSBwb2ludAotCSAqIAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuIGFic29sdXRlIGxvY2F0aW9uCi0JICovCi0JUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWMzMWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUVkaXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVmFyeUFjdGl2aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotCi0vKioKLSAqIFByb3ZpZGVzIGluc3RydWN0dXJlIHRvIGxpc3RlbnMgdG8gYWN0aW9ucyBsaWtlIExvY2FsQ29udHJpYnV0aW9uLCBMb2NhbAotICogUmVwbGFjZSBpbiBXb3JrQnJlYWtkb3duIFN0cnVjdHVyZS4gTG9hZHMgYXQgdGltZSBvZiBwbHVnaW4gbG9hZC4KLSAqIAotICogQHNlZSBWYXJ5QWN0aXZpdHlDb21tYW5kCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1FZGl0b3JVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1FZGl0b3JVdGlsIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBjb21tYW5kTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBEaWFncmFtRWRpdG9yVXRpbCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1FZGl0b3JVdGlsIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChEaWFncmFtRWRpdG9yVXRpbC5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IERpYWdyYW1FZGl0b3JVdGlsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBnZXRWYXJ5Q29tbWFuZExpc3RlbmVycygpIHsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJY29tbWFuZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4oKTsKLQkJfQotCi0JCWNvbW1hbmRMaXN0ZW5lcnMuYWRkKG5ldyBJQ29tbWFuZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkvLyBHZXQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5LgotCQkJCU9iamVjdCB3cmFwcGVyID0gKChWYXJ5QWN0aXZpdHlDb21tYW5kKSBjb21tYW5kKS5nZXRXcmFwcGVyKCk7Ci0JCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5jbG9zZURpYWdyYW1FZGl0b3JzKHdyYXBwZXIsIAotCQkJCQkJbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpKTsKLQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLnJlZnJlc2hQYXJlbnREaWFncmFtRWRpdG9ycyh3cmFwcGVyLAotCQkJCQkJbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCkgewotCQkJCXJldHVybiBWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIEdldCBvbGQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5LgotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoVmFyeUFjdGl2aXR5Q29tbWFuZCkgY29tbWFuZCkuZ2V0UmVzdWx0KCk7Ci0KLQkJCQlMaXN0IGxpc3R4ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IHdyYXBwZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIuY2xvc2VEaWFncmFtRWRpdG9ycyh3cmFwcGVyLCAKLQkJCQkJCQluZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCkpOwotCQkJCQlsaXN0eC5jbGVhcigpOwotCQkJCX0KLQotCQkJfQotCQkJcHVibGljIHZvaWQgcHJlRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcG9zdFVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5yZWZyZXNoUGFyZW50RGlhZ3JhbUVkaXRvcnMoKChWYXJ5QWN0aXZpdHlDb21tYW5kKSBjb21tYW5kKS5zdXBlckFjdGl2aXR5LAotCQkJCQkJCW5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKSwgZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tbWFuZExpc3RlbmVyczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1VSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkZjkzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1VSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBSZXNvdXJjZSBDbGFzcyBmb3IgdGhlIEF1dGhvcmluZyBEaWFncmFtIChHRUYpIHBhY2thZ2VzLgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpYWdyYW1VSVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJldmlvdXNfbmFtZV9udWxsMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfbmFtZV9lbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fTGlua190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtX3NhdmVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVEaWFncmFtX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlRGlhZ3JhbV9wcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWxpZ25fYmVuZF9wb2ludF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21tYW5kX2Nhbm5vdEVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRGlhZ3JhbVVJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiY2U1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcHJldmlvdXNfbmFtZV9udWxsMT1VbmRvIG9mIGEgbmFtZSBjaGFuZ2UgaXMgbm90IGFsbG93ZWQgaWYgdGhlIHByZXZpb3VzIG5hbWUgaXMgbnVsbC4KLWVycl9uYW1lX2VtcHR5PVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotbW92ZUFjdGlvbl9sYWJlbD1Nb3ZlCi0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1TZWxlY3QKLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1TZWxlY3Qgbm9kZSBvciBsaW5rCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZT1BZGQgTm9kZQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZz1JWFJEMDAwMlc6IEFkZGluZyBhIG5vZGUgdG8gZGlhZ3JhbSBmYWlsZWQKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9TGluawotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVNlbGVjdCBMaW5rCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPUNyZWF0ZSBuZXcgbGluawotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PVN0YXJ0IE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IHN0YXJ0IG5vZGUKLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0PUZyZWUgVGV4dAotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9Q3JlYXRlIG5ldyBmcmVlIHRleHQKLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ9U3luY2hyb25pemF0aW9uIEJhcgotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1DcmVhdGUgbmV3IHN5bmNocm9uaXphdGlvbiBiYXIKLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1EZWNpc2lvbiBOb2RlCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9Q3JlYXRlIG5ldyBkZWNpc2lvbiBub2RlCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0PUVuZCBOb2RlCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PUFjdGl2aXR5IERldGFpbDoKLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA9Q3JlYXRlIG5ldyBlbmQgbm9kZQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWN0aXZpdHkKLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPUNyZWF0ZSBuZXcgYWN0aXZpdHkKLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcD1DcmVhdGUgbmV3IGl0ZXJhdGlvbgotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ9UGhhc2UKLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPUNyZWF0ZSBuZXcgcGhhc2UKLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0PVRhc2sgRGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9Um9sZSBEZXNjcmlwdG9yCi1Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeD1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtOgotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIG5ldyByb2xlIGRlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPUNyZWF0ZSBuZXcgdGFzayBkZXNjcmlwdG9yCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9RGVsaXZlcnkgUHJvY2VzcwotQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4PVBoYXNlCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ24KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0IFRleHQgQm94Li4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBBdmVyYWdlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBGaXJzdCBTZWxlY3RlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEF2ZXJhZ2UKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmVydGljYWxseSB0byBGaXJzdCBTZWxlY3RlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1TYXZlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPVNhdmluZyB7MH0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1Nb3ZlIE5vZGUKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1SZWZyZXNoIEZyb20gQmFzZQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9Q3JlYXRlIEJlbmRwb2ludAotCi1BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLXJlZnJlc2hBY3Rpb25fbGFiZWw9UmVmcmVzaAotcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsPVJlZnJlc2ggRnJvbSBCYXNlCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IFNhdmluZyBkaWFncmFtIGZhaWxlZAotCi1EZWxldGVEaWFncmFtX3RleHQ9RGVsZXRlIERpYWdyYW0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbG9zZSBhbmQgZGVsZXRlIHRoaXMgZGlhZ3JhbT9cblRoaXMgY2hhbmdlIGlzIHBlcm1hbmVudCBhbmQgY2Fubm90IGJlIHVuZG9uZS4KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1BbGlnbiBCZW5kIFBvaW50Ci1Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMD1Db25maWd1cmF0aW9uIEVkaXRvcgotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPUVycm9yIGluIHRoZSBub2RlJ3MgcHJvcGVydHkgdmFsdWUuCi1kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwPUVycm9yCi0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dD1SZXNldCBEaWFncmFtIExheW91dAotZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLWNvbW1hbmRfY2Fubm90RWRpdD1JVVBEMDAwM0U6IENhbm5vdCBlZGl0IGRpYWdyYW0KLQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPVBhcmVudCBFZGl0b3IgQ2xvc2VkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD17MH0gaGFzIGNsb3NlZC4gV291bGQgeW91IGFsc28gbGlrZSB0byBjbG9zZSB7MX0/CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1RlbXBsYXRlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1RlbXBsYXRlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OGYzMTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9UZW1wbGF0ZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCBpbiBhdXRob3JpbmcgZGlhZ3JhbQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlbXBsYXRlQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZID0gImFjdGl2aXR5IHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFUkFUSU9OID0gIml0ZXJhdGlvbiB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIQVNFID0gInBoYXNlIHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ0hfQkFSID0gInN5bmNob25pemF0aW9uIGJhciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0lTSU9OX05PREUgPSAiZGVjaXNpb24gbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX05PREUgPSAic3RhcnQgbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9OT0RFID0gImVuZCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUID0gIndvcmsgcHJvZHVjdCB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfREVTQ1JJUFRPUiA9ICJyb2xlIGRlc2NyaXB0b3IgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFU0NSSVBUT1IgPSAidGFzayBkZXNjcmlwdG9yIHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSAid29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkVFX1RFWFQgPSAiZnJlZSB0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVE9ETzogbW92ZSB0aGVzZSBjb25zdGFudHMgdG8gb3RoZXIgZmlsZS4gVGhpcyBjbGFzcyBkZWZpbmUgb25seSB0ZW1wbGF0ZQotCS8vIGNvbnN0YW50cwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9OQU1FID0gInByb3BlcnR5X2ZvbnRfbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfU1RZTEUgPSAicHJvcGVydHlfZm9udF9zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfSEVJR0hUID0gInByb3BlcnR5X2ZvbnRfaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9SRUQgPSAicHJvcGVydHlfZm9udF9yZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX0JMVUUgPSAicHJvcGVydHlfZm9udF9ibHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9HUkVFTiA9ICJwcm9wZXJ0eV9mb250X2dyZWVuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRm9yIGRlZmF1bHQgZm9udHMuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GT05UX05BTUUgPSBnZXRGb250TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9GT05UX1NJWkUgPSA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IERFRkFVTFRfRk9OVCA9IG5ldyBGb250KG51bGwsIERFRkFVTFRfRk9OVF9OQU1FLAotCQkJREVGQVVMVF9GT05UX1NJWkUsIGphdmEuYXd0LkZvbnQuUExBSU4pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IERFRkFVTFRfRk9OVF9JVEFMSUMgPSBuZXcgRm9udChudWxsLAotCQkJREVGQVVMVF9GT05UX05BTUUsIERFRkFVTFRfRk9OVF9TSVpFLCBqYXZhLmF3dC5Gb250LklUQUxJQyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5fMksgPSAiV2luZG93cyAyMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9udE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIkFyaWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENvcnJ1cHRlZCBKYXBhbmVzZSBjaGFyYWN0ZXJzIGluIEFjdGl2aXR5IERpYWdyYW1zCi0JCVN0cmluZyBjdXJyZW50TG9jYWxlID0gUGxhdGZvcm0uZ2V0TkwoKTsKLQkJaWYgKGN1cnJlbnRMb2NhbGUgIT0gbnVsbAotCQkJCSYmIGN1cnJlbnRMb2NhbGUuc3RhcnRzV2l0aChMb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKSkpIHsKLQkJCWlmIChXSU5fMksuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfUk9MRV9UQVNLU19CT1hfQkdfQ09MT1JfUkdCID0gIkFERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1dQX0JPWF9CR19DT0xPUl9SR0IgPSAiQUREX1dQX0JPWF9CR19DT0xPUl9SR0IiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1ZhbGlkYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGIxOWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogVmFsaWRhdGluZyByb3V0aW5lcyBmb3IgZGlhZ3JhbSBlZGl0aW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19DYW5Ob3RDb25uZWN0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX0Nhbk5vdERlbGV0ZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ7IAotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHVzZXIgY2FuIGNvbm5lY3QgdGhlIGdpdmVuIG5vZGVzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybiBudWxsIGlmIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCwgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCkgewotCQlpZiAoc291cmNlLmdldERpYWdyYW0oKSAhPSB0YXJnZXQuZ2V0RGlhZ3JhbSgpKQotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OwotCi0JCWlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChzb3VyY2UuZ2V0RGlhZ3JhbSgpCi0JCQkJCS5nZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCU9iamVjdCBwcm9jID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcHJvYyA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRUb3BJdGVtKCk7Ci0JCQl9Ci0JCQkvLyBnZXQgYWxsIGJyZWFrZG93biBlbGVtZW50cyBpbiB0aGlzIHByb2Nlc3MKLQkJCUxpc3Q8T2JqZWN0PiBhbGxFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQlwcm9jKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWFsbEVsZW1lbnRzLmFkZChUbmdVdGlsLnVud3JhcChvYmopKTsKLQkJCX0KLQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkvLyBJZiB0YXJnZXQgaXMgUmVhZE9ubHkgKG1lYW5zIGV4dGVuZHMpIGFuZCBhbGxvdyB0aGUgbGluayBpZgotCQkJCS8vIGl0cyBwYXJlbnQgYWN0aXZpdHkgaXMgYSBDb250cmlidXRvcgotCQkJCWlmICh0YXJnZXQuZ2V0RGlhZ3JhbSgpLmlzUmVhZE9ubHkoKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCWlmIChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlpZiAodGFyZ2V0LmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzb3VyY2UuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJfQotCQkJCQkJaWYgKHRhcmdldC5pc1JlYWRPbmx5KCkpCi0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQkJLy8gc2hvdWxkIG5vdCBhbGxvdyBpbmNvbWluZyBjb25uZWN0aW9uIHRvIHN0YXJ0IG5vZGUKLQkJCQkJCS8vIGFuZCBGcmVlVGV4dC4KLQkJCQkJCWlmICgoKFR5cGVkTm9kZSkgdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNUQVJUCi0JCQkJCQkJCXx8ICgoVHlwZWROb2RlKSB0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJfQotCi0JCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgdGFyZ2V0LAotCQkJCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzb3VyY2UKLQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJCWlmIChub2RlLmlzUmVhZE9ubHkoKSkKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKAotCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpLAotCQkJCQkJCQkJcHJlZCwgYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCWlmICh0YXJnZXQgPT0gc291cmNlKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQkJCQkJLy8gc2hvdWxkIG5vdCBhbGxvdyBvdXRnb2luZyBjb25uZWN0aW9uIGZyb20gRW5kIE5vZGUgYW5kCi0JCQkJCS8vIEZyZWUgVGV4dAotCQkJCQlpZiAoKChUeXBlZE5vZGUpIHNvdXJjZSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5FTkQKLQkJCQkJCQl8fCAoKFR5cGVkTm9kZSkgc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQl9Ci0KLQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCi0JCQkJCQkvKgotCQkJCQkJICogSWYgc291cmNlIGFuZCB0YXJnZXQgYXJlIFR5cGVkTm9kZXMsIGF2b2lkIGNpcmN1bGFyCi0JCQkJCQkgKiBsb29wIGNvbm5lY3Rpb24uCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChjaGVja1N5bmNCYXJDaXJjdWxhckxvb29wKChUeXBlZE5vZGUpIHNvdXJjZSwKLQkJCQkJCQkJKFR5cGVkTm9kZSkgdGFyZ2V0KSAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJfQotCi0JCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IGluY29taW5nIGNvbm5lY3Rpb24gdG8gc3RhcnQgbm9kZQotCQkJCQkJLy8gYW5kIEZyZWVUZXh0LgotCQkJCQkJaWYgKCgoVHlwZWROb2RlKSB0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1RBUlQKLQkJCQkJCQkJfHwgKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCUNvbGxlY3Rpb24gc3JjTm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBzb3VyY2UsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCWlmICghc3JjTm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJCS5nZXRUYXJnZXROb2RlcygoVHlwZWROb2RlKSB0YXJnZXQsCi0JCQkJCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQkJCWlmIChub2RlLmlzUmVhZE9ubHkoKSkKLQkJCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYyA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY05vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgaXRlcmF0b3IKLQkJCQkJCQkJCQkJLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcihzdWNjLCBwcmVkLAotCQkJCQkJCQkJCQlhbGxFbGVtZW50cykpIHsKLQkJCQkJCQkJCQlyZXR1cm4gZXJyTXNnX1NhbWVQcmVkQW5kU3VjYzsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQotCQkJCQkJaWYgKHRhcmdldC5pc1JlYWRPbmx5KCkpCi0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCi0JCQkJCQlDb2xsZWN0aW9uIHNyY05vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkuZ2V0U291cmNlTm9kZXMoKFR5cGVkTm9kZSkgc291cmNlLAotCQkJCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE5vZGUpIHRhcmdldCkKLQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY05vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgKChOb2RlKSBpdGVyYXRvcgotCQkJCQkJCQkJLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoc3VjYywgcHJlZCwKLQkJCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX1NhbWVQcmVkQW5kU3VjYzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlpZiAoc291cmNlLmlzUmVhZE9ubHkoKSB8fCB0YXJnZXQuaXNSZWFkT25seSgpKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJfQotCi0JCQlpZiAoKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IHRhcmdldAotCQkJCQkuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJfHwgKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yICYmIHRhcmdldAotCQkJCQkJCS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKQotCQkJCQl8fCAoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICYmIHRhcmdldAotCQkJCQkJCS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGNoZWNrIGZvciBkdXBsaWNhdGUgY29ubmVjdGlvbgotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpID09IHRhcmdldCkgewotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0gZWxzZSBpZiAoc291cmNlLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsKLQkJCWlmIChzb3VyY2UuaXNSZWFkT25seSgpIHx8IHRhcmdldC5pc1JlYWRPbmx5KCkpIHsKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0RlbGV0ZShMaW5rIGxpbmspIHsKLQotCQkvLyBpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsCi0JCS8vICYmIGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCS8vIGlmIChsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSl7Ci0JCS8vIGlmKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkvLyBpZigoKFR5cGVkTm9kZSlsaW5rLmdldFNvdXJjZSgpKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKXsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJLy8gfQotCQkvLyBpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkvLwkJCQkKLQkJLy8gVHlwZWROb2RlIHR5cGVkbm9kZSA9IChUeXBlZE5vZGUpbGluay5nZXRUYXJnZXQoKTsKLQkJLy8gaWYodHlwZWRub2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyBpZihsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJLy8gdHlwZWRub2RlID0gKFR5cGVkTm9kZSlsaW5rLmdldFNvdXJjZSgpOwotCQkvLyBpZih0eXBlZG5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8JCQkJCi0JCS8vIGlmIChsaW5rLmdldFNvdXJjZSgpLmlzUmVhZE9ubHkoKSkKLQkJLy8gcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCS8vCQkJCQotCQkvLyBpZiAobGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCS8vIHx8IChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlICYmICFHcmFwaGljYWxEYXRhSGVscGVyCi0JCS8vIC5nZXRTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBsaW5rLmdldFNvdXJjZSgpLAotCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpCi0JCS8vIC5pc0VtcHR5KCkpKSB7Ci0JCS8vCQkJCQkKLQkJLy8gQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9Ci0JCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSwKLQkJLy8gV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJLy8gaWYgKG5vZGUuaXNSZWFkT25seSgpKSB7Ci0JCS8vIHJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQkvLyB9Ci0JCS8vIGlmIChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCS8vIFR5cGVkTm9kZSB0eXBlZG5vZGUgPSAoVHlwZWROb2RlKWxpbmsuZ2V0U291cmNlKCk7Ci0JCS8vIGlmKHR5cGVkbm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKXsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuaXNSZWFkT25seSgpKQotCQkvLyByZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJLy8gfQotCQkvLyB9IGVsc2UgaWYgKChsaW5rLmdldFRhcmdldCgpICE9IG51bGwgJiYKLQkJLy8gbGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpCi0JCS8vIHx8IChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwgJiYgbGluay5nZXRTb3VyY2UoKS5pc1JlYWRPbmx5KCkpKSB7Ci0JCS8vIHJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkvLyB9Ci0JCS8vIHJldHVybiBudWxsOwotCi0JCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCi0JCS8vIFNwZWNpYWwgaGFuZGxlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBsaW5rcyBjYW5ub3QgYmUgZGVsZXRlZC4KLQkJaWYgKHRhcmdldCAhPSBudWxsCi0JCQkJJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCX0KLQotCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCi0JCQkvLyBUYXJnZXQgPSBicmVha2Rvd25lbGVtZW50Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJLy8gU291cmNlID0gQnJlYWtkb3duIGVsZW1lbnQKLQkJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gU291cmNlID0gVHlwZWROb2RlCi0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQkvLyBTb3VyY2UgPSBEZWNpc2lvbiBOb2RlCi0JCQkJCVR5cGVkTm9kZSBzb3VyY2VOb2RlID0gKFR5cGVkTm9kZSkgc291cmNlOwotCQkJCQlpZiAoIXRhcmdldC5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9IGVsc2UgaWYgKHNvdXJjZU5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTikgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0gZWxzZSBpZiAoc291cmNlTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCQkJcmV0dXJuIGNoZWNrU3luY0JhckluY29taW5nTGlua3Moc291cmNlTm9kZSk7Ci0JCQkJCX0gZWxzZSBpZiAoc291cmNlTm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCQl9Ci0JCQkJfQotCQkJfS8vIFRhcmdldCBpcyBUeXBlZE5vZGUKLQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCi0JCQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpIHRhcmdldDsKLQkJCQkvLyBpZiBUYXJnZXQgaXMgVHlwZWROb2RlIGFuZCBpdHMgYSBEZWNpc2lvblBvaW50IC0gc2hvdWxkIGJlCi0JCQkJLy8gYmxhY2suCi0JCQkJaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkvLyBJZiBUYXJnZXQgaXMgVHlwZWROb2RlIGFuZCBhbmQgU291cmNlIGlzIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkJLy8gYW5kIHJlYWRvbmx5Ci0JCQkJLy8gTGluayBzaG91bGQgYmUgZ3JlZW4uCi0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCQkvLyBDaGVjayBUYXJnZXQgLSBpcyBoYXZpbmcgYW55IGluZGlyZWN0KG91dGdvaW5nCi0JCQkJCS8vIGNvbm5uZWN0aW9uKSBjb250YWlucyBkZWNpc2lvbiBwb2ludHMuCi0JCQkJCWlmIChjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKChUeXBlZE5vZGUpIHRhcmdldCkgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQlpZiAoc291cmNlLmlzUmVhZE9ubHkoKSkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCVR5cGVkTm9kZSBzb3VyY2VUeXBlZE5vZGUgPSAoVHlwZWROb2RlKSBzb3VyY2U7Ci0JCQkJCS8vIFNvdXJjZSBpcyBUeXBlZCBOb2RlIGFuZCBpdHMgYSBkZWNpc2lvbiBwb2ludCByZXR1cm4KLQkJCQkJLy8gbnVsbC4KLQkJCQkJaWYgKHNvdXJjZVR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQkvLyBpZiBzb3VyY2UgaXMgU3luY0JhciBhbmQgY2hlY2sgYWxsIGl0cyBpbmNvbWluZwotCQkJCQkvLyBjb25uZWN0aW9ucy4KLQkJCQkJaWYgKHNvdXJjZVR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCQkJcmV0dXJuIGNoZWNrU3luY0JhckluY29taW5nTGlua3Moc291cmNlVHlwZWROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0RlbGV0ZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG5vZGUuZ2V0RGlhZ3JhbSgpOwotCQlpZiAoZGlhZ3JhbSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXJnZXROb2RlcygKLQkJCQkJCShUeXBlZE5vZGUpIG5vZGUsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgdGFyZ2V0ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAodGFyZ2V0LmlzUmVhZE9ubHkoKSkgewotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZGlhZ3JhbSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSb2xlTm9kZSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUmVjb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCwgTGluayBsaW5rKSB7Ci0JCWlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuaXNSZWFkT25seSgpKSB7Ci0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQkJQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIGxpbmsuZ2V0VGFyZ2V0KCksCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tDb25uZWN0KHNvdXJjZSwgdGFyZ2V0LCBsaW5rKTsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB3aWxsIG5vdCBhbGxvdyBtdWx0aXBsZSBsaW5rIGJldHdlZW4gdHdvIG5vZGVzLiBOZWVkcyB0byBjYWxsCi0JICogQ3JlYWtMaW5rQ29tbWFuZCBhbmQgUmVjb25uZWN0TGlua0NvbW1hbmQuIEFueSBhY3Rpb24gb24gYSBMaW5rIHNob3VsZAotCSAqIGNhbGwgdGhpcyBjaGVja0Nvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIGJlZm9yZSBhbGxvdwotCSAqIHRvIGNvbm5lY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCwgTGluayBsaW5rKSB7Ci0KLQkJaWYgKHNvdXJjZSA9PSB0YXJnZXQgJiYgIShzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJfQotCi0JCUxpc3QgbGlua3MgPSBzb3VyY2UuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCQlpZiAobGlua3MgIT0gbnVsbCkgewotCQkJLy8gVGhpcyBpcyBuZWVkIGZvciByZWNvbm5lY3QgdG8gc2FtZSB0YXJnZXQgbm9kZS4KLQkJCWlmIChsaW5rcy5jb250YWlucyhsaW5rKSkgewotCQkJCWlmIChsaW5rLmdldFRhcmdldCgpLmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCS8vIFRoaXMgaXMgbmVlZCBmb3IgbmV3IGNvbm5lY3QgYW5kIHJlY29ubmVjdCB0byBkaWZmZXJlbnQgdGFyZ2V0Ci0JCQkvLyBub2RlLgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlua3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5reCA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgbGlua3h0YXJnZXQgPSBsaW5reC5nZXRUYXJnZXQoKTsKLQkJCQlpZiAobGlua3h0YXJnZXQgIT0gbnVsbCAmJiBsaW5reHRhcmdldC5lcXVhbHModGFyZ2V0KSkgewotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQpOwotCX0KLQotCS8qCi0JICogVG8gYXZvaWQgY2lyY3VsYXIgbG9vcGluZyBiZXR3ZWVuIHN5bmNocm9uaXphdGlvbiBiYXJzLiBJZiBTeWNuQmFyMSAtPgotCSAqIFN5bmNCYXIyIChjb25uZWN0ZWQpIHRoZW4gU3luY0JhcjIgLT4gU3luY0JhcjEgY2Fubm90IGNvbm5lY3QuIGlmCi0JICogc3luY2JhcjEgLT4gc3luY2JhcjItPnN5bmNiYXIzIHRoZW4gc3luY2JhcjMgLT4gc3luY2JhcjEgZGlzYWxsb3dlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1N5bmNCYXJDaXJjdWxhckxvb29wKFR5cGVkTm9kZSBzTm9kZSwKLQkJCVR5cGVkTm9kZSB0Tm9kZSkgewotCQlMaXN0IGxpc3QgPSB0Tm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCWlmICghbGlzdC5pc0VtcHR5KCkgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlOb2RlIHR5cGVkbm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKHNOb2RlLmVxdWFscyh0eXBlZG5vZGUpKQotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJaWYgKHR5cGVkbm9kZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcChzTm9kZSwKLQkJCQkJCQkoVHlwZWROb2RlKSB0eXBlZG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB0byBDaGVjayBpZiBTeW5jQmFyIGluQ29tbWluZyBjb25uZWN0aW9ucyBoYXZlIGFueSBzb3VyY2UgaXMgYQotCSAqIHJlYWRvbmx5LiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhUeXBlZE5vZGUgdHlwZWROb2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJaWYgKHNvdXJjZS5pc1JlYWRPbmx5KCkpCi0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlpZiAoKChUeXBlZE5vZGUpIHNvdXJjZSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpCi0JCQkJCWlmIChjaGVja1N5bmNCYXJJbmNvbWluZ0xpbmtzKChUeXBlZE5vZGUpIHNvdXJjZSkgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIGNoZWNrIGlmIHN5bmNocm9uaXphdGlvbiBiYXIgb3V0Z29pbmcgY29ubmVjdGlvbiBoYXMgYW55IHRhcmdldAotCSAqIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3luY0Jhck91dGdvaW5nTGlua3MoVHlwZWROb2RlIHR5cGVkTm9kZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCWlmICh0YXJnZXQuaXNSZWFkT25seSgpKQotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJaWYgKCgoVHlwZWROb2RlKSB0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQlpZiAoY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcygoVHlwZWROb2RlKSB0YXJnZXQpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgbGluayBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkT25seShMaW5rIGxpbmspIHsKLQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlyZXR1cm4gY2hlY2tEZWxldGUobGluaykgIT0gbnVsbDsKLQkJfSBlbHNlIGlmICh0YXJnZXQgIT0gbnVsbAotCQkJCSYmIHRhcmdldC5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmICgoc291cmNlICE9IG51bGwgJiYgc291cmNlIGluc3RhbmNlb2YgVGFza05vZGUgJiYgc291cmNlCi0JCQkJCS5pc1JlYWRPbmx5KCkpCi0JCQkJCXx8ICh0YXJnZXQgaW5zdGFuY2VvZiBUYXNrTm9kZSAmJiB0YXJnZXQuaXNSZWFkT25seSgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTk4YTZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmYjg2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TV1RHcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkxheWVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBncmFwaGljYWwgdmlld2VyIG9mIHRoZSBlbGVtZW50IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByb3RlY3RlZCBPYmplY3Qgd3JhcHBlcjsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdyYXBoaWNhbFZpZXdlciBvbiB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcigpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdyYXBoaWNhbCB2aWV3ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgZ3JhcGhpY2FsIHZpZXdlcgotCSAqLwotCXByb3RlY3RlZCBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoCi0JCQkJQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCQlTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCByb290ID0gbmV3IFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQoKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJLy8gZmluZCB0aGUgZmlndXJlIHRvIGJlIHNhdmVkCi0JCUxheWVyTWFuYWdlciBsbSA9IChMYXllck1hbmFnZXIpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCUxheWVyTWFuYWdlci5JRCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gbG0uZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwcHJlc3Npb25Ub0RpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU9iamVjdCBlID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFncmFtIGZvciBnaXZlbiBvYmplY3QgKG9ubHkgZm9yIHtAbGluayBBY3Rpdml0eX0gYW5kIHBhY2tzIHRoZSBib3VuZHMuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIgCXtAbGluayBPYmplY3R9IAkKLQkgKiBAcGFyYW0gbmVlZFJlc2V0IGJvb2xlYW4KLQkgKiBAcGFyYW0gZmlsdGVyIAl7QGxpbmsgSUZpbHRlcn0KLQkgKiBAcGFyYW0gc3VwCQl7QGxpbmsgU3VwcHJlc3Npb259Ci0JICovCi0JcHVibGljIEVkaXRQYXJ0IGxvYWREaWFncmFtKE9iamVjdCB3cmFwcGVyLCBib29sZWFuIG5lZWRSZXNldCwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgdmlld2VyIHdpdGggdGhlIGVkaXQgcGFydAotCQlFZGl0UGFydCBlZGl0UGFydCA9IGNyZWF0ZUVkaXRQYXJ0KHdyYXBwZXIsIGZpbHRlciwgc3VwKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCi0JCS8vIGFzayBmb3IgaW1tZWRpYXRlIHVwZGF0ZSBvZiB0aGUgY29udHJvbCBzbyB0aGF0IHRoZSBkaWFncmFtIGZpZ3VyZQotCQkvLyB3aWxsIGJlIGNvbXB1dGVkCi0JCXBhcmVudC5wYWNrKHRydWUpOwotCi0JCS8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIGZvciBicm93c2luZywgaW4gb3JkZXIgdG8gcmVuZGVyIGFjdGl2aXR5IGNvbnRyaWJ1dGluZydzCi0JCS8vIGNoaWxkcmVuLiAgSW4gcHJvY2Vzc0F1dGhvcmluZyB3ZSBkb24ndCBkbyByZWFsaXphdGlvbiwgaW4gb3JkZXIgdG8gZGlzcGxheWVkIAotCQkvLyByZWFsaXplZCBlbGVtZW50cywgd2UgaGF2ZSB0byBjbGVhbnVwIEFERCBkaWFncmFtIGFuZCByZWNyZWF0ZS4gbmVlZHRvUmVzZXQgb3IgY2xlYW51cGRpYWdyYW0uCi0JCS8vIE9ubHkgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLgotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZihvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmIGdldERpYWdyYW1UeXBlKCkgIT0gbnVsbCAmJiAKLQkJCQlnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpewotCQkJaWYoVG5nVXRpbC5oYXNDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KW8pKXsKLQkJCQluZWVkUmVzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmVlZFJlc2V0KSB7Ci0JCQljbGVhblVwRGlhZ3JhbSgpOwotCQl9Ci0KLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQkJaWYgKGZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQmVmb3JlIHVwZGF0ZTogRGlhZ3JhbSBCb3VuZHMgPSAiICsgYm91bmRzKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJvdW5kcy54IDwgMCB8fCBib3VuZHMueSA8IDApIHsKLQkJCQkoKERpYWdyYW1FZGl0UGFydCkgZWRpdFBhcnQpLm1vdmVGaWd1cmUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCi0JCQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0KLQkJCQlib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFmdGVyIHVwZGF0ZTogRGlhZ3JhbSBCb3VuZHMgPSAiICsgYm91bmRzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlsb2FkRGlhZ3JhbUluZm8oKEdyYXBoaWNhbEVkaXRQYXJ0KSBvLCBkaWFncmFtSW5mbyk7Ci0JCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIG87Ci0JCQkJT2JqZWN0IG1vZGVsID0gcGFydC5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBlID0gbW9kZWw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCQkJZSA9ICgoTGlua2VkT2JqZWN0KSBlKS5nZXRPYmplY3QoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlib29sZWFuIHN1cHByZXNzZWQ7Ci0JCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTmFtZWROb2RlKSBtb2RlbCkuaXNTdXBwcmVzc2VkKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJCUlGaWd1cmUgZiA9IHBhcnQuZ2V0RmlndXJlKCk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZi5nZXRCb3VuZHMoKTsKLQotCQkJCQkJU3RyaW5nIGFsdFRhZyA9IG51bGw7Ci0JCQkJCQlpZiAoZiBpbnN0YW5jZW9mIFNlbGVjdGFibGVMYWJlbCkgewotCQkJCQkJCWFsdFRhZyA9ICgoU2VsZWN0YWJsZUxhYmVsKSBmKS5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlkaWFncmFtSW5mby5hZGRBcmVhKChNZXRob2RFbGVtZW50KSBlLCBib3VuZHMueCwKLQkJCQkJCQlib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBhbHRUYWcsIHN1cHByZXNzZWQpOwotCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVkaXRQYXJ0IG5vdCBoYW5kbGVkOiAiICsgbyk7Ci0JCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB7QGxpbmsgRGlhZ3JhbUluZm99Ci0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIGdldERpYWdyYW1JbmZvKCkgewotCQlEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgdGhpcy5ncmFwaGljYWxWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQllbGVtZW50ID0gKChMaW5rZWRPYmplY3QpIGVsZW1lbnQpLmdldE9iamVjdCgpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJZGlhZ3JhbUluZm8gPSBuZXcgRGlhZ3JhbUluZm8oZ2V0RGlhZ3JhbVR5cGUoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJbG9hZERpYWdyYW1JbmZvKHBhcnQsIGRpYWdyYW1JbmZvKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWdyYW0gaW1hZ2UgZnJvbSBmaWd1cmUgY3JlYXRlZCBpbiBsb2FkRGlhZ3JhbSBtZXRob2QuCi0JICogCi0JICovCi0JcHVibGljIEltYWdlIGNyZWF0ZURpYWdyYW1JbWFnZSgpIHsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQotCQlTV1RHcmFwaGljcyBncmFwaGljcyA9IG51bGw7Ci0JCUdDIGdjID0gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCQkJaW50IGhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7Ci0JCQlpbnQgd2lkdGggPSBib3VuZHMud2lkdGg7Ci0KLQkJCS8vIGNyZWF0ZSBhIG5ldyBpbWFnZSBhbmQgcmVwYWludCB0aGUgZ3JhcGgKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0JCQlnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCQlncmFwaGljcyA9IG5ldyBTV1RHcmFwaGljcyhnYyk7Ci0JCQlmaWd1cmUucGFpbnQoZ3JhcGhpY3MpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZWxlYXNlIHJlc291cmNlcwotCQkJaWYgKGdyYXBoaWNzICE9IG51bGwpCi0JCQkJZ3JhcGhpY3MuZGlzcG9zZSgpOwotCQkJaWYgKGdjICE9IG51bGwpCi0JCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpIHsKLQkJCQlDb250cm9sIGN0cmwgPSBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCWlmIChjdHJsICE9IG51bGwpIHsKLQkJCQkJY3RybC5kaXNwb3NlKCk7Ci0JCQkJfQotCi0JCQkJZ3JhcGhpY2FsVmlld2VyID0gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCVN1cHByZXNzaW9uIHN1cCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWdyYW1UeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwODE1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUFjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtVXBkYXRlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgQWN0aXZpdHlEZXRhaWwgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsvLwotCQlkaWFncmFtLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoc3VwICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJfQotCi0JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KAotCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIGRpYWdyYW0pOwotCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY2xlYW5VcERpYWdyYW0oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoZGVwLmdldENoaWxkcmVuKCkpOwotCi0JCS8vIGNsZWFuIHVwIHRoZSBkaWFncmFtCi0JCURlZmF1bHRFZGl0RG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4obnVsbCk7Ci0JCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5ID0gbmV3IEFjdGlvblJlZ2lzdHJ5KCk7Ci0KLQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uU2VydmljZSgKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZWRpdGluZ0RvbWFpbiwgYWN0aW9uUmVnaXN0cnkpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQotCQlEaWFncmFtVXBkYXRlU2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGVhZTg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFByb3ZpZGVzIHNlcnZpY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcgZGlhZ3JhbSBpbWFnZXMgZm9yIGFjdGl2aXR5IGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGltcGxlbWVudHMgSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50ID0gbnVsbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGhvbGRlciA9IG51bGw7Ci0KLQlwcml2YXRlIEZpbGUgcHViRGlyOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaFVuY3JlYXRlZEFERCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gdHJ1ZTsKLQotCXN0YXRpYyB7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVywgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pKTsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCwgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSk7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEludFR5cGUoU3RyaW5nIGRpYWdyYW1UeXBlKSB7Ci0JCUludGVnZXIgdHlwZSA9IChJbnRlZ2VyKSB0eXBlTWFwLmdldChkaWFncmFtVHlwZSk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXJldHVybiB0eXBlLmludFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JU2hlbGwgc2hlbGwgPSBudWxsOwotCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoKSB7Ci0JCXRoaXMobnVsbCwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtU2VydmljZShGaWxlIHB1YkRpcikgewotCQl0aGlzKG51bGwsIHB1YkRpcik7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoQ29tcG9zaXRlIHBhcmVudCwgRmlsZSBwdWJEaXIpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIGdldERpYWdyYW1WaWV3ZXIoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCS8vIGlmIHRoZSBzaGVsbCB3aW5kb3cgaXMgZGlzdHJveWVkLCByZWNyZWF0ZSBpdAotCQlpZiAoKHRoaXMuc2hlbGwgIT0gbnVsbCkgJiYgdGhpcy5zaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMucGFyZW50ID0gbnVsbDsKLQkJCXRoaXMuc2hlbGwgPSBudWxsOwotCQl9Ci0KLQkJZ2V0Vmlld2VySG9sZGVyKHBhcmVudCk7Ci0KLQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1WaWV3ZXIoaG9sZGVyKTsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyKGhvbGRlcik7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBuZXcgV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlcihob2xkZXIpOwotCQkJCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3ZXJIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsID0gY3JlYXRlU2hlbGwoKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJCXBhcmVudCA9IHNoZWxsOwotCQl9Ci0KLQkJaWYgKGhvbGRlciAhPSBudWxsKSB7Ci0JCQlob2xkZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJaG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsgLy8gc2l6ZSBjYW4ndCBiZSAwLDAKLQkJLy8gb3RoZXJ3aXNlIHRoZSBkaWFncmFtCi0JCS8vIHdpbGwgbm90IGJlIHBhaW50ZWQKLQkJaG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJaG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgU2hlbGwgY3JlYXRlU2hlbGwoKSB7Ci0JCVNoZWxsIHNoZWxsID0gbnVsbDsKLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsIDAsIDAsIDApOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICgoc2hlbGwgIT0gbnVsbCkgJiYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCBkaWFncmFtIGltYWdlIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBmaWxlIHVybC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgSUZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiAgICAgICAgICAgIFN1cHByZXNzaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZSNzYXZlRGlhZ3JhbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gc2F2ZURpYWdyYW0oZmluYWwgT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCAKLQkJCWZpbmFsIFN0cmluZyBkaWFncmFtVHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgZGlhZ3JhbUluZm8KLQkJZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCS8vIGdyYWIgdGhlIFVJIHRocmVhZCB0byBhdm9pZCB0aHJlYWQgYWNjZXNzIGVycm9yCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlfX2ludGVybmFsX3NhdmVEaWFncmFtKHdyYXBwZXIsIGltZ1BhdGgsIGRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVXNlckRlZmluZWREaWFncmFtKEFjdGl2aXR5IGUsIFN0cmluZyBpbWdQYXRoLCBTdHJpbmcgZGlhZ3JhbVR5cGUpIHRocm93cyBFeGNlcHRpb24KLQl7CQkKLQkJLy8gaWYgdGhlcmUgaXMgYSB1c2VyIGRlZmluZWQgZGlhZ3JhbSwgdXNlIGl0Ci0JCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKChBY3Rpdml0eSllKTsKLQkJc3dpdGNoIChnZXRJbnRUeXBlKGRpYWdyYW1UeXBlKSkKLQkJewotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQlpZiAoIGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkgJiYgaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkgJiYgaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJCQkJCi0JCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwgKSAmJiBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgX19pbnRlcm5hbF9zYXZlRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJCi0JCWlmICggc3VwLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy9NZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClvOwotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KW87Ci0JCS8vIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpbnQgdHlwZSA9IGdldEludFR5cGUoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JCS8vIGtlZXAgdGhlIGRpcnR5IGZsYWcgYW5kIHJlc2V0IGJhY2sgdG8gYXZvaWQgbWFrZSB0aGUgbGlicmFyeSBkaXJ0eQotCQlib29sZWFuIGRpcnR5RmxhZyA9IGUuZVJlc291cmNlKCkuaXNNb2RpZmllZCgpOwotCi0JCXRyeSB7Ci0JCQlpZiAoIGhhc1VzZXJEZWZpbmVkRGlhZ3JhbSgoQWN0aXZpdHkpZSwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUpICkKLQkJCXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQotCQkJLy8gZmlyc3QgY2hlY2sgaWYgd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgZGlhZ3JhbSBvciBub3QKLQkJCS8vIGlmIHRoZSBkaWFncmFtIGlzIHN1cHJlc3NlZCwgZG9uJ3QgZ2VuZXJhdGUgZGlhZ3JhbQotCQkJLy8gZG9uJ3QgY3JlYXRlIHRoZSBkaWFncmFtIGlmIGl0J3Mgbm90IHRoZXJlLAotCQkJLy8gaWQgdGhlIGRpYWdyYW0gZG9lcyBub3QgZXhpc3QsIGl0J3Mgc3VwcmVzc2VkCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBlLCB0eXBlLCBmYWxzZSk7Ci0KLQkJCS8vIEFsbG93IHRoZSBvcHRpb24gdG8gcHVibGlzaCAndW5jcmVhdGVkJyBkaWFncmFtcwotCQkJLy8gYnkgZGVmYXVsdCwgdW5jcmVhdGVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB3aWxsIGJlIHB1Ymxpc2hlZCwKLQkJCS8vIHVuY3JlYXRlZCBkaWFncmFtcyBvZiBvdGhlciB0eXBlcyB3aWxsIG5vdCBiZSBwdWJsaXNoZWQKLQkJCWJvb2xlYW4gZXhpc3QgPSAoZCAhPSBudWxsKTsKLQkJCWlmIChleGlzdCkgewotCQkJCWlmIChkLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJLy8gSWYgYW4gZXh0ZW5zaW9uIGhhcyBpdHMgb3duIGRpYWdyYW0uIEJhc2UgaXMgcmVwbGFjZWQgb3IgY29udHJpYnV0ZWQuIAotCQkJCS8vIGV4dGVuc2lvbiBkaWFncmFtIHNob3dzIHJlYWxpemVkIGVsZW1lbnQgaW4gdW5kZWZpbmVkIGxvY2F0aW9uLiAKLQkJCQkvLyBJbiBwdWJsaXNoaW5nIGRvbid0IGRpc3BsYXkgZXh0ZW5zaW9uIGRpYWdyYW0gZXZlbiBpZiBpdCBoYXMgaXRzIG93bgotCQkJCS8vIGRpYWdyYW0gaWYgcmVhbGl6ZWQgZWxlbWVudHMgYXJlIGNvbWluZyBpbiB0aHJvdWdoIHZhcmlhYmlsaXR5LgotCQkJCWlmKHR5cGUgPT0gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNICYmCi0JCQkJCQljaGVja1ZhcmlhYmlsaXR5KGUsIGZpbHRlcix0eXBlKSAhPSBudWxsKXsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkJCi0JCQl9ZWxzZXsKLQkJCQkKLQkJCQlpZigodHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKQotCQkJCQlyZXR1cm47Ci0KLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGlhZ3JhbSB1biBvcGVuZWQgZXh0ZW5zaW9uIHB1Ymxpc2guCi0JCQkJaWYodHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0pewotCQkJCQkvLyBJZiBvcHRpb24gaXMgbm90IGNoZWNrZWQsIGRvbid0IGdlbmVyYXRlIGEgZGlhZ3JhbQotCQkJCQlpZighcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24pIHJldHVybjsKLQkJCQkJCi0JCQkJCS8vSWYgZXh0ZW5zaW9uIGlzIG1vZGlmaWVkIGRvbid0IGdlbmVyYXRlIGl0LgotCQkJCQlpZighZS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWRCYXNlID0gY2hlY2tWYXJpYWJpbGl0eShlLCBmaWx0ZXIsIHR5cGUpOwotCQkJCQlpZihjYWxjdWxhdGVkQmFzZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0JCi0JCQkJCQotCQkJCQl3cmFwcGVyID0gY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWUgPSAoQWN0aXZpdHkpY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWV4aXN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHB1Ymxpc2hVbmNyZWF0ZWRBREQgPT0gZmFsc2UgJiYgdHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKXsKLQkJCQkJYm9vbGVhbiBjb250cmlidXRvcmV4aXN0ID0gZmFsc2U7Ci0JCQkJCS8vIFRoaXMgaXMgbmVlZCwgaWYgY29udHJpYnV0b3IgaGFzIGEgQUREIGRpYWdyYSwgYmFzZSBkb24ndCAKLQkJCQkJLy8gYmFzZSBzaG91bGQgZ2VuZXJhdGUgQUREIGluIGJyb3dzaW5nLgotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCi0JCQkJCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkJCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQkJaWYoaXRlcmF0b3IgIT0gbnVsbCl7Ci0JCQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCQkJCQkJT2JqZWN0IGFjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoYWN0ICE9IG51bGwpewotCQkJCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGR4ID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBhY3QsIHR5cGUsIGZhbHNlKTsKLQkJCQkJCQkJCWlmKGR4ICE9IG51bGwpeyAgIAotCQkJCQkJCQkJCWNvbnRyaWJ1dG9yZXhpc3QgPSB0cnVlOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKCFjb250cmlidXRvcmV4aXN0KQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCXZpZXdlciA9IGdldERpYWdyYW1WaWV3ZXIodHlwZSk7Ci0JCQkJdmlld2VyLmxvYWREaWFncmFtKHdyYXBwZXIsICFleGlzdCwgZmlsdGVyLCBzdXApOwotCQkJCWRpYWdyYW1JbmZvID0gdmlld2VyLmdldERpYWdyYW1JbmZvKCk7Ci0JCQkJaWYgKGRpYWdyYW1JbmZvICE9IG51bGwgJiYgIWRpYWdyYW1JbmZvLmlzRW1wdHkoKSkgewotCQkJCQlpbWFnZSA9IHZpZXdlci5jcmVhdGVEaWFncmFtSW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJCS8vIHNhdmUgdGhlIGltYWdlCi0JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShwdWJEaXIsIGltZ1BhdGgpOwotCi0JCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgY3JlYXRlZCBvdGhlcndpc2UgZXhjZXB0aW9uCi0JCQkJCQlGaWxlIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJCQlwYXJlbnQubWtkaXJzKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQkJfQotCQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQkJCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHsgaW1hZ2UuZ2V0SW1hZ2VEYXRhKCkgfTsKLQkJCQkJCWxvYWRlci5zYXZlKG9zLCBTV1QuSU1BR0VfSlBFRyk7Ci0KLQkJCQkJCWRpYWdyYW1JbmZvLnNldEltYWdlRmlsZVBhdGgoaW1nUGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBjcmVhdGUgZGlhZ3JhbSBpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCS8vIGRlbGV0ZSB0aGUgbmV3bHkgY3JlYXRlZCBkaWFncmFtIGZyb20gdGhlIGxpYnJhcnkKLQkJCWlmICghZXhpc3QpIHsKLQkJCQlkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQkJKEFjdGl2aXR5KSBlLCB0eXBlLCBmYWxzZSk7Ci0JCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGQpOwotCQkJCX0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQotCQkJCS8vIHJlc3RvcmUgdGhlIGRpcnR5IGZsYWcKLQkJCQllLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKGRpcnR5RmxhZyk7Ci0KLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJdmlld2VyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBjaGVja1ZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCWludCB0eXBlKSB7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQljb25maWcgPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgYWxsIENvbnRyaWJ1dG9ycyBmcm9tIHBhcmVudCBjaGFpbiBhbmQgY29udHJpYnV0b3IgY2hhaW4gZm9yIHRoZQotCQkvLyBlbGVtZW50IGUuCi0JCVZhcmlhYmlsaXR5SW5mbyBlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJTGlzdCBjb250cmlidXRvcnMgPSBlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKHZlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlBY3Rpdml0eSByZXBsYWNlciA9IChBY3Rpdml0eSkgQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwKLQkJCQljb25maWcpOwotCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJdmUgPSByZXBsYWNlcjsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSByZXBsYWNlckRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlcgotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKHJlcGxhY2VyLCB0eXBlLCBmYWxzZSk7Ci0JCQlpZiAocmVwbGFjZXJEaWFncmFtICE9IG51bGwpIHsKLQkJCQkvL2FueVJlcGxhY2VyLmFkZChyZXBsYWNlcik7Ci0JCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgdmUsIHR5cGUsIGZhbHNlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgZmlyc3QgaWYgYmFzZURpYWdyYW0gaXMgc3VwcHJlc3NlZC4KLQkJCQlpZiAoYmFzZURpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCQotCQkJCS8vIEZpbmQgdGhlIGNvbnRyaWJ1dG9ycyBvZiBCYXNlCi0JCQkJVmFyaWFiaWxpdHlJbmZvIHZlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIHZlKTsKLQkJCQlMaXN0IHZlQ29udHJpYnV0b3JzID0gdmVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCQkJCWlmIChjb250cmlidXRvcnMuc2l6ZSgpICE9IHZlQ29udHJpYnV0b3JzLnNpemUoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udHJpYnV0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCF2ZUNvbnRyaWJ1dG9ycy5jb250YWlucyhuZXh0KSkgewotCQkJCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkJLmlzRW1wdHkoKSkgewotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHZlOwotCQkJCQotCQkJfWVsc2V7Ci0JCQkJLy8gSWYgbm8gYmFzZSBkaWFncmFtLCBjaGVjayBiYXNlIG9mIGJhc2UgaGFkIGFueSBkaWFncmFtLgotCQkJCXJldHVybiBjaGVja1ZhcmlhYmlsaXR5KHZlLCBmaWx0ZXIsIHR5cGUpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgd2luZG93J3MgcHJlZmVyZW5jZSBhdHRyaWJ1dGUgZm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5wdWJsaXNoVW5jcmVhdGVkQUREID0gZmxhZzsKLQl9Ci0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWNpdGl2eXQgRGlhZ3JhbQotCSAqIAotCSAqLwotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGJvb2xlYW4gZmxhZyl7Ci0JCXRoaXMucHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBmbGFnOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRSZWFsaXplZEZvclVubW9kaWZpZWQoT2JqZWN0IGFjdGl2aXR5LCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJLy8gRG9lcyBub3RoaW5nLCBqdXN0IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhMTVlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZ3JhcGhpY2FsIHZpZXdlciBmb3IgdGhlIEFjdGl2aXR5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1WaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCUFjdGl2aXR5RGlhZ3JhbSBkaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQkJZGlhZ3JhbS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaWYgKHN1cCAhPSBudWxsKSB7Ci0JCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCX0KLQotCQlkaWFncmFtLnNldE9iamVjdChlKTsKLQkJRWRpdFBhcnQgcGFydCA9IG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLQkJcGFydC5zZXRNb2RlbChkaWFncmFtKTsKLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9XUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDdhOThhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9XUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LldQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgV1AgRGVwZW5kZW5jeSBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwdWJsaWMgV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBXUERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBkaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0JCWRpYWdyYW0uc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWlmIChzdXAgIT0gbnVsbCkgewotCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQl9Ci0KLQkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgRGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyZTMyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZ3JhcGhpY2FsIHZpZXdlcnMgZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1BlcnNwZWN0aXZlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDNkYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdQZXJzcGVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuV2l6YXJkQ2F0ZWdvcmllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsYWNlaG9sZGVyRm9sZGVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmRSZWdpc3RyeTsKLQotLyoqCi0gKiBUaGUgTWV0aG9kIEF1dGhvcmluZyBwZXJzcGVjdGl2ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nUGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBBdXRob3JpbmcgcGVyc3BlY3RpdmUgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BFQ1RJVkVfSUQgPSBBdXRob3JpbmdQZXJzcGVjdGl2ZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBuZXdXaXphcmRTaG9ydGN1dHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCXN0YXRpYyB7Ci0JCW5ld1dpemFyZFNob3J0Y3V0cy5hZGQoTmV3TGlicmFyeVdpemFyZC5XSVpBUkRfSUQpOwotCQluZXdXaXphcmRTaG9ydGN1dHMuYWRkKE5ld1BsdWdpbldpemFyZC5XSVpBUkRfSUQpOwotCQluZXdXaXphcmRTaG9ydGN1dHMuYWRkKE5ld0NvbmZpZ3VyYXRpb25XaXphcmQuV0laQVJEX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGlzIHBlcnNwZWN0aXZlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZXZpb3VzbHkgYWN0aXZlIHBlcnNwZWN0aXZlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9wZW4oKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0JCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9sZFBlcnNwZWN0aXZlID0gYWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpOwotCQkJaWYgKCFvbGRQZXJzcGVjdGl2ZS5nZXRJZCgpLmVxdWFscyhQRVJTUEVDVElWRV9JRCkpIHsKLQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlID0gcmVnaXN0cnkKLQkJCQkJCS5maW5kUGVyc3BlY3RpdmVXaXRoSWQoUEVSU1BFQ1RJVkVfSUQpOwotCQkJCWFjdGl2ZVBhZ2Uuc2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmUpOwotCQkJfQotCQkJcmV0dXJuIG9sZFBlcnNwZWN0aXZlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWxheW91dC5zZXRFZGl0b3JBcmVhVmlzaWJsZSh0cnVlKTsKLQkJU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOwotCQlJRm9sZGVyTGF5b3V0IHRvcExlZnRGb2xkZXIgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJ0b3BMZWZ0IiwgLy8kTk9OLU5MUy0xJAotCQkJCUlQYWdlTGF5b3V0LkxFRlQsIDAuMzBmLCBlZGl0b3JBcmVhKTsKLQotCQlJRm9sZGVyTGF5b3V0IGJvdHRvbUxlZnRGb2xkZXIgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJib3R0b21MZWZ0IiwgLy8kTk9OLU5MUy0xJAotCQkJCUlQYWdlTGF5b3V0LkJPVFRPTSwgMC41MGYsICJ0b3BMZWZ0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQl0b3BMZWZ0Rm9sZGVyLmFkZFZpZXcoTGlicmFyeVZpZXcuVklFV19JRCk7Ci0JCWJvdHRvbUxlZnRGb2xkZXIuYWRkVmlldyhDb25maWd1cmF0aW9uVmlldy5WSUVXX0lEKTsKLQotCQlJUGxhY2Vob2xkZXJGb2xkZXJMYXlvdXQgb3V0cHV0Rm9sZGVyID0gbGF5b3V0LmNyZWF0ZVBsYWNlaG9sZGVyRm9sZGVyKAotCQkJCSJib3R0b20iLCBJUGFnZUxheW91dC5CT1RUT00sIDAuNjVmLCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoTmV3U2VhcmNoVUkuU0VBUkNIX1ZJRVdfSUQpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX0JPT0tNQVJLUyk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUHJvZ3Jlc3NDb25zdGFudHMuUFJPR1JFU1NfVklFV19JRCk7Ci0KLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KE5ld0xpYnJhcnlXaXphcmQuV0laQVJEX0lEKTsKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KE5ld1BsdWdpbldpemFyZC5XSVpBUkRfSUQpOwotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoTmV3Q29uZmlndXJhdGlvbldpemFyZC5XSVpBUkRfSUQpOwotCi0JCUlXaXphcmRSZWdpc3RyeSBuZXdXaXphcmRSZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsKLQkJSVdpemFyZENhdGVnb3J5IG5ld1dpemFyZENhdGVnb3J5ID0gbmV3V2l6YXJkUmVnaXN0cnkKLQkJCQkuZmluZENhdGVnb3J5KFdpemFyZENhdGVnb3JpZXMuTkVXX1dJWkFSRFNfQ0FURUdPUlkpOwotCQlJV2l6YXJkRGVzY3JpcHRvcltdIHdpemFyZERlc2NyaXB0b3JzID0gbmV3V2l6YXJkQ2F0ZWdvcnkuZ2V0V2l6YXJkcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpemFyZERlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJV2l6YXJkRGVzY3JpcHRvciB3aXphcmREZXNjcmlwdG9yID0gd2l6YXJkRGVzY3JpcHRvcnNbaV07Ci0JCQlTdHJpbmcgd2l6YXJkSWQgPSB3aXphcmREZXNjcmlwdG9yLmdldElkKCk7Ci0JCQlpZiAoIW5ld1dpemFyZFNob3J0Y3V0cy5jb250YWlucyh3aXphcmRJZCkpIHsKLQkJCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQod2l6YXJkSWQpOwotCQkJfQotCQl9Ci0KLQkJUGVyc3BlY3RpdmVMaXN0VXRpbC5hZGRQZXJzcGVjdGl2ZVNob3J0TGlzdChsYXlvdXQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUhlbHBDb250ZXh0cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUhlbHBDb250ZXh0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjQzZDRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi0vKioKLSAqIEF1dGhvcmluZyBVSSBoZWxwIGNvbnRleHRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFJPT1RfQ09OVEVYVCA9IEF1dGhvcmluZ1VJSGVscENvbnRleHRzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLiI7ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfTkVXX0xJQlJBUllfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZmlsZV9uZXdfbGlicmFyeV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlGSUxFX05FV19QTFVHSU5fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZmlsZV9uZXdfcGx1Z2luX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJRklMRV9ORVdfQ09ORklHVVJBVElPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX25ld19jb25maWd1cmF0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRklMRV9PUEVOX0xJQlJBUllfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZmlsZV9vcGVuX2xpYnJhcnlfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRklMRV9PUEVOX0NPTkZJR1VSQVRJT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZmlsZV9vcGVuX2NvbmZpZ3VyYXRpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRklMRV9JTVBPUlRfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmaWxlX2ltcG9ydF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX0VYUE9SVF9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZpbGVfZXhwb3J0X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIExJQlJBUllfTkFWSUdBVE9SX1ZJRVdfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAibGlicmFyeV9uYXZpZ2F0b3Jfdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIENPTkZJR1VSQVRJT05fVklFV19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJjb25maWd1cmF0aW9uX3ZpZXdfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBQTFVHSU5fRURJVE9SX0RFU0NSSVBUSU9OX0FMTF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJwbHVnaW5fZWRpdG9yX2Rlc2NyaXB0aW9uX2FsbF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIENPTkZJR1VSQVRJT05fRURJVE9SX0FMTF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJjb25maWd1cmF0aW9uX2VkaXRvcl9hbGxfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBDT05URU5UX1BBQ0tBR0VfRURJVE9SX0FMTF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJjb250ZW50X3BhY2thZ2VfZWRpdG9yX2FsbF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9ST0xFX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3JvbGVfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9UQVNLX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3Rhc2tfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9XT1JLX1BST0RVQ1RfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfd29ya19wcm9kdWN0X2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfR1VJREFOQ0VfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZ3VpZGFuY2VfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9ESVNDSVBMSU5FX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2Rpc2NpcGxpbmVfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9ESVNDSVBMSU5FX0dST1VQSU5HX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2Rpc2NpcGxpbmVfZ3JvdXBpbmdfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9ET01BSU5fQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZG9tYWluX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfV09SS19QUk9EVUNUX1RZUEVfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfd29ya19wcm9kdWN0X3R5cGVfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9ST0xFX1NFVF9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9yb2xlX3NldF9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1JPTFNFX1NFVF9HUk9VUElOR19DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9yb2xzZV9zZXRfZ3JvdXBpbmdfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9UT09MX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3Rvb2xfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0NVU1RPTV9DQVRFR09SWV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9jdXN0b21fY2F0ZWdvcnlfY29udGV4dF9oZWxwX0lEIiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX0dFTkVSQUxfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZ2VuZXJhbF9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX0RFVEFJTF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9kZXRhaWxfY29udGV4dCIgIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9OT1RBVElPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9ub3RhdGlvbl9jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX1RBSUxPUklOR19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl90YWlsb3JpbmdfY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9WRVJTSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3ZlcnNpb25fY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9FTEVNRU5UX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2VsZW1lbnRfY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9JQ09OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2ljb25fY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfQ1BfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfY3BfZGVzY3JpcHRpb25fY29udGV4dF9oZWxwX0lEIiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9EUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9kcF9kZXNjcmlwdGlvbl9jb250ZXh0X2hlbHBfSUQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfUFJPQ0VTU19XQlNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfcHJvY2Vzc193YnNfY29udGV4dCIgIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX09CU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9wcm9jZXNzX29ic19jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1BST0NFU1NfUEJTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX3Byb2Nlc3NfcGJzX2NvbnRleHQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfUFJPQ0VTU19BTExCU19DT05URVhUID0gUk9PVF9DT05URVhUICsgImZvcm1fZWRpdG9yX3Byb2Nlc3NfYWxsYnNfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09ORklHVVJBVElPTl9QVUJMSVNIX1dJWkFSRF9BTExfUEFHRVNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiY29uZmlndXJhdGlvbl9wdWJsaXNoX3dpemFyZF9hbGxfcGFnZXNfY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBSSUNIX1RFWFRfRURJVE9SX0NPTlRFWFRfSUQgPSBST09UX0NPTlRFWFQgKyAgInJpY2hfdGV4dF9lZGl0b3JfY29udGV4dF9JRCIgIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9BQ1RJVklUWV9ESUFHUkFNX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZm9ybV9lZGl0b3JfYWN0aXZpdHlfZGlhZ3JhbV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9DT05URVhUID0gUk9PVF9DT05URVhUICsiZm9ybV9lZGl0b3JfYWN0aXZpdHlfZGV0YWlsX2RpYWdyYW1fY29udGV4dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9XUF9ERVBFTkRFTkNZX0RJQUdSQU1fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmb3JtX2VkaXRvcl93cF9kZXBlbmRlbmN5X2RpYWdyYW1fY29udGV4dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBMSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCA9IFJPT1RfQ09OVEVYVCArICJsaWJyYXJ5X3ZpZXdfbm9kZV9jb250ZXh0X25vdF9pbXBsZW1lbnRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAgTEFZT1VUX0ZMQVRfQUNUSU9OID0gUk9PVF9DT05URVhUICsgImxheW91dF9mbGF0X2FjdGlvbiI7IAkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nICBMQVlPVVRfSElFUkFSQ0hJQ0FMX0FDVElPTiA9IFJPT1RfQ09OVEVYVCArICJsYXlvdXRfaGllcmFyY2hpY2FsX2FjdGlvbiI7IAkgLy8kTk9OLU5MUy0xJAkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUltYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGJiYjlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBTaGFyZWQgaW1hZ2VzIHVzZWQgaW4gdGhlIEF1dGhvcmluZyBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSUltYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9DT0xMQVBTRUQgPSAiZnVsbC9vYmoxNi9Db2xsYXBzZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJCAJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9FWFBBTkRFRCA9ICJmdWxsL29iajE2L0V4cGFuZGVkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX1JFRlJFU0ggPSAiZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmIjsgLy8kTk9OLU5MUy0xJCAJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9TVE9QID0gImZ1bGwvZXRvb2wxNi9TdG9wLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX1BSSU5UID0gImZ1bGwvZXRvb2wxNi9QcmludC5naWYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfT1ZSX0VSUk9SID0gImZ1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9MQVlPVVRfRkxBVCA9ICJmdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9MQVlPVVRfSElFUkFSQ0hJQ0FMID0gImZ1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQ09MTEFQU0VEID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX0NPTExBUFNFRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19FWFBBTkRFRCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9FWFBBTkRFRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19SRUZSRVNIID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX1JFRlJFU0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1RPUCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9TVE9QKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1BSSU5UID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX1BSSU5UKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19PVlJfRVJST1IgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfT1ZSX0VSUk9SKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0xBWU9VVF9GTEFUID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX0xBWU9VVF9GTEFUKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19MQVlPVVRfSElFUkFSQ0hJQ0FMID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX0xBWU9VVF9ISUVSQVJDSElDQUwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQkFDSyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19UT09MX0JBQ0spOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09MTEFQU0VEID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfQ09MTEFQU0VEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VYUEFOREVEID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfRVhQQU5ERUQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRk9SV0FSRCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19UT09MX0ZPUldBUkQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUkVGUkVTSCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX1JFRlJFU0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfU1RPUCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX1NUT1ApOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJJTlQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9QUklOVCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1ZSX0VSUk9SID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfT1ZSX0VSUk9SKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0xBWU9VVF9GTEFUID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfTEFZT1VUX0ZMQVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfTEFZT1VUX0hJRVJBUkNISUNBTCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX0xBWU9VVF9ISUVSQVJDSElDQUwpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMTFjZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5Qcm9ibGVtTWFya2VyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlWaWV3UHJlZlBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgQXV0aG9yaW5nIFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEF1dGhvcmluZ1VJUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgUHJvYmxlbU1hcmtlck1hbmFnZXIgZlByb2JsZW1NYXJrZXJNYW5hZ2VyOwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgZkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQXV0aG9yaW5nVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgQXV0aG9yaW5nIFVJIHNlcnZpY2UuCi0JCUF1dGhvcmluZ1VJU2VydmljZS5nZXRJbnN0YW5jZSgpLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoY29udGV4dCk7Ci0JCQotCQlMaWJyYXJ5Vmlld1ByZWZQYWdlLmluaXREZWZhdWx0cyhnZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXV0aG9yaW5nVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBQcm9ibGVtTWFya2VyTWFuYWdlciBnZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpIHsKLQkJaWYgKGZQcm9ibGVtTWFya2VyTWFuYWdlciA9PSBudWxsKQotCQkJZlByb2JsZW1NYXJrZXJNYW5hZ2VyPSBuZXcgUHJvYmxlbU1hcmtlck1hbmFnZXIoKTsKLQkJcmV0dXJuIGZQcm9ibGVtTWFya2VyTWFuYWdlcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5pbnRlcm5hbEdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgaW50ZXJuYWxHZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5PSBuZXcgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdCkgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IodCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRiMzQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQXV0aG9pbmcgVUkgcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdXRob3JpbmdVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEF1dGhvcmluZ1VJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUuCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzc2lnbkFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2luY2x1ZGVFbGVtZW50c09mVHlwZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmFzc2lnbkFjdGlvbl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYXNzaWduQWN0aW9uX3RleHQ7Ci0JCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZXBDb3B5QWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2dfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWduUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3JpZXNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvblBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjYXJkdW5yZXNvbHZlZHJlZjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRhbmNlUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEl0ZW1zRmlsdGVyRGlhbG9nX1VwZGF0ZVRyZWVKb2JfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25fUHJvYmxlbV9SZWZyZXNoOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2JsZW1FeHBsYW5hdGlvblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEaWFncmFtRmlsZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpZXdQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0Q3JlYXRlTmV3RGlhZ3JhbUZpbGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZXNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0c1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sTWVudG9yc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdHNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtc1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbXNTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRhaWxTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmFsSW5mb1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWNvblNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RhdGlvblNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vdGF0aW9uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YWZmaW5nU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhZmZpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFpbG9yaW5nU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25JbmZvU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRpdGlvbmFsSW5mb190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbGljYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkxhYmVsX2VkaXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25MYWJlbF9maW5kRWxlbWVudEluTGliTmF2OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWx0ZXJuYXRpdmVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXV0aG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja2dyb3VuZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZUVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VHdWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t1cGJlZm9yZXNhdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyaWVmT3V0bGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlRGF0ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRyaWJ1dGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbENvbnRyaWJ1dGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc190b190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZXJuYWxJZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ29hbHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcGFjdE9mTm90SGF2aW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBrZXlDb25zaWRlcmF0aW9uc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFpbkRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RBcHBsaWNhYmxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnaW5nR3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNlbnRhdGlvbk5hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdGZvcmxpYmFyeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2JsZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1cnBvc2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRzUmVwbGFjZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwcmVzZW50YXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF0dGFjaGVkRmlsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2tpbGxzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNfbmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bm9ueW1zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWVwQ29weV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3X3BsdWdpbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVJZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlUeXBlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF0dGFjaEJ1dHRvbl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF0dGFjaFVybEJ1dHRvbl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlVHlwZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYXJCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0YWNoQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtX3NhdmVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvd25CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3JkZXJCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUFzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2VsZWN0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZURlZmF1bHRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIaXN0b3J5QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5VmlldzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Jlc29sdmVNaXNzaW5nUmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc29ydE9yZGVyQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zb3J0VHlwZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQbHVnaW5XaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQbHVnaW5FcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQbHVnaW5FcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RMaWJyYXJ5R3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRQYXRoTGFiZWxfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RlbGluZ0dyb3VwX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlckludGVyZmFjZUdyb3VwX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVidWdHcm91cF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3hfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUHJlZmVyZW5jZUhpc3RvcnlTaXplRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdhcm5pbmdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9PcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUNvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludGVybmFsRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkQ29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeVRvRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuQ29uZmlnV2l6YXJkRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeGluZ0NvbnRlbnREZXNjcmlwdGlvbkdVSURzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX25vb3BlbmxpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfbG9hZGluZ2xpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtc2dfcmVsb2FkTGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbG9hZERpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVsb2FkRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ3NfQXNzaWduRGlhbG9nX2Vycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX3ZpZXdzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uc2VsZWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9zdXBwb3J0aW5nUGx1Z2luTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hHdWlkYW5jZUZpbGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTmV3RWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRsZ1RpdGxlX3JlbG9hZExpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jcmVhdGVMaW5rQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGVfZWRpdF90ZXh0MDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0RlZmF1bHRCcmllZkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfcmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9yZWFzb24yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUVycm9yX3JlYXNvbjM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19FeHRlcm5hbElEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19QdXJwb3NlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19TY29wZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVXNhZ2VOb3RlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQWx0ZXJuYXRpdmVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ib3dUb1N0YWZmOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19TY2FsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmlza0xldmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlT2ZDb250cmFjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcndhcmRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcndhcmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3BCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld25hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RFZGl0b3JfbWVudTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QYXJlbnRQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xpc3RQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RyZWVQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RhYmxlUGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09iamVjdENvbHVtbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TZWxmQ29sdW1uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05vT2JqZWN0U2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTXVsdGlPYmplY3RTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV2l6YXJkX2NhdGVnb3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dpemFyZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01vZGVsT2JqZWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hNTEVuY29kaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hNTEVuY29kaW5nQ2hvaWNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRmlsZUNvbmZsaWN0X2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fRmlsZUNvbmZsaWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTGlua0RpYWxvZ19saW5rVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaW5rQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhlaWdodExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aWR0aExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMzU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMzY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbHRUYWdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1hZ2VTaXplTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX05hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0luZGV4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1ByZWZpeDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfbW92ZV90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFzc2lnbkRpYWxvZ19hc3NpZ25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBc3NpZ25EaWFsb2dfcmVhc3NpZ25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBc3NpZ25EaWFsb2dfZGVlcGNvcHB5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9PbmdvaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX09wdGlvbmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX1R5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19FeHBhbmRBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX21vdmluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlQYXRoTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlUeXBlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbldpemFyZF93aW5kb3dUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25XYXJuaW5nOwotCi0JLy8gcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0ZXBzT3JkZXJEaWFsb2dfc3RlcHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGVwc09yZGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9QbGFubmVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3BlY2lmeWRpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9FeGl0U3RhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb2x1bW5zdG9BZGRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVGVhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5DaGVhdHNoZWV0Vmlld190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9JbmRlbnQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3V0ZGVudDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1JldmVhbF9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZTsKLQotCS8vIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfZXJyX3NhdmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9jb3B5aW5nX2ZpbGVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfY29weWluZ19maWxlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2NvcHlpbmdfZmlsZV9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3dwZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0FkZENhdGVnb3JpZXNUaXRsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfU3ViQ2F0ZWdvcmllc1RpdGxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX3VwZGF0ZU9uQ2xpY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfdXBkYXRlT25DbGlja1Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2Vfbm9VcGRhdGVPbkNsaWNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX25vVXBkYXRlT25DbGlja1Rvb2xUaXA7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtnczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUFzd2l0aGRvdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2RlZmF1bHRTeW5jaHJvbml6YXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Jyb3dzZUJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUENvbXBhcnRtZW50RmlndXJlXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX21vdmVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2NyZWF0ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsR3VpZGFuY2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5SVEU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbG9zZVJURTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCS8vIE5ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lZ3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldGdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaF9jYXRlZ29yaWVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kX3NlbWFudGljc19idXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZF9zZW1hbnRpY3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1ByZWZlcmVuY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NfVGFzazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbF9UYXNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF5b3V0QWN0aW9uR3JvdXBfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF5b3V0QWN0aW9uR3JvdXBfaGllcmFyY2hpY2FsTGF5b3V0QWN0aW9uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZV9Xb3JrQnJlYWtkb3duRWxlbWVudHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlX0Rlc2NyaXB0b3JFbGVtZW50czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VfYnJlYWtEb3duRWxlbWVudF9EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VfQWN0aXZpdHlfRGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VfQWN0aXZpdHlfRGV0YWlsX0RpYWdyYW07Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZV9EZXNjcmlwdG9yczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlX2luY2x1ZGVEZXNjcmlwdG9yQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uUGFnZV9RdWlja2ZpeEVycm9yX3JlYXNvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uUGFnZV9xdWlja2ZpeEVycm9yX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRMaW5rVHlwZVByZWZMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19HdWlkYW5jZVdpdGhVcmxBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dhdHRhY2hVcmxfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0ZV9tZXRob2RfbGlicmFyeTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwbHVnaW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwbHVnaW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3REZXNjcmlwdGlvblBhZ2Vfc2xvdF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNsb3RTZWN0aW9uX25hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2xvdFNlY3Rpb25fZGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzbG90c0xhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3Rfc2xvdFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3Nsb3RTZWN0aW9uX2Rlc2M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9zbG90U2VjdGlvbl9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNsb3RDb25maXJtRGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdwRnVsRmlsbHNDb25maXJtRGlhbG9nX21lc3NhZ2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd3BTbG90RnVsRmlsbHNDb25maXJtRGlhbG9nX21lc3NhZ2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnUHJvYmxlbVZpZXdPcHRpb25zVGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoaWRlRXJyb3NUZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhpZGVXYXJuaW5nc1RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGlkZUluZm9zVGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRfVGFza3NwZXJSb3c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFRhc2twZXJSb3dfbXNnOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDcwNTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5QcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgQXV0aG9yaW5nIFVJIHNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEF1dGhvcmluZ1VJU2VydmljZSBpbnN0YW5jZSA9IG5ldyBBdXRob3JpbmdVSVNlcnZpY2UoKTsKLQotCS8vIFRoZSBzdGF0dXMgZmxhZy4KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEF1dGhvcmluZ1VJU2VydmljZSgpIHsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQkJCQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQoKTsKLQkJCQl9Ci0JCQkJTGlicmFyeVVJVXRpbC51cGRhdGVTaGVsbFRpdGxlKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCX0JCQkKLQkJfSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRob3JpbmdVSVNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIEF1dGhvcmluZyBVSSBzZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKCFzdGFydGVkKSB7CQotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYXBwbHlEZWZhdWx0VmFsdWVzRm9yQnJlYWtkb3duRWxlbWVudEF0dHJpYnV0ZXMoKTsKLQotCQkJLy8gSW5pdGlhbGl6ZSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yCi0JCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldENsYXNzKCk7Ci0JCQkKLQkJCS8vIFNldCBjb25maWd1cmF0b3IgZm9yIFdCUyBhZGFwdGVyIGZhY3RvcnkgaWYgaXQncyBub3Qgc2V0IHlldAotCQkJaWYoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJaWYoYWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCkgPT0gbnVsbCkgewotCQkJCQlhZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBJbml0aWFsaXplIHRoZSBtb3ZlL3Bhc3RlIGNvbW1hbmQuCi0JCQlNZXRob2RFbGVtZW50QWRkQ29tbWFuZAotCQkJCQkuc2V0UmVzb3VyY2VNYW5hZ2VyKG5ldyBDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uKCkpOwotCi0JCQkvLyBJbml0aWFsaXplIHRoZSBFZGl0b3JDaG9vc2VyLgotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpOwotCi0JCQkvLyBMb2FkIEVkaXRvclBhZ2UgUHJvdmlkZXJzCi0JCQlEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmxvYWRQcm92aWRlcnMoKTsKLQotCQkJLy8gU2V0IHByb3ZpZGVycyBmb3IgbGlicmFyeSBlZGl0LgotCQkJUHJvdmlkZXJzLnNldENvbmZpZ3VyYXRvckZhY3RvcnkobmV3IElDb25maWd1cmF0b3JGYWN0b3J5KCkgewotCQkJCXB1YmxpYyBJQ29uZmlndXJhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRvcigKLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcsIHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlQcm92aWRlcnMKLQkJCQkJLnNldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKG5ldyBDb25maWd1cmF0aW9uQXBwbGljYXRvcigpKTsKLQotCQkJUHJvdmlkZXJzLnNldFByZWZlcmVuY2VTdG9yZShMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCi0JCQlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gbmV3IFByZWZlcmVuY2VTdG9yZVdyYXBwZXIoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJCVByb3ZpZGVycy5zZXRBdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUoc3RvcmUpOwotCi0JCQlMaXN0PElDb21tYW5kTGlzdGVuZXI+IGNtZExpc3RlbmVycyA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoKTsKLQkJCWNtZExpc3RlbmVycy5hZGRBbGwoRGlhZ3JhbUVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0VmFyeUNvbW1hbmRMaXN0ZW5lcnMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yPElDb21tYW5kTGlzdGVuZXI+IGl0ZXIgPSBjbWRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCVByb3ZpZGVycy5yZWdpc3RlckNvbW1hbmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zdGFydCgpOwotCQkJCi0JCQlzdGFydGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJaWYgKHN0YXJ0ZWQpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zdG9wKCk7CQkJCi0JCQlzdGFydGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlUZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmUzMmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci0KLS8qKgotICogRGVmaW5lcyBhbmQgY2FjaGVzIHRoZSBjb21tb25seSByZWZlcmVuY2VkIHRleHQgaW4gdGhlIEF1dGhvcmluZyBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSVRleHQgewotCi0JLyoqCi0JICogRWRpdG9yIGZvcm0gcGFnZSB0aXRsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTSUdOX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hc3NpZ25QYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JJRVNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3JpZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJBQkxFX1BBUlRTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRhbmNlUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmV2aWV3UGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfV09SS0ZMT1dfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfU0VUU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldHNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURVBTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUlNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xNZW50b3JzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdHNQYWdlX3RpdGxlOyAKLQotCS8qKgotCSAqIEVkaXRvciBzZWN0aW9uIG5hbWVzIGFuZCBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja0l0ZW1zU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0lURU1TX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrSXRlbXNTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DSUVTX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBFTkRFTkNJRVNfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVwZW5kZW5jaWVzU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXRhaWxTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRldGFpbFNlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX0lORk9fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9JTkZPX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuaWNvblNlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmljb25TZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90YXRpb25TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90YXRpb25TZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9QTFVHSU5TX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFGRklOR19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGFmZmluZ1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFGRklOR19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGFmZmluZ1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUlMT1JJTkdfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFpbG9yaW5nU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBSUxPUklOR19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy50YWlsb3JpbmdTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9JTkZPX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZlcnNpb25JbmZvU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fSU5GT19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTE9UX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNsb3RTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTE9UX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNsb3RTZWN0aW9uX2Rlc2M7Ci0JLyoqCi0JICogVUkgYW5kIGVsZW1lbnQgYXR0cmlidXRlIGxhYmVscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX0lORk9fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZGl0aW9uYWxJbmZvX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGxpY2F0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hbHRlcm5hdGl2ZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0FQUFJPQUNIRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tncm91bmRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0VMRU1FTlRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhc2VFbGVtZW50X3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9HVUlEQU5DRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFzZUd1aWRhbmNlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJyaWVmRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9PVVRMSU5FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5icmllZk91dGxpbmVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREFURV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlRGF0ZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tJdGVtc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb250cmlidXRlc190ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9DT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubG9jYWxDb250cmlidXRlc190ZXh0OyAgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZUklHSFRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlyaWdodF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlcm5hbERlc2NyaXB0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVybmFsSWRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT0FMU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ29hbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBBQ1RfT0ZfTk9UX0hBVklOR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OU0lERVJBVElPTlNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmtleUNvbnNpZGVyYXRpb25zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfT0ZfQURPUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxldmVsc09mQWRvcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tYWluRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5uYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VMRU1FTlRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0VsZW1lbnRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RhdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucGFja2FnaW5nR3VpZGFuY2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlc2VudGF0aW9uTmFtZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2JsZW1fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wdXJwb3NlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBU09OX0ZPUl9OT1RfTkVFRElOR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVhc29uRm9yTm90TmVlZGluZ190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXByZXNlbnRhdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSUxMU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2tpbGxzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUF9OQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc19uYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bm9ueW1zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNIRURfRklMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXR0YWNoZWRGaWxlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudHlwZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9JRF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudW5pcXVlSWRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9UWVBFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52YXJpYWJpbGl0eVR5cGVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uX3RleHQ7IAotCi0JLyoqCi0JICogQnV0dG9uIGxhYmVscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hZGRCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hdHRhY2hCdXR0b25fdGV4dDsgCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNIX1VSTF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaFVybEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX1RZUEVfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VUeXBlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0VMRUNUX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzZWxlY3RCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBQ0hfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXRhY2hCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG93bkJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3JkZXJCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdEJ1dHRvbl90ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZW1vdmVCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zZWxlY3RCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnVwQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19ISVNUT1JZX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hpc3RvcnlCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFdBWVNfQlVUVE9OX1RFWFQgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVZFUl9CVVRUT05fVEVYVCA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTVBUX0JVVFRPTl9URVhUID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DQVRFR09SSUVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wdWJsaXNoX2NhdGVnb3JpZXNfdGV4dDsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQnJvd3NpbmdQZXJzcGVjdGl2ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9Ccm93c2luZ1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4M2FhMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9Ccm93c2luZ1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBNZXRob2QgQnJvd3NpbmcgcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NpbmdQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHBlcnNwZWN0aXZlIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFX0lEID0gQnJvd3NpbmdQZXJzcGVjdGl2ZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWxheW91dC5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7Ci0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQkJbGF5b3V0LmFkZFZpZXcoQ29uZmlndXJhdGlvblZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuTEVGVCwgMC4zMGYsCi0JCQkJZWRpdG9yQXJlYSk7Ci0JCVBlcnNwZWN0aXZlTGlzdFV0aWwuYWRkUGVyc3BlY3RpdmVTaG9ydExpc3QobGF5b3V0KTsKLQkJbGF5b3V0LmFkZFZpZXcoQ29udGVudFZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuUklHSFQsIDAuNzBmLCBlZGl0b3JBcmVhKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGlzIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuKCkgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCQlpZiAod2luZG93cyAhPSBudWxsICYmIHdpbmRvd3MubGVuZ3RoID4gMCkgewotCQkJCQl3aW5kb3cgPSB3aW5kb3dzWzBdOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoUEVSU1BFQ1RJVkVfSUQsCi0JCQkJCQl3aW5kb3cpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRmFpbGVkIHRvIG9wZW4gYnJvd3NpbmcgcGVyc3BlY3RpdmUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1BlcnNwZWN0aXZlTGlzdFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg4MGJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciB0aGUgQXV0aG9yaW5nIGFuZCBCcm93c2luZyBwZXJzcGVjdGl2ZXMuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVMaXN0VXRpbCB7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIEJyb3dzaW5nIGFuZCBBdXRob3JpbmcgcGVyc3BlY3RpdmUgc2hvcnRjdXRzIHRvIHRoZSBnaXZlbiBwYWdlCi0JICogbGF5b3V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQZXJzcGVjdGl2ZVNob3J0TGlzdChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZFBlcnNwZWN0aXZlU2hvcnRjdXQoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCWxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIHRoZSBBdXRob3JpbmcKLQkgKiBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpIHsKLQkJU3RyaW5nIGFjdGl2ZVBlcnNwZWN0aXZlSWQgPSBQZXJzcGVjdGl2ZVV0aWwuZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpOwotCQlpZiAoYWN0aXZlUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gYWN0aXZlUGVyc3BlY3RpdmVJZAotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIHRoZSBCcm93c2luZwotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jyb3dzaW5nUGVyc3BlY3RpdmUoKSB7Ci0JCVN0cmluZyBhY3RpdmVQZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJaWYgKGFjdGl2ZVBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlSWQKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzUyMzEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcj18Ci0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQKLSNEb24ndCBkZWxldGUgYSBzcGFjZSBhZnRlciAiOiAiCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXM9OiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBGb3JtIFBhZ2UgVGl0bGVzCi1hc3NpZ25QYWdlX3RpdGxlPUFzc2lnbgotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9Q2F0ZWdvcmllcwotZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU9RGVsaXZlcmFibGUgUGFydHMKLWRlc2NyaXB0aW9uUGFnZV90aXRsZT1EZXNjcmlwdGlvbgotZGlzY2lwbGluZXNQYWdlX3RpdGxlPURpc2NpcGxpbmVzCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1EaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwotZ3VpZGFuY2VQYWdlX3RpdGxlPUd1aWRhbmNlCi1wcmV2aWV3UGFnZV90aXRsZT1QcmV2aWV3Ci1yZWZlcmVuY2VzUGFnZV90aXRsZT1SZWZlcmVuY2VzCi1yZWZlcmVuY2VfdGV4dD1SZWZlcmVuY2VzOgotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPVJlZmVyZW5jZSBXb3JrZmxvdwotcm9sZXNQYWdlX3RpdGxlPVJvbGVzCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Um9sZSBTZXRzCi1zdGVwc1BhZ2VfdGl0bGU9U3RlcHMKLXRhc2tzUGFnZV90aXRsZT1UYXNrcwotdG9vbE1lbnRvcnNQYWdlX3RpdGxlPVRvb2wgTWVudG9ycwotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Xb3JrIFByb2R1Y3RzCi0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uCi1jaGVja0l0ZW1zU2VjdGlvbl9uYW1lPUNoZWNrIEl0ZW1zCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVNwZWNpZnkgdGhlIGNoZWNrIGl0ZW1zIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGNoZWNrbGlzdC4KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1EZXBlbmRlbmNpZXMKLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1UaGlzIHNlY3Rpb24gZGlzcGxheXMgZGVwZW5kZW5jaWVzIG9mIHRoaXMgY29udGVudCBwYWNrYWdlIHRvIG90aGVyIGNvbnRlbnQgcGFja2FnZXMuCi1kZXRhaWxTZWN0aW9uX25hbWU9RGV0YWlsIEluZm9ybWF0aW9uCi1kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPUdlbmVyYWwgSW5mb3JtYXRpb24KLWdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLWljb25TZWN0aW9uX25hbWU9SWNvbgotaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHswfS4KLW5vdGF0aW9uU2VjdGlvbl9uYW1lPURlbGl2ZXJ5IEluZm9ybWF0aW9uCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm92aWRlIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9UmVmZXJlbmNlZCBQbHVnLWluczoKLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPVRoaXMgc2VjdGlvbiBkaXNwbGF5cyBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoaXMgbWV0aG9kIHBsdWctaW4uCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1TdGFmZmluZyBJbmZvcm1hdGlvbgotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSBzdGFmZmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1zdGVwc1NlY3Rpb25fbmFtZT1TdGVwcwotc3RlcHNTZWN0aW9uX2Rlc2M9U3BlY2lmeSB0aGUgc3RlcHMgdG8gcGVyZm9ybSB0aGlzIHRhc2suCi10YWlsb3JpbmdTZWN0aW9uX25hbWU9VGFpbG9yaW5nCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1Db250ZW50IFZhcmlhYmlsaXR5Ci12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHswfSByZWxhdGVzIHRvIGFub3RoZXIgezB9LgotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9VmVyc2lvbiBJbmZvcm1hdGlvbgotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzCi1hZGRpdGlvbmFsSW5mb190ZXh0PUFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci1hcHBsaWNhdGlvbl90ZXh0PUFwcGxpY2F0aW9uOgotYWN0aW9uTGFiZWxfZWRpdD0mRWRpdAotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj0mU2hvdyBpbiBMaWJyYXJ5IFZpZXcKLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlczoKLWFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ9QXNzaWdubWVudCBhcHByb2FjaGVzOgotYXV0aG9yc190ZXh0PUF1dGhvcnM6Ci1iYWNrZ3JvdW5kX3RleHQ9QmFja2dyb3VuZDoKLWJhc2VFbGVtZW50X3RleHQ9QmFzZToKLWJhc2VHdWlkYW5jZV90ZXh0PUJhc2UgZ3VpZGFuY2U6Ci1icmllZkRlc2NyaXB0aW9uX3RleHQ9QnJpZWYgZGVzY3JpcHRpb246Ci1kZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aW9uOgotYmFja3VwYmVmb3Jlc2F2ZV90ZXh0PUJhY2sgdXAgYmVmb3JlIHNhdmUKLWJyaWVmT3V0bGluZV90ZXh0PUJyaWVmIG91dGxpbmU6Ci1jaGFuZ2VEYXRlX3RleHQ9Q2hhbmdlIGRhdGU6Ci1jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0PUNoYW5nZSBkZXNjcmlwdGlvbjoKLWNoZWNrSXRlbXNfdGV4dD1DaGVjayBJdGVtcwotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidXRlcwotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMKLWNvbnRyaWJ1dGVzX3RvX3RleHQ9Q29udHJpYnV0ZXMgdG8KLWNvcHlyaWdodF90ZXh0PUNvcHlyaWdodDoKLWVkaXRvcl90ZXh0PUVkaXRvcgotZXh0ZW5kc190ZXh0PUV4dGVuZHMKLWV4dGVuZF90ZXh0PUV4dGVuZAotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PUV4dGVybmFsIGRlc2NyaXB0aW9uOgotZXh0ZXJuYWxJZF90ZXh0PUV4dGVybmFsIElEOgotZ29hbHNfdGV4dD1Hb2FsczoKLWltcGFjdE9mTm90SGF2aW5nX3RleHQ9SW1wYWN0IG9mIG5vdCBoYXZpbmc6Ci1rZXlDb25zaWRlcmF0aW9uc190ZXh0PUtleSBjb25zaWRlcmF0aW9uczoKLWxldmVsc09mQWRvcHRpb25fdGV4dD1MZXZlbCBvZiBhZG9wdGlvbjoKLW1haW5EZXNjcmlwdGlvbl90ZXh0PU1haW4gZGVzY3JpcHRpb246Ci1uZXdFbGVtZW50X3RleHQ9TmV3IHswfQotbmFtZV90ZXh0PU5hbWU6Ci1ub3RBcHBsaWNhYmxlX3RleHQ9Tm90IGFwcGxpY2FibGUKLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9UGFja2FnaW5nIGd1aWRhbmNlOgotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVByZXNlbnRhdGlvbiBuYW1lOgotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9UHJvbXB0IGZvciBtZXRob2QgbGlicmFyeSBvbiBzdGFydHVwCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PUVuYWJsZSBpbnRlcm5hbCBkZWJ1ZyB0b29scwotbm90YXRpb25fdGV4dD1Ob3RhdGlvbjoKLXByb2JsZW1fdGV4dD1Qcm9ibGVtOgotcHVycG9zZV90ZXh0PVB1cnBvc2U6Ci1yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ9UmVhc29uIGZvciBub3QgbmVlZGluZzoKLXJlcGxhY2VzX3RleHQ9UmVwbGFjZXMKLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzCi1leHRlbmRzUmVwbGFjZXNfdGV4dD1FeHRlbmRzIGFuZCBSZXBsYWNlcwotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9UmVwcmVzZW50YXRpb24gb3B0aW9uczoKLXJlcHJlc2VudGF0aW9uX3RleHQ9U2VsZWN0ZWQgcmVwcmVzZW50YXRpb246Ci1hdHRhY2hlZEZpbGVfdGV4dD1BdHRhY2hlZCBmaWxlKHMpL1VSTChzKToKLXNraWxsc190ZXh0PVNraWxsczoKLXN0ZXBzX3RleHQ9U3RlcHM6Ci1zdGVwc19uYW1lX3RleHQ9TmFtZToKLXN0b3BfdGV4dD1TdG9wCi1wcmludF90ZXh0PVByaW50Ci1zeW5vbnltc190ZXh0PVN5bm9ueW1zOgotdHlwZV90ZXh0PVR5cGU6Ci1jb3B5X3RleHQ9Q29weQotZGVlcENvcHlfdGV4dD1EZWVwIENvcHkKLWJhY2tfdGV4dD1CYWNrCi1uZXdfcGx1Z2luPU5lJncgTWV0aG9kIFBsdWctaW4KLW1vdmU9Jk1vdmUuLi4KLXVuaXF1ZUlkX3RleHQ9VW5pcXVlIElEOgotdmFyaWFiaWxpdHlUeXBlX3RleHQ9VmFyaWFiaWxpdHkgdHlwZToKLXZlcnNpb25fdGV4dD1WZXJzaW9uOgotCi0jIEJ1dHRvbiBMYWJlbHMKLWFkZEJ1dHRvbl90ZXh0PUFkZC4uLgotYXR0YWNoQnV0dG9uX3RleHQ9QXR0YWNoIEZpbGUuLi4KLWF0dGFjaFVybEJ1dHRvbl90ZXh0PUF0dGFjaCBVcmwuLi4KLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PUNoYW5nZSBUeXBlLi4uCi1jbGVhckJ1dHRvbl90ZXh0PUNsZWFyCi1kZWxldGVCdXR0b25fdGV4dD1EZWxldGUKLWRldGFjaEJ1dHRvbl90ZXh0PURldGFjaAotZGlhZ3JhbV9zYXZlRXJyb3I9RXJyb3Igc2F2aW5nIGRpYWdyYW0KLWRvd25CdXR0b25fdGV4dD1Eb3duCi1kaXJlY3RvcnlfdGV4dD1EaXJlY3Rvcnk6Ci1vcmRlckJ1dHRvbl90ZXh0PU9yZGVyCi1lZGl0QnV0dG9uX3RleHQ9RWRpdC4uLgotcmVtb3ZlQnV0dG9uX3RleHQ9UmVtb3ZlCi1yZW5hbWVBY3Rpb25fdGV4dD1SZW4mYW1lLi4uCi1hc3NpZ25BY3Rpb25fdGV4dD1Bc3NpZ24uLi4KLXVuYXNzaWduQWN0aW9uX3RleHQ9VW5hc3NpZ24KLXJlYXNzaWduQWN0aW9uX3RleHQ9UmVhc3NpZ24uLi4KLWRlZXBDb3B5QWN0aW9uX3RleHQ9RGVlcCBDb3B5Li4uCi1yZW1vdmVfdGV4dD1SZW1vdmUKLXJlbmFtZV90ZXh0PVJlbmFtZQotU2F2ZUFzX3RleHQ9U2F2ZSBBcwotc2VsZWN0QnV0dG9uX3RleHQ9U2VsZWN0Li4uCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PURlc2VsZWN0Ci11cEJ1dHRvbl90ZXh0PVVwCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PU1ha2UgRGVmYXVsdAotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WaWV3IEhpc3RvcnkuLi4KLQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPVRhc2tzCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgaXMgdGhlIHBlcmZvcm1lciBvZiB0aGUgZm9sbG93aW5nIHRhc2tzLgotcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdGFza3MKLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QcmltYXJ5IHBlcmZvcm1lcjoKLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QWRkaXRpb25hbCBwZXJmb3JtZXI6Ci1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVdvcmsgUHJvZHVjdHM6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB3b3JrIHByb2R1Y3RzIHRoYXQgdGhpcyByb2xlIGlzIHJlc3BvbnNpYmxlIGZvci4KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zaWJsZSBmb3I6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Xb3JrIHByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dCBvZiB0YXNrcyB0aGF0IHRoaXMgcm9sZSBwZXJmb3JtczoKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBndWlkYW5jZS4KLXJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIEd1aWRhbmNlOgotcm9sZUd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBndWlkYW5jZSBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvcmllczoKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgcm9sZSBiZWxvbmdzLgotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJvbGUgU2V0czoKLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q3VzdG9tIENhdGVnb3JpZXM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2xlIHNldHM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q3VzdG9tIGNhdGVnb3JpZXM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY2F0ZWdvcmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgVGFzayBFZGl0b3IgUm9sZXMgUGFnZQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcwotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXNzaWduIHRoZSByb2xlcyB0byBwZXJmb3JtIHRoaXMgdGFzay4KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHJvbGVzOgotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVByaW1hcnkgcGVyZm9ybWVyczoKLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QWRkaXRpb25hbCBwZXJmb3JtZXJzOgotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByb2xlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VzogRG8geW91IHdhbnQgdG8gY2hhbmdlIHRoZSBwcmltYXJ5IHBlcmZvcm1lciB0byAnJ3swfScnPwotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPUNvbmZpcm0gcHJpbWFyeSByb2xlIGNoYW5nZQotCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0cwotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgdGhpcyB0YXNrLgotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIFdvcmsgUHJvZHVjdHMKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9TWFuZGF0b3J5IGlucHV0czoKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPU9wdGlvbmFsIGlucHV0czoKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPU91dHB1dHM6Ci10YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUd1aWRhbmNlCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZ3VpZGFuY2UuCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBHdWlkYW5jZToKLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkYW5jZToKLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZ3VpZGFuY2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UKLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWVzCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRhc2sgYmVsb25ncy4KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1EaXNjaXBsaW5lcwotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DdXN0b20gQ2F0ZWdvcmllcwotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluZXM6Ci10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q3VzdG9tIGNhdGVnb3JpZXM6Ci10YXNrQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY2F0ZWdvcmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1UYXNrcwotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgd29yayBwcm9kdWN0IGlzIGFuIGlucHV0IG9yIG91dHB1dCBmb3IgdGhlIGZvbGxvd2luZyB0YXNrcy4KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB0YXNrcwotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1NYW5kYXRvcnkgaW5wdXQ6Ci1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1PcHRpb25hbCBpbnB1dDoKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPU91dHB1dDoKLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFJvbGVzIFBhZ2UKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyByb2xlcyBhcmUgcmVzcG9uc2libGUgZm9yIG9yIG1vZGlmeSB0aGlzIHdvcmsgcHJvZHVjdC4KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSByb2xlcwotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zaWJsZSByb2xlOgotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9TW9kaWZ5aW5nIHJvbGVzOgotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9RGVsaXZlcmFibGUgUGFydHMKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBjb25zdGl0dXRlIHRoaXMgZGVsaXZlcmFibGUuCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzIGFzIGRlbGl2ZXJhYmxlIHBhcnRzOgotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHMgYXMgZGVsaXZlcmFibGUgcGFydHM6Ci13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZ3VpZGFuY2UuCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgR3VpZGFuY2U6Ci13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZ3VpZGFuY2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWVzCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB3b3JrIHByb2R1Y3QgYmVsb25ncy4KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RG9tYWlucwotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9V29yayBQcm9kdWN0IEtpbmRzOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9Q3VzdG9tIENhdGVnb3JpZXM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RG9tYWluOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1Xb3JrIHByb2R1Y3Qga2luZHM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPUN1c3RvbSBjYXRlZ29yaWVzOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBjYXRlZ29yaWVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUNvbnRlbnQgRWxlbWVudHMKLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGNvbnRlbnQgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGlzIHByYWN0aWNlLgotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgY29udGVudCBlbGVtZW50czoKLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Db250ZW50IGVsZW1lbnRzOgotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBDb250ZW50IGVsZW1lbnRzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc29ydE9yZGVyQnV0dG9uX3RleHQ9TWFudWFsIG9yZGVyIHdpdGhpbiB0eXBlCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NvcnRUeXBlQnV0dG9uX3RleHQ9U29ydCBieSBUeXBlCi0KLQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lPUd1aWRhbmNlCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgezB9LgotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBndWlkYW5jZToKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRhbmNlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lPURpc2NpcGxpbmVzCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZGlzY2lwbGluZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nLgotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBEaXNjaXBsaW5lczoKLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmVzOgotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IERpc2NpcGxpbmVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPVVzZSBkZWZhdWx0IGRpcmVjdG9yeQotCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UKLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VGFza3MKLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgdGFza3MgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lLgotZGlzY2lwbGluZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdGFza3M6Ci1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VGFza3M6Ci1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1SZWZlcmVuY2UgV29ya2Zsb3dzCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHJlZmVyZW5jZSB3b3JrZmxvd3MgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lLgotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgUmVmZXJlbmNlIFdvcmtmbG93czoKLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZWZlcmVuY2Ugd29ya2Zsb3dzOgotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBSZWZlcmVuY2Ugd29ya2Zsb3dzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Xb3JrIFByb2R1Y3RzCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBiZWxvbmcgdG8gdGhpcyBkb21haW4uCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHM6Ci1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBLaW5kIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0cwotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYmVsb25nIHRvIHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHM6Ci13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgU2V0IEdyb3VwaW5nIEVkaXRvciBSb2xlIFNldHMgUGFnZQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVJvbGUgU2V0cwotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHJvbGUgc2V0cyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0IGdyb3VwaW5nLgotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBSb2xlIFNldHM6Ci1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2xlIHNldHM6Ci1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gUm9sZSBTZXRzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIFNldCBFZGl0b3IgUm9sZXMgUGFnZQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcwotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSByb2xlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0Lgotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgcm9sZXM6Ci1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sZXM6Ci1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1Ub29sIE1lbnRvcnMKLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgdG9vbCBtZW50b3JzIHRoYXQgYmVsb25nIHRvIHRoaXMgdG9vbC4KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHRvb2wgbWVudG9yczoKLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Ub29sIG1lbnRvcnM6Ci10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFRvb2wgTWVudG9ycyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgQ3VzdG9tIENhdGVnb3J5IEVkaXRvciBBc3NpZ24gUGFnZQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPUNvbnRlbnQgRWxlbWVudHMKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBjb250ZW50IGVsZW1lbnRzIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgQ29udGVudCBFbGVtZW50czoKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPUNvbnRlbnQgZWxlbWVudHM6Ci1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gQ29udGVudCBFbGVtZW50cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZAotbmV3UGx1Z2luV2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgUGx1Zy1pbgotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1DcmVhdGUgYSBuZXcgbWV0aG9kIHBsdWctaW4KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dD1TcGVjaWZ5IGEgbmFtZSBhbmQgcHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgbWV0aG9kIHBsdWctaW4uCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBGYWlsZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QgcGx1Zy1pbi4KLW5ld1BsdWdpbkVycm9yX3JlYXNvbj1JbnRlcm5hbCBlcnJvci5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotIyBQcmVmZXJlbmNlIFBhZ2VzCi1tZXRob2RMaWJyYXJ5R3JvdXBfdGV4dD1NZXRob2QgbGlicmFyeQotZGVmYXVsdFBhdGhMYWJlbF90ZXh0PURlZmF1bHQgcGF0aDoKLW1vZGVsaW5nR3JvdXBfdGV4dD1Nb2RlbGluZwotdXNlckludGVyZmFjZUdyb3VwX3RleHQ9VXNlciBpbnRlcmZhY2UKLWRlYnVnR3JvdXBfdGV4dD1EZWJ1ZwotZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveF90ZXh0PUVuYWJsZSBtZXRob2QgbGlicmFyeSB2YWxpZGF0aW9uCi1pbnZhbGlkUHJlZmVyZW5jZUhpc3RvcnlTaXplRXJyb3JfbXNnPVByZWZlcmVuY2UgaGlzdG9yeSBzaXplIG11c3QgYmUgYW4gaW50ZWdlciB3aXRoIHZhbHVlIHJhbmdpbmcgZnJvbSB7MH0gdG8gezF9LgotCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcwotY3JlYXRlRGlhbG9nX3RpdGxlPUNyZWF0ZSBFbGVtZW50Ci1kZWxldGVEaWFsb2dfdGl0bGU9RGVsZXRlIEVsZW1lbnQKLWVkaXREaWFsb2dfdGl0bGU9RWRpdCBFbGVtZW50Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotbW92ZURpYWxvZ190aXRsZT1Nb3ZlIEVsZW1lbnQKLXJlbmFtZURpYWxvZ190aXRsZT1SZW5hbWUgRWxlbWVudAotd2FybmluZ0RpYWxvZ190aXRsZT1XYXJuaW5nCi0KLSMgQWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcyBFcnJvciBEaWFsb2cKLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MKLQotIyBTZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZwotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gZm9yIFByb2Nlc3MKLQotIyBFZGl0IFByb2Nlc3MgRXJyb3IgRGlhbG9nCi1lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZT1FZGl0IFByb2Nlc3MgRWxlbWVudAotCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cKLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPU9wZW4gTWV0aG9kIExpYnJhcnkKLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9VGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgd2FzIG5vdCBzYXZlZCBwcm9wZXJseS4gRG8geW91IHdhbnQgdG8gaWdub3JlIHRoZSBlcnJvciBhbmQgcHJvY2VlZCB0byBvcGVuIGFub3RoZXIgbGlicmFyeT8KLQotIyBTYXZlIExpYnJhcnkgRGlhbG9nCi1zYXZlTGlicmFyeURpYWxvZ190aXRsZT1TYXZlIE1ldGhvZCBMaWJyYXJ5Ci1zYXZlTGlicmFyeURpYWxvZ190ZXh0PVRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIG1vZGlmaWVkLiBEbyB5b3Ugd2FudCB0byBzYXZlIHRoZSBjaGFuZ2VzPwotCi0jIFVwZ3JhZGUgTGlicmFyeSBEaWFsb2cKLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVVwZ3JhZGUgTWV0aG9kIExpYnJhcnkKLQotIyBEZWxldGUgRWxlbWVudCBSZWZlcmVuY2UgRGlhbG9nCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVRoZSBlbGVtZW50ICcnezB9JycgaGFzIGFscmVhZHkgYmVlbiBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSAnJ3sxfScnPwotCi0jIEVycm9yIE1lc3NhZ2VzCi1ub09wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDAwRTogTm8gb3BlbiBtZXRob2QgbGlicmFyeS5cblxuQSBtZXRob2QgbGlicmFyeSBtdXN0IGJlIG9wZW5lZCBiZWZvcmUgYSBuZXcgbWV0aG9kIGVsZW1lbnQgY2FuIGJlIGFkZGVkLlxuXG5DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkgb3Igb3BlbiBhbiBleGlzdGluZyBvbmUgYW5kIHRyeSBhZ2Fpbi4KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiBUaGUgezB9IG5hbWUgaXMgbWlzc2luZy5cblxuQWxsIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cyBtdXN0IGhhdmUgYSBuYW1lLlxuXG5DbGljayBPSyBhbmQgZW50ZXIgYSB2YWxpZCBuYW1lIGZvciB0aGUgZWxlbWVudC4KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAyRTogVGhlIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy5cblxuQSBtZXRob2QgZWxlbWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS5cblxuQ2xpY2sgT0sgYW5kIGVudGVyIGEgZGlmZmVyZW50IG5hbWUgZm9yIHRoZSBlbGVtZW50LgotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogVGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjcmVhdGVkLgotZGVsZXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA0VzogVGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBkZWxldGVkLgotaW50ZXJuYWxFcnJvcl9tc2c9SVVQQTAwMDVFOiBBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZz1JVVBBMDAwNkU6IFRoZSBzcGVjaWZpZWQgcHJlc2VudGF0aW9uIG5hbWUgaXMgaW52YWxpZC5cblxuQ2xpY2sgT0sgYW5kIGVudGVyIGEgZGlmZmVyZW50IG5hbWUuCi1pbnZhbGlkQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA3RTogVGhlIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uICcnezB9JycgaXMgbm90IGEgc3Vic2V0IG9mIHRoZSBwcm9jZXNzJydzIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cblxuSW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGludGVncml0eSBvZiBhIHByb2Nlc3MsIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhIHN1cGVyc2V0IG9mIGFsbCBvdGhlciBjb25maWd1cmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MuXG5cblNlbGVjdCBhbm90aGVyIGNvbmZpZ3VyYXRpb24gb3IgbW9kaWZ5IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSB0aGUgY29udGVudCBvZiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwOEU6IFRoZSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbiAnJ3swfScnIGlzIG5vdCBhIHN1cGVyc2V0IG9mIHRoZSBvdGhlciBjb25maWd1cmF0aW9ucyByZWZlcmVuY2VkIGJ5IHRoZSBwcm9jZXNzLlxuXG5JbiBvcmRlciB0byBtYWludGFpbiB0aGUgaW50ZWdyaXR5IG9mIGEgcHJvY2VzcywgaXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtdXN0IGJlIGEgc3VwZXJzZXQgb2YgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy5cblxuU2VsZWN0IGFub3RoZXIgY29uZmlndXJhdGlvbiBvciBtb2RpZnkgdGhlIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSBsb2FkZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEU6IFRoZSBtZXRob2QgbGlicmFyeSBjYW5ub3QgYmUgc2F2ZWQuCi1zYXZlTGlicmFyeVRvRXJyb3JfbXNnPUlVUEEwMDEwRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSBzYXZlZCB0byAnJ3swfScnLgotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogVGhlIGVsZW1lbnQgJyd7MH0nJyBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMkU6IFRoZSBtZXRob2QgbGlicmFyeSBjYW5ub3QgYmUgdXBncmFkZWQuCi1vcGVuQ29uZmlnV2l6YXJkRXJyb3JfbXNnPUlVUEEwMDE2RTogVGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgY2Fubm90IGJlIG9wZW5lZC4KLQotIyBFcnJvciBSZWFzb25zCi1lcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotaW50ZXJuYWxFcnJvcl9yZWFzb249QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgdXBncmFkZWQgbWV0aG9kIGxpYnJhcnkuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLWNvbmZpZ3VyYXRpb25QYWdlX1F1aWNrZml4RXJyb3JfcmVhc29uMT1JVVBBMDAyMFc6VW5hYmxlIHRvIGZpeCB0aGUgcHJvYmxlbSBmb3IgZWxlbWVudCAnJ3swfScnIHNpbmNlIGl0IGlzIGluIGEgc3VidHJhY3RlZCBjYXRlZ29yeS4gXG5cbiBZb3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgc3VidHJhY3RlZCBjYXRlZ29yeS4KLWNvbmZpZ3VyYXRpb25QYWdlX3F1aWNrZml4RXJyb3JfdGl0bGU9UXVpY2sgRml4Ci0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPU9wZW5pbmcgbWV0aG9kIGxpYnJhcnkuLi4KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9U2F2aW5nIG1ldGhvZCBsaWJyYXJ5IC4uLgotdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZT1VcGdyYWRpbmcgbWV0aG9kIGxpYnJhcnkuLi4KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9TG9hZGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4uLgotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1TYXZpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMgaW4gbmV3IGZpbGUgZm9ybWF0Li4uCi1zYXZpbmdUYXNrX25hbWU9U2F2aW5nICcnezB9JycuLi4KLXNhdmluZ0ZpbGVzVGFza19uYW1lPVNhdmluZyBmaWxlcy4uLgotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9Rml4aW5nIGNvbnRlbnQgZGVzY3JpcHRpb24gR1VJRHMuLi4KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9RGVsZXRpbmcgaW52YWxpZCByZWZlcmVuY2VzLi4uCi0KLQotIyBBZGQgRWRpdG9yIFRvIEJyb3dzaW5nIFBlcnNwZWN0aXZlIFdhcm5pbmcgRGlhbG9nCi1hZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2c9SVVQQTAwNDZXOiBUaGlzIHBlcnNwZWN0aXZlIGhhcyBiZWVuIHNwZWNpYWxseSBkZXNpZ25lZCB0byBtYXhpbWl6ZSB5b3VyIHVzZXIgZXhwZXJpZW5jZSBvZiBicm93c2luZyB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuIE5vIGVkaXRvciBjYW4gYmUgYWRkZWQgb3IgZGlzcGxheWVkIGhlcmUuCi0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlPUNoYW5nZSBEZXNjcmlwdGlvbiBIaXN0b3J5Ci1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPUNoYW5nZSBoaXN0b3J5OgotCi0jIE1ldGhvZCBFbGVtZW50IERlbGV0ZSBBY3Rpb24KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybSBEZWxldGlvbgotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz9cblxuVGhlIGZvbGxvd2luZyBlbGVtZW50KHMpIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgaXRlbShzKSB0byBiZSBkZWxldGVkOiB7MX0KLQotIyBOZXcgTGlicmFyeSBEaWFsb2cKLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBUaGUgIG1ldGhvZCBsaWJyYXJ5ICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuCi1lcnJvckRpYWxvZ19lcnJvcj1DYW5ub3QgY3JlYXRlIGEgbWV0aG9kIGxpYnJhcnkgd2l0aGluIGFub3RoZXIgbWV0aG9kIGxpYnJhcnkuCi1lcnJfbm9vcGVubGlicmFyeT1JVVBBMDA0MEU6IE5vIG9wZW4gbWV0aG9kIGxpYnJhcnkuXG5cbkEgbWV0aG9kIGxpYnJhcnkgbXVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgbmV3IG1ldGhvZCBwbHVnLWluIGNhbiBiZSBhZGRlZC5cblxuQ3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IG9yIG9wZW4gYW4gZXhpc3Rpbmcgb25lIGFuZCB0cnkgYWdhaW4uCi1lcnJfbG9hZGluZ2xpYnJhcnk9RXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1tc2dfcmVsb2FkTGlicmFyeT1FcnJvciB1bmRvaW5nIHRoZSBmYWlsZWQgZGVsZXRpb24uIFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkLgotCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZwotcmVsb2FkRGlhbG9nX21lc3NhZ2U9VGhlIGxpYnJhcnkgbmVlZHMgdG8gYmUgcmVsb2FkZWQgdG8gcmVzdG9yZSBpdHMgb3JpZ2luYWwgc3RhdGUuCi1yZWxvYWREaWFsb2dfdGl0bGU9UmVsb2FkIExpYnJhcnkKLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPU1vdmUgRXJyb3IKLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RXJyb3IgZHVyaW5nIG1vdmUKLWRpYWxvZ3NfQXNzaWduRGlhbG9nX2Vycm9yTWVzc2FnZT1FcnJvciBkdXJpbmcgYXNzaWduCi0KLSMgUHJvY2VzcyBGb3JtIEVkaXRvcgotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlPVNhdmUKLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMT1UaGlzIGNoYW5nZSB3aWxsIGFmZmVjdCBhbGwgZGlhZ3JhbXMgaW4geW91ciBwcm9jZXNzLiBUaGUgZWRpdG9yIHdpbGwgYmUgc2F2ZWQgYWZ0ZXIgeW91ciBjaGFuZ2UuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyPVRoZSBlZGl0b3Igd2lsbCBiZSBzYXZlZCBhZnRlciB5b3VyIGNoYW5nZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IFBhZ2UKLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZT1Db25maXJtIFJlbW92aW5nCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHZpZXcgJyd7MH0nJz8KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1XYXJuaW5nCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUNvbmZpZ3VyYXRpb246Ci1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9Q29uZmlndXJhdGlvbiBWaWV3cwotY29uZmlnVmlld1BhZ2Vfdmlld3M9Vmlld3MKLWNvbHVtbnNlbGVjdGlvbl90ZXh0PUNvbHVtbiBzZWxlY3Rpb246Ci1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1BZGQgVmlldy4uLgotY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ9UmVtb3ZlIFZpZXcKLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1NYWtlIERlZmF1bHQKLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogVmlldyB3aXRoIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlPVB1Ymxpc2hlZCBOYXZpZ2F0aW9uIFZpZXdzCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPVNwZWNpZnkgdGhlIHZpZXdzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCB3aGVuIHRoaXMgY29uZmlndXJhdGlvbiBpcyBwdWJsaXNoZWQuIFRvIGNyZWF0ZSBhIHZpZXcsIGNsaWNrIEFkZCBWaWV3IHRvIHNlbGVjdCBhbnkgc3RhbmRhcmQgb3IgY3VzdG9tIGNhdGVnb3J5IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbi4gIFRoZSBzZWxlY3RlZCBjYXRlZ29yeSB3aWxsIHJlcHJlc2VudCB0aGUgdmlldyBhbmQgdGhlIGNhdGVnb3J5J3Mgc3ViLWNhdGVnb3JpZXMgYW5kIGNvbnRlbnQgZWxlbWVudHMgd2lsbCByZXByZXNlbnQgdGhlIHZpZXcncyB0cmVlIGVsZW1lbnRzLgotCi0jIERlc2NyaXB0aW9uIFRhYgotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydCBHdWlkYW5jZQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE9SVVQQTAwNDBXOiAgUGxlYXNlIHNhdmUgdGhlIGVkaXRvciBmaXJzdC4KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyPVRoZXJlIGFyZSBubyBjb21wYXRpYmxlIGd1aWRhbmNlIGZvciB0aGlzIHR5cGUuCi0KLWNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydCBBY3Rpdml0eQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UKLUFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsPUJyaWVmIGRlc2NyaXB0aW9uIG9mIHNlbGVjdGVkIGVsZW1lbnQ6Ci0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZT1FbnRlciBFbGVtZW50IE5hbWUKLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPVRoZSBuYW1lIGZpZWxkIGNhbm5vdCBiZSBlbXB0eS4KLQotIyBNZXRob2QgUGx1Zy1pbiBEZXNjcmlwdGlvbgotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U9RGVzZWxlY3RpbmcgdGhlIHJlZmVyZW5jZWQgcGx1Zy1pbihzKSBhc3NvY2lhdGVkIHdpdGggcGx1Zy1pbiAnJ3swfScnIHdpbGwgcHJvZHVjZSBpbnZhbGlkIHJlbGF0aW9uc2hpcHMgdGhhdCB3aWxsIGJlIGRlbGV0ZWQuXG5cblRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIERvIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCB0aGlzIGNoYW5nZT8KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lPVlvdSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIHBsdWctaW4gZnJvbSAnJ3swfScnIHRvICcnezF9JycuIFRoaXMgYWN0aW9uIHdpbGwgc2F2ZSBhbmQgY2xvc2UgYW55IG9wZW4gZWRpdG9ycyBvZiBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhpcyBwbHVnLWluIGFuZCByZW5hbWUgdGhlIHBsdWctaW4gZm9sZGVyIHRvIHRoZSBuZXcgbmFtZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1SZW5hbWUgTWV0aG9kIFBsdWctaW4KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9Q291bGQgbm90IHJlbmFtZSBwbHVnLWluIGZvbGRlciB0byBuZXcgbmFtZQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1Mb2NrIHBsdWctaW4KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U9Q2hhbmdpbmcgdGhlIGxvY2sgc3RhdGUgb2YgdGhpcyBwbHVnLWluICcnezB9Jycgd2lsbCBzYXZlIGFuZCBjbG9zZSBhbnkgb3BlbiBlZGl0b3JzIG9mIGVsZW1lbnRzIGJlbG9uZ2luZyB0byBpdC4gRG8geW91IHdhbnQgcHJvY2VlZCB3aXRoIHRoaXMgY2hhbmdlPwotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX3N1cHBvcnRpbmdQbHVnaW5MYWJlbD1TdXBwb3J0aW5nIHBsdWctaW4KLQotIyBQcm9jZXNzIERlc2NyaXB0aW9uCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1SZW5hbWUKLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U9WW91IGFyZSBhYm91dCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBwcm9jZXNzLiBUaGlzIHdpbGwgc2F2ZSB0aGlzIGVkaXRvciBhbmQgcmVuYW1lIHRoZSBwcm9jZXNzIGZvbGRlciB0byB0aGUgbmV3IG5hbWUuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbj1EZXNjcmlwdGlvbjoKLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlPUNvbmZpZ3VyYXRpb24KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvbk1lc3NhZ2U9U3BlY2lmeSBhbGwgdGhlIGNvbmZpZ3VyYXRpb25zIHZhbGlkIGZvciB0aGlzIHByb2Nlc3MuIFNlbGVjdCBvbmUgY29uZmlndXJhdGlvbiBhcyB0aGUgZGVmYXVsdCBhbmQgaXQgbmVlZHMgdG8gYmUgYSBzdXBlci1zZXQgb2YgYWxsIHRoZSBvdGhlciBjb25maWd1cmF0aW9ucy4KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1Db25maWd1cmF0aW9uczoKLXByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0PShkZWZhdWx0KQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249U2VsZWN0IHRoZSBjb25maWd1cmF0aW9ucyB0byBhZGQKLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPVRoaXMgd2lsbCBzYXZlIHRoZSBjdXJyZW50IGVkaXRvciBhbmQgdGhlIGNoYW5nZSB3aWxsIGJlIHBlcm1hbmVudC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlPVRoZSBmb2xsb3dpbmcgZGVzY3JpcHRvcnMgYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFmdGVyIGRlbGV0aW9uIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50cy5cblNlbGVjdCBkZXNjcmlwdG9ycyB5b3Ugd2FudCB0byBkZWxldGUuCi0KLSMgVmlldyBIZWxwZXIKLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1MaWJyYXJ5IEhlYWx0aCBDaGVjawotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9UGVyZm9ybWluZyBoZWFsdGggY2hlY2sgb24gbGlicmFyeS4uLgotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9VGhlIGhlYWx0aCBjaGVjayBvbiBvcGVuIGxpYnJhcnkgaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gU2VlIHRoZSByZXBvcnQgaW4gdGhlIGxvZyBmaWxlLgotCi0jIEF0dGFjaCBHdWlkYW5jZSBGaWxlIERpYWxvZwotYXR0YWNoR3VpZGFuY2VGaWxlRGlhbG9nX3RpdGxlPUF0dGFjaCBGaWxlCi0KLSMgQ3JlYXRlIEVsZW1lbnQgRXJyb3IgRGlhbG9nCi1jcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlPUNyZWF0ZSBOZXcgezB9Ci1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPUVycm9yIGNyZWF0aW5nIG5ldyB7MH0uCi0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9UmVsb2FkIExpYnJhcnkKLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249VGhlIHswfSBuYW1lIGNhbm5vdCBiZSBlbXB0eS5cblxuU3BlY2lmeSBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWRlbGV0ZUNvbmZpZ0Vycm9yX3JlYXNvbj1UaGUgY29uZmlndXJhdGlvbiBpcyByZWZlcmVuY2VkIGJ5IHByb2Nlc3MgJyd7MH0nJwotCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQKLWdlZl9jaGFuZ2VCb3VuZHNDb21tYW5kX2xhYmVsPUNoYW5nZSBCb3VuZHMKLSMgQ2hhbmdlTmFtZUNvbW1hbmQKLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1DaGFuZ2UgTmFtZQotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX3VuZG9NZXNzYWdlPUNhbm5vdCB1bmRvIHRoZSBuYW1lIGNoYW5nZS5cblxuVW5kbyBuYW1lIGNoYW5nZSBpcyBub3QgYWxsb3dlZCBpZiBwcmV2aW91cyBuYW1lIGlzIG51bGwuCi0jIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9Q2hhbmdlIFByb3BlcnR5IFZhbHVlCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQKLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPUNyZWF0ZSBCZW5kcG9pbnQKLSMgQ3JlYXRlTGlua0NvbW1hbmQKLWdlZl9jcmVhdGVMaW5rQ29tbWFuZF9sYWJlbD1MaW5rIENyZWF0aW9uCi0jIENyZWF0ZU5vZGVDb21tYW5kCi1nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw9Q3JlYXRlIE5ldyBOb2RlCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQKLWdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPURlbGV0ZSBCZW5kcG9pbnQKLSMgRGVsZXRlQ29tbWFuZAotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9RGVsZXRlCi0jIERlbGV0ZUxpbmtDb21tYW5kCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9RGVsZXRlIENvbm5lY3Rpb24KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQKLWdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1Nb3ZlIEJlbmRwb2ludAotIyBSZWNvbm5lY3RMaW5rQ29tbWFuZAotZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsPVJlY29ubmVjdCBMaW5rCi0KLSMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLSMgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIKLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0Ci1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbgotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT1UaGUgY29uZmlndXJhdGlvbiAnJ3swfScnIGNhbm5vdCBiZSBkZWxldGVkIHNpbmNlIGl0IGlzIHN0aWxsIGluIHVzZSBieSBwcm9jZXNzICcnezF9JycuCi0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlPURlbGV0ZSBFcnJvcgotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPVVuaGFuZGxlZCBleGNlcHRpb24KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVNlZSBkZXRhaWxzCi0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlPVNhdmUgRXJyb3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IEVycm9yIHNhdmluZyBmaWxlCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9Q29tbWl0IEVycm9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMT1TZWUgbG9nIGZpbGUgZm9yIG1vcmUgZGV0YWlscwotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9U2VlIGRldGFpbHMKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlPVJlbmFtZSBFcnJvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9T25lIG9yIG1hbnkgZmlsZXMgb2YgdGhpcyBlZGl0b3IgaGF2ZSBiZWVuIHJlbW92ZWQuIFRoZSBlZGl0b3IgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBoYXMgdG8gY2xvc2UuCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPUludmFsaWQgRWRpdG9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1FcnJvciByZW5hbWluZyBmaWxlKHMpICcnezB9JycKLQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlCi1yZW5hbWVFcnJvcl90aXRsZT1SZW5hbWUgRWxlbWVudAotcmVuYW1lRXJyb3JfbXNnPUlVUEEwMDEzRTogVGhlIHJlbmFtZSBvcGVyYXRpb24gY2Fubm90IGJlIGNvbXBsZXRlZC4KLVNlbGVjdEVsZW1lbnREaWFsb2dfc2VsZWN0ZWxlbWVudF90ZXh0PVNlbGVjdCBFbGVtZW50Ci0KLSMgRWRpdG9yQ2hvb3NlcgotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlPU9wZW4gTWV0aG9kIEVkaXRvcgotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXB0aW9uOgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsPVNlbGVjdCBBbGwKLU9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGVfZWRpdF90ZXh0MD1FZGl0IEVsZW1lbnQKLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIzRTogQ2Fubm90IG9wZW4gdGhlIGVkaXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIE1ldGhvZCBlbGVtZW50LgotRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU9U2VsZWN0IEltYWdlIEZpbGUKLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lPU5ldyBMaWJyYXJ5Ci1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbjoKLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbnMgYW5kIGNsaWNrIEZpbmlzaCB0byBvcGVuIHRoZW0uCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1EZXNlbGVjdCBBbGwKLUVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0PVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBvZiBuZXdseSBtaWdyYXRlZCB7MH0gdG8gcmVwbGFjZSB0aGUgc2VsZWN0ZWQgezB9Ci1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPUEgc3lzdGVtIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuQ2xvc2Ugc29tZSBvZiB0aGUgb3BlbmVkIGVkaXRvcnMgYW5kIHRyeSBhZ2Fpbi4KLQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPUltYWdlIGlzIGludmFsaWQKLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBUaGUgc2VsZWN0ZWQgaW1hZ2UgJyd7MH0nJyBpcyBsYXJnZXIgdGhhbiB0aGUgYWxsb3dlZCBzaXplICh7MX0gYnkgezJ9KS4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGltYWdlLgotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlPUltYWdlIGlzIGludmFsaWQKLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkU6IFRoZSBzZWxlY3RlZCBmaWxlICcnezB9JycgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBpbWFnZS4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1TZWxlY3QuLi4KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlEZXNjcmlwdGlvbj1NZXRob2QgbGlicmFyeSBkZXNjcmlwdGlvbgotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0RlZmF1bHRCcmllZkRlc2NyaXB0aW9uPU1ldGhvZCBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPUFsbCBlZGl0b3JzIG11c3QgYmUgY2xvc2VkLiBTZWxlY3QgdGhlIG9uZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIGZpcnN0LCBpZiBhcHBsaWNhYmxlLgotCi0jIFRlbXBsYXRlRGVzY3JpcHRpb25QYWdlCi1mb3Jtc19HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVRoZSBzZWxlY3RlZCBmaWxlIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudCB0byB0aGlzIEd1aWRhbmNlLgotZm9ybXNfR3VpZGFuY2VXaXRoVXJsQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZz1UaGUgc2VsZWN0ZWQgVVJMIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudCB0byB0aGlzIEd1aWRhbmNlLgotCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZwotbmV3TGlicmFyeUVycm9yX21zZz1JVVBBMDAxNEU6IFVuYWJsZSB0byBjcmVhdGUgdGhlIG1ldGhvZCBsaWJyYXJ5LgotbmV3TGlicmFyeUludGVybmxFcnJvcl9yZWFzb249QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotbmV3TGlicmFyeUVycm9yX3JlYXNvbjE9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBwYXRoICcnezB9JycgaXMgaW52YWxpZC4KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPUEgbWV0aG9kIGxpYnJhcnkgYWxyZWFkeSBleGlzdHMgaW4gJyd7MH0nJy4KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24zPVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgZm9sZGVyICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuCi1uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlPVNlbGVjdCBPSyB0byBzcGVjaWZ5IGFub3RoZXIgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQotI1Byb2Nlc3MgbGl0ZXJhbHMKLVByb2Nlc3NfRXh0ZXJuYWxJRD1FeHRlcm5hbCBJRDoKLVByb2Nlc3NfUHVycG9zZT1QdXJwb3NlOgotUHJvY2Vzc19TY29wZT1TY29wZToKLVByb2Nlc3NfVXNhZ2VOb3Rlcz1Vc2FnZSBOb3RlczoKLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlczoKLVByb2Nlc3NfSG93VG9TdGFmZj1Ib3cgdG8gU3RhZmY6Ci1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249S2V5IENvbnNpZGVyYXRpb25zOgotUHJvY2Vzc19TY2FsZT1TY2FsZToKLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1Qcm9qZWN0IENoYXJhY3RlcmlzdGljczoKLVByb2Nlc3NfUmlza0xldmVsPVJpc2sgTGV2ZWw6Ci1Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU9RXN0aW1hdGluZyBUZWNobmlxdWVzOgotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVByb2plY3QgTWVtYmVyIEV4cGVydGlzZToKLVByb2Nlc3NfVHlwZU9mQ29udHJhY3Q9VHlwZSBPZiBDb250cmFjdDoKLQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMKLWJhY2tCdXR0b25fdGV4dD1CYWNrCi1mb3J3YXJkQnV0dG9uX3RleHQ9Rm9yd2FyZAotZm9yd2FyZF90ZXh0PUZvcndhcmQKLXN0b3BCdXR0b25fdGV4dD1TdG9wCi1yZWZyZXNoQnV0dG9uX3RleHQ9UmVmcmVzaAotcmVmcmVzaF90ZXh0PVJlZnJlc2gKLW5ld25hbWVfdGV4dD1OZXcgbmFtZToKLXByaW50QnV0dG9uX3RleHQ9UHJpbnQKLQotIyBDb250ZXh0IG1lbnVzCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09JlJlZnJlc2gKLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZTaG93IFByb3BlcnRpZXMKLQotX1VJX01ldGhvZEVkaXRvcl9tZW51PSZNZXRob2QgRWRpdG9yCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOZXcKLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJmV3IFNpYmxpbmcKLQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9U2VsZWN0aW9uCi1fVUlfUGFyZW50UGFnZV9sYWJlbD1QYXJlbnQKLV9VSV9MaXN0UGFnZV9sYWJlbD1MaXN0Ci1fVUlfVHJlZVBhZ2VfbGFiZWw9VHJlZQotX1VJX1RhYmxlUGFnZV9sYWJlbD1UYWJsZQotX1VJX1RhYmxlVHJlZVBhZ2VfbGFiZWw9VGFibGVUcmVlCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPU9iamVjdAotX1VJX1NlbGZDb2x1bW5fbGFiZWw9U2VsZgotCi1fVUlfTm9PYmplY3RTZWxlY3RlZD1TZWxlY3RlZCBOb3RoaW5nCi1fVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ9U2VsZWN0ZWQgT2JqZWN0OiB7MH0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPVNlbGVjdGVkIHswfSBPYmplY3RzCi0KLV9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw9T3BlbiBFZGl0b3IKLQotX1VJX1dpemFyZF9jYXRlZ29yeT1FeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzCi0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1NZXRob2QgTW9kZWwKLV9VSV9NZXRob2RNb2RlbFdpemFyZF9kZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgTWV0aG9kIG1vZGVsCi0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9TWV0aG9kIE1vZGVsIEVkaXRvcgotCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NeQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uPW1ldGhvZAotCi1fVUlfV2l6YXJkX2xhYmVsPU5ldwotCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1UaGUgZmlsZW5hbWUgbXVzdCBlbmQgaW4gJycuezB9JycKLQotX1VJX01vZGVsT2JqZWN0PU1vZGVsIE9iamVjdAotX1VJX1hNTEVuY29kaW5nPVhNTCBFbmNvZGluZwotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1TZWxlY3QgYSBtb2RlbCBvYmplY3QgdG8gY3JlYXRlCi0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9RmlsZSBDb25mbGljdAotX1dBUk5fRmlsZUNvbmZsaWN0PVRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCBjb25mbGljdCB3aXRoIGNoYW5nZXMgbWFkZSBvdXRzaWRlIHRoZSBlZGl0b3IuIERvIHlvdSB3aXNoIHRvIGRpc2NhcmQgdGhpcyBlZGl0b3IncyBjaGFuZ2VzPwotCi0jIEFkZCBMaW5rIERpYWxvZwotYWRkTGlua0RpYWxvZ19saW5rVHlwZT1UeXBlOgotb3BlbkxpbmtDaGVja2JveF90ZXh0PU9wZW4gbGluayBpbiBhIHNlcGFyYXRlIGJyb3dzZXIgd2luZG93Ci0KLSMgQWRkIEltYWdlIERpYWxvZwotaGVpZ2h0TGFiZWxfdGV4dD1IZWlnaHQ6Ci13aWR0aExhYmVsX3RleHQ9V2lkdGg6Ci1FbGVtZW50c1ZpZXdfMjA9Y2FwYWJpbGl0eSBwYXR0ZXJuCi1FbGVtZW50c1ZpZXdfMjE9ZGVsaXZlcnkgcHJvY2VzcwotRWxlbWVudHNWaWV3XzIyPXByb2Nlc3MKLUVsZW1lbnRzVmlld18zNT17MH0gaXMgcmVhZC1vbmx5LiBNYWtlIGl0IHdyaXRhYmxlIGJlZm9yZSBjb250aW51aW5nLgotRWxlbWVudHNWaWV3XzM2PUVycm9yIGxvYWRpbmcgbGlicmFyeQotYWx0VGFnTGFiZWxfdGV4dD1BTFQgdGFnOgotaW1hZ2VTaXplTGFiZWxfdGV4dD1IZWlnaHQgYW5kIHdpZHRoIG9mIGltYWdlIG11c3QgYmUgYXQgbGVhc3QgMTAgYW5kIG5vIG1vcmUgdGhhbiA2MDAuIEludmFsaWQgaGVpZ2h0IGFuZCB3aWR0aCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN1aXRhYmxlIHNpemUuCi0KLSMgUHJvY2VzcyBFZGl0b3IKLVByb2Nlc3NFZGl0b3I9UHJvY2Vzc0VkaXRvcgotUHJvY2Vzc0VkaXRvcl9OYW1lPU5hbWUKLVByb2Nlc3NFZGl0b3JfUHJlc2VudGF0aW9uTmFtZT1QcmVzZW50YXRpb24gTmFtZQotUHJvY2Vzc0VkaXRvcl9JbmRleD1JbmRleAotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9UHJlZGVjZXNzb3JzCi0jQ29uZmlndXJhdGlvblBhZ2VfU2VsZWN0ZWQ9U2VsZWN0ZWQ6IAotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249U2VsZWN0IGEgY2hlY2sgaXRlbSBhbmQgY2xpY2sgVXAgb3IgRG93biB0byBjaGFuZ2UgaXRzIG9yZGVyLgotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9UmVuYW1pbmcuLi4KLVByb2Nlc3NFZGl0b3JfTW9kZWxJbmZvPU1vZGVsIEluZm8KLVByb2Nlc3NFZGl0b3JfUHJlZml4PVByZWZpeAotTW92ZURpYWxvZ19tb3ZlX3RleHQ9TW92ZQotQXNzaWduRGlhbG9nX2Fzc2lnbl90ZXh0PUFzc2lnbgotQXNzaWduRGlhbG9nX3JlYXNzaWduX3RleHQ9UmVhc3NpZ24KLUNoZWNrbGlzdE9yZGVyX3RpdGxlPU9yZGVyIENoZWNrIEl0ZW1zCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1SZXBlYXRhYmxlCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9T25nb2luZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVN5bmNocm9uaXplLi4uCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUV2ZW50LURyaXZlbgotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1EZWxpdmVyYWJsZQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1PcHRpb25hbAotRmlsdGVyRGlhbG9nX1R5cGVfdGV4dD1NZXRob2QgRWxlbWVudCBUeXBlOgotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1FeHBhbmQgQWxsCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PU1vdmluZy4uLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZz1JVVBBMDAyNVc6IFNoYXBlIGljb24gZm9yIHswfSBpcyBub3QgZm91bmQgaW4gcGF0aDogezF9Ci1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvcj1JVVBBMDAyNUU6IEVycm9yOiBTaGFwZSBpY29uIHNlY3Rpb246IHswfQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9TmFtZToKLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPU5hbWU6Ci1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgQ29uZmlndXJhdGlvbgotbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZT1OZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24KLXByZWZlcmVuY2VfV29ya0JyZWFrZG93bkVsZW1lbnRzPVBoYXNlLCBJdGVyYXRpb24sIEFjdGl2aXR5IGFuZCBNaWxlc3RvbmUKLXByZWZlcmVuY2VfRGVzY3JpcHRvckVsZW1lbnRzPVJvbGUsIFRhc2sgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1wcmVmZXJlbmNlX2JyZWFrRG93bkVsZW1lbnRfRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHdpbGwgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdCBpbiB0aGUgcHJvY2VzcyBlZGl0b3I6Ci1wcmVmZXJlbmNlX0FjdGl2aXR5X0RpYWdyYW09QWN0aXZpdHkgRGlhZ3JhbSAKLXByZWZlcmVuY2VfQWN0aXZpdHlfRGV0YWlsX0RpYWdyYW09QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLXByZWZlcmVuY2VfRGVzY3JpcHRvcnM9RGVzY3JpcHRvcnMKLXByZWZlcmVuY2VfaW5jbHVkZURlc2NyaXB0b3JCdXR0b25fdGV4dD1JbmNsdWRlIGRlc2NyaXB0b3IgcmVsYXRpb25zaGlwcyB0byBsaW5rZWQgZWxlbWVudHMgaW4gc3VwcG9ydGluZyBwbHVnaW5zCi0KLSMgTmV3IE1ldGhvZCBMaWJyYXJ5IFdpemFyZAotbmV3TGlicmFyeVdpemFyZF90aXRsZT1OZXcgTWV0aG9kIExpYnJhcnkKLW5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZT1DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfZGVzY3JpcHRpb249U3BlY2lmeSBhIHBhdGggYW5kIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5LgotI25ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbl8xPVNwZWNpZnkgYSBuYW1lLCBkZXNjcmlwdGlvbiBhbmQgc3RvcmFnZSB0eXBlIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5LgotbGlicmFyeVBhdGhMYWJlbF90ZXh0PVBhdGg6Ci1saWJyYXJ5VHlwZUxhYmVsX3RleHQ9VHlwZToKLQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1TYXZlIGNoYW5nZXMKLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249T25lIG9yIG1vcmUgbWV0aG9kIGVsZW1lbnRzIGhhdmUgYmVlbiBtb2RpZmllZC4gU2VsZWN0IHRoZSBvbmVzIHRoYXQgbmVlZCB0byBiZSBzYXZlZC4KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPU9wZW4gTWV0aG9kIENvbmZpZ3VyYXRpb25zCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbldpemFyZF93aW5kb3dUaXRsZT1PcGVuIE1ldGhvZCBDb25maWd1cmF0aW9ucwotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9UmVwbGFjaW5nIHswfS4uLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25XYXJuaW5nPUlVUEEwMDI2VzogTm9kZSBpY29uIGZvciB7MH0gaXMgbm90IGZvdW5kIGluIHBhdGg6IHsxfQotI01lc3NhZ2VMYWJlbFByb3ZpZGVyX3Vuc2VsZWN0ZWRwYWNrYWdlcz0nJ3swfScnIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIGVsZW1lbnRzIGluIHVuc2VsZWN0ZWQgcGFja2FnZXMKLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBFcnJvcjogTm9kZSBpY29uIHNlY3Rpb246IHswfQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1TdGVwczogCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPU9yZGVyIFRhc2sgU3RlcHMKLVByb2Nlc3NFZGl0b3JfUGxhbm5lZD1QbGFubmVkCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9UGxlYXNlIHNwZWNpZnkgYSBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgbWV0aG9kIGxpYnJhcnkgdG8KLVByb2Nlc3NFZGl0b3JfTXVsdGlwbGVPY2N1cnJlbmNlcz1NdWx0aXBsZSBPY2N1cnJlbmNlcwotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPUVudHJ5IFN0YXRlCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1FeGl0IFN0YXRlCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1TZWxlY3QgdGhlIGNvbHVtbnMgdG8gYWRkCi1Qcm9jZXNzRWRpdG9yX1R5cGU9VHlwZQotUHJvY2Vzc0VkaXRvcl9UZWFtPVRlYW0KLUZpbHRlckRpYWxvZ190aXRsZT1TZWxlY3QgRGlhbG9nOiAKLQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkPSZBZGQgZnJvbSBNZXRob2QgQ29udGVudC4uLgotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPUNvbGxhcHNlIEFsbAotT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlPU9wZW4gQ2hlYXRTaGVldCBWaWV3Ci1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA9UiZvbGwgVXAKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVImb2xsIERvd24KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVVcD0mTW92ZSBVcAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd249TW92ZSBEbyZ3bgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5kZW50PSZJbmRlbnQKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX091dGRlbnQ9Jk91dGRlbnQKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1SZXZlJmFsCi1Qcm9jZXNzRWRpdG9yX1JldmVhbF9UaXRsZT1SZXZlYWwKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9JkNvcHkuLi4KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9TmFtZSBwYXR0ZXJucyAobWF0Y2hpbmcgbmFtZXMgd2lsbCBiZSBzaG93bik6IAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUHJlZmVyZW5jZXM9UHJlZmVyZW5jZSZzLi4uCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlPU1ldGhvZCBMaWJyYXJ5OiAKLSNNZXNzYWdlVmlld19zZWxlY3RlZF90ZXh0PVNlbGVjdGVkOiAKLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PURlc2NyaXB0aW9uCi1FbGVtZW50c1ZpZXdfZXJyX3NhdmluZz1JVVBBMDAyN0U6IEVycm9yIHNhdmluZyAnJ3swfScnezF9Ci0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9RXJyb3IgY29weWluZyBmaWxlCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogVGhlIGljb24gY291bGQgbm90IGJlIGFzc2lnbmVkLiAKLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNvcHlpbmcgdGhlIHNlbGVjdGVkIGZpbGUuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUVycm9yIHByb2Nlc3NpbmcgZmlsZQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1FZGl0IGNvbmZpZ3VyYXRpb24KLWVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdD1JVVBBMDAxNUU6IENhbm5vdCBlZGl0IGVsZW1lbnQKLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9U2F2ZSBUaGlzIE9iamVjdC4uLgotRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dD1SZXBsYWNlCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9FeHRlbmQ9JkV4dGVuZC4uLgotTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0PUNob29zZSBkZXN0aW5hdGlvbiBmb3Igc2VsZWN0ZWQgZWxlbWVudChzKToKLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1DaG9vc2UgYSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgbGlicmFyaWVzOgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9JlN1cHByZXNzCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9JlB1Ymxpc2hpbmcgT3B0aW9ucy4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW09JlVzZXIgRGVmaW5lZCBEaWFncmFtcy4uLgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlPUFzc2lnbiB1c2VyIGRlZmluZWQgZGlhZ3JhbXMKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlPUFjdGl2aXR5IERpYWdyYW06Ci1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW06Ci1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19ub3RhRmlsZT1JVVBBMDAwNEU6IFRoZSBzcGVjaWZpZWQgcGF0aCBpcyBub3QgYSBmaWxlLgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbj1TZWxlY3QuLi4KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IFRoZSBzcGVjaWZpZWQgaW1hZ2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpYnJhcnkuIE1ha2Ugc3VyZSB5b3UgZW50ZXIgdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkncyByb290IGRpcmVjdG9yeS4KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBUaGUgaW1hZ2UgeW91IHNlbGVjdGVkIGlzIG5vdCBpbiB0aGUgbGlicmFyeS4KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlPVVzZSBBY3Rpdml0eSBkaWFncmFtIGltYWdlIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlPVVzZSBBY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSBpbWFnZSBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZT1Vc2UgV29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbSBpbWFnZSBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9JkxvY2FsIENvbnRyaWJ1dGlvbgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1Mb2NhbCBSZXBsYWNlbWVuJnQKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPURpYSZncmFtcwotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9JkRlZXAgQ29weS4uLgotRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb249QnJpZWYgRGVzY3JpcHRpb246Ci1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1TaG93L0hpZGUgVW5jaGVja2VkIEVsZW1lbnRzCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1EZXNjcmlwdGlvbjoKLUNvbmZpZ3VyYXRpb25QYWdlX3VwZGF0ZU9uQ2xpY2s9UmUtY2FsY3VsYXRlIGVycm9ycyB3aGVuZXZlciBjb25maWd1cmF0aW9uIGlzIGNoYW5nZWQKLUNvbmZpZ3VyYXRpb25QYWdlX3VwZGF0ZU9uQ2xpY2tUb29sVGlwPVJlLWNhbGN1bGF0ZSBlcnJvcnMgd2hlbmV2ZXIgY29uZmlndXJhdGlvbiBpcyBjaGFuZ2VkCi1Db25maWd1cmF0aW9uUGFnZV9ub1VwZGF0ZU9uQ2xpY2s9UmUtY2FsY3VsYXRlIGVycm9ycyBvbmx5IHdoZW4gUmVmcmVzaCBidXR0b24gaXMgY2xpY2tlZCBhbmQgd2hlbiBzYXZpbmcKLUNvbmZpZ3VyYXRpb25QYWdlX25vVXBkYXRlT25DbGlja1Rvb2xUaXA9UmUtY2FsY3VsYXRlIGVycm9ycyBvbmx5IHdoZW4gUmVmcmVzaCBidXR0b24gaXMgY2xpY2tlZCBhbmQgd2hlbiBzYXZpbmcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsPVB1Ymxpc2ggJk5vbmUKLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPVBhdHRlcm5zIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWEsIHdoZXJlICo9YW55IHN0cmluZywgPz1hbnkgY2hhcmFjdGVyCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1Db250ZW50OgotQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U9TG9hZGluZyBjb25maWd1cmF0aW9uLCBwbGVhc2Ugd2FpdCAuLi4KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZENhdGVnb3JpZXNUaXRsZUxhYmVsPUFkZCB0aGVzZSBDYXRlZ29yaWVzOgotQ29uZmlndXJhdGlvblBhZ2VfU3ViQ2F0ZWdvcmllc1RpdGxlTGFiZWw9U3VidHJhY3QgdGhlc2UgQ2F0ZWdvcmllczoKLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PVRoZSBzcGVjaWZpZWQgbW92ZSBkZXN0aW5hdGlvbiBpcyBpbnZhbGlkLgotTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbj1JVVBBMDAzNEU6IFRoZSBzZWxlY3RlZCBkZXN0aW5hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQuCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9UHVibGlzaCBBJmxsCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQmFzZUFjdGl2aXR5PU9wZW4gJkJhc2UgQWN0aXZpdHkKLVByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw9RSZ4cGFuZCBBbGwKLVByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWw9Q28mbGxhcHNlIEFsbAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbT1PcGVuICZBY3Rpdml0eSBEaWFncmFtCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPVRoZSB1bnN1cHByZXNzZWQgZGVzY3JpcHRvcnMgbGlzdGVkIGluIERldGFpbHMgbXVzdCBiZSBkZWxldGVkIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGFmdGVyIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuIENsaWNrIE9LIGlmIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGVtIGFuZCBjb250aW51ZS4KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVNlbGVjdCB0aGUgY29sdW1ucyB0byBhZGQKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09T3BlbiBBY3Rpdml0eSAmRGV0YWlsIERpYWdyYW0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249Q29sdW1uIHNlbGVjdGlvbjoKLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPVN3aXRjaCB0byB0aGUgUHJvY2VzcycgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdoZW4gYWN0aXZhdGluZyBhIFByb2Nlc3MgZWRpdG9yCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlPVN1cHByZXNzaW9uCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9SW5oZXJpdCBzdXBwcmVzc2lvbiBzdGF0ZXMKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtPU9wZW4gJldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPUNsZWFyCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1TZWxlY3QuLi4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0luc2VydE5ld1BoYXNlPUluc2VydCBOZXcgUGhhc2UKLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPUNvdWxkIG5vdCByZWNvdmVyIGZyb20gYSBwZXJzaXN0ZW5jZSBlcnJvci4gVGhlIGxpYnJhcnkgbmVlZHMgdG8gYmUgcmVsb2FkZWQgdG8gcmVzdG9yZSBpdHMgb3JpZ2luYWwgc3RhdGUuCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkX3RleHQ9VGhlIGVsZW1lbnQgJyd7MH0nJyBpcyBhbHJlYWR5IGRlbGV0ZWQuCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0PVRoZSBlbGVtZW50ICcnezB9JycgaXMgYWxyZWFkeSBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSAnJ3sxfScnPwotQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXA9Rml4IGVycm9ycyBhbmQgd2FybmluZ3MKLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPURlc2NyaXB0aW9uCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbz1HZW5lcmFsIEluZm9ybWF0aW9uIAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwcGx5IFBhJnR0ZXJuCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9UGxlYXNlIHNlbGVjdCBhIGRlc3RpbmF0aW9uLgotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9Tm8gbW92ZSBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3Ryb3VibGVvYmplY3Q9LiBUcm91YmxlIG9iamVjdDogCi1NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M9QSBjaGlsZCBjb250ZW50IHBhY2thZ2Ugb3IgcHJvY2VzcyBjb250YWlucyBlbGVtZW50cyB3aXRoIG1pc3NpbmcgcmVmZXJlbmNlcwotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1EaWFncmFtIFB1Ymxpc2hpbmcgT3B0aW9ucwotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVBsZWFzZSBzZWxlY3QgdGhlIGRpYWdyYW0ocykgdG8gcHVibGlzaCBvciBkZXNlbGVjdCB0byBub3QgcHVibGlzaAotUHJvY2Vzc0VkaXRvcl9UaXRsZT1Qcm9jZXNzIEVkaXRvcjogCi1TYXZlQXN3aXRoZG90c190ZXh0PVNhdmUgQXMuLi4KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLVByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb249VGVhbSBBbGxvY2F0aW9uCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9V29yayBQcm9kdWN0IFVzYWdlCi1Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc9Q29uc29saWRhdGVkIFZpZXcKLVByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaD1UaGlzIG9wZXJhdGlvbiByZWZyZXNoZXMgdGhlIHNlbGVjdGVkIGRlc2NyaXB0b3JzIG9yIGFsbCBkZXNjcmlwdG9ycyBiZWxvdyB0aGUgc2VsZWN0ZWQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgYXMgIlN5bmNocm9uaXplZCB3aXRoIHNvdXJjZSIgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZWlyIFByb3BlcnRpZXMgdmlldy4gIEl0IHJlZnJlc2hlcyB0aGVzZSBkZXNjcmlwdG9ycyB3aXRoIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIG9mIHRoZSBsaW5rZWQgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgdW5kZXIgdGhlIHByb2Nlc3MnIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gIE5vdGUgdGhhdCBpdCB3aWxsIG5vdCB1cGRhdGUgYW55IGR5bmFtaWNhbGx5IGxpbmtlZCAoZ3JlZW4gaXRhbGljKSBkZXNjcmlwdG9ycy4gIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci1Qcm9jZXNzRWRpdG9yX2RlZmF1bHRTeW5jaHJvbml6YXRpb249RGVmYXVsdCBTeW5jaHJvbml6YXRpb24gZnJvbSBtZXRob2QgY29udGVudAotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24xPUNvbmZpZ3VyYXRpb24KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMj1QbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbgotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPUNyZWF0ZSBOZXcgTGlicmFyeSBBcwotTmV3UGx1Z2luRGlhbG9nX25ld3BsdWdpbl90ZXh0PU5ldyBNZXRob2QgUGx1Zy1pbgotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVNlbGVjdCB0aGUgZWxlbWVudCBvciBvbmUgb2YgaXRzIGNvbnRyaWJ1dG9yczoKLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1OZXcgQ29uZmlndXJhdGlvbjoKLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1Qcm9jZXNzIEVkaXRvcgotCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsaWduCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1SZWZyZXNoIGZyb20gQmFzZSBBY3Rpdml0eQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PUZvcm1hdCBUZXh0IEJveC4uLgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGljYWxseSB0byBBdmVyYWdlCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlPUdlbmVyYWwgSW5mb3JtYXRpb24KLU1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPUlVUEEwMDQxRTogVGhlIHNlbGVjdGVkIGVsZW1lbnQocykgY2Fubm90IGJlIG1vdmVkIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24uCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9U2F2aW5nIG1vZGVsIGxpYnJhcnkgLi4uCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycm9yX2RpYWxvZ190aXRsZT1FcnJvcgotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBQcm9ibGVtIGVuY291bnRlcmVkIGluIHNhdmluZyBsaWJyYXJ5LgotTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbl9kZWxldGVjb25maXJtX3RleHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dD1Db250ZW50IEVsZW1lbnRzOiAKLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9QnJvd3NlLi4uCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVNwZWNpZnkgYSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9U2F2ZSBjaGFuZ2VzIGFuZCBjbG9zZSBhbGwgZWRpdG9ycwotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhdmUKLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ9QXR0YWNoIEZpbGUKLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hVcmxfdGV4dD1BdHRhY2ggVXJsCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50PUNvbmZpZ3VyYXRpb24gQ29udGVudAotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1PcGVuIENvbmZpZ3VyYXRpb24KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9UmVwbGFjZS4uLgotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1TYXZpbmcgezB9Ci1Db25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwPVNob3cgY29uZmlndXJhdGlvbiBlcnJvcnMKLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg9Q29uZmlndXJhdGlvbjogCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PUNoZWNrIEl0ZW1zOiAKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1Nb3ZlIE5vZGUKLUNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcD1GaXggZXJyb3JzCi1Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249T3JkZXIgTmF2aWdhdGlvbiBWaWV3cwotTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0PVJlZmVyZW5jZSBQbHVnLWluczoKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PUNyZWF0ZSBhIEZyZWUgVGV4dAotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9Tm9kZSBJY29uIFByZXZpZXc6Ci1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dD1JVVBBMDAzMlc6IENhbm5vdCBjb25uZWN0Ci1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IENhbm5vdCBoYXZlIHRoZSBzYW1lIGJyZWFrZG93biBlbGVtZW50IGFzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IKLQotIyBFZGl0b3JDaG9vc2VyCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1PcGVuIEVkaXRvcgotRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvcj1UaGlzIGVsZW1lbnQgaGFzIGVycm9ycy4gSXQgaXMgcmVjb21tZW5kZWQgdG8gZml4IHRoZXNlIGVycm9ycyBiZWZvcmUgY29udGludWluZyAoc2VlIGRldGFpbHMpLlxuXG5DbGljayBPSyB0byBjb250aW51ZSB3aXRob3V0IG9wZW5pbmcgdGhlIGVkaXRvci4gQ2xvc2UgdGhpcyBkaWFsb2cgdG8gb3BlbiB0aGUgZWRpdG9yLgotQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeD1Db25maWd1cmF0aW9uOiAKLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbk5hbWU9TmFtZToKLUF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ9RmlsZSBVUkw6Ci1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVNlbGVjdCBhIHN0ZXAgYW5kIGNsaWNrIFVwIG9yIERvd24gdG8gY2hhbmdlIGl0cyBvcmRlci4KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9RXJyb3IgZHVyaW5nIHNhdmluZwotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PVJlZmVyZW5jaW5nIEVsZW1lbnQKLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1SZWZlcmVuY2VkIEVsZW1lbnQKLQotI0FjdGl2aXR5IERpYWdyYW0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1DcmVhdGUgYSBTdGFydCBOb2RlCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249U2VsZWN0IHRoZSBtZXRob2QgcGx1Zy1pbnMsIGNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3NlcyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uLgotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1PcmRlciBkaWFsb2cKLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGlyZWN0b3J5TGFiZWw9RGlyZWN0b3J5OgotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1FbmFibGUgUHJvY2VzcyBDb250cmlidXRpb24KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXB0aW9uOgotQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nX05hdmlnYXRpb25WaWV3cz1OYXZpZ2F0aW9uIFZpZXdzOiAKLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Q2hvb3NpbmcgQ29udHJpYnV0b3JzIGZvciAnJ3swfScnCi1FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQ9Jk9wZW4gdmlhIHZhcmlhYmlsaXR5IGVsZW1lbnRzCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Y2hvb3NpbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMgZm9yICcnezB9JycKLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbD1WYXJpYWJpbGl0eSBlbGVtZW50cyBmb3IgJyd7MH0nJwotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPVNoYXBlIEljb24gUHJldmlldzoKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9Q2Fubm90IGRlbGV0ZQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1PcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIAotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZXRob2QgbGlicmFyeS4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Q2xlYXIKLVdQQ29tcGFydG1lbnRGaWd1cmVfMD1OZXcgV29ya1Byb2R1Y3QgRGVzY3JpcHRvcgotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1QdWJsaXNoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB0aGF0IGhhdmUgbm90IGJlZW4gY3JlYXRlZCBpbiBwcm9jZXNzIGVkaXRvcgotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbXMgZm9yIHVubW9kaWZpZWQgYWN0aXZpdHkgZXh0ZW5zaW9ucwotCi0jQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX05hbWVQYXR0ZXJuPU5hbWUgcGF0dGVybnMgKG1hdGNoaW5nIG5hbWVzIHdpbGwgYmUgc2hvd24pOgotc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25fbGFiZWw9JlNob3cgaW4gUmVzb3VyY2UgTmF2aWdhdG9yCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPVBhdHRlcm5zIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWEsIHdoZXJlICo9YW55IHN0cmluZywgPz1hbnkgY2hhcmFjdGVyCi1lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uPUlVUEEwMDI5RTogQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgc2VsZWN0ZWQgZmlsZS4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1DYXRlZ29yeSBUeXBlIDoKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0JyaWVmRGVzY3JpcHRpb249QnJpZWYgRGVzY3JpcHRpb246Ci1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzPVNlbGVjdCBDYXRlZ29yaWVzCi0KLSNsb2cgbWVzc2FnZXMKLWNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c9RmFpbGVkIHRvIG9wZW4gdGhlIHJlcXVlc3RlZCBjaGVhdHNoZWV0OiAKLQotbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcj1JVVBBMDAzNUU6IFRoZSBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotbmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yPUlVUEEwMDM2RTogVGhlIHBsdWctaW4gY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgbW92ZWQgc3VjY2Vzc2Z1bGx5Ci1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgcmVuYW1lZCBzdWNjZXNzZnVsbHkKLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogVGhlIGVsZW1lbnQgY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci1kdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnPUlVUEEwMTAxRTogVGhlIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4gRW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBhbmQgdHJ5IGFnYWluLgotCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBREltYWdlPUFzc2lnbiBBRCBJbWFnZS4uLgotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZT1SZWZyZXNoIEVycm9yCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1FcnJvciByZWZyZXNoaW5nIGVkaXRvcgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURESW1hZ2U9QXNzaWduIEFERCBJbWFnZS4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkV1BESW1hZ2U9QXNzaWduIFdQRCBJbWFnZS4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1Vc2UgQUQgSW1hZ2UgaW4gUHVibGlzaGluZwotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPVRoZSBzdXBwcmVzc2VkIGRlc2NyaXB0b3JzIGxpc3RlZCBpbiBEZXRhaWxzIG11c3QgYmUgZGVsZXRlZCB0byBhdm9pZCBkdXBsaWNhdGlvbiBhZnRlciBzdXBwcmVzc2luZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuIENsaWNrIE9LIGlmIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGVtIGFuZCBjb250aW51ZS4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPVVzZSBBREQgSW1hZ2UgaW4gUHVibGlzaGluZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9VXNlIFdQRCBJbWFnZSBpbiBQdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9SW1hZ2UgUGF0aAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3PVMmaG93IExpbmtlZCBFbGVtZW50IGluIExpYnJhcnkgVmlldwotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPVVwZGF0ZSBTdXBwcmVzc2lvbiBmcm9tICZCYXNlCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9RGlhZ3JhbSBJbWFnZXMKLQotI1N0cmluZ3MgZm9yIHN5bmNocm9uaXphdGlvbiB3aXphcmQgb24gcHJvY2VzcyBlZGl0b3IncyBCUwotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1TeW5jaHJvbml6YXRpb24gRGVzY3JpcHRpb24KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dD1SZWFkIHRoZSBpbmZvcm1hdGlvbiBiZWxvdyBcCi10aGF0IGV4cGxhaW5zIHdoYXQgY3VzdG9tIHN5bmNocm9uaXphdGlvbiB3aWxsIGFjY29tcGxpc2guCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY3QgQ29uZmlndXJhdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1TZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24gXAotdGhhdCB5b3Ugd2FudCB0byB1c2UgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24uICBZb3VyIHNlbGVjdGlvbiBkZXRlcm1pbmVzIHdoaWNoIGNvbnRyaWJ1dGlvbnMgYW5kIHJlcGxhY2VtZW50cyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbD1Db25maWd1cmF0aW9uOgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVNlbGVjdCBQcm9wZXJ0aWVzIHRvIFN5bmNocm9uaXplCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1Qcm9wZXJ0aWVzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1OYW1lCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1QcmVzZW50YXRpb24gTmFtZQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1CcmllZiBEZXNjcmlwdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPU9wdGlvbmFsIElucHV0cwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZT1NYW5kYXRvcnkgSW5wdXRzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1PdXRwdXRzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9sYWJlbD1QcmltYXJ5IFBlcmZvcm1lcgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPUFkZGl0aW9uYWwgUGVyZm9ybWVycwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9UmVzcG9uc2libGUgUm9sZXMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbD1Db250YWluZWQgQXJ0aWZhY3RzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWw9RGVsaXZlcmFibGUgUGFydHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1TdGVwcyBTZWxlY3Rpb24KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxHdWlkYW5jZV9sYWJlbD1HdWlkYW5jZQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ9Q2hvb3NlIHRoZSBwcm9wZXJ0aWVzIG9mIFwKLXRoZSBtZXRob2QgY29udGVudCB0aGF0IHlvdSB3YW50IHRvIGJlIGNvbnNpZGVyZWQgZm9yIHN5bmNocm9uaXphdGlvbi4KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1TeW5jaHJvbml6YXRpb24gUHJldmlldwotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9UmV2aWV3IHRoZSBwcm9wb3NlZCBzeW5jaHJvbml6YXRpb24gZGV0YWlscyBiZWxvdy4KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9VGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IGNvbmZsaWN0IHdpdGggY2hhbmdlcyBtYWRlIG91dHNpZGUgdGhlIGVkaXRvcnMuXG5TZWxlY3QgdGhlIGVkaXRvcnMgeW91IHdpc2ggdG8gZGlzY2FyZCB0aGVpciBjaGFuZ2VzLgotc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ9U3luY2hyb25pemF0aW9uIFdpemFyZAotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1UaGlzIHdpemFyZCBzdXBwb3J0cyB5b3UgaW4gcmVmcmVzaGluZyBcCi10aGUgc2VsZWN0ZWQgZGVzY3JpcHRvcnMgb3IgYWxsIGRlc2NyaXB0b3JzIGJlbG93IHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBhcyBcCi0iU3luY2hyb25pemUgd2l0aCBTb3VyY2UiIGluIHRoZSBHZW5lcmFsIHRhYiBvZiB0aGVpciBQcm9wZXJ0aWVzIHZpZXcuICBPbmx5IHRoZSBwcm9wZXJ0aWVzIHRoYXQgeW91IFwKLXNlbGVjdCBpbiB0aGlzIHdpemFyZCBhcmUgcmVmcmVzaGVkIGluIHRoZSBkZXNjcmlwdG9ycy4gIFlvdSBjYW4gYWxzbyBzZWxlY3QgYW55IHZhbGlkIGNvbmZpZ3VyYXRpb24gXAotZm9yIHlvdXIgcHJvY2VzcyB0byBiZSB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZSByZWZyZXNoLiAgTm90ZSB0aGF0IHRoZSB3aXphcmQgd2lsbCBub3QgdXBkYXRlIGFueSBcCi1keW5hbWljYWxseSBsaW5rZWQgKGdyZWVuIGl0YWxpYykgZGVzY3JpcHRvcnMuCi0KLW9wZW5SVEU9T3BlbiByaWNoIHRleHQgZWRpdG9yCi1jbG9zZVJURT1DbG9zZSByaWNoIHRleHQgZWRpdG9yCi0KLSNOZXcgU3RyaW5ncwotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0LgotZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRpc2NpcGxpbmUuCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLWRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbi4KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB0b29sLgotY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY29uY2VwdC4KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY2hlY2tsaXN0LgotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZXhhbXBsZS4KLWd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZ3VpZGVsaW5lLgotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgcm9hZG1hcC4KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJldXNhYmxlIGFzc2V0Lgotc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyByZXBvcnQuCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgcHJhY3RpY2UuCi10ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdGVtcGxhdGUuCi10ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdGVybSBkZWZpbml0aW9uLgotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdG9vbCBtZW50b3IuCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB3aGl0ZXBhcGVyLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbgotcm9sZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZSByZWxhdGVzIHRvIGFub3RoZXIgcm9sZS4KLXJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZS4KLQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhc2suCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhc2suCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdGFzayByZWxhdGVzIHRvIGFub3RoZXIgdGFzay4KLXRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFzay4KLQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcnRpZmFjdC4KLWFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3ZpZGUgdGFpbG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGFydGlmYWN0IHJlbGF0ZXMgdG8gYW5vdGhlciBhcnRpZmFjdC4KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIG91dGNvbWUuCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGVsaXZlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIG91dGNvbWUgcmVsYXRlcyB0byBhbm90aGVyIG91dGNvbWUuCi1vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi0KLWRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGVsaXZlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm92aWRlIHRhaWxvcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBkZWxpdmVyYWJsZSByZWxhdGVzIHRvIGFub3RoZXIgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZGlzY2lwbGluZSByZWxhdGVzIHRvIGFub3RoZXIgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZS4KLQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZG9tYWluLgotZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRvbWFpbi4KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRvbWFpbiByZWxhdGVzIHRvIGFub3RoZXIgZG9tYWluLgotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRvbWFpbi4KLQotd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB3b3JrIHByb2R1Y3Qga2luZCByZWxhdGVzIHRvIGFub3RoZXIgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlIHNldC4KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZSBzZXQuCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZSBzZXQgcmVsYXRlcyB0byBhbm90aGVyIHJvbGUgc2V0Lgotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlIHNldC4KLQotdG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wuCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wuCi10b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdG9vbCByZWxhdGVzIHRvIGFub3RoZXIgdG9vbC4KLXRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbC4KLQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbmNlcHQuCi1jb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbmNlcHQuCi1jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgY29uY2VwdCByZWxhdGVzIHRvIGFub3RoZXIgY29uY2VwdC4KLWNvbmNlcHRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29uY2VwdC4KLQotY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY2hlY2tsaXN0LgotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoZWNrbGlzdC4KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGNoZWNrbGlzdCByZWxhdGVzIHRvIGFub3RoZXIgY2hlY2tsaXN0LgotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoZWNrbGlzdC4KLQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4YW1wbGUuCi1leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4YW1wbGUuCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZXhhbXBsZSByZWxhdGVzIHRvIGFub3RoZXIgZXhhbXBsZS4KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhhbXBsZS4KLQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3VpZGVsaW5lLgotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGd1aWRlbGluZS4KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGd1aWRlbGluZSByZWxhdGVzIHRvIGFub3RoZXIgZ3VpZGVsaW5lLgotZ3VpZGVsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGd1aWRlbGluZS4KLQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbiByZWxhdGVzIHRvIGFub3RoZXIgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByYWN0aWNlLgotcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcHJhY3RpY2UuCi1wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHByYWN0aWNlIHJlbGF0ZXMgdG8gYW5vdGhlciBwcmFjdGljZS4KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByYWN0aWNlLgotCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXBvcnQuCi1yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwb3J0LgotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcmVwb3J0IHJlbGF0ZXMgdG8gYW5vdGhlciByZXBvcnQuCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwb3J0LgotCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmV1c2FibGUgYXNzZXQuCi1yZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJldXNhYmxlIGFzc2V0LgotcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJldXNhYmxlIGFzc2V0IHJlbGF0ZXMgdG8gYW5vdGhlciByZXVzYWJsZSBhc3NldC4KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmV1c2FibGUgYXNzZXQuCi0KLXJvYWRtYXBfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2FkbWFwLgotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2FkbWFwLgotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJvYWRtYXAgcmVsYXRlcyB0byBhbm90aGVyIHJvYWRtYXAuCi1yb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvYWRtYXAuCi0KLXN1cHBvcnRpbmdtYXRlcmlhbF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLXN1cHBvcnRpbmdtYXRlcmlhbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwgcmVsYXRlcyB0byBhbm90aGVyIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLQotdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZW1wbGF0ZS4KLXRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlbXBsYXRlLgotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0ZW1wbGF0ZSByZWxhdGVzIHRvIGFub3RoZXIgdGVtcGxhdGUuCi10ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZW1wbGF0ZS4KLQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10ZXJtZGVmaW5pdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRlcm0gZGVmaW5pdGlvbiByZWxhdGVzIHRvIGFub3RoZXIgdGVybSBkZWZpbml0aW9uLgotdGVybWRlZmluaXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVybSBkZWZpbml0aW9uLgotCi10b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbCBtZW50b3IuCi10b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wgbWVudG9yLgotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRvb2wgbWVudG9yIHJlbGF0ZXMgdG8gYW5vdGhlciB0b29sIG1lbnRvci4KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbCBtZW50b3IuCi0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3aGl0ZXBhcGVyLgotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3aGl0ZXBhcGVyLgotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHdoaXRlcGFwZXIgcmVsYXRlcyB0byBhbm90aGVyIHdoaXRlcGFwZXIuCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdoaXRlcGFwZXIuCi0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcgcmVsYXRlcyB0byBhbm90aGVyIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZXNldCBncm91cGluZy4KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlc2V0IGdyb3VwaW5nLgotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZXNldCBncm91cGluZyByZWxhdGVzIHRvIGFub3RoZXIgcm9sZXNldCBncm91cGluZy4KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlc2V0IGdyb3VwaW5nLgotCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgY3VzdG9tIGNhdGVnb3J5IHJlbGF0ZXMgdG8gYW5vdGhlciBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotCi1wbHVnaW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWV0aG9kIHBsdWctaW4uCi1wbHVnaW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWV0aG9kIHBsdWctaW4uCi0KLWNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGNvbmNlcHQuCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGNoZWNrbGlzdC4KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHRvb2wgbWVudG9yLgotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgd2hpdGVwYXBlci4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgdGVybSBkZWZpbml0aW9uLgotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHRlbXBsYXRlLgotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgcmV1c2FibGUgYXNzZXQuCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHJlcG9ydC4KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBwcmFjdGljZS4KLWV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGV4YW1wbGUuCi1ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGd1aWRlbGluZS4KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHJvYWRtYXAuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi0KLXB1Ymxpc2hfY2F0ZWdvcmllc190ZXh0PVB1Ymxpc2ggdGhpcyBjYXRlZ29yeSB3aXRoIHRoZSBjYXRlZ29yaXplZCBtZXRob2QgZWxlbWVudHMuCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1GaWxlIENoYW5nZWQKLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9VGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlPUFjdGl2aXR5IFZhcmlhYmlsaXR5Ci0KLXZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlPVZhcmlhYmlsaXR5Ci0KLWNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfdGl0bGU9Q2lyY3VsYXIgZGVwZW5kZW5jeQotCi1hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlPUFwcGx5IFBhdHRlcm4KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IGFwcGx5IHBhdHRlcm4gd2l0aCAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi0KLSNzZXQgZGVmYXVsdCBoaXN0b3J5IHNpemUKLWRlZmF1bHRfbGlzdF9sZW5ndGhfbGFiZWw9UHJlZmVyZW5jZSBoaXN0b3J5IHNpemU6Ci0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzX1Rhc2s9U3VwcHJlc3MgJlRhc2tzCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxfVGFzaz1SZXZlYWwgJlRhc2tzCi0KLSNFeHRlbmQgU2VtYW50aWNzIHByZWZlcmVuY2UgY2hlY2sKLWV4dGVuZF9zZW1hbnRpY3NfYnV0dG9uX3RleHQ9VXNlIG5ldyAmRXh0ZW5kcyBzZW1hbnRpY3MKLWV4dGVuZF9zZW1hbnRpY3NfdGV4dD1FeHRlbmRpbmcgZWxlbWVudHMgb3ZlcnJpZGUgdG8tbWFueSByZWxhdGlvbnNoaXBzIGluc3RlYWQgb2YgYWRkaW5nIHRvIHRoZSBpbmhlcml0ZWQgZWxlbWVudHMuCi0KLSMgV29yayBQcm9kdWN0IHNsb3RzCi13b3JrcHJvZHVjdERlc2NyaXB0aW9uUGFnZV9zbG90X3RleHQ9SXMgV29yayBQcm9kdWN0IFNsb3QKLXNsb3RTZWN0aW9uX25hbWU9U2xvdHMgSW5mb3JtYXRpb24KLXNsb3RTZWN0aW9uX2Rlc2M9U2VsZWN0IHRoZSBzbG90cyB0aGF0IHRoaXMgd29yayBwcm9kdWN0IGZ1bGZpbGxzLgotc2xvdHNMYWJlbF90ZXh0PVNsb3RzOgotYXJ0aWZhY3Rfc2xvdFNlY3Rpb25fZGVzYz1TZWxlY3QgdGhlIHNsb3RzIHRoYXQgdGhpcyBhcnRpZmFjdCBmdWxmaWxscy4KLW91dGNvbWVfc2xvdFNlY3Rpb25fZGVzYz1TZWxlY3QgdGhlIHNsb3RzIHRoYXQgdGhpcyBvdXRjb21lIGZ1bGZpbGxzLgotZGVsaXZlcmFibGVfc2xvdFNlY3Rpb25fZGVzYz1TZWxlY3QgdGhlIHNsb3RzIHRoYXQgdGhpcyBkZWxpdmVyYWJsZSBmdWxmaWxscy4KLXNsb3RDb25maXJtRGlhbG9nX3RpdGxlPVdvcmsgUHJvZHVjdCBTbG90cwotd3BGdWxGaWxsc0NvbmZpcm1EaWFsb2dfbWVzc2FnZT1UaGVyZSBhcmUgc2xvdHMgcHJlc2VudCB3aGljaCB0aGlzIFdvcmsgcHJvZHVjdCBmdWxmaWxscy4gVGhvc2UgcmVmZXJlbmNlcyB3aWxsIGJlIHJlbW92ZWQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotd3BTbG90RnVsRmlsbHNDb25maXJtRGlhbG9nX21lc3NhZ2U9VGhpcyBXb3JrIFByb2R1Y3Qgc2xvdCBmdWxmaWxscyBvdGhlciB3b3JrIHByb2R1Y3QuIFRob3NlIHJlZmVyZW5jZXMgd2lsbCBiZSByZW1vdmVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRVBGIDEuMiBOTCBzdHJpbmdzLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBMYXlvdXQgQWN0aW9uIGdyb3VwCi0jIE5vdGU6IE1uZW1vbmljcyBkbyBub3Qgd29yayBvbiB0aGVzZQotTGF5b3V0QWN0aW9uR3JvdXBfbGFiZWw9TWV0aG9kIFBsdWctaW4gUHJlc2VudGF0aW9uCi1MYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsPUZsYXQKLUxheW91dEFjdGlvbkdyb3VwX2hpZXJhcmNoaWNhbExheW91dEFjdGlvbl9sYWJlbD1IaWVyYXJjaGljYWwKLQotVmFsaWRhdGVfbWV0aG9kX2xpYnJhcnk9VmFsaWRhdGUgTWV0aG9kIExpYnJhcnkKLQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3PVNob3cgb3duZXIgb2YgdGhpcyB1bnJlc29sdmVkIHJlZmVyZW5jZSBpbiBMaWJyYXJ5IHZpZXcKLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1SZW1vdmUgdGhpcyB1bnJlc29sdmVkIHJlZmVyZW5jZQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1Zb3UgYXJlIGFib3V0IHRvIHJlbW92ZSB0aGUgbGFzdCByZWZlcmVuY2UgdG8gezB9IGluIHRoZSBwbHVnLWluLiBUaGUgZWxlbWVudChzKSB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotCi1Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZXNvbHZlTWlzc2luZ1JlZmVyZW5jZT1BZGQgcmVmZXJlbmNlCi0KLWRlZmF1bHRMaW5rVHlwZVByZWZMYWJlbD1DaG9vc2UgdGhlIGRlZmF1bHQgZWxlbWVudCBsaW5rIHR5cGUgd2hlbiBkcmFnZ2luZyBmcm9tIHRoZSBMaWJyYXJ5IHZpZXcuCi1wcm9tcHRDcmVhdGVOZXdEaWFncmFtRmlsZV9tc2c9Tm8gZGlhZ3JhbSBmaWxlIGV4aXN0cyBmb3IgdGhpcyBwcm9jZXNzLiBEbyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgb25lPwotTmV3RGlhZ3JhbUZpbGVfdGl0bGU9TmV3IERpYWdyYW0gRmlsZQotSXRlbXNGaWx0ZXJEaWFsb2dfVXBkYXRlVHJlZUpvYl9uYW1lPVVwZGF0ZSBmaWx0ZXIgdHJlZQotQ29uZmlndXJhdGlvbl9Qcm9ibGVtX1JlZnJlc2g9UmVmcmVzaCBjb25maWd1cmF0aW9uIHByb2JsZW1zCi0KLVByb2JsZW1FeHBsYW5hdGlvblRleHQ9UHJvYmxlbSBFeHBsYW5hdGlvbgotY29uZmlnUHJvYmxlbVZpZXdPcHRpb25zVGV4dD1Db25maWd1cmF0aW9uIHByb2JsZW0gdmlldyBvcHRpb25zCi1oaWRlRXJyb3NUZXh0PUhpZGUgZXJyb3JzCi1oaWRlV2FybmluZ3NUZXh0PUhpZGUgd2FybmluZ3MKLWhpZGVJbmZvc1RleHQ9SGlkZSBpbmZvcwotCi1hZGRfVGFza3NwZXJSb3c9TnVtYmVyIG9mIHRhc2tzIHBlciByb3c6Ci1pbnZhbGlkVGFza3BlclJvd19tc2c9VGFza3MgcGVyIHJvdyBpbiBBY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMgbXVzdCBiZSBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgcmFuZ2luZyBmcm9tIHswfSB0byB7MX0uCi0KLUN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9pbmNsdWRlRWxlbWVudHNPZlR5cGU9SW5jbHVkZSBlbGVtZW50cyBvZiB0eXBlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9VSUFjdGlvbkRpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QxYzY2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbnRyaWJ1dGlvblNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSGFuZGxlcyBVSSBhY3Rpb25zIGluIHRoZSB3b3JrYmVuY2guCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUFjdGlvbkRpc3BhdGNoZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgVUlBY3Rpb25EaXNwYXRjaGVyIGluc3RhbmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxJRG91YmxlQ2xpY2tMaXN0ZW5lcj4gZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElEb3VibGVDbGlja0xpc3RlbmVyPigpOwotCi0JcHJpdmF0ZSBDdXJyZW50U2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBuZXcgQ3VycmVudFNlbGVjdGlvbigpOwotCi0JcHJpdmF0ZSBJRG91YmxlQ2xpY2tMaXN0ZW5lciBkb3VibGVDbGlja0xpc3RlbmVyID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVJQWN0aW9uRGlzcGF0Y2hlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoVUlBY3Rpb25EaXNwYXRjaGVyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgVUlBY3Rpb25EaXNwYXRjaGVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBVSUFjdGlvbkRpc3BhdGNoZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIGFjdGlvbiBkaXNwYXRjaGVyIG9mIG15IG93bgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqLwotCXB1YmxpYyBVSUFjdGlvbkRpc3BhdGNoZXIoT2JqZWN0IG93bmVyKSB7Ci0JCS8vIENyZWF0ZSB0aGUgZG91YmxlIGNsaWNrIGxpc3RlbmVyIHVzZWQgZm9yIGxhdW5jaGluZyB0aGUgTWV0aG9kCi0JCS8vIGVkaXRvcnMuCi0JCWRvdWJsZUNsaWNrTGlzdGVuZXIgPSBuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGUpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJCQkJLmdldEFjdGl2ZVBhcnQoKS5nZXRTaXRlKCk7Ci0KLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCU9iamVjdFtdIHNlbE9ianMgPSBzZWwudG9BcnJheSgpOwotCQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBudWxsOwotCi0JCQkJCWlmICgoc2VsT2JqcyAhPSBudWxsKSAmJiAoc2VsT2Jqcy5sZW5ndGggPiAwKSkgewotCQkJCQkJLy8gT3BlbiB0aGUgQXV0aG9yaW5nIHBlcnNlcGVjdGl2ZS4KLQkJCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQotCQkJCQkJLy8gTG9jYXRlIHRoZSBzZWxlY3RlZCBNZXRob2QgZWxlbWVudC4KLQkJCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChzZWxPYmpzWzBdKTsKLQkJCQkJCUNvbmZpZ3VyYXRpb25WaWV3IHZpZXcgPSBDb25maWd1cmF0aW9uVmlldy5nZXRWaWV3KCk7CQkJCQkJCi0JCQkJCQlpZiAoKHZpZXcgIT0gbnVsbCApICYmIHNpdGUuZXF1YWxzKHZpZXcuZ2V0U2l0ZSgpKSApIHsKLQkJCQkJCQkvLyBEb3VibGUtY2xpY2sgb3JnaW5hdGVkIGZyb20gdGhlIENvbmZpZ3VyYXRpb24KLQkJCQkJCQkvLyB2aWV3LgotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCQkJCQkJCUNvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmliU2VsZWN0aW9uID0gbmV3IENvbnRyaWJ1dGlvblNlbGVjdGlvbigpOwotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCA9IGNvbnRyaWJTZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcihlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXNlbGVjdGVkT2JqZWN0ID0gb2JqOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJCQkJc2VsZWN0ZWRPYmplY3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCS8vIEFkZCBhIHBlcnNwZWN0aXZlIGxpc3RlbmVyIHRvIGVuYWJsZS9kaXNhYmxlIGRvdWJsZS1jbGljayBsaXN0ZW5pbmcuCi0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV29ya2JlbmNoV2luZG93ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAoYWN0aXZlV29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCWFjdGl2ZVdvcmtiZW5jaFdpbmRvdwotCQkJCQkuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcihuZXcgSVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MpIHsKLQkJCQkJCQlpZiAoZGVzYy5nZXRJZCgpLmVxdWFscygKLQkJCQkJCQkJCUF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCQkJCQlhZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjLCBTdHJpbmcgaWQpIHsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCX0KLQotCQlpZiAoUGVyc3BlY3RpdmVVdGlsCi0JCQkJLmlzQWN0aXZlUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQlhZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVkaXRDb25maWd1cmF0aW9uKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBsaWJyYXJ5IHBlcnNwZWN0aXZlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5MaWJyYXJ5UGVyc3BlY3RpdmUoKSB7Ci0JCVBlcnNwZWN0aXZlVXRpbC5vcGVuUGVyc3BlY3RpdmUoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdrYlBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSVZpZXdQYXJ0IHZpZXdQYXJ0ID0gd2tiUGFnZS5maW5kVmlldyhMaWJyYXJ5Vmlldy5WSUVXX0lEKTsKLQkJaWYgKHZpZXdQYXJ0ICE9IG51bGwpCi0JCQl3a2JQYWdlLmhpZGVWaWV3KHZpZXdQYXJ0KTsKLQkJdmlld1BhcnQgPSB3a2JQYWdlLmZpbmRWaWV3KENvbmZpZ3VyYXRpb25WaWV3LlZJRVdfSUQpOwotCQl3a2JQYWdlLmFjdGl2YXRlKHZpZXdQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGF1dGhvcmluZyBwZXJzcGVjdGl2ZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSB7Ci0JCVBlcnNwZWN0aXZlVXRpbC5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQlJV29ya2JlbmNoUGFnZSB3a2JQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlWaWV3UGFydCB2aWV3UGFydCA9IHdrYlBhZ2UuZmluZFZpZXcoTGlicmFyeVZpZXcuVklFV19JRCk7Ci0JCXdrYlBhZ2UuYWN0aXZhdGUodmlld1BhcnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3JlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbi5zZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uLnNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGN1cnJlbnQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbih0aGlzLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNldHMgY3VycmVudCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQljdXJyZW50U2VsZWN0aW9uLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCWN1cnJlbnRTZWxlY3Rpb24uc291cmNlID0gc291cmNlOwotCi0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNvdXJjZSwKLQkJCQkJc2VsZWN0aW9uKTsKLQotCQkJLy8gQXZvaWQgY29uY3VycmVudCBlcnJvci4KLQkJCUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7Ci0JCQl3aGlsZSAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0JCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzCi0JCQkJCQkucmVtb3ZlKDApOwotCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQobGlzdGVuZXIpOwotCQkJCX0KLQkJCX0KLQotCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGRBbGwocHJvY2Vzc2VkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGRvdWJsZSBjbGljayBsaXN0ZW5lcgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFkb3VibGVDbGlja0xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWRvdWJsZUNsaWNrTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZG91YmxlIGNsaWNrIGxpc3RlbmVyCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlkb3VibGVDbGlja0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBkb3VibGUgY2xpY2sgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVDbGlja0V2ZW50KERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBBdm9pZCBjb25jdXJyZW50IGVycm9yLgotCQkJTGlzdDxJRG91YmxlQ2xpY2tMaXN0ZW5lcj4gcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PElEb3VibGVDbGlja0xpc3RlbmVyPigpOwotCQkJd2hpbGUgKGRvdWJsZUNsaWNrTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLQkJCQlJRG91YmxlQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IChJRG91YmxlQ2xpY2tMaXN0ZW5lcikgZG91YmxlQ2xpY2tMaXN0ZW5lcnMKLQkJCQkJCS5yZW1vdmUoMCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbGlzdGVuZXIuZG91YmxlQ2xpY2soZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKGxpc3RlbmVyKTsKLQkJCX0KLQkJCWRvdWJsZUNsaWNrTGlzdGVuZXJzLmFkZEFsbChwcm9jZXNzZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ3VycmVudFNlbGVjdGlvbiB7Ci0KLQkJcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BYnN0cmFjdE1vdmVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BYnN0cmFjdE1vdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1ZGUxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQWJzdHJhY3RNb3ZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIE1vdmVzIGJyZWFrZG93biBlbGVtZW50IGluIGEgcHJvY2VzcyB0cmVlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW92ZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHJvdGVjdGVkIFByb2Nlc3NFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIEFic3RyYWN0TW92ZUFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcihudWxsLCB0ZXh0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBzdXBwb3J0IG1vdmUgb25seSBvbmUgYWN0aXZpdHkgZm9yIG5vdwotCQkvLwotCQlpZihzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBlID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0SXRlbVByb3ZpZGVyKGUpOwotCQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIGlwICE9IG51bGwgJiYgaXAuZ2V0UGFyZW50KGUpIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gc3VwcG9ydCBtb3ZlIG9ubHkgb25lIGFjdGl2aXR5IGZvciBub3cKLQkJLy8KLQkJaWYoYWNjZXB0KHNlbGVjdGlvbikpIHsKLQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBJQlNJdGVtUHJvdmlkZXIgZ2V0SXRlbVByb3ZpZGVyKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3QgaXAgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYoaXAgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKElCU0l0ZW1Qcm92aWRlcikgaXA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGlwID0gZ2V0SXRlbVByb3ZpZGVyKGVsZW1lbnQpOwotCQlpZihpcCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgcGFyZW50ID0gKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpaXApLmdldFBhcmVudChlbGVtZW50KTsKLQkJCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW92ZUNvbW1hbmQoKEFjdGl2aXR5KXBhcmVudCwgZWxlbWVudCwgaXAuZ2V0RUNsYXNzZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChBY3Rpdml0eSBhY3QsIE9iamVjdCBlbGVtZW50LCBDb2xsZWN0aW9uPEVDbGFzcz4gZUNsYXNzZXMpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb24jc2V0QWN0aXZlV29ya2JlbmNoUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcil3b3JrYmVuY2hQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSB3b3JrYmVuY2hQYXJ0OwotCQl9CQkKLQkJZWxzZSBpZih3b3JrYmVuY2hQYXJ0ID09IG51bGwpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3VwZXJSdW4oKTsKLQkJCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjI2MjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5BRERJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEFjdGlvbiB0byBzaG93IHRoZSBBRERJbmZvRGlhbG9nLCB0byBzaG93IHRoZSBBY3Rpdml0eURldGFpbERpYWdyYW1zCi0gKiBpbiB0aGUgcHJvY2Vzcy4gTm90IGluIHVzZS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGVkOwotCQotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uKCkgewotCQlzdXBlcigiQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCi0JCUlGaWx0ZXIgZmlsdGVyID0gbmV3IEFEREZpbHRlcihudWxsLCBudWxsLCBudWxsKTsKLQkJCi0JCUFEREluZm9EaWFsb2cgZmQgPSBuZXcgQURESW5mb0RpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZ2V0T2JqZWN0KCksICJBY3Rpdml0eSIsIC8vJE5PTi1OTFMtMSQKLQkJCQludWxsKTsKLQotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQuc2V0VGl0bGUoIkFjdGl2aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJZmQub3BlbigpOwotCQlMaXN0IGxpc3QgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQotCQl0cnkgewotCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZXgoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuRWRpdG9ySW5wdXQoCi0JCQkJCWxpc3QuZ2V0KDApLCBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbigoUHJvY2VzcylnZXRPYmplY3QoKSkpOwotCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2V4KCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmNsYXNzCi0JCQkJCS5nZXROYW1lKCkpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQlleGNlcHRpb24pOwotCQl9Ci0JCS8vIG9wZW4gZWRpdG9yCi0KLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCl7Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0JCi0JcHVibGljIElXb3JrYmVuY2hQYWdlIGdldFBhZ2V4KCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKTsKLQl9Ci0JcHVibGljIGNsYXNzIEFEREZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQkJcHVibGljIEFEREZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgVmlld2VyIHZpZXdlciwgU3RyaW5nIGZpbHRlclN0cikgewotCQkJc3VwZXIobWV0aG9kQ29uZmlnLCB2aWV3ZXIsIGZpbHRlclN0cik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJaWYob2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgb2JqLCBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLCBmYWxzZSk7Ci0JCQkJaWYoZCAhPSBudWxsICkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQXNzaWduQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQXNzaWduQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODE5YTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0Fzc2lnbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbi5DdXN0b21lQ2F0ZWdvcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkFzc2lnbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogQXNzaWduIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25BY3Rpb24gZXh0ZW5kcyBDdXN0b21lQ2F0ZWdvcnlBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIEFzc2lnbkFjdGlvbihMaWJyYXJ5VmlldyBsaWJWaWV3KSB7Ci0JCXN1cGVyKGxpYlZpZXcsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFzc2lnbkFjdGlvbl90ZXh0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9SdW4oKSB7CQkKLQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQXNzaWduID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldExpYnJhcnlWaWV3KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJfHwgKGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KSkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWVsZW1lbnRzVG9Bc3NpZ24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlBc3NpZ25EaWFsb2cgZGxnID0gZ2V0RGlhbG9nKGVsZW1lbnRzVG9Bc3NpZ24pOwotCQlkbGcub3BlbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXNzaWduRGlhbG9nIGdldERpYWxvZyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXJldHVybiBBc3NpZ25EaWFsb2cubmV3QXNzaWduRGlhbG9nKGdldExpYnJhcnlWaWV3KCkuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIGVsZW1lbnRzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY2FuQXNzaWduKHNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50cyBjYW4gYmUgYXNzaWduZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkFzc2lnbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0aW9uUGFyZW50T2JqZWN0KCkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDcwZWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLQotLyoqCi0gKiBFZGl0cyBhbiBlbGVtZW50IGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCi0JLyoqCi0JICogVGhlIElEIGZvciB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSUQgPSBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkOwotCi0JcHJpdmF0ZSBDb250cmlidXRpb25TZWxlY3Rpb24gY29udHJpYnV0b3JTZWxlY3RvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJY29udHJpYnV0b3JTZWxlY3RvciA9IG5ldyBDb250cmlidXRpb25TZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdHMubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNvbnRyaWJ1dG9yU2VsZWN0b3IKLQkJCQkJCS5nZXRTZWxlY3RlZENvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50TGlzdC5zaXplKCkgPCAxKQotCQkJcmV0dXJuOwotCi0JCWlmIChQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQnJvd3NpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIub3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWQgPSBzZWxlY3Rpb247Ci0KLQkJYm9vbGVhbiBlbmFibGVUaGVNZW51ID0gdHJ1ZTsKLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmICghKHJlYWxPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJCWVuYWJsZVRoZU1lbnUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoKHJlYWxPYmogaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKChyZWFsT2JqIGluc3RhbmNlb2YgUGhhc2UpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQkJZW5hYmxlVGhlTWVudSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVuYWJsZVRoZU1lbnU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTgxZTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQ29tbWFuZFN0YXR1c0NoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyBNZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kV3JhcHBlciBpbXBsZW1lbnRzCi0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWxvYWRDdXJyZW50TGlicmFyeU9uUm9sbGJhY2tFcnJvcigpIHsKLQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUNvbW1hbmQgY21kID0gVG5nVXRpbC51bndyYXAodGhpcyk7Ci0KLQkJc3VwZXIuZXhlY3V0ZSgpOwotCi0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZCkgY29tbWFuZCkKLQkJCQkJLmdldFN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaWYgKENvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1JvbGxiYWNrRXJyb3Ioc3RhdHVzKSkgewkJCQkJCi0JCQkJCXJlbG9hZEN1cnJlbnRMaWJyYXJ5T25Sb2xsYmFja0Vycm9yKCk7Ci0JCQkJfSBlbHNlIGlmICghQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzU2F2ZUVycm9yKHN0YXR1cykpIHsKLQkJCQkJZGlzcGxheUVycm9yKHN0YXR1cyk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNtZCA9IHRoaXM7Ci0KLQkJCXdoaWxlIChjbWQgaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcgotCQkJCQkmJiAhKGNtZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSkgewotCQkJCWNtZCA9ICgoQ29tbWFuZFdyYXBwZXIpIGNtZCkuZ2V0Q29tbWFuZCgpOwotCQkJfQotCi0JCQlpZiAoY21kIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIHsKLQkJCQlNZXRob2RFbGVtZW50QWRkQ29tbWFuZCBhZGRDbWQgPSAoKE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSBjbWQpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gYWRkQ21kLmdldFN0YXR1cygpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQlpZiAoQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzUm9sbGJhY2tFcnJvcihzdGF0dXMpKSB7Ci0JCQkJCQlyZWxvYWRDdXJyZW50TGlicmFyeU9uUm9sbGJhY2tFcnJvcigpOwotCQkJCQl9IGVsc2UgaWYgKCFDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNTYXZlRXJyb3Ioc3RhdHVzKSkgewotCQkJCQkJZGlzcGxheUVycm9yKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb248Pz4gcmVzdWx0ID0gZ2V0Q29tbWFuZCgpLmdldFJlc3VsdCgpOwotCQlmb3IgKE9iamVjdCBvIDogcmVzdWx0KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAobyk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCAmJiAoKEVPYmplY3QpIG9iaikuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkvLyBPcGVuIHRoZSBlZGl0b3IgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGVsZW1lbnQuCi0JCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0UuZ2V0RWRpdG9yS2VlcGVyKCkub3BlbkVkaXRvcihvYmopOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjY2FuVW5kbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kQWN0aW9uRGVsZWdhdGUjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoKSB7Ci0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSBjbWQgPSAoQ29tbWFuZEFjdGlvbkRlbGVnYXRlKSBnZXRDb21tYW5kKCk7Ci0JCXJldHVybiBjbWQuZ2V0SW1hZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJQ29tbWFuZEFjdGlvbkRlbGVnYXRlIGNtZCA9IChDb21tYW5kQWN0aW9uRGVsZWdhdGUpIGdldENvbW1hbmQoKTsKLQkJcmV0dXJuIGNtZC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJQ29tbWFuZEFjdGlvbkRlbGVnYXRlIGNtZCA9IChDb21tYW5kQWN0aW9uRGVsZWdhdGUpIGdldENvbW1hbmQoKTsKLQkJcmV0dXJuIGNtZC5nZXRUb29sVGlwVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYW4gZXJyb3IgZGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlFcnJvcihJU3RhdHVzIHN0YXR1cykgewotCQlpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJaWYgKHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IgfHwgc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheSgKLQkJCQkJZ2V0TGFiZWwoKSwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3IKLQkJCQkJLCBzdGF0dXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0N1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNzBlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Bc3NpZ25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogRGVlcCBjb3B5IGN1c3RvbWUgY2F0ZWdvcnkgYWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlICAxLjUKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb24gZXh0ZW5kcyBBc3NpZ25BY3Rpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGxpYlZpZXcKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbihMaWJyYXJ5VmlldyBsaWJWaWV3KSB7Ci0JCXN1cGVyKGxpYlZpZXcpOwotCQlzZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlZXBDb3B5QWN0aW9uX3RleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXNzaWduRGlhbG9nIGdldERpYWxvZyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXJldHVybiBBc3NpZ25EaWFsb2cubmV3RGVlcENvcHlEaWFsb2coZ2V0TGlicmFyeVZpZXcoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgZWxlbWVudHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0RpYWdyYW1QcmludEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0RpYWdyYW1QcmludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjQ4ZDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9EaWFncmFtUHJpbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnByaW50LlByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiAKLSAqIFByaW50IGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByaW50QWN0aW9uIGV4dGVuZHMgUHJpbnRBY3Rpb24gewotCi0JR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqLwotCXB1YmxpYyBEaWFncmFtUHJpbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihwYXJ0KTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuUHJpbnRBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgU1dULk5VTEwpOwotCQlQcmludGVyRGF0YSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQkJCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCVByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uIG9wID0gCi0JCQkJCQluZXcgUHJpbnRHcmFwaGljYWxWaWV3ZXJPcGVyYXRpb24obmV3IFByaW50ZXIoZGF0YSksIHZpZXdlcik7Ci0JCQlvcC5ydW4oZ2V0V29ya2JlbmNoUGFydCgpLmdldFRpdGxlKCkpOwotCQl9Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgZ3JhcGhpY2FsIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGdyYXBoaWNhbCB2aWV3ZXIKLQkgKiBAcmV0dXJuIHZpZXdlcgotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGE1NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBMaWJyYXJ5IHZpZXcgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyBJVmlld1BhcnQgZ2V0QWN0aXZlVmlldygpOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlVmlldyhJVmlld1BhcnQgcGFydCk7Ci0KLQlwdWJsaWMgdm9pZCBzaGFyZUdsb2JhbEFjdGlvbnMoSVBhZ2UgcGFnZSwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyk7Ci0KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKTsKLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKTsKLQotCXB1YmxpYyB2b2lkIGRpc2FibGVHbG9iYWxFZGl0TWVudSgpOwotCi0JcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNZW51QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSU1lbnVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyZDk5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSU1lbnVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotCi0vKioKLSAqIEludGVyZmFjZSB0byBiZSB1c2VkIHRvIGFkZCBtZW51cyBmb3IgY29uZmlndXJhdGlvbiB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbnVBY3Rpb24gIHsKLQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb25maWcgdmlldyBtZW51IGFjdGlvbiBwcm92aWRlcgotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpOwotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNb2RpZnlpbmdBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JTW9kaWZ5aW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTM0NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNb2RpZnlpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kaWZ5aW5nQWN0aW9uIGV4dGVuZHMgSUFjdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JV29ya2JlbmNoUGFydEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExY2IwMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHdvcmtiZW5jaCBwYXJ0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIAotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV29ya2JlbmNoUGFydEFjdGlvbiB7Ci0Jdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM0NGJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JbmRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBJbmRlbnRzIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIHByb2Nlc3MgdHJlZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRlbnRBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZW50Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCQotCQlwcml2YXRlIENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHM7Ci0JCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JCXByaXZhdGUgU2V0IG1vZGlmaWVkUmVzb3VyY2VzOwotCQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQkJcHJpdmF0ZSBBY3Rpdml0eSBvbGRQYXJlbnQ7Ci0JCXByaXZhdGUgQWN0aXZpdHkgbmV3UGFyZW50OwotCQlwcml2YXRlIGludCBvbGRJbmRleDsKLQkJcHJpdmF0ZSBNYXA8V29ya0JyZWFrZG93bkVsZW1lbnQsIFdvcmtPcmRlcj4gY2lyY3VsYXJXb3JrT3JkZXJzOwotCi0JCXB1YmxpYyBJbmRlbnRDb21tYW5kKENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gY29sbGVjdGlvbiwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXRoaXMuZWxlbWVudHMgPSBjb2xsZWN0aW9uOwotCQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQkJc2V0TGFiZWwoTEFCRUwpOwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+IGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBwcm9jID09IG51bGwgJiYgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpOwotCQkJCX0KLQkJCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9jLmVSZXNvdXJjZSgpOwotCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwcm9jLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCQllbGVtZW50ID0gZWxlbWVudHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlvbGRQYXJlbnQgPSBlbGVtZW50LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJaWYob2xkUGFyZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlvbGRJbmRleCA9IG9sZFBhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YoZWxlbWVudCk7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvbGRQYXJlbnQsIAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PihpcC5nZXRDaGlsZHJlbihvbGRQYXJlbnQpKTsKLQkJCWludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWxlbWVudCk7Ci0JCQlpZihpbmRleCA+IDApIHsKLQkJCQlPYmplY3QgcHJldiA9IGNoaWxkcmVuLmdldChpbmRleCAtIDEpOwotCQkJCWlmKHByZXYgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQluZXdQYXJlbnQgPSAoQWN0aXZpdHkpIHByZXY7Ci0JCQkJCXJldHVybiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KG5ld1BhcmVudCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVsZW1lbnQpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJbmV3UGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGVsZW1lbnQpOwotCQkJCi0JCQkvLyByZW1vdmUgY2lyY3VsYXIgd29yayBvcmRlcnMKLQkJCS8vCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZihjaXJjdWxhcldvcmtPcmRlcnMgPT0gbnVsbCkgewotCQkJCQljaXJjdWxhcldvcmtPcmRlcnMgPSBuZXcgSGFzaE1hcDxXb3JrQnJlYWtkb3duRWxlbWVudCwgV29ya09yZGVyPigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2lyY3VsYXJXb3JrT3JkZXJzLmNsZWFyKCk7Ci0JCQkJfQotCQkJCVdvcmtPcmRlciB3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcihuZXdQYXJlbnQsIGVsZW1lbnQpOwotCQkJCWlmKHdvICE9IG51bGwpIHsJCi0JCQkJCW5ld1BhcmVudC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnJlbW92ZSh3byk7Ci0JCQkJCWNpcmN1bGFyV29ya09yZGVycy5wdXQobmV3UGFyZW50LCB3byk7Ci0JCQkJfQotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudDsKLQkJCQl3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcih3YmUsIG5ld1BhcmVudCk7Ci0JCQkJaWYod28gIT0gbnVsbCkgewotCQkJCQl3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5yZW1vdmUod28pOwotCQkJCQljaXJjdWxhcldvcmtPcmRlcnMucHV0KHdiZSwgd28pOwotCQkJCX0KLQkJCX0JCQkKLQkJCQotCQkJLy8gbW92ZSB0aGUgcHJvY2VzcyBwYWNha2dlIG9mIHRoZSBhY3Rpdml0eSB0byBuZXcgcGFyZW50IHBhY2thZ2UKLQkJCS8vCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG5ld1BhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJaWYoY2lyY3VsYXJXb3JrT3JkZXJzICE9IG51bGwgJiYgIWNpcmN1bGFyV29ya09yZGVycy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKE1hcC5FbnRyeTxXb3JrQnJlYWtkb3duRWxlbWVudCwgV29ya09yZGVyPiBlbnRyeSA6IGNpcmN1bGFyV29ya09yZGVycy5lbnRyeVNldCgpKSB7Ci0JCQkJCWVudHJ5LmdldEtleSgpLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCQljaXJjdWxhcldvcmtPcmRlcnMuY2xlYXIoKTsKLQkJCX0KLQkJCW9sZFBhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChvbGRJbmRleCwgZWxlbWVudCk7CQkJCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG9sZFBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0luZGVudDsKLQotCXByaXZhdGUgUHJvY2Vzc0VkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKCkgewotCQl0aGlzKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lOREVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0lOREVOVCk7Ci0JCXNldFRvb2xUaXBUZXh0KExBQkVMKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBzdXBwb3J0IGluZGVudCBvbmx5IG9uZSBhY3Rpdml0eSBmb3Igbm93Ci0JCS8vCi0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXQgPSBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsJCQkJCi0JCQl9Ci0JCX0KLQkJc2V0RW5hYmxlZChyZXQpOwotCQlyZXR1cm4gcmV0OwotCQkKLQkJLy9UT0RPOiBzdXBwb3J0IGluZGVudCBtdWx0aXBsZSBhY3Rpdml0aWVzIGluIHNlbGVjdGlvbgotLy8JCUFycmF5TGlzdDxBY3Rpdml0eT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotLy8JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCWxpc3QuYWRkKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJcmV0dXJuIG5ldyBJbmRlbnRDb21tYW5kKHNlbGVjdGlvbiwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9CQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb24jc2V0QWN0aXZlV29ya2JlbmNoUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcil3b3JrYmVuY2hQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSB3b3JrYmVuY2hQYXJ0OwotCQl9CQkKLQkJZWxzZSBpZih3b3JrYmVuY2hQYXJ0ID09IG51bGwpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3VwZXJSdW4oKTsKLQkJCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MYXlvdXRBY3Rpb25Hcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xheW91dEFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjdiYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xheW91dEFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuTGF5b3V0QWN0aW9uR3JvdXAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRBY3Rpb25Hcm91cCBleHRlbmRzIE11bHRpQWN0aW9uR3JvdXAgewotCi0JcHVibGljIExheW91dEFjdGlvbkdyb3VwKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIoY3JlYXRlQWN0aW9ucyhsaWJWaWV3KSwgZ2V0U2VsZWN0ZWRTdGF0ZShsaWJWaWV3KSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQWN0aW9uR3JvdXAjZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJY29udHJpYnV0ZVRvVmlld01lbnUoYWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb1ZpZXdNZW51KElNZW51TWFuYWdlciB2aWV3TWVudSkgewotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkvLyBDcmVhdGUgbGF5b3V0IHN1YiBtZW51Ci0JCQotCQlJTWVudU1hbmFnZXIgbGF5b3V0U3ViTWVudT0gbmV3IE1lbnVNYW5hZ2VyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkxheW91dEFjdGlvbkdyb3VwX2xhYmVsKTsgCi0JCWZpbmFsIFN0cmluZyBsYXlvdXRHcm91cE5hbWU9ICJsYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JCVNlcGFyYXRvciBtYXJrZXI9IG5ldyBTZXBhcmF0b3IobGF5b3V0R3JvdXBOYW1lKTsKLQotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQl2aWV3TWVudS5hZGQobWFya2VyKTsKLQkJdmlld01lbnUuYXBwZW5kVG9Hcm91cChsYXlvdXRHcm91cE5hbWUsIGxheW91dFN1Yk1lbnUpOwotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUysiLWVuZCIpKTsvLyROT04tTkxTLTEkCQkKLQkJYWRkQWN0aW9ucyhsYXlvdXRTdWJNZW51KTsKLQl9Ci0KLQlzdGF0aWMgaW50IGdldFNlbGVjdGVkU3RhdGUoTGlicmFyeVZpZXcgbGliVmlldykgewotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0JCi0Jc3RhdGljIElBY3Rpb25bXSBjcmVhdGVBY3Rpb25zKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJSUFjdGlvbiBmbGF0TGF5b3V0QWN0aW9uPSBuZXcgTGF5b3V0QWN0aW9uKGxpYlZpZXcsIHRydWUpOwotCQlmbGF0TGF5b3V0QWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTGF5b3V0QWN0aW9uR3JvdXBfZmxhdExheW91dEFjdGlvbl9sYWJlbCk7IAotCQlmbGF0TGF5b3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19MQVlPVVRfRkxBVCk7Ci0JCUlBY3Rpb24gaGllcmFyY2hpY2FsTGF5b3V0PSBuZXcgTGF5b3V0QWN0aW9uKGxpYlZpZXcsIGZhbHNlKTsKLQkJaGllcmFyY2hpY2FsTGF5b3V0LnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTGF5b3V0QWN0aW9uR3JvdXBfaGllcmFyY2hpY2FsTGF5b3V0QWN0aW9uX2xhYmVsKTsKLQkJaGllcmFyY2hpY2FsTGF5b3V0LnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19MQVlPVVRfSElFUkFSQ0hJQ0FMKTsKLQkJCi0JCXJldHVybiBuZXcgSUFjdGlvbltde2ZsYXRMYXlvdXRBY3Rpb24sIGhpZXJhcmNoaWNhbExheW91dH07Ci0JfQotfQotCi1jbGFzcyBMYXlvdXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNGbGF0TGF5b3V0OwotCXByaXZhdGUgTGlicmFyeVZpZXcgZmxpYlZpZXc7Ci0KLQlwdWJsaWMgTGF5b3V0QWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcsIGJvb2xlYW4gZmxhdCkgewotCQlzdXBlcigiIiwgQVNfUkFESU9fQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZJc0ZsYXRMYXlvdXQ9IGZsYXQ7Ci0JCWZsaWJWaWV3PSBsaWJWaWV3OwotCQlpZiAoZklzRmxhdExheW91dCkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTEFZT1VUX0ZMQVRfQUNUSU9OKTsKLQkJZWxzZQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MQVlPVVRfSElFUkFSQ0hJQ0FMX0FDVElPTik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSAhPSBmSXNGbGF0TGF5b3V0KSB7Ci0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnRvZ2dsZUxheW91dCgpOwotCQkJLy8gc2F2ZSBzdGF0ZQotCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLnNldExheW91dChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmdldExheW91dEFzU3RyaW5nKCkpOwotCQl9Ci0JCWZsaWJWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQlmbGliVmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCWZsaWJWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTNmOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUmVkb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVW5kb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IHZpZXcgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCUVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KLQlwcm90ZWN0ZWQgSVZpZXdQYXJ0IGFjdGl2ZVZpZXdQYXJ0OwotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBJQWN0aW9uQmFycyB2aWV3QWN0aW9uQmFyczsKLQotCS8vIExpYnJhcnkgdmlldyBlZGl0IGFjdGlvbgotCXByb3RlY3RlZCBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24gbGlicmFyeVZpZXdFZGl0QWN0aW9uOwotCi0JLy8gQ29uZmlndXJhdGlvbiB2aWV3IGVkaXQgYWN0aW9uCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbiBjb25maWdWaWV3RWRpdEFjdGlvbjsKLQotCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtKSB7IAotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKSB7IAotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJcmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvCi0JICogZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNoaWxkQWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yCi0JICogQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcKLQkgKiB0byBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0KLQkgKiBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCQotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJKChMaWJyYXJ5VmFsaWRhdGVBY3Rpb24pdmFsaWRhdGVBY3Rpb24pLnB1dENvbnRleHREYXRhKExpYnJhcnlFVmFsaWRhdG9yLkNUWF9BREFQVEVSX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJUHJvY2Vzc0VkaXRvci5hZGFwdGVyRmFjdG9yeVByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibWV0aG9kLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtZXRob2QtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvcgotCSAqIGFkZGl0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7Ci0KLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9NZXRob2RFZGl0b3JfbWVudSwgImNvbS5pYm0ubWV0aG9kTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgIAotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgotCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0pOyAKLQkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgotCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtKTsgCi0JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgotCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkJbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgSVZpZXdQYXJ0IGdldEFjdGl2ZVZpZXcoKSB7Ci0JCXJldHVybiBhY3RpdmVWaWV3UGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVWaWV3KElWaWV3UGFydCBwYXJ0KSB7Ci0JCS8vIFRPRE8gLSBtYXkgbmVlZCB0byBjaGVjayBvdGhlciBtZXRob2QKLQkJaWYgKHBhcnQgIT0gbnVsbCkKLQkJCXN1cGVyLnNldEFjdGl2ZVZpZXcocGFydCk7Ci0JCWlmIChwYXJ0ID09IGFjdGl2ZVZpZXdQYXJ0KQotCQkJcmV0dXJuOwotCQlpZiAoYWN0aXZlVmlld1BhcnQgIT0gbnVsbCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQl9Ci0JCWlmIChwYXJ0ID09IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAoIShwYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikpCi0JCQlyZXR1cm47Ci0JCWFjdGl2ZVZpZXdQYXJ0ID0gcGFydDsKLQkJZWRpdGluZ0RvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCi0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwKLQkJCQkJCXNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7Ci0JCQl9Ci0JCX0KLQotCQlhY3RpdmF0ZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJYWN0aXZlVmlld1BhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uICE9IG51bGwpCi0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY29uZmlnVmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWN1dEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCWFjdGl2ZVZpZXdQYXJ0LmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0JCQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JCWlmICh2YWxpZGF0ZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodmFsaWRhdGVBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKGNvbnRyb2xBY3Rpb24gIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbnRyb2xBY3Rpb24pOwotCQl9ICAgICAgCQkKLQotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChhY3RpdmVWaWV3UGFydCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbgotCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljdXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljb3B5QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJcGFzdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl1bmRvQWN0aW9uLnVwZGF0ZSgpOwotCQlyZWRvQWN0aW9uLnVwZGF0ZSgpOwotCi0JCWlmIChsb2FkUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJbG9hZFJlc291cmNlQWN0aW9uLnVwZGF0ZSgpOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycwotCQlDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKLQkJfQotCi0JCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCi0JCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQkJc2VsZWN0aW9uKTsKLQotCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufQotCSAqIGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGFuZCByZXR1cm5zIHRoZQotCSAqIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZUNoaWxkQWN0aW9uKGVkaXRpbmdEb21haW4sCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlVmlld1BhcnQsCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkCi0JICogY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LiBJZiA8Y29kZT5JRDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYWN0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgewotCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucykgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcwotCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKLQkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0SW5uZXJJdGVtKCk7Ci0JCQkJfQotCi0JCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KLQkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldEFjdGlvbigpOwotCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7Ci0JCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQotCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsgCi0JCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JICAgIFN0cmluZyBrZXkgPSAoc3R5bGUgJiBBRERJVElPTlNfTEFTVF9TVFlMRSkgPT0gMCA/ICJhZGRpdGlvbnMtZW5kIiA6ICJhZGRpdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoa2V5LCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh2YWxpZGF0ZUFjdGlvbikpOwotCSAgICB9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChJQWN0aW9uQmFycywKLQkgKiAgICAgIElXb3JrYmVuY2hQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMsIHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KElBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQl2aWV3QWN0aW9uQmFycyA9IGFjdGlvbkJhcnM7Ci0KLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpOwotCi0JCWxpYnJhcnlWaWV3RWRpdEFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCk7IAotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoTGlicmFyeVZpZXdFZGl0QWN0aW9uLkFDVElPTl9JRCwKLQkJCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24pOwotCi0JCWN1dEFjdGlvbiA9IGNyZWF0ZUN1dEFjdGlvbigpOwotCQljdXRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DVVQpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksIGN1dEFjdGlvbik7Ci0KLQkJY29weUFjdGlvbiA9IGNyZWF0ZUNvcHlBY3Rpb24oKTsKLQkJY29weUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotCQkJCWNvcHlBY3Rpb24pOwotCi0JCXBhc3RlQWN0aW9uID0gY3JlYXRlUGFzdGVBY3Rpb24oKTsKLQkJcGFzdGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9QQVNURSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCXBhc3RlQWN0aW9uKTsKLQotCQlkZWxldGVBY3Rpb24gPSBjcmVhdGVEZWxldGVBY3Rpb24oKTsKLQkJZGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCWRlbGV0ZUFjdGlvbik7Ci0JCQotCQl1bmRvQWN0aW9uID0gbmV3IFVuZG9BY3Rpb24oKTsKLQkJdW5kb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1VORE8pKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCXVuZG9BY3Rpb24pOwotCi0JCXJlZG9BY3Rpb24gPSBuZXcgUmVkb0FjdGlvbigpOwotCQlyZWRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUkVETykpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJcmVkb0FjdGlvbik7Ci0KLQkJbGlicmFyeVZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY3V0IGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIEN1dEFjdGlvbiBjcmVhdGVDdXRBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ3V0QWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgcGFzdGUgYWN0aW9uCi0JICogQHJldHVybiBhY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgUGFzdGVBY3Rpb24gY3JlYXRlUGFzdGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUGFzdGVBY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBjb3B5IGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIENvcHlBY3Rpb24gY3JlYXRlQ29weUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDb3B5QWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgZGVsZXRlIGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIERlbGV0ZUFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgRGVsZXRlQWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNnZXRBY3Rpb25CYXJzKCkKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIHZpZXdBY3Rpb25CYXJzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTVkZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWYWxpZGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuRU1GRWRpdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5VmFsaWRhdGlvbk1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkxpYnJhcnlFVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkxpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuTGlicmFyeUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWYWxpZGF0ZUFjdGlvbiBleHRlbmRzIFZhbGlkYXRlQWN0aW9uIHsKLQlwcml2YXRlIEhhc2hTZXQgcmVzb3VyY2VzOwotCXByaXZhdGUgYm9vbGVhbiBzdWNjZXNzOwotCXByaXZhdGUgYm9vbGVhbiBzaG93U3VjY2VzcyA9IHRydWU7Ci0JcHJpdmF0ZSBNYXAgY29udGV4dERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIExpYnJhcnlWYWxpZGF0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBuZXcgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIoKTsKLQl9Ci0JCi0JcHVibGljIExpYnJhcnlWYWxpZGF0ZUFjdGlvbihib29sZWFuIHNob3dTdWNjZXNzKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zaG93U3VjY2VzcyAgPSBzaG93U3VjY2VzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHV0Q29udGV4dERhdGEoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWNvbnRleHREYXRhLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24jdmFsaWRhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIERpYWdub3N0aWMgdmFsaWRhdGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkgICAgaWYocmVzb3VyY2VzID09IG51bGwpIHsKLQkgICAgCXJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgIAlyZXNvdXJjZXMuY2xlYXIoKTsKLQkgICAgfQotCSAgICBib29sZWFuIGRlcGVuZGVuY3lJbmZvTWdyU2V0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gZU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQllT2JqZWN0cy5hZGQoZWxlbWVudCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpZWxlbWVudCkuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJaWYgKCEgZGVwZW5kZW5jeUluZm9NZ3JTZXQgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwkKLQkJCQkJcHV0Q29udGV4dERhdGEoTGlicmFyeUVWYWxpZGF0b3IuQ1RYX0RFUEVOREVOQ1lfVkFMSURBVElPTl9NR1IsIG5ldyBEZXBlbmRlbmN5VmFsaWRhdGlvbk1ncihsaWIpKTsKLQkJCQkJZGVwZW5kZW5jeUluZm9NZ3JTZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkgICAgaW50IGNvdW50ID0gZU9iamVjdHMuc2l6ZSgpOwotCSAgICBlT2JqZWN0cyA9IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5tYWtlVGFyZ2V0c0Rpc2pvaW50KGVPYmplY3RzKTsKLQkJTGlicmFyeUl0ZXJhdG9yIGxpYkl0ZXIgPSBuZXcgTGlicmFyeUl0ZXJhdG9yKGVPYmplY3RzLCB0cnVlLCBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuREVFUCwgdHJ1ZSk7Ci0JCXdoaWxlKGxpYkl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGxpYkl0ZXIubmV4dCgpOwotCQkJY291bnQrKzsKLQkJCWlmKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpbykuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JICAgIHByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCi0vLwkgICAgZmluYWwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAKLS8vCSAgICAgIGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiA/ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSA6IG51bGw7Ci0KLQkgICAgRGlhZ25vc3RpY2lhbiBkaWFnbm9zdGljaWFuID0gCi0JICAgICAgbmV3IERpYWdub3N0aWNpYW4oKQotCSAgICAgIHsKLQkgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TGFiZWwoRU9iamVjdCBlT2JqZWN0KQotCSAgICAgICAgewotLy8JICAgICAgICAgIGlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsICYmICFlT2JqZWN0LmVJc1Byb3h5KCkpCi0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcilhZGFwdGVyRmFjdG9yeS5hZGFwdChlT2JqZWN0LCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotLy8JICAgICAgICAgICAgaWYgKGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwpCi0vLwkgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgIHJldHVybiBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KGVPYmplY3QpOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgIH0KLS8vCSAgCi0vLwkgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldE9iamVjdExhYmVsKGVPYmplY3QpOwotCSAgICAgICAgCQotCSAgICAgICAgCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZU9iamVjdCk7Ci0JICAgICAgICB9Ci0KLQkgICAgICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVDbGFzcyBlQ2xhc3MsIEVPYmplY3QgZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkgICAgICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7Ci0JICAgICAgICAJICBjb250ZXh0ID0gY29udGV4dERhdGE7CSAgICAgICAgCSAgCi0JICAgICAgICAgIH0KLQkgICAgICAgICAgZWxzZSB7Ci0JICAgICAgICAJICBjb250ZXh0LnB1dEFsbChjb250ZXh0RGF0YSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlKGVDbGFzcywgZU9iamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCSAgICAgICAgfQkgICAgICAgIAotCSAgICAgICAgCi0JICAgICAgfTsKLQkgICAgICAKLQkgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGVPYmplY3RzKTsKLQkgICAgICBpbnQgbWF4ID0gbGlzdC5zaXplKCkgLSAxOwotCSAgICAgIFN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCSAgICAJICBPYmplY3QgZSA9IGxpc3QuZ2V0KGkpOwotCSAgICAJICBpZihlIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JICAgIAkJICBzdHJCdWYuYXBwZW5kKCgoTmFtZWRFbGVtZW50KWUpLmdldE5hbWUoKSkuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JICAgIAkgIH0KLQkgICAgICB9Ci0JICAgICAgT2JqZWN0IGUgPSBtYXggPCAwID8gbnVsbCA6IGxpc3QuZ2V0KG1heCk7Ci0JICAgICAgaWYoZSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotICAgIAkJICBzdHJCdWYuYXBwZW5kKCgoTmFtZWRFbGVtZW50KWUpLmdldE5hbWUoKSk7Ci0gICAgCSAgfQotCSAgICAgIEJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljcyA9IAotCSAgICAgICAgICBuZXcgQmFzaWNEaWFnbm9zdGljCi0JICAgICAgICAgICAgKEVPYmplY3RWYWxpZGF0b3IuRElBR05PU1RJQ19TT1VSQ0UsCi0JICAgICAgICAgICAgIDAsCi0JICAgICAgICAgICAgIEVjb3JlUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZwotCSAgICAgICAgICAgICAgICgiX1VJX0RpYWdub3N0aWNSb290X2RpYWdub3N0aWMiLCAvLyROT04tTkxTLTEkIAotCSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0IFtdIHsgc3RyQnVmLnRvU3RyaW5nKCkgfSksIAotCSAgICAgICAgICAgICBsaXN0LnRvQXJyYXkoKSk7Ci0JICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZU9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JICAgIAkgIEVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkgICAgCSAgcHJvZ3Jlc3NNb25pdG9yLnNldFRhc2tOYW1lCi0JICAgIAkgIChFTUZFZGl0VUlQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVmFsaWRhdGluZ19tZXNzYWdlIiwgbmV3IE9iamVjdCBbXSB7ZGlhZ25vc3RpY2lhbi5nZXRPYmplY3RMYWJlbChlT2JqZWN0KX0pKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJICBkaWFnbm9zdGljaWFuLnZhbGlkYXRlKGVPYmplY3QsIGRpYWdub3N0aWNzKTsKLQkgICAgICB9Ci0JICAgICAgc3VjY2VzcyA9IGRpYWdub3N0aWNzLmdldFNldmVyaXR5KCkgPT0gRGlhZ25vc3RpYy5PSzsKLQkgICAgICByZXR1cm4gZGlhZ25vc3RpY3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbiNoYW5kbGVEaWFnbm9zdGljKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB7Ci0JCWlmKGRpYWdub3N0aWMgIT0gbnVsbCkgewotCQkJaWYoc2hvd1N1Y2Nlc3MgfHwgIWlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJLy8gc2F2ZSB0aGUgcmVmZXJlbmNlIHRvIEVjbGlwc2VSZXNvdXJjZXNVdGlsIGFuZCBzZXQgZWNsaXBzZVJlc291cmNlc1V0aWwgdG8gbnVsbAotCQkJCS8vIHNvIHN1cGVyIG1ldGhvZCB3aWxsIG5vdCB0cnkgdG8gZGVhbCB3aXRoIHRoZSBtYXJrZXJzCi0JCQkJLy8KLQkJCQlFY2xpcHNlUmVzb3VyY2VzVXRpbCBzYXZlZFJlZiA9IGVjbGlwc2VSZXNvdXJjZXNVdGlsOwotCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzdXBlci5oYW5kbGVEaWFnbm9zdGljKGRpYWdub3N0aWMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBzYXZlZFJlZjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRlYWxpbmcgd2l0aCBtYXJrZXJzCi0JCQkvLwotCQkJaWYgKGVjbGlwc2VSZXNvdXJjZXNVdGlsICE9IG51bGwpCQkJCQotCQkJewotCQkJCS8vIGRlbGV0ZSBvbGQgbWFya2VycwotCQkJCS8vCQkJCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsLmRlbGV0ZU1hcmtlcnMoKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQkJCWlmICghZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCU1hcCBkaWFnbm9zdGljVG9SZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA9IChEaWFnbm9zdGljKWkubmV4dCgpOwotCQkJCQkJTGlzdCBkYXRhID0gY2hpbGREaWFnbm9zdGljLmdldERhdGEoKTsKLQkJCQkJCWlmICghZGF0YS5pc0VtcHR5KCkpIHsKLQkJCQkJCQlPYmplY3QgbyA9IGRhdGEuZ2V0KDApOwotCQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KW8pLmVSZXNvdXJjZSgpOwotCQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkaWFnbm9zdGljVG9SZXNvdXJjZU1hcC5wdXQoY2hpbGREaWFnbm9zdGljLCByZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJLy8gY3JlYXRlIG1hcmtlcnMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpY1RvUmVzb3VyY2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGkubmV4dCgpOwotCQkJCQkJRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgPSAoRGlhZ25vc3RpYyllbnRyeS5nZXRLZXkoKTsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwuY3JlYXRlTWFya2VycyhyZXNvdXJjZSwgY2hpbGREaWFnbm9zdGljKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gc2VsZWN0IHRoZSBmaXJzdCBvYmplY3Qgd2l0aCBwcm9ibGVtIGluIHRoZSB2aWV3ZXIgaWYgcG9zc2libGUKLQkJCQkJLy8KLQkJCQkJTGlzdCBkYXRhID0gKChEaWFnbm9zdGljKWRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5nZXQoMCkpLmdldERhdGEoKTsKLQkJCQkJaWYgKCFkYXRhLmlzRW1wdHkoKSkKLQkJCQkJewotCQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7CQkJCQkJCi0JCQkJCQlPYmplY3QgZSA9IGRhdGEuZ2V0KDApOwotCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCQkJewotCQkJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldClwYXJ0KS5zZWxlY3RSZXZlYWwobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikKLQkJCQkJCXsKLQkJCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRhdGEuZ2V0KDApKSwgdHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJaWYodmlld2VyID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKQotCQkJCQl7Ci0JCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZih2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkvLyBjbGVhciBkZWNvcmF0aW9uIGNhY2hlCi0JCQkJCS8vCi0JCQkJCU1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5jbGVhckRlY29yYXRpb25DYWNoZSgpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCQl0cnkgewotCQkJCQlyZWZyZXNoVmlld3MoKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3cygpIHsKLQkJLy8gbm8gZXJyb3IgbWFya2VycyBmb3IgY29uZmlndXJhdGlvbiB2aWV3Ci0JCS8vCi0vLwkJQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0NvcHlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0NvcHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhN2IzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDb3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlUb0NsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNsaXBib2FyZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLQotLyoqCi0gKiBDb3BpZXMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdDb3B5QWN0aW9uIGV4dGVuZHMgQ29weUFjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikucmVzZXRDb3B5TWFwcygpOwotCQkJfQotCQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb3B5VG9DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQkJU3RyaW5nIGxpbmtzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvcHlUb0NsaXBib2FyZENvbW1hbmQpY29tbWFuZCkuZ2V0U291cmNlT2JqZWN0cygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBpdGVtID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW07Ci0JCQkJCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyLmdldFVybChlLAotCQkJCQkJCQludWxsLCAiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAobGlua3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJbGlua3MgKz0gU3RyVXRpbC5MSU5FX0ZFRUQ7Ci0JCQkJCQl9Ci0JCQkJCQlsaW5rcyArPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGluayhlLCB0cnVlLAotCQkJCQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaGFuZGxlQ29weVRleHRIVE1MVG9DbGlwYm9hcmQobGlua3MpOwotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLnJ1bigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBjb3B5aW5nIHRoZSBsaW5rcyB0byB0aGUgY2xpcGJvYXJkIGFzIFRleHQgYW5kIEhUTUwKLQkgKiBAcGFyYW0gbGlua3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDb3B5VGV4dEhUTUxUb0NsaXBib2FyZChTdHJpbmcgbGlua3MpIHsKLQkJQ2xpcGJvYXJkVXRpbC5jb3B5VGV4dEhUTUxUb0NsaXBib2FyZChsaW5rcyk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCi0JCX0KLQotCQljb21tYW5kID0gY3JlYXRlQ29tbWFuZChjb2xsZWN0aW9uKTsKLQotCQlyZXR1cm4gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDdXRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNjZGUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0vKioKLSAqIEN1dHMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3IHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0N1dEFjdGlvbiBleHRlbmRzIEN1dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZQotCQkJc3VwZXIucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RGVsZXRlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmNDRmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotCi0vKioKLSAqIERlbGV0ZXMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gewotCQotCS8qKiAKLQkgKiBEZWxldHMgYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oKSB7Ci0JCXRoaXModHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZXMgYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcgYWZ0ZXIgY29uZmlybWluZyB3aXRoIHVzZXIKLQkgKiBAcGFyYW0gY29uZmlybQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbihib29sZWFuIGNvbmZpcm0pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maXJtID0gY29uZmlybTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2RpZERlbGV0ZShDb2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpZERlbGV0ZShDb2xsZWN0aW9uIGRlbGV0ZWRFbGVtZW50cykgewotCQlzdXBlci5kaWREZWxldGUoZGVsZXRlZEVsZW1lbnRzKTsKLQkJCi0JCS8vIENsb3NlIGFsbCBvcGVuIGVkaXRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWxldGVkIGVsZW1lbnRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0UuZ2V0RWRpdG9yS2VlcGVyKCkKLQkJCQkJCS5jbG9zZUVkaXRvcnNPbkRlbGV0aW9uKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEN1c3RvbUNhdGVnb3J5IGdldFJvb3RDdXN0b21DYXRlZ29yeShPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvcig7IG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyOyBvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0T3duZXIoKSk7Ci0JCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSAmJiBUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KSA/Ci0JCQkoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3QgZmlsdGVyZWRTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwKLQkJCQkJCQkuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBnZXRSb290Q3VzdG9tQ2F0ZWdvcnkoZSk7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQ7Ci0JCQkJaWYgKHJvb3RDdXN0b21DYXRlZ29yeSAhPSBudWxsICYmIAotCQkJCQkJVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocm9vdEN1c3RvbUNhdGVnb3J5KSA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYykpIHsKLQkJCQkJLy8gc2VsZWN0ZWQgY3VzdG9tZSBjYXRlZ29yeSBpcyBpbiB0aGUgY3VycmVudCBwbHVnaW4uCi0JCQkJCS8vIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgc2VsZWN0aW9uIGluc3RlYWQgb2YgaXRzCi0JCQkJCS8vIHdyYXBwZXIgc28gdGhlIGVsZW1lbnQKLQkJCQkJLy8gd2lsbCBiZSBkZWxldGVkIHBlcm1hbmVudGx5IGZyb20gdGhlIGxpYnJhcnkKLQkJCQkJLy8KLQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsJCQkJCi0JCQkJaWYoZSBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGU7Ci0vLwkJCQkJaWYod3JhcHBlci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLS8vCQkJCQkJCSEoVG5nVXRpbC51bndyYXAod3JhcHBlci5nZXRPd25lcigpKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotLy8JCQkJCQkvLyBkaXNhbGxvdyBkZWxldGluZyBlbGVtZW50IHdoZW4gaXRzIHJlZmVyZW5jZSBpbgotLy8JCQkJCQkvLyBDdXN0b21DYXRlZ29yeSB0cmVlCi0vLwkJCQkJCS8vIHRoYXQgaXMgbm90IGRpcmVjdGx5IHVuZGVyIGEgQ3VzdG9tQ2F0ZWdvcnkgaXMKLS8vCQkJCQkJLy8gc2VsZWN0ZWQKLS8vCQkJCQkJLy8KLS8vCQkJCQkJY29udGludWU7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKFRuZ1V0aWwuaXNVbmRlckN1c3RvbUNhdGVnb3J5VHJlZSh3cmFwcGVyKSkgewotCQkJCQkJLy8gZGlzYWxsb3cgZGVsZXRpbmcgZWxlbWVudCB1bmRlciBhIGN1c3RvbSBjYXRlZ29yeSB0aGF0IGlzIG5vdCBhIGN1c3RvbSBjYXRlZ29yeQotCQkJCQkJLy8KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHdyYXBwZXIuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgCi0JCQkJCQkJfHwgd3JhcHBlci5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKSAKLQkJCQkJewotCQkJCQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQkJCQkJaWYob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIAotCQkJCQkJCQlVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb3duZXIpID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBlbGVtZW50KSkgewotCQkJCQkJCS8vIGNhdGVnb3J5IGdyb3VwaW5nIGFuZCBjYXRlZ29yeSBhcmUgaW4gdGhlIHNhbWUgcGx1Z2luCi0JCQkJCQkJLy8gYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBzZWxlY3Rpb24gaW5zdGVhZCBvZiBpdHMgd3JhcHBlciBzbyB0aGUgZWxlbWVudCAKLQkJCQkJCQkvLyB3aWxsIGJlIGRlbGV0ZWQgcGVybWFuZW50bHkgZnJvbSB0aGUgbGlicmFyeQotCQkJCQkJCS8vCi0JCQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsdGVyZWRTZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzdXBlcgotCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsdGVyZWRTZWxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNwZXJmb3JtRGVsZXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVsZXRlKCkgewotCQlIYXNoU2V0IGNvbmZpZ3NUb0RlbGV0ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCWNvbmZpZ3NUb0RlbGV0ZS5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgIXBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihvYmplY3QpKSB7Ci0JCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEF2b2lkIGRlbGV0aW5nIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgYSBwcm9jZXNzLgotCQlpZiAoIWNvbmZpZ3NUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCUhhc2hTZXQgY29uZmlnR1VJRHNUb0RlbGV0ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzVG9EZWxldGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJY29uZmlnR1VJRHNUb0RlbGV0ZS5hZGQoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkKLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQlyZXNvdXJjZVNldAotCQkJCQkubG9hZE9wcG9zaXRlRmVhdHVyZXMoCi0JCQkJCQkJQ29sbGVjdGlvbnMKLQkJCQkJCQkJCS5zaW5nbGV0b25MaXN0KEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzKSwKLQkJCQkJCQljb25maWdHVUlEc1RvRGVsZXRlKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlnc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZXIubmV4dCgpOwotCi0JCQkJTGlzdCByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXREZXBlbmRlbnRQcm9jZXNzZXMoY29uZmlnKTsKLQkJCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmIHJlZmVyZW5jZXMuc2l6ZSgpID4gMCkgewotCQkJCQlTdHJpbmcgcHJvY2Vzc05hbWUgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcmVmZXJlbmNlcwotCQkJCQkJCS5nZXQoMCkpLmdldE5hbWUoKTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZUNvbmZpZ0Vycm9yX21zZywgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVDb25maWdFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJcHJvY2Vzc05hbWUpKTsgCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCX0KLQotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKSk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwgCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoY29uZmlybURlbGV0ZSgpKSB7Ci0JCQkvLyBDb2xsZWN0IHRoZSBpbmZvcm1hdGlvbiBvZiBSZWZyZXNoYWJsZSBPYmplY3RzCi0JCQkvLyAoIFJlZmVyZW5jZSBPYmplY3RzIHNob3VsZCBiZSByZWZyZXNoZWQgaW4gbmF2aWdhdGlvbiB0cmVlKSAtCi0JCQlBcnJheUxpc3QgcmVmcmVzaExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGRlbGV0aW5nT2JqZWN0ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChkZWxldGluZ09iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJLy8gY2hlY2sgZm9yIHZhcmlhYmlsaXR5Ci0JCQkJCWlmIChkZWxldGluZ09iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IFRuZ1V0aWwKLQkJCQkJCQkJLmdldEdlbmVyYWxpemVycygoVmFyaWFiaWxpdHlFbGVtZW50KSBkZWxldGluZ09iamVjdCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGFSZWZlcmVuY2UgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJcmVmcmVzaExpc3QuYWRkKGFSZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSAoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpIChjb21tYW5kIGluc3RhbmNlb2YgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgPyBjb21tYW5kIDogbnVsbCk7Ci0JCQkKLQkJCS8vIGV4ZWN1dGUgYWN0dWFsIGRlbGV0ZSBjb21tYW5kLgotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCS8vIGRlbGV0ZSB0aGUgcmVmZXJlbmNpbmcgZGVzY3JpcHRvcnMgaWYgdGhlcmUgaXMgYW55Ci0JCQkvLwotCQkJaWYoY21kICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uPERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzVG9EZWxldGUgPSBjbWQuZ2V0RGVzY3JpcHRvcnNUb0RlbGV0ZSgpOwotCQkJCWlmKGRlc2NyaXB0b3JzVG9EZWxldGUgIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZWZyZXNoIHRoZSByZWZyZXNobGlzdCBvYmplY3RzIGluIG5hdmlnYXRpb24gdHJlZS4KLQkJCWlmIChyZWZyZXNoTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJVHJlZVZpZXdlciB2aWV3ZXIgPSAoKFRyZWVWaWV3ZXIpIChMaWJyYXJ5Vmlldy5nZXRWaWV3KCkKLQkJCQkJCS5nZXRWaWV3ZXIoKSkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZnJlc2hMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQl2aWV3ZXIucmVmcmVzaChpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IHByb3BlcnkgY2hhbmdlIHdpdGggb2xkIGFuZCBuZXcgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogCQkJcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdmFsdWUgaXMgZ29pbmcgdG8gY2hhbmdlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogCQkJT2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIAkJCU5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBjdXN0b21jYXRlZ29yeSBDb3B5L0RlbGV0ZSBhY3Rpb24gSWYgcGFyZW50IG9mCi0JICogY3VzdG9tY2F0ZWdvcnkgc2VsZWN0ZWQsIGlnbm9yZSB0aGUgY3VzdG9tY2F0ZWdvcnksIG90aGVyd2lzZSBjb21wb3VuZAotCSAqIGNvbW1hbmQgY3JlYXRlcyBhIGNvbW1hbmQgZm9yIHBhcmVudCBhbmQgYSBjb21tYW5kIGZvciBjaGlsZCwKLQkgKiBDb21wb3VuZENvbW1hbmQgd2lsbCBleGVjdXRlIGJvdGggY29tbWFuZHMsIGNvbW1hbmQgZm9yIHBhcmVudCB3aWxsCi0JICogcmVtb3ZlIHBhcmVudCBpdHNlbGYgYW5kIHJlbW92ZXMgY2hpbGQgdG9vLCBuZXh0IGl0IHRyeSB0byBleGVjdXRlCi0JICogY29tbWFuZCBmb3IgY2hpbGQsIGNvbW1hbmQgd2lsbCBmYWlsIGJlY2F1c2UgY2hpbGQgZ290IHJlbW92ZSBpbiBjb21tYW5kCi0JICogZm9yIHBhcmVudC4gCi0JICogVE9ETzogaGFuZGxlIHByb3Blcmx5IGluIFJlbW92ZUNvbW1hbmQgZm9yIHRoaXMgY2FzZSBpbnN0ZWFkIGhlcmUuCi0JICovCi0JcHVibGljIHZvaWQgZmlsdGVyQ3VzdG9tQ2F0ZWdvcnlTZWxlY3Rpb24oT2JqZWN0IGUsIExpc3QgZmlsdGVyZWRTZWxlY3Rpb24pIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZSk7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3Qgb3duZXIgPSAoKERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSBlKS5nZXRPd25lcigpOwotCQkJd2hpbGUgKG93bmVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWlmICghZmlsdGVyZWRTZWxlY3Rpb24uY29udGFpbnMob3duZXIpKSB7Ci0JCQkJCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGZpbHRlcmVkU2VsZWN0aW9uLmNvbnRhaW5zKG93bmVyKSkKLQkJCQkJCWJyZWFrOwotCQkJCQlvd25lciA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIG93bmVyKS5nZXRPd25lcigpOwotCQkJCQlpZiAoIShvd25lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJCQlpZiAoIWZpbHRlcmVkU2VsZWN0aW9uLmNvbnRhaW5zKG93bmVyKSkgewotCQkJCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2MGRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdFZGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIEVkaXRzIGFuIGVsZW1lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3RWRpdEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgSUQgZm9yIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JRCA9IExpYnJhcnlWaWV3RWRpdEFjdGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHNlbGVjdGVkOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdFZGl0QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoaXMgYWN0aW9uIGluIHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlzZWxlY3RlZCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCU9iamVjdCByZWFsT2JqID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAocmVhbE9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSByZWFsT2JqKQotCQkJCQkmJiAhKHJlYWxPYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSAmJiAhKHJlYWxPYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkpIHsKLQkJCQlzZWxlY3RlZC5hZGQocmVhbE9iaik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIXNlbGVjdGVkLmlzRW1wdHkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmU5M2JkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotLyoqCi0gKiAKLSAqIEZpbmRzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgSUQgZm9yIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JRCA9IExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0JCi0JcHJpdmF0ZSBMaWJyYXJ5VmlldyB0YXJnZXRWaWV3OwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQ7Ci0KLQkKLQlwdWJsaWMgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh0YXJnZXRWaWV3ID09IG51bGwpCi0JCQl0YXJnZXRWaWV3ID0gTGlicmFyeVZpZXcuZ2V0VmlldygpOwotCi0JCS8vIHNlbGVjdCBjdXJyZW50U2VsZWN0aW9uIGluIExpYiBWaWV3Ci0JCWlmICh0YXJnZXRWaWV3ICE9IG51bGwgJiYgc2VsZWN0ZWQgIT0gbnVsbCAmJiAhc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0KLQkJCXRyeSB7Ci0JCQkJdGFyZ2V0Vmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpLnNob3dWaWV3KExpYnJhcnlWaWV3LlZJRVdfSUQpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IocGUpOwotCQkJfQotCi0JCQlmaW5hbCBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBzZWxlY3RlZC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnNldFNlbGVjdGlvblRvVmlld2VyKAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWQgPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlPYmplY3QgcmVhbE9iaiA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKHJlYWxPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdQYXN0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzU4OGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotCi0vKioKLSAqIFBhc3RlcyBhbiBlbGVtZW50IGZyb20gdGhlIGNsaXBib2FyZCB0byB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTU1OQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdQYXN0ZUFjdGlvbiBleHRlbmRzIFBhc3RlQWN0aW9uIGltcGxlbWVudHMKLQkJSUxpYnJhcnlBY3Rpb24gewotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnNldFByb2dyZXNzTW9uaXRvcihnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlwZXJmb3JtUGFzdGUoKTsKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybSBwYXN0ZSBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtUGFzdGUoKSB7Ci0JCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCljb21tYW5kKTsKLQkJCU9iamVjdCBvd25lciA9IGNtZC5nZXRPd25lcigpOwotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBZGFwdGVyKSB7Ci0JCQkJb3duZXIgPSAoKEFkYXB0ZXIpb3duZXIpLmdldFRhcmdldCgpOwotCQkJfQotCQkJCi0JCQkvLyBjaGVjayB0YXJnZXQgZm9yIG1vZGlmaWFibGUKLQkJCS8vCi0JCQlpZihvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgoRU9iamVjdCkgb3duZXIsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJZ2V0VGV4dCgpLCBudWxsLCBzdGF0dXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCQotCQlpZiAoY29tbWFuZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlCi0JCQlzdXBlci5ydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlewotCQkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmeSBwcm9wZXJ5IGNoYW5nZSB3aXRoIG9sZCBhbmQgbmV3IHZhbHVlCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIAkJCXByb3BlcnR5IG5hbWUgZm9yIHdoaWNoIHZhbHVlIGlzIGdvaW5nIHRvIGNoYW5nZQotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqIAkJCU9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAJCQlOZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3U2ltcGxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2RkMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3U2ltcGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogQmFzZSBmb3Igc2ltcGxlIGxpYnJhcnkgYWN0aW9uIGNsYXNzZXMKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlICAxLjUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpYnJhcnlWaWV3U2ltcGxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByaXZhdGUgTGlicmFyeVZpZXcgbGlicmFyeVZpZXc7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGxpYlZpZXcKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbihMaWJyYXJ5VmlldyBsaWJWaWV3LCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJbGlicmFyeVZpZXcgPSBsaWJWaWV3OwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1J1bigpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlkb1J1bigpOwotCQkJfQotCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpYnJhcnlWaWV3IGdldExpYnJhcnlWaWV3KCkgewotCQlyZXR1cm4gbGlicmFyeVZpZXc7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uUGFyZW50T2JqZWN0KCkgewotCQlUcmVlSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBnZXRMaWJyYXJ5VmlldygpLmdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZEl0ZW1zID09IG51bGwgfHwgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVHJlZUl0ZW0gaXRlbSA9IHNlbGVjdGVkSXRlbXNbMF0uZ2V0UGFyZW50SXRlbSgpOwotCQlyZXR1cm4gVG5nVXRpbC51bndyYXAoaXRlbS5nZXREYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSkgewotCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl0cnkgewotCQkJSGFzaFNldDxSZXNvdXJjZT4gc2VlbnMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gcmVzb3VyZXNUb1NhdmUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCEgc2VlbnMuY29udGFpbnMocmVzKSkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXMpOwotCQkJCQlzZWVucy5hZGQocmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3VzdG9tZUNhdGVnb3J5QWN0aW9uIGV4dGVuZHMgTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24gewotCQlwdWJsaWMgQ3VzdG9tZUNhdGVnb3J5QWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcsIFN0cmluZyB0ZXh0KSB7Ci0JCQlzdXBlcihsaWJWaWV3LCB0ZXh0KTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tNb2RpZnkoKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldExpYnJhcnlWaWV3KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCXx8IChlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCkpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJaWYgKCEgY2hlY2tNb2RpZnkoZWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tNb2RpZnkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQl8fCAoZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJLy8gSGFuZGxlIEN1c3RvbUNhdGVnb3J5IHNwZWNpYWxseS4KLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQkJY29udGFpbmVyLCBnZXRMaWJyYXJ5VmlldygpLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfbW92ZUVycm9yLAotCQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpbmtXaXRoRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2MzQ2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogTGlua3MgZWRpdG9yIHdpdGggYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIExpbmtXaXRoRWRpdG9yIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSVBhcnRMaXN0ZW5lciBlZGl0b3JQYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJLy8gU2VsZWN0IHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnRseQotCQkJCS8vIHNlbGVjdGVkIGVkaXRvci4KLQkJCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCQlvYmplY3RzWzBdID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0QWN0aXZlTWV0aG9kRWRpdG9ySW5wdXQoKTsKLQkJCQlpZiAob2JqZWN0c1swXSAhPSBudWxsKSB7Ci0JCQkJCS8vIGRpc2FibGUgdGhlIHNlbGVjdGlvbkNoYW5nZWQgbWV0aG9kIGZyb20gZmlyaW5nIGZyb20gdGhpcyBzZWxlY3Rpb24gY2hhbmdlCi0JCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJdGFyZ2V0Vmlldy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihvYmplY3RzWzBdKTsKLQkJCQkJZW5hYmxlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJdGFyZ2V0VmlldyA9IChMaWJyYXJ5VmlldykgdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQkvLyByZW1vdmUgbGlzdGVuZXJzIGZyb20gZWRpdG9ycGFydAotCQkJdGFyZ2V0Vmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcigKLQkJCQkJZWRpdG9yUGFydExpc3RlbmVyKTsKLQotCQkJZW5hYmxlZCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJLy8gc2VsZWN0IGVsZW1lbnQgb2YgY3VycmVudGx5IHNlbGVjdGVkIGVkaXRvcgotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlvYmplY3RzWzBdID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmdldEFjdGl2ZU1ldGhvZEVkaXRvcklucHV0KCk7Ci0JCQlpZiAob2JqZWN0c1swXSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Vmlldy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihvYmplY3RzWzBdKTsKLQkJCX0KLQotCQkJLy8gYWRkIGxpc3RlbmVycyB0byBlZGl0b3JwYXJ0Ci0JCQl0YXJnZXRWaWV3LmdldFNpdGUoKS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKGVkaXRvclBhcnRMaXN0ZW5lcik7Ci0KLQkJCWVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGlua1dpdGhFZGl0b3Igc2VsZWN0aW9uIGlzICIgKyBzZWxlY3Rpb24pOwotCQlpZiAoZW5hYmxlZCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuc2VsZWN0RWRpdG9yKHNlbC5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkSW1hZ2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRJbWFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQ4OTk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRJbWFnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLk1ldGhvZEFkZEltYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgQWRkIEltYWdlIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEFkZEltYWdlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkSW1hZ2VBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9JTUFHRSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIEEgUmljaCBUZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwgJiYgcmljaFRleHQgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCU1ldGhvZEFkZEltYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXRob2RBZGRJbWFnZURpYWxvZyhEaXNwbGF5Ci0JCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJKChJTWV0aG9kUmljaFRleHQpIHJpY2hUZXh0KS5nZXRNZXRob2RFbGVtZW50KCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCWlmIChkaWFsb2cuZ2V0RmlsZVRvQ29weSgpICE9IG51bGwpIHsKLQkJCQkJLy8gQ29weSB0aGUgaW1hZ2UgdG8gdGhlIHJlc291cmNlIGZvbGRlciBpZiBuZWNlc3NhcnkuCi0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaW1hZ2VMaW5rID0gTmV0VXRpbC5kZWNvZGVkRmlsZVVybChMaWJyYXJ5VUlVdGlsLmdldFVSTEZvckF0dGFjaG1lbnQoRGlzcGxheQotCQkJCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIGRpYWxvZwotCQkJCQkJCQkuZ2V0RmlsZVRvQ29weSgpLAotCQkJCQkJCQkoKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKSwgdHJ1ZSkpOwotCQkJCQkJaWYgKGltYWdlTGluayA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gdXNlciBoaXQgY2FuY2VsIG9uIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCQkJKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLnNldEZvY3VzKCk7Ci0JCQkJCQkJKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmFkZEltYWdlKGltYWdlTGluaywgIiIgKyBkaWFsb2cuZ2V0SGVpZ2h0KCksICIiICsgZGlhbG9nLmdldFdpZHRoKCksIGRpYWxvZy5nZXRBbHRUYWcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyaWNoVGV4dAotCQkJCQkJCS5leGVjdXRlQ29tbWFuZCgKLQkJCQkJCQkJCVJpY2hUZXh0Q29tbWFuZC5BRERfSU1BR0UsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJCQlpbWFnZUxpbmssCi0JCQkJCQkJCQkJCSIiICsgZGlhbG9nLmdldEhlaWdodCgpLCAiIiArIGRpYWxvZy5nZXRXaWR0aCgpLCBkaWFsb2cuZ2V0QWx0VGFnKCkgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkTGlua0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZExpbmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwZWFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkTGlua0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5NZXRob2RBZGRMaW5rRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQWRkcyBhIGxpbmsgdG8gYSBSaWNoIFRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkTGlua0FjdGlvbiBleHRlbmRzIEFkZExpbmtBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkTGlua0FjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBBIFJpY2ggVGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQlNZXRob2RBZGRMaW5rRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXRob2RBZGRMaW5rRGlhbG9nKERpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCShJTWV0aG9kUmljaFRleHQpIHJpY2hUZXh0KTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCQlTdHJpbmcgbGlua1VSTCA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0VVJMKCk7Ci0JCQkJCWlmIChsaW5rVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQkJaWYgKGRpYWxvZy5nZXRGaWxlVG9Db3B5KCkgIT0gbnVsbCkgewotCQkJCQkJCS8vIGxpbmsgdG8gYSBmaWxlLCBjcmVhdGUgdGhlIFVSTAotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWxpbmtVUkwgPSBMaWJyYXJ5VUlVdGlsLmdldFVSTEZvckF0dGFjaG1lbnQoRGlzcGxheQotCQkJCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgZGlhbG9nCi0JCQkJCQkJCQkJLmdldEZpbGVUb0NvcHkoKSwKLQkJCQkJCQkJCQkoKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpCi0JCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpLCB0cnVlKTsKLQkJCQkJCQkJaWYgKGxpbmtVUkwgPT0gbnVsbCkgewotCQkJCQkJCQkJLy8gdXNlciBoaXQgY2FuY2VsIG9uIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZwotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVN0cmluZyB1cmwgPSAiPGEgaHJlZj1cIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCQkJCQkJdXJsICs9IE5ldFV0aWwKLQkJCQkJCQkJCQkJLmVuY29kZUZpbGVVUkwoTmV0VXRpbC5GSUxFX1VSSV9QUkVGSVgKLQkJCQkJCQkJCQkJCQkrIGxpbmtVUkwpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJdXJsICs9IE5ldFV0aWwuZW5jb2RlRmlsZVVSTCgiLi8iICsgbGlua1VSTCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQl1cmwgKz0gIlwiIiArIChkaWFsb2cuZ2V0T3BlbkxpbmtJbk5ld1dpbmRvdygpID8gIiAiICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJTWV0aG9kQWRkTGlua0RpYWxvZy5PUEVOX0xJTktfSU5fTkVXX1dJTkRPV19BVFRSSUJVVEUgOiAiIikgKyAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSI+IiArIG5ldyBGaWxlKGxpbmtVUkwpLmdldE5hbWUoKSArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCWxpbmtVUkwgPSB1cmw7Ci0KLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcikgewotCQkJCQkJCSgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5hZGRIVE1MKGxpbmtVUkwpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsCi0JCQkJCQkJCQlsaW5rVVJMKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuZXhlY3V0ZShyaWNoVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVDaGlsZEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZUNoaWxkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTUxNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZUNoaWxkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotCi0vKioKLSAqIE1ldGhvZCBDcmVhdGUgQ2hpbGQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24gZXh0ZW5kcyBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uIHsKLQkvKioKLQkgKiBUaGlzIGRlc2NyaWJlcyB0aGUgY2hpbGQgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRoYXQgY3JlYXRlcyBhIGNoaWxkIHNwZWNpZmllZAotCSAqIGJ5IDxjb2RlPmRlc2NyaXB0b3I8L2NvZGU+IGZvciB0aGUgc2luZ2xlIG9iamVjdCBpbiB0aGUKLQkgKiA8Y29kZT5zZWxlY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RDcmVhdGVDaGlsZEFjdGlvbihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiwgT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJY29uZmlndXJlQWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBjb21tYW5kIGZvciB7QGxpbmsKLQkgKiBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uI2NyZWF0ZUFjdGlvbkNvbW1hbmR9LgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFjdGlvbkNvbW1hbmQoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgb3duZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCi0JCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIENvbW1hbmRQYXJhbWV0ZXIKLQkJCQkJJiYgKChDb21tYW5kUGFyYW1ldGVyKSBkZXNjcmlwdG9yKS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCUNvbW1hbmRQYXJhbWV0ZXIgbmV3Q2hpbGRQYXJhbWV0ZXIgPSAoQ29tbWFuZFBhcmFtZXRlcikgZGVzY3JpcHRvcjsKLQkJCQlDcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyIGhlbHBlciA9IChIZWxwZXIpICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWVkaXRpbmdEb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob3duZXIsIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoRU9iamVjdCkgb3duZXIpLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCWlmIChvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIHsKLS8vCQkJCQkJaGVscGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBvOwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJY21kID0gbmV3IENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCQkoRU9iamVjdCkgb3duZXIsIG5ld0NoaWxkUGFyYW1ldGVyCi0JCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgbmV3Q2hpbGRQYXJhbWV0ZXIKLQkJCQkJCQkJLmdldFZhbHVlKCksIG5ld0NoaWxkUGFyYW1ldGVyLmdldEluZGV4KCksCi0JCQkJCQljb2xsZWN0aW9uLCBoZWxwZXIpIHsKLQkJCQl9OwotCQkJfSBlbHNlIHsKLQkJCQljbWQgPSBDcmVhdGVDaGlsZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIG93bmVyLAotCQkJCQkJZGVzY3JpcHRvciwgY29sbGVjdGlvbik7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXcgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQoY21kKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlzdXBlclJ1bigpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQ3JlYXRlU2libGluZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWY0ZjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5TdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci0KLS8qKgotICogTWV0aG9kIENyZWF0ZSBTaWJpbGluZyBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uIGV4dGVuZHMKLQkJU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGlzIGRlc2NyaWJlcyB0aGUgc2libGluZyB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGhhdCBjcmVhdGVzIGEgc2libGluZyBzcGVjaWZpZWQKLQkgKiBieSA8Y29kZT5kZXNjcmlwdG9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ3JlYXRlU2libGluZ0FjdGlvbihJVmlld1BhcnQgdmlld1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZpZXdQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZWRpdGluZ0RvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgdmlld1BhcnQpCi0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJY29uZmlndXJlQWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBjb21tYW5kIGZvciB7QGxpbmsKLQkgKiBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uI2NyZWF0ZUFjdGlvbkNvbW1hbmR9LgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFjdGlvbkNvbW1hbmQoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlDb21tYW5kIGNtZCA9IENyZWF0ZUNoaWxkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgbnVsbCwKLQkJCQkJZGVzY3JpcHRvciwgY29sbGVjdGlvbik7Ci0JCQlyZXR1cm4gbmV3IENyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDQ3YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUmVkb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVW5kb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLklGb3JtUGFnZTsKLQotLyoqCi0gKiBUaGUgY29udHJpYnV0b3IgZm9yIGEgTWV0aG9kIGVkaXRvci4KLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0KLQkvLyBIYW5kbGUgdGhlIFNob3cgUHJvcGVydGllcyB2aWV3IGFjdGlvbi4KLQlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKLQkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCXJldHVybiBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkb1JlZnJlc2goKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvCi0JICogZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNoaWxkQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZwotCSAqIHRvIGVhY2ggZGVzY3JpcHRvciBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbQotCSAqIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZVNpYmxpbmdBY3Rpb25zOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlCi0JICogYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0JcHVibGljIE1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJdGhpcy5uYW1lID0gIk1ldGhvZEVsZW1lbnRFZGl0b3IiOyAgCS8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yKFN0cmluZyBuYW1lKSB7Ci0JCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkZWxldGUgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVBY3Rpb24ocmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkpOwotCX0KLQotCSAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuaW5pdChhY3Rpb25CYXJzKTsKLQkJCi0JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKTsKLQotCQlkZWxldGVBY3Rpb24gPSBjcmVhdGVEZWxldGVBY3Rpb24oKTsKLQkJZGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCWRlbGV0ZUFjdGlvbik7Ci0KLQkJY3V0QWN0aW9uID0gY3JlYXRlQ3V0QWN0aW9uKCk7Ci0JCWN1dEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NVVCkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0QWN0aW9uKTsKLQotCQljb3B5QWN0aW9uID0gY3JlYXRlQ29weUFjdGlvbigpOwotCQljb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJY29weUFjdGlvbik7Ci0KLQkJcGFzdGVBY3Rpb24gPSBjcmVhdGVQYXN0ZUFjdGlvbigpOwotCQlwYXN0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJcGFzdGVBY3Rpb24pOwotCi0JCXVuZG9BY3Rpb24gPSBuZXcgVW5kb0FjdGlvbigpOwotCQl1bmRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ETykpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksCi0JCQkJdW5kb0FjdGlvbik7Ci0KLQkJcmVkb0FjdGlvbiA9IG5ldyBSZWRvQWN0aW9uKCk7Ci0JCXJlZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQlyZWRvQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvcHkgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvcHlBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHBhc3RlIGFjdGlvbgotCSAqIEByZXR1cm4gQWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhc3RlQWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjdXQgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDdXRBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IobmFtZSArICItc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IobmFtZSArICItYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0cyBlbmFibGVkIGZsYWcKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yCi0JICogYWRkaXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotLy8JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOwotLy8JCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLS8vCQkJCWdldFN0cmluZygiX1VJXyIgKyBuYW1lICsgIl9tZW51IiksICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLiIgKyBuYW1lICsgIk1lbnVJRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0vLwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCi0vLwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLS8vCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotLy8JCQkJZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0vLwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLS8vCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0vLwkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KLS8vCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLS8vCQkJCW1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKLS8vCQkJfQotLy8JCX0pOwotLy8KLS8vCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycwotCSAqIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQlzZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0JCX0KLQkJCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZwotCQkvLyBkZXNjcmlwdG9ycy4KLQkJQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcikKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQotCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7Ci0JCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOwotCQl9Ci0KLQkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KLQkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCQlzZWxlY3Rpb24pOwotCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoCi0JCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywKLQkJCQkJbnVsbCk7Ci0JCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JCWlmICghKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEZvcm1FZGl0b3IpKSB7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0KLQkgKiBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUKLQkgKiBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3IsIHNlbGVjdGlvbiwKLQkJCQkJCWkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yLAotCQkJCQkJc2VsZWN0aW9uLCBpLm5leHQoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zIGJhc2VkIG9uIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUKLQkgKiA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLCBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZAotCSAqIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4gSWYgPGNvZGU+SUQ8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7Ci0JCWlmIChhY3Rpb25zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGFjdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsKLQkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zIGJhc2VkIG9uIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUKLQkgKiA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsCi0JCQlDb2xsZWN0aW9uIGFjdGlvbnMpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMKLQkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07Ci0JCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7Ci0JCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldElubmVySXRlbSgpOwotCQkJCX0KLQotCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCi0JCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKQotCQkJCQkJCS5nZXRBY3Rpb24oKTsKLQkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgewotCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkvLyBBZGQgb3VyIHN0YW5kYXJkIG1hcmtlci4KLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEFkZCB0aGUgZWRpdCBtZW51IGFjdGlvbnMuCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh1bmRvQWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShyZWRvQWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkvLyBtZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY3V0QWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjb3B5QWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShwYXN0ZUFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGRlbGV0ZUFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkvLyBBZGQgb3VyIG90aGVyIHN0YW5kYXJkIG1hcmtlci4KLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQotCQlpZiAoZW5hYmxlZCkgewotCQkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOwotCQkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCWdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCWdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkgICAgU3RyaW5nIGtleSA9IChzdHlsZSAmIEFERElUSU9OU19MQVNUX1NUWUxFKSA9PSAwID8gImFkZGl0aW9ucy1lbmQiIDogImFkZGl0aW9ucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgICBpZiAodmFsaWRhdGVBY3Rpb24gIT0gbnVsbCkKLQkgICAgewotCSAgICAgIG1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShrZXksIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHZhbGlkYXRlQWN0aW9uKSk7Ci0JICAgIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgdmlld2VyCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2goKSB7Ci0JCWlmIChhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgYWN0aXZlRWRpdG9yKS5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJLy8gZml4IGFjdGlvbnMgLS0gaWYgbmV3IHBhZ2UgaXMgYW4gSUZvcm1QYWdlLCB3ZSBkb24ndCB3YW50IEVNRiBhY3Rpb25zCi0JCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0QWN0aW9uQmFycygpOwotCQkJaWYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEZvcm1FZGl0b3IpIHsKLQkJCQlJRm9ybVBhZ2UgcGFnZSA9ICgoRm9ybUVkaXRvcilhY3RpdmVFZGl0b3IpLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOyAKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewkJCQotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQkJbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJCW51bGwpOwotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJCQkJbnVsbCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQkJCWRlbGV0ZUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQljdXRBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJCWNvcHlBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJCQlwYXN0ZUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJdW5kb0FjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCQkJcmVkb0FjdGlvbik7Ci0JCQl9Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCQlzdXBlci5hY3RpdmF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Nb3ZlRG93bkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWEwZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTW92ZURvd25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogTW92ZXMgdXAgYnJlYWtkb3duIGVsZW1lbnQgaW4gYSBwcm9jZXNzIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTW92ZURvd25BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1vdmVBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd247Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkiZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBNb3ZlRG93bkFjdGlvbigpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSU1HX0RFU0MpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfREVTQyk7Ci0JCXNldFRvb2xUaXBUZXh0KExBQkVMKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChBY3Rpdml0eSBhY3QsIE9iamVjdCBlbGVtZW50LAotCQkJQ29sbGVjdGlvbjxFQ2xhc3M+IGNsYXNzZXMpIHsKLQkJcmV0dXJuIG5ldyBNb3ZlRG93bkNvbW1hbmQoYWN0LCBlbGVtZW50LCBjbGFzc2VzKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsJCQotCQlpZihzdXBlci5hY2NlcHQoc2VsZWN0aW9uKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXAgPSBnZXRJdGVtUHJvdmlkZXIoZWxlbWVudCk7Ci0JCQlpZihpcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuICFpcC5pc0xhc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTYxMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVVcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVVcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBNb3ZlcyB1cCBicmVha2Rvd24gZWxlbWVudCBpbiBhIHByb2Nlc3MgdHJlZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlVXBBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1vdmVBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQyA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0MgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZiIpOyAvLyROT04tTkxTLTEkIAotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBNb3ZlVXBBY3Rpb24oKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKElNR19ERVNDKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX0RFU0MpOwotCQlzZXRUb29sVGlwVGV4dChMQUJFTCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNvbW1hbmQoQWN0aXZpdHkgYWN0LCBPYmplY3QgZWxlbWVudCwKLQkJCUNvbGxlY3Rpb248RUNsYXNzPiBjbGFzc2VzKSB7Ci0JCXJldHVybiBuZXcgTW92ZVVwQ29tbWFuZChhY3QsIGVsZW1lbnQsIGNsYXNzZXMpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewkJCi0JCWlmKHN1cGVyLmFjY2VwdChzZWxlY3Rpb24pKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpcCA9IGdldEl0ZW1Qcm92aWRlcihlbGVtZW50KTsKLQkJCWlmKGlwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gIWlwLmlzRmlyc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL011bHRpQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwZGFkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLQotLyoqCi0gKiBBIE11bHRpQWN0aW9uR3JvdXAgd2lsbCBkaXNwbGF5IGEgbGlzdCBvZiBJQWN0aW9ucyBpbiBhIG1lbnUgYnkgdHJhbnNmb3JtaW5nIHRoZW0KLSAqIGludG8gTWVudUl0ZW1zLiBUaGUgbGlzdCBvZiBsYWJlbHMgZ2l2ZW4gd2lsbCBiZSB3aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgVmlld01lbnUgZm9yIAotICogdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9uICh0aGUgYWN0aW9uIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBhY3Rpb24gYXJyYXkpLgotICogVGhlIGFjdGlvbnMgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBzdGF0ZSBiYXNlZAotICogc28gdGhhdCBhZnRlciBhbiBhY3Rpb24gaXMgZXhlY3V0ZWQgdGhlIGxhYmVsIHdpbGwgaGF2ZSBhIHNlbGVjdGlvbiBjaGVjay4KLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zLk11bHRpQWN0aW9uR3JvdXAuY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0JCi0JcHVibGljIElBY3Rpb25bXSBOT19BQ1RJT05TID0gbmV3IElBY3Rpb25bMF07Ci0JCi0JcHJpdmF0ZSBJQWN0aW9uW10gZkFjdGlvbnM7IAotCQotCXByaXZhdGUgaW50IGZDdXJyZW50U2VsZWN0aW9uOwotCXByaXZhdGUgTWVudUl0ZW1bXSBmSXRlbXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBncm91cCB3aXRoIGEgZ2l2ZW4gc2V0IG9mIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMJCQl0aGUgYWN0aW9ucyBmb3IgdGhpcyBtdWx0aSBncm91cAotCSAqIEBwYXJhbSBjdXJyZW50U2VsZWN0aW9uCWRlY2lkZXMgd2hpY2ggYWN0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBtZW51IG9uIHN0YXJ0IHVwLgotCSAqIAkJCQkJCQlEZW5vdGVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgYWN0aW9ucyBhcnJheSBvZiB0aGUgY3VycmVudAotCSAqIAkJCQkJCQlzZWxlY3RlZCBzdGF0ZS4gSXQgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIE11bHRpQWN0aW9uR3JvdXAoSUFjdGlvbltdIGFjdGlvbnMsIGludCBjdXJyZW50U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEFjdGlvbnMoYWN0aW9ucywgY3VycmVudFNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGdyb3VwLiBDbGllbnRzIHVzaW5nIHRoaXMgY29uc3RydWN0b3IgbXVzdCBzZXQgdGhlIGFjdGlvbnMKLQkgKiBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGluZyB0aGUgbXVsdGkgYWN0aW9uIGdyb3VwIGJ5IGNhbGxpbmcge0BsaW5rICNzZXRBY3Rpb25zKElBY3Rpb25bXSwgaW50KX0uCi0JICovCi0JcHJvdGVjdGVkIE11bHRpQWN0aW9uR3JvdXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMJCQl0aGUgYWN0aW9ucyBmb3IgdGhpcyBtdWx0aSBncm91cCwgYXQgbGVhc3Qgb25lCi0JICogQHBhcmFtIGN1cnJlbnRTZWxlY3Rpb24JZGVjaWRlcyB3aGljaCBhY3Rpb24gaXMgc2VsZWN0ZWQgaW4gdGhlIG1lbnUgb24gc3RhcnQgdXAuCi0JICogCQkJCQkJCURlbm90ZXMgdGhlIGxvY2F0aW9uIGluIHRoZSBhY3Rpb25zIGFycmF5IG9mIHRoZSBjdXJyZW50Ci0JICogCQkJCQkJCXNlbGVjdGVkIHN0YXRlLiBJdCBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBY3Rpb25zKElBY3Rpb25bXSBhY3Rpb25zLCBpbnQgY3VycmVudFNlbGVjdGlvbikgewotCQlmQ3VycmVudFNlbGVjdGlvbj0gY3VycmVudFNlbGVjdGlvbjsKLQkJZkFjdGlvbnMgPSBhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGFjdGlvbnMgdG8gdGhlIGdpdmVuIG1lbnUgbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25zKElNZW51TWFuYWdlciB2aWV3TWVudSkgewotCi0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmSXRlbXM9IG5ldyBNZW51SXRlbVtmQWN0aW9ucy5sZW5ndGhdOwotCi0JCWZvciAoaW50IGk9IDA7IGkgPCBmQWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGo9IGk7Ci0KLQkJCXZpZXdNZW51LmFkZChuZXcgQ29udHJpYnV0aW9uSXRlbSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKLQkJCQkJCi0JCQkJCWludCBzdHlsZT0gU1dULkNIRUNLOwotCQkJCQlpZiAoKGZBY3Rpb25zW2pdLmdldFN0eWxlKCkgJiBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTikgIT0gMCkKLQkJCQkJCXN0eWxlPSBTV1QuUkFESU87Ci0JCQkJCQotCQkJCQlNZW51SXRlbSBtaT0gbmV3IE1lbnVJdGVtKG1lbnUsIHN0eWxlLCBpbmRleCk7Ci0JCQkJCUltYWdlRGVzY3JpcHRvciBkPSBmQWN0aW9uc1tqXS5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQkJbWkuc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQoZCkpOwotCQkJCQlmSXRlbXNbal09IG1pOwotCQkJCQltaS5zZXRUZXh0KGZBY3Rpb25zW2pdLmdldFRleHQoKSk7Ci0JCQkJCW1pLnNldFNlbGVjdGlvbihmQ3VycmVudFNlbGVjdGlvbiA9PSBqKTsKLQkJCQkJbWkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlpZiAoZkN1cnJlbnRTZWxlY3Rpb24gPT0gaikgewotCQkJCQkJCQlmSXRlbXNbZkN1cnJlbnRTZWxlY3Rpb25dLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlmQWN0aW9uc1tqXS5ydW4oKTsKLQotCQkJCQkJCS8vIFVwZGF0ZSBjaGVja2VkIHN0YXRlCi0JCQkJCQkJZkl0ZW1zW2ZDdXJyZW50U2VsZWN0aW9uXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQkJCWZDdXJyZW50U2VsZWN0aW9uPSBqOwotCQkJCQkJCWZJdGVtc1tmQ3VycmVudFNlbGVjdGlvbl0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdDb25maWd1cmF0aW9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTZlNDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8vIFRoZSBjdXJyZW50IHdvcmtiZW5jaCB3aW5kb3cuCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8vIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvYmplY3QuCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbkFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBudWxsOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCXdvcmtiZW5jaCA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKTsKLQkJfQotCQlpZiAod29ya2JlbmNoID09IG51bGwpIHsKLQkJCXdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTmV3Q29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgTmV3Q29uZmlndXJhdGlvbldpemFyZCgpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXdpemFyZC5pbml0KHdvcmtiZW5jaCwgbnVsbCk7Ci0JCQl9Ci0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuQ29uZmlnV2l6YXJkRXJyb3JfbXNnLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnRlcm5hbEVycm9yX3JlYXNvbiwgIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1Njc5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3UGx1Z2luQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgYW5kIGNyZWF0ZXMgYSBuZXcgcGx1Zy1pbiB3aGVuIHRoZQotICogdXNlciBzZWxlY3RzIHRoZSBGaW5pc2ggYnV0dG9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cwotCQlJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gVGhlIGNhY2hlZCB3aW5kb3cgb2JqZWN0LgotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQbHVnaW5BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3UGx1Z2luQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCU1ldGhvZExpYnJhcnkgdGFyZ2V0TGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAodGFyZ2V0TGliID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlFcnJvcl9tc2cpOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkodGFyZ2V0TGliLCBzaGVsbCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvciwgCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IHdpbmRvdyAhPSBudWxsID8gKHdpbmRvdy5nZXRXb3JrYmVuY2goKSA9PSBudWxsID8gUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCTogd2luZG93LmdldFdvcmtiZW5jaCgpKQotCQkJCTogUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlleGVjdXRlKHdvcmtiZW5jaCwgbnVsbCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgd29ya2JlbmNoLgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlOZXdQbHVnaW5XaXphcmQgd2l6YXJkID0gbmV3IE5ld1BsdWdpbldpemFyZCgpOwotCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiB8fCBzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCX0KLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKCFQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA1MzZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuQ2hlYXRzaGVldFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLnZpZXdzLkNoZWF0U2hlZXRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbjsKLQotLyoqCi0gKiBPcGVuIGNoZWF0IHNoZWV0IHZpZXcKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5DaGVhdHNoZWV0VmlldyBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElJbnRyb0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPcGVuQ2hlYXRzaGVldFZpZXcoKSB7Ci0JCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk9wZW5DaGVhdHNoZWV0Vmlld190aXRsZSk7IAotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbiNydW4ob3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZSwgamF2YS51dGlsLlByb3BlcnRpZXMpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElJbnRyb1NpdGUgc2l0ZSwgUHJvcGVydGllcyBwYXJhbXMpIHsKLQkJU3RyaW5nIGNoZWF0c2hlZXRfaWQgPSBwYXJhbXMuZ2V0UHJvcGVydHkoImlucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRvZ2dsZV9zdHIgPSBwYXJhbXMuZ2V0UHJvcGVydHkoInRvZ2dsZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIElORk86IGNoZWF0c2hlZXQgaWQgPSAiICsgY2hlYXRzaGVldF9pZCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cKLQkJaWYgKHRvZ2dsZV9zdHIgIT0gbnVsbCAmJiB0b2dnbGVfc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0b2dnbGVBY3RpdmVWaWV3KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gQ2hlYXRTaGVldFZpZXcgb2JqID0gbmV3IENoZWF0U2hlZXRWaWV3KCk7Ci0JCQlhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNob3dWaWV3KAotCQkJCQkib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMudmlld3MuQ2hlYXRTaGVldFZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJQ2hlYXRTaGVldFZpZXcgY3NWaWV3ID0gKENoZWF0U2hlZXRWaWV3KSBhY3RpdmVXaW5kb3cKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQljc1ZpZXcuc2V0SW5wdXQoY2hlYXRzaGVldF9pZCk7Ci0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhwKSB7Ci0JCQkvLyAkJCQgZXJyb3IgaGFuZGxpbmcgaGVyZS4KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIGFjdGl2ZSB2aWV3Ci0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlQWN0aXZlVmlldygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cgb3IgYW55IGFjdGl2ZQotCQkvLyB2aWV3Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFdvcmtiZW5jaFBhZ2UpIHsKLQkJCQkvL1dvcmtiZW5jaFBhZ2UgcmVhbFBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgcGFnZTsKLQotCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYgPSBwYWdlLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKTsKLQotCQkJCWlmIChwYXJ0UmVmICE9IG51bGwpIHsKLQkJCQkJKChXb3JrYmVuY2hQYWdlKSBwYWdlKS50b2dnbGVab29tKHBhcnRSZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MmI0ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotCi0vKioKLSAqIE9wZW4gYSBtZXRob2QgZWxlbWVudCBlZGl0b3IgZGVsZWdhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIENvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmlidXRvclNlbGVjdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIE9wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbnRyaWJ1dG9yU2VsZWN0b3IgPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRhcmdldFBhcnQgPSAiICsgdGFyZ2V0UGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uVmlldykgewotCQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGNvbnRyaWJ1dG9yU2VsZWN0b3IKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA8IDEpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyYzRiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIE9wZW4gbWV0aG9kIGVsZW1lbnQgZWRpdG9yIGRlbGVnYXRpb24gYWN0aW9uIAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcwotCQlCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJdGhpcygKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDApOyAKLQl9Ci0KLQlwcm90ZWN0ZWQgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZShTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCA2OiAiICsgZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCS8vIGlmICghUGVyc3BlY3RpdmVMaXN0VWl0bC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkgfHwKLQkJLy8gc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlTWVudSA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCQllbmFibGVNZW51ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVNZW51KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTRmNjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogVXBkYXRlIHN1cHByZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gYmFzZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGNsYXNzIE91dGRlbnRBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE91dGRlbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBBREFQVEVSX0ZBQ1RPUklFUyA9IHsKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQl9OwotCQkKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzOwotCQlwcml2YXRlIFNldCBtb2RpZmllZFJlc291cmNlczsKLQkJcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0JCXByaXZhdGUgQWN0aXZpdHkgb2xkUGFyZW50OwotCQlwcml2YXRlIEFjdGl2aXR5IG5ld1BhcmVudDsKLQkJcHJpdmF0ZSBpbnQgb2xkSW5kZXg7Ci0JCXByaXZhdGUgaW50IG5ld0luZGV4OwotCQlwcml2YXRlIExpc3Q8T2JqZWN0PiBuZXdDaGlsZHJlbjsKLQotCQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCXB1YmxpYyBPdXRkZW50Q29tbWFuZChDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGNvbGxlY3Rpb24sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQl0aGlzLmVsZW1lbnRzID0gY29sbGVjdGlvbjsKLQkJCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJCXNldExhYmVsKExBQkVMKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZihuZXdDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJbmV3Q2hpbGRyZW4uY2xlYXIoKTsKLQkJCQluZXdDaGlsZHJlbiA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCVByb2Nlc3MgcHJvYyA9IG51bGw7Ci0JCQkJZm9yIChJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PiBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgcHJvYyA9PSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJCQl9Ci0JCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gcHJvYy5lUmVzb3VyY2UoKTsKLQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocHJvYy5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJZWxlbWVudCA9IGVsZW1lbnRzLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJb2xkUGFyZW50ID0gZWxlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCWlmKG9sZFBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJb2xkSW5kZXggPSBvbGRQYXJlbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGVsZW1lbnQpOwotCQkJTWFwPExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4gY2hpbGRyZW5Ub1N0YXJ0SW5kZXhNYXAgPSBuZXcgSGFzaE1hcDxMaXN0PE9iamVjdD4sIEludGVnZXI+KCk7Ci0JCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXM7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhZGFwdGVyRmFjdG9yaWVzID0gQURBUFRFUl9GQUNUT1JJRVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQlhZGFwdGVyRmFjdG9yeQkKLQkJCQl9OwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9sZFBhcmVudCwgCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihpcC5nZXRDaGlsZHJlbihvbGRQYXJlbnQpKTsKLQkJCQlpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGVsZW1lbnQpOwotCQkJCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQkJCWludCBuZXdDaGlsZHJlbkZyb21JbmRleCA9IGluZGV4ICsgMTsKLQkJCQlpZihuZXdDaGlsZHJlbkZyb21JbmRleCA8IHNpemUpIHsKLQkJCQkJZm9yKGludCBqID0gbmV3Q2hpbGRyZW5Gcm9tSW5kZXg7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChqKTsKLQkJCQkJCWlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGNoaWxkKSkgewotCQkJCQkJCS8vIGNhbm5vdCBvdXRkZW50IGFjdGl2aXR5IHRoYXQgaGF2ZSBpbmhlcml0ZWQgc2libGluZyBiZWxvdyBpdAotCQkJCQkJCS8vCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNoaWxkcmVuVG9TdGFydEluZGV4TWFwLnB1dChjaGlsZHJlbiwgSW50ZWdlci52YWx1ZU9mKG5ld0NoaWxkcmVuRnJvbUluZGV4KSk7Ci0JCQkJfQotCQkJfQotCQkJaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpICYmICFjaGlsZHJlblRvU3RhcnRJbmRleE1hcC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQluZXdQYXJlbnQgPSBvbGRQYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZihuZXdQYXJlbnQgIT0gbnVsbCkgewotCQkJCW5ld0luZGV4ID0gbmV3UGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihvbGRQYXJlbnQpICsgMTsKLQkJCQlpZighY2hpbGRyZW5Ub1N0YXJ0SW5kZXhNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCW5ld0NoaWxkcmVuID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4+IGl0ZXIgPSBjaGlsZHJlblRvU3RhcnRJbmRleE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5PExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCQkJCUxpc3QgY2hpbGRyZW4gPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCW5ld0NoaWxkcmVuLmFkZEFsbChjaGlsZHJlbi5zdWJMaXN0KGVudHJ5LmdldFZhbHVlKCkuaW50VmFsdWUoKSwgY2hpbGRyZW4uc2l6ZSgpKSk7Ci0JCQkJCX0KLQkJCQkJaWYoIURlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCwgbmV3Q2hpbGRyZW4sIHRydWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQobmV3UGFyZW50LCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWxlbWVudCksIHRydWUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCW5ld1BhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChuZXdJbmRleCwgZWxlbWVudCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG5ld1BhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpZWxlbWVudC5lQ29udGFpbmVyKCkpOwotCi0JCQkJaWYobmV3Q2hpbGRyZW4gIT0gbnVsbCkgewotLy8JCQkJCSgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3Q2hpbGRyZW4pOwkJCQotCQkJCQkvLyBtb3ZlIHRoZSBwcm9jZXNzIHBhY2FrZ2Ugb2YgdGhlIGFjdGl2aXR5IHRvIG5ldyBwYXJlbnQgcGFja2FnZQotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCQkJCQkoKEFjdGl2aXR5KWVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKChCcmVha2Rvd25FbGVtZW50KSBjaGlsZCk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpKChBY3Rpdml0eSljaGlsZCkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJb2xkUGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKG9sZEluZGV4LCBlbGVtZW50KTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgb2xkUGFyZW50LmVDb250YWluZXIoKTsKLQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSllbGVtZW50LmVDb250YWluZXIoKSk7Ci0JCQkJaWYobmV3Q2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQkoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdDaGlsZHJlbik7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpKChBY3Rpdml0eSljaGlsZCkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX091dGRlbnQ7Ci0KLQlwcml2YXRlIFByb2Nlc3NFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIE91dGRlbnRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIobnVsbCwgdGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPdXRkZW50QWN0aW9uKCkgewotCQl0aGlzKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX09VVERFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoTEFCRUwpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHN1cHBvcnQgaW5kZW50IG9ubHkgb25lIGFjdGl2aXR5IGZvciBub3cKLQkJLy8KLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3QgZSA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldCA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQocmV0KTsKLQkJcmV0dXJuIHJldDsKLQkJCi0JCS8vVE9ETzogc3VwcG9ydCBpbmRlbnQgbXVsdGlwbGUgYWN0aXZpdGllcyBpbiBzZWxlY3Rpb24KLS8vCQlBcnJheUxpc3Q8QWN0aXZpdHk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLS8vCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlsaXN0LmFkZCgoQWN0aXZpdHkpIGVsZW1lbnQpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZihkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCXJldHVybiBuZXcgT3V0ZGVudENvbW1hbmQoc2VsZWN0aW9uLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHdvcmtiZW5jaFBhcnQ7Ci0JCX0JCQotCQllbHNlIGlmKHdvcmtiZW5jaFBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzdXBlclJ1bigpOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDg1NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuU3luY2hyb25pemVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0KLS8qKgotICogRGVmYXVsdCBTeW5jaHJvbml6ZSBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudHMuCi0gKiBTeW5jaHJvbml6YXRpb24gdGFrZXMgcGxhY2UgZnJvbSBtZXRob2QgdG8gcHJvY2VzcyBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24gZXh0ZW5kcyBDb21tYW5kQWN0aW9uSGFuZGxlciAKLWltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24KLXsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgYWN0aXZlV29ya2JlbmNoUGFydDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SdW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24oKSB7Ci0JCXN1cGVyKG51bGwsIExpYnJhcnlFZGl0UmVzb3VyY2VzLkF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggbGFiZWwgdGV4dAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJc3VwZXIobnVsbCwgbGFiZWxUZXh0KTsgCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWFjdGl2ZVdvcmtiZW5jaFBhcnQgPSB3b3JrYmVuY2hQYXJ0OwotCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgd29ya2JlbmNoUGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplQ29tbWFuZChnZXRUZXh0KCksIHNlbGVjdGlvbikgewotCQkJLyoKLQkJCSAqIAotCQkJICogCi0JCQkgKiBAc2VlIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmQjZGVsZXRlKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQkJfQotCQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9jZXNzIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZihhY3RpdmVXb3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9ICgoSUVkaXRvclBhcnQpYWN0aXZlV29ya2JlbmNoUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KWUpLmdldFByb2Nlc3MoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIAotCQkJCQkmJiAhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkuaXNSZWFkT25seSgpKSB7Ci0JCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJCi0JCQkJCS8vIGRlc2NyaXB0b3IgbXVzdCBiZSBsaW5rZWQgYW5kIGlzIG5vdCBzdXBwcmVzc2VkCi0JCQkJCS8vCi0JCQkJCXZhbGlkID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYykgIT0gbnVsbCAmJiAhZGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGV4Y2x1ZGUgYnJlYWtkb3duIGVsZW1lbnQgd2l0aG91dCBhIHN1cGVyIGFjdGl2aXR5IGxpa2UgVGVhbVByb2ZpbGUncyBvd24gUm9sZURlc2NyaXB0b3IKLQkJCQkJLy8KLQkJCQkJaWYgKCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSAKLQkJCQkJewotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgKChQcm9jZXNzKWVsZW1lbnQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWxpZCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZih2YWxpZCkgewotCQkJCXNlbGVjdGVkLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotCX0KLQotCi0gICAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQljYW5SdW4gPSAoKFN5bmNocm9uaXplQ29tbWFuZCkgY29tbWFuZCkuaW5pdGlsaXplKCk7Ci0JCQl9Ci0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZSk7IAotCi0JCWlmIChjYW5SdW4pIHsKLQkJCXN1cGVyLnJ1bigpOwotCQkJLy8gaWYoKChBdXRvU3luY2hyb25pemVDb21tYW5kKWNvbW1hbmQpLmlzU3VjZXNzZnVsKCkpIHsKLQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbyhnZXRUZXh0KCksCi0JCQkvLyAiU3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0JCQkvLwkJCQkKLQkJCS8vIH0KLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQlnZXRUZXh0KCksCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoKTsgCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZWFzc2lnbkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlYXNzaWduQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODlmN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlYXNzaWduQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkFzc2lnbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBSZWFzc2lnbiBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgIDEuNQotICovCi1wdWJsaWMgY2xhc3MgUmVhc3NpZ25BY3Rpb24gZXh0ZW5kcyBBc3NpZ25BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIFJlYXNzaWduQWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIobGliVmlldyk7Ci0JCXNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVhc3NpZ25BY3Rpb25fdGV4dCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvUnVuKCkgewkJCi0JCWlmICghY2hlY2tNb2RpZnkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmRvUnVuKCk7Ci0JfQotCQotCXByb3RlY3RlZCBBc3NpZ25EaWFsb2cgZ2V0RGlhbG9nKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJcmV0dXJuIEFzc2lnbkRpYWxvZy5uZXdSZWFzc2lnbkRpYWxvZyhnZXRMaWJyYXJ5VmlldygpLmdldFNpdGUoKS5nZXRTaGVsbCgpLCBlbGVtZW50cywKLQkJCQkoTWV0aG9kRWxlbWVudCkgZ2V0U2VsZWN0aW9uUGFyZW50T2JqZWN0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlZnJlc2hDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVmcmVzaENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDUxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVmcmVzaENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIFJlZnJlc2ggQ29uZmlndXJhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uVmlldyB0YXJnZXRWaWV3OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJdGFyZ2V0VmlldyA9IChDb25maWd1cmF0aW9uVmlldykgdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRhcmdldFZpZXcucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjZDUzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBSZW5hbWVzIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lQWN0aW9uX3RleHQ7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBSZW5hbWVBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIobnVsbCwgdGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBSZW5hbWVBY3Rpb24oKSB7Ci0JCXRoaXMoTEFCRUwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWxlY3RlZCBtZXRob2QgZWxlbWVudHMgY2FuIGJlCi0JICogcmVuYW1lZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVuYW1lKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoIShkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHx8IHNlbGVjdGlvbi5zaXplKCkgPiAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTmFtZWRFbGVtZW50Ci0JCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYoY2FuUmVuYW1lKHNlbGVjdGlvbikpIHsKLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJcmV0ID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCX0KLQkJc2V0RW5hYmxlZChyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAoc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJaWYobyBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJcmV0dXJuIG5ldyBSZW5hbWVDb21tYW5kKChOYW1lZEVsZW1lbnQpIG8sIG51bGwpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlhY3RpdmVQYXJ0ID0gd29ya2JlbmNoUGFydDsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJZmluYWwgTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBUbmdVdGlsLnVud3JhcChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotLy8JCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLS8vCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0vLwkJCW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShlLmVSZXNvdXJjZSgpKTsKLS8vCQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0vLwkJCQlSZXBvc2l0b3J5UHJvdmlkZXIgcHJvdmlkZXIgPSBSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIoZmlsZS5nZXRQcm9qZWN0KCkpOwotLy8JCQkJaWYocHJvdmlkZXIgIT0gbnVsbCkgewotLy8JCQkJCUlGaWxlSGlzdG9yeVByb3ZpZGVyIGhpc3RvcnlQcm92aWRlciA9IHByb3ZpZGVyLmdldEZpbGVIaXN0b3J5UHJvdmlkZXIoKTsKLS8vCQkJCQlGaWxlTW9kaWZpY2F0aW9uVmFsaWRhdG9yIG1vZFZhbGlkYXRvciA9IHByb3ZpZGVyLmdldEZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IyKCk7Ci0vLwkJCQkJU3RyaW5nIGlkID0gcHJvdmlkZXIuZ2V0SUQoKTsKLS8vCQkJCQlTdWJzY3JpYmVyIHN1YnNjcmliZXIgPSBwcm92aWRlci5nZXRTdWJzY3JpYmVyKCk7Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGlkKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQlTaGVsbCBzaGVsbCA9IGFjdGl2ZVBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQotCQkvLyBjaGVjayBpZiBjb250YWluZXIncyByZXNvdXJjZSBjYW4gYmUgbW9kaWZpZWQKLQkJLy8KLQkJaWYgKGUuZUNvbnRhaW5lcigpICE9IG51bGwKLQkJCQkmJiBlLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKSAhPSBlLmVSZXNvdXJjZSgpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLmVDb250YWluZXIoKSwgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ19yZW5hbWVFcnJvciwKLQkJCQkJCXN0YXR1cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkuY3JlYXRlTmFtZVZhbGlkYXRvcihlLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJSW5wdXRWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgSUlucHV0VmFsaWRhdG9yKCkgewotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLmdldFNpbXBsZUVycm9yTWVzc2FnZSh2YWxpZGF0b3IKLQkJCQkJCQkuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCi0JCWJvb2xlYW4gZ2V0SW5wdXQgPSB0cnVlOwotCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVfdGV4dCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXduYW1lX3RleHQsIGUuZ2V0TmFtZSgpLAotCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJd2hpbGUgKGdldElucHV0KSB7Ci0JCQlnZXRJbnB1dCA9IGZhbHNlOwotCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IGlucHV0RGxnLmdldFZhbHVlKCkudHJpbSgpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQluZXdOYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdOYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhlLmdldE5hbWUoKSkpIHsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQlTdHJpbmdbXSBjb25maWdOYW1lcyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKG5ld05hbWUuZXF1YWxzKGNvbmZpZ05hbWVzW2ldKSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCQkJCQluZXdOYW1lKSk7Ci0JCQkJCQkJCWdldElucHV0ID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChnZXRJbnB1dCA9PSB0cnVlKSB7Ci0JCQkJCQlpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lX3RleHQsCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld25hbWVfdGV4dCwgZQotCQkJCQkJCQkuZ2V0TmFtZSgpLCBpbnB1dFZhbGlkYXRvcik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZSwgKG5ldyBPYmplY3RbXSB7IGUuZ2V0TmFtZSgpLCBuZXdOYW1lIH0pKTsgCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsgCi0JCQkJCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIHRpdGxlLCBtc2cpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VNZXRob2RFZGl0b3JzRm9yUGx1Z2luRWxlbWVudHMoKE1ldGhvZFBsdWdpbillKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJUmVuYW1lQ29tbWFuZCByZW5hbWVDbWQgPSAoUmVuYW1lQ29tbWFuZCkgY29tbWFuZDsKLQkJCQkJcmVuYW1lQ21kLnNldE5ld05hbWUobmV3TmFtZSk7Ci0JCQkJCXJlbmFtZUNtZC5zZXRTaGVsbChzaGVsbCk7Ci0JCQkJCXN1cGVyLnJ1bigpOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVQYXJ0LmdldFNpdGUoKQotCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJCQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJCQlzdXBlclJ1bigpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRvUmVuYW1lKGZpbmFsIE5hbWVkRWxlbWVudCBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQluZXcgUmVuYW1lQ29tbWFuZChlLCBuZXdOYW1lKS5leGVjdXRlKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmFtZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewkJCi0JCXByaXZhdGUgTmFtZWRFbGVtZW50IGU7Ci0JCXByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIG9sZE5hbWU7Ci0JCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlbmFtZWRSZXNvdXJjZXM7Ci0JCQotCQlwdWJsaWMgUmVuYW1lQ29tbWFuZChOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMuZSA9IGU7Ci0JCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotCQl9CQkKLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCByb2xsYmFjaygpIHsKLQkJCS8vIHJlc3RvcmUgb2xkIG5hbWUKLQkJCS8vCi0JCQlzZXROYW1lKG9sZE5hbWUpOwotCQkJCi0JCQkvLyByZXN0b3JlIG9sZCBsb2NhdGlvbgotCQkJLy8KLQkJCWlmKCFyZW5hbWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCWFkanVzdExvY2F0aW9uKHJlbmFtZWRSZXNvdXJjZXMsIG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCkpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaGFuZGxlUGVyc2lzdGVuY2VFeGNlcHRpb24oRXhjZXB0aW9uIGUxKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZTEpOwotCi0JCQlTdHJpbmcgZGV0YWlscyA9IGUxLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KCI6IHswfSIsIG5ldyBPYmplY3RbXSB7IGUxLmdldE1lc3NhZ2UoKSB9KSA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X2Vycl9zYXZpbmcsCi0JCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSwKLQkJCQkJCQlkZXRhaWxzIH0pOwotCQkJdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24obXNnKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRQZXJzaXN0ZXJGb3IoZS5lUmVzb3VyY2UoKSkKLQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQWRqdXN0cyBsb2NhdGlvbiBvZiBhbGwgYWZmZWN0ZWQgcmVzb3VyY2VzLgotCQkgKiAKLQkJICogQHJldHVybiByZXNvdXJjZXMgd2hvc2UgbG9jYXRpb24gaGFzIGJlZW4gYWRqdXN0ZWQKLQkJICovCi0JCXByaXZhdGUgSVN0YXR1cyBhZGp1c3RMb2NhdGlvbihDb2xsZWN0aW9uPFJlc291cmNlPiByZW5hbWVkUmVzb3VyY2VzKSB7Ci0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb1JlbmFtZSA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCSYmIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKChNZXRob2RFbGVtZW50KSBlKSkgewotCQkJCXJlc291cmNlc1RvUmVuYW1lLmFkZCgoKENvbnRlbnRFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCXJlc291cmNlc1RvUmVuYW1lLmFkZChlLmVSZXNvdXJjZSgpKTsKLQkJCXJldHVybiBhZGp1c3RMb2NhdGlvbihyZXNvdXJjZXNUb1JlbmFtZSwgcmVuYW1lZFJlc291cmNlcyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBBZGp1c3RzIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VzLgotCQkgKiAKLQkJICogQHJldHVybiByZXNvdXJjZXMgd2hvc2UgbG9jYXRpb24gaGFzIGJlZW4gYWRqdXN0ZWQKLQkJICovCi0JCXByaXZhdGUgSVN0YXR1cyBhZGp1c3RMb2NhdGlvbihDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb1JlbmFtZSwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVuYW1lZFJlc291cmNlcykgewotCQkJRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldFBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzVG9SZW5hbWUpIHsKLQkJCQkJVVJJIG9sZFVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UpOwotCQkJCQlpZighcmVzb3VyY2UuZ2V0VVJJKCkuZXF1YWxzKG9sZFVSSSkpIHsKLQkJCQkJCXJlbmFtZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZXgpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCWUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQkJCi0JCQotCQlwcml2YXRlIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJZS5zZXROYW1lKG5ld05hbWUpOwotCQkJCi0JCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBQcm9jZXNzQ29tcG9uZW50IHRvIGtlZXAgaXRzCi0JCQkvLyBuYW1lIGFuZCB0aGUgbmFtZSBvZiBpdHMgcHJvY2VzcyBpbiBzeW5jLgotCQkJaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlKS5nZXRQcm9jZXNzKCk7Ci0JCQkJcHJvYy5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCW9sZE5hbWUgPSBlLmdldE5hbWUoKTsJCQkKLQkJCXNldE5hbWUobmV3TmFtZSk7Ci0JCQkKLQkJCXJlbmFtZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JCQkvLyByZW5hbWUgZmlsZShzKQotCQkJLy8KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gYWRqdXN0TG9jYXRpb24ocmVuYW1lZFJlc291cmNlcyk7Ci0JCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlyb2xsYmFjaygpOwotCQkJCQkJRXhjZXB0aW9uIGV4ID0gKEV4Y2VwdGlvbikgc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQkJCQkJdGhyb3cgZXggaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uID8gKFJ1bnRpbWVFeGNlcHRpb24pIGV4IDogbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCi0JCQl9OwotCQkKLQkJCWJvb2xlYW4gcmVzdWx0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQpOwotCQkJaWYoIXJlc3VsdCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoZSwgCi0JCQkJCXNoZWxsID09IG51bGwgPyBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkgOiBzaGVsbCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yLAotCQkJCQkJc3RhdHVzKTsKLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlyb2xsYmFjaygpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0sICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gU2F2ZSB0aGUgbW9kaWZpZWQgZmlsZShzKS4KLQkJCS8vCi0JCQlydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFNhdmUgdGhlIG1vZGlmaWVkIGZpbGUocykuCi0JCQkJCS8vCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUoZS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwkJCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsJCQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWhhbmRsZVBlcnNpc3RlbmNlRXhjZXB0aW9uKGUxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJvbGxiYWNrKCk7CQkJCQkJCi0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBjaGFuZ2UgZGlhZ3JhbSByZXNvdXJjZSBhcyB3ZWxsCi0JCQkJCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlKS5nZXRQcm9jZXNzKCk7CQotCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW1nci51cGRhdGVSZXNvdXJjZVVSSSgpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQl0cnkgeyAKLQkJCQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQotCQkJfTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZSA9IG51bGw7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU2F2ZVRoaXNBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZmMDlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotCi0vKioKLSAqIEFjdGlvbiBmb3Igc2F2aW5nIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVRoaXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgc2VsZWN0ZWRPYmplY3RzOwotCi0JcHVibGljIFNhdmVUaGlzQWN0aW9uKCkgewotCQlzdXBlcihBdXRob3JpbmdVSVJlc291cmNlcy5TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0KTsgCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAJCQlTZWxlY3Rpb24KLQkgKiBAcmV0dXJuIAotCSAqIAkJCWJvb2xlYW4gdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciB1cGRhdGUgd2FzIGRvbmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJc2VsZWN0ZWRPYmplY3RzLmFkZChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4udW53cmFwKG9iamVjdHMKLQkJCQkJLm5leHQoKSkpOwotCQl9Ci0KLQkJcmV0dXJuIHNlbGVjdGVkT2JqZWN0cy5zaXplKCkgPT0gMQotCQkJCSYmIHNlbGVjdGVkT2JqZWN0cy5nZXQoMCkgaW5zdGFuY2VvZiBFT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChzZWxlY3RlZE9iamVjdHMgPT0gbnVsbCB8fCBzZWxlY3RlZE9iamVjdHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQlTV1QuU0FWRSk7Ci0JCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHRvIHBlcnNpc3QgdGhlIG1vZGVsLgotCQlSZXNvdXJjZSByZXMgPSBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpLmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQlPYmplY3Qgb2JqID0gc2VsZWN0ZWRPYmplY3RzLmdldCgwKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KSBvYmopOwotCQl0cnkgewotCQkJcmVzLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dQcmVzZW50YXRpb25OYW1lcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dQcmVzZW50YXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGNmNTE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93UHJlc2VudGF0aW9uTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBTaG93IFByZXNlbnRhdGlvbiBuYW1lcyBpbiBsaWJyYXJ5IHZpZXcKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2hvd1ByZXNlbnRhdGlvbk5hbWVzIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQl0YXJnZXRWaWV3ID0gKExpYnJhcnlWaWV3KSB2aWV3OwotCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0Uuc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWVzKCFQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpOwotCQl0YXJnZXRWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TeW5jaHJvbml6YXRpb25BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TeW5jaHJvbml6YXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2NTViZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU3luY2hyb25pemF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TeW5jaHJvbml6YXRpb25DaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TeW5jaHJvbml6YXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5TeW5jaHJvbml6ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFN5bmNocm9uaXphaXRvbiBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudHMuIFN5bmNocm9uaXphdGlvbiB0YWtlcyBwbGFjZSBmcm9tIG1ldGhvZAotICogZWxlbWVudCB0byBwcm9jZXNzIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25BY3Rpb24gZXh0ZW5kcyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uIAotaW1wbGVtZW50cyBJV29ya2JlbmNoUGFydEFjdGlvbgotewotCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uQWN0aW9uKCkgewotCQlzdXBlcihMaWJyYXJ5RWRpdFJlc291cmNlcy5NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQl9Ci0JCi0JLyoKLQkgKiBTZXQgUHJvY2VzcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3MoUHJvY2VzcyBhUHJvY2VzcykgewotCQl0aGlzLnNlbGVjdGVkUHJvY2VzcyA9IGFQcm9jZXNzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMgPSBuZXcgU3luY2hyb25pemF0aW9uQ2hvaWNlcygpOwotCQkJCWNob2ljZXMuc2V0U2VsZWN0ZWRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJCi0JCQkJLy8gSW5zdGFudGlhdGUgYW5kIGluaXRpYWxpemUgdGhlIHdpemFyZC4KLQkJCQlTeW5jaHJvbml6YXRpb25XaXphcmQgd2l6YXJkID0gbmV3IFN5bmNocm9uaXphdGlvbldpemFyZChjaG9pY2VzKTsKLQotCQkJCS8vIEluc3RhbnRpYXRlIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbiBpdC4KLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLQkJCQkJCQkJCQkJd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsJCi0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogIiArIGNob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJaWYgKCFjaG9pY2VzLmlzRmluaXNoUHJlc3NlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJLy8gU2V0IHN5bmNoRmVhdHVyZXMgJ3N5bmNGZWF0dXJlU2V0JwotCQkJCUhhc2hTZXQgc3luY0ZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCWFkZENob2ljZXNUb1NldChzeW5jRmVhdHVyZVNldCwgY2hvaWNlcyk7Ci0JCQkJLy8gTWV0aG9kIGNvbmZpZyBjYW4gYmUgb2J0YWluZWQgYnkgJ2Nob2ljZXMuZ2V0U2VsZWN0ZWRDb25maWcoKScKLQkJCQkKLQkJCQlTeW5jaHJvbml6ZUNvbW1hbmQgY21kID0gKFN5bmNocm9uaXplQ29tbWFuZCljb21tYW5kOwotCQkJCWNtZC5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNob2ljZXMuZ2V0U2VsZWN0ZWRDb25maWcoKSk7Ci0JCQkJY21kLnNldFN5bmNocm9uaXphdGlvbkZlYXR1cmVzKHN5bmNGZWF0dXJlU2V0KTsKLQkJCQkKLQkJCQlzdXBlclJ1bigpOwotCQkJfQotCQl9KTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENob2ljZXNUb1NldChIYXNoU2V0IHN5bmNTZXQsIFN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlpZiAoY2hvaWNlcy5nZXRTeW5jTmFtZSgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1ByZXNOYW1lKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0JyaWVmRGVzYygpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNPcHRJbnB1dCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNNYW5JbnB1dCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jT3V0cHV0KCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jUHJpbVBlcmZvcm1lcigpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jQWRkblBlcmZvcm1lcigpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jUmVzcFJvbGUoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0NvbnRBcnRpZmFjdCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNEZWxpdlBhcnQoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jU2VsU3RlcCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jR3VpZGFuY2UoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKSB7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpOwotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSk7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpKTsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSk7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSk7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VuYXNzaWduQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVW5hc3NpZ25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkOWQ3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVW5hc3NpZ25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3U2ltcGxlQWN0aW9uLkN1c3RvbWVDYXRlZ29yeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFVuYXNzaWduIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbmFzc2lnbkFjdGlvbiBleHRlbmRzIEN1c3RvbWVDYXRlZ29yeUFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgVW5hc3NpZ25BY3Rpb24oTGlicmFyeVZpZXcgbGliVmlldykgewotCQlzdXBlcihsaWJWaWV3LCBBdXRob3JpbmdVSVJlc291cmNlcy51bmFzc2lnbkFjdGlvbl90ZXh0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9SdW4oKSB7Ci0JCWlmICghIGNoZWNrTW9kaWZ5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdWNlVG9TYXZlID0gZG9SdW5CZWZvcmVTYXZlKCk7Ci0JCXNhdmUocmVzb3VjZVRvU2F2ZSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRvIHNhdmUKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGRvUnVuQmVmb3JlU2F2ZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRMaWJyYXJ5VmlldygpLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCi0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQ7Ci0KLQkJRU9iamVjdCBjb250YWluZXIgPSBjYXRlZ29yeS5lQ29udGFpbmVyKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGNvbnRhaW5lciwKLQkJCQlnZXRMaWJyYXJ5VmlldygpLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfbW92ZUVycm9yLCBzdGF0dXMpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCU9iamVjdCBwYXJlbnQgPSBnZXRTZWxlY3Rpb25QYXJlbnRPYmplY3QoKTsKLQkJaWYgKCEgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50Q2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIHBhcmVudDsJCQkJCQkKLQkJdW5hc3NpZ24oZ2V0TGlicmFyeVZpZXcoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgZWxlbWVudCwgcGFyZW50Q2MsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudENjLmVSZXNvdXJjZSgpKTsKLQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuYXNzaWduKFNoZWxsIHNoZWxsLCBmaW5hbCBPYmplY3QgZWxlbWVudCwgZmluYWwgQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50Q2MsIGZpbmFsIEFycmF5TGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlmaW5hbCBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyKCk7Ci0JCWZpbmFsIEFycmF5TGlzdCBlbGVtZW50cyAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCi0JCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLnJlbW92ZUl0ZW1zRnJvbU1vZGVsMShlbGVtZW50cywgcGFyZW50Q2MsIHVzZWRDYXRlZ29yaWVzLAotCQkJCQkJaGVscGVyLmdldEFjdGlvbk1hbmFnZXIoKSwgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLmdldEFuY2VzdG9ycyhwYXJlbnRDYykpOwotCQkJfQotCQl9KTsKLQotCQkKLQkJCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2OTQ4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBVcGRhdGUgc3VwcHJlc3Npb24gaW5mb3JtYXRpb24gZnJvbSBiYXNlIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBQcm9jZXNzRWRpdG9yIGVkaXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbigpIHsKLQkJdGhpcyhBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWwpOyAKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihTdXBwcmVzc2lvbi5pc1ZhbGlkKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZihsaXN0LnNpemUoKSA9PSAxICYmIAotCQkJCVByb2Nlc3NVdGlsLmlzUm9sbGVkVXBEZXNjcmlwdG9yKGxpc3QuZ2V0KDApLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kKGdldFRleHQoKSwgc2VsZWN0aW9uLCBlZGl0b3IuZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWRpdG9yLmdldFN1cHByZXNzaW9uKCkpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQjZXhlY3V0ZSgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJCQotCQkJCWlmKCFnZXRBZmZlY3RlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCN1bmRvKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCQlzdXBlci51bmRvKCk7Ci0JCQkJCi0JCQkJaWYoIWdldEFmZmVjdGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJCQllZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWlmKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB7Ci0JCQlkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpd29ya2JlbmNoUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQl9Ci0JCWlmKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQllZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgd29ya2JlbmNoUGFydDsKLQkJfQkJCi0JCWVsc2UgaWYod29ya2JlbmNoUGFydCA9PSBudWxsKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN1cGVyUnVuKCk7Ci0JCQkJCX0KLQkJCQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNzk2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5FcnJvckRpYWxvZ05vUmVhc29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MuVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLlVzZXJJbnB1dHNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkRlbGVnYXRlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIGhhbmRsaW5nIG9mIHVzZXIgaW50ZXJhY3Rpb24gZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgSU1lc3NlbmdlciBtZXNzZW5nZXIgPSBuZXcgSU1lc3NlbmdlcigpIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZykgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQl0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLAotCQkJCWZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCQlzaG93RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCQkvLwotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1zZywgc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLAotCQkJCWZpbmFsIFN0cmluZyByZWFzb24sIGZpbmFsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZXhjZXB0aW9uKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQkJbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywKLQkJCQlmaW5hbCBTdHJpbmcgcmVhc29uKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbik7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dFcnJvcihmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJCQltc2cpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93SW5mbyhqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93SW5mbyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8odGl0bGUsIG1zZyk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCQkJbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd0Vycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywKLQkJCQlmaW5hbCBTdHJpbmcgcmVhc29uLCBmaW5hbCBTdHJpbmcgZGV0YWlscywKLQkJCQlmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsCi0JCQkJCQkJCQkJZXhjZXB0aW9uKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQkJbXNnLCByZWFzb24sIGRldGFpbHMsIGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwdWJsaWMgVXNlckludGVyYWN0aW9uSGFuZGxlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgdGhlIHNoZWxsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI2dldFVJQ29udGV4dCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVSUNvbnRleHQoKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI3NlbGVjdChqYXZhLnV0aWwuTGlzdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIGJvb2xlYW4sIGphdmEudXRpbC5MaXN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTGlzdCBzZWxlY3QoTGlzdCBvYmplY3RzVG9TZWxlY3QsIGZpbmFsIElJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkJYm9vbGVhbiBtdWx0aXBsZSwgTGlzdCBpbnRpdGlhbFNlbGVjdGlvbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCUlMYWJlbFByb3ZpZGVyIGxwID0gbmV3IERlbGVnYXRlTGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJaWYgKG11bHRpcGxlKSB7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQkJCVVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCXNoZWxsLCBvYmplY3RzVG9TZWxlY3QsIGNvbnRlbnRQcm92aWRlciwgbHAsIG1zZyk7Ci0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQkJCU9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvYmpzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCX0KLQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChvYmpzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJc2hlbGwsIGxwKTsKLQotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLnNldEVsZW1lbnRzKG9iamVjdHNUb1NlbGVjdC50b0FycmF5KCkpOwotCQkJZGxnLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLQkJCWRsZy5zZXRNZXNzYWdlKG1zZyk7Ci0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEZpbHRlcihudWxsKTsKLQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCU9iamVjdCBvYmogPSBkbGcuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iaik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI3NlbGVjdE9uZShpbnRbXSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBzZWxlY3RPbmUoaW50W10gYWN0aW9ucywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cykgewotCQlmaW5hbCBTdHJpbmdbXSBidXR0b25MYWJlbHMgPSBuZXcgU3RyaW5nW2FjdGlvbnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlidXR0b25MYWJlbHNbaV0gPSBnZXRBY3Rpb25UZXh0KGFjdGlvbnNbaV0pOwotCQl9Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNoZWxsID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlpbWFnZSA9IHNoZWxsLmdldEltYWdlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nIG1zZ0RsZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCB0aXRsZSwgaW1hZ2UsIG1zZywKLQkJCQkJTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgYnV0dG9uTGFiZWxzLCAwKTsKLQkJCWludCBpZCA9IG1zZ0RsZy5vcGVuKCk7Ci0JCQlyZXR1cm4gYWN0aW9uc1tpZF07Ci0JCX0gZWxzZSB7Ci0JCQlFcnJvckRpYWxvZ05vUmVhc29uIGRsZyA9IG5ldyBFcnJvckRpYWxvZ05vUmVhc29uKHNoZWxsLCB0aXRsZSwKLQkJCQkJbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcKLQkJCQkJCQl8IElTdGF0dXMuRVJST1IpIHsKLQotCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1dHRvbkxhYmVscy5sZW5ndGg7IGkrKykgewotCQkJCQkJU3RyaW5nIGxhYmVsID0gYnV0dG9uTGFiZWxzW2ldOwotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgaSwgbGFiZWwsIGkgPT0gMCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkpIHsKLQkJCQkJCWRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0JCQkJCQkJCUlEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLCBmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5FcnJvckRpYWxvZ05vUmVhc29uI2J1dHRvblByZXNzZWQoaW50KQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0JCQkJCWlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpIHsKLQkJCQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0UmV0dXJuQ29kZShpZCk7Ci0JCQkJCQljbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWludCBpZCA9IGRsZy5vcGVuKCk7Ci0JCQlyZXR1cm4gYWN0aW9uc1tpZF07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWN0aW9uIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24gdGV4dCAtIGVpdGhlciBBQk9SVCwgQ0FOQ0VMLCBPSywgUkVUUlkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25UZXh0KGludCBhY3Rpb24pIHsKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQUJPUlQ6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5BQk9SVF9MQUJFTDsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSzoKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9SRVRSWToKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLlJFVFJZX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVM6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUw7Ci0JCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUw7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI2dldE1lc3NlbmdlcigpCi0JICovCi0JcHVibGljIElNZXNzZW5nZXIgZ2V0TWVzc2VuZ2VyKCkgewotCQlyZXR1cm4gbWVzc2VuZ2VyOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjcmVxdWVzdElucHV0KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXF1ZXN0SW5wdXQoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBMaXN0IHVzZXJJbnB1dHMpIHsKLQkJaWYgKHVzZXJJbnB1dHMgPT0gbnVsbCB8fCB1c2VySW5wdXRzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJLy8KLQkJCWZpbmFsIGJvb2xlYW4gcmV0SG9sZGVyW10gPSBuZXcgYm9vbGVhblsxXTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcmV0SG9sZGVyWzBdID0gZG9SZXF1ZXN0SW5wdXQodGl0bGUsIG1zZywgdXNlcklucHV0cyk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCXJldHVybiByZXRIb2xkZXJbMF07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZG9SZXF1ZXN0SW5wdXQodGl0bGUsIG1zZywgdXNlcklucHV0cyk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkb1JlcXVlc3RJbnB1dChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIExpc3QgdXNlcklucHV0cykgewotCQlmaW5hbCBVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgdXNlcklucHV0cy5nZXQoMCk7Ci0JCWlmICh1c2VySW5wdXQuZ2V0Q29udGV4dCgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCkgewotCQkJTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCBjbWQgPSAoTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCkgdXNlcklucHV0Ci0JCQkJCS5nZXRDb250ZXh0KCk7Ci0JCQlpZiAoY21kLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSkgewotCQkJCU5ld0NvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gbmV3IE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKTsKLQkJCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQkJCQl3aXphcmQuc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbikgY21kLmdldENoaWxkKCkpOwotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCXVzZXJJbnB1dC5zZXRJbnB1dCh3aXphcmQuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLmdldE5hbWUoKSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYodXNlcklucHV0cy5zaXplKCkgPT0gMSAmJiB1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5URVhUICYmIHVzZXJJbnB1dC5nZXRMYWJlbCgpID09IG51bGwpIHsKLQkJCS8vIHVzZXIgSW5wdXREaWFsb2cgZm9yIHRoaXMgY2FzZSB1bnRpbCB3ZSBmaXggdGhpcyBkaWFsb2cgYm94Ci0JCQkvLwotCQkJSUlucHV0VmFsaWRhdG9yIHZhbGlkYXRvciA9IHVzZXJJbnB1dC5nZXRWYWxpZGF0b3IoKSAhPSBudWxsID8gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQotCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQlyZXR1cm4gdXNlcklucHV0LmdldFZhbGlkYXRvcigpLmlzVmFsaWQobmV3VGV4dCk7Ci0JCQkJfQotCQkJCi0JCQl9IDogbnVsbDsKLQkJCUlucHV0RGlhbG9nIGRsZyA9IG5ldyBJbnB1dERpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCXRpdGxlLCBtc2csIChTdHJpbmcpdXNlcklucHV0LmdldElucHV0KCksIHZhbGlkYXRvcik7Ci0JCQlpZihkbGcub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCXVzZXJJbnB1dC5zZXRJbnB1dChkbGcuZ2V0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVVzZXJJbnB1dHNEaWFsb2cgZGlhbG9nID0gbmV3IFVzZXJJbnB1dHNEaWFsb2coUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdXNlcklucHV0cywKLQkJCQl0aXRsZSwgbXNnKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZGlhbG9nLmdldFJlc3VsdCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE3ZGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBlZGl0aW5nIGFjdGlvbnMgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTdiYjI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UcmVlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBjaGVjayBib3ggY2VsbCBlZGl0b3IKLSAqIEBhdXRob3IgQW4gTWluZwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIHsKLQotCS8vIHRoZSBjZWxsIG1vZGlmaWVyCi0JcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gbnVsbDsKLQotCS8vIHRyZWUgZWRpdG9yCi0JcHJpdmF0ZSBUcmVlRWRpdG9yIHRyZWVFZGl0b3IgPSBudWxsOwotCi0JLy8gdGhlIHRyZWUKLQlwcml2YXRlIFRyZWUgdHJlZSA9IG51bGw7Ci0KLQkvLyB0aGUgY29udHJvbCBlZGl0b3IKLQlwcml2YXRlIENvbnRyb2wgY29udHJvbCA9IG51bGw7Ci0KLQkvLyB0aGUgY29sdW1uIGluZGV4Ci0JcHJpdmF0ZSBpbnQgY29sdW1uSW5kZXg7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdHJlZQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgdHJlZSkgewotCQl0aGlzLnRyZWUgPSAoVHJlZSkgdHJlZTsKLQkJdGhpcy50cmVlRWRpdG9yID0gbmV3IFRyZWVFZGl0b3IodGhpcy50cmVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCBjZWxsIG1vZGlmaWVyCi0JICogQHBhcmFtIG1vZGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY2VsbCBtb2RpZmllcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCUNlbGxNb2RpZmllcgotCSAqLwotCXByb3RlY3RlZCBJQ2VsbE1vZGlmaWVyIGdldENlbGxNb2RpZmllcigpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZpZXI7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb2RpZnkoVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KTsKLQotCS8qCi0JICogPT09PT09PWluIGZhY3QgYmVsb3cgY29kZXMgYXJlIGZvciB0aGUgZHluYW1pYyBjZWxsIGVkaXRvciAocmVhbCBjb250cm9sCi0JICogImJ1dHRvbiIpPT09PT0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JUbyhUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJaWYgKHRyZWVFZGl0b3IuZ2V0SXRlbSgpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQljb250cm9sID0gY3JlYXRlQ29udHJvbCh0cmVlKTsKLQkJaG9va0NvbnRyb2woY29udHJvbCwgaXRlbSwgY29sdW1ucHJvcGVydHkpOwotCi0JCXRyZWVFZGl0b3IubWluaW11bVdpZHRoID0gY29udHJvbC5nZXRTaXplKCkueDsKLQkJdHJlZUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJdHJlZUVkaXRvci5zZXRFZGl0b3IoY29udHJvbCwgaXRlbSwgY29sdW1uSW5kZXgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlRWRpdG9yRnJvbShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdHJlZUVkaXRvci5zZXRFZGl0b3IobnVsbCwgbnVsbCwgY29sdW1uSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRyb2woVHJlZSBwYXJlbnQpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sLCBUcmVlSXRlbSBpdGVtLAotCQkJU3RyaW5nIGNvbHVtbnByb3BlcnR5KTsKLQotCS8qKgotCSAqIEdldCBjb2x1bW4gaW5kZXgKLQkgKiBAcmV0dXJuCi0JICogCQlpbmRleAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoKSB7Ci0JCXJldHVybiBjb2x1bW5JbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgaW5kZXggZm9yIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4KGludCBjb2x1bW5JbmRleCkgewotCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL1Byb2Nlc3NDaGVja0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjZDQzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL1Byb2Nlc3NDaGVja0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBDaGVjayBCb3ggY2VsbCBlZGl0b3IgZm9yIHByb2Nlc3MgZm9ybSBwYWdlLCBXQlMsIFRBLCBXUFUKLSAqIAotICogQGF1dGhvciBBbiBNaW5nCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvciBleHRlbmRzIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIHsKLQkKLQkvLyBjaGVja2JveCBpbWFnZXMKLQlwcml2YXRlIGZpbmFsIEltYWdlIGNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkiZnVsbC9vYmoxNi9DaGVjay5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSB1bmNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkiZnVsbC9vYmoxNi9VbmNoZWNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIEltYWdlIGRpc2FibGVDaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkiZnVsbC9vYmoxNi9EaXNhYmxlQ2hlY2suZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGZpbmFsIEltYWdlIGRpc2FibGVVbmNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCSJmdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHRyZWUKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgdHJlZSkgewotCQlzdXBlcih0cmVlKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjZ2V0SW1hZ2Uob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQlmaW5hbCBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gZ2V0Q2VsbE1vZGlmaWVyKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gaXRlbS5nZXREYXRhKCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLS8vCQlpZiAoY29sdW1ucHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HCi0vLwkJCQl8fCBjb2x1bW5wcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUKLS8vCQkJCXx8IGNvbHVtbnByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0vLwkJCWlmICghKFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpKSB7Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJfQotLy8JCX0KLQkJT2JqZWN0IHZhbHVlID0gbW9kaWZpZXIuZ2V0VmFsdWUoZWxlbWVudCwgY29sdW1ucHJvcGVydHkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCAhKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSBtb2RpZmllci5jYW5Nb2RpZnkoZWxlbWVudCwgY29sdW1ucHJvcGVydHkpOwotCi0JCWlmICgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIGNhbk1vZGlmeSA/IGNoZWNrSW1hZ2UgOiBkaXNhYmxlQ2hlY2tJbWFnZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBjYW5Nb2RpZnkgPyB1bmNoZWNrSW1hZ2UgOiBkaXNhYmxlVW5jaGVja0ltYWdlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNtb2RpZnkob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5KFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQlmaW5hbCBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gZ2V0Q2VsbE1vZGlmaWVyKCk7Ci0JCWlmICghbW9kaWZpZXIuY2FuTW9kaWZ5KGl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW5wcm9wZXJ0eSkpCi0JCQlyZXR1cm47Ci0JCW1vZGlmaWVyLm1vZGlmeShpdGVtLCBjb2x1bW5wcm9wZXJ0eSwgbmV3IEJvb2xlYW4oISgoQm9vbGVhbikgbW9kaWZpZXIKLQkJCQkuZ2V0VmFsdWUoaXRlbS5nZXREYXRhKCksIGNvbHVtbnByb3BlcnR5KSkuYm9vbGVhblZhbHVlKCkpKTsKLQl9Ci0KLQkvKgotCSAqID09PT09PT1pbiBmYWN0IGJlbG93IGNvZGVzIGFyZSBmb3IgdGhlIGR5bmFtaWMgY2VsbCBlZGl0b3IgKHJlYWwgY29udHJvbAotCSAqICJidXR0b24iKT09PT09Ci0JICovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChUcmVlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5wYWNrKCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNob29rQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbChDb250cm9sIGNvbnRyb2wsIFRyZWVJdGVtIGl0ZW0sCi0JCQlmaW5hbCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJZmluYWwgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IGdldENlbGxNb2RpZmllcigpOwotCQlmaW5hbCBPYmplY3QgZWxlbWVudCA9IGl0ZW07Ci0JCWZpbmFsIEJ1dHRvbiBjaGVja2JveCA9IChCdXR0b24pIGNvbnRyb2w7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJY2hlY2tib3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGlmaWVyLm1vZGlmeShlbGVtZW50LCBjb2x1bW5wcm9wZXJ0eSwgbmV3IEJvb2xlYW4oY2hlY2tib3gKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9OwotCQljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NoZWF0c2hlZXRTd2l0Y2hKb2IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DaGVhdHNoZWV0U3dpdGNoSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTk4ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NoZWF0c2hlZXRTd2l0Y2hKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuT3BlbkNoZWF0U2hlZXRBY3Rpb247Ci0KLS8qKgotICogU3dpdGNocyBjaGVhdCBzaGVldCBhbmQgb3BlbnMgaXQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENoZWF0c2hlZXRTd2l0Y2hKb2IgZXh0ZW5kcyBKb2IgewotCXByaXZhdGUgU3RyaW5nIGNoZWF0c2hlZXRJZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIGNoZWF0IHNoZWV0IG5hbWUgYW5kIElkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gY2hlYXRzaGVldElkCi0JICovCi0JcHVibGljIENoZWF0c2hlZXRTd2l0Y2hKb2IoU3RyaW5nIG5hbWUsIFN0cmluZyBjaGVhdHNoZWV0SWQpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuY2hlYXRzaGVldElkID0gY2hlYXRzaGVldElkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbmV3IE9wZW5DaGVhdFNoZWV0QWN0aW9uKGNoZWF0c2hlZXRJZCkucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Nzg3OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NyZWF0ZVBsdWdpbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld1BsdWdpbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRNYW5hZ2VyOwotCi0vKioKLSAqIENyZWF0ZSBNZXRob2QgUGx1Zy1pbiBjaGVhdCBzaGVldCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUGx1Z2luQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUNoZWF0U2hlZXRBY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBJQ2hlYXRTaGVldEFjdGlvbiNydW4oU3RyaW5nW10sIElDaGVhdFNoZWV0TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gcGFyYW1zLCBJQ2hlYXRTaGVldE1hbmFnZXIgbWFuYWdlcikgewotCQlOZXdQbHVnaW5BY3Rpb24uZXhlY3V0ZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxMzVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvU3dpdGNoQ2hlYXRzaGVldFRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0TWFuYWdlcjsKLQotLyoqCi0gKiBDcmVhdGUgc3dpdGNoIGNoZWF0IHNoZWV0IGFjdGlvbgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2l0Y2hDaGVhdHNoZWV0VG8gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQ2hlYXRTaGVldEFjdGlvbiB7Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0QWN0aW9uI3J1bihqYXZhLmxhbmcuU3RyaW5nW10sIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gcGFyYW1zLCBJQ2hlYXRTaGVldE1hbmFnZXIgbWFuYWdlcikgewotCi0JCWlmIChwYXJhbXMubGVuZ3RoIDw9IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGNzX2lkID0gcGFyYW1zWzBdOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBpbiBTd2l0Y2hDaGVhdHNoZWV0VG8ucnVuKC4uLikgY3NfSUQgPQotCQkvLyAiICsgY3NfaWQpOyAvLyROT04tTkxTLTEkCi0KLQkJQ2hlYXRzaGVldFN3aXRjaEpvYiBzd2l0Y2hKb2IgPSBuZXcgQ2hlYXRzaGVldFN3aXRjaEpvYigKLQkJCQkiU3dpdGNoIENoZWF0c2hlZXQiLCBjc19pZCk7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoSm9iLnNjaGVkdWxlKDUwKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU5YWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY3Rpb25zIGZvciB0aGUgQXV0aG9yaW5nIGNoZWF0c2hlZXRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BRERJbmZvRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQURESW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTAyMTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BRERJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEZpbHRlciBEaWFsb2cgLSBhbGxvdyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIGNvbnRlbnQgZWxlbWVudCwgY29udGVudAotICogY2F0ZWdvcmllcywgY3VzdG9tIGNhdGVnb3JpZXMsIEFsbCB0eXBlcyBvZiBjb250ZW50ZWxlbWVudHMgYmFzZWQgb24gbG9jYXRpb24gb2YgdGhlIHVzZSBvZiB0aGUgZmlsdGVyCi0gKiBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgQURESW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElEb3VibGVDbGlja0xpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b24sIGNhbmNlbEJ1dHRvbjsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQotCS8vcHJpdmF0ZSBTdHJpbmcgcGF0dGVybiwgZmlsdGVyVHlwZVN0cjsKLQotCS8vcHJvdGVjdGVkIENvbWJvIGZpbHRlclR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSwgdGFiU3RyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmlld2VyTGFiZWwgPSBudWxsOwotCQotCS8qCi0JICogVHJlZXZpZXdlciBmb3IgQ29udGVudEVsZW1lbnRzIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCS8qCi0JICogRGlhbG9nIEF0dHJpYnV0ZXMKLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRzID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlQYXR0ZXJuIHJlZ2V4UGF0dGVybjsKLQotCS8vIHByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwYW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29sbGFwc2VCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCS8vcHJpdmF0ZSBTdHJpbmdbXSB0eXBlczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIGZpbHRlciBiYXNlZCBvbgotCSAqIHRhYlN0ciwgZmlsdGVycyBvdXQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgYmFzZWQgb24gYWxyZWFkeSBleGlzdGluZwotCSAqIHNlbGVjdGVkIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGVkIHRhYmxlLiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JCQlTdHJpbmcgdGFiU3RyLCBMaXN0IGFscmVhZHlFeGlzdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCQl0aGlzLmZpbHRlciA9IG51bGw7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGFscmVhZHlFeGlzdHM7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwKLQkJCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QpOwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdGFiU3RyLAotCQkJTGlzdCBhbHJlYWR5RXhpc3RzLCBPYmplY3QgaW5wdXQpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZmlsdGVyLCBudWxsLCB0YWJTdHIsIGFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0KLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLCBudWxsKTsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuCi0JICogdGFiU3RyIGlzIHVzZWQgZm9yIHRoZSBzZWFyY2h0eXBlIG9ubHkuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyLCBMaXN0IGFscmVhZHlFeGlzdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGFscmVhZHlFeGlzdHM7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwKLQkJCQlhbHJlYWR5RXhpc3RzKTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIE9ubHkgZm9yIG1ldGhvZGNvbmZpZ3VyYXRpb24uIFRoaXMKLQkgKiBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyIGZvcgotCSAqIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCS8vIHB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGNvbnRlbnRFbGVtZW50LAotCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbiwgU3RyaW5nIHRhYlN0cikgewotCS8vIHN1cGVyKHBhcmVudFNoZWxsKTsKLQkvLyB0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JLy8gdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JLy8gdGhpcy5maWx0ZXIgPSBudWxsOwotCS8vIHRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JLy8gaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLCBudWxsKTsKLQkvLyBpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JLy8gfQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdmVyeSBnZW5lcmljLCBpbiBvcmRlciB0byBpbml0aWFsaXplIGZpbHRlciwgaW5wdXQKLQkgKiBhbmQgY29udGVudHByb3ZpZGVyIHNob3VsZCBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgYnkgY2FsbGluZyBiZWxvdyBtZXRob2QuCi0JICogc2V0RmlsdGVyKElGaWx0ZXIpIHNldElucHV0KE9iamVjdCkKLQkgKiBzZXRDb250ZW50UHJvdmlkZXIoSVN0cnVjdHVyZWRQcm92aWRlcikKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlzYXZlVmFsdWVzKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQkJY2xvc2UoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVWYWx1ZXMoKXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyCi0JCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3RbXSBvYmplY3RBcnIgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnIubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iamVjdEFycltpXSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXNlbGVjdGVkTGlzdC5hZGQob2JqKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBjYW5jZWwgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGl0bGUgZm9yIGRpYWxvZyBib3ggZWc6IFNlbGVjdCBEaWFsb2cgRm9yIFJvbGUsIGRpYWxvZ1RpdGxlIG5lZWRzIHRvCi0JICogIlJvbGUiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAoZGlhbG9nVGl0bGUgPT0gbnVsbCkKLQkJCWRpYWxvZ1RpdGxlID0gdGFiU3RyOwotCQlzaGVsbC5zZXRUZXh0KCJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBJbmZvOiAiICsgZGlhbG9nVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKSBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWxvZyBhcmVhIGFuZCBjb250cm9scyBhbmQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQkvL0dyaWREYXRhIGdEID0gKEdyaWREYXRhKSBjb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgdHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl7Ci0JCQl0eXBlTGFiZWwuc2V0VGV4dCgiU2VsZWN0IHRoZSBhY3Rpdml0eSB0byBtb2RpZnkgQUREIik7IC8vJE5PTi1OTFMtMSQKLQkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJdHlwZUxhYmVsLnNldExheW91dERhdGEoZ0QxKTsKLQotCQl9Ci0vLwkJZmlsdGVyVHlwZSA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLS8vCQl7Ci0vLwkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotLy8JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAyOwotLy8JCQlnRDEud2lkdGhIaW50ID0gMzkwOwotLy8JCQlmaWx0ZXJUeXBlLnNldExheW91dERhdGEoZ0QxKTsKLS8vCQl9Ci0vLwotLy8JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0vLwkJCWZpbGxGaWx0ZXJUeXBlQ29tYm8oKTsKLS8vCQl9IGVsc2UgewotLy8JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHR5cGVzKTsKLS8vCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0vLwkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKDApOwotLy8JCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZS5nZXRJdGVtKDApKTsKLS8vCQkJCWlmICh0YWJTdHIgPT0gbnVsbCkgewotLy8JCQkJCXRhYlN0ciA9IGZpbHRlclR5cGVTdHI7Ci0vLwkJCQkJaGVscGVyLnNldFRhYlN0cih0YWJTdHIpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCWZpbHRlclR5cGUuc2VsZWN0KDApOwotCi0vLwkJTGFiZWwgY3RybF9wYXR0ZXJuTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0vLwkJewotLy8JCQljdHJsX3BhdHRlcm5MYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQpOyAvLyROT04tTkxTLTEkCi0vLwkJCWdELmhvcml6b250YWxTcGFuID0gMzsKLS8vCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0TGF5b3V0RGF0YShnRCk7Ci0vLwkJfQotCi0vLwkJY3RybF9wYXR0ZXJuID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLS8vCQl7Ci0vLwkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotLy8JCQljdHJsX3BhdHRlcm4uc2V0TGF5b3V0RGF0YShnRDEpOwotLy8JCQljdHJsX3BhdHRlcm4uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcigKLS8vCQkJCQluZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotLy8JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCArICAKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKSk7Ci0vLwkJfQotLy8JCUxhYmVsIGN0cmxfcGF0dGVybkxhYmVsMSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQl7Ci0vLwkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotLy8JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0TGF5b3V0RGF0YShnRCk7Ci0vLwkJfQotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwkJCi0JCQotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJ1dHRvbnNMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWJ1dHRvbnNMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dChidXR0b25zTGF5b3V0KTsKLQkJCi0JCWV4cGFuZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULkJVVFRPTjEpOwotCi0JCWV4cGFuZEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImV4cGFuZGFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwYW5kQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19FeHBhbmRBbGwpOyAKLQkJCi0JCWV4cGFuZEJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKSk7CQkKLQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0KLQkJZXhwYW5kQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQljb2xsYXBzZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQljb2xsYXBzZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImNvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNvbGxhcHNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCk7IAotCQljb2xsYXBzZUJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKSk7Ci0JCQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCi0JCWNvbGxhcHNlQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQkJCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQkJY3JlYXRlVmlld2VyTGFiZWwoY29tcG9zaXRlKTsKLQkJLy8gY3JlYXRlIGEgdHJlZXZpZXdlciBhcmVhLgotCQljcmVhdGVWaWV3ZXIoY29tcG9zaXRlKTsKLQotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uKTsgCi0JCWN0cmxfYnJpZWZfZGVzYyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdkLmhlaWdodEhpbnQgPSA2MDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQkvLyBSZXN0b3JlIHRoZSBsYXN0IHN0YXRlCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQotCQkvLyBSZXR1cm4gcmVzdWx0cy4KLQkJYWRkTGlzdGVuZXIoKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY3JlYXRlRGlhbG9nQXJlYS5maWx0ZXJUeXBlU3RyID0gIiArCi0JCS8vIGZpbHRlclR5cGVTdHIpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyB2aWV3ZXIgaW4gdGhlIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICh2aWV3ZXJTZWxlY3Rpb25TaW5nbGUpIHsKLQkJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfSBlbHNlIHsKLQkJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIFBob25nOiB0aGlzIGlzIHRvbyBtZXNzeS4gSWYgeW91IHJlbGllcyBvbiB0aGUgY29udGVudEVsZW1lbnQgdG8KLQkJCS8vIGRldGVybWluZSB0aGUgaW5wdXQgZm9yIHRoZSB2aWV3ZXIKLQkJCS8vIHRoZW4geW91IHNob3VsZCBkZWNsYXJlIGEgaW5wdXQgZmllbGQgaW5zdGVhZCBhbmQgbW92ZSB0aGlzIGNvZGUKLQkJCS8vIHRvIGNvbnN0cnVjdG9yCi0JCQkvLwotCQkJLy8gc29ydGVyIG5lZWRzIG9yIG5vdC4gVE9ETwotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCQlpZiAoKChQcm9jZXNzKSBjb250ZW50RWxlbWVudCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCWlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSkKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApIAotCQkJCQkJCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpKSB7Ci0JCQkJCQkJCXRyZWVWaWV3ZXIKLQkJCQkJCQkJCQkuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJdHJlZVZpZXdlci5zZXRJbnB1dCgoKFByb2Nlc3MpIGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkJCS5lQ29udGFpbmVyKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZQotCQkJCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0cmVlVmlld2VyLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRyZWVWaWV3ZXIKLQkJCQkJCS5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJfQotCQl9Ci0KLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlpZiAodGFiU3RyLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykpIHsgCi0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyRm9yQWxsKCkpOwotCQl9IGVsc2UgewotCQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZpbHRlclNvcnRlcigpKTsKLQkJfQotCi0JCS8vIHRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgzKTsKLQkJLy8gdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJc3BlYy5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlckxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgIAkJaWYgKHZpZXdlckxhYmVsICE9IG51bGwpIHsKLSAgIAkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCh2aWV3ZXJMYWJlbCk7Ci0gICAJCX0KLSAgIAl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKGJvb2xlYW4gc2luZ2xlKSB7Ci0JCXZpZXdlclNlbGVjdGlvblNpbmdsZSA9IHNpbmdsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXIjZG91YmxlQ2xpY2sob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCS8vIGlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJY2xvc2UoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdHJhdmVyc2VUcmVlKFRyZWVJdGVtW10gaXRlbXMsIExpc3QgbGlzdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zeCA9IGl0ZW1zW2ldLmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXN4Lmxlbmd0aCA+IDEpIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCXRyYXZlcnNlVHJlZShpdGVtc3gsIGxpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl1cGRhdGVTZWxlY3Rpb24oZXZlbnQpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBidXR0b24gZW5hYmxlbWVudCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkvLyBva0J1dHRvbi5zZXRFbmFibGVkKGdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50T2JqZWN0KE9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlyZXR1cm4gTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwoY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIEFycmF5TGlzdCBkZXNjcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB8fAotCQkJCXNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcil7Ci0JCQlPYmplY3QgdW53cmFwID0gIFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24odW53cmFwKTsKLQkJfWVsc2UgewotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihzZWxlY3RlZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBicmllZiBkZXNjcmlwdGlvbiB0byBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcigpIHsKLQotCQlleHBhbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQkJfQotCQl9KTsKLQkJY29sbGFwc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRTZWxlY3RlZEl0ZW1zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJGb3JUYWJzKCkgewotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcil7Ci0JCQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbnRlbnRjYXRlZ29yeS4KLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQ1MgotCQkJCQloZWxwZXIuc2V0Q29udGVudENhdGVnb3J5VGFiU3RyKHRhYlN0cik7Ci0JCQkJfQotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX1lbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIHsKLQkJCQkoKEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSVByb2Nlc3NGaWx0ZXIpIHsKLQkJCWlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9VG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7Ci0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfSBlbHNlIGlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhpc3RpbmdFbGVtZW50cyhMaXN0IGxpc3QpIHsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gbGlzdDsKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQloZWxwZXIuc2V0QWxyZWFkeVNlbGVjdGVkTGlzdChsaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gdGhpcy5oZWxwZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEZpbHRlclR5cGVBcnJheSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBzZXRzIHRoZSBDb250ZW50UHJvdmlkZXIgdXNlZCBieSBUcmVlVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JCXRoaXMuY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiBzZXQgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHRoaXMuZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgdGhpcy5maWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJMYWJlbChTdHJpbmcgdmlld2VyTGFiZWwpIHsKLQkJdGhpcy52aWV3ZXJMYWJlbCA9IHZpZXdlckxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXNzaWduRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXNzaWduRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZmI3YWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0Fzc2lnbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdTaW1wbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlVuYXNzaWduQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVW5pcXVlTmFtZVBOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogRGlhbG9nIGZvciBhc3NpZ2luZyBNZXRob2RFbGVtZW50IHdpdGhpbiBNZXRob2RMaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbkRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JQXJyYXlMaXN0IHVzZWRDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZWxlbWVudHM7Ci0KLQlwcml2YXRlIE9iamVjdCBkZXN0aW5hdGlvbjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYXNzaWduaW5nID0gZmFsc2U7Ci0KLQlwcml2YXRlIFByb2dyZXNzTW9uaXRvclBhcnQgcHJvZ3Jlc3NNb25pdG9yUGFydDsKLQotCXByaXZhdGUgQ3Vyc29yIHdhaXRDdXJzb3I7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZFVJID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIEFzc2lnbkRpYWxvZyBuZXdBc3NpZ25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBBc3NpZ25EaWFsb2cocGFyZW50U2hlbGwsIGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBc3NpZ25EaWFsb2cgbmV3UmVhc3NpZ25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsCi0JCQlDb2xsZWN0aW9uIGVsZW1lbnRzLCBNZXRob2RFbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBSZWFzc2lnbkRpYWxvZyhwYXJlbnRTaGVsbCwgZWxlbWVudHMsIHBhcmVudEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEFzc2lnbkRpYWxvZyBuZXdEZWVwQ29weURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlyZXR1cm4gbmV3IEN1c3RvbUNhdGVnb3J5RGVlcENvcHlEaWFsb2cocGFyZW50U2hlbGwsIGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFzc2lnbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgQ29sbGVjdGlvbiBlbGVtZW50c1RvQXNzaWduKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQllbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzVG9Bc3NpZ24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dCk7IAotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCi0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCS8vIHRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCi0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQotCQlHcmlkTGF5b3V0IHBtbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJcG1sYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCXByb2dyZXNzTW9uaXRvclBhcnQgPSBjcmVhdGVQcm9ncmVzc01vbml0b3JQYXJ0KGNvbXBvc2l0ZSwgcG1sYXlvdXQpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0Ci0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0LnNldFZpc2libGUoZmFsc2UpOwotCi0JCXdhaXRDdXJzb3IgPSBwYXJlbnQuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKAotCQkJCVNXVC5DVVJTT1JfV0FJVCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXNzaWduRGlhbG9nX2Fzc2lnbl90ZXh0KTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlkZXN0aW5hdGlvbiA9IFRuZ1V0aWwudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJaWYgKGRvQXNzaWduKCkpIHsKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREZXN0aW5hdGlvbigpIHsKLQkJaWYgKCEgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiB0YXJnZXRQbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oKEN1c3RvbUNhdGVnb3J5KSBkZXN0aW5hdGlvbik7Ci0JCWlmICh0YXJnZXRQbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudHMuZ2V0KDApIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kUGx1Z2luIHNvdXJjZVBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgZWxlbWVudHMuZ2V0KDApKTsKLQkJCWlmIChzb3VyY2VQbHVnaW4gPT0gdGFyZ2V0UGx1Z2luKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0UGx1Z2luLmdldEJhc2VzKCkuY29udGFpbnMoc291cmNlUGx1Z2luKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkb0Fzc2lnbigpIHsKLQkJLy9UbyBkbzogCi0JCS8vKDEpIEltcGxlbWVudCBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNrIGZvciBpc1ZhbGlkRGVzdGluYXRpb24gKG5pY2UgdG8gaGF2ZSB0aGUgY2hlY2sKLQkJLy8gICAgYXQgdGhpcyBwb2ludCwgYWx0aG91Z2ggdGhlIGNpcmN1bGF0IGNoZWNrIHdvdWxkIGJlIGRvbmUgZHVyaW5nICJydW4iIGFjdGlvbiB0b28gCi0JCS8vKDIpIENoYW5nZSAibW92ZSIgdG8gImFzc2lnbiIgc3RyaW5ncwotCQlpZiAoZGVzdGluYXRpb24gPT0gbnVsbCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0OyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtc2cpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWlzVmFsaWREZXN0aW5hdGlvbigpKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgcHJvYmxlbSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnOyAKLQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJKEVPYmplY3QpIGRlc3RpbmF0aW9uLCBnZXRTaGVsbCgpKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbjsgCi0JCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJYXNzaWduaW5nID0gdHJ1ZTsJCQotCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXNzaWduQWN0aW9uX3RleHQpOwotCQkJCXRyeSB7Ci0JCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlID0gZG9Xb3JrQmVmb3JlU2F2ZSgpOwotCQkJCQlMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbi5zYXZlKHJlc291cmVzVG9TYXZlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlhc3NpZ25pbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCi0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKHRydWUpOwotCQlJU3RhdHVzIHN0YXQgPSBudWxsOwotCQl0cnkgewotCQkJc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBwcm9ncmVzc01vbml0b3JQYXJ0LCBzaGVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCXByb2dyZXNzTW9uaXRvclBhcnQuZG9uZSgpOwotCQl9Ci0JCQotCQlpZihzdGF0ICE9IG51bGwgJiYgIXN0YXQuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX0Fzc2lnbkRpYWxvZ19lcnJvck1lc3NhZ2U7IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXQpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGRvV29ya0JlZm9yZVNhdmUoKSB7Ci0JCWZpbmFsIExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQkJZmluYWwgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGRlc3RpbmF0aW9uOwotCQlmaW5hbCBDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkKLQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5hZGRJdGVtc1RvTW9kZWwxKGVsZW1lbnRzLCBjYXRlZ29yeSwKLQkJCQkJCXVzZWRDYXRlZ29yaWVzLCBoZWxwZXIuZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkJQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLmdldEFuY2VzdG9ycyhjYXRlZ29yeSkpOwotCQkJCXJlc291cmVzVG9TYXZlLmFkZChjYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHJlc291cmVzVG9TYXZlOwotCX0KLQkJCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjbG9zZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChhc3NpZ25pbmcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkKLQotCXByb3RlY3RlZCBQcm9ncmVzc01vbml0b3JQYXJ0IGNyZWF0ZVByb2dyZXNzTW9uaXRvclBhcnQoCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlLCBHcmlkTGF5b3V0IHBtbGF5b3V0KSB7Ci0JCXJldHVybiBuZXcgUHJvZ3Jlc3NNb25pdG9yUGFydChjb21wb3NpdGUsIHBtbGF5b3V0LCBTV1QuREVGQVVMVCkgewotCQkJU3RyaW5nIGN1cnJlbnRUYXNrID0gbnVsbDsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzZXRCbG9ja2VkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzZXRCbG9ja2VkKElTdGF0dXMgcmVhc29uKSB7Ci0JCQkJc3VwZXIuc2V0QmxvY2tlZChyZWFzb24pOwotCQkJCWlmICghbG9ja2VkVUkpLy8gRG8gbm90IHNob3cgYmxvY2tlZCBpZiB3ZSBhcmUgbG9ja2luZyB0aGUgVUkKLQkJCQkJZ2V0QmxvY2tlZEhhbmRsZXIoKS5zaG93QmxvY2tlZChnZXRTaGVsbCgpLCB0aGlzLCByZWFzb24sCi0JCQkJCQkJY3VycmVudFRhc2spOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I2NsZWFyQmxvY2tlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNsZWFyQmxvY2tlZCgpIHsKLQkJCQlzdXBlci5jbGVhckJsb2NrZWQoKTsKLQkJCQlpZiAoIWxvY2tlZFVJKS8vIERvIG5vdCB2bGVhciBpZiB3ZSBuZXZlciBzZXQgaXQKLQkJCQkJZ2V0QmxvY2tlZEhhbmRsZXIoKS5jbGVhckJsb2NrZWQoKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNiZWdpblRhc2soamF2YS5sYW5nLlN0cmluZywKLQkJCSAqICAgICAgaW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLQkJCQlzdXBlci5iZWdpblRhc2sobmFtZSwgdG90YWxXb3JrKTsKLQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc2V0VGFza05hbWUoamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCQlzdXBlci5zZXRUYXNrTmFtZShuYW1lKTsKLQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc3ViVGFzayhqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQkJc3VwZXIuc3ViVGFzayhuYW1lKTsKLQkJCQkvLyBJZiB3ZSBoYXZlbid0IGdvdCBhbnl0aGluZyB5ZXQgdXNlIHRoaXMgdmFsdWUgZm9yIG1vcmUKLQkJCQkvLyBjb250ZXh0Ci0JCQkJaWYgKGN1cnJlbnRUYXNrID09IG51bGwpCi0JCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgewotCQlyZXR1cm4gZGVzdGluYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVhc3NpZ25EaWFsb2cgZXh0ZW5kcyBBc3NpZ25EaWFsb2cgewotCQkKLQkJcHJpdmF0ZSBDdXN0b21DYXRlZ29yeSBwYXJlbnRFbGVtZW50OwotCQkKLQkJcHJvdGVjdGVkIFJlYXNzaWduRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCAKLQkJCQlDb2xsZWN0aW9uIGVsZW1lbnRzLCBNZXRob2RFbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsLCBlbGVtZW50cyk7Ci0JCQl0aGlzLnBhcmVudEVsZW1lbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIHBhcmVudEVsZW1lbnQ7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBkb1dvcmtCZWZvcmVTYXZlKCkgewotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyZXNUb1NhdmUgPSBzdXBlci5kb1dvcmtCZWZvcmVTYXZlKCk7Ci0JCQlyZXNvdXJlc1RvU2F2ZS5hZGQocGFyZW50RWxlbWVudC5lUmVzb3VyY2UoKSk7CQkJCi0JCQlVbmFzc2lnbkFjdGlvbi51bmFzc2lnbihnZXRTaGVsbCgpLCBnZXRFbGVtZW50cygpLmdldCgwKSwgcGFyZW50RWxlbWVudCwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCXJldHVybiByZXNvdXJlc1RvU2F2ZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXNzaWduRGlhbG9nX3JlYXNzaWduX3RleHQpOyAKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weURpYWxvZyBleHRlbmRzIEFzc2lnbkRpYWxvZyB7Ci0JCUNvbnRlbnRQYWNrYWdlIGN1c3RvbUNhdGVnb3J5UGtnOwotCQlwcml2YXRlIFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIgbmFtZUhhbmRsZXI7Ci0JCXByaXZhdGUgUmVzb3VyY2VTY2FubmVyIHNjYW5uZXI7Ci0JCQotCQlwcm90ZWN0ZWQgQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgCi0JCQkJQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQkJc3VwZXIocGFyZW50U2hlbGwsIGVsZW1lbnRzKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGRvV29ya0JlZm9yZVNhdmUoKSB7Ci0JCQlpZiAoZ2V0RWxlbWVudHMoKSA9PSBudWxsCi0JCQkJCXx8ICEoZ2V0RWxlbWVudHMoKS5nZXQoMCkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQkJfHwgIShnZXREZXN0aW5hdGlvbigpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkJCQotCQkJQ3VzdG9tQ2F0ZWdvcnkgc291cmNlID0gKEN1c3RvbUNhdGVnb3J5KSBnZXRFbGVtZW50cygpLmdldCgwKTsKLQkJCUN1c3RvbUNhdGVnb3J5IHRhcmdldFBhcmVudCA9IChDdXN0b21DYXRlZ29yeSkgZ2V0RGVzdGluYXRpb24oKTsKLQkJCQotCQkJaW5pdERlZXBDb3B5KHNvdXJjZSwgdGFyZ2V0UGFyZW50KTsgCi0JCQlDdXN0b21DYXRlZ29yeSBjb3B5ID0gKEN1c3RvbUNhdGVnb3J5KSBkZWVwQ29weShzb3VyY2UpOwkJCQotCQkJCi0JCQkvL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIgdHh0UmVmUmVwbGFjZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldFRleHRSZWZlcmVuY2VSZXBsYWNlcigpOwotCQkJY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGNvcHkpOwotCQkJdGFyZ2V0UGFyZW50LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGQoY29weSk7Ci0JCQkKLQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlID0gbmV3IEFycmF5TGlzdCgpOwkJCQkKLQkJCXJlc291cmVzVG9TYXZlLmFkZCh0YXJnZXRQYXJlbnQuZVJlc291cmNlKCkpOwotCQkJCi0JCQlpZiAoc2Nhbm5lciAhPSBudWxsKSB7Ci0JCQkJc2Nhbm5lci5jb3B5RmlsZXMoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc291cmVzVG9TYXZlOwotCQl9CQkKLQkJCi0JCXByaXZhdGUgRU9iamVjdCBkZWVwQ29weShFT2JqZWN0IHNvdXJjZSkgewkJCQotCQkJRU9iamVjdCBjb3B5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKHNvdXJjZS5lQ2xhc3MoKSk7Ci0JCQloYW5kbGVOYW1lcyhzb3VyY2UsIGNvcHkpOwotCQkKLQkJCUxpc3QgZmVhdHVyZXMgPSBzb3VyY2UuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwkJCQkKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JCQkJY29weUZlYXR1cmVWYWx1ZShzb3VyY2UsIGNvcHksIGZlYXR1cmUpOwotCQkJfQotCQkJcmV0dXJuIGNvcHk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaGFuZGxlTmFtZXMoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgY29weSkgewotCQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCU9iamVjdCBuYW1lID0gc291cmNlLmVHZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJT2JqZWN0IHBuYW1lID0gc291cmNlLmVHZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCQotCQkJCWNvcHkuZVNldChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBuYW1lKTsKLQkJCQljb3B5LmVTZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIHBuYW1lKTsKLQotCQkJCW5hbWVIYW5kbGVyLmVuc3VyZVVuaXF1ZSgoQ3VzdG9tQ2F0ZWdvcnkpIGNvcHkpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY29weUZlYXR1cmVWYWx1ZShFT2JqZWN0IHNvdXJjZU9iaiwgRU9iamVjdCBjb3BpZWRPYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQkJCi0JCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQljb3B5QXR0cmlidXRlRmVhdHVyZVZhbHVlKHNvdXJjZU9iaiwgY29waWVkT2JqLCAoRUF0dHJpYnV0ZSkgZmVhdHVyZSk7CQkJCQotCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCWNvcHlSZWZlcmVuY2VGZWF0dXJlVmFsdWUoc291cmNlT2JqLCBjb3BpZWRPYmosIChFUmVmZXJlbmNlKSBmZWF0dXJlKTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY29weUF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShFT2JqZWN0IHNvdXJjZU9iaiwKLQkJCQlFT2JqZWN0IGNvcGllZE9iaiwgRUF0dHJpYnV0ZSBmZWF0dXJlKSB7Ci0JCQlPYmplY3Qgc291cmNlVmFsdWUgPSBzb3VyY2VPYmouZUdldChmZWF0dXJlKTsKLQkJCWlmIChzb3VyY2VWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJT2JqZWN0IGNvcGllZFZhbHVlID0gc291cmNlVmFsdWU7Ci0KLQkJCWlmIChzb3VyY2VPYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpKSB7Ci0JCQkJCWNvcGllZFZhbHVlID0gRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzY2FubmVyICE9IG51bGwpIHsKLQkJCQlpZiAoc291cmNlVmFsdWUgaW5zdGFuY2VvZiBVUkkpIHsKLQkJCQkJVVJJIHVyaSA9IChVUkkpIHNvdXJjZVZhbHVlOwotCQkJCQlTdHJpbmcgdXJsU3RyID0gc2Nhbm5lci5yZWdpc3RlckZpbGVDb3B5KHVyaS50b1N0cmluZygpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvcGllZFZhbHVlID0gbmV3IFVSSSh1cmxTdHIpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJY29waWVkVmFsdWUgPSBzb3VyY2VWYWx1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoc291cmNlVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJaWYgKHNvdXJjZU9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkmJiBjb3BpZWRPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQljb3BpZWRWYWx1ZSA9IHNjYW5uZXIKLQkJCQkJCQkJLnNjYW4oKE1ldGhvZEVsZW1lbnQpIHNvdXJjZU9iaiwKLQkJCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgY29waWVkT2JqLAotCQkJCQkJCQkJCShTdHJpbmcpIHNvdXJjZVZhbHVlLCBmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJY29waWVkT2JqLmVTZXQoZmVhdHVyZSwgY29waWVkVmFsdWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNvcHlSZWZlcmVuY2VGZWF0dXJlVmFsdWUoRU9iamVjdCBzb3VyY2VPYmosIEVPYmplY3QgY29waWVkT2JqLCBFUmVmZXJlbmNlIGZlYXR1cmUpIHsKLQkJCU9iamVjdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZU9iai5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKHNvdXJjZVZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlPYmplY3QgY29waWVkVmFsdWUgPSBzb3VyY2VWYWx1ZTsKLQotCQkJaWYgKGZlYXR1cmUuaXNDb250YWlubWVudCgpKSB7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdDxFT2JqZWN0PiBzb3VyY2VMaXN0ID0gKExpc3Q8RU9iamVjdD4pIHNvdXJjZVZhbHVlOwotCQkJCQlMaXN0PEVPYmplY3Q+IGNvcGllZExpc3QgPSAoTGlzdDxFT2JqZWN0PikgY29waWVkT2JqCi0JCQkJCQkJLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWZvciAoRU9iamVjdCBzb2JqIDogc291cmNlTGlzdCkgewotCQkJCQkJRU9iamVjdCBjb2JqID0gZGVlcENvcHkoc29iaik7Ci0JCQkJCQljb3BpZWRMaXN0LmFkZChjb2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNvcGllZFZhbHVlID0gZGVlcENvcHkoKEVPYmplY3QpIHNvdXJjZVZhbHVlKTsKLQotCQkJfSBlbHNlIGlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBzb3VyY2VMaXN0ID0gKExpc3QpIHNvdXJjZVZhbHVlOwotCQkJCUxpc3QgY29waWVkTGlzdCA9IChMaXN0KSBjb3BpZWRPYmouZUdldChmZWF0dXJlKTsKLQkJCQlmb3IgKE9iamVjdCBzb2JqIDogc291cmNlTGlzdCkgewotCQkJCQlPYmplY3QgY29iaiA9IHNvYmo7Ci0JCQkJCWlmIChzb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCWNvYmogPSAoQ3VzdG9tQ2F0ZWdvcnkpIGRlZXBDb3B5KChDdXN0b21DYXRlZ29yeSkgc29iaik7Ci0JCQkJCQlDdXN0b21DYXRlZ29yeSBjY29iaiA9IChDdXN0b21DYXRlZ29yeSkgY29iajsKLQkJCQkJCWN1c3RvbUNhdGVnb3J5UGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjY29iaik7Ci0JCQkJCX0KLQkJCQkJY29waWVkTGlzdC5hZGQoY29iaik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJY29waWVkT2JqLmVTZXQoZmVhdHVyZSwgY29waWVkVmFsdWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVlcENvcHlfdGV4dCk7IAotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5pdERlZXBDb3B5KEN1c3RvbUNhdGVnb3J5IHNvdXJjZSwgQ3VzdG9tQ2F0ZWdvcnkgdGFyZ2V0UGFyZW50KSB7Ci0JCQlNZXRob2RQbHVnaW4gc3JjUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oc291cmNlKTsKLQkJCU1ldGhvZFBsdWdpbiB0Z3RQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih0YXJnZXRQYXJlbnQpOwotCQkJY3VzdG9tQ2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSh0Z3RQbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJCW5hbWVIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIoY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQkJaWYgKHNyY1BsdWdpbiAhPSB0Z3RQbHVnaW4pIHsKLQkJCQlzY2FubmVyID0gbmV3IFJlc291cmNlU2Nhbm5lcihzcmNQbHVnaW4sIHRndFBsdWdpbik7Ci0JCQl9Ci0JCX0KLQkJCQotCX0KLQotCi0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXR0YWNobWVudERpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0F0dGFjaG1lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1MDcwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXR0YWNobWVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogT3BlbnMgZGlhbG9nIHRvIGF0dGFjaCBhdHRhY2htZW50cwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF0dGFjaG1lbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0KLQlwcml2YXRlIFRleHQgYXR0YWNobWVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIEF0dGFjaG1lbnREaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBkaWFsb2dBcmVhLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBkaWFsb2dBcmVhLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIHVybExhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0KTsgCi0JCWF0dGFjaG1lbnQgPSBuZXcgVGV4dChkaWFsb2dBcmVhLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQlhdHRhY2htZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlhdHRhY2htZW50LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCW9rQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoYXR0YWNobWVudC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJCQlhdHRhY2htZW50LnNldFRleHQodXJsKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwZXIKLQkJCQkuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCk7IAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJLy8gU3RyaW5nIHVybCA9IGF0dGFjaG1lbnQuZ2V0VGV4dCgpOwotCQkvLyBpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgewotCQkvLwkJCQotCQkvLyB9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEZpbGUgTmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudFBhdGgoKSB7Ci0JCXJldHVybiBhdHRhY2htZW50LmdldFRleHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ2hhbmdlSGlzdG9yeURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NoYW5nZUhpc3RvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhNDMwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ2hhbmdlSGlzdG9yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIERpYWxvZyB0byBzaG93IGNoYW5nZSBoaXN0b3J5IG9mIGFuIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUhpc3RvcnlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIENoYW5nZUhpc3RvcnlEaWFsb2coU2hlbGwgcGFyZW50LCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgZGlhbG9nQXJlYS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgZGlhbG9nQXJlYS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdkLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWwpOyAKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShkaWFsb2dBcmVhLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQl9Ci0KLQkJaW5pdENoYW5nZUhpc3RvcnlUYWJsZSgpOwotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZSk7IAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDaGFuZ2VIaXN0b3J5VGFibGUoKSB7Ci0JCVN0cmluZyBjaGFuZ2VEZXNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9ICgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWNoYW5nZURlc2MgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJY2hhbmdlRGVzYyA9ICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJaWYgKGNoYW5nZURlc2MgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0JCQkJCWNoYW5nZURlc2MsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyKTsgCi0JCQlMaXN0IHN0ckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCXdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJc3RyTGlzdC5hZGQodG9rLm5leHRUb2tlbigpKTsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IHN0ckxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQoKFN0cmluZykgc3RyTGlzdC5nZXQoaSkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NWYyZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBPcGVuIGFuIGRpYWxvZyB0byBhZGQgdmlld3MgaW50byBjb25maWd1cmF0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nIGV4dGVuZHMgSXRlbXNGaWx0ZXJEaWFsb2cgewotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQl9Ci0JCQkJaWYgKHByZXNlbnRhdGlvbk5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMocHJlc2VudGF0aW9uTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmVzZW50YXRpb25OYW1lID0gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZTsKLQkJCX0KLQkJfTsKLQkJaGVscGVyLnNldFNob3dQcmVzZW50YXRpb25OYW1lKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uT3JkZXJEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4MTlmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIE9wZW4gYSBkaWFsb2cgdG8gb3JkZXIgY29uZmlndXJhdGlvbiB2aWV3cwotICogQGF1dGhvciBYaWFuZyBEb25nIEh1Ci0gKiBAc2luY2UgMS4yCi0gKiAgZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYmFzZUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF92aWV3czsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld3NUYWJsZVZpZXdlcjsKLQotLy8JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgdmlld3NWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHZpZXdzVmlld2VyTGFiZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2coU2hlbGwgcGFyZW50LCAKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJhc2VDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoCi0JCQkJYmFzZUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzLCAzKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmlld3MgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF92aWV3cy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQl2aWV3c1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdmlld3MpOwotCQl2aWV3c1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcih2aWV3c1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcih2aWV3c1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMaW5lKGJhc2VDb21wb3NpdGUsIDQpOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbik7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0KLQkJcmV0dXJuIGJhc2VDb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXZpZXdzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld3NWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICFjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl2aWV3c1RhYmxlVmlld2VyCi0JCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0JCQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCQkJCU1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCgKLQkJCQkJCWNvbmZpZywgbW92ZVVwSXRlbXMsIGZlYXR1cmUsMSk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQl2aWV3c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDApIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCQkJCU1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCgKLQkJCQkJCWNvbmZpZywgbW92ZURvd25JdGVtcywgZmVhdHVyZSwwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXZpZXdzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQl2aWV3c1RhYmxlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotLy8JCWFsbFN0ZXBzLmFwcGx5KCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gY29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlPYmplY3QgY21kID0gY29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCkgewotCQkJCQkoKE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKSBjbWQpLnVuZG8oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlYmE0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIE9wZW4gYW4gZGlhbG9nIHRvIG9yZGVyIGNvbnRlbnQgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGJhc2VDb21wb3NpdGU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3VwLCBjdHJsX2Rvd247Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfc3RlcHM7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHN0ZXBzVGFibGVWaWV3ZXI7Ci0KLQkvLyBwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQkvLyBwcml2YXRlIFRhc2sgY29udGVudEVsZW1lbnQ7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCS8vIHRoZSBFbGVtZW50IHRvIHVzZSBmb3Igc29ydGluZwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBzb3J0RWxlbWVudDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIENvbWJvVmlld2VyIHZpZXdlcl9zb3J0OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNvcnQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3Q8U3RyaW5nPiBzb3J0VHlwZXNMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyCi0JCQkJCS5nZXRDYXRlZ29yeVNvcnRUeXBlcygpOwotCQkJcmV0dXJuIHNvcnRUeXBlc0xpc3QudG9BcnJheSgpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU29ydCA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlTdHJpbmcgc3RyID0gKChTdHJpbmcpIG9iamVjdCk7Ci0JCQkJcmV0dXJuIENhdGVnb3J5U29ydEhlbHBlci5nZXRTb3J0VHlwZURpc3BsYXlOYW1lKHN0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkFkdmFuY2VkU2VhcmNoRGlhbG9nPC9jb2RlPiBnaXZlYiB0aGUgcGFyZW50IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZyhTaGVsbCBwYXJlbnQsCi0JCQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3IoY29udGVudEVsZW1lbnQpKSB7Ci0JCQl0aGlzLnNvcnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zb3J0RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl9Ci0JCXRoaXMuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JCXRoaXMuYWxsU3RlcHMgPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQliYXNlQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKAotCQkJCWJhc2VDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dCwKLQkJCQkzKTsgCi0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3N0ZXBzID0gbmV3IFRhYmxlKGJhc2VDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwMDsKLQkJCWN0cmxfc3RlcHMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3N0ZXBzKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyKTsKLQotCQlDb21wb3NpdGUgb3JkZXJCdXR0b25QYW5lID0gbmV3IENvbXBvc2l0ZShiYXNlQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQljdHJsX3VwID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhUKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2Rvd24gPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhUKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljcmVhdGVMYWJlbChvcmRlckJ1dHRvblBhbmUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX0xhYmVsLCAxKTsKLQkJQ29tYm8gY3RybF9zb3J0ID0gbmV3IENvbWJvKG9yZGVyQnV0dG9uUGFuZSwgU1dULlNJTkdMRSB8IFNXVC5GTEFUCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJdmlld2VyX3NvcnQgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF9zb3J0KTsKLQkJdmlld2VyX3NvcnQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNvcnQpOwotCQl2aWV3ZXJfc29ydC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTb3J0KTsKLQkJdmlld2VyX3NvcnQuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkvLyBzZXQgaW5pdGlhbCBzZWxlY3Rpb24KLQkJU3RyaW5nIHNvcnRUeXBlID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKHNvcnRFbGVtZW50KTsKLQkJdmlld2VyX3NvcnQuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNvcnRUeXBlKSwgdHJ1ZSk7Ci0JCWVuYWJsZUJ1dHRvbnMoKTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMaW5lKGJhc2VDb21wb3NpdGUsIDQpOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQpOyAKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQkvLyBjb250cmlidXRvcnMgY2Fubm90IGNoYW5nZSB0aGUgc29ydCB0eXBlIC0gdGhlIGJhc2UgZWxlbWVudCdzIHNvcnQgaXMKLQkJLy8gdXNlZAotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgfHwgVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGNvbnRlbnRFbGVtZW50KSkgewotCQkJdmlld2VyX3NvcnQuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXZpZXdlcl9zb3J0LmdldENvbWJvKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCi0JCXJldHVybiBiYXNlQ29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBuQ29sKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuQ29sOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJCQkvLyBpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCS8vIGFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCS8vIGNvbnRlbnRFbGVtZW50LAotCQkJCS8vIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKTsKLQkJCQkvLyB9Ci0JCQkJLy8gTGlzdCByZXR1cm5MaXN0ID0KLQkJCQkvLyBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoc29ydEVsZW1lbnQsCi0JCQkJLy8gYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQkvLyByZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0KLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUywKLQkJCQkJCQlmZWF0dXJlKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKAotCQkJCQkJc29ydEVsZW1lbnQsIGFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXN0ZXBzVmlld2VyTGFiZWxQcm92aWRlciA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhKChMaXN0KSAoKENvbnRlbnRDYXRlZ29yeSkgY29udGVudEVsZW1lbnQpCi0JCQkJCQkuZUdldChmZWF0dXJlKSkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWVuYWJsZUJ1dHRvbnMoKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJCU1vdmVJbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5MaXN0Q29tbWFuZCgKLQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywKLQkJCQkJCWFsbFN0ZXBzLCBmZWF0dXJlLCBNb3ZlSW5MaXN0Q29tbWFuZC5VUCk7Ci0KLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0KLQkJCQllbmFibGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQkJTW92ZUluTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJbkxpc3RDb21tYW5kKAotCQkJCQkJKENvbnRlbnRDYXRlZ29yeSkgY29udGVudEVsZW1lbnQsIG1vdmVEb3duSXRlbXMsCi0JCQkJCQlhbGxTdGVwcywgZmVhdHVyZSwgTW92ZUluTGlzdENvbW1hbmQuRE9XTik7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCi0JCQkJZW5hYmxlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXJfc29ydAotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zb3J0Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCVN0cmluZyBzb3J0VHlwZSA9IChTdHJpbmcpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyCi0JCQkJCQkJCS5nZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShjb250ZW50RWxlbWVudCk7Ci0KLQkJCQkJCWlmIChwcm9wID09IG51bGwpIHsKLQkJCQkJCQlwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyCi0JCQkJCQkJCQkuY3JlYXRlTmV3U29ydFByb3BlcnR5KHNvcnRUeXBlKTsKLQkJCQkJCQlhY3Rpb25NYW5hZ2VyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYWN0aW9uTWFuYWdlci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb3AsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJCQkJCQlzb3J0VHlwZSwgLTEpOwotCQkJCQkJfQotCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJCWVuYWJsZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXJzKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJYWxsU3RlcHMuYXBwbHkoKTsKLQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAoIWNvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IGNvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJT2JqZWN0IGNtZCA9IGNvbW1hbmRzLmdldChpKTsKLQkJCQlpZiAoY21kIGluc3RhbmNlb2YgTW92ZUluTGlzdENvbW1hbmQpIHsKLQkJCQkJKChNb3ZlSW5MaXN0Q29tbWFuZCkgY21kKS51bmRvKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUJ1dHRvbnMoKSB7Ci0JCWlmIChpc1Nob3VsZEVuYWJsZVVwKCkpIHsKLQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlCi0JCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWlmIChpc1Nob3VsZEVuYWJsZURvd24oKSkgewotCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZQotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3VsZEVuYWJsZVVwKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCXN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJgotCQkJCSFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJiAKLQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoc29ydEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3VsZEVuYWJsZURvd24oKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmCi0JCQkJKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEpICYmCi0JCQkJIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KHNvcnRFbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udHJpYnV0aW9uU2VsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udHJpYnV0aW9uU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGZiNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRyaWJ1dGlvblNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgZGlhbG9nIGZvciBzZWxlY3RpbmcgZWxlbWVudCB0byBkZXRldG1pbmUgd2hpY2ggZWxlbWVudCBlZGl0b3IgdG8gb3BlbiBpbgotICogY2FzZSBvZiB2YXJpYWJpbGl0eSByZWxhdGlvbnNoaXAuIFRoaXMgd2lsbCBvbmx5IHRha2UgZWZmZWN0IGlmIHVzZXIKLSAqIGRvdWJsZS1jbGlja3MgZnJvbSBjb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRpb25TZWxlY3Rpb24gewotCi0JcHJpdmF0ZSBIYXNoU2V0IGZpbHRlckVsZW1lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgY2xhc3MgQ29udHJpYnV0aW9uRmlsdGVyIGV4dGVuZHMgQWxsRmlsdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSByZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkuY29udGFpbnMob2JqKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiBhbnlDYXRlZ29yaXplZEVsZW1lbnRBY2NlcHRlZCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaiwKLQkJCQkJCWZpbHRlckVsZW1lbnRMaXN0KTsKLQkJCX0KLQkJCWlmICgob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCQkJCSYmIGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKG9iaikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpeyAKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gY2hlY2tQcm9jZXNzUGtnKG9iaik7Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcmV0dXJuIGNoZWNrUHJvY2Vzc0VsZW1lbnRzKG9iaik7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBib29sZWFuIGNoZWNrUHJvY2Vzc1BrZyhPYmplY3Qgb2JqKXsKLQkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpewotCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJCWlmKGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoUHJvY2Vzc0NvbXBvbmVudClvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWxpc3QgPSAoKFByb2Nlc3NDb21wb25lbnQpb2JqKS5nZXRQcm9jZXNzKCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCX1lbHNlewotCQkJCWxpc3QgPSAoKFByb2Nlc3NQYWNrYWdlKW9iaikuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJfQotCQkJCi0JCX0KLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJCWlmKGNoZWNrUHJvY2Vzc1BrZyhjaGlsZCkpIHJldHVybiB0cnVlOwotCQkJfQotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KXsKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhjaGlsZCkpIHJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgYW55IHByb2Nlc3MgZWxlbWVudHMKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqIAkJCUJvb2xlYW4gdmFsdWUgCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tQcm9jZXNzRWxlbWVudHMoT2JqZWN0IG9iail7Ci0JCUxpc3QgbGlzdCA9ICgoUHJvY2VzcylvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KXsKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucygoKEJyZWFrZG93bkVsZW1lbnQpY2hpbGQpKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhbnkgY2F0ZWdvcml6ZWQgZWxlbWVudHMgdG8gYmUgYWNjZXB0ZWQuCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHJldHVybgotCSAqIAkJQm9vbGVhbiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBhbnkgY2F0ZWdvcmllemVkIGVsZW1lbnRzIHRvIGJlIGFjY2VwdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gYW55Q2F0ZWdvcml6ZWRFbGVtZW50QWNjZXB0ZWQoQ3VzdG9tQ2F0ZWdvcnkgb2JqLAotCQkJSGFzaFNldCBsaXN0KSB7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlzdCBlbGVtZW50cyA9IG9iai5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKGxpc3QuY29udGFpbnMob2JqZWN0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJYW55Q2F0ZWdvcml6ZWRFbGVtZW50QWNjZXB0ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QsIGxpc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8qKgotCSAqIERpc3BsYXkgY29udHJpYnV0aW9uIHNlbGVjdGlvbiBkaWFsb2cgd2hpY2ggbGlzdHMgZWxlbWVudHMgYW5kIGl0J3MKLQkgKiBjb250cmlidXRvcnMuCi0JICovCi0JcHVibGljIENvbnRyaWJ1dGlvblNlbGVjdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBJdCBzaG93cyBkaWFsb2cgYm94IGZvciBhbGwgdGhlIGNvbnRyaWJ1dG9ycy4gVXNlciBpcyBleHBlY3RlZCB0byBzZWxlY3QKLQkgKiBvbmUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAJCQlFbGVtZW50IGZvciB3aGljaCBjb250cmlidXRvciBhcmUgc2hvd24KLQkgKiBAcmV0dXJuCi0JICogCQkJU2VsZWN0ZWQgY29udHJpYnV0b3IKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJZmlsdGVyRWxlbWVudExpc3QgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLy8gZ2V0IGxpc3Qgb2YgY29udHJpYnV0b3JzCi0JCUxpc3QgY29udHJpYnV0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCS5nZXRDb250cmlidXRvcnMoZWxlbWVudCwgY29uZmlnKTsKLQkJaWYgKChjb250cmlidXRvcnMgIT0gbnVsbCkgJiYgKCFjb250cmlidXRvcnMuaXNFbXB0eSgpKSkgewotCQkJLy8gY2xlYXIgdGhlIGFycmF5Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkvLyBhZGQgZWxlbWVudCBhbmQgaXQncyBjb250cmlidXRvcnMKLQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChjb250cmlidXRvcnMpOwotCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGVsZW1lbnRMaXN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXRvci5uZXh0KCk7Ci0JCQkJTGlzdCBncm91cGluZ3MgPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBlKTsKLQotCQkJCX0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQkJZ3JvdXBpbmdzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgZSk7Ci0JCQkJfQotCi0JCQkJaWYgKChncm91cGluZ3MgIT0gbnVsbCkgJiYgKCFncm91cGluZ3MuaXNFbXB0eSgpKSkKLQkJCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGdyb3VwaW5ncyk7Ci0KLQkJCX0KLQotCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQ29udHJpYnV0aW9uRmlsdGVyKCk7Ci0JCQkvLyBJdGVtc0ZpbHRlckRpYWxvZyBkbGcgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJLy8gLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkvLyBmaWx0ZXIsIG51bGwsIEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UKTsKLQkJCS8vIGRsZy5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW10geyBGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCB9OwotCQkJQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nIGRsZyA9IG5ldyBDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2coCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQlkbGcuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlkbGcuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQpOwotCQkJZGxnLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCWRsZy5zZXRUeXBlcyhzdHIpOwotCQkJZGxnLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJZGxnLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikpLAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCi0JCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZSwgCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgZWxlbWVudC5nZXROYW1lKCkgfSk7Ci0KLQkJCWRsZy5zZXRUaXRsZSh0aXRsZSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCi0JCQlMaXN0IHJlc3VsdCA9IGRsZy5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQlpZiAoKHJlc3VsdCA9PSBudWxsKSB8fCAocmVzdWx0LmlzRW1wdHkoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHJlc3VsdC5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRGlhbG9nSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRGlhbG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTFkNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0RpYWxvZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzQWN0aXZpdHlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5WYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5WYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gY29sbGVjdCBpbnB1dCBkYXRhIGZyb20gdXNlcnMgdXNpbmcgZGlhbG9nIGJveGVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhbG9nSGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RFbGVtZW50c0ZvcihCcmVha2Rvd25FbGVtZW50IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0YWJOYW1lKSB7Ci0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZmlsdGVyLCB0YWJOYW1lLCBudWxsLAotCQkJCWNvbmZpZyk7Ci0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUoZmFsc2UpOwotCQlmZC5zZXRUaXRsZSh0YWJOYW1lKTsKLQkJZmQub3BlbigpOwotCQlyZXR1cm4gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RUYXNrc0ZvcihBY3Rpdml0eSBhY3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBWYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuVEFTS1MsIGFjdCk7Ci0KLQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKGFjdCwgZmlsdGVyLCBjb25maWcsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RFbGVtZW50c0ZvcihPYmplY3Qgb2JqZWN0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcmV0dXJuIHNlbGVjdFRhc2tzRm9yKChBY3Rpdml0eSkgb2JqZWN0LCBjb25maWcpOwotCQkJfSBlbHNlIGlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTLCAoQWN0aXZpdHkpIG9iamVjdCk7Ci0JCQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QsIGZpbHRlciwKLQkJCQkJCWNvbmZpZywgdGFiTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKAotCQkJCQkJY29uZmlnLCBudWxsLCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLAotCQkJCQkJKEFjdGl2aXR5KSBvYmplY3QpOwotCQkJCXJldHVybiBzZWxlY3RFbGVtZW50c0ZvcigoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBmaWx0ZXIsCi0JCQkJCQljb25maWcsIHRhYk5hbWUpOwotCQkJfQotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlyZXR1cm4gc2VsZWN0RWxlbWVudHNGb3IoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCwgZmlsdGVyLAotCQkJCQkJY29uZmlnLCB0YWJOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RBY3Rpdml0aWVzRm9yKEFjdGl2aXR5IGFjdCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgY29tbWFuZCkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzQWN0aXZpdHlGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCUZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVMsIGFjdCwgY29tbWFuZCk7Ci0JCUxpc3Qgc2VsZWN0aW9uID0gc2VsZWN0RWxlbWVudHNGb3IoYWN0LCBmaWx0ZXIsIGNvbmZpZywgdGFiTmFtZSk7Ci0JCUFycmF5TGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJYWN0aXZpdGllcy5hZGQocHJvYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpdml0aWVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMTNkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0KLQotLyoqCi0gKiBBIHtAbGluayBJdGVtc0ZpbHRlckRpYWxvZ30gZGlhbG9nIHZpZXdlciBzb3J0ZXIgdG8gb3JkZXIgdGhlIGRpc3BsYXkgZm9yIGNlcnRhaW4gZWxlbWVudCBhbmQgcGFja2FnZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCXB1YmxpYyBGaWx0ZXJTb3J0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsYXRvcgotCSAqLwotCXB1YmxpYyBGaWx0ZXJTb3J0ZXIoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoY29sbGF0b3IpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgfHwgIShlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0JCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQotCQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0JCX0KLQotCQlpZiAoZTEgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gJiYgZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUxOwotCQlTdHJpbmcgbmFtZTI7Ci0KLQkJaWYgKHZpZXdlciA9PSBudWxsIHx8ICEodmlld2VyIGluc3RhbmNlb2YgQ29udGVudFZpZXdlcikpIHsKLQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCW5hbWUyID0gZTIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCUlCYXNlTGFiZWxQcm92aWRlciBwcm92ID0gKChDb250ZW50Vmlld2VyKSB2aWV3ZXIpCi0JCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAocHJvdiBpbnN0YW5jZW9mIElMYWJlbFByb3ZpZGVyKSB7Ci0JCQkJSUxhYmVsUHJvdmlkZXIgbHByb3YgPSAoSUxhYmVsUHJvdmlkZXIpIHByb3Y7Ci0JCQkJbmFtZTEgPSBscHJvdi5nZXRUZXh0KGUxKTsKLQkJCQluYW1lMiA9IGxwcm92LmdldFRleHQoZTIpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lMSA9IGUxLnRvU3RyaW5nKCk7Ci0JCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWlmIChuYW1lMSA9PSBudWxsKQotCQkJbmFtZTEgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChuYW1lMiA9PSBudWxsKQotCQkJbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3Ijc29ydChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgVmlld2VyIHZpZXdlciwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJQXJyYXlzLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiBGaWx0ZXJTb3J0ZXIudGhpcy5jb21wYXJlKHZpZXdlciwgYSwgYik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlckZvckFsbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlckZvckFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGEyYTY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXJGb3JBbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0KLS8qKgotICogQSBGaWx0ZXIgc29ydGVyIGZvciB7QGxpbmsgSXRlbXNGaWx0ZXJEaWFsb2d9IHVzaW5nIHtAbGluayBBbGxGaWx0ZXJ9Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclNvcnRlckZvckFsbCBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQlwdWJsaWMgRmlsdGVyU29ydGVyRm9yQWxsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsYXRvcgotCSAqLwotCXB1YmxpYyBGaWx0ZXJTb3J0ZXJGb3JBbGwoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoY29sbGF0b3IpOwotCX0KLQotCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQotCQlpZiAoIShlMSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fCAhKGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJfQotCi0JCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiAmJiBlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgfHwgIShlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZTE7Ci0JCVN0cmluZyBuYW1lMjsKLQotCQlpZiAodmlld2VyID09IG51bGwgfHwgISh2aWV3ZXIgaW5zdGFuY2VvZiBDb250ZW50Vmlld2VyKSkgewotCQkJbmFtZTEgPSBlMS50b1N0cmluZygpOwotCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJSUJhc2VMYWJlbFByb3ZpZGVyIHByb3YgPSAoKENvbnRlbnRWaWV3ZXIpIHZpZXdlcikKLQkJCQkJLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92IGluc3RhbmNlb2YgSUxhYmVsUHJvdmlkZXIpIHsKLQkJCQlJTGFiZWxQcm92aWRlciBscHJvdiA9IChJTGFiZWxQcm92aWRlcikgcHJvdjsKLQkJCQluYW1lMSA9IGxwcm92LmdldFRleHQoZTEpOwotCQkJCW5hbWUyID0gbHByb3YuZ2V0VGV4dChlMik7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCQluYW1lMiA9IGUyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5hbWUxID09IG51bGwpCi0JCQluYW1lMSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKG5hbWUyID09IG51bGwpCi0JCQluYW1lMiA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFZpZXdlciB2aWV3ZXIsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCUFycmF5cy5zb3J0KGVsZW1lbnRzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gRmlsdGVyU29ydGVyRm9yQWxsLnRoaXMuY29tcGFyZSh2aWV3ZXIsIGEsIGIpOwotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvSXRlbXNGaWx0ZXJEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JdGVtc0ZpbHRlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFmZGIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JdGVtc0ZpbHRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSVByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLmNvcmUudGV4dC5QYXR0ZXJuQ29uc3RydWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBGaWx0ZXIgRGlhbG9nIC0gYWxsb3cgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSBjb250ZW50IGVsZW1lbnQsIGNvbnRlbnQKLSAqIGNhdGVnb3JpZXMsIGN1c3RvbSBjYXRlZ29yaWVzLCBBbGwgdHlwZXMgb2YgY29udGVudGVsZW1lbnRzIGJhc2VkIG9uIGxvY2F0aW9uIG9mIHRoZSB1c2Ugb2YgdGhlIGZpbHRlcgotICogZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1zRmlsdGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9wYXR0ZXJuLCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuLCBmaWx0ZXJUeXBlU3RyOwotCi0JcHJvdGVjdGVkIENvbWJvIGZpbHRlclR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSwgdGFiU3RyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmlld2VyTGFiZWwgPSBudWxsOwotCQotCS8qCi0JICogVHJlZXZpZXdlciBmb3IgQ29udGVudEVsZW1lbnRzIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0QWRhcHRlcigoTWV0aG9kUGx1Z2luKW9iamVjdCwgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5nZXRGdWxsTmFtZShvYmplY3QpOwotCQkJCX0KLQkJCX0gCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJcmV0dXJuIGdldFRleHQob2JqZWN0KTsKLQkJfQotCQkKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCS8qCi0JICogRGlhbG9nIEF0dHJpYnV0ZXMKLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRzID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlQYXR0ZXJuIHJlZ2V4UGF0dGVybjsKLQotCS8vIHByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQgPSAiLkxFVkVMX0lEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFBBVFRFUk5fSUQgPSAiLlBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgVFlQRV9JRCA9ICIuVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIERJQUxPR19OQU1FOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwYW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29sbGFwc2VCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCXByaXZhdGUgU3RyaW5nW10gdHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBmaWx0ZXIgYmFzZWQgb24KLQkgKiB0YWJTdHIsIGZpbHRlcnMgb3V0IHRoZSBsaXN0IG9mIGVsZW1lbnRzIGJhc2VkIG9uIGFscmVhZHkgZXhpc3RpbmcKLQkgKiBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBzZWxlY3RlZCB0YWJsZS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBjb250ZW50RWxlbWVudCwKLQkJCVN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdGFiU3RyLAotCQkJTGlzdCBhbHJlYWR5RXhpc3RzLCBPYmplY3QgaW5wdXQpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZmlsdGVyLCBudWxsLCB0YWJTdHIsIGFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLgotCSAqIHRhYlN0ciBpcyB1c2VkIGZvciB0aGUgc2VhcmNodHlwZSBvbmx5LiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCWFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gT25seSBmb3IgbWV0aG9kY29uZmlndXJhdGlvbi4gVGhpcwotCSAqIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIgZm9yCi0JICogdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JLy8gcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uLCBTdHJpbmcgdGFiU3RyKSB7Ci0JLy8gc3VwZXIocGFyZW50U2hlbGwpOwotCS8vIHRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkvLyB0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkvLyB0aGlzLmZpbHRlciA9IG51bGw7Ci0JLy8gdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQkvLyBoZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsIG51bGwpOwotCS8vIGluaXRQcm92aWRlckZvclRhYnMoKTsKLQkvLyB9Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB2ZXJ5IGdlbmVyaWMsIGluIG9yZGVyIHRvIGluaXRpYWxpemUgZmlsdGVyLCBpbnB1dAotCSAqIGFuZCBjb250ZW50cHJvdmlkZXIgc2hvdWxkIGJlIGhhbmRsZWQgZXhwbGljaXRseSBieSBjYWxsaW5nIGJlbG93IG1ldGhvZC4KLQkgKiBzZXRGaWx0ZXIoSUZpbHRlcikgc2V0SW5wdXQoT2JqZWN0KQotCSAqIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZFByb3ZpZGVyKQotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlzYXZlVmFsdWVzKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIGNhbmNlbCBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCSAgICBpZiAodHJlZUpvYiAhPSBudWxsKSB7Ci0JICAgIAl0cmVlSm9iLmNhbmNlbCgpOwotCSAgICB9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkgICAgaWYgKHRyZWVKb2IgIT0gbnVsbCkgewotCSAgICAJdHJlZUpvYi5jYW5jZWwoKTsKLQkgICAgfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGl0bGUgZm9yIGRpYWxvZyBib3ggZWc6IFNlbGVjdCBEaWFsb2cgRm9yIFJvbGUsIGRpYWxvZ1RpdGxlIG5lZWRzIHRvCi0JICogIlJvbGUiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAoZGlhbG9nVGl0bGUgPT0gbnVsbCkKLQkJCWRpYWxvZ1RpdGxlID0gdGFiU3RyOwotCQlzaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ190aXRsZSArIGRpYWxvZ1RpdGxlKTsgCi0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKSBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWxvZyBhcmVhIGFuZCBjb250cm9scyBhbmQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgdHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl7Ci0JCQl0eXBlTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0KTsgCi0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdEMSk7Ci0KLQkJfQotCQlmaWx0ZXJUeXBlID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQl7Ci0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdEMS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlnRDEud2lkdGhIaW50ID0gMzkwOwotCQkJZmlsdGVyVHlwZS5zZXRMYXlvdXREYXRhKGdEMSk7Ci0JCX0KLQotCQlpZiAodHlwZXMgPT0gbnVsbCkgewotCQkJZmlsbEZpbHRlclR5cGVDb21ibygpOwotCQl9IGVsc2UgewotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyh0eXBlcyk7Ci0JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKDApOwotCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGUuZ2V0SXRlbSgwKSk7Ci0JCQkJaWYgKHRhYlN0ciA9PSBudWxsKSB7Ci0JCQkJCXRhYlN0ciA9IGZpbHRlclR5cGVTdHI7Ci0JCQkJCWhlbHBlci5zZXRUYWJTdHIodGFiU3RyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmlsdGVyVHlwZS5zZWxlY3QoMCk7Ci0KLQkJTGFiZWwgY3RybF9wYXR0ZXJuTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCWN0cmxfcGF0dGVybkxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCk7IAotCQkJR3JpZERhdGEgZ0QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdELmhvcml6b250YWxTcGFuID0gMzsKLQkJCWN0cmxfcGF0dGVybkxhYmVsLnNldExheW91dERhdGEoZ0QpOwotCQl9Ci0KLQkJY3RybF9wYXR0ZXJuID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ0QxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wYXR0ZXJuLnNldExheW91dERhdGEoZ0QxKTsKLQkJCWN0cmxfcGF0dGVybi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQluZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQgKyAgCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb24pKTsKLQkJfQotCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCXsKLQkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKTsgCi0JCQlHcmlkRGF0YSBnRCA9IG5ldyBHcmlkRGF0YShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlLCBmYWxzZSwgMywgMSk7Ci0JCQlnRC53aWR0aEhpbnQgPSA1NTA7Ci0JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0TGF5b3V0RGF0YShnRCk7Ci0JCX0KLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsJCQotCQkKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbnNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlidXR0b25zTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlidXR0b25zTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uc0xheW91dCk7Ci0JCQotCQlleHBhbmRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5CVVRUT04xKTsKLQotCQlleHBhbmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJleHBhbmRhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKTsgCi0JCQotCQlleHBhbmRCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0V4cGFuZEFsbCkpOwkJCi0KLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCi0JCWV4cGFuZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLQkJY29sbGFwc2VCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJY29sbGFwc2VCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJjb2xsYXBzZWFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGwpOyAKLQkJY29sbGFwc2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCkpOwotCQkKLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0JCWNyZWF0ZVZpZXdlckxhYmVsKGNvbXBvc2l0ZSk7Ci0JCS8vIGNyZWF0ZSBhIHRyZWV2aWV3ZXIgYXJlYS4KLQkJY3JlYXRlVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQkJcmVzdG9yZUxhc3RTZXR0aW5ncygpOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uKTsgCi0JCWN0cmxfYnJpZWZfZGVzYyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdkLmhlaWdodEhpbnQgPSA2MDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQkvLyBSZXN0b3JlIHRoZSBsYXN0IHN0YXRlCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQotCQkvLyBSZXR1cm4gcmVzdWx0cy4KLQkJYWRkTGlzdGVuZXIoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmlld2VyIGluIHRoZSBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAodmlld2VyU2VsZWN0aW9uU2luZ2xlKSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQotCQkvLyBTZXQgdGhlIGlucHV0IHRvIHRyZWVWaWV3ZXIKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChnZXRJbnB1dCgpKTsKLQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCWlmICh0YWJTdHIuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKSkgeyAKLQkJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBGaWx0ZXJTb3J0ZXJGb3JBbGwoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyKCkpOwotCQl9Ci0KLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl7Ci0JCQlzcGVjLndpZHRoSGludCA9IDMwMDsKLQkJCXNwZWMuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXNwZWMuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5wdXQgaWYgZXh0ZXJuYWxseSBzZXQgYnkgc2V0SW5wdXQgaW52b2tlci4KLQkgKiBFbHNlLCBjYWxjdWxhdGVzIHRoZSBpbnB1dCBiYXNlZCBvbiB0aGUgT2JqZWN0IHNldCB0byB0aGUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldElucHV0KCl7Ci0JCWlmKGlucHV0ICE9IG51bGwpewotCQkJcmV0dXJuIGlucHV0OwotCQl9ZWxzZXsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpY29udGVudEVsZW1lbnQ7Ci0JCQkJCQlpZiAocHJvY2Vzcy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJaWYgKCEodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpCi0JCQkJCQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKSAKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkpIHsKLQkJCQkJCQlyZXR1cm4gcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlyZXR1cm4gcHJvY2VzczsKLQkJCQkJCX0KLQkJCQl9IAotCQkJCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0gCi0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXJMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAJCWlmICh2aWV3ZXJMYWJlbCAhPSBudWxsKSB7Ci0gICAJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodmlld2VyTGFiZWwpOwotICAgCQl9Ci0gICAJfQotCQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNlbGVjdGlvblNpbmdsZShib29sZWFuIHNpbmdsZSkgewotCQl2aWV3ZXJTZWxlY3Rpb25TaW5nbGUgPSBzaW5nbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyI2RvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlPYmplY3QgZWxlbWVudCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlzZWxlY3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQl9IAotCQlzYXZlTGFzdFNldHRpbmdzKCk7Ci0JCWNsb3NlKCk7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlhbG9nIHN0b3JlIHRvIGNhY2hlIHZhbHVlcyBpbnRvCi0JICovCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSAoRGlhbG9nU2V0dGluZ3MpIEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gKERpYWxvZ1NldHRpbmdzKSBkaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKERJQUxPR19OQU1FICsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQpOwotCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotCQkJc2VjdGlvbiA9IChEaWFsb2dTZXR0aW5ncykgZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihESUFMT0dfTkFNRQotCQkJCQkrIFNUT1JFX0VYUEFOREVEX0xFVkVMX0lEKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBkaWFsb2cgc2V0dGluZ3MgdG8gcmVzdG9yZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGV5Ci0JICogaGVsZCBsYXN0IHRpbWUgdGhpcyBkaWFsb2cgd2FzIHVzZWQgdG8gY29tcGxldGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlTGFzdFNldHRpbmdzKCkgewotCQlESUFMT0dfTkFNRSA9IHRhYlN0cjsKLQkJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSAoRGlhbG9nU2V0dGluZ3MpIGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCVN0cmluZyB0ZW1wID0gZGlhbG9nU2V0dGluZ3MuZ2V0KERJQUxPR19OQU1FICsgUEFUVEVSTl9JRCk7IAotCQlpZiAodGVtcCAhPSBudWxsICYmIHRlbXAubGVuZ3RoKCkgPiAwKSB7IAotCQkJcGF0dGVybiA9IGRpYWxvZ1NldHRpbmdzLmdldChESUFMT0dfTkFNRSArIFBBVFRFUk5fSUQpOyAKLQkJCWZpbHRlclR5cGVTdHIgPSBkaWFsb2dTZXR0aW5ncy5nZXQoRElBTE9HX05BTUUgKyBUWVBFX0lEKTsgCi0JCQlmaWx0ZXJUeXBlLnNldFRleHQoZmlsdGVyVHlwZVN0cik7Ci0JCQlyZWdleFBhdHRlcm4gPSBnZXRSZWdFeChwYXR0ZXJuKTsKLQkJCQotCQkJLy9UcmltICIqIiBmcm9tIHBhdHRlcm4gc3RyaW5nIGJlZm9yZSBkaXNwbGF5LiBUaGlzIGFjdGlvbiBpcyBqdXN0IGZvciBkaXNwbGF5LgotLy8JCQlpZihwYXR0ZXJuICE9IG51bGwpewotLy8JCQkJaWYocGF0dGVybi5sYXN0SW5kZXhPZihGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORykgCi0vLwkJCQkJCT09IHBhdHRlcm4ubGVuZ3RoKCktMSl7Ci0vLwkJCQkJcGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyaW5nKDAsIHBhdHRlcm4ubGVuZ3RoKCktMSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWN0cmxfcGF0dGVybi5zZXRUZXh0KHBhdHRlcm4pOwotCQkJCi0JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQloZWxwZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCQloZWxwZXIuc2V0UmVnZXhQYXR0ZXJuKHJlZ2V4UGF0dGVybik7Ci0JCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQl9Ci0JCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0KLQkJfQotCQlMaXN0IGVsZW1lbnRzID0gKExpc3QpIEZpbHRlckNvbnN0YW50cy5oYXNoTWFwLmdldChESUFMT0dfTkFNRQotCQkJCSsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiAhZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQl0cnkgewotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhlbGVtZW50cy50b0FycmF5KCkpOwotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZVRyZWUoVHJlZUl0ZW1bXSBpdGVtcywgTGlzdCBsaXN0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtW10gaXRlbXN4ID0gaXRlbXNbaV0uZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtc3gubGVuZ3RoID4gMSkgewotCQkJCWxpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJdHJhdmVyc2VUcmVlKGl0ZW1zeCwgbGlzdCk7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBPSyB3YXMgcHJlc3NlZCwgd3JpdGUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgZGlhbG9nIHN0b3JlIHNvIHRoYXQKLQkgKiB0aGV5IHdpbGwgcGVyc2lzdCBpbnRvIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVmFsdWVzKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0W10gb2JqZWN0QXJyID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3RBcnJbaV0pOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCAKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MgCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlzZWxlY3RlZExpc3QuYWRkKG9iaik7Ci0JCQkJfSAKLQkJCX0KLQkJfQotCQlzYXZlTGFzdFNldHRpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGxhc3Qgc2V0dGluZ3Mgb2YgZGlhbG9nLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVMYXN0U2V0dGluZ3MoKSB7Ci0KLQkJLy8gZWNsaXBzZSBkb2NzIGZvcklEaWFsb2dTZXR0aW5ncyBmb3IgdW5kZXJzdGFuZGluZy4KLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJRElBTE9HX05BTUUgPSB0YWJTdHI7Ci0JCU9iamVjdFtdIGV4cGFuZGVkRWxlbWVudHMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJTGlzdCBleHBhbmRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBTdHJpbmdbXSBleHBhbmRlZENhdGVnb3J5SWRzID0gbmV3IFN0cmluZ1tleHBhbmRlZEVsZW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwYW5kZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGV4cGFuZGVkRWxlbWVudHNbaV07Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJZXhwYW5kTGlzdC5hZGQoZXhwYW5kZWRFbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJc2V0dGluZ3MucHV0KERJQUxPR19OQU1FICsgUEFUVEVSTl9JRCwgcGF0dGVybik7Ci0JCXNldHRpbmdzLnB1dChESUFMT0dfTkFNRSArIFRZUEVfSUQsIGZpbHRlclR5cGVTdHIpOwotCQlGaWx0ZXJDb25zdGFudHMuaGFzaE1hcC5wdXQoRElBTE9HX05BTUUgKyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCwKLQkJCQlleHBhbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBldmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJdXBkYXRlU2VsZWN0aW9uKGV2ZW50KTsKLQkJdXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYnV0dG9uIGVuYWJsZW1lbnQgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJLy8gb2tCdXR0b24uc2V0RW5hYmxlZChnZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudE9iamVjdChPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBBcnJheUxpc3QgZGVzY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgfHwKLQkJCQlzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpewotCQkJT2JqZWN0IHVud3JhcCA9ICBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKHVud3JhcCk7Ci0JCX1lbHNlIHsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oc2VsZWN0ZWQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gdG8gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxGaWx0ZXJUeXBlQ29tYm8oKSB7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuT05MWV9DT05URU5UX0VMRU1FTlRTLmVxdWFscyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmcgc3BhY2UgPSAiLSI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMjZdOwotCQkJaW50IGkgPSAwOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5SRVBPUlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUk9BRE1BUDsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuRE9NQUlOUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlRPT0xTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5jYXRlZ29yeVN0cnMuY29udGFpbnModGFiU3RyKSkgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1syXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCXN0clsxXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMuZXF1YWxzSWdub3JlQ2FzZSh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzJdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJc3RyWzFdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5icmVha2Rvd25FbGVtZW50cy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuY29udGVudEVsZW1lbnRTdHJzLmNvbnRhaW5zKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbM107Ci0JCQlzdHJbMF0gPSB0YWJTdHI7Ci0JCQlzdHJbMV0gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJCXN0clsyXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTLmVxdWFscyh0YWJTdHIpKSB7IC8vIDE3Mjk1NgotCQkJU3RyaW5nIHNwYWNlID0gIi0iOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzI4XTsKLQkJCWludCBpID0gMDsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5DT05DRVBUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUkVQT1JUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlJPQURNQVA7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5UT09MUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQuZXF1YWxzKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgbG9uZyBkZWxheSA9IDgwMDsKLQkKLQlwcml2YXRlIGNsYXNzIFVwZGF0ZVRyZWVKb2IgZXh0ZW5kcyBKb2IgewotCi0JCXB1YmxpYyBVcGRhdGVUcmVlSm9iKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCS8vIG5lZWQgdG8gcnVuIHRoaXMgaW4gVUkgdGhyZWFkCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAodHJlZVZpZXdlciA9PSBudWxsIHx8IAotCQkJCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpID09IG51bGwgfHwKLQkJCQkJCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQl0cmVlVmlld2VyLmdldFRyZWUoKS5jbGVhckFsbCh0cnVlKTsKLQkJCQkJaWYgKGN0cmxfcGF0dGVybi5nZXRUZXh0KCkgIT0gbnVsbAotCQkJCQkJCSYmIGN0cmxfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJcGF0dGVybiA9IGN0cmxfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpOwotCQkJCQkJLy8gaWYocGF0dGVybi5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HKT4gLTEKLQkJCQkJCS8vIHx8IHBhdHRlcm4uaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuQU5ZX0NIQVJBQ1RFUikgPgotCQkJCQkJLy8gLTEpewotCQkJCQkJLy8gICAgICAgICAgICAgIAotCQkJCQkJLy8gfWVsc2V7Ci0JCQkJCQkvLyBwYXR0ZXJuID0gcGF0dGVybitGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORzsKLQkJCQkJCS8vIH0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdHRlcm4gPSBGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORzsKLQkJCQkJCS8vIHJldHVybjsKLQkJCQkJfQotCQkJCQlyZWdleFBhdHRlcm4gPSBnZXRSZWdFeChwYXR0ZXJuKTsKLQkJCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQkJCQloZWxwZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCQkJCWhlbHBlci5zZXRSZWdleFBhdHRlcm4ocmVnZXhQYXR0ZXJuKTsKLQkJCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCQkJaGVscGVyLnNldFRhYlN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoVHJlZVZpZXdlcigpOwotCQkJCX0KLQotCQkJfSk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgVXBkYXRlVHJlZUpvYiB0cmVlSm9iID0gbmV3IFVwZGF0ZVRyZWVKb2IoQXV0aG9yaW5nVUlSZXNvdXJjZXMuSXRlbXNGaWx0ZXJEaWFsb2dfVXBkYXRlVHJlZUpvYl9uYW1lKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcigpIHsKLQkJY3RybF9wYXR0ZXJuLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQotCQkJICBpZiAodHJlZUpvYi5nZXRTdGF0ZSgpID09IEpvYi5OT05FKSB7Ci0JCQkgICAgLy8gV2Ugc2hvdWxkIHNjaGVkdWxlIHRoZSBqb2IgdG8gcnVuCi0JCQkgICAgdHJlZUpvYi5zY2hlZHVsZShkZWxheSk7Ci0JCQkgIH0gZWxzZSBpZiAodHJlZUpvYi5nZXRTdGF0ZSgpID09IEpvYi5XQUlUSU5HIHx8Ci0JCQkJCSAgdHJlZUpvYi5nZXRTdGF0ZSgpID09IEpvYi5TTEVFUElORyl7Ci0JCQkgICAgLy8gQ2FuY2VsIHRoZSBwcmV2aW91cyBqb2IsIGFuZCByZXNjaGVkdWxlCi0JCQkgICAgdHJlZUpvYi5jYW5jZWwoKTsKLQkJCSAgICB0cmVlSm9iLnNjaGVkdWxlKGRlbGF5KTsKLQkJCSAgfQotCQkJfQotCQl9KTsKLQotCQlmaWx0ZXJUeXBlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyB1cGRhdGVGb250TGlzdCgpOwotCQkJCWlmIChmaWx0ZXJUeXBlLmdldFNlbGVjdGlvbkluZGV4KCkgPiAtMSkgewotCQkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKGZpbHRlclR5cGUKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJfQotCQkJCWZpbHRlclR5cGVTdHIudHJpbSgpOwotCQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCQloZWxwZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCQkJaGVscGVyLnNldFJlZ2V4UGF0dGVybihyZWdleFBhdHRlcm4pOwotCQkJCQloZWxwZXIuc2V0RmlsdGVyVHlwZVN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQkJaGVscGVyLnNldFRhYlN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQl9Ci0JCQkJLy8gaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25ldmVudCkgewotCQkJfQotCQl9KTsKLQkJZXhwYW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkJCQkKLQkJCQlleHBhbmRPckNvbGxhcHNlKHRydWUpOwotCQkJfQotCQl9KTsKLQkJY29sbGFwc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhwYW5kT3JDb2xsYXBzZShmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRTZWxlY3RlZEl0ZW1zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJGb3JUYWJzKCkgewotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcil7Ci0JCQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbnRlbnRjYXRlZ29yeS4KLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQ1MgotCQkJCQloZWxwZXIuc2V0Q29udGVudENhdGVnb3J5VGFiU3RyKHRhYlN0cik7Ci0JCQkJfQotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX1lbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIHsKLQkJCQkoKEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSVByb2Nlc3NGaWx0ZXIpIHsKLQkJCWlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9VG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7Ci0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSBlbHNlIGlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKXsKLQkJCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9IGVsc2UgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7IAotCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ0VsZW1lbnRzKExpc3QgbGlzdCkgewotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBsaXN0OwotCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCWhlbHBlci5zZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KGxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIEZpbHRlckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiB0aGlzLmhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZUFycmF5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHNldHMgdGhlIENvbnRlbnRQcm92aWRlciB1c2VkIGJ5IFRyZWVWaWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLQkJdGhpcy5jb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIFBhc3NpbmcgU3RyaW5nW10gYXJyYXkgZmlsbHMgdGhlIEZpbHRlclR5cGUgbGlzdCBpbiBkcm9wZG93biBjb21ibyBib3guCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZXMoU3RyaW5nW10gc3RyKSB7Ci0JCXRoaXMudHlwZXMgPSBzdHI7Ci0JfQotCi0JLyoKLQkgKiBzZXQgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHRoaXMuZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgdGhpcy5maWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJMYWJlbChTdHJpbmcgdmlld2VyTGFiZWwpIHsKLQkJdGhpcy52aWV3ZXJMYWJlbCA9IHZpZXdlckxhYmVsOwotCX0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKCl7Ci0JCXRyeSB7Ci0JCQkvLyBUbyBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIGZpbHRlciwgZmlsdGVyIGZpcnN0IGFuZCByZXNldCB2aXNpYmxlIHRvCi0JCQkvLyB0cnVlLlRoaXMgd2lsbCBhdm9pZCB0aGUgZmxpY2tlcmluZyBpbiBVSSBhdCB0aW1lIG9mIGZpbHRlcmluZwotCQkJLy8gZWxlbWVudHMgaW4gdGhlIHRyZWUgc3RydWN0dXJlCi0JCQkKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmNsZWFyQWxsKHRydWUpOwotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZXhwYW5kT3JDb2xsYXBzZShib29sZWFuIGV4cGFuZCl7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQlpZihleHBhbmQpewotCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJfWVsc2V7Ci0JCQl0cmVlVmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQYXR0ZXJuIGdldFJlZ0V4KFN0cmluZyBwYXR0ZXJuKXsKLQkJdHJ5ewotCQkJcmV0dXJuIFBhdHRlcm5Db25zdHJ1Y3Rvci5jcmVhdGVQYXR0ZXJuKHBhdHRlcm4sIGZhbHNlLCBmYWxzZSk7Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlyZXR1cm4gUGF0dGVybkNvbnN0cnVjdG9yLmNyZWF0ZVBhdHRlcm4oRmlsdGVyQ29uc3RhbnRzLkFOWV9TVFJJTkcsIGZhbHNlLCBmYWxzZSk7IAotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRJbWFnZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZEltYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTgwNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZEltYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRJbWFnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgaW1hZ2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgSFRNTAotICogPGltZz4gdGFnIGluIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkSW1hZ2VEaWFsb2cgZXh0ZW5kcyBBZGRJbWFnZURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hFSUdIVCA9IDYwMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0lEVEggPSA2MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQgPSAyMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDIwMDsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJpdmF0ZSBGaWxlIGZpbGVUb0NvcHk7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TG9jOwotCi0JcHJpdmF0ZSBpbnQgaGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7Ci0KLQlwcml2YXRlIGludCB3aWR0aCA9IERFRkFVTFRfV0lEVEg7Ci0KLQlwcml2YXRlIFN0cmluZyBhbHRUYWcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGhlaWdodFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgd2lkdGhUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGFsdFRhZ1RleHQ7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChldmVudC53aWRnZXQgPT0gdXJsVGV4dCkgewotCQkJCQkJRmlsZSB1cmxGaWxlID0gbmV3IEZpbGUodXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJCWlmICh1cmxGaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCQkJCWZpbGVUb0NvcHkgPSB1cmxGaWxlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmaWxlVG9Db3B5ID0gbmV3IEZpbGUoZWxlbWVudExvYywgdXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChmaWxlVG9Db3B5LmlzRmlsZSgpICYmIGZpbGVUb0NvcHkuY2FuUmVhZCgpKSB7Ci0JCQkJCQkJLy8gVHJ5IHRvIGdldCB0aGUgaW1hZ2UgaW5mby4KLQkJCQkJCQlzZXRJbWFnZUluZm8oZmlsZVRvQ29weS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaGVpZ2h0ID0gSW50ZWdlci5wYXJzZUludChoZWlnaHRUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQl3aWR0aCA9IEludGVnZXIucGFyc2VJbnQod2lkdGhUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZpbGVUb0NvcHkuaXNGaWxlKCkgJiYgZmlsZVRvQ29weS5jYW5SZWFkKCkgJiYgaGVpZ2h0ID4gMAotCQkJCQkJCSYmIHdpZHRoID4gMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgdGhlIGFib3ZlIGZhaWxzLCBsZXQgdGhlIHVzZXIgY2xpY2sgb2sgaWYgdGhlIGZpbGUgaXMgcmVhZGFibGUKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmaWxlVG9Db3B5LmlzRmlsZSgpICYmIGZpbGVUb0NvcHkuY2FuUmVhZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNoZWxsLgotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RBZGRJbWFnZURpYWxvZyhTaGVsbCBwYXJlbnQsIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50OwotCQllbGVtZW50TG9jID0gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKG1ldGhvZEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQmFzZURpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZQotCSAqICAgICAgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCSgoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gNDsKLQkJKChHcmlkRGF0YSkgdXJsVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQl1cmxUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKHVybFRleHRMaXN0ZW5lcik7Ci0JCXVybFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCWJyb3dzZUJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihicm93c2VTZWxlY3Rpb25BZGFwdGVyKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChtZXRob2RFbGVtZW50KSk7Ci0JCQkJU3RyaW5nIGF0dGFjaEZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChhdHRhY2hGaWxlICE9IG51bGwgJiYgYXR0YWNoRmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCksIGRpYWxvZwotCQkJCQkJCQkuZ2V0RmlsZU5hbWUoKSk7Ci0JCQkJCQl1cmxUZXh0LnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUxhYmVsIGhlaWdodExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQloZWlnaHRMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmhlaWdodExhYmVsX3RleHQpOyAKLQotCQloZWlnaHRUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJaGVpZ2h0VGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJaGVpZ2h0VGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9IRUlHSFQpOyAvLyROT04tTkxTLTEkCi0JCWhlaWdodFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIGltYWdlU2l6ZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ2QudmVydGljYWxTcGFuID0gMjsKLQkJCWdkLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJCWltYWdlU2l6ZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCWltYWdlU2l6ZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW1hZ2VTaXplTGFiZWxfdGV4dCk7IAotCi0JCUxhYmVsIHdpZHRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdpZHRoTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy53aWR0aExhYmVsX3RleHQpOyAKLQotCQl3aWR0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl3aWR0aFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXdpZHRoVGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9XSURUSCk7IC8vJE5PTi1OTFMtMSQKLQkJd2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBhbHRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYWx0TGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5hbHRUYWdMYWJlbF90ZXh0KTsgCi0JCWFsdFRhZ1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJYWx0VGFnVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQlhbHRUYWdUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlhbHRUYWcgPSBhbHRUYWdUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSB0byBiZSBjb3BpZWQgdG8gYSByZXNvdXJjZSBmb2xkZXIuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZVRvQ29weSgpIHsKLQkJcmV0dXJuIGZpbGVUb0NvcHk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEltYWdlSW5mbyhTdHJpbmcgaW1hZ2VOYW1lKSB7Ci0JCUZpbGUgaW1hZ2VGaWxlID0gbmV3IEZpbGUoaW1hZ2VOYW1lKTsKLQkJaWYgKGltYWdlRmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShpbWFnZU5hbWUpOwotCQkJCWhlaWdodFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihpbWFnZURhdGEuaGVpZ2h0KSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaW1hZ2VEYXRhLndpZHRoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIHNldCBkZWZhdWx0IGhlaWdodC93aWR0aCBpZiB3ZSBjYW4ndCBvYnRhaW4gSW1hZ2VEYXRhCi0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKERFRkFVTFRfSEVJR0hUKSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoREVGQVVMVF9XSURUSCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaGVpZ2h0VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKERFRkFVTFRfSEVJR0hUKSk7Ci0JCQl3aWR0aFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihERUZBVUxUX1dJRFRIKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBoZWlnaHQuCi0JICovCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBNYXRoLm1pbihNQVhfSEVJR0hULCBNYXRoLm1heCgxMCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2Ugd2lkdGguCi0JICovCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIE1hdGgubWluKE1BWF9XSURUSCwgTWF0aC5tYXgoMTAsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgQUxUIHRhZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdFRhZygpIHsKLQkJcmV0dXJuIGFsdFRhZzsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkTGlua0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZExpbmtEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3YjI1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkTGlua0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFkZExpbmtGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkTGlua0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgbGluayB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwgPGE+Ci0gKiB0YWcgaW4gdGhlIFJpY2ggVGV4dCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RBZGRMaW5rRGlhbG9nIGV4dGVuZHMgQWRkTGlua0RpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19VUkwgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfRklMRSA9IExJTktfVVJMICsgMTsKLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0VMRU1FTlRfTElOSyA9IExJTktfVVJMICsgMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0VMRU1FTlRfTElOS19XSVRIX1RZUEUgPSBMSU5LX1VSTCArIDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19FTEVNRU5UX0xJTktfV0lUSF9VU0VSX1RFWFQgPSBMSU5LX1VSTCArIDQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTEVNRU5UX1RZUEVfTEFCRUxTID0gewotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmxpbmtUb1VSTF9uYW1lLAotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmxpbmtUb0ZpbGVfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua19uYW1lLAotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0xJTktfSU5fTkVXX1dJTkRPV19BVFRSSUJVVEUgPSAidGFyZ2V0PVwiX2JsYW5rXCIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCByaWNoVGV4dDsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRMb2M7Ci0KLQlwcml2YXRlIENvbWJvIGxpbmtUeXBlQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBvcGVuTGlua0NoZWNrYm94OwotCi0JcHJpdmF0ZSBpbnQgbGlua1R5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gb3BlbkxpbmtJbk5ld1dpbmRvdyA9IHRydWU7Ci0KLQlwcml2YXRlIEZpbGUgZmlsZVRvQ29weTsKLQkKLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX0ZJTEUgJiYgZXZlbnQud2lkZ2V0ID09IHVybFRleHQpIHsKLQkJCQkJCUZpbGUgdXJsRmlsZSA9IG5ldyBGaWxlKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCQlpZiAodXJsRmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJCQlmaWxlVG9Db3B5ID0gdXJsRmlsZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmlsZVRvQ29weSA9IG5ldyBGaWxlKGVsZW1lbnRMb2MsIHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCQl9Ci0JCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZpbGVUb0NvcHkuaXNGaWxlKCkgJiYgZmlsZVRvQ29weS5jYW5SZWFkKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh1cmxUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIEEgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIE1ldGhvZEFkZExpbmtEaWFsb2coU2hlbGwgcGFyZW50LCBJTWV0aG9kUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocGFyZW50LCByaWNoVGV4dC5nZXRCYXNlUGF0aCgpKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSByaWNoVGV4dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWVsZW1lbnRMb2MgPSBSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgobWV0aG9kRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlCi0JICogICAgICBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIGxpbmtUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpbmtUeXBlTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5hZGRMaW5rRGlhbG9nX2xpbmtUeXBlKTsKLQkJbGlua1R5cGVMYWJlbC5tb3ZlQWJvdmUodXJsTGFiZWwpOwotCQkKLQkJdXJsVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih1cmxUZXh0TW9kaWZ5TGlzdGVuZXIpOwotCQl1cmxUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCi0JCWxpbmtUeXBlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGNvbWJvR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29tYm9HcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpbmtUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShjb21ib0dyaWREYXRhKTsKLQkJbGlua1R5cGVDb21iby5zZXRJdGVtcyhFTEVNRU5UX1RZUEVfTEFCRUxTKTsKLQkJbGlua1R5cGVDb21iby5zZXRUZXh0KEVMRU1FTlRfVFlQRV9MQUJFTFNbMF0pOwotCQlsaW5rVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbGlua1R5cGUgPSBsaW5rVHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobGlua1R5cGUgIT0gTElOS19VUkwpOwotCQkJCXVybERpc3BsYXlOYW1lTGFiZWwuc2V0RW5hYmxlZChsaW5rVHlwZSA9PSBMSU5LX1VSTCk7Ci0JCQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldEVuYWJsZWQobGlua1R5cGUgPT0gTElOS19VUkwpOwotCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX1VSTCkgewotCQkJCQl1cmxEaXNwbGF5TmFtZVRleHQKLQkJCQkJCQkuc2V0VGV4dChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldFRleHQoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW9wZW5MaW5rQ2hlY2tib3guc2V0RW5hYmxlZChsaW5rVHlwZSA9PSBMSU5LX1VSTAotCQkJCQkJfHwgbGlua1R5cGUgPT0gTElOS19GSUxFKTsKLQkJCQl1cmxUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGxpbmtUeXBlICE9IExJTktfRklMRSkgewotCQkJCQlmaWxlVG9Db3B5ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJbGlua1R5cGVDb21iby5tb3ZlQWJvdmUodXJsTGFiZWwpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAobGlua1R5cGUgPT0gTElOS19GSUxFKSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChiYXNlUGF0aCk7Ci0JCQkJCVN0cmluZyBhdHRhY2hGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGF0dGFjaEZpbGUgIT0gbnVsbCAmJiBhdHRhY2hGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLCBkaWFsb2cKLQkJCQkJCQkJCS5nZXRGaWxlTmFtZSgpKTsKLQkJCQkJCQl1cmxUZXh0LnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBNZXRob2RFbGVtZW50IGxpbmsKLQkJCQllbHNlIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQWRkTGlua0ZpbHRlcigpIHsKLQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgcmV0dXJuIGZhbHNlOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgbWV0aG9kRWxlbWVudCwKLQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCUFycmF5TGlzdCBzZWwgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQkJCWlmIChzZWwuc2l6ZSgpID4gMCkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgc2VsCi0JCQkJCQkJCS5nZXQoMCk7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbnVsbDsKLQkJCQkJCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKHNlbGVjdGVkRWxlbWVudCwKLQkJCQkJCQkJbWV0aG9kRWxlbWVudCwgImh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGxpbmtUeXBlID09IExJTktfRUxFTUVOVF9MSU5LX1dJVEhfVVNFUl9URVhUKSB7Ci0JCQkJCQkJU3RyaW5nIGxpbmtOYW1lID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpCi0JCQkJCQkJCQkuZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCk7Ci0JCQkJCQkJaWYgKGxpbmtOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJCQlsaW5rTmFtZSA9IHNlbGVjdGVkRWxlbWVudC5nZXROYW1lKCk7Ci0JCQkJCQkJdXJsID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCQkJCS5nZXRFbGVtZW50TGluayhzZWxlY3RlZEVsZW1lbnQsIGxpbmtOYW1lLAotCQkJCQkJCQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlib29sZWFuIHdpdGhUeXBlID0gKGxpbmtUeXBlID09IExJTktfRUxFTUVOVF9MSU5LX1dJVEhfVFlQRSkgPyB0cnVlCi0JCQkJCQkJCQk6IGZhbHNlOwotCQkJCQkJCXVybCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJCQkuZ2V0RWxlbWVudExpbmsoc2VsZWN0ZWRFbGVtZW50LCB3aXRoVHlwZSwKLQkJCQkJCQkJCQkJImZpbGU6Ly8iICsgaHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXVybFRleHQuc2V0VGV4dCh1cmwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYnJvd3NlQnV0dG9uLm1vdmVBYm92ZSh1cmxEaXNwbGF5TmFtZUxhYmVsKTsKLQotCQlvcGVuTGlua0NoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCUdyaWREYXRhIGNoZWNrQm94R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJY2hlY2tCb3hHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW9wZW5MaW5rQ2hlY2tib3guc2V0TGF5b3V0RGF0YShjaGVja0JveEdyaWREYXRhKTsKLQkJb3BlbkxpbmtDaGVja2JveC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaW5rQ2hlY2tib3hfdGV4dCk7Ci0JCW9wZW5MaW5rQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQlvcGVuTGlua0NoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5MaW5rSW5OZXdXaW5kb3cgPSBvcGVuTGlua0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0VGV4dChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldFRleHQoKSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHRvIGJlIGNvcGllZCB0byBhIHJlc291cmNlIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlVG9Db3B5KCkgewotCQlyZXR1cm4gZmlsZVRvQ29weTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaW5rIHNob3VsZCBiZSBvcGVuZWQgaW4gYSBuZXcgYnJvd3NlcgotCSAqIHdpbmRvdy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRPcGVuTGlua0luTmV3V2luZG93KCkgewotCQlyZXR1cm4gb3BlbkxpbmtJbk5ld1dpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJU3RyaW5nIHVybCA9IHVybFRleHQuZ2V0VGV4dCgpOwotCQlpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKGxpbmtUeXBlID09IExJTktfVVJMKSB7Ci0JCQkJU3RyaW5nIHVybERpc3BsYXlOYW1lID0gdXJsRGlzcGxheU5hbWVUZXh0LmdldFRleHQoKTsKLQkJCQlpZiAodXJsRGlzcGxheU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdXJsRGlzcGxheU5hbWUgPSB1cmw7Ci0JCQkJfQotCQkJCVN0cmluZyBmdWxsVVJMID0gIjxhIGhyZWY9XCIiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdXJsCi0JCQkJCQkrICJcIiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkob3BlbkxpbmtJbk5ld1dpbmRvdyA/ICIgIiArIE9QRU5fTElOS19JTl9ORVdfV0lORE9XX0FUVFJJQlVURSA6ICIiKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJIj4iICsgdXJsRGlzcGxheU5hbWUgKyAiPC9hPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWxpbmsuc2V0VVJMKGZ1bGxVUkwpOwotCQkJfSBlbHNlIHsKLQkJCQlsaW5rLnNldFVSTCh1cmwpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHdpZGdldCB0ZXh0IHRvIGJsYW5rIHNvIHN1cGVyLm9rUHJlc3NlZCBkb2Vzbid0IG92ZXJ3cml0ZSB0aGUKLQkJLy8gYWJvdmUuCi0JCXVybFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl1cmxUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEVsZW1lbnRGaWx0ZXJzUHJvYmxlbVZpZXdEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RFbGVtZW50RmlsdGVyc1Byb2JsZW1WaWV3RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMWJiMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEVsZW1lbnRGaWx0ZXJzUHJvYmxlbVZpZXdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIERpYWxvZyBmb3Igc2hvd2luZyBkZXRhaWxzIGluIFByb2JsZW0gVmlldwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRGaWx0ZXJzUHJvYmxlbVZpZXdEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50RmlsdGVyc1Byb2JsZW1WaWV3RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQotCQlHcm91cCBvcHRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCW9wdGlvbkdyb3VwLnNldFRleHQoIk9wdGlvbnMiKTsKLQotCQlmb3IgKGludCBpID0gMTsgaSA8PSAxMDsgaSsrKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVDaGVja2JveChvcHRpb25Hcm91cCwKLQkJCQkJIk9wdGlvbiAiICsgaSwgMSk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoIk1ldGhvZCBFbGVtZW50IEZpbHRlciBPcHRpb25zIik7IAotCX0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Nb3ZlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTW92ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVmNTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Nb3ZlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLk1vdmVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogRGlhbG9nIGZvciBtb3ZpbmcgTWV0aG9kRWxlbWVudCB3aXRoaW4gTWV0aG9kTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JLy8gcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkVUkgPSBmYWxzZTsKLQotCS8vIFRoZSBwcm9ncmVzcyBtb25pdG9yCi0JcHJpdmF0ZSBQcm9ncmVzc01vbml0b3JQYXJ0IHByb2dyZXNzTW9uaXRvclBhcnQ7Ci0KLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByaXZhdGUgT2JqZWN0IGRlc3RpbmF0aW9uOwotCi0JcHJpdmF0ZSBDdXJzb3Igd2FpdEN1cnNvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3Zpbmc7Ci0KLQlwdWJsaWMgTW92ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgQ29sbGVjdGlvbiBlbGVtZW50c1RvTW92ZSwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0KLQkJLy8gZmlsdGVyIG91dCB0aGUgcHJlZGVmaW5lZCBlbGVtZW50cyB0byBwcmV2ZW50IHRoZW0gZnJvbSBnZXR0aW5nIG1vdmVkCi0JCS8vCi0JCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvTW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0KTsgCi0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0KLQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJLy8gdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAzMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCS8vIEluc2VydCBhIHByb2dyZXNzIG1vbml0b3IKLQkJR3JpZExheW91dCBwbWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXBtbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0ID0gY3JlYXRlUHJvZ3Jlc3NNb25pdG9yUGFydChjb21wb3NpdGUsIHBtbGF5b3V0KTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydAotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQl3YWl0Q3Vyc29yID0gcGFyZW50LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcigKLQkJCQlTV1QuQ1VSU09SX1dBSVQpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIFByb2dyZXNzTW9uaXRvclBhcnQgY3JlYXRlUHJvZ3Jlc3NNb25pdG9yUGFydCgKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWRMYXlvdXQgcG1sYXlvdXQpIHsKLQkJcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JQYXJ0KGNvbXBvc2l0ZSwgcG1sYXlvdXQsIFNXVC5ERUZBVUxUKSB7Ci0JCQlTdHJpbmcgY3VycmVudFRhc2sgPSBudWxsOwotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3NldEJsb2NrZWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNldEJsb2NrZWQoSVN0YXR1cyByZWFzb24pIHsKLQkJCQlzdXBlci5zZXRCbG9ja2VkKHJlYXNvbik7Ci0JCQkJaWYgKCFsb2NrZWRVSSkvLyBEbyBub3Qgc2hvdyBibG9ja2VkIGlmIHdlIGFyZSBsb2NraW5nIHRoZSBVSQotCQkJCQlnZXRCbG9ja2VkSGFuZGxlcigpLnNob3dCbG9ja2VkKGdldFNoZWxsKCksIHRoaXMsIHJlYXNvbiwKLQkJCQkJCQljdXJyZW50VGFzayk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjY2xlYXJCbG9ja2VkKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2xlYXJCbG9ja2VkKCkgewotCQkJCXN1cGVyLmNsZWFyQmxvY2tlZCgpOwotCQkJCWlmICghbG9ja2VkVUkpLy8gRG8gbm90IHZsZWFyIGlmIHdlIG5ldmVyIHNldCBpdAotCQkJCQlnZXRCbG9ja2VkSGFuZGxlcigpLmNsZWFyQmxvY2tlZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I2JlZ2luVGFzayhqYXZhLmxhbmcuU3RyaW5nLAotCQkJICogICAgICBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgewotCQkJCXN1cGVyLmJlZ2luVGFzayhuYW1lLCB0b3RhbFdvcmspOwotCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzZXRUYXNrTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotCQkJCXN1cGVyLnNldFRhc2tOYW1lKG5hbWUpOwotCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzdWJUYXNrKGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCQlzdXBlci5zdWJUYXNrKG5hbWUpOwotCQkJCS8vIElmIHdlIGhhdmVuJ3QgZ290IGFueXRoaW5nIHlldCB1c2UgdGhpcyB2YWx1ZSBmb3IgbW9yZQotCQkJCS8vIGNvbnRleHQKLQkJCQlpZiAoY3VycmVudFRhc2sgPT0gbnVsbCkKLQkJCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19tb3ZlX3RleHQpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWRlc3RpbmF0aW9uID0gVG5nVXRpbC51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoZG9Nb3ZlKCkpIHsKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREZXN0aW5hdGlvbigpIHsKLQkJLy8gcHJldmVudGluZyBtb3ZpbmcgZWxlbWVudHMgdG8gY2F0ZWdvcnkKLQkJLy8KLQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBkbyBub3QgYWxsb3cgbW92aW5nIGludG8gU3RhbmRhcmQgQ2F0ZWdvcmllcwotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNvbnRhaW5lcnMgZm9yIGNvbXBhdGlibGUgdHlwZXMgd2lsbCBub3Qgd29yayBpZiB3ZSB3YW50IHRvIG1vdmUgYSBzdWItYXJ0aWZhY3QKLQkJLy8gdG8gYSBjb250ZW50IHBhY2thZ2UKLQkJLy8KLQkJCi0vLwkJLy8gZG8gbm90IGFsbG93IG1vdmUgaWYgZGVzdGluYXRpb24gaXMgbm90IHRoZSBzYW1lIHR5cGUgYXMgZXZlcnkKLS8vCQkvLyBlbGVtZW50cycgZUNvbnRhaW5lcgotLy8JCU9iamVjdCByZWFsRGVzdCA9IGRlc3RpbmF0aW9uOwotLy8JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0vLwkJCXJlYWxEZXN0ID0gKChUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgZGVzdGluYXRpb24pCi0vLwkJCQkJLmdldFRhcmdldCgpOwotLy8JCX0KLS8vCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotLy8JCQlyZWFsRGVzdCA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIGRlc3RpbmF0aW9uKS5nZXRUYXJnZXQoKTsKLS8vCQl9CQkKLS8vCQl0cnkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0vLwkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLS8vCQkJCQlpZiAoIXJlYWxEZXN0LmdldENsYXNzKCkuaXNJbnN0YW5jZSgKLS8vCQkJCQkJCSgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpKSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0JCQotCQkvL0RvIG5vdCBhbGxvdyBtb3ZpbmcgaW50byBhIGRlc3RpbmF0aW9uIHdoaWNoIGlzIAotCQkvL2xvY2tlZCB0aHJvdWdoIGV4dGVuZGVkIGxvY2tlci4KLQkJaWYoVmlld0hlbHBlci5pc0V4dGVuZGVkTG9ja2VkKGRlc3RpbmF0aW9uKSl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCi0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVjaykgewotCQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJaWYgKCEgRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJKChWYXJpYWJpbGl0eUVsZW1lbnQpIGRlc3RpbmF0aW9uLCBlbGVtZW50cykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQkvLyBTdWIgQXJ0aWZhY3QgY2lyY3VsYXIgY2hlY2sgY29kZQotCQllbHNlIGlmKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMoKEFydGlmYWN0KWRlc3RpbmF0aW9uLCAKLQkJCQkJZWxlbWVudHMpOwotCQl9CQkKLQkJCi0JCUNvbW1hbmQgYWRkQ29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIGRlc3RpbmF0aW9uLAotCQkJCW51bGwsIGVsZW1lbnRzKTsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBhZGRDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWFkZENvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmICghcmVzdWx0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJZGVzdGluYXRpb24gPSAoKFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSBkZXN0aW5hdGlvbikKLQkJCQkJLmdldFRhcmdldCgpOwotCQl9Ci0KLQkJLy8gSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoKEVPYmplY3QpCi0JCS8vIGRlc3RpbmF0aW9uLCBnZXRTaGVsbCgpKTsKLQkJLy8gaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJUGx1Z2luLm1vdmVEaWFsb2cudGl0bGUiKSwKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyBzdGF0dXMpOwotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIH0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRvTW92ZSgpIHsKLQkJaWYgKGRlc3RpbmF0aW9uID09IG51bGwpIHsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c7IAotCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFpc1ZhbGlkRGVzdGluYXRpb24oKSkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCShFT2JqZWN0KSBkZXN0aW5hdGlvbiwgZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb247IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7IAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCW1vdmluZyA9IHRydWU7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCi0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKHRydWUpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0Ci0JCQkJLmJlZ2luVGFzaygKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfbW92aW5nX3RleHQsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCQlNb3ZlT3BlcmF0aW9uIG1vdmVPcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgY29tbWFuZAotCQkJLy8KLQkJCUNvbW1hbmQgY29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIGRlc3RpbmF0aW9uLAotCQkJCQludWxsLCBlbGVtZW50cyk7Ci0KLQkJCW1vdmVPcCA9IG5ldyBNb3ZlT3BlcmF0aW9uKGNvbW1hbmQsIHByb2dyZXNzTW9uaXRvclBhcnQsIHNoZWxsKTsKLQkJCW1vdmVPcC5ydW4oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vdmluZyA9IGZhbHNlOwotCQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5kb25lKCk7Ci0KLQkJCS8vIGNsZWFyIGN1cnNvcgotCQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb3ZlT3AgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBtb3ZlT3AuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZTsgCi0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlOyAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQkJaWYgKG1vdmVPcC5yZWxvYWROZWVkZWQoKSkgewotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKG1vdmluZykKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL09wZW5Db25maWdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjMzg4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ29uZmlnRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTkZJR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0OyAKLQotCS8vIENvbWJvIGNvbWJvX2NvbmZpZ3M7Ci0JU3RyaW5nIHNlZWxjdGVkTmFtZTsKLQotCUJ1dHRvbltdIGN0cmxfY29uZmlncyA9IG51bGw7Ci0KLQlUZXh0IGN0cmxfbmV3X2NvbmZpZyA9IG51bGw7Ci0KLQlwdWJsaWMgT3BlbkNvbmZpZ0RpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGFyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQl7Ci0JCQlHcm91cCBnID0gbmV3IEdyb3VwKGFyZWEsIFNXVC5OT05FKTsKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCWcuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQl9Ci0KLQkJCVN0cmluZ1tdIG5hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcygKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCWlmIChuYW1lcyAhPSBudWxsKSB7Ci0JCQkJY3RybF9jb25maWdzID0gbmV3IEJ1dHRvbltuYW1lcy5sZW5ndGggKyAxXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN0cmxfY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9IE5FV19DT05GSUdfVEVYVDsKLQkJCQkJaWYgKGkgPCBuYW1lcy5sZW5ndGgpIHsKLQkJCQkJCW5hbWUgPSBuYW1lc1tpXTsKLQkJCQkJfQotCQkJCQljdHJsX2NvbmZpZ3NbaV0gPSBuZXcgQnV0dG9uKGcsIFNXVC5SQURJTyk7Ci0JCQkJCWN0cmxfY29uZmlnc1tpXS5zZXRUZXh0KG5hbWUpOwotCQkJCQl7Ci0JCQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgKLQkJCQkJCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQkJCWN0cmxfY29uZmlnc1tpXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJY3RybF9uZXdfY29uZmlnID0gbmV3IFRleHQoZywgU1dULkJPUkRFUik7Ci0JCQl7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQkJY3RybF9uZXdfY29uZmlnLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQkvLyBzZXQgaW1hZ2UgYW5kIHRpdGxlCi0JCQlzdXBlcgotCQkJCQkuZ2V0U2hlbGwoKQotCQkJCQkuc2V0VGV4dCgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0KTsgCi0JCX0KLQotCQlyZXR1cm4gYXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc2VlbGN0ZWROYW1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdHJsX2NvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjdHJsX2NvbmZpZ3NbaV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlzZWVsY3RlZE5hbWUgPSBjdHJsX2NvbmZpZ3NbaV0uZ2V0VGV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlZWxjdGVkTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoc2VlbGN0ZWROYW1lLmVxdWFscyhORVdfQ09ORklHX1RFWFQpKSB7Ci0JCQlzZWVsY3RlZE5hbWUgPSBjdHJsX25ld19jb25maWcuZ2V0VGV4dCgpOwotCQl9Ci0KLQkJaWYgKHNlZWxjdGVkTmFtZSA9PSBudWxsIHx8IHNlZWxjdGVkTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgewotCQlpZiAoc3VwZXIub3BlbigpID09IERpYWxvZy5PSykgewotCQkJcmV0dXJuIHNlZWxjdGVkTmFtZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1NlY3Rpb25zT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0ZDYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBvcmRlciB0aGUge0BsaW5rIFN0ZXB9cy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbnNPcmRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBiYXNlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF91cCwgY3RybF9kb3duOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3N0ZXBzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzdGVwc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBhbGxTZWN0aW9uczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCS8vIHByaXZhdGUgVGFzayBjb250ZW50RWxlbWVudDsKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5BZHZhbmNlZFNlYXJjaERpYWxvZzwvY29kZT4gZ2l2ZWIgdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbnNPcmRlckRpYWxvZyhTaGVsbCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlciwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwKLQkJCVN0cmluZyBsYWJlbCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQlhbGxTZWN0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQliYXNlQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCBtZXNzYWdlLCA0KTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsIGxhYmVsLCAzKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfc3RlcHMgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF9zdGVwcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlzdGVwc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc3RlcHMpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxpbmUoYmFzZUNvbXBvc2l0ZSwgNCk7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQlyZXR1cm4gYmFzZUNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQkJCWFsbFNlY3Rpb25zID0gbmV3IFNlY3Rpb25MaXN0KGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVNlY3Rpb25MaXN0LlNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbFNlY3Rpb25zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gIWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkKLQkJCQkJCS5jb250YWlucyhlbGVtZW50KTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywgYWxsU2VjdGlvbnMsIDEpOwotCQkJCWFjdGlvbk1hbmFnZXIuZXhlY3V0ZShjbWQpOwotCQkJCWNvbW1hbmRzLmFkZChjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY29udGVudEVsZW1lbnQsIG1vdmVEb3duSXRlbXMsIGFsbFNlY3Rpb25zLCAwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJYWxsU2VjdGlvbnMuYXBwbHkoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBjb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCU9iamVjdCBjbWQgPSBjb21tYW5kcy5nZXQoaSk7Ci0JCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCkgewotCQkJCQkoKE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCkgY21kKS51bmRvKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1N3aXRjaENvbmZpZ0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1N3aXRjaENvbmZpZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGRhOGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Td2l0Y2hDb25maWdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzd2l0Y2ggdGhlIGN1cnJlbnQgQ29uZmlndXJhdGlvbiB0byBhIHJlY29tbWVuZGVkCi0gKiBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoQ29uZmlnRGlhbG9nIHsKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBwYXJ0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHJlY29tbWVuZGVkQ29uZmlnCi0JICogICAgICAgICAgICBUaGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3dpdGNoQ29uZmlnRGlhbG9nKFNoZWxsIHNoZWxsLCBJRWRpdG9yUGFydCBwYXJ0KSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJdGhpcy5wYXJ0ID0gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZGlhbG9nIGlmZiB0aGUgZ2l2ZW4gcmVjb21tZW5kZWRDb25maWcgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0JICogY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZwotCSAqIAotCSAqIHJldHVybnMgSURpYWxvZ0NvbnN0YW50cy5PS19JRCBpZiBkaWFsb2cgd2Fzbid0IHNob3duLCBvciBpZiBjb25maWcgd2FzCi0JICogc3dpdGNoZWQgcmV0dXJucyBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCBpZiBkaWFsb2cgd2FzIHNob3duIGFuZCB1c2VyCi0JICogZGlkIG5vdCBjbGljayBZZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbCAhPSBudWxsID8gc2hlbGwuZ2V0RGlzcGxheSgpIDogbnVsbDsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJZGlzcGxheSA9IE1zZ0JveC5nZXREaXNwbGF5KCk7Ci0JCX0KLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJLy8gY291bGQgbm90IGdldCBkaXNwbGF5Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9iamVjdCBvYmogPSBudWxsOwotCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCWlmICgoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilwYXJ0KS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSAoKElFZGl0b3JQYXJ0KSBwYXJ0KQotCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCQkJb2JqID0gaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZUNvbnRhaW5lcigpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJCQlpZiAoKChQcm9jZXNzRWRpdG9yKXBhcnQpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCW9iaiA9IEVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2RFZGl0b3JJbnB1dChwYXJ0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiByZWNvbW1lbmRlZENvbmZpZyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJU3RyaW5nIHN3aXRjaENvbmZpZ1ByZWYgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRTd2l0Y2hDb25maWcoKTsKLQkJCQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotLy8JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotLy8JCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpICE9IHJlY29tbWVuZGVkQ29uZmlnKSB7Ci0JCQkJCQlmaW5hbCBTdHJpbmcgY29uZmlnTmFtZSA9IHJlY29tbWVuZGVkQ29uZmlnLmdldE5hbWUoKTsKLQkJCQkJCWlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQuZXF1YWxzKHN3aXRjaENvbmZpZ1ByZWYpKSB7Ci0JCQkJCQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkJCQkub3Blblllc05vUXVlc3Rpb24oc2hlbGwsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQljb25maWdOYW1lKSwKLQkJCQkJCQkJCW51bGwsIGZhbHNlLCBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwKLQkJCQkJCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmdldFN3aXRjaENvbmZpZ1ByZWZlcmVuY2VLZXkoKSk7Ci0JCQkJCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpIHsKLQkJCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwKLQkJCQkJCQkJCQkJCWNvbmZpZ05hbWUpOwotCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCQkJCWNvbmZpZyk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJCQkJCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0gZWxzZSBpZiAoTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCQkJY29uZmlnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW4oU2hlbGwgc2hlbGwsIElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJU3dpdGNoQ29uZmlnRGlhbG9nIGRpYWxvZyA9IG5ldyBTd2l0Y2hDb25maWdEaWFsb2coRGlzcGxheQotCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgKElFZGl0b3JQYXJ0KXBhcnQpOwotCQlkaWFsb2cuZXhlY3V0ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1VzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1VzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE4ZWUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0d1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBhc3NpZ24gdXNlciBkZWZpbmVkIGRpYWdyYW0gdG8gcHJvY2VzcyBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBhc3NpZ25BREltYWdlQnV0dG9uLCBhc3NpZ25BRERJbWFnZUJ1dHRvbiwKLQkJCWFzc2lnbldQREltYWdlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY2xlYXJBREltYWdlQnV0dG9uLCBjbGVhckFEREltYWdlQnV0dG9uLAotCQkJY2xlYXJXUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHVzZUFESW1hZ2VCdXR0b24sIHVzZUFEREltYWdlQnV0dG9uLCB1c2VXUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBhZEltYWdlVGV4dCwgYWRkSW1hZ2VUZXh0LCB3cGRJbWFnZVRleHQ7Ci0KLQlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBhcmVhOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURpYWdyYW0sIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSwKLQkJCXdwZERpYWdyYW07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uV2lkdGhIaW50ID0gNjA7Ci0JCi0JcHJpdmF0ZSBTZXQgZXhpc3RpbmdMaXN0OwotCQotCXByaXZhdGUgYm9vbGVhbiBpc1dyYXBwZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gaXNXcmFwcGVkCi0JICovCi0JcHVibGljIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyhTaGVsbCBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvciwKLQkJCUFjdGl2aXR5IGFjdGl2aXR5LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBpc1dyYXBwZWQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLmVkaXRvciA9IGVkaXRvcjsKLQkJdGhpcy5pc1dyYXBwZWQgPSBpc1dyYXBwZWQ7Ci0JCQotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuZmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcihjb25maWcsIG51bGwsIHRhYk5hbWUpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaik7Ci0JCQkJCWlmIChuYW1lCi0JCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKQotCQkJCQkJCSYmIAotCQkJCQkJCSEoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJCi0JCWV4aXN0aW5nTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpOwotCQlhcmVhLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQkvLyBVc2UgQUQgSW1hZ2UgZm9yIHB1Ymxpc2hpbmcKLQkJTGFiZWwgYmxhbmtMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWJsYW5rTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQl1c2VBREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuQ0hFQ0spOwotCQl1c2VBREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2UpOyAKLQkJR3JpZERhdGEgYnV0dG9uR0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJYnV0dG9uR0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VBREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR0QpOwotCi0JCS8vIEFzc2lnbiBhY3Rpdml0eSBkaWFncmFtIGltYWdlCi0JCUxhYmVsIGFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlKTsgCi0KLQkJYWRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25BREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbkFESW1hZ2VCdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uKTsgCi0JCUdyaWREYXRhIGJ1dHRvbkdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYnV0dG9uR3JpZERhdGEud2lkdGhIaW50ID0gYnV0dG9uV2lkdGhIaW50OwotCQlhc3NpZ25BREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCWNsZWFyQURJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQljbGVhckFESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0KTsgCi0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQkvLyBVc2UgQUREIEltYWdlIGZvciBwdWJsaXNoaW5nCi0JCWJsYW5rTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlibGFua0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJdXNlQURESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5DSEVDSyk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlKTsgCi0JCWJ1dHRvbkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWJ1dHRvbkdELmhvcml6b250YWxTcGFuID0gMzsKLQkJdXNlQURESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7Ci0KLQkJLy8gQXNzaWduIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtIGltYWdlCi0JCWFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZSk7IAotCi0JCWFkZEltYWdlVGV4dCA9IG5ldyBUZXh0KGFyZWEsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJYWRkSW1hZ2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCWFzc2lnbkFEREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbkFEREltYWdlQnV0dG9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbik7IAotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQljbGVhckFEREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWNsZWFyQURESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0KTsgCi0JCWNsZWFyQURESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJLy8gVXNlIFdQRCBJbWFnZSBmb3IgcHVibGlzaGluZwotCQlibGFua0xhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYmxhbmtMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVzZVdQREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuQ0hFQ0spOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZSk7IAotCQlidXR0b25HRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgKTsKLQkJYnV0dG9uR0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdEKTsKLQotCQkvLyBBc3NpZ24gd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbSBpbWFnZQotCQlhTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlhTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2UpOyAKLQotCQl3cGRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXdwZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b24pOyAKLQkJYXNzaWduV1BESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJY2xlYXJXUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQljbGVhcldQREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xlYXJCdXR0b25fdGV4dCk7IAotCQljbGVhcldQREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCS8vIGxvYWREYXRhCi0JCWxvYWREYXRhKCk7Ci0JCQotCQkvLyBkaXNhYmxlQ29udHJvbHMKLQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoYWN0aXZpdHkpIHx8IGlzV3JhcHBlZCl7Ci0JCQlkaXNhYmxlQ29udHJvbHMoKTsKLQkJfQotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gc2V0IGltYWdlIGFuZCB0aXRsZQotCQlzdXBlcgotCQkJCS5nZXRTaGVsbCgpCi0JCQkJLnNldFRleHQoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gYXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIGNvbnRyb2xzCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzYWJsZUNvbnRyb2xzKCkKLQl7Ci0JCXVzZUFESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWFzc2lnbkFESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFzc2lnbkFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2xlYXJBRERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2xlYXJXUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7CQkKLQkJLy8JIGxvYWQgZXhpc3Rpbmcgc3VwcG9ydGluZyBtYXRlcmlhbHMgbGlzdAotCQlleGlzdGluZ0xpc3QuYWRkQWxsKGFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSk7Ci0KLQkJCi0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oYWN0aXZpdHkpOwotCQlpZiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQlhZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChpbmZvCi0JCQkJCS5nZXRBY3Rpdml0eURpYWdyYW0oKSkpOwotCQkJYWN0aXZpdHlEaWFncmFtID0gaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURpYWdyYW0pOwotCQl9Ci0JCWlmIChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChpbmZvCi0JCQkJCS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSkpOwotCQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQl9Ci0JCWlmIChpbmZvLmdldFdQRERpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQl3cGRJbWFnZVRleHQKLQkJCQkJLnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGluZm8uZ2V0V1BERGlhZ3JhbSgpKSk7Ci0JCQl3cGREaWFncmFtID0gaW5mby5nZXRXUEREaWFncmFtKCk7Ci0JCQkKLQkJCWV4aXN0aW5nTGlzdC5hZGQod3BkRGlhZ3JhbSk7Ci0JCX0KLQotCQl1c2VBREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hBREltYWdlKCkpOwotCQl1c2VBRERJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSk7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYXNzaWduQURJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpdml0eURpYWdyYW0gPSBzbTsKLQkJCQkJCWFkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBzbTsKLQkJCQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChzbSkpOwotCQkJCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYXNzaWduV1BESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsIHNtID0gb3BlbkZpbHRlckRpYWxvZygpOwotCQkJCQlpZiAoc20gIT0gbnVsbCkgewotCQkJCQkJd3BkRGlhZ3JhbSA9IHNtOwotCQkJCQkJd3BkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKHdwZERpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY2xlYXJBREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWV4aXN0aW5nTGlzdC5yZW1vdmUoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlhZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFjdGl2aXR5RGlhZ3JhbSA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCi0JCWNsZWFyQURESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCi0JCWNsZWFyV1BESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZSh3cGREaWFncmFtKTsKLQkJCQl3cGRJbWFnZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cGREaWFncmFtID0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGZpbHRlciBkaWFsb2cKLQkgKi8KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBvcGVuRmlsdGVyRGlhbG9nKCkgewotCQotCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGZpbHRlciwgYWN0aXZpdHksCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBBcnJheXMuYXNMaXN0KGV4aXN0aW5nTGlzdC50b0FycmF5KCkpKTsKLQkJCi0JCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBhY3Rpdml0eSkpOwotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQub3BlbigpOwotCi0JCUxpc3QgbGlzdCA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJaWYgKChsaXN0ICE9IG51bGwpICYmICghbGlzdC5pc0VtcHR5KCkpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoMCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJcmV0dXJuIChTdXBwb3J0aW5nTWF0ZXJpYWwpIG9iajsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChhY3Rpdml0eSkgfHwgaXNXcmFwcGVkKXsKLQkJCS8vIHRoZW4gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4uIGp1c3QgcmV0dXJuCi0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCQlib29sZWFuIGVkaXRvckRpcnR5ID0gZmFsc2U7Ci0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oYWN0aXZpdHkpOwotCi0JCS8vIHNldCBhY3Rpdml0eSBkaWFncmFtCi0JCWlmIChhY3Rpdml0eURpYWdyYW0gIT0gaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSkgewotCQkJZWRpdG9yRGlydHkgPSB0cnVlOwotCQl9Ci0JCWluZm8uc2V0QWN0aXZpdHlEaWFncmFtKGFjdGl2aXR5RGlhZ3JhbSk7Ci0KLQkJLy8gc2V0IGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JCWlmICghZWRpdG9yRGlydHkpIHsKLQkJCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW0gIT0gaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSkKLQkJCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRBY3Rpdml0eURldGFpbERpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQotCQkvLyBzZXQgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbQotCQlpZiAoIWVkaXRvckRpcnR5KSB7Ci0JCQlpZiAod3BkRGlhZ3JhbSAhPSBpbmZvLmdldFdQRERpYWdyYW0oKSkKLQkJCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRXUEREaWFncmFtKHdwZERpYWdyYW0pOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciBhY3Rpdml0eSBkaWFncmFtCi0JCWJvb2xlYW4gb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCWJvb2xlYW4gbmV3Q2FuUHVibGlzaEZsYWcgPSB1c2VBREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoQURJbWFnZSh1c2VBREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBzZXQgY2FuIHB1Ymxpc2ggZmxhZyBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkJb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQluZXdDYW5QdWJsaXNoRmxhZyA9IHVzZUFEREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoQURESW1hZ2UodXNlQURESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JCW9sZENhblB1Ymxpc2hGbGFnID0gaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKTsKLQkJbmV3Q2FuUHVibGlzaEZsYWcgPSB1c2VXUERJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCghZWRpdG9yRGlydHkpICYmIChvbGRDYW5QdWJsaXNoRmxhZyAhPSBuZXdDYW5QdWJsaXNoRmxhZykpCi0JCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCWluZm8uc2V0UHVibGlzaFdQREltYWdlKHVzZVdQREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVEaXRvciBkaXJ0eT0iICsgZWRpdG9yRGlydHkpOwotCQlpZiAoZWRpdG9yRGlydHkpIHsKLQotCQkJaWYgKCFwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlzYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7IAotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsgCi0JCS8vIGlmIChlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbWVzc2FnZSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCS8vIHNhdmUgdGhlIGVkaXRvcgotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkoKFByb2Nlc3NFZGl0b3IpIGVkaXRvcikucmVzb3VyY2VzVG9TYXZlCi0JCQkJCQkJCS5hZGQoKChQcm9jZXNzQ29tcG9uZW50KSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9yCi0JCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpLmdldE1ldGhvZEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0UHJvY2VzcygpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVkaXRvci5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBkb25lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVmFyaWFiaWxpdHlTZWxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNiZTA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBkaWFsb2cgZm9yIHNob3dpbmcgYW5kIHBvc3NpYmx5IHNlbGVjdGluZyBhbnkgdmFyaWFiaWxpdHkgcmVsYXRlZCB0byB0aGUKLSAqIGdpdmVuIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlTZWxlY3Rpb24gewotCi0JcHJpdmF0ZSBIYXNoU2V0IGZpbHRlckVsZW1lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgY2xhc3MgVmFyaWFiaWxpdHlGaWx0ZXIgZXh0ZW5kcyBBbGxGaWx0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlpZiAoKChDdXN0b21DYXRlZ29yeSkgb2JqKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCQkJJiYgZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIERpc3BsYXkgdmFyaWFiaWxpdHkgc2VsZWN0aW9uIGRpYWxvZyB3aGljaCBsaXN0cyBlbGVtZW50cyBhbmQgaXQncwotCSAqIHZhcmlhYmlsaXRpZXMuCi0JICogCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5U2VsZWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIEl0IHNob3dzIGRpYWxvZyBib3ggZm9yIGFsbCB0aGUgY29udHJpYnV0b3JzLiBVc2VyIGlzIGV4cGVjdGVkIHRvIHNlbGVjdAotCSAqIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCU9iamVjdCBzZWxlY3RlZCBieSB1c2VyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZFZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCVNldCBlbGVtZW50U2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZWxlbWVudFNldC5hZGQoZWxlbWVudCk7Ci0JCWVsZW1lbnRTZXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRWYXJpYWJpbGl0eUVsZW1lbnRzKGVsZW1lbnRTZXQsIHRydWUsIHRydWUpOwotCi0JCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChlbGVtZW50U2V0KTsKLQkJaWYgKCFlbGVtZW50U2V0LmlzRW1wdHkoKSkgewotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdG9yLm5leHQoKTsKLQkJCQlMaXN0IGdyb3VwaW5ncyA9IG51bGw7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudCk7Ci0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCWdyb3VwaW5ncyA9IGdldEFuY2VzdG9ycygoQ3VzdG9tQ2F0ZWdvcnkpY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQotCQkJCWlmICgoZ3JvdXBpbmdzICE9IG51bGwpICYmICghZ3JvdXBpbmdzLmlzRW1wdHkoKSkpCi0JCQkJCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChncm91cGluZ3MpOwotCi0JCQl9Ci0KLQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5RmlsdGVyKCk7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW10geyBGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCB9OwotCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZGxnID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCQkJZGxnLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJZGxnLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UKTsKLQkJCWRsZy5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQlkbGcuc2V0VHlwZXMoc3RyKTsKLQkJCWRsZy5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpKSwKLQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCi0JCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50Ci0JCQkJCSYmIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSkgewotCQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLnRyaW0oKQotCQkJCQkJLmxlbmd0aCgpID4gMCkKLQkJCQkJZWxlbWVudE5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJfQotCQkJZGxnCi0JCQkJCS5zZXRWaWV3ZXJMYWJlbChBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbCwgKG5ldyBTdHJpbmdbXSB7IGVsZW1lbnROYW1lIH0pKSk7Ci0KLQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGUsIAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGVsZW1lbnROYW1lIH0pOwotCi0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJTGlzdCByZXN1bHQgPSBkbGcuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5pc0VtcHR5KCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiByZXN1bHQuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFuY2VzdG9ycyBmb3IgdGhlIGdpdmVuIEN1c3RvbSBDYXRlZ29yeS4KLQkgKiB0YWtlbiBmcm9tIGF1dGhvcmluZy51aS5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvYmpMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKExpc3QgYW5jZXN0b3JMaXN0LCBMaXN0IG1ldGhvZE9iamVjdExpc3QpIHsKLQkJaWYgKG1ldGhvZE9iamVjdExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQotCQlMaXN0IGFsbFBhcmVudEN1c3RDYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZE9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBlbGVtZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZWxlbWVudCk7Ci0JCQlhbGxQYXJlbnRDdXN0Q2F0cy5hZGRBbGwocGFyZW50TGlzdCk7Ci0JCX0KLQotCQlhbmNlc3Rvckxpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDM3MTE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0VkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OGQ1NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wRmVlZGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIERyb3AgYWRhcHRlciBmb3IgZHJhZyBhbmQgZHJvcAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyIGV4dGVuZHMKLQkJRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyIHsKLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgdmlld2VyKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcmFnRW50ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJc3VwZXIuZHJhZ0VudGVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJhZ092ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXN1cGVyLmRyYWdPdmVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJvcEFjY2VwdChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlzdXBlci5kcm9wQWNjZXB0KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjaGVscGVyKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJVGFibGUgdGFibGUgPSBudWxsOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG51bGw7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpIHsKLQkJCXRhYmxlID0gKChUYWJsZVRyZWVWaWV3ZXIpIHZpZXdlcikuZ2V0VGFibGVUcmVlKCkuZ2V0VGFibGUoKTsKLQkJCWl0ZW0gPSB0YWJsZS5nZXRJdGVtKHRhYmxlLnRvQ29udHJvbChldmVudC54LCBldmVudC55KSk7Ci0JCQlldmVudC5pdGVtID0gaXRlbTsKLQkJfQotCi0JCXN1cGVySGVscGVyKGV2ZW50KTsKLQotCQlpZiAoaXRlbSAhPSBudWxsICYmIChldmVudC5mZWVkYmFjayAmIERORC5GRUVEQkFDS19TRUxFQ1QpICE9IDApIHsKLQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBpdGVtIH0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGRyb3AgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIGl0ZW0KLQkgKiBAcmV0dXJuIGRyb3AgdGFyZ2V0IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RHJvcFRhcmdldChXaWRnZXQgaXRlbSkgewotCQlyZXR1cm4gZXh0cmFjdERyb3BUYXJnZXQoaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZHJvcCBhY3Rpb24gc2hvdWxkIGJlIGludm9rZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyI2Ryb3Aob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJLy8gQSBjb21tYW5kIHdhcyBjcmVhdGVkIGlmIHRoZSBzb3VyY2Ugd2FzIGF2YWlsYWJsZSBlYXJseSwgYW5kIHRoZQotCQkvLyBpbmZvcm1hdGlvbiB1c2VkIHRvIGNyZWF0ZSBpdCB3YXMgY2FjaGVkLi4uCi0JCWlmIChkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBSZWNyZWF0ZSB0aGUgY29tbWFuZC4KLQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBPdGhlcndpc2UsIHRoZSBzb3VyY2Ugc2hvdWxkIGJlIGF2YWlsYWJsZSBub3cgYXMgZXZlbnQuZGF0YSwgYW5kCi0JCQkvLyB3ZSBjYW4gY3JlYXRlIHRoZSBjb21tYW5kLgotCQkJc291cmNlID0gZXh0cmFjdERyYWdTb3VyY2UoZXZlbnQuZGF0YSk7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RHJvcFRhcmdldChldmVudC5pdGVtKTsKLQkJCWNvbW1hbmQgPSBEcmFnQW5kRHJvcENvbW1hbmQuY3JlYXRlKGRvbWFpbiwgdGFyZ2V0LAotCQkJCQlnZXRMb2NhdGlvbihldmVudCksIGV2ZW50Lm9wZXJhdGlvbnMsIG9yaWdpbmFsT3BlcmF0aW9uLAotCQkJCQlzb3VyY2UpOwotCQl9Ci0KLQkJLy8gSWYgdGhlIGNvbW1hbmQgY2FuIGV4ZWN1dGUuLi4KLQkJaWYgKGNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkvLyBFeGVjdXRlIGl0LgotCQkJZG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBPdGhlcndpc2UsIGxldCdzIGNhbGwgdGhlIHdob2xlIHRoaW5nIG9mZi4KLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8vIENsZWFuIHVwIHRoZSBzdGF0ZS4KLQkJY29tbWFuZCA9IG51bGw7Ci0JCWNvbW1hbmRUYXJnZXQgPSBudWxsOwotCQlzb3VyY2UgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0aGUgc2FtZSB3YXkgZm9yIGVhY2ggb2YgdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyfSBtZXRob2RzLCBleGNlcHQgZm9yIGxlYXZlCi0JICogYW5kIGRyb3AuIElmIHRoZSBzb3VyY2UgaXMgYXZhaWxhYmxlIGVhcmx5LCBpdCBjcmVhdGVzIG9yIHJldmFsaWRhdGVzIHRoZQotCSAqIHtAbGluayBEcmFnQW5kRHJvcENvbW1hbmR9LCBhbmQgdXBkYXRlcyB0aGUgZXZlbnQncyBkZXRhaWwgKG9wZXJhdGlvbikKLQkgKiBhbmQgZmVlZGJhY2sgKGRyYWcgdW5kZXIgZWZmZWN0KSwgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdXBlckhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJLy8gSWYgd2UgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSwgd2UnbGwgcHJvdmlkZSB0aGUgZGVmYXVsdCBzZWxlY3QKLQkJLy8gZmVlZGJhY2sgYW5kIGVuYWJsZSBhdXRvLXNjcm9sbCBhbmQgYXV0by1leHBhbmQgZWZmZWN0cy4KLQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUIHwgZ2V0QXV0b0ZlZWRiYWNrKCk7Ci0KLQkJLy8gSWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0LCB0cnkgdG8gZ2V0IHRoZSBzb3VyY2UgZWFybHkuIFdlIGNhbid0Ci0JCS8vIGdpdmUgZmVlZGJhY2sgaWYgaXQncyBub3QgYXZhaWxhYmxlIHlldCAodGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQpLgotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXNvdXJjZSA9IGdldERyYWdTb3VyY2UoZXZlbnQpOwotCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEdldCB0aGUgdGFyZ2V0IG9iamVjdCBmcm9tIHRoZSBpdGVtIHdpZGdldCBhbmQgdGhlIG1vdXNlIGxvY2F0aW9uIGluCi0JCS8vIGl0LgotCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RHJvcFRhcmdldChldmVudC5pdGVtKTsKLQkJZmxvYXQgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihldmVudCk7Ci0KLQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGNhbiBjcmVhdGUgYSB2YWxpZCBjb21tYW5kIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIGNhY2hlZCBjb21tYW5kLi4uCi0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCS8vIFdlJ2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgaW5mb3JtYXRpb24gd2UgdXNlIHRvIGNyZWF0ZSB0aGUKLQkJCS8vIGNvbW1hbmQsIHNvIHRoYXQgd2UgY2FuIHJlY3JlYXRlIGl0IGluIGRyb3AuCi0JCQlkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IG5ldyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbigKLQkJCQkJZG9tYWluLCB0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLAotCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHRhcmdldDsgY3JlYXRlIHRoZSBjb21tYW5kIGFuZCB0ZXN0IGlmIGl0IGlzCi0JCQkvLyBleGVjdXRhYmxlLgotCQkJY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCQl2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9IGVsc2UgewotCQkJLy8gQ2hlY2sgaWYgdGhlIGNhY2hlZCBjb21tYW5kIGNhbiBwcm92aWRlIERORAotCQkJLy8gZmVlZGJhY2svcmV2YWxpZGF0aW9uLgotCQkJaWYgKHRhcmdldCA9PSBjb21tYW5kVGFyZ2V0Ci0JCQkJCSYmIGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcEZlZWRiYWNrKSB7Ci0JCQkJLy8gSWYgc28sIHJldmFsaWRhdGUgdGhlIGNvbW1hbmQuCi0JCQkJdmFsaWQgPSAoKERyYWdBbmREcm9wRmVlZGJhY2spIGNvbW1hbmQpLnZhbGlkYXRlKHRhcmdldCwKLQkJCQkJCWxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLCBvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQotCQkJCS8vIEtlZXAgdHJhY2sgb2YgYW55IGNoYW5nZXMgdG8gdGhlIGNvbW1hbmQgaW5mb3JtYXRpb24uCi0JCQkJZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24oCi0JCQkJCQlkb21haW4sIHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsCi0JCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSWYgbm90LCBkaXNwb3NlIHRoZSBjdXJyZW50IGNvbW1hbmQgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuCi0JCQkJZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24oCi0JCQkJCQlkb21haW4sIHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsCi0JCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQkJCQljb21tYW5kVGFyZ2V0ID0gdGFyZ2V0OwotCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCQkJdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJCX0KLQkJfQotCi0JCS8vIElmIHRoaXMgY29tbWFuZCBjYW4gcHJvdmlkZSBkZXRhaWxlZCBkcmFnIGFuZCBkcm9wIGZlZWRiYWNrLi4uCi0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BGZWVkYmFjaykgewotCQkJLy8gVXNlIGl0IGZvciB0aGUgb3BlcmF0aW9uIGFuZCBkcmFnIHVuZGVyIGVmZmVjdC4KLQkJCURyYWdBbmREcm9wRmVlZGJhY2sgZHJhZ0FuZERyb3BGZWVkYmFjayA9IChEcmFnQW5kRHJvcEZlZWRiYWNrKSBjb21tYW5kOwotCQkJZXZlbnQuZGV0YWlsID0gZHJhZ0FuZERyb3BGZWVkYmFjay5nZXRPcGVyYXRpb24oKTsKLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJhZ0FuZERyb3BGZWVkYmFjay5nZXRGZWVkYmFjaygpCi0JCQkJCXwgZ2V0QXV0b0ZlZWRiYWNrKCk7Ci0JCX0gZWxzZSBpZiAoIXZhbGlkKSB7Ci0JCQkvLyBUaGVyZSBpcyBubyBleGVjdXRhYmxlIGNvbW1hbmQsIHNvIHdlJ2QgYmV0dGVyIG5peCB0aGUgd2hvbGUKLQkJCS8vIGRlYWwuCi0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0xpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTI3YmMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0xpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBkcmFnIGFkYXB0ZXIgZm9yIHRoZSBMaWJyYXJ5IFZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIgZXh0ZW5kcyBWaWV3ZXJEcmFnQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVkaXRvckRyYWdBZGFwdGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyKFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIodmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBkcmFnZ2luZyBpcyBpbml0aWF0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlzdXBlci5kcmFnU3RhcnQoZXZlbnQpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJLmdldFNlbGVjdGlvbigpOwotCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmCi0JCQkJCSEoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgJiYKLQkJCQkJIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCX0KLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIHRyYW5zZmVyIHRoZSBkYXRhLgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlpZiAoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSB8fAotCQkJCVRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQotCQkJU3RyaW5nIGxpbmtzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIGxpbmtUZXh0ID0gZ2V0SHlwZXJsaW5rKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlsaW5rcyArPSBTdHJVdGlsLkxJTkVfRkVFRDsKLQkJCQkJCX0KLQkJCQkJCWxpbmtzICs9IG5ldyBTdHJpbmcoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMobGlua1RleHQpKTsJCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlsaW5rcyArPSBTdHJVdGlsLkxJTkVfRkVFRDsKLQkJCQkJCX0KLQkJCQkJCWxpbmtzICs9IGxpbmtUZXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJaWYgKGxpbmtzLmxlbmd0aCgpID4gMCkgewotCQkJCWV2ZW50LmRhdGEgPSBsaW5rczsKLQkJCX0KLQkJfQotCQlzdXBlci5kcmFnU2V0RGF0YShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaHlwZXJsaW5rIGZvciB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIeXBlcmxpbmsoTWV0aG9kRWxlbWVudCBkcmFnRWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50IGRyb3BFbGVtZW50ID0gbnVsbDsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJZHJvcEVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCQotCQlpZihkcmFnRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJZHJhZ0VsZW1lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpZHJhZ0VsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJfQotCi0JCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGRyYWdFbGVtZW50LCBkcm9wRWxlbWVudCwgIi5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIG9iZXkgTGlicmFyeVZpZXdQcmVmUGFnZQotCQlTdHJpbmcgZGVmYXVsdExpbmtUeXBlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSUJfVklFV19ETkRfREVGQVVMVF9MSU5LVFlQRSk7Ci0JCVN0cmluZyB0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKFJlc291cmNlSGVscGVyLkVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhUeXBlLmVxdWFscyhkZWZhdWx0TGlua1R5cGUpKSB7Ci0JCQl0ZXh0ID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudExpbmtUZXh0KGRyYWdFbGVtZW50LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRleHQgPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGlua1RleHQoZHJhZ0VsZW1lbnQsIGZhbHNlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRMaW5rKGRyYWdFbGVtZW50LCB0ZXh0LAotCQkJCSJmaWxlOi8vIiArIGhyZWYsIGRlZmF1bHRMaW5rVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1N2Y1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0QmFzZUZvcm1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdEJhc2VGb3JtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZWZkYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0QmFzZUZvcm1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlRm9ybUVkaXRvciBleHRlbmRzIEZvcm1FZGl0b3IgaW1wbGVtZW50cyBJTWV0aG9kRWRpdG9yIHsKLQotCS8vIEdsb2JhbCBtYXAgdXNlZCB0byByZWNvcmQgd2hpY2ggZWRpdG9yIG1vZGlmaWVzIHRoZSBzaGFyZWQgcmVzb3VyY2UKLQkvLyBmaXJzdC4KLQkvLyBUaGlzIGVuYWJsZXMgdGhlIGFwcHJvcHJpYXRlIGVkaXRvcnMgdG8gYmUgZmxhZ2dlZCBhcyBkaXJ0eS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBTSEFSRURfUkVTT1VSQ0VfVE9fRURJVE9SU19NQVAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gSWYgdHJ1ZSwgZGVidWcgdHJhY2luZyBpcyBlbmFibGVkLgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBDb2xsZWN0aW9uIG9mIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsIGRhdGEgYmVpbmcgZWRpdGVkIGJ5Ci0JLy8gdGhpcyBlZGl0b3IuCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RCYXNlRm9ybUVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRQYWdlcygpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBzYXZpbmcgbGlicmFyeToiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCXJldHVybiBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlZGl0b3IncyBkaXJ0eSBzdGF0ZSBieSBhZGRpbmcgYSAiKiIgdG8gdGhlIGVkaXRvciB0YWIgYW5kCi0JICogZW5hYmxpbmcgdGhlIFNhdmUgYnV0dG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZURpcnR5U3RhdHVzKCkgewotCQlzdXBlci5lZGl0b3JEaXJ0eVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRkODYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVOb2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5Nb3ZlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUFjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5GcmVlVGV4dE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlN5bmNoQmFyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRnJlZVRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkRpYWdyYW1QcmludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLklNZXRob2RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZG5kLlRlbXBsYXRlVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmRuZC5UZW1wbGF0ZVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkNvcHlUZW1wbGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLlBhbGV0dGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhbGV0dGUuUGFsZXR0ZVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLkZseW91dFBhbGV0dGVDb21wb3NpdGUuRmx5b3V0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvcldpdGhGbHlvdXRQYWxldHRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGRpYWdyYW0gZWRpdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW0gVGhhcmlvCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtRWRpdG9yIGV4dGVuZHMKLQkJR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUgaW1wbGVtZW50cyBJTWV0aG9kRWRpdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWSA9ICJyZWZyZXNoX2Zyb21fYmFzZV9hY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0FWRVJBR0UgPQotCS8vICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRCA9Ci0JLy8gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX1ZFUlRfQVZFUkFHRSA9Ci0JLy8gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCA9Ci0JLy8gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UX0RJQUxPRyA9ICJmb250X2RpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfTElOSyA9ICJjcmVhdGVfbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTElOSyA9ICJzZWxlY3RfbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQkVORF9QT0lOVCA9ICJjcmVhdGVfYmVuZF9wb2ludCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRlJFRV9URVhUID0gImNyZWF0ZV9mcmVlX3RleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIm1vdmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIID0gInJlZnJlc2giOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9CRU5EX1BPSU5UID0gImFsaWduX2JlbmRfcG9pbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUxFVFRFX0RPQ0tfTE9DQVRJT04gPSAiRG9jayBsb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfU0laRSA9ICJQYWxldHRlIFNpemUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUxFVFRFX1NUQVRFID0gIlBhbGV0dGUgc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BBTEVUVEVfU0laRSA9IDEzMDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9ESUFHUkFNID0gImRlbGV0ZV9hY3R2aXR5X2RldGFpbF9kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBLZXlIYW5kbGVyIHNoYXJlZEtleUhhbmRsZXI7Ci0KLQlwcml2YXRlIFBhbGV0dGVSb290IHBhbGV0dGVSb290OwotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGVkaXRQYXJ0OwotCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tFdmVudExpc3RlbmVyIGNtZFN0YWNrRXZlbnRMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBDcmVhdGlvbkZhY3RvcnkgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgRGlhZ3JhbUFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQkvKioKLQkgKiBUaGUgcGFyZW50IGlzIHRoZSBlZGl0b3IgZnJvbSB3aGVyZSB0aGUgdXNlciBvcGVuZWQgdGhpcyBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IHBhcmVudEVkaXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gbGlzdGVuIGZvciBvdXIgcGFyZW50IGVkaXRvciBhbmQgb3VyIG93biBjbG9zaW5nLiBXaGVuIGl0Ci0JICogZG9lcywgd2UgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBjbG9zZSB0aGlzIGRpYWdyYW0gYXMgd2VsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJSUVkaXRvclBhcnQgbWUgPSBBYnN0cmFjdERpYWdyYW1FZGl0b3IudGhpczsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBlZGl0b3IgY2xvc2VkIGFzIGEgcmVzdWx0IG9mIHVzZXIgYWN0aW9uIG9yIHRoZQotCQkJLy8gd29ya2JlbmNoIGNsb3NpbmcKLQkJCS8vIElXb3JrYmVuY2ggd2IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQkJaWYgKHBhcnQgPT0gbWUpIHsKLQkJCQlzZXRQYXJlbnRFZGl0b3IobnVsbCk7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCQkJcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCQkvLyByZW1vdmUgdGhpcyBkaWFncmFtIGlmIGl0IGlzIG5ldwotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJLmdldENvbnRlbnRzKCkpLmdldE1vZGVsKCk7Ci0JCQkJLy8gbWFrZSBzdXJlIHdlIHJlbW92ZSB0aGUgVU1BIGRpYWdyYW0gZnJvbSB0aGUgbW9kZWwgaWYgaXQgaXMKLQkJCQkvLyBuZXcgKG5ldmVyIHNhdmVkKQotCQkJCWlmIChkaWFncmFtLmlzTmV3KCkpIHsKLQkJCQkJaWYgKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCX0KLQkJCQkJaWYoaXNSZXNvdXJjZUNoYW5nZWRCeU90aGVyKCkpIHsKLQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gZWxzZSBpZiAoIXdiLmlzQ2xvc2luZygpKSB7Ci0JCQkvLyAvLyBhcmUgd2UgYmVpbmcgbm90aWZpZWQgYWJvdXQgb3VyIHBhcmVudCBlZGl0b3Igb2JqZWN0PwotCQkJLy8gaWYgKGdldFBhcmVudEVkaXRvcigpICE9IG51bGwpIHsKLQkJCS8vIGlmIChwYXJ0ID09IGdldFBhcmVudEVkaXRvcigpKSB7Ci0JCQkvLyBJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCS8vIC8vIHllcywgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBjbG9zZSB0aGlzCi0JCQkvLyAvLyBlZGl0b3IKLQkJCS8vIGlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJLy8gLmdldERlZmF1bHQoKQotCQkJLy8gLmdldE1zZ0RpYWxvZygpCi0JCQkvLyAuZGlzcGxheVByb21wdCgKLQkJCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5QYXJlbnRFZGl0b3JDbG9zZS50aXRsZSIpLAotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCQkvLyAuZm9ybWF0U3RyaW5nKAotCQkJLy8gIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IuUGFyZW50RWRpdG9yQ2xvc2UudGV4dCIsCi0JCQkvLyBnZXRQYXJlbnRFZGl0b3IoKS5nZXRUaXRsZSgpLCBtZS5nZXRUaXRsZSgpKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gLy8geWVzLCBjbG9zZSB0aGlzIGRpYWdyYW0sIGFzayB0byBzYXZlIGNoYW5nZXMKLQkJCS8vIHBhZ2UuY2xvc2VFZGl0b3IobWUsIHRydWUpOwotCQkJLy8gfQotCQkJLy8gLy8gZWl0aGVyIHdheSwgb3VyIHBhcmVudCBpcyBjbG9zZWQgYW5kIHdlIGNhbiBzdG9wCi0JCQkvLyAvLyBsaXN0ZW5pbmcKLQkJCS8vIHBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0JfTsKLQotCXByaXZhdGUgRm9udCBmb250OwotCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotCXByaXZhdGUgQ29tbWFuZCByZWZyZXNoRnJvbUJhc2VDb21tYW5kID0gbmV3IENvbW1hbmQoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZSkgeyAKLQkJcHJpdmF0ZSBBcnJheUxpc3Qgb2xkQ29udGVudCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIGRpYWdyYW0gY29udGVudAotCQkJLy8KLQkJCW9sZENvbnRlbnQuY2xlYXIoKTsKLQkJCW9sZENvbnRlbnQuYWRkQWxsKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpKTsKLQotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQllZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCQlkaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJY3JlYXRlRWRpdFBhcnQoKTsKLQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCWRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlkaWFncmFtLmdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGRBbGwob2xkQ29udGVudCk7Ci0JCQlpZiAoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNYXAgdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXA7Ci0JLyoqCi0JICogUmVjb3JkcyB0aW1lIHdoZW4gdGhlIG1vZGVsIGZpcnN0IGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhpcyBlZGl0b3IuIFRoaXMgd2lsbCBiZSB1c2VkIGxhdGVyCi0JICogdG8gZGV0ZXJtaW5lIGlmIHNhdmUgaXMgbmVlZGVkIHRvIHJldmVyc2UgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgY2hhbmdlVGltZSA9IC0xOwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQljbGFzcyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIgewotCi0JCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgV29ya2Zsb3dDb250ZXh0TWVudVByb3ZpZGVyIGFzc29pY2F0ZWQgd2l0aCB0aGUgZ2l2ZW4KLQkJICogdmlld2VyIGFuZCBhY3Rpb24gcmVnaXN0cnkuCi0JCSAqIAotCQkgKiBAcGFyYW0gdmlld2VyCi0JCSAqICAgICAgICAgICAgdGhlIHZpZXdlcgotCQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkJICogICAgICAgICAgICB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLAotCQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcih2aWV3ZXIpOwotCQkJc2V0QWN0aW9uUmVnaXN0cnkocmVnaXN0cnkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQ29udGV4dE1lbnVQcm92aWRlciNidWlsZENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWlsZENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQlHRUZBY3Rpb25Db25zdGFudHMuYWRkU3RhbmRhcmRBY3Rpb25Hcm91cHMobWVudSk7Ci0KLQkJCUlBY3Rpb24gYWN0aW9uOwotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCkpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9VTkRPLCBhY3Rpb24pOwotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8sIGFjdGlvbik7Ci0KLQkJCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKQotCQkJCQkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSkgewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfVklFVywgYWN0aW9uKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRk9OVF9ESUFMT0cpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCX0KLQotCQkJSUFjdGlvbiBjcmVhdGVGcmVlVGV4dEFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlDUkVBVEVfRlJFRV9URVhUKTsKLQkJCWlmIChjcmVhdGVGcmVlVGV4dEFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWNyZWF0ZUZyZWVUZXh0QWN0aW9uKTsKLQkJCX0KLQotCQkJLy8gSUFjdGlvbiBtb3ZlQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oTU9WRSk7Ci0JCQkvLyBpZihtb3ZlQWN0aW9uLmlzRW5hYmxlZCgpKXsKLQkJCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLG1vdmVBY3Rpb24pOwotCQkJLy8gfQotCQkJSUFjdGlvbiBsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspOwotCQkJaWYgKGxpbmtBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGxpbmtBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBzZWxlY3RsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCVNFTEVDVF9MSU5LKTsKLQkJCWlmIChzZWxlY3RsaW5rQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQlzZWxlY3RsaW5rQWN0aW9uKTsKLQkJCX0KLQkJCUlBY3Rpb24gYmVuZHBvaW50QWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCUNSRUFURV9CRU5EX1BPSU5UKTsKLQkJCWlmIChiZW5kcG9pbnRBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQliZW5kcG9pbnRBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBhbGlnbmJlbmRwb2ludGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlBTElHTl9CRU5EX1BPSU5UKTsKLQkJCWlmIChhbGlnbmJlbmRwb2ludGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWFsaWduYmVuZHBvaW50YWN0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy9QcmludCBBY3Rpb24gZm9yIGRpYWdyYW0gdGhyb3VnaCBDb250ZXh0IE1lbnUuCi0JCQkvLyBFbmFibGUgdGhpcyBjb2RlIHdoZW4gcHJpbnQgcmVxdWlyZWQgZm9yIGRpYWdyYW0uCi0vLwkJCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuUFJJTlQuZ2V0SWQoKSk7Ci0vLwkJCWlmKGFjdGlvbi5pc0VuYWJsZWQoKSl7Ci0vLwkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1BSSU5ULCBhY3Rpb24pOwotLy8JCQl9Ci0JCQkKLQkJCWNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICogCi0JCSAqIEBwYXJhbSByZWdpc3RyeQotCQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEFjdGlvblJlZ2lzdHJ5KEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlhY3Rpb25SZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRFZGl0RG9tYWluKG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKSk7Ci0JCWdldEVkaXREb21haW4oKS5zZXRDb21tYW5kU3RhY2sobmV3IENvbW1hbmRTdGFjaygpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSBnZXRVbmRvQ29tbWFuZCgpOwotCQkJCWlmIChjbWQgIT0gbnVsbCAmJiAhY21kLmNhblVuZG8oKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjayNleGVjdXRlKG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJCWlmKGNvbW1hbmQgPT0gbnVsbCB8fCAhY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZihjaGFuZ2VUaW1lID09IC0xKSB7Ci0JCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJc3VwZXIuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYWRkIENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIKLQkJLy8KLQkJY21kU3RhY2tFdmVudExpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YWNrQ2hhbmdlZChDb21tYW5kU3RhY2tFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXREZXRhaWwoKSA9PSBDb21tYW5kU3RhY2suUE9TVF9FWEVDVVRFKSB7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoCi0JCQkJY21kU3RhY2tFdmVudExpc3RlbmVyKTsKLQkJLy8gYWRkIG91ciBwYXJ0IGxpc3RlbmVyIGlmIGVpdGhlciBwYXJlbnQgb3IgdGhpcyBjbG9zZXMKLQkJSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luID0gd2IuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW4uZ2V0QWN0aXZlUGFnZSgpOwotCQlwYWdlLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRDb21tYW5kU3RhY2soKQotCQkJCS5yZW1vdmVDb21tYW5kU3RhY2tFdmVudExpc3RlbmVyKGNtZFN0YWNrRXZlbnRMaXN0ZW5lcik7Ci0KLQkJaWYgKGlzRGlydHkoKSkgewotCQkJLy8gY2hhbmdlcyBkaXNjYXJkZWQsIHJldmVyc2UgdG8gc2F2ZWQKLQkJCS8vCi0JCQlyZXZlcnNlVG9TYXZlZCgpOwotCQl9Ci0KLQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZGlzcG9zZWQgPSB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNSZXNvdXJjZUNoYW5nZWRCeU90aGVyKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKS5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSl7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlyZXR1cm4gZmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNoYW5nZVRpbWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXZlcnNlVG9TYXZlZCgpIHsKLQkJLy8gc2F2ZSB0aGUgdW5kb25lIGNoYW5nZXMgb25seSBpZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHRoaXMgZWRpdG9yCi0JCS8vCi0JCWJvb2xlYW4gc2F2ZU5lZWRlZCA9IGdldENvbW1hbmRTdGFjaygpLmlzRGlydHkoKSAmJiBpc1Jlc291cmNlQ2hhbmdlZEJ5T3RoZXIoKTsKLQkJY2hhbmdlVGltZSA9IC0xOwotCQl3aGlsZSAoZ2V0Q29tbWFuZFN0YWNrKCkuaXNEaXJ0eSgpKSB7Ci0JCQlnZXRDb21tYW5kU3RhY2soKS51bmRvKCk7Ci0JCX0KLQkJaWYgKHNhdmVOZWVkZWQpIHsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5zYXZlKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KGdldFNpdGUoKS5nZXRTaGVsbCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJUkVGUkVTSF9GUk9NX0JBU0VfQUNUSVZJVFkpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJLy8gdGhlIGFsaWduIG1lbnUgaXMgYSBjYXNjYWRpbmcgbWVudQotCQlJQ29udHJpYnV0aW9uSXRlbSBjaSA9IGNyZWF0ZUFsaWduTWVudSgpOwotCQlpZiAoY2kuaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBjaSk7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihERUxFVEVfRElBR1JBTSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW0gY3JlYXRlQWxpZ25NZW51KCkgewotCQkvLyBjcmVhdGUgYSBuZXcgbWVudSBtYW5hZ2VyIGZvciB0aGUgY2FzY2FkaW5nIG1lbnUKLQkJTWVudU1hbmFnZXIgYWxpZ25NZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0KSB7IAotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaW50IHRvdGFsID0gMDsKLQkJCQkvLyBlbmFibGUgdGhlIG1lbnUgb25seSBpZiAyIG9yIG1vcmUgbm9kZXMgb3Igbm9kZSBjb250YWluZXJzCi0JCQkJLy8gYXJlIHNlbGVjdGVkCi0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCS8vIG5lZWQgYXQgbGVhc3QgdHdvIHRoaW5ncyBzZWxlY3RlZCB0byBhbGlnbgotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID4gMSkgewotCQkJCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoYSk7Ci0JCQkJCQkvLyB3ZSBjYW4gYWxpZ24gbm9kZXMgYW5kIGNvbnRhaW5lcnMKLQkJCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQkJCQl8fCBlZGl0UGFydCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCQkJCS8vIGFkZCB1cCB0aGUgZWxlbWVudHMgd2UgbmVlZCwgdGhlcmUgbWF5IGJlIG1vcmUKLQkJCQkJCQkvLyBlbGVtZW50cyBzZWxlY3RlZCAobGlua3MsIGV0Yy4pCi0JCQkJCQkJdG90YWwrKzsKLQkJCQkJCQlpZiAodG90YWwgPiAxKSB7Ci0JCQkJCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBrbm93IHRoZXJlIGlzIG1vcmUgdGhhbiAxLCBzbwotCQkJCQkJCQkvLyB3ZSBjYW4gc3RvcCBoZXJlCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdG90YWwgPiAxOwotCQkJfQotCQl9OwotCQkvLyBhZGQgdGhlIGFjdGlvbnMgdG8gdGhpcyBtZW51Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX0hPUlpfQVZFUkFHRSkpOwotCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfQVZFUkFHRSkpOwotCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCXJldHVybiBhbGlnbk1lbnVNYW5hZ2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGcm9tQmFzZSgpIHsKLQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShyZWZyZXNoRnJvbUJhc2VDb21tYW5kKTsKLQotCQkvLyBEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkvLyBPYmplY3QgYWN0ID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJLy8gaWYoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkvLyBlZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCS8vIH0KLQkJLy8gZGlhZ3JhbS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJLy8gZWRpdFBhcnQgPSBjcmVhdGVFZGl0UGFydChhY3QpOwotCQkvLyBnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCi0JCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQkJSUFjdGlvbiBhY3Rpb247Ci0KLQkJLy8gcmVwbGFjZSBkZWZhdWx0IGRlbGV0ZSBhY3Rpb24gd2l0aCBhIGN1c3RvbSBvbmUKLQkJLy8KLQkJYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUFjdGlvbihhY3Rpb24pOwotCQkJZ2V0U2VsZWN0aW9uQWN0aW9ucygpLnJlbW92ZShhY3Rpb24pOwotCQl9Ci0JCWFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KSB0aGlzKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuV29ya2JlbmNoUGFydEFjdGlvbiNpc0VuYWJsZWQoKQotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmlzRW5hYmxlZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkRlbGV0ZUFjdGlvbiNjYWxjdWxhdGVFbmFibGVkKCkKLQkJCSAqLwotCQkJLy8gcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFNlbGVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBlZGl0UGFydCA9IGl0ZXIubmV4dCgpOwotCQkJLy8gaWYoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJLy8gT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpZWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCS8vIE9iamVjdCBlbGVtZW50ID0gKChOYW1lZE5vZGUpb2JqKS5nZXRPYmplY3QoKTsKLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyByZXR1cm4gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotCQkJLy8gfQotCQkJLy8gVE9ETzogdW5jb21tZW50IHRoaXMgY29kZSBpZiB3ZSBhcmUgcmVhZHkgdG8gdGVzdCBkZWxldGluZwotCQkJLy8gQnJlYWtkb3duRWxlbWVudCBub2RlCi0JCQkvLwotCQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkJLy8gKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkRlbGV0ZUFjdGlvbiNydW4oKQotCQkJLy8gKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFNlbGVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlZGl0UGFydCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCQkJT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRNb2RlbCgpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKChOYW1lZE5vZGUpIG9iaikuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNyZWF0ZUNvbW1hbmQoCi0JCQkJCQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCQkJZG9tYWluID0gbnVsbDsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkb21haW4gPT0gbnVsbCkgewotCQkJCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsKLQkJCQkJZGVsZXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQllbGVtZW50cykpOwotCQkJCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0JCQkJCWlmIChkZWxldGVBY3Rpb24uaXNEZWxldGlvbkNvbmZpcm1lZCgpKSB7Ci0JCQkJCQlzdXBlci5ydW4oKTsKLQotCQkJCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJCQkvLyAKLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlzdXBlci5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCWdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCWFjdGlvbiA9IG5ldyBDb3B5VGVtcGxhdGVBY3Rpb24odGhpcyk7Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJLy8gcmVmcmVzaCBkaWFncmFtIGZyb20gYmFzZSBhY3Rpb24KLQkJLy8KLQkJYWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQpIHsgCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlZnJlc2hGcm9tQmFzZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCQkJcmV0dXJuIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTWF0Y2hXaWR0aEFjdGlvbih0aGlzKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJLy8gYWN0aW9uID0gbmV3IE1hdGNoSGVpZ2h0QWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTG9naWNQYXN0ZVRlbXBsYXRlQWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgSW5jcmVtZW50RGVjcmVtZW50QWN0aW9uKHRoaXMsIHRydWUpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEluY3JlbWVudERlY3JlbWVudEFjdGlvbih0aGlzLCBmYWxzZSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgRGlyZWN0RWRpdEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcyk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlJJR0hUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5CT1RUT00pOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFsaWdubWVudEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcywKLQkJLy8gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLk1JRERMRSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCUlBY3Rpb24gYWN0aW9uMSA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dCkgeyAKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEZPTlRfRElBTE9HOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJCQotCQkJCQkJRm9udERpYWxvZyBmZCA9IG5ldyBGb250RGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCS8vIFJlc3RvcmluZyBvbGQgdmFsdWVzLgotCQkJCQkJaWYoc2VsZWN0ZWRFZGl0UGFydCAhPSBudWxsKXsKLQkJCQkJCQlyZXN0b3JlRm9udERhdGEoc2VsZWN0ZWRFZGl0UGFydCwgZmQpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlpZiAoc2VsZWN0ZWRFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJaWYgKGZkLmdldEZvbnRMaXN0KCkgIT0gbnVsbCkgewotCQkJCQkJCQlGb250RGF0YSBmRGF0YSA9IGZkLmdldEZvbnRMaXN0KClbMF07Ci0JCQkJCQkJCWlmIChmRGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJLy8gaWYoY29sb3IgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpewotCQkJCQkJCQkJLy8gY29sb3IuZGlzcG9zZSgpOwotCQkJCQkJCQkJLy8gfQotCQkJCQkJCQkJZm9udCA9IG5ldyBGb250KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldERpc3BsYXkoKSwgZkRhdGEpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlpZihmZC5nZXRSR0IoKSAhPSBudWxsKQotCQkJCQkJCQkJY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgZmQuZ2V0UkdCKCkpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpLnNldEZvbnQoZm9udCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmKGNvbG9yICE9IG51bGwpCi0JCQkJCQkJCQkoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpCi0JCQkJCQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCi0JCQkJCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKChOb2RlKSBzZWxlY3RlZEVkaXRQYXJ0Ci0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZQotCQkJCQkJCQkJCQkuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQotCQkJCQkJCQkJU3RyaW5nIHRleHQgPSAoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpLmdldFRleHQoKTsKLQkJCQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0JCQkJCQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQkJCQkJCXByb3BlcnR5LnNldFZhbHVlKHRleHQpOwotCQkJCQkJCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUsCi0JCQkJCQkJCQkJCWZEYXRhLmdldE5hbWUoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZkRhdGEuZ2V0U3R5bGUoKSkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQsCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZEYXRhLmdldEhlaWdodCgpKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCWlmKGZkLmdldFJHQigpICE9IG51bGwpewotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVELAotCQkJCQkJCQkJCQluZXcgSW50ZWdlcihmZC5nZXRSR0IoKS5yZWQpCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZmQuZ2V0UkdCKCkuYmx1ZSkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTiwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZmQuZ2V0UkdCKCkuZ3JlZW4pCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJc2VsZWN0ZWRFZGl0UGFydC5yZWZyZXNoKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCXJldHVybiAoKChUeXBlZE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHlCeUtleShMaXN0IGxpc3QsIFN0cmluZyBrZXkpIHsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXJvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXJvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgaXJvci5uZXh0KCk7Ci0JCQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQkJCWlmIChwcm9wZXJ0eS5nZXRLZXkoKS5lcXVhbHMoa2V5KSkgewotCQkJCQkJCQlyZXR1cm4gcHJvcGVydHk7Ci0JCQkJCQkJfSAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoTGlzdCBsaXN0LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBrZXkpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCQkJcHJvcGVydHkuc2V0S2V5KGtleSk7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVzdG9yZUZvbnREYXRhKEVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQsIEZvbnREaWFsb2cgZmQpewotCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoKE5vZGUpIHNlbGVjdGVkRWRpdFBhcnQKLQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlCi0JCQkJCQkuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQkJaWYobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSl7Ci0JCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgZm9udG5hbWUgPSBudWxsLCBmb250U3R5bGUgPSBudWxsLCBmb250SGVpZ2h0ID0gbnVsbCwgcmVkID0gbnVsbCwgYmx1ZSA9IG51bGwsIGdyZWVuID0gbnVsbDsKLQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsICl7Ci0JCQkJCQkJZm9udG5hbWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsICl7Ci0JCQkJCQkJZm9udFN0eWxlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0hFSUdIVCk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlmb250SGVpZ2h0ID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlyZWQgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlibHVlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKTsKLQkJCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQkJCWdyZWVuID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJRm9udERhdGEgZkRhdGEgPSBuZXcgRm9udERhdGEoKTsKLQkJCQkJCWZEYXRhLnNldE5hbWUoZm9udG5hbWUpOwotCQkJCQkJZkRhdGEuc2V0SGVpZ2h0KChuZXcgSW50ZWdlcihmb250SGVpZ2h0KSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlmRGF0YS5zZXRTdHlsZSgobmV3IEludGVnZXIoZm9udFN0eWxlKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQkKLQkJCQkJCS8vLCAobmV3IEludGVnZXIoZm9udFN0eWxlKSkuaW50VmFsdWUoKSwgKG5ldyBJbnRlZ2VyKGZvbnRIZWlnaHQpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCWlmKCByZWQgIT0gbnVsbCAmJiBibHVlICE9IG51bGwgJiYgZ3JlZW4gIT0gbnVsbCl7Ci0JCQkJCQkJUkdCIHJnYiA9IG5ldyBSR0IobmV3IEludGVnZXIocmVkKS5pbnRWYWx1ZSgpLAotCQkJCQkJCQkJbmV3IEludGVnZXIoZ3JlZW4pLmludFZhbHVlKCksCi0JCQkJCQkJCQkgbmV3IEludGVnZXIoYmx1ZSkuaW50VmFsdWUoKQotCQkJCQkJCQkJICk7Ci0JCQkJCQkJZmQuc2V0UkdCKHJnYik7Ci0vLwkJCQkJCQlpZihyZ2IgIT0gbnVsbCl7Ci0vLwkJCQkJCQkJcmdiLnJlZCA9IG5ldyBJbnRlZ2VyKHJlZCkuaW50VmFsdWUoKTsKLS8vCQkJCQkJCQlyZ2IuYmx1ZSA9IG5ldyBJbnRlZ2VyKGJsdWUpLmludFZhbHVlKCk7Ci0vLwkJCQkJCQkJcmdiLmdyZWVuID0gbmV3IEludGVnZXIoZ3JlZW4pLmludFZhbHVlKCk7Ci0vLwkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmZC5zZXRGb250TGlzdChuZXcgRm9udERhdGFbXXtmRGF0YX0pOwotCQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uMSk7Ci0KLQkJLy8gSmluaHVhIFhpCi0JCS8vIGFkZGVkIHRoaXMgdG8gY29uc29saWRhdGUgY29tbW9uIGFjdGlvbnMgaW50byBhIHNlcnZpY2UgY2xhc3MKLQkJYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uU2VydmljZShnZXRHcmFwaGljYWxWaWV3ZXIoKSwKLQkJCQlnZXRFZGl0RG9tYWluKCksIHJlZ2lzdHJ5KTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3Rlckhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3Rlckhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25BdmVyYWdlQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCi0JCS8vIC8vIGFsaWduIGhvcml6b250YWxseSB0byBhdmVyYWdlIHktdmFsdWUgb2YgYWxsIG5vZGVzCi0JCS8vIElBY3Rpb24gaEFsaWduQXZlcmFnZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLmhBbGlnbkF2ZXJhZ2VBY3Rpb24udGV4dCIpKQotCQkvLyB7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gQUxJR05fSE9SWl9BVkVSQUdFOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduQXZlcmFnZUFjdGlvbik7Ci0JCS8vCi0JCS8vIC8vIGFsaWduIGhvcml6b250YWxseSB0byB5LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJLy8gSUFjdGlvbiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCS8vIC5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IuaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbi50ZXh0IikpCi0JCS8vIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIGhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0JCS8vCi0JCS8vIC8vIGFsaWduIHZlcnRpY2FsbHkgdG8gYXZlcmFnZSB4LXZhbHVlIG9mIGFsbCBzZWxlY3RlZCBub2RlcwotCQkvLyBJQWN0aW9uIHZBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci52QWxpZ25BdmVyYWdlQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIEFMSUdOX1ZFUlRfQVZFUkFHRTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCQkvLwotCQkvLyAvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIHgtdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQkvLyBJQWN0aW9uIHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci52QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24odkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0ZSRUVfVEVYVCwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5tb3ZlQWN0aW9uX2xhYmVsKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JCQkJc3VwZXIuc2V0SW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIucnVuV2l0aEV2ZW50KGV2ZW50KTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3VwZXIucnVuKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPiAwKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIE1PVkU7Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCUlBY3Rpb24gbGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDIpIHsKLQkJCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDEpOwotCQkJCQlMaXN0IHRhcmdldExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0Ci0JCQkJCQkJfHwgdGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkKLQkJCQkJCXJldHVybjsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQl0YXJnZXRMaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQotCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmICghdGFyZ2V0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0YXJnZXRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmtFZGl0UGFydCBvYmogPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0U291cmNlKCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRUYXJnZXQoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJdGFyZ2V0TGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkKLQkJCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlpZiAoIXRhcmdldExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGFyZ2V0TGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgb2JqID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmICh0YXJnZXRFZGl0UGFydC5lcXVhbHMob2JqLmdldFNvdXJjZSgpKSkKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0VGFyZ2V0KCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlMaW5rIGxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKQotCQkJCQkJbGluay5zZXRTb3VyY2UoKE5vZGUpIHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkpOwotCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpCi0JCQkJCQlsaW5rLnNldFRhcmdldCgoTm9kZSkgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ3JlYXRlTGlua0NvbW1hbmQoCi0JCQkJCQkJbGluaywgKE5vZGUpIHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBwYXJ0ID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgRnJlZVRleHROb2RlRWRpdFBhcnQpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQ1JFQVRFX0xJTks7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obGlua0FjdGlvbik7Ci0KLQkJSUFjdGlvbiBzZWxlY3RMaW5rQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0KSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKExpbmtFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JCQkJCQkJbGlua3BhcnQuc2V0U2VsZWN0ZWQoMSk7Ci0JCQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2VsZWN0KGxpbmtwYXJ0KTsKLQkJCQkJCQkvLyBwYXJ0LnNldFNlbGVjdGVkKDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gU0VMRUNUX0xJTks7Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzZWxlY3RMaW5rQWN0aW9uKTsKLQotCQlJQWN0aW9uIGNyZWF0ZUJlbmRQb2ludEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJCS8vIHJldHVybiB0cnVlOwotCQkJCQkJTGluayBsaW5rID0gKExpbmspICgoTGlua0VkaXRQYXJ0KSBwYXJ0KS5nZXRNb2RlbCgpOwotCQkJCQkJTGlzdCBiZW5kcG9pbnRzID0gbGluay5nZXRCZW5kcG9pbnRzKCk7Ci0JCQkJCQlpZiAoYmVuZHBvaW50cyA9PSBudWxsIHx8IGJlbmRwb2ludHMuc2l6ZSgpIDwgMSkgewotCQkJCQkJCVBvaW50IHNwID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJCQkJCVBvaW50IHRwID0gbGluay5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJCQkJCWlmIChzcCA9PSBudWxsKSB7Ci0JCQkJCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCQkJCXNwID0gKChOb2RlKSBsaW5rLmVDb250YWluZXIoKSkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlzcCA9IGxpbmsuZ2V0U291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAodHAgPT0gbnVsbCkgewotCQkJCQkJCQl0cCA9IGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJUG9pbnQgYlBvaW50ID0gbmV3IFBvaW50KCk7Ci0JCQkJCQkJYlBvaW50LnggPSAoc3AueCArIHRwLngpIC8gMjsKLQkJCQkJCQliUG9pbnQueSA9IChzcC55ICsgdHAueSkgLyAyOwotCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCWxpbmssIGJQb2ludCwgMCk7Ci0JCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQ1JFQVRFX0JFTkRfUE9JTlQ7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oY3JlYXRlQmVuZFBvaW50QWN0aW9uKTsKLQotCQlJQWN0aW9uIHJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5yZWZyZXNoQWN0aW9uX2xhYmVsKSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCWlmIChlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCQl9Ci0JCQkJZGlhZ3JhbS5yZW1vdmVDb25zdW1lcihBYnN0cmFjdERpYWdyYW1FZGl0b3IudGhpcyk7Ci0JCQkJY3JlYXRlRWRpdFBhcnQoKTsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIFJFRlJFU0g7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24ocmVmcmVzaEFjdGlvbik7Ci0JCUlBY3Rpb24gZGVsZXRlRGlhZ3JhbUFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCwgCi0JCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5EZWxldGVEaWFncmFtX3Byb21wdCkpIHsgCi0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5nZXRDb250ZW50cygpKS5nZXRNb2RlbCgpOwotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKAotCQkJCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCksIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlyZXR1cm4gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5zaXplKCkgPT0gMDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gREVMRVRFX0RJQUdSQU07Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihkZWxldGVEaWFncmFtQWN0aW9uKTsKLQkJSUFjdGlvbiBhbGlnbkJlbmRQb2ludEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLmFsaWduX2JlbmRfcG9pbnRfdGV4dCkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKChMaW5rRWRpdFBhcnQpIHBhcnQpOwotCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLQotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgc3BhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgdHBhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCi0JCQkJCQlQb2ludCBzcCA9IHNwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJUG9pbnQgdHAgPSB0cGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQotCQkJCQkJaWYgKHNwYXJ0IGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlRWRpdFBhcnQKLQkJCQkJCQkJfHwgc3BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkgewotCQkJCQkJCXNwID0gKChUeXBlZE5vZGUpIHNwYXJ0LmdldE1vZGVsKCkpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNwYXJ0KQotCQkJCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyh0cGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gKChMaW5rKSBscAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQkJCXNwID0gc3AuZ2V0VHJhbnNsYXRlZChzb3VyY2VFbmRQb2ludCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICh0cGFydCBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZUVkaXRQYXJ0Ci0JCQkJCQkJCXx8IHRwYXJ0IGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCQl0cCA9ICgoVHlwZWROb2RlKSB0cGFydC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSB0cGFydCkKLQkJCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoc3BhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9ICgoTGluaykgbHAKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQodGFyZ2V0RW5kUG9pbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCk7IGkrKykgewotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IG9sZGJwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkuZ2V0QmVuZHBvaW50cygpLmdldChpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBBYnNvbHV0ZUJlbmRwb2ludCgKLQkJCQkJCQkJCW5ldyBQb2ludCgtMSwgLTEpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBwcmV2aW91c2JwID0gbnVsbDsKLQkJCQkJCQlpbnQgZGVsdGEgPSA0MDsKLQkJCQkJCQlpbnQgcG9zaXRpb24gPSAwOwotCi0JCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQlwb3NpdGlvbiA9IHNwLmdldFBvc2l0aW9uKG9sZGJwKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcmV2aW91c2JwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkJLmdldEJlbmRwb2ludHMoKS5nZXQoaSAtIDEpOwotCQkJCQkJCQlwb3NpdGlvbiA9IHByZXZpb3VzYnAuZ2V0UG9zaXRpb24ob2xkYnApOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChwb3NpdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSAotCQkJCQkJCQkJfHwgcG9zaXRpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpIHsKLQkJCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQkJaWYgKHNwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgc3AueCArIGRlbHRhID4gb2xkYnAueAotCQkJCQkJCQkJCQkmJiAhKHNwLnggPT0gb2xkYnAueCkpIHsKLQkJCQkJCQkJCQlicC54ID0gc3AueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChwcmV2aW91c2JwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgcHJldmlvdXNicC54ICsgZGVsdGEgPiBvbGRicC54Ci0JCQkJCQkJCQkJCSYmICEocHJldmlvdXNicC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHByZXZpb3VzYnAueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpIC0gMSA9PSBpKSB7Ci0JCQkJCQkJCQlpZiAodHAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiB0cC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEodHAueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSB0cC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJYnAueSA9IG9sZGJwLnk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QKLQkJCQkJCQkJCXx8IHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpIHsKLQotCQkJCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQkJCQlpZiAoc3AueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBzcC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEoc3AueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSBzcC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHByZXZpb3VzYnAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBwcmV2aW91c2JwLnkgKyBkZWx0YSA+IG9sZGJwLnkKLQkJCQkJCQkJCQkJJiYgIShwcmV2aW91c2JwLnkgPT0gb2xkYnAueSkpIHsKLQkJCQkJCQkJCQlicC55ID0gcHJldmlvdXNicC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgLSAxID09IGkpIHsKLQkJCQkJCQkJCWlmICh0cC54IC0gZGVsdGEgPCBvbGRicC54Ci0JCQkJCQkJCQkJCSYmIHRwLnggKyBkZWx0YSA+IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgISh0cC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHRwLng7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlicC54ID0gb2xkYnAueDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYnAueCA9PSAtMSAmJiBicC55ICE9IC0xKSB7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQkJbGluaywgbmV3IFBvaW50KG9sZGJwLngsIGJwLnkpLCBpKTsKLQkJCQkJCQkJLy8gKChSb290RWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGJwLnggIT0gLTEgJiYgYnAueSA9PSAtMSkgewotCQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJCWxpbmssIG5ldyBQb2ludChicC54LCBvbGRicC55KSwgaSk7Ci0JCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChicC54ICE9IC0xICYmIGJwLnkgIT0gLTEpIHsKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQoYnAueCwgYnAueSksIGkpOwotCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgbGlzdCA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJaWYgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlMaW5rRWRpdFBhcnQgcGFydCA9IChMaW5rRWRpdFBhcnQpIGxpc3QuZ2V0KDApOwotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fQkVORF9QT0lOVDsKLQkJCX0KLQotCQl9OwotCQkKLQkJLy8gVmlld2VyIFByaW50IEFjdGlvbgotCQlhY3Rpb24gPSBuZXcgRGlhZ3JhbVByaW50QWN0aW9uKHRoaXMsIGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhbGlnbkJlbmRQb2ludEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQW5BY3Rpb24oU3RyaW5nIGFjdGlvbk5hbWUsCi0JCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5LCBTdHJpbmcgYWN0aW9uSWQsCi0JCQlTdHJpbmcgdG9vbHRpcFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzYykgewotCQlmaW5hbCBDcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0aW9uRmFjdG9yeTsKLQkJZmluYWwgU3RyaW5nIGlkID0gYWN0aW9uSWQ7Ci0JCWZpbmFsIFN0cmluZyB0b29sdGlwID0gdG9vbHRpcFN0cmluZzsKLQkJZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzY3JpcHRvciA9IGltYWdlZGVzYzsKLQkJcmV0dXJuIG5ldyBBY3Rpb24oYWN0aW9uTmFtZSkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNyZWF0ZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBDcmVhdGVSZXF1ZXN0KCk7Ci0JCQkJLy8gQ3JlYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KHRlbXBsYXRlKTsKLQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJcmVxdWVzdC5zZXRGYWN0b3J5KGZhY3RvcnkpOwotCQkJCXJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLCAxMCkpOwotCi0JCQkJaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCVBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJCQkJRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDcmVhdGVOb2RlQ29tbWFuZCgKLQkJCQkJCQkoTm9kZSkgcmVxdWVzdC5nZXROZXdPYmplY3QoKSwgcGFyZW50LCBsb2MpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCQkJcmV0dXJuIHRvb2x0aXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JCQkJc3VwZXIuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlZGVzY3JpcHRvcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJCXJldHVybiBpbWFnZWRlc2NyaXB0b3I7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVWaWV3ZXJQcm92aWRlciBjcmVhdGVQYWxldHRlVmlld2VyUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgUGFsZXR0ZVZpZXdlclByb3ZpZGVyKGdldEVkaXREb21haW4oKSkgewotCQkJcHJpdmF0ZSBJTWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lcjsKLQotCQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUGFsZXR0ZVZpZXdlcihQYWxldHRlVmlld2VyIHZpZXdlcikgewotCQkJCXN1cGVyLmNvbmZpZ3VyZVBhbGV0dGVWaWV3ZXIodmlld2VyKTsKLQkJCQkvLyBUT0RPIHZpZXdlci5zZXRDdXN0b21pemVyKG5ldyBMb2dpY1BhbGV0dGVDdXN0b21pemVyKCkpOwotCQkJCXZpZXdlcgotCQkJCQkJLmFkZERyYWdTb3VyY2VMaXN0ZW5lcihuZXcgVGVtcGxhdGVUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcigKLQkJCQkJCQkJdmlld2VyKSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGhvb2tQYWxldHRlVmlld2VyKFBhbGV0dGVWaWV3ZXIgdmlld2VyKSB7Ci0JCQkJc3VwZXIuaG9va1BhbGV0dGVWaWV3ZXIodmlld2VyKTsKLQkJCQlmaW5hbCBDb3B5VGVtcGxhdGVBY3Rpb24gY29weSA9IChDb3B5VGVtcGxhdGVBY3Rpb24pIGdldEFjdGlvblJlZ2lzdHJ5KCkKLQkJCQkJCS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weSk7Ci0JCQkJaWYgKG1lbnVMaXN0ZW5lciA9PSBudWxsKQotCQkJCQltZW51TGlzdGVuZXIgPSBuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCQkJCW1hbmFnZXIuYXBwZW5kVG9Hcm91cCgKLQkJCQkJCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9DT1BZLCBjb3B5KTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl2aWV3ZXIuZ2V0Q29udGV4dE1lbnUoKS5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxFZGl0b3JXaXRoRmx5b3V0UGFsZXR0ZSNnZXRQYWxldHRlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBGbHlvdXRQcmVmZXJlbmNlcyBnZXRQYWxldHRlUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBuZXcgRmx5b3V0UHJlZmVyZW5jZXMoKSB7Ci0JCQlwdWJsaWMgaW50IGdldERvY2tMb2NhdGlvbigpIHsKLQkJCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0SW50KFBBTEVUVEVfRE9DS19MT0NBVElPTik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0UGFsZXR0ZVN0YXRlKCkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXRJbnQoUEFMRVRURV9TVEFURSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0UGFsZXR0ZVdpZHRoKCkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXRJbnQoUEFMRVRURV9TSVpFKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0RG9ja0xvY2F0aW9uKGludCBsb2NhdGlvbikgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQkJCVBBTEVUVEVfRE9DS19MT0NBVElPTiwgbG9jYXRpb24pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRQYWxldHRlU3RhdGUoaW50IHN0YXRlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCQkJUEFMRVRURV9TVEFURSwgc3RhdGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRQYWxldHRlV2lkdGgoaW50IHdpZHRoKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCQkJUEFMRVRURV9TSVpFLCB3aWR0aCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEtleUhhbmRsZXIgZ2V0Q29tbW9uS2V5SGFuZGxlcigpIHsKLQkJaWYgKHNoYXJlZEtleUhhbmRsZXIgPT0gbnVsbCkgewotCQkJc2hhcmVkS2V5SGFuZGxlciA9IG5ldyBLZXlIYW5kbGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4ga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ1RSTCkKLQkJCQkJCQkmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfUklHSFQpKSB7Ci0JCQkJCQltb3ZlKDEpOwotCQkJCQl9Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSkgewotCQkJCQkJbW92ZSgyKTsKLQotCQkJCQl9Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCkpIHsKLQkJCQkJCW1vdmUoMyk7Ci0JCQkJCX0KLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgPT0gU1dULkNUUkwpCi0JCQkJCQkJJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0xFRlQpKSB7Ci0JCQkJCQltb3ZlKDQpOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHN1cGVyLmtleVByZXNzZWQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIG1vdmUoaW50IGRpcmVjdGlvbikgewotCQkJCQlMaXN0IGxpc3QgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaXN0LmdldCgwKTsKLQkJCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IG5vZGUuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWludCBuZXd4ID0gcG9pbnQueDsKLQkJCQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCQkJCWludCBwcmVzc2xlbmd0aCA9IDE7Ci0JCQkJCQlzd2l0Y2ggKGRpcmVjdGlvbikgewotCQkJCQkJY2FzZSAxOgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngrMTAscG9pbnQueSkpOwotCQkJCQkJCW5ld3ggPSBwb2ludC54ICsgcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcgUG9pbnQocG9pbnQueCxwb2ludC55KzEwKSk7Ci0JCQkJCQkJbmV3eSArPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMzoKLQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldyBQb2ludChwb2ludC54LHBvaW50LnktMTApKTsKLQkJCQkJCQluZXd5IC09IHByZXNzbGVuZ3RoOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngtMTAscG9pbnQueSkpOwotCQkJCQkJCW5ld3ggLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCQlub2RlLCBuZXcgUG9pbnQobmV3eCwgbmV3eSksIG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gVE9ETy0gY2hlY2sgYWRkaW5nIG1vcmUgYmVuZHBvaW50LCBjYXB0dXJlIGJlbmRwb2ludAotCQkJCQkvLyBpbmRleCBvbiBmbHkKLQkJCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIExpbmspIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlMaXN0IGJsaXN0ID0gbGluay5nZXRCZW5kcG9pbnRzKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJaWYgKGJsaXN0ICE9IG51bGwgJiYgYmxpc3Quc2l6ZSgpID4gMCkgewotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IHBvaW50ID0gKEFic29sdXRlQmVuZHBvaW50KSBibGlzdAotCQkJCQkJCQkJLmdldChpbmRleCk7Ci0JCQkJCQkJaW50IG5ld3ggPSBwb2ludC54OwotCQkJCQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCQkJCQlpbnQgcHJlc3NsZW5ndGggPSA1OwotCQkJCQkJCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCQkJCQkJY2FzZSAxOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54KzEwLHBvaW50LnkpKTsKLQkJCQkJCQkJbmV3eCA9IHBvaW50LnggKyBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAyOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LHBvaW50LnkrMTApKTsKLQkJCQkJCQkJbmV3eSArPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAzOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LHBvaW50LnktMTApKTsKLQkJCQkJCQkJbmV3eSAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA0OgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LTEwLHBvaW50LnkpKTsKLQkJCQkJCQkJbmV3eCAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQobmV3eCwgbmV3eSksIGluZGV4KTsKLQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJfTsKLQkJCXNoYXJlZEtleUhhbmRsZXIKLQkJCQkJLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuREVMLCAxMjcsIDApLAotCQkJCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCQkJQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotCQkJc2hhcmVkS2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkYyLCAwKSwKLQkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJR0VGQWN0aW9uQ29uc3RhbnRzLkRJUkVDVF9FRElUKSk7Ci0KLQkJfQotCQlyZXR1cm4gc2hhcmVkS2V5SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBncmFwaGljYWxWaWV3ZXIgZm9yIHRoaXMgRWRpdG9yUGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgZ3JhcGhpY2FsIHZpZXdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQlpZiAoYWN0aW9uU2VydmljZSAhPSBudWxsKSB7Ci0JCQlhY3Rpb25TZXJ2aWNlLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCVNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQgcm9vdCA9IG5ldyBTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0KCk7Ci0KLQkJLy8gTGlzdCB6b29tTGV2ZWxzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJLy8gem9vbUxldmVscy5hZGQoWm9vbU1hbmFnZXIuRklUX0FMTCk7Ci0JCS8vIHpvb21MZXZlbHMuYWRkKFpvb21NYW5hZ2VyLkZJVF9XSURUSCk7Ci0JCS8vIHpvb21MZXZlbHMuYWRkKFpvb21NYW5hZ2VyLkZJVF9IRUlHSFQpOwotCQkvLyByb290LmdldFpvb21NYW5hZ2VyKCkuc2V0Wm9vbUxldmVsQ29udHJpYnV0aW9ucyh6b29tTGV2ZWxzKTsKLQkJLy8KLQkJLy8gSUFjdGlvbiB6b29tSW4gPSBuZXcgWm9vbUluQWN0aW9uKHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKSk7Ci0JCS8vIElBY3Rpb24gem9vbU91dCA9IG5ldyBab29tT3V0QWN0aW9uKHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih6b29tT3V0KTsKLQkJLy8gZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLQkJLy8gZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbU91dCk7Ci0KLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQotCQkvLyB2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KG5ldyBNZXRob2RFbGVtZW50RWRpdFBhcnRGYWN0b3J5KCkpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQotCQlDb250ZXh0TWVudVByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBnZXRBY3Rpb25SZWdpc3RyeSgpKTsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGV4dE1lbnUocHJvdmlkZXIpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgKLQkJCQkib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLndvcmtmbG93LmNvbnRleHRtZW51IiwgLy8kTk9OLU5MUy0xJAotCQkJCXByb3ZpZGVyLCBnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0KLQkJdmlld2VyLnNldEtleUhhbmRsZXIobmV3IEdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIodmlld2VyKQotCQkJCS5zZXRQYXJlbnQoZ2V0Q29tbW9uS2V5SGFuZGxlcigpKSk7Ci0KLQkJLy8gbG9hZFByb3BlcnRpZXMoKTsKLQotCQkvLyBBY3Rpb25zCi0JCS8vIElBY3Rpb24gc2hvd1J1bGVycyA9IG5ldwotCQkvLyBUb2dnbGVSdWxlclZpc2liaWxpdHlBY3Rpb24oZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHNob3dSdWxlcnMpOwotCQkvLyAgICAJCi0JCS8vIElBY3Rpb24gc25hcEFjdGlvbiA9IG5ldwotCQkvLyBUb2dnbGVTbmFwVG9HZW9tZXRyeUFjdGlvbihnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc25hcEFjdGlvbik7Ci0JCS8vCi0JCS8vIElBY3Rpb24gc2hvd0dyaWQgPSBuZXcgVG9nZ2xlR3JpZEFjdGlvbihnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc2hvd0dyaWQpOwotCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVBY3RpdmF0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbGlzdGVuZXIpOwotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLQotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVEb3VibGVDbGljayhldmVudCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCWlmIChnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpCi0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCWdldEdyYXBoaWNhbENvbnRyb2woKSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9DT05URVhUKTsKLQkJZWxzZSBpZiAoZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVykpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJCQlnZXRHcmFwaGljYWxDb250cm9sKCksIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX0FDVElWSVRZX0RJQUdSQU1fQ09OVEVYVCk7IAotCQllbHNlIGlmIChnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kpKQotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscChnZXRHcmFwaGljYWxDb250cm9sKCksIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1dQX0RFUEVOREVOQ1lfRElBR1JBTV9DT05URVhUKTsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRHcmFwaGljYWxDb250cm9sKCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0UGFsZXR0ZVJvb3QoKSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQkJCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIG9iaikpIHsKLQkJCQkJCQlMaXN0IGxpc3QgPSBnZXRQYWxldHRlUm9vdCgpLmdldENoaWxkcmVuKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlQYWxldHRlRW50cnkgZW50cnkgPSAoUGFsZXR0ZUVudHJ5KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJZW50cnkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUxpc3QgbGlzdCA9IGdldFBhbGV0dGVSb290KCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVBhbGV0dGVFbnRyeSBlbnRyeSA9IChQYWxldHRlRW50cnkpIGl0b3IubmV4dCgpOwotCQkJCQkJCQllbnRyeS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQljdXJyZW50Q29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkKLQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBmb3IgY3VycmVudCBzZWxlY3Rpb24gb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBvciBjaGFuZ2VzIGluIAotCQkvLyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCS8vCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlBSSU5ULmdldElkKCkpOwotCQlpZihhY3Rpb24gaW5zdGFuY2VvZiBEaWFncmFtUHJpbnRBY3Rpb24pewotCQkJKChEaWFncmFtUHJpbnRBY3Rpb24pYWN0aW9uKS5zZXRWaWV3ZXIodmlld2VyKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCi0JCVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCk7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5hZGREcm9wVGFyZ2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gQWJzdHJhY3RFZGl0UGFydFZpZXdlcgotCQkvLyBnZXRHcmFwaGljYWxWaWV3ZXIoKS5hZGREcm9wVGFyZ2V0TGlzdGVuZXIoCi0JCS8vIG5ldyBUZXh0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoZ2V0R3JhcGhpY2FsVmlld2VyKCksCi0JCS8vIFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYgKGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLkZSRUVfVEVYVCk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLkZSRUVfVEVYVCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5GUkVFX1RFWFQ7Ci0JCQkJfQotCi0JCQl9OwotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRlbXBsYXRlVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoZ2V0R3JhcGhpY2FsVmlld2VyKCkpIHsKLQotCQkJcHJvdGVjdGVkIENyZWF0aW9uRmFjdG9yeSBnZXRGYWN0b3J5KE9iamVjdCB0ZW1wbGF0ZSkgewotCQkJCXJldHVybiAoQ3JlYXRpb25GYWN0b3J5KSB0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcAotCQkJCQkJLmdldCh0ZW1wbGF0ZSk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0aW9uQ2hhbmdlZChFdmVudCBldmVudCkgewotCQlJQWN0aW9uIGNvcHkgPSBudWxsOwotCQlpZiAoZXZlbnQudHlwZSA9PSBTV1QuRGVhY3RpdmF0ZSkKLQkJCWNvcHkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSk7Ci0JCWlmIChnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpICE9IGNvcHkpIHsKLQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQkJQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGNvcHkpOwotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxFZGl0b3JXaXRoRmx5b3V0UGFsZXR0ZSNnZXRQYWxldHRlUm9vdCgpCi0JICovCi0JcHJvdGVjdGVkIFBhbGV0dGVSb290IGdldFBhbGV0dGVSb290KCkgewotCQlpZiAocGFsZXR0ZVJvb3QgPT0gbnVsbCkgewotCQkJY3JlYXRlUGFsZXR0ZVJvb3QoKTsKLQkJfQotCQlyZXR1cm4gcGFsZXR0ZVJvb3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhbGV0dGVSb290KCkgewotCQlwYWxldHRlUm9vdCA9IG5ldyBQYWxldHRlUm9vdCgpOwotCQlwYWxldHRlUm9vdC5hZGRBbGwoY3JlYXRlQ2F0ZWdvcmllcyhwYWxldHRlUm9vdCkpOwotCX0KLQotCXByaXZhdGUgTGlzdCBjcmVhdGVDYXRlZ29yaWVzKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJTGlzdCBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVBhbGV0dGVDb250YWluZXIgcGFsZXR0ZUNvbnRhaW5lciA9IGNyZWF0ZUNvbnRyb2xHcm91cChyb290KTsKLQkJaWYgKHBhbGV0dGVDb250YWluZXIgIT0gbnVsbCkgewotCQkJY2F0ZWdvcmllcy5hZGQocGFsZXR0ZUNvbnRhaW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkvLyBzYXZlRGlhZ3JhbSgpOwotCQkvLyBzYXZlU2NyZWVuKCk7Ci0KLQkJZmluYWwgTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCQkJCQltb25pdG9yCi0JCQkJCQkJLnNldFRhc2tOYW1lKERpYWdyYW1VSVJlc291cmNlcy5iaW5kKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlCi0JCQkJCQkJCQksIGUuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkgPyBlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpIDogZS5nZXROYW1lKCkpKTsgCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShlLmVSZXNvdXJjZSgpKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0Q29udGVudHMoKSkuZ2V0TW9kZWwoKTsKLQkJCQkJCWRpYWdyYW0uc2V0TmV3KGZhbHNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihleCk7Ci0JCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCQkJLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0VGV4dCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX3NhdmVFcnJvcgotCQkJCQkJCQkJCSwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgotCQkJCQkvLwotCQkJCQkvL2dldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5tYXJrU2F2ZUxvY2F0aW9uKCk7Ci0JCQkJCWdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkJCQljaGFuZ2VUaW1lID0gLTE7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5pc0RpcnR5KCk7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCWlmIChlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCXJldHVybiBkaWFncmFtICE9IG51bGwgJiYgZGlhZ3JhbS5pc1JlYWRPbmx5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFZGl0UGFydCgpIHsKLQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKTsKLQkJT2JqZWN0IG9iamVjdDsKLQkJaWYgKGVkaXRvcklucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQlvYmplY3QgPSBlZGl0b3JJbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlvYmplY3QgPSBlZGl0b3JJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJZWRpdFBhcnQgPSBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIHBhc3MgYWxvbmcgdGhlIFN1cHByZXNzaW9uIGluc3RhbmNlIGZyb20gaW5wdXQgdG8gZGlhZ3JhbSBtb2RlbAotCQkvLwotCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkpOwotCQlkaWFncmFtLnNldE9iamVjdChvYmplY3QpOwotCQlkaWFncmFtLmFkZENvbnN1bWVyKHRoaXMpOwotCQkKLQkJaWYoIWRpYWdyYW0uaXNOZXcoKSkgewotCQkJY2hhbmdlVGltZSA9IC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCi0JCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQkJc2V0UGFydE5hbWUoZ2V0UGFydE5hbWVQcmVmaXgoKQotCQkJCQkrIGUuZ2V0TmFtZSgpCi0JCQkJCSsgIiwgIiArIGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHNldFRpdGxlSW1hZ2UoZ2V0VHlwZUltYWdlKGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKTsKLQotCS8qKgotCSAqIEdldCBwYXJlbnQgZWRpdG9yCi0JICogQHJldHVybiBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0UGFyZW50RWRpdG9yKCkgewotCQlyZXR1cm4gcGFyZW50RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudEVkaXRvcihJRWRpdG9yUGFydCBwYXJlbnRFZGl0b3IpIHsKLQkJdGhpcy5wYXJlbnRFZGl0b3IgPSBwYXJlbnRFZGl0b3I7Ci0JfQotCQotCS8vQWRkaW5nIGxpYnJhcnljaG5hZ2VkIGxpc3RlbmVyLCBpZiBjb25maWd1cmF0aW9uIGdvdCBjaGFuZ2VkIGRpYWdyYW0gbmVlZHMgdG8gcmVmcmVzaAotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VEOiB7Ci0JCQkJaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCAmJiBjb2xsZWN0aW9uLmNvbnRhaW5zKGN1cnJlbnRDb25maWcpKSB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY3VycmVudENvbmZpZyk7CQkJCQkKLQkJCQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCk7Ci0JCQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJfQotCQkJCX0JCQotCQkJCWJyZWFrOwotCQkJfQotCQkJLy8gaGFuZGxlZCBieSBsaWJTdmNMaXN0ZW5lcgotCQkJLy8KLS8vCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEOiB7Ci0vLwkJCQljb25maWdDaGFuZ2VkKCk7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9CQkKLQl9OwotCQotCXByaXZhdGUgdm9pZCBjb25maWdDaGFuZ2VkKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYoY3VycmVudENvbmZpZyAhPSBjb25maWcpIHsKLQkJCS8vIHJlZnJlc2ggb25seSBpZiB0aGUgYWN0aXZlIHBhcnQgaXMgdGhpcyBkaWFncmFtIGVkaXRvciBvciBwcm9jZXNzIGVkaXRvciBvZiB0aGUgcHJvY2VzcwotCQkJLy8gdGhhdCBvd25zIHRoaXMgZGlhZ3JhbQotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSAgYWN0aXZlUGFydCA9PSB0aGlzOwotCQkJaWYoIXJlZnJlc2gpIHsKLQkJCQlpZihhY3RpdmVQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSAoKFByb2Nlc3NFZGl0b3IpYWN0aXZlUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJT2JqZWN0IHByb2NDb21wID0gaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQlFT2JqZWN0IGRpYWdyYW0gPSAoKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0VU1BRGlhZ3JhbSgpOwotCQkJCQlyZWZyZXNoID0gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGRpYWdyYW0sIHByb2NDb21wKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihyZWZyZXNoKSB7Ci0JCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZzsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpOwotCQkJCWFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICogb3ZlcnJpZGUgdG8gZG9ub3QgYWxsb3cgYW55IG5vZGUgc2VsZWN0aW9uIGluIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIAotCSAqIGlmIGFjdGl2aXR5IGlzIGV4dGVuZHMuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLQkJaWYoZWRpdFBhcnQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYoZGlhZ3JhbS5pc1JlYWRPbmx5KCkgfHwgVG5nVXRpbC5pc0xvY2tlZChnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpKXsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZWxlY3QoZWRpdFBhcnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaWFncmFtKCl7Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpLnJ1bigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBkaXNwb3NlZDsKLQl9Ci0KLQkKLS8vCS8qCi0vLwkgKiBNZXRob2Qgc2V0cyB0aGUgY29udGV4dCBtZW51IGNvbnRyaWJ1dGluZyBpdGVtcyBzdGF0ZS4KLS8vCSAqIFRoaXMgaXMgZWZmaWNpZW50IHdheSBpbnN0ZWFkIG9mIGRvaW5nIGF0IGVhY2ggYWN0aW9uLiAKLS8vCSAqIFVuY29tbWVudCB0aGlzIGNvZGUsIG9uY2UgYWxsIHRoZSBwbGFjZSBpc0VuYWJsZWQgQ29kZSBpcyByZW1vdmVkLgotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRTdGF0ZU1lbnVDb250cmlidXRlSXRlbXMoKXsKLS8vCQkKLS8vCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAwKXsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oREVMRVRFX0RJQUdSQU0pLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJfQotLy8JCWlmKGVkaXRQYXJ0cy5zaXplKCkgPT0gMSl7Ci0vLwkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWVkaXRQYXJ0cy5nZXQoMCk7Ci0vLwkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFNFTEVDVF9MSU5LKS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotLy8JCQkJaWYoKChUeXBlZE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKQotLy8JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRk9OVF9ESUFMT0cpLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihTRUxFQ1RfTElOSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCX0KLS8vCQkJaWYoZWRpdFBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpewotLy8JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0JFTkRfUE9JTlQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQlMaW5rIGxpbmsgPSAoTGluayllZGl0UGFydC5nZXRNb2RlbCgpOwotLy8JCQkJaWYobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpID4gMCl7Ci0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQUxJR05fQkVORF9QT0lOVCkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkKLS8vCQl9Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAyKXsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspLnNldEVuYWJsZWQodHJ1ZSk7IAotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlPYmplY3QgcGFydCA9IGl0b3IubmV4dCgpOwotLy8JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dEVkaXRQYXJ0KQotLy8JCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9MSU5LKS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotLy8JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLS8vCQlzdXBlci5zZXRGb2N1cygpOwotLy8JCS8vIFJlZnJlc2ggaXMgZXhwZW5zaXZlIG9wZXJhdGlvbi4KLS8vCQkvLyBUT0RPIC0gZmluZCBwcm9jZXNzIHNvbHV0aW9uIGZvciBub3RpZmljYXRpb24gYmV0d2VlbiAKLS8vCQkvLyBiYXNlIGRpYWdyYW0gYW5kIGV4dGVuZCBkaWFncmFtLiAgICAgCi0vLwkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotLy8JCWlmKCgoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLS8vCQl9Ci0vLwkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KXsKLS8vCQkJaWYoKChWYXJpYWJpbGl0eUVsZW1lbnQpZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgIT0gbnVsbCl7Ci0vLwkJCQlpZighKChWYXJpYWJpbGl0eUVsZW1lbnQpZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSl7Ci0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJCQotLy8JCX0KLS8vCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2FjYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1VcGRhdGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRnJlZVRleHROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLk1hcnF1ZWVUb29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVRfRElBR1JBTV9MQVlPVVQgPSAicmVzZXRfZGlhZ3JhbV9sYXlvdXQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSByb2xlTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgd3BkTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsQ2xlYW5VcCA9IGZhbHNlOwotCXByaXZhdGUgQnJlYWtkb3duQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkvLyBhIGhhY2sKLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQkJLy8gcmV0dXJuIG5ldyBFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCS8vCi0JCS8vIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJLy8gaWYobW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJLy8gcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKQotCQkvLyBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCS8vIHJldHVybiBuZXcgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCgoUm9sZVRhc2tDb21wb3NpdGUpIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpewotCQkvLyByZXR1cm4gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKQotCQkvLyBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIFJvbGVOb2RlCi0JCS8vIHx8IG1vZGVsIGluc3RhbmNlb2YgVGFza05vZGUKLQkJLy8gfHwgbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi0JCS8vICkKLQkJLy8gewotCQkvLyByZXR1cm4gbmV3IERlc2NyaXB0b3JOb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYobW9kZWwgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCS8vIHJldHVybiBuZXcgTGlua0VkaXRQYXJ0KChMaW5rKSBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gaWYobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJLy8gVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJLy8gc3dpdGNoKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLlNUQVJUOiByZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5FTkQ6IHJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjogcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJLy8gY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOiByZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6IHJldHVybiBuZXcgRnJlZVRleHRFZGl0UGFydChub2RlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVEaWFncmFtRWRpdFBhcnQoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKSk7Ci0JfQotCi0vLwkvKgotLy8JICogKG5vbi1KYXZhZG9jKQotLy8JICogCi0vLwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCkKLS8vCSAqLwotLy8JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlKSB7Ci0vLwkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0vLwkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0vLwkJRWRpdFBhcnQgcGFydCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLS8vCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotLy8JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0vLwkJcmV0dXJuIHBhcnQ7Ci0vLwl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNnZXRQYXJ0TmFtZVByZWZpeCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcAotCQkpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJzZWxlY3RfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwyNC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sLnNldExhcmdlSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQlDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSBjb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbnRyb2xHcm91cC5hZGRBbGwoZW50cmllcyk7Ci0JCXJldHVybiBjb250cm9sR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlpZiAocm9sZU5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotCQkJcm9sZU5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVJvbGVUYXNrQ29tcG9zaXRlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gcm9sZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlOYW1lZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5UQVNLX0RFU0NSSVBUT1I7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmICh3cGROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXdwZE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCU5hbWVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJY3JlYXRpb25GYWN0b3J5ID0gd3BkTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0b3IgSW5wdXQKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWRpdG9ySW5wdXQgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZQotCQkgKi8KLQkJcHVibGljIEVkaXRvcklucHV0KE9iamVjdCBlLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkJc3VwZXIoZSwgc3VwcHJlc3Npb24pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgZm9jdXMgb24gdGhlIGVkaXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvciNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXN1cGVyLnNldEZvY3VzKCk7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkucmVmcmVzaCgpOwotCQlpZiAoIWluaXRpYWxDbGVhblVwKSB7Ci0JCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJaW5pdGlhbENsZWFuVXAgPSB0cnVlOwotCQkJLy8gTG9ja2VkIFBsdWdpbiBjYXNlOiBEaXNwbGF5IGdlbmVyYXRlZCBBREQgZGlhZ3JhbSwgUGVybWlzc2lvbiBkZW5pZWQgdG8gc2F2ZSwgIAotCQkJLy8gYW5kIE5vIGRpcnR5IGZsYWcgb24gZWRpdG9yLiAKLQkJCWlmKFRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSl7Ci0JCQkJLy8gRmx1c2ggYWxsIGNvbW1hbmRzLCBtZWFucyB3aWxsIG5vdCBzYXZlLgotCQkJCWdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJLy8gRmlyZSBkaXJ0eSBmbGFnIHByb3BlcnR5IGNoYW5nZSwgbm8gZGlydHkgZmxhZyBvbiBlZGl0b3IuCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JfQotCi0JLyoqCi0JICogQ2xlYW4gZGlhZ3JhbQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0vLwkJTWV0aG9kRWxlbWVudCBvYmogPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSkKLS8vCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCURpYWdyYW1VcGRhdGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCksIGdldEVkaXREb21haW4oKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQkJLy8gaWYgKFRuZ1V0aWwuaXNHZW5lcmFsaXplcihvYmosCi0JCS8vIGdldEV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzKCkpCi0JCS8vICYmICFpbml0aWFsQ2xlYW5VcCkgewotCQkvLyBpbml0aWFsQ2xlYW5VcCA9IHRydWU7Ci0JCS8vIElBY3Rpb24gcmVzZXQgPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJLy8gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLlJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJLy8gcmVzZXQucnVuKCk7Ci0JCS8vIGRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjb250cmlidXRlVG9Db250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCi0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuaW5zZXJ0QmVmb3JlKERFTEVURV9ESUFHUkFNLCBhY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJQWN0aW9uIHJlc2V0TGF5b3V0QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0KSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0JCQkJaWYgKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQkJCUxpc3QgbG9jYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmKGRlcC5nZXRDaGlsZHJlbigpICE9IG51bGwgJiYgIWRlcC5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSl7Ci0JCQkJCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXAuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZighKG5leHQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkpewotCQkJCQkJCQlsb2NhbC5hZGQobmV4dCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwobG9jYWwpOwotCQkJCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCXJldHVybiBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBSRVNFVF9ESUFHUkFNX0xBWU9VVDsKLQkJCX0KLQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHJlc2V0TGF5b3V0QWN0aW9uKTsKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMgPSBudWxsOwotCi0vLwlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzKCkgewotLy8JCWlmIChleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcyA9PSBudWxsKSB7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcwotLy8JCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzCi0vLwkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCk7Ci0vLwkJfQotLy8JCXJldHVybiBleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlczsKLS8vCX0KLQkKLQkvKioKLQkgKiBCcmVhayBkb3duIGFkYXB0ZXIgZmFjdG9yeSBjbGFzcwotCSAqLwotCXB1YmxpYyBjbGFzcyBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeQotCXsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHdwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCQlwdWJsaWMgQnJlYWtkb3duQWRhcHRlckZhY3RvcnkoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpCi0JCXsKLQkJCS8vIGNyZWF0ZSBhZGFwdCBmYWN0b3JpZXMKLQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl0YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJY2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCS8vIHNldCBjb25maWd1cmF0aW9uIGZpbHRlcgotCQkJRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGNvbmZpZ3VyYXRvciA9IG5ldyBEaWFncmFtQWRhcHRlckZhY3RvcnlGaWx0ZXIoCi0JCQkJCW1ldGhvZENvbmZpZywgdGhpcyk7Ci0KLQkJCXdic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJdGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl3cGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQljYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsJCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkKLQkJewotCQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAodGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXRic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh3cGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKGNic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIERpYWdyYW0gQWRhcHRlciBmYWN0b3J5IGZpbHRlcgotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IKLQkJCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyIHsKLQotCQlwcml2YXRlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JCS8qCi0JCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCQkgKi8KLQkJcHVibGljIERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIFdCUyBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5Lndic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBUZWFtIEFsbG9jYXRpb24gQWRhcHRlciBGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gV1AgVXNhZ2UgQWRhcHRlciBGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBjb25zb2xpZGF0ZWQgdmlldyBhZGFwdGVyIGZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihmYWN0b3J5ICE9IG51bGwpewotCQkJZmFjdG9yeS5jbGVhcigpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzMGU5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEJyZWFrZG93biBFbGVtZW50IGlucHV0IGZvciBhbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgNywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IHsKLQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQoT2JqZWN0IG9iamVjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJc3VwZXIoKE1ldGhvZEVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG9iamVjdCkpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJfQotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzdXBwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdyYXBwZXIuCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldENsYXNzKCkuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgb3RoZXIgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBvYmo7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudCgpID09IG90aGVyLmdldE1ldGhvZEVsZW1lbnQoKQotCQkJCQkmJiBzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkgPT0gb3RoZXIuZ2V0U3VwcHJlc3Npb24oKQotCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db2x1bW5EZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29sdW1uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGIzMmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db2x1bW5EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogQ29sdW1uIGRlc2NyaXB0b3JzIHVzZWQgZm9yIHByb2Nlc3MgZWRpdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uRGVzY3JpcHRvciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU2NzE4NDc2OTg1OTcwOTk3TDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfTk9ORSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRUxMX0VESVRPUl9UWVBFX1RFWFQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTiA9IDM7Ci0KLQlwdWJsaWMgU3RyaW5nIGlkOwotCi0JcHVibGljIFN0cmluZyBsYWJlbDsKLQotCXB1YmxpYyBpbnQgd2lkdGg7Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXNpemFibGU7Ci0KLQlwdWJsaWMgaW50IGNlbGxFZGl0b3JUeXBlOwotCi0JcHVibGljIGludCB3ZWlnaHQ7Ci0KLQlwdWJsaWMgaW50IGFsaWdubWVudDsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAkJCUlEIG9mIHRoZSBjb2x1bW4KLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAJCQlDb2x1bW4gTmFtZQotCSAqIEBwYXJhbSB3ZWlnaHQKLQkgKiAJCQlDb2x1bW4gd2VpZ2h0Ci0JICogQHBhcmFtIHdpZHRoCi0JICogCQkJQ29sdW1uIFdpZHRoCi0JICogQHBhcmFtIHJlc2l6YWJsZQotCSAqIAkJCUZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gaXMgcmVzaXphYmxlIG9yIG5vdAotCSAqIEBwYXJhbSBjZWxsRWRpdG9yVHlwZQotCSAqIAkJCUNvbHVtbiBjZWxsIGVkaXRvciB0eXBlCi0JICovCi0JcHVibGljIENvbHVtbkRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGludCB3ZWlnaHQsIGludCB3aWR0aCwKLQkJCWJvb2xlYW4gcmVzaXphYmxlLCBpbnQgY2VsbEVkaXRvclR5cGUpIHsKLQkJdGhpcyhpZCwgbGFiZWwsIHdlaWdodCwgd2lkdGgsIHJlc2l6YWJsZSwgY2VsbEVkaXRvclR5cGUsIFNXVC5MRUZUKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQkJSUQgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIAkJCUNvbHVtbiBOYW1lCi0JICogQHBhcmFtIHdlaWdodAotCSAqIAkJCUNvbHVtbiB3ZWlnaHQKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAJCQlDb2x1bW4gV2lkdGgKLQkgKiBAcGFyYW0gcmVzaWFibGUKLQkgKiAJCQlGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGlzIHJlc2l6YWJsZSBvciBub3QKLQkgKiBAcGFyYW0gY2VsbEVkaXRvclR5cGUKLQkgKiAJCQlDb2x1bW4gY2VsbCBlZGl0b3IgdHlwZQotCSAqIEBwYXJhbSBhbGlnbm1lbnQKLQkgKiAJCQlDb2x1bW4gYWxpZ25tZW50Ci0JICovCi0JcHVibGljIENvbHVtbkRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGludCB3ZWlnaHQsIGludCB3aWR0aCwKLQkJCWJvb2xlYW4gcmVzaWFibGUsIGludCBjZWxsRWRpdG9yVHlwZSwgaW50IGFsaWdubWVudCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5yZXNpemFibGUgPSByZXNpYWJsZTsKLQkJdGhpcy53ZWlnaHQgPSB3ZWlnaHQ7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5jZWxsRWRpdG9yVHlwZSA9IGNlbGxFZGl0b3JUeXBlOwotCQl0aGlzLmFsaWdubWVudCA9IGFsaWdubWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY5MGVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ3VyYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ3VyYXRpb25FZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLklNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLklGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLQotLyoqCi0gKiBUaGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWRpdG9yIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvciBpbXBsZW1lbnRzIElHb3RvTWFya2VyIHsKLQotCS8qKgotCSAqIFRoZSBlZGl0b3IgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gQ29uZmlndXJhdGlvbkVkaXRvci5jbGFzcy5nZXROYW1lKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiBkZWZhdWx0Q29uZmlnUGFnZVByb3ZpZGVyOwotCi0JQ29uZmlndXJhdGlvblBhZ2UgY29uZmlnUGFnZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIHN1cGVyLmdldEVkaXRvcklucHV0KCkpCi0JCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkvLyBwcm9iYWJseSBvcGVuZWQgZnJvbSBQcm9ibGVtcyBWaWV3Ci0JCQkvLyBjcmVhdGUgYSBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQKLQkJCVJlc291cmNlIHJlc291cmNlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKCgoRmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRGaWxlKCkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJaW5wdXQgPSBuZXcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KChNZXRob2RDb25maWd1cmF0aW9uKWVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiBnZXREZWZhdWx0UGFnZVByb3ZpZGVyKCkgewotCQlpZiAoZGVmYXVsdENvbmZpZ1BhZ2VQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0Q29uZmlnUGFnZVByb3ZpZGVyID0gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDb25maWdQYWdlUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCS8vIGZpcnN0IGdldCBvcmlnaW5hbCBsaXN0Ci0JCU1hcDxPYmplY3QsU3RyaW5nPiBwYWdlTWFwID0gZ2V0RGVmYXVsdFBhZ2VQcm92aWRlcigpLmdldFBhZ2VzKG5ldyBMaW5rZWRIYXNoTWFwPE9iamVjdCxTdHJpbmc+KCksIHRoaXMsIGVsZW1lbnRPYmopOwotCQkKLQkJLy8gbGV0IGV4dGVuc2lvbnMgbW9kaWZ5Ci0JCUxpc3Q8SU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24+IHBhZ2VQcm92aWRlcnMgPSBnZXRBbGxQYWdlUHJvdmlkZXJzKCk7Ci0JCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHBhZ2VQcm92aWRlcnMpIHsKLQkJCQlwYWdlTWFwID0gZXh0ZW5zaW9uLmdldFBhZ2VzKHBhZ2VNYXAsIHRoaXMsIGVsZW1lbnRPYmopOwotCQkJfQotCQl9Ci0JCS8vIG5vdyBhZGQgcGFnZXMKLQkJdHJ5IHsKLQkJCWZvciAoTWFwLkVudHJ5PE9iamVjdCwgU3RyaW5nPiBwYWdlRW50cnkgOiBwYWdlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlPYmplY3QgcGFnZSA9IHBhZ2VFbnRyeS5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IHBhZ2VFbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWludCBpbmRleCA9IC0xOwotCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgQ29udHJvbCkgewotCQkJCQlpbmRleCA9IGFkZFBhZ2UoKENvbnRyb2wpcGFnZSk7Ci0JCQkJfSBlbHNlIGlmIChwYWdlIGluc3RhbmNlb2YgSUZvcm1QYWdlKSB7Ci0JCQkJCWluZGV4ID0gYWRkUGFnZSgoSUZvcm1QYWdlKXBhZ2UpOwotCQkJCX0gZWxzZSBpZiAocGFnZSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCWluZGV4ID0gYWRkUGFnZSgoSUVkaXRvclBhcnQpcGFnZSwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJfQotCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJc2V0UGFnZVRleHQoaW5kZXgsIG5hbWUpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25QYWdlKSB7Ci0JCQkJCWNvbmZpZ1BhZ2UgPSAoQ29uZmlndXJhdGlvblBhZ2UpcGFnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjY3JlYXRlSW5wdXQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgY3JlYXRlSW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxMaXN0ZW5lcj4gc2V0Rm9jdXNMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RlbmVyPigpOwotCQotCQotCS8qKgotCSAqIEFkZCBnaXZlbiBsaXN0ZW5lciB0byBsaXN0IG9mIGZvY3VzIGxpc3RlbmVycwotCSAqIEBwYXJhbSBsaXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb1NldEZvY3VzTGlzZW5lcnMoTGlzdGVuZXIgbGlzKSB7Ci0JCXNldEZvY3VzTGlzdGVuZXJzLmFkZChsaXMpOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7ICAgIAkKLSAgICAJRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotICAgIAllLmRhdGEgPSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsgICAJCi0gICAgCWZvciAoaW50IGk9MDsgaTxzZXRGb2N1c0xpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgIAkJTGlzdGVuZXIgbGlzID0gKExpc3RlbmVyKSBzZXRGb2N1c0xpc3RlbmVycy5nZXQoaSk7Ci0gICAgCQlsaXMuaGFuZGxlRXZlbnQoZSk7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgCS8vIGFjdGl2YXRlIGNvbmZpZyBwYWdlCi0gICAgCXNldEFjdGl2ZVBhZ2UoMSk7Ci0gICAgCWlmIChjb25maWdQYWdlICE9IG51bGwpIHsKLSAgICAJCWNvbmZpZ1BhZ2UuZ290b01hcmtlcihtYXJrZXIpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvUXVpY2tGaXgoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAJY29uZmlnUGFnZS5kb1F1aWNrRml4KG1hcmtlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdhZjM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vIG1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIHJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHN1cGVyLmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvckNob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1YzQ0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogTGF1bmNoZXMgYSBNZXRob2QgZWRpdG9yIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvckNob29zZXIgaW1wbGVtZW50cyBJRWRpdG9yS2VlcGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEVkaXRvckNob29zZXIgc2luZ2xldG9uID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVkaXRvckNob29zZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChFZGl0b3JDaG9vc2VyLmNsYXNzKSB7Ci0JCQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQkJCXNpbmdsZXRvbiA9IG5ldyBFZGl0b3JDaG9vc2VyKCk7Ci0JCQkJCUlFZGl0b3JLZWVwZXIuUkVGRVJFTkNFLnNldEVkaXRvcktlZXBlcihzaW5nbGV0b24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyBFZGl0b3JDaG9vc2VyKCkgewotCQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogT3BlbnMgdGhlIHJlc3BlY3RpdmUgZWRpdG9yIGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlvYmogPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKG9iaik7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQkJQXJyYXlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCQllcnJvcnMuYWRkQWxsKHJlcy5nZXRFcnJvcnMoKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJUmVzb3VyY2UgcHJlc1JlcyA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQkJCQlpZiAocHJlc1JlcyAhPSBudWxsICYmICFwcmVzUmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCQkJZXJyb3JzLmFkZEFsbChwcmVzUmVzLmdldEVycm9ycygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJZmluYWwgTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJMCwKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yLCBudWxsKTsgCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCURpYWdub3N0aWMgZSA9IChEaWFnbm9zdGljKSBpdGVyLm5leHQoKTsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDAsIGUKLQkJCQkJCQkJCQkuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWRpdG9yQ2hvb3Nlcl9sb2FkZEVycm9yRGxnVGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvciwgCi0JCQkJCQkJCQkJbXVsdGlTdGF0dXMpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJRWRpdG9yT3BlbmVyIG9wZW5lciA9IEVkaXRvck9wZW5lckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuZXIob2JqKTsKLQkJCWlmICggb3BlbmVyICE9IG51bGwgJiYgb3BlbmVyLmNhbk9wZW4ob2JqKSApIHsKLQkJCQlvcGVuZXIub3BlbkVkaXRvcihvYmopOwotCQkJfSBlbHNlIGlmICgob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8IChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVGFzaykgfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHx8IChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2wpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZEVsZW1lbnQpIG9iaiwgTWV0aG9kRWxlbWVudEVkaXRvci5FRElUT1JfSUQpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RDYXQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iajsKLQkJCQlpZihUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KGN1c3RDYXQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgb2JqLCBNZXRob2RFbGVtZW50RWRpdG9yLkVESVRPUl9JRCk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBvYmosIFByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQotCQkJCS8vIG9wZW4gcHJvcGVydGllcyB2aWV3IGJ5IGRlZmF1bHQgd2hlbiB3ZSBvcGVuIFByb2Nlc3MgRWRpdG9yCi0JCQkJdHJ5IHsKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkuc2hvd1ZpZXcoCi0JCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJT2JqZWN0IGNvbnRhaW5lciA9ICgoUHJvY2Vzcykgb2JqKS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgY29udGFpbmVyLAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQkJCQl9Ci0JCQl9ZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iaiwKLQkJCQkJCUNvbmZpZ3VyYXRpb25FZGl0b3IuRURJVE9SX0lEKTsKLQkJCX1lbHNlIGlmKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpewotCQkJCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudClvYmopOwotCQkJCU9iamVjdCBjb250YWluZXIgPSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBjb250YWluZXIsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5FRElUT1JfSUQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfbWVzc2FnZTsgCi0JCQlTdHJpbmcgcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbjsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgcmVhc29uLCB0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBDb25maWd1cmF0aW9uIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBlZGl0b3JJZCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoCi0JCQkJY29uZmlnKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJZWRpdG9ySW5wdXQsIGVkaXRvcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgTWV0aG9kIGVkaXRvciBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqICAgICAgICAgICAgVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBlZGl0b3JJZCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJZWxlbWVudCk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcigKLQkJCQkJCWVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyAoYnJpbmdzIHRvIGZyb250LCBidXQgZG9lcyBub3QgZ2l2ZSBmb2N1cykgdGhlIE1ldGhvZCBlZGl0b3IgZm9yCi0JICogdGhlIGdpdmVuIG9iamVjdC4gSWYgdGhlcmUgaXMgbm8gb3BlbiBlZGl0b3IgZm9yIHRoZSBvYmplY3QsIGRvZXMKLQkgKiBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJb2JqID0gVmlld0hlbHBlci5oYW5kbGVEYW5nbGluZyhvYmopOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCWVkaXRvcklucHV0ID0gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCgKLQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQllZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCWlmIChlZGl0b3JJbnB1dCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsKLQkJCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0JCQkJcGFnZS5icmluZ1RvVG9wKGVkaXRvclBhcnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmV0dXJucyBzZWxlY3RlZCBlZGl0b3IgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBvYmplY3Qgd2hpY2ggdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBNZXRob2QgZWRpdG9yIGlzIGVkaXRpbmcgKG9yCi0JICogICAgICAgICBudWxsIGlmIHRoZXJlIGlzIG5vIGVkaXRvciBvciBpZiB0aGUgZWRpdG9yIGlzIG5vdCBhIE1ldGhvZCBlZGl0b3IpLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0aXZlTWV0aG9kRWRpdG9ySW5wdXQoKSB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQlyZXR1cm4gZ2V0TWV0aG9kRWRpdG9ySW5wdXQoZWRpdG9yUGFydCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNZXRob2RFZGl0b3JJbnB1dChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7Ci0JCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkKLQkJCQlyZXR1cm4gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkKLQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIE1ldGhvZCBlZGl0b3IgZm9yIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlRWRpdG9yKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGZpbmRFZGl0b3Iob2JqKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkJLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCQkJfQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElFZGl0b3JQYXJ0IGZpbmRFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5maW5kRWRpdG9yKAotCQkJCQkJCWVkaXRvcklucHV0KTsKLQkJCXJldHVybiBlZGl0b3I7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgZGlydHkgZWRpdG9ycyBmb3IgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybglMaXN0IG9mIGRpcnR5IGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzV2l0aERpcnR5RWRpdG9yKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJLy8gQXJyYXlMaXN0IGNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGUgPT0gZWxlbWVudCB8fCBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpIHsKLQkJCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgYWxsIG9wZW4gTWV0aG9kIGVkaXRvcnMgb2ZvciB0aGUgZ2l2ZW4gKGRlbGV0ZWQpIGVsZW1lbnQgYW5kCi0JICogYWxsIG9mIGl0cyBjaGlsZHJlbiBhbmQgZ3JhbmQgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBkZWxldGVkIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUVkaXRvcnNPbkRlbGV0aW9uKE9iamVjdCBlKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3QgY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwKLQkJCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSA9PSBudWxsIHx8IFVtYVV0aWwKLQkJCQkJCQkJLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpKSB7Ci0JCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2VzIGFsbCBNZXRob2QgRWRpdG9ycyB3aXRob3V0IHNhdmluZy4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlQWxsTWV0aG9kRWRpdG9ycygpIHsKLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQl3b3JrYmVuY2guZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGNsb3NlRWRpdG9yUmVmcyA9IGdldE9wZW5NZXRob2RFZGl0b3JzKCk7Ci0JCQkJCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKGNsb3NlRWRpdG9yUmVmcy50b0FycmF5KG5ldyBJRWRpdG9yUmVmZXJlbmNlW2Nsb3NlRWRpdG9yUmVmcy5zaXplKCldKSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBvcGVuIE1ldGhvZCBFZGl0b3JzCi0JICovCi0JcHVibGljIExpc3Q8SUVkaXRvclJlZmVyZW5jZT4gZ2V0T3Blbk1ldGhvZEVkaXRvcnMoKSB7Ci0JCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJZmluYWwgTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBtZXRob2RFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQl3b3JrYmVuY2guZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHJlZmVyZW5jZS5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQkJU3RyaW5nIGVkaXRvcklkID0gcmVmZXJlbmNlLmdldElkKCk7Ci0JCQkJCQlpZiAoZWRpdG9ySWQuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UuZXBmIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQllZGl0b3JQYXJ0IGluc3RhbmNlb2YgSU1ldGhvZEVkaXRvcikgewotCQkJCQkJCW1ldGhvZEVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gbWV0aG9kRWRpdG9yUmVmczsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbGwgTWV0aG9kRWRpdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFBsdWdpbi4KLQkgKiBXaWxsIGNhdXNlIGEgdXNlci1wcm9tcHQgZm9yIGVhY2ggZGlydHkgZWRpdG9yCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VNZXRob2RFZGl0b3JzRm9yUGx1Z2luRWxlbWVudHMoTWV0aG9kUGx1Z2luIG1ldGhvZHBsdWdpbikgewotCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpICE9IG51bGwKLQkJCQkmJiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGxpc3QgPSBnZXRPcGVuTWV0aG9kRWRpdG9ycygpOwotCQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBlZGl0b3JSZWZzVG9DbG9zZSA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJCWZvciAoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWZlcmVuY2UgOiBsaXN0KSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yUmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQkJZWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQkJZWxlbWVudCA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJfSBlbHNlIGlmKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpewotCQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGVJbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQkJZWxlbWVudCA9IGVJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCQlpZihlbGVtZW50ID09IG51bGwpewotCQkJCQkJCWlmKGVJbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudClUbmdVdGlsLnVud3JhcChlSW5wdXQuZ2V0V3JhcHBlcigpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSA9PSBudWxsIHx8IFVtYVV0aWwKLQkJCQkJCQkJCS5pc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIG1ldGhvZHBsdWdpbikpKSB7Ci0JCQkJCQlpZiAoIWVsZW1lbnQuZXF1YWxzKG1ldGhvZHBsdWdpbikpCi0JCQkJCQkJZWRpdG9yUmVmc1RvQ2xvc2UuYWRkKGVkaXRvclJlZmVyZW5jZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhlZGl0b3JSZWZzVG9DbG9zZS50b0FycmF5KG5ldyBJRWRpdG9yUmVmZXJlbmNlW2VkaXRvclJlZnNUb0Nsb3NlLnNpemUoKV0pLCB0cnVlKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjZDRmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yT3BlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLS8qKgotICogYWJzdHJhY3QgY2xhc3MgZm9yIGVkaXRvciBvcGVuZW5yIGV4dGVuc2lvbgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVkaXRvck9wZW5lciB7Ci0KLQlwdWJsaWMgRWRpdG9yT3BlbmVyKCkgewotCQkKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuT3BlbihPYmplY3Qgb2JqKTsKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvcGVuRWRpdG9yKE9iamVjdCBvYmopIHRocm93cyBFeGNlcHRpb24gOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvck9wZW5lckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMWFmOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvck9wZW5lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgRWRpdG9yIE9wZW5lbnIgRXh0ZW5zaW9ucwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yT3BlbmVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiRWRpdG9yT3BlbmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJjbGFzcyIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCX05BTUUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImlkIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJfTkFNRSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRWRpdG9yT3BlbmVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiBsaWJyYXJ5IG1hbmFnZXIgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIEVkaXRvck9wZW5lckVsZW1lbnQ+IG9wZW5lckVsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFZGl0b3JPcGVuZXJFbGVtZW50PigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEVkaXRvck9wZW5lckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBFZGl0b3JPcGVuZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFZGl0b3JPcGVuZXJGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBQcm9jZXNzIHRoZSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIiBleHRlbnNpb24gcG9pbnQKLQkJLy8gY29udHJpYnV0b3JzLgotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDTEFTU19BVFRSSUJfTkFNRSk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoSURfQVRUUklCX05BTUUpOwotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIGlkICE9IG51bGwgJiYgaWQudHJpbSgpLmxlbmd0aCgpID4gMCkgewkJCQkJCQkKLQkJCQkJCQlFZGl0b3JPcGVuZXJFbGVtZW50IHByb3ZpZGVyID0gb3BlbmVyRWxlbWVudHMuZ2V0KGlkKTsKLQkJCQkJCQlpZihwcm92aWRlciA9PSBudWxsICkgewotCQkJCQkJCQlwcm92aWRlciA9IG5ldyBFZGl0b3JPcGVuZXJFbGVtZW50KAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCBpZCk7Ci0JCQkJCQkJCW9wZW5lckVsZW1lbnRzLnB1dChpZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRvck9wZW5lciBnZXRPcGVuZXIoT2JqZWN0IG9iaikgewotCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnQpb2JqKTsKLQkJCQotCQkJd2hpbGUgKGUgIT0gbnVsbCApIHsKLQkJCQlMaXN0IHByb3BzID0gZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCQlpZiAoIHByb3BzICE9IG51bGwgJiYgcHJvcHMuc2l6ZSgpID4gMCApIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdHAgPSBwcm9wcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSlpdHAubmV4dCgpOwotCQkJCQkJU3RyaW5nIGlkID0gcHJvcC5nZXROYW1lKCk7Ci0JCQkJCQlFZGl0b3JPcGVuZXIgb3BlbmVyPSBjcmVhdGVFeHRlbnNpb24oaWQpOwotCQkJCQkJaWYgKCBvcGVuZXIgIT0gbnVsbCApIHsJCQkJCQkKLQkJCQkJCQlyZXR1cm4gb3BlbmVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkKLQkJCQkKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHRyeSBpZiB0aGUgaWQgaXMgZGVmaW5lZCBpbiB0aGUgcGx1Z2luCi0JCQkJZSA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBvcGVuZXJFbGVtZW50cy5jb250YWluc0tleShpZCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgbGF5b3V0IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGV4dGVuc2lvbiBpZAotCSAqIEByZXR1cm4gTGF5b3V0RXh0ZW5zaW9uCi0JICovCi0JcHJpdmF0ZSBFZGl0b3JPcGVuZXIgY3JlYXRlRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQkKLQkJaWYgKCAhaGFzRXh0ZW5zaW9uKGlkKSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlFZGl0b3JPcGVuZXJFbGVtZW50IHByb3ZpZGVyID0gKEVkaXRvck9wZW5lckVsZW1lbnQpIG9wZW5lckVsZW1lbnRzLmdldChpZCk7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6eiA9IHByb3ZpZGVyLmJ1bmRsZS5sb2FkQ2xhc3MocHJvdmlkZXIuY2xhc3NOYW1lKTsKLQkJCXJldHVybiAoRWRpdG9yT3BlbmVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRWRpdG9yT3BlbmVyRWxlbWVudCB7Ci0JCUJ1bmRsZSBidW5kbGU7Ci0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCVN0cmluZyBpZDsKLQkJcHJpdmF0ZSBFZGl0b3JPcGVuZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBpZCkgewotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5MWIyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5NYXJxdWVlVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0KLS8qKgotICogQW4gZWRpdG9yIGZvciBncmFwaGljYWwgd29yayBwcm9kdWN0IGRlcGVuZWRlbmN5IGRpYWdyYW0KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAgCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgd3BOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0vLwlwcml2YXRlIElQcm9wZXJ0eVNoZWV0RW50cnkgcm9vdEVudHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9XUF9OT0RFID0gImNyZWF0ZV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlpZiAod3BOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXdwTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVdvcmtQcm9kdWN0Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdCh3cGQpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0KLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLldPUktfUFJPRFVDVDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCUNyZWF0aW9uRmFjdG9yeSBjcmVhdGlvbkZhY3RvcnkgPSB3cE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0KLQkJLy8gSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihQUk9QRVJUSUVTX1BBR0UpOwotCQkvLyBpZihhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJLy8gbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCS8vIH0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfV1BfTk9ERSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJLy8gQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotCQkvLyBJQWN0aW9uIGFjdGlvbjsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFjdGlvbigiU2hvdyAmUHJvcGVydGllcyBWaWV3IikgewotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gUFJPUEVSVElFU19QQUdFOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gdHJ5IHsKLQkJLy8KLQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5zaG93VmlldygKLQkJLy8gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsKLQkJLy8gLy8gc2V0SWQoIlNob3dfUHJvcGVydGllcyIpOwotCQkvLyB9Ci0JCS8vIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJLy8gLy9BdXRob3JpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCS8vIExpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJLy8gcmV0dXJuIChlZGl0UGFydHMuc2l6ZSgpID09IDEgJiYgZWRpdFBhcnRzLmdldCgwKSBpbnN0YW5jZW9mCi0JCS8vIEVkaXRQYXJ0KTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLwkJCi0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0LCB3cE5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9XUF9OT0RFLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUNvbnRyb2xHcm91cChQYWxldHRlUm9vdCByb290KSB7Ci0JCWluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcAotCQkpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJzZWxlY3RfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwyNC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sLnNldExhcmdlSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQl0b29sID0gbmV3IENvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dCwgRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXAsIAotCQkJCW51bGwsIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkibGlua19wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkibGlua19wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCUNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5IGNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5GUkVFX1RFWFQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJUGFsZXR0ZVNlcGFyYXRvciBzZXAgPSBuZXcgUGFsZXR0ZVNlcGFyYXRvcigKLQkJCQlHcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpICsgInNlcDEiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXAKLQkJCQkuc2V0VXNlck1vZGlmaWNhdGlvblBlcm1pc3Npb24oUGFsZXR0ZUVudHJ5LlBFUk1JU1NJT05fTk9fTU9ESUZJQ0FUSU9OKTsKLQkJZW50cmllcy5hZGQoc2VwKTsgCi0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuV09SS19QUk9EVUNULCB3cE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQkJY29udHJvbEdyb3VwLmFkZEFsbChlbnRyaWVzKTsKLQkJcmV0dXJuIGNvbnRyb2xHcm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBXUERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURpYWdyYW1FZGl0UGFydCgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpIHsKLQkJIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCA9IG5ldyBEaWFncmFtRWRpdFBhcnQoTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkpOwotCQkgZWRpdFBhcnQubWFya0RpcnR5KHRydWUpOwotCQkgcmV0dXJuIGVkaXRQYXJ0OwotCX0KLQkKLS8vCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSkgewotLy8JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0vLwkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0vLwkJRWRpdFBhcnQgcGFydCA9IG5ldyBEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0vLwkJcGFydC5zZXRNb2RlbChkaWFncmFtKTsKLS8vCQlkaWFncmFtLmFkZENvbnN1bWVyKHRoaXMpOwotLy8JCXJldHVybiBwYXJ0OwotLy8JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeDsgCi0JfQotCi0JLyoqCi0JICogQW4gZWRpdG9yIGlucHV0IAotCSAqCi0JICoKLQkgKi8KLQkvKioKLQkgKiBAYXV0aG9yIHNoaWxwYXQKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlCi0JCSAqLwotCQlwdWJsaWMgRWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCQkgKi8KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkJICovCi0JCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkgewotCQkJLy8gaWYgKHR5cGUuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKLQkJCS8vIHJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJLy8gfWVsc2UKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLS8vCQlwcml2YXRlIE9iamVjdCBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLS8vCi0vLwkJCWlmIChyb290RW50cnkgPT0gbnVsbCkgewotLy8JCQkJLy8gY3JlYXRlIGEgbmV3IHJvb3QKLS8vCQkJCVByb3BlcnR5U2hlZXRFbnRyeSByb290ID0gbmV3IFByb3BlcnR5U2hlZXRFbnRyeSgpOwotLy8JCQkJcm9vdEVudHJ5ID0gcm9vdDsKLS8vCQkJfQotLy8JCQlpZiAocm9vdEVudHJ5IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0vLwkJCQkvLyA9IHdwRWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0vLwkJCQkvLyBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcKLS8vCQkJCS8vIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKFdQKTsKLS8vCQkJCS8vICgoUHJvcGVydHlTaGVldEVudHJ5KSByb290RW50cnkpLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoKTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gcm9vdEVudHJ5OwotLy8JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdvcmtmbG93RWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4YTM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db25uZWN0aW9uQ3JlYXRpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuTWFycXVlZVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgZm9yIGdyYXBoaWNhbCB3b3JrZmxvdwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fV09SS0ZMT1dfREVUQUlMX0RJQUdSQU0gPSAib3Blbl93b3JrZmxvd19kZXRhaWxfZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU1RBUlRfTk9ERSA9ICJjcmVhdGVfc3RhcnRfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRU5EX05PREUgPSAiY3JlYXRlX2VuZF9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TWU5DX0JBUiA9ICJjcmVhdGVfc3luY19iYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0RFQ0lTSU9OX0JBUiA9ICJjcmVhdGVfZGVjaXNpb25fYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9BQ1RJVklUWSA9ICJjcmVhdGVfYWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1BIQVNFID0gImNyZWF0ZV9waGFzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfSVRFUkFUSU9OID0gImNyZWF0ZV9pdGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiA9ICJjcmVhdGVfdGFza19kZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxXb3JrZmxvd0VkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCi0JCWlmIChhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCWFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJLy8gQWN0aXZpdHlOb2RlIG5vZGUgPQotCQkJCQkvLyBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5Tm9kZSgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldERpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5BQ1RJVklUWTsKLQkJCQl9Ci0KLQkJCX07Ci0JCUNyZWF0aW9uRmFjdG9yeSBjcmVhdGlvbkZhY3RvcnkgPSBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHBoYXNlTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQkvLyBBY3Rpdml0eU5vZGUgbm9kZSA9Ci0JCQkJCS8vIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlOb2RlKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlBIQVNFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQkvLyBBY3Rpdml0eU5vZGUgbm9kZSA9Ci0JCQkJCS8vIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlOb2RlKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5JVEVSQVRJT047Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJc3luY2hCYXJDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5TWU5DSF9CQVIpOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5TWU5DSF9CQVIpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuU1lOQ0hfQkFSOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gc3luY2hCYXJDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuREVDSVNJT04pOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5ERUNJU0lPTikpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5ERUNJU0lPTl9OT0RFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCXN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLlNUQVJUKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5uZXdUeXBlZEdyYXBoTm9kZShUeXBlZE5vZGUuU1RBUlQpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuU1RBUlRfTk9ERTsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAoZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLkVORCk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLkVORCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5FTkRfTk9ERTsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IGVuZE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldERpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5UQVNLX0RFU0NSSVBUT1I7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSB0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0KLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCi0JCW1lbnUuaW5zZXJ0QWZ0ZXIoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlPUEVOX1dPUktGTE9XX0RFVEFJTF9ESUFHUkFNKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJbWVudS5pbnNlcnRBZnRlcihHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfU1RBUlRfTk9ERSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCS8vIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9GUkVFX1RFWFQpOwotCQkvLyBpZihhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJLy8gbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCS8vIH0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfU1lOQ19CQVIpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfREVDSVNJT05fQkFSKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0VORF9OT0RFKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0FDVElWSVRZKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9JVEVSQVRJT04pOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfUEhBU0UpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfVEFTS19ERVNDUklQVE9SKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCi0JCS8vIE9wZW4gd29ya2Zsb3cgZGV0YWlsIGFjdGlvbgotCQkvLwotCQlJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQpIHsgCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBPUEVOX1dPUktGTE9XX0RFVEFJTF9ESUFHUkFNOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkKLQkJCQkJCQkJLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpICgoTm9kZSkgc2VsZWN0ZWRFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRTaXRlKCkKLQkJCQkJCQkJLmdldFBhZ2UoKQotCQkJCQkJCQkub3BlbkVkaXRvcigKLQkJCQkJCQkJCQlpbnB1dCwKLQkJCQkJCQkJCQlQcm9jZXNzRWRpdG9yLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCXJldHVybiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSAmJiAoKExpbmtlZE9iamVjdCkgZWRpdFBhcnQKLQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KTsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCS8vIElBY3Rpb24gc3RhcnROb2RlQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5TdGFydE5vZGUudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gLy9DcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkodGVtcGxhdGUpOwotCQkvLyBpZiAoc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gcmVxdWVzdC5zZXRGYWN0b3J5KHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfU1RBUlRfTk9ERTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKXsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcy5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3RhcnROb2RlLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHN0YXJ0Tm9kZUFjdGlvbik7Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBJQWN0aW9uIGVuZE5vZGVBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy4KLQkJLy8gZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkVuZE5vZGUudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gaWYgKGVuZE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3RvcnkoZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyBEaWFncmFtIHBhcmVudCA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcKLQkJLy8gQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJLy8gcGFyZW50LCBsb2MpOwotCQkvLyBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpewotCQkvLyByZXR1cm4gQ1JFQVRFX0VORF9OT0RFOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkvLyByZXR1cm4KLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzLmdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5FbmROb2RlLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGVuZE5vZGVBY3Rpb24pOwotCQkvLwkJCi0JCS8vIElBY3Rpb24gc3luY0JhckFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLgotCQkvLyBnZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3luY0Jhci50ZXh0IikpeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkvLyByZXR1cm47Ci0JCS8vIHJlcXVlc3Quc2V0RmFjdG9yeShzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfU1lOQ19CQVI7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLlN5bmNCYXIudG9vbHRpcCIpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc3luY0JhckFjdGlvbik7Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBJQWN0aW9uIGRlY2lzaW9uQmFyQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5EZWNpc2lvbkJhci50ZXh0IikpewotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3RvcnkoZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5KTsKLQkJLy8gcmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsMTApKTsKLQkJLy8JCQkJCi0JCS8vIGlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkvLyBQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCS8vIC8vKChHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJLy8gRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3Ci0JCS8vIENyZWF0ZU5vZGVDb21tYW5kKChOb2RlKXJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCS8vIHBhcmVudCwgbG9jKTsKLQkJLy8gZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKXsKLQkJLy8gcmV0dXJuIENSRUFURV9ERUNJU0lPTl9CQVI7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkRlY2lzaW9uQmFyLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGRlY2lzaW9uQmFyQWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LCBzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9TVEFSVF9OT0RFLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3Rub2RlX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0ZSRUVfVEVYVCwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dCwgc3luY2hCYXJDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9TWU5DX0JBUiwgRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsIGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0RFQ0lTSU9OX0JBUiwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImRlY25vZGVfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0VORF9OT0RFLCBEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJlbmRub2RlX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0LCBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9BQ1RJVklUWSwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQsIGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9JVEVSQVRJT04sCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJJdGVyYXRpb24xNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dCwgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfUEhBU0UsIERpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJQaGFzZTE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0LCB0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9UQVNLX0RFU0NSSVBUT1IsCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJIlRhc2tEZXNjcmlwdG9yLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCi0JCS8vIGRvIG5vdGhpbmcgaWYgMCBvciBtb3JlIHRoYW4gMSBlZGl0IHBhcnRzIGFyZSBzZWxlY3RlZAotCQkvLwotCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCi0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlCi0JCQkJJiYgKG5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSBlZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkvLyBvcGVuIGFjdGl2aXR5IGRpYWdyYW0gb2YgdGhlIHNlbGVjdGVkIGFjdGl2aXR5IGluIGEgbmV3IGVkaXRvcgotCQkJLy8KLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IG5vZGUuaXNSZWFkT25seSgpID8gbm9kZS5nZXRXcmFwcGVyKCkgOiBub2RlLmdldE9iamVjdCgpOwotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRWRpdG9ySW5wdXQob2JqZWN0LCBlZGl0b3JJbnB1dC5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFNpdGUoKS5nZXRQYWdlKCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJCQlQcm9jZXNzRWRpdG9yLldPUktGTE9XX0VESVRPUl9JRCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUNvbnRyb2xHcm91cChQYWxldHRlUm9vdCByb290KSB7Ci0JCWluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCi0JCVBhbGV0dGVHcm91cCBjb250cm9sR3JvdXAgPSBuZXcgUGFsZXR0ZUdyb3VwKCJDb250cm9sIEdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJVG9vbEVudHJ5IHRvb2wgPSBuZXcgUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwCi0JCSk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQkJcm9vdC5zZXREZWZhdWx0RW50cnkodG9vbCk7Ci0KLQkJdG9vbCA9IG5ldyBNYXJxdWVlVG9vbEVudHJ5KCk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMjQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5KERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcCwgCi0JCQkJbnVsbCwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQlDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSBjb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5TVEFSVF9OT0RFLCBzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzdG5vZGVfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN0bm9kZV9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5GUkVFX1RFWFQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5TWU5DSF9CQVIsIHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkRFQ0lTSU9OX05PREUsIGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImRlY25vZGVfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImRlY25vZGVfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkVORF9OT0RFLCBlbmROb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZW5kbm9kZV9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZW5kbm9kZV9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCVBhbGV0dGVTZXBhcmF0b3Igc2VwID0gbmV3IFBhbGV0dGVTZXBhcmF0b3IoCi0JCQkJR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpICsgInNlcDEiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXAKLQkJCQkuc2V0VXNlck1vZGlmaWNhdGlvblBlcm1pc3Npb24oUGFsZXR0ZUVudHJ5LlBFUk1JU1NJT05fTk9fTU9ESUZJQ0FUSU9OKTsKLQkJZW50cmllcy5hZGQoc2VwKTsgCi0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkFDVElWSVRZLCBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuSVRFUkFUSU9OLCBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiSXRlcmF0aW9uMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuUEhBU0UsIHBoYXNlTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoIlBoYXNlMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuVEFTS19ERVNDUklQVE9SLAotCQkJCXRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeSwgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJUYXNrRGVzY3JpcHRvci5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbnRyb2xHcm91cC5hZGRBbGwoZW50cmllcyk7Ci0JCXJldHVybiBjb250cm9sR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpCi0JCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIGdldFR5cGVOYW1lKChBY3Rpdml0eSkgZSkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRGlhZ3JhbUVkaXRQYXJ0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRGlhZ3JhbUVkaXRQYXJ0KCkgewotCQlBY3Rpdml0eURpYWdyYW1FZGl0UGFydCBhZEVkaXRQYXJ0ID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCkpOwotCQlhZEVkaXRQYXJ0Lm1hcmtEaXJ0eSh0cnVlKTsKLQkJcmV0dXJuIGFkRWRpdFBhcnQ7Ci0JfQotCi0vLwlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUpIHsKLS8vCQlBY3Rpdml0eURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLS8vCQlkaWFncmFtLnNldE9iamVjdChlKTsKLS8vCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotLy8JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0vLwkJZGlhZ3JhbS5hZGRDb25zdW1lcih0aGlzKTsKLS8vCQlyZXR1cm4gcGFydDsKLS8vCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShBY3Rpdml0eSBhY3QpIHsKLQkJaWYgKGFjdCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ7IAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0OyAKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OyAKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0OyAKLQkJfQotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0OyAKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIEltYWdlIGdldFR5cGVJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJSUl0ZW1MYWJlbFByb3ZpZGVyIGFkYXB0ZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob2JqZWN0LAotLy8JCQkJCQlJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotLy8JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLS8vCQkJLy8gcmV0dXJuIG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwKLS8vCQkJLy8gKChVUkwpYWRhcHRlci5nZXRJbWFnZShvYmplY3QpKS5nZXRDb250ZW50KCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQotCS8qKgotCSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgZ3JhaGljYWwgd29ya2Zsb3cgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFZGl0b3JJbnB1dCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlCi0JCSAqLwotCQlwdWJsaWMgRWRpdG9ySW5wdXQoT2JqZWN0IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCQlzdXBlcihlLCBzdXBwcmVzc2lvbik7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydEZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvSUVkaXRvcktlZXBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0lFZGl0b3JLZWVwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5NzY4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvSUVkaXRvcktlZXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB3aGljaCBtYW5hZ2VzIG9wZW5pbmcvY2xvc2luZyBvZiBhbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWRpdG9yS2VlcGVyIHsKLQotCS8qKgotCSAqIFJlZmVyZW5jZSBjbGFzcyBmb3IgZWRpdG9yIGtlZXBlcgotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2UgewotCQlwcml2YXRlIElFZGl0b3JLZWVwZXIgZWRpdG9yS2VlcGVyOwotCi0JCXByaXZhdGUgUmVmZXJlbmNlKCkgewotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JLZWVwZXIoSUVkaXRvcktlZXBlciBlZGl0b3JLZWVwZXIpIHsKLQkJCXRoaXMuZWRpdG9yS2VlcGVyID0gZWRpdG9yS2VlcGVyOwotCQl9Ci0KLQkJcHVibGljIElFZGl0b3JLZWVwZXIgZ2V0RWRpdG9yS2VlcGVyKCkgewotCQkJcmV0dXJuIGVkaXRvcktlZXBlcjsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVmZXJlbmNlIFJFRkVSRU5DRSA9IG5ldyBSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIE9wZW4gYW4gZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQl2b2lkIG9wZW5FZGl0b3IoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBDbG9zZXMgYW4gb3BlbiBlZGl0b3IgaWYgZWxlbWVudCBpcyBkZWxldGVkCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXZvaWQgY2xvc2VFZGl0b3JzT25EZWxldGlvbihPYmplY3Qgb2JqZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzRkMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklSZWZyZXNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLklNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRFZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5FbGVtZW50SFRNTFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5zeW5jaC5JU3luY2hyb25pemF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLkxpYnJhcnlTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7Ci0KLS8qKgotICogVGhlIE1ldGhvZCBFbGVtZW50IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGb3JtRWRpdG9yIGltcGxlbWVudHMKLQkJSUdvdG9NYXJrZXIsIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUluZm8gewotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wOwotCQlsb25nIGxvYWRTdGFtcDsJCQotCQlib29sZWFuIG92ZXJ3cml0ZTsKLQkJYm9vbGVhbiBhZGp1c3RMb2NhdGlvbjsgCi0JCQotCQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwkJCi0JCQotCQlSZXNvdXJjZUluZm8oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJCW1vZGlmaWNhdGlvblN0YW1wID0gSVN5bmNocm9uaXphdGlvbkhlbHBlci5JTlNUQU5DRS5nZXRNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCQlsb2FkU3RhbXAgPSAoKElMaWJyYXJ5UmVzb3VyY2UpcmVzb3VyY2UpLmdldExvYWRTdGFtcCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbG9hZFN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBNZXRob2RFbGVtZW50RWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBpbnQgcHJldmlld19wYWdlX2luZGV4ID0gLTE7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudEhUTUxWaWV3ZXIgcHJldmlld2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnRPYmogPSBudWxsOwotCQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCS8vIFRoZSByaWNoIHRleHQgY29udHJvbCBvciBlZGl0b3Igd2hvc2UgY29udGVudCB3YXMgbGFzdCBtb2RpZmllZCBiZWZvcmUKLQkvLyB0aGUgU2F2ZSBvciBTYXZlIEFsbCBidXR0b24ga2V5IGlzIHNlbGVjdGVkLgotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgbW9kaWZpZWRSaWNoVGV4dCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBuYW1lQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChNZXRob2RFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJCW5hbWVDaGFuZ2VkKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JcHJvdGVjdGVkIEFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpcnR5OwotCi0JcHJpdmF0ZSBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gd2lkZ2V0c1RvUmVzdG9yZVZhbHVlID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCi0JcHJpdmF0ZSBsb25nIGNoYW5nZVRpbWUgPSAtMTsKLQotCXB1YmxpYyBPYmplY3Qgd2lkZ2V0VG9DaGVjazsKLQotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRGZWF0dXJlRWRpdG9yOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY3VycmVudEVkaXRlZEZlYXR1cmU7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciBmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgPSBudWxsOwotCQotCS8qKgotCSAqIEV4dGVuc2lvbiBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FID0gIk1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbj4gYWxsUGFnZVByb3ZpZGVyczsKLQlwcm90ZWN0ZWQgc3RhdGljIElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGRlZmF1bHRQYWdlUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLnJlc291cmNlQ2hhbmdlZCgpOiBldmVudCA9ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJdHJ5IHsKLQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJCXByb3RlY3RlZCBNYXAgVVJJVG9Vc2VkUmVzb3VyY2VNYXAgPSBnZXRVUklUb1VzZWRSZXNvdXJjZU1hcCgpOwotCi0JCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCQkJCWlmIChkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMKLQkJCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIChJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpICE9IDApIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIFVSSVRvVXNlZFJlc291cmNlTWFwCi0JCQkJCQkJCQkJLmdldChVUkkuY3JlYXRlRmlsZVVSSShkZWx0YQotCQkJCQkJCQkJCQkJLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpKTsKLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgewotCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKLQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSAmJiAhaXNEaXJ0eSgpKSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQljbGFzcyBBY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIgewotCi0JCS8qKiBDYWNoZSBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBwYXJ0LiAqLwotCQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIFRoZSBwYXJ0IHNlcnZpY2UuCi0JCSAqIAotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwcml2YXRlIElQYXJ0U2VydmljZSBmUGFydFNlcnZpY2U7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHBhcmFtIHBhcnRTZXJ2aWNlCi0JCSAqICAgICAgICAgICAgdGhlIHBhcnQgc2VydmljZSBvbiB3aGljaCB0byBhZGQgdGhlIHBhcnQgbGlzdGVuZXIKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIEFjdGl2YXRpb25MaXN0ZW5lcihJUGFydFNlcnZpY2UgcGFydFNlcnZpY2UpIHsKLQkJCWZQYXJ0U2VydmljZSA9IHBhcnRTZXJ2aWNlOwotCQkJZlBhcnRTZXJ2aWNlLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuYWRkV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQkvKioKLQkJICogRGlzcG9zZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZQYXJ0U2VydmljZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlbW92ZVdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQkJZlBhcnRTZXJ2aWNlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlmQWN0aXZlUGFydCA9IHBhcnQ7Ci0JCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0ID09IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcykgewotCQkJCWlmICghaXNJbnB1dFZhbGlkKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZyk7IAotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2xvc2UoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSBnZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJaWYgKFJlc291cmNlVXRpbC5oYXNPdXRPZlN5bmNoKHVzZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCWhhbmRsZUZpbGVDaGFuZ2VkKHVzZWRSZXNvdXJjZXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXNldFJlc291cmNlSW5mb3ModXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiB0cmlnZ2VyaW5nIGEgZWxlbWVudCBzdGF0ZSBjaGVjayBpbiB0aGUKLQkJICogZWRpdG9yLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUFjdGl2YXRpb24oKSB7Ci0JCQlpZiAoZklzSGFuZGxpbmdBY3RpdmF0aW9uIHx8IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5kaXNwb3NlZCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChmQWN0aXZlUGFydCA9PSBNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMpIHsKLQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCWhhbmRsZUFjdGl2YXRlKGZBY3RpdmVQYXJ0KTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQlpZiAod2luZG93ID09IGdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSkgewotCQkJCS8qCi0JCQkJICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBkZXNjcmliZWQgaW4KLQkJCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzMxIFdpbGwgYmUKLQkJCQkgKiByZW1vdmVkIHdoZW4gU1dUIGhhcyBzb2x2ZWQgdGhlIHByb2JsZW0uCi0JCQkJICovCi0JCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0Nsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd09wZW5lZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgQWN0aXZhdGlvbkxpc3RlbmVyIGFjdGl2YXRpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0ZpbGVDaGFuZ2VkUmVxdWlyZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBIYXNoU2V0PFJlc291cmNlPiBsYXN0VXNlZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCXByb3RlY3RlZCBIYXNoTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+IHJlc291cmNlSW5mb01hcDsKLQotCXByaXZhdGUgSUZpbGUgZWxlbWVudEZpbGU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCS8vIG1vdmVkIHRoZSBkZXRhaWxzIG91dCBzbyB0aGF0IHVzZXIgY2FuIG92ZXJyaWRlIHRoZSB0aWNrIHVwZGF0b3IKLQkJLy8gSmluaHVhIFhpIDMvMTUvMjAwNwotCQljcmVhdGVFZGl0b3JFcnJvclRpY2tVcGRhdGVyKCk7Ci0JCWNyZWF0ZUFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpIHsKLQkJCi0JCXRoaXMuZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25NYW5hZ2VyKCkgewotCQlhY3Rpb25NZ3IgPSBuZXcgQWN0aW9uTWFuYWdlcigpIHsKLQotCQkJcHJvdGVjdGVkIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCQkJcmV0dXJuIG5ldyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sodGhpcykgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBkb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJCQkvLyBDaGVjayBtb2RpZnkgZmlyc3QuCi0JCQkJCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCkKLQkJCQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsCi0JCQkJCQkJCQkmJiAhKG1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkpIHsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvci50aGlzCi0JCQkJCQkJCQkJCS5oYW5kbGVFcnJvcihzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlFT2JqZWN0IG93bmVyID0gVG5nVXRpbC5nZXRPd25lcihjb21tYW5kKTsKLQkJCQkJCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KG93bmVyLAotCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheSgKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LCAKLQkJCQkJCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoY2hhbmdlVGltZSA9PSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gcmV0ID0gc3VwZXIuZG9FeGVjdXRlKGNvbW1hbmQpOwotCQkJCQkJaWYgKCFyZXQgJiYgY2hhbmdlVGltZSAhPSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gVG5nVXRpbAotCQkJCQkJLmNoZWNrRWRpdChvYmplY3QsIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdGhpcyBtaWdodCBiZSBjYWxsZWQgZnJvbSBhIG5vbi1VSSB0aHJlYWQKLQkJCQkJLy8gc28gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGRpYWxvZyB3aWxsIGJlIHNob3duIGluIGEgVUkgdGhyZWFkCi0JCQkJCS8vCi0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwgCi0JCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJLy8gZG9uJ3Qgc2F2ZSByZXNvdXJjZSB0aGF0IGlzIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGlzIGVkaXRvcgotCQkJCS8vCi0JCQkJaWYgKGNoYW5nZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJYm9vbGVhbiBjYW5TYXZlOwotCQkJCWlmKHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJY2FuU2F2ZSA9IGZpbGUubGFzdE1vZGlmaWVkKCkgPiBjaGFuZ2VUaW1lOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2FuU2F2ZSA9IHRydWU7Ci0JCQkJfQkJCQkKLQkJCQl0cnkgewotCQkJCQlpZihjYW5TYXZlKSB7Ci0JCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRFZGl0b3JTaXRlKCkKLQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJY2hhbmdlVGltZSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoCi0JCQkJbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnN0YXJ0TGlzdGVuaW5nVG8oYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBuYW1lQ2hhbmdlZCgpIHsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNldFBhcnROYW1lKCk7Ci0JCQkJaWYgKHBhZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGFnZSA9IGl0ZXIubmV4dCgpOwotCi0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElSZWZyZXNoYWJsZSkgewotCQkJCQkJCSgoSVJlZnJlc2hhYmxlKSBwYWdlKS5yZWZyZXNoTmFtZShlbGVtZW50T2JqCi0JCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNpbml0KElFZGl0b3JTaXRlLAotCSAqICAgICAgSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkvLyBwcm9iYWJseSBvcGVuZWQgZnJvbSBQcm9ibGVtcyBWaWV3Ci0JCQkvLyBjcmVhdGUgYSBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQKLQkJCWVsZW1lbnRGaWxlID0gKChGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KAotCQkJCQllbGVtZW50RmlsZSwKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS4KLQkJCQkJCWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCWVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXNldElucHV0KGlucHV0KTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcihuZXcgTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIodGhpcykpOwotCQlhY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgQWN0aXZhdGlvbkxpc3RlbmVyKHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0UGFydFNlcnZpY2UoKSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCUltYWdlIHRpdGxlSW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnRPYmopOwotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJc2V0VGl0bGVJbWFnZSh0aXRsZUltYWdlKTsKLQotCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpOwotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgY29tbWFuZFN0YWNrKTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotCi0JCS8vIEdldCBtZXRob2QgZWxlbWVudCBvYmplY3QgZnJvbSBFZGl0b3IgaW5wdXQuCi0JCS8vCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJZWxlbWVudE9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJc2V0UGFydE5hbWUoKTsKLQkJZWxlbWVudE9iai5lQWRhcHRlcnMoKS5hZGQobmFtZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQotCQlpZiAoZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyICE9IG51bGwpCi0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIudXBkYXRlRWRpdG9ySW1hZ2UoZWxlbWVudE9iaik7Ci0KLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkKLQl7Ci0JCXJldHVybiBlbGVtZW50T2JqOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVSZXNvdXJjZUluZm9zKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlpZihyZXNvdXJjZUluZm9NYXAgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VJbmZvTWFwID0gbmV3IEhhc2hNYXA8UmVzb3VyY2UsIFJlc291cmNlSW5mbz4oKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZUluZm8gaW5mbyA9IHJlc291cmNlSW5mb01hcC5nZXQocmVzb3VyY2UpOwotCQkJaWYoaW5mbyA9PSBudWxsKSB7Ci0JCQkJaW5mbyA9IG5ldyBSZXNvdXJjZUluZm8ocmVzb3VyY2UpOwotCQkJCXJlc291cmNlSW5mb01hcC5wdXQocmVzb3VyY2UsIGluZm8pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5mby5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3Zld3JpdGVSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlSW5mbyBpbmZvID0gcmVzb3VyY2VJbmZvTWFwLmdldChyZXNvdXJjZSk7Ci0JCQlpZihpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLm92ZXJ3cml0ZSA9IHRydWU7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUluZm9zKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlpZihyZXNvdXJjZUluZm9NYXAgIT0gbnVsbCAmJiAhcmVzb3VyY2VJbmZvTWFwLmlzRW1wdHkoKSkgewotCQkJcmVzb3VyY2VJbmZvTWFwLmNsZWFyKCk7Ci0JCX0KLQkJdXBkYXRlUmVzb3VyY2VJbmZvcyhyZXNvdXJjZXMpOwotCX0KLQkKLQlwcml2YXRlIGxvbmcgZ2V0TG9hZFN0YW1wKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlSW5mbyBpbmZvID0gcmVzb3VyY2VJbmZvTWFwLmdldChyZXNvdXJjZSk7Ci0JCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvLmxvYWRTdGFtcCA6IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnkgcmVzb3VyY2UgaW4gdGhlIGdpdmVuIDxjb2RlPnVzZWRSZXNvdXJjZXM8L2NvZGU+Ci0JICogdGhhdCBoYXMgYmVlbiByZWxvYWRlZCBzaW5jZSBsYXN0IHVwZGF0ZSBvZiBsb2FkIHRpbWUgc3RhbXBzIGJ5IHRoaXMKLQkgKiBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdXNlZFJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1JlbG9hZGVkKENvbGxlY3Rpb24gdXNlZFJlc291cmNlcykgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KHVzZWRSZXNvdXJjZXMpOwotCQlib29sZWFuIHhtaSA9IHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCAKLQkJCSYmICgoSUxpYnJhcnlSZXNvdXJjZVNldClyZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkuZXF1YWxzKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdXNlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZSkgewotCQkJCWxvbmcgb2xkU3RhbXAgPSBnZXRMb2FkU3RhbXAocmVzb3VyY2UpOwotCQkJCWxvbmcgY3VycmVudFN0YW1wID0gKChJTGlicmFyeVJlc291cmNlKXJlc291cmNlKS5nZXRMb2FkU3RhbXAoKTsKLQkJCQlpZiAob2xkU3RhbXAgIT0gY3VycmVudFN0YW1wKSB7Ci0JCQkJCWlmKHhtaSkgewotCQkJCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZQotCQkJCQkJCQkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQkJaWYgKHdzUmVzICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlyZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRPdXRPZlN5bmNSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcykgewotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBvdXRPZlN5bmNSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogdXNlZFJlc291cmNlcykgewotCQkJaWYoaXNPdXRPZlN5bmMocmVzb3VyY2UpKSB7Ci0JCQkJb3V0T2ZTeW5jUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dE9mU3luY1Jlc291cmNlczsKLQl9Ci0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNPdXRPZlN5bmMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VJbmZvIGluZm8gPSByZXNvdXJjZUluZm9NYXAuZ2V0KHJlc291cmNlKTsKLQkJbG9uZyBzdGFtcCA9IElTeW5jaHJvbml6YXRpb25IZWxwZXIuSU5TVEFOQ0UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpOwotCQlpZihzdGFtcCAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkgewotCQkJaWYoaW5mbyA9PSBudWxsIHx8IGluZm8ubW9kaWZpY2F0aW9uU3RhbXAgIT0gc3RhbXApIHsKLQkJCQlpZihJU3luY2hyb25pemF0aW9uSGVscGVyLklOU1RBTkNFLmlzU3luY2hyb25pemVkKHJlc291cmNlKSkgewotCQkJCQkvLyByZWZyZXNoIHRoZSBjYWNoZWQgc3RhbXAKLQkJCQkJLy8KLQkJCQkJaWYoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZUluZm9NYXAucHV0KHJlc291cmNlLCBuZXcgUmVzb3VyY2VJbmZvKHJlc291cmNlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbmZvLm1vZGlmaWNhdGlvblN0YW1wID0gSVN5bmNocm9uaXphdGlvbkhlbHBlci5JTlNUQU5DRS5nZXRNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSk7IAotCQkJCQl9CQkJCQkJCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIUlTeW5jaHJvbml6YXRpb25IZWxwZXIuSU5TVEFOQ0UuaXNTeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZUNoYW5nZWQoQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzKSB7Ci0JCS8vIGNoZWNrIHJlc291cmNlIHNldCB0eXBlIGFuZCBjb250aW51ZSB0byBjaGVjayBmb3IgY2hhbmdlZCBmaWxlIGlmIHRoZQotCQkvLyB0eXBlIGlzIFhNSQotCQkvLwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KHVzZWRSZXNvdXJjZXMpOwotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0Ci0JCQkJJiYgKChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkuZXF1YWxzKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdXNlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYoaXNPdXRPZlN5bmMocmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0UmVsb2FkRmlsZXMoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlOwotCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZTsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5UHJvbXB0KAotCQkJCXRpdGxlLCBtc2cpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlRmlsZUNoYW5nZWQoZmluYWwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcykgewotCQlib29sZWFuIHJldCA9IHByb21wdFJlbG9hZEZpbGVzKCk7Ci0JCWlmIChyZXQpIHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQltb25pdG9yLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaF90ZXh0KTsgCi0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQl0cnkgewotCi0JCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiB1c2VkUmVzb3VyY2VzKSB7Ci0JCQkJCQkJaWYgKCFuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCQkJCS5leGlzdHMoKSkgewotCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IHJlc291cmNlSW5mb01hcCAhPSBudWxsID8gCi0JCQkJCQkJCWdldE91dE9mU3luY1Jlc291cmNlcyh1c2VkUmVzb3VyY2VzKSA6Ci0JCQkJCQkJCVJlc291cmNlVXRpbC5nZXRPdXRPZlN5bmNSZXNvdXJjZXModXNlZFJlc291cmNlcyk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgyKTsKLQotCQkJCQkJLy8gdW5sb2FkIHRoZSByZW1vdmVkIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCVBlcnNpc3RlbmNlVXRpbC51bmxvYWQocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgyKTsKLQotCQkJCQkJLy8gUmVsb2FkIHRoZSBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVsb2FkZWRSZXNvdXJjZXMgPSBtYW5hZ2VyCi0JCQkJCQkJCQkucmVsb2FkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCQkJCWlmICghcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKQotCQkJCQkJCQkJCS5hZGRBbGwocmVsb2FkZWRSZXNvdXJjZXMpOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQkJCQkJCXx8ICFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjaGFuZ2VkIHJlc291cmNlcyBiZWZvcmUgcmVmcmVzaCBzbwotCQkJCQkJCQkvLyBhY3Rpb24KLQkJCQkJCQkJLy8gbWFuYWdlciB3aWxsIG5vdCB0cnkgdG8gc2F2ZSB0aGVzZSBjaGFuZ2VkCi0JCQkJCQkJCS8vIHJlc291cmNlcwotCQkJCQkJCQkvLwotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2hhbmdlZFJlc291cmNlcwotCQkJCQkJCQkJCS5hZGRBbGwocmVsb2FkZWRSZXNvdXJjZXMpOwotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMubGFzdFVzZWRSZXNvdXJjZXMKLQkJCQkJCQkJCQkucmVtb3ZlQWxsKHJlbW92ZWRSZXNvdXJjZXMpOwotCQkJCQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2hhbmdlZFJlc291cmNlcwotCQkJCQkJCQkJCS5jbGVhcigpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKDQpOwotCi0JCQkJCQkvLyByZWZyZXNoIG91dC1vZi1zeW5jaCByZXNvdXJjZXMKLQkJCQkJCS8vCi0JCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotCQkJCQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCWdldFNpdGUoKQotCQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRQcm9ncmVzc1NlcnZpY2UoKQotCQkJCQkJLnJ1bkluVUkoCi0JCQkJCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLAotCQkJCQkJCQlydW5uYWJsZSwgbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU7IAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQl0aXRsZSwgZS50b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNoZWNrRmlsZUNoYW5nZWRSZXF1aXJlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFydE5hbWUoKSB7Ci0JCVN0cmluZyBwYXJ0TmFtZSA9IGVsZW1lbnRPYmouZ2V0TmFtZSgpOwotCQlpZiAocGFydE5hbWUgPT0gbnVsbCkgewotCQkJcGFydE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFBhcnROYW1lKHBhcnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8SU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24+IGdldEFsbFBhZ2VQcm92aWRlcnMoKSB7Ci0JCWlmIChhbGxQYWdlUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWFsbFBhZ2VQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyLmdldEV4dGVuc2lvbnMoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIE1FVEhPRF9QQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSwgSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24uY2xhc3MpOwotCQl9Ci0JCXJldHVybiBhbGxQYWdlUHJvdmlkZXJzOwotCX0KLQotCi0JcHJvdGVjdGVkIElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGdldERlZmF1bHRQYWdlUHJvdmlkZXIoKSB7Ci0JCWlmIChkZWZhdWx0UGFnZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlZmF1bHRQYWdlUHJvdmlkZXIgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFBhZ2VQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gZmlyc3QgZ2V0IG9yaWdpbmFsIGxpc3QKLQkJTWFwPE9iamVjdCxTdHJpbmc+IHBhZ2VNYXAgPSBnZXREZWZhdWx0UGFnZVByb3ZpZGVyKCkuZ2V0UGFnZXMobmV3IExpbmtlZEhhc2hNYXA8T2JqZWN0LFN0cmluZz4oKSwgdGhpcywgZWxlbWVudE9iaik7Ci0JCQotCQkvLyBsZXQgZXh0ZW5zaW9ucyBtb2RpZnkKLQkJTGlzdDxJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbj4gcGFnZVByb3ZpZGVycyA9IGdldEFsbFBhZ2VQcm92aWRlcnMoKTsKLQkJaWYgKHBhZ2VQcm92aWRlcnMgIT0gbnVsbCAmJiBwYWdlUHJvdmlkZXJzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gZXh0ZW5zaW9uIDogcGFnZVByb3ZpZGVycykgewotCQkJCXBhZ2VNYXAgPSBleHRlbnNpb24uZ2V0UGFnZXMocGFnZU1hcCwgdGhpcywgZWxlbWVudE9iaik7Ci0JCQl9Ci0JCX0KLQkJLy8gbm93IGFkZCBwYWdlcwotCQl0cnkgewotCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0LCBTdHJpbmc+IHBhZ2VFbnRyeSA6IHBhZ2VNYXAuZW50cnlTZXQoKSkgewotCQkJCU9iamVjdCBwYWdlID0gcGFnZUVudHJ5LmdldEtleSgpOwotCQkJCVN0cmluZyBuYW1lID0gcGFnZUVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJCWluZGV4ID0gYWRkUGFnZSgoQ29udHJvbClwYWdlKTsKLQkJCQl9IGVsc2UgaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQkJaW5kZXggPSBhZGRQYWdlKChJRm9ybVBhZ2UpcGFnZSk7Ci0JCQkJfSBlbHNlIGlmIChwYWdlIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJaW5kZXggPSBhZGRQYWdlKChJRWRpdG9yUGFydClwYWdlLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQl9Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQlzZXRQYWdlVGV4dChpbmRleCwgbmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlzZXRQYXJ0TmFtZShlbGVtZW50T2JqLmdldE5hbWUoKSk7Ci0KLQkJCWlmICghKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSB8fCBlbGVtZW50T2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkKLQkJCQljcmVhdGVQcmV2aWV3UGFnZSgpOwotCi0JCQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKHQpOwotCQkJZGlzcG9zZSgpOwotCQkJaWYodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbil0OwotCQkJfQotCQkJaWYodCBpbnN0YW5jZW9mIEVycm9yKSB7Ci0JCQkJdGhyb3cgKEVycm9yKSB0OwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoCi0JCQkvLyByZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCQkJaWYgKGFjdGl2YXRpb25MaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJYWN0aXZhdGlvbkxpc3RlbmVyLmRpc3Bvc2UoKTsKLQkJCX0KLQotCQkJbW9kaWZpZWRSaWNoVGV4dCA9IG51bGw7Ci0KLQkJCWRpc3Bvc2VFZGl0b3JFcnJvclRpY2tVcGRhdGVyKCk7Ci0JCQkKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5zdG9wTGlzdGVuaW5nVG8oYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpKTsKLQkJCX0KLQotCQkJaWYgKGlzRGlydHkoKSkgewotCQkJCWFjdGlvbk1nci51bmRvQWxsKCk7Ci0JCQl9Ci0JCQlhY3Rpb25NZ3IuZGlzcG9zZSgpOwotCQkJZWxlbWVudE9iai5lQWRhcHRlcnMoKS5yZW1vdmUobmFtZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkKLQkJCWlmKHJlc291cmNlSW5mb01hcCAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VJbmZvTWFwLmNsZWFyKCk7Ci0JCQkJcmVzb3VyY2VJbmZvTWFwID0gbnVsbDsJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmKGNoYW5nZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCQljaGFuZ2VkUmVzb3VyY2VzID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJaWYoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5jbGVhcigpOwotCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBudWxsOwotCQkJfQotCQkJCi0JCQlpZihQZXJzcGVjdGl2ZVV0aWwuaXNBY3RpdmVQZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCQkvLyB1bmxvYWQgYWxsIHJlc291cmNlcyBvZiBjb250ZW50IGRlc2NyaXB0aW9uIHRoYXQgYXJlIG5vdCB1c2VkIGJ5IAotCQkJfQotCQkJCi0JCQlpZihsYXN0VXNlZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJbGFzdFVzZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCQlsYXN0VXNlZFJlc291cmNlcyA9IG51bGw7Ci0JCQl9CQkJCQkJIAotCQl9IGZpbmFsbHkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJZGlzcG9zZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVkaXRvckVycm9yVGlja1VwZGF0ZXIoKQotCXsKLQkJaWYgKCBmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCApIHsKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5kaXNwb3NlKCk7Ci0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZiAoZGlydHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZGlydHkgPSBhY3Rpb25NZ3IuaXNTYXZlTmVlZGVkKCk7Ci0JCXJldHVybiBkaXJ0eTsKLQl9Ci0KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJaWYgKHBlcnNpc3RlciA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbW9kaWZpZWQgcmljaCB0ZXh0IGZpZWxkCi0JICogQHBhcmFtIG1vZGlmaWVkUmljaFRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZFJpY2hUZXh0KElNZXRob2RSaWNoVGV4dCBtb2RpZmllZFJpY2hUZXh0KSB7Ci0JCXRoaXMubW9kaWZpZWRSaWNoVGV4dCA9IG1vZGlmaWVkUmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBtb2RpZmllZCByaWNoIHRleHQgCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGlmaWVkUmljaFRleHQoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsICYmICFyaWNoVGV4dC5pc0Rpc3Bvc2VkKCkKLQkJCQkmJiByaWNoVGV4dC5nZXRNb2RpZmllZCgpKSB7Ci0JCQlFT2JqZWN0IG1vZGFsT2JqZWN0ID0gcmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUgPSByaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCk7Ci0JCQlpZiAobW9kYWxPYmplY3QgIT0gbnVsbCAmJiBtb2RhbE9iamVjdEZlYXR1cmUgIT0gbnVsbCkgewotCQkJCU9iamVjdCBvbGRDb250ZW50ID0gbW9kYWxPYmplY3QuZUdldChtb2RhbE9iamVjdEZlYXR1cmUpOwotCQkJCWlmICghbXVzdFJlc3RvcmVWYWx1ZShyaWNoVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQkJT2JqZWN0IG5ld0NvbnRlbnQgPSByaWNoVGV4dC5nZXRUZXh0KCk7Ci0JCQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KChTdHJpbmcpbmV3Q29udGVudCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIG1vZGFsT2JqZWN0LAotCQkJCQkJCQltb2RhbE9iamVjdEZlYXR1cmUsIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgbGFzdCBtb2RpZmllZCByaWNoIHRleHQgCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGlmaWVkUmljaFRleHQoKSB7Ci0JCXNhdmVNb2RpZmllZFJpY2hUZXh0KG1vZGlmaWVkUmljaFRleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKGZhbHNlKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5VmFsaWRhdGVBY3Rpb24jcmVmcmVzaFZpZXdzKCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdzKCkgewotCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5yZWZyZXNoVmlld3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZXMoQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcykgewotCQlBcnJheUxpc3Q8RU9iamVjdD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJZWxlbWVudHMuYWRkQWxsKHJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQkJfQotCQl9Ci0JCUxpYnJhcnlWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnRzKSk7Ci0JCXZhbGlkYXRlQWN0aW9uLnJ1bigpOwotCQlyZXR1cm4gdmFsaWRhdGVBY3Rpb24uaXNTdWNjZXNzZnVsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuZG9TYXZlOiBzYXZpbmcgY2hhbmdlcyB0byBtZXRob2QgbGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlzYXZlTW9kaWZpZWRSaWNoVGV4dChtb2RpZmllZFJpY2hUZXh0KTsKLQotCQlnZXRQZXJzaXN0ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGZvciBtb2RpZmlhYmxlCi0JCQkvLwotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBnZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCi0JCQlBcnJheUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlc1RvU2F2ZSA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkJLy8gdXBkYXRlIHZlcnNpb24gaW5mbyBpbiBsaWJyYXJ5IHJlc291cmNlIGlmIG5lZWRlZCBieSBhZGRpbmcKLQkJCS8vIGxpYnJhcnkgcmVzb3VyY2UgdG8gY29sbGVjdGlvbgotCQkJLy8gb2YgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkvLwotCQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mbyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJCWlmIChtZSAhPSBudWxsKSB7Ci0JCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShtZSk7Ci0JCQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJCQlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IGxpYi5lUmVzb3VyY2UoKTsKLQkJCQkJCQlpZiAobGliUmVzb3VyY2UgIT0gbnVsbAotCQkJCQkJCQkJJiYgIW1vZGlmaWVkUmVzb3VyY2VzLmNvbnRhaW5zKGxpYlJlc291cmNlKQotCQkJCQkJCQkJJiYgIXJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8KLQkJCQkJCQkJCQkJLmNvbnRhaW5zKGxpYlJlc291cmNlKQotCQkJCQkJCQkJJiYgUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCQkJCS5jaGVja1Rvb2xWZXJzaW9uKGxpYlJlc291cmNlKSAhPSAwKSB7Ci0JCQkJCQkJCXJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8uYWRkKGxpYlJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzb3VyY2VzVG9TYXZlLmFkZEFsbChyZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvKTsKLQkJCX0KLQotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCXJlc291cmNlc1RvU2F2ZSwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaGFuZGxlRXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGZvciBvdXQtb2Ytc3luY2gKLQkJCS8vCi0JCQlpZiAoY2hlY2tGaWxlQ2hhbmdlZChyZXNvdXJjZXNUb1NhdmUpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfdGl0bGU7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVwZGF0ZV9vdXRvZnN5bmNoX21zZzsKLQkJCQlpZiAoIUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlQcm9tcHQodGl0bGUsIG1zZykpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZmxhZyB0aGUgcmVzb3VyY2VzIHRvIHVwZGF0ZSB2ZXJzaW9uIGluZm8gYXMgbW9kaWZpZWQgc28gdGhleQotCQkJLy8gd2lsbCBiZSBzYXZlZAotCQkJLy8KLQkJCWlmICghcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mby5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihpc1ZhbGlkYXRlUmVzb3VyY2VzQmVmb3JlU2F2ZVJlcXVpcmVkKCkpIHsKLQkJCQkvLyB2YWxpZGF0ZQotCQkJCS8vCi0JCQkJaWYoIXZhbGlkYXRlUmVzb3VyY2VzKG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm8gdmFsaWRhdGlvbiBiZWZvcmUgc2F2ZQotCQkJCS8vIHJlbW92ZSBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgbWFya2VycyBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBtZXRob2QgZWxlbWVudAotCQkJCS8vCi0JCQkJaWYoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuSU5TVEFOQ0UuaGFzTWFya2VycyhlbGVtZW50T2JqKSkgewotCQkJCQlMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRS5kZWxldGVNYXJrZXJzKGVsZW1lbnRPYmopOwotCQkJCQkKLQkJCQkJLy8gcmVmcmVzaCBsaWJyYXJ5IHZpZXcKLQkJCQkJLy8KLQkJCQkJTGlicmFyeVZpZXcgdmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLQkJCQkJaWYodmlldyAhPSBudWxsKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IuY2xlYXJEZWNvcmF0aW9uQ2FjaGUoKTsKLQkJCQkJCXZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkKLQkJCS8vIFNhdmUuCi0JCQkvLwotCQkJT2JqZWN0IG9sZFZhbHVlID0gcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCkuZ2V0KAotCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuT1BUSU9OU19PVkVSV1JJVEFCTEVfUkVTT1VSQ0VTKTsgCi0KLQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlc1RvQWRqdXN0TG9jYXRpb24gPSBudWxsOwotCQkJCi0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5nZXRTYXZlT3B0aW9ucygpLnB1dCgKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5PUFRJT05TX09WRVJXUklUQUJMRV9SRVNPVVJDRVMsIAotCQkJCQkJZ2V0T3ZlcndyaXRhYmxlUmVzb3VyY2VzKCkpOwotCQkJCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9TYXZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU7IAotCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsgCi0JCQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQkJCTogZS5nZXRNZXNzYWdlKCk7IAotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCWRpcnR5ID0gZmFsc2U7Ci0JCQkJCWFjdGlvbk1nci5zYXZlSXNEb25lKCk7Ci0JCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbiA9IGdldFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbigpOwkKLQkJCQkJc2V0UmVzb3VyY2VJbmZvcyhnZXRVc2VkUmVzb3VyY2VzKCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhyZWFzb24pKSB7Ci0JCQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMjsgCi0JCQkJCX0KLQkJCQkJU3RyaW5nV3JpdGVyIGRldGFpbHMgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihkZXRhaWxzKSk7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsgCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyOyAKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwgbWVzc2FnZSwgcmVhc29uLCBkZXRhaWxzLnRvU3RyaW5nKCksIGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXBlcnNpc3Rlci5nZXRTYXZlT3B0aW9ucygpLnB1dCgKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5PUFRJT05TX09WRVJXUklUQUJMRV9SRVNPVVJDRVMsCi0JCQkJCQlvbGRWYWx1ZSk7Ci0JCQl9Ci0KLQkJCS8vIFJlbmFtZQotCQkJLy8KLQkJCS8vQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbiA9IGdldFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbigpOwkJCQkJCQotCQkJaWYgKHJlc291cmNlc1RvQWRqdXN0TG9jYXRpb24gIT0gbnVsbCAmJiAhcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU7IAotCQkJCQlTdHJpbmcgdGVtcGxhdGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMTsgCi0JCQkJCVN0cmluZ0J1ZmZlciBmaWxlTGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCU9iamVjdCBvYmogPSBGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCQkJaWYob2JqID09IG51bGwpIHsKLQkJCQkJCQlvYmogPSByZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJCWZpbGVMaXN0LmFwcGVuZChvYmopLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZW1wbGF0ZSwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBmaWxlTGlzdCB9KTsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMQotCQkJCQkJCTogZS5nZXRNZXNzYWdlKCk7IAotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBtc2csIHJlYXNvbiwgZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhyZWFzb24pKSB7Ci0JCQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMjsgCi0JCQkJCX0KLQkJCQkJU3RyaW5nV3JpdGVyIGRldGFpbHMgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihkZXRhaWxzKSk7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI7IAotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBtZXNzYWdlLCByZWFzb24sIGRldGFpbHMudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCi0JCQkJcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbi5jbGVhcigpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldFNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRPdmVyd3JpdGFibGVSZXNvdXJjZXMoKSB7Ci0JCWlmKHJlc291cmNlSW5mb01hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlSW5mb01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlSW5mbyBpbmZvID0gKFJlc291cmNlSW5mbykgaXRlci5uZXh0KCk7Ci0JCQlpZihpbmZvLm92ZXJ3cml0ZSkgewotCQkJCXJlc291cmNlcy5hZGQoaW5mby5yZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbigpIHsKLQkJaWYocmVzb3VyY2VJbmZvTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VJbmZvIGluZm8gPSAoUmVzb3VyY2VJbmZvKSBpdGVyLm5leHQoKTsKLQkJCWlmKGluZm8uYWRqdXN0TG9jYXRpb24pIHsKLQkJCQlyZXNvdXJjZXMuYWRkKGluZm8ucmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQl0cnkgewotCQkJCWdldFBlcnNpc3RlcigpLnNhdmUocmVzb3VyY2UpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU7IAotCQkJCVN0cmluZyB0ZW1wbGF0ZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsgCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRlbXBsYXRlLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgfSk7Ci0JCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMQotCQkJCQkJOiBlLmdldE1lc3NhZ2UoKTsgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBtc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcmV2aWV3UGFnZSgpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGdldENvbnRhaW5lcigpOwotCQlDb21wb3NpdGUgcHJldmlld0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXByZXZpZXdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCVByZXZpZXdQYWdlIHBhZ2UgPSBuZXcgUHJldmlld1BhZ2UocHJldmlld0NvbXBvc2l0ZSk7Ci0JCXByZXZpZXdlciA9IHBhZ2UuZ2V0UHJldmlld1ZpZXdlcigpOwotCi0JCXByZXZpZXdfcGFnZV9pbmRleCA9IGFkZFBhZ2UocHJldmlld0NvbXBvc2l0ZSk7Ci0JCXNldFBhZ2VUZXh0KHByZXZpZXdfcGFnZV9pbmRleCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJldmlld1BhZ2VfdGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBsaXN0ZW4gdG8gdGhlIHRhYiBjaGFuZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQotCQlpZiAocHJldmlld19wYWdlX2luZGV4ID09IG5ld1BhZ2VJbmRleCAmJiBwcmV2aWV3ZXIgIT0gbnVsbCkgewotCQkJLy8gVXNlIHRoZSBkZWZhdWx0IGxheW91dCBtYW5hZ2VyLgotCQkJLy9wcmV2aWV3ZXIuc2V0TGF5b3V0TWFuYWdlcihudWxsKTsKLQkJCXByZXZpZXdlci5zaG93RWxlbWVudENvbnRlbnQoZWxlbWVudE9iaik7Ci0JCX0KLQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQobmV3UGFnZUluZGV4KTsKLQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB7Ci0JCQlJVmlld1BhcnQgcHJvcGVydGllc1ZpZXcgPSBnZXRFZGl0b3JTaXRlKCkuZ2V0UGFnZSgpLmZpbmRWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcm9wZXJ0aWVzVmlldyBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCQkoKFByb3BlcnR5U2hlZXQpcHJvcGVydGllc1ZpZXcpLnBhcnRBY3RpdmF0ZWQodGhpcyk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpcnR5KCkgewotCQlkaXJ0eSA9IHRydWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHZhbHVlIG9mIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCQlib29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgY29udHJvbCB3YXMgcmVzdG9yZWQgb3Igbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdFJlc3RvcmVWYWx1ZShPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh3aWRnZXRUb0NoZWNrID09IGNvbnRyb2wpIHsKLQkJCS8vIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkIGZvciBlZGl0YWJsZSwgYnV0IHRoZXJlIGlzCi0JCQkvLyBzdGlsbCBmb2N1cyBsb3N0Ci0JCQkvLyBldmVudCBpcyBiZWluZyBzZW50IG91dCBldmVuIHRoZSBjaGVjayBpcyBub3QgY29tcGxldGVkIHlldC4KLQkJCS8vIHJldHVybiB0cnVlIHNvIHRoZSBmb2N1c0xvc3QoKSB3aWxsIG5vdCBtYWtlIGFueSBjaGFuZ2UgdG8gdGhlCi0JCQkvLyBjb250cm9sLgotCQkJLy8KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJT2JqZWN0IGVkaXRDb250cm9sID0gY29udHJvbDsKLQkJaWYgKGVkaXRDb250cm9sIGluc3RhbmNlb2YgTWV0aG9kUmljaFRleHRFZGl0b3IpIHsKLQkJCWVkaXRDb250cm9sID0gKChNZXRob2RSaWNoVGV4dEVkaXRvcikgY29udHJvbCkuZ2V0UmljaFRleHRDb250cm9sKCk7Ci0JCX0KLQkJYm9vbGVhbiByZXN0b3JlID0gd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGVkaXRDb250cm9sKTsKLQkJaWYgKCFyZXN0b3JlKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSkgewotCQkJCXJlc3RvcmUgPSB3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoZWRpdENvbnRyb2wpOwotCQkJfQotCQl9Ci0JCWlmIChyZXN0b3JlKSB7Ci0JCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKChUZXh0KSBlZGl0Q29udHJvbCk7Ci0JCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLQkJCX0gZWxzZSBpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlZGl0Q29udHJvbDsKLQkJCQlyaWNoVGV4dC5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5yZW1vdmUoZWRpdENvbnRyb2wpOwotCQl9Ci0JCXJldHVybiByZXN0b3JlOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBMaXN0ZW5lciAKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzCi0JCQlvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyIHsKLQotCQlwcml2YXRlIEVPYmplY3QgZWxlbWVudDsKLQotCQlwcml2YXRlIGJvb2xlYW4gY2hlY2tDb250YWluZXJSZXNvdXJjZTsKLQotCQlwcml2YXRlIGJvb2xlYW4gZGlzYWJsZWQgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0JCXB1YmxpYyBNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tDb250YWluZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQljaGVja0NvbnRhaW5lclJlc291cmNlID0gY2hlY2tDb250YWluZXI7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlc3RvcmVUZXh0KE9iamVjdCBjb250cm9sLCBTdHJpbmcgdHh0KSB7Ci0JCQlib29sZWFuIG9sZCA9IGRpc2FibGVkOwotCQkJdHJ5IHsKLQkJCQlkaXNhYmxlZCA9IHRydWU7Ci0JCQkJT2JqZWN0IGVkaXRDb250cm9sID0gY29udHJvbDsKLQkJCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBNZXRob2RSaWNoVGV4dEVkaXRvcikgewotCQkJCQllZGl0Q29udHJvbCA9ICgoTWV0aG9kUmljaFRleHRFZGl0b3IpIGNvbnRyb2wpCi0JCQkJCQkJLmdldFJpY2hUZXh0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCVRleHQgdGV4dCA9ICgoVGV4dCkgZWRpdENvbnRyb2wpOwotCQkJCQl0ZXh0LnNldFRleHQodHh0KTsKLQkJCQl9IGVsc2UgaWYgKGVkaXRDb250cm9sIGluc3RhbmNlb2YgSU1ldGhvZFJpY2hUZXh0KSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGVkaXRDb250cm9sOwotCQkJCQlyaWNoVGV4dC5zZXRUZXh0KHR4dCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlkaXNhYmxlZCA9IG9sZDsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBjaGVja0VkaXQoRU9iamVjdCBlbGVtZW50LCBPYmplY3QgY29udHJvbCwKLQkJCQlib29sZWFuIGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpIHsKLQkJCS8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgd2lkZ2V0IHNvIG11c3RSZXN0b3JlVmFsdWUoKSBjYW4KLQkJCS8vIHVzZSBpdCB0byBjaGVjawotCQkJLy8gd2hldGhlciBhIGZvY3VzIGxvc3QgZXZlbnQgaXMgdHJpZ2dlcmVkIGR1cmluZyBhIGNoZWNrRWRpdC4KLQkJCS8vIG11c3RSZXN0b3JlVmFsdWUoKSB0aGVuCi0JCQkvLyByZXR1cm5zIHRydWUgc28gZm9jdXNMb3N0KCkgd2lsbCBub3QgdHJ5IHRvIG1ha2UgY2hhbmdlIHRvIHRoZQotCQkJLy8gdmFsdWUgYm91bmQgdG8gdGhlIHdpZGdldAotCQkJLy8KLQkJCXdpZGdldFRvQ2hlY2sgPSBjb250cm9sOwotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogZW50ZXIsIGNvbnRyb2w9IiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlzeW5jaHJvbml6ZWQgKHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSkgewotCQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQoZWxlbWVudCwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCi0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBJUmljaFRleHQpIHsKLQkJCQkJCQkoKElSaWNoVGV4dCkgY29udHJvbCkucmVzdG9yZVRleHQoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKGNvbnRyb2wgPT0gY3VycmVudEZlYXR1cmVFZGl0b3IpIHsKLQkJCQkJCQkJcmVzdG9yZVRleHQoY29udHJvbCwgKFN0cmluZykgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGN1cnJlbnRFZGl0ZWRGZWF0dXJlKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIHdpZGdldHMgd2hvc2UKLQkJCQkJCQkJLy8gdmFsdWUgbmVlZHMKLQkJCQkJCQkJLy8gdG8gYmUgcmVzdG9yZWQgdG8gdGhlIG9yaWdpbmFsIG9uZS4uCi0JCQkJCQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5hZGQoY29udHJvbCk7Ci0JCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IGFkZGVkIHdpZGdldCB0byB3aWRnZXRzVG9SZXN0b3JlVmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpIHsKLQkJCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJCQkJCSYmIGVsZW1lbnQuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpICE9IGVsZW1lbnQKLQkJCQkJCQkJCQkuZVJlc291cmNlKCkpIHsKLQkJCQkJCQlzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LmVDb250YWluZXIoKSwKLQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJLy8gLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIHdpZGdldHMKLQkJCQkJCQkJLy8gd2hvc2UgdmFsdWUKLQkJCQkJCQkJLy8gLy8gbmVlZHMgdG8gYmUgcmVzdG9yZWQgdG8gdGhlIG9yaWdpbmFsIG9uZS4KLQkJCQkJCQkJLy8gaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkJCQkJLy8gLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuY2hlY2tFZGl0OgotCQkJCQkJCQkvLyBhZGRlZCB3aWRnZXQgdG8gd2lkZ2V0c1RvUmVzdG9yZVZhbHVlIik7Ci0JCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJLy8gfQotCQkJCQkJCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIElSaWNoVGV4dCkgewotCQkJCQkJCQkJKChJUmljaFRleHQpIGNvbnRyb2wpLnJlc3RvcmVUZXh0KCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAoY29udHJvbCA9PSBjdXJyZW50RmVhdHVyZUVkaXRvcikgewotCQkJCQkJCQkJCXJlc3RvcmVUZXh0KGNvbnRyb2wsIChTdHJpbmcpIGVsZW1lbnQKLQkJCQkJCQkJCQkJCS5lR2V0KGN1cnJlbnRFZGl0ZWRGZWF0dXJlKSk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5hZGQoY29udHJvbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gY2xlYXIgdGhlIHJlZmVyZW5jZSB3aGVuIHRoZSBjaGVjayBpcyBkb25lCi0JCQkJLy8KLQkJCQl3aWRnZXRUb0NoZWNrID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogZW50ZXIsIGRpc2FibGVkPSIgKyBkaXNhYmxlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICghZGlzYWJsZWQgJiYgZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGUud2lkZ2V0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCU9iamVjdCB3aWRnZXQgPSBlLndpZGdldDsKLQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQnJvd3NlcikgewotCQkJCQl3aWRnZXQgPSAoKEJyb3dzZXIpIHdpZGdldCkKLQkJCQkJCQkuZ2V0RGF0YShJTWV0aG9kUmljaFRleHQuUFJPUEVSVFlfTkFNRSk7Ci0JCQkJCWlmICh3aWRnZXQgPT0gbnVsbCkgewotCQkJCQkJd2lkZ2V0ID0gZS53aWRnZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiB3aWRnZXQ9IiArIHdpZGdldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKHdpZGdldCkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoIWNoZWNrRWRpdChlbGVtZW50LCB3aWRnZXQsIGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBjaGVja0VkaXQgZmFpbGVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSB3aWRnZXQ7Ci0JCQkJCXNldE1vZGlmaWVkUmljaFRleHQocmljaFRleHQpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogYWRkaW5nIHRvIG1vZGlmaWVkUmljaFRleHRzIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBtYXJraW5nIGVkaXRvciBhcyBkaXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXNldERpcnR5KCk7Ci0JCQl9Ci0KLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHVuZGVybHlpbmcgbW9kZWwgZWxlbWVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50Ci0JCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGRpc2FibGUgZmxhZy4KLQkJICogCi0JCSAqIEBwYXJhbSBkaXNhYmxlZAotCQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCBpZ25vcmUgdGhlIG1vZGlmeSBldmVudHMuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJCXRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gbmV3IGluc3RhbmNlIG9mIE1vZGlmeUxpc3RlbmVyIHRoYXQgc3VwcG9ydHMgdGVhbSBhbmQgQ00KLQkgKiBpbnRlZ3JhdGlvbiBBbnkgY29udHJvbCBpbiB0aGUgZWRpdG9yLCBpZiBpdCBuZWVkcyBhIE1vZGlmeUxpc3RlbmVyLCBtdXN0Ci0JICogdXNlIG9uZSBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1vZGlmeUxpc3RlbmVyIGNyZWF0ZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZU9iaikgewotCQlyZXR1cm4gY3JlYXRlTW9kaWZ5TGlzdGVuZXIoZU9iaiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gbmV3IGluc3RhbmNlIG9mIE1vZGlmeUxpc3RlbmVyIHRoYXQgc3VwcG9ydHMgdGVhbSBhbmQgQ00KLQkgKiBpbnRlZ3JhdGlvbiBBbnkgY29udHJvbCBpbiB0aGUgZWRpdG9yLCBpZiBpdCBuZWVkcyBhIE1vZGlmeUxpc3RlbmVyLCBtdXN0Ci0JICogdXNlIG9uZSBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gY2hlY2tDb250YWluZXIKLQkgKiAgICAgICAgICAgIGlmIHRydWUgd2lsbCBjaGVjayB0aGUgY29udGFpbmVyIG9mIHRoZSBnaXZlbiBvYmplY3QgZm9yCi0JICogICAgICAgICAgICBlZGl0YWJsZSBhcyB3ZWxsIHdoZW4gY2hlY2tpbmcgdGhlIGdpdmVuIG9iamVjdCBmb3IgZWRpdGFibGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlNb2RpZnkgTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqLAotCQkJYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKGVPYmosIGNoZWNrQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgY29udHJvbCB0byBiZSB0aGUgY3VycmVudCBlZGl0b3Igb2YgdGhlIHNwZWNpZmllZAotCSAqIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKE9iamVjdCBjb250cm9sLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJY3VycmVudEZlYXR1cmVFZGl0b3IgPSBjb250cm9sOwotCQljdXJyZW50RWRpdGVkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW9uaXRvckNoYW5nZSgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnJlZnJlc2hQcm92aWRlcnMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oImV4dGVuc2lvbjogVUlEPSIgKyBleHRlbnNpb24uZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIiwgIiArIGV4dGVuc2lvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+IGdldFJlc291cmNlSW5mb01hcCgpIHsKLQkJaWYocmVzb3VyY2VJbmZvTWFwID09IG51bGwpIHsKLQkJCXJlc291cmNlSW5mb01hcCA9IG5ldyBIYXNoTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlSW5mb01hcDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgcmVzb3VyY2UgdG8gYWRqdXN0IGxvY2F0aW9uCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlSW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VJbmZvTWFwKCkuZ2V0KHJlc291cmNlKTsKLQkJaWYoaW5mbyA9PSBudWxsKSB7Ci0JCQlpbmZvID0gbmV3IFJlc291cmNlSW5mbyhyZXNvdXJjZSk7Ci0JCQlnZXRSZXNvdXJjZUluZm9NYXAoKS5wdXQocmVzb3VyY2UsIGluZm8pOwotCQl9Ci0JCWluZm8uYWRqdXN0TG9jYXRpb24gPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFVzZWRGZWF0dXJlcygpIHsKLQkJcmV0dXJuIGVsZW1lbnRPYmouZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgcmVzb3VyY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyB1c2VkIGJ5IHRoaXMgZWRpdG9ycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCWxpc3Qgb2YgdXNlZCByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VXNlZFJlc291cmNlcygpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudE9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCUxpc3QgYWxsRmVhdHVyZXMgPSBnZXRVc2VkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IGFsbEZlYXR1cmVzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbEZlYXR1cmVzCi0JCQkJCS5nZXQoaSk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGVsZW1lbnRPYmouZUdldChmZWF0dXJlKTsKLQkJCQlmb3IgKGludCBqID0gdmFsdWVzLnNpemUoKSAtIDE7IGogPiAtMTsgai0tKSB7Ci0JCQkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLmdldChqKTsKLQkJCQkJaWYgKHZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlcy5hZGQodmFsdWUuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJJiYgKHJlc291cmNlID0gKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkpICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhc3RVc2VkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldFVSSVRvVXNlZFJlc291cmNlTWFwKCkgewotCQlIYXNoTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IG5ldyBIYXNoTWFwPFVSSSwgUmVzb3VyY2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFVzZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCW1hcC5wdXQocmVzb3VyY2UuZ2V0VVJJKCksIHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCXN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZXRob2QgbGlicmFyeSBvcGVuIGlzIG5vdCBjbG9zZWQuCi0JCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5UHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYgKGNoZWNrRmlsZUNoYW5nZWRSZXF1aXJlZCkgewotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IGdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCWlmIChjaGVja0ZpbGVDaGFuZ2VkKHVzZWRSZXNvdXJjZXMpKSB7Ci0JCQkJaGFuZGxlRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9GaWxlQ29uZmxpY3RfbGFiZWw7Ci0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fV0FSTl9GaWxlQ29uZmxpY3Q7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVByb21wdCgKLQkJCQl0aXRsZSwgbXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGNoYW5nZWQgcmVzb3VyY2VzIHdoZW4gdGhpcyB2aWV3IGlzIGFjdGl2YXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQlpZiAoKGVsZW1lbnRPYmouZUlzUHJveHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpCi0JCQkJJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgewotCQkJLy8gZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCi0JCQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSBjaGFuZ2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotCQkJLy8gaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCS8vIGlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkvLyB0cnkgewotCQkJLy8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnJlbG9hZChudWxsKTsKLQkJCS8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkvLyB0cnkgewotCQkJLy8gcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgb3Igbm90Ci0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnB1dFZhbGlkKCkgewotCQlpZiAoZWxlbWVudE9iaiAhPSBudWxsICYmIGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoZWxlbWVudE9iaik7Ci0JCQlyZXR1cm4gKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmICFlLmVJc1Byb3h5KCkgJiYgVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeShlKSA9PSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJd2hpbGUgKGdldFBhZ2VDb3VudCgpID4gMCkgewotCQkJcmVtb3ZlUGFnZSgwKTsKLQkJfQotCQlhZGRQYWdlcygpOwotCX0KLQotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgY3JlYXRlSW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KGUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWZyZXNoKGZpbmFsIGJvb2xlYW4gZm9yY2UpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gbGFzdFVzZWRSZXNvdXJjZXM7Ci0JCQkJCQlpZiAoIWZvcmNlICYmICFlbGVtZW50T2JqLmVJc1Byb3h5KCkKLQkJCQkJCQkJJiYgIWNoZWNrUmVsb2FkZWQodXNlZFJlc291cmNlcykpIHsKLQkJCQkJCQkvLyBubyByZXNvdXJjZSByZWxvYWRlZCwgbm8gbmVlZCB0byByZWZyZXNoCi0JCQkJCQkJLy8KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJbW9kaWZpZWRSaWNoVGV4dCA9IG51bGw7Ci0JCQkJCQlpZiAoaXNEaXJ0eSgpKSB7Ci0JCQkJCQkJYWN0aW9uTWdyLnVuZG9BbGwoKTsKLQkJCQkJCQlkaXJ0eSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJaWYgKGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJCQkJCWVsZW1lbnRPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG5hbWVDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQkJCUVPYmplY3QgZSA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKAotCQkJCQkJCQkJZWxlbWVudE9iaik7Ci0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJCQkmJiAhZS5lSXNQcm94eSgpCi0JCQkJCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSkgPT0gTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpIHsKLQkJCQkJCQkJc2V0SW5wdXQoY3JlYXRlSW5wdXQoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBpbnB1dCBlbGVtZW50IGlzIGludmFsaWQsIGNsb3NlIHRoZSBlZGl0b3IKLQkJCQkJCQkJLy8KLQkJCQkJCQkJY2xvc2UoZmFsc2UpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc2V0UmVzb3VyY2VJbmZvcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQkJCXVwZGF0ZVBhZ2VzKCk7Ci0JCQkJCQlpZiAoYWN0aXZlUGFnZUluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJc2V0QWN0aXZlUGFnZShhY3RpdmVQYWdlSW5kZXgpOwotCQkJCQkJfQotCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJcmVmcmVzaChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCS8vIHNhdmUgY2hhbmdlZCByZXNvdXJjZXMgYmVmb3JlIHJlZnJlc2ggc28gYWN0aW9uIG1hbmFnZXIgd2lsbCBub3QgdHJ5Ci0JCS8vIHRvIHNhdmUgdGhlc2UgY2hhbmdlZCByZXNvdXJjZXMKLQkJLy8KLQkJdGhpcy5jaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJcmVmcmVzaChmYWxzZSk7Ci0JCXRoaXMuY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOwkJCi0JfQotCi0KLQkvKioKLQkgKiBQdWJsaWMgbWV0aG9kIHRvIHJlZnJlc2ggZWRpdG9yIHRpdGxlIGltYWdlIG9uIGNlcnRhaW4gYWN0aW9uLgotCSAqIGUuZy4gSWYgbWV0aG9kUGx1Z2luIGlzIGxvY2tlZCwgZWRpdG9yIHRpdGxlIGltYWdlIHNob3VsZCBiZSBncmV5LWVkIG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hUaXRsZUltYWdlKCkgewotCQlpZiAoZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyICE9IG51bGwpCi0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIudXBkYXRlRWRpdG9ySW1hZ2UoZWxlbWVudE9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlZFRpdGxlSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYobWFya2VyLmdldFJlc291cmNlKCkgPT0gZWxlbWVudEZpbGUpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IHZhbCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuR1VJRCk7Ci0JCQkJaWYodmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgdmFsOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCWlmKGUgIT0gZWxlbWVudE9iaikgewotCQkJCQkJLy8gd3JvbmcgZWxlbWVudCBpcyBvcGVuZWQgYmVjYXVzZSBlbGVtZW50IGZyb20gdGhlCi0JCQkJCQkvLyBtYXJrZXIgaXMgbm90IHRoZSB0b3AgZWxlbWVudCBpbiBpdHMgcmVzb3VyY2UKLQkJCQkJCS8vIGNsb3NlIHRoaXMgZWRpdG9yIGFuZCBvcGVuIHRoZSByaWdodCBvbmUKLQkJCQkJCS8vCi0JCQkJCQljbG9zZShmYWxzZSk7Ci0JCQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKS5vcGVuRWRpdG9yKGUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0KLQkJCX0KLQkJfQotCQkKLQkJLy8gb3BlbiBkZXNjcmlwdGlvbiBwYWdlCi0JCXNldEFjdGl2ZVBhZ2UoMCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIGRpc3Bvc2VkOwotCX0KLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTUyZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuSU1ldGhvZEVsZW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0KLS8qKgotICogQW4gZWRpdG9yIGlucHV0IGZvciBtZXRob2QgZWxlbWVudCBlZGl0b3IKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQsIElNZXRob2RFbGVtZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCi0JLy8gdGhlIGN1cnJlbnQgb2JqZWN0IGJlaW5nIGVkaXRlZCBieSB0aGUgUlRFCi0JcHJpdmF0ZSBFT2JqZWN0IGZNb2RhbE9iamVjdDsKLQotCS8vIHRoZSBjdXJyZW50IGZlYXR1cmUgYmVpbmcgZWRpdGVkIGJ5IHRoZSBSVEUKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmTW9kYWxPYmplY3RGZWF0dXJlOwotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJbWV0aG9kRWxlbWVudCA9IGU7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIE5hbWUgb2YgbWV0aG9kIGVsZW1lbnQgKyAiLiIgKyBuYW1lIG9mIGZlYXR1cmUgYmVpbmcgZWRpdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGdldE5hbWUoKTsKLQkJaWYgKGZNb2RhbE9iamVjdEZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmVzdWx0ICs9ICIuIjsJLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ICs9IGZNb2RhbE9iamVjdEZlYXR1cmUuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChnZXRDbGFzcygpLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQgPT0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG9iaikuZ2V0TWV0aG9kRWxlbWVudCgpICYmCi0JCQlmTW9kYWxPYmplY3QgPT0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG9iaikuZ2V0TW9kYWxPYmplY3QoKSAmJgotCQkJZk1vZGFsT2JqZWN0RmVhdHVyZSA9PSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgb2JqKS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBtZXRob2RFbGVtZW50Lmhhc2hDb2RlKCk7Ci0JCWlmIChmTW9kYWxPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzdWx0IF49IGZNb2RhbE9iamVjdC5oYXNoQ29kZSgpOwotCQl9Ci0JCWlmIChmTW9kYWxPYmplY3RGZWF0dXJlICE9IG51bGwpIHsKLQkJCXJlc3VsdCBePSBmTW9kYWxPYmplY3RGZWF0dXJlLmhhc2hDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIGZNb2RhbE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG9iamVjdCkgewotCQlmTW9kYWxPYmplY3QgPSBvYmplY3Q7Ci0JfQotCi0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNb2RhbE9iamVjdEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmTW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlmTW9kYWxPYmplY3RGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNWI4YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgZm9yIE1ldGhvZEVsZW1lbnRFZGl0b3IKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCS8vIGluc3BlY3QgaW5wdXQKLQkJTWV0aG9kRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KGlucHV0KTsKLQkJaWYgKGlucHV0RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkvLyBubyBNZXRob2RFbGVtZW50IGluIGluY29taW5nIGlucHV0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0gICAgICAgIElFZGl0b3JJbnB1dCBleGlzdGluZ0VkaXRvcklucHV0OwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpKSB7Ci0gICAgICAgIAkvLyBleGlzdGluZyBlZGl0b3IgaXMgbm90IGEgTWV0aG9kRWxlbWVudEVkaXRvcgotICAgICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4aXN0aW5nRWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXRob2RFbGVtZW50IGV4aXN0aW5nRWRpdG9ySW5wdXRFbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dChleGlzdGluZ0VkaXRvcklucHV0KTsKLQkJaWYgKGV4aXN0aW5nRWRpdG9ySW5wdXRFbGVtZW50ID09IG51bGwpIHsKLQkJCS8vIG5vIE1ldGhvZEVsZW1lbnQgaW4gZXhpc3RpbmcgZWRpdG9yCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIGlmIChleGlzdGluZ0VkaXRvcklucHV0RWxlbWVudC5lcXVhbHMoaW5wdXRFbGVtZW50KSkgewotICAgICAgICAJLy8gZWRpdG9yIGlzIGVkaXRpbmcgdGhlIE1ldGhvZEVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGlucHV0Ci0gICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJTWV0aG9kRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCS8vIHByb2JhYmx5IG9wZW5lZCBmcm9tIFByb2JsZW1zIFZpZXcKLQkJCWlucHV0RWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KCgoRmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRGaWxlKCksCi0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuCi0JCQkJCWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJfQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCWlucHV0RWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGlucHV0RWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kTGlicmFyeUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZExpYnJhcnlFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1ZDg0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kTGlicmFyeUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZUlPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIG1ldGhvZCBsaWJyYXJ5IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUVkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3Ijc2V0UGFydE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKCkgewotCQlTdHJpbmcgcGFydE5hbWUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOyAKLQkJaWYgKGVsZW1lbnRPYmouZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXBhcnROYW1lICs9IGVsZW1lbnRPYmouZ2V0TmFtZSgpOwotCQkJOwotCQl9Ci0JCXNldFBhcnROYW1lKHBhcnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCWFkZFBhZ2UobmV3IE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlKHRoaXMpKTsKLQkJCWNyZWF0ZVByZXZpZXdQYWdlKCk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIENsb3NlIGFsbCB0aGUgZWRpdG9ycy4KLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCi0JCS8vIENsZWFyIHRoZSBMaWJyYXJ5IFZpZXcuCi0JCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRJbnB1dEZvclZpZXdlcihudWxsKTsKLQotCQl0cnkgewotCQkJLy8gQ2xvc2UgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IKLQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnksIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCi0JCQl0cnkgewotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU7IAotCQkJCVN0cmluZyBlcnJEZXRhaWxzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZXguZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQkJZXJyRGV0YWlscyA9IGV4LmdldE1lc3NhZ2UoKTsgCi0JCQkJfQotCQkJCWlmIChleCBpbnN0YW5jZW9mIE11bHRpRmlsZUlPRXhjZXB0aW9uKSB7Ci0JCQkJCU9iamVjdCB0cm91YmxlT2JqID0gKChNdWx0aUZpbGVJT0V4Y2VwdGlvbikgZXgpCi0JCQkJCQkJLmdldFRyb3VibGVPYmplY3QoKTsKLQkJCQkJaWYgKHRyb3VibGVPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQllcnJEZXRhaWxzID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0ICsgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UGF0aCgoTWV0aG9kRWxlbWVudCkgdHJvdWJsZU9iaik7IAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU7IAotCQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBlcnJNc2csIGVyckRldGFpbHMpOyAKLQkJCX0gZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJcmV0dXJuIG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSA6IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmNzQzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuTWV0aG9kUmljaFRleHRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUmljaFRleHRDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udHJvbERlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBIE1ldGhvZCBFZGl0b3IgUmljaCBUZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dCBleHRlbmRzIFJpY2hUZXh0IGltcGxlbWVudHMgSU1ldGhvZFJpY2hUZXh0IHsKLQotCS8vIFRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQkKLQkvLyB0aGUgTWV0aG9kRWxlbWVudCdzIENvbnRlbnREZXNjcmlwdGlvbgotCXByaXZhdGUgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbjsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBFT2JqZWN0IG1vZGFsT2JqZWN0OwotCi0JLy8gVGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZTsKLQotCS8vIFRoZSByZXNvdXJjZSBiZWluZyBlZGl0ZWQgICAgICAgCi0JcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlOwotCQotCS8vIHRoZSBkZWNvcmF0ZWRGaWVsZCBsYWJlbAotCXByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbERlY29yYXRpb24gY29udHJvbERlY29yYXRpb247Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEltYWdlIGVycm9yRmllbGREZWNvcmF0aW9uSW1hZ2UgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19FUlJPUikuZ2V0SW1hZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JLy8gRmllbGQgbmFtZSBiZWluZyBlZGl0ZWQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGaWVsZCBuYW1lIGJlaW5nIGVkaXRlZCB3aXRoIHRoZSB0cmFpbGluZyA6IHJlbW92ZWQgICAgIAotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lVHJpbTsKLQkKLQkvLyBtYXJrZXIgaGVscGVyCi0JcHJvdGVjdGVkIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIG1hcmtlckhlbHBlcjsKLQkKLS8vCS8vIG1hcmtlciBhdHRyaWJ1dGUKLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBNRVRIT0RfRklFTEROQU1FID0gIk1ldGhvZEZpZWxkTmFtZSI7Ci0KLS8vCS8vIG1hcmtlciBJRAotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgZWRpdG9yLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMuCi0JICovCi0JcHVibGljIE1ldGhvZFJpY2hUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgY29udGV4dAotCSAqLwotCXB1YmxpYyBNZXRob2RSaWNoVGV4dChNZXRob2RSaWNoVGV4dENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0LmdldFBhcmVudCgpLCBjb250ZXh0LmdldFN0eWxlKCksIGNvbnRleHQuZ2V0QmFzZVBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcHJlc2VudGF0aW9uIG5hbWVzIG9mIGFsbCBlbGVtZW50IGxpbmtzLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBSaWNoIHRleHQgZW5jb2RlZCBpbiBIVE1MIGZvcm1hdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpZHlUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCS8qCi0JCSAqICB0aGlzIHdpbGwgZG8gdGhlIGZvbGxvd2luZyB0byB0aGUgSFRNTDoKLQkJICogIDEuICB1cGRhdGUgRWxlbWVudCBMaW5rcwotCQkgKiAgMi4gIGNoYW5nZSA8QSAuLj4gdG8gPGEgLi4+Ci0JCSAqICAzLiAgY2hhbmdlIDwvQT4gdG8gPC9hPgotCQkgKiAgNC4gIGFkZCBkb3VibGUtcXVvdGVzICgiKSBhcm91bmQgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZwotCQkgKi8KLQkJCi0JCXJldHVybiBSZXNvdXJjZUhlbHBlci52YWxpZGF0ZVJpY2hUZXh0Q29udGVudChtZXRob2RFbGVtZW50LCB0ZXh0LAotCQkJCW5ldyBSaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50OwotCQlpZiAodGhpcy5tZXRob2RFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJdGhpcy5tZXRob2RFbGVtZW50ID0gKChQcm9jZXNzQ29tcG9uZW50KSB0aGlzLm1ldGhvZEVsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJfQotCQlpZiAodGhpcy5tZXRob2RFbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7IAotCQkJdGhpcy5jb250ZW50RGVzY3JpcHRpb24gPSAoKERlc2NyaWJhYmxlRWxlbWVudCl0aGlzLm1ldGhvZEVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldE1vZGFsT2JqZWN0KCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0KEVPYmplY3QgbW9kYWxPYmplY3QpIHsKLQkJdGhpcy5tb2RhbE9iamVjdCA9IG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNb2RhbE9iamVjdEZlYXR1cmUoKSB7Ci0JCXJldHVybiBtb2RhbE9iamVjdEZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3RGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUpIHsKLQkJdGhpcy5tb2RhbE9iamVjdEZlYXR1cmUgPSBtb2RhbE9iamVjdEZlYXR1cmU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiBmaWVsZE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVjb3JhdGVkRmllbGRMYWJlbChMYWJlbCBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZGF0YSA9IGxhYmVsLmdldERhdGEoQmFzZUZvcm1QYWdlLkxBQkVMX0RFQ09SQVRPUl9LRVkpOwotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBDb250cm9sRGVjb3JhdGlvbikgewotCQkJCWNvbnRyb2xEZWNvcmF0aW9uID0gKENvbnRyb2xEZWNvcmF0aW9uKWRhdGE7Ci0JCQkJY29udHJvbERlY29yYXRpb24uc2V0SW1hZ2UoZXJyb3JGaWVsZERlY29yYXRpb25JbWFnZSk7Ci0JCQkJY29udHJvbERlY29yYXRpb24uaGlkZSgpOwotCQkJfQotCQkJdXBkYXRlRmllbGROYW1lRnJvbUxhYmVsKGxhYmVsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVGaWVsZE5hbWVGcm9tTGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCVN0cmluZyBmaWVsZE5hbWUgPSBsYWJlbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIXRoaXMuZmllbGROYW1lLmVxdWFscyhmaWVsZE5hbWUpKSB7Ci0JCQkJdGhpcy5maWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0JCQkJaW50IGNvbG9uSW5kZXggPSBmaWVsZE5hbWUuaW5kZXhPZignOicpOwotCQkJCWlmIChjb2xvbkluZGV4ID09IC0xKQotCQkJCQljb2xvbkluZGV4ID0gZmllbGROYW1lLmxlbmd0aCgpOwotCQkJCXRoaXMuZmllbGROYW1lVHJpbSA9IGZpZWxkTmFtZS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCkudHJpbSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChNZXRob2RFbGVtZW50IGVsZW1lbnQsIExhYmVsIGxhYmVsKSB7Ci0JCXNldE1ldGhvZEVsZW1lbnQoZWxlbWVudCk7Ci0JCXNldERlY29yYXRlZEZpZWxkTGFiZWwobGFiZWwpOwotCQltYXJrZXJIZWxwZXIgPSBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5JTlNUQU5DRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRIVE1MKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBmb3JtYXR0ZWRUZXh0OwotCQl0cnkgewotCQkJLy8gY2xlYXIgbWFya2VycyBmaXJzdAotCQkJY2xlYXJNYXJrZXJzKCk7Ci0JCQkvLyBDYWxsIEpUaWR5IHRvIGZvcm1hdCB0aGUgc291cmNlIHRvIFhIVE1MLgotCQkJZm9ybWF0dGVkVGV4dCA9IGh0bWxGb3JtYXR0ZXIuZm9ybWF0SFRNTCh0ZXh0KTsKLQkJCWlmIChodG1sRm9ybWF0dGVyLmdldExhc3RFcnJvclN0cigpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSBodG1sRm9ybWF0dGVyLmdldExhc3RFcnJvclN0cigpOwotCQkJCS8vIGNyZWF0ZSBtYXJrZXJzCi0JCQkJdHJ5IHsKLQkJCQkJY3JlYXRlTWFya2VyKGVycm9yU3RyaW5nKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNleCkgewotCQkJCQlsb2dnZXIubG9nRXJyb3IoY2V4KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZm9ybWF0dGVkVGV4dDsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsZWFyTWFya2VycygpIHsKLQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoY29udGVudERlc2NyaXB0aW9uLCBmaWVsZE5hbWVUcmltKTsKLQkJc2V0RXJyb3JEZXNjcmlwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJaGlkZUVycm9yRGVjb3JhdGlvbigpOwotCQlyZWZyZXNoRGVjb3JhdG9ycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvckRlc2NyaXB0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChjb250cm9sRGVjb3JhdGlvbiAhPSBudWxsKSB7Ci0JCQljb250cm9sRGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvblRleHQodGV4dCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaERlY29yYXRvcnMoKSB7Ci0JCS8vIHJlZnJlc2gKLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS51cGRhdGUoTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IuREVDT1JBVE9SX0lEKTsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBUT0RPOgotCSAqIGhhZCB0byB1bmRvIGNoYW5nZSBpbiBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIHRvIHNldCBwcmVzZW50YXRpb24gb24gYW55IG5ldyBvYmoKLQkgKiBzbyBlZGl0b3Igd2lsbCBuZWVkIHRvIGFzc2lnbiBwcmVzZW50YXRpb24gd2hlbiBmaWVsZCBpcyBlZGl0ZWQgc28gdGhhdCB0aGUgbWFya2VyCi0JICogY2FuIGJlIGFkZGVkIHRvIHRoZSBwcmVzZW50YXRpb24ncyByZXNvdXJjZQotCSAqLwotCQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hcmtlcihTdHJpbmcgZnVsbEVyck1zZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29udGVudERlc2NyaXB0aW9uLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJTWF0Y2hlciBtID0gSFRNTEZvcm1hdHRlci5qVGlkeUVycm9yUGFyc2VyLm1hdGNoZXIoZnVsbEVyck1zZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCWlmIChtLmZpbmQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJU3RyaW5nIGxvY2F0aW9uID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgZXJyb3JNc2cgPSBtLmdyb3VwKDQpOwotCQkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljcyA9IAotCQkJICAgICAgICAgIG5ldyBCYXNpY0RpYWdub3N0aWMKLQkJCSAgICAgICAgICAgIChIVE1MRm9ybWF0dGVyLkRJQUdOT1NUSUNfU09VUkNFLAotCQkJICAgICAgICAgICAgIDAsICIiLCAvLyROT04tTkxTLTEkCi0JCQkgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgY29udGVudERlc2NyaXB0aW9uLCBmaWVsZE5hbWVUcmltIH0pOwotCQotCQkJCWRpYWdub3N0aWNzLmFkZCggCi0JCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMoRGlhZ25vc3RpYy5FUlJPUiwKLQkJCQkJCWxvY2F0aW9uLCAwLCBlcnJvck1zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IGNvbnRlbnREZXNjcmlwdGlvbiwgZmllbGROYW1lVHJpbSB9KSk7Ci0JCi0JCSAgICAgICAgbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpY3MpOwotCQkgICAgICAgIHNldEVycm9yRGVzY3JpcHRpb24oZXJyb3JNc2cpOwotCQkgICAgICAgIHNob3dFcnJvckRlY29yYXRpb24oKTsKLQkJCQlyZWZyZXNoRGVjb3JhdG9ycygpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQljbGVhck1hcmtlcnMoKTsKLQkJcmVmcmVzaERlY29yYXRvcnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yRGVjb3JhdGlvbigpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xEZWNvcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgCWNvbnRyb2xEZWNvcmF0aW9uLnNob3coKTsKLSAgICAgICAgfQotCX0KLQotCXB1YmxpYyB2b2lkIGhpZGVFcnJvckRlY29yYXRpb24oKSB7Ci0gICAgICAgIGlmIChjb250cm9sRGVjb3JhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgIAljb250cm9sRGVjb3JhdGlvbi5oaWRlKCk7Ci0gICAgICAgIH0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQkvLyBjaGVjayBpZiBsYWJlbCB0ZXh0IHdhcyBjaGFuZ2VkICh0aGlzIGhhcHBlbnMgd2hlbiBSVEUgaXMgZXhwYW5kZWQpCi0JCS8vIHRoaXMgaXMgY2FsbGVkIHdoZW4gUlRFIGlzIHRvZ2dsZWQgaW4gZWRpdG9yIC0gcmVhZCBuZXcgZmllbGROYW1lCi0JCWlmICh1cGRhdGVGaWVsZE5hbWVGcm9tTGFiZWwobGFiZWwpKQotCQkJaGlkZUVycm9yRGVjb3JhdGlvbigpOwotCQlzdXBlci5zZXRUZXh0KHRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjY3NzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kQWRkSW1hZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEFkZExpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RGb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHRUb29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRPcmRlcmVkTGlzdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRUYWJsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRVbm9yZGVyZWRMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJvbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ2xlYXJDb250ZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnROYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnRTaXplQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnRTdHlsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JbmRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSXRhbGljQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLk91dGRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuU3Vic2NyaXB0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlN1cGVyc2NyaXB0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlRpZHlBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5VbmRlcmxpbmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLQotLyoqCi0gKiBBIFJpY2ggVGV4dCBlZGl0b3Igd2l0aCBhZGRlZCBleHRlbnNpb25zIHRvIHN1cHBvcnQgTWV0aG9kIGJyb3dzaW5nIGFuZAotICogYXV0aG9yaW5nLiBJbmNsdWRlcyBhIHRvb2wgYmFyIGFuZCBhbiBpbnRlZ3JhdGVkIEhUTUwgc291cmNlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFJpY2hUZXh0RWRpdG9yIGV4dGVuZHMgUmljaFRleHRFZGl0b3IgaW1wbGVtZW50cwotCQlJTWV0aG9kUmljaFRleHRFZGl0b3IgewotCi0JLy8gVGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JLy8gVGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIEVPYmplY3QgbW9kYWxPYmplY3Q7Ci0KLQkvLyBUaGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIGVkaXRvci4KLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGhyZWZzLgotCSAqLwotCXB1YmxpYyBNZXRob2RSaWNoVGV4dEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgTGFiZWwgbGFiZWwsIElFZGl0b3JTaXRlIGVkaXRvclNpdGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSwgZWRpdG9yU2l0ZSwgYmFzZVBhdGgpOwotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50OwotCQlpbml0KG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB1bmRlcmx5aW5nIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MuCi0JICovCi0JcHJvdGVjdGVkIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVNZXRob2RSaWNoVGV4dChwYXJlbnQsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIFJpY2ggVGV4dCBlZGl0b3IgdG9vbCBiYXIgd2l0aCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIFRoZSBSaWNoIHRleHQgZWRpdG9yIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcikgewotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFN0eWxlQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEZvbnROYW1lQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEZvbnRTaXplQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsJCQotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ3V0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IENvcHlBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgUGFzdGVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ2xlYXJDb250ZW50QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEJvbGRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSXRhbGljQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFVuZGVybGluZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBTdWJzY3JpcHRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgU3VwZXJzY3JpcHRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgVGlkeUFjdGlvbkdyb3VwKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZE9yZGVyZWRMaXN0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZFVub3JkZXJlZExpc3RBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgT3V0ZGVudEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBJbmRlbnRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRmluZFJlcGxhY2VBY3Rpb24odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQkJCXJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuZXhlY3V0ZShyaWNoVGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgTWV0aG9kQWRkTGlua0FjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBNZXRob2RBZGRJbWFnZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRUYWJsZUFjdGlvbih0aGlzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldE1vZGFsT2JqZWN0KCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0KEVPYmplY3QgbW9kYWxPYmplY3QpIHsKLQkJdGhpcy5tb2RhbE9iamVjdCA9IG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNb2RhbE9iamVjdEZlYXR1cmUoKSB7Ci0JCXJldHVybiBtb2RhbE9iamVjdEZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3RGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUpIHsKLQkJdGhpcy5tb2RhbE9iamVjdEZlYXR1cmUgPSBtb2RhbE9iamVjdEZlYXR1cmU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChNZXRob2RFbGVtZW50IGVsZW1lbnQsIExhYmVsIGxhYmVsKSB7Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkKLQkJCSgoSU1ldGhvZFJpY2hUZXh0KXJpY2hUZXh0KS5pbml0KG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9QcmV2aWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWVmNTdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9QcmV2aWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkVsZW1lbnRIVE1MVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogVGhlIFByZXZpZXcgcGFnZSBpbiB0aGUgTWV0aG9kIEVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1BhZ2UgewotCi0JcHJpdmF0ZSBFbGVtZW50SFRNTFZpZXdlciBwcmV2aWV3ZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBQcmV2aWV3UGFnZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIFVzZSB0aGUgVmlld0Zvcm0gY29udHJvbCB0byBnaXZlIGl0IHRoZSBFY2xpcHNlIFdvcmtiZW5jaCB3aW5kb3cKLQkJLy8gbG9vayAmIGZlZWwuCi0JCVZpZXdGb3JtIHZpZXdGb3JtID0gbmV3IFZpZXdGb3JtKGNvbXBvc2l0ZSwgU1dULkRFRkFVTFQpOwotCQl2aWV3Rm9ybS5tYXJnaW5IZWlnaHQgPSAwOwotCQl2aWV3Rm9ybS5tYXJnaW5XaWR0aCA9IDA7Ci0JCXZpZXdGb3JtLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdmlld0Zvcm0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gU2V0IHRvb2xiYXIKLQkJQ29udHJvbCB0b29sYmFyID0gY3JlYXRlVG9vbGJhcih2aWV3Rm9ybSk7Ci0JCXZpZXdGb3JtLnNldFRvcFJpZ2h0KHRvb2xiYXIpOwotCi0JCS8vIFNldCBjb250ZW50Ci0JCUNvbnRyb2wgY29udGVudCA9IGNyZWF0ZUNvbnRlbnQodmlld0Zvcm0pOwotCQl2aWV3Rm9ybS5zZXRDb250ZW50KGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBwcmV2aWV3IGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVDb250ZW50KFZpZXdGb3JtIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb250ZW50LnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb250ZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXByZXZpZXdlciA9IG5ldyBFbGVtZW50SFRNTFZpZXdlcihjb250ZW50KTsKLQkJcmV0dXJuIChDb250cm9sKSBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBFbGVtZW50Vmlld2VyCi0JICogCi0JICogQHJldHVybgotCSAqIAkJCVZpZXdlcgotCSAqLwotCXB1YmxpYyBFbGVtZW50SFRNTFZpZXdlciBnZXRQcmV2aWV3Vmlld2VyKCkgewotCQlyZXR1cm4gcHJldmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBUb29sYmFyIEl0IGhhcyBHbyBiYWNrLCBHbyBmb3J3YXJkLCBTdG9wIGFuZCByZWZyZXNoIGJ1dHRvbnMKLQkgKiAKLQkgKiBAcGFyYW0gVmlld0Zvcm0KLQkgKiAgICAgICAgICAgIHBhcmVudAotCSAqIEByZXR1cm4gVG9vbGJhcgotCSAqLwotCXByaXZhdGUgVG9vbEJhciBjcmVhdGVUb29sYmFyKFZpZXdGb3JtIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGJyb3dzZXIgbmF2aWdhdGlvbiB0b29sYmFyLgotCQlUb29sQmFyIHRvb2xiYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUKTsKLQotCQkvLyBBZGQgdGhlIEJhY2sgYnV0dG9uLgotCQlUb29sSXRlbSBiYWNrQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJYmFja0J1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfQkFDSyk7Ci0JCWJhY2tCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFja0J1dHRvbl90ZXh0KTsgCi0JCWJhY2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmJhY2soKTsKLQkJCQl9Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIEZvd2FyZCBidXR0b24uCi0JCVRvb2xJdGVtIGZvcndhcmRCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotCQlmb3J3YXJkQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19GT1JXQVJEKTsKLQkJZm9yd2FyZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5mb3J3YXJkQnV0dG9uX3RleHQpOyAKLQkJZm9yd2FyZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gcHJldmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCX0KLQkJCX07Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgU3RvcCBidXR0b24uCi0JCVRvb2xJdGVtIHN0b3BCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotCQlzdG9wQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19TVE9QKTsKLQkJc3RvcEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5zdG9wQnV0dG9uX3RleHQpOyAKLQkJc3RvcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gcHJldmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuc3RvcCgpOwotCQkJCX0KLQkJCX07Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgUmVmcmVzaCBidXR0b24uCi0JCVRvb2xJdGVtIHJlZnJlc2hCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotCQlyZWZyZXNoQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19SRUZSRVNIKTsKLQkJcmVmcmVzaEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoQnV0dG9uX3RleHQpOyAKLQkJcmVmcmVzaEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gQnJvd3NlciBicm93c2VyID0gcHJldmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQkvLyBpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJLy8gYnJvd3Nlci5yZWZyZXNoKCk7Ci0JCQkJLy8gfQotCi0JCQkJcHJldmlld2VyLnJlZnJlc2goKTsKLQkJCX07Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgUHJpbnQgYnV0dG9uLgotCQlUb29sSXRlbSBwcmludEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCXByaW50QnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19QUklOVCk7Ci0JCXByaW50QnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByaW50QnV0dG9uX3RleHQpOyAKLQkJcHJpbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXByZXZpZXdlci5wcmludCgpOwotCQkJfTsKLQkJfSk7Ci0KLQkJcmV0dXJuIHRvb2xiYXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwYzJmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5VmFsaWRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkVQRlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLklNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtRWRpdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklBZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkNvbW1hbmRTdGFja0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5MaWJyYXJ5RVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5JRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEVkaXRvciBmb3IgcHJvY2VzcyBhdXRob3JpbmcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3IgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9yIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSU1lbnVMaXN0ZW5lciwgSVNlbGVjdGlvblByb3ZpZGVyLAotCQlJVmlld2VyUHJvdmlkZXIsIElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIFRoZSBlZGl0b3IgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gUHJvY2Vzc0VkaXRvci5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19FRElUT1JfSUQgPSBHcmFwaGljYWxXb3JrZmxvd0VkaXRvci5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQREVQRU5ERU5DWV9FRElUT1JfSUQgPSBHcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvKiogQ29sdW1uIGRlc2NyaXB0b3IgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX05BTUUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSwgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSwKLQkJCTMsIDIwMCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lEID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lELCBQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lEKSwKLQkJCTAsIDQwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfTk9ORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfUFJFRklYID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYKSwgMCwgODAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfTU9ERUxfSU5GTyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKSwgMCwgMTIwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkUpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19UWVBFID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIFByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSksCi0JCQkwLCA4MCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRURFQ0VTU09SUyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUyksIDIsIDEwMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSVNfUkVQRUFUQUJMRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lTX09OR09JTkcgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORyksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lTX0VWRU5UX0RSSVZFTiA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4sCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19URUFNID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLCBQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TKSwKLQkJCTEsIDEwMCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0VOVFJZX1NUQVRFID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19FWElUX1NUQVRFID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSwgMywgMjAwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19ERUxJVkVSQUJMRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpLCAxLCAxMDAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lTX09QVElPTkFMID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19QTEFOTkVEID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpLCAxLCA2MCwKLQkJCXRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQlNfRk9STV9JRCA9ICJ3YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQV9GT1JNX0lEID0gInRicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQQlNfRk9STV9JRCA9ICJ3cGJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU09MSURBVEVEX0ZPUk1fSUQgPSAiY29uc29saWRhdGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCURpYWdyYW1FZGl0b3JIZWxwZXIgZGlhZ3JhbUVkaXRvckhlbHBlciA9IG51bGw7Ci0KLQkvLyBjaGFuZ2UgdGhlIGRlZmF1bHQgb3JkZXIgYmFzZWQgb24gMTUyODY3IC0gUHVibGlzaCBvcHRpb24gYW5kIHByZWZyZW5jZXMKLQkvKiBXQlM6IFByZXNlbnRhdGlvbiBOYW1lLCBJbmRleCwgUHJlZGVjZXNzb3JzLCBNb2RlbCBJbmZvLCBUeXBlLCBQbGFubmVkLAotCQkJUmVwZWF0YWJsZSwgTXVsdGlwbGUgT2NjdXJyZW5jZXMsIE9uZ29pbmcsIEV2ZW50LWRyaXZlbiwgT3B0aW9uYWwKLQkJVEE6IFByZXNlbnRhdGlvbiBOYW1lLCBNb2RlbCBJbmZvLCBUZWFtLCBUeXBlLCBQbGFubmVkLCBNdWx0aXBsZQotCQkJT2NjdXJyZW5jZXMsIE9wdGlvbmFsCi0JCVdvcmsgUHJvZHVjdCBVc2FnZTogUHJlc2VudGF0aW9uIE5hbWUsIE1vZGVsIEluZm8sIEVudHJ5IFN0YXRlLCBFeGl0IFN0YXRlLCAKLQkJCURlbGl2ZXJhYmxlLCBUeXBlLCBQbGFubmVkLCBNdWx0aXBsZSBPY2N1cnJlbmNlcywgT3B0aW9uYWwKLQkqLwotCS8vIEppbmh1YSBYaSwgMDgvMjEvMjAwNgotCQotCS8vIHRoZSBkZWZhdWx0IGxpc3QgbXVzdCBiZSBhdmFpbGFibGUgaW4gdGhlIGxpYnJhcnkgcGx1Z2luIGFzIHdlbGwuCi0JLy8gZHVwbGljYXRlIGRlZmluaXRpb24gZm9yIG5vdywgd2lsbCBuZWVkIHRvIG1lcmdlIHRvZ2V0aGVyIGxhdGVyCi0JLy8gc2VlIFByZWZlcmVuY2VDb25zdGFudHMub3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uRGVzY3JpcHRvcj4gREVGQVVMVF9UQlNfQ09MVU1OUyA9IEFycmF5cwotCQkJLmFzTGlzdChuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsKLQkJCQkJQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCS8vIENPTF9ERVNDX0lELAotCQkJCQkvL0NPTF9ERVNDX1BSRUZJWCwgCi0JCQkJCUNPTF9ERVNDX01PREVMX0lORk8sIENPTF9ERVNDX1RFQU0sIENPTF9ERVNDX1RZUEUsCi0JCQkJCUNPTF9ERVNDX0lTX1BMQU5ORUQsCi0JCQkJCUNPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgQ09MX0RFU0NfSVNfT1BUSU9OQUwgfSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgREVGQVVMVF9XUEJTX0NPTFVNTlMgPSBBcnJheXMKLQkJCS5hc0xpc3QobmV3IENvbHVtbkRlc2NyaXB0b3JbXSB7Ci0JCQkJCUNPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQkvLyBDT0xfREVTQ19JRCwKLQkJCQkJLy9DT0xfREVTQ19QUkVGSVgsIAotCQkJCQlDT0xfREVTQ19NT0RFTF9JTkZPLCBDT0xfREVTQ19FTlRSWV9TVEFURSwKLQkJCQkJQ09MX0RFU0NfRVhJVF9TVEFURSwgCi0JCQkJCUNPTF9ERVNDX0RFTElWRVJBQkxFLCBDT0xfREVTQ19UWVBFLCAKLQkJCQkJQ09MX0RFU0NfSVNfUExBTk5FRCwgQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBDT0xfREVTQ19JU19PUFRJT05BTCB9KTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDb2x1bW5EZXNjcmlwdG9yPiBERUZBVUxUX1dCU19DT0xVTU5TID0gQXJyYXlzCi0JCQkuYXNMaXN0KG5ldyBDb2x1bW5EZXNjcmlwdG9yW10geyBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJQ09MX0RFU0NfSUQsIAotCQkJCQkvL0NPTF9ERVNDX1BSRUZJWCwgCi0JCQkJCUNPTF9ERVNDX1BSRURFQ0VTU09SUywgQ09MX0RFU0NfTU9ERUxfSU5GTywKLQkJCQkJQ09MX0RFU0NfVFlQRSwgQ09MX0RFU0NfSVNfUExBTk5FRCwgCi0JCQkJCUNPTF9ERVNDX0lTX1JFUEVBVEFCTEUsIENPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgQ09MX0RFU0NfSVNfT05HT0lORywKLQkJCQkJQ09MX0RFU0NfSVNfRVZFTlRfRFJJVkVOLCBDT0xfREVTQ19JU19PUFRJT05BTAotCQkJCQkgfSk7Ci0KLQkgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtbkRlc2NyaXB0b3I+IEFMTF9XQlNfQ09MVU1OUyA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uRGVzY3JpcHRvcj4oCi0JCQlERUZBVUxUX1dCU19DT0xVTU5TKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDb2x1bW5EZXNjcmlwdG9yPiBBTExfVEJTX0NPTFVNTlMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbkRlc2NyaXB0b3I+KAotCQkJREVGQVVMVF9UQlNfQ09MVU1OUyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uRGVzY3JpcHRvcj4gQUxMX1dQQlNfQ09MVU1OUyA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uRGVzY3JpcHRvcj4oCi0JCQlERUZBVUxUX1dQQlNfQ09MVU1OUyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENvbHVtbkRlc2NyaXB0b3I+IGlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2x1bW5EZXNjcmlwdG9yPigpOwotCXN0YXRpYyB7Ci0JCUFMTF9XQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJQUxMX1RCU19DT0xVTU5TLmFkZChDT0xfREVTQ19QUkVGSVgpOwotCQlBTExfV1BCU19DT0xVTU5TLmFkZChDT0xfREVTQ19QUkVGSVgpOwotCQkKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfTkFNRS5pZCwKLQkJCQlDT0xfREVTQ19OQU1FKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSUQuaWQsIENPTF9ERVNDX0lEKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfUFJFRklYLmlkLAotCQkJCUNPTF9ERVNDX1BSRUZJWCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX01PREVMX0lORk8uaWQsCi0JCQkJQ09MX0RFU0NfTU9ERUxfSU5GTyk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1RZUEUuaWQsCi0JCQkJQ09MX0RFU0NfVFlQRSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1BSRURFQ0VTU09SUy5pZCwKLQkJCQlDT0xfREVTQ19QUkVERUNFU1NPUlMpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JU19SRVBFQVRBQkxFLmlkLAotCQkJCUNPTF9ERVNDX0lTX1JFUEVBVEFCTEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JU19PTkdPSU5HLmlkLAotCQkJCUNPTF9ERVNDX0lTX09OR09JTkcpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JU19FVkVOVF9EUklWRU4uaWQsCi0JCQkJQ09MX0RFU0NfSVNfRVZFTlRfRFJJVkVOKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfVEVBTS5pZCwKLQkJCQlDT0xfREVTQ19URUFNKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfRU5UUllfU1RBVEUuaWQsCi0JCQkJQ09MX0RFU0NfRU5UUllfU1RBVEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19FWElUX1NUQVRFLmlkLAotCQkJCUNPTF9ERVNDX0VYSVRfU1RBVEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dCgKLQkJCQlDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRS5pZCwgQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19ERUxJVkVSQUJMRS5pZCwKLQkJCQlDT0xfREVTQ19ERUxJVkVSQUJMRSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lTX09QVElPTkFMLmlkLAotCQkJCUNPTF9ERVNDX0lTX09QVElPTkFMKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfUExBTk5FRC5pZCwKLQkJCQlDT0xfREVTQ19JU19QTEFOTkVEKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoCi0JCQkJQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLmlkLAotCQkJCUNPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyk7Ci0KLQkJQUxMX1dCU19DT0xVTU5TLmFkZChDT0xfREVTQ19OQU1FKTsKLQkJQUxMX1RCU19DT0xVTU5TLmFkZChDT0xfREVTQ19OQU1FKTsKLQkJQUxMX1dQQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGFkZEFkYXB0ZXJGYWN0b3J5TGlzdGVuZXJzID0gZmFsc2U7Ci0KLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlciBleHRlbmRzCi0JCQlFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tYWluCi0JCSAqIEBwYXJhbSB2aWV3ZXIKLQkJICovCi0JCXB1YmxpYyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoRWRpdGluZ0RvbWFpbiBkb21haW4sIFZpZXdlciB2aWV3ZXIpIHsKLQkJCXN1cGVyKGRvbWFpbiwgdmlld2VyKTsKLQkJfQotCi0JCS8qKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIjZ2V0RHJvcFRhcmdldChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQpCi0JCSAqLwotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldERyb3BUYXJnZXQoV2lkZ2V0IGl0ZW0pIHsKLQkJCU9iamVjdCB0YXJnZXQgPSBzdXBlci5nZXREcm9wVGFyZ2V0KGl0ZW0pOwotCQkJaWYgKHRhcmdldCA9PSBudWxsICYmIHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0ID0gc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJCX0KLQkJCXJldHVybiB0YXJnZXQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIjZHJvcChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoY3VycmVudFZpZXdlciBpbnN0YW5jZW9mIElBY3Rpb25UeXBlUHJvdmlkZXIpIHsKLQkJCQkoKElBY3Rpb25UeXBlUHJvdmlkZXIpIGN1cnJlbnRWaWV3ZXIpLnNldElucHV0RGF0YShuZXcgUG9pbnQoCi0JCQkJCQlldmVudC54LCBldmVudC55KSk7Ci0JCQl9Ci0JCQlzdXBlci5kcm9wKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uIHZpZXdTZWxlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudCBzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQ7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3M7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJCVN0cmluZyBuYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0UGFydE5hbWUobmFtZSk7Ci0KLQkJCQlpZiAocGFnZXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBwYWdlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NEZXNjcmlwdGlvbikgewotCQkJCQkJCSgoUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwYWdlKQotCQkJCQkJCQkJLnJlZnJlc2hFbGVtZW50TmFtZShuYW1lKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHByb3BDb250ZW50UHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnOwotCi0JcHJvdGVjdGVkIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJLy8gY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQ6Ci0JCQkvLyAvLyBjbG9zZSBhbGwgb3BlbiBkaWFncmFtIGVkaXRvcnMKLQkJCS8vIC8vCi0JCQkvLyBJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9Ci0JCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJLy8gSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IGVkaXRvclJlZnNbaV0uZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCS8vIGlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxXb3JrZmxvd0VkaXRvcgotCQkJLy8gfHwgZWRpdG9yUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NGb3JtRWRpdG9yKSB7Ci0JCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKGVkaXRvclBhcnQsIHRydWUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihQcm9jZXNzRm9ybUVkaXRvci50aGlzLCB0cnVlKTsKLQkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogewotCQkJCWlmIChjb2xsZWN0aW9uICE9IG51bGwgJiYgY29sbGVjdGlvbi5jb250YWlucyhjdXJyZW50Q29uZmlnKSkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkJCQkuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCQkJCXJlZnJlc2hBbGwoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJCQkJLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCQkvLyBoYW5kbGVkIGJ5IGxpYlN2Y0xpc3RlbmVyCi0JCQkJLy8gY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEOiB7Ci0JCQkJLy8gY29uZmlnQ2hhbmdlZCgpOwotCQkJCS8vIGJyZWFrOwotCQkJCS8vIH0KLQotCQkJfQotCi0JCX0KLQotCX07Ci0KLQlwcm90ZWN0ZWQgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJY29uZmlnQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCX07Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIFdCU1RhYjsKLQotCXByb3RlY3RlZCBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgT0JTVGFiOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBQQlNUYWI7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIHByb2NUYWI7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U+IGV4dGVuc2lvblRhYnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtdIGJzUGFnZXM7Ci0KLQlwcm90ZWN0ZWQgRVBGUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiByZXNvdXJjZXNUb1NhdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gZmlyc3RFeHBhbmRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogYSBsaXN0ZW5lciB0aGF0IGlzIGludGVyZXN0ZWQgaW4gcGFydCBhY3RpdmF0aW9uIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0QWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCQlyZW1vdmVQcm9wZXJ0aWVzRHJvcERvd25NZW51KHBhcnQpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBpZighZmlyc3RFeHBhbmRlZCkgewotCQkJLy8gc3luY2hyb25pemVkKFByb2Nlc3NGb3JtRWRpdG9yLnRoaXMpIHsKLQkJCS8vIGlmKGZpcnN0RXhwYW5kZWQpIHsKLQkJCS8vICgoQWJzdHJhY3RUcmVlVmlld2VyKSBXQlNUYWIuZ2V0Vmlld2VyKCkpLmV4cGFuZEFsbCgpOwotCQkJLy8gKChBYnN0cmFjdFRyZWVWaWV3ZXIpIE9CU1RhYi5nZXRWaWV3ZXIoKSkuZXhwYW5kQWxsKCk7Ci0JCQkvLyAoKEFic3RyYWN0VHJlZVZpZXdlcikgUEJTVGFiLmdldFZpZXdlcigpKS5leHBhbmRBbGwoKTsKLQkJCS8vIGZpcnN0RXhwYW5kZWQgPSB0cnVlOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCQlyZW1vdmVQcm9wZXJ0aWVzRHJvcERvd25NZW51KHBhcnQpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgcHJlZlN0b3JlTGlzdGVuZXI7Ci0KLQkvLyBwcml2YXRlIFByb2Nlc3NDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJvdGVjdGVkIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemluZ1NlbGVjdGlvbjsKLQotCXByb3RlY3RlZCBib29sZWFuIGlucHV0Q2hhbmdlZDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgYWRhcHRlckZhY3RvcnlQcm92aWRlciA9IG5ldyBJQWRhcHRlckZhY3RvcnlQcm92aWRlcigpIHsKLQotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQl9OwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNjcmVhdGVWYWxpZGF0ZVJlc291cmNlQWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCUxpYnJhcnlWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IHN1cGVyLmNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24ucHV0Q29udGV4dERhdGEoTGlicmFyeUVWYWxpZGF0b3IuQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUiwKLQkJCQlhZGFwdGVyRmFjdG9yeVByb3ZpZGVyKTsKLQkJcmV0dXJuIHZhbGlkYXRlQWN0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbnB1dENoYW5nZWQoT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlucHV0Q2hhbmdlZCA9IGZhbHNlOwotCQlpZiAoIShuZXdJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkpCi0JCQlyZXR1cm47Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBuZXdJbnB1dDsKLQotCQlPYmplY3Qgb2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBvYmo7Ci0JCQlzZWxlY3RlZFByb2Nlc3MgPSBnZXRUb3BCcmVha2Rvd25FbGVtZW50KHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlzdXBwcmVzc2lvbiA9IGdldFN1cHByZXNzaW9uKHNlbGVjdGVkUHJvY2Vzcyk7Ci0KLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHBhZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gT2JqZWN0IHBhZ2UgPSBpdGVyLm5leHQoKTsKLQkJCS8vIGlmKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHsKLQkJCS8vICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKXBhZ2UpLnNldFByb2Nlc3MocHJvYyk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCWlmIChXQlNUYWIgIT0gbnVsbCkgewotCQkJCVdCU1RhYi5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggT0JTVGFiICE9IG51bGwgKSB7Ci0JCQkJT0JTVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBQQlNUYWIgIT0gbnVsbCApIHsKLQkJCQlQQlNUYWIuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJfQotCQkJCi0JCQlpZiAoIHByb2NUYWIgIT0gbnVsbCApIHsKLQkJCQlwcm9jVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCX0KLQkJCQotCQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCWZvciAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dFBhZ2UgOiBleHRlbnNpb25UYWJzKSB7Ci0JCQkJCWV4dFBhZ2Uuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyAgZ2V0VG9wQnJlYWtkb3duRWxlbWVudChQcm9jZXNzQ29tcG9uZW50IHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCkgewotCQlyZXR1cm4gKFByb2Nlc3MpIFByb2Nlc3NVdGlsLmdldFRvcEJyZWFrZG93bkVsZW1lbnQoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50KTsKLQl9Ci0JCi0JICAgLyoqCi0gICAgICogQHBhcmFtIHNlbGVjdGVkUHJvY2VzcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHNlbGVjdGVkUHJvY2Vzcyk7Ci0gICAgfQotCi0gICAgCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZ2V0VGl0bGVQcmVmaXgoKSB7Ci0JLy8gSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkvLyBpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkvLyBPYmplY3Qgb2JqID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkvLyBQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIG9iajsKLQkvLyBQcm9jZXNzIHByb2MgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JLy8gaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCS8vIHJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOOwotCS8vIH0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCS8vIHJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUzsKLQkvLyB9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBQcm9jZXNzQ29udHJpYnV0aW9uKSB7Ci0JLy8gcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9QUk9DRVNTX0NPTlRSSUJVVElPTjsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkvLyAuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS5Qcm9jZXNzRWRpdG9yLlRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0UHJvY1RpdGxlSW1hZ2UoKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJT2JqZWN0IG9iaiA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIG9iajsKLQkJCQlQcm9jZXNzIHByb2MgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19DQVBBQklMSVRZX1BBVFRFUk47Ci0JCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX0RFTElWRVJZX1BST0NFU1M7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX1BST0NFU1M7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIFByb3BlcnRpZXMgdmlldyBkcm9wIGRvd24gbWVudQotCSAqIAotCSAqIEBwYXJhbSBwYXJ0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvcGVydGllc0Ryb3BEb3duTWVudShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJSVZpZXdTaXRlIHZpZXcgPSAoKFByb3BlcnR5U2hlZXQpIHBhcnQpLmdldFZpZXdTaXRlKCk7Ci0KLQkJCUlNZW51TWFuYWdlciBtZW51TWdyID0gdmlldy5nZXRBY3Rpb25CYXJzKCkuZ2V0TWVudU1hbmFnZXIoKTsKLQkJCS8vIElDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtZW51TWdyLmdldEl0ZW1zKCk7Ci0JCQkvLyBmb3IgKGludCBpPTA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLQkJCS8vIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSWQgPSIgKyBpICsgIiAiICsgaXRlbXNbaV0uZ2V0SWQoKSArICIkIik7Ci0JCQkvLyB9Ci0JCQltZW51TWdyLnJlbW92ZUFsbCgpOwotCQkJbWVudU1nci51cGRhdGVBbGwodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQotCQkvLyBUT0RPOiBuZWVkIHJldmlzaXQKLQkJLy8gc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcihuZXcgRm9ybUVkaXRvclNlbGVjdGlvblByb3ZpZGVyKHRoaXMpKTsKLQkJLy8gYWN0aW9uTWFuYWdlciA9IGdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCS8vCi0JCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCk7IC8vIG5ldwotCQkvLyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8KLQkJLy8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCi0JCS8vCi0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiBydW4gPSBmYWxzZTsKLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQpIHsKLQkJCQkJc3dpdGNoICgoKENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCkgZXZlbnQpLmdldFR5cGUoKSkgewotCQkJCQljYXNlIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5FWEVDVVRFRDoKLQkJCQkJY2FzZSBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ETzoKLQkJCQkJCXJ1biA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJ1biA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChydW4pIHsKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLgotCQkJCQkJCS8vCi0JCQkJCQkJQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9ICgoQ29tbWFuZFN0YWNrKSBldmVudAotCQkJCQkJCQkJLmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOwotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoIShUbmdVdGlsLnVud3JhcChtb3N0UmVjZW50Q29tbWFuZCkgaW5zdGFuY2VvZiBTZXRDb21tYW5kKSkgewotCQkJCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kCi0JCQkJCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgQ3JlYXRlQ2hpbGRDb21tYW5kCi0JCQkJCQkJCQkJCSYmIGN1cnJlbnRWaWV3ZXIgaW5zdGFuY2VvZiBQcm9jZXNzVmlld2VyKSB7Ci0JCQkJCQkJCQkJT2JqZWN0W10gYXJyID0gbW9zdFJlY2VudENvbW1hbmQKLQkJCQkJCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKS50b0FycmF5KCk7Ci0JCQkJCQkJCQkJaWYgKGFyci5sZW5ndGggPT0gMSkgewotCQkJCQkJCQkJCQlQcm9jZXNzVmlld2VyIHZpZXdlciA9IChQcm9jZXNzVmlld2VyKSBjdXJyZW50Vmlld2VyOwotCQkJCQkJCQkJCQl2aWV3ZXIuZWRpdEVsZW1lbnQoYXJyWzBdLCAwKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOwotCQkJCQkJCS8vIH0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2spOwotCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJCW1hbmFnZXIuc3RhcnRMaXN0ZW5pbmdUbyhhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCkpOwotCi0JCQkvLyBUT0RPOiBuZWVkIHRvIHJldmlzaXQgdGhpcyBjb2RlCi0JCQlpZiAoIWFkZEFkYXB0ZXJGYWN0b3J5TGlzdGVuZXJzKSB7Ci0JCQkJYWRkQWRhcHRlckZhY3RvcnlMaXN0ZW5lcnMgPSB0cnVlOwotCQkJCW1hbmFnZXIuc3RhcnRMaXN0ZW5pbmdUbyhUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCW1hbmFnZXIuc3RhcnRMaXN0ZW5pbmdUbyhUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCW1hbmFnZXIuc3RhcnRMaXN0ZW5pbmdUbyhUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy9zZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCQkvL3NldFRpdGxlSW1hZ2UoZ2V0UHJvY1RpdGxlSW1hZ2UoKSk7Ci0KLQkJc2V0UGFydEZhY2FkZShpbnB1dCk7Ci0KLQkJLy8gZ2V0IG1ldGhvZCBlbGVtZW50IG9iamVjdCBmcm9tIEVkaXRvciBpbnB1dAotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWVsZW1lbnRPYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JCWlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50ID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50T2JqKTsKLQkJCXNlbGVjdGVkUHJvY2VzcyA9IHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCXNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudC5lQWRhcHRlcnMoKS5hZGQocHJvY2Vzc0NvbXBvbmVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGxpc3RlbiB0byByZXNvdXJjZSBjaGFuZ2UgdG8gdXBkYXRlIGRpcnR5IGZsYWcKLQkJLy8KLQkJLy8gYWRkUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIoKTsKLQotCQkvLyBhZGQgcGFydCBsaXN0ZW5lciB0byBsaXN0ZW4gdG8gcHJvcGVydHlTaGVldCBjbG9zZSBldmVudAotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIoCi0JCQkJcGFydEFjdGl2YXRpb25MaXN0ZW5lcik7Ci0KLQkJLy8gaW5wdXRDaGFuZ2VkKGlucHV0KTsKLQotCQkvLyBsaXN0ZW4gdG8gdGhlIGNoYW5nZSBvZiBjb2x1bW4gbGlzdCBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JCS8vCi0JCWlmIChwcmVmU3RvcmVMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlwcmVmU3RvcmVMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgZXZlbnQpIHsKLQkJCQkJUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIHBhZ2UgPSBudWxsOwotCQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKSB7Ci0JCQkJCQlwYWdlID0gV0JTVGFiOwotCQkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSkgewotCQkJCQkJcGFnZSA9IE9CU1RhYjsKLQkJCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLQkJCQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMpKSB7Ci0JCQkJCQlwYWdlID0gUEJTVGFiOwotCQkJCQl9Ci0JCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2xzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkJZXZlbnQuZ2V0UHJvcGVydHkoKSkpOwotCQkJCQkJcGFnZS51cGRhdGVDb2x1bW5zKGNvbHMpOwotCQkJCQkJaWYgKHBhZ2UgPT0gV0JTVGFiIHx8IHBhZ2UgPT0gT0JTVGFiKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIGNvbnNvbGlkYXRlZCB2aWV3IGFzIHdlbGwKLQkJCQkJCQkvLwotCQkJCQkJCS8vIGdldCBXQlMgY29sdW1ucwotCQkJCQkJCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3QoZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKTsKLQotCQkJCQkJCS8vIGdldCBUQlMgY29sdW1ucyAKLQkJCQkJCQlDb2x1bW5EZXNjcmlwdG9yW10gdGVhbUNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhnZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUykpOwotCi0JCQkJCQkJLy8gaWYgVEJTIGNvbHVtbnMgaGFzIFRFQU0gY29sdW1uIHRoZW4gYWRkIHRvIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZWFtQ29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJQ29sdW1uRGVzY3JpcHRvciBjb2xEZXNjID0gdGVhbUNvbHVtbkRlc2NyaXB0b3JzW2ldOwotCQkJCQkJCQlpZiAoY29sRGVzYyA9PSBDT0xfREVTQ19URUFNKSB7Ci0JCQkJCQkJCQlsaXN0LmFkZChjb2xEZXNjKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQkJCQkJCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJCQkJCQlwcm9jVGFiLnVwZGF0ZUNvbHVtbnMoY29sdW1ucyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZTdG9yZUxpc3RlbmVyKTsKLQkJCi0JCWRpYWdyYW1FZGl0b3JIZWxwZXIgPSBuZXcgRGlhZ3JhbUVkaXRvckhlbHBlcigpOwotCi0JfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlucHV0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UGFydEZhY2FkZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLSAgICAgICAgc2V0UGFydE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLSAgICAgICAgc2V0VGl0bGVJbWFnZShnZXRQcm9jVGl0bGVJbWFnZSgpKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjb2xsZWN0aW9uICE9IG51bGwgJiYgIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mCi0JCQkJCS8vIHRoZSBlZGl0b3IuCi0JCQkJCS8vCi0JCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJY29sbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKSBnZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBjbG9zZSBhbGwgZGlhZ3JhbSBlZGl0b3JzIG9mIHRoaXMgcHJvY2VzcwotCQkvLwotCQljbG9zZUFsbERpYWdyYW1FZGl0b3JzKCk7Ci0JCQotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZTdG9yZUxpc3RlbmVyKTsKLQotCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8KLQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQotCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0KLQkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgewotCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IobnVsbCk7Ci0JCX0KLQotCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOwotCQl9Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCQltYW5hZ2VyLnN0b3BMaXN0ZW5pbmdUbyhlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKTsKLQkJfQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQotCQlpZiAoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCXNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudC5lQWRhcHRlcnMoKS5yZW1vdmUoCi0JCQkJCXByb2Nlc3NDb21wb25lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyByZW1vdmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcigpOwotCi0JCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcigKLQkJCQlwYXJ0QWN0aXZhdGlvbkxpc3RlbmVyKTsKLQotCQlib29sZWFuIHNhdmVOZWVkZWQgPSBpc0RpcnR5KCk7Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlpZihkaWFncmFtRWRpdG9ySGVscGVyICE9IG51bGwpCi0JCQlkaWFncmFtRWRpdG9ySGVscGVyLmRpc3Bvc2UoKTsKLQotCi0JCS8vIGNhbGwgdGhpcyB0byBzZXQgbW9kaWZpZWQgZmxhZyBvZiBzdXBwcmVzc2lvbiB0byBmYWxzZQotCQkvLwotCQlzdXBwcmVzc2lvbi5zYXZlSXNEb25lKCk7Ci0KLQkJaWYgKHNhdmVOZWVkZWQpIHsKLQkJCS8vIHVzZXIgZGlzY2FyZGVkIGFsbCB0aGUgY2hhbmdlcywgc2F2ZSB0aGUgcmVzb3VyY2VzIGFmdGVyIGNoYW5nZXMKLQkJCS8vIGFyZSB1bmRvbmUuCi0JCQkvLyBUT0RPOiByZWxvYWQgdGhlIHByb2Nlc3MgY29tcG9uZW50IHJlc291cmNlIGluc3RlYWQgc2luY2UgaXQgaXMKLQkJCS8vIG5vdCBzaGFyZWQuCi0JCQkvLwotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJLy8gc2F2ZVJlc291cmNlKHJlc291cmNlKTsKLQkJCS8vIH0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9zZUFsbERpYWdyYW1FZGl0b3JzKCkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYod29ya2JlbmNoUGFnZSA9PSBudWxsKSB7Ci0JCQkvLyB3b3JrYmVuY2ggaXMgY2xvc2luZywgYWxsIGVkaXRvciB3aWxsIGJlIGNsb3NlZCBzbyBubyBuZWVkIHRvIGNsb3NlIHRoZSBkaWFncmFtIGVkaXRvciBoZXJlCi0JCQkvLwotCQkJcmV0dXJuOwotCQl9Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBkaWFncmFtRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkKLQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudAotCQkJCQkJCSYmIHNlbGVjdGVkUHJvY2VzcyA9PSBUbmdVdGlsCi0JCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQlkaWFncmFtRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighZGlhZ3JhbUVkaXRvclJlZnMuaXNFbXB0eSgpKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW2RpYWdyYW1FZGl0b3JSZWZzLnNpemUoKV07Ci0JCQlkaWFncmFtRWRpdG9yUmVmcy50b0FycmF5KHJlZnMpOwotCQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMocmVmcywgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoc2VsZWN0ZWRQcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkvLyBEZWxpdmVyeSBQcm9jZXNzCi0JCQlhZGRQYWdlKDAsIG5ldyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbih0aGlzKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBDYXBhYmlsaXR5IFBhdHRlcm4KLQkJCS8vIFByb2Nlc3MgQ29udHJpYnV0aW9uCi0JCQlhZGRQYWdlKDAsIG5ldyBQcm9jZXNzRGVzY3JpcHRpb24odGhpcykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlhZGREZXNjcmlwdGlvblBhZ2UoKTsKLQotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkJCS8vIGNyZWF0ZSBETkQgdHJhbnNmZXIgb2JqZWN0cwotCQkJLy8gaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkJCS8vIFRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10KLQkJCS8vIHtMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQotCQkJLy8gcHJlZmVyZW5jZSBpcyBtYW5hZ2VkIGJ5IGxpYnJhcnkgcGx1Z2luLAotCQkJLy8gc2luY2UgdGhpcyBwcmVmZXJlbmNlcyBpcyBhbHNvIHVzZWQgZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0JCQkvLyBKaW5odWEgWGkgMDgvMjEvMjAwNgotCQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLy8gLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJUHJlZmVyZW5jZVV0aWwudmFsaWRhdGVQcmVmZXJlbmNlcygpOwotCQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQotCQkJTGlzdCBwYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJLy8gV0JTIHRhYgotCQkJV0JTVGFiID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSh0aGlzLCBXQlNfRk9STV9JRCwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlKTsgCi0JCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQljdXJyZW50Q29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY3VycmVudENvbmZpZyk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlXQlNUYWIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJV0JTVGFiLnNldENvbHVtbkRlc2NyaXB0b3JzKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWludCBpZCA9IGFkZFBhZ2UoV0JTVGFiLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCXNldFBhZ2VUZXh0KGlkLCBXQlNUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlXQlNUYWIuc2V0VGFiSW5kZXgoaWQpOwotCQkJU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgV0JTVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChXQlNUYWIpOwotCQkJLy8gdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3Ci0JCQkvLyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7Ci0JCQkvLyB2aWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKQotCQkJLy8gewotCQkJLy8gcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkKLQkJCS8vIHsKLQkJCS8vIFVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmhhbmRsZURvdWJsZUNsaWNrRXZlbnQoZXZlbnQpOwotCQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJkb3VibGUgY2xpY2tlZCAuLi4iKTsKLQkJCS8vIC8vCi0JCQkvLyAvLyBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJLy8gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNlbCIrc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCS8vIC8vCi0JCQkvLyBQcm9kdWN0RWRpdG9yVmlldy5nZXRWaWV3KCkuZ2V0UHJvZHVjdFZpZXdlcigpLnNldElucHV0KHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkvLyB9Ci0JCQkvLyB9KTsKLQkJCS8vIGFkZFBhZ2UoV0JTVGFiKTsKLQotCQkJLy8gT0JTIHRhYgotCQkJT0JTVGFiID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSh0aGlzLCBUQV9GT1JNX0lELAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uKTsgCi0JCQljb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUykpOwotCQkJLy8gc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSwKLQkJCS8vIGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlPQlNUYWIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJT0JTVGFiLnNldENvbHVtbkRlc2NyaXB0b3JzKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWlkID0gYWRkUGFnZShPQlNUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIE9CU1RhYi5nZXRUaXRsZSgpKTsKLQkJCU9CU1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQl2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgT0JTVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChPQlNUYWIpOwotCQkJLy8gdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3Ci0JCQkvLyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7Ci0JCQkvLyBhZGRQYWdlKE9CU1RhYik7Ci0KLQkJCS8vIFBCUyB0YWIKLQkJCVBCU1RhYiA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UodGhpcywgV1BCU19GT1JNX0lELAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2UpOyAKLQkJCWNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpOwotCQkJLy8gc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0FkYXB0ZXJGYWN0b3JpZXMoKSwKLQkJCS8vIGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlQQlNUYWIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJUEJTVGFiLnNldENvbHVtbkRlc2NyaXB0b3JzKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWlkID0gYWRkUGFnZShQQlNUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIFBCU1RhYi5nZXRUaXRsZSgpKTsKLQkJCVBCU1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQl2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgUEJTVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChQQlNUYWIpOwotCQkJLy8gdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3Ci0JCQkvLyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7Ci0JCQkvLyBhZGRQYWdlKFBCU1RhYik7Ci0KLQkJCS8vIGNvbnNvbGlkYXRlZCB0YWIKLQkJCXByb2NUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsCi0JCQkJCUNPTlNPTElEQVRFRF9GT1JNX0lELAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXcpOyAKLQkJCXByb2NUYWIuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkuc2V0RmlsdGVyKFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UpOwotCQkJfQotCQkJcHJvY1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJCWNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotLy8JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKTsKLS8vCQkJCi0JCQkvLyBnZXQgV0JTIGNvbHVtbnMKLQkJCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RvcmUKLQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCi0JCQkvLyBnZXQgVEJTIGNvbHVtbnMgCi0JCQlDb2x1bW5EZXNjcmlwdG9yW10gdGVhbUNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSk7Ci0KLQkJCS8vIGlmIFRCUyBjb2x1bW5zIGhhcyBURUFNIGNvbHVtbiB0aGVuIGFkZCB0byBjb25zb2xpZGF0ZWQgdmlldwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZWFtQ29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlDb2x1bW5EZXNjcmlwdG9yIGNvbERlc2MgPSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnNbaV07Ci0JCQkJaWYgKGNvbERlc2MgPT0gQ09MX0RFU0NfVEVBTSkgewotCQkJCQlsaXN0LmFkZChjb2xEZXNjKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJCXByb2NUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1ucyk7Ci0JCQkKLQkJCWlkID0gYWRkUGFnZShwcm9jVGFiLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCXNldFBhZ2VUZXh0KGlkLCBwcm9jVGFiLmdldFRpdGxlKCkpOwotCQkJcHJvY1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQl2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgcHJvY1RhYi5nZXRWaWV3ZXIoKTsKLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCQlwYWdlcy5hZGQocHJvY1RhYik7Ci0KLQkJCQotCQkJLy8gVE9ETzogcHJvcGVybHkgaW1wbGVtZW50IGV4dGVuc2lvbiBwb2ludAotCQkJLy8gdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgc3VwcG9zZWQgdG8gbGV0IGV4dGVuc2lvbnMgbW9kaWZ5IHRoZSAKLQkJCS8vIGxpc3Qgb2YgcGFnZXMuICBCdXQgdGhpcyBlZGl0b3IgaXMgc28gbWVzc3kgdGhhdCB3ZSBjYW4ndAotCQkJLy8ganVzdCBwdXQgdGhlIHBhZ2VzIGluIGEgbWFwIHRvIGJlIHBhc3NlZCB0byBleHRlbnNpb25zCi0JCQkvLyAobGlrZSBpbiB0aGUgTWV0aG9kRWxlbWVudEVkaXRvcikuCi0JCQkKLQkJCS8vIGNoZWNrIGZvciBleHRlbnN0aW9uIHBvaW50IGFuZCBhZGQgdGhlIHBhZ2UgaWYgdGhlcmUKLQkJCU1hcDxPYmplY3QsU3RyaW5nPiBwYWdlTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8T2JqZWN0LFN0cmluZz4oKTsKLQkJCUxpc3Q8SU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24+IHBhZ2VQcm92aWRlcnMgPSBnZXRBbGxQYWdlUHJvdmlkZXJzKCk7Ci0JCQlpZiAocGFnZVByb3ZpZGVycyAhPSBudWxsICYmIHBhZ2VQcm92aWRlcnMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gZXh0ZW5zaW9uIDogcGFnZVByb3ZpZGVycykgewotCQkJCQlwYWdlTWFwID0gZXh0ZW5zaW9uLmdldFBhZ2VzKHBhZ2VNYXAsIHRoaXMsIHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIXBhZ2VNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZXh0ZW5zaW9uVGFicyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlPigpOwotCQkJCWZvciAoTWFwLkVudHJ5PE9iamVjdCwgU3RyaW5nPiBwYWdlRW50cnkgOiBwYWdlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQkJT2JqZWN0IHBhZ2UgPSBwYWdlRW50cnkuZ2V0S2V5KCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gcGFnZUVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCWludCBpbmRleCA9IC0xOwotCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIENvbnRyb2wpIHsKLQkJCQkJCWluZGV4ID0gYWRkUGFnZSgoQ29udHJvbClwYWdlKTsKLQkJCQkJfSBlbHNlIGlmIChwYWdlIGluc3RhbmNlb2YgSUZvcm1QYWdlKSB7Ci0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgewotCQkJCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRlbmRlZFBhZ2UgPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBwYWdlOwotCQkJCQkJCWV4dGVuc2lvblRhYnMuYWRkKGV4dGVuZGVkUGFnZSk7Ci0JCQkJCQkJaW5kZXggPSBhZGRQYWdlKGV4dGVuZGVkUGFnZQotCQkJCQkJCQkJLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCQkJCQlzZXRQYWdlVGV4dChpbmRleCwgZXh0ZW5kZWRQYWdlLmdldFRpdGxlKCkpOwotCQkJCQkJCWV4dGVuZGVkUGFnZS5zZXRUYWJJbmRleChpbmRleCk7Ci0JCQkJCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGV4dGVuZGVkUGFnZQotCQkJCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCi0JCQkJCQkJcGFnZXMuYWRkKGV4dGVuZGVkUGFnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAocGFnZSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCQlpbmRleCA9IGFkZFBhZ2UoKElFZGl0b3JQYXJ0KXBhZ2UsIGdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0JCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCXNldFBhZ2VUZXh0KGluZGV4LCBuYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJYnNQYWdlcyA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VbcGFnZXMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlic1BhZ2VzW2ldID0gKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgcGFnZXMuZ2V0KGkpOwotCQkJfQotCi0JCQkvLyBic1BhZ2VzID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtdIHsgV0JTVGFiLAotCQkJLy8gT0JTVGFiLAotCQkJLy8gUEJTVGFiLCBwcm9jVGFiIH07Ci0KLQkJCS8vIGlmKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9ySW5wdXQpIHsKLQkJCS8vIGludCBwYWdlSWQgPQotCQkJLy8gKChQcm9jZXNzRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJLy8gaWYocGFnZUlkICE9IC0xKSB7Ci0JCQkvLyBzZXRBY3RpdmVQYWdlKDApOwotCQkJLy8gc2V0QWN0aXZlUGFnZShwYWdlSWQpOwotCQkJLy8gfQotCQkJLy8gfQotCi0JCQlpbnB1dENoYW5nZWQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY3RpdmVQYWdlKGludCBwYWdlSW5kZXgpIHsKLQkJc3VwZXIuc2V0QWN0aXZlUGFnZShwYWdlSW5kZXgpOwotCi0JCS8vIHdvcmsgYXJvdW5kIGZvciBhY3RpdmUgcGFnZSB0aGF0IGlzIG5vdCBhIGZvcm0gcGFnZS4gU3VwZXIgbWV0aG9kCi0JCS8vIGRvZXMgbm90IGNhbGwgcGFnZUNoYW5nZSgpIGluIHRoaXMgY2FzZQotCQkvLwotCQloYW5kbGVQYWdlQ2hhbmdlKCk7Ci0JCWlmIChwYWdlSW5kZXggPiAwICYmIGJzUGFnZXMubGVuZ3RoIDw9IHBhZ2VJbmRleCkgewotCQkJVmlld2VyIHZpZXdlciA9IGJzUGFnZXNbcGFnZUluZGV4XS5nZXRWaWV3ZXIoKTsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlJU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24gPSBudWxsOwotCQkJCWlmIChnZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcklucHV0KSB7Ci0JCQkJCWluaXRpYWxTZWxlY3Rpb24gPSAoKFByb2Nlc3NFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSkKLQkJCQkJCQkuZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoaW5pdGlhbFNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLQkJCQl9Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI3NldEFjdGl2ZVBhZ2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUZvcm1QYWdlIHNldEFjdGl2ZVBhZ2UoU3RyaW5nIHBhZ2VJZCkgewotCQlpbnQgaWQgPSAtMTsKLQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChpKTsKLQkJCWlmIChwYWdlIGluc3RhbmNlb2YgSUZvcm1QYWdlKSB7Ci0JCQkJSUZvcm1QYWdlIGZwYWdlID0gKElGb3JtUGFnZSkgcGFnZTsKLQkJCQlpZiAoZnBhZ2UuZ2V0SWQoKS5lcXVhbHMocGFnZUlkKSkgewotCQkJCQlpZCA9IGk7Ci0JCQkJCWFjdGl2ZVBhZ2UgPSBmcGFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGlkID09IC0xKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJzUGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgcGFnZSA9IGJzUGFnZXNbaV07Ci0JCQkJaWYgKHBhZ2UuZ2V0SWQoKS5lcXVhbHMocGFnZUlkKSkgewotCQkJCQlpZCA9IHBhZ2UuZ2V0VGFiSW5kZXgoKTsKLQkJCQkJYWN0aXZlUGFnZSA9IHBhZ2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihpZCA9PSAtMSAmJiBleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dFBhZ2UgOiBleHRlbnNpb25UYWJzKSB7Ci0JCQkJZXh0UGFnZS5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJaWYgKGV4dFBhZ2UuZ2V0SWQoKS5lcXVhbHMocGFnZUlkKSkgewotCQkJCQlpZCA9IGV4dFBhZ2UuZ2V0VGFiSW5kZXgoKTsKLQkJCQkJYWN0aXZlUGFnZSA9IGV4dFBhZ2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJc2V0QWN0aXZlUGFnZShpZCk7Ci0JCQlyZXR1cm4gYWN0aXZlUGFnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFnZUNoYW5nZSgpIHsKLQkJaW50IGlkID0gZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoaWQgIT0gLTEpIHsKLQkJCU9iamVjdCBwYWdlID0gcGFnZXMuZ2V0KGlkKTsKLQkJCWlmIChwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0Rlc2NyaXB0aW9uKSB7Ci0JCQkJKChQcm9jZXNzRGVzY3JpcHRpb24pIHBhZ2UpLnNldEZvcm1UZXh0KCk7Ci0JCQl9Ci0JCQlpZiAoV0JTVGFiICE9IG51bGwgJiYgaWQgPT0gV0JTVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKFdCU1RhYi5nZXRWaWV3ZXIoKSk7Ci0JCQl9IGVsc2UgaWYgKE9CU1RhYiAhPSBudWxsICYmIGlkID09IE9CU1RhYi5nZXRUYWJJbmRleCgpKSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihPQlNUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChQQlNUYWIgIT0gbnVsbCAmJiBpZCA9PSBQQlNUYWIuZ2V0VGFiSW5kZXgoKSkgewotCQkJCXNldEN1cnJlbnRWaWV3ZXIoUEJTVGFiLmdldFZpZXdlcigpKTsKLQkJCX0gZWxzZSBpZiAocHJvY1RhYiAhPSBudWxsICYmIGlkID09IHByb2NUYWIuZ2V0VGFiSW5kZXgoKSkgewotCQkJCXNldEN1cnJlbnRWaWV3ZXIocHJvY1RhYi5nZXRWaWV3ZXIoKSk7Ci0JCQl9IGVsc2UgaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCWZvciAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dFBhZ2UgOiBleHRlbnNpb25UYWJzKSB7Ci0JCQkJCWlmIChpZCA9PSBleHRQYWdlLmdldFRhYkluZGV4KCkpCi0JCQkJCQlzZXRDdXJyZW50Vmlld2VyKGV4dFBhZ2UuZ2V0Vmlld2VyKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihudWxsKTsKLQkJCX0KLQotCQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCQloYW5kbGVQYWdlQ2hhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRleHQgbWVudSBmb3IgdGhlIGdpdmUgdmlld2VyCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCXNldFNlbGVjdGlvbihzZWwpOwotCQkJfQotCQl9KTsKLQotCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLAotCQkJCW5ldyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7Ci0JCQotCQlkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFk7Ci0JCXRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgewotCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgotCQkvLwotCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKLQkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgotCQkJCS8vCi0JCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlCi0JCQkJCS8vIHNlY3Rpb24uCi0JCQkJCS8vCi0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoCi0JCQkJCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgewotCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KLQkJCS8vCi0JCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJY3VycmVudFZpZXdlcgotCQkJCQkJLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQotCi0JCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCi0JCQkvLwotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQotCi0JCQkvLyBSZW1lbWJlciBpdC4KLQkJCS8vCi0JCQljdXJyZW50Vmlld2VyID0gdmlld2VyOwotCi0JCQkvLyBTZXQgYWRhcHRlciBmYWN0b3J5IG9mIGVkaXRpbmdEb21haW4gdG8gdGhhdCBvZiB0aGUgY3VycmVudCB2aWV3Ci0JCQkvLwotCQkJaWYgKGN1cnJlbnRWaWV3ZXIgaW5zdGFuY2VvZiBQcm9jZXNzVmlld2VyKSB7Ci0JCQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoKFByb2Nlc3NWaWV3ZXIpIGN1cnJlbnRWaWV3ZXIpCi0JCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQkJaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyID0gKChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKTsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcgotCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCQkJKChFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAocHJvcENvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlwcm9wQ29udGVudFByb3ZpZGVyLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncwotCQkJLy8gc2VsZWN0aW9uLgotCQkJLy8KLQkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZCi0JCQkJCTogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShlKTsKLQkJaWYgKGFjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWN0OwotCQl9Ci0KLQkJLy8gVE9ETzogaGFuZGxlIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBkaXJlY3RseSBiZWxvbmcgdG8gYW4gYWN0aXZpdHkKLQkJLy8gKGxpa2UgZGVsaXZlcmFibGUgcGFydCBvZiBhIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IpCi0JCS8vCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeShTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlyZXR1cm4gKChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpKQotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihWaWV3ZXIgdmlld2VyLAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gb3RoZXJTZWwsIGJvb2xlYW4gYWx0ZXJuYXRlU2VsZWN0aW9uKSB7Ci0JCWlmIChhbHRlcm5hdGVTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCU9iamVjdCBjdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKLQkJCWlmIChzZWwuc2l6ZSgpID09IDEpIHsKLQkJCQljdXJyZW50U2VsZWN0aW9uID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChjdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlBY3Rpdml0eSBhY3QgPSBnZXRQYXJlbnRBY3Rpdml0eSgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFNlbGVjdGlvbiwKLQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKSk7Ci0JCQkJCWlmIChhY3QgIT0gb3RoZXJTZWwuZ2V0Rmlyc3RFbGVtZW50KCkpIHsKLQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24ob3RoZXJTZWwsIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG90aGVyU2VsLCB0cnVlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24ob3RoZXJTZWwsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc3luY2hyb25pemluZ1NlbGVjdGlvbikgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gLy8gY2hlY2sgaWYgdGhlIHJlc291cmNlcyBvZiBzZWxlY3RlZCBvYmplY3RzIGFyZSBvdXQgb2Ygc3luY2ggb3IgYW55Ci0JCS8vIG9mIHRoZSBzZWxlY3RlZCBvYmplY3RzCi0JCS8vIC8vIGJlY2FtZSBwcm94eSB0aGVuIHJlZnJlc2ggdGhlbSBpZiBuZWVkZWQKLQkJLy8gLy8KLQkJLy8gaWYocmVmcmVzaE91dE9mU3luY2goc2VsZWN0aW9uKSkgewotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQotCQl2aWV3U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlBcnJheUxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVyTGlzdC5zaXplKCk7IGkrKykgewotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lckxpc3QKLQkJCQkJLmdldChpKTsKLQkJCWxpc3RlbmVyCi0JCQkJCS5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7Ci0JCX0KLQotCQkvLyBzeW5jaHJvbml6ZSBzZWxlY3Rpb24gaW4gYWxsIEJTIHZpZXdzIGlmIG9ubHkgb25lIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkJLy8KLQkJc3luY2hyb25pemVTZWxlY3Rpb24oc2VsZWN0aW9uLCBjdXJyZW50Vmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2hPdXRPZlN5bmNoKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUhhc2hTZXQ8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoKEVPYmplY3QpIGUpOwotCQkJCQlpZiAoZU9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQkJCQllT2JqZWN0ID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoZU9iamVjdCk7Ci0JCQkJCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFyZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJQXJyYXlMaXN0PFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQlBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCVJlc291cmNlVXRpbC5jaGVja091dE9mU3luY2hSZXNvdXJjZXMocmVzb3VyY2VzLAotCQkJCQkJcmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJYm9vbGVhbiByZXQgPSBwcm9tcHRSZWxvYWRGaWxlcygpOwotCQkJCQlpZiAocmV0KSB7Ci0JCQkJCQkvLyB1bmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCVBlcnNpc3RlbmNlVXRpbC51bmxvYWQocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCUNvbGxlY3Rpb24gcmVsb2FkZWRSZXNvdXJjZXMgPSBudWxsOwotCQkJCQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCS8vIFJlbG9hZCB0aGUgY2hhbmdlZCByZXNvdXJjZXMuCi0JCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJCQlyZWxvYWRlZFJlc291cmNlcyA9IG1hbmFnZXIKLQkJCQkJCQkJCQkucmVsb2FkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCQkJCQl8fCByZWxvYWRlZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gcmVmcmVzaCBvdXQtb2Ytc3luY2ggcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hhbmdlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKAotCQkJCQkJCQkJKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaFJlcXVpcmVkKSB7Ci0JCQkJY3VycmVudFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBWaWV3ZXIgY3VycmVudFZpZXdlcikgewotCQl0cnkgewotCQkJc3luY2hyb25pemluZ1NlbGVjdGlvbiA9IHRydWU7Ci0JCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsCi0JCQkJCSYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJaWYgKHNlbC5zaXplKCkgPT0gMSkgewotCQkJCQlPYmplY3Qgc2VsZWN0ZWQgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG90aGVyU2VsID0gbnVsbDsKLQkJCQkJYm9vbGVhbiBhbHRlcm5hdGVTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCQkJQXJyYXlMaXN0IHNlbGVjdGVkUGF0aCA9IG51bGw7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKFN0cnVjdHVyZWRWaWV3ZXIpIGN1cnJlbnRWaWV3ZXIpOwotCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJaWYgKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkKQotCQkJCQkJCQkuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gZ2V0IHBhdGgKLQkJCQkJCQkJLy8KLQkJCQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQkJCQkJCXNlbGVjdGVkUGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBzZWxlY3RlZDsKLQkJCQkJCQkJZG8gewotCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLmFkZCgwLCBlKTsKLQkJCQkJCQkJCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlKTsKLQkJCQkJCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudDsKLQkJCQkJCQkJCQllID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkJCQkuYWRhcHQoCi0JCQkJCQkJCQkJCQkJCXBhcmVudCwKLQkJCQkJCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQkJCQllID0gcGFyZW50OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IHdoaWxlICh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKHByb2NUYWIuZ2V0Vmlld2VyKCkgPT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCXNlbGVjdGVkID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWQpOwotCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJCQkJCX0gZWxzZSBpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0UGFnZSA6IGV4dGVuc2lvblRhYnMpIHsKLQkJCQkJCQkJaWYgKGV4dFBhZ2UuZ2V0Vmlld2VyKCkgPT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQkJc2VsZWN0ZWQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCQkJc2VsZWN0ZWQpOwkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlpZiAocHJvY1RhYi5nZXRWaWV3ZXIoKSAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJcHJvY1RhYi5nZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0UGFnZSA6IGV4dGVuc2lvblRhYnMpIHsKLQkJCQkJCQkJaWYgKGV4dFBhZ2UuZ2V0Vmlld2VyKCkgIT0gY3VycmVudFZpZXdlcikKLQkJCQkJCQkJCWV4dFBhZ2UuZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJfHwgc2VsZWN0ZWQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJCQlvdGhlclNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlBY3Rpdml0eSBhY3QgPSBnZXRQYXJlbnRBY3Rpdml0eSgKLQkJCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBzZWxlY3RlZCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWlmIChhY3QgIT0gbnVsbCkgewotCQkJCQkJCQlvdGhlclNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFjdCk7Ci0JCQkJCQkJCWFsdGVybmF0ZVNlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvdGhlclNlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBvd24gZWxlbWVudCBpcyBzZWxlY3RlZAotCQkJCQkJLy8KLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JCQkJCQlpZiAoIFdCU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IFdCU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcih2aWV3ZXIsIG90aGVyU2VsLAotCQkJCQkJCQkJCWFsdGVybmF0ZVNlbGVjdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoIE9CU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IE9CU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcih2aWV3ZXIsIG90aGVyU2VsLAotCQkJCQkJCQkJCWFsdGVybmF0ZVNlbGVjdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoIFBCU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IFBCU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIodmlld2VyLCBvdGhlclNlbCwKLQkJCQkJCQkJCQlhbHRlcm5hdGVTZWxlY3Rpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChzZWxlY3RlZFBhdGggIT0gbnVsbCkgewotCQkJCQkJLy8gaW5oZXJpdGVkIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkJCQkJCS8vCi0JCQkJCQlWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJCQkJCWlmICggV0JTVGFiICE9IG51bGwgKSB7Ci0JCQkJCQkJdmlld2VyID0gV0JTVGFiLmdldFZpZXdlcigpOwotCQkJCQkJCWlmICh2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwgV0JTVGFiLmdldEFkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkJCQkJCQkKLQkJCQkJCWlmICggT0JTVGFiICE9IG51bGwgKSB7Ci0JCQkJCQkJdmlld2VyID0gT0JTVGFiLmdldFZpZXdlcigpOwkJCQkJCQotCQkJCQkJCWlmICh2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwgT0JTVGFiLmdldEFkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICggUEJTVGFiICE9IG51bGwgKSB7Ci0JCQkJCQkJdmlld2VyID0gUEJTVGFiLmdldFZpZXdlcigpOwkJCQkJCQotCQkJCQkJCWlmICh2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwgUEJTVGFiLmdldEFkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICggcHJvY1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IHByb2NUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJaWYgKHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbmRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBwcm9jVGFiLmdldEFkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRQYWdlIDogZXh0ZW5zaW9uVGFicykgewotCQkJCQkJCQl2aWV3ZXIgPSBleHRQYWdlLmdldFZpZXdlcigpOwotCQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJCQlmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwKLQkJCQkJCQkJCQkJCQlleHRQYWdlCi0JCQkJCQkJCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzeW5jaHJvbml6aW5nU2VsZWN0aW9uID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaW5kU2VsZWN0aW9uKExpc3Qgc2VsZWN0ZWRQYXRoLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaW50IHNpemUgPSBzZWxlY3RlZFBhdGguc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlPYmplY3QgZSA9IHNlbGVjdGVkUGF0aC5nZXQoMCk7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBlOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpOwotCQlmaW5kX3NlbGVjdGlvbjogZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLQkJCWUgPSBzZWxlY3RlZFBhdGguZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gZSkgewotCQkJCQlzZWxlY3Rpb24gPSBjaGlsZDsKLQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQkJCWNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCQkJCWNvbnRpbnVlIGZpbmRfc2VsZWN0aW9uOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrIGZpbmRfc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JLy8gSW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLQkvLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdmlld1NlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyI2dldEVkaXRpbmdEb21haW4oKQotCSAqLwotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyI2dldFZpZXdlcigpCi0JICovCi0JcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiBjdXJyZW50Vmlld2VyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBvZiB0aGUgY3VycmVudCBwYWdlIGlmIHRoZXJlIGlzIGFueQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCUFkYXB0ZXIgRmFjdG9yeSBvZiB0aGUgY3VycmVudCBwYWdlIG9mIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCUlGb3JtUGFnZSBwYWdlID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmIChwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHBhZ2UpCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCSgoSU1lbnVMaXN0ZW5lcikgZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpCi0JCQkJLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCQotCQkvLyBwb3B1bGF0ZSBjb250cmlidXRlZCBtZW51IGl0ZW1zCi0JCS8vCi0JCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHsKLQkJCUlBY3Rpb25bXSBhY3Rpb25zID0gKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpYWN0aXZlUGFnZSkuZ2V0QWRkaXRpb25hbEFjdGlvbnMoKTsKLQkJCWlmKGFjdGlvbnMgIT0gbnVsbCAmJiBhY3Rpb25zLmxlbmd0aCA+IDApIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSBhY3Rpb25zW2ldOwotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiBhY3Rpb24gaW5zdGFuY2VvZiBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24pIHsKLQkJCQkJCSgoQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uKWFjdGlvbikuc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0QWN0aW9uKSB7Ci0JCQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pCi0JCQkJCQkJCS5zZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KHRoaXMpOwotCQkJCQl9Ci0JCQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCVByb3BlcnR5U2hlZXQgUGFnZQotCSAqLwotCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IChFUEZQcm9wZXJ0eVNoZWV0UGFnZSkgY3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoKTsKLQotCQkJLy8gewotCQkJLy8gcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLAotCQkJLy8gSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIKLQkJCS8vIHN0YXR1c0xpbmVNYW5hZ2VyKSB7Ci0JCQkvLyBzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsCi0JCQkvLyBzdGF0dXNMaW5lTWFuYWdlcik7Ci0JCQkvLyB9Ci0JCQkvLwotCQkJLy8gcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCQkvLyBzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCQkJLy8gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7Ci0JCQkvLyB9Ci0JCQkvLyB9OwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIHByb3ZpZGVyICIpOwotCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgKChQcm9jZXNzVmlld2VyKSBjdXJyZW50Vmlld2VyKQotCQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJCXByb3BDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQljb250ZW50UHJvdmlkZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJcHJvcGVydHlTaGVldFBhZ2UKLQkJCQkJCS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHByb3BDb250ZW50UHJvdmlkZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgY3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRVBGUHJvcGVydHlTaGVldFBhZ2UodGhpcyk7Ci0gICAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCQlpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yI2dldENvbnRyaWJ1dG9ySWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpIHsKLQkJcmV0dXJuIGdldFNpdGUoKS5nZXRJZCgpOwotCX0KLQotCQotCS8qKgotCSAqIFJldHVybiBjb2x1bW4gZGVzY3JpcHRvciBsaXN0IGZvciBnaXZlbiBzdHJpbmcKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KFN0cmluZyBzdHIpIHsKLQkJRUxpc3QgY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCU9iamVjdCBjb2x1bW5EZXNjcmlwdG9yID0gUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcAotCQkJCQkuZ2V0KHRva2VuKTsKLQkJCWlmIChjb2x1bW5EZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQljb2x1bW5EZXNjcmlwdG9ycy5hZGQoY29sdW1uRGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhcnJheSBvZiBjb2x1bW4gZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbiBzdHJpbmcKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2x1bW5EZXNjcmlwdG9yW10gdG9Db2x1bW5EZXNjcmlwdG9ycyhTdHJpbmcgc3RyKSB7Ci0JCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNnZXRDdXJyZW50UGFnZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50UGFnZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRQYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHN1cHByZXNzaW9uIGluZm8KLQkgKi8KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWdDaGFuZ2VkKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNvbmZpZyAhPSBjdXJyZW50Q29uZmlnKSB7Ci0JCQkvLyByZWZyZXNoIG9ubHkgaWYgdGhlIGFjdGl2ZSBwYXJ0IGlzIHRoaXMgZWRpdG9yIG9yIGRpYWdyYW0gZWRpdG9yCi0JCQkvLyBvZiBhbnkgYWN0aXZpdHkgaW4gdGhpcyBwcm9jZXNzCi0JCQkvLwotCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSBhY3RpdmVQYXJ0ID09IHRoaXM7Ci0JCQlpZiAoIXJlZnJlc2gpIHsKLQkJCQlpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSgoSUVkaXRvclBhcnQpIGFjdGl2ZVBhcnQpCi0JCQkJCQkJLmdldEVkaXRvcklucHV0KCkpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlyZWZyZXNoID0gaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkgPT0gc2VsZWN0ZWRQcm9jZXNzOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZzsKLQkJCQlyZWZyZXNoQWxsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0ICE9IGdldEVkaXRvcklucHV0KCkpIHsKLQkJCWlucHV0Q2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjdXBkYXRlUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhZ2VzKCkgewotCQkvLyByZW1vdmUgYW5kIGFkZCBkZXNjcmlwdGlvbiBwYWdlIGlmIHRoZSBtb2RlbC54bWkgb3IgY29udGVudC54bWkgb2YKLQkJLy8gdGhlIHByb2Nlc3MgaGF2ZSBiZWVuIGNoYW5nZWQKLQkJLy8KLQkJUmVzb3VyY2UgbW9kZWxSZXNvdXJjZSA9IHNlbGVjdGVkUHJvY2Vzcy5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2UgY29udGVudFJlc291cmNlID0gc2VsZWN0ZWRQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpCi0JCQkJLmVSZXNvdXJjZSgpOwotCQlpZiAoY2hhbmdlZFJlc291cmNlcy5jb250YWlucyhtb2RlbFJlc291cmNlKQotCQkJCXx8IChjb250ZW50UmVzb3VyY2UgIT0gbnVsbCAmJiBjaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkuY29udGFpbnMoY29udGVudFJlc291cmNlKSkpIHsKLQkJCXJlbW92ZVBhZ2UoMCk7Ci0JCQl0cnkgewotCQkJCWFkZERlc2NyaXB0aW9uUGFnZSgpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlLCAKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnLCBlKTsgCi0JCQl9Ci0JCX0KLQkJaWYgKGlucHV0Q2hhbmdlZCkgewotCQkJaW5wdXRDaGFuZ2VkKGdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZWZyZXNoQWxsKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQWxsKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWRvUmVmcmVzaEFsbCh0cnVlKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgdmlld2VycyAKLQkgKiBAcGFyYW0gdXBkYXRlSURzCi0JICogCQkJaWYgdHJ1ZSwgdGhlbiByZWZyZXNoIGFsbCBpbmRleCBpbiB2aWV3ZXJzCi0JICovCi0JcHVibGljIHZvaWQgZG9SZWZyZXNoQWxsKGJvb2xlYW4gdXBkYXRlSURzKSB7Ci0vLwkJaWYgKHVwZGF0ZUlEcykgewotLy8JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0vLwkJCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgc2VsZWN0ZWRQcm9jZXNzKTsKLS8vCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LAotLy8JCQkJCXNlbGVjdGVkUHJvY2Vzcyk7Ci0vLwotLy8JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0vLwkJCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgc2VsZWN0ZWRQcm9jZXNzKTsKLS8vCQl9Ci0KLQkJdXBkYXRlSURzKHVwZGF0ZUlEcyk7Ci0JCQotICAgICAgICBpZiAoV0JTVGFiICE9IG51bGwgJiYgV0JTVGFiLmdldFZpZXdlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFdCU1RhYi5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChPQlNUYWIgIT0gbnVsbCAmJiBPQlNUYWIuZ2V0Vmlld2VyKCkgIT0gbnVsbCkgewotICAgICAgICAJT0JTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoUEJTVGFiICE9IG51bGwgJiYgUEJTVGFiLmdldFZpZXdlcigpICE9IG51bGwpIHsKLSAgICAgICAgCVBCU1RhYi5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2NUYWIgIT0gbnVsbCAmJiBwcm9jVGFiLmdldFZpZXdlcigpICE9IG51bGwpIHsKLSAgICAgICAgCXByb2NUYWIuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotICAgICAgICB9Ci0KLQkJCi0JCWlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dFBhZ2UgOiBleHRlbnNpb25UYWJzKSB7Ci0JCQkJZXh0UGFnZS5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOwotCQl9Ci0JfQotCQotCQotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cGRhdGVJRHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJRHMoYm9vbGVhbiB1cGRhdGVJRHMpIHsKLSAgICAgICAgaWYgKHVwZGF0ZUlEcykgewotICAgICAgICAgICAgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotICAgICAgICAgICAgaWYgKFdCU1RhYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgc2VsZWN0ZWRQcm9jZXNzKTsKLSAgICAgICAgICAgICAgICBQcm9jZXNzVXRpbC5yZWZyZXNoUHJlZGVjY2Vzc29yTGlzdHMoYWRhcHRlckZhY3RvcnksIHNlbGVjdGVkUHJvY2Vzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvY1RhYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgc2VsZWN0ZWRQcm9jZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgb3BlbiBwcm9jZXNzIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKSB7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJKChQcm9jZXNzRWRpdG9yKSBlZGl0b3IpLmRvUmVmcmVzaEFsbChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2dldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElGb3JtUGFnZSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKSB7Ci0JCWludCBpbmRleCA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBic1BhZ2VzW2luZGV4IC0gMV07Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBzdXBlci5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQlpZiAoc3VwcHJlc3Npb24uaXNTYXZlTmVlZGVkKCkKLQkJCQkmJiAhbW9kaWZpZWRSZXNvdXJjZXMuY29udGFpbnMoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkuZVJlc291cmNlKCkpKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmVSZXNvdXJjZSgpKTsKLQkJfQotCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzVG9TYXZlKTsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBwcmVzc2lvbi5zYXZlVG9Nb2RlbCgpOwotCQlzdXBlci5kb1NhdmUobW9uaXRvcik7Ci0JCXN1cHByZXNzaW9uLnNhdmVJc0RvbmUoKTsKLQkJcmVzb3VyY2VzVG9TYXZlLmNsZWFyKCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmIChzdXBwcmVzc2lvbi5pc1NhdmVOZWVkZWQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRGlydHkoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNmaXJlUHJvcGVydHlDaGFuZ2UoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHlJZCkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlJZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNnZXRVc2VkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VXNlZFJlc291cmNlcygpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCi0JCS8vIG1vZGVsLnhtaQotCQkvLwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnRPYmouZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl1c2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQotCQkvLyBjb250ZW50LnhtaQotCQkvLwotCQlyZXNvdXJjZSA9IHNlbGVjdGVkUHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8vIGNvbmZpZ3VyYXRpb24ueG1pCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2VsZWN0ZWRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlc291cmNlcyBvZiBvdGhlciBwcm9jZXNzZXMgdGhhdCB0aGlzIHByb2Nlc3MgaXMgZGVwZW5kaW5nIG9uCi0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnlGcm9tVGFiKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwKLQkJCQlzZWxlY3RlZFByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXJlc291cmNlID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlsYXN0VXNlZFJlc291cmNlcyA9IHVzZWRSZXNvdXJjZXM7Ci0KLQkJcmV0dXJuIHVzZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeUZyb21UYWIoKSB7Ci0gICAgICAgIHJldHVybiBXQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICAKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHNlbGVjdGVkIG9iamVjdHMgY2FuIGJlIHJldmVhbGVkIG9yIG5vdCBhbmQgcmV0dW5zIHJlc3VsdAotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAJCQlMaXN0IG9mIG9iamVjdHMKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAJCQlBZGFwdGVyIGZhY3Rvcnkgb2YgdGhlIHNlbGVjdGVkIG9iamVjdHMKLQkgKiBAcGFyYW0gc3VwcHJlc3Npb24KLQkgKiAJCQlTdXBwcmVzc2lvbiBpbmZvcm1hdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCUJvb2xlYW4gdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciBzZWxlY3RlZCBvYmplY3RzIGNhbiBiZSByZXZlYWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5SZXZlYWwoQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24sCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJLy8gTk8gbW9yZSBjaGVjayBmb3IgZHVwbGljYXRpb24gb2YgbmFtZSBhbmQgcHJlc2VudGF0aW9uIG5hbWUKLQkJLy8KLS8vCQkvLyBjaGVjayBpZiByZXZlYWxpbmcgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHdpbGwgY2F1c2UgbmFtZSBkdXBsaWNhdGlvbgotLy8JCS8vCi0vLwkJU3RyaW5nIG1zZyA9IHN1cHByZXNzaW9uLmNoZWNrRHVwbGljYXRlTmFtZUFmdGVyUmV2ZWFsKHNlbGVjdGlvbiwKLS8vCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLS8vCQlpZiAobXNnICE9IG51bGwpIHsKLS8vCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLS8vCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1JldmVhbF9UaXRsZSwgLy8kTk9OLU5MUy0xJCAKLS8vCQkJCQltc2cpOwotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8KLS8vCQkvLyBjaGVjayBpZiByZXZlYWxpbmcgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHdpbGwgY2F1c2UgZHVwbGljYXRlCi0vLwkJLy8gZGVzY3JpcHRvcnMuCi0vLwkJLy8gSWYgc28sIHByb21wdCB1c2VyIHRvIGRlbGV0ZSB0aGUgZHVwbGljYXRlcyBiZWZvcmUgY29udGludWluZy4KLS8vCQkvLwotLy8JCUNvbGxlY3Rpb24gZHVwbGljYXRlcyA9IFByb2Nlc3NVdGlsCi0vLwkJCQkuZ2V0RHVwbGljYXRlRGVzY3JpcHRvcnNBZnRlclJldmVhbChzZWxlY3Rpb24pOwotLy8JCWlmICghZHVwbGljYXRlcy5pc0VtcHR5KCkpIHsKLS8vCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotLy8JCQkJCS5nZXRJZCgpLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLS8vCQkJCVN0cmluZyBkZXNjVHh0ID0gVG5nVXRpbC5nZXRUeXBlVGV4dChkZXNjKQotLy8JCQkJCQkrICI6ICIgKyBkZXNjLmdldFByZXNlbnRhdGlvbk5hbWUoKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQXV0aG9yaW5nVUlQbHVnaW4KLS8vCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBkZXNjVHh0LCBudWxsKSk7Ci0vLwkJCX0KLS8vCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0vLwkJCQkJLmdldERlZmF1bHQoKQotLy8JCQkJCS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotLy8JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9SZXZlYWxfVGl0bGUsIC8vJE5PTi1OTFMtMSQgCi0vLwkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsLCAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQlzdGF0dXMpID09IERpYWxvZy5DQU5DRUwpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8KLS8vCQkJLy8gZGVsZXRlIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycwotLy8JCQl0cnkgewotLy8JCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZHVwbGljYXRlcyk7Ci0vLwkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSW5oZXJpdGVkKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJLy8gcHJlZmVyZW5jZSBpcyBtYW5hZ2VkIGJ5IGxpYnJhcnkgcGx1Z2luLAotCQkvLyBzaW5jZSB0aGlzIHByZWZlcmVuY2VzIGlzIGFsc28gdXNlZCBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLQkJLy8gSmluaHVhIFhpIDA4LzIxLzIwMDYKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkvLyAuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHN0b3JlOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1FZGl0b3JIZWxwZXIgZ2V0RGlhZ3JhbUVkaXRvckhlbHBlcigpewotCQlpZihkaWFncmFtRWRpdG9ySGVscGVyID09IG51bGwpewotCQkJZGlhZ3JhbUVkaXRvckhlbHBlciA9IG5ldyBEaWFncmFtRWRpdG9ySGVscGVyKCk7Ci0JCQlkaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1NYW5hZ2VyKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1FZGl0b3JIZWxwZXI7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHdpdGhvdXQgYW55IGNvZGUgY2hhbmdlIGp1c3QgZm9yIHtAbGluayBQcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3J9IHRvIGFjY2VzcyBpdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyODQwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTW9kaWZ5aW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSW5kZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1vdmVEb3duQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Nb3ZlVXBBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk91dGRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlN5bmNocm9uaXphdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuRGlhbG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkVQRlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BREltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuQURESW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1FZGl0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5BY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUmVwbGFjZUFjdGl2aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkRpYWdyYW1PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbi5TdXBwcmVzc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5JRm9ybVBhZ2U7Ci0KLS8qKgotICogQWN0aW9uIGJhciBjb250cmlidHV0b3IgZm9yIHByb2Nlc3MgZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCU1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gcmVnaXN0ZXJlZEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2NrZWQ7Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiByb2xsdXBBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJYm9vbGVhbiB3YXNSb2xsZWRVcCA9IGJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWJzSXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKCFic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpOwotCQkJKChJQ2hhbmdlTm90aWZpZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCQkJCQkoSW50ZXJuYWxFT2JqZWN0KSBzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQkJCQkJTm90aWZpY2F0aW9uLkFERCwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpLAotCQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCWlmIChic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gUmVmcmVzaGluZyBmb3IgZ3JlZW4gYWN0aXZpdGllcyBkdXJpbmcgcm9sbHVwCi0JCQkJRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyOwotCQkJCXByb3ZpZGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBwcm92aWRlciwKLQkJCQkJCQkJcHJvdmlkZXIpLCBwcm92aWRlciwgdHJ1ZSwgZmFsc2UpKTsKLQkJCX0KLQkJCWlmICh3YXNSb2xsZWRVcCkgewotCQkJCVByb2Nlc3NWaWV3ZXIgdmlld2VyID0gKFByb2Nlc3NWaWV3ZXIpICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5jdXJyZW50Vmlld2VyOwotCQkJCXZpZXdlci5leHBhbmRUb0xldmVsKHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCQlBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0KLQkJCQkvLyBldmVudGhvdWdoIHdlIHN3aXRjaGVkIG9mZiBjcmVhdGluZyBuZXcgYWN0aXZpdGllcyBpbgotCQkJCS8vIFdCUywKLQkJCQkvLyB1c2VyIGNhbiBzdGlsbCBjcmVhdGUgdGhydSBBRC4gSGVuY2Ugd2UgbmVlZCB0byB1cGRhdGUKLQkJCQkvLyBJRHMKLQkJCQkvLyBhZnRlcndhcmRzCi0JCQkJZG9SZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwcm90ZWN0ZWQgTW92ZVVwQWN0aW9uIG1vdmVVcEFjdGlvbiA9IG5ldyBNb3ZlVXBBY3Rpb24oKSB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZighaXNFZGl0aW5nQWxsb3dlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChzZWxlY3Rpb24pOwotCQl9CQkKLQl9OwotCi0JcHJvdGVjdGVkIE1vdmVEb3duQWN0aW9uIG1vdmVEb3duQWN0aW9uID0gbmV3IE1vdmVEb3duQWN0aW9uKCkgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYoIWlzRWRpdGluZ0FsbG93ZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5hY2NlcHQoc2VsZWN0aW9uKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gcHJlZmVyZW5jZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9QcmVmZXJlbmNlcykgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBvcGVuIHByb2Nlc3MgcHJlZmVyZW5jZSBwYWdlCi0JCQlvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbAotCQkJCQkuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKAotCQkJCQkJCWdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCQkJCSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQludWxsLCBudWxsKS5vcGVuKCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gb3BlbkJhc2VBY3Rpdml0eSA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQmFzZUFjdGl2aXR5KSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gc2VsZWN0ZWRBY3Rpdml0eQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCXRyeSB7Ci0JCQkJaW50IGlkID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJhc2UpOwotCi0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQkJCShNZXRob2RFbGVtZW50KSBwcm9jLmVDb250YWluZXIoKSk7Ci0JCQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0UGFnZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQlpbnB1dCwgUHJvY2Vzc0VkaXRvci5FRElUT1JfSUQpOwotCQkJCWVkaXRvci5zZXRBY3RpdmVQYWdlKGlkKTsKLQkJCQllZGl0b3IuYnNQYWdlc1tpZCAtIDFdLmdldFZpZXdlcigpCi0JCQkJCQkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIG9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuRWRpdG9ySW5wdXQoCi0JCQkJCQkJc2VsZWN0ZWRPYmplY3QsIGdldFN1cHByZXNzaW9uKCkpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5XT1JLRkxPV19FRElUT1JfSUQpOwotCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIGNsYXNzIE9wZW5EaWFncmFtRWRpdG9yQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCQlwcml2YXRlIGludCBkaWFncmFtVHlwZTsKLQotCQlwdWJsaWMgT3BlbkRpYWdyYW1FZGl0b3JBY3Rpb24oU3RyaW5nIHRleHQsIGludCBkaWFncmFtVHlwZSkgewotCQkJc3VwZXIodGV4dCk7Ci0JCQl0aGlzLmRpYWdyYW1UeXBlID0gZGlhZ3JhbVR5cGU7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2VEZXNjcmlwdG9yKGRpYWdyYW1UeXBlKSk7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihkaWFncmFtVHlwZSkpOwotCQl9Ci0JCQotCQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCQlzd2l0Y2goZGlhZ3JhbVR5cGUpIHsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJcmV0dXJuIEFESW1hZ2VzLklNR19ERVNDX0VESVRPUjsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCXJldHVybiBBRERJbWFnZXMuSU1HX0RFU0NfRURJVE9SOwotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQlyZXR1cm4gV1BEREltYWdlcy5JTUdfREVTQ19FRElUT1I7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCQlzd2l0Y2goZGlhZ3JhbVR5cGUpIHsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJcmV0dXJuIEFESW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0VESVRPUjsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCXJldHVybiBBRERJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfRURJVE9SOwotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQlyZXR1cm4gV1BEREltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19FRElUT1I7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYoIVByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKHNlbGVjdGVkT2JqZWN0KSkgewotCQkJCQltZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShnZXRQcm9jZXNzKCksIHRoaXMpOwotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZihtZ3IuaXNOZXdSZXNvdXJjZSgpICYmICFuZXcgRmlsZShGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKS5leGlzdHMoKSkgewotCQkJCQkJYm9vbGVhbiByZXN1bHQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5OZXdEaWFncmFtRmlsZV90aXRsZSwKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0Q3JlYXRlTmV3RGlhZ3JhbUZpbGVfbXNnKTsKLQkJCQkJCWlmKHJlc3VsdCkgewotCQkJCQkJCXJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQotCQkJCQkJCS8vIHN0aWxsIGtlZXAgdGhlIGZsYWcgcmVzb3VyY2VJc05ldyBzZXQgc28gZWRpdG9yIHdpbGwgYmUgbWFya2VkIGRpcnR5Ci0JCQkJCQkJLy8KLQkJCQkJCQltZ3Iuc2V0UmVzb3VyY2VJc05ldyh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlvcGVuRGlhZ3JhbShkaWFncmFtVHlwZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQWN0aW9uIG5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvciA9IG5ldyBPcGVuRGlhZ3JhbUVkaXRvckFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW0sIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQotCXByaXZhdGUgSUFjdGlvbiBuZXdBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IgPSBuZXcgT3BlbkRpYWdyYW1FZGl0b3JBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtLCBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCi0JcHJpdmF0ZSBJQWN0aW9uIG5ld1dQRGlhZ3JhbUVkaXRvciA9IG5ldyBPcGVuRGlhZ3JhbUVkaXRvckFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLAotCQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pOwotCi0JLy8gT3BlbiB3b3JrZmxvdyBkZXRhaWwgYWN0aW9uCi0JLy8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRQYWdlKCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJCQlQcm9jZXNzRWRpdG9yLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIG9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCQkJc2VsZWN0ZWRPYmplY3QsIGdldFN1cHByZXNzaW9uKCkpIHsKLQkJCQkJfTsKLQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuV1BERVBFTkRFTkNZX0VESVRPUl9JRCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiByZXBsYWNlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2UpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNtZCA9IG5ldyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kKAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcik7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5ID0gbmV3IEFjdGlvbigKLQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0KSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJY21kID0gbmV3IExvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kKAotCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBnZXRUZXh0KCkpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGNvbnRyaWJ1dGVBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY21kID0gbmV3IENvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZCgKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXIpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJLy8gUHJvY2Vzc1V0aWwuY29udHJpYnV0ZVRvQWN0aXZpdHkoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWJzSXRlbVByb3ZpZGVyLAotCQkJCS8vICgoUHJvY2Vzc0Zvcm1FZGl0b3IpYWN0aXZlRWRpdG9yKS5lZGl0aW5nRG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIGNsYXNzIEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBleHRlbmRzIFN1cHByZXNzaW9uQ29tbWFuZCB7Ci0JCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZChTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgTGlzdCBzZWxlY3Rpb24sCi0JCQkJYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCQlzdXBlcihzdXBwcmVzc2lvbiwgc2VsZWN0aW9uLCBzdXBwcmVzc2VkKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZWZyZXNoKCkgewotCQkJaWYgKCFnZXRSZXN1bHQoKS5pc0VtcHR5KCkpIHsKLQkJCQlQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBnZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoaXNSZWFkT25seUVsZW1lbnRBZmZlY3RlZCgpKSB7Ci0JCQkJCWlmIChQcm9jZXNzRWRpdG9yLmhhc0luaGVyaXRlZChzZWxlY3Rpb24pKSB7Ci0JCQkJCQllZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0b3IuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllZGl0b3IuZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCi0JCQkJLy8gRG8gRGlhZ3JhbSBFZGl0b3JzIHJlZnJlc2gKLQkJCQlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMoZWxlbWVudCwgbGlzdCk7Ci0JCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIucmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKGVsZW1lbnQsCi0JCQkJCQkJbGlzdCwgdHJ1ZSk7Ci0JCQkJCWxpc3QuY2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24uU3VwcHJlc3Npb25Db21tYW5kI2RpZEV4ZWN1dGUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGlkRXhlY3V0ZSgpIHsKLQkJCXJlZnJlc2goKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbi5TdXBwcmVzc2lvbkNvbW1hbmQjZGlkVW5kbygpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaWRVbmRvKCkgewotCQkJcmVmcmVzaCgpOwotCQl9Ci0KLQl9Ci0KLQkvL1RPRE86IG1vdmUgdGhpcyBhY3Rpb24gdG8gaXRzIG93biBDb21tYW5kQWN0aW9uSGFuZGxlciBjbGFzcywgc2VlIEluZGVuQWN0aW9uCi0JcHJpdmF0ZSBJQWN0aW9uIHN1cHByZXNzVGFza0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc19UYXNrKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gY2hlY2sgaWYgc3VwcHJlc3NpbmcgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHdpbGwgY2F1c2UKLQkJCS8vIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycy4KLQkJCS8vIElmIHNvLCBwcm9tcHQgdXNlciB0byBkZWxldGUgdGhlIGR1cGxpY2F0ZXMgYmVmb3JlCi0JCQkvLyBjb250aW51aW5nLgotCQkJLy8KLQotCQkJZmluYWwgTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JzKHNlbGVjdGlvbik7Ci0JCQkKLQkJCS8vIE5PIE1PUkUgQ0hFQ0sgRk9SIERVUExJQ0FUSU9OIE9GIE5BTUUsIFBSRVNFTlRBVElPTiBOQU1FLCBPUiBMSU5LRUQgRUxFTUVOVAotCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBjbWQgPSBuZXcgRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kKAotCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHRhc2tEZXNjcmlwdG9ycywgdHJ1ZSk7Ci0JCQkJCWNtZC5zZXRMYWJlbChnZXRUZXh0KCkpOwotCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlib29sZWFuIHNob3cgPSB0cnVlOwotCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyBzdXBwcmVzcwotCQkJaWYgKGdldEFkYXB0ZXJGYWN0b3J5KCkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5zaXplKCk7IGkrKykgewotCQkJCQlpZiAoIShzZWxlY3Rpb24uZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgc2VsZWN0aW9uCi0JCQkJCQkJLmdldChpKSBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikpCi0JCQkJCQlzaG93ID0gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJc2hvdyA9IGZhbHNlOwotCi0JCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoc2hvdyk7Ci0JCQlzdXBwcmVzc1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChzaG93KTsKLQotCQkJLy8gZW5hYmxlIHN5bmNocm9uaXplIGFjdGlvbnMgY29ycmVjdGx5Ci0JCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIHN1cHByZXNzQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gTk8gTU9SRSBDSEVDSyBGT1IgRFVQTElDQVRJT04gT0YgTkFNRSwgUFJFU0VOVEFUSU9OIE5BTUUsIE9SIExJTktFRCBFTEVNRU5UCi0JCQkKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gaWYgKGdldFN1cHByZXNzaW9uKCkuc3VwcHJlc3Moc2VsZWN0aW9uKSkgewotCQkJCQkvLyBpZiAoaGFzSW5oZXJpdGVkKHNlbGVjdGlvbikpIHsKLQkJCQkJLy8gZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCQkvLyB9IGVsc2UgewotCQkJCQkvLyBlZGl0b3IuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCQkJLy8gfQotCQkJCQkvLyB9Ci0JCQkJCS8vIGVkaXRvci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0KLQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJZ2V0U3VwcHJlc3Npb24oKSwgc2VsZWN0aW9uLCB0cnVlKTsKLQkJCQkJY21kLnNldExhYmVsKGdldFRleHQoKSk7Ci0JCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJfQotCi0JCQl9KTsKLQotCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyBzdXBwcmVzcwotCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoc2VsZWN0aW9uKSk7Ci0JCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3Moc2VsZWN0aW9uKSk7Ci0KLQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uIHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24gPSBuZXcgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbigpOwotCi0JcHJvdGVjdGVkIElBY3Rpb24gcmV2ZWFsQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbCkgewotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChQcm9jZXNzRWRpdG9yLmNhblJldmVhbChzZWxlY3Rpb24sIGdldEFkYXB0ZXJGYWN0b3J5KCksIGdldFN1cHByZXNzaW9uKCkpKSB7Ci0JCQkJLy8gZmluYWwgUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikKLQkJCQkvLyBnZXRBY3RpdmVFZGl0b3IoKTsKLQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gaWYgKGdldFN1cHByZXNzaW9uKCkucmV2ZWFsKHNlbGVjdGlvbikpIHsKLQkJCQkJCS8vIGlmIChoYXNJbmhlcml0ZWQoc2VsZWN0aW9uKSkgewotCQkJCQkJLy8gZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJCS8vIGVkaXRvci5kb1JlZnJlc2hBbGwoZmFsc2UpOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWRpdG9yLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQotCQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJY21kLnNldExhYmVsKGdldFRleHQoKSk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCQkvLyB1cGRhdGUgY29udGV4dCBiYXIgbWVudSBhZnRlciBwZXJmb3JtaW5nIHJldmVhbAotCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHNlbGVjdGlvbikpOwotCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcygKLQkJCQkJCXNlbGVjdGlvbikpOwotCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGF1dG9TeW5jaHJvbml6ZQotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiByZXZlYWxUYXNrQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbF9UYXNrKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZmluYWwgTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JzKHNlbGVjdGlvbik7Ci0JCQlpZiAoUHJvY2Vzc0VkaXRvci5jYW5SZXZlYWwodGFza0Rlc2NyaXB0b3JzLCBnZXRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlnZXRTdXBwcmVzc2lvbigpKSkgewotCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQgY21kID0gbmV3IEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCgKLQkJCQkJCQkJZ2V0U3VwcHJlc3Npb24oKSwgdGFza0Rlc2NyaXB0b3JzLCBmYWxzZSk7Ci0JCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCQkJLy8gZW5hYmxlIHN5bmNocm9uaXplIGFjdGlvbnMgY29ycmVjdGx5Ci0JCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgc2VsZWN0ZWRBY3Rpdml0eSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIElBY3Rpb24gc3VwcHJlc3NEaWFncmFtQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMikgewotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlpZiAoIXN1cGVyLmlzRW5hYmxlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuICEoYnNJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcikKLQkJCQkJLmlzUmVhZE9ubHkoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoIXByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5nZXREaWFncmFtVHlwZVRleHQoKERpYWdyYW0pIG9iamVjdCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJQ29sbGVjdGlvbiBkaWFncmFtcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLmdldERpYWdyYW1zKHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJQXJyYXlMaXN0IHVuc3VwcHJlc3NlZERpYWdyYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJCWlmICghZGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJdW5zdXBwcmVzc2VkRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCX0KLQkJCX0KLQotCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhhY3RpdmVFZGl0b3IKLQkJCQkJLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBkaWFncmFtcywgY29udGVudFByb3ZpZGVyLAotCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2UpOwotCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyh1bnN1cHByZXNzZWREaWFncmFtcyk7Ci0JCQlkbGcKLQkJCQkJLnNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJT2JqZWN0W10gZGlhZ3JhbXNUb1JldmVhbCA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQotCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgcmVhbGx5IGFueSBjaGFuZ2UKLQkJCS8vCi0JCQlpZiAoZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGggPT0gdW5zdXBwcmVzc2VkRGlhZ3JhbXMuc2l6ZSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghdW5zdXBwcmVzc2VkRGlhZ3JhbXMuY29udGFpbnMoZGlhZ3JhbXNUb1JldmVhbFtpXSkpIHsKLQkJCQkJCWNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2hhbmdlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGg7IGkrKykgewotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbXNUb1JldmVhbFtpXTsKLQkJCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uRkFMU0UpOwotCQkJCX0KLQotCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCS8vCi0JCQkJc2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBuZXdTdXBwcmVzc0RpYWdyYW1BY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyKSB7Ci0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCWlmICghc3VwZXIuaXNFbmFibGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gIShic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkuaXNSZWFkT25seSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmICghcHJvbXB0U2F2ZUFjdGl2ZUVkaXRvcigpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCS8vIFRPRE86IENoYW5nZSB0byBleGFjdCBzdHJpbmcuCi0JCQkJCXJldHVybiBEaWFncmFtRWRpdG9ySGVscGVyCi0JCQkJCQkJLmdldERpYWdyYW1UeXBlU3RyaW5nKChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKSBvYmplY3QpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUNvbGxlY3Rpb24gZGlhZ3JhbXMgPSAoKFByb2Nlc3NFZGl0b3IpIGdldEFjdGl2ZUVkaXRvcigpKQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvckhlbHBlcigpLmdldERpYWdyYW1zKHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0+IHB1Ymxpc2hEaWFncmFtcyA9IG5ldyBBcnJheUxpc3Q8b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbT4oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJc3dpdGNoIChEaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKSB7Ci0JCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQkJaWYgKERpYWdyYW1PcHRpb25zLmlzUHVibGlzaEFEKHNlbGVjdGVkQWN0aXZpdHkpKSB7Ci0JCQkJCQlwdWJsaXNoRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCQlpZiAoRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoQUREKHNlbGVjdGVkQWN0aXZpdHkpKSB7Ci0JCQkJCQlwdWJsaXNoRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hXUEREKHNlbGVjdGVkQWN0aXZpdHkpKSB7Ci0JCQkJCQlwdWJsaXNoRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhhY3RpdmVFZGl0b3IKLQkJCQkJLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBkaWFncmFtcywgY29udGVudFByb3ZpZGVyLAotCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2UpOwotCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyhwdWJsaXNoRGlhZ3JhbXMpOwotCQkJZGxnCi0JCQkJCS5zZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0KLQkJCU9iamVjdFtdIGRpYWdyYW1zVG9SZXZlYWwgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0KLQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gY2hhbmdlZCA9IHRydWU7Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIHJlYWxseSBhbnkgY2hhbmdlCi0JCQkvLwotCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoID09IHB1Ymxpc2hEaWFncmFtcy5zaXplKCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFwdWJsaXNoRGlhZ3JhbXMuY29udGFpbnMoZGlhZ3JhbXNUb1JldmVhbFtpXSkpIHsKLQkJCQkJCWNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2hhbmdlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoRGlhZ3JhbUVkaXRvckhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKSkgewotCQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFEKHNlbGVjdGVkQWN0aXZpdHksIGZhbHNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBREQoc2VsZWN0ZWRBY3Rpdml0eSwgZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoV1BERChzZWxlY3RlZEFjdGl2aXR5LCBmYWxzZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGg7IGkrKykgewotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkgZGlhZ3JhbXNUb1JldmVhbFtpXTsKLQkJCQkJc3dpdGNoIChEaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKSB7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUQoc2VsZWN0ZWRBY3Rpdml0eSwgdHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUREKHNlbGVjdGVkQWN0aXZpdHksIHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoV1BERChzZWxlY3RlZEFjdGl2aXR5LCB0cnVlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCS8vCi0JCQkJc2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBuZXdBc3NpZ25Vc2VyRGlhZ3JhbSA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbSkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBUT0RPOiBuZWNlc3NhcnkgY2hhbmdlcyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cncyBEaWFncmFtSW5mby4KLQkJCVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBkaWFsb2cgPSBuZXcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nKAotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBhY3RpdmVFZGl0b3IsCi0JCQkJCXNlbGVjdGVkQWN0aXZpdHksIGdldFByb2Nlc3MoKS5nZXREZWZhdWx0Q29udGV4dCgpLCBUbmdVdGlsCi0JCQkJCQkJLmlzV3JhcHBlZChzZWxlY3RlZE9iamVjdCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gZGlhZ3JhbVB1Ymxpc2hOb25lID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXB1Ymxpc2hEaWFncmFtc0ZvclByb2Nlc3MoZmFsc2UpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBkaWFncmFtc1B1Ymxpc2hBbGwgPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXB1Ymxpc2hEaWFncmFtc0ZvclByb2Nlc3ModHJ1ZSk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gc3VwcHJlc3NBbGxEaWFncmFtcyA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzZXRBbGxEaWFncmFtU3VwcHJlc3NlZCh0cnVlKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiByZXZlYWxBbGxEaWFncmFtcyA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGwpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQoZmFsc2UpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGFkZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKAotCQkJCQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KQotCQkJCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IHNlbGVjdGlvbiA9IERpYWxvZ0hlbHBlci5zZWxlY3RFbGVtZW50c0ZvcigKLQkJCQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50LCBjb25maWcsCi0JCQkJCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQotCQkJCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCwKLQkJCQkJCQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpCi0JCQkJCQkJCQkuY3JlYXRlRHJvcENvbW1hbmQoCi0JCQkJCQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCwgc2VsZWN0aW9uKTsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9KTsKLQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGNvcHlBY3Rpdml0eUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5KSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEFjdGl2aXR5KQotCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQl9Ci0JCQlMaXN0IHNlbGVjdGlvbiA9IERpYWxvZ0hlbHBlci5zZWxlY3RBY3Rpdml0aWVzRm9yKHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCWNvbmZpZywgSUFjdGlvblR5cGVQcm92aWRlci5DT1BZKTsKLQotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0KLQkJCQkJCS8vIFByb2Nlc3MgcHJvYyA9Ci0JCQkJCQkvLyBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJCQkJCS8vIGlmIChEZXBlbmRlbmN5Q2hlY2tlci5oYXNDeWNsaWNEZXBlbmRlbmN5KGFjdCwgcHJvYykpCi0JCQkJCQkvLyB7Ci0JCQkJCQkvLyBPYmplY3RbXSBhcmdzID0geyBzZWxlY3RlZEFjdGl2aXR5LmdldE5hbWUoKSwKLQkJCQkJCS8vIGFjdC5nZXROYW1lKCkgfTsKLQkJCQkJCS8vIFN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS8vIC5iaW5kKAotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2csCi0JCQkJCQkvLyBhcmdzKTsKLQkJCQkJCS8vCi0JCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZTsKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLy8gLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBpdG9yLnJlbW92ZSgpOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWxzZSBpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdCkpIHsKLQkJCQkJCS8vIE9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotCQkJCQkJLy8gYWN0LmdldE5hbWUoKSB9OwotCQkJCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLy8gLmJpbmQoCi0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkvLyBhcmdzKTsKLQkJCQkJCS8vCi0JCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS8vIC5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8KLQkJCQkJCS8vIGl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkvLyByZXR1cm47Ci0JCQkJCQkvLyB9Ci0KLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIKLQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZChzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQlzZWxlY3Rpb24sIG51bGwsIGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBjbWQuY2hlY2tDb3B5KCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNtZC5zZXRUeXBlKElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSk7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGV4dGVuZEFjdGl2aXR5QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRBY3Rpdml0eSkKLQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJfQotCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0QWN0aXZpdGllc0ZvcihzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQljb25maWcsIElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EKTsKLQotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0KLQkJCQkJCS8vIFByb2Nlc3MgcHJvYyA9Ci0JCQkJCQkvLyBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJCQkJCS8vIGlmIChEZXBlbmRlbmN5Q2hlY2tlci5oYXNDeWNsaWNEZXBlbmRlbmN5KGFjdCwgcHJvYykpCi0JCQkJCQkvLyB7Ci0JCQkJCQkvLyBPYmplY3RbXSBhcmdzID0geyBzZWxlY3RlZEFjdGl2aXR5LmdldE5hbWUoKSwKLQkJCQkJCS8vIGFjdC5nZXROYW1lKCkgfTsKLQkJCQkJCS8vIFN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS8vIC5iaW5kKAotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2csCi0JCQkJCQkvLyBhcmdzKTsKLQkJCQkJCS8vCi0JCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZTsKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLy8gLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBpdG9yLnJlbW92ZSgpOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWxzZSBpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdCkpIHsKLQkJCQkJCS8vIE9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotCQkJCQkJLy8gYWN0LmdldE5hbWUoKSB9OwotCQkJCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLy8gLmJpbmQoCi0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkvLyBhcmdzKTsKLQkJCQkJCS8vCi0JCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS8vIC5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8KLQkJCQkJCS8vIGl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkvLyByZXR1cm47Ci0JCQkJCQkvLyB9Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0ID8KLQkJCQkJCSAqIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24KLQkJCQkJCSAqIChhY3QsIHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCQkgKiBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSA6Ci0JCQkJCQkgKiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsCi0JCQkJCQkgKiBzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCQkJCSAqLwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVja0FjdCA/IERlcGVuZGVuY3lDaGVja2VyCi0JCQkJCQkJCS5jaGVja0NpcmN1bGFyRm9yQXBwbHlpbmdWYXJpYWJpbGl0eUVsZW1lbnQoCi0JCQkJCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgYWN0LCB0cnVlKQotCQkJCQkJCQk6IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KAotCQkJCQkJCQkJCWFjdCwgc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cyk7Ci0JCQkJCQkJaXRvci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZChzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQlzZWxlY3Rpb24sIG51bGwsIGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBjbWQuY2hlY2tFeHRlbmQoKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQl0aXRsZSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY21kLnNldFR5cGUoSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQpOwotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBkZWVwQ29weUFjdGl2aXR5QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5KSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQWN0aXZpdHkpCi0JCQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQl9Ci0JCQkJCUxpc3Qgc2VsZWN0aW9uID0gRGlhbG9nSGVscGVyLnNlbGVjdEFjdGl2aXRpZXNGb3IoCi0JCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgY29uZmlnLAotCQkJCQkJCUlBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKTsKLQotCQkJCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCi0JCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0KLQkJCQkJCQkJLy8gUHJvY2VzcyBwcm9jID0KLQkJCQkJCQkJLy8gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJCQkJCS8vIGlmIChQcm9jZXNzVXRpbC5oYXNDeWNsaWNEZXBlbmRlbmN5KGFjdCwKLQkJCQkJCQkJLy8gcHJvYykpIHsKLQkJCQkJCQkJLy8gT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0JCQkJCQkJCS8vIGFjdC5nZXROYW1lKCkgfTsKLQkJCQkJCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkvLyAuYmluZCgKLQkJCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2csCi0JCQkJCQkJCS8vIGFyZ3MpOwotCQkJCQkJCQkvLwotCQkJCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotCQkJCQkJCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLy8gLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOwotCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIGl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkJCS8vIH0KLQotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyCi0JCQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwKLQkJCQkJCQkJCQkJCXNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJCQkJCQkJCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURyb3BDb21tYW5kKAotCQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIHNlbGVjdGlvbiwgbnVsbCwKLQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLG5ldyBBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKGNvbmZpZykpOwotCQkJCQljbWQuc2V0VHlwZShJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSk7Ci0JCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGVkT2JqZWN0OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gZXhwYW5kQWxsQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWwpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmN1cnJlbnRWaWV3ZXI7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJCSgoVHJlZVZpZXdlcikgdmlld2VyKS5leHBhbmRUb0xldmVsKHNlbGVjdGVkT2JqZWN0LAotCQkJCQkJQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGNvbGxhcHNlQWxsQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWwpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmN1cnJlbnRWaWV3ZXI7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJCSgoVHJlZVZpZXdlcikgdmlld2VyKS5jb2xsYXBzZVRvTGV2ZWwoc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQlBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIFN5bmNocm9uaXphdGlvbkFjdGlvbiBtYW51YWxTeW5jaHJvbml6ZUFjdGlvbiA9IG5ldyBTeW5jaHJvbml6YXRpb25BY3Rpb24oKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN1cGVyLnJ1bigpOwotCi0JCQkvLyByZWZyZXNoIHByb3BlcnRpZXMgdmlldyBhZnRlciBzeW5jaAotCQkJRVBGUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChFUEZQcm9wZXJ0eVNoZWV0UGFnZSkgKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJCS5nZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uIGF1dG9TeW5jaHJvbml6ZSA9IG5ldyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uKCkgewotCQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCQlzdXBlci5ydW4oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQlpZiAoIUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9kZWZhdWx0U3luY2hyb25pemF0aW9uLAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCS8vICgoU3luY2hyb25pemVDb21tYW5kKWNvbW1hbmQpLnNldFVJQ29udGV4dChnZXRBY3RpdmVFZGl0b3IoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCXN1cGVyUnVuKCk7Ci0KLQkJCQkJLy8gcmVmcmVzaCBwcm9wZXJ0aWVzIHZpZXcgYWZ0ZXIgc3luY2gKLQkJCQkJRVBGUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChFUEZQcm9wZXJ0eVNoZWV0UGFnZSkgKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJCQkJLmdldFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gc2hvd0luTGlicmFyeVZpZXcgPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3LAotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJImZ1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50LmdpZiIpKSB7IC8vJE5PTi1OTFMtMSQgICAvLykgCi0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZmluYWwgT2JqZWN0IGxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoCi0JCQkJCQkJCWxpbmtlZEVsZW1lbnQpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBhc3NpZ25Vc2VyRGlhZ3JhbSA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbSkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cgZGlhbG9nID0gbmV3IFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZygKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgYWN0aXZlRWRpdG9yLAotCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBnZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKSwgVG5nVXRpbAotCQkJCQkJCS5pc1dyYXBwZWQoc2VsZWN0ZWRPYmplY3QpKTsKLQotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCX07Ci0KLQkvLyBwcml2YXRlIElBY3Rpb24gYWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mbyA9IG5ldwotCS8vIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24oKXsKLQkvLyBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkvLyByZXR1cm4gc2VsZWN0ZWRBY3Rpdml0eTsKLQkvLyB9Ci0JLy8gcHVibGljIElXb3JrYmVuY2hQYWdlIGdldFBhZ2V4KCkgewotCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkvLyByZXR1cm4gZ2V0UGFnZSgpOwotCS8vIH0KLQkvLyB9OwotCi0JcHJpdmF0ZSBib29sZWFuIG9sZExvY2tlZDsKLQotCXByaXZhdGUgSW5kZW50QWN0aW9uIGluZGVudEFjdGlvbiA9IG5ldyBJbmRlbnRBY3Rpb24oKSB7Ci0JCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmICghaXNFZGl0aW5nQWxsb3dlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgT3V0ZGVudEFjdGlvbiBvdXRkZW50QWN0aW9uID0gbmV3IE91dGRlbnRBY3Rpb24oKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAoIWlzRWRpdGluZ0FsbG93ZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgUHJvY2Vzc0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcihBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yKTsKLQotCQkvLyBkb24ndCBzaG93IHZhbGlkYXRlIGFjdGlvbgotCQkvLwotCQl2YWxpZGF0ZUFjdGlvbiA9IG51bGw7Ci0KLQkJLy8gc2V0IGRpc2FibGVkIGltYWdlIGRlc2NyaXB0b3JzCi0JCXNob3dJbkxpYnJhcnlWaWV3LnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCi0JfQotCi0JcHVibGljIFByb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcihTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRGlhZ3JhbShpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJdHJ5IHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBEaWFncmFtRWRpdG9ySW5wdXQoCi0JCQkJCXNlbGVjdGVkT2JqZWN0LCBnZXRTdXBwcmVzc2lvbigpLCBkaWFncmFtVHlwZSk7Ci0JCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihnZXRQYWdlKCksIGlucHV0LAotCQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoZGlhZ3JhbVR5cGUpLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJlZ2lzdGVyZWRBY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKLQkJCXJlZ2lzdGVyZWRBY3Rpb25zLmFkZChhY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBY3Rpb25zKCkgewotCQlyZWdpc3RlckFjdGlvbihhdXRvU3luY2hyb25pemUpOwotCQlyZWdpc3RlckFjdGlvbihtYW51YWxTeW5jaHJvbml6ZUFjdGlvbik7Ci0JCXJlZ2lzdGVyQWN0aW9uKHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24pOwotCQlyZWdpc3RlckFjdGlvbihpbmRlbnRBY3Rpb24pOwotCQlyZWdpc3RlckFjdGlvbihvdXRkZW50QWN0aW9uKTsKLQkJcmVnaXN0ZXJBY3Rpb24obW92ZURvd25BY3Rpb24pOwotCQlyZWdpc3RlckFjdGlvbihtb3ZlVXBBY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJOiBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA/IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uCi0JCQkJOiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JCWJvb2xlYW4gZWRpdGluZ0FsbG93ZWQgPSBpc0VkaXRpbmdBbGxvd2VkKCk7Ci0JCWZvciAoSUFjdGlvbiBhY3Rpb24gOiByZWdpc3RlcmVkQWN0aW9ucykgewotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIENvbW1hbmRBY3Rpb25IYW5kbGVyKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoKChDb21tYW5kQWN0aW9uSGFuZGxlcikgYWN0aW9uKQotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBJTW9kaWZ5aW5nQWN0aW9uKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZWRpdGluZ0FsbG93ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0UHJvY2VzcyhnZXRQcm9jZXNzKCkpOwotCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVFZGl0b3IKLQkJCQk6IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVnaXN0ZXJlZEFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWN0aW9uID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVdvcmtiZW5jaFBhcnRBY3Rpb24pIHsKLQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pCi0JCQkJCQkuc2V0QWN0aXZlV29ya2JlbmNoUGFydChhY3RpdmVFZGl0b3IpOwotCQkJfQotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgYWN0aW9uKTsKLQkJCX0KLQkJfQotCQlzdXBlci5hY3RpdmF0ZSgpOwotCi0JCS8vIGNhbGwgc2V0IEFjdGl2ZSBwYWdlIGV4cGxpY2l0bHkgaW4gb3JkZXIgdG8gZ2V0IGNvcnJlY3QgYWN0aW9uCi0JCS8vIGJhcnMKLQkJc2V0QWN0aXZlUGFnZShhY3RpdmVFZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNkZWFjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJOiBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVnaXN0ZXJlZEFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWN0aW9uID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVdvcmtiZW5jaFBhcnRBY3Rpb24pIHsKLQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pLnNldEFjdGl2ZVdvcmtiZW5jaFBhcnQobnVsbCk7Ci0JCQl9Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgewotCQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBhY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycyk7Ci0JCXJlZ2lzdGVyQWN0aW9ucygpOwotCQljb250cmlidXRlVG9Ub29sQmFyKGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGFjdGl2ZUVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGZpbmFsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOwotCi0JCWlmICghQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJdGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGdldFByb2Nlc3MoKSwKLQkJCQkJCXN1cHByZXNzZWQpOwotCQkJCWRvU2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBwdWJsaXNoRGlhZ3JhbXNGb3JQcm9jZXNzKGZpbmFsIGJvb2xlYW4gcHVibGlzaCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOwotCi0JCWlmICghQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJdGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGdldFByb2Nlc3MoKSkgewotCi0JCQkJCS8qKgotCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYxODk0OTAxNDQ3NjM3MTExNEw7Ci0KLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBRChhY3Rpdml0eSwgcHVibGlzaCk7Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUREKGFjdGl2aXR5LCBwdWJsaXNoKTsKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hXUEREKGFjdGl2aXR5LCBwdWJsaXNoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJZG9TYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyOwotCQlpZiAoYWN0aXZlRWRpdG9yLmlzRGlydHkoKSkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCS8vCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRvU2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLnJlc291cmNlc1RvU2F2ZS5hZGQoZ2V0UHJvY2VzcygpCi0JCQkJLmVSZXNvdXJjZSgpKTsKLQkJYWN0aXZlRWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJcHJvdGVjdGVkIHZvaWQgc2F2ZUN1cnJlbnRFZGl0b3IoKSB7Ci0JCQkJaWYgKGFjdGl2ZUVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJYWN0aXZlRWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCQkJLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGlkID0gYWN0aXZlUGFnZS5nZXRJZCgpOwotCQkJCQlpZiAoaWQgPT0gUHJvY2Vzc0VkaXRvci5XQlNfRk9STV9JRAotCQkJCQkJCXx8IGlkID09IFByb2Nlc3NFZGl0b3IuVEFfRk9STV9JRAotCQkJCQkJCXx8IGlkID09IFByb2Nlc3NFZGl0b3IuV1BCU19GT1JNX0lECi0JCQkJCQkJfHwgaWQgPT0gUHJvY2Vzc0VkaXRvci5DT05TT0xJREFURURfRk9STV9JRCkgewotCQkJCQkJLy8gZm9yIGFsbCBvdGhlciBwYWdlcywgZGlzYWJsZSBERUxFVEUKLQkJCQkJCXN1cGVyLnJ1bigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDdXRBY3Rpb24gY3JlYXRlQ3V0QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEN1dEFjdGlvbigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKFByb2Nlc3NEZWxldGVBY3Rpb24KLQkJCQkJCS5maWx0ZXJTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCWJvb2xlYW4gdW5leGVjdXRhYmxlID0gZmFsc2U7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQl1bmV4ZWN1dGFibGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh1bmV4ZWN1dGFibGUpIHsKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhc3RlQWN0aW9uKCkgewotCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oUHJvY2Vzc0RlbGV0ZUFjdGlvbgotCQkJCQkJLmZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBPdmVycmlkZWQgdG8gdXNlIFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZAotCQkJICovCi0JCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQlyZXR1cm4gbmV3IFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKGRvbWFpbiwKLQkJCQkJCQlzZWxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCksIG51bGwsCi0JCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ29weUFjdGlvbigpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkJCQkucmVzZXRDb3B5TWFwcygpOwotCQkJCX0KLQkJCQlzdXBlci5ydW4oKTsKLQkJCX0KLQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhZGRHbG9iYWxBY3Rpb25zKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBuZXcgU2VwYXJhdG9yKCJmaXhlZC1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLyBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsCi0JCS8vIGluc2VydE5ld1BoYXNlQWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlzaG93SW5MaWJyYXJ5VmlldwotCQkJCS5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXcpOwotCQl0b29sQmFyTWFuYWdlci5hZGQobW92ZVVwQWN0aW9uKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG1vdmVEb3duQWN0aW9uKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGluZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChvdXRkZW50QWN0aW9uKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKHNob3dJbkxpYnJhcnlWaWV3KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRpbmdBbGxvd2VkKCkgewotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCS5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJcmV0dXJuICEoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSAmJiAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgYWN0aXZlUGFnZSkKLQkJCQkuYmFzaWNJc1JlYWRPbmx5KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCS5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJaWYgKCFpc0VkaXRpbmdBbGxvd2VkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAotCQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQkJbWVudU1hbmFnZXIuYWRkKHNob3dJbkxpYnJhcnlWaWV3KTsKLQkJCWlmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkvLyAmJiAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikKLQkJCS8vIGJzSXRlbVByb3ZpZGVyKS5oYXNDaGlsZHJlbihzZWxlY3RlZE9iamVjdCkKLQkJCSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChleHBhbmRBbGxBY3Rpb24pOwotCQkJCW1lbnVNYW5hZ2VyLmFkZChjb2xsYXBzZUFsbEFjdGlvbik7Ci0JCQl9Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChyZWZyZXNoVmlld2VyQWN0aW9uKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yOwotCi0JCWlmIChzZWxlY3RlZEFjdGl2aXR5ID09IG51bGwKLQkJCQkmJiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gbnVsbCB8fCBzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkpIHsKLQkJCS8vIGZha2UgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IHdpdGggdGhlIHByb2Nlc3Mgc2VsZWN0ZWQgaWYgbm8KLQkJCS8vIGVsZW1lbnQgaXMgc2VsZWN0ZWQgeWV0LgotCQkJLy8KLQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwKLQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0UHJvY2VzcygpKSkpOwotCQl9Ci0JCS8vIGRpc2FibGUgYWxsIG5ldyBhY3Rpb24gaWYgaXQncyByb2xsZWQgdXAKLQkJYm9vbGVhbiBpc1JvbGxlZFVQID0gYnNJdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCSYmIGJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJc3VwZXIuc2V0RW5hYmxlZCghaXNSb2xsZWRVUCk7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0KLQkJLy8gYWRkIG1hcmtlcnMKLQkJLy8KLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImZpeGVkLWFkZGl0aW9ucyIsIG5ldyBTZXBhcmF0b3IoInByZWZlcmVuY2UiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgicHJlZmVyZW5jZSIsIHByZWZlcmVuY2VBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImZpeGVkLWFkZGl0aW9ucyIsIG5ldyBTZXBhcmF0b3IoIm9wZW4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmIChic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJJiYgVG5nVXRpbC51bndyYXAoYnNJdGVtUHJvdmlkZXIpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJY29udHJpYnV0ZUFjdGlvbik7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCXJlcGxhY2VBY3Rpb24pOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQlsb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHkpOwotCQl9Ci0KLQkJaWYgKCFpc1JvbGxlZFVQKSB7Ci0JCQlpZiAoY3JlYXRlQ2hpbGRBY3Rpb25zICE9IG51bGwgJiYgIWNyZWF0ZUNoaWxkQWN0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoCi0JCQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWRkQWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXZlYWxBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgcmV2ZWFsQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHN1cHByZXNzQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHN1cHByZXNzQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghaXNSb2xsZWRVUCkgewotCQkJaWYgKHN1cHByZXNzVGFza0FjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgc3VwcHJlc3NUYXNrQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJldmVhbFRhc2tBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHJldmVhbFRhc2tBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgKLQkJCQkJImZpeGVkLWFkZGl0aW9ucyIsIHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCAhPSBudWxsKSAmJiAoYnNJdGVtUHJvdmlkZXIgIT0gbnVsbCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgbW92ZVVwQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBtb3ZlRG93bkFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEluZGVudC9vdXRkZW50Ci0JCS8vCi0JCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgaW5kZW50QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBvdXRkZW50QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBzaG93SW5MaWJyYXJ5Vmlldyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCkgJiYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpKSB7Ci0JCQlpZiAoYnNJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJcm9sbHVwQWN0aW9uCi0JCQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bik7Ci0JCQl9IGVsc2UgewotCQkJCXJvbGx1cEFjdGlvbgotCQkJCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwKTsKLQkJCX0KLQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCByb2xsdXBBY3Rpb24pOyAvLyROT04tTkxTLTEkCQkJCQotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCS8vICJSZXVzZSIgbWVudQotCQkJLy8KLQkJCU1lbnVNYW5hZ2VyIHJldXNlU3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuKTsKLQkJCXJldXNlU3ViTWVudS5hZGQoY29weUFjdGl2aXR5QWN0aW9uKTsKLQkJCXJldXNlU3ViTWVudS5hZGQoZXh0ZW5kQWN0aXZpdHlBY3Rpb24pOwotCQkJcmV1c2VTdWJNZW51LmFkZChkZWVwQ29weUFjdGl2aXR5QWN0aW9uKTsKLQotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQlyZXVzZVN1Yk1lbnUpOwotCQl9Ci0KLQkJaWYgKGF1dG9TeW5jaHJvbml6ZS5pc0VuYWJsZWQoKSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQlhdXRvU3luY2hyb25pemUpOwotCQl9Ci0JCWlmIChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbik7Ci0JCX0KLQotCQlpZiAoIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpKSB7Ci0JCQkvLyBNZW51TWFuYWdlciBkaWFncmFtU3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zKTsKLQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgb3BlbkJhc2VBY3Rpdml0eSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvLyBkaWFncmFtU3ViTWVudS5hZGQob3BlbldvcmtmbG93RWRpdG9yQWN0aW9uKTsKLQkJCQkvLyBkaWFncmFtU3ViTWVudS5hZGQob3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uKTsKLQkJCQkvLyBkaWFncmFtU3ViTWVudS5hZGQob3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbik7Ci0JCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKHN1cHByZXNzRGlhZ3JhbUFjdGlvbik7Ci0JCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKGFzc2lnblVzZXJEaWFncmFtKTsKLQkJCX0KLQkJCS8vIGlmIChzZWxlY3RlZEFjdGl2aXR5ID09IGdldFByb2Nlc3MoKSkgewotCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKHN1cHByZXNzQWxsRGlhZ3JhbXMpOwotCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKHJldmVhbEFsbERpYWdyYW1zKTsKLQkJCS8vIH0KLQkJCS8vIEVuYWJsZSB0aGlzIGNvZGUgaWYgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0RpYWxvZyBpcyBuZWVkLgotCQkJLy8gaWYoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKXsKLQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm8pOwotCQkJLy8gfQotCQkJLy8gbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIGRpYWdyYW1TdWJNZW51KTsgLy8kTk9OLU5MUy0xJAotCi0JCQlNZW51TWFuYWdlciBuZXdEaWFncmFtU3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXMpOyAKLQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QWN0aXZpdHlEaWFncmFtRWRpdG9yKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3V1BEaWFncmFtRWRpdG9yKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3U3VwcHJlc3NEaWFncmFtQWN0aW9uKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QXNzaWduVXNlckRpYWdyYW0pOwotCi0JCQl9Ci0KLQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5ID09IGdldFByb2Nlc3MoKSkgewotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChkaWFncmFtc1B1Ymxpc2hBbGwpOwotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChkaWFncmFtUHVibGlzaE5vbmUpOwotCQkJfQotCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIG5ld0RpYWdyYW1TdWJNZW51KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwKLQkJLy8gdGhpcyBpcyBhbiBleHBlbnNpdmUgY2hlY2ssIHJlbW92ZWQgaXQKLQkJLy8KLQkJLy8gJiYgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpCi0JCS8vIGJzSXRlbVByb3ZpZGVyKS5oYXNDaGlsZHJlbihzZWxlY3RlZE9iamVjdCkKLQkJKSB7Ci0JCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgZXhwYW5kQWxsQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIGNvbGxhcHNlQWxsQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBhY3RpdmVFZGl0b3IKLQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0TWV0aG9kRWxlbWVudCgpKS5nZXRQcm9jZXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLnN1cHByZXNzaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCS8vCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBudWxsOwotCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFjdGlvbiBzdGF0ZSB0byBlbmFibGVkIG9yIGRpc2FibGVkCi0JICogCi0JICogQHBhcmFtIGxvY2tlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEFjdGlvblN0YXRlKCkgewotCQlpZiAobG9ja2VkKSB7Ci0JCQkvLyBkaXNhYmxlIG1vZGlmeWluZyBhY3Rpb25zCi0JCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWN1dEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQotCQkJZm9yKElBY3Rpb24gYWN0aW9uIDogcmVnaXN0ZXJlZEFjdGlvbnMpIHsKLQkJCQlpZihhY3Rpb24gaW5zdGFuY2VvZiBJTW9kaWZ5aW5nQWN0aW9uKSB7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIW9sZExvY2tlZCkgewotCQkJLy8gdXBkYXRlIHN0YXRlIG9mIG1vZGlmeWluZyBhY3Rpb25zCi0JCQkvLwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQljdXRBY3Rpb24uc2V0RW5hYmxlZChjdXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChwYXN0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJCi0JCQlmb3IoSUFjdGlvbiBhY3Rpb24gOiByZWdpc3RlcmVkQWN0aW9ucykgewotCQkJCWlmKGFjdGlvbiBpbnN0YW5jZW9mIElNb2RpZnlpbmdBY3Rpb24pIHsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoYWN0aW9uIGluc3RhbmNlb2YgQ29tbWFuZEFjdGlvbkhhbmRsZXIgPyAKLQkJCQkJCQkoKENvbW1hbmRBY3Rpb25IYW5kbGVyKWFjdGlvbikudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikgOiB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCi0JCWFkZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQljb250cmlidXRlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJLy8gc3RhdGUgb2YgdGhlc2UgYWN0aW9ucyBpcyBzZXQgaW4gdXBkYXRlQWN0aW9ucygpCi0JCS8vCi0JCS8vIG1vdmVEb3duQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCS8vIG1vdmVVcEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkvLyByZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJcmVwbGFjZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlsb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJcmV2ZWFsQWxsRGlhZ3JhbXMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJc3VwcHJlc3NBbGxEaWFncmFtcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlzdXBwcmVzc0RpYWdyYW1BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJY29weUFjdGl2aXR5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWV4dGVuZEFjdGl2aXR5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWRlZXBDb3B5QWN0aXZpdHlBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGxvY2tlZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKGRlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKGRlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUlTZWxlY3Rpb24gc2VsID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCQkJb2xkTG9ja2VkID0gbG9ja2VkOwotCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQotCQkJc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS50b0xpc3QoKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQlzZWxlY3RlZE9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkT2JqZWN0KTsKLQkJCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBvYmo7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXNlbGVjdGVkQWN0aXZpdHkgPSAoQWN0aXZpdHkpIG9iajsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBkZXBvcHVsYXRlRHluYW1pY01lbnVJdGVtcygpOwotCQkJCQkvLyBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJCXNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCQkJCX0KLQkJCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluID0gKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3IpCi0JCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCU9iamVjdCBwcm92aWRlck9iaiA9IGRvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQkJc2VsZWN0ZWRPYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHByb3ZpZGVyT2JqIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKQotCQkJCQlic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHByb3ZpZGVyT2JqOwotCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIG9iajsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKTsKLQkJCQlic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJCQlzZWxlY3RlZEFjdGl2aXR5ID0gbnVsbDsKLQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCQkJCXNlbGVjdGVkT2JqZWN0ID0gbnVsbDsKLQkJCX0KLQotCQkJdXBkYXRlQWN0aW9ucygpOwotCi0JCX0gZWxzZSB7Ci0JCQlkZXBvcHVsYXRlRHluYW1pY01lbnVJdGVtcygpOwotCQkJYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJCXNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gbnVsbDsKLQkJfQotCi0JCS8vIC8vIHRlc3QgY29kZQotCQkvLyAvLwotCQkvLyBpZihzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0KLQkJLy8gc2VsZWN0ZWRBY3Rpdml0eS5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJLy8gaWYoU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYXR0cmliLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpKSkKLQkJLy8gewotCQkvLyBMaXN0IHZhbHVlcyA9Ci0JCS8vIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0U3RyaW5nQXR0cmlidXRlKHNlbGVjdGVkQWN0aXZpdHksIGF0dHJpYik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oYXR0cmliLmdldE5hbWUoKSArICI6ICIgKyB2YWx1ZXMpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgYWN0aW9ucyBpbmNsdWRpbmcgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZW0gYmFzZWQgb24gc2VsZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWN0aW9ucygpIHsKLQkJc2hvd0luTGlicmFyeVZpZXcKLQkJCQkuc2V0RW5hYmxlZChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yCi0JCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCkgIT0gbnVsbCk7Ci0KLQkJaWYgKCFsb2NrZWQgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsJCQkJCi0JCQkJT2JqZWN0IG8gPSBzZWxlY3Rpb24uZ2V0KDApOwotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQlpZihQcm9jZXNzVXRpbC5pc1JvbGxlZFVwRGVzY3JpcHRvcihvLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChnZXRTdXBwcmVzc2lvbigpLmNhblJldmVhbChzZWxlY3Rpb24pKSB7Ci0JCQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9IGVsc2UgaWYgKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3Moc2VsZWN0aW9uKSkgewotCQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblJldmVhbChzZWxlY3Rpb24pKTsKLQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3MoCi0JCQkJCQlzZWxlY3Rpb24pKTsKLQkJCX0KLQotCQkJLy8gQWN0aW9uIEVuYWJsZS9EaXNhYmxlIGZvciBTdXBwcmVzcyBUYXNrL1JldmVhbCBUYXNrIGNvbnRleHQgbWVudQotCQkJYm9vbGVhbiBzaG93ID0gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKGdldEFkYXB0ZXJGYWN0b3J5KCkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCQkJaWYgKCEoc2VsZWN0aW9uLmdldChpKSBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IHNlbGVjdGlvbgotCQkJCQkJCS5nZXQoaSkgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJCQlzaG93ID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlzaG93ID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2hvdykgewotCQkJCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcnMoc2VsZWN0aW9uKTsKLQkJCQlzdXBwcmVzc1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblN1cHByZXNzKAotCQkJCQkJdGFza0Rlc2NyaXB0b3JzKSk7Ci0JCQkJcmV2ZWFsVGFza0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKAotCQkJCQkJdGFza0Rlc2NyaXB0b3JzKSk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cHByZXNzVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQkvLyBib29sZWFuIGhhc0luaGVyaXRlZCA9IGZhbHNlOwotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQkJCS8vIGlmIChpdGVtIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCS8vICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZW0pCi0JCQkvLyAuaXNSZWFkT25seSgpKSB7Ci0JCQkvLyBoYXNJbmhlcml0ZWQgPSB0cnVlOwotCQkJLy8gYnJlYWs7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uLnNldEVuYWJsZWQoaGFzSW5oZXJpdGVkKTsKLQkJfSBlbHNlIHsKLQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV2ZWFsVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCS8vIFNldCBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBBY3Rpb24gZW5hYmxlIHN0YXRlLgotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCXx8IHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0vLwkJCXNldEFjdGlvblN0YXRlRm9yQUREKCk7Ci0JCQlzZXREaWFncmFtc0NvbnRleHRNZW51U3RhdGUoKTsKLQkJfQotCi0JCS8vIGNoYW5nZSBhY3Rpb24gc3RhdGUgZm9yIGxvY2tlZCBwbHVnaW4KLQkJc2V0QWN0aW9uU3RhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJaWYgKHRoaXMuYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCWludCBwYWdlID0gKChQcm9jZXNzRWRpdG9yKSB0aGlzLmFjdGl2ZUVkaXRvcikuZ2V0QWN0aXZlUGFnZSgpOwotCQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IHRoaXMuYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCQkuZ2V0QWN0aW9uQmFycygpOwotCi0JCQkvLyBUT0RPIC0gbmVlZCB0byBnZXQgSUZvcm1QYWdlIGFuZCBjb21wYXJlIG9uIHRoYXQgcmF0aGVyIHRoYW4KLQkJCS8vIGludGVnZXIgcGFnZSBpZC4gVGhlc2UgaWQgd2lsbCBjaGFuZ2UgaWYgd2UgcmVwb3NpdGlvbiBwYWdlcy4KLQkJCWlmIChwYWdlID09IDApIHsJCQkKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQkJCW51bGwpOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQkJCW51bGwpOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJCQkJCW51bGwpOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQkJCW51bGwpOwotCQkJfSBlbHNlIGlmIChwYWdlID09IDQpIHsKLQkJCQlhY3Rpb25CYXJzLmNsZWFyR2xvYmFsQWN0aW9uSGFuZGxlcnMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCQkJZGVsZXRlQWN0aW9uKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwKLQkJCQkJCWN1dEFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotCQkJCQkJY29weUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQkJCXBhc3RlQWN0aW9uKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksCi0JCQkJCQl1bmRvQWN0aW9uKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJCQlyZWRvQWN0aW9uKTsKLQkJCX0KLQkJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzdXBlckRvUmVmcmVzaCgpIHsKLQkJc3VwZXIuZG9SZWZyZXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoKCkgewotCQlpZiAoYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZGlzcGxheSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyB1cGRhdGUgSURzCi0JCQkJCS8vCi0JCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCQl8fCBhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQkJCVByb2Nlc3MgcHJvYyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0vLwkJCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLS8vCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWZyZXNoUHJlZGVjY2Vzc29yTGlzdHMoKSB0b29rOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotCQkJCQl9Ci0KLQkJCQkJc3VwZXJEb1JlZnJlc2goKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiBTZXQgQWN0aW9uIHN0YXRlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBpbiBDb250ZXh0IE1lbnUgb24gc2VsZWN0aW9uCi0JICogb2YgQWN0aXZpdHkuIElmIGFuIEFjdGl2aXR5IGNvbnNpc3QgYXRsZWFzdCBvbmUgdGFza2Rlc2NyaXB0b3IgYW5kIGl0cwotCSAqIHByaW1hcnkgcGVyZm9ybWVyIGluIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgdGhlbiBzdGF0ZSBpcyBlbmFibGVkIGVsc2UKLQkgKiBzdGF0ZSBpcyBkaXNhYmxlZCBpbiBjb250ZXh0IG1lbnUgKHByb2Nlc3MgZWRpdG9yKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpb25TdGF0ZUZvckFERCgpIHsKLQotCQkvLyBzZXQgQUREIEFjdGlvbiBzdGF0ZSBmYWxzZQotCQlvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJLy8gc2V0IEFEIEFjdGlvbiBzdGF0ZSB0cnVlIGFsd2F5cwotCQlvcGVuV29ya2Zsb3dFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkvLyBzZXQgV1BEIERpYWdyYW0gTWVudSBBY3Rpb24gc3RhdGUgdHJ1IGFsd2F5cwotCQlvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0ICE9IG51bGwpIHsKLQotCQkJaWYgKGdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKHNlbGVjdGVkT2JqZWN0KSkgewotCQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlvcGVuV29ya2Zsb3dFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJb3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0eSA9IHNlbGVjdGVkQWN0aXZpdHk7Ci0JCQl9IGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpICgoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZE9iamVjdCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKGFjdGl2aXR5ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BKSkgewotCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCS8vIElmIEFjdGl2aXR5IGlzIHNldCB0byBsb2NhbCBjb250cmlidXRpb24sCi0JCQkJLy8gbmVlZCB0byBnZXQgYnJlYWtkb3duIGVsZW1lbnRzIG9mIGxvY2FsIGNvbnRyaWJ1dGVkCi0JCQkJLy8gYWN0aXZpdHkgKyBiYXNlIGFjdGl2aXR5LiBBbmQgYmFzZSBhY3Rpdml0eSBicmVha2Rvd24KLQkJCQkvLyBlbGVtZW50cwotCQkJCS8vIGFyZSBjb2xsZWN0ZWQgYWZ0ZXIgd2hpbGUgbG9vcCBlbmRzKQotCQkJCS8vIGlmIChWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTC5lcXVhbHMoYWN0aXZpdHkKLQkJCQkvLyAuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJLy8gbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCQkJLy8gfQotCQkJCWxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCi0JCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHZlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gRm9yIEFEIGRpYWdyYW0gbWVudSBvcHRpb24sIGlmIEJhc2UgQWN0aXZpdHkgZG9ub3QgaGF2ZSBhbnkKLQkJCS8vIEFEIGRpYWdyYW0sIGRvbm90IHNob3cgQUQgZGlhZ3JhbSBvcHRpb24gaW4gY29udGV4dCBtZW51IGZvcgotCQkJLy8gcmVhZG9ubHkgYWN0aXZpdHkuCi0JCQlEaWFncmFtIGRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCWFjdGl2aXR5LCBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlvcGVuV29ya2Zsb3dFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCS8vIEZvciBXUEQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJLy8gV1BEIGRpYWdyYW0sIGRvbm90IHNob3cgV1BEIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudQotCQkJLy8gZm9yIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJZGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbSgKLQkJCQkJYWN0aXZpdHksCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSwgZmFsc2UpOwotCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkmJiBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCW9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCS8vIENvbGxlY3QgdGhlIGJyZWFrZG93biBlbGVtZW50cyB0byB2ZXJpZnR5IHRhc2tkZXNjcmlwdG9ycyBhcmUKLQkJCS8vIG5vdC4KLQkJCWxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCi0JCQkvLyBGb3IgQUREIGRpYWdyYW0gbWVudSBvcHRpb24sIGlmIEJhc2UgQWN0aXZpdHkgZG9ub3QgaGF2ZSBhbnkKLQkJCS8vIEFERCBkaWFncmFtLCBkb25vdCBzaG93IEFERCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCS8vIGZvcgotCQkJLy8gcmVhZG9ubHkgYWN0aXZpdHkuCi0JCQlkaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQlhY3Rpdml0eSwgR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwKLQkJCQkJZmFsc2UpOwotCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkmJiBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBMaXN0LCB0byBmaW5kIHRhc2tkZXNjcmlwdG9yIGFuZCBoYXMKLQkJCQkvLyBwcmltYXJ5IHJvbGUgd2l0aGluIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgYWN0aW9uLgotCQkJCWZpbmRSb2xlRGVzYzoKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJaWYgKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvYmopKSB7Ci0JCQkJCQkJTGlzdDxSb2xlRGVzY3JpcHRvcj4gcHJpbWFyeVBlcmZvcm1lcnMgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCQkJCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluID0gKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3IpCi0JCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBkb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJCQlpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCQkJCQlJRmlsdGVyIGZpbHRlciA9ICgoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3J5KQotCQkJCQkJCQkJCS5nZXRGaWx0ZXIoKTsKLQkJCQkJCQkJZm9yIChSb2xlRGVzY3JpcHRvciBlIDogcHJpbWFyeVBlcmZvcm1lcnMpIHsKLQkJCQkJCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIuYWNjZXB0KGUpCi0JCQkJCQkJCQkJCSYmICFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCQkJCQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbgotCQkJCQkJCQkJCQkJLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZFJvbGVEZXNjOwotCQkJCQkJCQkJfQkJCQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBTZXQgQWN0aW9uIHN0YXRlIGZvciBPcGVuIERpYWdyYW0gQWN0aW9ucyBpbiBDb250ZXh0IE1lbnUgb24KLQkgKiBzZWxlY3Rpb24gb2YgQWN0aXZpdHkuIENoZWNraW5nIGNvbmRpdGlvbiB0byBoYW5kbGUgaWYgYWN0aXZpdHkgc3VwcHJlc3NlZCwgaWYgYWN0aXZpdHkgZG9uJ3QgaGF2ZQotCSAqIGFueSB0YXNrZGVzY3JpcHRvciBhbmQgcHJpbWFyeSBwZXJmb3JtZXIsIGlmIGJhc2UgYWN0aXZpdHkgZG9uJ3QgaGF2ZSBkaWFncmFtLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RGlhZ3JhbXNDb250ZXh0TWVudVN0YXRlKCkgewotCi0JCS8vIHNldCBBREQgQWN0aW9uIHN0YXRlIGZhbHNlCi0JCW5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBzZXQgQUQgQWN0aW9uIHN0YXRlIHRydWUgYWx3YXlzCi0JCW5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKHRydWUpOwotCi0JCS8vIHNldCBXUEQgRGlhZ3JhbSBNZW51IEFjdGlvbiBzdGF0ZSB0cnUgYWx3YXlzCi0JCW5ld1dQRGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKHRydWUpOwotCi0JCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0KLQkJCWlmIChnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChzZWxlY3RlZE9iamVjdCkpIHsKLQkJCQluZXdBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbmV3QWN0aXZpdHlEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5ld1dQRGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCU9iamVjdCB1bndyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZE9iamVjdCk7Ci0JCQlpZighKHVud3JhcHBlZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSB1bndyYXBwZWQ7Ci0JCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCi0JCQkvL1RPRE86IGNoZWNrIGZvciBleGlzdGluZyBkaWFncmFtcyBpbiBpbW1lZGlhdGUgYmFzZSBpbnN0ZWFkIG9mIHJvb3QgYmFzZQotCQkJCi0JCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BKSkgewotCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCi0JCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHZlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKChQcm9jZXNzRWRpdG9yKSBnZXRBY3RpdmVFZGl0b3IoKSkKLQkJCQkJLmdldERpYWdyYW1FZGl0b3JIZWxwZXIoKS5nZXREaWFncmFtKGFjdGl2aXR5LAotCQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQluZXdBY3Rpdml0eURpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCS8vIEZvciBXUEQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJLy8gV1BEIGRpYWdyYW0sIGRvbm90IHNob3cgV1BEIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudQotCQkJLy8gZm9yIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJZGlhZ3JhbSA9ICgoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCkpCi0JCQkJCS5nZXREaWFncmFtRWRpdG9ySGVscGVyKCkuZ2V0RGlhZ3JhbShhY3Rpdml0eSwKLQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSk7Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJbmV3V1BEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQkvLyBDb2xsZWN0IHRoZSBicmVha2Rvd24gZWxlbWVudHMgdG8gdmVyaWZ0eSB0YXNrZGVzY3JpcHRvcnMgYXJlCi0JCQkvLyBub3QuCi0JCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJLy8gRm9yIEFERCBkaWFncmFtIG1lbnUgb3B0aW9uLCBpZiBCYXNlIEFjdGl2aXR5IGRvbm90IGhhdmUgYW55Ci0JCQkvLyBBREQgZGlhZ3JhbSwgZG9ub3Qgc2hvdyBBREQgZGlhZ3JhbSBvcHRpb24gaW4gY29udGV4dCBtZW51Ci0JCQkvLyBmb3IKLQkJCS8vIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJZGlhZ3JhbSA9ICgoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCkpCi0JCQkJCS5nZXREaWFncmFtRWRpdG9ySGVscGVyKCkuZ2V0RGlhZ3JhbShhY3Rpdml0eSwKLQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCi0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJbmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdGVyYXRlIHRocm91Z2ggdGhlIExpc3QsIHRvIGZpbmQgdGFza2Rlc2NyaXB0b3IgYW5kIGhhcwotCQkJCS8vIHByaW1hcnkgcm9sZSB3aXRoaW4gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJCS8vIHRoZW4gZW5hYmxlIHRoZSBhY3Rpb24uCi0JCQkJZmluZFJvbGVEZXNjOgotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlpZiAoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKG9iaikpIHsKLQkJCQkJCQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBwcmltYXJ5UGVyZm9ybWVycyA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJCQkJCUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4gPSAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcikKLQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGRvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQkJCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGZhY3RvcnkpCi0JCQkJCQkJCQkJLmdldEZpbHRlcigpOwotCQkJCQkJCQlmb3IgKFJvbGVEZXNjcmlwdG9yIGUgOiBwcmltYXJ5UGVyZm9ybWVycykgewotCQkJCQkJCQkJaWYgKGZpbHRlciAhPSBudWxsICYmIGZpbHRlci5hY2NlcHQoZSkKLQkJCQkJCQkJCQkJJiYgIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKGUpKSB7Ci0JCQkJCQkJCQkJbmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yCi0JCQkJCQkJCQkJCQkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJCQlicmVhayBmaW5kUm9sZURlc2M7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzU3OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotLyoqCi0gKiBBbiBlZGl0b3IgaW5wdXQgZm9yIHByb2Nlc3MgZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCXByaXZhdGUgSVNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uOwotCXByaXZhdGUgaW50IGFjdGl2ZVBhZ2UgPSAtMTsKLQotCXB1YmxpYyBQcm9jZXNzRWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhY3RpdmUgcGFnZSBvZiB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIGludCBnZXRBY3RpdmVQYWdlKCkgewotCQlyZXR1cm4gYWN0aXZlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYWN0aXZlIHBhZ2UgZm9yIHRoZSBlZGl0b3IKLQkgKiBAcGFyYW0gYWN0aXZlUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoaW50IGFjdGl2ZVBhZ2UpIHsKLQkJdGhpcy5hY3RpdmVQYWdlID0gYWN0aXZlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaW5pdGlhbCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICogCQkJU2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5pdGlhbFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGluaXRpYWxTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogU2V0IGluaXRpYWwgc2VsZWN0aW9uIAotCSAqIEBwYXJhbSBpbml0aWFsU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyNzI1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbWV0aG9kLCBwcm9jZXNzIGFuZCBhY3Rpdml0eSBkaWFncmFtIGVkaXRvcnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Fic3RyYWN0QmFzZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Fic3RyYWN0QmFzZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWIyMzRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BYnN0cmFjdEJhc2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBVSSBmaWx0ZXJzLiBTdXBwb3J0cyBtdWx0aXBsZSBmaWx0ZXJzLgotICogU3VwcG9ydCBmaWx0ZXJpbmcgdGhlIGVsZW1lbnQgYmFzZWQgb24gdGhlIHBhdHRlcm4gYW5kIHR5cGUuIAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEJhc2VGaWx0ZXIgewotCi0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlcltdIGFkZGl0aW9uYWxGaWx0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIGFkZGVkIGZvciBmdXRoZXIgZmlsdGVyaW5nLiBGb3IgZXhhbXBsZSwgd2UgbWF5IHNldCBhIGZpbGVyIHRvIHByZXZlbnQKLQkgKiBnZW5lcmFsaXplcnMgYXMgYmFzZSBlbGVtZW50IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gYWRkaXRpb25hbEZpbHRlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRmlsdGVycyhJRmlsdGVyW10gYWRkaXRpb25hbEZpbHRlcnMpIHsKLQkJdGhpcy5hZGRpdGlvbmFsRmlsdGVycyA9IGFkZGl0aW9uYWxGaWx0ZXJzOwotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMuaGVscGVyID0gaGVscGVyOwotCX0KLQotCS8qCi0JICogc3ViY2xhc3MgbWV0aG9kIHNob3VsZCBjYWxsIHRoaXMgYmVmb3JlIHJldHVybmluZyB0cnVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJLy8gSmluaHVhIFhpLCBhZGRlZCBmb3IgZnV0aGVyIGZpbHRlcmluZy4KLQkJLy8gRm9yIGV4YW1wbGUsIHdlIG1heSBzZXQgYSBmaWxlciB0byBwcmV2ZW50IGdlbmVyYWxpemVycyBhcyBiYXNlCi0JCS8vIGVsZW1lbnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeQotCQlpZiAoYWRkaXRpb25hbEZpbHRlcnMgIT0gbnVsbCAmJiBhZGRpdGlvbmFsRmlsdGVycy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGFkZGl0aW9uYWxGaWx0ZXJzW2ldLmFjY2VwdChvYmopID09IGZhbHNlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJkZTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLS8qKgotICogQWN0aXZpdHkgdmFyaWFiaWxpdHkgZmlsdGVyCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIgZXh0ZW5kcyBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBMaXN0IHRyZWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBnZW5lcmFsaXplcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGJhc2VlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgYmFkZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQkKLQkJLy8gbG9hZCB0aGUgcGFyZW50bGlzdAotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJRmlsdGVyVXRpbC5nZXRTdWJUcmVlKGFkYXB0ZXIsIGFjdGl2aXR5LCB0cmVlTGlzdCk7Ci0JCUZpbHRlclV0aWwuZ2V0R2VuZXJhbGl6ZXJzKHRyZWVMaXN0LCBnZW5lcmFsaXplcnMpOwotCQlGaWx0ZXJVdGlsLmdldFZhcmlhYmlsaXR5QmFzZSh0cmVlTGlzdCwgYmFzZWVsZW1lbnRzKTsKLQkJCi0JCUZpbHRlclV0aWwuZ2V0U3ViVHJlZShhZGFwdGVyLCBnZW5lcmFsaXplcnMsIGJhZGVsZW1lbnRzKTsKLQkJRmlsdGVyVXRpbC5nZXRTdWJUcmVlKGFkYXB0ZXIsIGJhc2VlbGVtZW50cywgYmFkZWxlbWVudHMpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGNoaWxkQWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpKXsKLQkJCQlpZih0aGlzLmFjdGl2aXR5LmVxdWFscygoQWN0aXZpdHkpIG9iaikpIAotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoKEFjdGl2aXR5KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmKGUgIT0gbnVsbCAmJiBhY3Rpdml0eS5lcXVhbHMoZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbAotCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0JCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbAotCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHRoaXMuYWN0aXZpdHkpOwotCQkJCWlmIChzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKGdlbmVyYWxpemVycywgb2JqKSAKLQkJCQkvL0NvbW1lbnQgdGhpcyBvdXQgZHVlIHRvIDE4MjUzMSwgb3RoZXIgY2FzZXMgbWlzc2luZyB0aGlzIGNoZWNrIGhlcmUKLQkJCQkvL3Nob3VsZCBiZSBjb21wZW5zYXRlZCBieSBjaXJjdWxhciBjaGVjayBhZnRlciBmaWx0ZXIgc2VsZWN0aW9uLgotCQkJCS8vQmV0dGVyIGZpeCBpcyB0byBpbmNsdWRlIHRoZSBjaXJjdWxhciBjaGVjayBpbnRvIHRoZSBmaWx0ZXIgbG9naWMuCQkKLQkJCQkvLyB8fCBUbmdVdGlsLmNvbnRhaW5zKGJhc2VlbGVtZW50cywgb2JqKQkJCQkJCQotCQkJCS8vCQl8fFRuZ1V0aWwuY29udGFpbnMoYmFkZWxlbWVudHMsIG9iaikKLQkJCQkJCSl7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBvYmo7Ci0vLwkJCQlpZiAocHJvYy5lcXVhbHMoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRoaXMuYWN0aXZpdHkpKSkKLS8vCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotLy8JCQkJaWYoVG5nVXRpbC5jb250YWlucyhjb250cmlidXRvcnMsIG9iaikpIHJldHVybiBmYWxzZTsKLS8vCQkJCWlmKFRuZ1V0aWwuY29udGFpbnModmFyaWFiaWxpdHliYXNlcywgb2JqKSkgcmV0dXJuIGZhbHNlOwotLy8JCQkJaWYob2JqLmVxdWFscyhGaWx0ZXJVdGlsLmdldFBhcmVudEFjdGl2aXR5KFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIAotLy8JCQkJCQlhY3Rpdml0eSkpKSByZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BZGRMaW5rRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWRkTGlua0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZThmMDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BZGRMaW5rRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIEZpbHRlciBmb3IgQWRkTGluayBpbiBSaWNoVGV4dEVkaXRvci4KLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBBZGRMaW5rRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMgSUFsbEZpbHRlciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmKG9iaiA9PSBudWxsIClyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgZmlsdGVyVHlwZVN0cmluZyA9IGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCk7Ci0JCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICEob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmaWx0ZXJUeXBlU3RyaW5nID09IG51bGwKLQkJCQl8fCBmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKQotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQkJcmV0dXJuICEoKERpc2NpcGxpbmVHcm91cGluZykgb2JqKS5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ly8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoUm9sZVNldEdyb3VwaW5nKSBvYmopLmdldFJvbGVTZXRzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCi0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRE9NQUlOUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRPT0xTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRBU0tTKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUykpIHsgLy8xNzI5NTYKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb25jZXB0KQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05DRVBUUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlBSQUNUSUNFUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUkVQT1JUUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlIHx8IG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgfHwgb2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdENhdGVnb3JpZXNHcm91cChPYmplY3Qgb2JqLCBTdHJpbmcgdHlwZSkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICgoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFscygKLQkJCQkJdHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWxsRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYmFhMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FsbEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXIgZm9yIGFsbCBlbGVtZW50cyBlZzogdXNlZCBpbiB7QGxpbmsgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlfSAKLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cyBJQWxsRmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgZmlsdGVyVHlwZVN0cmluZyA9IGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCk7Ci0JCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICEob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJaWYob2JqID09IG51bGwpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZpbHRlclR5cGVTdHJpbmcgPT0gbnVsbAotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZwotCQkJCQkJLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuT05MWV9DT05URU5UX0VMRU1FTlRTKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSByZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkuY29udGFpbnMob2JqKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vCQkKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmopLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoUm9sZVNldEdyb3VwaW5nKSBvYmopLmdldFJvbGVTZXRzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTFMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UQVNLUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTKSkgeyAvLzE3Mjk1NgotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05DRVBUUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlBSQUNUSUNFUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUkVQT1JUUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSB8fCBvYmogaW5zdGFuY2VvZiBUYXNrCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0IHx8IG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCQkJLy9yZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gY2hpbGRBY2NlcHQob2JqKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIHB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCS8vIHJldHVybiBoZWxwZXI7Ci0JLy8gfQotCS8vCi0JLy8JCi0JLy8gcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkvLyB0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQkvLyB9Ci0JcHJvdGVjdGVkIExpc3QgZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IG9iakxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW9iakxpc3QuYWRkKG1ldGhvZE9iamVjdCk7Ci0KLQkJZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgb2JqTGlzdCk7Ci0KLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBbmNlc3RvcnMoTGlzdCBhbmNlc3Rvckxpc3QsIExpc3QgbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCi0JCUxpc3QgYWxsUGFyZW50Q3VzdENhdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUN1c3RvbUNhdGVnb3J5IGVsZW1lbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlbGVtZW50KTsKLQkJCWFsbFBhcmVudEN1c3RDYXRzLmFkZEFsbChwYXJlbnRMaXN0KTsKLQotCQl9Ci0KLQkJYW5jZXN0b3JMaXN0LmFkZEFsbChtZXRob2RPYmplY3RMaXN0KTsKLQkJTGlzdCBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQYXJlbnRDdXN0Q2F0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFuY2VzdG9yTGlzdC5jb250YWlucyhlbGVtZW50KSkKLQkJCQluZXh0Q2hlY2tMaXN0LmFkZChlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBuZXh0Q2hlY2tMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRNZXRob2RQbHVnaW4oT2JqZWN0IG9iaiwgT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KS5jb250YWlucyhvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKE9iamVjdCBvYmosIFN0cmluZyB0eXBlKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzKAotCQkJCQl0eXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ2F0ZWdvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DYXRlZ29yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Y4Y2EwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DYXRlZ29yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEZpbHRlciBmb3Ige0BsaW5rIENvbnRlbnRDYXRlZ29yeX0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzCi0JCUlDYXRlZ29yeUZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlciNnZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRQYXRoQmFzZWRPblRhYlN0cmluZyhoZWxwZXIuZ2V0Q29udGVudENhdGVnb3J5VGFiU3RyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ29udGVudEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NvbnRlbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2OTA0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ29udGVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRmlsdGVyIGltcGxlbWVudHMge0BsaW5rIElDb250ZW50RmlsdGVyfS4gRmlsdGVyIGNvbnRlbnQgZWxlbWVudCBpbiBjb250ZW50IHBhY2thZ2UuIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMgSUNvbnRlbnRGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ29udGVudEZpbHRlciNnZXRDb250ZW50UGFja2FnZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoaGVscGVyLmdldFRhYlN0cigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDb250ZW50RmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGZ1cnRoZXIgZmlsdGVyaW5nCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0Q29udGVudFBhY2thZ2Uob2JqKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DdXN0b21DYXRlZ29yeUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0N1c3RvbUNhdGVnb3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTQwZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0N1c3RvbUNhdGVnb3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDdXN0b21GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEZpbHRlciBzcGVjaWZpYyBmb3Ige0BsaW5rIEN1c3RvbUNhdGVnb3J5fSBlbGVtZW50cy4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cwotCQlJQ3VzdG9tRmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlciNnZXRDb250ZW50UGFja2FnZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoaGVscGVyLmdldFRhYlN0cigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDdXN0b21GaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlciNnZXRTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFmNzYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotCi0vKioKLSAqICBNZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBmaWx0ZXIgZm9yIGZpbHRlcmluZyBlbGVtZW50cyBiYXNlZCBvbiBmaWx0ZXIgcGF0dGVybgotICogIGFuZCB0eXBlIGFmdGVyIGVsZW1lbnRzIGFyZSByZWFsaXplZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBjb25maWd1cmFpdG9uLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIGV4dGVuZHMgQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlTdHJpbmcgZmlsdGVyU3RyOwotCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCi0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0KLQlwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywKLQkJCVZpZXdlciB2aWV3ZXIsIFN0cmluZyBmaWx0ZXJTdHIpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXRoaXMuZmlsdGVyU3RyID0gZmlsdGVyU3RyOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbi5lcXVhbHMob2JqKTsKLQkJfQotCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKGhlbHBlciAhPSBudWxsKSB7Ci0JCQlpZiAoaGVscGVyLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybk9uUHJlc2VudGF0aW9uTmFtZShvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5pc09iamVjdEluU2VsZWN0ZWRJdGVtcyhvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwKLQkJCW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmosIGNoaWxkRmVhdHVyZSk7Ci0JCS8vIE1vZGlmaWVkIGNvZGUgdG8gaGFuZGxlIHRoZSBmaWx0ZXJpbmcKLQkJLy8gdG8gY2hlY2sgaWYgdGhlIHZhcmlhYmlsaXR5IG9mIHBhcmVudCBpcyBub3QgTi9BLCBmaWx0ZXIgb3V0IGFscmVhZHkKLQkJLy8gZXhpc2l0bmcKLQkJLy8gZWxlbWVudCBmcm9tIGNoaWxkcmVuIGxpc3QuCi0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqLCBjaGlsZEZlYXR1cmUpOwotCQlpZihjb2wgIT0gbnVsbCl7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNvbC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoIWFjY2VwdChlbGVtZW50KSkKLQkJCQlpdG9yLnJlbW92ZSgpOwotCQl9Ci0JCX1lbHNlewotCQkJY29sID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpCi0JewotCQlzdXBlci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCXRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JQcm9jZXNzRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTIwNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JQcm9jZXNzRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSVByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci0KLQotLyoqCi0gKiB7QGxpbmsgUHJvY2Vzc30gZmlsdGVyIGZvciBmaWx0ZXJpbmcge0BsaW5rIFByb2Nlc3N9IGVsZW1lbnRzLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0ZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFoZWxwZXIuaXNPYmplY3RJblNlbGVjdGVkSXRlbXMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFtYXRjaFBhdHRlcm4ob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuKE9iamVjdCBvYmopIHsKLQkJLy8gaWYgbm8gdmFsaWQgZmlsdGVyIHR5cGUgb3IgcGF0dGVybiwgYWx3YXlzIHJldHVybiB0cnVlCi0JCVN0cmluZyBmaWx0ZXJUeXBlU3RyID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJLy8gU3RyaW5nIHBhdHRlcm4gPSBoZWxwZXIuZ2V0UGF0dGVybigpOwotCQlTdHJpbmcgdGFiU3RyID0gaGVscGVyLmdldFRhYlN0cigpOwotCQlQYXR0ZXJuIHJlZ2V4UGF0dGVybiA9IGhlbHBlci5nZXRSZWdleFBhdHRlcm4oKTsKLQkJaWYgKGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCkgPT0gbnVsbCB8fCBoZWxwZXIuZ2V0UGF0dGVybigpID09IG51bGwKLQkJCQl8fCBoZWxwZXIuZ2V0UGF0dGVybigpLmVxdWFsc0lnbm9yZUNhc2UoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoZmlsdGVyVHlwZVN0ci5lcXVhbHNJZ25vcmVDYXNlKHRhYlN0cikpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlNYXRjaGVyIG0gPSByZWdleFBhdHRlcm4ubWF0Y2hlcigoKEJyZWFrZG93bkVsZW1lbnQpIG9iaikKLQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCWJvb2xlYW4gZm91bmQgPSBtLm1hdGNoZXMoKTsKLQkJCQlpZiAoZm91bmQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBlbHNlIGZvciBhbGwgb3RoZXIgdHlwZXMgb2YgZWxlbWVudHMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlCi0JCQkvLyB0aGUgQWxsIGNhc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdldEFjdGl2aXRpZXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50LCBMaXN0IGFjdGl2aXR5TGlzdCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWFjdGl2aXR5TGlzdC5hZGQocGFyZW50KTsKLQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50LAotCQkJCQlhY3Rpdml0eUxpc3QpOwotCQl9Ci0JfQotCXB1YmxpYyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnKSB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhMjY0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZmlsdGVyIHRoYXQgc3RpbGwgc2hvd3MgY2VydGFpbiBlbGVtZW50cyBkdXJpbmcgcHJvY2VzcyBhdXRob3JpbmcgdGhhdAotICogUHJvY2Vzc0NvbmZpZ3VyYXRvciBkb2VzIG5vdCBzaG93LiBGaWx0ZXIgZWxlbWVudHMgYmFzZWQgb24gc2VhcmNoIHBhdHRlcm4gYW5kIHR5cGUuCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIGV4dGVuZHMKLQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciB7Ci0KLQlTdHJpbmcgZmlsdGVyU3RyOwotCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCVZpZXdlciB2aWV3ZXI7Ci0JCi0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJLy90aGlzLmZpbHRlclN0ciA9IGZpbHRlclN0cjsKLQkJdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlnOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbi5lcXVhbHMob2JqKTsKLQkJfQotCi0vLwkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotLy8JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0vLwkJCXJldHVybiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaik7Ci0vLwkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0vLwkJCXJldHVybiB0cnVlOwotLy8JCX0gZWxzZSB7Ci0vLwkJCWlmKExvZy5ERUJVRykgewotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3QgZmlsdGVyZWQ6ICIgKyAob2JqID09IG51bGwgPyBudWxsIDogb2JqLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJfQotCQlpZiAoaGVscGVyLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuT25QcmVzZW50YXRpb25OYW1lKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghaGVscGVyLmlzT2JqZWN0SW5TZWxlY3RlZEl0ZW1zKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMuaGVscGVyID0gaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKQotCXsKLQkJc3VwZXIuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0d1aWRhbmNlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvR3VpZGFuY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzZDhiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvR3VpZGFuY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotCi0vKioKLSAqIEZpbHRlciBmb3Ige0BsaW5rIEd1aWRhbmNlfSB0eXBlIGVsZW1lbnRzLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUZpbHRlciBleHRlbmRzIENvbnRlbnRGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotLy8JCSBXaGVuIHR5cGUgaXMgc2VsZWN0ZWQgYWxsb3cgdGhvc2UgQ2xhc3MgdHlwZXMgdG8gZGlzcGxheS4KLQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKS4KLQkJCQkJCWdldENsYXNzRm9yVHlwZShoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpKTsKLQkJaWYoY2xzICE9IG51bGwpewotCQkJaWYoY2xzLmlzSW5zdGFuY2Uob2JqKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9ZWxzZXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gRm9yIGFsbCBDb250ZW50RWxlbWVudCAtIHRoZXNlIGd1aWRhbmNlcyBhcmUgYXNzb2NpYXRlZAotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0IHx8IG9iaiBpbnN0YW5jZW9mIENvbmNlcHQKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBFeGFtcGxlIHx8IG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbAotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSB8fCBvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJLy8gRm9yIHRhc2sgZXh0cmEgZ3VpZGFuY2VzCi0JCWlmKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpIGluc3RhbmNlb2YgVGFzayl7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gRm9yIHdvcmtQcm9kdWN0IEV4dHJhIGd1aWRhbmNlcy4KLQkJaWYoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCl7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBSZXBvcnQgfHwgb2JqIGluc3RhbmNlb2YgVGVtcGxhdGUKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0FjdGl2aXR5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0FjdGl2aXR5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTE1NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NBY3Rpdml0eUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEFjdGl2aXR5IEZpbHRlciBmb3IgZG9pbmcgUHJvY2VzcyBjb3B5L2V4dGVuZAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0FjdGl2aXR5RmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBjb21tYW5kID0gMDsKLQotCXByaXZhdGUgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlciBkZWxlZ2F0ZUZpbHRlcjsKLQotCXB1YmxpYyBQcm9jZXNzQWN0aXZpdHlGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGNvbW1hbmQpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCWRlbGVnYXRlRmlsdGVyID0gbmV3IEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUsIGFjdGl2aXR5KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyI3NldEhlbHBlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCQlzdXBlci5zZXRIZWxwZXIoaGVscGVyKTsKLQkJZGVsZWdhdGVGaWx0ZXIuc2V0SGVscGVyKGhlbHBlcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBhbnkgYWN0aXZpdHkgY2FuIGJlIGRlZXAtY29waWVkCi0JCS8vCi0JCWlmKGNvbW1hbmQgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkgJiYgCi0JCQkJKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQkJCi0vLwkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLS8vCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotLy8JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKTsKLS8vCQkJCWlmICghKHRoaXMuY29tbWFuZCA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkpKSB7Ci0vLwkJCQkJaWYgKHByb2MuZXF1YWxzKHRoaXMuYWN0aXZpdHkpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLS8vCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotLy8JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIG9iajsKLS8vCQkJCWlmICghKHRoaXMuY29tbWFuZCA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkpKSB7Ci0vLwkJCQkJaWYgKHByb2MuZXF1YWxzKHRoaXMuYWN0aXZpdHkpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0vLwkJCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsCi0vLwkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvYmopOwotLy8JCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbAotLy8JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgdGhpcy5hY3Rpdml0eSk7Ci0vLwkJCQlpZiAoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcwotLy8JCQkJCQkmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLS8vCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBvYmo7Ci0vLwkJCQlpZiAocHJvYy5lcXVhbHModGhpcy5hY3Rpdml0eSkpCi0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9IGVsc2UKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXN3aXRjaChjb21tYW5kKSB7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORDoKLQkJCQkJcmV0dXJuIGRlbGVnYXRlRmlsdGVyLmFjY2VwdChvYmopOwotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOgotCQkJCQkvLyBkaXNhbGxvdyBjb3B5aW5nIGZyb20gZGVsaXZlcnkgcHJvY2VzcyB0byBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJCQkJLy8KLQkJCQkJUHJvY2VzcyBzcmNQcm9jID0gbnVsbDsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotCQkJCQkJc3JjUHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBvYmo7Ci0JCQkJCQlzcmNQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKTsKLQkJCQkJfQotCQkJCQlpZihzcmNQcm9jICE9IG51bGwpIHsKLQkJCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0aGlzLmFjdGl2aXR5KTsKLQkJCQkJCWlmIChzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJCSYmIHRhcmdldFByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0d1aWRhbmNlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0d1aWRhbmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZDRlNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NHdWlkYW5jZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBHdWlkYW5jZSBGaWx0ZXIgZm9yIFdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NHdWlkYW5jZUZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSkgewotCQkJQ29sbGVjdGlvbiBjb2wgPSAoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaik7Ci0JCQlpZiAoY29sLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NSb2xlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiZWNhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlJvbGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFJvbGVTZXR9LCB7QGxpbmsgUm9sZVNldEdyb3VwaW5nfSBpbiBzcGVjaWZpYyB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIGJhc2VkIG9uIHNlYXJjaCBwYXR0ZXJuLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUm9sZUZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzUm9sZUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgVGFibGVWaWV3ZXIgdmlld2VyLAotCQkJU3RyaW5nIHRhYk5hbWUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZUl0ZW1Qcm92aWRlcikgfHwgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpewotCQkJSXRlcmF0b3IgaXRlciA9IChUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikpOwotCQkJaWYoaXRlciAhPSBudWxsKXsKLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQkJCVJvbGVTZXRHcm91cGluZyBncm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpaXRlci5uZXh0KCk7Ci0JCQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlSb2xlU2V0cyBpcyBlbXB0eSwgCi0JCQkJCS8vIGlmIHJvbGVzZXQncyByb2xlcyBhcmUgZW1wdHkgZG9ub3Qgc2hvdyBEaXNjaXBsaW5lIGdyb3VwaW5nIAotCQkJCQlpZighZ3JvdXBpbmcuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCkpIHJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlSb2xlU2V0cyBpcyBlbXB0eSwgCi0JCQkvLyBpZiByb2xlc2V0J3Mgcm9sZXMgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCXJldHVybiAhKChSb2xlU2V0R3JvdXBpbmcpb2JqKS5nZXRSb2xlU2V0cygpLmlzRW1wdHkoKTsKLQkJfQotCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlU2V0KXsKLQkJCXJldHVybiAhKChSb2xlU2V0KW9iaikuZ2V0Um9sZXMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NWI5NzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgV29ya1Byb2R1Y3R9cyBiYXNlZCBvbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gYW5kIHNlYXJjaCBwYXR0ZXJuLgotICogYW5kIHtAbGluayBXb3JrUHJvZHVjdFR5cGV9ICAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzIFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlciB7Ci0KLQlDbGFzcyB3b3JrUHJvZHVjdFR5cGUgPSBudWxsOwotCi0JcHVibGljIFByb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQ2xhc3MgdHlwZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMud29ya1Byb2R1Y3RUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlpZiAod29ya1Byb2R1Y3RUeXBlID09IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKG9iai5nZXRDbGFzcygpLmVxdWFscyh0aGlzLndvcmtQcm9kdWN0VHlwZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NUYXNrRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5Y2I3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRhc2tJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFRhc2t9cyBpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gYmFzZWQgb24gc2VhcmNoIHBhdHRlcm4uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1Rhc2tGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1Rhc2tGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFRhYmxlVmlld2VyIHZpZXdlciwKLQkJCVN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlpZiAoKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVGFza0l0ZW1Qcm92aWRlcikgfHwgKG9iaiBpbnN0YW5jZW9mIFRhc2spCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyl7Ci0JCQlJdGVyYXRvciBpdGVyID0gKFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKSk7Ci0JCQlpZihpdGVyICE9IG51bGwpewotCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsKLQkJCQkJRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZylpdGVyLm5leHQoKTsKLQkJCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKURpc2NpcGxpbmUgaXMgZW1wdHksIAotCQkJCQkvLyBpZiBkaXNjaXBsaW5lJ3MgdGFza3MgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCQkJaWYoIWdyb3VwaW5nLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpRGlzY2lwbGluZSBpcyBlbXB0eSwgCi0JCQkvLyBpZiBkaXNjaXBsaW5lJ3MgdGFza3MgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCXJldHVybiAhKChEaXNjaXBsaW5lR3JvdXBpbmcpb2JqKS5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKTsKLQkJfQotCQlpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSAoVG5nVXRpbC5nZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudClvYmopKTsKLQkJCWlmKGl0ZXIgIT0gbnVsbCl7Ci0JCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpewotCQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSlpdGVyLm5leHQoKTsKLQkJCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKURpc2NpcGxpbmUgaXMgZW1wdHksIAotCQkJCQkvLyBpZiBkaXNjaXBsaW5lJ3MgdGFza3MgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSAKLQkJCQkJaWYoIWRpc2NpcGxpbmUuZ2V0VGFza3MoKS5pc0VtcHR5KCkpIHJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAhKChEaXNjaXBsaW5lKW9iaikuZ2V0VGFza3MoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVmlld0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NWaWV3RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NDY1MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NWaWV3RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVyIHtAbGluayBQcm9jZXNzfWVzIHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gdXNlZCBpbgotICoge0BsaW5rIEl0ZW1zRmlsdGVyRGlhbG9nfS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1ZpZXdGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1ZpZXdGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFZpZXdlciB2aWV3ZXIsCi0JCQlTdHJpbmcgZmlsdGVyU3RyKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZywgdmlld2VyLCBmaWx0ZXJTdHIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGZpbHRlclR5cGUgPSBoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpKSB7Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgfHwgb2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lIHx8IG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5ET01BSU5TKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEb21haW4pOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlRPT0xTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlCi0JCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5OwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKSkgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBEb21haW4gfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFRvb2wgfHwgb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZmYzMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgV29ya1Byb2R1Y3R9cyB3aXRoIGluIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJaWYgKCgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBEb21haW4pCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIERvbWFpbkl0ZW1Qcm92aWRlcikKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JlZmVyZW5jZVdvcmtGbG93RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhMDFkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0KLS8qKgotICogRmlsdGVycyB0aGUge0BsaW5rIFByb2Nlc3N9cyBmb3IgcmVmZXJlbmNlIHdvcmtmbG93cyBvZiB7QGxpbmsgRGlzY2lwbGluZX0uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZVdvcmtGbG93RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMKLQkJSUFsbEZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopOwotCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkuZ2V0Q2hpbGRyZW4oCi0JCQkJCQlvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJfQotCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCWlmICgoKFByb2Nlc3NQYWNrYWdlKSBvYmopLmdldFByb2Nlc3NFbGVtZW50cygpLmlzRW1wdHkoKQotCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgb2JqKS5nZXRDaGlsZFBhY2thZ2VzKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUm9sZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljYzQzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUm9sZX0gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVGaWx0ZXIgZXh0ZW5kcyBBbGxGaWx0ZXIgewotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gZ2V0SGVscGVyKCkuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChvYmouZXF1YWxzKGNvbnRlbnRFbGVtZW50KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0SGVscGVyKCkuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChnZXRIZWxwZXIoKS5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFnZXRIZWxwZXIoKS5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDBlOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFByb2Nlc3N9J3Mge0BsaW5rIFJvbGV9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyIGV4dGVuZHMgUHJvY2Vzc1JvbGVGaWx0ZXIgewotCi0JQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHVibGljIFZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0vLwkJCWlmIChQcm9jZXNzVXRpbC5nZXRWYXJpYWJpbGl0eUVsZW1lbnQodGhpcy5hY3Rpdml0eSkuY29udGFpbnMob2JqKSkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9IGVsc2UKLS8vCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCBhY3Rpdml0eSwgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGM2OTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFByb2Nlc3N9J3Mge0BsaW5rIFRhc2t9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlciBleHRlbmRzIFByb2Nlc3NUYXNrRmlsdGVyIHsKLQotCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotLy8JCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KHRoaXMuYWN0aXZpdHkpLmNvbnRhaW5zKG9iaikpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBlbHNlCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHksIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmMyYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUHJvY2Vzc30ncyB7QGxpbmsgV29ya1Byb2R1Y3R9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgZXh0ZW5kcwotCQlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgewotCi0JQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHVibGljIFZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotLy8JCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KHRoaXMuYWN0aXZpdHkpLmNvbnRhaW5zKG9iaikpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBlbHNlCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHksIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Xb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjIxMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFdvcmtQcm9kdWN0fSBiYXNlZCBvbiBzZWFyY2ggcGF0dGVybgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzIENvbnRlbnRGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThkNDc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBmaWx0ZXJzIGZvciB0aGUgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQXNzb2NpYXRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Bc3NvY2lhdGlvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZTFkYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Bc3NvY2lhdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIEFzc29jaWF0aW9uIHR5cGUgZm9ybSBwYWdlcyBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uRm9ybVBhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfUFJFRklYID0gIkF1dGhvcmluZ1VJXyI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU2VsZWN0ZWQ7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMjsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMzsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gYVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFDb21wb3NpdGU7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjYXRlZ29yeTFwYW5lMTsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNhdGVnb3J5MXBhbmUyOwotCXByb3RlY3RlZCBDb21wb3NpdGUgY2F0ZWdvcnkycGFuZTE7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjYXRlZ29yeTJwYW5lMjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNhdGVnb3J5M3BhbmUxOwotCXByb3RlY3RlZCBDb21wb3NpdGUgY2F0ZWdvcnkzcGFuZTI7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdmlld2VyX3NlbGVjdGVkLCB2aWV3ZXJfc2VsZWN0ZWQyLCB2aWV3ZXJfc2VsZWN0ZWQzOwotCi0JcHJvdGVjdGVkIFRhYmxlIGN0cmxfc2VsZWN0ZWQsIGN0cmxfc2VsZWN0ZWQyLCBjdHJsX3NlbGVjdGVkMzsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9hZGQsIGN0cmxfcmVtb3ZlLCBjdHJsX2FkZDIsIGN0cmxfcmVtb3ZlMiwgY3RybF9hZGQzLAotCQkJY3RybF9yZW1vdmUzOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3VwMSwgY3RybF9kb3duMSwgY3RybF91cDIsIGN0cmxfZG93bjIsIGN0cmxfdXAzLAotCQkJY3RybF9kb3duMzsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3NlbGVjdCwgY3RybF9jbGVhcjsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgdXNlZENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWxfQ2F0ZWdvcnksIGxhYmVsX0NhdGVnb3J5MiwgbGFiZWxfQ2F0ZWdvcnkzOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZUNhdGVnb3J5MSA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ2F0ZWdvcnkyID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDYXRlZ29yeTMgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2hhbmdlMSA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDaGFuZ2UyID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NoYW5nZTMgPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uIGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci0JLy8gc3RyaW5ncyB1c2VkIGluIHRoZSBmb3JtCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtTmFtZVByZWZpeCA9ICJGb3JtIHByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbk5hbWUgPSAiU2VjdGlvbiBuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWN0aW9uRGVzYyA9ICJTZWN0aW9uIGRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZExhYmVsID0gIlNlbGVjdGVkIExhYmVsIDEiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdGVkTGFiZWwyID0gIlNlbGVjdGVkIExhYmVsIDIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdGVkTGFiZWwzID0gIlNlbGVjdGVkIExhYmVsIDMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBEYXRhIG1vZGVsIG1ldGhvZHMuCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgbmV3SXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBuZXdJdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IG5ld0l0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVVwSXRlbXNJblNlbGVjdGVkSXRlbXMxKEFycmF5TGlzdCBtb3ZlVXBJdGVtcykgewotCQlpZiAoIW1vdmVVcEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRPcmRlckZlYXR1cmUoKTsKLQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0IG9yZGVyTGlzdCA9IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCk7Ci0JCQlpZiAoZmVhdHVyZSAhPSBudWxsICYmIG9yZGVyTGlzdCAhPSBudWxsKSB7Ci0JCQkJTW92ZUluTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJbkxpc3RDb21tYW5kKAotCQkJCQkJY29udGVudEVsZW1lbnQsIG1vdmVVcEl0ZW1zLCBvcmRlckxpc3QsCi0JCQkJCQlmZWF0dXJlLCBNb3ZlSW5MaXN0Q29tbWFuZC5VUCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVEb3duSXRlbXNJblNlbGVjdGVkSXRlbXMxKEFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zKSB7Ci0JCWlmICghbW92ZURvd25JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0T3JkZXJGZWF0dXJlKCk7Ci0JCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdCBvcmRlckxpc3QgPSBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpOwotCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCAmJiBvcmRlckxpc3QgIT0gbnVsbCkgewotCQkJCU1vdmVJbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5MaXN0Q29tbWFuZCgKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBtb3ZlRG93bkl0ZW1zLCBvcmRlckxpc3QsCi0JCQkJCQlmZWF0dXJlLCBNb3ZlSW5MaXN0Q29tbWFuZC5ET1dOKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vIFZpZXdlciBtZXRob2RzLgotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gImNvbnRlbnRlbGVtZW50Ijt9IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIGdldFRhYlN0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMygpIHsKLQkJcmV0dXJuIGdldFRhYlN0cmluZygpOwotCX0KLQotCS8qCi0JICogZ2V0RmlsdGVyVHlwZXMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvIHBhc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKgotCSAqIGdldEZpbHRlclR5cGVzIHNob3VsZCBiZSBvdmVycmlkZSB0byBwYXNzIHR5cGVzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlczIoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qCi0JICogZ2V0RmlsdGVyVHlwZXMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvIHBhc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzMygpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkvLyBGaWx0ZXIgaW5mby4KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXIsIGZpbHRlcjIsIGZpbHRlcjM7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIzKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8vIE9yZGVyaW5nIG9mIGNvbnRyaWJ1dGVkIGNhdGVnb3JpemVkIGVsZW1lbnRzIGluIGN1c3RvbQotCS8vIGNhdGVnb3JpZXMKLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfb3JkZXJpbmc7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgdmlld2VyX3NvcnQxOwotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3Q8U3RyaW5nPiBzb3J0VHlwZXNMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFR5cGVzKCk7Ci0JCQlyZXR1cm4gc29ydFR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCVN0cmluZyBzdHIgPSAoKFN0cmluZylvYmplY3QpOwotCQkJCXJldHVybiBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShzdHIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgbmFtZSk7Ci0JCXRoaXMuZWRpdG9yVGFiTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0KLQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgY29udGVudEVsZW1lbnQpOwotCQkKLQkJLy8gQ3JlYXRlIGEgc2VjdGlvbi4KLQkJYVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uVElUTEVfQkFSCi0JCQkJfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWFTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlhU2VjdGlvbi5zZXRUZXh0KGdldFNlY3Rpb25OYW1lKCkpOwotCQlhU2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWFTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlhQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYVNlY3Rpb24pOwotCQlhQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlhU2VjdGlvbi5zZXRDbGllbnQoYUNvbXBvc2l0ZSk7Ci0KLQkJaW50IG51bVRhYmxlc1VzZWQgPSAwOwotCi0JCWlmICh1c2VDYXRlZ29yeTEpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJY2F0ZWdvcnkxcGFuZTEgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYUNvbXBvc2l0ZSwgMSk7Ci0JCQlsYWJlbF9DYXRlZ29yeSA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIGNhdGVnb3J5MXBhbmUxLCBnZXRTZWxlY3RlZExhYmVsKCkpOwotCi0JCQlpZiAoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpCi0JCQkJY3RybF9zZWxlY3RlZCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5MXBhbmUxLCBTSU5HTEVfUk9XKTsKLQkJCWVsc2UgewotCQkJCWlmIChudW1UYWJsZXNVc2VkID09IDEpCi0JCQkJCWN0cmxfc2VsZWN0ZWQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBjYXRlZ29yeTFwYW5lMSwgTEFSR0VfU0laRSk7Ci0JCQkJZWxzZSBpZiAobnVtVGFibGVzVXNlZCA9PSAyKQotCQkJCQljdHJsX3NlbGVjdGVkID0gY3JlYXRlVGFibGUodG9vbGtpdCwgY2F0ZWdvcnkxcGFuZTEsIE1FRElVTV9TSVpFKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfc2VsZWN0ZWQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBjYXRlZ29yeTFwYW5lMSwgU01BTExfU0laRSk7Ci0JCQl9Ci0KLQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25MYWJlbF9maW5kRWxlbWVudEluTGliTmF2KTsgCi0JCQl2aWV3ZXJfc2VsZWN0ZWQgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyU2VsZWN0ZWQpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKCFpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpCi0JCQkJdmlld2VyX3NlbGVjdGVkLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCi0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY2F0ZWdvcnkxcGFuZTEpOwotCi0JCQljYXRlZ29yeTFwYW5lMiA9IGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnModG9vbGtpdCwgYUNvbXBvc2l0ZSk7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UxKSB7Ci0JCQkJY3RybF9hZGQgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkxcGFuZTIsCi0JCQkJCQkoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpID8gU0VMRUNUX0JVVFRPTgotCQkJCQkJCQk6IEFERF9CVVRUT04pOwotCQkJCWN0cmxfcmVtb3ZlID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGNhdGVnb3J5MXBhbmUyLAotCQkJCQkJKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKSA/IENMRUFSX0JVVFRPTgotCQkJCQkJCQk6IFJFTU9WRV9CVVRUT04pOwotCi0JCQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkgewotCQkJCQljdHJsX3VwMSA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTFwYW5lMiwgVVBfQlVUVE9OKTsKLQkJCQkJY3RybF9kb3duMSA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTFwYW5lMiwgRE9XTl9CVVRUT04pOwotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQkJCWN0cmxfb3JkZXJpbmcgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkxcGFuZTIsIE9SREVSX0JVVFRPTik7Ci0JCQkJCQljdHJsX29yZGVyaW5nLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlDb21ibyBjdHJsX3NvcnQxID0gY3JlYXRlQ29tYm9XaXRoTGFiZWwodG9vbGtpdCwgY2F0ZWdvcnkxcGFuZTIsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX0xhYmVsKTsKLQkJCQkJCXZpZXdlcl9zb3J0MSA9IG5ldyBDb21ib1ZpZXdlcihjdHJsX3NvcnQxKTsKLQkJCQkJCXZpZXdlcl9zb3J0MS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU29ydCk7Ci0JCQkJCQl2aWV3ZXJfc29ydDEuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyU29ydCk7Ci0JCQkJCQl2aWV3ZXJfc29ydDEuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJCQkJLy8gc2V0IGluaXRpYWwgc2VsZWN0aW9uCi0JCQkJCQlTdHJpbmcgc29ydFR5cGUgPSBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoY29udGVudEVsZW1lbnQpOwotCQkJCQkJdmlld2VyX3NvcnQxLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3J0VHlwZSksIHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJLy8gY3RybF9vcmRlcmluZy5zZXRMYXlvdXREYXRhKG5ldwotCQkJCQkvLyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJCX0KLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNhdGVnb3J5MXBhbmUyKTsKLQkJfQotCi0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCWNhdGVnb3J5MnBhbmUxID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIDEpOwotCQkJbGFiZWxfQ2F0ZWdvcnkyID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgY2F0ZWdvcnkycGFuZTEsIGdldFNlbGVjdGVkTGFiZWwyKCkpOwotCQkJaWYgKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yKQotCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgY2F0ZWdvcnkycGFuZTEsIFNJTkdMRV9ST1cpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG51bVRhYmxlc1VzZWQgPT0gMSkKLQkJCQkJY3RybF9zZWxlY3RlZDIgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBjYXRlZ29yeTJwYW5lMSwgTEFSR0VfU0laRSk7Ci0JCQkJZWxzZSBpZiAobnVtVGFibGVzVXNlZCA9PSAyKQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5MnBhbmUxLCBNRURJVU1fU0laRSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5MnBhbmUxLCBTTUFMTF9TSVpFKTsKLQkJCX0KLQkJCXZpZXdlcl9zZWxlY3RlZDIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZDIpOwotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTZWxlY3RlZDIpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpOwotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyX3NlbGVjdGVkMik7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNhdGVnb3J5MnBhbmUxKTsKLQotCQkJY2F0ZWdvcnkycGFuZTIgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIGFDb21wb3NpdGUpOwotCQkJaWYgKGFsbG93Q2hhbmdlMikgewotCQkJCWN0cmxfYWRkMiA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTJwYW5lMiwgQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUyID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGNhdGVnb3J5MnBhbmUyLCBSRU1PVkVfQlVUVE9OKTsKLQotCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIpIHsKLQkJCQkJY3RybF91cDIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkycGFuZTIsIFVQX0JVVFRPTik7Ci0JCQkJCWN0cmxfZG93bjIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkycGFuZTIsIERPV05fQlVUVE9OKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjYXRlZ29yeTJwYW5lMik7Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQljYXRlZ29yeTNwYW5lMSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhQ29tcG9zaXRlLCAxKTsKLQkJCWxhYmVsX0NhdGVnb3J5MyA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIGNhdGVnb3J5M3BhbmUxLCBnZXRTZWxlY3RlZExhYmVsMygpKTsKLQkJCWlmIChjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMykKLQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5M3BhbmUxLCBTSU5HTEVfUk9XKTsKLQkJCWVsc2UgewotCQkJCWlmIChudW1UYWJsZXNVc2VkID09IDEpCi0JCQkJCWN0cmxfc2VsZWN0ZWQzID0gY3JlYXRlVGFibGUodG9vbGtpdCwgY2F0ZWdvcnkzcGFuZTEsIExBUkdFX1NJWkUpOwotCQkJCWVsc2UgaWYgKG51bVRhYmxlc1VzZWQgPT0gMikKLQkJCQkJY3RybF9zZWxlY3RlZDMgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBjYXRlZ29yeTNwYW5lMSwgTUVESVVNX1NJWkUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF9zZWxlY3RlZDMgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBjYXRlZ29yeTNwYW5lMSwgU01BTExfU0laRSk7Ci0JCQl9Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc2VsZWN0ZWQzKTsKLQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyU2VsZWN0ZWQzKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKTsKLQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcl9zZWxlY3RlZDMpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjYXRlZ29yeTNwYW5lMSk7Ci0KLQkJCWNhdGVnb3J5M3BhbmUyID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJCWlmIChhbGxvd0NoYW5nZTMpIHsKLQkJCQljdHJsX2FkZDMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkzcGFuZTIsIEFERF9CVVRUT04pOwotCQkJCWN0cmxfcmVtb3ZlMyA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTNwYW5lMiwgUkVNT1ZFX0JVVFRPTik7Ci0KLQkJCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzKSB7Ci0JCQkJCWN0cmxfdXAzID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGNhdGVnb3J5M3BhbmUyLCBVUF9CVVRUT04pOwotCQkJCQljdHJsX2Rvd24zID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGNhdGVnb3J5M3BhbmUyLCBET1dOX0JVVFRPTik7Ci0JCQkJfQotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY2F0ZWdvcnkzcGFuZTIpOwotCQl9Ci0KLQkJc2V0RW5hYmxlZEFkZEJ1dHRvbnModHJ1ZSk7Ci0KLQkJc2V0V2lkZ2V0V2lkdGhzKCk7Ci0JCUNvbXBvc2l0ZSBwYW5lNyA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfQk9USCwgMSwgMSwgMSk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWxMYXJnZSgKLQkJCQl0b29sa2l0LAotCQkJCXBhbmU3LAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsKTsgCi0JCWN0cmxfYnJpZWZEZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTcpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihhQ29tcG9zaXRlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250ZXh0SGVscCgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZEFkZEJ1dHRvbnMoYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoYWxsb3dDaGFuZ2UxKQotCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTIgJiYgYWxsb3dDaGFuZ2UyKQotCQkJY3RybF9hZGQyLnNldEVuYWJsZWQodmFsdWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkzICYmIGFsbG93Q2hhbmdlMykKLQkJCWN0cmxfYWRkMy5zZXRFbmFibGVkKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkUmVtb3ZlQnV0dG9ucyhib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChhbGxvd0NoYW5nZTEpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHZhbHVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MiAmJiBhbGxvd0NoYW5nZTIpCi0JCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTMgJiYgYWxsb3dDaGFuZ2UzKQotCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKSB7Ci0JCS8vIHNldEVuYWJsZWRBZGRCdXR0b25zKGZhbHNlKTsKLQkJc2V0RW5hYmxlZFJlbW92ZUJ1dHRvbnMoZmFsc2UpOwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkyKQotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VycygpIHsKLQotCQl2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkvLyBDaGVjayBpZiBleGlzdGluZyBlbGVtZW50IGlzIGNvbnRyaWJ1dG9yL2NvbnRyaWJ1dGVzIGZvciBzdGFuZGFyZAotCQkvLyBjYXRlZ29yaWVzCi0JCS8vIHNob3VsZCBub3Qgc2hvd24gaW4gdGhlIHRhYmxldmlld2VyLgotCQkvLyBDb21tZW50ZWQgYmVsb3cgdG8gYWxsb3cgY29udHJpYnV0b3JzIHRvIGRpc3BsYXkgaW4gdGhlIGxpc3QgYm94Ci0JCS8vIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KXsKLQkJLy8gaWYoIShjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSl7Ci0JCS8vIE9iamVjdFtdIGVsZW1lbnRzID0KLQkJLy8gY29udGVudFByb3ZpZGVyU2VsZWN0ZWQuZ2V0RWxlbWVudHMoY29udGVudEVsZW1lbnQpOwotCQkvLyBmb3IoaW50IGk9MDsgaTxlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCS8vIGlmKFVJSGVscGVyLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KWVsZW1lbnQpKXsKLQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlbW92ZShlbGVtZW50KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJdmlld2VyX3NlbGVjdGVkMi5yZWZyZXNoKCk7Ci0JCQkvLyBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSl7Ci0JCQkvLyBPYmplY3RbXSBlbGVtZW50cyA9Ci0JCQkvLyBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIuZ2V0RWxlbWVudHMoY29udGVudEVsZW1lbnQpOwotCQkJLy8gZm9yKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCQkvLyBpZihVSUhlbHBlci5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCllbGVtZW50KSl7Ci0JCQkvLyB2aWV3ZXJfc2VsZWN0ZWQyLnJlbW92ZShlbGVtZW50KTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCXZpZXdlcl9zZWxlY3RlZDMucmVmcmVzaCgpOwotCQkJLy8gaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpewotCQkJLy8gT2JqZWN0W10gZWxlbWVudHMgPQotCQkJLy8gY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzLmdldEVsZW1lbnRzKGNvbnRlbnRFbGVtZW50KTsKLQkJCS8vIGZvcihpbnQgaT0wOyBpPGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCS8vIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpewotCQkJLy8gaWYoVUlIZWxwZXIuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpZWxlbWVudCkpewotCQkJLy8gdmlld2VyX3NlbGVjdGVkMy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW5hYmxlQ29udHJvbHModHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZm9ybSAhPSBudWxsICYmICFmb3JtLmlzRGlzcG9zZWQoKSkgewotCQkJCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQllbmFibGVDb250cm9scyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWlmICh1c2VDYXRlZ29yeTEpIHsKLQkJCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJCWN0cmxfc2VsZWN0ZWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlkaXNhYmxlQnV0dG9uc0FuZERlc2VsZWN0VGFibGVzKCk7Ci0KLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChhbGxvd0NoYW5nZTEgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyX3NlbGVjdGVkCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQkJCWlmIChhbGxvd0NoYW5nZTEgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQllbmFibGVVcERvd25CdXR0b25zMSgpOwotCi0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmRGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkuc2l6ZSgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0pOwotCi0JCQlpZiAoYWxsb3dDaGFuZ2UxKSB7Ci0JCQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkKLQkJCQkJCQkJLmdldEl0ZW1zKCk7Ci0JCQkJCQlMaXN0IHNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzZWxlY3RlZExpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChnZXRGaWx0ZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyKCksCi0JCQkJCQkJCQlnZXRDb250ZW50RWxlbWVudCgpLCBnZXRUYWJTdHJpbmcoKSk7Ci0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQuc2V0VGl0bGUoZ2V0VGFiU3RyaW5nKCkpOwotCQkJCQkJCWlmKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKXsKLQkJCQkJCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlmZC5zZXRFeGlzdGluZ0VsZW1lbnRzKHNlbGVjdGVkTGlzdCk7Ci0JCQkJCQkJaWYoZ2V0RmlsdGVyVHlwZXMoKSAhPSBudWxsKXsKLQkJCQkJCQkJZmQuc2V0VHlwZXMoZ2V0RmlsdGVyVHlwZXMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRJdGVtc1RvTW9kZWwxKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKHJtSXRlbXMpOwotCQkJCQkJCS8vIHZpZXdlcl9zZWxlY3RlZC5yZWZyZXNoKCk7Ci0JCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdmlld2VyX3NlbGVjdGVkLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJCWN0cmxfc2VsZWN0ZWQyLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJZGlzYWJsZUJ1dHRvbnNBbmREZXNlbGVjdFRhYmxlcygpOwotCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMiAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF9yZW1vdmUyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyX3NlbGVjdGVkMgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQkJaWYgKGFsbG93Q2hhbmdlMiAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJCQkJCS5zaXplKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0KLQkJCWlmIChhbGxvd0NoYW5nZTIpIHsKLQkJCQljdHJsX2FkZDIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyX3NlbGVjdGVkMi5nZXRUYWJsZSgpCi0JCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEZpbHRlcjIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyMigpLAotCQkJCQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSwgZ2V0VGFiU3RyaW5nMigpKTsKLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5zZXRUaXRsZShnZXRUYWJTdHJpbmcyKCkpOwotCQkJCQkJCWZkLnNldEV4aXN0aW5nRWxlbWVudHMoc2VsZWN0ZWRMaXN0KTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkSXRlbXNUb01vZGVsMihmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyX3NlbGVjdGVkMi5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zRnJvbU1vZGVsMihybUl0ZW1zKTsKLQkJCQkJCQl2aWV3ZXJfc2VsZWN0ZWQyLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmUyLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQkJY3RybF9zZWxlY3RlZDMuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlkaXNhYmxlQnV0dG9uc0FuZERlc2VsZWN0VGFibGVzKCk7Ci0KLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQzCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoYWxsb3dDaGFuZ2UzICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfc2VsZWN0ZWQzCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQzCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJCQlpZiAoYWxsb3dDaGFuZ2UzICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZkRlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJCQkJLnNpemUoKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9KTsKLQotCQkJaWYgKGFsbG93Q2hhbmdlMykgewotCQkJCWN0cmxfYWRkMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJVGFibGVJdGVtW10gaXRlbXMgPSB2aWV3ZXJfc2VsZWN0ZWQzLmdldFRhYmxlKCkKLQkJCQkJCQkJLmdldEl0ZW1zKCk7Ci0JCQkJCQlMaXN0IHNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzZWxlY3RlZExpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZ2V0RmlsdGVyMygpICE9IG51bGwpIHsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIzKCksCi0JCQkJCQkJCQlnZXRDb250ZW50RWxlbWVudCgpLCBnZXRUYWJTdHJpbmczKCkpOwotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLnNldFRpdGxlKGdldFRhYlN0cmluZzMoKSk7Ci0JCQkJCQkJZmQuc2V0RXhpc3RpbmdFbGVtZW50cyhzZWxlY3RlZExpc3QpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRJdGVtc1RvTW9kZWwzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXJfc2VsZWN0ZWQzLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZTMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtc0Zyb21Nb2RlbDMocm1JdGVtcyk7Ci0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMy5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpIHsKLQkJCWN0cmxfdXAxLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJbW92ZVVwSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQltb3ZlVXBJdGVtc0luU2VsZWN0ZWRJdGVtczEobW92ZVVwSXRlbXMpOwotCQkJCQl9Ci0JCQkJCS8vIHZpZXdlcl9zZWxlY3RlZC5yZWZyZXNoKCk7Ci0JCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJCWVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfZG93bjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQltb3ZlRG93bkl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShtb3ZlRG93bkl0ZW1zKTsKLQkJCQkJfQotCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQllbmFibGVVcERvd25CdXR0b25zMSgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlpZiAoY3RybF9vcmRlcmluZyAhPSBudWxsKSB7Ci0JCQkJY3RybF9vcmRlcmluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cgZGxnID0gbmV3IENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nKAotCQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwgZ2V0QWN0aW9uTWFuYWdlcigpKTsKLQkJCQkJCWRsZy5zZXRGZWF0dXJlKGdldE9yZGVyRmVhdHVyZSgpKTsKLQkJCQkJCWRsZy5vcGVuKCk7Ci0JCQkJCQlpZiAoYWxsb3dDaGFuZ2UxICYmIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkgewotCQkJCQkJCVN0cmluZyBzb3J0VHlwZSA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShjb250ZW50RWxlbWVudCk7Ci0JCQkJCQkJdmlld2VyX3NvcnQxLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3J0VHlwZSksIHRydWUpOwotCQkJCQkJCXZpZXdlcl9zb3J0MS5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCQotCQkJaWYgKHZpZXdlcl9zb3J0MSAhPSBudWxsKSB7Ci0JCQkJdmlld2VyX3NvcnQxLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NvcnQxCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCVN0cmluZyBzb3J0VHlwZSA9IChTdHJpbmcpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJaWYgKCFDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoY29udGVudEVsZW1lbnQpLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShjb250ZW50RWxlbWVudCk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKHByb3AgPT0gbnVsbCkgewkJCQotCQkJCQkJCQlwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmNyZWF0ZU5ld1NvcnRQcm9wZXJ0eShzb3J0VHlwZSk7Ci0JCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQkJCQkJCQlwcm9wLCAtMSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJcHJvcCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwKLQkJCQkJCQkJCQkJc29ydFR5cGUsIC0xKTsKLQkJCQkJCQl9Ci0JCQkJCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnJlZnJlc2hWaWV3cygpOwotCQkJCQkJfQotCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJCWVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0T3JkZXJGZWF0dXJlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUNvbnRyb2xzKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJaWYgKGFsbG93Q2hhbmdlMSkgewotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UyKSB7Ci0JCQkJY3RybF9hZGQyLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJaWYgKGFsbG93Q2hhbmdlMykgewotCQkJCWN0cmxfYWRkMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoYWxsb3dDaGFuZ2UzICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0JCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgJiYgdmlld2VyX3NvcnQxICE9IG51bGwpIHsKLQkJCWlmICghVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQl2aWV3ZXJfc29ydDEuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQl2aWV3ZXJfc29ydDEuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgc2V0RGlydHkoYm9vbGVhbiBiKSB7Ci0JCS8vIFBob25nICgwMy8wNy8yMDA1KTogdGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBlZGl0b3IgaXMgYWxyZWFkeSB0YWtlbgotCQkvLyBjYXJlIGluIE1ldGhvZEVsZW1lbnRFZGl0b3IsIHRyYW5zcGFyZW50IGZyb20gdXNlcgotCQkvLyBpbnRlcmFjdGlvbi4gTm8gZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpIHNob3VsZCBiZSBjYWxsZWQKLQkJLy8gc29tZXdoZXJlIGVsc2UuCi0JCS8vIE5PVEU6IHVubmVjZXNzYXJ5IGNhbGxzIHRvIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKSB3aWxsIGNhdXNlCi0JCS8vIHBlcmZvcm1hbmNlIHByb2JsZW0uCi0JCS8vIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodXNlZENhdGVnb3JpZXMuc2l6ZSgpID4gMCkKLQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZUNhdGVnb3JpZXMoY29udGVudEVsZW1lbnQsCi0JCQkJCXVzZWRDYXRlZ29yaWVzKTsKLQotCQlpZiAobGFiZWxQcm92aWRlclNlbGVjdGVkICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJTZWxlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXJTZWxlY3RlZDIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlclNlbGVjdGVkMi5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXJTZWxlY3RlZDMgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlclNlbGVjdGVkMy5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlY3Rpb24gbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQkvLyBUVlQgaXNzdWUgc2luZ2xlIHF1b3RlIAotCQkvLyBGb3JtYXQgc2hvdWxkIGJlIGRvbmUgb25seSBmb3IgQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UsIEF1dGhvcmluZ1VJLmNhdGVnb3J5R3VpZGFuY2VzUGFnZS5zZWN0aW9uRGVzY3JpcHRpb24ga2V5IAotCQkvLyBoYXZlIGhhcyByZXBsYWNlbWVudCB2YXJpYWJsZSBpbiBpdHMgdmFsdWUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGNoZWNrIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCSAgIC8qIAotCSAgICAqIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCSAgICBTdHJpbmdzIHdoaWNoIGNvbnRhaW4gcmVwbGFjZW1lbnQgdmFyaWFibGVzIGFyZSBwcm9jZXNzZWQgYnkgdGhlICAKLQkgICAgTWVzc2FnZUZvcm1hdCBjbGFzcyAoc2luZ2xlIHF1b3RlIG11c3QgYmUgY29kZWQgYXMgMiBjb25zZWN1dGl2ZSBzaW5nbGUgIAotCSAgICBxdW90ZXMgJycpLiBTdHJpbmdzIHdoaWNoIGRvIE5PVCBjb250YWluIHJlcGxhY2VtZW50IHZhcmlhYmxlcyBhcmUgTk9UICAgCi0JICAgIHByb2Nlc3NlZCBieSB0aGUgTWVzc2FnZUZvcm1hdCBjbGFzcyAoc2luZ2xlIHF1b3RlIG11c3QgYmUgY29kZWQgYXMgMQotCQlzaW5nbGUgcXVvdGUgJykuKi8KLQkJCi0JCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCQkmJiAiY2F0ZWdvcnlHdWlkYW5jZXNQYWdlIi5lcXVhbHNJZ25vcmVDYXNlKGdldElkKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBOTFMuYmluZChnZXRJZCgpICsgIl9zZWN0aW9uRGVzY3JpcHRpb24iLCBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dExvd2VyKG1ldGhvZEVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHNlbGVjdGVkIGxhYmxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJLy8gaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJLy8gcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1hdFN0cmluZyhQQUNLQUdFX1BSRUZJWCArIGdldElkKCkgKwotCQkvLyAiLnNlbGVjdGVkTGFiZWwiLCBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChtZXRob2RFbGVtZW50KSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWNvbmQgc2VsZWN0ZWQgbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGhpcmQgc2VsZWN0ZWQgbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbXVsdGlwbGUgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbXVsdGlwbGUgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50LCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChtZXNzYWdlLCBuZXcgSW50ZWdlcihjb3VudCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZGVzY3JpcHRpb24gZm9yIHNlY3Rpb24KLQkgKiBAcGFyYW0gc2VjdGlvbkRlc2MKLQkgKiAJCQlEZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3Rpb25EZXNjKFN0cmluZyBzZWN0aW9uRGVzYykgewotCQl0aGlzLnNlY3Rpb25EZXNjID0gc2VjdGlvbkRlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IGZpcnN0IGxhYmVsCi0JICogQHBhcmFtIHNlbGVjdGVkTGFiZWwxCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRMYWJlbChTdHJpbmcgc2VsZWN0ZWRMYWJlbDEpIHsKLQkJdGhpcy5zZWxlY3RlZExhYmVsID0gc2VsZWN0ZWRMYWJlbDE7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlY29uZCBsYWJlbAotCSAqIEBwYXJhbSBzZWxlY3RlZExhYmVsMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkTGFiZWwyKFN0cmluZyBzZWxlY3RlZExhYmVsMikgewotCQl0aGlzLnNlbGVjdGVkTGFiZWwyID0gc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoaXJkIGxhYmVsCi0JICogQHBhcmFtIHNlbGVjdGVkTGFiZWwzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRMYWJlbDMoU3RyaW5nIHNlbGVjdGVkTGFiZWwzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRMYWJlbDMgPSBzZWxlY3RlZExhYmVsMzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgZmlyc3QgY2F0ZWdvcnkgdG8gYmUgZWl0aGVyIHNpbmdsZSBzZWxlY3Rpb24gb3IgbXVsdGlwbGUgc2VsZWN0aW9uCi0JICogQHBhcmFtIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEoYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSkgewotCQl0aGlzLmNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xID0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiBmb3IgdGhlIHNlY29uZCBjYXRlZ29yeSB0byBiZSBlaXRoZXIgc2luZ2xlIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMihib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yKSB7Ci0JCXRoaXMuY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIgPSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgdGhpcmQgY2F0ZWdvcnkgdG8gYmUgZWl0aGVyIHNpbmdsZSBzZWxlY3Rpb24gb3IgbXVsdGlwbGUgc2VsZWN0aW9uCi0JICogQHBhcmFtIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMoYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMykgewotCQl0aGlzLmNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zID0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byB1c2UgZmlyc3QgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gdXNlQ2F0ZWdvcnkxCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlQ2F0ZWdvcnkxKGJvb2xlYW4gdXNlQ2F0ZWdvcnkxKSB7Ci0JCXRoaXMudXNlQ2F0ZWdvcnkxID0gdXNlQ2F0ZWdvcnkxOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gdXNlIHNlY29uZCBjYXRlZ29yeQotCSAqIEBwYXJhbSB1c2VDYXRlZ29yeTIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYXRlZ29yeTIoYm9vbGVhbiB1c2VDYXRlZ29yeTIpIHsKLQkJdGhpcy51c2VDYXRlZ29yeTIgPSB1c2VDYXRlZ29yeTI7Ci0JfQotCi0JCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byB1c2UgdGhpcmQgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gdXNlQ2F0ZWdvcnkzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlQ2F0ZWdvcnkzKGJvb2xlYW4gdXNlQ2F0ZWdvcnkzKSB7Ci0JCXRoaXMudXNlQ2F0ZWdvcnkzID0gdXNlQ2F0ZWdvcnkzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gYWxsb3cgY2hhbmdlcyBmb3IgZmlyc3QgdGFibGUgaW4gVUkKLQkgKiBAcGFyYW0gYWxsb3dDaGFuZ2UxCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dDaGFuZ2UxKGJvb2xlYW4gYWxsb3dDaGFuZ2UxKSB7Ci0JCXRoaXMuYWxsb3dDaGFuZ2UxID0gYWxsb3dDaGFuZ2UxOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gYWxsb3cgY2hhbmdlcyBmb3IgdGhlIHNlY29uZCB0YWJsZSBpbiBVSQotCSAqIEBwYXJhbSBhbGxvd0NoYW5nZTIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NoYW5nZTIoYm9vbGVhbiBhbGxvd0NoYW5nZTIpIHsKLQkJdGhpcy5hbGxvd0NoYW5nZTIgPSBhbGxvd0NoYW5nZTI7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBhbGxvdyBjaGFuZ2VzIGZvciB0aGlyZCB0YWJsZS4KLQkgKiBAcGFyYW0gYWxsb3dDaGFuZ2UzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dDaGFuZ2UzKGJvb2xlYW4gYWxsb3dDaGFuZ2UzKSB7Ci0JCXRoaXMuYWxsb3dDaGFuZ2UzID0gYWxsb3dDaGFuZ2UzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gc2hvdyBmaXJzdCBzZXQgb2YgdXAvZG93biBidXR0b25zCi0JICogQHBhcmFtIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSgKLQkJCWJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCXRoaXMuaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxID0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gc2hvdyBzZWNvbmQgc2V0IG9mIHVwL2Rvd24gYnV0dG9ucwotCSAqIEBwYXJhbSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIoCi0JCQlib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMikgewotCQl0aGlzLmlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMiA9IGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHNob3cgdGhpcmQgc2V0IG9mIHVwL2Rvd24gYnV0dG9ucy4KLQkgKiBAcGFyYW0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzKAotCQkJYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMpIHsKLQkJdGhpcy5pc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMgPSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDM7Ci0JfQotCi0JLy8gY2FsY3VsYXRlIHdpZHRocyBmb3IgbGFiZWxzIGFuZCB0YWJsZXMsIGJhc2VkIG9uIHdpZHRoIG9mIGxhYmVscwotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFdpZHRocygpIHsKLQkJaW50IGFsbENhdGVnb3JpZXNXaWR0aCA9IDAsIGNhdGVnb3J5V2lkdGggPSAwLCBjYXRlZ29yeTJXaWR0aCA9IDAsIGNhdGVnb3J5M1dpZHRoID0gMDsKLQkJaW50IGxhcmdlc3RXaWR0aCA9IDA7Ci0JCS8vIGlmICh1c2VDYXRlZ29yeTEpIGFsbENhdGVnb3JpZXNXaWR0aCA9Ci0JCS8vIGxhYmVsX2FsbENhdGVnb3JpZXMuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQlpZiAodXNlQ2F0ZWdvcnkxKQotCQkJY2F0ZWdvcnlXaWR0aCA9IGxhYmVsX0NhdGVnb3J5Ci0JCQkJCS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQljYXRlZ29yeTJXaWR0aCA9IGxhYmVsX0NhdGVnb3J5Mi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpLng7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQljYXRlZ29yeTNXaWR0aCA9IGxhYmVsX0NhdGVnb3J5My5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpLng7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkKLQkJCWxhcmdlc3RXaWR0aCA9IE1hdGgubWF4KGFsbENhdGVnb3JpZXNXaWR0aCwgY2F0ZWdvcnlXaWR0aCk7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQlsYXJnZXN0V2lkdGggPSBNYXRoLm1heChsYXJnZXN0V2lkdGgsIGNhdGVnb3J5MldpZHRoKTsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCWxhcmdlc3RXaWR0aCA9IE1hdGgubWF4KGxhcmdlc3RXaWR0aCwgY2F0ZWdvcnkzV2lkdGgpOwotCi0JCWlmICh1c2VDYXRlZ29yeTEpIHsKLQkJCS8vICgoR3JpZERhdGEpbGFiZWxfYWxsQ2F0ZWdvcmllcy5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9Ci0JCQkvLyBsYXJnZXN0V2lkdGg7Ci0JCQkvLyAoKEdyaWREYXRhKWN0cmxfYWxsQXZhaWxhYmxlLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0KLQkJCS8vIGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGxhYmVsX0NhdGVnb3J5LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQkJKChHcmlkRGF0YSkgY3RybF9zZWxlY3RlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJfQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQkoKEdyaWREYXRhKSBsYWJlbF9DYXRlZ29yeTIuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCQkoKEdyaWREYXRhKSBjdHJsX3NlbGVjdGVkMi5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJfQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQkoKEdyaWREYXRhKSBsYWJlbF9DYXRlZ29yeTMuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCQkoKEdyaWREYXRhKSBjdHJsX3NlbGVjdGVkMy5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlGb3JtRWRpdG9yIGVkaXRvciA9IGdldEVkaXRvcigpOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcikgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRleHRIZWxwKCkgewotCQkvLyBpbiB0aGUgZnV0dXJlLCB3ZSBzaG91bGQgY2hlY2sgdGhlIHN1YmNsYXNzIHR5cGUgdG8gc2V0IHVwIGEKLQkJLy8gZGlmZmVyZW50Ci0JCS8vIGNvbnRleHQgcGFnZSBmb3IgZWNoIHR5cGUgb2YgYXNzb2NpYXRpb25zCi0JCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoZ2V0UGFydENvbnRyb2woKSwgZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBjb250ZXh0IG1lbnUgZm9yIHRoZSBnaXZlbiB2aWV3ZXIKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3Iob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVXBEb3duQnV0dG9uczEoKSB7Ci0JCWlmIChjdHJsX3VwMSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNTaG91bGRFbmFibGVVcDEoKSkgewotCQkJCWN0cmxfdXAxLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfdXAxLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWlmIChjdHJsX2Rvd24xICE9IG51bGwpIHsKLQkJCWlmIChpc1Nob3VsZEVuYWJsZURvd24xKCkpIHsKLQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG91bGRFbmFibGVVcDEoKSB7Ci0JCWlmICh2aWV3ZXJfc2VsZWN0ZWQgIT0gbnVsbCAmJiBjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgJiYKLQkJCQkJc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmCi0JCQkJCXZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmCi0JCQkJCSFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJiAKLQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvdWxkRW5hYmxlRG93bjEoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgJiYKLQkJCQlzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYKLQkJCQkodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdlcl9zZWxlY3RlZAotCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEpICYmCi0JCQkJIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQmFzZUZvcm1QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Jhc2VGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTlmNjcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQmFzZUZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udHJvbERlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIE1ldGhvZCBlZGl0b3IgZm9ybSBwYWdlcy4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzgyCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlRm9ybVBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSB7Ci0KLQkvKioKLQkgKiBCdXR0b24gdHlwZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX0JVVFRPTiA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfQlVUVE9OID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQX0JVVFRPTiA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1dOX0JVVFRPTiA9IDM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBPUkRFUl9CVVRUT04gPSA0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUX0JVVFRPTiA9IDU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDTEVBUl9CVVRUT04gPSA2OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQVRUQUNIX0JVVFRPTiA9IDc7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVRBQ0hfQlVUVE9OID0gODsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBBVFRBQ0hfVVJMX0JVVFRPTiA9IDk7Ci0JCi0JLyoqCi0JICogVGFibGUgdHlwZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfU0laRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJVU1fU0laRSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVJHRV9TSVpFID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRV9ST1cgPSAzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQlwcm90ZWN0ZWQgU2Nyb2xsZWRGb3JtIGZvcm07Ci0KLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZWRpdG9yVGFiTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZWRpdG9yTmFtZTsKLQotCXByb3RlY3RlZCBNZXRob2RVbml0IG1ldGhvZFVuaXQ7Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRlbnRFbGVtZW50UGF0aDsKLQotCXByaXZhdGUgaW50IFNFQ1RJT05fSUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9ERUNPUkFUT1JfS0VZID0gImxhYmVsQ29udHJvbERlY29yYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGZvcm0gZWRpdG9yLgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKi8KLQlwdWJsaWMgQmFzZUZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JCWRlYnVnID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgQ29udGVudEVsZW1lbnQgb2JqZWN0IGZyb20gdGhlIGVkaXRvciBpbnB1dC4KLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQltZXRob2RFbGVtZW50ID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50T2ZQYXRoID0gIG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ID8KLQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG1ldGhvZEVsZW1lbnQpLmdldFByb2Nlc3MoKSA6IG1ldGhvZEVsZW1lbnQ7Ci0JCWNvbnRlbnRFbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50T2ZQYXRoKTsKLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RVbml0KSB7Ci0JCQltZXRob2RVbml0ID0gKE1ldGhvZFVuaXQpbWV0aG9kRWxlbWVudDsKLQkJfQotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQljb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgbWV0aG9kRWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBjb250ZW50RWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQltZXRob2RVbml0ID0gY29udGVudERlc2NyaXB0aW9uOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQl0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBleHBhbmQvY29sbGFwc2UgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgZXZlbnQuCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgID8/PwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBldmVudCwgaW50IG8pIHsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIGZvciB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3JOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRvck5hbWUoU3RyaW5nIGVkaXRvck5hbWUpIHsKLQkJdGhpcy5lZGl0b3JOYW1lID0gZWRpdG9yTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBNZXRob2QgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgQSBUYWJsZVZpZXdlci4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBNZXRob2QgZWxlbWVudHMuCi0JICovCi0JcHVibGljIExpc3Q8Pz4gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKFRhYmxlVmlld2VyIHZpZXdlcikgewotCQlPYmplY3RbXSBlbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIpIHZpZXdlcgotCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0RWxlbWVudHModmlld2VyLmdldElucHV0KCkpOwotCQlMaXN0PE9iamVjdD4gZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2VjdGlvbiBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIHNlY3Rpb24gbmFtZS4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTgotCQkJCXwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCB8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0vLwkJU3RyaW5nIHRleHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChkZXNjcmlwdGlvbiwKLS8vCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCkgfSk7Ci0vLwkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBMYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBTV1QuV1JBUAotCQkJCXwgU1dULkxFRlRfVE9fUklHSFQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAoaG9yaXpvbnRhbFNwYW4gPT0gMikgPyAxMTUgOiAxMDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZSB3aXRob3V0IHdyYXAgYW5kIG5vIHdpZHRoSGludC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWxXaXRoTm9XcmFwKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCS8vZ3JpZERhdGEud2lkdGhIaW50ID0gKGhvcml6b250YWxTcGFuID09IDIpID8gMTE1IDogMTAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0LCBHcmlkRGF0YS5CRUdJTk5JTkcsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBMYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQsIEdyaWREYXRhLkJFR0lOTklORywKLQkJCQlob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJsYW5rIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlQmxhbmtMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsCi0JCQkJIiIsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaG9yaXpvbnRhbFNwYW4pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhlaWd0aAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGV4dCBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgIiIsIHN0eWxlKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUtbGluZSB0ZXh0IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIFNXVC5ERUZBVUxULCAxMDAsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0U3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB0ZXh0U3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LAotCQkJaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0TGFiZWwpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0TGFiZWwpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCB0ZXh0U3R5bGUsIGdyaWREYXRhU3R5bGUsCi0JCQkJaGVpZ2h0LCB3aWR0aCwgaG9yaXpvbnRhbFNwYW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUtbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb3VibGUtbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDIoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgNDAsIDMwMCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBvciBtdWx0aS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgaW50IGhlaWdodCwgaW50IHNpbmdsZU9yTXVsdGkpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQkzMDAsIDIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUgb3IgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIGluIGEgY29tcG9zaXRlLgotCSAqIAotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsIGludCBoZWlnaHQsIGludCBzaW5nbGVPck11bHRpLCBTdHJpbmcgZmlsbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQkKLQkJaW50IGhvcml6b250YWxTcGFuID0gY2FsY3VsYXRlU3BhbihmaWxsVGV4dCk7Ci0JCQotCQlpZihob3Jpem9udGFsU3Bhbj09MSl7Ci0JCQlUZXh0IHRleHQgPSBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsIDIwMCwgMSk7Ci0JCQlUZXh0IHRleHQyID0gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LCAxMDAsIDEpOwotCQkJdGV4dDIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsCi0JCQkJCSIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRleHQ7Ci0JCX1lbHNlewotCQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgc2luZ2xlT3JNdWx0aSB8IFNXVC5XUkFQCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQkJMzAwLCAzKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZG91YmxlLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIDQwLCAzMDAsIDIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgc2luZ2xlIG9yIG11bHRpLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgaGVpZ2h0LCBpbnQgc2luZ2xlT3JNdWx0aSkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCTMwMCwgMyk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ib1dpdGhMYWJlbDMoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZIHxTV1QuVFJBVkVSU0VfVEFCX05FWFQsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSB0ZXh0J3MgaG9yaXpvbnRhbCBzcGFuLgotCSAqIAotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGNhbGN1bGF0ZVNwYW4oU3RyaW5nIGZpbGxUZXh0KXsKLQkJaW50IGxlbmd0aCA9IGZpbGxUZXh0Lmxlbmd0aCgpOwotCi0JCWlmKGxlbmd0aCA8IDYwKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAyOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhcmdlIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogPHA+Ci0JICogVXNlZCBmb3IgdGhlIEJyaWVmIERlc2NyaXB0aW9uIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWxMYXJnZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQkJKChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIDgwLCBTV1QuREVGQVVMVCwgMyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBoeXBlcmxpbmsgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgaHlwZXJsaW5rLgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgVGhlIGh5cGVybGluayBpbWFnZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkltYWdlSHlwZXJsaW5rPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgY3JlYXRlSW1hZ2VIeXBlcmxpbmsoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBJbWFnZSBpbWFnZSkgewotCQlJbWFnZUh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhwYXJlbnQsIFNXVC5MRUZUCi0JCQkJfCBTV1QuVE9QKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQlsaW5rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlsaW5rLnNldEltYWdlKGltYWdlKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBoeXBlcmxpbmsgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHNlY3Rpb25JZAotCSAqICAgICAgICAgICAgVGhlIHNjdGlvbiBJRC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkltYWdlSHlwZXJsaW5rPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgY3JlYXRlSHlwZXJMaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGUsIGludCBzZWN0aW9uSUQpIHsKLQkJU0VDVElPTl9JRCA9IHNlY3Rpb25JRDsKLQkJSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoCi0JCQkJZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUsIFNFQ1RJT05fSUQpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGV4cGFuZExpbms7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIHJpY2ggdGV4dCBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwKLQkJCWludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuLCBMYWJlbCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dCh0b29sa2l0LAotCQkJCXBhcmVudCwgIiIsIHN0eWxlLCBjb250ZW50RWxlbWVudFBhdGgsIG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXJpY2hUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlUmljaFRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBTV1QuREVGQVVMVCwKLQkJCQlTV1QuREVGQVVMVCwgMSwgbnVsbCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRGVjb3JhdGVkTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGRlY29yYXRlZExhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0KTsKLQkJaW50IG1hcmdpbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7IAotCQkoKEdyaWREYXRhKWRlY29yYXRlZExhYmVsLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IG1hcmdpbjsKLQkJQ29udHJvbERlY29yYXRpb24gbGFiZWxDb250cm9sRGVjb3JhdGlvbiA9IG5ldyBDb250cm9sRGVjb3JhdGlvbihkZWNvcmF0ZWRMYWJlbCwgU1dULkxFRlQgfCBTV1QuQk9UVE9NKTsKLQkJZGVjb3JhdGVkTGFiZWwuc2V0RGF0YShMQUJFTF9ERUNPUkFUT1JfS0VZLCBsYWJlbENvbnRyb2xEZWNvcmF0aW9uKTsKLQkJcmV0dXJuIGRlY29yYXRlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgd2l0aCBhIGltYWdlIGh5cGVyTGluayBhbmQgbGFiZWwgb24gYSBmb3JtCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBzZWN0aW9uSWQKLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIElELgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SVJpY2hNZXRob2RUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rKAotCQkJRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwKLQkJCWludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVJbWFnZUh5cGVybGluayh0b29sa2l0LCBwYXJlbnQsIG51bGwsCi0JCQkJQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0NPTExBUFNFRCk7Ci0JCWxpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlblJURSk7Ci0JCS8vIGNyZWF0ZSBsYWJlbCB3aXRoIENvbnRyb2xEZWNvcmF0aW9uIGhlcmUgZm9yIG1hcmtlcnMKLQkJTGFiZWwgZGVjb3JhdGVkTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0KLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBjcmVhdGVSaWNoVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQl3aWR0aCwgaG9yaXpvbnRhbFNwYW4sIGRlY29yYXRlZExhYmVsKTsKLQotCQlsaW5rLnNldEhyZWYoY29udHJvbCk7Ci0JCWxpbmsuc2V0RGF0YSgiVGl0bGUiLCBsYWJlbFRleHQpOyAvLyROT04tTkxTLTEkCi0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb250cm9sOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIHdpdGggYSBpbWFnZSBoeXBlckxpbmsgYW5kIGxhYmVsIG9uIGEgZm9ybQotCSAqIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gc2VjdGlvbklkCi0JICogICAgICAgICAgICBUaGUgc2VjdGlvbiBJRC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklSaWNoTWV0aG9kVGV4dDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQlGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LAotCQkJaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VjdGlvbklEKSB7Ci0JCWZpbmFsIGludCBTRUNUSU9OX0lEID0gc2VjdGlvbklEOwotCQlJbWFnZUh5cGVybGluayBsaW5rID0gY3JlYXRlSW1hZ2VIeXBlcmxpbmsodG9vbGtpdCwgcGFyZW50LCBudWxsLAotCQkJCUF1dGhvcmluZ1VJSW1hZ2VzLklNR19DT0xMQVBTRUQpOwotCQlsaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5SVEUpOwotCi0JCS8vIGNyZWF0ZSBsYWJlbCB3aXRoIENvbnRyb2xEZWNvcmF0aW9uIGhlcmUgZm9yIG1hcmtlcnMKLQkJTGFiZWwgZGVjb3JhdGVkTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0KLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBjcmVhdGVSaWNoVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQl3aWR0aCwgMSwgZGVjb3JhdGVkTGFiZWwpOwotCi0JCWxpbmsuc2V0SHJlZihjb250cm9sKTsKLQkJbGluay5zZXREYXRhKCJUaXRsZSIsIGxhYmVsVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlLCBTRUNUSU9OX0lEKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBlZGl0b3Igb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgcmljaCB0ZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRyb2wuCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIHRleHQgY29udHJvbC4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUZXh0IGNvbnRyb2wuCi0JICogQHJldHVybiBUaGUgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dEVkaXRvcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjcmVhdGVSaWNoVGV4dEVkaXRvcihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwKLQkJCWludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuLCBMYWJlbCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHRFZGl0b3IgZWRpdG9yID0gTWV0aG9kRm9ybVRvb2xraXQuY3JlYXRlUmljaFRleHRFZGl0b3IoCi0JCQkJdG9vbGtpdCwgcGFyZW50LCAiIiwgc3R5bGUsIGNvbnRlbnRFbGVtZW50UGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwsIGdldEVkaXRvcigpLmdldEVkaXRvclNpdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgQ29tYm9ib3ggc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSkgewotCQlDb21ibyBjb250cm9sID0gbmV3IENvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgTGFiZWwuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgQ29tYm9ib3ggc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ0NvbWJvV2l0aExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dExhYmVsLCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlKSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgdGV4dExhYmVsKTsKLQkJcmV0dXJuIGNyZWF0ZUNvbWJvKHBhcmVudCwgc3R5bGUsIGdyaWREYXRhU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ib1dpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0JCXJldHVybiBjcmVhdGVDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFksCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBzZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNlY3Rpb24uCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSB2ZXJ0aWNhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93IGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBDb21wb3NpdGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgQ29tcG9zaXRlLgotCSAqIEBwYXJhbSBudW1Db2x1bW5zCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGdyaWREYXRhU3R5bGUsIGludCB2ZXJ0aWNhbFNwYW4sCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4sIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IHZlcnRpY2FsU3BhbjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG51bUNvbHVtbnMsIGZhbHNlKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdmVydGljYWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvdyBjZWxscyB0YWtlbiB1cCBieSB0aGUgQ29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB2ZXJ0aWNhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBwYXJlbnQsIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQl2ZXJ0aWNhbFNwYW4sIDEsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgZm9yIGRpc3BsYXlpbmcgYnV0dG9ucyBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIENvbXBvc2l0ZSB0eXBlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgcGFyZW50LCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSLCBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBleHBhbmRlZCBjb21wb3NpdGUgaW4gdGhlIGZvcm0KLQkgKiA8cD4KLQkgKiBVc2VkIHRvIGhvbGQgYW4gZXhwYW5kZWQgcmljaCB0ZXh0IGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVFeHBhbmRlZENvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIGV4cGFuZGVkQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YWJsZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUYWJsZSBzdHlsZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIFRhYmxlLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSBUYWJsZS4KLQkgKiBAcGFyYW0gdmVydGljYWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvdyBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGFibGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGFibGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UYWJsZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoLAotCQkJaW50IHZlcnRpY2FsU3BhbiwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCVRhYmxlIHRhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSB2ZXJ0aWNhbFNwYW47Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgdGFibGUgdGFibGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UYWJsZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHR5cGUpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgU01BTExfU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQk1NiwgMjAwLCAxLCAxKTsKLQkJY2FzZSBNRURJVU1fU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQkxMTIsIDIwMCwgMSwgMSk7Ci0JCWNhc2UgTEFSR0VfU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQkyMDAsIDIwMCwgMSwgMSk7Ci0JCWNhc2UgU0lOR0xFX1JPVzoKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwKLQkJCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCAyMCwgMjAwLCAxLCAxKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBidXR0b24gb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSBidXR0b24gdHlwZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgdHlwZSkgewotCQlCdXR0b24gYnV0dG9uOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBBRERfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRU1PVkVfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuUkVNT1ZFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVUF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRE9XTl9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUkRFUl9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0VMRUNUX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0xFQVJfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQ0xFQVJfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIEFUVEFDSF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5BVFRBQ0hfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIEFUVEFDSF9VUkxfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQVRUQUNIX1VSTF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7CQkKLQkJY2FzZSBERVRBQ0hfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUNIX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGhlaWdodCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlIZWlnaHQgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIGludCBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpIHsKLQkJcmV0dXJuIGZvcm0uZ2V0Qm91bmRzKCkuaGVpZ2h0IC0gMyAqIDMyOwotCX0KLQotCS8qKgotCSAqIEdldCB3aWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlXaWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSB7Ci0JCXJldHVybiBmb3JtLmdldEJvdW5kcygpLndpZHRoIC0gMiAqIDMyOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NhdGVnb3J5R3VpZGFuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NhdGVnb3J5R3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGFmN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DYXRlZ29yeUd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETyAtIGNoYW5nZSBuYW1lIG9mIGNsYXNzIHRvIENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXRlZ29yeUd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCk7Ci0JCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgJiYgY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKSB8fCBvYmoKLQkJCQkJCQkuZXF1YWxzKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkpIHsKLQkJCQkJCWxvY2FsLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBsb2NhbC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2hlY2tsaXN0SXRlbXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NoZWNrbGlzdEl0ZW1zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZjOGRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2hlY2tsaXN0SXRlbXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlNlY3Rpb25zT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVtb3ZlRnJvbVNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBUaGUgQ2hlY2sgSXRlbSBwYWdlIGluIHRoZSBDaGVja2xpc3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEl0ZW1zUGFnZSBleHRlbmRzIEJhc2VGb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImNoZWNrbGlzdENoZWNrSXRlbXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkLCBjdHJsX2RlbGV0ZSwgY3RybF91cCwgY3RybF9kb3duLCBjdHJsX29yZGVyOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX2NoZWNrSXRlbXM7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGNoZWNrSXRlbXNUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3QgYWxsY2hlY2tJdGVtczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVzY0V4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZXhwYW5kZWQ7Ci0KLQlwcml2YXRlIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcml2YXRlIExhYmVsIGV4cGFuZExhYmVsOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZm9ybVNlY3Rpb247Ci0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlOwotCXByaXZhdGUgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfbWFpbmRlc2M7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNoZWNrSXRlbXNWaWV3ZXJMYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBDaGVja2xpc3QgY2hlY2tsaXN0OwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gY3VycmVudEl0ZW07Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENoZWNrbGlzdEl0ZW1zUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNIRUNLX0lURU1TX1RFWFQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNoZWNrbGlzdCA9IChDaGVja2xpc3QpIG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGZvcm0gY29udGVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0KLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQlmb3JtLnNldFRleHQoTGlicmFyeVVJVGV4dC5URVhUX0dVSURBTkNFCi0JCQkJKyAiICgiICsgZWxlbWVudExhYmVsICsgIik6ICIgKyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJZm9ybVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uTk9fVElUTEUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJfQotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zLgotCQlzZWN0aW9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQotCQkvLyBDcmVhdGUgdGhlIEdlbmVyYWwgSW5mb3JtYXRpb24gc2VjdGlvbi4KLQkJZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUKLQkJCQkJCXwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCWdlbmVyYWxTZWN0aW9uCi0JCQkJLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfU0VDVElPTl9OQU1FKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LkNIRUNLX0lURU1TX1NFQ1RJT05fREVTQyk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlnZW5lcmFsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbFNlY3Rpb24pOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRDbGllbnQoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0KLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZW5lcmFsQ29tcG9zaXRlLmdldFBhcmVudCgpLCBjaGVja2xpc3QpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXBhbmUxLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYW5lMSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX2NoZWNrSXRlbXMgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKHBhbmUxLCBTV1QuTVVMVEkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE1MDsKLQkJCWN0cmxfY2hlY2tJdGVtcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9jaGVja0l0ZW1zKTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJLnNldENvbnRlbnRQcm92aWRlcihjaGVja0l0ZW1zVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoY2hlY2tJdGVtc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQlwYW5lMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCXBhbmUyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljdHJsX2FkZCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLCBBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF9hZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kZWxldGUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVMRVRFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfZGVsZXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX3VwID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwKLQkJCQlTV1QuTk9ORSk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9kb3duID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9vcmRlciA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX29yZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbmFtZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJCWN0cmxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWNyZWF0ZUJsYW5rTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgNCk7Ci0JCQotCQljdHJsX21haW5kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmsoCi0JCQkJdG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQsCi0JCQkJMjUwLCAzMDAsIDQpOwotCi0JCWNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCi0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlicmFyeSBhbmQgc2VsZWN0aW9uIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGN1cnJlbnRJdGVtKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0vLwkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KChFT2JqZWN0KSBjaGVja2xpc3QsCi0vLwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLS8vCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbG9hZERhdGEoKTsKLS8vCQkJCX0KLQkJCQlpZiAoZm9ybSAhPSBudWxsICYmICFmb3JtLmlzRGlzcG9zZWQoKSkgewotCQkJCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCWxvYWREYXRhKCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCWZvcm1TZWN0aW9uLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWlmIChjdXJyZW50SXRlbSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGROYW1lID0gY3VycmVudEl0ZW0uZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCk7Ci0JCQkJCS8vbmV3TmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmV3TmFtZSk7Ci0JCQkJCWlmIChjdHJsX25hbWUuZ2V0VGV4dCgpID09IG51bGwKLQkJCQkJCQl8fCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLCBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0hFQ0tfSVRFTSk7IAotCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS19JVEVNKSk7IAotCQkJCQkJaWYgKG9sZE5hbWUgIT0gbnVsbCAmJiBvbGROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkJCQkuZ2V0QWN0aW9uQmFycygpCi0JCQkJCQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkJCQkJLnNldEVycm9yTWVzc2FnZSgKLQkJCQkJCQkJCQkJUGxhdGZvcm1VSQotCQkJCQkJCQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkJCS5nZXRTaGFyZWRJbWFnZXMoKQotCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgKLQkJCQkJCQkJCQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKSwKLQkJCQkJCQkJCQkJbXNnKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICghb2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljdXJyZW50SXRlbSwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJbmV3TmFtZSwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX21haW5kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbWFpbmRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGNoaWxkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTZWN0aW9uKCk7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5ORVdfRUxFTUVOVF9URVhULAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLX0lURU0gfSk7Ci0JCQkJY2hpbGQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQlBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQljaGVja2xpc3QsIGNoaWxkLCBhbGxjaGVja0l0ZW1zKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCWNoaWxkKSk7Ci0JCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBuZXdOYW1lLmxlbmd0aCgpKTsKLQkJCQlnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJCS5zZXRFcnJvck1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZGVsZXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkJLnNldEVycm9yTWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgewotCQkJCQkJUmVtb3ZlRnJvbVNlY3Rpb25MaXN0IGNtZCA9IG5ldyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QoCi0JCQkJCQkJCWNoZWNrbGlzdCwgKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgbywKLQkJCQkJCQkJYWxsY2hlY2tJdGVtcyk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJZWRpdEl0ZW0obnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNoZWNrbGlzdCwgbW92ZVVwSXRlbXMsIGFsbGNoZWNrSXRlbXMsIDEpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNoZWNrSXRlbXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQljaGVja2xpc3QsIG1vdmVEb3duSXRlbXMsIGFsbGNoZWNrSXRlbXMsIDApOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNoZWNrSXRlbXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfb3JkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2VjdGlvbnNPcmRlckRpYWxvZyBkbGcgPSBuZXcgU2VjdGlvbnNPcmRlckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQljaGVja2xpc3QsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGVja2xpc3RPcmRlcl90aXRsZSwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbiwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0KTsgCi0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfb3JkZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCS8vIFNhdmUgdGhlIEl0ZW0gb3JkZXIuCi0JCWlmIChhbGxjaGVja0l0ZW1zICE9IG51bGwpIHsKLQkJCWFsbGNoZWNrSXRlbXMuYXBwbHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlhbGxjaGVja0l0ZW1zID0gbnVsbDsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldElucHV0KGNoZWNrbGlzdCk7Ci0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCWVkaXRJdGVtKGN1cnJlbnRJdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0IGN1cnJlbnQgSXRlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdEl0ZW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGl0ZW0pIHsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJaWYgKGN0cmxfbWFpbmRlc2MuZ2V0TW9kaWZpZWQoKSkgewotCQkJc2F2ZU1haW5EZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJY3VycmVudEl0ZW0gPSBpdGVtOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCW5hbWUgPSBjdXJyZW50SXRlbS5nZXROYW1lKCk7Ci0JCQlkZXNjID0gY3VycmVudEl0ZW0uZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkuc2V0RXJyb3JNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWN0cmxfbmFtZS5zZXRUZXh0KG5hbWUgPT0gbnVsbCA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tYWluZGVzYy5zZXRUZXh0KGRlc2MgPT0gbnVsbCA/ICIiIDogZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdChjdXJyZW50SXRlbSk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkvLyBjbG9zZSBhbnkgRmluZC9SZXBsYWNlIGRpYWxvZyBvcGVuIGluIHRoZSBSVEUKLQkJCWN0cmxfbWFpbmRlc2MuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RWxlbWVudChjdXJyZW50SXRlbSk7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKGN1cnJlbnRJdGVtID09IG51bGwpOwotCi0JCWVuYWJsZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGNvbnRyb2xzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKCkgewotCQlpZiAoY2hlY2tsaXN0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoY3VycmVudEl0ZW0pKSB7Ci0JCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGxpc3RlbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxpYkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJCX0KLQkJCWxpYkxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSaWNoVGV4dEVkaXRvclNlY3Rpb24oKSB7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsgCi0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cGFuZExhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjdG9nZ2xlKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3VycmVudEl0ZW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsIGV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKTsKLQkJCXJpY2hUZXh0LnNldFRleHQoY3RybF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWlmIChjdHJsX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZXhwYW5kZWQpOwotCQkJfQotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZGVkQ29tcG9zaXRlKTsKLQkJCWV4cGFuZExhYmVsLnNldFRleHQoY3VycmVudEl0ZW0uZ2V0TmFtZSgpICsKLQkJCQkJIiAtICIgKyAoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0SW5pdGlhbFRleHQocmljaFRleHQuZ2V0VGV4dCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QocmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShyaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRGaW5kUmVwbGFjZUFjdGlvbihyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQuYWRkTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlib29sZWFuIGVkaXRhYmxlID0gIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2wocmljaFRleHQpOwotCQl9Ci0KLQkJZm9ybS5nZXRCb2R5KCkubGF5b3V0KHRydWUsIHRydWUpOwotCQlkZXNjRXhwYW5kRmxhZyA9ICFkZXNjRXhwYW5kRmxhZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QWN0aXZlUmljaFRleHRDb250cm9sKElNZXRob2RSaWNoVGV4dCBlZGl0b3IpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGVkaXRvcjsKLQl9Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiBhY3RpdmVDb250cm9sOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQljaGVja0l0ZW1zVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCAhPSBjaGVja2xpc3QpCi0JCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCQkJCWlmIChhbGxjaGVja0l0ZW1zID09IG51bGwpIHsKLQkJCQkJYWxsY2hlY2tJdGVtcyA9IG5ldyBTZWN0aW9uTGlzdChjaGVja2xpc3QsCi0JCQkJCQkJU2VjdGlvbkxpc3QuU1RFUFNfRk9SX0VMRU1FTlRfT05MWSk7Ci0JCQkJfQotCQkJCXJldHVybiBhbGxjaGVja0l0ZW1zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQljaGVja0l0ZW1zVmlld2VyTGFiZWxQcm92aWRlciA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gIWNoZWNrbGlzdC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKAotCQkJCQkJZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVNYWluRGVzY3JpcHRpb24oKSB7Ci0JCWlmIChjdXJyZW50SXRlbSAhPSBudWxsKSB7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQk6IGN0cmxfbWFpbmRlc2M7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gY3VycmVudEl0ZW0uZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLAotCQkJCQlvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY3VycmVudEl0ZW0sCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTZWxlY3Rpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY2hlY2tsaXN0KSkgewotCQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkJaWYgKGNoZWNrSXRlbXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY2hlY2tsaXN0KSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCWVkaXRJdGVtKChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODVmZDZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlnVmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NWaWV3RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXdGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0KLS8qKgotICogUGFnZSBmb3IgY3VzdG9taXppbmcgcHVibGlzaGluZyB2aWV3cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzgyNwotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MjYwCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdWaWV3UGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybVByZWZpeCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb247IAotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQlwcml2YXRlIENUYWJJdGVtIHRhYkRlZmF1bHR2aWV3SXRlbTsKLQotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbiwgbWFrZURlZmF1bHRCdXR0b24sIG9yZGVyQnV0dG9uOwotCi0JcHJpdmF0ZSBPYmplY3Qgc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gbnVsbDsKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb25maWdWaWV3UGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzLCBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV92aWV3cyk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0KLQkJQ29uZmlndXJhdGlvbkVkaXRvcklucHV0IGNvbmZpZ0lucHV0ID0gKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNvbmZpZyA9IGNvbmZpZ0lucHV0LmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJLy8gZ2V0IHBsdWdpbiBsb2dnZXIKLQkJbG9nZ2VyID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCXRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkvLyBDcmVhdGUgdGhlIHZpZXcgc2VjdGlvbi4KLQkJU2VjdGlvbiB2aWV3U2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXZpZXdTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQl2aWV3U2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlKTsgCi0JCXZpZXdTZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2UpOyAKLQkJdmlld1NlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh2aWV3U2VjdGlvbik7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdmlld1NlY3Rpb24uc2V0Q2xpZW50KHBhcmVudCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQuZ2V0UGFyZW50KCksCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQpOwotCi0JCS8vIGNyZWF0ZSBidXR0b24gcGFuZQotCQljcmVhdGVCdXR0b25QYW5lKHBhcmVudCk7Ci0KLQkJLy8gY3JlYXRlIHRhYmZvbGRlciBwYW5lCi0JCWNyZWF0ZVRhYlBhbmUocGFyZW50KTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYXJlbnQpOwotCQlsb2FkRGF0YSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFiUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgU1dULkZMQVQgfCBTV1QuVE9QIHwgU1dULkJPUkRFUik7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBzZXQgdGFiZm9sZGVyIGJhY2tncm91bmQgY29sb3IKLQkJQ29sb3Igc2VsZWN0ZWRDb2xvciA9IHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5UQl9CRyk7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKG5ldyBDb2xvcltdIHsgc2VsZWN0ZWRDb2xvciwgdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRCYWNrZ3JvdW5kKCkgfSwgbmV3IGludFtdIHsgNTAgfSk7Ci0JCQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih0YWJGb2xkZXIpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25QYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvblBhbmUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQlidXR0b25QYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlidXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotCi0JCUJ1dHRvbiBhZGRCdXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCWJ1dHRvblBhbmUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cgZmQgPSBuZXcKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJLy8gY29uZmlnKTsKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZy5zZXREZWZhdWx0SW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpKTsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzVmlld0ZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKTsKLQkJCQlDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cgZmQgPSBuZXcgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nKAotCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZmQuc2V0VHlwZXMoZ2V0VHlwZXMoKSk7Ci0JCQkJZmQKLQkJCQkJCS5zZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzKTsgCi0JCQkJZmQuc2V0SW5wdXQoY29uZmlnKTsKLQkJCQlmZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQlmZC5zZXRFeGlzdGluZ0VsZW1lbnRzKGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKSk7Ci0JCQkJZmQuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpKSwKLQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJTGlzdCB2aWV3cyA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQotCQkJCS8vIGFkZCB2aWV3IHRvIGNvbmZpZ3VyYXRpb24KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2aWV3cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0KLQkJCQkJCWlmIChjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuY29udGFpbnMoCi0JCQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJCQlTdHJpbmcgbmFtZSA9ICgoQ29udGVudENhdGVnb3J5KSBvYmopLmdldE5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU7IAotCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfbWVzc2FnZSwgbmFtZSk7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1lc3NhZ2UpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCQkJCQkJKENvbnRlbnRDYXRlZ29yeSkgb2JqLCAtMSk7Ci0JCQkJCQkJaWYoc3RhdHVzKXsKLQkJCQkJCQkJYWRkVmlldygoQ29udGVudENhdGVnb3J5KSBvYmopOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gcmVtb3ZlIGJ1dHRvbgotCQlyZW1vdmVCdXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCWJ1dHRvblBhbmUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmVWaWV3KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIG1ha2UgZGVmYXVsdCBidXR0b24KLQkJbWFrZURlZmF1bHRCdXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCWJ1dHRvblBhbmUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQsIFNXVC5OT05FKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQltYWtlRGVmYXVsdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQltYWtlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJbWFrZURlZmF1bHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbWFrZURlZmF1bHRWaWV3KCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJb3JkZXJCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbigKLQkJCQlidXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9yZGVyQnV0dG9uX3RleHQsIFNXVC5OT05FKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJb3JkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDb25maWd1cmF0aW9uT3JkZXJEaWFsb2cgZGxnID0gbmV3IENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQljb25maWcsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCWludCByZXQgPSBkbGcub3BlbigpOwotCQkJCWlmKHJldCA9PSBXaW5kb3cuT0spIHJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoYnV0dG9uUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzZWxlY3RlZCB2aWV3Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXcoKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChpdGVtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBkb24ndCBjaGFuZ2UgZGVmYXVsdCB2aWV3IGlmIHRoZSB2aWV3IGlzIG5vdCByZW1vdmVkLgotCQkvLyAxNTUwMjUgLSBlcnJvciB3aGVuIHJlbW92aW5nIHRoZSB2aWV3IGluIGNvbmZpZ3VyYXRpb24KLQkJU3RyaW5nIGl0ZW1UZXh0ID0gaXRlbS5nZXRUZXh0KCk7CQkKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlOyAKLQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlLCBpdGVtIAotCQkuZ2V0VGV4dCgpKTsKLQkJYm9vbGVhbiByZXQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbWVzc2FnZSk7Ci0KLQkJaWYgKCFyZXQpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiByZW1vdmVEZWZhdWx0ID0gZmFsc2U7Ci0JCWlmICh0YWJEZWZhdWx0dmlld0l0ZW0gIT0gbnVsbCAmJiBpdGVtID09IHRhYkRlZmF1bHR2aWV3SXRlbSkgewotCQkJcmVtb3ZlRGVmYXVsdCA9IHRydWU7Ci0JCX0KLQotCQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQkJCS8vIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCB2aWV3IHRhYiwgYW5kIGl0J3MgdGhlIG9uZSBzbGVjdGVkIHRvIGJlIHJlbW92ZWQKLQkJCWlmIChyZW1vdmVEZWZhdWx0KSB7Ci0JCQkJU3RyaW5nIGRlZmF1bHRUZXh0ID0gIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgCi0JCQkJaW50IGlkeCA9IGl0ZW1UZXh0Lmxhc3RJbmRleE9mKGRlZmF1bHRUZXh0KTsKLQkJCQlpZiAoaWR4ID4gMCkgewotCQkJCQlpdGVtVGV4dCA9IGl0ZW1UZXh0LnN1YnN0cmluZygwLGlkeCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2aWV3cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBpdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlpZiAoY2F0ZWdvcnkuZ2V0TmFtZSgpLmVxdWFscyhpdGVtVGV4dCkpIHsKLQkJCQkJLy8gcmVtb3ZlIGl0IGZyb20gdmlld3MKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgY29uZmlnLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKSwKLQkJCQkJCQljYXRlZ29yeSwgLTEpOwotCi0JCQkJCUNvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldyA9IGNvbmZpZy5nZXREZWZhdWx0VmlldygpOwotCi0JCQkJCWlmICgoZGVmYXVsdFZpZXcgIT0gbnVsbCkgJiYgKGRlZmF1bHRWaWV3LmVxdWFscyhjYXRlZ29yeSkpKSB7Ci0JCQkJCQlpZiAodmlld3Muc2l6ZSgpID4gMCkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLAotCQkJCQkJCQkJCQkoQ29udGVudENhdGVnb3J5KSB2aWV3cy5nZXQoMCksIC0xKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksCi0JCQkJCQkJCQkJCW51bGwsIC0xKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyByZW1vdmUgdGFiIGl0ZW0KLQkJCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQl2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQkJaWYgKCh2aWV3cyA9PSBudWxsKSB8fCAodmlld3Muc2l6ZSgpIDw9IDApKSB7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltYWtlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJLy8gbWFrZSB0aGUgMXN0IHRhYiBhcyB0aGUgZGVmYXVsdCB2aWV3IGlmIHRoZSBkZWZhdWx0IG9uZSBpcyByZW1vdmVkCi0JCWlmIChyZW1vdmVEZWZhdWx0KSB7Ci0JCQlDb250cm9sW10gdGFiTGlzdCA9IHRhYkZvbGRlci5nZXRUYWJMaXN0KCk7Ci0JCQlpZiAodGFiTGlzdCAhPSBudWxsICYmIHRhYkxpc3QubGVuZ3RoID4gMCkgewotCQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJbWFrZURlZmF1bHRWaWV3KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdmlldwotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVmlldyhDb250ZW50Q2F0ZWdvcnkgb2JqKSB7Ci0JCXNlbGVjdGVkSXRlbSA9IG9iajsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCVRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlJRmlsdGVyIGNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWd1cmF0aW9uVmlld0ZpbHRlcihjb25maWcsIHRyZWVWaWV3ZXIpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KGNvbmZpZ0ZpbHRlcik7Ci0KLQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCS8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KHNlbGVjdGVkSXRlbSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc2VsZWN0ZWRJdGVtKS50b0FycmF5KCk7Ci0JCQkJLy8gcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRFbGVtZW50cyhzZWxlY3RlZEl0ZW0pLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyKGNvbmZpZywKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl0cnkgewotCQkJdHJlZVZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgY3JlYXRpbmcgdHJlZXZpZXdlciBmb3IgY29uZmlnIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULlRPUCk7Ci0JCWl0ZW0uc2V0VGV4dCgoKENvbnRlbnRDYXRlZ29yeSkgb2JqKS5nZXROYW1lKCkpOwotCQlpdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQkvLyBtYWtlIGFsbCBidXR0b25zIGVuYWJsZWQKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCW1ha2VEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHNlbGVjdGVkIGFzIGRlZmF1bHQgdmlldwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlRGVmYXVsdFZpZXcoKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRvci5uZXh0KCk7Ci0JCQlpZiAoY2F0ZWdvcnkuZ2V0TmFtZSgpLmVxdWFscyhpdGVtLmdldFRleHQoKSkpIHsKLQkJCQljbGVhckRlZmF1bHRWaWV3SW5kaWNhdG9yKCk7Ci0JCQkJLy8gbWFrZSB0aGF0IHZpZXcgZGVmYXVsdAotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbmZpZywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksCi0JCQkJCQljYXRlZ29yeSwgLTEpOwotCQkJCXNldERlZmF1bHRWaWV3SW5kaWNhdG9yKGl0ZW0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCS8vIGdldCBwcm9jZXNzIHZpZXdzCi0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJLy8gY3JlYXRlIHZpZXcgaW4gVUkKLQkJCWFkZFZpZXcoKENvbnRlbnRDYXRlZ29yeSkgaXRvci5uZXh0KCkpOwotCQl9Ci0KLQkJLy8gZ2V0IGRlZmF1bHQgdmlldwotCQlDb250ZW50Q2F0ZWdvcnkgZGVmYXVsdFZpZXcgPSBjb25maWcuZ2V0RGVmYXVsdFZpZXcoKTsKLQkJaW50IGNudCA9IHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTsKLQkJaWYgKGRlZmF1bHRWaWV3ICE9IG51bGwpIHsKLQkJCS8vIGlmIGRlZmF1bHQgdmlldyBpcyBkZWZpbmVkLCBzZWxlY3QgdGhhdCB2aWV3Ci0JCQlDVGFiSXRlbVtdIGl0ZW1zID0gdGFiRm9sZGVyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpdGVtc1tpXS5nZXRUZXh0KCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKGRlZmF1bHRWaWV3LmdldE5hbWUoKSkpIHsKLQkJCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpdGVtc1tpXSk7Ci0JCQkJCXNldERlZmF1bHRWaWV3SW5kaWNhdG9yKGl0ZW1zW2ldKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGNudCA+IDApIHsKLQkJCS8vIGVsc2Ugc2VsZWN0IGZpcnN0IHZpZXcKLQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goKXsKLQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0JCVN0cmluZyBkZWZhdWx0Vmlld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZihkZWZhdWx0VmlldyE9bnVsbCkgewotCQkJZGVmYXVsdFZpZXdOYW1lID0gZGVmYXVsdFZpZXcuZ2V0TmFtZSgpOwotCQkJY2xlYXJEZWZhdWx0Vmlld0luZGljYXRvcigpOwotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZFZpZXcgPSB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkuZ2V0VGV4dCgpOwotCQlNYXAgb3JpZ1ZpZXdzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yKGludCBpPTA7aTx0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCk7aSsrKXsKLQkJCUNUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0SXRlbShpKTsKLQkJCW9yaWdWaWV3cy5wdXQoaXRlbS5nZXRUZXh0KCksIGl0ZW0uZ2V0Q29udHJvbCgpKTsKLQkJfQotCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlpbnQgaW5kZXggPSAwOwotCQlpbnQgc2VsZWN0ZWRJbmRleCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpICYmIGluZGV4PHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTspIHsKLQkJCVN0cmluZyB2aWV3ID0gKChDb250ZW50Q2F0ZWdvcnkpaXRvci5uZXh0KCkpLmdldE5hbWUoKTsKLQkJCUNUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0SXRlbShpbmRleCsrKTsKLQkJCWl0ZW0uc2V0VGV4dCh2aWV3KTsKLQkJCWl0ZW0uc2V0Q29udHJvbCgoQ29udHJvbClvcmlnVmlld3MuZ2V0KHZpZXcpKTsKLQkJCWlmKHZpZXcuZXF1YWxzKGRlZmF1bHRWaWV3TmFtZSkpIHNldERlZmF1bHRWaWV3SW5kaWNhdG9yKGl0ZW0pOwotCQkJaWYodmlldy5lcXVhbHMoc2VsZWN0ZWRWaWV3KSkgc2VsZWN0ZWRJbmRleCA9IGluZGV4LTE7Ci0JCX0KLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihzZWxlY3RlZEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBhcHBlbmRlZCAiKGRlZmF1bHQpIiBmcm9tIHRoZSB0YWIgZm9yIHRoZSBkZWZhdWx0Ci0JICogdmlldy4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNoYW5naW5nIHRoZSBkZWZhdWx0IHZpZXchCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGVmYXVsdFZpZXdJbmRpY2F0b3IoKSB7Ci0JCUNvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldyA9IGNvbmZpZy5nZXREZWZhdWx0VmlldygpOwotCQlpZiAoZGVmYXVsdFZpZXcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGRlZmF1bHRWaWV3VGFiTmFtZSA9IGRlZmF1bHRWaWV3LmdldE5hbWUoKQotCQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7IAotCQkJQ1RhYkl0ZW1bXSBpdGVtcyA9IHRhYkZvbGRlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChuYW1lLmVxdWFscyhkZWZhdWx0Vmlld1RhYk5hbWUpKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldFRleHQoZGVmYXVsdFZpZXcuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYXBwZW5kcyAiKGRlZmF1bHQpIiB0byB0aGUgdGFiIG9mIHRoZSBkZWZhdWx0IHZpZXcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRWaWV3SW5kaWNhdG9yKENUYWJJdGVtIGl0ZW0pIHsKLQkJdGFiRGVmYXVsdHZpZXdJdGVtID0gaXRlbTsKLQkJCi0JCVN0cmluZyBuYW1lID0gaXRlbS5nZXRUZXh0KCkKLQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgCi0JCWl0ZW0uc2V0VGV4dChuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldFR5cGVzKCkgewotCQlTdHJpbmdbXSBDYXRlZ29yaWVzID0gbmV3IFN0cmluZ1tdIHsgRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTLAotCQkJCUZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMsIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUywKLQkJCQlGaWx0ZXJDb25zdGFudHMuRE9NQUlOUywgRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTLAotCQkJCUZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTLCBGaWx0ZXJDb25zdGFudHMuVE9PTFMgfTsKLQkJcmV0dXJuIENhdGVnb3JpZXM7Ci0JfQotCQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gYWN0aW9uTWdyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZmNzhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gdGhlIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbiBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgaW1wbGVtZW50cyBJUmVmcmVzaGFibGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUFJFRklYID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeDsgCi0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbihGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb24sIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgY29uZmlnSW5wdXQgPSAoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dDsKLQkJY29uZmlnID0gY29uZmlnSW5wdXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCQl2ZXJzaW9uU2VjdGlvbk9uID0gZmFsc2U7Ci0JCWRldGFpbFNlY3Rpb25PbiA9IGZhbHNlOwotCQl2YXJpYWJpbGl0eVNlY3Rpb25PbiA9IGZhbHNlOwotCQlmdWxsRGVzY09uID0gZmFsc2U7Ci0JCWtleUNvbnNpZGVyYXRpb25PbiA9IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQkvLyBTZXQgZm9jdXMgb24gdGhlIE5hbWUgdGV4dCBjb250cm9sLgotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsJCQotCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2E5YWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNhdGVnb3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNhdGVnb3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Db25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLk1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5DbG9zdXJlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5JQ29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QbHVnaW5VSVBhY2thZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25QYWdlIGV4dGVuZHMgRm9ybVBhZ2UgaW1wbGVtZW50cyBJR290b01hcmtlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hFRF9CWV9DT05GSUdfRURJVE9SID0gIlRvdWNoZWRCeUNvbmZpZ0VkaXRvciI7CS8vJE5PTi1OTFMtMSQJCi0JCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybVByZWZpeCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg7IAotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQkKLQlwcml2YXRlIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIGNvbmZpZ1ZpZXdlcjsKLQlwcml2YXRlIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY29udFByb3ZpZGVyOwotCXByaXZhdGUgQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyIGFkZENhdGVnb3J5Vmlld2VyOwotCXByaXZhdGUgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyIHN1YkNhdGVnb3J5Vmlld2VyOwotCQotCXByaXZhdGUgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlciBjb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyOwotCXByaXZhdGUgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlciBhZGRDYXRlZ29yeUhpZGVVbmNoZWNrZWRGaWx0ZXI7Ci0JcHJpdmF0ZSBIaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyIHN1YkNhdGVnb3J5SGlkZVVuY2hlY2tlZEZpbHRlcjsKLQkKLQotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZUxpYnJhcnlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRTsKLQlib29sZWFuIGlzRGlydHkgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCVNjcm9sbGVkRm9ybSBmb3JtID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiB1cGRhdGVPbkNsaWNrOwotCXByaXZhdGUgQnV0dG9uIG5vVXBkYXRlT25DbGljazsKLQlwcml2YXRlIEJ1dHRvbiBjbG9zdXJlQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGZpeFdhcm5pbmdCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVmcmVzaEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBoaWRlQnV0dG9uOwotCXByaXZhdGUgVGV4dCBlbGVtRGVzcENvbnRlbnRUZXh0OwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uUHJvcGVydGllcyBjb25maWdQcm9wZXJ0aWVzOwotCXByaXZhdGUgQnV0dG9uIGhpZGVFcnJvckJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBoaWRlV2FybkJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBoaWRlSW5mb0J1dHRvbjsKLQotCXByaXZhdGUgU2hvd0Vycm9ySm9iIHNob3dFcnJvckpvYiA9IG5ldyBTaG93RXJyb3JKb2IoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbl9Qcm9ibGVtX1JlZnJlc2gpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB0cmVlU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJLyoqCi0JCSAqCUhhbmRsZXMgdGhlIHNlbGVjdGlvbiBvZiBhbiBpdGVtIGluIHRoZSB0cmVlIHZpZXdlcgotCQkgKgotCQkgKglAcGFyYW0gZXZlbnQgSVNlbGVjdGlvbgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKENvbmZpZ3VyYXRpb25QYWdlLnRoaXMuZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb249IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQ9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJc2VsZWN0ZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRFbGVtZW50KTsKLQkJCQkJaWYgKHNlbGVjdGVkRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0gZWxzZSBpZiAoZWxlbURlc3BDb250ZW50VGV4dCAhPSBudWxsICYmIHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCS8vIGRpc3BsYXkgc2VsZWN0ZWQgZWxlbWVudCdzIGRlc2NyaXB0aW9uCi0JCQkJCQlTdHJpbmcgYnJpZWZEZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCWVsZW1EZXNwQ29udGVudFRleHQuc2V0VGV4dChicmllZkRlc2MgIT0gbnVsbCA/IGJyaWVmRGVzYyA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xvc3VyZUxpc3RlbmVyIGNsb3N1cmVMaXN0ZW5lciA9IG5ldyBDbG9zdXJlTGlzdGVuZXIoKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBlcnJvckFkZGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0JCQlJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpOwotCQkJaWYgKGNvbmZpZ01nci5nZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpLnRvSGlkZShlcnJvcikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VyKGNvbmZpZywgZXJyb3IpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGVycm9yUmVtb3ZlZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcihjb25maWcsIGVycm9yKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBlcnJvclVwZGF0ZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLQkJCW1hcmtlckhlbHBlci5hZGp1c3RNYXJrZXIobnVsbCwgY29uZmlnLCBlcnJvcik7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lciBsYXlvdXRMaXN0ZW5lciA9IG5ldyBJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGF5b3V0Q2hhbmdlZChib29sZWFuIGlzRmxhdCkgewotCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMSwgCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCWZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJU2VjdGlvbiB0cmVlU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCXRyZWVTZWN0aW9uLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJdHJlZVNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50KTsgCi0JCXRyZWVTZWN0aW9uLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbik7IAotCQl0cmVlU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQljcmVhdGVDb250ZW50KHRvb2xraXQsIHRyZWVTZWN0aW9uKTsKLQkJCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIGZpbmFsbHkgc2V0IHRoZSBpbnB1dC4KLQkJc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCi0JCWluaXRpYWxpemVWaWV3ZXJzU2VsZWN0aW9uKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQotCQlDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgY29uZmlnSW5wdXQgPSAoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dDsKLQkJY29uZmlnID0gY29uZmlnSW5wdXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWNvbmZpZ1Byb3BlcnRpZXMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpLmdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRyZWUgY29udGVudAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHBhcmFtIHNlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQsIFNlY3Rpb24gc2VjdGlvbikgewotCQlDb21wb3NpdGUgc2VjdGlvbkNsaWVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlzZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ2xpZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLQkJc2VjdGlvbkNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJCXNlY3Rpb25DbGllbnQuZ2V0UGFyZW50KCksCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uQ2xpZW50KTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNiwgZmFsc2UpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCUNvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkKLQkJdXBkYXRlT25DbGljayA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV91cGRhdGVPbkNsaWNrLCBTV1QuUkFESU8pOwotCQl1cGRhdGVPbkNsaWNrLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX3VwZGF0ZU9uQ2xpY2tUb29sVGlwKTsgCi0JCXVwZGF0ZU9uQ2xpY2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkRFRkFVTFQsIGZhbHNlLCBmYWxzZSkpOwotCQl1cGRhdGVPbkNsaWNrLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV91cGRhdGVPbkNsaWNrVG9vbFRpcCkpOwotCQl1cGRhdGVPbkNsaWNrLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCi0JCW5vVXBkYXRlT25DbGljayA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9ub1VwZGF0ZU9uQ2xpY2ssIFNXVC5SQURJTyk7Ci0JCW5vVXBkYXRlT25DbGljay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9ub1VwZGF0ZU9uQ2xpY2tUb29sVGlwKTsgCi0JCW5vVXBkYXRlT25DbGljay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuREVGQVVMVCwgZmFsc2UsIGZhbHNlKSk7Ci0JCW5vVXBkYXRlT25DbGljay5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2Vfbm9VcGRhdGVPbkNsaWNrVG9vbFRpcCkpOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlLCBmYWxzZSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWdyb3VwLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnUHJvYmxlbVZpZXdPcHRpb25zVGV4dCk7Ci0KLQkJaGlkZUVycm9yQnV0dG9uID0gU1dUVXRpbC5jcmVhdGVDaGVja2JveChncm91cCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuaGlkZUVycm9zVGV4dCk7Ci0JCWhpZGVXYXJuQnV0dG9uID0gU1dUVXRpbC5jcmVhdGVDaGVja2JveChncm91cCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuaGlkZVdhcm5pbmdzVGV4dCk7Ci0JCWhpZGVJbmZvQnV0dG9uID0gU1dUVXRpbC5jcmVhdGVDaGVja2JveChncm91cCxBdXRob3JpbmdVSVJlc291cmNlcy5oaWRlSW5mb3NUZXh0KTsKLQkJCi0JCWhpZGVFcnJvckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29uZmlnUHJvcGVydGllcy5pc0hpZGVFcnJvcnMoKSk7Ci0JCWhpZGVXYXJuQnV0dG9uLnNldFNlbGVjdGlvbihjb25maWdQcm9wZXJ0aWVzLmlzSGlkZVdhcm5pbmdzKCkpOwotCQloaWRlSW5mb0J1dHRvbi5zZXRTZWxlY3Rpb24oY29uZmlnUHJvcGVydGllcy5pc0hpZGVJbmZvcygpKTsJCQotCi0JCQotCQkKLQkJaGlkZUJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIIC8vJE5PTi1OTFMtMSQKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJaGlkZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImhpZGVVbmNoZWNrZWRFbGVtLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQloaWRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwKTsgCi0JCWhpZGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0JCWhpZGVCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwKSk7Ci0JCQotCQlmaXhXYXJuaW5nQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWZpeFdhcm5pbmdCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFNoYXJlZEltYWdlKCJhZGRyZWZfY28uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWZpeFdhcm5pbmdCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXApOyAKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQkJZml4V2FybmluZ0J1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXApKTsKLQotCQkvLyBBZGQgdGhlIGNsb3N1cmUgYnV0dG9uLgotCQljbG9zdXJlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWNsb3N1cmVCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJjbG9zdXJlX2NvLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQljbG9zdXJlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcCk7IAotCQljbG9zdXJlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQljbG9zdXJlQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXApKTsKLQkJLy8gY2xvc3VyZUJ1dHRvbi5zZXRUZXh0KCIiKTsKLQotCQlyZWZyZXNoQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCXJlZnJlc2hCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX1JFRlJFU0gpOwotCQlyZWZyZXNoQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hCdXR0b25fdGV4dCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORAotCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSAzOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcmVmcmVzaEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQlyZWZyZXNoQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoQnV0dG9uX3RleHQpKTsKLQotCQkvLyBDcmVhdGUgVmlld2VyIGFuZCBIYW5kbGUgTGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIuCi0JCWNyZWF0ZVZpZXdlcnModG9vbGtpdCwgc2VjdGlvbkNsaWVudCk7Ci0KLQkJTGFiZWwgZWxlbURlc3BMYWJlbCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoc2VjdGlvbkNsaWVudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24pOyAKLQkJR3JpZERhdGEgZ2QxID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkMS5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCWVsZW1EZXNwTGFiZWwuc2V0TGF5b3V0RGF0YShnZDEpOwotCi0JCWVsZW1EZXNwQ29udGVudFRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoc2VjdGlvbkNsaWVudCwgIiIsIFNXVC5OT05FIC8vJE5PTi1OTFMtMSQKLQkJCQl8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCk7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCWdkMi5oZWlnaHRIaW50ID0gNTA7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Ioc2VjdGlvbkNsaWVudCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0JCWVsZW1EZXNwQ29udGVudFRleHQuc2V0TGF5b3V0RGF0YShnZDIpOwotCQkKLQkJLy8gc2V0IHRleHQgd2lkZ2V0IHRvIHZpZXdlcnMgc28gdGhleSBjYW4gdXBkYXRlIGRlc2NyaXB0aW9uIGZpZWxkCi0JCWNvbmZpZ1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRyZWVTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCWhpZGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJaGlkZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQlyZWZyZXNoQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJlZnJlc2hCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlmaXhXYXJuaW5nQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCWNsb3N1cmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJY2xvc3VyZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWaWV3ZXJzU2VsZWN0aW9uKCkgewotCQlpbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpOwotCi0gICAgCUxpc3Q8TWV0aG9kUGFja2FnZT4gcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBhY2thZ2U+KGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotLy8gICAgCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0vLyAgICAJaW5pdGlhbGl6ZVZpZXdlclNlbGVjdGlvbihjb25maWdWaWV3ZXIsIHBsdWdpbnMpOwotICAgIAlpbml0aWFsaXplVmlld2VyU2VsZWN0aW9uKGNvbmZpZ1ZpZXdlciwgcGFja2FnZXMpOwotCQkKLQkJLy8gcmVhZCBmcm9tIGNvbmZpZyBhbmQgY2hlY2sgdGhlIGFwcHJvcHJpYXRlIGl0ZW1zIGluIHRoZSBDQyB2aWV3ZXJzCi0JCUxpc3Q8Q29udGVudENhdGVnb3J5PiBhZGRDYXRzID0gbmV3IEFycmF5TGlzdDxDb250ZW50Q2F0ZWdvcnk+KGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotCQlpbml0aWFsaXplVmlld2VyU2VsZWN0aW9uKGFkZENhdGVnb3J5Vmlld2VyLCBhZGRDYXRzKTsKLSAgICAJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IHN1YkNhdHMgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLSAgICAJaW5pdGlhbGl6ZVZpZXdlclNlbGVjdGlvbihzdWJDYXRlZ29yeVZpZXdlciwgc3ViQ2F0cyk7Ci0gICAgCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZpZXdlclNlbGVjdGlvbihDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciB2aWV3ZXIsIExpc3Q8PyBleHRlbmRzIE9iamVjdD4gZWxlbWVudHMpIHsKLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpCi0JCQl2aWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGVsZW1lbnRzLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlcnMoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHNlY3Rpb25DbGllbnQpIHsKLQkJQ29tcG9zaXRlIGNvbmZpZ1ZpZXdlckxhYmVsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbkNsaWVudCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRU5ELCB0cnVlLCBmYWxzZSk7Ci0JCWNvbmZpZ1ZpZXdlckxhYmVsQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWNvbmZpZ1ZpZXdlckxhYmVsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCUNvbXBvc2l0ZSBhZGRDYXRzVmlld2VyTGFiZWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uQ2xpZW50KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5FTkQsIHRydWUsIGZhbHNlKTsKLQkJYWRkQ2F0c1ZpZXdlckxhYmVsQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWFkZENhdHNWaWV3ZXJMYWJlbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgbGlicmFyeSB0cmVlIHZpZXdlcgotCQljb25maWdWaWV3ZXIgPSBuZXcgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIoc2VjdGlvbkNsaWVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2QudmVydGljYWxTcGFuID0gMzsKLQkJY29uZmlnVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQljb250UHJvdmlkZXIgPSBuZXcgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udFByb3ZpZGVyKTsKLQkJbGFiZWxQcm92aWRlciA9IG5ldyBDb25maWdQYWNrYWdlTGFiZWxQcm92aWRlcihjb250UHJvdmlkZXIpOwotCQljb25maWdWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3JlYXRlVmlld2VyTGFiZWxBbmRCdXR0b25zKHRvb2xraXQsIGNvbmZpZ1ZpZXdlckxhYmVsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsLCBjb25maWdWaWV3ZXIpOwotCi0JCQotCQkKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIgPSBuZXcgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyKHNlY3Rpb25DbGllbnQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlnZC5oZWlnaHRIaW50PSAyMDA7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDYXRlZ29yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZmlnKSk7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENhdGVnb3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOwotCi0JCWNyZWF0ZVZpZXdlckxhYmVsQW5kQnV0dG9ucyh0b29sa2l0LCBhZGRDYXRzVmlld2VyTGFiZWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQWRkQ2F0ZWdvcmllc1RpdGxlTGFiZWwsIGFkZENhdGVnb3J5Vmlld2VyKTsKLQkKLQkJQ29tcG9zaXRlIHN1YkNhdHNWaWV3ZXJMYWJlbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb25DbGllbnQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkVORCwgdHJ1ZSwgZmFsc2UpOwotCQlzdWJDYXRzVmlld2VyTGFiZWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJc3ViQ2F0c1ZpZXdlckxhYmVsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIgPSBuZXcgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyKHNlY3Rpb25DbGllbnQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlnZC5oZWlnaHRIaW50PSAyMDA7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDYXRlZ29yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZmlnKSk7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENhdGVnb3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOwotCQljcmVhdGVWaWV3ZXJMYWJlbEFuZEJ1dHRvbnModG9vbGtpdCwgc3ViQ2F0c1ZpZXdlckxhYmVsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX1N1YkNhdGVnb3JpZXNUaXRsZUxhYmVsLCBzdWJDYXRlZ29yeVZpZXdlcik7Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXIgc28gdGhlIDIgQ2F0ZWdvcnkgdmlld2VycyBhcmUgaW4gc3luYwotCQkvLyB0aGF0IGlzLCB3aGVuIGFuIGl0ZW0gaXMgY2hlY2tlZCBpbiBvbmUsIGl0IGlzIHVuY2hlY2tlZCBpbiB0aGUgb3RoZXIKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCS8vUG90ZW50aWFsbHkgbG9uZyBvcGVyYXRpb24gLSBzaG93IGEgYnVzeSBjdXJzb3IKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShzdWJDYXRlZ29yeVZpZXdlci5nZXRUcmVlKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChldmVudC5nZXRDaGVja2VkKCkpCi0JCQkJCQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuc2V0Q2hlY2tlZChldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKLQotCQlzdWJDYXRlZ29yeVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9Qb3RlbnRpYWxseSBsb25nIG9wZXJhdGlvbiAtIHNob3cgYSBidXN5IGN1cnNvcgotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGFkZENhdGVnb3J5Vmlld2VyLmdldFRyZWUoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkKLQkJCQkJCQlhZGRDYXRlZ29yeVZpZXdlci5zZXRDaGVja2VkKGV2ZW50LmdldEVsZW1lbnQoKSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyTGFiZWxBbmRCdXR0b25zKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBmaW5hbCBUcmVlVmlld2VyIHZpZXdlcikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5FTkQsIHRydWUsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlCdXR0b24gZXhwYW5kQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCBudWxsLCBTV1QuUFVTSCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkVORCwgZmFsc2UsIGZhbHNlKTsKLQkJZXhwYW5kQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlleHBhbmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKCJleHBhbmRhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKTsgCi0JCWV4cGFuZEJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKSk7Ci0JCQotCQlleHBhbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdmlld2VyLmV4cGFuZEFsbCgpOwotCQkJfQotCQl9KTsKLQotCi0JCUJ1dHRvbiBjb2xsYXBzZUJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwgbnVsbCwgU1dULlBVU0gpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5FTkQsIGZhbHNlLCBmYWxzZSk7Ci0JCWNvbGxhcHNlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQljb2xsYXBzZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoImNvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xsYXBzZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGwpOyAKLQkJY29sbGFwc2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCkpOwotCQljb2xsYXBzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl2aWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpIHsKLQkJLy8gdGhlIGZvbGxvd2luZyBtYXkgbm90IGJlIHRoZSBtb3N0IGVmZmljaWVudCB3YXkKLQkJLy8gbmVlZCBhIGZhc3Qgd2F5IHRvIHVwZGF0ZSB0aGUgY2xvc3VyZQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHJlSW5pdCBjbG9zdXJlIGZvciBjb25maWcgYWRkIG5vdGlmaWNhdGlvbiEiKTsKLQotCQljcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlndXJhdGlvbkNsb3N1cmUoKSB7Ci0JCWNsb3N1cmUgPSBuZXcgQ29uZmlndXJhdGlvbkNsb3N1cmUoYWN0aW9uTWdyLCBjb25maWcpOwotCQljbG9zdXJlLmFkZExpc3RlbmVyKGNsb3N1cmVMaXN0ZW5lcik7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuc2V0Q2xvc3VyZShjbG9zdXJlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciBjb25uZmlndXJhdGlvbiB2aWV3ZXIKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkKLQkJY29uZmlnVmlld2VyLmV4cGFuZEFsbCgpOwotCQljb25maWdWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmV4cGFuZEFsbCgpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCi0vLwkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFZpZXdlcnMoKSB7Ci0JCWNvbmZpZ1ZpZXdlci5yZWZyZXNoKCk7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLnJlZnJlc2goKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzaG93SGlkZUVsZW1lbnRzKCkgewotCQljb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyLnRvZ2dsZUhpZGVVbmNoZWNrZWQoKTsKLQkJYWRkQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyLnRvZ2dsZUhpZGVVbmNoZWNrZWQoKTsKLQkJc3ViQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyLnRvZ2dsZUhpZGVVbmNoZWNrZWQoKTsKLQkJcmVmcmVzaFZpZXdlcnMoKTsKLS8vCQl1cGRhdGVDaGVja1N0YXRlcygpOyAvLyBuZWRlZCB0byBoYXZlIHRoaXMgdG8gdXBkYXRlIHRoZSBjaGVjayBzdGF0dXMKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpIHsKLQkJLy8gbG9hZGluZyB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIG1pZ2h0IGJlIHNsb3csCi0JCS8vIGRpc3BsYXkgYSBwcm9ncmVzcyBiYXIKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQljcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCQkJfQotCi0JCX07Ci0KLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2UpOyAKLQotCQljb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyID0gbmV3IEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIoY29uZmlnVmlld2VyKTsKLQkJY29uZmlnVmlld2VyLmFkZEZpbHRlcihjb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyKTsKLQkJYWRkQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyID0gbmV3IEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIoYWRkQ2F0ZWdvcnlWaWV3ZXIpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5hZGRGaWx0ZXIoYWRkQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyKTsKLQkJc3ViQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyID0gbmV3IEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIoc3ViQ2F0ZWdvcnlWaWV3ZXIpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5hZGRGaWx0ZXIoc3ViQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyKTsKLQkJCi0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaGlkZUVycm9yQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhpZGVzQnV0dG9uV2lkZ2V0U2VsZWN0ZWQoZSwKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DT05GSUdfUFJPUEJMRU1fSElERV9FUlJPUlMpOwotCQkJfQotCQl9KTsKLQkJCi0JCWhpZGVXYXJuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhpZGVzQnV0dG9uV2lkZ2V0U2VsZWN0ZWQoZSwKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DT05GSUdfUFJPUEJMRU1fSElERV9XQVJOSU5HUyk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaGlkZUluZm9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlSGlkZXNCdXR0b25XaWRnZXRTZWxlY3RlZChlLAotCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0lORk9TKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljbG9zdXJlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmb3JtLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQltYWtlQ2xvc3VyZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9OwotCQl9KTsKLQkJZml4V2FybmluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZm9ybS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZml4V2FybmluZygpOwotCQkJCQl9Ci0JCQkJfSk7CQkJCQotCQkJfTsKLQkJfSk7Ci0JCXJlZnJlc2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZvcm0uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNhdmVDb25maWd1cmF0aW9uKCk7Ci0JCQkJCQlzaG93RXJyb3JzKCk7Ci0JCQkJCX0KLQkJCQl9KTsJCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQloaWRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaG93SGlkZUVsZW1lbnRzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGFkZCBhIGNoZWNrIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcgotCQlJQ2hlY2tTdGF0ZUxpc3RlbmVyIGNvbmZpZ0NoZWNrU3RhdGVMaXN0ZW5lciA9IG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldnQpIHsKLQkJCQkKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmb3JtLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodXBkYXRlT25DbGljay5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJCXNhdmVDb25maWd1cmF0aW9uKCk7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBjbG9zdXJlIGVycm9yCi0JCQkJCQkJc2hvd0Vycm9ycygpOwotCQkJCQkJfQotCQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUobmV3IE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQoY29uZmlnLCBUT1VDSEVEX0JZX0NPTkZJR19FRElUT1IsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCX0KLQkJfTsKLQkJCi0JCUlDaGVja1N0YXRlTGlzdGVuZXIgY2F0c0NoZWNrU3RhdGVMaXN0ZW5lciA9IG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZvcm0uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNhdmVDb250ZW50Q2F0ZWdvcnlTZWxlY3Rpb25zVG9Db25maWd1cmF0aW9uKCk7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIGNsb3N1cmUgZXJyb3IKLQkJCQkJCXNob3dFcnJvcnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCQkKLQkJY29uZmlnVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjb25maWdDaGVja1N0YXRlTGlzdGVuZXIpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIoY2F0c0NoZWNrU3RhdGVMaXN0ZW5lcik7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjYXRzQ2hlY2tTdGF0ZUxpc3RlbmVyKTsKLQotCQkvLyBsaXN0ZW4gdG8gdGhlIGxpYnJhcnkgY2hhbmdlcyBhbmQgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlCi0JCS8vIGNvbmZpZ3VyYXRpb24gdmlldwotCQlsaWJMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbjxPYmplY3Q+IGNoYW5nZWRJdGVtcykgewotCQkJCS8vIGZvciBwZXJmb3JtYW5jZSByZWFzb24sIHdlIHNob3VsZCBub3QgcmVzcG9uc2UgdG8gZXZlcnkKLQkJCQkvLyBsaWJyYXJ5IGNoYW5nZQotCQkJCS8vIG9ubHkgY292ZXIgcGFja2FnZSBhbmQgcGx1Z2luIGNoYW5nZXMKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQKLQkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRAotCQkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxEKSB7Ci0JCQkJCWlmIChjaGFuZ2VkSXRlbXMgIT0gbnVsbCAmJiBjaGFuZ2VkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCQkJT2JqZWN0IG8gPSBjaGFuZ2VkSXRlbXMudG9BcnJheSgpWzBdOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQkJcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpOwotCQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0vLwkJCQkJCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCQkJCQkJCXNob3dFcnJvcnMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCQl9Ci0JCQotCQkvLyBsaXN0ZW4gdG8gcGx1Z2luIHByZXNlbnRhdGlvbiBsYXlvdXQgY2hhbmdlcwotCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmFkZExpc3RlbmVyKGxheW91dExpc3RlbmVyKTsKLQl9Ci0JCi0JY2xhc3MgU2hvd0Vycm9ySm9iIGV4dGVuZHMgSm9iIHsKLQkJCi0JCXB1YmxpYyBTaG93RXJyb3JKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIHNhdmUgdGhlIHByZXZpb3VzIGludmFsaWQgZWxlbWVudHMKLQkJCWZpbmFsIExpc3Q8T2JqZWN0PiBpbnZhbGlkID0gY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKTsKLQkJCWNsb3N1cmUuY2hlY2tFcnJvcigpOwotCQkJaWYgKGNsb3N1cmUuaXNBYm9ydENoZWNrRXJyb3IoKSkgewotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQkJCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGNvbmZpZ1ZpZXdlckhpZGVVbmNoZWNrZWRGaWx0ZXIuaXNIaWRlVW5jaGVja2VkKCkpIHsKLQkJCQkJCWNvbmZpZ1ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBnZXQgdGhlIG5ldyBlcnJvciBlbGVtZW50cywgYWRkIHRvIHRoZSBwcmV2aW91cyBlcnJvciBlbGVtZW50cywKLQkJCQkJCS8vIGFuZCB1cGRhdGUgdGhlbSB0byB1cGRhdGUgdGhlIGVycm9yL3dhcm5pbmcgaW1hZ2VzCi0JCQkJCQlpbnZhbGlkLmFkZEFsbChjbG9zdXJlLmdldEludmFsaWRFbGVtZW50cygpKTsKLQotCQkJCQkJLy8gYWxzbyBhZGQgdGhlIFVJIGZvbGRlcnMKLQkJCQkJCUNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPSAoQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcikgY29uZmlnVmlld2VyCi0JCQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQkJCWludmFsaWQuYWRkQWxsKGNwLmdldFVJRWxlbWVudHMoKSk7Ci0KLQkJCQkJCWNvbmZpZ1ZpZXdlci51cGRhdGUoaW52YWxpZC50b0FycmF5KCksIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9KTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0Vycm9ycygpIHsKLQkJaWYgKGNsb3N1cmUuaXNBYm9ydENoZWNrRXJyb3IoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoc2hvd0Vycm9ySm9iLmdldFN0YXRlKCkgPT0gSm9iLlJVTk5JTkcpIHsKLQkJCWNsb3N1cmUuc2V0QWJvcnRDaGVja0Vycm9yKHRydWUpOwotCQl9Ci0KLQkJaWYgKCEgc2hvd0Vycm9ySm9iLmNhbmNlbCgpKSB7Ci0JCQl0cnkgewotCQkJCXNob3dFcnJvckpvYi5qb2luKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewkJCQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJY2xvc3VyZS5zZXRBYm9ydENoZWNrRXJyb3IoZmFsc2UpOwotCQlzaG93RXJyb3JKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JCi0JLy9vbGQgY29kZSBmb3Igc2hvd0Vycm9ycyBtZXRob2QKLQlwcm90ZWN0ZWQgdm9pZCBzaG93RXJyb3JzX29sZCgpIHsKLQkJLy8gc2F2ZSB0aGUgcHJldmlvdXMgaW52YWxpZCBlbGVtZW50cwotCQlMaXN0PE9iamVjdD4gaW52YWxpZCA9IGNsb3N1cmUuZ2V0SW52YWxpZEVsZW1lbnRzKCk7Ci0KLQkJY2xvc3VyZS5jaGVja0Vycm9yKCk7Ci0JCQotCQlpZiAoY29uZmlnVmlld2VySGlkZVVuY2hlY2tlZEZpbHRlci5pc0hpZGVVbmNoZWNrZWQoKSkgewotCQkJY29uZmlnVmlld2VyLnJlZnJlc2goKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGdldCB0aGUgbmV3IGVycm9yIGVsZW1lbnRzLCBhZGQgdG8gdGhlIHByZXZpb3VzIGVycm9yIGVsZW1lbnRzLAotCQkJLy8gYW5kIHVwZGF0ZSB0aGVtIHRvIHVwZGF0ZSB0aGUgZXJyb3Ivd2FybmluZyBpbWFnZXMKLQkJCWludmFsaWQuYWRkQWxsKGNsb3N1cmUuZ2V0SW52YWxpZEVsZW1lbnRzKCkpOwotCi0JCQkvLyBhbHNvIGFkZCB0aGUgVUkgZm9sZGVycwotCQkJQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjcCA9IChDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKSBjb25maWdWaWV3ZXIKLQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJaW52YWxpZC5hZGRBbGwoY3AuZ2V0VUlFbGVtZW50cygpKTsKLQotCQkJY29uZmlnVmlld2VyLnVwZGF0ZShpbnZhbGlkLnRvQXJyYXkoKSwgbnVsbCk7Ci0JCX0KLQotCX0KLQotCQotCS8qKgotCSAqIE1ha2UgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQ2xvc3VyZSgpIHsKLQkJY2xvc3VyZS5maXhFcnJvcnMoKTsKLQkJcmVmcmVzaFZpZXdlcnMoKTsKLS8vCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCQlzYXZlQ29uZmlndXJhdGlvbigpOwotCi0JfQotCi0JLyoqCi0JICogRml4IGFsbCB3YXJuaW5ncyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXhXYXJuaW5nKCkgewotCi0JCWNsb3N1cmUuZml4UHJvYmxlbXMoKTsKLQkJcmVmcmVzaFZpZXdlcnMoKTsJCi0vLwkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQkJc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQotCX0KLQotCS8qKgotCSAqIFNhdmUgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCVRydWUgaWYgY29uZmlndXJhdGlvbiBpcyBzYXZlIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCUNvbmZpZ3VyYXRpb25EYXRhIGNvbmZpZ0RhdGEgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZykKLQkJCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRGF0YSgpOwotCQkKLQkJY29uZmlnRGF0YS5zZXRFbmFibGVVcGRhdGUoZmFsc2UpOwotCQlib29sZWFuIHJldCA9IGRvU2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQkJY29uZmlnRGF0YS5zZXRFbmFibGVVcGRhdGUodHJ1ZSk7Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRvU2F2ZUNvbmZpZ3VyYXRpb24oKSB7Ci0KLQkJYm9vbGVhbiBvbGROb3RpZnkgPSBjb25maWcuZURlbGl2ZXIoKTsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgCQotCSAgICAJTGlzdDxNZXRob2RQYWNrYWdlPiBvbGRQYWNrYWdlcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGFja2FnZT4oY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JICAgIAlMaXN0PE1ldGhvZFBsdWdpbj4gb2xkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPihjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCSAgICAJCi0JICAgIAlTZXQ8TWV0aG9kUGFja2FnZT4gbmV3UGFja2FnZXMgPSBnZXRDaGVja2VkTWV0aG9kUGFja2FnZXMoY29uZmlnVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQkgICAgCVNldDxNZXRob2RQbHVnaW4+IG5ld1BsdWdpbnMgPSBnZXRDaGVja2VkTWV0aG9kUGx1Z2lucyhjb25maWdWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCSAgICAJCi0JICAgIAlvbGRQYWNrYWdlcy5yZW1vdmVBbGwobmV3UGFja2FnZXMpOwotCSAgICAJb2xkUGx1Z2lucy5yZW1vdmVBbGwobmV3UGx1Z2lucyk7Ci0JICAgIAkKLQkgICAgCW5ld1BhY2thZ2VzLnJlbW92ZUFsbChjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQkgICAgCW5ld1BsdWdpbnMucmVtb3ZlQWxsKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JICAgIAkKLQkJCWlmIChDb25maWd1cmF0aW9uVXRpbC5yZW1vdmVDb2xsRnJvbU1ldGhvZFBsdWdpbkxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG9sZFBsdWdpbnMpID09IGZhbHNlKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChDb25maWd1cmF0aW9uVXRpbC5yZW1vdmVDb2xsRnJvbU1ldGhvZFBhY2thZ2VMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBvbGRQYWNrYWdlcykgPT0gZmFsc2UpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAoQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvTWV0aG9kUGx1Z2luTGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgbmV3UGx1Z2lucykgPT0gZmFsc2UpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBhY2thZ2VMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBuZXdQYWNrYWdlcykgPT0gZmFsc2UpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQotCSAgICAJLy8gdmFsaWRhdGUgYmVmb3JlIHNhdmUKLQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0KLQkJCWFjdGlvbk1nci5leGVjdXRlKG5ldyBNZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kKGNvbmZpZywgVE9VQ0hFRF9CWV9DT05GSUdfRURJVE9SLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSkpOwotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCX0gZmluYWxseSB7Ci0JCQljb25maWcuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTYXZlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICogCQlUcnVlIGlmIGNvbmZpZ3VyYXRpb24gaXMgc2F2ZSBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmVDb250ZW50Q2F0ZWdvcnlTZWxlY3Rpb25zVG9Db25maWd1cmF0aW9uKCkgewotCQkKLSAgICAJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IG9sZEFkZENhdHMgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKSk7Ci0gICAgCUxpc3Q8Q29udGVudENhdGVnb3J5PiBvbGRTdWJDYXRzID0gbmV3IEFycmF5TGlzdDxDb250ZW50Q2F0ZWdvcnk+KGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0gICAgCQotICAgIAlTZXQ8Q29udGVudENhdGVnb3J5PiBuZXdBZGRDYXRzID0gZ2V0Q2hlY2tlZENvbnRlbnRDYXRlZ29yaWVzKGFkZENhdGVnb3J5Vmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLSAgICAJU2V0PENvbnRlbnRDYXRlZ29yeT4gbmV3U3ViQ2F0cyA9IGdldENoZWNrZWRDb250ZW50Q2F0ZWdvcmllcyhzdWJDYXRlZ29yeVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0gICAgCQotICAgIAlvbGRBZGRDYXRzLnJlbW92ZUFsbChuZXdBZGRDYXRzKTsKLSAgICAJb2xkU3ViQ2F0cy5yZW1vdmVBbGwobmV3U3ViQ2F0cyk7Ci0gICAgCQotICAgIAluZXdBZGRDYXRzLnJlbW92ZUFsbChjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLSAgICAJbmV3U3ViQ2F0cy5yZW1vdmVBbGwoY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLQkJCi0JCWlmIChDb25maWd1cmF0aW9uVXRpbC5yZW1vdmVDb2xsRnJvbUFkZGVkQ2F0ZWdvcnlMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBvbGRBZGRDYXRzKSA9PSBmYWxzZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICghbmV3QWRkQ2F0cy5pc0VtcHR5KCkpIHsKLQkJCWlmIChDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9BZGRlZENhdGVnb3J5TGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgbmV3QWRkQ2F0cykgPT0gZmFsc2UpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PiBwbHVnaW5NYXAgPSBNZXRob2RFbGVtZW50VXRpbC5idWlsZE1hcChjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCQkJSGFzaFNldDxNZXRob2RQbHVnaW4+IG5ld0FkZGVkUGx1Z2lucyA9IG5ldyBIYXNoU2V0PE1ldGhvZFBsdWdpbj4oKTsKLQkJCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IG5ld0FkZENhdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlDb250ZW50Q2F0ZWdvcnkgY2F0ID0gaXQubmV4dCgpOwotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXQpOwotCQkJCWlmICghIHBsdWdpbk1hcC5jb250YWluc0tleShwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCQlpZiAoISBuZXdBZGRlZFBsdWdpbnMuY29udGFpbnMocGx1Z2luKSkgewotCQkJCQkJbmV3QWRkZWRQbHVnaW5zLmFkZChwbHVnaW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCEgbmV3QWRkZWRQbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJCWlmIChDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9NZXRob2RQbHVnaW5MaXN0KGFjdGlvbk1nciwgY29uZmlnLCBuZXdBZGRlZFBsdWdpbnMpID09IGZhbHNlKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGFjdGlvbk1nciwgY29uZmlnKTsKLQkJCX0KLQkJCQotCQl9Ci0JCWlmIChDb25maWd1cmF0aW9uVXRpbC5yZW1vdmVDb2xsRnJvbVN1YnRyYWN0ZWRDYXRlZ29yeUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG9sZFN1YkNhdHMpID09IGZhbHNlKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb1N1YnRyYWN0ZWRDYXRlZ29yeUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG5ld1N1YkNhdHMpID09IGZhbHNlKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWFjdGlvbk1nci5leGVjdXRlKG5ldyBNZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kKGNvbmZpZywgVE9VQ0hFRF9CWV9DT05GSUdfRURJVE9SLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2V0PENvbnRlbnRDYXRlZ29yeT4gZ2V0Q2hlY2tlZENvbnRlbnRDYXRlZ29yaWVzKE9iamVjdFtdIGNoZWNrZWRJdGVtcykgewotCQlTZXQ8Q29udGVudENhdGVnb3J5PiByZXN1bHQgPSBuZXcgSGFzaFNldDxDb250ZW50Q2F0ZWdvcnk+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgaXRlbSA9IFRuZ1V0aWwudW53cmFwKGNoZWNrZWRJdGVtc1tpXSk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotLy8JCQkJaWYgKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oKENvbnRlbnRDYXRlZ29yeSlpdGVtKSkpIHsKLQkJCQkJcmVzdWx0LmFkZCgoQ29udGVudENhdGVnb3J5KWl0ZW0pOwotLy8JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBTZXQ8TWV0aG9kUGFja2FnZT4gZ2V0Q2hlY2tlZE1ldGhvZFBhY2thZ2VzKE9iamVjdFtdIGNoZWNrZWRJdGVtcykgewotCQlTZXQ8TWV0aG9kUGFja2FnZT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8TWV0aG9kUGFja2FnZT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBpdGVtID0gVG5nVXRpbC51bndyYXAoY2hlY2tlZEl0ZW1zW2ldKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCXJlc3VsdC5hZGQoKE1ldGhvZFBhY2thZ2UpaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNldDxNZXRob2RQbHVnaW4+IGdldENoZWNrZWRNZXRob2RQbHVnaW5zKE9iamVjdFtdIGNoZWNrZWRJdGVtcykgewotCQlTZXQ8TWV0aG9kUGx1Z2luPiByZXN1bHQgPSBuZXcgSGFzaFNldDxNZXRob2RQbHVnaW4+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgaXRlbSA9IFRuZ1V0aWwudW53cmFwKGNoZWNrZWRJdGVtc1tpXSk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJlc3VsdC5hZGQoKE1ldGhvZFBsdWdpbilpdGVtKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGxpYkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGxheW91dExpc3RlbmVyICE9IG51bGwpIHsKLQkJCVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UucmVtb3ZlTGlzdGVuZXIobGF5b3V0TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkgewotCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQljbG9zdXJlID0gbnVsbDsKLQkJfQotCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJLy8gc2VsZWN0IHByb2JsZW0gaW4gbWFpbiB2aWV3ZXIKLQkJCi0JCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIuSU5TVEFOQ0UuZ2V0RXJyb3JNZXRob2RFbGVtZW50KG1hcmtlcik7Ci0KLQkJaWYgKGUgIT0gbnVsbCAmJiBjb25maWdWaWV3ZXIgIT0gbnVsbCkgewotCQkJY29uZmlnVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGUpKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9RdWlja0ZpeChJTWFya2VyIG1hcmtlcikgewotCQlpZiAoIG1hcmtlciA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hcmtlckhlbHBlci5nZXRDYXVzZU1ldGhvZEVsZW1lbnQobWFya2VyKTsJCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uRGF0YSgpLmlzRWxlbWVudEluU3VidHJhY3RlZENhdGVnb3J5KGVsZW1lbnQpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25QYWdlX1F1aWNrZml4RXJyb3JfcmVhc29uMSwgCi0JCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpfSkpOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlndXJhdGlvblBhZ2VfcXVpY2tmaXhFcnJvcl90aXRsZSwgCi0JCQkJCQltZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IG93bmVyID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQkJY29uZmlnVmlld2VyLnNldENoZWNrZWQob3duZXIsIHRydWUpOwotCQlzYXZlQ29uZmlndXJhdGlvbigpOwotCQlzaG93RXJyb3JzKCk7CQkJCQkKLSAgIH0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVIaWRlc0J1dHRvbldpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUsIFN0cmluZyBrZXkpIHsKLQkJT2JqZWN0IG9iaiA9IGUuZ2V0U291cmNlKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBvYmo7Ci0JCQlTdHJpbmcgdmFsdWUgPSBidXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBCb29sZWFuLlRSVUUudG9TdHJpbmcoKQotCQkJCQk6IEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKG5ldyBNZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kKGNvbmZpZywga2V5LCB2YWx1ZSkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTc4YzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50RWxlbWVudEd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5HdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotLyoqCi0gKiBDbGFzcyBmb3IgR3VpZGFuY2UgdGFiIHBhZ2UgaW4gdGhlIGNvbnRlbnQgZWxlbWVudCBlZGl0b3IuCi0gKiBDbGFzcyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSByZXBsYWNlcyBDYXRlZ29yeUd1aWRhbmNlUGFnZSBhbmQgaGFuZGxlcwotICogYWxsIGNvbnRlbnRlbGVtZW50J3MgZ3VpZGFuY2UgdGFiIGZlYXR1cmUuICAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImNhdGVnb3J5R3VpZGFuY2VzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGxpc3QgPSBNZXRob2RFbGVtZW50VXRpbAotCQkJCQkJLmdldFNlbGVjdGVkR3VpZGFuY2VzKGNvbnRlbnRFbGVtZW50KTsKLQkJCQlMaXN0IGxvY2FsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAmJiBjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2wpIHx8IG9iagotCQkJCQkJCS5lcXVhbHMoY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKSkgewotCQkJCQkJbG9jYWwuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGxvY2FsLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gQ29uc29saWRhdGluZyB0aGUgc2VwYXJhdGUgZm9ybSBwYWdlIGNvZGUKLQkJCQkvLyB0byBhY2NvbW9kYXRlIGJldHRlciBmaWx0ZXJpbmcuCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotLy8JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0vLwkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpLAotLy8JCQkJCQkJCShFc3RpbWF0ZSkgaXRlbSwgLTEpOwotLy8JCQkJCX0gZWxzZSAKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCQkJCQkoVG9vbE1lbnRvcikgaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEluIGNhc2Ugb2YgV29ya1Byb2R1Y3QsIFdvcmtQcm9kdWN0IGlzIGFzc29jaWF0ZWQgdG8gVG9vbE1lbnRvciwKLQkJCQkvLyBFc3RpbWF0ZSwgUmVwb3J0IGFuZCBUZW1wbGF0ZSBndWlkYW5jZQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IAotLy8JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0ZSkgewotLy8JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudCwKLS8vCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLAotLy8JCQkJCQkJCWl0ZW0sIC0xKTsKLS8vCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGFkZCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJInRvICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKQotCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyBjb250ZW50RWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEluIGNhc2Ugb2YgVGFzaywgVGFzayBpcyBhc3NvY2lhdGVkIHRvIFRvb2xNZW50b3IgYW5kCi0JCQkJLy8gRXN0aW1hdGUgZ3VpZGFuY2UKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSAKLS8vCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0vLwkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpLCBudWxsLAotLy8JCQkJCQkJCS0xKTsKLS8vCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgaXRlbSwKLQkJCQkJCQkJLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSW4gY2FzZSBvZiBXb3JrUHJvZHVjdCwgV29ya1Byb2R1Y3QgaXMgYXNzb2NpYXRlZCB0byBUb29sTWVudG9yLAotCQkJCS8vIEVzdGltYXRlLCBSZXBvcnQgYW5kIFRlbXBsYXRlIGd1aWRhbmNlCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksIGl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUZW1wbGF0ZSkgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLCBpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQkJY29udGVudEVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSAKLS8vCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQsCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCQludWxsLCAtMSk7Ci0vLwkJCQkJfQotCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCBpdGVtLAotCQkJCQkJCQktMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRGaWx0ZXJUeXBlcygpCi0JICogICAgICBUeXBlcyBhcmUgcmV0dXJuZWQgaW4gb3JkZXIgdG8gZGlzcGxheSBpbiB0aGUgZmlsdGVyIGRpYWxvZyBmb3IKLQkgKiAgICAgIHNlYXJjaCBiYXNlZCBvbiB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlcygpIHsKLQkJCi0JCVN0cmluZ1tdIHN0cjsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotCQkJc3RyID0gbmV3IFN0cmluZ1sxMV07Ci0JCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJc3RyID0gbmV3IFN0cmluZ1sxM107Ci0JCX0gZWxzZQotCQkJc3RyID0gbmV3IFN0cmluZ1s5XTsKLQkJaW50IGkgPSAwOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUzsKLQkJCS8vIFRPRE8gRXN0aW1hdGUgY29udGVudGVsZW1lbnQKLQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVBPUlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCQkvLyBUT0RPIEVzdGltYXRlIGNvbnRlbnRlbGVtZW50Ci0JCX0KLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQkKLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV2hpdGVwYXBlcil7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29uY2VwdCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2hlY2tsaXN0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEV4YW1wbGUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEd1aWRlbGluZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9hZG1hcCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZXBvcnQpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVtcGxhdGUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbil7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2xNZW50b3IpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlpZihjb250ZW50RWxlbWVudCAhPSBudWxsKQotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbiwgY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjI0ODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotCi0vKioKLSAqIFRoZSBkZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgQ29udGVudCBQYWNrYWdlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IExpYnJhcnlVSVRleHQuVEVYVF9DT05URU5UX1BBQ0tBR0UKLQkJCSsgIjogIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfZGVwZW5kZW5jeTsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKSBtZXRob2RFbGVtZW50OwotCQlkZXRhaWxTZWN0aW9uT24gPSBmYWxzZTsKLQkJZnVsbERlc2NPbiA9IGZhbHNlOwotCQlrZXlDb25zaWRlcmF0aW9uT24gPSBmYWxzZTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uT24gPSBmYWxzZTsKLQkJdmVyc2lvblNlY3Rpb25PbiA9IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQljcmVhdGVEZXBlbmRlbmN5U2VjdGlvbih0b29sa2l0KTsKLQkJLy8gU2V0IGZvY3VzIG9uIHRoZSBOYW1lIHRleHQgY29udHJvbC4KLQkJRGlzcGxheSBkaXNwbGF5ID0gZm9ybS5nZXRCb2R5KCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZihjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlcGVuZGVuY3lTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJU2VjdGlvbiBkZXBlbmRlbmN5U2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwgCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFUEVOREVOQ0lFU19TRUNUSU9OX05BTUUsIAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVBFTkRFTkNJRVNfU0VDVElPTl9ERVNDKTsKLQkJQ29tcG9zaXRlIGRlcGVuZGVuY3lDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZGVwZW5kZW5jeVNlY3Rpb24pOwotCi0JCVRhYmxlIGN0cmxfdGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGRlcGVuZGVuY3lDb21wb3NpdGUsIFNXVC5WX1NDUk9MTAotCQkJCXwgU1dULkNIRUNLIHwgU1dULlJFQURfT05MWSB8IFNXVC5DT0xPUl9CTFVFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0JCQljdHJsX3RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9kZXBlbmRlbmN5ID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIoY3RybF90YWJsZSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKChDb250ZW50UGFja2FnZSllbGVtZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY3RybF9kZXBlbmRlbmN5LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfZGVwZW5kZW5jeS5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwKLQkJCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCXJldHVybiBnZXREZXBlbmRlbmNpZXNQYWNrYWdlcyhjb250ZW50UGFja2FnZSkudG9BcnJheSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQljdHJsX2RlcGVuZGVuY3kuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCWN0cmxfZGVwZW5kZW5jeS5zZXRJbnB1dChjb250ZW50UGFja2FnZSk7Ci0KLQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCWN0cmxfZGVwZW5kZW5jeS5zZXRBbGxHcmF5ZWQodHJ1ZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZGVwZW5kZW5jeUNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCS8vIHJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJY3RybF9kZXBlbmRlbmN5LnJlZnJlc2goKTsKLQkJCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsR3JheWVkKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2RlcGVuZGVuY3kuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkoKENoZWNrYm94VGFibGVWaWV3ZXIpIG9iaikuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVwZW5kZW5jeSBwYWNrYWdlcyBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgcGFja2FnZQotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgZGVwZW5kZW5jeSBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPENvbnRlbnRQYWNrYWdlPiBnZXREZXBlbmRlbmNpZXNQYWNrYWdlcyhDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSkgewotCi0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRQYWNrYWdlLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZWxlbWVudHMuYWRkKChDb250ZW50RWxlbWVudCkgY29udGVudEVsZW1lbnQKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJfQotCQkJZWxlbWVudHMuYWRkQWxsKE1ldGhvZEVsZW1lbnRVdGlsCi0JCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCkpOwotCi0JCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0vKgkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKChSb2xlKSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tzKChSb2xlKSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0UHJpbWFyeVRhc2tzKChSb2xlKSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0U2Vjb25kYXJ5VGFza3MoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRTZWNvbmRhcnlUYXNrcygoUm9sZSkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ki8KLQkJCX0KLQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0UGVyZm9ybWVkQnkoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJCQl9Ci0JCQkJaWYgKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoKChUYXNrKSBjb250ZW50RWxlbWVudCkKLQkJCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMKLQkJCQkJCQkuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJCX0KLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPdXRwdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPdXRwdXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLS8qCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0TW9kaWZpZWRCeSgoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldE1hbmRhdG9yeUlucHV0VG9UYXNrcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzCi0JCQkJCQkJLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCQkJLmdldE1hbmRhdG9yeUlucHV0VG9UYXNrcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldE91dHB1dHRpbmdUYXNrcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRPdXRwdXR0aW5nVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVzKChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKGxpc3QpOwotCQkJCX0qLwotCQkJfQotCi0JCX0KLQotCQlMaXN0PENvbnRlbnRQYWNrYWdlPiBjcExpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRQYWNrYWdlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gKChDb250ZW50RWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpKS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlpZiAoIWNvbnRlbnRQYWNrYWdlLmVxdWFscyhvYmplY3QpKSB7Ci0JCQkJCWlmICghY3BMaXN0LmNvbnRhaW5zKChDb250ZW50UGFja2FnZSlvYmplY3QpKSB7Ci0JCQkJCQljcExpc3QuYWRkKChDb250ZW50UGFja2FnZSlvYmplY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjcExpc3Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIoY29udGVudFBhY2thZ2UpIH0pOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdhNjM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3RGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBBc3NpZ24gcGFnZSBpbiB0aGUgQ3VzdG9tIENhdGVnb3J5IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDdXN0b21DYXRlZ29yeSBjYXRlZ29yeTsKLQotCS8vcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JcHJpdmF0ZSBCdXR0b24gaW5jbHVkZUNoZWNrQm94OwotCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciB0eXBlQ29tYm9WaWV3ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5BU1NJR05fUEFHRV9USVRMRSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0JCQotCQljdHJsX2FkZC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFzc2lnbkFjdGlvbl90ZXh0KTsKLQkJY3RybF9yZW1vdmUuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy51bmFzc2lnbkFjdGlvbl90ZXh0KTsKLQkJCi0JCWNyZWF0ZUluY2x1ZGVDb21wb3NpdGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSW5jbHVkZUNvbXBvc2l0ZSgpIHsKLQkJY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhQ29tcG9zaXRlLCBHcmlkRGF0YS5GSUxMX0JPVEgsIDEsIDEsIDIpOwotCQlpbmNsdWRlQ2hlY2tCb3ggPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9pbmNsdWRlRWxlbWVudHNPZlR5cGUsIFNXVC5DSEVDSyk7Ci0JCWluY2x1ZGVDaGVja0JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpKTsKLQkJQ29tYm8gdHlwZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSk7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpKTsKLQkJdHlwZUNvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKHR5cGVDb21ibyk7Ci0JCXR5cGVDb21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQl0eXBlQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRUeXBlVGV4dCgoRUNsYXNzKSBlbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0pOwotCQl0eXBlQ29tYm9WaWV3ZXIuc2V0SW5wdXQoTGlicmFyeVV0aWwuZ2V0SW5jbHVkZWRFbGVtZW50VHlwZXMoKSk7Ci0JCQotCQkvLyBwb3B1bGF0ZSBkYXRhCi0JCS8vCi0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KGNhdGVnb3J5LCBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ1VTVE9NX0NBVEVHT1JZX19JTkNMVURFRF9FTEVNRU5UUyk7Ci0JCWlmKHByb3AgIT0gbnVsbCkgewotCQkJaW5jbHVkZUNoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCUVDbGFzc2lmaWVyIGNscyA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVyKHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQlpZihjbHMgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQl0eXBlQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNscykpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdHlwZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCS8vCi0JCWluY2x1ZGVDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXR5cGVDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldEVuYWJsZWQoaW5jbHVkZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl1cGRhdGVJbmNsdWRlKCk7Ci0JCQl9Ci0JCX0pOwotCQl0eXBlQ29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmKGluY2x1ZGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQl1cGRhdGVJbmNsdWRlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVJbmNsdWRlKCkgewotCQlpZihpbmNsdWRlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCVN0cmluZyB0eXBlOwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0eXBlQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZihzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJdHlwZSA9IFN0clV0aWwuRU1QVFlfU1RSSU5HOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHlwZSA9ICgoRUNsYXNzKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCX0KLQkJCU1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQgY21kID0gbmV3IE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQoY2F0ZWdvcnksCi0JCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DVVNUT01fQ0FURUdPUllfX0lOQ0xVREVEX0VMRU1FTlRTLCB0eXBlKTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyByZW1vdmUgcHJvcGVydHkgImluY2x1ZGUiCi0JCQkvLwotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoY2F0ZWdvcnksIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DVVNUT01fQ0FURUdPUllfX0lOQ0xVREVEX0VMRU1FTlRTKTsKLQkJCWlmKHByb3AgIT0gbnVsbCkgewotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGNhdGVnb3J5LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLCBwcm9wLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQljYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoY29udGVudEVsZW1lbnQsIGFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQlhZGRJdGVtc1RvTW9kZWwxKGFkZEl0ZW1zLCBjYXRlZ29yeSwgdXNlZENhdGVnb3JpZXMsCi0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBnZXRBbmNlc3RvcnMoY2F0ZWdvcnkpKTsKLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMsIAotCQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnksCi0JCQlBcnJheUxpc3QgdXNlZENhdGVnb3JpZXMsCi0JCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyLAotCQkJTGlzdDxPYmplY3Q+IGFuY2VzdG9ycwotCQkJKSB7Ci0JCWJvb2xlYW4gb2sgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KGNhdGVnb3J5LCBhZGRJdGVtcyk7Ci0JCWlmKCEgb2spIHsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfdGl0bGU7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5jaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZyk7CQkJCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vTGlzdDxPYmplY3Q+IGFuY2VzdG9ycyA9IGdldEFuY2VzdG9ycyhjYXRlZ29yeSk7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgY3VzdG9tQ2F0ZWdvcnkgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWlmIChjdXN0b21DYXRlZ29yeSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCQkmJiBUbmdVdGlsCi0JCQkJCQkJCS5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCX0gZWxzZSBpZiAoYW5jZXN0b3JzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjdXN0b21DYXRlZ29yeSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgb2JqZWN0ID0gKChQcm9jZXNzQ29tcG9uZW50KSBjdXN0b21DYXRlZ29yeSkKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9DdXN0b21DYXRlZ29yeSgKLQkJCQkJCQkJYWN0aW9uTWFuYWdlciwgY2F0ZWdvcnksIG9iamVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0N1c3RvbUNhdGVnb3J5KAotCQkJCQkJCQlhY3Rpb25NYW5hZ2VyLCBjYXRlZ29yeSwgY3VzdG9tQ2F0ZWdvcnksIHVzZWRDYXRlZ29yaWVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQlyZW1vdmVJdGVtc0Zyb21Nb2RlbDEocm1JdGVtcywgY2F0ZWdvcnksIHVzZWRDYXRlZ29yaWVzLAotCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZ2V0QW5jZXN0b3JzKGNhdGVnb3J5KSk7Ci0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMsCi0JCUN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5LAotCQlBcnJheUxpc3QgdXNlZENhdGVnb3JpZXMsCi0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXIsCi0JCUxpc3Q8T2JqZWN0PiBhbmNlc3RvcnMKLQkJKSB7Ci0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUFycmF5TGlzdDxNZXRob2RFbGVtZW50PiBjdXN0b21DYXRlZ29yaWVzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCQlNZXRob2RQbHVnaW4gY3VycmVudFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5KTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLS8vCQkJCQlBZGFwdGVyIGFkYXB0ZXIgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotLy8JCQkJCQkJCQljYXRlZ29yeSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsCi0vLwkJCQkJCQkmJiBhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotLy8JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIpCi0vLwkJCQkJCQkJLmdldENoaWxkcmVuKGNhdGVnb3J5KS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJCQlpZiAoVG5nVXRpbC51bndyYXAobykgPT0gZSkgewotLy8JCQkJCQkJCWN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZS5hZGQobyk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyB3aWxsIGRlbGV0ZSBlIGlmIGl0IGlzIGluIHRoZSBjdXJyZW50IHBsdWdpbiBhbmQKLQkJCQkJLy8gdGhlIGxhc3Qgc3VwZXIgY3VzdG9tIGNhdGVnb3J5IG9mIGUgaW4gdGhlIGN1cnJlbnQgcGx1Z2luCi0JCQkJCS8vCi0JCQkJCWlmKFRuZ1V0aWwuaXNJblBsdWdpbldpdGhMZXNzVGhhbk9uZVN1cGVyQ3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBlLCBjdXJyZW50UGx1Z2luKSkgewotCQkJCQkJY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLmFkZChlKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWFjdGlvbk1hbmFnZXIsIGNhdGVnb3J5LCBlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0KLQkJCWlmIChjdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuc2l6ZSgpID4gMCkgewotCQkJCWludCBpID0gMDsKLQkJCQlTdHJpbmdCdWZmZXIgZWxlbWVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0Lm5leHQoKSk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCQllbGVtZW50U3RyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxlbWVudFN0ci5hcHBlbmQoKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKSk7Ci0KLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZighQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlX3RleHQsCi0JCQkJCQlOTFMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0LCBlbGVtZW50U3RyKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7IAotCQkJCQkJY29uZmlybSA9IGZhbHNlOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzdXBlci5ydW4oKTsKLQkJCQkJCX0gY2F0Y2ggKE1lc3NhZ2VFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgZGV0YWlscyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGUpOwotCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlOyAKLQkJCQkJCQlTdHJpbmcgcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb247IAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgcmVhc29uLAotCQkJCQkJCQkJCQlkZXRhaWxzLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZhaWxlZCgpIHsKLQkJCQkJCS8vIGxpYnJhcnkgbmVlZCB0byBiZSByZWxvYWRlZAotCQkJCQkJU3RyaW5nIGxpYkRpciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCQkJCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShsaWJEaXIpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQkJZGVsZXRlQWN0aW9uLnNldEVkaXRpbmdEb21haW4oTGlicmFyeVZpZXcuZ2V0VmlldygpCi0JCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJCQlkZWxldGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCWN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZSkpOwotCQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJCS8vc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhbmNlc3RvcnMgZm9yIHRoZSBnaXZlbiBDdXN0b20gQ2F0ZWdvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdD4gZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0PE9iamVjdD4gYW5jZXN0b3JMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCUxpc3Q8T2JqZWN0PiBvYmpMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCW9iakxpc3QuYWRkKG1ldGhvZE9iamVjdCk7Ci0JCWdldEFuY2VzdG9ycyhhbmNlc3Rvckxpc3QsIG9iakxpc3QpOwotCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8T2JqZWN0PiBnZXRBbmNlc3RvcnMoTGlzdDxPYmplY3Q+IGFuY2VzdG9yTGlzdCwgTGlzdDxPYmplY3Q+IG1ldGhvZE9iamVjdExpc3QpIHsKLQkJaWYgKG1ldGhvZE9iamVjdExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQotCQlMaXN0IGFsbFBhcmVudEN1c3RDYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUN1c3RvbUNhdGVnb3J5IGVsZW1lbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlbGVtZW50KTsKLQkJCWFsbFBhcmVudEN1c3RDYXRzLmFkZEFsbChwYXJlbnRMaXN0KTsKLQkJfQotCi0JCWFuY2VzdG9yTGlzdC5hZGRBbGwobWV0aG9kT2JqZWN0TGlzdCk7Ci0JCUxpc3Q8T2JqZWN0PiBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUzsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEN1c3RvbUNhdGVnb3J5QXNzaWduRmlsdGVyIGV4dGVuZHMgQWxsRmlsdGVyIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCXJldHVybiAhKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCS8vIGlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCQkvLyByZXR1cm4KLQkJCQkvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpOwotCQkJCS8vIH0KLQkJCQkvLyBpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCl7Ci0JCQkJLy8gcmV0dXJuCi0JCQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldClvYmopLmlzRW1wdHkoKTsKLQkJCQkvLyB9Ci0JCQkJcmV0dXJuICEoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5QXNzaWduRmlsdGVyKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKSB7Ci0JCXJldHVybiBhbGxTdGVwczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmJlYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkN1c3RvbUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImN1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDdXN0b21DYXRlZ29yeSBjYXRlZ29yeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQljYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgY29udGVudEVsZW1lbnQ7Ci0JCXB1Ymxpc2hDYXRlZ29yeU9uID0gdHJ1ZTsKLQkJc2V0SWNvblNlY3Rpb25Pbih0cnVlKTsKLQkJc2V0RXh0ZXJuYWxJRE9uKHRydWUpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUZpbHRlcigpOwotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKEN1c3RvbUNhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCWNhdGVnb3J5KSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSAgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NWYxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogRGVzY3JpcHRpb24gcGFnZSBmb3IgZGVsaXZlcnkgcHJvY2VzcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3NjYWxlLCBjdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yaXNrX2xldmVsLCBjdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlLAotCQkJY3RybF90eXBlX29mX2NvbnRyYWN0OwotCi0JcHJpdmF0ZSBEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Zvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzczsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jY3JlYXRlRGV0YWlsU2VjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZURldGFpbFNlY3Rpb24odG9vbGtpdCk7Ci0KLQkJLy8gc2NhbGUKLQkJY3RybF9zY2FsZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19TY2FsZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBwcm9qZWN0IGNoYXJhY3RlcmlzdGljcwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcywgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyByaXNrIGxldmVsCi0JCWN0cmxfcmlza19sZXZlbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Jpc2tMZXZlbCwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBFc3RpbWF0aW5nIHRlY2huaXF1ZQotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gUHJvamVjdCBNZW1iZXIgZXhwZXJ0aXNlCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBUeXBlIG9mIGNvbnRyYWN0Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0LCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihkZXRhaWxDb21wb3NpdGUpOwotCi0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI2xvYWREYXRhKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNvbnRlbnQgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbikgZGVsaXZlcnlQcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQlTdHJpbmcgc2NhbGUgPSBjb250ZW50LmdldFNjYWxlKCk7Ci0JCVN0cmluZyBwcm9qZWN0Q2hhciA9IGNvbnRlbnQuZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQlTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IGNvbnRlbnQuZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCQlTdHJpbmcgcmlza0xldmVsID0gY29udGVudC5nZXRSaXNrTGV2ZWwoKTsKLQkJU3RyaW5nIHByb2plY3RNZW1iZXJFeHBlcnRpZXNlID0gY29udGVudC5nZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCVN0cmluZyB0eXBlT2ZDb250cmFjdCA9IGNvbnRlbnQuZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCQljdHJsX3NjYWxlLnNldFRleHQoc2NhbGUgPT0gbnVsbCA/ICIiIDogc2NhbGUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MKLQkJCQkuc2V0VGV4dChwcm9qZWN0Q2hhciA9PSBudWxsID8gIiIgOiBwcm9qZWN0Q2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMKLQkJCQkuc2V0VGV4dChlc3RpbWF0aW5nVGVjaG5pcXVlID09IG51bGwgPyAiIiA6IGVzdGltYXRpbmdUZWNobmlxdWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcmlza19sZXZlbC5zZXRUZXh0KHJpc2tMZXZlbCA9PSBudWxsID8gIiIgOiByaXNrTGV2ZWwpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlCi0JCQkJLnNldFRleHQocHJvamVjdE1lbWJlckV4cGVydGllc2UgPT0gbnVsbCA/ICIiIDogcHJvamVjdE1lbWJlckV4cGVydGllc2UpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdHlwZV9vZl9jb250cmFjdAotCQkJCS5zZXRUZXh0KHR5cGVPZkNvbnRyYWN0ID09IG51bGwgPyAiIiA6IHR5cGVPZkNvbnRyYWN0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKTsKLQkJZmluYWwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJZmluYWwgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQljdHJsX3NjYWxlLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfc2NhbGUuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkpOwotCQljdHJsX3NjYWxlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfc2NhbGUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3NjYWxlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFNjYWxlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBkZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3M7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9yaXNrX2xldmVsLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSk7Ci0JCWN0cmxfcmlza19sZXZlbC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Jpc2tfbGV2ZWwuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3Jpc2tfbGV2ZWw7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0Umlza0xldmVsKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBkZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZQotCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQluZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCTogY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2U7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3R5cGVfb2ZfY29udHJhY3Quc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfdHlwZV9vZl9jb250cmFjdDsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRUeXBlT2ZDb250cmFjdCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3NjYWxlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNWVkMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbHVtbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudXRpbC5Db252ZXJ0R3VpZGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIERlc2NyaXB0aW9uIHBhZ2VzIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzODIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaXB0aW9uRm9ybVBhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgaW1wbGVtZW50cyBJUmVmcmVzaGFibGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1dJRFRIID0gMTUwOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9BUFBMSUNBQkxFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RBcHBsaWNhYmxlX3RleHQ7IAotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb250cmlidXRlc190ZXh0OyAKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfQ09OVFJJQlVURVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxvY2FsQ29udHJpYnV0ZXNfdGV4dDsgIAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9SRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubG9jYWxSZXBsYWNlc190ZXh0OyAKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRTX1JFUExBQ0VTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRzUmVwbGFjZXNfdGV4dDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KTsKLQkKLQkvLyBDb21wb3NpdGVzIGFuZCBzZWN0aW9ucy4KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gdmFyaWFiaWxpdHlTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB2YXJpYWJpbGl0eUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIHZlcnNpb25TZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB2ZXJzaW9uQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gaWNvblNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGljb25Db21wb3NpdGU7Ci0KLQlwcml2YXRlIENhbnZhcyBwYW5lMTsKLQotCXByaXZhdGUgQ2FudmFzIHBhbmUzOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZGV0YWlsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZGV0YWlsQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gbm90YXRpb25TZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBub3RhdGlvbkNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIHRhaWxvcmluZ1NlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHRhaWxvcmluZ0NvbXBvc2l0ZTsKLQotCS8vIEVkaXQgY29udHJvbHMuCi0JcHJvdGVjdGVkIFRleHQgY3RybF9uYW1lOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9wcmVzZW50YXRpb25fbmFtZTsKLQotCXByb3RlY3RlZCBMYWJlbCBjdHJsX3R5cGVfbGFiZWw7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfdHlwZV9idXR0b247Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZnVsbF9kZXNjOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjdHJsX2tleTsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3RybF9leHBhbmRlZDsKLQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciB2aWV3ZXJfdmFyaWFiaWxpdHk7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gY3RybF92YXJpYWJpbGl0eTsKLQotCXByb3RlY3RlZCBMYWJlbCBsYWJlbF9iYXNlOwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGJhc2Vfdmlld2VyOwotCi0JcHJvdGVjdGVkIFRhYmxlIGN0cmxfYmFzZTsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9iYXNlX2J1dHRvbjsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9hdXRob3JzOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9jaGFuZ2VfZGF0ZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NoYW5nZV9kZXNjOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByb3RlY3RlZCBMYWJlbCBsYWJlbF9jb3B5cmlnaHQ7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY29weXJpZ2h0X3ZpZXdlcjsKLQotCXByb3RlY3RlZCBUYWJsZSBjdHJsX2NvcHlyaWdodDsKLQotCXByaXZhdGUgQnV0dG9uIGNvcHlyaWdodF9idXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0OwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZERldGFpbExpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kRGV0YWlsTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTm90YXRpb25MaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZE5vdGF0aW9uTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kVGFpbG9yaW5nTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmRUYWlsb3JpbmdMYWJlbDsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9wdXJwb3NlOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9leHRlcm5hbF9pZDsKLQotCXByaXZhdGUgSW1hZ2Ugc2hhcGVJbWFnZTsKLQotCXByaXZhdGUgSW1hZ2Ugbm9kZUltYWdlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3NlbGVjdF9zaGFwZUljb25fYnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b247Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b247Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kVmVyc2lvbkxpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kVmVyc2lvbkxhYmVsOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kTGFiZWw7Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlckJhc2U7Ci0JCi0JcHJpdmF0ZSBJQ29sdW1uUHJvdmlkZXIgY29sdW1uUHJvdmlkZXI7Ci0JCi0JcHJpdmF0ZSBMaXN0PElTZWN0aW9uUHJvdmlkZXI+IHNlY3Rpb25Qcm92aWRlcnM7Ci0JCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eSA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJPYmplY3QgPSAoVmFyaWFiaWxpdHlUeXBlKSBvYmplY3Q7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5OQSkKLQkJCQlyZXR1cm4gTk9UX0FQUExJQ0FCTEVfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKQotCQkJCXJldHVybiBDT05UUklCVVRFU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKQotCQkJCXJldHVybiBMT0NBTF9DT05UUklCVVRFU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykKLQkJCQlyZXR1cm4gRVhURU5EU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpCi0JCQkJcmV0dXJuIFJFUExBQ0VTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkKLQkJCQlyZXR1cm4gTE9DQUxfUkVQTEFDRVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpCi0JCQkJcmV0dXJuIEVYVEVORFNfUkVQTEFDRVNfVEVYVDsKLQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJCYXNlID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb3B5cmlnaHRDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNvcHlyaWdodExhYmVsUHJvdmlkZXJCYXNlID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbW9kZWxNb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0JCi0JCi0JcHJvdGVjdGVkIEZvY3VzQWRhcHRlciBuYW1lRm9jdXNMaXN0ZW5lciA9IG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBtZXRob2RFbGVtZW50LmdldE5hbWUoKSA7Ci0JCQlTdHJpbmcgbmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCWUud2lkZ2V0LCBtZXRob2RFbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobmFtZS5lcXVhbHMobWV0aG9kRWxlbWVudC5nZXROYW1lKCkpKQotCQkJCXJldHVybjsKLQkJCQotCQkJLy8gMTc4NDYyCi0JCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCWlmIChvbGRDb250ZW50LmluZGV4T2YoIiYiKSA8IDAgJiYgbmFtZS5pbmRleE9mKCImIikgPiAtMSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltc2cgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQluYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXROYW1lVmFsaWRhdG9yKCk7Ci0JCQkJaWYodmFsaWRhdG9yID09IG51bGwpewotCQkJCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmNyZWF0ZU5hbWVWYWxpZGF0b3IoCi0JCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQl9Ci0JCQkJbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZSk7Ci0JCQl9Ci0JCQlpZiAobXNnID09IG51bGwgJiYgIW5hbWUuZXF1YWxzKG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCWlmKG5hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQltc2cgPSBOTFMuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnLAotCQkJCQkJCW5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCW5hbWUgPSBTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKGN0cmxfbmFtZS5nZXRUZXh0KCkpOwotCQkJCWN0cmxfbmFtZS5zZXRUZXh0KG5hbWUpOyAvLzE4MzA4NAotCQkJCWlmICghbmFtZS5lcXVhbHMobWV0aG9kRWxlbWVudC5nZXROYW1lKCkpKSB7CQkJCQkJCi0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQluYW1lLCAtMSk7Ci0JCQkJCWlmICghc3VjY2VzcykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkJLmhhc1ByZXNlbnRhdGlvbihtZXRob2RFbGVtZW50KSkgewotCQkJCQkJUmVzb3VyY2UgY29udGVudFJlc291cmNlID0gY29udGVudEVsZW1lbnQKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKGNvbnRlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJCS5hZGRSZXNvdXJjZVRvQWRqdXN0TG9jYXRpb24oY29udGVudFJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJCQkJY3RybF9uYW1lLnNldFRleHQobmFtZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvL0ZpeCBtaXNzaW5nICImIiBpbiBlcnJvciBkaWFsb2cKLQkJCQlpZiAobXNnLmluZGV4T2YoIiYiKSA+PSAwKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQltc2cgPSBtc2cucmVwbGFjZSgiJiIsICImJiIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZUVycm9yX3RpdGxlLCAKLQkJCQkJCQkJbXNnKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJY3RybF9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCWN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8vIEVkaXRpbmcgYW5kIGRpc3BsYXkgZmxhZ3MuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVzY0V4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG5vdGF0aW9uU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHRhaWxvcmluZ1NlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGVsZW1lbnRTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWNvblNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmdWxsRGVzY09uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGtleUNvbnNpZGVyYXRpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBicmllZkRlc2NPbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbGVtZW50VHlwZU9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250ZW50RmllbGRPbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvblNlY3Rpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbnlBdHRyaWJ1dGVNb2RpZmllZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhbFNlY3Rpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RhdGlvblNlY3Rpb25PbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsU2VjdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHRhaWxvcmluZ1NlY3Rpb25PbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFyaWFiaWxpdHlTZWN0aW9uT24gPSB0cnVlOwotCQotCXByb3RlY3RlZCBib29sZWFuIHNsb3RTZWN0aW9uT249IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVycG9zZU9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbElkT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGljb25TZWN0aW9uT24gPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoQ2F0ZWdvcnlPbiA9IGZhbHNlOwotCi0JLy8gY29tbWVudGVkIGJlY2F1c2UgdGhlc2UgdmFyaWFibGVzIGFyZSBub3QgaW4gdXNlCi0JLy8gcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVOb25lID0gTk9UX0FQUExJQ0FCTEVfVEVYVDsKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZUNvbnRyaWJ1dGVzID0gQ09OVFJJQlVURVNfVEVYVDsKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZUV4dGVuZHMgPSBFWFRFTkRTX1RFWFQ7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVSZXBsYWNlcyA9IFJFUExBQ0VTX1RFWFQ7Ci0KLQkvLyBJbnRlcm5hbCBJRHMgZm9yIHRoZSBzZWN0aW9ucy4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBHRU5FUkFMX1NFQ1RJT05fSUQgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMX1NFQ1RJT05fSUQgPSAyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9TRUNUSU9OX0lEID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OX1NFQ1RJT05fSUQgPSA0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEFJTE9SSU5HX1NFQ1RJT05fSUQgPSA1OwotCi0JcHJpdmF0ZSBpbnQgd2FybmluZ0NvdW50ID0gMTsKLQotCXByaXZhdGUgaW50IFNFQ1RJT05TID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBTSEFQRUlDT05fV0lEVEhfTUFYID0gMzI7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgU0hBUEVJQ09OX0hFSUdIVF9NQVggPSAzMjsKLQotCXByaXZhdGUgc3RhdGljIGludCBOT0RFSUNPTl9XSURUSF9NQVggPSAxNjsKLQotCXByaXZhdGUgc3RhdGljIGludCBOT0RFSUNPTl9IRUlHSFRfTUFYID0gMTY7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQkvLyBUbyBoYW5kbGUgdGhlIGkxMThuIHByb3Blcmx5IGFuZCBhdm9pZCBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyBkZXRhaWxTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyB0YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyBub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgaWNvblNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIHZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIExhYmVsIG5vZGVJY29uUGF0aDsKLQotCXByaXZhdGUgTGFiZWwgc2hhcGVJY29uUGF0aDsKLQkKLQlwcml2YXRlIFN0cmluZ1tdIGltYWdlVHlwZXMgPSBuZXcgU3RyaW5nW10geyAiKi5naWY7Ki5qcGc7Ki5wbmc7Ki5pY287Ki5ibXAiIH07IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZ1tdIGltYWdlTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiSW1hZ2UgKGdpZiwganBlZywgcG5nLCBpY28sIGJtcCkiIH07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIENvbnRlbnQgZmlsdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIENvbnRlbnQgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJCYXNlKCkgewotCQljb250ZW50UHJvdmlkZXJCYXNlID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJQXJyYXlMaXN0IGJhc2Vfc2VsZWN0ZWRfbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpCi0JCQkJCWJhc2Vfc2VsZWN0ZWRfbGlzdC5hZGQoY29udGVudEVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlyZXR1cm4gYmFzZV9zZWxlY3RlZF9saXN0LnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYmFzZV92aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlckJhc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBmb3JtIGVkaXRvci4KLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBWYXJpYWJpbGl0eVR5cGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBWYXJpYWJpbGl0eVR5cGVbXSB0eXBlczsKLQotCQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlQ29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBWYXJpYWJpbGl0eVR5cGVbXSB0eXBlcykgewotCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJdGhpcy50eXBlcyA9IHR5cGVzOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpID09IG1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQKLQkJCQkJJiYgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUpIHsKLQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJCi0JCVZhcmlhYmlsaXR5VHlwZVtdIHR5cGVzOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJdHlwZXMgPSBuZXcgVmFyaWFiaWxpdHlUeXBlW10gewotCQkJCQlWYXJpYWJpbGl0eVR5cGUuTkEsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUwotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCXR5cGVzID0gbmV3IFZhcmlhYmlsaXR5VHlwZVtdIHsKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTCi0JCQl9OwotCQl9Ci0JCWNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5ID0gbmV3IFZhcmlhYmlsaXR5VHlwZUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCB0eXBlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0JCWNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCXNldENvbnRleHRIZWxwKCk7Ci0JCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQlsb2FkRGF0YSgpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCkgewotCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBtZXRob2RFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBzZWUgVG5nVXRpbCNnZXRMYWJlbCBDb2RlIG1vdmVkIHRvIFRuZ1V0aWwuZ2V0TGFiZWwoYmVsb3cgbW9yZSBzcGVjaWZpYwotCSAqICAgICAgbWV0aG9kKXJldHVybnMgbGFiZWwgd2l0aCB2YXJpYWJpbGl0eUluZm8KLQkgKiAgICAgIDxjb2RlPlRuZ1V0aWwuZ2V0TGFiZWwoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCwgU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwsIGJvb2xlYW4gcHJlZmVyQmFzZSk8L2NvZGU+Ci0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0LCBTdHJpbmcgYWx0ZXJuYXRpdmVMYWJlbCwKLQkJCWJvb2xlYW4gcHJlZmVyQmFzZSkgewotCQlTdHJpbmcgbGFiZWwgPSBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgYWx0ZXJuYXRpdmVMYWJlbCk7Ci0JCWlmIChwcmVmZXJCYXNlICYmIG9iamVjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBvYmplY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlTdHJpbmcgdmFyaWFiaWxpdHlUeHQgPSBudWxsOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmNvbnRyaWJ1dGVzX3RvX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCS5sb2NhbENvbnRyaWJ1dGVzX3RleHQ7IAkJCQotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7CQkJCQkKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkuZXh0ZW5kc190ZXh0OwotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5yZXBsYWNlc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkubG9jYWxSZXBsYWNlc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUykgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkuZXh0ZW5kc1JlcGxhY2VzX3RleHQ7IAotCQkJfQotCQkJaWYgKHZhcmlhYmlsaXR5VHh0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcihsYWJlbCkKLQkJCQkJCS5hcHBlbmQoIiAoIikuYXBwZW5kKHZhcmlhYmlsaXR5VHh0KS5hcHBlbmQoIiAnIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKAotCQkJCQkJCQlUbmdVdGlsLmdldExhYmVsKG9iamVjdAotCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQkJYWx0ZXJuYXRpdmVMYWJlbCkpLmFwcGVuZCgiJyIpOyAvLyROT04tTkxTLTEkCi0JCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihvYmplY3QKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwpIHsKLQkJCQkJc3RyQnVmCi0JCQkJCQkJLmFwcGVuZCgiIGluICciKS5hcHBlbmQoYmFzZVBsdWdpbi5nZXROYW1lKCkpLmFwcGVuZCgiJykiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWxhYmVsID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdG9yIHRhYiBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCWNyZWF0ZUZvcm1Db21wb3NpdGVzKHRvb2xraXQpOwotCQlsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQotCQkvLyBjaGVjayBmb3IgZXh0ZW5zaW9uIHNlY3Rpb24gaWYgYW55Ci0JCWxvYWRTZWN0aW9uUHJvdmlkZXJzKCk7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIEdlbmVyYWwgc2VjdGlvbi4KLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZUdlbmVyYWxTZWN0aW9uKHRvb2xraXQpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN0aW9uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCU9iamVjdCBwcm92aWRlciAgPSBzZWN0aW9uUHJvdmlkZXJzLmdldChpKTsKLQkJCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJU2VjdGlvblByb3ZpZGVyKSB7Ci0JCQkJCSgoSVNlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpLCB0b29sa2l0LAotCQkJCQkJCXNlY3Rpb25Db21wb3NpdGUpOwotCQkJCQlTRUNUSU9OUysrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBDcmVhdGUgdGhlIFNsb3QgU2VjdGlvbgotCQlpZiAoc2xvdFNlY3Rpb25PbikgewotCQkJY3JlYXRlU2xvdFNlY3Rpb24odG9vbGtpdCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgdGhlIERldGFpbCBzZWN0aW9uLgotCQlpZiAoZGV0YWlsU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVEZXRhaWxTZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgTm90YXRpb24gc2VjdGlvbi4KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVOb3RhdGlvblNlY3Rpb24odG9vbGtpdCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBUYWlsb3JpbmcgU2VjdGlvbi4KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJY3JlYXRlVGFpbG9yaW5nU2VjdGlvbih0b29sa2l0KTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIFZlcnNpb24gc2VjdGlvbi4KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVZlcnNpb25TZWN0aW9uKHRvb2xraXQpOwotCQkJY3JlYXRlVmVyc2lvblNlY3Rpb25Db250ZW50KCk7Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih2ZXJzaW9uQ29tcG9zaXRlKTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0JCQotCQkKLQkJaWYgKHZhcmlhYmlsaXR5U2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVWYXJpYWJpbGl0eVNlY3Rpb24odG9vbGtpdCk7Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih2YXJpYWJpbGl0eUNvbXBvc2l0ZSk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0JCQotCQkvLyBJY29uIFNlY3Rpb24KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWNyZWF0ZUljb25TZWN0aW9uKHRvb2xraXQpOwotCQkJY3JlYXRlSWNvblNlY3Rpb25Db250ZW50KCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJaWYgKGV4cGFuZGVkQ29tcG9zaXRlICE9IG51bGwpCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihleHBhbmRlZENvbXBvc2l0ZSk7Ci0JfQotCi0JCi0JLyoqIAotCSAqIEdldCBhbGwgc2VjdGlvbiBwcm92aWRlcnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0PElTZWN0aW9uUHJvdmlkZXI+IGxvYWRTZWN0aW9uUHJvdmlkZXJzKCkgewotCQlpZiAoc2VjdGlvblByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQlzZWN0aW9uUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb25zKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAiZGVzY3JpcHRpb25QYWdlU2VjdGlvblByb3ZpZGVyIiwgSVNlY3Rpb25Qcm92aWRlci5jbGFzcyk7IC8vJE5PTi1OTFMtMSQJCi0JCX0KLQkJcmV0dXJuIHNlY3Rpb25Qcm92aWRlcnM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JtQ29tcG9zaXRlcyhGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIENyZWF0ZSB0aGUgbWFpbiBzZWN0aW9uICh1c2VkIGZvciBzd2FwcGluZyBkaXNwbGF5IG9mCi0JCS8vIHNlY3Rpb25Db21wb3NpdGUgYW5kIGV4cGFuZGVkQ29tcG9zaXRlKS4KLQkJZm9ybVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uTk9fVElUTEUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCW1haW5Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCUZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCW1haW5Db21wb3NpdGUuc2V0TGF5b3V0KCBsYXlvdXQpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KG1haW5Db21wb3NpdGUpOwotCQl9Ci0JCQotCQotCQkvLyBjaGVjayBmb3IgZXh0ZW5zdGlvbiBwb2ludCBhbmQgYWRkIHRoZSBwYWdlIGlmIHRoZXJlCi0JCUxpc3Q8Pz4gY29sdW1uUHJvdmlkZXJzID0gRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDb2x1bW5Qcm92aWRlcnMoKTsKLQotCQlpZiAoY29sdW1uUHJvdmlkZXJzID09IG51bGwgfHwgY29sdW1uUHJvdmlkZXJzLnNpemUoKSA9PSAwKSB7Ci0JCQljcmVhdGVTZWN0aW9uQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIDAsIDEwMCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUNvbHVtbkVsZW1lbnQgY29sdW1uID0gKENvbHVtbkVsZW1lbnQpIGNvbHVtblByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJCU9iamVjdCBwcm92aWRlckNsYXNzID0gY29sdW1uLmdldENvbnRyaWJ1dG9yQ2xhc3MoKTsKLQkJCQkJaW50IHdpZHRoID0gY29sdW1uLmdldFdpZHRoKCk7Ci0JCQkJCVN0cmluZyBhbGlnbm1lbnQgPSBjb2x1bW4uZ2V0QWxpZ25tZW50KCk7Ci0JCQkJCQotCQkJCQlpZiAocHJvdmlkZXJDbGFzcyBpbnN0YW5jZW9mIElDb2x1bW5Qcm92aWRlcikgewotCQkJCQkJY29sdW1uUHJvdmlkZXIgPSAoSUNvbHVtblByb3ZpZGVyKSBwcm92aWRlckNsYXNzOwotCQkJCQkJCi0JCQkJCQlpZiAoYWxpZ25tZW50LmVxdWFscygibGVmdCIpKSB7CS8vJE5PTi1OTFMtMSQJCi0JCQkJCQkJY3JlYXRlU2VjdGlvbkNvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCB3aWR0aCwKLQkJCQkJCQkJCTEwMCk7Ci0KLQkJCQkJCQlDb21wb3NpdGUgY29sdW1uQ29tcG9zaXRlID0gY29sdW1uUHJvdmlkZXIKLQkJCQkJCQkJCS5zZXRDb2x1bW4oKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpLCB0b29sa2l0LCBtYWluQ29tcG9zaXRlKTsKLQkJCQkJCQl7CQkJCQkJCQotCQkJCQkJCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQkJCQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJCQkJCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQkJCQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQkJCQkJCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KAotCQkJCQkJCQkJCXNlY3Rpb25Db21wb3NpdGUsIDApOwotCQkJCQkJCQljb2x1bW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQkJY29sdW1uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmIChhbGlnbm1lbnQuZXF1YWxzKCJyaWdodCIpKSB7IC8vJE5PTi1OTFMtMSQJCi0JCQkJCQkJY3JlYXRlU2VjdGlvbkNvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCAwLAotCQkJCQkJCQkJMTAwIC0gd2lkdGgpOwotCi0JCQkJCQkJQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZSA9IGNvbHVtblByb3ZpZGVyCi0JCQkJCQkJCQkuc2V0Q29sdW1uKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSwgdG9vbGtpdCwgbWFpbkNvbXBvc2l0ZSk7Ci0JCQkJCQkJewkKLQkJCQkJCQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJCQkJCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCQkJCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KAotCQkJCQkJCQkJCXNlY3Rpb25Db21wb3NpdGUsIDUpOwotCQkJCQkJCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCQkJCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJCQkJCQljb2x1bW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQkJY29sdW1uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBSaWNoVGV4dEVkaXRvci4KLQkJZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIGltYWdlLgotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgdGV4dC4KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBFUEYgTWFpbiBzZWN0aW9uIGNvbXBvc2l0ZSB3aGVyZSBhbGwgZ2VuZXJhbCwgZGV0YWlsIHNlY3Rpb24gcmVzaWRlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWN0aW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBsZWZ0TWFyZ2luLAotCQkJaW50IHJpZ2h0TWFyZ2luKSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJewotCQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGVmdE1hcmdpbiwgMCk7Ci0JCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmlnaHRNYXJnaW4sIC01KTsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBHZW5lcmFsIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlnZW5lcmFsU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXRHZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxTZWN0aW9uKTsKLQkJKChHcmlkTGF5b3V0KSBnZW5lcmFsQ29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gNDsKLQkJY3JlYXRlR2VuZXJhbFNlY3Rpb25Db250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2VuZXJhbCBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb25Db250ZW50KCkgewotCQkvLyBBZGQgdGhlIE5hbWUgbGFiZWwgYW5kIHRleHQgY29udHJvbC4KLQkJY3RybF9uYW1lID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUpOwotCi0JCS8vIEFkZCB0aGUgUHJlc2VudGF0aW9uIG5hbWUgbGFiZWwgYW5kIHRleHQgY29udHJvbC4KLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5QUkVTRU5UQVRJT05fTkFNRV9URVhULAotCQkJCVNXVC5ERUZBVUxULCBTV1QuU0lOR0xFKTsKLQotCQlpZiAoZWxlbWVudFR5cGVPbikgewotCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlRZUEVfVEVYVCwgMik7Ci0JCQljdHJsX3R5cGVfbGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCQljdHJsX3R5cGVfbGFiZWwuc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldFN5c3RlbUNvbG9yKDE5KSk7Ci0JCQkJY3RybF90eXBlX2xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCWN0cmxfdHlwZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihnZW5lcmFsQ29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9UWVBFX0JVVFRPTl9URVhULCBTV1QuUFVTSCk7Ci0JCQkJewotCQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQkJCWN0cmxfdHlwZV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJfQotCQkJCWlmIChDb252ZXJ0R3VpZGFuY2VUeXBlCi0JCQkJCQkuZ2V0VmFsaWROZXdHdWlkYW5jZVR5cGVzKChHdWlkYW5jZSkgbWV0aG9kRWxlbWVudCkgPT0gbnVsbCkgewotCQkJCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChleHRlcm5hbElkT24pIHsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlVOSVFVRV9JRF9URVhULAotCQkJCQlTV1QuREVGQVVMVCwgU1dULlNJTkdMRSk7Ci0JCX0KLQotCQlpZiAoYnJpZWZEZXNjT24pIHsKLQkJCWN0cmxfYnJpZWZfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LAotCQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkJNDAsIFNXVC5NVUxUSSB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCk7Ci0JCX0JCQotCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikgewotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uID0gdG9vbGtpdAotCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlBVQkxJU0hfQ0FURUdPUklFU19URVhULCBTV1QuQ0hFQ0spOyAKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFyaWFiaWxpdHlTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WQVJJQUJJTElUWV9TRUNUSU9OX05BTUUsCi0JCQkJZ2V0VmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCQotCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZhcmlhYmlsaXR5U2VjdGlvbik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldENsaWVudCh2YXJpYWJpbGl0eUNvbXBvc2l0ZSk7Ci0KLQkJY3RybF92YXJpYWJpbGl0eSA9IGNyZWF0ZUNvbWJvV2l0aExhYmVsMyh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfVFlQRV9URVhUKTsKLQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF92YXJpYWJpbGl0eSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQl2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5KTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclZhcmlhYmlsaXR5KTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldElucHV0KG1ldGhvZEVsZW1lbnQpOwotCi0JCXRvb2xraXQuY3JlYXRlTGFiZWwodmFyaWFiaWxpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvL1N0cmluZyBiYXNlRWxlbWVudCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCk7Ci0JCWxhYmVsX2Jhc2UgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQkFTRV9FTEVNRU5UX1RFWFQsIDIpOwotCQljdHJsX2Jhc2UgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwgU1dULlNJTkdMRQotCQkJCXwgU1dULlJFQURfT05MWSwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HLCA1LCAzMDAsIDEsIDIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJY3RybF9iYXNlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJYmFzZV92aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9iYXNlKTsKLQkJaW5pdENvbnRlbnRQcm92aWRlckJhc2UoKTsKLQkJYmFzZV92aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyQmFzZSk7Ci0JCWJhc2Vfdmlld2VyLnNldElucHV0KG1ldGhvZEVsZW1lbnQpOwotCi0JCUNvbXBvc2l0ZSBiYXNlQnV0dG9uUGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwgCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HLCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCWJhc2VCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfYmFzZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihiYXNlQnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IEJVVFRPTl9XSURUSDsKLQkJCWN0cmxfYmFzZV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBTZXQgZm9jdXMgb24gdGhlIE5hbWUgdGV4dCBjb250cm9sLgotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCi0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQlpZiAobWV0aG9kVW5pdCAhPSBudWxsICYmIG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwpCi0JCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCi0JCWlmIChicmllZkRlc2NPbikgewotCQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAocHVycG9zZU9uKSB7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJY3RybF9rZXkuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChleHRlcm5hbElkT24pIHsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQljdHJsX3R5cGVfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9Ci0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5LmdldFNlbGVjdGlvbigpKQotCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKSB7Ci0JCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlpZiAodmVyc2lvblNlY3Rpb25PbikgewotCQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQljdHJsX2NoYW5nZV9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWN0cmxfYXV0aG9ycy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX3ZlcnNpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY29weXJpZ2h0X2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCXNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCk7Ci0JCX0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZQotCQkJCQkmJiBjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKSAhPSBudWxsKTsKLQkJCWN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUKLQkJCQkJJiYgY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSAhPSBudWxsKTsKLQkJfQotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQkKLQkJaWYgKHB1Ymxpc2hDYXRlZ29yeU9uKSB7Ci0JCQljdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCX0KLQkJCi0JCWlmIChjb2x1bW5Qcm92aWRlciAhPSBudWxsKQotCQkJY29sdW1uUHJvdmlkZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY3Rpb25Qcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBwcm92aWRlciA9IHNlY3Rpb25Qcm92aWRlcnMuZ2V0KGkpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwgJiYgcHJvdmlkZXIgaW5zdGFuY2VvZiBJU2VjdGlvblByb3ZpZGVyKSB7Ci0JCQkJKChJU2VjdGlvblByb3ZpZGVyKSBwcm92aWRlcikucmVmcmVzaChlZGl0YWJsZSk7Ci0JCQl9Ci0JCX0KLQkJCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgRGV0YWlsIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCWRldGFpbFNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFVEFJTF9TRUNUSU9OX05BTUUsCi0JCQkJZ2V0RGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlkZXRhaWxDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZGV0YWlsU2VjdGlvbik7Ci0JCWNyZWF0ZURldGFpbFNlY3Rpb25Db250ZW50KCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRldGFpbENvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRGV0YWlsIHNlY3Rpb24gY29udGVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCWlmIChwdXJwb3NlT24pIHsKLQkJCWN0cmxfcHVycG9zZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5QVVJQT1NFX1RFWFQsIDQwLCA0MDAsCi0JCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJfQotCi0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQljdHJsX2Z1bGxfZGVzYyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5NQUlOX0RFU0NSSVBUSU9OX1RFWFQsCi0JCQkJCTEwMCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0KLQkJfQotCi0JCWlmIChrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJCWN0cmxfa2V5ID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LktFWV9DT05TSURFUkFUSU9OU19URVhULAotCQkJCQk0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBOb3RhdGlvbiBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5vdGF0aW9uU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCW5vdGF0aW9uU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTk9UQVRJT05fU0VDVElPTl9OQU1FLAotCQkJCWdldE5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlub3RhdGlvbkNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBub3RhdGlvblNlY3Rpb24pOwotCQljcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKG5vdGF0aW9uQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBOb3RhdGlvbiBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWlsb3Jpbmcgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWlsb3JpbmdTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJdGFpbG9yaW5nU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVEFJTE9SSU5HX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXRUYWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCXRhaWxvcmluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB0YWlsb3JpbmdTZWN0aW9uKTsKLQkJY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodGFpbG9yaW5nQ29tcG9zaXRlKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzbG90IHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2xvdFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCi0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycyB0byBtb25pdG9yIGZvY3VzIGFuZCBtb2RpZmljYXRpb24gY2hhbmdlcyBpbiB0aGUgZWRpdAotCSAqIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihtZXRob2RFbGVtZW50KTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKG1ldGhvZFVuaXQpOwotCQlhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkKLQkJCi0KLQkJZm9ybS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCWZvcm1TZWN0aW9uLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvcm0uZ2V0UGFyZW50KCkuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmKGRpc3Bvc2VkKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJcmVmcmVzaCghVG5nVXRpbC5pc0xvY2tlZChtZXRob2RFbGVtZW50KSk7Ci0JCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQkJCi0JCQkJLy8gZG8gcmVmcmVzaCB2YXJpYWJpbGl0eSBhbmQgY29weXJpZ2h0IHZpZXdlcgotCQkJCWlmKHZhcmlhYmlsaXR5U2VjdGlvbk9uKQotCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJaWYodmVyc2lvblNlY3Rpb25PbikKLQkJCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlhZGRHZW5lcmFsU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJYWRkRGV0YWlsU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCX0KLQotCQlpZiAoaWNvblNlY3Rpb25PbikgewotCQkJYWRkSWNvblNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJfQotCi0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JCQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gZWRpdG9yCi0JCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpLAotCQkJCQkJCQkJCQkJKFZhcmlhYmlsaXR5VHlwZSkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSwgLTEpOwotCQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKSB7Ci0JCQkJCQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCQkJCW51bGwsIC0xKTsKLQkJCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlMaXN0IHNlbGVjdGlvbkJhc2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCQkJc2VsZWN0aW9uQmFzZUxpc3QuYWRkKGJhc2UpOwotCQkJCQkJCQljdHJsX2Jhc2VfYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl9Ci0JCQkJCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQkJCQkJCi0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN0aW9uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCU9iamVjdCBwcm92aWRlciA9IHNlY3Rpb25Qcm92aWRlcnMuZ2V0KGkpOwotCQkJCQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCAmJiBwcm92aWRlciBpbnN0YW5jZW9mIElTZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkJCQkJCSgoSVNlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLnJlZnJlc2goZmFsc2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkKLQkJCWN0cmxfYmFzZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBnZXRDb250ZW50RWxlbWVudCgpLAotCQkJCQkJCQlMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChtZXRob2RFbGVtZW50LCB0cnVlKSk7Ci0JCQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQsIHRydWUpKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQkJCWlmIChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuc2l6ZSgpID4gMCkgewotCQkJCQkJCUlTdGF0dXMgaXN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwgKFZhcmlhYmlsaXR5RWxlbWVudCkgZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLmdldCgwKSk7Ci0JCQkJCQkJaWYoIWlzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBpc3RhdHVzLmdldE1lc3NhZ2UoKSk7CQkJCQkJCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBmZAotCQkJCQkJCQkJCQkJCS5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApLCAtMSk7Ci0JCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJCQkJCQkJCShWYXJpYWJpbGl0eVR5cGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eQotCQkJCQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCksIC0xKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VjdGlvblByb3ZpZGVycy5zaXplKCk7IGkrKykgewotCQkJCQkJT2JqZWN0IHByb3ZpZGVyID0gc2VjdGlvblByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCAmJiBwcm92aWRlciBpbnN0YW5jZW9mIElTZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkJCQkoKElTZWN0aW9uUHJvdmlkZXIpIHByb3ZpZGVyKS5yZWZyZXNoKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoKGN0cmxfYmFzZSAhPSBudWxsKSAmJiAoIShjdHJsX2Jhc2UuaXNEaXNwb3NlZCgpKSkpCi0JCQkJCQljdHJsX2Jhc2UucmVkcmF3KCk7Ci0JCQkJCWlmICgoYmFzZV92aWV3ZXIgIT0gbnVsbCkKLQkJCQkJCQkmJiAoIShiYXNlX3ZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSkpCi0JCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmFsU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuYW1lRm9jdXNMaXN0ZW5lcik7Ci0KLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBtZXRob2RFbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoY3RybF9wcmVzZW50YXRpb25fbmFtZQotCQkJCQkJLmdldFRleHQoKSk7CQkJCQotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQltZXRob2RFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uIHdoZW4gdGhlIGZvY3VzIG9mIHRoZSBjb21wb25lbnQgaXMgbG9zdCAKLQkJCQlpZihjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKXsKLQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5jbGVhclNlbGVjdGlvbigpOwotCQkJCX0gICAgCi0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNHYWluZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCS8vIHdoZW4gdXNlciB0YWIgdG8gdGhpcyBmaWVsZCwgc2VsZWN0IGFsbCB0ZXh0Ci0JCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZWxlY3RBbGwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGJyaWVmRGVzY09uKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2JyaWVmX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCi0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNMb3N0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gbWV0aG9kRWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9icmllZl9kZXNjLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudFR5cGVPbikgewotCQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCWN0cmxfdHlwZV9idXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJCQlpZiAoZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlOyAKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOyAKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oKTsKLQkJCQkJCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihMaWJyYXJ5Vmlldy5nZXRWaWV3KCkKLQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQkJCQkJCWRlbGV0ZUFjdGlvbgotCQkJCQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQpKTsKLQkJCQkJCQlDb21tYW5kIGNtZCA9IGRlbGV0ZUFjdGlvbgotCQkJCQkJCQkJLmNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkJLnNpbmdsZXRvbihtZXRob2RFbGVtZW50KSk7Ci0JCQkJCQkJaWYgKGNtZCBpbnN0YW5jZW9mIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSB7Ci0JCQkJCQkJCUd1aWRhbmNlIG5ld0d1aWRhbmNlOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbmV3R3VpZGFuY2UgPSBDb252ZXJ0R3VpZGFuY2VUeXBlCi0JCQkJCQkJCQkJLmNvbnZlcnRHdWlkYW5jZSgKLQkJCQkJCQkJCQkJCShHdWlkYW5jZSkgbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQkJCQkoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpIGNtZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQl0cnkgeyBjbWQuZGlzcG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChuZXdHdWlkYW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VFZGl0b3IoCi0JCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQpOwotCQkJCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQkJCQkJCW5ld0d1aWRhbmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlOyAKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyOyAKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHB1Ymxpc2hDYXRlZ29yeU9uKQl7Ci0JCQljdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CQkJCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkJCQkKLQkJCQkJU3RyaW5nIHZhbCA9IG5ldyBCb29sZWFuKGN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5nZXRTZWxlY3Rpb24oKSkudG9TdHJpbmcoKTsJCQkJCi0JCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVG5nVXRpbC5nZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShtZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJCQkKLQkJCQkJaWYgKHByb3AgPT0gbnVsbCkgewkJCQotCQkJCQkJcHJvcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQkJCQkJcHJvcC5zZXROYW1lKFRuZ1V0aWwuUFVCTElTSF9DQVRFR09SWV9QUk9QRVJUWSk7Ci0JCQkJCQlwcm9wLnNldFZhbHVlKHZhbCk7Ci0JCQkJCQkJCQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQkJCQkJcHJvcCwgLTEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwcm9wLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJCQkJdmFsLCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJaWYgKGV4dGVybmFsSWRPbikgewotCQkJY3RybF9leHRlcm5hbF9pZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9leHRlcm5hbF9pZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAgY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0RXh0ZXJuYWxJZCgpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljdHJsX2V4dGVybmFsX2lkLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9leHRlcm5hbF9pZC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudAotCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldE5hbWVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREZXRhaWxTZWN0aW9uTGlzdGVuZXJzKCkgewotCQlpZiAoZnVsbERlc2NPbikgewotCQkJY3RybF9mdWxsX2Rlc2Muc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9mdWxsX2Rlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJY3RybF9mdWxsX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfZnVsbF9kZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9mdWxsX2Rlc2M7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRyb2w9IiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogY29udGVudCBub3QgbW9kaWZpZWQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IHJlc3RvcmVkIG9sZCBjb250ZW50LCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IHNhdmluZyBtb2RpZmllZCBjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLAotCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogc2F2ZWQgc3RhdHVzPSIgKyBzdWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWlmIChrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJCWN0cmxfa2V5LnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfa2V5LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJY3RybF9rZXkuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfa2V5LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9rZXk7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRyb2w9IiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogY29udGVudCBub3QgbW9kaWZpZWQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogcmVzdG9yZWQgb2xkIGNvbnRlbnQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksCi0JCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiBzYXZlZCBzdGF0dXM9IiArIHN1Y2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIHdpdGggZGF0YSBmcm9tIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWxvYWRHZW5lcmFsU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAoZGV0YWlsU2VjdGlvbk9uKSB7Ci0JCQlsb2FkRGV0YWlsU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCWxvYWROb3RhdGlvblNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJbG9hZFRhaWxvcmluZ1NlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAoaWNvblNlY3Rpb25PbikgewotCQkJbG9hZEljb25TZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJdmFyaWFiaWxpdHlTZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWZvcm0uZ2V0Qm9keSgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkR2VuZXJhbFNlY3Rpb25EYXRhKCkgewotCQlTdHJpbmcgbmFtZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IChtZXRob2RFbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWN0cmxfbmFtZS5zZXRUZXh0KG5hbWUgPT0gbnVsbCA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZQotCQkJCS5zZXRUZXh0KHByZXNlbnRhdGlvbk5hbWUgPT0gbnVsbCA/ICIiIDogcHJlc2VudGF0aW9uTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZWxlbWVudFR5cGVPbikgewotCQkJLy8gU3RyaW5nIHR5cGUgPSBtZXRob2RFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdHlwZSA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQkJY3RybF90eXBlX2xhYmVsLnNldFRleHQodHlwZSA9PSBudWxsID8gIiIgOiB0eXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChicmllZkRlc2NPbikgewotCQkJU3RyaW5nIGJyaWVmX2Rlc2MgPSBtZXRob2RFbGVtZW50LmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGJyaWVmX2Rlc2MgPT0gbnVsbCA/ICIiIDogYnJpZWZfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJaWYgKGV4dGVybmFsSWRPbikgewotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZXh0ZXJuYWxfaWQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRFeHRlcm5hbElkKCk7Ci0JCQkJY3RybF9leHRlcm5hbF9pZC5zZXRUZXh0KGV4dGVybmFsX2lkID09IG51bGwgPyAiIiA6IGV4dGVybmFsX2lkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlpZiAocHVibGlzaENhdGVnb3J5T24pIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVG5nVXRpbC5nZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShtZXRob2RFbGVtZW50KTsKLQkJCWlmIChwcm9wICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdmFsID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJCWN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5zZXRTZWxlY3Rpb24oKG5ldyBCb29sZWFuKHZhbCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRGV0YWlsU2VjdGlvbkRhdGEoKSB7Ci0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQlTdHJpbmcgZnVsbF9kZXNjID0gKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRUZXh0KGZ1bGxfZGVzYyA9PSBudWxsID8gIiIgOiBmdWxsX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCWN0cmxfa2V5Ci0JCQkJCS5zZXRUZXh0KGtleUNvbnNpZGVyYXRpb25zID09IG51bGwgPyAiIiA6IGtleUNvbnNpZGVyYXRpb25zKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRUYWlsb3JpbmdTZWN0aW9uRGF0YSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZE5vdGF0aW9uU2VjdGlvbkRhdGEoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhcmlhYmlsaXR5U2VjdGlvbkRhdGEoKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJTGlzdCBzZWxlY3Rpb25WYXJpYWJpbGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNlbGVjdGlvblZhcmlhYmlsaXR5TGlzdC5hZGQodmFyaWFiaWxpdHlUeXBlKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQlzZWxlY3Rpb25WYXJpYWJpbGl0eUxpc3QpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsCi0JCQkJCWV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQltYWluQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQobWFpbkNvbXBvc2l0ZSk7Ci0JCQllbmFibGVTZWN0aW9ucyh0cnVlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlyaWNoVGV4dC5zZXRGaW5kUmVwbGFjZUFjdGlvbihjdHJsX2V4cGFuZGVkLmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWlmIChjdHJsX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZXhwYW5kZWQpOwotCQkJfQotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuc2V0TW9kYWxPYmplY3QobnVsbCk7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLnNldE1vZGFsT2JqZWN0RmVhdHVyZShudWxsKTsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJbWFpbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJZW5hYmxlU2VjdGlvbnMoZmFsc2UpOwotCQkJZXhwYW5kTGFiZWwuc2V0VGV4dCgoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKQotCQkJCQkuZ2V0RGF0YSgiVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChtZXRob2RFbGVtZW50KTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9leHBhbmRlZC5zZXRGb2N1cygpOwotCQkJfQotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKHJpY2hUZXh0KTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuc2V0TW9kYWxPYmplY3QocmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLnNldE1vZGFsT2JqZWN0RmVhdHVyZShyaWNoVGV4dC5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQl9Ci0JCX0KLQkJZm9ybS5nZXRCb2R5KCkubGF5b3V0KHRydWUsIHRydWUpOwotCQlkZXNjRXhwYW5kRmxhZyA9ICFkZXNjRXhwYW5kRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGFjdGl2ZSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWN0aXZlUmljaFRleHRDb250cm9sKElNZXRob2RSaWNoVGV4dCBjdHJsKSB7Ci0JCWFjdGl2ZUNvbnRyb2wgPSBjdHJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiBhY3RpdmVDb250cm9sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzY09uKGJvb2xlYW4gYnJpZWZEZXNjT24pIHsKLQkJdGhpcy5icmllZkRlc2NPbiA9IGJyaWVmRGVzY09uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbElET24oYm9vbGVhbiBleHRlcmFubElET24pIHsKLQkJdGhpcy5leHRlcm5hbElkT24gPSBleHRlcmFubElET247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnVsbERlc2NPbihib29sZWFuIGZ1bGxEZXNjT24pIHsKLQkJdGhpcy5mdWxsRGVzY09uID0gZnVsbERlc2NPbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9uT24oYm9vbGVhbiBrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJdGhpcy5rZXlDb25zaWRlcmF0aW9uT24gPSBrZXlDb25zaWRlcmF0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRUeXBlT24KLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50VHlwZU9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50VHlwZU9uKGJvb2xlYW4gZWxlbWVudFR5cGVPbikgewotCQl0aGlzLmVsZW1lbnRUeXBlT24gPSBlbGVtZW50VHlwZU9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW55QXR0cmlidXRlTW9kaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbnlBdHRyaWJ1dGVNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGFueUF0dHJpYnV0ZU1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGlzIGlmIGFueSBhdHRyaWJ1dGUgaXMgbW9kaWZpZWQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBjaGFuZ2UKLQkgKiBkYXRlIGZpZWxkIGluIHZlcnNpb24gc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYW55QXR0cmlidXRlTW9kaWZpZWQKLQkgKiAgICAgICAgICAgIFRoZSBhbnlBdHRyaWJ1dGVNb2RpZmllZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW55QXR0cmlidXRlTW9kaWZpZWQoYm9vbGVhbiBhbnlBdHRyaWJ1dGVNb2RpZmllZCkgewotCQl0aGlzLmFueUF0dHJpYnV0ZU1vZGlmaWVkID0gYW55QXR0cmlidXRlTW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uU2VjdGlvbk9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvblNlY3Rpb25PbigpIHsKLQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZlcnNpb25TZWN0aW9uT24KLQkgKiAgICAgICAgICAgIFRoZSB2ZXJzaW9uU2VjdGlvbk9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uU2VjdGlvbk9uKGJvb2xlYW4gdmVyc2lvblNlY3Rpb25PbikgewotCQl0aGlzLnZlcnNpb25TZWN0aW9uT24gPSB2ZXJzaW9uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFZlcnNpb24gSW5mb3JtYXRpb24gc2VjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl2ZXJzaW9uU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fSU5GT19TRUNUSU9OX05BTUUpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRWZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdmVyc2lvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZlcnNpb25TZWN0aW9uKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0Q2xpZW50KHZlcnNpb25Db21wb3NpdGUpOwotCX0KLQkKLQkKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVmVyc2lvbiBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb25Db250ZW50KCkgewotCQlTdHJpbmcgZmlsbFRleHQgPSAobWV0aG9kVW5pdC5nZXRWZXJzaW9uKCkgPT0gbnVsbCA/ICIiIDogbWV0aG9kVW5pdC5nZXRWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbiA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX1RFWFQsIFNXVC5ERUZBVUxULCBTV1QuU0lOR0xFLCBmaWxsVGV4dCk7Ci0KLQkJZmlsbFRleHQgPSBtZXRob2RVbml0LmdldENoYW5nZURhdGUoKSA9PSBudWxsID8gIiIgLy8kTk9OLU5MUy0xJAotCQkJCTogRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5GVUxMKS5mb3JtYXQoCi0JCQkJCQltZXRob2RVbml0LmdldENoYW5nZURhdGUoKSk7Ci0JCWN0cmxfY2hhbmdlX2RhdGUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX0RBVEVfVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfREVTQ1JJUFRJT05fVEVYVCwgNDAsIFNXVC5NVUxUSSk7Ci0KLQkJY3RybF9hdXRob3JzID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVCwgNDAsIFNXVC5NVUxUSSk7Ci0KLQkJbGFiZWxfY29weXJpZ2h0ID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ09QWVJJR0hUX1RFWFQsIDIpOwotCQljdHJsX2NvcHlyaWdodCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5SRUFEX09OTFksIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwsCi0JCQkJNSwgNDAwLCAxLCAyKTsKLQotCQljb3B5cmlnaHRfdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfY29weXJpZ2h0KTsKLQkJaW5pdENvbnRlbnRQcm92aWRlckNvcHlyaWdodCgpOwotCQljb3B5cmlnaHRfdmlld2VyLnNldExhYmVsUHJvdmlkZXIoY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UpOwotCQljb3B5cmlnaHRfdmlld2VyLnNldElucHV0KG1ldGhvZEVsZW1lbnQpOwotCQlDb21wb3NpdGUgYnV0dG9ucGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ELCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJYnV0dG9ucGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gQlVUVE9OX1dJRFRIOwotCQkJY29weXJpZ2h0X2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBCVVRUT05fV0lEVEg7Ci0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQotCQkvLyBDcmVhdGUgdGhlIGV4cGFuZGVkIGNvbXBvc2l0ZS4KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCS8vdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoYnV0dG9ucGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJDb3B5cmlnaHQoKSB7Ci0JCWNvcHlyaWdodENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAobWV0aG9kVW5pdC5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCWxpc3QuYWRkKG1ldGhvZFVuaXQKLQkJCQkJCQkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJfQotCQl9OwotCQljb3B5cmlnaHRfdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb3B5cmlnaHRDb250ZW50UHJvdmlkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCkgewotCQljdHJsX3ZlcnNpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF92ZXJzaW9uLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBtZXRob2RVbml0Ci0JCQkJCQkuZ2V0VmVyc2lvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsCi0JCQkJCQkuZ2V0UGxhaW5UZXh0KGN0cmxfdmVyc2lvbi5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCW1ldGhvZFVuaXQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYXV0aG9ycy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2F1dGhvcnMuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IG1ldGhvZFVuaXQKLQkJCQkJCS5nZXRBdXRob3JzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwKLQkJCQkJCS5nZXRQbGFpblRleHQoY3RybF9hdXRob3JzLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJbWV0aG9kVW5pdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29weXJpZ2h0X2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUxpc3QgYWxyZWFkeUV4c3RpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN0cmxfY29weXJpZ2h0LmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGN0cmxfY29weXJpZ2h0LmdldEl0ZW1zKClbMF07Ci0JCQkJCWlmIChpdGVtLmdldERhdGEoKSAhPSBudWxsKQotCQkJCQkJYWxyZWFkeUV4c3RpbmcuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIGFscmVhZHlFeHN0aW5nKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJCWlmIChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuc2l6ZSgpID4gMCkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJbWV0aG9kVW5pdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLmdldCgwKSwKLQkJCQkJCQktMSk7Ci0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2NoYW5nZV9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gbWV0aG9kVW5pdAotCQkJCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfY2hhbmdlX2Rlc2MuZ2V0VGV4dCgpOwotCQkJCW5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoU3RyVXRpbC5MSU5FX0ZFRUQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIG1ldGhvZFVuaXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCW1ldGhvZFVuaXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLCBudWxsLCAtMSk7Ci0JCQkJaWYgKHN0YXR1cykgewotCQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogdXBkYXRlIHRoZSBjaGFuZ2UgZGF0ZSBpZiBhbnkgYXR0cmlidXRlIGlzIG1vZGlmaWVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNoYW5nZURhdGUoKSB7Ci0KLQkJRGF0ZSBjaGFuZ2VEYXRlID0gbWV0aG9kVW5pdC5nZXRDaGFuZ2VEYXRlKCk7Ci0JCURhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpOwotCi0JCVN0cmluZyBvbGRDb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNoYW5nZURhdGUgIT0gbnVsbCkgewotCQkJb2xkQ29udGVudCA9IGRmLmZvcm1hdChjaGFuZ2VEYXRlKTsKLQkJfQotCi0JCURhdGUgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpOwotCQlTdHJpbmcgbmV3Q29udGVudCA9IGRmLmZvcm1hdChjdXJyZW50RGF0ZSk7Ci0JCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJbWV0aG9kVW5pdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCksIGN1cnJlbnREYXRlLCAtMSk7Ci0JCQlpZiAoIXN0YXR1cykgewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpIHsKLQotCQljdHJsX3ZlcnNpb24KLQkJCQkuc2V0VGV4dChtZXRob2RVbml0LmdldFZlcnNpb24oKSA9PSBudWxsID8gIiIgOiBtZXRob2RVbml0LmdldFZlcnNpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9hdXRob3JzCi0JCQkJLnNldFRleHQobWV0aG9kVW5pdC5nZXRBdXRob3JzKCkgPT0gbnVsbCA/ICIiIDogbWV0aG9kVW5pdC5nZXRBdXRob3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjaGFuZ2VEZXNjID0gbWV0aG9kVW5pdC5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpID09IG51bGwgPyAiIiA6IG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsgLy8kTk9OLU5MUy0xJAotCQljaGFuZ2VEZXNjID0gY2hhbmdlRGVzYy5yZXBsYWNlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyLCBTdHJVdGlsLkxJTkVfRkVFRCk7Ci0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0VGV4dChjaGFuZ2VEZXNjKTsKLQkJY3RybF9jaGFuZ2VfZGF0ZQotCQkJCS5zZXRUZXh0KG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwgPyAiIiAvLyROT04tTkxTLTEkCi0JCQkJCQk6IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkuZm9ybWF0KAotCQkJCQkJCQltZXRob2RVbml0LmdldENoYW5nZURhdGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlLCBpbnQgaWQpIHsKLQkJLy8gVE9ETy0gd2Ugc2hvdWxkIGNvbWJpbmUgdGhlc2UgbWV0aG9kcyBpbnRvIG9uZS4gT25lIHdheSB0byBkbyBpdCwKLQkJLy8gZGlzcG9pbmcKLQkJLy8gY3RybF9leHBhbmRlZCBldmVyeSB0aW1lIGl0IGNvbGxhcHNlcyBhbmQgY3JlYXRpbmcgaXQgd2hlbiB3ZSBleHBhbmQuCi0JCS8vIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vIG1ldGhvZCB0byBkaXNwb3NlCi0JCXRvZ2dsZShlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGljb25TZWN0aW9uT24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJY29uU2VjdGlvbk9uKCkgewotCQlyZXR1cm4gaWNvblNlY3Rpb25PbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWNvblNlY3Rpb25PbgotCSAqICAgICAgICAgICAgVGhlIGljb25TZWN0aW9uT24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb25TZWN0aW9uT24oYm9vbGVhbiBpY29uU2VjdGlvbk9uKSB7Ci0JCXRoaXMuaWNvblNlY3Rpb25PbiA9IGljb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgSWNvbiBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUljb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJaWNvblNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWljb25TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlpY29uU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5JQ09OX1NFQ1RJT05fTkFNRSk7Ci0JCWljb25TZWN0aW9uLnNldERlc2NyaXB0aW9uKGdldEljb25TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWljb25TZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlpY29uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoaWNvblNlY3Rpb24pOwotCQlpY29uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlpY29uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCB0cnVlKSk7Ci0JCWljb25TZWN0aW9uLnNldENsaWVudChpY29uQ29tcG9zaXRlKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUljb25TZWN0aW9uQ29udGVudCgpIHsKLQkJQ29tcG9zaXRlIHNoYXBlSWNvbkNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBpY29uQ29tcG9zaXRlLAotCQkJCTEpOwotCQlzaGFwZUljb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXNoYXBlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotLy8JCWNyZWF0ZUxhYmVsKAotLy8JCQkJdG9vbGtpdCwKLS8vCQkJCXNoYXBlSWNvbkNvbXBvc2l0ZSwKLS8vCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbCwgMik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gTm8gd3JhcCBuZWVkZWQKLQkJY3JlYXRlTGFiZWxXaXRoTm9XcmFwKAotCQkJCXRvb2xraXQsCi0JCQkJc2hhcGVJY29uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbCwKLQkJCQlHcmlkRGF0YS5CRUdJTk5JTkcsCi0JCQkJMik7IAotCQkKLQkJcGFuZTEgPSBuZXcgQ2FudmFzKHNoYXBlSWNvbkNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0KLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA2MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDYwOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCXBhbmUxLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTEuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotCQl9Ci0JCS8vIHBhbmUxLnNldFNpemUoMzAsMzApOwotCQlDb21wb3NpdGUgcGFuZTIgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIHNoYXBlSWNvbkNvbXBvc2l0ZSk7Ci0JCWN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhbmUyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsLCBTV1QuTk9ORSk7IAotCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhbmUyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgCi0JCWlmIChjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKSA9PSBudWxsKQotCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlDb21wb3NpdGUgbm9kZUljb25Db21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgaWNvbkNvbXBvc2l0ZSwgMSk7Ci0JCW5vZGVJY29uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlub2RlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLS8vCQljcmVhdGVMYWJlbCgKLS8vCQkJCXRvb2xraXQsCi0vLwkJCQlub2RlSWNvbkNvbXBvc2l0ZSwKLS8vCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBObyB3cmFwIG5lZWQgZm9yIAotCQljcmVhdGVMYWJlbFdpdGhOb1dyYXAoCi0JCQkJdG9vbGtpdCwKLQkJCQlub2RlSWNvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbCwKLQkJCQlHcmlkRGF0YS5CRUdJTk5JTkcsCi0JCQkJMik7IAotCQlwYW5lMyA9IG5ldyBDYW52YXMobm9kZUljb25Db21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCi0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDA7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlwYW5lMy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXBhbmUzLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLQkJfQotCQlDb21wb3NpdGUgcGFuZTQgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIG5vZGVJY29uQ29tcG9zaXRlKTsKLQkJY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYW5lNCwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsLCBTV1QuTk9ORSk7IAotCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTQsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsLCBTV1QuTk9ORSk7IAotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSA9PSBudWxsKQotCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UKLQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQotCQluZXcgTGFiZWwoaWNvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzaGFwZUljb25QYXRoID0gY3JlYXRlTGFiZWxXaXRoTm9XcmFwKHRvb2xraXQsCi0JCQkJaWNvbkNvbXBvc2l0ZSwgIiIsIEdyaWREYXRhLkJFR0lOTklORywgMSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25QYXRoID0gY3JlYXRlTGFiZWxXaXRoTm9XcmFwKHRvb2xraXQsCi0JCQkJaWNvbkNvbXBvc2l0ZSwgIiIsIEdyaWREYXRhLkJFR0lOTklORywgMik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJbmV3IExhYmVsKG5vZGVJY29uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0vLwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotLy8JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPTI7Ci0vLwkJbm9kZUljb25QYXRoLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUzKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEljb25TZWN0aW9uTGlzdGVuZXJzKCkgewotCi0JCWN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0vLwkJCQkJRmlsZSBsaWJEaXJGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlqYXZhLm5ldC5VUkkgc2hhcGVJY29uVXJpID0gbnVsbDsKLQkJCQkJCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCQkJZmlsZUNob29zZXIuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZSk7IAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhpbWFnZVR5cGVzKTsgCi0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhpbWFnZU5hbWVzKTsgCi0JCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gbnVsbDsKLQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCWltYWdlRmlsZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJCQkJCQlmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLmdldEZpbGVOYW1lKCk7Ci0JCQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChuZXcgRmlsZShpbWFnZUZpbGUpLmV4aXN0cygpKSB7Ci0vLwkJCQkJCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKAotLy8JCQkJCQkJCQkJCWltYWdlRmlsZSk7Ci0vLwkJCQkJCQkJCWlmIChpbWFnZURhdGEud2lkdGggPiBTSEFQRUlDT05fV0lEVEhfTUFYCi0vLwkJCQkJCQkJCQkJfHwgaW1hZ2VEYXRhLmhlaWdodCA+IFNIQVBFSUNPTl9IRUlHSFRfTUFYKSB7Ci0vLwkJCQkJCQkJCQkvLyBtc2cgdXNlciAtIGltYWdlIHRvbyBiaWcKLS8vCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0vLwkJCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLS8vCQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0vLwkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJCAKLS8vCQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotLy8JCQkJCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlLCAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJaW1hZ2VGaWxlLAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCQkJU0hBUEVJQ09OX1dJRFRIX01BWCksCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJCQlTSEFQRUlDT05fSEVJR0hUX01BWCkgfSkpOwotLy8JCQkJCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gbXNnIHVzZXIgLSBmaWxlIGRvZXNuJ3QgZXhpc3QKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGUsIAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBpbWFnZUZpbGUgfSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IGNvcHlSZXNvdXJjZVRvTGliKGN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b24uZ2V0U2hlbGwoKSwgZmlsZW5hbWUsCi0JCQkJCQkJCQkJZmlsZUNob29zZXIuZ2V0RmlsdGVyUGF0aCgpLAotCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQpOwotCQkJCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybCk7Ci0JCQkJCQkJCQlzaGFwZUljb25VcmkgPSBuZXcgVVJJKE5ldFV0aWwKLQkJCQkJCQkJCQkJLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwKLQkJCQkJCQkJCQkJCQkuZ2V0UmVsYXRpdmVQYXRoKGZpbGUsCi0JCQkJCQkJCQkJCQkJCQluZXcgRmlsZShnZXRQbHVnaW5QYXRoKG1ldGhvZEVsZW1lbnQpKSkpKTsKLQkJCQkJCQkJCWlmIChzaGFwZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLAotCQkJCQkJCQkJCQkJCQlzaGFwZUljb25VcmksIC0xKTsKLQkJCQkJCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJc2hhcGVJbWFnZSA9IG5ldyBJbWFnZSgKLQkJCQkJCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCksIGZpbGUKLQkJCQkJCQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KHNoYXBlSWNvblVyaS5nZXRQYXRoKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCXNoYXBlSWNvblVyaSA9IG51bGw7Ci0JCQkJCQkJCXNoYXBlSW1hZ2UgPSBudWxsOwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZXgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX2Vycm9yLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3JlYXNvbiwgCi0JCQkJCQkJCQkJCQkJZXguZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX3Byb2Nlc3NpbmdfZmlsZV90aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbiwgZXgpOyAKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChzaGFwZUltYWdlICE9IG51bGwpIHsKLQkJCQkJCQlwYW5lMS5yZWRyYXcoKTsKLQkJCQkJCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJbWV0aG9kRWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLAotCQkJCQkJCQludWxsLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlwYW5lMS5yZWRyYXcoKTsKLQkJCQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXNoYXBlSWNvblBhdGguc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLS8vCQkJCQlGaWxlIGxpYkRpckZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWphdmEubmV0LlVSSSBub2RlSWNvblVyaSA9IG51bGw7Ci0JCQkJCQlGaWxlRGlhbG9nIGZpbGVDaG9vc2VyID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheQotCQkJCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQkJCWZpbGVDaG9vc2VyLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGUpOyAKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoaW1hZ2VUeXBlcyk7IAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoaW1hZ2VOYW1lcyk7IAotCQkJCQkJU3RyaW5nIGltYWdlRmlsZSA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCQlpbWFnZUZpbGUgPSBmaWxlQ2hvb3Nlci5vcGVuKCk7Ci0JCQkJCQkJZmlsZW5hbWUgPSBmaWxlQ2hvb3Nlci5nZXRGaWxlTmFtZSgpOwotCQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAobmV3IEZpbGUoaW1hZ2VGaWxlKS5leGlzdHMoKSkgewotCQkJCQkJCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoCi0JCQkJCQkJCQkJCWltYWdlRmlsZSk7Ci0JCQkJCQkJCQlpZiAoaW1hZ2VEYXRhLndpZHRoID4gTk9ERUlDT05fV0lEVEhfTUFYCi0JCQkJCQkJCQkJCXx8IGltYWdlRGF0YS5oZWlnaHQgPiBOT0RFSUNPTl9IRUlHSFRfTUFYKSB7Ci0JCQkJCQkJCQkJLy8gbXNnIHVzZXIgLSBpbWFnZSB0b28gYmlnCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCQkJCQkJCQlpbWFnZUZpbGUsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCU5PREVJQ09OX1dJRFRIX01BWCksCi0JCQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCU5PREVJQ09OX0hFSUdIVF9NQVgpIH0pKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBtc2cgdXNlciAtIGZpbGUgZG9lc24ndCBleGlzdAotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZSwgCi0JCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGltYWdlRmlsZSB9KSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsICYmIGltYWdlRmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlTdHJpbmcgdXJsID0gY29weVJlc291cmNlVG9MaWIoY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uLmdldFNoZWxsKCksIGZpbGVuYW1lLAotCQkJCQkJCQkJCWZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJCQltZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwpOwotCQkJCQkJCQkJbm9kZUljb25VcmkgPSBuZXcgVVJJKE5ldFV0aWwKLQkJCQkJCQkJCQkJLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwKLQkJCQkJCQkJCQkJCQkuZ2V0UmVsYXRpdmVQYXRoKGZpbGUsCi0JCQkJCQkJCQkJCQkJCQluZXcgRmlsZShnZXRQbHVnaW5QYXRoKG1ldGhvZEVsZW1lbnQpKSkpKTsKLQkJCQkJCQkJCWlmIChub2RlSWNvblVyaSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwKLQkJCQkJCQkJCQkJCQkJbm9kZUljb25VcmksIC0xKTsKLQkJCQkJCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJbm9kZUltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJCQkJCQkJCQlmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KG5vZGVJY29uVXJpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJbm9kZUljb25VcmkgPSBudWxsOwotCQkJCQkJCQlub2RlSW1hZ2UgPSBudWxsOwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZXgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX2Vycm9yLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3JlYXNvbiwgCi0JCQkJCQkJCQkJCQkJZXguZ2V0TWVzc2FnZSgpKTsKLQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uLCBleCk7IAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKG5vZGVJbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQkJcGFuZTMucmVkcmF3KCk7Ci0JCQkJCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQltZXRob2RFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksIG51bGwsIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJcmV0dXJuOwotCQkJCXBhbmUzLnJlZHJhdygpOwotCQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIHNlbGVjdGVkIHNoYXBlTm9kZUljb24gYW5kIG5vZGVJY29uIHRvIHJlc291cmNlcyBmb2xkZXIgb2YKLQkgKiBjb250ZW50IGVsZW1lbnQuIFByb21wdHMgdG8gb3ZlcndyaXRlIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMuCi0JICogQHBhcmFtIHNGaWxlTmFtZQotCSAqIEBwYXJhbSBzRmlsZVBhdGgKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3B5UmVzb3VyY2VUb0xpYihTaGVsbCBzaGVsbCwgU3RyaW5nIHNGaWxlTmFtZSwgU3RyaW5nIHNGaWxlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBuZXdGaWxlID0gTGlicmFyeVVJVXRpbC5jb3B5UmVzb3VyY2VUb0xpYihzaGVsbCwgbmV3IEZpbGUoc0ZpbGVQYXRoLCBzRmlsZU5hbWUpLCBtZXRob2RFbGVtZW50KTsKLQkJaWYgKG5ld0ZpbGUgIT0gbnVsbCkKLQkJCXJldHVybiBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQllbHNlIAotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEljb25TZWN0aW9uRGF0YSgpIHsKLQkJcGFuZTEuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkvLyBwYWludCB0aGUgZ3JleSBiYWNrZ3JvdW5kCi0JCQkJUmVjdGFuZ2xlIGNsaWVudFJlY3QgPSBwYW5lMS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoMTUpKTsKLQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0KLQkJCQlqYXZhLm5ldC5VUkkgdXJpID0gY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkuZ2V0UGF0aCgpOwotCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCQkJCQkJLy8gQ2hlY2sgZm9yIHRoZSB1cmkgY29udGFpbnMgdGhlIHJlbGF0aXZlIHRvIGxpYnJhcnkuCi0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4obWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJCQlpZihwYXRoLmluZGV4T2YocGx1Z2luLmdldE5hbWUoKSkgPiAtMSl7Ci0JCQkJCQkJCQkJcGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CQotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGF0aCA9IGdldFBsdWdpblBhdGgobWV0aG9kRWxlbWVudCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcGF0aDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJaWYgKHNoYXBlSW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQkJc2hhcGVJbWFnZSA9IG5ldyBJbWFnZSgKLQkJCQkJCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCksIHBhdGgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpICE9IG51bGwpewotCQkJCQkJCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2xpZW50UmVjdCA9IHBhbmUxLmdldENsaWVudEFyZWEoKTsKLQkJCQkJCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQkJCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkJCQkJLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2MuZHJhd0ltYWdlKHNoYXBlSW1hZ2UsIHNoYXBlSW1hZ2UKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkueCwKLQkJCQkJCQkJCQlzaGFwZUltYWdlLmdldEJvdW5kcygpLnksIHNoYXBlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCwgc2hhcGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmhlaWdodCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHBhbmUxCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHdhcm5pbmdDb3VudCA9PSAxKSB7Ci0JCQkJCQkJCQl3YXJuaW5nQ291bnQrKzsKLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmcsIChuZXcgT2JqZWN0W10geyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSwgcGF0aCB9KSk7IAotCQkJCQkJCQkJTXNnQm94LnNob3dXYXJuaW5nKG1zZyk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvciwgKG5ldyBPYmplY3RbXSB7IGV4LmdldE1lc3NhZ2UoKSB9KSkpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQkJcGFuZTEucmVkcmF3KCk7Ci0JCWlmKGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpICE9IG51bGwpewotCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpLmdldFBhdGgoKSk7Ci0JCX0KLQkJCi0JCXBhbmUzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJLy8gcGFpbnQgdGhlIGdyZXkgYmFja2dyb3VuZAotCQkJCVJlY3RhbmdsZSBjbGllbnRSZWN0ID0gcGFuZTMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKDE1KSk7Ci0JCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGNsaWVudFJlY3QpOwotCi0JCQkJamF2YS5uZXQuVVJJIHVyaSA9IGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4obWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJCQlpZihwYXRoLmluZGV4T2YocGx1Z2luLmdldE5hbWUoKSkgPiAtMSl7Ci0JCQkJCQkJCQkJcGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CQotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGF0aCA9IGdldFBsdWdpblBhdGgobWV0aG9kRWxlbWVudCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcGF0aDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCWlmIChub2RlSW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQkJbm9kZUltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJCQkJCQkJCQlwYXRoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZihjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpICE9IG51bGwpewotCQkJCQkJCQkJbm9kZUljb25QYXRoLnNldFRleHQoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKS5nZXRQYXRoKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNsaWVudFJlY3QgPSBwYW5lMy5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCQkJCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGNsaWVudFJlY3QpOwotCQkJCQkJCQllLmdjLmRyYXdJbWFnZShub2RlSW1hZ2UsCi0JCQkJCQkJCQkJbm9kZUltYWdlLmdldEJvdW5kcygpLngsIG5vZGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLnksIG5vZGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoLCBub2RlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS5oZWlnaHQsIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLngsIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCBwYW5lMwotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICh3YXJuaW5nQ291bnQgPT0gMSkgewotCQkJCQkJCQkJd2FybmluZ0NvdW50Kys7Ci0JCQkJCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmcsIChuZXcgT2JqZWN0W10geyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSwgcGF0aCB9KSk7IAotCQkJCQkJCQkJTXNnQm94LnNob3dXYXJuaW5nKG1zZyk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yLCAobmV3IE9iamVjdFtdIHsgZXguZ2V0TWVzc2FnZSgpIH0pKSk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCQlwYW5lMy5yZWRyYXcoKTsKLQkJaWYoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSAhPSBudWxsKXsKLQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkuZ2V0UGF0aCgpKTsKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVNlY3Rpb25zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlnZW5lcmFsU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnID0gZ2VuZXJhbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGV0YWlsU2VjdGlvbk9uKSB7Ci0JCQlkZXRhaWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlkZXRhaWxTZWN0aW9uLnNldEV4cGFuZGVkKGRldGFpbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcgPSBkZXRhaWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQlkZXRhaWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlub3RhdGlvblNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCW5vdGF0aW9uU2VjdGlvbi5zZXRFeHBhbmRlZChub3RhdGlvblNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbm90YXRpb25TZWN0aW9uRXhwYW5kRmxhZyA9IG5vdGF0aW9uU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJbm90YXRpb25TZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRFeHBhbmRlZCh0YWlsb3JpbmdTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCXRhaWxvcmluZ1NlY3Rpb25FeHBhbmRGbGFnID0gdGFpbG9yaW5nU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQl2ZXJzaW9uU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdmVyc2lvblNlY3Rpb24uc2V0RXhwYW5kZWQodmVyc2lvblNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvblNlY3Rpb25FeHBhbmRGbGFnID0gdmVyc2lvblNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCXZlcnNpb25TZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWljb25TZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlpY29uU2VjdGlvbi5zZXRFeHBhbmRlZChpY29uU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlpY29uU2VjdGlvbkV4cGFuZEZsYWcgPSBpY29uU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJaWNvblNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCXZhcmlhYmlsaXR5U2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldEV4cGFuZGVkKGVsZW1lbnRTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnRTZWN0aW9uRXhwYW5kRmxhZyA9IHZhcmlhYmlsaXR5U2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc2hhcGVJbWFnZSAhPSBudWxsKSB7Ci0JCQlzaGFwZUltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobm9kZUltYWdlICE9IG51bGwpIHsKLQkJCW5vZGVJbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eSAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyVmFyaWFiaWxpdHkuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXJCYXNlICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJCYXNlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UgIT0gbnVsbCkgewotCQkJY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlpZiAoY29sdW1uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29sdW1uUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VjdGlvblByb3ZpZGVycy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IHByb3ZpZGVyID0gc2VjdGlvblByb3ZpZGVycy5nZXQoaSk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCAmJiBwcm92aWRlciBpbnN0YW5jZW9mIElTZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkoKElTZWN0aW9uUHJvdmlkZXIpIHByb3ZpZGVyKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQkJZGlzcG9zZWQgPSB0cnVlOwotCX0JCQotCi0JcHJpdmF0ZSB2b2lkIHNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCkgewotCQlpZiAobWV0aG9kVW5pdC5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0Ci0JCQkJCS5zZXRFbmFibGVkKChtZXRob2RVbml0Ci0JCQkJCQkJLmdldENvcHlyaWdodFN0YXRlbWVudCgpLmdldE5hbWUoKSA9PSBudWxsKSA/IGZhbHNlCi0JCQkJCQkJOiB0cnVlKTsKLQkJfSBlbHNlCi0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChtZXRob2RFbGVtZW50KSkKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udGV4dEhlbHAoKSB7Ci0JCWlmIChtYWluQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAobWFpbkNvbXBvc2l0ZS5nZXRQYXJlbnQoKSwKLQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCX0KLQkJaWYgKGV4cGFuZGVkQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJCWV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5SSUNIX1RFWFRfRURJVE9SX0NPTlRFWFRfSUQpOwotCQl9Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklSZWZyZXNoYWJsZSNyZWZyZXNoTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCWlmICgoY3RybF9uYW1lICE9IG51bGwpICYmICEoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQljdHJsX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKXsKLQkJCi0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKGRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiBkZXRhaWxTZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5ERVRBSUxfU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24oKXsKLQkJaWYoZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiE9IG51bGwpewotCQkJcmV0dXJuIGdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbigpewotCQlpZih0YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb24gIT0gbnVsbCl7Ci0JCQlyZXR1cm4gdGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuVEFJTE9SSU5HX1NFQ1RJT05fREVTQzsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXROb3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbigpewotCQlpZihub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiBub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0Lk5PVEFUSU9OX1NFQ1RJT05fREVTQzsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbigpewotCQlpZih2YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiB2YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LlZBUklBQklMSVRZX1NFQ1RJT05fREVTQzsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SWNvblNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YnMKLQkJaWYoaWNvblNlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiBpY29uU2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuSUNPTl9TRUNUSU9OX0RFU0M7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldFZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYodmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiB2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9JTkZPX1NFQ1RJT05fREVTQzsKLQl9Ci0KLQkvKiogCi0JICogRm9sbG93aW5nIG1ldGhvZHMgYmVsb3cgZXhwb3NlZCBwdWJsaWMgaW4gb3JkZXIgdG8gYWxsb3cgCi0JICogdGVzdCBhdXRvbWF0aW9uIHRvIGFjY2VzcyB0aGUgZm9ybSBvYmplY3RzIHRocm91Z2ggdGVzdCBvYmplY3RzCi0JICogb2YgYW55IGF1dG9tYXRpb24gdG9vbHMuCi0JICovCi0JCi0JLyoqCi0JICogR2V0IGJyaWVmIGRlc2NyaXB0aW9uCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX2JyaWVmX2Rlc2MuCi0JICovCi0JcHVibGljIFRleHQgZ2V0Q3RybF9icmllZl9kZXNjKCkgewotCQlyZXR1cm4gY3RybF9icmllZl9kZXNjOwotCX0KLQotCS8qKgotCSAqIFNldCBicmllZiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjdHJsX2JyaWVmX2Rlc2MgVGhlIGN0cmxfYnJpZWZfZGVzYyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3RybF9icmllZl9kZXNjKFRleHQgY3RybF9icmllZl9kZXNjKSB7Ci0JCXRoaXMuY3RybF9icmllZl9kZXNjID0gY3RybF9icmllZl9kZXNjOwotCX0KLQotCS8qKgotCSAqIEdldCBtYWluIGRlc2NyaXB0aW9uCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX2Z1bGxfZGVzYy4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IGdldEN0cmxfZnVsbF9kZXNjKCkgewotCQlyZXR1cm4gY3RybF9mdWxsX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IG1haW4gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gY3RybF9mdWxsX2Rlc2MgVGhlIGN0cmxfZnVsbF9kZXNjIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2Z1bGxfZGVzYyhJTWV0aG9kUmljaFRleHQgY3RybF9mdWxsX2Rlc2MpIHsKLQkJdGhpcy5jdHJsX2Z1bGxfZGVzYyA9IGN0cmxfZnVsbF9kZXNjOwotCX0KLQotCS8qKgotCSAqIEdldCBwcmVzZW50YXRpb24gbmFtZQotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3RybF9wcmVzZW50YXRpb25fbmFtZS4KLQkgKi8KLQlwdWJsaWMgVGV4dCBnZXRDdHJsX3ByZXNlbnRhdGlvbl9uYW1lKCkgewotCQlyZXR1cm4gY3RybF9wcmVzZW50YXRpb25fbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgcHJlc2VudGF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gY3RybF9wcmVzZW50YXRpb25fbmFtZSBUaGUgY3RybF9wcmVzZW50YXRpb25fbmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3RybF9wcmVzZW50YXRpb25fbmFtZShUZXh0IGN0cmxfcHJlc2VudGF0aW9uX25hbWUpIHsKLQkJdGhpcy5jdHJsX3ByZXNlbnRhdGlvbl9uYW1lID0gY3RybF9wcmVzZW50YXRpb25fbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZXhwYW5kZWQgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfZXhwYW5kZWQuCi0JICovCi0JcHVibGljIElNZXRob2RSaWNoVGV4dEVkaXRvciBnZXRDdHJsX2V4cGFuZGVkKCkgewotCQlyZXR1cm4gY3RybF9leHBhbmRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZXhwYW5kZWQgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gY3RybF9leHBhbmRlZCBUaGUgY3RybF9leHBhbmRlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3RybF9leHBhbmRlZChJTWV0aG9kUmljaFRleHRFZGl0b3IgY3RybF9leHBhbmRlZCkgewotCQl0aGlzLmN0cmxfZXhwYW5kZWQgPSBjdHJsX2V4cGFuZGVkOwotCX0KLQotCS8qKgotCSAqIEdldCByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3RybF9rZXkuCi0JICovCi0JcHVibGljIElNZXRob2RSaWNoVGV4dCBnZXRDdHJsX2tleSgpIHsKLQkJcmV0dXJuIGN0cmxfa2V5OwotCX0KLQotCS8qKgotCSAqIFNldCByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBjdHJsX2tleSBUaGUgY3RybF9rZXkgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN0cmxfa2V5KElNZXRob2RSaWNoVGV4dCBjdHJsX2tleSkgewotCQl0aGlzLmN0cmxfa2V5ID0gY3RybF9rZXk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luUGF0aChNZXRob2RFbGVtZW50IGUpewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChwbHVnaW4pOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmYzhlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpc2NpcGxpbmUgZGlzY2lwbGluZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEV4dGVybmFsSURPbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJZGlzY2lwbGluZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YTMwZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRGlzY2lwbGluZSBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRFeHRlcm5hbElET24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkaXNjaXBsaW5lR3JvdXBpbmcpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZmFiZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEaXNjaXBsaW5lcyBwYWdlIGluIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lR3JvdXBpbmcgZGlzY2lwbGluZUdyb3VwaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuRElTQ0lQTElORVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0KS5nZXREaXNjaXBsaW5lcygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCWRpc2NpcGxpbmVHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksCi0JCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlkaXNjaXBsaW5lR3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjNmNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5SZWZlcmVuY2VXb3JrRmxvd0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSZWZlcmVuY2UgV29ya2Zsb3cgcGFnZSBpbiB0aGUgRGlzY2lwbGluZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpc2NpcGxpbmUgZGlzY2lwbGluZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRV9XT1JLRkxPV19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBkaXNjaXBsaW5lLmdldFJlZmVyZW5jZVdvcmtmbG93cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQkvLyBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gUHJvY2VzcyBwcm9jZXNzID0KLQkJCS8vIChQcm9jZXNzKSgoUHJvY2Vzc0NvbXBvbmVudClvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCS8vIGlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCS8vIGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJLy8gZGlzY2lwbGluZSwKLQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIHByb2Nlc3MsCi0JCQkvLyAtMSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJLy8gZGlzY2lwbGluZSwKLQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIG9iamVjdCwKLQkJCS8vIC0xKTsKLQkJCS8vIH0KLQkJCU1ldGhvZEVsZW1lbnQgb2JqZWN0ID0gKE1ldGhvZEVsZW1lbnQpIGl0b3IubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlvYmplY3QgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0JCQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKGRpc2NpcGxpbmUsCi0JCQkJCQlmZWF0dXJlLCBvYmplY3QpKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWRpc2NpcGxpbmUsIGZlYXR1cmUsIG9iamVjdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCWRpc2NpcGxpbmUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBSZWZlcmVuY2VXb3JrRmxvd0ZpbHRlcigpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lVGFza3NQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVUYXNrc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlNmQ0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRhc2tzIHBhZ2UgaW4gdGhlIERpc2NpcGxpbmUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZVRhc2tzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lVGFza3NQYWdlIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgRGlzY2lwbGluZSBkaXNjaXBsaW5lOwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lVGFza3NQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuVEFTS1NfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCS8vcmV0dXJuICgoRGlzY2lwbGluZSkgb2JqZWN0KS5nZXRUYXNrcygpLnRvQXJyYXkoKTsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZLAotCQkJCQkJCWdldE9yZGVyRmVhdHVyZSgpKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKGNvbnRlbnRFbGVtZW50LCAKLQkJCQkJCWFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCQotCQkJCS8vCWNoZWNrIHRvIG1haW50YWluIG1hbnktdG8tb25lIHJ1bGUgZm9yIGRvbWFpbi13b3JrcHJvZHVjdAotLy8JCQkJTGlzdCBkaXNjaXBsaW5lcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKHRhc2spOwotLy8JCQkJaWYgKGRpc2NpcGxpbmVzICE9IG51bGwgJiYgZGlzY2lwbGluZXMuc2l6ZSgpID4gMCkJewotLy8JCQkJCU9iamVjdCBhc3NvY2lhdGVkRGlzY2lwbGluZSA9IGRpc2NpcGxpbmVzLmdldCgwKTsKLS8vCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotLy8JCQkJCS5mb3JtYXQoCi0vLwkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotLy8JCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQkJdGFzay5nZXROYW1lKCksCi0vLwkJCQkJCQkJCVRuZ1V0aWwKLS8vCQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChhc3NvY2lhdGVkRGlzY2lwbGluZSksCi0vLwkJCQkJCQkJCWRpc2NpcGxpbmUuZ2V0TmFtZSgpIH0pOwotLy8JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93V2FybmluZygKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2cpOwotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLQkJCQkKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvRGlzY2lwbGluZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZGlzY2lwbGluZSwgdGFzaywgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tRGlzY2lwbGluZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZGlzY2lwbGluZSwgdGFzaywgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJaWYgKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRhc2spOwotCQkJfQotCQl9OwotCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKSB7Ci0JCXJldHVybiBhbGxTdGVwczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQ5ODc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkRlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkb21haW5EZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERvbWFpbiBkb21haW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEb21haW5EZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRvbWFpbiA9IChEb21haW4pIGNvbnRlbnRFbGVtZW50OwotCQlzZXRFeHRlcm5hbElET24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERvbWFpbik7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkb21haW4pIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbldvcmtQcm9kdWN0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzVkNDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgV29yayBQcm9kdWN0cyBwYWdlIGluIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogcmVtb3ZlIHRoZSB0by1vbmUgVUkgcmVzdHJpY3Rpb24gb24gd3AtZG9taWFuIChSMzk1MzkwKSAyMDA3LTA4LTMwCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5Xb3JrUHJvZHVjdHNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRvbWFpbldvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERvbWFpbiBkb21haW47Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQkKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRG9tYWluV29ya1Byb2R1Y3RzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LldPUktfUFJPRFVDVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkb21haW4gPSAoRG9tYWluKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy9yZXR1cm4gKChEb21haW4pIG9iamVjdCkuZ2V0V29ya1Byb2R1Y3RzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoCi0JCQkJCQljb250ZW50RWxlbWVudCwgYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFV1cGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJCS8vIGNoZWNrIHRvIG1haW50YWluIG1hbnktdG8tb25lIHJ1bGUgZm9yIGRvbWFpbi13b3JrcHJvZHVjdAotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCUxpc3QgZG9tYWlucyA9IEFzc29jaWF0aW9uSGVscGVyLmdldERvbWFpbnMoKFdvcmtQcm9kdWN0KSBlbGVtZW50KTsKLQkJCQlpZiAoZG9tYWlucyAhPSBudWxsICYmIGRvbWFpbnMuc2l6ZSgpID4gMCkJewotCQkJCQlPYmplY3QgYXNzb2NpYXRlZERvbWFpbiA9IGRvbWFpbnMuZ2V0KDApOwotLy8JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0vLwkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQllbGVtZW50LmdldE5hbWUoKSwKLS8vCQkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGFzc29jaWF0ZWREb21haW4pLAotLy8JCQkJCQkJCQlkb21haW4uZ2V0TmFtZSgpIH0pOwotLy8JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93V2FybmluZygKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2cpOwotLy8JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gd2lsbCBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUKLQkJCQkvLyBmZWF0dXJlIHZhbHVlCi0JCQkJLy8JCi0vLwkJCQlpZiAoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKGRvbWFpbiwKLS8vCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLCBlbGVtZW50KSkgewotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLQkJCX0KLQotCQkJYWN0aW9uTWdyCi0JCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZG9tYWluLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwKLQkJCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBkb21haW4sCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0T3JkZXJGZWF0dXJlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKSB7Ci0JCXJldHVybiBhbGxTdGVwczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4ZTNiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIEd1aWRhbmNlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZ3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgR3VpZGFuY2UgZ3VpZGFuY2U7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TGFiZWw7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2NvbnRlbnQ7Ci0KLQlwcml2YXRlIGludCBjb250ZW50RmllbGRIZWlnaHQgPSA0MDA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIGNvbnRlbnRFbGVtZW50OwotCQllbGVtZW50TGFiZWwgPSBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChndWlkYW5jZSk7Ci0JCXNldEVsZW1lbnRUeXBlT24odHJ1ZSk7Ci0JCWlmIChndWlkYW5jZSBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJc2V0QnJpZWZEZXNjT24oZmFsc2UpOwotCQlzZXRGdWxsRGVzY09uKGZhbHNlKTsKLQkJc2V0S2V5Q29uc2lkZXJhdGlvbk9uKGZhbHNlKTsKLQkJc2V0SWNvblNlY3Rpb25Pbih0cnVlKTsKLQkJc2V0RXh0ZXJuYWxJRE9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZvcm1QcmVmaXgoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Rm9ybVByZWZpeCgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoTGlicmFyeVVJVGV4dC5URVhUX0dVSURBTkNFKQotCQkJCS5hcHBlbmQoIiAoIikuYXBwZW5kKGVsZW1lbnRMYWJlbCkuYXBwZW5kKCIpOiAiKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdG9yIHRhYiBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCWN0cmxfY29udGVudCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0Lk1BSU5fREVTQ1JJUFRJT05fVEVYVCwKLQkJCQljb250ZW50RmllbGRIZWlnaHQsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQljdHJsX2NvbnRlbnQuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2NvbnRlbnQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCWN0cmxfY29udGVudC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2NvbnRlbnQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2NvbnRlbnQ7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfY29udGVudC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCQlpZiAoZ3VpZGFuY2UgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbnRlbnQgPSBudWxsOwotCQkJaWYgKGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpICE9IG51bGwpIHsKLQkJCQljb250ZW50ID0gZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCQljdHJsX2NvbnRlbnQuc2V0VGV4dChjb250ZW50ID09IG51bGwgPyAiIiA6IGNvbnRlbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgTWFpbiBEZXNjcmlwdGlvbiB0ZXh0IGJveC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRGaWVsZEhlaWdodCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRGaWVsZEhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIE1haW4gRGVzY3JpcHRpb24gdGV4dCBib3guCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudEZpZWxkSGVpZ2h0KGludCBjb250ZW50RmllbGRIZWlnaHQpIHsKLQkJdGhpcy5jb250ZW50RmllbGRIZWlnaHQgPSBjb250ZW50RmllbGRIZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCXJldHVybiAoKChDb250ZW50RWxlbWVudCkgb2JqKS5nZXRUeXBlKCkKLQkJCQkJCQkuZXF1YWxzKCgoR3VpZGFuY2UpIGNvbnRlbnRFbGVtZW50KS5nZXRUeXBlKCkpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCi0JCS8vIFNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nLgotCQkoKENvbnRlbnRGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJZ3VpZGFuY2UpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbmNlcHQpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENoZWNrbGlzdCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEV4YW1wbGUpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEd1aWRlbGluZSl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZSl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZXBvcnQpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2FkbWFwKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZSl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbil7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sTWVudG9yKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTE4Y2MzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRMaW5rRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBHdWlkYW5jZSAod2l0aCBhdHRhY2htZW50cykgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2F0dGFjaCwgY3RybF9kZXRhY2gsIGN0cmxfYXR0YWNoX3VybCA7IC8vY3RybF9yZW1vdmUgOwotCi0JcHJpdmF0ZSBMaXN0IGN0cmxfYXR0YWNoZWRfZmlsZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYgPSAiZ3VpZGFuY2VfYXR0YWNobWVudF9sYXN0X2Rpcl9icm93c2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCi0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkFUVEFDSEVEX0ZJTEVfVEVYVCwgMik7Ci0JCWN0cmxfYXR0YWNoZWRfZmlsZXMgPSBuZXcgTGlzdChnZW5lcmFsQ29tcG9zaXRlLCBTV1QuU0lOR0xFCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlHcmlkRGF0YSBsaXN0R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORywKLQkJCQl0cnVlLCB0cnVlKTsKLQkJbGlzdEdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDsKLQkJbGlzdEdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY3RybF9hdHRhY2hlZF9maWxlcy5zZXRMYXlvdXREYXRhKGxpc3RHcmlkRGF0YSk7Ci0KLQkJY3RybF9hdHRhY2hlZF9maWxlcy5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCTEpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJY3RybF9hdHRhY2ggPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBBVFRBQ0hfQlVUVE9OKTsKLQkJY3RybF9hdHRhY2hfdXJsID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgQVRUQUNIX1VSTF9CVVRUT04pOwotCQljdHJsX2RldGFjaCA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIERFVEFDSF9CVVRUT04pOwotCQkKLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlmaW5hbCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJY3RybF9hdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nCi0JCQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5hdHRhY2hHdWlkYW5jZUZpbGVEaWFsb2dfdGl0bGUpOyAKLQkJCQlTdHJpbmcgbGFzdERpciA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXRTdHJpbmcoCi0JCQkJCQkJCUdVSURBTkNFX0FUVEFDSE1FTlRfTEFTVF9ESVJFQ1RPUllfQlJPV1NFRF9QUkVGKTsKLQkJCQlpZiAobGFzdERpciAhPSBudWxsICYmIGxhc3REaXIudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0RGlyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZ3VpZGFuY2UpKTsKLQkJCQl9Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZGlhbG9nLmdldEZpbGVOYW1lKCkgIT0gbnVsbCAmJiBkaWFsb2cuZ2V0RmlsZU5hbWUoKSAhPSAiIikgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlGaWxlIGZpbGVUb0F0dGFjaCA9IG5ldyBGaWxlKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCksCi0JCQkJCQkJCWRpYWxvZy5nZXRGaWxlTmFtZSgpKTsKLQkJCQkJCVN0cmluZyBmaWxlVXJsID0gTGlicmFyeVVJVXRpbC5nZXRVUkxGb3JBdHRhY2htZW50KGN0cmxfYXR0YWNoLmdldFNoZWxsKCksCi0JCQkJCQkJCWZpbGVUb0F0dGFjaCwgZ3VpZGFuY2UsIHRydWUpOwotCQkJCQkJaWYgKGZpbGVVcmwgPT0gbnVsbCkgewotCQkJCQkJCS8vIHVzZXIgaGl0IGNhbmNlbCBvbiBSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY3RybF9hdHRhY2hlZF9maWxlcy5pbmRleE9mKGZpbGVVcmwpICE9IC0xKSB7Ci0JCQkJCQkJLy8gZmlsZSBpcyBhbHJlYWR5IGFuIGF0dGFjaG1lbnQKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQsIAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnKTsgCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJY3RybF9hdHRhY2hlZF9maWxlcy5hZGQoZmlsZVVybCk7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCksCi0JCQkJCQkJCWdldEZpbGVzRnJvbUxpc3RDdHJsKCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkJCQkuc2V0VmFsdWUoCi0JCQkJCQkJCQkJCUdVSURBTkNFX0FUVEFDSE1FTlRfTEFTVF9ESVJFQ1RPUllfQlJPV1NFRF9QUkVGLAotCQkJCQkJCQkJCQlkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIFRPRE86IERpc3BsYXkgYW4gZXJyb3IgZGlhbG9nLgotCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYXR0YWNoX3VybC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlBZGRMaW5rRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRMaW5rRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCQkKLQkJCQkJaWYoIGRpYWxvZy5nZXRMaW5rKCkgIT0gbnVsbCkgeyAKLQkJCQkJCQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgbGlua1VybCA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0VVJMKCk7Ci0JCQkJCQkJU3RyaW5nIGxpbmtOYW1lID0gZGlhbG9nLmdldExpbmsoKS5nZXROYW1lKCk7Ci0JCQkJCQkJaWYgKGxpbmtOYW1lID09IG51bGwgfHwgbGlua05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJbGlua05hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShsaW5rVXJsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVVJMIHVybCA9IG5ldyBVUkwobGlua1VybCk7Ci0JCQkJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJCQkJCQlpZiAobXVlLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKCJubyBwcm90b2NvbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWxpbmtVcmwgPSBOZXRVdGlsLkhUVFBfVVJJX1BSRUZJWCArIGxpbmtVcmw7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJU3RyaW5nIHVybFN0cmluZyA9ICI8YSBocmVmPVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCQkJdXJsU3RyaW5nICs9IE5ldFV0aWwKLQkJCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChsaW5rVXJsKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl1cmxTdHJpbmcgKz0gTmV0VXRpbC5lbmNvZGVGaWxlVVJMKGxpbmtVcmwpOwotCQkJCQkJCX0KLQkJCQkJCQl1cmxTdHJpbmcgKz0gIlwiPiIgKyBsaW5rTmFtZSArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJbGlua1VybCA9IHVybFN0cmluZzsKLQkJCQkJCQkvL1N0cmluZyBsaW5rRGlzcGxheU5hbWUgPSBkaWFsb2cuZ2V0TGluaygpLmdldE5hbWUoKTsJCQkJCQkJCi0JCQkJCQkJCi0JCQkJCQkJaWYgKGxpbmtVcmwgPT0gbnVsbCkgewotCQkJCQkJCQkvLyB1c2VyIGhpdCBjYW5jZWwgb24gQWRkTGlua0RpYWxvZwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChjdHJsX2F0dGFjaGVkX2ZpbGVzLmluZGV4T2YobGlua1VybCkgIT0gLTEpIHsKLQkJCQkJCQkJLy8gSWYgbGluayBhbHJlYWR5IGV4aXN0cwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5BdHRhY2htZW50RGlhbG9nYXR0YWNoVXJsX3RleHQsIAotCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfR3VpZGFuY2VXaXRoVXJsQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZyk7IAotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCWN0cmxfYXR0YWNoZWRfZmlsZXMuYWRkKGxpbmtVcmwpOwotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQkJCQkJCWdldEZpbGVzRnJvbUxpc3RDdHJsKCksIC0xKTsKLQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3RybF9kZXRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9hdHRhY2hlZF9maWxlcy5yZW1vdmUoY3RybF9hdHRhY2hlZF9maWxlcwotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpLAotCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCi0JCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBjdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIC8vY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBTdHJpbmcgb2xkQ29udGVudCA9Ci0JCS8vICgoR3VpZGFuY2VEZXNjcmlwdGlvbilndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QXR0YWNobWVudHMoKTsKLQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCS8vIGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCksCi0JCS8vIGN0cmxfYXR0YWNoZWRfZmlsZXMuZ2V0VGV4dCgpLCAtMSk7Ci0JCS8vIGlmKCFzdGF0dXMpewotCQkvLyAvL2N0cmxfYXR0YWNoZWRfZmlsZXMuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfYXR0YWNoLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2F0dGFjaF91cmwuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZGV0YWNoLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkKLQkJLy8gY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQkJaWYgKGd1aWRhbmNlICE9IG51bGwpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJU3RyaW5nIHRoaXJkcGFydHlmb3JtYXQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQlzZXRGaWxlc1RvTGlzdEN0cmwodGhpcmRwYXJ0eWZvcm1hdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHN0cmluZyBvZiBmaWxlcywgYWRkIHRoZSBmaWxlcyB0byB0aGUgTGlzdCBjb250cm9sCi0JICogCi0JICogQHBhcmFtIGZpbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEZpbGVzVG9MaXN0Q3RybChTdHJpbmcgZmlsZVN0cmluZykgewotCQlqYXZhLnV0aWwuTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwKLQkJCQkuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoZmlsZVN0cmluZyk7Ci0JCWN0cmxfYXR0YWNoZWRfZmlsZXMucmVtb3ZlQWxsKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgYXR0YWNobWVudCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJY3RybF9hdHRhY2hlZF9maWxlcy5hZGQoYXR0YWNobWVudCk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGxpc3Qgb2YgZmlsZXMgYXMgYSBzdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSB7Ci0JCVN0cmluZyBmaWxlc1tdID0gY3RybF9hdHRhY2hlZF9maWxlcy5nZXRJdGVtcygpOwotCQlyZXR1cm4gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvU3RyaW5nKEFycmF5cy5hc0xpc3QoZmlsZXMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSUNvbHVtblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0lDb2x1bW5Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmUxNmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSUNvbHVtblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGJlIHVzZWQgYWRkIGNvbHVtbnMgb24gZGVzY3JpcHRpb24gdGFiIG9mIGFsbCBlZGl0b3JzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbHVtblByb3ZpZGVyICAgewotCi0KLQkvKioKLQkgKiBTZXQgY29sdW1uIGNvbXBvc2l0ZSBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGVkaXRvcgotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgc2V0Q29sdW1uKE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yLCBGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KTsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIHN0YXRlIG9mIGFsbCBjb250cm9scwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goYm9vbGVhbiB2YWx1ZSk7Ci0JCi0JCi0JLyoqCi0JICogRGlzcG9zZSB0aGUgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSVJlZnJlc2hhYmxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0lSZWZyZXNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWE2YTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSVJlZnJlc2hhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIHJlZnJlc2ggYSBmb3JtIHRoYXQgaW1wbGVtZW50cyB0aGlzIGluIGNhc2Ugb2YgbW9kZWwgY2hhbmdlIG91dHNpZGUgb2YgdGhlIGZvcm0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZyZXNoYWJsZSB7Ci0JCi0JLyoqCi0JICogUmVmcmVzaCBuYW1lIG9mIHRoZSBmb3JtCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQl2b2lkIHJlZnJlc2hOYW1lKFN0cmluZyBuZXdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSVNlY3Rpb25Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JU2VjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTJiNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JU2VjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGJlIHVzZWQgYWRkIHNlY3Rpb24gb24gZGVzY3JpcHRpb24gdGFiIG9mIGFsbCBlZGl0b3JzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlY3Rpb25Qcm92aWRlciAgIHsKLQotCi0JLyoqCi0JICogQ3JlYXRlIHNlY3Rpb24gY29tcG9zaXRlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgZWRpdG9yCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciwgRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCk7Ci0JCi0JLyoqCi0JICogUmVmcmVzaCBzdGF0ZSBvZiBhbGwgY29udHJvbHMKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gdmFsdWUpOwotCQotCQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZEZvcm1Ub29sa2l0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZEZvcm1Ub29sa2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWM2YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RGb3JtVG9vbGtpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5NZXRob2RSaWNoVGV4dENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogQSBoZWxwIGNsYXNzIGZvciBjcmVhdGluZyBVSSB3aWRnZXRzIGFkYXB0ZWQgYWRhcHRlZCB0byB3b3JrIGluIEVjbGlwc2UKLSAqIGZvcm1zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEZvcm1Ub29sa2l0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBSaWNoIFRleHQgY29udHJvbCBhbmQgYWRhcHRzIGl0IHRvIGJlIHVzZWQgaW4gYSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgdGV4dCBmb3IgdGhlIHZpZXdlci4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JTWV0aG9kUmljaFRleHQ8L2NvZGU+IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgsCi0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIExhYmVsIGxhYmVsKSB7Ci0JCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGNyZWF0ZU1ldGhvZFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQkJcmljaFRleHQuaW5pdChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXRob2RSaWNoVGV4dCBjcmVhdGVNZXRob2RSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQlNZXRob2RSaWNoVGV4dENvbnRleHQgY29udGV4dCA9IG5ldyBNZXRob2RSaWNoVGV4dENvbnRleHQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCQlPYmplY3QgcHJvdmlkZXIgPSBFeHRlbnNpb25IZWxwZXIuY3JlYXRlKElNZXRob2RSaWNoVGV4dC5jbGFzcywgY29udGV4dCk7Ci0JCXJldHVybiBwcm92aWRlciBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCA/IChJTWV0aG9kUmljaFRleHQpIHByb3ZpZGVyIDogbmV3IE1ldGhvZFJpY2hUZXh0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBSaWNoIFRleHQgZWRpdG9yIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dEVkaXRvcjwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3JlYXRlUmljaFRleHRFZGl0b3IoCi0JCQlGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIExhYmVsIGxhYmVsLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciBlZGl0b3IgPSBuZXcgTWV0aG9kUmljaFRleHRFZGl0b3IocGFyZW50LCBzdHlsZSwKLQkJCQliYXNlUGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwsIGVkaXRvclNpdGUpOwotCQllZGl0b3IuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJZWRpdG9yLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmN2MzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBEZXNjcmlwdGlvbiBwYWdlIGZvciBtZXRob2QgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UID0gMjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JcHJpdmF0ZSBUZXh0IHRleHRBdXRob3JzOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfY2hhbmdlX2RhdGU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGVzYzsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb247Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jb3B5cmlnaHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlLCBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJLy8gZ2V0IE1ldGhvZExpYnJhcnkgb2JqZWN0IGZyb20gRWRpdG9yIGlucHV0Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQotCQlPYmplY3Qgb2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWxpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgb2JqOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZm9ybSBjb250ZW50LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJLy8gY3JlYXRlIGZvcm0gdG9vbGtpdAotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KGdldEVkaXRvcigpLmdldFBhcnROYW1lKCkpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIENyZWF0ZSBlZGl0b3IgY29udGVudAotCQljcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQsIGZvcm0uZ2V0Qm9keSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWRpdG9yIHRhYiBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gZWRpdG9yQ29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBlZGl0b3JDb21wb3NpdGUpIHsKLQkJLy8gQ3JlYXRlIEdlbmVyYWwgSW5mb3JtYXRpb24gc2VjdGlvbgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihlZGl0b3JDb21wb3NpdGUsCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlKTsgCi0JCWdlbmVyYWxTZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb24pOyAKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQkvLyBuYW1lCi0JCUxhYmVsIGxfbmFtZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uYW1lX3RleHQpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX25hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5TSU5HTEUpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJY3RybF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJLy8gYnJpZWYgZGVzYwotCQlMYWJlbCBsX2JyaWVmX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25fdGV4dCk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBBdXRob3JzCi0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmF1dGhvcnNfdGV4dCk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJdGV4dEF1dGhvcnMgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQkiIiwgU1dULk1VTFRJIHwgU1dULldSQVApOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDA7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJdGV4dEF1dGhvcnMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBDaGFuZ2UgRGF0ZQotCQlMYWJlbCBsX2NoYW5nZWRhdGUgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWxfY2hhbmdlZGF0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfY2hhbmdlX2RhdGUgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQkiIiwgU1dULlJFQURfT05MWSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX2NoYW5nZV9kYXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJLy8gQXV0aG9ycwotCQlMYWJlbCBsX2NoYW5nZV9kZXNjID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfREVTQ1JJUFRJT05fVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9jaGFuZ2VfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfY2hhbmdlX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX2NoYW5nZV9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJLy8gVmVyc2lvbgotCQlMYWJlbCBsX3ZlcnNpb24gPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF92ZXJzaW9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF92ZXJzaW9uID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsICIiLCBTV1QuTVVMVEkpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJY3RybF92ZXJzaW9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCUxhYmVsIGxfY29weXJpZ2h0ID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlyaWdodF90ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9jb3B5cmlnaHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF9jb3B5cmlnaHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDA7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJY3RybF9jb3B5cmlnaHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQkvLyBTZXQgZm9jdXMgb24gdGhlIG5hbWUgYXR0cmlidXRlCi0JCURpc3BsYXkgZGlzcGxheSA9IGVkaXRvckNvbXBvc2l0ZS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlTdHJpbmcgbmFtZSA9IGxpYnJhcnkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgYnJpZWZfZGVzYyA9IGxpYnJhcnkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCi0JCWN0cmxfbmFtZS5zZXRUZXh0KFRuZ1V0aWwuY2hlY2tOdWxsKG5hbWUpKTsKLQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoYnJpZWZfZGVzYykpOwotCQl0ZXh0QXV0aG9ycy5zZXRUZXh0KFRuZ1V0aWwuY2hlY2tOdWxsKGxpYnJhcnkuZ2V0QXV0aG9ycygpKSk7Ci0JCWlmIChsaWJyYXJ5LmdldENoYW5nZURhdGUoKSAhPSBudWxsKSB7Ci0JCQljdHJsX2NoYW5nZV9kYXRlLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRDaGFuZ2VEYXRlKCkKLQkJCQkJLnRvTG9jYWxlU3RyaW5nKCkpKTsKLQkJfQotCQljdHJsX2NoYW5nZV9kZXNjLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeQotCQkJCS5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpKSk7Ci0JCWN0cmxfdmVyc2lvbi5zZXRUZXh0KFRuZ1V0aWwuY2hlY2tOdWxsKGxpYnJhcnkuZ2V0VmVyc2lvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGZvY3VzIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXROYW1lKGN0cmxfbmFtZS5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2JyaWVmX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0QnJpZWZEZXNjcmlwdGlvbihjdHJsX2JyaWVmX2Rlc2MuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdGV4dEF1dGhvcnMuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0QXV0aG9ycyh0ZXh0QXV0aG9ycy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2NoYW5nZV9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlsaWJyYXJ5LnNldENoYW5nZURlc2NyaXB0aW9uKGN0cmxfY2hhbmdlX2Rlc2MuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF92ZXJzaW9uLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlsaWJyYXJ5LnNldFZlcnNpb24oY3RybF92ZXJzaW9uLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY29weXJpZ2h0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU0ZWFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVSZWZlcmVuY2VzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUGx1Z2luUmVmZXJlbmNlQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbiBwYWdlIGZvciBtZXRob2QgcGx1Z2luCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzODIKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgaW1wbGVtZW50cyBJUmVmcmVzaGFibGUgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUkVGSVggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX1BMVUdJTgotCQkJKyAiOiAiOyAvLyROT04tTkxTLTEkCi0KLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfcl9icmllZl9kZXNjOwotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfcmVmTW9kZWw7Ci0JcHJvdGVjdGVkIFNlY3Rpb24gcmVmTW9kZWxTZWN0aW9uOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcmVmTW9kZWxDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9jaGFuZ2VhYmxlOwotCXByb3RlY3RlZCBCdXR0b24gc3VwcG9ydGluZ1BsdWdpbkNoZWNrYm94OwotCi0JcHVibGljIGJvb2xlYW4gbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciB1c2VyQ2hhbmdlYWJsZUFkYXB0ZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbmFtZU1vZGlmeUxpc3RlbmVyOwotCQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHJlZk1vZGVsU2VsQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkTGlzdCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlNZXRob2RQbHVnaW4gc2VsZWN0ZWRPYmogPSAoTWV0aG9kUGx1Z2luKSBzZWxlY3RlZExpc3QKLQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkT2JqID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0VGV4dChzZWxlY3RlZE9iagotCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJfQotCX07Ci0JCi0JcHJvdGVjdGVkIElDaGVja1N0YXRlTGlzdGVuZXIgcmVmTW9kZWxDaGVja1N0YXRlTGlzdGVuZXIgPSBuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0VGV4dCgoKE1ldGhvZFBsdWdpbikgb2JqKQotCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQotCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQocGx1Z2luKSkgewotCQkJCWN0cmxfcmVmTW9kZWwuc2V0Q2hlY2tlZChvYmosICFldmVudC5nZXRDaGVja2VkKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCS8vIFRPRE86IENoYW5nZSB0aGlzIHRvIGJlIG5vdCB1bi1kb2FibGUgZHVlIHRvIHRoZSBjaXJjdWxhcgotCQkJCS8vIGRlcGVuZGVuY3kgY2hlY2suCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgcGx1Z2luLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmosIC0xKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmluYWwgTWV0aG9kUGx1Z2luIGJhc2UgPSAoTWV0aG9kUGx1Z2luKSBvYmo7Ci0JCQkJCi0JCQkJaWYocmVtb3ZlQWxsUmVmZXJlbmNlcyhiYXNlKSl7Ci0JCQkJCWN0cmxfcmVmTW9kZWwuc2V0Q2hlY2tlZChiYXNlLCBmYWxzZSk7Ci0JCQkJfWVsc2V7Ci0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKGJhc2UsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvLyBjaGFuZ2UgdGhpcyB0byBiZSBub3QgdW4tZG9hYmxlIGR1ZSB0byB0aGUgY2lyY3VsYXIKLQkJCQkvLyBkZXBlbmRlbmN5IGNoZWNrCi0JCQkJLy8gcGx1Z2luLmdldEJhc2VzKCkucmVtb3ZlKG9iaik7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgcGx1Z2luLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmosIC0xKTsKLQkJCX0KLQotCQkJLy8gZG91YmxlIGNoZWNrIGNpcmN1bGFyIGRlcGVuZGVuY3ksIG5vdCBuZWNlc3NhcnkgaGVyZQotCQkJUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5oYXNDaXJjdWxhckNvbmZsaWN0V2l0aFBsdWdpbihwbHVnaW4pOwotCi0JCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCX0KLQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0KLQkJdXNlckNoYW5nZWFibGVBZGFwdGVyID0gbmV3IFVzZXJDaGFuZ2VhYmxlQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtZXRob2RFbGVtZW50OwotCQlpZiAodXNlckNoYW5nZWFibGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXBsdWdpbi5lQWRhcHRlcnMoKS5hZGQodXNlckNoYW5nZWFibGVBZGFwdGVyKTsKLQkJfQotCQlkZXRhaWxTZWN0aW9uT24gPSBmYWxzZTsKLQkJZnVsbERlc2NPbiA9IGZhbHNlOwotCQlrZXlDb25zaWRlcmF0aW9uT24gPSBmYWxzZTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uT24gPSBmYWxzZTsKLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3JlYXRlUmVmZXJlbmNlU2VjdGlvbih0b29sa2l0KTsKLQkJLy8gU2V0IGZvY3VzIG9uIHRoZSBOYW1lIHRleHQgY29udHJvbC4KLQkJRGlzcGxheSBkaXNwbGF5ID0gZm9ybS5nZXRCb2R5KCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZihjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVmZXJlbmNlQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0KLQkJVGFibGUgY3RybF90YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUocmVmTW9kZWxDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQkJY3RybF90YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfcmVmTW9kZWwgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihjdHJsX3RhYmxlKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfcmVmTW9kZWwuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQotCQljcmVhdGVSZWZNb2RlbEJyaWVmRGVzY0ZpZWxkKHRvb2xraXQpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHJlZk1vZGVsQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZWZNb2RlbEJyaWVmRGVzY0ZpZWxkKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJTGFiZWwgbF9yX2JyaWVmX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHJlZk1vZGVsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWxfcl9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9yX2JyaWVmX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZVRleHQocmVmTW9kZWxDb21wb3NpdGUsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWN0cmxfcl9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVmZXJlbmNlU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIFJlZiBNb2RlbCBTZWN0aW9uCi0JCXJlZk1vZGVsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXJlZk1vZGVsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkMSk7Ci0JCXJlZk1vZGVsU2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9OQU1FKTsKLQkJcmVmTW9kZWxTZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9ERVNDKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlyZWZNb2RlbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHJlZk1vZGVsU2VjdGlvbik7Ci0JCXJlZk1vZGVsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZWZNb2RlbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldENsaWVudChyZWZNb2RlbENvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVJlZmVyZW5jZUNvbnRlbnQodG9vbGtpdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2hlY2tib3hGb3JDdXJyZW50QmFzZShMaXN0PE1ldGhvZFBsdWdpbj4gY3VycmVudEJhc2VMaXN0KSB7Ci0JCWN0cmxfcmVmTW9kZWwuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudEJhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gbW9kZWwgPSAoTWV0aG9kUGx1Z2luKSBjdXJyZW50QmFzZUxpc3QuZ2V0KGkpOwotCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKG1vZGVsLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJcmVmcmVzaFJlZmVyZW5jZWRNb2RlbHMoKTsKLQotCQkJCWlmICghcGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJcmVmcmVzaChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbmFtZS5yZW1vdmVGb2N1c0xpc3RlbmVyKG5hbWVGb2N1c0xpc3RlbmVyKTsKLQkJbmFtZU1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHBsdWdpbiwgdHJ1ZSk7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoY3RybF9uYW1lLmdldFRleHQoKS5lcXVhbHMocGx1Z2luLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIENoZWNrIGludmFsaWQgY2hhcmFjdGVycyBmaXJzdC4KLQkJCQkKLQkJCQkvLyAxNzg0NjIKLQkJCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCQlTdHJpbmcgbmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKG9sZENvbnRlbnQuaW5kZXhPZigiJiIpIDwgMCAmJiBuYW1lLmluZGV4T2YoIiYiKSA+IC0xKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbXNnID0gTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJCQkJbmFtZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQltc2cgPSBMaWJyYXJ5VXRpbC5jaGVja1BsdWdpbk5hbWUobnVsbCwgbmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIHZhbGlkTmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUoY3RybF9uYW1lCi0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJLy8gQ2hlY2sgZHVwbGljYXRlIHBsdWctaW4gbmFtZS4KLQkJCQkJbXNnID0gTGlicmFyeVV0aWwuY2hlY2tQbHVnaW5OYW1lKHBsdWdpbiwgdmFsaWROYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCWlmICghdmFsaWROYW1lLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCQkJCW1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWUsIChuZXcgT2JqZWN0W10geyBwbHVnaW4uZ2V0TmFtZSgpLCBjdHJsX25hbWUuZ2V0VGV4dCgpIH0pKTsgCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsgCi0JCQkJCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIHRpdGxlLCBtc2cpKSB7Ci0JCQkJCQkJY3RybF9uYW1lLnNldFRleHQocGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlTWV0aG9kRWRpdG9yc0ZvclBsdWdpbkVsZW1lbnRzKHBsdWdpbik7Ci0JCQkJCQljdHJsX25hbWUuc2V0VGV4dCh2YWxpZE5hbWUpOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwbHVnaW4sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIHZhbGlkTmFtZSwgLTEpOwotCi0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWZvcm0uc2V0VGV4dChGT1JNX1BSRUZJWCArIHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCi0JCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCQkJZWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGVkaXRvcgotCQkJCQkJCQkJCS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXBlcnNpc3RlcgotCQkJCQkJCQkJCQkuYWRqdXN0TG9jYXRpb24ocGx1Z2luLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRTaXRlKCkKLQkJCQkJCQkJCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkJCQkJCQkJLmdldFRleHQoKSwKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyCi0JCQkJCQkJCQkJCQkJLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXNoZWxsLmdldFRleHQoKSwgbXNnKTsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQl9KTsKLQotCi0KLQkJYWRkUmVmZXJlbmNlZE1vZGVsTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VkTW9kZWxMaXN0ZW5lcigpIHsKLQkJY3RybF9yZWZNb2RlbC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocmVmTW9kZWxTZWxDaGFuZ2VkTGlzdGVuZXIpOwotCi0JCWN0cmxfcmVmTW9kZWwuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHJlZk1vZGVsQ2hlY2tTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfcl9icmllZl9kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb25Db250ZW50KCkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbkNvbnRlbnQoKTsKLQkJCi0JCXN1cHBvcnRpbmdQbHVnaW5DaGVja2JveCA9IHRvb2xraXQKLQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2Vfc3VwcG9ydGluZ1BsdWdpbkxhYmVsLCBTV1QuQ0hFQ0spOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmFsU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkR2VuZXJhbFNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJCi0JCXN1cHBvcnRpbmdQbHVnaW5DaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHBsdWdpbiwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCWJvb2xlYW4gcmV0ID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwbHVnaW4sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1N1cHBvcnRpbmcoKSwKLQkJCQkJCQluZXcgQm9vbGVhbihzdXBwb3J0aW5nUGx1Z2luQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpLAotCQkJCQkJCS0xKTsKLQkJCQkJLy8gaW4gY2FzZSBvZiByZWFkb25seSBmaWxlLCByb2xsIGJhY2sgY2hhbmdlcy4KLQkJCQkJaWYgKCFyZXQpIHsKLQkJCQkJCXN1cHBvcnRpbmdQbHVnaW5DaGVja2JveC5zZXRTZWxlY3Rpb24oIXN1cHBvcnRpbmdQbHVnaW5DaGVja2JveAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwKLQkJCQkJCQlzdGF0dXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkKLQkJfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxvYWRHZW5lcmFsU2VjdGlvbkRhdGEoKSB7Ci0JCXN1cGVyLmxvYWRHZW5lcmFsU2VjdGlvbkRhdGEoKTsKLQkJc3VwcG9ydGluZ1BsdWdpbkNoZWNrYm94Ci0JCQkuc2V0U2VsZWN0aW9uKHBsdWdpbi5pc1N1cHBvcnRpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVmVyc2lvbiBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb25Db250ZW50KCkgewotCQlzdXBlci5jcmVhdGVWZXJzaW9uU2VjdGlvbkNvbnRlbnQoKTsKLQotCQljdHJsX2NoYW5nZWFibGUgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXZlcnNpb25Db21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsLCBTV1QuQ0hFQ0spOyAKLQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCk7Ci0KLQkJY3RybF9jaGFuZ2VhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCi0JCQkJCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQkKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZSwKLQkJCQkJCQkJCXBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oc2hlbGwuZ2V0VGV4dCgpLCBtZXNzYWdlKSkgewotCQkJCQkJLy8gY2xvc2UgZWRpdG9ycyBvbiBhbnkgY2hhbmdlIGluIGN0cmxfY2hhbmdlYWJsZQotCQkJCQkJLy8gaWYgKGN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlTWV0aG9kRWRpdG9yc0ZvclBsdWdpbkVsZW1lbnRzKHBsdWdpbik7Ci0JCQkJCQlib29sZWFuIHJldCA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCXBsdWdpbiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCksCi0JCQkJCQkJCW5ldyBCb29sZWFuKCFjdHJsX2NoYW5nZWFibGUuZ2V0U2VsZWN0aW9uKCkpLAotCQkJCQkJCQktMSk7Ci0JCQkJCQkvLyBpbiBjYXNlIG9mIHJlYWRvbmx5IGZpbGUsIHJvbGwgYmFjayBjaGFuZ2VzLgotCQkJCQkJaWYgKCFyZXQpIHsKLQkJCQkJCQljdHJsX2NoYW5nZWFibGUuc2V0U2VsZWN0aW9uKCFjdHJsX2NoYW5nZWFibGUKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQkvLyB9Ci0JCQkJCQlyZWZyZXNoKCFjdHJsX2NoYW5nZWFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gYWN0aW9uTWdyLnVuZG8oKTsKLQkJCQkJCWN0cmxfY2hhbmdlYWJsZS5zZXRTZWxlY3Rpb24oIWN0cmxfY2hhbmdlYWJsZQotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJcmVmcmVzaCghY3RybF9jaGFuZ2VhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCS8vIHJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ190aXRsZSwKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsCi0JCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkKLQkJCQkvLyByZWZyZXNoIGVkaXRvciB0aXRsZSBpbWFnZS4gCi0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKWdldEVkaXRvcigpKS5yZWZyZXNoVGl0bGVJbWFnZSgpOwotCQkJfQotCi0JCQkKLQkJfSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkVmVyc2lvblNlY3Rpb25EYXRhKCkgewotCQlzdXBlci5sb2FkVmVyc2lvblNlY3Rpb25EYXRhKCk7Ci0JCWN0cmxfY2hhbmdlYWJsZQotCQkJCS5zZXRTZWxlY3Rpb24oIXBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVXNlckNoYW5nZWFibGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlzZXRVc2VyQ2hhbmdlYWJsZShiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIHVzZXJDaGFuZ2VhYmxlKSB7Ci0JCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCXJldHVybjsKLQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbi52YWx1ZU9mKHVzZXJDaGFuZ2VhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcGx1Z2luLmVBZGFwdGVycygpLnJlbW92ZSh1c2VyQ2hhbmdlYWJsZUFkYXB0ZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gTWV0aG9kUGx1Z2luIDxjb2RlPmJhc2U8L2NvZGU+IGlzIG9uZSBpbiB0aGUgZ2l2ZW4KLQkgKiBwbHVnaW5zIGNvbGxlY3Rpb24gb3IgYmFzZSBvZiBhbnkgcGx1Z2luIGluIHRoZSBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlCi0JICogQHBhcmFtIHBsdWdpbnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzT25lT3JCYXNlT2YoTWV0aG9kUGx1Z2luIGJhc2UsIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCWZvciAoTWV0aG9kUGx1Z2luIHBsdWdpbiA6IHBsdWdpbnMpIHsKLQkJCWlmKGJhc2UgPT0gcGx1Z2luIHx8IE1pc2MuaXNCYXNlT2YoYmFzZSwgcGx1Z2luKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzKE1ldGhvZFBsdWdpbiB1bkNoZWNrZWRQbHVnaW4pIHsKLQkJQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4gcmVtb3ZlZEJhc2VzID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCXJlbW92ZWRCYXNlcy5hZGQodW5DaGVja2VkUGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8TWV0aG9kUGx1Z2luPih1bkNoZWNrZWRQbHVnaW4sIGZhbHNlKSB7Ci0JCQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKW9iamVjdCkuZ2V0QmFzZXMoKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+IGVtcHR5ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCQkJcmV0dXJuIGVtcHR5Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQotCQl9OyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBiYXNlID0gaXRlci5uZXh0KCk7Ci0JCQlBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KHBsdWdpbi5nZXRCYXNlcygpKTsKLQkJCXBsdWdpbnMucmVtb3ZlKHVuQ2hlY2tlZFBsdWdpbik7Ci0JCQlpZighaXNPbmVPckJhc2VPZihiYXNlLCBwbHVnaW5zKSkgewotCQkJCXJlbW92ZWRCYXNlcy5hZGQoYmFzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUFycmF5TGlzdDxNZXRob2RQbHVnaW4+IGFmZmVjdGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCQkKLQkJLy8gZ2V0IGFsbCBwbHVnLWlucyBpbiBsaWJyYXJ5IHRoYXQgZXh0ZW5kIHRoaXMgcGx1Zy1pbgotCQkvLwotCQlMaXN0PD8+IHBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbXAgPSAoTWV0aG9kUGx1Z2luKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihtcCAhPSBwbHVnaW4gJiYgTWlzYy5pc0Jhc2VPZihwbHVnaW4sIG1wKSkgewkJCQkKLQkJCQlhZmZlY3RlZFBsdWdpbnMuYWRkKG1wKTsKLQkJCX0KLQkJfQotCQkKLQkJQXJyYXlMaXN0PFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kPiBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3Q8UmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQ+KCk7Ci0JCWZvciAoTWV0aG9kUGx1Z2luIGJhc2UgOiByZW1vdmVkQmFzZXMpIHsJCQkKLQkJCWlmKFVtYVV0aWwuaGFzUmVmZXJlbmNlKHBsdWdpbiwgYmFzZSkpIHsKLQkJCQljb21tYW5kcy5hZGQobmV3IFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kKHBsdWdpbiwgYmFzZSkpOwotCQkJfQotCQkJZm9yIChNZXRob2RQbHVnaW4gbXAgOiBhZmZlY3RlZFBsdWdpbnMpIHsKLQkJCQlBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPihtcC5nZXRCYXNlcygpKTsKLQkJCQliYXNlcy5yZW1vdmUoYmFzZSk7Ci0JCQkJaWYoIWlzT25lT3JCYXNlT2YoYmFzZSwgYmFzZXMpICYmIFVtYVV0aWwuaGFzUmVmZXJlbmNlKG1wLCBiYXNlKSkgewotCQkJCQljb21tYW5kcy5hZGQobmV3IFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kKG1wLCBiYXNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2UsCi0JCQkJCQkJcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihzaGVsbC5nZXRUZXh0KCksIG1lc3NhZ2UpKSB7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKLQkJCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJLy8gdW5kbyB0aGUgZXhlY3V0ZWQgY29tbWFuZHMKLQkJCQkJZm9yICg7IGkgPiAwOyBpLS0pIHsKLQkJCQkJCWFjdGlvbk1nci51bmRvKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wbHVnaW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnBsdWdpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hSZWZlcmVuY2VkTW9kZWxzKCkgewotCQkvLyBDbGVhciB0aGUgb2xkIGl0ZW1zIGFuZCBhZGQgdGhlIG5ld2x5IGFsbG93YWJsZSBpdGVtcy4KLQkJY3RybF9yZWZNb2RlbC5nZXRUYWJsZSgpLmNsZWFyQWxsKCk7Ci0JCWN0cmxfcmVmTW9kZWwucmVmcmVzaCgpOwotCi0JCUxpc3QgYWxsb3dhYmxlTGlzdCA9IFBsdWdpblJlZmVyZW5jZUNoZWNrZXIKLQkJCQkuZ2V0QXBwbGljYWJsZUJhc2VQbHVnaW5zKHBsdWdpbik7Ci0JCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChhbGxvd2FibGVMaXN0LCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQljdHJsX3JlZk1vZGVsLmFkZChhbGxvd2FibGVMaXN0LnRvQXJyYXkoKSk7Ci0KLQkJTGlzdDxNZXRob2RQbHVnaW4+IGN1cnJlbnRCYXNlTGlzdCA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQlzZXRDaGVja2JveEZvckN1cnJlbnRCYXNlKGN1cnJlbnRCYXNlTGlzdCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ViMDVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJhY3RpY2VEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGluIGEgUHJhY3RpY2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2FkZGl0aW9uYWxfaW5mbywgY3RybF9wcm9ibGVtLAotCQkJY3RybF9iYWNrZ3JvdW5kOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9nb2FscywgY3RybF9hcHBsaWNhdGlvbiwgY3RybF9sZXZlbHNfYWRvcHRpb247Ci0KLQlwcml2YXRlIFByYWN0aWNlIGd1aWRhbmNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlndWlkYW5jZSA9IChQcmFjdGljZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldENvbnRlbnRGaWVsZEhlaWdodCgyMDApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0KLQkJY3RybF9hZGRpdGlvbmFsX2luZm8gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5BRERJVElPTkFMX0lORk9fVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfZ29hbHMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5HT0FMU19URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJY3RybF9hcHBsaWNhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFQUExJQ0FUSU9OX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQljdHJsX3Byb2JsZW0gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5QUk9CTEVNX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQljdHJsX2JhY2tncm91bmQgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5CQUNLR1JPVU5EX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkxFVkVMX09GX0FET1BUSU9OX1RFWFQsIDQwLAotCQkJCTQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOwotCi0JCWxhYmVsX2Jhc2Uuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQkFTRV9FTEVNRU5UX1RFWFQpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWZpbmFsIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGVkaXRvcgotCQkJCS5jcmVhdGVNb2RpZnlMaXN0ZW5lcihndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0KLQkJY3RybF9hZGRpdGlvbmFsX2luZm8KLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkpOwotCQljdHJsX2FkZGl0aW9uYWxfaW5mby5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2FkZGl0aW9uYWxfaW5mby5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYWRkaXRpb25hbF9pbmZvOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QWRkaXRpb25hbEluZm8oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2FwcGxpY2F0aW9uCi0JCQkJLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2FwcGxpY2F0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkpOwotCQljdHJsX2FwcGxpY2F0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYXBwbGljYXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2FwcGxpY2F0aW9uOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QXBwbGljYXRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2dvYWxzLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9nb2Fscy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpKTsKLQkJY3RybF9nb2Fscy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2dvYWxzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9nb2FsczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEdvYWxzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcm9ibGVtLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wcm9ibGVtLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSk7Ci0JCWN0cmxfcHJvYmxlbS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Byb2JsZW0uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3Byb2JsZW07Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UHJvYmxlbSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9iYWNrZ3JvdW5kCi0JCQkJLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2JhY2tncm91bmQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpKTsKLQkJY3RybF9iYWNrZ3JvdW5kLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYmFja2dyb3VuZC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYmFja2dyb3VuZDsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2xldmVsc19hZG9wdGlvbgotCQkJCS5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2xldmVsc19hZG9wdGlvbjsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkLmdldFRleHQoKQotCQkJCQkJOiBjdHJsX2xldmVsc19hZG9wdGlvbi5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9hZGRpdGlvbmFsX2luZm8uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2FwcGxpY2F0aW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9nb2Fscy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcHJvYmxlbS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9iYWNrZ3JvdW5kLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCQlpZiAoZ3VpZGFuY2UgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIGd1aWRhbmNlRGVzY3JpcHRpb24gPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQljdHJsX2FkZGl0aW9uYWxfaW5mbwotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldEFkZGl0aW9uYWxJbmZvKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRBZGRpdGlvbmFsSW5mbygpKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9wcm9ibGVtCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0UHJvYmxlbSgpID09IG51bGwgPyAiIiA6IGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0UHJvYmxlbSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9iYWNrZ3JvdW5kCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QmFja2dyb3VuZCgpID09IG51bGwgPyAiIiA6IGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QmFja2dyb3VuZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9hcHBsaWNhdGlvbgotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldEFwcGxpY2F0aW9uKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRBcHBsaWNhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9nb2FscwotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldEdvYWxzKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRHb2FscygpKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9sZXZlbHNfYWRvcHRpb24KLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRMZXZlbHNPZkFkb3B0aW9uKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRMZXZlbHNPZkFkb3B0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBndWlkYW5jZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlUmVmZXJlbmNlc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJhY3RpY2VSZWZlcmVuY2VzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWUyNjFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJhY3RpY2VSZWZlcmVuY2VzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUmVmZXJlbmNlcyBwYWdlIGluIHRoZSBQcmFjdGljZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlUmVmZXJlbmNlc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicHJhY3RpY2VSZWZlcmVuY2VzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUHJhY3RpY2UgcHJhY3RpY2U7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQkKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWN0aXZpdHlPcmRlckxpc3Q7Ci0JcHJpdmF0ZSBCdXR0b24gbWFudWFsU29ydENoZWNrQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHR5cGVTb3J0QnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VSZWZlcmVuY2VzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlwcmFjdGljZSA9IChQcmFjdGljZSkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQltYW51YWxTb3J0Q2hlY2tCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjYXRlZ29yeTFwYW5lMiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zb3J0T3JkZXJCdXR0b25fdGV4dCwgU1dULkNIRUNLKTsKLQkJbWFudWFsU29ydENoZWNrQnV0dG9uLm1vdmVBYm92ZShjdHJsX3VwMSk7Ci0JCW1hbnVhbFNvcnRDaGVja0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYm9vbGVhbiBpc01hbnVhbCA9IENhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCk7Ci0JCW1hbnVhbFNvcnRDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24oaXNNYW51YWwpOwotCQltYW51YWxTb3J0Q2hlY2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIGlzTWFudWFsID0gbWFudWFsU29ydENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCVN0cmluZyB2YWx1ZSA9IENhdGVnb3J5U29ydEhlbHBlci5WX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMOwotCQkJCWlmICghaXNNYW51YWwpIHsKLQkJCQkJdmFsdWUgPSBDYXRlZ29yeVNvcnRIZWxwZXIuVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFOwotCQkJCX0KLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShuZXcgTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZChwcmFjdGljZSwKLQkJCQkJCUNhdGVnb3J5U29ydEhlbHBlci5LRVlfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRSwgdmFsdWUpKTsKLQkJCQllbmFibGVVcERvd25CdXR0b25zMSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXR5cGVTb3J0QnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY2F0ZWdvcnkxcGFuZTIsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc29ydFR5cGVCdXR0b25fdGV4dCwgU1dULlBVU0gpOwotCQl0eXBlU29ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdHlwZVNvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBzb3J0IGVsZW1lbnRzCi0JCQkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQlsaXN0LmFkZEFsbChwcmFjdGljZS5nZXRDb250ZW50UmVmZXJlbmNlcygpKTsKLQkJCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcigpOwotCQkJCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChsaXN0LCBjb21wYXJhdG9yKTsKLQotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgcHJhY3RpY2UsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgcHJhY3RpY2UuZ2V0Q29udGVudFJlZmVyZW5jZXMoKSwgLTEpOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBwcmFjdGljZSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCBsaXN0LCAtMSk7Ci0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVVwRG93bkJ1dHRvbnMxKCkgewotCQlzdXBlci5lbmFibGVVcERvd25CdXR0b25zMSgpOwotCQlpZiAodHlwZVNvcnRCdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKGlzU2hvdWxkRW5hYmxlQWxwaGFTb3J0KCkpIHsKLQkJCQl0eXBlU29ydEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQl0eXBlU29ydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvdWxkRW5hYmxlQWxwaGFTb3J0KCkgewotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKCFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJiAKLQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50T3JkZXJMaXN0ID09IG51bGwpIHsKLQkJCQkJY29udGVudEVsZW1lbnRPcmRlckxpc3QgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRDb250ZW50RWxlbWVudE9yZGVyRmVhdHVyZSgpKTsKLQkJCQl9Ci0JCQkJaWYgKGFjdGl2aXR5T3JkZXJMaXN0ID09IG51bGwpIHsKLQkJCQkJYWN0aXZpdHlPcmRlckxpc3QgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRBY3Rpdml0eU9yZGVyRmVhdHVyZSgpKTsKLQkJCQl9Ci0JCQkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQlsaXN0LmFkZEFsbChjb250ZW50RWxlbWVudE9yZGVyTGlzdCk7Ci0JCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHlPcmRlckxpc3QpOwotCQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBwcmFjdGljZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBwcmFjdGljZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBwcmFjdGljZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBwcmFjdGljZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0T3JkZXJGZWF0dXJlKCkgewotCQlMaXN0PENvbnRlbnRFbGVtZW50PiBjZUxpc3QgPSBnZXRTZWxlY3RlZENvbnRlbnRFbGVtZW50cygpOwotCQlMaXN0PEFjdGl2aXR5PiBhTGlzdCA9IGdldFNlbGVjdGVkQWN0aXZpdGllcygpOwotCQlpZiAoY2VMaXN0LnNpemUoKSA+IDAgJiYgYUxpc3Quc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBnZXRDb250ZW50RWxlbWVudE9yZGVyRmVhdHVyZSgpOwotCQl9IGVsc2UgaWYgKGFMaXN0LnNpemUoKSA+IDAgJiYgY2VMaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlPcmRlckZlYXR1cmUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q29udGVudEVsZW1lbnRPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEFjdGl2aXR5T3JkZXJGZWF0dXJlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJTGlzdDxDb250ZW50RWxlbWVudD4gY2VMaXN0ID0gZ2V0U2VsZWN0ZWRDb250ZW50RWxlbWVudHMoKTsKLQkJTGlzdDxBY3Rpdml0eT4gYUxpc3QgPSBnZXRTZWxlY3RlZEFjdGl2aXRpZXMoKTsKLQkJaWYgKGNlTGlzdC5zaXplKCkgPiAwICYmIGFMaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gY29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci0JCX0gZWxzZSBpZiAoYUxpc3Quc2l6ZSgpID4gMCAmJiBjZUxpc3Quc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBhY3Rpdml0eU9yZGVyTGlzdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRTZWxlY3RlZENvbnRlbnRFbGVtZW50cygpIHsKLQkJTGlzdDxDb250ZW50RWxlbWVudD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50RWxlbWVudD4oKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlyZXN1bHQuYWRkKChDb250ZW50RWxlbWVudClvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxBY3Rpdml0eT4gZ2V0U2VsZWN0ZWRBY3Rpdml0aWVzKCkgewotCQlMaXN0PEFjdGl2aXR5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJlc3VsdC5hZGQoKEFjdGl2aXR5KW8pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBwcmFjdGljZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBBbGxGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSByZXR1cm4gZmFsc2U7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzc4ZWEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogQnJlYWRvd24gc3RydWN0dXJlIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRlbmRzIFByb2Nlc3NGb3JtUGFnZQotCQlpbXBsZW1lbnRzIElWaWV3ZXJQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWFRfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhUX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEVDbGFzcz4gRUNMQVNTRVM7Ci0JCi0JcHJpdmF0ZSBpbnQgdGFiSW5kZXggPSAwOwotCQotCXN0YXRpYyB7Ci0JCUVDTEFTU0VTID0gbmV3IEFycmF5TGlzdDxFQ2xhc3M+KCk7Ci0JCUVDTEFTU0VTLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcwotCQkJVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb2xvclByb3ZpZGVyIHsKLQotCQlwcml2YXRlIERlY29yYXRpbmdMYWJlbFByb3ZpZGVyIGRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyID0gbmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKAotCQkJCQluZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSwKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewkJCQotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBkZWNvcmF0aW5nTGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChpc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMOwotCQkJfQotCQkJZWxzZSBpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJCXJldHVybiBDb2xvcnMuSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUw7Ci0JCQl9CQkJCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBnZXRTdXBwcmVzc2lvbigpCi0JCQkJCQkuaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXByaXZhdGUgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWRpdG9yKSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UudGhpcwotCQkJCQkuZ2V0RWRpdG9yKCkpLmdldFN1cHByZXNzaW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRCYWNrZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQkJLy8gbGV0IE9TIHRha2UgY29udHJvbCBvdmVyIHRyZWUgd2lkZ2V0IGJhY2tncm91bmQKLQkJCS8vIHJhdGhlciB0aGFuIHNlbmRpbmcgb25lIGZpeGVkIGJhY2tncm91bmQuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC51dGlsLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIjaXNFeHRlcm5hbChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGVsZW1lbnQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2dldEZvbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBGb250IGdldEZvbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChpc0V4dGVybmFsKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVndWxhckZvbnQ7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgZXh0ZW5kcyBUZXh0Q2VsbEVkaXRvciB7Ci0JCXByb3RlY3RlZCBPYmplY3QgbGFzdEludmFsaWRFbGVtZW50OwotCi0JCXByaXZhdGUgaW50IGNvbHVtbkluZGV4OwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcGFyZW50Ci0JCSAqLwotCQlwdWJsaWMgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleChpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXRoaXMuY29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoKSB7Ci0JCQlyZXR1cm4gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldExhc3RJbnZhbGlkRWxlbWVudCgpIHsKLQkJCXJldHVybiBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0JCX0KLQotCQlTdHJpbmcgaXNWYWxpZChTdHJpbmcgdHh0KSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG1zZyA9IGlzVmFsaWQoZSwgdHh0KTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYXN0SW52YWxpZEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gbXNnOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDZWxsRWRpdG9yVmFsaWRhdG9yIGltcGxlbWVudHMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgewotCi0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIENlbGxFZGl0b3JWYWxpZGF0b3IoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkJCXRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiBjZWxsRWRpdG9yLmlzVmFsaWQoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQotCQlwdWJsaWMgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoY2VsbEVkaXRvci5nZXRMYXN0SW52YWxpZEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQljZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpKTsKLQkJCQkJCXZpZXdlci5lZGl0RWxlbWVudChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpLAotCQkJCQkJCQljZWxsRWRpdG9yLmdldENvbHVtbkluZGV4KCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgY2xhc3MgVmFsaWRhdGluZ0ZvY3VzQWRhcHRlciBleHRlbmRzIEZvY3VzQWRhcHRlciB7Ci0JLy8gcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQkvLwotCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkvLyB0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCS8vIH0KLQkvLwotCS8vIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkvLyBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCS8vCi0JLy8gcHVibGljIHZvaWQgcnVuKCkgewotCS8vIGlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkvLyBBdXRob3JpbmdVSVBsdWdpbgotCS8vIC5nZXREZWZhdWx0KCkKLQkvLyAuZ2V0TXNnRGlhbG9nKCkKLQkvLyAuZGlzcGxheUVycm9yKAotCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JLy8gLmdldFN0cmluZygiQXV0aG9yaW5nVUkuZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2cudGl0bGUiKSwKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JLy8gdmlld2VyLmVkaXRFbGVtZW50KGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCksCi0JLy8gY2VsbEVkaXRvci5nZXRDb2x1bW5JbmRleCgpKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gfSk7Ci0JLy8gfQotCS8vIH0KLQotCS8vIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIHZhbGlkTmFtZVByb21wdGVkID0gZmFsc2U7Ci0JLy8gcHJpdmF0ZSBpbnQgcHJvbXB0Q291bnQgPSAwOwotCi0JLy8gcHJpdmF0ZSBNZXRob2RFbGVtZW50IHByb21wdGVkRWxlbWVudDsKLQotCS8vIHByaXZhdGUgVGFibGVUcmVlVmlld2VyIHRhYmxlVHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8vIHByaXZhdGUgaW50IHRhYkluZGV4OwotCi0JLy8gcHJpdmF0ZSBPYmplY3QgdGFiRm9sZGVyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NWaWV3ZXIgdmlld2VyOwotCi0JcHJvdGVjdGVkIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBuYW1lQ2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgcHJlZExpc3RDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0JveENlbGxFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgQ2hlY2tib3hDZWxsRWRpdG9yIGNoZWNrQm94Q2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3I7Ci0KLQkvLyBwcml2YXRlIEhhc2hNYXAgY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHRpdGxlCi0JICovCi0JcHVibGljIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLAotCQkJU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgcmV0dXJucyB0cnVlLCBlZGl0aW5nIGlzIGRpc2FibGVkIG9yIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzIAotCSAqIGJyZWFrZG93biBzdHJ1Y3R1cmUuCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJaWYgKGlzUmVhZE9ubHkpIHsKLQkJCXJldHVybiBpc1JlYWRPbmx5OwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmlzTG9ja2VkKHByb2Nlc3MpOwotCX0KLQkKLQkvKioKLQkgKiBJZiByZXR1cm5zIHRydWUsIGVkaXRpbmcgaXMgZGlzYWJsZWQgb3Igbm90IGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3MgCi0JICogYnJlYWtkb3duIHN0cnVjdHVyZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBiYXNpY0lzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBpc1JlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMvZGlzYWJsZSBtb2RpZnlpbmcgcHJvY2VzcyBicmVha2Rvd24gc3RydWN0dXJlCi0JICogCi0JICogQHBhcmFtIGlzUmVhZE9ubHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIGlzUmVhZE9ubHkpIHsKLQkJdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFkYXB0ZXIgZmFjdG9yeSB0byBjcmVhdGUgaXRlbSBwcm92aWRlciBmb3IgZWFjaCBlbGVtZW50IGluIAotCSAqIHRoZSBicmVha2Rvd24gc3RydWN0dXJlCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjb2x1bW4gZGVzY3JpcHRvcnMgdG8gZGVmaW5lIHRoZSBjb2x1bW5zIG9mIHRoZSB0cmVlLgotCSAqIAotCSAqIEBwYXJhbSBjb2x1bW5EZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlc2NyaXB0b3JzKENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycykgewotCQl0aGlzLmNvbHVtbkRlc2NyaXB0b3JzID0gY29sdW1uRGVzY3JpcHRvcnM7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQlNYXA8SW50ZWdlciwgU3RyaW5nPiBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQljb2x1bW5JbmRleFRvTmFtZU1hcC5wdXQobmV3IEludGVnZXIoaSksCi0JCQkJCQljb2x1bW5EZXNjcmlwdG9yc1tpXS5pZCk7Ci0JCQl9Ci0JCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dChCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCUxpc3Q8V29ya09yZGVyPiBhZGRMaXN0ID0gbmV3IEFycmF5TGlzdDxXb3JrT3JkZXI+KCk7Ci0JCQlMaXN0PFdvcmtPcmRlcj4gcHJlZFRvQmVEZWxldGVkID0gbmV3IEFycmF5TGlzdDxXb3JrT3JkZXI+KCk7Ci0JCQlpZihQcmVkZWNlc3Nvckxpc3QucHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycyhhZGFwdGVyRmFjdG9yeSwgd2JlLCB0eHQsIGFkZExpc3QsIHByZWRUb0JlRGVsZXRlZCkpIHsKLQkJCQlpZighcHJlZFRvQmVEZWxldGVkLmlzRW1wdHkoKSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCQkJd2JlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJcHJlZFRvQmVEZWxldGVkLCAtMSk7Ci0JCQkJfQotCQkJCWlmKCFhZGRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQkJCXdiZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJYWRkTGlzdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlQcm9jZXNzVXRpbC5zZXRBdHRyaWJ1dGUoYWN0aW9uTWdyLCBlLCBwcm9wLCB0eHQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dChCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wKSB7Ci0JCS8vIGhhbmRsZSBlZGl0aW5nIHByZXNlbnRhdGlvbiBuYW1lIG9mIGV4dGVuZGluZy9jb250cmlidXRpbmcgYWN0aXZpdHkKLQkJLy8gc3BlY2lhbGx5Ci0JCS8vCi0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUKLQkJCQkmJiBQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJcmV0dXJuICgoRGVzY3JpYmFibGVFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGUsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGUsIHByb3ApOwotCX0KLQotCS8qKgotCSAqIFNldCB0YWIgaW5kZXggZm9yIHRoZSBmb3JtIHBhZ2UKLQkgKiBAcGFyYW0gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJJbmRleChpbnQgaWQpIHsKLQkJIHRhYkluZGV4ID0gaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0YWIgaW5kZXggZm9yIHRoZSBmb3JtIHBhZ2UKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhYkluZGV4KCkgewotCQlyZXR1cm4gdGFiSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRhYiBmb2xkZXIKLQkgKiBAcGFyYW0gdGFiRm9sZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFiRm9sZGVyKENUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCS8vIHRoaXMudGFiRm9sZGVyID0gdGFiRm9sZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJLy8gY3JlYXRlIGZvcm0gdG9vbGtpdAotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KGdldEVkaXRvcigpLmdldFBhcnROYW1lKCkpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkVYUEFOREVEIHwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIsCi0JCQkJVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlzZWN0aW9uCi0JCQkJLnNldFRleHQoZ2V0VGl0bGUoKQotCQkJCQkJKyAiICIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3IpOyAvLyROT04tTkxTLTEkIAotCQlzZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCS8vIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQlDb250cm9sIGNvbnRyb2wgPSBjcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRvb2xraXQuYWRhcHQoY29udHJvbCwgdHJ1ZSwgdHJ1ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSA2MDA7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCS8vIGVkaXRvci5jcmVhdGVDb250ZXh0TWVudUZvcih0YWJsZVRyZWVWaWV3ZXIpOwotCQllZGl0b3IuY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQotCQlzZXRJbnB1dChwcm9jZXNzKTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBjb250cm9sCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKiAJCQlDb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIHRoaXMucGFyZW50ID0gcGFyZW50OwotCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdGFibGUgdHJlZSB2aWV3ZXIuCi0JCS8vCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCXZpZXdlciA9IG5ldyBQcm9jZXNzVmlld2VyKGNvbXAsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQl2aWV3ZXIuc2V0dXBDb2x1bW5zKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0KLQotCQl2aWV3ZXIuc2V0QWN0aW9uTWFuYWdlcigoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJLmdldEFjdGlvbk1hbmFnZXIoKSk7Ci0KLQkJdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3Iodmlld2VyLmdldENlbGxFZGl0b3JQYXJlbnQoKSk7Ci0JCWNvbWJvQm94Q2VsbEVkaXRvciA9IG5ldyBDb21ib0JveENlbGxFZGl0b3Iodmlld2VyCi0JCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSwgbmV3IFN0cmluZ1tdIHsgVFhUX1RSVUUsIFRYVF9GQUxTRSB9KTsKLQkJY2hlY2tCb3hDZWxsRWRpdG9yID0gbmV3IENoZWNrYm94Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKTsKLQotCQkvL3NldCBhbGwgZWRpdG9ycyBhbmQgbW9kaWZpZXJzCi0JCXNldEFsbEVkaXRvcnNBbmRNb2RpZmllcnMoKTsKLQkJCi0JCXZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoMyk7Ci0JCXZpZXdlci5zZXRJbnB1dChwcm9jZXNzKTsKLQotLy8JCSBpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIDsKLS8vCQkgVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IFROR09ialRyYW5zZmVyLmdldEluc3RhbmNlKCkKLS8vCQkgfTsKLS8vCQkgdGFibGVUcmVlVmlld2VyLmFkZERyb3BTdXBwb3J0KERORC5EUk9QX01PVkUsIHRyYW5zZmVycywgbmV3Ci0vLwkJIEJTVGFiRHJvcEFkYXB0ZXIodGFibGVUcmVlVmlld2VyKSk7Ci0KLQkJLy8gQlNFZGl0b3JWaWV3LmdldFZpZXcoKS5jcmVhdGVDb250ZXh0TWVudUZvcih0YWJsZVRyZWVWaWV3ZXIpOwotCQkvLyByZXR1cm4gdGFibGVUcmVlVmlld2VyLmdldENvbnRyb2woKTsKLQotCQlzZXRDb250ZXh0SGVscCh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQotCQlyZXR1cm4gY29tcDsKLQotCX0KLQotCQotCS8qKgotCSAqIFNldCBhbGwgZWRpdG9ycyBhbmQgbW9kaWZpZXJzIGZvciB0aGUgdmlld2VyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFsbEVkaXRvcnNBbmRNb2RpZmllcnMoKQotCXsKLQkJc2V0Q2VsbEVkaXRvcnMoKTsKLQkJc2V0Q2hlY2tCb3hDZWxsRWRpdG9ycygpOwotCi0JCS8vIFNldCB0aGUgY2VsbCBtb2RpZmllcgotCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNjYW5Nb2RpZnkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNhbk1vZGlmeTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KTsKLQotCQkJCWlmIChpc1JlYWRPbmx5KCkgfHwKLQkJCQkJCShlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkuaXNSZWFkT25seSgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0vLwkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLS8vCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgISgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0vLwkJCQkJCQkJLmlzUmVhZE9ubHkoKSkpIHsKLS8vCQkJCQlDb2xsZWN0aW9uIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJCXR5cGVzLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLS8vCQkJCQlpZiAoVG5nVXRpbAotLy8JCQkJCQkJLmlzR2VuZXJhbGl6ZXIoCi0vLwkJCQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0vLwkJCQkJCQkJCQkJLmdldE93bmVyKCksIHR5cGVzKSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotCQkJCQotCQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lECi0JCQkJCQl8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUKLQkJCQkJCXx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTwotCQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCQkmJiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSB8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KQotCQkJCQkJJiYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjZ2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRWYWx1ZTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KTsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJU3RyaW5nIHZhbCA9IGdldFRleHQoZSwgcHJvcGVydHkpOwotCQkJCXN3aXRjaCAoZ2V0Q2VsbEVkaXRvclR5cGUocHJvcGVydHkpKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJaWYgKFRYVF9UUlVFLmVxdWFsc0lnbm9yZUNhc2UodmFsKSkgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDEpOwotCQkJCQl9Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQkJCQkJcmV0dXJuIHZhbDsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOOgotCQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbCk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHZhbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjbW9kaWZ5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShmaW5hbCBPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LAotCQkJCQlPYmplY3QgdmFsdWUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGlmeTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KyIsIHZhbHVlPSIrdmFsdWUpOwotCQkJCVdpZGdldCBpdGVtID0gKFdpZGdldCkgZWxlbWVudDsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKGl0ZW0KLQkJCQkJCS5nZXREYXRhKCkpOwotCi0JCQkJZmluYWwgaW50IGNvbHVtbkluZGV4ID0gZ2V0Q29sdW1uSW5kZXgocHJvcGVydHkpOwotCQkJCUNlbGxFZGl0b3IgY2VsbEVkaXRvciA9IHZpZXdlci5nZXRDZWxsRWRpdG9ycygpW2NvbHVtbkluZGV4XTsKLQkJCQlTdHJpbmcgZXJyTXNnID0gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlpZiAoZXJyTXNnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVN0cmluZyB0eHQ7Ci0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQl0eHQgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJaW50IGluZGV4ID0gKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCQkJdHh0ID0gVFhUX1RSVUU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0eHQgPSBUWFRfRkFMU0U7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTjoKLQkJCQkJdHh0ID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdHh0ID0gVG5nVXRpbC5jaGVja051bGwodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCXNldFRleHQoYmUsIHByb3BlcnR5LCB0eHQpOwotCQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FCi0JCQkJCQkmJiBTdHJVdGlsLmlzQmxhbmsoYmUuZ2V0TmFtZSgpKSkgewotCQkJCQliZS5zZXROYW1lKHR4dCk7Ci0JCQkJfQotCQkJCQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQkvKioKLQkgKiBHZXQgY2VsbCBlZGl0b3IgZm9yIHRoZSBnaXZlbiBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uSUQKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcmV0dXJuCi0JICogCQkJQ2VsbCBFZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKFN0cmluZyBjb2x1bW5JRCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JRCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlpZiAocHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yID0gbmV3IFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcigKLQkJCQkJCXZpZXdlci5nZXRDZWxsRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQllID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9ICgoUHJvY2Vzc0VkaXRvcilnZXRFZGl0b3IoKSkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJCWJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCA9IHRydWU7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJCQkJYWRhcHRlckZhY3RvcnksIChCcmVha2Rvd25FbGVtZW50KSBlLAotCQkJCQkJCQkJCXR4dCwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yCi0JCQkJCQkuc2V0VmFsaWRhdG9yKG5ldyBDZWxsRWRpdG9yVmFsaWRhdG9yKAotCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcikpOwotCQkJCS8vIHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRGb2N1c0xpc3RlbmVyKG5ldwotCQkJCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIocHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IpKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoCi0JCQkJCQlTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKAotCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcikpOwotCQkJfQotCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3I7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSUQgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlpZiAobmFtZUNlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCW5hbWVDZWxsRWRpdG9yID0gbmV3IFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQllID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9ICgoUHJvY2Vzc0VkaXRvcilnZXRFZGl0b3IoKSkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJCXJldHVybiBUbmdVdGlsCi0JCQkJCQkJCS5jaGVja0FjdGl2aXR5TmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCW5hbWVDZWxsRWRpdG9yLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcigKLQkJCQkJCW5hbWVDZWxsRWRpdG9yKSk7Ci0JCQkJLy8gbmFtZUNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZEZvY3VzTGlzdGVuZXIobmV3Ci0JCQkJLy8gVmFsaWRhdGluZ0ZvY3VzQWRhcHRlcihuYW1lQ2VsbEVkaXRvcikpOwotCQkJCW5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKG5hbWVDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQluYW1lQ2VsbEVkaXRvci5zZXRDb2x1bW5JbmRleChjb2x1bW5JbmRleCk7Ci0KLQkJCXJldHVybiBuYW1lQ2VsbEVkaXRvcjsKLQkJfSBlbHNlIGlmIChjb2x1bW5JRCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQkJaWYgKHByZWRMaXN0Q2VsbEVkaXRvciA9PSBudWxsKSB7Ci0JCQkJcHJlZExpc3RDZWxsRWRpdG9yID0gbmV3IFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQllID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3QoCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgZSwgdHh0LCBhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQkJcHJvY2VzcywgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXByZWRMaXN0Q2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IENlbGxFZGl0b3JWYWxpZGF0b3IoCi0JCQkJCQlwcmVkTGlzdENlbGxFZGl0b3IpKTsKLQkJCQkvLyBwcmVkTGlzdENlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZEZvY3VzTGlzdGVuZXIobmV3Ci0JCQkJLy8gVmFsaWRhdGluZ0ZvY3VzQWRhcHRlcihwcmVkTGlzdENlbGxFZGl0b3IpKTsKLQkJCQlwcmVkTGlzdENlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIocHJlZExpc3RDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQlwcmVkTGlzdENlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gcHJlZExpc3RDZWxsRWRpdG9yOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCBjZWxsIGVkaXRvcnMgZm9yIGFsbCBjb2x1bW5zIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENlbGxFZGl0b3JzKCkgewotCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBnZXRDZWxsRWRpdG9yKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkLCBpKTsKLQkJCWlmIChjZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCQljZWxsRWRpdG9yc1tpXSA9IGNlbGxFZGl0b3I7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaCAoY29sdW1uRGVzY3JpcHRvcnNbaV0uY2VsbEVkaXRvclR5cGUpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IGNvbWJvQm94Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSB0ZXh0Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTjoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBjaGVja0JveENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQl9Ci0JCi0JCi0JCi0KLQkvKioKLQkgKiBTZXQgaW5wdXQgZm9yIHZpZXdlcgotCSAqIEBwYXJhbSBuZXdJbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlwcm9jZXNzID0gKFByb2Nlc3MpIG5ld0lucHV0OwotCQkJaWYgKHByb2Nlc3MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXZpZXdlci5zZXRJbnB1dChwcm9jZXNzLmVDb250YWluZXIoKSk7Ci0JCQkJLy8gdmlld2VyLmV4cGFuZEFsbCgpOwotLy8JCQkJdmlld2VyLnJldmVhbChwcm9jZXNzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdmlld2VyLnNldElucHV0KG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0Q29sdW1uSW5kZXgoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCU9iamVjdFtdIGNvbFByb3BzID0gdmlld2VyLmdldENvbHVtblByb3BlcnRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xQcm9wcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbFByb3BzW2ldID09IHByb3BlcnR5KQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldENlbGxFZGl0b3JUeXBlKFN0cmluZyBwcm9wZXJ0eSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb2x1bW5EZXNjcmlwdG9yIGRlc2MgPSBjb2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCWlmIChkZXNjLmlkID09IHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIGRlc2MuY2VsbEVkaXRvclR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgcHJvY2VzcyBhcyBpbnB1dAotCSAqIEBwYXJhbSBwcm9jCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2VzcyhQcm9jZXNzIHByb2MpIHsKLQkJaWYgKHByb2Nlc3MgIT0gcHJvYykgewotCQkJc2V0SW5wdXQocHJvYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgY29sdW1ucyB3aXRoIG5ldyBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gbmV3Q29sdW1uRGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb2x1bW5zKENvbHVtbkRlc2NyaXB0b3JbXSBuZXdDb2x1bW5EZXNjcmlwdG9ycykgewotCQlzZXRDb2x1bW5EZXNjcmlwdG9ycyhuZXdDb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXZpZXdlci5zZXR1cENvbHVtbnMobmV3Q29sdW1uRGVzY3JpcHRvcnMpOwkKLQkJc2V0QWxsRWRpdG9yc0FuZE1vZGlmaWVycygpOwotCQl2aWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGlmKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgewotCQkvLyAoKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJLy8gfQotCi0JCWlmICh2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmICh2aWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpICE9IG51bGwpIHsKLQkJCXZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbnRleHRIZWxwKENvbnRyb2wgY29udHJvbCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJQWRhcHRlckZhY3RvcnkgYWxsRmFjID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJQWRhcHRlckZhY3Rvcnkgd2JzRmFjID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJQWRhcHRlckZhY3Rvcnkgb2JzRmFjID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJQWRhcHRlckZhY3RvcnkgcGJzRmFjID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogY3VycmVudCBkYWRwdGVyIGZhYyA9ICIgKyBhZGFwdGVyRmFjKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IGFsbCBkYWRwdGVyIGZhYyA9ICIgKyBhbGxGYWMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogd2JzIGRhZHB0ZXIgZmFjID0gIiArIHdic0ZhYyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBvYnMgZGFkcHRlciBmYWMgPSAiICsgb2JzRmFjKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IHBicyBkYWRwdGVyIGZhYyA9ICIgKyBwYnNGYWMpOwotCi0JCWlmIChhZGFwdGVyRmFjID09IHdic0ZhYykKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udHJvbCwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfUFJPQ0VTU19XQlNfQ09OVEVYVCk7Ci0JCWVsc2UgaWYgKGFkYXB0ZXJGYWMgPT0gb2JzRmFjKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250cm9sLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9QUk9DRVNTX09CU19DT05URVhUKTsKLQkJZWxzZSBpZiAoYWRhcHRlckZhYyA9PSBwYnNGYWMpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnRyb2wsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1BST0NFU1NfUEJTX0NPTlRFWFQpOwotCQllbHNlIGlmIChhZGFwdGVyRmFjID09IGFsbEZhYykKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udHJvbCwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfUFJPQ0VTU19BTExCU19DT05URVhUKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhZGRpdGlvbmFsIGFjdGlvbnMgdG8gY29udHJpYnV0ZSB0byB0aGUgY29udGV4dCBtZW51LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlBY3Rpb25zCi0JICovCi0JcHVibGljIElBY3Rpb25bXSBnZXRBZGRpdGlvbmFsQWN0aW9ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFNldCBjaGVjayBib3ggY2VsbCBlZGl0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tCb3hDZWxsRWRpdG9ycygpIHsKLQkJQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzd2l0Y2ggKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmNlbGxFZGl0b3JUeXBlKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTjoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBuZXcgUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBudWxsOwotCQkJfQotCQl9Ci0JCSgoUHJvY2Vzc1ZpZXdlcikgdmlld2VyKS5zZXRDaGVja0JveENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTJiNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBwcm9jZXNzIGRlc2NyaXB0aW9uLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPOiBSZW5hbWUgdGhpcyBjbGFzcyB0byBQcm9jZXNzRGVzY3JpcHRpb25QYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJwcm9jZXNzRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UID0gMjsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JfTsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9zY29wZSwgY3RybF91c2FnZV9ub3RlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWx0ZXJuYXRpdmVzLCBjdHJsX2hvd190b19zdGFmZiwKLQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb247Ci0KLQlwcml2YXRlIFNlY3Rpb24gY29uZmlnU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29uZmlnQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlnU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0X2NvbmZpZ3VyYXRpb25zOwotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIGNvbmZpZ0xpc3RWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1dHRvbkFkZDsKLQotCXByb3RlY3RlZCBCdXR0b24gYnV0dG9uUmVtb3ZlOwotCi0JLy8gcHJpdmF0ZSBCdXR0b24gYnV0dG9uRWRpdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1dHRvbk1ha2VEZWZhdWx0OwotCi0JcHJpdmF0ZSBUZXh0IHRleHRDb25maWdEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBjb25maWdMaXN0QWRhcHRlcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLS8vCXByaXZhdGUgQWRhcHRlciBwcm9jZXNzTGlzdGVuZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzVHlwZTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3I7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG5hbWVNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbihGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsgCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlwcm9jZXNzVHlwZSA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIocHJvY2Vzcyk7Ci0JCXZlcnNpb25TZWN0aW9uT24gPSBmYWxzZTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uT24gPSBmYWxzZTsKLQkJZXh0ZXJuYWxJZE9uID0gdHJ1ZTsKLQkJcHVycG9zZU9uID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0b3IgdGFiIGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3JlYXRlQ29uZmlndXJhdGlvblNlY3Rpb24odG9vbGtpdCk7Ci0JCS8vIFNldCBmb2N1cyBvbiB0aGUgTmFtZSB0ZXh0IGNvbnRyb2wuCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBnZW5lcmFsIHNlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIGNyZWF0ZSBHZW5lcmFsIEluZm9ybWF0aW9uIHNlY3Rpb24KLQkJZ2VuZXJhbFNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsIAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9OQU1FLCAKLQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgcHJvY2Vzc1R5cGUgfSkpOwotCQlnZW5lcmFsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxTZWN0aW9uKTsKLQotCQkvLyBuYW1lCi0JCWN0cmxfbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0KLQkJLy8gUHJlc2VudGF0aW9uIG5hbWUKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBSRVNFTlRBVElPTl9OQU1FX1RFWFQpOwotCi0JCS8vIGJyaWVmIGRlc2MKLQkJY3RybF9icmllZl9kZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwyKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCi0JCS8vIEV4dGVybmFsIElkCi0JCWN0cmxfZXh0ZXJuYWxfaWQgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfRXh0ZXJuYWxJRCk7IAotCi0JCS8vIFB1cnBvc2UKLQkJY3RybF9wdXJwb3NlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1B1cnBvc2UsIDQwLCA0MDAsIEdFTkVSQUxfU0VDVElPTl9JRCk7IAotCQkKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGRldGFpbCBzZWN0aW9uCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXRhaWxTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJLy8gY3JlYXRlIGRldGFpbCBzZWN0aW9uCi0JCWRldGFpbFNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsIAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVRBSUxfU0VDVElPTl9OQU1FLCAKLQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVRBSUxfU0VDVElPTl9ERVNDLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgcHJvY2Vzc1R5cGUgfSkpOwotCQlkZXRhaWxDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZGV0YWlsU2VjdGlvbik7Ci0KLQkJLy8gZnVsbCBkZXNjcmlwdGlvbgotCQljdHJsX2Z1bGxfZGVzYyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0Lk1BSU5fREVTQ1JJUFRJT05fVEVYVCwgMTAwLAotCQkJCTQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOwotCi0JCS8vIHNjb3BlCi0JCWN0cmxfc2NvcGUgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfU2NvcGUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gdXNhZ2Ugbm90ZXMKLQkJY3RybF91c2FnZV9ub3RlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1VzYWdlTm90ZXMsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gYWx0ZXJuYXRpdmVzCi0JCWN0cmxfYWx0ZXJuYXRpdmVzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfQWx0ZXJuYXRpdmVzLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGhvdyB0byBzdGFmZgotCQljdHJsX2hvd190b19zdGFmZiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0hvd1RvU3RhZmYsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8ga2V5IGNvbnNpZGVyYXRpb24KLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb24sIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZGV0YWlsQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29uZmlndXJhdGlvbiBzZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29uZmlndXJhdGlvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQkvLyBjcmVhdGUgQ29uZmlndXJhdGlvbiBzZWN0aW9uCi0JCWNvbmZpZ1NlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsIAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlKTsKLQkJY29uZmlnQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGNvbmZpZ1NlY3Rpb24pOwotCQkoKEdyaWRMYXlvdXQpIGNvbmZpZ0NvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0KLQkJTGFiZWwgbF9lbGVtZW50ID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbCgKLQkJCQkJCWNvbmZpZ0NvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucyk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRU5ELCB0cnVlLAotCQkJCQl0cnVlLCAyLCAxKTsKLQkJCWxfZWxlbWVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWxpc3RfY29uZmlndXJhdGlvbnMgPSBVSUhlbHBlci5jcmVhdGVMaXN0KHRvb2xraXQsIGNvbmZpZ0NvbXBvc2l0ZSwKLQkJCQlTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDgwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotCQkJbGlzdF9jb25maWd1cmF0aW9ucy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb25maWdMaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIobGlzdF9jb25maWd1cmF0aW9ucyk7Ci0JCWNvbmZpZ0xpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCWNvbmZpZ0xpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpIHsKLQkJCQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCQkiaWNvbnMvY2hlY2tlZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHR4dCA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCQlpZiAoZWxlbWVudCA9PSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpIHsKLQkJCQkJdHh0ID0gdHh0Ci0JCQkJCQkJKyAiICIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQkJcmV0dXJuIHR4dDsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvblBhbmVsID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29uZmlnQ29tcG9zaXRlKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsCi0JCQkJCWZhbHNlKTsKLQkJCS8vIGdyaWREYXRhLndpZHRoSGludCA9IDgwOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDQ7Ci0JCQlidXR0b25QYW5lbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCWJ1dHRvblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQl9Ci0JCS8vIEFkZCBidXR0b24KLQkJQnV0dG9uIGJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvblBhbmVsLCBBdXRob3JpbmdVSVJlc291cmNlcy5hZGRCdXR0b25fdGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlidXR0b25BZGQgPSBidXR0b247Ci0KLQkJLy8gUmVtb3ZlIGJ1dHRvbgotCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlQnV0dG9uX3RleHQsIFNXVC5OT05FKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJYnV0dG9uUmVtb3ZlID0gYnV0dG9uOwotCi0JCS8vIC8vIEVkaXQgYnV0dG9uCi0JCS8vIGJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvblBhbmVsLCAiRWRpdC4uLiIsIFNXVC5OT05FKTsKLQkJLy8gewotCQkvLyBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkvLyBncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UICogNjsKLQkJLy8gYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkvLyB9Ci0JCS8vIGJ1dHRvbkVkaXQgPSBidXR0b247Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBNYWtlIERlZmF1bHQgYnV0dG9uCi0JCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvblBhbmVsLCBBdXRob3JpbmdVSVJlc291cmNlcy5tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0LCBTV1QuTk9ORSk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWJ1dHRvbk1ha2VEZWZhdWx0ID0gYnV0dG9uOwotCi0JCS8vIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb24KLQkJTGFiZWwgbGFiZWwgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUxhYmVsKAotCQkJCQkJY29uZmlnQ29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbik7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRU5ELCB0cnVlLAotCQkJCQlmYWxzZSwgMiwgMSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXRleHRDb25maWdEZXNjcmlwdGlvbiA9IHRvb2xraXQuY3JlYXRlVGV4dChjb25maWdDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCXRleHRDb25maWdEZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24uc2V0RWRpdGFibGUoZmFsc2UpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb25maWdDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0vLwkJaWYgKHByb2Nlc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0vLwkJCXByb2Nlc3MuZUFkYXB0ZXJzKCkucmVtb3ZlKHByb2Nlc3NMaXN0ZW5lcik7Ci0vLwkJfQotCi0JCWlmIChjb25maWdMaXN0QWRhcHRlciAhPSBudWxsKSB7Ci0JCQljb25maWdMaXN0QWRhcHRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgY29uZmlndXJhdGlvbnMKLQkgKgotCSAqLwotCWNsYXNzIENvbmZpZ0xpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JCQotCQkvKioKLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBDb25maWdMaXN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQlwcm9jZXNzLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkJCWlmIChkZWZhdWx0Q29uZmlnICE9IG51bGwKLQkJCQkJJiYgIXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuY29udGFpbnMoZGVmYXVsdENvbmZpZykpIHsKLQkJCQlwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLmFkZCgwLCBkZWZhdWx0Q29uZmlnKTsKLQkJCX0KLQkJCXJldHVybiBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzcy5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZWZyZXNoKQotCQkJCWNvbmZpZ0xpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNb2RlbENvbnRyb2xzKCkgewotCQlpZiAoKGN0cmxfbmFtZSAhPSBudWxsKSAmJiAoIWN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQl1cGRhdGVDb250cm9sKGN0cmxfbmFtZSwgcHJvY2Vzcy5nZXROYW1lKCkpOwotCQl9Ci0JCWlmICgoY3RybF9icmllZl9kZXNjICE9IG51bGwpICYmICghY3RybF9icmllZl9kZXNjLmlzRGlzcG9zZWQoKSkpIHsKLQkJCXVwZGF0ZUNvbnRyb2woY3RybF9icmllZl9kZXNjLCBwcm9jZXNzLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCX0KLQkJaWYgKChjdHJsX3ByZXNlbnRhdGlvbl9uYW1lICE9IG51bGwpCi0JCQkJJiYgKCFjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCXVwZGF0ZUNvbnRyb2woY3RybF9wcmVzZW50YXRpb25fbmFtZSwgcHJvY2Vzcy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgVGV4dCBjb250cm9sIGlmZiB0aGUgbmV3VGV4dCBpcyBkaWZmZXJlbnQgdGhhbiB3aGF0J3MgdGhlcmUKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVDb250cm9sKFRleHQgdGV4dCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJaWYgKCF0ZXh0LmdldFRleHQoKS5lcXVhbHMoVG5nVXRpbC5jaGVja051bGwobmV3VGV4dCkpKSB7Ci0JCQl0ZXh0LnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobmV3VGV4dCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgaWZmIHRoZSBuZXdUZXh0IGlzIGRpZmZlcmVudCB0aGFuIHdoYXQncyB0aGVyZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUNvbnRyb2woSU1ldGhvZFJpY2hUZXh0IHRleHQsIFN0cmluZyBuZXdUZXh0KSB7Ci0JCWlmICghdGV4dC5nZXRUZXh0KCkuZXF1YWxzKFRuZ1V0aWwuY2hlY2tOdWxsKG5ld1RleHQpKSkgewotCQkJdGV4dC5zZXRUZXh0KFRuZ1V0aWwuY2hlY2tOdWxsKG5ld1RleHQpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRGF0YSgpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gY29udGVudCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbikgcHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQlTdHJpbmcgZXh0ZXJuYWxJRCA9IGNvbnRlbnQuZ2V0RXh0ZXJuYWxJZCgpOwotCQlTdHJpbmcgcHVycG9zZSA9IGNvbnRlbnQuZ2V0UHVycG9zZSgpOwotCQlTdHJpbmcgZnVsbERlc2MgPSBjb250ZW50LmdldE1haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgc2NvcGUgPSBjb250ZW50LmdldFNjb3BlKCk7Ci0JCVN0cmluZyB1c2FnZU5vdGVzID0gY29udGVudC5nZXRVc2FnZU5vdGVzKCk7Ci0JCVN0cmluZyBhbHRlcm5hdGl2ZXMgPSBjb250ZW50LmdldEFsdGVybmF0aXZlcygpOwotCQlTdHJpbmcgaG93VG9TdGFmZiA9IGNvbnRlbnQuZ2V0SG93dG9TdGFmZigpOwotCQlTdHJpbmcga2V5Q29uc2lkZXJhdGlvbiA9IGNvbnRlbnQuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCQl1cGRhdGVNb2RlbENvbnRyb2xzKCk7Ci0KLQkJdXBkYXRlQ29udHJvbChjdHJsX2V4dGVybmFsX2lkLCBleHRlcm5hbElEKTsKLQkJdXBkYXRlQ29udHJvbChjdHJsX3B1cnBvc2UsIHB1cnBvc2UpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfZnVsbF9kZXNjLCBmdWxsRGVzYyk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9zY29wZSwgc2NvcGUpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfdXNhZ2Vfbm90ZXMsIHVzYWdlTm90ZXMpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfYWx0ZXJuYXRpdmVzLCBhbHRlcm5hdGl2ZXMpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfaG93X3RvX3N0YWZmLCBob3dUb1N0YWZmKTsKLQkJdXBkYXRlQ29udHJvbChjdHJsX2tleV9jb25zaWRlcmF0aW9uLCBrZXlDb25zaWRlcmF0aW9uKTsKLQotCQlpZiAoY29uZmlnTGlzdEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJY29uZmlnTGlzdEFkYXB0ZXIgPSBuZXcgQ29uZmlnTGlzdEl0ZW1Qcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQkJY29uZmlnTGlzdFZpZXdlci5zZXRJbnB1dChjb25maWdMaXN0QWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLS8vCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJdGhpcy5lZGl0b3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKTsKLQkJZmluYWwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJZmluYWwgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gY29udGVudCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbikgcHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJbW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIocHJvY2Vzcyk7Ci0JCWNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoIWRlc2NFeHBhbmRGbGFnKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCWZvcm1TZWN0aW9uLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvcm0uZ2V0UGFyZW50KCkuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQocHJvY2VzcykpIHsKLQkJCQkJcmVmcmVzaChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmFtZU1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHByb2Nlc3MuZUNvbnRhaW5lcigpLAotCQkJCXRydWUpOwotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9uYW1lLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwcm9jZXNzLmdldE5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdOYW1lID0gY3RybF9uYW1lLmdldFRleHQoKS50cmltKCk7Ci0JCQkJaWYgKG5ld05hbWUuZXF1YWxzKHByb2Nlc3MuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCQkKLQkJCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCQlpZiAobmV3TmFtZS5pbmRleE9mKCcmJykgPiAtMSkgeyAvL0ZJWE1FOiB0aGlzIG11c3QgZ28gdG8gdmFsaWRhdG9yIGNvZGUKLQkJCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywgbmV3TmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCQlwcm9jQ29tcCwKLQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmV3TmFtZSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZTsgCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZTsgCi0JCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbWVzc2FnZSkpIHsKLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0KLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJcHJvY2VzcywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgY3RybF9uYW1lCi0JCQkJCQkJCQkJLmdldFRleHQoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0VGV4dChwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY0NvbXAsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCWN0cmxfbmFtZS5nZXRUZXh0KCksIC0xKTsKLQotCQkJCQkJc2V0Rm9ybVRleHQoKTsKLQotCQkJCQkJLy8gYWRqdXN0IHBsdWdpbiBsb2NhdGlvbiBhbmQgc2F2ZSB0aGUgZWRpdG9yCi0JCQkJCQkvLwotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJCQkJCWVkaXRvcgotCQkJCQkJCQkJCS5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkJCWlmKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJCQkJCS8vIHNhdmUgZmFpbGVkCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9Ci0JCQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBlZGl0b3IKLQkJCQkJCQkJCQkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24ocHJvY2VzcwotCQkJCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIGFkanVzdCBkaWFncmFtIHJlc291cmNlIGFzIHdlbGwKLQkJCQkJCQkJLy8KLQkJCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvY2VzcywgdGhpcyk7Ci0JCQkJCQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCW1nci51cGRhdGVSZXNvdXJjZVVSSSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIG1zZyk7IAotCQkJCQljdHJsX25hbWUuc2V0VGV4dChwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQljdHJsX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCQkJY3RybF9uYW1lLnNlbGVjdEFsbCgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcHJvY2Vzcy5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoKGN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpICE9IG51bGwpCi0JCQkJCQkmJiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpLmVxdWFscygiIikpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQlpZiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpLmVxdWFscyhvbGRDb250ZW50KSkgewotCi0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCXByb2Nlc3MsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldFRleHQoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotLy8JCQkJCQlMaWJyYXJ5VmlldyBlbGVtZW50c1ZpZXcgPSBMaWJyYXJ5Vmlldy5nZXRWaWV3KCk7Ci0vLwkJCQkJCWlmIChlbGVtZW50c1ZpZXcgIT0gbnVsbCkKLS8vCQkJCQkJCWVsZW1lbnRzVmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyByZXN0b3JlIHRoZSBvbGQgbmFtZSBmaXJzdCwgdGhlbiBwcmVzZW50IHRoZSBlcnJvcgotCQkJCQkvLyBtZXNzYWdlIGJveAotCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldFRleHQocHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZyk7IAotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKAotCQkJCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkvLyB3aGVuIHVzZXIgdGFiIHRvIHRoaXMgZmllbGQsIHNlbGVjdCBhbGwgdGV4dAotCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2VsZWN0QWxsKCk7Ci0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uIHdoZW4gdGhlIGZvY3VzIG9mIHRoZSBjb21wb25lbnQgaXMgbG9zdCAKLQkJCQlpZihjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKXsKLQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5jbGVhclNlbGVjdGlvbigpOwotCQkJCX0gfQotCQl9KTsKLQotCQljdHJsX2JyaWVmX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2JyaWVmX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHByb2Nlc3MuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX2JyaWVmX2Rlc2MuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwcm9jZXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2V4dGVybmFsX2lkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfZXh0ZXJuYWxfaWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRFeHRlcm5hbElkKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2V4dGVybmFsX2lkLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9leHRlcm5hbF9pZC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCXByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQljdHJsX2V4dGVybmFsX2lkLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHVycG9zZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHVycG9zZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQdXJwb3NlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX3B1cnBvc2UsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2Z1bGxfZGVzYy5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9mdWxsX2Rlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCWN0cmxfZnVsbF9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfZnVsbF9kZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9mdWxsX2Rlc2M7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2Z1bGxfZGVzYywgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfc2NvcGUuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfc2NvcGUuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpKTsKLQkJY3RybF9zY29wZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Njb3BlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9zY29wZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRTY29wZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9zY29wZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXNhZ2Vfbm90ZXMuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfdXNhZ2Vfbm90ZXMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkpOwotCQljdHJsX3VzYWdlX25vdGVzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfdXNhZ2Vfbm90ZXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3VzYWdlX25vdGVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFVzYWdlTm90ZXMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfdXNhZ2Vfbm90ZXMsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2FsdGVybmF0aXZlczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfYWx0ZXJuYXRpdmVzLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCBuZXdDb250ZW50LAotCQkJCQkJCS0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfaG93X3RvX3N0YWZmLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2hvd190b19zdGFmZi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkpOwotCQljdHJsX2hvd190b19zdGFmZi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2hvd190b19zdGFmZi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfaG93X3RvX3N0YWZmOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEhvd3RvU3RhZmYoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfaG93X3RvX3N0YWZmLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSwgbmV3Q29udGVudCwKLQkJCQkJCQktMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfa2V5X2NvbnNpZGVyYXRpb247Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24sIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbmZpZ0xpc3RWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdMaXN0Vmlld2VyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgoTWV0aG9kQ29uZmlndXJhdGlvbikgc2VsZWN0aW9uCi0JCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQkJCWlmIChjb25maWcgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCQkJCWJ1dHRvblJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidXR0b25SZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIGRlc2MgPSBjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCXRleHRDb25maWdEZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJYnV0dG9uQWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkocHJvY2Vzcyk7Ci0KLQkJCQlmaW5hbCBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlciBpbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWxpYiwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWlucHV0LAotCQkJCQkJY29udGVudFByb3ZpZGVyLAotCQkJCQkJbGFiZWxQcm92aWRlciwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uKSB7IAotCQkJCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQkJCWdldFZpZXdlcigpLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCi0JCQkJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsCi0JCQkJCQkJCQlPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCQkJLy8gaW50IGNvdW50ID0KLQkJCQkJCQkJLy8gY29uZmlnTGlzdFZpZXdlci5nZXRMaXN0KCkuZ2V0SXRlbUNvdW50KCk7Ci0JCQkJCQkJCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCQkJCS8vIGlmKGVsZW1lbnQgPT0KLQkJCQkJCQkJLy8gY29uZmlnTGlzdFZpZXdlci5nZXRFbGVtZW50QXQoaSkpIHJldHVybgotCQkJCQkJCQkvLyBmYWxzZTsKLQkJCQkJCQkJLy8gfQotCQkJCQkJCQkvLyByZXR1cm4gdHJ1ZTsKLQkJCQkJCQkJcmV0dXJuICFwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLmNvbnRhaW5zKAotCQkJCQkJCQkJCWVsZW1lbnQpOwotCQkJCQkJCX0KLQotCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gY29udHJvbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQkJCQkJaW5wdXQuZGlzcG9zZSgpOwotCQkJCQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChkbGcub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQlPYmplY3Qgb2JzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQkJCQkvLyBnZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0vLwkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gcHJvY2VzcwotLy8JCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JzW2ldOwotCQkJCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJfHwgY2hlY2tWYWxpZGl0eUZvclN1cGVyU2V0KGRlZmF1bHRDb25maWcsCi0vLwkJCQkJCQkJCQljb25maWcpKSB7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgcHJvY2VzcywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLCBjb25maWcsCi0JCQkJCQkJCQktMSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5pbnZhbGlkQ29uZmlnRXJyb3JfbXNnLCBjb25maWcuZ2V0TmFtZSgpKSk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlidXR0b25SZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0xpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHByb2Nlc3MsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLAotCQkJCQkJc2VsZWN0aW9uLnRvTGlzdCgpLCAtMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbk1ha2VEZWZhdWx0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdMaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBwcm9jZXNzCi0JCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkJCQkJaWYgKGN1cnJlbnRDb25maWcgIT0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKSB7Ci0JCQkJCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQkJCQkJTGlzdCB2YWxpZENvbnRleHQgPSBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmFsaWRDb250ZXh0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdG9yCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCWlmICghKGNoZWNrVmFsaWRpdHlGb3JTdXBlclNldCgKLQkJCQkJCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpLCBjb25maWcpKSkgewotCQkJCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpc1ZhbGlkKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLAotCQkJCQkJCQkJc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpLCAtMSk7Ci0JCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlidXR0b25SZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUgPSAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHNlbGVjdGlvbgotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKS5nZXROYW1lKCk7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5zZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnLCBzZWxlY3RlZENvbmZpZ05hbWUpKTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggYWxsIHRoZSBjb250cm9scwotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlpZiAoIWN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFjdHJsX2JyaWVmX2Rlc2MuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICghY3RybF9wdXJwb3NlLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9wdXJwb3NlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWN0cmxfZnVsbF9kZXNjLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9mdWxsX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICghY3RybF9hbHRlcm5hdGl2ZXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX2FsdGVybmF0aXZlcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFjdHJsX2V4dGVybmFsX2lkLmlzRGlzcG9zZWQoKSkKLQkJCWN0cmxfZXh0ZXJuYWxfaWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlpZiAoIWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uaXNEaXNwb3NlZCgpKQotCQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmICghY3RybF9ob3dfdG9fc3RhZmYuaXNEaXNwb3NlZCgpKQotCQkJY3RybF9ob3dfdG9fc3RhZmYuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlpZiAoIWN0cmxfc2NvcGUuaXNEaXNwb3NlZCgpKQotCQkJY3RybF9zY29wZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmICghY3RybF91c2FnZV9ub3Rlcy5pc0Rpc3Bvc2VkKCkpCi0JCQljdHJsX3VzYWdlX25vdGVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCAmJiAhY3RybF9leHBhbmRlZC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICghYnV0dG9uQWRkLmlzRGlzcG9zZWQoKSkKLQkJCWJ1dHRvbkFkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKCFidXR0b25NYWtlRGVmYXVsdC5pc0Rpc3Bvc2VkKCkpCi0JCQlidXR0b25NYWtlRGVmYXVsdC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKCFidXR0b25SZW1vdmUuaXNEaXNwb3NlZCgpKQotCQkJYnV0dG9uUmVtb3ZlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBzdXBlcnNldCBvZiBzZWxlY3RlZAotCSAqIGNvbmZpZ3VyYXRpb24gb3Igbm90Ci0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tWYWxpZGl0eUZvclN1cGVyU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vIGdldCBkZWZhdWx0IHBsdWdpbnMgYW5kIHBhY2thZ2VzCi0JCUxpc3QgZGVmYXVsdFBsdWdpbnMgPSBkZWZhdWx0Q29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQlMaXN0IGRlZmF1bHRQYWNrYWdlcyA9IGRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JCS8vIGdldCBjb25maXVncmF0aW9uIHBsdWdpbnMgYW5kIHBhY2FrZ2VzCi0JCUxpc3QgcGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gcGx1Z2luQ29udGFpbnMgPSBmYWxzZTsKLQkJYm9vbGVhbiBwYWNrYWdlQ29udGFpbnMgPSBmYWxzZTsKLQkJaWYgKChwbHVnaW5zICE9IG51bGwpICkgewotCQkJcGx1Z2luQ29udGFpbnMgPSBkZWZhdWx0UGx1Z2lucy5jb250YWluc0FsbChwbHVnaW5zKTsKLQkJfQotCQlpZiAoKHBhY2thZ2VzICE9IG51bGwpICkgewotCQkJcGFja2FnZUNvbnRhaW5zID0gZGVmYXVsdFBhY2thZ2VzLmNvbnRhaW5zQWxsKHBhY2thZ2VzKTsKLQkJfQotCi0JCXJldHVybiAocGx1Z2luQ29udGFpbnMpICYmIChwYWNrYWdlQ29udGFpbnMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVNlY3Rpb25zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJaWYgKGVuYWJsZSkgewotCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJfSBlbHNlIHsKLQkJCWdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyA9IGdlbmVyYWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCX0KLQotCQlkZXRhaWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJaWYgKGVuYWJsZSkgewotCQkJZGV0YWlsU2VjdGlvbi5zZXRFeHBhbmRlZChkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyA9IGRldGFpbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJZGV0YWlsU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQl9Ci0JCWNvbmZpZ1NlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQlpZiAoZW5hYmxlKSB7Ci0JCQljb25maWdTZWN0aW9uLnNldEV4cGFuZGVkKGNvbmZpZ1NlY3Rpb25FeHBhbmRGbGFnKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ1NlY3Rpb25FeHBhbmRGbGFnID0gY29uZmlnU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQljb25maWdTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgbmFtZSBmb3IgdGhlIGZvcm0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtVGV4dCgpIHsKLQotCQlmb3JtLnNldFRleHQoTGlicmFyeVVJVGV4dC5nZXRVSVRleHQocHJvY2VzcykKLQkJCQkrICI6ICIgKyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIGZvcm0gbmFtZQotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEVsZW1lbnROYW1lKGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCWlmICgoY3RybF9uYW1lICE9IG51bGwpICYmICEoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljdHJsX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KG5ld05hbWUpOwotCQkJCQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCQlzZXRGb3JtVGV4dCgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQkJaWYgKGN0cmxfbmFtZS5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX25hbWUuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldENvbnRleHRIZWxwKCkgewotCQlzdXBlci5zZXRDb250ZXh0SGVscCgpOwotCQlFZGl0b3JzQ29udGV4dEhlbHBlci5zZXRIZWxwKGdldFBhcnRDb250cm9sKCksIHByb2Nlc3NUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiYzZlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIFByb2Nlc3MgZm9ybSBwYWdlcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Zvcm1QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyBwcm9jZXNzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGZvcm0gZWRpdG9yLgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGZvcm0gcGFnZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Zvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJLy8gR2V0IHRoZSBQcm9jZXNzIG9iamVjdCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQuCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQotCQlPYmplY3Qgb2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXByb2Nlc3MgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwZDFjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciB0aGUgUHJvY2VzcyBlZGl0b3IgZm9ybSBwYWdlcy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGb3JtVXRpbCB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW50byBjb2x1bW4gZGVzY3JpcHRvcnMgbGlzdAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQlMaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUxpc3QgdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChTdHJpbmcgc3RyKSB7Ci0JCUVMaXN0IGNvbHVtbkRlc2NyaXB0b3JzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQlPYmplY3QgY29sdW1uRGVzY3JpcHRvciA9IFByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAKLQkJCQkJLmdldCh0b2tlbik7Ci0JCQlpZiAoY29sdW1uRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJY29sdW1uRGVzY3JpcHRvcnMuYWRkKGNvbHVtbkRlc2NyaXB0b3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2x1bW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW50byBjb2x1bW4gZGVzY3JpcHRvcnMgYXJyYXkgbGlzdAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQlBcnJheSBpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2x1bW5EZXNjcmlwdG9yW10gdG9Db2x1bW5EZXNjcmlwdG9ycyhTdHJpbmcgc3RyKSB7Ci0JCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVDYXRlZ29yaWVzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlQ2F0ZWdvcmllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwNTcwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVDYXRlZ29yaWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIENhdGVnb3JpZXMgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlQ2F0ZWdvcmllc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZUNhdGVnb3JpZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlQ2F0ZWdvcmllc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5DQVRFR09SSUVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldHMoKFJvbGUpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCkgaXQubmV4dCgpOwotCQkJCS8vIFRPRE86IFRlc3Qgb24tdGhlLWZseSBjcmVhdGlvbiBvZiBjYXRlZ29yeSBjb250cmlidXRvcgotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9Sb2xlU2V0KGdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCXJvbGVTZXQsIHJvbGUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCkgaXQubmV4dCgpOwotCQkJCS8vIFRPRE86IFRlc3Qgb24tdGhlLWZseSBjcmVhdGlvbiBvZiBjYXRlZ29yeSBjb250cmlidXRvcgotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbVJvbGVTZXQoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIHJvbGVTZXQsIHJvbGUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKChSb2xlKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0N1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgcm9sZSwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCByb2xlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZzIoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2Y2RjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9ST0xFID0gQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9za2lsbHM7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2Fzc2lnbjsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfc3lub255bXM7Ci0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCW5vdGF0aW9uU2VjdGlvbk9uID0gdHJ1ZTsKLQkJZXh0ZXJuYWxJZE9uID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQlsYWJlbF9iYXNlLnNldFRleHQoQkFTRV9ST0xFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTdGFmZmluZyBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJbm90YXRpb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlNUQUZGSU5HX1NFQ1RJT05fTkFNRSk7Ci0JCW5vdGF0aW9uU2VjdGlvbi5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVRleHQuU1RBRkZJTkdfU0VDVElPTl9ERVNDKTsKLQkJY3RybF9za2lsbHMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlNLSUxMU19URVhULCA0MCwgNDAwLAotCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQljdHJsX2Fzc2lnbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQVNTSUdOTUVOVF9BUFBST0FDSEVTX1RFWFQsCi0JCQkJNDAsIDQwMCwgTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCWN0cmxfc3lub255bXMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlNZTk9OWU1TX1RFWFQsIDQwLCA0MDAsCi0JCQkJTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJY3RybF9za2lsbHMuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9za2lsbHMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkpOwotCQkJY3RybF9za2lsbHMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfc2tpbGxzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9za2lsbHM7Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRTa2lsbHMoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfYXNzaWduLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfYXNzaWduLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCkpOwotCQkJY3RybF9hc3NpZ24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfYXNzaWduLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9hc3NpZ247Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3N5bm9ueW1zLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfc3lub255bXMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSk7Ci0JCQljdHJsX3N5bm9ueW1zLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3N5bm9ueW1zLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9zeW5vbnltczsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFN5bm9ueW1zKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQkKLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQljdHJsX3NraWxscy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX2Fzc2lnbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX3N5bm9ueW1zLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCVN0cmluZyBza2lsbHMgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlLmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0U2tpbGxzKCk7Ci0JCQlTdHJpbmcgYXNzaWduID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0JCQlTdHJpbmcgc3lub255bXMgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlLmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0U3lub255bXMoKTsKLQkKLQkJCWN0cmxfc2tpbGxzLnNldFRleHQoc2tpbGxzID09IG51bGwgPyAiIiA6IHNraWxscyk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfYXNzaWduLnNldFRleHQoYXNzaWduID09IG51bGwgPyAiIiA6IGFzc2lnbik7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfc3lub255bXMuc2V0VGV4dChzeW5vbnltcyA9PSBudWxsID8gIiIgOiBzeW5vbnltcyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQkJfQotCQl9OwotCi0JCS8vIFNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nLgotCQkoKENvbnRlbnRGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJcm9sZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUd1aWRhbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlR3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTc0NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlR3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgR3VpZGFuY2UgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZUd1aWRhbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZUd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIFVJSGVscGVyLmdldFNlbGVjdGVkR3VpZGFuY2VzKHJvbGUpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgcm9sZSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCXJvbGUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiArIHJvbGUuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIjoiICsgcm9sZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCXJvbGUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCShQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIHJvbGUsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQlyb2xlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIiArIHJvbGUuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIjoiICsgcm9sZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXREZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldERlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzg4YmZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldERlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldERlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlU2V0RGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0IHJvbGVTZXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0RGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0ID0gKFJvbGVTZXQpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRFeHRlcm5hbElET24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlU2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXJvbGVTZXQpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ4Njk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGVTZXRHcm91cGluZyByb2xlU2V0R3JvdXBpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGVTZXRHcm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRFeHRlcm5hbElET24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXJvbGVTZXRHcm91cGluZykgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMmYyODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdSb2xlU2V0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGUgU2V0cyBwYWdlIGluIHRoZSBSb2xlIFNldCBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IFJlbmFtZSB0aGlzIGNsYXNzIHRvIFJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZSBhbmQgbW92ZSBpdCB0byB0aGUKLSAqIG9tLmlibS5ybWMuYXV0aG9yaW5nLnVpLnV0aWwuZm9ybXMgcGFja2FnZQotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFX1NFVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFJvbGVTZXRHcm91cGluZykgb2JqZWN0KS5nZXRSb2xlU2V0cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCXJvbGVTZXRHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlyb2xlU2V0R3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCk7Ci0JCQl9Ci0JCX07Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0Um9sZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3NTFiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSb2xlcyBwYWdlIGluIHRoZSBSb2xlIFNldCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0Um9sZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVTZXRSb2xlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGVTZXQgcm9sZVNldDsKLQkKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldFJvbGVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJPTEVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldCA9IChSb2xlU2V0KSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCS8vcmV0dXJuICgoUm9sZVNldCkgb2JqZWN0KS5nZXRSb2xlcygpLnRvQXJyYXkoKTsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZLAotCQkJCQkJCWdldE9yZGVyRmVhdHVyZSgpKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKGNvbnRlbnRFbGVtZW50LCAKLQkJCQkJCWFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJcm9sZVNldCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpLCBhZGRJdGVtcywKLQkJCQkJLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJcm9sZVNldCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpLCBybUl0ZW1zLAotCQkJCQktMSk7Ci0JCX0KLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVUYXNrc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVRhc2tzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzc1YWRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVRhc2tzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBUYXNrcyBwYWdlIGluIHRoZSBSb2xlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlVGFza3NQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlVGFza3NQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuVEFTS1NfUEFHRV9USVRMRSk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tzKChSb2xlKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQyKTsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh0YXNrKSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJCQkJcm9sZSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCByb2xlLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksIHJtSXRlbXMsIC0xKTsKLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFNlY29uZGFyeVRhc2tzKChSb2xlKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnModGFzaykpIHsKLQkJCQkJdGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQl0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkucmVtb3ZlKHJvbGUpOwotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVGFzayk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVXb3JrUHJvZHVjdHNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjEwYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgV29yayBQcm9kdWN0cyBwYWdlIGluIHRoZSBSb2xlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVdvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVdvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVXb3JrUHJvZHVjdHNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuV09SS19QUk9EVUNUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQljdHJsX2FkZDIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWN0cmxfcmVtb3ZlMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChSb2xlKSBvYmplY3QpLmdldFJlc3BvbnNpYmxlRm9yKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZighYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBybUl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldFJlc3BvbnNpYmxlUm9sZSgKLS8vCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCAoV29ya1Byb2R1Y3QpIHJtSXRlbXMuZ2V0KGkpLCBudWxsKTsKLS8vCQkJfQotCQkJCi0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKChSb2xlKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0NhdGVnb3JpZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tDYXRlZ29yaWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjRhNGJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0NhdGVnb3JpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkN1c3RvbUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIENhdGVnb3JpZXMgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrQ2F0ZWdvcmllc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza0NhdGVnb3JpZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrQ2F0ZWdvcmllc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5DQVRFR09SSUVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLS8vCQlzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKChUYXNrKSBvYmplY3QpLnRvQXJyYXkoKTsJCQkJCi0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3QgZGlzY2lwbGluZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihkaXNjaXBsaW5lIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0vLwkJCQkJTGlzdCBkaXNjaXBsaW5lcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKHRhc2spOwotLy8JCQkJCWlmIChkaXNjaXBsaW5lcyAhPSBudWxsICYmIGRpc2NpcGxpbmVzLnNpemUoKSA+IDApCXsKLS8vCQkJCQkJT2JqZWN0IGFzc29jaWF0ZWREaXNjaXBsaW5lID0gZGlzY2lwbGluZXMuZ2V0KDApOwotLy8JCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotLy8JCQkJCQkuZm9ybWF0KAotLy8JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0vLwkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQkJCXRhc2suZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChhc3NvY2lhdGVkRGlzY2lwbGluZSksCi0vLwkJCQkJCQkJCQkoKERpc2NpcGxpbmUpIGRpc2NpcGxpbmUpLmdldE5hbWUoKSB9KTsKLS8vCQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2cpOwotLy8JCQkJCQlyZXR1cm47Ci0vLwkJCQkJfQotCi0JCQkJCQotCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvRGlzY2lwbGluZShnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQkoRGlzY2lwbGluZSkgZGlzY2lwbGluZSwgdGFzaywgdXNlZENhdGVnb3JpZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURpc2NpcGxpbmUoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGRpc2NpcGxpbmUsIHRhc2ssIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKChUYXNrKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0N1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgdGFzaywgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZzIoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIyID0gbmV3IEN1c3RvbUNhdGVnb3J5RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0Rlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmQyODIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQJCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfVEFTSyA9IEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWx0ZXJuYXRpdmVzOwotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotCQlwdXJwb3NlT24gPSB0cnVlOwotCQlleHRlcm5hbElkT24gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQUxURVJOQVRJVkVTX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQlsYWJlbF9iYXNlLnNldFRleHQoQkFTRV9UQVNLKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0JCVN0cmluZyBwdXJwb3NlID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbikgdGFzay5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkuZ2V0UHVycG9zZSgpOwotCQlTdHJpbmcgYWx0ZXJuYXRpdmVzID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbikgdGFzawotCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCWN0cmxfcHVycG9zZS5zZXRUZXh0KHB1cnBvc2UgPT0gbnVsbCA/ICIiIDogcHVycG9zZSk7IC8vJE5PTi1OTFMtMSQJCi0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldFRleHQoYWx0ZXJuYXRpdmVzID09IG51bGwgPyAiIiA6IGFsdGVybmF0aXZlcyk7IC8vJE5PTi1OTFMtMSQJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQljdHJsX3B1cnBvc2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wdXJwb3NlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9wdXJwb3NlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uKSB0YXNrCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFB1cnBvc2UoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQljdHJsX2FsdGVybmF0aXZlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2FsdGVybmF0aXZlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYWx0ZXJuYXRpdmVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uKSB0YXNrCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEFsdGVybmF0aXZlcygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVGFzayk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ29udGVudEZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQl0YXNrKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tHdWlkYW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0d1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjg0NTRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0d1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0d1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrR3VpZGFuY2VQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrR3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIFVJSGVscGVyLmdldFNlbGVjdGVkR3VpZGFuY2VzKHRhc2spOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZXMgZm9yIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gCi0JCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgdGFzaywgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCQkJCShUb29sTWVudG9yKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSAKLQkJCQllbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiICsgdGFzay5nZXRUeXBlKCkuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyAiOiIgKyB0YXNrLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBtZXRob2QgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgdGFzaywgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IAotLy8JCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0vLwkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRlKCksCi0vLwkJCQkJCQludWxsLCAtMSk7Ci0vLwkJCQl9IAotCQkJCWVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIiArIHRhc2suZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIjoiICsgdGFzay5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrUm9sZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tSb2xlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5ODA0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tSb2xlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZXMgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tSb2xlc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza1JvbGVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrUm9sZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUk9MRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0UGVyZm9ybWVkQnkoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7CQkKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCUxpc3QgYWRkSXRlbXNGaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoUm9sZSkgYWRkSXRlbXMuZ2V0KGkpKSkpIHsKLQkJCQkJYWRkSXRlbXNGaWx0ZXJlZC5hZGQoYWRkSXRlbXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChUYXNrKSBvYmplY3QpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlMaXN0IGFkZEl0ZW1zRmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZEl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucygoKFJvbGUpIGFkZEl0ZW1zLmdldChpKSkpKSB7Ci0JCQkJCWFkZEl0ZW1zRmlsdGVyZWQuYWRkKGFkZEl0ZW1zLmdldChpKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRhc2ssCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPQluZXcgQ29udGVudEZpbHRlciAoKXsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZih0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgIT0gbnVsbCl7Ci0JCQkJCUxpc3QgbGlzdCA9IHRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJCQkJZm9yKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKLQkJCQkJCU9iamVjdCBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFJvbGUpewotCQkJCQkJCWlmKG9iaiA9PSBuZXh0KSByZXR1cm4gZmFsc2U7Ci0JCQkJCQkJaWYoIWNoZWNrQ29udHJpYnV0aW9uKChWYXJpYWJpbGl0eUVsZW1lbnQpbmV4dCwgb2JqKSkKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyICgpewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmKHRhc2suZ2V0UGVyZm9ybWVkQnkoKSAhPSBudWxsKXsKLQkJCQkJCi0JCQkJCUxpc3QgbGlzdCA9IHRhc2suZ2V0UGVyZm9ybWVkQnkoKTsKLQkJCQkJZm9yKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKLQkJCQkJCU9iamVjdCBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFJvbGUpewotCQkJCQkJCWlmKG9iaiA9PSBuZXh0KSByZXR1cm4gZmFsc2U7Ci0JCQkJCQkJaWYoIWNoZWNrQ29udHJpYnV0aW9uKChSb2xlKW5leHQsIG9iaikpCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJvbGUgZmlsdGVyCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgUm9sZUZpbHRlciBleHRlbmRzIENvbnRlbnRGaWx0ZXIgewotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZih0YXNrLmdldFBlcmZvcm1lZEJ5KCkgIT0gbnVsbCl7Ci0JCQkJTGlzdCBsaXN0ID0gdGFzay5nZXRQZXJmb3JtZWRCeSgpOwotCQkJCWZvcihJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgUm9sZSl7Ci0JCQkJCQlpZihvYmogPT0gbmV4dCkgcmV0dXJuIGZhbHNlOwotCQkJCQkJaWYoIWNoZWNrQ29udHJpYnV0aW9uKChSb2xlKW5leHQsIG9iaikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDaGVjayBjb250cmlidXRpb24KLQkgKiBAcGFyYW0gY29udHJpYnV0b3IKLQkgKiBAcGFyYW0gb2JqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tDb250cmlidXRpb24oVmFyaWFiaWxpdHlFbGVtZW50IGNvbnRyaWJ1dG9yLCBPYmplY3Qgb2JqKXsKLQkJaWYoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGNvbnRyaWJ1dG9yKSAmJiBvYmogaW5zdGFuY2VvZiBSb2xlKXsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gY29udHJpYnV0b3IuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYoZSAhPSBudWxsKXsKLQkJCQlpZihlLmVxdWFscyhvYmopKSByZXR1cm4gZmFsc2U7Ci0JCQkJaWYoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGUpKQotCQkJCQlyZXR1cm4gY2hlY2tDb250cmlidXRpb24oZSwgb2JqKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tTdGVwc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1N0ZXBzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzhlNGM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1N0ZXBzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5TZWN0aW9uc09yZGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuRWRpdG9yc0NvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVtb3ZlRnJvbVNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBUaGUgU3RlcHMgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tTdGVwc1BhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrU3RlcHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkLCBjdHJsX2RlbGV0ZSwgY3RybF91cCwgY3RybF9kb3duLCBjdHJsX29yZGVyaW5nOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3N0ZXBzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzdGVwc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBhbGxTdGVwczsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgYWN0aXZlQ29udHJvbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlc2NFeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZXhwYW5kZWQ7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmRMYWJlbDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGZvcm1TZWN0aW9uOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGU7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9tYWluZGVzYzsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gY3VycmVudFN0ZXA7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza1N0ZXBzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlNURVBTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCXRhc2sgPSAoVGFzaykgbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0KLQkgKiAgICAgIG1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0KLQkJZm9ybS5zZXRUZXh0KExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KHRhc2spICsgIjogIiArIHRhc2suZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvcm1TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLk5PX1RJVExFKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCX0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBzZWN0aW9ucy4KLQkJc2VjdGlvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIEluZm9ybWF0aW9uIHNlY3Rpb24uCi0JCWdlbmVyYWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJU2VjdGlvbi5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFCi0JCQkJCQl8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlnZW5lcmFsU2VjdGlvbgotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlNURVBTX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5TVEVQU19TRUNUSU9OX0RFU0MpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoZ2VuZXJhbENvbXBvc2l0ZS5nZXRQYXJlbnQoKSwgdGFzayk7Ci0KLQkJQ29tcG9zaXRlIHBhbmUxID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJcGFuZTEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQlMYWJlbCBsX25hbWUgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhbmUxLCBBdXRob3JpbmdVSVRleHQuU1RFUFNfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3N0ZXBzID0gdG9vbGtpdC5jcmVhdGVUYWJsZShwYW5lMSwgU1dULk1VTFRJKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCQljdHJsX3N0ZXBzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdFByb3ZpZGVycygpOwotCi0JCXN0ZXBzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zdGVwcyk7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcik7Ci0KLQkJQ29tcG9zaXRlIHBhbmUyID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXBhbmUyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLQkJcGFuZTIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWN0cmxfYWRkID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQsCi0JCQkJU1dULk5PTkUpOwotCQljdHJsX2FkZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2RlbGV0ZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERUxFVEVfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kZWxldGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWN0cmxfdXAgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX2Rvd24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX29yZGVyaW5nID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk9SREVSX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfb3JkZXJpbmcuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmFtZQotCQlMYWJlbCBuYW1lTGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNURVBfTkFNRV9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX25hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5TSU5HTEUpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljcmVhdGVCbGFua0xhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIDQpOwotCi0JCWN0cmxfbWFpbmRlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGluaygKLQkJCQl0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkyNTAsIDMwMCwgNCk7Ci0KLQkJY3JlYXRlUmljaFRleHRFZGl0b3JTZWN0aW9uKCk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihleHBhbmRlZENvbXBvc2l0ZSk7Ci0KLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCQllbmFibGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMgdG8gbW9uaXRvciBmb2N1cyBhbmQgbW9kaWZpY2F0aW9uIGNoYW5nZXMgaW4gdGhlIGVkaXQKLQkgKiBjb250cm9scy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQljb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoY3VycmVudFN0ZXApOwotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLS8vCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQoKEVPYmplY3QpIHRhc2ssIGdldFNpdGUoKQotLy8JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0vLwkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCWxvYWREYXRhKCk7Ci0vLwkJCQl9Ci0JCQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQkJCQlsb2FkRGF0YSgpOwotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJY2hlY2tTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlkZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvcm0uYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmIChjdHJsX2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpOwotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotCQkJCX0KLQkJCQlmb3JtU2VjdGlvbi5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlpZiAoY3VycmVudFN0ZXAgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGN1cnJlbnRTdGVwLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX25hbWUuZ2V0VGV4dCgpOwotCQkJCQlpZiAoY3RybF9uYW1lLmdldFRleHQoKSA9PSBudWxsCi0JCQkJCQkJfHwgY3RybF9uYW1lLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgTGlicmFyeVVJVGV4dC5URVhUX1NURVApOyAKLQkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2csIFN0clV0aWwudG9Mb3dlcihMaWJyYXJ5VUlUZXh0LlRFWFRfU1RFUCkpOyAKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBvbGRDb250ZW50Lmxlbmd0aCgpKTsKLQkJCQkJfSBlbHNlIGlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGN1cnJlbnRTdGVwLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbWFpbmRlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9tYWluZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXNhdmVNYWluRGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGNoaWxkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTZWN0aW9uKCk7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5ORVdfRUxFTUVOVF9URVhULAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5URVhUX1NURVAgfSk7Ci0JCQkJY2hpbGQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQlBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQodGFzaywKLQkJCQkJCWNoaWxkLCBhbGxTdGVwcyk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQlzdGVwc1RhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjaGlsZCkpOwotCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgbmV3TmFtZS5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZGVsZXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgewotCQkJCQkJUmVtb3ZlRnJvbVNlY3Rpb25MaXN0IGNtZCA9IG5ldyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QoCi0JCQkJCQkJCXRhc2ssIChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIG8sIGFsbFN0ZXBzKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJZWRpdFN0ZXAobnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlBcnJheUxpc3QgbW92ZVVwSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZVVwSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQl0YXNrLCBtb3ZlVXBJdGVtcywgYWxsU3RlcHMsIDEpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJdGFzaywgbW92ZURvd25JdGVtcywgYWxsU3RlcHMsIDApOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfb3JkZXJpbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2VjdGlvbnNPcmRlckRpYWxvZyBkbGcgPSBuZXcgU2VjdGlvbnNPcmRlckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQl0YXNrLAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuU3RlcHNPcmRlckRpYWxvZ190aXRsZSwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uLCAKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzX3RleHQpOyAKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9vcmRlcmluZy5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCS8vIFNhdmUgdGhlIHN0ZXAgb3JkZXIuCi0JCWlmIChhbGxTdGVwcyAhPSBudWxsKSB7Ci0JCQlhbGxTdGVwcy5hcHBseSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIHdpdGggZGF0YSBmcm9tIHRoZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCWFsbFN0ZXBzID0gbnVsbDsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRJbnB1dCh0YXNrKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCWVkaXRTdGVwKGN1cnJlbnRTdGVwKTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0IGN1cnJlbnQgc3RlcC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdFN0ZXAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIHN0ZXApIHsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJaWYgKGN0cmxfbWFpbmRlc2MuZ2V0TW9kaWZpZWQoKSkgewotCQkJc2F2ZU1haW5EZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJY3VycmVudFN0ZXAgPSBzdGVwOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGN1cnJlbnRTdGVwICE9IG51bGwpIHsKLQkJCW5hbWUgPSBjdXJyZW50U3RlcC5nZXROYW1lKCk7Ci0JCQlkZXNjID0gY3VycmVudFN0ZXAuZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJfQotCQljdHJsX25hbWUuc2V0VGV4dChuYW1lID09IG51bGwgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfbWFpbmRlc2Muc2V0VGV4dChkZXNjID09IG51bGwgPyAiIiA6IGRlc2MpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfbWFpbmRlc2Muc2V0TW9kYWxPYmplY3QoY3VycmVudFN0ZXApOwotCQljdHJsX21haW5kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJaWYgKHN0ZXAgPT0gbnVsbCkgewotCQkJLy8gY2xvc2UgYW55IEZpbmQvUmVwbGFjZSBkaWFsb2cgb3BlbiBpbiB0aGUgUlRFCi0JCQljdHJsX21haW5kZXNjLmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldEVsZW1lbnQoY3VycmVudFN0ZXApOwotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZShjdXJyZW50U3RlcCA9PSBudWxsKTsKLQotCQllbmFibGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBjb250cm9scwotCSAqLwotCXByaXZhdGUgdm9pZCBlbmFibGVDb250cm9scygpIHsKLQkJaWYgKHRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWlucyhjdXJyZW50U3RlcCkpIHsKLQkJCWlmICghVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQljdHJsX25hbWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSaWNoVGV4dEVkaXRvclNlY3Rpb24oKSB7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQotCQkvLyBIeXBlcmxpbmsgZGVzYwotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOyAKLQkJZXhwYW5kTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJZXhwYW5kTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCWlmIChjdXJyZW50U3RlcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY3RybF9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkID0gY3JlYXRlUmljaFRleHRFZGl0b3IodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCVNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCWdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCksIGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSwgMiwgZXhwYW5kTGFiZWwpOwotCQkJY3RybF9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGRlc2NFeHBhbmRGbGFnKSB7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGFjdGl2ZUNvbnRyb2w7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KGN0cmxfZXhwYW5kZWQuZ2V0VGV4dCgpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlpZiAoY3RybF9leHBhbmRlZC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCS5zYXZlTW9kaWZpZWRSaWNoVGV4dChjdHJsX2V4cGFuZGVkKTsKLQkJCX0KLQkJCXJpY2hUZXh0LnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChleHBhbmRlZENvbXBvc2l0ZSk7Ci0JCQlleHBhbmRMYWJlbC5zZXRUZXh0KGN1cnJlbnRTdGVwLmdldE5hbWUoKSArCi0JCQkJCSIgLSAiICsgKFN0cmluZykgKChJbWFnZUh5cGVybGluaykgZS5nZXRTb3VyY2UoKSkuZ2V0RGF0YSgiVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEluaXRpYWxUZXh0KHJpY2hUZXh0LmdldFRleHQoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUocmljaFRleHQKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24ocmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJYm9vbGVhbiBlZGl0YWJsZSA9ICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9leHBhbmRlZC5zZXRGb2N1cygpOwotCQkJfQotCQkJYWN0aXZlQ29udHJvbCA9IHJpY2hUZXh0OwotCQl9Ci0KLQkJZm9ybS5nZXRCb2R5KCkubGF5b3V0KHRydWUsIHRydWUpOwotCQlkZXNjRXhwYW5kRmxhZyA9ICFkZXNjRXhwYW5kRmxhZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFByb3ZpZGVycygpIHsKLQkJc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBTZWN0aW9uTGlzdCh0YXNrLAotCQkJCQkJCVNlY3Rpb25MaXN0LlNURVBTX0ZPUl9FTEVNRU5UX09OTFkpOwotCQkJCX0KLQkJCQlyZXR1cm4gYWxsU3RlcHMudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXN0ZXBzVmlld2VyTGFiZWxQcm92aWRlciA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gIXRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWlucyhlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZU1haW5EZXNjcmlwdGlvbigpIHsKLQkJaWYgKGN1cnJlbnRTdGVwICE9IG51bGwpIHsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCTogY3RybF9tYWluZGVzYzsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjdXJyZW50U3RlcC5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsCi0JCQkJCW9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjdXJyZW50U3RlcCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCksCi0JCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJRm9ybUVkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1NlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgIVRuZ1V0aWwuaXNMb2NrZWQodGFzaykpIHsKLQkJCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQodGFzaykgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCWVkaXRTdGVwKChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrV29ya1Byb2R1Y3RzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVkNWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1dvcmtQcm9kdWN0c1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFdvcmsgUHJvZHVjdHMgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tXb3JrUHJvZHVjdHNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tXb3JrUHJvZHVjdHNQYWdlIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrV29ya1Byb2R1Y3RzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LldPUktfUFJPRFVDVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChUYXNrKSBvYmplY3QpLmdldE1hbmRhdG9yeUlucHV0KCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQyKTsKLQkJCUxpc3QgYWRkSXRlbXNGaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoV29ya1Byb2R1Y3QpIGFkZEl0ZW1zLmdldChpKSkpKSB7Ci0JCQkJCWFkZEl0ZW1zRmlsdGVyZWQuYWRkKGFkZEl0ZW1zLmdldChpKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRhc2ssCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRPcHRpb25hbElucHV0KCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlMaXN0IGFkZEl0ZW1zRmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZEl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucygoKFdvcmtQcm9kdWN0KSBhZGRJdGVtcy5nZXQoaSkpKSkgewotCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLmFkZChhZGRJdGVtcy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhZGRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRhc2ssCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDMgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChUYXNrKSBvYmplY3QpLmdldE91dHB1dCgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfT3V0cHV0KCksIGFkZEl0ZW1zLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB0YXNrLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIHJtSXRlbXMsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMygpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVG9vbERlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWEyNDE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVG9vbERlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbERlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0b29sRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgVG9vbCB0b29sOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVG9vbERlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdG9vbCA9IChUb29sKSBjb250ZW50RWxlbWVudDsKLQkJc2V0RXh0ZXJuYWxJRE9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVG9vbCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQl0b29sKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRPT0xTOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVG9vbFRvb2xNZW50b3JzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWYyOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5HdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRvb2wgTWVudG9ycyBwYWdlIGluIHRoZSBUb29sIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xUb29sTWVudG9yc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidG9vbFRvb2xNZW50b3JzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVG9vbCB0b29sOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xUb29sTWVudG9yc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UT09MX01FTlRPUlNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0b29sID0gKFRvb2wpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvL3JldHVybiB0b29sLmdldFRvb2xNZW50b3JzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoCi0JCQkJCQljb250ZW50RWxlbWVudCwgYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZSh0b29sLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCBlbGVtZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0b29sLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksIGFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRvb2wsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ODhkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgQ2F0ZWdvcmllcyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogcmVtb3ZlIHRoZSB0by1vbmUgVUkgcmVzdHJpY3Rpb24gb24gd3AtZG9taWFuIChSMzk1MzkwKSAyMDA3LTA4LTMwCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNBVEVHT1JJRVNfUEFHRV9USVRMRSk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTModHJ1ZSk7Ci0JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgZG9tYWluID0gYWRkSXRlbXMuZ2V0KDApOwotCQkJTGlzdCBkb21haW5zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RG9tYWlucyh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAoZG9tYWlucyAhPSBudWxsICYmIGRvbWFpbnMuc2l6ZSgpID4gMCkJewotCQkJCU9iamVjdCBhc3NvY2lhdGVkRG9tYWluID0gZG9tYWlucy5nZXQoMCk7Ci0vLwkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotLy8JCQkJLmZvcm1hdCgKLS8vCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cywKLS8vCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQl3b3JrUHJvZHVjdC5nZXROYW1lKCksCi0vLwkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERvbWFpbiksCi0vLwkJCQkJCQkJKChEb21haW4pIGRvbWFpbikuZ2V0TmFtZSgpIH0pOwotLy8JCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLS8vCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0RvbWFpbihnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCShEb21haW4pIGRvbWFpbiwgd29ya1Byb2R1Y3QsIHVzZWRDYXRlZ29yaWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURvbWFpbigKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZG9tYWluLCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFdvcmtQcm9kdWN0VHlwZXMoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9Xb3JrUHJvZHVjdFR5cGUoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIHdwVHlwZSwgd29ya1Byb2R1Y3QsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbVdvcmtQcm9kdWN0VHlwZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgd3BUeXBlLCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHdvcmtQcm9kdWN0LCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcyKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmczKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRG9tYWluKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyMiA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMygpIHsKLQkJcmV0dXJuIGZpbHRlcjMgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVlZDZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVsaXZlcmFibGUgUGFydHMgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFTElWRVJBQkxFX1BBUlRTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJRGVsaXZlcmFibGUgd3AgPSAoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0OwotCQkJCXJldHVybiB3cC5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0IGl0ZW0gPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwgaXRlbSwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdCBpdGVtID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIGl0ZW0sCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQkvKgotCQkJICogQXJyYXlMaXN0KGJhZGxpc3QpIGlzIHVzZWQgdG8gc3RvcmUgYWxsCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgZm9yIHN1YnBhcnRzIG9mCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgY2FuIGJlIHJlamVjdGVkLiBEZWxpdmVyYWJsZSBjYW5ub3QKLQkJCSAqIGhvbGQgaW5mb3JtYXRpb24gdG8gd2hvIGl0c2VsZiBpcyBhY3RpbmcgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJCSAqLwotCQkJTGlzdCBiYWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQkvKiAKLQkJCQkJICogQ2hlY2sgRGVsaXZlcmFibGUgYW5kIERlbGl2ZXJhYmxlUGFydHMgYXNzb2NpYXRpb24KLQkJCQkJICogY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQkJCQkJKi8KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJJiYgd29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBjaGFpbmVkIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJCQkgKiAodHJlZSkgY29udGFpbiB3b3JrUHJvZHVjdCAoZWRpdG9yIG9iamVjdCkuCi0JCQkJCQkgKi8KLQkJCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBvYmosIChEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWNoZWNrVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBvYmosIGJhZGxpc3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBicm93c2UgdGhyb3VnaCBiYWRsaXN0IGFuZCBpdHMgZGVsaXZlcmFibGUgcGFydHMuCi0JCQkJCQlMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhZGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgYmFkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigoRGVsaXZlcmFibGUpIGJhZCwgdGVtcGxpc3QpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRlbXBsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIHJldHVybiB0cnVlIGlmIGFib3ZlIGNvbmRpdGlvbiBhcmUgc3VjY2Vzc2Z1bAotCQkJCQkgKi8KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3QgYmFkbGlzdCkgewotCi0JCS8qCi0JCSAqIENoZWNrIGVkaXRvciBvYmplY3QncyB2YXJpYWJpbGl0eSBiYXNlIG9iamVjdCBpcyBjaGlsZCBpbgotCQkgKiBEZWxpdmVyYWJsZShlKSB0cmVlLiB0aGVuIERlbGl2ZXJhYmxlKGUpc2hvdWxkbm90IGJlIGFjY2VwdGVkLiBEMSAtPgotCQkgKiBEMiAtPiBEMyAoIC0+IGluZGljYXRlcyBkZWxpdmVyYWJsZSBwYXJ0IHJlbGF0aW9uc2hpcCkgRDYgY29udHJpYnV0ZXMKLQkJICogRDMuIEQ2IGNhbm5vdCBzZWxlY3QgRDEsRDIgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJICovCi0JCWlmICh3b3JrUHJvZHVjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IHdvcmtQcm9kdWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhlLCAoRGVsaXZlcmFibGUpIG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgZWRpdG9yIERlbGl2ZXJhYmxlJ3MgZ2VuZXJhbGl6ZXIsIGlmIGdlbmVyYWxpemVyJ3Mgc3VicGFydHMKLQkJICogKHRyZWUpIGNvbnRhaW5zIHBhc3NlZCBkZWxpdmVyYWJsZS4gUmV0dXJuIGZhbHNlLgotCQkgKi8KLQotCQlJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHdvcmtQcm9kdWN0KTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIGdlbmVyYWxpemVyIGlzIGFkZGVkIHRvIGJhZGxpc3QsIGJlY2F1c2UgaWYgdmFyaWFiaWxpdHkgYmFzZQotCQkJCSAqIGlzIGZpbHRlcmVkIGJlZm9yZSBjb21pbmcgdG8gY2hpbGRBY2NlcHQob2JqZWN0KSBtZXRob2QsIHRoaXMKLQkJCQkgKiB3aWxsIHByZXZlbnRzIGFueSBzdWJwYXJ0cyBvZiBnZW5lcmFsaXplciB0byBiZSBhZGRlZCBhcyBhCi0JCQkJICogZGVsaXZlcmFibGUgcGFydCBvZiBEZWxpdmVyYWJsZSAoRWRpdG9yIG9iamVjdCBvciBsb2NhbAotCQkJCSAqIGRlZmluZWQgdmFyaWFibGUid29ya1Byb2R1Y3QiKS4KLQkJCQkgKiAKLQkJCQkgKiBlZzogRDEgLT4gRDIgLT4gRDMuICgtPiBpbmRpY2F0ZXMgZGVsaXZlcmFibGUgcGFydCkuIEQxCi0JCQkJICogY29udHJpYnV0ZXMgRDUuIGFuZCBENSdzIGRlbGl2ZXJhYmxlIHBhcnRzIGFzc2lnbiBmaWx0ZXIKLQkJCQkgKiBzaG91bGRub3Qgc2hvdyBEMiBhbmQgRDMuCi0JCQkJICogCi0JCQkJICovCi0JCQkJYmFkbGlzdC5hZGQodmUpOwotCQkJCWlmICh2ZS5lcXVhbHMoZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoIVVJSGVscGVyLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoZSwgKERlbGl2ZXJhYmxlKSB2ZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCS8qCi0JCSAqIAotCQkgKi8KLQkJaWYgKGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmogPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIG9iaiwKLQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBnZW5lcmFsaXplcidzIGRlbGl2ZXJhYmxlIHBhcnRzIGxpc3QgZG9ub3QgaGF2ZQotCQkgKiB3b3JrUHJvZHVjdC4KLQkJICovCi0JCUl0ZXJhdG9yIGl0MSA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGUpOwotCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHZlLmVxdWFscyhlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIHZlLAotCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgd29ya1Byb2R1Y3Qgb2JqZWN0IChlZGl0b3Igb2JqZWN0KSdzIHZhcmlhYmlsaXR5IGFuZCBpdHMKLQkJICogZGVsaXZlcmFibGVzIHNob3VsZCBub3QgY29udGFpbiBwYXNzZWQgb2JqZWN0LgotCQkgKi8KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCwgbGlzdCk7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QgdmFyaWFiaWxpdHkgYW5kIGl0cyBkZWxpdmVyYWJsZXMgc2hvdWxkIG5vdAotCQkgKiBjb250YWluIHdvcmtwcm9kdWN0KGRlbGl2ZXJhYmxlIG9yIGVkaXRvciBvYmplY3QpLiBJZiBpdCBjb250YWlucywKLQkJICogcGFzc2VkIG9iamVjdCBzaG91bGRub3QgYmUgYWNjZXB0ZWQuCi0JCSAqLwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBlLCBsaXN0KTsKLQkJaWYgKGxpc3QuY29udGFpbnMod29ya1Byb2R1Y3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsaXZlcmFibGVQYXJ0c1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBsaXN0ID0gKChEZWxpdmVyYWJsZSkgZSkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJaWYgKCgoRGVsaXZlcmFibGUpIG9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCXJvb3RzLmFkZCgoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoZSk7Ci0JCQkJCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0MQotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlbGl2ZXJhYmxlUGFydHNWYXJpYWJpbGl0eSgoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlJdGVyYXRvciBpdDEgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlKTsKLQkJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE1NjlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBXb3JrIFByb2R1Y3QgKEFydGlmYWN0LCBEZWxpdmVyYWJsZSBhbmQgT3V0Y29tZSkKLSAqIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9pbXBhY3Q7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3JlYXNvbjsKLQotCS8vIEZvciBBcnRpZmFjdAotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYnJpZWZfb3V0bGluZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9uczsKLQotCS8vIEZvciBEZWxpdmVyYWJsZQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZXh0ZXJuYWxfZGVzYywgY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2U7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3JlcHJlc2VudGF0aW9uOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9ub3RhdGlvbjsKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQkvLyBGb3Igc2xvdHMKLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3Nsb3RfYnV0dG9uOwotCQotCXByaXZhdGUgU2VjdGlvbiBzbG90U2VjdGlvbjsKLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBzbG90Q29tcG9zaXRlOwotCQotCXByaXZhdGUgU3RyaW5nIHNsb3RTZWN0aW9uRGVzY3JpcHRpb247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYWRkU2xvdEJ1dHRvbiwgcmVtb3ZlU2xvdEJ1dHRvbjsKLQkKLQlwcml2YXRlIFRhYmxlIGN0cmxfc2xvdDsKLQkKLQlwcml2YXRlIFRhYmxlVmlld2VyIHNsb3RWaWV3ZXI7Ci0KLQkvLyBzbG90cyBjb250ZW50IHByb3ZpZGVyCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBzbG90Q29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigpOwotCQkJbGlzdC5hZGRBbGwod29ya1Byb2R1Y3QuZ2V0RnVsZmlsbHMoKSk7Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBzbG90TGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvYmplY3QpOwotCQl9Ci0JfTsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudDsKLQkJcHVycG9zZU9uID0gdHJ1ZTsKLQkJZXh0ZXJuYWxJZE9uID0gdHJ1ZTsKLQkJaWYgKCEoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBPdXRjb21lKSkgewotCQkJbm90YXRpb25TZWN0aW9uT24gPSB0cnVlOwotCQl9Ci0JCXRhaWxvcmluZ1NlY3Rpb25PbiA9IHRydWU7Ci0JCWljb25TZWN0aW9uT24gPSB0cnVlOwotCQlzbG90U2VjdGlvbk9uID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkgewotCQlzdXBlci5jcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCk7Ci0KLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX09VVExJTkVfVEVYVCwgNDAsCi0JCQkJCTQwMCwgTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuUkVQUkVTRU5UQVRJT05fVEVYVCwgNDAsCi0JCQkJCTQwMCwgTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCQljdHJsX25vdGF0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTk9UQVRJT05fVEVYVCwgNDAsIDQwMCwKLQkJCQkJTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCX0gZWxzZSBpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJY3RybF9leHRlcm5hbF9kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCW5vdGF0aW9uQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSVRleHQuRVhURVJOQUxfREVTQ1JJUFRJT05fVEVYVCwgNDAsIDQwMCwKLQkJCQkJTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQkJdG9vbGtpdCwgbm90YXRpb25Db21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5QQUNLQUdJTkdfR1VJREFOQ0VfVEVYVCwgNDAsIDQwMCwKLQkJCQkJTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNjcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCk7Ci0JCWN0cmxfaW1wYWN0ID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJdGFpbG9yaW5nQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuSU1QQUNUX09GX05PVF9IQVZJTkdfVEVYVCwKLQkJCQk0MCwgNDAwLCBUQUlMT1JJTkdfU0VDVElPTl9JRCk7Ci0JCWN0cmxfcmVhc29uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJdGFpbG9yaW5nQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5SRUFTT05fRk9SX05PVF9ORUVESU5HX1RFWFQsIDQwLCA0MDAsCi0JCQkJVEFJTE9SSU5HX1NFQ1RJT05fSUQpOwotCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCQl0b29sa2l0LCB0YWlsb3JpbmdDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5SRVBSRVNFTlRBVElPTl9PUFRJT05TX1RFWFQsIDQwLCA0MDAsCi0JCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHNsb3Qgc2VjdGlvbgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2xvdFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCi0JCXNsb3RTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TTE9UX1NFQ1RJT05fTkFNRSwgdGhpcy5zbG90U2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJc2xvdENvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzbG90U2VjdGlvbik7Ci0JCXNsb3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXNsb3RDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKSk7Ci0JCWNyZWF0ZVNsb3RTZWN0aW9uQ29udGVudCgpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihzbG90Q29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2xvdFNlY3Rpb25Db250ZW50KCkgewotCQkKLQkJY3RybF9zbG90X2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHNsb3RDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3REZXNjcmlwdGlvblBhZ2Vfc2xvdF90ZXh0LAotCQkJCVNXVC5DSEVDSyk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDU7Ci0JCWN0cmxfc2xvdF9idXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHNsb3RDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2xvdHNMYWJlbF90ZXh0LCAyKTsKLQkJY3RybF9zbG90ID0gY3JlYXRlVGFibGUodG9vbGtpdCwgc2xvdENvbXBvc2l0ZSwgU1dULk1VTFRJCi0JCQkJfCBTV1QuUkVBRF9PTkxZLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcsCi0JCQkJNSwgMzAwLCAxLCAyKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWN0cmxfc2xvdC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXNsb3RWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zbG90KTsKLQkJc2xvdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoc2xvdENvbnRlbnRQcm92aWRlcik7Ci0JCXNsb3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzbG90TGFiZWxQcm92aWRlcik7Ci0JCXNsb3RWaWV3ZXIuc2V0SW5wdXQobWV0aG9kRWxlbWVudCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvblBhbmUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2xvdENvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCwgMSwgMSwgMSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlhZGRTbG90QnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IEJVVFRPTl9XSURUSDsKLQkJCWFkZFNsb3RCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJCi0JCXJlbW92ZVNsb3RCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5SRU1PVkVfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gQlVUVE9OX1dJRFRIOwotCQkJcmVtb3ZlU2xvdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlyZW1vdmVTbG90QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gYWRkIGFsbCBzbG90IHJlbGF0ZWQgbGlzdGVuZXJzCi0JCQotCQlpZiAoc2xvdFNlY3Rpb25PbikgewotCQkJYWRkU2xvdExpc3RlbmVycygpOwotCQl9Ci0JCQotCQkKLQkJaWYgKHB1cnBvc2VPbikgewotCQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJCWN0cmxfcHVycG9zZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9wdXJwb3NlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9wdXJwb3NlOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQdXJwb3NlKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJY3RybF9pbXBhY3Quc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9pbXBhY3Quc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkpOwotCQkJY3RybF9pbXBhY3QuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfaW1wYWN0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9pbXBhY3Q7Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCksCi0JCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZWFzb24uc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9yZWFzb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkpOwotCQkJY3RybF9yZWFzb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfcmVhc29uLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9yZWFzb247Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCksCi0JCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zCi0JCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMKLQkJCQkJCS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCQkJOiBjdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnM7Ci0JCQkJCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCQkJCQkJLmdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCQkJCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJCQkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpLAotCQkJCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJY3RybF9icmllZl9vdXRsaW5lLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfYnJpZWZfb3V0bGluZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpKTsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX2JyaWVmX291dGxpbmU7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QnJpZWZPdXRsaW5lKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkuZ2V0VGV4dCgpIDogY3RybF9icmllZl9vdXRsaW5lLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVwcmVzZW50YXRpb24uc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCTogY3RybF9yZXByZXNlbnRhdGlvbjsKLQkJCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRSZXByZXNlbnRhdGlvbigpOwotCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJLmdldFRleHQoKSA6IGN0cmxfcmVwcmVzZW50YXRpb24uZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX25vdGF0aW9uLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX25vdGF0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSk7Ci0JCQkJY3RybF9ub3RhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfbm90YXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX25vdGF0aW9uOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldE5vdGF0aW9uKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkuZ2V0VGV4dCgpIDogY3RybF9ub3RhdGlvbi5nZXRUZXh0KCk7Ci0JCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudAotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJY3RybF9leHRlcm5hbF9kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpKTsKLQkJCQljdHJsX2V4dGVybmFsX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX2V4dGVybmFsX2Rlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX2V4dGVybmFsX2Rlc2M7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCksCi0JCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZS5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZQotCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpKTsKLQkJCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZQotCQkJCQkJLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkJCTogY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2U7Ci0JCQkJCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCQkJCQkJLmdldFBhY2thZ2luZ0d1aWRhbmNlKCk7Ci0JCQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSwKLQkJCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIFNsb3QgTGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNsb3RMaXN0ZW5lcnMoKQl7Ci0JCS8vIHdvcmsgcHJvZHVjdCBzbG90IGNoZWNrIGJ1dHRvbgotCQljdHJsX3Nsb3RfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUJvb2xlYW4gaXNTbG90ID0gbmV3IEJvb2xlYW4oY3RybF9zbG90X2J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKGlzU2xvdC5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkvLyBpZiB0aGlzIGJlY29taW5nIGEgc2xvdCBpdHNlbGYKLQkJCQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGZ1bEZpbGxzID0gd29ya1Byb2R1Y3QKLQkJCQkJCQkuZ2V0RnVsZmlsbHMoKTsKLQkJCQkJaWYgKGZ1bEZpbGxzICE9IG51bGwgJiYgZnVsRmlsbHMuc2l6ZSgpICE9IDApIHsKLQkJCQkJCWJvb2xlYW4gdmFsID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2xvdENvbmZpcm1EaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMud3BGdWxGaWxsc0NvbmZpcm1EaWFsb2dfbWVzc2FnZSk7Ci0JCQkJCQlpZiAoIXZhbCkgewotCQkJCQkJCWN0cmxfc2xvdF9idXR0b24uc2V0U2VsZWN0aW9uKHdvcmtQcm9kdWN0Ci0JCQkJCQkJCQkuZ2V0SXNBYnN0cmFjdCgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJCQkJCXdvcmtQcm9kdWN0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCksCi0JCQkJCQkJCQlmdWxGaWxscywgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsJCQkJCQotCQkJCQlMaXN0IGZ1bEZpbGxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmdWxGaWxscy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0RnVsbEZpbGxzKHdvcmtQcm9kdWN0KSk7Ci0JCQkJCWlmIChmdWxGaWxscyAhPSBudWxsICYmIGZ1bEZpbGxzLnNpemUoKSAhPSAwKSB7Ci0JCQkJCQlib29sZWFuIHZhbCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNsb3RDb25maXJtRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLndwU2xvdEZ1bEZpbGxzQ29uZmlybURpYWxvZ19tZXNzYWdlKTsKLQkJCQkJCWlmICghdmFsKSB7Ci0JCQkJCQkJY3RybF9zbG90X2J1dHRvbi5zZXRTZWxlY3Rpb24od29ya1Byb2R1Y3QKLQkJCQkJCQkJCS5nZXRJc0Fic3RyYWN0KCkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZnVsRmlsbHMuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQkJCQl3cCwKLQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSwKLQkJCQkJCQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQotCQkJCX0KLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBtZXRob2RFbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCksIGlzU2xvdCwKLQkJCQkJCS0xKTsKLQkJCQkKLQkJCQlpZiAoaXNTbG90KSB7CQkKLQkJCQkJYWRkU2xvdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFkZFNsb3RCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZFNsb3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQkJCXJldHVybiAoKFdvcmtQcm9kdWN0KSBvYmopLmdldElzQWJzdHJhY3QoKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGFscmVhZHlFeGlzdGluZyA9IG5ldyBBcnJheUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigpOwotCQkJCWFscmVhZHlFeGlzdGluZy5hZGRBbGwod29ya1Byb2R1Y3QuZ2V0RnVsZmlsbHMoKSk7Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLCBhbHJlYWR5RXhpc3RpbmcpOwotCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZShmYWxzZSk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCQotCQkJCWlmIChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuc2l6ZSgpID4gMCkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSwgZmQKLQkJCQkJCQkJCS5nZXRTZWxlY3RlZEl0ZW1zKCksIC0xKTsKLQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkvLyByZWZyZXNoIHNsb3Qgdmlld2VyCi0JCQkJCXNsb3RWaWV3ZXIucmVmcmVzaCgpOwkKLQkJCQl9CQkKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZW1vdmVTbG90QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzbG90Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLAotCQkJCQkJCXNlbGVjdGlvbi50b0xpc3QoKSwgLTEpOwotCQkJCQkKLQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkvLyByZWZyZXNoIHNsb3Qgdmlld2VyCi0JCQkJCXNsb3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQlyZW1vdmVTbG90QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0JCi0JCX0pOwotCQkKLQkJc2xvdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzbG90Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmICFUbmdVdGlsLmlzTG9ja2VkKHdvcmtQcm9kdWN0KSkgewotCQkJCQlyZW1vdmVTbG90QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCQotCQlpZiAoc2xvdFNlY3Rpb25PbikgIHsKLQkJCWN0cmxfc2xvdF9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkKLQkJCUJvb2xlYW4gaXNBYnN0cmFjdCA9IHdvcmtQcm9kdWN0LmdldElzQWJzdHJhY3QoKTsKLQkJCWlmIChpc0Fic3RyYWN0ICE9IG51bGwgJiYgZWRpdGFibGUpIHsKLQkJCQlpZiAoaXNBYnN0cmFjdC5ib29sZWFuVmFsdWUoKSkgIHsKLQkJCQkJYWRkU2xvdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRTbG90QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCWFkZFNsb3RCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2xvdFZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJCXJlbW92ZVNsb3RCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlU2xvdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJY3RybF9pbXBhY3Quc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF9yZWFzb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpCi0JCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJY3RybF9icmllZl9vdXRsaW5lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCQljdHJsX25vdGF0aW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCX0KLQkJCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJY3RybF9leHRlcm5hbF9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0KLQkJLy8gSXNBYnN0cmFjdCBhdHRyaWJ1dGUKLQkJaWYgKHNsb3RTZWN0aW9uT24pIHsKLQkJCUJvb2xlYW4gaXNBYnN0cmFjdCA9IHdvcmtQcm9kdWN0LmdldElzQWJzdHJhY3QoKTsKLQkJCWlmIChpc0Fic3RyYWN0ICE9IG51bGwpIHsKLQkJCQljdHJsX3Nsb3RfYnV0dG9uLnNldFNlbGVjdGlvbihpc0Fic3RyYWN0LmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0gZWxzZQotCQkJCWN0cmxfc2xvdF9idXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCi0JCQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24gY29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0KLQkJaWYgKHB1cnBvc2VPbikgewotCQkJU3RyaW5nIHB1cnBvc2UgPSBjb250ZW50LmdldFB1cnBvc2UoKTsKLQkJCWN0cmxfcHVycG9zZS5zZXRUZXh0KHB1cnBvc2UgPT0gbnVsbCA/ICIiIDogcHVycG9zZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQlTdHJpbmcgaW1wYWN0ID0gY29udGVudC5nZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCQkJU3RyaW5nIHJlYXNvbiA9IGNvbnRlbnQuZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJCWN0cmxfaW1wYWN0LnNldFRleHQoaW1wYWN0ID09IG51bGwgPyAiIiA6IGltcGFjdCk7IC8vJE5PTi1OTFMtMSQJCi0JCQljdHJsX3JlYXNvbi5zZXRUZXh0KHJlYXNvbiA9PSBudWxsID8gIiIgOiByZWFzb24pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucwotCQkJCQkJLnNldFRleHQoKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkJCQkuZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPT0gbnVsbCA/ICIiIDogKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCQotCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUKLQkJCQkJCS5zZXRUZXh0KCgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJCQkJLmdldEJyaWVmT3V0bGluZSgpID09IG51bGwgPyAiIiA6ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0QnJpZWZPdXRsaW5lKCkpOyAvLyROT04tTkxTLTEkCQkJCi0JCQkJY3RybF9yZXByZXNlbnRhdGlvbgotCQkJCQkJLnNldFRleHQoKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkJCQkuZ2V0UmVwcmVzZW50YXRpb24oKSA9PSBudWxsID8gIiIgOiAoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpLmdldFJlcHJlc2VudGF0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9ub3RhdGlvbgotCQkJCQkJLnNldFRleHQoKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXROb3RhdGlvbigpID09IG51bGwgPyAiIiA6ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0Tm90YXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYwotCQkJCQkJLnNldFRleHQoKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkJCQkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpID09IG51bGwgPyAiIiA6ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlCi0JCQkJCQkuc2V0VGV4dCgoKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkJCS5nZXRQYWNrYWdpbmdHdWlkYW5jZSgpID09IG51bGwgPyAiIiA6ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkuZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCkgewotCQkJTGlzdCBiYWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QKLQkJCQkJCQkJJiYgKChDb250ZW50RWxlbWVudCkgZ2V0SGVscGVyKCkKLQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnQoKSkuZ2V0VHlwZSgpLmVxdWFscygKLQkJCQkJCQkJCQkoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldFR5cGUoKSkpIHsKLQkJCQkJCQkvLyBwcmV2ZW50IGNpcmN1bGFyIGRlcGVuZGVuY3kgZnJvbSBkZWxpdmVyYWJsZQotCQkJCQkJCS8vIHBhcnRzIGFuZCB2YXJpYWJpbGl0eQotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZQotCQkJCQkJCQkJJiYgd29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJCQlpZiAoIVVJSGVscGVyLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoCi0JCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBvYmosCi0JCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpIHsKLQkJCQkJCQkJCWJhZGxpc3QuYWRkKG9iaik7Ci0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCgoRGVsaXZlcmFibGUpIG9iaikKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICghVUlIZWxwZXIKLQkJCQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoCi0JCQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSAoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbAotCQkJCQkJCQkJCS5nZXRHZW5lcmFsaXplcnMoKERlbGl2ZXJhYmxlKSBvYmopOwotCQkJCQkJCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxCi0JCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQlpZiAodmUgIT0gbnVsbCkgewotCQkJCQkJCQkJCWlmICh2ZS5lcXVhbHMob2JqKSkKLQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJCWlmICghVUlIZWxwZXIKLQkJCQkJCQkJCQkJCS5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKAotCQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHZlLAotCQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0KSkgewotCQkJCQkJCQkJCQliYWRsaXN0LmFkZChvYmopOwotCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gYnJvd3NlIHRocm91Z2ggYmFkbGlzdCBhbmQgaXRzIGRlbGl2ZXJhYmxlCi0JCQkJCQkJCS8vIHBhcnRzLgotCQkJCQkJCQlMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmFkbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlPYmplY3QgYmFkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJVUlIZWxwZXIuZGVsaXZlcmFibGVQYXJ0c0NoYWluKAotCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIGJhZCwgdGVtcGxpc3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICh0ZW1wbGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENvbnRlbnRGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJd29ya1Byb2R1Y3QpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnNsb3RTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9zbG90U2VjdGlvbl9kZXNjOwotCQl9Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5zbG90U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9zbG90U2VjdGlvbl9kZXNjOwotCQl9Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnNsb3RTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9zbG90U2VjdGlvbl9kZXNjOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0R3VpZGFuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0R3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGUzOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdEd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdEd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIFVJSGVscGVyLmdldFNlbGVjdGVkR3VpZGFuY2VzKHdvcmtQcm9kdWN0KTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gVGhlIGd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIChQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgd29ya1Byb2R1Y3QuZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHdvcmtQcm9kdWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIFRoZSBndWlkYW5jZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCAoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLAotCQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUZW1wbGF0ZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgd29ya1Byb2R1Y3QuZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHdvcmtQcm9kdWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXBvcnQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFJvbGVzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFJvbGVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE5NTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RSb2xlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGVzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gV29ya1Byb2R1Y3RSb2xlc0Zvcm1QYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFJvbGVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdFJvbGVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Um9sZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUk9MRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMShmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZXMoKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSBhZGRJdGVtcy5nZXQoMCk7Ci0JCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUocm9sZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB3b3JrUHJvZHVjdCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCByb2xlLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLAotCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLS8vCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRSZXNwb25zaWJsZVJvbGUoZ2V0QWN0aW9uTWFuYWdlcigpLAotLy8JCQkJCXdvcmtQcm9kdWN0LCBudWxsKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRlci5uZXh0KCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgcm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFRhc2tzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFRhc2tzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTY1OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVGFza3MgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUYXNrc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RUYXNrc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFRhc2tzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlRBU0tTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldEFsbG93Q2hhbmdlMShmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMihmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG9UYXNrcygKLQkJCQkJCShXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZDIpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnModGFzaykpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGF2YWlsYWJsZVRhc2tzTGlzdCA9IExpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRBdmFpbGFibGVUYXNrcyh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKGF2YWlsYWJsZVRhc2tzTGlzdCAhPSBudWxsICYmIGF2YWlsYWJsZVRhc2tzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYXZhaWxhYmxlVGFza3NMaXN0Lml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAodGFzay5nZXRPcHRpb25hbElucHV0KCkuY29udGFpbnMod29ya1Byb2R1Y3QpKQotCQkJCQkJCXNlbGVjdGVkVGFza3MuYWRkKHRhc2spOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzZWxlY3RlZFRhc2tzLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnModGFzaykpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDMgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0dGluZ1Rhc2tzKAotCQkJCQkJKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCB3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIHdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODMwODgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIFdvcmsgcHJvZHVjdCBUeXBlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3RUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEV4dGVybmFsSURPbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXdvcmtQcm9kdWN0VHlwZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDAyOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFdvcmsgUHJvZHVjdHMgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IFR5cGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdFR5cGUgd29ya1Byb2R1Y3RUeXBlOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3RUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCS8vcmV0dXJuICgoV29ya1Byb2R1Y3RUeXBlKSBvYmplY3QpLmdldFdvcmtQcm9kdWN0cygpLnRvQXJyYXkoKTsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZLAotCQkJCQkJCWdldE9yZGVyRmVhdHVyZSgpKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKGNvbnRlbnRFbGVtZW50LCAKLQkJCQkJCWFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB3b3JrUHJvZHVjdFR5cGUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQkJYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgd29ya1Byb2R1Y3RUeXBlLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJaWYgKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0T3JkZXJGZWF0dXJlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2RlbFN0cnVjdHVyZVBhdGgoKSB7Ci0JCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3MzcxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGZvcm0gcGFnZXMgZm9yIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgZWRpdG9ycy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0lQcm9ibGVtQ2hhbmdlZExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0lQcm9ibGVtQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzhlOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgewotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHByb2JsZW1zIGNoYW5nZWQuIFRoaXMgY2FsbCBpcyBwb3N0ZWQgaW4gYW4gYXluY2ggZXhlYywgdGhlcmVmb3JlIHBhc3NlZAotCSAqIHJlc291cmNlcyBtdXN0IG5vdCBleGlzdC4KLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcyAgQSBzZXQgd2l0aCBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdGhhdAotCSAqIGRlc2NyaWJlIHRoZSByZXNvdXJjZXMgdGhhdCBoYWQgYW4gcHJvYmxlbSBjaGFuZ2UuCi0JICogQHBhcmFtIGlzTWFya2VyQ2hhbmdlIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGNoYW5nZSB3YXMgYSBtYXJrZXIgY2hhbmdlLCBpZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGNoYW5nZSBjYW1lIGZyb20gYW4gYW5ub3RhdGlvbiBtb2RlbCBtb2RpZmljYXRpb24uCi0JICovCi0Jdm9pZCBwcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBpc01hcmtlckNoYW5nZSk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Mzg1MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JbWFnZURlc2NyaXB0b3JSZWdpc3RyeQotICoKLSAqLwotcHVibGljIGNsYXNzIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgSGFzaE1hcDxJbWFnZURlc2NyaXB0b3IsIEltYWdlPiBmUmVnaXN0cnk9IG5ldyBIYXNoTWFwPEltYWdlRGVzY3JpcHRvciwgSW1hZ2U+KDEwKTsKLQlwcml2YXRlIERpc3BsYXkgZkRpc3BsYXk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGUgY3VycmVudCBvciBkZWZhdWx0IGRpc3BsYXksCi0JICogcmVzcGVjdGl2ZWx5LgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJdGhpcyhBdXRob3JpbmdVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhlIGdpdmVuIGRpc3BsYXkuIEFsbCBpbWFnZXMKLQkgKiBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkgd2lsbCBiZSBkaXNwb3NlZCB3aGVuIHRoZSBkaXNwbGF5IGdldHMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdGhlIGltYWdlcyBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkgYXJlIGFsbG9jYXRlZCBmb3IgCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KERpc3BsYXkgZGlzcGxheSkgewotCQlmRGlzcGxheT0gZGlzcGxheTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmRGlzcGxheSk7Ci0JCWhvb2tEaXNwbGF5KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW1hZ2UgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3Igd2hpY2ggdGhlIHJlZ2lzdHJ5IG1hbmFnZXMgYW4gaW1hZ2UKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlIGRlc2NyaXB0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgaWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2FuJ3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgaW1hZ2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldChJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotCQkJZGVzY3JpcHRvcj0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQotCQlJbWFnZSByZXN1bHQ9IChJbWFnZSlmUmVnaXN0cnkuZ2V0KGRlc2NyaXB0b3IpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQotCQlBc3NlcnQuaXNUcnVlKGZEaXNwbGF5ID09IEF1dGhvcmluZ1VJUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpLCAiQWxsb2NhdGluZyBpbWFnZSBmb3Igd3JvbmcgZGlzcGxheS4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQ9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJZlJlZ2lzdHJ5LnB1dChkZXNjcmlwdG9yLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBpbWFnZXMgbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5LgotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGZSZWdpc3RyeS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlJbWFnZSBpbWFnZT0gKEltYWdlKWl0ZXIubmV4dCgpOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCWZSZWdpc3RyeS5jbGVhcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaG9va0Rpc3BsYXkoKSB7Ci0JCWZEaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9CQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzg2NGRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JbWFnZUltYWdlRGVzY3JpcHRvcgotICoKLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEltYWdJbWFnZURlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEltYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlIGltYWdlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJbWFnZT0gaW1hZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSW1hZ2VEZXNjcmlwdG9yI2dldEltYWdlRGF0YSgpCi0JICovCi0JcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0JCXJldHVybiBmSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIChvYmogIT0gbnVsbCkgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpICYmIGZJbWFnZS5lcXVhbHMoKChJbWFnZUltYWdlRGVzY3JpcHRvcilvYmopLmZJbWFnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkltYWdlLmhhc2hDb2RlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZTc4MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkphdmFFZGl0b3JFcnJvclRpY2tVcGRhdGVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgaW1wbGVtZW50cyBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRFZGl0b3IgZk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyOwotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyKE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZk1ldGhvZEVsZW1lbnRFZGl0b3I9IGVkaXRvcjsKLQkJZkxhYmVsUHJvdmlkZXI9IG5ldyBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyKCk7Ci0JCWZMYWJlbFByb3ZpZGVyLmFkZExhYmVsRGVjb3JhdG9yKG5ldyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKG51bGwpKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIjcHJvYmxlbXNDaGFuZ2VkKElSZXNvdXJjZVtdLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCWlmICghaXNNYXJrZXJDaGFuZ2UpCi0JCQlyZXR1cm47Ci0KLQkJSUVkaXRvcklucHV0IGlucHV0PSBmTWV0aG9kRWxlbWVudEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsgLy8gbWlnaHQgcnVuIGFzeW5jLCB0ZXN0cyBuZWVkZWQKLQkJCU1ldGhvZEVsZW1lbnQgbWVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJaWYgKG1lbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW1lbGVtZW50ID0gKChQcm9jZXNzQ29tcG9uZW50KSBtZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKG1lbGVtZW50ICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2U9IFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShtZWxlbWVudCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjaGFuZ2VkUmVzb3VyY2VzW2ldLmVxdWFscyhyZXNvdXJjZSkpIHsKLQkJCQkJCXVwZGF0ZUVkaXRvckltYWdlKG1lbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVkaXRvckltYWdlKE1ldGhvZEVsZW1lbnQgbWVsZW1lbnQpIHsKLQkJSW1hZ2UgdGl0bGVJbWFnZT0gZk1ldGhvZEVsZW1lbnRFZGl0b3IuZ2V0VGl0bGVJbWFnZSgpOwotCQlpZiAodGl0bGVJbWFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW1hZ2UgbmV3SW1hZ2U7Ci0JCW5ld0ltYWdlPSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShtZWxlbWVudCk7Ci0JCWlmICh0aXRsZUltYWdlICE9IG5ld0ltYWdlKSB7Ci0JCQlwb3N0SW1hZ2VDaGFuZ2UobmV3SW1hZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvc3RJbWFnZUNoYW5nZShmaW5hbCBJbWFnZSBuZXdJbWFnZSkgewotCQlTaGVsbCBzaGVsbD0gZk1ldGhvZEVsZW1lbnRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCk7Ci0JCWlmIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmTWV0aG9kRWxlbWVudEVkaXRvci51cGRhdGVkVGl0bGVJbWFnZShuZXdJbWFnZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4MjIyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0vKioKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQkKLQkvKiogRmxhZyB0byByZW5kZXIgdGhlIGVycm9yIGFkb3JubWVudC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUj0JCQkweDA0MDsKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBpbnQgZkZsYWdzOwotCXByaXZhdGUgUG9pbnQgZlNpemU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKLQkgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBhZG9ybm1lbnRzIGFyZSB0byBiZSByZW5kZXJlZC4gU2VlIDxjb2RlPnNldEFkb3JubWVudHM8L2NvZGU+Ci0JICogCWZvciB2YWxpZCB2YWx1ZXMuCi0JICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBpbWFnZQotCSAqIEBzZWUgI3NldEFkb3JubWVudHMoaW50KQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBiYXNlSW1hZ2UsIGludCBmbGFncywgUG9pbnQgc2l6ZSkgewotCQlmQmFzZUltYWdlPSBiYXNlSW1hZ2U7Ci0JCUFzc2VydC5pc05vdE51bGwoZkJhc2VJbWFnZSk7Ci0JCWZGbGFncz0gZmxhZ3M7Ci0JCUFzc2VydC5pc1RydWUoZkZsYWdzID49IDApOwotCQlmU2l6ZT0gc2l6ZTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmU2l6ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0b3JzIGFkb3JubWVudHMuIFZhbGlkIHZhbHVlcyBhcmU6IDxjb2RlPkFCU1RSQUNUPC9jb2RlPiwgPGNvZGU+RklOQUw8L2NvZGU+LAotCSAqIDxjb2RlPlNZTkNIUk9OSVpFRDwvY29kZT4sIDwvY29kZT5TVEFUSUM8Y29kZT4sIDwvY29kZT5SVU5OQUJMRTxjb2RlPiwgPC9jb2RlPldBUk5JTkc8Y29kZT4sIAotCSAqIDwvY29kZT5FUlJPUjxjb2RlPiwgPC9jb2RlPk9WRVJSSURERVM8Y29kZT4sIDxjb2RlPklNUExFTUVOVFM8L2NvZGU+LCA8Y29kZT5DT05TVFJVQ1RPUjwvY29kZT4sCi0JICogPGNvZGU+REVQUkVDQVRFRDwvY29kZT4sICBvciBhbnkgY29tYmluYXRpb24gb2YgdGhvc2UuCi0JICogCi0JICogQHBhcmFtIGFkb3JubWVudHMgdGhlIGltYWdlIGRlc2NyaXB0b3JzIGFkb3JubWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG9ybm1lbnRzKGludCBhZG9ybm1lbnRzKSB7Ci0JCUFzc2VydC5pc1RydWUoYWRvcm5tZW50cyA+PSAwKTsKLQkJZkZsYWdzPSBhZG9ybm1lbnRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWRvcm5tZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGFkb3JubWVudHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFkcm9ubWVudHMoKSB7Ci0JCXJldHVybiBmRmxhZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgY3JlYXRlZCBieSBjYWxsaW5nIDxjb2RlPmNyZWF0ZUltYWdlKCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBpbWFnZSByZXR1cm5lZCBmcm9tIGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4KLQkgKiBAc2VlIEltYWdlRGVzY3JpcHRvciNjcmVhdGVJbWFnZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VTaXplKFBvaW50IHNpemUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzaXplKTsKLQkJQXNzZXJ0LmlzVHJ1ZShzaXplLnggPj0gMCAmJiBzaXplLnkgPj0gMCk7Ci0JCWZTaXplPSBzaXplOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBjcmVhdGVkIGJ5IGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgY3JlYXRlZCBieSBjYWxsaW5nIDxjb2RlPmNyZWF0ZUltYWdlKCk8L2NvZGU+Ci0JICogQHNlZSBJbWFnZURlc2NyaXB0b3IjY3JlYXRlSW1hZ2UoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRJbWFnZVNpemUoKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZlNpemUueCwgZlNpemUueSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8ICFNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLmNsYXNzLmVxdWFscyhvYmplY3QuZ2V0Q2xhc3MoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvciBvdGhlcj0gKE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3Ipb2JqZWN0OwotCQlyZXR1cm4gKGZCYXNlSW1hZ2UuZXF1YWxzKG90aGVyLmZCYXNlSW1hZ2UpICYmIGZGbGFncyA9PSBvdGhlci5mRmxhZ3MgJiYgZlNpemUuZXF1YWxzKG90aGVyLmZTaXplKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmQmFzZUltYWdlLmhhc2hDb2RlKCkgfCBmRmxhZ3MgfCBmU2l6ZS5oYXNoQ29kZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnPSBnZXRJbWFnZURhdGEoZkJhc2VJbWFnZSk7Ci0JCQkKLQkJCi0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0JCQkJCi0JCWRyYXdUb3BSaWdodCgpOwotCQlkcmF3Qm90dG9tUmlnaHQoKTsKLQkJZHJhd0JvdHRvbUxlZnQoKTsKLQkJCi0KLQl9Ci0JCi0JcHJpdmF0ZSBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUltYWdlRGF0YSBkYXRhPSBkZXNjcmlwdG9yLmdldEltYWdlRGF0YSgpOyAvLyBzZWUgYnVnIDUxOTY1OiBnZXRJbWFnZURhdGEgY2FuIHJldHVybiBudWxsCi0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWRhdGE9IERFRkFVTFRfSU1BR0VfREFUQTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW1hZ2UgZGF0YSBub3QgYXZhaWxhYmxlOiAiICsgZGVzY3JpcHRvci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgZHJhd1RvcFJpZ2h0KCkgewkJCi0JfQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGRyYXdCb3R0b21SaWdodCgpIHsKLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgZHJhd0JvdHRvbUxlZnQoKSB7Ci0JCVBvaW50IHNpemU9IGdldFNpemUoKTsKLQkJaW50IHg9IDA7Ci0JCWlmICgoZkZsYWdzICYgRVJST1IpICE9IDApIHsKLQkJCUltYWdlRGF0YSBkYXRhPSBnZXRJbWFnZURhdGEoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfT1ZSX0VSUk9SKTsKLQkJCWRyYXdJbWFnZShkYXRhLCB4LCBzaXplLnkgLSBkYXRhLmhlaWdodCk7Ci0JCQl4Kz0gZGF0YS53aWR0aDsKLQkJfQotCX0JCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9Qcm9ibGVtTWFya2VyTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9Qcm9ibGVtTWFya2VyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjIyMzA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvUHJvYmxlbU1hcmtlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIExpc3RlbnMgdG8gcmVzb3VyY2UgZGVsdGFzIGFuZCBmaWx0ZXJzIGZvciBtYXJrZXIgY2hhbmdlcyBvZiB0eXBlIElNYXJrZXIuUFJPQkxFTQotICogVmlld2VycyBzaG93aW5nIGVycm9yIHRpY2tzIHNob3VsZCByZWdpc3RlciBhcyBsaXN0ZW5lciB0bwotICogdGhpcyB0eXBlLgotICogCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LlByb2JsZW1NYXJrZXJNYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ibGVtTWFya2VyTWFuYWdlciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFZpc2l0b3JzIHVzZWQgdG8gbG9vayBpZiB0aGUgZWxlbWVudCBjaGFuZ2UgZGVsdGEgY29udGFpbnMgYSBtYXJrZXIgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByb2plY3RFcnJvclZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JCXByaXZhdGUgSGFzaFNldDxJUmVzb3VyY2U+IGZDaGFuZ2VkRWxlbWVudHM7IAotCQkKLQkJcHVibGljIFByb2plY3RFcnJvclZpc2l0b3IoSGFzaFNldDxJUmVzb3VyY2U+IGNoYW5nZWRFbGVtZW50cykgewotCQkJZkNoYW5nZWRFbGVtZW50cz0gY2hhbmdlZEVsZW1lbnRzOwotCQl9Ci0JCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXM9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QgJiYgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0PSAoSVByb2plY3QpIHJlczsKLQkJCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJLy8gb25seSB0cmFjayBvcGVuIEphdmEgcHJvamVjdHMKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWNoZWNrSW52YWxpZGF0ZShkZWx0YSwgcmVzKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY2hlY2tJbnZhbGlkYXRlKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWludCBraW5kPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8IGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBpc0Vycm9yRGVsdGEoZGVsdGEpKSkgewotCQkJCS8vIGludmFsaWRhdGUgdGhlIHJlc291cmNlIGFuZCBhbGwgcGFyZW50cwotCQkJCXdoaWxlIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlJPT1QgJiYgZkNoYW5nZWRFbGVtZW50cy5hZGQocmVzb3VyY2UpKSB7Ci0JCQkJCXJlc291cmNlPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQl9IAotCQl9CQotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGlzRXJyb3JEZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewkKLQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpICE9IDApIHsKLQkJCQlJTWFya2VyRGVsdGFbXSBtYXJrZXJEZWx0YXM9IGRlbHRhLmdldE1hcmtlckRlbHRhcygpOwotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBtYXJrZXJEZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG1hcmtlckRlbHRhc1tpXS5pc1N1YnR5cGVPZihJTWFya2VyLlBST0JMRU0pKSB7Ci0JCQkJCQlpbnQga2luZD0gbWFya2VyRGVsdGFzW2ldLmdldEtpbmQoKTsKLQkJCQkJCWlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkFEREVEIHx8IGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWludCBzZXZlcml0eT0gbWFya2VyRGVsdGFzW2ldLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCAtMSk7Ci0JCQkJCQlpbnQgbmV3U2V2ZXJpdHk9IG1hcmtlckRlbHRhc1tpXS5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJCQkJaWYgKG5ld1NldmVyaXR5ICE9IHNldmVyaXR5KQotCQkJCQkJCXJldHVybiB0cnVlOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnM7Ci0JCi0JCi0JcHVibGljIFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkgewotCQlmTGlzdGVuZXJzPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSGFzaFNldDxJUmVzb3VyY2U+IGNoYW5nZWRFbGVtZW50cz0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigpOwotCQkKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpCi0JCQkJZGVsdGEuYWNjZXB0KG5ldyBQcm9qZWN0RXJyb3JWaXNpdG9yKGNoYW5nZWRFbGVtZW50cykpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCWlmICghY2hhbmdlZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJSVJlc291cmNlW10gY2hhbmdlcz0gKElSZXNvdXJjZVtdKSBjaGFuZ2VkRWxlbWVudHMudG9BcnJheShuZXcgSVJlc291cmNlW2NoYW5nZWRFbGVtZW50cy5zaXplKCldKTsKLQkJCWZpcmVDaGFuZ2VzKGNoYW5nZXMsIHRydWUpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElBbm5vdGF0aW9uTW9kZWxMaXN0ZW5lciNtb2RlbENoYW5nZWQoSUFubm90YXRpb25Nb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSUFubm90YXRpb25Nb2RlbCBtb2RlbCkgewotCQkvLyBubyBhY3Rpb24KLQl9CQotCQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgcHJvYmxlbSBtYXJrZXIgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkpIHsgCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIDxjb2RlPklQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPC9jb2RlPi4KLQkgKi8JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaXJlQ2hhbmdlcyhmaW5hbCBJUmVzb3VyY2VbXSBjaGFuZ2VzLCBmaW5hbCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCURpc3BsYXkgZGlzcGxheT0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCi0JCQkJCU9iamVjdFtdIGxpc3RlbmVycz0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgY3Vycj0gKElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJCQljdXJyLnByb2JsZW1zQ2hhbmdlZChjaGFuZ2VzLCBpc01hcmtlckNoYW5nZSk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfSk7Ci0JCX0JCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhNTFiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgdGhlIG5hbWUsIGJyaWVmIGRlc2NyaXB0aW9uIGFuZAotICogdHlwZSBmb3IgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlNYWluUGFnZTIgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld0xpYnJhcnlNYWluUGFnZTIuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJ0eXBlSWQiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbltdIHJhZGlvQnV0dG9uczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlNYWluUGFnZTIoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQluYW1lTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkoKEdyaWREYXRhKSBuYW1lVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlMYWJlbCBicmllZkRlc2NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQlicmllZkRlc2NMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCk7Ci0JCWJyaWVmRGVzY1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gNzA7Ci0JCSgoR3JpZERhdGEpIGJyaWVmRGVzY1RleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSA0ODA7Ci0KLQkJTGFiZWwgbGlicmFyeVR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQlsaWJyYXJ5VHlwZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubGlicmFyeVR5cGVMYWJlbF90ZXh0KTsKLQotCQlDb21wb3NpdGUgdHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlNYXAgdHlwZXMgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5VHlwZXMoKTsKLQkJcmFkaW9CdXR0b25zID0gbmV3IEJ1dHRvblt0eXBlcy5zaXplKCldOwotCQlpbnQgcmFkaW9CdXR0b25JbmRleCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0eXBlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdHlwZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0gKFN0cmluZykgdHlwZXMuZ2V0KHR5cGVJZCk7Ci0JCQlCdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKHR5cGVDb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCQlyYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXJhZGlvQnV0dG9uLnNldFRleHQodHlwZU5hbWUpOwotCQkJcmFkaW9CdXR0b24uc2V0RGF0YShUWVBFX0lELCB0eXBlSWQpOwotCQkJcmFkaW9CdXR0b25zW3JhZGlvQnV0dG9uSW5kZXgrK10gPSByYWRpb0J1dHRvbjsKLQkJfQotCi0JCWlmIChyYWRpb0J1dHRvbnMubGVuZ3RoID4gMCkgewotCQkJcmFkaW9CdXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZSB3aXphcmRQYWdlID0gTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuZ2V0V2l6YXJkUGFnZShnZXRMaWJyYXJ5VHlwZSgpKTsKLQkJaWYgKHdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJd2l6YXJkUGFnZS5vbkVudGVyUGFnZShnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbGlzdGVuZXJzIHRvIHRoZSB3aXphcmQgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlUeXBlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9ucy5sZW5ndGg7IGkrKykgewotCQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gcmFkaW9CdXR0b25zW2ldOwotCQkJaWYgKHJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIHJhZGlvQnV0dG9uLmdldERhdGEoVFlQRV9JRCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmcpIHJhZGlvQnV0dG9uc1swXS5nZXREYXRhKFRZUEVfSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmQyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3ZDIxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TGlicmFyeU1haW5QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlXaXphcmQyIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE5ld0xpYnJhcnlXaXphcmQyLmNsYXNzLmdldE5hbWUoKTsKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByaXZhdGUgTmV3TGlicmFyeU1haW5QYWdlIG1haW5QYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZDIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIG51bGwpOwotCQltYWluUGFnZSA9IG5ldyBOZXdMaWJyYXJ5TWFpblBhZ2UoKTsKLQkJYWRkUGFnZShtYWluUGFnZSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldExpYnJhcnlUeXBlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwZXJzaXN0ZW5jZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJU3RyaW5nIHBhZ2VJZCA9IHBlcnNpc3RlbmNlSWQgKyAiUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkJCU5ld0xpYnJhcnlXaXphcmRQYWdlIHBhZ2UgPSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkKLQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlV2l6YXJkUGFnZShwYWdlSWQsIHBlcnNpc3RlbmNlSWQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCi0JCQkJYWRkUGFnZShwYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcGFnZXNbaV0uaXNQYWdlQ29tcGxldGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBtYWluUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIG5hbWUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5TmFtZSgpOwotCQlTdHJpbmcgdHlwZSA9IG1haW5QYWdlLmdldExpYnJhcnlUeXBlKCk7Ci0JCU5ld0xpYnJhcnlXaXphcmRQYWdlIHBhZ2UgPSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRXaXphcmRQYWdlKHR5cGUpOwotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLCB0eXBlLCBwYWdlLmdldFNlbGVjdGlvbnMoKSk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJYWRkUmVjZW50bHlPcGVuZWRMaWJyYXJ5KGxpYnJhcnkpOwotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOyAgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBuZXdseSBvcGVuZWQgb3IgY3JlYXRlZCBtZXRob2QgbGlicmFyeSB0byB0aGUgcmVjZW50bHkgb3BlbmVkCi0JICogbWV0aG9kIGxpYnJhcmllcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVjZW50bHlPcGVuZWRMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbGlicmFyeVVSSSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIoCi0JCQkJCWxpYnJhcnkpLmdldE1ldGhvZExpYnJhcnlVUkkoKS50b1N0cmluZygpOwotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYWRkT3BlbkxpYnJhcnlVUkkobGlicmFyeVVSSSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZWJiMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBVSSBzZXJ2aWNlcyBmb3IgdGhlIEF1dGhvcmluZyBhbmQgQnJvd3NpbmcgcGVyc3BlY3RpdmVzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0FwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODA1ZWVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZUNvbnN0YW50czsKLQotLyoqCi0gKiAKLSAqIFByZWZlcmVuY2UgY29uc3RhbnRzIGZvciBhcHBsaWNhdGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cyBpbXBsZW1lbnRzIFByZWZlcmVuY2VDb25zdGFudHMgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRU5BQkxFX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT047Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MSUJfVklFV19MQVlPVVQgPSAibGF5b3V0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTElCX1ZJRVdfRE5EX0RFRkFVTFRfTElOS1RZUEUgPSAibGliVmlld0RORERlZmF1bHRMaW5rVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYXlvdXQoU3RyaW5nIHZhbHVlKSB7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlQUkVGX0xJQl9WSUVXX0xBWU9VVCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExheW91dCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJUFJFRl9MSUJfVklFV19MQVlPVVQpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwYWQxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotCi0vKioKLSAqIFByZWZlcmVuY2VJbml0aWFsaXplciBmb3IgQXV0aG9yaW5nUGx1Z2luLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMKLQkJQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQkvLyBXZSBkb24ndCBuZWVkIGl0IGhlcmUuIEl0J3MgYmVlbiBtb3ZlZCB0byBsaWJyYXJ5UGx1Z2luCi0vLwkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUywKLS8vCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotLy8JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dCU19DT0xVTU5TKSk7Ci0vLwkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLS8vCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotLy8JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1RCU19DT0xVTU5TKSk7Ci0vLwkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMsCi0vLwkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLS8vCQkJCQkJLnRvU3RyaW5nKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XUEJTX0NPTFVNTlMpKTsKLS8vCQlzdG9yZS5zZXREZWZhdWx0KAotLy8JCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSwKLS8vCQkJCXRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFiNTczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Db21tb25QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgQXV0aG9yaW5nIHByZWZlcmVuY2UgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCU1vZGlmeUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGludCBNSU5fUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUkVGRVJFTkNFX0hJU1RPUllfU0laRSA9IDIwOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJpdmF0ZSBUZXh0IGRlZmF1bHRMaWJyYXJ5UGF0aFRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXNDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIHVzZU5ld0V4dGVuZHNTZW1hbnRpY3NDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIGVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3g7Ci0KLQlwcml2YXRlIFRleHQgcHJlZmVyZW5jZUhpc3RvcnlTaXplVGV4dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIFNXVCBjb250cm9sIGZvciB0aGUgY3VzdG9taXplZCBib2R5IG9mIHRoaXMKLQkgKiBwcmVmZXJlbmNlIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCS8vIENyZWF0ZSB0aGUgTWV0aG9kIGxpYnJhcnkgZ3JvdXAuCi0JCUdyb3VwIGxpYnJhcnlHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kTGlicmFyeUdyb3VwX3RleHQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGxpYnJhcnlHcm91cCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVmYXVsdFBhdGhMYWJlbF90ZXh0KTsKLQkJZGVmYXVsdExpYnJhcnlQYXRoVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChsaWJyYXJ5R3JvdXApOwotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24obGlicmFyeUdyb3VwLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCi0JCWRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlc0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3gobGlicmFyeUdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NhcmR1bnJlc29sdmVkcmVmLCAzKTsKLQotCQkvLyBDcmVhdGUgdGhlIE1vZGVsaW5nIGdyb3VwLgotCQlHcm91cCBtb2RlbGluZ0dyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tb2RlbGluZ0dyb3VwX3RleHQsIDEpOwotCi0JCXVzZU5ld0V4dGVuZHNTZW1hbnRpY3NDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KG1vZGVsaW5nR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kX3NlbWFudGljc19idXR0b25fdGV4dCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBVSSBncm91cC4KLQkJR3JvdXAgdXNlckludGVyZmFjZUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy51c2VySW50ZXJmYWNlR3JvdXBfdGV4dCwgMik7Ci0KLQkJY3JlYXRlTGFiZWwodXNlckludGVyZmFjZUdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlZmF1bHRfbGlzdF9sZW5ndGhfbGFiZWwpOwotCQlwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHVzZXJJbnRlcmZhY2VHcm91cCwKLQkJCQkiIiwgMjUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHRoZSBkZWJ1ZyBncm91cC4KLQkJR3JvdXAgZGVidWdHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVidWdHcm91cF90ZXh0LCAyKTsKLQotCQllbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZGVidWdHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94X3RleHQpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlkZWZhdWx0TGlicmFyeVBhdGhUZXh0LnNldFRleHQoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCi0JCWRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlc0NoZWNrYm94LnNldFNlbGVjdGlvbihMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKCkpOwotCi0JCXVzZU5ld0V4dGVuZHNTZW1hbnRpY3NDaGVja2JveC5zZXRTZWxlY3Rpb24oTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKSk7Ci0KLQkJcHJlZmVyZW5jZUhpc3RvcnlTaXplVGV4dC5zZXRUZXh0KCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIENvbW1vblByZWZlcmVuY2VzLmdldFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpKTsgCi0KLQkJZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveC5zZXRTZWxlY3Rpb24oQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5EaXJlY3RvcnlEaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJlZmVyZW5jZUhpc3RvcnlTaXplVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlzZXRWYWxpZCh0cnVlKTsKLQotCQlpbnQgdmFsdWUgPSAwOwotCQlpZiAoZS53aWRnZXQgPT0gcHJlZmVyZW5jZUhpc3RvcnlTaXplVGV4dCkgewotCQkJdmFsdWUgPSBnZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKTsKLQkJCWlmICh2YWx1ZSA8IE1JTl9QUkVGRVJFTkNFX0hJU1RPUllfU0laRQotCQkJCQl8fCB2YWx1ZSA+IE1BWF9QUkVGRVJFTkNFX0hJU1RPUllfU0laRSkgewotCQkJCXNldEVycm9yTWVzc2FnZShBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludmFsaWRQcmVmZXJlbmNlSGlzdG9yeVNpemVFcnJvcl9tc2csCi0JCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJbmV3IEludGVnZXIoTUlOX1BSRUZFUkVOQ0VfSElTVE9SWV9TSVpFKSwKLQkJCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUpIH0pKTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4KLQkgKiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0KLQkJU3RyaW5nIGRlZmF1bHRMaWJyYXJ5UGF0aCA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldEluaXRpYWxEZWZhdWx0TGlicmFyeVBhdGgoKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVmYXVsdExpYnJhcnlQYXRoKGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JCWRlZmF1bHRMaWJyYXJ5UGF0aFRleHQuc2V0VGV4dChkZWZhdWx0TGlicmFyeVBhdGgpOwotCi0JCWJvb2xlYW4gZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzID0gTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKTsKLQkJTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLnNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMpOwotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXNDaGVja2JveAotCQkJCS5zZXRTZWxlY3Rpb24oZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKTsKLQotCQlib29sZWFuIHVzZU5ld0V4dGVuZHNTZW1hbnRpY3MgPSBMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKTsKLQkJTGlicmFyeVByZWZlcmVuY2VzLnNldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3ModXNlTmV3RXh0ZW5kc1NlbWFudGljcyk7Ci0JCXVzZU5ld0V4dGVuZHNTZW1hbnRpY3NDaGVja2JveC5zZXRTZWxlY3Rpb24odXNlTmV3RXh0ZW5kc1NlbWFudGljcyk7Ci0KLQkJaW50IHByZWZlcmVuY2VIaXN0b3J5U2l6ZSA9IENvbW1vblByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKTsKLQkJQ29tbW9uUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKHByZWZlcmVuY2VIaXN0b3J5U2l6ZSk7Ci0JCXByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQuc2V0VGV4dCgiIiArIHByZWZlcmVuY2VIaXN0b3J5U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlib29sZWFuIGVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uID0gQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKTsKLQkJQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbihlbmFibGVMaWJyYXJ5VmFsaWRhdGlvbik7Ci0JCWVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3guc2V0U2VsZWN0aW9uKGVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldERlZmF1bHRMaWJyYXJ5UGF0aChnZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5zZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoZ2V0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuc2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcyhnZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCkpOwotCQlDb21tb25QcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCkpOwotCQlBdXRob3JpbmdVSVByZWZlcmVuY2VzCi0JCQkuc2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oZ2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIHNldHRpbmdzIGZvciBicm93c2luZwotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnVwZGF0ZUxheW91dFNldHRpbmdzKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZGVmYXVsdCBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gZGVmYXVsdExpYnJhcnlQYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRpc2NhcmQgdW5yZXNvbHZlZCByZWZlcmVuY2VzIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKSB7Ci0JCXJldHVybiB1c2VOZXdFeHRlbmRzU2VtYW50aWNzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHJlZmVmcmVuY2UgaGlzdG9yeSBzaXplLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZShwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0LmdldFRleHQoKS50cmltKCksCi0JCQkJMCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGVuYWJsZWQgbGlicmFyeSB2YWxpZGF0aW9uIHByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBlbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBkaXJlY3RvcnkgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCQkJU3RyaW5nIHBhdGggPSBkZC5vcGVuKCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJZGVmYXVsdExpYnJhcnlQYXRoVGV4dC5zZXRUZXh0KHBhdGgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1VJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjg0ZmRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEF1dGhvcmluZyBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSVByZWZlcmVuY2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04gPSAiZW5hYmxlZExpYnJhcnlWYWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1RBU0tTX1BFUl9ST1cgPSAiQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fVEFTS1NfUEVSX1JPVyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9BRERfVEFTS1NfUEVSX1JPVyA9IDEwOyAKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTiA9IGZhbHNlOwotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04sCi0JCQkJREVGQVVMVF9FTkFCTEVfTElCUkFSWV9WQUxJREFUSU9OKTsKLQkJCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEFERF9UQVNLU19QRVJfUk9XLCBERUZBVUxUX0FERF9UQVNLU19QRVJfUk9XKTsKLQkJCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBlbmFibGUgbWV0aG9kIGxpYnJhcnkgdmFsaWRhdGlvbiBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0VOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT047Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGxpYnJhcnkgdmFsaWRhdGlvbiBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBsaWJyYXJ5IHZhbGlkYXRpb24gcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTiwgdmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBBRERfVEFTS1NfUEVSX1JPVyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEFERF9UYXNrc1BlclJvdygpICB7Ci0JCWludCB2YWx1ZSA9IHByZWZTdG9yZS5nZXRJbnQoQUREX1RBU0tTX1BFUl9ST1cpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX0FERF9UQVNLU19QRVJfUk9XOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEFERF9UQVNLU19QRVJfUk9XIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEFERFRhc2tzUGVyUm93KGludCB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoQUREX1RBU0tTX1BFUl9ST1csIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBBRERfVEFTS1NfUEVSX1JPVyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRBRERUYXNrc1BlclJvdygpIHsKLQkJcmV0dXJuIERFRkFVTFRfQUREX1RBU0tTX1BFUl9ST1c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0JyZWFrZG93bkVsZW1lbnRQcmVmUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9CcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2NDQ2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0JyZWFrZG93bkVsZW1lbnRQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5QcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBicmVha2Rvd24gZWxlbWVudCBhdHRyaWJ1dGVzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRQcmVmUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIHdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWxCdXR0b24sCi0JCQl3b3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24sCi0JCQl3b3JrQnJlYWtkb3duRWxlbWVudFBsYW5uZWRCdXR0b24sCi0JCQl3b3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuQnV0dG9uLAotCQkJd29ya0JyZWFrZG93bkVsZW1lbnRPbmdvaW5nQnV0dG9uLAotCQkJd29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBkZXNjcmlwdG9yT3B0aW9uYWxCdXR0b24sCi0JCQlkZXNjcmlwdG9yTXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbiwgZGVzY3JpcHRvclBsYW5uZWRCdXR0b24sCi0JCQlkZXNjcmlwdG9yRXZlbnREcml2ZW5CdXR0b24sIGRlc2NyaXB0b3JPbmdvaW5nQnV0dG9uLAotCQkJZGVzY3JpcHRvclJlcGV0YWJsZUJ1dHRvbjsKLQotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9icmVha0Rvd25FbGVtZW50X0Rlc2NyaXB0aW9uKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNyZWF0ZSBncm91cCBmb3IgYWN0aXZpdHkgZWxlbWVudHMKLQkJR3JvdXAgd29ya0JyZWFrZG93bkVsZW1lbnRHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9Xb3JrQnJlYWtkb3duRWxlbWVudHMsIDEsIHRydWUpOwotCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWxCdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfT3B0aW9uYWwpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfTXVsdGlwbGVPY2N1cnJlbmNlcyk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZEJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9QbGFubmVkKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbkJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbik7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50T25nb2luZ0J1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9PbmdvaW5nKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlKTsKLQotCQkvLyBjcmVhdGUgZ3JvdXAgZm9yIGRlc2NyaXB0b3IgZWxlbWVudHMKLQkJR3JvdXAgZGVzY3JpcHRvckdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX0Rlc2NyaXB0b3JFbGVtZW50cywgMSwgdHJ1ZSk7Ci0JCWRlc2NyaXB0b3JPcHRpb25hbEJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KGRlc2NyaXB0b3JHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX09wdGlvbmFsKTsKLQkJZGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzKTsKLQkJZGVzY3JpcHRvclBsYW5uZWRCdXR0b24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9QbGFubmVkKTsKLQkJZGVzY3JpcHRvckV2ZW50RHJpdmVuQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goZGVzY3JpcHRvckdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW4pOwotCQlkZXNjcmlwdG9yT25nb2luZ0J1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KGRlc2NyaXB0b3JHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX09uZ29pbmcpOwotCQlkZXNjcmlwdG9yUmVwZXRhYmxlQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goZGVzY3JpcHRvckdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlKTsKLQotCQkvLyBJbml0aWFsaXplIHZhbHVlcwotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlpbml0aWFsaXplRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZVZhbHVlcygpOwotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hcHBseURlZmF1bHRWYWx1ZXNGb3JCcmVha2Rvd25FbGVtZW50QXR0cmlidXRlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCS8vCi0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWwod29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbEJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzKHdvcmtCcmVha2Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkKHdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZEJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbih3b3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRXb3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmcod29ya0JyZWFrZG93bkVsZW1lbnRPbmdvaW5nQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRXb3JrQnJlYWtkb3duRWxlbWVudFJlcGVhdGFibGUod29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVzY3JpcHRvck9wdGlvbmFsKGRlc2NyaXB0b3JPcHRpb25hbEJ1dHRvbgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldERlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzKGRlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXREZXNjcmlwdG9yUGxhbm5lZChkZXNjcmlwdG9yUGxhbm5lZEJ1dHRvbgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldERlc2NyaXB0b3JFdmVudERyaXZlbihkZXNjcmlwdG9yRXZlbnREcml2ZW5CdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldERlc2NyaXB0b3JPbmdvaW5nKGRlc2NyaXB0b3JPbmdvaW5nQnV0dG9uCi0JCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVzY3JpcHRvclJlcGVhdGFibGUoZGVzY3JpcHRvclJlcGV0YWJsZUJ1dHRvbgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkZWZhdWx0IHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQkKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQotCQlkZXNjcmlwdG9yT3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJZGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJZGVzY3JpcHRvclBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJZGVzY3JpcHRvckV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWRlc2NyaXB0b3JPbmdvaW5nQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWRlc2NyaXB0b3JSZXBldGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50T3B0aW9uYWwoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbgotCQkJCS5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRQbGFubmVkKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudEV2ZW50RHJpdmVuKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50T25nb2luZygpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50UmVwZWF0YWJsZSgpKTsKLQotCQlkZXNjcmlwdG9yT3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JPcHRpb25hbCgpKTsKLQkJZGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzKCkpOwotCQlkZXNjcmlwdG9yUGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvclBsYW5uZWQoKSk7Ci0JCWRlc2NyaXB0b3JFdmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvckV2ZW50RHJpdmVuKCkpOwotCQlkZXNjcmlwdG9yT25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvck9uZ29pbmcoKSk7Ci0JCWRlc2NyaXB0b3JSZXBldGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JSZXBlYXRhYmxlKCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkNvbW1vblByZWZQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgd3JhcHBlciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoIHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyICkgewotCQkJcmV0dXJuICgoUHJlZmVyZW5jZVN0b3JlV3JhcHBlcil3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFiZTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQ29tbW9uUHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLlByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIGNvbW1vbiBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uUHJlZlBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gZG8gbm90aGluZyBpbiB0aGlzIGNvbW1vbiBwcmVmZXJlbmNlIHBhZ2UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVHcmlkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZyhDb21wb3NpdGUgcGFyZW50LCBUZXh0IHBhdGhfY3RyKSB7Ci0JCXRyeSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpLAotCQkJCQlTV1QuTk9ORSk7Ci0KLQkJCVN0cmluZyBkZXN0aW5hdGlvbiA9IGRkLm9wZW4oKTsKLQkJCWlmIChkZXN0aW5hdGlvbiAhPSBudWxsKSB7Ci0JCQkJcGF0aF9jdHIuc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSBMYWJlbAotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgTGFiZWwKLQkgKiBAcGFyYW0gdGV4dCBMYWJlbCB0ZXh0Ci0JICogQHBhcmFtIHNwYW4gaG9yaXpvbnRhbCBzcGFuCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBMYWJlbAotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gY3JlYXRlIGEgcmFkaW8gYnV0dG9uCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSBidXR0b24KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGJ1dHRvbiBsYWJlbAotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgUmFkaW8gQnV0dG9uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gY3JlYXRlIGEgbGluZQotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgbGluZQotCSAqIEBwYXJhbSBuY29sIGhvcml6b250YWwgc3BhbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgd3JhcHBlciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoIHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyICkgewotCQkJcmV0dXJuICgoUHJlZmVyZW5jZVN0b3JlV3JhcHBlcil3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCQkvLyByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5TG9jYXRpb25EYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlMb2NhdGlvbkRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2NmI0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlMb2NhdGlvbkRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkNvbW1vblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIExvY2F0aW9uIERhdGEgZm9yIGxpYnJhcnkgCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TG9jYXRpb25EYXRhIHsKLQotCXByaXZhdGUgU3RyaW5nIHBhcmVudEZvbGRlcjsKLQotCXByaXZhdGUgU3RyaW5nIGxpYk5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBsaWJCcmllZkRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlTGliRmlsZTsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWZMaWJEaXJDaGVja2VkOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUZpbGUgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzT2tQcmVzc2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2tQcmVzc2VkKCkgewotCQlyZXR1cm4gaXNPa1ByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlzT2tQcmVzc2VkCi0JICogICAgICAgICAgICBUaGUgaXNPa1ByZXNzZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9rUHJlc3NlZChib29sZWFuIGlzT2tQcmVzc2VkKSB7Ci0JCXRoaXMuaXNPa1ByZXNzZWQgPSBpc09rUHJlc3NlZDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPa1ByZXNzZWQ7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzU2luZ2xlTGliRmlsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZUxpYkZpbGUoKSB7Ci0JCXJldHVybiBpc1NpbmdsZUxpYkZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlzU2luZ2xlTGliRmlsZQotCSAqICAgICAgICAgICAgVGhlIGlzU2luZ2xlTGliRmlsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2luZ2xlTGliRmlsZShib29sZWFuIGlzU2luZ2xlTGliRmlsZSkgewotCQl0aGlzLmlzU2luZ2xlTGliRmlsZSA9IGlzU2luZ2xlTGliRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxpYk5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJOYW1lKCkgewotCQlyZXR1cm4gbGliTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIEZ1bGwgcGF0aCBvZiBsaWJyYXJ5LnhtaQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeUZpbGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRGb2xkZXIoKSArIEZpbGUuc2VwYXJhdG9yICsgbGlicmFyeUZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpYk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBsaWJOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWJOYW1lKFN0cmluZyBsaWJOYW1lKSB7Ci0JCXRoaXMubGliTmFtZSA9IGxpYk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJlbnRGb2xkZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRGb2xkZXIoKSB7Ci0JCXJldHVybiBwYXJlbnRGb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudEZvbGRlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudEZvbGRlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50Rm9sZGVyKFN0cmluZyBwYXJlbnRGb2xkZXIpIHsKLQkJdGhpcy5wYXJlbnRGb2xkZXIgPSBwYXJlbnRGb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsaWJCcmllZkRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGliQnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGxpYkJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpYkJyaWVmRGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBsaWJCcmllZkRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWJCcmllZkRlc2NyaXB0aW9uKFN0cmluZyBsaWJCcmllZkRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMubGliQnJpZWZEZXNjcmlwdGlvbiA9IGxpYkJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZMaWJEaXJDaGVja2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmTGliRGlyQ2hlY2tlZCgpIHsKLQkJcmV0dXJuIGRlZkxpYkRpckNoZWNrZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlZkxpYkRpckNoZWNrZWQKLQkgKiAgICAgICAgICAgIFRoZSBkZWZMaWJEaXJDaGVja2VkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZMaWJEaXJDaGVja2VkKGJvb2xlYW4gZGVmTGliRGlyQ2hlY2tlZCkgewotCQl0aGlzLmRlZkxpYkRpckNoZWNrZWQgPSBkZWZMaWJEaXJDaGVja2VkOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHByZWZlcmVuY2VzIGZyb20gdGhlIHN0b3JlCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlTdHJpbmcgbGFzdERpciA9IHN0b3JlCi0JCQkJLmdldFN0cmluZyhMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfTElCUkFSWV9QQVJFTlRfRElSRUNUT1JZKTsKLQkJdGhpcy5zZXRQYXJlbnRGb2xkZXIobGFzdERpcik7Ci0KLQkJYm9vbGVhbiBsYXN0Q2hlY2tlZCA9IHN0b3JlCi0JCQkJLmdldEJvb2xlYW4oTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQpOwotCQkvLyB0aGUgY29udGFpbnMgbWV0aG9kIGRvZXMgbm90IHNlZW0gdG8gd29yayBzbyB1c2UgbGFzdCBkaXIgYXMgYW4KLQkJLy8gYXBwcm94aW1hdGlvbiBpZgotCQkvLyAoc3RvcmUuY29udGFpbnMoTGliYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfREVGQVVMVF9ESVJFQ1RPUllfQ0hFQ0tFRCkpCi0JCWlmIChsYXN0RGlyID09IG51bGwgfHwgbGFzdERpci50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCXRoaXMuc2V0RGVmTGliRGlyQ2hlY2tlZCh0cnVlKTsKLQkJZWxzZQotCQkJdGhpcy5zZXREZWZMaWJEaXJDaGVja2VkKGxhc3RDaGVja2VkKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBkaWFsb2cgY2hvaWNlcyB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmdldFBhcmVudEZvbGRlcigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJc3RvcmUuc2V0VmFsdWUoCi0JCQkJTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSwKLQkJCQlmaWxlLmdldFBhcmVudCgpKTsKLQkJc3RvcmUuc2V0VmFsdWUoCi0JCQkJTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQsCi0JCQkJdGhpcy5pc0RlZkxpYkRpckNoZWNrZWQoKSk7Ci0KLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjFjMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBDb25zdGFudHMgZm9yIGxpYnJhcnkKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzIGV4dGVuZHMgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZDI0NzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogSW5pdGlhbGl6ZXIgZm9yIGxpYnJhcnkgcHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9SQURJT19TQVZFX0NIT0lDRSwgMSk7Ci0JCQotCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TLAotCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotCQkJCQkJLnRvU3RyaW5nKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XQlNfQ09MVU1OUykpOwotCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TLAotCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotCQkJCQkJLnRvU3RyaW5nKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9UQlNfQ09MVU1OUykpOwotCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUywKLQkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV1BCU19DT0xVTU5TKSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoCi0JCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSwKLQkJCQl0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVZpZXdQcmVmUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5Vmlld1ByZWZQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjljNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5Vmlld1ByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwucGFnZXNldHVwLkRlZmF1bHRWYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLldvcmtzcGFjZVZpZXdlclByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlJhZGlvR3JvdXBGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogTGlicmFyeSB2aWV3IG9wdGlvbnMgcHJlZmVyZW5jZSBwYWdlCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdQcmVmUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCQotCXB1YmxpYyBMaWJyYXJ5Vmlld1ByZWZQYWdlKCkgewotCQlzdXBlcihHUklEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGdldEZpZWxkRWRpdG9yUGFyZW50KCk7Ci0JCVJhZGlvR3JvdXBGaWVsZEVkaXRvciBkZWZhdWx0TGlua1R5cGVFZGl0b3IgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKAotCSAgICAJICAgICAJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSUJfVklFV19ETkRfREVGQVVMVF9MSU5LVFlQRSwKLQkgICAgCSAgICAgCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVmYXVsdExpbmtUeXBlUHJlZkxhYmVsLCAxLAotCSAgICAJICAgICAJCQluZXcgU3RyaW5nW11bXSB7Ci0JICAgIAkgICAgIAkJCQkJe0xpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua19uYW1lLCBSZXNvdXJjZUhlbHBlci5FTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmt9LAotCSAgICAJICAgICAJCQkJCXtMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lLCBSZXNvdXJjZUhlbHBlci5FTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZX0sCi0JICAgIAkgICAgIAkJCQkJe0xpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lLCBSZXNvdXJjZUhlbHBlci5FTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHR9Ci0JICAgIAkgICAgIAkJCX0sIHBhcmVudCwgdHJ1ZSk7Ci0JCWRlZmF1bHRMaW5rVHlwZUVkaXRvci5zZXRQcmVmZXJlbmNlU3RvcmUoZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWFkZEZpZWxkKGRlZmF1bHRMaW5rVHlwZUVkaXRvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHByaW50aW5nIHByZWZlcmVuY2VzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0RGVmYXVsdHMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJQl9WSUVXX0RORF9ERUZBVUxUX0xJTktUWVBFLAotCQkJCVJlc291cmNlSGVscGVyLkVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGluayk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Byb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDdiZWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIFByb2Nlc3NFZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQkvLyBwcml2YXRlIFRleHQgbGluZVdpZHRoVGV4dDsKLQkvLyBwcml2YXRlIEJ1dHRvbiBpbmRlbnRDaGVja2JveDsKLQkvLyBwcml2YXRlIFRleHQgaW5kZW50U2l6ZVRleHQ7Ci0JLy8gcHJpdmF0ZSBDb21ibyBic0NvbWJvOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbjsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BCU19UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U7IAotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcjsKLQotCS8vIHByaXZhdGUgTGlzdFZpZXdlciB0YnNTZWxlY3RlZENvbExpc3Q7Ci0JLy8gcHJpdmF0ZSBMaXN0Vmlld2VyIHdwYnNTZWxlY3RlZENvbExpc3Q7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCB3YnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgamF2YS51dGlsLkxpc3QgdGJzQ29sdW1uRGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHdwYnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiB1cEJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJTX05BTUVTID0gbmV3IFN0cmluZ1tdIHsgV0JTX1RYVCwgVEJTX1RYVCwKLQkJCVdQQlNfVFhUIH07Ci0KLQlwcml2YXRlIExpc3RbXSBjb2x1bW5EZXNjcmlwdG9yTGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0W10gQUxMX0NPTFVNTl9ERVNDUklQVE9SX0xJU1RTID0gbmV3IExpc3RbXSB7Ci0JCQlQcm9jZXNzRWRpdG9yLkFMTF9XQlNfQ09MVU1OUywgUHJvY2Vzc0VkaXRvci5BTExfVEJTX0NPTFVNTlMsCi0JCQlQcm9jZXNzRWRpdG9yLkFMTF9XUEJTX0NPTFVNTlMgfTsKLQotCS8vIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nIHByZWZlcmVuY2UKLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hBbHdheXNCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hOZXZlckJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbHVtbkRlc2NyaXB0b3JQcm92aWRlciBpbXBsZW1lbnRzCi0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIoKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChqYXZhLnV0aWwuTGlzdCkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChDb2x1bW5EZXNjcmlwdG9yKSBlbGVtZW50KS5sYWJlbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgd3JhcHBlciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoIHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyICkgewotCQkJcmV0dXJuICgoUHJlZmVyZW5jZVN0b3JlV3JhcHBlcil3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0RGF0YSgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21wb3NpdGUgY29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbnNDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCWNvbHVtbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29sdW1uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbHVtbnNlbGVjdGlvbl90ZXh0KTsgCi0KLQkJZmluYWwgQ29tYm8gYnNDb21ibyA9IG5ldyBDb21ibyhjb2x1bW5zQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZCi0JCQkJfCBTV1QuQk9SREVSKTsKLQkJYnNDb21iby5zZXRJdGVtcyhCU19OQU1FUyk7Ci0JCWJzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUuZ2V0U291cmNlKCk7Ci0JCQkJaW50IGlkID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoaWQgIT0gLTEpIHsKLQkJCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkJLnNldElucHV0KGNvbHVtbkRlc2NyaXB0b3JMaXN0c1tpZF0pOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJfQotCi0JCX0pOwotCQlic0NvbWJvLnNlbGVjdCgwKTsKLQotCQlDb21wb3NpdGUgbGlzdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsaXN0Q29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlsaXN0Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSBzdWJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGxpc3RDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzdWJDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXN1YkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihzdWJDb21wb3NpdGUsIFNXVC5NVUxUSQotCQkJCXwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWZpbmFsIENvbHVtbkRlc2NyaXB0b3JQcm92aWRlciBpdGVtUHJvdmlkZXIgPSBuZXcgQ29sdW1uRGVzY3JpcHRvclByb3ZpZGVyKCk7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnNldElucHV0KHdic0NvbHVtbkRlc2NyaXB0b3JzKTsKLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUxpc3QgcmVtb3ZlTGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpKS50b0xpc3QoKTsKLQkJCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX0lEKQotCQkJCQkJfHwgcmVtb3ZlTGlzdAotCQkJCQkJCQkuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSkpIHsKLQkJCQkJLy8gaWYgcHJlc2VudCBuYW1lIG9yIGlkIHNlbGVjdGVkLCAKLQkJCQkJLy8gZGlzYWJsZSAicmVtb3ZlIiwidXAiIGFuZCAiZG93biIgYnV0dG9uCi0JCQkJCS8vCi0JCQkJCWlmKHJlbW92ZUJ1dHRvbi5pc0VuYWJsZWQoKSkgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlpZih1cEJ1dHRvbi5pc0VuYWJsZWQoKSkgdXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWlmKGRvd25CdXR0b24uaXNFbmFibGVkKCkpIGRvd25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYoIXJlbW92ZUJ1dHRvbi5pc0VuYWJsZWQoKSkgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWlmKCF1cEJ1dHRvbi5pc0VuYWJsZWQoKSkgdXBCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJaWYoIWRvd25CdXR0b24uaXNFbmFibGVkKCkpIGRvd25CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCQotCQotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIHdic1NlbGVjdGVkQ29sdW1uc1RhYmxlLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ci0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLAotCQkvLyB9KTsKLQotCQkvLyBDVGFiSXRlbSB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wod2JzU2VsZWN0ZWRDb2x1bW5zVGFibGUuZ2V0Q29udHJvbCgpKTsKLQotCQkvLyB0YnNTZWxlY3RlZENvbExpc3QgPSBuZXcgTGlzdFZpZXdlcihjb2x1bW5zQ29tcG9zaXRlLCBTV1QuQ0hFQ0sgfAotCQkvLyBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJLy8gdGJzU2VsZWN0ZWRDb2xMaXN0LnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0TGFiZWxQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0SW5wdXQodGJzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsCi0JCS8vIH0pOwotCQkvLyB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wodGJzU2VsZWN0ZWRDb2xMaXN0LmdldENvbnRyb2woKSk7Ci0KLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdCA9IG5ldyBMaXN0Vmlld2VyKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5DSEVDSyB8Ci0JCS8vIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldExhYmVsUHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdC5zZXRJbnB1dCh3cGJzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQkvLyB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIik7Ci0JCS8vIHRhYkl0ZW0uc2V0Q29udHJvbCh3cGJzU2VsZWN0ZWRDb2xMaXN0LmdldENvbnRyb2woKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGxpc3RDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkFERF9CVVRUT05fVEVYVCk7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IGlkID0gYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCU9iamVjdCBpbnB1dCA9IEFMTF9DT0xVTU5fREVTQ1JJUFRPUl9MSVNUU1tpZF07Ci0JCQkJZmluYWwgTGlzdCBzZWxlY3RlZENvbHVtbnMgPSBjb2x1bW5EZXNjcmlwdG9yTGlzdHNbaWRdOwotCQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJaW5wdXQsCi0JCQkJCQlpdGVtUHJvdmlkZXIsCi0JCQkJCQlpdGVtUHJvdmlkZXIsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dCkgeyAKLQkJCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQkJCQlnZXRWaWV3ZXIoKS5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLQotCQkJCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLAotCQkJCQkJCQkJT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkJCXJldHVybiAhc2VsZWN0ZWRDb2x1bW5zLmNvbnRhaW5zKGVsZW1lbnQpOwotCQkJCQkJCX0KLQotCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gY29udHJvbDsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkJc2VsZWN0ZWRDb2x1bW5zLmFkZEFsbChBcnJheXMuYXNMaXN0KGRsZy5nZXRSZXN1bHQoKSkpOwotCQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQotCQlyZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlQnV0dG9uX3RleHQpOyAKLQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWphdmEudXRpbC5MaXN0IGNvbHVtbnMgPSAoamF2YS51dGlsLkxpc3QpIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldElucHV0KCk7Ci0JCQkJTGlzdCByZW1vdmVMaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpLnRvTGlzdCgpOwotCQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfSUQpCi0JCQkJCQl8fCByZW1vdmVMaXN0Ci0JCQkJCQkJCS5jb250YWlucyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FKSkgewotCQkJCQkvLyBjYW5ub3QgcmVtb3ZlIG5hbWUgb3IgSUQgY29sdW1uCi0JCQkJCS8vCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY29sdW1ucy5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQotCQl9KTsKLQotCQl1cEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCk7Ci0JCXVwQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCXVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpCi0JCQkJCXJldHVybjsKLQkJCQlFTGlzdCBjb2x1bW5zID0gKEVMaXN0KSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaW50IGlkID0gY29sdW1ucy5pbmRleE9mKHNlbGVjdGVkKTsKLQkJCQlpZiAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDAgJiYgaWQgPCAzKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYgaWQgPCAyKQotCQkJCQlyZXR1cm47Ci0JCQkJY29sdW1ucy5tb3ZlKGlkIC0gMSwgaWQpOwotCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXNlbGVjdGVkKSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZG93bkJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkb3duQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQlkb3duQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCWRvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuOwotCQkJCUVMaXN0IGNvbHVtbnMgPSAoRUxpc3QpIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5nZXRJbnB1dCgpOwotCQkJCU9iamVjdCBzZWxlY3RlZCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpbnQgaWQgPSBjb2x1bW5zLmluZGV4T2Yoc2VsZWN0ZWQpOwotCQkJCQotCQkJCWlmIChpZCA9PSBjb2x1bW5zLnNpemUoKSAtIDEgfHwgKGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwICYmIGlkIDwgMikpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoaWQgPT0gY29sdW1ucy5zaXplKCkgLSAxIHx8IChic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmIGlkIDwgMSkpCi0JCQkJCXJldHVybjsKLQkJCQljb2x1bW5zLm1vdmUoaWQgKyAxLCBpZCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWQpLCB0cnVlKTsKLQkJCX0KLQotCQl9KTsKLQotCQlHcm91cCBjb25maWdTd2l0Y2hHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfT1VUKTsKLQkJY29uZmlnU3dpdGNoR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbmZpZ1N3aXRjaEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb25maWdTd2l0Y2hHcm91cAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uKTsgCi0KLQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uID0gbmV3IEJ1dHRvbihjb25maWdTd2l0Y2hHcm91cCwgU1dULlJBRElPKTsKLQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLmFsd2F5c0J1dHRvbl90ZXh0KTsKLQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ1N3aXRjaEdyb3VwLCBTV1QuUkFESU8pOwotCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5uZXZlckJ1dHRvbl90ZXh0KTsKLQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uID0gbmV3IEJ1dHRvbihjb25maWdTd2l0Y2hHcm91cCwgU1dULlJBRElPKTsKLQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnByb21wdEJ1dHRvbl90ZXh0KTsKLQotCQlzZXRTd2l0Y2hDb25maWdCdXR0b24oTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0U3dpdGNoQ29uZmlnKCkpOwotCi0JCS8vIGluaGVyaXQgc3VwcHJlc3Npb24gc3RhdGVzCi0JCUdyb3VwIHN1cHByZXNzaW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuU0hBRE9XX09VVCk7Ci0JCXN1cHByZXNzaW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzdXBwcmVzc2lvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzdXBwcmVzc2lvbkdyb3VwCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZSk7IAotCi0JCWluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbiA9IG5ldyBCdXR0b24oc3VwcHJlc3Npb25Hcm91cCwgU1dULkNIRUNLKTsKLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlKTsgCi0KLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBkYXRhIGZyb20gcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0RGF0YSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCVN0cmluZyBzdHIgPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpOwotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXN0ciA9IHN0b3JlCi0JCQkJCS5nZXREZWZhdWx0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKTsKLQkJfQotCQl3YnNDb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NFZGl0b3IudG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCi0JCXN0ciA9IHN0b3JlLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUyk7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJc3RyID0gc3RvcmUKLQkJCQkJLmdldERlZmF1bHRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpOwotCQl9Ci0JCXRic0NvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0VkaXRvci50b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0KLQkJc3RyID0gc3RvcmUuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUyk7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJc3RyID0gc3RvcmUKLQkJCQkJLmdldERlZmF1bHRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKTsKLQkJfQotCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMgPSBQcm9jZXNzRWRpdG9yLnRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQotCQkvLyBsb2FkIGFuZCBzZXQgdG8gdGhlIGRlZmF1bHQgaWYgbm90aGluZyBpbiB0aGUgc3RvcmUKLQkJLy8gMTU0NzU4IC0gUHJvY2Vzc2VzOiBXQlMgaXMgYmxhbmsgYXMgZGVmYXVsdCBwcmVmZXJlbmNlIGlzIG5vdCBzZXQgZm9yIHRoZSBmaXJzdCB0aW1lCi0JCWlmICggd2JzQ29sdW1uRGVzY3JpcHRvcnMuc2l6ZSgpID09IDAgKSB7Ci0JCQl3YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dCU19DT0xVTU5TKTsKLQkJCXN0b3JlLnNldFZhbHVlKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TLAotCQkJCQl0b1N0cmluZyh3YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQkKLQkJfQotCQkKLQkJaWYgKCB0YnNDb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgPT0gMCApIHsKLQkJCXRic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfVEJTX0NPTFVNTlMpOwotCQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMsCi0JCQkJCXRvU3RyaW5nKHRic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCX0KLQkJCi0JCWlmICggd3Bic0NvbHVtbkRlc2NyaXB0b3JzLnNpemUoKSA9PSAwICkgewotCQkJd3Bic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV1BCU19DT0xVTU5TKTsKLQkJCXN0b3JlLnNldFZhbHVlKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUywKLQkJCQkJdG9TdHJpbmcod3Bic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCX0KLQkJCi0JCWNvbHVtbkRlc2NyaXB0b3JMaXN0cyA9IG5ldyBMaXN0W10geyB3YnNDb2x1bW5EZXNjcmlwdG9ycywKLQkJCQl0YnNDb2x1bW5EZXNjcmlwdG9ycywgd3Bic0NvbHVtbkRlc2NyaXB0b3JzIH07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlLnBlcmZvcm1EZWZhdWx0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0KLQkJd2JzQ29sdW1uRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJd2JzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XQlNfQ09MVU1OUyk7Ci0KLQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9UQlNfQ09MVU1OUyk7Ci0KLQkJd3Bic0NvbHVtbkRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCXdwYnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dQQlNfQ09MVU1OUyk7Ci0KLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uCi0JCQkJLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKAotCQkJCQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFKSk7Ci0KLQkJc2V0U3dpdGNoQ29uZmlnQnV0dG9uKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMsCi0JCQkJdG9TdHJpbmcod2JzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMsCi0JCQkJdG9TdHJpbmcodGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLAotCQkJCXRvU3RyaW5nKHdwYnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQlzdG9yZS5zZXRWYWx1ZSgKLQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFLAotCQkJCWluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vIHN3aXRjaCBjb25maWcgcHJlZmVyZW5jZSBpcyBpbiBsaWJyYXJ5LnVpCi0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldFN3aXRjaENvbmZpZyhnZXRTd2l0Y2hDb25maWdWYWx1ZSgpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBnaXZlbiBsaXN0IGludG8gc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGNvbHVtbkRlc2NyaXB0b3JzCi0JICogQHJldHVybiAKLQkgKiAJCQlTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhqYXZhLnV0aWwuTGlzdCBjb2x1bW5EZXNjcmlwdG9ycykgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gY29sdW1uRGVzY3JpcHRvcnMuc2l6ZSgpIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc3RyQnVmLmFwcGVuZCgoKENvbHVtbkRlc2NyaXB0b3IpIGNvbHVtbkRlc2NyaXB0b3JzLmdldChpKSkuaWQpCi0JCQkJCS5hcHBlbmQoJywnKTsKLQkJfQotCQlzdHJCdWYuYXBwZW5kKCgoQ29sdW1uRGVzY3JpcHRvcikgY29sdW1uRGVzY3JpcHRvcnMuZ2V0KG1heCkpLmlkKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KE1vZGlmeUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN3aXRjaENvbmZpZ1ZhbHVlKCkgewotCQlpZiAoY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUzsKLQkJaWYgKGNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSOwotCQlpZiAoY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVDsKLQotCQkvLyByZXR1cm4gUHJvbXB0IHZhbHVlIGFzIGEgZGVmYXVsdAotCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTd2l0Y2hDb25maWdCdXR0b24oU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVMuZXF1YWxzKHZhbHVlKSkgewotCQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfSBlbHNlIGlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUi5lcXVhbHModmFsdWUpKSB7Ci0JCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgeyAvLyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQKLQkJCWNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQkKLQkJLy8gY2hhbmdlIHRvIHVzZSBMaWJyYXJ5UGx1Z2luIHN0b3JlCi0JCS8vIHdlIG5lZWQgdG8gc2hhcmUgdGhlIHByZWZlcmVuY2UgaW4gTGlicmFyeSBicm93c2luZyBhbmQgcHVibGlzaGluZwotCQkvLyBKaW5odWEgWGkgMDgvMTkvMjAwNgotCQkvLyBjaGFuZ2VkIHRvIHVzZSBDb21tb25VSVBsdWdpbiBzdG9yZQotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB3cmFwcGVyID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmICggd3JhcHBlciBpbnN0YW5jZW9mIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKXdyYXBwZXIpLmdldFN0b3JlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Sb290UHJlZlBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWRlMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Sb290UHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkNvbW1vblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBSb290IHByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvb3RQcmVmUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZV90YWI7Ci0KLQkvLyBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gRGlzYWJsZWluZyBlbmFibGUgcHJvY2VzcyBjb250cmlidXRpb24gcHJlZmVyZW5jZSBmb3Igbm93LgotCS8vIHByaXZhdGUgQnV0dG9uIGVuYWJsZVByb2Nlc3NDb250cmlidXRpb247Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBjb21wb3NpdGVfdGFiIDw8IHBhcmVudAotCQljb21wb3NpdGVfdGFiID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMyk7Ci0KLQkJLy8gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULkNIRUNLKTsKLQkJLy8gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdldFN0cmluZygiQXV0aG9yaW5nVUkuUm9vdFByZWZQYWdlLmVuYWJsZXByb2Nlc3Njb250cmlidXRpb24udGV4dCIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQkvLyBmb250ID0gbnVsbDsKLQkJcmV0dXJuIGNvbXBvc2l0ZV90YWI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB3cmFwcGVyID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmICggd3JhcHBlciBpbnN0YW5jZW9mIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKXdyYXBwZXIpLmdldFN0b3JlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLy8gcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkvLyBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkvLyBsYWJlbC5zZXRUZXh0KHRleHQpOwotCS8vIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkvLyBkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkvLyBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCS8vIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JLy8gcmV0dXJuIGxhYmVsOwotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiNTM5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIEF1dGhvcmluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWJzdHJhY3RTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWJzdHJhY3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjdlMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Fic3RyYWN0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnZpZXcuVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGEgc2VjdGlvbiBpbiBhIHRhYiBpbiB0aGUgcHJvcGVydGllcyB2aWV3LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24gaW1wbGVtZW50cwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFNlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBmb3IgY3VycmVudCBzZWxlY3Rpb24gb2YgTWV0aG9kQ29uZmlndXJhdGlvbgotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGdldCBsb2dnZXIKLQkJbG9nZ2VyID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcCwgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhjb21wLCBwYWdlKTsKLQkJdGhpcy5wYWdlID0gcGFnZTsKLQl9Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VEOiB7Ci0JCQkJc2VjdGlvblJlZnJlc2goKTsKLQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHNlY3Rpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VjdGlvblJlZnJlc2goKSB7Ci0JCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCVRhYiB0YWIgPSBwYWdlLmdldEN1cnJlbnRUYWIoKTsKLQkJCWlmICh0YWIgIT0gbnVsbCkgewotCQkJCUlTZWN0aW9uIHNlY3Rpb24gPSB0YWIuZ2V0U2VjdGlvbkF0SW5kZXgoMCk7Ci0KLQkJCQlpZiAoKHNlY3Rpb24gIT0gbnVsbCkKLQkJCQkJCSYmIChzZWN0aW9uIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uKSkgewotCQkJCQlzZWN0aW9uLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGxpYnJhcnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZXRJbnB1dDo6c2VsZWN0aW9uIC0gIitzZWxlY3Rpb24pOwotCQlBc3NlcnQuaXNUcnVlKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQlpbml0RWxlbWVudERhdGEoaW5wdXQpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRFbGVtZW50RGF0YShPYmplY3QgaW5wdXQpIHsKLQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaW5wdXQ7Ci0JCQlpZiAoVG5nVXRpbC5pc0xvY2tlZCh0aGlzLmVsZW1lbnQpKQotCQkJCXRoaXMuZWRpdGFibGUgPSBmYWxzZTsKLQkJCWVsc2UgewotCQkJCXRoaXMuZWRpdGFibGUgPSB0cnVlOwotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkKLQkJCQkJCXRoaXMuZWRpdGFibGUgPSBmYWxzZTsKLQkJCQkJZWxzZQotCQkJCQkJdGhpcy5lZGl0YWJsZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXRoaXMuZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAoaW5wdXQpOwotCQkJdGhpcy5lZGl0YWJsZSA9IGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGZpcnN0IGVsZW1lbnQgZnJvbSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByb2Nlc3MgZWRpdG9yCi0JICogCi0JICogQHJldHVybgotCSAqIAkJcHJvY2VzcyBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VkaXRvciBnZXRFZGl0b3IoKSB7Ci0JCXJldHVybiBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRFZGl0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gSXRlbVByb3ZpZGVyCi0JICogCi0JICogQHJldHVybgotCSAqIAkJCWFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKCkgewotCQl0cnkgewotCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoCi0JCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gQWRhcHRlciBmYWN0b3J5Ci0JICogCi0JICogQHJldHVybgotCSAqIAkJCWFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZQotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50OjpzZWxlY3Rpb24gLSAiK3NlbGVjdGlvbik7Ci0JCQl0cnkgewotCQkJCWluaXRFbGVtZW50RGF0YShpbnB1dCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkiRXJyb3IgZ2V0dGluZyBlbGVtZW50IGZyb20gdGhlIHNlbGVjdGlvbiAiICsgZWxlbWVudCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCXByb3BlcnR5IHNoZWV0IHBhZ2UKLQkgKi8KLQlwdWJsaWMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UoamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvZXBydHlDaGFuZ2VFdmVudCIgKyBldnQpOwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGZpbHRlciBsaXN0IG9mIGVsZW1lbnRzLiBGaWx0ZXIgaXMgYmFzZWQgb24gY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBsaXN0Ci0JICogCQkJT3JpZ2luYWwgbGlzdAotCSAqIEByZXR1cm4KLQkgKiAJCQlmaWx0ZXJlZCBsaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsdGVyZWRMaXN0KExpc3QgbGlzdCkgewotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UKLQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCWlmIChjb25maWd1cmF0b3IuYWNjZXB0KG9iaikpIHsKLQkJCQkJbmV3TGlzdC5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIAotCSAqIAkJCWRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXREZWZhdWx0Q29uZmlndXJhdGlvbigpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdldEFkYXB0ZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJcGFyZW50ID0gYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcGFyZW50KQotCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCXJldHVybiBjb25maWc7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKCJBYnN0cmFjdFNlY3Rpb246OmdldERlZmF1bHRDb25maWd1cmF0aW9uIC0gSUJTSXRlbVByb3ZpZGVyIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQljdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJLy8gaWYgY29uZmlndXJhdGlvbiBpcyBub3Qgc2VsZWN0ZWQsIHVzZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJCXJldHVybiBnZXREZWZhdWx0Q29uZmlndXJhdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQotCS8vIHB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlKE9iamVjdCBvYmopCi0JLy8gewotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZVByZWZpeCgpICsgKChCcmVha2Rvd25FbGVtZW50KW9iaikuZ2V0TmFtZSgpOwotCS8vIFRhYmJlZFByb3BlcnR5Q29tcG9zaXRlIGNvbXAgPSAoVGFiYmVkUHJvcGVydHlDb21wb3NpdGUpCi0JLy8gcGFnZS5nZXRDb250cm9sKCk7Ci0JLy8gVGFiYmVkUHJvcGVydHlUaXRsZSB0aXRsZSA9IGNvbXAuZ2V0VGl0bGUoKTsKLQkvLyBpZiAodGl0bGVJbWFnZSA9PSBudWxsKQotCS8vIHsKLQkvLyB0aXRsZUltYWdlID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpOwotCS8vIH0KLQkvLyB0aXRsZS5zZXRUaXRsZShuYW1lLCB0aXRsZUltYWdlKTsKLQkvLyB9Ci0JCi0JCi0JCi0JLyoqCi0JICogR2V0IG5hbWUgcHJlZml4IGZvciB0aGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuICJQcm9jZXNzRWxlbWVudDogIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eURvY3VtZW50U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5RG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmQ4YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5RG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYmJlZFByb3BlcnR5Q29tcG9zaXRlOwotCi0KLS8qKgotICogVGhlIGRvY3VtZW50IHRhYiBmb3IgQWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIHsKLQotCXByb3RlY3RlZCBBY3Rpdml0eSBlbGVtZW50OwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBtYWluRGVzY1RleHQ7Ci0JCi0JcHJvdGVjdGVkIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIG1haW5EZXNjQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBwdXJwb3NlVGV4dDsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgcHVycG9zZUNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgYWx0ZXJuYXRpdmVzVGV4dDsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgYWx0ZXJuYXRpdmVzQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBob3dUb1N0YWZmVGV4dDsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgaG93VG9TdGFmZkNvbnRhaW5lcjsKLQotCXByaXZhdGUgTGlzdGVuZXIgcHVycG9zZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogcHVycG9zZVRleHQ7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UHVycG9zZSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCXB1cnBvc2VUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBtYWluRGVzY0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogbWFpbkRlc2NUZXh0OwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCW1haW5EZXNjVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIG5ld0NvbnRlbnQsCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBhbHRlcm5hdGl2ZXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IGFsdGVybmF0aXZlc1RleHQ7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJYWx0ZXJuYXRpdmVzVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBob3dUb1N0YWZmTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBob3dUb1N0YWZmVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRIb3d0b1N0YWZmKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJaG93VG9TdGFmZlRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jY3JlYXRlRG9jdW1lbnRTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgbWFpbkRlc2NoZWlnaHRIaW50ID0gMTAwOwotCi0JCXN1cGVyLmNyZWF0ZURvY3VtZW50U2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIG1haW4gZGVzY3JpcHRpb24KLQkJbWFpbkRlc2NDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBtYWluRGVzY2hlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIobWFpbkRlc2NDb250YWluZXIubGluayk7Ci0JCW1haW5EZXNjVGV4dCA9IG1haW5EZXNjQ29udGFpbmVyLnJpY2hUZXh0OwotCi0JCS8vIHB1cnBvc2UKLQkJcHVycG9zZUNvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHVycG9zZSk7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKHB1cnBvc2VDb250YWluZXIubGluayk7Ci0JCXB1cnBvc2VUZXh0ID0gcHVycG9zZUNvbnRhaW5lci5yaWNoVGV4dDsKLQotCQkvLyBjcmVhdGUgYWx0ZXJuYXRpdmVzCi0JCWFsdGVybmF0aXZlc0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X2FsdGVybmF0aXZlcyk7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKGFsdGVybmF0aXZlc0NvbnRhaW5lci5saW5rKTsKLQkJYWx0ZXJuYXRpdmVzVGV4dCA9IGFsdGVybmF0aXZlc0NvbnRhaW5lci5yaWNoVGV4dDsKLQkJCi0JCS8vIGNyZWF0ZSBob3d0b1N0YWZmCi0JCWhvd1RvU3RhZmZDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9ob3dUb1N0YWZmKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIoaG93VG9TdGFmZkNvbnRhaW5lci5saW5rKTsKLQkJaG93VG9TdGFmZlRleHQgPSBob3dUb1N0YWZmQ29udGFpbmVyLnJpY2hUZXh0OwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJCi0JCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCi0JCXB1cnBvc2VUZXh0LnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCXB1cnBvc2VUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwdXJwb3NlTGlzdGVuZXIpOwotCQkKLQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQltYWluRGVzY1RleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCW1haW5EZXNjVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbWFpbkRlc2NMaXN0ZW5lcik7Ci0JCQkJCi0JCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQlhbHRlcm5hdGl2ZXNUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBhbHRlcm5hdGl2ZXNMaXN0ZW5lcik7Ci0JCQotCQlob3dUb1N0YWZmVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpKTsKLQkJaG93VG9TdGFmZlRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGhvd1RvU3RhZmZMaXN0ZW5lcik7Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJcHVycG9zZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQltYWluRGVzY1RleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlhbHRlcm5hdGl2ZXNUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaG93VG9TdGFmZlRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkvLyBoaWRlIGZpZWxkcyBmb3IgdG9wLWxldmVsIHByb2Nlc3NlczoKLQkJaWYgKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2VzcyhlbGVtZW50KSkgewotCQkJYnJpZWZEZXNjTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlicmllZkRlc2NUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJZXh0ZXJuYWxJRExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJZXh0ZXJuYWxJRFRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCW1haW5EZXNjQ29udGFpbmVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJcHVycG9zZUNvbnRhaW5lci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWFsdGVybmF0aXZlc0NvbnRhaW5lci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWhvd1RvU3RhZmZDb250YWluZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkKLQkJCS8vIG1vdmUgdXNhZ2UgZ3VpZGFuY2UgdG8gYmUgcmlnaHQgYWZ0ZXIgcHJlZml4IGZpZWxkCi0JCQl1c2FnZUd1aWRhbmNlQ29udGFpbmVyLm1vdmVCZWxvdyhwcmVmaXhUZXh0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJYnJpZWZEZXNjTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWJyaWVmRGVzY1RleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWV4dGVybmFsSURMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJZXh0ZXJuYWxJRFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWtleUNvbnNpZGVyYXRpb25zQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQltYWluRGVzY0NvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQkJcHVycG9zZUNvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQkJYWx0ZXJuYXRpdmVzQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlob3dUb1N0YWZmQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkvLyBtb3ZlIHVzYWdlIGd1aWRhbmNlIHRvIGJlIHJpZ2h0IGFmdGVyIGV4dGVybmFsSUQgZmllbGQKLQkJCXVzYWdlR3VpZGFuY2VDb250YWluZXIubW92ZUJlbG93KGV4dGVybmFsSURUZXh0KTsKLQkJfQotCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCQkvLyBtYWtlIHBhcmVudCBiZSB0b3RhbGx5IHJlcGFpbnRlZAotCQlwYXJlbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXBhcmVudC5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNhdmVNb2RpZmllZFJpY2hUZXh0KCk7Ci0KLQkJCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQkJQWN0aXZpdHlEZXNjcmlwdGlvbiBjb250ZW50ID0gKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQltYWluRGVzY1RleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJcHVycG9zZVRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJYWx0ZXJuYXRpdmVzVGV4dAotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlob3dUb1N0YWZmVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCX0KLQkJCQkKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCW1haW5EZXNjVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCXB1cnBvc2VUZXh0LnNldFRleHQoY29udGVudC5nZXRQdXJwb3NlKCkpOwotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0VGV4dChjb250ZW50LmdldEFsdGVybmF0aXZlcygpKTsKLQkJCQlob3dUb1N0YWZmVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0SG93dG9TdGFmZigpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX21haW5EZXNjcmlwdGlvbikpIHsgCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0KLQkJCQkJfSBlbHNlIGlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3B1cnBvc2UpKSB7IAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQuZ2V0UHVycG9zZSgpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJCQl9IGVsc2UgaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygKLQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X2FsdGVybmF0aXZlcykpIHsgCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0QWx0ZXJuYXRpdmVzKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJCQkJfSBlbHNlIGlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9ob3dUb1N0YWZmKSkgeyAKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50LmdldEhvd3RvU3RhZmYoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQltYWluRGVzY1RleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJbWFpbkRlc2NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCQkJcHVycG9zZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJYWx0ZXJuYXRpdmVzVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJCQlhbHRlcm5hdGl2ZXNUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlob3dUb1N0YWZmVGV4dC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlob3dUb1N0YWZmVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCQkJaG93VG9TdGFmZlRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIGFjdGl2aXR5IGRvY3VtZW50YXRpb24gc2VjdGlvbiA6IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjMTNmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLlNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MuQ29udmVydEFjdGl2aXR5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBBY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlHZW5lcmFsU2VjdGlvbiBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBBY3Rpdml0eSBlbGVtZW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9BUFBMSUNBQkxFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RBcHBsaWNhYmxlX3RleHQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb250cmlidXRlc190ZXh0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRzX3RleHQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQotCXByaXZhdGUgVGV4dCBtb2RlbEluZm9UZXh0OwotCi0JcHJpdmF0ZSBMYWJlbCBhY3Rpdml0eVR5cGVMYWJlbDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3R5cGVfdGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfdHlwZV9idXR0b247Ci0KLQlwcml2YXRlIENvbWJvIGN0cmxfdmFyaWFiaWxpdHk7Ci0KLQlwcml2YXRlIENvbWJvVmlld2VyIHZpZXdlcl92YXJpYWJpbGl0eTsKLQotCXByaXZhdGUgVGV4dCBiYXNlVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEJ1dHRvbjsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciB2YXJpYWJpbGl0eUxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdmFyT2JqZWN0ID0gKFZhcmlhYmlsaXR5VHlwZSkgb2JqZWN0OwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuTkEpCi0JCQkJcmV0dXJuIE5PVF9BUFBMSUNBQkxFX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykKLQkJCQlyZXR1cm4gQ09OVFJJQlVURVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpCi0JCQkJcmV0dXJuIEVYVEVORFNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKQotCQkJCXJldHVybiBSRVBMQUNFU19URVhUOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIHZhcmlhYmlsaXR5Q29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlMaXN0IHZhcmlhYmlsaXR5VHlwZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5OQSk7Ci0JCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBNb2RlbCBJbmZvCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfTW9kZWxJbmZvKTsgCi0KLQkJbW9kZWxJbmZvVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLS8vCQltb2RlbEluZm9UZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQltb2RlbEluZm9UZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJbW9kZWxJbmZvVGV4dC5zZXRUZXh0KGdldE1vZGVsSW5mbygpKTsKLQkJbW9kZWxJbmZvVGV4dC5zZXRGb3JlZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmdyYXkpOwotCi0JCS8vIFR5cGUgb2YgYW4gQWN0aXZpdHkKLQkJYWN0aXZpdHlUeXBlTGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1R5cGUpOwotCQkKLQkJY3RybF90eXBlX3RleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5SRUFEX09OTFkpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQljdHJsX3R5cGVfdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX3R5cGVfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX1RZUEVfQlVUVE9OX1RFWFQsIFNXVC5QVVNIKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWN0cmxfdHlwZV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJaWYgKENvbnZlcnRBY3Rpdml0eURpYWxvZy5nZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMoZWxlbWVudCkgPT0gbnVsbCkgewotCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBWYXJpYWJpbGl0eSBUeXBlCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WQVJJQUJJTElUWV9UWVBFX1RFWFQpOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkgPSBGb3JtVUkuY3JlYXRlQ29tYm8odG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgMik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQljdHJsX3ZhcmlhYmlsaXR5LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJdmlld2VyX3ZhcmlhYmlsaXR5ID0gbmV3IENvbWJvVmlld2VyKGN0cmxfdmFyaWFiaWxpdHkpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxKSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRDb250ZW50UHJvdmlkZXIodmFyaWFiaWxpdHlDb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0TGFiZWxQcm92aWRlcih2YXJpYWJpbGl0eUxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJTGFiZWwgYmxhbmtMYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWJsYW5rTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBCYXNlIGVsZW1lbnRzCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCk7Ci0KLQkJYmFzZVRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWJhc2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCWJhc2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIEJ1dHRvbiB0byBzZWxlY3QKLQkJc2VsZWN0QnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8QWJzdHJhY3REaWFncmFtRWRpdG9yPiBnZXREaXJ0eURpYWdyYW1FZGl0b3JzKCkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7IAotCQlBcnJheUxpc3Q8QWJzdHJhY3REaWFncmFtRWRpdG9yPiBkaXJ0eUVkaXRvcnMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0RGlhZ3JhbUVkaXRvcj4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgJiYgcHJvY2VzcyA9PSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpZWxlbWVudCkpIHsKLQkJCQkJCQlkaXJ0eUVkaXRvcnMuYWRkKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIGVkaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpcnR5RWRpdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJY3RybF90eXBlX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkvLyBhbGxvdyBjaGFuZ2luZyB0eXBlIG9ubHkgaWYgdGhlIHByb2Nlc3MgZWRpdG9yIGFuZCBhbGwgb2YgaXRzIGRpYWdyYW0gZWRpdG9ycyBhcmUgbm90IGRpcnR5Ci0JCQkJLy8KLQkJCQlpZiAoZWRpdG9yLmlzRGlydHkoKSB8fCAhZ2V0RGlydHlEaWFncmFtRWRpdG9ycygpLmlzRW1wdHkoKSkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMTsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJfSBlbHNlICB7Ci0JCQkJCW5hbWVUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJCW5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQlwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQotCQkJCQlBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IENvbnZlcnRBY3Rpdml0eURpYWxvZwotCQkJCQkucXVlcnlVc2VyQW5kQ29udmVydCgoQWN0aXZpdHkpIGVsZW1lbnQsIG51bGwsIG51bGwpOwotCQkJCQkKLQkJCQkJaWYgKG5ld0FjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQluZXdBY3Rpdml0eSk7Ci0JCQkJCQkvLyBkZWFsIHdpdGggcHJvcGVydHkgc2hlZXQgZGlyZWN0bHkuCi0JCQkJCQlnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpLnNlbGVjdGlvbkNoYW5nZWQoZ2V0UGFydCgpLAotCQkJCQkJCQlzZWwpOwotCQkJCQkJLy8gZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCQkoKFByb2Nlc3NWaWV3ZXIpICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBnZXRFZGl0b3IoKQotCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCkpLmdldFZpZXdlcigpKQotCQkJCQkJCQkuZXhwYW5kVG9MZXZlbChuZXdBY3Rpdml0eSwgMyk7Ci0JCQkJCX0KLQkJCQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQkJbmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkvLyByZWZyZXNoIGFueSBkaXJ0eSBkaWFncmFtIGVkaXRvciBhbmQgY2xlYXIgdGhlIGRpcnR5IGZsYWcKLQkJCQkJCQkvLwotCQkJCQkJCUxpc3Q8QWJzdHJhY3REaWFncmFtRWRpdG9yPiBkaXJ0eURpYWdyYW1FZGl0b3JzID0gZ2V0RGlydHlEaWFncmFtRWRpdG9ycygpOwotCQkJCQkJCWZvciAoQWJzdHJhY3REaWFncmFtRWRpdG9yIGRpYWdyYW1FZGl0b3IgOiBkaXJ0eURpYWdyYW1FZGl0b3JzKSB7Ci0JCQkJCQkJCWRpYWdyYW1FZGl0b3IucmVmcmVzaCgpOwotCQkJCQkJCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9IGRpYWdyYW1FZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQkJCQkJCQlpZihkb2NQcm92aWRlciBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkJCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcilkb2NQcm92aWRlcikubWFya0RvY3VtZW50QXNTYXZlZCgoSUZpbGVFZGl0b3JJbnB1dCkgZGlhZ3JhbUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJCQkJfQkJCQotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQljdHJsX3ZhcmlhYmlsaXR5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eQotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSAoVmFyaWFiaWxpdHlUeXBlKSBzZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJCWlmICh2ZSAhPSBudWxsICYgdmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJCWlmKHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKQotLy8JCQkJCQkJJiYgdmUgaW5zdGFuY2VvZiBQcm9jZXNzKXsKLS8vCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkuYmluZCgKLS8vCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotLy8JCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCVZhcmlhYmlsaXR5VHlwZSB2dHlwZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCQkJCWlmKHZ0eXBlICE9IG51bGwpewotLy8JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odnR5cGUpOwotLy8JCQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihzZWwpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCXJldHVybjsKLS8vCQkJCQl9Ci0vLwkJCQkJaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcigoQWN0aXZpdHkpIHZlKQotLy8JCQkJCQkJJiYgdHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkpIHsKLS8vCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCksCi0vLwkJCQkJCQkJKChBY3Rpdml0eSkgdmUpLmdldE5hbWUoKSB9OwotLy8JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0vLwkJCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBlbGVtZW50Ci0vLwkJCQkJCQkJLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotLy8JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotLy8JCQkJCQkJCXZhcmlhYmlsaXR5VHlwZSk7Ci0vLwkJCQkJCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24oCi0vLwkJCQkJCQkJbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24sIHRydWUpOwotLy8KLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLQkJCQkJCi0JCQkJCWlmKHR5cGUgIT0gVmFyaWFiaWxpdHlUeXBlLk5BKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXRlID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihlbGVtZW50LCAoQWN0aXZpdHkpIHZlLCB0eXBlKTsKLQkJCQkJCWlmKCFzdGF0ZS5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0ZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQotCQkJCQkJCS8vIHNldCB2YXJpYWJpbGl0eSB0byBiYWNrIHdoYXRldmVyIGl0IHdhcyBmb3IgVUkKLQkJCQkJCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJdmFyaWFiaWxpdHlUeXBlKTsKLQkJCQkJCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uLCB0cnVlKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpLAotCQkJCQkJCXR5cGUsIC0xKTsKLQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCWlmIChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSA9PSBudWxsCi0JCQkJCQkJCXx8IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmICh0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuTkEpKQotCQkJCQkJCQllbGVtZW50LnNldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSA9PSBudWxsCi0JCQkJCQkJfHwgZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAodHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKQotCQkJCQkJCQl8fCB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpCi0JCQkJCQkJCXx8IHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQSkpCi0JCQkJCQkJZWxlbWVudC5zZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJCQlpZiAodmUgIT0gbnVsbCkgewotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQludWxsLCAtMSk7Ci0KLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJYmFzZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlMaXN0IHNlbGVjdGlvbkJhc2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlzZWxlY3Rpb25CYXNlTGlzdC5hZGQoYmFzZSk7Ci0JCQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCQkJfQotCQkJCS8vIHNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJfQotCQl9KTsKLQotCQlzZWxlY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuQUNUSVZJVElFUzsKLQotCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gKFZhcmlhYmlsaXR5VHlwZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQl0YWJOYW1lLCBlbGVtZW50KTsKLQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCB0YWJOYW1lLCBudWxsLCBjb25maWcpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZSh0YWJOYW1lKTsKLQkJCQlmZC5vcGVuKCk7Ci0KLQkJCQlMaXN0IHNlbGVjdGVkSXRlbXMgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0KLQkJCQlpZiAoc2VsZWN0ZWRJdGVtcyAhPSBudWxsICYmICFzZWxlY3RlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9IHNlbGVjdGVkSXRlbXMuZ2V0KDApOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLS8vCQkJCQkJaWYgKGlzRGlyZWN0UGFyZW50KGFjdCkKLS8vCQkJCQkJCQl8fCAoKGFjdCBpbnN0YW5jZW9mIFByb2Nlc3MpICYmIHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKQotLy8JCQkJCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykpKSAKLS8vCQkJCQkJewotLy8JCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMSwKLS8vCQkJCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCX0KLS8vCQkJCQkJaWYgKGlzQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCkpIHsKLS8vCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnQuZ2V0TmFtZSgpLCBhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0vLwkJCQkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkJCQkJcmV0dXJuOwotLy8JCQkJCQl9Ci0vLwkJCQkJCS8vIGJsb2NrIGZvciBjaGlsZHJlbgotLy8JCQkJCQlpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdCkKLS8vCQkJCQkJCQkmJiB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSkgewotLy8JCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCksIGFjdC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotLy8JCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oZWxlbWVudCwgKEFjdGl2aXR5KSBvLCB0eXBlKTsKLQkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CQkJCQkJCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvOwotCi0JCQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBQcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IoCi0JCQkJCQkJCWdldERlZmF1bHRDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kKAotCQkJCQkJCQllbGVtZW50LCB2ZSwgdHlwZSwgY29uZmlndXJhdG9yKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCWJhc2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHZlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogR2V0IG1vZGVsIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICogCQkJbW9kZWwgaW5mbyBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNb2RlbEluZm8oKSB7Ci0JCVN0cmluZyBpbmZvID0gbnVsbDsKLQotCQl0cnkgewotCQkJT2JqZWN0IG8gPSBnZXRBZGFwdGVyKCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgbzsKLQkJCQlpbmZvID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoZWxlbWVudCwKLQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwcmludCBleGNlcHRpb24KLQkJfQotCQlpZiAoIShTdHJVdGlsLmlzQmxhbmsoaW5mbykpKQotCQkJcmV0dXJuIGluZm87Ci0JCWVsc2UKLQkJCXJldHVybiBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCi0JCWN0cmxfdHlwZV9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQljdHJsX3ZhcmlhYmlsaXR5LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5LmdldFNlbGVjdGlvbigpKQotCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTkEpIHsKLQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCQkJbW9kZWxJbmZvVGV4dC5zZXRUZXh0KGdldE1vZGVsSW5mbygpKTsKLQotCQkJCWN0cmxfdHlwZV90ZXh0LnNldFRleHQoUHJvcGVydGllc1V0aWwuZ2V0VHlwZShlbGVtZW50KSk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY29tYm8KLQkJCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpCi0JCQkJCQkmJiAoZWxlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsIHx8IGVsZW1lbnQKLQkJCQkJCQkJLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKSB7Ci0JCQkJCWFjdGl2aXR5VHlwZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQljdHJsX3R5cGVfdGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhY3Rpdml0eVR5cGVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQljdHJsX3R5cGVfdGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXZhcmlhYmlsaXR5VHlwZSk7Ci0JCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0KLQkJCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkKLQkJCQkJYmFzZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbWVudAotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKTsKLQkJCQllbHNlCi0JCQkJCWJhc2VUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJLy8gbWFrZSB2YXJpYWJpbGl0eSB0eXBlIGNvbWJvIGRpc2FibGVkIGluY2FzZSB0eXBlIGlzIGVpdGhlciBsb2NhbCBjb250cmlidXRlcyBvciBsb2NhbCByZXBsYWNlcy4KLQkJCQlpZiAodmFyaWFiaWxpdHlUeXBlCi0JCQkJCQkuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pCi0JCQkJCQl8fCAodmFyaWFiaWxpdHlUeXBlCi0JCQkJCQkJCS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSkpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCQljdHJsX3ZhcmlhYmlsaXR5LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3ZhcmlhYmlsaXR5LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgQWN0aXZpdHkgZ2VuZXJhbCBzZWN0aW9uIDogIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUyArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0UgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9JVEVSQVRJT04gKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZQotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUd1aWRhbmNlU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Mjc0YmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIFRoZSBhY3Rpdml0eSBndWlkYW5jZSBzZWN0aW9uLiBJdCBsaXN0IGFsbCBhdmFpYWJsZSBndWlkYW5jZXMgb2YgYW4gYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX3JlbW92ZV8xLCBjdHJsX2FkZF8yLCBjdHJsX3JlbW92ZV8yOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMywgY3RybF9yZW1vdmVfMywgY3RybF9hZGRfNCwgY3RybF9yZW1vdmVfNDsKLQotCXByaXZhdGUgVGFibGUgY3RybF90YWJsZV8xLCBjdHJsX3RhYmxlXzIsIGN0cmxfdGFibGVfMywgY3RybF90YWJsZV80OwotCi0JcHJpdmF0ZSBTZWN0aW9uIGNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24sIGVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbjsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyXzEsIHZpZXdlcl8yLCB2aWV3ZXJfMywgdmlld2VyXzQ7Ci0KLQkvLyBlbGVtZW50Ci0JcHJpdmF0ZSBBY3Rpdml0eSBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQotCXByaXZhdGUgSUZpbHRlciByb2FkTWFwRmlsdGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUZpbHRlciBnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJRmlsdGVyIHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcm9hZCBtYXAgZ3VpZGFuY2UgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0Um9hZE1hcEZpbHRlcigpIHsKLQkJaWYgKHJvYWRNYXBGaWx0ZXIgPT0gbnVsbCkgewotCQkJcm9hZE1hcEZpbHRlciA9IG5ldyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQl0YWJOYW1lKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcikKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaik7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUm9hZG1hcCIpKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSEoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQl9IGVsc2UgewotCQkJKChQcm9jZXNzR3VpZGFuY2VGaWx0ZXIpIHJvYWRNYXBGaWx0ZXIpLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCi0JCXJldHVybiByb2FkTWFwRmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEdldCBHZW5lcmFsIGd1aWRhbmNlIGZpbHRlcgotCSAqIAotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldEdlbmVyYWxHdWlkYW5jZUZpbHRlcigpIHsKLQkJaWYgKGdlbmVyYWxHdWlkYW5jZUZpbHRlciA9PSBudWxsKSB7Ci0JCQlnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKAotCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQkJaWYgKCgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKQotCQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlDbGFzcyBjbHMgPSBGaWx0ZXJJbml0aWFsaXplci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldENsYXNzRm9yVHlwZShoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpKTsKLQkJCQkJaWYgKGNscyAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY2xzLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpIHx8IChvYmogaW5zdGFuY2VvZiBDb25jZXB0KQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQl9Ci0JCQl9OwotCQl9ZWxzZSB7Ci0JCQkoKFByb2Nlc3NHdWlkYW5jZUZpbHRlcikgZ2VuZXJhbEd1aWRhbmNlRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYWxHdWlkYW5jZUZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgU3VwcG9ydGluZyBtYXRlcmljYWwgZ3VpZGFuY2UgZmlsdGVyCi0JICogCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0U3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKCkgewotCQlpZiAoc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyID09IG51bGwpIHsKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlciA9IG5ldyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoCi0JCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgdGFiTmFtZSkgewotCQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCSgoUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKSBzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIpLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIGd1aWRhbmNlIHNlY3Rpb24KLQkJY3JlYXRlR3VpZGFuY2VTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVTZWN0aW9uKCkgewotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSkgewotCQkJaWYgKGNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJaWYgKGVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldEV4cGFuZGVkKGZhbHNlKTsKLQotCQkJaWYgKGNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNWaXNpYmxlKCkpCi0JCQkJY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWlmIChlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNWaXNpYmxlKCkpCi0JCQkJZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKCFjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldEV4cGFuZGVkKHRydWUpOwotCQkJaWYgKCFlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQotCQkJaWYgKCFjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWlmICghZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAgVXBkYXRlIGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlIGZsYWcuIENvbnRyb2xzIGNhbiBiZWNvbWUgZWRpdGFibGUgb3IgdW4tZWRpdGFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9hZGRfMi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9hZGRfMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9hZGRfNC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8yLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8zLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl80LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl2aWV3ZXJfMi5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyXzMucmVmcmVzaCgpOwotCQkJCXZpZXdlcl80LnJlZnJlc2goKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjZXJ0YWluIHNlY3Rpb25zLgotCQkJCXRvZ2dsZVNlY3Rpb24oKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjb250cm9scwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkVycm9yIHJlZnJlc2hpbmcgYWN0aXZpdHkgZ3VpZGFuY2Ugc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGd1aWRhbmNlIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3VpZGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IHRhYmxlSGVpZ2h0ID0gNTA7Ci0JCVN0cmluZyBzZWN0aW9uVGl0bGUgPSBudWxsOwotCQlTdHJpbmcgc2VjdGlvbkRlc2MgPSBudWxsOwotCQlTdHJpbmcgdGFibGVUaXRsZSA9IG51bGw7Ci0JCS8vIExhYmVsIHRhYmxlTGFiZWwgPSBudWxsOwotCi0JCS8vIFJPQURNQVAKLQkJewotCQkJc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Sb2FkbWFwVGl0bGU7IAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbjsgCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwOyAKLQotCQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJCXNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl2aWV3ZXJfMSA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzEpOwotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChlbGVtZW50LmdldFJvYWRtYXBzKCkpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8xLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMQotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQotCQkvLyBHRU5FUkFMIEdVSURBTkNFCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU7IAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uOyAKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZTsgCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMiA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8yKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoKSkudG9BcnJheSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXZpZXdlcl8yLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkJdmlld2VyXzIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8yLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQljdHJsX2FkZF8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7Ci0JCQljdHJsX3JlbW92ZV8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJfQotCi0JCS8vIENPTU1VTklDQVRJT04gTUFURVJJQUwKLQkJewotCQkJc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZTsgCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247IAotCQkJdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsOyAKLQotCQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJCXNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQkJY3RybF90YWJsZV8zID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl2aWV3ZXJfMyA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzMpOwotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkJCSgoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50KQotCQkJCQkJCQkJCS5nZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpKQotCQkJCQkJCQkudG9BcnJheSgpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8zLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMy5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMyA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMyA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24gPSBzZWN0aW9uOwotCi0JCX0KLQotCQkvLyBFRFVDQVRJT04gTUFURVJJQUwKLQkJewotCQkJc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlOyAKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uOyAKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsOyAKLQotCQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJCXNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQkJY3RybF90YWJsZV80ID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl2aWV3ZXJfNCA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzQpOwotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkJCSgoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50KQotCQkJCQkJCQkJCS5nZXRFZHVjYXRpb25NYXRlcmlhbHMoKSkudG9BcnJheSgpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfNC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl80LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfNC5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbiA9IHNlY3Rpb247Ci0KLQkJfQotCi0JCS8vIGhpZGUvc2hvdyBjZXJ0YWluIHNlY3Rpb25zCi0JCXRvZ2dsZVNlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdldEFkYXB0ZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJcGFyZW50ID0gYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb246OmFkZExpc3RlbmVycyAtIElCU0l0ZW1Qcm92aWRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfMS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfMQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldFJvYWRNYXBGaWx0ZXIoKTsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsCi0JCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPQURNQVAsIGVsZW1lbnQuZ2V0Um9hZG1hcHMoKSk7Ci0KLQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApOwotCQkJCQlmZC5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJYWRkR3VpZGFuY2VzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZW1vdmVfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJcmVtb3ZlR3VpZGFuY2VzKHJtSXRlbXMpOwotCQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfMS5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfMi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfMgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8yCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEdlbmVyYWxHdWlkYW5jZUZpbHRlcigpOwotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwKLQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UsIGdldEV4aXN0aW5nRWxlbWVudHMoKSk7IAotCi0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSk7Ci0JCQkJCWZkLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQuc2V0VHlwZXMoZ2V0RmlsdGVyVHlwZXMoKSk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJYWRkR3VpZGFuY2VzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCXZpZXdlcl8yLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZW1vdmVfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJcmVtb3ZlR3VpZGFuY2VzKHJtSXRlbXMpOwotCQkJCQkJdmlld2VyXzIucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfMy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzMKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfMwotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8zCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50OwotCi0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcigpOwotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgcHJvYywKLQkJCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBwcm9jCi0JCQkJCQkJCQkJLmdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkpOwotCi0JCQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpOwotCQkJCQkJZmQKLQkJCQkJCQkJLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0KLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCQkJCQkJcHJvYywKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpLAotCQkJCQkJCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKSwgLTEpOwotCQkJCQl9Ci0KLQkJCQkJdmlld2VyXzMucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0KLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50OwotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJCQkJCQkJcHJvYywKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJCXJtSXRlbXMsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCXZpZXdlcl8zLnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl80Ci0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzQKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNAotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIoKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIHByb2MsCi0JCQkJCQkJCUZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUywgcHJvYwotCQkJCQkJCQkJCS5nZXRFZHVjYXRpb25NYXRlcmlhbHMoKSk7Ci0KLQkJCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSk7Ci0JCQkJCQlmZAotCQkJCQkJCQkuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpLAotCQkJCQkJCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKSwgLTEpOwotCi0JCQkJCQl2aWV3ZXJfNC5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZW1vdmVfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJCXJtSXRlbXMsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCXZpZXdlcl80LnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCi0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQWRkIGd1aWRhbmNlcyB0byB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBhZGRJdGVtcwotCSAqIAkJCQlsaXN0IG9mIGd1aWRhbmNlcyB0byBhZGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkR3VpZGFuY2VzKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCUFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZCgKLQkJCQllbGVtZW50LCBhZGRJdGVtcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBndWlkYW5jZXMgZnJvbSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIHJlbW92ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVHdWlkYW5jZXMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gZ3VpZGFuY2VzIGZvciBhY3Rpdml0eQotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyCi0JCQkJCQkJLmxvZ0Vycm9yKCJDYW4ndCByZW1vdmUgR3VpZGFuY2U6ICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBleGlzdGluZyBndWlkYW5jZXMgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdCBvZiBleGlzdGluZyBndWlkYW5jZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMoKSB7Ci0KLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDaGVja2xpc3RzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDb25jZXB0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0RXhhbXBsZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEd1aWRlbGluZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwotCi0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQkJaWYgKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwpCi0JCQlpdGVtTGlzdC5hZGQoaW5mby5nZXRXUEREaWFncmFtKCkpOwotCi0JCXJldHVybiBpdGVtTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2Ygc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdGVkR3VpZGFuY2VzKCkgewotCQlMaXN0IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENoZWNrbGlzdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENvbmNlcHRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRFeGFtcGxlcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKSk7Ci0JCUxpc3Qgc3VwcG9ydGluZ01hdGVyaWFscyA9IGVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpOwotCQlEaWFncmFtSW5mbyBpbmZvID0gbmV3IERpYWdyYW1JbmZvKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHN1cHBvcnRpbmdNYXRlcmlhbHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKQotCQkJCWlmICghaW5mby5pc0RpYWdyYW0oKFN1cHBvcnRpbmdNYXRlcmlhbCkgb2JqKSkgewotCQkJCQlpdGVtTGlzdC5hZGQob2JqKTsKLQkJCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgZmlsdGVyIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCkgewotCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzE0XTsKLQkJaW50IGkgPSAwOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlM7Ci0JCXJldHVybiBzdHI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVJvbGx1cFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVJvbGx1cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2ZTAwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlSb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgcm9sbHVwIHNlY3Rpb24gZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGl2aXR5Um9sbHVwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JLy8gY29udHJvbHMKLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBzZWN0aW9uOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcm9sbHVwQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBQcm9jZXNzVmlld2VyIHZpZXdlcjsKLQotCS8vIHByaXZhdGUgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQkvLyBlbGVtZW50Ci0JcHJpdmF0ZSBBY3Rpdml0eSBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQkvLyBwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlOwotCi0JcHJvdGVjdGVkIENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9yczsKLQotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IEFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgcHJlZmVyZW5jZSBzdG9yZQotCQlzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgcm9sbHVwIHNlY3Rpb24KLQkJY3JlYXRlUm9sbHVwU2VjdGlvbihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSByb2xsdXAgc2VjdGlvbiBvbiB0aGUgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVSb2xsdXBTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJc2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUm9sbHVwLCAKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uKTsgCi0KLQkJLy8gY3JlYXRlIHJvbGx1cCBjb21wb3NpdGUKLQkJcm9sbHVwQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJLy8gc2V0IHNlY3Rpb24gbGFiZWxzCi0JCXNldFNlY3Rpb25MYWJlbHMoKTsKLQotCQkvLyBjcmVhdGUgdmlld2VyCi0JCXZpZXdlciA9IG5ldyBQcm9jZXNzVmlld2VyKHJvbGx1cENvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJLy8gZ3JpZERhdGEuaGVpZ2h0SGludCA9IDYwMDsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBpbml0QWRhcHRlckZhY3RvcnkKLQkJaW5pdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gc2V0IHVwIGNvbHVtbnMKLQkJdmlld2VyLnNldHVwQ29sdW1ucyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXNldENvbHVtbkluZGV4VG9OYW1lTWFwKGFkYXB0ZXJGYWN0b3J5LCBjb2x1bW5EZXNjcmlwdG9ycyk7Ci0KLQkJLy8gc2V0IHVwIHByb3ZpZGVycwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdmlld2VyCi0JCQkJLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0KLQkJLy8gZG8gcm9sbCB1cAotCQlyb2xsVXAoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCByb2xsVXAoKSB7Ci0JCS8vIHNldCB1cCBjb2x1bW5zCi0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlhZGFwdGVyLnNldFJvbGxlZFVwKHRydWUpOwotCQl2aWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycykgewotCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5JbmRleFRvTmFtZU1hcC5wdXQobmV3IEludGVnZXIoaSksIGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkKTsKLQkJfQotCQkoKElDb2x1bW5Bd2FyZSkgZmFjdG9yeSkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgQWN0aXZpdHkgb2JqZWN0Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlyb2xsVXAoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIGFjdGl2aXR5IHdvcmsgcm9sbCB1cCBzZWN0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFkYXB0ZXIgZmFjdG9yeQotCSAqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBTZXQgbGFiZWwgZm9yIHRoZSBzZWN0aW9uCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRTZWN0aW9uTGFiZWxzKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlUZWFtUm9sbHVwU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1MmZmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlUZWFtUm9sbHVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRm9ybVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoZSB0ZWFtIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uIGV4dGVuZHMgQWN0aXZpdHlSb2xsdXBTZWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNpbml0QWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJLy8gZ2V0IGNvbHVtbiBkZXNjcmlwdG9ycwotCQljb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NGb3JtVXRpbC50b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUykpOwotCi0JCS8vIGNyZWF0ZSBhZGFwdGVyIGZhY3RvcnkKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNzZXRTZWN0aW9uTGFiZWxzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWN0aW9uTGFiZWxzKCkgewotCQlzZWN0aW9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9UZWFtUm9sbHVwKTsgCi0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9UZWFtUm9sbHVwRGVzY3JpcHRpb24pOyAKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTljMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRm9ybVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoZSB3b3JrIHByb2R1Y3RzIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0Zvcm1VdGlsLnRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpOwotCi0JCS8vIGNyZWF0ZSBhZGFwdGVyIGZhY3RvcnkKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jc2V0U2VjdGlvbkxhYmVscygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdGlvbkxhYmVscygpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwKTsgCi0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbik7IAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTAzZmY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogVGhlIHdvcmsgcm9sbHVwIHNlY3Rpb24gZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5V29ya1JvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gZ2V0Q29sdW1uRGVzY3JpcHRvcnMoKTsKLQotCQkvLyBjcmVhdGUgYWRhcHRlciBmYWN0b3J5Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgQ29sdW1uRGVzY3JpcHRvcltdIGdldENvbHVtbkRlc2NyaXB0b3JzKCkgewotCQlDb2x1bW5EZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCQkKLQkJLy8gZG9uJ3Qgc2hvdyBjb2x1bW4gIlByZWRlY2Vzc29ycyIKLQkJLy8KLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGRlc2NyaXB0b3JzW2ldID09IFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfUFJFREVDRVNTT1JTKSB7Ci0JCQkJaW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQkJCQotCQl9Ci0JCWlmKGluZGV4ICE9IC0xKSB7Ci0JCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sRGVzY3JpcHRvcnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltkZXNjcmlwdG9ycy5sZW5ndGggLSAxXTsKLQkJCWlmKGluZGV4ID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGVzY3JpcHRvcnMsIDAsIGNvbERlc2NyaXB0b3JzLCAwLCBpbmRleCk7Ci0JCQl9Ci0JCQlpbnQgbGVuID0gZGVzY3JpcHRvcnMubGVuZ3RoIC0gMSAtIGluZGV4OwotCQkJaWYobGVuID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGVzY3JpcHRvcnMsIGluZGV4ICsgMSwgY29sRGVzY3JpcHRvcnMsIGluZGV4LCBsZW4pOwotCQkJfQotCQkJcmV0dXJuIGNvbERlc2NyaXB0b3JzOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHN0cmluZyBpbnRvIGNvbHVtIGRlc2NyaXB0b3IgbGlzdAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQlMaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUxpc3QgdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChTdHJpbmcgc3RyKSB7Ci0JCUVMaXN0IGNvbHVtbkRlc2NyaXB0b3JzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQkvLyBET04iVCBQVVQgSU5ERVggQ09MVU1OCi0JCQlpZiAoISh0b2tlbi5lcXVhbHMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19JRC5pZCkpKSB7Ci0JCQkJT2JqZWN0IGNvbHVtbkRlc2NyaXB0b3IgPSBQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwCi0JCQkJCQkuZ2V0KHRva2VuKTsKLQkJCQlpZiAoY29sdW1uRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCWNvbHVtbkRlc2NyaXB0b3JzLmFkZChjb2x1bW5EZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgc3RyaW5nIGludG8gY29sdW1uIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCWxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2x1bW5EZXNjcmlwdG9yW10gdG9Db2x1bW5EZXNjcmlwdG9ycyhTdHJpbmcgc3RyKSB7Ci0JCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI3NldFNlY3Rpb25MYWJlbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKSB7Ci0JCXNlY3Rpb24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtSb2xsdXApOyAKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbik7IAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNiZWVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgYnJlYWtkb3duIGVsZW1lbnQgZG9jdW1lbnRhdGlvbiBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCi0JLy8gY29udHJvbHMKLQlwcm90ZWN0ZWQgVGV4dCBwcmVmaXhUZXh0OwotCQotCXByb3RlY3RlZCBMYWJlbCBwcmVmaXhMYWJlbDsKLQotCXByb3RlY3RlZCBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0JCi0JcHJvdGVjdGVkIExhYmVsIGJyaWVmRGVzY0xhYmVsOwotCQotCXByb3RlY3RlZCBUZXh0IGV4dGVybmFsSURUZXh0OwotCi0JcHJvdGVjdGVkIExhYmVsIGV4dGVybmFsSURMYWJlbDsKLQotCXByb3RlY3RlZCBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZG9jdW1lbnRTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBkb2N1bWVudENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kRG9jdW1lbnRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IHVzYWdlR3VpZGFuY2U7Ci0JCi0JcHJvdGVjdGVkIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIHVzYWdlR3VpZGFuY2VDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGtleUNvbnNpZGVyYXRpb25zOwotCQotCXByb3RlY3RlZCBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWRfVGV4dDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmREb2N1bWVudExpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kRG9jdW1lbnRMYWJlbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEZsYWdUZXh0ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBhY3RpdmVDb250cm9sVGV4dDsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gbW9kaWZ5IGxpc3RlbmVyCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudFBhdGg7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gNDA7Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lciB1c2FnZUd1aWRhbmNlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IHVzYWdlR3VpZGFuY2U7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJdXNhZ2VHdWlkYW5jZSwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIga2V5Q29uc2lkZXJhdGlvbnNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCToga2V5Q29uc2lkZXJhdGlvbnM7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCWtleUNvbnNpZGVyYXRpb25zLCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLCBuZXdDb250ZW50LAotCQkJCQkJLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBvYmplY3QKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCS8vIHNldCBjb250ZW50IGVsZW1lbnQgcGF0aAotCQljb250ZW50RWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZWxlbWVudCk7IAotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgRG9jbWVudCBzZWN0aW9uCi0JCWNyZWF0ZURvY3VtZW50U2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmIChjdHJsX2RvY3VtZW50X2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9kb2N1bWVudF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpOwotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2RvY3VtZW50X2V4cGFuZGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotCQkJCX0KLQkJCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJCi0JCXByZWZpeFRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCXByZWZpeFRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChwcmVmaXhUZXh0LmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCBuZXdDb250ZW50LAotCQkJCQkJCS0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJcHJlZml4VGV4dC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlicmllZkRlc2NUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWJyaWVmRGVzY1RleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChicmllZkRlc2NUZXh0Ci0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCQotCQlleHRlcm5hbElEVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7CQkJCQotCQkJCQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRFeHRlcm5hbElkKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlleHRlcm5hbElEVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGV4dGVybmFsSURUZXh0Ci0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQllbGVtZW50LmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQlleHRlcm5hbElEVGV4dC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQotCQl1c2FnZUd1aWRhbmNlLnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQl1c2FnZUd1aWRhbmNlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpKTsKLQkJdXNhZ2VHdWlkYW5jZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgdXNhZ2VHdWlkYW5jZUxpc3RlbmVyKTsKLQkJCi0JCWtleUNvbnNpZGVyYXRpb25zLnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQlrZXlDb25zaWRlcmF0aW9ucwotCQkJCS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwga2V5Q29uc2lkZXJhdGlvbnNMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGRvY3VtZW50YXRpb24gc2VjdGlvbiBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJLy8gY3JlYXRlIGRvY3VtZW50IHNlY3Rpb24KLQkJZG9jdW1lbnRTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZSwgCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLmJpbmQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbiwgUHJvcGVydGllc1V0aWwuZ2V0VHlwZUxvd2VyKGVsZW1lbnQpKSk7IAotCi0JCS8vIGNyZWF0ZSBkb2N1bWVudCBjb21wb3NpdGUKLQkJZG9jdW1lbnRDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGRvY3VtZW50U2VjdGlvbiwgMywKLQkJCQlmYWxzZSk7Ci0KLQkJLy8gcHJlZml4Ci0JCXByZWZpeExhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZml4LCBob3Jpem9udGFsU3Bhbik7IAotCQlwcmVmaXhUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQpOwotCi0JCS8vIGJyaWVmIGRlc2NyaXB0aW9uCi0JCWJyaWVmRGVzY0xhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbiwgaG9yaXpvbnRhbFNwYW4pOyAKLQkJYnJpZWZEZXNjVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLAotCQkJCWhlaWdodEhpbnQpOwotCQkKLQkJLy8gZXh0ZXJuYWwgSUQKLQkJZXh0ZXJuYWxJRExhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0V4dGVybmFsSUQsIGhvcml6b250YWxTcGFuKTsgCi0JCWV4dGVybmFsSURUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSB1c2FnZSBndWlkYW5jZQotCQl1c2FnZUd1aWRhbmNlQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc191c2FnZUd1aWRhbmNlKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIodXNhZ2VHdWlkYW5jZUNvbnRhaW5lci5saW5rKTsKLQkJdXNhZ2VHdWlkYW5jZSA9IHVzYWdlR3VpZGFuY2VDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gY3JlYXRlIGtleSBjb25zaWRlcmF0aW9ucwotCQlrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnMpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5saW5rKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMgPSBrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5yaWNoVGV4dDsKLQotCQkvLyBjcmVhdGUgZXhwYW5kZWQgY29tcG9zaXRlCi0JCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCWRvY3VtZW50U2VjdGlvbiwgMiwgdHJ1ZSk7Ci0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kRG9jdW1lbnRMaW5rID0gRm9ybVVJLmNyZWF0ZUltYWdlSHlwZXJMaW5rKHRvb2xraXQsCi0JCQkJZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUsIEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7IAotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihleHBhbmREb2N1bWVudExpbmspOwotCi0JCS8vIGV4cGFuZCBsYWJlbAotCQlleHBhbmREb2N1bWVudExhYmVsID0gQmFzZUZvcm1QYWdlLmNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZERvY3VtZW50Q29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIeXBlckxpbmtMaXN0ZW5lcihJbWFnZUh5cGVybGluayBsaW5rKSB7Ci0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IGN0cmwgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZCA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0RWRpdG9yKAotCQkJCQl0b29sa2l0LCBleHBhbmREb2N1bWVudENvbXBvc2l0ZSwKLQkJCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQLCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsIGV4cGFuZERvY3VtZW50TGFiZWwsIGdldEVkaXRvcigpLmdldEVkaXRvclNpdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpOwotCQkJCWdyaWREYXRhLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQkvLyBkb2Vzbid0IHNlZW0gdG8gd29yayAtIFJURSBpcyBub3QgcHJvcGVyIHdpZHRoIHVudGlsIHdpbmRvdyBpcyByZXNpemVkCi0vLwkJCQkoKEdyaWREYXRhKWV4cGFuZERvY3VtZW50Q29tcG9zaXRlLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotLy8JCQkJKChHcmlkRGF0YSlwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0vLwkJCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZXhwYW5kRmxhZykgewotCQkJZG9jdW1lbnRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWRvY3VtZW50U2VjdGlvbi5zZXRDbGllbnQoZG9jdW1lbnRDb21wb3NpdGUpOwotCi0JCQlleHBhbmREb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJY3RybCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJY3RybC5zZXRUZXh0KGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuZ2V0VGV4dCgpKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gY3RybC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLAotCQkJCQkJbGlzdGVuZXIuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0KLQkJCWlmIChjdHJsX2RvY3VtZW50X2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQpOwotCQkJfQotCi0JCQljdHJsLnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBleHBhbmRlZAotCQkJZG9jdW1lbnRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlkb2N1bWVudFNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZERvY3VtZW50Q29tcG9zaXRlKTsKLQotCQkJZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQotCQkJZXhwYW5kRG9jdW1lbnRMYWJlbC5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUKLQkJCQkJLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKGN0cmwpOwotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChjdHJsLmdldFRleHQoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGN0cmwuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShjdHJsCi0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKGN0cmwuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGN0cmwuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwKLQkJCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkpOwotCQkJfQotCi0JCX0KLQotCQlkb2N1bWVudFNlY3Rpb24ubGF5b3V0KHRydWUpOwotCi0JCS8vIHNldCBlZGl0YWJsZQotCQlpZiAoY3RybF9kb2N1bWVudF9leHBhbmRlZCAhPSBudWxsKQotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0KLQkJZXhwYW5kRmxhZyA9ICFleHBhbmRGbGFnOwotCQlyZXR1cm4gY3RybF9kb2N1bWVudF9leHBhbmRlZDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJLy8gdXBkYXRlIHNlY3Rpb24gbmFtZQotCQkJCWRvY3VtZW50U2VjdGlvbgotCQkJCQkJLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXByZWZpeFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWJyaWVmRGVzY1RleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlleHRlcm5hbElEVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQl1c2FnZUd1aWRhbmNlLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWtleUNvbnNpZGVyYXRpb25zCi0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJfQotCi0JCQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGdldEVkaXRvcigpLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGVsZW1lbnQpOwotCQkJCWNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGdldEVkaXRvcigpLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKAotCQkJCQkJZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsCi0JCQkJCQkmJiBtb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwKLQkJCQkJCSYmIGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCXByZWZpeFRleHQuc2V0VGV4dChlbGVtZW50LmdldFByZWZpeCgpKTsKLQkJCQlicmllZkRlc2NUZXh0LnNldFRleHQoZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJCWV4dGVybmFsSURUZXh0LnNldFRleHQoY29udGVudC5nZXRFeHRlcm5hbElkKCkpOwotCi0JCQkJdXNhZ2VHdWlkYW5jZS5zZXRUZXh0KGNvbnRlbnQuZ2V0VXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRUZXh0KGNvbnRlbnQuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0KLQkJCQlpZiAoZXhwYW5kRmxhZykgewotCQkJCQlpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc191c2FnZUd1aWRhbmNlKSkgCi0JCQkJCXsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRVc2FnZUd1aWRhbmNlKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkpOwotCQkJCQl9IGVsc2UgaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucykpIAotCQkJCQl7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCXByZWZpeFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJYnJpZWZEZXNjVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkKLQkJCQlleHRlcm5hbElEVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCXVzYWdlR3VpZGFuY2Uuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQl1c2FnZUd1aWRhbmNlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJa2V5Q29uc2lkZXJhdGlvbnMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIGJyZWFrZG93biBlbGVtZW50IGRvY3VtZW50YXRpb24gc2VjdGlvbiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXByZWZpeFRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlicmllZkRlc2NUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJZXh0ZXJuYWxJRFRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl1c2FnZUd1aWRhbmNlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGl2ZSAidW5leHBhbmRlZCIgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChJTWV0aG9kUmljaFRleHQgY3RybCkgewotCQlhY3RpdmVDb250cm9sID0gY3RybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgInVuZXhwYW5kZWQiIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCQotCS8qKgotCSAqIEdldCBoZWlnaHQgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHJldHVybgotCSAqIAkJSGVpZ2h0IG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuaGVpZ2h0IC0gMyAqIDMyOwotCX0KLQotCS8qKgotCSAqIEdldCB3aWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlXaWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkud2lkdGggLSAyICogMzI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzczMDI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYmJlZFByb3BlcnR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnZpZXcuVGFiYmVkUHJvcGVydHlUaXRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBicmVha2Rvd25FbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JLy8gY29udHJvbHMKLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlLCBjaGVja0JveENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgcHJlc2VudGF0aW9uTmFtZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBtdWx0aXBsZUJ1dHRvbiwgb3B0aW9uYWxCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBwbGFubmVkQnV0dG9uLCBzdXByZXNzZWRCdXR0b247Ci0KLQlwcm90ZWN0ZWQgaW50IG51bU9mQ29sdW1ucyA9IDQ7Ci0KLQlwcm90ZWN0ZWQgaW50IGhvcml6b250YWxTcGFuID0gMzsKLQotCS8vIHByaXZhdGUgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQkvLyBlbGVtZW50Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8vIG1vZGlmeSBsaXN0ZW5lcgotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG5hbWVNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCWZpbmFsIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgTGlzdGVuZXIgbmFtZURlYWN0aXZhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCW5hbWVUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRFZGl0b3IoKQotCQkJCQkJLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJbWVzc2FnZSA9IFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCwgbmFtZVRleHQuZ2V0VGV4dCgpLAotCQkJCQkJc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCQkJfQotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCWlmICghbmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJCQkmJiAoZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50Ci0JCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCQkJCQkJCXByb2NDb21wLAotCQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0KLQkJCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQkJCW1zZyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW5hbWVfTWVzc2FnZTsgCi0KLQkJCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW5hbWVfVGl0bGUsIG1zZykpIHsgCi0JCQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCQkJbmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQkvLyBuYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQotCQkJCQkJCQl9Ci0JCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJcHJvY0NvbXAsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJCQluYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCQkJZ2V0RWRpdG9yKCkuc2V0UGFydE5hbWUoKTsKLQotCQkJCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZQotCQkJCQkJCQkvLyBlZGl0b3IKLQkJCQkJCQkJLy8KLQkJCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheQotCQkJCQkJCQkJCS5nZXREZWZhdWx0KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJCQkJCWVkaXRvcgotCQkJCQkJCQkJCQkJLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZWRpdG9yCi0JCQkJCQkJCQkJCQkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJcGVyc2lzdGVyCi0JCQkJCQkJCQkJCQkJLmFkanVzdExvY2F0aW9uKGVsZW1lbnQKLQkJCQkJCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCS8vCSBhZGp1c3QgZGlhZ3JhbSByZXNvdXJjZSBhcyB3ZWxsCi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoKFByb2Nlc3MpIGVsZW1lbnQsIHRoaXMpOwotCQkJCQkJCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCQltZ3IudXBkYXRlUmVzb3VyY2VVUkkoKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0pOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIHJlcGxhY2Ugd2l0aCBleGlzdGluZyBuYW1lCi0JCQkJCQkJCW5hbWVUZXh0LnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlCi0JCQkJCQkJLy8gZXJyb3IgbWVzc2FnZSBib3gKLQkJCQkJCQluYW1lVGV4dC5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlLCBtc2cpOyAKLQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCQluYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJbmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJCQkJCW5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCQkJbmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcmVzdG9yZSB0aGUgb2xkIG5hbWUgZmlyc3QsIHRoZW4gcHJlc2VudCB0aGUgZXJyb3IKLQkJCQkvLyBtZXNzYWdlIGJveAotCQkJCW5hbWVUZXh0LnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGUsIG1lc3NhZ2UpOyAKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQluYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJCW5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdGVuZXIgcHJlc2VudGF0aW9uTmFtZURlYWN0aXZhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQkJCi0JCQkvLyB5b3UgY2FuIGhhdmUgYmxhbmsgcHJlc2VudGF0aW9uIG5hbWUgZm9yIGFjdGl2aXR5IHRoYXQgZXh0ZW5kcyAKLQkJCWlmIChTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpKQotCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkJCSYmIHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpKSB7Ci0JCQkJCQotCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQlpZiAoIXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKS5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghU3RyVXRpbC5pc0JsYW5rKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0RWRpdG9yKCkKLQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCW1lc3NhZ2UgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50LAotCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCksIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJCX0KLQotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJaWYgKCFwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyByZXN0b3JlIHRoZSBvbGQgbmFtZSBmaXJzdCwgdGhlbiBwcmVzZW50IHRoZSBlcnJvcgotCQkJCS8vIG1lc3NhZ2UgYm94Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZSwgbWVzc2FnZSk7IAotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBCcmVha2Rvd25FbGVtZW50IG9iamVjdAotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQkJLy8gdGhpcy50YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSA9IHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JCWNyZWF0ZUdlbmVyYWxTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkTGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JLyoqCi0JICogIEFkZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGV2ZW50LndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQkJCi0JCX0pOwotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0KLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZXZlbnQud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJfQotCQkJCi0JCX0pOwkJCi0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy8gd2hlbiB1c2VyIHRhYiB0byB0aGlzIGZpZWxkLCBzZWxlY3QgYWxsIHRleHQKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkgIAotCQkJfQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgZm9jdXMgb2YgdGhlIGNvbXBvbmVudCBpcyBsb3N0IAotCQkJCWlmKHByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKXsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQkgICAgICAgICAgICB9IAotCQkJfQotCQl9KTsKLQkJCi0JCW11bHRpcGxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihtdWx0aXBsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJbXVsdGlwbGVCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQKLQkJCQkJCQkuZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlvcHRpb25hbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCBCb29sZWFuCi0JCQkJCQkJCS52YWx1ZU9mKG9wdGlvbmFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlvcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09wdGlvbmFsKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXBsYW5uZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCBCb29sZWFuCi0JCQkJCQkJCS52YWx1ZU9mKHBsYW5uZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlzdXByZXNzZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkvLyByZXZlYWxpbmcKLQkJCQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBlZGl0b3IuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJYm9vbGVhbiBjYW5SZXZlYWwgPSBQcm9jZXNzRWRpdG9yLmNhblJldmVhbCgKLQkJCQkJCQlBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IGVsZW1lbnQgfSksCi0JCQkJCQkJRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQlzdXBwcmVzc2lvbik7Ci0JCQkJCi0JCQkJCWlmICghY2FuUmV2ZWFsKQkJCQkJCi0JCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwkKLQkJCQkJZWxzZQotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwgQm9vbGVhbgotCQkJCQkJCQkudmFsdWVPZihzdXByZXNzZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ2VuZXJhbCBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBjcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JCWdlbmVyYWxTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlLCAKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb24sIFByb3BlcnRpZXNVdGlsLmdldFR5cGVMb3dlcihlbGVtZW50KSkpOyAKLQotCQkvLyBjcmVhdGUgZ2VuZXJhbCBjb21wb3NpdGUKLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZ2VuZXJhbFNlY3Rpb24sCi0JCQkJbnVtT2ZDb2x1bW5zLCBmYWxzZSk7Ci0KLQkJLy8gbmFtZQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX25hbWUpOyAKLQkJbmFtZVRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBTV1QuREVGQVVMVCwKLQkJCQlob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gcHJlc2VudGF0aW9uIG5hbWUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZSk7IAotCQlwcmVzZW50YXRpb25OYW1lVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBjaGVja2JveAotCQljaGVja0JveENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIG51bU9mQ29sdW1ucywgdHJ1ZSk7Ci0KLQkJLy8gb3B0aW9uYWwKLQkJb3B0aW9uYWxCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW9wdGlvbmFsQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbCk7IAotCi0JCS8vIE11bHRpcGxlIE9jdXJyYW5jZXMKLQkJbXVsdGlwbGVCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW11bHRpcGxlQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZSk7IAotCi0JCS8vIHBsYW5uZWQKLQkJcGxhbm5lZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJcGxhbm5lZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZCk7IAotCi0JCS8vIHN1cHJlc3NlZAotCQlzdXByZXNzZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXN1cHJlc3NlZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkKTsgCi0JCXN1cHJlc3NlZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY2hlY2tCb3hDb21wb3NpdGUpOwotCi0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGxpc3RuZXIgZm9yIG5hbWUgYW5kIHByZXNlbnRhdGlvbiBuYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTmFtZU1vZGlmeUxpc3RlbmVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCQkgKi8KLQotCQlwdWJsaWMgTmFtZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCi0JCQlnZXRFZGl0b3IoKS5zdXBlcihlbGVtZW50LCBjaGVja0NvbnRhaW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXN1cGVyLm1vZGlmeVRleHQoZSk7Ci0KLQkJCXVwZGF0ZVRpdGxlKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmFtZSBtb2RpZnkgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKiBAcGFyYW0gZU9iagotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBNb2RpZnlMaXN0ZW5lciBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoZU9iaiwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBNb2RpZnlMaXN0ZW5lciBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqLAotCQkJYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IE5hbWVNb2RpZnlMaXN0ZW5lcihlT2JqLCBjaGVja0NvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRpdGxlIG9mIHRoZSBwcm9wZXJ0aWVzIHBhZ2UKLQkgKiBAcGFyYW0gdHh0Ci0JICogCQkJbmV3IHRpdGxlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGl0bGUoU3RyaW5nIHR4dCkgewotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWVQcmVmaXgoKSArIHR4dDsKLQkJVGFiYmVkUHJvcGVydHlDb21wb3NpdGUgY29tcCA9IChUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSkgcGFnZQotCQkJCS5nZXRDb250cm9sKCk7Ci0JCVRhYmJlZFByb3BlcnR5VGl0bGUgdGl0bGUgPSBjb21wLmdldFRpdGxlKCk7Ci0KLQkJdGl0bGUuc2V0VGl0bGUobmFtZSwgZ2V0SW1hZ2UoZWxlbWVudCkpOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlpZiAobGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQkJcmV0dXJuIHRpdGxlSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJLy8gZ2V0IEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQkvLyB1cGRhdGUgc2VjdGlvbiBuYW1lCi0JCQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkJCS5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLmJpbmQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJCQkvLyBNb2RlbCBNb2RpZnkgbGlzdGVuZXIgZm9yIHByZXNlbnRhdGlvbiBuYW1lCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dAotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQl9Ci0JCQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGdldEVkaXRvcigpLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGVsZW1lbnQpOwotCi0JCQkJLy8gTW9kaWZ5IGxpc3RlbmVyIGZvciBuYW1lCi0JCQkJaWYgKG5hbWVNb2RpZnlMaXN0ZW5lciAhPSBudWxsKQotCQkJCQluYW1lVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcigKLQkJCQkJCQkoKFByb2Nlc3MpIGVsZW1lbnQpLmVDb250YWluZXIoKSwgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbmFtZU1vZGlmeUxpc3RlbmVyID0gY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKGVsZW1lbnQpOwotCQkJCX0KLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQkJaWYgKG5hbWVNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBuYW1lTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJbmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKG5hbWVNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBuYW1lTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCW5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQltdWx0aXBsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJb3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNPcHRpb25hbCgpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJLy8gZ2V0IHNlbGVjdGVkIG9yaWdpbmFsIGlucHV0IG9iamVjdAotCQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaWYgKGdldEVkaXRvcigpLmdldFN1cHByZXNzaW9uKCkuaXNJblN1cHByZXNzZWRMaXN0KAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaW5wdXQpKSB7Ci0JCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIGJyZWFrZG93biBlbGVtZW50IGdlbmVyYWwgc2VjdGlvbiIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQluYW1lVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJbmFtZVRleHQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCW11bHRpcGxlQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlvcHRpb25hbEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJcGxhbm5lZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLS8vCQlzdXByZXNzZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHdWlkYW5jZVNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R3VpZGFuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGQ0ODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHdWlkYW5jZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0d1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIFRoZSBicmVha2Rvd24gZWxlbWVudCBndWlkYW5jZSBzZWN0aW9uLiBJdCBsaXN0IGFsbCBhdmFpbGFibGUgZ3VpZGFuY2VzIGZvciBhbiBicmVha2Rvd24gZWxlbWVudAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50R3VpZGFuY2VTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9yZW1vdmVfMTsKLQotCXByaXZhdGUgVGFibGUgY3RybF90YWJsZV8xOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXJfMTsKLQotCS8vIGVsZW1lbnQKLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbnVsbDsKLQotCQotCi0JLyoqCi0JICogR2V0IEdlbmVyYWwgZ3VpZGFuY2UgZmlsdGVyCi0JICogCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0R2VuZXJhbEd1aWRhbmNlRmlsdGVyKCkgewotCQlpZiAoZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID09IG51bGwpIHsKLQkJCWdlbmVyYWxHdWlkYW5jZUZpbHRlciA9IG5ldyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoCi0JCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgdGFiTmFtZSkgewotCQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAoKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopCi0JCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCUNsYXNzIGNscyA9IEZpbHRlckluaXRpYWxpemVyLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q2xhc3NGb3JUeXBlKGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCkpOwotCQkJCQlpZiAoY2xzICE9IG51bGwpIHsKLQkJCQkJCWlmIChjbHMuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkgfHwgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCi0JCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCX0KLQkJCX07Ci0JCX1lbHNlIHsKLQkJCSgoUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKSBnZW5lcmFsR3VpZGFuY2VGaWx0ZXIpLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhbEd1aWRhbmNlRmlsdGVyOwotCX0KLQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIGd1aWRhbmNlIHNlY3Rpb24KLQkJY3JlYXRlR3VpZGFuY2VTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiAgVXBkYXRlIGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlIGZsYWcuIENvbnRyb2xzIGNhbiBiZWNvbWUgZWRpdGFibGUgb3IgdW4tZWRpdGFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjb250cm9scwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkVycm9yIHJlZnJlc2hpbmcgYWN0aXZpdHkgZ3VpZGFuY2Ugc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGd1aWRhbmNlIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3VpZGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IHRhYmxlSGVpZ2h0ID0gNTA7Ci0JCVN0cmluZyBzZWN0aW9uVGl0bGUgPSBudWxsOwotCQlTdHJpbmcgc2VjdGlvbkRlc2MgPSBudWxsOwotCQlTdHJpbmcgdGFibGVUaXRsZSA9IG51bGw7Ci0KLQkJLy8gR0VORVJBTCBHVUlEQU5DRQotCQl7Ci0JCQlzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlOyAKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbjsgCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U7IAotCi0JCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQkJc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCQljdHJsX3RhYmxlXzEgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXZpZXdlcl8xID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMSk7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KGdldFNlbGVjdGVkR3VpZGFuY2VzKCkpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8xLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdldEFkYXB0ZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJcGFyZW50ID0gYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb246OmFkZExpc3RlbmVycyAtIElCU0l0ZW1Qcm92aWRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfMS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfMQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEdlbmVyYWxHdWlkYW5jZUZpbHRlcigpOwotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwKLQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UsIGdldFNlbGVjdGVkR3VpZGFuY2VzKCkpOwotCi0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSk7Ci0JCQkJCWZkLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQuc2V0VHlwZXMoZ2V0RmlsdGVyVHlwZXMoKSk7CQkJCQotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEd1aWRhbmNlcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCXJlbW92ZUd1aWRhbmNlcyhybUl0ZW1zKTsKLQkJCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgZ3VpZGFuY2VzIHRvIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGFkZEl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIGFkZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRHdWlkYW5jZXMoTGlzdDxHdWlkYW5jZT4gYWRkSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlBZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQoCi0JCQkJZWxlbWVudCwgYWRkSXRlbXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZ3VpZGFuY2VzIGZyb20gdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcm1JdGVtcwotCSAqIAkJCQlsaXN0IG9mIGd1aWRhbmNlcyB0byByZW1vdmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlR3VpZGFuY2VzKExpc3Q8R3VpZGFuY2U+IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gZ3VpZGFuY2VzIGZvciBhY3Rpdml0eQotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2dnZXIKLQkJCQkJCQkubG9nRXJyb3IoIkNhbid0IHJlbW92ZSBHdWlkYW5jZTogIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIGd1aWRhbmNlcwotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0IG9mIGV4aXN0aW5nIHNlbGVjdGVkIGd1aWRhbmNlcwotCSAqLwotCXByaXZhdGUgTGlzdDxHdWlkYW5jZT4gZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoKSB7Ci0JCUxpc3Q8R3VpZGFuY2U+IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENoZWNrbGlzdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENvbmNlcHRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRFeGFtcGxlcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSk7Ci0KLQkJcmV0dXJuIGl0ZW1MaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBsaXN0IG9mIGZpbHRlciB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlcygpIHsKLQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxNF07Ci0JCWludCBpID0gMDsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVBPUlRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5URU1QTEFURVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuV0hJVEVfUEFQRVJTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5URVJNX0RFRklOSVRJT05TOwotCQlyZXR1cm4gc3RyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmEyMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0NvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBjb21wb3NpdGUgcm9sZSAtIHJvbGUgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlUm9sZVNlY3Rpb24gZXh0ZW5kcyBPQlNSZWxhdGlvblNlY3Rpb24gewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KS5nZXRBZ2dyZWdhdGVkUm9sZXMoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoQ29tcG9zaXRlUm9sZSkgZWxlbWVudDsKLQotCQlTdHJpbmcgdGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU7Ci0JCVN0cmluZyBkZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uOwotCQlTdHJpbmcgdGFibGUxID0gUHJvcGVydGllc1Jlc291cmNlcy5Db21wb3NpdGVSb2xlX1JvbGVfVGFibGUxOwotCQlzZXRUYWJEYXRhKHRpdGxlLCBkZXNjLCB0YWJsZTEpOyAKLQkJc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uID0gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQllbGVtZW50ID0gKENvbXBvc2l0ZVJvbGUpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgQ29tcG9zaXRlIHJvbGUgLSByb2xlIHNlY3RpbiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBjb21wb3NpdGUgcm9sZXMgCi0JICogQHBhcmFtIGl0ZW1zCi0JICogCQlMaXN0IG9mIHJvbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZChMaXN0IGl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCShDb21wb3NpdGVSb2xlKSBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksCi0JCQkJCQkJKFJvbGUpIG9iaiwgLTEpOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChyb2xlICE9IG51bGwpCi0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQkJCQkJcm9sZSwgLTEpOwotCQkJCQllbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcik7IAotCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXROYW1lKCksCi0JCQkJCQkJCSgoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCkuZ2V0TmFtZSgpIH07Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlbW92ZShqYXZhLnV0aWwuQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0b3IubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksIHJvbGUsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSAoKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQpLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGdldEZpbHRlcigpLCBlbGVtZW50LAotCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUywgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCWZkLm9wZW4oKTsKLQkJYWRkKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkgewotCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTOwotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzKCk7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKSBnZXRQcm9jZXNzKGVsZW1lbnQpOwotCQlJRmlsdGVyIGRlc2NyaXB0b3JGaWx0ZXIgPSBnZXREZXNjcmlwdG9yRmlsdGVyKCk7Ci0JCWlmIChkZXNjcmlwdG9yRmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlkZXNjcmlwdG9yRmlsdGVyLCBwcm9jZXNzLCB0YWJOYW1lLCBleGlzdGluZ0VsZW1lbnRzKTsKLQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpOwotCQkJZmQub3BlbigpOwotCQkJYWRkKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IEZpbmQgcGFyZW50IHVudGlsIGl0J3MgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQlwcm9jZXNzIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvY2VzcyhCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcmV0dXJuIHBhcmVudDsKLQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFByb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZGVzY3JpcHRvciBwcm9jZXNzIGZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldERlc2NyaXB0b3JGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCS8vIExpc3QgbGlzdCA9ICgoQWN0aXZpdHkpb2JqKS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QpOwotCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJaWYgKG9iai5lcXVhbHMoZWxlbWVudCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDM3OGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0KLS8qKgotICogVGhlIGRvY3VtZW50IHRhYiBzZWN0aW9uIGZvciBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIHsKLQotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCByZWZpbmVkRGVzYzsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IHJlZmluZWREZXNjOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoRGVzY3JpcHRvckRlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJcmVmaW5lZERlc2MsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2NyZWF0ZURvY3VtZW50U2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlRG9jdW1lbnRTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0JCWludCBoZWlnaHRIaW50ID0gMjAwOwotCi0JCS8vIHJlZmluZWQgZGVzY3JpcHRpb24KLQkJUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgcmVmaW5lZENvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkRlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIocmVmaW5lZENvbnRhaW5lci5saW5rKTsKLQkJcmVmaW5lZERlc2MgPSByZWZpbmVkQ29udGFpbmVyLnJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdChnZXRFbGVtZW50KCkpOwotCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCQlyZWZpbmVkRGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlyZWZpbmVkRGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNhdmVNb2RpZmllZFJpY2hUZXh0KCk7Ci0KLQkJCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gY29udGVudCA9IChEZXNjcmlwdG9yRGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlyZWZpbmVkRGVzYy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwkJCi0JCQkJfQotCQkJCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJCi0JCQkJcmVmaW5lZERlc2Muc2V0VGV4dChjb250ZW50LmdldFJlZmluZWREZXNjcmlwdGlvbigpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKQotCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkRlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uKSkgeyAKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRSZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCQkJCXJlZmluZWREZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyBkZXNjcmlwdG9yIGRvY3VtZW50YXRpb24gc2VjdGlvbiA6IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2IxOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzeW5jaHJvbml6ZWRCdXR0b247Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCS8vIGdldCBEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIGNoZWNrYm94Ci0JCWNoZWNrQm94Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgbnVtT2ZDb2x1bW5zLCB0cnVlKTsKLQotCQlzeW5jaHJvbml6ZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlzeW5jaHJvbml6ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKHN5bmNocm9uaXplZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJc3luY2hyb25pemVkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJc3luY2hyb25pemVkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50Ci0JCQkJCQkuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBEZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FUEZQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VQRlByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGNiNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VQRlByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBwcm9wZXJ0eSBzaGVldCBwYWdlIGZvciBwcm9jZXNzIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVQRlByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgewotCi0JcHJpdmF0ZSBJUHJvcGVydHlTaGVldEVudHJ5IHJvb3RFbnRyeTsKLQotCXByaXZhdGUgc3RhdGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc0VkaXRvciBwcm9jZXNzRWRpdG9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybVBhZ2VJRCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGZvcm1QYWdlID0gbnVsbDsKLQotCXB1YmxpYyBFUEZQcm9wZXJ0eVNoZWV0UGFnZShQcm9jZXNzRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpIGVkaXRvcik7Ci0KLQkJYWN0aW9uTWdyID0gKChQcm9jZXNzRWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJcHJvY2Vzc0VkaXRvciA9IGVkaXRvcjsKLQotCX0KLQotCS8qKgotCSAqIEdldCBhY3Rpb24gbWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKiAJCQlBY3Rpb24gTWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGFjdGlvbk1ncjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCVByb2Nlc3MgRWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIHByb2Nlc3NFZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGFzIHRoZSBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIuCi0JICogPHA+Ci0JICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIGlmIHlvdSBhcmUgdXNpbmcgdGhpcyBwYWdlJ3MgZGVmYXVsdAotCSAqIHJvb3QgZW50cnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U291cmNlUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc291cmNlUHJvdmlkZXIgPSBuZXdQcm92aWRlcjsKLQkJaWYgKHJvb3RFbnRyeSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgcm9vdAotCQkJUHJvcGVydHlTaGVldEVudHJ5IHJvb3QgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0KLQkJCXJvb3RFbnRyeSA9IHJvb3Q7Ci0JCX0KLQkJaWYgKHNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCS8vIHNldCB0aGUgcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGZvciByb290IGVudHJ5Ci0JCQlpZiAocm9vdEVudHJ5IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0JCQkJKChQcm9wZXJ0eVNoZWV0RW50cnkpIHJvb3RFbnRyeSkKLQkJCQkJCS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHNvdXJjZVByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBzb3VyY2VQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gc2VsZWN0aW9uIG9mIHRoZSBvYmplY3QgZnJvbSBicmVha2Rvd24gc3RydWN0dXJlIG9mIHRoZSBwcm9jZXNzIGVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsKSB7Ci0JCXNlbGVjdGlvbiA9IHNlbDsKLQotCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCXByb2Nlc3NFZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgcGFydDsKLQkJCWFjdGlvbk1nciA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSBwcm9jZXNzRWRpdG9yLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpCi0JCQkJZm9ybVBhZ2UgPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBhY3RpdmVQYWdlOwotCQkJZm9ybVBhZ2VJRCA9IGFjdGl2ZVBhZ2UgIT0gbnVsbCA/IGFjdGl2ZVBhZ2UuZ2V0SWQoKSA6IG51bGw7Ci0JCX0KLQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UjaGFuZGxlUGFydEFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVQYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQlwcm9jZXNzRWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHBhcnQ7Ci0JCQlzZWxlY3Rpb24gPSBwcm9jZXNzRWRpdG9yLmdldFNlbGVjdGlvbigpOwotCQkJYWN0aW9uTWdyID0gcHJvY2Vzc0VkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkKLQkJCQlmb3JtUGFnZSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGFjdGl2ZVBhZ2U7Ci0JCQlmb3JtUGFnZUlEID0gYWN0aXZlUGFnZSAhPSBudWxsID8gYWN0aXZlUGFnZS5nZXRJZCgpIDogbnVsbDsKLQkJfQotCi0JCXN1cGVyLmhhbmRsZVBhcnRBY3RpdmF0ZWQocGFydCk7Ci0JCQotCQl0aGlzLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY3VycmVudCBhZGFwdGVyIGZhY3Rvcnkgb2YgZWRpdG9yCi0JICogQHJldHVybgotCSAqIAkJCUFkYXB0ZXIgRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmb3JtUGFnZS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UjcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQkvLyB3aWxsIHNlZSBpZiB0aGlzIHdvcmtzLi4KLQkJdHJ5IHsKLQkJCXN1cGVyLnJlZnJlc2goKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCQotLy8gVE9ETyAtIGdldCByaWQgb2YgaW50ZXJuYWwgQVBJcy4KLS8vCQlpZiAodGhpcy5nZXRDdXJyZW50VGFiKCkgIT0gbnVsbCkgewotLy8JCQl0aGlzLmdldEN1cnJlbnRUYWIoKS5yZWZyZXNoKCk7Ci0vLwotLy8JCQkvLyBhbHNvIHJlZnJlc2ggc2VjdGlvbgotLy8JCQlJU2VjdGlvbiBzZWN0aW9uID0gdGhpcy5nZXRDdXJyZW50VGFiKCkuZ2V0U2VjdGlvbkF0SW5kZXgoMCk7Ci0vLwkJCWlmIChzZWN0aW9uICE9IG51bGwpIHsKLS8vCQkJCXNlY3Rpb24ucmVmcmVzaCgpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0ZGU3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlcjsKLQotCi0vKioKLSAqIExhYmVsIHByb3ZpZGVyIGZvciB0aGUgdGl0bGUgYmFyIGZvciB0aGUgdGFiYmVkIHByb3BlcnR5IHNoZWV0IHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJVHlwZU1hcHBlciB0eXBlTWFwcGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBFbGVtZW50TGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdHlwZU1hcHBlciA9IG5ldyBFbGVtZW50VHlwZU1hcHBlcigpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3RzKSB7Ci0JCWlmIChvYmplY3RzID09IG51bGwgfHwgb2JqZWN0cy5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUltYWdlIGltYWdlID0gTGlicmFyeVVJSW1hZ2VzLklNR19QUk9DRVNTOwotCQlmaW5hbCBib29sZWFuIG11bHRpcGxlW10gPSB7IGZhbHNlIH07Ci0JCWZpbmFsIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0cywgbXVsdGlwbGUpOwotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIGltYWdlOwotCQl9IGVsc2UgewotCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQotCQkJcmV0dXJuIHRpdGxlSW1hZ2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdHMpIHsKLQkJaWYgKG9iamVjdHMgPT0gbnVsbCB8fCBvYmplY3RzLmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob0l0ZW1zOyAKLQkJfQotCQlmaW5hbCBib29sZWFuIG11bHRpcGxlW10gPSB7IGZhbHNlIH07Ci0JCWZpbmFsIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0cywgbXVsdGlwbGUpOwotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpID4gMSkgewotCQkJT2JqZWN0IHNpemUgPSBuZXcgSW50ZWdlcigoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzKS5zaXplKCkpOwotCQkJU3RyaW5nIG1zZyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSXRlbXNTZWxlY3RlZCwgKG5ldyBPYmplY3RbXSB7IHNpemUgfSkpOyAKLQkJCXJldHVybiBtc2c7Ci0JCX0gZWxzZSB7Ci0KLQkJCU9iamVjdCBvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqZWN0KTsKLQkJCXJldHVybiBnZXROYW1lKG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmaXggPSBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlKG9iaik7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW5hbWUgPSBwcmVmaXggKyAiIDogIiArICgoQnJlYWtkb3duRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlOyAKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBhIG11bHRpcGxlIG9iamVjdCBzZWxlY3Rpb24gaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBsYWJlbAotCSAqIHByb3ZpZGVyLiBJZiB0aGUgb2JqZWN0cyBpcyBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLCBzZWUgaWYgYWxsIHRoZQotCSAqIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgdGhlIHNhbWUgYW5kIGlmIHNvLCB3ZSB3YW50IHRvIHByb3ZpZGUKLQkgKiBsYWJlbHMgZm9yIHRoZSBjb21tb24gc2VsZWN0ZWQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0cwotCSAqICAgICAgICAgICAgYSBzaW5nbGUgb2JqZWN0IG9yIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0JICogQHBhcmFtIG11bHRpcGxlCi0JICogICAgICAgICAgICBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyB0cnVlIGlmIHRoZXJlIGlzIG11bHRpcGxlCi0JICogICAgICAgICAgICB1bmVxdWFsIHNlbGVjdGVkIGVsZW1lbnRzIGluIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0JICogQHJldHVybiB0aGUgb2JqZWN0IHRvIGdldCBsYWJlbHMgZm9yLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldE9iamVjdChPYmplY3Qgb2JqZWN0cywgYm9vbGVhbiBtdWx0aXBsZVtdKSB7Ci0JCUFzc2VydC5pc05vdE51bGwob2JqZWN0cyk7Ci0JCU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlpZiAob2JqZWN0cyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdHM7Ci0JCQlvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJLy8gb25lIGVsZW1lbnQgc2VsZWN0ZWQKLQkJCQltdWx0aXBsZVswXSA9IGZhbHNlOwotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCQkvLyBtdWx0aXBsZSBlbGVtZW50cyBzZWxlY3RlZAotCQkJbXVsdGlwbGVbMF0gPSB0cnVlOwotLy8JCQlDbGFzcyBmaXJzdENsYXNzID0gdHlwZU1hcHBlci5tYXBUeXBlKG9iamVjdCwgb2JqZWN0LmdldENsYXNzKCkpOwotCQkJQ2xhc3MgZmlyc3RDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShvYmplY3QpOwotCQkJLy8gZGV0ZXJtaW5lIGlmIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgc2VsZWN0aW9uIGFyZSB0aGUgc2FtZSB0eXBlCi0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaS5uZXh0KCk7Ci0vLwkJCQkJQ2xhc3MgbmV4dENsYXNzID0gdHlwZU1hcHBlci5tYXBUeXBlKG5leHQsIG5leHQKLS8vCQkJCQkJCS5nZXRDbGFzcygpKTsKLQkJCQkJQ2xhc3MgbmV4dENsYXNzID0gdHlwZU1hcHBlci5tYXBUeXBlKG5leHQpOwotCQkJCQlpZiAoIW5leHRDbGFzcy5lcXVhbHMoZmlyc3RDbGFzcykpIHsKLQkJCQkJCS8vIHR3byBlbGVtZW50cyBub3QgZXF1YWwgPT0gbXVsdGlwbGUgc2VsZWN0ZWQgdW5lcXVhbAotCQkJCQkJbXVsdGlwbGVbMF0gPSBmYWxzZTsKLQkJCQkJCW9iamVjdCA9IG51bGw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW11bHRpcGxlWzBdID0gZmFsc2U7Ci0JCQlvYmplY3QgPSBvYmplY3RzOwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRUeXBlTWFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudFR5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlYzA1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudFR5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlcjsKLQotCi0vKioKLSAqIFR5cGUgbWFwcGVyIGZvciB0aGUgbG9naWMgZXhhbXBsZS4gV2Ugd2FudCB0byBnZXQgdGhlIEdFRiBtb2RlbCBvYmplY3QgZnJvbQotICogdGhlIHNlbGVjdGVkIGVsZW1lbnQgaW4gdGhlIG91dGxpbmUgdmlldyBhbmQgdGhlIGRpYWdyYW0uIFdlIGNhbiB0aGVuIGZpbHRlcgotICogb24gdGhlIG1vZGVsIG9iamVjdCB0eXBlLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50VHlwZU1hcHBlciBpbXBsZW1lbnRzIElUeXBlTWFwcGVyIHsKLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlciNtYXBUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENsYXNzIG1hcFR5cGUoT2JqZWN0IG9iamVjdCkgewotLy8JCUNsYXNzIHR5cGUgPSBlZmZlY3RpdmVUeXBlOwotCQlDbGFzcyB0eXBlID0gbnVsbDsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQl0eXBlID0gb2JqZWN0LmdldENsYXNzKCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXR5cGUgPSAoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCkuZ2V0Q2xhc3MoKTsKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gdHlwZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Zvcm1VSS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Zvcm1VSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWVkMmMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Gb3JtVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RGb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0KLS8qKgotICogVGhlIFVJIHV0aWwgY2xhc3MgdGFpbG9yZWQgZm9yIHByb3BlcnRpZXMgdmlldyBmb3IgcHJvY2VzcyBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9ybVVJIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIID0gMzAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGFiZWwgX2NyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgc3RyLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHN0cik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBzdHIpIHsKLQkJLy8gbWFrZSBob3Jpem9uYXRhbFNwYW4gMQotCQlyZXR1cm4gX2NyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgc3RyLCBHcmlkRGF0YS5CRUdJTk5JTkcsIDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBzdHIsIGludCBob3Jpem9udGFsU3BhbikgewotCQkvLyBtYWtlIGhvcml6b25hdGFsU3BhbiAyCi0JCXJldHVybiBfY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBzdHIsIEdyaWREYXRhLkJFR0lOTklORywKLQkJCQlob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVGV4dCBfY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHRleHRTdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCBob3Jpem9udGFsU3BhbikgewotCQlUZXh0IGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZVRleHQocGFyZW50LCAiIiwgdGV4dFN0eWxlKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIF9jcmVhdGVUZXh0KHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgU1dULkRFRkFVTFQsIERFRkFVTFRfV0lEVEgsCi0JCQkJU1dULkRFRkFVTFQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaGVpZ2h0KSB7Ci0JCXJldHVybiBfY3JlYXRlVGV4dCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LCBERUZBVUxUX1dJRFRILCBTV1QuREVGQVVMVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBoZWlnaHQsIGludCBob3Jpem9udGFsU3BhbikgewotCQlyZXR1cm4gX2NyZWF0ZVRleHQodG9vbGtpdCwgcGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULldSQVAsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBoZWlnaHQsIERFRkFVTFRfV0lEVEgsIGhvcml6b250YWxTcGFuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWV0aG9kUmljaFRleHQgX2NyZWF0ZVJpY2hUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIFN0cmluZyBwYXRoLAotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBMYWJlbCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0KHRvb2xraXQsCi0JCQkJcGFyZW50LAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgcGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIGNyZWF0ZVJpY2hUZXh0V2l0aExpbmsoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBoZWlnaHQsIFN0cmluZyBwYXRoLAotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVJbWFnZUh5cGVyTGluayh0b29sa2l0LCBwYXJlbnQsIEF1dGhvcmluZ1VJSW1hZ2VzLklNR19DT0xMQVBTRUQsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlblJURSk7Ci0JCWxpbmsuc2V0RGF0YSgiVGl0bGUiLCBsYWJlbFRleHQpOyAvLyROT04tTkxTLTEkCi0JCUxhYmVsIGRlY29yYXRlZExhYmVsID0gQmFzZUZvcm1QYWdlLmNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQkJKChHcmlkRGF0YSlkZWNvcmF0ZWRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IF9jcmVhdGVSaWNoVGV4dCh0b29sa2l0LCBwYXJlbnQsIGhlaWdodCwgREVGQVVMVF9XSURUSCwgcGF0aCwKLQkJCQltZXRob2RFbGVtZW50LCBkZWNvcmF0ZWRMYWJlbCk7Ci0JCWxpbmsuc2V0SHJlZihjb250cm9sKTsKLQotCQlyZXR1cm4gbmV3IFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyKGNvbnRyb2wsIGxpbmssIGRlY29yYXRlZExhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlSHlwZXJsaW5rIGNyZWF0ZUltYWdlSHlwZXJMaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBJbWFnZSBpbWFnZSwgU3RyaW5nIHRvb2xUaXApIHsKLQkJSW1hZ2VIeXBlcmxpbmsgbGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsocGFyZW50LCBTV1QuTEVGVAotCQkJCXwgU1dULlRPUCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxpbmsuc2V0SW1hZ2UoaW1hZ2UpOwotCQlsaW5rLnNldFRvb2xUaXBUZXh0KHRvb2xUaXApOwotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTgotCQkJCXwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBnZFN0eWxlKSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04KLQkJCQl8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShnZFN0eWxlKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCXRvb2xraXQuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlTZWN0aW9uIHNlY3Rpb24sIGludCBudW1PZkNvbHVtbnMsIGJvb2xlYW4gZXhwYW5kZWQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobnVtT2ZDb2x1bW5zLCBmYWxzZSkpOwotCQlpZiAoIWV4cGFuZGVkKQotCQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJZWxzZQotCQkJY29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBncmlkU3R5bGUpIHsKLQkJQ29tcG9zaXRlIHBhbmUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZFN0eWxlKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBwYW5lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGdyaWRTdHlsZSwgaW50IG51bU9mQ29sdW1ucywKLQkJCWJvb2xlYW4gZXF1YWxTaXplQ29sdW1uKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWRTdHlsZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbnVtT2ZDb2x1bW5zOwotCQlwYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KG51bU9mQ29sdW1ucywgZXF1YWxTaXplQ29sdW1uKTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBhbmUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJldHVybiBwYW5lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEJ1dHRvbiBfY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgYnV0dG9uU3RyLCBpbnQgc3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlCdXR0b24gY29udHJvbCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwgYnV0dG9uU3RyLCBzdHlsZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEJ1dHRvbiBfY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgYnV0dG9uU3RyLCBpbnQgc3R5bGUpIHsKLQkJQnV0dG9uIGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblN0ciwgc3R5bGUpOwotCQljb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0JCi0JCi0KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBfY3JlYXRlQ29tYm8oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm8oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBob3Jpem9udGFsU3BhbikgewotCQlyZXR1cm4gX2NyZWF0ZUNvbWJvKHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5GTEFUCi0JCQkJfCBTV1QuUkVBRF9PTkxZLCBob3Jpem9udGFsU3Bhbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblN0cikgewotCQlyZXR1cm4gX2NyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYXJlbnQsIGJ1dHRvblN0ciwgU1dULk5PTkUpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlyZXR1cm4gX2NyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYXJlbnQsICIiLCBzdHlsZSwgaG9yaXpvbnRhbFNwYW4pOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUNoZWNrQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikKLQl7Ci0JCUJ1dHRvbiBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCAiIiwgU1dULkNIRUNLKTsJCS8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVGFibGUgX2NyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgdGFibGVTdHlsZSwgaW50IGdyaWRTdHlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoLAotCQkJaW50IHZlcnRpY2FsU3BhbiwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCVRhYmxlIHRhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShwYXJlbnQsIHRhYmxlU3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gdmVydGljYWxTcGFuOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGFibGUgY3JlYXRlVGFibGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gX2NyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJMjAwLCAyMDAsIDEsIDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGFibGUgY3JlYXRlVGFibGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBoZWlnaHQpIHsKLQkJcmV0dXJuIF9jcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCWhlaWdodCwgMjAwLCAxLCAxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvTWlsZXN0b25lRG9jdW1lbnRTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvTWlsZXN0b25lRG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGU1NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL01pbGVzdG9uZURvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotCi0vKioKLSAqIFRoZSBkb2N1bWVudCB0YWIgc2VjdGlvbiBmb3IgTWlsZXN0b25lCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZURvY3VtZW50U2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gewotCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IG1haW5EZXNjOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogbWFpbkRlc2M7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKG1haW5EZXNjLAotCQkJCQlvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwgbmV3Q29udGVudCwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2NyZWF0ZURvY3VtZW50U2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlRG9jdW1lbnRTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0JCWludCBoZWlnaHRIaW50ID0gMjAwOwotCi0JCS8vIG1haW4gZGVzY3JpcHRpb24KLQkJUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgbWFpbkRlc2NDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX21haW5EZXNjcmlwdGlvbik7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKG1haW5EZXNjQ29udGFpbmVyLmxpbmspOwotCQltYWluRGVzYyA9IG1haW5EZXNjQ29udGFpbmVyLnJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQltYWluRGVzYy5zZXRNb2RhbE9iamVjdChnZXRFbGVtZW50KCkpOwotCQltYWluRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQltYWluRGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQltYWluRGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCW1haW5EZXNjLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7CQkKLQkJCQl9Ci0JCQkKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQltYWluRGVzYy5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCi0JCQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCQkJaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygKLQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uKSkgCi0JCQkJCXsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQltYWluRGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQltYWluRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCW1haW5EZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyBtaWxlc3RvbmUgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIDoiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3YjQ4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvT0JTUmVsYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzUm9sZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGJhc2UgT0JTIHJlbGF0aW9uIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT0JTUmVsYXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9hZGRfMiwgY3RybF9yZW1vdmU7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfc2VsZWN0ZWQ7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVzYzsKLQkKLQlwcml2YXRlIFN0cmluZyB0YWJsZTE7Ci0KLQkvLyBlbGVtZW50Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8vIGJ5IGRlZmF1bHQgdGhpcyBidXR0b24gaXMgZmFsc2UKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93QWRkRnJvbVByb2Nlc3NCdXR0b24gPSBmYWxzZTsKLQotCS8vIGZpbHRlcgotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcihnZXRDb25maWd1cmF0aW9uKCksIG51bGwsCi0JCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCWNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBicmVha2Rvd25lbGVtZW50IG9iamVjdAotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFiRGF0YShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBTdHJpbmcgdGFibGUxKSB7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy50YWJsZTEgPSB0YWJsZTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgc2VjdGlvbgotCQlTZWN0aW9uIGFTZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgcGFyZW50LAotCQkJCXRpdGxlLCBkZXNjKTsKLQotCQkvLyBjcmVhdGUgZ2VuZXJhbCBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYVNlY3Rpb24sIDIsCi0JCQkJZmFsc2UpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZTEpOwotCi0JCWN0cmxfc2VsZWN0ZWQgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEpOwotCQl2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZCk7Ci0KLQkJaW5pdENvbnRlbnRQcm92aWRlcigpOwotCi0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkvLyBjcmVhdGUgYnV0dG9ucwotCQljdHJsX2FkZF8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7IAotCQlpZiAoc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uKSB7Ci0JCQljdHJsX2FkZF8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCX0KLQkJY3RybF9yZW1vdmUgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgRGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBnZXRBZGFwdGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXBhcmVudCA9IGJzSXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHBhcmVudCkKLQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlyZXR1cm4gY29uZmlnOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiT0JTUmVsYXRpb25TZWN0aW9uOjpnZXREZWZhdWx0Q29uZmlndXJhdGlvbiAtIElCU0l0ZW1Qcm92aWRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJY3RybF9zZWxlY3RlZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWRkXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkFkZERpYWxvZygpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChzaG93QWRkRnJvbVByb2Nlc3NCdXR0b24pIHsKLQkJCWN0cmxfYWRkXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKTsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZShybUl0ZW1zKTsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbGVtZW50ICIrZWxlbWVudC5nZXROYW1lKCkgKwotCQkvLyAiRWRpdGFibGUtIitlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8xICE9IG51bGwpCi0JCQljdHJsX2FkZF8xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMiAhPSBudWxsKQotCQkJY3RybF9hZGRfMi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQlpZiAoY3RybF9yZW1vdmUgIT0gbnVsbCkKLQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY3RybF9yZW1vdmUgIT0gbnVsbCkKLQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQkvLyBwcm90ZWN0ZWQgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KQotCS8vIHsKLQkvLyBBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JLy8gQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPQotCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JLy8gYUZhY3RvcnkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkvLyBPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JLy8gaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCS8vIHsKLQkvLyBhY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCS8vIH0KLQkvLwkJCi0JLy8gcmV0dXJuIGFjdGl2aXR5OwotCS8vIH0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCX0KLQotCS8qKgotCSAqIE9wZW4gVUkgRGlhbG9nIHRvIGFkZCBtZXRob2QgZWxlbWVudHMKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBVSSBEaWFsb2cgdG8gYWRkIGRlc2NyaXB0b3IgZWxlbWVudHMKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpIHsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGQoT2JqZWN0W10gaXRlbXMpIHt9Ci0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3NvckRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NGYzMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBEaWFsb2cgZm9yIGFkZGluZyBwcmVkZWNlc3NvciBkZXBlbmRlbmN5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkZWNlc3NvckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIFRleHQgcHJlZElkVGV4dDsKLQotCXByaXZhdGUgVGV4dCBwcmVzZW50YXRpb25OYW1lOwotCi0JcHJpdmF0ZSBDb21ibyBkZXBlbmRlbmN5OwotCi0JLyoqIERlcGVuZGVuY3kgTGl0ZXJhbHMgKiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fU1RBUlQgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIOyAKLQotCXByaXZhdGUgU3RyaW5nW10gZGVwZW5kZW5jeUxpc3QgPSBuZXcgU3RyaW5nW10geyBGSU5JU0hfVE9fU1RBUlQsCi0JCQlGSU5JU0hfVE9fRklOSVNILCBTVEFSVF9UT19TVEFSVCwgU1RBUlRfVE9fRklOSVNIIH07Ci0KLQlwcml2YXRlIFdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIE9iamVjdCBwcm9jZXNzOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgTGlzdCBwcmVkZWNlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIExpc3QgcHJlZE1hcExpc3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JNYXAgcHJlZE1hcDsKLQotCS8qKgotCSAqIERpYWxvZyBmb3Igc2V0dGluZyBwcmVkZWNlc3NvciBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAJCQlUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAJCQlXb3JrIEJyZWFrIGRvd24gRWxlbWVudAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogCQkJUHJvY2VzcyBvZiB0aGUgd29ya2JyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogCQkJQWRhcHRlciBGYWN0b3J5IAotCSAqIEBwYXJhbSBwcmVkTWFwCi0JICogCQkJUHJlZGVjZXNzb3IgTWFwCi0JICogQHBhcmFtIHByZWRNYXBMaXN0Ci0JICogCQkJUHJlZGVjZXNzb3IgTWFwIGxpc3QKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogCQkJQWN0aW9uIE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQsCi0JCQlPYmplY3QgcHJvY2VzcywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlQcmVkZWNlc3Nvck1hcCBwcmVkTWFwLCBMaXN0IHByZWRNYXBMaXN0LCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5wcmVkTWFwID0gcHJlZE1hcDsKLQkJdGhpcy5wcmVkTWFwTGlzdCA9IHByZWRNYXBMaXN0OwotCQl0aGlzLmFjdGlvbk1nciA9IGFjdGlvbk1ncjsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBkaWFsb2cgaGVhZGVyCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZSk7IAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGJsYW5rIGxhYmVsCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIFByZWRlY2Vzc29yIElEIGluZGV4Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXgpOyAKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJlZElkVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJcHJlZElkVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCS8vIHByZWRJZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCS8vIFByZXNlbnRhaW9uIE5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lKTsgCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXByZXNlbnRhdGlvbk5hbWUgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCXByZXNlbnRhdGlvbk5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlwcmVzZW50YXRpb25OYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVdvcmtPcmRlciB3byA9IHByZWRNYXAuZ2V0V29ya09yZGVyKCk7Ci0JCXByZXNlbnRhdGlvbk5hbWUuc2V0VGV4dChQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHdvLmdldFByZWQoKSkpOwotCi0JCS8vIERlcGVuZGVuY3kKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5KTsgCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWRlcGVuZGVuY3kgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWRlcGVuZGVuY3kuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWRlcGVuZGVuY3kuc2V0SXRlbXMoZGVwZW5kZW5jeUxpc3QpOwotCi0JCVN0cmluZyBkZXBlZGVuY3lOYW1lID0gd28uZ2V0TGlua1R5cGUoKS5nZXROYW1lKCk7Ci0JCWlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IEZJTklTSF9UT19GSU5JU0g7Ci0JCX0gZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IEZJTklTSF9UT19TVEFSVDsKLQkJfSBlbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIKSB7Ci0JCQlkZXBlZGVuY3lOYW1lID0gU1RBUlRfVE9fRklOSVNIOwotCQl9IGVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IFNUQVJUX1RPX1NUQVJUOwotCQl9Ci0JCWRlcGVuZGVuY3kuc2V0VGV4dChkZXBlZGVuY3lOYW1lKTsKLQotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmVkSWRUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IG5ld0lkOwotCQkJCXRyeSB7Ci0JCQkJCW5ld0lkID0gbmV3IEludGVnZXIocHJlZElkVGV4dC5nZXRUZXh0KCkpLmludFZhbHVlKCk7Ci0JCQkJCWlmIChuZXdJZCA8IDApCi0JCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlLCAKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlKTsgCi0KLQkJCQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCQkJCXByZWRJZFRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJcHJlZElkVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChhbHJlYWR5RXhpc3RzKG5ld0lkKSkgewotCQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQotCQkJCQlwcmVkSWRUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHByZWRJRExpc3QgPSBnZXRQcmVkSWQobmV3SWQpOwotCQkJCWlmIChwcmVkSURMaXN0ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQotCQkJCVN0cmluZyBzdHIgPSBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdChlbGVtZW50LAotCQkJCQkJcHJlZElETGlzdCwgYWRhcHRlckZhY3RvcnksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgc3RyKTsgCi0JCQkJCXByZWRJZFRleHQuc2V0VGV4dChuZXcgSW50ZWdlcihwcmVkTWFwLmdldElkKCkpLnRvU3RyaW5nKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXByZXNlbnRhdGlvbk5hbWUuc2V0VGV4dChnZXROYW1lKG5ld0lkKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZXNlbnRhdGlvbiBuYW1lL25hbWUgZm9yIHRoaXMgcHJlZGVjZXNzb3IgaWQKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShpbnQgbmV3SWQpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksCi0JCQkJcHJvY2Vzcyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlJbnRlZ2VyIGlkID0gbmV3IEludGVnZXIoaXRlbVByb3ZpZGVyLmdldElkKCkpOwotCQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQotCQkJaWYgKG5ld0lkID09IGlkLmludFZhbHVlKCkpIHsKLQkJCQluYW1lID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmopLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJCW5hbWUgPSAoKEJyZWFrZG93bkVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgd2hldGhlciBwcmVkZWNlc3NvciBJZCBhbHJlYWR5IGV4aXN0cwotCSAqIAotCSAqIEBwYXJhbSBuZXdJZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUV4aXN0cyhpbnQgbmV3SWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZE1hcExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlQcmVkZWNlc3Nvck1hcCBtYXAgPSAoUHJlZGVjZXNzb3JNYXApIGl0b3IubmV4dCgpOwotCQkJaWYgKChtYXAuZ2V0SWQoKSA9PSBuZXdJZCkgJiYgKHByZWRNYXAuZ2V0SWQoKSAhPSBuZXdJZCkpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2UpOyAKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29tbWFuZCBzZXBhcmF0ZWQgbGlzdCBvZiBhbGwgcHJlZGVjZXNzb3IKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZElkKGludCBuZXdJZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWlmIChwcmVkTWFwLmdldElkKCkgPT0gbWFwLmdldElkKCkpIHsKLQkJCQlidWYuYXBwZW5kKG5ld0lkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChtYXAuZ2V0SWQoKSk7Ci0JCQl9Ci0KLQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHBhcmVudCk7Ci0JCXBhcmVudAotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkvLyBuZXcgaWQKLQkJaW50IG5ld0lkID0gbmV3IEludGVnZXIocHJlZElkVGV4dC5nZXRUZXh0KCkpLmludFZhbHVlKCk7Ci0JCS8vIG5lIGxpbmsgdHlwZQotCQlXb3JrT3JkZXJUeXBlIHdvcmtPcmRlclR5cGUgPSBnZXRXb3JrT3JkZXJUeXBlKCk7Ci0KLQkJaWYgKChuZXdJZCAhPSBwcmVkTWFwLmdldElkKCkpCi0JCQkJfHwgKCF3b3JrT3JkZXJUeXBlLmVxdWFscyhwcmVkTWFwLmdldFdvcmtPcmRlcigpLmdldExpbmtUeXBlKCkpKSkgewotCQkJU3RyaW5nIHByZWRJRExpc3QgPSBnZXRQcmVkSWQobmV3SWQpOwotCQkJaWYgKHByZWRJRExpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCVN0cmluZyBzdHIgPSBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdChlbGVtZW50LCBwcmVkSURMaXN0LAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgcHJvY2VzcywgcHJlZGVjZXNzb3JzKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlLCBzdHIpOyAKLQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGl0Ci0JCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCXByZWRNYXAuZ2V0V29ya09yZGVyKCksIC0xKTsKLQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJY2xvc2UoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0KLQkJCWludCBzaXplID0gcHJlZGVjZXNzb3JzLnNpemUoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkZWNlc3NvcnMKLQkJCQkJCS5nZXQoaSk7Ci0KLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZmluZF9wcmVkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudAotCQkJCQkJLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICh3by5nZXRQcmVkKCkgPT0gZSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZm91bmQpIHsKLQkJCQkJV29ya09yZGVyIHdvID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCk7Ci0JCQkJCXdvLnNldFByZWQoZSk7Ci0JCQkJCXdvLnNldExpbmtUeXBlKHdvcmtPcmRlclR5cGUpOwotCQkJCQlib29sZWFuIHN0YXQgPSBhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQl3bywgLTEpOwotCQkJCQlpZiAoIXN0YXQpCi0JCQkJCQlyZXR1cm47Ci0KLQkJCQkJcHJlZE1hcC5zZXRJZChuZXdJZCk7Ci0JCQkJCXByZWRNYXAuc2V0V29ya09yZGVyKHdvKTsKLQkJCQkJcHJlZE1hcExpc3QuYWRkKHByZWRNYXApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIEdldCB3b3JrIG9yZGVyIGxpbmsgdHlwZSBmcm9tIFVJCi0JICogCi0JICogQHJldHVybiAKLQkgKiAJCQlXb3JrIE9yZGVyIHR5cGUKLQkgKi8KLQlwcml2YXRlIFdvcmtPcmRlclR5cGUgZ2V0V29ya09yZGVyVHlwZSgpIHsKLQkJaW50IGluZGV4ID0gZGVwZW5kZW5jeS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlXb3JrT3JkZXJUeXBlIHR5cGU7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQl0eXBlID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQ7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gMSkgewotCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSDsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSAyKSB7Ci0JCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVDsKLQkJfSBlbHNlIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSDsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCi0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3Nvck1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDUwMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiBNYXAgb2YgcHJlZGVjZXNzb3IgSUQgYW5kIGNvcnJlc3BvbmRpbmcgd29yayBvcmRlcgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkZWNlc3Nvck1hcCB7Ci0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcml2YXRlIFdvcmtPcmRlciB3bzsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAkJUHJlZGVjZXNzb3IgSUQKLQkgKiBAcGFyYW0gd28KLQkgKiAJCVdvcmtPcmRlciBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JNYXAoaW50IGlkLCBXb3JrT3JkZXIgd28pIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLndvID0gd287Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZWRlY2Vzc29yIElECi0JICogQHJldHVybgotCSAqIAkJCVByZWRlY2Vzc29yIElECi0JICovCi0JcHVibGljIGludCBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IFByZWRlY2Vzc29yIElECi0JICogQHBhcmFtIGlkCi0JICogCQkJUHJlZGVjZXNzb3IgSUQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgd29yayBvcmRlcgotCSAqIEByZXR1cm4KLQkgKiAJCVdvcmsgT3JkZXIKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGdldFdvcmtPcmRlcigpIHsKLQkJcmV0dXJuIHRoaXMud287Ci0JfQotCi0JLyoqCi0JICogU2V0IFdvcmsgT3JkZXIKLQkgKiBAcGFyYW0gd28KLQkgKiAJCQlXb3JrIE9yZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya09yZGVyKFdvcmtPcmRlciB3bykgewotCQl0aGlzLndvID0gd287Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODJkZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogUHJvcGVydGllcyByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb3BlcnRpZXNSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gUHJvcGVydGllc1Jlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2d1aWRhbmNlSW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0b3JfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19QcmVzZW50YXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX21haW5EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX3B1cnBvc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlX1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlX1JvbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfTW9kZWxJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9hbHRlcm5hdGl2ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfaG93VG9TdGFmZjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfdXNhZ2VHdWlkYW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Sb2FkbWFwVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfRGlhZ3JhbVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9BREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0FEREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dQREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1VzZUFESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVXNlQURESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVXNlV1BESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfQXNzaWduOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dvcmtSb2xsdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVGVhbVJvbGx1cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wb3NpdGVSb2xlX1JvbGVfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlYW1Qcm9maWxlX1JvbGVfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQWRkRnJvbVByb2Nlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SZW5hbWVfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfRG93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQnV0dG9uX0NsZWFyTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWROYW1lVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19JbnZhbGlkTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JlbmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1RlYW1EaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ob0l0ZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSXRlbXNTZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX0luZGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3BlcnRpZXNSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzMxYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHByb3BlcnRpZXMgCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNVdGlsIHsKLQotCS8qKgotCSAqIFJldHVybnMgdHlwZSBvZiB0aGUgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiAJCVR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHByZWZpeCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU7IAotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9ERUxJVkVSWV9QUk9DRVNTOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9QUk9DRVNTOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0U7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfSVRFUkFUSU9OOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQUNUSVZJVFk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9UQVNLX0RFU0NSSVBUT1I7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9ST0xFX0RFU0NSSVBUT1I7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1I7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfTUlMRVNUT05FOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVBTV9QUk9GSUxFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQVJUSUZBQ1Q7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9ERUxJVkVSQUJMRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfT1VUQ09NRTsKLQkJfQotCi0JCXJldHVybiBwcmVmaXg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0eXBlIG9mIHRoZSBvYmplY3QgaW4gbG93ZXIgY2FzZQotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICogCQlUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZUxvd2VyKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHR5cGUgPSBnZXRUeXBlKG9iaik7Ci0JCQotCQlyZXR1cm4gU3RyVXRpbC50b0xvd2VyKHR5cGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNWaWV3Q29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1ZpZXdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2NzUwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1ZpZXdDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIHByb3BlcnRpZXMgdmlldwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc1ZpZXdDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERVNDUklQVE9SID0gIlJvbGVEZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS1BST0RVQ1RTID0gIldvcmtQcm9kdWN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUiA9ICJUYXNrRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTID0gIlJvbGVzIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVsYXRpb25TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVsYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDllYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgdXNlZCB0byBkaXNwbGF5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvblNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JLy8gZWxlbWVudAotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF8yLCBjdHJsX2FkZF8zLCBjdHJsX2FkZF80OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9yZW1vdmVfMSwgY3RybF9yZW1vdmVfMiwgY3RybF9yZW1vdmVfMywgY3RybF9yZW1vdmVfNDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkX3Byb2NfMSwgY3RybF9hZGRfcHJvY18yLCBjdHJsX2FkZF9wcm9jXzMsCi0JCQljdHJsX2FkZF9wcm9jXzQ7OwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3RhYmxlXzEsIGN0cmxfdGFibGVfMiwgY3RybF90YWJsZV8zLCBjdHJsX3RhYmxlXzQ7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIxLCB0YWJsZVZpZXdlcjIsIHRhYmxlVmlld2VyMywKLQkJCXRhYmxlVmlld2VyNDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWJTdHJpbmc7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGUsIGRlc2MsIHRhYmxlMSwgdGFibGUyLCB0YWJsZTMsIHRhYmxlNDsKLQotCXByaXZhdGUgaW50IHRhYmxlQ291bnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZDsKLQotCVByb2Nlc3MgcHJvY2VzczsKLQotCUlGaWx0ZXIgZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJEYXRhKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFN0cmluZyB0YWJsZTEsIFN0cmluZyB0YWJsZTIsIFN0cmluZyB0YWJsZTMsIFN0cmluZyB0YWJsZTQsIFN0cmluZyB0YWJTdHJpbmcpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl0aGlzLnRhYmxlMSA9IHRhYmxlMTsKLQkJdGhpcy50YWJsZTIgPSB0YWJsZTI7Ci0JCXRoaXMudGFibGUzID0gdGFibGUzOwotCQl0aGlzLnRhYmxlNCA9IHRhYmxlNDsKLQkJCi0JCXRoaXMudGFiU3RyaW5nID0gdGFiU3RyaW5nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhYmxlRGF0YShpbnQgdGFibGVDb3VudCwgYm9vbGVhbltdIGNoYW5nZXNBbGxvd2VkKSB7Ci0JCXRoaXMudGFibGVDb3VudCA9IHRhYmxlQ291bnQ7Ci0JCXRoaXMuY2hhbmdlc0FsbG93ZWQgPSBjaGFuZ2VzQWxsb3dlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgZGVzY3JpcHRvciBvYmplY3QKLQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlpbml0Q29udGVudFByb3ZpZGVyMSgpOwotCQkJCWluaXRDb250ZW50UHJvdmlkZXIyKCk7Ci0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjMoKTsKLQkJCQlpbml0Q29udGVudFByb3ZpZGVyNCgpOwotCi0JCQkJLy8gaGlkZS9zaG93IGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIGRlc2NyaXB0b3IgcmVsYXRpb24gc2VjdGlvbjogIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlIGJvb2xlYW4gdmFsdWUuIENvbnRyb2xzIGNvdWxkIGJlCi0JICogZWRpdGFibGUgb3IgcmVhZC1vbmx5IGFmdGVyIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCAiK2VsZW1lbnQuZ2V0TmFtZSgpICsKLQkJLy8gIkVkaXRhYmxlLSIrZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzIgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8zICE9IG51bGwpCi0JCQljdHJsX2FkZF8zLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfNCAhPSBudWxsKQotCQkJY3RybF9hZGRfNC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlpZiAoY3RybF9hZGRfcHJvY18xICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzIgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkX3Byb2NfMyAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY18zLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfcHJvY180ICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjEKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCWlmICh0YWJsZVZpZXdlcjIgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCQlpZiAoY3RybF9yZW1vdmVfMiAhPSBudWxsKQotCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFibGVWaWV3ZXIzICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIzLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRhYmxlVmlld2VyNCAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyNC5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgYWxsIGxhYmVsIGFuZCBjb250ZW50IHByb3ZpZGVycwotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgZmlyc3QgdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBzZWNvbmQgdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMigpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB0aGlyZCB0YWJsZSBpbiBwcm9wZXJ0aWVzIHZpZXcKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIGZvdXJ0aCB0YWJsZSBpbiBwcm9wZXJ0aWVzIHZpZXcKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXI0KCkgewotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIGRlc2NyaXB0b3JzIGZyb20gdGhlIHByb2Nlc3MKLQkgKiBAcmV0dXJuCi0JICogCQkJTGlzdCBvZiBkZXNjcmlwdG9ycwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZmlsdGVyIHdoaWNoIGFsbG93cyBmaWx0ZXJpbmcgZWxlbWVudCBiYXNlZCBvbiBtZXRob2QgY29uZmlndXJhdGlvbiAKLQkgKiBAcmV0dXJuCi0JICogCQlGaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgdGFibGVIZWlnaHQgPSA4MDsKLQotCQkvLyBjcmVhdGUgc2VjdGlvbgotCQlTZWN0aW9uIGFTZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCXRpdGxlLCBkZXNjKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhU2VjdGlvbiwKLQkJCQkyLCBmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIDEKLQkJaW50IGNvdW50ID0gMDsKLQkJewotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZTEpOwotCi0JCQljdHJsX3RhYmxlXzEgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyMSA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzEpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjEoKTsKLQotCQkJdGFibGVWaWV3ZXIxLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjEuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTEKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWlmIChjaGFuZ2VzQWxsb3dlZFtjb3VudF0pIHsKLQkJCQljdHJsX2FkZF8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzEgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQkJCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQkJY291bnQrKzsKLQotCQkvLyBjcmVhdGUgdGFibGUyCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCUNvbXBvc2l0ZSBwYW5lMyA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMywgdGFibGUyKTsKLQotCQkJY3RybF90YWJsZV8yID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUzLCB0YWJsZUhlaWdodCk7Ci0JCQl0YWJsZVZpZXdlcjIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8yKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXIyKCk7Ci0KLQkJCXRhYmxlVmlld2VyMi5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdGFibGVWaWV3ZXIyLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCQlDb21wb3NpdGUgcGFuZTQgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJaWYgKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkgewotCQkJCWN0cmxfYWRkXzIgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7IAotCQkJCWN0cmxfYWRkX3Byb2NfMiA9IEZvcm1VSQotCQkJCQkJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNCwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCQkJY3RybF9yZW1vdmVfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUzKTsKLQkJfQotCi0JCWNvdW50Kys7Ci0KLQkJLy8gQ3JlYXRlIHRhYmxlMwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQlDb21wb3NpdGUgcGFuZTUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTUsIHRhYmxlMyk7Ci0KLQkJCWN0cmxfdGFibGVfMyA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNSwgdGFibGVIZWlnaHQpOwotCQkJdGFibGVWaWV3ZXIzID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMyk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyMygpOwotCi0JCQl0YWJsZVZpZXdlcjMuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXRhYmxlVmlld2VyMy5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmU2ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzMgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQkJCWN0cmxfcmVtb3ZlXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNSk7Ci0JCX0KLQkJY291bnQrKzsKLQotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQlDb21wb3NpdGUgcGFuZTcgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTcsIHRhYmxlNCk7Ci0KLQkJCWN0cmxfdGFibGVfNCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNywgdGFibGVIZWlnaHQpOwotCQkJdGFibGVWaWV3ZXI0ID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfNCk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyNCgpOwotCi0JCQl0YWJsZVZpZXdlcjQuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXRhYmxlVmlld2VyNC5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlNAotCQkJQ29tcG9zaXRlIHBhbmU4ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF80ID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lOCwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzQgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTgsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQkJCWN0cmxfcmVtb3ZlXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU4LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lOCk7Ci0KLQkJfQotCi0JCS8vIGNyZWF0ZSBicmllZiBkZXNjcmlwdGlvbgotCQlpbnQgaGVpZ2h0SGludCA9IDQwOwotCQkvLyBpbnQgaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb24sIGhlaWdodEhpbnQpOyAKLQkJY3RybF9icmllZl9kZXNjID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQloZWlnaHRIaW50LCBoZWlnaHRIaW50KTsKLQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihzZWN0aW9uQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRMaXN0ZXJlcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8qKgotCQkgKiBGaXJzdCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpbnQgY291bnQgPSAwOwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyMQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmIChjaGFuZ2VzQWxsb3dlZFtjb3VudF0pIHsKLQkJCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMSgpKTsKLQotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwgdGFiU3RyaW5nLAotCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQlmZC5zZXRUaXRsZSh0YWJTdHJpbmcpOwotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJYWRkSXRlbXMxKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl0YWJsZVZpZXdlcjEucmVmcmVzaCgpOwotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfYWRkX3Byb2NfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgPSBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpOwotCQkJCQkJcHJvY2VzcyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHMxKCk7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyLCBwcm9jZXNzLAotCQkJCQkJCQkJZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtczEoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjEucmVmcmVzaCgpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIxCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zMShybUl0ZW1zKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjEucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXRhYmxlVmlld2VyMS5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJY291bnQrKzsKLQotCQkvKioKLQkJICogU2Vjb25kIHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfMi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkgewotCQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXIyCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZl9kZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uICsgIiAtICIgKyBzZWxlY3Rpb24uc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czIoKSk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LCB0YWJTdHJpbmcsCi0JCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKHRhYlN0cmluZyk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlhZGRJdGVtczIoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCXRhYmxlVmlld2VyMi5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfYWRkX3Byb2NfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgPSBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpOwotCQkJCQkJcHJvY2VzcyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHMyKCk7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyLCBwcm9jZXNzLAotCQkJCQkJCQkJZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtczIoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczIocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIyLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIFRoaXJkIHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfMy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIzCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXIzCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIzCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMygpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzMygpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMwotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczMocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIEZvdXRoIHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfNC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXI0Ci0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzNCgpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zNChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXI0LnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9hZGRfcHJvY180LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciA9IGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCk7Ci0JCQkJCQlwcm9jZXNzID0gZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50czQoKTsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIsIHByb2Nlc3MsCi0JCQkJCQkJCQlnZXREZXNjcmlwdG9yVGFiTmFtZSgpLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRGcm9tUHJvY2Vzc0l0ZW1zNChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJCXRhYmxlVmlld2VyNC5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlXzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zNChybUl0ZW1zKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjQucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXRhYmxlVmlld2VyNC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczEoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMihMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMzKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczQoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMxKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMihMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczMoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXM0KExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczEoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMihMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczQoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMxKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9OwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czIoKSB7Ci0JCXJldHVybiBudWxsOwotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHM0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9OwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbW92ZURlc2NyaXB0b3JDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyM2RiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQ29tbWFuZCB0byByZW1vdmUgZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50czsKLQotCXByaXZhdGUgRGVzY3JpcHRvciBkZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBDb21tYW5kIGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBmZWF0dXJlSUQ7Ci0KLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlczsKLQotCS8qKgotCSAqIFJlbW92ZSByZWxhdGlvbnNoaXBzCi0JICovCi0JcHVibGljIFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKERlc2NyaXB0b3IgZGVzYywgTGlzdCBlbGVtZW50cywgaW50IGZlYXR1cmVJRCkgewotCi0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl0aGlzLmZlYXR1cmVJRCA9IGZlYXR1cmVJRDsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQotCQlMaXN0IG5vdFVzZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlEZXNjcmlwdG9yIG8gPSAoRGVzY3JpcHRvcikgZWxlbWVudHMuZ2V0KGkpOwotCi0JCQlib29sZWFuIGNoZWNrUmVmOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQl7Ci0JCQkJY2hlY2tSZWYgPSBQcm9jZXNzVXRpbC5jaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclJlZmVyZW5jZXMoQ29sbGVjdGlvbnMKLQkJCQkuc2luZ2xldG9uKGRlc2MpLCAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvLCB0cnVlLCBmZWF0dXJlSUQpOwotCQkJfQotCQkJZWxzZQotCQkJCWNoZWNrUmVmID0gUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyhkZXNjLCBvKTsKLQkJCQotCQkJaWYgKCFjaGVja1JlZikgewotCQkJCUFjdGl2aXR5IGFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZGVzYyk7Ci0JCQkJaWYgKGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG8pKQotCQkJCQlub3RVc2VkUmVmZXJlbmNlcy5hZGQobyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJT2JqZWN0W10gcmVmVG9CZURlbGV0ZWQgPSBSZWZlcmVuY2VTZWxlY3Rpb24KLQkJCQkJLmdldFJlZmVyZW5jZXMobm90VXNlZFJlZmVyZW5jZXMpOwotCQkJcmVmZXJlbmNlcyA9IEFycmF5cy5hc0xpc3QocmVmVG9CZURlbGV0ZWQpOwotCQl9Ci0JCQotCQlyZWRvKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmIChkZXNjIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JCXsKLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotLy8JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkobnVsbCk7Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5yZW1vdmVBbGwoCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkucmVtb3ZlQWxsKAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0QXNzaXN0ZWRCeSgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRPcHRpb25hbElucHV0KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRPdXRwdXQoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGRlc2MgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJewotCQkJc3dpdGNoIChmZWF0dXJlSUQpewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCSgoUm9sZURlc2NyaXB0b3IpIGRlc2MpLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID09IG51bGwpIHsKLQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBuZXcgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKAotCQkJCQkJcmVmZXJlbmNlcywgZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpIHsKLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCQkJcmV0dXJuIFByb2Nlc3NEZWxldGVBY3Rpb24uZGVsZXRlKGVsZW1lbnRzKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0KLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQotCQkJaWYgKGRlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCi0JCWlmIChkZXNjIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JCXsKLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotLy8JCQkJT2JqZWN0IG8gPSBlbGVtZW50cy5nZXQoMCk7Ci0vLwkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotLy8JCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLnNldFBlcmZvcm1lZFByaW1hcmlseUJ5KChSb2xlRGVzY3JpcHRvcilvKTsKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmFkZEFsbCgKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBc3Npc3RlZEJ5KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE91dHB1dCgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCSgoUm9sZURlc2NyaXB0b3IpIGRlc2MpLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgIT0gbnVsbCkKLQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLnVuZG8oKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJaWYgKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKQotCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmRpc3Bvc2UoKTsKLQkJaWYocmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCX0KLQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYjA4Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlPUdlbmVyYWwgSW5mb3JtYXRpb24KLVByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlPURvY3VtZW50YXRpb24gSW5mb3JtYXRpb24KLUFjdGl2aXR5X2d1aWRhbmNlSW5mb3JtYXRpb25UaXRsZT1HdWlkYW5jZQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPUJyZWFrZG93biBPcHRpb25zCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1TdGVwcwotCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBzdGVwcyB0byBwZXJmb3JtIHRoaXMgdGFzayBkZXNjcmlwdG9yLgotCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXNjcmlwdG9yLgotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXNjcmlwdG9yLgotTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1pbGVzdG9uZS4KLU1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtaWxlc3RvbmUuCi0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYnJlYWtkb3duIGVsZW1lbnQuCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3b3JrIGJyZWFrZG93biBlbGVtZW50LgotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhY3Rpdml0eS4KLQotQnJlYWtkb3duRWxlbWVudF9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYnJlYWtkb3duIGVsZW1lbnQuCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYWN0aXZpdHkuCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXNjcmlwdG9yLgotUHJvY2Vzc19Ob25lPTw8IE5PTkUgPj4KLVByb2Nlc3NfbmFtZT1OYW1lOgotUHJvY2Vzc19QcmVzZW50YXRpb25OYW1lPVByZXNlbnRhdGlvbiBuYW1lOgotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPUJyaWVmIGRlc2NyaXB0aW9uOgotUHJvY2Vzc19tYWluRGVzY3JpcHRpb249IE1haW4gZGVzY3JpcHRpb246Ci1Qcm9jZXNzX3B1cnBvc2U9UHVycG9zZToKLVByb2Nlc3NfcHJlZml4PVByZWZpeDoKLQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9QnJlYWtkb3duIEVsZW1lbnQKLQotUHJvY2Vzc19UeXBlX1Rhc2s9TWV0aG9kIHRhc2s6Ci1Qcm9jZXNzX1R5cGVfUm9sZT1NZXRob2Qgcm9sZToKLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1NZXRob2Qgd29yayBwcm9kdWN0OgotCi1Xb3JrUHJvZHVjdF9UeXBlPVdvcmsgUHJvZHVjdCBUeXBlOgotCi1BY3Rpdml0eV9Nb2RlbEluZm89TW9kZWwgaW5mb3JtYXRpb246Ci1BY3Rpdml0eV9UeXBlPUFjdGl2aXR5IFR5cGU6Ci1BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lPVByZXNlbnRhdGlvbiBuYW1lOgotQWN0aXZpdHlfYWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlczoKLUFjdGl2aXR5X2hvd1RvU3RhZmY9SG93IHRvIHN0YWZmOgotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1LZXkgY29uc2lkZXJhdGlvbnM6Ci1Qcm9jZXNzX3VzYWdlR3VpZGFuY2U9VXNhZ2UgZ3VpZGFuY2U6Ci0KLUFjdGl2aXR5X1JvYWRtYXBUaXRsZT1Sb2FkbWFwcwotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiByb2FkbWFwcy4KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPUdlbmVyYWwgR3VpZGFuY2UKLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBndWlkYW5jZS4KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPUNvbW11bmljYXRpb24gTWF0ZXJpYWxzCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgY29tbXVuaWNhdGlvbiBtYXRlcmlhbHMuCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPUVkdWNhdGlvbiBNYXRlcmlhbHMKLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGVkdWNhdGlvbiBtYXRlcmlhbHMuCi0KLUFjdGl2aXR5X1NlbGVjdGVkX1JvYWRtYXA9Um9hZG1hcHM6Ci1BY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U9R3VpZGFuY2U6Ci1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9Q29tbXVuaWNhdGlvbiBNYXRlcmlhbHM6Ci1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1FZHVjYXRpb24gTWF0ZXJpYWxzOgotCi1BY3Rpdml0eV9EaWFncmFtVGl0bGU9RGlhZ3JhbQotQWN0aXZpdHlfRGlhZ3JhbURlc2NyaXB0aW9uID0gUHJvdmlkZSBkaWFncmFtIGltYWdlcyBmb3IgdGhpcyB7MH0uCi1BY3Rpdml0eV9BREltYWdlPUFjdGl2aXR5IERpYWdyYW0KLUFjdGl2aXR5X0FEREltYWdlPUFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1BY3Rpdml0eV9XUERJbWFnZT1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi1BY3Rpdml0eV9Vc2VBREltYWdlPVVzZSBBY3Rpdml0eSBEaWFncmFtIGZvciBwdWJsaXNoaW5nCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1Vc2UgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gZm9yIHB1Ymxpc2hpbmcKLUFjdGl2aXR5X1VzZVdQREltYWdlPVVzZSBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtIGZvciBwdWJsaXNoaW5nCi1BY3Rpdml0eV9Bc3NpZ249QXNzaWduLi4uCi0KLVRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzPVN0ZXBzOgotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlPVN0ZXBzCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZT1TZWxlY3Qgc3RlcHMKLQotQWN0aXZpdHlfV29ya1JvbGx1cD1Xb3JrIFJvbGx1cAotQWN0aXZpdHlfVGVhbVJvbGx1cD1UZWFtIFJvbGx1cAotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwPVdvcmsgUHJvZHVjdHMgUm9sbHVwCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249UmV2aWV3IHRoZSB3b3JrIHJvbGwtdXAgZm9yIHRoaXMgYWN0aXZpdHkgaW4gdGhpcyBzZWN0aW9uLgotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVJldmlldyB0aGUgdGVhbSByb2xsLXVwIGZvciB0aGlzIGFjdGl2aXR5IGluIHRoaXMgc2VjdGlvbi4KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVJldmlldyB0aGUgd29yayBwcm9kdWN0IHJvbGwtdXAgZm9yIHRoaXMgYWN0aXZpdHkgaW4gdGhpcyBzZWN0aW9uLgotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U9TXVsdGlwbGUgT2NjdXJyZW5jZXMKLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPU9wdGlvbmFsCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVBsYW5uZWQKLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1TdXBwcmVzc2VkCi0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPUV2ZW50IERyaXZlbgotV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZz1PbmdvaW5nCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlPVJlcGVhdGFibGUKLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1QcmVkZWNlc3NvcnM6Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5PURlcGVuZGVuY3k6Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPUluZGV4Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUPVByZXNlbnRhdGlvbiBOYW1lCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9RGVwZW5kZW5jeQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ9QWRkCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9RWRpdAotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9UmVtb3ZlCi0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPUZpbmlzaCBUbyBTdGFydAotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIPUZpbmlzaCBUbyBGaW5pc2gKLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIPVN0YXJ0IFRvIEZpbmlzaAotV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVD1TdGFydCBUbyBTdGFydAotCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQ9U3luY2hyb25pemVkIHdpdGggc291cmNlCi0KLURlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uPVJlZmluZWQgZGVzY3JpcHRpb246Ci0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1Sb2xlcwotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPUFzc2lnbiB0aGUgcm9sZSBkZXNjcmlwdG9ycyB0byBwZXJmb3JtIHRoaXMgdGFzayBkZXNjcmlwdG9yLgotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVByaW1hcnkgUGVyZm9ybWVyczoKLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1BZGRpdGlvbmFsIFBlcmZvcm1lcnM6Ci1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9QXNzaXN0ZWQgQnk6Ci0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9V29yayBQcm9kdWN0cwotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBmb3IgdGhpcyB0YXNrIGRlc2NyaXB0b3IuCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPU1hbmRhdG9yeSBJbnB1dDoKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9T3B0aW9uYWwgSW5wdXQ6Ci1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUzPUV4dGVybmFsIElucHV0OgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1PdXRwdXQ6Ci0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZT1UYXNrcwotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgcm9sZSBkZXNjcmlwdG9yIGlzIHBlcmZvcm1lciBvZiBmb2xsb3dpbmcgdGFzayBkZXNjcmlwdG9ycy4KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1QcmltYXJ5IFBlcmZvcm1lcjoKLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1BZGRpdGlvbmFsIFBlcmZvcm1lcnM6Ci1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNzaXN0ZWQgQnk6Ci0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9V29yayBQcm9kdWN0cwotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgZGVzY3JpcHRvciBpcyByZXNwb25zaWJsZSBmb3IgYW5kIG1vZGlmaWVzIGZvbGxvd2luZyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMuCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVJlc3BvbnNpYmxlIGZvcjoKLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9TW9kaWZpZXM6Ci0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sZXMKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyByb2xlIGRlc2NyaXB0b3JzIGFyZSByZXNwb25zaWJsZSBmb3IgYW5kIG1vZGlmaWVzIHRoaXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IuCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVJlc3BvbnNpYmxlIGZvcjoKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9TW9kaWZpZWQgYnk6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZT1UeXBlOgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZT1BY3Rpdml0eSBFbnRyeSBTdGF0ZToKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1BY3Rpdml0eSBFeGl0IFN0YXRlOgotCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1EZWxpdmVyYWJsZSBQYXJ0cwotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb249VGhlIGRlbGl2ZXJhYmxlIGhhcyBmb2xsb3dpbmcgZGVsaXZlcmFibGUgcGFydHMuCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1EZWxpdmVyYWJsZSBQYXJ0cwotCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1UZWFtcwotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249VGhpcyByb2xlIGRlc2NyaXB0b3IgcmVmZXJzIHRvIGZvbGxvd2luZyB0ZWFtcy4KLVJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxPVRlYW1zOgotCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVJvbGVzCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgY29tcG9zaXRlIHJvbGUgaGFzIGZvbGxvd2luZyBhZ2dyZWdhdGVkIHJvbGVzLgotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1BZ2dyZWdhdGVkIFJvbGVzOgotCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1Sb2xlcwotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249QWRkIG9yIHJlbW92ZSByb2xlcyB0by9mcm9tIHRoZSB0ZWFtIHByb2ZpbGUuCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1Sb2xlczoKLQotUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlPWNvbGxhcHNlZC5naWYKLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmCi1Qcm9jZXNzX0FkZD1BZGQuLi4KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9QWRkIGZyb20gUHJvY2Vzcy4uLgotUHJvY2Vzc19SZW5hbWVfTWVzc2FnZT1Zb3UgYXJlIGFib3V0IHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIHByb2Nlc3MuIFRoaXMgd2lsbCBzYXZlIHRoaXMgZWRpdG9yIGFuZCByZW5hbWUgdGhlIHByb2Nlc3MgZm9sZGVyIHRvIHRoZSBuZXcgbmFtZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1Qcm9jZXNzX1JlbW92ZT1SZW1vdmUKLVByb2Nlc3NfVXA9VXAKLVByb2Nlc3NfRG93bj1Eb3duCi1Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uPU11bHRpcGxlIFNlbGVjdGlvbgotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9TGluayBNZXRob2QgRWxlbWVudC4uLgotUHJvY2Vzc19CdXR0b25fQ2xlYXJNZXRob2RFbGVtZW50PUNsZWFyCi0KLSMjIEVycm9yL1dhcm5pbmcKLVByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZT1JbnZhbGlkIG5hbWUKLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBUaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVJlbmFtZQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IFRoZSBwcmVzZW50YXRpb24gbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgcHJlc2VudGF0aW9uIG5hbWUuCi1Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGU9TGluayBNZXRob2QgRWxlbWVudAotUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ9SVVQQTAwODNFOiBDYW5ub3QgbGluayB0byAnJ3swfScnIHNpbmNlIHRoaXMgTWV0aG9kRWxlbWVudCBpcyBhbHJlYWR5IGJlaW5nIHVzZWQgZm9yIGFub3RoZXIgZGVzY3JpcHRvciB1bmRlciB0aGUgc2FtZSBwYXJlbnQuCi1Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU9SW5mb3JtYXRpb24KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogQ2Fubm90IGFkZCAnJ3swfScnIHRvIHRoZSB0ZWFtICcnezF9JycgXG5cblJvbGUgZGVzY3JpcHRvcihzKSBtdXN0IGhhdmUgbWV0aG9kIGVsZW1lbnQgcm9sZSBhc3NvY2lhdGVkIHdpdGggaXQgdG8gYmUgYXNzaWduZWQgdG8gdGVhbS5cblxuIEZpeCB0aGUgYXNzb2NpYXRpb24gZmlyc3QgYW5kIHRyeSBhZ2Fpbi4KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9U2VsZWN0IHRlYW1zCi1Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZT1UZWFtcwotCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiBDYW5ub3QgYWRkICcnezB9JycgdG8gdGhlIGRlbGl2ZXJhYmxlICcnezF9Jycgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBtZXRob2QgZWxlbWVudCB3b3JrcHJvZHVjdCBhc3NvY2lhdGVkIHdpdGggaXQuCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IENhbm5vdCBhZGQgICcnezB9JycgdG8gdGhlIENvbXBvc2l0ZSByb2xlICcnezF9Jycgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBtZXRob2QgZWxlbWVudCByb2xlIGFzc29jaWF0ZWQgd2l0aCBpdC4KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZT1JVVBBMDA4N1c6IFBsZWFzZSBlbnRlciB2YWxpZCBudW1iZXIgZm9yIHByZWRlY2Vzc29ycy4KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9SW52YWxpZCBQcmVkZWNlc3NvciBJZAotCi1Qcm9jZXNzX05vSXRlbXM9Tm8gaXRlbXMgc2VsZWN0ZWQKLVByb2Nlc3NfSXRlbXNTZWxlY3RlZD17MH0gaXRlbXMgc2VsZWN0ZWQKLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPU5vIFByb3BlcnRpZXMgYXZhaWxhYmxlCi0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPVByZWRlY2Vzc29yIERlcGVuZGVuY3kKLVByZWRlY2Vzc29yRGlhbG9nX0hlYWRlck1lc3NhZ2U9RW50ZXIgZGVwZW5kZW5jeSB0eXBlIGZvciBwcmVkZWNlc3NvcjoKLVByZWRlY2Vzc29yRGlhbG9nX0luZGV4PUluZGV4OgotUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZT1QcmVzZW50YXRpb24gTmFtZToKLVByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k9RGVwZW5kZW5jeToKLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1QcmVkZWNlc3NvcgotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBQcmVkZWNlc3NvciB3aXRoIHRoYXQgSWQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgd29yayBicmVha2Rvd24gZWxlbWVudC4KLQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZz1JVVBBMDA5MEU6IFRoZXJlIHdhcyBhbiBlcnJvciBlZGl0aW5nIGEgcHJvcGVydHkuCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IEludmFsaWQgcHJlZGVjZXNzb3IgbGlzdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMTZjN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIFJvbGUgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIGV4dGVuZHMgRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgTGFiZWwgY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX21ldGhvZF9lbGVtZW50OwotCi0JcHJpdmF0ZSBCdXR0b24gbGlua0J1dHRvbjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBjbGVhckJ1dHRvbjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgUm9sZURlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbWV0aG9kIGVsZW1lbnQKLQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UeXBlX1JvbGUpOyAKLQotCQljdHJsX21ldGhvZF9lbGVtZW50ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgMSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBTV1QuTk9ORSwgMiwgdHJ1ZSk7Ci0JCWxpbmtCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQlsaW5rQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudCk7IAotCi0JCWNsZWFyQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJY2xlYXJCdXR0b24KLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0NsZWFyTWV0aG9kRWxlbWVudCk7IAotCi0JCS8vIHNob3cvaGlkZSBtZXRob2Qgcm9sZQotCQl0b2dnbGVNZXRob2RSb2xlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZU1ldGhvZFJvbGUoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlsaW5rQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJY2xlYXJCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX21ldGhvZF9lbGVtZW50X2xhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlsaW5rQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQljbGVhckJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcigKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0Um9sZSgpICE9IG51bGwpIHsKLQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudC5nZXRSb2xlKCkpOwotCQkJCX0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgRmlsdGVyQ29uc3RhbnRzLlJPTEVTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJc2V0TWV0aG9kRWxlbWVudChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQljbGVhckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwKLQkJCQkJCW51bGwsIC0xKTsKLQkJCQkvLyB1cGRhdGUgbWV0aG9kIGVsZW1lbnQgY29udHJvbAotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlMSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWV0aG9kRWxlbWVudChMaXN0IGl0ZW1zKSB7Ci0JCWlmICgoaXRlbXMgIT0gbnVsbCkgJiYgKGl0ZW1zLnNpemUoKSA+PSAxKSkgewotCQkJaWYgKGl0ZW1zLmdldCgwKSBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRlbXMuZ2V0KDApOwotCi0vLwkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotLy8JCQkJCQkuZ2V0U2libGluZ3MoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZ2V0QWRhcHRlcigpLAotLy8JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotLy8JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotLy8JCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotLy8JCQkJCQlpZiAoKCFyb2xlRGVzYy5lcXVhbHMoZWxlbWVudCkpCi0vLwkJCQkJCQkJJiYgKCFyb2xlRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0vLwkJCQkJCQlSb2xlIGV4aXNpbmdSb2xlID0gcm9sZURlc2MuZ2V0Um9sZSgpOwotLy8JCQkJCQkJaWYgKHJvbGUuZXF1YWxzKGV4aXNpbmdSb2xlKSkgewotLy8JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotLy8JCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWlmIChjYW5Bc3NpZ24pIHsKLQkJCQkJTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IG5ldyBMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQoCi0JCQkJCQkJZWxlbWVudCwgcm9sZSwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUpOwotCQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCS8vIHNldCBzZWxlY3Rpb24gdG8gc2FtZSBlbGVtZW50IHRvIGVuYWJsZSBjb3JyZWN0IGFjdGlvbnMKLQkJCQkJZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudCk7IAotCQkJCQlPYmplY3RbXSBhcmdzID0geyByb2xlLmdldE5hbWUoKSB9OwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoUm9sZURlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRSb2xlKCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRSb2xlKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQotCQlsaW5rQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljbGVhckJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotCQkJaWYgKChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQl8fCAocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkpIHsKLQkJCQluYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCi0JCQkJLy8gc2hvdy9oaWRlIG1ldGhvZCByb2xlCi0JCQkJdG9nZ2xlTWV0aG9kUm9sZSgpOwotCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBSb2xlRGVzY3JpcHRvciBnZW5lcmFsIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0NPTVBPU0lURV9ST0xFICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUk9MRV9ERVNDUklQVE9SICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvclRlYW1TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzdiNDA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvclRlYW1TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIFJvbGUgZGVzY3JpcHRvciAtIHRlYW0gcHJvZmlsZSBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24gZXh0ZW5kcyBPQlNSZWxhdGlvblNlY3Rpb24gewotCXByaXZhdGUgSW1hZ2UgdGl0bGVJbWFnZSA9IG51bGw7Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldFNlbGVjdGVkVGVhbXMoZWxlbWVudCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCi0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGUsIAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMSk7IAotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBSb2xlIERlc2NyaXB0b3IgdGVhbSBzZWN0aW9uICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChPYmplY3RbXSBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgaXRlbXNbaV07Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUNvbXBvc2l0ZVJvbGUgY29tcFJvbGUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5jcmVhdGVDb21wb3NpdGVSb2xlKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQljb21wUm9sZSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZlRlYW0ocm9sZSwgdGVhbSkpIHsKLQkJCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCXJvbGVEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UZWFtQXNzaWduRXJyb3IpOyAKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnQuZ2V0TmFtZSgpLCB0ZWFtLmdldE5hbWUoKSB9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBtZi5mb3JtYXQoYXJncyk7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBnZXRFZGl0b3IoKS5nZXRUaXRsZSgpOwotCQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0ZWFtLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQllbGVtZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVtb3ZlKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBpdG9yLm5leHQoKTsKLQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGVhbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJZWxlbWVudCwgLTEpOwotCi0JCQkJLy8gR2V0IHRoZSBsaXN0IG9mIHJvbGVEZXNjcmlwdG9ycyBmcm9tIHRlYW0gcHJvZmlsZSB3aGljaAotCQkJCS8vIGhhcyBzYW1lIHJvbGUgb3JpZ2luYWwgcm9sZSBkZXNjcmlwdG9yCi0JCQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCQkJCUxpc3Qgcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbVJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSB0ZWFtUm9sZXMuZ2V0KGkpOwotCi0JCQkJCWlmIChyb2xlRGVzYy5nZXRSb2xlKCkuZXF1YWxzKHJvbGUpKQotCQkJCQl7Ci0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIHJvbGVEZXNjcmlwb3IganVzdCBoYXMgb25lIGVsZW1lbnQsIGRlbGV0ZSB0aGF0IG9uZSB0b28uCi0JCQkJLy8gc2luY2UgdGhhdCB3b3VsZCBiZSB0aGUgbGFzdCBvbmUKLQkJCQlpZiAocm9sZURlc2NMaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRlYW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzY0xpc3QuZ2V0KDApLCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnRPZlRlYW0oUm9sZSByb2xlLCBUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCUxpc3QgdGVhbVJvbGVzID0gdGVhbS5nZXRUZWFtUm9sZXMoKTsKLQkJTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpOwotCQkJcm9sZXMuYWRkKHJvbGVEZXNjLmdldFJvbGUoKSk7Ci0JCX0KLQotCQlpZiAocm9sZXMuY29udGFpbnMocm9sZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGREaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHRlYW1Db250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGl0ZW1zID0gZ2V0VGVhbXMoKTsKLQkJCQlpdGVtcy5yZW1vdmVBbGwoZ2V0U2VsZWN0ZWRUZWFtcyhlbGVtZW50KSk7Ci0JCQkJcmV0dXJuIGl0ZW1zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlJTGFiZWxQcm92aWRlciB0ZWFtTGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGVsZW1lbnQsCi0JCQkJdGVhbUNvbnRlbnRQcm92aWRlciwgdGVhbUxhYmVsUHJvdmlkZXIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZSk7IAotCQl0aXRsZUltYWdlID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpOwotCQlMaXN0U2VsZWN0aW9uRGlhbG9nLnNldERlZmF1bHRJbWFnZSh0aXRsZUltYWdlKTsKLQotCQlkbGcuc2V0VGl0bGUoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZSk7IAotCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRsZy5vcGVuKCk7Ci0JCWFkZChkbGcuZ2V0UmVzdWx0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQlQYXJlbnQgb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IFRlYW1zIGZyb20gcGFyZW50Ci0JICogCi0JICogQHJldHVybgotCSAqIAkJCUxpc3Qgb2YgdGVhbXMKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VGVhbXMoKSB7Ci0JCUFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChlbGVtZW50KTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZWxlbWVudDsKLQkJCQkJCWl0ZW1zLmFkZCh0ZWFtKTsKLQkJCQkJCS8vIGFkZCBhbnkgc3ViIHRlYW1zIGlmIHRoZXJlCi0JCQkJCQlMaXN0IHN1YlRlYW1zID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCQkJCQlpdGVtcy5hZGRBbGwoc3ViVGVhbXMpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXBhcmVudCA9IGdldFBhcmVudCgoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgdGVhbXMgZm9yIHRoYXQgcm9sZSBkZXNjcmlwdG9yCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2Ygc2VsZWN0ZWQgdGVhbSAKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U2VsZWN0ZWRUZWFtcyhFT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldFRlYW1Qcm9maWxlcygoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSBpbnB1dCk7Ci0JCX0gZWxzZSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqZWN0OwotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFRlYW1Qcm9maWxlcyhyb2xlRGVzYywgZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTVmZWE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5JQWN0aW9uVHlwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogUm9sZSBEZXNjcmlwdG9yIC0gd29yayBwcm9kdWN0IHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24gZXh0ZW5kcyBSZWxhdGlvblNlY3Rpb24gewotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHByb2Nlc3Mgd29yayBwcm9kdWN0IGZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSBuZXcgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwKLQkJCQkJbnVsbCwgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjEoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSZXNwb25zaWJsZUZvcigpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIxLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TW9kaWZpZXMoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDI7Ci0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMiwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7IAotCi0JCWJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCA9IHsgdHJ1ZSwgZmFsc2UgfTsKLQkJc2V0VGFibGVEYXRhKG51bU9mVGFibGVzLCBjaGFuZ2VzQWxsb3dlZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRFbGVtZW50c0luU2NvcGUoZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlBc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvcigKLQkJCQkJKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50LCBpdGVtcywKLQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1JFU1BPTlNJQkxFX0ZPUiwgZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0IGdldFdvcmtQcm9kdWN0cyhMaXN0IGl0ZW1zKSB7Ci0JCUxpc3Qgd3BMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXdwTGlzdC5hZGQoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZW1zLmdldChpKSkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB3cExpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0cygoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldFByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBvYmogPSBQcm9jZXNzVXRpbC5nZXRSb290UHJvY2VzcyhhRmFjdG9yeSwgYWRhcHRlciwgZWxlbWVudCk7Ci0JCXJldHVybiAoUHJvY2Vzcykgb2JqOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkvLyBVbmNvbW1lbnQgdG8gc2hvdyBleHRlbmRlZCBhY3Rpdml0eSdzIHdvcmtwcm9kdWN0cwotCQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCS8vIE9iamVjdCBvYmplY3QgPQotCQkJCS8vICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqKS5nZXRQYXJlbnQob2JqKTsKLQkJCQkvLyBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZ2V0QWN0aXZpdGllc0luU2NvcGUoCi0JCQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkvLyBlbGVtZW50LCBsaXN0KTsKLQkJCQkvLyBpZihsaXN0LmNvbnRhaW5zKG9iamVjdCkpIHJldHVybiB0cnVlOwotCQkJCS8vIH0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JUYWJOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JUYWJOYW1lKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmRlMTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzVGFza0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkxpbmtNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgVGFzayBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcwotCQlXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIHN5bmNocm9uaXplZEJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX21ldGhvZF9lbGVtZW50OwotCi0JcHJpdmF0ZSBCdXR0b24gbGlua0J1dHRvbjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBjbGVhckJ1dHRvbjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgVGFza0Rlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgY2hlY2tib3gKLQkJY2hlY2tCb3hDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBudW1PZkNvbHVtbnMsIHRydWUpOwotCi0JCS8vIHN5bmNocm9uaXplZCB3aXRoIHNvdXJjZQotCQlzeW5jaHJvbml6ZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkKTsgCi0KLQkJLy8gbWV0aG9kIGVsZW1lbnQKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UeXBlX1Rhc2spOyAKLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBTV1QuTk9ORSwgMiwgdHJ1ZSk7Ci0JCWxpbmtCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQlsaW5rQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudCk7IAotCi0JCWNsZWFyQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJY2xlYXJCdXR0b24KLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0NsZWFyTWV0aG9kRWxlbWVudCk7IAotCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWV0aG9kRWxlbWVudChMaXN0IGl0ZW1zKSB7Ci0JCWlmICgoaXRlbXMgIT0gbnVsbCkgJiYgKGl0ZW1zLnNpemUoKSA+PSAxKSkgewotCQkJaWYgKGl0ZW1zLmdldCgwKSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRlbXMuZ2V0KDApOwotCi0vLwkJCQlMaXN0IHNpYmxpbmdzID0gUHJvY2Vzc1V0aWwKLS8vCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGdldEFkYXB0ZXIoKSwKLS8vCQkJCQkJCQllbGVtZW50KTsKLQkJCQlib29sZWFuIGNhbkFzc2lnbiA9IHRydWU7Ci0vLwkJCQotLy8KLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotLy8JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotLy8JCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotLy8JCQkJCQlpZiAoKCF0YXNrRGVzYy5lcXVhbHMoZWxlbWVudCkpCi0vLwkJCQkJCQkJJiYgKCF0YXNrRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0vLwkJCQkJCQlUYXNrIGV4aXNpbmdUYXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotLy8JCQkJCQkJaWYgKHRhc2suZXF1YWxzKGV4aXNpbmdUYXNrKSkgewotLy8JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotLy8JCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWlmIChjYW5Bc3NpZ24pIHsKLQkJCQkJTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IG5ldyBMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQoCi0JCQkJCQkJZWxlbWVudCwgdGFzaywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0spOwotCQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCS8vIHNldCBzZWxlY3Rpb24gdG8gc2FtZSBlbGVtZW50IHRvIGVuYWJsZSBjb3JyZWN0IGFjdGlvbnMKLQkJCQkJZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudCk7IAotCQkJCQlPYmplY3RbXSBhcmdzID0geyB0YXNrLmdldE5hbWUoKSB9OwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoVGFza0Rlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRUYXNrKCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRUYXNrKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlzeW5jaHJvbml6ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKHN5bmNocm9uaXplZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzVGFza0ZpbHRlcigKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLlRBU0tTKTsKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudC5nZXRUYXNrKCkpOwotCQkJCX0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgRmlsdGVyQ29uc3RhbnRzLlRBU0tTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlRBU0tTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJc2V0TWV0aG9kRWxlbWVudChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQkKLQkJY2xlYXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksCi0JCQkJCQludWxsLCAtMSk7Ci0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJbGlua0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY2xlYXJCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudAotCQkJCQkJLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgVGFza0Rlc2NyaXB0b3IgZ2VuZXJhbCBzZWN0aW9uOiAiICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9UQVNLX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmM2Q0MTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgVGFzayBkZXNjcmlwdG9yIC0gcm9sZSB0YWIgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uIGV4dGVuZHMgUmVsYXRpb25TZWN0aW9uIHsKLQlwcml2YXRlIElGaWx0ZXIgcm9sZUZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyByb2xlZGVzY3JpcHRvciBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChyb2xlRmlsdGVyID09IG51bGwpIHsKLQkJCXJvbGVGaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQl9Ci0JCXJldHVybiByb2xlRmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMygpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFzc2lzdGVkQnkoKSkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlpbnQgbnVtT2ZUYWJsZXMgPSAzOwotCQkKLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMywKLQkJCQludWxsLAotCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCQotCQlib29sZWFuW10gY2hhbmdlc0FsbG93ZWQgPSB7IHRydWUsIHRydWUsIHRydWUgfTsKLQkJc2V0VGFibGVEYXRhKG51bU9mVGFibGVzLCBjaGFuZ2VzQWxsb3dlZCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRFbGVtZW50c0luU2NvcGUoZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwKLQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCi0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJvbGVzKExpc3QgaXRlbXMpIHsKLQkJTGlzdCByb2xlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyb2xlTGlzdC5hZGQoKChSb2xlRGVzY3JpcHRvcikgaXRlbXMuZ2V0KGkpKS5nZXRSb2xlKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJvbGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0Um9sZXMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEFzc2lzdGVkQnkoKSkpOwotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHJvbGUpKQotCQkJCQkJbmV3TGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1BSSU1BUllfUEVSRk9STUVSLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QXNzaXN0ZWRCeSgpKSk7Ci0JCQotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHJvbGUpKQotCQkJCQkJbmV3TGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BRERJVElPTkFMX1BFUkZPUk1FUiwgZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0Um9sZXMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpKTsKLQotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyhyb2xlKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQVNTSVNURURfQlksIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCkpOwotCi0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCQkJaXRlbXMsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0KLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCBpdGVtcywKLQkJCQkJLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMSgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czEoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czIoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMyKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMygpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFzc2lzdGVkQnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEZpbHRlckZvckRlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRQcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3Qgb2JqID0gUHJvY2Vzc1V0aWwuZ2V0Um9vdFByb2Nlc3MoYUZhY3RvcnksIGFkYXB0ZXIsIGVsZW1lbnQpOwotCQlyZXR1cm4gKFByb2Nlc3MpIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yU3RlcFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmYWM3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0YXNrIGRlc2NyaXB0b3IgLSBzdGVwIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9yZW1vdmUsIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zZWxlY3RlZDsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JLy8gcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQlwcml2YXRlIEltYWdlIHRpdGxlSW1hZ2U7Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgc3RlcHMgc2VjdGlvbgotCQljcmVhdGVTdGVwU2VjdGlvbihwYXJlbnQpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCS8vIGhpZGUvcmVmcmVzaCBjb250cm9scwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIFRhc2tEZXNjcmlwdG9yIHN0ZXAgc2VjdGlvbiIgKyBlbGVtZW50LCBleCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBmbGFnLiBDb250cm9scyB3aWxsIGJlIGVpdGhlciBlZGl0YWJsZSAKLQkgKiBvciByZWFkLW9ubHkgYWZ0ZXIgdXBkYXRpbmcgdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChlbGVtZW50LmdldFRhc2soKSA9PSBudWxsKQotCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQlpZiAoc3RlcHMgIT0gbnVsbCAmJiBzdGVwcy5zaXplKCkgPiAwKSAKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJZWxzZSAKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgU3RlcCBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0ZXBTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIHN0ZXAgc2VjdGlvbgotCQlTZWN0aW9uIHN0ZXBTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZSwgCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uKTsgCi0KLQkJLy8gY3JlYXRlIHN0ZXAgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzdGVwQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzdGVwU2VjdGlvbiwKLQkJCQkyLCBmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzKTsgCi0KLQkJY3RybF9zZWxlY3RlZCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSk7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkvLyBjcmVhdGUgYnV0dG9uIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkvLyBjcmVhdGUgYnV0dG9ucwotCQljdHJsX2FkZCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9yZW1vdmUgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX3VwID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1VwKTsgCi0JCWN0cmxfZG93biA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Eb3duKTsgCi0KLQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgewotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIGJyaWVmIGRlc2NyaXB0aW9uCi0JCS8vIGludCBoZWlnaHRIaW50ID0gNDA7Ci0JCS8vIGludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0JCS8vIExhYmVsIGxhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCS8vIFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9jZXNzLmJyaWVmRGVzY3JpcHRpb24iKSwKLQkJLy8gaGVpZ2h0SGludCk7Ci0JCS8vIGN0cmxfYnJpZWZfZGVzYyA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCS8vIGhlaWdodEhpbnQsIGhlaWdodEhpbnQpOwotCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCQkvLwkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHN0ZXBDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQljdHJsX3NlbGVjdGVkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkgewotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCS8vIGN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9jZXNzLk11bHRpcGxlU2VsZWN0aW9uIikKLQkJCQkJLy8gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCi0JCQkJCQlyZXR1cm4gZ2V0U3RlcHMoKS50b0FycmF5KCk7Ci0vLwkJCQkJCS8vIGdldCBhbGwgc3RlcHMKLS8vCQkJCQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLS8vCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLS8vCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoCi0vLwkJCQkJCQkJZWxlbWVudCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLS8vCQkJCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSgKLS8vCQkJCQkJCQllbGVtZW50LmdldFRhc2soKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLS8vCQkJCQkJCQkJCS5nZXRUYXNrX1N0ZXBzKCksIGNvbmZpZyk7Ci0vLwotLy8JCQkJCQkvLyByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBzdGVwcwotLy8JCQkJCQlzdGVwcy5yZW1vdmVBbGwoZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkpOwotLy8JCQkJCQlyZXR1cm4gc3RlcHMudG9BcnJheSgpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCUlMYWJlbFByb3ZpZGVyIHN0ZXBMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBvYmopIHsKLQotCQkJCQkJYm9vbGVhbiBmbGFnID0gIWVsZW1lbnQuZ2V0VGFzaygpLmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJCS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKG9iaik7Ci0JCQkJCQlyZXR1cm4gZmxhZzsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZWxlbWVudC5nZXRUYXNrKCksIHN0ZXBDb250ZW50UHJvdmlkZXIsCi0JCQkJCQlzdGVwTGFiZWxQcm92aWRlciwgUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZSk7IAotCQkJCXRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZy5zZXREZWZhdWx0SW1hZ2UodGl0bGVJbWFnZSk7Ci0JCQkJZGxnLnNldFRpdGxlKFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlKTsKLQkJCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZGxnLm9wZW4oKTsKLQotCQkJCWFkZFN0ZXBzKGRsZy5nZXRSZXN1bHQoKSk7Ci0JCQkJCi0JCQkJLy8gZW5hYmxlL2Rpc2FibGUgYWRkIGJ1dHRvbgotCQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJCWlmIChzdGVwcyAhPSBudWxsICYmIHN0ZXBzLnNpemUoKSA+IDApIAotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZVN0ZXBzKHJtSXRlbXMpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJLy8gY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOwotCQkJCX0KLQkJCQkvLyBjdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkKLQkJCQkvLyBlbmFibGUvZGlzYWJsZSBhZGQgYnV0dG9uCi0JCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZSAKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQXJyYXlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCUFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCUJhc2ljRUxpc3Qgc3RlcExpc3QgPSAoQmFzaWNFTGlzdCkgZWxlbWVudAotCQkJCQkJCS5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0KLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBzdGVwTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCXN0ZXBMaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCi0JCQkJCX0KLQkJCQkJc3RlcHMuYWRkQWxsKHN0ZXBMaXN0KTsKLQkJCQkJLy8gVE9ETyAtIHdyaXRlIGEgY29tbWFuZC4gCi0JCQkJCS8vIGFjdGl2YXRlIGRpcnR5IGZsYWcKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCQkJCXN0ZXBMaXN0LCAtMSk7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwgc3RlcHMsCi0JCQkJCQkJLTEpOwotCi0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIuZ2V0VGFibGUoKQotCQkJCQkJLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlBcnJheUxpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJQmFzaWNFTGlzdCBzdGVwTGlzdCA9IChCYXNpY0VMaXN0KSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbGVjdGVkU3RlcHMoKTsKLQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQkJCWludCBpbmRleCA9IHN0ZXBMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQotCQkJCQkJaWYgKGluZGV4IDwgc3RlcExpc3Quc2l6ZSgpIC0gMSkKLQkJCQkJCQlzdGVwTGlzdC5tb3ZlKGluZGV4ICsgaXRlbXMuc2l6ZSgpLCBvYmplY3QpOwotCi0JCQkJCX0KLQkJCQkJc3RlcHMuYWRkQWxsKHN0ZXBMaXN0KTsKLQotCQkJCQkvLyBUT0RPIC0gd3JpdGUgYSBjbW1hbmQuIEhhY2tpbmcgaXQgZm9yIG5vdyB0byBhY3RpdmF0ZQotCQkJCQkvLyBkaXJ0eSBmbGFnCi0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCQlzdGVwTGlzdCwgLTEpOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHN0ZXBzLAotCQkJCQkJCS0xKTsKLQotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyLmdldFRhYmxlKCkKLQkJCQkJCS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmIGVkaXRhYmxlKQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiBTdGVwcyB0byB0YXNrIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gYWRkSXRlbXMKLQkgKiAJCQlMaXN0IG9mIHN0ZXBzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN0ZXBzKE9iamVjdFtdIGFkZEl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGFkZEl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gaXRlbSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIGFkZEl0ZW1zW2ldOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCWl0ZW0sIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhc3NpZ25lZCBzdGVwcyBmb3IgdGhlIHRhc2sgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJTGlzdCBvZiBzdGVwcyAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RlcHMoTGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBpdGVtID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgaXQubmV4dCgpOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCWl0ZW0sIC0xKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgc3RlcHMgdGhhdCBjb3VsZCBiZSBhc3NpZ25lZCB0byB0aGlzIHRhc2sgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U3RlcHMoKXsKLQkJLy8JZ2V0IGFsbCBzdGVwcwotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygKLQkJCQllbGVtZW50KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKAotCQkJCWVsZW1lbnQuZ2V0VGFzaygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfU3RlcHMoKSwgY29uZmlnKTsKLQotCQkvLyByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBzdGVwcwotCQlzdGVwcy5yZW1vdmVBbGwoZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkpOwotCQlyZXR1cm4gc3RlcHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzFiMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0YXNrIGRlc2NyaXB0b3IgLSB3b3JrIHByb2R1Y3Qgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiBleHRlbmRzIFJlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyB3b3JrIHByb2R1Y3QgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIxKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXI0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyNCgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPdXRwdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyNC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDQ7Ci0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTEsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMywKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCQotCQlib29sZWFuW10gY2hhbmdlc0FsbG93ZWQgPSB7IHRydWUsIHRydWUsIHRydWUsIHRydWUgfTsKLQkJc2V0VGFibGVEYXRhKG51bU9mVGFibGVzLCBjaGFuZ2VzQWxsb3dlZCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRXb3JrUHJvZHVjdHMoTGlzdCBpdGVtcykgewotCQlMaXN0IHdwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl3cExpc3QuYWRkKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVtcy5nZXQoaSkpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gd3BMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRFeHRlcm5hbElucHV0KCkpKTsKLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0RXh0ZXJuYWxJbnB1dCgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCwKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE9wdGlvbmFsSW5wdXQoKSkpOwotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh3cCkpCi0JCQkJCQluZXdMaXN0LmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczQoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIGl0ZW1zLAotCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1VUUFVULCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zNChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczQoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMigpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czIoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czMoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzNCgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czQoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPdXRwdXQoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldFByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBvYmogPSBQcm9jZXNzVXRpbC5nZXRSb290UHJvY2VzcyhhRmFjdG9yeSwgYWRhcHRlciwgZWxlbWVudCk7Ci0JCXJldHVybiAoUHJvY2Vzcykgb2JqOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdDEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QxKTsKLQkJCQkJaWYgKGxpc3QxLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJaXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXM0KGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIGl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UZWFtUHJvZmlsZVJvbGVTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGVhbVByb2ZpbGVSb2xlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg0YWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UZWFtUHJvZmlsZVJvbGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWRkUm9sZVRvVGVhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHRlYW0gcHJvZmlsZSAtIHJvbGUvY29tcG9zaXRlIHJvbGUgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZVJvbGVTZWN0aW9uIGV4dGVuZHMgT0JTUmVsYXRpb25TZWN0aW9uIHsKLQotCUxpc3Qgcm9sZUxpc3QgPSBudWxsOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCB0ZWFtUm9sZXMgPSAoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRUZWFtUm9sZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCQl9Ci0KLQkJCQkvLyByZXR1cm4gKChUZWFtUHJvZmlsZSllbGVtZW50KS5nZXRUZWFtUm9sZXMoKS50b0FycmF5KCk7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChuZXdMaXN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoVGVhbVByb2ZpbGUpIGVsZW1lbnQ7Ci0KLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlLCAKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTEpOyAKLQkJc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uID0gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCQkJCWVsZW1lbnQgPSAoVGVhbVByb2ZpbGUpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgcmVmcmVzaGluZyBUZWFtIFByb2ZpbGUgcm9sZSBzZWN0aW9uICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mVGVhbShSb2xlIHJvbGUsIFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCQlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQlyb2xlcy5hZGQocm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJfQotCi0JCWlmIChyb2xlcy5jb250YWlucyhyb2xlKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKExpc3QgaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJCQkmJiAoIWlzUGFydE9mVGVhbSgoUm9sZSkgb2JqLCAoVGVhbVByb2ZpbGUpIGVsZW1lbnQpKSkgewotCQkJCQlyb2xlcy5hZGQoKFJvbGUpIG9iaik7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJCUFkZFJvbGVUb1RlYW1Db21tYW5kIGNtZCA9IG5ldyBBZGRSb2xlVG9UZWFtQ29tbWFuZCgKLQkJCQkJCShUZWFtUHJvZmlsZSkgZWxlbWVudCwgcm9sZXMpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRnJvbVByb2Nlc3MoTGlzdCBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJQ29tcG9zaXRlUm9sZSBjb21wUm9sZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKENvbXBvc2l0ZVJvbGUpIG9iaik7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJY29tcFJvbGUsIC0xKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQlvYmosIC0xKTsKLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoIWlzUGFydE9mVGVhbShyb2xlLCAoVGVhbVByb2ZpbGUpIGVsZW1lbnQpKSB7Ci0JCQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJCQlyb2xlRGVzYywgLTEpOwotCQkJCQkJfQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCQlvYmosIC0xKTsKLQotCQkJCQkJLy8gZmlyZSBOb3RpZmljYXRpb24KLQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCQlBY3Rpdml0eSBwYXJlbnQgPSAoQWN0aXZpdHkpIGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpOwotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCi0JCQkJCQlmaXJlTm90aWZpY2F0aW9uKGNoaWxkcmVuLCAoUm9sZURlc2NyaXB0b3IpIG9iaik7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcik7IAotCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXROYW1lKCksCi0JCQkJCQkJCSgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldE5hbWUoKSB9OwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlTm90aWZpY2F0aW9uKENvbGxlY3Rpb24gY2hpbGRyZW4sIFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQoKEFjdGl2aXR5KSBvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKChBY3Rpdml0eSkgb2JqKTsKLQkJCQlmaXJlTm90aWZpY2F0aW9uKGNoaWxkcmVuLCByb2xlRGVzYyk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IG8xID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQkJQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIGFjdGl2aXR5QWRhcHRlciA9IChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iajsKLQkJCQlmaXJlTm90aWZpY2F0aW9uKGFjdGl2aXR5QWRhcHRlci5nZXRDaGlsZHJlbihvMSksIHJvbGVEZXNjKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmo7Ci0JCQkJaWYgKCgoUm9sZURlc2NyaXB0b3IpIHByb3ZpZGVyLmdldFZhbHVlKCkpLmdldFJvbGUoKS5lcXVhbHMoCi0JCQkJCQlyb2xlRGVzYy5nZXRSb2xlKCkpKSB7Ci0JCQkJCXByb3ZpZGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJbmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgcHJvdmlkZXIsCi0JCQkJCQkJCQlwcm92aWRlciksIHByb3ZpZGVyLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVtb3ZlKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJKFJvbGVEZXNjcmlwdG9yKSBvYmosIC0xKTsKLQkJCQl9Ci0KLQkJCQkvLyBmaW5kIG1hdGNoaW5nIHJvbGVEZXNjcmlwdG9yIGluIHRlYW0gcm9sZXMKLQkJCQlMaXN0IHJvbGVEZXNjTGlzdCA9IGZpbmRSb2xlRGVzY3JpcHRvcigoT2JqZWN0KSBvYmopOwotCQkJCWZvciAoSXRlcmF0b3Igcm9sZURlc2NJdG9yID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IHJvbGVEZXNjSXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIHJvbGVEZXNjSXRvcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJcm9sZURlc2MsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZmluZFJvbGVEZXNjcmlwdG9yKE9iamVjdCBvYmopIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSAoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRUZWFtUm9sZXMoKTsKLQkJTGlzdCByb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdG9yT2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCWlmIChpdG9yT2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCQlMaXN0IGZpcnN0T2JqZWN0QWdnUm9sZXMgPSAoKENvbXBvc2l0ZVJvbGUpIG9iaikKLQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCQkJCUxpc3Qgc2Vjb25kT2JqZWN0QWdnUm9sZXMgPSAoKENvbXBvc2l0ZVJvbGUpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQkJCQlpZiAoZmlyc3RPYmplY3RBZ2dSb2xlcy5lcXVhbHMoc2Vjb25kT2JqZWN0QWdnUm9sZXMpKSB7Ci0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKGl0b3JPYmplY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWlmICgoaXRvck9iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQkJJiYgKCEoaXRvck9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpKSkgewotCQkJCQlPYmplY3Qgb2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlPYmplY3QgaXRvck9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChvYmpSb2xlLmVxdWFscyhpdG9yT2JqUm9sZSkpIHsKLQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQoaXRvck9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcm9sZURlc2NMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoKChUZWFtUHJvZmlsZSkgZWxlbWVudCkKLQkJCQkJCS5nZXRUZWFtUm9sZXMoKSk7Ci0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyKCksIGVsZW1lbnQsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMsIGV4aXN0aW5nRWxlbWVudHMpOwotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1tde0ZpbHRlckNvbnN0YW50cy5ST0xFU307Ci0JCWZkLnNldFR5cGVzKHN0cik7Ci0JCWZkLm9wZW4oKTsKLQkJYWRkKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkgewotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSAoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRUZWFtUm9sZXMoKTsKLQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGdldFByb2Nlc3MoZWxlbWVudCk7Ci0JCUlGaWx0ZXIgZGVzY3JpcHRvckZpbHRlciA9IGdldERlc2NyaXB0b3JGaWx0ZXIoKTsKLQotCQlpZiAoZGVzY3JpcHRvckZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJZGVzY3JpcHRvckZpbHRlciwgcHJvY2VzcywKLQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMsIGV4aXN0aW5nRWxlbWVudHMpOwotCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUyk7Ci0JCQlmZC5vcGVuKCk7Ci0JCQlhZGRGcm9tUHJvY2VzcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBGaW5kIHBhcmVudCB1bnRpbCBpdCdzIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJCVByb2Nlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb2Nlc3MoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlc2NyaXB0b3IgZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RGVzY3JpcHRvckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlMaXN0IHBhcmVudHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCwgcGFyZW50c0xpc3QpOwotCQkJCQlpZiAocGFyZW50c0xpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqLmVxdWFscyhnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJTGlzdCBjaGlsZExpc3QgPSAoKEFjdGl2aXR5KSBvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJCWlmIChjaGlsZExpc3QuY29udGFpbnMoZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCUxpc3QgbGlzdCA9IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCQkJTGlzdCBiZWxlbWVudHMgPSAoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQkJaWYoIWJlbGVtZW50cy5pc0VtcHR5KCkpewotLy8JCQkJCQkJaWYoY29udGFpbnNUeXBlKGJlbGVtZW50cywgUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0vLwkJCQkJCQkJCQkJZ2V0SGVscGVyKCkpKQotLy8JCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJT2JqZWN0IHBhcmVudEFjdGl2aXR5ID0gZ2V0UGFyZW50QWN0aXZpdHkoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0JCQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJCQkJaWYgKHBhcmVudC5lcXVhbHMocGFyZW50QWN0aXZpdHkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJaWYgKHBhcmVudEFjdGl2aXR5IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWlmIChnZXRCYXNlQWN0aXZpdGllcygoQWN0aXZpdHkpIHBhcmVudCkuY29udGFpbnMoCi0JCQkJCQkJCXBhcmVudEFjdGl2aXR5KSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWlmIChnZXRBbGxvd2FibGVBY3Rpdml0aWVzKCkuY29udGFpbnMocGFyZW50QWN0aXZpdHkpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkJLmdldFBhcmVudChvYmopOwotCQkJCQlpZiAoZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCkuZXF1YWxzKG9iamVjdCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJb2JqZWN0ID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKS5jb250YWlucyhvYmplY3QpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCQkuZ2V0UGFyZW50KG9iaik7Ci0JCQkJCWlmIChnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KS5lcXVhbHMocGFyZW50KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCUxpc3QgbGlzdCA9IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKTsKLQkJCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iamVjdCkpewotCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQkJTGlzdCBiZWxlbWVudHMgPSAoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQkJCWlmKCFiZWxlbWVudHMuaXNFbXB0eSgpKXsKLS8vCQkJCQkJCQlpZihjb250YWluc1R5cGUoYmVsZW1lbnRzLCBSb2xlRGVzY3JpcHRvci5jbGFzcyxnZXRIZWxwZXIoKSkpCi0vLwkJCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQlwcml2YXRlIExpc3QgZ2V0QmFzZUFjdGl2aXRpZXMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpCi0JCQkJLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuTkEpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0KLQkJCQlsaXN0LmFkZCh2ZSk7Ci0KLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJCVBhcmVudCBhY3Rpdml0eQotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBjaGlsZHJlbiBvZiB0aGUgYWN0aXZpdHkgcGFyZW50IHJlY3Vyc2l2ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gYWN0aXZpdHlMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlBY3Rpdml0eSBwYXJlbnQsIExpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJT2JqZWN0IG8gPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXR5TGlzdC5hZGQob2JqKTsKLQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IG8xID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQobzEpOwotCQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG8xLAotCQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zVHlwZShMaXN0IGxpc3QsIENsYXNzIGNsYXNzMSwgRmlsdGVySGVscGVyIGhlbHBlcikgewotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgCi0JCQkJCSYmIGNsYXNzMS5pc0luc3RhbmNlKG9iaikKLQkJCQkJJiYgaGVscGVyLm1hdGNoZXIob2JqKSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJcmV0dXJuIGNvbnRhaW5zVHlwZSgoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwKLQkJCQkJCWNsYXNzMSwgaGVscGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JICogCi0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBhY3Rpdml0aWVzIGluIHNjb3BlCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gcGFyZW50IGFjdGl2aXR5Ci0JCU9iamVjdCBvYmplY3QgPSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJLy8gZ2V0IGFsbCBjaGlsZCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iamVjdCwgbGlzdCk7Ci0JCX0KLQkJLy8gZ2V0IGJhc2UgYWN0aXZpdGllcyBmb3IgYWxsIGFjdGl2aXRpZXMgaW4gc2NvcGUKLQkJSGFzaFNldCBiYXNlQWN0aXZ0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWJhc2VBY3RpdnRpZXMuYWRkQWxsKGdldEJhc2VBY3Rpdml0aWVzKChBY3Rpdml0eSkgb2JqKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZXR1cm4gY29tcGxldGUgbGlzdCBvZiBjaGlsZCBhY3Rpdml0aWVzIGFuZCBpdCdzIGJhc2UgYWN0aXZpdGllcwotCQlsaXN0LmFkZEFsbChiYXNlQWN0aXZ0aWVzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlkMjYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBXb3JrQnJlYWtkb3duRWxlbWVudAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByb3RlY3RlZCBCdXR0b24gZXZlbnREcml2ZW5CdXR0b24sIG9uZ29pbmdCdXR0b24sIHJlcGVhdGFibGVCdXR0b247Ci0KLQkvLyBwcm90ZWN0ZWQgVGV4dCBwcmVkZWNlc3NvclRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRCdXR0b24sIGVkaXRCdXR0b24sIHJlbW92ZUJ1dHRvbjsKLQotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZXZlbnREcml2ZW5CdXR0b25TZWxlY3Rpb25MaXN0ZW5lcjsKLQkvLyBwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIG9uZ29pbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcjsKLQkvLyBwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIHJlcGVhdGFibGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8vIHByaXZhdGUgTGlzdGVuZXIgcHJlZGVjZXNzb3JzTGlzdGVuZXI7Ci0KLQkvLyBwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCS8vIHByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBUZXh0Q2VsbEVkaXRvciB0ZXh0Q2VsbEVkaXRvcjsKLQotCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGlkQ2VsbEVkaXRvcjsKLQotCXByaXZhdGUgQ29tYm9Cb3hDZWxsRWRpdG9yIGNvbWJvQm94Q2VsbEVkaXRvcjsKLQotCS8vIHByZWRlY2Vzc29yIG1hcCBsaXN0Ci0JcHJpdmF0ZSBMaXN0IHByZWRNYXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgZXh0ZW5kcyBUZXh0Q2VsbEVkaXRvciB7Ci0JCXByb3RlY3RlZCBPYmplY3QgbGFzdEludmFsaWRFbGVtZW50OwotCi0JCXByaXZhdGUgaW50IGNvbHVtbkluZGV4OwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcGFyZW50Ci0JCSAqLwotCQlwdWJsaWMgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCX0KLQotCQl2b2lkIHNldENvbHVtbkluZGV4KGludCBjb2x1bW5JbmRleCkgewotCQkJdGhpcy5jb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb2x1bW5JbmRleCgpIHsKLQkJCXJldHVybiBjb2x1bW5JbmRleDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0TGFzdEludmFsaWRFbGVtZW50KCkgewotCQkJcmV0dXJuIGxhc3RJbnZhbGlkRWxlbWVudDsKLQkJfQotCi0JCVN0cmluZyBpc1ZhbGlkKFN0cmluZyB0eHQpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQlPYmplY3QgZSA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbXNnID0gaXNWYWxpZChlLCB0eHQpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlsYXN0SW52YWxpZEVsZW1lbnQgPSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxhc3RJbnZhbGlkRWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBtc2c7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiogRGVwZW5kZW5jeSBMaXRlcmFscyAqICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19TVEFSVCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fU1RBUlQgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX0ZJTklTSCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g7IAotCi0JLyoqIENvbHVtbiBpZHMgKiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSUQgPSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVTRU5UQVRJT05fTkFNRSA9IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0RFUEVOREVOQ1kgPSAiZGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBDb2x1bW4gZGVzY3JpcHRvciBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSUQgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUNPTF9JRCwKLQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVCwgMCwgMTAwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCwgU1dULkNFTlRFUik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlDT0xfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQsIDEsIDI1MCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkUpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19ERVBFTkRFTkNZID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlDT0xfREVQRU5ERU5DWSwKLQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhULCAyLCAxMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOKTsgCi0KLQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsKLQkJCUNPTF9ERVNDX0lELCBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwgQ09MX0RFU0NfREVQRU5ERU5DWSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2VsbEVkaXRvclZhbGlkYXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBDZWxsRWRpdG9yVmFsaWRhdG9yKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiBjZWxsRWRpdG9yLmlzVmFsaWQoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQkJVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbGlkYXREZWFjdGl2YXRlZTo6cnVuIik7Ci0JCQkJCWlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGdldEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCQkJCQlTdHJpbmcgcHJvYmxlbSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZzsgCi0JCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1lc3NhZ2UpOyAKLQkJCQkJCXZpZXdlci5lZGl0RWxlbWVudChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpLAotCQkJCQkJCQljZWxsRWRpdG9yLmdldENvbHVtbkluZGV4KCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJLy8gZ2V0IHdvcmticmVha2Rvd25lbGVtZW50IG9iamVjdAotCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gRXZlbnQgRHJpdmVuCi0JCWV2ZW50RHJpdmVuQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlldmVudERyaXZlbkJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW4pOyAKLQotCQkvLyBPbmdvaW5nCi0JCW9uZ29pbmdCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW9uZ29pbmdCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmcpOyAKLQotCQkvLyByZXBlYXRhYmxlCi0JCXJlcGVhdGFibGVCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMik7Ci0JCXJlcGVhdGFibGVCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGUpOyAKLQotCQkvLyBwcmVkZWNlc3NvcnMKLQkJLy8gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCS8vIFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJXb3JrQnJlYWtkb3duRWxlbWVudC5QcmVkZWNlc3NvcnMiKSk7Ci0JCS8vIHByZWRlY2Vzc29yVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCS8vIFNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0JCS8vIHByZWRlY2Vzc29yVGV4dC5zZXRUZXh0KGdldFByZWRlY2Vzc29yc0xpc3QoKSk7Ci0KLQkJLy8gZGVwZW5lbmN5IHR5cGUKLQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5KTsgCi0KLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSB2aWV3ZXIKLQkJCWNyZWF0ZVZpZXdlcihnZW5lcmFsQ29tcG9zaXRlLCAyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciBjcmVhdGluZyB2aWV3ZXIgZm9yIHdvcmticmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBwYW5lCi0JCUNvbXBvc2l0ZSBidXR0b25QYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCQlidXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgYnV0dG9uUGFuZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uUGFuZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkKTsgCi0JCWVkaXRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvblBhbmUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQpOyAKLQkJcmVtb3ZlQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25QYW5lLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmUpOyAKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZXZlbnREcml2ZW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKGV2ZW50RHJpdmVuQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlldmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc0V2ZW50RHJpdmVuKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCW9uZ29pbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIEJvb2xlYW4KLQkJCQkJCQkJLnZhbHVlT2Yob25nb2luZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJb25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09uZ29pbmcoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmVwZWF0YWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihyZXBlYXRhYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlyZXBlYXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUmVwZWF0YWJsZSgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIExpc3QgcHJlZExpc3QgPSBlbGVtZW50LmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQkJV29ya09yZGVyIG8gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQlvLnNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKTsKLQotCQkJCS8vIHByZWRMaXN0LmFkZChvKTsKLQotCQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IG5ldyBQcmVkZWNlc3Nvck1hcCgtMSwgKFdvcmtPcmRlcikgbyk7Ci0JCQkJcHJlZE1hcExpc3QuYWRkKG1hcCk7Ci0KLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCXZpZXdlci5lZGl0RWxlbWVudChtYXAsIDApOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBnZXQgc2VsZWN0aW9uCi0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJUHJlZGVjZXNzb3JNYXAgcHJlZE1hcCA9IChQcmVkZWNlc3Nvck1hcCkgc2VsZWN0aW9uCi0JCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCQkJCQlPYmplY3QgcHJvY2VzcyA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCi0JCQkJCVByZWRlY2Vzc29yRGlhbG9nIGRsZyA9IG5ldyBQcmVkZWNlc3NvckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGVsZW1lbnQsIHByb2Nlc3MsIGdldEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJcHJlZE1hcCwgcHJlZE1hcExpc3QsIGFjdGlvbk1ncik7Ci0JCQkJCWRsZy5vcGVuKCk7Ci0KLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlQcmVkZWNlc3Nvck1hcCBtYXAgPSAoUHJlZGVjZXNzb3JNYXApIHNlbGVjdGlvbgotCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJcHJlZE1hcExpc3QucmVtb3ZlKG1hcCk7Ci0KLQkJCQkJV29ya09yZGVyIHdvID0gbWFwLmdldFdvcmtPcmRlcigpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJd2JlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQl3bywgLTEpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJfQotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmIGVkaXRhYmxlKSB7Ci0JCQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQllZGl0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3JzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCS8vIHByaXZhdGUgU3RyaW5nIGdldFByZWRlY2Vzc29yc0xpc3QoKQotCS8vIHsKLQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCS8vIHJldHVybiBhZGFwdGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LCBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUyk7Ci0JLy8gfQotCS8vIHByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpCi0JLy8gewotCS8vIHN1cGVyLmFkZExpc3RlbmVycygpOwotCS8vCQkKLQkvLyBldmVudERyaXZlbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudERyaXZlbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyBvbmdvaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG9uZ29pbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gcmVwZWF0YWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihyZXBlYXRhYmxlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIC8vcHJlZGVjZXNzb3JUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwcmVkZWNlc3NvcnNMaXN0ZW5lcik7Ci0JLy8gfQotCS8vCQotCS8vIHByb3RlY3RlZCB2b2lkIHJlbW92ZUxpc3RlbmVycygpCi0JLy8gewotCS8vIHN1cGVyLnJlbW92ZUxpc3RlbmVycygpOwotCS8vCQkJCi0JLy8gZXZlbnREcml2ZW5CdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnREcml2ZW5CdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gb25nb2luZ0J1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihvbmdvaW5nQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIHJlcGVhdGFibGVCdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIocmVwZWF0YWJsZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyAvL3ByZWRlY2Vzc29yVGV4dC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgcHJlZGVjZXNzb3JzTGlzdGVuZXIpOwotCS8vIH0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJZXZlbnREcml2ZW5CdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCW9uZ29pbmdCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXJlcGVhdGFibGVCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlhZGRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYgZWRpdGFibGUpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLS8vCQlpZiAoKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQKLS8vCQkJCS5lcXVhbHMoUHJvY2Vzc0VkaXRvci5UQV9GT1JNX0lEKSkKLS8vCQkJCXx8IChFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlECi0vLwkJCQkJCS5lcXVhbHMoUHJvY2Vzc0VkaXRvci5XUEJTX0ZPUk1fSUQpKSkgewotCQlpZiAoIShFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRWRpdG9yLldCU19GT1JNX0lEKSB8fCBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlECi0JCQkJLmVxdWFscyhQcm9jZXNzRWRpdG9yLkNPTlNPTElEQVRFRF9GT1JNX0lEKSkpIHsKLQkJCWFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCWV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzRXZlbnREcml2ZW4oKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlvbmdvaW5nQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzT25nb2luZygpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJlcGVhdGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNSZXBlYXRhYmxlKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJLy8gcHJlZGVjZXNzb3JUZXh0LnNldFRleHQoZ2V0UHJlZGVjZXNzb3JzTGlzdCgpKTsKLQotCQkJCS8vIHJlLWluaXRpYWxpemUgcHJlZExpc3QKLQkJCQlwcmVkTWFwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbml0aWFsaXplUHJlZExpc3QoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBXb3JrYnJlYWtkb3duIGVsZW1lbnQgZ2VuZXJhbCBzZWN0aW9uOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJLy8gY3JlYXRlIHByb2Nlc3Mgdmlld2VyCi0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNTA7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gc2V0IHVwIGNvbHVtbnMKLQkJU3RyaW5nW10gY29sUHJvcHMgPSBuZXcgU3RyaW5nW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbFByb3BzW2ldID0gY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQ7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odmlld2VyLmdldFRhYmxlKCksCi0JCQkJCWNvbHVtbkRlc2NyaXB0b3JzW2ldLmFsaWdubWVudCk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5EZXNjcmlwdG9yc1tpXS5sYWJlbCk7Ci0JCQljb2x1bW4uc2V0UmVzaXphYmxlKGNvbHVtbkRlc2NyaXB0b3JzW2ldLnJlc2l6YWJsZSk7Ci0JCQljb2x1bW4uc2V0V2lkdGgoY29sdW1uRGVzY3JpcHRvcnNbaV0ud2lkdGgpOwotCi0JCX0KLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoY29sUHJvcHMpOwotCi0JCS8vIHRhYmxlID0gdmlld2VyLmdldFRhYmxlKCk7Ci0KLQkJLy8gZmluYWwgVGFibGVDdXJzb3IgY3Vyc29yID0gbmV3IFRhYmxlQ3Vyc29yKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCS8vIGZpbmFsIENvbnRyb2xFZGl0b3IgZWRpdG9yID0gbmV3IENvbnRyb2xFZGl0b3IoY3Vyc29yKTsKLQkJLy8gZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJLy8gZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0KLQkJLy8gZmluYWwgVGFibGVDdXJzb3IgY3Vyc29yID0gbmV3IFRhYmxlQ3Vyc29yKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCS8vIC8vIGNyZWF0ZSBhbiBlZGl0b3IgdG8gZWRpdCB0aGUgY2VsbCB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIgotCQkvLyAvLyB3aGlsZSBvdmVyIGEgY2VsbCBpbiB0aGUgdGFibGUKLQkJLy8gZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCQkvLyBlZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkvLyBlZGl0b3IuZ3JhYlZlcnRpY2FsID0gdHJ1ZTsKLQkJLy8KLQkJLy8gY3Vyc29yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkvLyAvLyB3aGVuIHRoZSBUYWJsZUVkaXRvciBpcyBvdmVyIGEgY2VsbCwgc2VsZWN0IHRoZSBjb3JyZXNwb25kaW5nIHJvdwotCQkvLyBpbgotCQkvLyAvLyB0aGUgdGFibGUKLQkJLy8gcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyB0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHsgY3Vyc29yLmdldFJvdygpfSk7Ci0JCS8vIH0KLQkJLy8gLy8gd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIgaW4gdGhlIFRhYmxlQ3Vyc29yLCBwb3AgdXAgYSB0ZXh0Ci0JCS8vIGVkaXRvciBzbyB0aGF0Ci0JCS8vIC8vIHRoZXkgY2FuIGNoYW5nZSB0aGUgdGV4dCBvZiB0aGUgY2VsbAotCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyBmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjdXJzb3IsIFNXVC5OT05FKTsKLQkJLy8gVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJLy8gaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJLy8gdGV4dC5zZXRUZXh0KHJvdy5nZXRUZXh0KGNvbHVtbikpOwotCQkvLyB0ZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkvLyBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJLy8gLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIGFuZCBjb3B5IHRoZSBkYXRhIG92ZXIKLQkJLy8gLy8gd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIKLQkJLy8gaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikgewotCQkvLyBUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkvLyBpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkvLyBpZiAoY29sdW1uID09IDEpIHJldHVybjsKLQkJLy8gcm93LnNldFRleHQoY29sdW1uLCB0ZXh0LmdldFRleHQoKSk7Ci0JCS8vIHRleHQuZGlzcG9zZSgpOwotCQkvLyB9Ci0JCS8vIC8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciB3aGVuIHRoZSB1c2VyIGhpdHMgIkVTQyIKLQkJLy8gaWYgKGUuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsKLQkJLy8gdGV4dC5kaXNwb3NlKCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8gZWRpdG9yLnNldEVkaXRvcih0ZXh0KTsKLQkJLy8gdGV4dC5zZXRGb2N1cygpOwotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLyAvLyBIaWRlIHRoZSBUYWJsZUN1cnNvciB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlICJDVFJMIiBvciAiU0hJRlQiIGtleS4KLQkJLy8gLy8gVGhpcyBhbG93cyB0aGUgdXNlciB0byBzZWxlY3QgbXVsdGlwbGUgaXRlbXMgaW4gdGhlIHRhYmxlLgotCQkvLyBjdXJzb3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkvLyBpZiAoZS5rZXlDb2RlID09IFNXVC5DVFJMCi0JCS8vIHx8IGUua2V5Q29kZSA9PSBTV1QuU0hJRlQKLQkJLy8gfHwgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDAKLQkJLy8gfHwgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKSB7Ci0JCS8vIGN1cnNvci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLyAvLyBTaG93IHRoZSBUYWJsZUN1cnNvciB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzIHRoZSAiU0hJRlQiIG9yICJDVFJMIgotCQkvLyBrZXkuCi0JCS8vIC8vIFRoaXMgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBtdWx0aXBsZSBzZWxlY3Rpb24gdGFzay4KLQkJLy8gdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJLy8gaWYgKGUua2V5Q29kZSA9PSBTV1QuQ09OVFJPTCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCS8vIHJldHVybjsKLQkJLy8gaWYgKGUua2V5Q29kZSA9PSBTV1QuU0hJRlQgJiYgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDApCi0JCS8vIHJldHVybjsKLQkJLy8gaWYgKGUua2V5Q29kZSAhPSBTV1QuQ09OVFJPTAotCQkvLyAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBpZiAoZS5rZXlDb2RlICE9IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCS8vIHJldHVybjsKLQkJLy8KLQkJLy8gVGFibGVJdGVtW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIFRhYmxlSXRlbSByb3cgPSAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSA/Ci0JCS8vIHRhYmxlLmdldEl0ZW0odGFibGUuZ2V0VG9wSW5kZXgoKSkgOiBzZWxlY3Rpb25bMF07Ci0JCS8vIHRhYmxlLnNob3dJdGVtKHJvdyk7Ci0JCS8vIGN1cnNvci5zZXRTZWxlY3Rpb24ocm93LCAwKTsKLQkJLy8gY3Vyc29yLnNldFZpc2libGUodHJ1ZSk7Ci0JCS8vIGN1cnNvci5zZXRGb2N1cygpOwotCQkvLyB9Ci0JCS8vIH0pOwotCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iaikgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJlZE1hcExpc3Q6OiIrcHJlZE1hcExpc3QpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCXJldHVybiAoKExpc3QpIHByZWRNYXBMaXN0KS50b0FycmF5KCk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uOjpsYWJlbFByb3ZpZGVyCi0JCQkJLy8gT2JqZWN0LSAiICsgb2JqKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJlZGVjZXNzb3JNYXApIHsKLQkJCQkJaW50IGlkID0gKChQcmVkZWNlc3Nvck1hcCkgb2JqKS5nZXRJZCgpOwotCQkJCQlXb3JrT3JkZXIgd28gPSAoKFByZWRlY2Vzc29yTWFwKSBvYmopLmdldFdvcmtPcmRlcigpOwotCi0JCQkJCWlmIChpID09IDApIHsKLQkJCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihpZCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGkgPT0gMSkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHdvLmdldFByZWQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IHdvLmdldFByZWQoKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCQkJCQlyZXR1cm4gd28uZ2V0UHJlZCgpLmdldE5hbWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmFtZTsKLQkJCQkJfQotCQkJCQlpZiAoaSA9PSAyKSB7Ci0JCQkJCQlpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpCi0JCQkJCQkJcmV0dXJuIEZJTklTSF9UT19GSU5JU0g7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKQotCQkJCQkJCXJldHVybiBGSU5JU0hfVE9fU1RBUlQ7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpCi0JCQkJCQkJcmV0dXJuIFNUQVJUX1RPX1NUQVJUOwotCQkJCQkJZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSCkKLQkJCQkJCQlyZXR1cm4gU1RBUlRfVE9fRklOSVNIOwotCQkJCQkJcmV0dXJuIHdvLmdldExpbmtUeXBlKCkuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCi0JCXRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHZpZXdlci5nZXRUYWJsZSgpKTsKLQkJY29tYm9Cb3hDZWxsRWRpdG9yID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0VGFibGUoKSwKLQkJCQluZXcgU3RyaW5nW10geyBGSU5JU0hfVE9fU1RBUlQsIEZJTklTSF9UT19GSU5JU0gsCi0JCQkJCQlTVEFSVF9UT19TVEFSVCwgU1RBUlRfVE9fRklOSVNIIH0pOwotCi0JCXNldENlbGxFZGl0b3JzKCk7Ci0JCXNldENlbGxNb2RpZmllcnMoKTsKLQotCQlpbml0aWFsaXplUHJlZExpc3QoKTsKLQkJdmlld2VyLnNldElucHV0KHByZWRNYXBMaXN0KTsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQotCX0KLQotCXByaXZhdGUgaW50IGdldENlbGxFZGl0b3JUeXBlKFN0cmluZyBwcm9wZXJ0eSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb2x1bW5EZXNjcmlwdG9yIGRlc2MgPSBjb2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCWlmIChkZXNjLmlkID09IHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIGRlc2MuY2VsbEVkaXRvclR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FOwotCX0KLQotCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoU3RyaW5nIGNvbHVtbklELCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbklEID09IENPTF9JRCkgewotCQkJaWYgKGlkQ2VsbEVkaXRvciA9PSBudWxsKSB7Ci0JCQkJaWRDZWxsRWRpdG9yID0gbmV3IFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0VGFibGUoKSkgewotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yOjppc1ZhbGlkIik7Ci0JCQkJCQllID0gVG5nVXRpbC51bndyYXAoZSk7Ci0KLQkJCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JCQkJCQlPYmplY3QgcHJvY2VzcyA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCi0JCQkJCQlMaXN0IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCQkJU3RyaW5nIHN0ciA9IGdldFByZWRJZCgpOwotCQkJCQkJU3RyaW5nIHJlc3VsdCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5jaGVja1ByZWRlY2Vzc29yTGlzdCh3YmUsIHN0ciwKLQkJCQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLCBwcm9jZXNzLAotCQkJCQkJCQkJCXByZWRlY2Vzc29ycyk7Ci0KLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJaWRDZWxsRWRpdG9yCi0JCQkJCQkuc2V0VmFsaWRhdG9yKG5ldyBDZWxsRWRpdG9yVmFsaWRhdG9yKGlkQ2VsbEVkaXRvcikpOwotCQkJCWlkQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihpZENlbGxFZGl0b3IpKTsKLQkJCX0KLQkJCWlkQ2VsbEVkaXRvci5zZXRDb2x1bW5JbmRleChjb2x1bW5JbmRleCk7Ci0KLQkJCXJldHVybiBpZENlbGxFZGl0b3I7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2VsbEVkaXRvcnMoKSB7Ci0JCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNlbGxFZGl0b3IgY2VsbEVkaXRvciA9IGdldENlbGxFZGl0b3IoY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQsIGkpOwotCQkJaWYgKGNlbGxFZGl0b3IgIT0gbnVsbCkgewotCQkJCWNlbGxFZGl0b3JzW2ldID0gY2VsbEVkaXRvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dpdGNoIChjb2x1bW5EZXNjcmlwdG9yc1tpXS5jZWxsRWRpdG9yVHlwZSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gdGV4dENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gY29tYm9Cb3hDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENlbGxNb2RpZmllcnMoKSB7Ci0JCS8vIFNldCB0aGUgY2VsbCBtb2RpZmllcgotCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNhbk1vZGlmeTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KTsKLQkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgUHJlZGVjZXNzb3JNYXApKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKHByb3BlcnR5ID09IENPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VmFsdWU6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0KLQkJCQlTdHJpbmcgdmFsID0gbnVsbDsKLQkJCQlzd2l0Y2ggKGdldENlbGxFZGl0b3JUeXBlKHByb3BlcnR5KSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCXZhbCA9IG5ldyBJbnRlZ2VyKCgoUHJlZGVjZXNzb3JNYXApIGVsZW1lbnQpLmdldElkKCkpCi0JCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiB2YWw7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJaW50IHZhbHVlID0gKCgoUHJlZGVjZXNzb3JNYXApIGVsZW1lbnQpLmdldFdvcmtPcmRlcigpKQotCQkJCQkJCS5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCk7Ci0JCQkJCWlmIChXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVF9WQUxVRSA9PSB2YWx1ZSkgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDApOwotCQkJCQl9IGVsc2UgaWYgKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9WQUxVRSA9PSB2YWx1ZSkgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDEpOwotCQkJCQl9IGVsc2UgaWYgKFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlRfVkFMVUUgPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigyKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMyk7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShmaW5hbCBPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LAotCQkJCQlPYmplY3QgdmFsdWUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGlmeTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KyIsIHZhbHVlPSIrdmFsdWUpOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQkJCQlQcmVkZWNlc3Nvck1hcCBwcmVkTWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdGVtLmdldERhdGEoKTsKLQkJCQlXb3JrT3JkZXIgd28gPSBwcmVkTWFwLmdldFdvcmtPcmRlcigpOwotCi0JCQkJaWYgKHByb3BlcnR5LmVxdWFscyhDT0xfSUQpKSB7Ci0JCQkJCWl0ZW0uc2V0VGV4dCgwLCB2YWx1ZS50b1N0cmluZygpKTsKLQotCQkJCQlpbnQgcHJlZElkOwotCQkJCQl0cnkgewotCQkJCQkJcHJlZElkID0gbmV3IEludGVnZXIodmFsdWUudG9TdHJpbmcoKSkuaW50VmFsdWUoKTsKLQkJCQkJCWlmIChwcmVkSWQgPCAwKQotCQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGUsIAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlKTsgCi0JCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXByZWRNYXAuc2V0SWQocHJlZElkKTsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBnZXRDb2x1bW5JbmRleChwcm9wZXJ0eSk7Ci0JCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gdmlld2VyLmdldENlbGxFZGl0b3JzKClbY29sdW1uSW5kZXhdOwotCQkJCVN0cmluZyBlcnJNc2cgPSBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJV29ya09yZGVyVHlwZSB0eXBlOwotCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJCi0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgkJCQkJCi0JCQkJCU9iamVjdCBwcm9jZXNzID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0KLQkJCQkJTGlzdDxPYmplY3Q+IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwkJCQkJCi0JCQkJCVN0cmluZyBzdHIgPSBnZXRQcmVkSWQoKTsKLQkJCQkJU3RyaW5nIHJlc3VsdCA9IFByb2Nlc3NVdGlsLmNoZWNrUHJlZGVjZXNzb3JMaXN0KHdiZSwgc3RyLAotCQkJCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0KLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQlMaXN0PFdvcmtPcmRlcj4gYWRkTGlzdCA9IG5ldyBBcnJheUxpc3Q8V29ya09yZGVyPigpOwotCQkJCQkJTGlzdDxXb3JrT3JkZXI+IHByZWRUb0JlRGVsZXRlZCA9IG5ldyBBcnJheUxpc3Q8V29ya09yZGVyPigpOwotCQkJCQkJUHJlZGVjZXNzb3JMaXN0LnByZXBhcmVVcGRhdGVQcmVkZWNlc3NvcnMoZ2V0QWRhcHRlckZhY3RvcnkoKSwgd2JlLCBwcmVkZWNlc3NvcnMsIGFkZExpc3QsIHByZWRUb0JlRGVsZXRlZCk7Ci0JCQkJCQlpZighcHJlZFRvQmVEZWxldGVkLmlzRW1wdHkoKSkgewotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJd2JlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCXByZWRUb0JlRGVsZXRlZCwgLTEpOwotCQkJCQkJfQotCQkJCQkJaWYoIWFkZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCQkJCQkJCXdiZSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCQkJYWRkTGlzdCwgLTEpOwotCQkJCQkJCWlmKHN0YXR1cykgewotCQkJCQkJCQkvL1RPRE86IHJldmlldyB0aGlzCi0JCQkJCQkJCXByZWRNYXAuc2V0V29ya09yZGVyKGFkZExpc3QuZ2V0KGFkZExpc3Quc2l6ZSgpIC0gMSkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXByZWRNYXBMaXN0LnJlbW92ZShwcmVkTWFwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzaG93IGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBnZXRFZGl0b3IoKS5nZXRUaXRsZSgpOwotCQkJCQkJU3RyaW5nIHByb2JsZW0gPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnOyAKLQkJCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQkJZGlhbG9nLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBwcm9ibGVtLCByZXN1bHQpOyAKLQkJCQkJCXByZWRNYXBMaXN0LnJlbW92ZShwcmVkTWFwKTsKLQkJCQkJfQotCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmVDb3B5ID0gbnVsbDsKLQkJCQkJV29ya09yZGVyIG8gPSBudWxsOwotCQkJCQlpbnQgaW5kZXggPSAoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJbyA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKG8uZ2V0UHJlZCgpID09IHdvLmdldFByZWQoKSkKLQkJCQkJCXsJCQkJCQkJCi0JCQkJCQkJaWYgKG8uZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpICE9IGluZGV4KSB7Ci0JCQkJCQkJCXdiZUNvcHkgPSBvLmdldFByZWQoKTsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQkJCQkJCQkKLQkJCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVDsKLQkJCQkJfSBlbHNlIGlmIChpbmRleCA9PSAxKSB7Ci0JCQkJCQl0eXBlID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIOwotCQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IDIpIHsKLQkJCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAocmVtb3ZlZCAmJiB3YmVDb3B5ICE9IG51bGwpIHsJCQkJCQotCQkJCQkJd28uc2V0UHJlZCh3YmVDb3B5KTsKLQkJCQkJCXdvLnNldExpbmtUeXBlKHR5cGUpOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQl3YmUsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCQlpZiAoc3RhdHVzKQotCQkJCQkJCXByZWRNYXAuc2V0V29ya09yZGVyKG8pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgd28sCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9MaW5rVHlwZSgpLCB0eXBlLAotCQkJCQkJCQktMSk7Ci0JCQkJCX0JCQkJCQkKLQkJCQkJCi0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdDoKLQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSDsKLQkJCQl9Ci0KLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgbGlzdCBvZiBpdGVtIHByb3ZpZGVycyBmb3IgcHJlZGVjZXNzb3JzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCS8vIHByaXZhdGUgT2JqZWN0IGdldFByZWRJdGVtUHJvdmlkZXJzKCkKLQkvLyB7Ci0JLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRCU0FkYXB0ZXIoKTsKLQkvLyBpZiAoYWRhcHRlciAhPSBudWxsKQotCS8vIHJldHVybiBhZGFwdGVyLmdldFByZWRlY2Vzc29ycygpOwotCS8vICAgIAkKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEJTQWRhcHRlcigpIHsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOy8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBmYWN0b3J5LmFkYXB0KAotCQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIHByb3ZpZGVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gY29sdW1uIGluZGV4IGZvciBwcm9wZXJ0eQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgcHJvcGVydHkpIHsKLQkJT2JqZWN0W10gY29sUHJvcHMgPSB2aWV3ZXIuZ2V0Q29sdW1uUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbFByb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sUHJvcHNbaV0gPT0gcHJvcGVydHkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVBTV9QUk9GSUxFICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfTUlMRVNUT05FICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0VMRU1FTlQgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZElkKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWJ1Zi5hcHBlbmQobWFwLmdldElkKCkpOwotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgcHJlZCBsaXN0Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcmVkTGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgcHJlZFByb3ZpZGVycyA9IG51bGw7Ci0KLQkJCS8vIGdldCB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCS8vIGdldCBwcmVkZWNlc3NvciBpdGVtIHByb3ZpZGVycwotCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGZhY3RvcnkKLQkJCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQlwcmVkUHJvdmlkZXJzID0gKChJQlNJdGVtUHJvdmlkZXIpIHByb3ZpZGVyKQotCQkJCQkJCS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5lZWQgZm9sbG93aW5nIGZvciBzcGVjaWFsIGNhc2UgKFdyYXBwZXJJdGVtUHJvdmlkZXJzKS4KLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJcHJlZFByb3ZpZGVycyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KQotCQkJCQkJCS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCBsaW5rIHRvIHByZWRlY2Vzc29ycwotCQkJaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChwcmVkUHJvdmlkZXJzICE9IG51bGwpKSB7Ci0JCQkJTGlzdCBwcmVkTGlzdCA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZW1JdGVyYXRvciA9IHByZWRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlbUl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCU9iamVjdCBpdGVtT2JqID0gKE9iamVjdCkgaXRlbUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJCWlmIChpdGVtT2JqIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJdGFyZ2V0T2JqID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChpdGVtT2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtT2JqKS5nZXRUYXJnZXQoKTsKLQkJCQkJfQotCQkJCQlpZiAodGFyZ2V0T2JqICE9IG51bGwpIHsKLQkJCQkJCWludCBpZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRJZCgpOwotCQkJCQkJZm91bmQgPSBhZGRQcmVkZWNlc3NvcihwcmVkTGlzdCwgaWQsIHRhcmdldE9iaik7Ci0KLQkJCQkJCWlmICgoIWZvdW5kKQotCQkJCQkJCQkmJiAodGFyZ2V0T2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIHRhcmdldE9iajsKLQkJCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsID0gdmUKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCQl0YXJnZXRPYmogPSBlbDsKLQotCQkJCQkJCQkvLyBhZGQgYmFzZSB2YXJpYWJpbGl0eSBvYmplY3QKLQkJCQkJCQkJYWRkUHJlZGVjZXNzb3IocHJlZExpc3QsIGlkLCB0YXJnZXRPYmopOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRvcj1wcmVkTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQkJLy8gewotCQkJCS8vIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkvLyBPYmplY3QgbyA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCS8vIGlmIChvIGluc3RhbmNlb2YgV29ya09yZGVyKQotCQkJCS8vIHsKLQkJCQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudDo6V29ya09yZGVyID0gIisgKChXb3JrT3JkZXIpCi0JCQkJLy8gbykuZ2V0UHJlZCgpKTsKLQkJCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoKFdvcmtPcmRlcikgbykuZ2V0UHJlZCgpOwotCQkJCS8vIGlmICh3YmUgIT0gbnVsbCkKLQkJCQkvLyB7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVtSXRlcmF0b3I9cHJlZFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQkJCS8vIGl0ZW1JdGVyYXRvci5oYXNOZXh0KCk7KQotCQkJCS8vIHsKLQkJCQkvLyBPYmplY3QgaXRlbU9iaiA9IChPYmplY3QpIGl0ZW1JdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJLy8gaWYgKGl0ZW1PYmogaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCS8vIHsKLQkJCQkvLyB0YXJnZXRPYmogPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldFZhbHVlKCk7Ci0JCQkJLy8gfQotCQkJCS8vIGlmIChpdGVtT2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJCQkvLyB7Ci0JCQkJLy8gdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWl0ZW1PYmopLmdldFRhcmdldCgpOwotCQkJCS8vIH0KLQkJCQkvLyBpZiAodGFyZ2V0T2JqICE9IG51bGwpCi0JCQkJLy8gewotCQkJCS8vIGlmICh0YXJnZXRPYmouZXF1YWxzKHdiZSkpCi0JCQkJLy8gewotCQkJCS8vIC8vIGNyZWF0ZSBtYXBPYmplY3RMaXN0Ci0JCQkJLy8gaW50IGlkID0gKChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldElkKCk7Ci0JCQkJLy8gUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKGlkLCAoV29ya09yZGVyKSBvKTsKLQkJCQkvLyBwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQkJCQkvLwkJCi0JCQkJLy8gZm91bmQ9dHJ1ZTsKLQkJCQkvLyBicmVhazsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBpZiAoIWZvdW5kKQotCQkJCS8vIHsKLQkJCQkvLyAvLyBpZiBwcm92aWRlciBpcyBub3QgZm91bmQsIHRoZW4gYWRkIHdpdGggaWQ9MAotCQkJCS8vIC8vIGRvIGl0IG9ubHkgZm9yIFRlYW1BbGxvY2F0aW9uIGFuZCBXb3JrUHJvZHVjdFVzYWdlIHZpZXcKLQkJCQkvLyAvLyBpZgotCQkJCS8vICgoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRC5lcXVhbHMoUHJvY2Vzc0Zvcm1FZGl0b3IuVEFfRk9STV9JRCkpCi0JCQkJLy8gfHwKLQkJCQkvLyAvLwotCQkJCS8vIChFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRm9ybUVkaXRvci5XUEJTX0ZPUk1fSUQpKSkKLQkJCQkvLyB7Ci0JCQkJLy8gUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKDAsIChXb3JrT3JkZXIpIG8pOwotCQkJCS8vIHByZWRNYXBMaXN0LmFkZChtYXApOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkluaXRpYWxpemluZyBQcmVkZWNlc3NvciBMaXN0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRQcmVkZWNlc3NvcihMaXN0IHByZWRMaXN0LCBpbnQgaWQsIE9iamVjdCB0YXJnZXRPYmopIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnQ6OldvcmtPcmRlciA9ICIrICgoV29ya09yZGVyKQotCQkJCS8vIG8pLmdldFByZWQoKSk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKChXb3JrT3JkZXIpIG8pLmdldFByZWQoKTsKLQotCQkJCWlmICh0YXJnZXRPYmouZXF1YWxzKHdiZSkpIHsKLQkJCQkJLy8gY3JlYXRlIG1hcE9iamVjdExpc3QKLQkJCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKGlkLCAoV29ya09yZGVyKSBvKTsKLQkJCQkJcHJlZE1hcExpc3QuYWRkKG1hcCk7Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWVmODM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnbldQVG9EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIGV4dGVuZHMKLQkJRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9tZXRob2RfZWxlbWVudDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3dvcmtQcm9kdWN0X3R5cGU7Ci0KLQlwcml2YXRlIFRleHQgYWN0aXZpdHlFbnRyeVN0YXRlLCBhY3Rpdml0eUV4aXRTdGF0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGxpbmtCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjbGVhckJ1dHRvbjsKLQkKLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyXzE7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF9wcm9jXzEsIGN0cmxfcmVtb3ZlXzE7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZGVsaXZlcmFibGVTZWN0aW9uOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciB3cE1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVTZWN0aW9uKCkgewotCQlpZiAoIShlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCWlmIChkZWxpdmVyYWJsZVNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCQlpZiAoZGVsaXZlcmFibGVTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghZGVsaXZlcmFibGVTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQlpZiAoIWRlbGl2ZXJhYmxlU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWxpdmVyYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlTdHJpbmcgc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZTsgCi0JCVN0cmluZyBzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb247IAotCQlTdHJpbmcgdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE7IAotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uLAotCQkJCTIsIGZhbHNlKTsKLQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQlpbnQgdGFibGVIZWlnaHQgPSA4MDsKLQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCXZpZXdlcl8xID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMSk7Ci0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGRlbGl2ZXJhYmxlUGFydHMgPSBlbGVtZW50LmdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBkZWxpdmVyYWJsZVBhcnRzLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKHdwRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsCi0JCQkJCQkJfHwgd3BEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQluZXdMaXN0LmFkZCh3cERlc2MpOwotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KG5ld0xpc3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJdmlld2VyXzEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlcl8xLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlcl8xLnNldElucHV0KGVsZW1lbnQpOwotCi0JCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJY3RybF9hZGRfcHJvY18xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAKLQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQkJZGVsaXZlcmFibGVTZWN0aW9uID0gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCS8vIGlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCS8vIHsKLQkJLy8gbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBtZXRob2QgZWxlbWVudAotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1R5cGVfV29ya1Byb2R1Y3QpOyAKLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgU1dULk5PTkUsIDIsIHRydWUpOwotCQlsaW5rQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJbGlua0J1dHRvbgotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQpOyAKLQotCQljbGVhckJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWNsZWFyQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9DbGVhck1ldGhvZEVsZW1lbnQpOyAKLQotCQkvLyB0eXBlCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtQcm9kdWN0X1R5cGUpOyAKLQkJY3RybF93b3JrUHJvZHVjdF90eXBlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCQljdHJsX3dvcmtQcm9kdWN0X3R5cGUuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50VHlwZShlbGVtZW50KSk7Ci0JCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBhY3Rpdml0eUVudHJ5c3RhdGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSk7IAotCQlhY3Rpdml0eUVudHJ5U3RhdGUgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gYWN0aXZpdHlFeGl0c3RhdGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKTsgCi0JCWFjdGl2aXR5RXhpdFN0YXRlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCi0JCS8vIENSRUFURSBERUxJVkVSQUJMRSBTRUNUSU9OCi0JCWNyZWF0ZURlbGl2ZXJhYmxlU2VjdGlvbihjb21wb3NpdGUpOwotCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZShXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCXN0ciA9IGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnRUeXBlKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50KSB7Ci0JCVN0cmluZyBzdHIgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsgCi0JCWlmIChlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgIT0gbnVsbCkgewotCQkJc3RyID0gUHJvcGVydGllc1V0aWwuZ2V0VHlwZShlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWFjdGl2aXR5RW50cnlTdGF0ZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWFjdGl2aXR5RW50cnlTdGF0ZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGFjdGl2aXR5RW50cnlTdGF0ZQotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYWN0aXZpdHlFeGl0U3RhdGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWFjdGl2aXR5RXhpdFN0YXRlLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoYWN0aXZpdHlFeGl0U3RhdGUKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkKLQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcigKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7IAotCQkJCS8vIGJsb2NrIGl0J3MgZGVsaXZlcmFibGUgcGFydHMKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZXhpc3RpbmdFbGVtZW50cwotCQkJCQkJLmFkZEFsbChQcm9jZXNzVXRpbAotCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZVBhcnRzKCkpKTsKLQkJCQkvLyBibG9jayBpdHNlbGYKLQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZChQcm9jZXNzVXRpbAotCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQkJCQkvLyBhbHNvIGJsb2NrIGl0J3MgcGFyZW50IHdvcmsgcHJvZHVjdHMsIGlmIGFueQotCQkJCWV4aXN0aW5nRWxlbWVudHMKLQkJCQkJCS5hZGRBbGwoKENvbGxlY3Rpb24pIGdldFBhcmVudFdvcmtQcm9kdWN0cygoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSk7Ci0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUywKLQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlhZGRJdGVtcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJfQotCQl9KTsKLQotCQljdHJsX2FkZF9wcm9jXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTOwotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZEFsbCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJCS5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCi0JCQkJZXhpc3RpbmdFbGVtZW50cwotCQkJCQkJLmFkZEFsbChnZXRQYXJlbnREZWxpdmVyYWJsZXMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkpOwotCQkJCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlbGVtZW50KTsKLQotCQkJCUlGaWx0ZXIgZGVzY3JpcHRvckZpbHRlciA9IGdldERlc2NyaXB0b3JGaWx0ZXIoKTsKLQkJCQlpZiAoZGVzY3JpcHRvckZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGRlc2NyaXB0b3JGaWx0ZXIsIHByb2Nlc3MsIHRhYk5hbWUsCi0JCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5zZXRUaXRsZSh0YWJOYW1lKTsKLQkJCQkJZmQub3BlbigpOwotCQkJCQlhZGRGcm9tUHJvY2Vzc0l0ZW1zKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcmVtb3ZlXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQlyZW1vdmVJdGVtcyhybUl0ZW1zKTsKLQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCi0JCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJdmlld2VyXzEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCi0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlsaW5rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsgCi0JCQkJQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlID0gbnVsbDsKLQkJCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCQkJd29ya1Byb2R1Y3RUeXBlID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpLmdldENsYXNzKCk7Ci0JCQkJfQotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSBlbGVtZW50LmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKHdwKTsKLQkJCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCUxpc3Qgc3ViQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZ2V0QWxsU3ViQXJ0aWZhY3RzKChBcnRpZmFjdCkgd3AsIHN1YkFydGlmYWN0cywKLQkJCQkJCQkJKChBcnRpZmFjdCkgd3ApLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKHN1YkFydGlmYWN0cyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0JCQkJCQkJCWVsZW1lbnQpOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCQkJCQkJaWYgKCghd3BEZXNjLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJJiYgKCF3cERlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSkgewotCQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZCh3cCk7Ci0KLQkJCQkJCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQkJCUxpc3Qgc3ViQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJZ2V0QWxsU3ViQXJ0aWZhY3RzKChBcnRpZmFjdCkgd3AsCi0JCQkJCQkJCQkJCXN1YkFydGlmYWN0cywgKChBcnRpZmFjdCkgd3ApCi0JCQkJCQkJCQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKHN1YkFydGlmYWN0cyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUsIHdvcmtQcm9kdWN0VHlwZSk7Ci0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgdGFiTmFtZSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUodGFiTmFtZSk7Ci0JCQkJZmQub3BlbigpOwotCQkJCXNldE1ldGhvZEVsZW1lbnQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY2xlYXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwKLQkJCQkJCW51bGwsIC0xKTsKLQkJCQkvLyB1cGRhdGUgbWV0aG9kIGVsZW1lbnQgY29udHJvbAotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlMSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0QWxsU3ViQXJ0aWZhY3RzKEFydGlmYWN0IGFydGlmYWN0LCBMaXN0IHN1YkFydGlmYWN0cywKLQkJCUxpc3QgY29udGFpbmVkQXJ0aWZhY3RzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNvbnRhaW5lZEFydGlmYWN0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCWlmICghc3ViQXJ0aWZhY3RzLmNvbnRhaW5zKG9iaikpCi0JCQkJCXN1YkFydGlmYWN0cy5hZGQob2JqKTsKLQkJCQlnZXRBbGxTdWJBcnRpZmFjdHMoKEFydGlmYWN0KSBvYmosIHN1YkFydGlmYWN0cywKLQkJCQkJCSgoQXJ0aWZhY3QpIG9iaikuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJYWN0aXZpdHlFbnRyeVN0YXRlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlsaW5rQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljbGVhckJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJYWN0aXZpdHlFbnRyeVN0YXRlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlpZiAoY3RybF9hZGRfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkX3Byb2NfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY18xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9yZW1vdmVfMSAhPSBudWxsKQotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCWVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQkvLyBNb2RlbCBNb2RpZnkgbGlzdGVuZXIgZm9yIGFjdGl2aXR5IGVudHJ5IHN0YXRlIGFuZCBhY3Rpdml0eQotCQkJCS8vIGV4aXQgc3RhdGUKLQkJCQlpZiAod3BNb2RlbE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJYWN0aXZpdHlFbnRyeVN0YXRlCi0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHdwTW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWFjdGl2aXR5RXhpdFN0YXRlCi0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHdwTW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQl9Ci0KLQkJCQl3cE1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBnZXRFZGl0b3IoKS5jcmVhdGVNb2RpZnlMaXN0ZW5lcigKLQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCi0JCQkJaWYgKHdwTW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgd3BNb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQkJY3RybF93b3JrUHJvZHVjdF90eXBlLnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudFR5cGUoZWxlbWVudCkpOwotCQkJCWFjdGl2aXR5RW50cnlTdGF0ZS5zZXRUZXh0KGVsZW1lbnQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJCWFjdGl2aXR5RXhpdFN0YXRlLnNldFRleHQoZWxlbWVudC5nZXRBY3Rpdml0eUV4aXRTdGF0ZSgpKTsKLQotCQkJCWlmICh3cE1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgd3BNb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUuYWRkTW9kaWZ5TGlzdGVuZXIod3BNb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQlhY3Rpdml0eUV4aXRTdGF0ZS5hZGRNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJaWYgKHZpZXdlcl8xICE9IG51bGwpIHsKLQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCQkJCX0KLQotCQkJCS8vIGhpZGUvc2hvdyBjZXJ0YWluIHNlY3Rpb25zLgotCQkJCXRvZ2dsZVNlY3Rpb24oKTsKLQotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZ2VuZXJhbCBzZWN0aW9uIDogIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEl0ZW1zKExpc3QgaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCUxpc3Qgd3BzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCQkJCSYmICghaXNQYXJ0T2ZEZWxpdmVyYWJsZSgoV29ya1Byb2R1Y3QpIG9iaiwKLQkJCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkpKSB7Ci0JCQkJCXdwcy5hZGQoKFdvcmtQcm9kdWN0KSBvYmopOwotCi0JCQkJfQotCQkJfQotCQkJaWYgKCF3cHMuaXNFbXB0eSgpKSB7Ci0JCQkJQXNzaWduV1BUb0RlbGl2ZXJhYmxlIGNtZCA9IG5ldyBBc3NpZ25XUFRvRGVsaXZlcmFibGUoCi0JCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50LCB3cHMpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQkJdmlld2VyXzEucmVmcmVzaCgpOwotCX0KLQotCXByb3RlY3RlZCBJRmlsdGVyIGdldERlc2NyaXB0b3JGaWx0ZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtcyhMaXN0IGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoIWlzUGFydE9mRGVsaXZlcmFibGUod3AsCi0JCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKTsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLAotCQkJCQkJCQkJCQl3cERlc2MsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLAotCQkJCQkJCQkJCW9iaiwgLTEpOwotCQkJCQkJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yKTsgCi0JCQkJCQlPYmplY3RbXSBhcmdzID0gewotCQkJCQkJCQkoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKS5nZXROYW1lKCksCi0JCQkJCQkJCSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXROYW1lKCkgfTsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVJdGVtcyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmosIC0xKTsKLQkJCQl9Ci0KLQkJCQkvLyBmaW5kIG1hdGNoaW5nIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJT2JqZWN0IHdwRGVzYyA9IGZpbmREZWxpdmVyYWJsZVBhcnRzKChPYmplY3QpIG9iaik7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLAotCQkJCQkJd3BEZXNjLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBmaW5kRGVsaXZlcmFibGVQYXJ0cyhPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgcGFydHMgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHBhcnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoaXRvck9iamVjdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlPYmplY3Qgb2JqV1AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlPYmplY3QgaXRvcldQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMoaXRvcldQKSkgewotCQkJCQkJcmV0dXJuIGl0b3JPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHBhcmVudCBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBkZWxpdmVyYWJsZXMKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRQYXJlbnREZWxpdmVyYWJsZXMoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJTGlzdCBwYXJlbnREZWxpdmVyYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcGFyZW50OwotCQkJCWlmICh3cGRlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXBhcmVudERlbGl2ZXJhYmxlcy5hZGQod3BkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudERlbGl2ZXJhYmxlczsKLQl9Ci0JLyoqCi0JICogRmluZCBhbGwgc2libGluZyB3b3JrIHByb2R1Y3RzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50V29ya1Byb2R1Y3RzKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUhhc2hTZXQgd29ya1Byb2R1Y3RzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudDsKLQkJCQlpZiAod3BkZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQl3b3JrUHJvZHVjdHMuYWRkKHdwZGVzYy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUxpc3QgYnJFbGVtZW50cyA9ICgoQWN0aXZpdHkpIHBhcmVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGJyRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3AgIT0gbnVsbCkKLQkJCQkJCXdvcmtQcm9kdWN0cy5hZGQod3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTGlzdCBpdGVtcykgewotCQlpZiAoKGl0ZW1zICE9IG51bGwpICYmIChpdGVtcy5zaXplKCkgPj0gMSkpIHsKLQkJCWlmIChpdGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdGVtcy5nZXQoMCk7Ci0KLS8vCQkJCUxpc3QgbGlzdCA9IFByb2Nlc3NVdGlsCi0vLwkJCQkJCS5nZXRTaWJsaW5ncyhUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0vLwkJCQkJCQkJZWxlbWVudCk7Ci0JCQkJYm9vbGVhbiBjYW5Bc3NpZ24gPSB0cnVlOwotLy8JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLS8vCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0vLwkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotLy8JCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotLy8JCQkJCQlpZiAoKCF3cERlc2MuZXF1YWxzKGVsZW1lbnQpKQotLy8JCQkJCQkJCSYmICghd3BEZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLS8vCQkJCQkJCVdvcmtQcm9kdWN0IGV4aXNpbmdXUCA9IHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotLy8JCQkJCQkJaWYgKHdwLmVxdWFscyhleGlzaW5nV1ApKSB7Ci0vLwkJCQkJCQkJY2FuQXNzaWduID0gZmFsc2U7Ci0vLwkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJaWYgKGNhbkFzc2lnbikgewotCQkJCQlMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gbmV3IExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCgKLQkJCQkJCQllbGVtZW50LCB3cCwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QpOwotCQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCS8vIHNldCBzZWxlY3Rpb24gdG8gc2FtZSBlbGVtZW50IHRvIGVuYWJsZSBjb3JyZWN0IGFjdGlvbnMKLQkJCQkJZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudCk7IAotCQkJCQlPYmplY3RbXSBhcmdzID0geyB3cC5nZXROYW1lKCkgfTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnRPZkRlbGl2ZXJhYmxlKFdvcmtQcm9kdWN0IHdwLAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlKSB7Ci0KLQkJTGlzdCBkZWxpdmVyYWJsZVBhcnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KGRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCWlmIChkZWxpdmVyYWJsZVBhcnRzLmNvbnRhaW5zKHdwKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhYTdjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGFiYmVkIHBhZ2VzIGZvciB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIFByb3BlcnRpZXMgdmlldy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9DYXRlZ29yeUNvbnRlbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1NmQ3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9DYXRlZ29yeUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Eb21haW5zSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldHNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Ub29sc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LldvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQ29udGVudCBwcm92aWRlciBmb3IgQ3VzdG9tIENhdGVnb3J5IHZpZXcgb2YgY29uZmlndXJhdGlvbiBwYWdlCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICovCi0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKLQotCS8vIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGUgcGFzc2VkIGluIEFkYXB0ZXJGYWN0b3J5Ci0JLy8gaXQgY2FuJ3QgZmluZCB0aGUgY29ycmVjdCBwYXJlbnQgZnJvbSB0aGUgY2hpbGQKLQkvLyBuZWVkIHRvIGJ1aWxkIGEgbWFwIG9mIGNoaWxkIHRvIGl0J3MgcGFyZW50IGlmIHRoZSBjaGlsZCBpcyBhIFVJCi0JLy8gZm9sZGVyCi0JLy8gY2xlYXIgdGhlIG1hcCB3aGVuIHRoZSBpbnB1dCBpcyBzZXQKLQlwcml2YXRlIE1hcDxPYmplY3QsIE9iamVjdD4gY2hpbGRVSVBhcmVudE1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCS8vIGFkZCBzdGFuZGFyZCBjYXRlZ29yaWVzIFVJIGZvbGRlcnMgYXMgYXBwcm9wcmlhdGUKLQkJCURpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGRpc2NpcGxpbmVzID0gKERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KTsKLQkJCWlmIChkaXNjaXBsaW5lcyAhPSBudWxsICYmICFkaXNjaXBsaW5lcy5nZXRDaGlsZHJlbihkaXNjaXBsaW5lcykuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKGRpc2NpcGxpbmVzKTsKLQkJCX0KLQkJCURvbWFpbnNJdGVtUHJvdmlkZXIgZG9tYWlucyA9IChEb21haW5zSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0RG9tYWluc0l0ZW1Qcm92aWRlcigoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpOwotCQkJaWYgKGRvbWFpbnMgIT0gbnVsbCAmJiAhZG9tYWlucy5nZXRDaGlsZHJlbihkb21haW5zKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZG9tYWlucyk7Ci0JCQl9Ci0JCQlXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyIHdwVHlwZXMgPSAoV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcilUbmdVdGlsLmdldFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KTsKLQkJCWlmICh3cFR5cGVzICE9IG51bGwgJiYgIXdwVHlwZXMuZ2V0Q2hpbGRyZW4od3BUeXBlcykuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHdwVHlwZXMpOwotCQkJfQotCQkJUm9sZVNldHNJdGVtUHJvdmlkZXIgcm9sZVNldHMgPSAoUm9sZVNldHNJdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXRSb2xlU2V0c0l0ZW1Qcm92aWRlcigoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpOwotCQkJaWYgKHJvbGVTZXRzICE9IG51bGwgJiYgIXJvbGVTZXRzLmdldENoaWxkcmVuKHJvbGVTZXRzKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQocm9sZVNldHMpOwotCQkJfQotCQkJVG9vbHNJdGVtUHJvdmlkZXIgdG9vbHMgPSAoVG9vbHNJdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXRUb29sc0l0ZW1Qcm92aWRlcigoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpOwotCQkJaWYgKHRvb2xzICE9IG51bGwgJiYgIXRvb2xzLmdldENoaWxkcmVuKHRvb2xzKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQodG9vbHMpOwotCQkJfQotCQkJCi0JCQkvLyBhZGQgQ3VzdG9tQ2F0ZWdvcmllcyBwcm92aWRlcgotCQkJLy8gZ2V0IHJvb3QgQ0Mgb2YgcGx1Z2luCi0JCQlDdXN0b21DYXRlZ29yeSByb290Q0MgPSAoVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KSk7Ci0JCQlpZiAocm9vdENDICE9IG51bGwgJiYgIXJvb3RDQy5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHJvb3RDQyk7Ci0JCQl9Ci0vLwkJCWNoaWxkcmVuID0gdW53cmFwRlZXSVBzKGNoaWxkcmVuKTsKLS8vCQkJY2hpbGRyZW4gPSBmaWx0ZXJDYXRlZ29yeUVsZW1lbnRzKHBhcmVudEVsZW1lbnQsIGNoaWxkcmVuKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkpKTsKLQkJCWNoaWxkcmVuID0gZmlsdGVyUGx1Z2luKGNoaWxkcmVuKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSkpOwotLy8JCQljaGlsZHJlbiA9IHVud3JhcEZWV0lQcyhjaGlsZHJlbik7Ci0JCQljaGlsZHJlbiA9IGZpbHRlckNhdGVnb3J5RWxlbWVudHMocGFyZW50RWxlbWVudCwgY2hpbGRyZW4pOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSkpOwotLy8JCQljaGlsZHJlbiA9IHVud3JhcEZWV0lQcyhjaGlsZHJlbik7Ci0JCQljaGlsZHJlbiA9IGZpbHRlckNhdGVnb3J5RWxlbWVudHMocGFyZW50RWxlbWVudCwgY2hpbGRyZW4pOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdXBlci5nZXRFbGVtZW50cyhwYXJlbnRFbGVtZW50KSkpOwotCQkJY2hpbGRyZW4gPSBmaWx0ZXJQbHVnaW4oY2hpbGRyZW4pOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkpKTsKLQkJfQotCQljcmVhdGVDaGlsZFBhcmVudE1hcChwYXJlbnRFbGVtZW50LCBjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDaGlsZFBhcmVudE1hcChPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJLy8gaWYgdGhlIHBhcmVudCBpcyBhIFVJIGZvbGRlciwgbWFwIHRoZSBjaGlsZCB0byB0aGUgcGFyZW50Ci0JCQkvLyBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHBhcmVudCBsYXRlcgotCQkJLy8gaWYgKCAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkKLQkJCXsKLQkJCQljaGlsZFVJUGFyZW50TWFwLnB1dChjaGlsZCwgcGFyZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gZmlsdGVyUGx1Z2luKENvbGxlY3Rpb248T2JqZWN0PiBlbGVtZW50cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJLy8gZmlsdGVyIG91dCBwbHVnaW5zIHRoYXQgaGF2ZSBubyBDQydzCi0JCQkJaWYgKCFoYXNDaGlsZHJlbigoTWV0aG9kUGx1Z2luKWVsZW1lbnQpIHx8ICFjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gZmlsdGVyIG91dCBwbHVnaW4gcGFja2FnZXMgdGhhdCBoYXZlIG5vIHBsdWdpbnMgd2l0aCBDQydzCi0JCQkJaWYgKCFoYXNDaGlsZHJlbigoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcillbGVtZW50KSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gcmVtb3ZlICJDb25maWd1cmF0aW9ucyIgZm9sZGVyCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IGZpbHRlckNhdGVnb3J5RWxlbWVudHMoT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbjxPYmplY3Q+IGVsZW1lbnRzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkpIHsKLQkJCQkvLyByZW1vdmUgbm9uLUNvbnRlbnRDYXRlZ29yeQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLS8vCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IHVud3JhcEZWV0lQcyhDb2xsZWN0aW9uPE9iamVjdD4gZWxlbWVudHMpIHsKLS8vCQlDb2xsZWN0aW9uPE9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLS8vCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotLy8JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQlyZXN1bHQuYWRkKGdldEZpcnN0VHJlZUl0ZW1Gb3JDQygoQ3VzdG9tQ2F0ZWdvcnkpZWxlbWVudCkpOwotLy8JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLS8vCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0vLwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcikgewotLy8JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoY2hpbGRVSVBhcmVudE1hcC5jb250YWluc0tleShlbGVtZW50KSkgewotCQkJcmV0dXJuIGNoaWxkVUlQYXJlbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyB0cnkgdG8gZGV0ZXJtaW5lIHBhcmVudAotLy8JCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotLy8JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgJiYgCi0vLwkJCQkJZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotLy8JCQkJcmV0dXJuIExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbigoQ29udGVudENhdGVnb3J5KWVsZW1lbnQpOwotLy8JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQlwYXJlbnQgPSBnZXRGaXJzdFRyZWVJdGVtRm9yQ0MoKEN1c3RvbUNhdGVnb3J5KXBhcmVudCk7Ci0vLwkJCX0KLS8vCQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotLy8JCQkJcGFyZW50ID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gZ2V0VHJlZUl0ZW1zKE9iamVjdCBpdGVtKSB7Ci0JCUxpc3Q8T2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJLy8gZ2V0IElUcmVlQ29udGVudFByb3ZpZGVyIGFkYXBhdGVyCi0JCUxpc3Qgbm90aWZ5Q2hhbmdlZExpc3RlbmVycyA9IFRuZ1V0aWwuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycyhhZGFwdGVyRmFjdG9yeSwgaXRlbSk7Ci0JCWlmICghbm90aWZ5Q2hhbmdlZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub3RpZnlDaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYobGlzdGVuZXIgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLQkJCQkJCSYmIFRuZ1V0aWwudW53cmFwKGxpc3RlbmVyKSA9PSBpdGVtKSB7Ci0JCQkJCXJlc3VsdC5hZGQobGlzdGVuZXIpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdC5hZGQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCXN1cGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCWNoaWxkVUlQYXJlbnRNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKChub3RpZmljYXRpb24gaW5zdGFuY2VvZiBJVmlld2VyTm90aWZpY2F0aW9uKSkgewotCQkJZmluYWwgSVZpZXdlck5vdGlmaWNhdGlvbiB2bnQgPSAoSVZpZXdlck5vdGlmaWNhdGlvbikgbm90aWZpY2F0aW9uOwotCQkJZmluYWwgT2JqZWN0IGVsZW1lbnQgPSB2bnQuZ2V0RWxlbWVudCgpOwotCQkJZmluYWwgQ2hlY2tib3hUcmVlVmlld2VyIGN0cmwgPSAoKENoZWNrYm94VHJlZVZpZXdlcikgc3VwZXIudmlld2VyKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCXx8IHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKSkgewotCi0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljdHJsLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWNoaWxkVUlQYXJlbnRNYXAuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9DYXRlZ29yeUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRmNjc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogTGFiZWwgcHJvdmlkZXIgZm9yIEN1c3RvbSBDYXRlZ29yeSB2aWV3IG9mIGNvbmZpZ3VyYXRpb24gcGFnZQotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gY29udGVudFByb3ZpZGVyCi0JICovCi0JcHVibGljIENhdGVnb3J5TGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlRnJvbU9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldFRleHQgYnkgZm9yd2FyZGluZyBpdCB0bwotCSAqIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQgSUl0ZW1MYWJlbFByb3ZpZGVyLmdldFRleHR9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkKLQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jICE9IG51bGwpCi0JCQkJcmV0dXJuIHByb2MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJZWxzZQotCQkJCS8vIGlmIHByb2Nlc3MgaXMgbnVsbCwgcmV0dXJuIHByb2Nlc3Njb21wb25lbnQgbmFtZQotCQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbHVtbkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbHVtbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhOThmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db2x1bW5FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBNb2RlbHMgYSA8Y29sdW1uPiBlbGVtZW50IGluIHRoZSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciIKLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIENvbHVtbkVsZW1lbnQgewotCi0JLy8gcGx1Z2luIGJ1bmRsZQotCUJ1bmRsZSBidW5kbGU7Ci0JCi0JLy8gVGhlIGNvbHVtbiBJRC4KLQlwcml2YXRlIFN0cmluZyBpZDsKLQkKLQkvLyBUaGUgY29sdW1uIHdpZHRoLgotCXByaXZhdGUgaW50IHdpZHRoOwotCQotCS8vIFRoZSBjb2x1bW4gYWxpZ25tZW50Ci0JcHJpdmF0ZSBTdHJpbmcgYWxpZ25tZW50OwotCi0JLy8gVGhlIGNvbnRyaWJ1dG9yIGNsYXNzIGZvciB0aGUgY29sdW1uLgotCXByaXZhdGUgU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3M7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogCQkJICBJbnN0YWxsZWQgQnVuZGxlCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgY29sdW1uIElELgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIGNvbHVtbiAgICAgCi0JICogQHBhcmFtIGNvbnRyaWJ1dG9yQ2xhc3MKLQkgKiAgICAgICAgICAgIFRoZSBjb2x1bW4gY29udHJpYnV0b3IgY2xhc3MuCi0JICovCi0JcHVibGljIENvbHVtbkVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBpbnQgd2lkdGgsIFN0cmluZyBhbGlnbm1lbnQsIFN0cmluZyBjb250cmlidXRvckNsYXNzKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0JCXRoaXMuY29udHJpYnV0b3JDbGFzcyA9IGNvbnRyaWJ1dG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbHVtbiBJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiB3aWR0aAotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbHVtbiB3aWR0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIGFsaWdubWVudAotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbHVtbiBhbGlnbm1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWdubWVudCgpIHsKLQkJcmV0dXJuIGFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gY29udHJpYnV0b3IgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBUaGUgY29sdW1uIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udHJpYnV0b3JDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQlyZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzOWUwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbnRlbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJDaGVja2VkVHJlZVZpZXdlcjsKLQotcHVibGljIGNsYXNzIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvLyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHBhc3NlZCBpbiBBZGFwdGVyRmFjdG9yeQotCS8vIGl0IGNhbid0IGZpbmQgdGhlIGNvcnJlY3QgcGFyZW50IGZyb20gdGhlIGNoaWxkCi0JLy8gbmVlZCB0byBidWlsZCBhIG1hcCBvZiBjaGlsZCB0byBpdCdzIHBhcmVudCBpZiB0aGUgY2hpbGQgaXMgYSBVSQotCS8vIGZvbGRlcgotCS8vIGNsZWFyIHRoZSBtYXAgd2hlbiB0aGUgaW5wdXQgaXMgc2V0Ci0JTWFwPE9iamVjdCwgT2JqZWN0PiBjaGlsZFVJUGFyZW50TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0KLQlMaXN0PE9iamVjdD4gdWlGb2xkZXJzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0KLQlwdWJsaWMgTGlzdDxPYmplY3Q+IGdldFVJRWxlbWVudHMoKSB7Ci0JCXJldHVybiB1aUZvbGRlcnM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIoLy9Db25maWd1cmF0aW9uRmFjdG9yeSBjb25maWdGYWN0b3J5LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkvKiAsIGJvb2xlYW4gc2hvd01ldGhvZE1vZGVsT25seSAqLykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlPYmplY3RbXSBpdGVtcyA9IGdldFZhbGlkSXRlbXMocGFyZW50RWxlbWVudCwgc3VwZXIKLQkJCQkuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkpOwotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0KLQkJT2JqZWN0W10gaXRlbXMgPSBnZXRWYWxpZEl0ZW1zKGlucHV0RWxlbWVudCwgc3VwZXIKLQkJCQkuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KSk7Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVSUZvbGRlcihPYmplY3QgZSkgewotCQlyZXR1cm4gKGUgaW5zdGFuY2VvZiBDb250ZW50SXRlbVByb3ZpZGVyCi0JCQkJfHwgZSBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIgfHwKLQkJCQllIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcgotCQkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VUlUYXJnZXRFbGVtZW50KE9iamVjdCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBlKS5lQ29udGFpbmVyKCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBlOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50SXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb250ZW50SXRlbVByb3ZpZGVyKSBlKS5nZXRQYXJlbnQobnVsbCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBlKS5nZXRQYXJlbnQobnVsbCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCU9iamVjdCB0YXJnZXQgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpOwotCQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRWYWxpZEl0ZW1zKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQotCQlMaXN0PE9iamVjdD4gcGtncyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgZSA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50c1tpXSk7Ci0JCQlib29sZWFuIHVpRm9sZGVyID0gaXNVSUZvbGRlcihlKTsKLQkJCWlmICh1aUZvbGRlciB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQl8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcGtncy5hZGQoZSk7Ci0KLQkJCQlpZiAodWlGb2xkZXIpIHsKLQkJCQkJdWlGb2xkZXJzLmFkZChlKTsKLQkJCQl9Ci0KLQkJCQkvLyBpZiB0aGUgcGFyZW50IGlzIGEgVUkgZm9sZGVyLCBtYXAgdGhlIGNoaWxkIHRvIHRoZSBwYXJlbnQKLQkJCQkvLyBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHBhcmVudCBsYXRlcgotCQkJCS8vIGlmICggIShwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSApCi0JCQkJewotCQkJCQljaGlsZFVJUGFyZW50TWFwLnB1dChlLCBwYXJlbnQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGtncy50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoY2hpbGRVSVBhcmVudE1hcC5jb250YWluc0tleShlbGVtZW50KSkgewotCQkJcmV0dXJuIGNoaWxkVUlQYXJlbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJc3VwZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJY2hpbGRVSVBhcmVudE1hcC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAoKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIElWaWV3ZXJOb3RpZmljYXRpb24pKSB7Ci0JCQlmaW5hbCBJVmlld2VyTm90aWZpY2F0aW9uIHZudCA9IChJVmlld2VyTm90aWZpY2F0aW9uKSBub3RpZmljYXRpb247Ci0JCQlmaW5hbCBPYmplY3QgZWxlbWVudCA9IHZudC5nZXRFbGVtZW50KCk7Ci0JCQlmaW5hbCBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciBjdHJsID0gKChDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcikgc3VwZXIudmlld2VyKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCS8qfHwgdm50LmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQqLykpIHsKLQotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJY3RybC5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJdWlGb2xkZXJzLmNsZWFyKCk7Ci0JCWNoaWxkVUlQYXJlbnRNYXAuY2xlYXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWdQYWNrYWdlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTBkZjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5FbGVtZW50RGVwZW5kZW5jeUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIENvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCXByaXZhdGUgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgYWZQcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gY29udGVudFByb3ZpZGVyCi0JICovCi0JcHVibGljIENvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyKAotCQkJQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JCWFmUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0Rmlyc3RDaGlsZEVycm9yKE9iamVjdCBlKSB7Ci0JCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBudWxsOwotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihlKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG9iamVjdCA9IGNoaWxkcmVuW2ldOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQlyZXR1cm4gZ2V0Rmlyc3RDaGlsZEVycm9yKG9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yID0gY2xvc3VyZS5nZXRFcnJvcihvYmplY3QpOwotCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0SW1hZ2UgYnkgZm9yd2FyZGluZyBpdCB0bwotCSAqIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlIElJdGVtTGFiZWxQcm92aWRlci5nZXRJbWFnZX0KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0KLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQllcnJvciA9IGdldEZpcnN0Q2hpbGRFcnJvcihvYmplY3QpOwotCQkJfSBlbHNlIHsKLQkJCQllcnJvciA9IGNsb3N1cmUuZ2V0RXJyb3Iob2JqZWN0KTsKLQkJCX0KLQotCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCQlpZiAoZXJyb3IuaXNFcnJvcigpIHx8IGVycm9yLmlzQ2hpbGRFcnJvcigpKSB7Ci0JCQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCi0JCQkJCQkJLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsgCi0JCQkJfSBlbHNlIGlmIChlcnJvci5pc1dhcm5pbmcoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0JCQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCi0JCQkJCQkJLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBhZlByb3ZpZGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlRnJvbU9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldFRleHQgYnkgZm9yd2FyZGluZyBpdCB0bwotCSAqIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQgSUl0ZW1MYWJlbFByb3ZpZGVyLmdldFRleHR9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkKLQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jICE9IG51bGwpCi0JCQkJcmV0dXJuIHByb2MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJZWxzZQotCQkJCS8vIGlmIHByb2Nlc3MgaXMgbnVsbCwgcmV0dXJuIHByb2Nlc3Njb21wb25lbnQgbmFtZQotCQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBhZlByb3ZpZGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQkJYWZQcm92aWRlciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xvc3VyZShDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlKSB7Ci0JCXRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWd1cmF0aW9uRWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUzMTgyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWd1cmF0aW9uRWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ1ZpZXdQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29uZmlndXJhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiB7Ci0KLQlwdWJsaWMgTWFwPE9iamVjdCwgU3RyaW5nPiBnZXRQYWdlcyhNYXA8T2JqZWN0LCBTdHJpbmc+IHBhZ2VNYXAsCi0JCQlGb3JtRWRpdG9yIGVkaXRvciwgT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29uZmlndXJhdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29uZmlnVmlld1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHBhZ2VNYXA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWd1cmF0aW9uTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyYjA5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWd1cmF0aW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcgdHJlZSwKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbG9yUHJvdmlkZXIgewotCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCXB1YmxpYyBDb25maWd1cmF0aW9uTGFiZWxQcm92aWRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0SW1hZ2UgYnkgZm9yd2FyZGluZyBpdCB0byBhbgotCSAqIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlIElJdGVtTGFiZWxQcm92aWRlci5nZXRJbWFnZX0KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkvLyBieSBkZWZhdWx0LCByZXR1cm4gdGhlIGRlZmF1bHQgaW1hZ2UKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0VGV4dCBieSBmb3J3YXJkaW5nIGl0IHRvIGFuCi0JICogb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dCBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dH0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCWVsZW1lbnQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqZWN0LCBjb25maWcpOwotCQl9Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWVsZW1lbnQgPSAoKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJLmdldFZhbHVlKCk7Ci0JCX0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCX0KLQkJCi0JCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJbmFtZSA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQkJfQotCi0JCQkvLyBuYW1lID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXROYW1lKChNZXRob2RFbGVtZW50KW9iamVjdCwKLQkJCS8vIGNvbmZpZyk7Ci0JCX0KLQkJCi0JCUlXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSAoSVdvcmtiZW5jaEFkYXB0ZXIpIChvYmplY3QgaW5zdGFuY2VvZiBJV29ya2JlbmNoQWRhcHRlciA/Ci0JCQkJb2JqZWN0IDogKG9iamVjdCBpbnN0YW5jZW9mIElBZGFwdGFibGUgPyAoKElBZGFwdGFibGUpIG9iamVjdCkuZ2V0QWRhcHRlcihJV29ya2JlbmNoQWRhcHRlci5jbGFzcykgOiBudWxsKSk7Ci0JCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWwob2JqZWN0KTsKLQkJfQotCQkKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHJldHVybiB0aGUgZGVmYXVsdCBpbWFnZQotCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29uZmlnID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRGb3JlZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGlzU3VwcHJlc3NlZChlbGVtZW50KSkgewotCQkJcmV0dXJuIENvbG9ycy5TVVBSRVNTRURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQllbHNlIGlmIChpc0V4dGVybmFsKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCk7Ci0JCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYykuaXNTdXBwcmVzc2VkKGVsZW1lbnQpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJT2JqZWN0IHRvcCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0VG9wSXRlbSgpOwotCQkJaWYodG9wIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSB7Ci0JCQkJcmV0dXJuIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKChQcm9jZXNzKSB0b3ApLmlzU3VwcHJlc3NlZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEJhY2tncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQkvLyBsZXQgT1MgdGFrZSBjb250cm9sIG92ZXIgdHJlZSB3aWRnZXQgYmFja2dyb3VuZAotCQkvLyByYXRoZXIgdGhhbiBzZW5kaW5nIG9uZSBmaXhlZCBiYWNrZ3JvdW5kLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIjaXNFeHRlcm5hbChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGVsZW1lbnQpIHx8IFByb2Nlc3NVdGlsLmlzQ29udHJpYnV0ZWQoZWxlbWVudCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2dldEZvbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRm9udCBnZXRGb250KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KSkgewotCQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JCX0KLQkJZWxzZSBpZihQcm9jZXNzVXRpbC5pc0NvbnRyaWJ1dGVkKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gYm9sZEl0YWxpY0ZvbnQ7Ci0JCX0KLQkJcmV0dXJuIHJlZ3VsYXJGb250OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9EZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTU4NTAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSA8Q29sdW1uRWxlbWVudD4gZWxlbWVudHMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSA9ICJkZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9XSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9BTElHTk1FTlQgPSAiYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fREVGQVVMVF9XSURUSCA9IDIwOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb250YWlucyB0aGUgZWRpdG9yIGNvbHVtbiBwcm92aWRlcnMgbG9hZGVkIHZpYSB0aGUKLQkvLyAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciIgZXh0ZW5zaW9uIHBvaW50LgotCXByaXZhdGUgQXJyYXlMaXN0IGNvbHVtblByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vCSBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIGluc3RhbmNlID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgY29sdW1uIHByb3ZpZGVycwotCSAqIAotCSAqIEByZXR1cm4gYWxsIHRoZSBjb2x1bW4gcHJvdmlkZXJzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbHVtblByb3ZpZGVycygpIHsKLS8vCQlMaXN0IGNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJQ29sdW1uRWxlbWVudCBlbGVtZW50ID0gKENvbHVtbkVsZW1lbnQpIGNvbHVtblByb3ZpZGVycwotLy8JCQkJCS5nZXQoaSk7Ci0vLwkJCU9iamVjdCBjb250cmlidXRvckNsYXNzID0gbnVsbDsKLS8vCQkJdHJ5IHsKLS8vCQkJCWNvbnRyaWJ1dG9yQ2xhc3MgPSBlbGVtZW50LmdldENvbnRyaWJ1dG9yQ2xhc3MoKTsKLS8vCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJfQotLy8JCQljb2x1bW5zLmFkZChjb250cmlidXRvckNsYXNzKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGNvbHVtbnM7Ci0JCXJldHVybiBjb2x1bW5Qcm92aWRlcnM7Ci0JfQotCQotCS8qKgotCSAqIExvYWRzIHRoZSBjb25maWd1cmF0aW9uIHByb3ZpZGVycyBzcGVjaWZpZWQgdmlhIHRoZQotCSAqICJkZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRQcm92aWRlcnMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUNPTFVNTl9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSwKLQkJCQlDT0xVTU5fUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCi0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGlkID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlTdHJpbmcgd2lkdGhTdHIgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQ09MVU1OX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX1dJRFRIKTsKLQkJCQkJCWludCB3aWR0aCA9IHBhcnNlV2lkdGgod2lkdGhTdHIpOwotCQkJCQkJU3RyaW5nIGFsaWdubWVudCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9BTElHTk1FTlQpOwotCQkJCQkJU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQ09MVU1OX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0NMQVNTKTsgCi0JCQkJCQlDb2x1bW5FbGVtZW50IGVsZW1lbnQgPSBuZXcgQ29sdW1uRWxlbWVudChidW5kbGUsCi0JCQkJCQkJCWlkLCB3aWR0aCwgYWxpZ25tZW50LCBjb250cmlidXRvckNsYXNzKTsKLQkJCQkJCWNvbHVtblByb3ZpZGVycy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJCSJGYWlsZWQgdG8gbG9hZCBFZGl0b3IgY29sdW1uIFByb3ZpZGVyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VXaWR0aChTdHJpbmcgc3RyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHIpOwotCQl9Ci0JCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gQ09MVU1OX0RFRkFVTFRfV0lEVEg7Ci0JCX0JCQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0VkaXRvclBhZ2VFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FZGl0b3JQYWdlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmRhODdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0VkaXRvclBhZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBNb2RlbHMgYSA8ZWRpdG9yUGFnZT4gZWxlbWVudCBpbiB0aGUgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuRWRpdG9yUGFnZVByb3ZpZGVyIgotICogZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yUGFnZUVsZW1lbnQgewotCi0JLy8gcGx1Z2luIGJ1bmRsZQotCUJ1bmRsZSBidW5kbGU7Ci0JCi0JLy8gVGhlIHBhZ2UgSUQuCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JCi0JLy8gVGhlIHBhZ2UgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLy8gVGhlIGNvbnRyaWJ1dG9yIGNsYXNzIGZvciB0aGUgcGFnZS4KLQlwcml2YXRlIFN0cmluZyBjb250cmlidXRvckNsYXNzOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIAkJCSAgSW5zdGFsbGVkIEJ1bmRsZQotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIHBhZ2UgSUQuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlIG5hbWUuICAgICAgICAgICAgCi0JICogQHBhcmFtIGNvbnRyaWJ1dG9yQ2xhc3MKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqLwotCXB1YmxpYyBFZGl0b3JQYWdlRWxlbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udHJpYnV0b3JDbGFzcykgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmNvbnRyaWJ1dG9yQ2xhc3MgPSBjb250cmlidXRvckNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhZ2UgSUQuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFnZSBJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhZ2UgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHBhZ2UgY29udHJpYnV0b3IgY2xhc3MuCi0JICovCi0JcHVibGljIElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGdldENvbnRyaWJ1dG9yQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUNsYXNzIGNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhjb250cmlidXRvckNsYXNzKTsKLQkJcmV0dXJuIChJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiljbGF6ei5uZXdJbnN0YW5jZSgpOwkKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0V4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzAxNjQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0V4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzCi0JCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVZpZXdlclByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjgxZjMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0hpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXI7Ci0KLS8qKgotICogRmlsdGVyIGZvciB2aWV3ZXJzIG9mIGNvbmZpZ3VyYXRpb24gcGFnZS4KLSAqIElmIGhpZGVVbmNoZWNrZWQgaXMgc2V0LCBpdCB3aWxsIGZpbHRlciB1bmNoZWNrZWQgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBIaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkKLQlwcml2YXRlIENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIHZpZXdlcjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gaGlkZVVuY2hlY2tlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBIaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyKENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIHZpZXdlcikgewotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChoaWRlVW5jaGVja2VkICYmICFpc0NoZWNrZWQoZWxlbWVudCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSGlkZVVuY2hlY2tlZCgpIHsKLQkJcmV0dXJuIGhpZGVVbmNoZWNrZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdG9nZ2xlSGlkZVVuY2hlY2tlZCgpIHsKLQkJaGlkZVVuY2hlY2tlZCA9ICFoaWRlVW5jaGVja2VkOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNDaGVja2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCUxpc3Q8T2JqZWN0PiBjaGVja2VkSXRlbXMgPSBBcnJheXMuYXNMaXN0KHZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JCXJldHVybiBjaGVja2VkSXRlbXMuY29udGFpbnMoZWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0lDb250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYjQ3YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50UHJvdmlkZXJGYWN0b3J5IHsKLQlJQ29udGVudFByb3ZpZGVyIGNyZWF0ZVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBJVmlld1BhcnQgdmlldyk7Ci0JSUZpbHRlciBjcmVhdGVGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFZpZXdlciB2aWV3ZXIpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0lNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjQ5ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBiZSB1c2VkIGZvciBhbGwgcGFnZXMgYWRkZWQgdGhyb3VnaCBleHRlbnNpb24gcG9pbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiB7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgcGFnZXMgdG8gbmFtZXMuCi0JICogUGFnZXMgc2hvdWxkIGJlIENvbnRyb2wsIElGb3JtUGFnZSwgb3IgSUVkaXRvclBhcnQKLQkgKiBOYW1lcyBhcmUgdGhlIHBhcnROYW1lIChmb3IgdGhlIElFZGl0b3JQYXJ0IG9yIENvbnRyb2wgLS0gSUZvcm1QYWdlcyBkbyBub3QgbmVlZCB0byBwcm92aWRlIGEgbmFtZSBpbiB0aGUgbWFwKS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZU1hcCBtYXAgb2YgcGFnZXMgdG8gbmFtZXMKLQkgKiBAcGFyYW0gZWRpdG9yIGVkaXRvciB0aGF0IHBhZ2VzIGFyZSBhZGRlZCB0bwotCSAqIEBwYXJhbSBpbnB1dCBvYmplY3QgYmVpbmcgZWRpdGVkCi0JICogQHJldHVybiBhIG1hcAotCSAqICAKLQkgKi8KLQlwdWJsaWMgTWFwPE9iamVjdCxTdHJpbmc+IGdldFBhZ2VzKE1hcDxPYmplY3QsU3RyaW5nPiBwYWdlTWFwLCBGb3JtRWRpdG9yIGVkaXRvciwgT2JqZWN0IGlucHV0KTsKLQotCQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50RWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudEVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5NGE1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50RWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DaGVja2xpc3RJdGVtc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Db250ZW50RWxlbWVudEd1aWRhbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRpc2NpcGxpbmVUYXNrc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Eb21haW5EZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Eb21haW5Xb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJhY3RpY2VEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5QcmFjdGljZVJlZmVyZW5jZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZUNhdGVnb3JpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXREZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlU2V0R3JvdXBpbmdSb2xlU2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRSb2xlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlV29ya1Byb2R1Y3RzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tDYXRlZ29yaWVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrUm9sZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza1N0ZXBzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVG9vbERlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRvb2xUb29sTWVudG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLldvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gewotCi0JcHVibGljIE1hcDxPYmplY3QsIFN0cmluZz4gZ2V0UGFnZXMoTWFwPE9iamVjdCxTdHJpbmc+IHBhZ2VNYXAsIEZvcm1FZGl0b3IgZWRpdG9yLCBPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcGFnZU1hcC5wdXQobmV3IE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBSb2xlRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFJvbGVXb3JrUHJvZHVjdHNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFJvbGVDYXRlZ29yaWVzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBUYXNrRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFRhc2tTdGVwc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgVGFza1JvbGVzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBUYXNrV29ya1Byb2R1Y3RzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBUYXNrQ2F0ZWdvcmllc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJcGFnZU1hcC5wdXQobmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQlwYWdlTWFwLnB1dChuZXcgV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCX0KLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCWlmIChUbmdVdGlsLmlzQWxsb3dlZEF0dGFjaG1lbnRzKChHdWlkYW5jZSlpbnB1dCkpIHsKLQkJCQlwYWdlTWFwLnB1dChuZXcgR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQlwYWdlTWFwLnB1dChuZXcgUHJhY3RpY2VEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQkJcGFnZU1hcC5wdXQobmV3IFByYWN0aWNlUmVmZXJlbmNlc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJcGFnZU1hcC5wdXQobmV3IEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJCXBhZ2VNYXAucHV0KG5ldyBDaGVja2xpc3RJdGVtc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXBhZ2VNYXAucHV0KG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCX0KLQkJCWlmICghKGlucHV0IGluc3RhbmNlb2YgUHJhY3RpY2UpKQotCQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBEaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IERpc2NpcGxpbmVUYXNrc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJcGFnZU1hcC5wdXQobmV3IERpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBEb21haW5EZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgRG9tYWluV29ya1Byb2R1Y3RzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJcGFnZU1hcC5wdXQobmV3IFdvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBXb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJcGFnZU1hcC5wdXQobmV3IFJvbGVTZXREZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgUm9sZVNldFJvbGVzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJcGFnZU1hcC5wdXQobmV3IFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBSb2xlU2V0R3JvdXBpbmdSb2xlU2V0cyhlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBUb29sRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFRvb2xUb29sTWVudG9yc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcGFnZU1hcC5wdXQobmV3IEN1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IEN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcGFnZU1hcDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDhiNmU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRGVjb3JhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIExhYmVsIGRlY29yYXRvciBmb3IgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IgewotCXByaXZhdGUgc3RhdGljIElMYWJlbERlY29yYXRvciBkZWxlZ2F0ZURlY29yYXRvcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBJTGFiZWxEZWNvcmF0b3IgZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKSB7Ci0JCWlmIChkZWxlZ2F0ZURlY29yYXRvciA9PSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZURlY29yYXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlRGVjb3JhdG9yOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlUmVzb3VyY2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkvLyBkb24ndCBkZWNvcmF0ZSBpY29uIG9mIHByZWRlZmluZWQgZWxlbWVudHMgaW4gbGlicmFyeSB2aWV3IGIvYyBzb21lIG9mIHRoZW0gYXJlIHNob3duIGFzIFVJIGZvbGRlcgotCQkvLwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVV0aWwuZ2V0V29ya3NwYWNlUmVzb3VyY2UoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IoKSB7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVJbWFnZShvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50KSB7CQkKLQkJSVJlc291cmNlIHdzUmVzID0gZ2V0V29ya3NwYWNlUmVzb3VyY2UoZWxlbWVudCk7Ci0JCWlmKHdzUmVzICE9IG51bGwpIHsKLQkJCWltYWdlID0gZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5kZWNvcmF0ZUltYWdlKGltYWdlLCB3c1Jlcyk7Ci0JCX0KLQkJcmV0dXJuIGdldERlbGVnYXRlRGVjb3JhdG9yKCkuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXREZWxlZ2F0ZURlY29yYXRvcigpLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlJUmVzb3VyY2Ugd3NSZXMgPSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShlbGVtZW50KTsKLQkJaWYod3NSZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlRGVjb3JhdG9yKCkuaXNMYWJlbFByb3BlcnR5KHdzUmVzLCBwcm9wZXJ0eSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyRGVjb3JhdGlvbkNhY2hlKCkgewotCQlJRGVjb3JhdG9yTWFuYWdlciBkZWNvcmF0b3JNYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCk7Ci0JCWRlY29yYXRvck1hbmFnZXIudXBkYXRlKCJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTk3NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLk1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgaW1wbGVtZW50cwotCQlJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXkgPSBudWxsOwotCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT1JBVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQl0cnkgewotCQkJaWYoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuaXNJbnZhbGlkKGVsZW1lbnQpCi0vLwkJCQkJfHwgTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuaXNJbnZhbGlkKGVsZW1lbnQpCi0JCQkJCSkgewotCQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShnZXRFcnJvck92ZXJsYXkoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEVycm9yT3ZlcmxheSgpIHsKLQkJaWYob3ZlcmxheSA9PSBudWxsKSB7Ci0JCQlvdmVybGF5ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gb3ZlcmxheTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkYmU0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuSmF2YVVJTGFiZWxQcm92aWRlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgewotCQotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3QgZkxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkKLQlJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkKLQlwcml2YXRlIEFycmF5TGlzdDxJTGFiZWxEZWNvcmF0b3I+IGZMYWJlbERlY29yYXRvcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmVsIHByb3ZpZGVyIHdpdGggZGVmYXVsdCBmbGFncy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlcigpIHsKLQkJZkxhYmVsRGVjb3JhdG9ycz0gbnVsbDsgCi0JfQotCQotCS8qKgotCSAqIEFkZHMgYSBkZWNvcmF0b3IgdG8gdGhlIGxhYmVsIHByb3ZpZGVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGFiZWxEZWNvcmF0b3IoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyA9PSBudWxsKSB7Ci0JCQlmTGFiZWxEZWNvcmF0b3JzPSBuZXcgQXJyYXlMaXN0PElMYWJlbERlY29yYXRvcj4oMik7Ci0JCX0KLQkJZkxhYmVsRGVjb3JhdG9ycy5hZGQoZGVjb3JhdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwgJiYgaW1hZ2UgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQlpbWFnZT0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRJbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSByZXN1bHQ9IGZMYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQlyZXR1cm4gZGVjb3JhdGVJbWFnZShyZXN1bHQsIGVsZW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZkxhYmVsRGVjb3JhdG9ycy5zaXplKCk7IGkrKykgewotCQkJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3I9IChJTGFiZWxEZWNvcmF0b3IpIGZMYWJlbERlY29yYXRvcnMuZ2V0KGkpOwotCQkJCXRleHQ9IGRlY29yYXRvci5kZWNvcmF0ZVRleHQodGV4dCwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlTdHJpbmcgcmVzdWx0PSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCQlyZXR1cm4gZGVjb3JhdGVUZXh0KHJlc3VsdCwgZWxlbWVudCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZkxhYmVsRGVjb3JhdG9ycy5zaXplKCk7IGkrKykgewotCQkJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3I9IChJTGFiZWxEZWNvcmF0b3IpIGZMYWJlbERlY29yYXRvcnMuZ2V0KGkpOwotCQkJCWRlY29yYXRvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmTGFiZWxEZWNvcmF0b3JzPSBudWxsOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQlkZWNvcmF0b3IuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gdHJ1ZTsJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZkxhYmVsRGVjb3JhdG9ycy5zaXplKCk7IGkrKykgewotCQkJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3I9IChJTGFiZWxEZWNvcmF0b3IpIGZMYWJlbERlY29yYXRvcnMuZ2V0KGkpOwotCQkJCWRlY29yYXRvci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTGFiZWxEZWNvcmF0b3JbXSBnZXREZWNvcmF0b3JzKGJvb2xlYW4gZXJyb3J0aWNrLCBJTGFiZWxEZWNvcmF0b3IgZXh0cmEpIHsKLQkJaWYgKGVycm9ydGljaykgewotCQkJaWYgKGV4dHJhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IElMYWJlbERlY29yYXRvcltdIHt9OwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IElMYWJlbERlY29yYXRvcltdIHsgZXh0cmEgfTsKLQkJCX0KLQkJfQotCQlpZiAoZXh0cmEgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJTGFiZWxEZWNvcmF0b3JbXSB7IGV4dHJhIH07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEZpcmVzIGEgbGFiZWwgcHJvdmlkZXIgY2hhbmdlZCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMKLSAgICAgKiBPbmx5IGxpc3RlbmVycyByZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcmUgbm90aWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgYSBsYWJlbCBwcm92aWRlciBjaGFuZ2VkIGV2ZW50Ci0gICAgICoKLSAgICAgKiBAc2VlIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIjbGFiZWxQcm92aWRlckNoYW5nZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoZmluYWwgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZmluYWwgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsID0gKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uZXIucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBsLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvYmxlbXNMYWJlbERlY29yYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvYmxlbXNMYWJlbERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjFjMzJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1Byb2JsZW1zTGFiZWxEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLklQcm9ibGVtQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JbWFnZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLk1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LnVpLlByb2JsZW1zTGFiZWxEZWNvcmF0b3IgCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvYmxlbXNMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzIElMYWJlbERlY29yYXRvciwgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCQotCS8qKgotCSAqIFRoaXMgaXMgYSBzcGVjaWFsIDxjb2RlPkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ8L2NvZGU+IGNhcnJ5aW5nIGFkZGl0aW9uYWwgCi0JICogaW5mb3JtYXRpb24gd2hldGhlciB0aGUgZXZlbnQgb3JpZ2lucyBmcm9tIGEgbWFrZXIgY2hhbmdlLgotCSAqIDxwPgotCSAqIDxjb2RlPlByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQ8L2NvZGU+cyBhcmUgb25seSBnZW5lcmF0ZWQgYnkgPGNvZGU+Ci0JICogUHJvYmxlbXNMYWJlbERlY29yYXRvcjwvY29kZT5zLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQ9IDFMOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGZNYXJrZXJDaGFuZ2U7Ci0KLQkJLyoqCi0JCSAqIE5vdGU6IFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50U291cmNlIHRoZSBiYXNlIGxhYmVsIHByb3ZpZGVyCi0JCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2UgdGhlIGNoYW5nZWQgcmVzb3VyY2VzCi0JCSAqIEBwYXJhbSBpc01hcmtlckNoYW5nZSA8Y29kZT50cnVlPGNvZGU+IGlmIHRoZSBjaGFuZ2UgaXMgYSBtYXJrZXIgY2hhbmdlOyBvdGhlcndpc2UKLQkJICogIDxjb2RlPmZhbHNlPC9jb2RlPiAKLQkJICovCi0JCXB1YmxpYyBQcm9ibGVtc0xhYmVsQ2hhbmdlZEV2ZW50KElCYXNlTGFiZWxQcm92aWRlciBldmVudFNvdXJjZSwgSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCQlzdXBlcihldmVudFNvdXJjZSwgY2hhbmdlZFJlc291cmNlKTsKLQkJCWZNYXJrZXJDaGFuZ2U9IGlzTWFya2VyQ2hhbmdlOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZXZlbnQgb3JpZ2lucyBmcm9tIG1hcmtlciBjaGFuZ2VzLiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gYW4gYW5ub3RhdGlvbiAKLQkJICogbW9kZWwgY2hhbmdlIGlzIHRoZSBvcmlnaW4uIEluIHRoaXMgY2FzZSB2aWV3ZXJzIG5vdCBkaXNwbGF5aW5nIHdvcmtpbmcgY29waWVzIGNhbiBpZ25vcmUgdGhlc2UgCi0JCSAqIGV2ZW50cy4KLQkJICogCi0JCSAqIEByZXR1cm4gaWYgdGhpcyBldmVudCBvcmlnaW5zIGZyb20gYSBtYXJrZXIgY2hhbmdlLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UoKSB7Ci0JCQlyZXR1cm4gZk1hcmtlckNoYW5nZTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SVElDS19FUlJPUj0gTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUjsJCi0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGZSZWdpc3RyeTsKLQlwcml2YXRlIGJvb2xlYW4gZlVzZU5ld1JlZ2lzdHJ5PSBmYWxzZTsKLQlwcml2YXRlIElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyOwotCQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb2JsZW1zTGFiZWxEZWNvcmF0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKCkgewotCQl0aGlzKG51bGwpOwotCQlmVXNlTmV3UmVnaXN0cnk9IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIE5vdGU6IFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSByZWdpc3RyeSBUaGUgcmVnaXN0cnkgdG8gdXNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgSmF2YSBwbHVnaW4ncwotCSAqICBpbWFnZSByZWdpc3RyeQotCSAqLwotCXB1YmxpYyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCWZSZWdpc3RyeT0gcmVnaXN0cnk7Ci0JCWZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgewotCQlpZiAoZlJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZSZWdpc3RyeT0gZlVzZU5ld1JlZ2lzdHJ5ID8gbmV3IEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgOiBBdXRob3JpbmdVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmUmVnaXN0cnk7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlVGV4dChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbERlY29yYXRvciNkZWNvcmF0ZUltYWdlKEltYWdlLCBPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBvYmopIHsKLQkJaW50IGFkb3JubWVudEZsYWdzPSBjb21wdXRlQWRvcm5tZW50RmxhZ3Mob2JqKTsKLQkJaWYgKGFkb3JubWVudEZsYWdzICE9IDApIHsKLQkJCUltYWdlRGVzY3JpcHRvciBiYXNlSW1hZ2U9IG5ldyBJbWFnZUltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCXJldHVybiBnZXRSZWdpc3RyeSgpLmdldChuZXcgTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvcihiYXNlSW1hZ2UsIGFkb3JubWVudEZsYWdzLCBuZXcgUG9pbnQoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KSkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBvYmogdGhlIGVsZW1lbnQgdG8gY29tcHV0ZSB0aGUgZmxhZ3MgZm9yCi0JICogCi0JICogQHJldHVybiB0aGUgYWRvcm5tZW50IGZsYWdzCi0JICovCi0JcHJvdGVjdGVkIGludCBjb21wdXRlQWRvcm5tZW50RmxhZ3MoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0RXJyb3JUaWNrc0Zyb21NYXJrZXJzKChNZXRob2RFbGVtZW50KSBvYmosIFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShvYmopLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gZ2V0RXJyb3JUaWNrc0Zyb21NYXJrZXJzKG51bGwsIChJUmVzb3VyY2UpIG9iaiwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLk1BUktFUl9OT1RfRk9VTkQpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCQotCQkJQXV0aG9yaW5nVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXByaXZhdGUgaW50IGdldEVycm9yVGlja3NGcm9tTWFya2VycyhNZXRob2RFbGVtZW50IGUsIElSZXNvdXJjZSByZXMsCi0JCQlpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlcyA9PSBudWxsIHx8ICFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBpbmZvID0gMDsKLQotCQlJTWFya2VyW10gbWFya2VycyA9IHJlcy5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsIGRlcHRoKTsKLQkJaWYgKG1hcmtlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aCAmJiAoaW5mbyAhPSBFUlJPUlRJQ0tfRVJST1IpOyBpKyspIHsKLQkJCQlJTWFya2VyIGN1cnIgPSBtYXJrZXJzW2ldOwotCQkJCWludCBwcmlvcml0eSA9IGN1cnIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCQlpZiAocHJpb3JpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9FUlJPUgotCQkJCQkJJiYgKGUgPT0gbnVsbCB8fCBlCi0JCQkJCQkJCS5nZXRHdWlkKCkKLQkJCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCQljdXJyCi0JCQkJCQkJCQkJCQkuZ2V0QXR0cmlidXRlKExpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLkdVSUQpKSkpIHsKLQkJCQkJaW5mbyA9IEVSUk9SVElDS19FUlJPUjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkucmVtb3ZlTGlzdGVuZXIoZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIpOwotCQkJZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI9IG51bGw7Ci0JCX0KLQkJaWYgKGZSZWdpc3RyeSAhPSBudWxsICYmIGZVc2VOZXdSZWdpc3RyeSkgewotCQkJZlJlZ2lzdHJ5LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJZkxpc3RlbmVycz0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQl9Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJaWYgKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPSBuZXcgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvYmxlbXNDaGFuZ2VkKElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpIHsKLQkJCQkJZmlyZVByb2JsZW1zQ2hhbmdlZChjaGFuZ2VkUmVzb3VyY2VzLCBpc01hcmtlckNoYW5nZSk7Ci0JCQkJfQotCQkJfTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLmFkZExpc3RlbmVyKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCX0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWlmIChmTGlzdGVuZXJzLmlzRW1wdHkoKSAmJiBmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkucmVtb3ZlTGlzdGVuZXIoZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIpOwotCQkJCWZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaXJlUHJvYmxlbXNDaGFuZ2VkKElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpIHsKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhZkxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCUxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQ9IG5ldyBQcm9ibGVtc0xhYmVsQ2hhbmdlZEV2ZW50KHRoaXMsIGNoYW5nZWRSZXNvdXJjZXMsIGlzTWFya2VyQ2hhbmdlKTsKLQkJCU9iamVjdFtdIGxpc3RlbmVycz0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkubGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yI2RlY29yYXRlKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsgCi0JCWludCBhZG9ybm1lbnRGbGFncz0gY29tcHV0ZUFkb3JubWVudEZsYWdzKGVsZW1lbnQpOwotCQlpZiAoYWRvcm5tZW50RmxhZ3MgPT0gRVJST1JUSUNLX0VSUk9SKSB7Ci0JCQlkZWNvcmF0aW9uLmFkZE92ZXJsYXkoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfT1ZSX0VSUk9SKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTcyN2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1ZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUZvbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgcmVndWxhckZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgYm9sZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgaXRhbGljRm9udDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgYm9sZEl0YWxpY0ZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgc3RyaWtlb3V0Rm9udDsJCi0KLQlzdGF0aWMgewotCQlGb250IGRlZmF1bHRGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKTsKLQkJcmVndWxhckZvbnQgPSBkZWZhdWx0Rm9udDsKLQkJRm9udERhdGFbXSBmZHMgPSBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCWlmIChmZHMubGVuZ3RoID4gMCkgewotCQkJRm9udERhdGEgZmQgPSBmZHNbMF07Ci0JCQlpbnQgaCA9IGZkLmdldEhlaWdodCgpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlib2xkRm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgaCwgZmQuZ2V0U3R5bGUoKQotCQkJCQl8IFNXVC5CT0xEKTsKLQkJCWl0YWxpY0ZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIGgsIGZkLmdldFN0eWxlKCkKLQkJCQkJfCBTV1QuSVRBTElDKTsKLQkJCWJvbGRJdGFsaWNGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCBoLCBmZC5nZXRTdHlsZSgpCi0JCQkJCXwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBnZXRJdGFsaWNGb250KCkgewotCQlyZXR1cm4gaXRhbGljRm9udDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgZ2V0RGVmYXVsdEZvbnQoKSB7Ci0JCXJldHVybiByZWd1bGFyRm9udDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JCX0KLQkJcmV0dXJuIGJvbGRGb250OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNmYzZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZXh0ZW5zaW9uIHBvaW50IG1hbmFnZW1lbnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NGE2NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBSaWNoIFRleHQgY29udHJvbCB1c2VkIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFJpY2hUZXh0IGV4dGVuZHMgSVJpY2hUZXh0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0KEVPYmplY3QgbW9kYWxPYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJucyBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1vZGFsT2JqZWN0RmVhdHVyZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3RGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgTWV0aG9kUmljaFRleHQgd2l0aCB0aGUgZWRpdGVkIE1ldGhvZEVsZW1udCBhbmQgbmFtZSBvZiB0aGUgZmllbGQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGFiZWwgbGFiZWwpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmNTM5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBSaWNoIFRleHQgZWRpdG9yIHVzZWQgaW4gdGhlIE1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUmljaFRleHRFZGl0b3IgZXh0ZW5kcyBJTWV0aG9kUmljaFRleHQsIElSaWNoVGV4dEVkaXRvciB7Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgUmljaCBUZXh0IGVkaXRvciB0b29sIGJhciB3aXRoIGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgVGhlIFJpY2ggdGV4dCBlZGl0b3IgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKTsKLQkKLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBSaWNoIFRleHQgb3IgSFRNTCB0YWIuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICAwIGZvciB0aGUgUmljaCBUZXh0IHRhYiwgMSBmb3IgdGhlIEhUTUwgdGFiLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgaW5kZXgpOwkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9NZXRob2RSaWNoVGV4dENvbnRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvTWV0aG9kUmljaFRleHRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwM2RjMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9NZXRob2RSaWNoVGV4dENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dENvbnRleHQgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCXByaXZhdGUgaW50IHN0eWxlOwotCXByaXZhdGUgU3RyaW5nIGJhc2VQYXRoOwotCQotCXB1YmxpYyBNZXRob2RSaWNoVGV4dENvbnRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQkJdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0JCXJldHVybiBzdHlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShpbnQgc3R5bGUpIHsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKSB7Ci0JCXJldHVybiBiYXNlUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYXNlUGF0aChTdHJpbmcgYmFzZVBhdGgpIHsKLQkJdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGVmZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyByaWNoIHRleHQgZWRpdGluZyBzdXBwb3J0IGZvciB0aGUgZWRpdG9ycyBhbmQgUHJvcGVydGllcyB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0YmNmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyOwotCi0vKioKLSAqIEFjY2Vzc2libGUgbGlzdGVuZXIgd2hpbGUgYXV0aG9yaW5nIHRoZSBjb250ZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lciBpbXBsZW1lbnRzIEFjY2Vzc2libGVMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKFN0cmluZyBuYW1lKXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldERlc2NyaXB0aW9uKG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZXNjcmlwdGlvbihBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQllLnJlc3VsdCA9IHRoaXMuZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIjZ2V0SGVscChvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIjZ2V0S2V5Ym9hcmRTaG9ydGN1dChvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0S2V5Ym9hcmRTaG9ydGN1dChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldE5hbWUob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsJCQotCQllLnJlc3VsdCA9IHRoaXMubmFtZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogU2V0IG5hbWUgZm9yIHRoZSBsaXN0ZW5lcgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSl7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTE5MjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkV4dGVuc2lvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLklNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5JQ29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5NYXJrZXJWaWV3VXRpbDsKLQotLyoqCi0gKiAgSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBDb25maWd1cmF0aW9uIGVycm9yIG1hcmtlcnMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFya2VySGVscGVyIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb25maWd1cmF0aW9uTWFya2VySGVscGVyIElOU1RBTkNFID0gbmV3IENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VSUk9SX0lEID0gImVycm9ySUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT05GSUdfR1VJRCA9ICJjb25maWdHdWlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVTU0FHRV9JRCA9ICJtZXNzYWdlSWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9FUlJPUl9FTEVNRU5UX0dVSUQgPSAiZWxlbWVudEd1aWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVVTRV9FTEVNRU5UX0dVSUQgPSAiY2F1c2VHdWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWFya2VyIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCQotLy8JcHJpdmF0ZSBNYXA8RWxlbWVudERlcGVuZGVuY3lFcnJvciwgSU1hcmtlcj4gZXJyb3JNYXJrZXJNYXAgPSBuZXcgSGFzaE1hcDxFbGVtZW50RGVwZW5kZW5jeUVycm9yLCBJTWFya2VyPigpOwotCQotCS8vIHByaXZhdGUgY29uc3RydWN0b3IKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIoKSB7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRhaW5lck1hcCBleHRlbmRzIEhhc2hNYXA8T2JqZWN0LCBJbnRlZ2VyPiB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBDb250YWluZXJNYXAoKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdE1hcCgpOwotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQlpbml0TWFwKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0JCQkJCi0JCQl9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluaXRNYXAoKSB7Ci0JCQljbGVhcigpOwotCQkJCi0JCQkvLyBmaWxsIHRoaXMgc2V0IHdpdGggY29udGFpbmVycyBvZiBtYXJrZWQgb2JqZWN0cwotCQkJLy8KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJaWYobGliICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcmogPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5maW5kUHJvamVjdChsaWIpOwotCQkJCWlmKHByaiAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHByai5maW5kTWFya2VycyhJTlNUQU5DRS5nZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoQVRUUl9DT05GSUdfR1VJRCk7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyByZW1vdmUgaXRzIGNvbnRhaW5lcnMgZnJvbSBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCW1hcmtDb250YWluZXJzKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbmNyZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQkJSW50ZWdlciBjb3VudDsKLQkJCWlmIChjb250YWluc0tleShvYmplY3QpKSB7Ci0JCQkJY291bnQgPSBnZXQob2JqZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJY291bnQgPSBuZXcgSW50ZWdlcigwKTsKLQkJCX0KLQkJCWNvdW50Kys7Ci0JCQlwdXQob2JqZWN0LCBjb3VudCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZGVjcmVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChjb250YWluc0tleShvYmplY3QpKSB7Ci0JCQkJSW50ZWdlciBjb3VudCA9IGdldChvYmplY3QpOwotCQkJCWlmIChjb3VudCA9PSAxKSB7Ci0JCQkJCS8vIHJlbW92ZSBvYmplY3QKLQkJCQkJcmVtb3ZlKG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY291bnQtLTsKLQkJCQkJcHV0KG9iamVjdCwgY291bnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIG1hcmtDb250YWluZXJzKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJZm9yKEVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7IGNvbnRhaW5lciAhPSBudWxsOyBjb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpKSB7Ci0JCQkJaW5jcmVtZW50KGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdW5tYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWRlY3JlbWVudChjb250YWluZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENvbnRhaW5lck1hcCBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzID0gbmV3IENvbnRhaW5lck1hcCgpOwkKLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlcklEKCkgewotCQlyZXR1cm4gTUFSS0VSX0lEOwotCX0KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyI2dldEZpbGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZShVUkkgdXJpKSB7Ci0JCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIChJRmlsZSkgRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbih1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuc2NoZW1lKCk7Ci0JICAgIGlmICgicGxhdGZvcm0iLmVxdWFscyhzY2hlbWUpICYmIHVyaS5zZWdtZW50Q291bnQoKSA+IDEgJiYgInJlc291cmNlIi5lcXVhbHModXJpLnNlZ21lbnQoMCkpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgewotCSAgICAgIFN0cmluZ0J1ZmZlciBwbGF0Zm9ybVJlc291cmNlUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkgICAgICBmb3IgKGludCBqID0gMSwgc2l6ZSA9IHVyaS5zZWdtZW50Q291bnQoKTsgaiA8IHNpemU7ICsraikKLQkgICAgICB7Ci0JICAgICAgICBwbGF0Zm9ybVJlc291cmNlUGF0aC5hcHBlbmQoJy8nKTsKLQkgICAgICAgIHBsYXRmb3JtUmVzb3VyY2VQYXRoLmFwcGVuZChVUkkuZGVjb2RlKHVyaS5zZWdtZW50KGopKSk7Ci0JICAgICAgfQotCSAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgocGxhdGZvcm1SZXNvdXJjZVBhdGgudG9TdHJpbmcoKSkpOwotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQkJCi0JLyoqCi0JICogVXNlZCBieSBkZWNvcmF0b3JzIHRvIGRldGVybWluZSB0byBwdXQgYW4gZXJyb3IgdGljayBvbiB0aGUgT2JqZWN0Ci0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZhbGlkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcilvYmplY3QpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmKGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCWlmIChJTlNUQU5DRS5oYXNNYXJrZXJzKChNZXRob2RDb25maWd1cmF0aW9uKW9iaikpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCWlmIChJTlNUQU5DRS5oYXNNYXJrZXJzKChNZXRob2RDb25maWd1cmF0aW9uKW9iamVjdCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvYmplY3QpOwotCX0KLQkJICAgIAotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU1hcmtlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotICAgIAl0cnkgewotCSAgICAJSU1hcmtlciBtYXJrZXIgPSBnZXRNYXJrZXIoY29uZmlnLCBlcnJvcik7Ci0JICAgIAlpZiAobWFya2VyICE9IG51bGwpIHsKLQkgICAgCQltYXJrZXIuZGVsZXRlKCk7Ci0JICAgIAkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy51bm1hcmtDb250YWluZXJzKGNvbmZpZyk7Ci0JICAgIAl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0gICAgfQotCQotICAgIHB1YmxpYyBJTWFya2VyIGNyZWF0ZU1hcmtlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotLy8gICAgCWlmIChlcnJvci5nZXRFcnJvck1ldGhvZEVsZW1lbnQoKSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vICAgIAlpZiAoZXJyb3IuZ2V0Q2F1c2VNZXRob2RFbGVtZW50KCkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgCQotICAgIAlJTWFya2VyIGV4aXN0aW5nTWFya2VyID0gZ2V0TWFya2VyKGNvbmZpZywgZXJyb3IpOwotICAgIAlpZiAoZXhpc3RpbmdNYXJrZXIgIT0gbnVsbCkgewotICAgIAkJYWRqdXN0TWFya2VyKGV4aXN0aW5nTWFya2VyLCBjb25maWcsIGVycm9yKTsKLSAgICAJCXJldHVybiBleGlzdGluZ01hcmtlcjsKLSAgICAJfQotICAgIAl0cnkgewotCSAgICAJSVJlc291cmNlIHJlc291cmNlID0gZ2V0SVJlc291cmNlKGNvbmZpZyk7Ci0JICAgIAlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCSAgICAJCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKGdldE1hcmtlcklEKCkpOwotCSAgICAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSURFLkVESVRPUl9JRF9BVFRSLCAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJCWFkanVzdE1hcmtlcihtYXJrZXIsIGNvbmZpZywgZXJyb3IpOwotCSAgICAJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMubWFya0NvbnRhaW5lcnMoY29uZmlnKTsKLQkgICAgCQlyZXR1cm4gbWFya2VyOwotCSAgICAJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRqdXN0TWFya2VyKElNYXJrZXIgbWFya2VyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotICAgIAlpZiAoY29uZmlnID09IG51bGwgfHwgZXJyb3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgIAl0cnkgewotICAgICAgIAkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0gICAgICAgCQkJLy8gdHJ5IHRvIGZpbmQgbWFya2VyCi0gICAgICAgCQkJbWFya2VyID0gZ2V0TWFya2VyKGNvbmZpZywgZXJyb3IpOwotICAgICAgIAkJfQotICAgICAgIAkJaWYgKG1hcmtlciA9PSBudWxsKSByZXR1cm47Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIGVycm9yLmdldFNldmVyaXR5KCkpOwotCSAgICAJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKGVycm9yKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgMCk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKEFUVFJfQ09ORklHX0dVSUQsIGNvbmZpZy5nZXRHdWlkKCkpOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRSX0VSUk9SX0lELCBlcnJvci5nZXRJZCgpKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoQVRUUl9NRVNTQUdFX0lELCBlcnJvci5nZXRNZXNzYWdlSWQoKSk7Ci0JCQkKLQkgICAgCWlmIChlcnJvci5nZXRFcnJvck1ldGhvZEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKEFUVFJfRVJST1JfRUxFTUVOVF9HVUlELCBlcnJvci5nZXRFcnJvck1ldGhvZEVsZW1lbnQoKS5nZXRHdWlkKCkpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoTWFya2VyVmlld1V0aWwuTkFNRV9BVFRSSUJVVEUsIGVycm9yLmdldEVycm9yTWV0aG9kRWxlbWVudCgpLmdldE5hbWUoKSk7Ci0JICAgIAl9Ci0JICAgIAlpZiAoZXJyb3IuZ2V0Q2F1c2VNZXRob2RFbGVtZW50KCkgIT0gbnVsbCkgewotCSAgICAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoQVRUUl9DQVVTRV9FTEVNRU5UX0dVSUQsIGVycm9yLmdldENhdXNlTWV0aG9kRWxlbWVudCgpLmdldEd1aWQoKSk7Ci0JICAgIAl9Ci0JICAgIAkKLQkJCUlNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciBhdHRBZGRlciA9IEV4dGVuc2lvbkhlbHBlci5nZXRNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlcigpOwotCQkJaWYgKGF0dEFkZGVyICE9IG51bGwpIHsKLQkJCQlhdHRBZGRlci5hZGRBZGR0aW9uYWxBdHRyaWJ1dGVzKG1hcmtlciwgZXJyb3IpOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0gICB9Ci0gICAgCQotICAgIHB1YmxpYyBib29sZWFuIGhhc01hcmtlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotCQlpZiAoZ2V0TWFya2VyKGNvbmZpZywgZXJyb3IpICE9IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0gICAJCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhIG1ha2VyIHdpdGggaWQgZXF1YWxzIHRvIHRoZSByZXR1cm4gb2Yge0BsaW5rICNnZXRNYXJrZXJJRCgpfSAgICAgICAgICAgICAgCi0gICAgICogaXMgYXZhaWxhYmxlIGluIHRoZSBJUmVzb3VyY2UgY29tcHV0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICogQHBhcmFtIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICogQHJldHVybiBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTWFya2VycyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgIAlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRJUmVzb3VyY2UoY29uZmlnKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgCXRyeSB7Ci0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJcmV0dXJuIG1hcmtlcnMubGVuZ3RoID4gMDsKLQkgIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElNYXJrZXIgZ2V0TWFya2VyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0gICAgCWlmIChjb25maWcgPT0gbnVsbCB8fCBlcnJvciA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAl0cnkgewotCSAgICAJSVJlc291cmNlIHJlc291cmNlID0gZ2V0SVJlc291cmNlKGNvbmZpZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIG1hcmtlckVycm9ySWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVFJfRVJST1JfSUQpOwotCQkJCQlpZiAoZXJyb3IuZ2V0SWQoKS5lcXVhbHMobWFya2VyRXJyb3JJZCkpIHsKLQkJCQkJCXJldHVybiBtYXJrZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JICAgICAgICB9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLSAgICAJcmV0dXJuIGVycm9yLmdldEVycm9yTWVzc2FnZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElSZXNvdXJjZSBnZXRJUmVzb3VyY2UoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb25maWcuZVJlc291cmNlKCk7Ci0gICAgICAgIFVSSSB1cmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLSAgICAgICAgdXJpID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLSAgICAgICAgcmV0dXJuIGdldEZpbGUodXJpKTsKLQotICAgIH0KLQkKLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWcoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJU3RyaW5nIGNvbmZpZ0d1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVFJfQ09ORklHX0dVSUQpOwotCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGNvbmZpZ0d1aWQpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJcmV0dXJuIChNZXRob2RDb25maWd1cmF0aW9uKWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFcnJvck1ldGhvZEVsZW1lbnQoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJU3RyaW5nIGVycm9yR3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoQVRUUl9FUlJPUl9FTEVNRU5UX0dVSUQpOwotCQkJaWYgKGVycm9yR3VpZCAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGVycm9yR3VpZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCllOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0Q2F1c2VNZXRob2RFbGVtZW50KElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyBjYXVzZUd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVFJfQ0FVU0VfRUxFTUVOVF9HVUlEKTsKLQkJCWlmIChjYXVzZUd1aWQgIT0gbnVsbCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChjYXVzZUd1aWQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjMjY1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsKLQotLyoqCi0gKiAgTWFya2VyUmVzb2x1dGlvbiBmb3IgQ29uZmlndXJhdGlvbiBlcnJvcnMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbiBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uIHsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZXJyb3JFbGVtZW50OwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgY2F1c2VFbGVtZW50OwotCi0JcHVibGljIENvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBNZXRob2RFbGVtZW50IGVycm9yRWxlbWVudCwgTWV0aG9kRWxlbWVudCBjYXVzZUVsZW1lbnQpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuZXJyb3JFbGVtZW50ID0gZXJyb3JFbGVtZW50OwotCQl0aGlzLmNhdXNlRWxlbWVudCA9IGNhdXNlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVzb2x2ZU1pc3NpbmdSZWZlcmVuY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJxdWljayBmaXggbWUiKTsKLQkJdHJ5IHsKLQkJCSAgIC8vIGdldCB0aGUgbWFya2VyIHJlc291cmNlIGZpbGUKLQkgICAgICAgIGlmICgobWFya2VyLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkpIHsKLQkgICAgICAKLQkgICAgICAgIAlJRmlsZSBmaWxlID0gKElGaWxlKSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLQkgICAgICAgIAkKLQkgICAgICAgIAlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCSAgICAgICAgCU1ldGhvZEVsZW1lbnQgY29uZmlnID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQoZmlsZSwgcmVzb3VyY2VTZXQpOwotCSAgICAgICAgCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5maW5kRWRpdG9yKGNvbmZpZyk7Ci0JICAgICAgICAJaWYgKCBlZGl0b3IgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRWRpdG9yICkgewotCSAgICAgICAgCQkoKENvbmZpZ3VyYXRpb25FZGl0b3IpZWRpdG9yKS5kb1F1aWNrRml4KG1hcmtlcik7Ci0JICAgICAgICAJfQotCSAgICAgICAgCQotCSAgICAgICAgfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXggKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0gICAgICAgIAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5NmQ2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yOwotCi0vKioKLSAqIEdlbmVyYXRlcyBDb25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbidzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWFya2VyUmVzb2x1dGlvbltdIEVNUFRZX1JFU09MVVRJT05TID0gbmV3IElNYXJrZXJSZXNvbHV0aW9uWzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBDb25maWd1cmF0aW9uTWFya2VySGVscGVyLklOU1RBTkNFOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IjZ2V0UmVzb2x1dGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG1hcmtlckhlbHBlci5nZXRDb25maWcobWFya2VyKTsKLQkJTWV0aG9kRWxlbWVudCBlcnJvckVsZW1lbnQgPSBtYXJrZXJIZWxwZXIuZ2V0RXJyb3JNZXRob2RFbGVtZW50KG1hcmtlcik7Ci0JCU1ldGhvZEVsZW1lbnQgY2F1c2VFbGVtZW50ID0gbWFya2VySGVscGVyLmdldENhdXNlTWV0aG9kRWxlbWVudChtYXJrZXIpOwotCQl0cnkgewotCQkJCi0JCQkvLyBjcmVhdGUgTWFya2VyUmVzb2x1dGlvbnMKLQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7bmV3IENvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uKGNvbmZpZywgZXJyb3JFbGVtZW50LCBjYXVzZUVsZW1lbnQpfTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfUkVTT0xVVElPTlM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0VkaXRvcnNDb250ZXh0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvRWRpdG9yc0NvbnRleHRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwODcyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvRWRpdG9yc0NvbnRleHRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRWRpdG9ycyBjb250ZXh0IGhlbHBlcgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JzQ29udGV4dEhlbHBlciB7Ci0KLQkvKioKLQkgKiBTZXQgY29udGV4dCBoZWxwIGZvciBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSB1aUNvbXBvc2l0ZQotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVscChDb250cm9sIHVpQ29tcG9zaXRlLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfUk9MRV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9UQVNLX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1dPUktfUFJPRFVDVF9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfR1VJREFOQ0VfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRElTQ0lQTElORV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRElTQ0lQTElORV9HUk9VUElOR19DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRG9tYWluKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RPTUFJTl9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfV09SS19QUk9EVUNUX1RZUEVfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfUk9MRV9TRVRfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1JPTFNFX1NFVF9HUk9VUElOR19DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVG9vbCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9UT09MX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9DVVNUT01fQ0FURUdPUllfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlBMVUdJTl9FRElUT1JfREVTQ1JJUFRJT05fQUxMX0NPTlRFWFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09OVEVOVF9QQUNLQUdFX0VESVRPUl9BTExfQ09OVEVYVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fRURJVE9SX0FMTF9DT05URVhUKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBTZXQgY29udGV4dCBoZWxwIGZvciBwcm9jZXNzIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdWlDb21wb3NpdGUKLQkgKiBAcGFyYW0gcHJvY1R5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVscChDb250cm9sIHVpQ29tcG9zaXRlLCBTdHJpbmcgcHJvY1R5cGUpIHsKLQkJaWYgKChwcm9jVHlwZSAhPSBudWxsICYmIHByb2NUeXBlCi0JCQkJLmVxdWFsc0lnbm9yZUNhc2UoImNhcGFiaWxpdHkgcGF0dGVybiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9DUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChwcm9jVHlwZSAhPSBudWxsICYmIHByb2NUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImRlbGl2ZXJ5IHByb2Nlc3MiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRFBfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzhjMTk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24uRWNsaXBzZVJlc291cmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbnRlbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciBleHRlbmRzIEVjbGlwc2VSZXNvdXJjZXNVdGlsIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciBJTlNUQU5DRSA9IG5ldyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSUQgPSAiZ3VpZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgSVBhcmVudFByb3ZpZGVyIHsKLQkJZmluYWwgSVBhcmVudFByb3ZpZGVyIGNvbnRhaW5lclByb3ZpZGVyID0gbmV3IElQYXJlbnRQcm92aWRlcigpIHsKLQotCQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UGFyZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oKChFT2JqZWN0KW9iamVjdCkuZUNvbnRhaW5lcigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlmaW5hbCBJUGFyZW50UHJvdmlkZXIgcGFyZW50Q3VzdG9tQ2F0ZWdvcnlQcm92aWRlciA9IG5ldyBJUGFyZW50UHJvdmlkZXIoKSB7Ci0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFBhcmVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSlvYmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCWZpbmFsIElQYXJlbnRQcm92aWRlciBwYXJlbnRTdGFuZGFyZENhdGVnb3J5UHJvdmlkZXIgPSBuZXcgSVBhcmVudFByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRQYXJlbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBvYmplY3Q7Ci0JCQkJCUxpc3QgcGFyZW50RGlzY2lwbGluZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lKGRpc2NpcGxpbmUpOwotCQkJCQlMaXN0IGRpc2NpcGxpbmVHcm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKGRpc2NpcGxpbmUpOwotCQkJCQlpZighcGFyZW50RGlzY2lwbGluZXMuaXNFbXB0eSgpICYmICFkaXNjaXBsaW5lR3JvdXBpbmdzLmlzRW1wdHkoKSkgewotCQkJCQkJQ29sbGVjdGlvbjxPYmplY3Q+IHBhcmVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oZGlzY2lwbGluZUdyb3VwaW5ncyk7Ci0JCQkJCQlwYXJlbnRzLmFkZEFsbChwYXJlbnREaXNjaXBsaW5lcyk7Ci0JCQkJCQlyZXR1cm4gcGFyZW50czsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBwYXJlbnREaXNjaXBsaW5lcy5pc0VtcHR5KCkgPyBkaXNjaXBsaW5lR3JvdXBpbmdzIDogcGFyZW50RGlzY2lwbGluZXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KSBvYmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCUNvbGxlY3Rpb248Pz4gZ2V0UGFyZW50cyhPYmplY3Qgb2JqZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXJyb3JDYWxjdWxhdG9yIGV4dGVuZHMgSGFzaE1hcDxNZXRob2RQbHVnaW4sIFNldDxNZXRob2RFbGVtZW50Pj4gewkJCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBFcnJvckNhbGN1bGF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdGlhbGl6ZSgpOwotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQlpbml0aWFsaXplKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdGlhbGl6ZSgpOwotCQkJCX0JCQkJCi0JCQl9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQljbGVhcigpOwotCQkJCi0JCQkvLyBmaWxsIHRoaXMgc2V0IHdpdGggY29udGFpbmVycyBvZiBtYXJrZWQgb2JqZWN0cwotCQkJLy8KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJaWYobGliICE9IG51bGwpIHsKLQkJCQlJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCXRyeSB7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gd3NSb290LmZpbmRNYXJrZXJzKElOU1RBTkNFLmdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJCWlmKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQllID0gKE1ldGhvZEVsZW1lbnQpIFBlcnNpc3RlbmNlVXRpbC5yZXNvbHZlKGUsCi0JCQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gYWRkIHRoZSBlbGVtZW50IHRvIHRoaXMgc2V0Ci0JCQkJCQkJLy8KLQkJCQkJCQlhZGRFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkRXJyb3IoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQlpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJCVNldDxNZXRob2RFbGVtZW50PiBlbGVtZW50cyA9IGdldChwbHVnaW4pOwotCQkJCWlmKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCQkJZWxlbWVudHMgPSBuZXcgSGFzaFNldDxNZXRob2RFbGVtZW50PigpOwotCQkJCQlwdXQocGx1Z2luLCBlbGVtZW50cyk7Ci0JCQkJfQotCQkJCWVsZW1lbnRzLmFkZChlKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlRXJyb3IoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQlpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJCVNldDxNZXRob2RFbGVtZW50PiBlbGVtZW50cyA9IGdldChwbHVnaW4pOwotCQkJCWlmKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMucmVtb3ZlKGUpOwotCQkJCQlpZihlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJCXJlbW92ZShwbHVnaW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQlpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJCVNldDxNZXRob2RFbGVtZW50PiBlbGVtZW50cyA9IGdldChwbHVnaW4pOwotCQkJCWlmKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJaWYoZWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0KLQkJCQkJLy8gY2hlY2sgaWYgZSBpcyBjb250YWluZXIgb2YgYW55IGVycm9yIGVsZW1lbnQKLQkJCQkJLy8KLQkJCQkJSGFzaFNldDxPYmplY3Q+IHByb2Nlc3NlZENoaWxkcmVuID0gbnVsbDsKLQkJCQkJZm9yIChNZXRob2RFbGVtZW50IG1lIDogZWxlbWVudHMpIHsKLQkJCQkJCWlmKFVtYVV0aWwuaXNDb250YWluZWRCeShtZSwgZSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWlmKG1lIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCQlpZihwcm9jZXNzZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJCQkJCXByb2Nlc3NlZENoaWxkcmVuID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJcHJvY2Vzc2VkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYoaXNQYXJlbnRPZihtZSwgZSwgSVBhcmVudFByb3ZpZGVyLnBhcmVudEN1c3RvbUNhdGVnb3J5UHJvdmlkZXIsIHByb2Nlc3NlZENoaWxkcmVuKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKG1lIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCQkJLy8gbWUgbXVzdCBiZSBhIHN0YW5kYXJkIGNhdGVnb3J5Ci0JCQkJCQkJLy8gY3VycmVudGx5IGFsbCBjb250ZW50IHBhY2thZ2VzIHRoYXQgY29udGFpbgotCQkJCQkJCS8vIHN0YW5kYXJkIGNhdGVnb3JpZXMgYXJlIG5vdCBjb250YWluZWQgYnkKLQkJCQkJCQkvLyBwcmVkZWZpbmVkIGNvbnRlbnQgcGFja2FnZSAiU3RhbmRhcmQgQ2F0ZWdvcmllcyIKLQkJCQkJCQkvLyB3ZSBuZWVkIHRvIGhhbmRsZSB0aGlzIHNwZWNpYWxseSBoZXJlCi0JCQkJCQkJLy8KLQkJCQkJCQlpZihlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgJiYgZSA9PSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQlpZihwcm9jZXNzZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJCQkJCXByb2Nlc3NlZENoaWxkcmVuID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJcHJvY2Vzc2VkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYoaXNQYXJlbnRPZihtZSwgZSwgSVBhcmVudFByb3ZpZGVyLnBhcmVudFN0YW5kYXJkQ2F0ZWdvcnlQcm92aWRlciwgcHJvY2Vzc2VkQ2hpbGRyZW4pKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BhcmVudE9mKE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCwgSVBhcmVudFByb3ZpZGVyIHBhcmVudFByb3ZpZGVyLCBTZXQ8T2JqZWN0PiBwcm9jZXNzZWRDaGlsZHJlbikgewotCQkJcHJvY2Vzc2VkQ2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWZvciAoT2JqZWN0IG15UGFyZW50IDogcGFyZW50UHJvdmlkZXIuZ2V0UGFyZW50cyhjaGlsZCkpIHsJCQkJCi0JCQkJaWYobXlQYXJlbnQgPT0gcGFyZW50KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZighcHJvY2Vzc2VkQ2hpbGRyZW4uY29udGFpbnMobXlQYXJlbnQpICYmIGlzUGFyZW50T2YobXlQYXJlbnQsIHBhcmVudCwgcGFyZW50UHJvdmlkZXIsIHByb2Nlc3NlZENoaWxkcmVuKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVycm9yQ2FsY3VsYXRvciBlcnJvckNhbGN1bGF0b3IgPSBuZXcgRXJyb3JDYWxjdWxhdG9yKCk7CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyI2dldEZpbGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZShVUkkgdXJpKSB7Ci0JCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIChJRmlsZSkgRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbih1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlKHVyaSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyI2FkanVzdE1hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyLCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGp1c3RNYXJrZXIoSU1hcmtlciBtYXJrZXIsIERpYWdub3N0aWMgZGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHJldCA9IHN1cGVyLmFkanVzdE1hcmtlcihtYXJrZXIsIGRpYWdub3N0aWMpOwotCQlpZighZGlhZ25vc3RpYy5nZXREYXRhKCkuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgbyA9IGRpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgwKTsKLQkJCWlmKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShHVUlELCAoKE1ldGhvZEVsZW1lbnQpbykuZ2V0R3VpZCgpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvKSk7Ci0JICAgIAkJbWFya2VyLnNldEF0dHJpYnV0ZShJREUuRURJVE9SX0lEX0FUVFIsICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciIpOyAvLyROT04tTkxTLTEkCi0JICAgIAkJZXJyb3JDYWxjdWxhdG9yLmFkZEVycm9yKChNZXRob2RFbGVtZW50KSBvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZhbGlkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogUHJvY2Vzc2VzCi0JCQkvLwotCQkJUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGlwID0gKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJTWV0aG9kRWxlbWVudCBvOwkJCQotCQkJcmV0dXJuICgobyA9IGlwLmdldENhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZSgpKSAhPSBudWxsICYmIGVycm9yQ2FsY3VsYXRvci5oYXNFcnJvcnMobykpCi0JCQkJfHwgKChvID0gaXAuZ2V0RGVsaXZlcnlQcm9jZXNzUGFja2FnZSgpKSAhPSBudWxsICYmIGVycm9yQ2FsY3VsYXRvci5oYXNFcnJvcnMobykpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0Ci0JCQkvLwotCQkJb2JqZWN0ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7CQkJCi0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50SXRlbVByb3ZpZGVyKSB7Ci0JCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9ICgoQ29udGVudEl0ZW1Qcm92aWRlcilvYmplY3QpLmdldENvcmVDb250ZW50UGFja2FnZSgpOwotCQkJaWYoY29yZUNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW9iamVjdCA9IGNvcmVDb250ZW50UGtnLmVDb250YWluZXIoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogZWl0aGVyIFRhc2tzLCBSb2xlcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UKLQkJCS8vCi0JCQlDb2xsZWN0aW9uPD8+IGNoaWxkcmVuID0gKChUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcilvYmplY3QpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGVycm9yQ2FsY3VsYXRvci5oYXNFcnJvcnMoKE1ldGhvZEVsZW1lbnQpIGNoaWxkKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCW9iamVjdCA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gKChvYmplY3QgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpKSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgZXJyb3JDYWxjdWxhdG9yCi0JCQkJLmhhc0Vycm9ycygoTWV0aG9kRWxlbWVudCkgb2JqZWN0KSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyI2hhc01hcmtlcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNNYXJrZXJzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewkJCQotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmhhc01hcmtlcnMob2JqZWN0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoT2JqZWN0IGRhdHVtKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZShkYXR1bSk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRlbGV0ZU1hcmtlcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRGaWxlKG9iamVjdCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmplY3Q7Ci0JCQkJCVN0cmluZyBndWlkID0gZS5nZXRHdWlkKCk7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07CQkJCQkJCi0JCQkJCQlpZihndWlkLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpKSkgewotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQllcnJvckNhbGN1bGF0b3IucmVtb3ZlRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzdXBlci5kZWxldGVNYXJrZXJzKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaW5jbHVkZVN1YnR5cGVzLCBpbnQgZGVwdGgpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCXRyeSB7CQkJCQotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCQllcnJvckNhbGN1bGF0b3IucmVtb3ZlRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQotCQkJfQkJCQotCQl9Ci0JCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhyZXNvdXJjZSwgaW5jbHVkZVN1YnR5cGVzLCBkZXB0aCk7Ci0JfQotCi0JLy9PdmVycmlkZSB0byBzZXBlcmF0ZSBlcnJvciBtZXNzYWdlIGluIGVycm9yIGRpYWxvZyBhbmQgcHJvYmxlbXMgdmlldyAoYnVnIDE3NDM1MSkKLQkvL05vdGU6IGJldHRlciBmaXggaXMgdG8gZXh0ZW5kIEJhc2ljRGlhZ25vc3RpYyB0byBlbmNhcHN1bGF0ZSBib3RoIHR5cGVzIG9mIG1zZ3MgLT4gdG8gZG8gbGF0ZXIKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvc2VNZXNzYWdlKERpYWdub3N0aWMgZGlhZ25vc3RpYywgRGlhZ25vc3RpYyBwYXJlbnREaWFnbm9zdGljKSB7Ci0JCWludCBpeCA9IGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2cyKTsKLQkJaWYgKGl4ID4gMCkgewotCQkJcmV0dXJuIGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpLnN1YnN0cmluZygwLCBpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBvc2VNZXNzYWdlKGRpYWdub3N0aWMsIHBhcmVudERpYWdub3N0aWMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDEyNTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5Xb3JrYmVuY2hNYXJrZXJSZXNvbHV0aW9uOwotCi0vKioKLSAqIENyZWF0ZSByZXNvbHV0aW9ucyBmb3IgdGhlIGdpdmVuIG1hcmtlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1hcmtlclJlc29sdXRpb25bXSBFTVBUWV9SRVNPTFVUSU9OUyA9IG5ldyBJTWFya2VyUmVzb2x1dGlvblswXTsKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTaG93T3duZXJJbkxpYnJhcnlWaWV3IGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb24gewotCi0JCXByaXZhdGUgT2JqZWN0IG93bmVyOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gb3duZXIKLQkJICovCi0JCXByaXZhdGUgU2hvd093bmVySW5MaWJyYXJ5VmlldyhPYmplY3Qgb3duZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5VmlldzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0U2VsZWN0aW9uVG9WaWV3ZXIob3duZXIpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXJrZXJSZXNvbHV0aW9uIGV4dGVuZHMgV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbiB7Ci0JCXByaXZhdGUgSU1hcmtlciBjdXJyZW50TWFya2VyOwotCQlwcml2YXRlIFJlZmVyZW5jZUluZm8gcmVmZXJlbmNlSW5mbzsKLQotCQlwdWJsaWMgTWFya2VyUmVzb2x1dGlvbihJTWFya2VyIGN1cnJlbnRNYXJrZXIsIFJlZmVyZW5jZUluZm8gcmVmZXJlbmNlSW5mbykgewotCQkJdGhpcy5jdXJyZW50TWFya2VyID0gY3VycmVudE1hcmtlcjsKLQkJCXRoaXMucmVmZXJlbmNlSW5mbyA9IHJlZmVyZW5jZUluZm87Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI2dldExhYmVsKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24jcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oSU1hcmtlciBtYXJrZXIpIHsKLQkJCVJlZmVyZW5jZUluZm8gcmVmSW5mbyA9IGN1cnJlbnRNYXJrZXIuZXF1YWxzKG1hcmtlcikgPyByZWZlcmVuY2VJbmZvIDogZ2V0UmVmZXJlbmNlSW5mbyhtYXJrZXIpOwotCQkJaWYocmVmSW5mbyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYocmVmSW5mby5yZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkoKExpc3Q8Pz4pcmVmSW5mby5vd25lci5lR2V0KHJlZkluZm8ucmVmZXJlbmNlKSkucmVtb3ZlKHJlZkluZm8uaW5kZXgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVmSW5mby5vd25lci5lU2V0KHJlZkluZm8ucmVmZXJlbmNlLCBudWxsKTsKLQkJCX0KLQkJCWJvb2xlYW4gdmFsaWRhdGUgPSBmYWxzZTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVmSW5mby5vd25lci5lUmVzb3VyY2UoKTsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldFBlcnNpc3RlckZvcihyZXNvdXJjZSkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl2YWxpZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCX0KLQkJCWlmKHZhbGlkYXRlKSB7IAkJCQkKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldE1hcmtlck1hbmFuZ2VyKCkuZG9WYWxpZGF0ZU1hcmtlcnMocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSU1hcmtlcltdIGZpbmRPdGhlck1hcmtlcnMoSU1hcmtlcltdIG1hcmtlcnMpIHsKLQkJCUFycmF5TGlzdDxJTWFya2VyPiBzaW1pbGFyTWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1hcmtlcj4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQlpZighY3VycmVudE1hcmtlci5lcXVhbHMobWFya2VyKSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYoVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5NQVJLRVJfSUQuZXF1YWxzKG1hcmtlci5nZXRUeXBlKCkpKSB7Ci0JCQkJCQkJc2ltaWxhck1hcmtlckxpc3QuYWRkKG1hcmtlcik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlNYXJrZXJbXSBzaW1pbGFyTWFya2VycyA9IG5ldyBJTWFya2VyW3NpbWlsYXJNYXJrZXJMaXN0LnNpemUoKV07Ci0JCQlzaW1pbGFyTWFya2VyTGlzdC50b0FycmF5KHNpbWlsYXJNYXJrZXJzKTsKLQkJCXJldHVybiBzaW1pbGFyTWFya2VyczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQkvLyBUT0RPIHByb3ZpZGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJLy8gVE9ETyBwcm92aWRlIGltYWdlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVmZXJlbmNlSW5mbyB7Ci0JCXByaXZhdGUgRU9iamVjdCBvd25lcjsKLQkJcHJpdmF0ZSBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0JCQotCQlwdWJsaWMgUmVmZXJlbmNlSW5mbyhFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwgaW50IGluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUmVmZXJlbmNlSW5mbyBnZXRSZWZlcmVuY2VJbmZvKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuUFJPWFlfVVJJKTsKLQkJCVN0cmluZyBvd25lckdVSUQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuT1dORVJfR1VJRCk7Ci0JCQlpZihwcm94eVVSSSAhPSBudWxsICYmIG93bmVyR1VJRCAhPSBudWxsKSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UobWFya2VyLmdldFJlc291cmNlKCkpOwotCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJRU9iamVjdCBvd25lciA9IHJlc291cmNlLmdldEVPYmplY3Qob3duZXJHVUlEKTsKLQkJCQkJaWYob3duZXIgIT0gbnVsbCkgewotCQkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocHJveHlVUkkpOwotCQkJCQkJLy8gZmluZCB0aGUgcHJveHkKLQkJCQkJCS8vCi0JCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQkJCQkJCWZpbmRfcHJveHlfbG9vcDoKLQkJCQkJCWZvciAoRVJlZmVyZW5jZSByZWYgOiBvd25lci5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpKSB7Ci0JCQkJCQkJaWYocmVmLmlzQ2hhbmdlYWJsZSgpICYmICFyZWYuaXNEZXJpdmVkKCkpIHsKLQkJCQkJCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgb3duZXIuZUdldChyZWYpOwotCQkJCQkJCQkJaW50IGlkID0gMDsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0LmJhc2ljSXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCQlpZihvLmVJc1Byb3h5KCkgJiYgdXJpLmVxdWFscyhvLmVQcm94eVVSSSgpKSkgewotCQkJCQkJCQkJCQlpbmRleCA9IGlkOwotCQkJCQkJCQkJCQlyZWZlcmVuY2UgPSByZWY7Ci0JCQkJCQkJCQkJCWJyZWFrIGZpbmRfcHJveHlfbG9vcDsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJaWQrKzsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgb3duZXIuZUdldChyZWYsIGZhbHNlKTsKLQkJCQkJCQkJCWlmKG8gIT0gbnVsbCAmJiBvLmVJc1Byb3h5KCkgJiYgdXJpLmVxdWFscyhvLmVQcm94eVVSSSgpKSkgewotCQkJCQkJCQkJCXJlZmVyZW5jZSA9IHJlZjsKLQkJCQkJCQkJCQlicmVhayBmaW5kX3Byb3h5X2xvb3A7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBuZXcgUmVmZXJlbmNlSW5mbyhvd25lciwgcmVmZXJlbmNlLCBpbmRleCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciNnZXRSZXNvbHV0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7Ci0JCVJlZmVyZW5jZUluZm8gcmVmSW5mbyA9IGdldFJlZmVyZW5jZUluZm8obWFya2VyKTsKLQkJaWYocmVmSW5mbyAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgc2VsZWN0YWJsZU93bmVyID0gZ2V0U2VsZWN0YWJsZU9iamVjdChyZWZJbmZvLm93bmVyKTsKLQkJCUlNYXJrZXJSZXNvbHV0aW9uIG1hcmtlclJlc29sdXRpb24gPSBuZXcgTWFya2VyUmVzb2x1dGlvbihtYXJrZXIsIHJlZkluZm8pOwotCQkJaWYoc2VsZWN0YWJsZU93bmVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10gewotCQkJCQkJbWFya2VyUmVzb2x1dGlvbiwKLQkJCQkJCW5ldyBTaG93T3duZXJJbkxpYnJhcnlWaWV3KHNlbGVjdGFibGVPd25lcikKLQkJCQl9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIHsKLQkJCQkJCW1hcmtlclJlc29sdXRpb24KLQkJCQl9OwotCQkJfQotCQl9Ci0JCXJldHVybiBFTVBUWV9SRVNPTFVUSU9OUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0YWJsZSBvYmplY3QgCi0JICogQHBhcmFtIG93bmVyCi0JICogQHJldHVybgotCSAqIAkJCW9iamVjdCBpdHNlbGYKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0U2VsZWN0YWJsZU9iamVjdChFT2JqZWN0IG93bmVyKSB7Ci0JCWlmKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IG93bmVyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwgb3duZXIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSAKLQkJCQl8fCBvd25lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiBvd25lcjsKLQkJfQotCQlpZihvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSBVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoKE1ldGhvZEVsZW1lbnQpIG93bmVyKTsKLQkJCWlmKHByb2NDb21wICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcHJvY0NvbXA7Ci0JCQl9Ci0JCX0KLQkJaWYob3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJcmV0dXJuIG93bmVyOwotCQl9Ci0JCWlmKG93bmVyIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uICYmIG93bmVyLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gb3duZXIuZUNvbnRhaW5lcigpOyAKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG93bmVyLmVSZXNvdXJjZSgpOwotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCWlmKGUgIT0gb3duZXIpIHsKLQkJCXJldHVybiBnZXRTZWxlY3RhYmxlT2JqZWN0KGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNGU0M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbi5FY2xpcHNlUmVzb3VyY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db250ZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogYmFzZWQgb24gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIgZXh0ZW5kcyBFY2xpcHNlUmVzb3VyY2VzVXRpbCB7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIgSU5TVEFOQ0UgPSBuZXcgTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEID0gImd1aWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBtYXJrZXIgSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5tZXRob2RSaWNoVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBtYXJrZXIgYXR0cmlidXRlCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1FVEhPRF9GSUVMRE5BTUUgPSAiTWV0aG9kRmllbGROYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBjb25zdHJ1Y3RvcgotCXByaXZhdGUgTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIoKSB7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRhaW5lck1hcCBleHRlbmRzIEhhc2hNYXA8T2JqZWN0LCBJbnRlZ2VyPiB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBDb250YWluZXJNYXAoKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdE1hcCgpOwotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQlpbml0TWFwKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0JCQkJCi0JCQl9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluaXRNYXAoKSB7Ci0JCQljbGVhcigpOwotCQkJCi0JCQkvLyBmaWxsIHRoaXMgc2V0IHdpdGggY29udGFpbmVycyBvZiBtYXJrZWQgb2JqZWN0cwotCQkJLy8KLS8vCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0vLwkJCWlmKGxpYiAhPSBudWxsKSB7Ci0vLwkJCQlJUHJvamVjdCBwcmogPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5maW5kUHJvamVjdChsaWIpOwotLy8JCQkJaWYocHJqICE9IG51bGwpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHByai5maW5kTWFya2VycyhJTlNUQU5DRS5nZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLS8vCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0vLwkJCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0vLwkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0vLwkJCQkJCQlpZihlICE9IG51bGwpIHsKLS8vCQkJCQkJCQkvLyByZW1vdmUgaXRzIGNvbnRhaW5lcnMgZnJvbSBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0vLwkJCQkJCQkJLy8KLS8vCQkJCQkJCQltYXJrQ29udGFpbmVycyhlKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5jcmVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCUludGVnZXIgY291bnQ7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCWNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ID0gbmV3IEludGVnZXIoMCk7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQkJcHV0KG9iamVjdCwgY291bnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCUludGVnZXIgY291bnQgPSBnZXQob2JqZWN0KTsKLQkJCQlpZiAoY291bnQgPT0gMSkgewotCQkJCQkvLyByZW1vdmUgb2JqZWN0Ci0JCQkJCXJlbW92ZShvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvdW50LS07Ci0JCQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBtYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWluY3JlbWVudChjb250YWluZXIpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVubWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlkZWNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJNYXAgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cyA9IG5ldyBDb250YWluZXJNYXAoKTsJCi0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJJRCgpIHsKLQkJcmV0dXJuIE1BUktFUl9JRDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjZ2V0RmlsZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKFVSSSB1cmkpIHsKLQkJaWYodXJpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gKElGaWxlKSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHVyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEZpbGUodXJpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXIjYWRqdXN0TWFya2VyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkanVzdE1hcmtlcihJTWFya2VyIG1hcmtlciwgRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIuYWRqdXN0TWFya2VyKG1hcmtlciwgZGlhZ25vc3RpYyk7Ci0JCWlmKCFkaWFnbm9zdGljLmdldERhdGEoKS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvID0gZGlhZ25vc3RpYy5nZXREYXRhKCkuZ2V0KDApOwotCQkJT2JqZWN0IHN0ciA9IGRpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgxKTsKLQkJCWlmKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShHVUlELCAoKE1ldGhvZEVsZW1lbnQpbykuZ2V0R3VpZCgpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sIFRuZ1V0aWwuZ2V0TGFiZWwobykgKyAiLCAiICsgc3RyKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSURFLkVESVRPUl9JRF9BVFRSLCAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHN0ciBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSwgKFN0cmluZylzdHIpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IFByb2Nlc3NlcwotCQkJLy8KLQkJCVByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBpcCA9IChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJCU9iamVjdCBvOwotCQkJcmV0dXJuICgobyA9IGlwLmdldENhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZSgpKSAhPSBudWxsICYmIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkobykpCi0JCQkJfHwgKChvID0gaXAuZ2V0RGVsaXZlcnlQcm9jZXNzUGFja2FnZSgpKSAhPSBudWxsICYmIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkobykpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIKLQkJCQl8fCBvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50SXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdAotCQkJLy8KLQkJCW9iamVjdCA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0OiBlaXRoZXIgVGFza3MsIFJvbGVzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZQotCQkJLy8KLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSAoKFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZihjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG9iaikgfHwgSU5TVEFOQ0UuaGFzTWFya2VycyhvYmopKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0JCQkJCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkob2JqZWN0KSB8fCBJTlNUQU5DRS5oYXNNYXJrZXJzKG9iamVjdCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyI2hhc01hcmtlcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNNYXJrZXJzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmhhc01hcmtlcnMob2JqZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVkIHRvIGhhbmRsZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gaWYgdGhlIG9iamVjdCBhbHJlYWR5IGhhcyBiZWVuIHVubG9hZGVkCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlciNnZXRGaWxlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoT2JqZWN0IGRhdHVtKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZShkYXR1bSk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRlbGV0ZU1hcmtlcnMoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRGaWxlKG9iamVjdCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KW9iamVjdCkuZ2V0R3VpZCgpOwotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQkJaWYoZ3VpZC5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKSkgJiYgKGZpZWxkTmFtZSA9PSBudWxsIHx8Ci0JCQkJCQkJCWZpZWxkTmFtZS5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShNRVRIT0RfRklFTEROQU1FKSkpKSB7Ci0JCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotLy8JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotLy8JCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotLy8JCQkJCQkJCS8vCi0vLwkJCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy51bm1hcmtDb250YWluZXJzKGUpOwotLy8JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKSB7Ci0vLwkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLS8vCQkJdHJ5IHsJCQkJCi0vLwkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0vLwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0vLwkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotLy8JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLS8vCQkJCQlpZihlICE9IG51bGwpIHsKLS8vCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotLy8JCQkJCQkvLwotLy8JCQkJCQljb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLnVubWFya0NvbnRhaW5lcnMoZSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8KLS8vCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkKLS8vCQkJfQkJCQotLy8JCX0KLQkJCQotCQlzdXBlci5kZWxldGVNYXJrZXJzKHJlc291cmNlLCBpbmNsdWRlU3VidHlwZXMsIGRlcHRoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIERpYWdub3N0aWMgZGlhZ25vc3RpYywgRGlhZ25vc3RpYyBwYXJlbnREaWFnbm9zdGljKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNyZWF0ZU1hcmtlcnMocmVzb3VyY2UsIGRpYWdub3N0aWMsIHBhcmVudERpYWdub3N0aWMpOwotLy8JCVN0cmluZyBmaWVsZE5hbWUgPSBudWxsOwotLy8JCWlmKCFkaWFnbm9zdGljLmdldERhdGEoKS5pc0VtcHR5KCkgJiYgZGlhZ25vc3RpYy5nZXREYXRhKCkuc2l6ZSgpID4gMSkgewotLy8JCQlmaWVsZE5hbWUgPSAoU3RyaW5nKWRpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgxKTsKLS8vCQl9Ci0vLwkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgZmllbGROYW1lICE9IG51bGwpIHsKLS8vCQkJdHJ5IHsJCQkJCi0vLwkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0vLwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0vLwkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotLy8JCQkJCWlmKGZpZWxkTmFtZS5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShNRVRIT0RfRklFTEROQU1FKSkpIHsKLS8vCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotLy8JCQkJCQlpZihlICE9IG51bGwpIHsKLS8vCQkJCQkJCS8vIGFkZCBpdHMgY29udGFpbmVycyB0byBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0vLwkJCQkJCQkvLwotLy8JCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5tYXJrQ29udGFpbmVycyhlKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCi0vLwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCi0vLwkJCX0JCQkKLS8vCQl9Ci0KLQl9Ci0JCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wb3NlTWVzc2FnZShEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykKLSAgICB7Ci0gICAgICBTdHJpbmcgbWVzc2FnZSA9IGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpOwotICAgICAgaWYgKHBhcmVudERpYWdub3N0aWMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmVudE1lc3NhZ2UgPSBwYXJlbnREaWFnbm9zdGljLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKHBhcmVudE1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlICE9IG51bGwgPyBwYXJlbnRNZXNzYWdlICsgIiAiICsgbWVzc2FnZSA6IHBhcmVudE1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SZWZyZXNoSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1JlZnJlc2hIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMjBhYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1JlZnJlc2hIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqIE5vdGlmeSBjaGFuZ2VzIGluIHJlc291cmNlcyB0byByZWZyZXNoCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoSGFuZGxlciBpbXBsZW1lbnRzIElSZWZyZXNoSGFuZGxlciB7Ci0JCi0JcHJpdmF0ZSBWaWV3UGFydCB2aWV3OwotCi0KLQlwdWJsaWMgUmVmcmVzaEhhbmRsZXIoVmlld1BhcnQgdmlldykgewotCQl0aGlzLnZpZXcgPSB2aWV3OwotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJaWYodmlldyBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewotCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKXZpZXcpLmdldFZpZXdlcigpOwotCQkJaWYodmlld2VyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdmlld2VyLmdldENvbnRyb2woKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlDb250cm9sIGN0cmwgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGN0cmwuZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCWRvUmVmcmVzaCh2aWV3LmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZG9SZWZyZXNoKG51bGwpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBib29sZWFuIHJlZnJlc2hWaWV3cyA9ICFSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCkuaXNFbXB0eSgpCi0JCQkJfHwgIVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFJlc291cmNlcygpLmlzRW1wdHkoKTsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQlBcnJheUxpc3Q8SVJlc291cmNlPiBhZGRlZFdzUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRBZGRlZFdvcmtzcGFjZVJlc291cmNlcygpKTsKLQotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFhZGRlZFdzUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCByZWZyZXNoVmlld3MpIHsKLQkJCWJsb2NraW5nUmVmcmVzaChyZW1vdmVkUmVzb3VyY2VzLCBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJCQlhZGRlZFdzUmVzb3VyY2VzLCBzaGVsbCk7Ci0JCX0KLQotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVtb3ZlZFJlc291cmNlcygpLnJlbW92ZUFsbCgKLQkJCQkJcmVtb3ZlZFJlc291cmNlcyk7Ci0JCX0KLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWNoYW5nZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghYWRkZWRXc1Jlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFdvcmtzcGFjZVJlc291cmNlcygpLnJlbW92ZUFsbCgKLQkJCQkJYWRkZWRXc1Jlc291cmNlcyk7Ci0JCX0KLQkJaWYgKHJlZnJlc2hWaWV3cykgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpCi0JCQkJCS5jbGVhcigpOwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldEFkZGVkUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYmxvY2tpbmdSZWZyZXNoKGZpbmFsIEFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcywKLQkJCWZpbmFsIEFycmF5TGlzdDxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcywKLQkJCWZpbmFsIENvbGxlY3Rpb248SVJlc291cmNlPiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcywKLQkJCVNoZWxsIHNoZWxsKSB7Ci0JCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCQltb25pdG9yCi0JCQkJCQkuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0pOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIG1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlkb1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcywKLQkJCQkJCQlhZGRlZFdvcmtzcGFjZVJlc291cmNlcyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0JCXRyeSB7Ci0JCQl2aWV3LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKQotCQkJCQkucnVuSW5VSSgKLQkJCQkJCQljb250ZXh0LAotCQkJCQkJCXJ1bm5hYmxlLAotCQkJCQkJCW5ldyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUoTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQllLnRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogTXVzdCBiZSBzeW5jaHJvbml6ZWQgdG8gYXZvaWQgc3RlcHBpbmcgb24gZWFjaCBvdGhlciBpbiByZWxvYWRpbmcKLQkgKiByZXNvdXJjZXMvcmVmcmVzaGluZyBVSQotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVkUmVzb3VyY2VzCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgSVJlc291cmNlIG9iamVjdHMgdGhhdCBhcmUganVzdCBuZXdseSBhZGRlZCB0bwotCSAqICAgICAgICAgICAgdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gcmVmcmVzaFZpZXdzCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBkb1JlZnJlc2goQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMsIENvbGxlY3Rpb248SVJlc291cmNlPiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcykgewotCQlIYXNoU2V0PElFZGl0b3JQYXJ0PiBlZGl0b3JzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQ8SUVkaXRvclBhcnQ+KCk7Ci0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZVJlbW92ZWRSZXNvdXJjZXMocmVtb3ZlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JCX0KLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBlZGl0b3JzVG9SZWZyZXNoKTsKLQkJfQotCQlpZiAoYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMgIT0gbnVsbAotCQkJCSYmICFhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbWdyLmdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkKLQkJCQkJCQkubG9hZE5ld1Jlc291cmNlcyhhZGRlZFdvcmtzcGFjZVJlc291cmNlcyk7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkuZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpLnZhbGlkYXRlQWxsTWFya2VycygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGVkaXRvcnNUb1JlZnJlc2gpIHsKLQkJcmV0dXJuIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgbnVsbCwgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlbW92ZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gZWRpdG9yc1RvUmVmcmVzaAotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHVubG9hZGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBoYW5kbGVSZW1vdmVkUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBlZGl0b3JzVG9SZWZyZXNoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB2aWV3LmdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdDxJRWRpdG9yUGFydD4gZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0ID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4ocmVtb3ZlZFJlc291cmNlcyk7Ci0JCWlmIChlZGl0b3JzVG9SZWZyZXNoID09IG51bGwpIHsKLQkJCWVkaXRvcnNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOwotCQl9Ci0JCS8vIGZpbmQgYWxsIGVkaXRvciB3aXRoIGRpcnR5IGNvbmZsaWN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBlZGl0b3IKLQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpICE9IG51bGwgPyBpbnB1dAotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKS5lUmVzb3VyY2UoKSA6IG51bGw7Ci0JCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkJLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlZFJlc291cmNlTGlzdAotCQkJCQkJCS5zaXplKCk7IGorKykgewotCQkJCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlbW92ZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmFkZChlZGl0b3IpOwotCQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoKElFZGl0b3JQYXJ0KSBzZWxlY3RlZFtpXSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBVbmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzLgotCQlQZXJzaXN0ZW5jZVV0aWwudW5sb2FkKHJlbW92ZWRSZXNvdXJjZXMpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmICFlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCByZW1vdmVkUmVzb3VyY2VMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSByZW1vdmVkUmVzb3VyY2VMaXN0LmdldChqKTsKLQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQllZGl0b3JzVG9SZWZyZXNoLmFkZChlZGl0b3IpOwotCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFJlbG9hZCB0aGUgY2hhbmdlZCByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcwotCSAqIEBwYXJhbSBlZGl0b3JzTm90VG9SZWZyZXNoCi0JICogQHBhcmFtIGVkaXRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIExpc3Qgb2YgY2hhbmdlZCByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVsb2FkZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbjxJRWRpdG9yUGFydD4gZWRpdG9yc05vdFRvUmVmcmVzaCwgQ29sbGVjdGlvbjxJRWRpdG9yUGFydD4gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlDb250cm9sIGN0cmwgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHZpZXcuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0PElFZGl0b3JQYXJ0PiBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOwotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJLy8gZmluZCBhbGwgZWRpdG9yIHdpdGggZGlydHkgY29uZmxpY3QKLQkJLy8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgY2hhbmdlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmFkZChlZGl0b3IpOwotCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBzZWxlY3REaXJ0eUVkaXRvcnMoZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0KTsKLQkJCWlmKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IGVkaXRvciA9IHJlc3VsdFtpXTsKLQkJCQkJaWYgKChlZGl0b3JzTm90VG9SZWZyZXNoID09IG51bGwgfHwgIWVkaXRvcnNOb3RUb1JlZnJlc2gKLQkJCQkJCQkuY29udGFpbnMoZWRpdG9yKSkKLQkJCQkJCQkmJiAoZWRpdG9yc1RvUmVmcmVzaCA9PSBudWxsIHx8ICFlZGl0b3JzVG9SZWZyZXNoCi0JCQkJCQkJCQkuY29udGFpbnMoZWRpdG9yKSkpIHsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5yZW1vdmUoZWRpdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHJlbW92ZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgZGlydHkgZWRpdG9ycyB3aXRoIGNvbmZsaWN0IGZyb20gdGhlCi0JCQkvLyBjb2xsZWN0aW9uIG9mIGNoYW5nZWQgcmVzb3VyY2VzIGFmdGVyIHVwZGF0aW5nIGNhY2hlZCBtb2RpZmljYXRpb24gc3RhbXAKLQkJCS8vIHNvIHRoZXkgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gcmVsb2FkIGFnYWluIHVudGlsIHRoZSBuZXh0IGV4dGVybmFsIGNoYW5nZQotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0Ci0JCQkJCQkuZ2V0KGkpOwkJCQkKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gZWRpdG9yLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQl1c2VkUmVzb3VyY2VzLnJldGFpbkFsbChjaGFuZ2VkUmVzb3VyY2VMaXN0KTsKLQkJCQllZGl0b3IudXBkYXRlUmVzb3VyY2VJbmZvcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQllZGl0b3Iub3Zld3JpdGVSZXNvdXJjZXModXNlZFJlc291cmNlcyk7Ci0JCQkJY2hhbmdlZFJlc291cmNlTGlzdC5yZW1vdmVBbGwodXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkvLyBSZWxvYWQgdGhlIHNlbGVjdGVkIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbG9hZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VMaXN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlTGlzdDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIHNlbGVjdERpcnR5RWRpdG9ycygKLQkJCUFycmF5TGlzdDxJRWRpdG9yUGFydD4gZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0KSB7Ci0JCXJldHVybiBzZWxlY3REaXJ0eUVkaXRvcnMoZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LCB2aWV3LmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIHNlbGVjdERpcnR5RWRpdG9ycyhMaXN0PD8+IGRpcnR5RWRpdG9ycywgU2hlbGwgc2hlbGwpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsKLQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM7Ci0JCXJldHVybiBzZWxlY3RFZGl0b3JzKGRpcnR5RWRpdG9ycywgdGl0bGUsIG1zZywgc2hlbGwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE9iamVjdFtdIHNlbGVjdEVkaXRvcnMoTGlzdDw/PiBlZGl0b3JzLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFNoZWxsIHNoZWxsKSB7Ci0JCS8vIHByb21wdCB1c2VyIHRvIGRpc2NhcmQgY2hhbmdlcyBpbiBlZGl0b3JzIHRoYXQgY29uZmxpY3Qgd2l0aCBvdXRzaWRlCi0JCS8vIGNoYW5nZQotCQkvLwotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlMaXN0PD8+IGZDb250ZW50czsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlpZiAoZkNvbnRlbnRzICE9IG51bGwgJiYgZkNvbnRlbnRzID09IGlucHV0RWxlbWVudCkKLQkJCQkJcmV0dXJuIGZDb250ZW50cy50b0FycmF5KCk7Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCWZDb250ZW50cyA9IChMaXN0PD8+KSBuZXdJbnB1dDsKLQkJCQllbHNlCi0JCQkJCWZDb250ZW50cyA9IG51bGw7Ci0KLQkJCX0KLQotCQl9OwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwKLQkJCQllZGl0b3JzLCBjb250ZW50UHJvdmlkZXIsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0JCWRsZy5zZXRUaXRsZSh0aXRsZSk7Ci0JCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGxnLm9wZW4oKTsKLQkJcmV0dXJuIGRsZy5nZXRSZXN1bHQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1JpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzAyMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1JpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci0KLS8qKgotICogU2ltcGxlIGNvbnRhaW5lciBjbGFzcyB1c2VkIGFzIGEgcmV0dXJuIHZhbHVlIGZvciBGb3JtVUkgY29udmVuaWVuY2UgbWV0aG9kcwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgewotCXB1YmxpYyBJTWV0aG9kUmljaFRleHQgcmljaFRleHQ7Ci0JcHVibGljIEltYWdlSHlwZXJsaW5rIGxpbms7Ci0JcHVibGljIExhYmVsIGxhYmVsOwotCQotCXB1YmxpYyBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcihJTWV0aG9kUmljaFRleHQgcmljaFRleHQsIEltYWdlSHlwZXJsaW5rIGxpbmssIExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZ2V0Q29udHJvbCgpLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCX0KLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJbGluay5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlsYWJlbC5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVCZWxvdyhDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJbGluay5tb3ZlQmVsb3coY29udHJvbCk7Ci0JCX0KLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCWxhYmVsLm1vdmVCZWxvdyhsaW5rKTsKLQkJfQotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZ2V0Q29udHJvbCgpLm1vdmVCZWxvdyhsYWJlbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVkcmF3KCkgewotCQlpZiAobGluayAhPSBudWxsKSB7Ci0JCQlsaW5rLnJlZHJhdygpOwotCQl9Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlsYWJlbC5yZWRyYXcoKTsKLQkJfQotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZ2V0Q29udHJvbCgpLnJlZHJhdygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2OWVhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUVkaXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotCi0KLS8qKgotICogSGVscGVyIFV0aWxpdHkgY2xhc3MgZm9yIFVJCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVUlIZWxwZXIgewotCi0JLyoqCi0JICogU2V0dGluZyBpdGVtcyBpbiBhIHRhYmxlCi0JICogCi0JICogQHBhcmFtIHRhYmxlCi0JICogQHBhcmFtIGl0ZW1zCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEl0ZW1zKFRhYmxlIHRhYmxlLCBBcnJheUxpc3QgaXRlbXMpIHsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KChTdHJpbmcpIGl0ZW1zLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbGlzdCBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlIHdpdGggZ2l2ZW4gc3R5bGUKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY3JlYXRlTGlzdChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHN0eWxlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgc3R5bGUgfCBTV1QuTlVMTCk7Ci0JCXRvb2xraXQuYWRhcHQobGlzdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qCi0JICogTWV0aG9kIHdpbGwgcmV0dXJuIE9iamVjdFtdIG9mIGd1aWRhbmNlIGV4Y2x1ZGluZyBQcmFjdGljZS4KLQkgKiBNZXRob2RFbGVtZW50VXRpbCNnZXRTZWxlY3RlZEd1aWRhbmNlcyhFT2JqZWN0KSBjYWxjdWxhdGVzIGFsbCBndWlkYW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFNlbGVjdGVkR3VpZGFuY2VzKENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50KSB7Ci0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBNZXRob2RFbGVtZW50VXRpbAotCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpCi0JCQkJaXQucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGb3JtUGFnZVRpdGxlUHJlZml4Rm9yKE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlTdHJpbmcgZWxlbWVudExhYmVsID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCk7Ci0JCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUICsgIiAoIiArIGVsZW1lbnRMYWJlbCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZWxzZSBpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0dVSURBTkNFICsgIiAoIiArIGVsZW1lbnRMYWJlbCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWxlbWVudExhYmVsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0ZXh0IGZvciB0aGUgZ2l2ZW4gZm9ybSBiYXNlZCBvbiB0aGUgZ2l2ZW4gZWxlbWVudCwgaW5jbHVkaW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uIG9mIHRoZSBlbGVtZW50Ci0JICogaWYgdGhlcmUgaXMgYW55LgotCSAqIAotCSAqIEBwYXJhbSBmb3JtCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9ybVRleHQoU2Nyb2xsZWRGb3JtIGZvcm0sIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZm9ybSAhPSBudWxsICYmICFmb3JtLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXN0ci5hcHBlbmQoZ2V0Rm9ybVBhZ2VUaXRsZVByZWZpeEZvcihlbGVtZW50KSk7Ci0JCQlzdHIuYXBwZW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyk7Ci0JCQkKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlzdHIuYXBwZW5kKFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCwKLQkJCQkJCSIiLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYoZWxlbWVudC5nZXROYW1lKCkgIT0gbnVsbCl7Ci0JCQkJc3RyLmFwcGVuZChlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlmb3JtLnNldFRleHQoc3RyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBnaXZlbiBkZWxpdmVyYWJsZXMgbGVhZHMgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIEBwYXJhbSB0b0JlUGFydAotCSAqIEBwYXJhbSBkZWxpdmVyYWJsZQotCSAqIEByZXR1cm4KLQkgKiAJCQlCb29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgY2ljdWxhciBkZXBlbmRlbmN5IGlzIGRldGVjdGVkCi0JICogQGRlcHJlY2F0ZWQgbW92ZWQgdG8ge0BsaW5rIERlcGVuZGVuY3lDaGVja2VyI2NoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoRGVsaXZlcmFibGUsIERlbGl2ZXJhYmxlKX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhEZWxpdmVyYWJsZSB0b0JlUGFydCwKLQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlKSB7Ci0JCXJldHVybiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKHRvQmVQYXJ0LCBkZWxpdmVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBkZWxpdmVyYWJsZSBwYXJ0cyBhcmUgaW4gY2hhaW4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSByb290cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpdmVyYWJsZVBhcnRzQ2hhaW4oRGVsaXZlcmFibGUgZSwgamF2YS51dGlsLkxpc3Qgcm9vdHMpIHsKLQkJamF2YS51dGlsLkxpc3QgbGlzdCA9IGUuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJcm9vdHMuYWRkKG9iaik7Ci0JCQkJCWRlbGl2ZXJhYmxlUGFydHNDaGFpbigoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIFJlc29sdmUgY29udGVudCBlbGVtZW50IG5hbWUgY29uZmxpY3RzCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVDb250ZW50RWxlbWVudE5hbWVDb25mbGljdChFT2JqZWN0IGNvbnRhaW5lciwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFUmVmZXJlbmNlCi0JCQlyZWZlcmVuY2UpIHsKLQotCQlmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoY29udGFpbmVyCi0JCQkJLCByZWZlcmVuY2UsCi0JCQkJKENvbnRlbnRFbGVtZW50KSBlbGVtZW50LCBuZXcgVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyKGVsZW1lbnQpKTsKLQkJCi0JCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCVN0cmluZyBmZWF0dXJlVHh0ID0gVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBkbGdNc2cgPSBOTFMuYmluZCgKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSAoU3RyaW5nKSBlbGVtZW50LmVHZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCi0JCQlJSW5wdXRWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgSUlucHV0VmFsaWRhdG9yKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQlyZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJSW5wdXREaWFsb2cgaW5wdXREbGcgPSBuZXcgSW5wdXREaWFsb2coCi0JCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgdGl0bGUsIGRsZ01zZywgY3VycmVudFZhbHVlLAotCQkJCQlpbnB1dFZhbGlkYXRvcik7Ci0JCQlpZiAoaW5wdXREbGcub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBpbnB1dERsZy5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBEaWFncmFtIGVkaXRvcnMgb2Ygb2JqZWN0IGl0c2VsZiB3aWxsIGJlIGNsb3NlZC4gQW5kIFBhcmVudCBkaWFncmFtIGVkaXRvcnMgCi0JICogd2lsbCBiZSByZWZyZXNoZWQuICAKLQkgKiAgQGRlcHJlY2F0ZWQgIChzZWU6ICB7QGxpbmsgRGlhZ3JhbUVkaXRvckhlbHBlcn0gLSByZWZyZXNoUGFyZW50RGlhZ3JhbUVkaXRvcnMoKSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaE9wZW5EaWFncmFtRWRpdG9yc09mUGFyZW50KE9iamVjdCByZWZyZXNoRWxlbWVudCwgamF2YS51dGlsLkxpc3Qgb3BlbkVkaXRvclJlZnMpIHsKLQkJb3BlbkVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIE5vdyByZWZyZXNoIG9iamVjdCdzIHBhcmVudCdzIGRpYWdyYW1zLgotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgYmlucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dDsKLQkJCQkJaWYgKGJpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldFBhcmVudChudWxsKTsKLQkJCQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJCWlmKGVsZW1lbnQuZXF1YWxzKHJlZnJlc2hFbGVtZW50KSkKLQkJCQkJCQkJCXJlZnJlc2hPcGVuRGlhZ3JhbUVkaXRvcnNPZlBhcmVudChwYXJlbnQsIG9wZW5FZGl0b3JSZWZzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0ICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpCi0JCQkJewotCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJaWYoKChBY3Rpdml0eSllbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSkKLQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCWVsc2UgaWYocmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJT2JqZWN0IGxvY2FsUmVmcmVzaEVsZW1lbnQgPSByZWZyZXNoRWxlbWVudDsKLQkJCQkJCQl3aGlsZSgobG9jYWxSZWZyZXNoRWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilsb2NhbFJlZnJlc2hFbGVtZW50KS5nZXRPd25lcigpIT0gbnVsbCl7Ci0JCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWxSZWZyZXNoRWxlbWVudCkuZ2V0T3duZXIoKQotCQkJCQkJCQkJCS5lcXVhbHMoZWxlbWVudCkpewotCQkJCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbG9jYWxSZWZyZXNoRWxlbWVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWxSZWZyZXNoRWxlbWVudCkuZ2V0T3duZXIoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMocmVmcmVzaEVsZW1lbnQpKXsKLQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBvcGVuRWRpdG9yUmVmcy5zaXplKCk7Ci0JCS8vSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElFZGl0b3JSZWZlcmVuY2UpIG9wZW5FZGl0b3JSZWZzLmdldChpKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IgKXsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3IpLnJlZnJlc2hEaWFncmFtKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgZGlhZ3JhbSBlZGl0b3JzIGluY2x1ZGluZyBwYXJlbnQgZWRpdG9ycwotCSAqIEBwYXJhbSBjbG9zZUVsZW1lbnQKLQkgKiBAcGFyYW0gY2xvc2VFZGl0b3JSZWZzCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VEaWFncmFtRWRpdG9yc0luY2x1ZGluZ1BhcmVudChPYmplY3QgY2xvc2VFbGVtZW50LCBqYXZhLnV0aWwuTGlzdCBjbG9zZUVkaXRvclJlZnMpIHsKLQkJY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgYmlucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dDsKLQkJCQkJaWYgKGJpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldFBhcmVudChudWxsKTsKLQkJCQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJCWlmKGVsZW1lbnQuZXF1YWxzKGNsb3NlRWxlbWVudCkpCi0JCQkJCQkJCQljbG9zZURpYWdyYW1FZGl0b3JzSW5jbHVkaW5nUGFyZW50KHBhcmVudCwgY2xvc2VFZGl0b3JSZWZzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0ICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpCi0JCQkJewotCQkJCQkJLy9jbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlpZihlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQotCQkJCQkJaWYoKChBY3Rpdml0eSllbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKGNsb3NlRWxlbWVudCkpCi0JCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJZWxzZSBpZihjbG9zZUVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJaWYoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciljbG9zZUVsZW1lbnQpLmdldE93bmVyKCkKLQkJCQkJCQkJCSE9IG51bGwpCi0JCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQkuZXF1YWxzKGVsZW1lbnQpKXsKLQkJCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQkJaWYoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciljbG9zZUVsZW1lbnQpLmdldE93bmVyKCkKLQkJCQkJCQkJCWluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQkJaWYoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCQkJCQkJCQljbG9zZUVsZW1lbnQpLmdldE93bmVyKCkpLmdldE93bmVyKCkuZXF1YWxzKGVsZW1lbnQpKQotCQkJCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCUNvbGxlY3Rpb24gYyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJCQlpZihjICE9IG51bGwgJiYgYy5jb250YWlucyhjbG9zZUVsZW1lbnQpKXsKLQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGJhc2UgYWN0aXZpdHkgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKiAJCQlCYXNlIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0QmFzZUFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5KXsKLQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0JCQkJVmFyaWFiaWxpdHlUeXBlLk5BKSkgewotCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgZGlhZ3JhbSBlZGl0b3JzCi0JICogCi0JICogQHBhcmFtIGNsb3NlRWxlbWVudAotCSAqIEBwYXJhbSBjbG9zZUVkaXRvclJlZnMKLQkgKiAgQGRlcHJlY2F0ZWQgKHNlZTogIHtAbGluayBEaWFncmFtRWRpdG9ySGVscGVyfSkKLQkgKiAgCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlRGlhZ3JhbUVkaXRvcnMoT2JqZWN0IGNsb3NlRWxlbWVudCwgamF2YS51dGlsLkxpc3QgY2xvc2VFZGl0b3JSZWZzKSB7Ci0JCWNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmIChiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlpZihlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCQkJY2xvc2VEaWFncmFtRWRpdG9ycyhwYXJlbnQsIGNsb3NlRWRpdG9yUmVmcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKSB7Ci0JCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBjaGVjayB3aGV0aGVyIGVsZW1lbnQgaXMgY2hpbGQgb2YgY2xvc2VFbGVtZW50Ci0JCQkJCQkvLyBkaXJlY3RseS9pbmRpcmVjdGx5Ci0JCQkJCQlpZiAoY2xvc2VFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJUHJvY2Vzc1V0aWwuZ2V0Q2hpbGRFbGVtZW50cygKLQkJCQkJCQkJCShBY3Rpdml0eSkgY2xvc2VFbGVtZW50LCBBY3Rpdml0eS5jbGFzcywKLQkJCQkJCQkJCWNvbGxlY3Rpb24pOwotCQkJCQkJCWlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQkJcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIERpYWdyYW0gZWRpdG9ycyBvZiBvYmplY3QgaXRzZWxmIHdpbGwgYmUgY2xvc2VkLiBBbmQgUGFyZW50IGRpYWdyYW0gZWRpdG9ycyAKLQkgKiB3aWxsIGJlIHJlZnJlc2hlZC4gIGNvZGUgbm90IHRlc3RlZCB1c2UgcmVmcmVzaE9wZW5EaWFncmFtRWRpdG9ycyBtZXRob2QuCi0JICogTm90IHVzZWQgY3VycmVudGx5Ci0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jRGlhZ3JhbUVkaXRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlqYXZhLnV0aWwuTGlzdCBjbG9zZUVkaXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmEudXRpbC5MaXN0IHJlZnJlc2hFZGl0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlZGl0b3JFbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmKGJpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCl7Ci0JCQkJCQllZGl0b3JFbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQllZGl0b3JFbGVtZW50ID0gYmlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChkaWFncmFtSW5wdXQgIT0gbnVsbCkgewotCQkJCQkJZWRpdG9yRWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoZWRpdG9yRWxlbWVudCAhPSBudWxsKXsKLQkJCQkJaWYoZWRpdG9yRWxlbWVudC5lcXVhbHMob2JqZWN0KSl7Ci0JCQkJCQljbG9zZUVkaXRvcnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCX1lbHNlewotCQkJCQkJaWYoZWRpdG9yRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCQlpZigoKEFjdGl2aXR5KWVkaXRvckVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY29udGFpbnMob2JqZWN0KSkKLQkJCQkJCQkJcmVmcmVzaEVkaXRvcnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJCU9iamVjdCBsb2NhbCA9IG9iamVjdDsKLQkJCQkJCQkJd2hpbGUoKGxvY2FsIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JCQkJCQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilsb2NhbCkuZ2V0T3duZXIoKSE9IG51bGwpewotCQkJCQkJCQkJaWYoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilsb2NhbCkuZ2V0T3duZXIoKQotCQkJCQkJCQkJCQkuZXF1YWxzKGVkaXRvckVsZW1lbnQpKXsKLQkJCQkJCQkJCQlyZWZyZXNoRWRpdG9ycy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWxvY2FsID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilsb2NhbCkuZ2V0T3duZXIoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX1lbHNlIGlmKGVkaXRvckVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJQ29sbGVjdGlvbiBjID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillZGl0b3JFbGVtZW50KS5nZXRDaGlsZHJlbihlZGl0b3JFbGVtZW50KTsKLQkJCQkJCQlpZihjICE9IG51bGwgJiYgYy5jb250YWlucyhvYmplY3QpKXsKLQkJCQkJCQkJcmVmcmVzaEVkaXRvcnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIENsb3NlIGVkaXRvciByZWZlcmVuY2VzIGFuZCByZWZyZXNoIGVkaXRvcnMuCi0JCWludCBzaXplID0gY2xvc2VFZGl0b3JzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JCXJlZmVyZW5jZXMgPSBudWxsOwotCQkKLQkJc2l6ZSA9IHJlZnJlc2hFZGl0b3JzLnNpemUoKTsKLQkJLy9JRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSAoSUVkaXRvclJlZmVyZW5jZSkgcmVmcmVzaEVkaXRvcnMuZ2V0KGkpOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmKGVkaXRvciBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvciApewotCQkJCSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWVkaXRvcikucmVmcmVzaERpYWdyYW0oKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3dQcm9ibGVtc1ZpZXcoKSB7Ci0gCQlTYWZlVXBkYXRlQ29udHJvbGxlcgotCQkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSAhPSBudWxsICYmCi0JCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSVZpZXdQYXJ0IHZpZXcgPSBwYWdlLmZpbmRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCQkJCQlpZiAodmlldyA9PSBudWxsKSB7Ci0JCQkJCQkJcGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBjb3VsZG4ndCBvcGVuIHRoZQotCQkJCQkvLyBwcm9ibGVtIHZpZXcsIHRvbwotCQkJCQkvLyBiYWQuLgotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlMYXlvdXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUxheW91dEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWZlMGM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUxheW91dEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5Gb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogTGF5b3V0IEhlbHBlciBmb3IgVUkuIAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVUlMYXlvdXRIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcG9zaXRlIGVkaXRvckNvbXBvc2l0ZSwgcHJldmlld0NvbXBvc2l0ZTsKLQotCXByaXZhdGUgc3RhdGljIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlIHRhYnMgaW4gZm9ybSAKLQkgKiBAcGFyYW0gZm9ybQotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVRhYnMoU2Nyb2xsZWRGb3JtIGZvcm0sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJLy8gY3JlYXRlIHRhYmZvbGRlcgotCQl0YWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihmb3JtLmdldEJvZHkoKSwgU1dULkZMQVQgfCBTV1QuVE9QKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEodGQpOwotCi0JCS8vIHNldCB0YWJmb2xkZXIgYmFja2dyb3VuZCBjb2xvcgotCQlDb2xvciBzZWxlY3RlZENvbG9yID0gdG9vbGtpdC5nZXRDb2xvcnMoKQotCQkJCS5nZXRDb2xvcihGb3JtQ29sb3JzLlNFUEFSQVRPUik7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKG5ldyBDb2xvcltdIHsgc2VsZWN0ZWRDb2xvciwKLQkJCQl0b29sa2l0LmdldENvbG9ycygpLmdldEJhY2tncm91bmQoKSB9LCBuZXcgaW50W10geyA1MCB9KTsKLQotCQkvLyBjcmVhdGUgZWRpdG9yIHRhYiBpdGVtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjb21wb3NpdGUKLQkJQ1RhYkl0ZW0gZWRpdG9ySXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMKTsKLQkJZWRpdG9ySXRlbS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5FRElUT1JfVEVYVCk7Ci0JCWVkaXRvckNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0KTsKLQkJZWRpdG9ySXRlbS5zZXRDb250cm9sKGVkaXRvckNvbXBvc2l0ZSk7Ci0KLQkJLy8gY3JlYXRlIHByZXZpZXcgdGFiIGl0ZW0gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBvc2l0ZQotCQlDVGFiSXRlbSBwcmV2aWV3SXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMKTsKLQkJcHJldmlld0l0ZW0uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuUFJFVklFV19QQUdFX1RJVExFKTsKLQkJcHJldmlld0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0KTsKLQkJcHJldmlld0l0ZW0uc2V0Q29udHJvbChwcmV2aWV3Q29tcG9zaXRlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih0YWJGb2xkZXIpOwotCi0JCXRvb2xraXQuYWRhcHQodGFiRm9sZGVyLCB0cnVlLCB0cnVlKTsKLQotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBjb21wb3NpdGUgb24gdGhlIGZvcm0KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEByZXR1cm4KLQkgKiAJCQlVSSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHRhYkZvbGRlcik7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBlZGl0b3IgY29tcG9zaXRlCi0JICogCi0JICogQHJldHVybgotCSAqIAkJVUkgQ29tcG9zaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgZ2V0RWRpdG9yQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gZWRpdG9yQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcmV2aWV3IGNvbXBvc2l0ZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCVByZXZpZXcgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgZ2V0UHJldmlld0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHByZXZpZXdDb21wb3NpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0NTY1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIEF1dGhvcmluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0QmFzZVZpZXcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RCYXNlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGQ1YmUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RCYXNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLklDb250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIE1ldGhvZCBMaWJyYXJ5IHZpZXdzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlVmlldyBleHRlbmRzIFNhdmVhYmxlTGlicmFyeVZpZXdQYXJ0Ci0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLAotCQlJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcm90ZWN0ZWQgVUlBY3Rpb25EaXNwYXRjaGVyIGFjdGlvbkRpc3BhdGNoZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgYWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCA9PSBBYnN0cmFjdEJhc2VWaWV3LnRoaXMpIHsKLQkJCQloYW5kbGVBY3RpdmF0ZShwYXJ0KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCQkKLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIG9mIHRoaXMgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vIFNldCB0aGUgcmlnaHQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgZWRpdGluZyBkb21haW4uCi0JCWVkaXRpbmdEb21haW4uc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCi0JCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLgotCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7Ci0JCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7Ci0KLQkJCS8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuCi0JCQlzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JLy8gdGhpcyB3aW5kb3cgbGlzdGVuZXIgaXMgZm9yIG9wZW5pbmcgdGhlIGxpYnJhcnkgd2hlbiB0aGUgCi0JLy8gdmlldyBmaXJzdCBiZWNvbWVzIHZpc2libGUKLQlwcml2YXRlIElXaW5kb3dMaXN0ZW5lciB3aW5kb3dMaXN0ZW5lciA9IG5ldyBJV2luZG93TGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCXdpbmRvdy5nZXRXb3JrYmVuY2goKS5yZW1vdmVXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLQkJCWJvb2xlYW4gaXNWaXNpYmxlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5pc1BhcnRWaXNpYmxlKEFic3RyYWN0QmFzZVZpZXcudGhpcyk7Ci0JCQlpZiAoaXNWaXNpYmxlKSB7Ci0JCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLnN0YXJ0dXBPcGVuTGlicmFyeSgpOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkTWV0aG9kVmlld1BhcnRMaXN0ZW5lcihnZXRWaWV3SWQoKSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyRmFjdG9yeSBjb250ZW50UHJvdmlkZXJGYWN0b3J5OwotCi0JLyoqCi0JICogRGlzcGxheXMgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfRmlsZUNvbmZsaWN0X2xhYmVsOyAKLQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9XQVJOX0ZpbGVDb25mbGljdDsgCi0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVByb21wdCgKLQkJCQl0aXRsZSwgbXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGNoYW5nZWQgcmVzb3VyY2VzIHdoZW4gdGhpcyB2aWV3IGlzIGFjdGl2YXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXQoKTsKLQotCQlhY3Rpb25EaXNwYXRjaGVyID0gbmV3IFVJQWN0aW9uRGlzcGF0Y2hlcih0aGlzKTsKLQotCQkvLyBDcmVhdGUgdGhlIHZpZXdlci4KLQkJY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yLgotCQl0cnkgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IgPSBjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuaW5pdChnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKSwgZ2V0U2l0ZSgpCi0JCQkJCS5nZXRQYWdlKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJLy8gQWRkIGEgc2VsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHZpZXdlci4KLQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKAotCQkJCQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKLQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIEFkZCBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lci4KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQotCQlPYmplY3QgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJc2V0SW5wdXRGb3JWaWV3ZXIobGlicmFyeSk7Ci0JCQlMaWJyYXJ5VUlVdGlsLnVwZGF0ZVNoZWxsVGl0bGUoKTsKLQkJfQotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQl3b3JrYmVuY2guYWRkV2luZG93TGlzdGVuZXIod2luZG93TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJZWRpdGluZ0RvbWFpbiA9IG1hbmFnZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCUlWaWV3U2l0ZSBzaXRlID0gKElWaWV3U2l0ZSkgdGhpcy5nZXRTaXRlKCk7Ci0JCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7Ci0JCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCB2aWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQl0cnkgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyh0aGlzKTsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyI2dldEVkaXRpbmdEb21haW4oKQotCSAqLwotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlhY3Rpb25EaXNwYXRjaGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJYWN0aW9uRGlzcGF0Y2hlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCQlpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBhY3Rpb25EaXNwYXRjaGVyLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKHRoaXMsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihzb3VyY2UsIHNlbGVjdGlvbik7Ci0JCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihzb3VyY2UsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldElucHV0Rm9yVmlld2VyKGxpYnJhcnkpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlhY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVWaWV3KEFic3RyYWN0QmFzZVZpZXcudGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2NvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoCi0JCS8vIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCi0JCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGFjdGlvbkJhckNvbnRyaWJ1dG9yLmdldEFjdGl2ZVZpZXcoKSA9PSB0aGlzKSB7Ci0JCQlhY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVWaWV3KG51bGwpOwotCQl9Ci0KLQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCXdvcmtiZW5jaC5yZW1vdmVXaW5kb3dMaXN0ZW5lcih3aW5kb3dMaXN0ZW5lcik7Ci0JCX0KLQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgotCSAqLwotCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCi0JCQkJCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsCi0JCQkJCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLAotCQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJCQkJaWYgKGFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLAotCQkJCQkJCQlhY3Rpb25CYXJzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXIjZ290b01hcmtlcihJTWFya2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKLQkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZSgKLQkJCQkJCUVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7Ci0JCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7Ci0JCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zCi0JCQkJCQkJCS5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZmluYWwgQ29sbGVjdGlvbiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YKLQkJCQkJLy8gdGhlIGVkaXRvci4KLQkJCQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCXRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRDb250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlpZihjb250ZW50UHJvdmlkZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCS8vIFByb2Nlc3MgdGhlIGNvbnRyaWJ1dG9ycy4KLQkJCS8vCi0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybQotCQkJCQkuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJCS5nZXRFeHRlbnNpb25Qb2ludChBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCQkiY29udGVudFByb3ZpZGVyRmFjdG9yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJT2JqZWN0IGV4dCA9IG51bGw7Ci0JCQkJZXh0X3dhbGs6Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgdmlld0lkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChnZXRWaWV3SWQoKS5lcXVhbHModmlld0lkKSkgewotCQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkKLQkJCQkJCQkJCQkJLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCQlpZiAoZXh0IGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlckZhY3RvcnkpIHsKLQkJCQkJCQkJCQljb250ZW50UHJvdmlkZXJGYWN0b3J5ID0gKElDb250ZW50UHJvdmlkZXJGYWN0b3J5KSBleHQ7Ci0JCQkJCQkJCQkJYnJlYWsgZXh0X3dhbGs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyRmFjdG9yeTsJCQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgY3JlYXRlQ29udGVudFByb3ZpZGVyKCkgewotCQlJQ29udGVudFByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0Q29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwkJCi0JCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGNwID0gbnVsbDsKLQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IGZhY3RvcnkuY3JlYXRlUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHRoaXMpOwotCQkJaWYoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHsKLQkJCQljcCA9IChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBjcCAhPSBudWxsID8gY3AgOiBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBWaWV3ZXIgZ2V0Vmlld2VyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2aWV3ZXIgaW4gdGhlIGdpdmVuIHBhcmVudAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbmV3IGFjdGlvbkJhckNvbnRyaWJ1dGVyCi0JICovCi0JcHVibGljIGFic3RyYWN0IElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGlucHV0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIG1vZGVsIG5ldyBpbnB1dCBmb3IgdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldElucHV0Rm9yVmlld2VyKE9iamVjdCBtb2RlbCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZpZXdJZCgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdExvY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdExvY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDYwMDQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RMb2NrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMb2NrZXIgewotCQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTG9ja2VkKE9iamVjdCBzZWxlY3Rpb24pOyAKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkODMxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuSWRlbnRpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlBlcnNwZWN0aXZlTGlzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkNvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSU1lbnVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdDb3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLkxpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Db25maWd1cmF0aW9uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5JQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuQ2xpcGJvYXJkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiA8cD4KLSAqIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgc2V0IHZpYSB0aGUgQ29uZmlndXJhdGlvbiBjb21ib2JveCBpbiB0aGUgc3lzdGVtCi0gKiB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXcgZXh0ZW5kcyBBYnN0cmFjdEJhc2VWaWV3IGltcGxlbWVudHMKLQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGUgdmlldyBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gQ29uZmlndXJhdGlvblZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnTmFtZTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBJRG91YmxlQ2xpY2tMaXN0ZW5lciBkb3VibGVDbGlja0xpc3RlbmVyOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGNvbmZpZ0ZpbHRlcjsKLQotCXByaXZhdGUgTGlzdDxBY3Rpb24+IG1lbnVBY3Rpb25Qcm92aWRlcnM7Ci0JCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlldygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjaW5pdChJVmlld1NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlKTsKLQkJY3JlYXRlQWN0aW9ucyhzaXRlKTsKLQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9WSUVXX0NPTlRFWFQpOwotCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LAotCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJYWRhcHRlckZhY3RvcnkgPSAoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZWRpdGluZ0RvbWFpbgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCS8vIE9wZW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJc2V0Q29uZmlndXJhdGlvbihudWxsKTsKLQkJCi0JCWxvYWRNZW51QWN0aW9uUHJvdmlkZXJzKCk7Ci0JCUlUb29sQmFyTWFuYWdlciBtZ3I9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51QWN0aW9uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCU9iamVjdCBhY3Rpb25Qcm92aWRlciAgPSBtZW51QWN0aW9uUHJvdmlkZXJzLmdldChpKTsKLQkJCQlpZiAoYWN0aW9uUHJvdmlkZXIgaW5zdGFuY2VvZiBBY3Rpb24pIHsKLQkJCQkJbWdyLmFkZCgoQWN0aW9uKWFjdGlvblByb3ZpZGVyKTsKLQkJCQkJaWYgKGFjdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgSU1lbnVBY3Rpb24pCi0JCQkJCQkoKElNZW51QWN0aW9uKSBhY3Rpb25Qcm92aWRlcikuaW5pdCh0aGlzKTsKLQkJCQl9Ci0JCQkJCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiogCi0JICogR2V0IGFsbCBtZW51IHByb3ZpZGVycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3Q8QWN0aW9uPiBsb2FkTWVudUFjdGlvblByb3ZpZGVycygpIHsKLQkJaWYgKG1lbnVBY3Rpb25Qcm92aWRlcnMgPT0gbnVsbCkgewotCQkJbWVudUFjdGlvblByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9ucyhBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgImNvbmZpZ3VyYXRpb25WaWV3TWVudVByb3ZpZGVyIiwgQWN0aW9uLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAkKLQkJfQotCQlyZXR1cm4gbWVudUFjdGlvblByb3ZpZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZihjb25maWcgIT0gbnVsbCAmJiBjb25maWcuZUNvbnRhaW5lcigpICE9IGxpYnJhcnkpIHsKLQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCX0KLQkJLy8gQWRkIGEgbGlicmFyeSBjaGFuZ2UgbGlzdGVuZXIuCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIjbGlicmFyeUNoYW5nZWQoaW50LAotCSAqICAgICAgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQlzd2l0Y2ggKG9wdGlvbikgewotCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQ6Ci0JCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJaWYgKCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJZ2V0Q3VycmVudENvbmZpZygpKSkgewotCQkJCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkvLyBCdWd6aWxsYSBkZWZlY3QgMTY0NzM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VEOiAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7ICAKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgeyAgICAgICAgICAgICAgIAotCQkJCQkJaWYgKCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCQkuZXF1YWxzKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSkpIHsgICAgICAgICAgICAgIAotCQkJCQkJCXNldENvbnRlbnREZXNjcmlwdGlvbigoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpICAgCi0JCQkJCQkJCQkuZ2V0TmFtZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2NvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgdmlld2VkIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRDb25maWcoKSB7Ci0JCXJldHVybiBjb25maWdOYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyh0aGlzKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpCi0JCQlhY3Rpb25CYXJDb250cmlidXRvci5kaXNhYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQkJZWxzZQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29udHJvbHMuCi0JCUNvbXBvc2l0ZSBjb250ZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250ZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb250ZW50KTsKLQkJdHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBBZGQgZHJhZy1hbmQtZHJvcCBzdXBwb3J0LgotCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCksCi0JCQkJTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXRyZWVWaWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLAotCQkJCW5ldyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIodHJlZVZpZXdlcikpOwotCi0JCS8vIEFkZCBhIGRvdWJsZSBjbGljayBsaXN0ZW5lci4KLQkJZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5oYW5kbGVEb3VibGVDbGlja0V2ZW50KGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCi0JCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGFjdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQWN0aW9ucyhJVmlld1NpdGUgdmlld1NpdGUpIHsKLQkJSUFjdGlvbiBlZGl0QWN0aW9uID0gbmV3IEFjdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25MYWJlbF9lZGl0KSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmVkaXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJfQotCQl9OwotCQllZGl0QWN0aW9uCi0JCQkJLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRDb25maWd1cmF0aW9uX3Rvb2x0aXApOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQkJLy8gUHJldmVudCBtZW1vcnkgbGVhay4KLQkJY29uZmlnTmFtZSA9IG51bGw7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXJGYWN0b3J5KS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShudWxsKTsKLQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSB0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSB0cmVlVmlld2VyLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCWFjdGlvbkRpc3BhdGNoZXIuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsdGVyIGNyZWF0ZUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJQ29udGVudFByb3ZpZGVyRmFjdG9yeSBjcEZhY3RvcnkgPSBnZXRDb250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkJaWYoY3BGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZpbHRlciA9IGNwRmFjdG9yeS5jcmVhdGVGaWx0ZXIoY29uZmlnLCB0cmVlVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIgOiBuZXcgQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIoY29uZmlnLCB0cmVlVmlld2VyKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gTWV0aG9kIENvbmZpZ3VyYXRpb24gYXMgdGhpcyB2aWV3ZXIncyBpbnB1dAotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUNvbnRyb2wgY3RybCA9IHRoaXMuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodHJlZVZpZXdlci5nZXRJbnB1dCgpID09IGNvbmZpZykKLQkJCXJldHVybjsKLQkJU3RyaW5nIHRpdGxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCXRoaXMuY29uZmlnTmFtZSA9IGNvbmZpZy5nZXROYW1lKCk7Ci0JCQljb25maWdGaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoY29uZmlnKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KGNvbmZpZ0ZpbHRlcik7Ci0JCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsJCQkKLQkJCWlmKGNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJY29udGVudFByb3ZpZGVyID0gY3JlYXRlQ29udGVudFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb250ZW50UHJvdmlkZXIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIoY29uZmlnLAotCQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQkJdGl0bGUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQl9IGVsc2UgewotCQkJLy8gUHJldmVudCBtZW1vcnkgbGVhay4KLQkJCWNvbmZpZ05hbWUgPSBudWxsOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KG51bGwpOwotCQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSB0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCUlCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVtcHR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJCWFjdGlvbkRpc3BhdGNoZXIuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCX0KLQotCQl0cmVlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JCXNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHZpZXdlcidzIGlucHV0IHRvIHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCWNvbmZpZ05hbWUgPSBuYW1lOwotCi0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCWNvbmZpZ05hbWUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbmZpZ05hbWUgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmNvbmZpZ05hbWUgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRvdWJsZUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgQ29uZmlndXJhdGlvblZpZXcgb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uVmlldyBnZXRWaWV3KCkgewotLy8JCXRyeSB7Ci0vLwkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0vLwkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLS8vCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotLy8JCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KFZJRVdfSUQpOwotLy8JCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotLy8JCQkJCXZpZXcgPSBhY3RpdmVQYWdlLnNob3dWaWV3KFZJRVdfSUQpOwotLy8JCQkJfQotLy8JCQkJcmV0dXJuIChDb25maWd1cmF0aW9uVmlldykgdmlldzsKLS8vCQkJfQotLy8KLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWJvb2xlYW4gc2hvdyA9IFZpZXdIZWxwZXIuaXNWaWV3SW5DdXJyZW50UGVyc3BlY3RpdmUoVklFV19JRCk7Ci0JCXJldHVybiAoQ29uZmlndXJhdGlvblZpZXcpVmlld0hlbHBlci5maW5kVmlldyhWSUVXX0lELCBzaG93KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNnZXRWaWV3ZXIoKQotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQkJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCQlwcml2YXRlIExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbjsKLQotCQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdBY3Rpb25CYXJDb250cmlidXRvcihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4pOwotCQkJCi0JCQkvLyBkb24ndCBzaG93IHZhbGlkYXRlIGFjdGlvbgotCQkJLy8KLQkJCXZhbGlkYXRlQWN0aW9uID0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChJQWN0aW9uQmFycykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJCWNvcHlBY3Rpb24gPSBjcmVhdGVDb3B5QWN0aW9uKCk7Ci0JCQljb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJY29weUFjdGlvbik7Ci0KLQkJCXZpZXdBY3Rpb25CYXJzID0gYWN0aW9uQmFyczsKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uID0gbmV3IENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJCSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMub3BlbkVsZW1lbnQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uKTsKLQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdik7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJCUxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uQUNUSU9OX0lELAotCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjYWN0aXZhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCQlhY3RpdmVWaWV3UGFydC5hZGRQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbik7Ci0JCQljb3B5QWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNkZWFjdGl2YXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCQlhY3RpdmVWaWV3UGFydC5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdWaWV3RWRpdEFjdGlvbik7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pOwotCQkJY29weUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvcHlBY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3VwZGF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlciA/IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0Ci0JCQkJCTogYWN0aXZlVmlld1BhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uID8gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24KLQkJCQkJOiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCWNvcHlBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNkaXNhYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZW5hYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKSB7Ci0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI21lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkvLyBBZGQgb3VyIHN0YW5kYXJkIG1hcmtlcnMuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBBZGQgb3VyIG90aGVyIHN0YW5kYXJkIG1hcmtlci4KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjb25maWdWaWV3RWRpdEFjdGlvbikpOwotCQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbikpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVDb3B5QWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IExpYnJhcnlWaWV3Q29weUFjdGlvbigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCXJldHVybiBuZXcgSWRlbnRpdHlDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTdHJpbmcgbGlua3MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKElkZW50aXR5Q29tbWFuZCkgY29tbWFuZCkKLQkJCQkJCQkuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgaXRlbSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVtOwotCQkJCQkJCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCQkJCS5nZXRVcmwoZSwgbnVsbCwgImh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJbGlua3MgKz0gU3RyVXRpbC5MSU5FX0ZFRUQ7Ci0JCQkJCQkJfQotCQkJCQkJCWxpbmtzICs9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRMaW5rKGUsIHRydWUsCi0JCQkJCQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCUNsaXBib2FyZFV0aWwuY29weVRleHRIVE1MVG9DbGlwYm9hcmQobGlua3MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2NyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uVmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKGVkaXRpbmdEb21haW4pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I3NldElucHV0Rm9yVmlld2VyKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpIHsKLQkJaWYgKChtb2RlbCA9PSBudWxsKSB8fCAobW9kZWwgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbikgbW9kZWwpOwotCQl9IGVsc2UgewotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZihjb25maWdGaWx0ZXIgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uVmlld0ZpbHRlcikgewotCQkJKChDb25maWd1cmF0aW9uVmlld0ZpbHRlciljb25maWdGaWx0ZXIpLnJlZnJlc2hWaWV3ZXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld0lkKCkgewotCQlyZXR1cm4gVklFV19JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYzliODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVmlld0ZpbHRlciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZyk7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlciAhPSBudWxsICYmICB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHsKLS8vCQlpZiAodmlld2VyID09IG51bGwpIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLQkJaWYgKCFpc1ZhbGlkVmlld2VyKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJcmVmcmVzaFZpZXdlcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hWaWV3ZXIoKSB7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmOThlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgc2VsZWN0YWJsZSBwbHVnLWlucyBhbmQgcGFja2FnZXMgb2YgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiBhCi0gKiB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXdlciBleHRlbmRzIENoZWNrYm94VHJlZVZpZXdlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3QgZWxlbWVudCkgewotCQlzdXBlci5leHBhbmRUb0xldmVsKGVsZW1lbnQsIDApOwotCQlXaWRnZXQgY3RybCA9IHN1cGVyLmZpbmRJdGVtKGVsZW1lbnQpOwotCQlpZiAoY3RybCAhPSBudWxsKSB7Ci0JCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXRlbXMuYWRkKGN0cmwpOwotCQkJc3VwZXIuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQkJCXRoaXMuZ2V0VHJlZSgpLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGZpbmFsIE9iamVjdCBlbGVtZW50LCBmaW5hbCBib29sZWFuIHVwZGF0ZUxhYmVscykgewotCQlPYmplY3RbXSBjaGVja2VkID0gdGhpcy5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJc3VwZXIucmVmcmVzaChlbGVtZW50LCB1cGRhdGVMYWJlbHMpOwotCQl0aGlzLnNldENoZWNrZWRFbGVtZW50cyhjaGVja2VkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29udGVudFZpZXcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29udGVudFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4OGFiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbnRlbnRWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUltYWdlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhlIENvbnRlbnQgdmlldy4KLSAqIDxwPgotICogRGlzcGxheXMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLQkvKioKLQkgKiBUaGUgdmlldyBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gQ29udGVudFZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBFbGVtZW50SFRNTFZpZXdlciBjb250ZW50Vmlld2VyOwotCi0JcHJpdmF0ZSBPYmplY3QgZGlzcGxheWVkRWxlbWVudDsKLQotCXByaXZhdGUgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIENvbnRlbnRWaWV3ICYmIHBhcnQgPT0gQ29udGVudFZpZXcudGhpcykgewotCQkJCWhhbmRsZVNlbGVjdGlvbihVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZWxlY3Rpb25Tb3VyY2UoKSwgVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkKLQkJCQkgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0JfTsKLQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJaGFuZGxlU2VsZWN0aW9uKGV2ZW50LmdldFNvdXJjZSgpLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotLy8JCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRAotLy8JCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVEKSB7Ci0vLwkJCQlpZiAoY29udGVudFZpZXdlciAhPSBudWxsKSB7Ci0vLwkJCQkJY29udGVudFZpZXdlci5zZXRIdG1sQnVpbGRlcihuZXcgSHRtbEJ1aWxkZXIoKSk7Ci0vLwkJCQkJY29udGVudFZpZXdlci5nZXRCcm93c2VyKCkucmVkcmF3KCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQotCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsICYmIGRpc3BsYXllZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChjaGFuZ2VkSXRlbXMuY29udGFpbnMoZGlzcGxheWVkRWxlbWVudCkpIHsKLQkJCQkJZGlzcGxheWVkRWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJY29udGVudFZpZXdlci5nZXRCcm93c2VyKCkuc2V0VXJsKCJhYm91dDpibGFuayIpOyAvLyROT04tTkxTLTEkCi0JCQlkaXNwbGF5ZWRFbGVtZW50ID0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCWNsZWFudXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQljbGVhbnVwKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQljbGVhbnVwKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKLQkJCWlmIChjb250ZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQljb250ZW50Vmlld2VyLnNldEh0bWxCdWlsZGVyKG5ldyBIdG1sQnVpbGRlcigpKTsKLQkJCQljb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKS5yZWRyYXcoKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JLy8gUGFnZSBuYXZpZ2F0aW9uIGFjdGlvbnMuCi0JcHJpdmF0ZSBBY3Rpb24gYmFja0FjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIGZvcndhcmRBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBzdG9wQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gcmVmcmVzaEFjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIHByaW50QWN0aW9uOwotCi0JLy8gQSBoaWRkZW4gY29tcG9zaXRlIHRvIGhvbGQgdGhlIGRpYWdyYW0gdmlld2VyIGZvciBkaWFncmFtIGltYWdlCi0JLy8gZ2VuZXJhdGlvbi4KLQlwcml2YXRlIENvbXBvc2l0ZSBkaWFncmFtVmlld2VySG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJY29udGVudFZpZXdlciA9IG5ldyBFbGVtZW50SFRNTFZpZXdlcihwYXJlbnQpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsgLy8gc2l6ZQotCQkJLy8gY2FuJ3QgYmUKLQkJCS8vIDAsMAotCQkJLy8gb3RoZXJ3aXNlCi0JCQkvLyB0aGUKLQkJCS8vIGRpYWdyYW0KLQkJCS8vIHdpbGwgbm90Ci0JCQkvLyBiZQotCQkJLy8gcGFpbnRlZAotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQkvLyBDcmVhdGUgdGhlIHBhZ2UgbmF2aWdhdGlvbiB0b29sIGJ1dHRvbnMuCi0JCQljcmVhdGVBY3Rpb25zKCk7Ci0KLQkJCS8vIEFkZCBhIHBhcnQgbGlzdGVuZXIgdG8gbW9uaXRvciBwYXJ0IGFjdGl2YXRpb24gYW5kIHVwZGF0ZSB0aGlzCi0JCQkvLyB2aWV3Ci0JCQkvLyBhcyBhbmQgd2hlbiBuZWVkZWQuCi0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIoCi0JCQkJCXBhcnRMaXN0ZW5lcik7Ci0KLQkJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5hZGRQZXJzcGVjdGl2ZUxpc3RlbmVyKAotCQkJCQluZXcgSVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYywgU3RyaW5nIGlkKSB7Ci0JCQkJCQkJaWYgKGRlc2MuZ2V0SWQoKS5lcXVhbHMoCi0JCQkJCQkJCQlCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCQkJCQlpZiAoaWQKLQkJCQkJCQkJCQkuZXF1YWxzKElXb3JrYmVuY2hQYWdlLkNIQU5HRV9FRElUT1JfQVJFQV9TSE9XKSkgewotCQkJCQkJCQkJcGFnZS5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMud2FybmluZ0RpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkRWRpdG9yVG9QZXJzcGVjdGl2ZVdhcm5pbmdfbXNnKTsgCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQkvLyBBZGQgc2VsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0byB1cGRhdGUgdGhpcyB2aWV3IGFzIGFuZCB3aGVuCi0JCQkvLyBuZWVkZWQuCi0JCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJCXNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYnJhcnlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPOiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZy4KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQljb250ZW50Vmlld2VyLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJyYXJ5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcigKLQkJCQlwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGFjdGlvbnMgZm9yIHRoaXMgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQliYWNrQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBjb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuYmFjaygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYmFja0FjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tfdGV4dCk7IAotCQliYWNrQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tfdGV4dCk7IAotCQliYWNrQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQkFDSykpOwotCi0JCWZvcndhcmRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlmb3J3YXJkQWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9yd2FyZF90ZXh0KTsgCi0JCWZvcndhcmRBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9yd2FyZF90ZXh0KTsgCi0JCWZvcndhcmRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9GT1JXQVJEKSk7Ci0KLQkJc3RvcEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gY29udGVudFZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLnN0b3AoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXN0b3BBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5zdG9wX3RleHQpOyAKLQkJc3RvcEFjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5zdG9wX3RleHQpOyAKLQkJc3RvcEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfU1RPUCk7Ci0KLQkJcmVmcmVzaEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gQnJvd3NlciBicm93c2VyID0gY29udGVudFZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJLy8gaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCS8vIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCS8vIH0KLQotCQkJCS8vIG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgY29udGVudAotCQkJCWNvbnRlbnRWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9OwotCQlyZWZyZXNoQWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaF90ZXh0KTsgCi0JCXJlZnJlc2hBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaF90ZXh0KTsgCi0JCXJlZnJlc2hBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX1JFRlJFU0gpOwotCi0JCXByaW50QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQljb250ZW50Vmlld2VyLnByaW50KCk7Ci0JCQl9Ci0JCX07Ci0JCXByaW50QWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJpbnRfdGV4dCk7IAotCQlwcmludEFjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5wcmludF90ZXh0KTsgCi0JCXByaW50QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19QUklOVCk7Ci0KLQkJSUFjdGlvbkJhcnMgYmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlJVG9vbEJhck1hbmFnZXIgbWFuYWdlciA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJbWFuYWdlci5hZGQoYmFja0FjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKGZvcndhcmRBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChzdG9wQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQocmVmcmVzaEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHByaW50QWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpZXdWaXNpYmxlKCkgewotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KGdldFZpZXdJZCgpKTsKLQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBMaWJyYXJ5IG9yIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uIGluIHRoZSBMaWJyYXJ5IG9yIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb24oT2JqZWN0IHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICFpc1ZpZXdWaXNpYmxlKCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCU9iamVjdFtdIHNlbGVjdGVkRWxlbWVudHMgPSBzZWwudG9BcnJheSgpOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMgIT0gbnVsbCAmJiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07Ci0JCQkJCi0JCQkJLy8gZG9uJ3QgdW53cmFwIHRoZSBvYmplY3QuIAotCQkJCS8vIEZvciBhY3Rpdml0eSwgd2UgbmVlZCB0byB3cmFwcGVkIGl0ZW0gcHJvdmlkZXIgdG8gZ2V0IHRoZSBzdXBwcmVzcyBzdGF0dXMuCi0JCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoc2VsZWN0ZWRFbGVtZW50KTsKLQkJCQlpZiAoZGlzcGxheWVkRWxlbWVudCAhPSBudWxsICYmIGRpc3BsYXllZEVsZW1lbnQgPT0gZWxlbWVudCkgewotCQkJCQlkaXNwbGF5ZWRFbGVtZW50ID0gbnVsbDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZGlzcGxheUNvbnRlbnRQYWdlKHNvdXJjZSwgZWxlbWVudCkpIHsKLQkJCQkJZGlzcGxheWVkRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJfQotCQkJfWVsc2V7Ci0JCQkJY29udGVudFZpZXdlci5nZXRCcm93c2VyKCkuc2V0VXJsKCJhYm91dDpibGFuayIpOyAvLyROT04tTkxTLTEkCi0JCQkJZGlzcGxheWVkRWxlbWVudCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbmZpZ1NvdXJjZShPYmplY3Qgc291cmNlKSB7Ci0JCXJldHVybiAoc291cmNlICE9IG51bGwpICYmIChzb3VyY2UgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uVmlldyk7Ci0JfQotCQotCXByb3RlY3RlZCBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKSB7Ci0JCXJldHVybiAJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJLmdldEN1cnJlbnRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld0lkKCkgewotCQlyZXR1cm4gVklFV19JRDsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGNvbnRlbnQgcGFnZSBmb3IgdGhlIGdpdmVuIENvbnRlbnRFbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBMaWJyYXJ5IG9yIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGVkIE1ldGhvZCBlbGVtZW50LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnQgcGFnZSBpcyBkaXNwbGF5ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNwbGF5Q29udGVudFBhZ2UoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHJhd19lbGVtZW50KSB7Ci0JCU9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKHJhd19lbGVtZW50KTsKLQkJZWxlbWVudCA9IFZpZXdIZWxwZXIuaGFuZGxlRGFuZ2xpbmcoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1nciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNCcm93c2luZyA9IFBlcnNwZWN0aXZlVXRpbAotCQkJCS5pc0FjdGl2ZVBlcnNwZWN0aXZlKEJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQlib29sZWFuIGlzQ29uZmlnU291cmNlID0gaXNDb25maWdTb3VyY2Uoc291cmNlKTsKLQotCQkvLyBpZiBpbiBicm93c2luZyBidXQgdGhlIHNvdXJjZSBpcyBub3QgZnJvbSBjb25maWdydWF0aW9uIHZpZXcKLQkJLy8gaWdub3JlIGl0Ci0JCWlmIChpc0Jyb3dzaW5nICYmICFpc0NvbmZpZ1NvdXJjZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGlzQ29uZmlnU291cmNlKSB7Ci0JCQkvLyBHZXQgdGhlIEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCQlsYXlvdXRNZ3IgPSBnZXRMYXlvdXRNZ3IoKTsKLQkJCWlmICggbGF5b3V0TWdyID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQkvLyBBZGQgdGhlIGFjdGl2aXR5IGRpYWdyYW0gc2VydmljZSB0byBnZW5lcmF0ZSBkaWFncmFtIGltYWdlcy4KLQkJCQotCQkJU3RyaW5nIG5ld0RpYWdyYW1zID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygiUFVCTElTSF9ORVdfRElBR1JBTSIpOyAvLyROT04tTkxTLTEkCi0JCQlCb29sZWFuIG5ld0RpYWdyYW0gPSBuZXcgQm9vbGVhbih0cnVlKTsKLQkJCWlmKG5ld0RpYWdyYW1zICE9IG51bGwgJiYgbmV3RGlhZ3JhbXMubGVuZ3RoKCkgPiAwKXsKLQkJCQluZXdEaWFncmFtID0gbmV3IEJvb2xlYW4obmV3RGlhZ3JhbXMpOwotCQkJfQotCQkJaWYobmV3RGlhZ3JhbS5ib29sZWFuVmFsdWUoKSl7Ci0JCQkJRGlhZ3JhbUltYWdlU2VydmljZSBkaWFncmFtU2VydmljZSA9IChEaWFncmFtSW1hZ2VTZXJ2aWNlKSBsYXlvdXRNZ3IKLQkJCQkJLmdldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoKTsKLQkJCQlpZiAoZGlhZ3JhbVNlcnZpY2UgPT0gbnVsbCkgewotCQkJCQlkaWFncmFtU2VydmljZSA9IG5ldyBEaWFncmFtSW1hZ2VTZXJ2aWNlKAotCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0Q29uZmlnKGxheW91dE1nci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQlsYXlvdXRNZ3Iuc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShkaWFncmFtU2VydmljZSk7Ci0JCQkJfQotLy8JCQkJIEZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSAKLQkJCQlib29sZWFuIG9wdGlvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKG9wdGlvbik7Ci0JCQkJCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERpYWdyYW0gCi0JCQkJb3B0aW9uID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihvcHRpb24pOwotCQkJfWVsc2V7Ci0vLwkJCQkgQWRkIHRoZSBhY3Rpdml0eSBkaWFncmFtIHNlcnZpY2UgdG8gZ2VuZXJhdGUgZGlhZ3JhbSBpbWFnZXMuCi0JCQkJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IChBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKSBsYXlvdXRNZ3IKLQkJCQkJCS5nZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCk7Ci0JCQkJaWYgKGRpYWdyYW1TZXJ2aWNlID09IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVNlcnZpY2UgPSBuZXcgQWN0aXZpdHlEaWFncmFtU2VydmljZSgKLQkJCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi0JCQkJYm9vbGVhbiBvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChvcHRpb24pOwotCQkJCQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIAotCQkJCW9wdGlvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24ob3B0aW9uKTsKLQkJCX0KLQkJCQotCQkJCi0JCQkKLQkJfQotCi0JCWNvbnRlbnRWaWV3ZXIuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXRNZ3IpOwotCQljb250ZW50Vmlld2VyLnNob3dFbGVtZW50Q29udGVudChyYXdfZWxlbWVudCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIEhUTUwgY29udGVudCBwYWdlIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEhUTUwgY29udGVudCBwYWdlIGlzIGRpc3BsYXllZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc3BsYXlIVE1MQ29udGVudFBhZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJZWxlbWVudCA9IFZpZXdIZWxwZXIuaGFuZGxlRGFuZ2xpbmcoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCWNvbnRlbnRWaWV3ZXIuc2V0TGF5b3V0TWFuYWdlcihudWxsKTsKLQkJCWNvbnRlbnRWaWV3ZXIuc2hvd0VsZW1lbnRDb250ZW50KGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50SFRNTFZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50SFRNTFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDRiNTRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudEhUTUxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJyb3dzaW5nTGF5b3V0U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5PcGVuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5XaW5kb3dFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogRGlzcGxheXMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgZWxlbWVudCBpbiBhIFNXVCBCcm93c2VyLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SFRNTFZpZXdlciB7Ci0KLS8vCS8vIFRoZSBkZWZhdWx0IEhUTUwgd3JhcHBlcnMgZm9yIGRpc2FibGluZyB0aGUgIkRpc3BsYXkgVHJlZSBCcm93c2VyIiBsaW5rCi0vLwkvLyBpbiB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX1NUQVJUID0gIjxodG1sPjxoZWFkPiA8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiPjwvaGVhZD48dGl0bGU+UmF0aW9uYWwgVW5maWVkIFByb2Nlc3M8L3RpdGxlPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8c2NyaXB0IGxhbmd1YWdlPVwiamF2YXNjcmlwdFwiPmZ1bmN0aW9uIGluaXQoKSB7IHBhcmVudC5vcnlfdG9jPVwiZGlzYWJsZVwiOyBwYXJlbnQuY29udGVudGZyYW1lLmxvY2F0aW9uPVwiIjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9FTkQgPSAiXCI7IH08L3NjcmlwdD48L2hlYWQ+IiAvLyROT04tTkxTLTEkCi0vLwkJCSsgIjxmcmFtZXNldCByb3dzPVwiMTAwJSwqXCIgZnJhbWVib3JkZXI9XCJub1wiIGJvcmRlcj1cIjBcIiBmcmFtZXNwYWNpbmc9XCIwXCIgaWQ9XCJjb250ZW50ZnJhbWVzZXRcIiBuYW1lPVwiY29udGVudGZyYW1lc2V0XCI+IiAvLyROT04tTkxTLTEkCi0vLwkJCSsgIjxmcmFtZSBzcmM9XCJhYm91dDpibGFua1wiIGlkPVwiY29udGVudGZyYW1lXCIgbmFtZT1cImNvbnRlbnRmcmFtZVwiIHNjcm9sbGluZz1cImF1dG9cIi8+IiAvLyROT04tTkxTLTEkCi0vLwkJCSsgIjxmcmFtZSBzcmM9XCJhYm91dDpibGFua1wiIGlkPVwiYmxhbmtmcmFtZVwiIG5hbWU9XCJibGFua2ZyYW1lXCIgb25sb2FkPVwiaW5pdCgpXCIvPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8L2ZyYW1lc2V0PjwvaHRtbD4iOyAvLyROT04tTkxTLTEkCi0KLS8vCS8vIFRoZSBkZWZhdWx0IEhUTUwgd3JhcHBlcnMgZm9yIHByaW50aW5nIHRoZSBwcm9jZXNzIGNvbnRlbnQgcGFnZXMuCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUklOVF9XUkFQUEVSX1NUQVJUID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQKLS8vCQkJKyAicHJpbnQoKTsiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJJTlRfV1JBUFBFUl9FTkQgPSBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9FTkQ7Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5UX0ZJTEUgPSAicHJpbnQuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBIVE1MIHdyYXBwZXJzIGZvciBkaXNhYmxpbmcgdGhlICJEaXNwbGF5IFRyZWUgQnJvd3NlciIgbGluayBpbiB0aGUKLQkvLyBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwlwcml2YXRlIFN0cmluZyBjb250ZW50V3JhcHBlclNhcnQ7Ci0vLwotLy8JcHJpdmF0ZSBTdHJpbmcgY29udGVudFdyYXBwZXJFbmQ7Ci0KLS8vCS8vIFRoZSBIVE1MIHdyYXBwZXJzIGZvciBwcmludGluZyB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBTdHJpbmcgcHJpbnRXcmFwcGVyU2FydDsKLS8vCi0vLwlwcml2YXRlIFN0cmluZyBwcmludFdyYXBwZXJFbmQ7Ci0vLwotLy8JLy8gVGhlIGJ1aWx0LWluIGJyb3dzZXIgZm9yIHByaW50aW5nIHRoZSBIVE1MIHBhZ2VzLgotLy8JLy8gZG9uJ3QgdXNlIGEgc2Vjb25kIAotLy8JcHJpdmF0ZSBCcm93c2VyIHByaW50QnJvd3NlcjsKLQotCXByb3RlY3RlZCBCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBjdXJyZW50TG9jYXRpb24gPSBudWxsOwotCi0JLy8gc2F2ZSB0aGUgY3VycmVudCB0ZXh0IGZyb20gdGhlIHN0YXR1cyBsaXN0ZW5lcgotCS8vIHdlIG5lZWQgdGhpcyB0byBvcGVuIGJyb3dzZXIgd2l0aCB0aGlzIHVybCAKLQkvLyBzaW5jZSB1bmRlciBsaW51eCBicm93c2VyIGNhbid0IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LCB3aGljaCBpcyByZWFsbHkgYmFkCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudFRleHQgPSBudWxsOwotCXByaXZhdGUgSHRtbEJ1aWxkZXIgaHRtbEJ1aWxkZXI7Ci0KLQlwcml2YXRlIEN1cnNvciB3YWl0Q3Vyc29yID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVsZW1lbnRIVE1MVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWh0bWxCdWlsZGVyID0gbmV3IEh0bWxCdWlsZGVyKCk7Ci0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTV1QgYnJvd3NlciBjb250cm9scyBmb3Igdmlld2luZyBhbmQgcHJpbnRpbmcgdGhlIEhUTUwKLQkgKiBjb250ZW50IHBhZ2VzLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEh8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGUpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvY2F0aW9uIGNoYW5nZWQiKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGUpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvY2F0aW9uIGNoYW5naW5nLi4uIik7Ci0JCQkJCS8vIEdldCB0aGUgY3VycmVudCBsb2NhdGlvbi4KLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gZ2V0RWxlbWVudFVybChlLmxvY2F0aW9uKTsKLQkJCQkJaWYgKCBsb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uLnN0YXJ0c1dpdGgoUmVzb3VyY2VIZWxwZXIuVVJMX1NUUl9KQVZBU0NSSVBUKSkKLQkJCQkJewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChpc0xvY2F0aW9uQ2hhbmdlZChsb2NhdGlvbikpIHsKLQkJCQkJCS8vIFNhdmUgdGhlIGN1cnJlbnQgbG9jYXRpb24gZm9yIHByaW50aW5nIHB1cnBvc2VzLgotCQkJCQkJY3VycmVudExvY2F0aW9uID0gbG9jYXRpb247Ci0JCQkJCQlnZW5lcmF0ZUh0bWwoY3VycmVudExvY2F0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkKLQkJCQl7Ci0JCQkJCS8vIEdldCB0aGUgY3VycmVudCB0ZXh0LgotCQkJCQlTdHJpbmcgdGV4dCA9IGV2ZW50LnRleHQ7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXsKLQkJCQkJCS8vIFNhdmUgdGhlIGN1cnJlbnQgdGV4dCBmb3IgYXBwbGljYXRpb24gbGF1bmNoaW5nIHB1cnBvc2VzLgotCQkJCQkJY3VycmVudFRleHQgPSB0ZXh0OwotCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN0YXR1cyBjaGFuZ2VkOiAiICsgdGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQkvLyBoYW5kbGUgb3BlbiB3aW5kb3cuCi0JCQkJCS8vIHdpdGggbW96aWxsYSBpbiBsaW51eCwgb3BlbiB3aW5kb3cgZG9lcyBub3Qgd29yawotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiT3BlbiB3aW5kb3cgZXZlbnQ6ICIgKyBldmVudCk7Ci0JCQkJCQotCQkJCQkvLyB3aW5kb3dzIGNhbiBsYXVuY2ggdGhlIGJyb3dzZXIgd2l0aG91dCBwcm9ibGVtCi0JCQkJCS8vIGxpbnV4IG5lZWRzIG1vcmUgY2FyZQotCQkJCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCQkJCXsKLQkJCQkJICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0JCQkJCQl7Ci0JCQkJCQkJdHJ5Ci0JCQkJCQkJewotLy8JCQkJCQkJCS8vIGlmIHRoZSB1cmwgaXMgYSByZXNvdXJjZSB3aXRoIHJlbGF0aXZlIHBhdGgsIGZpbmQgdGhlIGFic29sdXRlIHBhdGgKLS8vCQkJCQkJCQlpZiAoIGN1cnJlbnRUZXh0LnN0YXJ0c1dpdGgoImZpbGU6IikgKQotLy8JCQkJCQkJCXsKLS8vCQkJCQkJCQkJLy8gZ2V0IHRoZSBmaWxlIHBhdGggZnJvbSB0aGUgCi0vLwkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCQkJCQotLy8JCQkJCQkJCS8vIG9wZW4gYW5vdGhlciBzd3QgYnJvd3NlciBzaW5jZSB3ZSBoYXZlIG5vIChzaW1wbGUpIHdheSBvZiBjcmVhdGluZyBhIHN5c3RlbSBkZWZhdWx0IGJyb3dzZXIKLS8vCQkJCQkJCQkvLyB0aGUgRWNsaXBzZSBndXlzIGhpZGUgYWxsIHRoZSBnb29kIGFwaXMgYXMgaW50ZXJuYWwKLQkJCQkJCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCQkJCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCQkJCUJyb3dzZXIgcG9wdXBfYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIfEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTHxHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKGN1cnJlbnRUZXh0KTsKLQkJCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQkJc2hlbGwub3BlbigpOwotCi0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9fSk7Ci0JCQkKLS8vCQkJLy8gZG9uJ3QgdXNlIGEgc2VwZXJhdGUgYnJvd3NlciBmb3IgcHJpbnRpbmcgc2luY2UgdGhpcyB3aWxsIGxvc2UgdGhlIAotLy8JCQkvLyBzdGF0ZXMgb2YgdGhlIGN1cnJlbnQgcGFnZSwgZm9yIGV4YW1wbGUsIHRoZSBleHBhbmRlZCBzZWN0aW9ucywgZXRjLgotLy8JCQkvLyBKaW5odWEgWGksICAzLzUvMjAwNwotLy8JCQkvLyBDcmVhdGUgdGhlIGhpZGRlbiBicm93c2VyIHVzZWQgZm9yIHByaW50aW5nIHRoZSBIVE1MIGNvbnRlbnQKLS8vCQkJLy8gcGFnZXMuCi0vLwkJCXByaW50QnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotLy8JCQlwcmludEJyb3dzZXIuc2V0U2l6ZSgxLCAxKTsKLS8vCQkJcHJpbnRCcm93c2VyLnNldFZpc2libGUoZmFsc2UpOwotLy8KLS8vCQkJLy8gTGludXg6IFRoZXJlIGlzIHVudXNlZCBzcGFjZSBpbiBwcmV2aWV3L2Jyb3dzaW5nLCB3aGljaCBpcyBpbiBncmV5LgotLy8JCQkvLyB0aGlzIGlzIG5lZWRlZCBmb3IgbGludXgKLS8vCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLS8vCQkJZ2QuaGVpZ2h0SGludCA9IDE7Ci0vLwkJCXByaW50QnJvd3Nlci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQotCQkJCi0JCQkvLyBSZWFkIHRoZSBIVE1MIHdyYXBwZXJzIGZvciBkaXNhYmxpbmcgdGhlICJEaXNwbGF5IFRyZWUgQnJvd3NlciIKLQkJCS8vIGxpbmsgaW4gdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCQkJY29udGVudFdyYXBwZXJTYXJ0ID0gSFRNTFdyYXBwZXJzCi0vLwkJCQkJLmdldFN0cmluZygiQ09OVEVOVF9XUkFQUEVSX1NUQVJUIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKGNvbnRlbnRXcmFwcGVyU2FydCA9PSBudWxsKSB7Ci0vLwkJCQljb250ZW50V3JhcHBlclNhcnQgPSBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9TVEFSVDsKLS8vCQkJfQotLy8JCQljb250ZW50V3JhcHBlckVuZCA9IEhUTUxXcmFwcGVycy5nZXRTdHJpbmcoIkNPTlRFTlRfV1JBUFBFUl9FTkQiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlpZiAoY29udGVudFdyYXBwZXJFbmQgPT0gbnVsbCkgewotLy8JCQkJY29udGVudFdyYXBwZXJFbmQgPSBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9TVEFSVDsKLS8vCQkJfQotCi0vLwkJCS8vIFJlYWQgdGhlIEhUTUwgd3JhcHBlcnMgZm9yIHByaW50aW5nIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwkJCXByaW50V3JhcHBlclNhcnQgPSBIVE1MV3JhcHBlcnMuZ2V0U3RyaW5nKCJQUklOVF9XUkFQUEVSX1NUQVJUIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKHByaW50V3JhcHBlclNhcnQgPT0gbnVsbCkgewotLy8JCQkJcHJpbnRXcmFwcGVyU2FydCA9IERFRkFVTFRfUFJJTlRfV1JBUFBFUl9TVEFSVDsKLS8vCQkJfQotLy8JCQlwcmludFdyYXBwZXJFbmQgPSBIVE1MV3JhcHBlcnMuZ2V0U3RyaW5nKCJQUklOVF9XUkFQUEVSX0VORCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChwcmludFdyYXBwZXJFbmQgPT0gbnVsbCkgewotLy8JCQkJcHJpbnRXcmFwcGVyRW5kID0gREVGQVVMVF9QUklOVF9XUkFQUEVSX0VORDsKLS8vCQkJfQotCi0JCQl3YWl0Q3Vyc29yID0gcGFyZW50LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcigKLQkJCQkJU1dULkNVUlNPUl9XQUlUKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWJyb3dzZXIgPSBudWxsOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTG9jYXRpb25DaGFuZ2VkKFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAobG9jYXRpb24gPT0gbnVsbCB8fCBjdXJyZW50TG9jYXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHsKLQkJCWxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQlTdHJpbmcgb2xkTG9jYXRpb24gPSBnZXRVcmwoY3VycmVudExvY2F0aW9uKTsKLQotCQkJLy8gU29tZSB0aW1lcyB0aGUgY3VycmVudCBVUkwgaXMgYSBmdWxsIHBhdGgsIHNvIGp1c3QgY29tcGFyZSB0aGUgZW5kLgotCQkJCi0JCQkvLyAgYnVnIGluIElFNiwgdGhlIGxvY2F0aW9uIGluIHRoZSBsb2NhdGlvbiBjaGFuZ2UgZXZlbnQgbWlnaHQgYmUgdHJ1bmNhdGVkIGlmIHRoZSB1cmwgaXMgdG9vIGxvbmcsIAotCQkJLy8gY291bGQgYmUgdXAgdG8gMTU5IGNoYXJhY3RlcnMuCi0JCQkKLQkJCXJldHVybiBvbGRMb2NhdGlvbi5pbmRleE9mKGxvY2F0aW9uKSAhPSAwOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICFsb2NhdGlvbi5lbmRzV2l0aChjdXJyZW50TG9jYXRpb24pCi0JCQkJCSYmICFjdXJyZW50TG9jYXRpb24uZW5kc1dpdGgobG9jYXRpb24pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTV1QgYnJvd3NlciB0aGF0IGRpc3BsYXlzIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0JICovCi0JcHVibGljIEJyb3dzZXIgZ2V0QnJvd3NlcigpIHsKLQkJcmV0dXJuIGJyb3dzZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCWJyb3dzZXIuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgQnVpbGRlci4KLQkgKi8KLQlwdWJsaWMgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKSB7Ci0JCQotCQlpZiAoIGh0bWxCdWlsZGVyICE9IG51bGwgKSB7Ci0JCQlCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLnVwZGF0ZShodG1sQnVpbGRlcik7Ci0JCX0KLQkJcmV0dXJuIGh0bWxCdWlsZGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEhUTUwgQnVpbGRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIdG1sQnVpbGRlcihIdG1sQnVpbGRlciBidWlsZGVyKSB7Ci0JCXRoaXMuaHRtbEJ1aWxkZXIgPSBidWlsZGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0TWFuYWdlcihFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IpIHsKLQkJaHRtbEJ1aWxkZXIuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXRNZ3IpOwotCX0KLQotCi0JCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0VsZW1lbnRDb250ZW50KE9iamVjdCByYXdfZWxlbWVudCkgewotCi0JCXN0YXJ0V2FpdCgpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgZmlsZV91cmwgPSBnZW5lcmF0ZUh0bWwocmF3X2VsZW1lbnQsIGdldEh0bWxCdWlsZGVyKCkpOwotCQkKLQkJCS8vIFNldCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBhdm9pZCByZS1nZW5lcmF0aW5nIHRoZSBIVE1MIGZpbGUgaW4KLQkJCS8vIHJlc3BvbmQgdG8gYSBsb2NhdGlvbiBjaGFuZ2UuCi0JCQljdXJyZW50TG9jYXRpb24gPSBmaWxlX3VybDsKLQkJCWJyb3dzZXIuc2V0VXJsKGZpbGVfdXJsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQllbmRXYWl0KCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVIdG1sKE9iamVjdCByYXdfZWxlbWVudCwgSHRtbEJ1aWxkZXIgaHRtbEJ1aWxkZXIpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0RGVsZWdhdGUoKS5nZW5lcmF0ZUh0bWwocmF3X2VsZW1lbnQsIGh0bWxCdWlsZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVIdG1sKFN0cmluZyB1cmwpIHsKLQkJc3RhcnRXYWl0KCk7Ci0JCXRyeSB7Ci0JCQlnZXRIdG1sQnVpbGRlcigpLmdlbmVyYXRlSHRtbCh1cmwpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCWVuZFdhaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50IFVSTC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50VXJsKFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAobG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi5sZW5ndGgoKSA9PSAwCi0JCQkJfHwgbG9jYXRpb24uZXF1YWxzKCJhYm91dDpibGFuayIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgbG9jYXRpb24udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFJlc291cmNlSGVscGVyLlVSTF9TVFJfSkFWQVNDUklQVCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJbG9jYXRpb24gPSBnZXRVcmwobG9jYXRpb24pOwotCQlpZiAobG9jYXRpb24uaW5kZXhPZihSZXNvdXJjZUhlbHBlci5NSVNTSU5HX1BBR0VTX0ZPTERFUikgPj0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBtYWtlIHN1cmUgdGhlIHVybCBpcyBhbiBlbGVtZW50IHVybCwgY2hlY2sgdGhlIGd1aWQKLQkJaWYgKCBSZXNvdXJjZUhlbHBlci5nZXRHdWlkRnJvbUZpbGVOYW1lKGxvY2F0aW9uKSA9PSBudWxsICkKLQkJewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBmb3IgdGhlIGdpdmVuIGxvY2F0aW9uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVybChTdHJpbmcgbG9jYXRpb24pIHsKLQkJU3RyaW5nIHB1Ymxpc2hfZGlyID0gZ2V0SHRtbEJ1aWxkZXIoKS5nZXRQdWJsaXNoRGlyKCk7Ci0JCVN0cmluZyB1cmwgPSBmaXhQYXRoKGxvY2F0aW9uKTsKLQkJaW50IGluZGV4ID0gdXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigKLQkJCQlmaXhQYXRoKHB1Ymxpc2hfZGlyKS50b0xvd2VyQ2FzZSgpKTsKLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoaW5kZXggKyBwdWJsaXNoX2Rpci5sZW5ndGgoKSk7Ci0JCX0KLQkJaW5kZXggPSB1cmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA+IDApIHsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4UGF0aChTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JCQlpZiAoIndpbjMyIi5lcXVhbHMocGxhdGZvcm0pIHx8ICJ3cGYiLmVxdWFscyhwbGF0Zm9ybSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkvLyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5JRQotCQkJCXBhdGggPSBVUkxEZWNvZGVyLmRlY29kZShwYXRoLCAiSVNPLTg4NTktMSIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCS8vIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLk1vemlsbGEKLQkJCQlwYXRoID0gVVJMRGVjb2Rlci5kZWNvZGUocGF0aCwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0JCQkJcmV0dXJuIHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgY3VycmVudCBIVE1MIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoKSB7Ci0JCWJvb2xlYW4gYiA9IHRoaXMuYnJvd3Nlci5leGVjdXRlKCJ3aW5kb3cucHJpbnQoKTsiKTsgLy8kTk9OLU5MUy0xJAotLy8JCWlmICggIWIgKSB7Ci0vLwkJCWZpbmFsIFN0cmluZyBwcmludEZpbGUgPSBodG1sQnVpbGRlci5nZXRQdWJsaXNoRGlyKCkgKyBQUklOVF9GSUxFOwotLy8JCQlpZiAoY3VycmVudExvY2F0aW9uICE9IG51bGwpIHsKLS8vCQkJCVN0cmluZ0J1ZmZlciB3cmFwcGVySFRNTCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQkJCXdyYXBwZXJIVE1MLmFwcGVuZChwcmludFdyYXBwZXJTYXJ0KS5hcHBlbmQoY3VycmVudExvY2F0aW9uKQotLy8JCQkJCQkuYXBwZW5kKHByaW50V3JhcHBlckVuZCk7Ci0vLwkJCQlTdHJpbmcgaHRtbFRleHQgPSB3cmFwcGVySFRNTC50b1N0cmluZygpOwotLy8JCQkJaWYgKEZpbGVVdGlsLndyaXRlVVRGOEZpbGUocHJpbnRGaWxlLCBodG1sVGV4dCkpIHsKLS8vCQkJCQlwcmludEJyb3dzZXIuc2V0VXJsKHByaW50RmlsZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0V2FpdCgpIHsKLQkJcGFyZW50LmdldFNoZWxsKCkuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRXYWl0KCkgewotCQlwYXJlbnQuZ2V0U2hlbGwoKS5zZXRDdXJzb3IobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb250ZW50LgotCSAqIDxwPgotCSAqIFJlZ2VuZXJhdGVzIHRoZSBjb250ZW50IGJlZm9yZSByZWZyZXNoaW5nIHRoZSBicm93c2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWdlbmVyYXRlSHRtbChjdXJyZW50TG9jYXRpb24pOwotCQlicm93c2VyLnJlZnJlc2goKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudHNWaWV3Q29udGV4dEhlbHAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudHNWaWV3Q29udGV4dEhlbHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiMjA1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRzVmlld0NvbnRleHRIZWxwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogCi0gKiBDb250ZXh0IEhlbHAgZm9yIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudHNWaWV3Q29udGV4dEhlbHAgewotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVscCBvZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSB1aUNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIZWxwKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBDb21wb3NpdGUgdWlDb21wb3NpdGUpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJLy8gaWYgbXVsdGlwbGUgaXRlbXMgc2VsZWN0ZWQsIG9ubHkgdGhlIGZpcnN0IGl0ZW0ncyBjb250ZXh0IGhlbHAgd2lsbAotCQkvLyBiZSBkaXNwbGF5ZWQKLQkJT2JqZWN0IG9iaiA9IHNlbGVjdGVkLmdldEZpcnN0RWxlbWVudCgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBTZXR0aW5nIGhlbHAgZm9yIHRoZSBzZWxlY3Rpb24gb2JqID0gIiArCi0JCS8vIG9iaik7Ci0JCXNldEhlbHAob2JqLCB1aUNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVscCBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSB1aUNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIZWxwKE9iamVjdCBvYmosIENvbXBvc2l0ZSB1aUNvbXBvc2l0ZSkgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRG9tYWluKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZVNldCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRvb2wpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyYzk5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBIVE1MIHdyYXBwZXJzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxXcmFwcGVycyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShIVE1MV3JhcHBlcnMuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCS8qKgotCSAqIERlZmF1bHQgcHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZm9ybSBiZWluZwotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIEhUTUxXcmFwcGVycygpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGdpdmVuIHRoZSByZXNvdXJjZSBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgZm9ybWF0dGVkIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiByZXNvdXJjZSBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgYXJndW1lbnRzLgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCBmb3JtYXR0ZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTMwNjcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNPTlRFTlRfV1JBUFBFUl9TVEFSVD1cCi0gIDxodG1sPlwKLSAgPGhlYWQ+XAotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+XAotICA8L2hlYWQ+XAotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij5cCi0gIGZ1bmN0aW9uIGluaXQoKSB7IHBhcmVudC5vcnlfdG9jPSJkaXNhYmxlIjsgcGFyZW50LmNvbnRlbnRmcmFtZS5sb2NhdGlvbj0iCi0gIAotQ09OVEVOVF9XUkFQUEVSX0VORD1cCi0gICI7IH1cCi0gIDwvc2NyaXB0PlwKLSAgPC9oZWFkPlwKLSAgPGZyYW1lc2V0IHJvd3M9IjEwMCUsKiIgZnJhbWVib3JkZXI9Im5vIiBib3JkZXI9IjAiIGZyYW1lc3BhY2luZz0iMCIgaWQ9ImNvbnRlbnRmcmFtZXNldCIgbmFtZT0iY29udGVudGZyYW1lc2V0Ij5cCi0gIDxmcmFtZSBzcmM9ImFib3V0OmJsYW5rIiBpZD0iY29udGVudGZyYW1lIiBuYW1lPSJjb250ZW50ZnJhbWUiIHNjcm9sbGluZz0iYXV0byIvPlwKLSAgPGZyYW1lIHNyYz0iYWJvdXQ6YmxhbmsiIGlkPSJibGFua2ZyYW1lIiBuYW1lPSJibGFua2ZyYW1lIiBvbmxvYWQ9ImluaXQoKSIvPlwKLSAgPC9mcmFtZXNldD5cCi0gIDwvaHRtbD4KLQotUFJJTlRfV1JBUFBFUl9TVEFSVD1cCi0gIDxodG1sPlwKLSAgPGhlYWQ+XAotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+XAotICA8L2hlYWQ+XAotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij5cCi0gIGZ1bmN0aW9uIGluaXQoKSB7IHBhcmVudC5vcnlfdG9jPSJkaXNhYmxlIjsgfVwKLSAgPC9zY3JpcHQ+XAotICA8L2hlYWQ+XAotICA8ZnJhbWVzZXQgcm93cz0iMTAwJSwqIiBmcmFtZWJvcmRlcj0ibm8iIGJvcmRlcj0iMCIgZnJhbWVzcGFjaW5nPSIwIiBpZD0icHJpbnRmcmFtZXNldCIgbmFtZT0icHJpbnRmcmFtZXNldCIgb25sb2FkPSJqYXZhc2NyaXB0OnByaW50KCkiPlwKLSAgPGZyYW1lIHNyYz0iYWJvdXQ6YmxhbmsiIGlkPSJibGFua2ZyYW1lIiBuYW1lPSJibGFua2ZyYW1lIiBvbmxvYWQ9ImluaXQoKSIvPlwKLSAgPGZyYW1lIHNyYz0iCi0KLVBSSU5UX1dSQVBQRVJfRU5EPVwKLSAgIiBpZD0icHJpbnRmcmFtZSIgbmFtZT0icHJpbnRmcmFtZSIgc2Nyb2xsaW5nPSJhdXRvIiBvbmxvYWQ9ImphdmFzY3JpcHQ6cGFyZW50LnByaW50ZnJhbWUuZm9jdXMoKSIvPlwKLSAgPC9mcmFtZXNldD5cCi0gIDxodG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTGlicmFyeVZpZXcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTGlicmFyeVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllNzg1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xpYnJhcnlWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkFzc2lnbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkN1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxheW91dEFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3Q29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdDdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3RGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTmV3UGx1Z2luQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5SZWFzc2lnbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5VbmFzc2lnbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuTW92ZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuU3dpdGNoQ29uZmlnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5WYXJpYWJpbGl0eVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLklFZGl0b3JLZWVwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmVmcmVzaEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklOYW1lZEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuSW1wb3J0RXhwb3J0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IHZpZXcuCi0gKiA8cD4KLSAqIERpc3BsYXlzIHRoZSBwaHlzaWNhbCByZXByZXNlbnRhdGlvbiBvZiBhIE1ldGhvZCBMaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXcgZXh0ZW5kcyBBYnN0cmFjdEJhc2VWaWV3IGltcGxlbWVudHMgSVJlZnJlc2hIYW5kbGVyLAotCQlJU2hvd0luVGFyZ2V0IHsKLQotCS8qKgotCSAqIFRoZSB2aWV3IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSBMaWJyYXJ5Vmlldy5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJvdGVjdGVkIElEb3VibGVDbGlja0xpc3RlbmVyIGRvdWJsZUNsaWNrTGlzdGVuZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQlwcml2YXRlIExheW91dEFjdGlvbkdyb3VwIGZMYXlvdXRBY3Rpb25TZXQ7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgUEVSRk9STV9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnZpZXcuTGlicmFyeVZpZXcucGVyZm9ybVZhbGlkYXRvckFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIElBY3Rpb24gcGVyZm9ybUxpYnJhcnlWYWxpZGF0aW9uQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlZhbGlkYXRlX21ldGhvZF9saWJyYXJ5LCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJImZ1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliLmdpZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCVZpZXdIZWxwZXIuY2hlY2tMaWJyYXJ5SGVhbHRoKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQkJCi0JfTsKLQkKLQkvLyBMaXN0ZW4gdG8gcHJvY2VzcyBlZGl0b3IgYWN0aXZhdGlvbiBhbmQgcHJvbXB0IHRoZSB1c2VyIHRvIGxvYWQgdGhlCi0JLy8gdGhlIHByb2Nlc3MncyBkZWZhdWx0IENvbmZpZ3VyYXRpb24gaW50byB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotCXByaXZhdGUgSVBhcnRMaXN0ZW5lciBlZGl0b3JQYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJU3dpdGNoQ29uZmlnRGlhbG9nLnJ1bihEaXNwbGF5Ci0JCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIChJRWRpdG9yUGFydClwYXJ0KTsKLQkJCX0KLQkJfQotCi0JfTsKLQotCXByaXZhdGUgbG9uZyBsYXN0UmVmcmVzaFRpbWVTdGFtcDsKLQotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8fAotCQkJCQlldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSkgewotCQkJCS8vIHByb2plY3QgYWJvdXQgdG8gYmUgY2xvc2VkIG9yIGRlbGV0ZWQKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KWV2ZW50LmdldFJlc291cmNlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc09wZW4oKSAmJiBwcm9qZWN0Lmhhc05hdHVyZShNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VBbGxNZXRob2RFZGl0b3JzKCk7Ci0JCQkJCQlJUHJvamVjdCBjdXJyUHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0LmZpbmRQcm9qZWN0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKTsKLQkJCQkJCWlmIChwcm9qZWN0ID09IGN1cnJQcm9qZWN0KSB7Ci0JCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNleCkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZXgpOwotCQkJCX0gY2F0Y2ggKExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIGxleCkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihsZXgpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQkJCi0JCQl9Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkJCQkKLQkJCXRyeSB7Ci0JCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkKLQkJCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7Ci0JCQkJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQkJCQkJLy8gc2hvdyBQcm9ibGVtcyBWaWV3Ci0JCQkJCQkJCVVJSGVscGVyLnNob3dQcm9ibGVtc1ZpZXcoKTsKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIHdhdGNoIGZvciBwcm9qZWN0IG1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCWVsc2UgaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7ICAKLQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQkJCQkJaWYgKCgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSAwKSAmJiAgICAgICAgICAgICAgICAKLQkJCQkJCQkJCQkoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5ERVNDUklQVElPTikgIT0gMCkpIHsKLQkJCQkJCQkJCS8vIHRlc3RlZCB1c2luZyB0aGUgTW92ZS4uIGNvbW1hbmQgaW4gdGhlIFJlc291cmNlIE5hdmlnYXRvciB2aWV3ICAgICAgICAgICAgIAotCQkJCQkJCQkJLy8gdGhlIFJFUExBQ0VEIGZsYWcgb25seSBzZWVtZWQgdG8gb2NjdXIgd2hlbiB0aGUgbGlicmFyeSB3YXMgbW92ZWQgICAgICAgICAgCi0JCQkJCQkJCQkvLyBvdXRzaWRlIG9mIEVQRiBhbmQgRVBGIHdhcyByZS1zdGFydGVkLCBzbyBtYWtlIHN1cmUgaXQncyBjbGVhciwgb3RoZXJ3aXNlICAKLQkJCQkJCQkJCS8vIHdlIHJlbG9hZCB0aGUgbGlicmFyeSByaWdodCBhZnRlciBsb2FkaW5nIGl0IHdoZW4gc3RhcnRpbmcgRVBGICAgICAgICAgICAgIAotCQkJCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBsaWJNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQkJCQkJaWYobGliTWdyIGluc3RhbmNlb2YgWE1JTGlicmFyeU1hbmFnZXIpIHsKLQkJCQkJCQkJCQlYTUlMaWJyYXJ5TWFuYWdlciB4bWlMaWJNZ3IgPSAoKFhNSUxpYnJhcnlNYW5hZ2VyKWxpYk1ncik7Ci0JCQkJCQkJCQkJaWYocHJvamVjdC5lcXVhbHMoeG1pTGliTWdyLmdldE1ldGhvZExpYnJhcnlQcm9qZWN0KCkpKSB7CQotCQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQkJCQkJCQkJeG1pTGliTWdyLmhhbmRsZUxpYnJhcnlNb3ZlZCgpOwotCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgewotCQkJCQkJCQkJLy8gcHJvamVjdCdzIG9wZW4gc3RhdGUgd2FzIGNoYW5nZWQKLQkJCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSAmJiBwcm9qZWN0Lmhhc05hdHVyZShNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpICYmCi0JCQkJCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJLy8gcHJvamVjdCBpcyBub3cgb3Blbiwgb3BlbiB0aGUgbGlicmFyeQotCQkJCQkJCQkJCWphdmEubmV0LlVSSSBwcm9qZWN0TG9jYXRpb24gPSBwcm9qZWN0LmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5vcGVuTWV0aG9kTGlicmFyeSgieG1pIiwgcHJvamVjdExvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQkJCQkKLQkJCQl9OwotCQkJCQotCQkJCVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0KLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSVJlZnJlc2hMaXN0ZW5lciByZWZyZXNoTGlzdGVuZXIgPSBuZXcgSVJlZnJlc2hMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBub3RpZnlSZWZyZXNoZWQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFJlZnJlc2hlZE9iamVjdHMoKSAhPSBudWxsCi0JCQkJCSYmICFldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJQ29udHJvbCBjdHJsID0gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQkJCWlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpCi0JCQkJCXJldHVybjsKLQotCQkJCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkJCWRvUmVmcmVzaChnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJZG9SZWZyZXNoKG51bGwpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlWaWV3KCkgewotCQkvLyByZWFkIGxheW91dCBwcmVmCi0JCWlmIChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LkZMQVRfTEFZT1VULmVxdWFscyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuZ2V0TGF5b3V0KCkpKSB7Ci0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnNldExheW91dEZsYXQoKTsKLQkJfSBlbHNlIGlmIChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LkhJRVJBUkNISUNBTF9MQVlPVVQuZXF1YWxzKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRMYXlvdXQoKSkpIHsKLQkJCVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0Uuc2V0TGF5b3V0SGllcmFyY2hpY2FsKCk7Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCQkKLQkJbWFrZUFjdGlvbnMoKTsKLQkJCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfTkFWSUdBVE9SX1ZJRVdfQ09OVEVYVCk7Ci0KLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldFJlZnJlc2hIYW5kbGVyKHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWZMYXlvdXRBY3Rpb25TZXQ9IG5ldyBMYXlvdXRBY3Rpb25Hcm91cCh0aGlzKTsKLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycz0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWZMYXlvdXRBY3Rpb25TZXQuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQkvLyBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgdGhlIGdsb2JhbCBlZGl0IGFjdGlvbiB3b3JrIHRoZSBmaXJzdCB0aW1lLgotCQlhY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVWaWV3KHRoaXMpOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGVkLmlzRW1wdHkoKSkKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmRpc2FibGVHbG9iYWxFZGl0TWVudSgpOwotCQllbHNlCi0JCQlhY3Rpb25CYXJDb250cmlidXRvci5lbmFibGVHbG9iYWxFZGl0TWVudSgpOwotCi0JCWlmICh0cmVlVmlld2VyICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyZWUgdmlld2VyLgotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB1bmRlcmx5aW5nIHRyZWUgdmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyI2hhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoCi0JCQkJCUxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVJlc291cmNlCi0JCQkJCQkmJiBldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElMYWJlbERlY29yYXRvcikgewotCQkJCQl0aGlzLnJlZnJlc2goKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzdXBlci5oYW5kbGVMYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8KLQkJLy8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCi0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaykgZXZlbnQKLQkJCQkJCQkJLmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOwotCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZAotCQkJCQkJCQkJLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQkKLQkJCQkJCQlpZihtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSB7CQkJCQkJCQkKLQkJCQkJCQkJLy8gV29yay1hcm91bmQgdG8gcmVmcmVzaCBpY29ucyBvZiBuZXdseSBjcmVhdGVkIGVsZW1lbnRzLCB3aG9zZSBkZWNvcmF0aW9uCi0JCQkJCQkJCS8vIHNvbWV0aW1lcyBnb3Qgb3V0IG9mIHN5bmMuCi0JCQkJCQkJCS8vCi0JCQkJCQkJCVZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJCQkJCQkJaWYodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJCQkJCQkJT2JqZWN0W10gZWxlbWVudHMgPSBtb3N0UmVjZW50Q29tbWFuZAotCQkJCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkudG9BcnJheSgpOwotCQkJCQkJCQkJKChTdHJ1Y3R1cmVkVmlld2VyKXZpZXdlcikudXBkYXRlKGVsZW1lbnRzLCBudWxsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsCi0JCQkJCQkJCSYmIHByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJCQkJCSYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpCi0JCQkJCQkJCSYmIHByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc1Zpc2libGUoKSkgewotCQkJCQkJCXByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBQZXJzaXN0ZW5jZVNlcnZpY2UuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUmVzb3VyY2VTZXQoU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKSk7Ci0KLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgcmVzb3VyY2VTZXQpOwotCi0KLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0KLQkJLy8gdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldwotCQkvLyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcigKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSwKLQkJCQluZXcgTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yKCkpKTsKLQotCQkvLyBBZGQgYSBkb3VibGUgY2xpY2sgbGlzdGVuZXIgZm9yIGxhdW5jaGluZyB0aGUgTWV0aG9kIGVkaXRvcnMuCi0JCWRvdWJsZUNsaWNrTGlzdGVuZXIgPSBuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuaGFuZGxlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihlZGl0b3JQYXJ0TGlzdGVuZXIpOwotCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlTGlzdGVuZXIpOwotCQkKLQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjc2V0SW5wdXRGb3JWaWV3ZXIoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0Rm9yVmlld2VyKE9iamVjdCBtb2RlbCkgewotCQlDb250cm9sIGN0cmwgPSB0aGlzLmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1vZGVsID09IG51bGwgfHwgbW9kZWwgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrLgotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCi0JCQlnZXRWaWV3ZXIoKS5zZXRJbnB1dChtb2RlbCk7Ci0JCQkKLQkJCWlmKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCUlGaWx0ZXIgZmlsdGVyID0gKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0RmlsdGVyKCk7Ci0JCQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSU5hbWVkRmlsdGVyKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChJTmFtZWRGaWx0ZXIpIGZpbHRlcikuZ2V0TmFtZSgpOwotCQkJCQlpZihuYW1lICE9IG51bGwpIHsKLQkJCQkJCXNldENvbnRlbnREZXNjcmlwdGlvbihuYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXVwZGF0ZUxhc3RSZWZyZXNoVGltZXN0YW1wKCk7Ci0JCX0gZWxzZSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkxpYnJhcnkgdmlld2VyIGlucHV0IGlzIG5vdCBhIE1ldGhvZExpYnJhcnkgb2JqZWN0OiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlTGFzdFJlZnJlc2hUaW1lc3RhbXAoKSB7Ci0JCWxhc3RSZWZyZXNoVGltZVN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHZpZXcuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5VmlldyBnZXRWaWV3KCkgewotLy8JCXJldHVybiAoTGlicmFyeVZpZXcpIFZpZXdIZWxwZXIub3BlblZpZXcoVklFV19JRCk7Ci0JCWJvb2xlYW4gc2hvdyA9IFZpZXdIZWxwZXIuaXNWaWV3SW5DdXJyZW50UGVyc3BlY3RpdmUoVklFV19JRCk7Ci0JCXJldHVybiAoTGlicmFyeVZpZXcpVmlld0hlbHBlci5maW5kVmlldyhWSUVXX0lELCBzaG93KTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I3NldFNlbGVjdGlvbihJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkoKExpYnJhcnlWaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IpIGFjdGlvbkJhckNvbnRyaWJ1dG9yKQotCQkJCS51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQotCQlzdXBlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CQkKLQotLy8JCSgoTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvcikgYWN0aW9uQmFyQ29udHJpYnV0b3IpLmNoZWNrTG9ja2VkKCk7Ci0JCQotCQkvLyBpZiBvbmx5IG9uZSBlbGVtZW50IGlzIHNlbGVjdGVkLCBzaG93IHBhdGggdG8gaXRzIGZpbGUgaW4gc3RhdHVzIGxpbmUKLQkJLy8KLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KSBvKS5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJVVJJIHVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCQkJCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkuaXNGaWxlKCkpIHsKLQkJCQkJCQkJcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoKENvbnRlbnRFbGVtZW50KSBvKQotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCQkJCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJcmVzb3VyY2UgPSBjb250ZW50LmVSZXNvdXJjZSgpOwotCQkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCVVSSSBjb250ZW50VVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJCQkJCQkJCWlmIChjb250ZW50VVJJICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCXBhdGggPSBwYXRoCi0JCQkJCQkJCQkJCQkJCSsgIiwuIiArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGNvbnRlbnRVUkkuZGVyZXNvbHZlKHVyaSkudG9GaWxlU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UocGF0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmVmcmVzaFZpZXdzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXN1cGVyLmxpYnJhcnlTZXQobGlicmFyeSk7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVnaXN0ZXJFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQkKLQkJCW1hbmFnZXIuYWRkUHJvcGVydHlMaXN0ZW5lcihuZXcgSVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLQkJCQkJLy8gVE9ETzogUmVwbGFjZSBoYXJkY29kZWQgY29uc3RhbnQgd2l0aCB2YXJpYWJsZS4KLQkJCQkJaWYgKHByb3BJZCA9PSAxKSB7Ci0JCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBhY3Rpb24gYmFyIGZvciB0aGUgbGlicmFyeSB2aWV3Ci0JICovCi0JY2xhc3MgTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld1BsdWdpbkFjdGlvbiA9IG5ldyBOZXdQbHVnaW5BY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3X3BsdWdpbik7Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIG1vdmVBY3Rpb24gPSBuZXcgQWN0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm1vdmUpIHsKLQotCQkJcHJpdmF0ZSB2b2lkIGRvTW92ZSgpIHsKLQkJCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9Nb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgTGlicmFyeVZpZXcudGhpcy5zZWxlY3Rpb247Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQl8fCAoZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQkvLyBIYW5kbGUgQ3VzdG9tQ2F0ZWdvcnkgc3BlY2lhbGx5LgotCQkJCQkJRU9iamVjdCBjb250YWluZXIgPSAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQkJCQljb250YWluZXIsIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ19tb3ZlRXJyb3IsCi0JCQkJCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZWxlbWVudHNUb01vdmUuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gVE9ETzogUHJvbXB0IHRoZSB1c2VyIHRoZSBzYXZlIGVkaXRpbmcgY2hhbmdlcyBmb3IKLQkJCQkvLyBlbGVtZW50cyB0aGF0IHdpbGwgYmUgbW92ZWQuCi0KLQkJCQkvLyBSZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbW92ZSBsaXN0IGlmIHRoZWlyIGNvbnRhaW5lcnMgYXJlCi0JCQkJLy8gYWxyZWFkeSBpbiB0aGUgbW92ZSBsaXN0LgotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50c1RvTW92ZS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJYm9vbGVhbiBpc0NvbnRhaW5lZCA9IGZhbHNlOwotCQkJCQljaGVja19jb250YWluZWQ6IGZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9Nb3ZlCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChVbWFVdGlsLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpIHsKLQkJCQkJCQlpc0NvbnRhaW5lZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgY2hlY2tfY29udGFpbmVkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChpc0NvbnRhaW5lZCkgewotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlNb3ZlRGlhbG9nIGRsZyA9IG5ldyBNb3ZlRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCQkJZWxlbWVudHNUb01vdmUsIGVkaXRpbmdEb21haW4pOwotCQkJCWRsZy5vcGVuKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCQkJcnVubmVyLnNldFByb2dyZXNzTW9uaXRvcihnZXRBY3Rpb25CYXJzKCkKLQkJCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQlkb01vdmUoKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbiBhc3NpZ25BY3Rpb24gPSBuZXcgQXNzaWduQWN0aW9uKExpYnJhcnlWaWV3LnRoaXMpOwotCQkKLQkJcHJpdmF0ZSBMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbiB1bmFzc2lnbkFjdGlvbiA9IG5ldyBVbmFzc2lnbkFjdGlvbihMaWJyYXJ5Vmlldy50aGlzKTsKLQkJCi0JCXByaXZhdGUgTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24gcmVhc3NpZ25BY3Rpb24gPSBuZXcgUmVhc3NpZ25BY3Rpb24oTGlicmFyeVZpZXcudGhpcyk7Ci0KLQkJcHJpdmF0ZSBMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbiBjdXN0b21DYXRlZ29yeURlZXBDb3B5QWN0aW9uID0gbmV3IEN1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb24oTGlicmFyeVZpZXcudGhpcyk7Ci0JCQotCQlwcml2YXRlIFJlbmFtZUFjdGlvbiByZW5hbWVBY3Rpb24gPSBuZXcgUmVuYW1lQWN0aW9uKCk7Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHJlcGxhY2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghZ2V0UGFnZSgpLmNsb3NlQWxsRWRpdG9ycyh0cnVlKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJZmluYWwgUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJCWZpbmFsIFN0cmluZyB0eXBlU3RyOwotCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJdHlwZVN0ciA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18yMDsKLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJdHlwZVN0ciA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18yMTsKLQkJCQl9IGVsc2UgewotCQkJCQl0eXBlU3RyID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3XzIyOwotCQkJCX0KLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlyRGxnID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQlkaXJEbGcuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0KTsKLQkJCQlkaXJEbGcKLQkJCQkJCS5zZXRNZXNzYWdlKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dCwKLQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyB0eXBlU3RyIH0pKTsKLQkJCQlmaW5hbCBTdHJpbmcgZGlyID0gZGlyRGxnLm9wZW4oKTsKLQkJCQlpZiAoZGlyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gcmV0ID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkucnVuV2l0aFByb2dyZXNzKAotCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlJbXBvcnRFeHBvcnRVdGlsLnJlcGxhY2UocHJvY0NvbXAsCi0JCQkJCQkJCQkJCQkJZGlyKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0sCi0JCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQsCi0JCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyB0eXBlU3RyIH0pKTsKLQotCQkJCWlmIChyZXQpIHsKLQkJCQkJLy8gUmVvcGVuIHRoZSBsaWJyYXJ5LgotCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkoCi0JCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBvcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCQkJCVZhcmlhYmlsaXR5U2VsZWN0aW9uIHZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFZhcmlhYmlsaXR5U2VsZWN0aW9uKCk7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IHZhcmlhYmlsaXR5U2VsZWN0aW9uCi0JCQkJCQkJLmdldFNlbGVjdGVkVmFyaWFiaWxpdHkoZWxlbWVudCk7Ci0JCQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihzZWxlY3RlZE9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCQlwcml2YXRlIGJvb2xlYW4gY2FuTW92ZTsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5Bc3NpZ247Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3I7Ci0JCQkJdHJ5IHsKLQkJCQkJbmF2aWdhdG9yID0gKFJlc291cmNlTmF2aWdhdG9yKSBnZXRQYWdlKCkuc2hvd1ZpZXcoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwKLQkJCQkJCQkudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJCUlSZXNvdXJjZSB3c1JlcyA9IFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShvYmopOwotCQkJCQlpZiAod3NSZXMgIT0gbnVsbCkgewotCQkJCQkJbmF2aWdhdG9yLmdldFZpZXdlcigpLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24od3NSZXMpLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5SZW5hbWU7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqLwotCQlwdWJsaWMgTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvcihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVEZWxldGVBY3Rpb24oKQotCQkgKi8KLQkJcHJvdGVjdGVkIERlbGV0ZUFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oKSB7Ci0JCQlMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRWxlbWVudHNWaWV3UGFzdGVBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGxvY2tlZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzdXBlci5ydW4oKTsKLQkJCQkJfSBjYXRjaCAoTWVzc2FnZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJU3RyaW5nIGRldGFpbHMgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhlKTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlOwotCQkJCQkJU3RyaW5nIHJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uOwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsIHJlYXNvbiwgZGV0YWlscywKLQkJCQkJCQkJCQllKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZhaWxlZCgpIHsKLQkJCQkJLy8gTGlicmFyeSBuZWVkIHRvIGJlIHJlbG9hZGVkLgotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KGdldFNpdGUoKS5nZXRTaGVsbCgpLCBBdXRob3JpbmdVSVJlc291cmNlcy5tc2dfcmVsb2FkTGlicmFyeSk7Ci0KLQkJCQkJLy8gVXNlciB0cmllZCB0byBzZWxlY3QgdGhlIG9sZCBzZWxlY3Rpb24uCi0JCQkJCWlmIChhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewotCQkJCQkJZmluYWwgQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpOwotCQkJCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIKLQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KQotCQkJCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQllbGVtZW50cyksIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWFjdGlvbi5zZXRQcm9ncmVzc01vbml0b3IoZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZUN1dEFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJCXJldHVybiBuZXcgTGlicmFyeVZpZXdDdXRBY3Rpb24oKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRWxlbWVudHNWaWV3UGFzdGVBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGxvY2tlZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVDb3B5QWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IExpYnJhcnlWaWV3Q29weUFjdGlvbigpewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlpZiggVmlld0hlbHBlci5oYXNDdXN0b21pemVkTG9ja2VyKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSAmJiBsb2NrZWQgKXsJCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZVBhc3RlQWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBQYXN0ZUFjdGlvbiBjcmVhdGVQYXN0ZUFjdGlvbigpIHsKLQkJCUxpYnJhcnlWaWV3UGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IExpYnJhcnlWaWV3UGFzdGVBY3Rpb24oKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRWxlbWVudHNWaWV3UGFzdGVBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGxvY2tlZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9OwotCQkJYWN0aW9uLnNldFByb2dyZXNzTW9uaXRvcihnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjaGVja0xvY2tlZCgpIHsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCWJvb2xlYW4gd2FzTG9ja2VkID0gbG9ja2VkOwotLy8JCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQkJaWYoVmlld0hlbHBlci5oYXNDdXN0b21pemVkTG9ja2VyKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSApewkJCQkJCi0JCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWRXaXRoQ3VzdG9taXplZExvY2tlcigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7CQkJCQkKLQkJCQl9ZWxzZXsKLQkJCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJCWlmICh3YXNMb2NrZWQgIT0gbG9ja2VkKSB7Ci0JCQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGRlbGV0ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pKTsKLQkJCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoY3V0QWN0aW9uCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikpOwotCQkJCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKHBhc3RlQWN0aW9uCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikpOwotCQkJCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCQkJCQlyZW5hbWVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQkJbW92ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCQkKLQkJCQkJLy9hc3NpZ25BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQkJdW5hc3NpZ25BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQkJcmVhc3NpZ25BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQkJLy9jdXN0b21DYXRlZ29yeURlZXBDb3B5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdm9pZCB1cGRhdGVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsJCQkKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCi0JCQlyZW5hbWVBY3Rpb24uc2V0QWN0aXZlV29ya2JlbmNoUGFydChMaWJyYXJ5Vmlldy50aGlzKTsKLQkJCWNhblJlbmFtZSA9IHJlbmFtZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsKTsKLQotLy8JCQlsb2NrZWQgPSBWaWV3SGVscGVyLmlzTG9ja2VkKHNlbCk7Ci0JCQlpZihWaWV3SGVscGVyLmhhc0N1c3RvbWl6ZWRMb2NrZXIoc2VsKSApewkJCQkJCi0JCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZFdpdGhDdXN0b21pemVkTG9ja2VyKHNlbCk7Ci0JCQl9ZWxzZXsKLQkJCQlsb2NrZWQgPSBWaWV3SGVscGVyLmlzTG9ja2VkKHNlbCk7Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gZW5hYmxlZCA9ICFsb2NrZWQ7Ci0JCQlpZihjYW5SZW5hbWUgJiYgIWVuYWJsZWQpIHsKLQkJCQlyZW5hbWVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCX0KLQkJCW1vdmVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQotCQkJdW5hc3NpZ25BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXJlYXNzaWduQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJCWNhbk1vdmUgPSBjYW5Nb3ZlKHNlbCk7Ci0JCQkKLQkJCWNhbkFzc2lnbiA9IGFzc2lnbkFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsKTsKLQotCQkJaWYgKCFsb2NrZWQgJiYgc2VsLnNpemUoKSA9PSAxCi0JCQkJCSYmIHNlbC5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlyZXBsYWNlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlcGxhY2VBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWwuc2l6ZSgpID09IDEpIHsKLQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQlvcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb24KLQkJCQkJCS5zZXRFbmFibGVkKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIG9iaikpOwotCQkJCXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uCi0JCQkJCQkuc2V0RW5hYmxlZChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNlbmFibGVHbG9iYWxFZGl0TWVudSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmFibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiZml4ZWQtYWRkaXRpb25zIiwgbmV3UGx1Z2luQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNhbk1vdmUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KQotCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCQkJCSYmICFUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotLy8JCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibWV0aG9kLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0vLwkJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtZXRob2QtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQlwZXJmb3JtTGlicmFyeVZhbGlkYXRpb25BY3Rpb24uc2V0SWQoUEVSRk9STV9JRCk7Ci0JCQlpZiAoQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5nZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpKSB7Ci0JCQkJdG9vbEJhck1hbmFnZXIuYWRkKHBlcmZvcm1MaWJyYXJ5VmFsaWRhdGlvbkFjdGlvbik7Ci0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI21lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQljaGVja0xvY2tlZCgpOwotCQkJCi0JCQkKLQotCQkJLy8gQWRkIG91ciBzdGFuZGFyZCBtYXJrZXIuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZml4ZWQtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZml4ZWQtYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQWRkIHRoZSBlZGl0IG1lbnUgYWN0aW9ucy4KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShsaWJyYXJ5Vmlld0VkaXRBY3Rpb24pKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjb3B5QWN0aW9uKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocGFzdGVBY3Rpb24pKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGRlbGV0ZUFjdGlvbikpOwotCQkJaWYgKGNhblJlbmFtZSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShyZW5hbWVBY3Rpb24pKTsKLQkJCX0KLQkJCWlmIChjYW5Nb3ZlKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKG1vdmVBY3Rpb24pKTsKLQkJCX0KLQkJCQotCQkJaWYgKGNhbkFzc2lnbikgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhc3NpZ25BY3Rpb24pKTsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0odW5hc3NpZ25BY3Rpb24pKTsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocmVhc3NpZ25BY3Rpb24pKTsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbikpOwkJCQkKLQkJCX0KLQotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInZpZXciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChvcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJCQlvcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb24pKTsKLQkJCX0KLQkJCWlmIChzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQkJCXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uKSk7Ci0JCQl9Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkJLy8gQWRkIG91ciBvdGhlciBzdGFuZGFyZCBtYXJrZXIgd2hlcmUgb3RoZXIgcGx1Z2lucyB3aWxsIGNvbnRyaWJ1dGUKLQkJCS8vIG1lbnUKLQkJCS8vCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlhZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQotCQkJaWYgKCFsb2NrZWQpIHsKLQkJCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7Ci0JCQkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsKLQkJCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotLy8JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbigiVGVzdCIpIHsKLS8vCQkJCS8qCi0vLwkJCQkgKiAobm9uLUphdmFkb2MpCi0vLwkJCQkgKgotLy8JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0vLwkJCQkgKi8KLS8vCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCQkvLyByZWxvYWQKLS8vCQkJCQkvLwotLy8vLwkJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLS8vLy8JCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotLy8vLwkJCQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0vLy8vCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotLy8vLwkJCQkJCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0vLy8vCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotLy8vLwkJCQkJCQlJbnRlcm5hbEVPYmplY3QgZSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpOwotLy8vLwkJCQkJCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGUKLS8vLy8JCQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0vLy8vCQkJCQkJCXJlc291cmNlU2V0LnVubG9hZChlKTsKLS8vLy8JCQkJCQkJVVJJIHVyaSA9IGUuZVByb3h5VVJJKCk7Ci0vLy8vCQkJCQkJCUVPYmplY3QgbmV3T2JqZWN0ID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChlLCB1cmksCi0vLy8vCQkJCQkJCQkJdHJ1ZSk7Ci0vLy8vCQkJCQkJCXJlZnJlc2hWaWV3cygpOwotLy8vLwkJCQkJCX0KLS8vLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQkvLyBwbHVnaW4vY29uZmlnIGZvbGRlcgotLy8JCQkJCS8vCi0vLwkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKTsKLS8vCQkJCQlpZihwZXJzaXN0ZXIgaW5zdGFuY2VvZiBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgewotLy8JCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBmaWxlUGVyc2lzdGVyID0gKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSBwZXJzaXN0ZXI7Ci0vLwkJCQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLS8vCQkJCQkJdHJ5IHsKLS8vCQkJCQkJCUZpbGUgZmlsZSA9IGZpbGVQZXJzaXN0ZXIuY3JlYXRlTWV0aG9kUGx1Z2luRm9sZGVyKCJwbHVnaW4xMDAiLCBsaWJyYXJ5KTsKLS8vCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGx1Z2luIGRpcjogIiArIGZpbGUpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCXRyeSB7Ci0vLwkJCQkJCQlGaWxlIGZpbGUgPSBmaWxlUGVyc2lzdGVyLmdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYnJhcnkpOwotLy8JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjb25maWcgZGlyOiAiICsgZmlsZSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0pOwotCQkJCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjcmVmcmVzaFZpZXdlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcikKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3ZXIoZmluYWwgVmlld2VyIHZpZXdlcikgewotCQkJaWYgKHZpZXdlciA9PSBMaWJyYXJ5Vmlldy50aGlzLmdldFZpZXdlcigpKSB7Ci0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0pOwotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIFJlZnJlc2ggYWxsIGxvYWRlZCByZXNvdXJjZXMgYW5kIGxvYWQgbmV3bHkgYWRkZWQgcmVzb3VyY2VzCi0JCQkJCQkJLy8KLQkJCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbWFuYWdlcgotCQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCBsaWJSZXNvdXJjZVNldDsKLQkJCQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldAotCQkJCQkJCQkJCSYmIChsaWJSZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkKLQkJCQkJCQkJCQkJCS5nZXRQZXJzaXN0ZW5jZVR5cGUoKQotCQkJCQkJCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCQkJCQkJU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSB7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWxpYlJlc291cmNlU2V0LmxvYWROZXdSZXNvdXJjZXMoKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJTGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJTGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdCgKLQkJCQkJCQkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkpCi0JCQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlcgotCQkJCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJCQlTdHJpbmcgbG9jID0gcmVzb3VyY2UuZ2V0VVJJKCkKLQkJCQkJCQkJCQkJCS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlcgotCQkJCQkJCQkJCQkJLmdldFJlc291cmNlRm9yTG9jYXRpb24obG9jKTsKLQkJCQkJCQkJCQlpZiAod3NSZXMgPT0gbnVsbCkgewotCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCQkJfSBlbHNlIGlmICghd3NSZXMKLQkJCQkJCQkJCQkJCS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW1vbml0b3Iud29ya2VkKDIpOwotCQkJCQkJCQkJaWYgKHJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpCi0JCQkJCQkJCQkJCSYmIGNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJZG9SZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsCi0JCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLCBudWxsLCBmYWxzZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlJUnVubmFibGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCXRyeSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKGNvbnRleHQsIHJ1bm5hYmxlLAotCQkJCQkJCQkJbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzdXBlci5yZWZyZXNoVmlld2VyKHZpZXdlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpCi0JICovCi0JcHVibGljIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCUlMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgYWN0aW9uQmFyID0gbmV3IExpYnJhcnlWaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoCi0JCQkJZWRpdGluZ0RvbWFpbik7Ci0JCXJldHVybiBhY3Rpb25CYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjY3JlYXRlQ29udGV4dE1lbnVGb3Iob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCksCi0JCQkJVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCksIExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLAotCQkJCW5ldyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUpOwotCQotCQkvLyBhZGQgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZvciBsaWJyYXJ5IHZhbGlkYXRpb24gcHJlZmVyZW5jZQotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWlmIChldmVudAotCQkJCQkJCQkuZ2V0UHJvcGVydHkoKQotCQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUHJlZmVyZW5jZXMuRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTikpIHsKLQkJCQkJCQlCb29sZWFuIGVuYWJsZWQgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBnZXRWaWV3U2l0ZSgpCi0JCQkJCQkJCS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJCQkJCi0JCQkJCQkJaWYgKGVuYWJsZWQgIT0gbnVsbCAmJiBlbmFibGVkLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJCXBlcmZvcm1MaWJyYXJ5VmFsaWRhdGlvbkFjdGlvbgotCQkJCQkJCQkJCS5zZXRJZChQRVJGT1JNX0lEKTsKLQkJCQkJCQkJdG9vbEJhck1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHBlcmZvcm1MaWJyYXJ5VmFsaWRhdGlvbkFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gdG9vbEJhck1hbmFnZXIuZ2V0SXRlbXMoKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXRlbXNbaV07Ci0JCQkJCQkJCQlpZiAoaXRlbS5nZXRJZCgpLmVxdWFscyhQRVJGT1JNX0lEKSkKLQkJCQkJCQkJCQl0b29sQmFyTWFuYWdlci5yZW1vdmUoaXRlbSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJdG9vbEJhck1hbmFnZXIudXBkYXRlKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldFJlZnJlc2hIYW5kbGVyKG51bGwpOwotCi0JCWlmIChmTGF5b3V0QWN0aW9uU2V0ICE9IG51bGwpCQotCQkJZkxheW91dEFjdGlvblNldC5kaXNwb3NlKCk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoZG91YmxlQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLnJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgSXRlbVByb3ZpZGVyCi0JICogQHJldHVybiBQcm9jZXNzQ29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnQgZ2V0UHJvY2Vzc0NvbXBvbmVudChPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQ7Ci0JCWZvciAocGFyZW50ID0gb2JqOyAocGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSk7KSB7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3RhdHVzV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIGV4dGVuZHMKLQkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB7Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBlcnJNc2c7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZXJyTXNnOwotCQl9Ci0JfQotCi0JLyoqCi0JICogb3BlbnMgYSBNZXRob2QgTGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgb3BlbkxpYnJhcnkoZmluYWwgU3RyaW5nIHBhdGgpIHsKLQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcKLQkJLy8gYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgotCQlTdGF0dXNXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFN0YXR1c1dvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQotCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuaW5nTGlicmFyeVRhc2tfbmFtZSwKLQkJCQkJCTIpOwotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gWE1JTGlicmFyeVV0aWwKLQkJCQkJCQkub3Blbk1ldGhvZExpYnJhcnkocGF0aCk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkoCi0JCQkJCQkJbGlicmFyeSk7Ci0JCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldFNhdmVkTGlicmFyeVBhdGgocGF0aCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJCQkJCWlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoIiMjIyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgcHJvamVjdEZpbGVOYW1lID0gbWVzc2FnZS5zdWJzdHJpbmcoMyk7Ci0JCQkJCQkJU3RyaW5nIHByb21wdCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfMzUsCi0JCQkJCQkJCQkobmV3IE9iamVjdFtdIHsgcHJvamVjdEZpbGVOYW1lIH0pKTsKLQkJCQkJCQlpZiAoTXNnQm94LnByb21wdChwcm9tcHQsIFNXVC5SRVRSWSB8IFNXVC5DQU5DRUwpID09IFNXVC5SRVRSWSkgewotCQkJCQkJCQlvcGVuTGlicmFyeShwYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLAotCQkJCQkJCQkJCWV4KTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCi0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsCi0JCQkJCW9wZXJhdGlvbik7Ci0JCQlpZiAob3BlcmF0aW9uLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNoYW5kbGVBY3RpdmF0ZShvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXN1cGVyLmhhbmRsZUFjdGl2YXRlKHBhcnQpOwotCi0JCS8vIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG1ldGhvZCBsaWJyYXJ5IG9wZW4gaXMgbm90IGNsb3NlZC4KLQkJWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnlQcm9qZWN0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlNhdmVhYmxlTGlicmFyeVZpZXdQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQkvLyBUaGlzIHZpZXcgc2hvdWxkIG5vdCBwYXJ0aWNpcGF0ZSBpbiBhbGwgdGhlIHNhdmUgY29tbWFuZHMuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuU2F2ZWFibGVMaWJyYXJ5Vmlld1BhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGJ5IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaW5rV2l0aEVkaXRvciBHaXZlbiBhbgotCSAqIG9iamVjdCB0aGF0IGlzIGEgTWV0aG9kRWxlbWVudCwgc2VsZWN0cyB0aGF0IG9iamVjdCBpbiB0aGUgTGliIE5hdgotCSAqIAotCSAqIEBwYXJhbSBvCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkKLQkJCXJldHVybjsKLQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlzdXBlci5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG8gfSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIG8pOwotCi0JCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgcGx1Z2luQWRhcHRlciA9IChNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJLmdldEFkYXB0ZXIocGx1Z2luLCBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCi0JCQlNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGxpYnJhcnlBZGFwdGVyID0gKE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJLmdldEFkYXB0ZXIoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmNsYXNzKTsKLQotCQkJLy8gZXhwYW5kIHBsdWdpbiBwYWNrYWdlcwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwbHVnaW5UcmVlQWRhcHRlciA9IGxpYnJhcnlBZGFwdGVyLmdldFBsdWdpbkl0ZW1Qcm92aWRlcihwbHVnaW4pOwotCQkJd2hpbGUgKHBsdWdpblRyZWVBZGFwdGVyIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwbHVnaW5UcmVlQWRhcHRlciwgdHJ1ZSk7Ci0JCQkJcGx1Z2luVHJlZUFkYXB0ZXIgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpcGx1Z2luVHJlZUFkYXB0ZXIpLmdldFBsdWdpbkl0ZW1Qcm92aWRlcihwbHVnaW4pOwotCQkJfQotCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHBsdWdpbiwgdHJ1ZSk7Ci0KLQkJCQotCQkJaWYgKG8gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7CQkJCQotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudClvKTsKLQkJCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQkJbyA9IHByb2MuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwbHVnaW5BZGFwdGVyLmdldENoaWxkcmVuKHBsdWdpbikKLQkJCQkJCS50b0FycmF5KClbMV0sIHRydWUpOwotCQkJCS8vIEV4cGFuZCB0aGUgcHJvY2VzcyBwYWNrYWdlcy4KLQkJCQlleHBhbmRUcmVlVmlld2VyUGFja2FnZXMoKChNZXRob2RFbGVtZW50KSBvKS5lQ29udGFpbmVyKCkpOwotCi0JCQl9IGVsc2UgewotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBtZXRob2RDb250ZW50UGtnID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGx1Z2luQWRhcHRlcgotCQkJCQkJLmdldENoaWxkcmVuKHBsdWdpbikudG9BcnJheSgpWzBdOwotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShtZXRob2RDb250ZW50UGtnLCB0cnVlKTsKLQotCQkJCWlmIChvIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsJCQkJCQotCQkJCQlDdXN0b21DYXRlZ29yeSByb290Q0MgPSBUbmdVdGlsCi0JCQkJCQkJLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJCQkJCQkJCQotCQkJCQkvLyBmaW5kIHRoZSB0cmVlIHBhdGggdG8gdGhlIGN1c3RvbSBjYXRlZ29yeSBmcm9tIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeQotCQkJCQkvLwotCQkJCQlmaW5hbCBMaXN0PE9iamVjdD4gdHJlZVBhdGggPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQkJZm9yKEN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSBvOyBjYyAhPSByb290Q0M7KSB7Ci0JCQkJCQl0cmVlUGF0aC5hZGQoMCwgY2MpOwotCQkJCQkJY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoY2MpLmdldCgwKTsJCQkJCQkgCi0JCQkJCX0KLQkJCQkJCi0JCQkJCW8gPSBleHBhbmRUcmVlKHJvb3RDQywgdHJlZVBhdGgpOwotCQkJCQkKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQkJT2JqZWN0IHN0ZENhdHMgPSBtZXRob2RDb250ZW50UGtnLmdldENoaWxkcmVuKG8pLnRvQXJyYXkoKVsxXTsKLQkJCQkJCQkJCi0JCQkJCS8vIGZpbmQgdGhlIHRyZWUgcGF0aCB0byB0aGUgY2F0ZWdvcnkgZnJvbSB0aGUgcm9vdCAiU3RhbmRhcmQgQ2F0ZWdvcmllcyIgY2F0ZWdvcnkKLQkJCQkJLy8KLQkJCQkJZmluYWwgTGlzdDxPYmplY3Q+IHRyZWVQYXRoID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQkJLy8gZGlzY2lwbGluZXMgY2FuIG5lc3QKLQkJCQkJCU9iamVjdCBkaXMgPSBvOwotCQkJCQkJZG8gewotCQkJCQkJCXRyZWVQYXRoLmFkZCgwLCBkaXMpOwotCQkJCQkJCUxpc3QgcGFyZW50RGlzYyA9IEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmUoKERpc2NpcGxpbmUpZGlzKTsKLQkJCQkJCQlpZiAocGFyZW50RGlzYy5pc0VtcHR5KCkpIGJyZWFrOwotCQkJCQkJCWRpcyA9IHBhcmVudERpc2MuZ2V0KDApOwkJCQkJCSAKLQkJCQkJCX0gd2hpbGUgKHRydWUpOwotCQkJCQkJLy8gZ2V0IGRpc2NpcGxpbmUgZ3JvdXAKLQkJCQkJCWlmICghQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlkaXMpLmlzRW1wdHkoKSkgewotCQkJCQkJCURpc2NpcGxpbmVHcm91cGluZyBkZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpZGlzKS5nZXQoMCk7Ci0JCQkJCQkJdHJlZVBhdGguYWRkKDAsIGRnKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGdldCAiRGlzY2lwbGluZXMiCi0JCQkJCQl0cmVlUGF0aC5hZGQoMCwgVG5nVXRpbC5nZXREaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihwbHVnaW4pKTsKLQkJCQkJCW8gPSBleHBhbmRUcmVlKHN0ZENhdHMsIHRyZWVQYXRoKTsKLQkJCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCQkJLy8gcm9sZXNldHMgY2Fubm90IG5lc3QKLQkJCQkJCXRyZWVQYXRoLmFkZCgwLCBvKTsKLQkJCQkJCVJvbGVTZXRHcm91cGluZyByc2cgPSAoUm9sZVNldEdyb3VwaW5nKSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KW8pLmdldCgwKTsJCQkJCQkgCi0JCQkJCQl0cmVlUGF0aC5hZGQoMCwgcnNnKTsKLQkJCQkJCS8vIGdldCAiUm9sZVNldHMiCi0JCQkJCQl0cmVlUGF0aC5hZGQoMCwgVG5nVXRpbC5nZXRSb2xlU2V0c0l0ZW1Qcm92aWRlcihwbHVnaW4pKTsKLQkJCQkJCW8gPSBleHBhbmRUcmVlKHN0ZENhdHMsIHRyZWVQYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShzdGRDYXRzLCB0cnVlKTsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJT2JqZWN0IGNvcmVDb250ZW50ID0gbWV0aG9kQ29udGVudFBrZy5nZXRDaGlsZHJlbihvKQotCQkJCQkJCS50b0FycmF5KClbMF07Ci0JCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShjb3JlQ29udGVudCwgdHJ1ZSk7Ci0KLQkJCQkJLy8gRXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2VzLgotCQkJCQlleHBhbmRUcmVlVmlld2VyUGFja2FnZXMoKChNZXRob2RFbGVtZW50KSBvKS5lQ29udGFpbmVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0KLQkJc3VwZXIuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBvIH0pKTsKLQotCQlpZihvIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCAmJiBvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkvLyBvcGVuIHRoZSBwcm9jZXNzIGluIGl0cyBlZGl0b3IgYW5kIHNlbGVjdCB0aGUgYnJlYWtkb3duIGVsZW1lbnQKLQkJCS8vCi0JCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKS5vcGVuRWRpdG9yKG8pOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5maW5kRWRpdG9yKG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoKE1ldGhvZEVsZW1lbnQpIG8pKTsKLQkJCWlmKGVkaXRvciBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCQlQcm9jZXNzRWRpdG9yIHByb2NFZGl0b3IgPSAoKFByb2Nlc3NFZGl0b3IpZWRpdG9yKTsKLQkJCQlTdHJpbmcgcGFnZUlkOwotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCXBhZ2VJZCA9IFByb2Nlc3NFZGl0b3IuVEFfRk9STV9JRDsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJcGFnZUlkID0gUHJvY2Vzc0VkaXRvci5XUEJTX0ZPUk1fSUQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYWdlSWQgPSBQcm9jZXNzRWRpdG9yLldCU19GT1JNX0lEOwotCQkJCX0KLQkJCQlwcm9jRWRpdG9yLnNldEFjdGl2ZVBhZ2UocGFnZUlkKTsKLQkJCQlwcm9jRWRpdG9yLnNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JqZWN0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZXhwYW5kVHJlZShPYmplY3Qgcm9vdCwgTGlzdCB0cmVlUGF0aCkgewotCQlPYmplY3QgcGFyZW50ID0gcm9vdDsKLQkJaW50IHNpemUgPSB0cmVlUGF0aC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgZSA9IHRyZWVQYXRoLmdldChpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwYXJlbnQsIHRydWUpOwotCQkJLy8gZ2V0IHdyYXBwZXIKLQkJCS8vCi0JCQlMaXN0IG5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMgPSBUbmdVdGlsLmdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoYWRhcHRlckZhY3RvcnksIGUpOwotCQkJaWYgKCFub3RpZnlDaGFuZ2VkTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJCWZpbmRfd3JhcHBlcjoKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm90aWZ5Q2hhbmdlZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYobGlzdGVuZXIgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkJJiYgVG5nVXRpbC51bndyYXAobGlzdGVuZXIpID09IGUpIHsKLQkJCQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBsaXN0ZW5lcjsKLQkJCQkJCWZvcig7d3JhcHBlciAhPSBudWxsICYmIHdyYXBwZXIuZ2V0T3duZXIoKSAhPSBwYXJlbnQ7IAotCQkJCQkJCXdyYXBwZXIgPSBUbmdVdGlsLmdldFdyYXBwZXIod3JhcHBlci5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCksIGUpKSB7CQkJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlpZih3cmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCQlwYXJlbnQgPSB3cmFwcGVyOwotCQkJCQkJCWJyZWFrIGZpbmRfd3JhcHBlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcGFyZW50ID0gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBleHBhbmRUcmVlVmlld2VyUGFja2FnZXMoRU9iamVjdCBlKSB7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgfHwgZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlleHBhbmRUcmVlVmlld2VyUGFja2FnZXMoZS5lQ29udGFpbmVyKCkpOwotCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKGUsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5JUmVmcmVzaEhhbmRsZXIjcmVmcmVzaChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlDb250cm9sIGN0cmwgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGN0cmwuZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCWRvUmVmcmVzaChnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRvUmVmcmVzaChudWxsKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmxvY2tpbmdSZWZyZXNoKGZpbmFsIEFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VzLAotCQkJZmluYWwgQXJyYXlMaXN0IGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBDb2xsZWN0aW9uIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLAotCQkJZmluYWwgYm9vbGVhbiByZWZyZXNoVmlld3MsIFNoZWxsIHNoZWxsKSB7Ci0JCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCQltb25pdG9yCi0JCQkJCQkuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0pOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIG1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlkb1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcywKLQkJCQkJCQlhZGRlZFdvcmtzcGFjZVJlc291cmNlcywgcmVmcmVzaFZpZXdzKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQlJUnVubmFibGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLQkJdHJ5IHsKLQkJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKQotCQkJCQkucnVuSW5VSSgKLQkJCQkJCQljb250ZXh0LAotCQkJCQkJCXJ1bm5hYmxlLAotCQkJCQkJCW5ldyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUoTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQllLnRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTXVzdCBiZSBzeW5jaHJvbml6ZWQgdG8gYXZvaWQgc3RlcHBpbmcgb24gZWFjaCBvdGhlciBpbiByZWxvYWRpbmcKLQkgKiByZXNvdXJjZXMvcmVmcmVzaGluZyBVSQotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVkUmVzb3VyY2VzCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgSVJlc291cmNlIG9iamVjdHMgdGhhdCBhcmUganVzdCBuZXdseSBhZGRlZCB0bwotCSAqICAgICAgICAgICAgdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gcmVmcmVzaFZpZXdzCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBkb1JlZnJlc2goQ29sbGVjdGlvbiByZW1vdmVkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzLCBDb2xsZWN0aW9uIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLAotCQkJYm9vbGVhbiByZWZyZXNoVmlld3MpIHsKLQkJSGFzaFNldCBlZGl0b3JzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJaGFuZGxlUmVtb3ZlZFJlc291cmNlcyhyZW1vdmVkUmVzb3VyY2VzLCBlZGl0b3JzVG9SZWZyZXNoKTsKLQkJCXJlZnJlc2hWaWV3cyA9IHRydWU7Ci0JCX0KLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBlZGl0b3JzVG9SZWZyZXNoLAotCQkJCQlyZWZyZXNoVmlld3MpOwotCQl9IGVsc2UgewotCQkJaWYgKHJlZnJlc2hWaWV3cykgewotCQkJCXJlZnJlc2hWaWV3cygpOwotCQkJfQotCi0JCQlpZiAoIWVkaXRvcnNUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQkJLy8gcmVmcmVzaCB0aGUgZWRpdG9ycyB0aGF0IGhhbmRsZVJlbW92ZWRSZXNvdXJjZXMgcmVxdWVzdGVkCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGl0b3JzVG9SZWZyZXNoLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlZGl0b3IgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzICE9IG51bGwKLQkJCQkmJiAhYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG1nci5nZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJLmxvYWROZXdSZXNvdXJjZXMoYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpOwotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpLmdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKS52YWxpZGF0ZUFsbE1hcmtlcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWaWV3T2JqZWN0KE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCSYmICEobyBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbgotCQkJCQkJfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50IHx8IChvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgVW1hVXRpbAotCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoKE1ldGhvZEVsZW1lbnQpIG8pID09IG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9SZWZyZXNoKElSZWZyZXNoRXZlbnQgZXZlbnQsIFNoZWxsIHNoZWxsKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiUmVmcmVzaGVkIG9iamVjdHM6ICIgKyBldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldFJlZnJlc2hlZE9iamVjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoaXNWaWV3T2JqZWN0KGUpKSB7Ci0JCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlZnJlc2gpIHsKLQkJCXJlZnJlc2hWaWV3cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBMaWJyYXJ5IFZpZXcKLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9SZWZyZXNoKFNoZWxsIHNoZWxsKSB7Ci0JCWZpbmFsIGJvb2xlYW4gcmVmcmVzaFZpZXdzID0gIVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKS5pc0VtcHR5KCkKLQkJCQl8fCAhUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldEFkZGVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpOwotCQlBcnJheUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7Ci0JCUFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJQXJyYXlMaXN0IGFkZGVkV3NSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRBZGRlZFdvcmtzcGFjZVJlc291cmNlcygpKTsKLQotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFhZGRlZFdzUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCByZWZyZXNoVmlld3MpIHsKLQkJCWJsb2NraW5nUmVmcmVzaChyZW1vdmVkUmVzb3VyY2VzLCBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJCQlhZGRlZFdzUmVzb3VyY2VzLCByZWZyZXNoVmlld3MsIHNoZWxsKTsKLQkJfQotCi0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZW1vdmVkUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQlyZW1vdmVkUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0Q2hhbmdlZFJlc291cmNlcygpLnJlbW92ZUFsbCgKLQkJCQkJY2hhbmdlZFJlc291cmNlcyk7Ci0JCX0KLQkJaWYgKCFhZGRlZFdzUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQlhZGRlZFdzUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAocmVmcmVzaFZpZXdzKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCkKLQkJCQkJLmNsZWFyKCk7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlbW92ZWRSZXNvdXJjZXMyCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGhhbmRsZVJlbW92ZWRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZW1vdmVkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbiBlZGl0b3JzVG9SZWZyZXNoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3QgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgcmVtb3ZlZFJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3QocmVtb3ZlZFJlc291cmNlcyk7Ci0JCWlmIChlZGl0b3JzVG9SZWZyZXNoID09IG51bGwpIHsKLQkJCWVkaXRvcnNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJLy8gZmluZCBhbGwgZWRpdG9yIHdpdGggZGlydHkgY29uZmxpY3QKLQkJLy8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcgotCQkJCQkJLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCkgIT0gbnVsbCA/IGlucHV0Ci0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpLmVSZXNvdXJjZSgpIDogbnVsbDsKLQkJCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZWRSZXNvdXJjZUxpc3QKLQkJCQkJCQkuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCXJlc291cmNlID0gKFJlc291cmNlKSByZW1vdmVkUmVzb3VyY2VMaXN0LmdldChqKTsKLQkJCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZCA9IHNlbGVjdERpcnR5RWRpdG9ycyhkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKHNlbGVjdGVkW2ldKTsKLQkJCX0KLQkJfQotCi0JCS8vIFVubG9hZCB0aGUgcmVtb3ZlZCByZXNvdXJjZXMuCi0JCVBlcnNpc3RlbmNlVXRpbC51bmxvYWQocmVtb3ZlZFJlc291cmNlcyk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IgJiYgIWVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVtb3ZlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZWxvYWRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc1RvUmVmcmVzaCwgYm9vbGVhbiBmb3JjZVJlZnJlc2hWaWV3cykgewotCQlpZiAoIWZvcmNlUmVmcmVzaFZpZXdzKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGFuZ2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlCi0JCQkJCQkmJiAoKElMaWJyYXJ5UmVzb3VyY2UpIHJlc291cmNlKS5nZXRMb2FkU3RhbXAoKSA+IGxhc3RSZWZyZXNoVGltZVN0YW1wKSB7Ci0JCQkJCWZvcmNlUmVmcmVzaFZpZXdzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIG51bGwsCi0JCQkJZm9yY2VSZWZyZXNoVmlld3MsIGVkaXRvcnNUb1JlZnJlc2gpOwotCX0KLQotCS8qKgotCSAqIHVwZGF0ZXMgTGlicmFyeSBWaWV3IHdoZW4gcmVzb3VyY2VzIGNoYW5nZQotCSAqIAotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHBhcmFtIGVkaXRvcnNOb3RUb1JlZnJlc2gKLQkgKiBAcGFyYW0gZm9yY2VSZWZyZXNoVmlld3MKLQkgKiBAcGFyYW0gZWRpdG9yc1RvUmVmcmVzaAotCSAqIEByZXR1cm4gTGlzdCBvZiBjaGFuZ2VkIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbiBlZGl0b3JzTm90VG9SZWZyZXNoLCBib29sZWFuIGZvcmNlUmVmcmVzaFZpZXdzLAotCQkJQ29sbGVjdGlvbiBlZGl0b3JzVG9SZWZyZXNoKSB7Ci0JCUNvbnRyb2wgY3RybCA9IGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3Q8SUVkaXRvclBhcnQ+IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KGNoYW5nZWRSZXNvdXJjZXMpOwotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCBjaGFuZ2VkUmVzb3VyY2VMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBjaGFuZ2VkUmVzb3VyY2VMaXN0LmdldChqKTsKLQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuYWRkKGVkaXRvcik7Ci0JCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbCBBcnJheUxpc3QgZWRpdG9yTGlzdFRvUmVmcmVzaCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGVkaXRvcnNUb1JlZnJlc2ggIT0gbnVsbCkgewotCQkJZWRpdG9yTGlzdFRvUmVmcmVzaC5hZGRBbGwoZWRpdG9yc1RvUmVmcmVzaCk7Ci0JCX0KLQkJaWYgKCFkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBzZWxlY3REaXJ0eUVkaXRvcnMoZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0KTsKLQkJCWlmKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IGVkaXRvciA9IHJlc3VsdFtpXTsKLQkJCQkJaWYgKChlZGl0b3JzTm90VG9SZWZyZXNoID09IG51bGwgfHwgIWVkaXRvcnNOb3RUb1JlZnJlc2gKLQkJCQkJCQkuY29udGFpbnMoZWRpdG9yKSkKLQkJCQkJCQkmJiAoZWRpdG9yc1RvUmVmcmVzaCA9PSBudWxsIHx8ICFlZGl0b3JzVG9SZWZyZXNoCi0JCQkJCQkJCQkuY29udGFpbnMoZWRpdG9yKSkpIHsKLQkJCQkJCWVkaXRvckxpc3RUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QucmVtb3ZlKGVkaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGRpcnR5IGVkaXRvcnMgd2l0aCBjb25mbGljdCBmcm9tIHRoZQotCQkJLy8gY29sbGVjdGlvbiBvZiBjaGFuZ2VkIHJlc291cmNlcyBhZnRlciB1cGRhdGluZyBjYWNoZWQgbW9kaWZpY2F0aW9uIHN0YW1wCi0JCQkvLyBzbyB0aGV5IHdpbGwgbm90IGJlIHByb21wdGVkIHRvIHJlbG9hZCBhZ2FpbiB1bnRpbCB0aGUgbmV4dCBleHRlcm5hbCBjaGFuZ2UKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5zaXplKCk7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdAotCQkJCQkJLmdldChpKTsJCQkJCi0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IGVkaXRvci5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJdXNlZFJlc291cmNlcy5yZXRhaW5BbGwoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQkJZWRpdG9yLnVwZGF0ZVJlc291cmNlSW5mb3ModXNlZFJlc291cmNlcyk7Ci0JCQkJZWRpdG9yLm92ZXdyaXRlUmVzb3VyY2VzKHVzZWRSZXNvdXJjZXMpOwotCQkJCWNoYW5nZWRSZXNvdXJjZUxpc3QucmVtb3ZlQWxsKHVzZWRSZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiByZWZyZXNoVmlld3MgPSBmYWxzZTsKLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IgJiYgIWVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3QKLQkJCQkJCQkuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBjaGFuZ2VkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJCS5nZXQoaik7Ci0JCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCQllZGl0b3JMaXN0VG9SZWZyZXNoLmFkZChlZGl0b3IpOwotCQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZWxvYWQgdGhlIHNlbGVjdGVkIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRlZFJlc291cmNlcyA9IG1hbmFnZXIKLQkJCQkJCS5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0KLQkJCQlyZWZyZXNoVmlld3MgPSAhcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpOwotCQkJfQotCQl9Ci0JCWlmIChmb3JjZVJlZnJlc2hWaWV3cyB8fCByZWZyZXNoVmlld3MpIHsKLQkJCXJlZnJlc2hWaWV3cygpOwotCQl9Ci0JCWlmICghZWRpdG9yTGlzdFRvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yTGlzdFRvUmVmcmVzaC5zaXplKCk7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvckxpc3RUb1JlZnJlc2gKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJZWRpdG9yLnJlZnJlc2goKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VMaXN0OwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyBMaWJyYXJ5IGFuZCBDb25maWd1cmF0aW9uIHZpZXdzIGlmIG5lY2Vzc2FyeQotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWZyZXNoVmlld3MoKSB7Ci0JCUVPYmplY3QgaW5wdXQgPSAoRU9iamVjdCkgZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dC5lSXNQcm94eSgpKSB7Ci0JCQkJc2V0SW5wdXRGb3JWaWV3ZXIoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoaW5wdXQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJdXBkYXRlTGFzdFJlZnJlc2hUaW1lc3RhbXAoKTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQlPYmplY3QgbyA9IG51bGw7Ci0JCQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxCi0JCQkJCQkJJiYgKG8gPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKSBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJCQkmJiAoKEVPYmplY3QpIG8pLmVJc1Byb3h5KCkpIHsKLQkJCQkJCW8gPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZSgoRU9iamVjdCkgbyk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKG8pOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVZpZXdIZWxwZXIucmVzdG9yZVNlbGVjdGlvbihnZXRWaWV3ZXIoKSwgc2VsZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbmZpZ3VyYXRpb25WaWV3IGNvbmZpZ1ZpZXcgPSBDb25maWd1cmF0aW9uVmlldy5nZXRWaWV3KCk7Ci0JCWlmIChjb25maWdWaWV3ICE9IG51bGwpIHsKLQkJCUNvbnRyb2wgY3RybCA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQkJaWYgKGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpbnB1dCA9IChFT2JqZWN0KSBjb25maWdWaWV3LmdldFZpZXdlcigpLmdldElucHV0KCk7Ci0JCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJaWYgKGlucHV0LmVJc1Byb3h5KCkpIHsKLQkJCQkJCWNvbmZpZ1ZpZXcuc2V0SW5wdXRGb3JWaWV3ZXIoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5yZXNvbHZlKGlucHV0KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJCQlWaWV3SGVscGVyLnJlc3RvcmVTZWxlY3Rpb24oY29uZmlnVmlldy5nZXRWaWV3ZXIoKSwgc2VsZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gc2VsZWN0RGlydHlFZGl0b3JzKExpc3Q8Pz4gZGlydHlFZGl0b3JzKSB7Ci0JCXJldHVybiBSZWZyZXNoSGFuZGxlci5zZWxlY3REaXJ0eUVkaXRvcnMoZGlydHlFZGl0b3JzLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JfQotCi0JLyoqCi0JICogcmVuYW1lIGFuIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgZWxlbWVudCB0byByZW5hbWUKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1blJlbmFtZShmaW5hbCBOYW1lZEVsZW1lbnQgZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVJlbmFtZUFjdGlvbi5kb1JlbmFtZShlLCBuZXdOYW1lKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXQjc2hvdyhvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdyhTaG93SW5Db250ZXh0IGNvbnRleHQpIHsKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgU2hvd0luQ29udGV4dCBmcm9tIHByb2JsZW1zIHZpZXcKLQkJLy8KLQkJaWYgKGNvbnRleHQuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIE1hcmtlckFkYXB0ZXIpIHsKLQkJCUlWaWV3UGFydCB2aWV3ID0gZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkuZmluZFZpZXcoCi0JCQkJCSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIpOyAvLyROT04tTkxTLTEkCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSB2aWV3LmdldFZpZXdTaXRlKCkKLQkJCQkJLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3QgbyA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIG87Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIKLQkJCQkJCQkuZ2V0QXR0cmlidXRlKExpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLkdVSUQpOwotCQkJCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBsaWJNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwkJCQkJCQotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsaWJNZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkKLQkJCQkJCQkJLmdldFJlc291cmNlKAotCQkJCQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKHdzUmVzLmdldExvY2F0aW9uKCkKLQkJCQkJCQkJCQkJCS50b1N0cmluZygpKSwgZmFsc2UpOwotCQkJCQkJT2JqZWN0IGVsZW1lbnQ7Ci0JCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJZWxlbWVudCA9IHJlc291cmNlLmdldEVPYmplY3QoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllbGVtZW50ID0gbGliTWdyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihlbGVtZW50KTsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlTZWxlY3Rpb24gY29udGV4dFNlbGVjdGlvbiA9IGNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChjb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbikgewotCQkJLy8gZnJvbSBzZWFyY2ggcmVzdWx0cyB2aWV3Ci0JCQlUcmVlU2VsZWN0aW9uIHNlbCA9IChUcmVlU2VsZWN0aW9uKWNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWwuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9IGVsc2UgaWYgKGNvbnRleHRTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkvLyBmcm9tIHByb2JsZW1zIHZpZXcsIHBlcmhhcHMgb3RoZXJzPwotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbiljb250ZXh0U2VsZWN0aW9uOwotCQkJT2JqZWN0IGZpcnN0T2JqID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKGZpcnN0T2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJSVJlc291cmNlIHdzUmVzID0gKElSZXNvdXJjZSlmaXJzdE9iajsKLQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsJCQkJCQkKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxpYk1nci5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJLmdldFJlc291cmNlKAotCQkJCQkJCQlVUkkuY3JlYXRlRmlsZVVSSSh3c1Jlcy5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCQkJLnRvU3RyaW5nKCkpLCBmYWxzZSk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKGVsZW1lbnQpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld0lkKCkgewotCQlyZXR1cm4gVklFV19JRDsKLQl9Ci0KLQlwdWJsaWMgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q29udGVudERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlci5zZXRDb250ZW50RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTG9ja2VyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Mb2NrZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OTg0ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Mb2NrZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIExvY2tlckZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gIkN1c3RvbWl6ZWRMb2NrZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImNsYXNzIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJfTkFNRSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiaWQiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQl9OQU1FID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMb2NrZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIGxpYnJhcnkgbWFuYWdlciBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCXByaXZhdGUgTWFwPFN0cmluZywgTG9ja2VyRWxlbWVudD4gbG9ja2VyRWxlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvY2tlckVsZW1lbnQ+KCk7Ci0JCi0JLy9BIG1hcCB0byBtYW5hZ2UgaWQgYW5kIGxvY2tlciBwYWlycy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIEFic3RyYWN0TG9ja2VyPiBsb2NrZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFic3RyYWN0TG9ja2VyPigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9ja2VyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYoaW5zdGFuY2UgPT0gbnVsbCl7Ci0JCQlzeW5jaHJvbml6ZWQoTG9ja2VyRmFjdG9yeS5jbGFzcyl7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTG9ja2VyRmFjdG9yeSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExvY2tlckZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCS5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUklCX05BTUUpOwotCQkJCQkJU3RyaW5nIGlkID0gY29uZmlnRWxlbWVudAotCQkJCQkJLmdldEF0dHJpYnV0ZShJRF9BVFRSSUJfTkFNRSk7Ci0JCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgaWQgIT0gbnVsbCAmJiBpZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7CQkJCQkJCQotCQkJCQkJCUxvY2tlckVsZW1lbnQgcHJvdmlkZXIgPSBsb2NrZXJFbGVtZW50cy5nZXQoaWQpOwotCQkJCQkJCWlmKHByb3ZpZGVyID09IG51bGwgKSB7Ci0JCQkJCQkJCXByb3ZpZGVyID0gbmV3IExvY2tlckVsZW1lbnQoCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIGlkKTsKLQkJCQkJCQkJbG9ja2VyRWxlbWVudHMucHV0KGlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RMb2NrZXIgZ2V0TG9ja2VyKE9iamVjdCBvYmopIHsKLQkJaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50KW9iaik7CQkJCi0JCQlpZiAoZSAhPSBudWxsICkgewotCQkJCUxpc3QgcHJvcHMgPSBlLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQkJCWlmICggcHJvcHMgIT0gbnVsbCAmJiBwcm9wcy5zaXplKCkgPiAwICkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KWl0cC5uZXh0KCk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBwcm9wLmdldE5hbWUoKTsKLQkJCQkJCUFic3RyYWN0TG9ja2VyIGxvY2tlcj0gZ2V0TG9ja2VyKGlkKTsKLQkJCQkJCWlmICggbG9ja2VyICE9IG51bGwgKSB7CQkJCQkJCi0JCQkJCQkJcmV0dXJuIGxvY2tlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdExvY2tlciBnZXRMb2NrZXIoU3RyaW5nIGlkKSB7Ci0KLQkJaWYgKCAhbG9ja2VyRWxlbWVudHMuY29udGFpbnNLZXkoaWQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvL3JldHVybiBjcmVhdGVkIGluc3RhbmNlCi0JCWlmKGxvY2tlck1hcC5jb250YWluc0tleShpZCkgKXsKLQkJCXJldHVybiBsb2NrZXJNYXAuZ2V0KGlkKTsKLQkJfQotCQkKLQkJTG9ja2VyRWxlbWVudCBwcm92aWRlciA9IChMb2NrZXJFbGVtZW50KSBsb2NrZXJFbGVtZW50cy5nZXQoaWQpOwotCQl0cnkgewotCQkJQ2xhc3MgY2xhenogPSBwcm92aWRlci5idW5kbGUubG9hZENsYXNzKHByb3ZpZGVyLmNsYXNzTmFtZSk7Ci0JCQlBYnN0cmFjdExvY2tlciBsb2NrZXJJbnN0YW5jZSA9IChBYnN0cmFjdExvY2tlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCWxvY2tlck1hcC5wdXQoaWQsIGxvY2tlckluc3RhbmNlKTsKLQkJCXJldHVybiBsb2NrZXJJbnN0YW5jZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NrZXJFbGVtZW50IHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJU3RyaW5nIGlkOwotCQlwcml2YXRlIExvY2tlckVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZThkZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlVmlld2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyOwotCi0vKioKLSAqIENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIGNsYXNzIHRoYXQgc3VwcG9ydHMgTWV0aG9kRWxlbWVudHMuCi0gKiBTcGVjaWZpY2FsbHksIGhhcyBjaGFuZ2VzIHRvIHN1cHBvcnQgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcnMuCi0gKiAKLSAqIEFsc28sIGV4cGFuZHMgdGhlIHRyZWUgZm9yIGNoZWNrZWQgaXRlbXMgd2hlbiB0aGV5IGFyZSBzZXQgdmlhCi0gKiBzZXRDaGVja2VkRWxlbWVudHMoLi4pIGlmZiBleHBhbmRXaGVuQ2hlY2tpbmcgaXMgdHJ1ZS4KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIGV4dGVuZHMKLQkJQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgewotCQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZFdoZW5DaGVja2luZyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemluZ1RyZWVDaGVja1N0YXRlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0IGNoaWxkcmVuQ2hlY2tTdGF0ZUxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlci4KLSAgICAgKiBAc2VlIENoZWNrYm94VHJlZVZpZXdlciNDaGVja2JveFRyZWVWaWV3ZXIoQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIGluaXRWaWV3ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSxpbnQpCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgaW5pdFZpZXdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlci4KLSAgICAgKiBAc2VlIENoZWNrYm94VHJlZVZpZXdlciNDaGVja2JveFRyZWVWaWV3ZXIoVHJlZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIoVHJlZSB0cmVlKSB7Ci0gICAgICAgIHN1cGVyKHRyZWUpOwotICAgICAgICBpbml0Vmlld2VyKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWaWV3ZXIoKSB7Ci0gICAgICAgIHNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0gICAgICAgIGFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVXcmFwcGVycyhldmVudC5nZXRFbGVtZW50KCkpOwotCQkJCWRvQ2hlY2tTdGF0ZUNoYW5nZWQoZXZlbnQuZ2V0RWxlbWVudCgpKTsKLQkJCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIGFkZFRyZWVMaXN0ZW5lcihuZXcgSVRyZWVWaWV3ZXJMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBXaWRnZXQgaXRlbSA9IGZpbmRJdGVtKGV2ZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplSXRlbSgoVHJlZUl0ZW0pIGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBpdGVtIGhhcyBleHBhbmRlZC4gVXBkYXRlcyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBpdHMgY2hpbGRyZW4uIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJdGVtKFRyZWVJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpICYmICFpdGVtLmdldEdyYXllZCgpKSB7Ci0gICAgICAgICAgICB1cGRhdGVDaGlsZHJlbkl0ZW1zKGl0ZW0pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGNoZWNrIHN0YXRlIG9mIGFsbCBjcmVhdGVkIGNoaWxkcmVuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hpbGRyZW5JdGVtcyhUcmVlSXRlbSBwYXJlbnQpIHsKLSAgICAgICAgSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLSAgICAgICAgYm9vbGVhbiBzdGF0ZSA9IHBhcmVudC5nZXRDaGVja2VkKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRyZWVJdGVtIGN1cnIgPSAoVHJlZUl0ZW0pIGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgaWYgKGN1cnIuZ2V0RGF0YSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgKChjdXJyLmdldENoZWNrZWQoKSAhPSBzdGF0ZSkgfHwgY3Vyci5nZXRHcmF5ZWQoKSkpIHsKLSAgICAgICAgICAgICAgICBjdXJyLnNldENoZWNrZWQoc3RhdGUpOwotICAgICAgICAgICAgICAgIGN1cnIuc2V0R3JheWVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBub3RpZnlDaGlsZHJlbkNoZWNrU3RhdGVMaXN0ZW5lcnMobmV3IENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQodGhpcywgY3Vyci5nZXREYXRhKCksCi0gICAgICAgICAgICAgICAgCQlzdGF0ZSkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbkl0ZW1zKGN1cnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tTdGF0ZUNoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAJaWYgKGluaXRpYWxpemluZ1RyZWVDaGVja1N0YXRlKSB7Ci0gICAgCQkvLyB3aGVuIGluaXRpYWxpemluZywgZG9uJ3QgdXBkYXRlIGNoaWxkcmVuOgotICAgIAkJLy8gcGFyZW50IG1heSBoYXZlIGJlZW4gZ3JheS1jaGVja2VkIGFuZCB3ZSBkb24ndAotICAgIAkJLy8gd2FudCB0byB3aGl0ZS1jaGVjayBhbGwgY2hpbGRyZW4KLSAgICAJCS8vIGNoaWxkcmVuIHdpbGwgYmUgY2hlY2tlZCBiZWNhdXNlIHNldENoZWNrZWRFbGVtZW50cyguLikKLSAgICAJCS8vIHR5cGljYWxseSByZWNlaXZlcyBsaXN0IG9mIGFsbCBjaGVja2VkIGVsZW1lbnRzCi0JCQlXaWRnZXQgaXRlbSA9IGZpbmRJdGVtKGVsZW1lbnQpOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBpdGVtOwotCQkJCXRyZWVJdGVtLnNldEdyYXllZChmYWxzZSk7Ci0JCQkJdXBkYXRlUGFyZW50SXRlbXModHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmRvQ2hlY2tTdGF0ZUNoYW5nZWQoZWxlbWVudCk7Ci0JCX0KLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBhcmVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgV2lkZ2V0IGl0ZW0gPSBmaW5kSXRlbShlbGVtZW50KTsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGl0ZW07Ci0gICAgICAgICAgICB1cGRhdGVQYXJlbnRJdGVtcyh0cmVlSXRlbS5nZXRQYXJlbnRJdGVtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgY2hlY2sgLyBncmF5IHN0YXRlIG9mIGFsbCBwYXJlbnQgaXRlbXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYXJlbnRJdGVtcyhUcmVlSXRlbSBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZW1bXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGl0ZW0pOwotICAgICAgICAgICAgYm9vbGVhbiBjb250YWluc0NoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNVbmNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUcmVlSXRlbSBjdXJyID0gKFRyZWVJdGVtKSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICBjb250YWluc0NoZWNrZWQgfD0gY3Vyci5nZXRDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNVbmNoZWNrZWQgfD0gKCFjdXJyLmdldENoZWNrZWQoKSB8fCBjdXJyLmdldEdyYXllZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2tlZChjb250YWluc0NoZWNrZWQpOwotICAgICAgICAgICAgaXRlbS5zZXRHcmF5ZWQoY29udGFpbnNDaGVja2VkICYmIGNvbnRhaW5zVW5jaGVja2VkKTsKLSAgICAgICAgICAgIGlmIChleHBhbmRXaGVuQ2hlY2tpbmcgJiYgaXRlbS5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgIAlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlUGFyZW50SXRlbXMoaXRlbS5nZXRQYXJlbnRJdGVtKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXcmFwcGVycyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgCWJvb2xlYW4gc3RhdGUgPSBnZXRDaGVja2VkKG9iamVjdCk7Ci0gICAgCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLSAgICAJaWYob2JqZWN0ICE9IGVsZW1lbnQpIHsKLSAgICAJCXNldENoZWNrZWQoZWxlbWVudCwgc3RhdGUpOwotICAgIAl9Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGdldENvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKCkpCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uPD8+IHdyYXBwZXJzID0gVG5nVXRpbC5nZXRXcmFwcGVycyhhZGFwdGVyRmFjdG9yeSwKLQkJCQkJZWxlbWVudCk7Ci0JCQlpZiAoIXdyYXBwZXJzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoT2JqZWN0IHdyYXBwZXIgOiB3cmFwcGVycykgewotCQkJCQlzZXRDaGVja2VkKHdyYXBwZXIsIHN0YXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0gICAgCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlciNzZXRDaGVja2VkRWxlbWVudHMoamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotICAgIAkvLyBmaXggZWxlbWVudHMgbGlzdCB0byB1c2UgRVBGJ3Mgd3JhcHBlcnMKLSAgICAJTGlzdDxPYmplY3Q+IHRyZWVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgIAlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0gICAgCWlmIChnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSB7Ci0gICAgCQlhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJdHJlZUVsZW1lbnRzLmFkZEFsbChUbmdVdGlsLmdldFdyYXBwZXJzKGFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50KSk7Ci0JCQl9Ci0JCQlpZighKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl0cmVlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0gICAgCWluaXRpYWxpemluZ1RyZWVDaGVja1N0YXRlID0gdHJ1ZTsKLSAgICAgICAgc3VwZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKHRyZWVFbGVtZW50cy50b0FycmF5KCkpOwotICAgIAlpbml0aWFsaXppbmdUcmVlQ2hlY2tTdGF0ZSA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0b3AtbW9zdCBjaGVja2VkIGVsZW1lbnRzIGluIHRoaXMgdmlld2VyJ3MgdHJlZSwgCi0gICAgICogaW5jbHVkaW5nIGN1cnJlbnRseSBoaWRkZW4gb25lcyB0aGF0IGFyZSBtYXJrZWQgYXMKLSAgICAgKiBjaGVja2VkIGJ1dCBhcmUgdW5kZXIgYSBjb2xsYXBzZWQgYW5jZXN0b3IuCi0gICAgICoKLSAgICAgKiBPbmx5IHJldHVybnMgd2hpdGUtY2hlY2tlZCBpdGVtcywgbm90IGdyYXllZCBpdGVtcwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgY2hlY2tlZCBlbGVtZW50cwotICAgICAqCi0gICAgICogQHNlZSAjc2V0Q2hlY2tlZEVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldFRvcENoZWNrZWRFbGVtZW50cygpIHsKLSAgICAgICAgQXJyYXlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIENvbnRyb2wgdHJlZSA9IGdldENvbnRyb2woKTsKLSAgICAgICAgaW50ZXJuYWxDb2xsZWN0VG9wQ2hlY2tlZCh2LCB0cmVlKTsKLSAgICAgICAgcmV0dXJuIHYudG9BcnJheSgpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBHYXRoZXJzIHRoZSB0b3AtbW9zdCBjaGVja2VkIHN0YXRlcyBvZiB0aGUgZ2l2ZW4gd2lkZ2V0IGFuZCBpdHMKLSAgICAgKiBkZXNjZW5kZW50cywgZm9sbG93aW5nIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXN1bHQgYSB3cml0YWJsZSBsaXN0IG9mIGVsZW1lbnRzIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pCi0gICAgICogQHBhcmFtIHdpZGdldCB0aGUgd2lkZ2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsQ29sbGVjdFRvcENoZWNrZWQoTGlzdCByZXN1bHQsIFdpZGdldCB3aWRnZXQpIHsKLSAgICAgICAgSXRlbVtdIGl0ZW1zID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtICYmICgoVHJlZUl0ZW0pIGl0ZW0pLmdldENoZWNrZWQoKSAmJiAhKChUcmVlSXRlbSkgaXRlbSkuZ2V0R3JheWVkKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0LmFkZChkYXRhKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtICYmICghKChUcmVlSXRlbSkgaXRlbSkuZ2V0Q2hlY2tlZCgpIHx8ICgoVHJlZUl0ZW0pIGl0ZW0pLmdldEdyYXllZCgpKSkgewotICAgICAgICAgICAgCWludGVybmFsQ29sbGVjdFRvcENoZWNrZWQocmVzdWx0LCBpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNFeHBhbmRXaGVuQ2hlY2tpbmcoKSB7Ci0JCXJldHVybiBleHBhbmRXaGVuQ2hlY2tpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kV2hlbkNoZWNraW5nKGJvb2xlYW4gZXhwYW5kV2hlbkNoZWNraW5nKSB7Ci0JCXRoaXMuZXhwYW5kV2hlbkNoZWNraW5nID0gZXhwYW5kV2hlbkNoZWNraW5nOwotCX0KLQkKLQkvKioKLQkgKiBub3RpZmllZCB3aGVuIGNoaWxkcmVuIGNoZWNrc3RhdGUgaXMgY2hhbmdlZCAoYnkgY2hlY2tpbmcgYSBwYXJlbnQpCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGlsZHJlbkNoZWNrU3RhdGVMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGlsZHJlbkNoZWNrU3RhdGVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXJzKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChmaW5hbCBPYmplY3QgbGlzdGVuZXIgOiBjaGlsZHJlbkNoZWNrU3RhdGVMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLSAgICAgICAgICAgIFNhZmVSdW5uZXIucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIAkoKElDaGVja1N0YXRlTGlzdGVuZXIpbGlzdGVuZXIpLmNoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTFjMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgdGhhdCBkb2VzIG5vdCBjaGVjayBhIHBhcmVudCB3aGVuIGFsbCBjaGlsZHJlbiBhcmUgY2hlY2tlZC4KLSAqIFBhcmVudCB3aWxsIHJlbWFpbiBncmF5ZWQgdW50aWwgY2hlY2tlZCBieSB0aGUgdXNlci4KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyMiBleHRlbmRzIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgaW5pdFZpZXdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSxpbnQpCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyMihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGluaXRWaWV3ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyLgotICAgICAqIEBzZWUgQ2hlY2tib3hUcmVlVmlld2VyI0NoZWNrYm94VHJlZVZpZXdlcihUcmVlKQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIoVHJlZSB0cmVlKSB7Ci0gICAgICAgIHN1cGVyKHRyZWUpOwotICAgICAgICBpbml0Vmlld2VyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGNoZWNrIC8gZ3JheSBzdGF0ZSBvZiBhbGwgcGFyZW50IGl0ZW1zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFyZW50SXRlbXMoVHJlZUl0ZW0gaXRlbSkgewotICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihpdGVtKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNDaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zVW5jaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVHJlZUl0ZW0gY3VyciA9IChUcmVlSXRlbSkgY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgY29udGFpbnNDaGVja2VkIHw9IGN1cnIuZ2V0Q2hlY2tlZCgpOwotICAgICAgICAgICAgICAgIGNvbnRhaW5zVW5jaGVja2VkIHw9ICghY3Vyci5nZXRDaGVja2VkKCkgfHwgY3Vyci5nZXRHcmF5ZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdGVtLnNldENoZWNrZWQoY29udGFpbnNDaGVja2VkKTsKLS8vICAgICAgICAgICAgaXRlbS5zZXRHcmF5ZWQoY29udGFpbnNDaGVja2VkICYmIGNvbnRhaW5zVW5jaGVja2VkKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0R3JheWVkKGNvbnRhaW5zQ2hlY2tlZCk7Ci0gICAgICAgICAgICBpZiAoZXhwYW5kV2hlbkNoZWNraW5nICYmIGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZVBhcmVudEl0ZW1zKGl0ZW0uZ2V0UGFyZW50SXRlbSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3OGQ4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciBpbXBsZW1lbnRzCi0JCUlBY3Rpb25UeXBlUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlfdGV4dDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORF9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfdGV4dDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRVBfQ09QWV9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWVwQ29weV90ZXh0OyAKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uVGV4dChpbnQgYWN0aW9uVHlwZSkgewotCQlzd2l0Y2ggKGFjdGlvblR5cGUpIHsKLQkJY2FzZSBDT1BZOgotCQkJcmV0dXJuIENPUFlfVFhUOwotCQljYXNlIEVYVEVORDoKLQkJCXJldHVybiBFWFRFTkRfVFhUOwotCQljYXNlIERFRVBfQ09QWToKLQkJCXJldHVybiBERUVQX0NPUFlfVFhUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgaW50IGFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0KLQlwcml2YXRlIE1lbnUgYWN0aW9uVHlwZVBvcHVwOwotCi0JcHJpdmF0ZSBQb2ludCBhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotCQlmaW5hbCBUcmVlIHRyZWUgPSBnZXRUcmVlKCk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRJdGVtUHJvdmlkZXJFeHBhbmRlZChldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkJCXNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKGV2ZW50LmdldEVsZW1lbnQoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gdHJlZS5nZXRBY2Nlc3NpYmxlKCk7Ci0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlzdXBlci5nZXROYW1lKGUpOwotCQkJCWlmIChlLmNoaWxkSUQgPj0gMCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoID09IDEpIHsKLQkJCQkJCVN0cmluZyBzdHJpbmdUb1JlYWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgaXRlbXNbMF07Ci0JCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQkJVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQkJCQkJCQlzdHJpbmdUb1JlYWQgKz0gY29sdW1uLmdldFRleHQoKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyBpdGVtLmdldFRleHQoaSk7Ci0JCQkJCQkJfQotCQkJCQkJCWUucmVzdWx0ID0gc3RyaW5nVG9SZWFkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgY29sdW5tcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGFycmF5IG9mIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIGNvbHVtbkRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBDb2x1bW5zKENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycykgewotCQkvLyBSZW1vdmUgYWxsIG9sZCBUcmVlQ29sdW1ucy4KLQkJVHJlZUNvbHVtbltdIGNvbHMgPSBnZXRUcmVlKCkuZ2V0Q29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGNvbHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29sc1tpXS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlTdHJpbmdbXSBjb2xQcm9wcyA9IG5ldyBTdHJpbmdbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29sUHJvcHNbaV0gPSBjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZDsKLQkJCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4oZ2V0VHJlZSgpLAotCQkJCQljb2x1bW5EZXNjcmlwdG9yc1tpXS5hbGlnbm1lbnQpOwotCQkJY29sdW1uLnNldFRleHQoY29sdW1uRGVzY3JpcHRvcnNbaV0ubGFiZWwpOwotCQkJY29sdW1uLnNldFJlc2l6YWJsZShjb2x1bW5EZXNjcmlwdG9yc1tpXS5yZXNpemFibGUpOwotCQkJY29sdW1uLnNldFdpZHRoKGNvbHVtbkRlc2NyaXB0b3JzW2ldLndpZHRoKTsKLQkJfQotCi0JCXNldENvbHVtblByb3BlcnRpZXMoY29sUHJvcHMpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGV4cGFuZCkgewotCQlPYmplY3QgYWRhcHRlciA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZWxlbWVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldEV4cGFuZGVkKEJvb2xlYW4udmFsdWVPZihleHBhbmQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudFByb3ZpZGVyKCkgPT0gbnVsbCA/IG51bGwKLQkJCQk6ICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpKQotCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlciNzZXRFeHBhbmRlZChJdGVtLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cGFuZGVkKEl0ZW0gbm9kZSwgYm9vbGVhbiBleHBhbmQpIHsKLQkJc3VwZXIuc2V0RXhwYW5kZWQobm9kZSwgZXhwYW5kKTsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG5vZGUuZ2V0RGF0YSgpLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcik7Ci0JCQlpZiAoYnNJdGVtUHJvdmlkZXIuaXNFeHBhbmRlZCgpID09IG51bGwpIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5zZXRFeHBhbmRlZCgoQm9vbGVhbi52YWx1ZU9mKGV4cGFuZCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZChJdGVtIGl0ZW0sIE9iamVjdCBlbGVtZW50KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChlbGVtZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmKGFkYXB0ZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQm9vbGVhbiBleHBhbmQgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuaXNFeHBhbmRlZCgpOwotCQkJCWlmIChleHBhbmQgIT0gbnVsbCkgewotCQkJCQlzZXRFeHBhbmRlZFN0YXRlKGl0ZW0sIGV4cGFuZC5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlciNpbnRlcm5hbFJlZnJlc2goV2lkZ2V0LAotCSAqICAgICAgT2JqZWN0LCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsUmVmcmVzaChXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCwKLQkJCWJvb2xlYW4gZG9TdHJ1Y3QsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXN1cGVyLmludGVybmFsUmVmcmVzaCh3aWRnZXQsIGVsZW1lbnQsIGRvU3RydWN0LCB1cGRhdGVMYWJlbHMpOwotCi0JCWlmIChkb1N0cnVjdCkgewotCQkJcHJlc2VydmVFeHBhbmRlZFN0YXRlKHdpZGdldCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByZXNlcnZlRXhwYW5kZWRTdGF0ZShXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0JCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJc2V0RXhwYW5kZWQoaXRlbSwgaXRlbS5nZXREYXRhKCkpOwotCQl9IGVsc2UgewotCQkJSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJdGVtIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSXRlbSkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgY2hpbGQ7Ci0JCQkJCXNldEV4cGFuZGVkKGl0ZW0sIGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxJbml0aWFsaXplVHJlZShDb250cm9sIHdpZGdldCkgewotCQlzdXBlci5pbnRlcm5hbEluaXRpYWxpemVUcmVlKHdpZGdldCk7Ci0JCXByZXNlcnZlRXhwYW5kZWRTdGF0ZSh3aWRnZXQpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjZ2V0QWN0aW9uVHlwZSgpCi0JICovCi0vLwlwdWJsaWMgaW50IGdldEFjdGlvblR5cGUoKSB7Ci0vLwkJaWYgKGFjdGlvblR5cGVQb3B1cCA9PSBudWxsKSB7Ci0vLwkJCWNyZWF0ZUFjdGlvblR5cGVQb3B1cCgpOwotLy8JCX0KLS8vCi0vLwkJRGlzcGxheS5nZXRDdXJyZW50KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8KLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJYWN0aW9uVHlwZSA9IDA7Ci0vLwkJCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotLy8JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUodHJ1ZSk7Ci0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0vLwotLy8JCXJldHVybiBhY3Rpb25UeXBlOwotLy8JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjdGlvblR5cGVQb3B1cChpbnRbXSBjaG9pY2VzKSB7Ci0JCWFjdGlvblR5cGVQb3B1cCA9IG5ldyBNZW51KGdldENvbnRyb2woKSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZW51SXRlbSBpdGVtID0gKChNZW51SXRlbSkgZS5nZXRTb3VyY2UoKSk7Ci0JCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCA9PSBDT1BZX1RYVCkgewotCQkJCQlQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0ID09IEVYVEVORF9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQ7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0ID09IERFRVBfQ09QWV9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gREVFUF9DT1BZOwotCQkJCX0KLQotCQkJCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWN0aXZpdHlEcm9wQ29tbWFuZCkgewotCQkJCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9ICgoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJCWNtZC5zZXRUeXBlKFByb2Nlc3NUcmVlVmlld2VyLnRoaXMuYWN0aW9uVHlwZSk7Ci0JCQkJCWNtZC5zZXRMYWJlbCh0ZXh0KTsKLQkJCQkJCi0JCQkJCWlmIChQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPT0gREVFUF9DT1BZICkgewotCQkJCQkJY21kLnNldEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IobmV3IEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCi0JCQkJaWYgKGFjdGlvbk1hbmFnZXIgIT0gbnVsbAotCQkJCQkJJiYgY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfQotCi0JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCi0JCX07Ci0JCQotCQlmb3IgKGludCBhY3Rpb25UeXBlIDogY2hvaWNlcykgewotCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0oYWN0aW9uVHlwZVBvcHVwLCBTV1QuQ0FTQ0FERSk7Ci0JCQltZW51SXRlbS5zZXRUZXh0KGdldEFjdGlvblRleHQoYWN0aW9uVHlwZSkpOwotCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjc2V0SW5wdXREYXRhKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dERhdGEoT2JqZWN0IG9iamVjdCkgewotCQlhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbiA9IChQb2ludCkgb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNtZCwgaW50W10gY2hvaWNlcykgewotCQljcmVhdGVBY3Rpb25UeXBlUG9wdXAoY2hvaWNlcyk7Ci0KLQkJdGhpcy5jb21tYW5kID0gY21kOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIGRlZmF1bHQgYmVoYXZpb3Igb2YgYWN0aXZhdGluZyB0ZXh0IGNlbGwgZWRpdG9yIGZyb20gc2luZ2xlIG1vdXNlIGNsaWNrIHRvIGRvdWJsZSBtb3VzZSBjbGljawotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhvb2tFZGl0aW5nU3VwcG9ydChDb250cm9sIGNvbnRyb2wpIHsKLQkJdHJ5IHsKLQkJCVRyZWVWaWV3ZXJFZGl0b3IuY3JlYXRlKHRoaXMsIG5ldyBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3kodGhpcykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdG9yQWN0aXZhdGlvbkV2ZW50KAotCQkJCQkJQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBldmVudC5ldmVudFR5cGUgPT0gQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50Lk1PVVNFX0RPVUJMRV9DTElDS19TRUxFQ1RJT04KLQkJCQkJfHwgZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5QUk9HUkFNTUFUSUMKLQkJCQkJfHwgZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5UUkFWRVJTQUw7Ci0JCQkJfQotCQkJfSxDb2x1bW5WaWV3ZXJFZGl0b3IuREVGQVVMVCk7Ci0JCX0KLQkJY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gd29yay1hcm91bmQgZm9yIGEgYnVnIGluIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckVkaXRvci5jcmVhdGUoVHJlZVZpZXdlciwgU1dURm9jdXNDZWxsTWFuYWdlciwgQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvblN0cmF0ZWd5LCBpbnQpCi0JCQkvLyB0aGF0IHRyaWVkIHRvIGNhbGwgU1dURm9jdXNDZWxsTWFuYWdlci5pbml0KCkgZXZlbiBTV1RGb2N1c0NlbGxNYW5hZ2VyIGlzIG51bGwJCQotCQl9Ci0JCXN1cGVyLmhvb2tFZGl0aW5nU3VwcG9ydChjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlciNzZXRBY3Rpb25NYW5hZ2VyKElBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbk1hbmFnZXIoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCWFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NZ3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Qcm9jZXNzVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczYmZiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NWaWV3ZXIgZXh0ZW5kcyBQcm9jZXNzVHJlZVZpZXdlciB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXM7Ci0KLQlwcml2YXRlIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW10gY2hlY2tCb3hDZWxsRWRpdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcGFyZW50IC0gdW5kZXJseWluZyB0cmVlCi0JICogCi0JICogQHJldHVybiBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENlbGxFZGl0b3JQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRUcmVlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGNoZWNrIGJveCBjZWxsIGVkaXRvcnMKLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tCb3hDZWxsRWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrQm94Q2VsbEVkaXRvcnMoCi0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltdIGNoZWNrQm94Q2VsbEVkaXRvcnMpIHsKLQkJdGhpcy5jaGVja0JveENlbGxFZGl0b3JzID0gY2hlY2tCb3hDZWxsRWRpdG9yczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja0JveENlbGxFZGl0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZWRpdG9yLnNldENvbHVtbkluZGV4KGkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyI2hvb2tDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXN1cGVyLmhvb2tDb250cm9sKGNvbnRyb2wpOwotCQlnZXRUcmVlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCW1vZGlmeUl0ZW0oZSk7Ci0JCQl9Ci0JCX0pOwotCQkvLyBnZXRUcmVlKCkuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCl7Ci0JCS8vIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpewotCQkvLyBzZXRVbnNldEVkaXRvcihlKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXZlbnQuaW5kZXggPSAiKyBldmVudC5pbmRleCk7Ci0JCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoZXZlbnQpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJVHJlZUNvbHVtbiBjb2wgPSBnZXRUcmVlKCkuZ2V0Q29sdW1uKGV2ZW50LmluZGV4KTsKLQkJCQkJaW50IHggPSBldmVudC54ICsgY29sLmdldFdpZHRoKCkgLyAyOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDIpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsIHggLSByZWN0LndpZHRoIC8gMiwgZXZlbnQueQotCQkJCQkJCSsgb2Zmc2V0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZ2V0VHJlZSgpLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVHJlZVZpZXdlciNkb1VwZGF0ZUl0ZW0ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbSwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVJdGVtKEl0ZW0gaXRlbSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZG9VcGRhdGVJdGVtKGl0ZW0sIGVsZW1lbnQpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwgJiYgY29sdW1uUHJvcGVydGllcyAhPSBudWxsCi0JCQkJJiYgY29sdW1uUHJvcGVydGllcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrQm94Q2VsbEVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJKChUcmVlSXRlbSkgaXRlbSkuc2V0VGV4dChpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBnZXRDaGVja0JveENlbGxFZGl0b3JJbWFnZShldmVudC5pbmRleCwgKFRyZWVJdGVtKSBldmVudC5pdGVtKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKGludCBjb2x1bW5JbmRleCwgVHJlZUl0ZW0gaXRlbSkgewotCQlpZiAoY2hlY2tCb3hDZWxsRWRpdG9ycyA9PSBudWxsCi0JCQkJfHwgY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0uZ2V0SW1hZ2UoaXRlbSwKLQkJCQljb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbkluZGV4XSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIjc2V0Q2VsbE1vZGlmaWVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBtb2RpZmllcikgewotCQlzdXBlci5zZXRDZWxsTW9kaWZpZXIobW9kaWZpZXIpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tCb3hDZWxsRWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIGVkaXRvciA9IGNoZWNrQm94Q2VsbEVkaXRvcnNbaV07Ci0JCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQllZGl0b3Iuc2V0Q2VsbE1vZGlmaWVyKG1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIG1vdXNlIGRvd24gbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kaWZ5SXRlbShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCVBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQlUcmVlSXRlbSBpdGVtID0gZ2V0VHJlZSgpLmdldEl0ZW0ocHQpOwotCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0VHJlZSgpLmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyhpKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoaSwgaXRlbSk7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlSZWN0YW5nbGUgaW1nUmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAocmVjdC5oZWlnaHQgLSBpbWdSZWN0LmhlaWdodCkgLyAyKTsKLQkJCQlpbnQgeCA9IHJlY3QueCArIHJlY3Qud2lkdGggLyAyIC0gaW1nUmVjdC53aWR0aCAvIDI7Ci0JCQkJaW50IHkgPSByZWN0LnkgKyBvZmZzZXQ7Ci0JCQkJaW1nUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgaW1nUmVjdC53aWR0aCwgaW1nUmVjdC5oZWlnaHQpOwotCQkJCWlmIChpbWdSZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCQljaGVja0JveENlbGxFZGl0b3JzW2ldLm1vZGlmeShpdGVtLCBjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyI3NldENvbHVtblByb3BlcnRpZXMoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtblByb3BlcnRpZXMoU3RyaW5nW10gY29sdW1uUHJvcGVydGllcykgewotCQlzdXBlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQl0aGlzLmNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDM4ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9TYXZlYWJsZUxpYnJhcnlWaWV3UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhbGwgdmlld3MgdGhhdCByZXF1aXJlcyB0aGUgc3VwcG9ydCBvZiBzYXZpbmcgYSBNZXRob2QKLSAqIExpYnJhcnkgdmlhIHRoZSBTYXZlIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYXZlYWJsZUxpYnJhcnlWaWV3UGFydCBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMKLQkJSVNhdmVhYmxlUGFydCB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5iZWdpblRhc2soCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nTGlicmFyeVRhc2tfbmFtZSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgCi0JCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeVRvRXJyb3JfbXNnLCBsaWJQYXRoKSwgCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgCi0JCQkJCQkJCWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1ZpZXdIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVjN2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgdmlld3MgYW5kIGVkaXRvcnMgaW4gdGhlIEF1dGhvcmluZwotICogcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWaWV3SGVscGVyIHsKLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IGlmIGl0IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgdXNlciBzYXZlZCBvciBkaXNjYXJkZWQgdGhlIGNoYW5nZSwKLQkgKiAJCSAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIGFjdGlvbiB0aGF0Ci0JICogICAgICAgICB0cmlnZ2VyZWQgdGhpcyBjYWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRTYXZlKCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpKSB7Ci0JCQlpbnQgcmV0ID0gTXNnQm94LnByb21wdChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RleHQsIAotCQkJCQlTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCXRyeSB7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RXJyb3JfbXNnLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7IAotCi0JCQkJCXJldHVybiBkaWFsb2cKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RleHQpOyAKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSBpZiBpdCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaG9pY2UgdGhlIHVzZXIgbWFkZSB3aGVuIHByb21wdGVkIHRvIHNhdmUgLSBvbmUgb2YgU1dULllFUywgU1dULk5PLCBTV1QuQ0FOQ0VMCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgcHJvbXB0U2F2ZUludCgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSkgewotCQkJaW50IHJldCA9IE1zZ0JveC5wcm9tcHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsIAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190ZXh0LCAKLQkJCQkJU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgU1dULllFUzoKLQkJCQl0cnkgewotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCWRpYWxvZwotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeUVycm9yX21zZywgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOyAKLQkJCQl9Ci0JCQkJcmV0dXJuIFNXVC5ZRVM7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCXJldHVybiBTV1QuTk87Ci0JCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJcmV0dXJuIFNXVC5DQU5DRUw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gU1dULkNBTkNFTDsKLQl9Ci0KLQkvKioKLQkgKiBjbG9zZXMgYWxsIGVkaXRvcnMgb24gdGhlIGFjdGl2ZSBwYWdlCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxFZGl0b3JzKCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIGNsb3NlcyB0aGUgTWVzc2FnZVZpZXcgKGVycm9yIHZpZXcpCi0vLwkgKgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VNZXNzYWdlVmlldygpIHsKLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotLy8JCQkJLmhpZGVWaWV3KE1lc3NhZ2VWaWV3LmdldFZpZXcoKSk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBoYW5kbGVzIGEgZGFuZ2xpbmcgb2JqZWN0Ci0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAJCQlPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBoYW5kbGVEYW5nbGluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJJiYgKChFT2JqZWN0KSBvYmplY3QpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2csICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCkpKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlPYmplY3QgdmFsdWUgPSBhZGFwdGVyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICgoRU9iamVjdCkgdmFsdWUpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlPYmplY3Qgb3duZXIgPSBUbmdVdGlsLnVud3JhcChhZGFwdGVyLmdldFBhcmVudCh2YWx1ZSkpOwotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJLy8gVGhpcyBpcyBhIFVJIGl0ZW0gcHJvdmlkZXIuCi0JCQkJCW93bmVyID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvd25lcikuZ2V0VGFyZ2V0KCk7Ci0JCQkJfQotCQkJCVN0cmluZyBvd25lck5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG93bmVyKS5nZXROYW1lKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQsICgoTWV0aG9kRWxlbWVudCkgdmFsdWUpCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCBvd25lck5hbWUpKSkgeyAKLQkJCQkJCS8vIFJlbW92ZSB0aGUgYXNzb2NpYXRpb24uCi0JCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCSgoQ29sbGVjdGlvbikgKChFT2JqZWN0KSBvd25lcikuZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJCS5yZW1vdmUodmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnLCAoKE1ldGhvZEVsZW1lbnQpIHZhbHVlKQotCQkJCQkJCQkJLmdldE5hbWUoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qIFRPRE86IElzIHRoaXMgc3RpbGwgbmVlZGVkPwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsQW5kU2F2ZUFsbCgpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkaW5nTGlicmFyeVRhc2submFtZSIpLCAzKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkubG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2submFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTW9kZWxTdG9yYWdlLmxvYWRBbGxQcm94aWVzKGxpYik7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2submFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgbGliCi0JCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJcmVzb3VyY2VTZXQuc2F2ZShMaWJyYXJ5UHJvY2Vzc29yLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCksIHRydWUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlEaWFsb2cudGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeUVycm9yLm1zZyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnNhdmVVcGdyYWRlZExpYnJhcnlFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWUpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBSdW4gdGhlIG9wZXJhdGlvbiBhbmQgZGlzcGxheSB0aGUgcHJvZ3Jlc3MuCi0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCkpCi0JCQkJCS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuaW50ZXJuYWxFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpOwotCQl9Ci0JfQotCSovCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGxvY2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEp1ZGdlIGlmIHRoZXJlIGlzIGEgZGVmaW5lZCBjdXN0b21pemVkIGxvY2tlcgotCSAqIEByZXR1cm4gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDdXN0b21pemVkTG9ja2VyKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQkJCQotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewkKLQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBudWxsOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uICl7Ci0JCQkJCWxvY2tlciA9IExvY2tlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2NrZXIoZWxlbWVudCk7CQotCQkJCX1lbHNlewotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpZWxlbWVudCk7Ci0JCQkJCWlmKHBsdWdpbiAhPSBudWxsICApewotCQkJCQkJbG9ja2VyID0gTG9ja2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvY2tlcihwbHVnaW4pOwkJCQkJCQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCQlpZihsb2NrZXIgIT0gbnVsbCApewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGxvY2tlZC4KLQkgKiBJZiB0aGVyZSBpcyBhIGN1c3RvbWl6ZWQgbG9ja2VyLCB1c2UgaXQsIG90aGVyd2lzZSBjaGVjayBpdCB3aXRoIHRoZSBsb2NrZWQgZmxhZyBvZiAKLQkgKiBNZXRob2QgcGx1Z2luCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWRXaXRoQ3VzdG9taXplZExvY2tlcihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewkJCQotCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3RlZEl0ZW07Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQkJCQotCQkJT2JqZWN0IHVud3JhcEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQotCQkJaWYgKHVud3JhcEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewkKLQkJCQkKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApewotCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBMb2NrZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9ja2VyKGVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmKGxvY2tlciAhPSBudWxsICl7Ci0JCQkJCQlpZiggbG9ja2VyLmlzTG9ja2VkKGVsZW1lbnQpKXsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpdW53cmFwRWxlbWVudCk7Ci0JCQkJaWYocGx1Z2luICE9IG51bGwgKXsKLQkJCQkJQWJzdHJhY3RMb2NrZXIgbG9ja2VyID0gTG9ja2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvY2tlcihwbHVnaW4pOwkJCQkJCi0JCQkJCWlmKGxvY2tlciAhPSBudWxsICl7Ci0JCQkJCQlpZiggbG9ja2VyLmlzTG9ja2VkKHNlbGVjdGVkSXRlbSkpewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZiggVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgdW53cmFwRWxlbWVudCkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyBsb2NrZWQgYnkgYSBjdXN0b21pemVkIGxvY2tlci4KLQkgKiBOb3RlOiBTb21lIGl0ZW0gY291bGQgYmUgbG9ja2VkIGJ5IGEgZXh0ZW50ZWQgbG9ja2VyLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlZExvY2tlZChPYmplY3QgZGVzdGluYXRpb24pIHsKLQkJdHJ5IHsKLQkJCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJT2JqZWN0IGVsZW1lbnQgPSBkZXN0aW5hdGlvbjsKLQkJCXdoaWxlIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJZWxlbWVudCA9ICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBlbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQl9Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBMb2NrZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmdldExvY2tlcihwbHVnaW4pOwotCQkJCQlpZiAobG9ja2VyICE9IG51bGwgJiYgbG9ja2VyLmlzTG9ja2VkKGRlc3RpbmF0aW9uKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpeGVzIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIEdVSURzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhDb250ZW50RGVzY3JpcHRpb25HVUlEcygpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBlbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50LmVQcm94eVVSSSgpID09IG51bGwpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50OwotCQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBjb250YWluZXIgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50Ci0JCQkJCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKGNvbnRhaW5lcgotCQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJCQlpZiAoIWd1aWQuZXF1YWxzKGNvbnRlbnQuZ2V0R3VpZCgpKSkgewotCQkJCQkJCQkJY29udGVudC5zZXRHdWlkKGd1aWQpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMKLQkJCQkJCQkJCQkJLmFkZChjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nVGFza19uYW1lLCByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkpOwotCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCS5ydW5XaXRoUHJvZ3Jlc3MoCi0JCQkJCQlydW5uYWJsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZpeGluZ0NvbnRlbnREZXNjcmlwdGlvbkdVSURzVGFza19uYW1lKTsgCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrUHJveHkoSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQsIEVSZWZlcmVuY2UgcmVmLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IGVPYmogPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQlFT2JqZWN0IHJlc29sdmVkID0gZWxlbWVudC5lUmVzb2x2ZVByb3h5KGVPYmopOwotCQkJCVN0cmluZyBlcnJNc2cgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlZCA9PSBlT2JqKSB7Ci0JCQkJCWVyck1zZyA9ICJVbnJlc29sdmVkIHByb3h5IjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAoIXJlZi5nZXRFVHlwZSgpLmlzSW5zdGFuY2UocmVzb2x2ZWQpKSB7Ci0JCQkJCWVyck1zZyA9ICJJbnZhbGlkIGRhdGEiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aDsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQkJCXBhdGggPSByZWYuZ2V0RVR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiKCIgKyBNaXNjLmdldFBhdGhSZWxhdGl2ZVRvTGlicmFyeSgoTmFtZWRFbGVtZW50KSBlbGVtZW50KSArICIpLiIgKyByZWYuZ2V0TmFtZSgpICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gZXJyTXNnCi0JCQkJCQkJKyAiIGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgcGF0aCArIHJlc29sdmVkOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTGlicmFyeSBoZWFsdGggY2hlY2sKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0xpYnJhcnlIZWFsdGgoKSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKAotCQkJCQkJIisrKysgTElCUkFSWSBIRUFMVEggQ0hFQ0sgUkVQT1JUIC0gU1RBUlQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cldyaXRlcik7Ci0JCQkJcHJpbnRXcml0ZXIucHJpbnRsbigpOwotCQkJCXByaW50V3JpdGVyCi0JCQkJCQkucHJpbnRsbigiVU5SRVNPTFZFRC9JTlZBTElEIFBST1hJRVMgSU4gWC1SRUZFUkVOQ0VTIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcmludFdyaXRlcgotCQkJCQkJLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQ7Ci0JCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGNvbnRhaW5lciA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoY29udGFpbmVyCi0JCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQkJCWlmICghZ3VpZC5lcXVhbHMoY29udGVudC5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRoIGludmFsaWQgR1VJRDogIiArIGNvbnRlbnQuZ2V0R3VpZCgpICsgIiBpbiAnIiArIGNvbnRlbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGUgY29udGVudC54bWkgb2YgdGhlIHByb2Nlc3MgaXMgaW4KLQkJCQkJCQkJLy8gdGhlIHJpZ2h0IHBsYWNlCi0JCQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSBVbWFVdGlsCi0JCQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoY29udGVudCk7Ci0JCQkJCQkJCWlmIChwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlTdHJpbmcgbW9kZWxQYXRoID0gcHJvY0NvbXAuZVJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShtb2RlbFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBjb250ZW50LmVSZXNvdXJjZSgpCi0JCQkJCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQotCQkJCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbCBwYXRoOiAiICsKLQkJCQkJCQkJCS8vIG1vZGVsUGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQgcGF0aDogIiArCi0JCQkJCQkJCQkvLyBjb250ZW50UGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQkJCQkJCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoY29udGVudFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlpZiAoIWRpci5lcXVhbHMoY29udGVudERpcikpIHsKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJCSJDb250ZW50IGZpbGUgb2YgIiArIGNvbnRhaW5lci5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiICciICsgY29udGFpbmVyLmdldE5hbWUoKSArICInIGluICciICsgbW9kZWxQYXRoICsgIiBpcyBtaXNwbGFjZWQ6ICIgKyBjb250ZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY2hlY2sgZm9yIHVucmVzb2x2ZWQgcHJveGllcyBpbiBjcm9zcyByZWZlcmVuY2VzCi0JCQkJCQlBcnJheUxpc3QgeFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxSZWZlcmVuY2VzKCkpOwotCQkJCQkJeFJlZmVyZW5jZXMucmVtb3ZlQWxsKGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxDb250YWlubWVudHMoKSk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KHJlZiwgZmFsc2UpOwotCQkJCQkJCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIHZhbHVlOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCVN0cmluZyBtc2cgPSBjaGVja1Byb3h5KGVsZW1lbnQsIHJlZiwKLQkJCQkJCQkJCQkJCWl0ZXIxLm5leHQoKSk7Ci0JCQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXByaW50V3JpdGVyLnByaW50bG4obXNnKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgbXNnID0gY2hlY2tQcm94eShlbGVtZW50LCByZWYsIHZhbHVlKTsKLQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcmludFdyaXRlci5wcmludGxuKG1zZyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIlVucmVzb2x2ZWQgcHJveHkgaW4gJyIgKyBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICsgIic6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCX0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQlzdHJXcml0ZXIudG9TdHJpbmcoKSk7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCQkiKysrKyBMSUJSQVJZIEhFQUxUSCBDSEVDSyBSRVBPUlQgLSBFTkQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9OwotCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2spKSB7IAotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U7IAotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCQltZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZXMgaW52YWxpZCByZWZlcmVuY2UgaW4gdGhlIG9wZW4gbGlicmFyeQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJQXJyYXlMaXN0IHhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsUmVmZXJlbmNlcygpKTsKLQkJCQkJCXhSZWZlcmVuY2VzLnJlbW92ZUFsbChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsQ29udGFpbm1lbnRzKCkpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHhSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChyZWYsIGZhbHNlKTsKLQkJCQkJCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRUxpc3QpIHsKLQkJCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSB2YWx1ZTsKLQkJCQkJCQkJCUFycmF5TGlzdCBpbnZhbGlkUHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0LmJhc2ljSXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlPYmplY3QgdiA9IGl0ZXIxLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoaXNJbnZhbGlkUmVmZXJlbmNlKGVsZW1lbnQsIHJlZiwgdikpIHsKLQkJCQkJCQkJCQkJaW52YWxpZFByb3hpZXMuYWRkKHYpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICghaW52YWxpZFByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJcmVtb3ZlSW52YWxpZFJlZmVyZW5jZXMoZWxlbWVudCwgbGlzdCwKLQkJCQkJCQkJCQkJCWludmFsaWRQcm94aWVzKTsKLQkJCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudAotCQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChpc0ludmFsaWRSZWZlcmVuY2UoZWxlbWVudCwgcmVmLCB2YWx1ZSkpIHsKLQkJCQkJCQkJCWVsZW1lbnQuZVNldChyZWYsIG51bGwpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsgCi0JCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ1Rhc2tfbmFtZSwgcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpKTsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBib29sZWFuIGlzSW52YWxpZFJlZmVyZW5jZShJbnRlcm5hbEVPYmplY3QgZWxlbWVudCwKLQkJCQkJRVJlZmVyZW5jZSByZWYsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgZU9iaiA9IChJbnRlcm5hbEVPYmplY3QpIHZhbHVlOwotCQkJCQlpZiAoZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlFT2JqZWN0IHJlc29sdmVkID0gZWxlbWVudC5lUmVzb2x2ZVByb3h5KGVPYmopOwotCQkJCQkJaWYgKCFyZWYuZ2V0RVR5cGUoKS5pc0luc3RhbmNlKHJlc29sdmVkKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKEludGVybmFsRU9iamVjdCBlbGVtZW50LAotCQkJCQlJbnRlcm5hbEVMaXN0IHZhbHVlcywgQ29sbGVjdGlvbiBpbnZhbGlkUHJveGllcykgewotCQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCh2YWx1ZXMuYmFzaWNMaXN0KCkpOwotCQkJCWxpc3QucmVtb3ZlQWxsKGludmFsaWRQcm94aWVzKTsKLQkJCQl2YWx1ZXMuY2xlYXIoKTsKLQkJCQlpbnQgbWF4ID0gbGlzdC5zaXplKCkgLSAxOwotCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGVsZW1lbnQuZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBsaXN0Ci0JCQkJCQkJLmdldChpKSkpOwotCQkJCX0KLQkJCQl2YWx1ZXMuYWRkQWxsKGxpc3QpOwotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWUpOyAKLQotCX0KLQotCS8qKgotCSAqIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeS4gIFVzZWQgb24gYSByb2xsYmFjayBlcnJvcgotCSAqIEBwYXJhbSBzaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKFNoZWxsIHNoZWxsKSB7Ci0JCXJlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBBdXRob3JpbmdVSVJlc291cmNlcy5WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcik7Ci0JfQotCi0JLyoqCi0JICogZGlzcGxheXMgdGhlIG1lc3NhZ2UgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeSAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGlicmFyeShmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gTXNnQm94LmdldERpc3BsYXkoKTsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb1JlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBtZXNzYWdlKTsgCi0JCQl9Ci0JCQkKLQkJfTsKLQkJaWYoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQkJCi0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlbG9hZEN1cnJlbnRMaWJyYXJ5KFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbG9hZERpYWxvZ190aXRsZTsgCi0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWxvYWREaWFsb2dfbWVzc2FnZTsgCi0JCX0KLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCW1lc3NhZ2UpOwotCi0JCS8vIFRoZSBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkLgotCQlTdHJpbmcgbGliRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShsaWJEaXIpOwotCX0KLQotCS8qKgotCSAqIG9wZW5zIHRoZSBnaXZlbiB2aWV3SWQKLQkgKiBAcGFyYW0gdmlld0lkCi0JICogQHJldHVybgotCSAqIAkJCVZpZXcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaWV3UGFydCBvcGVuVmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXJldHVybiBmaW5kVmlldyh2aWV3SWQsIHRydWUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBvcGVucyB0aGUgZ2l2ZW4gdmlld0lkCi0JICogQHBhcmFtIHZpZXdJZAotCSAqIEByZXR1cm4KLQkgKiAJCQlWaWV3Ci0JICovCi0JcHVibGljIHN0YXRpYyBJVmlld1BhcnQgZmluZFZpZXcoU3RyaW5nIHZpZXdJZCwgYm9vbGVhbiBzaG93KSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIGFsd2F5cyBjcmVhdGUgdGhlIHZpZXcKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsJCQkJCQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoICFzaG93ICkgewotCQkJCQlhY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmlldzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW50ZXJuYWxFcnJvcl9tc2csIAotCQkJCQllKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaWV3SW5DdXJyZW50UGVyc3BlY3RpdmUoU3RyaW5nIHZpZXdJZCkgewkJCi0JCVN0cmluZyBwZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJcmV0dXJuIGlzVmlld0luUGVyc3BlY3RpdmUodmlld0lkLCBwZXJzcGVjdGl2ZUlkKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjaWVkZSB3aGV0aGVyIHRoZSB2aWV3IGRlZmluZGVkIGluIHRoZSBwZXJzcGVjdGl2ZSBvciBub3QKLQkgKiAKLQkgKiBAYXV0aG9yIGRhdmlkIHpob25nd2VpCi0JICogQHBhcmFtIHZpZXdJZAotCSAqIEBwYXJhbSBwZXJwZWN0aXZlSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlld0luUGVyc3BlY3RpdmUoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIHBlcnNwZWN0aXZlSWQpIHsKLQkJaWYgKHZpZXdJZCA9PSBudWxsIHx8IHBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS51aSI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgRVhURU5TSU9OUE9JTlRfSUQgPSAicGVyc3BlY3RpdmVFeHRlbnNpb25zIjsvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBUQVJHRVRfSUQgPSAidGFyZ2V0SUQiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFZJRVcgPSAidmlldyI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFZJRVdTSE9SVENVVCA9ICJ2aWV3U2hvcnRjdXQiOy8vJE5PTi1OTFMtMSQKLQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBudWxsOwotCQlpZiAoZXh0ZW5zaW9uUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChOQU1FU1BBQ0UsIEVYVEVOU0lPTlBPSU5UX0lEKTsKLQkJfQotCi0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShUQVJHRVRfSUQpOwotCQkJCQkJaWYgKHBlcnNwZWN0aXZlSWQuZXF1YWxzKGlkKSkgewotCi0JCQkJCQkJLy8gZGVjaWRlIHdoZXRoZXIgaXMgZGVmaW5lZCBpbiAidmlldyIKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c0ZvclZpZXcgPSBjb25maWdFbGVtZW50LmdldENoaWxkcmVuKFZJRVcpOwotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY29uZmlnRWxlbWVudHNGb3JWaWV3Lmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzRm9yVmlld1trXTsKLQkJCQkJCQkJaWYgKHZpZXdJZC5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKSkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJLy8gZGVjaWRlIHdoZXRoZXIgaXMgZGVmaW5lZCBpbiAidmlld1Nob3J0Y3V0IgotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzRm9yVmlld1Nob3J0Y3V0ID0gY29uZmlnRWxlbWVudAotCQkJCQkJCSAgICAgICAgLmdldENoaWxkcmVuKFZJRVdTSE9SVENVVCk7Ci0JCQkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBjb25maWdFbGVtZW50c0ZvclZpZXdTaG9ydGN1dC5sZW5ndGg7IGwrKykgewotCQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWdFbGVtZW50c0ZvclZpZXdTaG9ydGN1dFtsXTsKLQkJCQkJCQkJaWYgKHZpZXdJZC5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKSkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFZpZXcoQWJzdHJhY3RCYXNlVmlldyBjb25maWdWaWV3KSB7Ci0JCUNvbnRyb2wgY3RybCA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCAhPSBudWxsICYmICFjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJT2JqZWN0IGlucHV0ID0gIGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaW5wdXQ7Ci0JCQkJaWYgKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQljb25maWdWaWV3LnNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5yZXNvbHZlKGVPYmplY3QpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQlyZXN0b3JlU2VsZWN0aW9uKGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzdG9yZVNlbGVjdGlvbihWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWJvb2xlYW4gcmVzdG9yZSA9IGZhbHNlOwotCQkJQXJyYXlMaXN0IHJlc29sdmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWVPYmogPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlT2JqKTsKLQkJCQkJCXJlc3RvcmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlyZXNvbHZlZExpc3QuYWRkKGVPYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlc3RvcmUpIHsKLQkJCQl2aWV3ZXIKLQkJCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb2x2ZWRMaXN0KSwKLQkJCQkJCQkJdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzM5YmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdmlld3MgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL0NvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhOGRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgQ29uZmlndXJhdGlvbiB0YWJsZSBpbiB0aGUgT3BlbiBDb25maWd1cmF0aW9uCi0gKiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50OwotCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2JkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgYSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBmb3IgYSBuZXcKLSAqIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUsIDIpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGNvbXBvc2l0ZSwgNDAwLCA4MCwgMik7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJU3RyaW5nIG5hbWUgPSAibmV3X2NvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQkJaWYobGliICE9IG51bGwpIHsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldE5leHRBdmFpbGFibGVOYW1lKGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgbmFtZSk7Ci0JCX0KLQkJbmFtZVRleHQuc2V0VGV4dChuYW1lKTsgCi0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChuYW1lVGV4dCAhPSBudWxsKSB7Ci0JCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBjb25maWdOYW1lID0gZ2V0Q29uZmlndXJhdGlvbk5hbWUoKTsKLQotCQlpZiAoIXZhbGlkYXRlQ29uZmlndXJhdGlvbk5hbWUoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChjb25maWd1cmF0aW9uRXhpc3RzKGNvbmZpZ05hbWUpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzCi0JICogaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZQotCSAqICAgICAgICAgYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmF0aW9uRXhpc3RzKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCVN0cmluZ1tdIGNvbmZpZ05hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb25maWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoY29uZmlnTmFtZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbmZpZ3VyYXRpb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIFRPRE86IENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSB2YWxpZGF0b3Igd2hlbiBpdCBpcyByZWFkeS4KLQkJU3RyaW5nIGVycm1zZyA9IFRuZ1V0aWwuY2hlY2tFbGVtZW50TmFtZShuYW1lLAotCQkJCUxpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQkJaWYgKGVycm1zZyAhPSBudWxsKSB7Ci0JCQllcnJtc2cgPSBlcnJtc2cucmVwbGFjZUFsbCgiXG5cbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShlcnJtc2cpOwotCQlyZXR1cm4gZXJybXNnID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBjb25maWd1cmF0aW9uIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzlmYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdDb25maWd1cmF0aW9uV2l6YXJkLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdDb25maWd1cmF0aW9uV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQkvLyBUaGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKG1haW5QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQobWFpblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlIGNyZWF0ZU1haW5QYWdlKCkgewotCQlyZXR1cm4gbmV3IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24gaXMgY3JlYXRlZCBpbiB0aGUgTGlicmFyeSB2aWV3IHZpYSB0aGUgY29udGV4dCBtZW51LiBVcG9uCi0JICogY29tcGxldGluZyB0aGlzIHdpemFyZCwgdGhlIG5ld2x5IGNyZWF0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2lsbCBiZQotCSAqIGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWUgYW5kIGJyaWVmIGRlc2NyaXB0aW9uIGVudGVyZWQgYnkgdGhlIHVzZXIgaW4KLQkgKiB0aXMgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmV0ID0gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihtYWluUGFnZS5nZXRDb25maWd1cmF0aW9uTmFtZSgpLAotCQkJCW1haW5QYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKSwgbWFpblBhZ2UpOwotCQlpZihyZXQpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUobGlicmFyeS5lUmVzb3VyY2UoKSk7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gYnJpZWZEZXNjCi0JICogICAgICAgICAgICB0aGUgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB3aXphcmRQYWdlCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvciBtZXNzYWdlcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIGNyZWF0ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBicmllZkRlc2MsCi0JCQlXaXphcmRQYWdlIHdpemFyZFBhZ2UpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGMgPSBjb25maWcgPT0gbnVsbCA/IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSA6IGNvbmZpZzsKLQkJCWMuc2V0TmFtZShuYW1lKTsKLQkJCQotCQkJaWYgKCEgbmFtZUNoZWNrKG5hbWUsIHdpemFyZFBhZ2UsIGxpYnJhcnksIGMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQljb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihuYW1lLCBsaWJyYXJ5KTsKLQkJCX0KLQotCQkJaWYgKGJyaWVmRGVzYyAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldEJyaWVmRGVzY3JpcHRpb24oYnJpZWZEZXNjKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCBlKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBuYW1lQ2hlY2soU3RyaW5nIG5hbWUsIFdpemFyZFBhZ2Ugd2l6YXJkUGFnZSwgCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnksIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCS8vIEZpeCBmb3IgYnVnemlsbGEgMTc4NDYyLgotCQlTdHJpbmcgZXJybXNnID0gbnVsbDsKLQkJaWYgKG5hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJZXJybXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKGxpYnJhcnksIG1ldGhvZENvbmZpZyk7Ci0JCQllcnJtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJfQotCi0JCWlmIChlcnJtc2cgIT0gbnVsbCkgewotCQkJd2l6YXJkUGFnZS5zZXRFcnJvck1lc3NhZ2UoZXJybXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdseSBjcmVhdGVkIG1ldGhvZCBjb25mZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN1cGVyUGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmVzdWx0SG9sZGVyWzBdID0gc3VwZXJQZXJmb3JtRmluaXNoKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmFjOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSBhbmQgYnJpZWYgZGVzY3JpcHRpb24KLSAqIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5TWFpblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBOZXdMaWJyYXJ5TWFpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgQ29tYm8gbGlicmFyeVBhdGhDb21ibzsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5TWFpblBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5saWJyYXJ5UGF0aExhYmVsX3RleHQpOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8gPSBjcmVhdGVDb21ib2JveChjb21wb3NpdGUpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0KLQkJY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCA0MDAsIDgwLCAxKTsKLQotCQlNYXAgdHlwZXMgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5VHlwZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWxpYnJhcnlUeXBlID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBkZWZhdWx0TGlicmFyeVBhdGggPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKTsKLQkJRmlsZSBkZWZhdWx0TGlicmFyeURpciA9IG5ldyBGaWxlKGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JCVN0cmluZyBuZXdMaWJyYXJ5UGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAxOzsgaSsrKSB7Ci0JCQlGaWxlIG5ld0xpYnJhcnlEaXIgPSBuZXcgRmlsZShkZWZhdWx0TGlicmFyeURpciwgIkxpYnJhcnkiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghbmV3TGlicmFyeURpci5leGlzdHMoKSkgewotCQkJCW5ld0xpYnJhcnlQYXRoID0gbmV3TGlicmFyeURpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUxpc3Q8U3RyaW5nPiBuZXdMaWJyYXJ5UGF0aHNMaXN0ID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0TmV3TGlicmFyeVBhdGhzTGlzdCgpOwotCQlpZiAobmV3TGlicmFyeVBhdGggIT0gbnVsbCAmJiBuZXdMaWJyYXJ5UGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCW5ld0xpYnJhcnlQYXRoc0xpc3QuYWRkKDAsIG5ld0xpYnJhcnlQYXRoKTsKLQkJfQotCQlpZiAobmV3TGlicmFyeVBhdGhzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBuZXdMaWJyYXJ5UGF0aHMgPSBuZXcgU3RyaW5nW25ld0xpYnJhcnlQYXRoc0xpc3Quc2l6ZSgpXTsKLQkJCW5ld0xpYnJhcnlQYXRoc0xpc3QudG9BcnJheShuZXdMaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRJdGVtcyhuZXdMaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG5ld0xpYnJhcnlQYXRoc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBuZXcgRmlsZShsaWJQYXRoKS5nZXROYW1lKCk7Ci0JCWlmICghbGliUGF0aC5lcXVhbHMobGliTmFtZSkpIHsKLQkJCXJldHVybiBsaWJOYW1lOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQYXRoQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBsaWJyYXJ5VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTBmYzY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gTmV3TGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE5ld0xpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIG51bGwpOwotCQltYWluUGFnZSA9IG5ldyBOZXdMaWJyYXJ5TWFpblBhZ2UoKTsKLQkJYWRkUGFnZShtYWluUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG1haW5QYWdlLmdldExpYnJhcnlOYW1lKCk7Ci0JCQlTdHJpbmcgZGVzYyA9IG1haW5QYWdlLmdldExpYnJhcnlEZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUobWFpblBhZ2UuZ2V0TGlicmFyeVBhdGgoKSk7Ci0JCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCQlpZiAoWE1JTGlicmFyeVV0aWwuY29udGFpbnNQbHVnaW5PckNvbmZpZ1NwZWNFeHBvcnRGaWxlKGxpYnJhcnlQYXRoCi0JCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfQotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHR5cGUsIG9wdGlvbnMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCWlmIChkZXNjLmxlbmd0aCgpID4gMCkgewotCQkJCQlsaWJyYXJ5LnNldEJyaWVmRGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE5ld0xpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbk1haW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhZmRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luTWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiwKLSAqIGF1dGhvcnMgYW5kIHJlZmVyZW5jZWQgbWF0aG9kIHBsdWctaW5zIGZvciBhIG5ldyBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5NYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld1BsdWdpbk1haW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCBuYW1lVGV4dExhYmVsOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgYXV0aG9yc1RleHQ7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgcmVmZXJlbmNlZFBsdWdpbnNMYWJlbDsKLQkKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciByZWZlcmVuY2VkUGx1Z2luc1ZpZXdlcjsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2luczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbk1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbk1haW5QYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMik7Ci0KLQkJY3JlYXRlTmFtZUZpZWxkKGNvbXBvc2l0ZSk7Ci0KLQkJY3JlYXRlQnJpZWZEZXNjRmllbGQoY29tcG9zaXRlKTsKLQotCQljcmVhdGVBdXRob3JzRmllbGQoY29tcG9zaXRlKTsKLQotCQljcmVhdGVSZWZlcmVuY2VkTW9kZWxzVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlZmVyZW5jZWRNb2RlbHNWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZWZlcmVuY2VkUGx1Z2luc0xhYmVsID0gY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX05BTUUpOwotCi0JCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcG9zaXRlLAotCQkJCVNXVC5CT1JERVIgfCBTV1QuRklMTCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgcmVmZXJlbmNlZFBsdWdpbnNHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQlyZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdXRob3JzRmllbGQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVCk7Ci0KLQkJYXV0aG9yc1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCA0MDAsIDQwLCAxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCcmllZkRlc2NGaWVsZChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGNvbXBvc2l0ZSwgNDAwLCA4MCwgMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmFtZUZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJbmFtZVRleHRMYWJlbCA9IGNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlpbml0TmFtZUZpZWxkKCk7Ci0JCQotCQlpbml0UmVmZXJlbmNlZE1vZGVsc1ZpZXdlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXROYW1lRmllbGQoKSB7Ci0JCVN0cmluZyBuYW1lID0gIm5ld19wbHVnLWluIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldE5leHRBdmFpbGFibGVOYW1lKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZ2V0TWV0aG9kUGx1Z2lucygpLCBuYW1lKTsKLQkJfQotCQluYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2VkTW9kZWxzVmlld2VyKCkgewotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQotCQlwbHVnaW5zID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW3BsdWdpbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoaSk7Ci0JCQlpdGVtc1tpXSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCX0KLQotCQlpZiAocGx1Z2lucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmFkZChpdC5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYWRkTmFtZUZpZWxkTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZUZpZWxkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChuYW1lVGV4dCAhPSBudWxsKSB7Ci0JCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHZhbGlkYXRlUGx1Z2luTmFtZShnZXRQbHVnaW5OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBwbHVnLWluIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIHBsdWctaW4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwbHVnLWluIG5hbWUgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGVycm1zZyA9IExpYnJhcnlVdGlsLmNoZWNrUGx1Z2luTmFtZShudWxsLCBuYW1lKTsKLQkJaWYgKGVycm1zZyAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgbmV3bGluZSBjaGFyYWN0ZXJzIGZyb20gdGhlIG1lc3NhZ2UgdG8gZml0IGl0IGluIHRoZSBlcnJvcgotCQkJLy8gbWVzc2FnZSBhcmVhIG9mIHRoZSB3aXphcmQgcGFnZS4KLQkJCWVycm1zZyA9IGVycm1zZy5yZXBsYWNlQWxsKCJcblxuIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJc2V0RXJyb3JNZXNzYWdlKGVycm1zZyk7Ci0JCXJldHVybiBlcnJtc2cgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgcGx1Zy1pbiBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbk5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkgIT0gbnVsbCA/IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBwbHVnLWluIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBwbHVnLWluCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWV0aG9kIHBsdWctaW4gYXV0aG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRob3JzIGZvciB0aGUgbmV3IG1ldGhvZCBwbHVnLWluCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yc1RleHQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHJlZmVyZW5jZWQgbWV0aG9kIHBsdWctaW5zIGZvciB0aGUgbmV3IG1ldGhvZAotCSAqIHBsdWctaW4uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlZCBtZXRob2QgcGx1Zy1pbnMgZm9yIHRoZSBuZXcgbWV0aG9kCi0JICogICAgICAgICBwbHVnLWluCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFJlZmVyZW5jZWRQbHVnaW5zKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlZFBsdWdpbnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzVjZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgbWV0aG9kIFBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3UGx1Z2luV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdQbHVnaW5XaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdQbHVnaW5XaXphcmQiOyAvLyROT04tTkxTLTEkCQotCi0JLy8gVGhlIG1haW4gd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIE5ld1BsdWdpbk1haW5QYWdlIG1haW5QYWdlOwotCi0JLy8gVGhlIG5ldyBtZXRob2QgcGx1Zy1pbi4KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luIG5ld1BsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpIHsKLQkJcmV0dXJuIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgPT0gbnVsbCkgewotCQkJbWFpblBhZ2UgPSBjcmVhdGVNYWluUGFnZSgpOwotCQkJc3VwZXIuYWRkUGFnZShtYWluUGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBBcnJheUxpc3Q8SVdpemFyZFBhZ2U+KCk7Ci0KLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoTmV3UGx1Z2luTWFpblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQobWFpblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgTmV3UGx1Z2luTWFpblBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTmV3UGx1Z2luTWFpblBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQluZXdQbHVnaW4gPSBMaWJyYXJ5U2VydmljZVV0aWwuY3JlYXRlTWV0aG9kUGx1Z2luKG1haW5QYWdlCi0JCQkJCS5nZXRQbHVnaW5OYW1lKCksIG1haW5QYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKSwgbWFpblBhZ2UKLQkJCQkJLmdldEF1dGhvcnMoKSwgbWFpblBhZ2UuZ2V0UmVmZXJlbmNlZFBsdWdpbnMoKSk7Ci0KLQkJCWluaXRNZXRob2RQbHVnaW4obmV3UGx1Z2luKTsKLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpCi0JCQkJCTogQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luRXJyb3JfcmVhc29uOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5FcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBtZXRob2QgcGx1Zy1pbiB0byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSwgdXBkYXRlcyB0aGUKLQkgKiBMaWJycmF5IHZpZXcgYW5kIG9wZW5zIHRoZSBtZXRob2QgcGx1Zy1pbiBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBuZXdseSBjcmVhdGVkIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGx1Zy1pbiBpcyBpbml0aWFsaXplZCBjb3JyZWN0bHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbml0TWV0aG9kUGx1Z2luKGZpbmFsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJdHJ5IHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRNZXRob2RQbHVnaW4ocGx1Z2luKTsKLQkJCX0KLQotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFNlbGVjdCB0aGUgbmV3IG1ldGhvZCBwbHVnLWluIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0JCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJCQkJc2VsZWN0aW9uLmFkZChwbHVnaW4pOwotCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKLQotCQkJCQkvLyBPcGVuIHRoZSBuZXcgbWV0aG9kIHBsdWctaW4gZWRpdG9yLgotCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihuZXdQbHVnaW4pOwotCQkJCX0KLQkJCX0pOwotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIG1ldGhvZCBwbHVnLWluICciIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHBsdWdpbi5nZXROYW1lKCkgKyAiJyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHN1cGVyUGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmVzdWx0SG9sZGVyWzBdID0gc3VwZXJQZXJmb3JtRmluaXNoKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TYXZlQWxsRWRpdG9yc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TYXZlQWxsRWRpdG9yc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyY2UzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU2F2ZUFsbEVkaXRvcnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUGFnZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGxpc3RzIHRoZSBjdXJyZW50bHkgb3BlbiBlZGl0b3JzIGFuZCBwcm9tcHRzIHRoZSB1c2VyIHRvCi0gKiBzYXZlIHRoZW0gYmVmb3JlIHBlcmZvcm1pbmcgYW4gaW1wb3J0IG9yIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlQWxsRWRpdG9yc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTkRfQ0xPU0VfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTkRfQ0xPU0VfUEFHRV9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUEFHRV9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBkb0Nsb3NlOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbDsKLQotCS8qKgotCSAqIEFkZHMgdGhpcyB3aXphcmQgcGFnZSB0byBhIHdpemFyZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotCSAqIFRoaXMgcGFnZSB3aWxsIGJlIGFkZGVkIGlmZiB0aGVyZSBhcmUgZGlydHkgbWV0aG9kIGVkaXRvcnMuCi0JICogaWYgZG9DbG9zZSBpcyB0cnVlIGFuZCB0aGVyZSBhcmUgbm8gZGlydHkgZWRpdG9ycywgdGhpcyBtZXRob2Qgd2lsbAotCSAqIGNsb3NlIGFsbCBtZXRob2QgZWRpdG9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gd2l6YXJkCi0JICogICAgICAgICAgICBUaGUgd2l6YXJkIHRvIHdoaWNoIHRoaXMgcGFnZSBtaWdodCBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgcGFnZSB3aWxsIGNsb3NlIGVkaXRvcnMgd2hlbgotCSAqICAgICAgICAgICAgbmV4dCBpcyBjbGlja2VkLiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHdpemFyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkUGFnZUlmTmVlZGVkKFdpemFyZCB3aXphcmQsIGJvb2xlYW4gZG9DbG9zZSkgewotCQlpZiAoaXNVbnNhdmVkRWRpdG9yKCkpIHsKLQkJCXdpemFyZC5hZGRQYWdlKG5ldyBTYXZlQWxsRWRpdG9yc1BhZ2UoZG9DbG9zZSkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoaXMgd2l6YXJkIHBhZ2UgdG8gYSB3aXphcmQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLQkgKiBUaGlzIHBhZ2Ugd2lsbCBiZSBhZGRlZCBpZmYgdGhlcmUgYXJlIGRpcnR5IG1ldGhvZCBlZGl0b3JzLgotCSAqIGlmIGRvQ2xvc2UgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG5vIGRpcnR5IGVkaXRvcnMsIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiBjbG9zZSBhbGwgbWV0aG9kIGVkaXRvcnMuCi0JICogCi0JICogQHBhcmFtIHdpemFyZAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZCB3aGljaCB0aGlzIHBhZ2UgbWlnaHQgYmUgYWRkZWQuCi0JICogQHBhcmFtIGRvQ2xvc2UKLQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGlzIHBhZ2Ugd2lsbCBjbG9zZSBlZGl0b3JzIHdoZW4KLQkgKiAgICAgICAgICAgIG5leHQgaXMgY2xpY2tlZC4gCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSB3aXphcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFBhZ2VJZk5lZWRlZChXaXphcmQgd2l6YXJkLCBib29sZWFuIGRvQ2xvc2UsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCWlmIChpc1Vuc2F2ZWRFZGl0b3IoKSkgewotCQkJU2F2ZUFsbEVkaXRvcnNQYWdlIHBhZ2UgPSBuZXcgU2F2ZUFsbEVkaXRvcnNQYWdlKGRvQ2xvc2UpOwotCQkJaWYgKHRpdGxlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldFRpdGxlKHRpdGxlKTsKLQkJCX0KLQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLQkJCX0KLQkJCXdpemFyZC5hZGRQYWdlKHBhZ2UpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGludGFuY2UuCi0JICovCi0JcHVibGljIFNhdmVBbGxFZGl0b3JzUGFnZShib29sZWFuIGNsb3NlKSB7Ci0JCXN1cGVyKFNBVkVfUEFHRV9USVRMRSk7Ci0JCXRoaXMuZG9DbG9zZSA9IGNsb3NlOwotCQlpZiAoZG9DbG9zZSkgewotCQkJc2V0VGl0bGUoU0FWRV9BTkRfQ0xPU0VfUEFHRV9USVRMRSk7Ci0JCQlzZXREZXNjcmlwdGlvbihTQVZFX0FORF9DTE9TRV9QQUdFX0RFU0MpOwotCQl9IGVsc2UgewotCQkJc2V0VGl0bGUoU0FWRV9QQUdFX1RJVExFKTsKLQkJCXNldERlc2NyaXB0aW9uKFNBVkVfUEFHRV9ERVNDKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29udGFpbmVyLAotCQkJCVNXVC5CT1JERVIgfCBTV1QuRklMTCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gKElFZGl0b3JSZWZlcmVuY2UpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJlZi5nZXRFZGl0b3IoZmFsc2UpLmdldFRpdGxlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gKElFZGl0b3JSZWZlcmVuY2UpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJlZi5nZXRFZGl0b3IoZmFsc2UpLmdldFRpdGxlSW1hZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk1ldGhvZEVkaXRvcnMoKS50b0FycmF5KCkpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclJlZmVyZW5jZSkgewotCQkJCQlpZiAoKChJRWRpdG9yUmVmZXJlbmNlKWVsZW1lbnQpLmlzRGlydHkoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkRFRkFVTFQsIFNXVC5CRUdJTk5JTkcsCi0JCQkJZmFsc2UsIHRydWUpKTsKLQotCQlzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwKLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLAotCQkJCXRydWUpKTsKLQotCQlkZXNlbGVjdEFsbCA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlkZXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsCi0JCQkJdHJ1ZSkpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoICgpIHsKLQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIgIT0gbnVsbCkgewotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpICE9IG51bGwpIHsKLQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkgIT0gbnVsbCkgewotCQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKQotCQkJCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJc2VsZWN0QWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJZGVzZWxlY3RBbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaWYgKGdldFdpemFyZCgpICE9IG51bGwpIHsKLQkJCUlXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgV2l6YXJkRGlhbG9nKSB7Ci0JCQkJKChXaXphcmREaWFsb2cpY29udGFpbmVyKS5hZGRQYWdlQ2hhbmdlZExpc3RlbmVyKG5ldyBJUGFnZUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcGFnZUNoYW5nZWQoUGFnZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIG91ciBzYXZlIChhbmQgcG9zc2libHkgY2xvc2UpIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcGVyZm9ybVNhdmVBbmRDbG9zZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNhdmVBbmRDbG9zZSgpIHsKLQkJT2JqZWN0W10gY2hlY2tlZEFycmF5ID0gY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5zYXZlRWRpdG9yKAotCQkJCQkJCSgoSUVkaXRvclJlZmVyZW5jZSkgY2hlY2tlZEFycmF5W2ldKQotCQkJCQkJCQkJLmdldEVkaXRvcihmYWxzZSksIGZhbHNlKTsKLQkJfQotCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwZXJmb3JtQ2xvc2UoYm9vbGVhbiBkb0Nsb3NlKSB7Ci0JCWlmIChkb0Nsb3NlKSB7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VBbGxNZXRob2RFZGl0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja2VkIHdoZXRoZXIgdGhlcmUgaXMgYW55IHVuc2F2ZWQgZWRpdG9yIG9wZW4KLQkgKiAKLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbiB1bnNhdmVkIGVkaXRvciBvcGVuCi0JICogCXRydWUgaWYgZG9DbG9zZSBpcyB0cnVlIGFuZCB0aGVyZSBpcyBhbiBvcGVuIGVkaXRvcgotCSAqICBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5zYXZlZEVkaXRvcigpIHsKLQkJYm9vbGVhbiBhbkVkaXRvcklzRGlydHkgPSBmYWxzZTsKLQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBtZXRob2RFZGl0b3JzID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5NZXRob2RFZGl0b3JzKCk7Ci0JCWZvciAoSXRlcmF0b3I8SUVkaXRvclJlZmVyZW5jZT4gaXRlcmF0b3IgPSBtZXRob2RFZGl0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgZWRpdG9yID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlhbkVkaXRvcklzRGlydHkgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIGFuRWRpdG9ySXNEaXJ0eTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09wZW5FZGl0b3IoYm9vbGVhbiBkb0Nsb3NlKSB7Ci0JCUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gbWV0aG9kRWRpdG9ycyA9IEVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuTWV0aG9kRWRpdG9ycygpOwotCQlyZXR1cm4gZG9DbG9zZSAmJiBtZXRob2RFZGl0b3JzLnNpemUoKSA+IDA7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uQ2hvaWNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkNob2ljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiNjM3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uQ2hvaWNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogSXQgc3RvcmVzIGFuZCBtYW5hZ2VzIGFsbCBjaG9pY2VzIGZvciBzeW5jaHJvbml6YXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uQ2hvaWNlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX05PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IFNZTkNfRlJPTV9DT05URU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX0ZST01fUFJPQ0VTUyA9IDI7Ci0JCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gc2VsZWN0ZWRDb25maWc7Ci0JcHJpdmF0ZSBpbnQgc3luY05hbWU9IFNZTkNfRlJPTV9DT05URU5UOwotCXByaXZhdGUgaW50IHN5bmNQcmVzTmFtZT0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0JyaWVmRGVzYz0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY09wdElucHV0PSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jTWFuSW5wdXQ9IFNZTkNfRlJPTV9DT05URU5UOwotCXByaXZhdGUgaW50IHN5bmNPdXRwdXQ9IFNZTkNfRlJPTV9DT05URU5UOwotCXByaXZhdGUgaW50IHN5bmNQcmltUGVyZm9ybWVyPSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jQWRkblBlcmZvcm1lcj0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY1Jlc3BSb2xlPSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jQ29udEFydGlmYWN0PSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jRGVsaXZQYXJ0PSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jU2VsU3RlcD0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0d1aWRhbmNlID0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaW5pc2hQcmVzc2VkOwotCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIHByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRTZWxlY3RlZFByb2Nlc3MoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlbGVjdGVkIHByb2Nlc3MKLQkgKiBAcGFyYW0gc2VsZWN0ZWRQcm9jZXNzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQcm9jZXNzKFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRQcm9jZXNzID0gc2VsZWN0ZWRQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldFNlbGVjdGVkQ29uZmlnKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlbGVjdGVkQ29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZykgewotCQl0aGlzLnNlbGVjdGVkQ29uZmlnID0gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGNvbnRhaW5lZCBhcnRpZmFjdHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNDb250QXJ0aWZhY3QoKSB7Ci0JCXJldHVybiBzeW5jQ29udEFydGlmYWN0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgY29udGFpbmVkIGFydGlmYWN0cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNDb250QXJ0aWZhY3QoaW50IHN5bmNDb250QXJ0aWZhY3QpIHsKLQkJdGhpcy5zeW5jQ29udEFydGlmYWN0ID0gc3luY0NvbnRBcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNEZWxpdlBhcnQoKSB7Ci0JCXJldHVybiBzeW5jRGVsaXZQYXJ0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jRGVsaXZQYXJ0KGludCBzeW5jRGVsaXZQYXJ0KSB7Ci0JCXRoaXMuc3luY0RlbGl2UGFydCA9IHN5bmNEZWxpdlBhcnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG1hbmRhdG9yeSBpbnB1dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY01hbklucHV0KCkgewotCQlyZXR1cm4gc3luY01hbklucHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgbWFuZGF0b3J5IGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY01hbklucHV0KGludCBzeW5jTWFuSW5wdXQpIHsKLQkJdGhpcy5zeW5jTWFuSW5wdXQgPSBzeW5jTWFuSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG9wdGlvbmFsIGlucHV0Ci0JICovCi0JcHVibGljIGludCBnZXRTeW5jT3B0SW5wdXQoKSB7Ci0JCXJldHVybiBzeW5jT3B0SW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBvcHRpb25hbCBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNPcHRJbnB1dChpbnQgc3luY09wdElucHV0KSB7Ci0JCXRoaXMuc3luY09wdElucHV0ID0gc3luY09wdElucHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNPdXRwdXQoKSB7Ci0JCXJldHVybiBzeW5jT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgb3V0cHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY091dHB1dChpbnQgc3luY091dHB1dCkgewotCQl0aGlzLnN5bmNPdXRwdXQgPSBzeW5jT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBwcmVzZW50YXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1ByZXNOYW1lKCkgewotCQlyZXR1cm4gc3luY1ByZXNOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcHJlc2V0bmF0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jUHJlc05hbWUoaW50IHN5bmNQcmVzTmFtZSkgewotCQl0aGlzLnN5bmNQcmVzTmFtZSA9IHN5bmNQcmVzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgcmVzcG9uc2libGUgcm9sZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1Jlc3BSb2xlKCkgewotCQlyZXR1cm4gc3luY1Jlc3BSb2xlOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcmVzcG9uc2libGUgcm9sZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNSZXNwUm9sZShpbnQgc3luY1Jlc3BSb2xlKSB7Ci0JCXRoaXMuc3luY1Jlc3BSb2xlID0gc3luY1Jlc3BSb2xlOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBzdGVwcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1NlbFN0ZXAoKSB7Ci0JCXJldHVybiBzeW5jU2VsU3RlcDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHN0ZXBzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1NlbFN0ZXAoaW50IHN5bmNTZWxTdGVwKSB7Ci0JCXRoaXMuc3luY1NlbFN0ZXAgPSBzeW5jU2VsU3RlcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gd2l6YXJkIGlzIGNvbXBsZXRlZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQoKSB7Ci0JCXJldHVybiBpc0ZpbmlzaFByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBiYXNlZCBvbiB3aXphcmQgaW4gY29tcGxldGVkIG9yIG5vdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaFByZXNzZWQoYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQpIHsKLQkJdGhpcy5pc0ZpbmlzaFByZXNzZWQgPSBpc0ZpbmlzaFByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGFkZGl0aW9uYWwgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQWRkblBlcmZvcm1lcigpIHsKLQkJcmV0dXJuIHN5bmNBZGRuUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgYWRkaXRpb25hbCBwZXJmb3JtZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jQWRkblBlcmZvcm1lcihpbnQgc3luY0FkZG5QZXJmb3JtZXIpIHsKLQkJdGhpcy5zeW5jQWRkblBlcmZvcm1lciA9IHN5bmNBZGRuUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBwcmltYXJ5IHBlcmZvcm1lcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1ByaW1QZXJmb3JtZXIoKSB7Ci0JCXJldHVybiBzeW5jUHJpbVBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHByaW1hcnkgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1ByaW1QZXJmb3JtZXIoaW50IHN5bmNQcmltUGVyZm9ybWVyKSB7Ci0JCXRoaXMuc3luY1ByaW1QZXJmb3JtZXIgPSBzeW5jUHJpbVBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhbGwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMvY2hvaWNlcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2J1Zi5hcHBlbmQoIltQcm9jZXNzOiIgKyAoKHNlbGVjdGVkUHJvY2VzcyAhPSBudWxsKT9zZWxlY3RlZFByb2Nlc3MuZ2V0TmFtZSgpOiJudWxsIikgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlzYnVmLmFwcGVuZCgiQ29uZmlndXJhdGlvbjoiICsgKChzZWxlY3RlZENvbmZpZyAhPSBudWxsKT9zZWxlY3RlZENvbmZpZy5nZXROYW1lKCk6Im51bGwiKSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXNidWYuYXBwZW5kKCJOYW1lOiIgKyBzeW5jTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiUHJlc05hbWU6IiArIHN5bmNQcmVzTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiQnJlaWZEZXNjOiIgKyBzeW5jQnJpZWZEZXNjICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJPcHRJbnB1dDoiICsgc3luY09wdElucHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJNYW5JbnB1dDoiICsgc3luY01hbklucHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJPdXRwdXQ6IiArIHN5bmNPdXRwdXQgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlByaW1QZXJmb3JtZXI6IiArIHN5bmNQcmltUGVyZm9ybWVyICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJBZGRuUGVyZm9ybWVyczoiICsgc3luY0FkZG5QZXJmb3JtZXIgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlJlc3BSb2xlOiIgKyBzeW5jUmVzcFJvbGUgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIkNvbnRBcnRpZmFjdDoiICsgc3luY0NvbnRBcnRpZmFjdCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiRGVsaXZQYXJ0OiIgKyBzeW5jRGVsaXZQYXJ0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJTZWxTdGVwOiIgKyBzeW5jU2VsU3RlcCArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQnJpZWZEZXNjKCkgewotCQlyZXR1cm4gc3luY0JyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY0JyaWVmRGVzYyhpbnQgc3luY0JyaWVmRGVzYykgewotCQl0aGlzLnN5bmNCcmllZkRlc2MgPSBzeW5jQnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBuYW1lCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jTmFtZSgpIHsKLQkJcmV0dXJuIHN5bmNOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNOYW1lKGludCBzeW5jTmFtZSkgewotCQl0aGlzLnN5bmNOYW1lID0gc3luY05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3luY0d1aWRhbmNlKGludCBpKSB7Ci0JCXRoaXMuc3luY0d1aWRhbmNlID0gaTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTeW5jR3VpZGFuY2UoKSB7Ci0JCXJldHVybiBzeW5jR3VpZGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjIwNWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIHdpemFyZCBwYWdlIHdoaWNoIGRlc2NyaWJlcyBjdXN0b20gc3luY2hyb25pemF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgVGV4dCBjdHJsX2V4cGxhaW5UZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJU3RyaW5nIGV4cGxhaW5UZXh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dDsgCi0JCWN0cmxfZXhwbGFpblRleHQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbXBvc2l0ZSwgIiAiLCA0MDAsIDI0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9leHBsYWluVGV4dC5zZXRUZXh0KGV4cGxhaW5UZXh0KTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWE0MGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIFJ1bnMgc3luY2hvbml6YXRpb24gb3BlcmF0aW9uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY2hDaG9pY2VzOwotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogCQkJTGlzdCBvZiBlbGVtZW50cyB0byBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcGFyYW0gY2hvaWNlcwotCSAqIAkJCVN5bmNocm9uaXphdGlvbiBvcHRpb25zCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbk9wZXJhdGlvbihDb2xsZWN0aW9uIGVsZW1lbnRzLCBTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJdGhpcy5zeW5jaENob2ljZXMgPSBjaG9pY2VzOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgd29rZSB1cCBhZnRlciAxIHNlY29uZCBzbGVlcCwgIyIgKyAoaSsxKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblByZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmExNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblByZXZpZXdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXRzIHlvdSBwcmV2aWV3IGVsZW1lbnRzIHRvIGJlIHN5bmNob25pemVkCi0gKiBhbmQgYWxzbyBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgVGV4dCBjdHJsX3ByZXZpZXdUZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJU3RyaW5nIGV4cGxhaW5UZXh0ID0gIlByZXZpZXcgdGV4dCBjb21pbmcgaGVyZS5cblxuIiArCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJIlx0VGhpcyBoYXMgdG8gYmUgY29taW5nIGZyb20gc29tZSB1bmRlcmx5aW4gQVBJIGNhbGwuIFRoaXMgbWF5IGJlIGN1dCBvZmYgaWYgdGhlcmUgaXMgbm90IGVub3VnIHRpbWUuIjsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ByZXZpZXdUZXh0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb21wb3NpdGUsICIgIiwgNDAwLCAyNDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJldmlld1RleHQuc2V0VGV4dChleHBsYWluVGV4dCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExMzhhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXQgdXNlciBzZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZHVyaW5nCi0gKiBzeW5jaHJvbml6YXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY29uZmlnQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uW10gdmFsaWRDb25maWd1cmF0aW9uczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl9Ci0JCQotCQkvLyBhZGQgYW4gZW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIgIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWwpOyAKLQkJCi0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQljb25maWdDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCi0JCS8vIGdldCBhbGwgdmFsaWQgY29uZmlndXJhdGlvbnMsIGFuZCBkZWZhdWx0IG9uZSwgYW5kIHNlbGVjdCBhbmQgc2hvdyB0aGUgZGVmYXVsdCBvbmUKLQkJUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3MgPSBzeW5jQ2hvaWNlcy5nZXRTZWxlY3RlZFByb2Nlc3MoKTsKLQkJdmFsaWRDb25maWd1cmF0aW9ucyA9IChNZXRob2RDb25maWd1cmF0aW9uW10pc2VsZWN0ZWRQcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLnRvQXJyYXkoKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuYWRkKHZhbGlkQ29uZmlndXJhdGlvbnMpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBzZWxlY3RlZFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJc3luY0Nob2ljZXMuc2V0U2VsZWN0ZWRDb25maWcoZGVmYXVsdENvbmZpZyk7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gZGVmYXVsdFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRDb25maWcpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oZGVmYXVsdFNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQotCQlhZGRMaXN0ZW5lcnMoY29tcG9zaXRlKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaW5pdCBjb25maWcgPSIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWcgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc3luY0Nob2ljZXMuc2V0U2VsZWN0ZWRDb25maWcoKE1ldGhvZENvbmZpZ3VyYXRpb24pY29uZmlnWzBdKTsKLQkJfSAKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29uZmlnID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDQ2ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXQgdXNlciBzZWxlY3QgcHJvcGVydGllcyBvZiBtZXRob2QgY29udGVudCB0byAKLSAqIGJlIGNvbnNpZGVyZWQgZm9yIHN5bmNob25pemF0aW9uLiAKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXByaXZhdGUgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBzeW5jQ2hvaWNlcyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYmNfbmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19wcmVzTmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19icmllZkRlc2M7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfb3B0SW5wdXQ7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfbWFuSW5wdXQ7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfb3V0cHV0OwotCXByaXZhdGUgQnV0dG9uIGJjX3ByaW1QZXJmb3JtZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfYWRkblBlcmZvcm1lcjsKLQlwcml2YXRlIEJ1dHRvbiBiY19yZXNwUm9sZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19jb250QXJ0aWZhY3Q7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfZGVsaXZQYXJ0OwotCXByaXZhdGUgQnV0dG9uIGJjX3NlbFN0ZXA7Ci0KLQlwcml2YXRlIEJ1dHRvbiBiY19ndWlkYW5jZTsKLQkKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfcHJlc05hbWUgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9vcHRJbnB1dCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX21hbklucHV0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfb3V0cHV0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfcmVzcFJvbGUgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9jb250QXJ0aWZhY3QgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9kZWxpdlBhcnQgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9zZWxTdGVwID0gbmV3IEJ1dHRvblsyXTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXsKLS8vCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlKTsgCi0vLwkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiQ29uZXRudCBUbyBQcm9jZXNzICAiKTsKLS8vCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIgIFByb2Nlc3MgVG8gQ29udGVudCIpOwotCQkKLQkJYmNfbmFtZSA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGUpOyAKLQkJCi0JCWJjX3ByZXNOYW1lID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZSk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9wcmVzTmFtZSk7Ci0JCQotCQliY19icmllZkRlc2MgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGUpOyAKLQkJCi0JCWJjX29wdElucHV0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfb3B0SW5wdXQpOwotCQkKLQkJYmNfbWFuSW5wdXQgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGUpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfbWFuSW5wdXQpOwotCQkKLQkJYmNfb3V0cHV0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9vdXRwdXQpOwotCQkKLQkJYmNfcHJpbVBlcmZvcm1lciA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWwpOyAKLQkJYmNfYWRkblBlcmZvcm1lciA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlKTsgCi0JCQotCQliY19yZXNwUm9sZSA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGUpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfcmVzcFJvbGUpOwotCQkKLQkJYmNfY29udEFydGlmYWN0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfY29udEFydGlmYWN0KTsKLQkJCi0JCWJjX2RlbGl2UGFydCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX2RlbGl2UGFydCk7Ci0JCQotCQliY19zZWxTdGVwID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsU3RlcHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfc2VsU3RlcCk7Ci0JCQotCQliY19ndWlkYW5jZSA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbEd1aWRhbmNlX2xhYmVsKTsKLQkJCi0JCWFkZExpc3RlbmVycyhjb21wb3NpdGUpOwotCQlzZXRBbGxDaGVja2VkKCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGluaXQgZGV0YWlsID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRBbGxDaGVja2VkKCkgewotCQliY19uYW1lLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfcHJlc05hbWUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19icmllZkRlc2Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19vcHRJbnB1dC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX21hbklucHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfb3V0cHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfcHJpbVBlcmZvcm1lci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2FkZG5QZXJmb3JtZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19yZXNwUm9sZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2NvbnRBcnRpZmFjdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2RlbGl2UGFydC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX3NlbFN0ZXAuc2V0U2VsZWN0aW9uKHRydWUpOwkKLQkJYmNfZ3VpZGFuY2Uuc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWJjX25hbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfbmFtZS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQliY19wcmVzTmFtZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19wcmVzTmFtZS5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX3ByZXNOYW1lWzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfcHJlc05hbWVbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfcHJlc05hbWVbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9wcmVzTmFtZVswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9wcmVzTmFtZVsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfYnJpZWZEZXNjLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2JyaWVmRGVzYy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0JyaWVmRGVzYyhTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQnJpZWZEZXNjKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfb3B0SW5wdXQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfb3B0SW5wdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9vcHRJbnB1dFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX29wdElucHV0WzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX29wdElucHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19tYW5JbnB1dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19tYW5JbnB1dC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX21hbklucHV0WzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfbWFuSW5wdXRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfbWFuSW5wdXRbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJCQkJCi0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9tYW5JbnB1dFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9tYW5JbnB1dFsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX291dHB1dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19vdXRwdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9vdXRwdXRbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9vdXRwdXRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfb3V0cHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9vdXRwdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfb3V0cHV0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX3ByaW1QZXJmb3JtZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfcHJpbVBlcmZvcm1lci5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJpbVBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJpbVBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19hZGRuUGVyZm9ybWVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChiY19hZGRuUGVyZm9ybWVyLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQWRkblBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNBZGRuUGVyZm9ybWVyKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQkJfQotCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJfQotCQl9KTsKLQkJCi0JCWJjX3Jlc3BSb2xlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX3Jlc3BSb2xlLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfcmVzcFJvbGVbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9yZXNwUm9sZVsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9yZXNwUm9sZVswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX3Jlc3BSb2xlWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX3Jlc3BSb2xlWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfY29udEFydGlmYWN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2NvbnRBcnRpZmFjdC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9jb250QXJ0aWZhY3RbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfZGVsaXZQYXJ0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2RlbGl2UGFydC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX2RlbGl2UGFydFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX2RlbGl2UGFydFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9kZWxpdlBhcnRbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX2RlbGl2UGFydFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfc2VsU3RlcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19zZWxTdGVwLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfc2VsU3RlcFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX3NlbFN0ZXBbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfc2VsU3RlcFswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1NlbFN0ZXAoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9zZWxTdGVwWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX3NlbFN0ZXBbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX2d1aWRhbmNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3luY0Nob2ljZXMuc2V0U3luY0d1aWRhbmNlKGJjX2d1aWRhbmNlLmdldFNlbGVjdGlvbigpID8gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCA6IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0vLwkJYnJfcHJlc05hbWVbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfb3B0SW5wdXRbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfbWFuSW5wdXRbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfb3V0cHV0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX3Jlc3BSb2xlWzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX2NvbnRBcnRpZmFjdFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9kZWxpdlBhcnRbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfc2VsU3RlcFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQkKLS8vCQlicl9wcmVzTmFtZVsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9vcHRJbnB1dFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9tYW5JbnB1dFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9vdXRwdXRbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfcmVzcFJvbGVbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfY29udEFydGlmYWN0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX2RlbGl2UGFydFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9zZWxTdGVwWzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfcHJlc05hbWVbMF0gJiYgYnJfcHJlc05hbWVbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNQcmVzTmFtZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9vcHRJbnB1dFswXSAmJiBicl9vcHRJbnB1dFswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX21hbklucHV0WzBdICYmIGJyX21hbklucHV0WzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfb3V0cHV0WzBdICYmIGJyX291dHB1dFswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9yZXNwUm9sZVswXSAmJiBicl9yZXNwUm9sZVswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1Jlc3BSb2xlKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX2NvbnRBcnRpZmFjdFswXSAmJiBicl9jb250QXJ0aWZhY3RbMF0uZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9kZWxpdlBhcnRbMF0gJiYgYnJfZGVsaXZQYXJ0WzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3NlbFN0ZXBbMF0gJiYgYnJfc2VsU3RlcFswXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jU2VsU3RlcChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfcHJlc05hbWVbMV0gJiYgYnJfcHJlc05hbWVbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX29wdElucHV0WzFdICYmIGJyX29wdElucHV0WzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9tYW5JbnB1dFsxXSAmJiBicl9tYW5JbnB1dFsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfb3V0cHV0WzFdICYmIGJyX291dHB1dFsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3Jlc3BSb2xlWzFdICYmIGJyX3Jlc3BSb2xlWzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9jb250QXJ0aWZhY3RbMV0gJiYgYnJfY29udEFydGlmYWN0WzFdLmdldFNlbGVjdGlvbigpKXsKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9kZWxpdlBhcnRbMV0gJiYgYnJfZGVsaXZQYXJ0WzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfc2VsU3RlcFsxXSAmJiBicl9zZWxTdGVwWzFdLmdldFNlbGVjdGlvbigpKXsKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1NlbFN0ZXAoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQlpZiAoc3luY0Nob2ljZXMuZ2V0U3luY05hbWUoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNQcmVzTmFtZSgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0JyaWVmRGVzYygpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY09wdElucHV0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jTWFuSW5wdXQoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNPdXRwdXQoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNQcmltUGVyZm9ybWVyKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jQWRkblBlcmZvcm1lcigpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY1Jlc3BSb2xlKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jQ29udEFydGlmYWN0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jRGVsaXZQYXJ0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jU2VsU3RlcCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0d1aWRhbmNlKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgY3JlYXRlVHdvUmFkaW9Hcm91cChDb21wb3NpdGUgcGFyZW50LCBCdXR0b25bXSByYnMpIHsKLS8vCQlDb21wb3NpdGUgYUdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLS8vCQkKLS8vCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLS8vCQlhR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJCi0vLwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0vLwkJYUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotLy8JCQotLy8JCXJic1swXSA9IGNyZWF0ZVJhZGlvQnV0dG9uKGFHcm91cCwgIiIsIDEsIHRydWUpOyAvLyROT04tTkxTLTEkCi0vLwkJcmJzWzFdID0gY3JlYXRlUmFkaW9CdXR0b24oYUdyb3VwLCAiIiwgMSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0vLwkJCi0vLwkJcmJzWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCXJic1sxXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNjM2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotLyoqCi0gKiBUaGUgd2l6YXJkIHRoYXQgZ3VpZGVzIHVzZXIgdG8gZG8gY3VzdG9tIHN5bmNocm9uaXphdGlvbiBmb3IgcHJvY2VzcwotICogZGVzY3JpcHRvcnMgZnJvbSBtZXRob2QgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UgZGVzY1BhZ2U7Ci0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlIHNlbGVjdENvbmZpZ1BhZ2U7Ci0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSBzZWxlY3REZXRhaWxzUGFnZTsKLS8vCXByaXZhdGUgU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UgcHJldmlld1BhZ2U7Ci0JCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25XaXphcmQoU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dCk7IAotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCQlkZXNjUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UoCi0JCQkJIlN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShkZXNjUGFnZSk7Ci0KLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlKAotCQkJCSJTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlIiwgc3luY0Nob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCXNlbGVjdENvbmZpZ1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQotCQlzZWxlY3REZXRhaWxzUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSgKLQkJCQkiU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UiLCBzeW5jQ2hvaWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0RGV0YWlsc1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0RGV0YWlsc1BhZ2UpOwotCQkKLS8vCQlwcmV2aWV3UGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSgKLS8vCQkJCSJTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotLy8JCXByZXZpZXdQYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotLy8JCWFkZFBhZ2UocHJldmlld1BhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gKHNlbGVjdERldGFpbHNQYWdlLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJc3luY0Nob2ljZXMuc2V0RmluaXNoUHJlc3NlZCh0cnVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtQ2FuY2VsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlzeW5jQ2hvaWNlcy5zZXRGaW5pc2hQcmVzc2VkKGZhbHNlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTYwMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGF1dGhvcmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYmUwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzFhNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmZWF0dXJlUGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmJhc2U7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGY0ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lm1hcHBpbmdzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGZkZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuNS4wCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwM2ViYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTA3NGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uXzMyLmdpZixcCi0gICAgICAgICAgICAgICB3ZWxjb21lLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBubC8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RhL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzY5ZjYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIC0gYmFzaXMKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnlnZ2VldGlrZXQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWE4MWU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIC0gQmFzaXMKLQotZmVhdHVyZVRleHQ9RVBGIC0gQmFzaXNcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQtS2VubnVuZzogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2VzL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZiNjMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotVmVyc2lcdTAwZjNuOiB7MX0gXG5cCi1FdGlxdWV0YSBkZSBidWlsZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNy4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZnIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjcwMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZnIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1CYXNlIEVQRgotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaW9uIDogezF9IFxuXAotTGliZWxsXHUwMGU5IGRlIHZlcnNpb24gOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGRiZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvaXQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaW9uZTogezF9IFxuXAotRXRpY2hldHRhIGJ1aWxkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBlIGFsdHJpIDIwMDAsIDIwMDcuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvamEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDFkNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvamEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6IHsxfSBcblwKLVx1MzBkM1x1MzBlYlx1MzBjOVx1MzBmYlx1MzBlOVx1MzBkOVx1MzBlYjogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2tvL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9rby9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM2NmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFx1YWUzMFx1YmNmOAotCi1mZWF0dXJlVGV4dD1FUEYgXHVhZTMwXHViY2Y4XG5cCi1cblwKLVx1YmM4NFx1YzgwNDogezF9IFxuXAotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZjOWYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9QmFzZSBFUEYKLQotZmVhdHVyZVRleHQ9QmFzZSBFUEZcblwKLVxuXAotVmVyc1x1MDBlM286IHsxfSBcblwKLUNvbnN0cnVcdTAwZTdcdTAwZTNvOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBFY2xpcHNlIGUgb3V0cm9zIDIwMDAsIDIwMDcuIFRvZG9zIG9zIERpcmVpdG9zIFJlc2VydmFkb3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvcnUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3YjkyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGCi0KLWZlYXR1cmVUZXh0PVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGXG5cCi1cblwKLVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQ0ZjogezF9IFxuXAotXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBcdTA0MTJcdTA0NDFcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQ0Yi5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRhYjI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9IFxuXAotXHU1ZGU1XHU0ZjVjXHU3MjQ4XHU2NzJjXHU2ODA3XHU3YjdlXHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiBcbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMDEwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYXsxfVxuXAotXHU1ZWZhXHU3ZjZlXHU2YTE5XHU3YzY0XHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTYwM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBCYXNlIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIEJhc2UgRmVhdHVyZSAoTkwxKQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2Uvd2VsY29tZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0MGQwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHdlbGNvbWVQYWdlIAotCXRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIj4KLQotPGludHJvPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yawotPC9pbnRybz4KLQotPGl0ZW0+PGI+V2hhdCBpcyBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPzwvYj4KLQkKLTwvaXRlbT4KLQotPGl0ZW0+PGI+TGVhcm4gTW9yZTwvYj4KLQotPC9pdGVtPgotCi08L3dlbGNvbWVQYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiZmE3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODY1MzQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UuU2VydmljZVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjc0MjZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTJkYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBDb21tb24gU2VydmljZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDhiNzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2ZXJzaW9uIiBuYW1lPSJWZXJzaW9uIiBzY2hlbWE9InNjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tbWFuZExpbmVSdW5uZXJzIiBuYW1lPSJDb21tYW5kTGluZVJ1bm5lcnMiIHNjaGVtYT0ic2NoZW1hL2NvbW1hbmRMaW5lUnVubmVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iZXBmIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uIj4KLSAgICAgICAgIDx2ZXJzaW9ucwotICAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5FUEZWZXJzaW9ucyIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NjaGVtYS9jb21tYW5kTGluZVJ1bm5lcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zY2hlbWEvY29tbWFuZExpbmVSdW5uZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZmM3M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NjaGVtYS9jb21tYW5kTGluZVJ1bm5lcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIiBpZD0iY29tbWFuZExpbmVSdW5uZXJzIiBuYW1lPSJDb21tYW5kTGluZVJ1bm5lcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgSUNvbW1hbmRMaW5lUnVubmVyIG9iamVjdCB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBhbmQgcnVuIGZyb20gUnVuVXRpbCwgcHJvdmlkZWQgd2l0aCBydW5uZXJJZAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb21tYW5kTGluZVJ1bm5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kTGluZVJ1bm5lciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bm5lcklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSUNvbW1hbmRMaW5lUnVubmVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zY2hlbWEvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTI1YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIiBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uIiBuYW1lPSJWZXJzaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIERlZmluZSBzY2hlbWEvdG9vbCB2ZXJzaW9ucwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2ZXJzaW9ucyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmVyc2lvbnMiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvbnMiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5JTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvU2VydmljZVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvU2VydmljZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2U1YTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL1NlcnZpY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZpY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0NvbW1hbmRMaW5lUnVuVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdXRpbHMvQ29tbWFuZExpbmVSdW5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGNkMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdXRpbHMvQ29tbWFuZExpbmVSdW5VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgZXhjdXRpbmcgYSBJQ29tbWFuZExpbmVSdW5uZXIgb2JqZWN0J3MgZXhlY3V0ZSBtZXRob2QKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kTGluZVJ1blV0aWwgewotCQotCXByaXZhdGUgc3RhdGljIENvbW1hbmRMaW5lUnVuVXRpbCBpbnN0YW5jZSA9IG5ldyBDb21tYW5kTGluZVJ1blV0aWwoKTsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFRvUnVuID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBDb21tYW5kTGluZVJ1blV0aWwgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmRMaW5lUnVuVXRpbCgpIHsJCQotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCS8vRm9yIGdlbmVyYWwgY2FzZSwgYXJncyBzaG91bGQgYmUgcGFyc2VkIGhlcmUgdG8gY2FsbCBvbiByaWdodCBydW5uZXJJZC4KLQkJLy9mb3Igbm93LCBqdXN0IGhhcmQgY29kZSBpdCB3aXRoICJjb21tYW5kTGluZVBsdWdpbkltcG9ydGVyIgotCQlleGVjdXRlQ29tbWFuZFJ1bm5lcihhcmdzLCAiY29tbWFuZExpbmVQbHVnaW5JbXBvcnRlciIpOwkvLyROT04tTkxTLTEkIAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVDb21tYW5kUnVubmVyKFN0cmluZ1tdIGFyZ3MsIFN0cmluZyBydW5uZXJJZCkgewotCQlJQ29tbWFuZExpbmVSdW5uZXIgcnVubmVyID0gZ2V0UnVubmVyKHJ1bm5lcklkKTsKLQkJaWYgKHJ1bm5lciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcnVubmVyLmV4ZWN1dGUoYXJncyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ29tbWFuZExpbmVSdW5uZXIgZ2V0UnVubmVyKFN0cmluZyBpZCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybQotCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQkJCSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UiLCAiY29tbWFuZExpbmVSdW5uZXJzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCVN0cmluZyBydW5uZXJJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW5uZXJJZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJ1bm5lcklkID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJ1bm5lcklkID0gcnVubmVySWQudHJpbSgpOwotCQkJCWlmICghIHJ1bm5lcklkLmVxdWFscyhpZCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKTsKLQkJCQl0cnkgewotCQkJCQlJQ29tbWFuZExpbmVSdW5uZXIgcnVubmVyID0gKElDb21tYW5kTGluZVJ1bm5lcikgYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCXJldHVybiBydW5uZXI7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05lZWRUb1J1bigpIHsKLQkJcmV0dXJuIG5lZWRUb1J1bjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZWVkVG9SdW4oYm9vbGVhbiBuZWVkVG9SdW4pIHsKLQkJdGhpcy5uZWVkVG9SdW4gPSBuZWVkVG9SdW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluc3RhbmNlKENvbW1hbmRMaW5lUnVuVXRpbCBpbnN0YW5jZSkgewotCQlDb21tYW5kTGluZVJ1blV0aWwuaW5zdGFuY2UgPSBpbnN0YW5jZTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0NvbW1hbmRMaW5lUnVubmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS91dGlscy9Db21tYW5kTGluZVJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDVmYjdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0NvbW1hbmRMaW5lUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgSUNvbW1hbmRMaW5lUnVubmVyCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVSdW5uZXIgaW1wbGVtZW50cyBJQ29tbWFuZExpbmVSdW5uZXIgewotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gdHJ1ZTsKLQkKLQlwcml2YXRlIEZpbGUgaW5wdXRGaWxlOwotCQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgewotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlci5leGVjdXRlLCBhcmdzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYXJnc1siICsgaSArICJdOiAiICsgYXJnc1tpXSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLWJhdGNoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpICsgMSA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gYXJnc1tpICsgMV07Ci0JCQkJCWlucHV0RmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQlpZiAoIWlucHV0RmlsZS5leGlzdHMoKSkgewotCQkJCQkJU3RyaW5nIG1zZyA9ICJDYW5ub3QgZmluZSB0aGUgZmlsZTogIiArIHBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I+ICIgKyBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBGaWxlIGdldElucHV0RmlsZSgpIHsKLQkJcmV0dXJuIGlucHV0RmlsZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS91dGlscy9JQ29tbWFuZExpbmVSdW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0lDb21tYW5kTGluZVJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjZmN2Y3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0lDb21tYW5kTGluZVJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZXhjdXRpbmcgYSBjb21tYW5kIGxpbmUKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRMaW5lUnVubmVyIHsKLQlib29sZWFuIGV4ZWN1dGUoU3RyaW5nW10gYXJncyk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL0VQRlZlcnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvRVBGVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njk0NDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvRVBGVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xlIHZlcnNpb24gb2YgRVBGIENvbXBvc2VyLgotICogSXQgY29udGFpbnMgYWxsIHRoZSB2ZXJzaW9ucyBvZiB0aGUgc3ViLWNvbXBvbmVudHMgb2YgRVBGLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaWNuZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVQRlZlcnNpb24gewotCi0JLy8gdGhlIHRvb2wgdmVyc2lvbgotCXByb3RlY3RlZCBWZXJzaW9uIHRvb2xWZXJzaW9uOwotCQotCS8vIHRoZSBsaWJyYXJ5IHZlcnNpb24KLQlwcm90ZWN0ZWQgVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbjsKLQkKLQkvLyB0aGUgc2NoZW1hIHZlcnNpb24KLQlwcm90ZWN0ZWQgVmVyc2lvbiB4bWxTY2hlbWFWZXJzaW9uOwotCQotCQotCXB1YmxpYyBFUEZWZXJzaW9uKCkgewotCQl0aGlzLnRvb2xWZXJzaW9uID0gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JCXRoaXMubGlicmFyeVZlcnNpb24gPSBWZXJzaW9uLmVtcHR5VmVyc2lvbjsKLQkJdGhpcy54bWxTY2hlbWFWZXJzaW9uID0gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JfTsKLQkKLQlwdWJsaWMgRVBGVmVyc2lvbihTdHJpbmcgdG9vbFZlcnNpb24sIFN0cmluZyBsaWJyYXJ5VmVyc2lvbiwgU3RyaW5nIHhtbFNjaGVtYVZlcnNpb24pIHsKLQkJdGhpcy50b29sVmVyc2lvbiA9IG5ldyBWZXJzaW9uKHRvb2xWZXJzaW9uKTsKLQkJdGhpcy5saWJyYXJ5VmVyc2lvbiA9IG5ldyBWZXJzaW9uKGxpYnJhcnlWZXJzaW9uKTsKLQkJdGhpcy54bWxTY2hlbWFWZXJzaW9uID0gbmV3IFZlcnNpb24oeG1sU2NoZW1hVmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdG9vbCB2ZXJzaW9uCi0JICovCi0JcHVibGljIFZlcnNpb24gZ2V0VG9vbFZlcnNpb24oKSB7Ci0JCXJldHVybiB0b29sVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsaWJyYXJ5IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgVmVyc2lvbiBnZXRMaWJyYXJ5VmVyc2lvbigpIHsKLQkJcmV0dXJuIGxpYnJhcnlWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFhNTCBzY2hlbWEgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGdldFhNTFNjaGVtYVZlcnNpb24oKSB7Ci0JCXJldHVybiB4bWxTY2hlbWFWZXJzaW9uOwotCX0KLQkKLQkvKioKLQkgKiBDb21wYXJlcyB0aGUgZ2l2ZW4gdG9vbCB2ZXJzaW9uIHRvIHRoaXMgb25lCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbiNjb21wYXJlVG8oKQotCSAqIAotCSAqIEBwYXJhbSBzY2hlbWFWZXJzaW9uIFRoZSBzY2hlbWEgdmVyc2lvbiB0byBiZSBjb21wYXJlZC4KLQkgKiBAcmV0dXJuIEEgbmVnYXRpdmUgaW50ZWdlciBpZiB0aGlzIHRvb2wgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIFplcm8gaWYgdGhlIHRoaXMgdG9vbCB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBBIHBvc2l0aXZlIGludGVnZXIgaWYgdGhpcyB0b29sIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUb29sVmVyc2lvblRvKFZlcnNpb24gdG9vbFZlcnNpb24pIHsKLQkJaWYgKCFWZXJzaW9uVXRpbC5pc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkpCi0JCQlyZXR1cm4gZ2V0VG9vbFZlcnNpb24oKS5jb21wYXJlVG8odG9vbFZlcnNpb24pOwotCQllbHNlIAotCQkJcmV0dXJuIDA7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmVzIHRoZSBnaXZlbiBsaWJyYXJ5IHZlcnNpb24gdG8gdGhpcyBvbmUKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uI2NvbXBhcmVUbygpCi0JICogCi0JICogQHBhcmFtIHNjaGVtYVZlcnNpb24gVGhlIHNjaGVtYSB2ZXJzaW9uIHRvIGJlIGNvbXBhcmVkLgotCSAqIEByZXR1cm4gQSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgbGlicmFyeSB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogWmVybyBpZiB0aGUgdGhpcyBsaWJyYXJ5IHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIEEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIGxpYnJhcnkgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZUxpYnJhcnlWZXJzaW9uVG8oVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbikgewotCQlpZiAoIVZlcnNpb25VdGlsLmlzVmVyc2lvbkNoZWNraW5nRGlzYWJsZWQoKSkKLQkJCXJldHVybiBnZXRMaWJyYXJ5VmVyc2lvbigpLmNvbXBhcmVUbyhsaWJyYXJ5VmVyc2lvbik7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB0aGUgZ2l2ZW4gWE1MIFNjaGVtYSB2ZXJzaW9uIHRvIHRoaXMgb25lCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbiNjb21wYXJlVG8oKQotCSAqIAotCSAqIEBwYXJhbSBzY2hlbWFWZXJzaW9uIFRoZSBzY2hlbWEgdmVyc2lvbiB0byBiZSBjb21wYXJlZC4KLQkgKiBAcmV0dXJuIEEgbmVnYXRpdmUgaW50ZWdlciBpZiB0aGlzIFhNTCBTY2hlbWEgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIFplcm8gaWYgdGhlIHRoaXMgWE1MIFNjaGVtYSB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBBIHBvc2l0aXZlIGludGVnZXIgaWYgdGhpcyBYTUwgU2NoZW1hIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVYTUxTY2hlbWFWZXJzaW9uVG8oVmVyc2lvbiBYTUxTY2hlbWFWZXJzaW9uKSB7Ci0JCWlmICghVmVyc2lvblV0aWwuaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpKQotCQkJcmV0dXJuIGdldFhNTFNjaGVtYVZlcnNpb24oKS5jb21wYXJlVG8oWE1MU2NoZW1hVmVyc2lvbik7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFRvb2xWZXJzaW9uKCkudG9TdHJpbmcoKSArICIsIiArIC8vJE5PTi1OTFMtMSQKLQkJZ2V0TGlicmFyeVZlcnNpb24oKS50b1N0cmluZygpICsgIiwiICsgLy8kTk9OLU5MUy0xJAotCQlnZXRYTUxTY2hlbWFWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSB0aGlzKSB7IC8vIHF1aWNrdGVzdAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBFUEZWZXJzaW9uKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRVBGVmVyc2lvbiBvdGhlciA9IChFUEZWZXJzaW9uKSBvYmplY3Q7Ci0JCXJldHVybiAoZ2V0VG9vbFZlcnNpb24oKS5lcXVhbHMob3RoZXIuZ2V0VG9vbFZlcnNpb24oKSkpICYmIChnZXRMaWJyYXJ5VmVyc2lvbigpLmVxdWFscyhvdGhlci5nZXRMaWJyYXJ5VmVyc2lvbigpKSkKLQkJCQkmJiAoZ2V0WE1MU2NoZW1hVmVyc2lvbigpLmVxdWFscyhvdGhlci5nZXRYTUxTY2hlbWFWZXJzaW9uKCkpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IHJlc3VsdCA9IHRvb2xWZXJzaW9uLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCBePSBsaWJyYXJ5VmVyc2lvbi5oYXNoQ29kZSgpOwotCQlyZXN1bHQgXj0geG1sU2NoZW1hVmVyc2lvbi5oYXNoQ29kZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvRVBGVmVyc2lvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvRVBGVmVyc2lvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjM2Q3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL0VQRlZlcnNpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGFsbCBvZiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGtub3duIEVQRiB2ZXJzaW9ucy4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFUEZWZXJzaW9ucyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX0lEID0gImVwZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRoZSBuYW1lIHNwYWNlIFVSSSBzdHJpbmcgZm9yIHRoZSBUT09MX0lECi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5zVXJpID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRVBGIDEuMAotCXByaXZhdGUgc3RhdGljIEVQRlZlcnNpb24gRVBGXzEwID0gbmV3IEVQRlZlcnNpb24oIjEuMCIsIC8vJE5PTi1OTFMtMSQgIHRvb2wgdmVyc2lvbgotCQkJIjEuMC4zLjAiLCAvLyROT04tTkxTLTEkICBsaWJyYXJ5IHZlcnNpb24KLQkJCSIxLjAuMCIpOyAvLyROT04tTkxTLTEkICB4bWwgc2NoZW1hIHZlcnNpb24KLQotCS8vIEVQRiAxLjEgLSBUaGlzIGlzIEVQRiAxLjIgSXRlcmF0aW9uIDEKLQlwcml2YXRlIHN0YXRpYyBFUEZWZXJzaW9uIEVQRl8xMSA9IG5ldyBFUEZWZXJzaW9uKCIxLjEiLCAvLyROT04tTkxTLTEkICB0b29sIHZlcnNpb24KLQkJCSIxLjAuNC4wIiwgLy8kTk9OLU5MUy0xJCAgbGlicmFyeSB2ZXJzaW9uCi0JCQkiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJCAgeG1sIHNjaGVtYSB2ZXJzaW9uCi0KLQkvLyBFUEYgMS4yIHJlbGVhc2UKLQlwcml2YXRlIHN0YXRpYyBFUEZWZXJzaW9uIEVQRl8xMiA9IG5ldyBFUEZWZXJzaW9uKCIxLjIiLCAvLyROT04tTkxTLTEkICB0b29sIHZlcnNpb24KLQkJCSIxLjAuNC4xIiwgLy8kTk9OLU5MUy0xJCAgbGlicmFyeSB2ZXJzaW9uCi0JCQkiMS4wLjEiKTsgLy8kTk9OLU5MUy0xJCAgeG1sIHNjaGVtYSB2ZXJzaW9uCi0KLQkvLyBFUEYgMS41IHJlbGVhc2UKLQlwcml2YXRlIHN0YXRpYyBFUEZWZXJzaW9uIEVQRl8xNSA9IG5ldyBFUEZWZXJzaW9uKCIxLjUiLCAvLyROT04tTkxTLTEkICB0b29sIHZlcnNpb24KLQkJCSIxLjAuNS4wIiwgLy8kTk9OLU5MUy0xJCAgbGlicmFyeSB2ZXJzaW9uCi0JCQkiMS4wLjIiKTsgLy8kTk9OLU5MUy0xJCAgeG1sIHNjaGVtYSB2ZXJzaW9uCi0KLQlwcml2YXRlIHN0YXRpYyBFUEZWZXJzaW9uIGN1cnJlbnRWZXJzaW9uID0gRVBGXzE1OwotCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0Q3VycmVudFZlcnNpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50VmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgRVBGVmVyc2lvbiBnZXRWZXJzaW9uKFN0cmluZyB0b29sVmVyc2lvbikgewotCQlpZiAodG9vbFZlcnNpb24gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0QWxsVmVyc2lvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFUEZWZXJzaW9uIHZlciA9IChFUEZWZXJzaW9uKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAodmVyLmdldFRvb2xWZXJzaW9uKCkuZXF1YWxzKG5ldyBWZXJzaW9uKHRvb2xWZXJzaW9uKSkpIHsKLQkJCQkJcmV0dXJuIHZlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWxsVmVyc2lvbnMoKSB7Ci0JCUxpc3Q8RVBGVmVyc2lvbj4gdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0PEVQRlZlcnNpb24+KCk7Ci0JCXZlcnNpb25zLmFkZChFUEZfMTApOwotCQl2ZXJzaW9ucy5hZGQoRVBGXzExKTsKLQkJdmVyc2lvbnMuYWRkKEVQRl8xMik7Ci0JCXZlcnNpb25zLmFkZChFUEZfMTUpOwotCQlyZXR1cm4gdmVyc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlWZXJzaW9uCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgbGlicmFyeSB2ZXJzaW9uCi0JICovCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0TWluVG9vbFZlcnNpb25Gb3JMaWJyYXJ5VmVyc2lvbihWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFsbFZlcnNpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFUEZWZXJzaW9uIHZlcnNpb25JbmZvID0gKEVQRlZlcnNpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKHZlcnNpb25JbmZvLmdldExpYnJhcnlWZXJzaW9uKCkuY29tcGFyZVRvKGxpYnJhcnlWZXJzaW9uKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIHZlcnNpb25JbmZvOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1pbmltdW0gdG9vbCB2ZXJzaW9uIHRoYXQgdXNlcyB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgRVBGVmVyc2lvbiBnZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRMaWJyYXJ5VmVyc2lvbigpIHsKLQkJVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbiA9IGdldEN1cnJlbnRWZXJzaW9uKCkuZ2V0TGlicmFyeVZlcnNpb24oKTsKLQkJcmV0dXJuIGdldE1pblRvb2xWZXJzaW9uRm9yTGlicmFyeVZlcnNpb24obGlicmFyeVZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB4bWxTY2hlbWFWZXJzaW9uCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgWE1MIFNjaGVtYQotCSAqICAgICAgICAgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBFUEZWZXJzaW9uIGdldE1pblRvb2xWZXJzaW9uRm9yWE1MU2NoZW1hVmVyc2lvbigKLQkJCVZlcnNpb24geG1sU2NoZW1hVmVyc2lvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRBbGxWZXJzaW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRVBGVmVyc2lvbiB2ZXJzaW9uSW5mbyA9IChFUEZWZXJzaW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmICh2ZXJzaW9uSW5mby5nZXRYTUxTY2hlbWFWZXJzaW9uKCkuY29tcGFyZVRvKHhtbFNjaGVtYVZlcnNpb24pID09IDApIHsKLQkJCQlyZXR1cm4gdmVyc2lvbkluZm87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBjdXJyZW50IFhNTCBTY2hlbWEgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBFUEZWZXJzaW9uIGdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudFhNTFNjaGVtYVZlcnNpb24oKSB7Ci0JCVZlcnNpb24geG1sU2NoZW1hVmVyc2lvbiA9IGdldEN1cnJlbnRWZXJzaW9uKCkuZ2V0WE1MU2NoZW1hVmVyc2lvbigpOwotCQlyZXR1cm4gZ2V0TWluVG9vbFZlcnNpb25Gb3JYTUxTY2hlbWFWZXJzaW9uKHhtbFNjaGVtYVZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgc3BhY2UgVVJJIHN0cmluZyBmb3IgdGhlIFRPT0xfSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5zVVJJKCkgewotCQlyZXR1cm4gbnNVcmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL0lMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL0lMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYTliYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9JTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHBlcmZvcm1pbmcgbWV0aG9kIGxpYnJhcnkgdmVyc2lvbiBjaGVjay4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2sgewotCi0JLyoqCi0JICogQ2hlY2tzIGFuZCByZXR1cm5zIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZAotCSAqIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgWE1JIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaWJyYXJ5IFhNSSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlCi0JICogICAgICAgICB2ZXJzaW9uIGluZm9ybWF0aW9uIG9mIHRoZSB0b29sIHRoYXQgY3JlYXRlZCBpdDsgb3IKLQkgKiAgICAgICAgIDxjb2RlPlZlcnNpb25DaGVja0luZm88L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBWZXJzaW9uQ2hlY2tJbmZvIGNoZWNrTGlicmFyeVZlcnNpb24oRmlsZSBsaWJQYXRoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9WZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjIzMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9WZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRvb2wgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUKLSAqIG1ldGhvZCBsaWJyYXJ5IGl0IGlzIHRyeWluZyB0byBvcGVuLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwcml2YXRlIFZlcnNpb24gZXhwZWN0ZWQ7Ci0KLQlwcml2YXRlIFZlcnNpb24gYWN0dWFsOwotCi0JcHVibGljIFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbihWZXJzaW9uIGV4cGVjdGVkLCBTdHJpbmcgYWN0dWFsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZDsKLQkJaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmFjdHVhbCA9IFZlcnNpb24uZW1wdHlWZXJzaW9uOwotCQl9IGVsc2UgewotCQkJdGhpcy5hY3R1YWwgPSBuZXcgVmVyc2lvbihhY3R1YWwpOwotCQl9Ci0JfQotCi0JcHVibGljIFZlcnNpb24gZ2V0QWN0dWFsKCkgewotCQlyZXR1cm4gYWN0dWFsOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldEV4cGVjdGVkKCkgewotCQlyZXR1cm4gZXhwZWN0ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9WZXJzaW9uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9WZXJzaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGE0MjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvVmVyc2lvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB1dGlsaXRpZXMgdG8gcXVlcnkgYSBtZXRob2QgbGlicmFyeSBzY2hlbWEgYW5kIHRoZSB2ZXJzaW9uIG9mIHRoZQotICogdG9vbCB0aGF0IGNyZWF0ZWQgaXQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmVyc2lvblV0aWwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBWZXJzaW9uQ2hlY2tJbmZvIHsKLQkJcHVibGljIFZlcnNpb25DaGVja0luZm8oU3RyaW5nIGlkLCBTdHJpbmcgdG9vbFZlcnNpb24sCi0JCQkJU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiwgaW50IHJlc3VsdCkgewotCQkJdGhpcy50b29sSUQgPSBpZDsKLQkJCXRoaXMudG9vbFZlcnNpb24gPSB0b29sVmVyc2lvbjsKLQkJCXRoaXMuY3VycmVudE1pblRvb2xWZXJzaW9uID0gY3VycmVudE1pblRvb2xWZXJzaW9uOwotCQkJdGhpcy5yZXN1bHQgPSByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvb2xJRDsKLQotCQlwdWJsaWMgU3RyaW5nIHRvb2xWZXJzaW9uOwotCi0JCXB1YmxpYyBTdHJpbmcgY3VycmVudE1pblRvb2xWZXJzaW9uOwotCi0JCS8qKgotCQkgKiA8IDA6IGZpbGVUb29sVmVyc2lvbiBpcyBvbGRlciB0aGFuIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiA8YnIvPiA9PSAwOgotCQkgKiBtYXRjaCA8YnIvPiA+IDAgOiBmaWxlVG9vbFZlcnNpb24gaXMgbmV3ZXIgdGhhbiBjdXJyZW50TWluVG9vbFZlcnNpb24KLQkJICogPGJyLz4KLQkJICovCi0JCXB1YmxpYyBpbnQgcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSBTZXJ2aWNlUGx1Z2luLmNsYXNzCi0JCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1ZFUlNJT05TX0lORk8gPSAidmVyc2lvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTElCX0VYVEVOU0lPTl9DSEVDSyA9ICJsaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfVkVSU0lPTl9DSEVDS0lOR19QUkVGID0gImRpc2FibGVfdmVyc2lvbl9jaGVja2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgRVBGVmVyc2lvbnM+IHZlcnNpb25zID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBFUEZWZXJzaW9ucz4oKTsKLQotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2s+IGxpYkV4dENoZWNrZXJzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjaz4oKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogTGlzdCBvZiB0b29sSURzIHRvIGNoZWNrLCBpbiBvcmRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiB0b29sSURzQ2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLQlzdGF0aWMgewotCQl0b29sSURzQ2hlY2tMaXN0LmFkZChFUEZWZXJzaW9ucy5UT09MX0lEKTsKLQotCQkvLyByZWFkIHByb3BlcnRpZXMgZmlsZQotCQl0cnkgewotCQkJU3RyaW5nIHZhbHVlU3RyID0gU2VydmljZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJLmdldFN0cmluZyhESVNBQkxFX1ZFUlNJT05fQ0hFQ0tJTkdfUFJFRik7Ci0JCQl2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZVN0cikuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCA9IGZhbHNlOwotCQl9Ci0KLQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbiIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJaW5pdEV4dGVuc2lvbihleHRlbnNpb24pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlTdHJpbmcgZXh0ZW5zaW9uSUQgPSBleHRlbnNpb24uZ2V0U2ltcGxlSWRlbnRpZmllcigpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQl0cnkgewotCQkJCWlmIChFWFRFTlNJT05fVkVSU0lPTlNfSU5GTy5lcXVhbHMoY29uZmlnRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCXZlcnNpb25zLnB1dChleHRlbnNpb25JRCwgKEVQRlZlcnNpb25zKSBidW5kbGUKLQkJCQkJCQkJLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKEVYVEVOU0lPTl9MSUJfRVhURU5TSU9OX0NIRUNLLmVxdWFscyhjb25maWdFbGVtZW50Ci0JCQkJCQkuZ2V0TmFtZSgpKSkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlsaWJFeHRDaGVja2Vycy5wdXQoZXh0ZW5zaW9uSUQsCi0JCQkJCQkJCShJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjaykgYnVuZGxlCi0JCQkJCQkJCQkJLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVNlcnZpY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbWFwIG9mIFRvb2wgSURzLXRvLVZlcnNpb25zIGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0VmVyc2lvbnNNYXAoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodmVyc2lvbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYSBTZXQgb2YgYWxsIGtub3duIFRvb2wgSURzCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRBbGxUb29sSURzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHZlcnNpb25zLmtleVNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbElECi0JICogQHJldHVybiBUaGUgVmVyc2lvbnMgY2xhc3MgZm9yIHRoZSBnaXZlbiBUb29sIElECi0JICovCi0JcHVibGljIHN0YXRpYyBFUEZWZXJzaW9ucyBnZXRWZXJzaW9ucyhTdHJpbmcgdG9vbElEKSB7Ci0JCXJldHVybiAoRVBGVmVyc2lvbnMpIHZlcnNpb25zLmdldCh0b29sSUQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdmVyc2lvbiBjaGVja2luZyBpcyBkaXNhYmxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkgewotCQlyZXR1cm4gdmVyc2lvbkNoZWNraW5nRGlzYWJsZWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfWE1JVmVyc2lvblBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkiKFxcdys/KTp2ZXJzaW9uPVwiKC4rPylcIiIsIFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfWE1MVmVyc2lvbkF0dHJpYnV0ZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkidG9vbD1cIiguKj8pXCIiLCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX1hNSV9FTEVNRU5UX1NUQVJUX1RBRyA9IFBhdHRlcm4KLQkJCS5jb21waWxlKCI8P3htbCB2ZXJzaW9uPVwiLis/XCIgZW5jb2Rpbmc9XCIuKz9cIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0VORF9UQUcgPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNSV9BVFRSSUJVVEVfVEFHID0gInhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1NUQVJUX1RBRyA9ICI8dW1hOk1ldGhvZExpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVkVSU0lPTlNfU0VQQVJBVE9SID0gIjsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVE9PTF9WRVJTSU9OX1NFUEFSQVRPUiA9ICI9IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2l2ZW4gYW4gWE1MIGZpbGUsIHdpbGwgcmVhZCB0aGUgdG9vbD0iZm9vPWEuYi5jLmQ7YmFyPXcueC55LnoiCi0JICogYXR0cmlidXRlcyBhbmQgcmV0dXJuIGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgZmlsZSB0byBwcm9jZXNzCi0JICogQHJldHVybiBudWxsIGlmIG5vIHZlcnNpb25zIGZvdW5kOyBhIG1hcCBvZiB0aGUgaWQtdG8tdmVyc2lvbnMgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgcmVhZFZlcnNpb25zRnJvbVhNTEZpbGUoRmlsZSB4bWxGaWxlKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gdmVyc2lvbnMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlidWYgPSBGaWxlVXRpbC5yZWFkRmlsZSh4bWxGaWxlLCBGaWxlVXRpbC5FTkNPRElOR19VVEZfOCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJU2VydmljZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCWlmIChidWYgIT0gbnVsbCkgewotCQkJaW50IHhtaUVsZW1lbnRTdGFydElkeCA9IGJ1Zi5pbmRleE9mKFhNTF9FTEVNRU5UX1NUQVJUX1RBRyk7Ci0JCQlpZiAoeG1pRWxlbWVudFN0YXJ0SWR4ICE9IC0xKSB7Ci0JCQkJaW50IHhtaUVsZW1lbnRFbmRJZHggPSBidWYuaW5kZXhPZihYTUxfRUxFTUVOVF9FTkRfVEFHLAotCQkJCQkJeG1pRWxlbWVudFN0YXJ0SWR4ICsgWE1MX0VMRU1FTlRfU1RBUlRfVEFHLmxlbmd0aCgpKTsKLQkJCQlpZiAoeG1pRWxlbWVudEVuZElkeCAhPSAtMSkgewotCQkJCQlTdHJpbmcgcm9vdEVsZW1lbnQgPSBidWYuc3Vic3RyaW5nKHhtaUVsZW1lbnRTdGFydElkeCwKLQkJCQkJCQl4bWlFbGVtZW50RW5kSWR4KTsKLQkJCQkJTWF0Y2hlciBtQXR0cmlidXRlID0gcF9YTUxWZXJzaW9uQXR0cmlidXRlUGF0dGVybgotCQkJCQkJCS5tYXRjaGVyKHJvb3RFbGVtZW50KTsKLQkJCQkJaWYgKG1BdHRyaWJ1dGUuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdG9vbHNBdHRyaWJ1dGUgPSBtQXR0cmlidXRlLmdyb3VwKDEpOwotCQkJCQkJaWYgKHRvb2xzQXR0cmlidXRlICE9IG51bGwKLQkJCQkJCQkJJiYgdG9vbHNBdHRyaWJ1dGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJU3RyaW5nW10gdmVyc2lvbnNBcnJheSA9IFN0clV0aWwuc3BsaXQoCi0JCQkJCQkJCQl0b29sc0F0dHJpYnV0ZSwgWE1MX1ZFUlNJT05TX1NFUEFSQVRPUik7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9uc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCWlmICh2ZXJzaW9uc0FycmF5W2ldICE9IG51bGwKLQkJCQkJCQkJCQkmJiB2ZXJzaW9uc0FycmF5W2ldLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJU3RyaW5nW10gdmVyc2lvbkluZm9BcnJheSA9IFN0clV0aWwuc3BsaXQoCi0JCQkJCQkJCQkJCXZlcnNpb25zQXJyYXlbaV0sCi0JCQkJCQkJCQkJCVhNTF9UT09MX1ZFUlNJT05fU0VQQVJBVE9SKTsKLQkJCQkJCQkJCWlmICh2ZXJzaW9uSW5mb0FycmF5Lmxlbmd0aCAhPSAyKQotCQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQkJU3RyaW5nIHRvb2xJRCA9IHZlcnNpb25JbmZvQXJyYXlbMF07Ci0JCQkJCQkJCQlTdHJpbmcgdG9vbFZlcnNpb24gPSB2ZXJzaW9uSW5mb0FycmF5WzFdOwotCQkJCQkJCQkJaWYgKHRvb2xJRCAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHRvb2xJRC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkJCSYmIHRvb2xWZXJzaW9uICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgdG9vbFZlcnNpb24udHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQkJCQl2ZXJzaW9ucy5wdXQodG9vbElELCB0b29sVmVyc2lvbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHZlcnNpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB2ZXJzaW9uczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIFhNSSBmaWxlLCB3aWxsIHJlYWQgdGhlIGZvbzp2ZXJzaW9uPSJ4LngueCIgYXR0cmlidXRlcyBhbmQKLQkgKiByZXR1cm4gYSBtYXAgb2YgdGhlIGlkLXRvLXZlcnNpb25zLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBmaWxlIHRvIHByb2Nlc3MKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gdmVyc2lvbnMgZm91bmQ7IGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucyBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCByZWFkVmVyc2lvbnNGcm9tWE1JRmlsZShGaWxlIHhtaUZpbGUpIHsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ1ZiA9IEZpbGVVdGlsLnJlYWRGaWxlKHhtaUZpbGUsIEZpbGVVdGlsLkVOQ09ESU5HX1VURl84KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTZXJ2aWNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQlNYXRjaGVyIGRvY1N0YXJ0TWF0Y2hlciA9IHBfWE1JX0VMRU1FTlRfU1RBUlRfVEFHLm1hdGNoZXIoYnVmKTsKLQkJCWlmIChkb2NTdGFydE1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJaW50IGRvY0hlYWRlckVuZElkeCA9IGRvY1N0YXJ0TWF0Y2hlci5lbmQoKTsKLQkJCQlpbnQgeG1pRWxlbWVudEVuZElkeCA9IGJ1Zi5pbmRleE9mKFhNTF9FTEVNRU5UX0VORF9UQUcsCi0JCQkJCQlkb2NIZWFkZXJFbmRJZHgpOwotCQkJCWlmICh4bWlFbGVtZW50RW5kSWR4ICE9IC0xKSB7Ci0JCQkJCVN0cmluZyByb290RWxlbWVudCA9IGJ1Zi5zdWJzdHJpbmcoZG9jSGVhZGVyRW5kSWR4LAotCQkJCQkJCXhtaUVsZW1lbnRFbmRJZHggKyAxKTsKLQkJCQkJTWF0Y2hlciBtID0gcF9YTUlWZXJzaW9uUGF0dGVybi5tYXRjaGVyKHJvb3RFbGVtZW50KTsKLQkJCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdG9vbElEID0gbS5ncm91cCgxKTsKLQkJCQkJCWlmICh0b29sSUQuZXF1YWxzKFhNSV9BVFRSSUJVVEVfVEFHKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IG0uZ3JvdXAoMik7Ci0JCQkJCQlpZiAodG9vbElEICE9IG51bGwgJiYgdG9vbElELnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgdG9vbFZlcnNpb24gIT0gbnVsbAotCQkJCQkJCQkmJiB0b29sVmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJCXZlcnNpb25zLnB1dCh0b29sSUQsIHRvb2xWZXJzaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodmVyc2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHZlcnNpb25zOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBmaWxlLCB3aWxsIHJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgcmV0dXJuIGEgbWFwIG9mIHRoZQotCSAqIGlkLXRvLXZlcnNpb25zLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBmaWxlIHRvIHByb2Nlc3MKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gdmVyc2lvbnMgZm91bmQ7IGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucyBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCByZWFkVmVyc2lvbnNGcm9tRmlsZShGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCkuZW5kc1dpdGgoIlhNSSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZWFkVmVyc2lvbnNGcm9tWE1JRmlsZShmaWxlKTsKLQkJfSBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKCJYTUwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVhZFZlcnNpb25zRnJvbVhNTEZpbGUoZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlNYXAgdmVyc2lvbnMgPSByZWFkVmVyc2lvbnNGcm9tWE1JRmlsZShmaWxlKTsKLQkJCWlmICh2ZXJzaW9ucyAhPSBudWxsKQotCQkJCXJldHVybiB2ZXJzaW9uczsKLQkJCXZlcnNpb25zID0gcmVhZFZlcnNpb25zRnJvbVhNTEZpbGUoZmlsZSk7Ci0JCQlpZiAodmVyc2lvbnMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdmVyc2lvbnM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBmaWxlLCB3aWxsIGNvbXBhcmUgd2l0aCBjdXJyZW50IFhNTCBTY2hlbWEgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gbnVsbCBpZiBmaWxlIHRvb2wgdmVyc2lvbiBjYW4gbm90IGJlIGZvdW5kOyBhIFZlcnNpb25DaGVja0luZm8KLQkgKiAgICAgICAgIG9iamVjdCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlcnNpb25DaGVja0luZm8gY2hlY2tYTUxWZXJzaW9uKEZpbGUgZmlsZSkgewotCQlNYXAgdmVyc2lvbk1hcCA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKGZpbGUpOwotCQlpZiAodmVyc2lvbk1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCVZlcnNpb25DaGVja0luZm8gdmNpID0gbnVsbDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRvb2xJRHNDaGVja0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2ZXJzaW9uTWFwLmdldCh0b29sSUQpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gKFN0cmluZykgdmVyc2lvbk1hcC5nZXQodG9vbElEKTsKLQkJCQkJdmNpID0gX2NoZWNrWE1MVmVyc2lvbih0b29sSUQsIHRvb2xWZXJzaW9uKTsKLQkJCQkJaWYgKHZjaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHZjaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVmVyc2lvbkNoZWNrSW5mbyBfY2hlY2tYTUxWZXJzaW9uKFN0cmluZyB0b29sSUQsCi0JCQlTdHJpbmcgdG9vbFZlcnNpb24pIHsKLQkJLy8gZ2V0IHRoZSBjbGFzcyB0aGF0IHN0b3JlcyBhbGwgdGhlIHZlcnNpb24gaW5mbyBmb3IgdGhpcyB0b29sIElECi0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gZ2V0VmVyc2lvbnModG9vbElEKTsKLQkJaWYgKHZlcnNpb25zICE9IG51bGwpIHsKLQkJCUVQRlZlcnNpb24gbWluQ3VyclZlcnNpb24gPSB2ZXJzaW9ucwotCQkJCQkuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50WE1MU2NoZW1hVmVyc2lvbigpOwotCQkJaW50IHJlc3VsdCA9IG1pbkN1cnJWZXJzaW9uLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKAotCQkJCQl0b29sVmVyc2lvbikpOwotCQkJU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiA9IG1pbkN1cnJWZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkKLQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25DaGVja0luZm8odG9vbElELCB0b29sVmVyc2lvbiwKLQkJCQkJY3VycmVudE1pblRvb2xWZXJzaW9uLCAtcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGZpbGUsIGNvbXBhcmVzIHdpdGggY3VycmVudCBsaWJyYXJ5IHNjaGVtYSB2ZXJzaW9uCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgZmlsZSB0b29sIHZlcnNpb24gY2FuIG5vdCBiZSBmb3VuZDsgYSBWZXJzaW9uQ2hlY2tJbmZvCi0JICogICAgICAgICBvYmplY3Qgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBWZXJzaW9uQ2hlY2tJbmZvIGNoZWNrTGlicmFyeVZlcnNpb24oRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoImxpYnJhcnkueG1pIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gY2hlY2sgbGlicmFyeSBleHRlbnNpb25zIGZpcnN0Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b29sSURzQ2hlY2tMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobGliRXh0Q2hlY2tlcnMuZ2V0KHRvb2xJRCkgIT0gbnVsbCkgewotCQkJCQlWZXJzaW9uQ2hlY2tJbmZvIHZjaSA9IG51bGw7Ci0JCQkJCUlMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIGV4dENoZWNrID0gKElMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrKSBsaWJFeHRDaGVja2VycwotCQkJCQkJCS5nZXQodG9vbElEKTsKLQkJCQkJdmNpID0gZXh0Q2hlY2suY2hlY2tMaWJyYXJ5VmVyc2lvbihmaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCWlmICh2Y2kgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB2Y2k7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1hcCB2ZXJzaW9uTWFwID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoZmlsZSk7Ci0JCWlmICh2ZXJzaW9uTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJVmVyc2lvbkNoZWNrSW5mbyB2Y2kgPSBudWxsOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdG9vbElEc0NoZWNrTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHZlcnNpb25NYXAuZ2V0KHRvb2xJRCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdG9vbFZlcnNpb24gPSAoU3RyaW5nKSB2ZXJzaW9uTWFwLmdldCh0b29sSUQpOwotCQkJCQl2Y2kgPSBfY2hlY2tMaWJWZXJzaW9uKHRvb2xJRCwgdG9vbFZlcnNpb24pOwotCQkJCQlpZiAodmNpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdmNpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBWZXJzaW9uQ2hlY2tJbmZvIF9jaGVja0xpYlZlcnNpb24oU3RyaW5nIHRvb2xJRCwKLQkJCVN0cmluZyB0b29sVmVyc2lvbikgewotCQkvLyBnZXQgdGhlIGNsYXNzIHRoYXQgc3RvcmVzIGFsbCB0aGUgdmVyc2lvbiBpbmZvIGZvciB0aGlzIHRvb2wgSUQKLQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSBnZXRWZXJzaW9ucyh0b29sSUQpOwotCQlpZiAodmVyc2lvbnMgIT0gbnVsbCkgewotCQkJRVBGVmVyc2lvbiBtaW5DdXJyVmVyc2lvbiA9IHZlcnNpb25zCi0JCQkJCS5nZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRMaWJyYXJ5VmVyc2lvbigpOwotCQkJaW50IHJlc3VsdCA9IG1pbkN1cnJWZXJzaW9uLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKAotCQkJCQl0b29sVmVyc2lvbikpOwotCQkJU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiA9IG1pbkN1cnJWZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkKLQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25DaGVja0luZm8odG9vbElELCB0b29sVmVyc2lvbiwKLQkJCQkJY3VycmVudE1pblRvb2xWZXJzaW9uLCAtcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCB0b29sSUQgdGhhdCBpcyBjaGVja2VkLiBJbiBtb3N0IGNhc2VzLCB0aGUgSUQgb2YgdGhlCi0JICogICAgICAgICBjdXJyZW50bHkgcnVubmluZyBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByaW1hcnlUb29sSUQoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0b29sSURzQ2hlY2tMaXN0LmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgdG9vbCBJRCB0byB0aGUgb3JkZXIgb2YgdG9vbHMgdG8gY2hlY2suCi0JICogCi0JICogQHBhcmFtIHRvb2xJRAotCSAqICAgICAgICAgICAgdG9vbElEIHRvIGFkZAotCSAqIEBwYXJhbSB0b29sSURmb2xsb3dpbmcKLQkgKiAgICAgICAgICAgIGlmIG51bGwsIGFkZHMgdG9vbElEIHRvIGZyb250IG9mIGxpc3QuIG90aGVyd2lzZSwgYWRkcyB0b29sSUQKLQkgKiAgICAgICAgICAgIGJlZm9yZSB0aGUgc3BlY2lmaWVkIElECi0JICogQHJldHVybiBmYWxzZSBpZmYgdG9vbElEZm9sbG93aW5nIGlzIG5vdCBudWxsIGFuZCBjb3VsZCBub3QgYmUgZm91bmQgaW4KLQkgKiAgICAgICAgIGxpc3Q7IHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvb2xJRChTdHJpbmcgdG9vbElELCBTdHJpbmcgdG9vbElEZm9sbG93aW5nKSB7Ci0JCWlmICh0b29sSURmb2xsb3dpbmcgIT0gbnVsbCkgewotCQkJaW50IGlkeCA9IHRvb2xJRHNDaGVja0xpc3QuaW5kZXhPZih0b29sSURmb2xsb3dpbmcpOwotCQkJaWYgKGlkeCAhPSAtMSkgewotCQkJCXRvb2xJRHNDaGVja0xpc3QuYWRkKGlkeCwgdG9vbElEKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXRvb2xJRHNDaGVja0xpc3QuYWRkKDAsIHRvb2xJRCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2NlNmEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYThhODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNGcmkgSmFuIDA0IDE1OjA5OjA5IFBTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTQ5MGI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5Db21tb25VSVBsdWdpbgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQyZTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0Fic3RyYWN0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0Fic3RyYWN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZmUyYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9BYnN0cmFjdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJ1bnRpbWUuSW50ZXJuYWxQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uSUFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JMThuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEVQRiBwbHVnLWlucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiBpbXBsZW1lbnRzIElBY3RpdmF0b3IgewotCi0KLQkvLyBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgaWNvbnMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUEFUSCA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkOwotCi0JLy8gVGhlIGxvZ2dlciBoYXNoIG1hcC4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMb2dnZXI+IGxvZ2dlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvZ2dlcj4oKTsKLQotCS8vIFRoZSBtZXNzYWdlIGRpYWxvZyBoYXNoIG1hcC4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBNc2dEaWFsb2c+IG1zZ0RpYWxvZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1zZ0RpYWxvZz4oKTsKLQotCS8vIFRoZSBzaGFyZWQgaW1hZ2UgaGFzaCBtYXAuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW1hZ2U+IHNoYXJlZEltYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2U+KCk7Ci0KLQkvLyBUaGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHBsdWctaW4uCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCS8vIFRoaXMgcGx1Zy1pbiBJRC4KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQotCS8vIFRoZSBwbHVnLWluIGluc3RhbGwgVVJMLgotCXByaXZhdGUgVVJMIGluc3RhbGxVUkw7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YWxsIHBhdGguCi0JcHJpdmF0ZSBTdHJpbmcgaW5zdGFsbFBhdGg7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpY29uIFVSTC4KLQlwcml2YXRlIFVSTCBpY29uVVJMOwotCi0JLy8gVGhlIHByb2ZpbGluZyBmbGFnLgotCXByaXZhdGUgYm9vbGVhbiBwcm9maWxpbmc7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJaW5pdChjb250ZXh0KTsKLQotCQkvLyBzZXQgdGhlIAotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiU3RhcnRlZCAiICsgcGx1Z2luSWQpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEZyZWUgdGhlIHNoYXJlZCBpbWFnZXMuCi0JCWZvciAoSXRlcmF0b3IgaW1hZ2VzID0gc2hhcmVkSW1hZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGltYWdlcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VzLm5leHQoKTsKLQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJTdG9wcGVkICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgVGhlIGJ1bmRsZSBjb250ZXh0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gR2V0IHRoZSBidW5kbGUgZm9yIHRoaXMgcGx1Zy1pbi4KLQkJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCi0JCS8vIEdldCB0aGUgcmVzb3VjZSBidW5kbGUgZm9yIHRoaXMgcGx1Zy1pbi4KLQkJcmVzb3VyY2VCdW5kbGUgPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShidW5kbGUpOwotCi0JCS8vIEdldCB0aGUgSUQgZm9yIHRoaXMgcGx1Zy1pbi4KLQkJcGx1Z2luSWQgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIkluaXRpYWxpemluZyAiICsgcGx1Z2luSWQpOyAvLyROT04tTkxTLTEkCQkKLQkJfQotCi0JCS8vIEdldCB0aGUgaW5zdGFsbCBwYXRoIG9mIHRoaXMgcGx1Zy1pbi4KLQkJaW5zdGFsbFVSTCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWluc3RhbGxQYXRoID0gRmlsZUxvY2F0b3IucmVzb2x2ZShpbnN0YWxsVVJMKS5nZXRQYXRoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWluc3RhbGxQYXRoID0gUGxhdGZvcm0uZ2V0SW5zdGFsbExvY2F0aW9uKCkuZ2V0VVJMKCkuZ2V0UGF0aCgpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWljb25VUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIElDT05fUEFUSCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCVN0cmluZyBzeW1ib2xpY05hbWUgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCWlmIChzeW1ib2xpY05hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGtleSA9IHN5bWJvbGljTmFtZSArICIvcHJvZmlsaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZhbHVlID0gSW50ZXJuYWxQbGF0Zm9ybS5nZXREZWZhdWx0KCkuZ2V0T3B0aW9uKGtleSk7Ci0JCQlwcm9maWxpbmcgPSB2YWx1ZSA9PSBudWxsID8gZmFsc2UgOiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKAotCQkJCQkiSW5pdGlhbGl6ZWQgIiArIHBsdWdpbklkICsgIiwgaW5zdGFsbFBhdGg9IiArIGluc3RhbGxQYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHJldHVybiBUaGUgSUQgb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIFRoZQotCSAqICAgICAgICAgICAgaW5zdGFsbCBVUkwgb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0SW5zdGFsbFVSTCgpIHsKLQkJcmV0dXJuIGluc3RhbGxVUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBwYXRoIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gVGhlCi0JICogICAgICAgICAgICBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFsbFBhdGgoKSB7Ci0JCXJldHVybiBpbnN0YWxsUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhbmQgcmV0dXJucyB0aGUgbG9jYWxpemVkIHByb3BlcnRpZXMgb2YgYSBKYXZhIHByb3BlcnRpZXMgZmlsZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnRpZXMgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIHJvb3QuCi0JICogQHJldHVybiBBIDxjb2RlPlByb3BlcnRpZXM8L2NvZGU+IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3BzOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVQYXRoID0gZ2V0TG9jYWxpemVkRmlsZShwYXRoLCB0cnVlKTsKLQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCXByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbG9jYWxlIHNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlIGluIHRoZQotCSAqIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnRpZXMgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIHJvb3QuCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGxvY2FsZSBzcGVjaWZpYyBhYnNvbHV0ZSBmaWxlIHBhdGggbmFtZSBvZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIGZpbGUuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkRmlsZShTdHJpbmcgcGF0aCwgYm9vbGVhbiB1c2VEZWZhdWx0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVQYXRoID0gbnVsbDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUocGF0aCk7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoZmlsZU5hbWUpOwotCQlTdHJpbmcgcGF0aE5hbWUgPSBwYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCQlCdW5kbGVbXSBidW5kbGVzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0JCWlmIChidW5kbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJCVVSTCBlbnRyeSA9IGJ1bmRsZXNbaV0uZ2V0RW50cnkocGF0aE5hbWUpOwotCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKGVudHJ5KTsKLQkJCQkJZmlsZVBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKHVybC5nZXRQYXRoKCkKLQkJCQkJCQkrIGZpbGVOYW1lLCBsb2NhbGUpOyAKLQkJCQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLQkJCVVSTCBlbnRyeSA9IGJ1bmRsZS5nZXRFbnRyeShwYXRoKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoZW50cnkpOwotCQkJCWZpbGVQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSh1cmwuZ2V0UGF0aCgpLCBsb2NhbGUpOwotCQkJCWlmIChmaWxlUGF0aCA9PSBudWxsICYmIHVzZURlZmF1bHQpIHsKLQkJCQkJZmlsZVBhdGggPSB1cmwuZ2V0UGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmaWxlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgdGhlIGdpdmVuIHBhdGggaW4gdGhlIHBsdWdpbiwgZmluZCB0aGUgbG9jYWxpemVkIGZpbGVzIGZvcm0gdGhlIG5sCi0JICogZnJhZ2VtZW5ldHMgYW5kIGNvcHkgdGhlIGxvY2FsaXplZCBmaWxlcyB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIHBsdWdpbiByb290LiBUaGUgZmlsZXMgaW4gdGhpcwotCSAqICAgICAgICAgICAgZm9sZGVyIHdpbGwgYmUgaXRlcmF0ZWQgYW5kIHRoZWlyIGxvY2FsaXplZCBmaWxlcyB3aWxsIGJlCi0JICogICAgICAgICAgICBjb3BpZWQgb3ZlcgotCSAqIEBwYXJhbSB0b0RpcgotCSAqICAgICAgICAgICAgRklsZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyCi0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqICAgICAgICAgICAgYm9vbGVhbiByZWN1cml2ZWx5IGxvb2tpbmcgZm9yIGZpbGVzIGludCB0aGUgc3BlY2lmaWVkIGZvbGRlcgotCSAqIEBwYXJhbSB1c2VMb2NhbGVGaWxlTmFtZQotCSAqICAgICAgICAgICAgYm9vbGVhbiBpZiB0cnVlIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lcyB3aWxsIGJlIHVzZWQgaW4KLQkgKiAgICAgICAgICAgIHRoZSBjb3BpZWQgZGVzdGluYXRpb24sIG90aGVyd2lzZSwgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlCi0JICogICAgICAgICAgICBuYW1lIHdpbGwgYmUgcmVuYW1lZCB0byB0aGUgZGVmYXVsdCBvbmUgaW4gdGhlIGRlc3RpbmF0aW9uCi0JICogICAgICAgICAgICBmb2xkZXIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29weUxvY2FsaXplZEZpbGVzKFN0cmluZyBwYXRoLCBGaWxlIHRvRGlyLCBib29sZWFuIHJlY3Vyc2l2ZSwKLQkJCWJvb2xlYW4gdXNlTG9jYWxlRmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gZ2V0SW5zdGFsbFBhdGgoKTsKLQkJVVJJIHBsdWdpblVyaSA9IG5ldyBGaWxlKHBsdWdpblBhdGgpLnRvVVJJKCk7Ci0JCVVSSSBwYXRoVXJpID0gbmV3IEZpbGUocGx1Z2luUGF0aCwgcGF0aCkudG9VUkkoKTsKLQotCQlMaXN0PEZpbGU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShwbHVnaW5QYXRoLCBwYXRoKTsKLQkJRmlsZVV0aWwuZ2V0QWxsRmlsZXMoZiwgZmlsZXMsIHJlY3Vyc2l2ZSk7Ci0KLQkJLy8gZm9yIGVhY2ggZmlsZSBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciwgZ2V0IHRoZSBsb2NhbGl6ZWQgZmlsZQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVVJJIHNyY1VyaSA9ICgoRmlsZSkgaXQubmV4dCgpKS50b1VSSSgpOwotCi0JCQkvLyBnZXQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGZpbGUgdG8gdGhlIHBsdWdpbiByb290LCB0aGVuIGZpbmQKLQkJCS8vIHRoZSBsb2NhbGl6ZWQgZmlsZQotCQkJU3RyaW5nIHJlbFBhdGggPSBwbHVnaW5VcmkucmVsYXRpdml6ZShzcmNVcmkpLmdldFBhdGgoKTsKLQotCQkJLy8gb25seSBnZXQgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlLCBkb24ndCBpbmNsdWRlIHRoZSBkZWZhdWx0IG9uZQotCQkJU3RyaW5nIGxvY2FsaXplZEZpbGUgPSBnZXRMb2NhbGl6ZWRGaWxlKHJlbFBhdGgsIGZhbHNlKTsKLQkJCWlmIChsb2NhbGl6ZWRGaWxlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gbmVlZCB0byBjaGFuZ2UgdGhlIHRhcmdldCBmaWxlIHBhdGggdG8gcmVsYXRpdmUgdG8gdGhlIHBhdGgKLQkJCS8vIGluc3RlYWQgb2YgdGhlIHBsdWdpbiByb290Ci0JCQlyZWxQYXRoID0gcGF0aFVyaS5yZWxhdGl2aXplKHNyY1VyaSkuZ2V0UGF0aCgpOwotCQkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUobG9jYWxpemVkRmlsZSk7Ci0JCQlGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0b0RpciwgcmVsUGF0aCk7Ci0JCQlGaWxlIHRhcmdldFBhcmVudCA9IHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCi0JCQkvLyBjb3B5IHRoZSBmaWxlIHRvIHRoZSBkZXNpdGluYXRpb24KLQkJCS8vIGlmIHVzZUxvY2FsZUZpbGVOYW1lIGlzIHRydWUsIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUgc2hvdWxkCi0JCQkvLyBhbHNvIHVzZSB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUgbmFtZQotCQkJaWYgKHVzZUxvY2FsZUZpbGVOYW1lKSB7Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gc3JjRmlsZS5nZXROYW1lKCk7Ci0JCQkJdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldFBhcmVudCwgZmlsZU5hbWUpOwotCQkJfQotCi0JCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29weWluZyBsb2NhbGl6ZWQgZmlsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNvdXJjZTogIiArIHNyY0ZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUYXJnZXQ6ICIgKyB0YXJnZXRGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAoIXRhcmdldFBhcmVudC5leGlzdHMoKSkgewotCQkJCQl0YXJnZXRQYXJlbnQubWtkaXJzKCk7Ci0JCQkJfQotCi0JCQkJaWYgKCF0YXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRhcmdldEZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJCX0KLQotCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICdbJyArIGtleSArICddJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbG9jYWxpemVkIG1lc3NhZ2UgZ2l2ZW4gdGhlIHJlc291cmNlIGtleSBhbmQgdGhlCi0JICogbWVzc2FnZSBhcmd1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBhcmd1bWVudAotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgYXJndW1lbnQuCi0JICogQHJldHVybiBUaGUgZm9ybWF0dGVkIGxvY2FsaXplZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG1zZyA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCU9iamVjdFtdIGFyZ3VtZW50cyA9IHsgYXJndW1lbnQgfTsKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcmd1bWVudHMpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIFVSTCBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSBVUkwuCi0JICovCi0JcHVibGljIFVSTCBnZXRJbWFnZVVSTChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChpY29uVVJMLCByZWxhdGl2ZVBhdGgpOwotCQkJcmV0dXJuIEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwsIHJlbGF0aXZlUGF0aCk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHJldHVybmVkIGltYWdlIG5lZWQgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHJldHVybmVkIGltYWdlIHdpbGwgYmUgYXV0b21hdGljYWxseSBmcmVlZCB3aGVuIHRoZSBwbHVnLWluCi0JICogc2h1dHMgZG93bi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0U2hhcmVkSW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgc2hhcmVkSW1hZ2VzLmdldChyZWxhdGl2ZVBhdGgpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlOwotCQl9Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKGZhbHNlKTsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJc2hhcmVkSW1hZ2VzLnB1dChyZWxhdGl2ZVBhdGgsIGltYWdlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9maWxpbmcgZmxhZy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHByb2ZpbGluZyBpcyBlbmFibGVkIGZvciB0aGlzIHBsdS1pbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvZmlsaW5nKCkgewotCQlyZXR1cm4gcHJvZmlsaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvZ2dlciBnaXZlbiB0aGUgcGx1Zy1pbiBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgb3IgY2FjaGVkIGxvZ2dlci4KLQkgKi8KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IChMb2dnZXIpIGxvZ2dlcnMuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpOwotCQkJbG9nZ2Vycy5wdXQocGx1Z2luSWQsIGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBkaWFsb2cgZ2l2ZW4gdGhlIHBsdWctaW4gSUQuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IG9yIGNhY2hlZCBtZXNzYWdlIGRpYWxvZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1zZ0RpYWxvZyBnZXRNc2dEaWFsb2coSUFjdGl2YXRvciBwbHVnaW4pIHsKLQkJTXNnRGlhbG9nIG1zZ0RpYWxvZyA9IChNc2dEaWFsb2cpIG1zZ0RpYWxvZ3MuZ2V0KHBsdWdpbi5nZXRJZCgpKTsKLQkJaWYgKG1zZ0RpYWxvZyA9PSBudWxsKSB7Ci0JCQltc2dEaWFsb2cgPSBuZXcgTXNnRGlhbG9nKHBsdWdpbik7Ci0JCQltc2dEaWFsb2dzLnB1dChwbHVnaW4uZ2V0SWQoKSwgbXNnRGlhbG9nKTsKLQkJfQotCQlyZXR1cm4gbXNnRGlhbG9nOwotCX0KLQotCQotCXB1YmxpYyBNc2dEaWFsb2cgZ2V0TXNnRGlhbG9nKCkgewkJCi0JCXJldHVybiBnZXRNc2dEaWFsb2codGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmIHRoZQotCSAqIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc2FwbHkuIElmIHNvLCB0aGlzIGRpc3BsYXkKLQkgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheTsKLQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29tbW9uVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29tbW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjMzI0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0NvbW1vblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLklNZXNzYWdlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIENvbW1vblVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENvbW1vblVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbW1vblVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0vLwkJLy8gc2V0IHRoZSBwcmVmZXJlbmNlIHN0b3JlIGZvciB0aGUgY29tbW9uIHBsdWdpbgotCQlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlV3JhcHBlciA9IG5ldyBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDb21tb25QcmVmZXJlbmNlU3RvcmUoc3RvcmVXcmFwcGVyKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgbWVzc2FnZSBjYWxsYmFjayBjb250ZXh0IGZvciB0aGUgbm9uLXVpIHBsdWdpbnMKLQkJLy8gdGhpcyBpcyB0aGUgY29udGV4dCBmb3IgbWVzc2FnZSBjYWxsYmFjawotCQkvLyBmb3IgZWNsaXBzZSBjbGllbnQsIHRoaXMgaXMgdGhlIFNoZWxsIG9iamVjdAotCQkvLyBzaGVsbCBvYmplY3QgY2FuJ3QgYmUgc2hhcmVkIGFjcm9vc3MgdGhyZWFkLCB1c2UgYSBjb250ZXh0IHByb3ZpZGVyIGluc3RlYWQKLQkJLy9Db21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENvbnRleHQoTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJCi0JCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q29udGV4dFByb3ZpZGVyKG5ldyBDb250ZXh0UHJvdmlkZXIoKSk7Ci0JCi0JCS8vIGNyZWF0ZSB0aGUgTWVzc2FnZUNhbGxiYWNrIHRvIGJlIGFjY2Vzc2libGUgdG8gdGhlIG5vbi11aSBwbHVnaW4KLQkJSU1lc3NhZ2VDYWxsYmFjayBtc2dDYWxsYmFjayA9IG5ldyBNZXNzYWdlQ2FsbGJhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25VSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0NvbnRleHRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Db250ZXh0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiZjNjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0NvbnRleHRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5JQ29udGV4dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci0KLS8qKgotICogY29udGVudCBwcm92aWRlciBmb3Igbm9uLXVpIHBsdWdpbnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29udGV4dFByb3ZpZGVyIHsKLQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dCgpIHsKLQkJLy9UT0RPOiByZXZpc2l0Ci0JCU9iamVjdCBjdHggPSBudWxsOwotCQl0cnkgewotCQkJY3R4ID0gQ29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JCXJldHVybiBjdHggIT0gbnVsbCA/IGN0eCA6IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvTWVzc2FnZUNhbGxiYWNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL01lc3NhZ2VDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDgzNTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvTWVzc2FnZUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkFic3RyYWN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uSU1lc3NhZ2VDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotCi0vKioKLSAqIG1lc3NhZ2UgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ2FsbGJhY2sgaW1wbGVtZW50cyBJTWVzc2FnZUNhbGxiYWNrIHsKLQotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWRpc3BsYXlXYXJuaW5nKHBsdWdpbiwgdGl0bGUsIG1zZywgcmVhc29uLCBudWxsLCBudWxsKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFRocm93YWJsZSBleCkgewotCQlkaXNwbGF5V2FybmluZyhwbHVnaW4sIG1zZywgcmVhc29uLCBudWxsLCBleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlTdHJpbmcgdGl0bGUgPSBDb21tb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkuZ2V0VGV4dCgpOwotCQlkaXNwbGF5V2FybmluZyhwbHVnaW4sIHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpIHsKLQkJTXNnRGlhbG9nIGRsZyA9IENvbW1vblVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2cocGx1Z2luKTsKLQkJZGxnLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJZGlzcGxheUVycm9yKHBsdWdpbiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXlFcnJvcihwbHVnaW4sIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIGV4KTsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCU1zZ0RpYWxvZyBkbGcgPSBDb21tb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKHBsdWdpbik7Ci0JCWRsZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvUHJlZmVyZW5jZVN0b3JlV3JhcHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9QcmVmZXJlbmNlU3RvcmVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWU0NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9QcmVmZXJlbmNlU3RvcmVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIHdyYXBwZXIgY2xhc3MgZm9yIHByZWZlcmVuY2Ugc3RvcmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGltcGxlbWVudHMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgewotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBzdG9yZTsKLQlwdWJsaWMgUHJlZmVyZW5jZVN0b3JlV3JhcHBlcihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXRoaXMuc3RvcmUgPSBzdG9yZTsKLQl9Ci0JCi0JTWFwPElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTWFwID0gbmV3IEhhc2hNYXA8SVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oKTsKLQkKLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRTdG9yZSgpIHsKLQkJcmV0dXJuIHN0b3JlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIGxpc3RlbmVyKSB7Ci0JCS8vIGNyZWF0ZSBhIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYW5kIGFkZCB0byB0aGUgc3RvcmUKLQkJSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcGNsID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciB3cmFwcGVyID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyKGV2ZW50KTsKLQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZSh3cmFwcGVyKTsKLQkJCQkKLQkJCX19OwotCQkKLQkJbGlzdGVuZXJNYXAucHV0KGxpc3RlbmVyLCBwY2wpOwotCQlzdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBjbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBuYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0JICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN0b3JlLmZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgbGlzdGVuZXIpIHsKLSAgICAJSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcGNsID0gbGlzdGVuZXJNYXAucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICAJaWYgKCBwY2wgIT0gbnVsbCApIHsKLSAgICAJCXN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKLSAgICAJfQotICAgIH0KLQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+ZmFsc2U8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0Qm9vbGVhbihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5mYWxzZTwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgYm9vbGVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXREZWZhdWx0Qm9vbGVhbihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZG91YmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREZWZhdWx0RG91YmxlKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXREZWZhdWx0RG91YmxlKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjBmPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBmbG9hdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXREZWZhdWx0RmxvYXQoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHRGbG9hdChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYW4gaW50ZWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RGVmYXVsdEludChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wTDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgbG9uZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXREZWZhdWx0TG9uZyhuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKHRoZSBlbXB0eSBzdHJpbmcgPGNvZGU+IiI8L2NvZGU+KSAKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHRTdHJpbmcobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGRvdWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERvdWJsZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjBmPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZmxvYXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXRGbG9hdChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYW4gaW50ZWd0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGludC12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXRJbnQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wTDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGxvbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXRMb25nKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICh0aGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPikKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0U3RyaW5nKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogaGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGhhcyBhIGtub3duIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBhbmQgaXRzIGN1cnJlbnQgdmFsdWUgaXMgdGhlIHNhbWUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogKGluY2x1ZGluZyB0aGUgY2FzZSB3aGVyZSB0aGUgcHJlZmVyZW5jZSBpcyB1bmtub3duIHRvIHRoaXMgc3RvcmUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5pc0RlZmF1bHQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlcyBpbiB0aGlzIHByb3BlcnR5IHN0b3JlCi0gICAgICogcmVxdWlyZSBzYXZpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSBvZiB2YWx1ZXMgb2YgCi0gICAgICogIHRoZSBwcmVmZXJlbmNlcyBrbm93biB0byB0aGlzIHN0b3JlIGhhcyBjaGFuZ2VkIGFuZCAKLSAgICAgKiAgcmVxdWlyZXMgc2F2aW5nLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc1NhdmluZygpIHsKLSAgICAJcmV0dXJuIHN0b3JlLm5lZWRzU2F2aW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRvCi0gICAgICogdGhlIGdpdmVuIHN0cmluZyB2YWx1ZSB3aXRob3V0IHNlbmRpbmcgYSBwcm9wZXJ0eSBjaGFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgZmlyZSBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBhbmQgCi0gICAgICogc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igc2V0dGluZyBpbnRlcm5hbCBwcmVmZXJlbmNlcyAKLSAgICAgKiB0aGF0IGFyZSBub3QgbWVhbnQgdG8gYmUgcHJvY2Vzc2VkIGJ5IGxpc3RlbmVycy4KLSAgICAgKiBOb3JtYWwgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBjYWxsICNzZXRWYWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnB1dFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIGRlZmF1bHRPYmplY3QgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0T2JqZWN0KSB7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQobmFtZSwgZGVmYXVsdE9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgYmFjawotICAgICAqIHRvIGl0cyBkZWZhdWx0IHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIHRoZQotICAgICAqIGFwcHJvcHJpYXRlIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgcmVtb3ZpbmcgdGhlIG5hbWVkIHZhbHVlIGZyb20gdGhlIHN0b3JlLCAKLSAgICAgKiB0aGVyZWJ5IGV4cG9zaW5nIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9EZWZhdWx0KFN0cmluZyBuYW1lKSB7Ci0gICAgCXN0b3JlLnNldFRvRGVmYXVsdChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1Byb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1Byb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2Njk4ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Qcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIHdyYXBwZXIgY2xhc3MgZm9yIHByb3BlcnR5IGNoYW5nZSBldmVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIHsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JfQotCQotCSAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bgotICAgICAqICBvciBub3QgcmVsZXZhbnQgKGZvciBpbnN0YW5jZSBpZiB0aGUgcHJvcGVydHkgd2FzIHJlbW92ZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGtub3duCi0gICAgICogIG9yIG5vdCByZWxldmFudCAoZm9yIGluc3RhbmNlIGlmIHRoZSBwcm9wZXJ0eSB3YXMganVzdAotICAgICAqICBhZGRlZCBhbmQgdGhlcmUgd2FzIG5vIG9sZCB2YWx1ZSkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRPbGRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogV2FybmluZzogdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHByb3BlcnR5IG5hbWUgcmV0dXJuZWQKLSAgICAgKiBpcyBhIGNvbnN0YW50IHN0cmluZy4gIENhbGxlcnMgbXVzdCBjb21wYXJlIHByb3BlcnR5IG5hbWVzIHVzaW5nCi0gICAgICogZXF1YWxzLCBub3QgPT0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHkoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9hY3Rpb25zL0NDb21ib0NvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiYTQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBXcmFwcyBhIENDb21ibyBpbiBhIENvbnRyaWJ1dGlvbkl0ZW0gZm9yIHVzZSBpbiBhIHRvb2xiYXIKLSAqIAotICogRG9lcyBub3QgdXNlIGEgQ29tYm9WaWV3ZXIgYmVjYXVzZSBvZiB0YWJiaW5nIGlzc3VlcyAtIHNlZSBidWcgNzg4ODUKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIENDb21ib0NvbnRyaWJ1dGlvbkl0ZW0gZXh0ZW5kcyBDb250cmlidXRpb25JdGVtIHsKLQotCXByb3RlY3RlZCBDQ29tYm8gQ0NvbWJvOwotCi0JcHJvdGVjdGVkIFRvb2xJdGVtIHRvb2xJdGVtOwotCi0JcHJvdGVjdGVkIENvb2xJdGVtIGNvb2xJdGVtOwotCQotCXByb3RlY3RlZCBpbnQgc3R5bGU7Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBpbnB1dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENDb21ib0NvbnRyaWJ1dGlvbkl0ZW0oaW50IHN0eWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotCQl0b29sSXRlbSA9IG5ldyBUb29sSXRlbShwYXJlbnQsIFNXVC5TRVBBUkFUT1IpOwotCQlDb250cm9sIGJveCA9IGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJdG9vbEl0ZW0uc2V0Q29udHJvbChib3gpOwotCQlQb2ludCBwcmVmZXJyZWRTaXplID0gQ0NvbWJvLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0JCXRvb2xJdGVtLnNldFdpZHRoKHByZWZlcnJlZFNpemUueCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvb2xCYXIgY29vbEJhciwgaW50IGluZGV4KSB7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChjb29sQmFyKTsKLQotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTiwgaW5kZXgpOwotCQl9IGVsc2UgewotCQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCX0KLQotCQkvLyBTZXQgdGhlIGJhY2sgcmVmZXJlbmNlLgotCQljb29sSXRlbS5zZXREYXRhKHRoaXMpOwotCi0JCS8vIEFkZCB0aGUgdG9vbGJhciB0byB0aGUgQ29vbEl0ZW0gd2lkZ2V0LgotCQljb29sSXRlbS5zZXRDb250cm9sKGJveCk7Ci0KLQkJLy8gSWYgdGhlIHRvb2xiYXIgaXRlbSBleGlzdHMgdGhlbiBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGNvb2wgaXRlbS4KLQkJUG9pbnQgdG9vbEJhclNpemUgPSBib3guY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQkvLyBTZXQgdGhlIHByZWZlcnJlZCBzaXplIHRvIHRoZSBzaXplIG9mIHRoZSB0b29sYmFyIHBsdXMgdHJpbS4KLQkJY29vbEl0ZW0uc2V0TWluaW11bVNpemUodG9vbEJhclNpemUpOwotCQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0U2l6ZSh0b29sQmFyU2l6ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvID0gbmV3IENDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJQ0NvbWJvLnNldFZpc2libGVJdGVtQ291bnQoMTApOwotCQlDQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJQ0NvbWJvLnNldEl0ZW1zKGlucHV0LnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotCQlDQ29tYm8uYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCQkJZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJQ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlyZXR1cm4gQ0NvbWJvOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JCXJldHVybiBDQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoQ29sbGVjdGlvbjxTdHJpbmc+IGlucHV0KSB7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCkgewotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIENDb21ibyBnZXRDQ29tYm8oKSB7Ci0JCXJldHVybiBDQ29tYm87Ci0JfQotCi0JcHVibGljIFRvb2xJdGVtIGdldFRvb2xJdGVtKCkgewotCQlyZXR1cm4gdG9vbEl0ZW07Ci0JfQotCi0JcHVibGljIENvb2xJdGVtIGdldENvb2xJdGVtKCkgewotCQlyZXR1cm4gY29vbEl0ZW07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NsaXBib2FyZFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9DbGlwYm9hcmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYmYwMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NsaXBib2FyZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSB0aGUgY2xpcGJvYXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENsaXBib2FyZFV0aWwgewotCQotCS8qKgotCSAqIFRoZSBjdXJyZW50IGNsaXBib2FyZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9VUkwgPSAiU291cmNlVVJMOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFRyYW5zZmVyIGh0bWxUcmFuc2ZlciA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtCi0JCQkJCQkuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NiIpOyAvLyROT04tTkxTLTEkCi0JCQkJQ2xhc3MgYyA9IGJ1bmRsZQotCQkJCQkJLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi5XaW4zMkhUTUxUcmFuc2ZlciIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCQlodG1sVHJhbnNmZXIgPSAoVHJhbnNmZXIpIGMubmV3SW5zdGFuY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWh0bWxUcmFuc2ZlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHNvdXJjZSBVUkwgZnJvbSB0aGUgY3VycmVudCBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgSFRNTCBzb3VyY2UgVVJMIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SFRNTFNvdXJjZVVSTCgpIHsKLQkJaWYgKGh0bWxUcmFuc2ZlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJU3RyaW5nIHNvdXJjZVVSTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaHRtbENvbnRlbnQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoaHRtbFRyYW5zZmVyKTsKLQkJCWlmIChodG1sQ29udGVudCAhPSBudWxsICYmIGh0bWxDb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJCWludCBpbmRleCA9IGh0bWxDb250ZW50LmluZGV4T2YoU09VUkNFX1VSTCk7Ci0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQlzb3VyY2VVUkwgPSBodG1sQ29udGVudC5zdWJzdHJpbmcoaW5kZXgKLQkJCQkJCQkrIFNPVVJDRV9VUkwubGVuZ3RoKCkpOwotCQkJCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwuc3Vic3RyaW5nKDAsIHNvdXJjZVVSTAotCQkJCQkJCS5pbmRleE9mKEZpbGVVdGlsLkxJTkVfU0VQKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNvdXJjZVVSTCAhPSBudWxsICYmIHNvdXJjZVVSTC5pbmRleE9mKCJcXCIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBJRSBwcm92aWRlcyBzb3VyY2VVUkwgaW4gZm9ybSAiZmlsZTovL0M6XGZvb1xiYXIuaHRtIgotCQkJCS8vIGJ1dCB3aGVuIHRoZSBocmVmcyBhcmUgcmVzb2x2ZWQsIGZpbGVzIGxvb2sgbGlrZSAiZmlsZTovLy9DOi9mb28vYmFyLmh0bSIKLQkJCQlVUkwgdXJsID0gbmV3IFVSTChzb3VyY2VVUkwpOwotCQkJCXNvdXJjZVVSTCA9IHVybC50b0V4dGVybmFsRm9ybSgpOwotCQkJCWlmIChzb3VyY2VVUkwuc3RhcnRzV2l0aCgiZmlsZTovLyIpICYmICFzb3VyY2VVUkwuc3RhcnRzV2l0aCgiZmlsZTovLy8iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLy8gbmVlZCB0byBhZGQgYSB0aGlyZCAvIHNvIHJ0ZS5qcyBjYW4gbWF0Y2ggdGhlIHNvdXJjZVVSTCB0byBocmVmcwotCQkJCQlzb3VyY2VVUkwgPSAiZmlsZTovLy8iICsgc291cmNlVVJMLnN1YnN0cmluZyg3KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzb3VyY2VVUkw7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB1cmxFeCkgewotCQkJcmV0dXJuIHNvdXJjZVVSTDsKLQkJfSBmaW5hbGx5IHsKLQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSBzdHJpbmcgdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRleHRIVE1MVG9DbGlwYm9hcmQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKG51bGwpOwotCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHsgc3RyaW5nLCBzdHJpbmcgfSwKLQkJCQluZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJaWYgKGNsaXBib2FyZCAhPSBudWxsKQotCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Db21tb25QcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NvbW1vblByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2N2M2MzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NvbW1vblByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQ29tbW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGNvbW1vbiBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25QcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3Igc3RvcmluZyB0aGUgcHJlZmVyZW5jZSBoaXN0b3J5IHNpemUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSElTVE9SWV9TSVpFID0gInByZWZlcmVuY2VIaXN0b3J5U2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBDb21tb25VSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBSRUZFUkVOQ0VfSElTVE9SWV9TSVpFLAotCQkJCWdldERlZmF1bHRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIGhpc3Rvcnkgc2l6ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCkgewotCQlyZXR1cm4gMTA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJlZmVyZW5jZSBoaXN0b3J5IHNpemUuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEludChQUkVGRVJFTkNFX0hJU1RPUllfU0laRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHByZWZlcmVuY2UgaGlzdG9yeSBzaXplLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQUkVGRVJFTkNFX0hJU1RPUllfU0laRSwgdmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0Vycm9yRGlhbG9nTm9SZWFzb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9FcnJvckRpYWxvZ05vUmVhc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjcxYzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0Vycm9yRGlhbG9nTm9SZWFzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgd2l0aG91dCB0aGUgRGV0YWlscyBidXR0b24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JEaWFsb2dOb1JlYXNvbiBleHRlbmRzIEljb25BbmRNZXNzYWdlRGlhbG9nIHsKLQotCS8qKgotCSAqIFN0YXRpYyB0byBwcmV2ZW50IG9wZW5pbmcgb2YgZXJyb3IgZGlhbG9ncyBmb3IgYXV0b21hdGVkIHRlc3RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEFVVE9NQVRFRF9NT0RFID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBSZXNlcnZlIHJvb20gZm9yIHRoaXMgbWFueSBsaXN0IGl0ZW1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVNUX0lURU1fQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIG5lc3RpbmcgaW5kZW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVNUSU5HX0lOREVOVCA9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBEZXRhaWxzIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGRldGFpbHNCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoZSBTV1QgbGlzdCBjb250cm9sIHRoYXQgZGlzcGxheXMgdGhlIGVycm9yIGRldGFpbHMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGxpc3Q7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3IgZGV0YWlscyB2aWV3ZXIgaXMgY3VycmVudGx5IGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGaWx0ZXIgbWFzayBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggc3RhdHVzIGl0ZW1zIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBpbnQgZGlzcGxheU1hc2sgPSAweEZGRkY7Ci0KLQkvKioKLQkgKiBUaGUgbWFpbiBzdGF0dXMgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBjbGlwYm9hcmQuIFRvIGJlIGRpc3Bvc2VkIHdoZW4gY2xvc2luZyB0aGUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRJbmNsdWRlVG9wTGV2ZWxFcnJvckluRGV0YWlscyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLQkgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotCSAqIDxwPgotCSAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZQotCSAqIG9mIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcKLQkgKiBkaXNwbGF5ZWQgY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZCA8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzawotCSAqIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotCSAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLQkgKiBAcGFyYW0gZGlzcGxheU1hc2sKLQkgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzCi0JICogICAgICAgICAgICBwZXIgPGNvZGU+SVN0YXR1cy5tYXRjaGVzPC9jb2RlPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjbWF0Y2hlcyhpbnQpCi0JICovCi0JcHVibGljIEVycm9yRGlhbG9nTm9SZWFzb24oU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlLCBJU3RhdHVzIHN0YXR1cywgaW50IGRpc3BsYXlNYXNrKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IGRpYWxvZ1RpdGxlID09IG51bGwgPyBKRmFjZVJlc291cmNlcwotCQkJCS5nZXRTdHJpbmcoIlByb2JsZW1fT2NjdXJyZWQiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlkaWFsb2dUaXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZSA9PSBudWxsID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6IG1lc3NhZ2U7IAotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJdGhpcy5kaXNwbGF5TWFzayA9IGRpc3BsYXlNYXNrOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLiBIYW5kbGVzIHRoZSBwcmVzc2luZyBvZiB0aGUgT2sKLQkgKiBvciBEZXRhaWxzIGJ1dHRvbiBpbiB0aGlzIGRpYWxvZy4gSWYgdGhlIE9rIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIGNsb3NlCi0JICogdGhpcyBkaWFsb2cuIElmIHRoZSBEZXRhaWxzIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIHRvZ2dsZSB0aGUgZGlzcGxheWluZwotCSAqIG9mIHRoZSBlcnJvciBkZXRhaWxzIGFyZWEuIE5vdGUgdGhhdCB0aGUgRGV0YWlscyBidXR0b24gd2lsbCBvbmx5IGJlCi0JICogdmlzaWJsZSBpZiB0aGUgZXJyb3IgYmVpbmcgZGlzcGxheWVkIHNwZWNpZmllcyBjaGlsZCBkZXRhaWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0JCWlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpIHsKLQkJCS8vIHdhcyB0aGUgZGV0YWlscyBidXR0b24gcHJlc3NlZD8KLQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBPSyBhbmQgRGV0YWlscyBidXR0b25zCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCWlmIChzaG91bGRTaG93RGV0YWlsc0J1dHRvbigpKSB7Ci0JCQlkZXRhaWxzQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotCQkJCQlJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kIGNyZWF0ZXMKLQkgKiBhbmQgbGF5cyBvdXQgYSBjb21wb3NpdGUgYW5kIGNhbGxzIDxjb2RlPmNyZWF0ZU1lc3NhZ2VBcmVhPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5jcmVhdGVDdXN0b21BcmVhPC9jb2RlPiB0byBwb3B1bGF0ZSBpdC4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBvdmVycmlkZSA8Y29kZT5jcmVhdGVDdXN0b21BcmVhPC9jb2RlPiB0byBhZGQgY29udGVudHMgYmVsb3cgdGhlCi0JICogbWVzc2FnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlTWVzc2FnZUFyZWEocGFyZW50KTsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgY2hpbGREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNoaWxkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGNoaWxkRGF0YSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBJY29uQW5kTWVzc2FnZURpYWxvZyNjcmVhdGVEaWFsb2dBbmRCdXR0b25BcmVhKENvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEaWFsb2dBbmRCdXR0b25BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlRGlhbG9nQW5kQnV0dG9uQXJlYShwYXJlbnQpOwotCQlpZiAodGhpcy5kaWFsb2dBcmVhIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQkvLyBDcmVhdGUgYSBsYWJlbCBpZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW4gdG8gZm9yY2UgYSBzbWFsbGVyIGxheW91dAotCQkJQ29tcG9zaXRlIGRpYWxvZ0NvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGRpYWxvZ0FyZWE7Ci0JCQlpZiAoZGlhbG9nQ29tcG9zaXRlLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDApCi0JCQkJbmV3IExhYmVsKGRpYWxvZ0NvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nI2dldEltYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQlyZXR1cm4gZ2V0V2FybmluZ0ltYWdlKCk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQotCQkJCXJldHVybiBnZXRJbmZvSW1hZ2UoKTsKLQkJfQotCQkvLyBJZiBpdCB3YXMgbm90IGEgd2FybmluZyBvciBhbiBlcnJvciB0aGVuIHJldHVybiB0aGUgZXJyb3IgaW1hZ2UKLQkJcmV0dXJuIGdldEVycm9ySW1hZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhpcyBkaWFsb2cncyBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVEcm9wRG93bkxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTAotCQkJCXwgU1dULk1VTFRJKTsKLQkJLy8gZmlsbCB0aGUgbGlzdAotCQlwb3B1bGF0ZUxpc3QobGlzdCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCkgKiBMSVNUX0lURU1fQ09VTlQ7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpc3Quc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJTWVudSBjb3B5TWVudSA9IG5ldyBNZW51KGxpc3QpOwotCQlNZW51SXRlbSBjb3B5SXRlbSA9IG5ldyBNZW51SXRlbShjb3B5TWVudSwgU1dULk5PTkUpOwotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lci53aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljb3B5VG9DbGlwYm9hcmQoKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIud2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNvcHlUb0NsaXBib2FyZCgpOwotCQkJfQotCQl9KTsKLQkJY29weUl0ZW0uc2V0VGV4dChKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoImNvcHkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGlzdC5zZXRNZW51KGNvcHlNZW51KTsKLQkJbGlzdENyZWF0ZWQgPSB0cnVlOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLQkgKi8KLQkvKioKLQkgKiBFeHRlbmRzIDxjb2RlPldpbmRvdy5vcGVuKCk8L2NvZGU+LiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheQotCSAqIHRoZSBlcnJvci4gSWYgeW91IHNwZWNpZmllZCBhIG1hc2sgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0JICogY2hpbGRyZW4sIHRoZSBlcnJvciBkaWFsb2cgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdAotCSAqIG9uZSBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0JICovCi0JcHVibGljIGludCBvcGVuKCkgewotCQlpZiAoIUFVVE9NQVRFRF9NT0RFICYmIHNob3VsZERpc3BsYXkoc3RhdHVzLCBkaXNwbGF5TWFzaykpIHsKLQkJCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JCX0KLQkJc2V0UmV0dXJuQ29kZShPSyk7Ci0JCXJldHVybiBPSzsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUKLQkgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGRvZXMgbm90IGNvbnRhaW4gY2hpbGQgaXRlbXMsIG9yIGlmIHlvdSB3aXNoCi0JICogdG8gZGlzcGxheSBhbGwgc3VjaCBpdGVtcyB3aXRob3V0IGZpbHRlcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLQkgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0JICogQHJldHVybiB0aGUgY29kZSBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHByZXNzZWQgdGhhdCByZXN1bHRlZCBpbiB0aGlzCi0JICogICAgICAgICBkaWFsb2cgY2xvc2luZy4gVGhpcyB3aWxsIGJlIDxjb2RlPkRpYWxvZy5PSzwvY29kZT4gaWYgdGhlIE9LCi0JICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLQkgKiAgICAgICAgIGRpYWxvZydzIGNsb3NlIHdpbmRvdyBkZWNvcmF0aW9uIG9yIHRoZSBFU0Mga2V5IHdhcyB1c2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG9wZW5FcnJvcihTaGVsbCBwYXJlbnQsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gb3BlbkVycm9yKHBhcmVudCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgSVN0YXR1cy5PSwotCQkJCXwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGVycm9yLiBVc2UgdGhpcyBtZXRob2QgaWYgdGhlCi0JICogZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZCBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kIDwvaXQ+IHlvdSB3aXNoCi0JICogdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZQotCSAqIGNoaWxkcmVuLiBUaGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3QKLQkgKiBvbmUgY2hpbGQgc3RhdHVzIG1hdGNoaW5nIHRoZSBtYXNrLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0JICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotCSAqIEBwYXJhbSBkaXNwbGF5TWFzawotCSAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMKLQkgKiAgICAgICAgICAgIHBlciA8Y29kZT5JU3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgY29kZSBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHByZXNzZWQgdGhhdCByZXN1bHRlZCBpbiB0aGlzCi0JICogICAgICAgICBkaWFsb2cgY2xvc2luZy4gVGhpcyB3aWxsIGJlIDxjb2RlPkRpYWxvZy5PSzwvY29kZT4gaWYgdGhlIE9LCi0JICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLQkgKiAgICAgICAgIGRpYWxvZydzIGNsb3NlIHdpbmRvdyBkZWNvcmF0aW9uIG9yIHRoZSBFU0Mga2V5IHdhcyB1c2VkLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjbWF0Y2hlcyhpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgb3BlbkVycm9yKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMsIGludCBkaXNwbGF5TWFzaykgewotCQlFcnJvckRpYWxvZ05vUmVhc29uIGRpYWxvZyA9IG5ldyBFcnJvckRpYWxvZ05vUmVhc29uKHBhcmVudFNoZWxsLAotCQkJCXRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSBsaXN0IHVzaW5nIHRoaXMgZXJyb3IgZGlhbG9nJ3Mgc3RhdHVzIG9iamVjdC4gVGhpcyB3YWxrcwotCSAqIHRoZSBjaGlsZCBzdGF0aWMgb2YgdGhlIHN0YXR1cyBvYmplY3QgYW5kIGRpc3BsYXlzIHRoZW0gaW4gYSBsaXN0LiBUaGUKLQkgKiBmb3JtYXQgZm9yIGVhY2ggZW50cnkgaXMgc3RhdHVzX3BhdGggOiBzdGF0dXNfbWVzc2FnZSBJZiB0aGUgc3RhdHVzJ3MKLQkgKiBwYXRoIHdhcyBudWxsIHRoZW4gaXQgKGFuZCB0aGUgY29sb24pIGFyZSBvbWl0dGVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0VG9Qb3B1bGF0ZQotCSAqICAgICAgICAgICAgVGhlIGxpc3QgdG8gZmlsbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdFRvUG9wdWxhdGUpIHsKLQkJcG9wdWxhdGVMaXN0KGxpc3RUb1BvcHVsYXRlLCBzdGF0dXMsIDAsCi0JCQkJc2hvdWxkSW5jbHVkZVRvcExldmVsRXJyb3JJbkRldGFpbHMpOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlIHRoZSBsaXN0IHdpdGggdGhlIG1lc3NhZ2VzIGZyb20gdGhlIGdpdmVuIHN0YXR1cy4gVHJhdmVyc2UgdGhlCi0JICogY2hpbGRyZW4gb2YgdGhlIHN0YXR1cyBkZWVwbHkgYW5kIGFsc28gdHJhdmVyc2UgQ29yZUV4Y2VwdGlvbnMgdGhhdAotCSAqIGFwcGVhciBpbiB0aGUgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0VG9Qb3B1bGF0ZQotCSAqICAgICAgICAgICAgdGhlIGxpc3QgdG8gcG9wdWxhdGUKLQkgKiBAcGFyYW0gYnVpbGRpbmdTdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgYmVpbmcgZGlzcGxheWVkCi0JICogQHBhcmFtIG5lc3RpbmcKLQkgKiAgICAgICAgICAgIHRoZSBuZXN0aW5nIGxldmVsIChpbmNyZWFzZXMgb25lIGxldmVsIGZvciBlYWNoIGxldmVsIG9mCi0JICogICAgICAgICAgICBjaGlsZHJlbikKLQkgKiBAcGFyYW0gaW5jbHVkZVN0YXR1cwotCSAqICAgICAgICAgICAgd2hldGhlciB0byBpbmNsdWRlIHRoZSBidWlsZGluZ1N0YXR1cyBpbiB0aGUgZGlzcGxheSBvciBqdXN0Ci0JICogICAgICAgICAgICBpdHMgY2hpbGRyZW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdFRvUG9wdWxhdGUsIElTdGF0dXMgYnVpbGRpbmdTdGF0dXMsCi0JCQlpbnQgbmVzdGluZywgYm9vbGVhbiBpbmNsdWRlU3RhdHVzKSB7Ci0KLQkJaWYgKCFidWlsZGluZ1N0YXR1cy5tYXRjaGVzKGRpc3BsYXlNYXNrKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVGhyb3dhYmxlIHQgPSBidWlsZGluZ1N0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJYm9vbGVhbiBpc0NvcmVFeGNlcHRpb24gPSB0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbjsKLQkJYm9vbGVhbiBpbmNyZW1lbnROZXN0aW5nID0gZmFsc2U7Ci0KLQkJaWYgKGluY2x1ZGVTdGF0dXMpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGluZzsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKE5FU1RJTkdfSU5ERU5UKTsgCi0JCQl9Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGJ1aWxkaW5nU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCXNiLmFwcGVuZChtZXNzYWdlKTsKLQkJCWxpc3RUb1BvcHVsYXRlLmFkZChzYi50b1N0cmluZygpKTsKLQkJCWluY3JlbWVudE5lc3RpbmcgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKCFpc0NvcmVFeGNlcHRpb24gJiYgdCAhPSBudWxsKSB7Ci0JCQkvLyBJbmNsdWRlIGxvdy1sZXZlbCBleGNlcHRpb24gbWVzc2FnZQotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTkVTVElOR19JTkRFTlQpOyAKLQkJCX0KLQkJCVN0cmluZyBtZXNzYWdlID0gdC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSB0LnRvU3RyaW5nKCk7Ci0KLQkJCXNiLmFwcGVuZChtZXNzYWdlKTsKLQkJCWxpc3RUb1BvcHVsYXRlLmFkZChzYi50b1N0cmluZygpKTsKLQkJCWluY3JlbWVudE5lc3RpbmcgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGluY3JlbWVudE5lc3RpbmcpCi0JCQluZXN0aW5nKys7Ci0KLQkJLy8gTG9vayBmb3IgYSBuZXN0ZWQgY29yZSBleGNlcHRpb24KLQkJaWYgKGlzQ29yZUV4Y2VwdGlvbikgewotCQkJQ29yZUV4Y2VwdGlvbiBjZSA9IChDb3JlRXhjZXB0aW9uKSB0OwotCQkJSVN0YXR1cyBlU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCQkvLyBPbmx5IHByaW50IHRoZSBleGNlcHRpb24gbWVzc2FnZSBpZiBpdCBpcyBub3QgY29udGFpbmVkIGluIHRoZQotCQkJLy8gcGFyZW50IG1lc3NhZ2UKLQkJCWlmIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS5pbmRleE9mKGVTdGF0dXMuZ2V0TWVzc2FnZSgpKSA9PSAtMSkgewotCQkJCXBvcHVsYXRlTGlzdChsaXN0VG9Qb3B1bGF0ZSwgZVN0YXR1cywgbmVzdGluZywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBMb29rIGZvciBjaGlsZCBzdGF0dXMKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gYnVpbGRpbmdTdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcG9wdWxhdGVMaXN0KGxpc3RUb1BvcHVsYXRlLCBjaGlsZHJlbltpXSwgbmVzdGluZywgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHN0YXR1cyBvYmplY3Qgc2hvdWxkIGJlIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBhIHN0YXR1cyBvYmplY3QKLQkgKiBAcGFyYW0gbWFzawotCSAqICAgICAgICAgICAgYSBtYXNrIGFzIHBlciA8Y29kZT5JU3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RhdHVzIHNob3VsZCBiZSBkaXNwbGF5ZWQsIGFuZAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjbWF0Y2hlcyhpbnQpCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVN0YXR1cyBzdGF0dXMsIGludCBtYXNrKSB7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHN0YXR1cy5tYXRjaGVzKG1hc2spOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbltpXS5tYXRjaGVzKG1hc2spKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIKLQkgKiBwcmVzc2luZyB0aGUgZGV0YWlscyBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmIChsaXN0Q3JlYXRlZCkgewotCQkJbGlzdC5kaXNwb3NlKCk7Ci0JCQlsaXN0Q3JlYXRlZCA9IGZhbHNlOwotCQkJZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWxpc3QgPSBjcmVhdGVEcm9wRG93bkxpc3QoKENvbXBvc2l0ZSkgZ2V0Q29udGVudHMoKSk7Ci0JCQlkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotCQl9Ci0JCVBvaW50IG5ld1NpemUgPSBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWdldFNoZWxsKCkKLQkJCQkuc2V0U2l6ZSgKLQkJCQkJCW5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueQotCQkJCQkJCQkrIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBkZXRhaWxzIG9mIHRoZSBzdGF0dXMgb2YgdGhlIGVycm9yIG9udG8gdGhlIHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRpbmdTdGF0dXMKLQkgKiBAcGFyYW0gYnVmZmVyCi0JICogQHBhcmFtIG5lc3RpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb3B5QnVmZmVyKElTdGF0dXMgYnVpbGRpbmdTdGF0dXMsCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgbmVzdGluZykgewotCQlpZiAoIWJ1aWxkaW5nU3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoTkVTVElOR19JTkRFTlQpOyAKLQkJfQotCQlidWZmZXIuYXBwZW5kKGJ1aWxkaW5nU3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBMb29rIGZvciBhIG5lc3RlZCBjb3JlIGV4Y2VwdGlvbgotCQlUaHJvd2FibGUgdCA9IGJ1aWxkaW5nU3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCUNvcmVFeGNlcHRpb24gY2UgPSAoQ29yZUV4Y2VwdGlvbikgdDsKLQkJCXBvcHVsYXRlQ29weUJ1ZmZlcihjZS5nZXRTdGF0dXMoKSwgYnVmZmVyLCBuZXN0aW5nICsgMSk7Ci0JCX0KLQotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBidWlsZGluZ1N0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwb3B1bGF0ZUNvcHlCdWZmZXIoY2hpbGRyZW5baV0sIGJ1ZmZlciwgbmVzdGluZyArIDEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHN0YXR1c2VzIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHlUb0NsaXBib2FyZCgpIHsKLQkJaWYgKGNsaXBib2FyZCAhPSBudWxsKQotCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJU3RyaW5nQnVmZmVyIHN0YXR1c0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcG9wdWxhdGVDb3B5QnVmZmVyKHN0YXR1cywgc3RhdHVzQnVmZmVyLCAwKTsKLQkJY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChsaXN0LmdldERpc3BsYXkoKSk7Ci0JCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10geyBzdGF0dXNCdWZmZXIudG9TdHJpbmcoKSB9LAotCQkJCW5ldyBUcmFuc2ZlcltdIHsgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKGNsaXBib2FyZCAhPSBudWxsKQotCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogU2hvdyB0aGUgZGV0YWlscyBwb3J0aW9uIG9mIHRoZSBkaWFsb2cgaWYgaXQgaXMgbm90IGFscmVhZHkgdmlzaWJsZS4gVGhpcwotCSAqIG1ldGhvZCB3aWxsIG9ubHkgd29yayB3aGVuIGl0IGlzIGludm9rZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgb2YgdGhlIGRpYWxvZwotCSAqIGhhcyBiZWVuIHNldC4gSW4gb3RoZXIgd29yZHMsIGFmdGVyIHRoZSA8Y29kZT5jcmVhdGVDb250ZW50czwvY29kZT4KLQkgKiBtZXRob2QgaGFzIGJlZW4gaW52b2tlZCBhbmQgaGFzIHJldHVybmVkIHRoZSBjb250cm9sIGZvciB0aGUgY29udGVudCBhcmVhCi0JICogb2YgdGhlIGRpYWxvZy4gSW52b2tpbmcgdGhlIG1ldGhvZCBiZWZvcmUgdGhlIGNvbnRlbnQgYXJlYSBoYXMgYmVlbiBzZXQKLQkgKiBvciBhZnRlciB0aGUgZGlhbG9nIGhhcyBiZWVuIGRpc3Bvc2VkIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNob3dEZXRhaWxzQXJlYSgpIHsKLQkJaWYgKCFsaXN0Q3JlYXRlZCkgewotCQkJQ29udHJvbCBjb250cm9sID0gZ2V0Q29udGVudHMoKTsKLQkJCWlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKQotCQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgRGV0YWlscyBidXR0b24gc2hvdWxkIGJlIGluY2x1ZGVkLiBUaGlzIG1ldGhvZCBpcwotCSAqIGludm9rZWQgb25jZSB3aGVuIHRoZSBkaWFsb2cgaXMgYnVpbHQuIEJ5IGRlZmF1bHQsIHRoZSBEZXRhaWxzIGJ1dHRvbiBpcwotCSAqIG9ubHkgaW5jbHVkZWQgaWYgdGhlIHN0YXR1cyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGRpYWxvZyB3YXMgYQotCSAqIG11bHRpLXN0YXR1cyBvciBpZiB0aGUgc3RhdHVzIGNvbnRhaW5zIGFuIGV4Y2VwdGlvbi4gU3ViY2xhc3NlcyBtYXkKLQkgKiBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIERldGFpbHMgYnV0dG9uIHNob3VsZCBiZSBpbmNsdWRlZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTaG93RGV0YWlsc0J1dHRvbigpIHsKLQkJcmV0dXJuIHN0YXR1cy5pc011bHRpU3RhdHVzKCkgfHwgc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzdGF0dXMgZGlzcGxheWVkIGJ5IHRoaXMgZXJyb3IgZGlhbG9nIHRvIHRoZSBnaXZlbiBzdGF0dXMuIFRoaXMKLQkgKiBvbmx5IGFmZmVjdHMgdGhlIHN0YXR1cyBkaXNwbGF5ZWQgYnkgdGhlIERldGFpbHMgbGlzdC4gVGhlIG1lc3NhZ2UsIGltYWdlCi0JICogYW5kIHRpdGxlIHNob3VsZCBiZSB1cGRhdGVkIGJ5IHRoZSBzdWJjbGFzcywgaWYgZGVzaXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICB0aGUgc3RhdHVzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZGV0YWlscyBsaXN0Ci0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlpZiAodGhpcy5zdGF0dXMgIT0gc3RhdHVzKSB7Ci0JCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJfQotCQlzaG91bGRJbmNsdWRlVG9wTGV2ZWxFcnJvckluRGV0YWlscyA9IHRydWU7Ci0JCWlmIChsaXN0Q3JlYXRlZCkgewotCQkJcmVwb3B1bGF0ZUxpc3QoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9wdWxhdGUgdGhlIHN1cHBsaWVkIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBvcHVsYXRlTGlzdCgpIHsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCQlwb3B1bGF0ZUxpc3QobGlzdCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvTWVudVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9NZW51VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NThhNjYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9NZW51VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHJldHJpZXZpbmcgRWNsaXBzZSBtZW51cy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW51VXRpbCB7Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBhbiBhcnJheSBvZiBtZW51IGl0ZW1zIGFuZCByZXR1cm5zIHRoZSBtZW51IGl0ZW0gdGhhdCBtYXRjaGVzCi0JICogdGhlIGdpdmVuIG1lbnUgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudUl0ZW1zCi0JICogICAgICAgICAgICBBbiBhcnJheSBvZiBtZW51IGl0ZW1zLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCB0byBsb29rIGZvci4KLQkgKiBAcmV0dXJuIFRoZSBtZW51IGl0ZW0gaWYgZm91bmQsIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1lbnVJdGVtIGdldE1lbnVJdGVtKE1lbnVJdGVtW10gbWVudUl0ZW1zLCBTdHJpbmcgdGV4dCkgewotCQlpZiAobWVudUl0ZW1zID09IG51bGwgfHwgdGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbnVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1lbnVJdGVtc1tpXS5nZXRUZXh0KCkuc3RhcnRzV2l0aCh0ZXh0KSkgewotCQkJCXJldHVybiBtZW51SXRlbXNbaV07Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Nc2dCb3guamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Nc2dCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3OWViMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvTXNnQm94LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGRpc3BsYXkgYSBtZXNzYWdlIGJveC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTXNnQm94IHsKLQkvKioKLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gc2hvdyBlcnJvciBtZXNzYWdlIGlmIHlvdSBkb24ndCB3YW50IGxvbmcgcGF0aCB0byBiZQotCSAqIGN1dCBvZmYuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBuYXRpdmVTaG93RXJyb3IoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2cpIHsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlNZXNzYWdlQm94IG1zZ0JveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuT0sgfCBTV1QuSUNPTl9FUlJPUik7Ci0JCW1zZ0JveC5zZXRNZXNzYWdlKG1zZyk7Ci0JCW1zZ0JveC5zZXRUZXh0KHNoZWxsLmdldFRleHQoKSk7Ci0JCW1zZ0JveC5vcGVuKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNob3dFcnJvcihTdHJpbmcgbXNnKSB7Ci0JCXNob3dFcnJvcihnZXREZWZhdWx0U2hlbGwoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd0Vycm9yKFNoZWxsIHNoZWxsLCBTdHJpbmcgbXNnKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgc2hlbGwgPT0gbnVsbCA/IG51bGwgOiBzaGVsbAotCQkJCS5nZXRUZXh0KCksIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNob3dXYXJuaW5nKFN0cmluZyBtc2cpIHsKLQkJc2hvd1dhcm5pbmcoZ2V0RGVmYXVsdFNoZWxsKCksIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNob3dXYXJuaW5nKFNoZWxsIHNoZWxsLCBTdHJpbmcgbXNnKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHNoZWxsLCBzaGVsbCA9PSBudWxsID8gbnVsbCA6IHNoZWxsCi0JCQkJLmdldFRleHQoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNoZWxsIGdldERlZmF1bHRTaGVsbCgpIHsKLQkJdHJ5IHsKLQkJCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJaWYgKGQgPT0gbnVsbCkgewotCQkJCWQgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQotCQkJU2hlbGwgcyA9IG51bGw7Ci0JCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJcyA9IGQuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCX0KLQotCQkJcmV0dXJuIHM7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJdHJ5IHsKLQkJCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJaWYgKGQgPT0gbnVsbCkgewotCQkJCWQgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQotCQkJcmV0dXJuIGQ7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQoU3RyaW5nIG1zZykgewotCQlyZXR1cm4gcHJvbXB0KGdldERlZmF1bHRTaGVsbCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZykgewotCQlyZXR1cm4gcHJvbXB0KHNoZWxsLCBudWxsLCBtc2csIFNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQoU3RyaW5nIG1zZywgaW50IGJ1dHRvbnMpIHsKLQkJcmV0dXJuIHByb21wdChnZXREZWZhdWx0U2hlbGwoKSwgbnVsbCwgbXNnLCBidXR0b25zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBpbnQgYnV0dG9ucykgewotCQlyZXR1cm4gcHJvbXB0KGdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgbXNnLCBidXR0b25zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2csIGludCBidXR0b25zKSB7Ci0JCXJldHVybiBwcm9tcHQoc2hlbGwsIG51bGwsIG1zZywgYnV0dG9ucyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvbXB0KFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csCi0JCQlpbnQgYnV0dG9ucykgewotCQlNZXNzYWdlQm94IG1zZ0JveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBidXR0b25zIHwgU1dULklDT05fUVVFU1RJT04pOwotCQltc2dCb3guc2V0VGV4dCh0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCgpID4gMCA/IHRpdGxlIDogc2hlbGwKLQkJCQkuZ2V0VGV4dCgpKTsKLQkJbXNnQm94LnNldE1lc3NhZ2UobXNnKTsKLQkJcmV0dXJuIG1zZ0JveC5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvTXNnRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvTXNnRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmUwYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01zZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uSUFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBIG1lc3NhZ2UgZGlhbG9nIHVzZWQgZm9yIGRpc3BsYXlpbmcgZXJyb3IsIHdhcm5pbmcsIGNvbmZpcm1hdGlvbiBvcgotICogaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1zZ0RpYWxvZyB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQotCS8vIFRoZSBwbHVnLWluIGxvZ2dlci4KLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwbHVnLWluIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1zZ0RpYWxvZyhJQWN0aXZhdG9yIHBsdWdpbikgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luLmdldElkKCk7Ci0JCXRoaXMubG9nZ2VyID0gcGx1Z2luLmdldExvZ2dlcigpOwotCX0KLQkJCi0JcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBpbiBhbiBlcnJvciBkaWFsb2cgd2l0aG91dCB0aGUgZXJyb3IKLQkgKiByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlkaXNwbGF5KElTdGF0dXMuRVJST1IsIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBlcnJvcgotCSAqIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuIHRvCi0JICogdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuRVJST1IsIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBpbiBhbiBlcnJvciBkaWFsb2cgd2l0aG91dCB0aGUgRGV0YWlscwotCSAqIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSBlcnJvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgcmVhc29uLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBpbiBhbiBlcnJvciBkaWFsb2cgd2l0aG91dCB0aGUgRGV0YWlscwotCSAqIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBpbiBhbiBlcnJvciBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbgotCSAqIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IKLQkgKiBlbXB0eS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSBlcnJvci4KLQkgKiBAcGFyYW0gZGV0YWlscwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIGRldGFpbHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVN0cmluZyBkZXRhaWxzKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBpbiBhbiBlcnJvciBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbgotCSAqIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IKLQkgKiBlbXB0eS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgZGV0YWlscy4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuRVJST1IsIHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBzdGF0dXMgaW4gYW4gZXJyb3IgZGlhbG9nLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgZXJyb3Igc3RhdHVzLgotCSAqLwotCXB1YmxpYyBpbnQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGRpc3BsYXkodGl0bGUsIG51bGwsIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIHN0YXR1cyBpbiBhbiBlcnJvciBkaWFsb2cuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuIHRvCi0JICogdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIGludCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gZGlzcGxheSh0aXRsZSwgbXNnLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgaW4gYSB3YXJuaW5nIGRpYWxvZyB3aXRob3V0IHRoZQotCSAqIHdhcm5pbmcgcmVhc29uIGFuZCBEZXRhaWxzIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FuaW5nIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdhcm5pbmcgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCBudWxsLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXJuaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCBudWxsLCBudWxsLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YW5pbmcgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgd2FybmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIHJlYXNvbiwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgd2FybmluZy4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXJuaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgcmVhc29uLCBudWxsLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nLiBUaGUgRGV0YWlscwotCSAqIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4gcGFyYW1ldGVyIGl0IG5vdAotCSAqIG51bGwgb3IgZW1wdHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhbmluZyBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgd2FybmluZy4KLQkgKiBAcGFyYW0gZGV0YWlscwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscykgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cuIFRoZSBEZXRhaWxzCi0JICogYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPiBwYXJhbWV0ZXIgaXQgbm90Ci0JICogbnVsbCBvciBlbXB0eS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FybmluZyBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSB3YXJuaW5nLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBkZXRhaWxzLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhcm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgc3RhdHVzIGluIGFuIGVycm9yIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FybmluZyBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgZXJyb3Igc3RhdHVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJZGlzcGxheSh0aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBzdGF0dXMgaW4gYW4gZXJyb3IgZGlhbG9nLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cykgewotCQlkaXNwbGF5KHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZSBpbiBhbiBlcnJvciBvciB3YXJuaW5nCi0JICogZGlhbG9nLiBUaGUgRGV0YWlscyBidXR0b24gd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+Ci0JICogcGFyYW1ldGVyIGl0IG5vdCBudWxsIG9yIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5LCBlaXRoZXIgSVN0YXR1cy5FUlJPUiBvciBJU3RhdHVzLldBUk5JTkcuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgZGV0YWlscy4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzcGxheShpbnQgc2V2ZXJpdHksIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywKLQkJCVN0cmluZyByZWFzb24sIFN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpIHsKLQkJaWYgKG1zZyA9PSBudWxsICYmIGV4ICE9IG51bGwpIHsKLQkJCW1zZyA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJfQotCi0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SIHx8IHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykgewotCQkJbG9nZ2VyLmxvZ01zZyhzZXZlcml0eSwgbXNnLCBleCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkic2V2ZXJpdHkgYXJndW1lbnQgbXVzdCBiZSBJU3RhdHVzLkVSUk9SIG9yIElTdGF0dXMuV0FSTklORyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cKLQkJCQkuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQotCQlpZiAoZGV0YWlscyAhPSBudWxsICYmIGRldGFpbHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQlNdWx0aVN0YXR1cyBtU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLCBJU3RhdHVzLk9LLCByZWFzb24sCi0JCQkJCWV4KTsKLQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JZCwgSVN0YXR1cy5PSywgZGV0YWlscywKLQkJCQkJZXgpOwotCQkJbVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCW9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnLAotCQkJCQltU3RhdHVzKTsKLQkJfSBlbHNlIGlmIChyZWFzb24gIT0gbnVsbCAmJiByZWFzb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgcGx1Z2luSWQsIElTdGF0dXMuT0ssIHJlYXNvbiwKLQkJCQkJZXgpOwotCQkJb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2csCi0JCQkJCXN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZyk7Ci0JCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykgewotCQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLnNldERlZmF1bHRJbWFnZShvbGRJbWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlIGluIGFuIGVycm9yIG9yIHdhcm5pbmcKLQkgKiBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4KLQkgKiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBkaXNwbGF5KFN0cmluZyB0aXRsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGRpc3BsYXkodGl0bGUsIG51bGwsIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZSBpbiBhbiBlcnJvciBvciB3YXJuaW5nCi0JICogZGlhbG9nLiBUaGUgRGV0YWlscyBidXR0b24gd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+Ci0JICogcGFyYW1ldGVyIGl0IG5vdCBudWxsIG9yIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZGlzcGxheShTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhdHVzIGFyZ3VtZW50IGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJaWYgKHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IgfHwgc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlsb2dnZXIubG9nTXNnKHNldmVyaXR5LCBtc2csIHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cKLQkJCQkuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQotCQlpbnQgcmMgPSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsCi0JCQkJbXNnLCBzdGF0dXMpOwotCi0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLnNldERlZmF1bHRJbWFnZShvbGRJbWFnZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIG1lc3NhZ2UgaW4gYSBpbmZvcm1hdGlvbmFsIGRpYWxvZyB3aXRoIGFuICJPSyIgYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgaW5mb3JtYXRpb24gZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUluZm8oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uob2xkSW1hZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIG1lc3NhZ2UgaW4gYSBxdWVzdGlvbiBkaWFsb2cgd2l0aCBhICJZZXMiIGFuZCAiTm8iCi0JICogYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgaW5mb3JtYXRpb24gZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzcGxheVByb21wdChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBXcmFwcGVkTWVzc2FnZURpYWxvZy5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQlib29sZWFuIHJlc3VsdCA9IFdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihzaGVsbCwgdGl0bGUsIG1zZyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIG1lc3NhZ2UgaW4gYSBjb25maXJtYXRpb24gZGlhbG9nIHdpdGggYSAiWWVzIiBhbmQKLQkgKiAiQ2FuY2VsIiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5Q29uZmlybWF0aW9uKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IFdyYXBwZWRNZXNzYWdlRGlhbG9nLmdldERlZmF1bHRJbWFnZSgpOwotCQlJbWFnZSBzaGVsbEltYWdlID0gZ2V0U2hlbGxJbWFnZSgpOwotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uoc2hlbGxJbWFnZSk7Ci0JCX0KLQotCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIHRpdGxlLCBtc2cpOwotCi0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLnNldERlZmF1bHRJbWFnZShvbGRJbWFnZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZGlzcGxheUNvbmZpcm1hdGlvbihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhdHVzIGFyZ3VtZW50IGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJbWFnZSBzaGVsbEltYWdlID0gZ2V0U2hlbGxJbWFnZSgpOwotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZ05vUmVhc29uLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQotCQlpbnQgcmMgPSBFcnJvckRpYWxvZ05vUmVhc29uLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZywgc3RhdHVzKTsKLQotCQlyZXR1cm4gcmM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGN1cnJlbnQgc2hlbGwuCi0JICogCi0JICogQHJldHVybiBUaGUgY3VycmVudCBzaGVsbCBpbWFnZS4KLQkgKi8KLQlwcml2YXRlIEltYWdlIGdldFNoZWxsSW1hZ2UoKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaAotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCQlTaGVsbCBzaGVsbCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpOwotCQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBzaGVsbC5nZXRJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvUGVyc3BlY3RpdmVVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvUGVyc3BlY3RpdmVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTczNmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL1BlcnNwZWN0aXZlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWNjZXNzaW5nIHBlcnNwZWN0aXZlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVV0aWwgewotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgUGVyc3BlY3RpdmVVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIG9mIHRoZSBhY3RpdmUgcGVyc3BlY3RpdmUuCi0JICogCi0JICogQHJldHVybiBUaGUgYWN0aXZlIHBlcnNwZWN0aXZlIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBhY3RpdmVQZXJzcGVjdGl2ZSA9IGFjdGl2ZVBhZ2UKLQkJCQkJLmdldFBlcnNwZWN0aXZlKCk7Ci0JCQlyZXR1cm4gYWN0aXZlUGVyc3BlY3RpdmUuZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIHBlcnNwZWN0aXZlLgotCSAqIAotCSAqIEBwYXJhbSBwZXJzcGVjdGl2ZUlkCi0JICogICAgICAgICAgICBUaGUgcGVyc3BlY3RpdmUgSUQuCi0JICogQHJldHVybiBUaGUgcHJldmlvdXNseSBhY3RpdmUgcGVyc3BlY3RpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9wZW5QZXJzcGVjdGl2ZShTdHJpbmcgcGVyc3BlY3RpdmVJZCkgewotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCUlQZXJzcGVjdGl2ZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpOwotCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBvbGRQZXJzcGVjdGl2ZSA9IGFjdGl2ZVBhZ2UuZ2V0UGVyc3BlY3RpdmUoKTsKLQkJCWlmICghb2xkUGVyc3BlY3RpdmUuZ2V0SWQoKS5lcXVhbHMocGVyc3BlY3RpdmVJZCkpIHsKLQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlID0gcmVnaXN0cnkKLQkJCQkJCS5maW5kUGVyc3BlY3RpdmVXaXRoSWQocGVyc3BlY3RpdmVJZCk7Ci0JCQkJYWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gb2xkUGVyc3BlY3RpdmU7Ci0JCX0gZWxzZSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJdHJ5IHsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnNob3dQZXJzcGVjdGl2ZSgKLQkJCQkJCXBlcnNwZWN0aXZlSWQsIGFjdGl2ZVdpbmRvdyk7Ci0JCQl9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcGVyc3BlY3RpdmUgaXMgYWxyZWFkeSBhY3RpdmUuCi0JICogCi0JICogQHBhcmFtIHBlcnNwZWN0aXZlSWQKLQkgKiAgICAgICAgICAgIFRoZSBwZXJzcGVjdGl2ZSBJRC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZlUGVyc3BlY3RpdmUoU3RyaW5nIHBlcnNwZWN0aXZlSWQpIHsKLQkJU3RyaW5nIGFjdGl2ZVBlcnNwZWN0aXZlSWQgPSBQZXJzcGVjdGl2ZVV0aWwuZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpOwotCQlpZiAocGVyc3BlY3RpdmVJZCA9PSBudWxsIHx8IGFjdGl2ZVBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBhY3RpdmVQZXJzcGVjdGl2ZUlkLmVxdWFsc0lnbm9yZUNhc2UocGVyc3BlY3RpdmVJZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmlldyBwYXJ0IHdpdGggdGhlIGdpdmVuIHZpZXcgSUQuCi0JICogCi0JICogQHBhcmFtIHZpZXdJZAotCSAqICAgICAgICAgICAgVGhlIHZpZXcgSUQuCi0JICogQHJldHVybiBUaGUgdmlldyBwYXJ0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpZXdQYXJ0IGdldFZpZXcoU3RyaW5nIHZpZXdJZCkgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UuZmluZFZpZXcodmlld0lkKTsKLQkJCQlpZiAodmlldyA9PSBudWxsKSB7Ci0JCQkJCXZpZXcgPSBhY3RpdmVQYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0JCQkJfQotCQkJCXJldHVybiB2aWV3OwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL1ByZWZlcmVuY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvUHJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4MGJjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvUHJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFjY2Vzc2luZyBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlVXRpbCB7Ci0KLQkvLyBUaGUgbXVsdGktc3RyaW5nIHByZWZlcmVuY2UgZGVsaW1pdGVyLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0RFTElNSVRFUiA9ICI7IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2V0cyBhIGxpc3QgY29udGFpbmluZyBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHByZWZTdG9yZQotCSAqICAgICAgICAgICAgYSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIG5hbWUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0TGlzdChJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSwgU3RyaW5nIG5hbWUpIHsKLQkJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAocHJlZlN0b3JlICE9IG51bGwgJiYgbmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0U3RyaW5nKG5hbWUpOwotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsCi0JCQkJCVBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJCWludCB0b2tlbkNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuQ291bnQ7IGkrKykgewotCQkJCXZhbHVlcy5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHN0cmluZyBwcmVmZXJlbmNlIHZhbHVlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3RyaW5nVmFsdWVzKElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRMaXN0KHByZWZTdG9yZSwgbmFtZSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkodmFsdWVzKTsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhIGxpc3QgY29udGFpbmluZyBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHByZWZTdG9yZQotCSAqICAgICAgICAgICAgYSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMaXN0KElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlLCBTdHJpbmcgbmFtZSwKLQkJCUxpc3QgdmFsdWVzKSB7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgdmFsdWVzICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZChQUkVGRVJFTkNFX0RFTElNSVRFUik7Ci0JCQl9Ci0JCQlwcmVmU3RvcmUuc2V0VmFsdWUobmFtZSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHN0cmluZyB2YWx1ZSB0byBhIGxpc3QgY29udGFpbmluZyBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhCi0JICogbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYSBzdHJpbmcgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogICAgICAgICAgICBhIGRlZmF1bHQgc3RyaW5nIHZhbHVlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgICAgbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0xpc3QoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRMaXN0KHByZWZTdG9yZSwgbmFtZSk7Ci0JCQlsaXN0LnJlbW92ZSh2YWx1ZSk7Ci0JCQlsaXN0LmFkZCgwLCB2YWx1ZSk7Ci0JCQlpbnQgcHJlZmVyZW5jZUhpc3RvcnlTaXplID0gQ29tbW9uUHJlZmVyZW5jZXMKLQkJCQkJLmdldFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpOwotCQkJaWYgKGxpc3Quc2l6ZSgpID4gcHJlZmVyZW5jZUhpc3RvcnlTaXplKSB7Ci0JCQkJbGlzdCA9IGxpc3Quc3ViTGlzdCgwLCAxMCk7Ci0JCQl9Ci0JCQlpZiAobGlzdC5zaXplKCkgPT0gcHJlZmVyZW5jZUhpc3RvcnlTaXplICYmIGRlZmF1bHRWYWx1ZSAhPSBudWxsCi0JCQkJCSYmIGRlZmF1bHRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlsaXN0LnNldCg5LCBkZWZhdWx0VmFsdWUpOwotCQkJfQotCQkJc2V0TGlzdChwcmVmU3RvcmUsIG5hbWUsIGxpc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHN0cmluZyB2YWx1ZSB0byBhIGxpc3QgY29udGFpbmluZyBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhCi0JICogbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYSBzdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9MaXN0KElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyB2YWx1ZSkgewotCQlhZGRUb0xpc3QocHJlZlN0b3JlLCBuYW1lLCB2YWx1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdHJpbmdWYWx1ZXMoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nW10gdmFsdWVzKSB7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgdmFsdWVzICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWVzW2ldKTsKLQkJCQlidWZmZXIuYXBwZW5kKFBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJCX0KLQkJCXByZWZTdG9yZS5zZXRWYWx1ZShuYW1lLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9XcmFwcGVkTWVzc2FnZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL1dyYXBwZWRNZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNWNmMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL1dyYXBwZWRNZXNzYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIG1lc3NhZ2UgZGlhbG9nIHRoYXQgZGlzcGxheXMgd3JhcHBlZCB0ZXh0LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdyYXBwZWRNZXNzYWdlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0KLQlwdWJsaWMgV3JhcHBlZE1lc3NhZ2VEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCUltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLAotCQkJU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwKLQkJCQlkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJQ29udHJvbCByQ29tcG9zaXRlID0gc3VwZXIuY3JlYXRlTWVzc2FnZUFyZWEoY29tcG9zaXRlKTsKLQotCQlpbnQgbWluV2lkdGggPSBJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIOy8vICsgMzAwOwotCQkvLyBUTy1ETzogbmVlZCB0byByZXZpc3QgdGhlICMgb2YgZGlhbG9nIGRpc3BsYXkgdW5pdHMgYW5kIG1hcmdpbgotCQkvLyB3aGVuIGluIG90aGVyIGxhbmd1YWdlcwotCQlpbnQgY2hhcnNQZXJMaW5lID0gbWluV2lkdGggLyA0IC0gMTU7Ci0JCUdyaWREYXRhIGdkID0gKEdyaWREYXRhKSBtZXNzYWdlTGFiZWwuZ2V0TGF5b3V0RGF0YSgpOwotCQlnZC5taW5pbXVtV2lkdGggPSBtaW5XaWR0aDsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQoYWRkTGluZUJyZWFrcyhtZXNzYWdlLCBjaGFyc1BlckxpbmUpKTsKLQotCQlyZXR1cm4gckNvbXBvc2l0ZTsKLQl9Ci0KLQlTdHJpbmcgYWRkTGluZUJyZWFrcyhTdHJpbmcgbXNnLCBpbnQgbWF4Q2hhcnMpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IG9yaWdpbmFsIG1lc3NhZ2UgPSAiICsgbXNnKTsKLQotCQlpZiAobXNnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1zZy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKG1zZy5jaGFyQXQoaSkpOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UobXNnLmNoYXJBdChpKSkpCi0JCQkJY291bnQgPSAwOwotCQkJZWxzZQotCQkJCWNvdW50Kys7Ci0KLQkJCWlmIChjb3VudCA+PSBtYXhDaGFycykgewotCQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtc2cuY2hhckF0KGkpKSkgewotCQkJCQlzdHJCdWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNvdW50ID0gMDsKLQkJCX0KLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBicm9rZW4gbWVzc2FnZSA9ICIgKwotCQkvLyBzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkNvbmZpcm0oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsgLy8gT0sgaXMgdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgV3JhcHBlZE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwKLQkJCQludWxsLCAvLyBhY2NlcHQKLQkJCQkvLyB0aGUKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJLy8gd2luZG93Ci0JCQkJLy8gaWNvbgotCQkJCW1lc3NhZ2UsIEVSUk9SLCBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDApOyAvLyBvawotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmZvcm1hdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgSU5GT1JNQVRJT04sCi0JCQkJbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKTsKLQkJLy8gb2sgaXMgdGhlIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuUXVlc3Rpb24oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgV3JhcHBlZE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwKLQkJCQludWxsLCAvLyBhY2NlcHQKLQkJCQkvLyB0aGUKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJLy8gd2luZG93Ci0JCQkJLy8gaWNvbgotCQkJCW1lc3NhZ2UsIFFVRVNUSU9OLCBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwgfSwgMCk7IC8vIHllcyBpcyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuV2FybmluZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IFdyYXBwZWRNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0JCQkJbnVsbCwgLy8gYWNjZXB0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZGVmYXVsdAotCQkJCS8vIHdpbmRvdwotCQkJCS8vIGljb24KLQkJCQltZXNzYWdlLCBXQVJOSU5HLCBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDApOyAvLyBvawotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOWE0MzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjNjOWQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Ci1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5zd3QKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUVjbGlwc2UtUGxhdGZvcm1GaWx0ZXI6ICgmIChvc2dpLndzPXdpbjMyKSAob3NnaS5vcz13aW4zMikgKG9zZ2kuYXJjaD14ODYpKQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExYTAwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwN2Y2NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFdpbjMyIENvbW1vbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9XaW4zMkhUTUxUcmFuc2Zlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vd2luMzIvV2luMzJIVE1MVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1MzhiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9XaW4zMkhUTUxUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkJ5dGVBcnJheVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuRk9STUFURVRDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuSURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5TVEdNRURJVU07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi0vKioKLSAqIFRoZSBjbGFzcyA8Y29kZT5IVE1MVHJhbnNmZXI8L2NvZGU+IHByb3ZpZGVzIGEgcGxhdGZvcm0gc3BlY2lmaWMgbWVjaGFuaXNtCi0gKiBmb3IgY29udmVydGluZyB0ZXh0IGluIEhUTUwgZm9ybWF0IHJlcHJlc2VudGVkIGFzIGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gKiB0byBhIHBsYXRmb3JtIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIGFuZCB2aWNlIHZlcnNhLiBTZWUKLSAqIDxjb2RlPlRyYW5zZmVyPC9jb2RlPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KLSAqIAotICogPHA+Ci0gKiBBbiBleGFtcGxlIG9mIGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgSFRNTCB0ZXh0IGlzIHNob3duCi0gKiBiZWxvdzoKLSAqIDwvcD4KLSAqIAotICogPGNvZGU+PHByZT4KLSAqICAgICAgIFN0cmluZyBodG1sRGF0YSA9ICZxdW90OwotICogPHA+Ci0gKiAgVGhpcyBpcyBhIHBhcmFncmFwaCBvZiB0ZXh0LgotICogPC9wPgotICogICZxdW90OzsKLSAqIDwvY29kZT48L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFdpbjMySFRNTFRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi0Jc3RhdGljIFdpbjMySFRNTFRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBXaW4zMkhUTUxUcmFuc2ZlcigpOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0ZPUk1BVCA9ICJIVE1MIEZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBpbnQgSFRNTF9GT1JNQVRJRCA9IHJlZ2lzdGVyVHlwZShIVE1MX0ZPUk1BVCk7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUiA9ICIwMDAwMDAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSID0gIlZlcnNpb246MC45XHJcblN0YXJ0SFRNTDoiICsgTlVNQkVSIC8vJE5PTi1OTFMtMSQKLQkJCSsgIlxyXG5FbmRIVE1MOiIgKyBOVU1CRVIgKyAiXHJcblN0YXJ0RnJhZ21lbnQ6IiArIE5VTUJFUiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSsgIlxyXG5FbmRGcmFnbWVudDoiICsgTlVNQkVSICsgIlxyXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIjxodG1sPjxib2R5PjwhLS1TdGFydEZyYWdtZW50LS0+IjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTVUZGSVggPSAiPCEtLUVuZEZyYWdtZW50LS0+PC9ib2R5PjwvaHRtbD4iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFN0YXJ0RnJhZ21lbnQgPSAiU3RhcnRGcmFnbWVudDoiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVuZEZyYWdtZW50ID0gIkVuZEZyYWdtZW50OiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBXaW4zMkhUTUxUcmFuc2ZlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEhUTUxUcmFuc2ZlciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEhUTUxUcmFuc2ZlciBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2luMzJIVE1MVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5qYXZhVG9OYXRpdmU8L2NvZGU+IGNvbnZlcnRzCi0JICogSFRNTC1mb3JtYXR0ZWQgdGV4dCByZXByZXNlbnRlZCBieSBhIGphdmEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhCi0JICogcGxhdGZvcm0gc3BlY2lmaWMgcmVwcmVzZW50YXRpb24uIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHNlZQotCSAqIDxjb2RlPlRyYW5zZmVyI2phdmFUb05hdGl2ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBIVE1MIHRleHQKLQkgKiBAcGFyYW0gdHJhbnNmZXJEYXRhCi0JICogICAgICAgICAgICBhbiBlbXB0eSA8Y29kZT5UcmFuc2ZlckRhdGE8L2NvZGU+IG9iamVjdDsgdGhpcyBvYmplY3Qgd2lsbAotCSAqICAgICAgICAgICAgYmUgZmlsbGVkIGluIG9uIHJldHVybiB3aXRoIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBmb3JtYXQgb2YKLQkgKiAgICAgICAgICAgIHRoZSBkYXRhCi0JICovCi0JcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFjaGVja0hUTUwob2JqZWN0KSB8fCAhaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQkJfQotCQlTdHJpbmcgc3RyaW5nID0gKFN0cmluZykgb2JqZWN0OwotCQlpbnQgY291bnQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2NvdW50ICsgMV07Ci0JCXN0cmluZy5nZXRDaGFycygwLCBjb3VudCwgY2hhcnMsIDApOwotCQlpbnQgY29kZVBhZ2UgPSBPUy5HZXRBQ1AoKTsKLQkJaW50IGNjaE11bHRpQnl0ZSA9IE9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbnVsbCwKLQkJCQkwLCBudWxsLCBudWxsKTsKLQkJaWYgKGNjaE11bHRpQnl0ZSA9PSAwKSB7Ci0JCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtID0gbmV3IFNUR01FRElVTSgpOwotCQkJdHJhbnNmZXJEYXRhLnJlc3VsdCA9IENPTS5EVl9FX1NUR01FRElVTTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgc3RhcnRIVE1MID0gSEVBREVSLmxlbmd0aCgpOwotCQlpbnQgc3RhcnRGcmFnbWVudCA9IHN0YXJ0SFRNTCArIFBSRUZJWC5sZW5ndGgoKTsKLQkJaW50IGVuZEZyYWdtZW50ID0gc3RhcnRGcmFnbWVudCArIGNjaE11bHRpQnl0ZSAtIDE7Ci0JCWludCBlbmRIVE1MID0gZW5kRnJhZ21lbnQgKyBTVUZGSVgubGVuZ3RoKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoSEVBREVSKTsKLQkJaW50IG1heExlbmd0aCA9IE5VTUJFUi5sZW5ndGgoKTsKLQkJLy8gc3RhcnRIVE1MCi0JCWludCBzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSKTsKLQkJU3RyaW5nIHRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0SFRNTCk7Ci0JCWJ1ZmZlci5yZXBsYWNlKHN0YXJ0ICsgbWF4TGVuZ3RoIC0gdGVtcC5sZW5ndGgoKSwgc3RhcnQgKyBtYXhMZW5ndGgsCi0JCQkJdGVtcCk7Ci0JCS8vIGVuZEhUTUwKLQkJc3RhcnQgPSBidWZmZXIudG9TdHJpbmcoKS5pbmRleE9mKE5VTUJFUiwgc3RhcnQpOwotCQl0ZW1wID0gSW50ZWdlci50b1N0cmluZyhlbmRIVE1MKTsKLQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBtYXhMZW5ndGggLSB0ZW1wLmxlbmd0aCgpLCBzdGFydCArIG1heExlbmd0aCwKLQkJCQl0ZW1wKTsKLQkJLy8gc3RhcnRGcmFnbWVudAotCQlzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSLCBzdGFydCk7Ci0JCXRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0RnJhZ21lbnQpOwotCQlidWZmZXIucmVwbGFjZShzdGFydCArIG1heExlbmd0aCAtIHRlbXAubGVuZ3RoKCksIHN0YXJ0ICsgbWF4TGVuZ3RoLAotCQkJCXRlbXApOwotCQkvLyBlbmRGcmFnbWVudAotCQlzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSLCBzdGFydCk7Ci0JCXRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKGVuZEZyYWdtZW50KTsKLQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBtYXhMZW5ndGggLSB0ZW1wLmxlbmd0aCgpLCBzdGFydCArIG1heExlbmd0aCwKLQkJCQl0ZW1wKTsKLQotCQlidWZmZXIuYXBwZW5kKFBSRUZJWCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyaW5nKTsKLQkJYnVmZmVyLmFwcGVuZChTVUZGSVgpOwotCi0JCWNvdW50ID0gYnVmZmVyLmxlbmd0aCgpOwotCQljaGFycyA9IG5ldyBjaGFyW2NvdW50ICsgMV07Ci0JCWJ1ZmZlci5nZXRDaGFycygwLCBjb3VudCwgY2hhcnMsIDApOwotCQljY2hNdWx0aUJ5dGUgPSBPUy5XaWRlQ2hhclRvTXVsdGlCeXRlKGNvZGVQYWdlLCAwLCBjaGFycywgLTEsIG51bGwsIDAsCi0JCQkJbnVsbCwgbnVsbCk7Ci0JCWludCBscE11bHRpQnl0ZVN0ciA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULAotCQkJCWNjaE11bHRpQnl0ZSk7Ci0JCU9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbHBNdWx0aUJ5dGVTdHIsCi0JCQkJY2NoTXVsdGlCeXRlLCBudWxsLCBudWxsKTsKLQkJdHJhbnNmZXJEYXRhLnN0Z21lZGl1bSA9IG5ldyBTVEdNRURJVU0oKTsKLQkJdHJhbnNmZXJEYXRhLnN0Z21lZGl1bS50eW1lZCA9IENPTS5UWU1FRF9IR0xPQkFMOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtLnVuaW9uRmllbGQgPSBscE11bHRpQnl0ZVN0cjsKLQkJdHJhbnNmZXJEYXRhLnN0Z21lZGl1bS5wVW5rRm9yUmVsZWFzZSA9IDA7Ci0JCXRyYW5zZmVyRGF0YS5yZXN1bHQgPSBDT00uU19PSzsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+bmF0aXZlVG9KYXZhPC9jb2RlPiBjb252ZXJ0cyBhIHBsYXRmb3JtCi0JICogc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgSFRNTCB0ZXh0IHRvIGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHNlZSA8Y29kZT5UcmFuc2ZlciNuYXRpdmVUb0phdmE8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2ZlckRhdGEKLQkgKiAgICAgICAgICAgIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSB0byBiZSBiZWVuCi0JICogICAgICAgICAgICBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgSFRNTCB0ZXh0IGlmIHRoZQotCSAqICAgICAgICAgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlIG51bGwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmICghaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkgfHwgdHJhbnNmZXJEYXRhLnBJRGF0YU9iamVjdCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlEYXRhT2JqZWN0IGRhdGEgPSBuZXcgSURhdGFPYmplY3QodHJhbnNmZXJEYXRhLnBJRGF0YU9iamVjdCk7Ci0JCWRhdGEuQWRkUmVmKCk7Ci0JCVNUR01FRElVTSBzdGdtZWRpdW0gPSBuZXcgU1RHTUVESVVNKCk7Ci0JCUZPUk1BVEVUQyBmb3JtYXRldGMgPSB0cmFuc2ZlckRhdGEuZm9ybWF0ZXRjOwotCQlzdGdtZWRpdW0udHltZWQgPSBDT00uVFlNRURfSEdMT0JBTDsKLQkJdHJhbnNmZXJEYXRhLnJlc3VsdCA9IGRhdGEuR2V0RGF0YShmb3JtYXRldGMsIHN0Z21lZGl1bSk7Ci0JCWRhdGEuUmVsZWFzZSgpOwotCQlpZiAodHJhbnNmZXJEYXRhLnJlc3VsdCAhPSBDT00uU19PSykKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaE1lbSA9IHN0Z21lZGl1bS51bmlvbkZpZWxkOwotCi0JCXRyeSB7Ci0JCQlpbnQgbHBNdWx0aUJ5dGVTdHIgPSBPUy5HbG9iYWxMb2NrKGhNZW0pOwotCQkJaWYgKGxwTXVsdGlCeXRlU3RyID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl0cnkgewotCQkJCWludCBjb2RlUGFnZSA9IE9TLkdldEFDUCgpOwotCQkJCWludCBjY2hXaWRlQ2hhciA9IE9TLk11bHRpQnl0ZVRvV2lkZUNoYXIoY29kZVBhZ2UsCi0JCQkJCQlPUy5NQl9QUkVDT01QT1NFRCwgbHBNdWx0aUJ5dGVTdHIsIC0xLCBudWxsLCAwKTsKLQkJCQlpZiAoY2NoV2lkZUNoYXIgPT0gMCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJY2hhcltdIGxwV2lkZUNoYXJTdHIgPSBuZXcgY2hhcltjY2hXaWRlQ2hhciAtIDFdOwotCQkJCU9TCi0JCQkJCQkuTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlUGFnZSwgT1MuTUJfUFJFQ09NUE9TRUQsCi0JCQkJCQkJCWxwTXVsdGlCeXRlU3RyLCAtMSwgbHBXaWRlQ2hhclN0ciwKLQkJCQkJCQkJbHBXaWRlQ2hhclN0ci5sZW5ndGgpOwotCQkJCXJldHVybiBuZXcgU3RyaW5nKGxwV2lkZUNoYXJTdHIpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlPUy5HbG9iYWxVbmxvY2soaE1lbSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlPUy5HbG9iYWxGcmVlKGhNZW0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyBIVE1MX0ZPUk1BVElEIH07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IEhUTUxfRk9STUFUIH07Ci0JfQotCi0JYm9vbGVhbiBjaGVja0hUTUwoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZykgb2JqZWN0KQotCQkJCS5sZW5ndGgoKSA+IDApOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoZWNrSFRNTChvYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1NGU3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aW5kb3dzLXNwZWNpZmljIGNsaXBib2FyZCB0cmFuc2ZlciBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jZHRwcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY2R0cHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkY2UwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jZHRwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4KLQotPGNkdHByb2plY3Q+Ci08ZGF0YS8+Ci08L2NkdHByb2plY3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjc3OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmMTVmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBDb21tb24gcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ZGQ1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmNvbW1vbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmYTcwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb247c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBjb21tb24uamFyLCBsaWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IGNvbS5pYm0uaWN1O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuYXBhY2hlLmFudDt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscywKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0MWJmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+Ci08dGl0bGU+UGx1Zy1pbiBMaWNlbnNlIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDM+UGx1Zy1pbiBMaWNlbnNlIEFncmVlbWVudDwvaDM+Ci0KLTxwPlVzZSBvZiB0aGlzIFBsdWctaW4gaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIFBsdWctaW4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDgyNzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLmNvbW1vbi5qYXIgPSBzcmMvCi1vdXRwdXQuY29tbW9uLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGNvbW1vbi5qYXIsXAotICAgICAgICAgICAgICAgbGliLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2xpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9saWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2ZDRhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2xpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMGZlOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgQ29tbW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzMWUzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiIG5hbWU9Ik1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyIiBzY2hlbWE9InNjaGVtYS9tYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJvYmplY3RGYWN0b3J5IiBuYW1lPSJPYmplY3RGYWN0b3J5IiBzY2hlbWE9InNjaGVtYS9vYmplY3RGYWN0b3J5LmV4c2QiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9tYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zY2hlbWEvbWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjYThmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9tYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iIGlkPSJtYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciIgbmFtZT0iTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQWxsb3cgYWRkaW5nIGFkZHRpb25hbCBhdHRyaWJ1dGVzIHRvIG1hcmtlcnMgZ2VuZXJhdGVkIGZyb20gRVBGCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zY2hlbWEvb2JqZWN0RmFjdG9yeS5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zY2hlbWEvb2JqZWN0RmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMzZDViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL29iamVjdEZhY3RvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIiBpZD0ib2JqZWN0RmFjdG9yeSIgbmFtZT0iT2JqZWN0RmFjdG9yeSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBBbGxvdyB0byBjcmVhdGUgb2JqZWN0IHRocm91Z2ggdGhlIGV4dGVuc2lvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RGYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im9iamVjdEZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS41Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBwYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSU9iamVjdEZhY3RvcnkKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vQWJzdHJhY3RBY3RpdmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vQWJzdHJhY3RBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiMTczYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0Fic3RyYWN0QWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ydW50aW1lLkludGVybmFsUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkkxOG5VdGlsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBFUEYgcGx1Zy1pbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiBpbXBsZW1lbnRzIElBY3RpdmF0b3IgewotCi0JLy8gVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGljb25zLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1BBVEggPSAiaWNvbnMvIjsgLy8kTk9OLU5MUy0xJDsKLQotCS8vIFRoZSBsb2dnZXIgaGFzaCBtYXAuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTG9nZ2VyPiBsb2dnZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb2dnZXI+KCk7Ci0KLQkvLyBUaGUgbWVzc2FnZSBkaWFsb2cgaGFzaCBtYXAuCi0JLy9wcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBNc2dEaWFsb2c+IG1zZ0RpYWxvZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1zZ0RpYWxvZz4oKTsKLQotCS8vIFRoZSBzaGFyZWQgaW1hZ2UgaGFzaCBtYXAuCi0JLy9wcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbWFnZT4gc2hhcmVkSW1hZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4oKTsKLQotCS8vIFRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Zy1pbi4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLy8gVGhpcyBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFsbCBVUkwuCi0JcHJpdmF0ZSBVUkwgaW5zdGFsbFVSTDsKLQotCS8vIFRoZSBwbHVnLWluIGluc3RhbGwgcGF0aC4KLQlwcml2YXRlIFN0cmluZyBpbnN0YWxsUGF0aDsKLQotCS8vIFRoZSBwbHVnLWluIGljb24gVVJMLgotCXByb3RlY3RlZCBVUkwgaWNvblVSTDsKLQotCS8vIFRoZSBwcm9maWxpbmcgZmxhZy4KLQlwcml2YXRlIGJvb2xlYW4gcHJvZmlsaW5nOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RBY3RpdmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCi0JCWluaXQoY29udGV4dCk7Ci0KLQkJLy8gc2V0IHRoZSAKLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIlN0YXJ0ZWQgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBGcmVlIHRoZSBzaGFyZWQgaW1hZ2VzLgotLy8JCWZvciAoSXRlcmF0b3IgaW1hZ2VzID0gc2hhcmVkSW1hZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGltYWdlcwotLy8JCQkJLmhhc05leHQoKTspIHsKLS8vCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGltYWdlcy5uZXh0KCk7Ci0vLwkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLS8vCQkJCWltYWdlLmRpc3Bvc2UoKTsKLS8vCQkJfQotLy8JCX0KLQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJTdG9wcGVkICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgVGhlIGJ1bmRsZSBjb250ZXh0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gR2V0IHRoZSBidW5kbGUgZm9yIHRoaXMgcGx1Zy1pbi4KLQkJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCi0JCS8vIEdldCB0aGUgcmVzb3VjZSBidW5kbGUgZm9yIHRoaXMgcGx1Zy1pbi4KLQkJcmVzb3VyY2VCdW5kbGUgPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShidW5kbGUpOwotCi0JCS8vIEdldCB0aGUgSUQgZm9yIHRoaXMgcGx1Zy1pbi4KLQkJcGx1Z2luSWQgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIkluaXRpYWxpemluZyAiICsgcGx1Z2luSWQpOyAvLyROT04tTkxTLTEkCQkKLQkJfQotCi0JCS8vIEdldCB0aGUgaW5zdGFsbCBwYXRoIG9mIHRoaXMgcGx1Zy1pbi4KLQkJaW5zdGFsbFVSTCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWluc3RhbGxQYXRoID0gRmlsZUxvY2F0b3IucmVzb2x2ZShpbnN0YWxsVVJMKS5nZXRQYXRoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWluc3RhbGxQYXRoID0gUGxhdGZvcm0uZ2V0SW5zdGFsbExvY2F0aW9uKCkuZ2V0VVJMKCkuZ2V0UGF0aCgpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWljb25VUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIElDT05fUEFUSCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCVN0cmluZyBzeW1ib2xpY05hbWUgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCWlmIChzeW1ib2xpY05hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGtleSA9IHN5bWJvbGljTmFtZSArICIvcHJvZmlsaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZhbHVlID0gSW50ZXJuYWxQbGF0Zm9ybS5nZXREZWZhdWx0KCkuZ2V0T3B0aW9uKGtleSk7Ci0JCQlwcm9maWxpbmcgPSB2YWx1ZSA9PSBudWxsID8gZmFsc2UgOiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKAotCQkJCQkiSW5pdGlhbGl6ZWQgIiArIHBsdWdpbklkICsgIiwgaW5zdGFsbFBhdGg9IiArIGluc3RhbGxQYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHJldHVybiBUaGUgSUQgb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIFRoZQotCSAqICAgICAgICAgICAgaW5zdGFsbCBVUkwgb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0SW5zdGFsbFVSTCgpIHsKLQkJcmV0dXJuIGluc3RhbGxVUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBwYXRoIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gVGhlCi0JICogICAgICAgICAgICBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFsbFBhdGgoKSB7Ci0JCXJldHVybiBpbnN0YWxsUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhbmQgcmV0dXJucyB0aGUgbG9jYWxpemVkIHByb3BlcnRpZXMgb2YgYSBKYXZhIHByb3BlcnRpZXMgZmlsZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnRpZXMgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIHJvb3QuCi0JICogQHJldHVybiBBIDxjb2RlPlByb3BlcnRpZXM8L2NvZGU+IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3BzOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVQYXRoID0gZ2V0TG9jYWxpemVkRmlsZShwYXRoLCB0cnVlKTsKLQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCXByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbG9jYWxlIHNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlIGluIHRoZQotCSAqIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnRpZXMgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIHJvb3QuCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGxvY2FsZSBzcGVjaWZpYyBhYnNvbHV0ZSBmaWxlIHBhdGggbmFtZSBvZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIGZpbGUuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkRmlsZShTdHJpbmcgcGF0aCwgYm9vbGVhbiB1c2VEZWZhdWx0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVQYXRoID0gbnVsbDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUocGF0aCk7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoZmlsZU5hbWUpOwotCQlTdHJpbmcgcGF0aE5hbWUgPSBwYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCQlCdW5kbGVbXSBidW5kbGVzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0JCWlmIChidW5kbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJCVVSTCBlbnRyeSA9IGJ1bmRsZXNbaV0uZ2V0RW50cnkocGF0aE5hbWUpOwotCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKGVudHJ5KTsKLQkJCQkJZmlsZVBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKHVybC5nZXRQYXRoKCkKLQkJCQkJCQkrIGZpbGVOYW1lLCBsb2NhbGUpOyAKLQkJCQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLQkJCVVSTCBlbnRyeSA9IGJ1bmRsZS5nZXRFbnRyeShwYXRoKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoZW50cnkpOwotCQkJCWZpbGVQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSh1cmwuZ2V0UGF0aCgpLCBsb2NhbGUpOwotCQkJCWlmIChmaWxlUGF0aCA9PSBudWxsICYmIHVzZURlZmF1bHQpIHsKLQkJCQkJZmlsZVBhdGggPSB1cmwuZ2V0UGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmaWxlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgdGhlIGdpdmVuIHBhdGggaW4gdGhlIHBsdWdpbiwgZmluZCB0aGUgbG9jYWxpemVkIGZpbGVzIGZvcm0gdGhlIG5sCi0JICogZnJhZ2VtZW5ldHMgYW5kIGNvcHkgdGhlIGxvY2FsaXplZCBmaWxlcyB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIHBsdWdpbiByb290LiBUaGUgZmlsZXMgaW4gdGhpcwotCSAqICAgICAgICAgICAgZm9sZGVyIHdpbGwgYmUgaXRlcmF0ZWQgYW5kIHRoZWlyIGxvY2FsaXplZCBmaWxlcyB3aWxsIGJlCi0JICogICAgICAgICAgICBjb3BpZWQgb3ZlcgotCSAqIEBwYXJhbSB0b0RpcgotCSAqICAgICAgICAgICAgRklsZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyCi0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqICAgICAgICAgICAgYm9vbGVhbiByZWN1cml2ZWx5IGxvb2tpbmcgZm9yIGZpbGVzIGludCB0aGUgc3BlY2lmaWVkIGZvbGRlcgotCSAqIEBwYXJhbSB1c2VMb2NhbGVGaWxlTmFtZQotCSAqICAgICAgICAgICAgYm9vbGVhbiBpZiB0cnVlIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lcyB3aWxsIGJlIHVzZWQgaW4KLQkgKiAgICAgICAgICAgIHRoZSBjb3BpZWQgZGVzdGluYXRpb24sIG90aGVyd2lzZSwgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlCi0JICogICAgICAgICAgICBuYW1lIHdpbGwgYmUgcmVuYW1lZCB0byB0aGUgZGVmYXVsdCBvbmUgaW4gdGhlIGRlc3RpbmF0aW9uCi0JICogICAgICAgICAgICBmb2xkZXIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29weUxvY2FsaXplZEZpbGVzKFN0cmluZyBwYXRoLCBGaWxlIHRvRGlyLCBib29sZWFuIHJlY3Vyc2l2ZSwKLQkJCWJvb2xlYW4gdXNlTG9jYWxlRmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gZ2V0SW5zdGFsbFBhdGgoKTsKLQkJVVJJIHBsdWdpblVyaSA9IG5ldyBGaWxlKHBsdWdpblBhdGgpLnRvVVJJKCk7Ci0JCVVSSSBwYXRoVXJpID0gbmV3IEZpbGUocGx1Z2luUGF0aCwgcGF0aCkudG9VUkkoKTsKLQotCQlMaXN0PEZpbGU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShwbHVnaW5QYXRoLCBwYXRoKTsKLQkJRmlsZVV0aWwuZ2V0QWxsRmlsZXMoZiwgZmlsZXMsIHJlY3Vyc2l2ZSk7Ci0KLQkJLy8gZm9yIGVhY2ggZmlsZSBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciwgZ2V0IHRoZSBsb2NhbGl6ZWQgZmlsZQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVVJJIHNyY1VyaSA9ICgoRmlsZSkgaXQubmV4dCgpKS50b1VSSSgpOwotCi0JCQkvLyBnZXQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGZpbGUgdG8gdGhlIHBsdWdpbiByb290LCB0aGVuIGZpbmQKLQkJCS8vIHRoZSBsb2NhbGl6ZWQgZmlsZQotCQkJU3RyaW5nIHJlbFBhdGggPSBwbHVnaW5VcmkucmVsYXRpdml6ZShzcmNVcmkpLmdldFBhdGgoKTsKLQotCQkJLy8gb25seSBnZXQgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlLCBkb24ndCBpbmNsdWRlIHRoZSBkZWZhdWx0IG9uZQotCQkJU3RyaW5nIGxvY2FsaXplZEZpbGUgPSBnZXRMb2NhbGl6ZWRGaWxlKHJlbFBhdGgsIGZhbHNlKTsKLQkJCWlmIChsb2NhbGl6ZWRGaWxlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gbmVlZCB0byBjaGFuZ2UgdGhlIHRhcmdldCBmaWxlIHBhdGggdG8gcmVsYXRpdmUgdG8gdGhlIHBhdGgKLQkJCS8vIGluc3RlYWQgb2YgdGhlIHBsdWdpbiByb290Ci0JCQlyZWxQYXRoID0gcGF0aFVyaS5yZWxhdGl2aXplKHNyY1VyaSkuZ2V0UGF0aCgpOwotCQkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUobG9jYWxpemVkRmlsZSk7Ci0JCQlGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0b0RpciwgcmVsUGF0aCk7Ci0JCQlGaWxlIHRhcmdldFBhcmVudCA9IHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCi0JCQkvLyBjb3B5IHRoZSBmaWxlIHRvIHRoZSBkZXNpdGluYXRpb24KLQkJCS8vIGlmIHVzZUxvY2FsZUZpbGVOYW1lIGlzIHRydWUsIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUgc2hvdWxkCi0JCQkvLyBhbHNvIHVzZSB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUgbmFtZQotCQkJaWYgKHVzZUxvY2FsZUZpbGVOYW1lKSB7Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gc3JjRmlsZS5nZXROYW1lKCk7Ci0JCQkJdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldFBhcmVudCwgZmlsZU5hbWUpOwotCQkJfQotCi0JCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29weWluZyBsb2NhbGl6ZWQgZmlsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNvdXJjZTogIiArIHNyY0ZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUYXJnZXQ6ICIgKyB0YXJnZXRGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAoIXRhcmdldFBhcmVudC5leGlzdHMoKSkgewotCQkJCQl0YXJnZXRQYXJlbnQubWtkaXJzKCk7Ci0JCQkJfQotCi0JCQkJaWYgKCF0YXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRhcmdldEZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJCX0KLQotCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICdbJyArIGtleSArICddJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbG9jYWxpemVkIG1lc3NhZ2UgZ2l2ZW4gdGhlIHJlc291cmNlIGtleSBhbmQgdGhlCi0JICogbWVzc2FnZSBhcmd1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBhcmd1bWVudAotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgYXJndW1lbnQuCi0JICogQHJldHVybiBUaGUgZm9ybWF0dGVkIGxvY2FsaXplZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG1zZyA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCU9iamVjdFtdIGFyZ3VtZW50cyA9IHsgYXJndW1lbnQgfTsKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcmd1bWVudHMpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIFVSTCBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSBVUkwuCi0JICovCi0JcHVibGljIFVSTCBnZXRJbWFnZVVSTChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChpY29uVVJMLCByZWxhdGl2ZVBhdGgpOwotCQkJcmV0dXJuIEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0vLwkvKioKLS8vCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLS8vCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbidzIHJvb3QuCi0vLwkgKiBAcmV0dXJuIFRoZSBpbWFnZSBkZXNjcmlwdG9yLgotLy8JICovCi0vLwlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJVVJMIHVybCA9IG5ldyBVUkwoaWNvblVSTCwgcmVsYXRpdmVQYXRoKTsKLS8vCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0vLwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLS8vCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0vLwkJfQotLy8JfQotLy8KLS8vCS8qKgotLy8JICogUmV0dXJucyB0aGUgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0vLwkgKiA8cD4KLS8vCSAqIE5vdGU6IFRoZSByZXR1cm5lZCBpbWFnZSBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLS8vCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbidzIHJvb3QuCi0vLwkgKiBAcmV0dXJuIFRoZSBpbWFnZS4KLS8vCSAqLwotLy8JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLS8vCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0vLwotLy8JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVsYXRpdmVQYXRoKTsKLS8vCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLS8vCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGltYWdlOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogUmV0dXJucyB0aGUgc2hhcmVkIGltYWdlIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotLy8JICogPHA+Ci0vLwkgKiBOb3RlOiBUaGUgcmV0dXJuZWQgaW1hZ2Ugd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW4gdGhlIHBsdWctaW4KLS8vCSAqIHNodXRzIGRvd24uCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLS8vCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbidzIHJvb3QuCi0vLwkgKiBAcmV0dXJuIFRoZSBpbWFnZS4KLS8vCSAqLwotLy8JcHVibGljIEltYWdlIGdldFNoYXJlZEltYWdlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLS8vCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgc2hhcmVkSW1hZ2VzLmdldChyZWxhdGl2ZVBhdGgpOwotLy8JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0vLwkJCXJldHVybiBpbWFnZTsKLS8vCQl9Ci0vLwotLy8JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVsYXRpdmVQYXRoKTsKLS8vCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLS8vCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotLy8JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotLy8JCQkJc2hhcmVkSW1hZ2VzLnB1dChyZWxhdGl2ZVBhdGgsIGltYWdlKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGltYWdlOwotLy8JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvZmlsaW5nIGZsYWcuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZCBmb3IgdGhpcyBwbHUtaW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2ZpbGluZygpIHsKLQkJcmV0dXJuIHByb2ZpbGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2dnZXIgZ2l2ZW4gdGhlIHBsdWctaW4gSUQuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IG9yIGNhY2hlZCBsb2dnZXIuCi0JICovCi0JcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSAoTG9nZ2VyKSBsb2dnZXJzLmdldChwbHVnaW5JZCk7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkgewotCQkJbG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKTsKLQkJCWxvZ2dlcnMucHV0KHBsdWdpbklkLCBsb2dnZXIpOwotCQl9Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCQkKLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBvYmplY3Qgb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coT2JqZWN0IGxvZ0VudHJ5KSB7Ci0JCWlmIChsb2dFbnRyeSBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJKChUaHJvd2FibGUpIGxvZ0VudHJ5KS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obG9nRW50cnkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbW1vblByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKSB7Ci0JCWlmICggQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5jb250ZXh0UHJvdmlkZXIgIT0gbnVsbCApIHsKLQkJCXJldHVybiBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmNvbnRleHRQcm92aWRlci5nZXRDb250ZXh0KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSU1lc3NhZ2VDYWxsYmFjayBnZXRNc2dDYWxsYmFjaygpIHsKLQkJcmV0dXJuIENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkubXNnQ2FsbGJhY2s7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9Db21tb25QbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vQ29tbW9uUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODExNjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9Db21tb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBDb21tb24gcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbW1vblBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0vLwkvKioKLS8vCSAqIHNldCB0aGUgc3RvcmUgd3JhcHBlciBiZWZvcmUgaXQncyBiZWluZyB1c2VkLgotLy8JICogQHBhcmFtIHN0b3JlV3JhcHBlcgotLy8JICovCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZVdyYXBwZXIgPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIHNldENvbW1vblByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZVdyYXBwZXIpIHsKLQkJdGhpcy5zdG9yZVdyYXBwZXIgPSBzdG9yZVdyYXBwZXI7Ci0JfQotCQotCXB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBnZXRDb21tb25QcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBzdG9yZVdyYXBwZXI7Ci0JfQotCQotCS8vIHRoaXMgaXMgdGhlIGNvbnRleHQgZm9yIG1lc3NhZ2UgY2FsbGJhY2sKLQkvLyBmb3IgZWNsaXBzZSBjbGllbnQsIHRoaXMgaXMgdGhlIFNoZWxsIG9iamVjdAotCUlDb250ZXh0UHJvdmlkZXIgY29udGV4dFByb3ZpZGVyID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRQcm92aWRlcihJQ29udGV4dFByb3ZpZGVyIGNvbnRleHRQcm92aWRlcikgewotCQl0aGlzLmNvbnRleHRQcm92aWRlciA9IGNvbnRleHRQcm92aWRlcjsKLQl9Ci0KLQlJTWVzc2FnZUNhbGxiYWNrIG1zZ0NhbGxiYWNrID0gbnVsbDsKLQlwdWJsaWMgdm9pZCBzZXRNc2dDYWxsYmFjayhJTWVzc2FnZUNhbGxiYWNrIG1zZ0NhbGxiYWNrKSB7Ci0JCXRoaXMubXNnQ2FsbGJhY2sgPSBtc2dDYWxsYmFjazsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JQWN0aXZhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4NDRmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lBY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aXZhdG9yIHsKLQlTdHJpbmcgZ2V0SWQoKTsKLQlMb2dnZXIgZ2V0TG9nZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lDb250ZXh0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUNvbnRleHRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTk3YTJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUNvbnRleHRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRleHRQcm92aWRlciB7Ci0JcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lNZXNzYWdlQ2FsbGJhY2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSU1lc3NhZ2VDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA3ZGQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSU1lc3NhZ2VDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VDYWxsYmFjayB7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbik7Ci0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBUaHJvd2FibGUgZXgpOwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCk7Ci0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpOwotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpOwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCk7Ci0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTEzMTM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcudzNjLnRpZHkuVGlkeTsKLQotLyoqCi0gKiBQcmV0dHktZm9ybWF0cyBIVE1MIHNvdXJjZSBhbmQgbWFrZXMgaXQgWEhUTUwgY29tcGxpYW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfQk9EWV9TVEFSVF9UQUcgPSAiPGJvZHkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9CT0RZX0VORF9UQUcgPSAiPC9ib2R5PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVE1MX0JPRFlfU1RBUlRfVEFHX0xFTkdUSCA9IEhUTUxfQk9EWV9TVEFSVF9UQUcKLQkJCS5sZW5ndGgoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdOT1NUSUNfU09VUkNFID0gIm9yZy5lY2xpcHNlLmVwZi5jb21tb24uSFRNTEZvcm1hdHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IGxpbmVXaWR0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBpbmRlbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRlbnRTaXplOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFzdEVycm9yU3RyOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF93aGl0ZXNwYWNlID0gUGF0dGVybi5jb21waWxlKCJeXFxzKyIsIFBhdHRlcm4uTVVMVElMSU5FKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDEpOwotCSAqIFN0cmluZyBsaW5lU3RyID0gbS5ncm91cCgyKTsKLQkgKiBTdHJpbmcgY29sdW1uU3RyID0gbS5ncm91cCgzKTsKLQkgKiBTdHJpbmcgZXJyb3JNc2cgPSBtLmdyb3VwKDQpOwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBqVGlkeUVycm9yUGFyc2VyID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIobGluZVxccysoXFxkKylcXHMrY29sdW1uXFxzKyhcXGQrKSlcXHMrLVxccysoLispIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSFRNTEZvcm1hdHRlcigpIHsKLQkJdGhpcygxMzIsIHRydWUsIDQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxGb3JtYXR0ZXIoaW50IGxpbmVXaWR0aCwgYm9vbGVhbiBpbmRlbnQsIGludCBpbmRlbnRTaXplKSB7Ci0JCXRoaXMubGluZVdpZHRoID0gbGluZVdpZHRoOwotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQkJdGhpcy5pbmRlbnRTaXplID0gaW5kZW50U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYXhpbXVtIGNoYXJhY3RlciB3aWR0aCBvZiBhIGxpbmUuCi0JICogCi0JICogQHBhcmFtIGxpbmVXaWR0aAotCSAqICAgICAgICAgICAgVGhlIGxpbmUgd2lkdGggKGluIG51bWJlciBvZiBjaGFyYWN0ZXJzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCkgewotCQl0aGlzLmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRhZ3MgaW5kZW50LgotCSAqIAotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiAgICAgICAgICAgIElmIHRydWUsIGlkZW50IHRoZSB0YWdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGVudChib29sZWFuIGluZGVudCkgewotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmRlbnQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZW50U2l6ZQotCSAqICAgICAgICAgICAgVGhlIGluZGVudCBzaXplIChpbiBudW1iZXIgb2YgY2hhcmFjdGVycykuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZW50U2l6ZShpbnQgaW5kZW50U2l6ZSkgewotCQl0aGlzLmluZGVudFNpemUgPSBpbmRlbnRTaXplOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBodG1sCi0JICogICAgICAgICAgICBUaGUgSFRNTCBzb3VyY2UuCi0JICogQHJldHVybiBUaGUgcHJldHR5LWZvcm1hdHRlZCBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIGh0bWwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZvcm1hdEhUTUwoaHRtbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBodG1sIFRoZSBIVE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gcmV0dXJuQm9keU9ubHkgaWYgZmFsc2UsIHJldHVybiBmdWxsIEhUTUwgZG9jdW1lbnQgb3IgYm9keSBjb250ZW50IGJhc2VkIG9uIHdoYXQgaXMgcGFzc2VkIGluLiAgaWYgdHJ1ZSwgYWx3YXlzIHJldHVybiBib2R5IGNvbnRlbnQgb25seQotCSAqIEBwYXJhbSBmb3JjZU91dHB1dCBpZiB0cnVlLCByZXR1cm4gY2xlYW5lZCBIVE1MIGV2ZW4gaWYgZXJyb3JzLiBpZiBmYWxzZSwgd2lsbCBjbGVhbiBtaW5vciBwcm9ibGVtcyBhbmQgcmV0dXJuIGNsZWFuIEhUTUwsIGJ1dCBvbiBhIG1ham9yIGVycm9yLCB3aWxsIHNldCBnZXRMYXN0RXJyb3JTdHIoKSBhbmQgcmV0dXJuIHBhc3NlZC1pbiBodG1sCi0JICogQHBhcmFtIG1ha2VCYXJlIHNldCB0byB0cnVlIGZvciBjbGVhbmluZyBNUyBIVE1MCi0JICogQHBhcmFtIHdvcmQyMDAwIHNldCB0byB0cnVlIGZvciBjbGVhbmluZyBNUyBXb3JkIDIwMDAgSFRNTCAKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRIVE1MKFN0cmluZyBodG1sLCBib29sZWFuIHJldHVybkJvZHlPbmx5LCBib29sZWFuIGZvcmNlT3V0cHV0LCBib29sZWFuIG1ha2VCYXJlLCBib29sZWFuIHdvcmQyMDAwKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWxhc3RFcnJvclN0ciA9IG51bGw7Ci0JCWlmIChodG1sID09IG51bGwgfHwgaHRtbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gaHRtbDsKLQkJfQotCQkKLQkJaHRtbCA9IHJlbW92ZUxlYWRpbmdXaGl0ZXNwYWNlKGh0bWwpOwotCi0JCVRpZHkgdGlkeSA9IG5ldyBUaWR5KCk7Ci0JCXRpZHkuc2V0WEhUTUwodHJ1ZSk7Ci0JCXRpZHkuc2V0RHJvcEVtcHR5UGFyYXMoZmFsc2UpOwotCQl0aWR5LnNldERyb3BGb250VGFncyhmYWxzZSk7Ci0JCXRpZHkuc2V0UXVpZXQodHJ1ZSk7Ci0JCXRpZHkuc2V0U2hvd1dhcm5pbmdzKGZhbHNlKTsKLQkJdGlkeS5zZXRTbWFydEluZGVudChmYWxzZSk7Ci0JCXRpZHkuc2V0VGlkeU1hcmsoZmFsc2UpOwotCQl0aWR5LnNldFdyYXBsZW4obGluZVdpZHRoKTsKLQkJdGlkeS5zZXRJbmRlbnRBdHRyaWJ1dGVzKGZhbHNlKTsKLQkJdGlkeS5zZXRJbmRlbnRDb250ZW50KGluZGVudCk7Ci0JCXRpZHkuc2V0U3BhY2VzKGluZGVudFNpemUpOwotCQl0aWR5LnNldElucHV0RW5jb2RpbmcoIlVURi0xNiIpOyAvLyROT04tTkxTLTEkCi0JCXRpZHkuc2V0T3V0cHV0RW5jb2RpbmcoIlVURi0xNiIpOyAvLyROT04tTkxTLTEkCi0JCXRpZHkuc2V0Rml4QmFja3NsYXNoKGZhbHNlKTsKLQkJLy8gdGhpcyB3aWxsIGFkZCA8cD4gYXJvdW5kIGVhY2ggdGV4dCBibG9jayAoP3RoYXQgaXNuJ3QgaW4gYSBibG9jayBhbHJlYWR5PykKLS8vCQl0aWR5LnNldEVuY2xvc2VCbG9ja1RleHQodHJ1ZSk7Ci0JCS8vIHNldHRpbmcgdGhpcyBzZWVtZWQgdG8gcHJldmVudCBKVGlkeSBmcm9tIGluZGVudGluZyB0aGUgc291cmNlCi0vLwkJdGlkeS5zZXRQcmludEJvZHlPbmx5KHRydWUpOwotCQkKLQkJaWYgKGZvcmNlT3V0cHV0KSB7Ci0JCQkvLyBvdXRwdXQgZG9jdW1lbnQgZXZlbiBpZiBlcnJvcnMgYXJlIHByZXNlbnQKLQkJCXRpZHkuc2V0Rm9yY2VPdXRwdXQodHJ1ZSk7Ci0JCX0KLQkJaWYgKG1ha2VCYXJlKSB7Ci0JCQkvLyByZW1vdmUgTVMgY2x1dHRlcgotCQkJdGlkeS5zZXRNYWtlQmFyZSh0cnVlKTsKLQkJfQotCQlpZiAod29yZDIwMDApIHsKLQkJCS8vIGRyYWNvbmlhbiBXb3JkMjAwMCBjbGVhbmluZwotCQkJdGlkeS5zZXRXb3JkMjAwMCh0cnVlKTsKLQkJfQotCi0JCVJlYWRlciBpbnB1dCA9IG5ldyBTdHJpbmdSZWFkZXIoaHRtbCk7Ci0JCVdyaXRlciBvdXRwdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRpZHkuc2V0RXJyb3V0KHB3KTsKLQkJdGlkeS5wYXJzZShpbnB1dCwgb3V0cHV0KTsKLQkJU3RyaW5nIGVycm9yID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQkJaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IubGVuZ3RoKCkgPiAwCi0JCQkJJiYgZXJyb3Iuc3RhcnRzV2l0aCgibGluZSIpICYmIGVycm9yLmluZGV4T2YoImNvbHVtbiIpID4gMCkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxhc3RFcnJvclN0ciA9IGVycm9yOwotCQkJaWYgKCFmb3JjZU91dHB1dCkgewotCQkJCS8vIGlmIGZvcmNlT3V0cHV0IGlzIHRydWUsIEpUaWR5IHdpbGwgcmV0dXJuIGNsZWFuIEhUTUwgc28gZG9uJ3QgcmV0dXJuIGhlcmUKLQkJCQlyZXR1cm4gaHRtbDsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBmb3JtYXR0ZWRIVE1MID0gb3V0cHV0LnRvU3RyaW5nKCk7Ci0JCWZvcm1hdHRlZEhUTUwgPSBTdHJVdGlsLmdldEVzY2FwZWRIVE1MKGZvcm1hdHRlZEhUTUwpOwotCQkKLQkJU3RyaW5nIGh0bWxTdGFydFVwcGVyID0gaHRtbC5zdWJzdHJpbmcoMCwgTWF0aC5taW4oMTAsIGh0bWwubGVuZ3RoKCkpKS50b1VwcGVyQ2FzZSgpOwotCi0JCWlmIChyZXR1cm5Cb2R5T25seSB8fCAoIWh0bWxTdGFydFVwcGVyLnN0YXJ0c1dpdGgoIjwhRE9DVFlQRSIpICYmICFodG1sU3RhcnRVcHBlci5zdGFydHNXaXRoKCI8SFRNTCIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWludCBzdGFydEJvZHlUYWcgPSBmb3JtYXR0ZWRIVE1MLmluZGV4T2YoSFRNTF9CT0RZX1NUQVJUX1RBRyk7Ci0JCQlpbnQgc3RhcnQgPSAtMTsKLQkJCWlmIChzdGFydEJvZHlUYWcgIT0gLTEpIHsKLQkJCQlzdGFydCA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZigiPiIsc3RhcnRCb2R5VGFnKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGVuZCA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZihIVE1MX0JPRFlfRU5EX1RBRyk7Ci0JCQlpZiAoc3RhcnQgPT0gLTEgfHwgZW5kID09IC0xKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFydCArPSAxOwotCQkJaWYgKHN0YXJ0ID49IGVuZCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3RhcnQgKz0gRmlsZVV0aWwuTElORV9TRVBfTEVOR1RIOwotCQkJZW5kIC09IEZpbGVVdGlsLkxJTkVfU0VQX0xFTkdUSDsKLQkJCWlmIChpbmRlbnQgJiYgaW5kZW50U2l6ZSA+IDApIHsKLQkJCQllbmQgLT0gaW5kZW50U2l6ZTsKLQkJCX0KLQkJCWlmIChzdGFydCA+PSBlbmQpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyByZXN1bHQgPSBmb3JtYXR0ZWRIVE1MLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCWlmIChpbmRlbnQgJiYgaW5kZW50U2l6ZSA+IDApIHsKLQkJCQlTdHJpbmcgaW5kZW50U3RyID0gZ2V0SW5kZW50U3RyKGluZGVudFNpemUgKiAyKTsKLQkJCQlyZXN1bHQgPSBmaXhJbmRlbnRhdGlvbihyZXN1bHQsIGluZGVudFN0cik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZm9ybWF0dGVkSFRNTDsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZGVudCBzdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEluZGVudFN0cihpbnQgaW5kZW50TGVuZ3RoKSB7Ci0JCWlmIChpbmRlbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGluZGVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRMZW5ndGg7IGkrKykgewotCQkJaW5kZW50U3RyLmFwcGVuZCgnICcpOwotCQl9Ci0JCXJldHVybiBpbmRlbnRTdHIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfVEFHX1NUQVJUID0gIjxwcmU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFX1RBR19FTkQgPSAiPC9wcmU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1RBR19FTkRfTEVOR1RIID0gUFJFX1RBR19FTkQubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBKVGlkeSBpbmRlbnQsIGJ1dCBpZ25vcmUgJmx0O3ByZSZndDsgdGFncwotCSAqIAotCSAqIEBwYXJhbSBodG1sCi0JICogQHBhcmFtIGluZGVudFN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZml4SW5kZW50YXRpb24oU3RyaW5nIGh0bWwsIFN0cmluZyBpbmRlbnRTdHIpIHsKLQkJaWYgKGh0bWwuc3RhcnRzV2l0aChpbmRlbnRTdHIpKSB7Ci0JCQlodG1sID0gaHRtbC5zdWJzdHJpbmcoaW5kZW50U3RyLmxlbmd0aCgpKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgcHJlX2luZGV4ID0gLTE7Ci0JCWludCBsYXN0X3ByZV9lbmRfaW5kZXggPSAtMTsKLQkJd2hpbGUgKChwcmVfaW5kZXggPSBodG1sLmluZGV4T2YoUFJFX1RBR19TVEFSVCwgbGFzdF9wcmVfZW5kX2luZGV4KSkgIT0gLTEpIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoaHRtbC5zdWJzdHJpbmcoCi0JCQkJCWxhc3RfcHJlX2VuZF9pbmRleCA8IDAgPyAwIDogbGFzdF9wcmVfZW5kX2luZGV4Ci0JCQkJCQkJKyBQUkVfVEFHX0VORF9MRU5HVEgsIHByZV9pbmRleCkucmVwbGFjZUFsbCgKLQkJCQkJIlxyXG4iICsgaW5kZW50U3RyLCAiXHJcbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsYXN0X3ByZV9lbmRfaW5kZXggPSBodG1sLmluZGV4T2YoUFJFX1RBR19FTkQsIHByZV9pbmRleCk7Ci0JCQlpZiAobGFzdF9wcmVfZW5kX2luZGV4ICE9IC0xKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZyhwcmVfaW5kZXgsIGxhc3RfcHJlX2VuZF9pbmRleAotCQkJCQkJKyBQUkVfVEFHX0VORF9MRU5HVEgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZm91bmQgPHByZT4sIGJ1dCBubyBlbmRpbmcgPC9wcmU+IC0gc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUKLQkJCQkvLyBhcHBlbmQgcmVzdCBvZiBzdHJpbmcgYW5kIHJldHVybiBpdAotCQkJCXN0ckJ1Zi5hcHBlbmQoaHRtbC5zdWJzdHJpbmcocHJlX2luZGV4KSk7Ci0JCQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXN0ckJ1Zi5hcHBlbmQoaHRtbC5zdWJzdHJpbmcoCi0JCQkJbGFzdF9wcmVfZW5kX2luZGV4IDwgMCA/IDAgOiBsYXN0X3ByZV9lbmRfaW5kZXgKLQkJCQkJCSsgUFJFX1RBR19FTkRfTEVOR1RIKS5yZXBsYWNlQWxsKCJcclxuIiArIGluZGVudFN0ciwgLy8kTk9OLU5MUy0xJAotCQkJCSJcclxuIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhc3RFcnJvclN0cigpIHsKLQkJcmV0dXJuIGxhc3RFcnJvclN0cjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1doaXRlc3BhY2UoU3RyaW5nIGlucHV0KSB7Ci0JCXJldHVybiBwX3doaXRlc3BhY2UubWF0Y2hlcihpbnB1dCkucmVwbGFjZUFsbCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3MjQ4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLnRpZHkuVGlkeTsKLQotLyoqCi0gKiBFeHRyYWN0cyB0aGUgdGl0bGUsIG1ldGEgdGFncyBhbmQgdGV4dCBmcm9tIGEgSFRNTCBmaWxlIG9yIHNvdXJjZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MUGFyc2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDQwOTY7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9TQ1JJUFRfVEFHID0gInNjcmlwdCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9USVRMRV9UQUcgPSAidGl0bGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9NRVRBX1RBRyA9ICJtZXRhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUaWR5IHRpZHk7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCXByaXZhdGUgU3RyaW5nIHN1bW1hcnk7Ci0KLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIG1ldGFUYWdzOwotCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgaHRtbFRleHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIVE1MUGFyc2VyKCkgewotCQl0cnkgewotCQkJdGlkeSA9IG5ldyBUaWR5KCk7Ci0JCQl0aWR5LnNldFhIVE1MKHRydWUpOwotCQkJdGlkeS5zZXREcm9wRW1wdHlQYXJhcyh0cnVlKTsKLQkJCXRpZHkuc2V0RHJvcEZvbnRUYWdzKHRydWUpOwotCQkJdGlkeS5zZXRRdWlldCh0cnVlKTsKLQkJCXRpZHkuc2V0U2hvd1dhcm5pbmdzKGZhbHNlKTsKLQkJCXRpZHkuc2V0U21hcnRJbmRlbnQoZmFsc2UpOwotCQkJdGlkeS5zZXRUaWR5TWFyayhmYWxzZSk7Ci0JCQl0aWR5LnNldFdyYXBsZW4oMTMyKTsKLQkJCXRpZHkuc2V0SW5kZW50QXR0cmlidXRlcyhmYWxzZSk7Ci0JCQl0aWR5LnNldEluZGVudENvbnRlbnQoZmFsc2UpOwotCQkJdGlkeS5zZXRTcGFjZXMoMik7Ci0JCQl0aWR5LnNldElucHV0RW5jb2RpbmcoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXRpZHkuc2V0T3V0cHV0RW5jb2RpbmcoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRpZHkgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBIVE1MIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRpZHkgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5jYW5SZWFkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQlJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOwotCi0JCVN0cmluZ0J1ZmZlciB0ZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihCVUZGRVJfU0laRSk7Ci0JCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07Ci0JCWludCBjaGFyc1JlYWQ7Ci0JCXdoaWxlICgoY2hhcnNSZWFkID0gYnIucmVhZChidWZmZXIsIDAsIEJVRkZFUl9TSVpFKSkgPiAwKSB7Ci0JCQl0ZXh0QnVmZmVyLmFwcGVuZChidWZmZXIsIDAsIGNoYXJzUmVhZCk7Ci0JCX0KLQotCQlwYXJzZSh0ZXh0QnVmZmVyLnRvU3RyaW5nKCkpOwotCi0JCWlmIChiciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWJyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFN0cmluZyBodG1sU291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGl0bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlzdW1tYXJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCW1ldGFUYWdzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCQlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChodG1sU291cmNlKTsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQlodG1sVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAyNCk7Ci0JCQlleHRyYWN0KGRvYy5nZXRDaGlsZE5vZGVzKCkpOwotCQkJdGV4dCA9IGh0bWxUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIG1ldGEgdGFncy4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRNZXRhVGFncygpIHsKLQkJcmV0dXJuIG1ldGFUYWdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1bW1hcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkgewotCQlyZXR1cm4gc3VtbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib2R5IHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBET00gZG9jdW1lbnQgZm9yIHRoZSBnaXZlbiBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGh0bWwpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaHRtbCA9PSBudWxsIHx8IGh0bWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShodG1sCi0JCQkJLmdldEJ5dGVzKCJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAkKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJdGlkeS5zZXRFcnJvdXQocHcpOwotCi0JCXJldHVybiB0aWR5LnBhcnNlRE9NKGlucHV0LCBvdXRwdXQpOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSB0aXRsZSwgbWV0YSB0YWdzIGFuZCBib2R5IHRleHQgZnJvbSB0aGUgZ2l2ZW4gbm9kZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXh0cmFjdChOb2RlTGlzdCBub2RlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCQlpZiAoIW5vZGVOYW1lLmVxdWFscyhIVE1MX1NDUklQVF9UQUcpKSB7Ci0JCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCU5vZGUgYXR0ck5vZGUgPSBhdHRycy5pdGVtKGopOwotCQkJCQkJU3RyaW5nIGF0dHJOb2RlTmFtZSA9IGF0dHJOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQlTdHJpbmcgYXR0ck5vZGVWYWx1ZSA9IGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJaWYgKGF0dHJOb2RlTmFtZS5lcXVhbHMoSFRNTF9USVRMRV9UQUcpKSB7Ci0JCQkJCQkJdGl0bGUgPSBhdHRyTm9kZVZhbHVlOwotCQkJCQkJfSBlbHNlIGlmIChhdHRyTm9kZU5hbWUuZXF1YWxzKEhUTUxfTUVUQV9UQUcpKSB7Ci0JCQkJCQkJbWV0YVRhZ3MucHV0KGF0dHJOb2RlTmFtZSwgYXR0ck5vZGVWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlpZiAoY2hpbGROb2RlcyAhPSBudWxsICYmIGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlleHRyYWN0KGNoaWxkTm9kZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJCQlodG1sVGV4dC5hcHBlbmQobm9kZS5nZXROb2RlVmFsdWUoKSkuYXBwZW5kKCcgJyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyYmJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tb24gSFRNTCBwYXJzaW5nIGFuZCBwcmV0dHktZm9ybWF0aW5nIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjg5M2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgQ29tbW9uIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmMTg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcmVmZXJlbmNlU3RvcmVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzOwotCi0KLS8qKgotICogd3JhcHBlciBpbnRlcmZhY2UgZm9yIHByZWZlcmVuY2Ugc3RvcmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgewotCi0JLy9wdWJsaWMgT2JqZWN0IGdldFN0b3JlKCk7Ci0JCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgbGlzdGVuZXIpOwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBuYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0JICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKTsKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBsaXN0ZW5lcik7Ci0KLQkvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPmZhbHNlPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgYm9vbGVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+ZmFsc2U8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGJvb2xlYW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZG91YmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREZWZhdWx0RG91YmxlKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjBmPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBmbG9hdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXREZWZhdWx0RmxvYXQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIGludGVnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERlZmF1bHRJbnQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MEw8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGxvbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXREZWZhdWx0TG9uZyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKHRoZSBlbXB0eSBzdHJpbmcgPGNvZGU+IiI8L2NvZGU+KSAKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGRvdWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wZjwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGZsb2F0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYW4gaW50ZWd0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGludC12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MEw8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBsb25nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAodGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4pCi0gICAgICogaWYgdGhlcmUgaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKiBoYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaGFzIGEga25vd24gZGVmYXVsdCB2YWx1ZQotICAgICAqIGFuZCBpdHMgY3VycmVudCB2YWx1ZSBpcyB0aGUgc2FtZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiAoaW5jbHVkaW5nIHRoZSBjYXNlIHdoZXJlIHRoZSBwcmVmZXJlbmNlIGlzIHVua25vd24gdG8gdGhpcyBzdG9yZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlcyBpbiB0aGlzIHByb3BlcnR5IHN0b3JlCi0gICAgICogcmVxdWlyZSBzYXZpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSBvZiB2YWx1ZXMgb2YgCi0gICAgICogIHRoZSBwcmVmZXJlbmNlcyBrbm93biB0byB0aGlzIHN0b3JlIGhhcyBjaGFuZ2VkIGFuZCAKLSAgICAgKiAgcmVxdWlyZXMgc2F2aW5nLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc1NhdmluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRvCi0gICAgICogdGhlIGdpdmVuIHN0cmluZyB2YWx1ZSB3aXRob3V0IHNlbmRpbmcgYSBwcm9wZXJ0eSBjaGFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgZmlyZSBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBhbmQgCi0gICAgICogc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igc2V0dGluZyBpbnRlcm5hbCBwcmVmZXJlbmNlcyAKLSAgICAgKiB0aGF0IGFyZSBub3QgbWVhbnQgdG8gYmUgcHJvY2Vzc2VkIGJ5IGxpc3RlbmVycy4KLSAgICAgKiBOb3JtYWwgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBjYWxsICNzZXRWYWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gZGVmYXVsdE9iamVjdCB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHRPYmplY3QpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgYmFjawotICAgICAqIHRvIGl0cyBkZWZhdWx0IHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIHRoZQotICAgICAqIGFwcHJvcHJpYXRlIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgcmVtb3ZpbmcgdGhlIG5hbWVkIHZhbHVlIGZyb20gdGhlIHN0b3JlLCAKLSAgICAgKiB0aGVyZWJ5IGV4cG9zaW5nIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9EZWZhdWx0KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYyNGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogd3JhcHBlciBpbnRlcmZhY2UgZm9yIHByb3BlcnR5IGNoYW5nZSBldmVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgewotCi0JICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGtub3duCi0gICAgICogIG9yIG5vdCByZWxldmFudCAoZm9yIGluc3RhbmNlIGlmIHRoZSBwcm9wZXJ0eSB3YXMgcmVtb3ZlZCkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROZXdWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGtub3duCi0gICAgICogIG9yIG5vdCByZWxldmFudCAoZm9yIGluc3RhbmNlIGlmIHRoZSBwcm9wZXJ0eSB3YXMganVzdAotICAgICAqICBhZGRlZCBhbmQgdGhlcmUgd2FzIG5vIG9sZCB2YWx1ZSkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRPbGRWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFdhcm5pbmc6IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBwcm9wZXJ0eSBuYW1lIHJldHVybmVkCi0gICAgICogaXMgYSBjb25zdGFudCBzdHJpbmcuICBDYWxsZXJzIG11c3QgY29tcGFyZSBwcm9wZXJ0eSBuYW1lcyB1c2luZwotICAgICAqIGVxdWFscywgbm90ID09LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdiZjY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogd3JhcHBlciBpbnRlcmZhY2UgZm9yIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgewotCi0JIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciBldmVudCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0RlYnVnVHJhY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRGVidWdUcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjZmZjQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRGVidWdUcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLS8qKgotICogSGVscGVyIHV0aWxpdHkgZm9yIHByaW50aW5nIGRlYnVnIHRyYWNlcyB0byB0aGUgY29uc29sZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z1RyYWNlIHsKLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqICAgICAgICAgICAgYSBjbGFzcyBpbnN0YW5jZQotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBhIGRlYnVnIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdGgKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnLAotCQkJVGhyb3dhYmxlIHRoKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWJ1Z01zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpIHsKLQkJCWRlYnVnTXNnLmFwcGVuZChpbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCQlkZWJ1Z01zZy5hcHBlbmQoJy4nKS5hcHBlbmQobWV0aG9kKTsKLQkJCX0KLQkJCWRlYnVnTXNnLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkZWJ1Z01zZy5hcHBlbmQobXNnKTsgCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKGRlYnVnTXNnKTsKLQkJaWYgKHRoICE9IG51bGwpIHsKLQkJCXRoLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSB0aAotCSAqICAgICAgICAgICAgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aCkgewotCQlwcmludChpbnN0YW5jZSwgbWV0aG9kLCBudWxsLCB0aCk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIGEgZGVidWcgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnQoaW5zdGFuY2UsIG1ldGhvZCwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIGEgY2xhc3MgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICBhIG1ldGhvZCBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG1ldGhvZCkgewotCQlwcmludChpbnN0YW5jZSwgbWV0aG9kLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGgKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoVGhyb3dhYmxlIHRoKSB7Ci0JCWlmICh0aCAhPSBudWxsKSB7Ci0JCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Mb2dnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDM3YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIEdlbmVyaWMgbG9nZ2VyIHVzZWQgZm9yIGxvZ2dpbmcgc3RhdHVzIG1lc3NhZ2VzLCB3YXJuaW5nIG1lc3NhZ2VzLCBlcnJvcgotICogbWVzc2FnZXMsIGFuZCBleGNlcHRpb24gc3RhY2sgdHJhY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIFBsdWdpbiBwbHVnaW47Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyA8Y29kZT5Mb2dnZXI8L2NvZGU+IGdpdmVuIHRoZSBwbHVnLWluIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExvZ2dlcihQbHVnaW4gcGx1Z2luKSB7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOyAvL3BsdWdpbi5nZXRJZCgpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1zZykgewotCQlsb2dNc2coSVN0YXR1cy5FUlJPUiwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleCkgewotCQlsb2dNc2coSVN0YXR1cy5FUlJPUiwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWxvZ01zZyhJU3RhdHVzLkVSUk9SLCBtc2csIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtc2cpIHsKLQkJbG9nTXNnKElTdGF0dXMuV0FSTklORywgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlsb2dNc2coSVN0YXR1cy5XQVJOSU5HLCBtc2csIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBzdGF0dXMgbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBzdGF0dXMgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtc2cpIHsKLQkJbG9nTXNnKElTdGF0dXMuSU5GTywgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogICAgICAgICAgICBUaGUgc2V2ZXJpdHkuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2dNc2coaW50IHNldmVyaXR5LCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJaWYgKG1zZyA9PSBudWxsICYmIGV4ICE9IG51bGwpIHsKLQkJCW1zZyA9IGV4LmdldE1lc3NhZ2UoKTsgCi0JCX0KLQotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgcGx1Z2luSWQsIElTdGF0dXMuT0ssIG1zZywgZXgpOwotCi0JCS8vIENhbGwgdGhlIEVjbGlwc2UgTG9nZ2VyLgotCQlwbHVnaW4uZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzMzQ3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1vbiBlcnJvciBoYW5kbGluZywgbG9nZ2luZyBhbmQgdmVyc2lvbmluZyBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0V4dGVuc2lvbkhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9FeHRlbnNpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwM2Y0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0V4dGVuc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0qIEhlbHBlciBjbGFzcyB3aXRoIG1ldGhvZHMgdG8gcmV0cmlldmUgZXh0ZW5zaW9ucwotKiBNb3ZlZCBwYXJ0IG9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyLCB0byBhbGxvdwotKiBhY2Nlc3MgYnkgY2xhc3NlcyB0aGF0IGhhdmUgbm8gZGVwZW5kZW5jeSBvbiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ci0qIAotKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAKLSogQGF1dGhvciBXZWlwaW5nIEx1Ci0qIEBzaW5jZSAgMS41Ci0qLwotcHVibGljIGNsYXNzIEV4dGVuc2lvbkhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIElEVG9FeHRlbnNpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lKSB7Ci0JCS8vIFByb2Nlc3MgdGhlIGNvbnRyaWJ1dG9ycy4KLQkJLy8KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlPYmplY3QgZXh0ID0gbnVsbDsKLQkJCWV4dF93YWxrOgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJYnJlYWsgZXh0X3dhbGs7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGV4dDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RXh0ZW5zaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUpIHsKLQkJU3RyaW5nIElEID0gbmFtZXNwYWNlICsgJy4nICsgZXh0ZW5zaW9uUG9pbnROYW1lOwotCQlPYmplY3QgZXh0ID0gSURUb0V4dGVuc2lvbk1hcC5nZXQoSUQpOwotCQlpZihleHQgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChJRFRvRXh0ZW5zaW9uTWFwKSB7Ci0JCQkJZXh0ID0gSURUb0V4dGVuc2lvbk1hcC5nZXQoSUQpOwotCQkJCWlmKGV4dCA9PSBudWxsKSB7Ci0JCQkJCWV4dCA9IGNyZWF0ZUV4dGVuc2lvbihuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCQkJCWlmKGV4dCAhPSBudWxsKSB7Ci0JCQkJCQlJRFRvRXh0ZW5zaW9uTWFwLnB1dChJRCwgZXh0KTsKLQkJCQkJfQotCQkJCX0gCi0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyIGdldE1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyKCkgewotCQlJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIgcmV0ID0gKElNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlcikgZ2V0RXh0ZW5zaW9uKAotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgIm1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgb2JqZWN0IGJhc2VkIG9uIHR5cGUgYW5kIGNvbnRleHQgdGhyb3VnaCBleHRlbnNpb24KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHJldHVybiBjcmVhdGVkIG9iamVjdCBvciBudWxsIGlmIG5vIGV4dGVuc2lvbiBpcyBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZShDbGFzcyB0eXBlLCBPYmplY3QgY29udGV4dCkgewotCQlJT2JqZWN0RmFjdG9yeSByZXQgPSAoSU9iamVjdEZhY3RvcnkpIGdldEV4dGVuc2lvbigKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJvYmplY3RGYWN0b3J5Iik7Ly8kTk9OLU5MUy0xJAotCQlpZiAocmV0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXQuY3JlYXRlKHR5cGUsIGNvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIDxUPkxpc3Q8VD4gZ2V0RXh0ZW5zaW9ucyhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lLCBDbGFzczxUPiB0eXBlKSB7Ci0JCUxpc3Q8VD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKLQkJdHJ5IHsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCU9iamVjdCBleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQkJaWYodHlwZS5pc0luc3RhbmNlKGV4dCkpIHsKLQkJCQkJCQkJCWxpc3QuYWRkKChUKWV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy48VD5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9GaWxlVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmY3NGIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jazsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5PdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgbWFuYWdpbmcgZGlyZWN0b3JpZXMgYW5kIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0KLQkvKioKLQkgKiBQbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGxhdGZvcm0tc3BlY2lmaWMgZmlsZSBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5FX1NFUF9MRU5HVEggPSBMSU5FX1NFUC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIFVOQyBwYXRoIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNfUEFUSF9QUkVGSVggPSAiXFxcXCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVOQyBwYXRoIHByZWZpeCBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5DX1BBVEhfUFJFRklYX0xFTkdUSCA9IFVOQ19QQVRIX1BSRUZJWC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIElTTy04ODU5LTEgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfSVNPXzg4NTlfMSA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVVRGLTggZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVVRGXzggPSAiVVRGLTgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIEZpbGVVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggZm9yIGEgZmlsZSBvciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggZm9yIGEgZmlsZSBvciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCB0byBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKG5ldyBGaWxlKHBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBhIFVSTAotCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChVUkwgdXJsKSB7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IHVybC5nZXRGaWxlKCkuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgcmVzdWx0ID0gTmV0VXRpbC5kZWNvZGVVcmwocGF0aE5hbWUsIG51bGwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXJlbnREaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIChuZXcgRmlsZShwYXRoKSkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIGFuZCBleHRlbnNpb24gZnJvbSBhIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCBuYW1lCi0JICogQHJldHVybiB0aGUgZmlsZSBuYW1lIGluY2x1ZGluZyB0aGUgZmlsZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gZ2V0RmlsZU5hbWUocGF0aCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIGZyb20gYSBwYXRoLCB3aXRoIG9yIHdpdGhvdXQgdGhlIGZpbGUgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEBwYXJhbSB3aXRoRXh0ZW5zaW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW5jbHVkZSB0aGUgZmlsZSBleHRlbnNpb24gaW4gdGhlCi0JICogICAgICAgICAgICByZXN1bHQKLQkgKiBAcmV0dXJuIHRoZSBmaWxlIG5hbWUgd2l0aCBvciB3aXRob3V0IHRoZSBmaWxlIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBwYXRoLCBib29sZWFuIHdpdGhFeHRlbnNpb24pIHsKLQkJU3RyaW5nIG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0KLQkJaW50IHByZWZpeExlbmd0aCA9IDA7Ci0JCWlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKE5ldFV0aWwuRklMRV9VUklfUFJFRklYKSkgewotCQkJcHJlZml4TGVuZ3RoID0gTmV0VXRpbC5GSUxFX1VSSV9QUkVGSVhfTEVOR1RIOwotCQl9IGVsc2UgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoTmV0VXRpbC5IVFRQX1VSSV9QUkVGSVgpKSB7Ci0JCQlwcmVmaXhMZW5ndGggPSBOZXRVdGlsLkhUVFBfVVJJX1BSRUZJWF9MRU5HVEg7Ci0JCX0KLQotCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCWludCBpbmRleCA9IG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4IDwgcHJlZml4TGVuZ3RoKSB7Ci0JCQlmaWxlTmFtZSA9IG5vcm1hbGl6ZWRQYXRoLnN1YnN0cmluZyhwcmVmaXhMZW5ndGgpOwotCQl9IGVsc2UgewotCQkJZmlsZU5hbWUgPSBwYXRoLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0KLQkJaWYgKHdpdGhFeHRlbnNpb24pIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCi0JCWluZGV4ID0gZmlsZU5hbWUuaW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAoaW5kZXggPiAwKSA/IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCkgOiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwYXRoIG9mIGEgcGF0aCBmcm9tIGEgYmFzZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGgKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIHBhdGgKLQkgKiBAcmV0dXJuIGEgcmVsYXRpdmUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aFRvQmFzZShGaWxlIHBhdGgsIEZpbGUgYmFzZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBkaXIgPSBwYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZyBiYXNlRGlyID0gYmFzZVBhdGgudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChkaXIuaW5kZXhPZihiYXNlRGlyKSA9PSAwKSB7Ci0JCQkJU3RyaW5nIGRlbHRhID0gZGlyLnN1YnN0cmluZyhiYXNlRGlyLmxlbmd0aCgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKGRlbHRhLmNoYXJBdChpKSA9PSAnLycpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIi4uLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChGaWxlIHBhdGgsIEZpbGUgYmFzZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBkaXIgPSBwYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZyBiYXNlRGlyID0gYXBwZW5kU2VwYXJhdG9yKGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSwKLQkJCQkJIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXdoaWxlIChkaXIuaW5kZXhPZihiYXNlRGlyKSA9PSAtMSkgewotCQkJCWJhc2VQYXRoID0gYmFzZVBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQkJCWJhc2VEaXIgPSBhcHBlbmRTZXBhcmF0b3IoYmFzZVBhdGgudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpLAotCQkJCQkJIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoIi4uLyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gMCkgewotCQkJCVN0cmluZyBkZWx0YSA9IGRpci5zdWJzdHJpbmcoYmFzZURpci5sZW5ndGgoKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZChkZWx0YSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBhdGggc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIHBhdGggbmFtZSBhcHBlbmRlZCB3aXRoIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gYXBwZW5kU2VwYXJhdG9yKHBhdGgsIEZpbGUuc2VwYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBnaXZlbiBwYXRoIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIGEgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEBwYXJhbSBzZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGEgcGF0aCBzZXBhcmF0b3IKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIG5hbWUgYXBwZW5kZWQgd2l0aCB0aGUgZ2l2ZW4gc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kU2VwYXJhdG9yKFN0cmluZyBwYXRoLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKHNlcGFyYXRvcikgPyBwYXRoIDogcGF0aCArIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBlbmRpbmcgcGF0aCBzZXBhcmF0b3IgZnJvbSBhIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCBuYW1lCi0JICogQHJldHVybiB0aGUgcGF0aCBuYW1lIG1pbnVzIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBwYXRoLnN1YnN0cmluZygwLAotCQkJCXBhdGgubGVuZ3RoKCkgLSAxKSA6IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIHBhdGggbmFtZSBtaW51cyB0aGUgcGF0aCBzZXBhcmF0b3IgIlxcIiBvciAiLyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBbGxTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoIi8iKSB8fCBwYXRoLmVuZHNXaXRoKCJcXCIpID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpIDogcGF0aDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEBwYXJhbSBzZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGEgcGF0aCBzZXBhcmF0b3IKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIG5hbWUgbWludXMgdGhlIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVNlcGFyYXRvcihTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChzZXBhcmF0b3IpID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpCi0JCQkJOiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBmaWxlIG5hbWUgd2l0aCBhbm90aGVyIGluIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gb2xkRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgZmlsZSBuYW1lCi0JICogQHBhcmFtIG5ld0ZpbGVOYW1lCi0JICogICAgICAgICAgICB0aGUgbmV3IGZpbGUgbmFtZQotCSAqIEByZXR1cm4gdGhlIG5ldyBwYXRoIG5hbWUgd2l0aCB0aGUgbmV3IGZpbGUgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VGaWxlTmFtZShTdHJpbmcgcGF0aCwgU3RyaW5nIG9sZEZpbGVOYW1lLAotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2Yob2xkRmlsZU5hbWUpOwotCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgbmV3RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGZpbGUgZXh0ZW5zaW9uIHdpdGggYW5vdGhlciBpbiBhIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCBuYW1lCi0JICogQHBhcmFtIG9sZEZpbGVFeHQKLQkgKiAgICAgICAgICAgIHJoZSBvbGQgZmlsZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gbmV3RmlsZUV4dAotCSAqICAgICAgICAgICAgdGhlIG5ldyBmaWxlIGV4dGVuc2lvbgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYXRoIHdpdGggdGhlIG5ldyBmaWxlIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VFeHRlbnNpb24oU3RyaW5nIHBhdGgsIFN0cmluZyBvbGRFeHQsCi0JCQlTdHJpbmcgbmV3RXh0KSB7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2Yob2xkRXh0KTsKLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KSArIG5ld0V4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aCBvZiBhIGJhc2UgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBiYXNlIHBhdGggbmFtZQotCSAqIEBwYXJhbSBsb2NhbGVTdHIKLQkgKiAgICAgICAgICAgIGEgbG9jYWxlIHN0cmluZwotCSAqIEByZXR1cm4gdGhlIGxvY2FsZS1zcGVjaWZpYyBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxlUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIGxvY2FsZVN0cikgewotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKGxvY2FsZVN0cikpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKHBhdGgpOwotCQlyZXR1cm4gcmVwbGFjZUZpbGVOYW1lKHBhdGgsIGZpbGVOYW1lLCBsb2NhbGVTdHIgKyAiLyIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aCBvZiBhIGJhc2UgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBiYXNlIHBhdGggbmFtZQotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAgICAgICAgICAgIGEgbG9jYWxlIG9iamVjdAotCSAqIEByZXR1cm4gdGhlIGxvY2FsZS1zcGVjaWZpYyBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxlUGF0aChTdHJpbmcgcGF0aCwgTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gbG9jYWxlID09IG51bGwgPyBwYXRoIDogZ2V0TG9jYWxlUGF0aChwYXRoLCBsb2NhbGUudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBnaXZlbiB0ZXh0IHRvIGEgdGV4dCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlIG5hbWUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gd3JpdGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IHRvCi0JICogICAgICAgICBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0KSB7Ci0JCUZpbGVXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKLQkJCXdyaXRlci53cml0ZSh0ZXh0KTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod3JpdGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZmlsZSB3aXRoIFVURi04IGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlIG5hbWUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gd3JpdGUKLQkgKiBAcGFyYW0gYXBwZW5kCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgYXBwZW5kIHRoZSB0ZXh0IHRvIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICAgICBmaWxlLCBpZiA8Y29kZT5mYWxzZTwvY29kZT4sIG92ZXJyaWRlIHRoZSBmaWxlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSB0bwotCSAqICAgICAgICAgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZVVURjhGaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHdyaXRlVVRGOEZpbGUoZmlsZW5hbWUsIHRleHQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBhIGZpbGUgd2l0aCBVVEYtOCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIHdyaXRlCi0JICogQHBhcmFtIGFwcGVuZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGFwcGVuZCB0aGUgdGV4dCB0byB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgICAgZmlsZSwgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvdmVycmlkZSB0aGUgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHRleHQgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgdG8KLQkgKiAgICAgICAgIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGVVVEY4RmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0LAotCQkJYm9vbGVhbiBhcHBlbmQpIHsKLQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWxlT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUsIGFwcGVuZCk7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZpbGVPdXQsIEVOQ09ESU5HX1VURl84KTsKLQkJCXdyaXRlci53cml0ZSh0ZXh0KTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJZmlsZU91dC5mbHVzaCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZpbGVPdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZpbGVPdXQuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkkgdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgc291cmNlIFVSSQotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShTdHJpbmcgdXJpLCBPdXRwdXRTdHJlYW0gb3V0cHV0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IE5ldFV0aWwuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQkJCWludCBieXRlc1JlYWQ7Ci0JCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCQl3aGlsZSAoKGJ5dGVzUmVhZCA9IGlucHV0LnJlYWQoYnVmLCAwLCA0MDk2KSkgPiAwKSB7Ci0JCQkJb3V0cHV0LndyaXRlKGJ1ZiwgMCwgYnl0ZXNSZWFkKTsKLQkJCX0KLQkJCW91dHB1dC5mbHVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIFVSSSB0byBhIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgc291cmNlIFVSSQotCSAqIEBwYXJhbSB3cml0ZXIKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShTdHJpbmcgdXJpLCBQcmludFdyaXRlciBwdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJbnB1dFN0cmVhbVJlYWRlciBpbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihOZXRVdGlsLmdldElucHV0U3RyZWFtKHVyaSkpOwotCQkJaW50IGNoYXJzUmVhZDsKLQkJCWNoYXJbXSBidWYgPSBuZXcgY2hhcls0MDk2XTsKLQkJCXdoaWxlICgoY2hhcnNSZWFkID0gaW5wdXQucmVhZChidWYsIDAsIDQwOTYpKSA+IDApIHsKLQkJCQlwdy53cml0ZShidWYsIDAsIGNoYXJzUmVhZCk7Ci0JCQl9Ci0JCQlwdy5mbHVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVjdXJzaXZlbHkgZGVsZXRlIGFsbCBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGluIGEgZGlyZWN0b3J5IGV4Y2VwdAotCSAqIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWxldGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlQWxsRmlsZXMoU3RyaW5nIGRpcikgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCUZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoZGlyKTsKLQkJRmlsZVtdIGZpbGVzID0gdGFyZ2V0RGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXJldCA9IHJldCAmJiBkZWxldGVBbGxGaWxlcyhmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJfQotCQkJCXJldCA9IHJldCAmJiBmaWxlc1tpXS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmVjdXJzaXZlbHkgZGVsZXRlIGFsbCBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGluIGEgZGlyZWN0b3J5IGV4Y2VwdAotCSAqIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZiBhbmQgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcwotCSAqIEBwYXJhbSBmaWxlc05vdFRvRGVsZXRlCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBkZWxldGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlQWxsRmlsZXMoU3RyaW5nIGRpciwgTGlzdDxGaWxlPiBmaWxlc05vdFRvRGVsZXRlKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShkaXIpOwotCQlGaWxlW10gZmlsZXMgPSB0YXJnZXREaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFmaWxlc05vdFRvRGVsZXRlLmNvbnRhaW5zKGZpbGVzW2ldKSkgewotCQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJcmV0ID0gcmV0Ci0JCQkJCQkJCSYmIGRlbGV0ZUFsbEZpbGVzKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpLAotCQkJCQkJCQkJCWZpbGVzTm90VG9EZWxldGUpOwotCQkJCQl9Ci0JCQkJCXJldCA9IHJldCAmJiBmaWxlc1tpXS5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gdGhlIHRhcmdldCBmaWxlLiBXaWxsIG92ZXJ3cml0ZQotCSAqIGFuIGV4aXN0aW5nIGZpbGUgaWYgaXQgaGFzIHdyaXRlIHBlcm1pc3Npb24KLQkgKiAKLQkgKiBAcGFyYW0gc3JjRmlsZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlIG9yIHBhdGgKLQkgKiBAcGFyYW0gdGd0RmlsZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlIG9yIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weUZpbGUoRmlsZSBzcmNGaWxlLCBGaWxlIHRndEZpbGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb3B5ZmlsZShzcmNGaWxlLCB0Z3RGaWxlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgdGFyZ2V0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNyY0ZpbGVOYW1lCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGZpbGUgbmFtZQotCSAqIEBwYXJhbSB0Z3RGaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weUZpbGUoU3RyaW5nIHNyY0ZpbGVOYW1lLCBTdHJpbmcgdGd0RmlsZU5hbWUpIHsKLQkJcmV0dXJuIGNvcHlGaWxlKG5ldyBGaWxlKHNyY0ZpbGVOYW1lKSwgbmV3IEZpbGUodGd0RmlsZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgb25lIGZpbGUgdG8gYW5vdGhlci4KLQkgKiA8cD4KLQkgKiBJZiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGRpcmVjdG9yaWVzLCBkZWxlZ2F0ZXMgdG8KLQkgKiBjb3B5ZGlyZWN0b3J5KCkuCi0JICogPHA+Ci0JICogc291cmNlIG11c3QgZXhpc3QgYW5kIGJlIHJlYWRhYmxlCi0JICogPHA+Ci0JICogY2Fubm90IGNvcHkgYSBkaXJlY3RvcnkgdG8gYSBmaWxlCi0JICogPHA+Ci0JICogd2lsbCBub3QgY29weSBpZiB0aW1lc3RhbXBzIGFuZCBmaWxlc2l6ZSBtYXRjaCwgd2lsbCBvdmVyd3JpdGUgb3RoZXJ3aXNlCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGRlc3QKLQkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBmaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGNvcHkgb3BlcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb3B5ZmlsZShGaWxlIHNvdXJjZSwgRmlsZSBkZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc291cmNlLmVxdWFscyhkZXN0KSkKLQkJCS8vIGRvIG5vdCBjb3B5IGVxdWFsIGZpbGVzCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCFzb3VyY2UuZXhpc3RzKCkgfHwgIXNvdXJjZS5jYW5SZWFkKCkpIHsKLQkJCS8vIHNvdXJjZSBkb2VzIG5vdCBleGlzdCBvciBjYW4ndCByZWFkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGVzdC5leGlzdHMoKSAmJiAhZGVzdC5jYW5Xcml0ZSgpKSB7Ci0JCQkvLyBkZXN0IGV4aXN0cyBhbmQgY2Fubm90IGJlIHdyaXR0ZW4KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChzb3VyY2UuaXNEaXJlY3RvcnkoKSkgewotCQkJaWYgKGRlc3QuaXNGaWxlKCkpIHsKLQkJCQkvLyBjYW4ndCBjb3B5IGEgZGlyZWN0b3J5IHRvIGEgZmlsZQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZGVsZWdhdGUgdG8gY29weWRpcmVjdG9yeQotCQkJCXJldHVybiBjb3B5ZGlyZWN0b3J5KHNvdXJjZSwgZGVzdCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzb3VyY2UgaXMgYSBmaWxlCi0JCQlpZiAoZGVzdC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHNvdXJjZUZpbGVOYW1lID0gc291cmNlLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gY29weWZpbGUoc291cmNlLCBuZXcgRmlsZShkZXN0LCBzb3VyY2VGaWxlTmFtZSkpOwotCQkJfQotCQkJLy8gYm90aCBzb3VyY2UgYW5kIGRlc3QgYXJlIGZpbGVzCi0JCQlib29sZWFuIG5lZWRDb3B5ID0gdHJ1ZTsKLQkJCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQkJbmVlZENvcHkgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCQl8fCAoZGVzdC5sZW5ndGgoKSAhPSBzb3VyY2UubGVuZ3RoKCkpOwotCQkJfQotCi0JCQlpZiAobmVlZENvcHkpIHsKLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLQotCQkJCXRyeSB7Ci0JCQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotCQkJCQlGaWxlQ2hhbm5lbCBpbiA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCQkJaWYgKCFkZXN0LmV4aXN0cygpKSB7Ci0JCQkJCQlkZXN0LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQkJfQotCQkJCQlvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKLQkJCQkJRmlsZUNoYW5uZWwgb3V0ID0gb3V0cHV0LmdldENoYW5uZWwoKTsKLQkJCQkJb3V0LnRyYW5zZmVyRnJvbShpbiwgMCwgc291cmNlLmxlbmd0aCgpKTsKLQkJCQkJZGVzdC5zZXRMYXN0TW9kaWZpZWQoc291cmNlLmxhc3RNb2RpZmllZCgpKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGRpZCBub3QgY29weQotCQkJCS8vIHJldHVybiB0cnVlIGJlY2F1c2UgZGVzdCBmaWxlIGlzIHNhbWUgYXMgc291cmNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgdG8gYW5vdGhlciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHNyY0Rpck5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZGlyZWN0b3J5IG5hbWUKLQkgKiBAcGFyYW0gdGd0RGlyTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5RGlyKEZpbGUgc3JjRGlyLCBGaWxlIHRndERpcikgewotCQl0cnkgewotCQkJcmV0dXJuIGNvcHlkaXJlY3Rvcnkoc3JjRGlyLCB0Z3REaXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgdG8gYW5vdGhlciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHNyY0Rpck5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZGlyZWN0b3J5IG5hbWUKLQkgKiBAcGFyYW0gdGd0RGlyTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5RGlyKFN0cmluZyBzcmNEaXJOYW1lLCBTdHJpbmcgdGd0RGlyTmFtZSkgewotCQlyZXR1cm4gY29weURpcihuZXcgRmlsZShzcmNEaXJOYW1lKSwgbmV3IEZpbGUodGd0RGlyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBvbmUgZGlyZWN0b3J5IHRvIGFub3RoZXIgLSBvcGVyYXRlcyBPTkxZIG9uIGRpcmVjdG9yaWVzLgotCSAqIDxwPgotCSAqIEJvdGggc291cmNlIGFuZCBkZXN0IG11c3QgZXhpc3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb3B5ZGlyZWN0b3J5KEZpbGUgc291cmNlRGlyLCBGaWxlIGRlc3REaXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIXNvdXJjZURpci5leGlzdHMoKSB8fCAhZGVzdERpci5leGlzdHMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFzb3VyY2VEaXIuaXNEaXJlY3RvcnkoKSB8fCAhZGVzdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlGaWxlW10gZmlsZXMgPSBzb3VyY2VEaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gY2FsYyBkZXN0aW5hdGlvbiBuYW1lCi0JCQkJU3RyaW5nIGRlc3ROYW1lID0gZGVzdERpcgotCQkJCQkJKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJKyBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoCi0JCQkJCQkJCXNvdXJjZURpci5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDEpOwotCQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSkgewotCQkJCQkvLyBjb3B5IHRoZSBmaWxlCi0JCQkJCWNvcHlmaWxlKGZpbGVzW2ldLCBuZXcgRmlsZShkZXN0TmFtZSkpOwotCQkJCX0gZWxzZSBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQkvLyBjb3B5IGRpcmVjdG9yeSByZWN1cnNpdmVseQotCQkJCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdE5hbWUpOwotCQkJCQlkZXN0RmlsZS5ta2RpcnMoKTsKLQkJCQkJY29weWRpcmVjdG9yeShmaWxlc1tpXSwgZGVzdEZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBmb3Igc29tZSByZWFzb24sIHRoaXMgZ3V5IGxvY2tzIHRoZSBmaWxlLCBpZiB5b3UgdHJ5IHRvIHVwZGF0ZSB0aGUgZmlsZSwKLQkvLyBnb3QgdGhlIGZvbGxvd2luZyBleGNlcHRpb24KLQkvLyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjoKLQkvLyAoVGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIGZpbGUgd2l0aCBhIHVzZXItbWFwcGVkCi0JLy8gc2VjdGlvbiBvcGVuKQotCS8vIG5lZWQgdG8gaGFuZGxlIGxhdGVyCi0JcHVibGljIHN0YXRpYyBDaGFyQnVmZmVyIHJlYWRGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJQ2hhckJ1ZmZlciBjaGFyQnVmZmVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCUZpbGVDaGFubmVsIGluQ2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCWludCBsZW5ndGggPSAoaW50KSBpbkNoYW5uZWwuc2l6ZSgpOwotCQkJTWFwcGVkQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gaW5DaGFubmVsLm1hcCgKLQkJCQkJRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGxlbmd0aCk7Ci0JCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoRU5DT0RJTkdfSVNPXzg4NTlfMSk7Ci0JCQlDaGFyc2V0RGVjb2RlciBkZWNvZGVyID0gY2hhcnNldC5uZXdEZWNvZGVyKCk7Ci0JCQljaGFyQnVmZmVyID0gZGVjb2Rlci5kZWNvZGUoYnl0ZUJ1ZmZlcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hhckJ1ZmZlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciByZWFkRmlsZShGaWxlIGZpbGUsIFN0cmluZyBlbmNvZGluZykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCWludCBzaXplOwotCQl0cnkgewotCQkJQ2hhcnNldCBjcyA9IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZyk7Ci0JCQlDaGFyc2V0RGVjb2RlciBjc2QgPSBjcy5uZXdEZWNvZGVyKCk7Ci0JCQljc2Qub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsxMDI0XTsKLQkJCWZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCBjc2QpOwotCQkJd2hpbGUgKChzaXplID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCAxMDI0KSkgPiAwKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChidWZmZXIsIDAsIHNpemUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGVuY29kaW5nKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZmlzICE9IG51bGwpIHsKLQkJCQlmaXMuY2xvc2UoKTsKLQkJCX0KLQotCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0U2l6ZShGaWxlIGZpbGUpIHsKLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJcmV0dXJuIGZpcy5nZXRDaGFubmVsKCkuc2l6ZSgpOwkJCQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlmaXMuY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlcyBKYXZhIDEuNCdzIEZpbGVMb2NrIGNsYXNzIHRvIHRlc3QgZm9yIGEgZmlsZSBsb2NrCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZUxvY2tlZChGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpc0xvY2tlZCA9IGZhbHNlOwotCQlGaWxlT3V0cHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJRmlsZUxvY2sgbG9jayA9IG51bGw7Ci0KLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQotCQkJbG9jayA9IGZpbGVDaGFubmVsLnRyeUxvY2soKTsKLQotCQkJaWYgKGxvY2sgPT0gbnVsbCkKLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCQllbHNlCi0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFNlY3VyaXR5RXhjZXB0aW9uKQotCQkJCS8vIENhbid0IHdyaXRlIHRvIGZpbGUuCi0JCQkJaXNMb2NrZWQgPSB0cnVlOwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikKLQkJCQlpc0xvY2tlZCA9IGZhbHNlOwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotCQkJCWlzTG9ja2VkID0gdHJ1ZTsKLQkJCS8vIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24gbWVhbnMgdGhhdCB0aGlzIEpWTSBoYXMgaXQgbG9ja2VkCi0JCQkvLyB0aGVyZWZvcmUgaXQgaXMgbm90IGxvY2tlZCB0byB1cwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24pCi0JCQkJaXNMb2NrZWQgPSBmYWxzZTsKLQkJCS8vIENvdWxkIG5vdCBnZXQgYSBsb2NrIGZvciBzb21lIG90aGVyIHJlYXNvbi4KLQkJCWVsc2UKLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0xvY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiBMb2NrcyBhIGZpbGUgZm9yIHRoZSBjdXJyZW50IEpWTS4gV2lsbCBjcmVhdGUgdGhlIGZpbGUgaWYgaXQgZG9lcyBub3QKLQkgKiBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBhIEZpbGVMb2NrIG9iamVjdCwgb3IgbnVsbCBpZiBmaWxlIGNvdWxkIG5vdCBiZSBsb2NrZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGVMb2NrIGxvY2tGaWxlKEZpbGUgZmlsZSkgewotCQlGaWxlT3V0cHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJRmlsZUxvY2sgbG9jayA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQlsb2NrID0gZmlsZUNoYW5uZWwudHJ5TG9jaygpOwotCi0JCQlpZiAobG9jay5pc1ZhbGlkKCkpCi0JCQkJcmV0dXJuIGxvY2s7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDb3VsZCBub3QgZ2V0IGEgbG9jayBmb3Igc29tZSByZWFzb24uCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgKGxvY2sgPT0gbnVsbCB8fCAhbG9jay5pc1ZhbGlkKCkpKSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZmlsZXMgaW4gYSBzcGVjaWZpZWQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCBvZiBhIGZvbGRlcgotCSAqIEBwYXJhbSBmaWxlTGlzdAotCSAqICAgICAgICAgICAgYSBsaXN0IHRvIGNvbGxlY3QgdGhlIGZpbGVzCi0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbmQgdGhlIGZpbGVzIGluIHN1YiBmb2xkZXJzIGFzIHdlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsRmlsZXMoRmlsZSBwYXRoLCBMaXN0PEZpbGU+IGZpbGVMaXN0LAotCQkJYm9vbGVhbiByZWN1cnNpdmUpIHsKLQkJaWYgKHBhdGguaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gcGF0aC5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQkJCWZpbGVMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQkJCX0gZWxzZSBpZiAocmVjdXJzaXZlKSB7Ci0JCQkJCQlnZXRBbGxGaWxlcyhmaWxlc1tpXSwgZmlsZUxpc3QsIHJlY3Vyc2l2ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uLCByZXR1cm5zIGFsbCBmaWxlcyAocmVjdXJzaXZlbHkpIHdob3NlCi0JICogZXh0ZW5zaW9uIHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIGEgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIGEgY29sbGVjaXRvbiBvZiA8Y29kZT5GaWxlPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RmlsZT4gZmlsZUxpc3QoRmlsZSBmLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWV4dGVuc2lvbiA9IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpOwotCQlMaXN0PEZpbGU+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nW10gZmxpc3QgPSBmLmxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgKytpKSB7Ci0JCQkJCUZpbGUgZmMgPSBuZXcgRmlsZShmLmdldFBhdGgoKSwgZmxpc3RbaV0pOwotCQkJCQlyZXR1cm5MaXN0LmFkZEFsbChmaWxlTGlzdChmYywgZXh0ZW5zaW9uKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJCQlpZiAobmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAobmFtZQotCQkJCQkJCQkuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpLnN0YXJ0c1dpdGgoZXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuTGlzdC5hZGQoZik7Ci0JCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uLCByZXR1cm5zIGFsbCBmaWxlcyAocmVjdXJzaXZlbHkpIHdob3NlCi0JICogZXh0ZW5zaW9uIGRvZXMgbm90IHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIGEgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIGEgY29sbGVjaXRvbiBvZiA8Y29kZT5GaWxlPC9jb2RlPiB3aXRob3V0IHRoZSBnaXZlbiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RmlsZT4gZmlsZUxpc3RFeGNsdWRlRXh0KEZpbGUgZiwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlMaXN0PEZpbGU+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nW10gZmxpc3QgPSBmLmxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgKytpKSB7Ci0JCQkJCUZpbGUgZmMgPSBuZXcgRmlsZShmLmdldFBhdGgoKSwgZmxpc3RbaV0pOwotCQkJCQlyZXR1cm5MaXN0LmFkZEFsbChmaWxlTGlzdEV4Y2x1ZGVFeHQoZmMsIGV4dGVuc2lvbikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7Ci0JCQkJCWlmIChuYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICghKG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpLnN0YXJ0c1dpdGgoZXh0ZW5zaW9uKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZmlsZSBwYXRocyBpbiB0aGUgc3BlY2lmaWVkIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgsCi0JICogICAgICAgICAgICBhYnNvbHV0ZSBwYXRoIG9mIGEgZm9sZGVyCi0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbmQgdGhlIGZpbGVzIGluIHN1YiBmb2xkZXJzIGFzIHdlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxTdHJpbmc+IGdldEFsbEZpbGVBYnNvbHV0ZVBhdGhzKEZpbGUgcGF0aCwKLQkJCWJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0JCUFycmF5TGlzdDxGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLQkJZ2V0QWxsRmlsZXMocGF0aCwgZmlsZXMsIHJlY3Vyc2l2ZSk7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBhYnNQYXRoID0gKChGaWxlKSBmaWxlcy5nZXQoaSkpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aHMuYWRkKGFic1BhdGgpOwotCQl9Ci0JCXJldHVybiBwYXRoczsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyBhIGZpbGUgZnJvbSBhIGRpcmVjdG9yeSB0byBhbm90aGVyLgotCSAqIDxwPgotCSAqIEF0dGVtcHRzIHRvIHJlbmFtZSB0aGUgZmlsZSBmaXJzdC4gSWYgdGhhdCBmYWlscywgd2lsbCBjb3B5IHRoZQotCSAqIHNvdXJjZUZpbGUgdG8gZGVzdEZpbGUgYW5kIGRlbGV0ZSB0aGUgc291cmNlRmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGRlc3RGaWxlCi0JICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbW92ZUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlkb01vdmVGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb01vdmVGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVHJ5IHRvIHJlbmFtZSB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUuCi0JCWlmICghc291cmNlRmlsZS5yZW5hbWVUbyhkZXN0RmlsZSkpIHsKLQkJCS8vIFRyeSB0byBjb3B5IHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgZGVzdGluYXRpb24gZmlsZSBhbmQKLQkJCS8vIGRlbGV0ZQotCQkJLy8gdGhlIHNvdXJjZSBmaWxlLgotCQkJY29weWZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUpOwotCQkJc291cmNlRmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0kxOG5VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0kxOG5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjY2YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JMThuVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbHRpaWVzIGZvciBoYW5kbGluZyBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJMThuVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBJMThuVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgU3RyaW5nIGtleSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsCi0JCQlTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkU3RyID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQobG9jYWxpemVkU3RyLCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIHR3byBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YTEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcGFyYW0gZGF0YTIKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0IGRhdGExLCBPYmplY3QgZGF0YTIpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFN0ciA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChsb2NhbGl6ZWRTdHIsIG5ldyBPYmplY3RbXSB7IGRhdGExLAotCQkJCQkJZGF0YTIgfSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2Ygb2JqZWN0cy4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0W10gZGF0YSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkU3RyID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGxvY2FsaXplZFN0ciwgZGF0YSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSByZXNvdXJjZSBrZXkgY2Fubm90IGJlCi0JICogICAgICAgICAgICBsb2NhdGVkLgotCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgaW50ZXJnZXIgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KFN0cmluZyBpbnRTdHJpbmcsCi0JCQlpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW50U3RyaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChpbnRTdHJpbmcpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHZlcnNpb24gb2YgYSBVUyBFbmdsaXNoIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZS4KLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBBIGxvY2FsZS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgcmVzb3VyY2UgZmlsZS4gSWYgbm9uZSBleGlzdHMsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsaXplZEZpbGUoU3RyaW5nIHBhdGgsIExvY2FsZSBsb2NhbGUpIHsKLQkJaWYgKGxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSB8fCBwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQnVpbGQgdGhlIGxvY2FsZSBzdHJpbmcgYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlCi0JCS8vIGxvY2FsaXplZCBmaWxlIG5hbWVzLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwotCQlTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0KLQkJU3RyaW5nW10gbG9jYWxlU3RycyA9IG5ldyBTdHJpbmdbM107Ci0JCWlmICh2YXJpYW50ICE9IG51bGwgJiYgdmFyaWFudC5sZW5ndGgoKSA+IDApIHsKLQkJCWxvY2FsZVN0cnNbMF0gPSBsb2NhbGUudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoY291bnRyeSAhPSBudWxsICYmIGNvdW50cnkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsb2NhbGVTdHJzWzFdID0gbGFuZ3VhZ2UgKyAiXyIgKyBjb3VudHJ5OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLQkJCWxvY2FsZVN0cnNbMl0gPSBsYW5ndWFnZTsKLQkJfQotCi0JCVN0cmluZyBkaXIgPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJU3RyaW5nIGZpbGVOYW1lOwotCi0JCWludCBwYXRoSW5kZXggPSBkaXIubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGF0aEluZGV4ID4gMCkgewotCQkJZGlyID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aEluZGV4ICsgMSk7Ci0JCQlmaWxlTmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhdGhJbmRleCArIDEpOwotCQl9IGVsc2UgewotCQkJZmlsZU5hbWUgPSBkaXI7Ci0JCQlkaXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIGZpbGVFeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAkJCi0JCWludCBleHRJbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4dEluZGV4ID4gMCkgewotCQkJZmlsZUV4dCA9IGZpbGVOYW1lLnN1YnN0cmluZyhleHRJbmRleCk7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBleHRJbmRleCk7Ci0JCX0KLQotCQlmaWxlTmFtZSA9IGRpciArIGZpbGVOYW1lICsgIl8iOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTG9vayBmb3IgdGhlIGxvY2FsaXplZCBmaWxlLgotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGxvY2FsZVN0cnNbaV0gIT0gbnVsbCkgewotCQkJCS8vIEdldHMgdGhlIGxvY2FsaXplZCBwYXRoIG5hbWUuCi0JCQkJU3RyaW5nIGZuYW1lID0gZmlsZU5hbWUgKyBsb2NhbGVTdHJzW2ldICsgZmlsZUV4dDsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmbmFtZSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZuYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSU1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDMxMzVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSU1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotCi0vKioKLSogSW50ZXJmYWNlIGZvciBhZGRpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIG1hcmtlcnMgCi0qIAotKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSogQHNpbmNlICAxLjUKLSovCi1wdWJsaWMgaW50ZXJmYWNlIElNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciB7Ci0KLQl2b2lkIGFkZEFkZHRpb25hbEF0dHJpYnV0ZXMoSU1hcmtlciBtYXJrZXIsIE9iamVjdCBjb250ZXh0KTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSU9iamVjdEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSU9iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MjExYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lPYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotKiBJbnRlcmZhY2UgdG8gY3JlYXRlIG9iamVjdCBiYXNlZCBvbiB0eXBlIGFuZCBjb250ZXh0IAotKiAKLSogQGF1dGhvciBXZWlwaW5nIEx1Ci0qIEBzaW5jZSAgMS41Ci0qLwotcHVibGljIGludGVyZmFjZSBJT2JqZWN0RmFjdG9yeSB7Ci0KLQlPYmplY3QgY3JlYXRlKENsYXNzIHR5cGUsIE9iamVjdCBjb250ZXh0KTsKLQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JbWFnZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSW1hZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzBiYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JbWFnZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5NZWRpYVRyYWNrZXI7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5Gb250UmVuZGVyQ29udGV4dDsKLWltcG9ydCBqYXZhLmF3dC5mb250LkxpbmVCcmVha01lYXN1cmVyOwotaW1wb3J0IGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZhLmF3dC5mb250LlRleHRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZ2VvbS5Qb2ludDJEOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZFN0cmluZzsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGNyZWF0aW5nIGltYWdlIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlVXRpbCB7Ci0KLQkvLyBUaGUgQnVmZmVyZWRJbWFnZSBjYWNoZS4KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgQnVmZmVyZWRJbWFnZT4gaW1hZ2VDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQnVmZmVyZWRJbWFnZT4oKTsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIEltYWdlVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+QnVmZmVyZWRJbWFnZTwvY29kZT4gZnJvbSB0aGUgZ2l2ZW4gaW1hZ2UgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlCi0JICogICAgICAgICAgICBhbiBpbWFnZSBmaWxlCi0JICogQHBhcmFtIGMKLQkgKiAgICAgICAgICAgIGFuIEFXVCBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgZ2V0QnVmZmVyZWRJbWFnZShTdHJpbmcgaW1hZ2VGaWxlLCBDb21wb25lbnQgYykgewotCQlpZiAoaW1hZ2VGaWxlID09IG51bGwgfHwgYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSA9IChCdWZmZXJlZEltYWdlKSBpbWFnZUNhY2hlLmdldChpbWFnZUZpbGUpOwotCQlpZiAoYnVmZmVyZWRJbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQkJfQotCi0JCUltYWdlIGltYWdlID0gYy5nZXRUb29sa2l0KCkuZ2V0SW1hZ2UoaW1hZ2VGaWxlKTsKLQkJTWVkaWFUcmFja2VyIHRyYWNrZXIgPSBuZXcgTWVkaWFUcmFja2VyKGMpOwotCQl0cmFja2VyLmFkZEltYWdlKGltYWdlLCAwKTsKLQkJdHJ5IHsKLQkJCXRyYWNrZXIud2FpdEZvckFsbCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlidWZmZXJlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoaW1hZ2UuZ2V0V2lkdGgoYyksCi0JCQkJaW1hZ2UuZ2V0SGVpZ2h0KGMpLCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOwotCi0JCUdyYXBoaWNzMkQgZzJkID0gYnVmZmVyZWRJbWFnZS5jcmVhdGVHcmFwaGljcygpOwotCQlnMmQuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBjKTsKLQkJaW1hZ2VDYWNoZS5wdXQoaW1hZ2VGaWxlLCBidWZmZXJlZEltYWdlKTsKLQotCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBpbWFnZSBpcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gQVdUIGltYWdlCi0JICogQHBhcmFtIGMKLQkgKiAgICAgICAgICAgIGFuIEFXVCBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2FpdEZvckltYWdlKEltYWdlIGltYWdlLCBDb21wb25lbnQgYykgewotCQlNZWRpYVRyYWNrZXIgdHJhY2tlciA9IG5ldyBNZWRpYVRyYWNrZXIoYyk7Ci0JCXRyYWNrZXIuYWRkSW1hZ2UoaW1hZ2UsIDApOwotCQl0cnkgewotCQkJdHJhY2tlci53YWl0Rm9yQWxsKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCX0KLQkJcmV0dXJuICghdHJhY2tlci5pc0Vycm9yQW55KCkpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBnMmQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5HcmFwaGljczJEPC9jb2RlPiBjb250ZXh0Ci0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkCi0JICogQHBhcmFtIGZvbnQKLQkgKiAgICAgICAgICAgIHRoZSBmb250IHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGNvbG9yIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSB4Ci0JICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSB5Ci0JICogICAgICAgICAgICB0aGUgdmVydGljYWxjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkcmF3VGV4dChHcmFwaGljczJEIGcyZCwgU3RyaW5nIHRleHQsIEZvbnQgZm9udCwKLQkJCUNvbG9yIGNvbG9yLCBpbnQgeCwgaW50IHkpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlnMmQuc2V0Q29sb3IoY29sb3IpOwotCQlGb250UmVuZGVyQ29udGV4dCBmcmMgPSBnMmQuZ2V0Rm9udFJlbmRlckNvbnRleHQoKTsKLQkJVGV4dExheW91dCB0ZXh0bGF5b3V0ID0gbmV3IFRleHRMYXlvdXQodGV4dCwgZm9udCwgZnJjKTsKLQkJdGV4dGxheW91dC5kcmF3KGcyZCwgeCwgeSk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGdpdmVuIHRleHQgYW5kIHdyYXBzIGl0IGJhc2VkIG9uIHRoZSBnaXZlbiB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZzJkCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+R3JhcGhpY3MyRDwvY29kZT4gY29udGV4dAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSByZW5kZXJlZAotCSAqIEBwYXJhbSBmb250Ci0JICogICAgICAgICAgICB0aGUgZm9udCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSBjb2xvciB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0geAotCSAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHdpZHRoIHVzZWQgZm9yIHdyYXBwaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIG1heExpbmUKLQkgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lIG9mIHdyYXBwZWQgdGV4dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkcmF3VGV4dChHcmFwaGljczJEIGcyZCwgU3RyaW5nIHRleHQsIEZvbnQgZm9udCwKLQkJCUNvbG9yIGNvbG9yLCBpbnQgeCwgaW50IHksIGZsb2F0IHdpZHRoLCBpbnQgbWF4TGluZSkgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZsb2F0IG1heFdyYXBXaWR0aCA9IHdpZHRoIC0gMTA7Ci0JCWcyZC5zZXRDb2xvcihjb2xvcik7Ci0JCVBvaW50MkQuRmxvYXQgcGVuID0gbmV3IFBvaW50MkQuRmxvYXQoeCwgeSk7Ci0JCU1hcDxUZXh0QXR0cmlidXRlLCBGb250PiBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8VGV4dEF0dHJpYnV0ZSwgRm9udD4oKTsKLQkJYXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5GT05ULCBmb250KTsKLQkJQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRleHRJdGVyYXRvciA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHRleHQsCi0JCQkJYXR0cmlidXRlcykuZ2V0SXRlcmF0b3IoKTsKLQkJRm9udFJlbmRlckNvbnRleHQgZnJjID0gZzJkLmdldEZvbnRSZW5kZXJDb250ZXh0KCk7Ci0JCUxpbmVCcmVha01lYXN1cmVyIG1lYXN1cmVyID0gbmV3IExpbmVCcmVha01lYXN1cmVyKHRleHRJdGVyYXRvciwgZnJjKTsKLQkJaW50IGxpbmUgPSAxOwotCQl3aGlsZSAobGluZSA8PSBtYXhMaW5lKSB7Ci0JCQlUZXh0TGF5b3V0IGxheW91dCA9IG1lYXN1cmVyLm5leHRMYXlvdXQobWF4V3JhcFdpZHRoKTsKLQkJCWlmIChsYXlvdXQgPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCXBlbi55ICs9IGxheW91dC5nZXRBc2NlbnQoKTsKLQkJCWZsb2F0IGR4ID0gMDsKLQkJCWlmIChsYXlvdXQuaXNMZWZ0VG9SaWdodCgpKSB7Ci0JCQkJZHggPSAod2lkdGggLSBsYXlvdXQuZ2V0QWR2YW5jZSgpKTsKLQkJCX0KLQkJCWxheW91dC5kcmF3KGcyZCwgcGVuLnggKyBkeCAvIDIsIHBlbi55KTsKLQkJCXBlbi55ICs9IGxheW91dC5nZXREZXNjZW50KCkgKyBsYXlvdXQuZ2V0TGVhZGluZygpIC0gMTsKLQkJCWxpbmUrKzsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NYXRoVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NYXRoVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzA3NGZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWF0aFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcGVyZm9ybWluZyBtYXRoIG9wZXJhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXRoVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgY2VpbDEwMDAobG9uZyBsKSB7Ci0JCXJldHVybiAobCAtIChsICYgNykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9OZXRVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL05ldFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyZDE1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL05ldFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi0vKioKLSAqIEltcGxlbWVudHMgYSB1dGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBVUkxzIGFuZCBVUklzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ldFV0aWwgewotCi0JLyoqCi0JICogRklMRSBzY2hlbWUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbGUgVVJJIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1VSSV9QUkVGSVggPSBGSUxFX1NDSEVNRSArICI6LyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbGUgVVJJIHByZWZpeCBzaXplLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJTEVfVVJJX1BSRUZJWF9MRU5HVEggPSBGSUxFX1VSSV9QUkVGSVgubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBIVFRQIHNjaGVtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVFRQX1NDSEVNRSA9ICJodHRwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSFRUUCBVUkkgcHJlZml4LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUVFBfVVJJX1BSRUZJWCA9IEhUVFBfU0NIRU1FICsgIjovLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEhUVFAgVVJJIHByZWZpeCBzaXplLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfVVJJX1BSRUZJWF9MRU5HVEggPSBIVFRQX1VSSV9QUkVGSVgubGVuZ3RoKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWF8yID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWF8zID0gImZpbGU6Ly8vIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSB0YWJsZSBvZiBoZXggdmFsdWVzLgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIEhFWF9WQUxVRVMgPSB7Ci0JCQkiJTAwIiwgIiUwMSIsICIlMDIiLCAiJTAzIiwgIiUwNCIsICIlMDUiLCAiJTA2IiwgIiUwNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUwOCIsICIlMDkiLCAiJTBBIiwgIiUwQiIsICIlMEMiLCAiJTBEIiwgIiUwRSIsICIlMEYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMTAiLCAiJTExIiwgIiUxMiIsICIlMTMiLCAiJTE0IiwgIiUxNSIsICIlMTYiLCAiJTE3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTE4IiwgIiUxOSIsICIlMUEiLCAiJTFCIiwgIiUxQyIsICIlMUQiLCAiJTFFIiwgIiUxRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUyMCIsICIlMjEiLCAiJTIyIiwgIiUyMyIsICIlMjQiLCAiJTI1IiwgIiUyNiIsICIlMjciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMjgiLCAiJTI5IiwgIiUyQSIsICIlMkIiLCAiJTJDIiwgIiUyRCIsICIlMkUiLCAiJTJGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTMwIiwgIiUzMSIsICIlMzIiLCAiJTMzIiwgIiUzNCIsICIlMzUiLCAiJTM2IiwgIiUzNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUzOCIsICIlMzkiLCAiJTNBIiwgIiUzQiIsICIlM0MiLCAiJTNEIiwgIiUzRSIsICIlM0YiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNDAiLCAiJTQxIiwgIiU0MiIsICIlNDMiLCAiJTQ0IiwgIiU0NSIsICIlNDYiLCAiJTQ3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTQ4IiwgIiU0OSIsICIlNEEiLCAiJTRCIiwgIiU0QyIsICIlNEQiLCAiJTRFIiwgIiU0RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU1MCIsICIlNTEiLCAiJTUyIiwgIiU1MyIsICIlNTQiLCAiJTU1IiwgIiU1NiIsICIlNTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNTgiLCAiJTU5IiwgIiU1QSIsICIlNUIiLCAiJTVDIiwgIiU1RCIsICIlNUUiLCAiJTVGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTYwIiwgIiU2MSIsICIlNjIiLCAiJTYzIiwgIiU2NCIsICIlNjUiLCAiJTY2IiwgIiU2NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU2OCIsICIlNjkiLCAiJTZBIiwgIiU2QiIsICIlNkMiLCAiJTZEIiwgIiU2RSIsICIlNkYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNzAiLCAiJTcxIiwgIiU3MiIsICIlNzMiLCAiJTc0IiwgIiU3NSIsICIlNzYiLCAiJTc3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTc4IiwgIiU3OSIsICIlN0EiLCAiJTdCIiwgIiU3QyIsICIlN0QiLCAiJTdFIiwgIiU3RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU4MCIsICIlODEiLCAiJTgyIiwgIiU4MyIsICIlODQiLCAiJTg1IiwgIiU4NiIsICIlODciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlODgiLCAiJTg5IiwgIiU4QSIsICIlOEIiLCAiJThDIiwgIiU4RCIsICIlOEUiLCAiJThGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTkwIiwgIiU5MSIsICIlOTIiLCAiJTkzIiwgIiU5NCIsICIlOTUiLCAiJTk2IiwgIiU5NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU5OCIsICIlOTkiLCAiJTlBIiwgIiU5QiIsICIlOUMiLCAiJTlEIiwgIiU5RSIsICIlOUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQTAiLCAiJUExIiwgIiVBMiIsICIlQTMiLCAiJUE0IiwgIiVBNSIsICIlQTYiLCAiJUE3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUE4IiwgIiVBOSIsICIlQUEiLCAiJUFCIiwgIiVBQyIsICIlQUQiLCAiJUFFIiwgIiVBRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVCMCIsICIlQjEiLCAiJUIyIiwgIiVCMyIsICIlQjQiLCAiJUI1IiwgIiVCNiIsICIlQjciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQjgiLCAiJUI5IiwgIiVCQSIsICIlQkIiLCAiJUJDIiwgIiVCRCIsICIlQkUiLCAiJUJGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUMwIiwgIiVDMSIsICIlQzIiLCAiJUMzIiwgIiVDNCIsICIlQzUiLCAiJUM2IiwgIiVDNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVDOCIsICIlQzkiLCAiJUNBIiwgIiVDQiIsICIlQ0MiLCAiJUNEIiwgIiVDRSIsICIlQ0YiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRDAiLCAiJUQxIiwgIiVEMiIsICIlRDMiLCAiJUQ0IiwgIiVENSIsICIlRDYiLCAiJUQ3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUQ4IiwgIiVEOSIsICIlREEiLCAiJURCIiwgIiVEQyIsICIlREQiLCAiJURFIiwgIiVERiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVFMCIsICIlRTEiLCAiJUUyIiwgIiVFMyIsICIlRTQiLCAiJUU1IiwgIiVFNiIsICIlRTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRTgiLCAiJUU5IiwgIiVFQSIsICIlRUIiLCAiJUVDIiwgIiVFRCIsICIlRUUiLCAiJUVGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUYwIiwgIiVGMSIsICIlRjIiLCAiJUYzIiwgIiVGNCIsICIlRjUiLCAiJUY2IiwgIiVGNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVGOCIsICIlRjkiLCAiJUZBIiwgIiVGQiIsICIlRkMiLCAiJUZEIiwgIiVGRSIsICIlRkYiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCX07Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBOZXRVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSSSBmb3IgdGhlIGdpdmVuIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBpbnB1dCBmaWxlLgotCSAqIEByZXR1cm4gVGhlIFVSSSBmb3IgdGhlIGdpdmVuIGZpbGUuCi0JICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1ciB3aGlsZSBjb25zdHJ1Y3RpbmcgdGhlIFVSSSBmb3IgdGhlIGdpdmVuCi0JICogICAgICAgICAgICAgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVcmkoRmlsZSBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVybCA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdXJsTGVuZ3RoID0gdXJsLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybExlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdXJsLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyAnOgotCQkJCXN0ckJ1Zi5hcHBlbmQoIiUyMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0ckJ1Zi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJJIHVzaW5nIHRoZSBnaXZlbiB0aGUgYmFzZSBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIFVSSSB0byByZXNvbHZlLgotCSAqIEBwYXJhbSBiYXNlVXJpCi0JICogICAgICAgICAgICBUaGUgYmFzZSBVUkkuCi0JICogQHJldHVybiBBIGZ1bGx5IGZvcm1lZCBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVyaShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHVyaS5zdGFydHNXaXRoKCIuLi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYmFzZVVyaS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliYXNlVXJpID0gYmFzZVVyaS5zdWJzdHJpbmcoMCwgYmFzZVVyaS5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJd2hpbGUgKHVyaS5zdGFydHNXaXRoKCIuLi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdXJpID0gdXJpLnN1YnN0cmluZygzKTsKLQkJCQlpbnQgaW5kZXggPSBiYXNlVXJpLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQliYXNlVXJpID0gYmFzZVVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJCXVyaSA9ICIvIiArIHVyaTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHVyaS5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGJhc2VVcmkuZW5kc1dpdGgoIi8iKSAvLyROT04tTkxTLTEkCi0JCQkJCT8gYmFzZVVyaSArIHVyaS5zdWJzdHJpbmcoMSkgOiBiYXNlVXJpICsgdXJpOwotCQl9Ci0KLQkJaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfVVJJX1BSRUZJWCkgfHwgdXJpLnN0YXJ0c1dpdGgoSFRUUF9VUklfUFJFRklYKSkgewotCQkJcmV0dXJuIHVyaTsKLQkJfQotCi0JCXJldHVybiBiYXNlVXJpLmVuZHNXaXRoKCIvIikgPyBiYXNlVXJpICsgdXJpIDogYmFzZVVyaSArICcvJyArIHVyaTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgc291cmNlIFVSSS4KLQkgKiBAcmV0dXJuIFRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBnaXZlbiBVUkkuCi0JICogQHRocm93IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhIGdpdmVuIFhNTCBkb2N1bWVudCBVUkkgaXMgaW52YWxpZC4KLQkgKiBAdGhyb3cgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkKLQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICh1cmkuc3RhcnRzV2l0aChIVFRQX1VSSV9QUkVGSVgpKSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkJcmV0dXJuIHVybC5vcGVuU3RyZWFtKCk7Ci0JCX0gZWxzZSBpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9VUklfUFJFRklYKSkgewotCQkJdXJpID0gdXJpLnN1YnN0cmluZyhGSUxFX1VSSV9QUkVGSVhfTEVOR1RIKTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKE5ldFV0aWwuZGVjb2RlVXJsKHVyaSwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgc3RyaW5nIHJlcHJlc2VudGlvbiAoZW5jb2RlZCBpbiBVVEYtMTYpIG9mIHRoZSBnaXZlbiBVUkwKLQkgKiAoZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZW5jb2RpbmcgYW5kIEFTQ0lJLWVzY2FwZWQpLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFRoZSBVUkwgdG8gZGVjb2RlLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIGVuY29kaW5nIG9mIHRoZSBVUkwuCi0JICogQHJldHVybiBUaGUgSmF2YSBVVEYtMTYgc3RyaW5nIHJlc3ByZXNlbnRhdGlvbi4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBVUkwgY29udGFpbiBpbXByb3Blcmx5IGVzY2FwZWQgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVVcmwoU3RyaW5nIHVybCwgU3RyaW5nIGVuY29kaW5nKSB7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCQkKLQkJaW50IGxlbiA9IHVybC5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJLy8gVW5lc2NhcGUgdGhlIHVybC4KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHVybC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcrJzoKLQkJCQlzdHJCdWYuYXBwZW5kKCcgJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICclJzoKLQkJCQl0cnkgewotCQkJCQlzdHJCdWYuYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KHVybC5zdWJzdHJpbmcoaSArIDEsCi0JCQkJCQkJaSArIDMpLCAxNikpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaSArPSAyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdHJCdWYuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIENvbnZlcnQgdGhlIHVuLWVzY2FwZWQgYnl0ZSB2YWx1ZXMgdG8gSmF2YSBVVEYtMTYgc3RyaW5nLgotCQlTdHJpbmcgcmVzdWx0ID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCWlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWJ5dGVbXSBieXRlcyA9IHJlc3VsdC5nZXRCeXRlcygiODg1OV8xIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLCBlbmNvZGluZyk7Ci0JCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQVNDSUktZXNjYXBlZCByZXByZXNlbnRhdGlvbiAoZW5jb2RlZCBpbiB0aGUgc3BlY2lmaWVkCi0JICogZW5jb2RpbmcpIG9mIHRoZSBnaXZlbiBVUkwgKGVuY29kZWQgaW4gVVRGLTE2KS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBUaGUgVVJMIHRvIGVuY29kZS4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSBlbmNvZGluZyBvZiB0aGUgVVJMLgotCSAqIEByZXR1cm4gdGhlIEFTQ0lJLWVzY2FwZWQgcmVzcHJlc2VudGF0aW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIFVSTCBjb250YWluIGltcHJvcGVybHkgZXNjYXBlZCBjaGFyYWN0ZXJzLgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBjb2RpbmcgaXMgdW5zdXBwb3J0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVVybChTdHJpbmcgdXJsLCBTdHJpbmcgZW5jb2RpbmcpCi0JCQl0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQkJCi0JCWludCBsZW4gPSB1cmwubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnl0ZVtdIGJ5dGVzID0gdXJsLmdldEJ5dGVzKGVuY29kaW5nKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IChjaGFyKSBieXRlc1tpXTsKLQotCQkJaWYgKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykgewotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaCAoY2gpIHsKLQkJCQljYXNlICctJzoKLQkJCQljYXNlICdfJzoKLQkJCQljYXNlICcuJzoKLQkJCQljYXNlICchJzoKLQkJCQljYXNlICd+JzoKLQkJCQljYXNlICcqJzoKLQkJCQljYXNlICdcJyc6Ci0JCQkJY2FzZSAnKCc6Ci0JCQkJY2FzZSAnKSc6Ci0JCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXN1bHQuYXBwZW5kKEhFWF9WQUxVRVNbY2ggJiAweEZGXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBU0NJSS1lc2NhcGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBmaWxlIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVVSTAotCSAqICAgICAgICAgICAgVGhlIGZpbGUgVVJMIHRvIGVuY29kZS4KLQkgKiBAcmV0dXJuIHRoZSBBU0NJSS1lc2NhcGVkIHJlc3ByZXNlbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVGaWxlVVJMKFN0cmluZyBmaWxlVVJMKSB7Ci0JCVN0cmluZyB1cmwgPSBmaWxlVVJMOwotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdXJsTGVuZ3RoID0gdXJsLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybExlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdXJsLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyAnOgotCQkJCXN0ckJ1Zi5hcHBlbmQoIiUyMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0ckJ1Zi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBU0NJSS1lc2NhcGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBmaWxlIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVVSTAotCSAqICAgICAgICAgICAgVGhlIGZpbGUgVVJMIHRvIGVuY29kZS4KLQkgKiBAcmV0dXJuIHRoZSBBU0NJSS1lc2NhcGVkIHJlc3ByZXNlbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVkRmlsZVVybChTdHJpbmcgZmlsZVVSTCkgewotCQlTdHJpbmcgdXJsID0gZmlsZVVSTDsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHVybExlbmd0aCA9IHVybC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxMZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHVybC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICclJzoKLQkJCQl0cnkgewotCQkJCQlzdHJCdWYuYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KHVybC5zdWJzdHJpbmcoaSArIDEsCi0JCQkJCQkJaSArIDMpLCAxNikpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaSArPSAyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdHJCdWYuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZVVSTCAoU3RyaW5nIHVybCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotLy8JCXVybCA9IHVybC5yZXBsYWNlQWxsKCJcXCsiLCAiJTJCIik7IC8vJE5PTi1OTFMtMSQKLQkJdXJsID0gVVJMRGVjb2Rlci5kZWNvZGUodXJsLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdXJsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUHJvZmlsaW5nVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Qcm9maWxpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjlhY2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Qcm9maWxpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHByb2ZpbGluZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJvZmlsaW5nVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHJhY2VGb290cHJpbnQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcmludFN0cmVhbSBvdXRwdXQgPSBTeXN0ZW0ub3V0OwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXQoUHJpbnRTdHJlYW0gcHMpIHsKLQkJb3V0cHV0ID0gcHM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmdWxsR0MoKSB7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJbG9uZyBpc0ZyZWUgPSBydC5mcmVlTWVtb3J5KCk7Ci0JCWxvbmcgd2FzRnJlZTsKLQkJZG8gewotCQkJd2FzRnJlZSA9IGlzRnJlZTsKLQkJCXJ0LnJ1bkZpbmFsaXphdGlvbigpOwotCQkJcnQuZ2MoKTsKLQkJCWlzRnJlZSA9IHJ0LmZyZWVNZW1vcnkoKTsKLQkJfSB3aGlsZSAoaXNGcmVlID4gd2FzRnJlZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgbG9uZyB0cmFjZVVzZWRNZW1vcnkoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJbG9uZyB1c2VkTWVtID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJb3V0cHV0LnByaW50bG4oIkZvb3RwcmludD4gIiArIGxvY2F0aW9uICsgIjogIiArIHVzZWRNZW0vMTAwMCArICIgSyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAkKLQkJCQkJCQkJCQkKLQkJcmV0dXJuIHVzZWRNZW07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIHRyYWNlVXNlZE1lbW9yeURpZmYoU3RyaW5nIGxvY2F0aW9uSW5mbywgbG9uZyBjdXJyVXNlZCwgbG9uZyBQcmV2VXNlZCkgewotCQlsb25nIGRpZmYgPSBjdXJyVXNlZCAtIFByZXZVc2VkOwotCQlvdXRwdXQucHJpbnRsbigiRm9vdHByaW50PiBEaWZmLCAiICsgbG9jYXRpb25JbmZvICsgIjogIiArIGRpZmYvMTAwMCArICIgS1xuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQkJCQkJCi0JCXJldHVybiBkaWZmOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUmVzdGFydGFibGVKb2IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUmVzdGFydGFibGVKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwYmFhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1Jlc3RhcnRhYmxlSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci0KLS8qKgotICogSm9iIGNsYXNzIHRoYXQgaXMgcmUtc3RhcnRhYmxlCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuNQotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXN0YXJ0YWJsZUpvYiBleHRlbmRzIEpvYiB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGxvY2FsRGVidWcgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gdG9SZXN0YXJ0ID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gc2NoZWR1bGluZ0xvY2tlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBSZXN0YXJ0YWJsZUpvYihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgZ3VhcmRlZFNjaGVkdWxlKGxvbmcgZGVsYXkpIHsKLQkJaWYgKGdldFN0YXRlKCkgIT0gSm9iLk5PTkUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaXNTY2hlZHVsaW5nTG9ja2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRTY2hlZHVsaW5nTG9ja2VkKHRydWUpOwotCQlzY2hlZHVsZShkZWxheSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzZXRTY2hlZHVsaW5nTG9ja2VkKGZhbHNlKTsKLQkJc2V0VG9SZXN0YXJ0KGZhbHNlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOyAKLQkJdHJ5IHsKLQkJCXN0YXR1cyA9IHJlc3RhcnRhYmxlUnVuKG1vbml0b3IpOwotCQl9IGNhdGNoIChSZXN0YXJ0SW50ZXJydXB0RXhjZXB0aW9uIGUpIHsKLQkJCWd1YXJkZWRTY2hlZHVsZShlLmdldERlbGF5KCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IElTdGF0dXMgcmVzdGFydGFibGVSdW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUmVzdGFydEludGVycnVwdEV4Y2VwdGlvbjsJCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2NoZWR1bGluZ0xvY2tlZCgpIHsKLQkJcmV0dXJuIHNjaGVkdWxpbmdMb2NrZWQ7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTY2hlZHVsaW5nTG9ja2VkKGJvb2xlYW4gc2NoZWR1bGluZ0xvY2tlZCkgewotCQl0aGlzLnNjaGVkdWxpbmdMb2NrZWQgPSBzY2hlZHVsaW5nTG9ja2VkOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaXNUb1Jlc3RhcnQoKSB7Ci0JCXJldHVybiB0b1Jlc3RhcnQ7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUb1Jlc3RhcnQoYm9vbGVhbiB0b1Jlc3RhcnQpIHsKLQkJdGhpcy50b1Jlc3RhcnQgPSB0b1Jlc3RhcnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVuYWJsZVRvUmVzdGFydCgpIHsKLQkJc2V0VG9SZXN0YXJ0KHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzdGFydEludGVycnVwdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCXByaXZhdGUgbG9uZyBkZWxheSA9IDA7Ci0JCXB1YmxpYyBSZXN0YXJ0SW50ZXJydXB0RXhjZXB0aW9uKGxvbmcgZGVsYXkpIHsKLQkJCXRoaXMuZGVsYXkgPSBkZWxheTsKLQkJfQotCQkKLQkJcHVibGljIGxvbmcgZ2V0RGVsYXkoKSB7Ci0JCQlyZXR1cm4gZGVsYXk7Ci0JCX0KLQl9Ci0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9TdHJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDAyNzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9TdHJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci0KLWltcG9ydCBjb20uaWJtLmljdS5sYW5nLlVDaGFyYWN0ZXI7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIG1hbnVpcHVsYXRpbmcgc3RyaW5ncy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RyVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfQU5ZX1NQRUNJQUxfQ0hBUlMgPSAiKGB8fnwhfEB8I3xcXCR8JXxcXF58JnxcXCp8XFwofFxcKXxcXCt8PXxcXFt8XFxdfFxcfHxcXDp8XCJ8PHw+fFxcP3wvfCd8XFxzfFxcXFwpKyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSUyA9ICIoXFxbfCN8XFwqfFxcP3xcInw8fD58XFx8fCF8JXwvfFxcXSkrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTX0xJTlVYID0gIihcXFt8I3xcXCp8XFw/fFwifDx8PnxcXHx8IXwlfFxcXSkrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9JTlZBTElEX0ZJTEVOQU1FX0NIQVJTID0gIihcXFt8I3wvfFxcXFx8XFw6fFxcKnxcXD98XCJ8PHw+fFxcfHxcXF18XFxzKSsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0RJR0lUUyA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywKLQkJCSc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9GRUVEID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX0xGID0gIiYjeEE7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFRF9DUiA9ICImI3hEOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfTElORV9GRUVEID0gTElORV9GRUVELnJlcGxhY2UoCi0JCQkiXG4iLCBFU0NBUEVEX0xGKS5yZXBsYWNlKCJcciIsIEVTQ0FQRURfQ1IpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRF9SRUdFWCA9IExJTkVfRkVFRC5yZXBsYWNlQWxsKAotCQkJIlxcXFwiLCAiXFxcXCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfTElORV9GRUVEX1JFR0VYID0gRVNDQVBFRF9MSU5FX0ZFRUQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JSRUFLID0gIjxici8+IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0NPUFkgPSAiJmNvcHk7IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0VVUk8gPSAiJmV1cm87IjsvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUkVHID0gIiZyZWc7IjsvLyROT04tTkxTLTEkIAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9UUkFERU1BUksgPSAiJnRyYWRlOyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgU3RyVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBmb3IgbnVsbCBzdHJpbmcuCi0JICogPHA+Ci0JICogQSBudWxsIHN0cmluZyBpcyBkZWZpbmVkIGFzIG9uZSB0aGF0IGhhcyBhbiBlbXB0eSByZWZlcmVuY2Ugb3IgaGFzIHplcm8KLQkgKiBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBudWxsIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGwoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgZm9yIGJsYW5rIHN0cmluZy4KLQkgKiA8cD4KLQkgKiBBIGJsYW5rIHN0cmluZyBpcyBkZWZpbmVkIGFzIG9uZSB0aGF0IGhhcyBhbiBlbXB0eSByZWZlcmVuY2Ugb3IgaGFzIHplcm8KLQkgKiBsZW5ndGggYWZ0ZXIgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMgYXJlIHRyaW1tZWQuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBibGFuayBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCbGFuayhTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIgPT0gbnVsbCB8fCBzdHIudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UgY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiBhIHN0cmluZyB3aXRoIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHN0ciA9PSBudWxsID8gbnVsbCA6IHN0ci50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKFRBQiwgQ1IsIExGIGFuZCBTUEFDRSkgZnJvbSBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVdoaXRlU3BhY2VDaGFycyhTdHJpbmcgc3RyKSB7Ci0JCWludCBsZW4gPSAoc3RyID09IG51bGwpID8gMCA6IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJc3dpdGNoIChzdHIuY2hhckF0KGkpKSB7Ci0JCQljYXNlICdcdCc6Ci0JCQljYXNlICdccic6Ci0JCQljYXNlICdcbic6Ci0JCQljYXNlICcgJzoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIENSLCBMRiBmcm9tIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiBhIHN0cmluZyB3aXRoIENSLCBMRiByZW1vdmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTmV3bGluZXMoU3RyaW5nIHN0cikgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSAoc3RyID09IG51bGwpID8gMCA6IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoYykgewotCQkJY2FzZSAnXHInOgotCQkJY2FzZSAnXG4nOgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7IAotCX0KLQotCS8qKgotCSAqIFNwbGl0cyBhIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZyB0b2tlbnMuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcGFyYW0gc2VwCi0JICogICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdHJpbmcgc2VwYXJhdG9ycwotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIHN0cmluZyB0b2tlbnMKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZyB0b2tlbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBzdHIsIFN0cmluZyBzZXAsIGludCBjb3VudCkgewotCQlpZiAoc3RyID09IG51bGwgfHwgY291bnQgPT0gMCB8fCBjb3VudCA8IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgc2VwLAotCQkJCWNvdW50ID09IC0xID8gZmFsc2UgOiB0cnVlKTsKLQotCQlpZiAoY291bnQgPT0gLTEpIHsKLQkJCWNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCX0KLQotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvdW50XTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAoaSA8IGNvdW50KSB7Ci0JCQkJaWYgKCh0Lmxlbmd0aCgpID09IDEpICYmIChzZXAuaW5kZXhPZih0KSAhPSAtMSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlc3VsdFtpKytdID0gdDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0W2NvdW50IC0gMV0gKz0gdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNwbGl0cyBhIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZyB0b2tlbnMuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcGFyYW0gc2VwCi0JICogICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdHJpbmcgc2VwYXJhdG9ycwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5nIHRva2VucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHN0ciwgU3RyaW5nIHNlcCkgewotCQlyZXR1cm4gc3BsaXQoc3RyLCBzZXAsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhIHN1YnN0cmluZyB3aXRoaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIHN1YnN0cmluZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBPbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzdWJzdHJpbmcgd2lsbCBiZSByZXBsYWNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEBwYXJhbSBzcmMKLQkgKiAgICAgICAgICAgIHRoZSBzdWJzdHJpbmcgdG8gcmVwbGFjZQotCSAqIEBwYXJhbSB0Z3QKLQkgKiAgICAgICAgICAgIHRoZSBzdWJzdHJpbmcgdG8gdXNlIGZvciB0aGUgcmVwbGFjZW1lbnQKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIGZpcnN0IHN1YnN0cmluZyByZXBsYWNlZAotCSAqIAotCSAqIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4gQ2FsbCBTdHJpbmcucmVwbGFjZUZpcnN0KCkgaW5zdGVhZD8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBzdHIsIFN0cmluZyBzcmMsIFN0cmluZyB0Z3QpIHsKLQkJaWYgKChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCQl8fCAoc3JjID09IG51bGwgfHwgc3JjLmxlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0KLQkJU3RyaW5nIHRtcFN0ciA9IHN0cjsKLQkJaW50IGluZGV4OwotCQl3aGlsZSAoKGluZGV4ID0gdG1wU3RyLmluZGV4T2Yoc3JjKSkgIT0gLTEpIHsKLQkJCXRtcFN0ciA9IHRtcFN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpICsgdGd0Ci0JCQkJCSsgdG1wU3RyLnN1YnN0cmluZyhpbmRleCArIHNyYy5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHRtcFN0cjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqICAgICAgICAgICAgYSBkZWZhdWx0IGludGVnZXIgdmFsdWUgZm9yIHRoZSBzdHJpbmcKLQkgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRWYWx1ZShTdHJpbmcgc3RyLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCWlmIChTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHIpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBVVEYtOCBlbmNvZGluZyBvZiBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIFVURi04IGVuY29kaW5nIG9mIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRVVEY4Qnl0ZXMoU3RyaW5nIHN0cikgewotCQljaGFyW10gYyA9IHN0ci50b0NoYXJBcnJheSgpOwotCQlpbnQgbGVuID0gYy5sZW5ndGg7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWludCBjaCA9IGNbaV07Ci0JCQlpZiAoY2ggPD0gMHg3ZikgewotCQkJCWNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKGNoIDw9IDB4N2ZmKSB7Ci0JCQkJY291bnQgKz0gMjsKLQkJCX0gZWxzZSB7Ci0JCQkJY291bnQgKz0gMzsKLQkJCX0KLQkJfQotCi0JCWJ5dGVbXSBiID0gbmV3IGJ5dGVbY291bnRdOwotCQlpbnQgb2ZmID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaW50IGNoID0gY1tpXTsKLQkJCWlmIChjaCA8PSAweDdmKSB7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgY2g7Ci0JCQl9IGVsc2UgaWYgKGNoIDw9IDB4N2ZmKSB7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCA+PiA2KSB8IDB4YzApOwotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoY2ggJiAweDNmKSB8IDB4ODApOwotCQkJfSBlbHNlIHsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKGNoID4+IDEyKSB8IDB4ZTApOwotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoKGNoID4+IDYpICYgMHgzZikgfCAweDgwKTsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKGNoICYgMHgzZikgfCAweDgwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZXhpZGVjaW1hbCBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24gZm9yIGFuIGludGVnZXIuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhbiBpbnRlZ2VyCi0JICogQHJldHVybiB0aGUgaGV4aWRlY2ltYWwgcmVwcmVzZW50YXRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyIHRvSGV4KGludCB2YWx1ZSkgewotCQlyZXR1cm4gSEVYX0RJR0lUU1sodmFsdWUgJiAweEYpXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlc2NhcGVkIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcGFyYW0gc2tpcEFTQ0lJCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgYXZvaWQgZXNjYXBpbmcgdGhlIEFTQ0lJIGNoYXJhY3RlcnMKLQkgKiBAcmV0dXJuIHRoZSBlc2NhcGVkIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRXNjYXBlZFVuaWNvZGUoU3RyaW5nIHN0ciwgYm9vbGVhbiBza2lwQVNDSUkpIHsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobGVuICogMik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0KLQkJCWlmIChza2lwQVNDSUkgJiYgY2ggPCAweDAwN0UpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiXFx1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKHRvSGV4KChjaCA+PiAxMikgJiAweEYpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKHRvSGV4KChjaCA+PiA4KSAmIDB4RikpOwotCQkJCXJlc3VsdC5hcHBlbmQodG9IZXgoKGNoID4+IDQpICYgMHhGKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleChjaCAmIDB4RikpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVzY2FwZWQgSFRNTCByZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbAotCSAqICAgICAgICAgICAgYSBIVE1MIHN0cmluZwotCSAqIEByZXR1cm4gdGhlIGVzY2FwZWQgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gSFRNTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFc2NhcGVkSFRNTChTdHJpbmcgaHRtbCkgewotCQlpZiAoaHRtbCA9PSBudWxsIHx8IGh0bWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuZ3RoID0gaHRtbC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IGh0bWwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnJSc6Ci0JCQkJaWYgKGkgKyA0IDwgbGVuZ3RoKSB7Ci0JCQkJCVN0cmluZyBoZXhTdHIgPSBodG1sLnN1YnN0cmluZyhpICsgMSwgaSArIDUpOwotCQkJCQlib29sZWFuIHZhbGlkSGV4dFN0ciA9IHRydWU7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaGV4U3RyLmxlbmd0aCgpOyBqKyspIHsKLQkJCQkJCWNoYXIgYyA9IGhleFN0ci5jaGFyQXQoaik7Ci0JCQkJCQlpZiAoIShjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSkgewotCQkJCQkJCXZhbGlkSGV4dFN0ciA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh2YWxpZEhleHRTdHIpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW50IGNvZGVQb2ludCA9IEludGVnZXIucGFyc2VJbnQoaGV4U3RyLCAxNik7Ci0JCQkJCQkJY2hhcltdIGMgPSBVQ2hhcmFjdGVyLnRvQ2hhcnMoY29kZVBvaW50KTsKLQkJCQkJCQlyZXN1bHQuYXBwZW5kKGMpOwotCQkJCQkJCWkgKz0gNDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTAwYTknOgotCQkJCXJlc3VsdC5hcHBlbmQoSFRNTF9DT1BZKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x1MDBhZSc6Ci0JCQkJcmVzdWx0LmFwcGVuZChIVE1MX1JFRyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTIwYWMnOgotCQkJCXJlc3VsdC5hcHBlbmQoSFRNTF9FVVJPKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x1MjEyMic6Ci0JCQkJcmVzdWx0LmFwcGVuZChIVE1MX1RSQURFTUFSSyk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbGFpbiB0ZXh0IGZyb20gSFRNTCB0ZXh0LgotCSAqIDxwPgotCSAqIE5vdGU6IEFsbCBIVE1MIHRhZ3Mgd2lsbCBiZSBzdHJpcHBlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbAotCSAqICAgICAgICAgICAgdGhlIEhUTUwgdGV4dC4KLQkgKiBAcmV0dXJuIHRoZSBwbGFpbiB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBIVE1MIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbGFpblRleHQoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKGh0bWwgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlmaW5hbCBQYXR0ZXJuIHBfcGxhaW50ZXh0X2ZpbHRlciA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCQkiPFtePl0qPz4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgUGF0dGVybiBwX3BsYWludGV4dF9maWx0ZXIyID0gUGF0dGVybi5jb21waWxlKAotCQkJCSImLnsxLDV9W147XTsiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgUGF0dGVybiBwX3BsYWludGV4dF9maWx0ZXIzID0gUGF0dGVybi5jb21waWxlKAotCQkJCSJcXHMrIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHJlc3VsdCA9IGh0bWwucmVwbGFjZUFsbChwX3BsYWludGV4dF9maWx0ZXIucGF0dGVybigpLCAiICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkucmVwbGFjZUFsbChwX3BsYWludGV4dF9maWx0ZXIyLnBhdHRlcm4oKSwgIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJLnJlcGxhY2VBbGwocF9wbGFpbnRleHRfZmlsdGVyMy5wYXR0ZXJuKCksICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgdmFsaWQgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiBhIHZhbGlkIGZpbGUgbmFtZSBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VWYWxpZEZpbGVOYW1lKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGxhaW5UZXh0KHN0cikKLQkJCQkucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9GSUxFTkFNRV9DSEFSUywgIiAiKS50cmltKCk7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQbGFpblRleHQoc3RyKQotCQkJCS5yZXBsYWNlQWxsKFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUywgIiAiKS50cmltKCk7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYW55IGludmFsaWQgZmlsZW5hbWUKLQkgKiBjaGFyYWN0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgZmlsZSBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBjb250YWlucyBvbmx5IHZhbGlkCi0JICogICAgICAgICBmaWxlbmFtZSBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRQdWJsaXNoUGF0aChTdHJpbmcgcGF0aCkgewotCQkvLyByZXR1cm4gcGF0aC5yZXBsYWNlQWxsKGludmFsaWRQdWJsaXNoUGF0aENoYXJzUmVnRXhwLAotCQkvLyAiIikuZXF1YWxzKHBhdGgpOwotCi0JCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCXJldHVybiBwYXRoCi0JCQkJCS5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTLCAiIikuZXF1YWxzKHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBlbHNlIGRlZmF1bHQgdG8gTGludXgKLQkJcmV0dXJuIHBhdGgKLQkJCQkucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSU19MSU5VWCwgIiIpLmVxdWFscyhwYXRoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvd2VyLWNhc2Ugb2Ygc3RyIHVubGVzcyB0aGUgY3VycmVudCBsb2NhbGUgaXMgR2VybWFuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0xvd2VyKFN0cmluZyBzdHIpIHsKLQkJaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgiZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCXJldHVybiBzdHIudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBlc2NhcGUgdGhlICIgYW5kICcKLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIucmVwbGFjZUFsbCgiJyIsICJcXFxcXCciKS5yZXBsYWNlQWxsKCJcIiIsICJcXFxcXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgPGNvZGU+TGlzdDwvY29kZT4gdG8gYW4gU3RyaW5nIGFycmF5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0Ci0JICogICAgICAgICAgICBhIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICogQHJldHVybiBhIFN0cmluZyBhcnJheQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gY29udmVydExpc3RUb1N0ckFycmF5KExpc3QgbGlzdCkgewotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlpbnQgY250ID0gbGlzdC5zaXplKCk7Ci0JCQlTdHJpbmdbXSBzdHJBcnJheSA9IG5ldyBTdHJpbmdbY250XTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCQkJCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBsaXN0LmdldChpKTsKLQkJCQlzdHJBcnJheVtpXSA9IG5ldyBTdHJpbmcoc3RyKTsKLQkJCX0KLQkJCXJldHVybiBzdHJBcnJheTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnJlcGxhY2VBbGwoUkVHRVhQX0FOWV9TUEVDSUFMX0NIQVJTLCAiIikuZXF1YWxzKG5hbWUpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQkvKioKLQkgKiBhZGRlZCBzb21lIHRlc3QgY29kZQotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCi0JCVN0cmluZyB0ZXh0ID0gIkEmJSAgICAgIGAmIyAgICAgICAgICAgJH4hQCMkJV4mKigpXy0rPXt9W1wiXTp8XFw6O1wiJzwsPi4/LyBcdFxyXG5aIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiWyIgKyB0ZXh0ICsgIl0gPD09IHRleHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiWyIgKyB0ZXh0LnJlcGxhY2VBbGwoUkVHRVhQX0FOWV9TUEVDSUFMX0NIQVJTLCAiICIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSsgIl0gPD09IEFsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiWyIgLy8kTk9OLU5MUy0xJAotCQkJCSsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX0ZJTEVOQU1FX0NIQVJTLCAiICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkrICJdIDw9PSBGaWxlIE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHRleHQucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSUywgIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJKyAiXSA8PT0gcGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiWyIgLy8kTk9OLU5MUy0xJAotCQkJCSsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTX0xJTlVYLAotCQkJCQkJIiAiKSArICJdIDw9PSBwYXRoLCBMaW51eCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIHBsYXRmb3JtIGxpbmUtc2VwYXJhdG9yIChcbiBvciBcblxyIG9yIFxyKSB0byAmbHQ7YnIvJmd0OwotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnROZXdsaW5lc1RvSFRNTChTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKExJTkVfRkVFRF9SRUdFWCwgSFRNTF9CUkVBSyArIExJTkVfRkVFRCk7Ci0JCQl0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKEVTQ0FQRURfTElORV9GRUVEX1JFR0VYLCBIVE1MX0JSRUFLCi0JCQkJCSsgRVNDQVBFRF9MSU5FX0ZFRUQpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIHRvVVJJKFN0cmluZyBwYXRoU3RyKSB7Ci0JCWlmIChwYXRoU3RyICE9IG51bGwgJiYgcGF0aFN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCUlQYXRoIHBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoU3RyKTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHBhdGgudG9GaWxlKCkudG9VUkkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVDaGFyKFN0cmluZyB0ZXh0LCBjaGFyIGMpIHsKLQkJaW50IGk9dGV4dC5pbmRleE9mKGMpOyAKLQkJaWYgKCBpIDwgMCApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCQotCQlpbnQgc3RhcnQgPSAwOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoIGkgPiBzdGFydCApIHsKLQkJCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcoc3RhcnQsIGkpKS5hcHBlbmQoIlxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXJ0ID0gaTsKLQkJCWk9dGV4dC5pbmRleE9mKGMsIHN0YXJ0KzEpOyAKLQkJfQotCQkKLQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhzdGFydCkpOwotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1N0cmluZ01hdGNoZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyaW5nTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI5NjViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyaW5nTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogQSBzdHJpbmcgcGF0dGVybiBtYXRjaGVyLiBTdXBwb3J0cyAnKicgYW5kICc/JyB3aWxkY2FyZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdNYXRjaGVyIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZQYXR0ZXJuOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aDsgLy8gcGF0dGVybiBsZW5ndGgKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSWdub3JlV2lsZENhcmRzOwotCXByb3RlY3RlZCBib29sZWFuIGZJZ25vcmVDYXNlOwotCXByb3RlY3RlZCBib29sZWFuIGZIYXNMZWFkaW5nU3RhcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGFzVHJhaWxpbmdTdGFyOwotCXByb3RlY3RlZCBTdHJpbmcgZlNlZ21lbnRzW107IC8vdGhlIGdpdmVuIHBhdHRlcm4gaXMgc3BsaXQgaW50byAqIHNlcGFyYXRlZCBzZWdtZW50cwotCi0JLyogYm91bmRhcnkgdmFsdWUgYmV5b25kIHdoaWNoIHdlIGRvbid0IG5lZWQgdG8gc2VhcmNoIGluIHRoZSB0ZXh0ICovCi0JcHJvdGVjdGVkIGludCBmQm91bmQ9IDA7Ci0JCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgZlNpbmdsZVdpbGRDYXJkPSAnXHUwMDAwJzsKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBvc2l0aW9uIHsKLQkJaW50IHN0YXJ0OyAvL2luY2x1c2l2ZQotCQlpbnQgZW5kOyAvL2V4Y2x1c2l2ZQotCQlwdWJsaWMgUG9zaXRpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0aGlzLnN0YXJ0PSBzdGFydDsKLQkJCXRoaXMuZW5kPSBlbmQ7Ci0JCX0KLQkJcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJCXJldHVybiBzdGFydDsKLQkJfQotCQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJCXJldHVybiBlbmQ7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU3RyaW5nTWF0Y2hlciBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIFN0cmluZyBvYmplY3QgdGhhdCBpcyBhIHNpbXBsZSAKLQkgKiBwYXR0ZXJuLiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiAnKicgZm9yIDAgYW5kIG1hbnkgY2hhcmFjdGVycyBhbmQKLQkgKiAnPycgZm9yIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4gIAotCSAqCi0JICogTGl0ZXJhbCAnKicgYW5kICc/JyBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZCBpbiB0aGUgcGF0dGVybiAKLQkgKiBlLmcuLCAiXCoiIG1lYW5zIGxpdGVyYWwgIioiLCBldGMuCi0JICoKLQkgKiBFc2NhcGluZyBhbnkgb3RoZXIgY2hhcmFjdGVyIChpbmNsdWRpbmcgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaXRzZWxmKSwgCi0JICoganVzdCByZXN1bHRzIGluIHRoYXQgY2hhcmFjdGVyIGluIHRoZSBwYXR0ZXJuLgotCSAqIGUuZy4sICJcYSIgbWVhbnMgImEiIGFuZCAiXFwiIG1lYW5zICJcIgotCSAqCi0JICogSWYgaW52b2tpbmcgdGhlIFN0cmluZ01hdGNoZXIgd2l0aCBzdHJpbmcgbGl0ZXJhbHMgaW4gSmF2YSwgZG9uJ3QgZm9yZ2V0Ci0JICogZXNjYXBlIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5ICJcXCIuCi0JICoKLQkgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB0byBtYXRjaCB0ZXh0IGFnYWluc3QKLQkgKiBAcGFyYW0gaWdub3JlQ2FzZSBpZiB0cnVlLCBjYXNlIGlzIGlnbm9yZWQKLQkgKiBAcGFyYW0gaWdub3JlV2lsZENhcmRzIGlmIHRydWUsIHdpbGQgY2FyZHMgYW5kIHRoZWlyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGlnbm9yZWQKLQkgKiAJCSAgKGV2ZXJ5dGhpbmcgaXMgdGFrZW4gbGl0ZXJhbGx5KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVybiwgYm9vbGVhbiBpZ25vcmVDYXNlLCBib29sZWFuIGlnbm9yZVdpbGRDYXJkcykgewotCQlpZiAocGF0dGVybiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlmSWdub3JlQ2FzZT0gaWdub3JlQ2FzZTsKLQkJZklnbm9yZVdpbGRDYXJkcz0gaWdub3JlV2lsZENhcmRzOwotCQlmUGF0dGVybj0gcGF0dGVybjsKLQkJZkxlbmd0aD0gcGF0dGVybi5sZW5ndGgoKTsKLQkJCi0JCWlmIChmSWdub3JlV2lsZENhcmRzKSB7Ci0JCQlwYXJzZU5vV2lsZENhcmRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJzZVdpbGRDYXJkcygpOwotCQl9Ci0JfQotCS8qKgotCSAqIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHBhdHRlcm4gYmV0d2VlbiA8Y29kZT5zdGFydDwvY29kZSkoaW5jbHVzaXZlKSAKLQkgKiBhbmQgPGNvZGU+ZW5kPC9jb2RlPihleGNsdXNpdmUpLiAgCi0JICogQHBhcmFtIHRleHQgdGhlIFN0cmluZyBvYmplY3QgdG8gc2VhcmNoIGluIAotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHNlYXJjaCByYW5nZSwgaW5jbHVzaXZlCi0JICogQHBhcmFtIGVuZCB0aGUgZW5kaW5nIGluZGV4IG9mIHRoZSBzZWFyY2ggcmFuZ2UsIGV4Y2x1c2l2ZQotCSAqIEByZXR1cm4gYW4gPGNvZGU+U3RyaW5nTWF0Y2hlci5Qb3NpdGlvbjwvY29kZT4gb2JqZWN0IHRoYXQga2VlcHMgdGhlIHN0YXJ0aW5nIAotCSAqIChpbmNsdXNpdmUpIGFuZCBlbmRpbmcgcG9zaXRpb25zIChleGNsdXNpdmUpIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSAKLQkgKiBwYXR0ZXJuIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIHRleHQ7IHJldHVybiBudWxsIGlmIG5vdCBmb3VuZCBvciBzdWJ0ZXh0Ci0JICogaXMgZW1wdHkgKHN0YXJ0PT1lbmQpLiBBIHBhaXIgb2YgemVyb3MgaXMgcmV0dXJuZWQgaWYgcGF0dGVybiBpcyBlbXB0eSBzdHJpbmcKLQkgKiBOb3RlIHRoYXQgZm9yIHBhdHRlcm4gbGlrZSAiKmFiYyoiIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgc3RhcnMsIHBvc2l0aW9uIG9mICJhYmMiCi0JICogaXMgcmV0dXJuZWQuIEZvciBhIHBhdHRlcm4gbGlrZSIqPz8qIiBpbiB0ZXh0ICJhYmNkZiIsICgxLDMpIGlzIHJldHVybmVkCi0JICovCi0JcHVibGljIFN0cmluZ01hdGNoZXIuUG9zaXRpb24gZmluZChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkKLQkJaW50IHRsZW49IHRleHQubGVuZ3RoKCk7Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydD0gMDsKLQkJaWYgKGVuZCA+IHRsZW4pCi0JCQllbmQ9IHRsZW47Ci0JCWlmIChlbmQgPCAwIHx8c3RhcnQgPj0gZW5kICkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZkxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG5ldyBQb3NpdGlvbihzdGFydCwgc3RhcnQpOwotCQlpZiAoZklnbm9yZVdpbGRDYXJkcykgewotCQkJaW50IHg9IHBvc0luKHRleHQsIHN0YXJ0LCBlbmQpOwotCQkJaWYgKHggPCAwKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5ldyBQb3NpdGlvbih4LCB4K2ZMZW5ndGgpOwotCQl9Ci0KLQkJaW50IHNlZ0NvdW50PSBmU2VnbWVudHMubGVuZ3RoOwotCQlpZiAoc2VnQ291bnQgPT0gMCkvL3BhdHRlcm4gY29udGFpbnMgb25seSAnKicocykKLQkJCXJldHVybiBuZXcgUG9zaXRpb24gKHN0YXJ0LCBlbmQpOwotCQkJCQkKLQkJaW50IGN1clBvcz0gc3RhcnQ7Ci0JCWludCBtYXRjaFN0YXJ0PSAtMTsKLQkJaW50IGk7Ci0JCWZvciAoaT0gMDsgaSA8IHNlZ0NvdW50ICYmIGN1clBvcyA8IGVuZDsgKytpKSB7Ci0JCQlTdHJpbmcgY3VycmVudD0gZlNlZ21lbnRzW2ldOwotCQkJaW50IG5leHRNYXRjaD0gcmVnRXhwUG9zSW4odGV4dCwgY3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotCQkJaWYgKG5leHRNYXRjaCA8IDAgKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYoaSA9PSAwKQotCQkJCW1hdGNoU3RhcnQ9IG5leHRNYXRjaDsKLQkJCWN1clBvcz0gbmV4dE1hdGNoICsgY3VycmVudC5sZW5ndGgoKTsKLQkJfQotCQlpZiAoaSA8IHNlZ0NvdW50KQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgUG9zaXRpb24obWF0Y2hTdGFydCwgY3VyUG9zKTsKLQl9Ci0JLyoqCi0JICogbWF0Y2ggdGhlIGdpdmVuIDxjb2RlPnRleHQ8L2NvZGU+IHdpdGggdGhlIHBhdHRlcm4gCi0JICogQHJldHVybiB0cnVlIGlmIG1hdGNoZWQgZWl0aGVyd2lzZSBmYWxzZQotCSAqIEBwYXJhbSB0ZXh0IGEgU3RyaW5nIG9iamVjdCAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbWF0Y2godGV4dCwgMCwgdGV4dC5sZW5ndGgoKSk7Ci0JfQotCS8qKgotCSAqIEdpdmVuIHRoZSBzdGFydGluZyAoaW5jbHVzaXZlKSBhbmQgdGhlIGVuZGluZyAoZXhjbHVzaXZlKSBwb3NpdGlvbnMgaW4gdGhlICAgCi0JICogPGNvZGU+dGV4dDwvY29kZT4sIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gc3Vic3RyaW5nIG1hdGNoZXMgd2l0aCBhUGF0dGVybiAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgdGV4dCBtYXRjaGVzIHRoZSBwYXR0ZXJuCi0JICogQHBhcmFtIHRleHQgYSBTdHJpbmcgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHN1YnN0cmluZyB0byBtYXRjaCAKLQkgKiBAcGFyYW0gc3RhcnQgbWFya3MgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIChpbmNsdXNpdmUpIG9mIHRoZSBzdWJzdHJpbmcKLQkgKiBAcGFyYW0gZW5kIG1hcmtzIHRoZSBlbmRpbmcgaW5kZXggKGV4Y2x1c2l2ZSkgb2YgdGhlIHN1YnN0cmluZyAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChudWxsID09IHRleHQpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkKLQkJaWYgKHN0YXJ0ID4gZW5kKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGZJZ25vcmVXaWxkQ2FyZHMpCi0JCQlyZXR1cm4gKGVuZCAtIHN0YXJ0ID09IGZMZW5ndGgpICYmIGZQYXR0ZXJuLnJlZ2lvbk1hdGNoZXMoZklnbm9yZUNhc2UsIDAsIHRleHQsIHN0YXJ0LCBmTGVuZ3RoKTsKLQkJaW50IHNlZ0NvdW50PSBmU2VnbWVudHMubGVuZ3RoOwotCQlpZiAoc2VnQ291bnQgPT0gMCAmJiAoZkhhc0xlYWRpbmdTdGFyIHx8IGZIYXNUcmFpbGluZ1N0YXIpKSAgLy8gcGF0dGVybiBjb250YWlucyBvbmx5ICcqJyhzKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChzdGFydCA9PSBlbmQpCi0JCQlyZXR1cm4gZkxlbmd0aCA9PSAwOwotCQlpZiAoZkxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHN0YXJ0ID09IGVuZDsJCi0JCSAKLQkJaW50IHRsZW49IHRleHQubGVuZ3RoKCk7Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydD0gMDsKLQkJaWYgKGVuZCA+IHRsZW4pCi0JCQllbmQ9IHRsZW47IAotCQkJCQkKLQkJaW50IHRDdXJQb3M9IHN0YXJ0OwotCQlpbnQgYm91bmQ9IGVuZCAtIGZCb3VuZDsKLQkJaWYgKCBib3VuZCA8IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpPTA7Ci0JCVN0cmluZyBjdXJyZW50PSBmU2VnbWVudHNbaV07Ci0JCWludCBzZWdMZW5ndGg9IGN1cnJlbnQubGVuZ3RoKCk7Ci0KLQkJLyogcHJvY2VzcyBmaXJzdCBzZWdtZW50ICovCi0JCWlmICghZkhhc0xlYWRpbmdTdGFyKXsgCi0JCQlpZighcmVnRXhwUmVnaW9uTWF0Y2hlcyh0ZXh0LCBzdGFydCwgY3VycmVudCwgMCwgc2VnTGVuZ3RoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJKytpOwotCQkJCXRDdXJQb3M9IHRDdXJQb3MgKyBzZWdMZW5ndGg7Ci0JCQl9Ci0JCX0KLQkJaWYgKChmU2VnbWVudHMubGVuZ3RoID09IDEpICYmICghZkhhc0xlYWRpbmdTdGFyKSAmJiAoIWZIYXNUcmFpbGluZ1N0YXIpKSB7Ci0JCQkvLyBvbmx5IG9uZSBzZWdtZW50IHRvIG1hdGNoLCBubyB3aWxkY2FyZHMgc3BlY2lmaWVkCi0JCQlyZXR1cm4gdEN1clBvcyA9PSBlbmQ7Ci0JCX0KLQkJLyogcHJvY2VzcyBtaWRkbGUgc2VnbWVudHMgKi8JCi0JCXdoaWxlIChpIDwgc2VnQ291bnQpIHsKLQkJCWN1cnJlbnQ9IGZTZWdtZW50c1tpXTsKLQkJCWludCBjdXJyZW50TWF0Y2g7Ci0JCQlpbnQgaz0gY3VycmVudC5pbmRleE9mKGZTaW5nbGVXaWxkQ2FyZCk7Ci0JCQlpZiAoayA8IDApIHsKLQkJCQljdXJyZW50TWF0Y2g9IHRleHRQb3NJbih0ZXh0LCB0Q3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotCQkJCWlmIChjdXJyZW50TWF0Y2ggPCAwKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgeyAKLQkJCQljdXJyZW50TWF0Y2g9IHJlZ0V4cFBvc0luKHRleHQsIHRDdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0JCQkJaWYgKGN1cnJlbnRNYXRjaCA8IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRDdXJQb3M9IGN1cnJlbnRNYXRjaCArIGN1cnJlbnQubGVuZ3RoKCk7Ci0JCQlpKys7Ci0JCX0KLQotCQkvKiBwcm9jZXNzIGZpbmFsIHNlZ21lbnQgKi8KLQkJaWYgKCFmSGFzVHJhaWxpbmdTdGFyICYmIHRDdXJQb3MgIT0gZW5kKSB7Ci0JCQlpbnQgY2xlbj0gY3VycmVudC5sZW5ndGgoKTsKLQkJCXJldHVybiByZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGVuZCAtIGNsZW4sIGN1cnJlbnQsIDAsIGNsZW4pOwotCQl9Ci0JCXJldHVybiBpID09IHNlZ0NvdW50IDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byBzZWdtZW50cyBzZXBlcmF0ZWQgYnkgd2lsZGNhcmQgJyonIGNoYXJhY3RlcnMuCi0JICogU2luY2Ugd2lsZGNhcmRzIGFyZSBub3QgYmVpbmcgdXNlZCBpbiB0aGlzIGNhc2UsIHRoZSBwYXR0ZXJuIGNvbnNpc3RzIG9mIGEgc2luZ2xlIHNlZ21lbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlTm9XaWxkQ2FyZHMoKSB7Ci0JCWZTZWdtZW50cz0gbmV3IFN0cmluZ1sxXTsKLQkJZlNlZ21lbnRzWzBdPSBmUGF0dGVybjsKLQkJZkJvdW5kPSBmTGVuZ3RoOwotCX0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byBzZWdtZW50cyBzZXBlcmF0ZWQgYnkgd2lsZGNhcmQgJyonIGNoYXJhY3RlcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlV2lsZENhcmRzKCkgewotCQlpZihmUGF0dGVybi5zdGFydHNXaXRoKCIqIikpLy8kTk9OLU5MUy0xJAotCQkJZkhhc0xlYWRpbmdTdGFyPSB0cnVlOwotCQlpZihmUGF0dGVybi5lbmRzV2l0aCgiKiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLyogbWFrZSBzdXJlIGl0J3Mgbm90IGFuIGVzY2FwZWQgd2lsZGNhcmQgKi8KLQkJCWlmIChmTGVuZ3RoID4gMSAmJiBmUGF0dGVybi5jaGFyQXQoZkxlbmd0aCAtIDIpICE9ICdcXCcpIHsKLQkJCQlmSGFzVHJhaWxpbmdTdGFyPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJVmVjdG9yPFN0cmluZz4gdGVtcD0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLQkJaW50IHBvcz0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAocG9zIDwgZkxlbmd0aCkgewotCQkJY2hhciBjPSBmUGF0dGVybi5jaGFyQXQocG9zKyspOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnXFwnOgotCQkJCQlpZiAocG9zID49IGZMZW5ndGgpIHsKLQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljaGFyIG5leHQ9IGZQYXR0ZXJuLmNoYXJBdChwb3MrKyk7Ci0JCQkJCQkvKiBpZiBpdCdzIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLwotCQkJCQkJaWYgKG5leHQgPT0gJyonIHx8IG5leHQgPT0gJz8nIHx8IG5leHQgPT0gJ1xcJykgewotCQkJCQkJCWJ1Zi5hcHBlbmQobmV4dCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8qIG5vdCBhbiBlc2NhcGUgc2VxdWVuY2UsIGp1c3QgaW5zZXJ0IGxpdGVyYWxseSAqLwotCQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJCQkJYnVmLmFwcGVuZChuZXh0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWJyZWFrOwotCQkJCWNhc2UgJyonOgotCQkJCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCQkJLyogbmV3IHNlZ21lbnQgKi8KLQkJCQkJCXRlbXAuYWRkRWxlbWVudChidWYudG9TdHJpbmcoKSk7Ci0JCQkJCQlmQm91bmQgKz0gYnVmLmxlbmd0aCgpOwotCQkJCQkJYnVmLnNldExlbmd0aCgwKTsKLQkJCQkJfQotCQkJCWJyZWFrOwotCQkJCWNhc2UgJz8nOgotCQkJCQkvKiBhcHBlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHNpbmdsZSBtYXRjaCB3aWxkY2FyZCAqLwotCQkJCQlidWYuYXBwZW5kKGZTaW5nbGVXaWxkQ2FyZCk7Ci0JCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCi0JCS8qIGFkZCBsYXN0IGJ1ZmZlciB0byBzZWdtZW50IGxpc3QgKi8KLQkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKLQkJCXRlbXAuYWRkRWxlbWVudChidWYudG9TdHJpbmcoKSk7Ci0JCQlmQm91bmQgKz0gYnVmLmxlbmd0aCgpOwotCQl9Ci0JCQkKLQkJZlNlZ21lbnRzPSBuZXcgU3RyaW5nW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC5jb3B5SW50byhmU2VnbWVudHMpOwotCX0KLQkvKiogCi0JICogQHBhcmFtIHRleHQgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgbm8gd2lsZGNhcmQKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCSAqIEBwYXJhbSBlbmQgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JICogQHJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIHBhdHRlcm4gLCBvciAtMSBpZiBub3QgZm91bmQgCi0JICovCi0JcHJvdGVjdGVkIGludCBwb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ly9ubyB3aWxkIGNhcmQgaW4gcGF0dGVybgotCQlpbnQgbWF4PSBlbmQgLSBmTGVuZ3RoOwotCQkKLQkJaWYgKCFmSWdub3JlQ2FzZSkgewotCQkJaW50IGk9IHRleHQuaW5kZXhPZihmUGF0dGVybiwgc3RhcnQpOwotCQkJaWYgKGkgPT0gLTEgfHwgaSA+IG1heCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaT0gc3RhcnQ7IGkgPD0gbWF4OyArK2kpIHsKLQkJCWlmICh0ZXh0LnJlZ2lvbk1hdGNoZXModHJ1ZSwgaSwgZlBhdHRlcm4sIDAsIGZMZW5ndGgpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCQotCQlyZXR1cm4gLTE7Ci0JfQotCS8qKiAKLQkgKiBAcGFyYW0gdGV4dCBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXkgb25seSBjb250YWluICc/JyhzKQotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCi0JICogQHBhcmFtIGVuZCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLQkgKiBAcGFyYW0gcCBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXkgY29udGFpbnMgJz8nCi0JICogQHJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIHBhdHRlcm4gLCBvciAtMSBpZiBub3QgZm91bmQgCi0JICovCi0JcHJvdGVjdGVkIGludCByZWdFeHBQb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgewotCQlpbnQgcGxlbj0gcC5sZW5ndGgoKTsKLQkJCi0JCWludCBtYXg9IGVuZCAtIHBsZW47Ci0JCWZvciAoaW50IGk9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JCQlpZiAocmVnRXhwUmVnaW9uTWF0Y2hlcyh0ZXh0LCBpLCBwLCAwLCBwbGVuKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVnRXhwUmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IHRTdGFydCwgU3RyaW5nIHAsIGludCBwU3RhcnQsIGludCBwbGVuKSB7Ci0JCXdoaWxlIChwbGVuLS0gPiAwKSB7Ci0JCQljaGFyIHRjaGFyPSB0ZXh0LmNoYXJBdCh0U3RhcnQrKyk7Ci0JCQljaGFyIHBjaGFyPSBwLmNoYXJBdChwU3RhcnQrKyk7Ci0KLQkJCS8qIHByb2Nlc3Mgd2lsZCBjYXJkcyAqLwotCQkJaWYgKCFmSWdub3JlV2lsZENhcmRzKSB7Ci0JCQkJLyogc2tpcCBzaW5nbGUgd2lsZCBjYXJkcyAqLwotCQkJCWlmIChwY2hhciA9PSBmU2luZ2xlV2lsZENhcmQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBjaGFyID09IHRjaGFyKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGZJZ25vcmVDYXNlKSB7Ci0JCQkJaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHBjaGFyKSkKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gY29tcGFyaW5nIGFmdGVyIGNvbnZlcnRpbmcgdG8gdXBwZXIgY2FzZSBkb2Vzbid0IGhhbmRsZSBhbGwgY2FzZXM7Ci0JCQkJLy8gYWxzbyBjb21wYXJlIGFmdGVyIGNvbnZlcnRpbmcgdG8gbG93ZXIgY2FzZQotCQkJCWlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodGNoYXIpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShwY2hhcikpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiogCi0JICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBtYXRjaAotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCi0JICogQHBhcmFtIGVuZCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLQkgKiBAcGFyYW0gcCBhIHN0cmluZyB0aGF0IGhhcyBubyB3aWxkY2FyZAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotCSAqLwotCXByb3RlY3RlZCBpbnQgdGV4dFBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBwKSB7IAotCQkKLQkJaW50IHBsZW49IHAubGVuZ3RoKCk7Ci0JCWludCBtYXg9IGVuZCAtIHBsZW47Ci0JCQotCQlpZiAoIWZJZ25vcmVDYXNlKSB7Ci0JCQlpbnQgaT0gdGV4dC5pbmRleE9mKHAsIHN0YXJ0KTsKLQkJCWlmIChpID09IC0xIHx8IGkgPiBtYXgpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIGk7Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JCQlpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIHAsIDAsIHBsZW4pKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gY29udmVydEZyb21TdHJpbmcoU3RyaW5nIHBhdHRlcm5zLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXI9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybnMsIHNlcGFyYXRvciwgdHJ1ZSk7Ci0JCWludCB0b2tlbkNvdW50PSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdD0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRva2VuQ291bnQpOwotCQlib29sZWFuIGVzY2FwZT0gZmFsc2U7Ci0JCWJvb2xlYW4gYXBwZW5kPSBmYWxzZTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbj0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmIChzZXBhcmF0b3IuZXF1YWxzKHRva2VuKSkgewotCQkJCWlmICghZXNjYXBlKQotCQkJCQllc2NhcGU9IHRydWU7Ci0JCQkJZWxzZSB7Ci0JCQkJCWFkZFBhdHRlcm4ocmVzdWx0LCBzZXBhcmF0b3IpOwotCQkJCQlhcHBlbmQ9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlICB7Ci0JCQkJaWYgKCFhcHBlbmQpCi0gCQkJCQlyZXN1bHQuYWRkKHRva2VuKTsKLQkJCQllbHNlCi0JCQkJCWFkZFBhdHRlcm4ocmVzdWx0LCB0b2tlbik7Ci0JCQkJYXBwZW5kPSBmYWxzZTsKLQkJCQllc2NhcGU9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUGF0dGVybihMaXN0PFN0cmluZz4gbGlzdCwgU3RyaW5nIHBhdHRlcm4pIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJbGlzdC5hZGQocGF0dGVybik7Ci0JCWVsc2UgewotCQkJaW50IGluZGV4PSBsaXN0LnNpemUoKSAtIDE7Ci0JCQlsaXN0LnNldChpbmRleCwgKChTdHJpbmcpbGlzdC5nZXQoaW5kZXgpKSArIHBhdHRlcm4pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZ1tdIHBhdHRlcm5zLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCWludCBsZW5ndGg9IHBhdHRlcm5zLmxlbmd0aDsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobGVuZ3RoID4gMCkKLQkJCXN0ckJ1Zi5hcHBlbmQoZXNjYXBlU2VwYXJhdG9yKHBhdHRlcm5zWzBdLCBzZXBhcmF0b3IpKTsKLQkJZWxzZQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBpPSAxOwotCQl3aGlsZSAoaSA8IGxlbmd0aCkgewotCQkJc3RyQnVmLmFwcGVuZChzZXBhcmF0b3IpOwotCQkJc3RyQnVmLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlzdHJCdWYuYXBwZW5kKGVzY2FwZVNlcGFyYXRvcihwYXR0ZXJuc1tpKytdLCBzZXBhcmF0b3IpKTsKLQkJfQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlc2NhcGVTZXBhcmF0b3IoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJaW50IGxlbmd0aD0gcGF0dGVybi5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2g9IHBhdHRlcm4uY2hhckF0KGkpOyAKLQkJCWlmIChzZXBhcmF0b3IuZXF1YWxzKFN0cmluZy52YWx1ZU9mKGNoKSkpCi0JCQkJYnVmLmFwcGVuZChjaCk7Ci0JCQlidWYuYXBwZW5kKGNoKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRGcm9tU3RyaW5nKFN0cmluZyBwYXR0ZXJucykgewotCQlyZXR1cm4gY29udmVydEZyb21TdHJpbmcocGF0dGVybnMsIFNFUEFSQVRPUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUj0gIiwiOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaHJlYWRVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RocmVhZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViNDIzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RocmVhZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgaGFuZGxpbmcgdGhyZWFkcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRVdGlsIHsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFRocmVhZFV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUHV0cyB0aGUgY3VycmVudCB0aHJlYWQgdG8gc2xlZXAgZm9yIGEgZ2l2ZW4gZHVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHRpbWUKLQkgKiAgICAgICAgICAgIFRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhdXNlKGxvbmcgdGltZSkgewotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKHRpbWUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGltZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGltZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmMjk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RpbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogQSBzaW1wbGUgdGltZXIgZm9yIHRyYWNraW5nIHRpbWUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lciB7Ci0KLQlwcml2YXRlIGxvbmcgaW5pdFRpbWU7Ci0KLQlwcml2YXRlIGxvbmcgc3RhcnRUaW1lOwotCi0JcHJpdmF0ZSBsb25nIGVuZFRpbWU7Ci0KLQlwdWJsaWMgVGltZXIoKSB7Ci0JCXN0YXJ0KCk7Ci0JCWluaXRUaW1lID0gc3RhcnRUaW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQlzdGFydFRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWVuZFRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGltZSgpIHsKLQkJcmV0dXJuIChpbnQpIChlbmRUaW1lIC0gc3RhcnRUaW1lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvdGFsVGltZSgpIHsKLQkJcmV0dXJuIChpbnQpIChlbmRUaW1lIC0gaW5pdFRpbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9XYXJVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1dhclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkY2VmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1dhclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5XYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLQotCi1wdWJsaWMgY2xhc3MgV2FyVXRpbCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd2FyIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG91dHB1dFdhckZpbGUKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCB3YXIgZmlsZQotCSAqIEBwYXJhbSB3ZWJBcHBEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgYW5kIHN1YgotCSAqICAgICAgICAgICAgZGlyZWN0b3JpZXMgdG8gYmUgd2FyZWQKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgemlwIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnVpbGRXYXJGaWxlKFN0cmluZyBvdXRwdXRXYXJGaWxlLCBTdHJpbmcgd2ViQXBwRGlyZWN0b3J5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlQcm9qZWN0IGFudFByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotCQkJYW50UHJvamVjdC5pbml0KCk7Ci0JCQlXYXIgd2FyVGFzayA9IG5ldyBXYXIoKTsKLQkJCXdhclRhc2suc2V0UHJvamVjdChhbnRQcm9qZWN0KTsKLQkJCXdhclRhc2suc2V0RGVzdEZpbGUobmV3IEZpbGUob3V0cHV0V2FyRmlsZSkpOwotCQkJd2FyVGFzay5zZXRXZWJ4bWwobmV3IEZpbGUod2ViQXBwRGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyAiV0VCLUlORiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgIndlYi54bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGVTZXQgd2ViRmlsZXMgPSBuZXcgRmlsZVNldCgpOwotCQkJd2ViRmlsZXMuc2V0RGlyKG5ldyBGaWxlKHdlYkFwcERpcmVjdG9yeSkpOwotCQkJd2FyVGFzay5hZGRGaWxlc2V0KHdlYkZpbGVzKTsKLQkJCXdhclRhc2suZXhlY3V0ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1hNTFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWE1MVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzgyYTM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWE1MVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwcm9jZXNzaW5nIFhNTCBkb2N1bWVudHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxVdGlsIHsKLQotCS8qKgotCSAqIFhNTCBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfREVDTEFSQVRJT04gPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogWE1MIEVzY2FwZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9BTVAgPSAiJmFtcDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfQkFDS1NMQVNIID0gIiYjOTI7IjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9BUE9TID0gIiZhcG9zOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9DUiA9ICImIzEzOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9HVCA9ICImZ3Q7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0xUID0gIiZsdDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfTEYgPSAiJiMxMDsiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX1FVT1QgPSAiJnF1b3Q7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX1RBQiA9ICImIzk7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDUkxGX0JZVEVTID0gQ1JMRi5nZXRCeXRlcygpOwotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgWE1MVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDbG9uZXMgdGhlIGdpdmVuIERPTSBub2RlIGludG8gdGhlIGdpdmVuIERPTSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgVGhlIERPTSBub2RlIHRvIGNsb25lLgotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgRE9NIGRvY3VtZW50LgotCSAqIEByZXR1cm4gVGhlIGNsb25lZCBub2RlIGluIHRoZSB0YXJnZXQgRE9NIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBjbG9uZU5vZGUoTm9kZSBub2RlLCBEb2N1bWVudCBkb2MpIHsKLQkJTm9kZSBjbG9uZSA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQljbG9uZSA9IGRvYy5jcmVhdGVFbGVtZW50KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgYXR0ck5vZGUgPSBhdHRycy5pdGVtKGkpOwotCQkJCUF0dHIgYXR0ckNsb25lID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZShhdHRyTm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQlhdHRyQ2xvbmUuc2V0Tm9kZVZhbHVlKGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCQkoKEVsZW1lbnQpIGNsb25lKS5zZXRBdHRyaWJ1dGVOb2RlKGF0dHJDbG9uZSk7Ci0JCQl9Ci0KLQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGNoaWxkIG5vZGVzLgotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCU5vZGUgY2hpbGROb2RlID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotCQkJCQlOb2RlIGNoaWxkQ2xvbmUgPSBjbG9uZU5vZGUoY2hpbGROb2RlLCBkb2MpOwotCQkJCQljbG9uZS5hcHBlbmRDaGlsZChjaGlsZENsb25lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgotCQkJY2xvbmUgPSBkb2MuY3JlYXRlVGV4dE5vZGUobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCWNsb25lLnNldE5vZGVWYWx1ZShub2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBjbG9uZTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIGEgWE1MIGF0dHJpYnV0ZSB0byBtYWtlIGl0IFhNTCBwYXJzZXIgZnJpZW5kbHkuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBhdHRyaWJ1dGUgc3RyaW5nLgotCSAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZUF0dHIoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnOgotCQkJCXNiLmFwcGVuZChYTUxfTFQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9BTVApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnIic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9RVU9UKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgdG8gbWFrZSBpdCBYTUwgcGFyc2VyIGZyaWVuZGx5LgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nLgotCSAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0dUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCXNiLmFwcGVuZChYTUxfQU1QKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyInOgotCQkJCXNiLmFwcGVuZChYTUxfUVVPVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcJyc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9BUE9TKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xyJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0NSKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0xGKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xcJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0JBQ0tTTEFTSCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogRXNjYXBlcyB0aGUgZ2l2ZW4gc3RyaW5nIHRvIG1ha2UgaXQgWE1MIHBhcnNlciBmcmllbmRseS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgc291cmNlIHN0cmluZy4KLQkgKiBAcGFyYW0gaWdub3JlQ1JMRgotCSAqICAgICAgICAgICAgSWYgdHJ1ZSwgZG8gbm90IGVzY2FwZSB0aGUgQ1IgYW5kIExGIGNoYXJhY3RlcnMuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzdHIsIGJvb2xlYW4gaWdub3JlQ1JMRikgewotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnOgotCQkJCXNiLmFwcGVuZChYTUxfTFQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9HVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcmJzoKLQkJCQkvLyBUaGlzIGlzIHRvIGF2b2lkIHRoZSBkb3VibGUgZXNjYXBpbmcgKHNlZSBCdWd6aWxsYSAxNzk5MjEpCi0JCQkJaWYgKCFzdHIuc3RhcnRzV2l0aChYTUxfTFQrInAvIiwgaSkgJiYgIXN0ci5zdGFydHNXaXRoKFhNTF9BUE9TLCBpKSAvLyROT04tTkxTLTEkIAotCQkJCQkJJiYgIXN0ci5zdGFydHNXaXRoKFhNTF9BTVAsIGkpKQotCQkJCQlzYi5hcHBlbmQoWE1MX0FNUCk7Ci0JCQkJZWxzZQotCQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnIic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9RVU9UKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wnJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FQT1MpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInOgotCQkJCWlmIChpZ25vcmVDUkxGKQotCQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWVsc2UKLQkJCQkJc2IuYXBwZW5kKFhNTF9DUik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbic6Ci0JCQkJaWYgKGlnbm9yZUNSTEYpCi0JCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJZWxzZQotCQkJCQlzYi5hcHBlbmQoWE1MX0xGKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmVzY2FwZXMgdGhlIGdpdmVuIFhNTCBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBzdHJpbmcuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyYnOgotCQkJCWlmIChzdHIuc3RhcnRzV2l0aChYTUxfTFQsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnPCcpOwotCQkJCQlpICs9IDM7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfR1QsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnPicpOwotCQkJCQlpICs9IDM7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfQU1QLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJyYnKTsKLQkJCQkJaSArPSA0OwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX1FVT1QsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnIicpOwotCQkJCQlpICs9IDU7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfQVBPUywgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCJcJyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWkgKz0gNTsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9DUiwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCdccicpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfTEYsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJCQkJaSArPSA0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSB4bWxEb2MKLQkgKiAgICAgICAgICAgIFRoZSBET00gZG9jdW1lbnQuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCBzdHJlYW0uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRG9jdW1lbnQoRG9jdW1lbnQgeG1sRG9jLCBPdXRwdXRTdHJlYW0gb3V0cHV0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXRwdXQpOwotCQl3cml0ZU5vZGUoeG1sRG9jLCAiIiwgb3V0KTsgLy8kTk9OLU5MUy0xJAotCQlvdXQuZmx1c2goKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBkb2N1bWVudCB0byB0aGUgUHJpbnRXcml0ZXIuCi0JICogCi0JICogQHBhcmFtIHhtbERvYwotCSAqICAgICAgICAgICAgVGhlIERPTSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gcHcKLQkgKiAgICAgICAgICAgIFRoZSBQcmludFdyaXRlciBvYmplY3QuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRG9jdW1lbnQoRG9jdW1lbnQgeG1sRG9jLCBQcmludFdyaXRlciBwdykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvcyk7Ci0JCXdyaXRlTm9kZSh4bWxEb2MsICIiLCBvdXQpOyAvLyROT04tTkxTLTEkCi0JCW91dC5mbHVzaCgpOwotCQkvLyBGSVhNRSEgTmVlZCB0byBzcGVjaWZ5IGVuY29kaW5nPwotCQlTdHJpbmcgcyA9IG9zLnRvU3RyaW5nKCk7Ci0JCXB3LndyaXRlKHMpOwotCQlwdy5mbHVzaCgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gZG9jdW1lbnQgdG8gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRG9jCi0JICogICAgICAgICAgICBUaGUgRE9NIGRvY3VtZW50LgotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBUaGUgWE1MIGZpbGUuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVEb2N1bWVudChEb2N1bWVudCB4bWxEb2MsIFN0cmluZyB4bWxGaWxlKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQl4bWxGaWxlKSk7Ci0JCXdyaXRlTm9kZSh4bWxEb2MsICIiLCBvdXQpOyAvLyROT04tTkxTLTEkCi0JCW91dC5mbHVzaCgpOwotCQlvdXQuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZ2l2ZW4gWE1MIHN0cmluZyB0byB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBmaWxlLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlRG9jdW1lbnQoU3RyaW5nIHhtbFN0ciwgU3RyaW5nIHhtbEZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCXhtbEZpbGUpKTsKLQkJb3V0LndyaXRlKHhtbFN0ci5nZXRCeXRlcygpKTsKLQkJb3V0LmZsdXNoKCk7Ci0JCW91dC5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZ2l2ZW4gRE9NIHRyZWUgbm9kZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgVGhlIERPTSBub2RlLgotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgaW5kZW50YXRpb24gKGNvbnRhaW5pbmcgc3BhY2UgY2hhcmFjdGVycykuCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCBzdHJlYW0uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZU5vZGUoTm9kZSBub2RlLCBTdHJpbmcgaW5kZW50LCBEYXRhT3V0cHV0U3RyZWFtIG91dCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXh0OwotCi0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOgotCQkJLy8gV3JpdGUgdGhlIFhNTCBmaWxlIHNpZ25hdHVyZS4KLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcyhYTUxfREVDTEFSQVRJT04pKTsKLQkJCW91dC53cml0ZShDUkxGX0JZVEVTKTsKLQotCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggY2hpbGQgbm9kZXMuCi0JCQlOb2RlTGlzdCBub2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJd3JpdGVOb2RlKG5vZGVzLml0ZW0oaSksICIiLCBvdXQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGluZGVudCArICI8IiArIG5hbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGF0dHJOb2RlID0gYXR0cnMuaXRlbShpKTsKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIiAiICsgYXR0ck5vZGUuZ2V0Tm9kZU5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkrICI9XCIiICsgZXNjYXBlKGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKSArICJcIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIj4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC53cml0ZShDUkxGX0JZVEVTKTsKLQotCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggY2hpbGQgbm9kZXMuCi0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpZiAoY2hpbGROb2RlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJd3JpdGVOb2RlKGNoaWxkTm9kZXMuaXRlbShpKSwgaW5kZW50LCBvdXQpOwotCQkJCX0KLQkJCX0KLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcyhpbmRlbnQgKyAiPC8iICsgbmFtZSArICI+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW91dC53cml0ZShDUkxGX0JZVEVTKTsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJCXRleHQgPSBTdHJVdGlsLnJlbW92ZVdoaXRlU3BhY2VDaGFycyhub2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcyhlc2NhcGUodGV4dCkpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0JCQl0ZXh0ID0gU3RyVXRpbC5yZW1vdmVXaGl0ZVNwYWNlQ2hhcnMobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIjwhW0NEQVRBWyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcyh0ZXh0KSk7Ci0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCJdXT4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCI8PyIgKyBub2RlLmdldE5vZGVOYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIgIiArIG5vZGUuZ2V0Tm9kZVZhbHVlKCkgKyAiPz4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiJiIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiOyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbG9jYXRpb24gd2hlcmUgdGhlIGdpdmVuIFNBWCBleGNlcHRpb24gb2NjdXJyZWQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBTQVggcGFyc2UgZXhjZXB0aW9uLgotCSAqIEByZXR1cm4gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZSBsb2NhdGlvbiB3aGVyZSB0aGUgZXhjZXB0aW9uCi0JICogICAgICAgICBvY2N1cnJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhdGlvbk9mRXhjZXB0aW9uKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoInJvdyAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoZS5nZXRMaW5lTnVtYmVyKCkpOwotCQlzYi5hcHBlbmQoIiwgY29sICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChlLmdldENvbHVtbk51bWJlcigpKTsKLQotCQlTdHJpbmcgc3lzdGVtSWQgPSBlLmdldFN5c3RlbUlkKCk7Ci0JCWlmIChzeXN0ZW1JZCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBzeXN0ZW1JZC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJc3lzdGVtSWQgPSBzeXN0ZW1JZC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCX0KLQkJCXNiLmFwcGVuZCgiIG9mIFhNTCBkb2N1bWVudCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKHN5c3RlbUlkKTsKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbG9hZFhtbChGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotCQkJCS5uZXdJbnN0YW5jZSgpOwotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0JCXJldHVybiBidWlsZGVyLnBhcnNlKGZpbGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBidWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkKLQkJCQkubmV3SW5zdGFuY2UoKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBidWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJcmV0dXJuIGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXh0IG9mIGEgbGVhZiBub2RlLCB3aXRob3V0IGNoaWxkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlVGV4dChFbGVtZW50IHRhZykgewotCQlTdHJpbmcgdGV4dCA9IHRhZy50b1N0cmluZygpOwotCQlpbnQgaSA9IHRleHQuaW5kZXhPZigiPiIpOyAvLyROT04tTkxTLTEkCi0JCWludCBqID0gdGV4dC5sYXN0SW5kZXhPZigiPC8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaSA8IDAgfHwgaiA8IDAgfHwgaiA8IGkpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKGkgKyAxLCBqKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDaGlsZFRleHQoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJRWxlbWVudCBjaGlsZCA9IGdldEZpcnN0Q2hpbGQodGFnLCBjaGlsZFRhZ05hbWUpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE5vZGVUZXh0KGNoaWxkKTsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRGaXJzdENoaWxkKEVsZW1lbnQgdGFnLCBTdHJpbmcgY2hpbGRUYWdOYW1lKSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gdGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnTmFtZSk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIChFbGVtZW50KSBub2Rlcy5pdGVtKDApOwotCX0KLQotCS8qKgotCSAqIGl0ZXJhdG9yIG9mIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHJldHVybiBJdGVyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgY2hpbGRJdGVyYXRvcihFbGVtZW50IHRhZykgewotCQlOb2RlTGlzdCBub2RlcyA9IHRhZy5nZXRDaGlsZE5vZGVzKCk7Ci0KLQkJLy8gTm9kZUxpc3QgY29udGFpbnMgbm8gRWxlbWVudCBub2RlcyBzdWNoIGFzIHRleHQgbm9kZXMsIGlnbm9yZSB0aG9zZQotCQlMaXN0PE5vZGU+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOwotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudHMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJaW50IGN1cnJlbnRJbmRleCA9IC0xOwotCi0JCWludCBzaXplID0gMDsKLQotCQlOb2RlTGlzdCBub2RlcyA9IG51bGw7Ci0KLQkJcHVibGljIE5vZGVJdGVyYXRvcihOb2RlTGlzdCBub2RlcykgewotCQkJdGhpcy5ub2RlcyA9IG5vZGVzOwotCQkJaWYgKG5vZGVzICE9IG51bGwpCi0JCQkJc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJLy8gRG8gbm90aGluZywgdGhpcyBpcyBhIHJlYWRvbmx5IGl0ZXJhdG9yLgotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBjdXJyZW50SW5kZXggKyAxIDwgc2l6ZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmIChoYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gbm9kZXMuaXRlbSgrK2N1cnJlbnRJbmRleCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaXRlcmF0b3Igb2YgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIEl0ZXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBjaGlsZEl0ZXJhdG9yKEVsZW1lbnQgdGFnLCBTdHJpbmcgY2hpbGRUYWdOYW1lKSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gdGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnTmFtZSk7Ci0JCXJldHVybiBuZXcgTm9kZUl0ZXJhdG9yKG5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGltbWVkaWF0ZSBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBnaXZlbiB0YWcgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogQHJldHVybiBsaXN0IG9mIHtAbGluayBFbGVtZW50fSBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PEVsZW1lbnQ+IGdldENoaWxkRWxlbWVudHNCeVRhZ05hbWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGFnTmFtZSkgewkKLQkJTGlzdDxFbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKLQkJTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IGxpc3QuZ2V0TGVuZ3RoKCk7IAotCQlpZihzaXplID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQkJaWYobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJRWxlbWVudCBlID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCWlmKGUuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWdOYW1lKSkgewotCQkJCQkJZWxlbWVudHMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0YWcgbmFtZSBpbiB0aGUgaW1tZWRpYXRlIGNoaWxkIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEZpcnN0Q2hpbGRFbGVtZW50QnlUYWdOYW1lKE5vZGUgZWxlbWVudCwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IGxpc3QuZ2V0TGVuZ3RoKCk7IAotCQlpZihzaXplID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQkJaWYobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJRWxlbWVudCBlID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCWlmKGUuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWdOYW1lKSkgewotCQkJCQkJcmV0dXJuIGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWmlwVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9aaXBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjczMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9aaXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB6aXAgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgWmlwVXRpbCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgemlwIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHppcEZpbGVQYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0YXJnZXQgemlwIGZpbGUKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgYW5kIHN1YgotCSAqICAgICAgICAgICAgZGlyZWN0b3JpZXMgdG8gYmUgemlwcGVkCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHppcCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVppcEZpbGUoU3RyaW5nIHppcEZpbGVQYXRoLCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVppcE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQkJemlwRmlsZVBhdGgpKTsKLQkJCUZpbGUgY29udGVudERpciA9IG5ldyBGaWxlKGNvbnRlbnRQYXRoKTsKLQkJCXBvcHVsYXRlWmlwRmlsZShvdXQsIGNvbnRlbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbnRlbnREaXIsCi0JCQkJCW1vbml0b3IpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgYSB6aXAgZmlsZSB3aXRoIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICBhIHppcCBmaWxlIG91dHB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gcm9vdFBhdGgKLQkgKiAgICAgICAgICAgIGEgcm9vdCBwYXRoIHRoYXQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUKLQkgKiAgICAgICAgICAgIHppcCBjb250ZW50Ci0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBvcHVsYXRlWmlwRmlsZShaaXBPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgcm9vdFBhdGgsCi0JCQlGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQlwb3B1bGF0ZVppcEZpbGUob3V0LCByb290UGF0aCwgZmlsZXNbaV0sIG1vbml0b3IpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBmaWxlUGF0aCA9IGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKTsKLQkJCQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoCi0JCQkJCQkJLnN1YnN0cmluZyhyb290UGF0aC5sZW5ndGgoKSArIDEpOwotCQkJCQlvdXQucHV0TmV4dEVudHJ5KG5ldyBaaXBFbnRyeShyZWxhdGl2ZVBhdGgpKTsKLQkJCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQkJCQlpbnQgbGVuOwotCQkJCQl3aGlsZSAoKGxlbiA9IGluLnJlYWQoYnVmZmVyKSkgPiAwKSB7Ci0JCQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOwotCQkJCQl9Ci0JCQkJCW91dC5jbG9zZUVudHJ5KCk7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE2YmFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbW9uIGNsaXBib2FyZCwgZmlsZSwgSTE4TiwgaW1hZ2UsIG5ldHdvcmtpbmcsIHN0cmluZyBtYW5pcHVsYXRpb24gYW5kIHRocmVhZGluZyBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9BYnN0cmFjdFNBWFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvQWJzdHJhY3RTQVhQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5MWExZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9BYnN0cmFjdFNBWFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgU0FYIHBhcnNlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnNlIGEgc2luZ2xlIFhNTCBmaWxlIG9yIGEKLSAqIGRpcmVjdG9yeSBvZiBYTUwgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTQVhQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGUgbG9nZ2VyIHVzZWQgZm9yIGxvZ2dpbmcgd2FybmluZ3MsIGVycm9ycyBhbmQgZXhjZXB0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IFhNTCBmaWxlIGJlaW5nIHBhcnNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbEZpbGU7Ci0KLQkvKioKLQkgKiBUaGUgU3RyaW5nIGJ1ZmZlciBmb3IgYWNjdW11bGF0aW5nIHRleHQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBzdHJCdWY7Ci0KLQkvKioKLQkgKiBUaGUgWE1MIHZhbGlkYXRpbmcgZmxhZy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RTYXhQYXJzZXI8L2NvZGU+IGdpdmVuIHRoZSB2YWxpZGF0aW5nIGZsYWcuCi0JICogCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqICAgICAgICAgICAgVGhlIGxvZ2dlciBmb3IgbG9nZ2luZyB3YXJuaW5ncyBhbmQgZXJyb3JzLgotCSAqIEBwYXJhbSB2YWxpZGF0aW5nCi0JICogICAgICAgICAgICBJZiB0cnVlLCB2YWxpZGF0ZSB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFNBWFBhcnNlcihMb2dnZXIgbG9nZ2VyLCBib29sZWFuIHZhbGlkYXRpbmcpIHsKLQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JCXRoaXMudmFsaWRhdGluZyA9IHZhbGlkYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBYTUwgZGlyZWN0b3J5IG9yIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhtbFBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgZGlyZWN0b3J5IG9yIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHhtbFBhdGgpIHsKLQkJU3RyaW5nIHBhdGhOYW1lID0gU3RyVXRpbC5yZXBsYWNlKHhtbFBhdGgsICIlMjAiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJRmlsZSBwYXRoID0gbmV3IEZpbGUocGF0aE5hbWUpOwotCQlGaWxlW10gZmlsZXMgPSBwYXRoLmlzRmlsZSgpID8gbmV3IEZpbGVbXSB7IHBhdGggfSA6IHBhdGgubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJzZUZpbGUoZmlsZXNbaV0uZ2V0QWJzb2x1dGVGaWxlKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7Ci0JCQkJCQkJbG9nZ2VyCi0JCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCSJGYWlsZWQgdG8gcGFyc2UgXCIiICsgZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkgKyAnIicsIGUpOyAvLyROT04tTkxTLTEkCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIFhNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBUaGUgWE1MIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VGaWxlKEZpbGUgeG1sRmlsZSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJLy8gQ3JlYXRlIHRoZSBTQVggcGFyc2VyIGZhY3RvcnkuCi0JCVNBWFBhcnNlckZhY3Rvcnkgc3BmID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0JCS8vIFNldCB0aGUgWE1MIHZhbGlkYXRpbmcgZmxhZy4KLQkJc3BmLnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBTQVggcGFyc2VyLgotCQlTQVhQYXJzZXIgc2F4UGFyc2VyID0gc3BmLm5ld1NBWFBhcnNlcigpOwotCi0JCS8vIEdldCB0aGUgU0FYIFhNTCByZWFkZXIuCi0JCVhNTFJlYWRlciB4bWxSZWFkZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0KLQkJLy8gU2V0IHRoZSBTQVggcGFyc2VyIGhhbmRsZXJzIHRvIHRoaXMgY2xhc3MuCi0JCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLQkJeG1sUmVhZGVyLnNldEVycm9ySGFuZGxlcih0aGlzKTsKLQotCQkvLyBJbnN0cnVjdCB0aGUgU0FYIHBhcnNlciB0byBwYXJzZSB0aGUgZ2l2ZW4gWE1MIGZpbGUuCi0JCXRoaXMueG1sRmlsZSA9IHhtbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCXhtbFJlYWRlci5wYXJzZShOZXRVdGlsLmdldFVyaSh4bWxGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgc3RhcnRzIHRvIHBhcnNlIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgewotCQlzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHRoZSBYTUwgcGFyc2VyIGVuY291bnRlcnMgdGhlIGNoYXJhcmFjdGVyIGRhdGEgd2l0aGluIGEKLQkgKiB0ZXh0IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmZmVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3RyQnVmLmFwcGVuZChidWZmZXIsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgc3RhcnRzIHRvIHBhcnNlIGVhY2ggbmV3IGVsZW1lbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgWE1MIHBhcnNlciByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGFuIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJMLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJU3RyaW5nIHFuYW1lKTsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBYTUwgcGFyc2VyIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgU0FYIHBhcnNpbmcgd2FybmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgVGhlIFNBWCBwYXJzZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dXYXJuaW5nKCJTQVggcGFyc2luZyB3YXJuaW5nIGVuY291bnRlcmVkIGF0ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgWE1MVXRpbC5nZXRMb2NhdGlvbk9mRXhjZXB0aW9uKGUpCi0JCQkJCQkJKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBTQVggcGFyc2luZyBlcnJvci4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgVGhlIFNBWCBwYXJzZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIlNBWCBwYXJzaW5nIGVycm9yIGVuY291bnRlcmVkIGF0ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgWE1MVXRpbC5nZXRMb2NhdGlvbk9mRXhjZXB0aW9uKGUpCi0JCQkJCQkJKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBTQVggbm9uLXJlY292ZXJhYmxlIGVycm9yIGFuZCBleGl0cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgVGhlIFNBWCBwYXJzZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKCJTQVggcGFyc2luZyBmYXRhbCBlcnJvciBlbmNvdW50ZXJlZCBhdCAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIFhNTFV0aWwuZ2V0TG9jYXRpb25PZkV4Y2VwdGlvbihlKQotCQkJCQkJCSsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBYTUwgZmlsZSB0aGF0IGlzIGJlaW5nIHBhcnNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBYTUwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiB4bWxGaWxlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL1hTTFRQcm9jZXNzb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL1hTTFRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5ZjZhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9YU0xUUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEEgd3JhcHBlciBvdmVyIHRoZSBYU0xUIHByb2Nlc3NvciBidW5kbGVkIHdpdGggdGhlIEpSRS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xUUHJvY2Vzc29yIHsKLQotCS8vIElmIHRydWUsIGNhY2hlIHRoZSBjb21waWxlZCB0aGUgWFNMIHRyYW5zZm9ybWVyIHdpdGggdGhlIGNvbXBpbGVkIFhTTAotCS8vIHRlbXBsYXRlcy4KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhY2hlWFNMOwotCi0JLy8gQ2FjaGVzIHRoZSBYU0wgdHJhbnNmb3JtZXJzLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIENhY2hlZFRyYW5zZm9ybWVyPiB0cmFuc2Zvcm1lckNhY2hlOwotCi0Jc3RhdGljIHsKLQkJU3RyaW5nIGNhY2hlWFNMUHJvcGVydHkgPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygKLQkJCQkiY2FjaGVYU0wiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY2FjaGVYU0xQcm9wZXJ0eSAhPSBudWxsICYmICFjYWNoZVhTTFByb3BlcnR5LnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQljYWNoZVhTTCA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihjYWNoZVhTTFByb3BlcnR5KTsKLQkJfSBlbHNlIHsKLQkJCWNhY2hlWFNMID0gdHJ1ZTsKLQkJfQotCQlpZiAoY2FjaGVYU0wpIHsKLQkJCXRyYW5zZm9ybWVyQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENhY2hlZFRyYW5zZm9ybWVyPigpOwotCQl9Ci0KLQkJLy8gSW5jcmVhc2UgdGhlIGVudGl0eSBleHBhbnNpb24gbGluZSBsaW1pdCB0byBoYW5kbGUgYSBsYXJnZXIgbnVtYmVyIG9mCi0JCS8vIFhNTCBlbnRpdGllcy4KLQkJU3lzdGVtLnNldFByb3BlcnR5KCJlbnRpdHlFeHBhbnNpb25MaW1pdCIsICIxMDAwMDAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgcHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZwotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIFhTTFRQcm9jZXNzb3IoKSB7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHNvdXJjZSwgWE1MIHNvdXJjZSwgdGFyZ2V0Ci0JICogb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsU291cmNlCi0JICogICAgICAgICAgICBUaGUgWFNMIHNvdXJjZS4KLQkgKiBAcGFyYW0geG1sU291cmNlCi0JICogICAgICAgICAgICBUaGUgWE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTb3VyY2UgeHNsU291cmNlLCBTb3VyY2UgeG1sU291cmNlLAotCQkJV3JpdGVyIG91dHB1dCwgUHJvcGVydGllcyBwYXJhbXMsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh4c2xTb3VyY2UgIT0gbnVsbCAmJiB4bWxTb3VyY2UgIT0gbnVsbCkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBudWxsOwotCQkJU3RyaW5nIHhzbEZpbGUgPSB4c2xTb3VyY2UuZ2V0U3lzdGVtSWQoKTsKLQkJCWlmIChjYWNoZVhTTCAmJiB4c2xGaWxlICE9IG51bGwpIHsKLQkJCQlDYWNoZWRUcmFuc2Zvcm1lciBjYWNoZWRUcmFuc2Zvcm1lciA9IG51bGw7Ci0JCQkJc3luY2hyb25pemVkICh0cmFuc2Zvcm1lckNhY2hlKSB7Ci0JCQkJCWNhY2hlZFRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJDYWNoZS5nZXQoeHNsRmlsZSk7Ci0JCQkJCWlmIChjYWNoZWRUcmFuc2Zvcm1lciA9PSBudWxsKSB7Ci0JCQkJCQlUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeQotCQkJCQkJCQkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCXRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcih4c2xTb3VyY2UpOwotCQkJCQkJdHJhbnNmb3JtZXJDYWNoZS5wdXQoeHNsRmlsZSwgbmV3IENhY2hlZFRyYW5zZm9ybWVyKAotCQkJCQkJCQl0cmFuc2Zvcm1lciwgcGFyYW1zKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljYWNoZWRUcmFuc2Zvcm1lci5zZXRQYXJhbXMocGFyYW1zKTsKLQkJCQkJCXRyYW5zZm9ybWVyID0gY2FjaGVkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCQl0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLQotCQkJCWlmIChwYXJhbXMgIT0gbnVsbCAmJiBwYXJhbXMuc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gaSA9IHBhcmFtcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCQkJCVN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1zLmdldFByb3BlcnR5KHBhcmFtTmFtZSk7Ci0JCQkJCQl0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIocGFyYW1OYW1lLCBwYXJhbVZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGVuY29kaW5nICE9IG51bGwgJiYgZW5jb2RpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoImVuY29kaW5nIiwgZW5jb2RpbmcpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJlbmNvZGluZyIsICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3V0cHV0KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc291cmNlLCBYTUwgc291cmNlLCB0YXJnZXQKLQkgKiBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xTb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc291cmNlLgotCSAqIEBwYXJhbSB4bWxTb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFNvdXJjZSB4c2xTb3VyY2UsIFNvdXJjZSB4bWxTb3VyY2UsCi0JCQlXcml0ZXIgb3V0cHV0LCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsU291cmNlLCB4bWxTb3VyY2UsIG91dHB1dCwgbnVsbCwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHNvdXJjZSwKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFNvdXJjZSB4bWxTb3VyY2UsCi0JCQlXcml0ZXIgb3V0cHV0LCBQcm9wZXJ0aWVzIHBhcmFtcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0geHNsSW5wdXQgPSBnZXRYc2xJbnB1dFN0cmVhbSh4c2xVcmkpOwotCQlpZiAoeHNsSW5wdXQgIT0gbnVsbCkgewotCQkJU3RyZWFtU291cmNlIHhzbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeHNsSW5wdXQpOwotCQkJeHNsU291cmNlLnNldFN5c3RlbUlkKG5ldyBGaWxlKHhzbFVyaSkpOwotCQkJdHJhbnNmb3JtKHhzbFNvdXJjZSwgeG1sU291cmNlLCBvdXRwdXQsIHBhcmFtcywgZW5jb2RpbmcpOwotCQkJdHJ5IHsKLQkJCQl4c2xJbnB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHNvdXJjZSwKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFNvdXJjZSB4bWxTb3VyY2UsCi0JCQlXcml0ZXIgb3V0cHV0LCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTb3VyY2UsIG91dHB1dCwgbnVsbCwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZywKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIFdyaXRlciBvdXRwdXQsCi0JCQlQcm9wZXJ0aWVzIHBhcmFtcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0geHNsSW5wdXQgPSBnZXRYc2xJbnB1dFN0cmVhbSh4c2xVcmkpOwotCQlpZiAoeHNsSW5wdXQgIT0gbnVsbCkgewotCQkJU3RyZWFtU291cmNlIHhzbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeHNsSW5wdXQpOwotCQkJeHNsU291cmNlLnNldFN5c3RlbUlkKG5ldyBGaWxlKHhzbFVyaSkpOwotCi0JCQlieXRlW10geG1sID0geG1sU3RyLmdldEJ5dGVzKCJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSB4bWxJbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWwpOwotCQkJU3RyZWFtU291cmNlIHhtbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeG1sSW5wdXQpOwotCi0JCQl0cmFuc2Zvcm0oeHNsU291cmNlLCB4bWxTb3VyY2UsIG91dHB1dCwgcGFyYW1zLCBlbmNvZGluZyk7Ci0KLQkJCXRyeSB7Ci0JCQkJeHNsSW5wdXQuY2xvc2UoKTsKLQkJCQl4bWxJbnB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZywKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIFdyaXRlciBvdXRwdXQsCi0JCQlTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIG91dHB1dCwgbnVsbCwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZywKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgRmlsZSBmaWxlLAotCQkJUHJvcGVydGllcyBwYXJhbXMsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGVXcml0ZXIgb3V0cHV0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZSk7Ci0JCWlmIChvdXRwdXQgIT0gbnVsbCkgewotCQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBvdXRwdXQsIHBhcmFtcywgZW5jb2RpbmcpOwotCQkJdHJ5IHsKLQkJCQlvdXRwdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIEZpbGUgZmlsZSwKLQkJCVN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgZmlsZSwgbnVsbCwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHNvdXJjZQotCSAqIGFuZCB0YXJnZXQgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTb3VyY2UgeG1sU291cmNlLAotCQkJUHJvcGVydGllcyBwYXJhbXMsIFdyaXRlciBvdXRwdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTb3VyY2UsIG91dHB1dCwgcGFyYW1zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzb3VyY2UKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU291cmNlIHhtbFNvdXJjZSwgV3JpdGVyIG91dHB1dCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTb3VyY2UsIG91dHB1dCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nCi0JICogYW5kIHRhcmdldCBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsCi0JCQlQcm9wZXJ0aWVzIHBhcmFtcywgV3JpdGVyIG91dHB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgb3V0cHV0LCBwYXJhbXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZwotCSAqIGFuZCB0YXJnZXQgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBXcml0ZXIgb3V0cHV0KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgb3V0cHV0LCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLAotCQkJUHJvcGVydGllcyBwYXJhbXMsIEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgZmlsZSwgcGFyYW1zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBGaWxlIGZpbGUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBmaWxlLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBYU0wgaW5wdXQgc3RyZWFtIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRYc2xJbnB1dFN0cmVhbShTdHJpbmcgeHNsVXJpKSB7Ci0JCUlucHV0U3RyZWFtIHhzbElucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhzbElucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh4c2xVcmkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKHhzbElucHV0ID09IG51bGwpIHsKLQkJCQl4c2xJbnB1dCA9IFhTTFRQcm9jZXNzb3IuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKQotCQkJCQkJLmdldFJlc291cmNlQXNTdHJlYW0oeHNsVXJpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geHNsSW5wdXQ7Ci0JfQotCi19Ci0KLS8qKgotICogQSBjYWNoZWQgWFNMIFRyYW5zZm9ybWVyIG9iamVjdC4KLSAqLwotY2xhc3MgQ2FjaGVkVHJhbnNmb3JtZXIgewotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjsKLQlwcml2YXRlIFByb3BlcnRpZXMgcGFyYW1zOwotCi0JcHVibGljIENhY2hlZFRyYW5zZm9ybWVyKFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyLCBQcm9wZXJ0aWVzIHBhcmFtcykgewotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JCXNldFBhcmFtcyhwYXJhbXMpOwotCX0KLQotCXB1YmxpYyBUcmFuc2Zvcm1lciBnZXRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIHRyYW5zZm9ybWVyOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFBhcmFtcygpIHsKLQkJcmV0dXJuIHBhcmFtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbXMoUHJvcGVydGllcyBwYXJhbXMpIHsKLQkJaWYgKHBhcmFtcyAhPSB0aGlzLnBhcmFtcykgewotCQkJdHJhbnNmb3JtZXIuY2xlYXJQYXJhbWV0ZXJzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gaSA9IHBhcmFtcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHBhcmFtVmFsdWUgPSBwYXJhbXMuZ2V0UHJvcGVydHkocGFyYW1OYW1lKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIocGFyYW1OYW1lLCBwYXJhbVZhbHVlKTsKLQkJCX0KLQkJCXRoaXMucGFyYW1zID0gcGFyYW1zOwkJCQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyY2E3NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgWE1MIGFuZCBYU0xUIHByb2Nlc3Npbmcgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI5ZTg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI5YTE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZywKLSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmludGVybmFsLmltcG9ydGluZywKLSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2Q5ODQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5YjkxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotcGx1Z2luTmFtZT1FUEYgRGF0YSBFeGNoYW5nZSBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0M2FlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbnRlcm5hbC5pbXBvcnRpbmcuTGlicmFyeVNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIExpYnJhcnkgc2VydmljZSBmb3IgaW1wb3J0aW5nIGV4dGVybmFsIGxpYnJhcnkvcGx1Z2lucyBpbnRvIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlTZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVNlcnZpY2UgSU5TVEFOQ0UgPSBuZXcgTGlicmFyeVNlcnZpY2VJbXBsKCk7Ci0JLyoqCi0JICogY3JlYXRlIGEgbmV3IE1ldGhvZFBsdWdpbiBhbmQgYWRkIHRvIHRoZSBsaWJyYXJ5LCBwZXJmb3JtIGluaXRpYWxpemF0aW9uIGFzIG5lZWRlZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBNZXRob2RQbHVnaW4gCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVQbHVnaW4oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IE1ldGhvZFBsdWdpbiBhbmQgYWRkIHRvIHRoZSBsaWJyYXJ5LCBwZXJmb3JtIGluaXRpYWxpemF0aW9uIGFzIG5lZWRlZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVQbHVnaW4oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCQotCS8qKgotCSAqIGNyZWF0ZSBhIE1ldGhvZENvbmZpZ3VyYXRpb24gZm9yIHRoaXMgbGlicmFyeQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGd1aWQpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgcGx1Z2luIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgcGx1Z2luCi0JICogQHBhcmFtIHBsdWdpbiBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIFBsdWdpblNlcnZpY2UKLQkgKi8KLQlwdWJsaWMgUGx1Z2luU2VydmljZSBjcmVhdGVQbHVnaW5TZXJ2aWNlKE1ldGhvZFBsdWdpbiBwbHVnaW4pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1NTYzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogUGx1Z2luIHNlcnZpY2UgZm9yIGltcG9ydGluZyBleHRlcm5hbCBwbHVnaW4gZGF0YSBpbnRvIHRoZSBjdXJyZW50IGxpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGx1Z2luU2VydmljZSB7Ci0KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgZ2V0Q29udGVudFBhY2thZ2VSb290KCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBEaXNjaXBsaW5lIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBEaXNjaXBsaW5lcyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIERpc2NpcGxpbmUKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IERpc2NpcGxpbmVzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gRGlzY2lwbGluZUdyb3VwaW5nCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIFRvb2wgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IFRvb2xzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gVG9vbAotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIERvbWFpbiBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgRG9tYWlucyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIERvbWFpbgotCSAqLwotCXB1YmxpYyBEb21haW4gY3JlYXRlRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBXb3JrUHJvZHVjdFR5cGUgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IFdvcmtQcm9kdWN0VHlwZXMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBXb3JrUHJvZHVjdFR5cGUKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgUm9sZVNldCBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgUm9sZVNldHMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBSb2xlU2V0Ci0JICovCi0JcHVibGljIFJvbGVTZXQgY3JlYXRlUm9sZVNldCgpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgUm9sZVNldEdyb3VwaW5nIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBSb2xlU2V0cyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFJvbGVTZXRHcm91cGluZwotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBDdXN0b21DYXRlZ29yeSBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgQ3VzdG9tQ2F0ZWdvcmllcyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IHBhcmVudCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgQ2FwYWJpbGl0eVBhdHRlcm5zIHBhY2thZ2UKLQkgKiBwZXJmb3JtIG90aGVyIGluaXRpYWxpemF0aW9ucyBhcyBuZWVkZWQsIHN1Y2ggYXMgY3JlYXRlIHRoZSBjb250YWluaW5nIFByb2Nlc3NDb21wb25lbnQuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFByb2Nlc3NTZXJ2aWNlIGEgUHJvY2Vzc1NlcnZpY2UgdGhhdCBjb250YWlucyB0aGUgY3JlYXRlZCBDYXBhYmlsaXR5UGF0dGVybgotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybihNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgRGVsaXZlcnlQcm9jZXNzIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBEZWxpdmVyeVByb2Nlc3NlcyBwYWNrYWdlLgotCSAqIHBlcmZvcm0gb3RoZXIgaW5pdGlhbGl6YXRpb25zIGFzIG5lZWRlZCwgc3VjaCBhcyBjcmVhdGUgdGhlIGNvbnRhaW5pbmcgUHJvY2Vzc0NvbXBvbmVudC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUHJvY2Vzc1NlcnZpY2UgYSBQcm9jZXNzU2VydmljZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVhdGVkIERlbGl2ZXJ5UHJvY2VzcwotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBjb250ZW50IHBhY2thZ2UgYXMgdGhlIGNoaWxkIG9mIHRoZSBpbnRlcm5hbCByb290IGNvbnRlbnQgcGFja2FnZSwKLQkgKiBAcmV0dXJuIENvbnRlbnRQYWNrYWdlU2VydmljZSBhIENvbnRlbnRQYWNrYWdlU2VydmljZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVhdGVkIENvbnRlbnRQYWNrYWdlCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBjaGlsZCBwYWNrYWdlCi0JICogQHJldHVybiBDb250ZW50UGFja2FnZVNlcnZpY2UgYSBDb250ZW50UGFja2FnZVNlcnZpY2UgZm9yIHRoZSBjcmVhdGVkIHBhY2thZ2UKLQkgKi8KLQkvL3B1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDaGlsZFBhY2thZ2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQotCXB1YmxpYyBBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIENvbmNlcHQgY3JlYXRlQ29uY2VwdChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFByYWN0aWNlIGNyZWF0ZVByYWN0aWNlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFJlcG9ydCBjcmVhdGVSZXBvcnQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcihDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCi0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgQWN0aXZpdHkgYXMgYSBicmVha2Rvd24gZWxlbWVudCBvZiB0aGUgc2VydmljaW5nIGVsZW1lbnQuCi0JICogQHJldHVybiBBY3Rpdml0eQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBjcmVhdGVBY3Rpdml0eShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBQaGFzZSBhcyBhIGJyZWFrZG93biBlbGVtZW50IG9mIHRoZSBzZXJ2aWNpbmcgZWxlbWVudC4KLQkgKiBAcmV0dXJuIFBoYXNlCi0JICovCi0JcHVibGljIFBoYXNlIGNyZWF0ZVBoYXNlKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IEl0ZXJhdGlvbiBhcyBhIGJyZWFrZG93biBlbGVtZW50IG9mIHRoZSBzZXJ2aWNpbmcgZWxlbWVudC4KLQkgKiBAcmV0dXJuIEl0ZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IE1pbGVzdG9uZSBhcyBhIGJyZWFrZG93biBlbGVtZW50IG9mIHRoZSBzZXJ2aWNpbmcgZWxlbWVudC4KLQkgKiBAcmV0dXJuIE1pbGVzdG9uZQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpOwotCi0KLQkvKioKLQkgKiBhZGQgdGhlIHRhc2sgYW5kIGNyZWF0ZSB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzawotCSAqIGNhbGwgdGhpcyBtZXRob2Qgb25seSB3aGVuIHRoZSBjcm9zcyByZWZlcmVuY2VzIChSb2xlcywgd29ya3Byb2R1Y3RzKSBvZiB0aGUgVGFzayBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVGFza1RvQWN0aXZpdHkoQWN0aXZpdHkgYWN0LCBUYXNrIGVsZW1lbnQpOwotCi0JcHVibGljIHZvaWQgYWRkVGFza3NUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgTGlzdCB0YXNrcyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0YmI4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIGRhdGEgZXhjaGFuZ2Ugc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU1ODNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW50ZXJuYWwuaW1wb3J0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIExpYnJhcnkgc2VydmljZSBmb3IgaW1wb3J0aW5nIGV4dGVybmFsIGxpYnJhcnkvcGx1Z2lucyBpbnRvIHRoZSBjdXJyZW50Ci0gKiBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPOiBNZXJnZSB3aXRoIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZUltcGwgaW1wbGVtZW50cyBMaWJyYXJ5U2VydmljZSB7Ci0KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VJbXBsKCkgewotCX0KLQotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlUGx1Z2luKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVQbHVnaW4obmFtZSwgZ3VpZCwgbnVsbCk7Ci0JfQotCQkKLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGNyZWF0ZVBsdWdpbihTdHJpbmcgbmFtZSwgU3RyaW5nIGd1aWQsIE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJcGx1Z2luLnNldE5hbWUobmFtZSk7Ci0JCXBsdWdpbi5zZXRHdWlkKGd1aWQpOwotCi0JCS8vIGluaXRpYWxpemUgdGhlIHBsdWdpbgotCQlwbHVnaW4gPSBNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pOwotCi0JCS8vIE1VU1Qgc2F2ZSB0aGUgcGx1Z2luIGJlZm9yZSBwcm9jZXNzIGFueXRoaW5nIGVsc2UKLQkJLy8gdGhpcyBtZXRob2QgY2FsbCB3aWxsIGNhdXNlIHJlc291cmNlIHJlZnJlc2ggd2hpY2ggaXMgbm90IGRlc2lyZWQgaW4KLQkJLy8gdGhlIGltcG9ydGluZyBwcm9jZXNzCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkKLQkJbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbik7Ci0JCQotCQlpZiAob3B0aW9ucyAhPSBudWxsKSB7Ci0JCQlNYXAgcmVuYW1lRWxlbWVudE1hcCA9IChNYXApIG9wdGlvbnMuZ2V0KCJyZW5hbWVFbGVtZW50TWFwIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHJlbmFtZUVsZW1lbnRNYXAgIT0gbnVsbCkgewotCQkJCWVuc3VyZVVuaXF1ZU5hbWUobGlicmFyeSwgcGx1Z2luLCByZW5hbWVFbGVtZW50TWFwKTsJCi0JCQl9Ci0JCX0KLQkJCi0JCS8vIDE1MDA2MyAtIFhNTCBpbXBvcnQ6IENQL0RQcyBhcmUgdW5yZXNvdmxlZCBhZnRlciBYTUwgcGx1Z2luIGltcG9ydCAKLQkJLy8gbmVlZCB0byBzYXZlIHRodCBsaWJyYXJ5IGFuZCBwbHVnaW4gcmVzb3VyY2VzIHNwZWNpZmljYWxseSwgY2FuJ3QgdXNlIHNhdmVMaWJyYXJ5Ci0vLwkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkobGlicmFyeSwgZmFsc2UsIGZhbHNlKTsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5zYXZlKGxpYnJhcnkuZVJlc291cmNlKCkpOwotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLnNhdmUocGx1Z2luLmVSZXNvdXJjZSgpKTsKLQotCQkvLyBzdGlsbCBtYXJrIHRoZSByZXNvdXJjZSBhcyBkaXJ0eQotCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQlwbHVnaW4uZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZSNjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQljb25maWcuc2V0TmFtZShuYW1lKTsKLQkJY29uZmlnLnNldEd1aWQoZ3VpZCk7Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlib29sZWFuIG9sZE5vdGlmeSA9IGxpYnJhcnkuZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCWxpYnJhcnkuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGQoY29uZmlnKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWxpYnJhcnkuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJfQotCi0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGEgcGx1Z2luIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBQbHVnaW5TZXJ2aWNlCi0JICovCi0JcHVibGljIFBsdWdpblNlcnZpY2UgY3JlYXRlUGx1Z2luU2VydmljZShNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2luU2VydmljZUltcGwocGx1Z2luKTsKLQl9Ci0JCi0JLy9UaGlzIGlzIGlkZW50aWNhbCB0byBMaWJyYXJ5SW1wb3J0TWFuYWdlci5lbnN1cmVVbmlxdWVOYW1lCi0JLy9TaG91bGQgbW92ZSB0byB0aGlzIGNvZGUgdG8gYSBjb21tb20gcGxhY2Ugc28gdGhhdCBib3RoIHBhY2thZ2VzIGNhbiBhY2Nlc3MgaXQuCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbnN1cmVVbmlxdWVOYW1lKEVPYmplY3Qgb3duZXIsIE1ldGhvZEVsZW1lbnQgbmV3T2JqLCBNYXAgcmVuYW1lRWxlbWVudE1hcCkgewotCQlpZiAob3duZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNsYXNzIGNscyA9IG5ld09iai5nZXRDbGFzcygpOwotCQlNYXAgbmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IG93bmVyLmVDb250ZW50cygpLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2xkT2JqID0gb3duZXIuZUNvbnRlbnRzKCkuZ2V0KGkpOwotCQkJaWYgKG9sZE9iai5nZXRDbGFzcygpID09IGNscyAmJiBvbGRPYmogIT0gbmV3T2JqKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvbGRFbGVtID0gKE1ldGhvZEVsZW1lbnQpIG9sZE9iajsKLQkJCQluYW1lTWFwLnB1dChvbGRFbGVtLmdldE5hbWUoKSwgb2xkRWxlbSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBuZXdPYmouZ2V0TmFtZSgpOwotCQlTdHJpbmcgcmVuYW1lZCA9IG5hbWU7Ci0JCXdoaWxlIChuYW1lTWFwLmNvbnRhaW5zS2V5KHJlbmFtZWQpKSB7Ci0JCQlyZW5hbWVkICs9ICJfcmVuYW1lZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocmVuYW1lZCAhPSBuYW1lKSB7Ci0JCQluZXdPYmouc2V0TmFtZShyZW5hbWVkKTsKLQkJCQotCQkJT2JqZWN0W10gZW50cnlWYWwgPSBuZXcgT2JqZWN0WzRdOwotCQkJZW50cnlWYWxbMF0gPSBuZXdPYmo7Ci0JCQllbnRyeVZhbFsxXSA9IG5hbWU7Ci0JCQllbnRyeVZhbFsyXSA9IG5hbWVNYXAuZ2V0KG5hbWUpOwotCQkJZW50cnlWYWxbM10gPSByZW5hbWVkOwotCQkJcmVuYW1lRWxlbWVudE1hcC5wdXQobmV3T2JqLmdldEd1aWQoKSwgZW50cnlWYWwpOwkJCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU5NGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbnRlcm5hbC5pbXBvcnRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBQbHVnaW4gc2VydmljZSBmb3IgaW1wb3J0aW5nIGV4dGVybmFsIHBsdWdpbiBkYXRhIGludG8gdGhlIGN1cnJlbnQgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblNlcnZpY2VJbXBsIGltcGxlbWVudHMgUGx1Z2luU2VydmljZSB7Ci0KLQlNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHVibGljIFBsdWdpblNlcnZpY2VJbXBsKE1ldGhvZFBsdWdpbiBlbGVtZW50KQotCXsKLQkJcGx1Z2luID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG1ldGhvZCBwbHVnaGluCi0JICogQHJldHVybiB7QGxpbmsgTWV0aG9kUGx1Z2lufQotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gZ2V0UGx1Z2luKCkKLQl7Ci0JCXJldHVybiAoTWV0aG9kUGx1Z2luKXBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjZ2V0Q29udGVudFBhY2thZ2VSb290KCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgZ2V0Q29udGVudFBhY2thZ2VSb290KCkKLQl7Ci0JCXJldHVybiBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRGlzY2lwbGluZSgpCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgY3JlYXRlRGlzY2lwbGluZSgpIHsKLQkJRGlzY2lwbGluZSBkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGQpOwotCi0JCXJldHVybiBkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlEaXNjaXBsaW5lR3JvdXBpbmcgZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGQpOwotCi0JCXJldHVybiBkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVUb29sKCkKLQkgKi8KLQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQlUb29sIHRvb2wgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZCh0b29sKTsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURvbWFpbigpCi0JICovCi0JcHVibGljIERvbWFpbiBjcmVhdGVEb21haW4oKSB7Ci0JCURvbWFpbiBkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGQpOwotCQlyZXR1cm4gZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJV29ya1Byb2R1Y3RUeXBlIHcgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCSgoQ29udGVudFBhY2thZ2UpcGtnKS5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQodyk7Ci0JCXJldHVybiB3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSb2xlU2V0KCkKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCkgewotCQlSb2xlU2V0IHIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0KCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJvbGVTZXRHcm91cGluZygpCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCVJvbGVTZXRHcm91cGluZyByID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5KQotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBwYXJlbnQpIHsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJQ3VzdG9tQ2F0ZWdvcnkgYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLy8gYWxzbyBuZWVkIHRvIGFkZCB0aGUgY2F0ZWdvcnkgb2JqZWN0IGludG8gdGhlIHBhcmVudCBwYWNrYWdlCi0JCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoYyk7Ci0JCWlmICggcGFyZW50ICE9IG51bGwgKQotCQl7Ci0JCQkoKEN1c3RvbUNhdGVnb3J5KXBhcmVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZChjKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGFkZCB0byB0aGUgcm9vdCBjYXRlZ29yeQotCQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoZ2V0UGx1Z2luKCkpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGQoYyk7Ci0JCX0KLQotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnKSB7Ci0KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCQljcC5zZXREZWZhdWx0Q29udGV4dChkZWZhdWx0Q29uZmlnKTsKLQotCQlQcm9jZXNzUGFja2FnZSBjYXBhYmlsaXR5UGF0dGVyblBrZ3MgPSAoUHJvY2Vzc1BhY2thZ2UpVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQlMaXN0IGl0ZW1zID0gY2FwYWJpbGl0eVBhdHRlcm5Qa2dzLmdldENoaWxkUGFja2FnZXMoKTsKLQotCQkvLyBuZWVkIHRvIGNyZWF0ZSBhIHBhY2thZ2UgZm9yIHRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGUgcGtnLCBUT0RJTyIpOwotCQkvLyB0byBhZGQgYSBjYXBhYmlsaXR5IHByb2Nlc3MsIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIFByb2Nlc3NDb21wb25lbnQgcGFja2FnZSB0byBob2xkIHRoZSBwcm9jZXNzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCBwYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKTsKLQkJcGMuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQlpdGVtcy5hZGQocGMpOwotCQlwYy5zZXRQcm9jZXNzKGNwKTsKLQotCQlyZXR1cm4gY3A7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURlbGl2ZXJ5UHJvY2VzcyhNZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZykgewotCQlEZWxpdmVyeVByb2Nlc3MgZHAgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJZHAuc2V0RGVmYXVsdENvbnRleHQoZGVmYXVsdENvbmZpZyk7Ci0KLQkJLy8gdGhpcyBpcyB0aGUgcGFja2FnZSB0aGF0IHN0b3JlcyBhbGwgY2FwYWJpbGl0eSBwYXR0ZXJucwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gZ2V0UGx1Z2luKCk7Ci0JCVByb2Nlc3NQYWNrYWdlIGRlbGl2ZXJ5UHJvY2Vzc1BrZ3MgPSAoUHJvY2Vzc1BhY2thZ2UpVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCUxpc3QgaXRlbXMgPSBkZWxpdmVyeVByb2Nlc3NQa2dzLmdldENoaWxkUGFja2FnZXMoKTsKLQotCQkvLyB5b3UgbmVlZCB0byBjcmVhdGUgYSBQcm9jZXNzQ29tcG9uZW50IHBhY2thZ2UgdG8gaG9sZCB0aGUgcHJvY2VzcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQgcGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCXBjLnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQkJaXRlbXMuYWRkKHBjKTsKLQkJcGMuc2V0UHJvY2VzcyhkcCk7Ci0KLQkJcmV0dXJuIGRwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0KLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJaWYgKCBjb250YWluZXIgPT0gbnVsbCkKLQkJewotCQkJY29udGFpbmVyID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJfQotCQljb250YWluZXIuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQlyZXR1cm4gcGtnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVBcnRpZmFjdChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUFydGlmYWN0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ2hlY2tsaXN0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlDaGVja2xpc3QgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ29uY2VwdChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlDb25jZXB0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVEZWxpdmVyYWJsZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCURlbGl2ZXJhYmxlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRXhhbXBsZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlFeGFtcGxlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUd1aWRhbmNlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZU91dGNvbWUoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIE91dGNvbWUgY3JlYXRlT3V0Y29tZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJT3V0Y29tZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUHJhY3RpY2UoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFByYWN0aWNlIGNyZWF0ZVByYWN0aWNlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlQcmFjdGljZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJlcG9ydChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJUmVwb3J0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXBvcnQoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJldXNhYmxlQXNzZXQoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJUmV1c2FibGVBc3NldCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUm9hZG1hcChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUm9hZG1hcCBjcmVhdGVSb2FkbWFwKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlSb2FkbWFwIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2FkbWFwKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSb2xlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVJvbGUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRhc2soQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFRhc2sgY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJVGFzayBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlVGVtcGxhdGUoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlUZW1wbGF0ZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRlcm1EZWZpbml0aW9uKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbihDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJVGVybURlZmluaXRpb24gZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVUb29sTWVudG9yKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBUb29sTWVudG9yIGNyZWF0ZVRvb2xNZW50b3IoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVRvb2xNZW50b3IgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2xNZW50b3IoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVdoaXRlcGFwZXIoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcihDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJV2hpdGVwYXBlciBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQWN0aXZpdHkoQWN0aXZpdHkpCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpIHsKLQkJQWN0aXZpdHkgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCXN1cGVyQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoZSk7Ci0KLQkJYWRkQWN0aXZpdHlUb0NvbnRhaW5lcihlKTsKLQkJCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVQaGFzZShBY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgUGhhc2UgY3JlYXRlUGhhc2UoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSkgewotCQlQaGFzZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKTsKLQkJc3VwZXJBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChlKTsKLQotCQlhZGRBY3Rpdml0eVRvQ29udGFpbmVyKGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVJdGVyYXRpb24oQWN0aXZpdHkpCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSkgewotCQlJdGVyYXRpb24gZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpOwotCQlzdXBlckFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGUpOwotCi0JCWFkZEFjdGl2aXR5VG9Db250YWluZXIoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZU1pbGVzdG9uZShBY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KSB7Ci0JCU1pbGVzdG9uZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlsZXN0b25lKCk7Ci0JCXN1cGVyQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2FkZFRhc2tUb0FjdGl2aXR5KEFjdGl2aXR5LCBUYXNrKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2tUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgVGFzayB0YXNrKSB7Ci0JCWFkZFRhc2tzVG9BY3Rpdml0eShhY3QsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGFzaykpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjYWRkVGFza3NUb0FjdGl2aXR5KEFjdGl2aXR5LCBMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2tzVG9BY3Rpdml0eShmaW5hbCBBY3Rpdml0eSBhY3QsIGZpbmFsIExpc3QgdGFza3MpIHsKLQkJLy8gdGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBhbnkgbW9yZWR1ZSB0byBsYXRlciBjaGFuZ2VzCi0JCS8vIHVzZSBvdXIgb3duIGNvZGUgaW5zdGVhZAotCQkvL1Byb2Nlc3NVdGlsLmFkZFRhc2tUb0FjdGl2aXR5KHRhc2ssIGFjdCk7Ci0JCQotCQkvLyBiZWZvcmUgZG9pbmcgdGhlIGNvbW1hbmQsIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGlzIAotCQkvLyBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBvd2luZyBwcm9jZXNzCi0JCS8vIG90aGVyd2lzZSB5b3Ugd2lsbCBnZXQgbXNnIGJveCBhc2tpbmcgZm9yIHRoYXQsIHdoaWNoIG1heSBjYXVzZSBlcnJvciBmb3IgYmFja2dyb3VuZCBwcm9jZXNzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoIGNvbmZpZyAhPSBudWxsICkgewotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaylpdC5uZXh0KCk7CQkJCi0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSl0YXNrLmVDb250YWluZXIoKTsKLQkJCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCWlmICggIXBrZ3MuY29udGFpbnMocGtnKSApIHsKLQkJCQkJcGtncy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7cHVibGljIHZvaWQgcnVuKCkgewotCQkJV0JTRHJvcENvbW1hbmQgY21kID0gbmV3IFdCU0Ryb3BDb21tYW5kKGFjdCwgdGFza3MpOwotCQkJdHJ5IHsKLQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQkKLQkJCWZpbmFsbHkgewotCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQl9CQotCSAgICB9fSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHByb2Nlc3MgY29tcG9uZW50IGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlIEJyZWFrZG93bkVsZW1lbnQKLQkgKiBAcmV0dXJuIFByb2Nlc3NDb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NDb21wb25lbnQgZ2V0UHJvY2Vzc0NvbXBvbmVudChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJCi0JCWlmICggZS5lQ29udGFpbmVyKCkgPT0gbnVsbCApIHsKLQkJCUFjdGl2aXR5IHBhcmVudCA9IGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZiAoIHBhcmVudCA9PSBudWxsICkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZ2V0UHJvY2Vzc0NvbXBvbmVudChwYXJlbnQpOwotCQl9Ci0JCi0JCUVPYmplY3QgY29udGFpbmVyOwotCQlmb3IgKGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0KLQkJaWYgKCBjb250YWluZXIgIT0gbnVsbCApIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIGNvbnRhaW5lcik7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQWN0aXZpdHlUb0NvbnRhaW5lcihBY3Rpdml0eSBhY3QpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IGdldFByb2Nlc3NDb21wb25lbnQoYWN0KTsKLQkJaWYgKCBwYyAhPSBudWxsICkgewotCQkJLy8gY3JlYXRlIGEgcHJvY2VzcyBwYWNrYWdlIGZvciB0aGUgYWN0aXZpdHkKLQkJCSBQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJIHBrZy5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJIHBrZy5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCQkgcGMuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQkJIAotCQkJIHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYWN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMWRhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBkYXRhIGV4Y2hhbmdlIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0Jhc2VSZXNvdXJjZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9CYXNlUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzRiNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0Jhc2VSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci0KLS8qKgotICogY29udGVudCByZXNvdXJjZSBoYW5kbGVyIHRvIHByb2Nlc3MgdGhlIHJlc3BvdXJjZXMgaW4gdGhlIGNvbnRlbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUmVzb3VyY2VIYW5kbGVyIGltcGxlbWVudHMgSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBzb3VyY2VMaWJSb290OwotCXByb3RlY3RlZCBGaWxlIHRhcmdldExpYlJvb3Q7Ci0KLQlwdWJsaWMgQmFzZVJlc291cmNlSGFuZGxlcihGaWxlIHNvdXJjZUxpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCkgewotCQl0aGlzLnNvdXJjZUxpYlJvb3QgPSBzb3VyY2VMaWJSb290OwotCQl0aGlzLnRhcmdldExpYlJvb3QgPSB0YXJnZXRMaWJSb290OwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JCi0JLyoqCi0JICogY29weWluZyB0aGUgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIHJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUpIHsKLQkJRmlsZSBzcmMgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzb3VyY2VGaWxlKTsKLQkJaWYgKCBzcmMuZXhpc3RzKCkgKSB7Ci0JCQlGaWxlIHRndCA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNvdXJjZUZpbGUpOwotCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjLCB0Z3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0NvbnRlbnRQcm9jZXNzb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9Db250ZW50UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzkwMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0NvbnRlbnRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci0KLQotCi0vKioKLSAqIGNvbnRlbnQgcHJvY2Vzc2VyIHRvIGZpeCByZWZlcmVuY2VzIGFuZCBjb3B5IHJlc291cmNlcyB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgbG9jYXRpb24KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3NyY19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoInNyY1xccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIjxhXFxzKz8oW14+XSopPiguKj8pPC9hPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2hyZWZfcmVmID0gUGF0dGVybi5jb21waWxlKCJocmVmXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXI7Ci0JSUxvZ2dlciBsb2dnZXI7Ci0JCi0JcHVibGljIENvbnRlbnRQcm9jZXNzb3IoSVJlc291cmNlSGFuZGxlciBoYW5kbGVyLCBJTG9nZ2VyIGxvZ2dlcikgewotCQl0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOwotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQl9Ci0JCi0JLyoqCi0JICogcmVzb3ZsZSB0aGUgcmVzb3VyY2Ugc3RyaW5nIGZvciB0aGUgZ2l2ZW4gb3duZXIuIAotCSAqIFRoZSBvd25lciBpcyBhIG1ldGhvZCBlbGVtZW50LCBidXQgY2FuIGJlIGVpdGhlciBmcm9tIHVtYSBtb2RlbCBvciB4bWwgbW9kZWwuIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlUmVzb3VyY2VGaWxlcyhPYmplY3Qgb3duZXIsIFN0cmluZyBzb3VyY2UpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCXRyeQotCQl7Ci0JCQkvLyBwcm9jZXNzIGltYWdlcyBhbmQgb3RoZXIgc3JjIHJlc291cmNlcwotCQkJTWF0Y2hlciBtID0gcF9zcmNfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXdoaWxlICggbS5maW5kKCkgKQotCQkJewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBuZXdfdXJsICA9IHByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgdXJsKTsKLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAic3JjPVwiIiArIG5ld191cmwgKyAiXCIiOyAJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBmaXhSZXBsYWNlbWVudFN0cihyZXBsYWNlbWVudCkpOwotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJCQotCQkJLy8gcHJvY2VzcyBocmVmcwotCQkJbSA9IHBfaHJlZl9yZWYubWF0Y2hlcihzYi50b1N0cmluZygpKTsKLQkJCXNiLnNldExlbmd0aCgwKTsKLQkJCQotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIG1hcmsgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJaW50IGluZGV4ID0gdXJsLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICggaW5kZXggPj0gMCApCi0JCQkJewotCQkJCQltYXJrID0gdXJsLnN1YnN0cmluZyhpbmRleCk7Ci0JCQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCX0KLQotCQkJCWlmICggdXJsLmxlbmd0aCgpID4gMCApCi0JCQkJewotCQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsIHVybCk7Ci0JCQkJfQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIGZpeFJlcGxhY2VtZW50U3RyKCJocmVmPVwiIiArIHVybCArIG1hcmsgKyAiXCIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJCQotCQkJLy8gYW55dGhpbmcgZWxzZSA/Pz8KLQkJCQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCXsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihzYik7Ci0JCQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZml4UmVwbGFjZW1lbnRTdHIoU3RyaW5nIHN0cikgewotCQkvLyBlc2NhcGUgdGhlICQgc2luY2UgaXQncyB0cmVhdGVkIGFzIGEgZ3JvdXAgc2VxdWVuY2UKLQkJdHJ5IHsKLQkJCWludCBpbmRleCA9IHN0ci5pbmRleE9mKCIkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICggaW5kZXggPCAwICkgewotCQkJCXJldHVybiBzdHI7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaW50IHN0YXJ0ID0gMDsKLQkJCXdoaWxlICggaW5kZXggPj0gMCApIHsKLQkJCQliLmFwcGVuZChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpLmFwcGVuZCgiXFwkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdGFydCA9IGluZGV4KzE7Ci0JCQkJaW5kZXggPSBzdHIuaW5kZXhPZigiJCIsIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQliLmFwcGVuZChzdHIuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0JCQkKLQkJCXJldHVybiBiLnRvU3RyaW5nKCk7Ci0JCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdHI7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRmlsZVVybChTdHJpbmcgdXJsKQotCXsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgaW1hZ2UgdXJsIFsiICsgdXJsICsgIl0iKTsKLQkJaWYgKCAJdXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDAKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgid3d3LiIpIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgibWFpbHRvOiIpIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJqYXZhc2NyaXB0OiIpID49MCApIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRGaWxlUGF0aChGaWxlIGYpIHsKLQkJcmV0dXJuIChmICE9IG51bGwpICYmIGYuZXhpc3RzKCk7Ci0JfQotCQotCi0JcHVibGljIFN0cmluZyBwcm9jZXNzUmVzb3VyY2VVcmwoT2JqZWN0IG93bmVyLCBTdHJpbmcgdXJsKQotCXsKLQkJaWYgKCAhaXNGaWxlVXJsKHVybCkgKQotCQl7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJVXJsSW5mbyBpbmZvID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluZm8gPSBoYW5kbGVyLnJlc29sdmVGaWxlVXJsKG93bmVyLCB1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKCJlcnJvciBwcm9jZXNzaW5nIHVybCAnIiArIHVybCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIHVybDsKLQkJfQotCQkKLQkJaWYgKCBpbmZvLnNvdXJjZUZpbGUgPT0gbnVsbCB8fCBpbmZvLnRhcmdldEZpbGUgPT0gbnVsbCApIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQkJCi0JCWlmICggaW5mby5zb3VyY2VGaWxlLmlzRmlsZSgpICYmIGluZm8uc291cmNlRmlsZS5leGlzdHMoKSApCi0JCXsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKGluZm8uc291cmNlRmlsZSwgaW5mby50YXJnZXRGaWxlKTsKLQkJCQotCQkJLy8gcmV0dXJuIHRoZSBmaXhlZCB0YXJnZXQgdXJsIGlmIHRoZSBmaWxlIGV4aXN0cyAKLQkJCS8vIGFuZCBpcyBjb3BpZWQgb3ZlciB0byB0aGUgdGFyZ2V0IGxvY2F0aW9uCi0JCQlyZXR1cm4gaW5mby50YXJnZXRVcmw7Ci0JCX0KLQotCQlyZXR1cm4gdXJsOwotCX0KLQotCi0JLyoqCi0JICogcHJvY2VzcyB0aGUgdXJsLCB1cGRhdGUgdGhlIHJlc3VsdCBidWZmZXIsIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZWxlbWVudCBpZiBhbnkKLQkgKiBAcGFyYW0gc291cmNlIHRlaCB1cmwgdGV4dCBzdHJpbmcKLQkgKiBAcGFyYW0gcmVzdWx0IFN0cmluZ0J1ZmZlcgotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudCB0aGUgbGlua2VkIGVsZW1lbnQgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NVcmxUZXh0KE9iamVjdCBvd25lciwgU3RyaW5nIHNvdXJjZSkKLQl7Ci0JCU1hdGNoZXIgbSA9IHBfaHJlZl9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQlpZiAoIG0uZmluZCgpICkKLQkJewotCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQlpZiAoIHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImphdmFTY3JpcHQ6IikgPCAwICkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWludCBpbmRleCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIGluZGV4ID49IDAgKQotCQkJCXsKLQkJCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJfQotCi0JCQkJaWYgKCB1cmwubGVuZ3RoKCkgPiAwICkKLQkJCQl7Ci0JCQkJCXByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgdXJsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlKSB7Ci0JCWhhbmRsZXIuY29weVJlc291cmNlKHNvdXJjZUZpbGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUsIEVPYmplY3Qgb2JqLCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiB1bWFQbHVnaW4pIHsKLQkJaGFuZGxlci5jb3B5UmVzb3VyY2Uoc291cmNlRmlsZSwgb2JqLCB1bWFQbHVnaW4pOwotCX0KLQkKLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBpcyBmb3IgcmVzb2x2ZWluZyB0aGUgdGVtcGxhdGUgYXR0YWNobWVudCByZXNvdXJjZXMKLQkgKiBUaGUgcmVzb3VyY2UgaXMgYSBzZXQgb2YgdXJscyBzZXBlcmF0ZWQgYnkgfAotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB1cmxzCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVBdHRhY2htZW50UmVzb3VyY2VzKE9iamVjdCBvd25lciwgU3RyaW5nIHVybHMpIHsKLQkJaWYgKCAodXJscyAhPSBudWxsKSAmJiB1cmxzLmxlbmd0aCgpICE9IDAgKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih1cmxzLCAifCIpOyAvLyB0aGlzIGlzIGhhcmRjb2RlZCBzb21laG93IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkgKSB7Ci0JCQkJU3RyaW5nIHVybCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCXVybCA9IHByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgdXJsKTsKLQkJCQlpZiAoIGJ1ZmZlci5sZW5ndGgoKSA+IDAgKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoInwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKHVybCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0RlZmF1bHRMb2dnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9EZWZhdWx0TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMTQ3NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0RlZmF1bHRMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TG9nZ2VyIGltcGxlbWVudHMgSUxvZ2dlciB7Ci0KLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gaW5mbyA9IFN5c3RlbS5vdXQ7Ci0JcHJvdGVjdGVkIFByaW50U3RyZWFtIHdhcm5pbmcgPSBTeXN0ZW0ub3V0OwotCXByb3RlY3RlZCBQcmludFN0cmVhbSBlcnJvciA9IFN5c3RlbS5lcnI7Ci0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCkgewotCQllcnJvci5wcmludGxuKG1lc3NhZ2UpOwotCQlpZiAoIHRoICE9IG51bGwgKSB7Ci0JCQl0aC5wcmludFN0YWNrVHJhY2UoZXJyb3IpOwotCQl9CQotCX0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXdhcm5pbmcucHJpbnRsbihtZXNzYWdlKTsKLQl9Ci0JcHVibGljIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlpbmZvLnByaW50bG4obWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0ZpbGVMb2dnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9GaWxlTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTAwYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0ZpbGVMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotLyoqCi0gKiBmaWxlIExvZ2dlciBjbGFzcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVMb2dnZXIgZXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0xPR19GSUxFTkFNRSA9ICJlcnJvci5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX0xPR19GSUxFTkFNRSA9ICJ3YXJuaW5nLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9fTE9HX0ZJTEVOQU1FID0gImluZm8ubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEZpbGUgbG9nUGF0aDsKLQotCXB1YmxpYyBGaWxlTG9nZ2VyKEZpbGUgbG9nUGF0aCkgewotCQl0aGlzLmxvZ1BhdGggPSBsb2dQYXRoOwotCi0JCWlmICghdGhpcy5sb2dQYXRoLmV4aXN0cygpKSB7Ci0JCQl0aGlzLmxvZ1BhdGgubWtkaXJzKCk7Ci0JCX0KLQotCQlzdXBlci5pbmZvID0gZ2V0U3RyZWFtKG5ldyBGaWxlKGxvZ1BhdGgsIElORk9fTE9HX0ZJTEVOQU1FKSk7Ci0JCXN1cGVyLndhcm5pbmcgPSBnZXRTdHJlYW0obmV3IEZpbGUobG9nUGF0aCwgV0FSTklOR19MT0dfRklMRU5BTUUpKTsKLQkJc3VwZXIuZXJyb3IgPSBnZXRTdHJlYW0obmV3IEZpbGUobG9nUGF0aCwgRVJST1JfTE9HX0ZJTEVOQU1FKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIFByaW50U3RyZWFtIGdldFN0cmVhbShGaWxlIGYpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZGlyID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlkaXIubWtkaXJzKCk7Ci0KLQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW5mby5jbG9zZSgpOwotCQl3YXJuaW5nLmNsb3NlKCk7Ci0JCWVycm9yLmNsb3NlKCk7Ci0KLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0TG9nUGF0aCgpIHsKLQkJcmV0dXJuIGxvZ1BhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lMb2dnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjE1YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotLyoqCi0gKiBMb2dnZXIgaW50ZXJmYWNlIGZvciBleHBvcnQgYW5kIGltcG9ydAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nZ2VyIHsKLQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpOwotCQotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpOwotCQotCXB1YmxpYyB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpOwotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JUmVzb3VyY2VIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUxZWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBSZXNvdXJjZSBoYW5kbGVyIGludGVyZmFjZSBmb3IgeG1sIGV4cG9ydCBhbmQgaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZUhhbmRsZXIgewotCi0JcHVibGljIFVybEluZm8gcmVzb2x2ZUZpbGVVcmwoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogY29weWluZyB0aGUgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIHJvb3QKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSk7Ci0JCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlLCBFT2JqZWN0IG9iaiwgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gdW1hUGx1Z2luKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9VcmxJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvVXJsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJlOGM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9VcmxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogRGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdXJsIGluZm8gaW4gY29udGVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFVybEluZm8gewotCi0JcHVibGljIEZpbGUgc291cmNlRmlsZTsKLQlwdWJsaWMgRmlsZSB0YXJnZXRGaWxlOwotCXB1YmxpYyBTdHJpbmcgc291cmNlVXJsOwotCXB1YmxpYyBTdHJpbmcgdGFyZ2V0VXJsOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWM2MGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBkYXRhIGV4Y2hhbmdlIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MzMwOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCBwbHVnLWluCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2RlYnVnPWZhbHNlCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgb2YgdmlzdWFsSUQgcHJvY2Vzc2luZwotb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvZGVidWcvdmlzdWFsSUQ9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzY1OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQ0ZGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZ2VmO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvcjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS51bWwyLnVtbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlciwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYTUzZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5M2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9pdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9pdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM4YTE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vaXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNiM2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vdGFza2Rlc2NyaXB0b3IxLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vdGFza2Rlc2NyaXB0b3IxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL2R0b29sMTYvQURFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9kdG9vbDE2L0FERWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwZmFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL2R0b29sMTYvQURFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9ldG9vbDE2L0FERWRpdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvZXRvb2wxNi9BREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTZmMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9ldG9vbDE2L0FERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQ5NzI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2OGRjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMGMyMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTYwMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjMjBiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NWNmNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjM2EzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0Y2I5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlYjlkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjBmYjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9kZWxldGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9kZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvZGVsZXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhYTJkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9vYmoxNi9VTUxEaWFncmFtRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL3dpemJhbi9OZXdVTUxXaXphcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UwM2JmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL3dpemJhbi9OZXdVTUxXaXphcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbWVzc2FnZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNmQ2OTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNUQVJUIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUT0RPOiBtYW51YWxseSBwdXQga2V5cyBhbmQgdmFsdWVzCi1VTUxEaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLVVNTERpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlPUZhaWxlZCB0byBsb2FkIG1vZGVsIGZpbGUgezB9Ci1VTUxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrPUNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGVzCi1VTUxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsPUNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsCi1VTUxEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZT1VcGRhdGluZyBjYWNoZSBmYWlsZWQKLVVNTERvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkPUZhaWxlZCB0byByZWZyZXNoIGhpZXJhcmNoeSBmb3IgY2hhbmdlZCByZXNvdXJjZQotVU1MRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yPXsxfQotVU1MRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yPVVuYWJsZSB0byBsb2FkIGRpYWdyYW0gcmVzb3VyY2UKLVVNTERvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yPURpYWdyYW0gaXMgbm90IHByZXNlbnQgaW4gcmVzb3VyY2UKLVVNTERvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcj1FcnJvciBsb2FkaW5nIGRpYWdyYW0KLVVNTERvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yPVRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtCi1VTUxEb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzaz1TYXZpbmcgZGlhZ3JhbQotVU1MRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaz1TYXZpbmcgezB9Ci1VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCi1VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9TW9kZWwgZmlsZSBsb2FkaW5nIGZhaWxlZAotVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlPUluaXRpYWxpemUgbmV3IHswfSBkaWFncmFtIGZpbGUKLVVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9PcGVuTW9kZWxGaWxlRGlhbG9nVGl0bGU9U2VsZWN0IGRvbWFpbiBtb2RlbAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZT1Jbml0aWFsaXplIG5ldyBkaWFncmFtIGZpbGUKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlPURpYWdyYW0gZmlsZQotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBkaWFncmFtIGJhc2VkIG9uIHswfSBtb2RlbCBjb250ZW50Ci1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50Ci1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlPURpYWdyYW0gcm9vdCBlbGVtZW50Ci1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uPVNlbGVjdCBzZW1hbnRpYyBtb2RlbCBlbGVtZW50IHRvIGJlIGRlcGljdGVkIG9uIGRpYWdyYW0KLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50OgotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U9RGlhZ3JhbSByb290IGVsZW1lbnQgaXMgbm90IHNlbGVjdGVkCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlPUludmFsaWQgZGlhZ3JhbSByb290IGVsZW1lbnQgaXMgc2VsZWN0ZWQKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZD1Jbml0aWFsaXppbmcgZGlhZ3JhbSBjb250ZW50cwotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yPUluY29ycmVjdCBtb2RlbCBvYmplY3Qgc3RvcmVkIGFzIGEgcm9vdCByZXNvdXJjZSBvYmplY3QKLUZsb3dzMUdyb3VwX3RpdGxlPUZsb3dzCi1GbG93czFHcm91cF9kZXNjPUNyZWF0aW9uIHRvb2wgZm9yIGZsb3dzCi1Ob2RlczJHcm91cF90aXRsZT1Ob2RlcwotTm9kZXMyR3JvdXBfZGVzYz1DcmVhdGlvbiB0b29sIGdyb3VwIGZvciBub2RlcwotQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX3RpdGxlPUNvbnRyb2wgRmxvdwotQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBDb250cm9sIEZsb3cKLUFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbF90aXRsZT1BY3Rpdml0eSBQYXJ0aXRpb24KLUFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQWN0aXZpdHkgUGFydGl0aW9uCi1TdGFydE5vZGUyQ3JlYXRpb25Ub29sX3RpdGxlPVN0YXJ0IE5vZGUKLVN0YXJ0Tm9kZTJDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFN0YXJ0IE5vZGUKLUZvcmtOb2RlM0NyZWF0aW9uVG9vbF90aXRsZT1Gb3JrIE5vZGUKLUZvcmtOb2RlM0NyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgRm9yayBOb2RlCi1NZXJnZU5vZGU0Q3JlYXRpb25Ub29sX3RpdGxlPU1lcmdlIE5vZGUKLU1lcmdlTm9kZTRDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IE1lcmdlIE5vZGUKLURlY2lzaW9uTm9kZTVDcmVhdGlvblRvb2xfdGl0bGU9RGVjaXNpb24gTm9kZQotRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgRGVjaXNpb24gTm9kZQotRW5kTm9kZTZDcmVhdGlvblRvb2xfdGl0bGU9RW5kIE5vZGUKLUVuZE5vZGU2Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBFbmQgTm9kZQotSm9pbk5vZGU3Q3JlYXRpb25Ub29sX3RpdGxlPUpvaW4gTm9kZQotSm9pbk5vZGU3Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBKb2luIE5vZGUKLUFjdGl2aXR5OUNyZWF0aW9uVG9vbF90aXRsZT1BY3Rpdml0eQotQWN0aXZpdHk5Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBBY3Rpdml0eQotUGhhc2UxMENyZWF0aW9uVG9vbF90aXRsZT1QaGFzZQotUGhhc2UxMENyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgUGhhc2UKLUl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sX3RpdGxlPUl0ZXJhdGlvbgotSXRlcmF0aW9uMTFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IEl0ZXJhdGlvbgotVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbF90aXRsZT1UYXNrIERlc2NyaXB0b3IKLVRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFRhc2sgRGVzY3JpcHRvcgotTWlsZXN0b25lMTNDcmVhdGlvblRvb2xfdGl0bGU9TWlsZXN0b25lCi1NaWxlc3RvbmUxM0NyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgTWlsZXN0b25lCi1BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU9UGFydGl0aW9uQ2FtcGFydG1lbnQKLUFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU9UGFydGl0aW9uQ2FtcGFydG1lbnQKLUNvbW1hbmROYW1lX09wZW5EaWFncmFtPU9wZW4gRGlhZ3JhbQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTk2ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw5MjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA2L0dlbk1vZGVsIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiCi0gICAgbW9kZWxJRD0iQUQiCi0gICAgc2FtZUZpbGVGb3JEaWFncmFtQW5kTW9kZWw9InRydWUiCi0gICAgZGlhZ3JhbUZpbGVFeHRlbnNpb249InhtaSIKLSAgICB0ZW1wbGF0ZURpcmVjdG9yeT0iIgotICAgIGNvcHlyaWdodFRleHQ9IiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJiN4RDsmI3hBOyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzJiN4RDsmI3hBOyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAmI3hEOyYjeEE7IHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0JiN4RDsmI3hBOyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCYjeEQ7JiN4QTsmI3hEOyYjeEE7IENvbnRyaWJ1dG9yczomI3hEOyYjeEE7IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24mI3hEOyYjeEE7Ij4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlWaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciCi0gICAgICBjcmVhdGlvbldpemFyZEljb25QYXRoPSJpY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZiIKLSAgICAgIHZhbGlkYXRpb25Qcm92aWRlckNsYXNzTmFtZT0iVmFsaWRhdGlvblByb3ZpZGVyIgotICAgICAgbWV0cmljUHJvdmlkZXJDbGFzc05hbWU9Ik1ldHJpY1Byb3ZpZGVyIgotICAgICAgdmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyQ2xhc3NOYW1lPSJWYWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXIiPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5Ii8+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjcvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlhZX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDYiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRW5kTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBFbmROb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRW5kTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRW5kTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEVORE5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEVORE5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCIKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNZXJnZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTWVyZ2VOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJNZXJnZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZEaWFtb25kTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkRpYW1vbmRMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTWVyZ2VOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAzIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRm9ya05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJGb3JrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkZvcmtOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpSZXNpemVDb25zdHJhaW50cyIKLSAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXM9IjI0Ii8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvRm9ya05vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNCIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkluaXRpYWxOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJJbml0aWFsTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkluaXRpYWxOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEluaXRpYWxOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2UgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEluaXRpYWxOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoSU5JVElBTE5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgSU5JVElBTE5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Jbml0aWFsTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCIKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDUiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZEaWFtb25kTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkRpYW1vbmRMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvRGVjaXNpb25Ob2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA2IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSm9pbk5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJKb2luTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJKb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJKb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkpvaW5Ob2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpSZXNpemVDb25zdHJhaW50cyIKLSAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXM9IjI0Ii8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvSm9pbk5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0FjdGl2aXR5IgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA1IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDgiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iWFlfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyKCkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ncm91cCIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L2dyb3VwIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDciCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA5IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfVGFza0Rlc2NyaXB0b3IiCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDgiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTAiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA5IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDEwIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDExIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbnRyb2xGbG93RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dWaWV3RmFjdG9yeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJDb250cm9sRmxvd0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkNvbnRyb2xGbG93RmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIENvbnRyb2xGbG93RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIENvbnRyb2xGbG93RmlndXJlKCkgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4RDsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEQ7JiN4QTsvLyBkaXNwYXRjaE5leHQ/JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgwLCAwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAtMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0NvbnRyb2xGbG93Ii8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RWRnZS9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlFZGdlL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDEyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9IkNvbnRyb2xGbG93TGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBDb250cm9sRmxvd0xhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBDb250cm9sRmxvd0xhYmVsRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICB0aXRsZT0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNyIKLSAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgdGl0bGU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9IkZsb3dzIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGZvciBmbG93cyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJTdGFydCBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU3RhcnQgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJGb3JrIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBGb3JrIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTWVyZ2UgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1lcmdlIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkRlY2lzaW9uIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBEZWNpc2lvbiBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy40Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJFbmQgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEVuZCBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkpvaW4gTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEpvaW4gTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNlcGFyYXRvciIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBBY3Rpdml0eSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJQaGFzZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFBoYXNlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ikl0ZXJhdGlvbiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEl0ZXJhdGlvbiIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlRhc2sgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2sgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJNaWxlc3RvbmUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNaWxlc3RvbmUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIgotICAgICAgbmFtZT0iRVBGIEFjdGl2aXR5IERpYWdyYW0iCi0gICAgICBwcm92aWRlcj0iRWNsaXBzZS5vcmciCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IkFjdGl2aXR5RGlhZ3JhbUVkaXRvciIvPgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvIi8+Ci0gIDxleHByZXNzaW9uUHJvdmlkZXJzPgotICAgIDxwcm92aWRlcnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5KYXZhRXhwcmVzc2lvblByb3ZpZGVyIgotICAgICAgICBleHByZXNzaW9ucz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCIvPgotICA8L2V4cHJlc3Npb25Qcm92aWRlcnM+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZmdyYXBoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZncmFwaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyZjhkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZmdyYXBoCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ3JhcGg6Q2FudmFzIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ3JhcGg9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDYvR3JhcGhpY2FsRGVmaW5pdGlvbiIgbmFtZT0idW1sIj4KLSAgPGZpZ3VyZXMKLSAgICAgIG5hbWU9IkRlZmF1bHQiPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICAgIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgb3V0bGluZT0iZmFsc2UiPgotICAgICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICAgIG5hbWU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgdGV4dD0iIi8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICAgIDxhY2Nlc3NvcnMKLSAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMC9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4wIi8+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgICAgbmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiPgotICAgICAgICA8bGF5b3V0RGF0YQotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlhZTGF5b3V0RGF0YSI+Ci0gICAgICAgICAgPHNpemUKLSAgICAgICAgICAgICAgZHg9IjEwMCIKLSAgICAgICAgICAgICAgZHk9IjIwMCIvPgotICAgICAgICA8L2xheW91dERhdGE+Ci0gICAgICAgIDxsYXlvdXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpYWUxheW91dCIvPgotICAgICAgICA8Zm9yZWdyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICAgIHZhbHVlPSJibGFjayIvPgotICAgICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgICByZWQ9IjI1NSIKLSAgICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgICBibHVlPSIyNTUiLz4KLSAgICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICAgIGR4PSIzMDAiCi0gICAgICAgICAgICBkeT0iNjAwIi8+Ci0gICAgICAgIDxib3JkZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMaW5lQm9yZGVyIi8+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICB4PSIzMDAiCi0gICAgICAgICAgICB5PSI2MDAiLz4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgICBuYW1lPSJQYXJ0aXRpb25MYWJlbEZpZ3VyZSIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgICA8YWNjZXNzb3JzCi0gICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjEvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMCIvPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkNvbnRyb2xGbG93RmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVDb25uZWN0aW9uIgotICAgICAgICAgIG5hbWU9IkNvbnRyb2xGbG93RmlndXJlIgotICAgICAgICAgIHRhcmdldERlY29yYXRpb249Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMi9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4wIj4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVEZWNvcmF0aW9uIgotICAgICAgICAgICAgbmFtZT0iT3BlbkFycm93Ij4KLSAgICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICAgIHk9IjEiLz4KLSAgICAgICAgICA8dGVtcGxhdGUvPgotICAgICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgICB4PSItMSIKLSAgICAgICAgICAgICAgeT0iLTEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgICBuYW1lPSJDb250cm9sRmxvd0xhYmVsRmlndXJlIgotICAgICAgICAgICAgdGV4dD0iIi8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICAgIDxhY2Nlc3NvcnMKLSAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMi9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4xIi8+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iRm9ya05vZGVGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgICAgbmFtZT0iRm9ya05vZGVGaWd1cmUiPgotICAgICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgICByZWQ9IjQ1IgotICAgICAgICAgICAgZ3JlZW49Ijg1IgotICAgICAgICAgICAgYmx1ZT0iMTMwIi8+Ci0gICAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgICBkeD0iMTAwIgotICAgICAgICAgICAgZHk9IjUiLz4KLSAgICAgICAgPHNpemUKLSAgICAgICAgICAgIHg9IjEwMCIKLSAgICAgICAgICAgIHk9IjUiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkVuZE5vZGVGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDdXN0b21GaWd1cmUiCi0gICAgICAgICAgbmFtZT0iRW5kTm9kZUZpZ3VyZSIKLSAgICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkVuZE5vZGVGaWd1cmUiPgotICAgICAgICA8Zm9yZWdyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICAgIHZhbHVlPSJkYXJrQmx1ZSIvPgotICAgICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgICByZWQ9IjQ1IgotICAgICAgICAgICAgZ3JlZW49Ijg1IgotICAgICAgICAgICAgYmx1ZT0iMTMwIi8+Ci0gICAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgICBkeD0iMjQiCi0gICAgICAgICAgICBkeT0iMjQiLz4KLSAgICAgICAgPHNpemUKLSAgICAgICAgICAgIHg9IjI0IgotICAgICAgICAgICAgeT0iMjQiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkN1c3RvbUZpZ3VyZSIKLSAgICAgICAgICBuYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5EZWNpc2lvbk5vZGVGaWd1cmUiPgotICAgICAgICA8Zm9yZWdyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICAgIHZhbHVlPSJkYXJrQmx1ZSIvPgotICAgICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgICByZWQ9IjE4NSIKLSAgICAgICAgICAgIGdyZWVuPSIyMDUiCi0gICAgICAgICAgICBibHVlPSIyMzAiLz4KLSAgICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICAgIGR4PSI1MCIKLSAgICAgICAgICAgIGR5PSI1MCIvPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgeD0iNTAiCi0gICAgICAgICAgICB5PSI1MCIvPgotICAgICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICAgIG5hbWU9IkRpYW1vbmRMYWJlbCIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iSW5pdGlhbE5vZGVGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpFbGxpcHNlIgotICAgICAgICAgIG5hbWU9IkluaXRpYWxOb2RlRmlndXJlIj4KLSAgICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iZGFya0JsdWUiLz4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSI0NSIKLSAgICAgICAgICAgIGdyZWVuPSI4NSIKLSAgICAgICAgICAgIGJsdWU9IjEzMCIvPgotICAgICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgICAgZHg9IjIwIgotICAgICAgICAgICAgZHk9IjIwIi8+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICB4PSIyMCIKLSAgICAgICAgICAgIHk9IjIwIi8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJHZW5lcmljTGFiZWxGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICBuYW1lPSJHZW5lcmljTGFiZWxGaWd1cmUiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkN1c3RvbUZpZ3VyZSIKLSAgICAgICAgICBuYW1lPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCIKLSAgICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSIvPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICAgICAgb3V0bGluZT0iZmFsc2UiPgotICAgICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgICA8YWNjZXNzb3JzCi0gICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjkvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMCIvPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gIDwvZmlndXJlcz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIgotICAgICAgZmlndXJlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24iCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iSW5pdGlhbE5vZGUiCi0gICAgICBmaWd1cmU9IkluaXRpYWxOb2RlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iRm9ya05vZGUiCi0gICAgICBmaWd1cmU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgcmVzaXplQ29uc3RyYWludD0iRUFTVF9XRVNUIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iTWVyZ2VOb2RlIgotICAgICAgZmlndXJlPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJEZWNpc2lvbk5vZGUiCi0gICAgICBmaWd1cmU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkFjdGl2aXR5RmluYWxOb2RlIgotICAgICAgZmlndXJlPSJFbmROb2RlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iSm9pbk5vZGUiCi0gICAgICBmaWd1cmU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgcmVzaXplQ29uc3RyYWludD0iRUFTVF9XRVNUIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIgotICAgICAgZmlndXJlPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiLz4KLSAgPGNvbm5lY3Rpb25zCi0gICAgICBuYW1lPSJDb250cm9sRmxvdyIKLSAgICAgIGZpZ3VyZT0iQ29udHJvbEZsb3dGaWd1cmUiLz4KLSAgPGNvbXBhcnRtZW50cwotICAgICAgbmFtZT0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICBmaWd1cmU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4Ii8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9Ik5vZGVOYW1lIgotICAgICAgZmlndXJlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMC9AYWNjZXNzb3JzLjAiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iUGFydGl0aW9uTmFtZSIKLSAgICAgIGZpZ3VyZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4xL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJDb250cm9sRmxvd0xhYmVsIgotICAgICAgZmlndXJlPSJDb250cm9sRmxvd0ZpZ3VyZSIKLSAgICAgIHJlc2l6ZUNvbnN0cmFpbnQ9IkVBU1RfV0VTVCIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjIvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9Ik1lcmdlTm9kZVBvbHlnb25MYWJlbCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJHZW5lcmljTGFiZWwiCi0gICAgICBmaWd1cmU9IkdlbmVyaWNMYWJlbEZpZ3VyZSIKLSAgICAgIHJlc2l6ZUNvbnN0cmFpbnQ9IkVBU1RfV0VTVCIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJBY3Rpdml0eU5vZGVOYW1lIgotICAgICAgZmlndXJlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMC9AYWNjZXNzb3JzLjAiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iSW5pdGlhbE5vZGVOYW1lIgotICAgICAgZmlndXJlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMC9AYWNjZXNzb3JzLjAiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iRm9ya05vZGVOYW1lIgotICAgICAgZmlndXJlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMC9AYWNjZXNzb3JzLjAiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iRGVjaXNpb25Ob2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjkvQGFjY2Vzc29ycy4wIi8+Ci08L2dtZmdyYXBoOkNhbnZhcz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDY5NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNi9tYXBwaW5ncyIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0dlbmVyaWNMYWJlbCIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuNSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTWVyZ2VOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4zIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI01lcmdlTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vRm9ya05vZGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4yIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0ZvcmtOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Jbml0aWFsTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjR2VuZXJpY0xhYmVsIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0luaXRpYWxOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9EZWNpc2lvbk5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjQiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Kb2luTm9kZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjYiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjSm9pbk5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfQWN0aXZpdHkiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9BY3Rpdml0eSYjeEQ7JiN4QTsiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuOCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ncm91cCIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1BhcnRpdGlvbk5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjAiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjcvQG93bmVkQ2hpbGQiPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgICAgY2hpbGRyZW49Ii8vQG5vZGVzLjcvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjAiPgotICAgICAgICA8Y29tcGFydG1lbnQKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjUGFydGl0aW9uQ2FtcGFydG1lbnQiLz4KLSAgICAgIDwvY29tcGFydG1lbnRzPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfVGFza0Rlc2NyaXB0b3IiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1BoYXNlIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuOSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eU5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xMCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEyIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Db250cm9sRmxvdyIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNDb250cm9sRmxvd0xhYmVsIi8+Ci0gICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgIDx0b29sCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjAiLz4KLSAgICA8ZGlhZ3JhbUxpbmsKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNDb250cm9sRmxvdyIvPgotICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlFZGdlL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RWRnZS90YXJnZXQiLz4KLSAgPC9saW5rcz4KLSAgPGRpYWdyYW0+Ci0gICAgPGRpYWdyYW1DYW52YXMKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCN1bWwiLz4KLSAgICA8ZG9tYWluTW9kZWwKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8iLz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkiLz4KLSAgICA8cGFsZXR0ZQotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZSIvPgotICA8L2RpYWdyYW0+Ci08L2dtZm1hcDpNYXBwaW5nPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZ0b29sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZ0b29sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWU0Njk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mdG9vbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZnRvb2w6VG9vbFJlZ2lzdHJ5IHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxwYWxldHRlPgotICAgIDx0b29scwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiCi0gICAgICAgIHRpdGxlPSJGbG93cyIKLSAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZm9yIGZsb3dzIgotICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSI+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgIDwvdG9vbHM+Ci0gICAgPHRvb2xzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCIKLSAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMiCi0gICAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIgotICAgICAgICBhY3RpdmU9Ii8vQHBhbGV0dGUvQHRvb2xzLjEiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkgUGFydGl0aW9uIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iU3RhcnQgTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTdGFydCBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iRm9yayBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEZvcmsgTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9Ik1lcmdlIE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWVyZ2UgTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJEZWNpc2lvbiBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IERlY2lzaW9uIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iRW5kIE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRW5kIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJKb2luIE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSm9pbiBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlBhbGV0dGVTZXBhcmF0b3IiLz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJQaGFzZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBQaGFzZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9Ikl0ZXJhdGlvbiIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBJdGVyYXRpb24iPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFzayBEZXNjcmlwdG9yIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iTWlsZXN0b25lIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1pbGVzdG9uZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgIDwvdG9vbHM+Ci0gIDwvcGFsZXR0ZT4KLTwvZ21mdG9vbDpUb29sUmVnaXN0cnk+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtMi5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtMi5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDcyY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsOTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbC8yLjAiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCIKLSAgICBtb2RlbElEPSJBRCIKLSAgICBzYW1lRmlsZUZvckRpYWdyYW1BbmRNb2RlbD0idHJ1ZSIKLSAgICBkaWFncmFtRmlsZUV4dGVuc2lvbj0ieG1pIgotICAgIHRlbXBsYXRlRGlyZWN0b3J5PSIiCi0gICAgY29weXJpZ2h0VGV4dD0iIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mI3hEOyYjeEE7IEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMmI3hEOyYjeEE7IGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCYjeEQ7JiN4QTsgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQmI3hEOyYjeEE7IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJiN4RDsmI3hBOyYjeEQ7JiN4QTsgQ29udHJpYnV0b3JzOiYjeEQ7JiN4QTsgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiYjeEQ7JiN4QTsiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVZpZXdGYWN0b3J5IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyIKLSAgICAgIGNyZWF0aW9uV2l6YXJkSWNvblBhdGg9Imljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmIgotICAgICAgdmFsaWRhdGlvblByb3ZpZGVyQ2xhc3NOYW1lPSJWYWxpZGF0aW9uUHJvdmlkZXIiCi0gICAgICBtZXRyaWNQcm92aWRlckNsYXNzTmFtZT0iTWV0cmljUHJvdmlkZXIiCi0gICAgICB2YWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXJDbGFzc05hbWU9IlZhbGlkYXRpb25EZWNvcmF0b3JQcm92aWRlciI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkiLz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNy9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iWFlfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyKCkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJFbmROb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5FbmROb2RlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBFbmROb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRU5ETk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRU5ETk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIgotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik1lcmdlTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNZXJnZU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9Ik1lcmdlTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5EZWNpc2lvbk5vZGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVEaWFtb25kTGFiZWwoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkRpYW1vbmRMYWJlbDsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVEaWFtb25kTGFiZWwob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmRGlhbW9uZExhYmVsID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDE4NSwgMjA1LCAyMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9NZXJnZU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIE5vZGVOYW1lRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDMiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJGb3JrTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkZvcmtOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iRm9ya05vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJGb3JrTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBGb3JrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEZvcmtOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEZPUktOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlJlc2l6ZUNvbnN0cmFpbnRzIgotICAgICAgICAgICAgcmVzaXplSGFuZGxlcz0iMjQiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Gb3JrTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA0IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSW5pdGlhbE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkluaXRpYWxOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iSW5pdGlhbE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihJTklUSUFMTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBJTklUSUFMTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0luaXRpYWxOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIgotICAgICAgICAgIHZpc3VhbElEPSI0MDAzIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5EZWNpc2lvbk5vZGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVEaWFtb25kTGFiZWwoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkRpYW1vbmRMYWJlbDsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVEaWFtb25kTGFiZWwob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmRGlhbW9uZExhYmVsID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDE4NSwgMjA1LCAyMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9EZWNpc2lvbk5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA0IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIE5vZGVOYW1lRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDYiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJKb2luTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJKb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkpvaW5Ob2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkpvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkpvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iSm9pbk5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJGb3JrTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBGb3JrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEZvcmtOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEZPUktOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlJlc2l6ZUNvbnN0cmFpbnRzIgotICAgICAgICAgICAgcmVzaXplSGFuZGxlcz0iMjQiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Kb2luTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA3IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfQWN0aXZpdHkiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9BY3Rpdml0eSYjeEQ7JiN4QTsiCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDUiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwOCIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJYWV9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXIoKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZQYXJ0aXRpb25MYWJlbEZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L2dyb3VwIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDkiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3IiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwOCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAxMCIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDkiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAxMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMTAiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAxMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMTEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29udHJvbEZsb3dFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb250cm9sRmxvd1ZpZXdGYWN0b3J5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkNvbnRyb2xGbG93RWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQ29udHJvbEZsb3dGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQ29udHJvbEZsb3dGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hEOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4RDsmI3hBOy8vIGRpc3BhdGNoTmV4dD8mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAxKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KDAsIDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIC0xKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFRlbXBsYXRlKHBsKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQ29udHJvbEZsb3ciLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlFZGdlL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUVkZ2UvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMTIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbnRyb2xGbG93TmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIENvbnRyb2xGbG93TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIENvbnRyb2xGbG93TGFiZWxGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIHRpdGxlPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43IgotICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICB0aXRsZT0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iRmxvd3MiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZm9yIGZsb3dzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGdyb3VwIGZvciBub2RlcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlN0YXJ0IE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTdGFydCBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjMiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkZvcmsgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEZvcmsgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJNZXJnZSBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWVyZ2UgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IERlY2lzaW9uIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkVuZCBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRW5kIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iSm9pbiBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSm9pbiBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U2VwYXJhdG9yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlBoYXNlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUGhhc2UiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iSXRlcmF0aW9uIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSXRlcmF0aW9uIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ik1pbGVzdG9uZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1pbGVzdG9uZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiCi0gICAgICBuYW1lPSJFUEYgQWN0aXZpdHkgRGlhZ3JhbSIKLSAgICAgIHByb3ZpZGVyPSJFY2xpcHNlLm9yZyIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByaW50aW5nRW5hYmxlZD0idHJ1ZSIKLSAgICAgIGFjdGl2YXRvckNsYXNzTmFtZT0iQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luIi8+Ci0gIDxlZGl0b3IKLSAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlEaWFncmFtRWRpdG9yIi8+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8iLz4KLSAgPGV4cHJlc3Npb25Qcm92aWRlcnM+Ci0gICAgPHByb3ZpZGVycwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkphdmFFeHByZXNzaW9uUHJvdmlkZXIiCi0gICAgICAgIGV4cHJlc3Npb25zPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIi8+Ci0gIDwvZXhwcmVzc2lvblByb3ZpZGVycz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0yLmdtZm1hcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0yLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyMTBlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtMi5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9tYXBwaW5ncy8yLjAiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0dlbmVyaWNMYWJlbCIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuNSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTWVyZ2VOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4zIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI01lcmdlTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vRm9ya05vZGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4yIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0ZvcmtOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Jbml0aWFsTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNHZW5lcmljTGFiZWwiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjSW5pdGlhbE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0RlY2lzaW9uTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuNCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0pvaW5Ob2RlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuNiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNKb2luTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9BY3Rpdml0eSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0FjdGl2aXR5JiN4RDsmI3hBOyIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eU5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy44Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L2dyb3VwIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNQYXJ0aXRpb25OYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4wIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkIj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cwotICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4wIj4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1BhcnRpdGlvbkNhbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjExIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjkiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTAiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQ29udHJvbEZsb3ciLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3dMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3ciLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RWRnZS9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUVkZ2UvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjdW1sIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5Ii8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjI5NWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTVEFSVCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByZWZlcmVuY2VzLmdlbmVyYWw9QUQgRGlhZ3JhbQotcHJlZmVyZW5jZXMuYXBwZWFyYW5jZT1BcHBlYXJhbmNlCi1wcmVmZXJlbmNlcy5jb25uZWN0aW9ucz1Db25uZWN0aW9ucwotcHJlZmVyZW5jZXMucHJpbnRpbmc9UHJpbnRpbmcKLXByZWZlcmVuY2VzLnJ1bGVyc0FuZEdyaWQ9UnVsZXJzICYgR3JpZAotcHJlZmVyZW5jZXMucGF0aG1hcHM9UGF0aCBNYXBzCi0KLWVkaXRvck5hbWU9QUQgRGlhZ3JhbSBFZGl0b3IKLW5ld1dpemFyZE5hbWU9QUQgRGlhZ3JhbQotbmV3V2l6YXJkRGVzYz1DcmVhdGVzIEFEIGRpYWdyYW0uCi0KLWluaXREaWFncmFtQWN0aW9uTGFiZWw9SW5pdGlhbGl6ZSB4bWkgZGlhZ3JhbSBmaWxlCi1sb2FkUmVzb3VyY2VBY3Rpb25MYWJlbD1Mb2FkIFJlc291cmNlLi4uCi0KLW5hdmlnYXRvckNvbnRlbnROYW1lPSoueG1pIGRpYWdyYW0gY29udGVudHMKLQotbWV0YXR5cGUubmFtZS5BY3Rpdml0eV83OT1VbmRlZmluZWQKLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMT1BY3Rpdml0eUZpbmFsTm9kZQotbWV0YXR5cGUubmFtZS5NZXJnZU5vZGVfMTAwMj1NZXJnZU5vZGUKLW1ldGF0eXBlLm5hbWUuRm9ya05vZGVfMTAwMz1Gb3JrTm9kZQotbWV0YXR5cGUubmFtZS5Jbml0aWFsTm9kZV8xMDA0PUluaXRpYWxOb2RlCi1tZXRhdHlwZS5uYW1lLkRlY2lzaW9uTm9kZV8xMDA1PURlY2lzaW9uTm9kZQotbWV0YXR5cGUubmFtZS5Kb2luTm9kZV8xMDA2PUpvaW5Ob2RlCi1tZXRhdHlwZS5uYW1lLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNz1TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5UGFydGl0aW9uXzEwMDg9QWN0aXZpdHlQYXJ0aXRpb24KLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDk9QWN0aXZpdHlQYXJhbWV0ZXJOb2RlCi1tZXRhdHlwZS5uYW1lLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMD1TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi1tZXRhdHlwZS5uYW1lLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMT1TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyPUFjdGl2aXR5UGFyYW1ldGVyTm9kZQotbWV0YXR5cGUubmFtZS5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxPUFjdGl2aXR5UGFydGl0aW9uCi1tZXRhdHlwZS5uYW1lLkNvbnRyb2xGbG93XzMwMDE9Q29udHJvbEZsb3cKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi1wbHVnaW5OYW1lPUVQRiBBY3Rpdml0eSBEaWFncmFtCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotI05lZWRzIFRyYW5zbGF0aW9uCi1vcGVuX2FkZF90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLWVsZW1lbnRfdHlwZV9hY3Rpdml0eV9wYXJ0aXRpb249QWN0aXZpdHkgUGFydGl0aW9uCi1lbGVtZW50X3R5cGVfZW5kX25vZGU9RW5kIE5vZGUKLWVsZW1lbnRfdHlwZV9tZXJnZV9ub2RlPU1lcmdlIE5vZGUKLWVsZW1lbnRfdHlwZV9mb3JrX25vZGU9Rm9yayBOb2RlCi1lbGVtZW50X3R5cGVfc3RhcnRfbm9kZT1TdGFydCBOb2RlCi1lbGVtZW50X3R5cGVfZGVjaXNpb25fbm9kZT1EZWNpc2lvbiBOb2RlCi1lbGVtZW50X3R5cGVfam9pbl9ub2RlPUpvaW4gTm9kZQotZWxlbWVudF90eXBlX2FjdGl2aXR5PUFjdGl2aXR5Ci1lbGVtZW50X3R5cGVfcGhhc2U9UGhhc2UKLWVsZW1lbnRfdHlwZV9pdGVyYXRpb249SXRlcmF0aW9uCi1lbGVtZW50X3R5cGVfdGFza19kZXNjcmlwdG9yPVRhc2sgRGVzY3JpcHRvcgotZWxlbWVudF90eXBlX21pbGVzdG9uZT1NaWxlc3RvbmUKLWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3c9Q29udHJvbCBGbG93Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2ZlZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08IS0tCi0gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0KLSBDb250cmlidXRvcnM6Ci0gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotCi0tLT4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgZXh0ZW5zaW9uPSJ4bWkiPgotICAgICAgPC9maWxlVHlwZXM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgICA8cGFyc2VyCi0gICAgICAgICB0eXBlPSJ4bWkiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8L3BhcnNlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCIKLSAgICAgICAgbmFtZT0iQWN0aXZpdHkgRGlhZ3JhbSBFZGl0b3IiCi0gICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9BREVkaXRvci5naWYiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvciIKLSAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxNYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciI+Ci0gICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPCEtLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgCSAgPHdpemFyZAotICAJICAgICBuYW1lPSJBY3Rpdml0eSBEaWFncmFtIgotICAJICAgICBpY29uPSJpY29ucy9vYmoxNi9VTUxEaWFncmFtRmlsZS5naWYiCi0gIAkgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcyIKLSAgCSAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MQ3JlYXRpb25XaXphcmQiCi0gIAkgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTENyZWF0aW9uV2l6YXJkSUQiPgotICAJICAJIDxkZXNjcmlwdGlvbj4KLSAgCSAgCQlDcmVhdGVzIEFjdGl2aXR5IGRpYWdyYW0uCi0gIAkgIAkgPC9kZXNjcmlwdGlvbj4gIAotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4gLS0+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAJPCEtLSA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudWkub2JqZWN0Q29udHJpYnV0aW9uLklGaWxlMSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioudW1sIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJJbml0aWFsaXplIHhtaSBkaWFncmFtIGZpbGUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTEluaXREaWFncmFtRmlsZUFjdGlvbklEIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudWkub2JqZWN0Q29udHJpYnV0aW9uLkFjdGl2aXR5RWRpdFBhcnQyIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxMb2FkUmVzb3VyY2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MTG9hZFJlc291cmNlQWN0aW9uSUQiCi0gICAgICAgICAgICAgICBsYWJlbD0iTG9hZCBSZXNvdXJjZS4uLiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gCi0gLS0+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcnMiPgotICAJIDxjb250cmlidXRpb25JdGVtUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxwYXJ0Q29udHJpYnV0aW9uIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxwYXJ0QWN0aW9uIG1lbnViYXJQYXRoPSIvZmlsZS9wcmludCIgaWQ9InByaW50UHJldmlld0FjdGlvbiI+Ci0gICAgICAgICAgICA8L3BhcnRBY3Rpb24+Ci0gICAgICAgICA8L3BhcnRDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4KLSAgICAgIDxjb250cmlidXRpb25JdGVtUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIgotICAgICAgICAgICAgY2hlY2tQbHVnaW5Mb2FkZWQ9ImZhbHNlIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciLz4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRm9ya05vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21Nb2RlbEFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0Ii8+Ci0JCQk8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPiAKLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgIDwvY29udHJpYnV0aW9uSXRlbVByb3ZpZGVyPiAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcnMiPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQURQcmVzZW50YXRpb24iPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImRlbGV0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0ic2F2ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLnByb3ZpZGVycy5EaWFncmFtV2l0aFByaW50R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFEUHJlc2VudGF0aW9uUHJpbnQiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InByaW50Ii8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUucHJvdmlkZXJzLkRpYWdyYW1JREVHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQURQcmVzZW50YXRpb25JREUiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImJvb2ttYXJrIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDwhLS0KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVVJUmVuZGVyR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9IkFEUmVuZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjdXQiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY29weSIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwYXN0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICAtLT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudmlld1Byb3ZpZGVycyI+Ci0gICAgICA8dmlld1Byb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MVmlld1Byb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSIgc2VtYW50aWNIaW50cz0iQUQiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2UiIHNlbWFudGljSGludHM9IiIvPgotICAgICAgPC92aWV3UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydFByb3ZpZGVycyI+Ci0gICAgICA8ZWRpdHBhcnRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVkaXRQYXJ0UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9lZGl0cGFydFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFsZXR0ZVByb3ZpZGVycyI+Ci0gICAgICA8cGFsZXR0ZVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MUGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxlZGl0b3IgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiLz4KLSAgICAgIDwvcGFsZXR0ZVByb3ZpZGVyPgotICAgICAgPHBhbGV0dGVQcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRlZmF1bHRQYWxldHRlUHJvdmlkZXIiPgotICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTWVkaXVtIi8+Ci0gICAgICAgIDxlZGl0b3IgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiLz4KLSAgICAgICAgPGNvbnRyaWJ1dGlvbj4KLSAgICAgICAgICAgIDxwcmVkZWZpbmVkRW50cnkgICAgCi0gICAgICAgICAgICAJaWQ9Imdlb3NoYXBlRHJhd2VyIiBwYXRoPSIvIj4KLSAgICAgICAgICAgICA8L3ByZWRlZmluZWRFbnRyeT4gCi0gICAgICAgIDwvY29udHJpYnV0aW9uPgotICAgICAgPC9wYWxldHRlUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLm1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJzIj4KLSAgICAgIDxtb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L21vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMucHJvcGVydGllc1Byb3ZpZGVycyI+Ci0gICAgICA8UHJvcGVydGllc1Byb3ZpZGVyCi0gICAgICAgICAgICB2ZXJpZnlQbHVnaW5Mb2FkZWQ9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxQcm9wZXJ0eVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvUHJvcGVydGllc1Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uUHJvdmlkZXJzIj4KLSAgICAgIDxJY29uUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxJY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgotICAgICAgPC9JY29uUHJvdmlkZXI+Ci0gICAgICA8SWNvblByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMuaW50ZXJuYWwucHJvdmlkZXJzLkdlb1NoYXBlSWNvblByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eQotICAgICAgICAgICAgICAgbmFtZT0iTWVkaXVtIj4KLSAgICAgICAgIDwvUHJpb3JpdHk+Ci0gICAgICAgICA8b2JqZWN0IGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uKSIgaWQ9Ikdlb1NoYXBlIj4KLSAgICAgICAgCSA8bWV0aG9kIG5hbWU9ImdldFR5cGUoKSIgdmFsdWU9Im92YWwsdHJpYW5nbGUscmVjdGFuZ2xlLHNoYWRvd1JlY3RhbmdsZSxyZWN0YW5nbGUzRCxyb3VuZFJlY3RhbmdsZSxoZXhhZ29uLG9jdGFnb24scGVudGFnb24sZGlhbW9uZCxjeWxpbmRlcixsaW5lIi8+Ci0JICAgICA8L29iamVjdD4KLSAgICAgICAgIDxjb250ZXh0IGVsZW1lbnRzPSJHZW9TaGFwZSI+Ci0gICAgICAgICA8L2NvbnRleHQ+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyUHJvdmlkZXJzIj4KLSAgICAgIDxQYXJzZXJQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTFBhcnNlclByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvUGFyc2VyUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZXMiPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlfNzkiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJBY3Rpdml0eSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5BY3Rpdml0eUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9Ijc5Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfYWN0aXZpdHlfcGFydGl0aW9uIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UiPgotICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMjAwMSIvPgotICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2VuZF9ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHlGaW5hbE5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLk1lcmdlTm9kZV8xMDAyIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9tZXJnZV9ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iTWVyZ2VOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLk1lcmdlTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDIiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRm9ya05vZGVfMTAwMyIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfZm9ya19ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iRm9ya05vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuRm9ya05vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAzIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkluaXRpYWxOb2RlXzEwMDQiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX3N0YXJ0X25vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJJbml0aWFsTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5Jbml0aWFsTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDQiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRGVjaXNpb25Ob2RlXzEwMDUiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2RlY2lzaW9uX25vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJEZWNpc2lvbk5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuRGVjaXNpb25Ob2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwNSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Kb2luTm9kZV8xMDA2IgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9qb2luX25vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJKb2luTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5Kb2luTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDYiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3IgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9hY3Rpdml0eSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDciLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfYWN0aXZpdHlfcGFydGl0aW9uIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHlQYXJ0aXRpb24iCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA4Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5IgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV90YXNrX2Rlc2NyaXB0b3IiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwOSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfcGhhc2UiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcmFkdmljZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlIj4KLSAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAxMCIvPgotICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9pdGVyYXRpb24iCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcmFkdmljZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZSI+Ci0gICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMTEiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9taWxlc3RvbmUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcmFkdmljZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UiPgotICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMTIiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Db250cm9sRmxvd18zMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3ciCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJDb250cm9sRmxvdyIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5Db250cm9sRmxvd0VkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVCaW5kaW5ncyI+Ci0gICAgICA8Y2xpZW50Q29udGV4dCBpZD0iQURDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5lZGl0aW5nRG9tYWluIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLkVkaXRpbmdEb21haW4iLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvY2xpZW50Q29udGV4dD4gCi0gICAgICA8YmluZGluZyBjb250ZXh0PSJBRENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlfNzkiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLk1lcmdlTm9kZV8xMDAyIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Gb3JrTm9kZV8xMDAzIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Jbml0aWFsTm9kZV8xMDA0Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5EZWNpc2lvbk5vZGVfMTAwNSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuSm9pbk5vZGVfMTAwNiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Db250cm9sRmxvd18zMDAxIi8+Ci0gICAgICAgICA8YWR2aWNlIHJlZj0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmFkdmljZS5ub3RhdGlvbkRlcGRlbmRlbnRzIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcGF0dGVybj0iLioiLz4KLSAgICAgIDwvYmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmVzdGVkQ29tbWFuZFByb3ZpZGVycyI+Ci0gICAgICA8bmVzdGVkQ29tbWFuZFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY29tbWFuZHMuTmVzdGVkQ29tbWFuZFByb3ZpZGVyIj4KLSAgICAgIDwvbmVzdGVkQ29tbWFuZFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FESW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvQURJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiOGE1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvQURJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBREltYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxDTDE2ID0gImZ1bGwvZWxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETENMMTYgPSAiZnVsbC9kbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUT09MMTYgPSAiZnVsbC9ldG9vbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVE9PTDE2ID0gImZ1bGwvZHRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfRURJVE9SID0gRVRPT0wxNiArICJBREVkaXRvci5naWYiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRURJVE9SID0gRFRPT0wxNiArICJBREVkaXRvci5naWYiOyAvLyROT04tTkxTLTEkCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0VESVRPUiA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfRURJVE9SKTsJCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0VESVRPUiA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRURJVE9SKTsJCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvQWN0aXZpdHlEaWFncmFtUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvQWN0aXZpdHlEaWFncmFtUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NWExMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FjdGl2aXR5RGlhZ3JhbVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHlEaWFncmFtUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHlEaWFncmFtUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzg1ZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLlR5cGVDb252ZXJ0ZXIuVHlwZUNvbnZlcnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5lc3RlZENvbW1hbmRQcm92aWRlciBpbXBsZW1lbnRzIElOZXN0ZWRDb21tYW5kUHJvdmlkZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNjcmVhdGVOZXN0ZWRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBUeXBlQ29udmVyc2lvbkNvbW1hbmQpIHsKLQkJCXJldHVybiBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yVHlwZUNvbnZlcnNpb24oY29tbWFuZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JUeXBlQ29udmVyc2lvbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gY2hhbmdlIHR5cGUgb2YgYWN0aXZpdHkgbm9kZSBpbiBkaWFncmFtCi0JCS8vCi0JCUNvbGxlY3Rpb248Pz4gcmVzdWx0ID0gY29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCQlpZighcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IGUgPSByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWlmKGFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSk7Ci0JCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jLCB0aGlzKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbmV3VHlwZSA9IEJyaWRnZUhlbHBlci5nZXRUeXBlKGFjdGl2aXR5KTsJCQkJCQotCQkJCQlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gbWdyLmdldERpYWdyYW1zKGFjdGl2aXR5LmdldFN1cGVyQWN0aXZpdGllcygpLCBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JCQkJCVNldFR5cGVDb21tYW5kIGNtZCA9IG5ldyBTZXRUeXBlQ29tbWFuZCgpOwotCQkJCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGRpYWdyYW1zKSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSB1bWxBY3QgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IHVtbEFjdC5nZXROb2RlcygpKSB7Ci0JCQkJCQkJU3RyaW5nIHVyaVN0ciA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvbkRldGFpbChub2RlLCBCcmlkZ2VIZWxwZXIuVU1BX1VSSSk7Ci0JCQkJCQkJaWYodXJpU3RyICE9IG51bGwpIHsKLQkJCQkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyKTsKLQkJCQkJCQkJU3RyaW5nIGd1aWQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJaWYoYWN0aXZpdHkuZ2V0R3VpZCgpLmVxdWFscyhndWlkKSkgewotCQkJCQkJCQkJVmlldyB2aWV3ID0gQnJpZGdlSGVscGVyLmdldFZpZXcoZGlhZ3JhbSwgbm9kZSk7Ci0JCQkJCQkJCQljbWQucHJlcGFyZSh2aWV3LCBub2RlLCBuZXdUeXBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgY3JlYXRlUmVsYXRlZE9iamVjdHMoQ29sbGVjdGlvbiBjcmVhdGVkRWxlbWVudHMsCi0JCQlDb21tYW5kIGNyZWF0ZUNvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgcmVtb3ZlUmVsYXRlZE9iamVjdHMoQ29sbGVjdGlvbiBkZWxldGVkRWxlbWVudHMsCi0JCQlDb21tYW5kIGRlbGV0ZUNvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jb21tYW5kcy9TZXRUeXBlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjRjZTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jb21tYW5kcy9TZXRUeXBlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2V0VHlwZUNvbW1hbmQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwcml2YXRlIE1hcDxFTW9kZWxFbGVtZW50LCBTdHJpbmc+IGVsZW1lbnRUb05ld1R5cGVNYXAgPSBuZXcgSGFzaE1hcDxFTW9kZWxFbGVtZW50LCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBNYXA8RU1vZGVsRWxlbWVudCwgU3RyaW5nPiBlbGVtZW50VG9PbGRUeXBlTWFwOwotCXByaXZhdGUgTWFwPFZpZXcsIFN0cmluZz4gdmlld1RvTmV3VHlwZU1hcCA9IG5ldyBIYXNoTWFwPFZpZXcsIFN0cmluZz4oKTsKLQlwcml2YXRlIE1hcDxWaWV3LCBTdHJpbmc+IHZpZXdUb09sZFR5cGVNYXA7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUhhc2hTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCWZvciAoRU1vZGVsRWxlbWVudCBlIDogZWxlbWVudFRvTmV3VHlwZU1hcC5rZXlTZXQoKSkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmKGVsZW1lbnRUb09sZFR5cGVNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFRvT2xkVHlwZU1hcCA9IG5ldyBIYXNoTWFwPEVNb2RlbEVsZW1lbnQsIFN0cmluZz4oKTsKLQkJfQotCQllbHNlIHsKLQkJCWVsZW1lbnRUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJfQotCQlmb3IgKE1hcC5FbnRyeTxFTW9kZWxFbGVtZW50LCBTdHJpbmc+IGVudHJ5IDogZWxlbWVudFRvTmV3VHlwZU1hcC5lbnRyeVNldCgpKSB7Ci0JCQlmaW5hbCBFTW9kZWxFbGVtZW50IGUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCWZpbmFsIFN0cmluZyB0eXBlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG9sZFR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25EZXRhaWwoZSwgQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihlLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZShlLCB0eXBlKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCQllbGVtZW50VG9PbGRUeXBlTWFwLnB1dChlLCBvbGRUeXBlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JCWlmKCF2aWV3VG9OZXdUeXBlTWFwLmlzRW1wdHkoKSkgewotCQkJaWYodmlld1RvT2xkVHlwZU1hcCA9PSBudWxsKSB7Ci0JCQkJdmlld1RvT2xkVHlwZU1hcCA9IG5ldyBIYXNoTWFwPFZpZXcsIFN0cmluZz4oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpZXdUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJCX0KLQkJCWZvciAoTWFwLkVudHJ5PFZpZXcsIFN0cmluZz4gZW50cnkgOiB2aWV3VG9OZXdUeXBlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlmaW5hbCBWaWV3IHZpZXcgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlmaW5hbCBTdHJpbmcgbmV3VHlwZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZmluYWwgU3RyaW5nIG9sZFR5cGUgPSB2aWV3LmdldFR5cGUoKTsKLQkJCQl0cnkgewotCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbih2aWV3LCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlTdHJpbmcgbmV3TmFtZVR5cGUgPSBTdHJpbmcudmFsdWVPZihnZXRWaWV3TmFtZVR5cGUoSW50ZWdlci5wYXJzZUludChuZXdUeXBlKSkpOwotCQkJCQkJCVN0cmluZyBvbGROYW1lVHlwZSA9IFN0cmluZy52YWx1ZU9mKGdldFZpZXdOYW1lVHlwZShJbnRlZ2VyLnBhcnNlSW50KG9sZFR5cGUpKSk7Ci0JCQkJCQkJdmlldy5zZXRUeXBlKG5ld1R5cGUpOwotCQkJCQkJCS8vIHNldCBuZXcgdHlwZSBmb3Igbm9kZSBuYW1lcwotCQkJCQkJCS8vCi0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJVmlldyBjaGlsZCA9IChWaWV3KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGNoaWxkLmdldFR5cGUoKS5lcXVhbHMob2xkTmFtZVR5cGUpKSB7Ci0JCQkJCQkJCQljaGlsZC5zZXRUeXBlKG5ld05hbWVUeXBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQkJdmlld1RvT2xkVHlwZU1hcC5wdXQodmlldywgb2xkVHlwZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGVsZW1lbnRUb09sZFR5cGVNYXAgIT0gbnVsbCAmJiAhZWxlbWVudFRvT2xkVHlwZU1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PEVNb2RlbEVsZW1lbnQsIFN0cmluZz4gZW50cnkgOiBlbGVtZW50VG9PbGRUeXBlTWFwCi0JCQkJCS5lbnRyeVNldCgpKSB7Ci0JCQkJZmluYWwgRU1vZGVsRWxlbWVudCBlID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJZmluYWwgU3RyaW5nIHR5cGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXRyeSB7Ci0JCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGUsIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUoZSwgdHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbGVtZW50VG9PbGRUeXBlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYodmlld1RvT2xkVHlwZU1hcCAhPSBudWxsICYmICF2aWV3VG9PbGRUeXBlTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChNYXAuRW50cnk8VmlldywgU3RyaW5nPiBlbnRyeSA6IHZpZXdUb09sZFR5cGVNYXAuZW50cnlTZXQoKSkgewotCQkJCWZpbmFsIFZpZXcgdmlldyA9IGVudHJ5LmdldEtleSgpOwotCQkJCWZpbmFsIFN0cmluZyBvbGRUeXBlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0cnkgewotCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbih2aWV3LCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlTdHJpbmcgbmV3TmFtZVR5cGUgPSBTdHJpbmcudmFsdWVPZihnZXRWaWV3TmFtZVR5cGUoSW50ZWdlci5wYXJzZUludCh2aWV3LmdldFR5cGUoKSkpKTsKLQkJCQkJCQlTdHJpbmcgb2xkTmFtZVR5cGUgPSBTdHJpbmcudmFsdWVPZihnZXRWaWV3TmFtZVR5cGUoSW50ZWdlci5wYXJzZUludChvbGRUeXBlKSkpOwotCQkJCQkJCXZpZXcuc2V0VHlwZShvbGRUeXBlKTsKLQkJCQkJCQkvLyByZXN0b3JlIG9sZCB0eXBlIGZvciBub2RlIG5hbWVzCi0JCQkJCQkJLy8KLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlWaWV3IGNoaWxkID0gKFZpZXcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoY2hpbGQuZ2V0VHlwZSgpLmVxdWFscyhuZXdOYW1lVHlwZSkpIHsKLQkJCQkJCQkJCWNoaWxkLnNldFR5cGUob2xkTmFtZVR5cGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQkJdmlld1RvT2xkVHlwZU1hcC5jbGVhcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gIWVsZW1lbnRUb05ld1R5cGVNYXAuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByZXBhcmUoVmlldyB2aWV3LCBFTW9kZWxFbGVtZW50IGUsIFN0cmluZyB0eXBlKSB7Ci0JCWVsZW1lbnRUb05ld1R5cGVNYXAucHV0KGUsIHR5cGUpOwotCQlpbnQgdmlld1R5cGUgPSBnZXRWaWV3VHlwZSh0eXBlKTsKLQkJaWYodmlld1R5cGUgIT0gLTEpIHsKLQkJCXZpZXdUb05ld1R5cGVNYXAgLnB1dCh2aWV3LCBTdHJpbmcudmFsdWVPZih2aWV3VHlwZSkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGVsZW1lbnRUb05ld1R5cGVNYXAgIT0gbnVsbCkgewotCQkJZWxlbWVudFRvTmV3VHlwZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmKGVsZW1lbnRUb09sZFR5cGVNYXAgIT0gbnVsbCkgewotCQkJZWxlbWVudFRvT2xkVHlwZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmKHZpZXdUb05ld1R5cGVNYXAgIT0gbnVsbCkgewotCQkJdmlld1RvTmV3VHlwZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmKHZpZXdUb09sZFR5cGVNYXAgIT0gbnVsbCkgewotCQkJdmlld1RvT2xkVHlwZU1hcC5jbGVhcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpZXdUeXBlKFN0cmluZyBlbGVtZW50VHlwZSkgewotCQlpZihCcmlkZ2VIZWxwZXIuVU1BX0FDVElWSVRZLmVxdWFscyhlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCWVsc2UgaWYoQnJpZGdlSGVscGVyLlVNQV9QSEFTRS5lcXVhbHMoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJZWxzZSBpZihCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTi5lcXVhbHMoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJZWxzZSBpZihCcmlkZ2VIZWxwZXIuVU1BX01JTEVTVE9ORS5lcXVhbHMoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsJCQkKLQkJfQotCQllbHNlIGlmKEJyaWRnZUhlbHBlci5VTUFfVEFTS19ERVNDUklQVE9SLmVxdWFscyhlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Vmlld05hbWVUeXBlKGludCB2aWV3VHlwZSkgewotCQlzd2l0Y2godmlld1R5cGUpIHsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7CQkJCi0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhNGI4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5Dcm9zc1JlZmVyZW5jZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotCi0vKioKLSAqIERlc3Ryb3lDb21tYW5kIHRvIGRlc3Ryb3kgQWN0aXZpdHlQYXJ0aXRpb24gYW5kIGFsbCB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSBwYXJ0aXRpb25zLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZCBleHRlbmRzIERlc3Ryb3lFbGVtZW50Q29tbWFuZCB7Ci0KLQkKLQlwcml2YXRlIEVkaXRQYXJ0IGhvc3Q7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXF1ZXN0LCBFZGl0UGFydCBob3N0KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQl0aGlzLmhvc3QgPSBob3N0OwotCX0KLQkKLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgaG9zdC5nZXRNb2RlbCgpOwotCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmlldzsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkluY29taW5nUmVmZXJlbmNlcyhFT2JqZWN0IGRlc3RydWN0ZWUpIHsKLQkJCi0vLwkJbW92ZUNoaWxkcmVuc1RvUGFyZW50KGRlc3RydWN0ZWUpOwotCQkKLQkJQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyIGNyb3NzUmVmZXJlbmNlciA9IENyb3NzUmVmZXJlbmNlQWRhcHRlcgotCQkJCS5nZXRFeGlzdGluZ0Nyb3NzUmVmZXJlbmNlQWRhcHRlcihkZXN0cnVjdGVlKTsKLQkJaWYgKGNyb3NzUmVmZXJlbmNlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGludmVyc2VSZWZlcmVuY2VzID0gY3Jvc3NSZWZlcmVuY2VyCi0JCQkJCS5nZXRJbnZlcnNlUmVmZXJlbmNlcyhkZXN0cnVjdGVlKTsKLQkJCWlmIChpbnZlcnNlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBpbnZlcnNlUmVmZXJlbmNlcy5zaXplKCk7Ci0JCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJCVNldHRpbmcgc2V0dGluZzsKLQkJCQkJRVJlZmVyZW5jZSBlUmVmOwotCQkJCQlTZXR0aW5nW10gc2V0dGluZ3MgPSAoU2V0dGluZ1tdKSBpbnZlcnNlUmVmZXJlbmNlcwotCQkJCQkJCS50b0FycmF5KG5ldyBTZXR0aW5nW3NpemVdKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQkJCXNldHRpbmcgPSBzZXR0aW5nc1tpXTsKLQkJCQkJCWVSZWYgPSAoRVJlZmVyZW5jZSkgc2V0dGluZwotCQkJCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQkJCQlpZiAoZVJlZi5pc0NoYW5nZWFibGUoKQotCQkJCQkJCQkmJiAoZVJlZi5pc0Rlcml2ZWQoKSA9PSBmYWxzZSkKLQkJCQkJCQkJJiYgKGVSZWYuaXNDb250YWlubWVudCgpID09IGZhbHNlKQotCQkJCQkJCQkmJiAoZVJlZi5pc0NvbnRhaW5lcigpID09IGZhbHNlKSkgewotLy8JCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShzZXR0aW5nLmdldEVPYmplY3QoKSk7Ci0JCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShzZXR0aW5nLmdldEVPYmplY3QoKSwgZVJlZiwKLQkJCQkJCQkJCWRlc3RydWN0ZWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vdmVDaGlsZHJlbnNUb1BhcmVudChFT2JqZWN0IGRlc3RydWN0ZWUpIHsKLQkJaWYoZGVzdHJ1Y3RlZSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCUFjdGl2aXR5UGFydGl0aW9uIHBhcnRpdGlvbiA9IChBY3Rpdml0eVBhcnRpdGlvbilkZXN0cnVjdGVlOwotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBwYXJ0aXRpb24uZ2V0SW5BY3Rpdml0eSgpOwotCQkJTGlzdCBub2RlcyA9IHBhcnRpdGlvbi5nZXROb2RlcygpOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWFjdGl2aXR5LmdldE5vZGVzKCkuYWRkKG5vZGUpOwotCQkJCW5vZGUuZ2V0SW5QYXJ0aXRpb25zKCkucmVtb3ZlKHBhcnRpdGlvbik7Ci0JCQkJLy9pdGVyLnJlbW92ZSgpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFydGl0aW9uLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGVkZ2UgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlhY3Rpdml0eS5nZXRFZGdlcygpLmFkZChlZGdlKTsKLQkJCQllZGdlLmdldEluUGFydGl0aW9ucygpLnJlbW92ZShwYXJ0aXRpb24pOwotCQkJCS8vaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjMGI0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuUGFja2FnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbiBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQotCi0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbihDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJaWYoY29udGFpbmVyIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCXN0YXR1cyA9IHN1cGVyLmRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJRU9iamVjdCBuZXdFbGVtZW50ID0gZ2V0TmV3RWxlbWVudCgpOwotCQkKLQkJaWYgKG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIAotCQl7Ci0JCQlFT2JqZWN0IG9iaiA9IGdldE9yaWdpbmFsQ29udGFpbmVyKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pIHsKLQkJCQkvLyBzZXQgaW5wYXJ0aXRpb24gCi0JCQkJKChBY3Rpdml0eU5vZGUpIG5ld0VsZW1lbnQpLmdldEluUGFydGl0aW9ucygpLmFkZCgoQWN0aXZpdHlQYXJ0aXRpb24pIG9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JCi0KLQkvKioKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJpdmF0ZSBFT2JqZWN0IGdldE9yaWdpbmFsQ29udGFpbmVyKCkKLQl7Ci0JCXJldHVybiAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldENvbnRhaW5lcigpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjb250YWlubWVudCBmZWF0dXJlIGZvciB0aGUgbmV3IGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgY29udGFpbm1lbnQgZmVhdHVyZQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENvbnRhaW5tZW50RmVhdHVyZSgpIHsKLQotCQkvKioKLQkJICogVGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgaW4gd2hpY2ggdGhlIG5ldyBlbGVtZW50IHdpbGwgYmUgY3JlYXRlZC4KLQkJICovCi0JCUVSZWZlcmVuY2UgY29udGFpbm1lbnRGZWF0dXJlPW51bGw7Ci0JCWlmIChjb250YWlubWVudEZlYXR1cmUgPT0gbnVsbCkgewotCQkJRUNsYXNzIGNsYXNzVG9FZGl0ID0gZ2V0RUNsYXNzVG9FZGl0KCk7Ci0KLQkJCWlmIChjbGFzc1RvRWRpdCAhPSBudWxsKSB7Ci0JCQkJSUVsZW1lbnRUeXBlIHR5cGUgPSBnZXRFbGVtZW50VHlwZSgpOwotCi0JCQkJaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmdldEVDbGFzcygpICE9IG51bGwpIHsKLQkJCQkJY29udGFpbm1lbnRGZWF0dXJlID0gUGFja2FnZVV0aWwuZmluZEZlYXR1cmUoY2xhc3NUb0VkaXQsCi0JCQkJCQkJdHlwZS5nZXRFQ2xhc3MoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbnRhaW5tZW50RmVhdHVyZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUVPYmplY3QgbmV3RWxlbWVudCA9IHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZihuZXdFbGVtZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotCQkJCXx8IG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGUpewotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCUJyaWRnZUhlbHBlci5zZXREZWZhdWx0TmFtZSgoQWN0aXZpdHlOb2RlKW5ld0VsZW1lbnQpOwotCQkJfQotCQl9Ci0JCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVSZXF1ZXN0KCk7Ci0JCQotCQlpZihVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09IHJlcXVlc3QuZ2V0RWxlbWVudFR5cGUoKSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQl9ZWxzZSBpZihVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID09IHJlcXVlc3QKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKXsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMAotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX1lbHNlIGlmKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgPT0gcmVxdWVzdAotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpewotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExCi0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJfWVsc2UgaWYoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID09IHJlcXVlc3QKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKXsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Ci0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJfWVsc2UgaWYoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID09IHJlcXVlc3QKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKXsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyCi0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFiNWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZCBleHRlbmRzIENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QsCi0JCQlFT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCXNldEVsZW1lbnRUb0VkaXQoZWxlbWVudCk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLS8vCQlpZihnZXRTb3VyY2UoKSA9PSBudWxsKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCi0vLwkJaWYgKGdldEVDbGFzc1RvRWRpdCgpID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCi0vLwkJaWYgKGdldENvbnRhaW5tZW50RmVhdHVyZSgpICE9IG51bGwpIHsKLS8vCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSBnZXRDb250YWlubWVudEZlYXR1cmUoKS5nZXRFVHlwZSgpOwotLy8JCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0vLwotLy8JCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLS8vCQkJCXJlc3VsdCA9ICgoRUNsYXNzKSBlQ2xhc3NpZmllcikuaXNTdXBlclR5cGVPZihnZXRFbGVtZW50VHlwZSgpCi0vLwkJCQkJCS5nZXRFQ2xhc3MoKSk7Ci0vLwkJCX0KLS8vCi0vLwkJCXJlc3VsdCA9IHJlc3VsdAotLy8JCQkJCSYmIFBhY2thZ2VVdGlsLmNhblJlZmVyZW5jZShnZXRFQ2xhc3NUb0VkaXQoKSwKLS8vCQkJCQkJCWdldENvbnRhaW5tZW50RmVhdHVyZSgpLCBnZXRFbGVtZW50VHlwZSgpCi0vLwkJCQkJCQkJCS5nZXRFQ2xhc3MoKSk7Ci0vLwotLy8JCQlyZXR1cm4gcmVzdWx0OwotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODQ3NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5QYWNrYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kIGV4dGVuZHMgQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCwKLQkJCUVPYmplY3QgZWxlbWVudCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJc2V0RWxlbWVudFRvRWRpdChlbGVtZW50KTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eU5vZGUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYoZ2V0U291cmNlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChnZXRFQ2xhc3NUb0VkaXQoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgIT0gbnVsbCkgewotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSBnZXRDb250YWlubWVudEZlYXR1cmUoKS5nZXRFVHlwZSgpOwotCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi0JCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQlyZXN1bHQgPSAoKEVDbGFzcykgZUNsYXNzaWZpZXIpLmlzU3VwZXJUeXBlT2YoZ2V0RWxlbWVudFR5cGUoKQotCQkJCQkJLmdldEVDbGFzcygpKTsKLQkJCX0KLQotCQkJcmVzdWx0ID0gcmVzdWx0Ci0JCQkJCSYmIFBhY2thZ2VVdGlsLmNhblJlZmVyZW5jZShnZXRFQ2xhc3NUb0VkaXQoKSwKLQkJCQkJCQlnZXRDb250YWlubWVudEZlYXR1cmUoKSwgZ2V0RWxlbWVudFR5cGUoKQotCQkJCQkJCQkJLmdldEVDbGFzcygpKTsKLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkvLyBUT0RPOiBSZXNvbHZlIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBwcm9wZXJseS4KLQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvQnJlYWtkb3duRWxlbWVudE5vZGVGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9CcmVha2Rvd25FbGVtZW50Tm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNmYzgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9CcmVha2Rvd25FbGVtZW50Tm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLQotLyoqCi0gKiBDdXN0b21pemVkIGZpZ3VyZSBmb3IgdGhlIEJyZWFrZG93bkVsZW1lbnQgZmlndXJlcyB0byBzaG93IG92ZXJsYXBwZWQgcG9ydGlvbi4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnROb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50Tm9kZUZpZ3VyZSgpIHsKLQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJdGhpcy5zZXRPcGFxdWUoZmFsc2UpOwotCQljcmVhdGVDb250ZW50cygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCQlmaWdfMC5zZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9OZXdfSXRlcmF0aW9uKTsKLQotCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQotCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsKLQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKAotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQlmTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCWlmKGlzT3BhcXVlKCkpCi0JCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCXJldHVybjsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0RlY2lzaW9uTm9kZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0RlY2lzaW9uTm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzY2NTgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9EZWNpc2lvbk5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuSVBvbHlnb25BbmNob3JhYmxlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEFkb3B0ZWQgZnJvbSBHTUYncyBHZW9TaGFwZXMKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUZpZ3VyZSBleHRlbmRzIERlZmF1bHRTaXplTm9kZUZpZ3VyZSBpbXBsZW1lbnRzCi0JCUlQb2x5Z29uQW5jaG9yYWJsZUZpZ3VyZSB7Ci0KLQlwcml2YXRlIGludCBzcGFjaW5nOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgY3JlYXRlIGEgZGVjaXNpb24gZmlndXJlCi0JICogCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUZpZ3VyZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzcGFjaW5nKSB7Ci0JCXN1cGVyKHdpZHRoLCBoZWlnaHQpOwotCQl0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotCQljcmVhdGVGaWd1cmUod2lkdGgsIGhlaWdodCk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBkZWZTaXplCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUZpZ3VyZShEaW1lbnNpb24gZGVmU2l6ZSkgewotCQlzdXBlcihkZWZTaXplKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVGaWd1cmUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyKHdpZHRoLCBoZWlnaHQpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5JUG9seWdvbkFuY2hvcmFibGVGaWd1cmUjZ2V0UG9seWdvblBvaW50cygpCi0JICovCi0JcHVibGljIFBvaW50TGlzdCBnZXRQb2x5Z29uUG9pbnRzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBnZXRQb2ludHMoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZykgewotCQlQb2ludExpc3QgcG9pbnRzID0gZ2V0UG9pbnRMaXN0KGdldEJvdW5kcygpLmdldENvcHkoKSk7Ci0JCWcuZmlsbFBvbHlnb24ocG9pbnRzKTsKLQkJZy5kcmF3UG9seWdvbihwb2ludHMpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHNoYXBlcyBwb2x5Z29uIHBvaW50cy4KLQkgKiBUaGlzIGlzIGN1cnJlbnRseSBiYXNlZCBvbiB0aGUgc2hhcGVzIGJvdW5kaW5nIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVjdCB0aGUgcmVjdGFuZ2xlIHRoYXQgdGhlIHNoYXBlIHdpbGwgZml0IGluCi0JICovCi0JcHJvdGVjdGVkIFBvaW50TGlzdCBnZXRQb2ludExpc3QoUmVjdGFuZ2xlIHJlY3QpIHsKLQkJUG9pbnRMaXN0IHBvaW50cyA9IG5ldyBQb2ludExpc3QoKTsKLQkJCi0JCWludCBoYWxmWCA9IHJlY3QueCArIChyZWN0LndpZHRoIC8gMik7Ci0JCWludCBoYWxmWSA9IHJlY3QueSArIChyZWN0LmhlaWdodCAvIDIpOwotCQkKLQkJUG9pbnQgcDEgPSBuZXcgUG9pbnQoIGhhbGZYLCByZWN0LnkgKTsKLQkJUG9pbnQgcDIgPSBuZXcgUG9pbnQoIHJlY3QueCArIHJlY3Qud2lkdGggLSAxLCBoYWxmWSApOwotCQlQb2ludCBwMyA9IG5ldyBQb2ludCggaGFsZlgsIHJlY3QueSArIHJlY3QuaGVpZ2h0IC0gMSApOwotCQlQb2ludCBwNCA9IG5ldyBQb2ludCggcmVjdC54LCBoYWxmWSApOwotCQkKLQkJcG9pbnRzLmFkZFBvaW50KCBwMSApOwotCQlwb2ludHMuYWRkUG9pbnQoIHAyICk7Ci0JCXBvaW50cy5hZGRQb2ludCggcDMgKTsKLQkJcG9pbnRzLmFkZFBvaW50KCBwNCApOwotCQlwb2ludHMuYWRkUG9pbnQoIHAxICk7CQotCQkKLQkJcmV0dXJuIHBvaW50czsKLQl9Ci0JCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCXJldHVybiAoSUZpZ3VyZSkgZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZ3VyZShpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0JCXNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkgewotCQkJcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgZmlndXJlKSB7Ci0JCQkJUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCUxpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlJRmlndXJlIGNoaWxkOwotCQkJCURpbWVuc2lvbiBkOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQkJY2hpbGQgPSAoSUZpZ3VyZSljaGlsZHJlbi5nZXQoaSk7Ci0JCQkJCWQgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKHIud2lkdGgsIHIuaGVpZ2h0KTsKLQkJCQkJZC53aWR0aCA9IE1hdGgubWluKGQud2lkdGgsIHIud2lkdGgpOwotCQkJCQlkLmhlaWdodCA9IE1hdGgubWluKGQuaGVpZ2h0LCByLmhlaWdodCk7Ci0JCQkJCVJlY3RhbmdsZSBjaGlsZFJlY3QgPSBuZXcgUmVjdGFuZ2xlKAotCQkJCQkJci54ICsgKHIud2lkdGggLSBkLndpZHRoKS8yLAotCQkJCQkJci55ICsgKHIuaGVpZ2h0IC0gZC5oZWlnaHQpLzIsCi0JCQkJCQlkLndpZHRoLAotCQkJCQkJZC5oZWlnaHQpOwotCQkJCQljaGlsZC5zZXRCb3VuZHMoY2hpbGRSZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJSUZpZ3VyZSBmID0gbmV3IEZpZ3VyZSgpOwotCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQlsYXlvdXQuc2V0U3BhY2luZyhzcGFjaW5nKTsKLQkJZi5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCWFkZChmKTsKLQl9Ci0JCi0JcHVibGljIFBvaW50TGlzdCBnZXRQb2ludHMoKXsKLQkJcmV0dXJuIGdldFBvaW50TGlzdChnZXRCb3VuZHMoKS5nZXRDb3B5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWMwN2E4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcyBFbGxpcHNlIHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlI2ZpbGxTaGFwZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlyLnNocmluayhyLndpZHRoIC8gOCwgci5oZWlnaHQgLyA4KTsKLQkJZ3JhcGhpY3MuZmlsbE92YWwocik7Ci0JfQotCi0JLyoqCi0JICogT3V0bGluZXMgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGUjb3V0bGluZVNoYXBlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLQotCQlSZWN0YW5nbGUgciA9IFJlY3RhbmdsZS5TSU5HTEVUT047Ci0JCXIuc2V0Qm91bmRzKGdldEJvdW5kcygpKTsKLQkJci5zaHJpbmsoZ2V0Qm91bmRzKCkud2lkdGggLyA4LCBnZXRCb3VuZHMoKS5oZWlnaHQgLyA4KTsKLQkJci53aWR0aC0tOwotCQlyLmhlaWdodC0tOwotCQlyLnNocmluaygobGluZVdpZHRoIC0gMSkgLyAyLCAobGluZVdpZHRoIC0gMSkgLyAyKTsKLQkJZ3JhcGhpY3MuZHJhd092YWwocik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvUmVsYXRpdmVYWUFuY2hvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL1JlbGF0aXZlWFlBbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0Mjg1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvUmVsYXRpdmVYWUFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogUHJvdmlkZXMgcmVsYXRpdmUgYW5jaG9yIGZvciBhIGZpZ3VyZSdzIGxvY2F0aW9uLiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aXZlWFlBbmNob3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25BbmNob3IgewotCi0JcHJpdmF0ZSBQb2ludCByZWxhdGl2ZUxvY2F0aW9uOwotCi0JcHVibGljIFJlbGF0aXZlWFlBbmNob3IoSUZpZ3VyZSBmaWd1cmUsIFBvaW50IGxvY2F0aW9uLCBib29sZWFuIGlzUmVsYXRpdmUpIHsKLQkJc3VwZXIoZmlndXJlKTsKLQkJcmVsYXRpdmVMb2NhdGlvbiA9IGxvY2F0aW9uLmdldENvcHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yI2dldExvY2F0aW9uKFBvaW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpIHsKLQkJUG9pbnQgcCA9IHJlbGF0aXZlTG9jYXRpb24uZ2V0Q29weSgpOwotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlwLnBlcmZvcm1UcmFuc2xhdGUoci54LCByLnkpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciNnZXRSZWZlcmVuY2VQb2ludCgpCi0JICovCi0JcHVibGljIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb24obnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5Q3JlYXRpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5Q3JlYXRpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYWU2MjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5Q3JlYXRpb25FZGl0UG9saWN5IGV4dGVuZHMgQ3JlYXRpb25FZGl0UG9saWN5IHsKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXBhcmVudENvbW1hbmQoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUl0ZXJhdG9yIGVkaXRQYXJ0cyA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsKLQkJVmlldyBjb250YWluZXIgPSAoVmlldylnZXRIb3N0KCkuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJRU9iamVjdCBjb250ZXh0ID0gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudChjb250YWluZXIpOwotICAgICAgICBDb21wb3NpdGVDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQoRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7Ci0JCXdoaWxlICggZWRpdFBhcnRzLmhhc05leHQoKSApIHsKLQkJCUVkaXRQYXJ0IGVwID0gKEVkaXRQYXJ0KWVkaXRQYXJ0cy5uZXh0KCk7Ci0JCQlpZiAoIGVwIGluc3RhbmNlb2YgTGFiZWxFZGl0UGFydCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJVmlldyB2aWV3ID0gKFZpZXcpZXAuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJCWlmICggdmlldyA9PSBudWxsICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJRU9iamVjdCBzZW1hbnRpYyA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQlpZiAoIHNlbWFudGljID09IG51bGwgKSB7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdlcCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpZXA7Ci0JCQkJaWYoc2hvdWxkUmVwYXJlbnQoZ2VwLCByZXF1ZXN0KSkgewotCQkJCQljYy5jb21wb3NlKGdldFJlcGFyZW50Vmlld0NvbW1hbmQoZ2VwKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIGNvbnRleHQgIT0gbnVsbCAmJiBzaG91bGRSZXBhcmVudChzZW1hbnRpYywgY29udGV4dCkpIHsKLQkJCQljYy5jb21wb3NlKGdldFJlcGFyZW50Q29tbWFuZCgoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmVwYXJlbnQoSUdyYXBoaWNhbEVkaXRQYXJ0IGVwLCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJLy8gcmVwbGFjZSBwYXJlbnQgb25seSBpZiB0aGUgdmlldyBkb2VzIG5vdCBoYXZlIGFueSBwYXJlbnQgeWV0IG9yIHRoZQotCQkvLyBib3VuZHMgYXJlIG5vdCBpbnNpZGUgdGhlIGN1cnJlbnQgcGFyZW50IGZpZ3VyZQotCQkvLwotCQlWaWV3IHZpZXcgPSAoVmlldykgZXAuZ2V0TW9kZWwoKTsKLQkJaWYodmlldy5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJUG9pbnQgbG9jYXRpb24gPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQocmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQlJRmlndXJlIHBhcmVudEZpZyA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpZXAuZ2V0UGFyZW50KCkpLmdldEZpZ3VyZSgpOwotCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IHBhcmVudEZpZy5nZXRCb3VuZHMoKTsJCi0JCQlyZXR1cm4gIXBhcmVudEJvdW5kcy5jb250YWlucyhsb2NhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMTU0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5DcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldEJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBDcmVhdGlvbkVkaXRQb2xpY3kgZm9yIEFjdGl2aXR5UGFydGl0aW9uLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeSBleHRlbmRzIENyZWF0aW9uRWRpdFBvbGljeSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3kjZ2V0Q3JlYXRlQ29tbWFuZChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCBEaWFncmFtVUlNZXNzYWdlcy5BZGRDb21tYW5kX0xhYmVsKTsKLQotCQlJdGVyYXRvciBkZXNjcmlwdG9ycyA9IHJlcXVlc3QuZ2V0Vmlld0Rlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoZGVzY3JpcHRvcnMuaGFzTmV4dCgpKSB7Ci0JCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycwotCQkJCQkubmV4dCgpOwotCQkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotLy8JCQl3aGlsZShjb250YWluZXJWaWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLS8vCQkJCWNvbnRhaW5lclZpZXcgPSAoVmlldyljb250YWluZXJWaWV3LmVDb250YWluZXIoKTsKLS8vCQkJfQotCQkJQ3JlYXRlQ29tbWFuZCBjcmVhdGVDb21tYW5kID0gbmV3IENyZWF0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkJZGVzY3JpcHRvciwgY29udGFpbmVyVmlldyk7Ci0KLQkJCWNjLmNvbXBvc2UoY3JlYXRlQ29tbWFuZCk7Ci0JCX0KLQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCX0KLQkKLQkvKiogUmV0dXJuIGEgY29tbWFuZCB0byByZXBhcmVudCBib3RoIHRoZSBzZW1hbnRpYyBhbmQgdmlldyBlbGVtZW50cy4gKi8KLQkvKioKLQkgKiByZXR1cm4gYSBjb21tYW5kIHRvIHJlcGFyZW50IGJvdGggdGhlIHNlbWFudGljIGFuZCB2aWV3IGVsZW1lbnRzLiAKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdAotCSAqIEByZXR1cm4gY29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlcGFyZW50Q29tbWFuZChDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSXRlcmF0b3IgZWRpdFBhcnRzID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKS5pdGVyYXRvcigpOwotCQlWaWV3IGNvbnRhaW5lciA9IChWaWV3KWdldEhvc3QoKS5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlFT2JqZWN0IGNvbnRleHQgPSBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KGNvbnRhaW5lcik7Ci0gICAgICAgIENvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtVUlNZXNzYWdlcy5BZGRDb21tYW5kX0xhYmVsKTsKLQkJd2hpbGUgKCBlZGl0UGFydHMuaGFzTmV4dCgpICkgewotCQkJRWRpdFBhcnQgZXAgPSAoRWRpdFBhcnQpZWRpdFBhcnRzLm5leHQoKTsKLQkJCWlmICggZXAgaW5zdGFuY2VvZiBMYWJlbEVkaXRQYXJ0ICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlWaWV3IHZpZXcgPSAoVmlldyllcC5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQkJaWYgKCB2aWV3ID09IG51bGwgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUVPYmplY3Qgc2VtYW50aWMgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJaWYgKCBzZW1hbnRpYyA9PSBudWxsICkgewotCQkJCWNjLmNvbXBvc2UoZ2V0UmVwYXJlbnRWaWV3Q29tbWFuZCgoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwKSk7Ci0JCQkJY2MuY29tcG9zZShhZGp1c3RMb2NhdGlvbkNvbW1hbmQoKElHcmFwaGljYWxFZGl0UGFydCllcCwgcmVxdWVzdCkpOwotCQkJfQotCQkJZWxzZSBpZiAoIGNvbnRleHQgIT0gbnVsbCAmJiBzaG91bGRSZXBhcmVudChzZW1hbnRpYywgY29udGV4dCkpIHsKLQkJCQljYy5jb21wb3NlKGdldFJlcGFyZW50Q29tbWFuZCgoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwKSk7Ci0JCQkJY2MuY29tcG9zZShhZGp1c3RMb2NhdGlvbkNvbW1hbmQoKElHcmFwaGljYWxFZGl0UGFydCllcCwgcmVxdWVzdCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0UmVwYXJlbnRDb21tYW5kKElHcmFwaGljYWxFZGl0UGFydCBnZXApIHsKLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVDb21tYW5kKERpYWdyYW1VSU1lc3NhZ2VzLkFkZENvbW1hbmRfTGFiZWwpOyAKLQkJVmlldyBjb250YWluZXIgPSAoVmlldylnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBjb250ZXh0ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudChjb250YWluZXIpOwotCQlWaWV3IHZpZXcgPSAoVmlldylnZXAuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLSAgICAgICAgICAgIC5nZXRFZGl0aW5nRG9tYWluKCk7Ci0gICAgICAgIAotICAgICAgICAvLwotCQkvLyBzZW1hbnRpYwotCQlpZiAoIGVsZW1lbnQgIT0gbnVsbCApIHsKLQkJCUNvbW1hbmQgbW92ZVNlbWFudGljQ21kID0KLQkJCQlnZXRIb3N0KCkuZ2V0Q29tbWFuZCgKLQkJCQkJbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJCQluZXcgTW92ZVJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgY29udGV4dCwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb25fTm9kZSgpLCBlbGVtZW50KSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmIChtb3ZlU2VtYW50aWNDbWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLSAgICAgICAgICAgICAgfQotCQkJCi0JCQljYy5jb21wb3NlICggbmV3IENvbW1hbmRQcm94eShtb3ZlU2VtYW50aWNDbWQpICk7Ci0JCX0KLQkJLy8KLQkJLy8gbm90YXRpb24KLQkJY2MuY29tcG9zZShnZXRSZXBhcmVudFZpZXdDb21tYW5kKGdlcCkpOwotCQkvLyBpbiBjYXNlIG9mIG1vdmluZyBpbnRvIHBhcnRpdGlvbiB3ZSBoYXZlIHRvIGNoYW5nZSB0aGUgY29vcmRpbmF0ZXMgb2YgZWxlbWVudAotCQlyZXR1cm4gY2M7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tbWFuZCBhZGp1c3RMb2NhdGlvbkNvbW1hbmQoSUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkLAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFNoYXBlRWRpdFBhcnQpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKTsKLQkJCVBvaW50IGNoaWxkTG9jYXRpb24gPSBjaGlsZC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpOwotCQkJaW50IHggPSBjaGlsZExvY2F0aW9uLnggKyBsb2NhdGlvbi54Ci0JCQkJCS0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0TG9jYXRpb24oKS54OwotCQkJaW50IHkgPSBjaGlsZExvY2F0aW9uLnkgKyBsb2NhdGlvbi55Ci0JCQkJCS0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0TG9jYXRpb24oKS55OwotCi0JCQlJQ29tbWFuZCBib3VuZHNDb21tYW5kID0gbmV3IFNldEJvdW5kc0NvbW1hbmQoCi0JCQkJCSgoU2hhcGVFZGl0UGFydCkgY2hpbGQpLmdldEVkaXRpbmdEb21haW4oKSwKLQkJCQkJRGlhZ3JhbVVJTWVzc2FnZXMuU2V0TG9jYXRpb25Db21tYW5kX0xhYmVsX1Jlc2l6ZSwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoKFZpZXcpIGNoaWxkLmdldE1vZGVsKCkpLAotCQkJCQluZXcgUG9pbnQoeCwgeSkpOwotCi0JCQlyZXR1cm4gYm91bmRzQ29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0Jc3RhdGljIElDb21tYW5kIGNyZWF0ZUFkanVzdExvY2F0aW9uQ29tbWFuZChJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQsCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIElHcmFwaGljYWxFZGl0UGFydCBuZXdQYXJlbnQpIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU2hhcGVFZGl0UGFydCkgewotCQkJUG9pbnQgbG9jYXRpb24gPSByZXF1ZXN0LmdldE1vdmVEZWx0YSgpOwotCQkJUG9pbnQgbmV3TG9jYXRpb24gPSBjaGlsZC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpLmdldENvcHkoKS50cmFuc2xhdGUobG9jYXRpb24pOwotLy8JCQlEaW1lbnNpb24gZGlmZiA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkLmdldFBhcmVudCgpKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotLy8JCQkJCS5nZXRMb2NhdGlvbigpLmdldERpZmZlcmVuY2UoCi0vLwkJCQkJCQluZXdQYXJlbnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSk7Ci0vLwkJCW5ld0xvY2F0aW9uLnRyYW5zbGF0ZShkaWZmKTsKLS8vCQkJbmV3UGFyZW50LmdldEZpZ3VyZSgpLnRyYW5zbGF0ZUZyb21QYXJlbnQobmV3TG9jYXRpb24pOwotCQkJSUNvbW1hbmQgYm91bmRzQ29tbWFuZCA9IG5ldyBTZXRCb3VuZHNDb21tYW5kKAotCQkJCQkoKFNoYXBlRWRpdFBhcnQpIGNoaWxkKS5nZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJCURpYWdyYW1VSU1lc3NhZ2VzLlNldExvY2F0aW9uQ29tbWFuZF9MYWJlbF9SZXNpemUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpKSwKLQkJCQkJbmV3TG9jYXRpb24pOwotCi0JCQlyZXR1cm4gYm91bmRzQ29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmMTgzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNvbnRhaW5lckVkaXRQb2xpY3k7Ci0KLS8qKgotICogQWN0aXZpdHlQYXJ0aXRpb24gZGVsZWdhdGVzIHRvIGl0cyBjb21wYXJ0bWVudCBlZGl0IHBvbGljeQotICogICAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcwotICAgICAgICBBYnN0cmFjdEVkaXRQb2xpY3kgewotCi0gICAgcHJpdmF0ZSBFZGl0UGFydCBjaGlsZEVkaXRQYXJ0OwotICAgIHByaXZhdGUgRWRpdFBvbGljeSBjaGlsZEVkaXRQb2xpY3k7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2hpbGRWaWV3SUQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWRpdFBvbGljeUlEOwotICAgIAotICAgIAotICAgIHB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5KFN0cmluZyBjaGlsZElkLCBTdHJpbmcgZWRpdFBvbGljeUlkKSB7Ci0gICAgICAgIGNoaWxkVmlld0lEID0gY2hpbGRJZDsKLSAgICAgICAgZWRpdFBvbGljeUlEID0gZWRpdFBvbGljeUlkOwotICAgIH0KLSAgICAKLQotICAgLyoqCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2FjdGl2YXRlKCkKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotICAgICAgICBjaGlsZEVkaXRQYXJ0ID0KLSAgICAgICAgICAgICgoSUdyYXBoaWNhbEVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0Q2hpbGRCeVNlbWFudGljSGludChjaGlsZFZpZXdJRCk7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQYXJ0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kgPSBjaGlsZEVkaXRQYXJ0LmdldEVkaXRQb2xpY3koZWRpdFBvbGljeUlEKTsKLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LnNldEhvc3QoY2hpbGRFZGl0UGFydCk7Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5hY3RpdmF0ZSgpOwotICAgIH0KLQotICAvKioKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2RlYWN0aXZhdGUoKQotICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuZGVhY3RpdmF0ZSgpOwotICAgICAgICBjaGlsZEVkaXRQYXJ0ID0gbnVsbDsKLSAgICAgICAgY2hpbGRFZGl0UG9saWN5ID0gbnVsbDsKLSAgICB9Ci0KLQotICAgLyoqCi0gICAgKiAKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNlcmFzZVRhcmdldEZlZWRiYWNrKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVyYXNlVGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNnZXRDb21tYW5kKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY2hpbGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29udGFpbmVyRWRpdFBvbGljeSAmJiAKLSAgICAgICAgCQlyZXF1ZXN0IGluc3RhbmNlb2YgQ2hhbmdlQm91bmRzUmVxdWVzdCl7Ci0gICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRFZGl0UG9saWN5LmdldENvbW1hbmQocmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2dldFRhcmdldEVkaXRQYXJ0KG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRFZGl0UG9saWN5LmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNzaG93U291cmNlRmVlZGJhY2sob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNzaG93VGFyZ2V0RmVlZGJhY2sob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1RhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSN1bmRlcnN0YW5kc1JlcXVlc3Qob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQYXJ0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGFjdGl2YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWRpdFBvbGljeS51bmRlcnN0YW5kc1JlcXVlc3QocmVxKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjU5MGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVTaGFwZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotCi0vKioKLSAqIFhZTGF5b3V0UG9saWN5IGZvciBBY3Rpdml0eVBhcnRpdGlvbiB0byBoYW5kbGUgdGhlIG1vdmUgb2YgY2hpbGRyZW4uCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEB3cml0dGVuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExM2E4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Qm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Cb3VuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGF5b3V0Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQlPYmplY3QgcGFyZW50ICA9IGNoaWxkLmdldFBhcmVudCgpOwkJCi0JCWlmICgocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgJiYKLQkJCSggY2hpbGQgaW5zdGFuY2VvZiBTaGFwZUVkaXRQYXJ0ICYmIGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IChSZWN0YW5nbGUpIGNvbnN0cmFpbnQ7Ci0JCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9ICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydClwYXJlbnQpLmdldEZpZ3VyZSgpOwkJCQotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7Ci0JCQlib29sZWFuIGFkanVzdExvY2F0aW9uTmVlZGVkID0gVmlld1V0aWwKLQkJCQkJLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldykgIT0gbnVsbAotCQkJCQl8fCBwYXJlbnRGaWd1cmUuZ2V0Qm91bmRzKCkuY29udGFpbnMocmVjdC5nZXRMb2NhdGlvbigpKTsKLQkJCWlmKGFkanVzdExvY2F0aW9uTmVlZGVkKSB7Ci0JCQkJaW50IHggPSByZWN0LnggLSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIHBhcmVudCkuZ2V0TG9jYXRpb24oKS54OwotCQkJCWludCB5ID0gcmVjdC55IC0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSBwYXJlbnQpLmdldExvY2F0aW9uKCkueTsKLQotCQkJCUlDb21tYW5kIGJvdW5kc0NvbW1hbmQgPSAKLQkJCQkJbmV3IFNldEJvdW5kc0NvbW1hbmQoKChTaGFwZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCQkJCURpYWdyYW1VSU1lc3NhZ2VzLlNldExvY2F0aW9uQ29tbWFuZF9MYWJlbF9SZXNpemUsICAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHZpZXcpLAotCQkJCQkJCQkJbmV3IFBvaW50KHgsIHkpKTsgCi0KLQkJCQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGJvdW5kc0NvbW1hbmQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChjaGlsZCwgY29uc3RyYWludCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZChFZGl0UGFydCBjaGlsZCwKLQkJCU9iamVjdCBjb25zdHJhaW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZChjaGlsZCwgY29uc3RyYWludCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZCgKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwgRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQocmVxdWVzdCwgY2hpbGQsCi0JCQkJY29uc3RyYWludCk7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIHsKLQkJCUxpc3QgbGlzdCA9IGdldE5vZGVzSW5QYXJ0aXRpb24oKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIGNoaWxkKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRWRpdFBhcnQgZWxlbWVudCA9IChFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgcmVxID0gbmV3IENoYW5nZUJvdW5kc1JlcXVlc3QoCi0JCQkJCQkJCVJFUV9SRVNJWkVfQ0hJTERSRU4pOwotCQkJCQkJcmVxLnNldEVkaXRQYXJ0cyhlbGVtZW50KTsKLQkJCQkJCXJlcS5zZXRNb3ZlRGVsdGEocmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQkJCQlyZXEuc2V0U2l6ZURlbHRhKHJlcXVlc3QuZ2V0U2l6ZURlbHRhKCkpOwotCQkJCQkJcmVxLnNldExvY2F0aW9uKHJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQlyZXEuc2V0RXh0ZW5kZWREYXRhKHJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkpOwotCQkJCQkJcmVxLnNldFJlc2l6ZURpcmVjdGlvbihyZXF1ZXN0LmdldFJlc2l6ZURpcmVjdGlvbigpKTsKLQkJCQkJCWNtZCA9IGNtZC5jaGFpbihlbGVtZW50LmdldFBhcmVudCgpLmdldENvbW1hbmQocmVxKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX1lbHNlewotCQkJRWRpdFBhcnQgcGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50KCk7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpewotCQkJCUxpc3QgY2hpbGRyZW4gPSAoKERpYWdyYW1FZGl0UGFydClwYXJlbnQpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJCQlpZihwYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCl7Ci0JCQkJCQlOb2RlIHZpZXcgPSAoTm9kZSlwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlMYXlvdXRDb25zdHJhaW50IGxDb25zdGFpbnQgPSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQkJCWlmKGxDb25zdGFpbnQgaW5zdGFuY2VvZiBCb3VuZHMpewotCQkJCQkJCVJlY3RhbmdsZSBwYXJ0aXRpb25Db25zdHJhaW50ID0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KXBhcnQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJCWlmKGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBSZWN0YW5nbGUpewotCQkJCQkJCQlpZihwYXJ0aXRpb25Db25zdHJhaW50LmNvbnRhaW5zKChSZWN0YW5nbGUpY29uc3RyYWludCkpewotCQkJCQkJCQkJcmVxdWVzdC5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NSRUFURSk7Ci0JCQkJCQkJCQljbWQgPSBjbWQuY2hhaW4ocGFydC5nZXRDb21tYW5kKHJlcXVlc3QpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX1lbHNlewotCQkJCQkJCWlmIChBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGF5b3V0Q29uc3RyYWludDogIisgbENvbnN0YWludCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNtZDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXROb2Rlc0luUGFydGl0aW9uKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQgY2hpbGQpIHsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQWN0aXZpdHlQYXJ0aXRpb24gcGFydGl0aW9uID0gKEFjdGl2aXR5UGFydGl0aW9uKSgoTm9kZSljaGlsZC5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCUxpc3QgbGlzdCA9IHBhcnRpdGlvbi5nZXROb2RlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCW5vZGVzLmFkZChmaW5kRWRpdFBhcnR5QnlFbGVtZW50KGNoaWxkLmdldFBhcmVudCgpLCBlbGVtZW50KSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFZGl0UGFydCBmaW5kRWRpdFBhcnR5QnlFbGVtZW50KEVkaXRQYXJ0IHBhcmVudCwKLQkJCU9iamVjdCBlbGVtZW50KSB7Ci0JCUxpc3QgbGlzdCA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCgoTm9kZSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpID09IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZWRpdFBhcnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0QWRkQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCWNvbW1hbmQuc2V0RGVidWdMYWJlbCgiQWRkIGluIENvbnN0cmFpbmVkTGF5b3V0RWRpdFBvbGljeSB3aXRoIFJlcGFyZW50IGlmIG5lY2Vzc2FyeSIpOy8vJE5PTi1OTFMtMSQKLQkJY29tbWFuZC5hZGQoc3VwZXIuZ2V0QWRkQ29tbWFuZChyZXF1ZXN0KSk7Ci0JCQotCQlJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGRQYXJ0OwotCQlpZihyZXF1ZXN0IGluc3RhbmNlb2YgQ2hhbmdlQm91bmRzUmVxdWVzdCAmJiByZXF1ZXN0LmdldFR5cGUoKSA9PSBSRVFfQUREKXsKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgY2hhbmdlUmVxdWVzdCA9KENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdDsgCi0JCQlMaXN0IGVkaXRQYXJ0cyA9IGNoYW5nZVJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRQYXJ0cy5zaXplKCk7IGkrKykgewotCQkJCWNoaWxkUGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnRzLmdldChpKTsKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFyZW50ID0gKElHcmFwaGljYWxFZGl0UGFydCljaGlsZFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCl7Ci0JCQkJCVBvaW50IHBvaW50ID0gY2hpbGRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCkuZ2V0Q29weSgpOwotCQkJCQlwb2ludC50cmFuc2xhdGUoY2hhbmdlUmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQkJCWlmKCFwYXJlbnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuY29udGFpbnMocG9pbnQpKXsKLQkJCQkJCWNvbW1hbmQuYWRkKGdldFJlcGFyZW50Q29tbWFuZChjaGlsZFBhcnQsIHBhcmVudCwgY2hhbmdlUmVxdWVzdCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21tYW5kLnVud3JhcCgpOwotLy8JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXBhcmVudENvbW1hbmQoSUdyYXBoaWNhbEVkaXRQYXJ0IGdlcCwgSUdyYXBoaWNhbEVkaXRQYXJ0IG9sZFBhcmVudCwKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgY2hhbmdlUmVxdWVzdCkgewotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQoRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7IAotCQlWaWV3IGNvbnRhaW5lciA9IChWaWV3KWdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IGNvbnRleHQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KGNvbnRhaW5lcik7Ci0JCVZpZXcgdmlldyA9IChWaWV3KWdlcC5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCi0gICAgICAgIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotICAgICAgICAgICAgLmdldEVkaXRpbmdEb21haW4oKTsKLSAgICAgICAgCi0JCWlmICggZWxlbWVudCAhPSBudWxsICkgewotCQkJY2MuY29tcG9zZShuZXcgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQobmV3IE1vdmVSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGNvbnRleHQsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X05vZGUoKSwgZWxlbWVudCksCi0JCQkJCWVsZW1lbnQsdmlldywgb2xkUGFyZW50KSk7Ci0JCQljYy5jb21wb3NlKG5ldyBBZGRDb21tYW5kKGdlcC5nZXRFZGl0aW5nRG9tYWluKCksIG5ldyBFT2JqZWN0QWRhcHRlcihjb250YWluZXIpLAotCQkJCQkgIG5ldyBFT2JqZWN0QWRhcHRlcih2aWV3KSkpOwotCQkJY2MuY29tcG9zZShhZGp1c3RMb2NhdGlvbkNvbW1hbmQoZ2VwLCBjaGFuZ2VSZXF1ZXN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotCQotCQotCXB1YmxpYyBjbGFzcyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZHsKLQotCQlwcml2YXRlIGZpbmFsIEVPYmplY3QgbW92ZUVsZW1lbnQ7Ci0JCXByaXZhdGUgSUdyYXBoaWNhbEVkaXRQYXJ0IG9sZFBhcmVudDsKLQkJcHJpdmF0ZSBWaWV3IHZpZXc7Ci0JCQotCQlwdWJsaWMgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQoTW92ZVJlcXVlc3QgcmVxLCBFT2JqZWN0IGVsZW1lbnQsIFZpZXcgdmlldywgCi0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IG9sZFBhcmVudCkgewotCQkJdGhpcygicmVwYXJlbnQgb24gbW92ZSIsIGVsZW1lbnQsIHJlcSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMub2xkUGFyZW50ID0gb2xkUGFyZW50OwotCQkJdGhpcy52aWV3ID0gdmlldzsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFJlcGFyZW50aW5nRWxlbWVudHNDb21tYW5kKFN0cmluZyBsYWJlbCwgRU9iamVjdCBlbGVtZW50VG9FZGl0LCAKLQkJCQlJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCXN1cGVyKGxhYmVsLCBlbGVtZW50VG9FZGl0LCByZXF1ZXN0KTsKLQkJCXRoaXMubW92ZUVsZW1lbnQgPSBlbGVtZW50VG9FZGl0OyAKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCVZpZXcgcGFyZW50VmlldyA9IChWaWV3KWdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJaWYocGFyZW50Vmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJaWYobW92ZUVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpewotCQkJCQlWaWV3IG9sZFBhcmVudFZpZXcgPSAoVmlldylvbGRQYXJlbnQuZ2V0TW9kZWwoKTsKLQkJCQkJKChBY3Rpdml0eU5vZGUpbW92ZUVsZW1lbnQpLmdldEluUGFydGl0aW9ucygpLnJlbW92ZShvbGRQYXJlbnRWaWV3LmdldEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCQlpZihtb3ZlRWxlbWVudCAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21tYW5kIGFkanVzdExvY2F0aW9uQ29tbWFuZChJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQsCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU2hhcGVFZGl0UGFydCkgewotCQkJUG9pbnQgbG9jYXRpb24gPSByZXF1ZXN0LmdldE1vdmVEZWx0YSgpLmdldENvcHkoKTsKLQkJCVBvaW50IGNoaWxkTG9jYXRpb24gPSBjaGlsZC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpOwotCQkJbG9jYXRpb24ueCs9Y2hpbGRMb2NhdGlvbi54OwotCQkJbG9jYXRpb24ueSs9Y2hpbGRMb2NhdGlvbi55OwotCQkJSUNvbW1hbmQgYm91bmRzQ29tbWFuZCA9IG5ldyBTZXRCb3VuZHNDb21tYW5kKAotCQkJCQkoKFNoYXBlRWRpdFBhcnQpIGNoaWxkKS5nZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJCURpYWdyYW1VSU1lc3NhZ2VzLlNldExvY2F0aW9uQ29tbWFuZF9MYWJlbF9SZXNpemUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpKSwKLQkJCQkJbG9jYXRpb24pOwotCi0JCQlyZXR1cm4gYm91bmRzQ29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0R5bmFtaWNSZXNpemVEaXJlY3Rpb25zRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9EeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhYzJmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0R5bmFtaWNSZXNpemVEaXJlY3Rpb25zRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBZdXJ5IENoZXJuaWtvdiAoQm9ybGFuZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIAotICogICAgCi0gKiAgICBNb2RpZmllZCA6Ci0gKiAgCVNoaWxwYSBUb3Jhc2thcgotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUubGlzdGVuZXIuRGlhZ3JhbUV2ZW50QnJva2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5saXN0ZW5lci5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIER5bmFtaWNSZXNpemVEaXJlY3Rpb25zRWRpdFBvbGljeSBleHRlbmRzIFJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeSBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvbkxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJUSUNBTCA9IC0xOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNRVUFSRSA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTCA9IDE7Ci0KLQlwcml2YXRlIGludCBteUN1cnJlbnRTdGF0ZTsKLQkKLQlwdWJsaWMgRHluYW1pY1Jlc2l6ZURpcmVjdGlvbnNFZGl0UG9saWN5KCl7Ci0JCW15Q3VycmVudFN0YXRlID0gSE9SSVpPTlRBTDsKLQkJc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5FQVNUIHwgUG9zaXRpb25Db25zdGFudHMuV0VTVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlnZXREaWFncmFtRXZlbnRCcm9rZXIoKS5hZGROb3RpZmljYXRpb25MaXN0ZW5lcihnZXRIb3N0SW1wbCgpLmdldE5vdGF0aW9uVmlldygpLCB0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJZ2V0RGlhZ3JhbUV2ZW50QnJva2VyKCkucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIoZ2V0SG9zdEltcGwoKS5nZXROb3RhdGlvblZpZXcoKSwgdGhpcyk7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaG9zdFNpemVDaGFuZ2VkKCl7Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBob3N0ID0gZ2V0SG9zdEltcGwoKTsKLQkJSW50ZWdlciB3aWR0aCA9IChJbnRlZ2VyKSBob3N0LmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkpOwotCQlJbnRlZ2VyIGhlaWdodCA9IChJbnRlZ2VyKSBob3N0LmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpKTsKLQkJaWYgKHdpZHRoID09IG51bGwpewotCQkJd2lkdGggPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCX0KLQkJaWYgKGhlaWdodCA9PSBudWxsKXsKLQkJCWhlaWdodCA9IEludGVnZXIudmFsdWVPZigwKTsKLQkJfQotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWNvcnJlY3RFZGl0UG9saWN5KHNpemUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkgfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJaG9zdFNpemVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvcnJlY3RFZGl0UG9saWN5KERpbWVuc2lvbiBzaXplKSB7Ci0JCWlmIChpc0NoYW5nZWQoc2l6ZSkpIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCXNldFN0YXRlKHNpemUpOwotCQkJc2hvd1NlbGVjdGlvbigpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldEhvc3RJbXBsKCl7Ci0JCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2hhbmdlZChEaW1lbnNpb24gc2l6ZSkgewotCQlyZXR1cm4gKHNpemUuaGVpZ2h0IC0gc2l6ZS53aWR0aCkgKiBteUN1cnJlbnRTdGF0ZSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhdGUoRGltZW5zaW9uIHNpemUpIHsKLQkJaW50IGRlbHRhID0gc2l6ZS5oZWlnaHQgLSBzaXplLndpZHRoOwotCQlpZiAoZGVsdGEgPiAwKSB7Ci0JCQlteUN1cnJlbnRTdGF0ZSA9IFZFUlRJQ0FMOwotCQkJc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCB8IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJfSBlbHNlIGlmIChkZWx0YSA8IDApIHsKLQkJCW15Q3VycmVudFN0YXRlID0gSE9SSVpPTlRBTDsKLQkJCXNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuV0VTVCB8IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpOwotCQl9IGVsc2UgewotCQkJbXlDdXJyZW50U3RhdGUgPSBTUVVBUkU7Ci0JCX0KLQl9Ci0JCi0gICAgcHJpdmF0ZSBEaWFncmFtRXZlbnRCcm9rZXIgZ2V0RGlhZ3JhbUV2ZW50QnJva2VyKCkgewotICAgIAlyZXR1cm4gRGlhZ3JhbUV2ZW50QnJva2VyLmdldEluc3RhbmNlKGdldEhvc3RJbXBsKCkuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLSAgICB9Ci0JCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgeyAJCi0gICAgCS8vIHNldCBzdGF0ZSBjb3JyZWN0bHkgYmVmb3JlIHNob3dpbmcgaXQuCi0gICAgCUlHcmFwaGljYWxFZGl0UGFydCBob3N0ID0gZ2V0SG9zdEltcGwoKTsKLQkJSW50ZWdlciB3aWR0aCA9IChJbnRlZ2VyKSBob3N0LmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkpOwotCQlJbnRlZ2VyIGhlaWdodCA9IChJbnRlZ2VyKSBob3N0LmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpKTsKLQkJaWYgKHdpZHRoID09IG51bGwpewotCQkJd2lkdGggPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCX0KLQkJaWYgKGhlaWdodCA9PSBudWxsKXsKLQkJCWhlaWdodCA9IEludGVnZXIudmFsdWVPZigwKTsKLQkJfQotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0gICAgCXNldFN0YXRlKHNpemUpOwotICAgIAkgICAgCQotICAgIAlzdXBlci5zaG93U2VsZWN0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9PcGVuQURFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL09wZW5BREVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMjg4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL09wZW5BREVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5PcGVuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBNb3VzZSBkb3VibGUgY2xpY2sgb24gU3RydWN0dXJlZEFjdGl2aXR5RWRpdFBhcnQgc2hvdWxkIG9wZW4gZGlhZ3JhbS4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQURFZGl0UG9saWN5IGV4dGVuZHMgT3BlbkVkaXRQb2xpY3kgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuT3BlbkVkaXRQb2xpY3kjZ2V0T3BlbkNvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0T3BlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJTm9kZSB2aWV3ID0gKE5vZGUpIHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBEaWFncmFtQ29yZVV0aWwuZ2V0RGlhZ3JhbUVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBkaWFncmFtRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCS5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJLmdldE5vZGVBZGFwdGVyKGVsZW1lbnQpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpIGRpYWdyYW1FZGl0UGFydAotCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQlEaWFncmFtRWRpdERvbWFpbiBkb21haW4gPSAoRGlhZ3JhbUVkaXREb21haW4pIHZpZXdlcgotCQkJCQkJCS5nZXRFZGl0RG9tYWluKCk7Ci0JCQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBkb21haW4uZ2V0RGlhZ3JhbUVkaXRvclBhcnQoKTsKLQkJCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQoCi0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0LAotCQkJCQkJCQlkaWFncmFtQWRhcHRlci5nZXRTdXBwcmVzc2lvbigpLAotCQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JCQkJCQl0cnl7Ci0JCQkJCQlEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkub3BlbkRpYWdyYW1FZGl0b3IoCi0JCQkJCQkJCQkJcGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLAotCQkJCQkJCQkJCWlucHV0LAotCQkJCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwMmMxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjNmIwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBuZXdFbGVtZW50ID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgc3VwZXIKLQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwKLQkJCQkmJiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPT0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkKLQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCX0KLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbAotCQkJCSYmIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9PSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMgotCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzA5NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDVmN2FhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgbXlDb250YWluZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBY3Rpdml0eU5vZGUgbXlTb3VyY2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBY3Rpdml0eU5vZGUgbXlUYXJnZXQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSwKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyLCBBY3Rpdml0eU5vZGUgc291cmNlLAotCQkJQWN0aXZpdHlOb2RlIHRhcmdldCkgewotCQlzdXBlcihyZXEpOwotCQlzdXBlci5zZXRFbGVtZW50VG9FZGl0KGNvbnRhaW5lcik7Ci0JCW15Q29udGFpbmVyID0gY29udGFpbmVyOwotCQlteVNvdXJjZSA9IHNvdXJjZTsKLQkJbXlUYXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG15Q29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBteVNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbXlUYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQobXlUYXJnZXQpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UobXlTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzZjMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5EZWNpc2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTWVyZ2VOb2RlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHJlb3JpZW50RGlyZWN0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgRU9iamVjdCBvbGRFbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG5ld0VuZDsKLQotCXByaXZhdGUgRWRpdFBhcnQgaG9zdDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdC5nZXRMYWJlbCgpLCByZXF1ZXN0LmdldFJlbGF0aW9uc2hpcCgpLCByZXF1ZXN0KTsKLQkJcmVvcmllbnREaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwotCQlvbGRFbmQgPSByZXF1ZXN0LmdldE9sZFJlbGF0aW9uc2hpcEVuZCgpOwotCQluZXdFbmQgPSByZXF1ZXN0LmdldE5ld1JlbGF0aW9uc2hpcEVuZCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoIShnZXRFbGVtZW50VG9FZGl0KCkgaW5zdGFuY2VvZiBDb250cm9sRmxvdykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiBjYW5SZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFNvdXJjZSgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlICYmIG5ld0VuZCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gZ2V0TGluaygpLmdldFRhcmdldCgpOwotLy8JCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSkgewotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldExpbmsoKQotLy8JCQkJLmVDb250YWluZXIoKTsKLS8vCQlyZXR1cm4gVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0vLwkJCQkuY2FuRXhpc3RDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgZ2V0TmV3U291cmNlKCksIHRhcmdldCk7Ci0JCWlmKCFjYW5Db25uZWN0KChBY3Rpdml0eU5vZGUpbmV3RW5kLCB0YXJnZXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKG5ld0VuZCBpbnN0YW5jZW9mIE1lcmdlTm9kZSB8fCBuZXdFbmQgaW5zdGFuY2VvZiBKb2luTm9kZSkgewotCQkJQWN0aXZpdHlOb2RlIGpvaW4gPSAoQWN0aXZpdHlOb2RlKSBuZXdFbmQ7Ci0JCQlMaXN0PEFjdGl2aXR5RWRnZT4gbGlzdCA9IGpvaW4uZ2V0T3V0Z29pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRUYXJnZXQoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGdldExpbmsoKS5nZXRTb3VyY2UoKTsKLS8vCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRMaW5rKCkKLS8vCQkJCS5lQ29udGFpbmVyKCk7Ci0vLwkJcmV0dXJuIFVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotLy8JCQkJLmNhbkV4aXN0Q29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgZ2V0TmV3VGFyZ2V0KCkpOwotCQkKLQkJaWYoIWNhbkNvbm5lY3Qoc291cmNlLCAoQWN0aXZpdHlOb2RlKW5ld0VuZCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAobmV3RW5kIGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlIHx8IG5ld0VuZCBpbnN0YW5jZW9mIEZvcmtOb2RlKSB7Ci0JCQlBY3Rpdml0eU5vZGUgam9pbiA9IChBY3Rpdml0eU5vZGUpIG5ld0VuZDsKLQkJCUxpc3Q8QWN0aXZpdHlFZGdlPiBsaXN0ID0gam9pbi5nZXRJbmNvbWluZ3MoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPj0gMSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAoIWNhbkV4ZWN1dGUoKSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigKLQkJCQkJIkludmFsaWQgYXJndW1lbnRzIGluIHJlb3JpZW50IGxpbmsgY29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsKLQkJCXJldHVybiByZW9yaWVudFNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7Ci0JCQlyZXR1cm4gcmVvcmllbnRUYXJnZXQoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50U291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWdldExpbmsoKS5zZXRTb3VyY2UoZ2V0TmV3U291cmNlKCkpOwotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRUYXJnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFRhcmdldChnZXROZXdUYXJnZXQoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbEZsb3cgZ2V0TGluaygpIHsKLQkJcmV0dXJuIChDb250cm9sRmxvdykgZ2V0RWxlbWVudFRvRWRpdCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGdldE9sZFNvdXJjZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eU5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBnZXROZXdTb3VyY2UoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlOb2RlKSBuZXdFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgZ2V0T2xkVGFyZ2V0KCkgewotCQlyZXR1cm4gKEFjdGl2aXR5Tm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGdldE5ld1RhcmdldCgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eU5vZGUpIG5ld0VuZDsKLQl9Ci0JCi0JLyoKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KEVkaXRQYXJ0IGhvc3QpewotCQl0aGlzLmhvc3QgPSBob3N0OwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRIb3N0KCl7Ci0JCXJldHVybiB0aGlzLmhvc3Q7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5Db25uZWN0KEFjdGl2aXR5Tm9kZSBzb3VyY2UsIEFjdGl2aXR5Tm9kZSB0YXJnZXQpewotCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYoRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmlzRHVwbGljYXRlUmVsYXRpb25zaGlwKHNvdXJjZSwgdGFyZ2V0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYoZ2V0SG9zdCgpICE9IG51bGwpewotCQkJaWYgKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jYW5Db25uZWN0KChFZGl0UGFydCkgZ2V0SG9zdCgpLCBzb3VyY2UsIAotCQkJCQl0YXJnZXQpICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0RlY2lzaW9uTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0RlY2lzaW9uTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3MjA2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9EZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Gb3JrTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0ZvcmtOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg2MWEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0ZvcmtOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0luaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MzQyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0aWFsTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSm9pbk5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Kb2luTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhYjY5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Kb2luTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpvaW5Ob2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9NZXJnZU5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9NZXJnZU5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOTg4ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lcmdlTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MWYyMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBuZXdFbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHN1cGVyCi0JCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9PSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEKLQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCX0KLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbAotCQkJCSYmIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPT0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwCi0JCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQl9Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwKLQkJCQkmJiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNwotCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1VNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9VTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjY2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1VNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElBZGFwdGFibGUgZWRnZUFkYXB0b3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGVkaXRpbmdEb21haW4sIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVkZ2VBZGFwdG9yLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2VGaWxlcyh2aWV3KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFZGdlQWRhcHRvcigpIHsKLQkJcmV0dXJuIGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGdlQWRhcHRvcihJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yKSB7Ci0JCXRoaXMuZWRnZUFkYXB0b3IgPSBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZUFkYXB0b3IgOiAiTnVsbCBjaGlsZCBpbiBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQkJRWRnZSBlZGdlID0gKEVkZ2UpIGdldEVkZ2VBZGFwdG9yKCkuZ2V0QWRhcHRlcihFZGdlLmNsYXNzKTsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZSA6ICJOdWxsIGVkZ2UgaW4gVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkJVmlldyB0ZW1wVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWVkZ2Uuc2V0U291cmNlKGVkZ2UuZ2V0VGFyZ2V0KCkpOwotCQllZGdlLnNldFRhcmdldCh0ZW1wVmlldyk7Ci0KLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjE1NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMmQ3MjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiYmFjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWUzM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcwotCQlBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTdkYWFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLlBhY2thZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuTW92ZUVsZW1lbnRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJLy8JCXJldHVybiBzdXBlci5nZXRNb3ZlQ29tbWFuZChyZXEpOwotCQlNb3ZlRWxlbWVudHNDb21tYW5kIGNtZCA9IG5ldyBNb3ZlRWxlbWVudHNDb21tYW5kKHJlcSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCS8vcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGdldFRhcmdldENvbnRhaW5lcigpOwotCi0JCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsIHx8IGdldEVsZW1lbnRzVG9Nb3ZlKCkgPT0gbnVsbAotCQkJCQkJfHwgZ2V0RWxlbWVudHNUb01vdmUoKS5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGdldEVsZW1lbnRzVG9Nb3ZlKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGkubmV4dCgpOwotCQkJCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSBnZXRUYXJnZXRGZWF0dXJlKGVsZW1lbnQpOwotCi0JCQkJCWlmIChmZWF0dXJlID09IG51bGwKLQkJCQkJCQl8fCAhY29udGFpbmVyLmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkKLQkJCQkJCQkJCS5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCQkJLy8gSWYgdGhlIHRhcmdldCBmZWF0dXJlIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHRhcmdldCBjb250YWluZXIsCi0JCQkJCQkvLyBkb24ndCBhbGxvdyB0aGUgbW92ZS4KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCS8vIElGIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCBjb250YWluZXIuLi4KLQkJCQkJaWYgKGNvbnRhaW5lci5lcXVhbHMoZWxlbWVudC5lQ29udGFpbmVyKCkpCi0JCQkJCQkJJiYgZmVhdHVyZSA9PSBlbGVtZW50LmVDb250YWlubWVudEZlYXR1cmUoKSkgewotCQkJCQkJLy8gRG9uJ3QgYWxsb3cgdGhlIHJlcGFyZW50aW5nCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQkvLyBJRiB0aGUgZWxlbWVudCBpcyB0aGUgcGFyZW50IG9mIHRoZSB0YXJnZXQgY29udGFpbmVyLi4uCi0JCQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3RvcihlbGVtZW50LCBnZXRUYXJnZXRDb250YWluZXIoKSkpIHsKLQkJCQkJCS8vIERvbid0IGFsbG93IHRoZSByZXBhcmVudGluZwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJLy8gSUYgdGhlIGNvbnRhaW5lciBjYW4gbm90IGNvbnRhaW4gdGhlIGVsZW1lbnQuLi4KLQkJCQkJLy8JCQkJCWlmICghUGFja2FnZVV0aWwuY2FuQ29udGFpbihnZXRUYXJnZXRDb250YWluZXIoKS5lQ2xhc3MoKSwKLQkJCQkJLy8JCQkJCQkJZmVhdHVyZSwgZWxlbWVudC5lQ2xhc3MoKSwgZmFsc2UpKSB7Ci0JCQkJCS8vCQkJCQkJLy8gRG9uJ3QgYWxsb3cgdGhlIHJlcGFyZW50aW5nCi0JCQkJCS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkvLwkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX07Ci0JCXJldHVybiBjbWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFlYjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQ29udHJvbEZsb3dFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzNkYzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0VkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9EZWNpc2lvbk5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0RlY2lzaW9uTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjYzMzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0RlY2lzaW9uTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvRm9ya05vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0ZvcmtOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTUyNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvRm9ya05vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0luaXRpYWxOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRjOTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSm9pbk5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0pvaW5Ob2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2U3NWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSm9pbk5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvTWVyZ2VOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9NZXJnZU5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjhhMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9NZXJnZU5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1OGNhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlckFkdmljZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcwotCQlBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2NTEyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTJhMDk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcwotCQlBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5NjA4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1VNTEJhc2VFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEJhc2VFZGl0SGVscGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0SGVscGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1BPTElDWV9DT01NQU5EID0gImVkaXQgcG9saWN5IGNvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldEluc3RlYWRDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7Ci0JCUlDb21tYW5kIGVwQ29tbWFuZCA9IChJQ29tbWFuZCkgcmVxLmdldFBhcmFtZXRlcihFRElUX1BPTElDWV9DT01NQU5EKTsKLQkJcmVxLnNldFBhcmFtZXRlcihFRElUX1BPTElDWV9DT01NQU5ELCBudWxsKTsKLQkJSUNvbW1hbmQgZWhDb21tYW5kID0gc3VwZXIuZ2V0SW5zdGVhZENvbW1hbmQocmVxKTsKLQkJaWYgKGVwQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCWlmIChlaENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVwQ29tbWFuZDsKLQkJfQotCQlDb21wb3NpdGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChudWxsKTsKLQkJY29tbWFuZC5hZGQoZXBDb21tYW5kKTsKLQkJY29tbWFuZC5hZGQoZWhDb21tYW5kKTsKLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2QwMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuQWN0aXZpdHlDcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkFjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlFZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfSUQgPSAiQUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0KLQkJLy8JCSBtb2RpZmllZCBTVEFSVAotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5Q3JlYXRpb25FZGl0UG9saWN5KCkpOwotCQkvLyBtb2RpZmllZCBFTkQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5WSUVXX19WSVNJQkxFLmVxdWFscyhldmVudC5nZXRGZWF0dXJlKCkpKSB7Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSBldmVudC5nZXROb3RpZmllcigpOwotCQkJaWYgKG5vdGlmaWVyID09IGdldE1vZGVsKCkpCi0JCQkJcmVmcmVzaFZpc2liaWxpdHkoKTsKLQkJCWVsc2UgaWYgKGV2ZW50LmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0JCQkJRGlhZ3JhbUVkaXRvclV0aWwucmVmcmVzaENvbm5lY3Rpb25FZGl0UGFydHModGhpcyk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEdNRiBhbmQgR0VGIGlzIG5vdCBoYW5kbGluZyBjb25uZWN0aW9ucyB2aXNpYmlsaXR5IHByb3Blcmx5LiAKLQkgKiBUaGlzIGlzIHdvcmstYXJvdW5kIHNvbHV0aW9uIHRvIGhhbmRsZSBjb25uZWN0aW9ucyB2aXNpYmlsaXR5LiAgCi0JICogVmlzaWJpbGl0eSBvZiBlZGdlcyBuZWVkIHRvIHNldCBmaXJzdCBhbmQgdGhlbiBub2Rlcy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hDb25uZWN0aW9ucygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlEaWFncmFtIGFjdCA9IChEaWFncmFtKSBnZXRNb2RlbCgpOwotCQlMaXN0IGVkZ2VzID0gYWN0LmdldEVkZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVkZ2UuaXNWaXNpYmxlKCkpIHsKLQkJCQlDb25uZWN0aW9uRWRpdFBhcnQgcGFydCA9IGNyZWF0ZU9yRmluZENvbm5lY3Rpb24oZWRnZSk7Ci0JCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQlpZiAocGFydC5nZXRTb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIxLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgbW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKCk7Ci0JCQkJCQkJaWYgKGVkZ2UuZ2V0U291cmNlKCkgPT0gbW9kZWwpIHsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCQkJCQkJaWYgKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5pc1Zpc2libGUoKSkgewotCQkJCQkJCQkJCXBhcnQuc2V0U291cmNlKGVsZW1lbnQpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlwYXJ0LnNldFNvdXJjZShudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocGFydC5nZXRUYXJnZXQoKSA9PSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIxLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgbW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKCk7Ci0JCQkJCQkJaWYgKGVkZ2UuZ2V0VGFyZ2V0KCkgPT0gbW9kZWwpIHsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCQkJCQkJaWYgKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5pc1Zpc2libGUoKSkgewotCQkJCQkJCQkJCXBhcnQuc2V0VGFyZ2V0KGVsZW1lbnQpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlwYXJ0LnNldFRhcmdldChudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0IHBhcnQgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0KSBjcmVhdGVPckZpbmRDb25uZWN0aW9uKGVkZ2UpOwotCQkJCWlmICgocGFydC5nZXRTb3VyY2UoKSA9PSBudWxsIHx8IHBhcnQuZ2V0VGFyZ2V0KCkgPT0gbnVsbCkKLQkJCQkJCSYmIHBhcnQuZ2V0RmlndXJlKCkgIT0gbnVsbCkgewotCQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnJldmFsaWRhdGUoKTsKLQkJCQkJcGFydC5kZWFjdGl2YXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBvY2N1cmVkIHdoaWxlIHJlZnJlc2ggdGhlIGNvbm5lY3Rpb246ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE1vdmVzIGNvbXBsZXRlIGRpYWdyYW0gY2hpbGRyZW4gdG8gZ2l2ZW4gZGVsdGEuIAotCSAqIEBwYXJhbSBpbnQgIChYLWF4aXMgZGVsdGEpCi0JICogQHBhcmFtIGludCAgKFktYXhpcyBkZWx0YSkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlRmlndXJlKGludCBtb3ZlWCwgaW50IG1vdmVZKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZDsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUobmV3IFBvaW50KGJvdW5kcy54ICsgbW92ZVgsCi0JCQkJCQlib3VuZHMueSArIG1vdmVZKSwgYm91bmRzLmdldFNpemUoKSk7Ci0KLQkJCQkvLyBhbHNvIG5lZWQgdG8gbW92ZSB0aGUgYmVuZCBwb2ludHMKLS8vCQkJCUxpc3QgbGlzdCA9IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJQ29udHJvbEZsb3dFZGl0UGFydCBsaW5rcGFydCA9IChDb250cm9sRmxvd0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLS8vCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLS8vCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpID4gMCkgewotLy8JCQkJCQlQb2ludExpc3QgcGxpc3QgPSAoKFBvbHlsaW5lQ29ubmVjdGlvbikgbGlua3BhcnQKLS8vCQkJCQkJCQkuZ2V0RmlndXJlKCkpLmdldFBvaW50cygpOwotLy8JCQkJCQlMaXN0IHBvaW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwbGlzdC5zaXplKCkgLSAxOyBpKyspIHsKLS8vCQkJCQkJCVBvaW50IHAgPSBwbGlzdC5nZXRQb2ludChpKTsKLS8vCQkJCQkJCXAgPSBwLnRyYW5zbGF0ZShuZXcgUG9pbnQobW92ZVgsIG1vdmVZKSk7Ci0vLwotLy8JCQkJCQkJb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IGJwID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCgKLS8vCQkJCQkJCQkJcCk7Ci0vLwkJCQkJCQlwb2ludHMuYWRkKGJwKTsKLS8vCQkJCQkJfQotLy8KLS8vCQkJCQkJbGlua3BhcnQuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldFJvdXRpbmdDb25zdHJhaW50KAotLy8JCQkJCQkJCXBvaW50cyk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCi0JCQkJdGhpcy5zZXRMYXlvdXRDb25zdHJhaW50KHBhcnQsIHBhcnQuZ2V0RmlndXJlKCksIHIpOwotCi0JCQl9IGVsc2UgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGFydCBub3QgbW92ZWQ6ICIgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTgxMGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlFbmROb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBFbmROb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbmROb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChFbmROb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLAotCQkJSUJvcmRlckl0ZW1FZGl0UGFydCBib3JkZXJJdGVtRWRpdFBhcnQpIHsKLQkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwKLQkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsKLQkJCWJvcmRlckl0ZW1Db250YWluZXIuYWRkKGJvcmRlckl0ZW1FZGl0UGFydC5nZXRGaWd1cmUoKSwgbG9jYXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDI0KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5FbmROb2RlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRW5kTm9kZUZpZ3VyZSgpIHsKLQotCQkJTGluZVN0eWxlIGxpbmVzdHlsZSA9IChMaW5lU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5MSU5FX1NUWUxFKTsKLQkJCWlmIChsaW5lc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5MSU5FX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcwotCQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOwotCQkJfQotCi0JCQlGaWxsU3R5bGUgc3R5bGUgPSAoRmlsbFN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMTF9TVFlMRSk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBzdHlsZS5nZXRGaWxsQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkZJTExfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEVORE5PREVGSUdVUkVfQkFDSwotCi0JCQkJKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJMjQpKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOwotCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBFTkROT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzNjc3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsCi0JCQkJMCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgewotCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgKLQkJCQkJZ2V0RmlndXJlKCkpOwotCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0JCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkKLQkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgV3JhcExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogVE9ETzogRGlzYWJsZXMgZGlyZWN0IGVkaXQgZm9yIG5vdyB1bnRpbCB0aGUgaXNzdWUgd2l0aCBkdXBsaWNhdGUgbGFiZWxzIGlzIGZpeGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCAhPSByZXF1ZXN0LmdldFR5cGUoKSkgewotICAgICAgICAJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MmNjZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuV2lkZW5lZFdyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDEyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQpIHsKLQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpCi0JCQkJCQkJLmdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRPcGFxdWUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCQkJc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsKLQkJCXJldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoV3JhcExhYmVsIGZpZykgewotCQkJZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQlpZiAoaXNPcGFxdWUoKSkKLQkJCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBlNmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkKLQkJCQkJCQkuZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzdjZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAxMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlJbWFnZSBpbWFnZSA9ICBEaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEljb24ocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpLCBmYWxzZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKCJkaWFncmFtL21pbGVzdG9uZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbWFnZTsJCQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwKLQkJCQkJVU1MRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjExNTczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2UgaW1hZ2UgPSAgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSwgZmFsc2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgiZGlhZ3JhbS90YXNrZGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbWFnZTsJCQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwKLQkJCQkJVU1MRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKQotCQkJCQkJCS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLnZhbGlkU3RyaW5nRm9yQnJlYWtkb3duRWxlbWVudHMoCi0JCQkJCQkJZ2V0RWRpdFBhcnQoKSwgdHh0KTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk5YWE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVTaGFwZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlYWUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IFhZTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBzdXBlci5jcmVhdGVDaGlsZEVkaXRQb2xpY3koY2hpbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbmV3IFJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGZpZ3VyZSA9IG5ldyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihuZXcgRnJlZWZvcm1MYXlvdXQoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnQoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNvbnN0cmFpbnRzLmdldChmaWd1cmUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsKLQotCQkJWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IFhZTGF5b3V0KCk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjawotCi0JCQkpOwotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJCS5EUHRvTFAoNjAwKSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOwotCQkJdGhpcy5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoKSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCVdyYXBMYWJlbCBmaWdfMCA9IG5ldyBXcmFwTGFiZWwoKTsKLQotCQkJc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsKLQkJCXJldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZQYXJ0aXRpb25MYWJlbEZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsCi0JCQkyNTUsIDI1NSwgMjU1KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZjYzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MaW5lU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwODsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCS8vCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCS8vCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJLy8JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJLy8JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJLy8JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCS8vCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCS8vCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCS8vCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJcmVtb3ZlRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3koCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlYWUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IFhZTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBzdXBlci5jcmVhdGVDaGlsZEVkaXRQb2xpY3koY2hpbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbmV3IFJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGZpZ3VyZSA9IG5ldyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCkgewotCQkJKChBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKS5nZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Q29uc3RyYWludChJRmlndXJlIGZpZ3VyZSkgewotCQkJCQlPYmplY3QgcmVzdWx0ID0gY29uc3RyYWludHMuZ2V0KGZpZ3VyZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgLTEpOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCkgewotCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCgpOwotCi0JCQl0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsKLQotCQkJTGluZVN0eWxlIGxpbmVzdHlsZSA9IChMaW5lU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5MSU5FX1NUWUxFKTsKLQkJCWlmIChsaW5lc3R5bGUgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMKLQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJCX0KLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJCS5EUHRvTFAoNjAwKSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOwotCQkJdGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyKCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlXcmFwTGFiZWwgZmlnXzAgPSBuZXcgV3JhcExhYmVsKCk7Ci0KLQkJCXNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsCi0JCQkyNTUsIDI1NSwgMjU1KTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1NTI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQlpZiAocGFyc2VyRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLmdldEltYWdlKHBhcnNlckVsZW1lbnQuZUNsYXNzKCkpOwotCQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCXJlZnJlc2hCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfQotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdhNjM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCWlmIChwYXJzZXJFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2UocGFyc2VyRWxlbWVudC5lQ2xhc3MoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0JCURpbWVuc2lvbiBzaXplID0gbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLQkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCVBvaW50IGxvYyA9IG5ldyBQb2ludCh4LCB5KTsKLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgbmV3IFJlY3RhbmdsZShsb2MsIHNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY4ZmQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCBleHRlbmRzCi0JCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7Ci0JCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0JCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwKLQkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLy9wdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JLy8JSUZpZ3VyZSByZXN1bHQgPSBzdXBlci5jcmVhdGVGaWd1cmUoKTsKLQkvLwlyZXN1bHQuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKCkpOwotCS8vCXJldHVybiByZXN1bHQ7Ci0JLy99Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsKLQkJLy8gbm90aGluZyB0byBkbyAtLSBwYXJlbnQgbGF5b3V0IGRvZXMgbm90IGFjY2VwdCBEb3VibGUgY29uc3RyYWludHMgYXMgcmF0aW8KLQkJLy8gc3VwZXIuc2V0UmF0aW8ocmF0aW8pOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjhkZTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Db250YWluZXJOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydCBleHRlbmRzCi0JCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsKLQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcgotCQkJCS5jcmVhdGVGaWd1cmUoKTsKLQkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwKLQkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IENvbnRhaW5lck5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBuZXcgWFlMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvL3B1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkvLwlJRmlndXJlIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUZpZ3VyZSgpOwotCS8vCXJlc3VsdC5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoKSk7Ci0JLy8JcmV0dXJuIHJlc3VsdDsKLQkvL30KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgewotCQkvLyBub3RoaW5nIHRvIGRvIC0tIHBhcmVudCBsYXlvdXQgZG9lcyBub3QgYWNjZXB0IERvdWJsZSBjb25zdHJhaW50cyBhcyByYXRpbwotCQkvLyBzdXBlci5zZXRSYXRpbyhyYXRpbyk7IAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0NvbnRyb2xGbG93RWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0NvbnRyb2xGbG93RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjMWViYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Db250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dFZGl0UGFydCBleHRlbmRzIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRyb2xGbG93RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBDb250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpIHsKLQotCQlyZXR1cm4gbmV3IENvbnRyb2xGbG93RmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0ZpZ3VyZSBleHRlbmRzIFBvbHlsaW5lQ29ubmVjdGlvbkV4IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENvbnRyb2xGbG93RmlndXJlKCkgewotCi0JCQlzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBQb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsKLQkJCVBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBQb2x5bGluZURlY29yYXRpb24oKTsKLQkJCS8vIGRpc3BhdGNoTmV4dD8KLQotCQkJUG9pbnRMaXN0IHBsID0gbmV3IFBvaW50TGlzdCgpOwotCQkJcGwuYWRkUG9pbnQoLTEsIDEpOwotCQkJcGwuYWRkUG9pbnQoMCwgMCk7Ci0JCQlwbC5hZGRQb2ludCgtMSwgLTEpOwotCQkJZGYuc2V0VGVtcGxhdGUocGwpOwotCQkJZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7Ci0KLQkJCXJldHVybiBkZjsKLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcmVncm91bmRDb2xvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5yZWZyZXNoRm9yZWdyb3VuZENvbG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCWlmIChEaWFncmFtQ29yZVZhbGlkYXRpb24uY2hlY2tEZWxldGUoKEVkZ2UpIGdldE1vZGVsKCkpICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzYWJsZUVkaXRNb2RlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3Igb3ZlcnJpZGVDb2xvciA9IERpYWdyYW1Db3JlVXRpbC5nZXRMaW5rT3ZlcnJpZGVDb2xvcigoRWRnZSkgZ2V0TW9kZWwoKSk7Ci0JCXN1cGVyLnNldEZvcmVncm91bmRDb2xvcihvdmVycmlkZUNvbG9yICE9IG51bGwgPyBvdmVycmlkZUNvbG9yIDogY29sb3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0NvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd05hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQwOTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0NvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd05hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250cm9sRmxvd05hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2V5UG9pbnQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uTG9jYXRvci5NSURETEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCS8vCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCS8vCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKGdldFBhcnNlckVsZW1lbnQoKSk7Ci0JCS8vCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCS8vCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCS8vCQl9Ci0JCS8vCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2xGbG93TGFiZWxGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIENvbnRyb2xGbG93TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRUZXh0KCIiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjk5ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5EZWNpc2lvbk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5EZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5EZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA1OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IERlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCURlY2lzaW9uRGlhbW9uZEZpZ3VyZSBmaWd1cmUgPSBuZXcgRGVjaXNpb25EaWFtb25kRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKERlY2lzaW9uRGlhbW9uZEZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIERlY2lzaW9uTm9kZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpIHsKLQotCQkJc3VwZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLAotCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7IC8vbW9kaWZpZWQKLQkJCUxpbmVTdHlsZSBsaW5lc3R5bGUgPSAoTGluZVN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCQlpZiAobGluZXN0eWxlICE9IG51bGwKLQkJCQkJJiYgbGluZXN0eWxlLmdldExpbmVDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuTElORV9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMKLQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsKLQkJCX0KLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoCi0JCQkJCTUwKSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsKLQotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlXcmFwTGFiZWwgZmlnXzAgPSBuZXcgV3JhcExhYmVsKCk7Ci0KLQkJCXNldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVEaWFtb25kTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkRpYW1vbmRMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZEaWFtb25kTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgMTg1LAotCQkJMjA1LCAyMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmYxZjk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IE5vZGVOYW1lRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIFdyYXBMYWJlbCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRUZXh0KCIiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRm9ya05vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRm9ya05vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTgzZWE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0ZvcmtOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5EeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGb3JrTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBGb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlGb3JrTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgRm9ya05vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcmtOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChGb3JrTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQb2xpY3kgZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkgewotLy8JCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCk7Ci0vLwkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlc2l6YWJsZUVkaXRQb2xpY3kpIHsKLS8vCQkJUmVzaXphYmxlRWRpdFBvbGljeSBlcCA9IChSZXNpemFibGVFZGl0UG9saWN5KSByZXN1bHQ7Ci0vLwkJCWVwLnNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuV0VTVAotLy8JCQkJCXwgUG9zaXRpb25Db25zdGFudHMuRUFTVCk7Ci0vLwkJfQotLy8JCXJldHVybiByZXN1bHQ7Ci0JCQotCQlEeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3kgcmVzdWx0ID0gbmV3IER5bmFtaWNSZXNpemVEaXJlY3Rpb25zRWRpdFBvbGljeSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsKLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoCi0JCQkJCQluZXcgSW50ZWdlcihzdHlsZS5nZXRGaWxsQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkJLkRQdG9MUCg4KSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEZPUktOT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0luaXRpYWxOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0luaXRpYWxOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMmJhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Jbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkxheWVyTWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7Ci0JCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJSW5pdGlhbE5vZGVGaWd1cmUgZmlndXJlID0gbmV3IEluaXRpYWxOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0aWFsTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoSW5pdGlhbE5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQm9yZGVySXRlbShJRmlndXJlIGJvcmRlckl0ZW1Db250YWluZXIsCi0JCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgewotCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLAotCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0JCQlsb2NhdG9yLnNldEJvcmRlckl0ZW1PZmZzZXQobmV3IERpbWVuc2lvbigtMjAsIC0yMCkpOwotCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZEJvcmRlckl0ZW0oYm9yZGVySXRlbUNvbnRhaW5lciwgYm9yZGVySXRlbUVkaXRQYXJ0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoMjApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUZpZ3VyZSBleHRlbmRzIEVsbGlwc2UgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBJbml0aWFsTm9kZUZpZ3VyZSgpIHsKLQotCQkJTGluZVN0eWxlIGxpbmVzdHlsZSA9IChMaW5lU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5MSU5FX1NUWUxFKTsKLQkJCWlmIChsaW5lc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5MSU5FX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcwotCQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOwotCQkJfQotCi0JCQlGaWxsU3R5bGUgc3R5bGUgPSAoRmlsbFN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMTF9TVFlMRSk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBzdHlsZS5nZXRGaWxsQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkZJTExfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKElOSVRJQUxOT0RFRklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKAotCQkJCQkyMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBJTklUSUFMTk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDQ1LCA4NSwKLQkJCTEzMCk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0QmFja2dyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEZvcmVncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKS5pc0luc3RhbmNlKAotCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkKLQkJCXJlZnJlc2hGb250KCk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRWaWV3X0VsZW1lbnQoKQotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IGdldE5vdGF0aW9uVmlldygpKQotCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOwotCQllbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0luaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQ0NjdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0luaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHsKLQkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLCBuZXcgUG9pbnQoMCwgMCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgewotCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgKLQkJCQkJZ2V0RmlndXJlKCkpOwotCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0JCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkKLQkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgV3JhcExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogVE9ETzogRGlzYWJsZXMgZGlyZWN0IGVkaXQgZm9yIG5vdyB1bnRpbCB0aGUgaXNzdWUgd2l0aCBkdXBsaWNhdGUgbGFiZWxzIGlzIGZpeGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCAhPSByZXF1ZXN0LmdldFR5cGUoKSkgewotICAgICAgICAJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Kb2luTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Kb2luTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTk0YmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSm9pbk5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkR5bmFtaWNSZXNpemVEaXJlY3Rpb25zRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkpvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpvaW5Ob2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEpvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRm9ya05vZGVGaWd1cmUgZmlndXJlID0gbmV3IEZvcmtOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRm9ya05vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg1KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UG9saWN5IGdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpIHsKLS8vCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpOwotLy8JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZXNpemFibGVFZGl0UG9saWN5KSB7Ci0vLwkJCVJlc2l6YWJsZUVkaXRQb2xpY3kgZXAgPSAoUmVzaXphYmxlRWRpdFBvbGljeSkgcmVzdWx0OwotLy8JCQllcC5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLldFU1QKLS8vCQkJCQl8IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpOwotLy8JCX0KLS8vCQlyZXR1cm4gcmVzdWx0OwotCQkKLQkJcmV0dXJuIG5ldyBEeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3koKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsCi0JCQkJCSYmIHN0eWxlLmdldEZpbGxDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuRklMTF9DT0xPUl9FREVGQVVMVCkgewotCQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKAotCQkJCQkJbmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJCS5EUHRvTFAoOCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9NZXJnZU5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyOWEwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9NZXJnZU5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLk1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5NZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLk1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MaW5lU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXJnZU5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRGVjaXNpb25EaWFtb25kRmlndXJlIGZpZ3VyZSA9IG5ldyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRGVjaXNpb25EaWFtb25kRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgRGVjaXNpb25Ob2RlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgewotCi0JCQlzdXBlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksCi0JCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsgLy9tb2RpZmllZAotCQkJTGluZVN0eWxlIGxpbmVzdHlsZSA9IChMaW5lU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5MSU5FX1NUWUxFKTsKLQkJCWlmIChsaW5lc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5MSU5FX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcwotCQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOwotCQkJfQotCi0JCQlGaWxsU3R5bGUgc3R5bGUgPSAoRmlsbFN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMTF9TVFlMRSk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBzdHlsZS5nZXRGaWxsQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkZJTExfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJNTApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOwotCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCVdyYXBMYWJlbCBmaWdfMCA9IG5ldyBXcmFwTGFiZWwoKTsKLQotCQkJc2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmRGlhbW9uZExhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsKLQkJCXJldHVybiBmRGlhbW9uZExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVEaWFtb25kTGFiZWwoV3JhcExhYmVsIGZpZykgewotCQkJZkRpYW1vbmRMYWJlbCA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLCAxODUsCi0JCQkyMDUsIDIzMCk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0QmFja2dyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEZvcmVncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKS5pc0luc3RhbmNlKAotCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkKLQkJCXJlZnJlc2hGb250KCk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRWaWV3X0VsZW1lbnQoKQotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IGdldE5vdGF0aW9uVmlldygpKQotCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOwotCQllbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL01lcmdlTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NmU5ZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDI7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgTm9kZU5hbWVGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vZGVOYW1lRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIiIpOwkvLyROT04tTkxTLTEkCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjZDQyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuT3BlbkFERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMTA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTmV3X1BoYXNlKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTYzNTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5PcGVuQURFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuV2lkZW5lZFdyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAxMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQpIHsKLQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKS5nZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRPcGFxdWUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9OZXdfSXRlcmF0aW9uKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0KLQkJCXNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZk5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2EzMzBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLk9wZW5BREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRPcGFxdWUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9OZXdfQWN0aXZpdHkpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZk5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzNzEzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLk9wZW5BREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2UgaW1hZ2UgPSAgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSwgZmFsc2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgiZGlhZ3JhbS9waGFzZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbWFnZTsJCQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTA7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKQotCQkJCQkJCS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLnZhbGlkU3RyaW5nRm9yQnJlYWtkb3duRWxlbWVudHMoCi0JCQkJCQkJZ2V0RWRpdFBhcnQoKSwgdHh0KTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjUwNTM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuT3BlbkFERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLCBuZXcgT3BlbkFERWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlJbWFnZSBpbWFnZSA9ICBEaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEljb24ocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpLCBmYWxzZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKCJkaWFncmFtL2l0ZXJhdGlvbi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbWFnZTsJCQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKQotCQkJCQkJCS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLnZhbGlkU3RyaW5nRm9yQnJlYWtkb3duRWxlbWVudHMoCi0JCQkJCQkJZ2V0RWRpdFBhcnQoKSwgdHh0KTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2NjIyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5PcGVuQURFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA1OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLCBuZXcgT3BlbkFERWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlJbWFnZSBpbWFnZSA9ICBEaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEljb24ocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpLCBmYWxzZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKCJkaWFncmFtL2FjdGl2aXR5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGltYWdlOwkJCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZiAoRGlhZ3JhbUNvcmVVdGlsLmlzUmVhZE9ubHkodGhpcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNzsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwKLQkJCQkJVU1MRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQkKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9VTUxFZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1OTk2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9VTUxFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBtb2RlbDsKLQkJCXN3aXRjaCAoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSkgewotCi0JCQljYXNlIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTWVyZ2VOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IE1lcmdlTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEZvcmtOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBJbml0aWFsTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBKb2luTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xGbG93RWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KGNvbnRleHQsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJLy8gSGFuZGxlIGNyZWF0aW9uIG9mIHVucmVjb2duaXplZCBjaGlsZCBub2RlIEVkaXRQYXJ0cyBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENlbGxFZGl0b3JMb2NhdG9yIGdldFRleHRDZWxsRWRpdG9yTG9jYXRvcigKLQkJCUlUZXh0QXdhcmVFZGl0UGFydCBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZS5nZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkKLQkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3JMb2NhdG9yKChXcmFwTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKChMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIHdyYXBMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRleHRDZWxsRWRpdG9yTG9jYXRvcihXcmFwTGFiZWwgd3JhcExhYmVsKSB7Ci0JCQl0aGlzLndyYXBMYWJlbCA9IHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldFdyYXBMYWJlbCgpIHsKLQkJCXJldHVybiB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldFdyYXBMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRXcmFwTGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaWYgKGdldFdyYXBMYWJlbCgpLmlzVGV4dFdyYXBwZWQoKQotCQkJCQkmJiBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShyZWN0LndpZHRoLAotCQkJCQkJU1dULkRFRkFVTFQpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQl9Ci0JCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7Ci0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKSB7Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9VTUxFeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyYzU5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9VTUxFeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5MYWJlbExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlJRmlndXJlIHJlZkZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgb2Zmc2V0ID0gbmV3IFBvaW50KGR4LCBkeSk7Ci0JCWdldEZpZ3VyZSgpLmdldFBhcmVudCgpLnNldENvbnN0cmFpbnQoZ2V0RmlndXJlKCksCi0JCQkJbmV3IExhYmVsTG9jYXRvcihyZWZGaWd1cmUsIG9mZnNldCwgZ2V0S2V5UG9pbnQoKSkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJlbG9jYXRlKElGaWd1cmUgdGFyZ2V0KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGdldFJlZmVyZW5jZVBvaW50KCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkJZ2V0T2Zmc2V0KCkpOwotCQkJCQkJbG9jYXRpb24udHJhbnNsYXRlKC10YXJnZXQuZ2V0Qm91bmRzKCkud2lkdGggLyAyLCAwKTsKLQkJCQkJCXRhcmdldC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCQl0YXJnZXQuc2V0U2l6ZShuZXcgRGltZW5zaW9uKAotCQkJCQkJCQl0YXJnZXQuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoLCB0YXJnZXQKLQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQkJCQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24ocGFyZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRMYWJlbExvY2F0aW9uKElGaWd1cmUgcGFyZW50KSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiNDNjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0U2VtYW50aWNIb3N0KCkgewotCQlyZXR1cm4gaG9zdCgpLmdldE1vZGVsKCkgIT0gbnVsbCA/IHN1cGVyLmdldFNlbWFudGljSG9zdCgpIDogbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE9uQWN0aXZhdGUoKSB7CQkKLQkJc3VwZXIucmVmcmVzaE9uQWN0aXZhdGUoKTsKLQkJCi0JCUVkaXRQYXJ0IGVwID0gZ2V0SG9zdCgpOwotCQlpZihlcCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkgewotCQkJRGlhZ3JhbUVkaXRvclV0aWwuaW5pdGlhbGl6ZU9uQWN0aXZhdGUoKERpYWdyYW1FZGl0UGFydCkgZXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eSkgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgdmFsdWVzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJLy8gbW9kaWZpZWQgU1RBUlQKLQkJCS8vIFRvIGF2b2lkIHRoZSBBY3Rpdml0eU5vZGUgc2hvdyBpbiBkdXBsaWNhdGUgcGxhY2VzCi0JCQlpZiAobmV4dFZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJaWYgKCEoKEFjdGl2aXR5Tm9kZSkgbmV4dFZhbHVlKS5nZXRJblBhcnRpdGlvbnMoKS5pc0VtcHR5KCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gbW9kaWZpZWQgRU5ECi0JCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsIG5leHRWYWx1ZSk7Ci0JCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoQWN0aXZpdHkpIG1vZGVsT2JqZWN0KS5nZXRHcm91cHMoKS5pdGVyYXRvcigpOyB2YWx1ZXMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsIG5leHRWYWx1ZSk7Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZJRCkgewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCWlmICh2aWV3IGluc3RhbmNlb2YgRWRnZSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRnZSkgewotCQkJCWlmICgoKEFjdGl2aXR5RWRnZSkgZWxlbWVudCkuZ2V0U291cmNlKCkgPT0gbnVsbAotCQkJCQkJfHwgKChBY3Rpdml0eUVkZ2UpIGVsZW1lbnQpLmdldFRhcmdldCgpID09IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8ICh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQgJiYgQnJpZGdlSGVscGVyCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCkgdmlldy5nZXRFbGVtZW50KCkpICE9IG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ29ubmVjdGlvbnNMaXN0KCkgewotCQkvLwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KGFjdC5nZXRFZGdlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2VFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBBY3Rpdml0eUVkZ2UpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5RWRnZSkgcmVsYXRpb25zaGlwKS5nZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRUYXJnZXRFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBBY3Rpdml0eUVkZ2UpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5RWRnZSkgcmVsYXRpb25zaGlwKS5nZXRUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlQ29ubmVjdGlvbihFZGdlIGNvbm5lY3RvciwKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJcmV0dXJuIHN1cGVyLnNob3VsZEluY2x1ZGVDb25uZWN0aW9uKGNvbm5lY3RvciwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7Ci0JCUxpc3QgY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJY3JlYXRlZFZpZXdzLmFkZEFsbChyZWZyZXNoU2VtYW50aWNDaGlsZHJlbigpKTsKLQkJTGlzdCBjcmVhdGVkQ29ubmVjdGlvblZpZXdzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJY3JlYXRlZENvbm5lY3Rpb25WaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ29ubmVjdGlvbnMoKSk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hDb25uZWN0aW9ucygpKTsKLQotCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsKLQkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcgotCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpCi0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsKLQkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOwotCQl9Ci0KLQkJY3JlYXRlZFZpZXdzLmFkZEFsbChjcmVhdGVkQ29ubmVjdGlvblZpZXdzKTsKLQkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBteUxpbmtEZXNjcmlwdG9ycyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNYXAgbXlFT2JqZWN0MlZpZXdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiByZWZyZXNoQ29ubmVjdGlvbnMoKSB7Ci0JCXRyeSB7Ci0JCQljb2xsZWN0QWxsTGlua3MoZ2V0RGlhZ3JhbSgpKTsKLQkJCUNvbGxlY3Rpb24gZXhpc3RpbmdMaW5rcyA9IG5ldyBMaW5rZWRMaXN0KGdldERpYWdyYW0oKS5nZXRFZGdlcygpKTsKLQkJCWZvciAoSXRlcmF0b3IgZGlhZ3JhbUxpbmtzID0gZXhpc3RpbmdMaW5rcy5pdGVyYXRvcigpOyBkaWFncmFtTGlua3MKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIG5leHREaWFncmFtTGluayA9IChFZGdlKSBkaWFncmFtTGlua3MubmV4dCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtPYmplY3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtTcmMgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0U291cmNlKCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua0RzdCA9IG5leHREaWFncmFtTGluay5nZXRUYXJnZXQoKQotCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQlpbnQgZGlhZ3JhbUxpbmtWaXN1YWxJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRChuZXh0RGlhZ3JhbUxpbmspOwotCQkJCWZvciAoSXRlcmF0b3IgbW9kZWxMaW5rRGVzY3JpcHRvcnMgPSBteUxpbmtEZXNjcmlwdG9ycwotCQkJCQkJLml0ZXJhdG9yKCk7IG1vZGVsTGlua0Rlc2NyaXB0b3JzLmhhc05leHQoKTspIHsKLQkJCQkJTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yID0gKExpbmtEZXNjcmlwdG9yKSBtb2RlbExpbmtEZXNjcmlwdG9ycwotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCWlmIChkaWFncmFtTGlua09iamVjdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkuZ2V0TGlua0VsZW1lbnQoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rU3JjID09IG5leHRMaW5rRGVzY3JpcHRvci5nZXRTb3VyY2UoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rRHN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldERlc3RpbmF0aW9uKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1Zpc3VhbElEID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldFZpc3VhbElEKCkpIHsKLQkJCQkJCWRpYWdyYW1MaW5rcy5yZW1vdmUoKTsKLQkJCQkJCW1vZGVsTGlua0Rlc2NyaXB0b3JzLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGVsZXRlVmlld3MoZXhpc3RpbmdMaW5rcy5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBjcmVhdGVDb25uZWN0aW9ucyhteUxpbmtEZXNjcmlwdG9ycyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlteUxpbmtEZXNjcmlwdG9ycy5jbGVhcigpOwotCQkJbXlFT2JqZWN0MlZpZXdNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdEFsbExpbmtzKFZpZXcgdmlldykgewotCQlFT2JqZWN0IG1vZGVsRWxlbWVudCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQlpbnQgZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAoZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCkgewotCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCW15RU9iamVjdDJWaWV3TWFwLnB1dChtb2RlbEVsZW1lbnQsIHZpZXcpOwotCQkJc3RvcmVMaW5rcyhtb2RlbEVsZW1lbnQsIGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJZGVmYXVsdDogewotCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGNoaWxkcmVuID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNoaWxkcmVuCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGRyZW4ubmV4dCgpOwotCQkJCWNvbGxlY3RBbGxMaW5rcyhjaGlsZFZpZXcpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBjcmVhdGVDb25uZWN0aW9ucyhDb2xsZWN0aW9uIGxpbmtEZXNjcmlwdG9ycykgewotCQlpZiAobGlua0Rlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJTGlzdCBhZGFwdGVycyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IgPSBsaW5rRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJZmluYWwgTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yID0gKExpbmtEZXNjcmlwdG9yKSBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvcgotCQkJCQkubmV4dCgpOwotCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSBnZXRFZGl0UGFydEZvcihuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJLmdldFNvdXJjZSgpKTsKLQkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXREZXN0aW5hdGlvbigpKTsKLQkJCWlmIChzb3VyY2VFZGl0UGFydCA9PSBudWxsIHx8IHRhcmdldEVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdC5Db25uZWN0aW9uVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yKAotCQkJCQluZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U2VtYW50aWNBZGFwdGVyKCksIG51bGwsCi0JCQkJCVZpZXdVdGlsLkFQUEVORCwgZmFsc2UsICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QgY2NyID0gbmV3IENyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdCgKLQkJCQkJZGVzY3JpcHRvcik7Ci0JCQljY3Iuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX1NUQVJUKTsKLQkJCWNjci5zZXRTb3VyY2VFZGl0UGFydChzb3VyY2VFZGl0UGFydCk7Ci0JCQlzb3VyY2VFZGl0UGFydC5nZXRDb21tYW5kKGNjcik7Ci0JCQljY3Iuc2V0VGFyZ2V0RWRpdFBhcnQodGFyZ2V0RWRpdFBhcnQpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9FTkQpOwotCQkJQ29tbWFuZCBjbWQgPSB0YXJnZXRFZGl0UGFydC5nZXRDb21tYW5kKGNjcik7Ci0JCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7Ci0JCQkJSUFkYXB0YWJsZSB2aWV3QWRhcHRlciA9IChJQWRhcHRhYmxlKSBjY3IuZ2V0TmV3T2JqZWN0KCk7Ci0JCQkJaWYgKHZpZXdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlcnMuYWRkKHZpZXdBZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0IGdldEVkaXRQYXJ0Rm9yKEVPYmplY3QgbW9kZWxFbGVtZW50KSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBteUVPYmplY3QyVmlld01hcC5nZXQobW9kZWxFbGVtZW50KTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIChFZGl0UGFydCkgZ2V0SG9zdCgpLmdldFZpZXdlcigpLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJCXZpZXcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZUxpbmtzKEVPYmplY3QgY29udGFpbmVyLCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcyA9IGNvbnRhaW5lci5lQ2xhc3MoKTsKLQkJc3RvcmVGZWF0dXJlTW9kZWxGYWNldExpbmtzKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzLCBkaWFncmFtKTsKLQkJc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MpIHsKLQkJc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0NvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0NvbnRyb2xGbG93XzMwMDEoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCWlmIChVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQljb250YWluZXJNZXRhY2xhc3MpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGFpbmVyKQotCQkJCQkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbmV4dFZhbHVlID0gKChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpKTsKLQkJCQlpbnQgbGlua1ZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQobmV4dFZhbHVlKTsKLQkJCQlpZiAoQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQgPT0gbGlua1ZJRCkgewotCQkJCQlPYmplY3Qgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKEFjdGl2aXR5RWRnZSkgbmV4dFZhbHVlKQotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaWYgKHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJRU9iamVjdCBkc3QgPSAoRU9iamVjdCkgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQ7Ci0JCQkJCQlzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCA9ICgoQWN0aXZpdHlFZGdlKSBuZXh0VmFsdWUpCi0JCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQlFT2JqZWN0IHNyYyA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCQlteUxpbmtEZXNjcmlwdG9ycy5hZGQobmV3IExpbmtEZXNjcmlwdG9yKHNyYywgZHN0LAotCQkJCQkJCQkJbmV4dFZhbHVlLAotCQkJCQkJCQkJVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEsIGxpbmtWSUQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzLCBEaWFncmFtIGRpYWdyYW0pIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldERpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaW5rRGVzY3JpcHRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteVNvdXJjZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15RGVzdGluYXRpb247Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteUxpbmtFbGVtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGludCBteVZpc3VhbElEOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElBZGFwdGFibGUgbXlTZW1hbnRpY0FkYXB0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlFT2JqZWN0IGxpbmtFbGVtZW50LCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IGxpbmtFbGVtZW50OwotCQkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgRU9iamVjdEFkYXB0ZXIobGlua0VsZW1lbnQpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IG51bGw7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwgaW50IGxpbmtWSUQpIHsKLQkJCW15U291cmNlID0gc291cmNlOwotCQkJbXlEZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwotCQkJbXlWaXN1YWxJRCA9IGxpbmtWSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG15U291cmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgewotCQkJcmV0dXJuIG15RGVzdGluYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0TGlua0VsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbXlMaW5rRWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IGdldFZpc3VhbElEKCkgewotCQkJcmV0dXJuIG15VmlzdWFsSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIElBZGFwdGFibGUgZ2V0U2VtYW50aWNBZGFwdGVyKCkgewotCQkJcmV0dXJuIG15U2VtYW50aWNBZGFwdGVyOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIxYjVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDQwY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM5YjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQotCQkvLyBWYWxpZGF0aW9uIEFjdGl2aXR5RmluYWxOb2RlIG5vZGUgc2hvdWxkIGFsbG93IG9ubHkgb25lIG91dGdvaW5nIGNvbm5lY3Rpb24uCi0JCWlmIChyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eUZpbmFsTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZU91dGdvaW5nKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ODA5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmRzLkR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkFjdGl2aXR5RmluYWxOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5EZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuRm9ya05vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuSm9pbk5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEZvcmtOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEluaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgSm9pbk5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Hcm91cCgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREdXBsaWNhdGVDb21tYW5kKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJLy8JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkvLwkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkvLwkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZChlZGl0aW5nRG9tYWluLCByZXEpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCBleHRlbmRzCi0JCQlEdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKAotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQkJRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgcmVxLmdldExhYmVsKCksIHJlcQotCQkJCQkuZ2V0RWxlbWVudHNUb0JlRHVwbGljYXRlZCgpLCByZXEKLQkJCQkJLmdldEFsbER1cGxpY2F0ZWRFbGVtZW50c01hcCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTEyN2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0Zjk1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlNTY1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWUyYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWQ5ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxODAwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjhkYTgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWUwYzVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWVlMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNjLCByZXEuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKENvbXBvdW5kQ29tbWFuZCBjbWQsCi0JCQlib29sZWFuIGNvbmZpcm0pIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdC5uZXh0KCk7Ci0JCQlzd2l0Y2ggKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsKLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJZm9yIChJdGVyYXRvciBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsKLQkJCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChjbm9kZSwgY29uZmlybSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ5OThkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQkvLyBEZWxldGUgdGhlIHZpZXcgaWYgYWN0aXZpdHkgcGFydGl0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBhY3Rpdml0eW5vZGUuCi0JCWlmKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKXsKLQkJCWlmKCEoKEFjdGl2aXR5Tm9kZSl2aWV3LmdldEVsZW1lbnQoKSkuZ2V0SW5QYXJ0aXRpb25zKCkuY29udGFpbnMoKChWaWV3KWdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gYXZvaWQgdGhlIGR1cGxpY2F0ZSBsaW5rcyBnZW5lcmF0aW9uLgotCSAqIFNldCBwYXJlbnQgY2Fub25pY2FsRWRpdFBvbGljeSB0byBmYWxzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVSZWZyZXNoKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCUVkaXRQYXJ0IHBhcnQgID0gZ2V0SG9zdCgpLmdldFBhcmVudCgpOwotCQlpZihwYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCl7Ci0JCQlPYmplY3QgdmlldyA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJCUVPYmplY3Qgc2VtYW50aWNIb3N0ID0gKChWaWV3KXZpZXcpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChzZW1hbnRpY0hvc3QgIT0gbnVsbCkgewotCQkJCUxpc3QgY2VwcyA9IENhbm9uaWNhbEVkaXRQb2xpY3kuZ2V0UmVnaXN0ZXJlZEVkaXRQb2xpY2llcyhzZW1hbnRpY0hvc3QpOwotCQkJCWZvciAoIGludCBpID0gMDsgaSA8IGNlcHMuc2l6ZSgpOyBpKysgKSB7Ci0JCQkJCUNhbm9uaWNhbEVkaXRQb2xpY3kgY2VwID0gKENhbm9uaWNhbEVkaXRQb2xpY3kpY2Vwcy5nZXQoaSk7Ci0JCQkJCWNlcC5lbmFibGVSZWZyZXNoKGVuYWJsZSk7IAotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5lbmFibGVSZWZyZXNoKGVuYWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjdjZjJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2NDI4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY2MsIHJlcS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKENvbXBvdW5kQ29tbWFuZCBjbWQsCi0JCQlib29sZWFuIGNvbmZpcm0pIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdC5uZXh0KCk7Ci0JCQlzd2l0Y2ggKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsKLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlmb3IgKEl0ZXJhdG9yIGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsKLQkJCQkJc3dpdGNoIChVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgewotCQkJCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKGNub2RlLCBjb25maXJtKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTA2NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eVBhcnRpdGlvbikgbW9kZWxPYmplY3QpCi0JCQkJLmdldFN1YnBhcnRpdGlvbnMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsIG5leHRWYWx1ZSk7Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbCB8fCB2aWV3LmdldEVsZW1lbnQoKQotCQkJCQkJCS5lSXNQcm94eSgpKTsKLQkJfQotCQlpbnQgbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjNzZkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkFjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeQotCQlleHRlbmRzIFVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9TdWJwYXJ0aXRpb24oKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2Yjc1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJLy8gbW9kaWZpZWQgdG8gY2hlY2sgQWN0aXZpdHlQYXJ0aXRpb24gb3Igbm90LiB0byBhdm9pZCBjbGFzc2Nhc3QgZXhjZXB0aW9uLgotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKEFjdGl2aXR5UGFydGl0aW9uKSBtb2RlbE9iamVjdCkKLQkJCQkJLmdldFN1YnBhcnRpdGlvbnMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJCW5vZGVWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQkJbmV4dFZhbHVlKTsKLQkJCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKSA9PSBudWxsIHx8IHZpZXcuZ2V0RWxlbWVudCgpCi0JCQkJCQkJLmVJc1Byb3h5KCkpOwotCQl9Ci0JCWludCBub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsKLQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1ZjFiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzLkFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzLkNyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcyBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsJCQotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9TdWJwYXJ0aXRpb24oKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJCi0JCS8vIG1vZGlmaWVkIFNUQVJUCi0JCUNvbW1hbmQgY29tbWFuZCA9IGdldENyZWF0ZUFjdGl2aXR5Tm9kZUNvbW1hbmQocmVxKTsKLQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbW1hbmQ7Ci0JCX0KLQkJLy8gbW9kaWZpZWQgRU5ECi0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgZ2V0Q3JlYXRlQWN0aXZpdHlOb2RlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPT0gcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uX05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbihyZXEpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5nbWYuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZU91dGdvaW5nKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVPdXRnb2luZyhDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldERlc3Ryb3lFbGVtZW50Q29tbWFuZChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkvKiBtb2RpZnkgU1RBUlQgKi8KLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVDb21tYW5kKERpYWdyYW1Db3JlUmVzb3VyY2VzLmRlbGV0ZUNvbW1hbmRfbGFiZWwpOwotCQlnZXRSZXBhcmVudGluZ0NvbW1hbmQocmVxLCBjYyk7Ci0JCWNjLmNvbXBvc2UobmV3IENvbW1hbmRQcm94eShnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kKHJlcSwgZ2V0SG9zdCgpKSkpKTsKLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JCS8qIG1vZGlmeSBFTkQgKi8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIHN1cGVyLmdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKHJlcSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQ29tbWFuZCB0byByZXBhcmVudGluZyB0aGUgZWxlbWVudHMgdG8gQWN0aXZpdHkgYmVmb3JlIGRlbGV0aW5nIHRoZSBBY3Rpdml0eVBhcnRpdGlvbi4KLSAJICoKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdAotCSAqIEByZXR1cm4gY29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlcGFyZW50aW5nQ29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCwgQ29tcG9zaXRlQ29tbWFuZCBjYykgewotCQlJdGVyYXRvciBlZGl0UGFydHMgPSBnZXRIb3N0KCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQlPYmplY3QgcGFyZW50ICA9ICAoKEVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0UGFyZW50KCk7Ci0JCUVSZWZlcmVuY2UgZmVhdHVyZSA9IFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X05vZGUoKTsKLQkJCi0JCWlmKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCkpewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJCi0JCVZpZXcgY29udGFpbmVyID0gKFZpZXcpKChFZGl0UGFydClwYXJlbnQpLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCQotCQlFT2JqZWN0IGNvbnRhaW5lckNvbnRleHQgPSBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KGNvbnRhaW5lcik7Ci0JCXdoaWxlICggZWRpdFBhcnRzLmhhc05leHQoKSApIHsKLQkJCUlHcmFwaGljYWxFZGl0UGFydCBlcCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnRzLm5leHQoKTsKLQkJCWlmICggZXAgaW5zdGFuY2VvZiBMYWJlbEVkaXRQYXJ0ICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlWaWV3IHZpZXcgPSAoVmlldyllcC5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQkJaWYgKCB2aWV3ID09IG51bGwgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUVPYmplY3Qgc2VtYW50aWNDb250ZXh0ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCWlmKHNlbWFudGljQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQkKLQkJCSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkgICAgICAgICAgICAuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJIAotCQkJaWYgKCBzZW1hbnRpY0NvbnRleHQgPT0gbnVsbCApIHsKLQkJCQlBZGRDb21tYW5kIGFkZENvbW1hbmQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBuZXcgRU9iamVjdEFkYXB0ZXIoY29udGFpbmVyKSwKLQkJCQkJCSAgbmV3IEVPYmplY3RBZGFwdGVyKHZpZXcpKTsKLQkJCQljYy5jb21wb3NlKGFkZENvbW1hbmQpOwotCQkJfQotCQkJZWxzZSBpZiAoIGNvbnRhaW5lckNvbnRleHQgIT0gbnVsbCApIHsKLQkJCQlpZiAoY29udGFpbmVyQ29udGV4dC5lcXVhbHMoc2VtYW50aWNDb250ZXh0LmVDb250YWluZXIoKSkKLQkJCQkJCSYmIGZlYXR1cmUgPT0gc2VtYW50aWNDb250ZXh0LmVDb250YWlubWVudEZlYXR1cmUoKSkgewotCQkJCQljYy5jb21wb3NlKG5ldyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChyZXF1ZXN0LCBzZW1hbnRpY0NvbnRleHQpKTsKLQkJCQkJQWRkQ29tbWFuZCBhZGRDb21tYW5kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgbmV3IEVPYmplY3RBZGFwdGVyKGNvbnRhaW5lciksCi0JCQkJCQkJICBuZXcgRU9iamVjdEFkYXB0ZXIodmlldykpOwotCQkJCQljYy5jb21wb3NlKGFkZENvbW1hbmQpOwotCQkJCX0KLQkJCQllbHNlewotCQkJCQlDb21tYW5kIG1vdmVTZW1hbnRpY0NtZCA9Ci0JCQkJCSgoQWN0aXZpdHlFZGl0UGFydClwYXJlbnQpLmdldENvbW1hbmQoCi0JCQkJCQluZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcigKLQkJCQkJCQluZXcgTW92ZVJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgY29udGFpbmVyQ29udGV4dCwgCi0JCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Ob2RlKCksCi0JCQkJCQkJCQlzZW1hbnRpY0NvbnRleHQpKSk7Ci0JCQkJCWlmKG1vdmVTZW1hbnRpY0NtZCAgIT0gbnVsbCl7Ci0JCQkJCQljYy5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkobW92ZVNlbWFudGljQ21kKSk7Ci0JCQkJCX0KLS8vCQkJCQljYy5jb21wb3NlKG5ldyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChyZXF1ZXN0LCBzZW1hbnRpY0NvbnRleHQpKTsKLQkJCQkJLy9tb3ZlIG5vdGF0aW9uCi0JCQkJCUFkZENvbW1hbmQgYWRkQ29tbWFuZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG5ldyBFT2JqZWN0QWRhcHRlcihjb250YWluZXIpLAotCQkJCQkJCSAgbmV3IEVPYmplY3RBZGFwdGVyKHZpZXcpKTsKLQkJCQkJY2MuY29tcG9zZShhZGRDb21tYW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZHsKLQotCQlwcml2YXRlIGZpbmFsIEVPYmplY3QgbW92ZUVsZW1lbnQ7Ci0JCQotCQlwdWJsaWMgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSwgRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aGlzKERpYWdyYW1Db3JlUmVzb3VyY2VzLmRlbGV0ZUNvbW1hbmRfbGFiZWwsIGVsZW1lbnQsIHJlcSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChTdHJpbmcgbGFiZWwsIEVPYmplY3QgZWxlbWVudFRvRWRpdCwgCi0JCQkJSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQlzdXBlcihsYWJlbCwgZWxlbWVudFRvRWRpdCwgcmVxdWVzdCk7Ci0JCQl0aGlzLm1vdmVFbGVtZW50ID0gZWxlbWVudFRvRWRpdDsgCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldylnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCWlmKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJCWlmKG1vdmVFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKXsKLQkJCQkJKChBY3Rpdml0eU5vZGUpbW92ZUVsZW1lbnQpLmdldEluUGFydGl0aW9ucygpLnJlbW92ZSh2aWV3LmdldEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCQlpZihtb3ZlRWxlbWVudCAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0NvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODdlM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTVmMDZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWUxNzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzM1MjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vIGFsbG93IG1heGltdW0gb25seSBvbmUgaW5jb21pbmcgY29ubmVjdGlvbiB0byBkZWNpc2lvbiBub2RlIGZyb20gb3RoZXIgYWN0aXZpdHkgbm9kZQotCQkvLwotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlKSB7Ci0JCQlEZWNpc2lvbk5vZGUgZGVjaXNpb24gPSAoRGVjaXNpb25Ob2RlKSByZXEuZ2V0VGFyZ2V0KCk7CQkJCi0JCQlmb3IgKEFjdGl2aXR5RWRnZSBsaW5rIDogZGVjaXNpb24uZ2V0SW5jb21pbmdzKCkpIHsKLQkJCQlpZihsaW5rLmVDb250YWluZXIoKSAhPSBudWxsICYmIGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUluY29taW5nQ29tcGxldGUocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNWUxZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRlYjZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgRm9ya05vZGUpIHsKLQkJCUZvcmtOb2RlIGZvcmsgPSAoRm9ya05vZGUpIHJlcS5nZXRUYXJnZXQoKTsKLQkJCUxpc3QgbGlzdCA9IGZvcmsuZ2V0SW5jb21pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NTZkYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyNTM5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzAwZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Jbml0aWFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5nbWYuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZUluY29taW5nQ29tcGxldGUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUluY29taW5nQ29tcGxldGUoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIEluaXRpYWxOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjQ2NjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5YzY1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIFVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWQyZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlT3V0Z29pbmcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vIFZhbGlkYXRpb24gSm9pbiBOb2RlIHNob3VsZCBhbGxvdyBvbmx5IG9uZSBvdXRnb2luZyBjb25uZWN0aW9uLgotCQlpZiAocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSm9pbk5vZGUpIHsKLQkJCUpvaW5Ob2RlIGpvaW4gPSAoSm9pbk5vZGUpIHJlcS5nZXRTb3VyY2UoKTsKLQkJCUxpc3QgbGlzdCA9IGpvaW4uZ2V0T3V0Z29pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlT3V0Z29pbmcocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjdlYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTlmODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4OTlhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQotCQkvLyBWYWxpZGF0aW9uIG1lcmdlIG5vZGUgc2hvdWxkIGFsbG93IG9ubHkgb25lIG91dGdvaW5nIGNvbm5lY3Rpb24uCi0JCWlmIChyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBNZXJnZU5vZGUpIHsKLQkJCU1lcmdlTm9kZSBqb2luID0gKE1lcmdlTm9kZSkgcmVxLmdldFNvdXJjZSgpOwotCQkJTGlzdCBsaXN0ID0gam9pbi5nZXRPdXRnb2luZ3MoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPj0gMSkgewotCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVPdXRnb2luZyhyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYjNmMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1OTlkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzc4MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjgwZDNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjc4OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzcwZTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDE3NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTNjYjA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZiOTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWRjZjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kcy5DcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHMuQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuVU1MQmFzZUVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWRpdEhlbHBlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkdldEVkaXRDb250ZXh0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMgU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEV4dGVuZGVkIHJlcXVlc3QgZGF0YSBrZXkgdG8gaG9sZCBlZGl0cGFydCB2aXN1YWwgaWQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU1VBTF9JRF9LRVkgPSAidmlzdWFsX2lkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkIHZpc3VhbCBpZCBvZiBlZGl0ZWQgZWRpdHBhcnQgdG8gZXh0ZW5kZWQgZGF0YSBvZiB0aGUgcmVxdWVzdCBzbwotCSAqIGNvbW1hbmQgc3dpdGNoIGNhbiBkZWNpZGUgd2hhdCBraW5kIG9mIGRpYWdyYW0gZWxlbWVudCBpcyBiZWluZyBlZGl0ZWQuCi0JICogSXQgaXMgZG9uZSBpbiB0aG9zZSBjYXNlcyB3aGVuIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRlZHVjZSBkaWFncmFtCi0JICogZWxlbWVudCBraW5kIGZyb20gZG9tYWluIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVjb25uZWN0UmVxdWVzdCkgewotCQkJT2JqZWN0IHZpZXcgPSAoKFJlY29ubmVjdFJlcXVlc3QpIHJlcXVlc3QpLmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCS5nZXRNb2RlbCgpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRCgoVmlldykgdmlldykpOwotCQkJCXJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkucHV0KFZJU1VBTF9JRF9LRVksIGlkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZpc3VhbCBpZCBmcm9tIHJlcXVlc3QgcGFyYW1ldGVycy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRWaXN1YWxJRChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJT2JqZWN0IGlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVklTVUFMX0lEX0tFWSk7Ci0JCXJldHVybiBpZCBpbnN0YW5jZW9mIEludGVnZXIgPyAoKEludGVnZXIpIGlkKS5pbnRWYWx1ZSgpIDogLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUVkaXRDb21tYW5kUmVxdWVzdCBjb21wbGV0ZWRSZXF1ZXN0ID0gY29tcGxldGVSZXF1ZXN0KHJlcXVlc3QpOwotCQlPYmplY3QgZWRpdEhlbHBlckNvbnRleHQgPSBjb21wbGV0ZWRSZXF1ZXN0LmdldEVkaXRIZWxwZXJDb250ZXh0KCk7Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIFZpZXcKLQkJCQl8fCAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBJRWRpdEhlbHBlckNvbnRleHQgJiYgKChJRWRpdEhlbHBlckNvbnRleHQpIGVkaXRIZWxwZXJDb250ZXh0KQotCQkJCQkJLmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIFZpZXcpKSB7Ci0JCQkvLyBubyBzZW1hbnRpYyBjb21tYW5kcyBhcmUgcHJvdmlkZWQgZm9yIHB1cmUgZGVzaWduIGVsZW1lbnRzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgPT0gbnVsbCkgewotCQkJZWRpdEhlbHBlckNvbnRleHQgPSBWaWV3VXRpbAotCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRFbGVtZW50VHlwZShlZGl0SGVscGVyQ29udGV4dCk7Ci0JCWlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZSgKLQkJCQkib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5kZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCWVsZW1lbnRUeXBlID0gbnVsbDsKLQkJfQotCQlDb21tYW5kIGVwQ29tbWFuZCA9IGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJaWYgKGVwQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZXBDb21tYW5kIGluc3RhbmNlb2YgSUNvbW1hbmRQcm94eSA/ICgoSUNvbW1hbmRQcm94eSkgZXBDb21tYW5kKQotCQkJCQkuZ2V0SUNvbW1hbmQoKQotCQkJCQk6IG5ldyBDb21tYW5kUHJveHkoZXBDb21tYW5kKTsKLQkJCWNvbXBsZXRlZFJlcXVlc3Quc2V0UGFyYW1ldGVyKAotCQkJCQlVTUxCYXNlRWRpdEhlbHBlci5FRElUX1BPTElDWV9DT01NQU5ELCBjb21tYW5kKTsKLQkJfQotCQlDb21tYW5kIGVoQ29tbWFuZCA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZWxlbWVudFR5cGUuZ2V0RWRpdENvbW1hbmQoY29tcGxldGVkUmVxdWVzdCk7Ci0JCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKSkgewotCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCQljb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCQkJbnVsbCkuY29tcG9zZShjb21tYW5kKTsKLQkJCQl9Ci0JCQkJZWhDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzaG91bGRQcm9jZWVkID0gdHJ1ZTsKLQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJc2hvdWxkUHJvY2VlZCA9IHNob3VsZFByb2NlZWQoKERlc3Ryb3lSZXF1ZXN0KSBjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJfQotCQlpZiAoc2hvdWxkUHJvY2VlZCkgewotCQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQlDb21tYW5kIGRlbGV0ZVZpZXdDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoCi0JCQkJCQluZXcgRGVsZXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLCAoVmlldykgZ2V0SG9zdCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSk7Ci0JCQkJZWhDb21tYW5kID0gZWhDb21tYW5kID09IG51bGwgPyBkZWxldGVWaWV3Q29tbWFuZCA6IGVoQ29tbWFuZAotCQkJCQkJLmNoYWluKGRlbGV0ZVZpZXdDb21tYW5kKTsKLQkJCX0KLQkJCXJldHVybiBlaENvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVDb21tYW5kKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDb25maWd1cmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q29uZmlndXJlQ29tbWFuZCgoQ29uZmlndXJlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95RWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREdXBsaWNhdGVDb21tYW5kKChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgR2V0RWRpdENvbnRleHRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdENvbnRleHRDb21tYW5kKChHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgTW92ZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRNb3ZlQ29tbWFuZCgoTW92ZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgU2V0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFNldENvbW1hbmQoKFNldFJlcXVlc3QpIHJlcSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbmZpZ3VyZUNvbW1hbmQoQ29uZmlndXJlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZU91dGdvaW5nKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZXRDb21tYW5kKFNldFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRFZGl0Q29udGV4dENvbW1hbmQoR2V0RWRpdENvbnRleHRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ29tbWFuZChNb3ZlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQgY21kID0gbmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSk7Ci0JCQljbWQuc2V0SG9zdChnZXRIb3N0KCkpOwotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIoY21kKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TVNMV3JhcHBlcihJQ29tbWFuZCBjbWQpIHsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNtZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNlbWFudGljRWxlbWVudCgpIHsKLQkJcmV0dXJuIFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG5ldyByZWxhdGlvbnNoaXAgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZ29lcyB1cCBieSBjb250YWlubWVudCBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbSB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBjb250YWluZXIgY2xhc3MuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihPYmplY3QgdWVsZW1lbnQsCi0JCQlFQ2xhc3MgY29udGFpbmVyQ2xhc3MsIElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCWlmICh1ZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSB1ZWxlbWVudDsKLQkJCWZvciAoOyBlbGVtZW50ICE9IG51bGw7IGVsZW1lbnQgPSBlbGVtZW50LmVDb250YWluZXIoKSkgewotCQkJCWlmIChjb250YWluZXJDbGFzcy5pc1N1cGVyVHlwZU9mKGVsZW1lbnQuZUNsYXNzKCkpKSB7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVkaXRpbmcgZG9tYWluIGZyb20gdGhlIGhvc3QgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmQgdG8gZGVzdHJveSB0aGUgbGluay4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoVmlldyB2aWV3LCBib29sZWFuIGNvbmZpcm0pIHsKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKQotCQkJCS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHZpZXcpOwotCi0JCS8vIHNvbWUgdmlld3MgYXJlIHN1cHByZXNzZWQgYW5kIG1pZ2h0IG5vdCBoYXZlIGEgZWRpdCBwYXJ0Ci0JCS8vCi0JCWlmKGVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoCi0JCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBjb25maXJtKTsKLQkJcmV0dXJuIGVkaXRQYXJ0LmdldENvbW1hbmQobmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIocmVxdWVzdCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9NQVApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmRzIHRvIGRlc3Ryb3kgYWxsIGhvc3QgaW5jb21pbmcgYW5kIG91dGdvaW5nIGxpbmtzLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZENvbW1hbmQgZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChib29sZWFuIGNvbmZpcm0pIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbW1hbmQgZGVzdHJveUNtZCA9IGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRWRnZSkgaXQubmV4dCgpLCBjb25maXJtKTsKLQkJCWlmKGRlc3Ryb3lDbWQgIT0gbnVsbCkgewotCQkJCWNtZC5hZGQoZGVzdHJveUNtZCk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kIGRlc3Ryb3lDbWQgPSBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSk7Ci0JCQlpZihkZXN0cm95Q21kICE9IG51bGwpIHsKLQkJCQljbWQuYWRkKGRlc3Ryb3lDbWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGlua0NvbnN0cmFpbnRzIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUFBPU0lURV9FTkRfVkFSID0gIm9wcG9zaXRlRW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMSgKLQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciwgQWN0aXZpdHlOb2RlIHNvdXJjZSwKLQkJCQlBY3Rpdml0eU5vZGUgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gY2FuRXhpc3RDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5FeGlzdENvbnRyb2xGbG93XzMwMDEoCi0JCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIsIEFjdGl2aXR5Tm9kZSBzb3VyY2UsCi0JCQkJQWN0aXZpdHlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoaWxkcmVuIHNob3VsZCBvdmVycmlkZSB0aGlzLCBmb3IgYW55IGV4dHJhIHZhbGlkYXRpb25zLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUluY29taW5nQ29tcGxldGUoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJQ29tbWFuZCBjb21tYW5kOwotCQlpZiAocmVxLmdldFNvdXJjZSgpID09IHJlcS5nZXRUYXJnZXQoKSkgewotCQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJfTsKLQkJfQotCi0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChpc0R1cGxpY2F0ZVJlbGF0aW9uc2hpcChyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJaWYgKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jYW5Db25uZWN0KChFZGl0UGFydCkgZ2V0SG9zdCgpLCByZXEKLQkJCQkuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkgIT0gbnVsbCkKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfRWRnZSgpKTsKLQkJCX0KLQkJCWNvbW1hbmQgPSBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZChyZXEsCi0JCQkJCWVsZW1lbnQuZUNvbnRhaW5lcigpKSk7Ci0KLQkJCS8vIGlmIChyZXEuZ2V0VGFyZ2V0KCkgIT0gcmVxLmdldFNvdXJjZSgpKSB7Ci0JCQkvLyBjb21tYW5kID0gY29tbWFuZC5jaGFpbihuZXcgQ3JlYXRlUHJlZGVjZXNzb3JDb21tYW5kKHJlcSkpOwotCQkJLy8gfQotCQkJcmV0dXJuIGNvbW1hbmQ7Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgbGluayBiZXR3ZWVuIHR3byBlbmRzIGFscmVhZHkgZXhpc3RzLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0R1cGxpY2F0ZVJlbGF0aW9uc2hpcChFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCB0YXJnZXQpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBzb3VyY2UuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250YWluZXI7Ci0JCQlMaXN0IGxpc3QgPSBhY3Rpdml0eS5nZXRFZGdlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgZWxlbWVudCA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmICgoZWxlbWVudC5nZXRTb3VyY2UoKSA9PSBzb3VyY2UpCi0JCQkJCQkmJiBlbGVtZW50LmdldFRhcmdldCgpID09IHRhcmdldCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJfTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJLy8gVE9ETzogY2hlY2sgdGhlIHNhbWUgdHlwZSwgZG9uJ3QgY3JlYXRlIGNvbm5lY3Rpb24uCi0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfRWRnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQocmVxKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1MGQyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXlvdXRFZGl0UG9saWN5IGdldFJlYWxMYXlvdXRFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWxMYXlvdXRFZGl0UG9saWN5KExheW91dEVkaXRQb2xpY3kgcmVhbExheW91dEVkaXRQb2xpY3kpIHsKLQkJdGhpcy5yZWFsTGF5b3V0RWRpdFBvbGljeSA9IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVybmFsTGFiZWwoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRFeHRlcm5hbExhYmVscyhHcm91cFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChlZGl0UGFydCkpIHsKLQkJCQkJZWRpdFBhcnRzLmFkZChlZGl0UGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSRVFfTU9WRV9DSElMRFJFTi5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKSB7Ci0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNiUmVxdWVzdCA9IChDaGFuZ2VCb3VuZHNSZXF1ZXN0KSByZXF1ZXN0OwotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscyhjYlJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBjYlJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0JCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJCQkmJiBlZGl0UGFydHMuc2l6ZSgpID4gZXh0TGFiZWxzLnNpemUoKSkgewotCQkJCQlMaXN0IG90aGVyID0gbmV3IEFycmF5TGlzdChlZGl0UGFydHMpOwotCQkJCQlvdGhlci5yZW1vdmVBbGwoZXh0TGFiZWxzKTsKLQkJCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhvdGhlcik7Ci0JCQkJCWNtZCA9IHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJfQotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZXh0TGFiZWxzKTsKLQkJCQlDb21tYW5kIGV4dExhYmVsc0NtZCA9IGdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhlZGl0UGFydHMpOwotCQkJCXJldHVybiBjbWQgPT0gbnVsbCA/IGV4dExhYmVsc0NtZCA6IGNtZC5jaGFpbihleHRMYWJlbHNDbWQpOwotCQkJfQotCQl9Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0KSB7Ci0JCQlMaXN0IGV4dExhYmVscyA9IGdldEV4dGVybmFsTGFiZWxzKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5ID09IG51bGwgPyBudWxsIDogcmVhbExheW91dEVkaXRQb2xpY3kKLQkJCQkuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb25zdHJhaW50Rm9yKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldykgY2hpbGQKLQkJCQkuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpKQotCQkJCS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKGR4LCBkeSwgMCwgMCk7Ci0JCWNoaWxkLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCXIudHJhbnNsYXRlKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJJiYgcmVhbExheW91dEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci51bmRlcnN0YW5kc1JlcXVlc3QocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVDaGlsZChFZGl0UGFydCBjaGlsZCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIuc2V0SG9zdChob3N0KTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNldEhvc3QoaG9zdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5hY3RpdmF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmRlYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3kuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93VGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZXJhc2VUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmQ0OTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5lZGl0aGVscGVycy5DcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5VTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIgcmVxdWVzdEFkYXB0ZXIgPSAoKENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHJlcXVlc3QpCi0JCQkJCS5nZXRDb25uZWN0aW9uVmlld0FuZEVsZW1lbnREZXNjcmlwdG9yKCkKLQkJCQkJLmdldENyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlcigpOwotCQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHJlcXVlc3RBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbldpdGhSZW9yaWVudGVkVmlld0NvbXBsZXRlQ29tbWFuZCgKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUNvbW1hbmRQcm94eSBjID0gKElDb21tYW5kUHJveHkpIHN1cGVyCi0JCQkJLmdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQocmVxdWVzdCk7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSAoQ29tcG9zaXRlQ29tbWFuZCkgYy5nZXRJQ29tbWFuZCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCByY3ZDb21tYW5kID0gbmV3IFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sIG51bGwpOwotCQlyY3ZDb21tYW5kLnNldEVkZ2VBZGFwdG9yKGdldFZpZXdBZGFwdGVyKCkpOwotCQljYy5jb21wb3NlKHJjdkNvbW1hbmQpOwotCQlyZXR1cm4gYzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxSZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNjk0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxSZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX0RJQUdSQU1fRExHX1RJVExFID0gRGlhZ3JhbVVJTWVzc2FnZXMuUHJvbXB0aW5nRGVsZXRlQWN0aW9uX0RlbGV0ZUZyb21EaWFncmFtRGlhbG9nX1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFID0gRGlhZ3JhbVVJTWVzc2FnZXMuUHJvbXB0aW5nRGVsZXRlQWN0aW9uX0RlbGV0ZUZyb21EaWFncmFtRGlhbG9nX01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX01PREVMX0RMR19UT0dHTEVfTEFCRUwgPSBEaWFncmFtVUlNZXNzYWdlcy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZV9Eb05vdFByb21wdEFnYWluVG9nZ2xlX2xhYmVsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJYm9vbGVhbiBpc0RlbGV0ZUZyb21LZXlCb2FyZCA9IGRlbGV0ZVJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLQkJaWYgKHNob3VsZERlbGV0ZVNlbWFudGljKCkpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxldGVTZW1hbnRpY0NvbW1hbmQoZGVsZXRlUmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIHByb2NlZWRUb0RlbGV0ZVZpZXcgPSB0cnVlOwotCQkJaWYgKGlzRGVsZXRlRnJvbUtleUJvYXJkKSB7Ci0JCQkJR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQgZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQgPSAoR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQpIGRlbGV0ZVJlcXVlc3Q7Ci0JCQkJaWYgKGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLmlzU2hvd0luZm9ybWF0aW9uRGlhbG9nKCkpIHsKLQkJCQkJcHJvY2VlZFRvRGVsZXRlVmlldyA9IHNob3dQcm9tcHQoKTsKLQkJCQkJZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQuc2V0U2hvd0luZm9ybWF0aW9uRGlhbG9nKGZhbHNlKTsKLQkJCQkJaWYgKCEocHJvY2VlZFRvRGVsZXRlVmlldykpCi0JCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlVmlld0NvbW1hbmQoZGVsZXRlUmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlU2VtYW50aWMoKSB7Ci0JCUFzc2VydC5pc1RydWUoZ2V0SG9zdCgpIGluc3RhbmNlb2YgQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQpOwotCQlBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCBjZXAgPSAoQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQpIGdldEhvc3QoKTsKLQkJYm9vbGVhbiBpc0Nhbm9uaWNhbCA9IGZhbHNlOwotCQlpZiAoY2VwLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQlpc0Nhbm9uaWNhbCA9IElzQ2Fub25pY2FsKGNlcC5nZXRTb3VyY2UoKSk7Ci0JCWlmIChjZXAuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBpc0Nhbm9uaWNhbCA/IGlzQ2Fub25pY2FsIDogSXNDYW5vbmljYWwoY2VwLmdldFRhcmdldCgpKTsKLQkJcmV0dXJuIGlzQ2Fub25pY2FsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gSXNDYW5vbmljYWwoRWRpdFBhcnQgZXApIHsKLQkJRWRpdFBhcnQgcGFyZW50ID0gZXAuZ2V0UGFyZW50KCk7Ci0JCXJldHVybiBwYXJlbnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCA/ICgoR3JhcGhpY2FsRWRpdFBhcnQpIHBhcmVudCkKLQkJCQkuaXNDYW5vbmljYWwoKQotCQkJCTogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShuZXcgRGVsZXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCShWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVTZW1hbnRpY0NvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlciBzZW1SZXEgPSBuZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcigKLQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGZhbHNlKSwgZGVsZXRlUmVxdWVzdAotCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpKTsKLQkJQ29tbWFuZCBzZW1hbnRpY0NtZCA9IGdldEhvc3QoKS5nZXRDb21tYW5kKHNlbVJlcSk7Ci0JCWlmIChzZW1hbnRpY0NtZCAhPSBudWxsICYmIHNlbWFudGljQ21kLmNhbkV4ZWN1dGUoKSkgewotCQkJQ29tcG91bmRDb21tYW5kIGNjID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQkJY2MuYWRkKHNlbWFudGljQ21kKTsKLQkJCXJldHVybiBjYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dQcm9tcHQoKSB7Ci0JCWJvb2xlYW4gcHJvbXB0ID0gKChJUHJlZmVyZW5jZVN0b3JlKSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpCi0JCQkJLmdldEJvb2xlYW4oSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfT05fREVMX0ZST01fRElBR1JBTSk7Ci0JCWlmIChwcm9tcHQpCi0JCQlpZiAoc2hvd01lc3NhZ2VEaWFsb2coKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd01lc3NhZ2VEaWFsb2coKSB7Ci0JCU1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIGRpYWxvZyA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlCi0JCQkJLm9wZW5ZZXNOb1F1ZXN0aW9uKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSwKLQkJCQkJCURFTEVURV9GUk9NX0RJQUdSQU1fRExHX01FU1NBR0UsCi0JCQkJCQlERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMLCBmYWxzZSwKLQkJCQkJCShJUHJlZmVyZW5jZVN0b3JlKSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpCi0JCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwKLQkJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQpIHsKLQkJCXJldHVybiBnZXREZWxldGVDb21tYW5kKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb21tYW5kKHJlcXVlc3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmY2OGU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLkRyYWdFZGl0UGFydHNUcmFja2VyRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0JLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeSBleHRlbmRzIE5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeCB7Ci0KLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwgNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlNb3ZlSGFuZGxlIG1vdmVIYW5kbGUgPQotCQkJbmV3IE1vdmVIYW5kbGUoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpOwotCQltb3ZlSGFuZGxlLnNldEJvcmRlcihudWxsKTsKLQkJbW92ZUhhbmRsZS5zZXREcmFnVHJhY2tlcihuZXcgRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeChnZXRIb3N0KCkpKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobW92ZUhhbmRsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGJlZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotCS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBTZWxlY3Rpb25FZGl0UG9saWN5IHsKLQotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByaXZhdGUgSUZpZ3VyZSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93U2VsZWN0aW9uKCk7Ci0JCQlzaG93Rm9jdXMoKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaGlkZVNlbGVjdGlvbigpOwotCQkJYWRkRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlRm9jdXMoKTsKLQkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOwotCQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRGZWVkYmFja0JvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kczsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlib3VuZHMgPSAoKExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLmdldFRleHRCb3VuZHMoKTsKLQkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcyA9IGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsKLQkJZ2V0RmVlZGJhY2tMYXllcigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUoYm91bmRzKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0RmlsbChmYWxzZSk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsKLQkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7Ci0JCXRhcmdldC5zZXRUZXh0KHNvdXJjZS5nZXRUZXh0KCkpOwotCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsKLQkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCkgewotCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQl1cGRhdGVMYWJlbCgoTGFiZWwpIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpLmV4cGFuZCg1LCA1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsKLQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRmVlZGJhY2soKSB7Ci0JCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9leHByZXNzaW9ucy9VTUxBYnN0cmFjdEV4cHJlc3Npb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9leHByZXNzaW9ucy9VTUxBYnN0cmFjdEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiMzljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZXhwcmVzc2lvbnMvVU1MQWJzdHJhY3RFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5leHByZXNzaW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVTUxBYnN0cmFjdEV4cHJlc3Npb24gewotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FCTEVEX05PX0lNUExfRVhDRVBUSU9OX0xPRyA9IEJvb2xlYW4KLQkJCS52YWx1ZU9mKAotCQkJCQlQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJCQkJCSsgIi9kZWJ1Zy9kaXNhYmxlTm9FeHBySW1wbEV4Y2VwdGlvbkxvZyIpKQotCQkJLmJvb2xlYW5WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJvZHk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3NpZmllciBjb250ZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIGVudjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVU1MQWJzdHJhY3RFeHByZXNzaW9uKEVDbGFzc2lmaWVyIGNvbnRleHQpIHsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNTEFic3RyYWN0RXhwcmVzc2lvbihTdHJpbmcgYm9keSwgRUNsYXNzaWZpZXIgY29udGV4dCwgTWFwIGVudikgewotCQl0aGlzLmJvZHkgPSBib2R5OwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmVudiA9IGVudjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJU3RyaW5nIHBsdWdpbklEID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklEOwotCQl0aGlzLnN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIHBsdWdpbklELCAtMSwKLQkJCQkobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiIiwgdGhyb3dhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXRoaXMuc3RhdHVzLmlzT0soKSkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXhwcmVzc2lvbiBwcm9ibGVtOiIgKyBtZXNzYWdlICsgImJvZHk6IiArIGJvZHksIHRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKE9iamVjdCBjb250ZXh0KSB7Ci0JCXJldHVybiBldmFsdWF0ZShjb250ZXh0LCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCWlmIChjb250ZXh0KCkuaXNJbnN0YW5jZShjb250ZXh0KSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZG9FdmFsdWF0ZShjb250ZXh0LCBlbnYpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoRElTQUJMRURfTk9fSU1QTF9FWENFUFRJT05fTE9HCi0JCQkJCQkmJiBlIGluc3RhbmNlb2YgTm9JbXBsRXhjZXB0aW9uKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFeHByZXNzaW9uIGV2YWx1YXRpb24gZmFpbHVyZTogIiArIGJvZHksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgYm9keSgpIHsKLQkJcmV0dXJuIGJvZHk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBjb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBlbnZpcm9ubWVudCgpIHsKLQkJcmV0dXJuIGVudjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhc3NpZ25UbyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRU9iamVjdCB0YXJnZXQpIHsKLQkJLy8JCW1vZGlmaWVkIHRvIGNvbW1lbnQgdGhpcyBvdXQKLQkJZXZhbHVhdGUodGFyZ2V0KTsKLQkJLy8JCXZhbHVlID0gKHZhbHVlICE9IG51bGwpID8gcGVyZm9ybUNhc3QodmFsdWUsIGZlYXR1cmUpIDogbnVsbDsKLQkJLy8JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCS8vCQkJQ29sbGVjdGlvbiBkZXN0Q29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB0YXJnZXQuZUdldChmZWF0dXJlKTsKLQkJLy8JCQlkZXN0Q29sbGVjdGlvbi5jbGVhcigpOwotCQkvLwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJLy8JCQkJQ29sbGVjdGlvbiB2YWx1ZUNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdmFsdWU7Ci0JCS8vCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkvLwkJCQkJZGVzdENvbGxlY3Rpb24uYWRkKHBlcmZvcm1DYXN0KGl0Lm5leHQoKSwgZmVhdHVyZSkpOwotCQkvLwkJCQl9Ci0JCS8vCQkJfSBlbHNlIHsKLQkJLy8JCQkJZGVzdENvbGxlY3Rpb24uYWRkKHZhbHVlKTsKLQkJLy8JCQl9Ci0JCS8vCQkJcmV0dXJuOwotCQkvLwkJfQotCQkvLwkJdGFyZ2V0LmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHBlcmZvcm1DYXN0KE9iamVjdCB2YWx1ZSwgRVR5cGVkRWxlbWVudCB0YXJnZXRUeXBlKSB7Ci0JCWlmICh0YXJnZXRUeXBlLmdldEVUeXBlKCkgPT0gbnVsbAotCQkJCXx8IHRhcmdldFR5cGUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCUNsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0VHlwZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCU51bWJlciBudW0gPSAoTnVtYmVyKSB2YWx1ZTsKLQkJCUNsYXNzIHZhbENsYXNzID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLQkJCUNsYXNzIHRhcmdldFdyYXBwZXJDbGFzcyA9IHRhcmdldENsYXNzOwotCQkJaWYgKHRhcmdldENsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQl0YXJnZXRXcmFwcGVyQ2xhc3MgPSBFY29yZVV0aWwud3JhcHBlckNsYXNzRm9yKHRhcmdldENsYXNzKTsKLQkJCX0KLQkJCWlmICh2YWxDbGFzcy5lcXVhbHModGFyZ2V0V3JhcHBlckNsYXNzKSkgewotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJCWlmIChOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0YXJnZXRXcmFwcGVyQ2xhc3MpKSB7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoQnl0ZS5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgQnl0ZShudW0uYnl0ZVZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEludGVnZXIuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEludGVnZXIobnVtLmludFZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKFNob3J0LmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBTaG9ydChudW0uc2hvcnRWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhMb25nLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBMb25nKG51bS5sb25nVmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoQmlnSW50ZWdlci5jbGFzcykpCi0JCQkJCXJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YobnVtLmxvbmdWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhGbG9hdC5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgRmxvYXQobnVtLmZsb2F0VmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoRG91YmxlLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBEb3VibGUobnVtLmRvdWJsZVZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJpZ0RlY2ltYWwuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEJpZ0RlY2ltYWwobnVtLmRvdWJsZVZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVTUxBYnN0cmFjdEV4cHJlc3Npb24gY3JlYXRlTnVsbEV4cHJlc3Npb24oCi0JCQlFQ2xhc3NpZmllciBjb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKGNvbnRleHQpIHsKLQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCS8vIFRPRE8gLSBsb2cgZW50cnkgYWJvdXQgbm90IHByb3ZpZGVyIGF2YWlsYWJsZSBmb3IgdGhpcyBleHByZXNzaW9uCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9JbXBsRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9JbXBsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlzdXBlcihtZXNzYWdlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvQWN0aXZpdHlEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjkyZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvQWN0aXZpdHlEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuQURESW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BY3Rpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1FZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbUVkaXRvcigpIHsKLQkJc3VwZXIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKQotCQkJCS5nZXRSb290RWRpdFBhcnQoKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLS8vCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JfQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLS8vCXByb3RlY3RlZCBQYWxldHRlUm9vdCBjcmVhdGVQYWxldHRlUm9vdChQYWxldHRlUm9vdCBleGlzdGluZ1BhbGV0dGVSb290KSB7Ci0vLwkJUGFsZXR0ZVJvb3Qgcm9vdCA9IHN1cGVyLmNyZWF0ZVBhbGV0dGVSb290KGV4aXN0aW5nUGFsZXR0ZVJvb3QpOwotLy8JCW5ldyBVTUxQYWxldHRlRmFjdG9yeSgpLmZpbGxQYWxldHRlKHJvb3QpOwotLy8JCXJldHVybiByb290OwotLy8JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzSGludCBnZXRQcmVmZXJlbmNlc0hpbnQoKSB7Ci0JCXJldHVybiBuZXcgUHJlZmVyZW5jZXNIaW50KEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHR5cGUpIHsKLS8vCQlpZiAodHlwZSA9PSBJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50UHJvdmlkZXIgZ2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLS8vCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0vLwkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0vLwkJCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotLy8JCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0vLwkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsID8gZ2V0RG9jdW1lbnRQcm92aWRlcigpCi0vLwkJCQkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSkgOiBudWxsOwotLy8JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLS8vCQkJcmV0dXJuICgoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQpLmdldEVkaXRpbmdEb21haW4oKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHN1cGVyLmdldEVkaXRpbmdEb21haW4oKTsKLQkJcmV0dXJuIGdldERpYWdyYW1NYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0vLwkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotLy8JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotLy8JCQlzZXREb2N1bWVudFByb3ZpZGVyKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJLmdldERvY3VtZW50UHJvdmlkZXIoKSk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJc3VwZXIuc2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0vLwkJfQotCQlzdXBlci5zZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0vLwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0vLwkJTWFya2VyTmF2aWdhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nb3RvTWFya2VyKHRoaXMsIG1hcmtlcik7Ci0vLwl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gc3VwZXIuaXNTYXZlQXNBbGxvd2VkKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0vLwkJc3VwZXIuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpCi0JCXBlcmZvcm1TYXZlQXMobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TYXZlQXMoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJU2F2ZUFzRGlhbG9nIGRpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coc2hlbGwpOwotCQlJRmlsZSBvcmlnaW5hbCA9IGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCA/ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJLmdldEZpbGUoKQotCQkJCTogbnVsbDsKLQkJaWYgKG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCWRpYWxvZy5zZXRPcmlnaW5hbEZpbGUob3JpZ2luYWwpOwotCQl9Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkvLyBlZGl0b3IgaGFzIGJlZW4gcHJvZ3JhbW1hdGljYWxseSBjbG9zZWQgd2hpbGUgdGhlIGRpYWxvZyB3YXMgb3BlbgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChwcm92aWRlci5pc0RlbGV0ZWQoaW5wdXQpICYmIG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCSJUaGUgb3JpZ2luYWwgZmlsZSAnJ3swfScnIGhhcyBiZWVuIGRlbGV0ZWQuIiwgb3JpZ2luYWwKLQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCWRpYWxvZy5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShtZXNzYWdlLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJUGF0aCBmaWxlUGF0aCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCWZpbmFsIElFZGl0b3JJbnB1dCBuZXdJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSk7Ci0JCS8vIENoZWNrIGlmIHRoZSBlZGl0b3IgaXMgYWxyZWFkeSBvcGVuCi0JCUlFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IG1hdGNoaW5nU3RyYXRlZ3kgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKCkKLQkJCQkuZ2V0RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWF0Y2hpbmdTdHJhdGVneS5tYXRjaGVzKGVkaXRvclJlZnNbaV0sIG5ld0lucHV0KSkgewotCQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJCS5vcGVuV2FybmluZyhzaGVsbCwgIlByb2JsZW0gRHVyaW5nIFNhdmUgQXMuLi4iLAotCQkJCQkJCQkiU2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBUYXJnZXQgZmlsZSBpcyBhbHJlYWR5IG9wZW4gaW4gYW5vdGhlciBlZGl0b3IuIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJcHJvdmlkZXIuYWJvdXRUb0NoYW5nZShuZXdJbnB1dCk7Ci0JCQlnZXREb2N1bWVudFByb3ZpZGVyKG5ld0lucHV0KS5zYXZlRG9jdW1lbnQocHJvZ3Jlc3NNb25pdG9yLAotCQkJCQluZXdJbnB1dCwKLQkJCQkJZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpLCB0cnVlKTsKLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0geC5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIlNhdmUgUHJvYmxlbXMiLAotCQkJCQkJIkNvdWxkIG5vdCBzYXZlIGZpbGUuIiwgeC5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwcm92aWRlci5jaGFuZ2VkKG5ld0lucHV0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJc2V0SW5wdXQobmV3SW5wdXQpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKCFzdWNjZXNzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKEV2ZW50IGV2ZW50KSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQotCQkvLyBkbyBub3RoaW5nIGlmIDAgb3IgbW9yZSB0aGFuIDEgZWRpdCBwYXJ0cyBhcmUgc2VsZWN0ZWQKLQkJLy8KLQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCXJldHVybjsKLQotCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbW9kZWwgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGVkaXRvcklucHV0ID0gKERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgZ2V0RWRpdG9ySW5wdXQoKTsKLQkJRGlhZ3JhbUVkaXRvcklucHV0IGRJbnB1dCA9IGVkaXRvcklucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihtb2RlbCk7Ci0JCQlPYmplY3QgZSA9IG51bGw7Ci0JCQkvLyBUT0RPOiBoYW5kbGUgV3JhcHBlciBjaGFuZ2UgYmVsb3cgbGluZSBhZnRlciB3cmFwcGVyIGltcGxlbWVudAotCQkJZSA9IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlID09IG51bGwpIHsKLQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpIG1vZGVsKTsKLQkJCX0KLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkvLwkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQkJZSwgZElucHV0LmdldFN1cHByZXNzaW9uKCksCi0JCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JCQkJRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW1FZGl0b3IoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgaW5wdXQsCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCX0KLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCQlJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLk9QRU5fQUNUSVZJVFlfREVUQUlMX0RJQUdSQU07Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlFZGl0UGFydCBzZWxlY3RlZFBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuZ2V0KDApOwotCQkJCQkvLwkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJaWYgKHNlbGVjdGVkUGFydCAhPSBudWxsKSB7Ci0JCQkJCQlOb2RlIHZpZXcgPSAoTm9kZSkgc2VsZWN0ZWRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbUVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCQkuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCi0JCQkJCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHZpZXcKLQkJCQkJCQkJLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIElFZGl0b3JQYXJ0IHBhcmVudCA9Ci0JCQkJCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCwKLQkJCQkJCQkJZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSwKLQkJCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKTsKLQkJCQkJCURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCS5vcGVuRGlhZ3JhbUVkaXRvcigKLQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLAotCQkJCQkJCQkJCWlucHV0LAotCQkJCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJVmlldyBub2RlID0gKFZpZXcpIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbAotCQkJCQkJJiYgbm9kZS5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCQkJJiYgbm9kZS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCWlmIChlbmFibGVBRERNZW51KG5vZGUuZ2V0RWxlbWVudCgpKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEFEREltYWdlcy5JTUdfREVTQ19FRElUT1IpOwotCQlhY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQURESW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0VESVRPUik7Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlMaXN0PElFbGVtZW50VHlwZT4gZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5jbGVhcigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4KTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BBUlRJVElPTiwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKSwKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfU1RBUlRfTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0SW5pdGlhbE5vZGUoKSwgVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfRk9SS19OT0RFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Rm9ya05vZGUoKSwgVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNik7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9KT0lOX05PREUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRKb2luTm9kZSgpLCBVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNikpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9ERUNJU0lPTl9OT0RFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVjaXNpb25Ob2RlKCksIFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMik7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTUVSR0VfTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWNpc2lvbk5vZGUoKSwgVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0VORF9OT0RFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RmluYWxOb2RlKCksCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9BQ1RJVklUWSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9JVEVSQVRJT04sCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfUEhBU0UsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTUlMRVNUT05FLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZUFERE1lbnUoRU9iamVjdCBlbGVtZW50KSB7Ci0JCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkuZ2V0Tm9kZUFkYXB0ZXIoKEFjdGl2aXR5Tm9kZSkgZWxlbWVudCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0V3JhcHBlcigpOwotCQkJaWYgKHNlbGVjdGVkT2JqZWN0ID09IG51bGwpIHsKLQkJCQlzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCQkJTGlzdDxCcmVha2Rvd25FbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxCcmVha2Rvd25FbGVtZW50PigpOwotCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSBzZWxlY3RlZE9iamVjdDsKLQkJCX0gZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkT2JqZWN0KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoYWN0aXZpdHkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BKSkgewotCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCi0JCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHZlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vQ29sbGVjdCB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIHRvIHZlcmlmeSB0YXNrZGVzY3JpcHRvcnMgYXJlCi0JCQkvLyBub3QuCi0JCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oYWN0aXZpdHksCi0JCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSk7Ci0KLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgTGlzdCwgdG8gZmluZCB0YXNrZGVzY3JpcHRvciBhbmQgaGFzCi0JCQkJLy8gcHJpbWFyeSByb2xlIHdpdGhpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCQkJLy8gdGhlbiBlbmFibGUgdGhlIGFjdGlvbi4KLQkJCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlcgotCQkJCQkJLmdldERpYWdyYW1BZGFwdGVyKGdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkpOwotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJaWYgKHN1cHByZXNzaW9uICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKG9iaikpCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChkaWFncmFtQWRhcHRlci5nZXRTdXBwcmVzc2lvbigpICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0PFJvbGVEZXNjcmlwdG9yPiByb2xlRGVzY0xpc3QgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCQkJCQlmb3IgKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yIDogcm9sZURlc2NMaXN0KSB7Ci0JCQkJCQkJCWlmICghZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKQotCQkJCQkJCQkJCS5pc1N1cHByZXNzZWQocm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0JCWFkZFRvTWVudShtZW51LCBEaWFncmFtQ29uc3RhbnRzLk9QRU5fQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sCi0JCQkJR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgdHJ1ZSwgdHJ1ZSk7Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBtZW51LmZpbmQoQWN0aW9uSWRzLk1FTlVfRElBR1JBTV9BREQpOwotCQlpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLQkJCUlNZW51TWFuYWdlciBhZGRNZW51ID0gKElNZW51TWFuYWdlcikgaXRlbTsKLQkJCVN0cmluZyBncm91cE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLkRJQUdSQU1fQUREX01FTlVfR0VORVJBTF9HUk9VUDsKLQkJCWlmIChnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIG51bGwsIGdyb3VwTmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BBUlRJVElPTiwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9TVEFSVF9OT0RFLAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0VORF9OT0RFLCBncm91cE5hbWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSk7CQkKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfRk9SS19OT0RFLAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0pPSU5fTk9ERSwgCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfREVDSVNJT05fTk9ERSwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9NRVJHRV9OT0RFLAotCQkJCQkJZ3JvdXBOYW1lLCB0cnVlLCB0cnVlKTsJCi0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0FDVElWSVRZLCBncm91cE5hbWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0lURVJBVElPTiwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9QSEFTRSwgZ3JvdXBOYW1lLAotCQkJCQkJZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9NSUxFU1RPTkUsCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfVEFTS19ERVNDUklQVE9SLAotCQkJCQkJZ3JvdXBOYW1lLCB0cnVlLCB0cnVlKTsKLQkJCQkKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIGdldFR5cGVOYW1lKChBY3Rpdml0eSkgZSkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRQYXJ0SW1hZ2UoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZnVsbC9ldG9vbDE2L0FERWRpdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKEFjdGl2aXR5IGFjdCkgewotCQlpZiAoYWN0IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleDsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlZGdlIGZvciBBRCBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHNvdXJjZU5vZGUKLQkgKiBAcGFyYW0gdGFyZ2V0Tm9kZQotCSAqIEBwYXJhbSBhY3RFZGdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFZGdlIGNyZWF0ZUVkZ2UoTm9kZSBzb3VyY2VOb2RlLCBOb2RlIHRhcmdldE5vZGUsCi0JCQlBY3Rpdml0eUVkZ2UgYWN0RWRnZSkgewotCQlpZiAoYWN0RWRnZSBpbnN0YW5jZW9mIENvbnRyb2xGbG93KSB7Ci0JCQlFZGdlIGVkZ2UgPSBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUsIGFjdEVkZ2UsCi0JCQkJCW5ldyBJbnRlZ2VyKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgYWN0RWRnZSwgbmV3IEludGVnZXIoCi0JCQkJCUNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCkgewotCQlMaXN0PElFbGVtZW50VHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQlsaXN0LmFkZChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSk7Ci0JCUNyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGNvbm5lY3Rpb25SZXF1ZXN0ID0gbmV3IENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0KAotCQkJCWxpc3QsIGZhbHNlLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlyZXR1cm4gY29ubmVjdGlvblJlcXVlc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3OTk3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5RGlhZ3JhbVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuZWRpdC5wcm92aWRlcnMuVU1MSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4gZXh0ZW5kcyBBY3Rpdml0eURpYWdyYW1QbHVnaW4gewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZmVyZW5jZXNIaW50IERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCA9IG5ldyBQcmVmZXJlbmNlc0hpbnQoCi0JCQlJRCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luIGluc3RhbmNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVNTERvY3VtZW50UHJvdmlkZXIgbXlEb2N1bWVudFByb3ZpZGVyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4oKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCVByZWZlcmVuY2VzSGludC5yZWdpc3RlclByZWZlcmVuY2VTdG9yZShESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlhZGFwdGVyRmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaWxsSXRlbVByb3ZpZGVyRmFjdG9yaWVzKGZhY3Rvcmllcyk7Ci0JCXJldHVybiBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShmYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsSXRlbVByb3ZpZGVyRmFjdG9yaWVzKExpc3QgZmFjdG9yaWVzKSB7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFVNTEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBFY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBpdGVtKSB7Ci0JCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoaXRlbSwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJbGFiZWxQcm92aWRlci5nZXRJbWFnZShpdGVtKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKElELCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNwZWN0cyBpbWFnZXMgcmVzaWRpbmcgaW4gYW55IHBsdWctaW4uIElmIHBhdGggaXMgcmVsYXRpdmUsCi0JICogdGhlbiB0aGlzIGJ1bmRsZSBpcyBsb29rZWQgdXAgZm9yIHRoZSBpbWFnZSwgb3RoZXJ3aXNlLCBmb3IgYWJzb2x1dGUgCi0JICogcGF0aCwgZmlyc3Qgc2VnbWVudCBpcyB0YWtlbiBhcyBpZCBvZiBwbHVnLWluIHdpdGggaW1hZ2UKLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBpbWFnZSwgZWl0aGVyIGFic29sdXRlICh3aXRoIHBsdWctaW4gaWQgYXMgZmlyc3Qgc2VnbWVudCksIG9yIHJlbGF0aXZlIGZvciBidW5kbGVkIGltYWdlcwotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBmaW5kSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCWZpbmFsIElQYXRoIHAgPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKHAuaXNBYnNvbHV0ZSgpICYmIHAuc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHAuc2VnbWVudCgwKSwgcAotCQkJCQkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHAubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN0cmluZyBmcm9tIHBsdWctaW4ncyByZXNvdXJjZSBidW5kbGUKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCAiJSIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKiBDbGllbnQgZG8gbm90IG5lZWQgdG8gZGlzcG9zZSB0aGlzIGltYWdlLiBJbWFnZXMgd2lsbCBiZSBkaXNwb3NlZCBhdXRvbWF0aWNhbGx5LgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiBpbWFnZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRCdW5kbGVkSW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChwYXRoLCBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHBhdGgpKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxEb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCWlmIChteURvY3VtZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbXlEb2N1bWVudFByb3ZpZGVyID0gbmV3IFVNTERvY3VtZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gbXlEb2N1bWVudFByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IpIHsKLQkJbG9nRXJyb3IoZXJyb3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJZXJyb3IgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIGVycm9yLCB0aHJvd2FibGUpKTsKLQkJZGVidWcoZXJyb3IsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nSW5mbyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhyb3dhYmxlIGFjdHVhbCBlcnJvciBvciBudWxsIGNvdWxkIGJlIHBhc3NlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgJiYgdGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVN0YXR1cy5PSywgbWVzc2FnZSwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKG1lc3NhZ2UsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQkJaWYgKHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01lc3NhZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWJkYzMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygibWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbG93czFHcm91cF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbG93czFHcm91cF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vZGVzMkdyb3VwX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vZGVzMkdyb3VwX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFydE5vZGUyQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXJ0Tm9kZTJDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ya05vZGUzQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVyZ2VOb2RlNENyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXJnZU5vZGU0Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kTm9kZTZDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kTm9kZTZDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luTm9kZTdDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbk5vZGU3Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHk5Q3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5OUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBoYXNlMTBDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGhhc2UxMENyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcjEyQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lMTNDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lMTNDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tYW5kTmFtZV9PcGVuRGlhZ3JhbTsKLQotCS8vVE9ETzogcHV0IGFjY2Vzc29yIGZpZWxkcyBtYW51YWxseQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwMjljMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBXaXphcmQgcGFnZSB0aGF0IGFsbG93cyB0byBzZWxlY3QgZWxlbWVudCBmcm9tIG1vZGVsLgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIG1vZGVsVmV3ZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0TW9kZWxFbGVtZW50KCkgewotCQlyZXR1cm4gc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsRWxlbWVudChFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IG1vZGVsRWxlbWVudDsKLQkJaWYgKG1vZGVsVmV3ZXIgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQltb2RlbFZld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQl9Ci0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgcGxhdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwbGF0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwbGF0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0Q29udHJvbChwbGF0ZSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGxhdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRTZWxlY3Rpb25UaXRsZSgpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQltb2RlbFZld2VyID0gbmV3IFRyZWVWaWV3ZXIocGxhdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWxheW91dERhdGEuaGVpZ2h0SGludCA9IDMwMDsKLQkJbGF5b3V0RGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCW1vZGVsVmV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCW1vZGVsVmV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCW1vZGVsVmV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQoc2VsZWN0ZWRNb2RlbEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJbW9kZWxWZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSk7Ci0JCX0KLQkJbW9kZWxWZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS50aGlzCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBtb2RlbCBlbGVtZW50IGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgewotCQlyZXR1cm4gIlNlbGVjdCBtb2RlbCBlbGVtZW50OiI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmVhdHVyZU1hcC5FbnRyeSkgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoRmVhdHVyZU1hcC5FbnRyeSkgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gKEVPYmplY3QpIHNlbGVjdGVkRWxlbWVudDsKLQkJCX0KLQkJfQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHByb3ZpZGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwgZWxlbWVudC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxDcmVhdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjNTJiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxDcmVhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUxDcmVhdGlvbldpemFyZFBhZ2UgZGlhZ3JhbU1vZGVsRmlsZVBhZ2U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkaWFncmFtOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSB0cnVlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIHdvcmtiZW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIFJlc291cmNlIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCkgewotCQlyZXR1cm4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKAotCQkJYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcikgewotCQl0aGlzLm9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yID0gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlkaWFncmFtTW9kZWxGaWxlUGFnZSA9IG5ldyBVTUxDcmVhdGlvbldpemFyZFBhZ2UoCi0JCQkJIkRpYWdyYW1Nb2RlbEZpbGUiLCBnZXRTZWxlY3Rpb24oKSwgInhtaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2Uuc2V0VGl0bGUoIkNyZWF0ZSBBRCBEaWFncmFtIik7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlCi0JCQkJLnNldERlc2NyaXB0aW9uKCJTZWxlY3QgZmlsZSB0aGF0IHdpbGwgY29udGFpbiBkaWFncmFtIGFuZCBkb21haW4gbW9kZWxzLiIpOwotCQlhZGRQYWdlKGRpYWdyYW1Nb2RlbEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihudWxsKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWRpYWdyYW0gPSBVTUxEaWFncmFtRWRpdG9yVXRpbC5jcmVhdGVEaWFncmFtKAotCQkJCQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UuZ2V0VVJJKCksIG1vbml0b3IpOwotCQkJCWlmIChpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCkgJiYgZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVTUxEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkJCSJFcnJvciBvcGVuaW5nIGRpYWdyYW0gZWRpdG9yIiwgbnVsbCwgZQotCQkJCQkJCQkJCS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotCQkJCQkJIkNyZWF0aW9uIFByb2JsZW1zIiwgbnVsbCwgKChDb3JlRXhjZXB0aW9uKSBlCi0JCQkJCQkJCS5nZXRUYXJnZXRFeGNlcHRpb24oKSkuZ2V0U3RhdHVzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBjcmVhdGluZyBkaWFncmFtIiwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZSgiTmV3IEFEIERpYWdyYW0iKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoImljb25zL3dpemJhbi9OZXdVTUxXaXphcmQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYzQ5NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MQ3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZUV4dGVuc2lvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MQ3JlYXRpb25XaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY3JlYXRlIGZpbGVzIHdpdGggdGhpcyBleHRlbnNpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldEZpbGVQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlzZXRGaWxlTmFtZShVTUxEaWFncmFtRWRpdG9yVXRpbC5nZXRVbmlxdWVGaWxlTmFtZSgKLQkJCQlnZXRDb250YWluZXJGdWxsUGF0aCgpLCBnZXRGaWxlTmFtZSgpLCBnZXRFeHRlbnNpb24oKSkpOwotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbAotCQkJCSYmICFnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi4iICsgZXh0ZW5zaW9uKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKAotCQkJCQkiRmlsZSBuYW1lIHNob3VsZCBoYXZlICcnezB9JycgZXh0ZW5zaW9uLiIsIGV4dGVuc2lvbikpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlOTgzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEVkaXRvckNsYXNzKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRvcklkKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yLklEOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTM4YzNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1FZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU1GQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRGlhZ3JhbUVkaXRvclV0aWwgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBvdXJTYXZlT3B0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChvdXJTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvdXJTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwKLQkJCQkJUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOwotCQl9Ci0JCXJldHVybiBvdXJTYXZlT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5EaWFncmFtKFJlc291cmNlIGRpYWdyYW0pCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gRWRpdFVJVXRpbC5vcGVuRWRpdG9yKChFT2JqZWN0KSBkaWFncmFtLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWZpbGUuc2V0Q2hhcnNldCgiVVRGLTgiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIHNldCBjaGFyc2V0IGZvciBmaWxlICIgKyBmaWxlLmdldEZ1bGxQYXRoKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRmlsZU5hbWUoSVBhdGggY29udGFpbmVyRnVsbFBhdGgsCi0JCQlTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBleHRlbnNpb24pIHsKLQkJaWYgKGNvbnRhaW5lckZ1bGxQYXRoID09IG51bGwpIHsKLQkJCWNvbnRhaW5lckZ1bGxQYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWZpbGVOYW1lID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgIWV4dGVuc2lvbi5lcXVhbHMoZmlsZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCX0KLQkJZXh0ZW5zaW9uID0gZmlsZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlmaWxlTmFtZSA9IGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQlpbnQgaSA9IDE7Ci0JCXdoaWxlIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmV4aXN0cyhmaWxlUGF0aCkpIHsKLQkJCWkrKzsKLQkJCWZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lICsgaSk7Ci0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZVBhdGgubGFzdFNlZ21lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSB3aXphcmQgaW4gYSBkaWFsb2cuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5XaXphcmQoU2hlbGwgc2hlbGwsIFdpemFyZCB3aXphcmQsIFN0cmluZyBzZXR0aW5nc0tleSkgewotCQlJRGlhbG9nU2V0dGluZ3MgcGx1Z2luRGlhbG9nU2V0dGluZ3MgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKHNldHRpbmdzS2V5KTsKLQkJaWYgKHdpemFyZERpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXdpemFyZERpYWxvZ1NldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkJLmFkZE5ld1NlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQl9Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmREaWFsb2dTZXR0aW5ncyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoTWF0aC5tYXgoNTAwLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBtb2RpZnkgb3BlcmF0aW9uIHNpbmNlIGl0IGNyZWF0ZXMgcmVzb3VyY2VzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZURpYWdyYW0oVVJJIGRpYWdyYW1VUkksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKAotCQkJCU1lc3NhZ2VzLlVNTERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2ssIDMpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbVVSSSk7Ci0JCWZpbmFsIFN0cmluZyBkaWFncmFtTmFtZSA9IGRpYWdyYW1VUkkubGFzdFNlZ21lbnQoKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwKLQkJCQlNZXNzYWdlcy5VTUxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsLAotCQkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlBY3Rpdml0eSBtb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOwotCQkJCWF0dGFjaE1vZGVsVG9SZXNvdXJjZShtb2RlbCwgZGlhZ3JhbVJlc291cmNlKTsKLQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsCi0JCQkJCQlBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCWRpYWdyYW0uc2V0TmFtZShkaWFncmFtTmFtZSk7Ci0JCQkJCWRpYWdyYW0uc2V0RWxlbWVudChtb2RlbCk7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQotCQkJCQlkaWFncmFtUmVzb3VyY2UKLQkJCQkJCQkuc2F2ZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTERpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCSJVbmFibGUgdG8gc3RvcmUgbW9kZWwgYW5kIGRpYWdyYW0gcmVzb3VyY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSksIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNldENoYXJzZXQoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZGlhZ3JhbVJlc291cmNlKSk7Ci0JCXJldHVybiBkaWFncmFtUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGRvbWFpbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBjYW52YXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgY3JlYXRlSW5pdGlhbE1vZGVsKCkgewotCQlyZXR1cm4gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZSBtb2RlbCBlbGVtZW50IGluIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGF0dGFjaE1vZGVsVG9SZXNvdXJjZShBY3Rpdml0eSBtb2RlbCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0RWxlbWVudHNJbkRpYWdyYW0oCi0JCQlJRGlhZ3JhbVdvcmtiZW5jaFBhcnQgZGlhZ3JhbVBhcnQsIExpc3QvKkVkaXRQYXJ0Ki9lZGl0UGFydHMpIHsKLQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmRlc2VsZWN0QWxsKCk7Ci0KLQkJRWRpdFBhcnQgZmlyc3RQcmltYXJ5ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmFwcGVuZFNlbGVjdGlvbihuZXh0UGFydCk7Ci0JCQlpZiAoZmlyc3RQcmltYXJ5ID09IG51bGwgJiYgbmV4dFBhcnQgaW5zdGFuY2VvZiBJUHJpbWFyeUVkaXRQYXJ0KSB7Ci0JCQkJZmlyc3RQcmltYXJ5ID0gbmV4dFBhcnQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWVkaXRQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5yZXZlYWwoCi0JCQkJCWZpcnN0UHJpbWFyeSAhPSBudWxsID8gZmlyc3RQcmltYXJ5IDogKEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCQkuZ2V0KDApKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbVBhcnQsCi0JCQlFT2JqZWN0IGVsZW1lbnQsIExpc3QgZWRpdFBhcnRDb2xsZWN0b3IpIHsKLQkJSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBkaWFncmFtUGFydAotCQkJCS5nZXRWaWV3ZXIoKTsKLQkJZmluYWwgaW50IGludGlhbE51bU9mRWRpdFBhcnRzID0gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlldykgeyAvLyBzdXBwb3J0IG5vdGF0aW9uIGVsZW1lbnQgbG9va3VwCi0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJCWVsZW1lbnQpOwotCQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQoZWRpdFBhcnQpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRJRCA9IEVNRkNvcmVVdGlsLmdldFByb3h5SUQoZWxlbWVudCk7Ci0JCUxpc3QgYXNzb2NpYXRlZFBhcnRzID0gdmlld2VyLmZpbmRFZGl0UGFydHNGb3JFbGVtZW50KGVsZW1lbnRJRCwKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQkvLyBwZXJmb3JtIHRoZSBwb3NzaWJsZSBoaWVyYXJjaHkgZGlzam9pbnQgLT4gdGFrZSB0aGUgdG9wLW1vc3QgcGFydHMgb25seQotCQlmb3IgKEl0ZXJhdG9yIGVkaXRQYXJ0SXQgPSBhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKTsgZWRpdFBhcnRJdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRJdC5uZXh0KCk7Ci0JCQlFZGl0UGFydCBwYXJlbnRQYXJ0ID0gbmV4dFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl3aGlsZSAocGFyZW50UGFydCAhPSBudWxsICYmICFhc3NvY2lhdGVkUGFydHMuY29udGFpbnMocGFyZW50UGFydCkpIHsKLQkJCQlwYXJlbnRQYXJ0ID0gcGFyZW50UGFydC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCWlmIChwYXJlbnRQYXJ0ID09IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQobmV4dFBhcnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGludGlhbE51bU9mRWRpdFBhcnRzID09IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSkgewotCQkJaWYgKCFhc3NvY2lhdGVkUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGFzc29jaWF0ZWRQYXJ0cy5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1QYXJ0LCBlbGVtZW50Ci0JCQkJCQkJLmVDb250YWluZXIoKSwgZWRpdFBhcnRDb2xsZWN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpIC0gaW50aWFsTnVtT2ZFZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmlldyBmaW5kVmlldyhEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0LAotCQkJRU9iamVjdCB0YXJnZXRFbGVtZW50LCBMYXp5RWxlbWVudDJWaWV3TWFwIGxhenlFbGVtZW50MlZpZXdNYXApIHsKLQkJYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsVVJJID0gZmFsc2U7Ci0JCWlmICh0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCWhhc1N0cnVjdHVyYWxVUkkgPSAoKFhNTFJlc291cmNlKSB0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0SUQodGFyZ2V0RWxlbWVudCkgPT0gbnVsbDsKLQkJfQotCi0JCVZpZXcgdmlldyA9IG51bGw7Ci0JCWlmIChoYXNTdHJ1Y3R1cmFsVVJJCi0JCQkJJiYgIWxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuaXNFbXB0eSgpKSB7Ci0JCQl2aWV3ID0gKFZpZXcpIGxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuZ2V0KAotCQkJCQl0YXJnZXRFbGVtZW50KTsKLQkJfSBlbHNlIGlmIChmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1FZGl0UGFydCwgdGFyZ2V0RWxlbWVudCwKLQkJCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyKSA+IDApIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyCi0JCQkJCS5nZXQoMCk7Ci0JCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyLmNsZWFyKCk7Ci0JCQl2aWV3ID0gZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcgPyAoVmlldykgZWRpdFBhcnQKLQkJCQkJLmdldE1vZGVsKCkgOiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICh2aWV3ID09IG51bGwpID8gZGlhZ3JhbUVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkgOiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExhenlFbGVtZW50MlZpZXdNYXAgewotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudDJWaWV3TWFwOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFZpZXcgc2NvcGU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgU2V0IGVsZW1lbnRTZXQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBMaXN0IGVkaXRQYXJ0VG1wSG9sZGVyID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGF6eUVsZW1lbnQyVmlld01hcChWaWV3IHNjb3BlLCBTZXQgZWxlbWVudHMpIHsKLQkJCXRoaXMuc2NvcGUgPSBzY29wZTsKLQkJCXRoaXMuZWxlbWVudFNldCA9IGVsZW1lbnRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBNYXAgZ2V0RWxlbWVudDJWaWV3TWFwKCkgewotCQkJaWYgKGVsZW1lbnQyVmlld01hcCA9PSBudWxsKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkvLyBtYXAgcG9zc2libGUgbm90YXRpb24gZWxlbWVudHMgdG8gaXRzZWxmIGFzIHRoZXNlIGNhbid0IGJlIGZvdW5kIGJ5IHZpZXcuZ2V0RWxlbWVudCgpCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJCVZpZXcgdmlldyA9IChWaWV3KSBlbGVtZW50OwotCQkJCQkJaWYgKHZpZXcuZ2V0RGlhZ3JhbSgpID09IHNjb3BlLmdldERpYWdyYW0oKSkgewotCQkJCQkJCWVsZW1lbnQyVmlld01hcC5wdXQoZWxlbWVudCwgZWxlbWVudCk7IC8vIHRha2Ugb25seSB0aG9zZSB0aGF0IHBhcnQgb2Ygb3VyIGRpYWdyYW0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKHNjb3BlLCBlbGVtZW50MlZpZXdNYXAsIGVsZW1lbnRTZXQpOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgTWFwIGJ1aWxkRWxlbWVudDJWaWV3TWFwKFZpZXcgcGFyZW50VmlldywgTWFwIGVsZW1lbnQyVmlld01hcCwKLQkJCQlTZXQgZWxlbWVudHMpIHsKLQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCi0JCQlpZiAocGFyZW50Vmlldy5pc1NldEVsZW1lbnQoKQotCQkJCQkmJiAhZWxlbWVudDJWaWV3TWFwLmNvbnRhaW5zS2V5KHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpKQotCQkJCQkmJiBlbGVtZW50cy5jb250YWlucyhwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkpIHsKLQkJCQllbGVtZW50MlZpZXdNYXAucHV0KHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpLCBwYXJlbnRWaWV3KTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQl9IC8vTGF6eUVsZW1lbnQyVmlld01hcAkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtRmlsZUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNGE4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtRmlsZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JGaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRGlhZ3JhbUZpbGVDcmVhdG9yIGV4dGVuZHMgSURFRWRpdG9yRmlsZUNyZWF0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFVNTERpYWdyYW1GaWxlQ3JlYXRvciBJTlNUQU5DRSA9IG5ldyBVTUxEaWFncmFtRmlsZUNyZWF0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1GaWxlQ3JlYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICIueG1pIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyZGM5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKTsKLQkJCi0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdExpbmVTdHlsZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCQotCQkvLyB0dXJuIG9mZiBjb25uZWN0aW9uIGhhbmRsZXMgdG8gc2hvdyBieSBkZWZhdWx0Ci0JCURpYWdyYW1Db3JlVXRpbC5oaWRlQ29ubmVjdGlvbkhhbmRsZXMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERvY3VtZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERvY3VtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkMWQ3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEb2N1bWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uRGVtdWx0aXBsZXhpbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uTm90aWZpY2F0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5EaWFncmFtRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwuRWRpdG9yU3RhdHVzQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLnV0aWwuRGlhZ3JhbUlPVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yLAotCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0IiwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dCIgfSksCi0JCQkJCQkJbnVsbCkpOwotCQl9Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IChJRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURpYWdyYW1Eb2N1bWVudCkgY3JlYXRlRG9jdW1lbnQoZWRpdG9ySW5wdXQpOwotCi0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gbmV3IFJlc291cmNlU2V0SW5mbyhkb2N1bWVudCwgZWRpdG9ySW5wdXQpOwotCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7Ci0JCWluZm8uZlN0YXR1cyA9IG51bGw7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJJiYgZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCXNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCXNldHVwRG9jdW1lbnQoZWxlbWVudCwgZG9jdW1lbnQpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZ2l2ZW4gZG9jdW1lbnQgYXMgaXQgd291bGQgYmUgcHJvdmlkZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUKLQkgKiBjb250ZW50IG9mIHRoZSBkb2N1bWVudCBpcyBub3QgY2hhbmdlZC4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgotCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBibHVlLXByaW50IGVsZW1lbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRvIHNldCB1cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gZm9yIHN1YmNsYXNzZXMKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZVNldEluZm8gaW5mbykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCArPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRW1wdHlEb2N1bWVudCgpIHsKLQkJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERpYWdyYW1Eb2N1bWVudCgpOwotCQlkb2N1bWVudC5zZXRFZGl0aW5nRG9tYWluKGNyZWF0ZUVkaXRpbmdEb21haW4oKSk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQllZGl0aW5nRG9tYWluLnNldElEKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5FZGl0aW5nRG9tYWluIik7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgTm90aWZpY2F0aW9uRmlsdGVyIGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJLmNyZWF0ZU5vdGlmaWVyRmlsdGVyKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkuYW5kKAotCQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLkFERCkpLmFuZCgKLQkJCQkJCU5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVGZWF0dXJlRmlsdGVyKAotCQkJCQkJCQlSZXNvdXJjZVNldC5jbGFzcywKLQkJCQkJCQkJUmVzb3VyY2VTZXQuUkVTT1VSQ0VfU0VUX19SRVNPVVJDRVMpKTsKLQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlcigpIHsKLQotCQkJcHJpdmF0ZSBOb3RpZmllciBteVRhcmdlcjsKLQotCQkJcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJCQlyZXR1cm4gbXlUYXJnZXI7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWlmIChkaWFncmFtUmVzb3VyY2VNb2RpZmllZEZpbHRlci5tYXRjaGVzKG5vdGlmaWNhdGlvbikpIHsKLQkJCQkJT2JqZWN0IHZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCQkoKFJlc291cmNlKSB2YWx1ZSkuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJCQlteVRhcmdlciA9IG5ld1RhcmdldDsKLQkJCX0KLQotCQl9KTsKLQotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGVsZW1lbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZGlhZ3JhbURvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50OwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBkaWFncmFtRG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSVN0b3JhZ2Ugc3RvcmFnZSA9ICgoRmlsZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCk7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBEaWFncmFtSU9VdGlsLmxvYWQoZG9tYWluLCBzdG9yYWdlLCB0cnVlLAotCQkJCQlnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlkb2N1bWVudC5zZXRDb250ZW50KGRpYWdyYW0pOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJVVJJIHVyaSA9ICgoVVJJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFVSSSgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKAotCQkJCQkJdXJpLnRyaW1GcmFnbWVudCgpLCBmYWxzZSk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSgKLQkJCQkJCQl1cmkudHJpbUZyYWdtZW50KCkpOwotCQkJCX0KLQkJCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoR01GUmVzb3VyY2VGYWN0b3J5Ci0JCQkJCQkJCS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQkJCQkvLyBAc2VlIDE3MTA2MCAKLQkJCQkJCS8vIG9wdGlvbnMucHV0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yKTsKLQkJCQl9Ci0JCQkJaWYgKHVyaS5mcmFnbWVudCgpICE9IG51bGwpIHsKLQkJCQkJRU9iamVjdCByb290RWxlbWVudCA9IHJlc291cmNlLmdldEVPYmplY3QodXJpLmZyYWdtZW50KCkpOwotCQkJCQlpZiAocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgcm9vdEVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudCgoRGlhZ3JhbSkgcm9vdEVsZW1lbnQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29yZUV4Y2VwdGlvbiB0aHJvd25FeGNwID0gbnVsbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQkJdGhyb3duRXhjcCA9IChDb3JlRXhjZXB0aW9uKSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQkJdGhyb3duRXhjcCA9IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCW1zZyAhPSBudWxsID8gbXNnCi0JCQkJCQkJCQkJCTogTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yLAotCQkJCQkJCQkJZSkpOwotCQkJCX0KLQkJCQl0aHJvdyB0aHJvd25FeGNwOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE1vZGlmaWNhdGlvblN0YW1wKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IGdldERpYWdyYW1Eb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGRvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChkaWFncmFtUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpOwotCQkJCXJldHVybiBmaWxlID09IG51bGwgfHwgZmlsZS5nZXRMb2NhdGlvbigpID09IG51bGwKLQkJCQkJCXx8ICFmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZXhpc3RzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRGVsZXRlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0SW5mbyBnZXRSZXNvdXJjZVNldEluZm8oT2JqZWN0IGVkaXRvcklucHV0KSB7Ci0JCXJldHVybiAoUmVzb3VyY2VTZXRJbmZvKSBzdXBlci5nZXRFbGVtZW50SW5mbyhlZGl0b3JJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCwgRWxlbWVudEluZm8gaW5mbykgewotCQlpZiAoaW5mbyBpbnN0YW5jZW9mIFJlc291cmNlU2V0SW5mbykgewotCQkJUmVzb3VyY2VTZXRJbmZvIHJlc291cmNlU2V0SW5mbyA9IChSZXNvdXJjZVNldEluZm8pIGluZm87Ci0JCQlyZXNvdXJjZVNldEluZm8uZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYWxpZGF0ZVN0YXRlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgY29tcHV0YXRpb25Db250ZXh0KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlczJWYWxpZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWZpbGVzMlZhbGlkYXRlLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KAotCQkJCQkoSUZpbGVbXSkgZmlsZXMyVmFsaWRhdGUudG9BcnJheShuZXcgSUZpbGVbZmlsZXMyVmFsaWRhdGUKLQkJCQkJCQkuc2l6ZSgpXSksIGNvbXB1dGF0aW9uQ29udGV4dCk7Ci0JCX0KLQotCQlzdXBlci5kb1ZhbGlkYXRlU3RhdGUoZWxlbWVudCwgY29tcHV0YXRpb25Db250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZSwgZXgpOwotCQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBpbmZvLmlzUmVhZE9ubHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNSZWFkT25seShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghaXNTdGF0ZVZhbGlkYXRlZChlbGVtZW50KSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChpbmZvLmlzVXBkYXRlQ2FjaGUoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0ZUNhY2hlKGVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsKLQkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mby5pc01vZGlmaWFibGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNNb2RpZmlhYmxlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJaW5mby5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJaW5mby5zZXRNb2RpZmlhYmxlKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWluZm8uc2V0UmVhZE9ubHkoZmFsc2UpOwotCQkJaW5mby5zZXRNb2RpZmlhYmxlKHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVXBkYXRlU3RhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaW5mby5zZXRVcGRhdGVDYWNoZSh0cnVlKTsKLQkJfQotCQlzdXBlci5kb1VwZGF0ZVN0YXRlQ2FjaGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5mby5pc1N5bmNocm9uaXplZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1N5bmNocm9uaXplZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRSZXNldFJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJCQkubW9kaWZ5UnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChjb21wdXRlU2NoZWR1bGluZ1J1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U3luY2hyb25pemVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLnJlZnJlc2hSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFZhbGlkYXRlU3RhdGVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJZmlsZXMuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkudmFsaWRhdGVFZGl0UnVsZSgKLQkJCQkJCQkoSUZpbGVbXSkgZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBjb21wdXRlU2NoZWR1bGluZ1J1bGUoSVJlc291cmNlIHRvQ3JlYXRlT3JNb2RpZnkpIHsKLQkJaWYgKHRvQ3JlYXRlT3JNb2RpZnkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkubW9kaWZ5UnVsZSgKLQkJCQkJdG9DcmVhdGVPck1vZGlmeSk7Ci0KLQkJSVJlc291cmNlIHBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnk7Ci0JCWRvIHsKLQkJCS8qCi0JCQkgKiBYWFggVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MDEKLQkJCSAqIElSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUgc2hvdWxkIGl0ZXJhdGUgdGhlIGhpZXJhcmNoeQotCQkJICogaXRzZWxmLgotCQkJICovCi0JCQl0b0NyZWF0ZU9yTW9kaWZ5ID0gcGFyZW50OwotCQkJcGFyZW50ID0gdG9DcmVhdGVPck1vZGlmeS5nZXRQYXJlbnQoKTsKLQkJfSB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5leGlzdHMoKSk7Ci0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmNyZWF0ZVJ1bGUoCi0JCQkJdG9DcmVhdGVPck1vZGlmeSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQloYW5kbGVFbGVtZW50Q2hhbmdlZChpbmZvLCBuZXh0UmVzb3VyY2UsIG1vbml0b3IpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmRvU3luY2hyb25pemUoZWxlbWVudCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZURvY3VtZW50KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGVsZW1lbnQsCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoIW92ZXJ3cml0ZSAmJiAhaW5mby5pc1N5bmNocm9uaXplZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCUlTdGF0dXMuT0ssCi0JCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yLAotCQkJCQkJCQludWxsKSk7Ci0JCQl9Ci0JCQlpbmZvLnN0b3BSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5naW5nKGVsZW1lbnQpOwotCQkJTGlzdCByZXNvdXJjZXMgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrLAotCQkJCQkJcmVzb3VyY2VzLnNpemUoKSArIDEpOyAvLyJTYXZpbmcgZGlhZ3JhbSIKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoTkxTLmJpbmQoCi0JCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaywKLQkJCQkJCQluZXh0UmVzb3VyY2UuZ2V0VVJJKCkpKTsKLQkJCQkJaWYgKG5leHRSZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5leHRSZXNvdXJjZS5zYXZlKFVNTERpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCQlFZGl0b3JTdGF0dXNDb2Rlcy5SRVNPVVJDRV9GQUlMVVJFLCBlCi0JCQkJCQkJCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHgpIHsKLQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCXRocm93IHg7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluZm8uc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mbyBpbmZvLAotCQkJUmVzb3VyY2UgY2hhbmdlZFJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGNoYW5nZWRSZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkLAotCQkJCQkJCQlleCk7Ci0JCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQKLQkJCX0KLQkJfQotCQljaGFuZ2VkUmVzb3VyY2UudW5sb2FkKCk7Ci0KLQkJZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQl0cnkgewotCQkJc2V0RG9jdW1lbnRDb250ZW50KGluZm8uZkRvY3VtZW50LCBpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWluZm8uZlN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJaWYgKCFpbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7Ci0JCX0KLQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50TW92ZWQoSUVkaXRvcklucHV0IGlucHV0LCBVUkkgdXJpKSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGUgbmV3RmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSgKLQkJCQkJbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQlmaXJlRWxlbWVudE1vdmVkKGlucHV0LCBuZXdGaWxlID09IG51bGwgPyBudWxsCi0JCQkJCTogbmV3IEZpbGVFZGl0b3JJbnB1dChuZXdGaWxlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gVE9ETzogYXBwZW5kIHN1ZmZpeCB0byB0aGUgVVJJISAodXNlIGRpYWdyYW0gYXMgYSBwYXJhbWV0ZXIpCi0JCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ldyBVUklFZGl0b3JJbnB1dCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dFdpdGhFZGl0aW5nRG9tYWluKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlyZXR1cm4gZWRpdG9ySW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRGlhZ3JhbURvY3VtZW50IGdldERpYWdyYW1Eb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKElEaWFncmFtRG9jdW1lbnQpIGRvYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlU2V0SW5mbyBleHRlbmRzIEVsZW1lbnRJbmZvIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBsb25nIG15TW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIgbXlTeW5jaHJvbml6ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBteVVuU3luY2hyb25pemVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElEaWFncmFtRG9jdW1lbnQgbXlEb2N1bWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJRWRpdG9ySW5wdXQgbXlFZGl0b3JJbnB1dDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXBkYXRlQ2FjaGUgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlNb2RpZmlhYmxlID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVJlYWRPbmx5ID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyIG15UmVzb3VyY2VTZXRMaXN0ZW5lcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0SW5mbyhJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50LAotCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJbXlEb2N1bWVudCA9IGRvY3VtZW50OwotCQkJbXlFZGl0b3JJbnB1dCA9IGVkaXRvcklucHV0OwotCQkJc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJbXlSZXNvdXJjZVNldExpc3RlbmVyID0gbmV3IFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIG15TW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkJbXlNb2RpZmljYXRpb25TdGFtcCA9IG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJCXJldHVybiBteURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoKSB7Ci0JCQlyZXR1cm4gbXlFZGl0b3JJbnB1dDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLnJlbW92ZShteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewotCQkJcmV0dXJuIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuc2l6ZSgpID09IDA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VW5TeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKSB7Ci0JCQlteVN5bmNocm9uaXplci5kaXNwb3NlKCk7Ci0JCQlteVN5bmNocm9uaXplciA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIHZvaWQgc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyID0gbmV3IFdvcmtzcGFjZVN5bmNocm9uaXplcihteURvY3VtZW50Ci0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIG5ldyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUNhY2hlKCkgewotCQkJcmV0dXJuIG15VXBkYXRlQ2FjaGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VXBkYXRlQ2FjaGUoYm9vbGVhbiB1cGRhdGUpIHsKLQkJCW15VXBkYXRlQ2FjaGUgPSB1cGRhdGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCkgewotCQkJcmV0dXJuIG15TW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmlhYmxlKGJvb2xlYW4gbW9kaWZpYWJsZSkgewotCQkJbXlNb2RpZmlhYmxlID0gbW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIG15UmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQkJbXlSZWFkT25seSA9IHJlYWRPbmx5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgY2xhc3MgU3luY2hyb25pemVyRGVsZWdhdGUgaW1wbGVtZW50cwotCQkJCVdvcmtzcGFjZVN5bmNocm9uaXplci5EZWxlZ2F0ZSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VDaGFuZ2VkKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mby50aGlzLCByZXNvdXJjZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlRGVsZXRlZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXJlRWxlbWVudERlbGV0ZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMKLQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZU1vdmVkKFJlc291cmNlIHJlc291cmNlLAotCQkJCQlmaW5hbCBVUkkgbmV3VVJJKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChteURvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKSA9PSByZXNvdXJjZSkgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWhhbmRsZUVsZW1lbnRNb3ZlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG5ld1VSSSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWhhbmRsZVJlc291cmNlRGVsZXRlZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBFQ29udGVudEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vdGlmaWNhdGlvbkZpbHRlciBteU1vZGlmaWVkRmlsdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0SW5mbyBteUluZm87Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyKFJlc291cmNlU2V0SW5mbyBpbmZvKSB7Ci0JCQlteUluZm8gPSBpbmZvOwotCQkJbXlNb2RpZmllZEZpbHRlciA9IE5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQpLm9yKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5VTlNFVCkpLmFuZCgKLQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoUmVzb3VyY2UuY2xhc3MsCi0JCQkJCQkJUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVEKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZVNldCkgewotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJCWlmICghbm90aWZpY2F0aW9uLmlzVG91Y2goKQotCQkJCQkmJiBteU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBteUluZm8uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpCi0JCQkJCQkJCSYmICFtb2RpZmllZDspIHsKLQkJCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQkJbW9kaWZpZWQgPSBuZXh0UmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gZGlydHlTdGF0ZUNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCXN5bmNocm9uaXplZCAobXlJbmZvKSB7Ci0JCQkJCQkJaWYgKG1vZGlmaWVkICE9IG15SW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCQlteUluZm8uZkNhbkJlU2F2ZWQgPSBtb2RpZmllZDsKLQkJCQkJCQkJZGlydHlTdGF0ZUNoYW5nZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIXJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQkJCQlteUluZm8uc2V0U3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGlydHlTdGF0ZUNoYW5nZWQpIHsKLQkJCQkJCQlmaXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKG15SW5mbwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG1vZGlmaWVkKTsKLQotCQkJCQkJCWlmICghbW9kaWZpZWQpIHsKLQkJCQkJCQkJbXlJbmZvCi0JCQkJCQkJCQkJLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChteUluZm8pKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NjJlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVUkkgZG9tYWluTW9kZWxVUkk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkb21haW5Nb2RlbFVSSSA9IG51bGw7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uID09IGZhbHNlCi0JCQkJfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWRvbWFpbk1vZGVsVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpCi0JCQkJLnRvU3RyaW5nKCksIHRydWUpOwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJRU9iamVjdCBkaWFncmFtUm9vdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGRvbWFpbk1vZGVsVVJJLCB0cnVlKTsKLQkJCWRpYWdyYW1Sb290ID0gKEVPYmplY3QpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBsb2FkIHJlc291cmNlOiAiICsgZG9tYWluTW9kZWxVUkksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChkaWFncmFtUm9vdCA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nCi0JCQkJCS5vcGVuRXJyb3IoCi0JCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCQlNZXNzYWdlcy5VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlLAotCQkJCQkJCU1lc3NhZ2VzLlVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJV2l6YXJkIHdpemFyZCA9IG5ldyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZChkb21haW5Nb2RlbFVSSSwKLQkJCQlkaWFncmFtUm9vdCwgZWRpdGluZ0RvbWFpbik7Ci0JCXdpemFyZC5zZXRXaW5kb3dUaXRsZShOTFMuYmluZCgKLQkJCQlNZXNzYWdlcy5VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGUsCi0JCQkJQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCkpOwotCQlVTUxEaWFncmFtRWRpdG9yVXRpbC5ydW5XaXphcmQoZ2V0U2hlbGwoKSwgd2l6YXJkLCAiSW5pdERpYWdyYW1GaWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxMb2FkUmVzb3VyY2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTExvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIxOTRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTExvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbi5Mb2FkUmVzb3VyY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxMb2FkUmVzb3VyY2VBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQWN0aXZpdHlFZGl0UGFydCBteVNlbGVjdGVkRWxlbWVudDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNoZWxsIG15U2hlbGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlteVNoZWxsID0gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUxvYWRSZXNvdXJjZURpYWxvZyBsb2FkUmVzb3VyY2VEaWFsb2cgPSBuZXcgTG9hZFJlc291cmNlRGlhbG9nKG15U2hlbGwsCi0JCQkJbXlTZWxlY3RlZEVsZW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJbG9hZFJlc291cmNlRGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJbXlTZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxCi0JCQkJCSYmIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eUVkaXRQYXJ0KSB7Ci0JCQkJbXlTZWxlY3RlZEVsZW1lbnQgPSAoQWN0aXZpdHlFZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG15U2VsZWN0ZWRFbGVtZW50ICE9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxNYXRjaGluZ1N0cmF0ZWd5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxNYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjg2YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTWF0Y2hpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxNYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7Ci0JCXRyeSB7Ci0JCQllZGl0b3JJbnB1dCA9IGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZWRpdG9ySW5wdXQuZXF1YWxzKGlucHV0KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQKLQkJCQkmJiBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gKChVUklFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFVSSSgpLmVxdWFscygKLQkJCQkJKChVUklFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVSSSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTE5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjUxYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy52aWV3LkNyZWF0ZURpYWdyYW1WaWV3T3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQoVVJJIGRvbWFpbk1vZGVsVVJJLCBFT2JqZWN0IGRpYWdyYW1Sb290LAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlhc3NlcnQgZG9tYWluTW9kZWxVUkkgIT0gbnVsbCA6ICJEb21haW4gbW9kZWwgdXJpIG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnQgZGlhZ3JhbVJvb3QgIT0gbnVsbCA6ICJEb2FncmFtIHJvb3QgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGVkaXRpbmdEb21haW4gIT0gbnVsbCA6ICJFZGl0aW5nIGRvbWFpbiBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlteUZpbGVDcmVhdGlvblBhZ2UgPSBuZXcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgKLQkJCQlNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lLAotCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQlteUZpbGVDcmVhdGlvblBhZ2UKLQkJCQkuc2V0VGl0bGUoTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGUpOwotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oTkxTLmJpbmQoCi0JCQkJTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb24sCi0JCQkJQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCkpOwotCQlJUGF0aCBmaWxlUGF0aDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZG9tYWluTW9kZWxVUkkudHJpbUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQlpZiAoZG9tYWluTW9kZWxVUkkuaXNQbGF0Zm9ybVJlc291cmNlKCkpIHsKLQkJCWZpbGVQYXRoID0gbmV3IFBhdGgoZG9tYWluTW9kZWxVUkkudHJpbVNlZ21lbnRzKDEpCi0JCQkJCS50b1BsYXRmb3JtU3RyaW5nKHRydWUpKTsKLQkJfSBlbHNlIGlmIChkb21haW5Nb2RlbFVSSS5pc0ZpbGUoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJLy8gVE9ETyA6IHVzZSBzb21lIGRlZmF1bHQgcGF0aAotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlVuc3VwcG9ydGVkIFVSSTogIiArIGRvbWFpbk1vZGVsVVJJKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRDb250YWluZXJGdWxsUGF0aChmaWxlUGF0aCk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShVTUxEaWFncmFtRWRpdG9yVXRpbC5nZXRVbmlxdWVGaWxlTmFtZSgKLQkJCQlmaWxlUGF0aCwgZmlsZU5hbWUsICJ4bWkiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlID0gbmV3IERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UoCi0JCQkJTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZS5zZXRNb2RlbEVsZW1lbnQoZGlhZ3JhbVJvb3QpOwotCi0JCW15RWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBteUZpbGVDcmVhdGlvblBhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobXlGaWxlQ3JlYXRpb25QYWdlKTsKLQkJYWRkUGFnZShkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBteUZpbGVDcmVhdGlvblBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCQlVTUxEaWFncmFtRWRpdG9yVXRpbC5zZXRDaGFyc2V0KGRpYWdyYW1GaWxlKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCQlVUkkgZGlhZ3JhbU1vZGVsVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBteUVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbU1vZGVsVVJJKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJbXlFZGl0aW5nRG9tYWluLAotCQkJCU1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZCwKLQkJCQlhZmZlY3RlZEZpbGVzKSB7Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlpbnQgZGlhZ3JhbVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXREaWFncmFtVmlzdWFsSUQoZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCQkJCQkuZ2V0TW9kZWxFbGVtZW50KCkpOwotCQkJCWlmIChkaWFncmFtVklEICE9IEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEKSB7Ci0JCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Ci0JCQkJCQkJLm5ld0Vycm9yQ29tbWFuZFJlc3VsdChNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3IpOwotCQkJCX0KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKAotCQkJCQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZS5nZXRNb2RlbEVsZW1lbnQoKSwKLQkJCQkJCUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJZGlhZ3JhbVJlc291cmNlLnNhdmUoVU1MRGlhZ3JhbUVkaXRvclV0aWwuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQlVTUxEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtUmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiU2F2ZSBvcGVyYXRpb24gZmFpbGVkIGZvcjogIiArIGRpYWdyYW1Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KSB7Ci0JCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBvcGVuIGVkaXRvciIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMKLQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJCXN1cGVyKHBhZ2VOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgewotCQkJcmV0dXJuIE1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ID09IG51bGwpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWJvb2xlYW4gcmVzdWx0ID0gVmlld1NlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJLnByb3ZpZGVzKAotCQkJCQkJCW5ldyBDcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbigKLQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihzZWxlY3RlZE1vZGVsRWxlbWVudCksCi0JCQkJCQkJCQlBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCkpOwotCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdCA/IG51bGwKLQkJCQkJOiBNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MUGFsZXR0ZUZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTFBhbGV0dGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmY2VmZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MUGFsZXR0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVEcmF3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5VbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxQYWxldHRlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFBhbGV0dGUoUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3QpIHsKLQkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZUZsb3dzMUdyb3VwKCkpOwotCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlTm9kZXMyR3JvdXAoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUZsb3dzMUdyb3VwKCkgewotCQlQYWxldHRlQ29udGFpbmVyIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZURyYXdlcigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9mbG93c190aXRsZSk7Ci0JCXBhbGV0dGVDb250YWluZXIKLQkJCQkuc2V0RGVzY3JpcHRpb24oRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfZmxvd3NfY3JlYXRlX3RleHQpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVDb250cm9sRmxvdzFDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVOb2RlczJHcm91cCgpIHsKLQkJUGFsZXR0ZUNvbnRhaW5lciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfbm9kZXNfdGl0bGVzKTsKLQkJcGFsZXR0ZUNvbnRhaW5lcgotCQkJCS5zZXREZXNjcmlwdGlvbihEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9ub2Rlc19ncm91cF90ZXh0KTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb24xQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVTdGFydE5vZGUyQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVFbmROb2RlNkNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlRm9ya05vZGUzQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVKb2luTm9kZTdDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZURlY2lzaW9uTm9kZTVDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZU1lcmdlTm9kZTRDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKG5ldyBQYWxldHRlU2VwYXJhdG9yKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVBY3Rpdml0eTlDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVQaGFzZTEwQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVNaWxlc3RvbmUxM0NyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbCgpKTsKLQkJcmV0dXJuIHBhbGV0dGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxKTsKLQkJTGlua1Rvb2xFbnRyeSBlbnRyeSA9IG5ldyBMaW5rVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd190ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd19jcmVhdGVfdGV4dCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250cm9sRmxvdygpLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMik7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4KSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVN0YXJ0Tm9kZTJDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0aWFsTm9kZSgpLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUZvcmtOb2RlM0NyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEZvcmtOb2RlKCksCi0JCQkJVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlTWVyZ2VOb2RlNENyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lcmdlTm9kZSgpLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVEZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldERlY2lzaW9uTm9kZSgpLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSkpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVFbmROb2RlNkNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0LCAKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RmluYWxOb2RlKCksCi0JCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlSm9pbk5vZGU3Q3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sm9pbk5vZGUoKSwKLQkJCQlVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVBY3Rpdml0eTlDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dCwgCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVBoYXNlMTBDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dCwgCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlTWlsZXN0b25lMTNDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGVUb29sRW50cnkgZXh0ZW5kcyBUb29sRW50cnkgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgZWxlbWVudFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vZGVUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJTGlzdCBlbGVtZW50VHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCQlUb29sIHRvb2wgPSBuZXcgVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sKGVsZW1lbnRUeXBlcykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhcmdldFJlcXVlc3QoKSB7Ci0JCQkJCUNyZWF0ZVJlcXVlc3QgcmVxID0gZ2V0Q3JlYXRlUmVxdWVzdCgpOwotCQkJCQlpZiAoaXNJblN0YXRlKFNUQVRFX0RSQUdfSU5fUFJPR1JFU1MpKSB7Ci0JCQkJCQlyZXEuc2V0U2l6ZShudWxsKTsKLQkJCQkJCXJlcS5zZXRMb2NhdGlvbihnZXRMb2NhdGlvbigpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlcS5zZXRTaXplKG51bGwpOwotCQkJCQkJcmVxLnNldExvY2F0aW9uKGdldExvY2F0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCUJyaWRnZUhlbHBlci5lbGVtZW50VHlwZXMuYWRkKChJRWxlbWVudFR5cGUpIGVsZW1lbnRUeXBlcwotCQkJCQkuZ2V0KGVsZW1lbnRUeXBlcy5zaXplKCkgLSAxKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExpbmtUb29sRW50cnkgZXh0ZW5kcyBUb29sRW50cnkgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgcmVsYXRpb25zaGlwVHlwZXM7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGlua1Rvb2xFbnRyeShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCQlMaXN0IHJlbGF0aW9uc2hpcFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIG51bGwsIG51bGwpOwotCQkJdGhpcy5yZWxhdGlvbnNoaXBUeXBlcyA9IHJlbGF0aW9uc2hpcFR5cGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCQlUb29sIHRvb2wgPSBuZXcgVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblRvb2wocmVsYXRpb25zaGlwVHlwZXMpOwotCQkJdG9vbC5zZXRQcm9wZXJ0aWVzKGdldFRvb2xQcm9wZXJ0aWVzKCkpOwotCQkJcmV0dXJuIHRvb2w7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxWaXN1YWxJRFJlZ2lzdHJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxWaXN1YWxJRFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODZjZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MVmlzdWFsSURSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5leHByZXNzaW9ucy5VTUxBYnN0cmFjdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkluaXRpYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyByZWdpc3RyeSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCB0eXBlIG9mIHZpc3VhbCBvYmplY3Qgc2hvdWxkIGJlCi0gKiBjcmVhdGVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBEaWFncmFtLCBOb2RlLCBDaGlsZE5vZGUgb3IgTGluayByZXByZXNlbnRlZCAKLSAqIGJ5IGEgZG9tYWluIG1vZGVsIG9iamVjdC4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxWaXN1YWxJRFJlZ2lzdHJ5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfS0VZID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJKyAiL2RlYnVnL3Zpc3VhbElEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFZpZXcgdmlldykgewotCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCWlmIChBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyh2aWV3LmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0VmlzdWFsSUQodmlldy5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2RlbElEKFZpZXcgdmlldykgewotCQlWaWV3IGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJd2hpbGUgKHZpZXcgIT0gZGlhZ3JhbSkgewotCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgYW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KCJtb2RlbElEIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGRpYWdyYW0uZ2V0VHlwZSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHR5cGUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaWYgKEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCVBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERFQlVHX0tFWSkpKSB7Ci0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiVW5hYmxlIHRvIHBhcnNlIHZpZXcgdHlwZSBhcyBhIHZpc3VhbElEIG51bWJlcjogIgotCQkJCQkJCQkrIHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShpbnQgdmlzdWFsSUQpIHsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZpc3VhbElEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0RGlhZ3JhbVZpc3VhbElEKGRvbWFpbkVsZW1lbnQsIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiBpc0RpYWdyYW1BY3Rpdml0eV83OSgoQWN0aXZpdHkpIGRvbWFpbkVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJcmV0dXJuIGdldFVucmVjb2duaXplZERpYWdyYW1JRChkb21haW5FbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywgRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXROb2RlVmlzdWFsSUQoY29udGFpbmVyVmlldywgZG9tYWluRWxlbWVudCwKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXROb2RlVmlzdWFsSUQoVmlldyBjb250YWluZXJWaWV3LAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJU3RyaW5nIGNvbnRhaW5lck1vZGVsSUQgPSBnZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaW50IGNvbnRhaW5lclZpc3VhbElEOwotCQlpZiAoQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsKLQkJCWNvbnRhaW5lclZpc3VhbElEID0gZ2V0VmlzdWFsSUQoY29udGFpbmVyVmlldyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29udGFpbmVyVmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQljb250YWluZXJWaXN1YWxJRCA9IEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaW50IG5vZGVWaXN1YWxJRCA9IHNlbWFudGljSGludCAhPSBudWxsID8gZ2V0VmlzdWFsSUQoc2VtYW50aWNIaW50KQotCQkJCTogLTE7Ci0JCXN3aXRjaCAoY29udGFpbmVyVmlzdWFsSUQpIHsKLQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eUZpbmFsTm9kZV8xMDAxQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKE1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIE1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkTWVyZ2VOb2RlXzEwMDJDaGlsZE5vZGVJRChkb21haW5FbGVtZW50LAotCQkJCQlzZW1hbnRpY0hpbnQpOwotCQljYXNlIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEZvcmtOb2RlXzEwMDNDaGlsZE5vZGVJRChkb21haW5FbGVtZW50LAotCQkJCQlzZW1hbnRpY0hpbnQpOwotCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEluaXRpYWxOb2RlXzEwMDRDaGlsZE5vZGVJRChkb21haW5FbGVtZW50LAotCQkJCQlzZW1hbnRpY0hpbnQpOwotCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZERlY2lzaW9uTm9kZV8xMDA1Q2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRKb2luTm9kZV8xMDA2Q2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDdDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uXzEwMDhDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMENoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvbl8yMDAxQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSgoQWN0aXZpdHlQYXJ0aXRpb24pIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudF81MDAxQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFydGl0aW9uXzIwMDEoKEFjdGl2aXR5UGFydGl0aW9uKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRfNTAwMkNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RmluYWxOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5RmluYWxOb2RlXzEwMDEoKEFjdGl2aXR5RmluYWxOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lcmdlTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVNZXJnZU5vZGVfMTAwMigoTWVyZ2VOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEZvcmtOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUZvcmtOb2RlXzEwMDMoKEZvcmtOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdGlhbE5vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlSW5pdGlhbE5vZGVfMTAwNCgoSW5pdGlhbE5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVjaXNpb25Ob2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZURlY2lzaW9uTm9kZV8xMDA1KChEZWNpc2lvbk5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sm9pbk5vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlSm9pbk5vZGVfMTAwNigoSm9pbk5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8xMDA4KChBY3Rpdml0eVBhcnRpdGlvbikgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlfNzlDaGlsZE5vZGVJRChkb21haW5FbGVtZW50LAotCQkJCQlzZW1hbnRpY0hpbnQpOwotCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZENvbnRyb2xGbG93XzMwMDFMaW5rTGFiZWxJRChzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKGRvbWFpbkVsZW1lbnQsIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50LAotCQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpIHsKLQkJaWYgKFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRyb2xGbG93KCkuaXNTdXBlclR5cGVPZigKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNMaW5rV2l0aENsYXNzQ29udHJvbEZsb3dfMzAwMSgoQ29udHJvbEZsb3cpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJcmV0dXJuIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZExpbmtXaXRoQ2xhc3NJRChkb21haW5FbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWFncmFtQWN0aXZpdHlfNzkoQWN0aXZpdHkgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZERpYWdyYW1JRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSgKLQkJCUFjdGl2aXR5RmluYWxOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVNZXJnZU5vZGVfMTAwMihNZXJnZU5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUZvcmtOb2RlXzEwMDMoRm9ya05vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUluaXRpYWxOb2RlXzEwMDQoSW5pdGlhbE5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZURlY2lzaW9uTm9kZV8xMDA1KERlY2lzaW9uTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlSm9pbk5vZGVfMTAwNihKb2luTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KAotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcubWF0Y2hlcyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5UGFydGl0aW9uXzEwMDgoCi0JCQlBY3Rpdml0eVBhcnRpdGlvbiBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkoCi0JCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkubWF0Y2hlcyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCgKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwLm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEoCi0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMS5tYXRjaGVzKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIoCi0JCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIubWF0Y2hlcyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5UGFydGl0aW9uXzIwMDEoCi0JCQlBY3Rpdml0eVBhcnRpdGlvbiBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlGaW5hbE5vZGVfMTAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZE1lcmdlTm9kZV8xMDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkRm9ya05vZGVfMTAwM0NoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEluaXRpYWxOb2RlXzEwMDRDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWREZWNpc2lvbk5vZGVfMTAwNUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEpvaW5Ob2RlXzEwMDZDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDdDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvbl8xMDA4Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDlDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTBDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uXzIwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50XzUwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50XzUwMDJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eV83OUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZENvbnRyb2xGbG93XzMwMDFMaW5rTGFiZWxJRCgKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkTGlua1dpdGhDbGFzc0lEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpbmtXaXRoQ2xhc3NDb250cm9sRmxvd18zMDAxKENvbnRyb2xGbG93IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGNoZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID0gbmV3IE1hdGNoZXIoCi0JCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCXJldHVybiBKYXZhTWF0Y2hlcnMuZ2V0VW1hVHlwZV9BY3Rpdml0eShzZWxmKTsKLQkJCQl9Ci0JCQl9KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXRjaGVyIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID0gbmV3IE1hdGNoZXIoCi0JCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZiA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGNvbnRleHQ7Ci0JCQkJCXJldHVybiBKYXZhTWF0Y2hlcnMuZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvcihzZWxmKTsKLQkJCQl9Ci0JCQl9KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXRjaGVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfUGhhc2Uoc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgPSBuZXcgTWF0Y2hlcigKLQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGV4dDsKLQkJCQkJcmV0dXJuIEphdmFNYXRjaGVycy5nZXRVbWFUeXBlX0l0ZXJhdGlvbihzZWxmKTsKLQkJCQl9Ci0JCQl9KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXRjaGVyIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID0gbmV3IE1hdGNoZXIoCi0JCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZiA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGNvbnRleHQ7Ci0JCQkJCXJldHVybiBKYXZhTWF0Y2hlcnMuZ2V0VW1hVHlwZV9NaWxlc3RvbmUoc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCQotCSAqLwotCXN0YXRpYyBjbGFzcyBNYXRjaGVyIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAkKLQkJICovCi0JCXByaXZhdGUgVU1MQWJzdHJhY3RFeHByZXNzaW9uIGNvbmRpdGlvbjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAkKLQkJICovCi0JCU1hdGNoZXIoVU1MQWJzdHJhY3RFeHByZXNzaW9uIGNvbmRpdGlvbkV4cHJlc3Npb24pIHsKLQkJCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uRXhwcmVzc2lvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCQotCQkgKi8KLQkJYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvYmplY3QpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBjb25kaXRpb24uZXZhbHVhdGUob2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQgaW5zdGFuY2VvZiBCb29sZWFuCi0JCQkJCSYmICgoQm9vbGVhbikgcmVzdWx0KS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCX0vLyBNYXRjaGVyCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YU1hdGNoZXJzIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGdldFVtYVR5cGVfQWN0aXZpdHkoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0KLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX0FDVElWSVRZLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9BY3Rpdml0eScgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvcigKLQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZikgewotCQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCi0JCQlCb29sZWFuIGJsID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yJyBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBnZXRVbWFUeXBlX1BoYXNlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZikgewotCQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCi0JCQlCb29sZWFuIGJsID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9QSEFTRS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGJsLlRSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gYmw7Ci0JCQkvLwkJCXRocm93IG5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24uTm9JbXBsRXhjZXB0aW9uKAotCQkJLy8JCQkJCSJObyB1c2VyIGphdmEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaW4gJ2dldFVtYVR5cGVfUGhhc2UnIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGdldFVtYVR5cGVfSXRlcmF0aW9uKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZikgewotCQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9JdGVyYXRpb24nIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGdldFVtYVR5cGVfTWlsZXN0b25lKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0KLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX01JTEVTVE9ORS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGJsLlRSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gYmw7Ci0JCQkvLwkJCXRocm93IG5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24uTm9JbXBsRXhjZXB0aW9uKAotCQkJLy8JCQkJCSJObyB1c2VyIGphdmEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaW4gJ2dldFVtYVR5cGVfTWlsZXN0b25lJyBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfS8vIEphdmFNYXRjaGVycwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjRiZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwOTM3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjlmMmVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MjhjYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzZDI5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5QcmludGluZ1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWM0M2JmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuUnVsZXJHcmlkUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFhNjI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbml0ZW0uQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnV0aWwuSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcuYWN0aW9ucy5QcmludFByZXZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5FbmhhbmNlZFByaW50QWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQsCi0JCQlJV29ya2JlbmNoUGFydERlc2NyaXB0b3IgcGFydERlc2NyaXB0b3IpIHsKLQotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKFByaW50UHJldmlld0FjdGlvbi5JRCkpIHsKLQkJCXJldHVybiBuZXcgUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb24oCi0JCQkJCW5ldyBFbmhhbmNlZFByaW50QWN0aW9uSGVscGVyKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVBY3Rpb24oYWN0aW9uSWQsIHBhcnREZXNjcmlwdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2RlNjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZXhwcmVzc2lvbnMuVU1MQWJzdHJhY3RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEluaXRpYWxpemVycyB7Ci0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIElPYmplY3RJbml0aWFsaXplciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPSBuZXcgT2JqZWN0SW5pdGlhbGl6ZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkJCWFkZChjcmVhdGVFeHByZXNzaW9uRmVhdHVyZUluaXRpYWxpemVyKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRFTW9kZWxFbGVtZW50X0VBbm5vdGF0aW9ucygpLAotCQkJCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQkJCQlyZXR1cm4gSmF2YS5jcmVhdGVVbWFUeXBlX0FjdGl2aXR5KHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQkJCX0KLQkJfTsgLy8gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3IE9iamVjdEluaXRpYWxpemVyCQkKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSU9iamVjdEluaXRpYWxpemVyIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkJCWFkZChjcmVhdGVFeHByZXNzaW9uRmVhdHVyZUluaXRpYWxpemVyKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRFTW9kZWxFbGVtZW50X0VBbm5vdGF0aW9ucygpLAotCQkJCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBjb250ZXh0OwotCQkJCQkJCQlyZXR1cm4gSmF2YS5jcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yKHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQkJCX0KLQkJfTsgLy8gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgT2JqZWN0SW5pdGlhbGl6ZXIJCQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBJT2JqZWN0SW5pdGlhbGl6ZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJCQlhZGQoY3JlYXRlRXhwcmVzc2lvbkZlYXR1cmVJbml0aWFsaXplcihFY29yZVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSwKLQkJCQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGV4dDsKLQkJCQkJCQkJcmV0dXJuIEphdmEuY3JlYXRlVW1hVHlwZV9QaGFzZShzZWxmKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSk7Ci0JCQl9Ci0JCX07IC8vIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCBPYmplY3RJbml0aWFsaXplcgkJCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIElPYmplY3RJbml0aWFsaXplciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgPSBuZXcgT2JqZWN0SW5pdGlhbGl6ZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkJCWFkZChjcmVhdGVFeHByZXNzaW9uRmVhdHVyZUluaXRpYWxpemVyKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRFTW9kZWxFbGVtZW50X0VBbm5vdGF0aW9ucygpLAotCQkJCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQkJCQlyZXR1cm4gSmF2YS5jcmVhdGVVbWFUeXBlX0l0ZXJhdGlvbihzZWxmKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSk7Ci0JCQl9Ci0JCX07IC8vIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSBPYmplY3RJbml0aWFsaXplcgkJCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIElPYmplY3RJbml0aWFsaXplciBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9IG5ldyBPYmplY3RJbml0aWFsaXplcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJCQlhZGQoY3JlYXRlRXhwcmVzc2lvbkZlYXR1cmVJbml0aWFsaXplcihFY29yZVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSwKLQkJCQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgY29udGV4dDsKLQkJCQkJCQkJcmV0dXJuIEphdmEuY3JlYXRlVW1hVHlwZV9NaWxlc3RvbmUoc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSkpOwotCQkJfQotCQl9OyAvLyBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiBPYmplY3RJbml0aWFsaXplcgotCi0JCS8qKiAKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJbml0aWFsaXplcnMoKSB7Ci0JCX0KLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElPYmplY3RJbml0aWFsaXplciB7Ci0JCQkvKiogCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGluaXQoRU9iamVjdCBpbnN0YW5jZSk7Ci0JCX0KLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0SW5pdGlhbGl6ZXIgaW1wbGVtZW50cwotCQkJCUlPYmplY3RJbml0aWFsaXplciB7Ci0JCQkvKiogCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCWZpbmFsIEVDbGFzcyBlbGVtZW50OwotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIExpc3QgZmVhdHVyZUluaXRpYWxpemVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlPYmplY3RJbml0aWFsaXplcihFQ2xhc3MgZWxlbWVudCkgewotCQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJaW5pdCgpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOwotCi0JCQkvKiogCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBmaW5hbCBJRmVhdHVyZUluaXRpYWxpemVyIGFkZCgKLQkJCQkJSUZlYXR1cmVJbml0aWFsaXplciBpbml0aWFsaXplcikgewotCQkJCWZlYXR1cmVJbml0aWFsaXplcnMuYWRkKGluaXRpYWxpemVyKTsKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXI7Ci0JCQl9Ci0KLQkJCS8qKiAKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgaW5pdChFT2JqZWN0IGluc3RhbmNlKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVJbml0aWFsaXplcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlJRmVhdHVyZUluaXRpYWxpemVyIG5leHRFeHByID0gKElGZWF0dXJlSW5pdGlhbGl6ZXIpIGl0Ci0JCQkJCQkJLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5leHRFeHByLmluaXQoaW5zdGFuY2UpOwotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCQkiRmVhdHVyZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBvZiBPYmplY3RJbml0aWFsaXplcgotCi0JCS8qKiAKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJaW50ZXJmYWNlIElGZWF0dXJlSW5pdGlhbGl6ZXIgewotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXZvaWQgaW5pdChFT2JqZWN0IGNvbnRleHRJbnN0YW5jZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJc3RhdGljIElGZWF0dXJlSW5pdGlhbGl6ZXIgY3JlYXRlTmV3RWxlbWVudEZlYXR1cmVJbml0aWFsaXplcigKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgaW5pdEZlYXR1cmUsCi0JCQkJT2JqZWN0SW5pdGlhbGl6ZXJbXSBuZXdPYmplY3RJbml0aWFsaXplcnMpIHsKLQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gaW5pdEZlYXR1cmU7Ci0JCQlmaW5hbCBPYmplY3RJbml0aWFsaXplcltdIGluaXRpYWxpemVycyA9IG5ld09iamVjdEluaXRpYWxpemVyczsKLQkJCXJldHVybiBuZXcgSUZlYXR1cmVJbml0aWFsaXplcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBpbml0KEVPYmplY3QgY29udGV4dEluc3RhbmNlKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlFT2JqZWN0IG5ld0luc3RhbmNlID0gaW5pdGlhbGl6ZXJzW2ldLmVsZW1lbnQKLQkJCQkJCQkJLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZSgKLQkJCQkJCQkJCQlpbml0aWFsaXplcnNbaV0uZWxlbWVudCk7Ci0JCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCSgoQ29sbGVjdGlvbikgY29udGV4dEluc3RhbmNlLmVHZXQoZmVhdHVyZSkpCi0JCQkJCQkJCQkuYWRkKG5ld0luc3RhbmNlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29udGV4dEluc3RhbmNlLmVTZXQoZmVhdHVyZSwgbmV3SW5zdGFuY2UpOwotCQkJCQkJfQotCQkJCQkJaW5pdGlhbGl6ZXJzW2ldLmluaXQobmV3SW5zdGFuY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgSUZlYXR1cmVJbml0aWFsaXplciBjcmVhdGVFeHByZXNzaW9uRmVhdHVyZUluaXRpYWxpemVyKAotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBpbml0RmVhdHVyZSwKLQkJCQlVTUxBYnN0cmFjdEV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uKSB7Ci0JCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGluaXRGZWF0dXJlOwotCQkJZmluYWwgVU1MQWJzdHJhY3RFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YWx1ZUV4cHJlc3Npb247Ci0JCQlyZXR1cm4gbmV3IElGZWF0dXJlSW5pdGlhbGl6ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaW5pdChFT2JqZWN0IGNvbnRleHRJbnN0YW5jZSkgewotCQkJCQlleHByZXNzaW9uLmFzc2lnblRvKGZlYXR1cmUsIGNvbnRleHRJbnN0YW5jZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKiAKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJc3RhdGljIGNsYXNzIEphdmEgewotCi0JCQkvKioKLQkJCSAqIEBtb2RpZmllZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBFTGlzdDxFQW5ub3RhdGlvbj4gY3JlYXRlVW1hVHlwZV9BY3Rpdml0eSgKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkJcmV0dXJuIGdlbmVyaWNDcmVhdGVUeXBlKHNlbGYsIEJyaWRnZUhlbHBlci5VTUFfQUNUSVZJVFkpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBtb2RpZmllZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBFTGlzdDxFQW5ub3RhdGlvbj4gY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvcigKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYpIHsKLQkJCQlyZXR1cm4gZ2VuZXJpY0NyZWF0ZVR5cGUoc2VsZiwgQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBtb2RpZmllZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBFTGlzdDxFQW5ub3RhdGlvbj4gY3JlYXRlVW1hVHlwZV9QaGFzZSgKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0KLQkJCQlyZXR1cm4gZ2VuZXJpY0NyZWF0ZVR5cGUoc2VsZiwgQnJpZGdlSGVscGVyLlVNQV9QSEFTRSk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0PEVBbm5vdGF0aW9uPiBjcmVhdGVVbWFUeXBlX0l0ZXJhdGlvbigKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkJcmV0dXJuIGdlbmVyaWNDcmVhdGVUeXBlKHNlbGYsIEJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3Q8RUFubm90YXRpb24+IGNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lKAotCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZikgewotCQkJCXJldHVybiBnZW5lcmljQ3JlYXRlVHlwZShzZWxmLCBCcmlkZ2VIZWxwZXIuVU1BX01JTEVTVE9ORSk7Ci0JCQl9Ci0JCX0gLy9KYXZhCi0JfSAvLyBlbmQgb2YgSW5pdGlhbGl6ZXJzCi0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHNlbGYKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFTGlzdDxFQW5ub3RhdGlvbj4gZ2VuZXJpY0NyZWF0ZVR5cGUoQWN0aXZpdHlOb2RlIHNlbGYsIFN0cmluZyB0eXBlKXsKLQkJRUxpc3Q8RUFubm90YXRpb24+IGxpc3QgPSBCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHNlbGYsCXR5cGUpOwotCQlCcmlkZ2VIZWxwZXIuc2V0RGVmYXVsdE5hbWUoc2VsZik7Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MQWJzdHJhY3RQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MQWJzdHJhY3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwNjczZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEFic3RyYWN0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuU2V0VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuU2V0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVU1MQWJzdHJhY3RQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB2aWV3UGF0dGVybjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgdmlld1Byb2Nlc3NvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBlZGl0UGF0dGVybjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgZWRpdFByb2Nlc3NvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdQYXR0ZXJuKCkgewotCQlyZXR1cm4gdmlld1BhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiB2aWV3UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3UGF0dGVybihTdHJpbmcgdmlld1BhdHRlcm4pIHsKLQkJdGhpcy52aWV3UGF0dGVybiA9IHZpZXdQYXR0ZXJuOwotCQl2aWV3UHJvY2Vzc29yID0gY3JlYXRlVmlld1Byb2Nlc3Nvcih2aWV3UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZVZpZXdQcm9jZXNzb3IoU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdCh2aWV3UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFBhdHRlcm4oKSB7Ci0JCXJldHVybiBlZGl0UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIGVkaXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRQYXR0ZXJuKFN0cmluZyBlZGl0UGF0dGVybikgewotCQl0aGlzLmVkaXRQYXR0ZXJuID0gZWRpdFBhdHRlcm47Ci0JCWVkaXRQcm9jZXNzb3IgPSBjcmVhdGVFZGl0UHJvY2Vzc29yKGVkaXRQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgY3JlYXRlRWRpdFByb2Nlc3NvcihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlRm9ybWF0KGVkaXRQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmludFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgewotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGFkYXB0ZXIsIGZsYWdzLCBnZXRWaWV3UGF0dGVybigpLAotCQkJCWdldFZpZXdQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgewotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGFkYXB0ZXIsIGZsYWdzLCBnZXRFZGl0UGF0dGVybigpLAotCQkJCWdldEVkaXRQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlckVkaXRTdGF0dXMgaXNWYWxpZEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBlbGVtZW50LAotCQkJU3RyaW5nIGVkaXRTdHJpbmcpIHsKLQkJUGFyc2VQb3NpdGlvbiBwb3MgPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKLQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0RWRpdFByb2Nlc3NvcigpLnBhcnNlKGVkaXRTdHJpbmcsIHBvcyk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgIkludmFsaWQgaW5wdXQgYXQgIgotCQkJCQkJCSsgcG9zLmdldEVycm9ySW5kZXgoKSk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRlTmV3VmFsdWVzKHZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZU5ld1ZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgU3RyaW5nIG5ld1N0cmluZywKLQkJCWludCBmbGFncykgewotCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UobmV3U3RyaW5nLAotCQkJCW5ldyBQYXJzZVBvc2l0aW9uKDApKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsCi0JCQkJfHwgdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKS5nZXRDb2RlKCkgIT0gSVBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZUNvbW1hbmQoYWRhcHRlciwgdmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsCi0JCQlPYmplY3RbXSB2YWx1ZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKElBZGFwdGFibGUgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoRU9iamVjdCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVNldFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBTZXRSZXF1ZXN0KGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIG5ldyBTZXRWYWx1ZUNvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsaWRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7Ci0JCQlDbGFzcyBpQ2xhc3MgPSB0eXBlLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWlmIChTdHJpbmcuY2xhc3MuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZE5ld1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKEJvb2xlYW4uVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgQm9vbGVhbiBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZhbHVlID0gbmV3IENoYXJhY3RlcihzLmNoYXJBdCgwKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgQ2hhcmFjdGVyIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChCeXRlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBCeXRlKCgoTnVtYmVyKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEJ5dGUudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gQnl0ZSB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIEJ5dGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFNob3J0LlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgU2hvcnQoKChOdW1iZXIpIHZhbHVlKS5zaG9ydFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IFNob3J0LnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIFNob3J0IHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU2hvcnQgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEludGVnZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludGVnZXIoKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEludGVnZXIgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBJbnRlZ2VyIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChMb25nLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBMb25nKCgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IExvbmcudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gTG9uZyB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIExvbmcgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEZsb2F0LlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoKChOdW1iZXIpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEZsb2F0LnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEZsb2F0IHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgRmxvYXQgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKERvdWJsZS5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoKChOdW1iZXIpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBEb3VibGUudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRG91YmxlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgRG91YmxlIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgRUVudW0pIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSAoKEVFbnVtKSB0eXBlKQotCQkJCQkJCS5nZXRFRW51bUxpdGVyYWxCeUxpdGVyYWwoKFN0cmluZykgdmFsdWUpOwotCQkJCQlpZiAobGl0ZXJhbCA9PSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlVua25vd24gbGl0ZXJhbDogIiArIHZhbHVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZhbHVlID0gbGl0ZXJhbC5nZXRJbnN0YW5jZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIFN0cmluZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBJbnZhbGlkVmFsdWUgewotCi0JCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JCXB1YmxpYyBJbnZhbGlkVmFsdWUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxDb250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZWFiYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxDb250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25pdGVtLkFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnV0aWwuSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5hY3Rpb25zLlByaW50UHJldmlld0FjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLlJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQsCi0JCQlJV29ya2JlbmNoUGFydERlc2NyaXB0b3IgcGFydERlc2NyaXB0b3IpIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscyhQcmludFByZXZpZXdBY3Rpb24uSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uKAotCQkJCQluZXcgRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWN0aW9uKGFjdGlvbklkLCBwYXJ0RGVzY3JpcHRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEVkaXRQYXJ0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MRWRpdFBhcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTBkMGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MRWRpdFBhcnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkFic3RyYWN0RWRpdFBhcnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkNyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LklFZGl0UGFydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuVU1MRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxFZGl0UGFydFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NhY2hpbmc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFBhcnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFZpZXc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTEVkaXRQYXJ0UHJvdmlkZXIoKSB7Ci0JCXNldEZhY3RvcnkobmV3IFVNTEVkaXRQYXJ0RmFjdG9yeSgpKTsKLQkJc2V0QWxsb3dDYWNoaW5nKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgRWRpdFBhcnRGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGYWN0b3J5KEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWxsb3dDYWNoaW5nKCkgewotCQlyZXR1cm4gYWxsb3dDYWNoaW5nOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0QWxsb3dDYWNoaW5nKGJvb2xlYW4gYWxsb3dDYWNoaW5nKSB7Ci0JCXRoaXMuYWxsb3dDYWNoaW5nID0gYWxsb3dDYWNoaW5nOwotCQlpZiAoIWFsbG93Q2FjaGluZykgewotCQkJY2FjaGVkUGFydCA9IG51bGw7Ci0JCQljYWNoZWRWaWV3ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlFZGl0UGFydCBwYXJ0ID0gZmFjdG9yeS5jcmVhdGVFZGl0UGFydChudWxsLCB2aWV3KTsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENhY2hlZFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChjYWNoZWRWaWV3ICE9IG51bGwgJiYgY2FjaGVkVmlldy5nZXQoKSA9PSB2aWV3KSB7Ci0JCQlyZXR1cm4gKElHcmFwaGljYWxFZGl0UGFydCkgY2FjaGVkUGFydC5nZXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSkgewotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBnZXRDYWNoZWRQYXJ0KHZpZXcpOwotCQkJY2FjaGVkUGFydCA9IG51bGw7Ci0JCQljYWNoZWRWaWV3ID0gbnVsbDsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGFydDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlRWRpdFBhcnQodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uKSB7Ci0JCQlWaWV3IHZpZXcgPSAoKElFZGl0UGFydE9wZXJhdGlvbikgb3BlcmF0aW9uKS5nZXRWaWV3KCk7Ci0JCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE1vZGVsSUQodmlldykpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkgJiYgZ2V0Q2FjaGVkUGFydCh2aWV3KSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGNyZWF0ZUVkaXRQYXJ0KHZpZXcpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQkJCWNhY2hlZFBhcnQgPSBuZXcgV2Vha1JlZmVyZW5jZShwYXJ0KTsKLQkJCQkJY2FjaGVkVmlldyA9IG5ldyBXZWFrUmVmZXJlbmNlKHZpZXcpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MRWxlbWVudFR5cGVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEVsZW1lbnRUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRiYTFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MRWxlbWVudFR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZXhwcmVzc2lvbnMuVU1MQWJzdHJhY3RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5JY29uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5wcm92aWRlcnMuR2VvU2hhcGVJY29uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMuaW50ZXJuYWwucHJvdmlkZXJzLkdlb3NoYXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5JTm90YXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRWxlbWVudFR5cGVzIGV4dGVuZHMgRWxlbWVudEluaXRpYWxpemVycyB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVTUxFbGVtZW50VHlwZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBlbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgR2VvU2hhcGVJY29uUHJvdmlkZXIgZ2VvU2hhcGVJY29uUHJvdmlkZXIgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbWFnZVJlZ2lzdHJ5S2V5KEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcigKLQkJCUVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZWxlbWVudCk7Ci0JCQlFQ2xhc3MgZUNvbnRhaW5pbmdDbGFzcyA9IGZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzaWZpZXIgZVR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCQlpZiAoZUNvbnRhaW5pbmdDbGFzcyAhPSBudWxsICYmICFlQ29udGFpbmluZ0NsYXNzLmlzQWJzdHJhY3QoKSkgewotCQkJCWVsZW1lbnQgPSBlQ29udGFpbmluZ0NsYXNzOwotCQkJfSBlbHNlIGlmIChlVHlwZSBpbnN0YW5jZW9mIEVDbGFzcwotCQkJCQkmJiAhKChFQ2xhc3MpIGVUeXBlKS5pc0Fic3RyYWN0KCkpIHsKLQkJCQllbGVtZW50ID0gZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlbGVtZW50OwotCQkJaWYgKCFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcigKLQkJCQkJCQkJZUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmNyZWF0ZShlQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQkvLyBUT0RPIDogc3VwcG9ydCBzdHJ1Y3R1cmFsIGZlYXR1cmVzCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcga2V5ID0gZ2V0SW1hZ2VSZWdpc3RyeUtleShlbGVtZW50KTsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihJQWRhcHRhYmxlIGhpbnQpIHsKLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKElBZGFwdGFibGUgaGludCkgewotCQlpZihpc0dlb1NoYXBlKGhpbnQpKXsKLQkJCXJldHVybiBnZXRHZW9TaGFwZUljb25Qcm92aWRlcigpLmdldEljb24oKChJTm90YXRpb25UeXBlKWhpbnQpLmdldFNlbWFudGljSGludCgpKTsKLQkJfQotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBtb2RpZmllZCBTVEFSVAotCQlPYmplY3QgdHlwZSA9IGhpbnQuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlKGVsZW1lbnQsIChJRWxlbWVudFR5cGUpIHR5cGUpOwotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJLy8gbW9kaWZpZWQgRU5ECi0JCXJldHVybiBnZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICd0eXBlJyBvZiB0aGUgZWNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaGludC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFTmFtZWRFbGVtZW50IGdldEVsZW1lbnQoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCU9iamVjdCB0eXBlID0gaGludC5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKLQotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5Xzc5LCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5RmluYWxOb2RlXzEwMDEsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KE1lcmdlTm9kZV8xMDAyLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChGb3JrTm9kZV8xMDAzLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KEluaXRpYWxOb2RlXzEwMDQsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRJbml0aWFsTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KERlY2lzaW9uTm9kZV8xMDA1LCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGVjaXNpb25Ob2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoSm9pbk5vZGVfMTAwNiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sm9pbk5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uKCkpOwotCi0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDksIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uKCkpOwotCi0JCQllbGVtZW50cy5wdXQoQ29udHJvbEZsb3dfMzAwMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRyb2xGbG93KCkpOwotCQl9Ci0JCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eV83OSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eV83OSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eUZpbmFsTm9kZV8xMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIE1lcmdlTm9kZV8xMDAyID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLk1lcmdlTm9kZV8xMDAyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBGb3JrTm9kZV8xMDAzID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkZvcmtOb2RlXzEwMDMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEluaXRpYWxOb2RlXzEwMDQgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuSW5pdGlhbE5vZGVfMTAwNCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgRGVjaXNpb25Ob2RlXzEwMDUgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRGVjaXNpb25Ob2RlXzEwMDUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEpvaW5Ob2RlXzEwMDYgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuSm9pbk5vZGVfMTAwNiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIENvbnRyb2xGbG93XzMwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQ29udHJvbEZsb3dfMzAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoaWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTZXQgS05PV05fRUxFTUVOVF9UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLbm93bkVsZW1lbnRUeXBlKElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotCQlpZiAoS05PV05fRUxFTUVOVF9UWVBFUyA9PSBudWxsKSB7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTID0gbmV3IEhhc2hTZXQoKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5Xzc5KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5RmluYWxOb2RlXzEwMDEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoTWVyZ2VOb2RlXzEwMDIpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoRm9ya05vZGVfMTAwMyk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChJbml0aWFsTm9kZV8xMDA0KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKERlY2lzaW9uTm9kZV8xMDA1KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEpvaW5Ob2RlXzEwMDYpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5UGFydGl0aW9uXzEwMDgpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eVBhcnRpdGlvbl8yMDAxKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENvbnRyb2xGbG93XzMwMDEpOwotCQl9Ci0JCXJldHVybiBLTk9XTl9FTEVNRU5UX1RZUEVTLmNvbnRhaW5zKGVsZW1lbnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKEVOYW1lZEVsZW1lbnQgZWxlbWVudCwgSUVsZW1lbnRUeXBlIHR5cGUpIHsKLQkJU3RyaW5nIGtleSA9IHR5cGUuZ2V0SWQoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0KLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQkJaWYgKGtleS5lcXVhbHMoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3LmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9QaGFzZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMS5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyLmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihFTmFtZWRFbGVtZW50IGVsZW1lbnQsCi0JCQlJRWxlbWVudFR5cGUgdHlwZSkgewotCQlTdHJpbmcga2V5ID0gdHlwZS5nZXRJZCgpOwotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCQlpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMC5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L1BoYXNlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExLmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOS5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCQkJfSBlbHNlIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzR2VvU2hhcGUoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCWlmKGhpbnQgaW5zdGFuY2VvZiBJTm90YXRpb25UeXBlKXsKLQkJCVN0cmluZyB4ID0gKChJTm90YXRpb25UeXBlKWhpbnQpLmdldFNlbWFudGljSGludCgpOwotCQkJaWYoR2Vvc2hhcGVDb25zdGFudHMuZ2V0U3VwcG9ydGVkU2hhcGVzKCkuY29udGFpbnMoeCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBHZW9TaGFwZUljb25Qcm92aWRlciBnZXRHZW9TaGFwZUljb25Qcm92aWRlcigpewotCQlpZihnZW9TaGFwZUljb25Qcm92aWRlciA9PSBudWxsKXsKLQkJCWdlb1NoYXBlSWNvblByb3ZpZGVyID0gbmV3IEdlb1NoYXBlSWNvblByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGdlb1NoYXBlSWNvblByb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MSWNvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEljb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWJlMWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MSWNvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb24uR2V0SWNvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5JSWNvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxJY29uUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMgSUljb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oSUFkYXB0YWJsZSBoaW50LCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZShoaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldEljb25PcGVyYXRpb24pIHsKLQkJCXJldHVybiAoKEdldEljb25PcGVyYXRpb24pIG9wZXJhdGlvbikuZXhlY3V0ZSh0aGlzKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2QzMDk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMubW9kZWxpbmdhc3Npc3RhbnQuTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIGV4dGVuZHMgTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBNb2RpZmllZCB0byBzeW5jIG9yZGVyIHdpdGggdGhlIHBhbGV0dGUuCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JQb3B1cEJhcihJQWRhcHRhYmxlIGhvc3QpIHsKLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAotCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydCkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSk7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSk7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSk7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2UoSUFkYXB0YWJsZSBzb3VyY2UpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25UYXJnZXQoSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJQWRhcHRhYmxlIHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JTb3VyY2UoSUFkYXB0YWJsZSB0YXJnZXQsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudCh0YXJnZXQsIGdldFR5cGVzRm9yU291cmNlKHRhcmdldCwKLQkJCQlyZWxhdGlvbnNoaXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoc291cmNlLCBnZXRUeXBlc0ZvclRhcmdldChzb3VyY2UsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoSUFkYXB0YWJsZSBob3N0LCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCWlmICh0eXBlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldFJvb3QoKS5nZXRDb250ZW50cygpLmdldE1vZGVsKCk7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNBcHBsaWNhYmxlRWxlbWVudChlbGVtZW50LCB0eXBlcykpIHsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdEVsZW1lbnQoKEVPYmplY3RbXSkgZWxlbWVudHMudG9BcnJheShuZXcgRU9iamVjdFtlbGVtZW50cwotCQkJCS5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYWJsZUVsZW1lbnQoRU9iamVjdCBlbGVtZW50LCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCUlFbGVtZW50VHlwZSB0eXBlID0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRUeXBlKAotCQkJCWVsZW1lbnQpOwotCQlyZXR1cm4gdHlwZXMuY29udGFpbnModHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdEVsZW1lbnQoRU9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSk7Ci0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQlzaGVsbCwgbGFiZWxQcm92aWRlcik7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKCJBdmFpbGFibGUgZG9tYWluIG1vZGVsIGVsZW1lbnRzOiIpOwotCQlkaWFsb2cuc2V0VGl0bGUoIlNlbGVjdCBkb21haW4gbW9kZWwgZWxlbWVudCIpOwotCQlkaWFsb2cuc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotCQlkaWFsb2cuc2V0RWxlbWVudHMoZWxlbWVudHMpOwotCQlFT2JqZWN0IHNlbGVjdGVkID0gbnVsbDsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlzZWxlY3RlZCA9IChFT2JqZWN0KSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQYWxldHRlUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUGFsZXR0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZDJlNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQYWxldHRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5wYWxldHRlLklQYWxldHRlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxQYWxldHRlRmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxQYWxldHRlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhbGV0dGVQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUGFsZXR0ZShJRWRpdG9yUGFydCBlZGl0b3IsIE9iamVjdCBjb250ZW50LAotCQkJUGFsZXR0ZVJvb3Qgcm9vdCwgTWFwIHByZWRlZmluZWRFbnRyaWVzKSB7Ci0JCVVNTFBhbGV0dGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVU1MUGFsZXR0ZUZhY3RvcnkoKTsKLQkJZmFjdG9yeS5maWxsUGFsZXR0ZShyb290KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0aW9ucyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQkvLyBubyBjb25maWd1cmF0aW9uCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsgLy8gYWxsIGxvZ2ljIGlzIGRvbmUgaW4gdGhlIHNlcnZpY2UKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFBhcnNlclByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFBhcnNlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWUzOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQYXJzZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLkdldFBhcnNlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxQYXJzZXJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFyc2VyUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyID0gY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyID0gY3JlYXRlQWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBtZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldE1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpIHsKLQkJaWYgKG1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlciA9PSBudWxsKSB7Ci0JCQltZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXIgPSBjcmVhdGVNZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gbWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVNZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGluaXRpYWxOb2RlSW5pdGlhbE5vZGVOYW1lXzQwMDNQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldEluaXRpYWxOb2RlSW5pdGlhbE5vZGVOYW1lXzQwMDNQYXJzZXIoKSB7Ci0JCWlmIChpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyID09IG51bGwpIHsKLQkJCWluaXRpYWxOb2RlSW5pdGlhbE5vZGVOYW1lXzQwMDNQYXJzZXIgPSBjcmVhdGVJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxOb2RlSW5pdGlhbE5vZGVOYW1lXzQwMDNQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUluaXRpYWxOb2RlSW5pdGlhbE5vZGVOYW1lXzQwMDNQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGRlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0RGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyKCkgewotCQlpZiAoZGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyID09IG51bGwpIHsKLQkJCWRlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlciA9IGNyZWF0ZURlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBkZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZURlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyKCkgewotCQlpZiAoc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXIgPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXIgPSBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDdQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldEFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDdQYXJzZXIoKSB7Ci0JCWlmIChhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDdQYXJzZXIgPSBjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDdQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDdQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlciA9IGNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyKCkgewotCQlpZiAoc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXIgPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXIgPSBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcigpIHsKLQkJaWYgKHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyID09IG51bGwpIHsKLQkJCXN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyID0gY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIgPSBjcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldENvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIoKSB7Ci0JCWlmIChjb250cm9sRmxvd0NvbnRyb2xGbG93TmFtZV80MDEyUGFyc2VyID09IG51bGwpIHsKLQkJCWNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIgPSBjcmVhdGVDb250cm9sRmxvd0NvbnRyb2xGbG93TmFtZV80MDEyUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgZ2V0UGFyc2VyKGludCB2aXN1YWxJRCkgewotCQlzd2l0Y2ggKHZpc3VhbElEKSB7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIoKTsKLQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQljYXNlIE1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyKCk7Ci0JCWNhc2UgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldEluaXRpYWxOb2RlSW5pdGlhbE5vZGVOYW1lXzQwMDNQYXJzZXIoKTsKLQkJY2FzZSBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldERlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcigpOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyKCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyKCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXIoKTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXIoKTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXIoKTsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIoKTsKLQkJY2FzZSBDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0Q29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCVN0cmluZyB2aWQgPSAoU3RyaW5nKSBoaW50LmdldEFkYXB0ZXIoU3RyaW5nLmNsYXNzKTsKLQkJaWYgKHZpZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlkKSk7Ci0JCX0KLQkJVmlldyB2aWV3ID0gKFZpZXcpIGhpbnQuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldFBhcnNlck9wZXJhdGlvbikgewotCQkJSUFkYXB0YWJsZSBoaW50ID0gKChHZXRQYXJzZXJPcGVyYXRpb24pIG9wZXJhdGlvbikuZ2V0SGludCgpOwotCQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5nZXRFbGVtZW50KGhpbnQpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKGhpbnQpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUHJvcGVydHlQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGQzNzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLklQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMucHJvdmlkZXJzLkdlbmVyaWNFTUZQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUHJvcGVydHlQcm92aWRlciBleHRlbmRzIEdlbmVyaWNFTUZQcm9wZXJ0aWVzUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvcGVydGllc1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb24pIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKEdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uKSBvcGVyYXRpb24pCi0JCQkJCS5nZXRPYmplY3QoKTsKLQkJCXJldHVybiBnZXRTZW1hbnRpY0VsZW1lbnQob2JqZWN0KSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21wb3NpdGVQcm9wZXJ0eVNvdXJjZSBnZXRQcm9wZXJ0eVNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChvYmplY3QpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlTb3VyY2UoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNlbWFudGljRWxlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCVZpZXcgdmlldyA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQl2aWV3ID0gKFZpZXcpIG9iamVjdDsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iamVjdDsKLQkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVmlldykgewotCQkJCXZpZXcgPSAoVmlldykgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCQlpZiAodmlldyAhPSBudWxsCi0JCQkJJiYgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldE1vZGVsSUQodmlldykpKSB7Ci0JCQlyZXR1cm4gdmlldy5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjA3MTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIGV4dGVuZHMgVU1MQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZUZvcm1hdCBERUZBVUxUX1BST0NFU1NPUiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJInswfSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0Vmlld1Byb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRWaWV3UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRFZGl0UHJvY2Vzc29yKCkgewotCQlNZXNzYWdlRm9ybWF0IHByb2Nlc3NvciA9IHN1cGVyLmdldEVkaXRQcm9jZXNzb3IoKTsKLQkJcmV0dXJuIHByb2Nlc3NvciA9PSBudWxsID8gREVGQVVMVF9QUk9DRVNTT1IgOiBwcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldERvbWFpbkVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQllbGVtZW50ID0gZ2V0RG9tYWluRWxlbWVudChlbGVtZW50KTsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihlbGVtZW50LCBmZWF0dXJlLCBwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudCA9PSBudWxsID8gbnVsbCA6IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJdmFsdWUgPSBnZXRWYWxpZFZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQobmV3IE9iamVjdFtdIHsgdmFsdWUgfSwgbmV3IFN0cmluZ0J1ZmZlcigpLAotCQkJCW5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoID4gMSkgewotCQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRV9TVEFUVVM7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJZWxlbWVudCA9IGdldERvbWFpbkVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJSUNvbW1hbmQgY29tbWFuZCA9IGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sIGNvbW1hbmQKLQkJCQkuZ2V0TGFiZWwoKSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb21tYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlyZXR1cm4gaXNBZmZlY3RpbmdGZWF0dXJlKCgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWZmZWN0aW5nRmVhdHVyZShPYmplY3QgZXZlbnRGZWF0dXJlKSB7Ci0JCXJldHVybiBmZWF0dXJlID09IGV2ZW50RmVhdHVyZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjNjg4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyIGV4dGVuZHMgVU1MQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBmZWF0dXJlczsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyKExpc3QgZmVhdHVyZXMpIHsKLQkJdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoZmVhdHVyZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJdmFsdWUgPSBnZXRWYWxpZFZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KHZhbHVlcy50b0FycmF5KG5ldyBPYmplY3RbdmFsdWVzLnNpemUoKV0pLAotCQkJCW5ldyBTdHJpbmdCdWZmZXIoKSwgbmV3IEZpZWxkUG9zaXRpb24oMCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZVZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcy5sZW5ndGggIT0gZmVhdHVyZXMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFX1NUQVRVUzsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZSgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkuZ2V0KGkpLCB2YWx1ZXNbaV0pOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgIlNldCBWYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQljb21tYW5kCi0JCQkJCS5jb21wb3NlKGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlPYmplY3QgZmVhdHVyZSA9ICgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MVmlld1Byb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFZpZXdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWE5MTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MVmlld1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuQWJzdHJhY3RWaWV3UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5Db250cm9sRmxvd05hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5Db250cm9sRmxvd1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkRlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5EZWNpc2lvbk5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5Gb3JrTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkluaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkluaXRpYWxOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuSm9pbk5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5NZXJnZU5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuTWVyZ2VOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFZpZXdQcm92aWRlciBleHRlbmRzIEFic3RyYWN0Vmlld1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoZGlhZ3JhbUtpbmQpCi0JCQkJJiYgVU1MVmlzdWFsSURSZWdpc3RyeS5nZXREaWFncmFtVmlzdWFsSUQoc2VtYW50aWNFbGVtZW50KSAhPSAtMSkgewotCQkJcmV0dXJuIEFjdGl2aXR5Vmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXROb2RlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCWlmIChjb250YWluZXJWaWV3ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhVU1MRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUsIHNlbWFudGljSGludCk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBNZXJnZU5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIE1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBGb3JrTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEluaXRpYWxOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEluaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBEZWNpc2lvbk5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIERlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBKb2luTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIENvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRnZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIVVNTEVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKHNlbWFudGljVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbGlua1ZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlKTsKLQkJc3dpdGNoIChsaW5rVklEKSB7Ci0JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQ29udHJvbEZsb3dWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKHNlbWFudGljQWRhcHRlciwKLQkJCQljb250YWluZXJWaWV3LCBzZW1hbnRpY0hpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElFbGVtZW50VHlwZSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyKSB7Ci0JCWlmIChzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ2xhc3MgZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCS8vIEhhbmRsZSB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBjbGFzc2VzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGYwNmYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExhYmVsVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNSkpOwotCQlyZXR1cm4gdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyZDc2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmVlYjk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ4ZTI3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmOTAzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQ0NTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTk5MmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjE0MmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5I2NyZWF0ZVZpZXcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbiwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCQlOb2RlIHZpZXcgPSAoTm9kZSkgc3VwZXIuY3JlYXRlVmlldyhzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNIaW50LCBpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCUlNYXBNb2RlIG1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZShjb250YWluZXJWaWV3Ci0JCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoMCkpOwotCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDUpKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0NjM4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTU1NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5MaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkZpZ3VyZVV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRyYXdlclN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxheW91dENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5UaXRsZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJTGlzdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU29ydGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyaW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJc2V0dXBDb21wYXJ0bWVudFRpdGxlKHZpZXcpOwotCQlzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKHZpZXcpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0Q29uc3RyYWludCBjcmVhdGVMYXlvdXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyhWaWV3IHZpZXcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyh2aWV3KTsKLQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIGdldFByZWZlcmVuY2VzSGludCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIGZpbGwgY29sb3IKLQkJUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLAotCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7Ci0JCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksIEZpZ3VyZVV0aWxpdGllcwotCQkJCS5SR0JUb0ludGVnZXIoZmlsbFJHQikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50VGl0bGUoVmlldyB2aWV3KSB7Ci0JCVRpdGxlU3R5bGUgdGl0bGVTdHlsZSA9IChUaXRsZVN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGl0bGVTdHlsZSgpKTsKLQkJaWYgKHRpdGxlU3R5bGUgIT0gbnVsbCkgewotCQkJdGl0bGVTdHlsZS5zZXRTaG93VGl0bGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZChWaWV3IHZpZXcpIHsKLQkJRHJhd2VyU3R5bGUgZHJhd2VyU3R5bGUgPSAoRHJhd2VyU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREcmF3ZXJTdHlsZSgpKTsKLQkJaWYgKGRyYXdlclN0eWxlICE9IG51bGwpIHsKLQkJCWRyYXdlclN0eWxlLnNldENvbGxhcHNlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiMjMyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5MaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkZpZ3VyZVV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRyYXdlclN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxheW91dENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5UaXRsZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCXNldHVwQ29tcGFydG1lbnRUaXRsZSh2aWV3KTsKLQkJc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZCh2aWV3KTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dENvbnN0cmFpbnQgY3JlYXRlTGF5b3V0Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMoVmlldyB2aWV3KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXModmlldyk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBnZXRQcmVmZXJlbmNlc0hpbnQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQkvLyBmaWxsIGNvbG9yCi0JCVJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwKLQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOwotCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLCBGaWd1cmVVdGlsaXRpZXMKLQkJCQkuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudFRpdGxlKFZpZXcgdmlldykgewotCQlUaXRsZVN0eWxlIHRpdGxlU3R5bGUgPSAoVGl0bGVTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlU3R5bGUoKSk7Ci0JCWlmICh0aXRsZVN0eWxlICE9IG51bGwpIHsKLQkJCXRpdGxlU3R5bGUuc2V0U2hvd1RpdGxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQoVmlldyB2aWV3KSB7Ci0JCURyYXdlclN0eWxlIGRyYXdlclN0eWxlID0gKERyYXdlclN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHJhd2VyU3R5bGUoKSk7Ci0JCWlmIChkcmF3ZXJTdHlsZSAhPSBudWxsKSB7Ci0JCQlkcmF3ZXJTdHlsZS5zZXRDb2xsYXBzZWQoZmFsc2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjOTM5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5Vmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNDE5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuRGlhZ3JhbVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTWVhc3VyZW1lbnRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5Vmlld0ZhY3RvcnkgZXh0ZW5kcyBEaWFncmFtVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFnZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IHZpZXcsIElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyh2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIGRpYWdyYW1LaW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lYXN1cmVtZW50VW5pdCBnZXRNZWFzdXJlbWVudFVuaXQoKSB7Ci0JCXJldHVybiBNZWFzdXJlbWVudFVuaXQuUElYRUxfTElURVJBTDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Db250cm9sRmxvd05hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWYwYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd05hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93Vmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0ZGI3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5TdHJpbmdTdGF0aWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJRGVidWdPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJU3RhdHVzQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5Db25uZWN0aW9uVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5CZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dWaWV3RmFjdG9yeSBleHRlbmRzIENvbm5lY3Rpb25WaWV3RmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0Jc3RhdGljIHsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX1VOUFJPVEVDVEVELCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fTk9USUZJQ0FUSU9OUywgQm9vbGVhbi5UUlVFKTsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX1RSSUdHRVJTLCBCb29sZWFuLlRSVUUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvdXRpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZShzZW1hbnRpY0FkYXB0ZXIsIHZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudmlldy5mYWN0b3JpZXMuVmlld0ZhY3RvcnkjY3JlYXRlVmlldyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldywgamF2YS5sYW5nLlN0cmluZywgaW50LCBib29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqIAotCSAqIE92ZXJyaWRlIGNyZWF0ZVZpZXcgc2luY2UgdGhlcmUgaXMgYSBidWcgaW4gCi0JICogb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5Db25uZWN0aW9uVmlld0ZhY3RvcnkuamF2YQotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoZmluYWwgSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlmaW5hbCBWaWV3IGNvbnRhaW5lclZpZXcsIGZpbmFsIFN0cmluZyBzZW1hbnRpY0hpbnQsCi0JCQlmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJZmluYWwgUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCi0JCXNldFByZWZlcmVuY2VzSGludChwcmVmZXJlbmNlc0hpbnQpOwotCi0JCWZpbmFsIEVkZ2UgZWRnZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWRnZSgpOwotCQlMaXN0IHN0eWxlcyA9IGNyZWF0ZVN0eWxlcyhlZGdlKTsKLQkJaWYgKHN0eWxlcy5zaXplKCkgPiAwKSB7Ci0JCQllZGdlLmdldFN0eWxlcygpLmFkZEFsbChzdHlsZXMpOwotCQl9Ci0KLQkJQmVuZHBvaW50cyBiZW5kUG9pbnRzID0gY3JlYXRlQmVuZHBvaW50cygpOwotCQlpZiAoYmVuZFBvaW50cyAhPSBudWxsKSB7Ci0JCQllZGdlLnNldEJlbmRwb2ludHMoYmVuZFBvaW50cyk7Ci0JCX0KLQotCQlFT2JqZWN0IHNlbWFudGljRWwgPSBzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCA/IG51bGwKLQkJCQk6IChFT2JqZWN0KSBzZW1hbnRpY0FkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJaWYgKHNlbWFudGljRWwgPT0gbnVsbCkKLQkJCS8vIGVuZm9yY2UgYSBzZXQgdG8gTlVMTAotCQkJZWRnZS5zZXRFbGVtZW50KG51bGwpOwotCQllbHNlIGlmIChyZXF1aXJlc0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3KSkgewotCQkJZWRnZS5zZXRFbGVtZW50KHNlbWFudGljRWwpOwotCQl9Ci0KLQkJZWRnZS5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0KLQkJLy8gZGVjb3JhdGUgdmlldyBhc3N1bWVzIHRoZSB2aWV3IGhhZCBiZWVuIGluc2VydGVkIGFscmVhZHksIHNvIAotCQkvLyB3ZSBoYWQgdG8gY2FsbCBpbnNlcnQgY2hpbGQgYmVmb3JlIGNhbGxpbmcgZGVjb3JhdGUgdmlldwotCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgaW5kZXgsIHBlcnNpc3RlZCk7Ci0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gZ2V0RWRpdGluZ0RvbWFpbihzZW1hbnRpY0VsLAotCQkJCWNvbnRhaW5lclZpZXcpOwotCi0JCWlmIChkb21haW4gIT0gbnVsbCkgewotCQkJaWYgKGlzVW5Qcm90ZWN0ZWRTaWxlbnRUcmFuc2FjdGlvbkluUHJvZ3Jlc3MoZG9tYWluKSkgewotCQkJCS8vIGRlY29yYXRlIHZpZXcgaGFkIHRvIHJ1biBhcyBhIHNpbGVudCBvcGVyYXRpb24gb3RoZXIgd2lzZQotCQkJCS8vIGl0IHdpbGwgZ2VuZXJhdGUgdG9vIG1hbnkgZXZlbnRzCi0JCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHRydWUpOwotCi0JCQl9IGVsc2UgewotCQkJCUFic3RyYWN0RU1GT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbigKLQkJCQkJCWRvbWFpbiwgU3RyaW5nU3RhdGljcy5CTEFOSywgb3B0aW9ucykgewotCi0JCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCWRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHRydWUpOwotCi0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJb3BlcmF0aW9uLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UuY2F0Y2hpbmcoRGlhZ3JhbVVJUGx1Z2luLmdldEluc3RhbmNlKCksCi0JCQkJCQkJRGlhZ3JhbVVJRGVidWdPcHRpb25zLkVYQ0VQVElPTlNfQ0FUQ0hJTkcsCi0JCQkJCQkJZ2V0Q2xhc3MoKSwgImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlMb2cud2FybmluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlTdGF0dXNDb2Rlcy5JR05PUkVEX0VYQ0VQVElPTl9XQVJOSU5HLAotCQkJCQkJCSJjcmVhdGVWaWV3IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWRnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9EZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9EZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiNGQzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9EZWNpc2lvbk5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM3N2FmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9EZWNpc2lvbk5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0ZvcmtOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Gb3JrTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTBlMTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0ZvcmtOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRm9ya05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDdmN2EzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExhYmVsVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNSkpOwotCQlyZXR1cm4gdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0luaXRpYWxOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUwNzZiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZShzZW1hbnRpY0FkYXB0ZXIsIHZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSm9pbk5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0pvaW5Ob2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmZTNkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSm9pbk5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9NZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9NZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0ZjE3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9NZXJnZU5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQwYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9NZXJnZU5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoc2VtYW50aWNBZGFwdGVyLCB2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmY2YWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjMyZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2EzNGEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTI5ZWUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiYjdlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2MTZkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1ZGY2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQgcGx1Zy1pbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2RlYnVnPWZhbHNlCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgb2YgdmlzdWFsSUQgcHJvY2Vzc2luZwotb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2RlYnVnL3Zpc3VhbElEPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTc2ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2ZmMxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnNlcnZpY2UKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5nZWY7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDkyZGI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Sb2xlRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Sb2xlRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OGM3YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vVGFza0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVhOGNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9kbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9kbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2U2NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZGxjbDE2L3Jlc2V0X2RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQ0YzEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2R0b29sMTYvQURERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2VsY2wxNi9yZXNldF9kaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2VsY2wxNi9yZXNldF9kaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5YzhjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9lbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9ldG9vbDE2L0FEREVkaXRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9ldG9vbDE2L0FEREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjc5MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY3NmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjg1ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbWVzc2FnZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJlOTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI05MU19NRVNTQUdFRk9STUFUX1ZBUgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTyBORUVEIFRPIFRSQU5TTEFURSBGT0xMT1dJTkcgUFJPUEVSVElFUywgU0lOQ0UgV0UgRE9OJ1QgVVNFIElUIEZPUiBUSElTIFJFTEVBU0UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUT0RPOiBtYW51YWxseSBwdXQga2V5cyBhbmQgdmFsdWVzCi1zRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlPUZhaWxlZCB0byBsb2FkIG1vZGVsIGZpbGUgezB9Ci1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzaz1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbCBmaWxlcwotRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZT1VcGRhdGluZyBjYWNoZSBmYWlsZWQKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZD1GYWlsZWQgdG8gcmVmcmVzaCBoaWVyYXJjaHkgZm9yIGNoYW5nZWQgcmVzb3VyY2UKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I9ezF9Ci1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yPVVuYWJsZSB0byBsb2FkIGRpYWdyYW0gcmVzb3VyY2UKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcj1EaWFncmFtIGlzIG5vdCBwcmVzZW50IGluIHJlc291cmNlCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yPUVycm9yIGxvYWRpbmcgZGlhZ3JhbQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yPVRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s9U2F2aW5nIGRpYWdyYW0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrPVNhdmluZyB7MH0KLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCi1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlPU1vZGVsIGZpbGUgbG9hZGluZyBmYWlsZWQKLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGU9SW5pdGlhbGl6ZSBuZXcgezB9IGRpYWdyYW0gZmlsZQotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9PcGVuTW9kZWxGaWxlRGlhbG9nVGl0bGU9U2VsZWN0IGRvbWFpbiBtb2RlbAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU9SW5pdGlhbGl6ZSBuZXcgZGlhZ3JhbSBmaWxlCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGU9RGlhZ3JhbSBmaWxlCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBkaWFncmFtIGJhc2VkIG9uIHswfSBtb2RlbCBjb250ZW50Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lPVNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGU9RGlhZ3JhbSByb290IGVsZW1lbnQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uPVNlbGVjdCBzZW1hbnRpYyBtb2RlbCBlbGVtZW50IHRvIGJlIGRlcGljdGVkIG9uIGRpYWdyYW0KLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlPVNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudDoKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZT1EaWFncmFtIHJvb3QgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlPUludmFsaWQgZGlhZ3JhbSByb290IGVsZW1lbnQgaXMgc2VsZWN0ZWQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQ9SW5pdGlhbGl6aW5nIGRpYWdyYW0gY29udGVudHMKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3I9SW5jb3JyZWN0IG1vZGVsIG9iamVjdCBzdG9yZWQgYXMgYSByb290IHJlc291cmNlIG9iamVjdAotTm9kZXMxR3JvdXBfdGl0bGU9Tm9kZXMKLUxpbmtzMkdyb3VwX3RpdGxlPUxpbmtzCi1Sb2xlTm9kZTFDcmVhdGlvblRvb2xfdGl0bGU9Um9sZU5vZGUKLVJvbGVOb2RlMUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgUm9sZU5vZGUKLVJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF90aXRsZT1Sb2xlVGFza0NvbXBvc2l0ZQotUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBSb2xlVGFza0NvbXBvc2l0ZQotVGFza05vZGUzQ3JlYXRpb25Ub29sX3RpdGxlPVRhc2tOb2RlCi1UYXNrTm9kZTNDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFRhc2tOb2RlCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlNENyZWF0aW9uVG9vbF90aXRsZT1Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlNENyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgV29ya1Byb2R1Y05vZGUKLVdvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbF90aXRsZT1Xb3JrUHJvZHVjdENvbXBvc2l0ZQotV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZQotTGluazFDcmVhdGlvblRvb2xfdGl0bGU9TGluawotTGluazFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IGxpbmsKLVJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlPVJvbGVUYXNrQ29tcGFydG1lbnQKLVdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlPVdvcmtQcm9kdWN0Q29tcGFydG1lbnQKLQotQ29tbWFuZE5hbWVfT3BlbkRpYWdyYW09T3BlbiBEaWFncmFtCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODgzYjMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbCIgcGFja2FnZU5hbWVQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCIKLSAgICBtb2RlbElEPSJBREQiCi0gICAgc2FtZUZpbGVGb3JEaWFncmFtQW5kTW9kZWw9InRydWUiCi0gICAgZGlhZ3JhbUZpbGVFeHRlbnNpb249ImFkZCIKLSAgICB0ZW1wbGF0ZURpcmVjdG9yeT0iIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5Ij4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtIi8+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJSb2xlTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlJvbGVOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFJvbGVOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgUm9sZU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFJPTEVOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtmaWdfMC5zZXRGb250KCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTtST0xFTk9ERU5BTUVGSUdVUkVfRk9OVCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZSb2xlTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlJvbGVOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUm9sZU5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgUk9MRU5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgUk9MRU5PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1JvbGVOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJUYXNrTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlRhc2tOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJUYXNrTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlRhc2tOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFRhc2tOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgVGFza05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGluZVdpZHRoKDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoVEFTS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZpZ18wLnNldEZvbnQoJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5O1RBU0tOT0RFTkFNRUZJR1VSRV9GT05UKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlRhc2tOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmVGFza05vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZUYXNrTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFRBU0tOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBUQVNLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvVGFza05vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlRhc2tOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7V09SS1BST0RVQ1ROT0RFTkFNRUZJR1VSRV9GT05UKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFdPUktQUk9EVUNUTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDMiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJUT09MQkFSX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFNwYWNpbmcoNSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0VmVydGljYWwoZmFsc2UpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3g5OyYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iVE9PTEJBUl9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTcGFjaW5nKDUpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFZlcnRpY2FsKHRydWUpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3g5OyYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyMDUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtWaWV3RmFjdG9yeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJMaW5rRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIExpbmtGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluayIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA0IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJSb2xlTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlRhc2tOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFza05vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y05vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9IkxpbmtzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkxpbmsiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBsaW5rIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIgotICAgICAgbmFtZT0iQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gUGx1Z2luIgotICAgICAgcHJvdmlkZXI9IkVQRiIKLSAgICAgIHByaW50aW5nRW5hYmxlZD0idHJ1ZSIKLSAgICAgIGFjdGl2YXRvckNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luIi8+Ci0gIDxlZGl0b3IKLSAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIi8+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvIi8+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZmdyYXBoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZncmFwaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxMjVjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZmdyYXBoCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ3JhcGg6Q2FudmFzIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ3JhcGg9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR3JhcGhpY2FsRGVmaW5pdGlvbiIgbmFtZT0ibW9kZWwiPgotICA8ZmlndXJlcwotICAgICAgbmFtZT0iRGVmYXVsdCI+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iUm9sZU5vZGUiCi0gICAgICAgIG5hbWU9IlJvbGVOb2RlRmlndXJlIgotICAgICAgICBvdXRsaW5lPSJmYWxzZSI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iUm9sZU5vZGVOYW1lIgotICAgICAgICAgIG5hbWU9IlJvbGVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICB0ZXh0PSImbHQ7Li4uPiI+Ci0gICAgICAgIDxmb250Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6QmFzaWNGb250IgotICAgICAgICAgICAgZmFjZU5hbWU9IkFyaWFsIgotICAgICAgICAgICAgaGVpZ2h0PSI4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjI1NSIKLSAgICAgICAgICBncmVlbj0iMjU1IgotICAgICAgICAgIGJsdWU9IjE1NiIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgbmFtZT0iUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUiPgotICAgICAgPGxheW91dAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpGbG93TGF5b3V0IgotICAgICAgICAgIGZvcmNlU2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICBtYWpvckFsaWdubWVudD0iQ0VOVEVSIgotICAgICAgICAgIG1pbm9yQWxpZ25tZW50PSJDRU5URVIiCi0gICAgICAgICAgbWlub3JTcGFjaW5nPSIyMCIvPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjI1NSIKLSAgICAgICAgICBncmVlbj0iMjU1IgotICAgICAgICAgIGJsdWU9IjE1NiIvPgotICAgICAgPGJvcmRlcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpNYXJnaW5Cb3JkZXIiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iVGFza05vZGUiCi0gICAgICAgIG5hbWU9IlRhc2tOb2RlRmlndXJlIgotICAgICAgICBvdXRsaW5lPSJmYWxzZSIKLSAgICAgICAgbGluZVdpZHRoPSIwIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJUYXNrTm9kZU5hbWUiCi0gICAgICAgICAgbmFtZT0iVGFza05vZGVOYW1lRmlndXJlIgotICAgICAgICAgIHRleHQ9IiZsdDsuLi4+Ij4KLSAgICAgICAgPGZvbnQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpCYXNpY0ZvbnQiCi0gICAgICAgICAgICBmYWNlTmFtZT0iQXJpYWwiCi0gICAgICAgICAgICBoZWlnaHQ9IjgiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgYmx1ZT0iMTU2Ii8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUiCi0gICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJXb3JrUHJvZHVjdE5vZGVOYW1lIgotICAgICAgICAgIG5hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iJmx0Oy4uLj4iPgotICAgICAgICA8Zm9udAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkJhc2ljRm9udCIKLSAgICAgICAgICAgIGZhY2VOYW1lPSJBcmlhbCIKLSAgICAgICAgICAgIGhlaWdodD0iOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICBibHVlPSIyMDUiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgIG5hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIj4KLSAgICAgIDxsYXlvdXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Rmxvd0xheW91dCIKLSAgICAgICAgICB2ZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICBmb3JjZVNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgbWFqb3JBbGlnbm1lbnQ9IkNFTlRFUiIKLSAgICAgICAgICBtaW5vckFsaWdubWVudD0iQ0VOVEVSIgotICAgICAgICAgIG1pbm9yU3BhY2luZz0iMjAiLz4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICBibHVlPSIyMDUiLz4KLSAgICAgIDxib3JkZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TWFyZ2luQm9yZGVyIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZUNvbm5lY3Rpb24iCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkxpbmsiCi0gICAgICAgIG5hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgIHRhcmdldERlY29yYXRpb249Ik9wZW5BcnJvdyI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVEZWNvcmF0aW9uIgotICAgICAgICAgIG5hbWU9Ik9wZW5BcnJvdyI+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICB5PSIxIi8+Ci0gICAgICAgIDx0ZW1wbGF0ZS8+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICB5PSItMSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJMaW5rTmFtZUxhYmVsIgotICAgICAgICAgIG5hbWU9IkxpbmtOYW1lRmlndXJlIi8+Ci0gICAgICA8Zm9yZWdyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgdmFsdWU9ImJsYWNrIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDdXN0b21GaWd1cmUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlJvbGVUYXNrQ29tcGFydG1lbnQgV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIKLSAgICAgICAgbmFtZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiCi0gICAgICAgIHF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIgotICAgICAgICBidW5kbGVOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMiLz4KLSAgPC9maWd1cmVzPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IlJvbGVOb2RlIgotICAgICAgZmlndXJlPSJSb2xlTm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IlRhc2tOb2RlIgotICAgICAgZmlndXJlPSJUYXNrTm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICBmaWd1cmU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgIGZpZ3VyZT0iUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgIGZpZ3VyZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUiLz4KLSAgPGNvbm5lY3Rpb25zCi0gICAgICBuYW1lPSJMaW5rIgotICAgICAgZmlndXJlPSJMaW5rRmlndXJlIi8+Ci0gIDxjb21wYXJ0bWVudHMKLSAgICAgIG5hbWU9IlJvbGVUYXNrQ29tcGFydG1lbnQiCi0gICAgICBmaWd1cmU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4Ii8+Ci0gIDxjb21wYXJ0bWVudHMKLSAgICAgIG5hbWU9IldvcmtQcm9kdWN0Q29tcGFydG1lbnQiCi0gICAgICBmaWd1cmU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4Ii8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IlJvbGVOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iUm9sZU5vZGVOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IlRhc2tOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iVGFza05vZGVOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTGlua05hbWVMYWJlbCIKLSAgICAgIGZpZ3VyZT0iTGlua05hbWVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLTwvZ21mZ3JhcGg6Q2FudmFzPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZtYXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmMzZhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZm1hcDpNYXBwaW5nIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z21mbWFwPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L21hcHBpbmdzIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1JvbGVUYXNrQ29tcG9zaXRlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4xIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgIDxjaGlsZHJlbj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPG93bmVkQ2hpbGQ+Ci0gICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Sb2xlTm9kZSIvPgotICAgICAgICAgIDxsYWJlbE1hcHBpbmdzPgotICAgICAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlTm9kZU5hbWUiLz4KLSAgICAgICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjAiLz4KLSAgICAgICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVOb2RlIi8+Ci0gICAgICAgIDwvb3duZWRDaGlsZD4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxvd25lZENoaWxkPgotICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vVGFza05vZGUiLz4KLSAgICAgICAgICA8bGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjVGFza05vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4yIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNUYXNrTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cz4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZVRhc2tDb21wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy40Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgIDxjaGlsZHJlbj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPG93bmVkQ2hpbGQ+Ci0gICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Tm9kZU5hbWUiLz4KLSAgICAgICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjMiLz4KLSAgICAgICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLz4KLSAgICAgICAgPC9vd25lZENoaWxkPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjb21wYXJ0bWVudHM+Ci0gICAgICAgIDxjb21wYXJ0bWVudAotICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Q29tcGFydG1lbnQiLz4KLSAgICAgIDwvY29tcGFydG1lbnRzPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluayIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNMaW5rTmFtZUxhYmVsIi8+Ci0gICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay9uYW1lIi8+Ci0gICAgPC9sYWJlbE1hcHBpbmdzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgIDx0b29sCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjTGluayIvPgotICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlIi8+Ci0gICAgPGxpbmtNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNtb2RlbCIvPgotICAgIDxkb21haW5Nb2RlbAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8iLz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mdG9vbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mdG9vbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2MWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZnRvb2wKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZnRvb2w6VG9vbFJlZ2lzdHJ5IHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxwYWxldHRlPgotICAgIDx0b29scwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiCi0gICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgY29sbGFwc2libGU9InRydWUiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJSb2xlTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVUYXNrQ29tcG9zaXRlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iVGFza05vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFza05vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWNOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgIDwvdG9vbHM+Ci0gICAgPHRvb2xzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCIKLSAgICAgICAgdGl0bGU9IkxpbmtzIgotICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSI+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkxpbmsiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgbGluayIvPgotICAgIDwvdG9vbHM+Ci0gIDwvcGFsZXR0ZT4KLTwvZ21mdG9vbDpUb29sUmVnaXN0cnk+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMi5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMi5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzcxNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDIuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsNTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbC8yLjAiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciCi0gICAgICB2YWxpZGF0aW9uUHJvdmlkZXJQcmlvcml0eT0iTG93Ij4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtIi8+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlJvbGVOb2RlQ3JlYXRlQ29tbWFuZCIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlJvbGVOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iUm9sZU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgUm9sZU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBSb2xlTm9kZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFJPTEVOT0RFRklHVVJFX0JBQ0smI3hBOyk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7JiN4QTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgcm9sZU5vZGVOYW1lRmlndXJlMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hBO3JvbGVOb2RlTmFtZUZpZ3VyZTAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4QTsmI3hBO3JvbGVOb2RlTmFtZUZpZ3VyZTAuc2V0Rm9udChSb2xlTm9kZU5hbWVGaWd1cmVfRk9OVCk7JiN4QTsmI3hBOyYjeEE7JiN4QTt0aGlzLmFkZChyb2xlTm9kZU5hbWVGaWd1cmUwKTsmI3hBO3NldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShyb2xlTm9kZU5hbWVGaWd1cmUwKTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUm9sZU5vZGVOYW1lRmlndXJlOyAmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZSb2xlTm9kZU5hbWVGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEE7JiN4OTsmI3g5O2ZSb2xlTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBST0xFTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBSb2xlTm9kZU5hbWVGaWd1cmVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hBOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvUm9sZU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJUYXNrTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlRhc2tOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlRhc2tOb2RlQ3JlYXRlQ29tbWFuZCIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlRhc2tOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iVGFza05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgVGFza05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBUYXNrTm9kZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMCk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFRBU0tOT0RFRklHVVJFX0JBQ0smI3hBOyk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7JiN4QTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgdGFza05vZGVOYW1lRmlndXJlMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hBO3Rhc2tOb2RlTmFtZUZpZ3VyZTAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4QTsmI3hBO3Rhc2tOb2RlTmFtZUZpZ3VyZTAuc2V0Rm9udChUYXNrTm9kZU5hbWVGaWd1cmVfRk9OVCk7JiN4QTsmI3hBOyYjeEE7JiN4QTt0aGlzLmFkZCh0YXNrTm9kZU5hbWVGaWd1cmUwKTsmI3hBO3NldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSh0YXNrTm9kZU5hbWVGaWd1cmUwKTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmVGFza05vZGVOYW1lRmlndXJlOyAmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZUYXNrTm9kZU5hbWVGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEE7JiN4OTsmI3g5O2ZUYXNrTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBUQVNLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBUYXNrTm9kZU5hbWVGaWd1cmVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hBOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvVGFza05vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlRhc2tOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDMiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZCIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLJiN4QTspOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBOyYjeEE7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEE7d29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4QTsmI3hBO3dvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUwLnNldEZvbnQoV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZV9GT05UKTsmI3hBOyYjeEE7JiN4QTsmI3hBO3RoaXMuYWRkKHdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUwKTsmI3hBO3NldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUod29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTApOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOyAmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEE7JiN4OTsmI3g5O2ZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAzIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iVE9PTEJBUl9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeEE7JiN4QTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IGxheW91dFRoaXMgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC4mI3hBO0FMSUdOX0NFTlRFUiYjeEE7JiN4QTsmI3hBOyk7JiN4QTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRTcGFjaW5nKDUpOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldFZlcnRpY2FsKGZhbHNlKTsmI3hBOyYjeEE7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobGF5b3V0VGhpcyk7JiN4QTsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKHRydWUpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLJiN4QTspOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoKSYjeEE7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1JvbGVUYXNrQ29tcG9zaXRlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3hBOyYjeEE7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBsYXlvdXRUaGlzID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuJiN4QTtBTElHTl9DRU5URVImI3hBOyYjeEE7JiN4QTspOyYjeEE7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0U3BhY2luZyg1KTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRWZXJ0aWNhbCh0cnVlKTsmI3hBOyYjeEE7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobGF5b3V0VGhpcyk7JiN4QTsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKHRydWUpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLJiN4QTspOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoKSYjeEE7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDIwNSk7JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJMaW5rQ3JlYXRlQ29tbWFuZCIKLSAgICAgICAgcmVvcmllbnRDb21tYW5kQ2xhc3NOYW1lPSJMaW5rUmVvcmllbnRDb21tYW5kIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUodHJ1ZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayk7JiN4QTsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUm90YXRhYmxlRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEE7ZGYuc2V0RmlsbCh0cnVlKTsmI3hBO2RmLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7ZGYuc2V0T3V0bGluZSh0cnVlKTsmI3hBO2RmLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7ZGYuc2V0TGluZVdpZHRoKDEpOyYjeEE7ZGYuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEE7cGwuYWRkUG9pbnQoZ2V0TWFwTW9kZSgpLkRQdG9MUCgtMSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgxKSYjeEE7KTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSYjeEE7KTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTspOyYjeEE7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEE7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpJiN4QTspOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua05hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlJvbGVOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZU5vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iVGFza05vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTGlua3MiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTGluayIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IGxpbmsiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICAgIDxwcmVmZXJlbmNlUGFnZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5nZW5lcmFsIgotICAgICAgICBuYW1lPSJEaWFncmFtIERpYWdyYW0iPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLmFwcGVhcmFuY2UiCi0gICAgICAgICAgbmFtZT0iQXBwZWFyYW5jZSIKLSAgICAgICAgICBraW5kPSJBcHBlYXJhbmNlIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0uY29ubmVjdGlvbnMiCi0gICAgICAgICAgbmFtZT0iQ29ubmVjdGlvbnMiCi0gICAgICAgICAga2luZD0iQ29ubmVjdGlvbnMiLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5wcmludGluZyIKLSAgICAgICAgICBuYW1lPSJQcmludGluZyIKLSAgICAgICAgICBraW5kPSJQcmludGluZyIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLnJ1bGVyc0FuZEdyaWQiCi0gICAgICAgICAgbmFtZT0iUnVsZXJzIEFuZCBHcmlkIgotICAgICAgICAgIGtpbmQ9IlJ1bGVyc0FuZEdyaWQiLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5wYXRobWFwcyIKLSAgICAgICAgICBuYW1lPSJQYXRobWFwcyIKLSAgICAgICAgICBraW5kPSJQYXRobWFwcyIvPgotICAgIDwvcHJlZmVyZW5jZVBhZ2VzPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4vPgotICA8ZWRpdG9yLz4KLSAgPG5hdmlnYXRvcj4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgZ3JvdXBOYW1lPSJsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9InRhcmdldCIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0IgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9InRhcmdldCIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0IgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0ic291cmNlIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0ic291cmNlIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gIDwvbmF2aWdhdG9yPgotICA8cHJvcGVydHlTaGVldD4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJhcHBlYXJhbmNlIi8+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iZGlhZ3JhbSIvPgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ3VzdG9tUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJkb21haW4iCi0gICAgICAgIGxhYmVsPSJDb3JlIj4KLSAgICAgIDxmaWx0ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVUYWJGaWx0ZXIiPgotICAgICAgICA8dHlwZXM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzwvdHlwZXM+Ci0gICAgICAgIDx0eXBlcz5vcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ8L3R5cGVzPgotICAgICAgICA8Z2VuZXJhdGVkVHlwZXM+YWJzdHJhY3ROYXZpZ2F0b3JJdGVtPC9nZW5lcmF0ZWRUeXBlcz4KLSAgICAgIDwvZmlsdGVyPgotICAgIDwvdGFicz4KLSAgPC9wcm9wZXJ0eVNoZWV0PgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLyIvPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDIuZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDIuZ21mbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGNmNzYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZm1hcDpNYXBwaW5nIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z21mbWFwPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L21hcHBpbmdzLzIuMCIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Sb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVUYXNrQ29tcG9zaXRlIi8+Ci0gICAgICA8Y2hpbGRyZW4+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxvd25lZENoaWxkPgotICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vUm9sZU5vZGUiLz4KLSAgICAgICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlTm9kZU5hbWUiLz4KLSAgICAgICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjAiLz4KLSAgICAgICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVOb2RlIi8+Ci0gICAgICAgIDwvb3duZWRDaGlsZD4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxvd25lZENoaWxkPgotICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vVGFza05vZGUiLz4KLSAgICAgICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNUYXNrTm9kZU5hbWUiLz4KLSAgICAgICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjIiLz4KLSAgICAgICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1Rhc2tOb2RlIi8+Ci0gICAgICAgIDwvb3duZWRDaGlsZD4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y29tcGFydG1lbnRzPgotICAgICAgICA8Y29tcGFydG1lbnQKLSAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlVGFza0NvbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjQiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLz4KLSAgICAgICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdE5vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4zIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgIDwvb3duZWRDaGlsZD4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y29tcGFydG1lbnRzPgotICAgICAgICA8Y29tcGFydG1lbnQKLSAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdENvbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsiLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNMaW5rTmFtZUxhYmVsIi8+Ci0gICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay9uYW1lIi8+Ci0gICAgPC9sYWJlbE1hcHBpbmdzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgIDx0b29sCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjTGluayIvPgotICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlIi8+Ci0gICAgPGxpbmtNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNtb2RlbCIvPgotICAgIDxkb21haW5Nb2RlbAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8iLz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQzLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQzLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxZTM2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMy5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsLzIuMCIgcGFja2FnZU5hbWVQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCIKLSAgICBtb2RlbElEPSJBREQiCi0gICAgc2FtZUZpbGVGb3JEaWFncmFtQW5kTW9kZWw9InRydWUiCi0gICAgZGlhZ3JhbUZpbGVFeHRlbnNpb249InhtaSIKLSAgICB0ZW1wbGF0ZURpcmVjdG9yeT0iIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93Ij4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtIi8+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJSb2xlTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlJvbGVOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFJvbGVOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgUm9sZU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFJPTEVOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtmaWdfMC5zZXRGb250KCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTtST0xFTk9ERU5BTUVGSUdVUkVfRk9OVCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZSb2xlTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlJvbGVOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUm9sZU5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgUk9MRU5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgUk9MRU5PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1JvbGVOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iVGFza05vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJUYXNrTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBUYXNrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFRhc2tOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExpbmVXaWR0aCgwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFRBU0tOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtmaWdfMC5zZXRGb250KCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTtUQVNLTk9ERU5BTUVGSUdVUkVfRk9OVCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZUYXNrTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlRhc2tOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmVGFza05vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBUQVNLTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgVEFTS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1Rhc2tOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAzIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVERFU0NSSVBUT1JOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtmaWdfMC5zZXRGb250KCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTtXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgV09SS1BST0RVQ1ROT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBXT1JLUFJPRFVDVERFU0NSSVBUT1JOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyMDUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJUT09MQkFSX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFNwYWNpbmcoNSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0VmVydGljYWwoZmFsc2UpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3g5OyYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iVE9PTEJBUl9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTcGFjaW5nKDUpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFZlcnRpY2FsKHRydWUpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3g5OyYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyMDUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtWaWV3RmFjdG9yeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJMaW5rRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIExpbmtGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluayIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA0IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUm9sZU5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJUYXNrTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2tOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWNOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJMaW5rcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJMaW5rIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgbGluayIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCIKLSAgICAgIG5hbWU9IkFjdGl2aXR5IERldGFpbCBEaWFncmFtIFBsdWdpbiIKLSAgICAgIHByb3ZpZGVyPSJFUEYiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciIKLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCIvPgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLyIvPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2RpYWdyYW0uZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvZGlhZ3JhbS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlNzhiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvZGlhZ3JhbS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1vZGVsIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMaW5rIiBlU3VwZXJUeXBlcz0iIy8vTGlua2VkT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBlVHlwZT0iIy8vTm9kZSIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFyZ2V0IiBlVHlwZT0iIy8vTm9kZSIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9Ob2RlL2luY29taW5nQ29ubmVjdGlvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmVuZHBvaW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9BYnNvbHV0ZUJlbmRwb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2VFbmRQb2ludCIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldEVuZFBvaW50IiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGlua2VkT2JqZWN0IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9iamVjdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUphdmFPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTm9kZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MaW5rZWRPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvbiIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndpZHRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nQ29ubmVjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTGluayIgZU9wcG9zaXRlPSIjLy9MaW5rL3RhcmdldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRnb2luZ0Nvbm5lY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0xpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVPcHBvc2l0ZT0iIy8vTGluay9zb3VyY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhZE9ubHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlZE5vZGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0Tm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGVDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5vZGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL05vZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZU5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlVGFza0NvbXBvc2l0ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFic29sdXRlQmVuZHBvaW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUG9pbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOGMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNUQVJUIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJlZmVyZW5jZXMuZ2VuZXJhbD1BREQgRGlhZ3JhbQotcHJlZmVyZW5jZXMuYXBwZWFyYW5jZT1BcHBlYXJhbmNlCi1wcmVmZXJlbmNlcy5jb25uZWN0aW9ucz1Db25uZWN0aW9ucwotcHJlZmVyZW5jZXMucHJpbnRpbmc9UHJpbnRpbmcKLXByZWZlcmVuY2VzLnJ1bGVyc0FuZEdyaWQ9UnVsZXJzICYgR3JpZAotcHJlZmVyZW5jZXMucGF0aG1hcHM9UGF0aCBNYXBzCi0KLWVkaXRvck5hbWU9QUREIERpYWdyYW0gRWRpdG9yCi1uZXdXaXphcmROYW1lPUFERCBEaWFncmFtCi1uZXdXaXphcmREZXNjPUNyZWF0ZXMgQUREIGRpYWdyYW0uCi0KLWluaXREaWFncmFtQWN0aW9uTGFiZWw9SW5pdGlhbGl6ZSBhZGQgZGlhZ3JhbSBmaWxlCi1sb2FkUmVzb3VyY2VBY3Rpb25MYWJlbD1Mb2FkIFJlc291cmNlLi4uCi0KLW5hdmlnYXRvckNvbnRlbnROYW1lPSouYWRkIGRpYWdyYW0gY29udGVudHMKLQotbWV0YXR5cGUubmFtZS5BY3Rpdml0eURldGFpbERpYWdyYW1fNzk9VW5kZWZpbmVkCi1tZXRhdHlwZS5uYW1lLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDE9Um9sZVRhc2tDb21wb3NpdGUKLW1ldGF0eXBlLm5hbWUuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMj1Xb3JrUHJvZHVjdENvbXBvc2l0ZQotbWV0YXR5cGUubmFtZS5Sb2xlTm9kZV8yMDAxPVJvbGVOb2RlCi1tZXRhdHlwZS5uYW1lLlRhc2tOb2RlXzIwMDI9VGFza05vZGUKLW1ldGF0eXBlLm5hbWUuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzPVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUKLW1ldGF0eXBlLm5hbWUuTGlua18zMDAxPUxpbmsKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1FUEYgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIE5lZWQgdHJhbnNsYXRpb24KLWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3c9Q29udHJvbCBGbG93Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTY5ZGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICBleHRlbnNpb249ImFkZCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAgIDxwYXJzZXIKLSAgICAgICAgIHR5cGU9ImFkZCIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5Ij4KLSAgICAgIDwvcGFyc2VyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgPCEtLQotICAgICA8ZWRpdG9yCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCIKLSAgICAgICAgbmFtZT0iR01GIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIEVkaXRvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYiCi0gICAgICAgIGV4dGVuc2lvbnM9ImFkZCIKLSAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciIKLSAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IiPgotICAgICA8L2VkaXRvcj4KLSAgIC0tPgotICAgICA8ZWRpdG9yCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCIKLSAgICAgICAgbmFtZT0iQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gRWRpdG9yIgotICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvQURERWRpdG9yLmdpZiIKLSAgICAgICAgZXh0ZW5zaW9ucz0iYWRkIgotICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQUREaWFncmFtRWRpdG9yIgotICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtTWF0Y2hpbmdTdHJhdGVneSIKLSAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciI+Ci0gICAgIDwvZWRpdG9yPiAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAJICA8d2l6YXJkCi0gIAkgICAgIG5hbWU9IkFjdGl2aXR5IERldGFpbCBEaWFncmFtIgotICAJICAgICBpY29uPSJpY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZiIKLSAgCSAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzIgotICAJICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbUNyZWF0aW9uV2l6YXJkIgotICAJICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbUNyZWF0aW9uV2l6YXJkSUQiPgotICAJICAJIDxkZXNjcmlwdGlvbj4KLSAgCSAgCQlDcmVhdGVzIEFjdGl2aXR5IERldGFpbCBEaWFncmFtLgotICAJICAJIDwvZGVzY3JpcHRpb24+ICAKLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+IC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDwhLS0gPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC51aS5vYmplY3RDb250cmlidXRpb24uSUZpbGUxIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5tb2RlbCIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iSW5pdGlhbGl6ZSBhZGQgZGlhZ3JhbSBmaWxlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uSUQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudWkub2JqZWN0Q29udHJpYnV0aW9uLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0MiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbklEIgotICAgICAgICAgICAgICAgbGFiZWw9IkxvYWQgUmVzb3VyY2UuLi4iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5EZWxldGVEaWFncmFtIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJURlbGV0ZURpYWdyYW1fdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVEZWxldGVEaWFncmFtX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaF90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgICAtLT4gICAgICAgICAgIAotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25JdGVtUHJvdmlkZXJzIj4KLSAgICAgIDxjb250cmlidXRpb25JdGVtUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ij4KLSAgICAgICAgIDwvUHJpb3JpdHk+Ci0gICAgICAgICA8cGFydENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPHBhcnRBY3Rpb24gbWVudWJhclBhdGg9Ii9maWxlL3ByaW50IiBpZD0icHJpbnRQcmV2aWV3QWN0aW9uIj4KLSAgICAgICAgICAgIDwvcGFydEFjdGlvbj4KLSAgICAgICAgIDwvcGFydENvbnRyaWJ1dGlvbj4KLSAgICAgIDwvY29udHJpYnV0aW9uSXRlbVByb3ZpZGVyPgotICAgICAgPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiCi0gICAgICAgICAgICBjaGVja1BsdWdpbkxvYWRlZD0iZmFsc2UiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcnMiPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQUREUHJlc2VudGF0aW9uIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iZGVsZXRlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJzYXZlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVdpdGhQcmludEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRERQcmVzZW50YXRpb25QcmludCI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InByaW50Ii8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUucHJvdmlkZXJzLkRpYWdyYW1JREVHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQUREUHJlc2VudGF0aW9uSURFIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iYm9va21hcmsiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPCEtLQotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLnByb3ZpZGVycy5EaWFncmFtVUlSZW5kZXJHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0iQUREUmVuZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY3V0Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImNvcHkiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icGFzdGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgLS0+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnZpZXdQcm92aWRlcnMiPgotICAgICAgPHZpZXdQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtVmlld1Byb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSIgc2VtYW50aWNIaW50cz0iQUREIi8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUiIHNlbWFudGljSGludHM9IiIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgIDwvdmlld1Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRQcm92aWRlcnMiPgotICAgICAgPGVkaXRwYXJ0UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9lZGl0cGFydFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFsZXR0ZVByb3ZpZGVycyI+Ci0gICAgICA8cGFsZXR0ZVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1QYWxldHRlUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiLz4KLSAgICAgIDwvcGFsZXR0ZVByb3ZpZGVyPgotICAgICAgPHBhbGV0dGVQcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRlZmF1bHRQYWxldHRlUHJvdmlkZXIiPgotICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTWVkaXVtIi8+Ci0gICAgICAgIDxlZGl0b3IgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICAgIDxjb250cmlidXRpb24+Ci0gICAgICAgICAgICA8cHJlZGVmaW5lZEVudHJ5ICAgIAotICAgICAgICAgICAgCWlkPSJnZW9zaGFwZURyYXdlciIgICBwYXRoPSIvIj4KLSAgICAgICAgICAgIAk8ZXhwYW5kIGZvcmNlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgPC9wcmVkZWZpbmVkRW50cnk+IAotICAgICAgICA8L2NvbnRyaWJ1dGlvbj4KLSAgICAgIDwvcGFsZXR0ZVByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVycyI+Ci0gICAgICA8bW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L21vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMucHJvcGVydGllc1Byb3ZpZGVycyI+Ci0gICAgICA8UHJvcGVydGllc1Byb3ZpZGVyCi0gICAgICAgICAgICB2ZXJpZnlQbHVnaW5Mb2FkZWQ9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9Qcm9wZXJ0aWVzUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb25Qcm92aWRlcnMiPgotICAgICAgPEljb25Qcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciLz4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgICAgPEljb25Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLmludGVybmFsLnByb3ZpZGVycy5HZW9TaGFwZUljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkKLSAgICAgICAgICAgICAgIG5hbWU9Ik1lZGl1bSI+Ci0gICAgICAgICA8L1ByaW9yaXR5PgotICAgICAgICAgPG9iamVjdCBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbikiIGlkPSJHZW9TaGFwZSI+Ci0gICAgICAgIAkgPG1ldGhvZCBuYW1lPSJnZXRUeXBlKCkiIHZhbHVlPSJvdmFsLHRyaWFuZ2xlLHJlY3RhbmdsZSxzaGFkb3dSZWN0YW5nbGUscmVjdGFuZ2xlM0Qscm91bmRSZWN0YW5nbGUsaGV4YWdvbixvY3RhZ29uLHBlbnRhZ29uLGRpYW1vbmQsY3lsaW5kZXIsbGluZSIvPgotCSAgICAgPC9vYmplY3Q+Ci0gICAgICAgICA8Y29udGV4dCBlbGVtZW50cz0iR2VvU2hhcGUiPgotICAgICAgICAgPC9jb250ZXh0PgotICAgICAgPC9JY29uUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlclByb3ZpZGVycyI+Ci0gICAgICA8UGFyc2VyUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbVBhcnNlclByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvUGFyc2VyUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZXMiPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHlEZXRhaWxEaWFncmFtIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSI3OSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Sb2xlTm9kZV8yMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iUm9sZU5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJSb2xlTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuUm9sZU5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlRhc2tOb2RlXzIwMDIiCi0gICAgICAgICAgICAgICBuYW1lPSJUYXNrTm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IlRhc2tOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5UYXNrTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjIwMDIiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzIgotICAgICAgICAgICAgICAgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDAzIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMiIKLSAgICAgICAgICAgICAgIG5hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMiIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5MaW5rXzMwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2NvbnRyb2xfZmxvdyIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkxpbmsiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLkxpbmtFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVsZW1lbnRUeXBlQmluZGluZ3MiPgotICAgICAgPGNsaWVudENvbnRleHQgaWQ9IkFERENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLmVkaXRpbmdEb21haW4iCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uRWRpdGluZ0RvbWFpbiIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9jbGllbnRDb250ZXh0PiAKLSAgICAgIDxiaW5kaW5nIGNvbnRleHQ9IkFERENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJvbGVOb2RlXzIwMDEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5UYXNrTm9kZV8yMDAyIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5MaW5rXzMwMDEiLz4KLSAgICAgICAgIDxhZHZpY2UgcmVmPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuYWR2aWNlLm5vdGF0aW9uRGVwZGVuZGVudHMiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSBwYXR0ZXJuPSIuKiIvPgotICAgICAgPC9iaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvQURESW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9BRERJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzODVlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9BRERJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEFEREltYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxDTDE2ID0gImZ1bGwvZWxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETENMMTYgPSAiZnVsbC9kbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUT09MMTYgPSAiZnVsbC9ldG9vbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVE9PTDE2ID0gImZ1bGwvZHRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfUkVTRVRfRElBR1JBTV9MQVlPVVQgPSBFTENMMTYgKyAicmVzZXRfZGlhZ3JhbS5naWYiOyAvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0VESVRPUiA9IEVUT09MMTYgKyAiQURERWRpdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9SRVNFVF9ESUFHUkFNX0xBWU9VVCA9IERMQ0wxNiArICJyZXNldF9kaWFncmFtLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9FRElUT1IgPSBEVE9PTDE2ICsgIkFEREVkaXRvci5naWYiOyAvLyROT04tTkxTLTEkCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1JFU0VUX0RJQUdSQU1fTEFZT1VUID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJRElTQUJMRURfSU1HX1BBVEhfUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0VESVRPUiA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfRURJVE9SKTsJCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1JFU0VUX0RJQUdSQU1fTEFZT1VUID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRURJVE9SID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9FRElUT1IpOwkJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNWM3YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCI7CS8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjVkZDkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCBleHRlbmRzCi0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUFkYXB0YWJsZSBlZGdlQWRhcHRvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGVkaXRpbmdEb21haW4sIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVkZ2VBZGFwdG9yLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2VGaWxlcyh2aWV3KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFZGdlQWRhcHRvcigpIHsKLQkJcmV0dXJuIGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGdlQWRhcHRvcihJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yKSB7Ci0JCXRoaXMuZWRnZUFkYXB0b3IgPSBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZUFkYXB0b3IgOiAiTnVsbCBjaGlsZCBpbiBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0JCUVkZ2UgZWRnZSA9IChFZGdlKSBnZXRFZGdlQWRhcHRvcigpLmdldEFkYXB0ZXIoRWRnZS5jbGFzcyk7Ci0JCWFzc2VydCBudWxsICE9IGVkZ2UgOiAiTnVsbCBlZGdlIGluIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlWaWV3IHRlbXBWaWV3ID0gZWRnZS5nZXRTb3VyY2UoKTsKLQkJZWRnZS5zZXRTb3VyY2UoZWRnZS5nZXRUYXJnZXQoKSk7Ci0JCWVkZ2Uuc2V0VGFyZ2V0KHRlbXBWaWV3KTsKLQotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0xpbmtDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0xpbmtDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzA5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTm9kZSBteUNvbnRhaW5lcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE5vZGUgbXlTb3VyY2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBOb2RlIG15VGFyZ2V0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rQ3JlYXRlQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSwgTm9kZSBjb250YWluZXIsCi0JCQlOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIocmVxKTsKLQkJc3VwZXIuc2V0RWxlbWVudFRvRWRpdChjb250YWluZXIpOwotCQlteUNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJbXlTb3VyY2UgPSBzb3VyY2U7Ci0JCW15VGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBteUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gbXlTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIG15VGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlMaW5rIG5ld0VsZW1lbnQgPSAoTGluaykgc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KG15VGFyZ2V0KTsKLQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKG15U291cmNlKTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua1Jlb3JpZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9MaW5rUmVvcmllbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YWEzMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9MaW5rUmVvcmllbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtSZW9yaWVudENvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHJlb3JpZW50RGlyZWN0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgRU9iamVjdCBvbGRFbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG5ld0VuZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua1Jlb3JpZW50Q29tbWFuZChSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0LmdldExhYmVsKCksIHJlcXVlc3QuZ2V0UmVsYXRpb25zaGlwKCksIHJlcXVlc3QpOwotCQlyZW9yaWVudERpcmVjdGlvbiA9IHJlcXVlc3QuZ2V0RGlyZWN0aW9uKCk7Ci0JCW9sZEVuZCA9IHJlcXVlc3QuZ2V0T2xkUmVsYXRpb25zaGlwRW5kKCk7Ci0JCW5ld0VuZCA9IHJlcXVlc3QuZ2V0TmV3UmVsYXRpb25zaGlwRW5kKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmICghKGdldEVsZW1lbnRUb0VkaXQoKSBpbnN0YW5jZW9mIExpbmspKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsKLQkJCXJldHVybiBjYW5SZW9yaWVudFNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7Ci0JCQlyZXR1cm4gY2FuUmVvcmllbnRUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblJlb3JpZW50U291cmNlKCkgewotCQlpZiAoIShvbGRFbmQgaW5zdGFuY2VvZiBOb2RlICYmIG5ld0VuZCBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSB0YXJnZXQgPSBnZXRMaW5rKCkuZ2V0VGFyZ2V0KCk7Ci0JCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldExpbmsoKS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkV4aXN0TGlua18zMDAxKGNvbnRhaW5lciwgZ2V0TmV3U291cmNlKCksIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblJlb3JpZW50VGFyZ2V0KCkgewotCQlpZiAoIShvbGRFbmQgaW5zdGFuY2VvZiBOb2RlICYmIG5ld0VuZCBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSBnZXRMaW5rKCkuZ2V0U291cmNlKCk7Ci0JCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldExpbmsoKS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkV4aXN0TGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBnZXROZXdUYXJnZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFjYW5FeGVjdXRlKCkpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oCi0JCQkJCSJJbnZhbGlkIGFyZ3VtZW50cyBpbiByZW9yaWVudCBsaW5rIGNvbW1hbmQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7Ci0JCQlyZXR1cm4gcmVvcmllbnRTb3VyY2UoKTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgewotCQkJcmV0dXJuIHJlb3JpZW50VGFyZ2V0KCk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlnZXRMaW5rKCkuc2V0U291cmNlKGdldE5ld1NvdXJjZSgpKTsKLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50VGFyZ2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWdldExpbmsoKS5zZXRUYXJnZXQoZ2V0TmV3VGFyZ2V0KCkpOwotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpbmsgZ2V0TGluaygpIHsKLQkJcmV0dXJuIChMaW5rKSBnZXRFbGVtZW50VG9FZGl0KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIGdldE9sZFNvdXJjZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBvbGRFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIGdldE5ld1NvdXJjZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBuZXdFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIGdldE9sZFRhcmdldCgpIHsKLQkJcmV0dXJuIChOb2RlKSBvbGRFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIGdldE5ld1RhcmdldCgpIHsKLQkJcmV0dXJuIChOb2RlKSBuZXdFbmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Sb2xlTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZU5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNzJlNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Sb2xlTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZU5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1JvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Sb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MDlhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1JvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvVGFza05vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1Rhc2tOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJjOTUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvVGFza05vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNjdlNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTM1ZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcwotCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlMWZiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvRGlhZ3JhbUJhc2VFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvRGlhZ3JhbUJhc2VFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTFkYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0SGVscGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1BPTElDWV9DT01NQU5EID0gImVkaXQgcG9saWN5IGNvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldEluc3RlYWRDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7Ci0JCUlDb21tYW5kIGVwQ29tbWFuZCA9IChJQ29tbWFuZCkgcmVxLmdldFBhcmFtZXRlcihFRElUX1BPTElDWV9DT01NQU5EKTsKLQkJcmVxLnNldFBhcmFtZXRlcihFRElUX1BPTElDWV9DT01NQU5ELCBudWxsKTsKLQkJSUNvbW1hbmQgZWhDb21tYW5kID0gc3VwZXIuZ2V0SW5zdGVhZENvbW1hbmQocmVxKTsKLQkJaWYgKGVwQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCWlmIChlaENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVwQ29tbWFuZDsKLQkJfQotCQlDb21wb3NpdGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChudWxsKTsKLQkJY29tbWFuZC5hZGQoZXBDb21tYW5kKTsKLQkJY29tbWFuZC5hZGQoZWhDb21tYW5kKTsKLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9MaW5rRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDE3N2MyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9MaW5rRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1JvbGVOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1JvbGVOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VlNjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjIzZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9UYXNrTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9UYXNrTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3YjQ0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvVGFza05vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQzNTUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDQ2NzM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjFiOTY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5NZWFzdXJlbWVudFVuaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQlQb2ludCBjYWNoZWRQb2ludCA9IG5ldyBQb2ludCgtMSwgLTEpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotCXN0YXRpYyBpbnQgY2FjaGVkV2lkdGggPSAxMDsKLQotCXN0YXRpYyBpbnQgY2FjaGVkSGVpZ2h0ID0gMTA7Ci0KLQlpbnQgeSA9IDYwOwotCi0JYm9vbGVhbiB4YXhpc2JlZ2luID0gZmFsc2U7Ci0KLQlib29sZWFuIGxvYWRpbmcgPSB0cnVlOwotCi0JZmluYWwgc3RhdGljIGludCBzcGFjaW5nID0gNDA7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IHlzcGFjaW5nID0gMjA7Ci0KLQlib29sZWFuIG1pc2NlbGxhbmVvdXMgPSBmYWxzZTsKLQotCWludCB4ID0gMTA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRTID0gIm91dHB1dHMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVFMgPSAiaW5wdXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBMaXN0PEVkaXRQYXJ0PiByZWNlbnRseUFkZGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCi0JcHJpdmF0ZSBJTWFwTW9kZSBtYXBNb2RlOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9JRCA9ICJBREQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQkJCi0JCW1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZSh2aWV3LmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JfQotCQotCXByaXZhdGUgVmlldyBnZXRWaWV3KCkgewotCQlyZXR1cm4gKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb0xheW91dCgpIHsKLQkJRWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0JCWlmKHZpZXdlciBpbnN0YW5jZW9mIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcikgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpdmlld2VyKS5nZXRFZGl0b3IoKTsKLQkJCWlmKGVkaXRvciBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWVkaXRvcikucmVzZXRMYXlvdXQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZpZ3VyZSBmID0gbmV3IEZyZWVmb3JtTGF5ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoKSB7Ci0JCQkJaWYgKGhhc01pc3BsYWNlZENoaWxkcmVuKCkpIHsKLQkJCQkJcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwZXIubGF5b3V0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWYuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMjApKTsKLQkJZi5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpKTsKLQotCQlyZXR1cm4gZjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBhcmUgYW55IG1pc3BsYWNlZCBjaGlsZHJlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNaXNwbGFjZWRDaGlsZHJlbigpIHsKLQkJTGlzdCBsb2NhdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlPYmplY3QgbW9kZWwgPSAoKEVkaXRQYXJ0KSBjaGlsZCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBtb2RlbDsKLQkJCQkJTG9jYXRpb24gcCA9IChMb2NhdGlvbikgbm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJCWxvY2F0aW9uTGlzdC5hZGQocCk7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb2RlLSIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2MtIiArIHApOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGxvY2F0aW9uTGlzdC5zaXplKCkgPT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGxvY2F0aW9uTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlib29sZWFuIG5lZWRUb1Jlc2V0ID0gdHJ1ZTsKLQotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBsb2NhdGlvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlMb2NhdGlvbiBjdXJyZW50TG9jID0gKExvY2F0aW9uKSBsb2NhdGlvbkxpc3QuZ2V0KGkpOwotCQkJCUxvY2F0aW9uIHByZXZpb3VzTG9jID0gKExvY2F0aW9uKSBsb2NhdGlvbkxpc3QuZ2V0KGkgLSAxKTsKLQkJCQlpZiAoISgoY3VycmVudExvYy5nZXRYKCkgPT0gcHJldmlvdXNMb2MuZ2V0WCgpICsgMTApICYmIChjdXJyZW50TG9jCi0JCQkJCQkuZ2V0WSgpID09IHByZXZpb3VzTG9jLmdldFkoKSArIDEwKSkpIHsKLQkJCQkJbmVlZFRvUmVzZXQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5lZWRUb1Jlc2V0OwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldCBhbGwgY2hpbGRyZW4gbG9jYXRpb25zCi0JICogSW4gdGhpcywgQWxsIHRoZSBUYXNrJ3MgTWFuZGF0b3J5SW5wdXQgd29ya3Byb2R1Y3RzIHBsYWNlZCBvbiB0b3AgYW5kIFJvbGVUYXNrIAotCSAqIGNvbXBvc2l0ZSBpbiB0aGUgbWlkZGxlLiBhbmQgVGFzaydzIG91dHB1dCB3b3JrcHJvZHVjdHMgYm90dG9tLgotCSAqIAotCSAqIFRPRE8gLSBIYXZlIHRvIHJldmlzaXQgdGhpcyBtZXRob2QgYW5kIGRvIHNvbWUgY2xlYW51cAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0Q2hpbGRyZW5Mb2NhdGlvbnMoKSB7Ci0KLQkJZmluYWwgaW50IHlzcGFjaW5nID0gNDA7Ci0JCUxpc3Qgcm9sZWNvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1pc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRhc2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLnJlY2VudGx5QWRkZWRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLwkJSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgbiA9IChOb2RlKSAoKEVkaXRQYXJ0KSBjaGlsZCkuZ2V0TW9kZWwoKTsKLQkJCS8vCQkJaWYgKG4uZ2V0TG9jYXRpb24oKSA9PSBudWxsIHx8IG4uZ2V0TG9jYXRpb24oKS54ID09IC0xKSB7Ci0JCQl0aGlzLnJlY2VudGx5QWRkZWRQYXJ0cy5hZGQoKEVkaXRQYXJ0KSBjaGlsZCk7Ci0JCQkvLwkJCX0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQlyb2xlY29tcG9zaXRlTGlzdC5hZGQoY2hpbGQpOwotCi0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlWaWV3IHZpZXdPYmogPSAoVmlldykgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCQkJCU9iamVjdCBvID0gdmlld09iai5nZXRFbGVtZW50KCk7Ci0JCQkJCQlpZiAobyBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQkJdGFza0xpc3QuYWRkKG8pOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgcGFydCA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBjaGlsZDsKLQkJCQlWaWV3IHZpZXdPYmogPSAoVmlldykgKChOb2RlRWRpdFBhcnQpIHBhcnQpLmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IG8gPSB2aWV3T2JqLmdldEVsZW1lbnQoKTsKLQotCQkJCWlmIChvIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgbm9kZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgbzsKLQkJCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfSBlbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCQkvLwkJCQkJY2FsY1NpemUoY2hpbGQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWlzY0xpc3QuYWRkKGNoaWxkKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNldCBzaXplIGZvciB0aGUgcm9sZWNvbXBvc2l0ZS4KLQkJaWYgKCFyb2xlY29tcG9zaXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVjb21wb3NpdGVMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCQlMaXN0IGxpc3QgPSAoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIG9iamVjdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IxID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yMS5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVZpZXcgdmlld09iaiA9IChWaWV3KSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJCQkJT2JqZWN0IG9iak5vZGUgPSB2aWV3T2JqLmdldEVsZW1lbnQoKTsKLQkJCQkJCWlmIChvYmpOb2RlIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCQlUYXNrTm9kZSB0YXNrTm9kZSA9IChUYXNrTm9kZSkgb2JqTm9kZTsKLQotCQkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2sgPSAoVGFza0Rlc2NyaXB0b3IpIHRhc2tOb2RlCi0JCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciB3cGl0b3IgPSBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IHdwaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgd3BFZGl0UGFydCA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB3cGl0b3IKLQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cENvbXBvc2l0ZU5vZGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoVmlldykgd3BFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJCU9iamVjdCB3cE9iamVjdCA9IHdwQ29tcG9zaXRlTm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJCQkJaWYgKHdwT2JqZWN0ICE9IG51bGwgJiYgd3BPYmplY3QuZXF1YWxzKHRhc2spKSB7Ci0JCQkJCQkJCQlpbnQgd2lkdGggPSB3cEVkaXRQYXJ0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCQkJCQlpbnQgaGVpZ2h0ID0gKChOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQkJCQkoKE5vZGVFZGl0UGFydCkgb2JqKQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUoCi0JCQkJCQkJCQkJCQkJbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KSk7Ci0JCQkJCQkJCQlpZiAoKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChWaWV3KSB3cEVkaXRQYXJ0Ci0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCkpCi0JCQkJCQkJCQkJCS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQkJCQkJLy8JCQkJCQkJCQkJTGlzdCBpbnB1dExpc3QgPSAoTGlzdCkgKChIYXNoTWFwKSBtYXAKLQkJCQkJCQkJCQkvLwkJCQkJCQkJCQkJCS5nZXQodGFza05vZGUpKS5nZXQoSU5QVVRTKTsKLQkJCQkJCQkJCQkvLwkJCQkJCQkJCQlpbnB1dExpc3QuYWRkKHdwRWRpdFBhcnQpOwotCQkJCQkJCQkJfSBlbHNlIGlmICgoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFZpZXcpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkJLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQkJCQkJLy8JCQkJCQkJCQkJTGlzdCBvdXRwdXRMaXN0ID0gKExpc3QpICgoSGFzaE1hcCkgbWFwCi0JCQkJCQkJCQkJLy8JCQkJCQkJCQkJCQkuZ2V0KHRhc2tOb2RlKSkuZ2V0KE9VVFBVVFMpOwotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCW91dHB1dExpc3QuYWRkKHdwRWRpdFBhcnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFyb2xlY29tcG9zaXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZWNvbXBvc2l0ZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcUlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcU91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSByb2xlY29tcG9zaXRlTGlzdAotCQkJCQkJLmdldChpKSkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJT2JqZWN0IG8gPSBsaXN0LmdldChqKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCU5vZGVFZGl0UGFydCB0YXNrID0gKE5vZGVFZGl0UGFydCkgbGlzdC5nZXQoaik7Ci0JCQkJCQlpZiAoKChWaWV3KSB0YXNrLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQkJVGFza05vZGUgdGFza25vZGUgPSAoVGFza05vZGUpICgoVmlldykgdGFzawotCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3Bjb21wID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFZpZXcpICgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkuZ2V0KGspKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0KLQkJCQkJCQkJaWYgKHdwY29tcCAhPSBudWxsICYmIHdwY29tcC5nZXRPYmplY3QoKS5lcXVhbHMoCi0JCQkJCQkJCQkJdGFza25vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJCQkJCQlpZiAod3Bjb21wLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCQljb25maXJtZWRTZXFJbnB1dExpc3QKLQkJCQkJCQkJCQkJCS5hZGQoaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkJCQkJLmdldChrKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5zaXplKCk7IGsrKykgewotCQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGNvbXAgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoVmlldykgKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkuZ2V0KGspKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0KLQkJCQkJCQkJaWYgKHdwY29tcC5nZXRPYmplY3QoKS5lcXVhbHMoCi0JCQkJCQkJCQkJdGFza25vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJCQkJCQlpZiAod3Bjb21wLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQkJCQkJY29uZmlybWVkU2VxT3V0cHV0TGlzdAotCQkJCQkJCQkJCQkJLmFkZChvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkJCQkJLmdldChrKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFjb25maXJtZWRTZXFJbnB1dExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNldE9iamVjdHNMb2NhdGlvbnMoY29uZmlybWVkU2VxSW5wdXRMaXN0KTsKLQkJCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQl9Ci0JCQkJTGlzdCByb2xlQyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyb2xlQy5hZGQocm9sZWNvbXBvc2l0ZUxpc3QuZ2V0KGkpKTsKLQkJCQlzZXRPYmplY3RzTG9jYXRpb25zKHJvbGVDKTsKLQotCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJaWYgKCFjb25maXJtZWRTZXFPdXRwdXRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlzZXRPYmplY3RzTG9jYXRpb25zKGNvbmZpcm1lZFNlcU91dHB1dExpc3QpOwotCQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJLy8JCWlmICghbWlzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCS8vCQkJaWYgKGRlYnVnKSB7Ci0JCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJpbnQgU2l6ZSBvZiBtaXNjOiAiICsgbWlzY0xpc3Quc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCX0KLQkJLy8JCQlpZiAoIWxvYWRpbmcpIHsKLQkJLy8JCQkJbWlzY2VsbGFuZW91cyA9IHRydWU7Ci0JCS8vCQkJfQotCQkvLwkJCXNldE9iamVjdHNMb2NhdGlvbnMobWlzY0xpc3QpOwotCQkvLwkJCW1pc2NlbGxhbmVvdXMgPSBmYWxzZTsKLQkJLy8JCX0KLQotCQlmaW5hbCBWaWV3IHZpZXcgPSBnZXRWaWV3KCk7Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbih2aWV3LmdldERpYWdyYW0oKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl2aWV3LnBlcnNpc3QoKTsKLQkJCQkJdmlldy5wZXJzaXN0Q2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJbG9hZGluZyA9IGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJdCBzZXRzIG9iamVjdCBsb2NhdGlvbiBvbiBjYXZhcwotCSAqIEBwYXJhbSBsaXN0Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE9iamVjdHNMb2NhdGlvbnMoTGlzdCBsaXN0KSB7Ci0JCXhheGlzYmVnaW4gPSB0cnVlOwotCQl4ID0gNTA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJZmluYWwgR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJZmluYWwgTm9kZSBub2RlID0gKE5vZGUpIHBhcnQuZ2V0TW9kZWwoKTsKLQotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlmaW5hbCBMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgbm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0KLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgLSAiICsgcGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9jYXRpb24gLSAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlpZiAoIXhheGlzYmVnaW4pIHsKLQkJCQkJCXggPSBjYWNoZWRQb2ludC54ICsgY2FjaGVkV2lkdGggKyBzcGFjaW5nOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFsb2FkaW5nICYmIG1pc2NlbGxhbmVvdXMpIHsKLQkJCQkJCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoeCkpOwotCQkJCQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCgxMCkpOwotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldFZpZXcoKS5nZXREaWFncmFtKCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKHgpKTsKLQkJCQkJCQkJCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoeSkpOwotCi0JCQkJCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQkJCQkJCQkoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHBhcnQpCi0JCQkJCQkJCQkJCQkudXBkYXRlYm91bmRzKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQkJCQkJCQkoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHBhcnQpCi0JCQkJCQkJCQkJCQkudXBkYXRlYm91bmRzKCk7Ci0JCQkJCQkJCQl9Ci0KLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQl9KTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGRlYnVnKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTmV3TG9jYXRpb24gLSAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCWlmICghbWlzY2VsbGFuZW91cykKLQkJCQkJCQljYWNoZWRQb2ludCA9IG5ldyBQb2ludChsb2NhdGlvbi5nZXRYKCksIGxvY2F0aW9uCi0JCQkJCQkJCQkuZ2V0WSgpKTsKLQkJCQkJCWNhY2hlZFdpZHRoID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCQlpZiAocGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0ID4gY2FjaGVkSGVpZ2h0KQotCQkJCQkJCWNhY2hlZEhlaWdodCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXhheGlzYmVnaW4gPSBmYWxzZTsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCS8vCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkvLwkJCQkJCQkJCS5wcmludGxuKCJQb2ludCA6ICIgKyBuZXcgUG9pbnQoeCwgeSkudG9TdHJpbmcoKSArICJBbmQgd2lkdGg9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkvLwkJCQkJCQkJCQkJKyBjYWNoZWRXaWR0aAotCQkJCQkJCS8vCQkJCQkJCQkJCQkrICIsIEhlaWdodD0iICsgY2FjaGVkSGVpZ2h0ICsgIiwgV2lkdGggb2YgVmlld2VyOiAiICsgdmlld2VyV2lkdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgYW5kIHNldHMgc2l6ZSBvZiB0aGUgZ2l2ZW4gbm9kZQotCSAqIEBwYXJhbSBjaGlsZAotCSAqIAotCSAqIFRPRE8gLSBOb3QgdXNlZCBjdXJyZW50bHksIHdlIG5lZWQgdG8gc2VlIHdoZXRoZXIgd2UgbmVlZCB0aGlzIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjU2l6ZShPYmplY3QgY2hpbGQpIHsKLQkJTGlzdCBsaXN0ID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0JCWludCBsYXJnZXN0V2lkdGggPSAwOwotCQlpbnQgbGFyZ2VzdEhlaWdodCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQlWaWV3IHZpZXdPYmogPSAoVmlldykgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3Qgb2JqTm9kZSA9IHZpZXdPYmouZ2V0RWxlbWVudCgpOwotCQkJCWlmIChvYmpOb2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJCQlpbnQgbm9kZVdpZHRoID0gKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpbnQgbm9kZUhlaWdodCA9ICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldEZpZ3VyZSgpCi0JCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCWlmIChub2RlV2lkdGggPiBsYXJnZXN0V2lkdGgpCi0JCQkJCQlsYXJnZXN0V2lkdGggPSBub2RlV2lkdGg7Ci0JCQkJCWlmIChub2RlSGVpZ2h0ID4gbGFyZ2VzdEhlaWdodCkKLQkJCQkJCWxhcmdlc3RIZWlnaHQgPSBub2RlSGVpZ2h0OwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCSgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJbmV3IERpbWVuc2lvbihsYXJnZXN0V2lkdGggKiAyICsgMTAsIDIwICsgbGFyZ2VzdEhlaWdodAotCQkJCQkJKiAobGlzdC5zaXplKCkgLyAyICsgMSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHJlY2VudGx5IGFkZGRlZCBlZGl0cGFydHMuIFVzdWFsbHkgY2FsbGVkIAotCSAqIGJ5IGRpYWdyYW0gc2VydmljZXMgdG8gZG8gYXV0b2xheW91dCBhZGp1c3RtZW50LgotCSAqLwotCXB1YmxpYyBMaXN0PEVkaXRQYXJ0PiBnZXRSZWNlbnRseUFkZGVkUGFydHMoKSB7Ci0JCXJldHVybiByZWNlbnRseUFkZGVkUGFydHM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlY2VudGx5IGFkZGVkIGVkaXRwYXJ0cyBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCkgewotCQlyZWNlbnRseUFkZGVkUGFydHMuY2xlYXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5WSUVXX19WSVNJQkxFLmVxdWFscyhldmVudC5nZXRGZWF0dXJlKCkpKSB7Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSBldmVudC5nZXROb3RpZmllcigpOwotCQkJaWYgKG5vdGlmaWVyID09IGdldE1vZGVsKCkpCi0JCQkJcmVmcmVzaFZpc2liaWxpdHkoKTsKLQkJCWVsc2UgaWYgKGV2ZW50LmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0JCQkJRGlhZ3JhbUVkaXRvclV0aWwucmVmcmVzaENvbm5lY3Rpb25FZGl0UGFydHModGhpcyk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGY1Njc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBtb2RlbDsKLQkJCXN3aXRjaCAoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpIHsKLQotCQkJY2FzZSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgUm9sZU5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBSb2xlTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFRhc2tOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgVGFza05vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQoCi0JCQkJCQl2aWV3KTsKLQotCQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTGlua0VkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTGlua05hbWVFZGl0UGFydCh2aWV3KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoY29udGV4dCwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0IGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQkvLyBIYW5kbGUgY3JlYXRpb24gb2YgdW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgRWRpdFBhcnRzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2VsbEVkaXRvckxvY2F0b3IgZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKAotCQkJSVRleHRBd2FyZUVkaXRQYXJ0IHNvdXJjZSkgewotCQlpZiAoc291cmNlLmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKQotCQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoKFdyYXBMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoKExhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyBwcml2YXRlIGNsYXNzIFRleHRDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgd3JhcExhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVGV4dENlbGxFZGl0b3JMb2NhdG9yKFdyYXBMYWJlbCB3cmFwTGFiZWwpIHsKLQkJCXRoaXMud3JhcExhYmVsID0gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0V3JhcExhYmVsKCkgewotCQkJcmV0dXJuIHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWdldFdyYXBMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCQlpZiAoZ2V0V3JhcExhYmVsKCkuaXNUZXh0V3JhcHBlZCgpCi0JCQkJCSYmIGdldFdyYXBMYWJlbCgpLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKHJlY3Qud2lkdGgsCi0JCQkJCQlTV1QuREVGQVVMVCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJCS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQkJCX0KLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpIHsKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGFiZWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpIHsKLQkJCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldExhYmVsKCkuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWdldExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7Ci0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjcyM2E0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5MYWJlbExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCUlGaWd1cmUgcmVmRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLmdldEZpZ3VyZSgpOwotCQlpbnQgZHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBvZmZzZXQgPSBuZXcgUG9pbnQoZHgsIGR5KTsKLQkJZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuc2V0Q29uc3RyYWludChnZXRGaWd1cmUoKSwKLQkJCQluZXcgTGFiZWxMb2NhdG9yKHJlZkZpZ3VyZSwgb2Zmc2V0LCBnZXRLZXlQb2ludCgpKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcmVsb2NhdGUoSUZpZ3VyZSB0YXJnZXQpIHsKLQkJCQkJCVBvaW50IGxvY2F0aW9uID0gZ2V0UmVmZXJlbmNlUG9pbnQoKS5nZXRUcmFuc2xhdGVkKAotCQkJCQkJCQlnZXRPZmZzZXQoKSk7Ci0JCQkJCQlsb2NhdGlvbi50cmFuc2xhdGUoLXRhcmdldC5nZXRCb3VuZHMoKS53aWR0aCAvIDIsIDApOwotCQkJCQkJdGFyZ2V0LnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCQkJCXRhcmdldC5zZXRTaXplKG5ldyBEaW1lbnNpb24oCi0JCQkJCQkJCXRhcmdldC5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGgsIHRhcmdldAotCQkJCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0TGFiZWxMb2NhdGlvbihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24oKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLmdldEZpZ3VyZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldExhYmVsTG9jYXRpb24oSUZpZ3VyZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHBhcmVudC5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0xpbmtFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiYTJiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0xpbmtFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VkaXRQYXJ0IGV4dGVuZHMgQ29ubmVjdGlvbk5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpIHsKLQotCQlyZXR1cm4gbmV3IExpbmtGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb25FeCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMaW5rRmlndXJlKCkgewotCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2sKLQotCQkJKTsKLQkJCXNldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgewotCQkJUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IFBvbHlsaW5lRGVjb3JhdGlvbigpOwotCQkJLy8gZGlzcGF0Y2hOZXh0PwotCi0JCQlQb2ludExpc3QgcGwgPSBuZXcgUG9pbnRMaXN0KCk7Ci0JCQlwbC5hZGRQb2ludCgtMSwgMSk7Ci0JCQlwbC5hZGRQb2ludCgwLCAwKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAtMSk7Ci0JCQlkZi5zZXRUZW1wbGF0ZShwbCk7Ci0JCQlkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsKLQotCQkJcmV0dXJuIGRmOwotCQl9Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3Igb3ZlcnJpZGVDb2xvciA9IERpYWdyYW1Db3JlVXRpbC5nZXRMaW5rT3ZlcnJpZGVDb2xvcigoRWRnZSkgZ2V0TW9kZWwoKSk7Ci0JCXN1cGVyLnNldEZvcmVncm91bmRDb2xvcihvdmVycmlkZUNvbG9yICE9IG51bGwgPyBvdmVycmlkZUNvbG9yIDogY29sb3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRWaXNpYmlsaXR5KGJvb2xlYW4gdmlzKSB7Ci0JCXN1cGVyLnNldFZpc2liaWxpdHkodmlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5hY3RpdmF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua05hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9MaW5rTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjAxNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9MaW5rTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua05hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRLZXlQb2ludCgpIHsKLQkJcmV0dXJuIENvbm5lY3Rpb25Mb2NhdG9yLk1JRERMRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQkJZWxzZQotCQkJc2V0Rm9udChEaWFncmFtQ29uc3RhbnRzLmdldERlZmF1bHRGb250RGF0YSgpKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IFdyYXBMYWJlbCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyOTJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuV2lkZW5lZFdyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAyMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZU5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlSb2xlTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgUm9sZU5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChSb2xlTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBSb2xlTm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChSb2xlTm9kZU5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkKLQkJCQkJLmdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBSb2xlTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSb2xlTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKFJPTEVOT0RFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpZ18wLnNldEZvbnQoUk9MRU5PREVOQU1FRklHVVJFX0ZPTlQpOwotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7IC8vIG1vZGlmaWVkCi0JCQlzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZSb2xlTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZSb2xlTm9kZU5hbWVGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmUm9sZU5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBST0xFTk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LAotCQkJMTU2KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgUk9MRU5PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgRm9udChEaXNwbGF5Ci0JCQkuZ2V0Q3VycmVudCgpLCAiQXJpYWwiLCA4LCBTV1QuTk9STUFMKTsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDFkYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZU5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlJbWFnZSBpbWFnZSA9IERpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SWNvbihyZXNvbHZlU2VtYW50aWNFbGVtZW50KCksIHRydWUpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSAgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImRpYWdyYW0vUm9sZURlc2NyaXB0b3IuZ2lmIik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZSgpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCQllbHNlCi0JCQlzZXRGb250KERpYWdyYW1Db25zdGFudHMuZ2V0RGVmYXVsdEZvbnREYXRhKCkpOwotCi0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkMjhiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQXJyYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFJvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLAotCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCWlmIChjaGlsZC5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpID09IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSVRleHRBd2FyZUVkaXRQYXJ0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jcmVhdGVDaGlsZEVkaXRQb2xpY3koY2hpbGQpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGZpZ3VyZSA9IG5ldyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgewotCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlci5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlcgotCQkJCQkuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlci5zZXRTcGFjaW5nKDIwKTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbChmYWxzZSk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQkvLwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKQotCQkJLy8JCQkJCS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksCi0JCQkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkpOwotCQkJdGhpcy5zZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwKLQkJCTI1NSwgMjU1LCAxNTYpOwotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlYm91bmRzKCkgewotCQlSZWN0YW5nbGUgY29uc3RyYWludCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIG5vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJY29uc3RyYWludC5zZXRMb2NhdGlvbihuZXcgUG9pbnQobG9jYXRpb24uZ2V0WCgpLCBsb2NhdGlvbi5nZXRZKCkpKTsKLQkJfQotCi0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIGNvbnN0cmFpbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8JCWlmKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKXsKLQkJLy8JCQlBcnJhbmdlUmVxdWVzdCBhcnJhbmdlUmVxdWVzdCA9IG5ldyBBcnJhbmdlUmVxdWVzdChBY3Rpb25JZHMuQUNUSU9OX0FSUkFOR0VfQUxMKTsgTGlzdCBsID0gZ2V0Q2hpbGRyZW4oKTsKLQkJLy8JCQlhcnJhbmdlUmVxdWVzdC5zZXRQYXJ0c1RvQXJyYW5nZShsKTsgCi0JCS8vCQkJQ29tbWFuZCBhcnJhbmdlQ21kID0gZ2V0Q29tbWFuZChhcnJhbmdlUmVxdWVzdCk7IAotCQkvLwkJCWFycmFuZ2VDbWQuZXhlY3V0ZSgpOwotCQkvLwkJCQotCQkvLwkJCVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFJlcXVlc3RDb25zdGFudHMuUkVRX0FVVE9TSVpFKTsKLQkJLy8JCQlDb21tYW5kIGF1dG9TaXplQ21kID0gZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQkJLy8JCQlpZihhdXRvU2l6ZUNtZCAhPSBudWxsKXsKLQkJLy8JCQkJYXV0b1NpemVDbWQuZXhlY3V0ZSgpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUxpc3Q8Vmlldz4gbGlzdCA9IHN1cGVyLmdldE1vZGVsQ2hpbGRyZW4oKTsKLQotCQlDb21wYXJhdG9yPFZpZXc+IGMgPSBuZXcgQ29tcGFyYXRvcjxWaWV3PigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3IG8xLCBWaWV3IG8yKSB7Ci0JCQkJT2JqZWN0IG1vZGVsMSA9ICgoVmlldykgbzEpLmdldEVsZW1lbnQoKTsKLQkJCQlPYmplY3QgbW9kZWwyID0gKChWaWV3KSBvMikuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChtb2RlbDEgaW5zdGFuY2VvZiBUYXNrTm9kZSAmJiBtb2RlbDIgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQlpZiAoKChUYXNrTm9kZSkgbW9kZWwxKS5nZXRJbmRleCgpID49ICgoVGFza05vZGUpIG1vZGVsMikKLQkJCQkJCQkuZ2V0SW5kZXgoKSkKLQkJCQkJCXJldHVybiAxOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiAwOwotCQkJfQotCQl9OwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIGMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGUzZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0Lk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydCBleHRlbmRzCi0JCUxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc01vZGVsQ2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBldnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgewotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBzcGFjaW5nCi0JCXJlc3VsdC5nZXRTY3JvbGxQYW5lKCkuZ2V0Q29udGVudHMoKS5zZXRCb3JkZXIoCi0JCQkJbmV3IE1hcmdpbkJvcmRlcigwLCAwLCAwLCAwKSk7Ci0KLQkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7Ci0JCXJlc3VsdC5zZXRCb3JkZXIobnVsbCk7Ci0KLQkJLy8gZGlzYWJsZSBzY3JvbGxwYW5lCi0JCXJlc3VsdC5nZXRTY3JvbGxQYW5lKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gLS0gcGFyZW50IGxheW91dCBkb2VzIG5vdCBhY2NlcHQgRG91YmxlIGNvbnN0cmFpbnRzIGFzIHJhdGlvCi0JCS8vIHN1cGVyLnNldFJhdGlvKHJhdGlvKTsgCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVmYTE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlRhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5UYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuc2VydmljZS5EaWFncmFtUmVzZXRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uZ2xvYmFsLkdldEdsb2JhbEFjdGlvbkhhbmRsZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLk5vdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJVGFza05vZGVGaWd1cmUgZmlndXJlID0gbmV3IFRhc2tOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoVGFza05vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgVGFza05vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoVGFza05vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpCi0JCQkJCS5nZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGFza05vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVGFza05vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQl0aGlzLnNldExpbmVXaWR0aCgwKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKFRBU0tOT0RFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpZ18wLnNldEZvbnQoVEFTS05PREVOQU1FRklHVVJFX0ZPTlQpOwotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7IC8vIG1vZGlmaWVkCi0JCQlzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCQkJZmlnXzAuc2V0VGV4dFdyYXBBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCQlmaWdfMC5zZXRUZXh0V3JhcFdpZHRoKDEwMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmVGFza05vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmVGFza05vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZlRhc2tOb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IFRBU0tOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IEZvbnQoRGlzcGxheQotCQkJLmdldEN1cnJlbnQoKSwgIkFyaWFsIiwgOCwgU1dULk5PUk1BTCk7CS8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFRBU0tOT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAyNTUsCi0JCQkxNTYpOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza05vZGVfSW5kZXgoKS5lcXVhbHMoZmVhdHVyZSkpewotCQkJRWRpdFBhcnQgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQgKXsKLQkJCQkoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpcGFyZW50KS5yZWZyZXNoKCk7Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVSZXNldExheW91dChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IHBhcmVudCl7Ci0JCUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoR3JhcGhpY2FsVmlld2VyKSgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydClwYXJlbnQpLmdldFZpZXdlcigpOwotCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpdmlld2VyLmdldENvbnRlbnRzKCk7Ci0JCUxpc3Q8RWRpdFBhcnQ+IGxvY2FsID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQkJaWYoZGVwLmdldENoaWxkcmVuKCkgIT0gbnVsbCAmJiAhZGVwLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKXsKLQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGRlcC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKCEobmV4dCBpbnN0YW5jZW9mIE5vdGVFZGl0UGFydCkpewotCQkJCQlsb2NhbC5hZGQoKEVkaXRQYXJ0KW5leHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGxvY2FsKTsKLS8vCQlEaWFncmFtUmVzZXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVJlc2V0U2VydmljZSgoKERpYWdyYW1HcmFwaGljYWxWaWV3ZXIpdmlld2VyKS5nZXRFCi0vLwkJCQl2aWV3ZXIsIGdldEVkaXREb21haW4oKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0vLwkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyM2U2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBEaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEljb24ocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpLCB0cnVlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJkaWFncmFtL1Rhc2tEZXNjcmlwdG9yLmdpZiIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpIDwgMTYpIHsKLQkJCWludCBnYXAgPSAxNiAtIHRleHQubGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdhcCAvIDI7IGkrKykgewotCQkJCXRleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdhcCAvIDI7IGkrKykgewotCQkJCXRleHQgPSAiICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJdGV4dCA9IERpYWdyYW1Db3JlVXRpbC53cmFwKHRleHQsIDEyKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuVGFza05vZGVfMjAwMjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIERpYWdyYW1FZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQkJZWxzZQotCQkJc2V0Rm9udChEaWFncmFtQ29uc3RhbnRzLmdldERlZmF1bHRGb250RGF0YSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQ3N2U1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5SYWlzZWRNYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsCi0JCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJaWYgKGNoaWxkLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSkgPT0gbnVsbCkgewotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJVGV4dEF3YXJlRWRpdFBhcnQpIHsKLQkJCQkJCXJldHVybiBuZXcgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZmlndXJlID0gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpIHsKLQotCQkJb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIKLQkJCQkJLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZyg1KTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbCh0cnVlKTsKLQotCQkJdGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7Ci0KLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCS8vCQkJdGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpCi0JCQkvLwkJCQkJLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwKLQkJCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDApKSk7Ci0JCQl0aGlzLnNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLAotCQkJMjU1LCAyNTUsIDIwNSk7Ci0KLQkvKioKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlYm91bmRzKCkgewotCQlSZWN0YW5nbGUgY29uc3RyYWludCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIG5vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJY29uc3RyYWludC5zZXRMb2NhdGlvbihuZXcgUG9pbnQobG9jYXRpb24uZ2V0WCgpLCBsb2NhdGlvbi5nZXRZKCkpKTsKLQkJfQotCQkvLwkJY29uc3RyYWludC53aWR0aCA9IGdldE5vZGUoKS5nZXRXaWR0aCgpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBjb25zdHJhaW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTFhMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0Lk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMKLQkJTGlzdENvbXBhcnRtZW50RWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTW9kZWxDaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIGV2dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7Ci0JCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcgotCQkJCS5jcmVhdGVGaWd1cmUoKTsKLQotCQkvLyByZW1vdmUgdGhlIHNwYWNpbmcKLQkJcmVzdWx0LmdldFNjcm9sbFBhbmUoKS5nZXRDb250ZW50cygpLnNldEJvcmRlcigKLQkJCQluZXcgTWFyZ2luQm9yZGVyKDAsIDAsIDAsIDApKTsKLQotCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsKLQkJcmVzdWx0LnNldEJvcmRlcihudWxsKTsKLQotCQkvLyBkaXNhYmxlIHNjcm9sbHBhbmUgJiBjb21wYXJ0bWVudCB0aXRsZQotCQlyZXN1bHQuZ2V0U2Nyb2xsUGFuZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsKLQkJLy8gbm90aGluZyB0byBkbyAtLSBwYXJlbnQgbGF5b3V0IGRvZXMgbm90IGFjY2VwdCBEb3VibGUgY29uc3RyYWludHMgYXMgcmF0aW8KLQkJLy8gc3VwZXIuc2V0UmF0aW8ocmF0aW8pOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4NWEwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAyMDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQkoKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQotCQkJCQkJCS5nZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQkJCWZpZ18wLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWdfMC5zZXRGb250KFdPUktQUk9EVUNUTk9ERU5BTUVGSUdVUkVfRk9OVCk7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOyAvLyBtb2RpZmllZAotCQkJc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0JCQlmaWdfMC5zZXRUZXh0V3JhcEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgRm9udChEaXNwbGF5Ci0JCQkuZ2V0Q3VycmVudCgpLCAiQXJpYWwiLCA4LCBTV1QuTk9STUFMKTsJLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKAotCQkJbnVsbCwgMjU1LCAyNTUsIDIwNSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MmE1ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCUltYWdlIGltYWdlID0gRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSwgdHJ1ZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9ICBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZGlhZ3JhbS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQl0ZXh0ID0gRGlhZ3JhbUNvcmVVdGlsLndyYXAodGV4dCwgMyk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMzsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIERpYWdyYW1FZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCQllbHNlCi0JCQlzZXRGb250KERpYWdyYW1Db25zdGFudHMuZ2V0RGVmYXVsdEZvbnREYXRhKCkpOwotCX0KLQkKLQkKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjY4OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbENvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBnZXRTZW1hbnRpY0hvc3QoKSB7Ci0JCXJldHVybiBob3N0KCkuZ2V0TW9kZWwoKSAhPSBudWxsID8gc3VwZXIuZ2V0U2VtYW50aWNIb3N0KCkgOiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoT25BY3RpdmF0ZSgpIHsJCQotCQlzdXBlci5yZWZyZXNoT25BY3RpdmF0ZSgpOwotCQkKLQkJRWRpdFBhcnQgZXAgPSBnZXRIb3N0KCk7Ci0JCWlmKGVwIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQlEaWFncmFtRWRpdG9yVXRpbC5pbml0aWFsaXplT25BY3RpdmF0ZSgoRGlhZ3JhbUVkaXRQYXJ0KSBlcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChOb2RlQ29udGFpbmVyKSBtb2RlbE9iamVjdCkuZ2V0Tm9kZXMoKQotCQkJCS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQlub2RlVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsCi0JCQkJCW5leHRWYWx1ZSk7Ci0JCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgKHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCkgfHwgdmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0Q29ubmVjdGlvbnMoQ29sbGVjdGlvbiBjb25uZWN0aW9ucywKLQkJCU5vZGVDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJY29ubmVjdGlvbnMuYWRkQWxsKG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJCWdldENvbm5lY3Rpb25zKGNvbm5lY3Rpb25zLCAoTm9kZUNvbnRhaW5lcikgbm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0Nvbm5lY3Rpb25zTGlzdCgpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGFkZCA9IChBY3Rpdml0eURldGFpbERpYWdyYW0pICgoVmlldykgZ2V0SG9zdCgpCi0JCQkJLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0Q29ubmVjdGlvbnMoY29ubmVjdGlvbnMsIGFkZCk7Ci0JCXJldHVybiBjb25uZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2VFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gKChMaW5rKSByZWxhdGlvbnNoaXApLmdldFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFRhcmdldEVsZW1lbnQoRU9iamVjdCByZWxhdGlvbnNoaXApIHsKLQkJaWYgKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIExpbmspIHsKLQkJCXJldHVybiAoKExpbmspIHJlbGF0aW9uc2hpcCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oRWRnZSBjb25uZWN0b3IsCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXJldHVybiBzdXBlci5zaG91bGRJbmNsdWRlQ29ubmVjdGlvbihjb25uZWN0b3IsIGNoaWxkcmVuKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7Ci0JCUxpc3QgY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJY3JlYXRlZFZpZXdzLmFkZEFsbChyZWZyZXNoU2VtYW50aWNDaGlsZHJlbigpKTsKLQkJTGlzdCBjcmVhdGVkQ29ubmVjdGlvblZpZXdzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJY3JlYXRlZENvbm5lY3Rpb25WaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ29ubmVjdGlvbnMoKSk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hDb25uZWN0aW9ucygpKTsKLQotCQkvLwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7Ci0JCS8vCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyCi0JCS8vCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpCi0JCS8vCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7Ci0JCS8vCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7Ci0JCS8vCQl9Ci0KLQkJY3JlYXRlZFZpZXdzLmFkZEFsbChjcmVhdGVkQ29ubmVjdGlvblZpZXdzKTsKLQkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBteUxpbmtEZXNjcmlwdG9ycyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNYXAgbXlFT2JqZWN0MlZpZXdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiByZWZyZXNoQ29ubmVjdGlvbnMoKSB7Ci0JCXRyeSB7Ci0JCQljb2xsZWN0QWxsTGlua3MoZ2V0RGlhZ3JhbSgpKTsKLQkJCUNvbGxlY3Rpb24gZXhpc3RpbmdMaW5rcyA9IG5ldyBMaW5rZWRMaXN0KGdldERpYWdyYW0oKS5nZXRFZGdlcygpKTsKLQkJCWZvciAoSXRlcmF0b3IgZGlhZ3JhbUxpbmtzID0gZXhpc3RpbmdMaW5rcy5pdGVyYXRvcigpOyBkaWFncmFtTGlua3MKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIG5leHREaWFncmFtTGluayA9IChFZGdlKSBkaWFncmFtTGlua3MubmV4dCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtPYmplY3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtTcmMgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0U291cmNlKCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua0RzdCA9IG5leHREaWFncmFtTGluay5nZXRUYXJnZXQoKQotCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQlpbnQgZGlhZ3JhbUxpbmtWaXN1YWxJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQobmV4dERpYWdyYW1MaW5rKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIG1vZGVsTGlua0Rlc2NyaXB0b3JzID0gbXlMaW5rRGVzY3JpcHRvcnMKLQkJCQkJCS5pdGVyYXRvcigpOyBtb2RlbExpbmtEZXNjcmlwdG9ycy5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbW9kZWxMaW5rRGVzY3JpcHRvcnMKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUxpbmtPYmplY3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJLmdldExpbmtFbGVtZW50KCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1NyYyA9PSBuZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U291cmNlKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua0RzdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkJCS5nZXREZXN0aW5hdGlvbigpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtWaXN1YWxJRCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkJCS5nZXRWaXN1YWxJRCgpKSB7Ci0JCQkJCQlkaWFncmFtTGlua3MucmVtb3ZlKCk7Ci0JCQkJCQltb2RlbExpbmtEZXNjcmlwdG9ycy5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRlbGV0ZVZpZXdzKGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbnMobXlMaW5rRGVzY3JpcHRvcnMpOwotCQl9IGZpbmFsbHkgewotCQkJbXlMaW5rRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCW15RU9iamVjdDJWaWV3TWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RBbGxMaW5rcyhWaWV3IHZpZXcpIHsKLQkJRU9iamVjdCBtb2RlbEVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJaW50IGRpYWdyYW1FbGVtZW50VmlzdWFsSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsKLQkJc3dpdGNoIChkaWFncmFtRWxlbWVudFZpc3VhbElEKSB7Ci0JCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCW15RU9iamVjdDJWaWV3TWFwLnB1dChtb2RlbEVsZW1lbnQsIHZpZXcpOwotCQkJc3RvcmVMaW5rcyhtb2RlbEVsZW1lbnQsIGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJZGVmYXVsdDogewotCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGNoaWxkcmVuID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNoaWxkcmVuCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGRyZW4ubmV4dCgpOwotCQkJCWNvbGxlY3RBbGxMaW5rcyhjaGlsZFZpZXcpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBjcmVhdGVDb25uZWN0aW9ucyhDb2xsZWN0aW9uIGxpbmtEZXNjcmlwdG9ycykgewotCQlpZiAobGlua0Rlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJTGlzdCBhZGFwdGVycyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IgPSBsaW5rRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJZmluYWwgTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yID0gKExpbmtEZXNjcmlwdG9yKSBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvcgotCQkJCQkubmV4dCgpOwotCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSBnZXRFZGl0UGFydEZvcihuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJLmdldFNvdXJjZSgpKTsKLQkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXREZXN0aW5hdGlvbigpKTsKLQkJCWlmIChzb3VyY2VFZGl0UGFydCA9PSBudWxsIHx8IHRhcmdldEVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdC5Db25uZWN0aW9uVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yKAotCQkJCQluZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U2VtYW50aWNBZGFwdGVyKCksIG51bGwsCi0JCQkJCVZpZXdVdGlsLkFQUEVORCwgZmFsc2UsICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QgY2NyID0gbmV3IENyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdCgKLQkJCQkJZGVzY3JpcHRvcik7Ci0JCQljY3Iuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX1NUQVJUKTsKLQkJCWNjci5zZXRTb3VyY2VFZGl0UGFydChzb3VyY2VFZGl0UGFydCk7Ci0JCQlzb3VyY2VFZGl0UGFydC5nZXRDb21tYW5kKGNjcik7Ci0JCQljY3Iuc2V0VGFyZ2V0RWRpdFBhcnQodGFyZ2V0RWRpdFBhcnQpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9FTkQpOwotCQkJQ29tbWFuZCBjbWQgPSB0YXJnZXRFZGl0UGFydC5nZXRDb21tYW5kKGNjcik7Ci0JCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7Ci0JCQkJSUFkYXB0YWJsZSB2aWV3QWRhcHRlciA9IChJQWRhcHRhYmxlKSBjY3IuZ2V0TmV3T2JqZWN0KCk7Ci0JCQkJaWYgKHZpZXdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlcnMuYWRkKHZpZXdBZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0IGdldEVkaXRQYXJ0Rm9yKEVPYmplY3QgbW9kZWxFbGVtZW50KSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBteUVPYmplY3QyVmlld01hcC5nZXQobW9kZWxFbGVtZW50KTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIChFZGl0UGFydCkgZ2V0SG9zdCgpLmdldFZpZXdlcigpLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJCXZpZXcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZUxpbmtzKEVPYmplY3QgY29udGFpbmVyLCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcyA9IGNvbnRhaW5lci5lQ2xhc3MoKTsKLQkJc3RvcmVGZWF0dXJlTW9kZWxGYWNldExpbmtzKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzLCBkaWFncmFtKTsKLQkJc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MpIHsKLQkJc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0xpbmtfMzAwMShjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3NfTGlua18zMDAxKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcykgewotCQlpZiAoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCkuaXNTdXBlclR5cGVPZihjb250YWluZXJNZXRhY2xhc3MpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoTm9kZSkgY29udGFpbmVyKS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkKLQkJCQkJLml0ZXJhdG9yKCk7IHZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBuZXh0VmFsdWUgPSAoKEVPYmplY3QpIHZhbHVlcy5uZXh0KCkpOwotCQkJCWludCBsaW5rVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQobmV4dFZhbHVlKTsKLQkJCQlpZiAoTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBsaW5rVklEKSB7Ci0JCQkJCU9iamVjdCBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCA9ICgoTGluaykgbmV4dFZhbHVlKQotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaWYgKHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJRU9iamVjdCBkc3QgPSAoRU9iamVjdCkgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQ7Ci0JCQkJCQlzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCA9ICgoTGluaykgbmV4dFZhbHVlKQotCQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJRU9iamVjdCBzcmMgPSAoRU9iamVjdCkgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQ7Ci0JCQkJCQkJbXlMaW5rRGVzY3JpcHRvcnMuYWRkKG5ldyBMaW5rRGVzY3JpcHRvcihzcmMsIGRzdCwKLQkJCQkJCQkJCW5leHRWYWx1ZSwgRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEsCi0JCQkJCQkJCQlsaW5rVklEKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVGZWF0dXJlTW9kZWxGYWNldExpbmtzKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcywgRGlhZ3JhbSBkaWFncmFtKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXREaWFncmFtKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgTGlua0Rlc2NyaXB0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlTb3VyY2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteURlc3RpbmF0aW9uOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlMaW5rRWxlbWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgbXlWaXN1YWxJRDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJQWRhcHRhYmxlIG15U2VtYW50aWNBZGFwdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sCi0JCQkJRU9iamVjdCBsaW5rRWxlbWVudCwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgbGlua1ZJRCkgewotCQkJdGhpcyhzb3VyY2UsIGRlc3RpbmF0aW9uLCBsaW5rVklEKTsKLQkJCW15TGlua0VsZW1lbnQgPSBsaW5rRWxlbWVudDsKLQkJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsKLQkJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IEVPYmplY3RBZGFwdGVyKGxpbmtFbGVtZW50KSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sCi0JCQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgbGlua1ZJRCkgewotCQkJdGhpcyhzb3VyY2UsIGRlc3RpbmF0aW9uLCBsaW5rVklEKTsKLQkJCW15TGlua0VsZW1lbnQgPSBudWxsOwotCQkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgSUFkYXB0YWJsZSgpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sIGludCBsaW5rVklEKSB7Ci0JCQlteVNvdXJjZSA9IHNvdXJjZTsKLQkJCW15RGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQkJCW15VmlzdWFsSUQgPSBsaW5rVklEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiBteVNvdXJjZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXREZXN0aW5hdGlvbigpIHsKLQkJCXJldHVybiBteURlc3RpbmF0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldExpbmtFbGVtZW50KCkgewotCQkJcmV0dXJuIG15TGlua0VsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGludCBnZXRWaXN1YWxJRCgpIHsKLQkJCXJldHVybiBteVZpc3VhbElEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBJQWRhcHRhYmxlIGdldFNlbWFudGljQWRhcHRlcigpIHsKLQkJCXJldHVybiBteVNlbWFudGljQWRhcHRlcjsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDQ1NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZHMuRHVwbGljYXRlRU9iamVjdHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLlJvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROb2RlQ29udGFpbmVyX05vZGVzKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFJvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyID09IHJlcQotCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROb2RlQ29udGFpbmVyX05vZGVzKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkvLwkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkvLwkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZChlZGl0aW5nRG9tYWluLCByZXEpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kIGV4dGVuZHMKLQkJCUR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoCi0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCQlEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihlZGl0aW5nRG9tYWluLCByZXEuZ2V0TGFiZWwoKSwgcmVxCi0JCQkJCS5nZXRFbGVtZW50c1RvQmVEdXBsaWNhdGVkKCksIHJlcQotCQkJCQkuZ2V0QWxsRHVwbGljYXRlZEVsZW1lbnRzTWFwKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNThkNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuUmVjb25uZWN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFZGl0SGVscGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuR2V0RWRpdENvbnRleHRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuU2V0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5EaWFncmFtQmFzZUVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMgU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEV4dGVuZGVkIHJlcXVlc3QgZGF0YSBrZXkgdG8gaG9sZCBlZGl0cGFydCB2aXN1YWwgaWQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU1VBTF9JRF9LRVkgPSAidmlzdWFsX2lkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkIHZpc3VhbCBpZCBvZiBlZGl0ZWQgZWRpdHBhcnQgdG8gZXh0ZW5kZWQgZGF0YSBvZiB0aGUgcmVxdWVzdAotCSAqIHNvIGNvbW1hbmQgc3dpdGNoIGNhbiBkZWNpZGUgd2hhdCBraW5kIG9mIGRpYWdyYW0gZWxlbWVudCBpcyBiZWluZyBlZGl0ZWQuCi0JICogSXQgaXMgZG9uZSBpbiB0aG9zZSBjYXNlcyB3aGVuIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRlZHVjZSBkaWFncmFtCi0JICogZWxlbWVudCBraW5kIGZyb20gZG9tYWluIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVjb25uZWN0UmVxdWVzdCkgewotCQkJT2JqZWN0IHZpZXcgPSAoKFJlY29ubmVjdFJlcXVlc3QpIHJlcXVlc3QpLmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCS5nZXRNb2RlbCgpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQoKFZpZXcpIHZpZXcpKTsKLQkJCQlyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLnB1dChWSVNVQUxfSURfS0VZLCBpZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB2aXN1YWwgaWQgZnJvbSByZXF1ZXN0IHBhcmFtZXRlcnMuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCU9iamVjdCBpZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFZJU1VBTF9JRF9LRVkpOwotCQlyZXR1cm4gaWQgaW5zdGFuY2VvZiBJbnRlZ2VyID8gKChJbnRlZ2VyKSBpZCkuaW50VmFsdWUoKSA6IC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlFZGl0Q29tbWFuZFJlcXVlc3QgY29tcGxldGVkUmVxdWVzdCA9IGNvbXBsZXRlUmVxdWVzdChyZXF1ZXN0KTsKLQkJT2JqZWN0IGVkaXRIZWxwZXJDb250ZXh0ID0gY29tcGxldGVkUmVxdWVzdC5nZXRFZGl0SGVscGVyQ29udGV4dCgpOwotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBWaWV3Ci0JCQkJfHwgKGVkaXRIZWxwZXJDb250ZXh0IGluc3RhbmNlb2YgSUVkaXRIZWxwZXJDb250ZXh0ICYmICgoSUVkaXRIZWxwZXJDb250ZXh0KSBlZGl0SGVscGVyQ29udGV4dCkKLQkJCQkJCS5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBWaWV3KSkgewotCQkJLy8gbm8gc2VtYW50aWMgY29tbWFuZHMgYXJlIHByb3ZpZGVkIGZvciBwdXJlIGRlc2lnbiBlbGVtZW50cwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGVkaXRIZWxwZXJDb250ZXh0ID09IG51bGwpIHsKLQkJCWVkaXRIZWxwZXJDb250ZXh0ID0gVmlld1V0aWwKLQkJCQkJLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0RWxlbWVudFR5cGUoZWRpdEhlbHBlckNvbnRleHQpOwotCQlpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoCi0JCQkJIm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQllbGVtZW50VHlwZSA9IG51bGw7Ci0JCX0KLQkJQ29tbWFuZCBlcENvbW1hbmQgPSBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goY29tcGxldGVkUmVxdWVzdCk7Ci0JCWlmIChlcENvbW1hbmQgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVwQ29tbWFuZCBpbnN0YW5jZW9mIElDb21tYW5kUHJveHkgPyAoKElDb21tYW5kUHJveHkpIGVwQ29tbWFuZCkKLQkJCQkJLmdldElDb21tYW5kKCkKLQkJCQkJOiBuZXcgQ29tbWFuZFByb3h5KGVwQ29tbWFuZCk7Ci0JCQljb21wbGV0ZWRSZXF1ZXN0LnNldFBhcmFtZXRlcigKLQkJCQkJRGlhZ3JhbUJhc2VFZGl0SGVscGVyLkVESVRfUE9MSUNZX0NPTU1BTkQsIGNvbW1hbmQpOwotCQl9Ci0JCUNvbW1hbmQgZWhDb21tYW5kID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwpIHsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBlbGVtZW50VHlwZS5nZXRFZGl0Q29tbWFuZChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQlpZiAoIShjb21tYW5kIGluc3RhbmNlb2YgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQpKSB7Ci0JCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCWNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkJCQludWxsKS5jb21wb3NlKGNvbW1hbmQpOwotCQkJCX0KLQkJCQllaENvbW1hbmQgPSBuZXcgSUNvbW1hbmRQcm94eShjb21tYW5kKTsKLQkJCX0KLQkJfQotCQlib29sZWFuIHNob3VsZFByb2NlZWQgPSB0cnVlOwotCQlpZiAoY29tcGxldGVkUmVxdWVzdCBpbnN0YW5jZW9mIERlc3Ryb3lSZXF1ZXN0KSB7Ci0JCQlzaG91bGRQcm9jZWVkID0gc2hvdWxkUHJvY2VlZCgoRGVzdHJveVJlcXVlc3QpIGNvbXBsZXRlZFJlcXVlc3QpOwotCQl9Ci0JCWlmIChzaG91bGRQcm9jZWVkKSB7Ci0JCQlpZiAoY29tcGxldGVkUmVxdWVzdCBpbnN0YW5jZW9mIERlc3Ryb3lSZXF1ZXN0KSB7Ci0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCUNvbW1hbmQgZGVsZXRlVmlld0NvbW1hbmQgPSBuZXcgSUNvbW1hbmRQcm94eSgKLQkJCQkJCW5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sIChWaWV3KSBnZXRIb3N0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCkpKTsKLQkJCQllaENvbW1hbmQgPSBlaENvbW1hbmQgPT0gbnVsbCA/IGRlbGV0ZVZpZXdDb21tYW5kIDogZWhDb21tYW5kCi0JCQkJCQkuY2hhaW4oZGVsZXRlVmlld0NvbW1hbmQpOwotCQkJfQotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVFbGVtZW50UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZUNvbW1hbmQoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENvbmZpZ3VyZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDb25maWd1cmVDb21tYW5kKChDb25maWd1cmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldER1cGxpY2F0ZUNvbW1hbmQoKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRFZGl0Q29udGV4dENvbW1hbmQoKEdldEVkaXRDb250ZXh0UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBNb3ZlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldE1vdmVDb21tYW5kKChNb3ZlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBTZXRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0U2V0Q29tbWFuZCgoU2V0UmVxdWVzdCkgcmVxKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29uZmlndXJlQ29tbWFuZChDb25maWd1cmVSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNldENvbW1hbmQoU2V0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldEVkaXRDb250ZXh0Q29tbWFuZChHZXRFZGl0Q29udGV4dFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREdXBsaWNhdGVDb21tYW5kKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDb21tYW5kKE1vdmVSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TVNMV3JhcHBlcihJQ29tbWFuZCBjbWQpIHsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNtZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNlbWFudGljRWxlbWVudCgpIHsKLQkJcmV0dXJuIFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG5ldyByZWxhdGlvbnNoaXAgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZ29lcyB1cCBieSBjb250YWlubWVudCBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbQotCSAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mCi0JICogdGhlIHNwZWNpZmllZCBjb250YWluZXIgY2xhc3MuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihPYmplY3QgdWVsZW1lbnQsCi0JCQlFQ2xhc3MgY29udGFpbmVyQ2xhc3MsIElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCWlmICh1ZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSB1ZWxlbWVudDsKLQkJCWZvciAoOyBlbGVtZW50ICE9IG51bGw7IGVsZW1lbnQgPSBlbGVtZW50LmVDb250YWluZXIoKSkgewotCQkJCWlmIChjb250YWluZXJDbGFzcy5pc1N1cGVyVHlwZU9mKGVsZW1lbnQuZUNsYXNzKCkpKSB7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVkaXRpbmcgZG9tYWluIGZyb20gdGhlIGhvc3QgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmQgdG8gZGVzdHJveSB0aGUgbGluay4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKFZpZXcgdmlldywgYm9vbGVhbiBjb25maXJtKSB7Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkKLQkJCQkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh2aWV3KTsKLQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KAotCQkJCWdldEVkaXRpbmdEb21haW4oKSwgY29uZmlybSk7Ci0JCXJldHVybiBlZGl0UGFydC5nZXRDb21tYW5kKG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kcyB0byBkZXN0cm95IGFsbCBob3N0IGluY29taW5nIGFuZCBvdXRnb2luZyBsaW5rcy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kQ29tbWFuZCBnZXREZXN0cm95RWRnZXNDb21tYW5kKGJvb2xlYW4gY29uZmlybSkgewotCQlDb21wb3VuZENvbW1hbmQgY21kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSkpOwotCQl9Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGlua0NvbnN0cmFpbnRzIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkNyZWF0ZUxpbmtfMzAwMShOb2RlIGNvbnRhaW5lciwgTm9kZSBzb3VyY2UsCi0JCQkJTm9kZSB0YXJnZXQpIHsKLQkJCXJldHVybiBjYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRXhpc3RMaW5rXzMwMDEoTm9kZSBjb250YWluZXIsIE5vZGUgc291cmNlLAotCQkJCU5vZGUgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1FeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3ODEwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1FeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXlvdXRFZGl0UG9saWN5IGdldFJlYWxMYXlvdXRFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWxMYXlvdXRFZGl0UG9saWN5KExheW91dEVkaXRQb2xpY3kgcmVhbExheW91dEVkaXRQb2xpY3kpIHsKLQkJdGhpcy5yZWFsTGF5b3V0RWRpdFBvbGljeSA9IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVybmFsTGFiZWwoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRFeHRlcm5hbExhYmVscyhHcm91cFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChlZGl0UGFydCkpIHsKLQkJCQkJZWRpdFBhcnRzLmFkZChlZGl0UGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSRVFfTU9WRV9DSElMRFJFTi5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKSB7Ci0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNiUmVxdWVzdCA9IChDaGFuZ2VCb3VuZHNSZXF1ZXN0KSByZXF1ZXN0OwotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscyhjYlJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBjYlJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0JCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJCQkmJiBlZGl0UGFydHMuc2l6ZSgpID4gZXh0TGFiZWxzLnNpemUoKSkgewotCQkJCQlMaXN0IG90aGVyID0gbmV3IEFycmF5TGlzdChlZGl0UGFydHMpOwotCQkJCQlvdGhlci5yZW1vdmVBbGwoZXh0TGFiZWxzKTsKLQkJCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhvdGhlcik7Ci0JCQkJCWNtZCA9IHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJfQotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZXh0TGFiZWxzKTsKLQkJCQlDb21tYW5kIGV4dExhYmVsc0NtZCA9IGdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhlZGl0UGFydHMpOwotCQkJCXJldHVybiBjbWQgPT0gbnVsbCA/IGV4dExhYmVsc0NtZCA6IGNtZC5jaGFpbihleHRMYWJlbHNDbWQpOwotCQkJfQotCQl9Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0KSB7Ci0JCQlMaXN0IGV4dExhYmVscyA9IGdldEV4dGVybmFsTGFiZWxzKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5ID09IG51bGwgPyBudWxsIDogcmVhbExheW91dEVkaXRQb2xpY3kKLQkJCQkuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb25zdHJhaW50Rm9yKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldykgY2hpbGQKLQkJCQkuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpKQotCQkJCS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKGR4LCBkeSwgMCwgMCk7Ci0JCWNoaWxkLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCXIudHJhbnNsYXRlKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJJiYgcmVhbExheW91dEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci51bmRlcnN0YW5kc1JlcXVlc3QocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVDaGlsZChFZGl0UGFydCBjaGlsZCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIuc2V0SG9zdChob3N0KTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNldEhvc3QoaG9zdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5hY3RpdmF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmRlYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3kuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93VGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZXJhc2VUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTdiZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmVkaXRoZWxwZXJzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHsKLQkJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlciByZXF1ZXN0QWRhcHRlciA9ICgoQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgcmVxdWVzdCkKLQkJCQkJLmdldENvbm5lY3Rpb25WaWV3QW5kRWxlbWVudERlc2NyaXB0b3IoKQotCQkJCQkuZ2V0Q3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyKCk7Ci0JCQlyZXR1cm4gKElFbGVtZW50VHlwZSkgcmVxdWVzdEFkYXB0ZXIuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uV2l0aFJlb3JpZW50ZWRWaWV3Q29tcGxldGVDb21tYW5kKAotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQlJQ29tbWFuZFByb3h5IGMgPSAoSUNvbW1hbmRQcm94eSkgc3VwZXIKLQkJCQkuZ2V0Q29ubmVjdGlvbkNvbXBsZXRlQ29tbWFuZChyZXF1ZXN0KTsKLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IChDb21wb3NpdGVDb21tYW5kKSBjLmdldElDb21tYW5kKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCURpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCByY3ZDb21tYW5kID0gbmV3IERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCBudWxsKTsKLQkJcmN2Q29tbWFuZC5zZXRFZGdlQWRhcHRvcihnZXRWaWV3QWRhcHRlcigpKTsKLQkJY2MuY29tcG9zZShyY3ZDb21tYW5kKTsKLQkJcmV0dXJuIGM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTZmZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19UaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMID0gRGlhZ3JhbVVJTWVzc2FnZXMuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGVfRG9Ob3RQcm9tcHRBZ2FpblRvZ2dsZV9sYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCWJvb2xlYW4gaXNEZWxldGVGcm9tS2V5Qm9hcmQgPSBkZWxldGVSZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQ7Ci0JCWlmIChzaG91bGREZWxldGVTZW1hbnRpYygpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBwcm9jZWVkVG9EZWxldGVWaWV3ID0gdHJ1ZTsKLQkJCWlmIChpc0RlbGV0ZUZyb21LZXlCb2FyZCkgewotCQkJCUdyb3VwUmVxdWVzdFZpYUtleWJvYXJkIGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkID0gKEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSBkZWxldGVSZXF1ZXN0OwotCQkJCWlmIChncm91cFJlcXVlc3RWaWFLZXlib2FyZC5pc1Nob3dJbmZvcm1hdGlvbkRpYWxvZygpKSB7Ci0JCQkJCXByb2NlZWRUb0RlbGV0ZVZpZXcgPSBzaG93UHJvbXB0KCk7Ci0JCQkJCWdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLnNldFNob3dJbmZvcm1hdGlvbkRpYWxvZyhmYWxzZSk7Ci0JCQkJCWlmICghKHByb2NlZWRUb0RlbGV0ZVZpZXcpKQotCQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVNlbWFudGljKCkgewotCQlBc3NlcnQuaXNUcnVlKGdldEhvc3QoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KTsKLQkJQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgY2VwID0gKEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JCWJvb2xlYW4gaXNDYW5vbmljYWwgPSBmYWxzZTsKLQkJaWYgKGNlcC5nZXRTb3VyY2UoKSAhPSBudWxsKQotCQkJaXNDYW5vbmljYWwgPSBJc0Nhbm9uaWNhbChjZXAuZ2V0U291cmNlKCkpOwotCQlpZiAoY2VwLmdldFRhcmdldCgpICE9IG51bGwpCi0JCQlyZXR1cm4gaXNDYW5vbmljYWwgPyBpc0Nhbm9uaWNhbCA6IElzQ2Fub25pY2FsKGNlcC5nZXRUYXJnZXQoKSk7Ci0JCXJldHVybiBpc0Nhbm9uaWNhbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIElzQ2Fub25pY2FsKEVkaXRQYXJ0IGVwKSB7Ci0JCUVkaXRQYXJ0IHBhcmVudCA9IGVwLmdldFBhcmVudCgpOwotCQlyZXR1cm4gcGFyZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQgPyAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJlbnQpCi0JCQkJLmlzQ2Fub25pY2FsKCkKLQkJCQk6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkobmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIgc2VtUmVxID0gbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChlZGl0aW5nRG9tYWluLCBmYWxzZSksIGRlbGV0ZVJlcXVlc3QKLQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKSk7Ci0JCUNvbW1hbmQgc2VtYW50aWNDbWQgPSBnZXRIb3N0KCkuZ2V0Q29tbWFuZChzZW1SZXEpOwotCQlpZiAoc2VtYW50aWNDbWQgIT0gbnVsbCAmJiBzZW1hbnRpY0NtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjYyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJCWNjLmFkZChzZW1hbnRpY0NtZCk7Ci0JCQlyZXR1cm4gY2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJvbXB0KCkgewotCQlib29sZWFuIHByb21wdCA9ICgoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKQotCQkJCS5nZXRCb29sZWFuKElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAocHJvbXB0KQotCQkJaWYgKHNob3dNZXNzYWdlRGlhbG9nKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dNZXNzYWdlRGlhbG9nKCkgewotCQlNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZQotCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUsCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFLAotCQkJCQkJREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCwgZmFsc2UsCi0JCQkJCQkoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKQotCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZXRlQ29tbWFuZCgoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0MmZjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5RXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlckV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kgZXh0ZW5kcyBOb25SZXNpemFibGVFZGl0UG9saWN5RXggewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJCXNob3dGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaGlkZVNlbGVjdGlvbigpOwotCQkJYWRkRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVGb2N1cygpOwotCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOwotCQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgRmlndXJlKCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsKLQkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7Ci0JCXRhcmdldC5zZXRUZXh0KHNvdXJjZS5nZXRUZXh0KCkpOwotCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsKLQkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwKLQkJCQkJCTUpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsKLQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJTW92ZUhhbmRsZSBtb3ZlSGFuZGxlID0gbmV3IE1vdmVIYW5kbGUoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpOwotCQltb3ZlSGFuZGxlLnNldEJvcmRlcihudWxsKTsKLQkJbW92ZUhhbmRsZS5zZXREcmFnVHJhY2tlcihuZXcgRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeChnZXRIb3N0KCkpKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobW92ZUhhbmRsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjMwMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIFNlbGVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJCXNob3dGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaGlkZVNlbGVjdGlvbigpOwotCQkJYWRkRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVGb2N1cygpOwotCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOwotCQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgRmlndXJlKCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsKLQkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7Ci0JCXRhcmdldC5zZXRUZXh0KHNvdXJjZS5nZXRUZXh0KCkpOwotCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsKLQkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwKLQkJCQkJCTUpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsKLQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0xpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0xpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Y2I2ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5N2U0MzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWMyOGVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwZGI5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZChyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQocmVxKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgdGFyZ2V0ID0gKE5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rQ3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwgc291cmNlLAotCQkJCXRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU0ZjNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoTm9kZUNvbnRhaW5lcikgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQluZXh0VmFsdWUpOwotCQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCQljYXNlIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8IHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDcyNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE0ZWYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5Sb2xlTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuVGFza05vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5vZGVDb250YWluZXJfTm9kZXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgUm9sZU5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLlRhc2tOb2RlXzIwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5vZGVDb250YWluZXJfTm9kZXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgVGFza05vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjYywgcmVxLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoQ29tcG91bmRDb21tYW5kIGNtZCwKLQkJCWJvb2xlYW4gY29uZmlybSkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBub2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGl0Ci0JCQkJCS5uZXh0KCk7Ci0JCQlzd2l0Y2ggKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7Ci0JCQljYXNlIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKG5vZGUsIGNvbmZpcm0pKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQobm9kZSwgY29uZmlybSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJZm9yIChJdGVyYXRvciBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIGNub2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGNpdAotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZChyZXEpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLCBzb3VyY2UsCi0JCQkJdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiODMwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlNjRkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5NjY1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDI2YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2NhMmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rUmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZChyZXEpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLCBzb3VyY2UsCi0JCQkJdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNDU5NDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChOb2RlQ29udGFpbmVyKSBtb2RlbE9iamVjdCkuZ2V0Tm9kZXMoKQotCQkJCS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQlub2RlVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsCi0JCQkJCW5leHRWYWx1ZSk7Ci0JCQlpZiAoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgKHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCkgfHwgdmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmNmEzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MzA1NDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rUmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyA9PSByZXEKLQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY2MsIHJlcS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKENvbXBvdW5kQ29tbWFuZCBjbWQsCi0JCQlib29sZWFuIGNvbmZpcm0pIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBpdAotCQkJCQkubmV4dCgpOwotCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgewotCQkJY2FzZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKG5vZGUsIGNvbmZpcm0pKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWZvciAoSXRlcmF0b3IgY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBjbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBjaXQKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlzd2l0Y2ggKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZChyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQocmVxKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgdGFyZ2V0ID0gKE5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rQ3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwgc291cmNlLAotCQkJCXRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTg4YjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5Ci0JCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZDhhM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ci0JCWV4dGVuZHMgRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTZmY2U0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQzZTQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGE3NWVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZChyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQocmVxKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgdGFyZ2V0ID0gKE5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rQ3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwgc291cmNlLAotCQkJCXRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQUREaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FERGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDkxZTFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQUREaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFEREltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuc2VydmljZS5EaWFncmFtUmVzZXRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRpYWdyYW1BY3Rpb25zU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BY3Rpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Ob3RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBRERpYWdyYW1FZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0JRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldFJvb3RFZGl0UGFydCgpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotLy8JCXByaW50YWJsZUxheWVycy5hZGRMYXllckFmdGVyKGV4dExhYmVsc0xheWVyLAotLy8JCQkJRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLS8vCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0R3JhcGhpY2FsVmlld2VyKEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIuc2V0R3JhcGhpY2FsVmlld2VyKHZpZXdlcik7Ci0JCWlmKGFjdGlvblNlcnZpY2UgIT0gbnVsbCl7Ci0JCQlhY3Rpb25TZXJ2aWNlLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0JfQotCS8qKgotCSAqIEBhdXRob3Igc2thbm5vb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJRGlhZ3JhbVJlc2V0U2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1SZXNldFNlcnZpY2UoZ2V0RGlhZ3JhbU1hbmFnZXIoKS5nZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCksIGdldEVkaXREb21haW4oKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0KLQkJCi0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gaXNFZGl0YWJsZSgpOwotCi0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRGlhZ3JhbUNvbnN0YW50cy5SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Lmluc2VydEJlZm9yZShBY3Rpb25JZHMuQUNUSU9OX1NIT1dfUFJPUEVSVElFU19WSUVXLCBhY3Rpb24pOwotCQl9Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBtZW51LmZpbmQoQWN0aW9uSWRzLkFDVElPTl9UT09MQkFSX0FSUkFOR0VfQUxMKTsKLQkJaWYoaXRlbSAhPSBudWxsKXsKLQkJCWl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbTEgPSBtZW51LmZpbmQoQWN0aW9uSWRzLk1FTlVfRk9STUFUKTsKLQkJaWYoaXRlbTEgIT0gbnVsbCl7Ci0JCQlpZihpdGVtMSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcil7Ci0JCQkJKChJTWVudU1hbmFnZXIpaXRlbTEpLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJQWN0aW9uIHJlc2V0TGF5b3V0QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy9nZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihEaWFncmFtQ29uc3RhbnRzLlJFRlJFU0gpLnJ1bigpOwotCQkJCURpYWdyYW1FZGl0b3JVdGlsLnJlZnJlc2goZ2V0RGlhZ3JhbUVkaXRQYXJ0KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCWlmIChnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5nZXRDb250ZW50cygpOwotCQkJCQlMaXN0PEVkaXRQYXJ0PiBsb2NhbCA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0JCQkJCWlmKGRlcC5nZXRDaGlsZHJlbigpICE9IG51bGwgJiYgIWRlcC5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSl7Ci0JCQkJCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXAuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZighKG5leHQgaW5zdGFuY2VvZiBOb3RlRWRpdFBhcnQpKXsKLQkJCQkJCQkJbG9jYWwuYWRkKChFZGl0UGFydCluZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChsb2NhbCk7Ci0JCQkJCWNsZWFuVXBEaWFncmFtKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJcmV0dXJuIGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuc2l6ZSgpID09IDA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuUkVTRVRfRElBR1JBTV9MQVlPVVQ7Ci0JCQl9Ci0KLQkJfTsKLQkJcmVzZXRMYXlvdXRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQURESW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1JFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJcmVzZXRMYXlvdXRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEFEREltYWdlcy5JTUdfREVTQ19SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24ocmVzZXRMYXlvdXRBY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldExheW91dCgpIHsKLQkJaWYoKChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKSkuaXNBdXRvTGF5b3V0KCkpewotCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihEaWFncmFtQ29uc3RhbnRzLlJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJCWFjdGlvbi5ydW4oKTsKLQkJfQotCQllbHNlIHsKLQkJCWxheW91dFJlY2VudGx5QWRkZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbGF5b3V0UmVjZW50bHlBZGRlZCgpIHsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKS5yZWZyZXNoKCk7Ci0JCWdldERpYWdyYW1FZGl0UGFydCgpLmdldFZpZXdwb3J0KCkudmFsaWRhdGUoKTsKLQkJY2xlYW5VcERpYWdyYW0oKTsKLQkJRU9iamVjdCBkaWFncmFtRWxlbWVudCA9IGdldERpYWdyYW0oKS5nZXRFbGVtZW50KCk7Ci0JCWlmKGRpYWdyYW1FbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSl7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkoKERpYWdyYW0pZGlhZ3JhbUVsZW1lbnQpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCWlmKFRuZ1V0aWwuaXNMb2NrZWQoYWN0aXZpdHkpKXsKLQkJCQkvLyBGbHVzaCBhbGwgY29tbWFuZHMsIG1lYW5zIHdpbGwgbm90IHNhdmUuCi0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJCQkvLyBGaXJlIGRpcnR5IGZsYWcgcHJvcGVydHkgY2hhbmdlLCBubyBkaXJ0eSBmbGFnIG9uIGVkaXRvci4KLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRQYXJ0SW1hZ2UoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZnVsbC9ldG9vbDE2L0FEREVkaXRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkJCi0JLyoqCi0JICogQ2xpZW50cyBjYWxsIHRoaXMgbWVldGhvZCBpZiBuZWVkZWQgdG8gcmVmcmVzaCBhbmQgZG8gcmVzZXQgbGF5b3V0IGZvciAKLQkgKiBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSB3aG9zZSBhdHRyaWJ1dGUgaXMgYXV0b2xheW91dCA9IHRydWUuCi0JICovCi0JcHVibGljIHZvaWQgcnVuUmVzZXRMYXlvdXRBY3Rpb24oKXsKLQkJbGF5b3V0UmVjZW50bHlBZGRlZCgpOwotCQlpZigoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpKS5pc0F1dG9MYXlvdXQoKSl7Ci0JCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKERpYWdyYW1Db25zdGFudHMuUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQkJYWN0aW9uLnJ1bigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMjg3YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuZWRpdG9ycy5JTWV0aG9kRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5tYXJrZXIuTWFya2VyTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IgZXh0ZW5kcyBEaWFncmFtRG9jdW1lbnRFZGl0b3IKLQkJaW1wbGVtZW50cyBJR290b01hcmtlciwgSU1ldGhvZEVkaXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcigpIHsKLQkJc3VwZXIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYWxldHRlUm9vdCBjcmVhdGVQYWxldHRlUm9vdChQYWxldHRlUm9vdCBleGlzdGluZ1BhbGV0dGVSb290KSB7Ci0JCVBhbGV0dGVSb290IHJvb3QgPSBzdXBlci5jcmVhdGVQYWxldHRlUm9vdChleGlzdGluZ1BhbGV0dGVSb290KTsKLQkJbmV3IERpYWdyYW1QYWxldHRlRmFjdG9yeSgpLmZpbGxQYWxldHRlKHJvb3QpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXNldERvY3VtZW50UHJvdmlkZXIoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldERvY3VtZW50UHJvdmlkZXIoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCU1hcmtlck5hdmlnYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkuZ290b01hcmtlcih0aGlzLCBtYXJrZXIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJcGVyZm9ybVNhdmVBcyhuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNhdmVBcyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlTYXZlQXNEaWFsb2cgZGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhzaGVsbCk7Ci0JCUlGaWxlIG9yaWdpbmFsID0gaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0ID8gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkuZ2V0RmlsZSgpCi0JCQkJOiBudWxsOwotCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbCk7Ci0JCX0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCS8vIGVkaXRvciBoYXMgYmVlbiBwcm9ncmFtbWF0aWNhbGx5IGNsb3NlZCB3aGlsZSB0aGUgZGlhbG9nIHdhcyBvcGVuCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHByb3ZpZGVyLmlzRGVsZXRlZChpbnB1dCkgJiYgb3JpZ2luYWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJIlRoZSBvcmlnaW5hbCBmaWxlICcnezB9JycgaGFzIGJlZW4gZGVsZXRlZC4iLCBvcmlnaW5hbAotCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJZGlhbG9nLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlQYXRoIGZpbGVQYXRoID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJZmluYWwgSUVkaXRvcklucHV0IG5ld0lucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJLy8gQ2hlY2sgaWYgdGhlIGVkaXRvciBpcyBhbHJlYWR5IG9wZW4KLQkJSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgbWF0Y2hpbmdTdHJhdGVneSA9IGdldEVkaXRvckRlc2NyaXB0b3IoKQotCQkJCS5nZXRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXRjaGluZ1N0cmF0ZWd5Lm1hdGNoZXMoZWRpdG9yUmVmc1tpXSwgbmV3SW5wdXQpKSB7Ci0JCQkJTWVzc2FnZURpYWxvZwotCQkJCQkJLm9wZW5XYXJuaW5nKHNoZWxsLCAiUHJvYmxlbSBEdXJpbmcgU2F2ZSBBcy4uLiIsCi0JCQkJCQkJCSJTYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuIFRhcmdldCBmaWxlIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGVkaXRvci4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlwcm92aWRlci5hYm91dFRvQ2hhbmdlKG5ld0lucHV0KTsKLQkJCWdldERvY3VtZW50UHJvdmlkZXIobmV3SW5wdXQpLnNhdmVEb2N1bWVudChwcm9ncmVzc01vbml0b3IsCi0JCQkJCW5ld0lucHV0LAotCQkJCQlnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSksIHRydWUpOwotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB4LmdldFN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuQ0FOQ0VMKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiU2F2ZSBQcm9ibGVtcyIsCi0JCQkJCQkiQ291bGQgbm90IHNhdmUgZmlsZS4iLCB4LmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXByb3ZpZGVyLmNoYW5nZWQobmV3SW5wdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlzZXRJbnB1dChuZXdJbnB1dCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQoIXN1Y2Nlc3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzSGludCBnZXRQcmVmZXJlbmNlc0hpbnQoKSB7Ci0JCXJldHVybiBuZXcgUHJlZmVyZW5jZXNIaW50KEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnRQcm92aWRlciBnZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsID8gZ2V0RG9jdW1lbnRQcm92aWRlcigpCi0JCQkJLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpIDogbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJcmV0dXJuICgoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2M5NmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbiBleHRlbmRzCi0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbiB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZmVyZW5jZXNIaW50IERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCA9IG5ldyBQcmVmZXJlbmNlc0hpbnQoCi0JCQlJRCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luIGluc3RhbmNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIG15RG9jdW1lbnRQcm92aWRlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQlQcmVmZXJlbmNlc0hpbnQucmVnaXN0ZXJQcmVmZXJlbmNlU3RvcmUoRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhmYWN0b3JpZXMpOwotCQlyZXR1cm4gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhMaXN0IGZhY3RvcmllcykgewotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihPYmplY3QgaXRlbSkgewotCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGl0ZW0sIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCWxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoaXRlbSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihJRCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmVzcGVjdHMgaW1hZ2VzIHJlc2lkaW5nIGluIGFueSBwbHVnLWluLiBJZiBwYXRoIGlzIHJlbGF0aXZlLAotCSAqIHRoZW4gdGhpcyBidW5kbGUgaXMgbG9va2VkIHVwIGZvciB0aGUgaW1hZ2UsIG90aGVyd2lzZSwgZm9yIGFic29sdXRlIAotCSAqIHBhdGgsIGZpcnN0IHNlZ21lbnQgaXMgdGFrZW4gYXMgaWQgb2YgcGx1Zy1pbiB3aXRoIGltYWdlCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gaW1hZ2UsIGVpdGhlciBhYnNvbHV0ZSAod2l0aCBwbHVnLWluIGlkIGFzIGZpcnN0IHNlZ21lbnQpLCBvciByZWxhdGl2ZSBmb3IgYnVuZGxlZCBpbWFnZXMKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZmluZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBJUGF0aCBwID0gbmV3IFBhdGgocGF0aCk7Ci0JCWlmIChwLmlzQWJzb2x1dGUoKSAmJiBwLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihwLnNlZ21lbnQoMCksIHAKLQkJCQkJLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzdHJpbmcgZnJvbSBwbHVnLWluJ3MgcmVzb3VyY2UgYnVuZGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCksICIlIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqIENsaWVudCBkbyBub3QgbmVlZCB0byBkaXNwb3NlIHRoaXMgaW1hZ2UuIEltYWdlcyB3aWxsIGJlIGRpc3Bvc2VkIGF1dG9tYXRpY2FsbHkuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIGltYWdlIGluc3RhbmNlCi0JICovCi0JcHVibGljIEltYWdlIGdldEJ1bmRsZWRJbWFnZShTdHJpbmcgcGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHBhdGgsIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocGF0aCkpOwotCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCWlmIChteURvY3VtZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbXlEb2N1bWVudFByb3ZpZGVyID0gbmV3IERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG15RG9jdW1lbnRQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yKSB7Ci0JCWxvZ0Vycm9yKGVycm9yLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhyb3dhYmxlIGFjdHVhbCBlcnJvciBvciBudWxsIGNvdWxkIGJlIHBhc3NlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgdGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCWVycm9yID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlnZXRMb2coKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCBlcnJvciwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKGVycm9yLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZ0luZm8obWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlnZXRMb2coKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIG1lc3NhZ2UsIHRocm93YWJsZSkpOwotCQlkZWJ1ZyhtZXNzYWdlLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotCQl9Ci0JCWlmICh0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0Y2JhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvckNyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1DcmVhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlIGRpYWdyYW1Nb2RlbEZpbGVQYWdlOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZGlhZ3JhbTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yID0gdHJ1ZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiB3b3JrYmVuY2g7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBSZXNvdXJjZSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpIHsKLQkJcmV0dXJuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigKLQkJCWJvb2xlYW4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IpIHsKLQkJdGhpcy5vcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UgPSBuZXcgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZSgKLQkJCQkiRGlhZ3JhbU1vZGVsRmlsZSIsIGdldFNlbGVjdGlvbigpLCAieG1pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5zZXRUaXRsZSgiQ3JlYXRlIEFERCBEaWFncmFtIik7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlCi0JCQkJLnNldERlc2NyaXB0aW9uKCJTZWxlY3QgZmlsZSB0aGF0IHdpbGwgY29udGFpbiBkaWFncmFtIGFuZCBkb21haW4gbW9kZWxzLiIpOwotCQlhZGRQYWdlKGRpYWdyYW1Nb2RlbEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihudWxsKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWRpYWdyYW0gPSBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCWRpYWdyYW1Nb2RlbEZpbGVQYWdlLmdldFVSSSgpLCBtb25pdG9yKTsKLQkJCQlpZiAoaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpICYmIGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtKGRpYWdyYW0pOwotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJIkVycm9yIG9wZW5pbmcgZGlhZ3JhbSBlZGl0b3IiLCBudWxsLCBlCi0JCQkJCQkJCQkJLmdldFN0YXR1cygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkiQ3JlYXRpb24gUHJvYmxlbXMiLCBudWxsLCAoKENvcmVFeGNlcHRpb24pIGUKLQkJCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpKS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIkVycm9yIGNyZWF0aW5nIGRpYWdyYW0iLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKCJOZXcgQUREIERpYWdyYW0iKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoImljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmNWUwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLndpemFyZHMuRWRpdG9yV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVFeHRlbnNpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZmlsZUV4dGVuc2lvbikgewotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJdGhpcy5maWxlRXh0ZW5zaW9uID0gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBjcmVhdGUgZmlsZXMgd2l0aCB0aGlzIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBmaWxlRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGdldEZpbGVQYXRoKCkudG9TdHJpbmcoKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0RmlsZVBhdGgoKSB7Ci0JCUlQYXRoIHBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCXBhdGggPSBwYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCXNldEZpbGVOYW1lKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5nZXRVbmlxdWVGaWxlTmFtZSgKLQkJCQlnZXRDb250YWluZXJGdWxsUGF0aCgpLCBnZXRGaWxlTmFtZSgpLCBnZXRFeHRlbnNpb24oKSkpOwotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbAotCQkJCSYmICFnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi4iICsgZXh0ZW5zaW9uKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKAotCQkJCQkiRmlsZSBuYW1lIHNob3VsZCBoYXZlICcnezB9JycgZXh0ZW5zaW9uLiIsIGV4dGVuc2lvbikpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiYmZlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEVkaXRvckNsYXNzKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRvcklkKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLklEOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE3ZTc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVByaW1hcnlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1Xb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FTUZDb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG91clNhdmVPcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRTYXZlT3B0aW9ucygpIHsKLQkJaWYgKG91clNhdmVPcHRpb25zID09IG51bGwpIHsKLQkJCW91clNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCW91clNhdmVPcHRpb25zLnB1dChYTUlSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELAotCQkJCQlSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7Ci0JCX0KLQkJcmV0dXJuIG91clNhdmVPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkRpYWdyYW0oUmVzb3VyY2UgZGlhZ3JhbSkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBFZGl0VUlVdGlsLm9wZW5FZGl0b3IoKEVPYmplY3QpIGRpYWdyYW0uZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2hhcnNldChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJZmlsZS5zZXRDaGFyc2V0KCJVVEYtOCIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGZpbGUgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVGaWxlTmFtZShJUGF0aCBjb250YWluZXJGdWxsUGF0aCwKLQkJCVN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlpZiAoY29udGFpbmVyRnVsbFBhdGggPT0gbnVsbCkgewotCQkJY29udGFpbmVyRnVsbFBhdGggPSBuZXcgUGF0aCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZmlsZU5hbWUgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJUGF0aCBmaWxlUGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAhZXh0ZW5zaW9uLmVxdWFscyhmaWxlUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJfQotCQlleHRlbnNpb24gPSBmaWxlUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWZpbGVOYW1lID0gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWludCBpID0gMTsKLQkJd2hpbGUgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKGZpbGVQYXRoKSkgewotCQkJaSsrOwotCQkJZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUgKyBpKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlUGF0aC5sYXN0U2VnbWVudCgpOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHdpemFyZCBpbiBhIGRpYWxvZy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bldpemFyZChTaGVsbCBzaGVsbCwgV2l6YXJkIHdpemFyZCwgU3RyaW5nIHNldHRpbmdzS2V5KSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBwbHVnaW5EaWFsb2dTZXR0aW5ncyA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3aXphcmREaWFsb2dTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQlpZiAod2l6YXJkRGlhbG9nU2V0dGluZ3MgPT0gbnVsbCkgewotCQkJd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbihzZXR0aW5nc0tleSk7Ci0JCX0KLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZERpYWxvZ1NldHRpbmdzKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZShNYXRoLm1heCg1MDAsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQk1MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlRGlhZ3JhbShVUkkgZGlhZ3JhbVVSSSwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2ssIDMpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbVVSSSk7Ci0JCWZpbmFsIFN0cmluZyBkaWFncmFtTmFtZSA9IGRpYWdyYW1VUkkubGFzdFNlZ21lbnQoKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwKLQkJCQlNZXNzYWdlcy5EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIG1vZGVsID0gY3JlYXRlSW5pdGlhbE1vZGVsKCk7Ci0JCQkJYXR0YWNoTW9kZWxUb1Jlc291cmNlKG1vZGVsLCBkaWFncmFtUmVzb3VyY2UpOwotCi0JCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UKLQkJCQkJCS5jcmVhdGVEaWFncmFtKAotCQkJCQkJCQltb2RlbCwKLQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCQlkaWFncmFtLnNldE5hbWUoZGlhZ3JhbU5hbWUpOwotCQkJCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0KLQkJCQkJZGlhZ3JhbVJlc291cmNlCi0JCQkJCQkJLnNhdmUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCi0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCSJVbmFibGUgdG8gc3RvcmUgbW9kZWwgYW5kIGRpYWdyYW0gcmVzb3VyY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSksIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNldENoYXJzZXQoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZGlhZ3JhbVJlc291cmNlKSk7Ci0JCXJldHVybiBkaWFncmFtUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGRvbWFpbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBjYW52YXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtIGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsKLQkJcmV0dXJuIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0JfQotCi0JLyoqCi0JICogU3RvcmUgbW9kZWwgZWxlbWVudCBpbiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhdHRhY2hNb2RlbFRvUmVzb3VyY2UoQWN0aXZpdHlEZXRhaWxEaWFncmFtIG1vZGVsLAotCQkJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0RWxlbWVudHNJbkRpYWdyYW0oCi0JCQlJRGlhZ3JhbVdvcmtiZW5jaFBhcnQgZGlhZ3JhbVBhcnQsIExpc3QvKkVkaXRQYXJ0Ki9lZGl0UGFydHMpIHsKLQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmRlc2VsZWN0QWxsKCk7Ci0KLQkJRWRpdFBhcnQgZmlyc3RQcmltYXJ5ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmFwcGVuZFNlbGVjdGlvbihuZXh0UGFydCk7Ci0JCQlpZiAoZmlyc3RQcmltYXJ5ID09IG51bGwgJiYgbmV4dFBhcnQgaW5zdGFuY2VvZiBJUHJpbWFyeUVkaXRQYXJ0KSB7Ci0JCQkJZmlyc3RQcmltYXJ5ID0gbmV4dFBhcnQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWVkaXRQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5yZXZlYWwoCi0JCQkJCWZpcnN0UHJpbWFyeSAhPSBudWxsID8gZmlyc3RQcmltYXJ5IDogKEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCQkuZ2V0KDApKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbVBhcnQsCi0JCQlFT2JqZWN0IGVsZW1lbnQsIExpc3QgZWRpdFBhcnRDb2xsZWN0b3IpIHsKLQkJSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBkaWFncmFtUGFydAotCQkJCS5nZXRWaWV3ZXIoKTsKLQkJZmluYWwgaW50IGludGlhbE51bU9mRWRpdFBhcnRzID0gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlldykgeyAvLyBzdXBwb3J0IG5vdGF0aW9uIGVsZW1lbnQgbG9va3VwCi0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJCWVsZW1lbnQpOwotCQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQoZWRpdFBhcnQpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRJRCA9IEVNRkNvcmVVdGlsLmdldFByb3h5SUQoZWxlbWVudCk7Ci0JCUxpc3QgYXNzb2NpYXRlZFBhcnRzID0gdmlld2VyLmZpbmRFZGl0UGFydHNGb3JFbGVtZW50KGVsZW1lbnRJRCwKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQkvLyBwZXJmb3JtIHRoZSBwb3NzaWJsZSBoaWVyYXJjaHkgZGlzam9pbnQgLT4gdGFrZSB0aGUgdG9wLW1vc3QgcGFydHMgb25seQotCQlmb3IgKEl0ZXJhdG9yIGVkaXRQYXJ0SXQgPSBhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKTsgZWRpdFBhcnRJdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRJdC5uZXh0KCk7Ci0JCQlFZGl0UGFydCBwYXJlbnRQYXJ0ID0gbmV4dFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl3aGlsZSAocGFyZW50UGFydCAhPSBudWxsICYmICFhc3NvY2lhdGVkUGFydHMuY29udGFpbnMocGFyZW50UGFydCkpIHsKLQkJCQlwYXJlbnRQYXJ0ID0gcGFyZW50UGFydC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCWlmIChwYXJlbnRQYXJ0ID09IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQobmV4dFBhcnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGludGlhbE51bU9mRWRpdFBhcnRzID09IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSkgewotCQkJaWYgKCFhc3NvY2lhdGVkUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGFzc29jaWF0ZWRQYXJ0cy5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1QYXJ0LCBlbGVtZW50Ci0JCQkJCQkJLmVDb250YWluZXIoKSwgZWRpdFBhcnRDb2xsZWN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpIC0gaW50aWFsTnVtT2ZFZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmlldyBmaW5kVmlldyhEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0LAotCQkJRU9iamVjdCB0YXJnZXRFbGVtZW50LCBMYXp5RWxlbWVudDJWaWV3TWFwIGxhenlFbGVtZW50MlZpZXdNYXApIHsKLQkJYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsVVJJID0gZmFsc2U7Ci0JCWlmICh0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCWhhc1N0cnVjdHVyYWxVUkkgPSAoKFhNTFJlc291cmNlKSB0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0SUQodGFyZ2V0RWxlbWVudCkgPT0gbnVsbDsKLQkJfQotCi0JCVZpZXcgdmlldyA9IG51bGw7Ci0JCWlmIChoYXNTdHJ1Y3R1cmFsVVJJCi0JCQkJJiYgIWxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuaXNFbXB0eSgpKSB7Ci0JCQl2aWV3ID0gKFZpZXcpIGxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuZ2V0KAotCQkJCQl0YXJnZXRFbGVtZW50KTsKLQkJfSBlbHNlIGlmIChmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1FZGl0UGFydCwgdGFyZ2V0RWxlbWVudCwKLQkJCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyKSA+IDApIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyCi0JCQkJCS5nZXQoMCk7Ci0JCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyLmNsZWFyKCk7Ci0JCQl2aWV3ID0gZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcgPyAoVmlldykgZWRpdFBhcnQKLQkJCQkJLmdldE1vZGVsKCkgOiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICh2aWV3ID09IG51bGwpID8gZGlhZ3JhbUVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkgOiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExhenlFbGVtZW50MlZpZXdNYXAgewotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudDJWaWV3TWFwOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFZpZXcgc2NvcGU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgU2V0IGVsZW1lbnRTZXQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBMaXN0IGVkaXRQYXJ0VG1wSG9sZGVyID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGF6eUVsZW1lbnQyVmlld01hcChWaWV3IHNjb3BlLCBTZXQgZWxlbWVudHMpIHsKLQkJCXRoaXMuc2NvcGUgPSBzY29wZTsKLQkJCXRoaXMuZWxlbWVudFNldCA9IGVsZW1lbnRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBNYXAgZ2V0RWxlbWVudDJWaWV3TWFwKCkgewotCQkJaWYgKGVsZW1lbnQyVmlld01hcCA9PSBudWxsKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkvLyBtYXAgcG9zc2libGUgbm90YXRpb24gZWxlbWVudHMgdG8gaXRzZWxmIGFzIHRoZXNlIGNhbid0IGJlIGZvdW5kIGJ5IHZpZXcuZ2V0RWxlbWVudCgpCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJCVZpZXcgdmlldyA9IChWaWV3KSBlbGVtZW50OwotCQkJCQkJaWYgKHZpZXcuZ2V0RGlhZ3JhbSgpID09IHNjb3BlLmdldERpYWdyYW0oKSkgewotCQkJCQkJCWVsZW1lbnQyVmlld01hcC5wdXQoZWxlbWVudCwgZWxlbWVudCk7IC8vIHRha2Ugb25seSB0aG9zZSB0aGF0IHBhcnQgb2Ygb3VyIGRpYWdyYW0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKHNjb3BlLCBlbGVtZW50MlZpZXdNYXAsIGVsZW1lbnRTZXQpOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgTWFwIGJ1aWxkRWxlbWVudDJWaWV3TWFwKFZpZXcgcGFyZW50VmlldywgTWFwIGVsZW1lbnQyVmlld01hcCwKLQkJCQlTZXQgZWxlbWVudHMpIHsKLQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCi0JCQlpZiAocGFyZW50Vmlldy5pc1NldEVsZW1lbnQoKQotCQkJCQkmJiAhZWxlbWVudDJWaWV3TWFwLmNvbnRhaW5zS2V5KHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpKQotCQkJCQkmJiBlbGVtZW50cy5jb250YWlucyhwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkpIHsKLQkJCQllbGVtZW50MlZpZXdNYXAucHV0KHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpLCBwYXJlbnRWaWV3KTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQl9IC8vTGF6eUVsZW1lbnQyVmlld01hcAkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxYzE5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS51dGlsLklERUVkaXRvckZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yIGV4dGVuZHMgSURFRWRpdG9yRmlsZUNyZWF0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIERpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IgSU5TVEFOQ0UgPSBuZXcgRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUZpbGVDcmVhdG9yIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gIi5hZGQiOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZkMThiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMKLQkJRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRGb250UHJlZmVyZW5jZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCURpYWdyYW1Db3JlVXRpbC5oaWRlQ29ubmVjdGlvbkhhbmRsZXMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1NGRjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5EZW11bHRpcGxleGluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLkRpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC5FZGl0b3JTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwudXRpbC5EaWFncmFtSU9VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbGVtZW50OwotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGNyZWF0ZURvY3VtZW50KGVkaXRvcklucHV0KTsKLQotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IG5ldyBSZXNvdXJjZVNldEluZm8oZG9jdW1lbnQsIGVkaXRvcklucHV0KTsKLQkJaW5mby5zZXRNb2RpZmljYXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbykpOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCSYmIGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yLAotCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0IiwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dCIgfSksCi0JCQkJCQkJbnVsbCkpOwotCQl9Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKTsKLQkJc2V0RG9jdW1lbnRDb250ZW50KGRvY3VtZW50LCAoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJc2V0dXBEb2N1bWVudChlbGVtZW50LCBkb2N1bWVudCk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBnaXZlbiBkb2N1bWVudCBhcyBpdCB3b3VsZCBiZSBwcm92aWRlZCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoZQotCSAqIGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50IGlzIG5vdCBjaGFuZ2VkLiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCi0JICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGJsdWUtcHJpbnQgZWxlbWVudAotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgdG8gc2V0IHVwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBmb3Igc3ViY2xhc3NlcwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKFJlc291cmNlU2V0SW5mbyBpbmZvKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCArPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ICs9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVFbXB0eURvY3VtZW50KCkgewotCQlEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRGlhZ3JhbURvY3VtZW50KCk7Ci0JCWRvY3VtZW50LnNldEVkaXRpbmdEb21haW4oY3JlYXRlRWRpdGluZ0RvbWFpbigpKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGNyZWF0ZUVkaXRpbmdEb21haW4oKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBEaWFncmFtRWRpdGluZ0RvbWFpbkZhY3RvcnkKLQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCWVkaXRpbmdEb21haW4uc2V0SUQoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5FZGl0aW5nRG9tYWluIik7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgTm90aWZpY2F0aW9uRmlsdGVyIGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJLmNyZWF0ZU5vdGlmaWVyRmlsdGVyKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkuYW5kKAotCQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLkFERCkpLmFuZCgKLQkJCQkJCU5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVGZWF0dXJlRmlsdGVyKAotCQkJCQkJCQlSZXNvdXJjZVNldC5jbGFzcywKLQkJCQkJCQkJUmVzb3VyY2VTZXQuUkVTT1VSQ0VfU0VUX19SRVNPVVJDRVMpKTsKLQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlcigpIHsKLQotCQkJcHJpdmF0ZSBOb3RpZmllciBteVRhcmdlcjsKLQotCQkJcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJCQlyZXR1cm4gbXlUYXJnZXI7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWlmIChkaWFncmFtUmVzb3VyY2VNb2RpZmllZEZpbHRlci5tYXRjaGVzKG5vdGlmaWNhdGlvbikpIHsKLQkJCQkJT2JqZWN0IHZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCQkoKFJlc291cmNlKSB2YWx1ZSkuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJCQlteVRhcmdlciA9IG5ld1RhcmdldDsKLQkJCX0KLQotCQl9KTsKLQotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGVsZW1lbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZGlhZ3JhbURvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50OwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBkaWFncmFtRG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSVN0b3JhZ2Ugc3RvcmFnZSA9ICgoRmlsZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCk7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBEaWFncmFtSU9VdGlsLmxvYWQoZG9tYWluLCBzdG9yYWdlLCB0cnVlLAotCQkJCQlnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlkb2N1bWVudC5zZXRDb250ZW50KGRpYWdyYW0pOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJVVJJIHVyaSA9ICgoVVJJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFVSSSgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKAotCQkJCQkJdXJpLnRyaW1GcmFnbWVudCgpLCBmYWxzZSk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSgKLQkJCQkJCQl1cmkudHJpbUZyYWdtZW50KCkpOwotCQkJCX0KLQkJCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoR01GUmVzb3VyY2VGYWN0b3J5Ci0JCQkJCQkJCS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQkJCQkvLyBAc2VlIDE3MTA2MCAKLQkJCQkJCS8vIG9wdGlvbnMucHV0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcik7Ci0JCQkJfQotCQkJCWlmICh1cmkuZnJhZ21lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgcm9vdEVsZW1lbnQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHVyaS5mcmFnbWVudCgpKTsKLQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudCgoRGlhZ3JhbSkgcm9vdEVsZW1lbnQpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHJvb3RFbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCQkJCWRvY3VtZW50LnNldENvbnRlbnQoKERpYWdyYW0pIHJvb3RFbGVtZW50KTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb3JlRXhjZXB0aW9uIHRocm93bkV4Y3AgPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQl0aHJvd25FeGNwID0gKENvcmVFeGNlcHRpb24pIGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQkJCQl0aHJvd25FeGNwID0gbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJbXNnICE9IG51bGwgPyBtc2cKLQkJCQkJCQkJCQkJOiBNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yLAotCQkJCQkJCQkJZSkpOwotCQkJCX0KLQkJCQl0aHJvdyB0aHJvd25FeGNwOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yLAotCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0IiwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dCIgfSksCi0JCQkJCQkJbnVsbCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRNb2RpZmljYXRpb25TdGFtcChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREaWFncmFtRG9jdW1lbnQoZWxlbWVudCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBkb2N1bWVudC5nZXREaWFncmFtKCkuZVJlc291cmNlKCk7Ci0JCQlpZiAoZGlhZ3JhbVJlc291cmNlICE9IG51bGwpIHsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZGlhZ3JhbVJlc291cmNlKTsKLQkJCQlyZXR1cm4gZmlsZSA9PSBudWxsIHx8IGZpbGUuZ2V0TG9jYXRpb24oKSA9PSBudWxsCi0JCQkJCQl8fCAhZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmV4aXN0cygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5pc0RlbGV0ZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldEluZm8gZ2V0UmVzb3VyY2VTZXRJbmZvKE9iamVjdCBlZGl0b3JJbnB1dCkgewotCQlyZXR1cm4gKFJlc291cmNlU2V0SW5mbykgc3VwZXIuZ2V0RWxlbWVudEluZm8oZWRpdG9ySW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQsIEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaWYgKGluZm8gaW5zdGFuY2VvZiBSZXNvdXJjZVNldEluZm8pIHsKLQkJCVJlc291cmNlU2V0SW5mbyByZXNvdXJjZVNldEluZm8gPSAoUmVzb3VyY2VTZXRJbmZvKSBpbmZvOwotCQkJcmVzb3VyY2VTZXRJbmZvLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlRWxlbWVudEluZm8oZWxlbWVudCwgaW5mbyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFsaWRhdGVTdGF0ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IGNvbXB1dGF0aW9uQ29udGV4dCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gZmlsZXMyVmFsaWRhdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzUmVhZE9ubHkoKSkgewotCQkJCQlmaWxlczJWYWxpZGF0ZS5hZGQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdCgKLQkJCQkJKElGaWxlW10pIGZpbGVzMlZhbGlkYXRlLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzMlZhbGlkYXRlCi0JCQkJCQkJLnNpemUoKV0pLCBjb21wdXRhdGlvbkNvbnRleHQpOwotCQl9Ci0KLQkJc3VwZXIuZG9WYWxpZGF0ZVN0YXRlKGVsZW1lbnQsIGNvbXB1dGF0aW9uQ29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChpbmZvLmlzVXBkYXRlQ2FjaGUoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0ZUNhY2hlKGVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNSZWFkT25seSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1JlYWRPbmx5KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCFpc1N0YXRlVmFsaWRhdGVkKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsKLQkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mby5pc01vZGlmaWFibGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNNb2RpZmlhYmxlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJaW5mby5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJaW5mby5zZXRNb2RpZmlhYmxlKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWluZm8uc2V0UmVhZE9ubHkoZmFsc2UpOwotCQkJaW5mby5zZXRNb2RpZmlhYmxlKHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVXBkYXRlU3RhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaW5mby5zZXRVcGRhdGVDYWNoZSh0cnVlKTsKLQkJfQotCQlzdXBlci5kb1VwZGF0ZVN0YXRlQ2FjaGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5mby5pc1N5bmNocm9uaXplZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1N5bmNocm9uaXplZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRSZXNldFJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJCQkubW9kaWZ5UnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChjb21wdXRlU2NoZWR1bGluZ1J1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U3luY2hyb25pemVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLnJlZnJlc2hSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFZhbGlkYXRlU3RhdGVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJZmlsZXMuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkudmFsaWRhdGVFZGl0UnVsZSgKLQkJCQkJCQkoSUZpbGVbXSkgZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBjb21wdXRlU2NoZWR1bGluZ1J1bGUoSVJlc291cmNlIHRvQ3JlYXRlT3JNb2RpZnkpIHsKLQkJaWYgKHRvQ3JlYXRlT3JNb2RpZnkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkubW9kaWZ5UnVsZSgKLQkJCQkJdG9DcmVhdGVPck1vZGlmeSk7Ci0KLQkJSVJlc291cmNlIHBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnk7Ci0JCWRvIHsKLQkJCS8qCi0JCQkgKiBYWFggVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MDEKLQkJCSAqIElSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUgc2hvdWxkIGl0ZXJhdGUgdGhlIGhpZXJhcmNoeQotCQkJICogaXRzZWxmLgotCQkJICovCi0JCQl0b0NyZWF0ZU9yTW9kaWZ5ID0gcGFyZW50OwotCQkJcGFyZW50ID0gdG9DcmVhdGVPck1vZGlmeS5nZXRQYXJlbnQoKTsKLQkJfSB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5leGlzdHMoKSk7Ci0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmNyZWF0ZVJ1bGUoCi0JCQkJdG9DcmVhdGVPck1vZGlmeSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQloYW5kbGVFbGVtZW50Q2hhbmdlZChpbmZvLCBuZXh0UmVzb3VyY2UsIG1vbml0b3IpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmRvU3luY2hyb25pemUoZWxlbWVudCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZURvY3VtZW50KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGVsZW1lbnQsCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoIW92ZXJ3cml0ZSAmJiAhaW5mby5pc1N5bmNocm9uaXplZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCUlTdGF0dXMuT0ssCi0JCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvciwKLQkJCQkJCQkJbnVsbCkpOwotCQkJfQotCQkJaW5mby5zdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2luZyhlbGVtZW50KTsKLQkJCUxpc3QgcmVzb3VyY2VzID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCQkJdHJ5IHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzaywKLQkJCQkJCXJlc291cmNlcy5zaXplKCkgKyAxKTsgLy8iU2F2aW5nIGRpYWdyYW0iCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCQltb25pdG9yCi0JCQkJCQkJLnNldFRhc2tOYW1lKE5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrLAotCQkJCQkJCQkJCQluZXh0UmVzb3VyY2UuZ2V0VVJJKCkpKTsKLQkJCQkJaWYgKG5leHRSZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5leHRSZXNvdXJjZS5zYXZlKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJRWRpdG9yU3RhdHVzQ29kZXMuUkVTT1VSQ0VfRkFJTFVSRSwgZQotCQkJCQkJCQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCQl0aHJvdyB4OwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbmZvLnN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50Q2hhbmdlZChSZXNvdXJjZVNldEluZm8gaW5mbywKLQkJCVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShjaGFuZ2VkUmVzb3VyY2UpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQsCi0JCQkJCQkJCWV4KTsKLQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLkZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZAotCQkJfQotCQl9Ci0JCWNoYW5nZWRSZXNvdXJjZS51bmxvYWQoKTsKLQotCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7Ci0JCWluZm8uZlN0YXR1cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzZXREb2N1bWVudENvbnRlbnQoaW5mby5mRG9jdW1lbnQsIGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaW5mby5mU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlpZiAoIWluZm8uZkNhbkJlU2F2ZWQpIHsKLQkJCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJfQotCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7Ci0JCWZpcmVFbGVtZW50Q29udGVudFJlcGxhY2VkKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRNb3ZlZChJRWRpdG9ySW5wdXQgaW5wdXQsIFVSSSB1cmkpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZSBuZXdGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKAotCQkJCQluZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ld0ZpbGUgPT0gbnVsbCA/IG51bGwKLQkJCQkJOiBuZXcgRmlsZUVkaXRvcklucHV0KG5ld0ZpbGUpKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUT0RPOiBhcHBlbmQgc3VmZml4IHRvIHRoZSBVUkkhICh1c2UgZGlhZ3JhbSBhcyBhIHBhcmFtZXRlcikKLQkJZmlyZUVsZW1lbnRNb3ZlZChpbnB1dCwgbmV3IFVSSUVkaXRvcklucHV0KHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUVkaXRvcklucHV0IGNyZWF0ZUlucHV0V2l0aEVkaXRpbmdEb21haW4oSUVkaXRvcklucHV0IGVkaXRvcklucHV0LAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXJldHVybiBlZGl0b3JJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElEaWFncmFtRG9jdW1lbnQgZ2V0RGlhZ3JhbURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoSURpYWdyYW1Eb2N1bWVudCkgZG9jOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBnZXRPcGVyYXRpb25SdW5uZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VTZXRJbmZvIGV4dGVuZHMgRWxlbWVudEluZm8gewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGxvbmcgbXlNb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdvcmtzcGFjZVN5bmNocm9uaXplciBteVN5bmNocm9uaXplcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSURpYWdyYW1Eb2N1bWVudCBteURvY3VtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElFZGl0b3JJbnB1dCBteUVkaXRvcklucHV0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVcGRhdGVDYWNoZSA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteU1vZGlmaWFibGUgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15UmVhZE9ubHkgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgbXlSZXNvdXJjZVNldExpc3RlbmVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvKElEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7Ci0JCQlzdXBlcihkb2N1bWVudCk7Ci0JCQlteURvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQlteUVkaXRvcklucHV0ID0gZWRpdG9ySW5wdXQ7Ci0JCQlzdGFydFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlteVJlc291cmNlU2V0TGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG15UmVzb3VyY2VTZXRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gbXlNb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25TdGFtcChsb25nIG1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQlteU1vZGlmaWNhdGlvblN0YW1wID0gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQkJcmV0dXJuIG15RG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dCgpIHsKLQkJCXJldHVybiBteUVkaXRvcklucHV0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCWdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKG15UmVzb3VyY2VTZXRMaXN0ZW5lcik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCQlyZXR1cm4gbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5zaXplKCkgPT0gMDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVblN5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCB2b2lkIHN0b3BSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyLmRpc3Bvc2UoKTsKLQkJCW15U3luY2hyb25pemVyID0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydFJlc291cmNlTGlzdGVuaW5nKCkgewotCQkJbXlTeW5jaHJvbml6ZXIgPSBuZXcgV29ya3NwYWNlU3luY2hyb25pemVyKG15RG9jdW1lbnQKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgbmV3IFN5bmNocm9uaXplckRlbGVnYXRlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlQ2FjaGUoKSB7Ci0JCQlyZXR1cm4gbXlVcGRhdGVDYWNoZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVDYWNoZShib29sZWFuIHVwZGF0ZSkgewotCQkJbXlVcGRhdGVDYWNoZSA9IHVwZGF0ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0JCQlyZXR1cm4gbXlNb2RpZmlhYmxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWFibGUoYm9vbGVhbiBtb2RpZmlhYmxlKSB7Ci0JCQlteU1vZGlmaWFibGUgPSBtb2RpZmlhYmxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gbXlSZWFkT25seTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCQlteVJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzCi0JCQkJV29ya3NwYWNlU3luY2hyb25pemVyLkRlbGVnYXRlIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZUNoYW5nZWQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMsIHJlc291cmNlLAotCQkJCQkJCQludWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VEZWxldGVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWZpcmVFbGVtZW50RGVsZXRlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlTW92ZWQoUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQkJCWZpbmFsIFVSSSBuZXdVUkkpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG15RG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpID09IHJlc291cmNlKSB7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaGFuZGxlRWxlbWVudE1vdmVkKFJlc291cmNlU2V0SW5mby50aGlzCi0JCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSwgbmV3VVJJKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaGFuZGxlUmVzb3VyY2VEZWxldGVkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lciBleHRlbmRzIEVDb250ZW50QWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm90aWZpY2F0aW9uRmlsdGVyIG15TW9kaWZpZWRGaWx0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUmVzb3VyY2VTZXRJbmZvIG15SW5mbzsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsKLQkJCW15SW5mbyA9IGluZm87Ci0JCQlteU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcigKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCkub3IoCi0JCQkJCU5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLlVOU0VUKSkuYW5kKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRmVhdHVyZUZpbHRlcihSZXNvdXJjZS5jbGFzcywKLQkJCQkJCQlSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTU9ESUZJRUQpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlU2V0KSB7Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQkJaWYgKCFub3RpZmljYXRpb24uaXNUb3VjaCgpCi0JCQkJCSYmIG15TW9kaWZpZWRGaWx0ZXIubWF0Y2hlcyhub3RpZmljYXRpb24pKSB7Ci0JCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IG15SW5mby5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCkKLQkJCQkJCQkJJiYgIW1vZGlmaWVkOykgewotCQkJCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCQltb2RpZmllZCA9IG5leHRSZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYm9vbGVhbiBkaXJ0eVN0YXRlQ2hhbmdlZCA9IGZhbHNlOwotCQkJCQkJc3luY2hyb25pemVkIChteUluZm8pIHsKLQkJCQkJCQlpZiAobW9kaWZpZWQgIT0gbXlJbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQkJCW15SW5mby5mQ2FuQmVTYXZlZCA9IG1vZGlmaWVkOwotCQkJCQkJCQlkaXJ0eVN0YXRlQ2hhbmdlZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCQkJCW15SW5mby5zZXRTeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkaXJ0eVN0YXRlQ2hhbmdlZCkgewotCQkJCQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQobXlJbmZvCi0JCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSwgbW9kaWZpZWQpOwotCi0JCQkJCQkJaWYgKCFtb2RpZmllZCkgewotCQkJCQkJCQlteUluZm8KLQkJCQkJCQkJCQkuc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKG15SW5mbykpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYxNDVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVVJJIGRvbWFpbk1vZGVsVVJJOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZG9tYWluTW9kZWxVUkkgPSBudWxsOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA9PSBmYWxzZQotCQkJCXx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQlkb21haW5Nb2RlbFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKQotCQkJCS50b1N0cmluZygpLCB0cnVlKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCUVPYmplY3QgZGlhZ3JhbVJvb3QgPSBudWxsOwotCQl0cnkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShkb21haW5Nb2RlbFVSSSwgdHJ1ZSk7Ci0JCQlkaWFncmFtUm9vdCA9IChFT2JqZWN0KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gbG9hZCByZXNvdXJjZTogIiArIGRvbWFpbk1vZGVsVVJJLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZGlhZ3JhbVJvb3QgPT0gbnVsbCkgewotCQkJTWVzc2FnZURpYWxvZwotCQkJCQkub3BlbkVycm9yKAotCQkJCQkJCWdldFNoZWxsKCksCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGUsCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJV2l6YXJkIHdpemFyZCA9IG5ldyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQoZG9tYWluTW9kZWxVUkksCi0JCQkJZGlhZ3JhbVJvb3QsIGVkaXRpbmdEb21haW4pOwotCQl3aXphcmQKLQkJCQkuc2V0V2luZG93VGl0bGUoTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZSwKLQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpKTsKLQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLnJ1bldpemFyZChnZXRTaGVsbCgpLCB3aXphcmQsCi0JCQkJIkluaXREaWFncmFtRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3MzJmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbi5Mb2FkUmVzb3VyY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgbXlTZWxlY3RlZEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBteVNoZWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJbXlTaGVsbCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlMb2FkUmVzb3VyY2VEaWFsb2cgbG9hZFJlc291cmNlRGlhbG9nID0gbmV3IExvYWRSZXNvdXJjZURpYWxvZyhteVNoZWxsLAotCQkJCW15U2VsZWN0ZWRFbGVtZW50LmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCWxvYWRSZXNvdXJjZURpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCW15U2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQlteVNlbGVjdGVkRWxlbWVudCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG15U2VsZWN0ZWRFbGVtZW50ICE9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MWQxZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7Ci0JCXRyeSB7Ci0JCQllZGl0b3JJbnB1dCA9IGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZWRpdG9ySW5wdXQuZXF1YWxzKGlucHV0KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQKLQkJCQkmJiBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gKChVUklFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFVSSSgpLmVxdWFscygKLQkJCQkJKChVUklFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVSSSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDJjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMudmlldy5DcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gbXlFZGl0aW5nRG9tYWluOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQoVVJJIGRvbWFpbk1vZGVsVVJJLCBFT2JqZWN0IGRpYWdyYW1Sb290LAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlhc3NlcnQgZG9tYWluTW9kZWxVUkkgIT0gbnVsbCA6ICJEb21haW4gbW9kZWwgdXJpIG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnQgZGlhZ3JhbVJvb3QgIT0gbnVsbCA6ICJEb2FncmFtIHJvb3QgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGVkaXRpbmdEb21haW4gIT0gbnVsbCA6ICJFZGl0aW5nIGRvbWFpbiBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlteUZpbGVDcmVhdGlvblBhZ2UgPSBuZXcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZSwKLQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlCi0JCQkJLnNldFRpdGxlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihOTFMuYmluZCgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb24sCi0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpKTsKLQkJSVBhdGggZmlsZVBhdGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGRvbWFpbk1vZGVsVVJJLnRyaW1GaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJaWYgKGRvbWFpbk1vZGVsVVJJLmlzUGxhdGZvcm1SZXNvdXJjZSgpKSB7Ci0JCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGRvbWFpbk1vZGVsVVJJLnRyaW1TZWdtZW50cygxKQotCQkJCQkudG9QbGF0Zm9ybVN0cmluZyh0cnVlKSk7Ci0JCX0gZWxzZSBpZiAoZG9tYWluTW9kZWxVUkkuaXNGaWxlKCkpIHsKLQkJCWZpbGVQYXRoID0gbmV3IFBhdGgoZG9tYWluTW9kZWxVUkkudHJpbVNlZ21lbnRzKDEpLnRvRmlsZVN0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRPRE8gOiB1c2Ugc29tZSBkZWZhdWx0IHBhdGgKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJVbnN1cHBvcnRlZCBVUkk6ICIgKyBkb21haW5Nb2RlbFVSSSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0Q29udGFpbmVyRnVsbFBhdGgoZmlsZVBhdGgpOwotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUoRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJLmdldFVuaXF1ZUZpbGVOYW1lKGZpbGVQYXRoLCBmaWxlTmFtZSwgInhtaSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UgPSBuZXcgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZSk7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb24pOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLnNldE1vZGVsRWxlbWVudChkaWFncmFtUm9vdCk7Ci0KLQkJbXlFZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG15RmlsZUNyZWF0aW9uUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShteUZpbGVDcmVhdGlvblBhZ2UpOwotCQlhZGRQYWdlKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlMaXN0IGFmZmVjdGVkRmlsZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJRmlsZSBkaWFncmFtRmlsZSA9IG15RmlsZUNyZWF0aW9uUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5zZXRDaGFyc2V0KGRpYWdyYW1GaWxlKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCQlVUkkgZGlhZ3JhbU1vZGVsVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBteUVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbU1vZGVsVVJJKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJbXlFZGl0aW5nRG9tYWluLAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQsCi0JCQkJYWZmZWN0ZWRGaWxlcykgewotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaW50IGRpYWdyYW1WSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldERpYWdyYW1WaXN1YWxJRChkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJCQkJCS5nZXRNb2RlbEVsZW1lbnQoKSk7Ci0JCQkJaWYgKGRpYWdyYW1WSUQgIT0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEKSB7Ci0JCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Ci0JCQkJCQkJLm5ld0Vycm9yQ29tbWFuZFJlc3VsdChNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yKTsKLQkJCQl9Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UKLQkJCQkJCS5jcmVhdGVEaWFncmFtKAotCQkJCQkJCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJCQkJCQkJLmdldE1vZGVsRWxlbWVudCgpLAotCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCwKLQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCWRpYWdyYW1SZXNvdXJjZS5zYXZlKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtUmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiU2F2ZSBvcGVyYXRpb24gZmFpbGVkIGZvcjogIiArIGRpYWdyYW1Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBvcGVuIGVkaXRvciIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMKLQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJCXN1cGVyKHBhZ2VOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgewotCQkJcmV0dXJuIE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJYm9vbGVhbiByZXN1bHQgPSBWaWV3U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkucHJvdmlkZXMoCi0JCQkJCQkJbmV3IENyZWF0ZURpYWdyYW1WaWV3T3BlcmF0aW9uKAotCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHNlbGVjdGVkTW9kZWxFbGVtZW50KSwKLQkJCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCkpOwotCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdCA/IG51bGwKLQkJCQkJOiBNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbVBhbGV0dGVGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTBlM2M4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbVBhbGV0dGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVEcmF3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QYWxldHRlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsUGFsZXR0ZShQYWxldHRlUm9vdCBwYWxldHRlUm9vdCkgewotCQkvLwkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZU5vZGVzMUdyb3VwKCkpOwotCQkvLwkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZUxpbmtzMkdyb3VwKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlTm9kZXMxR3JvdXAoKSB7Ci0JCVBhbGV0dGVEcmF3ZXIgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlRHJhd2VyKAotCQkJCU1lc3NhZ2VzLk5vZGVzMUdyb3VwX3RpdGxlKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlUm9sZU5vZGUxQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVRhc2tOb2RlM0NyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbCgpKTsKLQkJcmV0dXJuIHBhbGV0dGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVMaW5rczJHcm91cCgpIHsKLQkJUGFsZXR0ZURyYXdlciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoCi0JCQkJTWVzc2FnZXMuTGlua3MyR3JvdXBfdGl0bGUpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVMaW5rMUNyZWF0aW9uVG9vbCgpKTsKLQkJcmV0dXJuIHBhbGV0dGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVJvbGVOb2RlMUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZU5vZGVfMjAwMSk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5Sb2xlTm9kZTFDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuUm9sZU5vZGUxQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZU5vZGVfMjAwMSkpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5Sb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsKLQkJZW50cnkKLQkJCQkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlVGFza05vZGUzQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovdHlwZXMgPSBuZXcgQXJyYXlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovKDEpOwotCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5UYXNrTm9kZV8yMDAyKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCU1lc3NhZ2VzLlRhc2tOb2RlM0NyZWF0aW9uVG9vbF90aXRsZSwKLQkJCQlNZXNzYWdlcy5UYXNrTm9kZTNDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRGlhZ3JhbUVsZW1lbnRUeXBlcy5UYXNrTm9kZV8yMDAyKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlNENyZWF0aW9uVG9vbF90aXRsZSwKLQkJCQlNZXNzYWdlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlNENyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5Ci0JCQkJLnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sKCkgewotCQlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovdHlwZXMgPSBuZXcgQXJyYXlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovKDEpOwotCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCU1lc3NhZ2VzLldvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbF90aXRsZSwKLQkJCQlNZXNzYWdlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOwotCQllbnRyeQotCQkJCS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcwotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVMaW5rMUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxKTsKLQkJTGlua1Rvb2xFbnRyeSBlbnRyeSA9IG5ldyBMaW5rVG9vbEVudHJ5KAotCQkJCU1lc3NhZ2VzLkxpbmsxQ3JlYXRpb25Ub29sX3RpdGxlLAotCQkJCU1lc3NhZ2VzLkxpbmsxQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZVRvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCBlbGVtZW50VHlwZXM7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm9kZVRvb2xFbnRyeShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCQlMaXN0IGVsZW1lbnRUeXBlcykgewotCQkJc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBudWxsLCBudWxsKTsKLQkJCXRoaXMuZWxlbWVudFR5cGVzID0gZWxlbWVudFR5cGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCQlUb29sIHRvb2wgPSBuZXcgVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sKGVsZW1lbnRUeXBlcyk7Ci0JCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW5rVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IHJlbGF0aW9uc2hpcFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJTGlzdCByZWxhdGlvbnNoaXBUeXBlcykgewotCQkJc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBudWxsLCBudWxsKTsKLQkJCXRoaXMucmVsYXRpb25zaGlwVHlwZXMgPSByZWxhdGlvbnNoaXBUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sKHJlbGF0aW9uc2hpcFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCXJldHVybiB0b29sOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtVmlzdWFsSURSZWdpc3RyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtVmlzdWFsSURSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjVhNWJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogVGhpcyByZWdpc3RyeSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCB0eXBlIG9mIHZpc3VhbCBvYmplY3Qgc2hvdWxkIGJlCi0gKiBjcmVhdGVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBEaWFncmFtLCBOb2RlLCBDaGlsZE5vZGUgb3IgTGluayByZXByZXNlbnRlZCAKLSAqIGJ5IGEgZG9tYWluIG1vZGVsIG9iamVjdC4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVmlzdWFsSURSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0tFWSA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkKLQkJCSsgIi9kZWJ1Zy92aXN1YWxJRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaXN1YWxJRChWaWV3IHZpZXcpIHsKLQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQlpZiAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKHZpZXcuZ2V0VHlwZSgpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0VmlzdWFsSUQodmlldy5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2RlbElEKFZpZXcgdmlldykgewotCQlWaWV3IGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJd2hpbGUgKHZpZXcgIT0gZGlhZ3JhbSkgewotCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgYW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KCJtb2RlbElEIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGRpYWdyYW0uZ2V0VHlwZSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHR5cGUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaWYgKEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCVBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERFQlVHX0tFWSkpKSB7Ci0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiVW5hYmxlIHRvIHBhcnNlIHZpZXcgdHlwZSBhcyBhIHZpc3VhbElEIG51bWJlcjogIgkvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKGludCB2aXN1YWxJRCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodmlzdWFsSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXREaWFncmFtVmlzdWFsSUQoZG9tYWluRWxlbWVudCwgZG9tYWluRWxlbWVudE1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXREaWFncmFtVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50LAotCQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkuaXNTdXBlclR5cGVPZigKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCSYmIGlzRGlhZ3JhbUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBkb21haW5FbGVtZW50KSkgewotCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkRGlhZ3JhbUlEKGRvbWFpbkVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXROb2RlVmlzdWFsSUQoVmlldyBjb250YWluZXJWaWV3LCBFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldE5vZGVWaXN1YWxJRChjb250YWluZXJWaWV3LCBkb21haW5FbGVtZW50LAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXROb2RlVmlzdWFsSUQoVmlldyBjb250YWluZXJWaWV3LAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJU3RyaW5nIGNvbnRhaW5lck1vZGVsSUQgPSBnZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWludCBjb250YWluZXJWaXN1YWxJRDsKLQkJaWYgKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJY29udGFpbmVyVmlzdWFsSUQgPSBnZXRWaXN1YWxJRChjb250YWluZXJWaWV3KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChjb250YWluZXJWaWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCWNvbnRhaW5lclZpc3VhbElEID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaW50IG5vZGVWaXN1YWxJRCA9IHNlbWFudGljSGludCAhPSBudWxsID8gZ2V0VmlzdWFsSUQoc2VtYW50aWNIaW50KQotCQkJCTogLTE7Ci0JCXN3aXRjaCAoY29udGFpbmVyVmlzdWFsSUQpIHsKLQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVJvbGVOb2RlXzIwMDEoKFJvbGVOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVUYXNrTm9kZV8yMDAyKChUYXNrTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFJvbGVUYXNrQ29tcG9zaXRlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDJDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFJvbGVOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRSb2xlTm9kZV8yMDAxQ2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRUYXNrTm9kZV8yMDAyQ2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDNDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50XzUwMDFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50XzUwMDJDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlVGFza0NvbXBvc2l0ZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVSb2xlVGFza0NvbXBvc2l0ZV8xMDAxKChSb2xlVGFza0NvbXBvc2l0ZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMigoV29ya1Byb2R1Y3RDb21wb3NpdGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eURldGFpbERpYWdyYW1fNzlDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rXzMwMDFMaW5rTGFiZWxJRChzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKGRvbWFpbkVsZW1lbnQsIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50LAotCQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluaygpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTGlua1dpdGhDbGFzc0xpbmtfMzAwMSgoTGluaykgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQlyZXR1cm4gTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoZG9tYWluRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlhZ3JhbUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSgKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkRGlhZ3JhbUlEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVSb2xlVGFza0NvbXBvc2l0ZV8xMDAxKAotCQkJUm9sZVRhc2tDb21wb3NpdGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIoCi0JCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlUm9sZU5vZGVfMjAwMShSb2xlTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlVGFza05vZGVfMjAwMihUYXNrTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkUm9sZVRhc2tDb21wb3NpdGVfMTAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRSb2xlTm9kZV8yMDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkVGFza05vZGVfMjAwMkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwM0NoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudF81MDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50XzUwMDJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eURldGFpbERpYWdyYW1fNzlDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRMaW5rXzMwMDFMaW5rTGFiZWxJRChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZExpbmtXaXRoQ2xhc3NJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaW5rV2l0aENsYXNzTGlua18zMDAxKExpbmsgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L01lc3NhZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MWE3MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJtZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX09wZW5Nb2RlbEZpbGVEaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb2RlczFHcm91cF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5rczJHcm91cF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlTm9kZTFDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZU5vZGUxQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tOb2RlM0NyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTm9kZTNDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlNENyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlNENyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5rMUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5rMUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1hbmROYW1lX09wZW5EaWFncmFtOwotCi0JLy9UT0RPOiBwdXQgYWNjZXNzb3IgZmllbGRzIG1hbnVhbGx5CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFlZWVkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBXaXphcmQgcGFnZSB0aGF0IGFsbG93cyB0byBzZWxlY3QgZWxlbWVudCBmcm9tIG1vZGVsLgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIG1vZGVsVmV3ZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0TW9kZWxFbGVtZW50KCkgewotCQlyZXR1cm4gc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsRWxlbWVudChFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IG1vZGVsRWxlbWVudDsKLQkJaWYgKG1vZGVsVmV3ZXIgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQltb2RlbFZld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQl9Ci0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgcGxhdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwbGF0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwbGF0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0Q29udHJvbChwbGF0ZSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGxhdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRTZWxlY3Rpb25UaXRsZSgpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQltb2RlbFZld2VyID0gbmV3IFRyZWVWaWV3ZXIocGxhdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWxheW91dERhdGEuaGVpZ2h0SGludCA9IDMwMDsKLQkJbGF5b3V0RGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCW1vZGVsVmV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCW1vZGVsVmV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCW1vZGVsVmV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQoc2VsZWN0ZWRNb2RlbEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJbW9kZWxWZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSk7Ci0JCX0KLQkJbW9kZWxWZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS50aGlzCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBtb2RlbCBlbGVtZW50IGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgewotCQlyZXR1cm4gIlNlbGVjdCBtb2RlbCBlbGVtZW50OiI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmVhdHVyZU1hcC5FbnRyeSkgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoRmVhdHVyZU1hcC5FbnRyeSkgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gKEVPYmplY3QpIHNlbGVjdGVkRWxlbWVudDsKLQkJCX0KLQkJfQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHByb3ZpZGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwgZWxlbWVudC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDMwNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTI2ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIENvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTMzOTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5EaWFncmFtc1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBEaWFncmFtc1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDllNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCURpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdExpbmVTdHlsZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTcwNjFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlByaW50aW5nUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmludGluZ1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGZjZmIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuUnVsZXJHcmlkUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUFic3RyYWN0UGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUFic3RyYWN0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTJjYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuU2V0VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuU2V0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWdyYW1BYnN0cmFjdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHZpZXdQYXR0ZXJuOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZUZvcm1hdCB2aWV3UHJvY2Vzc29yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGVkaXRQYXR0ZXJuOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZUZvcm1hdCBlZGl0UHJvY2Vzc29yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld1BhdHRlcm4oKSB7Ci0JCXJldHVybiB2aWV3UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0Vmlld1Byb2Nlc3NvcigpIHsKLQkJcmV0dXJuIHZpZXdQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdQYXR0ZXJuKFN0cmluZyB2aWV3UGF0dGVybikgewotCQl0aGlzLnZpZXdQYXR0ZXJuID0gdmlld1BhdHRlcm47Ci0JCXZpZXdQcm9jZXNzb3IgPSBjcmVhdGVWaWV3UHJvY2Vzc29yKHZpZXdQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgY3JlYXRlVmlld1Byb2Nlc3NvcihTdHJpbmcgdmlld1BhdHRlcm4pIHsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlRm9ybWF0KHZpZXdQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0UGF0dGVybigpIHsKLQkJcmV0dXJuIGVkaXRQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRFZGl0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gZWRpdFByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdFBhdHRlcm4oU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXRoaXMuZWRpdFBhdHRlcm4gPSBlZGl0UGF0dGVybjsKLQkJZWRpdFByb2Nlc3NvciA9IGNyZWF0ZUVkaXRQcm9jZXNzb3IoZWRpdFBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVFZGl0UHJvY2Vzc29yKFN0cmluZyBlZGl0UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQoZWRpdFBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW50U3RyaW5nKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oYWRhcHRlciwgZmxhZ3MsIGdldFZpZXdQYXR0ZXJuKCksCi0JCQkJZ2V0Vmlld1Byb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0U3RyaW5nKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oYWRhcHRlciwgZmxhZ3MsIGdldEVkaXRQYXR0ZXJuKCksCi0JCQkJZ2V0RWRpdFByb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyRWRpdFN0YXR1cyBpc1ZhbGlkRWRpdFN0cmluZyhJQWRhcHRhYmxlIGVsZW1lbnQsCi0JCQlTdHJpbmcgZWRpdFN0cmluZykgewotCQlQYXJzZVBvc2l0aW9uIHBvcyA9IG5ldyBQYXJzZVBvc2l0aW9uKDApOwotCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UoZWRpdFN0cmluZywgcG9zKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCAiSW52YWxpZCBpbnB1dCBhdCAiCi0JCQkJCQkJKyBwb3MuZ2V0RXJyb3JJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlTmV3VmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBTdHJpbmcgbmV3U3RyaW5nLAotCQkJaW50IGZsYWdzKSB7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShuZXdTdHJpbmcsCi0JCQkJbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotCQlpZiAodmFsdWVzID09IG51bGwKLQkJCQl8fCB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpLmdldENvZGUoKSAhPSBJUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlQ29tbWFuZChhZGFwdGVyLCB2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwKLQkJCU9iamVjdFtdIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoSUFkYXB0YWJsZSBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJU2V0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IFNldFJlcXVlc3QoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IFNldFZhbHVlQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKFN0cmluZy5jbGFzcy5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkTmV3VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoQm9vbGVhbi5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgdmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBCb29sZWFuIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKHMuY2hhckF0KDApKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBDaGFyYWN0ZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEJ5dGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEJ5dGUoKChOdW1iZXIpIHZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gQnl0ZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBCeXRlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgQnl0ZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoU2hvcnQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBTaG9ydCgoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gU2hvcnQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gU2hvcnQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTaG9ydCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSW50ZWdlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcigoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEludGVnZXIudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gSW50ZWdlciB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEludGVnZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKExvbmcuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IExvbmcoKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gTG9uZy52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBMb25nIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgTG9uZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRmxvYXQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdCgoKE51bWJlcikgdmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRmxvYXQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRmxvYXQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBGbG9hdCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRG91YmxlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IERvdWJsZSgoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBEb3VibGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBEb3VibGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBFRW51bSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9ICgoRUVudW0pIHR5cGUpCi0JCQkJCQkJLmdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWlmIChsaXRlcmFsID09IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVW5rbm93biBsaXRlcmFsOiAiICsgdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU3RyaW5nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEludmFsaWRWYWx1ZSB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkJcHVibGljIEludmFsaWRWYWx1ZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyYjAxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uaXRlbS5BYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS51dGlsLklXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcuYWN0aW9ucy5QcmludFByZXZpZXdBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLkVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5SZW5kZXJlZFByaW50UHJldmlld0FjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlBYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwKLQkJCUlXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvciBwYXJ0RGVzY3JpcHRvcikgewotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKFByaW50UHJldmlld0FjdGlvbi5JRCkpIHsKLQkJCXJldHVybiBuZXcgUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb24oCi0JCQkJCW5ldyBFbmhhbmNlZFByaW50QWN0aW9uSGVscGVyKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVBY3Rpb24oYWN0aW9uSWQsIHBhcnREZXNjcmlwdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1FZGl0UGFydFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NTk5YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1FZGl0UGFydFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5BYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5DcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5JRWRpdFBhcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5EaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2FjaGluZzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkUGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkVmlldzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIoKSB7Ci0JCXNldEZhY3RvcnkobmV3IERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKSk7Ci0JCXNldEFsbG93Q2FjaGluZyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRQYXJ0RmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmFjdG9yeShFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FsbG93Q2FjaGluZygpIHsKLQkJcmV0dXJuIGFsbG93Q2FjaGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldEFsbG93Q2FjaGluZyhib29sZWFuIGFsbG93Q2FjaGluZykgewotCQl0aGlzLmFsbG93Q2FjaGluZyA9IGFsbG93Q2FjaGluZzsKLQkJaWYgKCFhbGxvd0NhY2hpbmcpIHsKLQkJCWNhY2hlZFBhcnQgPSBudWxsOwotCQkJY2FjaGVkVmlldyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJRWRpdFBhcnQgcGFydCA9IGZhY3RvcnkuY3JlYXRlRWRpdFBhcnQobnVsbCwgdmlldyk7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQlyZXR1cm4gKElHcmFwaGljYWxFZGl0UGFydCkgcGFydDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElHcmFwaGljYWxFZGl0UGFydCBnZXRDYWNoZWRQYXJ0KFZpZXcgdmlldykgewotCQlpZiAoY2FjaGVkVmlldyAhPSBudWxsICYmIGNhY2hlZFZpZXcuZ2V0KCkgPT0gdmlldykgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIGNhY2hlZFBhcnQuZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGNyZWF0ZUdyYXBoaWNFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gZ2V0Q2FjaGVkUGFydCh2aWV3KTsKLQkJCWNhY2hlZFBhcnQgPSBudWxsOwotCQkJY2FjaGVkVmlldyA9IG51bGw7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBhcnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUVkaXRQYXJ0KHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIENyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbikgewotCQkJVmlldyB2aWV3ID0gKChJRWRpdFBhcnRPcGVyYXRpb24pIG9wZXJhdGlvbikuZ2V0VmlldygpOwotCQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQodmlldykpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkgJiYgZ2V0Q2FjaGVkUGFydCh2aWV3KSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGNyZWF0ZUVkaXRQYXJ0KHZpZXcpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQkJCWNhY2hlZFBhcnQgPSBuZXcgV2Vha1JlZmVyZW5jZShwYXJ0KTsKLQkJCQkJY2FjaGVkVmlldyA9IG5ldyBXZWFrUmVmZXJlbmNlKHZpZXcpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtRWxlbWVudFR5cGVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTI1MzE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtRWxlbWVudFR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVsZW1lbnRUeXBlcyBleHRlbmRzIEVsZW1lbnRJbml0aWFsaXplcnMgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbUVsZW1lbnRUeXBlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW1hZ2VSZWdpc3RyeUtleShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKChFU3RydWN0dXJhbEZlYXR1cmUpIGVsZW1lbnQpOwotCQkJRUNsYXNzIGVDb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCUVDbGFzc2lmaWVyIGVUeXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJaWYgKGVDb250YWluaW5nQ2xhc3MgIT0gbnVsbCAmJiAhZUNvbnRhaW5pbmdDbGFzcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQllbGVtZW50ID0gZUNvbnRhaW5pbmdDbGFzczsKLQkJCX0gZWxzZSBpZiAoZVR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MKLQkJCQkJJiYgISgoRUNsYXNzKSBlVHlwZSkuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJZWxlbWVudCA9IGVUeXBlOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZWxlbWVudDsKLQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgewotCQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1JbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkJCWVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5jcmVhdGUoZUNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gVE9ETyA6IHN1cHBvcnQgc3RydWN0dXJhbCBmZWF0dXJlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcga2V5ID0gZ2V0SW1hZ2VSZWdpc3RyeUtleShlbGVtZW50KTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCUVOYW1lZEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoaGludCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCUVOYW1lZEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoaGludCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICd0eXBlJyBvZiB0aGUgZWNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaGludC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFTmFtZWRFbGVtZW50IGdldEVsZW1lbnQoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCU9iamVjdCB0eXBlID0gaGludC5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKLQotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkpOwotCi0JCQllbGVtZW50cy5wdXQoUm9sZVRhc2tDb21wb3NpdGVfMTAwMSwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZVRhc2tDb21wb3NpdGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFJvbGVOb2RlXzIwMDEsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZU5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChUYXNrTm9kZV8yMDAyLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoTGlua18zMDAxLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmsoKSk7Ci0JCX0KLQkJcmV0dXJuIChFTmFtZWRFbGVtZW50KSBlbGVtZW50cy5nZXQodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBSb2xlTm9kZV8yMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Sb2xlTm9kZV8yMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBUYXNrTm9kZV8yMDAyID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5UYXNrTm9kZV8yMDAyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgUm9sZVRhc2tDb21wb3NpdGVfMTAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMiA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTGlua18zMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5MaW5rXzMwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IEtOT1dOX0VMRU1FTlRfVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzS25vd25FbGVtZW50VHlwZShJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLQkJaWYgKEtOT1dOX0VMRU1FTlRfVFlQRVMgPT0gbnVsbCkgewotCQkJS05PV05fRUxFTUVOVF9UWVBFUyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eURldGFpbERpYWdyYW1fNzkpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoUm9sZVRhc2tDb21wb3NpdGVfMTAwMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFJvbGVOb2RlXzIwMDEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoVGFza05vZGVfMjAwMik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoTGlua18zMDAxKTsKLQkJfQotCQlyZXR1cm4gS05PV05fRUxFTUVOVF9UWVBFUy5jb250YWlucyhlbGVtZW50VHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OTU1YmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLkdldEljb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb24uSUljb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUljb25Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJSWNvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbihJQWRhcHRhYmxlIGhpbnQsIGludCBmbGFncykgewotCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRJbWFnZShoaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldEljb25PcGVyYXRpb24pIHsKLQkJCXJldHVybiAoKEdldEljb25PcGVyYXRpb24pIG9wZXJhdGlvbikuZXhlY3V0ZSh0aGlzKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDdiZjc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5tb2RlbGluZ2Fzc2lzdGFudC5Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIGV4dGVuZHMgTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclBvcHVwQmFyKElBZGFwdGFibGUgaG9zdCkgewotCQlJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBob3N0Ci0JCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCS8vCQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZU5vZGVfMjAwMSk7Ci0JCQkvLwkJCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlRhc2tOb2RlXzIwMDIpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLwkJCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyk7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxKTsKLQkJCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlKElBZGFwdGFibGUgc291cmNlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uVGFyZ2V0KElBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQodGFyZ2V0LCBnZXRUeXBlc0ZvclNvdXJjZSh0YXJnZXQsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHNvdXJjZSwgZ2V0VHlwZXNGb3JUYXJnZXQoc291cmNlLAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50KElBZGFwdGFibGUgaG9zdCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBob3N0Ci0JCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJaWYgKGVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRSb290KCkuZ2V0Q29udGVudHMoKS5nZXRNb2RlbCgpOwotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzQXBwbGljYWJsZUVsZW1lbnQoZWxlbWVudCwgdHlwZXMpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzZWxlY3RFbGVtZW50KChFT2JqZWN0W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEVPYmplY3RbZWxlbWVudHMKLQkJCQkuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGVFbGVtZW50KEVPYmplY3QgZWxlbWVudCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlJRWxlbWVudFR5cGUgdHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50VHlwZSgKLQkJCQllbGVtZW50KTsKLQkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFbGVtZW50KEVPYmplY3RbXSBlbGVtZW50cykgewotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpOwotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJc2hlbGwsIGxhYmVsUHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSgiQXZhaWxhYmxlIGRvbWFpbiBtb2RlbCBlbGVtZW50czoiKTsKLQkJZGlhbG9nLnNldFRpdGxlKCJTZWxlY3QgZG9tYWluIG1vZGVsIGVsZW1lbnQiKTsKLQkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLQkJZGlhbG9nLnNldEVsZW1lbnRzKGVsZW1lbnRzKTsKLQkJRU9iamVjdCBzZWxlY3RlZCA9IG51bGw7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJc2VsZWN0ZWQgPSAoRU9iamVjdCkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUGFsZXR0ZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhbGV0dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWJhZTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUGFsZXR0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5wYWxldHRlLklQYWxldHRlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVBhbGV0dGVGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QYWxldHRlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhbGV0dGVQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUGFsZXR0ZShJRWRpdG9yUGFydCBlZGl0b3IsIE9iamVjdCBjb250ZW50LAotCQkJUGFsZXR0ZVJvb3Qgcm9vdCwgTWFwIHByZWRlZmluZWRFbnRyaWVzKSB7Ci0JCURpYWdyYW1QYWxldHRlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERpYWdyYW1QYWxldHRlRmFjdG9yeSgpOwotCQlmYWN0b3J5LmZpbGxQYWxldHRlKHJvb3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCS8vIG5vIGNvbmZpZ3VyYXRpb24KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgbG9naWMgaXMgZG9uZSBpbiB0aGUgc2VydmljZQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUGFyc2VyUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUGFyc2VyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyOTUwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5HZXRQYXJzZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVBhcnNlclByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQYXJzZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHJvbGVOb2RlUm9sZU5vZGVOYW1lXzQwMDFQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldFJvbGVOb2RlUm9sZU5vZGVOYW1lXzQwMDFQYXJzZXIoKSB7Ci0JCWlmIChyb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyID09IG51bGwpIHsKLQkJCXJvbGVOb2RlUm9sZU5vZGVOYW1lXzQwMDFQYXJzZXIgPSBjcmVhdGVSb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVOb2RlUm9sZU5vZGVOYW1lXzQwMDFQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZVJvbGVOb2RlUm9sZU5vZGVOYW1lXzQwMDFQYXJzZXIoKSB7Ci0JCURpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWROb2RlX05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciB0YXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRUYXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyKCkgewotCQlpZiAodGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlciA9PSBudWxsKSB7Ci0JCQl0YXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyID0gY3JlYXRlVGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiB0YXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVUYXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkTm9kZV9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXIgPSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlcigpOwotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXIoKSB7Ci0JCURpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWROb2RlX05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBsaW5rTGlua05hbWVfNDAwNFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0TGlua0xpbmtOYW1lXzQwMDRQYXJzZXIoKSB7Ci0JCWlmIChsaW5rTGlua05hbWVfNDAwNFBhcnNlciA9PSBudWxsKSB7Ci0JCQlsaW5rTGlua05hbWVfNDAwNFBhcnNlciA9IGNyZWF0ZUxpbmtMaW5rTmFtZV80MDA0UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGxpbmtMaW5rTmFtZV80MDA0UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVMaW5rTGlua05hbWVfNDAwNFBhcnNlcigpIHsKLQkJRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rX05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGdldFBhcnNlcihpbnQgdmlzdWFsSUQpIHsKLQkJc3dpdGNoICh2aXN1YWxJRCkgewotCQljYXNlIFJvbGVOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRSb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyKCk7Ci0JCWNhc2UgVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXIoKTsKLQkJY2FzZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlcigpOwotCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldExpbmtMaW5rTmFtZV80MDA0UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcihJQWRhcHRhYmxlIGhpbnQpIHsKLQkJU3RyaW5nIHZpZCA9IChTdHJpbmcpIGhpbnQuZ2V0QWRhcHRlcihTdHJpbmcuY2xhc3MpOwotCQlpZiAodmlkICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlkKSk7Ci0JCX0KLQkJVmlldyB2aWV3ID0gKFZpZXcpIGhpbnQuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQYXJzZXJPcGVyYXRpb24pIHsKLQkJCUlBZGFwdGFibGUgaGludCA9ICgoR2V0UGFyc2VyT3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldEhpbnQoKTsKLQkJCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLmdldEVsZW1lbnQoaGludCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBnZXRQYXJzZXIoaGludCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyY2MyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLkdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLklDb21wb3NpdGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5JUHJvcGVydGllc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzLnByb3ZpZGVycy5HZW5lcmljRU1GUHJvcGVydGllc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJvcGVydHlQcm92aWRlciBleHRlbmRzIEdlbmVyaWNFTUZQcm9wZXJ0aWVzUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJUHJvcGVydGllc1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb24pIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKEdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uKSBvcGVyYXRpb24pCi0JCQkJCS5nZXRPYmplY3QoKTsKLQkJCXJldHVybiBnZXRTZW1hbnRpY0VsZW1lbnQob2JqZWN0KSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21wb3NpdGVQcm9wZXJ0eVNvdXJjZSBnZXRQcm9wZXJ0eVNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChvYmplY3QpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlTb3VyY2UoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNlbWFudGljRWxlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCVZpZXcgdmlldyA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQl2aWV3ID0gKFZpZXcpIG9iamVjdDsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iamVjdDsKLQkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVmlldykgewotCQkJCXZpZXcgPSAoVmlldykgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCQlpZiAodmlldyAhPSBudWxsCi0JCQkJJiYgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5MjRjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGlhZ3JhbUFic3RyYWN0UGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VGb3JtYXQgREVGQVVMVF9QUk9DRVNTT1IgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCSJ7MH0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlNZXNzYWdlRm9ybWF0IHByb2Nlc3NvciA9IHN1cGVyLmdldFZpZXdQcm9jZXNzb3IoKTsKLQkJcmV0dXJuIHByb2Nlc3NvciA9PSBudWxsID8gREVGQVVMVF9QUk9DRVNTT1IgOiBwcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0RWRpdFByb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RG9tYWluRWxlbWVudChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWVsZW1lbnQgPSBnZXREb21haW5FbGVtZW50KGVsZW1lbnQpOwotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGVsZW1lbnQsIGZlYXR1cmUsIHByb2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKEVPYmplY3QgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50ID09IG51bGwgPyBudWxsIDogZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gcHJvY2Vzc29yLmZvcm1hdChuZXcgT2JqZWN0W10geyB2YWx1ZSB9LCBuZXcgU3RyaW5nQnVmZmVyKCksCi0JCQkJbmV3IEZpZWxkUG9zaXRpb24oMCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZVZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7Ci0JCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFX1NUQVRVUzsKLQkJfQotCQlPYmplY3QgdmFsdWUgPSB2YWx1ZXMubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF0gOiBudWxsOwotCQl2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQllbGVtZW50ID0gZ2V0RG9tYWluRWxlbWVudChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbAotCQkJCS5nZXRFZGl0aW5nRG9tYWluKGVsZW1lbnQpOwotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlPYmplY3QgdmFsdWUgPSB2YWx1ZXMubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF0gOiBudWxsOwotCQlJQ29tbWFuZCBjb21tYW5kID0gZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgY29tbWFuZAotCQkJCS5nZXRMYWJlbCgpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbW1hbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RpbmdFdmVudChPYmplY3QgZXZlbnQsIGludCBmbGFncykgewotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsKLQkJCXJldHVybiBpc0FmZmVjdGluZ0ZlYXR1cmUoKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBZmZlY3RpbmdGZWF0dXJlKE9iamVjdCBldmVudEZlYXR1cmUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgPT0gZXZlbnRGZWF0dXJlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzg1YzQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyIGV4dGVuZHMgRGlhZ3JhbUFic3RyYWN0UGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZmVhdHVyZXM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIoTGlzdCBmZWF0dXJlcykgewotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdChmZWF0dXJlcy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQodmFsdWVzLnRvQXJyYXkobmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXSksCi0JCQkJbmV3IFN0cmluZ0J1ZmZlcigpLCBuZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCAhPSBmZWF0dXJlcy5zaXplKCkpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCS5nZXQoaSksIHZhbHVlc1tpXSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoCi0JCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbAotCQkJCS5nZXRFZGl0aW5nRG9tYWluKGVsZW1lbnQpOwotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sICJTZXQgVmFsdWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJY29tbWFuZAotCQkJCQkuY29tcG9zZShnZXRNb2RpZmljYXRpb25Db21tYW5kKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlc1tpXSkpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbikgewotCQkJT2JqZWN0IGZlYXR1cmUgPSAoKE5vdGlmaWNhdGlvbikgZXZlbnQpLmdldEZlYXR1cmUoKTsKLQkJCWlmIChmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVZpZXdQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4MmIwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVZpZXdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuQWJzdHJhY3RWaWV3UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuTGlua05hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuTGlua1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Sb2xlTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuUm9sZU5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLlJvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLlRhc2tOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5UYXNrTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1WaWV3UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFZpZXdQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1WaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQpIHsKLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhkaWFncmFtS2luZCkKLQkJCQkmJiBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXREaWFncmFtVmlzdWFsSUQoc2VtYW50aWNFbGVtZW50KSAhPSAtMSkgewotCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0Tm9kZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlpZiAoY29udGFpbmVyVmlldyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIURpYWdyYW1FbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRUNsYXNzIHNlbWFudGljVHlwZSA9IGdldFNlbWFudGljRUNsYXNzKHNlbWFudGljQWRhcHRlcik7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWludCBub2RlVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUsIHNlbWFudGljSGludCk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFJvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBSb2xlTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFJvbGVOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBSb2xlTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBUYXNrTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBUYXNrTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gTGlua05hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEVkZ2VWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gZ2V0U2VtYW50aWNFbGVtZW50VHlwZShzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbAotCQkJCSYmICFEaWFncmFtRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoc2VtYW50aWNUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWludCBsaW5rVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlKTsKLQkJc3dpdGNoIChsaW5rVklEKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBMaW5rVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIGdldFVucmVjb2duaXplZENvbm5lY3RvclZpZXdDbGFzcyhzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJY29udGFpbmVyVmlldywgc2VtYW50aWNIaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRWxlbWVudFR5cGUgZ2V0U2VtYW50aWNFbGVtZW50VHlwZShJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlcikgewotCQlpZiAoc2VtYW50aWNBZGFwdGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUVsZW1lbnRUeXBlKSBzZW1hbnRpY0FkYXB0ZXIuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENsYXNzIGdldFVucmVjb2duaXplZENvbm5lY3RvclZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQkvLyBIYW5kbGUgdW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgY2xhc3NlcyBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NWY3ODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3NlcnZpY2UvRGlhZ3JhbVJlc2V0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvc2VydmljZS9EaWFncmFtUmVzZXRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkM2JiM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvc2VydmljZS9EaWFncmFtUmVzZXRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIFNlcnZpY2UgY2xhc3MgZm9yIHJlc2V0IHRoZSBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4KLSAqIENvZGUgbWlncmF0ZWQgZnJvbSBvbGQgZGlhZ3JhbSBjb2RlLiAgIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKiovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJlc2V0U2VydmljZSB7Ci0KLQlwcml2YXRlIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW47Ci0KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXI7Ci0KLQlwcml2YXRlIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5OwotCi0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRyYW5zYWN0aW9uRG9tYWluOwotCQotCWludCBkZWx0YSA9IDA7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNR19IRUlHSFQgPSAzMjsKLQotCXB1YmxpYyBEaWFncmFtUmVzZXRTZXJ2aWNlKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdHJhbnNhY3Rpb25Eb21haW4sIAotCQkJR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlciwgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbiwKLQkJCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5KSB7Ci0JCXRoaXMudHJhbnNhY3Rpb25Eb21haW4gPSB0cmFuc2FjdGlvbkRvbWFpbjsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBncmFwaGljYWxWaWV3ZXI7Ci0JCXRoaXMuZWRpdERvbWFpbiA9IGVkaXREb21haW47Ci0JCXRoaXMuYWN0aW9uUmVnaXN0cnkgPSBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBnZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdCBkb21haW4uCi0JICogCi0JICogQHJldHVybiB0aGUgZWRpdCBkb21haW4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVmYXVsdEVkaXREb21haW4gZ2V0RWRpdERvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXREb21haW47Ci0JfQotCi0JLyoqCi0JICogTGF6aWx5IGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGFjdGlvbiByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0QWN0aW9uUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBvbmx5IGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBvciBhbnkgZGlhZ3JhbSBuZWVkIGF1dG8tbGF5b3V0LgotCSAqIE1ldGhvZCB3aWxsIHZlcmlmeSByZWNlbnRseSBhZGRlZCBlZGl0cGFydHMgaW4gdGhlIEFjdGl2aXR5ZGV0YWlsZGlhZ3JhbSBlZGl0cGFydAotCSAqIGluZGlyZWN0bHkgZnJvbSBXb3JrQnJlYWtkb3duU3RydWN0dXJlIChtZWFucyBhbnkgZGVzY3JpcHRvcnMgY3JlYXRlZCBpbiB3YnMsIGNvcnJlc3BvbmRpbmcKLQkgKiBFZGl0UGFydCB3aWxsIGdldCBjcmVhdGVkIGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBWaWV3ZXIpIGFuZCBkb2VzIGF1dG8tbGF5b3V0Ci0JICogYWxsIHRoZSBuZXcgYWRkZWQgZWRpdHBhcnRzIGFuZCBleGlzdGluZyBvbmVzLiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJaWYgKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJCUxpc3QgY2hpbGRyZW4gPSBkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCQkKLQkJCS8vIElmIGFueSBvYmxpcXVlIGxpbmtzIHJlY3RpZnkgdGhlbSB0byBzdHJhaWdodC4gCi0vLwkJCWFueU9ibGlxdWVMaW5rcyhkZXAsIGNoaWxkcmVuKTsKLQkJCQotCQkJaWYgKCFjaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQlDb21wYXJhdG9yPE9iamVjdD4gY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPE9iamVjdD4oKSB7Ci0KLQkJCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJCQkJaW50IHJjID0gMDsKLQkJCQkJCWlmIChhcmcwIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCQkJCWlmICghKGFyZzEgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSkKLQkJCQkJCQkJcmMgPSAtMTsKLQkJCQkJCX0gZWxzZSBpZiAoYXJnMSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpCi0JCQkJCQkJcmMgPSAxOwotCQkJCQkJcmV0dXJuIHJjOwotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0KLQkJCQlPYmplY3RbXSBhcnJheSA9IGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQkJZm9yIChpbnQgYSA9IDA7IGEgPCBhcnJheS5sZW5ndGg7IGErKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2FdOwotCQkJCQlhZGp1c3RTaXplKGVwKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZm9yY2UgcmVsYXlvdXQgYWZ0ZXIgc2l6ZSBhZGp1c3RtZW50Ci0JCQkJLy8KLQkJCQlkZXAuZ2V0Vmlld3BvcnQoKS52YWxpZGF0ZSgpOwotCQkJCQotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgYXJyYXkubGVuZ3RoOyBiKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVtiXTsKLQkJCQkJY2xlYW5VcChlcCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGMgPSAwOyBjIDwgYXJyYXkubGVuZ3RoOyBjKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVtjXTsKLQkJCQkJcmVkdWNlTGlua0xlbmd0aChlcCk7Ci0JCQkJfQotLy8JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBhcnJheS5sZW5ndGg7IGMrKykgewotLy8JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbY107Ci0vLwkJCQkJaWYoZXAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KXsKLS8vCQkJCQkJcmVzZXRTaXplcyhlcCwgZXApOwotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQlwYWNrRGlhZ3JhbSgpOwotCQkJCWRlcC5yZWZyZXNoKCk7Ci0JCQkJZGVwLmNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZG9lcyBhIHZlcnRpY2FsIGFsaWdubWVudCBvZiBhbGwgbm9kZXMgd2l0aCBsaW5rcwotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhblVwKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXApIHsKLQkJaWYgKCEoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSkgewotCQkJTGlzdCBzb3VyY2VMaW5rcyA9IGVwLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQlpZiAoc291cmNlTGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgc291cmNlTGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBsaW5rID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIHNvdXJjZUxpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaW50IHcgPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPCBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sICgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcsIHRhcmdldC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJdGFyZ2V0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQkJdGFyZ2V0LmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlsaXN0LmFkZChlcCk7Ci0JCQkJCWxpc3QuYWRkKHRhcmdldCk7Ci0JCQkJCXZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQobGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCB0YXJnZXRMaW5rcyA9IGVwLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAodGFyZ2V0TGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgdGFyZ2V0TGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBsaW5rID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIHRhcmdldExpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJaW50IHcgPSBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPCBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIHNvdXJjZS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdywtMSk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXNvdXJjZS5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCXNvdXJjZS5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbGlzdC5hZGQoZXApOwotCQkJCQlsaXN0LmFkZChzb3VyY2UpOwotCQkJCQl2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgfHwgCi0JCQkJCWVwIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGQgPSAwOyBkIDwgY2hpbGRyZW4uc2l6ZSgpOyBkKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkJLmdldChkKTsKLQkJCQkJY2xlYW5VcChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgRm9yIGF1dG8tbGF5b3V0LCBuZWVkIHRvIGFkanVzdCBjb25uZWN0aW9uKG9yIGxpbmspIGxlbmd0aCwgYmFzZWQgb24KLQkgKiAgY29ubmVjdGluZyBlZGl0cGFydHMoZmlndXJlcykuCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZHVjZUxpbmtMZW5ndGgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwYXJ0KSB7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJLy8gb25seSBtb3ZlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBlbGVtZW50cwotCQlpZiAocGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IG51bGw7Ci0JCQlpbnQgcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVI7Ci0JCQkvLyBpcyB0aGlzIGVsZW1lbnQgbGlua2VkIHRvIGFub3RoZXIgaXRlbT8KLQkJCWlmIChwYXJ0LmdldFRhcmdldENvbm5lY3Rpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5nZXQoMCkpLmdldFNvdXJjZSgpOwotCQkJCXBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuTk9SVEg7Ci0JCQl9IGVsc2UgaWYgKHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmdldCgwKSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDsKLQkJCX0KLQkJCWlmIChsaW5rZWRQYXJ0ICE9IG51bGwpIHsKLQkJCQlpZiAoIShsaW5rZWRQYXJ0LmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmtlZFBhcnQKLQkJCQkJCQkuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCS8vIGdldCB0aGUgcGFydCdzIHBvc2l0aW9uCi0JCQkJUmVjdGFuZ2xlIHBhcnRCb3VuZHMgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCS8vIGdldCB0aGUgbGlua2VkIHBhcnQncyBwb3NpdGlvbgotCQkJCVJlY3RhbmdsZSBsaW5rZWRQYXJ0Qm91bmRzID0gbGlua2VkUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkvLyBkZXRlcm1pbmUgaW4gd2hpY2ggZGlyZWN0aW9uIGlzIHRoZSBsaW5rZWQgcGFydAotCQkJCS8vIGludCBwb3NpdGlvbiA9IHBhcnRCb3VuZHMuZ2V0UG9zaXRpb24obGlua2VkUGFydEJvdW5kcwotCQkJCS8vIC5nZXRMb2NhdGlvbigpKTsKLQkJCQkvLyBhc3N1bWUgaXQgaXMgYmVsb3cgdXMsIHNvIHRoaXMgcGFydCBtb3ZlcyB1cAotCQkJCWludCBkaXJlY3Rpb24gPSAtMTsKLQkJCQlpZiAoKHBvc2l0aW9uICYgUG9zaXRpb25Db25zdGFudHMuTk9SVEgpID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRICi0JCQkJCQl8fCAocG9zaXRpb24gJiBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpID09IFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUikgewotCQkJCQkvLyBhYm92ZSB1cywgbW92ZSBkb3duCi0JCQkJCWRpcmVjdGlvbiA9IDE7Ci0JCQkJfQotCQkJCS8vIHNldCBuZXcgYm91bmRzIGZvciB0aGUgcGFydCBzbyB0aGF0IGl0IHNpdGVzIGp1c3Qgb3V0c2lkZSBvZgotCQkJCS8vIHRoZSBsaW5rZWQgcGFydAotCQkJCVJlY3RhbmdsZSB0ZXN0Qm91bmRzID0gcGFydEJvdW5kcy5nZXRDb3B5KCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSAxKSB7Ci0JCQkJCXRlc3RCb3VuZHMueSA9IGxpbmtlZFBhcnRCb3VuZHMueSArIGxpbmtlZFBhcnRCb3VuZHMuaGVpZ2h0Ci0JCQkJCQkJKyBWRVJUX1BJWF9QQURESU5HOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRlc3RCb3VuZHMueSA9IGxpbmtlZFBhcnRCb3VuZHMueSAtIFZFUlRfUElYX1BBRERJTkcKLQkJCQkJCQktIHBhcnRCb3VuZHMuaGVpZ2h0OwotCQkJCX0KLQkJCQkvLyBzZXQgdGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIHBhcnQgaW4gdGhlIG1vZGVsCi0JCQkJUG9pbnQgbnAgPSBuZXcgUG9pbnQodGVzdEJvdW5kcy54LCB0ZXN0Qm91bmRzLnkpOwotCQkJCXBhcnQuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obnApOwotCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLChOb2RlKSBwYXJ0LmdldE1vZGVsKCksIG5wLAotCQkJCQkJcGFydEJvdW5kcy53aWR0aCwgLTEpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vdmVkOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBhZGp1c3QgdGhlIHNpemUgb2YgZWRpdHBhcnQuICAKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZShBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCWFkanVzdFNpemUoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIGVwLCAxKTsKLQkJfQotCQllbHNlIGlmIChlcCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCWFkanVzdFNpemUoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIGVwLCA1MCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBIT1JJWl9QSVhfUEFERElORyA9IDMwOwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgVkVSVF9QSVhfUEFERElORyA9IDIwOwotCi0JLyoqCi0JICogQWRqdXN0cyB0aGUgc2l6ZSBvZiBDb250YWluZXJFZGl0UGFydCB0byBhY2NvbW9kYXRlIG51bWJlciBvZiBlZGl0cGFydHMgaW4gYSByb3csCi0JICogcHVzaCB0aGUgcmVtYWluaW5nIHRoZSBlZGl0cGFydHMgaW4gdHdvIHNlY29uZCByb3cuIAotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciB7QGxpbmsgVG9vbGJhckxheW91dH0KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZShTaGFwZU5vZGVFZGl0UGFydCBlcCwgaW50IGhvcml6Q291bnQpIHsKLQkJaW50IHJlcXVpcmVkV2lkdGggPSAwOwotCQlpbnQgcm93TWF4SGVpZ2h0ID0gMDsKLQkJaW50IHJvd3MgPSAwOwotCQlpbnQgd2lkdGhTdW0gPSAwOwotCQlpbnQgaGVpZ2h0U3VtID0gMDsKLQkJaW50IGNvbHVtbiA9IDA7Ci0KLQkJZGVsdGEgPSAwOwotCQlMaXN0IGNoaWxkcmVuID0gZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgID0gZXAuZ2V0RmlndXJlKCk7Ci0JCS8vVE9ETzogbmVlZCByZXZpc2l0IHRyYW5zYWN0aW9uIHVzYWdlCi0JCXRyeXsKLQkJVHJhbnNhY3Rpb24gdHggPSAoKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pdHJhbnNhY3Rpb25Eb21haW4pLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgY2hpbGRyZW4uc2l6ZSgpOykgewotCQkJaWYgKGNvbHVtbiA9PSAwKSB7Ci0JCQkJcm93cysrOwotCQkJfQotCQkJaWYgKGNvbHVtbiA8IGhvcml6Q291bnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkuZ2V0KHApOwotCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZU5vZGVFZGl0UGFydCB8fCBjaGlsZCBpbnN0YW5jZW9mIFRhc2tOb2RlRWRpdFBhcnQpewotCQkJCQlyZXNldFNpemUoKFNoYXBlTm9kZUVkaXRQYXJ0KWNoaWxkLCBwYXJlbnRGaWd1cmUpOwotLy8JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCQlsaXN0LmFkZChjaGlsZC5nZXRNb2RlbCgpKTsKLS8vCQkJCQlQZXJzaXN0Vmlld3NDb21tYW5kIGNtZCA9IG5ldyBQZXJzaXN0Vmlld3NDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCBsaXN0KTsKLS8vCQkJCQljbWQuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQl9Ci0JCQkJRGltZW5zaW9uIGQgPSBjaGlsZC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JCQkJd2lkdGhTdW0gKz0gZC53aWR0aDsKLQkJCQlpZiAoZC5oZWlnaHQgPiByb3dNYXhIZWlnaHQpIHsKLQkJCQkJcm93TWF4SGVpZ2h0ID0gZC5oZWlnaHQ7Ci0JCQkJfQotCQkJCXArKzsKLQkJCQljb2x1bW4rKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdpZHRoU3VtID4gcmVxdWlyZWRXaWR0aCkgewotCQkJCQlyZXF1aXJlZFdpZHRoID0gd2lkdGhTdW07Ci0JCQkJfQotCQkJCWhlaWdodFN1bSArPSByb3dNYXhIZWlnaHQ7Ci0JCQkJcm93TWF4SGVpZ2h0ID0gMDsKLQkJCQl3aWR0aFN1bSA9IDA7Ci0JCQkJY29sdW1uID0gMDsKLQkJCX0KLQkJfQotCQl0eC5jb21taXQoKTsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQotCQl9Ci0JCWlmICh3aWR0aFN1bSA+IHJlcXVpcmVkV2lkdGgpIHsKLQkJCXJlcXVpcmVkV2lkdGggPSB3aWR0aFN1bTsKLQkJfQotCQloZWlnaHRTdW0gKz0gcm93TWF4SGVpZ2h0OwotCQlyZXF1aXJlZFdpZHRoICs9IEhPUklaX1BJWF9QQURESU5HCi0JCQkJKiBNYXRoLm1pbihob3JpekNvdW50LCBjaGlsZHJlbi5zaXplKCkpOwotCQlpbnQgcmVxdWlyZWRIZWlnaHQgPSBoZWlnaHRTdW0gKyAoVkVSVF9QSVhfUEFERElORyAqIHJvd3MpOwotCQlDb21tYW5kIGNtZCA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCAoKE5vZGUpIGVwLmdldE1vZGVsKCkpLCBlcAotCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpLCByZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCk7Ci0JCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCS8vKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5zZXRIZWlnaHQocmVxdWlyZWRIZWlnaHQpOwotCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQpKTsKLQkJZXAuZ2V0RmlndXJlKCkuZ2V0TGF5b3V0TWFuYWdlcigpLmxheW91dChlcC5nZXRGaWd1cmUoKSk7Ci0JCS8vIGFmdGVyIGxheW91dCwgY2hlY2sgdGhlIGJvdHRvbS1tb3N0IGNoaWxkIGZpZ3VyZSBhZ2FpbnN0IHRoZSBib3R0b20KLQkJLy8gb2YgdGhlIGNvbnRhaW5lciwgYWRqdXN0IHRoZSBib3R0b20gb2YgdGhlIGNvbnRhaW5lciBpcyBuZWNlc3NhcnkKLQkJaWYgKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlpbnQgdG90YWxDYWxjdWxhdGVkSGVpZ2h0ID0gMDsKLQkJCWZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQkJewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCQlOb2RlIG5vZGVPYmogPSAoTm9kZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJCUVPYmplY3QgbyA9IG5vZGVPYmouZ2V0RWxlbWVudCgpOwkJCQkKLQkJCQl0b3RhbENhbGN1bGF0ZWRIZWlnaHQgKz0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJfQotCQkJaW50IGhlaWdodCA9IHRvdGFsQ2FsY3VsYXRlZEhlaWdodCArIDIwICsgNSAqIChjaGlsZHJlbi5zaXplKCkgLSAxKTsKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGxhc3QgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuLmdldChjaGlsZHJlbgotCQkJCQkuc2l6ZSgpIC0gMSk7Ci0JCQlQb2ludCBjaGlsZEJvdHRvbSA9IGxhc3QuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JCQlQb2ludCBwYXJlbnRCb3R0b20gPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQkJCWludCBkZWx0YSA9IHBhcmVudEJvdHRvbS55IC0gY2hpbGRCb3R0b20ueSAtIChWRVJUX1BJWF9QQURESU5HIC8gMik7Ci0vLwkJCWVwLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0vLwkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCAtIGRlbHRhKSk7Ci0vLwkJCWNtZCA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCAoKE5vZGUpIGVwLmdldE1vZGVsKCkpLCBlcAotLy8JCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpLCAtMSwgcmVxdWlyZWRIZWlnaHQtZGVsdGEpOwotLy8JCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNtZCk7Ci0vLwkJCWVwLmdldEZpZ3VyZSgpLnNldFNpemUoCi0vLwkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCAtIGRlbHRhKSk7Ci0JCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIGhlaWdodCkpOwotCQkJY21kID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSksIGVwCi0JCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpLCAtMSwgaGVpZ2h0KTsKLQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsJCQkKLQkJCWVwLmdldEZpZ3VyZSgpLnNldFNpemUoCi0JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgaGVpZ2h0KSk7Ci0JCX0KLQl9Ci0JCi0JCi0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlc2V0U2l6ZShTaGFwZU5vZGVFZGl0UGFydCBlcCwgSUZpZ3VyZSBwYXJlbnRGaWd1cmUpewotCQkKLQkJTm9kZSBtb2RlbCA9IChOb2RlKWVwLmdldE1vZGVsKCk7Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBjaGlsZCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpZXAuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0JCU5vZGVGaWd1cmUgbm9kZUZpZ3VyZSA9IChOb2RlRmlndXJlKWVwLmdldEZpZ3VyZSgpOwotCQlMaXN0IG5vZGVGaWd1cmVDaGlsZHJlbiA9ICBub2RlRmlndXJlLmdldENoaWxkcmVuKCk7Ci0JCUlGaWd1cmUgY2hpbGRGaWd1cmUgPSAoSUZpZ3VyZSlub2RlRmlndXJlQ2hpbGRyZW4uZ2V0KDApOwotCQlpZihjaGlsZEZpZ3VyZSBpbnN0YW5jZW9mIFJlY3RhbmdsZUZpZ3VyZSl7Ci0JCQlJRmlndXJlIGxhYmVsRmlndXJlID0gKElGaWd1cmUpKChSZWN0YW5nbGVGaWd1cmUpY2hpbGRGaWd1cmUpLmdldENoaWxkcmVuKCkuZ2V0KDApOwotCQkJaWYobGFiZWxGaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpewotCQkJCURpbWVuc2lvbiBmaWdEaW1lbnNpb24gPSBsYWJlbEZpZ3VyZS5nZXRTaXplKCk7Ci0JCQkJRGltZW5zaW9uIGQgPSBsYWJlbEZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JCQkJUG9pbnQgcCA9IG5vZGVGaWd1cmUuZ2V0TG9jYXRpb24oKS5nZXRDb3B5KCk7Ci0JCQkJcC54ID0gcC54ICsgZGVsdGE7Ci0JCQkJbm9kZUZpZ3VyZS5zZXRMb2NhdGlvbihwKTsKLQkJCQlpZiAoZC53aWR0aCA+IG5vZGVGaWd1cmUuZ2V0U2l6ZSgpLndpZHRoKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm9kZSBmaWd1cmUgd2lkdGg6ICIrbm9kZUZpZ3VyZS5nZXRTaXplKCkud2lkdGgpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQgd2lkdGg6ICIrIGQud2lkdGgpOwotCQkJCQlkZWx0YSArPSBkLndpZHRoIC0gbm9kZUZpZ3VyZS5nZXRTaXplKCkud2lkdGg7Ci0JCQkJfQotCQkJCWlmKGQud2lkdGggPiBmaWdEaW1lbnNpb24ud2lkdGgpewotCQkJCQlpbnQgd2lkdGggPSBkLndpZHRoOwotCQkJCQlWaWV3IHZpZXcgPSAoKFZpZXcpY2hpbGQuZ2V0TW9kZWwoKSk7Ci0JCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQl3aWR0aCkpOwotCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG1vZGVsLAotCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCXdpZHRoKSk7Ci0JCQkJCW5vZGVGaWd1cmUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHdpZHRoLCBub2RlRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJY2hpbGRGaWd1cmUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHdpZHRoLCBjaGlsZEZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCWxhYmVsRmlndXJlLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgbGFiZWxGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQlub2RlRmlndXJlLnNldFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgbm9kZUZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCWNoaWxkRmlndXJlLnNldFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgY2hpbGRGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQlsYWJlbEZpZ3VyZS5zZXRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIGxhYmVsRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQotLy8JCQkJCW5vZGVGaWd1cmUuc2V0Q29uc3RyYWludChjaGlsZEZpZ3VyZSwgbmV3IFJlY3RhbmdsZShub2RlRmlndXJlLmdldExvY2F0aW9uKCkueCwKLS8vCQkJCQkJCW5vZGVGaWd1cmUuZ2V0TG9jYXRpb24oKS55LCB3aWR0aCwgY2hpbGRGaWd1cmUuZ2V0Qm91bmRzKCkuaGVpZ2h0KSk7Ci0JCQkJCS8vIENoYW5nZSB0aGUgbG9jYXRpb24gCi0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZCBib3VuZHMgYmVmb3JlOiAiICsgbm9kZUZpZ3VyZS5nZXRCb3VuZHMoKSArImRlbHRhOiAiICsgZGVsdGEpOwkJCQkJCi0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcGFydCwKLQkJCUxpc3Q8RWRpdFBhcnQ+IGNvbm5lY3RlZCkgewotCQkvLyBvbmx5IGFkZCBwYXJ0cyBkaXJlY3RseSBvbiB0aGUgZGlhZ3JhbSBzdXJmYWNlCi0JCWlmICghY29ubmVjdGVkLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQlpZiAoIShwYXJ0LmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCWlmICghY29ubmVjdGVkLmNvbnRhaW5zKHBhcnQuZ2V0UGFyZW50KCkpKSB7Ci0JCQkJCWNvbm5lY3RlZC5hZGQocGFydC5nZXRQYXJlbnQoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb25uZWN0ZWQuYWRkKHBhcnQpOwotCQkJfQotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gbnVsbDsKLQkJCUxpc3QgY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGNoaWxkcmVuLnNpemUoKTsgeCsrKSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkuZ2V0KHgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKHAsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCQkvLyBpcyB0aGlzIGVsZW1lbnQgbGlua2VkIHRvIGFub3RoZXIgaXRlbT8KLQkJCWZvciAoaW50IHggPSAwOyB4IDwgcGFydC5nZXRUYXJnZXRDb25uZWN0aW9ucygpLnNpemUoKTsgeCsrKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpLmdldCh4KSkuZ2V0U291cmNlKCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMobGlua2VkUGFydCwgY29ubmVjdGVkKTsKLQkJCX0KLQkJCWZvciAoaW50IHggPSAwOyB4IDwgcGFydC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLnNpemUoKTsgeCsrKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmdldCh4KSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMobGlua2VkUGFydCwgY29ubmVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGZpbmRzIHNpbmdsZSBlbGVtZW50cyBhbmQgZ3JvdXBzIG9mIGVsZW1lbnRzLCBhbmQgcG9zaXRpb25zCi0JICogdGhlbSBzdGFydGluZyBmcm9tIHRoZSB0b3Agb2YgdGhlIGRpYWdyYW0gYW5kIGNvbnRpbnVvdXNseSBkb3duIHRoZSBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwYWNrRGlhZ3JhbSgpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJLy8gc3RhcnQgYXQgdGhlIHRvcCBvZiB0aGUgZGlhZ3JhbQotCQkvLyBEaW1lbnNpb24gZGlhZ3JhbVNpemUgPSBkaWFncmFtLmdldEZpZ3VyZSgpLmdldFNpemUoKTsKLQkJLy8gbm8gbmV3IHNoYXBlcyBjYW4gYmUgbW92ZWQgYWJvdmUgdGhpcyB5LWF4aXMgdmFsdWUKLQkJaW50IHJlc2VydmVkID0gMDsKLQkJLy8gdGhlc2UgYXJlIGVsZW1lbnRzIHdpdGhvdXQgY29ubmVjdGlvbnMKLQkJTGlzdDxFZGl0UGFydD4gc3RyYWdnbGVycyA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0JCS8vIHRoZXNlIGFyZSBncm91cHMgb2YgZWxlbWVudHMgY29ubmVjdGVkIHdpdGggbGlua3MKLQkJTGlzdDxMaXN0PiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PExpc3Q+KCk7Ci0JCS8vIHRoZXNlIGFyZSB0b3AgbGV2ZWwgcGFydHMgb24gdGhlIGRpYWdyYW0gdGhhdCBoYXZlIGJlZW4gYWRkZWQKLQkJTGlzdCBkaWFncmFtUGFydHMgPSBkaWFncmFtLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRpYWdyYW1QYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGRpYWdyYW1QYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgZyA9IDA7IGcgPCBncm91cHMuc2l6ZSgpICYmIGZvdW5kID09IGZhbHNlOyBnKyspIHsKLQkJCQlMaXN0IGdyb3VwID0gKExpc3QpIGdyb3Vwcy5nZXQoZyk7Ci0JCQkJaWYgKGdyb3VwLmNvbnRhaW5zKHApKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCUxpc3Q8RWRpdFBhcnQ+IGNvbm5lY3RlZCA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMocCwgY29ubmVjdGVkKTsKLQkJCQlpZiAoY29ubmVjdGVkLnNpemUoKSA9PSAxKSB7Ci0JCQkJCXN0cmFnZ2xlcnMuYWRkKHApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdyb3Vwcy5hZGQoY29ubmVjdGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcHJvY2VzcyBlYWNoIGdyb3VwIGNsb3Nlc3QgdG8gdGhlIHRvcCAobWluIHkgdmFsdWUpCi0JCXdoaWxlIChncm91cHMuc2l6ZSgpID4gMCkgewotCQkJTGlzdCB0b3AgPSAoTGlzdCkgZ3JvdXBzLmdldCgwKTsKLQkJCWludCB0b3BZID0gZ2V0VmVydGljYWxNaW5QYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZ3JvdXBzLnNpemUoKTsgeCsrKSB7Ci0JCQkJTGlzdCBnID0gKExpc3QpIGdyb3Vwcy5nZXQoeCk7Ci0JCQkJaW50IHkgPSBnZXRWZXJ0aWNhbE1pblBhcnQoZykuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCQlpZiAoeSA8IHRvcFkpIHsKLQkJCQkJdG9wID0gZzsKLQkJCQkJdG9wWSA9IHk7Ci0JCQkJfQotCQkJfQotCQkJaW50IGxpbWl0ID0gcmVzZXJ2ZWQgKyAxOwotCQkJaW50IHZlcnRpY2FsRGVsdGEgPSBsaW1pdCAtIHRvcFk7Ci0JCQlpbnQgbGVmdFggPSBnZXRIb3Jpem9udGFsTWluUGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLng7Ci0JCQlpbnQgaG9yaXpvbnRhbERlbHRhID0gSE9SSVpfUElYX1BBRERJTkcgLSBsZWZ0WDsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgdG9wLnNpemUoKTsgeCsrKSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHRvcAotCQkJCQkJLmdldCh4KTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLChOb2RlKSBwCi0JCQkJCQkuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGJvdW5kcy54ICsgaG9yaXpvbnRhbERlbHRhLAotCQkJCQkJYm91bmRzLnkgKyB2ZXJ0aWNhbERlbHRhKSwgYm91bmRzLndpZHRoLCAtMSk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjYmMpOwotCQkJCXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24oCi0JCQkJCQluZXcgUG9pbnQoYm91bmRzLnggKyBob3Jpem9udGFsRGVsdGEsIGJvdW5kcy55Ci0JCQkJCQkJCSsgdmVydGljYWxEZWx0YSkpOwotCQkJCXAucmVmcmVzaCgpOwotCQkJfQotCQkJaW50IGJvdHRvbVkgPSBnZXRWZXJ0aWNhbE1heFBhcnQodG9wKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkuYm90dG9tKCk7Ci0JCQlyZXNlcnZlZCA9IGJvdHRvbVkgKyAoVkVSVF9QSVhfUEFERElORyAqIDIpOwotCQkJZ3JvdXBzLnJlbW92ZSh0b3ApOwotCQl9Ci0JCWludCBuZXh0ID0gSE9SSVpfUElYX1BBRERJTkc7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc3RyYWdnbGVycy5zaXplKCk7IHgrKykgewotCQkJaW50IGxpbWl0ID0gcmVzZXJ2ZWQgKyAxOwotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHN0cmFnZ2xlcnMKLQkJCQkJLmdldCh4KTsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJQ2hhbmdlQm91bmRzQ29tbWFuZCBjYmMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgKE5vZGUpIHAKLQkJCQkJLmdldE1vZGVsKCksIG5ldyBQb2ludChuZXh0LCBsaW1pdCksIGJvdW5kcy53aWR0aCwgLTEpOwotCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjYmMpOwotCQkJcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQobmV4dCwgbGltaXQpKTsKLQkJCXAucmVmcmVzaCgpOwotCQkJbmV4dCArPSBib3VuZHMud2lkdGggKyBIT1JJWl9QSVhfUEFERElORzsKLQkJfQotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRWZXJ0aWNhbE1pblBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueSA8IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRIb3Jpem9udGFsTWluUGFydChMaXN0IHBhcnRzKSB7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmMgPSBwYXJ0cy5zaXplKCkgPiAwID8gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJLmdldCgwKQotCQkJCTogbnVsbDsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlpZiAocC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54IDwgcmMuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCkgewotCQkJCXJjID0gcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldFZlcnRpY2FsTWF4UGFydChMaXN0IHBhcnRzKSB7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmMgPSBwYXJ0cy5zaXplKCkgPiAwID8gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJLmdldCgwKQotCQkJCTogbnVsbDsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlpZiAocC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5ib3R0b20oKSA+IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCS5ib3R0b20oKSkgewotCQkJCXJjID0gcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZChMaXN0IGVkaXRQYXJ0cykgewotCQkvLyBnZXQgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCS8vCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgYWxpZ25Ub1BhcnQgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBmaXJzdCBkaWFncmFtIHBhcnQgd2UgY2FuIGFsaWduIHRvCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGFsaWduVG9QYXJ0ID09IG51bGwpIHsKLQkJCQkJLy8gcmVtZW1iZXIgaXQgYW5kIHN0b3AKLQkJCQkJYWxpZ25Ub1BhcnQgPSBlcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHNldCB0aGVpciBuZXcgcG9zaXRpb24KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyB3ZSBjYW4gc2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIHRoaXMgaXMgYW4gYWxpZ24tdG8KLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQpIHsKLQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJUmVjdGFuZ2xlIGFsaWduVG9QYXJ0Qm91bmRzID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7CQkJCQkKLQkJCQkJRGltZW5zaW9uIHBzID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpOwkJCQkJCi0JCQkJCWludCBvZmZzZXQgPSAgYm91bmRzLmdldENlbnRlcigpLnggLSBhbGlnblRvUGFydEJvdW5kcy5nZXRDZW50ZXIoKS54OwotCQkJCQkvLyBpcyB0aGlzIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCQkvLyBhZGp1c3QgdGhlIG9mZnNldCBzaW5jZSB3ZSBhcmUgbW92aW5nIHRoZQotCQkJCQkJLy8gY29udGFpbmVyCi0JCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCW9mZnNldCArPSBib3VuZHMueCAtIHBhcmVudEJvdW5kcy54OwotCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQl9Ci0JCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgZWxlbWVudAotCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJdHJhbnNhY3Rpb25Eb21haW4sIChOb2RlKSBlcC5nZXRNb2RlbCgpLCBuZXcgUG9pbnQoCi0JCQkJCQkJCQlhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJCS0gb2Zmc2V0LCBib3VuZHMueSksIGJvdW5kcy53aWR0aCwKLQkJCQkJCQktMSk7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKAotCQkJCQkJCW5ldyBQb2ludChhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpKTsKLQkJCQkJUG9pbnQgc3AgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHBhcnQgaXMgY29ubmVjdGVkIHZpYSBzb3VyY2UgY29ubmVjdGlvbnMKLQkJCQkJTGlzdCBsaXN0ID0gKChTaGFwZU5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGxwID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGl0b3IKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBpZiBub3QgZm91bmQgYWJvdmUsIGNoZWNrIGlmIGl0IGlzIGNvbm5lY3RlZCB2aWEgdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQlsaXN0ID0gKChTaGFwZU5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGxwID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGl0b3IKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJaWYgKGxwLmdldFNvdXJjZSgpLmVxdWFscyhlcCkpIHsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoKTsKLQkJCQkJcC54ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKAotCQkJCQkJCShWaWV3KSBlcC5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJCQkJcC55ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKAotCQkJCQkJCShWaWV3KSBlcC5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJCQkJUG9pbnQgdHAgPSBwLmdldENvcHkoKTsKLQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJaW50IGRlbHRhID0gc3AueCAtIGNlbnRlclBvaW50Lng7Ci0JCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCWMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgKE5vZGUpIGVwCi0JCQkJCQkJLmdldE1vZGVsKCksIHRwLCBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCwKLQkJCQkJCQktMSk7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludCh0cC54LCB0cC55KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogUmV0dXJuIGhlaWdodCBvZiB0ZXh0IG9mIHRoIGVub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaW1lbnNpb24gZ2V0VGV4dERpbWVuc2lvbihTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCAhPSBudWxsKXsKLQkJCUZvbnQgZiA9IERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UOwotCQkJRGltZW5zaW9uIGQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHModGV4dCwgZik7Ci0KLQkJCWlmIChkICE9IG51bGwpCi0JCQkJcmV0dXJuIGQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbnlPYmxpcXVlTGlua3MoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwLAotCQkJTGlzdCByZWNlbnRseUFkZGVkQ2hpbGRyZW4pIHsKLQkJTGlzdCBjaGlsZHJlbiA9IGRlcC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihwYXJ0IGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCl7Ci0JCQkJTGlzdCBncmFuZENoaWxkcmVuID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KXBhcnQpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjIgPSBncmFuZENoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU2hhcGVOb2RlRWRpdFBhcnQgY2hpbGQgPSAoU2hhcGVOb2RlRWRpdFBhcnQpIGl0ZXJhdG9yMgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFRhc2tOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVBvaW50IHAgPSBjaGlsZC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCUxpc3QgY29ubmVjdGVkID0gY2hpbGQuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmICghY29ubmVjdGVkLmlzRW1wdHkoKSkgewotCQkJCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGNvbm5lY3RlZAotCQkJCQkJCQkJLmdldCgwKSkuZ2V0U291cmNlKCk7Ci0JCQkJCQkJUG9pbnQgcHQgPSBsaW5rZWRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQkJaWYgKHAueCAhPSBwdC54KSB7Ci0JCQkJCQkJCWlmICghcmVjZW50bHlBZGRlZENoaWxkcmVuLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQkJCQkJCQlyZWNlbnRseUFkZGVkQ2hpbGRyZW4uYWRkKHBhcnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY29ubmVjdGVkID0gY2hpbGQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmICghY29ubmVjdGVkLmlzRW1wdHkoKSkgewotCQkJCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpY29ubmVjdGVkCi0JCQkJCQkJCQkuZ2V0KDApKS5nZXRTb3VyY2UoKTsKLQkJCQkJCQlQb2ludCBwcyA9IGxpbmtlZFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJCS5nZXRDZW50ZXIoKTsKLQkJCQkJCQlpZiAocC54ICE9IHBzLngpIHsKLQkJCQkJCQkJaWYgKCFyZWNlbnRseUFkZGVkQ2hpbGRyZW4uY29udGFpbnMocGFydCkpIHsKLQkJCQkJCQkJCXJlY2VudGx5QWRkZWRDaGlsZHJlbi5hZGQocGFydCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNWE5NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuRGlhZ3JhbVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTWVhc3VyZW1lbnRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5IGV4dGVuZHMgRGlhZ3JhbVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhZ2VTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyB2aWV3LCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcodmlldywgc2VtYW50aWNBZGFwdGVyLCBkaWFncmFtS2luZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZWFzdXJlbWVudFVuaXQgZ2V0TWVhc3VyZW1lbnRVbml0KCkgewotCQlyZXR1cm4gTWVhc3VyZW1lbnRVbml0LlBJWEVMX0xJVEVSQUw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9MaW5rTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9MaW5rTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTYwOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvTGlua05hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCQlOb2RlIHZpZXcgPSAoTm9kZSkgc3VwZXIuY3JlYXRlVmlldyhzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNIaW50LCBpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCUlNYXBNb2RlIG1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZShjb250YWluZXJWaWV3Ci0JCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoMCkpOwotCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvTGlua1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MGQ3MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvTGlua1ZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5TdHJpbmdTdGF0aWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSURlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJlbmRwb2ludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rVmlld0ZhY3RvcnkgZXh0ZW5kcyBDb25uZWN0aW9uVmlld0ZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9VTlBST1RFQ1RFRCwgQm9vbGVhbi5UUlVFKTsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX05PVElGSUNBVElPTlMsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19UUklHR0VSUywgQm9vbGVhbi5UUlVFKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb3V0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKExpbmtFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoc2VtYW50aWNBZGFwdGVyLCB2aWV3LAotCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotCUBPdmVycmlkZQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnZpZXcuZmFjdG9yaWVzLlZpZXdGYWN0b3J5I2NyZWF0ZVZpZXcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZykKLQkgKiAKLQkgKiBPdmVycmlkZSBjcmVhdGVWaWV3IHNpbmNlIHRoZXJlIGlzIGEgYnVnIGluIAotCSAqIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5LmphdmEKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KGZpbmFsIElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJZmluYWwgVmlldyBjb250YWluZXJWaWV3LCBmaW5hbCBTdHJpbmcgc2VtYW50aWNIaW50LAotCQkJZmluYWwgaW50IGluZGV4LCBmaW5hbCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCWZpbmFsIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQotCQlzZXRQcmVmZXJlbmNlc0hpbnQocHJlZmVyZW5jZXNIaW50KTsKLQotCQlmaW5hbCBFZGdlIGVkZ2UgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVkZ2UoKTsKLQkJTGlzdCBzdHlsZXMgPSBjcmVhdGVTdHlsZXMoZWRnZSk7Ci0JCWlmIChzdHlsZXMuc2l6ZSgpID4gMCkgewotCQkJZWRnZS5nZXRTdHlsZXMoKS5hZGRBbGwoc3R5bGVzKTsKLQkJfQotCi0JCUJlbmRwb2ludHMgYmVuZFBvaW50cyA9IGNyZWF0ZUJlbmRwb2ludHMoKTsKLQkJaWYgKGJlbmRQb2ludHMgIT0gbnVsbCkgewotCQkJZWRnZS5zZXRCZW5kcG9pbnRzKGJlbmRQb2ludHMpOwotCQl9Ci0KLQkJRU9iamVjdCBzZW1hbnRpY0VsID0gc2VtYW50aWNBZGFwdGVyID09IG51bGwgPyBudWxsCi0JCQkJOiAoRU9iamVjdCkgc2VtYW50aWNBZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChzZW1hbnRpY0VsID09IG51bGwpCi0JCQkvLyBlbmZvcmNlIGEgc2V0IHRvIE5VTEwKLQkJCWVkZ2Uuc2V0RWxlbWVudChudWxsKTsKLQkJZWxzZSBpZiAocmVxdWlyZXNFbGVtZW50KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldykpIHsKLQkJCWVkZ2Uuc2V0RWxlbWVudChzZW1hbnRpY0VsKTsKLQkJfQotCi0JCWVkZ2Uuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCi0JCS8vIGRlY29yYXRlIHZpZXcgYXNzdW1lcyB0aGUgdmlldyBoYWQgYmVlbiBpbnNlcnRlZCBhbHJlYWR5LCBzbyAKLQkJLy8gd2UgaGFkIHRvIGNhbGwgaW5zZXJ0IGNoaWxkIGJlZm9yZSBjYWxsaW5nIGRlY29yYXRlIHZpZXcKLQkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIGluZGV4LCBwZXJzaXN0ZWQpOwotCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGdldEVkaXRpbmdEb21haW4oc2VtYW50aWNFbCwKLQkJCQljb250YWluZXJWaWV3KTsKLQotCQlpZiAoZG9tYWluICE9IG51bGwpIHsKLQkJCWlmIChpc1VuUHJvdGVjdGVkU2lsZW50VHJhbnNhY3Rpb25JblByb2dyZXNzKGRvbWFpbikpIHsKLQkJCQkvLyBkZWNvcmF0ZSB2aWV3IGhhZCB0byBydW4gYXMgYSBzaWxlbnQgb3BlcmF0aW9uIG90aGVyIHdpc2UKLQkJCQkvLyBpdCB3aWxsIGdlbmVyYXRlIHRvbyBtYW55IGV2ZW50cwotCQkJCWRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCB0cnVlKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlBYnN0cmFjdEVNRk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oCi0JCQkJCQlkb21haW4sIFN0cmluZ1N0YXRpY3MuQkxBTkssIG9wdGlvbnMpIHsKLQotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCB0cnVlKTsKLQotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRyeSB7Ci0JCQkJCW9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLmNhdGNoaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSURlYnVnT3B0aW9ucy5FWENFUFRJT05TX0NBVENISU5HLAotCQkJCQkJCWdldENsYXNzKCksICJjcmVhdGVWaWV3IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTG9nLndhcm5pbmcoRGlhZ3JhbVVJUGx1Z2luLmdldEluc3RhbmNlKCksCi0JCQkJCQkJRGlhZ3JhbVVJU3RhdHVzQ29kZXMuSUdOT1JFRF9FWENFUFRJT05fV0FSTklORywKLQkJCQkJCQkiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2NTM5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViNzI4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OGRhNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuTGlzdENvbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EcmF3ZXJTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlRpdGxlU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNvcnRpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlcmluZ1N0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlzZXR1cENvbXBhcnRtZW50VGl0bGUodmlldyk7Ci0JCXNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQodmlldyk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRUaXRsZShWaWV3IHZpZXcpIHsKLQkJVGl0bGVTdHlsZSB0aXRsZVN0eWxlID0gKFRpdGxlU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRUaXRsZVN0eWxlKCkpOwotCQlpZiAodGl0bGVTdHlsZSAhPSBudWxsKSB7Ci0JCQl0aXRsZVN0eWxlLnNldFNob3dUaXRsZSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKFZpZXcgdmlldykgewotCQlEcmF3ZXJTdHlsZSBkcmF3ZXJTdHlsZSA9IChEcmF3ZXJTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldERyYXdlclN0eWxlKCkpOwotCQlpZiAoZHJhd2VyU3R5bGUgIT0gbnVsbCkgewotCQkJZHJhd2VyU3R5bGUuc2V0Q29sbGFwc2VkKGZhbHNlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlNTBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCS8vIAkJbW9kaWZpZWQgbm90IHRvIGNyZWF0ZSBjb21wYXJ0bWVudAotCQkvLwkJZ2V0Vmlld1NlcnZpY2UoKQotCQkvLwkJCQkuY3JlYXRlTm9kZSgKLQkJLy8JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCS8vCQkJCQkJdmlldywKLQkJLy8JCQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkvLwkJCQkJCQkJLmdldFR5cGUoUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJLy8JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1Rhc2tOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTRkNjExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1Rhc2tOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvVGFza05vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvVGFza05vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNmYzgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1Rhc2tOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYzdjMTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJLy8JCW1vZGlmaWVkIC0gbm90IHRvIGNyZWF0ZSBjb21wYXJ0bWVudAotCQkvLwkJZ2V0Vmlld1NlcnZpY2UoKQotCQkvLwkJCQkuY3JlYXRlTm9kZSgKLQkJLy8JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCS8vCQkJCQkJdmlldywKLQkJLy8JCQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkvLwkJCQkJCQkJLmdldFR5cGUoV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJLy8JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGNhODAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRHJhd2VyU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5UaXRsZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJc2V0dXBDb21wYXJ0bWVudFRpdGxlKHZpZXcpOwotCQlzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKHZpZXcpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50VGl0bGUoVmlldyB2aWV3KSB7Ci0JCVRpdGxlU3R5bGUgdGl0bGVTdHlsZSA9IChUaXRsZVN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGl0bGVTdHlsZSgpKTsKLQkJaWYgKHRpdGxlU3R5bGUgIT0gbnVsbCkgewotCQkJdGl0bGVTdHlsZS5zZXRTaG93VGl0bGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZChWaWV3IHZpZXcpIHsKLQkJRHJhd2VyU3R5bGUgZHJhd2VyU3R5bGUgPSAoRHJhd2VyU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREcmF3ZXJTdHlsZSgpKTsKLQkJaWYgKGRyYXdlclN0eWxlICE9IG51bGwpIHsKLQkJCWRyYXdlclN0eWxlLnNldENvbGxhcHNlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiNjgzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGMxM2NhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YWM1ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgRGlhZ3JhbSBDb3JlIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViN2MxMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjIzZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudW1sMi51bWwsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI0MDgyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWIwYTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvcmVmcmVzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTg5OWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvcmVmcmVzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvcmVmcmVzaF9iYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2ZThhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvZGVsZXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L2RlbGV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTIyYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvZGVsZXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MjJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L3JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGM3MTQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L3JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvcmVmcmVzaF9iYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L3JlZnJlc2hfYmFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOTA5NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvcmVmcmVzaF9iYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvbGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2xpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvbGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2NDIyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBEaWFncmFtIENvcmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1EZWxldGVEaWFncmFtX3RleHQ9RGVsZXRlIERpYWdyYW0KLXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVmcmVzaCBmcm9tIEJhc2UgQWN0aXZpdHkKLXJlZnJlc2hfdGV4dD1SZWZyZXNoCi1vcGVuX2FkZF90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLWRlbGV0ZV90ZXh0PURlbGV0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1M2I1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRpYWdyYW1JY29uUHJvdmlkZXJzIiBuYW1lPSJEaWFncmFtIEljb24gUHJvdmlkZXJzIiBzY2hlbWE9InNjaGVtYS9kaWFncmFtSWNvblByb3ZpZGVycy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5lc3RlZENvbW1hbmRQcm92aWRlcnMiPgotICAgICAgPG5lc3RlZENvbW1hbmRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5OZXN0ZWRDb21tYW5kUHJvdmlkZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGVsZXRlRGlhZ3JhbSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJURlbGV0ZURpYWdyYW1fdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVEZWxldGVEaWFncmFtX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L3JlZnJlc2hfYmFzZS5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9lbGNsMTYvcmVmcmVzaC5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVyZWZyZXNoX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGVsZXRlRGlhZ3JhbUVsZW1lbnRBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVByaW1hcnlFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9lbGNsMTYvZGVsZXRlLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUVsZW1lbnRBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJWRlbGV0ZV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIG92ZXJyaWRlQWN0aW9uSWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlZGVsZXRlX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zY2hlbWEvZGlhZ3JhbUljb25Qcm92aWRlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc2NoZW1hL2RpYWdyYW1JY29uUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZTBiZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zY2hlbWEvZGlhZ3JhbUljb25Qcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlIiBpZD0iZGlhZ3JhbUljb25Qcm92aWRlcnMiIG5hbWU9IkRpYWdyYW0gSWNvbiBQcm92aWRlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gY3VzdG9taXplIHRoZSBpY29ucyBkaXNwbGF5ZWQgaW4gYW55IG9mIHRoZSBFUEYgZGlhZ3JhbSBlZGl0b3JzLgotCi1JbXBsZW1lbnRvcnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgbXVzdCBpbXBsZW1lbnQgdGhlIEludGVyZmFjZSBJRGlhZ3JhbUljb25Qcm92aWRlci4KLQotSXQgaXMgdGhlIGltcGxlbWVudG9ycyByZXNwb25zaWJpbGl0eSB0byBjYWNoZSB0aGUgaW1hZ2VzIGFuZCBoYW5kbGUgdGhlIGRpc3Bvc2luZyBvZiB0aGUgaW1hZ2VzIHVwb24gc2h1dGRvd24gb2YgdGhlIHdvcmtiZW5jaC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGlhZ3JhbUljb25Qcm92aWRlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkaWFncmFtSWNvblByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLklEaWFncmFtSWNvblByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGM3ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9EaWFncmFtQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvcmVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1Db3JlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvcmVQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvRGlhZ3JhbUNvcmVSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvRGlhZ3JhbUNvcmVSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1MDNjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvcmVSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1Db3JlUmVzb3VyY2VzKCkgewotCX0KLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERpYWdyYW1Db3JlUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9mbG93c190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9mbG93c19jcmVhdGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfbm9kZXNfZ3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9ub2Rlc190aXRsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJldmlvdXNfbmFtZV9udWxsMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfbmFtZV9lbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fTGlua190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ncmVzc19TYXZpbmdfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXYXJuaW5nX1NhdmluZ19EaWFncmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fc2F2ZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZURpYWdyYW1fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVEaWFncmFtX3Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbGlnbl9iZW5kX3BvaW50X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbW1hbmRfY2Fubm90RWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVDb21tYW5kX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUxpbmtDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90b29sdGlwOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9OZXdfVGFza19EZXNjcmlwdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9OZXdfTWlsZXN0b25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRERfTmV3X1dvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTmV3X0FjdGl2aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9OZXdfUGhhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX05ld19JdGVyYXRpb247Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fa2luZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURldGFpbF9EaWFncmFtX2tpbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXBlbmRlbmN5X0RpYWdyYW1fa2luZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUEREX1BhbGV0dGVfY29udHJvbF9mbG93X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1BERF9QYWxldHRlX2NvbnRyb2xfZmxvd19jcmVhdGVfdGV4dDsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODE4MDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIENvbXBsZXRlIG5ldyBzdHJpbmdzIG5lZWQgdHJhbnNsYXRpb24uCi1wcmV2aW91c19uYW1lX251bGwxPVVuZG8gb2YgYSBuYW1lIGNoYW5nZSBpcyBub3QgYWxsb3dlZCBpZiB0aGUgcHJldmlvdXMgbmFtZSBpcyBudWxsLgotZXJyX25hbWVfZW1wdHk9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1tb3ZlQWN0aW9uX2xhYmVsPU1vdmUKLQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVNlbGVjdAotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVNlbGVjdCBub2RlIG9yIGxpbmsKLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUFkZCBOb2RlCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogQWRkaW5nIGEgbm9kZSB0byBkaWFncmFtIGZhaWxlZAotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1MaW5rCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWN0IExpbmsKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9Q3JlYXRlIG5ldyBsaW5rCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9U3RhcnQgTm9kZQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwPUNyZWF0ZSBhIFN0YXJ0IE5vZGUKLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0PUZyZWUgVGV4dAotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9Q3JlYXRlIG5ldyBmcmVlIHRleHQKLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ9U3luY2hyb25pemF0aW9uIEJhcgotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1DcmVhdGUgbmV3IHN5bmNocm9uaXphdGlvbiBiYXIKLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1EZWNpc2lvbiBOb2RlCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9Q3JlYXRlIGEgRGVjaXNpb24gTm9kZQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1FbmQgTm9kZQotQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeD1BY3Rpdml0eSBEZXRhaWw6Ci1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPUNyZWF0ZSBhbiBFbmQgTm9kZQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWN0aXZpdHkKLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPUNyZWF0ZSBhbiBBY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPUNyZWF0ZSBhbiBJdGVyYXRpb24KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVBoYXNlCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1DcmVhdGUgYSBQaGFzZQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9VGFzayBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1Sb2xlIERlc2NyaXB0b3IKLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW06Ci1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgYSBSb2xlIERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPUNyZWF0ZSBhIFRhc2sgRGVzY3JpcHRvcgotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1QaGFzZQotQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPUNyZWF0ZSBhIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BbGlnbgotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVmcmVzaCBmcm9tIEJhc2UgQWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXQgVGV4dCBCb3guLi4KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEF2ZXJhZ2UKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhdmUKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F2aW5nIHswfQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVJlZnJlc2ggRnJvbSBCYXNlCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmVhdGUgQmVuZHBvaW50Ci0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotcmVmcmVzaEFjdGlvbl9sYWJlbD1SZWZyZXNoCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9UmVmcmVzaCBGcm9tIEJhc2UKLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogU2F2aW5nIGRpYWdyYW0gZmFpbGVkCi0KLURlbGV0ZURpYWdyYW1fdGV4dD1EZWxldGUgRGlhZ3JhbQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlIGFuZCBkZWxldGUgdGhpcyBkaWFncmFtP1xuVGhpcyBjaGFuZ2UgaXMgcGVybWFuZW50IGFuZCBjYW5ub3QgYmUgdW5kb25lLgotYWxpZ25fYmVuZF9wb2ludF90ZXh0PUFsaWduIEJlbmQgUG9pbnQKLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUNvbmZpZ3VyYXRpb24gRWRpdG9yCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9RXJyb3IgaW4gdGhlIG5vZGUncyBwcm9wZXJ0eSB2YWx1ZS4KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJlc2V0IERpYWdyYW0gTGF5b3V0Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogQ2Fubm90IGVkaXQgZGlhZ3JhbQotCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU9UGFyZW50IEVkaXRvciBDbG9zZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBoYXMgY2xvc2VkLiBXb3VsZCB5b3UgYWxzbyBsaWtlIHRvIGNsb3NlIHsxfT8KLQotI0JlbG93IHRocmVlIHN0cmluZ3MgbW92ZWQgZnJvbSBBdXRob3JpbmdVSSByZXNvdXJjZXMucHJvcGVydGllcy4KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogQ2Fubm90IGNvbm5lY3QKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogQ2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1DYW5ub3QgZGVsZXRlCi1kZWxldGVDb21tYW5kX2xhYmVsPURlbGV0ZQotZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9RGVsZXRlIENvbm5lY3Rpb24KLQotQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90ZXh0PU1pbGVzdG9uZQotQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90b29sdGlwPUNyZWF0ZSBhIE1pbGVzdG9uZQotQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90ZXh0PUpvaW4gTm9kZQotQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90b29sdGlwPUNyZWF0ZSBhIEpvaW4gTm9kZQotQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdGV4dD1NZXJnZSBOb2RlCi1BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90b29sdGlwPUNyZWF0ZSBhIE1lcmdlIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdGV4dD1Gb3JrIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdG9vbHRpcD1DcmVhdGUgYSBGb3JrIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90ZXh0PUFjdGl2aXR5IFBhcnRpdGlvbgotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfZmxvd3NfdGl0bGU9Rmxvd3MKLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX25vZGVzX3RpdGxlcz1Ob2RlcwotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfZmxvd3NfY3JlYXRlX3RleHQ9Q3JlYXRpb24gdG9vbCBmb3IgZmxvd3MKLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX25vZGVzX2dyb3VwX3RleHQ9Q3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMKLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd190ZXh0PUNvbnRyb2wgRmxvdwotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X2NyZWF0ZV90ZXh0PUNyZWF0ZSBhIENvbnRyb2wgRmxvdwotQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3Rvb2x0aXA9Q3JlYXRlIGFuIEFjdGl2aXR5IFBhcnRpdGlvbgotCi1BY3Rpdml0eURpYWdyYW1fTmV3X1Rhc2tfRGVzY3JpcHRvcj1OZXcgVGFzayBEZXNjcmlwdG9yCi1BY3Rpdml0eURpYWdyYW1fTmV3X01pbGVzdG9uZT1OZXcgTWlsZXN0b25lCi1XUEREX05ld19Xb3JrUHJvZHVjdERlc2NyaXB0b3I9TmV3IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1BY3Rpdml0eURpYWdyYW1fTmV3X0FjdGl2aXR5PU5ldyBBY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX05ld19QaGFzZT1OZXcgUGhhc2UKLUFjdGl2aXR5RGlhZ3JhbV9OZXdfSXRlcmF0aW9uPU5ldyBJdGVyYXRpb24KLVByb2dyZXNzX1NhdmluZ19tZXNzYWdlPVNhdmluZyB7MH0KLVdhcm5pbmdfU2F2aW5nX0RpYWdyYW09SVVQRDAwMDFXOiBTYXZpbmcgZGlhZ3JhbSBmYWlsZWQKLQotQWN0aXZpdHlEaWFncmFtX2tpbmQ9QWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlEZXRhaWxfRGlhZ3JhbV9raW5kPUFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1Xb3JrUHJvZHVjdERlcGVuZGVuY3lfRGlhZ3JhbV9raW5kPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLVdQRERfUGFsZXR0ZV9jb250cm9sX2Zsb3dfdGV4dD1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeQotV1BERF9QYWxldHRlX2NvbnRyb2xfZmxvd19jcmVhdGVfdGV4dD1DcmVhdGUgYSBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9BY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNWE0NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkRpYWdyYW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uUmVsYXRpdmVCZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQWN0aW9uIGNsYXNzIHRvIG1vdmUgZGlhZ3JhbSBlbGVtZW50cyBpbiBkaWFncmFtIGFyZWEgdXNpbmcga2V5Ym9hcmQgdXAsIGRvd24sIGxlZnQsIHJpZ2h0IGtleXMuCi0gKiBVc2VmdWwgZm9yIEFjY2Vzc2liaWxpdHksIGFuZCBhbHNvIGRvZXMgbW92ZSBiZW5kcG9pbnRzIG9mIGNvbnRyb2wgZmxvdy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbiBleHRlbmRzIERpYWdyYW1BY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRV9MRUZUX0FDVElPTiA9ICJtb3ZlX2xlZnRfYWN0aW9uIjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX1JJR0hUX0FDVElPTiA9ICJtb3ZlX3JpZ2h0X2FjdGlvbiI7CQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRV9ET1dOX0FDVElPTiA9ICJtb3ZlX2Rvd25fYWN0aW9uIjsJCS8vJE5PTi1OTFMtMSQJCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkVfVVBfQUNUSU9OID0gIm1vdmVfdXBfYWN0aW9uIjsJCQkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uOwotCQotCi0JLyoqCi0JICogQHBhcmFtIHdvcmtiZW5jaFBhZ2UKLQkgKi8KLQlwdWJsaWMgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24oSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSkgewotCQlzdXBlcih3b3JrYmVuY2hQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd29ya2JlbmNocGFydAotCSAqLwotCXB1YmxpYyBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbihJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hwYXJ0LCBpbnQgZGlyZWN0aW9uKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaHBhcnQpOwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuRGlhZ3JhbUFjdGlvbiNjcmVhdGVUYXJnZXRSZXF1ZXN0KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVxdWVzdCBjcmVhdGVUYXJnZXRSZXF1ZXN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuRGlhZ3JhbUFjdGlvbiNpc1NlbGVjdGlvbkxpc3RlbmVyKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCXNldElkKERpYWdyYW1Db25zdGFudHMuTU9WRV9BQ1RJT04pOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uKGludCBkaXJlY3Rpb24pewotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tbWFuZCgpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCk7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWwpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGFydCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKHBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCl7Ci0JCQkJQ29tbWFuZCBjID0gbW92ZShkaXJlY3Rpb24sIChHcmFwaGljYWxFZGl0UGFydClwYXJ0KTsKLQkJCQlpZihjICE9IG51bGwpewotCQkJCQljYy5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoYykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2MuaXNFbXB0eSgpID8gbnVsbCA6IG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgbW92ZShpbnQgZGlyZWN0aW9uLCBHcmFwaGljYWxFZGl0UGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgcGFydC5nZXRNb2RlbCgpOwotCQkJT2JqZWN0IHggPSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKTsKLQkJCU9iamVjdCB5ID0gVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSk7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCgoKEludGVnZXIpIHgpLmludFZhbHVlKCksICgoSW50ZWdlcikgeSkuaW50VmFsdWUoKSk7Ci0JCQlpbnQgbmV3eCA9IHBvaW50Lng7Ci0JCQlpbnQgbmV3eSA9IHBvaW50Lnk7Ci0JCQlpbnQgcHJlc3NsZW5ndGggPSAxOwotCQkJc3dpdGNoIChkaXJlY3Rpb24pIHsKLQkJCWNhc2UgUG9zaXRpb25Db25zdGFudHMuRUFTVDoKLQkJCQluZXd4ID0gcG9pbnQueCArIHByZXNzbGVuZ3RoOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDoKLQkJCQluZXd5ICs9IHByZXNzbGVuZ3RoOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDoKLQkJCQluZXd5IC09IHByZXNzbGVuZ3RoOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUOgotCQkJCW5ld3ggLT0gcHJlc3NsZW5ndGg7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJCXZpZXcsIG5ldyBQb2ludChuZXd4LCBuZXd5KSwgLTEsIC0xKTsKLQotCQkJcmV0dXJuIGM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgbW92ZUJlbmRQb2ludChpbnQgZGlyZWN0aW9uLCBDb25uZWN0aW9uRWRpdFBhcnQgcGFydCl7Ci0JCS8vIFRPRE8tIGNoZWNrIGFkZGluZyBtb3JlIGJlbmRwb2ludCwgY2FwdHVyZSBiZW5kcG9pbnQKLQkJLy8gaW5kZXggb24gZmx5Ci0JCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBFZGdlKSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJUmVsYXRpdmVCZW5kcG9pbnRzIGJQb2ludHMgPSAoUmVsYXRpdmVCZW5kcG9pbnRzKWVkZ2UuZ2V0QmVuZHBvaW50cygpOwotCQkJTGlzdCBibGlzdCA9IGJQb2ludHMuZ2V0UG9pbnRzKCk7Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJaWYgKGJsaXN0ICE9IG51bGwgJiYgYmxpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFic29sdXRlQmVuZHBvaW50IHBvaW50ID0gKEFic29sdXRlQmVuZHBvaW50KSBibGlzdAotCQkJCQkJLmdldChpbmRleCk7Ci0JCQkJaW50IG5ld3ggPSBwb2ludC54OwotCQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCQlpbnQgcHJlc3NsZW5ndGggPSA1OwotCQkJCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCQkJY2FzZSAxOgotCQkJCQluZXd4ID0gcG9pbnQueCArIHByZXNzbGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCW5ld3kgKz0gcHJlc3NsZW5ndGg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJbmV3eSAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQluZXd4IC09IHByZXNzbGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy9UT0RPOiBpbXBsZW1lbnQgdGhlIG1vdmViZW5kcG9pbnQgY29tbWFuZC4KLS8vCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0vLwkJCQkJCWxpbmssIG5ldyBQb2ludChuZXd4LCBuZXd5KSwgaW5kZXgpOwotLy8JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKXsKLQkJcmV0dXJuICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWdldERpYWdyYW1Xb3JrYmVuY2hQYXJ0KCkpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJc3dpdGNoKGRpcmVjdGlvbil7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuRUFTVDoKLQkJCXJldHVybiBNT1ZFX1JJR0hUX0FDVElPTjsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDoKLQkJCXJldHVybiBNT1ZFX0RPV05fQUNUSU9OOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOgotCQkJcmV0dXJuIE1PVkVfVVBfQUNUSU9OOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q6Ci0JCQlyZXR1cm4gTU9WRV9MRUZUX0FDVElPTjsKLQkJfQotCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5NT1ZFX0FDVElPTjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlpZihUbmdVdGlsLmlzTG9ja2VkKGdldE93bmluZ1Byb2Nlc3MoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSgoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilnZXREaWFncmFtV29ya2JlbmNoUGFydCgpKS5nZXREaWFncmFtKCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJaWYoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcygpewotCQlJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0ID0gZ2V0RGlhZ3JhbVdvcmtiZW5jaFBhcnQoKTsKLQkJaWYodGFyZ2V0UGFydCAhPSBudWxsKXsKLQkJCURpYWdyYW0gZCA9ICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldFBhcnQpLmdldERpYWdyYW0oKTsKLQkJCURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0RGlhZ3JhbUFkYXB0ZXIoZC5nZXRFbGVtZW50KCkpOwotCQkJaWYoYWRhcHRlciAhPSBudWxsKXsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFkYXB0ZXIuZ2V0QWN0aXZpdHkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjdGlvbkRlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2OTk0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQ7Ci0JcHJvdGVjdGVkIExpc3Q8RWRpdFBhcnQ+IHNlbGVjdGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCXByb3RlY3RlZCBSZXF1ZXN0IHRhcmdldFJlcXVlc3Q7Ci0KLQlwdWJsaWMgQWN0aW9uRGVsZWdhdGUoKXsKLQkJCi0JfQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBY3Rpb25EZWxlZ2F0ZShJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWV4ZWN1dGUoZ2V0Q29tbWFuZCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRyb3BNZW51SXRlbXMoKTsKLQkJc2VsZWN0ZWRQYXJ0cy5jbGVhcigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA+MAotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlzZWxlY3RlZFBhcnRzLmFkZEFsbChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBnaXZlcyBhY2Nlc3MgdG8gdGhlIGRpYWdyYW0gY29tbWFuZCBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpYWdyYW0gY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtQ29tbWFuZFN0YWNrIGdldERpYWdyYW1Db21tYW5kU3RhY2soKSB7Ci0JCU9iamVjdCBzdGFjayA9IHRhcmdldFBhcnQuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOwotCQlyZXR1cm4gKHN0YWNrIGluc3RhbmNlb2YgRGlhZ3JhbUNvbW1hbmRTdGFjaykgPyAoRGlhZ3JhbUNvbW1hbmRTdGFjaykgc3RhY2sKLQkJCTogbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hQYXJ0IGdldFdvcmtiZW5jaFBhcnQoKSB7Ci0JCXJldHVybiB0YXJnZXRQYXJ0OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZXh0bWVudXByb3ZpZGVyLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIgZ2V0RGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoKSB7Ci0JCWlmKHRhcmdldFBhcnQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEaWFncmFtR3JhcGhpY2FsVmlld2VyKSB0YXJnZXRQYXJ0Ci0JCQkJLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLQkJCURpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIHByb3ZpZGVyID0gKERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKSB2aWV3ZXIKLQkJCQkuZ2V0Q29udGV4dE1lbnUoKTsKLQkJCXJldHVybiBwcm92aWRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHtAbGluayBDb21tYW5kfS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZQotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSBkdXJpbmcgZXhlY3V0aW9uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlpZiAoY29tbWFuZCA9PSBudWxsIHx8ICFjb21tYW5kLmNhbkV4ZWN1dGUoKSkKLQkJCXJldHVybjsKLQkJaWYgKGdldERpYWdyYW1Db21tYW5kU3RhY2soKSAhPSBudWxsKQotCQkJZ2V0RGlhZ3JhbUNvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCwgcHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbW1hbmQgZ2V0Q29tbWFuZCgpOwotCQotCXByb3RlY3RlZCB2b2lkIGRyb3BNZW51SXRlbXMoKXsKLQl9Ci0JCi0JIC8qKgotICAgICAqIEdldHMgZWRpdGluZyBkb21haW4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG15IGVkaXRpbmcgZG9tYWluCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0gICAgICAgIAotICAgICAgICAvLyB0cnkgYWRhcHRpbmcgdGhlIHdvcmtiZW5jaCBwYXJ0Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBnZXRXb3JrYmVuY2hQYXJ0KCk7Ci0KLSAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSUVkaXRpbmdEb21haW5Qcm92aWRlciBlZFByb3ZpZGVyID0gKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHBhcnQKLSAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJRWRpdGluZ0RvbWFpblByb3ZpZGVyLmNsYXNzKTsKLQotICAgICAgICAgICAgaWYgKGVkUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgCUVkaXRpbmdEb21haW4gZG9tYWluID0gZWRQcm92aWRlci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSB7Ci0gICAgICAgICAgICAJCXJldHVybiAoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIGRvbWFpbjsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIEdldHMgYSByZXF1ZXN0IHRvIGJlIGFkZHJlc3NlZCB0byB0aGUgb3BlcmF0aW9uIHNldAotCSAqIAotCSAqIEByZXR1cm4gYSB0YXJnZXQgcmVxdWVzdAotCSAqLwotCXByb3RlY3RlZCBSZXF1ZXN0IGdldFRhcmdldFJlcXVlc3QoKSB7Ci0JCWlmICh0YXJnZXRSZXF1ZXN0ID09IG51bGwpCi0JCQl0YXJnZXRSZXF1ZXN0ID0gY3JlYXRlVGFyZ2V0UmVxdWVzdCgpOwotCQlyZXR1cm4gdGFyZ2V0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhcmdldCByZXF1ZXN0Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IHRhcmdldCByZXF1ZXN0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJlcXVlc3QgY3JlYXRlVGFyZ2V0UmVxdWVzdCgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9DcmVhdGVFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNmVjOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVVuc3BlY2lmaWVkVHlwZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVFbGVtZW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQlwcml2YXRlIExpc3QgZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50VHlwZT4oKTsKLQlwcml2YXRlIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlSGludCA9IG51bGw7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENyZWF0ZUVsZW1lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCwgU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlSZXF1ZXN0IHJlcT0gbmV3IENyZWF0ZVVuc3BlY2lmaWVkVHlwZVJlcXVlc3QoZ2V0RWxlbWVudFR5cGVzKCksIGdldFByZWZlcmVuY2VIaW50KCkpOwotCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCWlmKGRpYWdyYW1FZGl0UGFydC5pc0VkaXRNb2RlRW5hYmxlZCgpKXsKLQkJCUNvbW1hbmQgY21kID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCkuZ2V0Q29tbWFuZChyZXEpOwotCQkJaWYoY21kLmNhbkV4ZWN1dGUoKSl7Ci0JCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQlpZihjbWQgaW5zdGFuY2VvZiBJQ29tbWFuZFByb3h5KXsKLQkJCQkJQ29tbWFuZFJlc3VsdCByZXN1bHRzID0gKChJQ29tbWFuZFByb3h5KWNtZCkuZ2V0SUNvbW1hbmQoKS5nZXRDb21tYW5kUmVzdWx0KCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHRzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgRGlhZ3JhbUVkaXRQYXJ0IGdldERpYWdyYW1FZGl0UGFydCgpewotCQlpZih0YXJnZXRQYXJ0ICE9IG51bGwgJiYgdGFyZ2V0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0UGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RWxlbWVudFR5cGVzKCkgewotCQlyZXR1cm4gZWxlbWVudFR5cGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRUeXBlcyhMaXN0IGVsZW1lbnRUeXBlcykgewotCQl0aGlzLmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlczsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VIaW50KCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZUhpbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZUhpbnQoUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VIaW50KSB7Ci0JCXRoaXMucHJlZmVyZW5jZUhpbnQgPSBwcmVmZXJlbmNlSGludDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZWdhdGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxlZ2F0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JjY2NlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxlZ2F0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuYWN0aW9uLkFic3RyYWN0QWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogSUFjdGlvbiB0byBkZWxlZ2F0ZSB0byBJT2JqZWN0QWN0aW9uRGVsZWdhdGUuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0ZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uSGFuZGxlciB7Ci0KLQlwcml2YXRlIElBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0JCi0JcHVibGljIERlbGVnYXRlQWN0aW9uKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJc3VwZXIocGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotCQl0aGlzLnBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGVnYXRlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBpZCkgewotCQkvL3N1cGVyKHRleHQpOwotCQlzdXBlcihwYXJ0KTsKLQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJY3JlYXRlRGVsZWdhdGUoaWQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXJ1bldpdGhFdmVudChudWxsKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmKGRlbGVnYXRlICE9IG51bGwpewotCQkJcmVmcmVzaCgpOwotCQkJZGVsZWdhdGUucnVuKHRoaXMpOwotCQl9Ci0JCS8vIFJlc2V0IGFjdGlvbiBhbmQgZGVsZWdhdGUgYWN0aW9ucywgYmVjYXVzZSBzZWxlY3Rpb25DaGFuZ2VkIGxpc3RlbmVycyBkb24ndCBub3RpZnkgaGVyZS4KLQkJaWYoZGVsZWdhdGUgaW5zdGFuY2VvZiBBY3Rpb25EZWxlZ2F0ZSl7Ci0JCQkoKEFjdGlvbkRlbGVnYXRlKWRlbGVnYXRlKS5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9SdW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmKHNlbGVjdGlvbiA9PSBudWxsKXsKLQkJCXNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLCBzZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWxlZ2F0ZShTdHJpbmcgaWQpewotCQlpZihpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpewotCQkJZGVsZWdhdGUgPSBuZXcgRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlKHRoaXMscGFydCk7Ci0JCX0KLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZWZyZXNoKCk7Ci0JCXJldHVybiAoKEFjdGlvbkRlbGVnYXRlKWRlbGVnYXRlKS5pc0VuYWJsZWQoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRGlhZ3JhbUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZURpYWdyYW1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhMjA5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRGlhZ3JhbUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLQotLyoqCi0gKiBEZWxldGVzIHRoZSBkaWFncmFtLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRGlhZ3JhbUFjdGlvbiBleHRlbmRzIEFjdGlvbkRlbGVnYXRlIHsKLQotCXB1YmxpYyBEZWxldGVEaWFncmFtQWN0aW9uKCl7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBEZWxldGVEaWFncmFtQWN0aW9uKElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXN1cGVyKGFjdGlvbiwgdGFyZ2V0UGFydCk7Ci0JfQotCi0JcHJpdmF0ZSBFZGl0UGFydCBteVNlbGVjdGVkRWxlbWVudDsKLQkvL3ByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQkvKioKLQkgKiAKLQkgKi8KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLS8vCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0vLwkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLS8vCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChEaWFncmFtQ29yZVBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuRGVsZXRlRGlhZ3JhbV9wcm9tcHQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKG15U2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKW15U2VsZWN0ZWRFbGVtZW50LmdldE1vZGVsKCk7Ci0JCQkJaWYoZGlhZ3JhbSAhPSBudWxsKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKS5jaGVja01vZGlmeShuZXcgUmVzb3VyY2VbXSB7IHJlc291cmNlIH0sIHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCURpYWdyYW1IZWxwZXIuZGVsZXRlRGlhZ3JhbShkaWFncmFtLCB0cnVlKTsKLQkJCQkJCXRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcigKLQkJCQkJCQkJdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpCi0JCQkJCQkJCQkJLmdldEFjdGl2ZUVkaXRvcigpLCBmYWxzZSk7Ci0JCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkcm9wTWVudUl0ZW1zKCk7Ci0JCW15U2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlteVNlbGVjdGVkRWxlbWVudCA9IChFZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWlmKG15U2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpewotCQkJYWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQkJaWYobXlTZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpewotCQkJCWlmKCEoKERpYWdyYW1FZGl0UGFydClteVNlbGVjdGVkRWxlbWVudCkuaXNFZGl0TW9kZUVuYWJsZWQoKSl7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IGdldERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKCkuZmluZChBY3Rpb25JZHMuTUVOVV9FRElUKTsKLQkJCQkJaWYoaXRlbSAhPSBudWxsKSBpdGVtLnNldFZpc2libGUoZmFsc2UpOyAKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKW15U2VsZWN0ZWRFbGVtZW50LmdldE1vZGVsKCk7Ci0JCQlpZihkaWFncmFtICE9IG51bGwpewotCQkJCUVPYmplY3QgbW9kZWwgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQlpZihtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJTm9kZUFkYXB0ZXIgYWRhcHRlcj0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG1vZGVsKTsKLQkJCQkJaWYoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKXsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBnZXREaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcigpLmZpbmQoQWN0aW9uSWRzLk1FTlVfRURJVCk7Ci0JCQkJCQlpZihpdGVtICE9IG51bGwpIGl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7IAotCQkJCQl9Ci0JCQkJfWVsc2UgaWYobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKXsKLS8vCQkJCQlpZigoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pZGlhZ3JhbSkuaXNSZWFkT25seSgpKXsKLS8vCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX1lbHNlewotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcXVlc3QgY3JlYXRlVGFyZ2V0UmVxdWVzdCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVFbGVtZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDExYTEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BYnN0cmFjdERlbGV0ZUZyb21BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogUmVwbGFjZXMgdGhlIGRlZmF1bHQgdGhlIERlbGV0ZSBmcm9tIE1vZGVsIGFuZCBEZWxldGUgZnJvbSBEaWFncmFtIGFjdGlvbnMgb2YgR01GLgotICogRGVsZXRlIHRoZSBkaWFncmFtIGVsZW1lbnQgYW5kIGl0cyBhc3NvY2lhdGVkIGRpYWdyYW0gYW5kIHJlZmVyZW5jZXMuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpLgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRWxlbWVudEFjdGlvbiBleHRlbmRzIEFic3RyYWN0RGVsZXRlRnJvbUFjdGlvbiB7Ci0KLQlib29sZWFuIHJlbW92ZU1vZGVsID0gdHJ1ZTsKLQkvKiogdGhlIHRhcmdldCByZXF1ZXN0ICovCi0JcHJpdmF0ZSBSZXF1ZXN0IHNlY29uZGFyeVRhcmdldFJlcXVlc3Q7Ci0JLyoqCi0JICogQHBhcmFtIHBhcnQKLQkgKi8KLQlwdWJsaWMgRGVsZXRlRWxlbWVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXN1cGVyKHBhcnQpOwotCQkKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJCi0JCUxpc3Qgb3BlcmF0aW9uU2V0ID0gZ2V0T3BlcmF0aW9uU2V0KCk7Ci0JCWlmIChvcGVyYXRpb25TZXQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCQlJdGVyYXRvciBlZGl0UGFydHMgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJCWlmICgoZWxlbWVudC5lSXNQcm94eSgpKQotCQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCXx8IEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNvbW1hbmQgY3VyQ29tbWFuZCA9IGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJaWYgKGN1ckNvbW1hbmQgPT0gbnVsbCB8fCAoY3VyQ29tbWFuZC5jYW5FeGVjdXRlKCkgPT0gZmFsc2UpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy9yZXR1cm4gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlzZXRFbmFibGVkKHRydWUpOwotCQlMaXN0IGxpc3QgPSBnZXRTZWxlY3RlZE9iamVjdHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJVmlldyB2aWV3ID0gKFZpZXcpZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJaWYoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodmlldykpewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKCk7Ci0JfQotCQotCQotCQotCXByb3RlY3RlZCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKSB7Ci0JCXJldHVybiAJbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksIGZhbHNlKSk7Ci0JfQotCQotCSAvKioKLSAgICAgKiBHZXRzIGVkaXRpbmcgZG9tYWluCi0gICAgICogCi0gICAgICogQHJldHVybiBteSBlZGl0aW5nIGRvbWFpbgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotICAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFkYXB0aW5nIHRoZSB3b3JrYmVuY2ggcGFydAotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gZ2V0V29ya2JlbmNoUGFydCgpOwotCi0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgZWRQcm92aWRlciA9IChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBwYXJ0Ci0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSUVkaXRpbmdEb21haW5Qcm92aWRlci5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChlZFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGVkUHJvdmlkZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotICAgICAgICAgICAgCQotICAgICAgICAgICAgCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgewotICAgICAgICAgICAgCQlyZXR1cm4gKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBkb21haW47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVxdWVzdCBnZXRUYXJnZXRSZXF1ZXN0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRSZXF1ZXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3dJbkNvbnRleHRNZW51KCl7Ci0JCUxpc3Qgb3BlcmF0aW9uU2V0ID0gZ2V0T3BlcmF0aW9uU2V0KCk7Ci0JCWlmIChvcGVyYXRpb25TZXQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCQlJdGVyYXRvciBlZGl0UGFydHMgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJCWlmICgoZWxlbWVudC5lSXNQcm94eSgpKQotCQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNvbW1hbmQgY3VyQ29tbWFuZCA9IGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJaWYgKGN1ckNvbW1hbmQgPT0gbnVsbCB8fCAoY3VyQ29tbWFuZC5jYW5FeGVjdXRlKCkgPT0gZmFsc2UpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCS8vcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCUxpc3Qgb3BlcmF0aW9uU2V0ID0gZ2V0T3BlcmF0aW9uU2V0KCk7Ci0JCUl0ZXJhdG9yIGVkaXRQYXJ0cyA9IG9wZXJhdGlvblNldC5pdGVyYXRvcigpOwotCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0KLQkJCW5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGdldENvbW1hbmRMYWJlbCgpKTsKLQkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KXsKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQgZ0VkaXRQYXJ0ID0gCi0JCQkJCShJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCVZpZXcgdmlldyA9IChWaWV3KWdFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCUVPYmplY3QgZWxlbWVudCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJQ29tbWFuZCBjdXJDb21tYW5kID0gbnVsbDsKLQkJCWlmKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0ICYmIGlzQ2Fub25pY2FsKChJR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQpKXsKLQkJCQljdXJDb21tYW5kID0gZWRpdFBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQkJCX1lbHNlewotCQkJCWN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKGdldFNlY29uZGFyeVRhcmdldFJlcXVlc3QoKSk7Ci0JCQl9Ci0JCQlpZiAoY3VyQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJY29tbWFuZC5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoY3VyQ29tbWFuZCkpOwkJCQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKChjb21tYW5kLmlzRW1wdHkoKSkKLQkJCXx8IChjb21tYW5kLnNpemUoKSAhPSBvcGVyYXRpb25TZXQuc2l6ZSgpKSl7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQotCQlMaXN0IG9wZXJhdGlvblNldCA9IGdldE9wZXJhdGlvblNldCgpOwotCQlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxCcmVha2Rvd25FbGVtZW50PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWRpdFBhcnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChOb2RlKW9iaik7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNyZWF0ZUNvbW1hbmQoCi0JCQkJCQlDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlkb21haW4gPSBudWxsOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQllbGVtZW50cykpOwotCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotCQkJaWYgKGRlbGV0ZUFjdGlvbi5pc0RlbGV0aW9uQ29uZmlybWVkKCkpIHsKLQkJCQlzdXBlci5kb1J1bihwcm9ncmVzc01vbml0b3IpOwotCi0JCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJLy8gCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0V29ya2JlbmNoUGFydCgpLmdldFNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZ2V0V29ya2JlbmNoUGFydCgpKS5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJc3VwZXIuZG9SdW4ocHJvZ3Jlc3NNb25pdG9yKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCXNldElkKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQlzZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLmRlbGV0ZUNvbW1hbmRfbGFiZWwpOwotCQlzZXRUb29sVGlwVGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsKTsKLQkJSVNoYXJlZEltYWdlcyB3b3JrYmVuY2hJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcigKLQkJCXdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJd29ya2JlbmNoSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCXdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlT3BlcmF0aW9uU2V0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBzdXBlci5jcmVhdGVPcGVyYXRpb25TZXQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGdlcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDYW5vbmljYWwoSUdyYXBoaWNhbEVkaXRQYXJ0IGdlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBnZXAuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCUNhbm9uaWNhbEVkaXRQb2xpY3kgY2VwID0gKENhbm9uaWNhbEVkaXRQb2xpY3kpcGFyZW50LmdldEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFKTsKLQkJCWlmICggY2VwICE9IG51bGwgKSB7Ci0JCQkJaWYgKGNlcC5pc0VuYWJsZWQoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgUmVxdWVzdCBnZXRTZWNvbmRhcnlUYXJnZXRSZXF1ZXN0KCl7Ci0JCWlmKHNlY29uZGFyeVRhcmdldFJlcXVlc3QgPT0gbnVsbCl7Ci0JCQlzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0ID0gbmV3IEdyb3VwUmVxdWVzdCgKLQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfREVMRVRFKTsKLQkJfQotCQlyZXR1cm4gc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTg0NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVEaWFncmFtQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLQotLyoqCi0gKiBSZXBsYWNlcyB0aGUgZGVmYXVsdCB0aGUgRGVsZXRlIGZyb20gTW9kZWwgYW5kIERlbGV0ZSBmcm9tIERpYWdyYW0gYWN0aW9ucyBvZiBHTUYuCi0gKiBEZWxldGUgdGhlIGRpYWdyYW0gZWxlbWVudCBhbmQgaXRzIGFzc29jaWF0ZWQgZGlhZ3JhbSBhbmQgcmVmZXJlbmNlcy4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVFbGVtZW50QWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlKElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXN1cGVyKGFjdGlvbiwgdGFyZ2V0UGFydCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQl0YXJnZXRSZXF1ZXN0ID0gbnVsbDsKLQkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCQlJdGVyYXRvcjxFZGl0UGFydD4gZWRpdFBhcnRzID0gc2VsZWN0ZWRQYXJ0cy5pdGVyYXRvcigpOwotCQkKLQkJTGlzdDxBY3Rpdml0eT4gYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KCk7Ci0JCQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHRhcmdldFByb2Nlc3MgPSBnZXRPd25pbmdQcm9jZXNzKCk7Ci0JCQotCQkvLyBEZWxldGUgdGhlIGRpYWdyYW0gZWxlbWVudCBhbmQgZGlhZ3JhbSBtb2RlbC4KLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9Ci0JCQluZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsKXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJCQlJdGVyYXRvcjxFZGl0UGFydD4gZWRpdFBhcnRzID0gc2VsZWN0ZWRQYXJ0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJCQkvLyBkaXNhYmxlIG9uIGRpYWdyYW0gbGlua3MgCi0JCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCQkJCWlmICh2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSB8fCBlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQodmlldyk7Ci0JCQkJCQlpZiAoZSAhPSBudWxsICYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJCWlmICh2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSB8fCBlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh2aWV3KTsKLQkJCQlpZiAoZSAhPSBudWxsICYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlhY3Rpdml0aWVzLmFkZCgoQWN0aXZpdHkpIGUpOwotCQkJCX0KLQotCQkJCUNvbW1hbmQgY3VyQ29tbWFuZCA9IG51bGw7Ci0JCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0Ci0JCQkJCQkmJiBpc0Nhbm9uaWNhbCgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydCkpIHsKLQkJCQkJY3VyQ29tbWFuZCA9IGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VyQ29tbWFuZCA9IGVkaXRQYXJ0Ci0JCQkJCQkJLmdldENvbW1hbmQoZ2V0U2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdCgpKTsKLQkJCQl9Ci0JCQkJaWYoY3VyQ29tbWFuZCA9PSBudWxsICYmIGlzRGlhZ3JhbVVJT2JqZWN0KHZpZXcpKXsKLQkJCQkJY3VyQ29tbWFuZCA9IGVkaXRQYXJ0Ci0JCQkJCS5nZXRDb21tYW5kKGdldFNlY29uZGFyeVRhcmdldFJlcXVlc3QoKSk7Ci0JCQkJfQotCQkJCWlmIChjdXJDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJY29tbWFuZC5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoY3VyQ29tbWFuZCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoKGNvbW1hbmQuaXNFbXB0eSgpKQotCQkJfHwgKGNvbW1hbmQuc2l6ZSgpICE9IHNlbGVjdGVkUGFydHMuc2l6ZSgpKSl7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQkvLyBEZWxldGUgdGhlIHJlbGF0ZWQgZGlhZ3JhbSBvZiBkZWxldGVkIEFjdGl2aXR5Ci0JCWlmKCFhY3Rpdml0aWVzLmlzRW1wdHkoKSl7Ci0JCQluZXcgRGVsZXRlRGlhZ3JhbUNvbW1hbmQoYWN0aXZpdGllcywgdGFyZ2V0UHJvY2VzcykuZXhlY3V0ZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjb21tYW5kKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaWFncmFtVUlPYmplY3QoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKSA9PSBudWxsOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVxdWVzdCBjcmVhdGVUYXJnZXRSZXF1ZXN0KCkgewotCQlyZXR1cm4gCW5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLCBmYWxzZSkpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRFbmFibGVkKHRydWUpOwotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRQYXJ0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJVmlldyB2aWV3ID0gKFZpZXcpZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJaWYodmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgdmlldyBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBtb2RlbAotCQkJCS8vIGl0IGNhbiBiZSBkZWxldGVkCi0JCQkJLy8KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmKHZpZXcgaW5zdGFuY2VvZiBEaWFncmFtIAotCQkJCQl8fCBCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh2aWV3KQotCQkJCQl8fCBUbmdVdGlsLmlzTG9ja2VkKGdldE93bmluZ1Byb2Nlc3MoKSkKLQkJCQkJfHwgKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0ICYmIAotCQkJCQkJCXZpZXcuZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQkJfHwgKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHZpZXcpICE9IG51bGwgJiYKLQkJCQkJCQlCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQodmlldykpCi0JCQkJCQkJKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYodmlldyBpbnN0YW5jZW9mIEVkZ2UpewotCQkJCWlmKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jaGVja0RlbGV0ZSgoRWRnZSl2aWV3KSAhPSBudWxsKXsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZighaXNFbmFibGVkKCkpIHJldHVybjsKLQkJTGlzdDxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRQYXJ0cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlZGl0UGFydCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gKChFZGl0UGFydCkgZWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKE5vZGUpb2JqKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJZWxlbWVudHMuYWRkKChCcmVha2Rvd25FbGVtZW50KWVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY3JlYXRlQ29tbWFuZCgKLQkJCQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCWRvbWFpbiA9IG51bGw7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZG9tYWluID09IG51bGwpIHsKLQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChzZWxlY3Rpb24pOwotCQkJCX0KLQotCQkJfTsKLQkJCWRlbGV0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCWVsZW1lbnRzKSk7Ci0JCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0JCQlpZiAoZGVsZXRlQWN0aW9uLmlzRGVsZXRpb25Db25maXJtZWQoKSkgewotCQkJCXN1cGVyLnJ1bihhY3Rpb24pOwotCi0JCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJLy8gCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUodGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldFBhcnQpLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCWlmKGdldERpYWdyYW1Db21tYW5kU3RhY2soKSAhPSBudWxsKXsKLQkJCQkJCQlnZXREaWFncmFtQ29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQlzdXBlci5ydW4oYWN0aW9uKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZ2VwCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0Nhbm9uaWNhbChJR3JhcGhpY2FsRWRpdFBhcnQgZ2VwKSB7Ci0JCUVkaXRQYXJ0IHBhcmVudCA9IGdlcC5nZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJQ2Fub25pY2FsRWRpdFBvbGljeSBjZXAgPSAoQ2Fub25pY2FsRWRpdFBvbGljeSlwYXJlbnQuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUpOwotCQkJaWYgKCBjZXAgIT0gbnVsbCApIHsKLQkJCQlpZiAoY2VwLmlzRW5hYmxlZCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBSZXF1ZXN0IGdldFNlY29uZGFyeVRhcmdldFJlcXVlc3QoKXsKLQkJaWYoc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdCA9PSBudWxsKXsKLQkJCXNlY29uZGFyeVRhcmdldFJlcXVlc3QgPSBuZXcgR3JvdXBSZXF1ZXN0KAotCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ERUxFVEUpOwotCQl9Ci0JCXJldHVybiBzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0OwotCX0KLQlwcml2YXRlIFJlcXVlc3Qgc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdDsKLQkKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKCl7Ci0JCWlmKHRhcmdldFBhcnQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtIGQgPSAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0KS5nZXREaWFncmFtKCk7Ci0JCQlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGQuZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCl7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhZGFwdGVyLmdldEFjdGl2aXR5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EaWFncmFtQWN0aW9uc1NlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EaWFncmFtQWN0aW9uc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiZjcwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLlJlY29ubmVjdExpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotCi0vKioKLSAqIFNlcnZpY2UgY2xhc3MgdG8gYWxsb3cgY3JlYXRlIGFuZCByZWdpc3RlciBjb21tb24gYWN0aW9ucyB0byB0aGUgYWN0aW9uCi0gKiByZWdpc3Rlci4gQ29kZSBpcyBtaWdyYXRlIGZyb20gb2xkIG1ldGhvZCBvZiBkaWFncmFtbWluZy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQWN0aW9uc1NlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fSE9SWl9BVkVSQUdFID0gImFsaWduX2hvcml6b250YWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQgPSAiYWxpZ25faG9yaXpvbnRhbF90b19maXJzdF9zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0FWRVJBR0UgPSAiYWxpZ25fdmVydGljYWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQgPSAiYWxpZ25fdmVydGljYWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeTsKLQkKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdHJhbnNhY3Rpb25Eb21haW47Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKiBAcGFyYW0gZ3JhcGhpY2FsVmlld2VyIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9Ci0JICogQHBhcmFtIGVkaXREb21haW4gCXtAbGluayBEZWZhdWx0RWRpdERvbWFpbn0KLQkgKiBAcGFyYW0gYWN0aW9uUmVnaXN0cnkgCXtAbGluayBBY3Rpb25SZWdpc3RyeX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdHJhbnNhY3Rpb25Eb21haW4sIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIsCi0JCQlEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluLCBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSkgewotCQl0aGlzLnRyYW5zYWN0aW9uRG9tYWluID0gdHJhbnNhY3Rpb25Eb21haW47Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgR3JhcGhpY2FsVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgR3JhcGhpY2FsVmlld2VyCi0JICovCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWlnbkF2ZXJhZ2UgQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdG8gaG9yaXpvbnRhbCBhdmVyYWdlLiAgCi0JICovCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8gYXZlcmFnZSB5LXZhbHVlIG9mIGFsbCBub2RlcwotCQlJQWN0aW9uIGhBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhvcml6QWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9IT1JaX0FWRVJBR0U7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduQXZlcmFnZUFjdGlvbik7Ci0KLQkJcmV0dXJuIGhBbGlnbkF2ZXJhZ2VBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgd2l0aCAKLQkgKiByZXNwZWN0IHRvIGZpcnN0IHNlbGVjdGVkIGVkaXRwYXJ0LiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVySG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpIHsKLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIHktdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQlJQWN0aW9uIGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciB2ZXJ0aWFsQWxpZ25BdmVyYWdlQWN0aW9uIGFjdGlvbi4gCi0JICogdmVydGlhbEFsaWduQXZlcmFnZUFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHZlcnRpY2FsbHkgdy5yLnQgYXZlcmFnZS4KLQkgKiAKLQkgKi8KLQkKLQlwdWJsaWMgSUFjdGlvbiByZWdpc3RlclZlcnRpY2FsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIGF2ZXJhZ2UgeC12YWx1ZSBvZiBhbGwgc2VsZWN0ZWQgbm9kZXMKLQkJSUFjdGlvbiB2QWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBmaXJzdCBzZWxlY3RlZC4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8geC12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCUlBY3Rpb24gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uOwotCX0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBhY3Rpb24gbWV0aG9kcwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduRmlyc3RlU0VsZWN0ZWRBY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaG9yekFsaWduVG9GaXJzdFNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCBzZWxlY3RlZCBpdGVtcywgcmVtZW1iZXIgdGhlIHktdmFsdWUgb2YgdGhlCi0JCS8vIGZpcnN0IG5vZGUsCi0JCS8vIHNldCB0aGUgZm9sbG93aW5nIG5vZGVzIHRvIHRoZSBzYW1lIHktdmFsdWUKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyByZW1lbWJlciB0aGUgZmlyc3QgcGFydCB3ZSBtb3ZlCi0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy5oZWlnaHQgLSBmaXJzdFBhcnQKLQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJCS8vIGlzIHRoaXMgbm9kZSBpbiBhIGNvbnRhaW5lcj8KLQkJCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIG1vdmUgdGhlIGNvbnRhaW5lciwgYWRqdXN0IHRoZSBvZmZzZXQKLQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy55IC0gcGFyZW50Qm91bmRzLnk7Ci0JCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCX0KLQkJCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBub2RlCi0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGJvdW5kcy54LCBmaXJzdFBhcnQKLQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55Ci0JCQkJCQkJCQktIG9mZnNldCksIGJvdW5kcy53aWR0aCwgLTEpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgeXN1bSA9IDA7Ci0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJeXN1bSArPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJCXRvdGFsKys7Ci0JCQl9Ci0JCX0KLQkJLy8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHktdmFsdWUgZm9yIGFsbCBub2RlcwotCQlpbnQgeWF2ZSA9IChpbnQpICgoZG91YmxlKSB5c3VtIC8gKGRvdWJsZSkgdG90YWwpOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBub2RlcyBhZ2FpbiBhbmQgc2V0IHRoZW0KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyBjYWxjdWxhdGUgdGhlIGhlaWdodCBkaWZmZXJlbmNlLCBzbyB0aGF0IGVsZW1lbnRzIGFyZSBhbGlnbmVkCi0JCQkJLy8gdGhyb3VnaCB0aGUgY2VudGVybGluZQotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJLy8gaXMgdGhpcyBub2RlIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJLy8gd2UgbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54LCB5YXZlIC0gb2Zmc2V0KSwgYm91bmRzLndpZHRoLCAtMSk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciB2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlQWN0aW9uLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJaW50IHRvdGFsID0gMDsKLQkJaW50IHhzdW0gPSAwOwotCQkvLyBsb29wIHRocm91Z2ggdGhlIHNlbGVjdGVkIHBhcnRzCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQkvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG5vZGVzIGFuZCBjb250YWluZXJzCi0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0KLQkJCQkvLyBzdW0gdGhlIHggY29vcmRpbmF0ZXMgb2YgZWFjaCBlbGVtZW50Ci0JCQkJeHN1bSArPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54OwotCQkJCS8vIHJlbWVtYmVyIGhvdyBtYW55IHNlbGVjdGVkIGVsZW1lbnRzIGFwcGxpZWQgdG8gdGhpcyBvcGVyYXRpb24KLQkJCQl0b3RhbCsrOwotCQkJfQotCQl9Ci0JCS8vIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB4LXZhbHVlIGZvciBhbGwgbm9kZXMKLQkJaW50IHhhdmUgPSAoaW50KSAoKGRvdWJsZSkgeHN1bSAvIChkb3VibGUpIHRvdGFsKTsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgYWdhaW4gYW5kIHNldCB0aGVtCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy53aWR0aCAtIGZpcnN0UGFydAotCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoKSAvIDIuMCk7Ci0JCQkJLy8gYXJlIHdlIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJLy8gYWRqdXN0IHRoZSBvZmZzZXQgc2luY2Ugd2UgaGF2ZSB0byBtb3ZlIHRoZSBjb250YWluZXIKLQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy54IC0gcGFyZW50Qm91bmRzLng7Ci0JCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQl9Ci0JCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBlbGVtZW50Ci0JCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLAotCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksCi0JCQkJCQluZXcgUG9pbnQoeGF2ZSAtIG9mZnNldCwgYm91bmRzLnkpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWRBY3Rpb24uCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKCkgewotCQkvLyBnZXQgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBhbGlnblRvUGFydCA9IG51bGw7Ci0JCS8vIGZpbmQgdGhlIGZpcnN0IGRpYWdyYW0gcGFydCB3ZSBjYW4gYWxpZ24gdG8KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQlpZiAoYWxpZ25Ub1BhcnQgPT0gbnVsbCkgewotCQkJCQkvLyByZW1lbWJlciBpdCBhbmQgc3RvcAotCQkJCQlhbGlnblRvUGFydCA9IGVwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgc2V0IHRoZWlyIG5ldyBwb3NpdGlvbgotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHdlIGNhbiBza2lwIHRoZSBmaXJzdCBvbmUgc2luY2UgdGhpcyBpcyBhbiBhbGlnbi10bwotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydAotCQkJCQkJJiYgIShEaWFncmFtQ29yZVV0aWwuaXNTeW5jQmFyKGFsaWduVG9QYXJ0KSkpIHsKLQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJCWlmICghKERpYWdyYW1Db3JlVXRpbC5pc1N5bmNCYXIoZXApKSkgewotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLndpZHRoIC0gYWxpZ25Ub1BhcnQKLQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoKSAvIDIuMCk7Ci0JCQkJCQkvLyBpcyB0aGlzIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJCS8vIGFkanVzdCB0aGUgb2Zmc2V0IHNpbmNlIHdlIGFyZSBtb3ZpbmcgdGhlCi0JCQkJCQkJLy8gY29udGFpbmVyCi0JCQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJCW9mZnNldCArPSBib3VuZHMueCAtIHBhcmVudEJvdW5kcy54OwotCQkJCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQkJCX0KLQkJCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgZWxlbWVudAotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGFsaWduVG9QYXJ0Ci0JCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCQkJbmV3IFBvaW50KGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVBvaW50IHRwID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBzb3VyY2UgPSBmYWxzZTsKLQkJCQkJCVBvaW50IGVuZFBvaW50ID0gbnVsbDsKLQkJCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbHAgPSBudWxsOwotCQkJCQkJLy8gY2hlY2sgdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCQlMaXN0IGxpc3QgPSAoKFNoYXBlTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbHAgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGxwLmdldFNvdXJjZSgpLmVxdWFscyhhbGlnblRvUGFydCkpIHsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2sgc291cmNlIGNvbm5lY3Rpb25zIGlmIG5vdCBmb3VuZCBpbiB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQkJbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGVwKS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJbHAgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQkJc291cmNlID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGNvbm5lY3RlZCAmJiAoYWxpZ25Ub1BhcnQgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJCQkJaW50IGRlbHRhID0gY2VudGVyUG9pbnQueCAtIHRwLng7Ci0JCQkJCQkJZW5kUG9pbnQueCArPSBkZWx0YTsKLQkJCQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGMgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkJCQkoRWRnZSkgbHAuZ2V0TW9kZWwoKSwgKE5vZGUpIGVwLmdldE1vZGVsKCksCi0JCQkJCQkJCQlzb3VyY2UpOwotCQkJCQkJCWMuc2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotCQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIElmIGZpcnN0IHNlbGVjdGVkIGVkaXQgcGFydCBpcyBzeW5jYmFybm9kZWVkaXRwYXJ0LCBuZWVkIHRvCi0JCQkJLy8gaGFuZGxlIGRpZmZlcmVudGx5Ci0JCQkJaWYgKGVwICE9IGFsaWduVG9QYXJ0Ci0JCQkJCQkmJiAhKERpYWdyYW1Db3JlVXRpbC5pc1N5bmNCYXIoYWxpZ25Ub1BhcnQpKSkgewotCi0JCQkJCVBvaW50IHNwID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCWJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0JCQkJCS8vIGNoZWNrIGlmIHRoZSBwYXJ0IGlzIGNvbm5lY3RlZCB2aWEgc291cmNlIGNvbm5lY3Rpb25zCi0JCQkJCUxpc3QgbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBscCA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBpZiBub3QgZm91bmQgYWJvdmUsIGNoZWNrIGlmIGl0IGlzIGNvbm5lY3RlZCB2aWEgdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQlsaXN0ID0gKChTaGFwZU5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGxwID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoRGlhZ3JhbUNvcmVVdGlsLmlzU3luY0JhcihlcCkpIHsKLQkJCQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoKTsKLQkJCQkJCXAueCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldyllcC5nZXRNb2RlbCgpLAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCQkJCQlwLnkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQkJUG9pbnQgdHAgPSBwLmdldENvcHkoKTsKLQkJCQkJCVBvaW50IGFsaWduVG9DZW50ZXIgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlpbnQgZGVsdGEgPSBhbGlnblRvQ2VudGVyLnggLSBjZW50ZXJQb2ludC54OwotCQkJCQkJdHAueCA9IHRwLnggKyBkZWx0YTsKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIHRwLCBlcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCwgLTEpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludCh0cC54LCB0cC55KSk7Ci0JCQkJCX0gZWxzZSBpZiAoZXAgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCQkJUG9pbnQgcCA9IG5ldyBQb2ludCgpOwotCQkJCQkJcC54ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KWVwLmdldE1vZGVsKCksCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJCQkJCXAueSA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldyllcC5nZXRNb2RlbCgpLAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCQkJCQlQb2ludCB0cCA9IHAuZ2V0Q29weSgpOwotCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlpbnQgZGVsdGEgPSBzcC54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgsIC0xKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUFsaWduTWVudShJTWVudU1hbmFnZXIgbWVudSwgYm9vbGVhbiBjYW5Nb2RpZnkpIHsKLQkJLy8gY3JlYXRlIGEgbmV3IG1lbnUgbWFuYWdlciBmb3IgdGhlIGNhc2NhZGluZyBtZW51Ci0JCQotCQlJQ29udHJpYnV0aW9uSXRlbSBmb3JtYXRNZW51ID0gbWVudS5maW5kKEFjdGlvbklkcy5NRU5VX0ZPUk1BVCk7Ci0JCQotCQlNZW51TWFuYWdlciBhbGlnbk1lbnVNYW5hZ2VyID0gbnVsbDsKLQkJaWYgKGFsaWduTWVudU1hbmFnZXIgPT0gbnVsbCkgewotCQkJYWxpZ25NZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQkJaW50IHRvdGFsID0gMDsKLQkJCQkJLy8gZW5hYmxlIHRoZSBtZW51IG9ubHkgaWYgMiBvciBtb3JlIG5vZGVzIG9yIG5vZGUKLQkJCQkJLy8gY29udGFpbmVycwotCQkJCQkvLyBhcmUgc2VsZWN0ZWQKLQkJCQkJTGlzdCBlZGl0UGFydHMgPSBncmFwaGljYWxWaWV3ZXIuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQkJLy8gbmVlZCBhdCBsZWFzdCB0d28gdGhpbmdzIHNlbGVjdGVkIHRvIGFsaWduCi0JCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID4gMSkgewotCQkJCQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldChhKTsKLQkJCQkJCQkvLyB3ZSBjYW4gYWxpZ24gbm9kZXMgYW5kIGNvbnRhaW5lcnMKLQkJCQkJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCQkJCQkvLyBhZGQgdXAgdGhlIGVsZW1lbnRzIHdlIG5lZWQsIHRoZXJlIG1heSBiZQotCQkJCQkJCQkvLyBtb3JlCi0JCQkJCQkJCS8vIGVsZW1lbnRzIHNlbGVjdGVkIChsaW5rcywgZXRjLikKLQkJCQkJCQkJdG90YWwrKzsKLQkJCQkJCQkJaWYgKHRvdGFsID4gMSkgewotCQkJCQkJCQkJLy8gd2Ugb25seSBuZWVkIHRvIGtub3cgdGhlcmUgaXMgbW9yZSB0aGFuCi0JCQkJCQkJCQkvLyAxLCBzbwotCQkJCQkJCQkJLy8gd2UgY2FuIHN0b3AgaGVyZQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRvdGFsID4gMTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWlmIChmb3JtYXRNZW51ICE9IG51bGwgJiYgZm9ybWF0TWVudSBpbnN0YW5jZW9mIElNZW51TWFuYWdlciAKLQkJCQkmJiBhbGlnbk1lbnVNYW5hZ2VyLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9ICAoKElNZW51TWFuYWdlcilmb3JtYXRNZW51KS5maW5kKEFjdGlvbklkcy5NRU5VX0FMSUdOKTsKLQkJCWlmKGl0ZW0gIT0gbnVsbCAmJiBpdGVtIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKXsKLQkJCQlJTWVudU1hbmFnZXIgYWxpZ25NZW51ID0gKElNZW51TWFuYWdlcilpdGVtOwotCQkJCWFsaWduTWVudS5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fSE9SWl9BVkVSQUdFKSk7Ci0JCQkJYWxpZ25NZW51LmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCQkJYWxpZ25NZW51LmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9WRVJUX0FWRVJBR0UpKTsKLQkJCQlhbGlnbk1lbnUuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpKTsKLQkJCX0KLQkJfWVsc2V7Ci0JCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLkFMSUdOX0hPUlpfQVZFUkFHRSkpOwotCQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLkFMSUdOX1ZFUlRfQVZFUkFHRSkpOwotCQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCQlpZiAoYWxpZ25NZW51TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWxpZ25NZW51TWFuYWdlcik7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRWRpdG9yQWN0aW9uRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9FZGl0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWY5OTc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9FZGl0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0b3JBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yOwotCXByb3RlY3RlZCBMaXN0PEVkaXRQYXJ0PiBzZWxlY3RlZFBhcnRzID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQotCQotCXB1YmxpYyBFZGl0b3JBY3Rpb25EZWxlZ2F0ZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQl0aGlzLnRhcmdldEVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWRQYXJ0cy5jbGVhcigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA+MAotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJc2VsZWN0ZWRQYXJ0cy5hZGRBbGwoc3RydWN0dXJlZFNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpewotCQlpZih0YXJnZXRFZGl0b3IgIT0gbnVsbCAmJiB0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0RWRpdG9yKS5nZXREaWFncmFtKCk7Ci0JCQlpZihkaWFncmFtICE9IG51bGwpewotCQkJCURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCl7Ci0JCQkJCXJldHVybiAoQWN0aW9uTWFuYWdlcilhZGFwdGVyLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCSAvKioKLSAgICAgKiBHZXRzIGVkaXRpbmcgZG9tYWluCi0gICAgICogCi0gICAgICogQHJldHVybiBteSBlZGl0aW5nIGRvbWFpbgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotICAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFkYXB0aW5nIHRoZSB3b3JrYmVuY2ggcGFydAotICAgICAgICBJRWRpdG9yUGFydCBwYXJ0ID0gdGFyZ2V0RWRpdG9yOwotCi0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgZWRQcm92aWRlciA9IChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBwYXJ0Ci0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSUVkaXRpbmdEb21haW5Qcm92aWRlci5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChlZFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGVkUHJvdmlkZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotICAgICAgICAgICAgCQotICAgICAgICAgICAgCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgewotICAgICAgICAgICAgCQlyZXR1cm4gKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBkb21haW47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDFiYjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1Xb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogUmVmcmVzaCBhY3Rpb24gcmVmcmVzaGVzIHRoZSBEaWFncmFtRWRpdFBhcnQsIHBlcmZvcm1zIGRlYWN0aXZhdGUgYW5kIGFjdGl2YXRlLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRGlhZ3JhbVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydDsKLQotCXB1YmxpYyBSZWZyZXNoQWN0aW9uKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCWlmKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpIHsKLQkJCWFjdGl2ZVBhcnQgPSAoKElEaWFncmFtV29ya2JlbmNoUGFydCl0YXJnZXRQYXJ0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmKGFjdGl2ZVBhcnQgIT0gbnVsbCkgewotCQkJaWYoYWN0aXZlUGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilhY3RpdmVQYXJ0KTsgCi0JCQkJZWRpdG9yLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9SZWZyZXNoRnJvbUJhc2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9SZWZyZXNoRnJvbUJhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1YjZkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEZyb21CYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuT2JqZWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEFjdGlvbiB0byByZWZyZXNoIHRoZSBsYXRlc3QgY2hhbmdlcyBmcm9tIGJhc2UgYWN0aXZpdHkgZGlhZ3JhbSBpbnRvIAotICogZXh0ZW5kJ3MgQWN0aXZpdHkgZGlhZ3JhbS4gQWN0aW9uIHdpbGwga2VlcCB0aGUgZXhpc3RpbmcgaW1tZWRpYXRlIGNoaWxkcmVuJ3MgCi0gKiBpbmZvcm1hdGlvbiBvZiBleHRlbmQgZGlhZ3JhbSwgb25seSByZWZyZXNoIHRoZSBiYXNlIGRpYWdyYW0ncyByZWxhdGVkIGluZm9ybWF0aW9uLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEZyb21CYXNlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWZyZXNoRnJvbUJhc2VBY3Rpb24oKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlyZWZyZXNoRnJvbUJhc2VDb21tYW5kLmV4ZWN1dGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWVkaXRQYXJ0ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQllZGl0UGFydCA9IChFZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWlmKGVkaXRQYXJ0ICE9IG51bGwpewotCQkJYWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQkJLy8gQ2hlY2sgaWYgZGlhZ3JhbSByZWFkb25seS4KLQkJCWlmKGVkaXRQYXJ0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KXsKLQkJCQlpZighKChEaWFncmFtRWRpdFBhcnQpZWRpdFBhcnQpLmlzRWRpdE1vZGVFbmFibGVkKCkpewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrZWQgdmFyaWFiaWxpdHkgCi0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJQWN0aXZpdHkgZSA9IG51bGw7Ci0JCQlpZihtb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KXsKLQkJCQllID0gKEFjdGl2aXR5KUJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KW1vZGVsKTsKLQkJCX1lbHNlIGlmKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSl7Ci0JCQkJZSA9IChBY3Rpdml0eSkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pbW9kZWwpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCX0KLQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJaWYoKChBY3Rpdml0eSllKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbAotCQkJCQkJCXx8ICgoKEFjdGl2aXR5KWUpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCQkJJiYgKChBY3Rpdml0eSllKS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykpewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX1lbHNlewotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2ggYmFzZSBmcm9tIHByZXZpb3VzIGdyYXBoaWNhbCBlZGl0b3IgY29kZS4KLQkgKiBUT0RPOiBoYW5kbGUgY29uc3VtZXIgKHNldCkKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgcmVmcmVzaEZyb21CYXNlQ29tbWFuZCA9IG5ldyBDb21tYW5kKERpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZSkgeyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgQXJyYXlMaXN0IG9sZENvbnRlbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCi0JCQlFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLQkJCS8vIGJhY2sgdXAgb2xkIGRpYWdyYW0gY29udGVudAotCQkJLy8KLQkJCW9sZENvbnRlbnQuY2xlYXIoKTsKLQkJCW9sZENvbnRlbnQuYWRkQWxsKGRpYWdyYW0uZ2V0UGVyc2lzdGVkQ2hpbGRyZW4oKSk7Ci0KLQkJCWJvb2xlYW4gcmVmcmVzaGVkID0gLy9EaWFncmFtSGVscGVyLnJlZnJlc2hGcm9tQmFzZShkaWFncmFtKTsKLQkJCQlyZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbSk7Ci0JCQlpZighcmVmcmVzaGVkKSByZXR1cm47Ci0JCQkKLQkJCWlmIChlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCQkJZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJfQotCQkJLy9kaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJLy9jcmVhdGVFZGl0UGFydCgpOwotCQkJZWRpdFBhcnQgPSAoRWRpdFBhcnQpRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJZWRpdFBhcnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCQlwYXJlbnQuZ2V0Vmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJZGlhZ3JhbS5nZXRDaGlsZHJlbigpLmNsZWFyKCk7Ci0JCQlkaWFncmFtLmdldENoaWxkcmVuKCkuYWRkQWxsKG9sZENvbnRlbnQpOwotCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQllZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCQkvL2RpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQllZGl0UGFydCA9IChFZGl0UGFydClFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaGljRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JCQllZGl0UGFydC5hY3RpdmF0ZSgpOwotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKXsKLQkJcmV0dXJuIChHcmFwaGljYWxWaWV3ZXIpZWRpdFBhcnQuZ2V0Um9vdCgpLmdldFZpZXdlcigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoRnJvbUJhc2UoZmluYWwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHRIb2xkZXIgPSBuZXcgYm9vbGVhblsxXTsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9SZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbSk7Ci0JCQkJfQotCQkJCQotCQkJfSk7CQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaEZyb21CYXNlKGZpbmFsIERpYWdyYW0gZGlhZ3JhbSwgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdEhvbGRlciA9IG5ldyBib29sZWFuWzFdOwotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlyZXN1bHRIb2xkZXJbMF0gPSBkb1JlZnJlc2hGcm9tQmFzZShkaWFncmFtLCBhY3Rpdml0eSk7Ci0JCQkJfQotCQkJCQotCQkJfSk7CQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgSURpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlciB7Ci0JCS8qKgotCQkgKiBHZXRzIHRoZSB7QGxpbmsgTWV0aG9kRWxlbWVudH0gdGhhdCB0aGUgZ2l2ZW4ge0BsaW5rIE5vZGV9IHJlcHJlc2VudHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gbm9kZQotCQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQgdGhlIHJlc291cmNlIHNldCBvZiB0aGUgbGlicmFyeQotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoTm9kZSBub2RlLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCk7Ci0JCQotCQkvKioKLQkJICogRmluZHMgaW4gdGhlIGdpdmVuIGRpYWdyYW0gdGhlIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiB7QGxpbmsgTWV0aG9kRWxlbWVudH0uCi0JCSAqICAKLQkJICogQHBhcmFtIGRpYWdyYW0KLQkJICogQHBhcmFtIGUKLQkJICogQHJldHVybgotCQkgKi8KLQkJTm9kZSBmaW5kTm9kZShEaWFncmFtIGRpYWdyYW0sIE1ldGhvZEVsZW1lbnQgZSk7Ci0JCQkJCi0JCS8qKgotCQkgKiBSZS1hc3NvY2lhdGVzIGFjdGl2aXR5IG5vZGVzIGluIHRoZSBiYXNlIGRpYWdyYW0gY29weSB3aXRoIGNvcnJlc3BvbmRpbmcKLQkJICogbG9jYWxseSBjb250cmlidXRvcnMgb3IgcmVwbGFjZXJzIGlmIHRoZXJlIGlzIGFueS4KLQkJICogCi0JCSAqIEBwYXJhbSBhY3Rpdml0eQotCQkgKiBAcGFyYW0gY29weU9mQmFzZURpYWdyYW0KLQkJICovCi0JCXZvaWQgcmVhc3NvY2lhdGUoQWN0aXZpdHkgYWN0aXZpdHksIERpYWdyYW0gY29weU9mQmFzZURpYWdyYW0pOwotCQkKLQkJdm9pZCBhZGROb2RlTW9kZWxzKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBDb2xsZWN0aW9uPD8+IG5vZGVNb2RlbHMpOwotCQkKLQkJdm9pZCBhZGRFZGdlTW9kZWxzKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBDb2xsZWN0aW9uPD8+IGVkZ2VNb2RlbHMpOwotCQkKLQkJdm9pZCByZW1vdmVOb2RlTW9kZWwoRU9iamVjdCBkaWFncmFtTW9kZWwsIEVPYmplY3Qgbm9kZU1vZGVsKTsKLQkJCi0JCXZvaWQgcmVtb3ZlRWRnZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IGVkZ2VNb2RlbCk7Ci0KLQkJQ29sbGVjdGlvbjw/PiBnZXROb2RlTW9kZWxzKEVPYmplY3QgZWxlbWVudCk7Ci0KLQkJQ29sbGVjdGlvbjw/PiBnZXRFZGdlTW9kZWxzKEVPYmplY3QgZWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElEaWFncmFtQXNzb2NpYXRpb25IZWxwZXIgQURBc3NvY2lhdGlvbkhlbHBlciA9IG5ldyBJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyKCkgewotCi0JCXB1YmxpYyBOb2RlIGZpbmROb2RlKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBlKTsKLQkJfQotCi0JCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoTm9kZSBub2RlLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQkJRU9iamVjdCB1bWxPYmplY3QgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCWlmICh1bWxPYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi0JCQkJCXx8IHVtbE9iamVjdCBpbnN0YW5jZW9mIE9iamVjdE5vZGUpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KChBY3Rpdml0eU5vZGUpIHVtbE9iamVjdCk7Ci0JCQkJaWYgKGUgPT0gbnVsbCAmJiByZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCS8vIGJhc2UgZGlhZ3JhbSBpcyBub3Qgb3BlbiwgdHJ5IHRvIGdldCBmcm9tCi0JCQkJCS8vIGFubm90YXRpb24KLQkJCQkJLy8KLQkJCQkJZSA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24oCi0JCQkJCQkJCQkoRU1vZGVsRWxlbWVudCkgdW1sT2JqZWN0LCByZXNvdXJjZVNldCk7Ci0JCQkJfQotCQkJCXJldHVybiBlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWFzc29jaWF0ZShBY3Rpdml0eSBhY3Rpdml0eSwgRGlhZ3JhbSBjb3B5T2ZCYXNlRGlhZ3JhbSkgewotCQkJRGlhZ3JhbUhlbHBlci5yZWFzc29jaWF0ZShhY3Rpdml0eSwgY29weU9mQmFzZURpYWdyYW0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRWRnZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBlZGdlTW9kZWxzKSB7Ci0JCQlpZighKGRpYWdyYW1Nb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW1Nb2RlbCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IGZhbHNlOwotCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW9sZE5vdGlmeSA9IGRpYWdyYW1BZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBkaWFncmFtTW9kZWwpLmdldEVkZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY3Rpdml0eUVkZ2U+KSBlZGdlTW9kZWxzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbUFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChvbGROb3RpZnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE5vZGVNb2RlbHMoRU9iamVjdCBkaWFncmFtTW9kZWwsIENvbGxlY3Rpb248Pz4gbm9kZU1vZGVscykgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtTW9kZWwpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBmYWxzZTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvbGROb3RpZnkgPSBkaWFncmFtQWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbU1vZGVsKS5nZXROb2RlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHlOb2RlPikgbm9kZU1vZGVscyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVFZGdlTW9kZWwoRU9iamVjdCBkaWFncmFtTW9kZWwsIEVPYmplY3QgZWRnZU1vZGVsKSB7Ci0JCQlpZighKGRpYWdyYW1Nb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW1Nb2RlbCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IGZhbHNlOwotCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW9sZE5vdGlmeSA9IGRpYWdyYW1BZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBkaWFncmFtTW9kZWwpLmdldEVkZ2VzKCkucmVtb3ZlKGVkZ2VNb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVOb2RlTW9kZWwoRU9iamVjdCBkaWFncmFtTW9kZWwsIEVPYmplY3Qgbm9kZU1vZGVsKSB7Ci0JCQlpZighKGRpYWdyYW1Nb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW1Nb2RlbCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IGZhbHNlOwotCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW9sZE5vdGlmeSA9IGRpYWdyYW1BZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBkaWFncmFtTW9kZWwpLmdldE5vZGVzKCkucmVtb3ZlKG5vZGVNb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRFZGdlTW9kZWxzKEVPYmplY3QgZWxlbWVudCkgewotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuICgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGVsZW1lbnQpLmdldEVkZ2VzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldE5vZGVNb2RlbHMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZWxlbWVudCkuZ2V0Tm9kZXMoKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElEaWFncmFtQXNzb2NpYXRpb25IZWxwZXIgZGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyID0gbmV3IElEaWFncmFtQXNzb2NpYXRpb25IZWxwZXIoKSB7Ci0KLQkJcHVibGljIE5vZGUgZmluZE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJCXJldHVybiBEaWFncmFtSGVscGVyLmZpbmROb2RlSW5Nb2RlbERpYWdyYW0oZGlhZ3JhbSwgZSk7Ci0JCX0KLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KE5vZGUgbm9kZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlPyAKLQkJCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlbGVtZW50KS5nZXRMaW5rZWRFbGVtZW50KCkgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVhc3NvY2lhdGUoQWN0aXZpdHkgYWN0aXZpdHksIERpYWdyYW0gY29weU9mQmFzZURpYWdyYW0pIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGROb2RlTW9kZWxzKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBDb2xsZWN0aW9uPD8+IG5vZGVNb2RlbHMpIHsKLQkJCWlmKCEoZGlhZ3JhbU1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbU1vZGVsOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSAoKE5vZGVJbXBsKWRpYWdyYW0pLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJdHJ5IHsKLQkJCQkoKE5vZGVJbXBsKWRpYWdyYW0pLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU+KSBub2RlTW9kZWxzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCSgoTm9kZUltcGwpZGlhZ3JhbSkuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChvbGROb3RpZnkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRWRnZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBlZGdlTW9kZWxzKSB7Ci0JCQkvLwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRWRnZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IGVkZ2VNb2RlbCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTm9kZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IG5vZGVNb2RlbCkgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBkaWFncmFtTW9kZWw7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9ICgoTm9kZUltcGwpZGlhZ3JhbSkuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQl0cnkgewotCQkJCSgoTm9kZUltcGwpZGlhZ3JhbSkuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJZGlhZ3JhbS5nZXROb2RlcygpLnJlbW92ZShub2RlTW9kZWwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJKChOb2RlSW1wbClkaWFncmFtKS5zZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmeSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRFZGdlTW9kZWxzKEVPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXROb2RlTW9kZWxzKEVPYmplY3QgZWxlbWVudCkgewotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIHsKLQkJCQlyZXR1cm4gKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBlbGVtZW50KS5nZXROb2RlcygpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJCi0JfTsKLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG5vZGUgaXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgbm9kZXMgb3IgdGhlaXIgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIG5vZGVzCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKENvbGxlY3Rpb248Pz4gbm9kZXMsIFZpZXcgbm9kZSkgewotCQlpZihub2Rlcy5jb250YWlucyhub2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChPYmplY3QgY2hpbGQgOiBub2RlcykgewotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBOb2RlICYmIGNvbnRhaW5zKCgoTm9kZSkgY2hpbGQpLmdldENoaWxkcmVuKCksIG5vZGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9SZWZyZXNoRnJvbUJhc2UoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUFjdGl2aXR5IGFjdCA9IG51bGw7Ci0JCUVPYmplY3QgbW9kZWwgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCWFjdCA9IChBY3Rpdml0eSkgQnJpZGdlSGVscGVyCi0JCQkJCS5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSB7Ci0JCQlhY3QgPSAoQWN0aXZpdHkpICgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgbW9kZWwpCi0JCQkJCS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCX0KLQkJaWYgKGFjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIGRvUmVmcmVzaEZyb21CYXNlKGRpYWdyYW0sIGFjdCk7Ci0JCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9SZWZyZXNoRnJvbUJhc2UoRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3QpIHsKLQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSA9PSBudWxsCi0JCQkJfHwgYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCB0eXBlID0gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKTsKLQkJRGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVN2YyA9IG5ldyBEaWFncmFtU2VydmljZSgpOwotCQl0cnkgewotCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IGRpYWdyYW1TdmMuZ2V0QmFzZURpYWdyYW0oYWN0LCB0eXBlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJQ29sbGVjdGlvbjxOb2RlPiBvbGROb2RlcyA9IG5ldyBIYXNoU2V0PE5vZGU+KCk7Ci0JCQlDb2xsZWN0aW9uPEVkZ2U+IG9sZEVkZ2VzID0gbmV3IEhhc2hTZXQ8RWRnZT4oKTsKLQkJCURpYWdyYW0gYmFzZUNvcHkgPSBEaWFncmFtSGVscGVyLmNvcHlEaWFncmFtKFRyYW5zYWN0aW9uVXRpbAotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKSwgYmFzZURpYWdyYW0pOwotCQkJCi0JCQlJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyIGhlbHBlciA9IHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0gPyBBREFzc29jaWF0aW9uSGVscGVyCi0JCQkJCTogZGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyOyAKLQkJCQotCQkJYm9vbGVhbiBub3RpZmljYXRpb24gPSBtb2RlbC5lRGVsaXZlcigpOwotCQkJdHJ5IHsKLS8vCQkJCW1vZGVsLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGJhc2UuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkvLyBDb2xsZWN0IHRoZSBiYXNlIG5vZGVzIHRoYXQgZXhpc3QgaW4gZXh0ZW5kIGRpYWdyYW0KLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgYmFzZU5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGhlbHBlci5nZXRNZXRob2RFbGVtZW50KGJhc2VOb2RlLCByZXNvdXJjZVNldCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCU5vZGUgbm9kZSA9IGhlbHBlci5maW5kTm9kZShkaWFncmFtLCBlKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBDb2xsZWN0IG9sZCBpbmhlcml0ZWQgVUkgbm9kZXMgJiYgbm9kZXMgb2YKLQkJCQkvLyBjb250cmlidXRvci9yZXBsYWNlcgotCQkJCUxpc3Q8Pz4gY2hpbGRyZW4gPSBkaWFncmFtLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKEJyaWRnZUhlbHBlci5pc0luaGVyaXRlZChub2RlKSkgewotCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSwgcmVzb3VyY2VTZXQpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCQkmJiAoKEFjdGl2aXR5KSBlKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCS8vIG5vZGUgaXMgb2YgY29udHJpYnV0b3Igb3IgcmVwbGFjZXIKLQkJCQkJCQkvLwotCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIENvbGxlY3QgdGhlIGVkZ2VzIHRoYXRzIGV4aXN0cyBpbiBleHRlbmQgZGlhZ3JhbQotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGRpYWdyYW0uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjb250YWlucyhvbGROb2RlcywgZWRnZS5nZXRTb3VyY2UoKSkKLQkJCQkJCQkmJiBjb250YWlucyhvbGROb2RlcywgZWRnZS5nZXRUYXJnZXQoKSkpIHsKLQkJCQkJCW9sZEVkZ2VzLmFkZChlZGdlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHJlbW92ZSB0aGUgb2xkIGJhc2Ugbm9kZXMgYW5kIGVkZ2VzIHRoYXQgZXhpc3RzIGluIHRoZQotCQkJCS8vIGV4dGVuZCBkaWFncmFtLgotCQkJCWZvciAoTm9kZSBub2RlIDogb2xkTm9kZXMpIHsKLQkJCQkJZGlhZ3JhbS5yZW1vdmVDaGlsZChub2RlKTsKLQkJCQkJaGVscGVyLnJlbW92ZU5vZGVNb2RlbChtb2RlbCwgbm9kZS5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQkJCQlmb3IgKEVkZ2UgZWRnZSA6IG9sZEVkZ2VzKSB7Ci0JCQkJCWRpYWdyYW0ucmVtb3ZlRWRnZShlZGdlKTsKLQkJCQkJaGVscGVyLnJlbW92ZUVkZ2VNb2RlbChtb2RlbCwgZWRnZS5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQotCQkJCS8vIHJlcGxhY2UgYXNzb2NpYXRlZCBiYXNlIGVsZW1lbnQgd2l0aAotCQkJCS8vIGNvbnRyaWJ1dGluZy9yZXBsYWNpbmcKLQkJCQkvLyBlbGVtZW50Ci0JCQkJLy8KLQkJCQloZWxwZXIucmVhc3NvY2lhdGUoYWN0LCBiYXNlQ29weSk7Ci0KLQkJCQkvLyBNYXJrIGluaGVyaXRlZAotCQkJCWZvciAoT2JqZWN0IG9iaiA6IGJhc2VDb3B5LmdldENoaWxkcmVuKCkpIHsKLQkJCQkJQnJpZGdlSGVscGVyLm1hcmtJbmhlcml0ZWQoKFZpZXcpIG9iaik7Ci0JCQkJfQotCQkJCWZvciAoT2JqZWN0IG9iaiA6IGJhc2VDb3B5LmdldEVkZ2VzKCkpIHsKLQkJCQkJQnJpZGdlSGVscGVyLm1hcmtJbmhlcml0ZWQoKFZpZXcpIG9iaik7Ci0JCQkJfQotCQkJCQotCQkJCS8vIEFkZCBhbGwgbmV3IG5vZGVzIGFuZCBlZGdlcyBmcm9tIGJhc2UgY29weSB0byBleHRlbmQgZGlhZ3JhbS4KLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0UGVyc2lzdGVkQ2hpbGRyZW4oKS5hZGRBbGwoCi0JCQkJCQliYXNlQ29weS5nZXRDaGlsZHJlbigpKTsKLQkJCQlkaWFncmFtLmdldFBlcnNpc3RlZEVkZ2VzKCkuYWRkQWxsKAotCQkJCQkJYmFzZUNvcHkuZ2V0RWRnZXMoKSk7Ci0JCQkJQ29sbGVjdGlvbjw/PiBiYXNlTm9kZU1vZGVscyA9IGhlbHBlci5nZXROb2RlTW9kZWxzKGJhc2VDb3B5LmdldEVsZW1lbnQoKSk7Ci0JCQkJaWYoYmFzZU5vZGVNb2RlbHMgIT0gbnVsbCAmJiAhYmFzZU5vZGVNb2RlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWhlbHBlci5hZGROb2RlTW9kZWxzKG1vZGVsLCBiYXNlTm9kZU1vZGVscyk7Ci0JCQkJfQkJCQkJCi0JCQkJQ29sbGVjdGlvbjw/PiBiYXNlRWRnZU1vZGVscyA9IGhlbHBlci5nZXRFZGdlTW9kZWxzKGJhc2VDb3B5Ci0JCQkJCQkuZ2V0RWxlbWVudCgpKTsKLQkJCQlpZiAoYmFzZUVkZ2VNb2RlbHMgIT0gbnVsbCAmJiAhYmFzZUVkZ2VNb2RlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWhlbHBlci5hZGRFZGdlTW9kZWxzKG1vZGVsLCBiYXNlRWRnZU1vZGVscyk7Ci0JCQkJfQotCi0JCQkJLy8gVE9ETzogaGFuZGxlIHRoZSBtaXNzZWQgbGlua3MuCi0KLQkJCQkvLyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPQotCQkJCS8vIChBY3Rpdml0eURpYWdyYW1BZGFwdGVyKUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih1bWxBY3Rpdml0eSk7Ci0JCQkJLy8gYWRhcHRlci5wb3B1bGF0ZURpYWdyYW0oKTsKLQkJCQkvLyBpZih0YXJnZXRQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCQkvLyBEaWFncmFtRWRpdG9yVXRpbC5yZXNldEVkaXRvcigoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldFBhcnQpOwotCQkJCS8vIH0KLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gcmVzZXQgdGhlIG5vdGlmaWNhdGlvbi4KLQkJCQltb2RlbC5lU2V0RGVsaXZlcihub3RpZmljYXRpb24pOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmICh0YXJnZXRQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJLnJlc2V0RWRpdG9yKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHRhcmdldFBhcnQpOwotCQkJCX0KLQkJCQkvLyBkaWFncmFtLmVSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCBjb3B5RGlhZ3JhbShFZGl0aW5nRG9tYWluIGRvbWFpbiwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCWxpc3QuYWRkKGRpYWdyYW0pOwotCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCBjbWQgPSBDb3B5Q29tbWFuZC5jcmVhdGUoZG9tYWluLCBsaXN0KTsKLQkJY21kLmV4ZWN1dGUoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbWQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0vLwkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0vLwkJCQlyZXR1cm4gKERpYWdyYW0pIGVsZW1lbnQ7Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBjbWQ7Ci0JCS8vcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsKLQkJaWYodGFyZ2V0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0OwotCQkJRGlhZ3JhbUVkaXRQYXJ0IHBhcnQgPSBlZGl0b3IuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9BY3Rpdml0eURpYWdyYW1BZGFwdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9BY3Rpdml0eURpYWdyYW1BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMmYyODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQWN0aXZpdHlEaWFncmFtQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgZXh0ZW5kcyBEaWFncmFtQWRhcHRlciB7Ci0JCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlzdXBlcih3cmFwcGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKEFjdGl2aXR5IGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQkJCUFjdGl2aXR5Tm9kZSBiYXNlTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBiYXNlKTsKLQkJCQlpZiAoYmFzZU5vZGUgPT0gbnVsbCkgewotCQkJCQliYXNlTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBhY3QpOwotCQkJCX0KLQkJCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgYmFzZQotCQkJCQkvLwotCQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihiYXNlTm9kZSk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gYXNzb2NpYXRlIGJhc2Ugbm9kZSB3aXRoIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlub2RlQWRhcHRlciA9IGNyZWF0ZU5vZGVBZGFwdGVyKGFjdCk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQkJCQliYXNlTm9kZS5lQWRhcHRlcnMoKS5hZGQobm9kZUFkYXB0ZXIpOwotCQkJCQkJbm9kZUFkYXB0ZXIudXBkYXRlVmlldygpOwotLy8JCQkJCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZShiYXNlTm9kZSwgYWN0KTsKLQkJCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQobm9kZUFkYXB0ZXIuZ2V0VmlldygpKSl7Ci0JCQkJCQkJCUJyaWRnZUhlbHBlci51bm1hcmtJbkhlcml0ZWQobm9kZUFkYXB0ZXIuZ2V0VmlldygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbm9kZUFkYXB0ZXIuc2V0VGFyZ2V0UmVhZE9ubHkoZmFsc2UpOwotLy8JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuYWRkTm9kZShub2Rlcywgb2JqKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5vZGVBZGFwdGVyIGNyZWF0ZU5vZGVBZGFwdGVyKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIEFjdGl2aXR5Tm9kZSBhZGRlZE5vZGUpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoYWRkZWROb2RlKTsKLQkJaWYoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gdHJhbnNsYXRlIEFjdGl2aXR5Tm9kZSBpbmRleCB0byBBY3Rpdml0eSBpbmRleAotCQkvLwotCQlpbnQgaSA9IHRvQWN0aXZpdHlJbmRleChwb3NpdGlvbik7Ci0KLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoYWRkZWROb2RlKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgYWN0LCBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsIGUsIGkpOwotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKGFkZGVkTm9kZSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJc3VwZXIuYWRkVG9VbWFNb2RlbChwb3NpdGlvbiwgYWRkZWROb2RlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgdG9BY3Rpdml0eUluZGV4KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gaW5kZXg7Ci0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCWludCBpID0gaW5kZXggKyAxOwotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWZvciAoOyAhKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgJiYgaSA8IHNpemU7IGkrKykgewotCQkJbm9kZSA9IChBY3Rpdml0eU5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQl9Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQlyZXR1cm4gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXIjbmV3Tm9kZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBuZXdOb2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSApIHsKLQkJCW5vZGUgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJbm9kZSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlub2RlID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9Ci0JCWlmKG5vZGUgIT0gbnVsbCkgewotCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZShub2RlLCBlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoQWN0aXZpdHlFZGdlIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBsaW5rLmdldFRhcmdldCgpID09IG51bGwKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFNvdXJjZSgpKQotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdvcmtPcmRlcihXb3JrT3JkZXIgd28sIE9iamVjdCBwcmVkKSB7Ci0JCWlmICh3by5nZXRQcmVkKCkgPT0gcHJlZCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAocHJlZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHByZWQ7Ci0JCQkvLyBjaGVjayBpZiBwcmVkZWNlc3NvciByZWZlcmVuY2UgaW4gdGhlIGdpdmVuIHdvcmsgb3JkZXIgaXMgYmFzZSBvZgotCQkJLy8gcHJlZAotCQkJLy8KLQkJCWZvciAoVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgdmUgIT0gbnVsbDsgdmUgPSB2ZQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJaWYgKHZlID09IHdvLmdldFByZWQoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiBOb2RlIHNyYyBjYW4gcmVhY2ggTm9kZSB0YXJnZXQgYXMgdGhlIGZpcnN0IEFjdGl2aXR5Tm9kZSBpbiB0aGUKLQkgKiBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHByZWROb2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUoQWN0aXZpdHlOb2RlIHByZWROb2RlLCBBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkTm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSA9PSBub2RlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlCi0JCQkJCSYmIGNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShsaW5rLmdldFRhcmdldCgpLCBub2RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpbmtzKExpc3Q8QWN0aXZpdHlOb2RlPiBzZWxlY3RlZE5vZGVzKSB7Ci0JCWlmKHNlbGVjdGVkTm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLnBvcHVsYXRlTGlua3Moc2VsZWN0ZWROb2Rlcyk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBpbnZhbGlkIGxpbmtzCi0JCS8vCi0JCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSBudWxsOwotCQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJCWlmICgobWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbWU7Ci0JCQl9Ci0JCQlBcnJheUxpc3Q8QWN0aXZpdHlFZGdlPiBsaW5rc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eUVkZ2U+KCk7Ci0JCQlsaW5rTGlzdFdhbGs6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlCi0JCQkJCS5nZXRJbmNvbWluZ3MoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQotCQkJCWlmICh3YmUgIT0gbnVsbCkgewotCQkJCQkvLyBUT0RPOiBuZWVkIHJldmlzaXQgdG8gY2hlY2sgdGhlIHZhbGlkIGNvbm5lY3Rpb24gZnJvbSBhCi0JCQkJCS8vIEZvcmtOb2RlIG9yIEpvaW5Ob2RlCi0JCQkJCS8vCi0JCQkJCQotCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsICYmIGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDb250cm9sTm9kZSkKLQkJCQkJCWNvbnRpbnVlIGxpbmtMaXN0V2FsazsKLQotCQkJCQlPYmplY3QgcHJlZCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCQlib29sZWFuIHdvcmtPcmRlckZvdW5kID0gZmFsc2U7Ci0JCQkJCWZpbmRfV29ya09yZGVyOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHdiZQotCQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJaWYgKGlzVmFsaWRXb3JrT3JkZXIod28sIHByZWQpKSB7Ci0JCQkJCQkJd29ya09yZGVyRm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfV29ya09yZGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghd29ya09yZGVyRm91bmQpIHsKLQkJCQkJCS8vIGludmFsaWQgbGluaywgcmVtb3ZlIGl0Ci0JCQkJCQkvLwotCQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoQWN0aXZpdHlFZGdlIGxpbmsgOiBsaW5rc1RvUmVtb3ZlKSB7Ci0JCQkJQnJpZGdlSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldE91dGdvaW5ncygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmtzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlCcmlkZ2VIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJCX0KLQkJCWxpbmtzVG9SZW1vdmUuY2xlYXIoKTsKLQkJCWxpbmtzVG9SZW1vdmUgPSBudWxsOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGxpbmtzIG9mIGVhY2ggQWN0aXZpdHlOb2RlCi0JCS8vIHNldCB0aGUgV29ya09yZGVyIHRvIHRoZSBsaW5rIGlmIG5lZWRlZAotCQkvLyBhZGQgbmV3IGxpbmsgZm9yIHRob3NlIFdvcmtPcmRlcnMgdGhhdCBzdGlsbCBkb24ndCBoYXZlIHRoZQotCQkvLyBjb3JyZXNwb25kaW5nIGxpbmsKLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkKLQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IHNlbGVjdGVkTm9kZXMpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZTsKLQkJCWlmICgoZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJCQkvLyBHZXQgdGhlIHJhdyBkYXRhIG9mIHdvcmtvcmRlcnMgZm9yIG9iamVjdC4KLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBsb2NhbCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCQlsaXN0LmFkZEFsbChsb2NhbC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpKTsKLQkJCQkKLQkJCQkvLyBHZXQgdGhlIFByZWRlY2Vzc29yIExpc3Qgb24gdG9wIG9mIHJhdyBkYXRhLCB0aGlzIGlzIG5lZWQgZm9yIGluIGNhc2Ugb2YgZXh0ZW5kLgotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkJLmFkYXB0KGxvY2FsLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJCQlsaXN0LmFkZEFsbCgoKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXRQcmVkZWNlc3NvcnMoKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIEl0ZXJhdGUgd29yayBvcmRlcnMgYW5kIGNyZWF0ZSBsaW5rcy4KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBudWxsOwotCQkJCQlCcmVha2Rvd25FbGVtZW50IHByZWQgPSBudWxsOwotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgV29ya09yZGVyKXsKLQkJCQkJCXdvcmtPcmRlciA9IChXb3JrT3JkZXIpbmV4dDsKLQkJCQkJCXByZWQgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCQl9Ci0JCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlwcmVkID0gKEJyZWFrZG93bkVsZW1lbnQpKChXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciluZXh0KS5nZXRUYXJnZXQoKTsgCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChwcmVkICE9IG51bGwgJiYgcHJlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlBY3Rpdml0eU5vZGUgcHJlZE5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLAotCQkJCQkJCQlwcmVkLCB0cnVlKTsKLQkJCQkJCWlmIChwcmVkTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBsaW5rIGZvciB0aGlzIHdvcmsgb3JkZXIKLQkJCQkJCQkvLyBhbHJlYWR5Ci0JCQkJCQkJLy8KLQkJCQkJCQlib29sZWFuIGxpbmtGb3VuZCA9IGZhbHNlOwotCQkJCQkJCWZpbmRfbGluazogZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBub2RlCi0JCQkJCQkJCQkuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpID09IHByZWROb2RlKSB7Ci0JCQkJCQkJCQkvLyBsaW5rIGFscmVhZHkgZXhpc3RzCi0JCQkJCQkJCQkvLyBjaGVjayBpZiB3b3JrIG9yZGVyIGlzIHNldCB0byB0aGlzIGxpbmsKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlsaW5rRm91bmQgPSB0cnVlOwotLy8JCQkJCQkJCQlNZXRob2RFbGVtZW50IG1lID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobGluayk7Ci0JCQkJCQkJCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJQnJpZGdlSGVscGVyLnNldFNlbWFudGljTW9kZWwoCi0JCQkJCQkJCQkJCQlsaW5rLCB3b3JrT3JkZXIpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWsgZmluZF9saW5rOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghbGlua0ZvdW5kKSB7Ci0JCQkJCQkJCS8vIGNoZWNrIGlmIHRoaXMgV29ya09yZGVyIGNhbiBiZSByZXByZXNlbnRlZAotCQkJCQkJCQkvLyB2aWEgbGlua3Mgb2YgVHlwZWROb2RlcwotCQkJCQkJCQkvLwotCQkJCQkJCQlpZiAoIWNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShwcmVkTm9kZSwgbm9kZSkpIHsKLQkJCQkJCQkJCS8vIGFkZCBuZXcgbGluayBmb3IgdGhpcyB3b3JrIG9yZGVyCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJCQkJCQlOb2RlQWRhcHRlciBwcmVkTm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIocHJlZE5vZGUpOwotCQkJCQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCAmJiBwcmVkTm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCQkJCQlib29sZWFuIHByZWROb2RlTm90aWZ5ID0gcHJlZE5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCQkJCQlwcmVkTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCQkJCQlub2RlQWRhcHRlci5hZGRJbmNvbWluZ0Nvbm5lY3Rpb24ocHJlZCk7IAotCQkJCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJCQkJCQkJCXByZWROb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZE5vZGVOb3RpZnk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNsZWFuRHVwbGljYXRlTGlua3Moc2VsZWN0ZWROb2Rlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFuRHVwbGljYXRlTGlua3MoTGlzdDxBY3Rpdml0eU5vZGU+IHNlbGVjdGVkTm9kZXMpIHsKLQkJTGlzdDxBY3Rpdml0eUVkZ2U+IGR1cGxpY2F0ZUxpbmtzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eUVkZ2U+KCk7Ci0JCWZvciAoQWN0aXZpdHlOb2RlIHdiTm9kZSA6IHNlbGVjdGVkTm9kZXMpIHsKLQkJCWlmKHdiTm9kZS5nZXRJbmNvbWluZ3MoKSAhPSBudWxsKXsKLQkJCQlmaW5kRHVwbGljYXRlTGlua3MoZHVwbGljYXRlTGlua3MsIHdiTm9kZS5nZXRJbmNvbWluZ3MoKSk7Ci0JCQl9Ci0JCQlpZih3Yk5vZGUuZ2V0T3V0Z29pbmdzKCkgIT1udWxsKXsKLQkJCQlmaW5kRHVwbGljYXRlTGlua3MoZHVwbGljYXRlTGlua3MsIHdiTm9kZS5nZXRPdXRnb2luZ3MoKSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChBY3Rpdml0eUVkZ2UgbGluayA6IGR1cGxpY2F0ZUxpbmtzKSB7Ci0JCQlCcmlkZ2VIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJfQotCQlkdXBsaWNhdGVMaW5rcy5jbGVhcigpOwotCQlkdXBsaWNhdGVMaW5rcyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmREdXBsaWNhdGVMaW5rcyhMaXN0IGR1cGxpY2F0ZUxpbmtzLCBMaXN0IGxpbmtzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgbGlua3MuZ2V0KGkpOwotCQkJaWYoIWR1cGxpY2F0ZUxpbmtzLmNvbnRhaW5zKGxpbmspKXsKLQkJCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBsaW5rcy5zaXplKCk7IGorKykgewotCQkJCQlBY3Rpdml0eUVkZ2UgbGluazEgPSAoQWN0aXZpdHlFZGdlKSBsaW5rcy5nZXQoaik7Ci0JCQkJCWlmIChsaW5rMS5nZXRTb3VyY2UoKSA9PSBsaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgbGluazEuZ2V0VGFyZ2V0KCkgPT0gbGluay5nZXRUYXJnZXQoKSkgewotCQkJCQkJZHVwbGljYXRlTGlua3MuYWRkKGxpbmsxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHBvcHVsYXRlTm9kZXMoKSB7Ci0JCUhhc2hTZXQgc2VsZWN0ZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCi0JCS8vIGFzc29jaWF0ZSBjb250cm9sIG5vZGVzCi0JCS8vCi0JCXNlbGVjdGVkTm9kZXMuYWRkQWxsKGFzc29jaWF0ZUNvbnRyb2xOb2RlcyhjaGlsZHJlbikpOwotCQkKLQkJLy8gYWRkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMKLQkJLy8KLQkJc2VsZWN0ZWROb2Rlcy5hZGRBbGwoYWRkRWxlbWVudE5vZGVzKGNoaWxkcmVuKSk7Ci0JCQotCQlyZXR1cm4gc2VsZWN0ZWROb2RlczsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGFzc29jaWF0ZUNvbnRyb2xOb2RlcyhDb2xsZWN0aW9uIG1ldGhvZEVsZW1lbnRzKSB7Ci0JCUxpc3QgY3RybE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLS8vCQkJCS8vIHNlbGVjdCB0aGlzIGNvbnRyb2wgbm9kZSBmb3IgdGhlIGRpYWdyYW0gb25seSBpZiBpdCBoYXMgYSB0YXJnZXQgbm9kZSBvciBzb3VyY2Ugbm9kZSwKLS8vCQkJCS8vIGRpcmVjdCBvciBpbmRpcmVjdCwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkCi0vLwkJCQkvLyBtZXRob2QgZWxlbWVudCBjb2xsZWN0aW9uCi0vLwkJCQkvLwotLy8JCQkJQ29sbGVjdGlvbiBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCUJyaWRnZUhlbHBlci5nZXRUYXJnZXROb2RlcyhhY3ROb2Rlcywgbm9kZSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotLy8JCQkJQnJpZGdlSGVscGVyLmdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLCBub2RlLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0vLwkJCQlpZighYWN0Tm9kZXMuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlBY3Rpdml0eU5vZGUgZWxlbWVudE5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0vLwkJCQkJCWlmKG1ldGhvZEVsZW1lbnRzLmNvbnRhaW5zKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGVsZW1lbnROb2RlKSkpIHsKLS8vCQkJCQkJCWlmKGFkZE5vZGVBZGFwdGVyVG8obm9kZSkgIT0gbnVsbCkgewotLy8JCQkJCQkJCWN0cmxOb2Rlcy5hZGQobm9kZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJaWYoYWRkTm9kZUFkYXB0ZXJUbyhub2RlKSAhPSBudWxsKSB7Ci0JCQkJCWN0cmxOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjdHJsTm9kZXM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBlbGVtZW50IG5vZGVzIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZCBlbGVtZW50cyBpZiB0aGV5IGRvbid0IGV4aXN0IHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIExpc3QgYWRkRWxlbWVudE5vZGVzKENvbGxlY3Rpb24gbWV0aG9kRWxlbWVudHMpIHsJCi0JCUFycmF5TGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IG5ld05vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLCBjaGlsZCk7Ci0JCQkJaWYobm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5vZGUgPSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIGNoaWxkKTsKLQkJCQkJbmV3Tm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc3luY2hyb25pemUgbmFtZSB3aXRoIGxpbmtlZCBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCVN0cmluZyBuYW1lID0gQnJpZGdlSGVscGVyLmdldE5vZGVOYW1lKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJCWlmKCFuYW1lLmVxdWFscyhub2RlLmdldE5hbWUoKSkpIHsKLQkJCQkJCW5vZGUuc2V0TmFtZShuYW1lKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYWRkTm9kZUFkYXB0ZXJUbyhub2RlKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgIWlzVGFyZ2V0UmVhZE9ubHkoKSkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZSk7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJCQlub2RlQWRhcHRlci53cmFwcGVyID0gd3JhcHBlcjsKLQkJCQkJCS8vIHJlYWRPbmx5IGF0dHJpYnV0ZSBpcyBzdGlsbCBuZWVkZWQKLQkJCQkJCS8vIGFmdGVyIGludHJvZHVjdGlvbiBvZiB3cmFwcGVyLiAKLQkJCQkJCS8vIEZvciBleGFtcGxlLCB3ZSBjYW4gaGF2ZSBhIG5vZGUgYWRhcHRlciBmb3IgYSByZWFkLW9ubHkgYmFzZSBhY3Rpdml0eQotCQkJCQkJLy8gd2l0aG91dCBzdXBwbHlpbmcgd3JhcHBlciBmb3IgdGhpcyBiYXNlIGFjdGl2aXR5LgotCQkJCQkJLy8KLQkJCQkJCW5vZGVBZGFwdGVyLmJhc2ljU2V0VGFyZ2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobmV3Tm9kZXMpOwkJCi0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlZCBjb2RlIGZyb20gZ2V0Q2hpbGRyZW4uIGdldEFkYXB0ZXIoKSB3aWxsIHJldHVybiBBZGFwdGVyLAotCSAqIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gZmluZCBpdGVtcHJvdmlkZXIgZm9yIHRoZSBjaGlsZHJlbi4gCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGdldEFkYXB0ZXIoKXsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gd3JhcHBlcjsKLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQlnZXRFbGVtZW50KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkKLQkJCS8vVHVybiBvZmYgdGhlIFZhcmlhYmlsaXR5SW5mbyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW0uCi0JCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWJvb2xlYW4gZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gZmFsc2U7Ci0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQlvYmogPSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXREZWxlZ2F0aW5nSXRlbVByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJb2JqID0gYWRhcHRlcjsKLQkJCX0KLQkJCQotCQkJaWYob2JqIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuaXNFbmFibGVWYXJpYWJpbGl0eUluZm8oKTsKLQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpb2JqKS5zZXRFbmFibGVWYXJpYWJpbGl0eUluZm8oZmFsc2UpOwotCQkJfQotCQkJLy8gZW5kIG9mIHZhcmlhYmlsaXR5IGluZm8gCi0JCQkKLQkJCQotCQkJLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZ2V0T2JqZWN0KCkpOwotCQkJLy8gY29tbWVudGVkIGFib3ZlIGxpbmUsIEZvciBkaWFncmFtcyAtIHJvbGx1cCBzaG91bGQgYmUgZmFsc2UsIGZvcgotCQkJLy8gaGFuZGxpbmcgcm9sbHVwIHN0YXRlIGJlbG93IGNvZGUuCi0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZXh0cmFjdENoaWxkcmVuKGFkYXB0ZXIsIGdldEVsZW1lbnQoKSwgY2hpbGRyZW4pOwotCQkJCi0JCQkvLyByZXNldCB2YXJpYWJpbGl0eWluZm8gc3RhdHVzIGJhY2sKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLnNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhlbmFibGVWYXJpYWJpbGl0eUluZm8pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU5vZGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCQkJCi0JCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciB0aGUgb2xkIGFjdGl2aXR5IGFuZCByZWxpbmsgaXQgdG8gaXRzCi0JCQkJLy8gYmFzZQotCQkJCS8vCi0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkJCQlpZihub2RlID09IG51bGwpIHsKLQkJCQkJbm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBiYXNlKTsKLQkJCQl9Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgb2xkIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIGFzc29jaWF0ZSBub2RlIHdpdGggdGhlIGJhc2UgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihiYXNlKTsKLQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKG5vZGVBZGFwdGVyKTsKLQkJCQkJCW5vZGVBZGFwdGVyLmJhc2ljU2V0VGFyZ2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQlub2RlLmVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCQkJCQlub2RlQWRhcHRlci51cGRhdGVWaWV3KCk7Ci0JCQkJCQlpZighQnJpZGdlSGVscGVyLmlzSW5oZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSkpewotCQkJCQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5yZW1vdmVOb2RlKG9iaik7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGVBZGFwdGVyIGFkZE5vZGVBZGFwdGVyVG8oQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJaWYoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJfQotCQlpZihub2RlIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLQkJCWFkYXB0ZXIgPSBuZXcgQ29udHJvbE5vZGVBZGFwdGVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsKLQkJCWlmKGUgPT0gbnVsbCkgewotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpbm9kZSk7Ci0JCQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFLmVxdWFscyh0eXBlKSkgewotCQkJCQkJZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoQnJpZGdlSGVscGVyLlVNQV9JVEVSQVRJT04uZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCQllID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmKG5vZGUgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0VHlwZSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKW5vZGUpOwotCQkJCQlpZihCcmlkZ2VIZWxwZXIuVU1BX01JTEVTVE9ORS5lcXVhbHModHlwZSkpIHsKLQkJCQkJCWUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlciA9IG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKGUpOwotCQkJfQotCQl9Ci0JCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJbm9kZS5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBBY3Rpdml0eU5vZGUgcmVhc3NvY2lhdGVCYXNlTm9kZShBY3Rpdml0eSBhY3QpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlIGFjdGl2aXR5Ci0JCQkvLwotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCUFjdGl2aXR5Tm9kZSBiYXNlTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBiYXNlKTsKLQkJCWlmIChiYXNlTm9kZSA9PSBudWxsKSB7Ci0JCQkJYmFzZU5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkJCX0KLQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIGJhc2UKLQkJCQkvLwotCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGJhc2VOb2RlKTsKLQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCW5vZGVBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gYXNzb2NpYXRlIGJhc2Ugbm9kZSB3aXRoIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihhY3QpOwotCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKG5vZGVBZGFwdGVyKTsKLQkJCQkJYmFzZU5vZGUuZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJCQkJbm9kZUFkYXB0ZXIudXBkYXRlVmlldygpOwotLy8JCQkJCWlmKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdCkpIHsKLQkJCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoYmFzZU5vZGUsIGFjdCk7Ci0JCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQobm9kZUFkYXB0ZXIuZ2V0VmlldygpKSl7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLnVubWFya0luSGVyaXRlZChub2RlQWRhcHRlci5nZXRWaWV3KCkpOwotCQkJCQkJfQotCQkJCQkJbm9kZUFkYXB0ZXIuc2V0VGFyZ2V0UmVhZE9ubHkoZmFsc2UpOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGJhc2VOb2RlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZShPYmplY3Qgb2xkRWxlbWVudCwgT2JqZWN0IG5ld0VsZW1lbnQpIHsKLQkJaWYobmV3RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3Igb2xkIGVsZW1lbnQgYW5kIGxpbmsgaXQgdG8gdGhlIG5ldyBlbGVtZW50Ci0JCQkvLwotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCUFjdGl2aXR5Tm9kZSBvbGROb2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGRpYWdyYW0sIG9sZEVsZW1lbnQpOwotCQkJaWYgKG9sZE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBvbGQgZWxlbWVudAotCQkJCS8vCi0JCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIob2xkTm9kZSk7Ci0JCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJfQotCi0JCQkJLy8gYXNzb2NpYXRlIGJhc2Ugbm9kZSB3aXRoIHRoZSBuZXcgZWxlbWVudAotCQkJCS8vCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG5ld0VsZW1lbnQ7Ci0JCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihlKTsKLQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQkJCW9sZE5vZGUuZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJCQkJbm9kZUFkYXB0ZXIudXBkYXRlVmlldygpOwotCQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKG9sZE5vZGUsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0JyaWRnZUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQnJpZGdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTNlNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQnJpZGdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJyaWRnZUhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfRUxFTUVOVCA9ICJ1bWFfZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX1BIQVNFID0gIlBoYXNlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9JVEVSQVRJT04gPSAiSXRlcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9BQ1RJVklUWSA9ICJBY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfVEFTS19ERVNDUklQVE9SID0gIlRhc2siOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX01JTEVTVE9ORSA9ICJNaWxlc3RvbmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9JTkhFUklSRUQgPSAiaW5oZXJpdGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxJRWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgRUNsYXNzPiB0eXBlU3RyaW5nVG9FQ2xhc3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVDbGFzcz4oKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0Jc3RhdGljIHsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfUEhBU0UsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEhBU0UpOwotCQl0eXBlU3RyaW5nVG9FQ2xhc3MucHV0KFVNQV9JVEVSQVRJT04sIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSVRFUkFUSU9OKTsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfQUNUSVZJVFksIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFkpOwotCQl0eXBlU3RyaW5nVG9FQ2xhc3MucHV0KFVNQV9UQVNLX0RFU0NSSVBUT1IsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SKTsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfTUlMRVNUT05FLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1JTEVTVE9ORSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZW1hbnRpY01vZGVsKEFjdGl2aXR5RWRnZSBsaW5rLCBXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkT25seShWaWV3IHZpZXcpIHsKLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkuZ2V0Tm9kZUFkYXB0ZXIodmlldy5nZXRFbGVtZW50KCkpOwotCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZUFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpOwotCQl9Ci0JCWlmKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuICgoTm9kZSl2aWV3LmdldEVsZW1lbnQoKSkuaXNSZWFkT25seSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhlIGdpdmVuIHZpZXcgcmVwcmVzZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbWV0aG9kIGVsZW1lbnQgdGhhdCB0aGUgdmlldyBpcyByZXByZXNlbnRpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIHRoZSB2aWV3IGRvZXMgbm90IHJlcHJlc2VudCBhbnkgbWV0aG9kIGVsZW1lbnQgb3IgdGhlIGRpYWdyYW0KLQkgKiAgICAgICAgIG9mIHRoZSB2aWV3IGN1cnJlbnRseSBpcyBub3Qgb3BlbmVkIGluIGEgZGlhZ3JhbSBlZGl0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoVmlldyB2aWV3KSB7Ci0JCXJldHVybiBnZXRNZXRob2RFbGVtZW50KHZpZXcuZ2V0RWxlbWVudCgpKTsKLQl9CQotCQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhlIGdpdmVuIGRpYWdyYW0gbW9kZWwgb2JqZWN0IHJlcHJlc2VudHMuCi0JICogCi0JICogQHBhcmFtIG1vZGVsT2JqZWN0Ci0JICogQHJldHVybiBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBtb2RlbCBvYmplY3QgaXMgcmVwcmVzZW50aW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGUgbW9kZWwgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhbnkgbWV0aG9kIGVsZW1lbnQgb3IgdGhlIGRpYWdyYW0KLQkgKiAgICAgICAgIG9mIHRoZSBtb2RlbCBvYmplY3QgY3VycmVudGx5IGlzIG5vdCBvcGVuZWQgaW4gYSBkaWFncmFtIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChFT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCWlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChMaW5rZWRPYmplY3QpbW9kZWxPYmplY3QpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIGlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpIG1vZGVsT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoVmlldyB2aWV3LCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IG93bmVyKSB7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJaWYobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCXJldHVybiAoKExpbmtlZE9iamVjdCltb2RlbE9iamVjdCkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQl9Ci0JCWVsc2UgaWYobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG93bmVyLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKChFTW9kZWxFbGVtZW50KSBtb2RlbE9iamVjdCwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoVmlldyB2aWV3KSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQlyZXR1cm4gKChOYW1lZE5vZGUpZWxlbWVudCkuaXNTdXBwcmVzc2VkKCk7Ci0JCX0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBnZXROb2RlQWRhcHRlcihlbGVtZW50KTsKLQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgbyA9IG5vZGVBZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCQlpZihvID09IG51bGwpIHsKLQkJCQkJbyA9IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSBhY3Rpdml0eSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50KHZpZXcuZ2V0RGlhZ3JhbSgpKTsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJcmV0dXJuIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotLy8JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VtYW50aWNNb2RlbChWaWV3IHZpZXcpIHsKLS8vCQlFT2JqZWN0IGVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLS8vCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotLy8JCQlyZXR1cm4gZ2V0U2VtYW50aWNNb2RlbEZyb21Bbm5vdGF0aW9uKGVsZW1lbnQsIHByb2Nlc3MsIGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQl9Ci0vLwkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgKQotLy8JCQkKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxpbmsoQWN0aXZpdHlFZGdlIGxpbmspIHsKLQkJLy8gVE9ETzogc3RpbGwgbmVlZCB0byBkaXNhYmxlIG5vdGlmaWNhdGlvbiBiZWZvcmUgcmVtb3ZpbmcgbGluaz8/PwotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IGxpbmsuZ2V0QWN0aXZpdHkoKTsKLQkJQWN0aXZpdHlOb2RlIHNvdXJjZU5vZGUgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0Tm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCWJvb2xlYW4gc3JjTm90aWZ5ID0gc291cmNlTm9kZSAhPSBudWxsID8gc291cmNlTm9kZS5lRGVsaXZlcigpIDogZmFsc2U7Ci0JCWJvb2xlYW4gdGFyZ2V0Tm90aWZ5ID0gdGFyZ2V0Tm9kZSAhPSBudWxsID8gdGFyZ2V0Tm9kZS5lRGVsaXZlcigpCi0JCQkJOiBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWlmICh0YXJnZXROb2RlICE9IG51bGwpIHsKLQkJCQl0YXJnZXROb2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQlpZihhY3Rpdml0eSAhPSBudWxsKXsKLQkJCQlhY3Rpdml0eS5nZXRFZGdlcygpLnJlbW92ZShsaW5rKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKHNyY05vdGlmeSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Tm9kZS5lU2V0RGVsaXZlcih0YXJnZXROb3RpZnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IG9yIG9uZSBvZiBpdHMgYmFzZSBpcyB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eU5vZGUgZmluZE5vZGUoQWN0aXZpdHkgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0LAotCQkJYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQlpZiAob2JqZWN0ID09IGUpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0gZWxzZSBpZiAoY2hlY2tCYXNlICYmIGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgdmUgIT0gbnVsbDsgdmUgPSB2ZQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlpZiAodmUgPT0gb2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jaEJhcihBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEZvcmtOb2RlIHx8IG5vZGUgaW5zdGFuY2VvZiBKb2luTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBub2RlIHdob3NlIGxpbmtlZCBvYmplY3QgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5Tm9kZSBmaW5kTm9kZShBY3Rpdml0eSBjb250YWluZXIsIE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGdldFByb3h5VVJJKE1ldGhvZEVsZW1lbnQgZSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2UpIHJlc291cmNlKS5nZXRQcm94eVVSSShlKTsKLQkJfSBlbHNlIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2UuZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQoZS5nZXRHdWlkKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBBc3NvY2lhdGVzIGEge0BsaW5rIEVNb2RlbEVsZW1lbnR9IHdpdGggYSB7QGxpbmsgTWV0aG9kRWxlbWVudH0gYnkKLQkgKiBjcmVhdGluZyBvciB1cGRhdGluZyB0aGUgVU1BX0VMRU1FTlQgYW5ub3RhdGlvbiBvZiB0aGUgZ2l2ZW4KLQkgKiB7QGxpbmsgRU1vZGVsRWxlbWVudH0uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogQHNlZSAjYWRkRUFubm90YXRpb24oRU1vZGVsRWxlbWVudCwgTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXNzb2NpYXRlKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBtZSkgewotCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWRkRUFubm90YXRpb24oZWxlbWVudCwgbWUpOwotCQlpZihhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0VHlwZShtZSk7Ci0JCQlpZih0eXBlICE9IG51bGwpIHsKLQkJCQlhbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoVU1BX1RZUEUsIHR5cGUpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVDbGFzcyBnZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiB0eXBlU3RyaW5nVG9FQ2xhc3MuZ2V0KHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYobWUgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcmV0dXJuIFVNQV9QSEFTRTsKLQkJfQotCQllbHNlIGlmKG1lIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gVU1BX0lURVJBVElPTjsKLQkJfQotCQllbHNlIGlmKG1lIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gVU1BX01JTEVTVE9ORTsKLQkJfQotCQllbHNlIGlmKG1lIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkgewotCQkJcmV0dXJuIFVNQV9BQ1RJVklUWTsKLQkJfQotCQllbHNlIGlmKG1lIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBVTUFfVEFTS19ERVNDUklQVE9SOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLS8vCS8qKgotLy8JICogQ3JlYXRlcyBvciB1cGRhdGVzIHRoZSBVTUFfRUxFTUVOVCBhbm5vdGF0aW9uIGZvciB0aGUgZ2l2ZW4KLS8vCSAqIHtAbGluayBFTW9kZWxFbGVtZW50fSB3aXRoIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBvciBpdHMgd3JhcHBlcgotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogQHBhcmFtIG1lCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgRUFubm90YXRpb24gYWRkRUFubm90YXRpb24oRU1vZGVsRWxlbWVudCBlbGVtZW50LCBPYmplY3QgYnJlYWtkb3duRWxlbWVudE9yV3JhcHBlcikgewotLy8JCVN0cmluZyB1cmlTdHIgPSBudWxsOwotLy8JCWlmKGJyZWFrZG93bkVsZW1lbnRPcldyYXBwZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0vLwkJCVVSSSB1cmkgPSBnZXRQcm94eVVSSSgoTWV0aG9kRWxlbWVudCkgYnJlYWtkb3duRWxlbWVudE9yV3JhcHBlcik7Ci0vLwkJCWlmKHVyaSAhPSBudWxsKSB7Ci0vLwkJCQl1cmlTdHIgPSB1cmkudG9TdHJpbmcoKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIGlmKGJyZWFrZG93bkVsZW1lbnRPcldyYXBwZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0vLwkJCXVyaVN0ciA9IFN1cHByZXNzaW9uLmdldFBhdGgoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBicmVha2Rvd25FbGVtZW50T3JXcmFwcGVyKTsKLS8vCQl9Ci0vLwkJaWYodXJpU3RyICE9IG51bGwpIHsKLS8vCQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLS8vCQkJaWYgKGVBbm5vdGF0aW9uID09IG51bGwpIHsKLS8vCQkJCWVBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQW5ub3RhdGlvbigpOwotLy8JCQkJZUFubm90YXRpb24uc2V0U291cmNlKFVNQV9FTEVNRU5UKTsKLS8vCQkJCWVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCkuYWRkKGVBbm5vdGF0aW9uKTsKLS8vCQkJfQotLy8JCQllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9VUkksIHVyaVN0cik7Ci0vLwkJCXJldHVybiBlQW5ub3RhdGlvbjsKLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBvciB1cGRhdGVzIHRoZSBVTUFfRUxFTUVOVCBhbm5vdGF0aW9uIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QGxpbmsgRU1vZGVsRWxlbWVudH0gd2l0aCB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBbm5vdGF0aW9uIGFkZEVBbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJVVJJIHVyaSA9IGdldFByb3h5VVJJKG1lKTsKLQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOwotCQkJaWYgKGVBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQllQW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCQllQW5ub3RhdGlvbi5zZXRTb3VyY2UoVU1BX0VMRU1FTlQpOwotCQkJCWVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCkuYWRkKGVBbm5vdGF0aW9uKTsKLQkJCX0KLQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoVU1BX1VSSSwgdXJpLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIGVBbm5vdGF0aW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KEVNb2RlbEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IG8gPSBlOwotCQlmb3IoOyBvICE9IG51bGwgJiYgIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpOyBvID0gby5lQ29udGFpbmVyKCkpOwotCQlyZXR1cm4gKEFjdGl2aXR5KSBvOwotCX0KLQkKLS8vCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbWFudGljTW9kZWxGcm9tQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IG1vZGVsLCBQcm9jZXNzIHByb2Nlc3MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0vLwkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBtb2RlbC5nZXRFQW5ub3RhdGlvbihVTUFfRUxFTUVOVCk7Ci0vLwkJaWYgKGVBbm5vdGF0aW9uICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIHVyaVN0ciA9IChTdHJpbmcpIGVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoVU1BX1VSSSk7Ci0vLwkJCWlmICh1cmlTdHIgIT0gbnVsbCkgewotLy8JCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyKTsKLS8vCQkJCWlmKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUuZXF1YWxzKHVyaS5zY2hlbWUoKSkpIHsKLS8vCQkJCQlFT2JqZWN0IG8gPSBwcm9jZXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIGZhbHNlKTsKLS8vCQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLS8vCQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSBvOwotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCS8vIFRPRE86IGxvZyBlcnJvcgotLy8JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vdCBhIG1ldGhvZCBlbGVtZW50OiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIHsKLS8vCQkJCQkvLyBtdXN0IGJlIGEgd3JhcHBlciBwYXRoCi0vLwkJCQkJLy8KLS8vCQkJCQlTdHJpbmdbXSBndWlkUGF0aCA9IHVyaS5zZWdtZW50cygpOwotLy8JCQkJCXJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jZXNzKS5nZXRPYmplY3RCeVBhdGgoZ3VpZFBhdGgsIGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQgbm9kZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsgCi0gICAgICAgIEVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gbm9kZS5nZXRFQW5ub3RhdGlvbihVTUFfRUxFTUVOVCk7IAotICAgICAgICB0cnkgeyAKLSAgICAgICAgICAgIGlmIChlQW5ub3RhdGlvbiAhPSBudWxsKSB7IAotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKSBlQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KFVNQV9VUkkpOyAKLSAgICAgICAgICAgICAgICBpZiAodXJpICE9IG51bGwpIHsgCi0gICAgICAgICAgICAgICAgICAgIEVPYmplY3QgbyA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZVVSSSh1cmkpLCBmYWxzZSk7IAotICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChNZXRob2RFbGVtZW50KSBvOyAKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcpIHsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk5vdCBhIG1ldGhvZCBlbGVtZW50OiAiICsgbyk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfSAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0gICAgICAgICAgICAgICAgRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOyAKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgCi0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsgCi0JfSAKLQkKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBnaXZlbiBkaWFncmFtIG1vZGVsIG9iamVjdCByZXByZXNlbnRzCi0JICogYW5kIHN0b3JlcyB0aGUgbGlua2FnZSBpbmZvIGluIGl0cyBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB0aGUgZGlhZ3JhbSBtb2RlbCBvYmplY3QKLQkgKiBAcmV0dXJuIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhlIG1vZGVsIG9iamVjdCBpcyByZXByZXNlbnRpbmcgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtb2RlbCBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGFueQotCSAqICAgICAgICAgbWV0aG9kIGVsZW1lbnQgb3IgdGhlIGRpYWdyYW0gb2YgdGhlIG1vZGVsIG9iamVjdCBjdXJyZW50bHkgaXMKLQkgKiAgICAgICAgIG5vdCBvcGVuZWQgaW4gYSBkaWFncmFtIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQgbm9kZSkgewkJCi0JCUFjdGl2aXR5IGRpYWdyYW0gPSBnZXRBY3Rpdml0eShub2RlKTsKLQkJaWYoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IGdldE5vZGVBZGFwdGVyKGRpYWdyYW0pOwotCQlpZihub2RlQWRhcHRlciA9PSBudWxsIHx8IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG5vZGUsIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChFTW9kZWxFbGVtZW50IG5vZGUpIHsKLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBub2RlQWRhcHRlciAhPSBudWxsID8gbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpCi0JCQkJOiBnZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24obm9kZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlQWRhcHRlciBnZXROb2RlQWRhcHRlcihFT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgTm9kZUFkYXB0ZXIpIHsKLQkJCQkJcmV0dXJuIChOb2RlQWRhcHRlcikgYWRhcHRlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUFkYXB0ZXIgZ2V0RGlhZ3JhbUFkYXB0ZXIoRU9iamVjdCBub2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBEaWFncmFtQWRhcHRlcikgewotCQkJCXJldHVybiAoRGlhZ3JhbUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGdldCB0aGUgc291cmNlcyBvZiBTeW5jQmFyIChGb3JrTm9kZSBvciBKb2luTm9kZSkgaW5Db21taW5nCi0JICogY29ubmVjdGlvbnMgYW5kIGlmIHN5bmNiYXIgaGF2ZSBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gZGVjaXNpb24gcG9pbnQsCi0JICogYW5kIGRlY2lzaW9uIHBvaW50IGhhdmUgaW5jb21taW5nIGNvbm5lY3Rpb25zICh3b3JrYnJlYWRkb3duIGVsZW10bnMpCi0JICogY29sbGVjdGlvbnMgd2lsbCBpZ25vcmUgYWxsIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gZGVjaXNpb24gcG9pbnQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTeW5jQmFyU291cmNlTm9kZXMoQWN0aXZpdHlOb2RlIG5vZGUsCi0JCQlDb2xsZWN0aW9uIGFjdE5vZGVzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAoZ2V0TWV0aG9kRWxlbWVudChzb3VyY2UpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoaXNTeW5jaEJhcihzb3VyY2UpKSB7Ci0JCQkJZ2V0U3luY0JhclNvdXJjZU5vZGVzKHNvdXJjZSwgYWN0Tm9kZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgbm9kZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSB0aGF0IGFyZSBkaXJlY3Qgb3IgaW5kaXJlY3QgdGFyZ2V0cyBvZgotCSAqIHRoZSBnaXZlbiBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBhY3ROb2RlcwotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUYXJnZXROb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBBY3Rpdml0eU5vZGUgbm9kZSwKLQkJCUNsYXNzIHR5cGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmICh0eXBlLmlzSW5zdGFuY2UoZ2V0TWV0aG9kRWxlbWVudCh0YXJnZXQpKSkgewotCQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQkJCWdldFRhcmdldE5vZGVzKGFjdE5vZGVzLCB0YXJnZXQsIHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3VjY2Vzc29yTm9kZXMoQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IGFjdE5vZGVzLCBBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEFjdGl2aXR5RWRnZSBsaW5rIDogbm9kZS5nZXRPdXRnb2luZ3MoKSkgewotCQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmIChnZXRNZXRob2RFbGVtZW50KHRhcmdldCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCQl9IGVsc2UgaWYgKGlzU3luY2hCYXIodGFyZ2V0KSkgewotCQkJCQlnZXRTdWNjZXNzb3JOb2RlcyhhY3ROb2RlcywgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UHJlZGVjZXNzb3JOb2RlcyhDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gYWN0Tm9kZXMsIEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWZvciAoQWN0aXZpdHlFZGdlIGxpbmsgOiBub2RlLmdldEluY29taW5ncygpKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKGdldE1ldGhvZEVsZW1lbnQoc291cmNlKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWFjdE5vZGVzLmFkZChzb3VyY2UpOwotCQkJCX0gZWxzZSBpZiAoaXNTeW5jaEJhcihzb3VyY2UpKSB7Ci0JCQkJCWdldFByZWRlY2Vzc29yTm9kZXMoYWN0Tm9kZXMsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhbGwgbm9kZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSB0aGF0IGFyZSBkaXJlY3Qgb3IgaW5kaXJlY3Qgc291cmNlcyBvZgotCSAqIHRoZSBnaXZlbiBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBhY3ROb2RlcwotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldwotCSAqLwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFNvdXJjZU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIEFjdGl2aXR5Tm9kZSBub2RlLAotCQkJQ2xhc3MgdHlwZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShnZXRNZXRob2RFbGVtZW50KHNvdXJjZSkpKSB7Ci0JCQkJCWFjdE5vZGVzLmFkZChzb3VyY2UpOwotCQkJCX0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLQkJCQkJZ2V0U291cmNlTm9kZXMoYWN0Tm9kZXMsIHNvdXJjZSwgdHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogTWV0aG9kIHRvIGNvbGxlY3Qgc3luY2hyb25pemF0aW9uIGJhciBvdXRnb2luZyBjb25uZWN0aW9uCi0JICogZXhjZXB0IGFueSBjb25uZWN0aW9uIGdvaW5nIHRvIGRlY2lzaW9uIHBvaW50cy4gIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoQWN0aXZpdHlOb2RlIHR5cGVkTm9kZSwgQ29sbGVjdGlvbiBhY3ROb2Rlcyl7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHRhcmdldCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJCWFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCQkJCX0gZWxzZSBpZiAoaXNTeW5jaEJhcih0YXJnZXQpKSB7Ci0JCQkJCWdldFN5bmNCYXJUYXJnZXROb2Rlcyh0YXJnZXQsIGFjdE5vZGVzKTsKLQkJCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHRvIGNoZWNrIGJlZm9yZSBkZWxldGluZyBhIGxpbmsuIElmIGR1cGxpY2F0ZSBwcmVkZWNlc3NvciBleGlzdHMKLQkgKiBpbiB0aGUgbGVnYWN5IGRhdGEsIGNoZWNrIGlmIGRlbGV0aW5nIGxpbmsgc2hvdWxkIHJlbW92ZSBhbGwgdGhlCi0JICogcHJlZGVjZXNzb3JzIG9yIG5vdCBieSB2ZXJpZnlpbmcgaWYgdGFyZ2V0IG9yIGluZGlyZWN0IHRhcmdldCBoYXZlIGRpcmVjdAotCSAqIG9yIGluZGlyZWN0IGxpbmtzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5SZW1vdmVBbGxQcmVkcyhBY3Rpdml0eUVkZ2UgbGluaywgQWN0aXZpdHlOb2RlIG9sZFNvdXJjZSwKLQkJCUFjdGl2aXR5Tm9kZSBvbGRUYXJnZXQpIHsKLQkJTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudChvbGRUYXJnZXQpOwotCQlpZiAodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlMaXN0IGlubGlzdCA9IG9sZFRhcmdldC5nZXRJbmNvbWluZ3MoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGlubGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgaW5jb21pbmdsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRvci5uZXh0KCk7Ci0JCQkJLy8gUkFUTEMwMDM4NDI0NSA6IFByZWRlY2Vzc29yIGNoYW5nZXMgc2hvdWxkIGJlIGRvbmUgb25seSBpbgotCQkJCS8vIGNhc2Ugb2YgU3luY2hyb25pemF0aW9uIEJhci4KLQkJCQlpZiAoaXNTeW5jaEJhcihpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkpKSB7Ci0JCQkJCUNvbGxlY3Rpb24gY29sID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJCQkJZ2V0U291cmNlTm9kZXMoY29sLCBpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCksCi0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCQkJCQlpZiAoY29sLmNvbnRhaW5zKG9sZFNvdXJjZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpICE9IG51bGwgJiYKLQkJCQkJCWdldE1ldGhvZEVsZW1lbnQoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWlmIChpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkuZXF1YWxzKG9sZFNvdXJjZSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFya0luaGVyaXRlZChFTW9kZWxFbGVtZW50IGVsZW1lbnQpIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKEFOTk9UQVRJT05fSU5IRVJJUkVEKTsKLQkJaWYgKGVBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWVBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJZUFubm90YXRpb24uc2V0U291cmNlKEFOTk9UQVRJT05fSU5IRVJJUkVEKTsKLQkJCWVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCkuYWRkKGVBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5tYXJrSW5IZXJpdGVkKEVNb2RlbEVsZW1lbnQgZWxlbWVudCkgewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oQU5OT1RBVElPTl9JTkhFUklSRUQpOwotCQlpZiAoZUFubm90YXRpb24gIT0gbnVsbCkgewotCQkJZWxlbWVudC5nZXRFQW5ub3RhdGlvbnMoKS5yZW1vdmUoZUFubm90YXRpb24pOwotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNvcHlEaWFncmFtKERpYWdyYW0gYmFzZURpYWdyYW0pIHsKLQkJRGlhZ3JhbSBjb3B5ID0gKERpYWdyYW0pIEVjb3JlVXRpbC5jb3B5KGJhc2VEaWFncmFtKTsKLQotCQkvLyBIQUNLOgotCQkvLyBnbyB0aHJ1IHRoZSBub2RlcyBvZiB0aGUgZGlhZ3JhbSBjb3B5LCBpZiBhbnkgbm9kZSBpcyBhIFVJLW9ubHkgbm9kZQotCQkvLyAoc2VlIFR5cGVkTm9kZSkKLQkJLy8gc2F2ZSB0aGUgR1VJRCBvZiB0aGUgb3JpZ2luYWwgb25lIGluIGl0cyBicmllZkRlc2NyaXB0aW9uIHRvIHJlbWVtYmVyCi0JCS8vIHdobyBpcyBiYXNlLgotCQkvLwotLy8JCWludCBzaXplID0gY29weS5nZXRDb250YWluZWQoKS5zaXplKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLS8vCQkJR3JhcGhOb2RlIGdOb2RlID0gKEdyYXBoTm9kZSkgY29weS5nZXRDb250YWluZWQoKS5nZXQoaSk7Ci0vLwkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmlzVUlHcmFwaE5vZGUoZ05vZGUpKSB7Ci0vLwkJCQlnTm9kZS5zZXRCcmllZkRlc2NyaXB0aW9uKCgoRGlhZ3JhbUVsZW1lbnQpIGJhc2VEaWFncmFtCi0vLwkJCQkJCS5nZXRDb250YWluZWQoKS5nZXQoaSkpLmdldEd1aWQoKSk7Ci0vLwkJCX0KLS8vCQl9Ci0JCUxpc3QgY2hpbGRyZW4gPSBjb3B5LmdldENoaWxkcmVuKCk7Ci0JCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgY2hpbGRyZW4uZ2V0KGkpOwotCQkJbWFya0luaGVyaXRlZCh2aWV3KTsKLQkJfQotCi0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRUxpc3QgYWRkRUFubm90YXRpb25EZXRhaWwoRU1vZGVsRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGV0YWlsTmFtZSwgU3RyaW5nIGRldGFpbFZhbHVlICkgewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOwotCQlpZiAoZUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJZUFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQllQW5ub3RhdGlvbi5zZXRTb3VyY2UoVU1BX0VMRU1FTlQpOwotCQkJLy8gZGV0YWlsIG11c3QgYmUgcHV0IGJlZm9yZSB0aGUgbmV3IGFubm90YXRpb24gY2FuIGJlIGFkZGVkIHRvIHRoZSBhbm5vdGF0aW9uIGxpc3QKLQkJCS8vIHNvIGFueSBhZGFwdGVyIHRoYXQgbGlzdGVuIHRvIGNoYW5nZSBpbiB0aGUgYW5ub3RhdGlvbiBsaXN0IGNhbiBnZXQgdGhlIGRldGFpbHMKLQkJCS8vIHdoZW4gaXQgZ2V0cyBub3RpZmllZC4KLQkJCS8vCi0JCQllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9UWVBFLCBkZXRhaWxWYWx1ZSk7Ci0JCQllbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9UWVBFLCBkZXRhaWxWYWx1ZSk7Ci0JCX0JCQotCQlyZXR1cm4gZWxlbWVudC5nZXRFQW5ub3RhdGlvbnMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQvb3IgYWRkcyB0aGUgZUFubm90YXRpb24gZGV0YWlsIGZvciB0eXBlLiB7QGxpbmsgQnJpZGdlSGVscGVyLlVNQV9UWVBFfQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMaXN0IGFkZEVBbm5vdGF0aW9uVHlwZShFTW9kZWxFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0eXBlKSB7Ci0JCUVMaXN0IHJlc3VsdCA9IGFkZEVBbm5vdGF0aW9uRGV0YWlsKGVsZW1lbnQsIFVNQV9UWVBFLCB0eXBlKTsKLQkJCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKEFjdGl2aXR5Tm9kZSkgZWxlbWVudDsKLS8vCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIG5vZGUgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBlbGVtZW50OwotCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7CQkJCQotCQkJaWYoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgJiYgCi0JCQkJCXR5cGUgIT0gbnVsbCAmJiAhdHlwZS5lcXVhbHMoQnJpZGdlSGVscGVyLmdldFR5cGUoZSkpKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGUgY3VycmVudGx5IGxpbmtlZCBtZXRob2QgZWxlbWVudCB3aXRoIHRoZSByaWdodCBvbmUKLQkJCQkvLwotCQkJCUVDbGFzcyByaWdodFR5cGUgPSBnZXRUeXBlKHR5cGUpOwotCQkJCWlmKHJpZ2h0VHlwZSAhPSBudWxsKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgcmlnaHRFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShyaWdodFR5cGUpOwotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IGFjdGl2aXR5ID0gKChCcmVha2Rvd25FbGVtZW50KWUpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IGxpc3QgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCQkJbGlzdC5zZXQobGlzdC5pbmRleE9mKGUpLCByaWdodEVsZW1lbnQpOwotCQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKHJpZ2h0RWxlbWVudCk7Ci0JCQkJCQkJLy8gQWxzbyBzZXQgdGhlIHJpZ2h0RWxlbWVudCB0byBpdHMgb3duIHByb2Nlc3MgcGFja2FnZS4KLQkJCQkJCQlMaXN0IGNoaWxkUGtncyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQkJCQkJaWYgKCFjaGlsZFBrZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkKLQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlQcm9jZXNzUGFja2FnZSBjaGlsZCA9IChQcm9jZXNzUGFja2FnZSkgaXRlcgotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJCUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IHBMaXN0ID0gY2hpbGQKLQkJCQkJCQkJCS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCQkJCQkJCWlmICghcExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJaWYgKHBMaXN0LmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCQkJCXBMaXN0LnNldChwTGlzdC5pbmRleE9mKGUpLAotCQkJCQkJCQkJCQkJCXJpZ2h0RWxlbWVudCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBhc3NvY2lhdGUgdGhlIG5ldyBtZXRob2QgZWxlbWVudCB3aXRoIHRoZSBub2RlCi0JCQkJCQkvLwotCQkJCQkJYXNzb2NpYXRlKG5vZGUsIHJpZ2h0RWxlbWVudCk7Ci0JCQkJCQkvLyByZW1vdmUgb2xkIG5vZGUgYWRhcHRlciBhbmQgYWRkIG5ldyBvbmUKLQkJCQkJCS8vCi0JCQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJCQl9CQkJCQkKLQkJCQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gKERpYWdyYW1BZGFwdGVyKSBnZXROb2RlQWRhcHRlcihub2RlLmdldEFjdGl2aXR5KCkpOwotCQkJCQkJZGlhZ3JhbUFkYXB0ZXIuYWRkTm9kZUFkYXB0ZXJUbyhub2RlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogVG8gZ2V0IHRoZSBlQW5ub3RhdGlvbiBkZXRhaWwgYmFzZWQgb24gbmFtZS4gKGVnOiB0eXBlKQotCSAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRFQW5ub3RhdGlvbkRldGFpbChFTW9kZWxFbGVtZW50LCBTdHJpbmcpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVBbm5vdGF0aW9uVHlwZShFTW9kZWxFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBkZXRhaWxOYW1lKSB7Ci0JCXJldHVybiBnZXRFQW5ub3RhdGlvbkRldGFpbChlbGVtZW50LCBkZXRhaWxOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RUFubm90YXRpb25EZXRhaWwoRU1vZGVsRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGV0YWlsTmFtZSkgewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOwotCQlpZihlQW5ub3RhdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiAoU3RyaW5nKWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoZGV0YWlsTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIGdldEVBbm5vdGF0aW9uRGV0YWlsKG5vZGUsIFVNQV9UWVBFKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgdHlwZSBjb25zdGFudHM6IHtAbGluayAjVU1BX0FDVElWSVRZfSwKLQkgKiAgICAgICAgIHtAbGluayAjVU1BX0lURVJBVElPTn0sIHtAbGluayAjVU1BX01JTEVTVE9ORX0sCi0JICogICAgICAgICB7QGxpbmsgI1VNQV9QSEFTRX0sIHtAbGluayAjVU1BX1RBU0tfREVTQ1JJUFRPUn0sCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIFVNQV9JVEVSQVRJT047Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBVTUFfUEhBU0U7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkgewotCQkJcmV0dXJuIFVNQV9BQ1RJVklUWTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBVTUFfTUlMRVNUT05FOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVU1BX1RBU0tfREVTQ1JJUFRPUjsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luaGVyaXRlZChFTW9kZWxFbGVtZW50IGUpewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGUuZ2V0RUFubm90YXRpb24oQU5OT1RBVElPTl9JTkhFUklSRUQpOwotCQlpZiAoZUFubm90YXRpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGVBbm5vdGF0aW9uLmdldFNvdXJjZSgpOwotCQkJaWYoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFQ2xhc3MgZ2V0RUNsYXNzRnJvbVR5cGUoU3RyaW5nIGFubm90YXRpb25UeXBlKSB7Ci0JCWlmKFVNQV9BQ1RJVklUWS5lcXVhbHMoYW5ub3RhdGlvblR5cGUpKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfQotCQllbHNlIGlmKFVNQV9JVEVSQVRJT04uZXF1YWxzKGFubm90YXRpb25UeXBlKSkgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCQl9IGVsc2UgaWYoVU1BX01JTEVTVE9ORS5lcXVhbHMoYW5ub3RhdGlvblR5cGUpKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCk7Ci0JCX0gZWxzZSBpZihVTUFfUEhBU0UuZXF1YWxzKGFubm90YXRpb25UeXBlKSkgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBoYXNlKCk7Ci0JCX0gZWxzZSBpZihVTUFfVEFTS19ERVNDUklQVE9SLmVxdWFscyhhbm5vdGF0aW9uVHlwZSkpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gbm9kZS5nZXRBY3Rpdml0eSgpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChwYXJlbnRBY3QpOwotCQlNZXRob2RFbGVtZW50IG9iaiA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwotCQlpbnQgY2xhc3NJRCA9IG9iai5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSBhY3QgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkgZWxlbWVudDsKLQkJQXJyYXlMaXN0IHNpYmxpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IGNsYXNzSUQpIHsKLQkJCQlzaWJsaW5ncy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGJhc2VOYW1lID0gTWVzc2FnZUZvcm1hdAotCQkJCS5mb3JtYXQoCi0JCQkJCQlEaWFncmFtUmVzb3VyY2VzLmRlZmF1bHRCYXNlTmFtZSwgbmV3IE9iamVjdFtdIHsgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmouZUNsYXNzKCkuZ2V0TmFtZSgpKSB9KTsgCi0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoc2libGluZ3MsIG9iaiwgYmFzZU5hbWUpOwotCQlub2RlLnNldE5hbWUob2JqLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmlldyBnZXRWaWV3KFZpZXcgZGlhZ3JhbSwgT2JqZWN0IG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyBjaGlsZCA9IChWaWV3KSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkLmdldEVsZW1lbnQoKSA9PSBub2RlKSB7Ci0JCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCQkJaWYoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlWaWV3IGVsZW1lbnQgPSAoVmlldykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZihlbGVtZW50LmdldEVsZW1lbnQoKSA9PSBub2RlKSB7Ci0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBub2RlIG5hbWUgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlTmFtZShNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlKTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Db250cm9sTm9kZUFkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0NvbnRyb2xOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWVkMzRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0NvbnRyb2xOb2RlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbE5vZGVBZGFwdGVyIGV4dGVuZHMgTm9kZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoQWN0aXZpdHlFZGdlIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNZXRob2RFbGVtZW50IHNyY0VsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFNvdXJjZSgpKTsKLQkJaWYgKHNyY0VsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJaWYgKEJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlCcmlkZ2VIZWxwZXIuZ2V0U3luY0JhclRhcmdldE5vZGVzKGxpbmsKLQkJCQkJCS5nZXRUYXJnZXQoKSwgdGFyZ2V0QWN0Tm9kZXMpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcih0YXJnZXRFbGVtZW50LCBzcmNFbGVtZW50KSA9PSBudWxsKSB7Ci0JCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKG5vZGUsIChXb3JrQnJlYWtkb3duRWxlbWVudCkgc3JjRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoQnJpZGdlSGVscGVyLmlzU3luY2hCYXIobGluay5nZXRTb3VyY2UoKSkpIHsKLQkJCS8vIFByZWRlY2Vzc29yIHNob3VsZCBiZSBjcmVhdGVkIG9ubHkgaW4gY2FzZSBvZgotCQkJLy8gU3luY3Jvbml6YXRpb24gQmFyLCBub3QgZm9yIERlY2lzaW9uUG9pbnQuCi0JCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQnJpZGdlSGVscGVyLmdldFN5bmNCYXJTb3VyY2VOb2RlcyhsaW5rLmdldFNvdXJjZSgpLCBzcmNBY3ROb2Rlcyk7Ci0JCQlDb2xsZWN0aW9uIHRhcmdldEFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQnJpZGdlSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcyhsaW5rLmdldFRhcmdldCgpLCB0YXJnZXRBY3ROb2Rlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KChBY3Rpdml0eU5vZGUpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChub2RlKSwgcHJlZCkgPT0gbnVsbCkgewotCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCBwcmVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKEFjdGl2aXR5RWRnZSBsaW5rLCBBY3Rpdml0eU5vZGUgb2xkU291cmNlLCBBY3Rpdml0eU5vZGUgb2xkVGFyZ2V0KSB7Ci0JCUNvbGxlY3Rpb24gc3JjQWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQkJCi0JCUJyaWRnZUhlbHBlci5nZXRTb3VyY2VOb2RlcyhzcmNBY3ROb2Rlcywgb2xkU291cmNlLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JCU1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFRhcmdldCk7Ci0JCWlmICh0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHRhcmdldFdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0RWxlbWVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gT2JqZWN0IHByZWQgPSAoKE5vZGUpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVXb3JrT3JkZXIoKE5hbWVkTm9kZUltcGwpCi0JCQkJLy8gb2xkVGFyZ2V0LCBwcmVkKTsKLQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoQnJpZGdlSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG5vZGUsIG9sZFRhcmdldCkpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBzcmNFbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7CQkJCQkKLQkJCQkJV29ya09yZGVyIHdvOwotCQkJCQl3aGlsZSAoKHdvID0gVW1hVXRpbC5maW5kV29ya09yZGVyKHRhcmdldFdiZSwgc3JjRWxlbWVudCkpICE9IG51bGwpIHsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhcmdldFdiZSwgCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwgd28sIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSkgewotCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUJyaWRnZUhlbHBlci5nZXRUYXJnZXROb2Rlcyh0YXJnZXRBY3ROb2RlcywKLQkJCQkJb2xkVGFyZ2V0LCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0KLQkJCS8vIHJlbW92ZSB0aGUgd29yayBvcmRlcnMgb2YgdGFyZ2V0IGFjdGl2aXRpZXMgdGhhdCBoYXZlIHRoZQotCQkJLy8gcHJlZGVjZXNzb3IgaW4gc3JjQWN0Tm9kZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9ICgoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkvLyBPYmplY3QgcHJlZCA9ICgoTm9kZSkgaXRlcmF0b3IubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVXb3JrT3JkZXIobm9kZSwgcHJlZCk7Ci0JCQkJCUFjdGl2aXR5Tm9kZSBwcmVkbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKEJyaWRnZUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBwcmVkbm9kZSwKLQkJCQkJCQlub2RlKSkgewotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgdGFyZ2V0RSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQkJCQlNZXRob2RFbGVtZW50IHNyY0VsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChwcmVkbm9kZSk7Ci0JCQkJCQlXb3JrT3JkZXIgd287Ci0JCQkJCQl3aGlsZSAoKHdvID0gVW1hVXRpbC5maW5kV29ya09yZGVyKHRhcmdldEUsIHNyY0VsZW1lbnQpKSAhPSBudWxsKSB7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGFyZ2V0RSwgCi0JCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsIHdvLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9EaWFncmFtQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvRGlhZ3JhbUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhY2Y1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9EaWFncmFtQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUm9sbGJhY2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFkYXB0ZXIgZXh0ZW5kcyBOb2RlQWRhcHRlciB7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGJhc2VBY3Q7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJvdGVjdGVkIGxvbmcgdW1hTGFzdE1vZGlmaWVkOwotCi0KLQlwdWJsaWMgRGlhZ3JhbUFkYXB0ZXIoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQl0aGlzKChBY3Rpdml0eSkgVG5nVXRpbC51bndyYXAod3JhcHBlcikpOwotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCQliYXNpY1NldFRhcmdldFJlYWRPbmx5KHdyYXBwZXIuaXNSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgRGlhZ3JhbUFkYXB0ZXIoQWN0aXZpdHkgZSkgewotCQlzdXBlcihlKTsKLQotCQkvLyBsaXN0ZW5zIHRvIGNoYW5nZSBpbiB0aGUgYmFzZSBhY3Rpdml0eSBpZiB0aGVyZSBpcyBhbnkKLQkJLy8KLQkJaWYgKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkuYWRkKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRpc3Bvc2UgYWxsIG5vZGUgYWRhcHRlcnMgb2YgdGhlIGNoaWxkIG5vZGVzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQlpZiAobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW5vZGVBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEFjdGl2aXR5QWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCUNvbGxlY3Rpb24gbmV3Tm9kZXNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBhZGROb2RlKG1zZwotCQkJCQkJCS5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IGJhc2VBY3QpIHsKLQkJCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSkKLQkJCQkJCQkJCS5iYXNpY1NldFRhcmdldFJlYWRPbmx5KHRydWUpOwotCQkJCQkJCW5ld05vZGVzVG9SZWZyZXNoLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCXJlbW92ZU5vZGUobXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBub2RlcyA9IGFkZE5vZGVzKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSBiYXNlQWN0KSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlub2RlID0gKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpCi0JCQkJCQkJCQkuYmFzaWNTZXRUYXJnZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCQluZXdOb2Rlc1RvUmVmcmVzaC5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlbW92ZU5vZGVzKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCW1vdmVOb2RlKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQlyZXBsYWNlTm9kZShtc2cuZ2V0T2xkVmFsdWUoKSwgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCX0KLQkJCXJldHVybiBuZXdOb2Rlc1RvUmVmcmVzaDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eS5jbGFzcykpIHsKLQkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX19OT0RFOgotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uOwotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIChBY3Rpdml0eU5vZGUpIG1zZwotCQkJCQkJLmdldE5ld1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQlub2RlUmVtb3ZlZCgoQWN0aXZpdHlOb2RlKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIG5vZGUpOwotCQkJCX0KLQotCQkJCXJldHVybjsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJbm9kZVJlbW92ZWQoKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VOb2RlKE9iamVjdCBvbGRFbGVtZW50LCBPYmplY3QgbmV3RWxlbWVudCkgewotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJcG9wdWxhdGVMaW5rcyhnZXROb2RlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhMaXN0PEFjdGl2aXR5Tm9kZT4gc2VsZWN0ZWROb2RlcykgewotCQkvLyBmaWxsIG91dGdvaW5nL2luY29taW5nIGNvbm5lY3Rpb24gbGlzdHMgb2YgYWxsIG5vZGVzCi0JCS8vCi0JCWludCBzaXplID0gc2VsZWN0ZWROb2Rlcy5zaXplKCk7Ci0JCWJvb2xlYW5bXSBub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQl0cnkgewotCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQKLQkJCS8vIHVud2FudGVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBzZWxlY3RlZE5vZGVzLmdldChpKTsKLQkJCQlub3RpZmllc1tpXSA9IG5vZGUuZURlbGl2ZXIoKTsKLQkJCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQkJcG9wdWxhdGVMaW5rcyhub2RlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZWxlY3RlZE5vZGVzLmdldChpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXROb2RlcygpIHsKLQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGdldERpYWdyYW0oKS5nZXROb2RlcygpIDogQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVOb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKCFUbmdVdGlsLmlzSW5zdGFuY2VPZihnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSwgb2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIG9iaik7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCX0KLQkJbm9kZS5nZXRPdXRnb2luZ3MoKS5jbGVhcigpOwotCQlub2RlLmdldEluY29taW5ncygpLmNsZWFyKCk7Ci0KLQkJZ2V0Tm9kZXMoKS5yZW1vdmUobm9kZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vZGVzKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJcmVtb3ZlTm9kZShpdGVyLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGFkZE5vZGUoT2JqZWN0IG9iaikgewotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IGFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlwb3B1bGF0ZUxpbmtzKG5vZGUsIHRydWUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGROb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWFkZE5vZGUobm9kZXMsIGl0ZXIubmV4dCgpKTsKLQkJfQotCi0JCS8vIHVzZSBhZGRBbGwoKSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBub3RpZmljYXRpb25zCi0JCS8vCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotCS8qKgotCSAqIEluIFByb2Nlc3MgV0JTLCBpZiBicmVha2Rvd25lbGVtZW50IGlzIG1vdmVkIHVwIG9yIGRvd24sIGRpYWdyYW0gc2hvdWxkCi0JICogYmUgdXBkYXRlZCBhY2NvcmRpbmdseS4gU3ViLWNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBkaWFncmFtCi0JICogbmVlZHMgdXBkYXRlIG9uIG1vdmUuCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgbW92ZU5vZGUoT2JqZWN0IG9sZFZhbHVlKSB7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSBpbmNvbWluZy9vdXRnb2luZyBsaW5rcyBvZiB0aGUgZ2l2ZW4gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhBY3Rpdml0eU5vZGUgbm9kZSwgYm9vbGVhbiBkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCS8vIGludCBzaXplID0gMDsKLQkJLy8gYm9vbGVhbltdIG5vdGlmaWVzID0gbnVsbDsKLQkJLy8gdHJ5IHsKLQkJLy8gaWYgKGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJLy8gc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQkvLyBub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQkvLyAvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZAotCQkvLyAvLyB1bndhbnRlZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb25uZWN0aW9uIGxpc3QKLQkJLy8gLy8KLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJLy8gTm9kZSBjaGlsZCA9ICgoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSkpOwotCQkvLyBub3RpZmllc1tpXSA9IGNoaWxkLmVEZWxpdmVyKCk7Ci0JCS8vIGNoaWxkLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIEdyYXBoTm9kZSBncmFwaE5vZGUgPSBub2RlLmdldEdyYXBoTm9kZSgpOwotCQkvLyBpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5maWxsQ29ubmVjdGlvbnMobm9kZSwgZ3JhcGhOb2RlKTsKLQkJLy8gfQotCQkvLyB9IGZpbmFsbHkgewotCQkvLyBpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkvLyAvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCS8vIC8vCi0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCS8vICgoRU9iamVjdCkgZ2V0Tm9kZXMoKS5nZXQoaSkpLmVTZXREZWxpdmVyKG5vdGlmaWVzW2ldKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIG5ldyBub2RlIGZvciB0aGlzIGRpYWdyYW0gZm9yIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IG5ld05vZGUoZSk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW5pdGlhbGl6ZU5vZGUobm9kZSwgZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTm9kZUFkYXB0ZXIoTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIpIHsKLQkJbm9kZUFkYXB0ZXIuc2V0RWRpdGluZ0RvbWFpbihkb21haW4pOwotCQlub2RlQWRhcHRlci5hY3Rpb25NYW5hZ2VyID0gYWN0aW9uTWFuYWdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVOb2RlKEFjdGl2aXR5Tm9kZSBub2RlLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZU5hbWUoZSk7Ci0JCW5vZGUuc2V0TmFtZShuYW1lKTsJCQotCi0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlpZiAobm9kZUFkYXB0ZXIgIT0gbnVsbCAmJiBub2RlQWRhcHRlci5nZXRFbGVtZW50KCkgIT0gZSkgewotCQkJbm9kZUFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJbm9kZUFkYXB0ZXIgPSBudWxsOwotCQl9Ci0JCWlmIChub2RlQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlub2RlQWRhcHRlciA9IGNyZWF0ZU5vZGVBZGFwdGVyKGUpOwotCQkJaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKG5vZGVBZGFwdGVyKTsKLQkJCW5vZGUuZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBOb2RlQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcihNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBuZXdOb2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vZGUgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCA8Y29kZT5vYmo8L2NvZGU+IGFuZAotCSAqIGFkZCBpdCB0byB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiBub2RlcwotCSAqIAotCSAqIEBwYXJhbSBub2RlcwotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChUbmdVdGlsLmlzSW5zdGFuY2VPZihnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSwgb2JqKSkgewotCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgewotCQlyZXR1cm4gKEFjdGl2aXR5KSBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VbWFNb2RlbChBY3Rpdml0eU5vZGUgcmVtb3ZlZE5vZGUpIHsKLQkJT2JqZWN0IGU7Ci0JCWlmICgoZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHJlbW92ZWROb2RlKSkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBnZXRBY3Rpdml0eSgpLCAKLQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLCBlLCAtMSk7Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVGcm9tVW1hTW9kZWwocmVtb3ZlZE5vZGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4dHJhY3RDaGlsZHJlbihJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciwgT2JqZWN0IG9iamVjdCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQkvLyBkaXNhYmxlIHJvbGx1cCBiZWZvcmUgZ2V0dGluZyB0aGUgY2hpbGRyZW4KLQkJLy8KLQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGZhbHNlOwotCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQl9Ci0JCWVsc2UgaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcil7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCS8vIGZpbHRlciBvdXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZG9uJ3QgZmlsdGVyIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQkvL2NoaWxkcmVuLmFkZEFsbChhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkLXVwIGZsYWcKLQkJCS8vCi0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXRoaXMuc3VwcHJlc3Npb24gPSBzdXBwcmVzc2lvbjsKLQl9CQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVWaWV3KENvbGxlY3Rpb248Pz4gc2VsZWN0ZWROb2RlcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBSb2xsYmFja0V4Y2VwdGlvbiB7Ci0JCXVwZGF0ZVZpZXcoZ2V0VmlldygpLCBzZWxlY3RlZE5vZGVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVWaWV3KFZpZXcgdmlldywgQ29sbGVjdGlvbjw/PiBzZWxlY3RlZE5vZGVzKSB7Ci0JCS8vIHNob3cgdGhlIHNlbGVjdGVkIG5vZGVzIGFuZCBoaWRlIGFsbCB0aGUgb3RoZXIKLQkJLy8JCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgbm9kZSA9IChWaWV3KSBpdGVyLm5leHQoKTsKLQkJCWlmKHNlbGVjdGVkTm9kZXMuY29udGFpbnMobm9kZS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlLmdldEVsZW1lbnQoKSk7Ci0JCQkJaWYoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIudXBkYXRlVmlldygpOwotCQkJCX0KLS8vCQkJCWlmKCFub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCW5vZGUuc2V0VmlzaWJsZSh0cnVlKTsKLS8vCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCWlmKG5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCW5vZGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKSB7Ci0JCQkJCXVwZGF0ZVZpZXcobm9kZSwgc2VsZWN0ZWROb2Rlcyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZighbm9kZS5pc1Zpc2libGUoKSkgewotCQkJCQkJbm9kZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRWRnZXMoQ29sbGVjdGlvbiBzZWxlY3RlZE5vZGVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFJvbGxiYWNrRXhjZXB0aW9uIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0VmlldygpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IG5vZGUgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZihzZWxlY3RlZE5vZGVzLmNvbnRhaW5zKG5vZGUuZ2V0RWxlbWVudCgpKSkgewotCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRFbGVtZW50KCkpOwotCQkJCWFkYXB0ZXIudXBkYXRlVmlldygpOwotLy8JCQkJaWYoIW5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJbm9kZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlzZXRFZGdlVmlzaWJpbGl0eShub2RlLCB0cnVlKTsKLS8vCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCWlmKG5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCXNldEVkZ2VWaXNpYmlsaXR5KG5vZGUsIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYoIW5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCW5vZGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCXNldEVkZ2VWaXNpYmlsaXR5KG5vZGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RWRnZVZpc2liaWxpdHkoVmlldyB2aWV3LCBib29sZWFuIHZpc2liaWxpdHkpewotCQlEaWFncmFtIGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW0uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoZWRnZS5nZXRTb3VyY2UoKSA9PSB2aWV3IHx8IGVkZ2UuZ2V0VGFyZ2V0KCkgPT0gdmlldyl7Ci0JCQkJaWYodmlzaWJpbGl0eSl7Ci0JCQkJCXZpZXcuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQkJZWRnZS5zZXRWaXNpYmxlKHZpc2liaWxpdHkpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgZGlhZ3JhbSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIFVNQSBtb2RlbC4gU3ViY2xhc3Mgc2hvdWxkCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVEaWFncmFtKCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlmaW5hbCBMaXN0PEFjdGl2aXR5Tm9kZT4gc2VsZWN0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsJCQkKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJc2VsZWN0ZWROb2Rlcy5hZGRBbGwocG9wdWxhdGVOb2RlcygpKTsKLQkJCQkJcG9wdWxhdGVMaW5rcyhzZWxlY3RlZE5vZGVzKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJCQotCQkJLy8gYWRkIHRoaXMgZGlhZ3JhbSB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiBhbGwgbm9kZXMgc28gdGhleSB3aWxsIG5vdAotCQkJLy8gYmUgZGlzcG9zZWQKLQkJCS8vIGJlZm9yZSB0aGlzIGRpYWdyYW0uCi0JCQkvLwotCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IHNlbGVjdGVkTm9kZXMpIHsKLQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCW5vZGVBZGFwdGVyLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJdXBkYXRlRWRnZXMoc2VsZWN0ZWROb2Rlcyk7Ci0JCQkJCQl1cGRhdGVWaWV3KHNlbGVjdGVkTm9kZXMpOwotCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBwb3B1bGF0ZU5vZGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCQotCXB1YmxpYyBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlpZihhY3Rpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCWFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCQlib29sZWFuIHJldCA9IHN1cGVyLmRvQWN0aW9uKGFjdGlvblR5cGUsIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsIGluZGV4KTsKLQkJCQkJaWYocmV0KSB7Ci0JCQkJCQl1bWFMYXN0TW9kaWZpZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmV0OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbk1hbmFnZXI7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldFVtYUxhc3RNb2RpZmllZCgpIHsKLQkJcmV0dXJuIHVtYUxhc3RNb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvTm9kZUFkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL05vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmM2ZhYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTm9kZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgLy9pbXBsZW1lbnRzIElOb2RlQ2hhbmdlTGlzdGVuZXIgCi0JewotCQkvKioKLQkJICogCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHJldHVybiBOZXcgbm9kZXMgd2hvc2Ugdmlld3MgbmVlZCByZWZyZXNoIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXNldE5hbWUobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCSAgIC8vIENyZWF0ZSBhIG5ldyBub3RpZnkgd2hlbiB3ZSd2ZSBkZXRlY3RlZCB0aGF0IHRoZSBpY29ucyBtYXkgaGF2ZSBjaGFuZ2VkLAotCQkJICAgLy8gYnkganVzdCBmb3JjaW5nIGEgbm90aWZ5IG9uIHRoZSBuYW1lLCB3ZSBjYXVzZSB0aGUgaWNvbnMgdG8gZ2V0IAotCQkJICAgLy8gcmVmcmVzaGVkIGFzIHdlbGwuCi0JCQkJQWN0aXZpdHlOb2RlIGUgPSBnZXROb2RlKCk7Ci0JCQkJZS5lTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KSBlLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQkJVU1MUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FLCBlLmdldE5hbWUoKSwgZS5nZXROYW1lKCksIHRydWUpKTsKLQkJCQllLmVOb3RpZnkobXNnKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmKGRvbWFpbiA9PSBudWxsIHx8IGRvbWFpbi5nZXRDaGFuZ2VSZWNvcmRlcigpID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZpbmFsIENvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBuZXdOb2Rlc1RvUmVmcmVzaCA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCW5ld05vZGVzVG9SZWZyZXNoLmFkZEFsbChoYW5kbGVOb3RpZmljYXRpb24obXNnKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJaWYoIW5ld05vZGVzVG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBuZXdOb2Rlc1RvUmVmcmVzaCkgewotCQkJCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSkudXBkYXRlVmlldygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE5vZGVBZGFwdGVyIGdldE5vZGVBZGFwdGVyKCkgewotCQkJcmV0dXJuIE5vZGVBZGFwdGVyLnRoaXM7Ci0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBjb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRBZGFwdGVyIG1ldGhvZEVsZW1lbnRBZGFwdGVyOwotCXByaXZhdGUgYm9vbGVhbiB0YXJnZXRSZWFkT25seTsKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQlwcm90ZWN0ZWQgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0JcHJpdmF0ZSBWaWV3IHZpZXc7Ci0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXI7Ci0JCi0JcHJvdGVjdGVkIE5vZGVBZGFwdGVyKCkgewotCQkKLQl9Ci0JCi0JcHVibGljIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCWlmKGFjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjdGlvbk1hbmFnZXI7Ci0JCX0KLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoZ2V0Tm9kZSgpLmdldEFjdGl2aXR5KCkpOwotCQlyZXR1cm4gbm9kZUFkYXB0ZXIuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQkKLQlwdWJsaWMgTm9kZUFkYXB0ZXIoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQl0aGlzKChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKSk7Ci0JCXRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0JCXRhcmdldFJlYWRPbmx5ID0gd3JhcHBlci5pc1JlYWRPbmx5KCk7Ci0JfQotCi0JcHVibGljIE5vZGVBZGFwdGVyKE1ldGhvZEVsZW1lbnQgZSkgewotCQllbGVtZW50ID0gZTsKLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQllLmVBZGFwdGVycygpLmFkZChtZXRob2RFbGVtZW50QWRhcHRlcik7CQkKLQl9CQkJCi0JCi0JcHVibGljIFZpZXcgZ2V0VmlldygpIHsKLQkJaWYodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmlldzsKLQkJfQotCQlWaWV3IGRpYWdyYW1WaWV3ID0gZ2V0RGlhZ3JhbVZpZXcoKTsKLQkJaWYoZGlhZ3JhbVZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIEJyaWRnZUhlbHBlci5nZXRWaWV3KGRpYWdyYW1WaWV3LCBnZXROb2RlKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFZpZXcgZ2V0RGlhZ3JhbVZpZXcoKSB7Ci0JCUFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihkaWFncmFtKTsKLQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBhZGFwdGVyLmdldFZpZXcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3KFZpZXcgdmlldykgewotCQl0aGlzLnZpZXcgPSB2aWV3OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRpbmdEb21haW4oSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJdGhpcy5kb21haW4gPSBkb21haW47Ci0JfQotCQkJCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRSZWFkT25seSgpIHsKLQkJaWYodGFyZ2V0UmVhZE9ubHkpICB7Ci0JCQlyZXR1cm4gdGFyZ2V0UmVhZE9ubHk7Ci0JCX0KLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXREaWFncmFtKCk7Ci0JCWlmKGFjdGl2aXR5ICE9IHRhcmdldCkgewotCQkJTm9kZUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoYWN0aXZpdHkpOwotCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCAmJiBkaWFncmFtQWRhcHRlci5pc1RhcmdldFJlYWRPbmx5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0VGFyZ2V0UmVhZE9ubHkoYm9vbGVhbiBiKSB7Ci0JCXRhcmdldFJlYWRPbmx5ID0gYjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXRSZWFkT25seShib29sZWFuIHRhcmdldFJlYWRPbmx5KSB7Ci0JCWJvb2xlYW4gdXBkYXRlVmlldyA9IHRoaXMudGFyZ2V0UmVhZE9ubHkgIT0gdGFyZ2V0UmVhZE9ubHk7Ci0JCXRoaXMudGFyZ2V0UmVhZE9ubHkgPSB0YXJnZXRSZWFkT25seTsKLQkJaWYodXBkYXRlVmlldykgewotCQkJdXBkYXRlVmlldygpOwotCQl9Ci0JfQkJCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaWV3KCkgewotCQlWaWV3IG5vZGUgPSBnZXRWaWV3KCk7Ci0JCWlmKG5vZGUgIT0gbnVsbCkgewotLy8JCQlub2RlLnNldE11dGFibGUoIWlzVGFyZ2V0UmVhZE9ubHkoKSk7Ci0JCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBub2RlLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLS8vCQkJaWYoc3R5bGUgIT0gbnVsbCkgewotLy8JCQkJQ29sb3IgY29sb3IgPSBpc1RhcmdldFJlYWRPbmx5KCkgPyBEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SIDogRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfQ09MT1I7Ci0vLwkJCQlzdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihjb2xvci5nZXRSR0IoKSkuaW50VmFsdWUoKSk7Ci0vLwkJCX0KLQkJCWlmKHN0eWxlID09IG51bGwpIHsKLQkJCQlub2RlLmNyZWF0ZVN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50QWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGdldE5vZGUoKSB7Ci0JCWlmKHRhcmdldCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIChBY3Rpdml0eU5vZGUpIHRhcmdldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGdldERpYWdyYW0oKSB7Ci0JCWlmKHRhcmdldCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gKEFjdGl2aXR5KSB0YXJnZXQ7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCXJldHVybiBub2RlICE9IG51bGwgPyBub2RlLmdldEFjdGl2aXR5KCkgOiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWN0aXZpdHlFZGdlIGFkZEluY29taW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHNvdXJjZSkgewotCQlBY3Rpdml0eU5vZGUgc3JjTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIHNvdXJjZSwgdHJ1ZSk7Ci0JCWlmIChzcmNOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvZiBzcmNOb2RlIGJlZm9yZSBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbGluawotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIFVNQSBkYXRhCi0JCS8vCi0JCU5vZGVBZGFwdGVyIHNyY05vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHNyY05vZGUpOwotCQlib29sZWFuIG5vdGlmeSA9IHNyY05vZGVBZGFwdGVyICE9IG51bGwgPyBzcmNOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZihzcmNOb2RlQWRhcHRlciAhPSBudWxsKSBzcmNOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlBY3Rpdml0eUVkZ2UgZWRnZSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRyb2xGbG93KCk7Ci0JCQllZGdlLnNldFNvdXJjZShzcmNOb2RlKTsKLQkJCWVkZ2Uuc2V0VGFyZ2V0KGdldE5vZGUoKSk7Ci0JCQlnZXREaWFncmFtKCkuZ2V0RWRnZXMoKS5hZGQoZWRnZSk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHNyY05vZGVBZGFwdGVyICE9IG51bGwpIHNyY05vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHlFZGdlIGFkZE91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0Tm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIHRhcmdldCk7Ci0JCWlmICh0YXJnZXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvZiB0YXJnZXROb2RlIGJlZm9yZSBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbGluawotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIFVNQSBkYXRhCi0JCS8vCi0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHRhcmdldE5vZGUpOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVBZGFwdGVyICE9IG51bGwgPyBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlBY3Rpdml0eUVkZ2UgZWRnZSA9IGdldERpYWdyYW0oKS5jcmVhdGVFZGdlKCIiLCBVTUxQYWNrYWdlLkxpdGVyYWxzLkNPTlRST0xfRkxPVyk7IC8vJE5PTi1OTFMtMSQKLQkJCWVkZ2Uuc2V0U291cmNlKGdldE5vZGUoKSk7Ci0JCQllZGdlLnNldFRhcmdldCh0YXJnZXROb2RlKTsKLQkJCXJldHVybiBlZGdlOwotCQl9IGZpbmFsbHkgewotCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb25zdW1lciB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogQHBhcmFtIGNvbnN1bWVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWlmICghY29uc3VtZXJzLmNvbnRhaW5zKGNvbnN1bWVyKSkgewotCQkJY29uc3VtZXJzLmFkZChjb25zdW1lcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29uc3VtZXIgZnJvbSB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuIERpc3Bvc2VzCi0JICogdGhlIG5vZGUgaWYgaXQgZG9lcyBub3QgaGF2ZSBhbnkgbW9yZSBjb25zdW1lciBhZnRlciB0aGlzIGNhbGwuIERpc3Bvc2luZwotCSAqIGEgbm9kZSB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZyB0aGlzIG5vZGUncyBsaXN0ZW5lciBmcm9tIHRoZSBVTUEKLQkgKiBvYmplY3QgYW5kIGFsbCB0aGUgYWRhcHRlcnMgdGhhdCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgYWRhcHRlciBsaXN0IG9mCi0JICogdGhpcyBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQljb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKLQkJaWYgKGNvbnN1bWVycy5pc0VtcHR5KCkpIHsKLQkJCS8vIG5vIG1vcmUgY29uc3VtZXIgb2YgdGhpcyBub2RlLCBpdCBzaG91bGQgYmUgZGlzcG9zZWQKLQkJCWRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBzZXQgZG9tYWluIHRvIG51bGwgYmVmb3JlIHJlbW92aW5nIG1ldGhvZEVsZW1lbnRBZGFwdGVyIGZyb20gdGhlCi0JCS8vIG1ldGhvZCBlbGVtZW50IHNvIG1ldGhvZEVsZW1lbnQgY2FuIHNraXAgaGFuZGxpbmcgUkVNT1ZFX0FEQVBURVIgZXZlbnQKLQkJLy8gdGhhdCBzb21ldGltZXMgcmVxdWlyZXMgbmV3IHRyYW5zYWN0aW9uIHRvIGJlIGNyZWF0ZWQgYW5kIGNhdXNlcyBkZWFkLWxvY2sKLQkJLy8KLQkJZG9tYWluID0gbnVsbDsKLQkJRU9iamVjdCBvYmogPSBlbGVtZW50OwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJaWYodGFyZ2V0ICE9IG51bGwpIHsKLQkJCXRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCX0KLQkJCi0JCWVsZW1lbnQgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdTdHJpbmdWYWx1ZSkgewotCQlBY3Rpdml0eU5vZGUgZSA9IGdldE5vZGUoKTsKLQkJaWYoZSAhPSBudWxsKSB7Ci0JCQllLnNldE5hbWUobmV3U3RyaW5nVmFsdWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5Tm9kZS5jbGFzcykpIHsKLQkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX05PREVfX05BTUU6Ci0JCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQKLQkJCQkJJiYgZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCVN0cmluZyBuZXdOYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCkpOwotCQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShuZXdOYW1lKTsKLQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKGUuZ2V0TmFtZSgpKSkgewotCQkJCQllLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVNTFBhY2thZ2UuQUNUSVZJVFlfTk9ERV9fSU5DT01JTkc6IC8vIGluY29taW5nIGNvbm5lY3Rpb25zCi0JCQlBY3Rpdml0eUVkZ2UgbGluazsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJbGluayA9IChBY3Rpdml0eUVkZ2UpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCWFkZFRvVU1BKGxpbmspOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWFkZFRvVU1BKChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJbGluayA9IChBY3Rpdml0eUVkZ2UpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRTb3VyY2UoKSk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLnJlbW92ZUZyb21VTUEobGluaywgbGluawotCQkJCQkJCQkuZ2V0U291cmNlKCksIChBY3Rpdml0eU5vZGUpIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRTb3VyY2UoKSk7Ci0JCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJbm9kZUFkYXB0ZXIucmVtb3ZlRnJvbVVNQShsaW5rLAotCQkJCQkJCQkJbGluay5nZXRTb3VyY2UoKSwgKEFjdGl2aXR5Tm9kZSkgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVNTFBhY2thZ2UuQUNUSVZJVFlfTk9ERV9fT1VUR09JTkc6Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5hZGRUb1VNQShsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRUYXJnZXQoKSk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLmFkZFRvVU1BKGxpbmspOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCXJlbW92ZUZyb21VTUEobGluaywgKEFjdGl2aXR5Tm9kZSkgbXNnLmdldE5vdGlmaWVyKCksIGxpbmsKLQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJcmVtb3ZlRnJvbVVNQShsaW5rLCAoQWN0aXZpdHlOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSwgbGluawotCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQlyZXR1cm47Ci0JCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQl9IGZpbmFsbHkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGFkZGVkIG5vZGUgdG8gdGhlIFVNQSBtb2RlbCBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgQWN0aXZpdHlOb2RlIG5vZGUpIHsJCQotLy9UT0RPOiByZXZpZXcKLS8vCQlpZiAoYWRkZWROb2RlLmdldEdyYXBoTm9kZSgpID09IG51bGwpIHsKLS8vCQkJLy8gdGhpcyBub2RlIGlzIHJlYWRkZWQgYWZ0ZXIgdW5kbwotLy8JCQkvLwotLy8JCQkoKE5vZGVJbXBsKSBhZGRlZE5vZGUpLmJhc2ljU2V0T2JqZWN0KGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0vLwkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChpbnQgaW5kZXgsIEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlpZihub2RlQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlub2RlQWRhcHRlciA9IGFkZE5vZGVBZGFwdGVyVG8obm9kZSk7Ci0JCX0KLQkJYWRkVG9VbWFNb2RlbChpbmRleCwgbm9kZSk7CQkKLQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJbm9kZUFkYXB0ZXIuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE5vZGVBZGFwdGVyIGFkZE5vZGVBZGFwdGVyVG8oQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGRhdGEgZm9yIHRoZSByZW1vdmVkIG5vZGUgZnJvbSB0aGUgVU1BIG1vZGVsIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVtYU1vZGVsKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vZGVSZW1vdmVkKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCXJlbW92ZUZyb21VbWFNb2RlbChub2RlKTsKLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCW5vZGVBZGFwdGVyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoQWN0aXZpdHlFZGdlIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbCB8fCBsaW5rLmdldFNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7CQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoQWN0aXZpdHlFZGdlIGxpbmssIEFjdGl2aXR5Tm9kZSBvbGRTb3VyY2UsIEFjdGl2aXR5Tm9kZSBvbGRUYXJnZXQpIHsKLQkJTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQob2xkVGFyZ2V0KTsKLQkJaWYgKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gdGhpcyBpcyBhIGRpcmVjdCBsaW5rCi0JCQkvLyByZW1vdmUgV29ya09yZGVyCi0JCQkvLwotCQkJTm9kZUFkYXB0ZXIgdGFyZ2V0Tm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIob2xkVGFyZ2V0KTsKLQkJCWJvb2xlYW4gbm90aWZ5ID0gdGFyZ2V0Tm9kZUFkYXB0ZXIgIT0gbnVsbCA/IHRhcmdldE5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgOiBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJaWYodGFyZ2V0Tm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0YXJnZXROb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChCcmlkZ2VIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgb2xkU291cmNlLAotCQkJCQkJb2xkVGFyZ2V0KSkgewotCQkJCQlPYmplY3QgcHJlZCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFNvdXJjZSk7Ci0JCQkJCWlmKHByZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQob2xkVGFyZ2V0KTsKLQkJCQkJCUNvbGxlY3Rpb248V29ya09yZGVyPiB3b3JrT3JkZXJzID0gVW1hVXRpbC5maW5kV29ya09yZGVyKGUsIChXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZCwgdHJ1ZSk7Ci0JCQkJCQlpZighd29ya09yZGVycy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIGUsIAotCQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SLCB3b3JrT3JkZXJzLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmKHRhcmdldE5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdGFyZ2V0Tm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZihvbGRUYXJnZXQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSAmJiBCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcihvbGRUYXJnZXQpKSB7Ci0JCQkvLyBnZXQgYWxsIHRoZSBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzIHRoYXQgdGhpcyBzeW5jaCBiYXIgaXMKLQkJCS8vIGNvbWluZyB0byBhbmQKLQkJCS8vIHJlbW92ZSB0aGUgV29ya09yZGVycyB3aXRoIHRoaXMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlJ3MKLQkJCS8vIGFjdGl2aXR5IGFzIHByZWRlY2Vzc29yIGZyb20gdGhlbQotCQkJLy8KLQkJCUNvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJQnJpZGdlSGVscGVyLmdldFN1Y2Nlc3Nvck5vZGVzKGFjdE5vZGVzLCBvbGRUYXJnZXQpOwotCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IGFjdE5vZGVzKSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJYm9vbGVhbiBub3RpZnkgPSBub2RlQWRhcHRlciAhPSBudWxsID8gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoQnJpZGdlSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG9sZFNvdXJjZSwgbm9kZSkpIHsKLQkJCQkJCVdvcmtPcmRlciB3bzsKLQkJCQkJCXdoaWxlICgod28gPSBVbWFVdGlsLmZpbmRXb3JrT3JkZXIoZSwgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQob2xkU291cmNlKSkpICE9IG51bGwpIHsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlLCAKLQkJCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwgd28sIC0xKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogYWRkRGVmYXVsdFdvcmtPcmRlciBpcyBtb3ZlZCBmcm9tCi0JICogR3JhcGhpY2FsRGF0YUhlbHBlci5hZGREZWZhdWx0V29ya09yZGVyKE5hbWVkTm9kZUltcGwsCi0JICogV29ya2JyZWFrZG93bkVsZW1lbnQpIE1ldGhvZCB3aWxsIHNldCBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgdG8gZmFsc2UKLQkgKiBvZiBhbGwgYWRhcHRlcnMgb2YgdHlwZSBNZXRob2RFbGVtZW50QWRhcHRlciBvZiBTdWNjZXNzb3Igb2JqZWN0IGJlZm9yZQotCSAqIGNyZWF0aW5nIGEgV29ya09yZGVyIG9iamVjdC4gQWZ0ZXIgY3JlYXRpb24gb2YgV29ya09yZGVyIChQcmVkZWNlc3NvcgotCSAqIGxpbmspIHJlc3RvcmVzIHRoZSBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgb2YgU3VjY2Vzc29yJ3MgYWRhcHRlcnMgb2YKLQkgKiB0eXBlIE1ldGhvZEVsZW1lbnRBZGFwdGVyLgotCSAqIAotCSAqIGVnOiBJZiBhbiBBY3Rpdml0eSAiYWN0QSIgaXMgZXh0ZW5kZWQgaW4gYW5vdGhlciBDUC4gQmFzZSAiYWN0QSIgQUQKLQkgKiBkaWFncmFtIGlzIG9wZW5lZCwgYW5kIEV4dGVuZGVkICJhY3RBIiBBRCBEaWFncmFtIGlzIG9wZW5lZC4gT24gY3JlYXRpbmcKLQkgKiBwcmVkZWNlc3NvciBsaW5rIGJldHdlZW4gYW55IHR3byBjaGlsZCBhY3Rpdml0aWVzLCBjcmVhdGVzIGEgZXh0cmEgbGluawotCSAqIGluIEV4dGVuZGVkICJhY3RBIiBBRCBkaWFncmFtLCBiZWNhdXNlIGNyZWF0aW5nIHdvcmtvcmRlciB3aWxsIG5vdGlmeSB0aGUKLQkgKiBleHRlbmRlZCAiYWN0QSIgZGlhZ3JhbSB0byBkcmF3IGEgbGluay4gVG8gYXZvaWQgZHVwbGljYXRlIGxpbmtzIGluIHRoZQotCSAqIGV4dGVuZGVkIGFjdGl2aXR5IGRpYWdyYW0sIHdlIGhhdmUgdG8gc2V0IG5vdGlmaWNhdGlvbkVuYWJsZWQgZmxhZyB0bwotCSAqIGZhbHNlLCBiZWZvcmUgY3JlYXRpbmcgYSBXb3JrT3JkZXIgb2JqZWN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXIgYWRkRGVmYXVsdFdvcmtPcmRlcihBY3Rpdml0eU5vZGUgbm9kZSwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRCcmVha2Rvd25FbGVtZW50KSB7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlNZXRob2RFbGVtZW50IGUgPSBub2RlQWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCUxpc3QgbGlzdCA9IGUuZUFkYXB0ZXJzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkYXB0ZXIpIHsKLQkJCQlOb2RlQWRhcHRlciBvdGhlck5vZGVBZGFwdGVyID0gKE5vZGVBZGFwdGVyKSAoKE1ldGhvZEVsZW1lbnRBZGFwdGVyKSBvYmopCi0JCQkJCQkuZ2V0Tm9kZUFkYXB0ZXIoKTsKLQkJCQlib29sZWFuIHByZWROb3RpZmljYXRpb24gPSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCW90aGVyTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCW1hcC5wdXQob3RoZXJOb2RlQWRhcHRlciwgbmV3IEJvb2xlYW4ocHJlZE5vdGlmaWNhdGlvbikpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlXb3JrT3JkZXIgd28gPSBVbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlLCBwcmVkQnJlYWtkb3duRWxlbWVudCwgZmFsc2UpOwotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZSwgCi0JCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwgd28sIC0xKTsKLQkJCXJldHVybiB3bzsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGVBZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZ5KTsKLQkJCVNldCBzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KG9iamVjdCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJYm9vbGVhbiBwcmVkbm90ID0gKChCb29sZWFuKSBvYmopLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkoKE5vZGVBZGFwdGVyKSBvYmplY3QpLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBwcmVkbm90OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBub3RpZnkpIHsKLQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQlpZihuZXdUYXJnZXQgPT0gbnVsbCkgewotCQkJZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotCX0KLQkKLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU5MTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyIGV4dGVuZHMgTm9kZUFkYXB0ZXIgewotCXByaXZhdGUgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJV29ya09yZGVyIG9iajsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlvYmogPSAoV29ya09yZGVyKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IChXb3JrT3JkZXIpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlvYmogPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotLy8JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKW1zZy5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCWhhbmRsZVN1cHByZXNzZWQoYi5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKE1ldGhvZEVsZW1lbnQgZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVTdXBwcmVzc2VkKGJvb2xlYW4gYikgewotCQlpZihiKXsKLQkJCUxpc3QgaW5jb21pbmdzID0gZ2V0Tm9kZSgpLmdldEluY29taW5ncygpOwotCQkJZm9yIChpbnQgaSA9MDsgaTxpbmNvbWluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaW5jb21pbmdzLmdldChpKTsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IG51bGw7Ci0JCQkJaWYob2JqICE9IG51bGwgKXsKLQkJCQkJbGluayA9IChBY3Rpdml0eUVkZ2Upb2JqOwotCQkJCX0KLQkJCQlpZihsaW5rICE9IG51bGwgJiYgbGluay5nZXRTb3VyY2UoKSAhPSBudWxsKXsKLQkJCQkJTm9kZUFkYXB0ZXIgc291cmNlTm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRTb3VyY2UoKSk7Ci0JCQkJCWJvb2xlYW4gb2xkTm90aWZ5MSA9IHNvdXJjZU5vZGVBZGFwdGVyICE9IG51bGwgPyBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsKSBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCQkJCWdldE5vZGUoKS5nZXRJbmNvbWluZ3MoKS5yZW1vdmUobGluayk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZihzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsKSBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5MTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUxpc3Qgb3V0R29pbmdzID0gZ2V0Tm9kZSgpLmdldE91dGdvaW5ncygpOwotCQkJZm9yIChpbnQgaSA9MDsgaTxvdXRHb2luZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gb3V0R29pbmdzLmdldChpKTsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IG51bGw7Ci0JCQkJaWYob2JqICE9IG51bGwgKXsKLQkJCQkJbGluayA9IChBY3Rpdml0eUVkZ2Upb2JqOwotCQkJCX0KLQkJCQlpZihsaW5rICE9IG51bGwgJiYgbGluay5nZXRUYXJnZXQoKSAhPSBudWxsKXsKLQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRUYXJnZXQoKSk7Ci0JCQkJCWJvb2xlYW4gb2xkTm90aWZ5MSA9IG5vZGVBZGFwdGVyICE9IG51bGwgPyBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQkJCWdldE5vZGUoKS5nZXRJbmNvbWluZ3MoKS5yZW1vdmUobGluayk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5MTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfWVsc2V7Ci0JCQlMaXN0IG5vZGVzID0gZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmKGVsZW1lbnQgIT0gZ2V0Tm9kZSgpICYmIHRhcmdldCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCWlmKG1lICE9IG51bGwpewotCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG1lKTsKLQkJCQkJCWFkZE91dGdvaW5nQ29ubmVjdGlvbihtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFNvdXJjZSgpKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gdGhpcyBpcyBhIGRpcmVjdCBsaW5rCi0JCQkvLyBhZGQgbmV3IFdvcmtPcmRlciBvYmplY3QgdG8gVU1BCi0JCQkvLwotCQkJV29ya09yZGVyIG9yZGVyID0gbnVsbDsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoc3VjYywgcHJlZCkgPT0gbnVsbCkgewotCQkJCU5vZGVBZGFwdGVyIHNvdXJjZU5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwkKLQkJCQkvLyBub2RlIGFkYXB0ZXIgY2FuIGJlIE5VTEwgaWYgdGhlIG5vZGUgaXMgbm90IGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBkaWFncmFtCi0JCQkJLy8KLQkJCQlib29sZWFuIHNvdXJjZU5vdGlmeSA9IHNvdXJjZU5vZGVBZGFwdGVyICE9IG51bGwgPyBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoc291cmNlTm9kZUFkYXB0ZXIgIT0gbnVsbCkgc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkvL0NyZWF0ZSBhIHdvcmtvcmRlciBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gZmxhZy4KLQkJCQkJb3JkZXIgPSBhZGREZWZhdWx0V29ya09yZGVyKGxpbmsuZ2V0VGFyZ2V0KCksIHByZWQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKHNvdXJjZU5vZGVBZGFwdGVyICE9IG51bGwpIHNvdXJjZU5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBzb3VyY2VOb3RpZnk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzZXQgdGhlIFdvcmtPcmRlciBhcyB0aGUgZWxlbWVudCBvZiB0aGUgU2VtYW50aWNNb2RlbCBvZiB0aGUKLQkJCS8vIGxpbmsncyBHcmFwaEVkZ2UKLQkJCUJyaWRnZUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIG9yZGVyKTsKLQkJfSAKLQkJZWxzZSBpZiAoQnJpZGdlSGVscGVyLmlzU3luY2hCYXIobGluay5nZXRTb3VyY2UoKSkpIHsKLQkJCS8vIGdldCBhbGwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlcyB0aGF0IGFyZSBjb21taW5nIHRvIHRoaXMKLQkJCS8vIFR5cGVkTm9kZSwgYm90aCBkaXJlY3RseSBhbmQgaW5kaXJlY3RseQotCQkJLy8gYW5kIGNyZWF0ZSB3b3JrIG9yZGVycyB3aXRoIHRoZWlyIGFjdGl2aXR5IGFzIHByZWRlY2Vzc29yCi0JCQkvLwotCi0JCQkvLyBQcmVkZWNlc3NvciBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IGluIGNhc2Ugb2YKLQkJCS8vIFN5bmNyb25pemF0aW9uIEJhciwgbm90IGZvciBEZWNpc2lvblBvaW50LgotCQkJLy8gVE9ETzogcmV2aWV3Ci0JCQkKLQkJCQkKLQkJCQlDb2xsZWN0aW9uIGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIEdldCB0aGUgY29sbGVjdGlvbiBpbmNvbWluZyBjb25uZWN0aW9uIG9mIHN5bmNiYXIgCi0JCQkJLy8gZXhjbHVkaW5nIGRlY2lzaW9ucG9pbnQgaW5jb21pbmcgY29ubmVjdGlvbgotCQkJCUJyaWRnZUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMobGluay5nZXRTb3VyY2UoKSwgYWN0Tm9kZXMpOwotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcihzdWNjLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJCQlOb2RlQWRhcHRlciBzb3VyY2VOb2RlID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQkJYm9vbGVhbiBzb3VyY2VOb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCS8vIENyZWF0ZSBhIHdvcmtvcmRlciBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gZmxhZy4KLQkJCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKGxpbmsuZ2V0VGFyZ2V0KCksIHByZWQpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBzb3VyY2VOb3RpZnk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBBY3Rpdml0eUVkZ2UgYWRkSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCUFjdGl2aXR5RWRnZSBsaW5rID0gc3VwZXIuYWRkSW5jb21pbmdDb25uZWN0aW9uKHNvdXJjZSk7Ci0JCWlmIChsaW5rID09IG51bGwpCi0JCQlyZXR1cm4gbGluazsKLQotCQlXb3JrT3JkZXIgd29ya09yZGVyID0gVW1hVXRpbC5maW5kV29ya09yZGVyKAotCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpLCBzb3VyY2UpOwotCQlCcmlkZ2VIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCB3b3JrT3JkZXIpOwotCi0JCXJldHVybiBsaW5rOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eUVkZ2UgYWRkT3V0Z29pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUFjdGl2aXR5RWRnZSBsaW5rID0gc3VwZXIuYWRkT3V0Z29pbmdDb25uZWN0aW9uKHRhcmdldCk7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldCwgZ2V0RWxlbWVudCgpKTsKLQkJQnJpZGdlSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJLy8gbG9vayBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gd2l0aCBzb3VyY2UgYXMgbGlua2VkIG9iamVjdCBvZiB0aGUKLQkJLy8gc291cmNlIG5vZGUKLQkJLy8KLQkJZm9yIChBY3Rpdml0eUVkZ2UgbGluayA6IGdldE5vZGUoKS5nZXRJbmNvbWluZ3MoKSkgewotCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbAotCQkJCQkmJiBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFNvdXJjZSgpKSA9PSBzb3VyY2UpIHsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm9kZUFkYXB0ZXIgIT0gbnVsbCA/IG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgOiBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCUJyaWRnZUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIG51bGwpOwotCQkJCWdldERpYWdyYW0oKS5nZXRFZGdlcygpLnJlbW92ZShsaW5rKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotLy8JCXN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5UGFyYW1ldGVyTm9kZS5jbGFzcykpIHsKLS8vCQljYXNlIFVNTFBhY2thZ2UuQUNUSVZJVFlfUEFSQU1FVEVSX05PREVfX0VBTk5PVEFUSU9OUzoKLS8vCQkJc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotLy8JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgbm9kZSA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIG1zZy5nZXROb3RpZmllcigpOwotLy8JCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0VHlwZShub2RlKTsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwkJCQkKLS8vCQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIAotLy8JCQkJCQl0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzKEJyaWRnZUhlbHBlci5nZXRUeXBlKGUpKSkgewotLy8JCQkJCS8vIHJlcGxhY2UgdGhlIGN1cnJlbnRseSBsaW5rZWQgbWV0aG9kIGVsZW1lbnQgd2l0aCB0aGUgcmlnaHQgb25lCi0vLwkJCQkJLy8KLS8vCQkJCQlFQ2xhc3MgcmlnaHRUeXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUodHlwZSk7Ci0vLwkJCQkJaWYocmlnaHRUeXBlICE9IG51bGwpIHsKLS8vCQkJCQkJT2JqZWN0IHJpZ2h0RWxlbWVudCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShyaWdodFR5cGUpOwotLy8JCQkJCQlMaXN0IGxpc3QgPSAoKEJyZWFrZG93bkVsZW1lbnQpZSkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQkJbGlzdC5zZXQobGlzdC5pbmRleE9mKGUpLCByaWdodEVsZW1lbnQpOwotLy8JCQkJCQlyZXR1cm47Ci0vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NoYW5nZUJvdW5kc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2NmZiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NoYW5nZUJvdW5kc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQ29tbWFuZCBmb3IgY2hhbmdlIHZpZXcgZGltZW5zaW9ucy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VCb3VuZHNDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGFiZWwgPSAiY2hhbmdlIGJvdW5kcyBjb21tYW5kIGxhYmVsIjsJLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0KLQlwcml2YXRlIFZpZXcgdmlldzsKLQotCXByaXZhdGUgaW50IHdpZHRoOwotCi0JcHJpdmF0ZSBpbnQgaGVpZ2h0OwotCi0JcHJpdmF0ZSBQb2ludCBsb2NhdGlvbjsKLQotCXByaXZhdGUgUG9pbnQgb2xkTG9jYXRpb247Ci0KLQlwcml2YXRlIGludCBvbGRXaWR0aDsKLQotCXByaXZhdGUgaW50IG9sZEhlaWdodDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDaGFuZ2VCb3VuZHNDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgVmlldyB2aWV3LAotCQkJUG9pbnQgbG9jYXRpb24sIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuZG9tYWluID0gZG9tYWluOwotCQl0aGlzLnZpZXcgPSB2aWV3OwotCQl0aGlzLndpZHRoID0gd2lkdGg7Ci0JCXRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuICh0aGlzLndpZHRoICE9IDAgfHwgdGhpcy5oZWlnaHQgIT0gMCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlvbGRMb2NhdGlvbiA9IG5ldyBQb2ludCgpOwotCQkJCQlPYmplY3QgeCA9ICBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpOwotCQkJCQlpZih4ICE9IG51bGwpewotCQkJCQkJb2xkTG9jYXRpb24ueCA9ICgoSW50ZWdlcil4KS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCU9iamVjdCB5ID0gVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKTsKLQkJCQkJaWYoeSAhPSBudWxsKXsKLQkJCQkJCW9sZExvY2F0aW9uLnkgPSAoKEludGVnZXIpIHkpLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJb2xkV2lkdGggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCQkJCW9sZEhlaWdodCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0KLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCWxvY2F0aW9uLngpKTsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCWxvY2F0aW9uLnkpKTsKLQkJCQkJfQotCQkJCQlpZiAod2lkdGggPiAwKSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQl3aWR0aCkpOwotCQkJCQl9Ci0JCQkJCWlmIChoZWlnaHQgPiAwKSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKSwKLQkJCQkJCQkJbmV3IEludGVnZXIoaGVpZ2h0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3IgaW4gY2hhbmdlYm91bmRzIGNvbW1hbmQgOiIsICBlKTsgLy8kTk9OLU5MUy0xJCAKLQkJCXVuZG8oKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKG9sZExvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCWxvY2F0aW9uLngpKTsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCWxvY2F0aW9uLnkpKTsKLQkJCQkJfQotCQkJCQlpZiAob2xkV2lkdGggIT0gd2lkdGgpIHsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCXdpZHRoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKG9sZEhlaWdodCA+IGhlaWdodCkgewotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCksCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKGhlaWdodCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlTZXQ8UmVzb3VyY2U+IHNldCA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlzZXQuYWRkKHZpZXcuZVJlc291cmNlKCkpOwotCQlpZiAoIXNldC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gc2V0OwotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY2hhaW4oCi0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ29weURpYWdyYW1Db21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2Y4MGRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ29weURpYWdyYW1Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogCi0gKiBJdCBkb2VzIGNvcHkgdGhlIGRpYWdyYW0gZm9yIHRoZSBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvcHlEaWFncmFtQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248Pz4gZWxlbWVudHM7Ci0KLQlwcml2YXRlIE1hcDxFT2JqZWN0LCBFT2JqZWN0PiBjb3B5VG9PcmlnaW5hbE1hcDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxEaWFncmFtPiBjb3BpZWRFbGVtZW50czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0KLQlwcml2YXRlIERpYWdyYW1NYW5hZ2VyIG1ncjsKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCi0JcHJpdmF0ZSBNYXA8RU9iamVjdCwgRU9iamVjdD4gb3JpZ2luYWxUb0NvcHlNYXA7Ci0JCi0JcHJpdmF0ZSBDb3B5RGlhZ3JhbUNvbW1hbmQoQ29sbGVjdGlvbjw/PiBlbGVtZW50cywgUHJvY2VzcyB0YXJnZXRQcm9jZXNzKSB7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy50YXJnZXRQcm9jZXNzID0gdGFyZ2V0UHJvY2VzczsKLQotCQkvLyBnZXQgZGlhZ3JhbSBtYW5hZ2VyIGFuZCBkb21haW4KLQkJbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UodGFyZ2V0UHJvY2VzcywgdGhpcyk7Ci0JCWRvbWFpbiA9IG1nci5nZXRFZGl0aW5nRG9tYWluKCk7CQkJCQotCX0KLQkKLQlwdWJsaWMgQ29weURpYWdyYW1Db21tYW5kKENvbGxlY3Rpb248Pz4gZWxlbWVudHMsIEhlbHBlciBjb3B5SGVscGVyLAotCQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzKSB7Ci0JCXRoaXMoZWxlbWVudHMsIHRhcmdldFByb2Nlc3MpOwotCQl0aGlzLm9yaWdpbmFsVG9Db3B5TWFwID0gY29weUhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIENvcHlEaWFncmFtQ29tbWFuZChDb2xsZWN0aW9uPD8+IGVsZW1lbnRzLCBNYXA8RU9iamVjdCwgRU9iamVjdD4gY29weVRvT3JpZ2luYWxNYXAsCi0JCQlQcm9jZXNzIHRhcmdldFByb2Nlc3MpIHsKLQkJdGhpcyhlbGVtZW50cywgdGFyZ2V0UHJvY2Vzcyk7Ci0JCXRoaXMuY29weVRvT3JpZ2luYWxNYXAgPSBjb3B5VG9PcmlnaW5hbE1hcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZG9FeGVjdXRlKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcDw/LCA/PiBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJaWYoY29weVRvT3JpZ2luYWxNYXAgPT0gbnVsbCAmJiBvcmlnaW5hbFRvQ29weU1hcCAhPSBudWxsKSB7Ci0JCQljb3B5VG9PcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwPEVPYmplY3QsIEVPYmplY3Q+KCk7Ci0JCQlmb3IgKE1hcC5FbnRyeTxFT2JqZWN0LCBFT2JqZWN0PiBlbnRyeSA6IG9yaWdpbmFsVG9Db3B5TWFwLmVudHJ5U2V0KCkpIHsKLQkJCQljb3B5VG9PcmlnaW5hbE1hcC5wdXQoZW50cnkuZ2V0VmFsdWUoKSwgZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5VG9PcmlnaW5hbE1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvRXhlY3V0ZSgpIHsJCQotCQlpZiAoY29waWVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJY29waWVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW0+KCk7Ci0JCX0gZWxzZSB7Ci0JCQljb3BpZWRFbGVtZW50cy5jbGVhcigpOwotCQl9Ci0KLQkJRGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVN2YyA9IG5ldyBEaWFncmFtU2VydmljZSgpOwotCQl0cnkgewotCQkJZm9yIChPYmplY3QgZSA6IGVsZW1lbnRzKSB7Ci0JCQkJT2JqZWN0IG9yaWcgPSBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpLmdldChlKTsKLQkJCQlpZiAob3JpZyAhPSBudWxsICYmIG9yaWcgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBlICE9IG51bGwKLQkJCQkJCSYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBY3Rpdml0eSBjb3B5QWN0aXZpdHkgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJCUFjdGl2aXR5IG9yaWdBY3Rpdml0eSA9IChBY3Rpdml0eSkgb3JpZzsKLQotCQkJCQlDb2xsZWN0aW9uPERpYWdyYW0+IGRpYWdyYW1zID0gZGlhZ3JhbVN2Yy5nZXREaWFncmFtcyhvcmlnQWN0aXZpdHkpOwotCQkJCQlpZiAoZGlhZ3JhbXMgIT0gbnVsbCAmJiAhZGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGRpYWdyYW1zKSB7Ci0JCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQkvLyBjb3B5IHRoZSBkaWFncmFtCi0JCQkJCQkJCURpYWdyYW0gZGlhZ3JhbUNvcHkgPSAoRGlhZ3JhbSkgRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5jb3B5RGlhZ3JhbShkb21haW4sIGRpYWdyYW0pOwotCi0JCQkJCQkJCS8vIHVwZGF0ZSBjaGlsZHJlbiByZWZlcmVuY2VzCi0JCQkJCQkJCXVwZGF0ZVJlZmVyZW5jZXMoZGlhZ3JhbUNvcHkpOwotCi0JCQkJCQkJCS8vIGFzc29jaWF0ZSB3aXRoIHRoZSBhY3Rpdml0eQotCQkJCQkJCQlpbnQgZGlhZ3JhbVR5cGUgPSBEaWFncmFtSGVscGVyCi0JCQkJCQkJCQkJLmdldERpYWdyYW1UeXBlKGRpYWdyYW1Db3B5KTsKLQkJCQkJCQkJbWdyLmFzc29jaWF0ZShkaWFncmFtQ29weSwgZGlhZ3JhbVR5cGUsCi0JCQkJCQkJCQkJKEFjdGl2aXR5KSBjb3B5QWN0aXZpdHkpOwotCi0JCQkJCQkJCWNvcGllZEVsZW1lbnRzLmFkZChkaWFncmFtQ29weSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWRpYWdyYW1TdmMuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSBlQW5ub3RhdGlvbnMgcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBjb3B5Ci0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUmVmZXJlbmNlcyhEaWFncmFtIGNvcHkpIHsKLQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShjb3B5KTsKLQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCS8vIGNvbGxlY3QgYWxsIGNoaWxkcmVuIGZpcnN0IGUuZy4gZm9yIEFjdGl2aXR5UGFydGl0aW9uCi0JCS8vIHdlIGRvbid0IGhhdmUgcGFydGl0aW9uIGludG8gcGFydGl0aW9uIHNvIGp1c3QgZ2V0dGluZyBvbmUgbGV2ZWwgc3ViLWNoaWxkcmVuCi0JCS8vIGFyZSBlbm91Z2ggZm9yIG5vdy4KLQkJZm9yIChJdGVyYXRvcjw/PiBpdG9yID0gY29weS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0b3IubmV4dCgpOwotCQkJRU9iamVjdCBvYmogPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCWNoaWxkcmVuLmFkZChub2RlKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbil7Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKG5vZGUuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjw/PiBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0KLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdG9yLm5leHQoKTsKLQkJCUVPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0KLQkJCWlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHsKLQkJCQkJRU1vZGVsRWxlbWVudCBtb2RlbEVsZW1lbnQgPSAoRU1vZGVsRWxlbWVudCkgb2JqOwotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihtb2RlbEVsZW1lbnQsCi0JCQkJCQkJCQl0YXJnZXRQcm9jZXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCi0JCQkJCU9iamVjdCBtYXBwZWRNZXRob2RFbGVtZW50ID0gZ2V0Q29waWVkRWxlbWVudChtZSk7Ci0JCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbihtb2RlbEVsZW1lbnQsCi0JCQkJCQkJCShNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfSBlbHNlIGlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJCQlOb2RlQ29udGFpbmVyIG5vZGVDb250YWluZXIgPSAoTm9kZUNvbnRhaW5lcikgb2JqOwotCQkJCQkvLyBkbyBtYXBwaW5nIGZvciBub2RlY29udGFpbmVyCi0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBub2RlQ29udGFpbmVyLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBnZXRDb3BpZWRFbGVtZW50KG1lKTsKLQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJbm9kZUNvbnRhaW5lcgotCQkJCQkJCQkuc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCX0KLQotCQkJCQkvLyBkbyBtYXBwaW5nIGZvciBpdHMgY2hpbGRyZW4KLQkJCQkJTGlzdDw/PiBub2RlcyA9IG5vZGVDb250YWluZXIuZ2V0Tm9kZXMoKTsKLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlOYW1lZE5vZGUgbmFtZWROb2RlID0gKE5hbWVkTm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJCQkJbWUgPSBuYW1lZE5vZGUuZ2V0TGlua2VkRWxlbWVudCgpOwotCi0JCQkJCQltYXBwZWRNZXRob2RFbGVtZW50ID0gZ2V0Q29waWVkRWxlbWVudChtZSk7Ci0JCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJbmFtZWROb2RlCi0JCQkJCQkJCQkuc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGRpYWdyYW1UeXBlID09IElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQlOYW1lZE5vZGUgbmFtZWROb2RlID0gKE5hbWVkTm9kZSkgb2JqOwotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gbmFtZWROb2RlLmdldExpbmtlZEVsZW1lbnQoKTsKLQotCQkJCQlPYmplY3QgbWFwcGVkTWV0aG9kRWxlbWVudCA9IGdldENvcGllZEVsZW1lbnQobWUpOwotCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQluYW1lZE5vZGUKLQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvcGllZCBlbGVtZW50IGZyb20gdGhlIG1hcAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldENvcGllZEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYob3JpZ2luYWxUb0NvcHlNYXAgPT0gbnVsbCAmJiBjb3B5VG9PcmlnaW5hbE1hcCAhPSBudWxsKSB7Ci0JCQlvcmlnaW5hbFRvQ29weU1hcCA9IG5ldyBIYXNoTWFwPEVPYmplY3QsIEVPYmplY3Q+KCk7Ci0JCQlmb3IgKE1hcC5FbnRyeTxFT2JqZWN0LCBFT2JqZWN0PiBlbnRyeSA6IGNvcHlUb09yaWdpbmFsTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlvcmlnaW5hbFRvQ29weU1hcC5wdXQoZW50cnkuZ2V0VmFsdWUoKSwgZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvcmlnaW5hbFRvQ29weU1hcCAhPSBudWxsID8gb3JpZ2luYWxUb0NvcHlNYXAuZ2V0KGVsZW1lbnQpIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghKGNvcGllZEVsZW1lbnRzID09IG51bGwgfHwgY29waWVkRWxlbWVudHMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZvciAoRGlhZ3JhbSBkaWFncmFtIDogY29waWVkRWxlbWVudHMpIHsKLQkJCQkJCQkJbWdyLmdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKQotCQkJCQkJCQkJCS5yZW1vdmUoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJCQltZ3IuZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShkaWFncmFtKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCQljb3BpZWRFbGVtZW50cy5jbGVhcigpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb3BpZWRFbGVtZW50cyA9PSBudWxsIHx8IGNvcGllZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJLy8gY29tbWFuZCBpcyBub3QgZXhlY3V0ZWQgeWV0Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJSGFzaFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQotCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGNvcGllZEVsZW1lbnRzKSB7Ci0JCQlpZihkaWFncmFtICE9IG51bGwgJiYgZGlhZ3JhbS5lUmVzb3VyY2UoKSAhPSBudWxsKQotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkaWFncmFtLmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0JCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChtZ3IgIT0gbnVsbCkKLQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9Db3B5RGlhZ3JhbUZvckRlZXBDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9Db3B5RGlhZ3JhbUZvckRlZXBDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY0MmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ29weURpYWdyYW1Gb3JEZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNvcHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYXRpb25TZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogCi0gKiBVcGRhdGVzIGRpYWdyYW1zIG9mIHRoZSBhY3Rpdml0eSdzIGRlZXAgY29waWVzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29weURpYWdyYW1Gb3JEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPD8+IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBNYXA8Pyw/PiBjb3B5VG9PcmlnaW5hbE1hcDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxEaWFncmFtPiBjb3BpZWRFbGVtZW50czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0KLQlwcml2YXRlIERpYWdyYW1NYW5hZ2VyIG1ncjsKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCi0JcHJpdmF0ZSBDb3B5SGVscGVyIGNvcHlIZWxwZXI7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHNyY1Byb2Nlc3M7Ci0KLQlwcml2YXRlIEhhc2hNYXA8QnJlYWtkb3duRWxlbWVudCwgU3RyaW5nPiBjb3B5VG9XcmFwcGVyUGF0aE1hcDsKLQkKLQlwdWJsaWMgQ29weURpYWdyYW1Gb3JEZWVwQ29weUNvbW1hbmQoQ29sbGVjdGlvbjw/PiBlbGVtZW50cywgTWFwPD8sID8+IGNvcHlUb09yaWdpbmFsTWFwLAotCQkJUHJvY2VzcyBzcmNQcm9jZXNzLCBQcm9jZXNzIHRhcmdldFByb2Nlc3MsIENvcHlIZWxwZXIgY29weUhlbHBlciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29weUhlbHBlciA9IGNvcHlIZWxwZXI7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnNyY1Byb2Nlc3MgPSBzcmNQcm9jZXNzOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMuY29weVRvT3JpZ2luYWxNYXAgPSBjb3B5VG9PcmlnaW5hbE1hcDsKLQkJdGhpcy50YXJnZXRQcm9jZXNzID0gdGFyZ2V0UHJvY2VzczsKLQotCQkvLyBnZXQgZGlhZ3JhbSBtYW5hZ2VyIGFuZCBkb21haW4KLQkJbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UodGFyZ2V0UHJvY2VzcywgdGhpcyk7Ci0JCWRvbWFpbiA9IG1nci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb0V4ZWN1dGUoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9FeGVjdXRlKCkgewkJCi0JCWlmIChjb3BpZWRFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQljb3BpZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RGlhZ3JhbT4oKTsKLQkJfSBlbHNlIHsKLQkJCWNvcGllZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQkJY29weVRvV3JhcHBlclBhdGhNYXAgPSBuZXcgSGFzaE1hcDxCcmVha2Rvd25FbGVtZW50LCBTdHJpbmc+KCk7Ci0JCWlmIChjb3B5SGVscGVyICE9IG51bGwpIHsKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQnJlYWtkb3duRWxlbWVudD4gZW50cnkgOiBjb3B5SGVscGVyCi0JCQkJCS5nZXRXcmFwcGVyUGF0aFRvQ29weU1hcCgpLmVudHJ5U2V0KCkpIHsKLQkJCQljb3B5VG9XcmFwcGVyUGF0aE1hcC5wdXQoZW50cnkuZ2V0VmFsdWUoKSwgZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0JCURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TdmMgPSBuZXcgRGlhZ3JhbVNlcnZpY2UoKTsKLQkJdHJ5IHsJCQkKLQkJCWZvciAoT2JqZWN0IGUgOiBlbGVtZW50cykgewotCQkJCU9iamVjdCBvcmlnID0gY29weVRvT3JpZ2luYWxNYXAuZ2V0KGUpOwotCQkJCWlmIChvcmlnICE9IG51bGwgJiYgb3JpZyBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIGUgIT0gbnVsbAotCQkJCQkJJiYgZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGNvcHlBY3Rpdml0eSA9IChBY3Rpdml0eSkgZTsKLQkJCQkJQWN0aXZpdHkgb3JpZ0FjdGl2aXR5ID0gKEFjdGl2aXR5KSBvcmlnOwotCi0JCQkJCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkaWFncmFtU3ZjLmdldERpYWdyYW1zKG9yaWdBY3Rpdml0eSk7Ci0JCQkJCWlmIChkaWFncmFtcyAhPSBudWxsICYmICFkaWFncmFtcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoRGlhZ3JhbSBkaWFncmFtIDogZGlhZ3JhbXMpIHsKLQkJCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIGNvcHkgdGhlIGRpYWdyYW0KLQkJCQkJCQkJRGlhZ3JhbSBkaWFncmFtQ29weSA9IChEaWFncmFtKSBEaWFncmFtSGVscGVyCi0JCQkJCQkJCQkJLmNvcHlEaWFncmFtKGRvbWFpbiwgZGlhZ3JhbSk7Ci0KLQkJCQkJCQkJLy8gdXBkYXRlIGNoaWxkcmVuIHJlZmVyZW5jZXMKLQkJCQkJCQkJdXBkYXRlUmVmZXJlbmNlcyhkaWFncmFtQ29weSwgY29weUFjdGl2aXR5LCBvcmlnQWN0aXZpdHkpOwotCi0JCQkJCQkJCS8vIGFzc29jaWF0ZSB3aXRoIHRoZSBhY3Rpdml0eQotCQkJCQkJCQlpbnQgZGlhZ3JhbVR5cGUgPSBEaWFncmFtSGVscGVyCi0JCQkJCQkJCQkJLmdldERpYWdyYW1UeXBlKGRpYWdyYW1Db3B5KTsKLQkJCQkJCQkJbWdyLmFzc29jaWF0ZShkaWFncmFtQ29weSwgZGlhZ3JhbVR5cGUsCi0JCQkJCQkJCQkJKEFjdGl2aXR5KSBjb3B5QWN0aXZpdHkpOwotCi0JCQkJCQkJCWNvcGllZEVsZW1lbnRzLmFkZChkaWFncmFtQ29weSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWRpYWdyYW1TdmMuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbGVhclJlYWRPbmx5KG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgbm9kZSkgewotCQlub2RlLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKE5vZGVDb250YWluZXIpbm9kZSkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIGNoaWxkID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWNoaWxkLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBnZXRPcmlnaW5hbFdyYXBwZXIoQWN0aXZpdHkgY29weSkgewotCQlTdHJpbmcgd3JhcHBlclBhdGggPSBjb3B5VG9XcmFwcGVyUGF0aE1hcC5nZXQoY29weSk7Ci0JCWlmKHdyYXBwZXJQYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmKHNyY1Byb2Nlc3MgIT0gbnVsbCkgewotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihzcmNQcm9jZXNzKTsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCUNvbmZpZ3VyYXRpb25TZXR0ZXIgY29uZmlnU2V0dGVyID0gbmV3IENvbmZpZ3VyYXRpb25TZXR0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJdHJ5IHsKLQkJCQljb25maWdTZXR0ZXIuc2V0KGNvbmZpZyk7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIod3JhcHBlclBhdGgsICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlBcnJheUxpc3Q8U3RyaW5nPiBndWlkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJZ3VpZExpc3QuYWRkKHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQkJfQotCQkJCVN0cmluZ1tdIGd1aWRQYXRoID0gbmV3IFN0cmluZ1tndWlkTGlzdC5zaXplKCldOwotCQkJCWd1aWRMaXN0LnRvQXJyYXkoZ3VpZFBhdGgpOwotCQkJCU9iamVjdCBvID0gc3VwcHJlc3Npb24uZ2V0T2JqZWN0QnlQYXRoKGd1aWRQYXRoLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJaWYobyBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXJldHVybiAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG87Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkNvcHlEaWFncmFtQ29tbWFuZC5nZXRPcmlnaW5hbFdyYXBwZXIoKTogaW52YWxpZCB3cmFwcGVyIGZvciBjb3B5IGFjdGl2aXR5OiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZ2V0QnJlYWtkb3duRWxlbWVudHMoQWN0aXZpdHkgb3JpZ0FjdGl2aXR5LCBBY3Rpdml0eSBjb3B5QWN0aXZpdHkpIHsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGdldE9yaWdpbmFsV3JhcHBlcihjb3B5QWN0aXZpdHkpOwotCQlPYmplY3Qgb2JqZWN0ID0gd3JhcHBlciAhPSBudWxsID8gd3JhcHBlciA6IG9yaWdBY3Rpdml0eTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdHJ5IHsKLQkJCWNvbmZpZ1NldHRlci5zZXQoY29uZmlnKTsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsJCQkJCQotCQkJQ29sbGVjdGlvbjw/PiBvcmlnQ2hpbGRyZW4gPSBpcC5nZXRDaGlsZHJlbihvcmlnQWN0aXZpdHkpOwotCQkJQ29sbGVjdGlvbjxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQkJCWZvcihPYmplY3Qgb3JpZ0NoaWxkIDogb3JpZ0NoaWxkcmVuKSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvcmlnQ2hpbGQpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnRzLmFkZCgoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBCcmVha2Rvd25FbGVtZW50IGdldEJyZWFrZG93bkVsZW1lbnQoQ29sbGVjdGlvbjxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50cywgQWN0aXZpdHkgYmFzZSkgewotCQlmb3IgKEJyZWFrZG93bkVsZW1lbnQgZSA6IGVsZW1lbnRzKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZpbmRfYmFzZToKLQkJCQlmb3IoVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsgdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7IHZlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJCWlmKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBiYXNlKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX2Jhc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoZm91bmQpIHsKLQkJCQkJcmV0dXJuIChCcmVha2Rvd25FbGVtZW50KSBlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb3B5RmluZGVyIHsKLQkJcHJpdmF0ZSBBY3Rpdml0eSBvcmlnQWN0aXZpdHk7Ci0JCXByaXZhdGUgQWN0aXZpdHkgY29weUFjdGl2aXR5OwotCQlwcml2YXRlIE1hcDxCcmVha2Rvd25FbGVtZW50LCBCcmVha2Rvd25FbGVtZW50PiBvcmlnaW5hbFRvQ29weU1hcDsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzOwotCQkKLQkJcHJpdmF0ZSBDb3B5RmluZGVyKEFjdGl2aXR5IG9yaWdBY3Rpdml0eSwgQWN0aXZpdHkgY29weUFjdGl2aXR5KSB7Ci0JCQl0aGlzLm9yaWdBY3Rpdml0eSA9IG9yaWdBY3Rpdml0eTsKLQkJCXRoaXMuY29weUFjdGl2aXR5ID0gY29weUFjdGl2aXR5OwotCQl9Ci0JCQotCQlwdWJsaWMgTWFwPEJyZWFrZG93bkVsZW1lbnQsIEJyZWFrZG93bkVsZW1lbnQ+IGdldE9yaWdpbmFsVG9Db3B5TWFwKCkgewotCQkJaWYob3JpZ2luYWxUb0NvcHlNYXAgPT0gbnVsbCkgewotCQkJCW9yaWdpbmFsVG9Db3B5TWFwID0gbmV3IEhhc2hNYXA8QnJlYWtkb3duRWxlbWVudCwgQnJlYWtkb3duRWxlbWVudD4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29weUFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlCcmVha2Rvd25FbGVtZW50IG9yaWcgPSAoQnJlYWtkb3duRWxlbWVudCkgY29weUhlbHBlci5nZXRPcmlnaW5hbChlKTsKLQkJCQkJb3JpZ2luYWxUb0NvcHlNYXAucHV0KG9yaWcsIGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBvcmlnaW5hbFRvQ29weU1hcDsKLQkJfQotCQkKLQkJQnJlYWtkb3duRWxlbWVudCBmaW5kQ29weShCcmVha2Rvd25FbGVtZW50IG9yaWdpbmFsKSB7Ci0JCQlPYmplY3QgY29weSA9IGdldE9yaWdpbmFsVG9Db3B5TWFwKCkuZ2V0KG9yaWdpbmFsKTsKLQkJCWlmKGNvcHkgPT0gbnVsbCkgewotCQkJCWlmKG9yaWdpbmFsIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJLy8gbWUgbXVzdCBiZSBhIGJhc2UgZWxlbWVudCBvZiBhIGxvY2FsIGNvbnRyaWJ1dG9yIG9yIHJlcGxhY2VyCi0JCQkJCS8vIAotCQkJCQlpZihlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50cyA9IGdldEJyZWFrZG93bkVsZW1lbnRzKG9yaWdBY3Rpdml0eSwgY29weUFjdGl2aXR5KTsKLQkJCQkJfQotCQkJCQljb3B5ID0gZ2V0QnJlYWtkb3duRWxlbWVudChlbGVtZW50cywgKEFjdGl2aXR5KSBvcmlnaW5hbCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChCcmVha2Rvd25FbGVtZW50KSBjb3B5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGVBbm5vdGF0aW9ucyByZWZlcmVuY2VzCi0JICogCi0JICogQHBhcmFtIGNvcHkKLQkgKiBAcGFyYW0gb3JpZ0FjdGl2aXR5IAotCSAqIEBwYXJhbSBjb3B5QWN0aXZpdHkgCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUmVmZXJlbmNlcyhEaWFncmFtIGNvcHksIEFjdGl2aXR5IGNvcHlBY3Rpdml0eSwgQWN0aXZpdHkgb3JpZ0FjdGl2aXR5KSB7Ci0JCWludCBkaWFncmFtVHlwZSA9IERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoY29weSk7Ci0JCUNvcHlGaW5kZXIgY29weUZpbmRlciA9IG5ldyBDb3B5RmluZGVyKG9yaWdBY3Rpdml0eSwgY29weUFjdGl2aXR5KTsKLQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCS8vIGNvbGxlY3QgYWxsIGNoaWxkcmVuIGZpcnN0IGUuZy4gZm9yIEFjdGl2aXR5UGFydGl0aW9uCi0JCS8vIHdlIGRvbid0IGhhdmUgcGFydGl0aW9uIGludG8gcGFydGl0aW9uIHNvIGp1c3QgZ2V0dGluZyBvbmUgbGV2ZWwgc3ViLWNoaWxkcmVuCi0JCS8vIGFyZSBlbm91Z2ggZm9yIG5vdy4KLQkJZm9yIChJdGVyYXRvcjw/PiBpdG9yID0gY29weS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0b3IubmV4dCgpOwotCQkJRU9iamVjdCBvYmogPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCWNoaWxkcmVuLmFkZChub2RlKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbil7Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKG5vZGUuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjw/PiBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRvci5uZXh0KCk7Ci0JCQlFT2JqZWN0IG9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCi0JCQlpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSB7Ci0JCQkJCUVNb2RlbEVsZW1lbnQgbW9kZWxFbGVtZW50ID0gKEVNb2RlbEVsZW1lbnQpIG9iajsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24obW9kZWxFbGVtZW50LAotCQkJCQkJCQkJdGFyZ2V0UHJvY2Vzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYobWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7CQkJCQkJCi0JCQkJCQlCcmVha2Rvd25FbGVtZW50IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBjb3B5RmluZGVyLmZpbmRDb3B5KChCcmVha2Rvd25FbGVtZW50KSBtZSk7Ci0KLQkJCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24obW9kZWxFbGVtZW50LCBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSB7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCQljbGVhclJlYWRPbmx5KChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKW9iaik7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQkJCU5vZGVDb250YWluZXIgbm9kZUNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKSBvYmo7Ci0JCQkJCS8vIGRvIG1hcHBpbmcgZm9yIG5vZGVjb250YWluZXIKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IG5vZGVDb250YWluZXIuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgbWFwcGVkTWV0aG9kRWxlbWVudCA9IG51bGw7Ci0JCQkJCWlmKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJbWFwcGVkTWV0aG9kRWxlbWVudCA9IGNvcHlGaW5kZXIuZmluZENvcHkoKEJyZWFrZG93bkVsZW1lbnQpIG1lKTsKLQkJCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlub2RlQ29udGFpbmVyCi0JCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gZG8gbWFwcGluZyBmb3IgaXRzIGNoaWxkcmVuCi0JCQkJCUxpc3Q8Pz4gbm9kZXMgPSBub2RlQ29udGFpbmVyLmdldE5vZGVzKCk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQkJTmFtZWROb2RlIG5hbWVkTm9kZSA9IChOYW1lZE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCQkJCW1lID0gbmFtZWROb2RlLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJCWlmIChtZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQltYXBwZWRNZXRob2RFbGVtZW50ID0gY29weUZpbmRlcgotCQkJCQkJCQkJLmZpbmRDb3B5KChCcmVha2Rvd25FbGVtZW50KSBtZSk7Ci0JCQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCQluYW1lZE5vZGUKLQkJCQkJCQkJCQkuc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkgewotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkJY2xlYXJSZWFkT25seSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSlvYmopOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKSBvYmo7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBuYW1lZE5vZGUuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlpZiAobWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlPYmplY3QgbWFwcGVkTWV0aG9kRWxlbWVudCA9IGNvcHlGaW5kZXIuZmluZENvcHkoKEJyZWFrZG93bkVsZW1lbnQpIG1lKTsKLQkJCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQluYW1lZE5vZGUKLQkJCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCEoY29waWVkRWxlbWVudHMgPT0gbnVsbCB8fCBjb3BpZWRFbGVtZW50cy5pc0VtcHR5KCkpKSB7Ci0JCQl0cnkgewotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29waWVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQotCQkJCQkJCQltZ3IuZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpCi0JCQkJCQkJCQkJLnJlbW92ZShkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQkJCW1nci5nZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0pOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJCWNvcGllZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCWlmIChERUJVRykgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29waWVkRWxlbWVudHMgPT0gbnVsbCB8fCBjb3BpZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGNvbW1hbmQgaXMgbm90IGV4ZWN1dGVkIHlldAotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJSGFzaFNldDxPYmplY3Q+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvcGllZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsICYmIGRpYWdyYW0uZVJlc291cmNlKCkgIT0gbnVsbCkKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGlhZ3JhbS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobWdyICE9IG51bGwpCi0JCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxODEzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5lZGl0b3IuRWRpdG9yU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIENvbW1hbmQgdG8gZGVsZXRlIHRoZSBkaWFncmFtL2RpYWdyYW0gZWxlbWVudCBvZiBnaXZlbiBBY3Rpdml0eS9DUCwgdGhpcyBjb21tYW5kIGlzIHBlcmZvcm1lZAotICogdGhyb3VnaCBuZXN0ZWQgY29tbWFuZHMgaW4ge0BsaW5rIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kfS4gIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVEaWFncmFtQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHNUb1JlbW92ZTsKLQlwcml2YXRlIFByb2Nlc3MgdGFyZ2V0UHJvY2VzczsKLQlwcml2YXRlIERpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZURpYWdyYW1Db21tYW5kKENvbGxlY3Rpb24gZWxlbWVudHNUb1JlbW92ZSwgUHJvY2VzcyB0YXJnZXRQcm9jZXNzKSB7Ci0JCXRoaXMuZWxlbWVudHNUb1JlbW92ZSA9IGVsZW1lbnRzVG9SZW1vdmU7Ci0JCXRoaXMudGFyZ2V0UHJvY2VzcyA9IHRhcmdldFByb2Nlc3M7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TdmMgPSBuZXcgRGlhZ3JhbVNlcnZpY2UoKTsKLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQ29sbGVjdGlvbjxEaWFncmFtPiBkaWFncmFtcyA9IGRpYWdyYW1TdmMKLQkJCQkJCQkuZ2V0RGlhZ3JhbXMoKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gQmVmb3JlIGRlbGV0aW5nIGNsb3NlIG9wZW5lZCBkaWFncmFtIGVkaXRvcnMuCi0JCQkJCQkJY2xvc2VEaWFncmFtRWRpdG9yKGRpYWdyYW0pOwotCQkJCQkJCS8vIERlbGV0ZSBEaWFncmFtLgotCQkJCQkJCURpYWdyYW1IZWxwZXIuZGVsZXRlRGlhZ3JhbShkaWFncmFtLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWRpYWdyYW1TdmMuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQlwcml2YXRlIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKCkgewotCQlpZihkTWdyID09IG51bGwpIHsKLQkJCWRNZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZSh0YXJnZXRQcm9jZXNzLCB0aGlzKTsKLQkJfQotCQlyZXR1cm4gZE1ncjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJRGlhZ3JhbU1hbmFnZXIgZE1nciA9IGdldERpYWdyYW1NYW5hZ2VyKCk7Ci0JCUhhc2hTZXQ8T2JqZWN0PiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJYm9vbGVhbiBmaWxlRXhpc3QgPSB0cnVlOwotCQl0cnkgewotCQkJaWYgKGRNZ3IgIT0gbnVsbCAmJiBkTWdyLmdldFJlc291cmNlKCkgIT0gbnVsbAotCQkJCQkmJiAhZE1nci5nZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKGRNZ3IKLQkJCQkJCS5nZXRSZXNvdXJjZSgpLmdldFVSSSgpKSk7Ci0JCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCQlmaWxlRXhpc3QgPSBmYWxzZTsKLQkJCQlpZiAoZmlsZUV4aXN0KQotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZE1nci5nZXRSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiB0YXJnZXRQcm9jZXNzICE9IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGRNZ3IgIT0gbnVsbCl7Ci0JCQlkTWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNsb3NlRGlhZ3JhbUVkaXRvcihEaWFncmFtIGRpYWdyYW0pewotCQlMaXN0IGVkaXRvcnMgPSBFZGl0b3JTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UmVnaXN0ZXJlZEVkaXRvclBhcnRzKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZWRpdG9ycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcikgewotCQkJCURpYWdyYW1FZGl0b3IgZGlhZ3JhbUVkaXRvciA9ICgoRGlhZ3JhbUVkaXRvcikgb2JqKTsKLQkJCQlpZiAoZGlhZ3JhbUVkaXRvci5nZXREaWFncmFtKCkuZXF1YWxzKGRpYWdyYW0pKSB7Ci0JCQkJCS8vaXQncyBhbHJlYWR5IG9wZW4sIGp1c3QgY2xvc2UgaXQuCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkuYWN0aXZhdGUoZGlhZ3JhbUVkaXRvcik7Ci0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUVkaXRvcihkaWFncmFtRWRpdG9yLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9EZWxldGVEaWFncmFtTm9kZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTgzOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9EZWxldGVEaWFncmFtTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQ29tbWFuZCB0byBkZWxldGUgZGlhZ3JhbSBub2RlcyBvZiB0aGUgZGVsZXRlZCBicmVha2Rvd24gZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVEaWFncmFtTm9kZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPD8+IGJyZWFrZG93bkVsZW1lbnRzOwotCXByaXZhdGUgRGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVN2YzsKLQotCXB1YmxpYyBEZWxldGVEaWFncmFtTm9kZUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIENvbGxlY3Rpb248Pz4gYnJlYWtkb3duRWxlbWVudHMpIHsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmJyZWFrZG93bkVsZW1lbnRzID0gYnJlYWtkb3duRWxlbWVudHM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZihkaWFncmFtU3ZjICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXIgbWdyID0gZGlhZ3JhbVN2Yy5nZXREaWFncmFtTWFuYWdlcihhY3Rpdml0eSk7Ci0JCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gbWdyLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJQ29sbGVjdGlvbjxEaWFncmFtPiBkaWFncmFtcyA9IGRpYWdyYW1TdmMuZ2V0RGlhZ3JhbXMoYWN0aXZpdHkpOwotCQlDb2xsZWN0aW9uPFZpZXc+IHZpZXdzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KCk7Ci0JCWZvciAoRGlhZ3JhbSBkaWFncmFtIDogZGlhZ3JhbXMpIHsKLQkJCUFic3RyYWN0VHJlZUl0ZXJhdG9yPFZpZXc+IGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPFZpZXc+KGRpYWdyYW0sIGZhbHNlKSB7Ci0KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgVmlldz4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCQlyZXR1cm4gKChWaWV3KW9iamVjdCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVmlldyB2aWV3ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKGJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHZpZXcsIGFjdGl2aXR5KSkpIHsKLQkJCQkJdmlld3NUb0RlbGV0ZS5hZGQodmlldyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKCF2aWV3c1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJZm9yIChWaWV3IHZpZXcgOiB2aWV3c1RvRGVsZXRlKSB7Ci0JCQkJVmlld1V0aWwuZGVzdHJveSh2aWV3KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewkJCi0JCWRpYWdyYW1TdmMgPSBuZXcgRGlhZ3JhbVNlcnZpY2UoKTsKLQkJQ29sbGVjdGlvbjxEaWFncmFtPiBkaWFncmFtcyA9IGRpYWdyYW1TdmMuZ2V0RGlhZ3JhbXMoYWN0aXZpdHkpOwotCQlyZXR1cm4gIWRpYWdyYW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlhY3Rpdml0eSA9IG51bGw7Ci0JCWJyZWFrZG93bkVsZW1lbnRzID0gbnVsbDsKLQkJZGlhZ3JhbVN2Yy5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDU5NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eURyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNvcHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFjdGl2aXR5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5lc3RlZENvbW1hbmRQcm92aWRlciBpbXBsZW1lbnRzIElOZXN0ZWRDb21tYW5kUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyI2NyZWF0ZU5lc3RlZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBBY3Rpdml0eURyb3BDb21tYW5kKSB7Ci0JCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9IChBY3Rpdml0eURyb3BDb21tYW5kKSBjb21tYW5kOwotCQkJaWYgKElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSA9PSBjbWQuZ2V0VHlwZSgpKQotCQkJCXJldHVybiBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yQ29weShjbWQpOwotCQkJZWxzZSBpZiAoSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkgPT0gY21kLmdldFR5cGUoKSkKLQkJCQlyZXR1cm4gY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KGNtZCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFByb2Nlc3NEZWVwQ29weUNvbW1hbmQpIHsKLQkJCVByb2Nlc3NEZWVwQ29weUNvbW1hbmQgY21kID0gKFByb2Nlc3NEZWVwQ29weUNvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlQcm9jZXNzIGRlZXBDb3B5ID0gbnVsbDsKLQkJCUNvbGxlY3Rpb248Pz4gcmVzdWx0ID0gY21kLmdldFJlc3VsdCgpOwotCQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQlkZWVwQ29weSA9IChQcm9jZXNzKSByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQl9Ci0JCQlpZihkZWVwQ29weSAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbjxBY3Rpdml0eT4gZGVlcENvcGllcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KCk7Ci0JCQkJZGVlcENvcGllcy5hZGQoZGVlcENvcHkpOwotCQkJCXJldHVybiBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoZGVlcENvcGllcywgY21kLmdldFRhcmdldFByb2Nlc3MoKSwgCi0JCQkJCQljbWQuZ2V0Q29weUhlbHBlcigpLCBjbWQuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLCB0cnVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmVzdGVkIGNvbW1hbmQgZm9yIERyYWcgJiBEcm9wIENvcHkKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZEZvckNvcHkoQWN0aXZpdHlEcm9wQ29tbWFuZCBjb21tYW5kKSB7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gKChBY3Rpdml0eURyb3BDb21tYW5kKSBjb21tYW5kKS5nZXRNb2RpZmllZFJlc291cmNlcygpOyAKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwgJiYgIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCi0JCQlIZWxwZXIgY29waWVkSGVscGVyID0gY29tbWFuZC5nZXRBY3Rpdml0eUhhbmRsZXIoKS5nZXRDb3B5SGVscGVyKCk7Ci0JCQlBY3Rpdml0eSB0YXJnZXRBY3Rpdml0eSA9IGNvbW1hbmQuZ2V0QWN0aXZpdHkoKTsKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXJnZXRBY3Rpdml0eSk7Ci0JCQlpZiAodGFyZ2V0UHJvYyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKGNvcGllZEhlbHBlci52YWx1ZXMoKSwKLQkJCQkJCQljb3BpZWRIZWxwZXIsIHRhcmdldFByb2MpKTsKLQkJCQkKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQotCQkJCX0KLQkJCX0KLQkJCWlmICghY21kLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBjbWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZWQgbmVzdGVkIGNvbW1hbmQgZm9yIERyYWcgYW5kIERyb3AgRGVlcCBjb3B5Ci0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JEZWVwQ29weShBY3Rpdml0eURyb3BDb21tYW5kIGNvbW1hbmQpIHsKLQkJQWN0aXZpdHlIYW5kbGVyIGFjdGl2aXR5SGFuZGxlciA9ICgoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZCkKLQkJCQkuZ2V0QWN0aXZpdHlIYW5kbGVyKCk7Ci0JCWlmIChhY3Rpdml0eUhhbmRsZXIgIT0gbnVsbAotCQkJCSYmICFhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcGllcygpLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JEZWVwQ29weShhY3Rpdml0eUhhbmRsZXIKLQkJCQkJLmdldERlZXBDb3BpZXMoKSwgYWN0aXZpdHlIYW5kbGVyLmdldFRhcmdldFByb2Nlc3MoKSwKLQkJCQkJYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3B5SGVscGVyKCksIGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29weUNvbmZpZygpLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoCi0JCQlDb2xsZWN0aW9uPEFjdGl2aXR5PiBkZWVwQ29waWVzLCBmaW5hbCBQcm9jZXNzIHRhcmdldFByb2MsCi0JCQlDb3B5SGVscGVyIGNvcHlIZWxwZXIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJYm9vbGVhbiBzYXZlRGlhZ3JhbSkgewotCQlDb21wb3VuZENvbW1hbmQgY21kOwotCQlpZiAoc2F2ZURpYWdyYW0pIHsKLQkJCWNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCQlzdXBlci5leGVjdXRlKCk7Ci0KLQkJCQkJLy8gc2F2ZSBkaWFncmFtIGZpbGUKLQkJCQkJLy8KLQkJCQkJaWYgKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXIKLQkJCQkJCQkuaGFzRGlhZ3JhbU1hbmFnZXIodGFyZ2V0UHJvYykpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXIgbWdyID0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcgotCQkJCQkJCQkuZ2V0SW5zdGFuY2UodGFyZ2V0UHJvYywgdGhpcyk7Ci0JCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJCS5nZXRQZXJzaXN0ZXJGb3IodGFyZ2V0UHJvYy5lUmVzb3VyY2UoKSkKLQkJCQkJCQkJLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gbWdyLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCS5sb2dFcnJvcihleCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9IGVsc2UgewotCQkJY21kID0gbmV3IFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoCi0JCQkJCUNvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0JCX0KLQkJZm9yIChBY3Rpdml0eSBjb3B5QWN0IDogZGVlcENvcGllcykgewotCQkJQWN0aXZpdHkgb3JpZ0FjdCA9IChBY3Rpdml0eSkgY29weUhlbHBlci5nZXRPcmlnaW5hbChjb3B5QWN0KTsKLQkJCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhvcmlnQWN0KTsKLQkJCU1hcDxBY3Rpdml0eSwgQWN0aXZpdHk+IGNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXA8QWN0aXZpdHksIEFjdGl2aXR5PigpOwotCQkJSXRlcmF0b3I8QnJlYWtkb3duRWxlbWVudD4gY29weVRyZWUgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8QnJlYWtkb3duRWxlbWVudD4oCi0JCQkJCWNvcHlBY3QpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudD4gZ2V0Q2hpbGRyZW4oCi0JCQkJCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpIG9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCXdoaWxlIChjb3B5VHJlZS5oYXNOZXh0KCkpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSBjb3B5VHJlZS5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlPYmplY3Qgb3JpZyA9IGNvcHlIZWxwZXIuZ2V0T3JpZ2luYWwoZSk7Ci0JCQkJCWlmIChvcmlnID09IG51bGwpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIk5lc3RlZENvbW1hbmRQcm92aWRlci5jcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoKTogRkFUQUwgRVJST1I6IGNvdWxkIG5vdCBmaW5kIHNvdXJjZSBhY3Rpdml0eSBvZiBkZWVwIGNvcHk6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KChBY3Rpdml0eSkgZSwgKEFjdGl2aXR5KSBvcmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNtZC5hcHBlbmQobmV3IENvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kKGNvcHlUb09yaWdpbmFsTWFwLmtleVNldCgpLAotCQkJCQljb3B5VG9PcmlnaW5hbE1hcCwgc3JjUHJvYywgdGFyZ2V0UHJvYywgY29weUhlbHBlciwgY29uZmlnKSk7Ci0JCX0KLQkJcmV0dXJuICFjbWQuaXNFbXB0eSgpID8gY21kIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyI2NyZWF0ZVJlbGF0ZWRPYmplY3RzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlUmVsYXRlZE9iamVjdHMoQ29sbGVjdGlvbiBjcmVhdGVkRWxlbWVudHMsCi0JCQlDb21tYW5kIGNyZWF0ZUNvbW1hbmQpIHsKLQotCQlDb21wb3VuZENvbW1hbmQgY21kID0gbmV3IFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoCi0JCQkJQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQkJaWYgKGNyZWF0ZUNvbW1hbmQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgewotCi0JCQlNZXRob2RFbGVtZW50QWRkQ29tbWFuZCBtZUNvbW1hbmQgPSAoKE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSBjcmVhdGVDb21tYW5kKTsKLQkJCUNvbW1hbmQgYWRkQ29tbWFuZCA9IG1lQ29tbWFuZC5nZXRDb21tYW5kKCk7Ci0JCQlpZiAoYWRkQ29tbWFuZCBpbnN0YW5jZW9mIEFkZENvbW1hbmQpIHsKLQkJCQlFZGl0aW5nRG9tYWluIGVkID0gKChBZGRDb21tYW5kKSBhZGRDb21tYW5kKS5nZXREb21haW4oKTsKLQkJCQkKLQkJCQlpZiAoKChBZGRDb21tYW5kKWFkZENvbW1hbmQpLmdldE93bmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlpZiAoZWQgaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQkJCU1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJCQkJLmdldENvcHlUb09yaWdpbmFsTWFwKCk7Ci0JCQkJCQlpZiAoIWNvcHlUb09yaWdpbmFsTWFwLmlzRW1wdHkoKSkgewotCQkJCQkJCUNvbGxlY3Rpb24gYWZmZWN0cyA9IG1lQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZmZlY3RzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyCi0JCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJCQljbWQuYXBwZW5kKG5ldyBDb3B5RGlhZ3JhbUNvbW1hbmQoCi0JCQkJCQkJCQkJCWNvcHlUb09yaWdpbmFsTWFwLmtleVNldCgpLAotCQkJCQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcCwKLQkJCQkJCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KQotCQkJCQkJCQkJCQkJCS5nZXRQcm9jZXNzKCkpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENvcHkvcGFzdGUgd2l0aGluIHRoZSBwcm9jZXNzIGVkaXRvcgotCQkJCQlpZiAoZWQgaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQkJCU1hcCBvcmlnaW5hbFRvQ29weU1hcCA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJCQkJLmdldE9yaWdpbmFsVG9DbGlwYm9hcmRNYXAoKTsKLQkJCQkJCU1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlPYmplY3Qgb3duZXIgPSAoKEFkZENvbW1hbmQpIGFkZENvbW1hbmQpLmdldE93bmVyKCk7Ci0JCQkJCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mob3duZXIpOwotCQkJCQkJaWYgKHRhcmdldFByb2MgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yaWdpbmFsVG9Db3B5TWFwLmtleVNldCgpCi0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBrZXkgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJT2JqZWN0IHZhbCA9IG9yaWdpbmFsVG9Db3B5TWFwLmdldChrZXkpOwotCQotCQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcC5wdXQodmFsLCBrZXkpOwotCQkJCQkJCX0KLQkKLQkJCQkJCQljbWQuYXBwZW5kKG5ldyBDb3B5RGlhZ3JhbUNvbW1hbmQoY29weVRvT3JpZ2luYWxNYXAua2V5U2V0KCksCi0JCQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcCwgdGFyZ2V0UHJvYykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghY21kLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGNtZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyI3JlbW92ZVJlbGF0ZWRPYmplY3RzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQpCi0JICovCi0JcHVibGljIENvbW1hbmQgcmVtb3ZlUmVsYXRlZE9iamVjdHMoQ29sbGVjdGlvbiBkZWxldGVkRWxlbWVudHMsCi0JCQlDb21tYW5kIGRlbGV0ZUNvbW1hbmQpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCUNvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0JCWlmKGRlbGV0ZUNvbW1hbmQgaW5zdGFuY2VvZiBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCl7Ci0JCQlDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKWRlbGV0ZUNvbW1hbmQpLmdldENvbW1hbmQoKTsKLQkJCUxpc3Q8UmVtb3ZlQ29tbWFuZD4gcmVtb3ZlQ29tbWFuZHMgPSBudWxsOwotCQkJaWYocmVtb3ZlQ29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpewotCQkJCXJlbW92ZUNvbW1hbmRzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgoUmVtb3ZlQ29tbWFuZClyZW1vdmVDb21tYW5kKTsKLQkJCX0KLQkJCWVsc2UgaWYocmVtb3ZlQ29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCkgewotCQkJCXJlbW92ZUNvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxSZW1vdmVDb21tYW5kPigpOwotCQkJCWZvciAoQ29tbWFuZCBjb21tYW5kIDogKChDb21wb3VuZENvbW1hbmQpcmVtb3ZlQ29tbWFuZCkuZ2V0Q29tbWFuZExpc3QoKSkgewotCQkJCQlpZihjb21tYW5kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJCQkJcmVtb3ZlQ29tbWFuZHMuYWRkKChSZW1vdmVDb21tYW5kKSBjb21tYW5kKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKHJlbW92ZUNvbW1hbmRzICE9IG51bGwgJiYgIXJlbW92ZUNvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJCU9iamVjdCBvd25lciA9IHJlbW92ZUNvbW1hbmRzLmdldCgwKS5nZXRPd25lcigpOwotCQkJCWlmKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChBY3Rpdml0eSlvd25lcik7Ci0JCQkJCUNvbGxlY3Rpb248QWN0aXZpdHk+IGFsbEVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8QWN0aXZpdHk+KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGV0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPE9iamVjdD4oZWxlbWVudCkgewotCi0JCQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIE9iamVjdD4gZ2V0Q2hpbGRyZW4oCi0JCQkJCQkJCQkJT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJCQlyZXR1cm4gKChBY3Rpdml0eSlvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKS5pdGVyYXRvcigpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9OwotCQkJCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCQlhbGxFbGVtZW50cy5hZGQoKEFjdGl2aXR5KSBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gCi0JCQkJCX0JCQkJCQotCQkJCQlpZighYWxsRWxlbWVudHMuaXNFbXB0eSgpKXsKLQkJCQkJCWNtZC5hcHBlbmQobmV3IERlbGV0ZURpYWdyYW1Db21tYW5kKGFsbEVsZW1lbnRzLCBwcm9jZXNzKSk7Ci0JCQkJCX0KLQotCQkJCQlmb3IgKFJlbW92ZUNvbW1hbmQgY29tbWFuZCA6IHJlbW92ZUNvbW1hbmRzKSB7Ci0JCQkJCQlpZihjb21tYW5kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCURlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZCBkZWxldGVEaWFncmFtTm9kZUNvbW1hbmQgPSBuZXcgRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kKAotCQkJCQkJCQkJKEFjdGl2aXR5KSBjb21tYW5kLmdldE93bmVyKCksIGNvbW1hbmQuZ2V0Q29sbGVjdGlvbigpKTsKLQkJCQkJCQlpZihkZWxldGVEaWFncmFtTm9kZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJCWNtZC5hcHBlbmQoZGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoIWRlbGV0ZWRFbGVtZW50cy5pc0VtcHR5KCkpewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpZWxlbWVudDsKLQkJCQkJUHJvY2VzcyBwcm9jZXNzID0gcGMuZ2V0UHJvY2VzcygpOwotCQkJCQljbG9zZURpYWdyYW1FZGl0b3JzKHByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighY21kLmlzRW1wdHkoKSl7Ci0JCQlyZXR1cm4gY21kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDbG9zZXMgRGlhZ3JhbSBFZGl0b3JzIGlmIHRoZSBvd25pbmcgcHJvY2VzcyBpcyBkZWxldGVkLgotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsb3NlRGlhZ3JhbUVkaXRvcnMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGVkaXRvcnNUb0Nsb3NlID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dDsKLQkJCXRyeSB7Ci0JCQkJZWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBlZGl0b3JJbnB1dCkKLQkJCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCU9iamVjdCB3cmFwcGVyID0gaW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQlPYmplY3Qgb3duaW5nUHJvY2VzcyA9IG51bGw7Ci0JCQkJCWlmICh3cmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlvd25pbmdQcm9jZXNzID0gVG5nVXRpbAotCQkJCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgd3JhcHBlcikpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJd3JhcHBlciA9IGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCW93bmluZ1Byb2Nlc3MgPSBUbmdVdGlsCi0JCQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoKEJyZWFrZG93bkVsZW1lbnQpIHdyYXBwZXIpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3duaW5nUHJvY2VzcyA9PSBvd25pbmdQcm9jZXNzKSB7Ci0JCQkJCQllZGl0b3JzVG9DbG9zZS5hZGQoZWRpdG9yUmVmKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJaWYoIWVkaXRvcnNUb0Nsb3NlLmlzRW1wdHkoKSkgewotCQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtlZGl0b3JzVG9DbG9zZS5zaXplKCldOwotCQkJZWRpdG9yc1RvQ2xvc2UudG9BcnJheShyZWZzKTsKLQkJCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZnMsIGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyNWExYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL1JlY29ubmVjdExpbmtDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUmVjb25uZWN0TGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZTsKLQotCXByaXZhdGUgRWRnZSBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIG5ld05vZGUsIG9sZE5vZGU7Ci0KLQlwcml2YXRlIGludCB2aWV3SW5kZXg7Ci0KLQlwcml2YXRlIFBvaW50IGVuZFBvaW50OwotCi0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJSZWNvbm5lY3QgTGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBSZWNvbm5lY3RMaW5rQ29tbWFuZChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWRnZSBsaW5rLCBOb2RlIG5ld05vZGUsIGJvb2xlYW4gaXNTb3VyY2UpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5uZXdOb2RlID0gbmV3Tm9kZTsKLQkJdGhpcy5pc1NvdXJjZSA9IGlzU291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZFBvaW50KFBvaW50IHApIHsKLQkJZW5kUG9pbnQgPSBwLmdldENvcHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlib29sZWFuIHJlc3VsdCA9IGxpbmsgIT0gbnVsbCAmJiBuZXdOb2RlICE9IG51bGw7Ci0JCWlmICghcmVzdWx0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGlzU291cmNlKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmNoZWNrUmVjb25uZWN0KG5ld05vZGUsIChOb2RlKWxpbmsuZ2V0VGFyZ2V0KCksIGxpbmspID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmNoZWNrUmVjb25uZWN0KChOb2RlKWxpbmsuZ2V0U291cmNlKCksIG5ld05vZGUsIGxpbmspID09IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCS8vIExpbmsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNTb3VyY2UpIHsKLQkJCQkJCW9sZE5vZGUgPSAoTm9kZSkgbGluay5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChvbGROb2RlICE9IG51bGwpIHsgLy8gc2FmZXR5IGNoZWNrIHRvIGhhbmRsZSBkYW5nbGluZyBsaW5rCi0JCQkJCQkJdmlld0luZGV4ID0gb2xkTm9kZS5nZXRUYXJnZXRFZGdlcygpLmluZGV4T2YobGluayk7Ci0JCQkJCQl9Ci0JCQkJCQlsaW5rLnNldFNvdXJjZShuZXdOb2RlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW9sZE5vZGUgPSAoTm9kZSkgbGluay5nZXRUYXJnZXQoKTsKLQkJCQkJCWlmIChvbGROb2RlICE9IG51bGwpIHsgLy8gc2FmZXR5IGNoZWNrIHRvIGhhbmRsZSBkYW5nbGluZyBsaW5rCi0JCQkJCQkJdmlld0luZGV4ID0gb2xkTm9kZS5nZXRTb3VyY2VFZGdlcygpLmluZGV4T2YobGluayk7Ci0JCQkJCQl9Ci0JCQkJCQlsaW5rLnNldFRhcmdldChuZXdOb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciB3aGlsZSByZS1jb25uZWN0IHRoZSBsaW5rIDoiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGlzU291cmNlKSB7Ci0JCQluZXdOb2RlLmdldFRhcmdldEVkZ2VzKCkucmVtb3ZlKGxpbmspOwotCQkJb2xkTm9kZS5nZXRUYXJnZXRFZGdlcygpLmFkZCh2aWV3SW5kZXgsIGxpbmspOwotCQl9IGVsc2UgewotCQkJbmV3Tm9kZS5nZXRTb3VyY2VFZGdlcygpLnJlbW92ZShsaW5rKTsKLQkJCW9sZE5vZGUuZ2V0U291cmNlRWRnZXMoKS5hZGQodmlld0luZGV4LCBsaW5rKTsKLQkJfQotCQlvbGROb2RlID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvZmlndXJlcy9SYWlzZWRNYXJnaW5Cb3JkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvZmlndXJlcy9SYWlzZWRNYXJnaW5Cb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1OGM2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2UgIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogIEEgYm9yZGVyIHdpdGggYSByYWlzZWQgbWFyZ2luLgotICogIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWlzZWRNYXJnaW5Cb3JkZXIgZXh0ZW5kcyBNYXJnaW5Cb3JkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5zZXRzIERFRkFVTFRfSU5TRVRTID0gbmV3IEluc2V0cygxMCwgMTAsIDEwLCAxMCk7Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKCkgewotCQl0aGlzKERFRkFVTFRfSU5TRVRTKTsKLQl9Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKEluc2V0cyBpbnNldHMpIHsKLQkJc3VwZXIoaW5zZXRzKTsKLQl9Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKGludCB0LCBpbnQgbCwgaW50IGIsIGludCByKSB7Ci0JCXN1cGVyKHQsIGwsIGIsIHIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNnZXRJbnNldHMoSUZpZ3VyZSkKLQkgKi8KLQlwdWJsaWMgSW5zZXRzIGdldEluc2V0cyhJRmlndXJlIGZpZ3VyZSkgewotCQlyZXR1cm4gaW5zZXRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjaXNPcGFxdWUoKQotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI3BhaW50KElGaWd1cmUsIEdyYXBoaWNzLCBJbnNldHMpCi0JICovCi0JcHVibGljIHZvaWQgcGFpbnQoSUZpZ3VyZSBmaWd1cmUsIEdyYXBoaWNzIGcsIEluc2V0cyBpbnNldHMpIHsKLQkJZy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0JCWcuc2V0TGluZVdpZHRoKDEpOwotCQlnLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25MaWdodGVzdCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0UGFpbnRSZWN0YW5nbGUoZmlndXJlLCBpbnNldHMpOwotCQlyLnJlc2l6ZSgtMSwgLTEpOwotCQlnLmRyYXdMaW5lKHIueCwgci55LCByLnJpZ2h0KCksIHIueSk7Ci0JCWcuZHJhd0xpbmUoci54LCByLnksIHIueCwgci5ib3R0b20oKSk7Ci0JCWcuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkRhcmtlcik7Ci0JCWcuZHJhd0xpbmUoci54LCByLmJvdHRvbSgpLCByLnJpZ2h0KCksIHIuYm90dG9tKCkpOwotCQlnLmRyYXdMaW5lKHIucmlnaHQoKSwgci55LCByLnJpZ2h0KCksIHIuYm90dG9tKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9maWd1cmVzL1dpZGVuZWRXcmFwTGFiZWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvZmlndXJlcy9XaWRlbmVkV3JhcExhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTY1NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9maWd1cmVzL1dpZGVuZWRXcmFwTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0vKioKLSAqIFRlbXBvcmFyeSByZXBsYWNlbWVudCBmb3Ige0BsaW5rIFdyYXBMYWJlbH0gdW50aWwgdGhlIHRleHQgY3V0LW9mZiBpc3N1ZSBpcyBmaXhlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFdpZGVuZWRXcmFwTGFiZWwgZXh0ZW5kcyBXcmFwTGFiZWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgREVMVEFfRkFDVE9SID0gMC4wNWY7Ci0JCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dFNpemU7Ci0JcHJpdmF0ZSBEaW1lbnNpb24gYWRqdXN0ZWRUZXh0U2l6ZTsKLQkKLQlwdWJsaWMgV2lkZW5lZFdyYXBMYWJlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIERpbWVuc2lvbiBnZXRUZXh0U2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgewotCQlEaW1lbnNpb24gbmV3VGV4dFNpemUgPSBzdXBlci5nZXRUZXh0U2l6ZSh3SGludCwgaEhpbnQpOwotCQlpZihuZXdUZXh0U2l6ZSAhPSBudWxsICYmIG5ld1RleHRTaXplICE9IHRleHRTaXplKSB7Ci0JCQl0ZXh0U2l6ZSA9IG5ld1RleHRTaXplOwotCQkJCi0JCQkvLyB3b3JrLWFyb3VuZDogaW5jcmVhc2UgdGhlIHRleHQgc2l6ZSB0byBhdm9pZCB0ZXh0IGN1dC1vZmYKLQkJCS8vCi0JCQlhZGp1c3RlZFRleHRTaXplID0gdGV4dFNpemUuZ2V0RXhwYW5kZWQoKGludCkgTWF0aC5jZWlsKHRleHRTaXplLndpZHRoICogREVMVEFfRkFDVE9SKSwgNCk7Ci0JCX0KLQkJcmV0dXJuIGFkanVzdGVkVGV4dFNpemU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQb2ludCBnZXRUZXh0TG9jYXRpb24oKSB7Ci0JCVBvaW50IHAgPSBzdXBlci5nZXRUZXh0TG9jYXRpb24oKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKTsKLQkJRGltZW5zaW9uIHRzID0gZ2V0VGV4dFNpemUoci53aWR0aCwgci5oZWlnaHQpOwotCQlpZihyLndpZHRoIDw9IHRzLndpZHRoKSB7Ci0JCQlwLnggPSAwOwotCQkJaWYoIWdldFRleHQoKS5lcXVhbHNJZ25vcmVDYXNlKGdldFN1YlN0cmluZ1RleHQoKSkpIHsKLQkJCQlpbnZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDI2MjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5DcmVhdGVFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxlZ2F0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuSU1ldGhvZEVsZW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLklNZXRob2RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuS2V5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5pbnRlcm5hbC5TZWxlY3RBbGxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmVkaXRvci5GaWxlRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5zZXJ2aWNlcy5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciBleHRlbmRzIEZpbGVEaWFncmFtRWRpdG9yIGltcGxlbWVudHMgSUdvdG9NYXJrZXIsIElNZXRob2RFZGl0b3IgewotCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBkaWFncmFtTWdyOwotCXByaXZhdGUgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBudWxsOwotCQotCXByaXZhdGUgbG9uZyBmTW9kaWZpY2F0aW9uU3RhbXA7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQlwcml2YXRlIEFkYXB0ZXJJbXBsIHRpdGxlQWRhcHRlcjsKLQotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmKGV2ZW50LmdldFNvdXJjZSgpID09IGRpYWdyYW1NZ3IpIHsKLQkJCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCQlpZihkb2NQcm92aWRlciBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkJaWYoIWlzRGlydHkoKSkgewotCQkJCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKWRvY1Byb3ZpZGVyKS5oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCQotCX07Ci0JCi0JLy8gTGlzdGVuZXJzIHRvIHJlZnJlc2ggZGlhZ3JhbSBpZiBjb25maWd1cmF0aW9uIGdvdCBjaGFuZ2VkCi0JLy8KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJc3dpdGNoIChvcHRpb24pIHsKLQkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogewotCQkJCWlmIChjb2xsZWN0aW9uICE9IG51bGwgJiYgY29sbGVjdGlvbi5jb250YWlucyhjdXJyZW50Q29uZmlnKSkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGN1cnJlbnRDb25maWcpOwkJCQkJCi0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJfQotCQkJCX0JCQotCQkJCWJyZWFrOwotCQkJfQotCQkJLy8gaGFuZGxlZCBieSBsaWJTdmNMaXN0ZW5lcgotCQkJLy8KLS8vCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEOiB7Ci0vLwkJCQljb25maWdDaGFuZ2VkKCk7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJY29uZmlnQ2hhbmdlZCgpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQkvL1RPRE86IGlmIHRoaXMgZmxhZyBpcyBzZXQsIHJlZnJlc2ggZGlhZ3JhbSBpZiBuZWVkZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGFjdGl2YXRlZCAKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFJlZnJlc2g7Ci0JcHJpdmF0ZSBEaWFncmFtU2VydmljZSBkaWFncmFtU3ZjOwotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUVkaXRvcigpIHsKLQkJc3VwZXIodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1FZGl0b3IoYm9vbGVhbiBoYXNGbHlvdXRQYWxldHRlKSB7Ci0JCXN1cGVyKGhhc0ZseW91dFBhbGV0dGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdGluZ0RvbWFpbklEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLkVkaXRpbmdEb21haW4iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKCkgewotCQlpZiAoZGlhZ3JhbU1nciA9PSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSk7Ci0JCQlkaWFncmFtTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQlkaWFncmFtTWdyLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1NZ3I7Ci0JfQotCQotCXByb3RlY3RlZCBEaWFncmFtU2VydmljZSBnZXREaWFncmFtU2VydmljZSgpIHsKLQkJaWYoZGlhZ3JhbVN2YyA9PSBudWxsKSB7Ci0JCQlkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1TdmM7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGNyZWF0ZUVkaXRpbmdEb21haW4oKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGdldERpYWdyYW1NYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlkb21haW4uc2V0SUQoZ2V0RWRpdGluZ0RvbWFpbklEKCkpOwotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvciNzZXREb2N1bWVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXREb2N1bWVudFByb3ZpZGVyKG5ldyBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKGdldERpYWdyYW1NYW5hZ2VyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9TeW5jaHJvbml6ZShPYmplY3QgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJLy8gcmVsb2FkIGRpYWdyYW0ncyByZXNvdXJjZQotCQkJCS8vCi0JCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQltZ3IucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJCQkJbWdyLnJlbG9hZCgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaWFncmFtQ29yZVBsdWdpbi5nZXRQbHVnaW5JZCgpLAotCQkJCQkJCTAsICJFcnJvciByZWxvYWRpbmcgZGlhZ3JhbSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWdyLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkJfQotCQkJCXN1cGVyLmRvU3luY2hyb25pemUoZWxlbWVudCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0pOwkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yI2RvU2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0LCBib29sZWFuKQotCSAqIEBjdXN0b20KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCwgYm9vbGVhbiByZWxlYXNlRWRpdG9yQ29udGVudHMpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50KGlucHV0KTsKLQkJRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSA9IG51bGw7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQlpbnB1dFByb3h5ID0gKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dDsKLQkJCWlucHV0UHJveHkuc2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oY3JlYXRlRWRpdGluZ0RvbWFpbigpKTsKLQkJfQotCQlzdXBlci5kb1NldElucHV0KGlucHV0LCByZWxlYXNlRWRpdG9yQ29udGVudHMpOwotCQlpZihpc0VkaXRhYmxlKCkgJiYgaW5wdXRQcm94eSAhPSBudWxsICYmICFpbnB1dFByb3h5LmlzTmV3RGlhZ3JhbSgpKSB7Ci0JCQlnZXREaWFncmFtTWFuYWdlcigpLmJhY2t1cERpYWdyYW0oYWN0aXZpdHksIGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJaW5pdGlhbGl6ZVRpdGxlKGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yJ3MgdGl0bGUgYmFzZWQgb24gdGhlIGdpdmVuIGVkaXRvciBpbnB1dC4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgZWRpdG9yIGlucHV0IHRvIGJlIHVzZWQKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUaXRsZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQotCQlTdHJpbmcgdGl0bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGZpbGVJbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGlucHV0OwotCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9IGZpbGVJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgaW5wdXRFbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCWlmIChpbnB1dEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCS8vdGl0bGUgPSBpbnB1dEVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCXRpdGxlID0gZ2V0UGFydE5hbWVQcmVmaXgoKSArIAotCQkJCQkJCWlucHV0RWxlbWVudC5nZXROYW1lKCkrCi0JCQkJCQkJU3RyaW5nU3RhdGljcy5DT01NQSArIFN0cmluZ1N0YXRpY3MuU1BBQ0UgKyAKLQkJCQkJCQlkaWFncmFtSW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZ2V0TmFtZSgpOyAKLS8vCQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotLy8JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGdldFBhcnRJbWFnZSgpOwkJCQkKLQkJCQlzZXRUaXRsZUltYWdlKHRpdGxlSW1hZ2UpOwotCQkJfQotCQl9Ci0JCXNldFBhcnROYW1lKHRpdGxlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3Ijc2FuaXR5Q2hlY2tTdGF0ZShvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICogQGN1c3RvbQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhbml0eUNoZWNrU3RhdGUoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIHAgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJbG9uZyBzdGFtcCA9IHAuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoaW5wdXQpOwotCQlpZiAoc3RhbXAgIT0gZk1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQlmTW9kaWZpY2F0aW9uU3RhbXAgPSBzdGFtcDsKLQkJCWlmICghcC5pc1N5bmNocm9uaXplZChpbnB1dCkpIHsKLQkJCQloYW5kbGVFZGl0b3JJbnB1dENoYW5nZWQoKTsKLQkJCQlpZighcC5pc1N5bmNocm9uaXplZChpbnB1dCkgJiYgcCBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKXApLmFsbG93RWRpdGluZyhpbnB1dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXVwZGF0ZVN0YXRlKGdldEVkaXRvcklucHV0KCkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQkKLQkJLy8gaWYgY2hhbmdlcyBkaXNjYXJkZWQsIHJldmVyc2UgdG8gc2F2ZWQKLQkJLy8JCQotCQlpZihpc0RpcnR5KCkpIHsKLQkJCXJldmVyc2VUb1NhdmVkKCk7Ci0JCX0JCQotCQkKLQkJaWYodGl0bGVBZGFwdGVyICE9IG51bGwpewotCQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJZS5lQWRhcHRlcnMoKS5yZW1vdmUodGl0bGVBZGFwdGVyKTsKLQkJCX0KLQkJCXRpdGxlQWRhcHRlciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKGRpYWdyYW1NZ3IgIT0gbnVsbCkgewotCQkJaWYoYWN0aXZpdHkgIT0gbnVsbCAmJiBkaWFncmFtICE9IG51bGwpIHsKLQkJCQlkaWFncmFtTWdyLnJlbW92ZURpYWdyYW1CYWNrdXAoYWN0aXZpdHksIGRpYWdyYW0uZ2V0VHlwZSgpKTsKLQkJCX0KLQkJCWRpYWdyYW1NZ3IucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJCWRpYWdyYW1NZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCX0JCQotCQkKLQkJaWYoZGlhZ3JhbVN2YyAhPSBudWxsKSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCQkJCQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCS8vIFJlbW92ZSB0aGUgYWRhcHRlciBmcm9tIHRoZSB1bWwgYWN0aXZpdHkgaWYgZWRpdG9yIGlzIGNsb3NlZC4KLQkJaWYoZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KXsKLQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGFjdCA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSlnZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpOwotCQkJaWYoYWN0ICE9IG51bGwgJiYgZ2V0RGlhZ3JhbUFkYXB0ZXIoKSAhPSBudWxsKXsKLQkJCQlhY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGdldERpYWdyYW1BZGFwdGVyKCkpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBkaXNwb3NlIHRoZSBpbnB1dAotCQkvLwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZihpbnB1dCBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkoKElEaXNwb3NhYmxlKWlucHV0KS5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCURpYWdyYW1FZGl0UGFydCBlZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQlpZihlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQllZGl0UGFydC5zZXRNb2RlbChudWxsKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW1BZGFwdGVyIGdldERpYWdyYW1BZGFwdGVyKCkgewotCQlWaWV3IHZpZXcgPSAoKFZpZXcpIGdldERpYWdyYW1FZGl0UGFydCgpLmdldE1vZGVsKCkpOwotCQlyZXR1cm4gdmlldyAhPSBudWxsID8gKERpYWdyYW1BZGFwdGVyKSBCcmlkZ2VIZWxwZXIKLQkJCQkuZ2V0Tm9kZUFkYXB0ZXIodmlldy5nZXRFbGVtZW50KCkpIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmV2ZXJzZVRvU2F2ZWQoKSB7Ci0JCXRyeSB7Ci0JCQlJRG9jdW1lbnRQcm92aWRlciBwID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQkJaWYocCBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpcCkucmV2ZXJzZVRvU2F2ZWQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQl9Ci0JCQkKLQkJCURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBnZXREaWFncmFtQWRhcHRlcigpOwotCQkJaWYoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJLy9UT0RPOiByZXZlcnNlIHRvIHNhdmVkIGZvciBBREQgYW5kIFdQREQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBhZGFwdGVyLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCWJvb2xlYW4gZGlydHkgPSBhY3Rpb25NZ3IuaXNTYXZlTmVlZGVkKCk7Ci0JCQlpZiAoZGlydHkpIHsKLQkJCQlhY3Rpb25NZ3IudW5kb0FsbCgpOwotLy8JCQkJZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLnVuZG8oZ2V0VW5kb0NvbnRleHQoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0vLwkJCQlnZXRPcGVyYXRpb25IaXN0b3J5KCkuZGlzcG9zZShnZXRVbmRvQ29udGV4dCgpLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJCX0KLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5jbGVhcigpOwotCi0JCQkvLyBzYXZlIHRoZSB1bmRvbmUgY2hhbmdlcyBvbmx5IGlmIHRoZSByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgdGhpcyBlZGl0b3IKLQkJCS8vCi0JCQlib29sZWFuIHNhdmVOZWVkZWQgPSBkaXJ0eQotCQkJJiYgZ2V0TGFzdE1vZGlmaWVkKCkgPiBhZGFwdGVyLmdldFVtYUxhc3RNb2RpZmllZCgpOwotCQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJCWlmIChzYXZlTmVlZGVkICYmIChtZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSkgIT0gbnVsbCkgewotCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUobWUuZVJlc291cmNlKCkpOwotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vVE9ETzogcmVsb2FkIGxpYnJhcnkgbmVlZGVkCi0JCQkJCQkvLwkJCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGlicmFyeShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgbnVsbCk7Ci0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJcmV0dXJuICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpCi0JCQkJCS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQlyZXR1cm4gKChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGlucHV0KQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IGdldERpYWdyYW1BZGFwdGVyKCk7Ci0JCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGdldERpYWdyYW1BZGFwdGVyKCkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkJaWYgKGFjdGlvbk1nciAhPSBudWxsICYmIGFjdGlvbk1nci5pc1NhdmVOZWVkZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIlNhdmluZyIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCUNvbGxlY3Rpb248Pz4gbW9kaWZpZWRSZXNvdXJjZXMgPSBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsJCQkJCQotCQkJCQkvLyBjaGVjayBmb3IgbW9kaWZpYWJsZQotCQkJCQkvLwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKS5jaGVja01vZGlmeShtb2RpZmllZFJlc291cmNlcy50b0FycmF5KG5ldyBSZXNvdXJjZVswXSksIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXByb2dyZXNzTW9uaXRvci5zZXRUYXNrTmFtZShOTFMuYmluZChEaWFncmFtQ29yZVJlc291cmNlcy5Qcm9ncmVzc19TYXZpbmdfbWVzc2FnZSwKLQkJCQkJCQkJCXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UuZ2V0VVJJKCkKLQkJCQkJCQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCWFjdGlvbk1nci5zYXZlSXNEb25lKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQkJCS8vCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCS8vCQkJCQkJLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkJLy8JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvKgotCQkJCQkJICogTk8gVUkgbW9kdWxlIHNob3VsZCBub3QgaW52b2x2ZSB3aXRoIFVJIGNsYXNzZXMKLQkJCQkJCSAqIHVzZSBjYWxsYmFjayB0byBoYW5kbGUgc3VjaCBraW5kIG9mIHNpdHVhdGlvbgotCQkJCQkJICogSmluaHVhIFhpLCAwMS8xMy8wOAotCQkJCQkJKi8KLS8vCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZygKLS8vCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXRUZXh0KCksCi0vLwkJCQkJCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV2FybmluZ19TYXZpbmdfRGlhZ3JhbSwgZS5nZXRNZXNzYWdlKCksCi0vLwkJCQkJCQkJZSk7Ci0JCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0NhbGxiYWNrKCkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCksIAotCQkJCQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5XYXJuaW5nX1NhdmluZ19EaWFncmFtLCBlLmdldE1lc3NhZ2UoKSwKLQkJCQkJCQkJZSk7Ci0JCQkJCQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4IGV4dGVuZHMgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciBpbXBsZW1lbnRzIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlciB7Ci0KLQkJcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKSB7Ci0JCQlyZXR1cm4gKChJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KWdldEVkaXRvcklucHV0KCkpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQl9Ci0KLQkJcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvcigpIHsKLQkJCXJldHVybiBBYnN0cmFjdERpYWdyYW1FZGl0b3IudGhpczsKLQkJfQkJCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBjcmVhdGVTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCQotCQljdXJyZW50Q29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkKLQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBmb3IgY3VycmVudCBzZWxlY3Rpb24gb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBvciBjaGFuZ2VzIGluIAotCQkvLyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCS8vCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKTsKLSAgICAgICAgQ29udGV4dE1lbnVQcm92aWRlciBwcm92aWRlciA9IG5ldyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcih0aGlzLAotICAgICAgICAgICAgICAgIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKSk7Ci0gICAgICAgICAgICB2aWV3ZXIuc2V0Q29udGV4dE1lbnUocHJvdmlkZXIpOwotICAgICAgICAgICAgZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoQWN0aW9uSWRzLkRJQUdSQU1fRURJVE9SX0NPTlRFWFRfTUVOVSwKLSAgICAgICAgICAgICAgICBwcm92aWRlciwgdmlld2VyKTsKLQkJaWYoYWN0aW9uU2VydmljZSAhPSBudWxsKXsKLQkJCWFjdGlvblNlcnZpY2Uuc2V0R3JhcGhpY2FsVmlld2VyKHZpZXdlcik7Ci0JCX0KLQkJCi0JCXRpdGxlQWRhcHRlciA9IG5ldyBBZGFwdGVySW1wbCgpewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudC5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0vLwkJCQkJc2V0TmFtZShtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSk7Ci0JCQkJCWluaXRpYWxpemVUaXRsZShnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlNZXRob2RFbGVtZW50IGUgPSBnZXRNZXRob2RFbGVtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQlpZihlICE9IG51bGwgJiYgdGl0bGVBZGFwdGVyICE9IG51bGwpewotCQkJZS5lQWRhcHRlcnMoKS5hZGQodGl0bGVBZGFwdGVyKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ0NoYW5nZWQoKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZihjdXJyZW50Q29uZmlnICE9IGNvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGRpYWdyYW0gZWRpdG9yIG9yIHByb2Nlc3MgZWRpdG9yIG9mIHRoZSBwcm9jZXNzCi0JCQkvLyB0aGF0IG93bnMgdGhpcyBkaWFncmFtCi0JCQkvLwotCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9IGFjdGl2ZVBhcnQgPT0gdGhpczsKLQkJCWlmKCFyZWZyZXNoKSB7Ci0JCQkJaWYoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9ICgoSUVkaXRvclBhcnQpYWN0aXZlUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYoaW5wdXQgaW5zdGFuY2VvZiBJTWV0aG9kRWxlbWVudFByb3ZpZGVyKSB7Ci0JCQkJCQlPYmplY3QgZSA9ICgoSU1ldGhvZEVsZW1lbnRQcm92aWRlcilpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJaWYoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlyZWZyZXNoID0gZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgJiYgCi0JCQkJCQkJZ2V0UHJvY2VzcygpID09ICgoUHJvY2Vzc0NvbXBvbmVudCllKS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihyZWZyZXNoKSB7Ci0JCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZzsKLQkJCQlyZWZyZXNoKCk7Ci0JCQkJbmVlZFJlZnJlc2ggPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5lZWRSZWZyZXNoID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZihnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKXsKLQkJCVNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdmlkZXIgPSAoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpZ2V0RG9jdW1lbnRQcm92aWRlcigpKTsKLQkJCURpYWdyYW1FZGl0UGFydCBlZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQkJYm9vbGVhbiB3YXNEaXJ0eSA9IGlzRGlydHkoKTsKLQkJCWJvb2xlYW4gd2FzQmFzZURpcnR5ID0gZmFsc2U7Ci0JCQlJRWRpdG9yUGFydCBiYXNlRWRpdG9yID0gbnVsbDsKLQkJCWZpbmFsIGJvb2xlYW4gaXNJbmhlcml0ZWQgPSBEaWFncmFtRWRpdG9yVXRpbC5pc0luaGVyaXRlZChlZGl0UGFydCk7Ci0JCQlpZihpc0luaGVyaXRlZCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkpOwotCQkJCVN0cmluZyB0eXBlID0gZWRpdFBhcnQuZ2V0RGlhZ3JhbVZpZXcoKS5nZXRUeXBlKCk7Ci0JCQkJCi0JCQkJLy8gdHJ5IHRvIGZpbmQgdGhlIGRpcnR5IGZsYWcgb2YgYmFzZSBkaWFncmFtIGVkaXRvcgotCQkJCS8vCi0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUVkaXRvclJlZmVyZW5jZSByZWYgPSBlZGl0b3JSZWZzW2ldOwotCQkJCQl0cnkgewotCQkJCQkJaWYocmVmLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KXJlZi5nZXRFZGl0b3JJbnB1dCgpKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJCQlpZihpbnB1dC5nZXRXcmFwcGVyKCkgPT0gbnVsbCAmJiBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCkgPT0gZWxlbWVudCAmJgotCQkJCQkJCQkJRGlhZ3JhbU1hbmFnZXIuZ2V0RGlhZ3JhbVR5cGUodHlwZSkgPT0gaW5wdXQuZ2V0RGlhZ3JhbVR5cGUoKSkgewotCQkJCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQkJCQkJaWYoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCQkJCXdhc0Jhc2VEaXJ0eSA9IGVkaXRvci5pc0RpcnR5KCk7Ci0JCQkJCQkJCQliYXNlRWRpdG9yID0gZWRpdG9yOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZG9jUHJvdmlkZXIuc2V0Q29udGVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmKHdhc0RpcnR5KSB7Ci0JCQkJZG9jUHJvdmlkZXIuc2V0Q2FuU2F2ZURvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQkJfQotCQkJLy8gZWRpdG9ycyBjYW4gYmVjb21lIGRpcnR5IGFmdGVyIHJlZnJlc2gKLQkJCS8vIGNsZWFyIGRpcnR5IGZsYWcKLQkJCS8vCi0JCQllbHNlIGlmKGlzRGlydHkoKSkgewotCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikgZ2V0RG9jdW1lbnRQcm92aWRlcigpKQotCQkJCQkJLm1hcmtEb2N1bWVudEFzU2F2ZWQoKElGaWxlRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQl9Ci0JCQlpZihiYXNlRWRpdG9yICE9IG51bGwgJiYgIXdhc0Jhc2VEaXJ0eSkgewotCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikoKERpYWdyYW1Eb2N1bWVudEVkaXRvciliYXNlRWRpdG9yKS5nZXREb2N1bWVudFByb3ZpZGVyKCkpCi0JCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBiYXNlRWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJfQotCQkJdXBkYXRlU3RhdGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQl9Ci0JCi0JLy8gRG9lcyBub3RoaW5nIGJ1dCBmb3Igb3ZlcnJpZGUuIAotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKEV2ZW50IGV2ZW50KSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmKCFEaWFncmFtRWRpdG9yVXRpbC5pc01vZGlmaWFibGUoZ2V0RWRpdG9ySW5wdXQoKSkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmKGdldERvY3VtZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpewotCQkJcmV0dXJuICEoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpZ2V0RG9jdW1lbnRQcm92aWRlcigpKS5nZXRMb2NrZWRTdGF0ZSgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgS2V5SGFuZGxlciBnZXRLZXlIYW5kbGVyKCkgewotCQlLZXlIYW5kbGVyIGtleUhhbmRsZXIgPSAgc3VwZXIuZ2V0S2V5SGFuZGxlcigpOwotCQlpZihrZXlIYW5kbGVyICE9IG51bGwpewotCQkJQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotCQkJSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCQkKLQkJCWlmKGFjdGlvbiAhPSBudWxsICYmICEoYWN0aW9uIGluc3RhbmNlb2YgRGVsZWdhdGVBY3Rpb24pKXsKLQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlbW92ZUFjdGlvbihhY3Rpb24pOwotCQkJCWdldFNlbGVjdGlvbkFjdGlvbnMoKS5yZW1vdmUoYWN0aW9uKTsKLQkJCQlhY3Rpb24gPSBuZXcgRGVsZWdhdGVBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCQkJYWN0aW9uLnNldElkKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJCQlnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJCX0KLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5ERUwsIDEyNywgMCksCi0gICAgICAgICAgICAJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkJTLCA4LCAwKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoLyogQ1RSTCArIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEtleVN0cm9rZS5nZXRQcmVzc2VkKChjaGFyKSAweDA0LCAxMDAsIFNXVC5DVFJMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKSk7Ci0gICAgICAgICAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKG5ldyBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbih0aGlzLFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKSk7Ci0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbiBtb3ZlQWN0aW9uID0gKChBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbilnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5NT1ZFX0RPV05fQUNUSU9OKSk7Ci0gICAgICAgICAgICBrZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuQVJST1dfRE9XTiwgU1dULkNUUkwpLAotICAgICAgICAgICAgCQltb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24odGhpcyxQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkpOwotICAgICAgICAgICAgbW92ZUFjdGlvbiA9ICgoQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24pZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uTU9WRV9VUF9BQ1RJT04pKTsKLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5BUlJPV19VUCwgU1dULkNUUkwpLAotICAgICAgICAgICAgCQltb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24odGhpcyxQb3NpdGlvbkNvbnN0YW50cy5XRVNUKSk7Ci0gICAgICAgICAgICBtb3ZlQWN0aW9uID0gKChBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbilnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5NT1ZFX0xFRlRfQUNUSU9OKSk7Ci0gICAgICAgICAgICBrZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuQVJST1dfTEVGVCwgU1dULkNUUkwpLAotICAgICAgICAgICAgCQltb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24odGhpcyxQb3NpdGlvbkNvbnN0YW50cy5FQVNUKSk7Ci0gICAgICAgICAgICBtb3ZlQWN0aW9uID0gKChBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbilnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5NT1ZFX1JJR0hUX0FDVElPTikpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkFSUk9XX1JJR0hULCBTV1QuQ1RSTCksCi0gICAgICAgICAgICAJCW1vdmVBY3Rpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDVFJMICsgQSAqLwotICAgICAgICAgICAgYWN0aW9uID0gU2VsZWN0QWxsQWN0aW9uLmNyZWF0ZVNlbGVjdEFsbEFjdGlvbihnZXRFZGl0b3JTaXRlKCkKLQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSk7Ci0gICAgICAgICAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJCWtleUhhbmRsZXIucHV0KAotICAgICAgICAgICAgCQlLZXlTdHJva2UuZ2V0UmVsZWFzZWQoKGNoYXIpIDB4MSwgOTcsIFNXVC5DVFJMKSwKLSAgICAgICAgICAgIAkJYWN0aW9uKTsKLQkJCS8vIEtleSBwcmVzc2VkIGV2ZW50IGZvciBDVFJMICsgQSBpcyBub3QgdHJpZ2dlcmVkLCB1c2Uga2V5IHJlbGVhc2VkIGV2ZW50IGZvciBub3cKLQkJCS8vCi0JCQlrZXlIYW5kbGVyLnB1dCgKLSAgICAgICAgICAgIAkJS2V5U3Ryb2tlLmdldFJlbGVhc2VkKChjaGFyKSAweDEsIDk3LCBTV1QuQ1RSTCksCi0gICAgICAgICAgICAJCWFjdGlvbik7Ci0gCQl9Ci0JCQotCQlyZXR1cm4ga2V5SGFuZGxlcjsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCQljcmVhdGVDb250cm9sRmxvd0FjdGlvbigpOwotCQkKLQkJLy8gUmVnaXN0ZXIgYWxpZ25tZW50IGFjdGlvbnM6Ci0JCWFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlKAotCQkJCWdldERpYWdyYW1NYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLAotCQkJCWdldEVkaXREb21haW4oKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduQXZlcmFnZUFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFuQWN0aW9uKFN0cmluZyBhY3Rpb25OYW1lLAotCQkJTGlzdDxJRWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlLCBTdHJpbmcgYWN0aW9uSWQsCi0JCQlTdHJpbmcgdG9vbHRpcFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzYykgewotCQlDcmVhdGVFbGVtZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBDcmVhdGVFbGVtZW50QWN0aW9uKHRoaXMsIGFjdGlvbk5hbWUpOwotCQlhY3Rpb24uc2V0RWxlbWVudFR5cGVzKGVsZW1lbnRUeXBlKTsKLQkJYWN0aW9uLnNldFByZWZlcmVuY2VIaW50KGdldFByZWZlcmVuY2VzSGludCgpKTsKLQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZWRlc2MpOwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQodG9vbHRpcFN0cmluZyk7Ci0JCWFjdGlvbi5zZXRJZChhY3Rpb25JZCk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWlmKGFjdGlvblNlcnZpY2UgIT0gbnVsbCl7Ci0JCQlhY3Rpb25TZXJ2aWNlLmNyZWF0ZUFsaWduTWVudShtZW51LCBpc0VkaXRhYmxlKCkpOwotCQl9Ci0JCWFkZFRvTWVudShtZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9MSU5LLAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIHRydWUsIHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUsIFN0cmluZyBpZCwgU3RyaW5nIGdyb3VwTmFtZSwgCi0JCQlib29sZWFuIHNlcGFyYXRvciwgYm9vbGVhbiBhcHBlbmQpIHsKLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSBpc0VkaXRhYmxlKCk7Ci0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKGlkKTsKLQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJaWYgKGFwcGVuZCkgewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBhY3Rpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1lbnUucHJlcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBhY3Rpb24pOwotCQkJCX0KLQkJCQlpZiAoc2VwYXJhdG9yKSB7Ci0JCQkJCW1lbnUuaW5zZXJ0QWZ0ZXIoaWQsIG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJfQotCQkJfQotCQl9ZWxzZXsKLQkJCWlmKHNlcGFyYXRvciAmJiBjYW5Nb2RpZnkpewotCQkJCWlmKGFwcGVuZCl7Ci0JCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChncm91cE5hbWUsIG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJfWVsc2V7Ci0JCQkJCW1lbnUucHJlcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBuZXcgU2VwYXJhdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUbyByZXNldCB0aGUgbGF5b3V0IG9mIHRoZSBkaWFncmFtLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0TGF5b3V0KCl7Ci0JCS8vIGRvZXMgbm90aGluZy4gY2xpZW50IHNob3VsZCBpbXBsZW1lbnQuCi0JfQotCQotCQotCS8qKgotCSAqIFJlZnJlc2ggZGlhZ3JhbQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaWFncmFtKCl7Ci0JCXJlZnJlc2goKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBJbWFnZSBnZXRQYXJ0SW1hZ2UoKTsKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbEZsb3dBY3Rpb24oKXsKLQkJSUFjdGlvbiBsaW5rQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA9PSAyKSB7Ci0JCQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgxKTsKLQkJCQkJCi0JCQkJCVZpZXcgc291cmNlTW9kZWwgPSAoVmlldylzb3VyY2VFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlWaWV3IHRhcmdldE1vZGVsID0gKFZpZXcpdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCi0JCQkJCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHNvdXJjZU1vZGVsKSAKLQkJCQkJCQl8fCBCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh0YXJnZXRNb2RlbCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCQotCQkJCQlDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdCBjb25uZWN0aW9uUmVxdWVzdCA9IAotCQkJCQkJZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCk7Ci0JCQkJCWlmIChjb25uZWN0aW9uUmVxdWVzdCAhPSBudWxsKSB7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRTb3VyY2VFZGl0UGFydChudWxsKTsKLQkJCQkJCWNvbm5lY3Rpb25SZXF1ZXN0LnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCQkJCWNvbm5lY3Rpb25SZXF1ZXN0Ci0JCQkJCQkJCS5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fU1RBUlQpOwotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDAsIDApKTsKLQkJCQkJCXNvdXJjZUVkaXRQYXJ0LmdldENvbW1hbmQoY29ubmVjdGlvblJlcXVlc3QpOwotCi0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRTb3VyY2VFZGl0UGFydChzb3VyY2VFZGl0UGFydCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRUYXJnZXRFZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdAotCQkJCQkJCQkuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX0VORCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMCwgMCkpOwotCi0JCQkJCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkJCQlpZiAoZGlhZ3JhbUVkaXRQYXJ0LmlzRWRpdE1vZGVFbmFibGVkKCkpIHsKLQkJCQkJCQlDb21tYW5kIGNtZCA9IHRhcmdldEVkaXRQYXJ0Ci0JCQkJCQkJCQkuZ2V0Q29tbWFuZChjb25uZWN0aW9uUmVxdWVzdCk7Ci0JCQkJCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlpZihnZXRDcmVhdGVDb250cm9sRmxvd1JlcXVlc3QoKT09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikgewotCQkJCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMSk7Ci0KLQkJCQkJVmlldyBzb3VyY2VNb2RlbCA9IChWaWV3KSBzb3VyY2VFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlWaWV3IHRhcmdldE1vZGVsID0gKFZpZXcpIHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHNvdXJjZU1vZGVsKSAKLQkJCQkJCQl8fCBCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh0YXJnZXRNb2RlbCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREaWFncmFtKCkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmKGVkZ2UuZ2V0U291cmNlKCk9PSBzb3VyY2VNb2RlbCAmJiBlZGdlLmdldFRhcmdldCgpID09IHRhcmdldE1vZGVsKXsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChzb3VyY2VNb2RlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQkJCQl8IHNvdXJjZU1vZGVsLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkTm9kZQotCQkJCQkJCXx8IHRhcmdldE1vZGVsLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCQkJCXx8IHRhcmdldE1vZGVsLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTElOSzsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuQ09OVFJPTF9GTE9XX0lNQUdFX0RFU0NSSVBUT1I7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obGlua0FjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nIGNsaWVudCBzaG91bGQgaW1wbGVtZW50LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgaW50IHR5cGUpIHsKLQkJcmV0dXJuIGdldERpYWdyYW1TZXJ2aWNlKCkuZ2V0RGlhZ3JhbShhY3Rpdml0eSwgdHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUVkaXRvcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTc0ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotLyoqCi0gKiBEaWFncmFtRWRpdG9yIElucHV0IGZvciB7QGxpbmsgQnJlYWtkb3duRWxlbWVudH0gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQlwcml2YXRlIGludCBkaWFncmFtVHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGlhZ3JhbUVkaXRvcklucHV0IGZvciBhY3Rpdml0eSBkaWFncmFtCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI0RpYWdyYW1FZGl0b3JJbnB1dChPYmplY3QsIFN1cHByZXNzaW9uLCBpbnQpfQotCSAqLwotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQoT2JqZWN0IG9iamVjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJdGhpcyhvYmplY3QsIHN1cHByZXNzaW9uLCBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gc3VwcHJlc3Npb24KLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiAgICAgICAgICAgIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50czoKLQkgKiAgICAgICAgICAgIHtAbGluayBJRGlhZ3JhbU1hbmFnZXIjQUNUSVZJVFlfRElBR1JBTX0sCi0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNfSwKLQkgKiAgICAgICAgICAgIHtAbGluayBJRGlhZ3JhbU1hbmFnZXIjV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvcklucHV0KE9iamVjdCBvYmplY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJfQotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JCXRoaXMuZGlhZ3JhbVR5cGUgPSBkaWFncmFtVHlwZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIGRpYWdyYW1UeXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3VwcHJlc3Npb24uCi0JICovCi0JcHVibGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3cmFwcGVyLgotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBnZXRXcmFwcGVyKCkgewotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChnZXRDbGFzcygpLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJRGlhZ3JhbUVkaXRvcklucHV0IG90aGVyID0gKERpYWdyYW1FZGl0b3JJbnB1dCkgb2JqOwotCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnQoKSA9PSBvdGhlci5nZXRNZXRob2RFbGVtZW50KCkKLQkJCQkJJiYgKChzdXBwcmVzc2lvbiA9PSBudWxsICYmIG90aGVyLmdldFN1cHByZXNzaW9uKCkgPT0gbnVsbCkgfHwgCi0JCQkJCQkJKHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKSA9PSBvdGhlci5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKSkpCi0JCQkJCSYmIGdldERpYWdyYW1UeXBlKCkgPT0gb3RoZXIuZ2V0RGlhZ3JhbVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBnZXRNZXRob2RFbGVtZW50KCkuaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKS5oYXNoQ29kZSgpOwotCQlyZXN1bHQgXj0gZ2V0RGlhZ3JhbVR5cGUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJbWV0aG9kRWxlbWVudCA9IGU7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dFByb3h5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUVkaXRvcklucHV0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4Zjg0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUVkaXRvcklucHV0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklEaXNwb3NhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGV4dGVuZHMgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGltcGxlbWVudHMgSURpc3Bvc2FibGUKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlSGludDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld0RpYWdyYW07Ci0JCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCwgUHJlZmVyZW5jZXNIaW50IGhpbnQpIHsKLQkJc3VwZXIoaW5wdXQpOwotCQl0aGlzLnByZWZlcmVuY2VIaW50ID0gaGludDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlhZ3JhbSA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCWlmKGRpYWdyYW0gPT0gbnVsbCB8fCBkaWFncmFtLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCWlmKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2Nlc3MsIHRoaXMpOwotCQkJCXRyeSB7Ci0JCQkJCWludCBkaWFncmFtVHlwZSA9IGdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldERpYWdyYW1UeXBlKCk7Ci0JCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IG1nci5nZXREaWFncmFtcyhhY3QsIGRpYWdyYW1UeXBlKTsKLQkJCQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCWRpYWdyYW0gPSBtZ3IuY3JlYXRlRGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlLCBwcmVmZXJlbmNlSGludCk7Ci0JCQkJCQlpc05ld0RpYWdyYW0gPSBkaWFncmFtICE9IG51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGwgPyBkaWFncmFtLmVSZXNvdXJjZSgpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnJlc291cmNlcy5JRGlhZ3JhbVN0b3JhZ2UoKSB7Ci0JCQkJcHJpdmF0ZSBJRmlsZSBmaWxlOwotCQkJCQotCQkJCXByaXZhdGUgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCQkJaWYoZmlsZSA9PSBudWxsKSB7Ci0JCQkJCQlmaWxlID0gRGlhZ3JhbUVkaXRvcklucHV0UHJveHkudGhpcy5nZXRGaWxlKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZpbGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0JCQkJCXJldHVybiBnZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQkJCXJldHVybiByZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQkJCXJldHVybiBnZXRGaWxlKCkuaXNSZWFkT25seSgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCXJldHVybiBnZXRGaWxlKCkuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQkJCQlyZXR1cm4gZGlhZ3JhbTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpLmdldE5hbWUoKTsKLQkJfQotCQljYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkvLyBkb24ndCBzaG93IHRoaXMgaW5wdXQgaW4gdGhlIGxpc3Qgb2YgcmVjZW50bHkgb3BlbiBmaWxlcwotCQkvLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIGdldEZpbGUoKS5nZXRMb2NhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCWlmKGFkYXB0ZXIgPT0gSUZpbGUuY2xhc3MpIHsKLQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmaWxlLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZihvYmogPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYob2JqIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCXJldHVybiBnZXREaWFncmFtRWRpdG9ySW5wdXQoKS5lcXVhbHMoKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSlvYmopLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXREaWFncmFtRWRpdG9ySW5wdXQoKS5oYXNoQ29kZSgpOwotCX0KLQkKLQlwdWJsaWMgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VIaW50KCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZUhpbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTmV3RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGlzTmV3RGlhZ3JhbTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTcxZTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dEZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGltcGxlbWVudHMKLQkJSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSB7Ci0KLQlwcml2YXRlIERpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtRWRpdG9ySW5wdXQ7Ci0gICAgcHJpdmF0ZSBJRmlsZSBmaWxlOwotICAgIHByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCi0JcHJvdGVjdGVkIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eShEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJdGhpcy5kaWFncmFtRWRpdG9ySW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5I2dldERpYWdyYW1FZGl0b3JJbnB1dCgpCi0JICovCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKSB7Ci0JCXJldHVybiBkaWFncmFtRWRpdG9ySW5wdXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50Lk1FZGl0aW5nRG9tYWluRWxlbWVudCNnZXRFZGl0aW5nRG9tYWluKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZXhpc3RzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElGaWxlLmNsYXNzKSB7Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfQotICAgICAgICByZXR1cm4gZmlsZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBlcnNpc3RhYmxlRWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIEZpbGVFZGl0b3JJbnB1dEZhY3RvcnkuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIElDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoZmlsZS5nZXROYW1lKCksIGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RvcmFnZUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotICAgICAgICByZXR1cm4gZGlhZ3JhbUVkaXRvcklucHV0LmdldE1ldGhvZEVsZW1lbnQoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlI3NhdmVTdGF0ZShvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKXsKLQkJdGhpcy5kb21haW4gPSBkb21haW47Ci0JfQotCi0JICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUGF0aEVkaXRvcklucHV0Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqIEBpc3N1ZSBjb25zaWRlciB1c2luZyBhbiBpbnRlcm5hbCBhZGFwdGVyIGZvciBJUGF0aEVkaXRvcklucHV0IHJhdGhlciB0aGFuIGFkZGluZyB0aGlzIGFzIEFQSQotICAgICAqLwotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gZmlsZS5nZXRMb2NhdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKCIgKyBnZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0lEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0lEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTU3ZTk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlciB7Ci0JRGlhZ3JhbUVkaXRvcklucHV0IGdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCUlFZGl0b3JQYXJ0IGdldEVkaXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0lEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjU1N2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0lEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuTUVkaXRpbmdEb21haW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGV4dGVuZHMgTUVkaXRpbmdEb21haW5FbGVtZW50LAotCQlJRmlsZUVkaXRvcklucHV0LCBJUGF0aEVkaXRvcklucHV0LCBJUGVyc2lzdGFibGVFbGVtZW50IHsKLQkKLQlwdWJsaWMgRGlhZ3JhbUVkaXRvcklucHV0IGdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbik7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyZjY0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLlNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5yZXNvdXJjZXMuSURpYWdyYW1TdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0b3JVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdQRERfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFZGl0b3JJZChpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQURfRURJVE9SX0lEOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBBRERfRURJVE9SX0lEOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFdQRERfRURJVE9SX0lEOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkRpYWdyYW1FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0LCBQcmVmZXJlbmNlc0hpbnQgaGludCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSA9IG5ldyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eShpbnB1dCwgaGludCk7Ci0KLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKGlucHV0UHJveHksIGdldEVkaXRvcklkKGlucHV0LmdldERpYWdyYW1UeXBlKCkpLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlpZihlZGl0b3JQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCWlmKGlucHV0LmdldERpYWdyYW1UeXBlKCkgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSB7Ci0JCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9ICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWVkaXRvclBhcnQpOwotCQkJCWVkaXRvci5yZXNldExheW91dCgpOwotCQkJCS8vIFRPRE86IGhhcyB0byBjYWxsIHJlc2V0TGF5b3V0IHR3aWNlIGhlcmUgc28gaXQgY2FuIGxheW91dCBwcm9wZXJseQotCQkJCS8vIG5lZWQgdG8gaW1wcm92ZSB0aGlzIG1ldGhvZAotCQkJCS8vCi0JCQkJZWRpdG9yLnJlc2V0TGF5b3V0KCk7Ci0JCQl9Ci0JCQkKLQkJCUlEb2N1bWVudFByb3ZpZGVyIGRvY1Byb3ZpZGVyID0gKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpZWRpdG9yUGFydCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCi0JCQkvLyBzZXQgdGhlIGRvY3VtZW50IGFzIHNhdmFibGUgaWYgdGhlIGRpYWdyYW0gaXMgbmV3Ci0JCQkvLwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IG51bGw7Ci0JCQkJT2JqZWN0IGNvbnN1bWVyID0gbmV3IE9iamVjdCgpOwotCQkJCXRyeSB7Ci0JCQkJCW1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2MsIGNvbnN1bWVyKTsKLQkJCQkJaWYobWdyICE9IG51bGwgJiYgaW5wdXRQcm94eS5pc05ld0RpYWdyYW0oKSkgewotCQkJCQkJZG9jUHJvdmlkZXIuc2V0Q2FuU2F2ZURvY3VtZW50KGlucHV0UHJveHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKGNvbnN1bWVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gaW5pdGlhbGl6YXRpb24gbWlnaHQgaGF2ZSBtYWRlIHRoZSBkb2N1bWVudCBkaXJ0eQotCQkJLy8gdGhpcyB3aWxsIGNsZWFyIGRpcnR5IGZsYWcgb2YgdGhlIGVkaXRvcgotCQkJLy8KLQkJCWlmIChkb2NQcm92aWRlciBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIKLQkJCQkJJiYgZWRpdG9yUGFydC5pc0RpcnR5KCkKLQkJCQkJJiYgIWlucHV0UHJveHkuaXNOZXdEaWFncmFtKCkpIHsKLQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIGRvY1Byb3ZpZGVyKQotCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKGlucHV0UHJveHkpOwotCQkJfQkJCQotCi0JCQkvLyBDaGVjayB3aGV0aGVyIGRpYWdyYW0gaXMgcmVhZC1vbmx5IGFuZCBwbHVnLWluIGlzIGxvY2tlZC4gCi0JCQkvLwotCQkJaWYoIWlzTW9kaWZpYWJsZShpbnB1dFByb3h5KSl7Ci0JCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWVkaXRvclBhcnQpLmdldERvY3VtZW50UHJvdmlkZXIoKSkubG9jayh0cnVlKTsKLQkJCQlEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSAoKElEaWFncmFtV29ya2JlbmNoUGFydCllZGl0b3JQYXJ0KS5nZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJCQllZGl0UGFydC5kaXNhYmxlRWRpdE1vZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdG9yUGFydDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hWaXN1YWwoRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCS8vIHJlZnJlc2ggbGFiZWxzCi0JCS8vCi0JCUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxPYmplY3Q+KGVkaXRQYXJ0LCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8Pz4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKEVkaXRQYXJ0KW9iamVjdCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgSVRleHRBd2FyZUVkaXRQYXJ0IHx8IGNoaWxkIGluc3RhbmNlb2YgQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgewotCQkJCSgoRWRpdFBhcnQpY2hpbGQpLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlZnJlc2ggY29ubmVjdGlvbnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVkaXRQYXJ0LmdldENvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm4gPSAoQ29ubmVjdGlvbkVkaXRQYXJ0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQljb25uLnJlZnJlc2goKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaExhYmVscyhEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQpIHsKLS8vCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZWRpdCBwYXJ0IGZpZ3VyZSBpcyBsYXJnZSBlbm91Z2ggdG8gc2hvdyB0aGUgaWNvbiBhbmQgYWxsIHRoZSB0ZXh0Ci0vLwkJLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLS8vCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotLy8JCQkJSUZpZ3VyZSBmID0gKChHcmFwaGljYWxFZGl0UGFydCljaGlsZCkuZ2V0RmlndXJlKCk7Ci0vLwkJCQlpZihmIGluc3RhbmNlb2YgRGVmYXVsdFNpemVOb2RlRmlndXJlKSB7Ci0vLwkJCQkJT2JqZWN0IGYyID0gKChEZWZhdWx0U2l6ZU5vZGVGaWd1cmUpZikuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0vLwkJCQlpZihmMiBpbnN0YW5jZW9mIFJlY3RhbmdsZUZpZ3VyZSkgewotLy8JCQkJCVJlY3RhbmdsZUZpZ3VyZSBmaWd1cmUgPSAoUmVjdGFuZ2xlRmlndXJlKSBmMjsKLS8vCQkJCQlMaXN0IGNoaWxkcmVuID0gKChSZWN0YW5nbGVGaWd1cmUpZmlndXJlKS5nZXRDaGlsZHJlbigpOwotLy8JCQkJCWlmKCFjaGlsZHJlbi5pc0VtcHR5KCkpIHsKLS8vCQkJCQkJT2JqZWN0IGwgPSBjaGlsZHJlbi5nZXQoMCk7Ci0vLwkJCQkJCWlmKGwgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLS8vCQkJCQkJCVdyYXBMYWJlbCBsYWJlbCA9ICgoV3JhcExhYmVsKWwpOwotLy8JCQkJCQkJUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0vLwkJCQkJCQlEaW1lbnNpb24gZCA9IGZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0vLwkJCQkJCQlSZWN0YW5nbGUgdGV4dFIgPSBsYWJlbC5nZXRUZXh0Qm91bmRzKCk7CQkJCQkJCQotLy8vLy8vCQkJCQkJCXRleHRSLndpZHRoICs9ICh0ZXh0Ui53aWR0aCAqIFdpZGVuZWRXcmFwTGFiZWwuREVMVEFfRkFDVE9SKTsKLS8vLy8JCQkJCQkJdGV4dFIud2lkdGggKz0gMjA7Ci0vLy8vCQkJCQkJCWlmKHIud2lkdGggPCBkLndpZHRoIHx8IHIuaGVpZ2h0IDwgZC5oZWlnaHQpIHsKLS8vLy8JCQkJCQkJCVdyYXBMYWJlbCBsYWJlbCA9ICgoV3JhcExhYmVsKWwpOwotLy8vLwkJCQkJCQkJbGFiZWwuaW52YWxpZGF0ZSgpOwotLy8vLwkJCQkJCQkJZmlndXJlLnNldEJvdW5kcyhyLnVuaW9uKHRleHRSKSk7CQotLy8vLy8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obGFiZWwuZ2V0U3ViU3RyaW5nVGV4dCgpKTsKLS8vLy8JCQkJCQkJfQotLy8vLwkJCQkJCQlpZigiRGVzaWduIHRoZSBTb2x1dGlvbiIuZXF1YWxzKGxhYmVsLmdldFRleHQoKSkpIHsJCQotLy8JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGV4dDogJyIgKyBsYWJlbC5nZXRUZXh0KCkgKyAiJyIpOwotLy8JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGFiZWwgZm9udDogIiArIGxhYmVsLmdldEZvbnQoKSk7Ci0vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IGZvbnQ6ICIgKyBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYWxjdWxhdGVkIHRleHQgc2l6ZTogIiArIERpYWdyYW1Db3JlVXRpbC5nZXRUZXh0U2l6ZUluV3JhcExhYmVsKGxhYmVsLmdldFRleHQoKSwgbnVsbCwgci53aWR0aCwgci5oZWlnaHQsIG51bGwpKTsKLS8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkN1cnJlbnQgdGV4dCB3aWR0aDogIiArIHRleHRSLndpZHRoKTsKLS8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgd2lkdGg6ICIgKyByLndpZHRoKTsKLS8vLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJfQotLy8JCQl9CQkJCi0vLwkJfQotCQkKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlZGl0UGFydCwgZmFsc2UpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKEVkaXRQYXJ0KW9iamVjdCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgSVRleHRBd2FyZUVkaXRQYXJ0KSB7Ci0JCQkJKChJVGV4dEF3YXJlRWRpdFBhcnQpY2hpbGQpLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtIGdldERpYWdyYW0oRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RvcmFnZSBzdG9yYWdlID0gaW5wdXRQcm94eS5nZXRTdG9yYWdlKCk7Ci0JCXJldHVybiBzdG9yYWdlIGluc3RhbmNlb2YgSURpYWdyYW1TdG9yYWdlID8gKChJRGlhZ3JhbVN0b3JhZ2Upc3RvcmFnZSkuZ2V0RGlhZ3JhbSgpIDogbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb0luaXRpYWxpemUoCi0JCQlmaW5hbCBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSBpbnB1dFByb3h5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIERpYWdyYW0gbW9kZWwgPSBnZXREaWFncmFtKGlucHV0UHJveHkpOwotCQlpZihtb2RlbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYoRGlhZ3JhbU1hbmFnZXIuQURfa2luZC5lcXVhbHMobW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gKEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIpIEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihtb2RlbC5nZXRFbGVtZW50KCkpOwotCQkJaWYoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJYWRhcHRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKAotCQkJCQkJCQkoQWN0aXZpdHkpIGlucHV0UHJveHkKLQkJCQkJCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJCQlhZGFwdGVyCi0JCQkJCQkuc2V0RWRpdGluZ0RvbWFpbigoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgVHJhbnNhY3Rpb25VdGlsCi0JCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKG1vZGVsKSk7Ci0JCQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihpbnB1dFByb3h5Ci0JCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJYWRhcHRlci5zZXRWaWV3KG1vZGVsKTsKLQkJCQltb2RlbC5nZXRFbGVtZW50KCkuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkJfQotCQkJYWRhcHRlci5wb3B1bGF0ZURpYWdyYW0oKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKG1vZGVsLmdldFR5cGUoKSkKLQkJCQl8fCBEaWFncmFtTWFuYWdlci5XUERfa2luZC5lcXVhbHMobW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4obW9kZWwpOwotCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3AgPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LKSB7Ci0JCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gCi0JCQkJCQkob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgbW9kZWwuZ2V0RWxlbWVudCgpOwotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBpbnB1dFByb3h5LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlkLnNldFN1cHByZXNzaW9uKGlucHV0LmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQlkLnNldExpbmtlZEVsZW1lbnQoaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJCQkJZC5zZXRPYmplY3QoZC5nZXRMaW5rZWRFbGVtZW50KCkpOwotCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJb3AuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZU9uQWN0aXZhdGUoRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCWlmKGVkaXRQYXJ0LmdldFZpZXdlcigpIGluc3RhbmNlb2YgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKSB7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSAoKElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcillZGl0UGFydC5nZXRWaWV3ZXIoKSkuZ2V0RWRpdG9yKCk7Ci0JCQlpZihlZGl0b3IgIT0gbnVsbCAmJiBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSA9IChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQl0cnkgewotCQkJCQlpZihkb0luaXRpYWxpemUoaW5wdXRQcm94eSwgbW9uaXRvcikpIHsKLQkJCQkJCWRvUmVmcmVzaChlZGl0UGFydCwgbW9uaXRvciwgZmFsc2UpOwotCQkJCQkJcmVmcmVzaFZpc3VhbChlZGl0UGFydCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCwgZmluYWwgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CQkKLQkJdHJ5IHsKLQkJCWlmKGRvSW5pdGlhbGl6ZShpbnB1dFByb3h5LCBtb25pdG9yKSkgewotCQkJCXJlZnJlc2goZWRpdFBhcnQsIG1vbml0b3IpOwotCQkJCXJlZnJlc2hMYWJlbHMoZWRpdFBhcnQpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUVkZ2VzKFZpZXcgdmlldyl7Ci0JCWJvb2xlYW4gYWxsVmlzaWJsZSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IGNoaWxkID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZUltcGwpIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKWNoaWxkLmdldEVsZW1lbnQoKTsKLQkJCQlpZighbm9kZS5pc1Zpc2libGUoKSl7Ci0JCQkJCXNldEVkZ2VWaXNpYmlsaXR5KHZpZXcsIG5vZGUuaXNWaXNpYmxlKCkpOwotCQkJCX1lbHNlewotCQkJCQljaGlsZC5zZXRWaXNpYmxlKG5vZGUuaXNWaXNpYmxlKCkpOwotCQkJCQlzZXRFZGdlVmlzaWJpbGl0eShjaGlsZCwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgY2hpbGQuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCQkJCQlpZihzdHlsZSA9PSBudWxsKSB7Ci0JCQkJCQlzdHlsZSA9IChGb250U3R5bGUpIGNoaWxkLmNyZWF0ZVN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihjaGlsZC5pc1Zpc2libGUoKSAmJiBjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQkJCXVwZGF0ZUVkZ2VzKGNoaWxkKTsKLQkJCQl9Ci0JCQkJaWYobm9kZS5pc1Zpc2libGUoKSl7Ci0JCQkJCWFsbFZpc2libGUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIgCi0JCQkJJiYgISh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQkmJiAhKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkpewotCQkJc2V0RWRnZVZpc2liaWxpdHkodmlldywgYWxsVmlzaWJsZSk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RWRnZVZpc2liaWxpdHkoVmlldyB2aWV3LCBib29sZWFuIHZpc2liaWxpdHkpewotCQlEaWFncmFtIGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW0uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoZWRnZS5nZXRTb3VyY2UoKSA9PSB2aWV3IHx8IGVkZ2UuZ2V0VGFyZ2V0KCkgPT0gdmlldyl7Ci0JCQkJaWYodmlzaWJpbGl0eSl7Ci0JCQkJCXZpZXcuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQkJZWRnZS5zZXRWaXNpYmxlKHZpc2liaWxpdHkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJYm9vbGVhbiBhbGxWaXNpYmxlID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgY2hpbGQgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlSW1wbCkgewotCQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpY2hpbGQuZ2V0RWxlbWVudCgpOwotCQkJCWNoaWxkLnNldFZpc2libGUobm9kZS5pc1Zpc2libGUoKSk7Ci0JCQkJaWYobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBjaGlsZC5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCQkJCWlmKHN0eWxlID09IG51bGwpIHsKLQkJCQkJCXN0eWxlID0gKEZvbnRTdHlsZSkgY2hpbGQuY3JlYXRlU3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGNoaWxkLmlzVmlzaWJsZSgpICYmIGNoaWxkLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQkJdXBkYXRlVmlldyhjaGlsZCk7Ci0JCQkJfQotCQkJCWlmKG5vZGUuaXNWaXNpYmxlKCkpewotCQkJCQlhbGxWaXNpYmxlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lciAKLQkJCQkmJiAhKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKQotCQkJCSYmICEodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSkgewotLy8JCQlpZighYWxsVmlzaWJsZSkgewotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0vLwkJCX0KLQkJCXZpZXcuc2V0VmlzaWJsZShhbGxWaXNpYmxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJRWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gZWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0JCWlmKHZpZXdlciBpbnN0YW5jZW9mIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcikgewotCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpdmlld2VyKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCXJldHVybiBpc0luaGVyaXRlZChpbnB1dCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5oZXJpdGVkKERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbAotCQkJCSYmIGlucHV0LmdldFdyYXBwZXIoKS5pc0luaGVyaXRlZCgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldFNlbWFudGljQ2hpbGRyZW4oRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCUVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IGVkaXRQYXJ0LmdldFZpZXdlcigpOwotCQlpZih2aWV3ZXIgaW5zdGFuY2VvZiBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpIHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKXZpZXdlcikuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQlpZihpbnB1dCAhPSBudWxsICYmIGlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsICYmCi0JCQkJCWlucHV0LmdldFdyYXBwZXIoKS5pc0luaGVyaXRlZCgpKSB7Ci0JCQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlpZihtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG51bGw7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCk7Ci0JCQkJCVN0cmluZyB0eXBlID0gZGlhZ3JhbS5nZXRUeXBlKCk7Ci0JCQkJCWlmKERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCQlEaWFncmFtQWRhcHRlciBkYSA9ICgoRGlhZ3JhbUFkYXB0ZXIpQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKSk7Ci0JCQkJCQlpZihkYSAhPSBudWxsKSB7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCQlpZihUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeSh3cmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpICE9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQkJCQkJTGlzdCB3cmFwcGVycyA9IFByb2Nlc3NVdGlsLmdldFdyYXBwZXJzKHdyYXBwZXIsIG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpfSk7Ci0JCQkJCQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHdyYXBwZXJzLmdldCgwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlhZGFwdGVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIod3JhcHBlcik7Ci0JCQkJCQkJCWFkYXB0ZXIuc2V0RmlsdGVyKGRhLmdldEZpbHRlcigpKTsKLQkJCQkJCQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mod3JhcHBlcikpKTsKLQkJCQkJCQkJY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZihhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQkJCWFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKHR5cGUpIHx8IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kLmVxdWFscyh0eXBlKSkgewotCQkJCQkJRGlhZ3JhbUltcGwgZDsKLQkJCQkJCWlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyh0eXBlKSkgewotCQkJCQkJCWQgPSAoRGlhZ3JhbUltcGwpIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlkID0gKERpYWdyYW1JbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJCQkJCX0JCQkJCQkKLQkJCQkJCURpYWdyYW1JbXBsIGRpYWdyYW1JblVzZSA9ICgoRGlhZ3JhbUltcGwpZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBkaWFncmFtSW5Vc2UuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJCWlmKHN1cHByZXNzaW9uICE9IG51bGwpIHsKLQkJCQkJCQlkLnNldFdyYXBwZXIoaW5wdXQuZ2V0V3JhcHBlcigpKTsKLQkJCQkJCQlkLnNldEZpbHRlcihkaWFncmFtSW5Vc2UuZ2V0RmlsdGVyKCkpOwotCQkJCQkJCWQuc2V0U3VwcHJlc3Npb24oZGlhZ3JhbUluVXNlLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQkJCWNoaWxkcmVuID0gZC5nZXRDaGlsZHJlbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQ29ubmVjdGlvbnMoRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gdmlzaWJsZSA9IGVkZ2UuZ2V0U291cmNlKCkgIT0gbnVsbCAmJiBlZGdlLmdldFNvdXJjZSgpLmlzVmlzaWJsZSgpCi0JCQkJJiYgZWRnZS5nZXRUYXJnZXQoKSAhPSBudWxsICYmIGVkZ2UuZ2V0VGFyZ2V0KCkuaXNWaXNpYmxlKCk7Ci0JCQlpZihlZGdlLmlzVmlzaWJsZSgpICE9IHZpc2libGUpIHsKLQkJCQllZGdlLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbihEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJQ29sbGVjdGlvbiBzZW1hbnRpY0NoaWxkcmVuID0gZ2V0U2VtYW50aWNDaGlsZHJlbihlZGl0UGFydCk7Ci0JCWlmKHNlbWFudGljQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJcmVmcmVzaENoaWxkcmVuKGVkaXRQYXJ0LCBzZW1hbnRpY0NoaWxkcmVuKTsKLQkJCXJlZnJlc2hDb25uZWN0aW9ucyhlZGl0UGFydCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbHRlckNoaWxkcmVuKEVkaXRQYXJ0IGVkaXRQYXJ0LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBEaWFncmFtQ29yZVV0aWwuZ2V0RGlhZ3JhbUVkaXRQYXJ0KGVkaXRQYXJ0KTsKLQkJQ29sbGVjdGlvbiBzZW1hbnRpY0NoaWxkcmVuID0gZ2V0U2VtYW50aWNDaGlsZHJlbihkaWFncmFtRWRpdFBhcnQpOwotCQlpZihzZW1hbnRpY0NoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkgRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkgTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoY2hpbGQpOwotCQkJCSBpZihnZXRXcmFwcGVyKGUsIHNlbWFudGljQ2hpbGRyZW4pID09IG51bGwpIHsKLQkJCQkJIGl0ZXIucmVtb3ZlKCk7Ci0JCQkJIH0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0V3JhcHBlcihNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gc2VtYW50aWNDaGlsZHJlbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VtYW50aWNDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYyA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKFRuZ1V0aWwudW53cmFwKGMpID09IGUpIHsKLQkJCQlyZXR1cm4gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIGVkaXQgcGFydCBvZiBhbiBpbmhlcml0ZWQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdFBhcnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbihFZGl0UGFydCBlZGl0UGFydCwgQ29sbGVjdGlvbiBzZW1hbnRpY0NoaWxkcmVuKSB7CQkKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgZWRpdCBwYXJ0IG9mIFJvbGVUYXNrQ29tcG9zaXRlIHRoYXQgc2hvdWxkIG5vdCBiZSBzaG93biBpZgotCQkvLyBub25lIG9mIGl0cyB0YXNrcyBhcmUgdmlzaWJsZQotCQkvLwotCQlib29sZWFuIGlzUm9sZVRhc2tDb21wb3NpdGUgPSBmYWxzZTsKLQkJYm9vbGVhbiBoYXNUYXNrID0gZmFsc2U7Ci0JCU9iamVjdCBtb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKG1vZGVsIGluc3RhbmNlb2YgVmlldyAmJiAoKFZpZXcpbW9kZWwpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCQlpc1JvbGVUYXNrQ29tcG9zaXRlID0gdHJ1ZTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyCi0JCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlib29sZWFuIHJlZnJlc2hDaGlsZHJlbiA9IHRydWU7Ci0JCQkJRWRpdFBhcnQgY2hpbGRFZGl0UGFydCA9ICgoRWRpdFBhcnQpY2hpbGQpOwotCQkJCU9iamVjdCBtID0gY2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCWlmKG0gaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCVZpZXcgdiA9IChWaWV3KSBtOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh2KTsKLQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gZ2V0V3JhcHBlcihlLCBzZW1hbnRpY0NoaWxkcmVuKTsKLQkJCQkJCWJvb2xlYW4gdmlzaWJsZSA9IG9iamVjdCAhPSBudWxsOwotCQkJCQkJaWYodi5pc1Zpc2libGUoKSAhPSB2aXNpYmxlKSB7Ci0JCQkJCQkJdi5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCQkJfQotCQkJCQkJaWYoIXZpc2libGUpIHsKLQkJCQkJCQlyZWZyZXNoQ2hpbGRyZW4gPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoaXNSb2xlVGFza0NvbXBvc2l0ZSAmJiAhaGFzVGFzayAmJiBlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQloYXNUYXNrID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHRoaXMgaXMgYSBub24tVU1BIG5vZGUgbGlrZSBjb250cm9sIG5vZGUsIHRleHQgbm9kZSwgZmlndXJlLi4uCi0JCQkJCQkvLyAKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihyZWZyZXNoQ2hpbGRyZW4pIHsKLQkJCQkJcmVmcmVzaENoaWxkcmVuKGNoaWxkRWRpdFBhcnQsIHNlbWFudGljQ2hpbGRyZW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYoaXNSb2xlVGFza0NvbXBvc2l0ZSAmJiAhaGFzVGFzaykgewotCQkJKChWaWV3KWVkaXRQYXJ0LmdldE1vZGVsKCkpLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb1JlZnJlc2goZmluYWwgRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIGJvb2xlYW4gcmVmcmVzaERhdGEpIHsKLQkJZmluYWwgYm9vbGVhbiBpc0luaGVyaXRlZCA9IGlzSW5oZXJpdGVkKGVkaXRQYXJ0KTsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKGRpYWdyYW0uZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgewotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCQlBYnN0cmFjdEVNRk9wZXJhdGlvbiBvcCA9IG5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihkb21haW4sIFN0cmluZ1N0YXRpY3MuQkxBTkspIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCWlmKHJlZnJlc2hEYXRhKSB7Ci0JCQkJCQkvLyByZWZyZXNoIHRoZSBkYXRhCi0JCQkJCQkvLwotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCQkJZC5zZXRPYmplY3QoZC5nZXRMaW5rZWRFbGVtZW50KCkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBzaG93L2hpZGUgbm9kZXMgYWNjb3JkaW5nIHVwZGF0ZWQgZGF0YQotCQkJCQkvLwotCQkJCQlpZihpc0luaGVyaXRlZCkgewotCQkJCQkJcmVmcmVzaENoaWxkcmVuKGVkaXRQYXJ0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZUVkZ2VzKGRpYWdyYW0pOwotCQkJCQkJdXBkYXRlVmlldyhkaWFncmFtKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQkKLQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJb3AuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsJCQkJCi0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9CQkKLQkJfQotCQllbHNlIHsKLQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIERpYWdyYW1BZGFwdGVyKSB7Ci0JCQkJaWYocmVmcmVzaERhdGEpIHsKLQkJCQkJKChEaWFncmFtQWRhcHRlcilhZGFwdGVyKS5wb3B1bGF0ZURpYWdyYW0oKTsKLQkJCQl9Ci0JCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKSwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCi0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCQkJcmVmcmVzaENoaWxkcmVuKGVkaXRQYXJ0KTsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKGZpbmFsIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlciBwID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpZWRpdFBhcnQuZ2V0Vmlld2VyKCkpOyAKLQkJYm9vbGVhbiB3YXNEaXJ0eSA9IHAuZ2V0RWRpdG9yKCkgIT0gbnVsbCA/IHAuZ2V0RWRpdG9yKCkuaXNEaXJ0eSgpIDogZmFsc2U7Ci0JCWJvb2xlYW4gd2FzQmFzZURpcnR5ID0gZmFsc2U7Ci0JCUlFZGl0b3JQYXJ0IGJhc2VFZGl0b3IgPSBudWxsOwotCQlmaW5hbCBib29sZWFuIGlzSW5oZXJpdGVkID0gaXNJbmhlcml0ZWQoZWRpdFBhcnQpOwotCQlpZihpc0luaGVyaXRlZCkgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoZWRpdFBhcnQuZ2V0RGlhZ3JhbVZpZXcoKSk7Ci0JCQlTdHJpbmcgdHlwZSA9IGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkuZ2V0VHlwZSgpOwotCQkJCi0JCQlpZihwLmdldEVkaXRvcigpICE9IG51bGwpIHsKLQkJCQkvLyB0cnkgdG8gZmluZCB0aGUgZGlydHkgZmxhZyBvZiBiYXNlIGRpYWdyYW0gZWRpdG9yCi0JCQkJLy8KLQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IHAuZ2V0RWRpdG9yKCkuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gZWRpdG9yUmVmc1tpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKHJlZi5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlyZWYuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCQkJaWYoaW5wdXQuZ2V0V3JhcHBlcigpID09IG51bGwgJiYgaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpID09IGVsZW1lbnQgJiYKLQkJCQkJCQkJCURpYWdyYW1NYW5hZ2VyLmdldERpYWdyYW1UeXBlKHR5cGUpID09IGlucHV0LmdldERpYWdyYW1UeXBlKCkpIHsKLQkJCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCQkJCWlmKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3YXNCYXNlRGlydHkgPSBlZGl0b3IuaXNEaXJ0eSgpOwotCQkJCQkJCQkJYmFzZUVkaXRvciA9IGVkaXRvcjsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWRvUmVmcmVzaChlZGl0UGFydCwgbW9uaXRvciwgdHJ1ZSk7Ci0JCQotCQkvLyBlZGl0b3JzIGNhbiBiZWNvbWUgZGlydHkgYWZ0ZXIgcmVmcmVzaAotCQkvLyBjbGVhciBkaXJ0eSBmbGFnCi0JCS8vCi0JCWlmKCF3YXNEaXJ0eSAmJiBwLmdldEVkaXRvcigpICE9IG51bGwgJiYgcC5nZXRFZGl0b3IoKS5pc0RpcnR5KCkpIHsKLQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikoKERpYWdyYW1Eb2N1bWVudEVkaXRvcilwLmdldEVkaXRvcigpKS5nZXREb2N1bWVudFByb3ZpZGVyKCkpCi0JCQkJLm1hcmtEb2N1bWVudEFzU2F2ZWQoKElGaWxlRWRpdG9ySW5wdXQpIHAuZ2V0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQkJaWYoYmFzZUVkaXRvciAhPSBudWxsICYmICF3YXNCYXNlRGlydHkpIHsKLQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikoKERpYWdyYW1Eb2N1bWVudEVkaXRvciliYXNlRWRpdG9yKS5nZXREb2N1bWVudFByb3ZpZGVyKCkpCi0JCQkJLm1hcmtEb2N1bWVudEFzU2F2ZWQoKElGaWxlRWRpdG9ySW5wdXQpIGJhc2VFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goZmluYWwgRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gaXNpbmhlcml0ZWQpewotCQkKLQkJZmluYWwgYm9vbGVhbiBpc0luaGVyaXRlZCA9IGlzSW5oZXJpdGVkKGVkaXRQYXJ0KTsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKGRpYWdyYW0uZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgewotCQkJdHJ5IHsKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLmdldEVsZW1lbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIHJlZnJlc2ggdGhlIGRhdGEKLQkJCQkJCS8vCi0JCQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGQgPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlkLnNldE9iamVjdChkLmdldExpbmtlZEVsZW1lbnQoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJCi0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gc2hvdy9oaWRlIG5vZGVzIGFjY29yZGluZyB1cGRhdGVkIGRhdGEKLQkJCQkJCS8vCi0JCQkJCQlpZihpc0luaGVyaXRlZCkgewotCQkJCQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl1cGRhdGVFZGdlcyhkaWFncmFtKTsKLQkJCQkJCQl1cGRhdGVWaWV3KGRpYWdyYW0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBEaWFncmFtQWRhcHRlcikgewotCQkJCSgoRGlhZ3JhbUFkYXB0ZXIpYWRhcHRlcikucG9wdWxhdGVEaWFncmFtKCk7Ci0JCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKSwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCi0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCQkJcmVmcmVzaENoaWxkcmVuKGVkaXRQYXJ0KTsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEVkaXRvcihBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yKXsKLQkJaWYoZWRpdG9yLmlzRWRpdGFibGUoKSl7Ci0JCQlEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPWVkaXRvci5nZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSApewotCQkJCWluaXRpYWxpemUoZWRpdFBhcnQsIChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSlpbnB1dCwgCi0JCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpewotCQkJCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBpbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpZWxlbWVudDsKLQkJCQlpZihpbnB1dCAhPSBudWxsKXsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRJbnB1dCA9IGlucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZihkSW5wdXQgIT0gbnVsbCl7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBkSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJLy8gQ2hlY2sgZm9yIHBsdWdpbiBsb2NrLgotCQkJCQkJaWYoZSAhPSBudWxsKXsKLQkJCQkJCQlpZihUbmdVdGlsLmlzTG9ja2VkKGUpKSAKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJLy8gQ2hlY2sgd3JhcHBlciBpcyByZWFkb25seS4KLQkJCQkJCU9iamVjdCB3cmFwcGVyID0gZElucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKHdyYXBwZXIgIT0gbnVsbCAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXdyYXBwZXIpLmlzUmVhZE9ubHkoKSl7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogR01GIGFuZCBHRUYgaXMgbm90IGhhbmRsaW5nIGNvbm5lY3Rpb25zIHZpc2liaWxpdHkgcHJvcGVybHkuIAotCSAqIFRoaXMgaXMgd29yay1hcm91bmQgc29sdXRpb24gdG8gaGFuZGxlIGNvbm5lY3Rpb25zIHZpc2liaWxpdHkuICAKLQkgKiBWaXNpYmlsaXR5IG9mIGVkZ2VzIG5lZWQgdG8gc2V0IGZpcnN0IGFuZCB0aGVuIG5vZGVzLiAKLQkgKiBkZWZlY3Qgb3BlbmVkIGZvciB0aGlzOiAKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0MDgxCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hDb25uZWN0aW9uRWRpdFBhcnRzKERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQpIHsKLQotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKEdyYXBoaWNhbFZpZXdlcilkaWFncmFtRWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0JCURpYWdyYW0gYWN0ID0gKERpYWdyYW0pZGlhZ3JhbUVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCUxpc3QgZWRnZXMgPSBhY3QuZ2V0RWRnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihlZGdlLmlzVmlzaWJsZSgpKXsKLQkJCQlDb25uZWN0aW9uRWRpdFBhcnQgcGFydCA9IChDb25uZWN0aW9uRWRpdFBhcnQpdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoZWRnZSk7IAotCQkJCQkKLQkJCQlpZihwYXJ0ICE9IG51bGwpewotCQkJCQlpZihwYXJ0LmdldFNvdXJjZSgpID09IG51bGwpewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IG1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJCQkJCWlmKGVkZ2UuZ2V0U291cmNlKCkgPT0gbW9kZWwpewotCQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpewotCQkJCQkJCQkJaWYoKChHcmFwaGljYWxFZGl0UGFydCllbGVtZW50KS5nZXRGaWd1cmUoKS5pc1Zpc2libGUoKSl7Ci0JCQkJCQkJCQkJcGFydC5zZXRTb3VyY2UoZWxlbWVudCk7Ci0JCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCQlwYXJ0LnNldFNvdXJjZShudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihwYXJ0LmdldFRhcmdldCgpID09IG51bGwpewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IG1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJCQkJCWlmKGVkZ2UuZ2V0VGFyZ2V0KCkgPT0gbW9kZWwpewotCQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpewotCQkJCQkJCQkJaWYoKChHcmFwaGljYWxFZGl0UGFydCllbGVtZW50KS5nZXRGaWd1cmUoKS5pc1Zpc2libGUoKSl7Ci0JCQkJCQkJCQkJcGFydC5zZXRUYXJnZXQoZWxlbWVudCk7Ci0JCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCQlwYXJ0LnNldFRhcmdldChudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJdHJ5ewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uRWRpdFBhcnQgcGFydCA9IAotCQkJCQkob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0KXZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KGVkZ2UpOyAKLQkJCQlpZihwYXJ0ICE9IG51bGwgJiYgKHBhcnQuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBwYXJ0LmdldFRhcmdldCgpID09IG51bGwpCi0JCQkJCQkmJiBwYXJ0LmdldEZpZ3VyZSgpICE9IG51bGwpewotCQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCSAgICBwYXJ0LmdldEZpZ3VyZSgpLnJldmFsaWRhdGUoKTsKLQkJCQkJcGFydC5kZWFjdGl2YXRlKCk7Ci0JCQkJfQotCQl9Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlpZihEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSl7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBvY2N1cmVkIHdoaWxlIHJlZnJlc2ggdGhlIGNvbm5lY3Rpb246ICIrIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0FjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0FjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlMjYwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9BY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIGV4dGVuZHMKLQkJRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIHsKLQotCXB1YmxpYyBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyKAotCQkJQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyIGRvY3VtZW50UHJvdmlkZXIsIERpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCkgewotCQlzdXBlcihkb2N1bWVudFByb3ZpZGVyLCBkb2N1bWVudCk7Ci0JfQotCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJRGlhZ3JhbURvY3VtZW50IGRvYyA9IGdldERpYWdyYW1Eb2N1bWVudCgpOwotCQlyZXR1cm4gZG9jICE9IG51bGwgPyBkb2MuZ2V0RGlhZ3JhbSgpIDogbnVsbDsKLQl9CQkKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpICE9IE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSKSB7Ci0JCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCQlpZihmZWF0dXJlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlICYmICgoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmUpLmlzVHJhbnNpZW50KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJJiYgKFVtYVV0aWwuaXNDb250YWluZWRCeSgoRU9iamVjdCkgbm90aWZpZXIsIGdldERpYWdyYW0oKSkgfHwgVW1hVXRpbAotCQkJCQkJCS5pc0NvbnRhaW5lZEJ5KChFT2JqZWN0KSBub3RpZmllciwgZ2V0RGlhZ3JhbSgpCi0JCQkJCQkJCQkuZ2V0RWxlbWVudCgpKSkpIHsKLQkJCQlnZXREaWFncmFtRG9jdW1lbnQoKS5zZXRDb250ZW50KAotCQkJCQkJZ2V0RGlhZ3JhbURvY3VtZW50KCkuZ2V0Q29udGVudCgpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTIxYzk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBDbGFzcyB0byBoYW5kbGUgdGhlIHBvcHVwbWVudSBpdGVtcyAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoSVdvcmtiZW5jaFBhcnQgcGFydCwgRWRpdFBhcnRWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKHBhcnQsIHZpZXdlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAgZmluZChBY3Rpb25JZHMuQUNUSU9OX0RFTEVURV9GUk9NX0RJQUdSQU0pOwotCQlpZihpdGVtICE9IG51bGwpCi0JCWl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbTE9ICBmaW5kKEFjdGlvbklkcy5BQ1RJT05fREVMRVRFX0ZST01fTU9ERUwpOwotCQlpZihpdGVtMSAhPSBudWxsKQotCQlpdGVtMS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0yID0gZmluZChBY3Rpb25JZHMuTUVOVV9OQVZJR0FURSk7Ci0JCWlmKGl0ZW0yICE9IG51bGwpCi0JCWl0ZW0yLnNldFZpc2libGUoZmFsc2UpOwotCQkKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbTMgPSBmaW5kKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpKTsKLQkJaWYoaXRlbTMgIT0gbnVsbCkKLQkJaXRlbTMuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotCQlFZGl0RG9tYWluIGRvbWFpbiA9IGdldFZpZXdlcigpLmdldEVkaXREb21haW4oKTsKLQkJaWYoZG9tYWluIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXREb21haW4pewotCQkJSUVkaXRvclBhcnQgcGFydD0gICgoRGlhZ3JhbUVkaXREb21haW4pZG9tYWluKS5nZXRFZGl0b3JQYXJ0KCk7Ci0JCQlpZihwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilwYXJ0KS5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhOGNhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGVnYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS51dGlsLklXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQ29yZSBkaWFncmFtIGNvbnRyaWJ1dGlvbiBpdGVtIHByb3ZpZGVyLiAKLSAqIEl0IHByb3ZpZGVzIGNvbnRyaWJ1dGlvbnMgZ2VuZXJpYyB0byBFUEYgZGlhZ3JhbSBlZGl0b3JzCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyCi0JCWV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQsIElXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvciBwYXJ0RGVzY3JpcHRvcikgewotCQlpZihhY3Rpb25JZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpewotCQkJcmV0dXJuIG5ldyBEZWxlZ2F0ZUFjdGlvbihwYXJ0RGVzY3JpcHRvci5nZXRQYXJ0UGFnZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWN0aW9uKGFjdGlvbklkLCBwYXJ0RGVzY3JpcHRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzFjMTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk9iamVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgYWxsIG9mIHRoZSBpY29uIHByb3ZpZGVycywgYW5kIGhhbmRsZXMgcXVlcnlpbmcgdGhlbSBmb3IKLSAqIGljb25zIGJhc2VkIG9uIHRoZSBub2RlIHByb3ZpZGVkLiBJdCB3aWxsIGRlY29kZSB0aGUgbm9kZSBiYWNrIHRvIHRoZQotICogTWV0aG9kRWxlbWVudCB0aGVuIHVzZSB0aGF0IHRvIGNhbGwgdGhlIHByb3ZpZGVyIGFuZCByZXRyaWV2ZSB0aGUgaWNvbi4KLSAqIAotICogCi0gKiBAYXV0aG9yIFBpZXJyZSBQYWRvdmFuaQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlciB7Ci0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gImRpYWdyYW1JY29uUHJvdmlkZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJjbGFzcyIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCX05BTUUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZWZlcmVuY2UgdG8gbXlzZWxmIGZvciBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlciBteXNlbGY7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiByZWdpc3RlcmVkIHByb3ZpZGVycwotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0PElEaWFncmFtSWNvblByb3ZpZGVyPiBwcm92aWRlcnM7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGF2b2lkIG91dHNpZGUgaW5zdGFudGlhdGlvbgotCSAqLwotCXByaXZhdGUgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIoKSB7Ci0JCS8vIHByaXZhdGUgdG8gYXZvaWQgb3V0c2lkZSBjYWxscwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKG15c2VsZiA9PSBudWxsKSB7Ci0JCQlteXNlbGYgPSBuZXcgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbXlzZWxmOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0byByZXR1cm4gYW4gSW1hZ2UgYmFzZWQgb24gYSBkaWFncmFtIGVsZW1lbnQuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gdGhlIGRpYWdyYW0gZWRpdCBwYXJ0cy4gSWYgdGhlcmUgYXJlIG5vCi0JICogcHJvdmlkZXJzLCBhIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgRU9iamVjdAotCSAqIEBwYXJhbSBzbWFsbEljb24KLQkgKiAgICAgICAgICAgIFRPRE8KLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oRU9iamVjdCBlbGVtZW50LCBib29sZWFuIHNtYWxsSWNvbikgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKHByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQlsb2FkUHJvdmlkZXJzKCk7Ci0JCX0KLQotCQkvLyBXZSBnZXQgYmFjayB0byB0aGUgTWV0aG9kRWxlbWVudCBieSByZXRyaWV2aW5nIHRoZSBlQW5ub3RhdGlvbiBjb250YWluaW5nIHRoZSBHVUlELCB0aGVuCi0JCS8vIGxvb2sgdXAgdGhlIGVsZW1lbnQgZnJvbSB0aGF0LgotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdE5vZGUpIHsKLQkJCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gKChPYmplY3ROb2RlKSBlbGVtZW50KQotCQkJCQkuZ2V0RUFubm90YXRpb24oQnJpZGdlSGVscGVyLlVNQV9FTEVNRU5UKTsKLQkJCVN0cmluZyBtb2RlbFVyaSA9IChTdHJpbmcpIGVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVVJJKTsKLQkJCVN0cmluZyBndWlkID0gbW9kZWxVcmkuc3Vic3RyaW5nKG1vZGVsVXJpLmluZGV4T2YoJyMnKSArIDEpOwotCQkJTWV0aG9kRWxlbWVudCBtZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcHJvdmlkZXJzLnNpemUoKSAmJiBpbWFnZSA9PSBudWxsOyBpbmRleCsrKSB7Ci0JCQkJSURpYWdyYW1JY29uUHJvdmlkZXIgaVByb3ZpZGVyID0gcHJvdmlkZXJzLmdldChpbmRleCk7Ci0JCQkJaW1hZ2UgPSBpUHJvdmlkZXIuZ2V0SW1hZ2VGb3JFbGVtZW50KG1lLCBzbWFsbEljb24pOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSB7Ci0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNhbiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBlbGVtZW50OwotCQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBzYW4KLQkJCQkJLmdldEVBbm5vdGF0aW9uKEJyaWRnZUhlbHBlci5VTUFfRUxFTUVOVCk7Ci0JCQlTdHJpbmcgbW9kZWxVcmkgPSAoU3RyaW5nKSBlQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1VSSSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IG1vZGVsVXJpLnN1YnN0cmluZyhtb2RlbFVyaS5pbmRleE9mKCcjJykgKyAxKTsKLQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHByb3ZpZGVycy5zaXplKCkgJiYgaW1hZ2UgPT0gbnVsbDsgaW5kZXgrKykgewotCQkJCUlEaWFncmFtSWNvblByb3ZpZGVyIGlQcm92aWRlciA9IHByb3ZpZGVycy5nZXQoaW5kZXgpOwotCQkJCWltYWdlID0gaVByb3ZpZGVyLmdldEltYWdlRm9yRWxlbWVudChtZSwgc21hbGxJY29uKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTmFtZWROb2RlSW1wbCkgewotCQkJTmFtZWROb2RlIHdwbiA9IChOYW1lZE5vZGUpIGVsZW1lbnQ7Ci0JCQlNZXRob2RFbGVtZW50IG1lID0gd3BuLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwcm92aWRlcnMuc2l6ZSgpICYmIGltYWdlID09IG51bGw7IGluZGV4KyspIHsKLQkJCQlJRGlhZ3JhbUljb25Qcm92aWRlciBpUHJvdmlkZXIgPSBwcm92aWRlcnMuZ2V0KGluZGV4KTsKLQkJCQlpbWFnZSA9IGlQcm92aWRlci5nZXRJbWFnZUZvckVsZW1lbnQobWUsIHNtYWxsSWNvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbG9hZHMgdGhlIGljb24gcHJvdmlkZXJzIGZyb20gdGhlIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkUHJvdmlkZXJzKCkgewotCQlwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElEaWFncmFtSWNvblByb3ZpZGVyPigpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXByb3ZpZGVycy5hZGQoKElEaWFncmFtSWNvblByb3ZpZGVyKSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX0FUVFJJQl9OQU1FKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvSURpYWdyYW1JY29uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0lEaWFncmFtSWNvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTBmZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvSURpYWdyYW1JY29uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGltcGxlbWVudCBhbiBpY29uIHByb3ZpZGVyIGZvciB0aGUgZGlhZ3JhbXMuCi0gKiAKLSAqIEBhdXRob3IgUGllcnJlIFBhZG92YW5pCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUljb25Qcm92aWRlciBleHRlbmRzIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIFRoaXMgcmVxdWlyZWQgbWV0aG9kLCBzaG91bGQgcmV0dXJuIGFuIGltYWdlIGZvciB0aGUgc3VwcGxpZWQgbWV0aG9kCi0JICogZWxlbWVudCwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlLiBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgc2l6ZSBzbWFsbAotCSAqICgxNngxNikgb3IgbGFyZ2UgKDMyeDMyKSBvZiB0aGUgaWNvbiBtdXN0IGJlIGhvbm9yZWQgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbWUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gc21hbGxJY29uCi0JICogICAgICAgICAgICBib29sZWFuCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZUZvckVsZW1lbnQoTWV0aG9kRWxlbWVudCBtZSwgYm9vbGVhbiBzbWFsbEljb24pOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTgyZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5GaWxlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5TdG9yYWdlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5Xb3Jrc3BhY2VPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5FZGl0b3JJREVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC5FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLkVkaXRvclN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIFN0b3JhZ2VEaWFncmFtRG9jdW1lbnRQcm92aWRlciAKLXsKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJFeCBleHRlbmRzIEZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFNhdmVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQlJRmlsZUVkaXRvcklucHV0IGlucHV0PSAoSUZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCQlyZXR1cm4gY29tcHV0ZVNhdmVTY2hlZHVsaW5nUnVsZShpbnB1dC5nZXRGaWxlKCkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDb21wdXRlcyB0aGUgc2NoZWR1bGluZyBydWxlIG5lZWRlZCB0byBjcmVhdGUgb3IgbW9kaWZ5IGEgcmVzb3VyY2UuIElmCi0JCSAqIHRoZSByZXNvdXJjZSBleGlzdHMsIGl0cyBtb2RpZnkgcnVsZSBpcyByZXR1cm5lZC4gSWYgaXQgZG9lcyBub3QsIHRoZQotCQkgKiByZXNvdXJjZSBoaWVyYXJjaHkgaXMgaXRlcmF0ZWQgdG93YXJkcyB0aGUgd29ya3NwYWNlIHJvb3QgdG8gZmluZCB0aGUKLQkJICogZmlyc3QgcGFyZW50IG9mIDxjb2RlPnRvQ3JlYXRlT3JNb2RpZnk8L2NvZGU+IHRoYXQgZXhpc3RzLiBUaGVuIHRoZQotCQkgKiAnY3JlYXRlJyBydWxlIGZvciB0aGUgbGFzdCBub24tZXhpc3RpbmcgcmVzb3VyY2UgaXMgcmV0dXJuZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSB0b0NyZWF0ZU9yTW9kaWZ5IHRoZSByZXNvdXJjZSB0byBjcmVhdGUgb3IgbW9kaWZ5Ci0JCSAqIEByZXR1cm4gdGhlIG1pbmltYWwgc2NoZWR1bGluZyBydWxlIG5lZWRlZCB0byBtb2RpZnkgb3IgY3JlYXRlIGEgcmVzb3VyY2UKLQkJICovCi0JCXByaXZhdGUgSVNjaGVkdWxpbmdSdWxlIGNvbXB1dGVTYXZlU2NoZWR1bGluZ1J1bGUoSVJlc291cmNlIHRvQ3JlYXRlT3JNb2RpZnkpIHsKLQkJCWlmICh0b0NyZWF0ZU9yTW9kaWZ5LmV4aXN0cygpICYmIHRvQ3JlYXRlT3JNb2RpZnkuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotCQkJCXJldHVybiBmUmVzb3VyY2VSdWxlRmFjdG9yeS5yZWZyZXNoUnVsZSh0b0NyZWF0ZU9yTW9kaWZ5KTsKLQotCQkJSVJlc291cmNlIHBhcmVudD0gdG9DcmVhdGVPck1vZGlmeTsKLQkJCWRvIHsKLQkJCQkgLyoKLQkJCQkgKiBYWFggVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzYwMQotCQkJCSAqIElSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUgc2hvdWxkIGl0ZXJhdGUgdGhlIGhpZXJhcmNoeSBpdHNlbGYuCi0JCQkJICovCi0JCQkJdG9DcmVhdGVPck1vZGlmeT0gcGFyZW50OwotCQkJCXBhcmVudD0gdG9DcmVhdGVPck1vZGlmeS5nZXRQYXJlbnQoKTsKLQkJCX0gd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkgJiYgIXBhcmVudC5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpOwotCi0JCQlyZXR1cm4gZlJlc291cmNlUnVsZUZhY3RvcnkuY3JlYXRlUnVsZSh0b0NyZWF0ZU9yTW9kaWZ5KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJUnVubmFibGVDb250ZXh0IGdldE9wZXJhdGlvblJ1bm5lcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXJldHVybiBzdXBlci5nZXRPcGVyYXRpb25SdW5uZXIobW9uaXRvcik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyRXggZmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyID0gbmV3IEZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlckV4KCk7Ci0JCi0JLy9hIFN0b3JhZ2VJbmZvIHdpdGggYSBEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgCi0JcHJpdmF0ZSBjbGFzcyBEaWFncmFtU3RvcmFnZUluZm8gZXh0ZW5kcyBTdG9yYWdlSW5mbyB7Ci0KLQkJRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIGZMaXN0ZW5lcjsKLQkJcHVibGljIERpYWdyYW1TdG9yYWdlSW5mbyhJRG9jdW1lbnQgZG9jdW1lbnQsIERpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJZkxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCX0KLQkJCi0JfQotCi0JcHJpdmF0ZSBXb3Jrc3BhY2VPcGVyYXRpb25SdW5uZXIgZk9wZXJhdGlvblJ1bm5lcjsKLQlwcml2YXRlIERpYWdyYW1NYW5hZ2VyIGZEaWFncmFtTWdyOwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKERpYWdyYW1NYW5hZ2VyIGRpYWdyYW1NZ3IpIHsKLQkJc3VwZXIoKTsKLQkJZkRpYWdyYW1NZ3IgPSBkaWFncmFtTWdyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQkoKElEaWFncmFtRG9jdW1lbnQpZG9jdW1lbnQpLnNldEVkaXRpbmdEb21haW4oZkRpYWdyYW1NZ3IuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuc2V0RG9jdW1lbnRDb250ZW50KGRvY3VtZW50LCBlZGl0b3JJbnB1dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LlN0b3JhZ2VEaWFncmFtRG9jdW1lbnRQcm92aWRlciNzZXREb2N1bWVudENvbnRlbnRGcm9tU3RvcmFnZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50LCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnRGcm9tU3RvcmFnZShJRG9jdW1lbnQgZG9jdW1lbnQsIElTdG9yYWdlIHN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJCUlGaWxlIHJlc291cmNlRmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJCS8vIHVubG9hZCBpZiB0aGUgcmVzb3VyY2VGaWxlIGFuZCBzdG9yYWdlIGlzIHNhbWUuCi0JCQkvLyBpZiBub3Qgc2FtZSB0aHJvdyBleGNlcHRpb24uCi0JCQlpZihyZXNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCWlmKHJlc291cmNlRmlsZS5lcXVhbHMoc3RvcmFnZSkpIHsKLQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudChudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVkaXRvcklERVBsdWdpbi5nZXRQbHVnaW5JZCgpLCBFZGl0b3JTdGF0dXNDb2Rlcy5FUlJPUiwgRWRpdG9yTWVzc2FnZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkLCBudWxsKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWRvY3VtZW50LnNldENvbnRlbnQoKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnJlc291cmNlcy5JRGlhZ3JhbVN0b3JhZ2Upc3RvcmFnZSkuZ2V0RGlhZ3JhbSgpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LlN0b3JhZ2VEaWFncmFtRG9jdW1lbnRQcm92aWRlciNkaXNwb3NlRWxlbWVudEluZm8oamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlci5FbGVtZW50SW5mbykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQsIEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJKChEaWFncmFtU3RvcmFnZUluZm8paW5mbykuZkxpc3RlbmVyLnN0b3BMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBkb2N1bWVudC5nZXRDb250ZW50KCk7Ci0JCS8vVE9ETzogaGFuZGxlIGNhc2Ugd2hlcmUgdXNlciBkaWQgbm90IHJlZnJlc2ggZGlhZ3JhbSBhZnRlciBkaWFncmFtJ3MgcmVzb3VyY2UgaGFzIGJlZW4gcmVsb2FkZWQKLQkJLy8gZGlhZ3JhbSBkb2VzIG5vdCBoYXZlIGEgcmVzb3VyY2UgaW4gdGhpcyBjYXNlCi0JCS8vIGlmIG92ZXJ3cml0ZSBhbGxvd2VkLCB0aGlzIGRpYWdyYW0gc2hvdWxkIHJlcGxhY2UgdGhlIGRpYWdyYW0gaW4gdGhlIHJlbG9hZGVkIHJlc291cmNlLgotCQkvLwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCWlmICghb3ZlcndyaXRlKSB7Ci0JCQlEaWFncmFtTWFuYWdlci5jaGVja1N5bmNocm9uaXphdGlvblN0YXRlKHJlc291cmNlKTsKLQkJfQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpLmNoZWNrTW9kaWZ5KG5ldyBSZXNvdXJjZVtdIHtyZXNvdXJjZX0sIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JCQotCQkvLyBpbmZvcm0gYWJvdXQgdGhlIHVwY29taW5nIGNvbnRlbnQgY2hhbmdlCi0JCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2luZyhlbGVtZW50KTsKLQkJCi0JCWlmKGRpYWdyYW0uZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgewotCQkJdHJ5IHsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZGlhZ3JhbS5wZXJzaXN0Q2hpbGRyZW4oKTsKLQkJCQkJCWZvciAoT2JqZWN0IGNoaWxkIDogZGlhZ3JhbS5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJCQkJKChWaWV3KSBjaGlsZCkucGVyc2lzdENoaWxkcmVuKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQkKLQkJRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCXRyeSB7Ci0vLwkJCXJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkKLQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCi0JCQkvLyBpbmZvcm0gYWJvdXQgZmFpbHVyZQotCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlhZ3JhbUNvcmVQbHVnaW4uUExVR0lOX0lECi0JCQkJCSwgRWRpdG9yU3RhdHVzQ29kZXMuUkVTT1VSQ0VfRkFJTFVSRSwgZQotCQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlmRGlhZ3JhbU1nci5yZW1vdmVEaWFncmFtQmFja3VwKGdldEFjdGl2aXR5KChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLCBkaWFncmFtLmdldFR5cGUoKSk7Ci0JCQlpZihEaWFncmFtTWFuYWdlci5BRERfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpCi0JCQkJCXx8IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kLmVxdWFscyhkaWFncmFtLmdldFR5cGUoKSkpIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGQgPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJZC5zZXROZXcoZmFsc2UpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHgpIHsKLQkJCS8vIGluZm9ybSBhYm91dCBmYWlsdXJlCi0JCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJdGhyb3cgeDsKLQkJfQotCQkKLQkJaWYobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQkKLQkJbG9nUmVzb3VyY2VFcnJvcnNBbmRXYXJuaW5ncyhyZXNvdXJjZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9nUmVzb3VyY2VFcnJvcnNBbmRXYXJuaW5ncyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRFcnJvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlLkRpYWdub3N0aWMgZGlhZ25vc3RpYyA9IChSZXNvdXJjZS5EaWFnbm9zdGljKSBpdGVyLm5leHQoKTsKLQkJCUxvZy5lcnJvcihFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKSwgRWRpdG9yU3RhdHVzQ29kZXMuRVJST1IsIGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsJCQkJCi0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRXYXJuaW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UuRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gKFJlc291cmNlLkRpYWdub3N0aWMpIGl0ZXIubmV4dCgpOwotCQkJTG9nLndhcm5pbmcoRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCksIEVkaXRvclN0YXR1c0NvZGVzLldBUk5JTkcsIGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsJCQkJCi0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgaW5wdXQ9IChJRmlsZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJcmV0dXJuIEZpbGVTeW5jaHJvbml6ZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGlucHV0LmdldEZpbGUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUVsZW1lbnRJbmZvIGluZm8gPSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gY3JlYXRlRW1wdHlEb2N1bWVudCgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCXNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgaW5wdXQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCXN0YXR1cyA9IHguZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJCi0JCU9iamVjdCBuZXdDb250ZW50PSBkb2N1bWVudC5nZXRDb250ZW50KCk7Ci0JCQotCQkvLyBzZXQgdGhlIG5ldyBjb250ZW50IGFuZCBmaXJlIGNvbnRlbnQgcmVsYXRlZCBldmVudHMKLQkJZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoaW5wdXQpOwotCi0JCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5wdXQsIGluZm8pOwotCi0JCWluZm8uZkRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoaW5mbyk7Ci0JCWluZm8uZkRvY3VtZW50LnNldENvbnRlbnQobmV3Q29udGVudCk7Ci0JCWluZm8uZkNhbkJlU2F2ZWQgPSBmYWxzZTsKLQkJaW5mby5mU3RhdHVzID0gc3RhdHVzOwotCi0JCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5wdXQsIGluZm8pOwotCi0JCWZpcmVFbGVtZW50Q29udGVudFJlcGxhY2VkKGlucHV0KTsKLQl9Ci0JCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQgaW5mbyB0byBhIGNoYW5nZSBvZiB0aGUgZmlsZSBjb250ZW50IGFuZCBzZW5kcyBvdXQKLQkgKiBhcHByb3ByaWF0ZSBub3RpZmljYXRpb25zLgotCSAqCi0JICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBvZiBhIGRvY3VtZW50IGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJRWxlbWVudEluZm8gaW5mbyA9IGdldEVsZW1lbnRJbmZvKGlucHV0KTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKTsKLQkJSVN0YXR1cyBzdGF0dXM9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCXNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgaW5wdXQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCXN0YXR1cz0geC5nZXRTdGF0dXMoKTsKLQkJfQotCi0JCU9iamVjdCBuZXdDb250ZW50PSBkb2N1bWVudC5nZXRDb250ZW50KCk7Ci0KLQkJaWYgKCAhbmV3Q29udGVudC5lcXVhbHMoaW5mby5mRG9jdW1lbnQuZ2V0Q29udGVudCgpKSkgewotCi0JCQkvLyBzZXQgdGhlIG5ldyBjb250ZW50IGFuZCBmaXJlIGNvbnRlbnQgcmVsYXRlZCBldmVudHMKLQkJCWZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGlucHV0KTsKLQotCQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbnB1dCwgaW5mbyk7Ci0KLQkJCWluZm8uZkRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoaW5mbyk7Ci0JCQlpbmZvLmZEb2N1bWVudC5zZXRDb250ZW50KG5ld0NvbnRlbnQpOwotCQkJaW5mby5mQ2FuQmVTYXZlZD0gZmFsc2U7Ci0JCQlpbmZvLmZTdGF0dXM9IHN0YXR1czsKLQotCQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbnB1dCwgaW5mbyk7Ci0KLQkJCWZpcmVFbGVtZW50Q29udGVudFJlcGxhY2VkKGlucHV0KTsKLQotCQl9IGVsc2UgewotCQkJCi0JCQloYW5kbGVFeGlzdGluZ0RvY3VtZW50U2F2ZWQoaW5wdXQsIGluZm8sIHN0YXR1cyk7Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGlzdGluZ0RvY3VtZW50U2F2ZWQoSUVkaXRvcklucHV0IGlucHV0LCBFbGVtZW50SW5mbyBpbmZvLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGlucHV0LCBpbmZvKTsKLQotCQkvLyBmaXJlcyBvbmx5IHRoZSBkaXJ0eSBzdGF0ZSByZWxhdGVkIGV2ZW50Ci0JCWluZm8uZkNhbkJlU2F2ZWQ9IGZhbHNlOwotCQlpbmZvLmZTdGF0dXM9IHN0YXR1czsKLQotCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGlucHV0LCBpbmZvKTsKLQotCQlmaXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKGlucHV0LCBmYWxzZSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrRG9jdW1lbnRBc1NhdmVkKElGaWxlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJRWxlbWVudEluZm8gaW5mbyA9IGdldEVsZW1lbnRJbmZvKGlucHV0KTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaGFuZGxlRXhpc3RpbmdEb2N1bWVudFNhdmVkKGlucHV0LCBpbmZvLCBudWxsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9TeW5jaHJvbml6ZShPYmplY3QgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9ySW5wdXQpIHsKLQkJCWhhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZCgoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChPYmplY3QgZWxlbWVudCkgewotCQlFbGVtZW50SW5mbyBpbmZvID0gZ2V0RWxlbWVudEluZm8oZWxlbWVudCk7Ci0JCWlmKGluZm8uZkRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKChJRGlhZ3JhbURvY3VtZW50KWluZm8uZkRvY3VtZW50KS5nZXREaWFncmFtKCk7Ci0JCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCQkJLy8gYSBkaWFncmFtIHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlc291cmNlIGlzIGNvbnNpZGVyZWQgYXMgb3V0LW9mLXN5bmNoCi0JCQkJLy8gYmVjYXVzZSBpdHMgcmVzb3VyY2UgbXVzdCBoYXZlIGJlZW4gcmVsb2FkZWQuCi0JCQkJLy8KLQkJCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiBEaWFncmFtTWFuYWdlci5pc1N5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzU3luY2hyb25pemVkKGVsZW1lbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFbGVtZW50SW5mbyBjcmVhdGVOZXdFbGVtZW50SW5mbyhJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIodGhpcywgKERpYWdyYW1Eb2N1bWVudClkb2N1bWVudCk7Ci0JCURpYWdyYW1TdG9yYWdlSW5mbyBpbmZvID0gbmV3IERpYWdyYW1TdG9yYWdlSW5mbyhkb2N1bWVudCwgbGlzdGVuZXIpOwotCQlsaXN0ZW5lci5zdGFydExpc3RlbmluZygpOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyI2dldE9wZXJhdGlvblJ1bm5lcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBnZXRPcGVyYXRpb25SdW5uZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBmaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuZ2V0T3BlcmF0aW9uUnVubmVyKG1vbml0b3IpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdG9yLkFic3RyYWN0RG9jdW1lbnRQcm92aWRlciNnZXRTYXZlUnVsZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2F2ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlci5nZXRTYXZlUnVsZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd3MgZWRpdGluZyBldmVuIHRoZSBkb2N1bWVudCBpcyBvdXQgb2Ygc3luY2guCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgYWxsb3dFZGl0aW5nKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlFbGVtZW50SW5mbyBpbmZvID0gZ2V0RWxlbWVudEluZm8oaW5wdXQpOwotCQlpZihpbmZvLmZEb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9ICgoSURpYWdyYW1Eb2N1bWVudClpbmZvLmZEb2N1bWVudCkuZ2V0RGlhZ3JhbSgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsICYmIGRpYWdyYW0uZVJlc291cmNlKCkgPT0gbnVsbCAKLQkJCQkJJiYgaW5wdXQgaW5zdGFuY2VvZiBJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gZ2V0QWN0aXZpdHkoaW5wdXQpOwotCQkJCWlmKGFjdCAhPSBudWxsKSB7Ci0JCQkJCWZEaWFncmFtTWdyLnJlcGxhY2VUZW1wb3JhcmlseShhY3QsIGRpYWdyYW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIChBY3Rpdml0eSkgKChJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KWlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJzZVRvU2F2ZWQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUVsZW1lbnRJbmZvIGluZm8gPSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmKGluZm8uZkRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKChJRGlhZ3JhbURvY3VtZW50KWluZm8uZkRvY3VtZW50KS5nZXREaWFncmFtKCk7Ci0JCQlpZihkaWFncmFtICE9IG51bGwgJiYgZGlhZ3JhbS5lUmVzb3VyY2UoKSAhPSBudWxsIAotCQkJCQkmJiBpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gZ2V0QWN0aXZpdHkoaW5wdXQpOwotCQkJCWlmKGFjdCAhPSBudWxsKSB7Ci0JCQkJCWZEaWFncmFtTWdyLnJldmVyc2VUb1NhdmVkKGFjdCwgZGlhZ3JhbSwgKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSlpbnB1dCkuZ2V0UHJlZmVyZW5jZUhpbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIGEgcGx1Z2luIGlzIGxvY2tlZCwgZGlhZ3JhbSBlZGl0b3IgYW5kIGRvY3VtZW50IHByb3ZpZGVyCi0JICogc2hvdWxkIGJlIGxvY2tlZCwgdGhpcyBpcyBkb25lIGFmdGVyIGxvYWRpbmcgdGhlIGRpYWdyYW0gZWRpdG9yCi0JICogdXNpbmcgdGhpcyBtZXRob2QuCi0JICogQHBhcmFtIGxvY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2NrKGJvb2xlYW4gbG9jayl7Ci0JCWxvY2tlZCA9bG9jazsgCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhY2hlKElTdG9yYWdlRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIudXBkYXRlQ2FjaGUoaW5wdXQpOwotCQlTdG9yYWdlSW5mbyBpbmZvPSAoU3RvcmFnZUluZm8pIGdldEVsZW1lbnRJbmZvKGlucHV0KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYobG9ja2VkICYmIGluZm8uZklzTW9kaWZpYWJsZSkKLQkJCQlpbmZvLmZJc01vZGlmaWFibGU9ICFsb2NrZWQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogcmV0dXJucyB0aGUgbG9ja2VkIHN0YXRlIG9mIHBsdWdpbi4gCi0JICogbG9ja2VkIHN0YXRlIGlzICBzZXQgdXNpbmcgbG9jayhib29sZWFuIGxvY2spIG1ldGhvZC4gCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldExvY2tlZFN0YXRlKCl7Ci0JCXJldHVybiBsb2NrZWQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZShPYmplY3QgZWxlbWVudCkgewotCQlpZighRGlhZ3JhbUVkaXRvclV0aWwuaXNNb2RpZmlhYmxlKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzTW9kaWZpYWJsZShlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Jlc291cmNlcy9JRGlhZ3JhbVN0b3JhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcmVzb3VyY2VzL0lEaWFncmFtU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTYwNWMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcmVzb3VyY2VzL0lEaWFncmFtU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbVN0b3JhZ2UgZXh0ZW5kcyBJU3RvcmFnZSB7Ci0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2I1MTZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLkRpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIERJQUdSQU1fVFlQRVMgPSB7IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNLAotCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNIH07Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVHlwZShEaWFncmFtIGRpYWdyYW0pewotCQlTdHJpbmcgdHlwZVN0ciA9IGRpYWdyYW0uZ2V0VHlwZSgpOwotCQlpZih0eXBlU3RyLmVxdWFscyhEaWFncmFtTWFuYWdlci5BRF9raW5kKSl7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU07Ci0JCX0KLQkJaWYodHlwZVN0ci5lcXVhbHMoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQpKXsKLQkJCXJldHVybiBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU07Ci0JCX0KLQkJaWYodHlwZVN0ci5lcXVhbHMoRGlhZ3JhbU1hbmFnZXIuV1BEX2tpbmQpKXsKLQkJCXJldHVybiBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBpdGVyLm5leHQoKTsJCQkKLQkJCWlmICh2aWV3IGluc3RhbmNlb2YgTm9kZSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGUgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJCQlFTW9kZWxFbGVtZW50IG1vZGVsRWxlbWVudCA9IChFTW9kZWxFbGVtZW50KSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG1vZGVsRWxlbWVudCk7Ci0JCQkJCWlmKGUgPT0gbnVsbCkgewotCQkJCQkJLy8gZGlhZ3JhbSBpcyBub3Qgb3BlbiB5ZXQsIHRyeSB0byByZXNvbHZlIHRoZSBlbGVtZW50IGZyb20gVVJJIHN0b3JlZCBpbiB0aGUgbm9kZSdzIGFubm90YXRpb24KLQkJCQkJCS8vCi0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24obW9kZWxFbGVtZW50LCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWUgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKG9iamVjdC5lcXVhbHMoZSkpIHsKLQkJCQkJcmV0dXJuIChOb2RlKSB2aWV3OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlSW5Nb2RlbERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IGUpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZih2aWV3IGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJT2JqZWN0IGV4ID0gbnVsbDsKLQkJCQlFT2JqZWN0IG1vZGVsID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKXsKLQkJCQkJZXggPSAoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpbW9kZWwpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJaWYoZXggIT0gbnVsbCAmJiBleCA9PSBlKXsKLQkJCQkJCXJldHVybiAoTm9kZSl2aWV3OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGVzIHRoZSBkaWFncmFtIGFuZCBzYXZlcyBpbW1lZGlhdGVseS4KLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpYWdyYW0oZmluYWwgRGlhZ3JhbSBkaWFncmFtLCBib29sZWFuIHNhdmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRpYWdyYW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlib29sZWFuIGZpbGVFeGlzdCA9IHRydWU7Ci0JCUZpbGUgZmlsZSA9IG51bGw7Ci0JCU9iamVjdCBsaW5rZWRPYmplY3QgPSBudWxsOwotCQlQcm9jZXNzIHByb2Nlc3MgPSBudWxsOwotCQlpZiAoZGlhZ3JhbS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJRGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtCi0JCQkJCS5nZXRFbGVtZW50KCkpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWxpbmtlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0V3JhcHBlcigpOwotCQkJCWlmIChsaW5rZWRPYmplY3QgPT0gbnVsbCkgewotCQkJCQlsaW5rZWRPYmplY3QgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW1Nb2RlbCA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBkaWFncmFtCi0JCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQlsaW5rZWRPYmplY3QgPSBkaWFncmFtTW9kZWwuZ2V0TGlua2VkRWxlbWVudCgpOwotCQl9Ci0KLQkJaWYgKGxpbmtlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGxpbmtlZE9iamVjdCk7Ci0JCQlTdHJpbmcgZmlsZVBhdGggPSBEaWFncmFtTWFuYWdlci5nZXREaWFncmFtRmlsZVBhdGgocHJvY2Vzcyk7Ci0JCQlmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCWZpbGVFeGlzdCA9IGZhbHNlOwotCQl9Ci0JCWZpbmFsIFJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlmaWxlID0gbmV3IEZpbGUoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlCi0JCQkJCS5nZXRVUkkoKSkpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCWZpbGVFeGlzdCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShkaWFncmFtKTsKLQkJCQkJVW1hVXRpbC5yZW1vdmVBbGxBZGFwdGVycyhkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCVVtYVV0aWwucmVtb3ZlQWxsQWRhcHRlcnMoZGlhZ3JhbSk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCQkKLQkJCWlmICghZmlsZUV4aXN0KQotCQkJCXJldHVybjsKLQotCQkJaWYgKHNhdmUpIHsKLS8vCQkJCWlmIChyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotLy8JCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLS8vCQkJCQkJaWYgKHByb2Nlc3MgIT0gbnVsbAotLy8JCQkJCQkJCSYmIERpYWdyYW1NYW5hZ2VyLmhhc0RpYWdyYW1NYW5hZ2VyKHByb2Nlc3MpKSB7Ci0vLwkJCQkJCQlPYmplY3QgY29uc3VtZXIgPSBuZXcgT2JqZWN0KCk7Ci0vLwkJCQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZSgKLS8vCQkJCQkJCQkJcHJvY2VzcywgY29uc3VtZXIpOwotLy8JCQkJCQkJbWdyLmRpc3Bvc2UoKTsKLS8vCQkJCQkJfQotLy8JCQkJCQlTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpCi0vLwkJCQkJCQkJLmRlbGV0ZShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIHsKLQkJCQkJRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzCi0JCQkJCQkJLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpCi0JCQkJCQkJLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLlBMVUdJTl9JRCwgMSwgZQotCQkJCQkJCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJCQkJfQotLy8JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGdldCBlZGl0aW5nIGRvbWFpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpewotCQlyZXR1cm4gKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIERpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKERpYWdyYW0gZGlhZ3JhbSl7Ci0JCWlmKGRpYWdyYW0gPT0gbnVsbCkgcmV0dXJuIGdldEVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSA9PSBudWxsKSByZXR1cm4gZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0RWRpdGluZ0RvbWFpbihyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhbGwgYXZhaWxhYmxlIGRpYWdyYW1zIG9mIHRoZSBzcGVjaWZpZWQgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RGlhZ3JhbT4gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0LCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJdHJ5IHsKLQkJCUFycmF5TGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IG5ldyBBcnJheUxpc3Q8RGlhZ3JhbT4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRElBR1JBTV9UWVBFUy5sZW5ndGg7IGkrKykgewotCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IG1nci5nZXREaWFncmFtcyhhY3QsIERJQUdSQU1fVFlQRVNbaV0pOwotCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJZGlhZ3JhbXMuYWRkQWxsKGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBkaWFncmFtczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaWFncmFtVHlwZVN0cmluZyhEaWFncmFtIGRpYWdyYW0pewotCQlTdHJpbmcgdHlwZVN0ciA9IGRpYWdyYW0uZ2V0VHlwZSgpOwotCQlpZih0eXBlU3RyLmVxdWFscyhEaWFncmFtTWFuYWdlci5BRF9raW5kKSl7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX2tpbmQ7Ci0JCX0KLQkJaWYodHlwZVN0ci5lcXVhbHMoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQpKXsKLQkJCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURldGFpbF9EaWFncmFtX2tpbmQ7Ci0JCX0KLQkJaWYodHlwZVN0ci5lcXVhbHMoRGlhZ3JhbU1hbmFnZXIuV1BEX2tpbmQpKXsKLQkJCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lfRGlhZ3JhbV9raW5kOwotCQl9Ci0JCXJldHVybiAiIjsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNvcHlEaWFncmFtKEVkaXRpbmdEb21haW4gZG9tYWluLCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlsaXN0LmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCWxpc3QuYWRkKGRpYWdyYW0pOwotCQlDb21tYW5kIGNtZCA9IENvcHlDb21tYW5kLmNyZWF0ZShkb21haW4sIGxpc3QpOwotCQljbWQuZXhlY3V0ZSgpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBjbWQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQlEaWFncmFtIGNvcHkgPSAoRGlhZ3JhbSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gY29weTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmVhc3NvY2lhdGVzIGFjdGl2aXR5IG5vZGVzIGluIHRoZSBiYXNlIGRpYWdyYW0gY29weSB3aXRoIGNvcnJlc3BvbmRpbmcKLQkgKiBsb2NhbGx5IGNvbnRyaWJ1dG9ycyBvciByZXBsYWNlcnMgaWYgdGhlcmUgaXMgYW55LgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBjb3B5T2ZCYXNlRGlhZ3JhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWFzc29jaWF0ZShBY3Rpdml0eSBhY3Rpdml0eSwgRGlhZ3JhbSBjb3B5T2ZCYXNlRGlhZ3JhbSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUVsZW1lbnQgPSAoKEFjdGl2aXR5KSBlbGVtZW50KQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlOb2RlIG5vZGUgPSBEaWFncmFtSGVscGVyLmZpbmROb2RlKGNvcHlPZkJhc2VEaWFncmFtLAotCQkJCQkJCWJhc2VFbGVtZW50KTsKLQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJRU9iamVjdCB1bWxPYmogPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCkgdW1sT2JqLAotCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMzQyNGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmV2ZW50cy5SZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLklGYWlsU2FmZVNhdmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudXRpbC5FeHRlbmRlZFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnV0aWwuRmlsZVN5bmNocm9uaXplci5GaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5TdHJpbmdTdGF0aWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5EaWFncmFtRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC51dGlsLkRpYWdyYW1JT1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuaW50ZXJuYWwudXRpbC5FTUZDb3JlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWFuYWdlciB7CQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9GSUxFTkFNRV9XSVRIT1VUX0VYVEVOU0lPTiA9ICJkaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX0ZJTEVOQU1FID0gRElBR1JBTV9GSUxFTkFNRV9XSVRIT1VUX0VYVEVOU0lPTiArIE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfRklMRV9FWFRFTlNJT047Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8UHJvY2VzcywgRGlhZ3JhbU1hbmFnZXI+IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwID0gbmV3IEhhc2hNYXA8UHJvY2VzcywgRGlhZ3JhbU1hbmFnZXI+KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVN5bmNocm9uaXplciBmaWxlU3luY2hyb25pemVyID0gbmV3IEZpbGVTeW5jaHJvbml6ZXIoKSB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJRmlsZT4gaGFuZGxlQ2hhbmdlZEZpbGVzKENvbGxlY3Rpb248SUZpbGU+IGNoYW5nZWRGaWxlcykgewotCQkJdHJ5IHsKLQkJCQlDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBtZ3JzID0gZ2V0RGlhZ3JhbU1hbmFnZXJzKCk7Ci0JCQkJaWYoIW1ncnMuaXNFbXB0eSgpKSB7Ci0JCQkJCUNvbGxlY3Rpb248SUZpbGU+IGhhbmRsZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCQkJCWZvciAoRGlhZ3JhbU1hbmFnZXIgbWdyIDogbWdycykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBtZ3IuZ2V0UmVzb3VyY2UoZmFsc2UpOwotCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG1nci5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCQlpZihjaGFuZ2VkRmlsZXMuY29udGFpbnMoZmlsZSkpIHsKLQkJCQkJCQkJdHJ5IHsJCQkJCQkJCQkKLQkJCQkJCQkJCW1nci5yZWxvYWQoKTsKLQkJCQkJCQkJCWhhbmRsZWRGaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQlpZihERUJVRykgewotCQkJCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGhhbmRsZWRGaWxlczsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQloYW5kbGVDb3JlRXhjZXB0aW9uKGUsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVNb3ZlZEZpbGVzKE1hcDxJRmlsZSwgSVBhdGg+IG1vdmVkRmlsZVRvTmV3UGF0aE1hcCkgewotCQkJZm9yIChNYXAuRW50cnk8SUZpbGUsIElQYXRoPiBlbnRyeSA6IG1vdmVkRmlsZVRvTmV3UGF0aE1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJSUZpbGUgaUZpbGUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlpZihESUFHUkFNX0ZJTEVOQU1FLmVxdWFscyhpRmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJCXN5bmNocm9uaXplZCAocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IGdldERpYWdyYW1NYW5hZ2VyKGlGaWxlKTsKLQkJCQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJCQkJbWdyLnVwZGF0ZVJlc291cmNlVVJJKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW92ZWRGaWxlVG9OZXdQYXRoTWFwLmtleVNldCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248SUZpbGU+IGhhbmRsZURlbGV0ZWRGaWxlcyhDb2xsZWN0aW9uPElGaWxlPiBkZWxldGVkRmlsZXMpIHsKLQkJCXJldHVybiBzdXBlci5oYW5kbGVEZWxldGVkRmlsZXMoZGVsZXRlZEZpbGVzKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfa2luZCA9ICJBREQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRF9raW5kID0gIkFEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BEX2tpbmQgPSAiV1BERCI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbU1hbmFnZXIgZ2V0RGlhZ3JhbU1hbmFnZXIoSUZpbGUgaUZpbGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCS5oYXNOZXh0KCk7KSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSAoRGlhZ3JhbU1hbmFnZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1nci5yZXNvdXJjZSAhPSBudWxsICYmIGlGaWxlLmVxdWFscyhXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShtZ3IucmVzb3VyY2UpKSkgewotCQkJCXJldHVybiBtZ3I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlRGlhZ3JhbU1hbmFnZXJzKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlzeW5jaHJvbml6ZWQocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPj4gaXRlcmF0b3IgPSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnk8UHJvY2VzcywgRGlhZ3JhbU1hbmFnZXI+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlbnRyeS5nZXRLZXkoKSkgPT0gbGlicmFyeSkgewotCQkJCQllbnRyeS5nZXRWYWx1ZSgpLmRvRGlzcG9zZSgpOwotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0dXBMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCQlpZihsaWJTdmNMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlsaWJTdmNMaXN0ZW5lciA9IG5ldyBMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWRpc3Bvc2VEaWFncmFtTWFuYWdlcnMobGlicmFyeSk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhsaWJyYXJ5KTsKLQkJCQl9Ci0JCQl9OwotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIGluc3RhbmNlIG9mIERpYWdyYW1NYW5hZ2VyIGZvciB0aGUgc3BlY2lmaWVkIHByb2Nlc3MuIENhbGxlciBtdXN0Ci0JICogcmVsZWFzZSB0aGUgcmV0dXJuZWQgRGlhZ3JhbU1hbmFnZXIgaW5zdGFuY2Ugd2hlbiBpdCdzIG5vIGxvbmdlciBuZWVkZWQKLQkgKiB1c2luZyB7QGxpbmsgI3JlbW92ZUNvbnN1bWVyKE9iamVjdCl9LgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlhZ3JhbU1hbmFnZXIgZ2V0SW5zdGFuY2UoUHJvY2VzcyBwcm9jZXNzLCBPYmplY3QgY29uc3VtZXIpIHsKLQkJaWYoREVCVUcpIHsKLQkJCWlmKHByb2Nlc3MuZUlzUHJveHkoKSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUHJvY2VzcyBpcyBhIHByb3h5OiAiICsgcHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlhc3NlcnQgcHJvY2VzcyAhPSBudWxsICYmIGNvbnN1bWVyICE9IG51bGwgJiYgIXByb2Nlc3MuZUlzUHJveHkoKTsKLQkJc2V0dXBMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCk7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IChEaWFncmFtTWFuYWdlcikgcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuZ2V0KHByb2Nlc3MpOwotCQlpZihtZ3IgIT0gbnVsbCAmJiBtZ3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQlwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5yZW1vdmUocHJvY2Vzcyk7Ci0JCQltZ3IgPSBudWxsOwotCQl9Ci0JCWlmKG1nciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCQltZ3IgPSAoRGlhZ3JhbU1hbmFnZXIpIHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmdldChwcm9jZXNzKTsKLQkJCQlpZihtZ3IgPT0gbnVsbCkgewotCQkJCQltZ3IgPSBuZXcgRGlhZ3JhbU1hbmFnZXIocHJvY2Vzcyk7Ci0JCQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnB1dChwcm9jZXNzLCBtZ3IpOwotCQkJCQlpZighZmlsZVN5bmNocm9uaXplci5pc0luc3RhbGxlZCgpKSB7Ci0JCQkJCQlmaWxlU3luY2hyb25pemVyLmluc3RhbGwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQltZ3IuYWRkQ29uc3VtZXIoY29uc3VtZXIpOwotCQlyZXR1cm4gbWdyOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgYW4gZGlhZ3JhbSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gcHJvY2VzcyBhbHJlYWR5IGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzRGlhZ3JhbU1hbmFnZXIoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXJldHVybiBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5jb250YWluc0tleShwcm9jZXNzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc3Bvc2VEaWFncmFtTWFuYWdlcihQcm9jZXNzIHByb2Nlc3MpIHsKLQkJc3luY2hyb25pemVkIChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuZ2V0KHByb2Nlc3MpOwotCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQltZ3IuZG9EaXNwb3NlKCk7Ci0JCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxEaWFncmFtTWFuYWdlcj4gZ2V0RGlhZ3JhbU1hbmFnZXJzKCkgewotCQlBcnJheUxpc3Q8RGlhZ3JhbU1hbmFnZXI+IG1ncnM7Ci0JCXN5bmNocm9uaXplZChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJbWdycyA9IG5ldyBBcnJheUxpc3Q8RGlhZ3JhbU1hbmFnZXI+KHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnZhbHVlcygpKTsKLQkJfQotCQlyZXR1cm4gbWdycy5pc0VtcHR5KCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogbWdyczsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBHTUZSZXNvdXJjZUV4IGV4dGVuZHMgR01GUmVzb3VyY2UgaW1wbGVtZW50cyBJRmFpbFNhZmVTYXZhYmxlIHsKLQotCQlwcml2YXRlIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgZmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcjsKLQotCQlwdWJsaWMgR01GUmVzb3VyY2VFeChVUkkgdXJpKSB7Ci0JCQlzdXBlcih1cmkpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7CQkJCQkKLQkJCXJldHVybiBuZXcgR01GSGVscGVyKHRoaXMpIHsKLQkJCQkKLQkJCQlwcm90ZWN0ZWQgVVJJIGdldEhSRUYoUmVzb3VyY2Ugb3RoZXJSZXNvdXJjZSwgRU9iamVjdCBvYmopIHsKLQkJCQkJaWYob3RoZXJSZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2Upb3RoZXJSZXNvdXJjZSkuZ2V0UHJveHlVUkkob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0SFJFRihvdGhlclJlc291cmNlLCBvYmopOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUluZm8oKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUodGhpcyk7Ci0JCQlpZihEaWFncmFtTWFuYWdlci50aGlzLnJlc291cmNlSXNOZXcpIHsKLQkJCQlEaWFncmFtTWFuYWdlci50aGlzLnJlc291cmNlSXNOZXcgPSBmYWxzZTsKLQkJCQlmaWxlU3luY2hyb25pemVyLm1vbml0b3IoZmlsZSk7Ci0JCQl9Ci0JCQlmaWxlU3luY2hyb25pemVyLnVwZGF0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0JCQlpZighaGFzVGVtcFVSSSgpKSB7Ci0JCQkJdXBkYXRlSW5mbygpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIEFkYXB0ZXIgc3VwZXJDcmVhdGVNb2RpZmljYXRpb25BZGFwdGVyKCkgewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZU1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcigpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKCkgewotCQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCQlwcml2YXRlIEFkYXB0ZXIgZGVsZWdhdGUgPSBzdXBlckNyZWF0ZU1vZGlmaWNhdGlvbkFkYXB0ZXIoKTsKLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQkJZGVsZWdhdGUubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJCQlub3RpZnlEaWFncmFtQ2hhbmdlTGlzdGVuZXJzKG1zZyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIERvbid0IG5vdGlmeSBEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgYWJvdXQgcmVzb3VyY2UgbW9kaWZpY2F0aW9uIGV2ZW50IGJ1dCByYXRoZXIKLQkJICogbGV0IHtAbGluayAjbm90aWZ5RGlhZ3JhbUNoYW5nZUxpc3RlbmVycyhOb3RpZmljYXRpb24pIGhhbmRsZSBpdC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmKGlzTG9hZGVkKCkgJiYgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSAKLQkJCQkJJiYgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVECi0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJaWYgKGVBZGFwdGVycyAhPSBudWxsICYmIGVEZWxpdmVyKCkpCi0JCQkJewotCQkJCQlpbnQgc2l6ZSA9IGVBZGFwdGVycy5zaXplKCk7Ci0JCQkJCWlmIChzaXplID4gMCkKLQkJCQkJewotCQkJCQkJQWRhcHRlciBbXSBhZGFwdGVycyA9IChBZGFwdGVyIFtdKWVBZGFwdGVycy5kYXRhKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKLQkJCQkJCXsKLQkJCQkJCQlBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVyc1tpXTsKLQkJCQkJCQlpZighKGFkYXB0ZXIgaW5zdGFuY2VvZiBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyKSkgewotCQkJCQkJCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdXBlci5lTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlEaWFncmFtQ2hhbmdlTGlzdGVuZXJzKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCUJhc2ljRUxpc3Q8QWRhcHRlcj4gZUFkYXB0ZXJzID0gZUJhc2ljQWRhcHRlcnMoKTsKLQkJCWlmIChlQWRhcHRlcnMgIT0gbnVsbCAmJiBlRGVsaXZlcigpKQotCQkJewotCQkJCWludCBzaXplID0gZUFkYXB0ZXJzLnNpemUoKTsKLQkJCQlpZiAoc2l6ZSA+IDApCi0JCQkJewotCQkJCQlBZGFwdGVyIFtdIGFkYXB0ZXJzID0gKEFkYXB0ZXIgW10pZUFkYXB0ZXJzLmRhdGEoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0JCQkJCXsKLQkJCQkJCUFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJzW2ldOwotCQkJCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEFjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyIGdldEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoKSB7Ci0JCQlpZihmYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyID09IG51bGwpIHsKLQkJCQkvLyBpZCBmb3JtYXQ6IDxwcm9jZXNzX2d1aWQ+ZGlhZ3JhbQotCQkJCVN0cmluZyBpZCA9IERpYWdyYW1NYW5hZ2VyLnRoaXMucHJvY2Vzcy5nZXRHdWlkKCkgKyBESUFHUkFNX0ZJTEVOQU1FX1dJVEhPVVRfRVhURU5TSU9OOwotCQkJCWZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgPSBuZXcgRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcih0aGlzLCBpZCk7Ci0JCQkJZmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlci5zZXRDb21taXRFbXB0eVJlc291cmNlKHRydWUpOwotCQkJfQotCQkJcmV0dXJuIGZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCQlnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkuY29tbWl0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZWxldGVCYWNrdXAoKSB7Ci0JCQlnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkuZGVsZXRlQmFja3VwKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQkJcmV0dXJuIGdldEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoKS5oYXNUZW1wVVJJKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQkJcmV0dXJuIGdldEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoKS5yZXN0b3JlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUeElEKFN0cmluZyB0eElEKSB7Ci0JCQlnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkuc2V0VGVtcFVSSSh0eElEKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHR4RmluaXNoZWQoYm9vbGVhbiBzdWNjZXNzZnVsKSB7Ci0JCQlnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkudHhGaW5pc2hlZChzdWNjZXNzZnVsKTsKLQkJCWlmKHN1Y2Nlc3NmdWwpIHsKLQkJCQl1cGRhdGVJbmZvKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHsKLQkJCXN1cGVyLmRvVW5sb2FkKCk7Ci0JCQkKLQkJICAgIEl0ZXJhdG9yPEVPYmplY3Q+IGFsbENvbnRlbnRzID0gZ2V0QWxsUHJvcGVyQ29udGVudHModW5sb2FkaW5nQ29udGVudHMpOwotCQkgICAgTGlzdDxFT2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOwotCQkJd2hpbGUgKGFsbENvbnRlbnRzLmhhc05leHQoKSkgewotCQkJCWxpc3QuYWRkKGFsbENvbnRlbnRzLm5leHQoKSk7Ci0JCQl9Ci0JCQlmb3IgKEVPYmplY3Qgb2JqZWN0IDogbGlzdCkgewotCQkJCUVjb3JlVXRpbC5yZW1vdmUob2JqZWN0KTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBHTUZFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgRXh0ZW5kZWRSZXNvdXJjZVNldCB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQkJaWYoTXVsdGlGaWxlVVJJQ29udmVydGVyLlNDSEVNRS5lcXVhbHModXJpLnNjaGVtZSgpKSkgewotCQkJCXJldHVybiBVUklfVFlQRV9FWFRFUk5BTDsKLQkJCX0KLQkJCWlmKERJQUdSQU1fRklMRU5BTUUuZXF1YWxzKHVyaS5sYXN0U2VnbWVudCgpKSkgewotCQkJCXJldHVybiBVUklfVFlQRV9MT0NBTDsKLQkJCX0KLQkJCXJldHVybiBVUklfVFlQRV9FWFRFUk5BTDsKLSAJCX0KLQkJCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJCVhNSVJlc291cmNlIHJlc291cmNlID0gbmV3IEdNRlJlc291cmNlRXgodXJpKTsKLQotCQkJcmVzb3VyY2UuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0QWxsKEdNRlJlc291cmNlRmFjdG9yeS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQlyZXNvdXJjZS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXRBbGwoR01GUmVzb3VyY2VGYWN0b3J5LmdldERlZmF1bHRTYXZlT3B0aW9ucygpKTsKLQotCQkJaWYgKCFyZXNvdXJjZS5nZXRFbmNvZGluZygpLmVxdWFscyhFTUZDb3JlQ29uc3RhbnRzLlhNSV9FTkNPRElORykpCi0JCQkJcmVzb3VyY2Uuc2V0RW5jb2RpbmcoRU1GQ29yZUNvbnN0YW50cy5YTUlfRU5DT0RJTkcpOwotCi0JCQlnZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCQkJCi0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogUmVmZXJlbmNlIGNvdW50IHRvIHRoaXMgZGlhZ3JhbSBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQkKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlc291cmNlSXNOZXc7Ci0JCi0JcHJpdmF0ZSBMaXN0PElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyPiByZXNvdXJjZUNoYW5nZUxpc3RlbmVycyA9IG5ldyBVbmlxdWVFTGlzdDxJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcj4oKTsKLQotCXByaXZhdGUgRXh0ZW5kZWRSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgSGFzaE1hcDxBY3Rpdml0eSwgTWFwPFN0cmluZywgRGlhZ3JhbT4+IGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXA7IAotCQotCXByb3RlY3RlZCBVbmlxdWVFTGlzdDxPYmplY3Q+IGNvbnN1bWVycyA9IG5ldyBVbmlxdWVFTGlzdDxPYmplY3Q+KCk7Ci0JCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlcihQcm9jZXNzIHByb2Nlc3MpIHsKLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYoIXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJcmV0dXJuIGNvbnN1bWVycy5hZGQoY29uc3VtZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb25zdW1lciBmcm9tIHRoZSBjb25zdW1lciBsaXN0IG9mIHRoaXMgZGlhZ3JhbSBtYW5hZ2VyLiBVbmxvYWQKLQkgKiB0aGlzIGRpYWdyYW0gbWFuYWdlciBpZiBpdCBkb2VzIG5vdCBoYXZlIGFueSBtb3JlIGNvbnN1bWVyIGFmdGVyIHRoaXMgY2FsbC4gCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZUNvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQlib29sZWFuIHJldCA9IGNvbnN1bWVycy5yZW1vdmUoY29uc3VtZXIpOwotCQlpZihyZXQgJiYgY29uc3VtZXJzLmlzRW1wdHkoKSkgewotCQkJc3luY2hyb25pemVkKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQkJCWlmKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmlzRW1wdHkoKSkgewotCQkJCQlmaWxlU3luY2hyb25pemVyLnVuaW5zdGFsbCgpOwotCQkJCX0KLQkJCX0KLQkJCWRvRGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTmV3UmVzb3VyY2UoKSB7Ci0JCXJldHVybiByZXNvdXJjZUlzTmV3OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUlzTmV3KGJvb2xlYW4gcmVzb3VyY2VJc05ldykgewotCQl0aGlzLnJlc291cmNlSXNOZXcgPSByZXNvdXJjZUlzTmV3OwotCX0KLQkKLQlwdWJsaWMgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsICYmICFpc0Rpc3Bvc2VkKCkpIHsKLQkJCWVkaXRpbmdEb21haW4gPSBjcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCQlyZXNvdXJjZVNldCA9IChFeHRlbmRlZFJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCQotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlHTUZFeHRlbmRlZFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IEdNRkV4dGVuZGVkUmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuYWRkKHByb2Nlc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCXJldHVybiAoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbihyZXNvdXJjZVNldCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb0Rpc3Bvc2UoKSB7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCQlmaWxlU3luY2hyb25pemVyLnVubW9uaXRvcihmaWxlKTsJCQkJCi0JCQl9Ci0JCQlyZXNvdXJjZSA9IG51bGw7Ci0JCX0KLQotCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5jbGVhcigpOwotCQkKLQkJaWYoZWRpdGluZ0RvbWFpbiAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZVNldC5kaXNwb3NlKCk7Ci0JCQlyZXNvdXJjZVNldCA9IG51bGw7Ci0KLQkJCWVkaXRpbmdEb21haW4uZGlzcG9zZSgpOwotCQkJZWRpdGluZ0RvbWFpbiA9IG51bGw7CQkJCi0JCX0JCi0JCQotCQljb25zdW1lcnMuY2xlYXIoKTsKLQkJCi0JCWlmKGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAgIT0gbnVsbCkgewotCQkJYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQlwcm9jZXNzID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3luY2hyb25pemVkIChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQl9Ci0JCWRvRGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gcHJvY2VzcyA9PSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGRpYWdyYW1zIG9mIHRoZSBnaXZlbiB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGFjdGl2aXR5Ci0JICogPGNvZGU+YWN0PC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Ci0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI0FDVElWSVRZX0RJQUdSQU19LAotCSAqICAgICAgICAgICAge0BsaW5rIElEaWFncmFtTWFuYWdlciNBQ1RJVklUWV9ERVRBSUxfRElBR1JBTX0sCi0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU19Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaXN0PERpYWdyYW0+IGdldERpYWdyYW1zKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2hlY2tBY3Rpdml0eShhY3QpOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGZhbHNlKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJQXJyYXlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gbmV3IEFycmF5TGlzdDxEaWFncmFtPigpOwotCQkJZm9yIChFT2JqZWN0IG8gOiByZXNvdXJjZS5nZXRDb250ZW50cygpKSB7Ci0JCQkJaWYobyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIG87Ci0JCQkJCVN0cmluZyB0eXBlU3RyID0gZ2V0RGlhZ3JhbVR5cGVTdHJpbmcodHlwZSk7Ci0JCQkJCWlmKHR5cGVTdHIuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSAmJiBpc0RpYWdyYW1PZihkaWFncmFtLCBhY3QpKSB7Ci0JCQkJCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlpZihtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW1JbXBsKSB7Ci0JCQkJCQkJLy8gZGlzYWJsZSBjcmVhdGlvbiBvZiBVTUEgZ3JhcGhpY2FsIGRhdGEKLQkJCQkJCQkvLwotCQkJCQkJCSgoRGlhZ3JhbUltcGwpbW9kZWwpLnNldEdyYXBoaWNhbERhdGFSZXF1aXJlZChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQlkaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZighZGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIGRpYWdyYW1zOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJrSW5oZXJpdGVkKERpYWdyYW0gZGlhZ3JhbSkgewotCQlMaXN0PD8+IGNoaWxkcmVuID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGNoaWxkcmVuLmdldChpKTsKLQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKHZpZXcpOwotCQl9Ci0JCWZvciAoT2JqZWN0IGVkZ2UgOiBkaWFncmFtLmdldEVkZ2VzKCkpIHsKLQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKChWaWV3KSBlZGdlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBBRERfa2luZDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBBRF9raW5kOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFdQRF9raW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVHlwZShTdHJpbmcgdHlwZVN0cikgewotCQlpZihBRF9raW5kLmVxdWFscyh0eXBlU3RyKSkgewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOwkJCQotCQl9Ci0JCWVsc2UgaWYoQUREX2tpbmQuZXF1YWxzKHR5cGVTdHIpKSB7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwkJCQotCQl9Ci0JCWVsc2UgaWYoV1BEX2tpbmQuZXF1YWxzKHR5cGVTdHIpKSB7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU07Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkvKioKLQkgKiBBc3NvY2lhdGVzIGEgbmV3IGRpYWdyYW0gd2l0aCB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyB2b2lkIGFzc29jaWF0ZShEaWFncmFtIG5ld0RpYWdyYW0sIGludCB0eXBlLCBBY3Rpdml0eSBhY3Rpdml0eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzd2l0Y2godHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJYXNzb2NpYXRlQUQobmV3RGlhZ3JhbSwgYWN0aXZpdHkpOwotCQkJcmV0dXJuOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCWFzc29jaWF0ZUFERChuZXdEaWFncmFtLCBhY3Rpdml0eSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlhc3NvY2lhdGVXUEQobmV3RGlhZ3JhbSwgYWN0aXZpdHkpOwkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzb2NpYXRlV1BEKERpYWdyYW0gY29weSwgQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyAtIGNvbnNvbGlkYXRlIG9uZSBtZXRob2Qgd2l0aCBBREQuCi0JCWlmKGNvcHkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJKChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKWNvcHkuZ2V0RWxlbWVudCgpKS5zZXRMaW5rZWRFbGVtZW50KGFjdGl2aXR5KTsKLQkJCSgoRGlhZ3JhbUltcGwpY29weS5nZXRFbGVtZW50KCkpLnNldEdyYXBoaWNhbERhdGFSZXF1aXJlZChmYWxzZSk7Ci0JCX0KLQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChjb3B5LmdldEVsZW1lbnQoKSk7Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weSk7CQotCX0KLQotCXByaXZhdGUgdm9pZCBhc3NvY2lhdGVBRChEaWFncmFtIGNvcHksIEFjdGl2aXR5IGFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihjb3B5LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoKEVNb2RlbEVsZW1lbnQpIGNvcHkuZ2V0RWxlbWVudCgpLCBhY3QpOwotCQl9Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weS5nZXRFbGVtZW50KCkpOwotCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGNvcHkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzb2NpYXRlQUREKERpYWdyYW0gY29weSwgQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoY29weS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWNvcHkuZ2V0RWxlbWVudCgpKS5zZXRMaW5rZWRFbGVtZW50KGFjdGl2aXR5KTsKLQkJCSgoRGlhZ3JhbUltcGwpY29weS5nZXRFbGVtZW50KCkpLnNldEdyYXBoaWNhbERhdGFSZXF1aXJlZChmYWxzZSk7Ci0JCX0KLQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChjb3B5LmdldEVsZW1lbnQoKSk7Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weSk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGNvcHlEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgdGFyZ2V0QWN0aXZpdHkpIHsKLQkJRGlhZ3JhbSBjb3B5ID0gRGlhZ3JhbUhlbHBlci5jb3B5RGlhZ3JhbShnZXRFZGl0aW5nRG9tYWluKCksIGRpYWdyYW0pOwotCQlEaWFncmFtSGVscGVyLnJlYXNzb2NpYXRlKHRhcmdldEFjdGl2aXR5LCBjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHVibGljIERpYWdyYW0gY3JlYXRlRGlhZ3JhbShmaW5hbCBBY3Rpdml0eSBhY3QsIGZpbmFsIGludCB0eXBlLCBmaW5hbCBQcmVmZXJlbmNlc0hpbnQgaGludCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljaGVja0FjdGl2aXR5KGFjdCk7Ci0JCS8vIGNoZWNrIGlmIHRoaXMgYWN0aXZpdHkgY29udHJpYnV0ZXMvZXh0ZW5kcyBvdGhlciBhY3Rpdml0eSBhbmQgdHJ5Ci0JCS8vIGNvcHkKLQkJLy8gdGhlIGV4aXN0aW5nIGRpYWdyYW0gZnJvbSB0aGUgYmFzZQotCQkvLwotCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJQWN0aXZpdHkgYmFzZUFjdCA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlQWN0KSwgdGhpcyk7Ci0JCQl0cnkgewotCQkJCUxpc3QgYmFzZURpYWdyYW1zID0gbWdyLmdldERpYWdyYW1zKGJhc2VBY3QsIHR5cGUpOwotCQkJCWlmKCFiYXNlRGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSAoRGlhZ3JhbSkgYmFzZURpYWdyYW1zLmdldCgwKTsKLQkJCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCWZpbmFsIERpYWdyYW0gY29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtLCBhY3QpOwotCQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCW1hcmtJbmhlcml0ZWQoY29weSk7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlhc3NvY2lhdGUoY29weSwgdHlwZSwgYWN0KTsKLQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIGNvcHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBpbiByZXRyaWV2aW5nIGJhc2UgZGlhZ3JhbTogIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJCi0JCWZpbmFsIERpYWdyYW1bXSByZXN1bHRIb2xkZXIgPSBuZXcgRGlhZ3JhbVsxXTsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9DcmVhdGVEaWFncmFtKGFjdCwgdHlwZSwgaGludCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWlmKERFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0SG9sZGVyWzBdOwotCX0KLQkKLQlwcml2YXRlIERpYWdyYW0gZG9DcmVhdGVEaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUsIFByZWZlcmVuY2VzSGludCBoaW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gY3JlYXRlQUQoYWN0LCBoaW50KTsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gY3JlYXRlQUREKGFjdCwgaGludCk7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gY3JlYXRlV1BERChhY3QsIGhpbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRGlhZ3JhbSBjcmVhdGVXUEREKEFjdGl2aXR5IGFjdCwgUHJlZmVyZW5jZXNIaW50IGhpbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFByb2Nlc3NQYWNrYWdlIG1vZGVsID0gKFByb2Nlc3NQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpOwotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIG1vZGVsID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW1JbXBsKSB7Ci0JCQkvLyBkaXNhYmxlIGNyZWF0aW9uIG9mIFVNQSBncmFwaGljYWwgZGF0YQotCQkJLy8KLQkJCSgoRGlhZ3JhbUltcGwpIG1vZGVsKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JCW1vZGVsLnNldE5ldyh0cnVlKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UKLQkJCQkuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCW1vZGVsLAotCQkJCQkJZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pLAotCQkJCQkJaGludCk7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCW1vZGVsLnNldExpbmtlZEVsZW1lbnQoYWN0KTsKLQkJCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQotCQkJLy8gYWRkIFJlc291cmNlRG9tYWluTGluayB0byB0aGUgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2Ugc2V0Ci0JCQkvLwotCQkJLy8gRWNvcmVVdGlsLmdldEFkYXB0ZXIoZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLAotCQkJLy8gUmVzb3VyY2VEbykKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW0gY3JlYXRlQUREKEFjdGl2aXR5IGFjdCwgUHJlZmVyZW5jZXNIaW50IGhpbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBtb2RlbCA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW1JbXBsKSB7Ci0JCQkvLyBkaXNhYmxlIGNyZWF0aW9uIG9mIFVNQSBncmFwaGljYWwgZGF0YQotCQkJLy8KLQkJCSgoRGlhZ3JhbUltcGwpIG1vZGVsKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JCW1vZGVsLnNldE5ldyh0cnVlKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwKLQkJCQlnZXREaWFncmFtVHlwZVN0cmluZyhJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pLAotCQkJCWhpbnQpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQltb2RlbC5zZXRMaW5rZWRFbGVtZW50KGFjdCk7Ci0JCQlkaWFncmFtLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQkJCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHJpdmF0ZSBEaWFncmFtIGNyZWF0ZUFEKEFjdGl2aXR5IGFjdCwgUHJlZmVyZW5jZXNIaW50IGhpbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgbW9kZWwgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eSgpOwotCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG1vZGVsLAotCQkJCWdldERpYWdyYW1UeXBlU3RyaW5nKElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSwgaGludCk7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUobW9kZWwsIGFjdCk7Ci0JCQlkaWFncmFtLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQltb2RlbC5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7Ci0JCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yKCkgewotCQlpZihtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaWFncmFtRmlsZVBhdGgoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRyeSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIHByb2Nlc3MuZUNvbnRhaW5lcigpOwotCQkJaWYocHJvY0NvbXAgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShwcm9jQ29tcCkpIHsKLQkJCQkvLyBleGlzdGluZyBwcm9jZXNzCi0JCQkJLy8KLQkJCQlyZXR1cm4gbmV3IEZpbGUobmV3IEZpbGUoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHByb2Nlc3MuZVJlc291cmNlKCkuZ2V0VVJJKCkpKS5nZXRQYXJlbnRGaWxlKCksIERJQUdSQU1fRklMRU5BTUUpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5ldyBwcm9jZXNzIHRoYXQgaGFzIG5vdCBiZWVuIHNhdmVkIHlldAotCQkJCS8vCi0JCQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZVVSSShwcm9jQ29tcCwgcHJvY0NvbXAuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpLAotCQkJCQkJCQlESUFHUkFNX0ZJTEVOQU1FKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlmaWxlU3luY2hyb25pemVyLnVwZGF0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQlub3RpZnlSZWxvYWRlZCgpOwotCX0KLQkKLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2UodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVVJJIGNyZWF0ZURpYWdyYW1SZXNvdXJjZVVSSShTdHJpbmcgcGF0aCkgewotCQlJRmlsZSBkaWFncmFtRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHBhdGgpKTsKLQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlCi0JCQkJLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlIGxvYWREaWFncmFtUmVzb3VyY2UoSUZpbGUgZkZpbGUsCi0JCQlFZGl0aW5nRG9tYWluIGRvbWFpbiwgTWFwIGxvYWRPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmRmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG1vbml0b3IpOwotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZkZpbGUuZ2V0RnVsbFBhdGgoKQotICAgICAgICAgICAgLnRvU3RyaW5nKCksIHRydWUpOwotCQkKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQkJCi0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCX0KLQkJCi0JCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJTWFwIGxvYWRpbmdPcHRpb25zID0gbmV3IEhhc2hNYXAoR01GUmVzb3VyY2VGYWN0b3J5LmdldERlZmF1bHRMb2FkT3B0aW9ucygpKTsKLQkJCQotICAgICAgICAgICAgLy8gcHJvcG9nYXRlIHBhc3NlZCBpbiBvcHRpb25zIHRvIHRoZSBkZWZhdWx0cwotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGxvYWRPcHRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbG9hZGluZ09wdGlvbnMucHV0KGtleSwgbG9hZE9wdGlvbnMuZ2V0KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgCXJlc291cmNlLmxvYWQobG9hZGluZ09wdGlvbnMpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCXJlc291cmNlLnVubG9hZCgpOwotICAgICAgICAgICAgCXRocm93IGU7Ci0gICAgICAgICAgICB9Ci0JCX0KLQkJCQkJCi0JCXJldHVybiByZXNvdXJjZTsKLQotCX0KLQkKLQlwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlKGJvb2xlYW4gY3JlYXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKHJlc291cmNlID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0RGlhZ3JhbUZpbGVQYXRoKHByb2Nlc3MpOwkKLQkJCWlmKHBhdGggIT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJaWYod3NSZXMgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSB3c1JlczsKLQkJCQkJdHJ5IHsJCQkJCQkKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IERpYWdyYW1JT1V0aWwubG9hZChnZXRFZGl0aW5nRG9tYWluKCksIGZpbGUsIHRydWUsIGdldE1vbml0b3IoKSk7CQkJCQkKLQkJCQkJCXJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGhhbmRsZWQgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIHJlc291cmNlIGRvZXMgbm90IGhhdmUgYW55IGRpYWdyYW0KLQkJCQkJCS8vCi0JCQkJCQlpZihvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5EaWFncmFtX05PX0RJQUdSQU1fSU5fUkVTT1VSQ0UKLQkJCQkJCQkJLmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZXNvdXJjZSA9IGxvYWREaWFncmFtUmVzb3VyY2UoZmlsZSwgZ2V0RWRpdGluZ0RvbWFpbigpLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIGdldE1vbml0b3IoKSk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpYWdyYW1Db3JlUGx1Z2luLlBMVUdJTl9JRCwgZTEuZ2V0TWVzc2FnZSgpLCBlMSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmlsZVN5bmNocm9uaXplci5tb25pdG9yKGZpbGUpOwotCQkJCX0KLQkJCQllbHNlIGlmKGNyZWF0ZSkgewotCQkJCQlyZXNvdXJjZSA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKAotCQkJCQkJCWNyZWF0ZURpYWdyYW1SZXNvdXJjZVVSSShwYXRoKSk7Ci0JCQkJCXJlc291cmNlSXNOZXcgPSB0cnVlOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZighcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkJbm90aWZ5UmVsb2FkZWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCWlmKERFQlVHKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5UmVsb2FkZWQoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlsaXN0ZW5lci5yZXNvdXJjZUNoYW5nZWQobmV3IFJlc291cmNlQ2hhbmdlRXZlbnQodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UsIDAsIG51bGwpKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlpZihERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0FjdGl2aXR5KEFjdGl2aXR5IGFjdCkgewkJCi0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQlpZihwcm9jICE9IHByb2Nlc3MpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzcGVjaWZpZWQgYWN0aXZpdHkgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBwcm9jZXNzIG9mIHRoaXMgZGlhZ3JhbSBtYW5hZ2VyLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9CQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWFncmFtT2YoRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3QpIHsKLQkJaWYoQURfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpKSB7Ci0JCQlyZXR1cm4gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCkgZGlhZ3JhbS5nZXRFbGVtZW50KCksIGFjdC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKSA9PSBhY3Q7Ci0JCX0KLQkJZWxzZSBpZihBRERfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpKSB7Ci0JCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0gJiYgKChBY3Rpdml0eURldGFpbERpYWdyYW0pbW9kZWwpLmdldExpbmtlZEVsZW1lbnQoKSA9PSBhY3Q7Ci0JCX0KLQkJZWxzZSBpZihXUERfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpKSB7Ci0JCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtICYmICgoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSltb2RlbCkuZ2V0TGlua2VkRWxlbWVudCgpID09IGFjdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZQotCSAqIGxvY2FsIGZpbGUgc3lzdGVtIGJ5IGNvbXBhcmluZyB0aGUgYWN0dWFsIHRpbWUgc3RhbXAgd2l0aCB0aGUKLQkgKiBjYWNoZWQgb25lLiBJZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCwgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPgotCSAqIGlzIHRocm93bi4KLQkgKgotCSAqIEBwYXJhbSBjYWNoZWRNb2RpZmljYXRpb25TdGFtcCB0aGUgY2FjaGVkIG1vZGlmaWNhdGlvbiBzdGFtcAotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gY2hlY2sKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIGlmIHJlc291cmNlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrU3luY2hyb25pemF0aW9uU3RhdGUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoIWlzU3luY2hyb25pemVkKHJlc291cmNlKSkgewotCQkJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwgSVJlc291cmNlU3RhdHVzLk9VVF9PRl9TWU5DX0xPQ0FMLCBFZGl0b3JNZXNzYWdlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9lcnJvcl9vdXRfb2Zfc3luYywgbnVsbCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCS8vIGRvbid0IHJlZnJlc2ggdG8gcHJldmVudCByZXNvdXJjZSBmcm9tIGF1dG9tYXRpY2FsbHkgcmVsb2FkZWQKLQkJCS8vCi0vLwkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBtb25pdG9yKTsKLQkJCUZpbGVJbmZvIGluZm8gPSBmaWxlU3luY2hyb25pemVyLmdldEZpbGVJbmZvKGZpbGUpOwotCQkJaWYoaW5mbyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGluZm8uZk1vZGlmaWNhdGlvblN0YW1wID09IEZpbGVTeW5jaHJvbml6ZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIE1hcDxBY3Rpdml0eSwgTWFwPFN0cmluZywgRGlhZ3JhbT4+IGdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkgewotCQlpZihhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwID09IG51bGwpIHsKLQkJCWFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAgPSBuZXcgSGFzaE1hcDxBY3Rpdml0eSwgTWFwPFN0cmluZywgRGlhZ3JhbT4+KCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXA7Ci0JfQotCQotCXByaXZhdGUgRGlhZ3JhbSBnZXREaWFncmFtQmFja3VwKEFjdGl2aXR5IGFjdCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYoYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcCAhPSBudWxsKSB7Ci0JCQlNYXA8U3RyaW5nLCBEaWFncmFtPiB0eXBlVG9EaWFnYW1NYXAgPSBhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwLmdldChhY3QpOwotCQkJaWYodHlwZVRvRGlhZ2FtTWFwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKERpYWdyYW0pIHR5cGVUb0RpYWdhbU1hcC5nZXQodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcGxhY2VUZW1wb3JhcmlseShmaW5hbCBBY3Rpdml0eSBhY3QsIGZpbmFsIERpYWdyYW0gZGlhZ3JhbSkgewotCQl0cnkgewotCQkJbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUxpc3QgZGlhZ3JhbXMgPSBnZXREaWFncmFtcyhhY3QsIGdldERpYWdyYW1UeXBlKGRpYWdyYW0uZ2V0VHlwZSgpKSk7Ci0JCQkJCQlpZighZGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJRGlhZ3JhbSBzYXZlZERpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbXMuZ2V0KDApOwotCQkJCQkJCU1hcDxTdHJpbmcsIERpYWdyYW0+IHR5cGVUb0RpYWdhbU1hcCA9IGdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkuZ2V0KGFjdCk7CQotCQkJCQkJCWlmKHR5cGVUb0RpYWdhbU1hcCA9PSBudWxsKSB7Ci0JCQkJCQkJCXR5cGVUb0RpYWdhbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGlhZ3JhbT4oKTsKLQkJCQkJCQkJZ2V0QWN0aXZpdHlUb1NhdmVkRGlhZ3JhbXNNYXAoKS5wdXQoYWN0LCB0eXBlVG9EaWFnYW1NYXApOwotCQkJCQkJCX0KLQkJCQkJCQlpZih0eXBlVG9EaWFnYW1NYXAuZ2V0KGRpYWdyYW0uZ2V0VHlwZSgpKSA9PSBudWxsKSB7Ci0JCQkJCQkJCXR5cGVUb0RpYWdhbU1hcC5wdXQoZGlhZ3JhbS5nZXRUeXBlKCksIHNhdmVkRGlhZ3JhbSk7Ci0JCQkJCQkJfQotCQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBkaWFncmFtKS5lU2V0UHJveHlVUkkobnVsbCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5lQWxsQ29udGVudHMoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7ICgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSkuZVNldFByb3h5VVJJKG51bGwpKTsKLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbS5nZXRFbGVtZW50KCkpLmVTZXRQcm94eVVSSShudWxsKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldEVsZW1lbnQoKS5lQWxsQ29udGVudHMoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7ICgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSkuZVNldFByb3h5VVJJKG51bGwpKTsJCQkJCQkJCi0JCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zZXQocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKHNhdmVkRGlhZ3JhbSksIGRpYWdyYW0pOwotCQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuc2V0KHJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZihzYXZlZERpYWdyYW0uZ2V0RWxlbWVudCgpKSwgZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwkJCQkKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwkJCQotCQkJCQl9Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCQkKLQkJCX0uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUxKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIERpYWdyYW0gZ2V0U2F2ZWREaWFncmFtKEFjdGl2aXR5IGFjdCwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCURpYWdyYW0gc2F2ZWREaWFncmFtID0gZ2V0RGlhZ3JhbUJhY2t1cChhY3QsIGRpYWdyYW0uZ2V0VHlwZSgpKTsKLS8vCQlpZihzYXZlZERpYWdyYW0gPT0gbnVsbCkgewotLy8JCQkvLyB0cnkgdG8gbG9hZCBkaWFncmFtIGZyb20gZmlsZQotLy8JCQkvLwotLy8JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotLy8JCQlpZihmaWxlICE9IG51bGwpIHsKLS8vCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJRGlhZ3JhbSBkID0gRGlhZ3JhbUlPVXRpbC5sb2FkKGRvbWFpbiwgZmlsZSwgdHJ1ZSwgZ2V0TW9uaXRvcigpKTsKLS8vCQkJCQlpZihkICE9IG51bGwpIHsKLS8vCQkJCQkJaW50IGluZGV4ID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKGRpYWdyYW0pOwotLy8JCQkJCQlzYXZlZERpYWdyYW0gPSAoRGlhZ3JhbSkgZC5lUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmdldChpbmRleCk7Ci0vLwkJCQkJfQotLy8JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8JCQkJfSBmaW5hbGx5IHsKLS8vCQkJCQlpZihkb21haW4gIT0gbnVsbCkgewotLy8JCQkJCQlkb21haW4uZGlzcG9zZSgpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQkJcmV0dXJuIHNhdmVkRGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmV2ZXJzZVRvU2F2ZWQoZmluYWwgQWN0aXZpdHkgYWN0LCBmaW5hbCBEaWFncmFtIGRpYWdyYW0sIFByZWZlcmVuY2VzSGludCBoaW50KSB7Ci0JCWZpbmFsIERpYWdyYW0gc2F2ZWREaWFncmFtID0gZ2V0U2F2ZWREaWFncmFtKGFjdCwgZGlhZ3JhbSk7Ci0JCXRyeSB7Ci0JCQluZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZ2V0RWRpdGluZ0RvbWFpbigpLCBTdHJpbmdTdGF0aWNzLkJMQU5LKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQlpZihzYXZlZERpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gcmVzdG9yZSBkaWFncmFtIHRvIGl0cyBiYWNrdXAKLQkJCQkJCS8vCi0JCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnNldChyZXNvdXJjZS5nZXRDb250ZW50cygpLmluZGV4T2YoZGlhZ3JhbSksIHNhdmVkRGlhZ3JhbSk7Ci0JCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnNldChyZXNvdXJjZS5nZXRDb250ZW50cygpLmluZGV4T2YoZGlhZ3JhbS5nZXRFbGVtZW50KCkpLCBzYXZlZERpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCXJlbW92ZURpYWdyYW1CYWNrdXAoYWN0LCBkaWFncmFtLmdldFR5cGUoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBkaWFncmFtIGlzIG5ld2x5IGNyZWF0ZWQsIHJlbW92ZSBpdCBmcm9tIHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkuZ2V0UGVyc2lzdGVyRm9yKGFjdC5lUmVzb3VyY2UoKSkKLQkJCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChFeGNlcHRpb24gZXgpIHt9Ci0JCQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQkJCi0JCQl9LmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUxKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQkKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIFVSSSBvZiBkaWFncmFtIHJlc291cmNlIGFmdGVyIHRoZSBVUkkgb2YgcHJvY2VzcyByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlVVJJKCkgewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCUZpbGUgcHJvY0ZvbGRlciA9IG5ldyBGaWxlKHByb2Nlc3MuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJaWYoIWZvbGRlci5lcXVhbHMocHJvY0ZvbGRlcikpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0RGlhZ3JhbUZpbGVQYXRoKHByb2Nlc3MpOwotCQkJaWYocGF0aCAhPSBudWxsICYmIG5ldyBGaWxlKHBhdGgpLmV4aXN0cygpKSB7Ci0JCQkJcmVzb3VyY2Uuc2V0VVJJKGNyZWF0ZURpYWdyYW1SZXNvdXJjZVVSSShwYXRoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBiYWNrdXBEaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJTWFwPFN0cmluZywgRGlhZ3JhbT4gdHlwZVRvRGlhZ2FtTWFwID0gZ2V0QWN0aXZpdHlUb1NhdmVkRGlhZ3JhbXNNYXAoKS5nZXQoYWN0aXZpdHkpOwkKLQkJaWYodHlwZVRvRGlhZ2FtTWFwID09IG51bGwpIHsKLQkJCXR5cGVUb0RpYWdhbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGlhZ3JhbT4oKTsKLQkJCWdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkucHV0KGFjdGl2aXR5LCB0eXBlVG9EaWFnYW1NYXApOwotCQl9Ci0JCXR5cGVUb0RpYWdhbU1hcC5wdXQoZGlhZ3JhbS5nZXRUeXBlKCksIERpYWdyYW1IZWxwZXIuY29weURpYWdyYW0oZ2V0RWRpdGluZ0RvbWFpbigpLCBkaWFncmFtKSk7Ci0JfQotCi0JcHVibGljIERpYWdyYW0gcmVtb3ZlRGlhZ3JhbUJhY2t1cChBY3Rpdml0eSBhY3QsIFN0cmluZyB0eXBlKSB7Ci0JCWlmKGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAgIT0gbnVsbCkgewotCQkJTWFwPFN0cmluZywgRGlhZ3JhbT4gdHlwZVRvRGlhZ2FtTWFwID0gYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcC5nZXQoYWN0KTsKLQkJCWlmKHR5cGVUb0RpYWdhbU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChEaWFncmFtKSB0eXBlVG9EaWFnYW1NYXAucmVtb3ZlKHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1TZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMWE4YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVNlcnZpY2UgewotCi0JcHJpdmF0ZSBTZXQ8RGlhZ3JhbU1hbmFnZXI+IGRpYWdyYW1NYW5hZ2VycyA9IG5ldyBIYXNoU2V0PERpYWdyYW1NYW5hZ2VyPigpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1TZXJ2aWNlKCkgewotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKERpYWdyYW1NYW5hZ2VyIG1nciA6IGRpYWdyYW1NYW5hZ2VycykgewotCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKEFjdGl2aXR5IGFjdCkgewotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KSwgdGhpcyk7Ci0JCQlkaWFncmFtTWFuYWdlcnMuYWRkKG1ncik7Ci0JCQlyZXR1cm4gbWdyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxEaWFncmFtPiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QpIHsKLQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoYWN0KTsKLQkJcmV0dXJuIG1nciAhPSBudWxsID8gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtcyhhY3QsIG1ncikgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJhc2UgZGlhZ3JhbS4KLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JCi0JcHVibGljIERpYWdyYW0gZ2V0QmFzZURpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgdHlwZSkgewkJCi0JCWlmIChQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQl0cnkgewotCQkJCUFjdGl2aXR5IGJhc2VBY3QgPSAoQWN0aXZpdHkpIGFjdAotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBnZXREaWFncmFtTWFuYWdlcihiYXNlQWN0KTsKLQkJCQlMaXN0PERpYWdyYW0+IGJhc2VEaWFncmFtcyA9IG1nci5nZXREaWFncmFtcyhiYXNlQWN0LCB0eXBlKTsKLQkJCQlpZighYmFzZURpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm4gYmFzZURpYWdyYW1zLmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBpbiBnZXR0aW5nIGJhc2UgZGlhZ3JhbTogIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUpIHsKLQkJdHJ5IHsKLQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IGdldERpYWdyYW1NYW5hZ2VyKGFjdCk7Ci0JCQlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gbWdyLmdldERpYWdyYW1zKGFjdCwgdHlwZSk7Ci0JCQlyZXR1cm4gZGlhZ3JhbXMuaXNFbXB0eSgpID8gbnVsbCA6IGRpYWdyYW1zLmdldCgwKTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRmlsZVN5bmNocm9uaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9GaWxlU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OGQzMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9GaWxlU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogU3luY2hyb25pemVzIHRoZSBkb2N1bWVudCB3aXRoIGV4dGVybmFsIHJlc291cmNlIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVN5bmNocm9uaXplciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnV0aWwuRmlsZVN5bmNocm9uaXplciB7Ci0JLyoqCi0JICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgdXBkYXRlIGNvZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2g9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlpZiAod2luZG93cyAhPSBudWxsICYmIHdpbmRvd3MubGVuZ3RoID4gMCkgewotCQkJRGlzcGxheSBkaXNwbGF5PSB3aW5kb3dzWzBdLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOwotCQl9IGVsc2UgewotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWVjYTk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkaWFncmFtRGVsZXRlQWN0aW9uSUQgPSAiZGVsZXRlRGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEZWxldGVfRGlhZ3JhbV9FbGVtZW50PSJkZWxldGVEaWFncmFtRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRElBR1JBTV9JRD0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU0VUX0RJQUdSQU1fTEFZT1VUID0gInJlc2V0X2RpYWdyYW1fbGF5b3V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0ggPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9BRERfTUVOVV9HRU5FUkFMX0dST1VQID0gImFkZERpYWdyYW1HZW5lcmFsR3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQQVJFTlRfQ09NTUFORCA9ICJyZXBhcmVudCBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgUkVBRF9PTkxZX0ZPTlRfQ09MT1IgPSBDb2xvckNvbnN0YW50cy5kYXJrR3JlZW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBERUZBVUxUX0ZPTlRfQ09MT1IgPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFNVUFBSRVNTRURfRk9OVF9DT0xPUiA9IENvbG9yQ29uc3RhbnRzLmdyYXk7Ci0JCi0JCi0JLy8gRm9yIGRlZmF1bHQgZm9udHMuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GT05UX05BTUUgPSBnZXRGb250TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9GT05UX1NJWkUgPSA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IERFRkFVTFRfRk9OVCA9IG5ldyBGb250KG51bGwsIERFRkFVTFRfRk9OVF9OQU1FLAotCQkJREVGQVVMVF9GT05UX1NJWkUsIGphdmEuYXd0LkZvbnQuUExBSU4pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IERFRkFVTFRfRk9OVF9JVEFMSUMgPSBuZXcgRm9udChudWxsLAotCQkJREVGQVVMVF9GT05UX05BTUUsIERFRkFVTFRfRk9OVF9TSVpFLCBqYXZhLmF3dC5Gb250LklUQUxJQyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5fMksgPSAiV2luZG93cyAyMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9udE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIkFyaWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENvcnJ1cHRlZCBKYXBhbmVzZSBjaGFyYWN0ZXJzIGluIEFjdGl2aXR5IERpYWdyYW1zCi0JCVN0cmluZyBjdXJyZW50TG9jYWxlID0gUGxhdGZvcm0uZ2V0TkwoKTsKLQkJaWYgKGN1cnJlbnRMb2NhbGUgIT0gbnVsbAotCQkJCSYmIGN1cnJlbnRMb2NhbGUuc3RhcnRzV2l0aChMb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKSkpIHsKLQkJCWlmIChXSU5fMksuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb250TmFtZShGb250U3R5bGUgc3R5bGUpIHsKLQkJU3RyaW5nIG5hbWUgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0JCWlmIChzdHlsZSAhPSBudWxsKSB7CQotCQkJbmFtZSA9IHN0eWxlLmdldEZvbnROYW1lKCk7Ci0JCX0KLQotCQkvLyBDb3JydXB0ZWQgSmFwYW5lc2UgY2hhcmFjdGVycyBpbiBBY3Rpdml0eSBEaWFncmFtcwotCQlTdHJpbmcgY3VycmVudExvY2FsZSA9IFBsYXRmb3JtLmdldE5MKCk7Ci0JCWlmIChjdXJyZW50TG9jYWxlICE9IG51bGwKLQkJCQkmJiBjdXJyZW50TG9jYWxlLnN0YXJ0c1dpdGgoTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCkpKSB7Ci0JCQlpZiAoV0lOXzJLLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IGRlZmF1bHQgZm9udCBkYXRhCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udERhdGEgZ2V0RGVmYXVsdEZvbnREYXRhKCkgewotCQotCQlTdHJpbmcgZm9udE5hbWUgPSBERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCi0JCS8vIENvcnJ1cHRlZCBKYXBhbmVzZSBjaGFyYWN0ZXJzIGluIEFjdGl2aXR5IERpYWdyYW1zCi0JCVN0cmluZyBjdXJyZW50TG9jYWxlID0gUGxhdGZvcm0uZ2V0TkwoKTsKLQkJaWYgKGN1cnJlbnRMb2NhbGUgIT0gbnVsbAotCQkJCSYmIGN1cnJlbnRMb2NhbGUuc3RhcnRzV2l0aChMb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKSkpIHsKLQkJCWlmIChXSU5fMksuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYTsKLQkJCX0KLQkJfQotCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgREVGQVVMVF9GT05UX1NJWkUsIFNXVC5OT1JNQUwpOwotCQlyZXR1cm4gZm9udERhdGE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TVEFSVF9OT0RFID0gImNyZWF0ZV9zdGFydF9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0VORF9OT0RFID0gImNyZWF0ZV9lbmRfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9KT0lOX05PREUgPSAiY3JlYXRlX2pvaW5fbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9ERUNJU0lPTl9OT0RFID0gImNyZWF0ZV9kZWNpc2lvbl9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0FDVElWSVRZID0gImNyZWF0ZV9hY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9QSEFTRSA9ICJjcmVhdGVfcGhhc2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfSVRFUkFUSU9OID0gImNyZWF0ZV9pdGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfVEFTS19ERVNDUklQVE9SID0gImNyZWF0ZV90YXNrX2Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfTUlMRVNUT05FID0gImNyZWF0ZV9taWxlc3RvbmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZPUktfTk9ERT0iY3JlYXRlX2Zvcmtfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfTUVSR0VfTk9ERT0iY3JlYXRlX21lcmdlX25vZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1BBUlRJVElPTiA9ImNyZWF0ZV9wYXJ0aXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9ICJvcGVuX2FjdGl2aXR5X2RldGFpbF9kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFPSJjcmVhdGVfd29ya19wcm9kdWN0X2Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0xJTksgPSAiY3JlYXRlX2RpYWdyYW1fbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkVfQUNUSU9OID0gIm1vdmVfYWN0aW9uX2lkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQmVsb3cgZGVmYXVsdHMgdmFyaWFibGVzIGFyZSB0byBleGNsdWRlIGZyb20gZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX0NPTE9SX0VERUZBVUxUID0gMTY3NzcyMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElORV9DT0xPUl9FREVGQVVMVCA9IDExNTc5NTY4OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIENPTlRST0xfRkxPV19JTUFHRV9ERVNDUklQVE9SID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigibGluay5naWYiKTsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQ2ODQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29yZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5UcmFuc2xhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQWN0aXZpdHlEaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5NYXBNb2RlVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGJlIHVzZWQgZm9yIEVQRiBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1Db3JlVXRpbCB7Ci0JCi0KLQkvKioKLQkgKiBTZXQgbGFiZWwgcHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIGxhYmVsIGZpZ3VyZQotCSAqIEBwYXJhbSBmaWdfMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYWJlbFByb3BlcnRpZXMoV3JhcExhYmVsIGxhYmVsRmlndXJlKXsKLQkJbGFiZWxGaWd1cmUuc2V0Rm9udChEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCWxhYmVsRmlndXJlLnNldEljb25BbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuVE9QKTsKLQkJbGFiZWxGaWd1cmUuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuVE9QKTsKLQkJbGFiZWxGaWd1cmUuc2V0VGV4dEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5UT1ApOwotCQlsYWJlbEZpZ3VyZS5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJbGFiZWxGaWd1cmUuc2V0VGV4dFdyYXAodHJ1ZSk7Ci0JCWxhYmVsRmlndXJlLnNldFRleHRXcmFwQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgZm9udCBmb3IgdGhpcyBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIEBwYXJhbSBzdG9yZSBJUHJlZmVyZW5jZVN0b3JlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRGb250UHJlZmVyZW5jZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKXsKLQkJRm9udERhdGEgZm9udERhdGFBcnJheVtdID0KLSAgICAgICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICAgICAgRm9udERhdGEgZm9udERhdGEgPSBmb250RGF0YUFycmF5WzBdOwotICAgICAgICBmb250RGF0YS5zZXRIZWlnaHQoRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRSk7Ci0gICAgICAgIGZvbnREYXRhLnNldE5hbWUoRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRSk7Ci0gICAgICAgIFByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdCgKLSAgICAgICAgICAgIHN0b3JlLAotICAgICAgICAgICAgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQsCi0gICAgICAgICAgICBmb250RGF0YSk7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKEVkaXRQYXJ0IHBhcnQsIFN0cmluZyB0eHQpewotCQlPYmplY3Qgb2JqID0gcGFydC5nZXRNb2RlbCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCUVPYmplY3QgdW1sRSA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJT2JqZWN0IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCl1bWxFKTsKLQkJCUVPYmplY3QgdW1sQSA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKTsKLQkJCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IChBY3Rpdml0eURpYWdyYW1BZGFwdGVyKUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih1bWxBKTsKLQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCl7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dCU0FjdGl2aXR5UHJlc2VudGF0aW9uTmFtZShlLCB0eHQsIGFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gVG5nVXRpbAotCQkJCQkJLmNoZWNrV29ya0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGUsCi0JCQkJCQkJCXR4dCwgYWRhcHRlci5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgZm9udCBjb2xvciBmb3IgdGhlIGdpdmVuIGVkaXQgcGFydC4gVGhlIGNvbG9yIGlzIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgKHN1cHByZXNzaW9uLCByZWFkLW9ubHkuLi4pCi0JICogb2YgdGhlIHNlbWFudGljIG1vZGVsIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHZpZXcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xvciBnZXRGb250Q29sb3IoQWJzdHJhY3RFZGl0UGFydCBlZGl0UGFydCkgewotCQlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJCi0JCS8vIEJ5IGRlZmF1bHQgcHVibGlzaGluZyBtb2RlIGlzIGZhbHNlLiBJZiBwdWJsaXNoIG1vZGUgaXMgc2V0IHJldHVybiBibGFjayBjb2xvci4KLQkJaWYoTGlicmFyeVV0aWwuUFVCTElTSF9NT0RFKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSBlZGl0UGFydC5nZXRWaWV3ZXIoKTsKLQkJaWYodmlld2VyIGluc3RhbmNlb2YgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKSB7Ci0JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSAoKElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcil2aWV3ZXIpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJLy8gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWVudGVkIG91dCBjb2RlIG9ubHkgaWYgc3VwcHJlc3NlZCBlbGVtZW50cyBzaG91bGQgYmUgc2hvd24gaW4gZ3JheQotCQkJLy8KLS8vCQkJaWYoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCAmJgotLy8JCQkJCWlucHV0LmdldFdyYXBwZXIoKS5pc0luaGVyaXRlZCgpKSB7Ci0vLwkJCQlPYmplY3QgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotLy8JCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0vLwkJCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG51bGw7Ci0vLwkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KGVkaXRQYXJ0KS5nZXREaWFncmFtVmlldygpOwotLy8JCQkJCVN0cmluZyB0eXBlID0gZGlhZ3JhbS5nZXRUeXBlKCk7Ci0vLwkJCQkJaWYoRGlhZ3JhbU1hbmFnZXIuQURfa2luZC5lcXVhbHModHlwZSkpIHsKLS8vCQkJCQkJRGlhZ3JhbUFkYXB0ZXIgZGEgPSAoKERpYWdyYW1BZGFwdGVyKUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSkpOwotLy8JCQkJCQlpZihkYSAhPSBudWxsKSB7Ci0vLwkJCQkJCQlBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcihpbnB1dC5nZXRXcmFwcGVyKCkpOwotLy8JCQkJCQkJYWRhcHRlci5zZXRGaWx0ZXIoZGEuZ2V0RmlsdGVyKCkpOwotLy8JCQkJCQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihkYS5nZXRTdXBwcmVzc2lvbigpKTsKLS8vCQkJCQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbigpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCWVsc2UgaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKHR5cGUpIHx8IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kLmVxdWFscyh0eXBlKSkgewotLy8JCQkJCQlEaWFncmFtSW1wbCBkOwotLy8JCQkJCQlpZihEaWFncmFtTWFuYWdlci5BRERfa2luZC5lcXVhbHModHlwZSkpIHsKLS8vCQkJCQkJCWQgPSAoRGlhZ3JhbUltcGwpIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCQlkID0gKERpYWdyYW1JbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLS8vCQkJCQkJfQkJCQkJCQotLy8JCQkJCQlEaWFncmFtSW1wbCBkaWFncmFtSW5Vc2UgPSAoKERpYWdyYW1JbXBsKWRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLS8vCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBkaWFncmFtSW5Vc2UuZ2V0U3VwcHJlc3Npb24oKTsKLS8vCQkJCQkJaWYoc3VwcHJlc3Npb24gIT0gbnVsbCkgewotLy8JCQkJCQkJZC5zZXRXcmFwcGVyKGlucHV0LmdldFdyYXBwZXIoKSk7Ci0vLwkJCQkJCQlkLnNldEZpbHRlcihkaWFncmFtSW5Vc2UuZ2V0RmlsdGVyKCkpOwotLy8JCQkJCQkJZC5zZXRTdXBwcmVzc2lvbihkaWFncmFtSW5Vc2UuZ2V0U3VwcHJlc3Npb24oKSk7Ci0vLwkJCQkJCQljaGlsZHJlbiA9IGQuZ2V0Q2hpbGRyZW4oKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQlpZihjaGlsZHJlbiAhPSBudWxsKSB7Ci0vLwkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChWaWV3KSBtb2RlbCk7Ci0vLwkJCQkJCWZpbmRfd3JhcHBlcjoKLS8vCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQkJCWlmKFRuZ1V0aWwudW53cmFwKGNoaWxkKSA9PSBlKSB7Ci0vLwkJCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotLy8JCQkJCQkJCQlicmVhayBmaW5kX3dyYXBwZXI7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQlpZihvYmplY3QgIT0gbnVsbCkgewotLy8JCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoaW5wdXQuZ2V0V3JhcHBlcigpKTsKLS8vCQkJCQkJCWlmKFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpLmlzU3VwcHJlc3NlZChvYmplY3QpKSB7Ci0vLwkJCQkJCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuU1VQUFJFU1NFRF9GT05UX0NPTE9SOwotLy8JCQkJCQkJfQotLy8JCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuUkVBRF9PTkxZX0ZPTlRfQ09MT1I7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCQotCQkJaWYoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SOwotCQkJfQotCQl9Ci0JCQotCQlPYmplY3QgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZihtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKChWaWV3KSBtb2RlbCk7Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgZm9udCBjb2xvciBmb3IgdGhlIGdpdmVuIHZpZXcuIFRoZSBjb2xvciBpcyBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIChzdXBwcmVzc2lvbiwgcmVhZC1vbmx5Li4uKQotCSAqIG9mIHRoZSBzZW1hbnRpYyBtb2RlbCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIENvbG9yIGdldEZvbnRDb2xvcihWaWV3IHZpZXcpIHsKLS8vCQlpZiAoQnJpZGdlSGVscGVyLmlzU3VwcHJlc3NlZCh2aWV3KSkgewotLy8JCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5TVVBQUkVTU0VEX0ZPTlRfQ09MT1I7Ci0vLwkJfQotCQlpZiAoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodmlldykpIHsKLQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SOwotCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9DT0xPUjsKLS8vCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERpYWdyYW1FZGl0UGFydCBnZXREaWFncmFtRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJZm9yKDtlZGl0UGFydCAhPSBudWxsICYmICEoZWRpdFBhcnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpOyBlZGl0UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpKTsKLQkJcmV0dXJuIChEaWFncmFtRWRpdFBhcnQpIGVkaXRQYXJ0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkT25seShBYnN0cmFjdEVkaXRQYXJ0IGVkaXRQYXJ0KXsKLQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlyZXR1cm4gQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkoKFZpZXcpbW9kZWwpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3luY0JhcihFZGl0UGFydCBwYXJ0KXsKLQkJaWYocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCl7Ci0JCQlWaWV3IG5vZGUgPSAoVmlldylwYXJ0LmdldE1vZGVsKCk7Ci0JCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpewotCQkJCXJldHVybiBCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcigoQWN0aXZpdHlOb2RlKW9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cmFwKFN0cmluZyBzLCBpbnQgd3JhcFdpZHRoKSB7Ci0JCVN0cmluZyB3cmFwcGVkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJQnJlYWtJdGVyYXRvciBiaSA9IEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCk7Ci0JCVN0cmluZyByZW1haW5pbmcgPSBzOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKHJlbWFpbmluZy5sZW5ndGgoKSA8PSB3cmFwV2lkdGgpIHsKLQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJYmkuc2V0VGV4dChyZW1haW5pbmcpOwotCQkJCWludCBwb3MgPSBiaS5mb2xsb3dpbmcod3JhcFdpZHRoKTsKLQkJCQlpZiAocG9zID09IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHBvcyA+PSByZW1haW5pbmcubGVuZ3RoKCkpIHsKLQkJCQkJCXdyYXBwZWQgKz0gcmVtYWluaW5nOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZy5zdWJzdHJpbmcoMCwgcG9zKSArICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcocG9zKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd3JhcHBlZDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBkZWZhdWx0IGZvbnQgZm9yIHRoaXMgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiBAcGFyYW0gc3RvcmUgSVByZWZlcmVuY2VTdG9yZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0TGluZVN0eWxlKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpewotICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoCi0gICAgICAgICAgICBzdG9yZSwKLSAgICAgICAgICAgIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUiwKLSAgICAgICAgICAgIFByZWZlcmVuY2VDb252ZXJ0ZXIuQ09MT1JfREVGQVVMVF9ERUZBVUxUKTsJCi0JfQotCQotCS8qKgotCSAqIEhpZGUgZGVmYXVsdCBjb25uZWN0aW9uIGhhbmRsZXMgaW4gQUQsIEFERCwgV1BERC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcmUKLQkgKiAgICAgICAgICAgIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaGlkZUNvbm5lY3Rpb25IYW5kbGVzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJc3RvcmUuc2V0RGVmYXVsdChJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NIT1dfQ09OTkVDVElPTl9IQU5ETEVTLAotCQkJCWZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRleHQgaGVpZ2h0IGJhc2VkIG9uIHRleHQsIGZvbnQgYW5kIHdpZHRoIG9mIGJvdW5kcmllcyB0ZXh0IGlzIGluCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gZm9udFN0eWxlCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRleHRIZWlnaHQoU3RyaW5nIHRleHQsIEZvbnRTdHlsZSBmb250U3R5bGUsIGludCB3aWR0aCkgewotCQlGb250IGZvbnQgPSBudWxsOwotCQlTdHJpbmcgZm9udE5hbWUgPSBudWxsOwotCQlpbnQgZm9udEhlaWdodCA9IDA7Ci0JCQotCQlpZiAoZm9udFN0eWxlICE9IG51bGwpIHsKLQkJCWZvbnROYW1lID0gZm9udFN0eWxlLmdldEZvbnROYW1lKCk7Ci0JCQlmb250SGVpZ2h0ID0gZm9udFN0eWxlLmdldEZvbnRIZWlnaHQoKTsKLQkJCWlmIChmb250TmFtZSA9PSBudWxsKQotCQkJCWZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZSgpOwotCQkJaWYgKGZvbnRIZWlnaHQgPT0gMCkKLQkJCQlmb250SGVpZ2h0ID0gRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCQotCQkJZm9udCA9IG5ldyBGb250KG51bGwsIGZvbnROYW1lLCBmb250SGVpZ2h0LCBqYXZhLmF3dC5Gb250LlBMQUlOKTsKLQkJfQotCQllbHNlIAotCQkJZm9udCA9IERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UOwotCi0JCURpbWVuc2lvbiBkOwotCQl0cnkgewotCQkJZCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyh0ZXh0LCBmb250KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKGZvbnQgIT0gbnVsbCAmJiBmb250ICE9IERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UKSB7Ci0JCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgbm9PZkxpbmVzID0gMDsKLQkJaWYgKGQgIT0gbnVsbCAmJiBkLndpZHRoID4gMCkgewotCQkJaW50IGRpdiA9IGQud2lkdGggLyB3aWR0aDsKLQkJCWludCBtb2QgPSBkLndpZHRoICUgd2lkdGg7Ci0JCQlpZiAobW9kICE9IDApCi0JCQkJZGl2Kys7Ci0JCQlub09mTGluZXMgPSBkaXY7Ci0JCQlyZXR1cm4gbm9PZkxpbmVzICogZm9udEhlaWdodDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpbWVuc2lvbiBnZXRUZXh0U2l6ZUluV3JhcExhYmVsKFN0cmluZyB0ZXh0LCBGb250IGYsIGludCB3SGludCwgaW50IGhIaW50LCBJTWFwTW9kZSBtYXBNb2RlKSB7Ci0JCWNsYXNzIE15V3JhcExhYmVsIGV4dGVuZHMgV2lkZW5lZFdyYXBMYWJlbCBpbXBsZW1lbnRzIElNYXBNb2RlIHsKLQkJCXByaXZhdGUgSU1hcE1vZGUgbWFwTW9kZTsKLQotCQkJcHVibGljIE15V3JhcExhYmVsKElNYXBNb2RlIG1hcE1vZGUpIHsKLQkJCQl0aGlzLm1hcE1vZGUgPSBtYXBNb2RlICE9IG51bGwgPyBtYXBNb2RlIDogTWFwTW9kZVR5cGVzLklERU5USVRZX01NOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IERQdG9MUChpbnQgZGV2aWNlVW5pdCkgewotCQkJCXJldHVybiBtYXBNb2RlLkRQdG9MUChkZXZpY2VVbml0KTsKLQkJCX0KLQotCQkJcHVibGljIFRyYW5zbGF0YWJsZSBEUHRvTFAoVHJhbnNsYXRhYmxlIHQpIHsKLQkJCQlyZXR1cm4gbWFwTW9kZS5EUHRvTFAodCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgTFB0b0RQKGludCBsb2dpY2FsVW5pdCkgewotCQkJCXJldHVybiBtYXBNb2RlLkxQdG9EUChsb2dpY2FsVW5pdCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBUcmFuc2xhdGFibGUgTFB0b0RQKFRyYW5zbGF0YWJsZSB0KSB7Ci0JCQkJcmV0dXJuIG1hcE1vZGUuTFB0b0RQKHQpOwotCQkJfQotCQkJCi0JCX07Ci0JCU15V3JhcExhYmVsIGxhYmVsID0gbmV3IE15V3JhcExhYmVsKG1hcE1vZGUpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGxhYmVsKTsJCQotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlpZihmICE9IG51bGwpIHsKLQkJCWxhYmVsLnNldEZvbnQoZik7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsLmdldFRleHRTaXplKHdIaW50LCBoSGludCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sb3IgZ2V0TGlua092ZXJyaWRlQ29sb3IoRWRnZSBlZGdlKSB7Ci0JCXJldHVybiAhTGlicmFyeVV0aWwuUFVCTElTSF9NT0RFICYmIERpYWdyYW1Db3JlVmFsaWRhdGlvbi5pc1JlYWRPbmx5KGVkZ2UpPyAKLQkJCQlEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2FlOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmxvY2Fsc3RvcmUuSXNTeW5jaHJvbml6ZWRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Jbml0aWFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLQotLyoqCi0gKiBWYWxpZGF0aW5nIHJvdXRpbmVzIGZvciBkaWFncmFtIGVkaXRpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvcmVWYWxpZGF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfQ2FuTm90Q29ubmVjdCA9IERpYWdyYW1Db3JlUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX1NhbWVQcmVkQW5kU3VjYyA9IERpYWdyYW1Db3JlUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX0Nhbk5vdERlbGV0ZSA9IERpYWdyYW1Db3JlUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlzVGFyZ2V0UmVhZG9ubHkoRWRpdFBhcnQgcGFydCl7Ci0JCVZpZXcgdmlldyA9IChWaWV3KXBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodmlldykpIHJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbkNvbm5lY3QoRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQsIEVPYmplY3Qgc291cmNlRWxlbWVudCwgRU9iamVjdCB0YXJnZXRFbGVtZW50KXsKLQkJCi0JCWlmKHRhcmdldEVkaXRQYXJ0ID09IG51bGwpIHJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCi0JCUVkaXRQYXJ0IHBhcnQgPSB0YXJnZXRFZGl0UGFydC5nZXRQYXJlbnQoKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQkJd2hpbGUocGFydCAhPSBudWxsICYmICEocGFydCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpewotCQkJCXBhcnQgID0gcGFydC5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZihwYXJ0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KXsKLQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkoKERpYWdyYW1FZGl0UGFydClwYXJ0KS5nZXRNb2RlbCgpOwotCQl9Ci0KLQkJaWYoZGlhZ3JhbSA9PSBudWxsKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCXJldHVybiBjaGVja0Nvbm5lY3QoZGlhZ3JhbSwgIHNvdXJjZUVsZW1lbnQsIHRhcmdldEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0Nvbm5lY3QoRGlhZ3JhbSBkaWFncmFtLCBFT2JqZWN0IHNvdXJjZUVsZW1lbnQsIEVPYmplY3QgdGFyZ2V0RWxlbWVudCl7Ci0JCXN3aXRjaChEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKXsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWlmKGFsd2F5c0FsbG93ZWQoc291cmNlRWxlbWVudCwgdGFyZ2V0RWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gSWYgdGFyZ2V0IERpYWdyYW0gaXMgcmVhZC1vbmx5IC0gZG8gbm90IGNvbm5lY3QKLQkJCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KGRpYWdyYW0pKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCi0JCQlOb2RlQWRhcHRlciBzb3VyY2VBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHNvdXJjZUVsZW1lbnQpOwotCQkJTm9kZUFkYXB0ZXIgdGFyZ2V0QWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih0YXJnZXRFbGVtZW50KTsKLQkJCQotCQkJLy8gaWYgYWRhcHRlcnMgb2Ygc291cmNlIGFuZCB0YXJnZXQgaXMgbnVsbCAtIG5vIGNvbm5lY3QuCi0JCQlpZihzb3VyY2VBZGFwdGVyID09IG51bGwgfHwgdGFyZ2V0QWRhcHRlciA9PSBudWxsKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkKLQkJCURpYWdyYW0gc291cmNlRGlhZ3JhbSA9IHNvdXJjZUFkYXB0ZXIuZ2V0VmlldygpLmdldERpYWdyYW0oKTsKLQkJCQotCQkJLy8gSWYgc291cmNlIGFuZCB0YXJnZXQgZGlhZ3JhbXMgbm90IGVxdWFsIC0gZG8gbm90IGNvbm5lY3QuCi0JCQlpZiAoIWRpYWdyYW0uZXF1YWxzKHNvdXJjZURpYWdyYW0pKQotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0KLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHNvdXJjZURpYWdyYW0pCi0JCQkJCSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCU9iamVjdCBwcm9jID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcHJvYyA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRUb3BJdGVtKCk7Ci0JCQl9Ci0JCQkvLyBnZXQgYWxsIGJyZWFrZG93biBlbGVtZW50cyBpbiB0aGlzIHByb2Nlc3MKLQkJCS8vCi0JCQlMaXN0PE9iamVjdD4gYWxsRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJcHJvYyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlhbGxFbGVtZW50cy5hZGQoVG5nVXRpbC51bndyYXAob2JqKSk7Ci0JCQl9Ci0JCQlpZihwcm9jICE9IG51bGwpewotCQkJCUVPYmplY3Qgc291cmNlID0gc291cmNlQWRhcHRlci5nZXRFbGVtZW50KCk7Ci0KLQkJCQlFT2JqZWN0IHRhcmdldCA9IG51bGw7Ci0JCQkJaWYgKHRhcmdldEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0YXJnZXQgPSB0YXJnZXRBZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIAotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcigKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQsCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgc291cmNlLCBhbGxFbGVtZW50cykpCi0JCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0KLQkJCQkJCWlmICh0YXJnZXRBZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKSkKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2RlcyhhY3ROb2RlcywKLQkJCQkJCQkJKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RWxlbWVudCk7Ci0JCQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogYWN0Tm9kZXMpIHsKLQkJCQkJCQlpZiAoQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpLmlzVGFyZ2V0UmVhZE9ubHkoKSkKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKAotCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQobm9kZSksCi0JCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZSwgYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IHNyY05vZGVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eU5vZGU+KCk7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0UHJlZGVjZXNzb3JOb2RlcyhzcmNOb2RlcywKLQkJCQkJCQkJKEFjdGl2aXR5Tm9kZSkgc291cmNlRWxlbWVudCk7Ci0JCQkJCQlpZiAoIXNyY05vZGVzLmlzRW1wdHkoKSkgewotCQkJCQkJCWlmICh0YXJnZXRBZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKSkKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCWZvciAoQWN0aXZpdHlOb2RlIHByZWROb2RlIDogc3JjTm9kZXMpIHsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudCBwcmVkID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocHJlZE5vZGUpOwotCQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcigKLQkJCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldCwKLQkJCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWQsCi0JCQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gZXJyTXNnX1NhbWVQcmVkQW5kU3VjYzsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChjaGVja1N5bmNCYXJDaXJjdWxhckxvb29wKChBY3Rpdml0eU5vZGUpc291cmNlRWxlbWVudCwKLQkJCQkJCQkJKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCX0KLQotCQkJCQkJLy8gc2hvdWxkIG5vdCBhbGxvdyBpbmNvbWluZyBjb25uZWN0aW9uIHRvIHN0YXJ0IG5vZGUKLQkJCQkJCS8vIGFuZCBGcmVlVGV4dC4KLQkJCQkJCWlmICh0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgSW5pdGlhbE5vZGUpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCUNvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBzcmNOb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOyAKLQkJCQkJCUJyaWRnZUhlbHBlci5nZXRQcmVkZWNlc3Nvck5vZGVzKHNyY05vZGVzLCAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFbGVtZW50KTsKLQkJCQkJCWlmICghc3JjTm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IHRhcmdldE5vZGVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eU5vZGU+KCk7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmdldFN1Y2Nlc3Nvck5vZGVzKHRhcmdldE5vZGVzLAotCQkJCQkJCQkJKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0KTsKLQkJCQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogdGFyZ2V0Tm9kZXMpIHsKLQkJCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkJCQkuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJCQkJCWlmIChub2RlQWRhcHRlci5pc1RhcmdldFJlYWRPbmx5KCkpCi0JCQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGVBZGFwdGVyCi0JCQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCQkJZm9yIChBY3Rpdml0eU5vZGUgcHJlZG5vZGUgOiBzcmNOb2RlcykgewotCQkJCQkJCQkJTm9kZUFkYXB0ZXIgcHJlZEFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkJCQkJLmdldE5vZGVBZGFwdGVyKHByZWRub2RlKTsKLQkJCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRBZGFwdGVyCi0JCQkJCQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcihzdWNjLCBwcmVkLAotCQkJCQkJCQkJCQlhbGxFbGVtZW50cykpIHsKLQkJCQkJCQkJCQlyZXR1cm4gZXJyTXNnX1NhbWVQcmVkQW5kU3VjYzsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIFRvIGF2b2lkIGNpcmN1bGFyIGxvb3BpbmcgYmV0d2VlbiBzeW5jaHJvbml6YXRpb24gYmFycy4gSWYgU3ljbkJhcjEgLT4KLQkgKiBTeW5jQmFyMiAoY29ubmVjdGVkKSB0aGVuIFN5bmNCYXIyIC0+IFN5bmNCYXIxIGNhbm5vdCBjb25uZWN0LiBpZgotCSAqIHN5bmNiYXIxIC0+IHN5bmNiYXIyLT5zeW5jYmFyMyB0aGVuIHN5bmNiYXIzIC0+IHN5bmNiYXIxIGRpc2FsbG93ZWQuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcChBY3Rpdml0eU5vZGUgc05vZGUsCi0JCQlBY3Rpdml0eU5vZGUgdE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gdE5vZGUuZ2V0T3V0Z29pbmdzKCk7Ci0JCWlmICghbGlzdC5pc0VtcHR5KCkgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJQWN0aXZpdHlOb2RlIHR5cGVkbm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKHNOb2RlLmVxdWFscyh0eXBlZG5vZGUpKQotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJaWYgKHR5cGVkbm9kZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQkJCXJldHVybiBjaGVja1N5bmNCYXJDaXJjdWxhckxvb29wKHNOb2RlLAotCQkJCQkJCShDb250cm9sTm9kZSl0eXBlZG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBNZXRob2QgdG8gQ2hlY2sgaWYgU3luY0JhciBpbkNvbW1pbmcgY29ubmVjdGlvbnMgaGF2ZSAKLQkgKiBhbnkgc291cmNlIGlzIGEgcmVhZG9ubHkuIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1N5bmNCYXJJbmNvbWluZ0xpbmtzKEFjdGl2aXR5Tm9kZSB0eXBlZE5vZGUpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHNvdXJjZSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaWYoYWRhcHRlci5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJCWlmKGFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJfWVsc2UgaWYoc291cmNlIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpewotCQkJCQlpZihzb3VyY2UgaW5zdGFuY2VvZiBGb3JrTm9kZSB8fCBzb3VyY2UgaW5zdGFuY2VvZiBKb2luTm9kZSkKLQkJCQkJCWlmKGNoZWNrU3luY0JhckluY29taW5nTGlua3Moc291cmNlKSE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKgotCSAqTWV0aG9kIHRvIGNoZWNrIGlmIHN5bmNocm9uaXphdGlvbiBiYXIgb3V0Z29pbmcgY29ubmVjdGlvbgotCSAqaGFzIGFueSB0YXJnZXQgaXMgcmVhZG9ubHkuICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKEFjdGl2aXR5Tm9kZSB0eXBlZE5vZGUpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHRhcmdldCk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaWYoYWRhcHRlci5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJCWlmKGFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJfWVsc2UgaWYodGFyZ2V0IGluc3RhbmNlb2YgQ29udHJvbE5vZGUpewotCQkJCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBGb3JrTm9kZSB8fCB0YXJnZXQgaW5zdGFuY2VvZiBKb2luTm9kZSkKLQkJCQkJCWlmKGNoZWNrU3luY0Jhck91dGdvaW5nTGlua3ModGFyZ2V0KSE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0RlbGV0ZShOb2RlIG5vZGUpIHsKLQkJaWYgKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KG5vZGUpKQotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG5vZGUuZ2V0RGlhZ3JhbSgpOwotCQlpZiAoZGlhZ3JhbSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJaWYgKG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLQkJCQkKLQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gdGFyZ2V0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsgCi0JCQkJQnJpZGdlSGVscGVyLmdldFN1Y2Nlc3Nvck5vZGVzKHRhcmdldE5vZGVzLCAoQWN0aXZpdHlOb2RlKW5vZGUuZ2V0RWxlbWVudCgpKTsKLQkJCQkJCQotCQkJCWZvciAoQWN0aXZpdHlOb2RlIHRhcmdldE5vZGUgOiB0YXJnZXROb2RlcykgewotCQkJCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHRhcmdldE5vZGUpOwotCQkJCQlpZihhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc1RhcmdldFJlYWRPbmx5KCkpewotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZGlhZ3JhbSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJaWYgKG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUm9sZU5vZGUpIHsKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tSZWNvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBFZGdlIGxpbmspIHsKLQkJaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQlpZiAoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkobGluay5nZXRUYXJnZXQoKSkpIHsKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkobm9kZSkpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQsIGxpbmspOwotCX0KLQkKLQkvKgotCSAqIE1ldGhvZCB3aWxsIG5vdCBhbGxvdyBtdWx0aXBsZSBsaW5rIGJldHdlZW4gdHdvIG5vZGVzLiBOZWVkcyB0byBjYWxsCi0JICogQ3JlYWtMaW5rQ29tbWFuZCBhbmQgUmVjb25uZWN0TGlua0NvbW1hbmQuIEFueSBhY3Rpb24gb24gYSBMaW5rIHNob3VsZAotCSAqIGNhbGwgdGhpcyBjaGVja0Nvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIGJlZm9yZSBhbGxvdwotCSAqIHRvIGNvbm5lY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCwgRWRnZSBsaW5rKSB7Ci0KLQkJaWYgKHNvdXJjZSA9PSB0YXJnZXQgJiYgIShCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChzb3VyY2UpIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCX0KLQotCQlMaXN0IGxpbmtzID0gc291cmNlLmdldFRhcmdldEVkZ2VzKCk7Ci0JCWlmIChsaW5rcyAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIGlzIG5lZWQgZm9yIHJlY29ubmVjdCB0byBzYW1lIHRhcmdldCBub2RlLgotCQkJaWYgKGxpbmtzLmNvbnRhaW5zKGxpbmspKSB7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkvLyBUaGlzIGlzIG5lZWQgZm9yIG5ldyBjb25uZWN0IGFuZCByZWNvbm5lY3QgdG8gZGlmZmVyZW50IHRhcmdldCBub2RlLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaW5rcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGlua3ggPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgbGlua3h0YXJnZXQgPSBsaW5reC5nZXRUYXJnZXQoKTsKLQkJCWlmIChsaW5reHRhcmdldCAhPSBudWxsICYmIGxpbmt4dGFyZ2V0LmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hlY2tDb25uZWN0KHNvdXJjZS5nZXREaWFncmFtKCksIHNvdXJjZS5nZXRFbGVtZW50KCksIHRhcmdldC5nZXRFbGVtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFsd2F5c0FsbG93ZWQoT2JqZWN0IHNvdXJjZUVsZW1lbnQsIE9iamVjdCB0YXJnZXRFbGVtZW50KSB7Ci0JCXJldHVybiBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgSW5pdGlhbE5vZGUgCi0JCXx8IHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBGaW5hbE5vZGUKLQkJfHwgKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSAmJiAhQnJpZGdlSGVscGVyLmlzU3luY2hCYXIoKENvbnRyb2xOb2RlKXNvdXJjZUVsZW1lbnQpKQotCQl8fCAodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIENvbnRyb2xOb2RlICYmICFCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcigoQ29udHJvbE5vZGUpdGFyZ2V0RWxlbWVudCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0RlbGV0ZShFZGdlIGVkZ2UpIHsKLQotCQlWaWV3IHNvdXJjZSA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCVZpZXcgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTsKLQotCQlpZih0YXJnZXQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSB0YXJnZXQuZ2V0RGlhZ3JhbSgpOwotCQkJc3dpdGNoKERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSkpewotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToJCQkJCi0JCQkJRU9iamVjdCBzb3VyY2VFbGVtZW50ID0gc291cmNlLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IHRhcmdldEVsZW1lbnQgPSB0YXJnZXQuZ2V0RWxlbWVudCgpOwotCQkJCWlmKGFsd2F5c0FsbG93ZWQoc291cmNlRWxlbWVudCwgdGFyZ2V0RWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCS8vIGNoZWNrIGlmIHRoaXMgZWRnZSBpcyByZXByZXNlbnRpbmcgYW55IHdvcmsgb3JkZXIKLQkJCQkvLwotCQkJCWlmIChzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJCQkmJiBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChzb3VyY2VFbGVtZW50KSA9PSBudWxsKSB7Ci0JCQkJCUNvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0U291cmNlTm9kZXMoYWN0Tm9kZXMsCi0JCQkJCQkJKEFjdGl2aXR5Tm9kZSkgc291cmNlRWxlbWVudCwKLQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JCQkJCWlmIChhY3ROb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIHRoZSBlZGdlIGRvZXMgcmVwcmVzZW50IGEgd29yayBvcmRlcgotCQkJCQotCQkJCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHRhcmdldCkpewotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSl7Ci0JCQkJCS8vIHRhcmdldCBkb2VzIG5vdCByZXByZXNlbnQgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCQkJCS8vIGRpc2FsbG93IGRlbGV0aW9uIG9mIHRoZSBlZGdlIGlmIG9uZSBvZiB0aGUgdGFyZ2V0IG5vZGVzIG9mIHRoZSB0YXJnZXQgaXMgcmVhZC1vbmx5IG9yIGluaGVyaXRlZAotCQkJCQkvLwotCQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCQkJQnJpZGdlSGVscGVyLmdldFN1Y2Nlc3Nvck5vZGVzKGFjdE5vZGVzLCAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFbGVtZW50KTsKLQkJCQkJZm9yIChBY3Rpdml0eU5vZGUgYWN0aXZpdHlOb2RlIDogYWN0Tm9kZXMpIHsKLQkJCQkJCVZpZXcgdmlldyA9IEJyaWRnZUhlbHBlci5nZXRWaWV3KGRpYWdyYW0sIGFjdGl2aXR5Tm9kZSk7Ci0JCQkJCQlpZih2aWV3ICE9IG51bGwgJiYgQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodmlldykpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZih0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlICYmIEJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKChBY3Rpdml0eU5vZGUpdGFyZ2V0RWxlbWVudCkpewotCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcygoQWN0aXZpdHlOb2RlKXRhcmdldEVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCQotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh0YXJnZXQpKQotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGxpbmsgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE9ubHkoRWRnZSBlZGdlKSB7Ci0JCQotCQlWaWV3IHRhcmdldCA9IGVkZ2UuZ2V0VGFyZ2V0KCk7Ci0JCVZpZXcgc291cmNlID0gZWRnZS5nZXRTb3VyY2UoKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsCi0JCQkJJiYgdGFyZ2V0LmdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmKHNvdXJjZSAhPSBudWxsKXsKLQkJCQlPYmplY3Qgc291cmNlRWxlbWVudCA9IHNvdXJjZS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYoc291cmNlRWxlbWVudCAhPSBudWxsICYmIHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrTm9kZQotCQkJCQkJJiYgKChUYXNrTm9kZSlzb3VyY2VFbGVtZW50KS5pc1JlYWRPbmx5KCkpewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZih0YXJnZXQgIT0gbnVsbCl7Ci0JCQkJT2JqZWN0IHRhcmdldEVsZW1lbnQgPSB0YXJnZXQuZ2V0RWxlbWVudCgpOwotCQkJCWlmKHRhcmdldEVsZW1lbnQgIT0gbnVsbCAmJiB0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgVGFza05vZGUKLQkJCQkJCSYmICgoVGFza05vZGUpdGFyZ2V0RWxlbWVudCkuaXNSZWFkT25seSgpKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9ZWxzZXsKLQkJCXJldHVybiBjaGVja0RlbGV0ZShlZGdlKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgaWYgYW55IGR1cGxpY2F0ZSBsaW5rcyBiZXR3ZWVuIHR3byBlbmRzIGFscmVhZHkgZXhpc3RzLgotCSAqIAkgCi0JICogKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEdXBsaWNhdGVSZWxhdGlvbnNoaXAoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgdGFyZ2V0KSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gc291cmNlLmVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBhY3Rpdml0eSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgY29udGFpbmVyOwotCQkJTGlzdDxBY3Rpdml0eUVkZ2U+IGxpc3QgPSBhY3Rpdml0eS5nZXRFZGdlcygpOwotCQkJZm9yIChJdGVyYXRvcjxBY3Rpdml0eUVkZ2U+IGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBlbGVtZW50ID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKChlbGVtZW50LmdldFNvdXJjZSgpID09IHNvdXJjZSkKLQkJCQkJCSYmIGVsZW1lbnQuZ2V0VGFyZ2V0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL1ZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjY2FjODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL1ZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIE1hbmFnZXMgYW5kIHZhbGlkYXRlcyB0aGUgZGlyZWN0IGVkaXRpbmcgb2YgZWRpdHBhcnQuIFByb21wdHMgYWNjb3JkaW5nbHkuICAKLSAqIFNob3VsZCBpbXBsZW1lbnQgYWJzdHJhY3QgbWV0aG9kcyB3aGVuIGV4dGVuZHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgVGV4dERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCXB1YmxpYyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2xhc3MgZWRpdG9yVHlwZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNjb21taXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbW1pdCgpIHsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRlKChTdHJpbmcpIGdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlicmluZ0Rvd24oZmFsc2UpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUHJvbXB0RWRpdCh0aGlzLCBtc2cpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5jb21taXQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKSB7Ci0JCWJyaW5nRG93bih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bihib29sZWFuIGNoZWNrKSB7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoY2hlY2spIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQlFT2JqZWN0IGFOb2RlID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCQlpZiAoYU5vZGUgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCQluYW1lID0gKChBY3Rpdml0eU5vZGUpYU5vZGUpLmdldE5hbWUoKTsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpYU5vZGUpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQotCQkJfWVsc2UgaWYoYU5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGUpewotCQkJCU5hbWVkTm9kZSBuYW1lTm9kZSA9IChOYW1lZE5vZGUpIGFOb2RlOwotCQkJCW5hbWUgPSBuYW1lTm9kZS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkJT2JqZWN0IHdiZWxlbWVudCA9IG5hbWVOb2RlLmdldE9iamVjdCgpOwotCQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQkJbmV3IFByb21wdEVkaXQodGhpcyxEaWFncmFtQ29yZVJlc291cmNlcy5lcnJfbmFtZV9lbXB0eSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtQ29yZVJlc291cmNlcy5kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlOwotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCW1hbmFnZXIucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHR4dAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Ly5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDlmZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NTMxMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyLkRpYWdyYW1FZGl0UGx1Z2luJEltcGxlbWVudGF0aW9uCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5kcmF3MmQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViZDRmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IGJ1aWxkLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzoxOCBqdGhhbSBFeHAgJAotCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDkzNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19BY3Rpdml0eURpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19BY3Rpdml0eURpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmIwYTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfQWN0aXZpdHlEaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfRGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIyNjJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX05hbWVkTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX05hbWVkTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWU5ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19OYW1lZE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Sb2xlTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1JvbGVOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyZjIyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1JvbGVOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfUm9sZVRhc2tDb21wb3NpdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Sb2xlVGFza0NvbXBvc2l0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzY3ZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Sb2xlVGFza0NvbXBvc2l0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1Rhc2tOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfVGFza05vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM2N2ZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfVGFza05vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19UeXBlZE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19UeXBlZE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzg3MzA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfVHlwZWROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3MGQ1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3RDb21wb3NpdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTNiM2QyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3RDb21wb3NpdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhY2UxMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjMwZmE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0Tm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0Tm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTZlYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZV9vdXRnb2luZ0Nvbm5lY3Rpb25zX0xpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZV9vdXRnb2luZ0Nvbm5lY3Rpb25zX0xpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODlmM2FmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVfb3V0Z29pbmdDb25uZWN0aW9uc19MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZGM3NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE1NTkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGE4YWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9MaW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmNDA4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWROb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lZE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTdkYzdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lZE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTc1NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlVGFza0NvbXBvc2l0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVRhc2tDb21wb3NpdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGI1MzBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlVGFza0NvbXBvc2l0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza05vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiNTMwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza05vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGVkTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHlwZWROb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiODJlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHlwZWROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMGFlZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RDb21wb3NpdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkMTBmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RDb21wb3NpdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM5NTNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3ROb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRhYWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTViMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSMgPGNvcHlyaWdodD4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgPC9jb3B5cmlnaHQ+Ci0jCi0jICRJZDogcGx1Z2luLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzoxOCBqdGhhbSBFeHAgJAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wbHVnaW5OYW1lPUVQRiBEaWFncmFtIEVkaXQgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9Ci1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9Ci1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gQ3JlYXRlIE5ldyB7MH0gVW5kZXIgezF9IEZlYXR1cmUKLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZSBzZWxlY3RlZCB7Mn0uCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50LgotCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gVGhlIHswfSBvZiB0aGUgezF9Ci0KLV9VSV9EaWFncmFtX3R5cGUgPSBEaWFncmFtCi1fVUlfTGlua190eXBlID0gTGluawotX1VJX0xpbmtlZE9iamVjdF90eXBlID0gTGlua2VkIE9iamVjdAotX1VJX05hbWVkTm9kZV90eXBlID0gTmFtZWQgTm9kZQotX1VJX05vZGVfdHlwZSA9IE5vZGUKLV9VSV9BY3Rpdml0eURpYWdyYW1fdHlwZSA9IEFjdGl2aXR5IERpYWdyYW0KLV9VSV9UeXBlZE5vZGVfdHlwZSA9IFR5cGVkIE5vZGUKLV9VSV9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3R5cGUgPSBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi1fVUlfV29ya1Byb2R1Y3ROb2RlX3R5cGUgPSBXb3JrIFByb2R1Y3QgTm9kZQotX1VJX0FjdGl2aXR5RGV0YWlsRGlhZ3JhbV90eXBlID0gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLV9VSV9Ob2RlQ29udGFpbmVyX3R5cGUgPSBOb2RlIENvbnRhaW5lcgotX1VJX1JvbGVOb2RlX3R5cGUgPSBSb2xlIE5vZGUKLV9VSV9Sb2xlVGFza0NvbXBvc2l0ZV90eXBlID0gUm9sZSBUYXNrIENvbXBvc2l0ZQotX1VJX1Rhc2tOb2RlX3R5cGUgPSBUYXNrIE5vZGUKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlX3R5cGUgPSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnROb2RlX3R5cGUgPSBXb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGUKLV9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlID0gV29yayBQcm9kdWN0IENvbXBvc2l0ZQotX1VJX1Vua25vd25fdHlwZSA9IE9iamVjdAotCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsdWUKLQotX1VJX0xpbmtfc291cmNlX2ZlYXR1cmUgPSBTb3VyY2UKLV9VSV9MaW5rX3RhcmdldF9mZWF0dXJlID0gVGFyZ2V0Ci1fVUlfTGlua19iZW5kcG9pbnRzX2ZlYXR1cmUgPSBCZW5kcG9pbnRzCi1fVUlfTGlua19zb3VyY2VFbmRQb2ludF9mZWF0dXJlID0gU291cmNlIEVuZCBQb2ludAotX1VJX0xpbmtfdGFyZ2V0RW5kUG9pbnRfZmVhdHVyZSA9IFRhcmdldCBFbmQgUG9pbnQKLV9VSV9MaW5rZWRPYmplY3RfbGlua2VkRWxlbWVudF9mZWF0dXJlID0gTGlua2VkIEVsZW1lbnQKLV9VSV9MaW5rZWRPYmplY3Rfb2JqZWN0X2ZlYXR1cmUgPSBPYmplY3QKLV9VSV9OYW1lZE5vZGVfbmFtZV9mZWF0dXJlID0gTmFtZQotX1VJX05vZGVfbG9jYXRpb25fZmVhdHVyZSA9IExvY2F0aW9uCi1fVUlfTm9kZV93aWR0aF9mZWF0dXJlID0gV2lkdGgKLV9VSV9Ob2RlX2hlaWdodF9mZWF0dXJlID0gSGVpZ2h0Ci1fVUlfTm9kZV9pbmNvbWluZ0Nvbm5lY3Rpb25zX2ZlYXR1cmUgPSBJbmNvbWluZyBDb25uZWN0aW9ucwotX1VJX05vZGVfb3V0Z29pbmdDb25uZWN0aW9uc19mZWF0dXJlID0gT3V0Z29pbmcgQ29ubmVjdGlvbnMKLV9VSV9Ob2RlX3JlYWRPbmx5X2ZlYXR1cmUgPSBSZWFkIE9ubHkKLV9VSV9UeXBlZE5vZGVfdHlwZV9mZWF0dXJlID0gVHlwZQotX1VJX1dvcmtQcm9kdWN0Tm9kZV90eXBlX2ZlYXR1cmUgPSBUeXBlCi1fVUlfTm9kZUNvbnRhaW5lcl9ub2Rlc19mZWF0dXJlID0gTm9kZXMKLV9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlX2ZlYXR1cmUgPSBUeXBlCi1fVUlfVW5rbm93bl9mZWF0dXJlID0gVW5zcGVjaWZpZWQKLQotX1VJX0xpbmtfbmFtZV9mZWF0dXJlID0gTmFtZQotX1VJX0FjdGl2aXR5RGV0YWlsRGlhZ3JhbV9hdXRvTGF5b3V0X2ZlYXR1cmUgPSBBdXRvIExheW91dAotX1VJX1Rhc2tOb2RlX2luZGV4X2ZlYXR1cmUgPSBJbmRleAotX1VJX1JvbGVUYXNrQ29tcG9zaXRlX3Jvd0luZGV4X2ZlYXR1cmUgPSBSb3cgSW5kZXgKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjNTBkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08IS0tCi0gPGNvcHlyaWdodD4KLSA8L2NvcHlyaWdodD4KLQotICRJZDogcGx1Z2luLnhtbCx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjE4IGp0aGFtIEV4cCAkCi0tLT4KLQotPHBsdWdpbj4KLSAgICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICAgdXJpID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIgCi0gICAgICAgc3VwcG9ydGVkVHlwZXMgPSAKLSAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9BY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyM2M0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9BY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBEaWFncmFtSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBdXRvTGF5b3V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRvIExheW91dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dG9MYXlvdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fYXV0b0xheW91dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fYXV0b0xheW91dF9mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VULAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQWN0aXZpdHlEZXRhaWxEaWFncmFtIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlQb2ludCBsYWJlbFZhbHVlID0gKChBY3Rpdml0eURldGFpbERpYWdyYW0pb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5RGV0YWlsRGlhZ3JhbV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVDoKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9BY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0FjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTIzZWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0FjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW19IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgRGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHlEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0FjdGl2aXR5RGlhZ3JhbSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoQWN0aXZpdHlEaWFncmFtKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURpYWdyYW1fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvRGlhZ3JhbUVkaXRQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0RpYWdyYW1FZGl0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDgwYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvRGlhZ3JhbUVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEaWFncmFtRWRpdFBsdWdpbi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIERpYWdyYW0gZWRpdCBwbHVnaW4uCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7Ci0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlhZ3JhbUVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgRGlhZ3JhbUVkaXRQbHVnaW4oKTsKLQotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRWRpdFBsdWdpbigpIHsKLQkJc3VwZXIKLQkJICAobmV3IFJlc291cmNlTG9jYXRvciBbXSB7Ci0JCSAgICAgVW1hRWRpdFBsdWdpbi5JTlNUQU5DRSwKLQkJICAgfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCi0JCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotCQkJLy8KLQkJCXBsdWdpbiA9IHRoaXM7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2NjExOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpYWdyYW0uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlhZ3JhbSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoRGlhZ3JhbSlvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2JlYzIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0xpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBMaW5rSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmt9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtJdGVtUHJvdmlkZXIKLQlleHRlbmRzIExpbmtlZE9iamVjdEl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRhcmdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQmVuZHBvaW50c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU291cmNlRW5kUG9pbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRhcmdldEVuZFBvaW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX0xpbmtfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaW5rX25hbWVfZmVhdHVyZSIsICJfVUlfTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LX19OQU1FLAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9MaW5rX3RhcmdldF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaW5rX3RhcmdldF9mZWF0dXJlIiwgIl9VSV9MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktfX1RBUkdFVCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIHRydWUsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQmVuZHBvaW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJlbmRwb2ludHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9MaW5rX2JlbmRwb2ludHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua19iZW5kcG9pbnRzX2ZlYXR1cmUiLCAiX1VJX0xpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTElOS19fQkVORFBPSU5UUywKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU291cmNlIEVuZCBQb2ludCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNvdXJjZUVuZFBvaW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTGlua19zb3VyY2VFbmRQb2ludF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaW5rX3NvdXJjZUVuZFBvaW50X2ZlYXR1cmUiLCAiX1VJX0xpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTElOS19fU09VUkNFX0VORF9QT0lOVCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFyZ2V0IEVuZCBQb2ludCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhcmdldEVuZFBvaW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTGlua190YXJnZXRFbmRQb2ludF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaW5rX3RhcmdldEVuZFBvaW50X2ZlYXR1cmUiLCAiX1VJX0xpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTElOS19fVEFSR0VUX0VORF9QT0lOVCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTGluay5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9MaW5rIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKExpbmspb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfTGlua190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9MaW5rX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChMaW5rLmNsYXNzKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fTkFNRToKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9MaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0xpbmtlZE9iamVjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGVjODIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0xpbmtlZE9iamVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IExpbmtlZE9iamVjdEl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIKLQlleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua2VkT2JqZWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZExpbmtlZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExpbmtlZCBFbGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua2VkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX0xpbmtlZE9iamVjdF9saW5rZWRFbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xpbmtlZE9iamVjdF9saW5rZWRFbGVtZW50X2ZlYXR1cmUiLCAiX1VJX0xpbmtlZE9iamVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIHRydWUsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9MaW5rZWRPYmplY3RfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL01vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL01vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4M2M2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5Nb2RlbEFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KLSAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2RlbEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1JdGVtUHJvdmlkZXIgZGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaWFncmFtQWRhcHRlcigpIHsKLQkJaWYgKGRpYWdyYW1JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlhZ3JhbUl0ZW1Qcm92aWRlciA9IG5ldyBEaWFncmFtSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRpYWdyYW1JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpbmtJdGVtUHJvdmlkZXIgbGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMaW5rQWRhcHRlcigpIHsKLQkJaWYgKGxpbmtJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbGlua0l0ZW1Qcm92aWRlciA9IG5ldyBMaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGxpbmtJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWROb2RlSXRlbVByb3ZpZGVyIG5hbWVkTm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVkTm9kZUFkYXB0ZXIoKSB7Ci0JCWlmIChuYW1lZE5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbmFtZWROb2RlSXRlbVByb3ZpZGVyID0gbmV3IE5hbWVkTm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBuYW1lZE5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW19IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyIGFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCWlmIChhY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHlwZWROb2RlSXRlbVByb3ZpZGVyIHR5cGVkTm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR5cGVkTm9kZUFkYXB0ZXIoKSB7Ci0JCWlmICh0eXBlZE5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdHlwZWROb2RlSXRlbVByb3ZpZGVyID0gbmV3IFR5cGVkTm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0eXBlZE5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZUFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW19IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlTm9kZUl0ZW1Qcm92aWRlciByb2xlTm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZU5vZGVBZGFwdGVyKCkgewotCQlpZiAocm9sZU5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZU5vZGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZU5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZU5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlciByb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGVBZGFwdGVyKCkgewotCQlpZiAocm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrTm9kZUl0ZW1Qcm92aWRlciB0YXNrTm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza05vZGVBZGFwdGVyKCkgewotCQlpZiAodGFza05vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza05vZGVJdGVtUHJvdmlkZXIgPSBuZXcgVGFza05vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFza05vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyIHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGVBZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkaWFncmFtSXRlbVByb3ZpZGVyICE9IG51bGwpIGRpYWdyYW1JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobGlua0l0ZW1Qcm92aWRlciAhPSBudWxsKSBsaW5rSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG5hbWVkTm9kZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBuYW1lZE5vZGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoYWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyICE9IG51bGwpIGFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0eXBlZE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgdHlwZWROb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIgIT0gbnVsbCkgd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgd29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlciAhPSBudWxsKSBhY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZU5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcm9sZU5vZGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGFza05vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgdGFza05vZGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgd29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTmFtZWROb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9OYW1lZE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmNzY1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9OYW1lZE5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOYW1lZE5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkTm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9OYW1lZE5vZGVfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9OYW1lZE5vZGVfbmFtZV9mZWF0dXJlIiwgIl9VSV9OYW1lZE5vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfTk9ERV9fTkFNRSwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTmFtZWROb2RlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L05hbWVkTm9kZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChOYW1lZE5vZGUpb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfTmFtZWROb2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX05hbWVkTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTmFtZWROb2RlLmNsYXNzKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Ob2RlQ29udGFpbmVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Ob2RlQ29udGFpbmVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDliMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE5vZGVDb250YWluZXJJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlQ29udGFpbmVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlQb2ludCBsYWJlbFZhbHVlID0gKChOb2RlQ29udGFpbmVyKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Ob2RlQ29udGFpbmVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX05vZGVDb250YWluZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE5vZGVDb250YWluZXIuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5hbWVkTm9kZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdE5vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlTm9kZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Ob2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Ob2RlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YTNjZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIExpbmtlZE9iamVjdEl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZExvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXaWR0aFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGVpZ2h0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZWFkT25seVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTG9jYXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX05vZGVfbG9jYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZV9sb2NhdGlvbl9mZWF0dXJlIiwgIl9VSV9Ob2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfX0xPQ0FUSU9OLAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXaWR0aCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdpZHRoUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTm9kZV93aWR0aF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Ob2RlX3dpZHRoX2ZlYXR1cmUiLCAiX1VJX05vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9fV0lEVEgsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIZWlnaHQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIZWlnaHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Ob2RlX2hlaWdodF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Ob2RlX2hlaWdodF9mZWF0dXJlIiwgIl9VSV9Ob2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfX0hFSUdIVCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY29taW5nIENvbm5lY3Rpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5jb21pbmdDb25uZWN0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX05vZGVfaW5jb21pbmdDb25uZWN0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Ob2RlX2luY29taW5nQ29ubmVjdGlvbnNfZmVhdHVyZSIsICJfVUlfTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIHRydWUsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVhZCBPbmx5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVhZE9ubHlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Ob2RlX3JlYWRPbmx5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX05vZGVfcmVhZE9ubHlfZmVhdHVyZSIsICJfVUlfTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX19SRUFEX09OTFksCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVBvaW50IGxhYmVsVmFsdWUgPSAoKE5vZGUpb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX05vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1JvbGVOb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Sb2xlTm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU3NGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1JvbGVOb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZU5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTmFtZWROb2RlSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGVOb2RlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVOb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVOb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1JvbGVOb2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX1JvbGVOb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvUm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjgyNGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvUm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBOb2RlQ29udGFpbmVySXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJvd0luZGV4UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb3cgSW5kZXggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb3dJbmRleFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX1JvbGVUYXNrQ29tcG9zaXRlX3Jvd0luZGV4X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVUYXNrQ29tcG9zaXRlX3Jvd0luZGV4X2ZlYXR1cmUiLCAiX1VJX1JvbGVUYXNrQ29tcG9zaXRlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGVUYXNrQ29tcG9zaXRlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVUYXNrQ29tcG9zaXRlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlQb2ludCBsYWJlbFZhbHVlID0gKChSb2xlVGFza0NvbXBvc2l0ZSlvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVRhc2tDb21wb3NpdGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVRhc2tDb21wb3NpdGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVUYXNrQ29tcG9zaXRlLmNsYXNzKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1Rhc2tOb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UYXNrTm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTI3OWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1Rhc2tOb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza05vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBOYW1lZE5vZGVJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza05vZGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSW5kZXhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluZGV4IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5kZXhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9UYXNrTm9kZV9pbmRleF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrTm9kZV9pbmRleF9mZWF0dXJlIiwgIl9VSV9UYXNrTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5UQVNLX05PREVfX0lOREVYLAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFza05vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFza05vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGFza05vZGUpb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfVGFza05vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfVGFza05vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhc2tOb2RlLmNsYXNzKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWDoKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UeXBlZE5vZGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1R5cGVkTm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGEyMjYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1R5cGVkTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFR5cGVkTm9kZUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFR5cGVkTm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUeXBlZE5vZGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9UeXBlZE5vZGVfdHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UeXBlZE5vZGVfdHlwZV9mZWF0dXJlIiwgIl9VSV9UeXBlZE5vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuVFlQRURfTk9ERV9fVFlQRSwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFR5cGVkTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UeXBlZE5vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVBvaW50IGxhYmVsVmFsdWUgPSAoKFR5cGVkTm9kZSlvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfVHlwZWROb2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX1R5cGVkTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVHlwZWROb2RlLmNsYXNzKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTU0ODdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBOYW1lZE5vZGVJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmZDc3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBOb2RlQ29udGFpbmVySXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RDb21wb3NpdGVfdHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0Q29tcG9zaXRlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEUsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrUHJvZHVjdENvbXBvc2l0ZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoV29ya1Byb2R1Y3RDb21wb3NpdGUpb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0Q29tcG9zaXRlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0Q29tcG9zaXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdENvbXBvc2l0ZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDk0NWI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBEaWFncmFtSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlQb2ludCBsYWJlbFZhbHVlID0gKChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzM2E0NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTmFtZWROb2RlSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3NjY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTmFtZWROb2RlSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0Tm9kZV90eXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0Tm9kZV90eXBlX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0Tm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRSwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0Tm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdE5vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya1Byb2R1Y3ROb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0Tm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0Tm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWRmMTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjYWUwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRyYXcyZCwKLSBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24sCi0gb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmUzY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLnByb2plY3QsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZmE0ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1vZGVsIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMaW5rIiBlU3VwZXJUeXBlcz0iIy8vTGlua2VkT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgZVR5cGU9IiMvL05vZGUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgZVR5cGU9IiMvL05vZGUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vTm9kZS9pbmNvbWluZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJlbmRwb2ludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQWJzb2x1dGVCZW5kcG9pbnQiIHRyYW5zaWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2VFbmRQb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0RW5kUG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxpbmtlZE9iamVjdCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rZWRFbGVtZW50IiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZE5vZGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOb2RlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0xpbmtlZE9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jb21pbmdDb25uZWN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9MaW5rIiBlT3Bwb3NpdGU9IiMvL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGdvaW5nQ29ubmVjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTGluayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZU9wcG9zaXRlPSIjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFkT25seSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGVkTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3ROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b0xheW91dCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTm9kZUNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibm9kZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTm9kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVUYXNrQ29tcG9zaXRlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZUNvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvd0luZGV4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5kZXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFic29sdXRlQmVuZHBvaW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUG9pbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5N2QzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYyIgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiCi0gICAgbW9kZWxOYW1lPSJEaWFncmFtIiBub25OTFNNYXJrZXJzPSJ0cnVlIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuamF2YSIKLSAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5nZW5tb2RlbCMvL3VtYSI+Ci0gIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1vZGVsIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9ImRpYWdyYW0uZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJkaWFncmFtLmVjb3JlIy8vQWJzb2x1dGVCZW5kcG9pbnQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImRpYWdyYW0uZWNvcmUjLy9Qb2ludCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iZGlhZ3JhbS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0RpYWdyYW0iIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvTm9kZS9sb2NhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9MaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL2JlbmRwb2ludHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2VFbmRQb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldEVuZFBvaW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0xpbmtlZE9iamVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL0xpbmtlZE9iamVjdC9saW5rZWRFbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Ob2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTm9kZS9sb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL3dpZHRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvaGVpZ2h0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL05vZGUvaW5jb21pbmdDb25uZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvcmVhZE9ubHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGlhZ3JhbSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9UeXBlZE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9UeXBlZE5vZGUvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vQWN0aXZpdHlEZXRhaWxEaWFncmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vQWN0aXZpdHlEZXRhaWxEaWFncmFtL2F1dG9MYXlvdXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlTm9kZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlVGFza0NvbXBvc2l0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL1JvbGVUYXNrQ29tcG9zaXRlL3Jvd0luZGV4Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9UYXNrTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL1Rhc2tOb2RlL2luZGV4Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Q29tcG9zaXRlL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMzMwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBNb2RlbAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2ExZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlIiAvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5kaWFncmFtTWFuYWdlciI+Ci0gICAgIDxkaWFncmFtTWFuYWdlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtTWFuYWdlciIvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURldGFpbERpYWdyYW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURldGFpbERpYWdyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyNDc3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtIG1vZGVsIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBleHRlbmRzIERpYWdyYW0gewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0byBMYXlvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF1dG8gTGF5b3V0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gTGF5b3V0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdXRvTGF5b3V0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UjZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtX0F1dG9MYXlvdXQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXV0b0xheW91dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtI2lzQXV0b0xheW91dCA8ZW0+QXV0byBMYXlvdXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gTGF5b3V0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0F1dG9MYXlvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dG9MYXlvdXQoYm9vbGVhbiB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURpYWdyYW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURpYWdyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyYjAzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGFjdGl2aXR5IGRpYWdyYW0gbW9kZWwgb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpdml0eURpYWdyYW0gZXh0ZW5kcyBEaWFncmFtIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2VjZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLQotLyoqCi0gKiBCYXNlIGRpYWdyYW0gaW50ZXJmYWNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBEaWFncmFtIGV4dGVuZHMgTm9kZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVTUEgbW9kZWwgb2JqZWN0IGZvciB0aGlzIGRpYWdyYW0KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGdldFVNQURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgZGVmYXVsdCBuYW1lIGZvciBuZXcgbm9kZQotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0TmFtZShOYW1lZE5vZGUgbmV3Tm9kZSk7Ci0KLQkvKioKLQkgKiBTZXRzIGEgc3VwcHJlc3Npb24gaW5zdGFuY2UgZm9yIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBzdXBwcmVzc2lvbgotCSAqLwotCXZvaWQgc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3Npb24gaW5zdGFuY2UgdXNlZCBpbiB0aGlzIGRpYWdyYW0KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFNldHMgZmlsdGVyIHVzZWQgdG8gdG8gZmlsdGVyIGRpYWdyYW0gZWxlbWVudHMgaW4gdGhpcyBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqLwotCXZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIGRpYWdyYW0gaXMgbmV3bHkgY3JlYXRlZCBhbmQgbm90IHNhdmVkIHlldCkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc05ldygpOwotCi0JLyoqCi0JICogU2V0cyBvciB1bnNldHMgdGhlIGlzTmV3IGZsYWcgb2YgdGhpcyBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIG4KLQkgKiBAc2VlICNpc05ldygpCi0JICovCi0Jdm9pZCBzZXROZXcoYm9vbGVhbiBuKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvRGlhZ3JhbVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW1SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkNTA3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvRGlhZ3JhbVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UgY2xhc3Mgb2YgZGlhZ3JhbSBwbHVnaW4KLSAqIAotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1SZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEaWFncmFtUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlX2FjdGl2aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRCYXNlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlX1dQRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlX2FjdGl2aXR5RGV0YWlsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEZyZWVUeHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV91bmtub3duOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRGlhZ3JhbVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmY2N2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgbW9kZWwgb2JqZWN0IGZvciBhIGxpbmsgYmV0d2VlbiBkaWFncmFtIG5vZGVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBMaW5rIGV4dGVuZHMgTGlua2VkT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRMaW5rX05hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBub2RlIG9mIHRoaXMgbGluay4KLQkgKiAKLQkgKiBAbW9kZWwKLQkgKi8KLQlOb2RlIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShOb2RlIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHRhcmdldCBub2RlIG9mIHRoaXMgbGluawotCSAqIAotCSAqIEBtb2RlbAotCSAqLwotCU5vZGUgZ2V0VGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYXJnZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhcmdldChOb2RlIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgYmVuZCBwb2ludHMgaW4gdGhpcyBsaW5rCi0JICogCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCIgbG93ZXI9IjAiIHRyYW5zaWVudD0idHJ1ZSIKLQkgKi8KLQlFTGlzdDxBYnNvbHV0ZUJlbmRwb2ludD4gZ2V0QmVuZHBvaW50cygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZW5kIHBvaW50IG9mIHRoaXMgbGluayBpbiB0aGUgc291cmNlIG5vZGUKLQkgKiAKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqIEByZXR1cm4KLQkgKi8KLQlQb2ludCBnZXRTb3VyY2VFbmRQb2ludCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2VFbmRQb2ludCA8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNvdXJjZUVuZFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTb3VyY2VFbmRQb2ludChQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbmQgcG9pbnQgb2YgdGhpcyBsaW5rIGluIHRhcmdldCBub2RlCi0JICogCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAcmV0dXJuCi0JICovCi0JUG9pbnQgZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0RW5kUG9pbnQgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFyZ2V0RW5kUG9pbnQoUG9pbnQgdmFsdWUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmtlZE9iamVjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmtlZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM5MjZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rZWRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgb2JqZWN0cyB0aGF0IGlzIGxpbmtlZCB3aXRoIG90aGVyIG9iamVjdCBpbiBhCi0gKiBkaWZmZXJlbmNlIG1vZGVsCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlua2VkT2JqZWN0IGV4dGVuZHMgRU9iamVjdCB7Ci0KLQlPYmplY3QgZ2V0T2JqZWN0KCk7Ci0KLQl2b2lkIHNldE9iamVjdChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogQG1vZGVsCi0JICovCi0JTWV0aG9kRWxlbWVudCBnZXRMaW5rZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QjZ2V0TGlua2VkRWxlbWVudCA8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmtlZCBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRMaW5rZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOGY5ZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE1vZGVsRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBEaWFncmFtIGNyZWF0ZURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTGluayBjcmVhdGVMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE5hbWVkTm9kZSBjcmVhdGVOYW1lZE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgQWN0aXZpdHlEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UeXBlZCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UeXBlZCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBUeXBlZE5vZGUgY3JlYXRlVHlwZWROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0Tm9kZSBjcmVhdGVXb3JrUHJvZHVjdE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3Rpdml0eURldGFpbERpYWdyYW0gY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlTm9kZSBjcmVhdGVSb2xlTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza05vZGUgY3JlYXRlVGFza05vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0Q29tcG9zaXRlIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE1vZGVsUGFja2FnZSBnZXRNb2RlbFBhY2thZ2UoKTsKLQotfSAvL01vZGVsRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYwYWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOQU1FID0gIm1vZGVsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTW9kZWxQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwgPGVtPk5vZGUgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlQ29udGFpbmVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE5vZGVDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVIgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rZWRPYmplY3RJbXBsIDxlbT5MaW5rZWQgT2JqZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rZWRPYmplY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TGlua2VkT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IExJTktFRF9PQkpFQ1QgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsIDxlbT5EaWFncmFtPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgRElBR1JBTSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwgPGVtPkxpbms8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBMSU5LID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCA8ZW0+Tm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IE5PREUgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwgPGVtPk5hbWVkIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXROYW1lZE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEaWFncmFtSW1wbCA8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEaWFncmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBBQ1RJVklUWV9ESUFHUkFNID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UeXBlZE5vZGVJbXBsIDxlbT5UeXBlZCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UeXBlZE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VHlwZWROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREUgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3ROb2RlSW1wbCA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREUgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNID0gOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlTm9kZUltcGwgPGVtPlJvbGUgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZU5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZU5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlVGFza0NvbXBvc2l0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlVGFza0NvbXBvc2l0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVGFza05vZGVJbXBsIDxlbT5UYXNrIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFRhc2tOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0tfTk9ERSA9IDEzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfX0xJTktFRF9FTEVNRU5UID0gTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX19MT0NBVElPTiA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX19XSURUSCA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fSEVJR0hUID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9fUkVBRF9PTkxZID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ob2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5PREVfRkVBVFVSRV9DT1VOVCA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQgPSBOT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19MT0NBVElPTiA9IE5PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX1dJRFRIID0gTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX0hFSUdIVCA9IE5PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19SRUFEX09OTFkgPSBOT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19OT0RFUyA9IE5PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IE5PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IE5PREVfQ09OVEFJTkVSX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0xPQ0FUSU9OID0gTk9ERV9DT05UQUlORVJfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fV0lEVEggPSBOT0RFX0NPTlRBSU5FUl9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fSEVJR0hUID0gTk9ERV9DT05UQUlORVJfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBOT0RFX0NPTlRBSU5FUl9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9DT05UQUlORVJfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1JFQURfT05MWSA9IE5PREVfQ09OVEFJTkVSX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IERJQUdSQU1fX05PREVTID0gTk9ERV9DT05UQUlORVJfX05PREVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgRElBR1JBTV9GRUFUVVJFX0NPVU5UID0gTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LX19MSU5LRURfRUxFTUVOVCA9IExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LX19OQU1FID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS19fU09VUkNFID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBMSU5LX19UQVJHRVQgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlbmRwb2ludHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktfX0JFTkRQT0lOVFMgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZSBFbmQgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LX19TT1VSQ0VfRU5EX1BPSU5UID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS19fVEFSR0VUX0VORF9QT0lOVCA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBMSU5LX0ZFQVRVUkVfQ09VTlQgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBOT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX0xPQ0FUSU9OID0gTk9ERV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19XSURUSCA9IE5PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX0hFSUdIVCA9IE5PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBOT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9OT0RFX19SRUFEX09OTFkgPSBOT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX05BTUUgPSBOT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5hbWVkIE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UID0gTk9ERV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX0xJTktFRF9FTEVNRU5UID0gRElBR1JBTV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19MT0NBVElPTiA9IERJQUdSQU1fX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fV0lEVEggPSBESUFHUkFNX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19IRUlHSFQgPSBESUFHUkFNX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fUkVBRF9PTkxZID0gRElBR1JBTV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBBQ1RJVklUWV9ESUFHUkFNX19OT0RFUyA9IERJQUdSQU1fX05PREVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQUNUSVZJVFlfRElBR1JBTV9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRZUEVEX05PREVfX0xJTktFRF9FTEVNRU5UID0gTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19MT0NBVElPTiA9IE5PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fV0lEVEggPSBOT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19IRUlHSFQgPSBOT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFlQRURfTk9ERV9fUkVBRF9PTkxZID0gTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19UWVBFID0gTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UeXBlZCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREVfRkVBVFVSRV9DT1VOVCA9IE5PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IERJQUdSQU1fX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fTE9DQVRJT04gPSBESUFHUkFNX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX1dJRFRIID0gRElBR1JBTV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fSEVJR0hUID0gRElBR1JBTV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IERJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IERJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX1JFQURfT05MWSA9IERJQUdSQU1fX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fTk9ERVMgPSBESUFHUkFNX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBOQU1FRF9OT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19MT0NBVElPTiA9IE5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX1dJRFRIID0gTkFNRURfTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX0hFSUdIVCA9IE5BTUVEX05PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19SRUFEX09OTFkgPSBOQU1FRF9OT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19OQU1FID0gTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX1RZUEUgPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0xJTktFRF9FTEVNRU5UID0gRElBR1JBTV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fTE9DQVRJT04gPSBESUFHUkFNX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19XSURUSCA9IERJQUdSQU1fX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19IRUlHSFQgPSBESUFHUkFNX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IERJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fUkVBRF9PTkxZID0gRElBR1JBTV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fTk9ERVMgPSBESUFHUkFNX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRvIExheW91dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVCA9IERJQUdSQU1fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX0xJTktFRF9FTEVNRU5UID0gTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX0xPQ0FUSU9OID0gTkFNRURfTk9ERV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX1dJRFRIID0gTkFNRURfTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19IRUlHSFQgPSBOQU1FRF9OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fUkVBRF9PTkxZID0gTkFNRURfTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX05BTUUgPSBOQU1FRF9OT0RFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19MSU5LRURfRUxFTUVOVCA9IE5PREVfQ09OVEFJTkVSX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX0xPQ0FUSU9OID0gTk9ERV9DT05UQUlORVJfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fV0lEVEggPSBOT0RFX0NPTlRBSU5FUl9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fSEVJR0hUID0gTk9ERV9DT05UQUlORVJfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBOT0RFX0NPTlRBSU5FUl9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9DT05UQUlORVJfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX1JFQURfT05MWSA9IE5PREVfQ09OVEFJTkVSX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX05PREVTID0gTk9ERV9DT05UQUlORVJfX05PREVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdyBJbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWCA9IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9GRUFUVVJFX0NPVU5UID0gTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX0xJTktFRF9FTEVNRU5UID0gTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX0xPQ0FUSU9OID0gTkFNRURfTk9ERV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX1dJRFRIID0gTkFNRURfTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19IRUlHSFQgPSBOQU1FRF9OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fUkVBRF9PTkxZID0gTkFNRURfTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX05BTUUgPSBOQU1FRF9OT0RFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19JTkRFWCA9IE5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9GRUFUVVJFX0NPVU5UID0gTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX0xJTktFRF9FTEVNRU5UID0gTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19MT0NBVElPTiA9IE5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fV0lEVEggPSBOQU1FRF9OT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19IRUlHSFQgPSBOQU1FRF9OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fUkVBRF9PTkxZID0gTkFNRURfTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19OQU1FID0gTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19MT0NBVElPTiA9IE5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19XSURUSCA9IE5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fSEVJR0hUID0gTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX1JFQURfT05MWSA9IE5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19OQU1FID0gTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCA8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fTElOS0VEX0VMRU1FTlQgPSBOT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19MT0NBVElPTiA9IE5PREVfQ09OVEFJTkVSX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX1dJRFRIID0gTk9ERV9DT05UQUlORVJfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX0hFSUdIVCA9IE5PREVfQ09OVEFJTkVSX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5PREVfQ09OVEFJTkVSX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19SRUFEX09OTFkgPSBOT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19OT0RFUyA9IE5PREVfQ09OVEFJTkVSX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRSA9IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9GRUFUVVJFX0NPVU5UID0gTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFic29sdXRlIEJlbmRwb2ludDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFic29sdXRlQmVuZHBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IEFCU09MVVRFX0JFTkRQT0lOVCA9IDE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Qb2ludDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFBPSU5UID0gMTg7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUiA9IDE5OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rIDxlbT5MaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpbmtfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Tb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFNvdXJjZSgpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0TGlua19Tb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRhcmdldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0KCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRMaW5rX1RhcmdldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0QmVuZHBvaW50cyA8ZW0+QmVuZHBvaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QmVuZHBvaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0QmVuZHBvaW50cygpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0TGlua19CZW5kcG9pbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlRW5kUG9pbnQgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGlua19Tb3VyY2VFbmRQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldEVuZFBvaW50IDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpbmtfVGFyZ2V0RW5kUG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MaW5rZWQgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRMaW5rZWRPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0I2dldExpbmtlZEVsZW1lbnQgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QjZ2V0TGlua2VkRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0TGlua2VkT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMaW5rZWRPYmplY3RfTGlua2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlIDxlbT5OYW1lZCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldE5hbWVkTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TmFtZWROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXROYW1lZE5vZGVfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSA8ZW0+Tm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ob2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9Mb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldpZHRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRXaWR0aCgpCi0JICogQHNlZSAjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9XaWR0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGVpZ2h0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRIZWlnaHQoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldE5vZGVfSGVpZ2h0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zIDxlbT5JbmNvbWluZyBDb25uZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldEluY29taW5nQ29ubmVjdGlvbnMoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFUmVmZXJlbmNlIGdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucyA8ZW0+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNpc1JlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFkIE9ubHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2lzUmVhZE9ubHkoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE5vZGVfUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRBY3Rpdml0eURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSA8ZW0+VHlwZWQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UeXBlZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRUeXBlZE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0VHlwZWROb2RlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZSA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdE5vZGVfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSNpc0F1dG9MYXlvdXQgPGVtPkF1dG8gTGF5b3V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0byBMYXlvdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0jaXNBdXRvTGF5b3V0KCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5vZGVDb250YWluZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyI2dldE5vZGVzIDxlbT5Ob2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Tm9kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyI2dldE5vZGVzKCkKLQkgKiBAc2VlICNnZXROb2RlQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXROb2RlQ29udGFpbmVyX05vZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZSA8ZW0+Um9sZSBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUgPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlVGFza0NvbXBvc2l0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZSNnZXRSb3dJbmRleCA8ZW0+Um93IEluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um93IEluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUjZ2V0Um93SW5kZXgoKQotCSAqIEBzZWUgI2dldFJvbGVUYXNrQ29tcG9zaXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUgPGVtPlRhc2sgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFza05vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5kZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZSNnZXRJbmRleCgpCi0JICogQHNlZSAjZ2V0VGFza05vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tOb2RlX0luZGV4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IDxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkFic29sdXRlIEJlbmRwb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVEYXRhVHlwZSBnZXRBYnNvbHV0ZUJlbmRwb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludCA8ZW0+UG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRURhdGFUeXBlIGdldFBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0RGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESUFHUkFNID0gZUlOU1RBTkNFLmdldERpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwgPGVtPkxpbms8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldExpbmsoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTElOSyA9IGVJTlNUQU5DRS5nZXRMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fTkFNRSA9IGVJTlNUQU5DRS5nZXRMaW5rX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMSU5LX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0TGlua19Tb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJTktfX1RBUkdFVCA9IGVJTlNUQU5DRS5nZXRMaW5rX1RhcmdldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVuZHBvaW50czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fQkVORFBPSU5UUyA9IGVJTlNUQU5DRS5nZXRMaW5rX0JlbmRwb2ludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZSBFbmQgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSU5LX19TT1VSQ0VfRU5EX1BPSU5UID0gZUlOU1RBTkNFLmdldExpbmtfU291cmNlRW5kUG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbmQgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSU5LX19UQVJHRVRfRU5EX1BPSU5UID0gZUlOU1RBTkNFLmdldExpbmtfVGFyZ2V0RW5kUG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRMaW5rZWRPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTElOS0VEX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRMaW5rZWRPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TGlua2VkT2JqZWN0X0xpbmtlZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbCA8ZW0+TmFtZWQgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXROYW1lZE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTkFNRURfTk9ERSA9IGVJTlNUQU5DRS5nZXROYW1lZE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOQU1FRF9OT0RFX19OQU1FID0gZUlOU1RBTkNFLmdldE5hbWVkTm9kZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsIDxlbT5Ob2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5PREUgPSBlSU5TVEFOQ0UuZ2V0Tm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOT0RFX19MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXROb2RlX0xvY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5PREVfX1dJRFRIID0gZUlOU1RBTkNFLmdldE5vZGVfV2lkdGgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5PREVfX0hFSUdIVCA9IGVJTlNUQU5DRS5nZXROb2RlX0hlaWdodCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gZUlOU1RBTkNFLmdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gZUlOU1RBTkNFLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTk9ERV9fUkVBRF9PTkxZID0gZUlOU1RBTkNFLmdldE5vZGVfUmVhZE9ubHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEaWFncmFtSW1wbCA8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEaWFncmFtSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURpYWdyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFlfRElBR1JBTSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbCA8ZW0+VHlwZWQgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRUeXBlZE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVFlQRURfTk9ERSA9IGVJTlNUQU5DRS5nZXRUeXBlZE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUWVBFRF9OT0RFX19UWVBFID0gZUlOU1RBTkNFLmdldFR5cGVkTm9kZV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdE5vZGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3ROb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX05PREUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3ROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX05PREVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3ROb2RlX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCA8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0byBMYXlvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtX0F1dG9MYXlvdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwgPGVtPk5vZGUgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlQ29udGFpbmVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXROb2RlQ29udGFpbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5PREVfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBOT0RFX0NPTlRBSU5FUl9fTk9ERVMgPSBlSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlTm9kZUltcGwgPGVtPlJvbGUgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZU5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVOb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfTk9ERSA9IGVJTlNUQU5DRS5nZXRSb2xlTm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlVGFza0NvbXBvc2l0ZUltcGwgPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVUYXNrQ29tcG9zaXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlVGFza0NvbXBvc2l0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1RBU0tfQ09NUE9TSVRFID0gZUlOU1RBTkNFLmdldFJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb3cgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVggPSBlSU5TVEFOQ0UuZ2V0Um9sZVRhc2tDb21wb3NpdGVfUm93SW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVGFza05vZGVJbXBsIDxlbT5UYXNrIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRUYXNrTm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLX05PREUgPSBlSU5TVEFOQ0UuZ2V0VGFza05vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19OT0RFX19JTkRFWCA9IGVJTlNUQU5DRS5nZXRUYXNrTm9kZV9JbmRleCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREUgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCA8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9DT01QT1NJVEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Q29tcG9zaXRlX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkFic29sdXRlIEJlbmRwb2ludDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBYnNvbHV0ZUJlbmRwb2ludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBBQlNPTFVURV9CRU5EUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlBvaW50PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFBvaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFBPSU5UID0gZUlOU1RBTkNFLmdldFBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFJPTEVfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JfQotCi19IC8vTW9kZWxQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTmFtZWROb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTmFtZWROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzNjZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05hbWVkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogQSBkaWFncmFtIG5vZGUgd2l0aCBuYW1lCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZE5vZGUgZXh0ZW5kcyBOb2RlIHsKLQkvKioKLQkgKiBHZXRzIG5vZGUgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBub2RlCi0JICogQG1vZGVsCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3Npb24gc3RhdHVzIG9mIHRoaXMgbm9kZQotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgc3VwcHJlc3NlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGlzU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgd3JhcHBlciBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgdGhhdCB0aGlzIG5vZGUgcmVwcmVzZW50cwotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdyYXBwZXIKLQkgKi8KLQlPYmplY3QgZ2V0V3JhcHBlcigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGEyYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLQotLyoqCi0gKiBUaGUgZGlhZ3JhbSBub2RlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZSBleHRlbmRzIExpbmtlZE9iamVjdCB7Ci0KLQkvKioKLQkgKiBHZXRzIGxvY2F0aW9uIG9mIHRoaXMgbm9kZQotCSAqIAotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICovCi0JUG9pbnQgZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEdldHMgd2lkdGgKLQkgKiAKLQkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiIHRyYW5zaWVudD0idHJ1ZSIKLQkgKi8KLQlpbnQgZ2V0V2lkdGgoKTsKLQotCS8qKgotCSAqIEdldHMgaGVpZ2h0Ci0JICogCi0JICogQHJldHVybiB0aGUgaGVpZ2h0Ci0JICogQG1vZGVsIGRlZmF1bHQ9Ii0xIiB0cmFuc2llbnQ9InRydWUiCi0JICovCi0JaW50IGdldEhlaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRIZWlnaHQgPGVtPkhlaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIZWlnaHQoaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXaWR0aChpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2F0aW9uKFBvaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgaW5jb21pbmcgbGlua3MKLQkgKiAKLQkgKiBAbW9kZWwgdHlwZT0iTGluayIgb3Bwb3NpdGU9InRhcmdldCIgbG93ZXI9IjAiCi0JICovCi0JRUxpc3Q8TGluaz4gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCi0JLyoqCi0JICogR2V0cyBvdXRnb2luZyBsaW5rcwotCSAqIAotCSAqIEBtb2RlbCB0eXBlPSJMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgb3Bwb3NpdGU9InNvdXJjZSIgbG93ZXI9IjAiCi0JICovCi0JRUxpc3Q8TGluaz4gZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgbm9kZSBpcyByZWFkLW9ubHkKLQkgKiAKLQkgKiBAbW9kZWwKLQkgKi8KLQlib29sZWFuIGlzUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjaXNSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1JlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFkT25seShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGRpYWdyYW0gb2YgdGhpcyBub2RlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCURpYWdyYW0gZ2V0RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogU2V0cyBkaWFncmFtIGZvciB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqLwotCXZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pOwotCi0JLyoqCi0JICogR2V0cyB0aGUgR3JhcGhOb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgbWV0aG9kIGVsZW1lbnQgYWRhcHRlci4gTWV0aG9kIGVsZW1lbnQgYWRhcHRlciBpcyBhIG5vZGUKLQkgKiBpbnRlcm5hbCB7QGxpbmsgQWRhcHRlciBhZGFwdGVyfSB0aGF0IGlzIGxpc3RlbmluZyBvbiBjaGFuZ2VzIG9mIGxpbmtlZAotCSAqIG1ldGhvZCBlbGVtZW50IG9yIGl0cyB3cmFwcGVyIHRvIHVwZGF0ZSB0aGUgbm9kZSBhY2NvcmRpbmdseS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYWRhcHRlciBvZiB0aGlzIG5vZGUKLQkgKi8KLQlDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBVTUEgZGlhZ3JhbSBmb3IgdGhlIG5ldyBub2RlIHNvIGl0IGNhbgotCSAqIGZpbmQgdGhlIEdyYXBoTm9kZSBmb3IgdGhlIGxpbmtlZCBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdW1hRGlhZ3JhbQotCSAqLwotCXZvaWQgc2V0VU1BRGlhZ3JhbShvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gdW1hRGlhZ3JhbSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBncmFwaCBub2RlIHRoYXQgaXMgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkgKiB7QGxpbmsgI2dldEdyYXBoTm9kZSgpIGxpbmtlZCBncmFwaCBub2RlfQotCSAqIAotCSAqIEBwYXJhbSB1bWFDb250YWluZXIKLQkgKi8KLQl2b2lkIHNldFVNQUNvbnRhaW5lcihHcmFwaE5vZGUgdW1hQ29udGFpbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnN1bWVyIHRvIHRoZSBjb25zdW1lciBsaXN0IG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uc3VtZXIKLQkgKi8KLQl2b2lkIGFkZENvbnN1bWVyKE9iamVjdCBjb25zdW1lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb25zdW1lciBmcm9tIHRoZSBjb25zdW1lciBsaXN0IG9mIHRoaXMgbm9kZS4gRGlzcG9zZXMKLQkgKiB0aGUgbm9kZSBpZiBpdCBkb2VzIG5vdCBoYXZlIGFueSBtb3JlIGNvbnN1bWVyIGFmdGVyIHRoaXMgY2FsbC4gRGlzcG9zaW5nCi0JICogYSBub2RlIHdpbGwgdGFrZSBjYXJlIG9mIHJlbW92aW5nIHRoaXMgbm9kZSdzIGxpc3RlbmVyIGZyb20gdGhlIFVNQQotCSAqIG9iamVjdCBhbmQgYWxsIHRoZSBhZGFwdGVycyB0aGF0IGhhZCBiZWVuIGFkZGVkIHRvIHRoZSBhZGFwdGVyIGxpc3Qgb2YKLQkgKiB0aGlzIG5vZGUuCi0JICogCi0JICogQHBhcmFtIGNvbnN1bWVyCi0JICovCi0Jdm9pZCByZW1vdmVDb25zdW1lcihPYmplY3QgY29uc3VtZXIpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05vZGVDb250YWluZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZGRmNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05vZGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIEEgY29tcG9zaXRlIG5vZGUgdGhhdCBjYW4gY29udGFpbiBjaGlsZCBub2RlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGVDb250YWluZXIgZXh0ZW5kcyBOb2RlIHsKLQkvKioKLQkgKiBHZXRzIGNoaWxkIG5vZGVzCi0JICogCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0eXBlPSJOb2RlIgotCSAqLwotCUVMaXN0PE5vZGU+IGdldE5vZGVzKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZWFlNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotdHlwZV9hY3Rpdml0eT1BY3Rpdml0eSBEaWFncmFtCi1kZWZhdWx0QmFzZU5hbWU9TmV3IHswfQotdHlwZV9XUEQ9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotdHlwZV9hY3Rpdml0eURldGFpbD1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotYWRkRnJlZVR4dD1BZGQgRnJlZSBUZXh0Ci10eXBlX3Vua25vd249VW5rbm93bgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUm9sZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhNDY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUm9sZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIE5vZGUgdGhhdCByZXByZXNlbnRzIGEgcm9sZSBpbiBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlTm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVUYXNrQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjM2ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVUYXNrQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBBIGNvbnRhaW5lciB0aGF0IGdyb3VwcyBhIFJvbGVOb2RlIGFuZCBUYXNrTm9kZXMgd2hvc2UgdGFza3MgdGhlIFJvbGUgcGVyZm9ybXMuCi0gKiBUaGUgbGlua2VkIG9iamVjdCBmb3IgUm9sZVRhc2tDb21wb3NpdGUgaXMgUm9sZURlc2NyaXB0b3IuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlVGFza0NvbXBvc2l0ZSBleHRlbmRzIE5vZGVDb250YWluZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdyBJbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um93IEluZGV4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdyBJbmRleDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um93SW5kZXgoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2dldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IGdldFJvd0luZGV4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZSNnZXRSb3dJbmRleCA8ZW0+Um93IEluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3cgSW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvd0luZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb3dJbmRleChpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVGFza05vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9UYXNrTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQxM2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9UYXNrTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogTm9kZSB0aGF0IHJlcHJlc2VudHMgYSB0YXNrIGluIGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tOb2RlIGV4dGVuZHMgTmFtZWROb2RlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ii0xIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5kZXgoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2dldFRhc2tOb2RlX0luZGV4KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluZGV4KGludCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9UeXBlZE5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9UeXBlZE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwZjRjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVHlwZWROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgaXMgbm90IGxpbmtlZCB0byBhbnkgbWV0aG9kIGVsZW1lbnQgKG5vdCBhIHtAbGluayBMaW5rZWRPYmplY3R9KS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVkTm9kZSBleHRlbmRzIE5vZGUgewotCXN0YXRpYyBmaW5hbCBpbnQgU1lOQ0hfQkFSID0gMTsKLQotCXN0YXRpYyBmaW5hbCBpbnQgREVDSVNJT04gPSAyOwotCi0Jc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDM7Ci0KLQlzdGF0aWMgZmluYWwgaW50IEVORCA9IDQ7Ci0KLQlzdGF0aWMgZmluYWwgaW50IFNUSUNLWV9OT1RFID0gNTsKLQotCXN0YXRpYyBmaW5hbCBpbnQgRlJFRV9URVhUID0gNjsKLQotCS8qKgotCSAqIEdldHMgdHlwZS4gVGhlIHR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMKLQkgKiBpbnRlcmZhY2UuCi0JICogCi0JICogQG1vZGVsCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNzE0ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0vKioKLSAqIE5vZGUgdGhhdCByZXByZXNlbnRzIGEge0BsaW5rIFdvcmtCcmVha2Rvd25FbGVtZW50fQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIGV4dGVuZHMgTmFtZWROb2RlIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxMjYxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIGdyb3VwIG9mIHtAbGluayBXb3JrUHJvZHVjdH0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdENvbXBvc2l0ZSBleHRlbmRzIE5vZGVDb250YWluZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRTID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVFBVVFMgPSAyOwotCi0JLyoqCi0JICogR2V0cyB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rICNJTlBVVFN9IG9yIHtAbGluayAjT1VUUFVUU30KLQkgKiBAbW9kZWwKLQkgKi8KLQlpbnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZGI4MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIG1vZGVsIG9mIHRoZSBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGV4dGVuZHMgRGlhZ3JhbSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ4MTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBOb2RlIGZvciBXb3JrUHJvZHVjdERlc2NyaXB0b3IgaW4gQWN0aXZpdHlEZXRhaWxEaWFncmFtLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkNGZhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0Tm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlRJRkFDVCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxJVkVSQUJMRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRDT01FID0gMzsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgcHJvZHVjdCB0eXBlIG9mIHRoaXMgbm9kZS4gVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKLQkgKiBmb2xsb3dpbmcgY29uc3RhbnRzOiB7QGxpbmsgI0FSVElGQUNUfSwge0BsaW5rICNERUxJVkVSQUJMRX0sIHtAbGluayAjT1VUQ09NRX0KLQkgKiAKLQkgKiBAbW9kZWwKLQkgKi8KLQlpbnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKGludCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhMmNlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCNpc0F1dG9MYXlvdXQgPGVtPkF1dG8gTGF5b3V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBleHRlbmRzIERpYWdyYW1JbXBsIGltcGxlbWVudHMKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTGF5b3V0KCkgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9MYXlvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVVRPX0xBWU9VVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTGF5b3V0KCkgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9MYXlvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9MYXlvdXQgPSBBVVRPX0xBWU9VVF9FREVGQVVMVDsKLQotCXByaXZhdGUgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpdml0eUFkYXB0ZXIKLQkJCWltcGxlbWVudHMgSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkvLyAqIEBzZWUKLQkJLy8gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbC5BY3Rpdml0eUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCS8vICovCi0JCS8vIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyBpZighbm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOwotCQkvLyBub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCS8vIHRyeSB7Ci0JCS8vIE9iamVjdCBvYmo7Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkvLyBjYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJLy8gcmVwb3B1bGF0ZURpYWdyYW0oKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBmaW5hbGx5IHsKLQkJLy8gbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfQotCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZGlhZ3JhbUNoYW5nZUxpc3RlbmVyID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXJldHVybiBpc0F1dG9MYXlvdXQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVDoKLQkJCQlzZXRBdXRvTGF5b3V0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJc2V0QXV0b0xheW91dChBVVRPX0xBWU9VVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJcmV0dXJuIGF1dG9MYXlvdXQgIT0gQVVUT19MQVlPVVRfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdXRvTGF5b3V0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF1dG9MYXlvdXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcHVsYXRlRGlhZ3JhbSgpIHsKLQkJLy8gY2xlYXIgZGlhZ3JhbQotCQkvLwotCi0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQgdW53YW50ZWQKLQkJLy8gY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlSW1wbCBub2RlID0gKChOb2RlSW1wbCkgZ2V0Tm9kZXMoKS5nZXQoaSkpOwotCQkJbm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRpb24gPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdGlvbi5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlcmF0aW9uLm5leHQoKTsKLQotCQkJLy8gY2xlYXIgYWxsIGxpbmtzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCX0KLQkJCW5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQl9Ci0KLQkJZ2V0Tm9kZXMoKS5jbGVhcigpOwotCi0JCXBvcHVsYXRlRGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b0xheW91dCgpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9UUlVFLmVxdWFscygKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRBdXRvTGF5b3V0RmxhZyh0aGlzKSk7Ci0JCX0KLQkJcmV0dXJuIGF1dG9MYXlvdXQ7Ci0JfQotCi0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9MYXlvdXQoYm9vbGVhbiBuZXdBdXRvTGF5b3V0KSB7Ci0JCWJvb2xlYW4gb2xkQXV0b0xheW91dCA9IGF1dG9MYXlvdXQ7Ci0JCWF1dG9MYXlvdXQgPSBuZXdBdXRvTGF5b3V0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VULCBvbGRBdXRvTGF5b3V0LCBhdXRvTGF5b3V0KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvU2V0QXV0b0xheW91dChib29sZWFuIG5ld0F1dG9MYXlvdXQpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eSh0aGlzLmdyYXBoTm9kZSwgCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVCwgCi0JCQkJCVN0cmluZy52YWx1ZU9mKG5ld0F1dG9MYXlvdXQpKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEF1dG9MYXlvdXQobmV3QXV0b0xheW91dCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRBbGxCcmVha2Rvd25FbGVtZW50cyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBicmVha2Rvd24gZWxlbWVudHMgb3IgdGhlaXIgd3JhcHBlcnMgZm9yIHRoZSBhY3Rpdml0eSBvZiB0aGlzCi0JICogZGlhZ3JhbQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlDb2xsZWN0aW9uIGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKGJvb2xlYW4gZmlsdGVyU3VwcHJlc3NlZCkgewotCQlBcnJheUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllczsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJSUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGFkYXB0ZXJGYWN0b3J5RmlsdGVyID0gKElBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyOwotCQkJYWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3JpZXMgPSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTOwotCQl9Ci0JCWlmICh3cmFwcGVyICE9IG51bGwpIHsKLQkJCUxpc3Qgd3JhcHBlcnMgPSBQcm9jZXNzVXRpbC5nZXRXcmFwcGVycyh3cmFwcGVyLCBhZGFwdGVyRmFjdG9yaWVzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHcgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJZXh0cmFjdENoaWxkcmVuKHcsIHcsIGJyZWFrZG93bkVsZW1lbnRzLCBmaWx0ZXJTdXBwcmVzc2VkKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQlpZiAoZ2V0T2JqZWN0KCkgIT0gbnVsbCkgewotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkuYWRhcHQoZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWV4dHJhY3RDaGlsZHJlbihhZGFwdGVyLCBnZXRPYmplY3QoKSwKLQkJCQkJCQkJYnJlYWtkb3duRWxlbWVudHMsIGZpbHRlclN1cHByZXNzZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBhZGQgZGVzY3JpcHRvcnMgb2Ygc3ViYXJ0aWZhY3RzCi0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IHdwYnNBZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXNbMl07Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KGJyZWFrZG93bkVsZW1lbnRzKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYod3AgaW5zdGFuY2VvZiBBcnRpZmFjdAotCQkJCQkJLy8gRklYTUU6IG5lZWQgdG8gdXNlZCByZWFsaXplZCBsaXN0IG9mIHN1YmFydGlmYWN0cyBhZnRlciBzaW1pbGFyIGZpeCBpcyBtYWRlIGluCi0JCQkJCQkvLyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKLQkJCQkJCS8vCi0JCQkJCQkmJiAhKChBcnRpZmFjdCl3cCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXNFbXB0eSgpIAotCQkJCSkgewotCQkJCQljb2xsZWN0U3ViYXJ0aWZhY3REZXNjcmlwdG9ycyhjaGlsZCwgZmlsdGVyU3VwcHJlc3NlZCwgYnJlYWtkb3duRWxlbWVudHMsIHdwYnNBZGFwdGVyRmFjdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RTdWJhcnRpZmFjdERlc2NyaXB0b3JzKE9iamVjdCBjaGlsZCwKLQkJCWJvb2xlYW4gZmlsdGVyU3VwcHJlc3NlZCwgQXJyYXlMaXN0PE9iamVjdD4gYnJlYWtkb3duRWxlbWVudHMsCi0JCQlBZGFwdGVyRmFjdG9yeSB3cGJzQWRhcHRlckZhY3RvcnkpIHsKLQkJLy8gZGlzYWJsZSByb2xsdXAgYmVmb3JlIGdldHRpbmcgdGhlIGNoaWxkcmVuCi0JCS8vCi0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJYWRhcHRlciA9IGl0ZW1Qcm92aWRlcjsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCWFkYXB0ZXIgPSBpdGVtUHJvdmlkZXI7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0KLQkJCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KAotCQkJCQl3cGJzQWRhcHRlckZhY3RvcnksIGNoaWxkLCBmYWxzZSk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKGZpbHRlclN1cHByZXNzZWQpIHsKLQkJCQkJaWYoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKG8pKSB7Ci0JCQkJCQlicmVha2Rvd25FbGVtZW50cy5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrZG93bkVsZW1lbnRzLmFkZChvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHJvbGxlZC11cCBmbGFnCi0JCQkvLwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3BvcHVsYXRlTm9kZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTm9kZXMoKSB7Ci0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCQlpZiAoYWN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJCS8vIHRvIHBvcHVsYXRlIHRoZSB0eXBlZG5vZGUuCi0JCQkJc3VwZXIucG9wdWxhdGVOb2RlcygpOwotCQkJfQotCi0JCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCQlmaWx0ZXIgPSAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVNbMF0pCi0JCQkJCQkuZ2V0RmlsdGVyKCk7Ci0JCQl9Ci0KLQkJCS8vIE5vZGUgbmV3Tm9kZSA9IG51bGw7Ci0JCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlDb2xsZWN0aW9uIGJyZWFrZG93bkVsZW1lbnRzID0gZ2V0QWxsQnJlYWtkb3duRWxlbWVudHModHJ1ZSk7Ci0JCQlDb2xsZWN0aW9uIHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCUxpc3QgZGVzYyA9IGRlc2NyaXB0b3IKLQkJCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZGVzYy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCXsKLQkJCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCQkJCi0JCQkJCQlpZiAocm9sZURlc2NyaXB0b3IgIT0gbnVsbAotCQkJCQkJCQkmJiBmaWx0ZXIuYWNjZXB0KHJvbGVEZXNjcmlwdG9yKQotCQkJCQkJCQkvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIGlmIHRoZSByb2xlIGRlc2NyaXB0b3IgaXMKLQkJCQkJCQkJLy8gaW5oZXJpdGVkIGFuZCBsb2NhbGx5IHN1cHByZXNzZWQKLQkJCQkJCQkJLy8gaWYgbG9jYWxseSBzdXBwcmVzc2VkLCBjaGVjayB0aGUgd3JhcHBlciBvZiB0aGUKLQkJCQkJCQkJLy8gcm9sZSBkZXNjcmlwdG9yCi0JCQkJCQkJCS8vCi0JCQkJCQkJCSYmICFyb2xlRGVzY3JpcHRvci5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkKLQkJCQkJCQkJJiYgIXJvbGVEZXNjcmlwdG9ycy5jb250YWlucyhyb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKHJvbGVEZXNjcmlwdG9yKTsKLQkJCQkJCQkvLyBuZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotCQkJCQkJCS8vIGlmKG5ld05vZGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iamVjdCkpIHsKLQkJCQkJCQkvLyAvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeQotCQkJCQkJCS8vIHBlcmZvcm1lciBpcyBub3QgbG9jYWwKLQkJCQkJCQkvLyAvLyBzZXQgcm9sZSBub2RlIG9mIHRoZSBSb2xlVGFza0NvbXBvc2l0ZSB0bwotCQkJCQkJCS8vIHJlYWQtb25seQotCQkJCQkJCS8vIC8vCi0JCQkJCQkJLy8gTm9kZSByb2xlTm9kZSA9IChOb2RlKQotCQkJCQkJCS8vICgoTm9kZUNvbnRhaW5lciluZXdOb2RlKS5nZXROb2RlcygpLmdldCgwKTsKLQkJCQkJCQkvLyByb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJLy8gbm9kZXMuYWRkKG5ld05vZGUpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQljcmVhdGVSb2xlVGFza0NvbXBvc2l0ZVJvd3Mocm9sZURlc2NyaXB0b3IsIG9iamVjdCwKLQkJCQkJCQkJCW5vZGVzKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChyb2xlRGVzY3JpcHRvcnMuY29udGFpbnMocm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoZGVzY3JpcHRvciwgbm9kZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc2VsZWN0Tm9kZXMobm9kZXMpOwotCQl9IGZpbmFsbHkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TnVtYmVyT2ZSb3dzKGludCB0b3RhbFRhc2tzLCBpbnQgdGFza3NQZXJSb3cpIHsKLQkJaW50IG4gPSB0b3RhbFRhc2tzIC8gdGFza3NQZXJSb3c7Ci0JCXJldHVybiAodGFza3NQZXJSb3cgKiBuKSA9PSB0b3RhbFRhc2tzID8gbiA6IG4gKyAxOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZVJvd3MoUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IsIAotICAgIAkJT2JqZWN0IG9iamVjdCwgTGlzdCBub2RlcykgewotICAgIAkKLSAgICAJaW50IHRhc2tzUGVyUm93ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXNrc1BlclJvdygpOwotICAgIAlMaXN0PD8+IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSAvL0Fzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotICAgIAkJZ2V0UmVhbGl6ZWRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjcmlwdG9yKTsKLSAgICAJaW50IHRvdGFsVGFza3MgPSBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLnNpemUoKTsKLSAgICAJCi0gICAgCWlmICh0YXNrc1BlclJvdyA+IDAgJiYgdG90YWxUYXNrcyA+IDAgJiYgdG90YWxUYXNrcyA+IHRhc2tzUGVyUm93Ci0JCQkJJiYgaXNBdXRvTGF5b3V0KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TnVtYmVyT2ZSb3dzKHRvdGFsVGFza3MsIHRhc2tzUGVyUm93KTsgaSsrKSB7Ci0JCQkJTm9kZSBuZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IsIGkpOwotCQkJCWlmIChuZXdOb2RlICE9IG51bGwpIHsKLQkJCQkJaWYgKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iamVjdCkpIHsKLQkJCQkJCS8vIHRhc2sgZGVzY3JpcHRvciBpcyBpbmhlcml0ZWQsIGl0cyBwcmltYXJ5IHBlcmZvcm1lcgotCQkJCQkJLy8gaXMgbm90IGxvY2FsCi0JCQkJCQkvLyBzZXQgcm9sZSBub2RlIG9mIHRoZSBSb2xlVGFza0NvbXBvc2l0ZSB0byByZWFkLW9ubHkKLQkJCQkJCS8vCi0JCQkJCQlMaXN0PE5vZGU+IG5vZHMgPSAoKE5vZGVDb250YWluZXIpIG5ld05vZGUpLmdldE5vZGVzKCk7Ci0JCQkJCQlpZiAoIW5vZHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTm9kZSByb2xlTm9kZSA9IChOb2RlKSBub2RzLmdldCgwKTsKLQkJCQkJCQlyb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJTm9kZSBuZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKG5ld05vZGUgIT0gbnVsbCkgewotCQkJCWlmIChQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmplY3QpKSB7Ci0JCQkJCS8vIHRhc2sgZGVzY3JpcHRvciBpcyBpbmhlcml0ZWQsIGl0cyBwcmltYXJ5IHBlcmZvcm1lciBpcwotCQkJCQkvLyBub3QgbG9jYWwKLQkJCQkJLy8gc2V0IHJvbGUgbm9kZSBvZiB0aGUgUm9sZVRhc2tDb21wb3NpdGUgdG8gcmVhZC1vbmx5Ci0JCQkJCS8vCi0JCQkJCUxpc3Q8Tm9kZT4gbm9kcyA9ICgoTm9kZUNvbnRhaW5lcikgbmV3Tm9kZSkuZ2V0Tm9kZXMoKTsKLQkJCQkJaWYgKCFub2RzLmlzRW1wdHkoKSkgewotCQkJCQkJTm9kZSByb2xlTm9kZSA9IChOb2RlKSBub2RzLmdldCgwKTsKLQkJCQkJCXJvbGVOb2RlLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJCX0KLQkJfQotICAgIAkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBjcmVhdGVOb2RlKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yKSB7Ci0JCU5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLQkJbm9kZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQlub2RlLnNldERpYWdyYW0odGhpcyk7Ci0JCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBjcmVhdGVOb2RlKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCU5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQlub2RlLnNldFVNQUNvbnRhaW5lcihnZXRHcmFwaE5vZGUoKSk7Ci0JCW5vZGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJbm9kZS5zZXRPYmplY3QoZGVzY3JpcHRvcik7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNwb3B1bGF0ZUxpbmtzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpbmtzKCkgewotCQlwb3B1bGF0ZUxpbmtzKGdldE5vZGVzKCksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdOb2RlcwotCSAqIEBwYXJhbSBkaXNhYmxlTm90aWZpY2F0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhDb2xsZWN0aW9uIG5ld05vZGVzLCBib29sZWFuIGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJLy8gZmlsbCBvdXRnb2luZy9pbmNvbWluZyBjb25uZWN0aW9uIGxpc3RzIG9mIGFsbCBub2RlcwotCQkvLwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlib29sZWFuW10gbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJdHJ5IHsKLQkJCWlmIChkaXNhYmxlTm90aWZpY2F0aW9uKQotCQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCQkJbm90aWZpZXNbaV0gPSBub2RlLmVEZWxpdmVyKCk7Ci0JCQkJCW5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBjaGlsZCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCQkvLyBXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrcHJvZHVjdENvbXBvc2l0ZSA9Ci0JCQkJCS8vIChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgY2hpbGQuZ2V0T2JqZWN0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtwcm9kdWN0Q29tcG9zaXRlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBjaGlsZDsKLQkJCQkJaWYgKHdvcmtwcm9kdWN0Q29tcG9zaXRlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSB3b3JrcHJvZHVjdENvbXBvc2l0ZS5nZXRPYmplY3QoKTsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJCW9iamVjdCwgVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCWlmKG5vZGUgIT0gbnVsbCAmJiBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRMaW5rKGNoaWxkLCBvYmplY3QpID09IG51bGwpIHsKLQkJCQkJCQkJTGluayBsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0JCQkJCQkJCWxpbmsuc2V0U291cmNlKGNoaWxkKTsKLQkJCQkJCQkJbGluay5zZXRUYXJnZXQobm9kZSk7Ci0JCQkJCQkJCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAod29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSB3b3JrcHJvZHVjdENvbXBvc2l0ZS5nZXRPYmplY3QoKTsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJCW9iamVjdCwgVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCWlmKG5vZGUgIT0gbnVsbCAmJiBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRMaW5rKG5vZGUsIG9iamVjdCkgPT0gbnVsbCkgewotCQkJCQkJCQlMaW5rIGxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJCQkJCQkJbGluay5zZXRTb3VyY2Uobm9kZSk7Ci0JCQkJCQkJCWxpbmsuc2V0VGFyZ2V0KGNoaWxkKTsKLQkJCQkJCQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5hZGRHcmFwaGljYWxEYXRhKGxpbmspOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotIAkJfSBmaW5hbGx5IHsKLQkJCWlmIChkaXNhYmxlTm90aWZpY2F0aW9uKQotCQkJCS8vIHJlc3RvcmUgbm90aWZpY2F0aW9uIGZsYWcKLQkJCQkvLwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCSgoRU9iamVjdCkgZ2V0Tm9kZXMoKS5nZXQoaSkpLmVTZXREZWxpdmVyKG5vdGlmaWVzW2ldKTsKLQkJCQl9Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIFJvbGVUYXNrQ29tcG9zaXRlIGRvQ3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IsIGludCBpbmRleCkgewotCQlSb2xlVGFza0NvbXBvc2l0ZSByb2xlVGFza0NvbXBvc2l0ZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCQkJUm9sZVRhc2tDb21wb3NpdGUgcnRjID0gKFJvbGVUYXNrQ29tcG9zaXRlKSBlbGVtZW50OwotCQkJCWlmKHJ0Yy5nZXRMaW5rZWRFbGVtZW50KCkgPT0gcm9sZURlc2NyaXB0b3IgJiYgcnRjLmdldFJvd0luZGV4KCkgPT0gaW5kZXgpIHsKLQkJCQkJcm9sZVRhc2tDb21wb3NpdGUgPSBydGM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyb2xlVGFza0NvbXBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlyb2xlVGFza0NvbXBvc2l0ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0JCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKAotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yLDApOwotCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXRPYmplY3Qocm9sZURlc2NyaXB0b3IpOwotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCQotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLCBpbnQgcm93SW5kZXgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yLCByb3dJbmRleCk7Ci0JCSgoUm9sZVRhc2tDb21wb3NpdGVJbXBsKXJvbGVUYXNrQ29tcG9zaXRlKS5zZXRSb3dJbmRleChyb3dJbmRleCk7Ci0JCXJvbGVUYXNrQ29tcG9zaXRlLnNldE9iamVjdChyb2xlRGVzY3JpcHRvcik7Ci0JCXJldHVybiByb2xlVGFza0NvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGUgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgaW50IHR5cGUpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya3Byb2R1Y3RDb21wb3NpdGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwYyA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgZWxlbWVudDsKLQkJCQlpZih3cGMuZ2V0TGlua2VkRWxlbWVudCgpID09IHRhc2tEZXNjcmlwdG9yICYmIHdwYy5nZXRUeXBlKCkgPT0gdHlwZSkgewkJCQkJCi0JCQkJCXdvcmtwcm9kdWN0Q29tcG9zaXRlID0gd3BjOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYod29ya3Byb2R1Y3RDb21wb3NpdGUgPT0gbnVsbCkgewotCQkJd29ya3Byb2R1Y3RDb21wb3NpdGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkuY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQkJCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFR5cGUodHlwZSk7Ci0JCX0KLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHdvcmtwcm9kdWN0Q29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNnZXRUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIElBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudFR5cGUoKQotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIERlc2NyaXB0b3IuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3RvTm9kZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlMaXN0IGxpc3QgPSAvL0Fzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJCQlnZXRSZWFsaXplZFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKWUpOwotCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCWNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKChUYXNrRGVzY3JpcHRvcikgb2JqLCBnZXROb2RlcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKChUYXNrRGVzY3JpcHRvcikgZSwgZ2V0Tm9kZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2FkZE5vZGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVNbMF0pCi0JCQkJCS5nZXRGaWx0ZXIoKTsKLQkJfQotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCUxpc3Q8Um9sZURlc2NyaXB0b3I+IGRlc2NMaXN0ID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJZmluZF9ub2RlOgotCQkJZm9yIChSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA6IGRlc2NMaXN0KQl7Ci0JCQkJaWYgKGZpbHRlci5hY2NlcHQocm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCW5vZGUgPSBmaW5kTm9kZSh0aGlzLCByb2xlRGVzY3JpcHRvcik7Ci0JCQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQkJCW5vZGUgPSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvcik7Ci0JCQkJCQlnZXROb2RlcygpLmFkZChub2RlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5vZGUgPSBzdXBlci5hZGROb2RlKGdldE5vZGVzKCksIG9iaik7Ci0JCQkJCX0KLQkJCQkJaWYobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlicmVhayBmaW5kX25vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlub2RlID0gc3VwZXIuYWRkTm9kZShnZXROb2RlcygpLCBvYmopOwotCQl9Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTGlua3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChub2RlKSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNhZGROb2RlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGROb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IHN1cGVyLmFkZE5vZGVzKGNvbGxlY3Rpb24pOwotCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJcG9wdWxhdGVMaW5rcyhub2RlcywgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjcmVtb3ZlRnJvbVVtYU1vZGVsKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVtYU1vZGVsKE5vZGUgcmVtb3ZlZE5vZGUpIHsKLQkJLy8gaWYgdGhlIHJlbW92ZWQgbm9kZSBpcyBhIFRhc2tOb2RlIHRoYXQgaGFkIGJlZW4gbW92ZWQgdG8gYQotCQkvLyBSb2xlVGFza0NvbXBvc2l0ZQotCQkvLyB0aGVuIGl0cyBUYXNrRGVzY3JpcHRvciB3aWxsIG5vdCBiZSByZW1vdmVkIGZyb20gbW9kZWwKLQkJLy8KLQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgcmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVtb3ZlZE5vZGUgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZQotCQkJCXx8IHJlbW92ZWROb2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVtYU1vZGVsKHJlbW92ZWROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsKLQkJc3VwZXIuYWRkVG9VbWFNb2RlbChwb3NpdGlvbiwgYWRkZWROb2RlKTsKLQotCQlpZiAoYWRkZWROb2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJCS8vIHRyYW5zbGF0ZSBOb2RlIGluZGV4IHRvIEFjdGl2aXR5IGluZGV4Ci0JCQlpbnQgaSA9IHRvQWN0aXZpdHlJbmRleChwb3NpdGlvbik7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJBY3Rpdml0eURldGFpbERpYWdyYW0uYWRkVG9VbWFNb2RlbCgpOiBXb3JrQnJlYWtkb3duRWxlbWVudCBpbmRleDogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaSA9PSAtMSkgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZCgoQnJlYWtkb3duRWxlbWVudCkgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGksIChCcmVha2Rvd25FbGVtZW50KSBhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGludCB0b0FjdGl2aXR5SW5kZXgoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiBpbmRleDsKLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJaW50IGkgPSBpbmRleCArIDE7Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKDsgIShub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgJiYgaSA8IHNpemU7IGkrKykgewotCQkJbm9kZSA9IChOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJfQotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlyZXR1cm4gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihub2RlLmdldE9iamVjdCgpKTsKLQotCX0KLQotCXB1YmxpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVMgPSB7CQkJCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgCi0JfTsgCi0JCi0JcHVibGljIHZvaWQgY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ29sbGVjdGlvbiBub2RlcykgewotCQlOb2RlIG5ld05vZGUgPSBudWxsOwotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpOwotCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQl9Ci0JCWlmICghZGVzY3JpcHRvci5nZXRPdXRwdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3NldE5ldyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIG4pIHsKLQkJc3VwZXIuc2V0TmV3KG4pOwotCQlpZihuKXsKLQkJCWRvU2V0QXV0b0xheW91dCh0cnVlKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQkvKioKLQkgKiBFbmFibGUgdGhpcyBjb2RlLCBvbmNlIHRoZSB0YXNrIGluZGV4IGlzIGZpeGVkIGluIHRoZSByb2xldGFza2NvbXBvc2l0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlTm9kZShPYmplY3QgbW92ZWRPYmplY3QsIGludCBwb3NpdGlvbiwgT2JqZWN0IG9sZFBvc2l0aW9uKSB7Ci0JCWlmKCEobW92ZWRPYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikpCi0JCQlyZXR1cm47Ci0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBtb3ZlZE9iamVjdDsKLQkJTGlzdDxSb2xlRGVzY3JpcHRvcj4gZGVzY0xpc3QgPSAoKFRhc2tEZXNjcmlwdG9yKSBtb3ZlZE9iamVjdCkKLQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJZmluZF9ub2RlOgotCQlmb3IgKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yIDogZGVzY0xpc3QpIHsKLQkJCWlmIChmaWx0ZXIuYWNjZXB0KHJvbGVEZXNjcmlwdG9yKSkgewotCQkJCU5vZGUgcm9sZU5vZGUgPSBmaW5kTm9kZSh0aGlzLCByb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJvbGVOb2RlICE9IG51bGwpIHsKLQkJCQkJaW50IG9sZFBvcyA9IDA7Ci0JCQkJCWlmIChvbGRQb3NpdGlvbiBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQkJCW9sZFBvcyA9ICgoSW50ZWdlcikgb2xkUG9zaXRpb24pLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpIEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkuZmluZE5vZGUoKE5vZGVDb250YWluZXIpIHJvbGVOb2RlLCB0YXNrRGVzY3JpcHRvciwKLQkJCQkJCQkJCVRhc2tOb2RlLmNsYXNzKTsKLQotCQkJCQkvLyBtb3ZlIHVwCi0JCQkJCWlmIChvbGRQb3MgPiBwb3NpdGlvbikgewotCQkJCQkJaW50IGkgPSB0YXNrTm9kZS5nZXRJbmRleCgpOwotCQkJCQkJTm9kZSBwcmV2Tm9kZSA9IGZpbmRUYXNrTm9kZSgKLQkJCQkJCQkJKFJvbGVUYXNrQ29tcG9zaXRlKSByb2xlTm9kZSwgaSAtIDEpOwotCQkJCQkJaWYgKHByZXZOb2RlICE9IG51bGwpIHsKLQkJCQkJCQl0YXNrTm9kZS5zZXRJbmRleChpIC0gMSk7Ci0JCQkJCQkJKChUYXNrTm9kZSkgcHJldk5vZGUpLnNldEluZGV4KGkpOwotCQkJCQkJfQotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBtb3ZlIGRvd24KLQkJCQkJCWludCBpID0gdGFza05vZGUuZ2V0SW5kZXgoKTsKLQkJCQkJCU5vZGUgbmV4dE5vZGUgPSBmaW5kVGFza05vZGUoCi0JCQkJCQkJCShSb2xlVGFza0NvbXBvc2l0ZSkgcm9sZU5vZGUsIGkgKyAxKTsKLQkJCQkJCWlmIChuZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJdGFza05vZGUuc2V0SW5kZXgoaSArIDEpOwotCQkJCQkJCSgoVGFza05vZGUpIG5leHROb2RlKS5zZXRJbmRleChpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJYnJlYWsgZmluZF9ub2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIE5vZGUgZmluZFRhc2tOb2RlKFJvbGVUYXNrQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGluZGV4KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tOb2RlKXsKLQkJCQlpZigoKFRhc2tOb2RlKWVsZW1lbnQpLmdldEluZGV4KCkgPT0gaW5kZXgpewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldFJlYWxpemVkUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByKXsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZihyICE9IG51bGwpewotCQkJTGlzdCBhY3R1YWxMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyKTsKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKHRydWUpOwotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWN0dWFsTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKGNvbGxlY3Rpb24sIGUpKXsKLQkJCQkJbGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLX0gLy8gQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEaWFncmFtSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTc2MTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1JbXBsIGV4dGVuZHMgRGlhZ3JhbUltcGwgaW1wbGVtZW50cyBBY3Rpdml0eURpYWdyYW0gewotCXByaXZhdGUgY2xhc3MgQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpdml0eUFkYXB0ZXIKLQkJCWltcGxlbWVudHMgSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQotCX07Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQlkaWFncmFtQ2hhbmdlTGlzdGVuZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIElBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfRElBR1JBTTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5vZGVzKCkgewotCQkvLyBBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oKTsKLQotCQkvLyBhZGQgVHlwZWROb2RlcwotCQkvLwotCQlMaXN0IHR5cGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaW50IHR5cGUgPSBnZXRUeXBlKGVsZW1lbnQpOwotCQkJaWYgKHR5cGUgPiAwKSB7Ci0JCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCW5vZGUuc2V0VHlwZSh0eXBlKTsKLQkJCQlub2RlLnNldE9iamVjdChlbGVtZW50KTsKLQkJCQl0eXBlZE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlnZXROb2RlcygpLmFkZEFsbCh0eXBlZE5vZGVzKTsKLQotCQkvLyBhZGQgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlcwotCQkvLwotCQlhZGRFbGVtZW50Tm9kZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXb3JrT3JkZXIoV29ya09yZGVyIHdvLCBPYmplY3QgcHJlZCkgewotCQlpZiAod28uZ2V0UHJlZCgpID09IHByZWQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHByZWQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBwcmVkOwotCQkJLy8gY2hlY2sgaWYgcHJlZGVjZXNzb3IgcmVmZXJlbmNlIGluIHRoZSBnaXZlbiB3b3JrIG9yZGVyIGlzIGJhc2Ugb2YKLQkJCS8vIHByZWQKLQkJCS8vCi0JCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IHZlICE9IG51bGw7IHZlID0gdmUKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCWlmICh2ZSA9PSB3by5nZXRQcmVkKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKExpbmsgbGluaykgewotCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBudWxsIHx8IGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbAotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0U291cmNlKCkpCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRUYXJnZXQoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpbmtzKCkgewotCQlzdXBlci5wb3B1bGF0ZUxpbmtzKCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBpbnZhbGlkIGxpbmtzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IG51bGw7Ci0JCQlpZiAobm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJd2JlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpOwotCQkJfQotCQkJQXJyYXlMaXN0IGxpbmtzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaW5rTGlzdFdhbGs6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlCi0JCQkJCS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQotCQkJCWlmICh3YmUgIT0gbnVsbCkgewotCQkJCQkvLyBUT0RPOiBuZWVkIHJldmlzaXQgdG8gY2hlY2sgdGhlIHZhbGlkIGNvbm5lY3Rpb24gZnJvbSBhCi0JCQkJCS8vIFR5cGVkTm9kZQotCQkJCQkvLwotCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkKLQkJCQkJCWNvbnRpbnVlIGxpbmtMaXN0V2FsazsKLQotCQkJCQlPYmplY3QgcHJlZCA9IGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCk7Ci0JCQkJCWJvb2xlYW4gd29ya09yZGVyRm91bmQgPSBmYWxzZTsKLQkJCQkJZmluZF9Xb3JrT3JkZXI6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gd2JlCi0JCQkJCQkJLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtPcmRlciB3byA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCQlpZiAoaXNWYWxpZFdvcmtPcmRlcih3bywgcHJlZCkpIHsKLQkJCQkJCQl3b3JrT3JkZXJGb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZmluZF9Xb3JrT3JkZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCF3b3JrT3JkZXJGb3VuZCkgewotCQkJCQkJLy8gaW52YWxpZCBsaW5rLCByZW1vdmUgaXQKLQkJCQkJCS8vCi0JCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmtzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJCX0KLQkJCWxpbmtzVG9SZW1vdmUuY2xlYXIoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoIWlzVmFsaWQobGluaykpIHsKLQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlua3NUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVMaW5rKGxpbmspOwotCQkJfQotCQkJbGlua3NUb1JlbW92ZS5jbGVhcigpOwotCQkJbGlua3NUb1JlbW92ZSA9IG51bGw7Ci0JCX0KLQotCQkvLyBDaGVjayB0aGUgbGlua3Mgb2YgZWFjaCBBY3Rpdml0eU5vZGUKLQkJLy8gc2V0IHRoZSBXb3JrT3JkZXIgdG8gdGhlIGxpbmsgaWYgbmVlZGVkCi0JCS8vIGFkZCBuZXcgbGluayBmb3IgdGhvc2UgV29ya09yZGVycyB0aGF0IHN0aWxsIGRvbid0IGhhdmUgdGhlCi0JCS8vIGNvcnJlc3BvbmRpbmcgbGluawotCQkvLwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQlpZiAobm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJCQkvLyBHZXQgdGhlIHJhdyBkYXRhIG9mIHdvcmtvcmRlcnMgZm9yIG9iamVjdC4KLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBsb2NhbCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlsaXN0LmFkZEFsbChsb2NhbC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpKTsKLQkJCQkKLQkJCQkvLyBHZXQgdGhlIFByZWRlY2Vzc29yIExpc3Qgb24gdG9wIG9mIHJhdyBkYXRhLCB0aGlzIGlzIG5lZWQgZm9yIGluIGNhc2Ugb2YgZXh0ZW5kLgotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkJLmFkYXB0KGxvY2FsLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJCQlsaXN0LmFkZEFsbCgoKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXRQcmVkZWNlc3NvcnMoKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIEl0ZXJhdGUgd29yayBvcmRlcnMgYW5kIGNyZWF0ZSBsaW5rcy4KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBudWxsOwotCQkJCQlCcmVha2Rvd25FbGVtZW50IHByZWQgPSBudWxsOwotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgV29ya09yZGVyKXsKLQkJCQkJCXdvcmtPcmRlciA9IChXb3JrT3JkZXIpbmV4dDsKLQkJCQkJCXByZWQgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCQl9Ci0JCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlwcmVkID0gKEJyZWFrZG93bkVsZW1lbnQpKChXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciluZXh0KS5nZXRUYXJnZXQoKTsgCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChwcmVkICE9IG51bGwgJiYgcHJlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlOb2RlIHByZWROb2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCQkJCQlwcmVkLCB0cnVlKTsKLQkJCQkJCWlmIChwcmVkTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBsaW5rIGZvciB0aGlzIHdvcmsgb3JkZXIKLQkJCQkJCQkvLyBhbHJlYWR5Ci0JCQkJCQkJLy8KLQkJCQkJCQlib29sZWFuIGxpbmtGb3VuZCA9IGZhbHNlOwotCQkJCQkJCWZpbmRfbGluazogZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBub2RlCi0JCQkJCQkJCQkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpID09IHByZWROb2RlKSB7Ci0JCQkJCQkJCQkvLyBsaW5rIGFscmVhZHkgZXhpc3RzCi0JCQkJCQkJCQkvLyBjaGVjayBpZiB3b3JrIG9yZGVyIGlzIHNldCB0byB0aGlzIGxpbmsKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlsaW5rRm91bmQgPSB0cnVlOwotCQkJCQkJCQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rCi0JCQkJCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCQkJCWlmIChlZGdlLmdldFNlbWFudGljTW9kZWwoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKAotCQkJCQkJCQkJCQkJbGluaywgd29ya09yZGVyKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrIGZpbmRfbGluazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWxpbmtGb3VuZCkgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGlzIFdvcmtPcmRlciBjYW4gYmUgcmVwcmVzZW50ZWQKLQkJCQkJCQkJLy8gdmlhIGxpbmtzIG9mIFR5cGVkTm9kZXMKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaWYgKCFjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUocHJlZE5vZGUsIG5vZGUpKSB7Ci0JCQkJCQkJCQkvLyBhZGQgbmV3IGxpbmsgZm9yIHRoaXMgd29yayBvcmRlcgotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCU5hbWVkTm9kZUltcGwgbm9kZUltcGwgPSAoKE5hbWVkTm9kZUltcGwpIG5vZGUpOwotCQkJCQkJCQkJTmFtZWROb2RlSW1wbCBwcmVkTm9kZUltcGwgPSAoTmFtZWROb2RlSW1wbCkgcHJlZE5vZGU7Ci0JCQkJCQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQkJCQlib29sZWFuIHByZWROb2RlTm90aWZ5ID0gcHJlZE5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJCQlwcmVkTm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCQkJCW5vZGVJbXBsLmFkZEluY29taW5nQ29ubmVjdGlvbihwcmVkKTsgCi0JCQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJCQkJCQkJcHJlZE5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBwcmVkTm9kZU5vdGlmeTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljbGVhbkR1cGxpY2F0ZUxpbmtzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFuRHVwbGljYXRlTGlua3MoKSB7Ci0JCUxpc3QgZHVwbGljYXRlTGlua3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgbm9kZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSB3Yk5vZGUgPSAoTm9kZSkgbm9kZTsKLQkJCQlpZih3Yk5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpICE9IG51bGwpewotCQkJCQlmaW5kRHVwbGljYXRlTGlua3MoZHVwbGljYXRlTGlua3MsIHdiTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpOwotCQkJCX0KLQkJCQlpZih3Yk5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpICE9bnVsbCl7Ci0JCQkJCWZpbmREdXBsaWNhdGVMaW5rcyhkdXBsaWNhdGVMaW5rcywgd2JOb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGR1cGxpY2F0ZUxpbmtzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCX0KLQkJZHVwbGljYXRlTGlua3MuY2xlYXIoKTsKLQkJZHVwbGljYXRlTGlua3MgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kRHVwbGljYXRlTGlua3MoTGlzdCBkdXBsaWNhdGVMaW5rcywgTGlzdCBsaW5rcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLnNpemUoKTsgaSsrKSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3MuZ2V0KGkpOwotCQkJaWYoIWR1cGxpY2F0ZUxpbmtzLmNvbnRhaW5zKGxpbmspKXsKLQkJCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBsaW5rcy5zaXplKCk7IGorKykgewotCQkJCQlMaW5rIGxpbmsxID0gKExpbmspIGxpbmtzLmdldChqKTsKLQkJCQkJaWYgKGxpbmsxLmdldFNvdXJjZSgpID09IGxpbmsuZ2V0U291cmNlKCkKLQkJCQkJCQkmJiBsaW5rMS5nZXRUYXJnZXQoKSA9PSBsaW5rLmdldFRhcmdldCgpKSB7Ci0JCQkJCQlkdXBsaWNhdGVMaW5rcy5hZGQobGluazEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIE5vZGUgc3JjIGNhbiByZWFjaCBOb2RlIHRhcmdldCBhcyB0aGUgZmlyc3QgQWN0aXZpdHlOb2RlIGluIHRoZQotCSAqIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc3JjCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShOb2RlIHNyYywgTm9kZSB0YXJnZXQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3JjLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpID09IHRhcmdldCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUKLQkJCQkJJiYgY2FuUmVhY2hBc0ZpcnN0QWN0aXZpdHlOb2RlKGxpbmsuZ2V0VGFyZ2V0KCksIHRhcmdldCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gcHJpdmF0ZSBMaXN0IHRvTm9kZXMoTGlzdCBhY3Rpdml0aWVzKSB7Ci0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gbGlzdC5hZGQodG9Ob2RlKChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKSkpOwotCS8vIH0KLQkvLyByZXR1cm4gbGlzdDsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjbmV3Tm9kZSgpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgbmV3Tm9kZSgpIHsKLQkJcmV0dXJuIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkKLQkJCS8vVHVybiBvZmYgdGhlIFZhcmlhYmlsaXR5SW5mbyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW0uCi0JCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWJvb2xlYW4gZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gZmFsc2U7Ci0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQlvYmogPSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXREZWxlZ2F0aW5nSXRlbVByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJb2JqID0gYWRhcHRlcjsKLQkJCX0KLQkJCQotCQkJaWYob2JqIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuaXNFbmFibGVWYXJpYWJpbGl0eUluZm8oKTsKLQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpb2JqKS5zZXRFbmFibGVWYXJpYWJpbGl0eUluZm8oZmFsc2UpOwotCQkJfQotCQkJLy8gZW5kIG9mIHZhcmlhYmlsaXR5IGluZm8gCi0JCQkKLQkJCQotCQkJLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZ2V0T2JqZWN0KCkpOwotCQkJLy8gY29tbWVudGVkIGFib3ZlIGxpbmUsIEZvciBkaWFncmFtcyAtIHJvbGx1cCBzaG91bGQgYmUgZmFsc2UsIGZvcgotCQkJLy8gaGFuZGxpbmcgcm9sbHVwIHN0YXRlIGJlbG93IGNvZGUuCi0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZXh0cmFjdENoaWxkcmVuKGFkYXB0ZXIsIGdldE9iamVjdCgpLCBjaGlsZHJlbiwgdHJ1ZSk7Ci0JCQkKLQkJCS8vIHJlc2V0IHZhcmlhYmlsaXR5aW5mbyBzdGF0dXMgYmFjawotCQkJaWYob2JqIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuc2V0RW5hYmxlVmFyaWFiaWxpdHlJbmZvKGVuYWJsZVZhcmlhYmlsaXR5SW5mbyk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnROb2RlcygpIHsKLQotCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCU5hbWVkTm9kZUltcGwgbm9kZSA9IChOYW1lZE5vZGVJbXBsKSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIGNoaWxkKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlKTsKLQkJCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlub2RlLml0ZW1Qcm92aWRlciA9IHdyYXBwZXI7Ci0JCQkJCQkvLyBUT0RPOiBjaGVjayBpZiByZWFkT25seSBhdHRyaWJ1dGUgaXMgc3RpbGwgbmVlZGVkCi0JCQkJCQkvLyBhZnRlciBpbnRyb2R1Y3Rpb24gb2YgaXRlbVByb3ZpZGVyCi0JCQkJCQkvLwotCQkJCQkJbm9kZS5yZWFkT25seSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXRUeXBlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEdyYXBoTm9kZSkgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBvYmo7Ci0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gbm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgewotCQkJCVN0cmluZyB0eXBlID0gKChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgbW9kZWxCcmlkZ2UpCi0JCQkJCQkuZ2V0VHlwZUluZm8oKTsKLQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX1NZTkNIX0JBUi5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5TWU5DSF9CQVI7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfREVDSVNJT04uZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuREVDSVNJT047Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRU5ELmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkVORDsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9TVEFSVC5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5TVEFSVDsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9GUkVFX1RFWFQKLQkJCQkJCS5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5GUkVFX1RFWFQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU07Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgdG9BY3Rpdml0eUluZGV4KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gaW5kZXg7Ci0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCWludCBpID0gaW5kZXggKyAxOwotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJZm9yICg7ICEobm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpICYmIGkgPCBzaXplOyBpKyspIHsKLQkJCW5vZGUgPSAoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCX0KLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJcmV0dXJuIGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2Yobm9kZS5nZXRPYmplY3QoKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjYWRkVG9VbWFNb2RlbChpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvVW1hTW9kZWwoaW50IHBvc2l0aW9uLCBOb2RlIGFkZGVkTm9kZSkgewotCQlpZiAoYWRkZWROb2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQotCQkJLy8gdHJhbnNsYXRlIEFjdGl2aXR5Tm9kZSBpbmRleCB0byBBY3Rpdml0eSBpbmRleAotCQkJLy8KLQkJCWludCBpID0gdG9BY3Rpdml0eUluZGV4KHBvc2l0aW9uKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGlhZ3JhbUltcGwuYWRkVG9VbWFNb2RlbCgpOgotCQkJLy8gV29ya0JyZWFrZG93bkVsZW1lbnQgaW5kZXg6ICIgKyBpKTsKLQkJCWlmIChpID09IC0xKSB7Ci0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKChCcmVha2Rvd25FbGVtZW50KSBhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoaSwgKEJyZWFrZG93bkVsZW1lbnQpIGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5hZGRUb1VtYU1vZGVsKHBvc2l0aW9uLCBhZGRlZE5vZGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNhZGROb2RlKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlOb2RlSW1wbCBiYXNlTm9kZSA9IChOb2RlSW1wbCkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkJCXRoaXMsIGJhc2UpOwotCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBiYXNlTm9kZS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJaWYgKGJyaWRnZS5nZXRFbGVtZW50KCkgIT0gYWN0KSB7Ci0JCQkJCQlicmlkZ2Uuc2V0RWxlbWVudChhY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmFzZU5vZGUgPSAoTm9kZUltcGwpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQlhY3QpOwotCQkJCX0KLQkJCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgYmFzZQotCQkJCQkvLwotCQkJCQlpZiAoYmFzZU5vZGUubWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJYmFzZS5lQWRhcHRlcnMoKS5yZW1vdmUoYmFzZU5vZGUubWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCQkJCQl9Ci0KLQkJCQkJYmFzZU5vZGUuYmFzaWNTZXRPYmplY3QoYWN0KTsKLQkJCQkJYmFzZU5vZGUuc2V0UmVhZE9ubHkoZmFsc2UpOwotCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuYWRkTm9kZShub2Rlcywgb2JqKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjcmVtb3ZlTm9kZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU5vZGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgdGhlIG9sZCBhY3Rpdml0eSBhbmQgcmVsaW5rIGl0IHRvIGl0cwotCQkJCS8vIGJhc2UKLQkJCQkvLwotCQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCWFjdCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gbm9kZS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJaWYgKGJyaWRnZS5nZXRFbGVtZW50KCkgIT0gYmFzZSkgewotCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYmFzZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlub2RlID0gKE5vZGVJbXBsKSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsIGJhc2UpOwotCQkJCX0KLQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBvbGQgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJaWYgKG5vZGUubWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJYWN0LmVBZGFwdGVycygpLnJlbW92ZShub2RlLm1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJCQkJfQotCi0JCQkJCW5vZGUuYmFzaWNTZXRPYmplY3QoYmFzZSk7Ci0JCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucmVtb3ZlTm9kZShvYmopOwotCX0KLQkvKioKLQkgKiBNb3ZlZCBjb2RlIGZyb20gZ2V0Q2hpbGRyZW4uIGdldEFkYXB0ZXIoKSB3aWxsIHJldHVybiBBZGFwdGVyLAotCSAqIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gZmluZCBpdGVtcHJvdmlkZXIgZm9yIHRoZSBjaGlsZHJlbi4gCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGdldEFkYXB0ZXIoKXsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gd3JhcHBlcjsKLQkJfSBlbHNlIHsKLQkJCQotCQkJYWRhcHRlciA9KElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQlnZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLX0gLy8gQWN0aXZpdHlEaWFncmFtSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvRGlhZ3JhbUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0RpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYmFlNzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvRGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW1SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklEaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzIERpYWdyYW0gewotCi0JcHJpdmF0ZSBib29sZWFuIG5ld0RpYWdyYW07Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlIC8vCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLQlwcm90ZWN0ZWQgY2xhc3MgQWN0aXZpdHlBZGFwdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIGltcGxlbWVudHMKLQkJCUlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciNnZXREaWFncmFtKCkKLQkJICovCi0JCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUltcGwudGhpczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBhZGROb2RlKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gYmFzZUFjdCkgewotCQkJCQkJbm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCXJlbW92ZU5vZGUobXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBub2RlcyA9IGFkZE5vZGVzKChDb2xsZWN0aW9uKSBtc2cKLQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSBiYXNlQWN0KSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJbm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJcmVtb3ZlTm9kZXMoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJbW92ZU5vZGUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXRQb3NpdGlvbigpLCBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBiYXNlQWN0OwotCi0JcHJpdmF0ZSBPYmplY3QgZGlhZ3JhbUFkYXB0ZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJLy9BY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChEaWFncmFtLmNsYXNzKSkgewotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkRJQUdSQU1fX05PREVTOgotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi5ub3RpZnlDaGFuZ2VkKCk6IGluZGV4PSIgKwotCQkJCQkvLyBtc2cuZ2V0UG9zaXRpb24oKSk7Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbjsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJbm9kZUFkZGVkKG1zZy5nZXRQb3NpdGlvbigpLCAoTm9kZSkgbXNnCi0JCQkJCQkJCS5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJbm9kZVJlbW92ZWQoKE5vZGUpIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCW5vZGVBZGRlZChtc2cuZ2V0UG9zaXRpb24oKSwgbm9kZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbm9kZVJlbW92ZWQoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKE9iamVjdCBvYmopIHsKLQkJTm9kZSBub2RlID0gYWRkTm9kZShnZXROb2RlcygpLCBvYmopOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0JCXBvcHVsYXRlTGlua3Mobm9kZSwgdHJ1ZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgT2JqZWN0IG9iaikgewotCQlpZiAoVG5nVXRpbC5pc0luc3RhbmNlT2YoZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCksIG9iaikpIHsKLQkJCU5vZGUgbm9kZSA9IHRvTm9kZSgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRkTm9kZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhZGROb2RlKG5vZGVzLCBpdGVyLm5leHQoKSk7Ci0JCX0KLQotCQkvLyB1c2UgYWRkQWxsKCkgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgbm90aWZpY2F0aW9ucwotCQkvLwotCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlTm9kZShPYmplY3Qgb2JqKSB7Ci0JCWlmICghVG5nVXRpbC5pc0luc3RhbmNlT2YoZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCksIG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLCBvYmopOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQl9Ci0JCW5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCW5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0KLQkJZ2V0Tm9kZXMoKS5yZW1vdmUobm9kZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vZGVzKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJcmVtb3ZlTm9kZShpdGVyLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0jZ2V0VU1BRGlhZ3JhbSgpCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBnZXRVTUFEaWFncmFtKCkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSkgZ2V0R3JhcGhOb2RlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZUFkZGVkKGludCBpbmRleCwgTm9kZSBub2RlKSB7Ci0JCWFkZFRvVW1hTW9kZWwoaW5kZXgsIG5vZGUpOwotCQlub2RlLmFkZENvbnN1bWVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVSZW1vdmVkKE5vZGUgbm9kZSkgewotCQlyZW1vdmVGcm9tVW1hTW9kZWwobm9kZSk7Ci0JCW5vZGUucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0JCXJldHVybiB0aGlzLm5ld0RpYWdyYW07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3KGJvb2xlYW4gbikgewotCQl0aGlzLm5ld0RpYWdyYW0gPSBuOwotCX0KLQotCS8qKgotCSAqIE5PVEU6IHRoaXMgbWV0aG9kIGlzIHJlLWVudHJhbnQsIG1ha2Ugc3VyZSB0byBoYW5kbGUgdGhlIGRhdGEgY29ycmVjdGx5IHRvIGF2b2lkIG1lbW9yeSBsZWFrIGFuZCBkYXRhIGNvcnJ1cHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmV3T2JqZWN0Ci0JICogICAgICAgICAgICBtdXN0IGJlIGFuIEFjdGl2aXR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJaWYgKG5ld09iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgbmV3T2JqZWN0KQotCQkJCQkJLmlzUmVhZE9ubHkoKSkgewotCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgbmV3T2JqZWN0OwotCQkJc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCX0KLQkJbmV3T2JqZWN0ID0gVG5nVXRpbC51bndyYXAobmV3T2JqZWN0KTsKLQotCQlvYmplY3QgPSBuZXdPYmplY3Q7Ci0KLQkJLy8gYWRkIGRpYWdyYW0gY2hhbmdlIGxpc3RlbmVyIHRvIHRoZSBsaW5rZWQgb2JqZWN0LiBSZW1vdmUgdGhlIG9sZAotCQkvLyBsaXN0ZW5lciBpZiB0aGVyZSBpcyBhbnkuCi0JCS8vIEJ1dCBmaXJzdCBrZWVwIHRoZSBvbGQgbGlzdGVuZXIgdG8gaGVscCBmaW5kIHRoZSBVTUEgZGlhZ3JhbSBvZiB0aGUKLQkJLy8gYWN0aXZpdHkgcXVpY2tseS4KLQkJLy8KLQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSkgbmV3T2JqZWN0OwkJCi0JCWlmKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJfQotCQliYXNlQWN0ID0gbnVsbDsKLQkJCi0JCWlmKG5ld09iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBzZXQgdGhlIFVNQSBkaWFncmFtIGZvciB0aGlzIGRpYWdyYW0KLQkJLy8KLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJZ3JhcGhOb2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKGUsCi0JCQkJCWdldFR5cGUoKSwgZmFsc2UpOwotCQkJLy8gc2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoaXMgaXMgYSBuZXcgZGlhZ3JhbSBvciBub3QKLQkJCWlmIChncmFwaE5vZGUgPT0gbnVsbCkgewotCQkJCWdyYXBoTm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShlLAotCQkJCQkJZ2V0VHlwZSgpLCB0cnVlKTsKLQkJCQlzZXROZXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZighZS5lQWRhcHRlcnMoKS5jb250YWlucyhkaWFncmFtQ2hhbmdlTGlzdGVuZXIpKSB7Ci0JCQllLmVBZGFwdGVycygpLmFkZChkaWFncmFtQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCWlmIChiYXNlQWN0ICE9IG51bGwgJiYgIWJhc2VBY3QuZUFkYXB0ZXJzKCkuY29udGFpbnMoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKSkgewotCQkJYmFzZUFjdC5lQWRhcHRlcnMoKS5hZGQoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCi0JCXBvcHVsYXRlRGlhZ3JhbSgpOwotCi0JCWlmKCFlQWRhcHRlcnMoKS5jb250YWlucyhkaWFncmFtQWRhcHRlcikpIHsKLQkJCXRoaXMuZUFkYXB0ZXJzKCkuYWRkKChBZGFwdGVyKSBkaWFncmFtQWRhcHRlcik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgZGlhZ3JhbSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIFVNQSBtb2RlbC4gU3ViY2xhc3Mgc2hvdWxkCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVEaWFncmFtKCkgewotCQlwb3B1bGF0ZU5vZGVzKCk7Ci0JCXBvcHVsYXRlTGlua3MoKTsKLQotCQkvLyBhZGQgdGhpcyBkaWFncmFtIHRvIHRoZSBjb25zdW1lciBsaXN0IG9mIGFsbCBub2RlcyBzbyB0aGV5IHdpbGwgbm90Ci0JCS8vIGJlIGRpc3Bvc2VkCi0JCS8vIGJlZm9yZSB0aGlzIGRpYWdyYW0uCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBpdGVyLm5leHQoKTsKLQkJCW5vZGUuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGluY29taW5nL291dGdvaW5nIGxpbmtzIG9mIHRoZSBnaXZlbiBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpbmtzKE5vZGUgbm9kZSwgYm9vbGVhbiBkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCWludCBzaXplID0gMDsKLQkJYm9vbGVhbltdIG5vdGlmaWVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCQkJc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQkJCW5vdGlmaWVzID0gbmV3IGJvb2xlYW5bc2l6ZV07Ci0JCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQKLQkJCQkvLyB1bndhbnRlZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb25uZWN0aW9uIGxpc3QKLQkJCQkvLwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU5vZGUgY2hpbGQgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCQkJbm90aWZpZXNbaV0gPSBjaGlsZC5lRGVsaXZlcigpOwotCQkJCQljaGlsZC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gbm9kZS5nZXRHcmFwaE5vZGUoKTsKLQkJCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZmlsbENvbm5lY3Rpb25zKG5vZGUsIGdyYXBoTm9kZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkJCS8vIHJlc3RvcmUgbm90aWZpY2F0aW9uIGZsYWcKLQkJCQkvLwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCSgoRU9iamVjdCkgZ2V0Tm9kZXMoKS5nZXQoaSkpLmVTZXREZWxpdmVyKG5vdGlmaWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5vZGVzKCkgewkJCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkaWFncmFtID0gZ2V0VU1BRGlhZ3JhbSgpOwotCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCUxpc3QgdHlwZWROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpbnQgdHlwZSA9IGdldFR5cGUoZWxlbWVudCk7Ci0JCQkJaWYgKHR5cGUgPiAwKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKHR5cGUpOwotCQkJCQlub2RlLnNldE9iamVjdChlbGVtZW50KTsKLQkJCQkJdHlwZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJZ2V0Tm9kZXMoKS5hZGRBbGwodHlwZWROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VHlwZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBHcmFwaE5vZGUpIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgb2JqOwotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IG5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgdHlwZSA9ICgoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIG1vZGVsQnJpZGdlKQotCQkJCQkJLmdldFR5cGVJbmZvKCk7Ci0JCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9TWU5DSF9CQVIuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuU1lOQ0hfQkFSOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0RFQ0lTSU9OLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkRFQ0lTSU9OOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0VORC5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5FTkQ7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfU1RBUlQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuU1RBUlQ7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUCi0JCQkJCQkuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuRlJFRV9URVhUOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJLy8gZmlsbCBvdXRnb2luZy9pbmNvbWluZyBjb25uZWN0aW9uIGxpc3RzIG9mIGFsbCBub2RlcwotCQkvLwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlib29sZWFuW10gbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJdHJ5IHsKLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkvLyB1bndhbnRlZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb25uZWN0aW9uIGxpc3QKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSkpOwotCQkJCW5vdGlmaWVzW2ldID0gbm9kZS5lRGVsaXZlcigpOwotCQkJCW5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJcG9wdWxhdGVMaW5rcyhub2RlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGRhdGEgZm9yIHRoZSByZW1vdmVkIG5vZGUgZnJvbSB0aGUgVU1BIG1vZGVsIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVkTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VbWFNb2RlbChOb2RlIHJlbW92ZWROb2RlKSB7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCWlmIChyZW1vdmVkTm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZShyZW1vdmVkTm9kZS5nZXRPYmplY3QoKSk7Ci0JCX0KLQkJCi0JCWlmKGdldFVNQURpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQlnZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkucmVtb3ZlKHJlbW92ZWROb2RlLmdldEdyYXBoTm9kZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGRhdGEgZm9yIHRoZSBuZXdseSBhZGRlZCBub2RlIHRvIHRoZSBVTUEgbW9kZWwgU3ViY2xhc3Mgc2hvdWxkCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIE5vZGUgYWRkZWROb2RlKSB7Ci0KLQkJaWYgKGFkZGVkTm9kZS5nZXRHcmFwaE5vZGUoKSA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIG5vZGUgaXMgcmVhZGRlZCBhZnRlciB1bmRvCi0JCQkvLwotCQkJKChOb2RlSW1wbCkgYWRkZWROb2RlKS5iYXNpY1NldE9iamVjdChhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCQotCQlpZihnZXRVTUFEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmFkZChhZGRlZE5vZGUuZ2V0R3JhcGhOb2RlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBuZXcgbm9kZSBmb3IgdGhpcyBkaWFncmFtIGZvciB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSB0b05vZGUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCU5vZGUgbm9kZSA9IG5ld05vZGUoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlub2RlLnNldFVNQURpYWdyYW0oZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJbm9kZS5zZXREaWFncmFtKHRoaXMpOwotCQlub2RlLnNldE9iamVjdChlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgbmV3Tm9kZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpCi0JICovCi0JcHVibGljIENsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpIHsKLQkJcmV0dXJuIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZGlzcG9zZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLQkJCQliYXNlQWN0LmVBZGFwdGVycygpLnJlbW92ZShkaWFncmFtQ2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJZS5lQWRhcHRlcnMoKS5yZW1vdmUoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0jc2V0RGVmYXVsdE5hbWUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5hbWVkTm9kZSBuZXdOb2RlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgb2JqID0gKE1ldGhvZEVsZW1lbnQpIG5ld05vZGUuZ2V0T2JqZWN0KCk7Ci0JCWludCBjbGFzc0lEID0gb2JqLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlBcnJheUxpc3Qgc2libGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGUuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkgPT0gY2xhc3NJRCkgewotCQkJCXNpYmxpbmdzLmFkZChlKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgYmFzZU5hbWUgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJLmZvcm1hdCgKLQkJCQkJCURpYWdyYW1SZXNvdXJjZXMuZGVmYXVsdEJhc2VOYW1lLCBuZXcgT2JqZWN0W10geyBUbmdVdGlsLmdldFR5cGVUZXh0KG9iai5lQ2xhc3MoKS5nZXROYW1lKCkpIH0pOyAKLQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShzaWJsaW5ncywgb2JqLCBiYXNlTmFtZSk7Ci0JCW5ld05vZGUuc2V0TmFtZShvYmouZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZXh0cmFjdENoaWxkcmVuKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyLCBPYmplY3Qgb2JqZWN0LCBDb2xsZWN0aW9uIGNoaWxkcmVuLAotCQkJYm9vbGVhbiBmaWx0ZXJTdXBwcmVzc2VkKSB7Ci0JCS8vIGRpc2FibGUgcm9sbHVwIGJlZm9yZSBnZXR0aW5nIHRoZSBjaGlsZHJlbgotCQkvLwotCQlib29sZWFuIG9sZFJvbGxlZFVwID0gZmFsc2U7Ci0JCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKWFkYXB0ZXI7Ci0JCQlvbGRSb2xsZWRVcCA9IGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQlpdGVtUHJvdmlkZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXI7Ci0JCQlvbGRSb2xsZWRVcCA9IGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJLy8gZmlsdGVyIG91dCB0aGUgc3VwcHJlc3NlZCBlbGVtZW50cwotCQkJLy8KLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlpZihmaWx0ZXJTdXBwcmVzc2VkKXsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZighZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoY2hpbGQpKSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX1lbHNlewotCQkJCQkvLyBkb24ndCBmaWx0ZXIgc3VwcHJlc3NlZCBlbGVtZW50cwotCQkJCQkvLwotCQkJCQljaGlsZHJlbi5hZGRBbGwoYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHRoZSByb2xsZWQtdXAgZmxhZwotCQkJLy8KLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyKS5zZXRSb2xsZWRVcChvbGRSb2xsZWRVcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbiBQcm9jZXNzIFdCUywgaWYgYnJlYWtkb3duZWxlbWVudCBpcyBtb3ZlZAotCSAqIHVwIG9yIGRvd24sIGRpYWdyYW0gc2hvdWxkIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuIAotCSAqIFN1Yi1jbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgZGlhZ3JhbSBuZWVkcyB1cGRhdGUgb24gbW92ZS4gCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogQHBhcmFtIG5ld3Bvc2l0aW9uIGludAotCSAqIEBwYXJhbSBvbGRQb3NpdGlvbiBPYmplY3QoSW50ZWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlTm9kZShPYmplY3QgbW92ZWRPYmplY3QsIGludCBwb3NpdGlvbiwgT2JqZWN0IG9sZFBvc2l0aW9uKSB7Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbERhdGFSZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoYm9vbGVhbiBncmFwaGljYWxEYXRhUmVxdWlyZWQpIHsKLQkJdGhpcy5ncmFwaGljYWxEYXRhUmVxdWlyZWQgPSBncmFwaGljYWxEYXRhUmVxdWlyZWQ7Ci0JfQotCQkKLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFdyYXBwZXIoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGZpbHRlcjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZ3JhcGhpY2FsRGF0YVJlcXVpcmVkID0gdHJ1ZTsKLQotfSAvLyBEaWFncmFtSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTGlua0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjkxZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTGlua0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0QmVuZHBvaW50cyA8ZW0+QmVuZHBvaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCNnZXRTb3VyY2VFbmRQb2ludCA8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCNnZXRUYXJnZXRFbmRQb2ludCA8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtJbXBsIGV4dGVuZHMgTGlua2VkT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExpbmsgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0KCkgPGVtPlRhcmdldDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgdGFyZ2V0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmVuZHBvaW50cygpIDxlbT5CZW5kcG9pbnRzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCZW5kcG9pbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8QWJzb2x1dGVCZW5kcG9pbnQ+IGJlbmRwb2ludHM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlRW5kUG9pbnQoKSA8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZUVuZFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBvaW50IFNPVVJDRV9FTkRfUE9JTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlRW5kUG9pbnQoKSA8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZUVuZFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgc291cmNlRW5kUG9pbnQgPSBTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVuZFBvaW50KCkgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQb2ludCBUQVJHRVRfRU5EX1BPSU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVuZFBvaW50KCkgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHRhcmdldEVuZFBvaW50ID0gVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTks7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGdldFNvdXJjZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoTm9kZSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U291cmNlKE5vZGUgbmV3U291cmNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdTb3VyY2UsIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKE5vZGUgbmV3U291cmNlKSB7Ci0JCWlmIChuZXdTb3VyY2UgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRSAmJiBuZXdTb3VyY2UgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdTb3VyY2UpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1NvdXJjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTb3VyY2UpLmVJbnZlcnNlQWRkKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTb3VyY2UobmV3U291cmNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UsIG5ld1NvdXJjZSwgbmV3U291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGdldFRhcmdldCgpIHsKLQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVGFyZ2V0ID0gKEludGVybmFsRU9iamVjdCl0YXJnZXQ7Ci0JCQl0YXJnZXQgPSAoTm9kZSllUmVzb2x2ZVByb3h5KG9sZFRhcmdldCk7Ci0JCQlpZiAodGFyZ2V0ICE9IG9sZFRhcmdldCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQsIG9sZFRhcmdldCwgdGFyZ2V0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vZGUgYmFzaWNHZXRUYXJnZXQoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhcmdldChOb2RlIG5ld1RhcmdldCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlOb2RlIG9sZFRhcmdldCA9IHRhcmdldDsKLQkJdGFyZ2V0ID0gbmV3VGFyZ2V0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VULCBvbGRUYXJnZXQsIG5ld1RhcmdldCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb2RlIG5ld1RhcmdldCkgewotCQlpZiAobmV3VGFyZ2V0ICE9IHRhcmdldCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRhcmdldCkuZUludmVyc2VSZW1vdmUodGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TLCBOb2RlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdUYXJnZXQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFyZ2V0KS5lSW52ZXJzZUFkZCh0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMsIE5vZGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGFyZ2V0KG5ld1RhcmdldCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VULCBuZXdUYXJnZXQsIG5ld1RhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8QWJzb2x1dGVCZW5kcG9pbnQ+IGdldEJlbmRwb2ludHMoKSB7Ci0JCWlmIChiZW5kcG9pbnRzID09IG51bGwpIHsKLQkJCWJlbmRwb2ludHMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3Q8QWJzb2x1dGVCZW5kcG9pbnQ+KEFic29sdXRlQmVuZHBvaW50LmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGJlbmRwb2ludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTb3VyY2VFbmRQb2ludCgpIHsKLQkJcmV0dXJuIHNvdXJjZUVuZFBvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFbmRQb2ludChQb2ludCBuZXdTb3VyY2VFbmRQb2ludCkgewotCQlQb2ludCBvbGRTb3VyY2VFbmRQb2ludCA9IHNvdXJjZUVuZFBvaW50OwotCQlzb3VyY2VFbmRQb2ludCA9IG5ld1NvdXJjZUVuZFBvaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVCwgb2xkU291cmNlRW5kUG9pbnQsIHNvdXJjZUVuZFBvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRUYXJnZXRFbmRQb2ludCgpIHsKLQkJcmV0dXJuIHRhcmdldEVuZFBvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbmRQb2ludChQb2ludCBuZXdUYXJnZXRFbmRQb2ludCkgewotCQlQb2ludCBvbGRUYXJnZXRFbmRQb2ludCA9IHRhcmdldEVuZFBvaW50OwotCQl0YXJnZXRFbmRQb2ludCA9IG5ld1RhcmdldEVuZFBvaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVCwgb2xkVGFyZ2V0RW5kUG9pbnQsIHRhcmdldEVuZFBvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRTb3VyY2UoKE5vZGUpb3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRhcmdldCkuZUludmVyc2VSZW1vdmUodGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TLCBOb2RlLmNsYXNzLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYXJnZXQoKE5vZGUpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U291cmNlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCXJldHVybiBiYXNpY1NldFRhcmdldChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUYXJnZXQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRUYXJnZXQoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQkJcmV0dXJuIGdldEJlbmRwb2ludHMoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCXJldHVybiBnZXRUYXJnZXRFbmRQb2ludCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKE5vZGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlzZXRUYXJnZXQoKE5vZGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQkJZ2V0QmVuZHBvaW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0QmVuZHBvaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWJzb2x1dGVCZW5kcG9pbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJCXNldFNvdXJjZUVuZFBvaW50KChQb2ludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCQlzZXRUYXJnZXRFbmRQb2ludCgoUG9pbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoTm9kZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJc2V0VGFyZ2V0KChOb2RlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQkJZ2V0QmVuZHBvaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQlzZXRTb3VyY2VFbmRQb2ludChTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCXNldFRhcmdldEVuZFBvaW50KFRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKSAhPSBudWxsOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCXJldHVybiB0YXJnZXQgIT0gbnVsbDsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQkJcmV0dXJuIGJlbmRwb2ludHMgIT0gbnVsbCAmJiAhYmVuZHBvaW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJCXJldHVybiBTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2VFbmRQb2ludCAhPSBudWxsIDogIVNPVVJDRV9FTkRfUE9JTlRfRURFRkFVTFQuZXF1YWxzKHNvdXJjZUVuZFBvaW50KTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJcmV0dXJuIFRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEVuZFBvaW50ICE9IG51bGwgOiAhVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVC5lcXVhbHModGFyZ2V0RW5kUG9pbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmVuZHBvaW50czogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChiZW5kcG9pbnRzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzb3VyY2VFbmRQb2ludDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzb3VyY2VFbmRQb2ludCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0RW5kUG9pbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodGFyZ2V0RW5kUG9pbnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlzdXBlci5zZXRPYmplY3QobmV3T2JqZWN0KTsKLQotCQlpZiAobmV3T2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBuZXdPYmplY3Q7Ci0KLQkJLy8gY29weSBiZW5kcG9pbnRzIGZyb20gZWRnZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGdlLmdldFdheXBvaW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJZ2V0QmVuZHBvaW50cygpLmFkZCgKLQkJCQkJbmV3IEFic29sdXRlQmVuZHBvaW50KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkudG9Qb2ludCgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCkgaXRlci5uZXh0KCkpKSk7Ci0JCX0KLQotCQkvLyBjb3B5IGVuZCBwb2ludHMgZnJvbSBHcmFwaENvbm5lY3RvcnMKLQkJLy8KLQkJaWYgKGdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkuZ2V0UG9zaXRpb24oKSAhPSBudWxsKSB7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLnRvUG9pbnQoZ2V0U291cmNlR3JhcGhDb25uZWN0b3IoKS5nZXRQb3NpdGlvbigpKTsKLQkJfQotCQlpZiAoZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKS5nZXRQb3NpdGlvbigpICE9IG51bGwpIHsKLQkJCXRhcmdldEVuZFBvaW50ID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkudG9Qb2ludChnZXRUYXJnZXRHcmFwaENvbm5lY3RvcigpLmdldFBvc2l0aW9uKCkpOwotCQl9Ci0JCQkJCi0JCWVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCVBvaW50IHA7Ci0JCQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBnZXRPYmplY3QoKTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTGluay5jbGFzcykpIHsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlwID0gKEFic29sdXRlQmVuZHBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWludCBpbmRleCA9IG1zZy5nZXRQb3NpdGlvbigpOwotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCB1bWFQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLm5ld01vZGVsUG9pbnQocC54LCBwLnkpOwotCQkJCQkJaWYgKGluZGV4ID09IE5vdGlmaWNhdGlvbi5OT19JTkRFWCkgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkuYWRkKHVtYVBvaW50KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5hZGQoaW5kZXgsIHVtYVBvaW50KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJLy8gcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQkvLyBlZGdlLmdldFdheXBvaW50cygpLnJlbW92ZShHcmFwaGljYWxEYXRhSGVscGVyLm5ld01vZGVsUG9pbnQocC54LAotCQkJCQkJLy8gcC55KSk7Ci0KLQkJCQkJCWluZGV4ID0gbXNnLmdldFBvc2l0aW9uKCk7Ci0JCQkJCQlpZiAoaW5kZXggPT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUobXNnLmdldFBvc2l0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLnJlbW92ZShpbmRleCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlBcnJheUxpc3QgdW1hUG9pbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJdW1hUG9pbnRzLmFkZChHcmFwaGljYWxEYXRhSGVscGVyLm5ld01vZGVsUG9pbnQoCi0JCQkJCQkJCQlwLngsIHAueSkpOwotCQkJCQkJfQotCQkJCQkJaW5kZXggPSBtc2cuZ2V0UG9zaXRpb24oKTsKLQkJCQkJCWlmIChpbmRleCA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZEFsbCh1bWFQb2ludHMpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZEFsbChpbmRleCwgdW1hUG9pbnRzKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCS8vIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCQkvLyBwID0gKEFic29sdXRlQmVuZHBvaW50KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJLy8gZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUoR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwKLQkJCQkJLy8gcC55KSk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQlwID0gKEFic29sdXRlQmVuZHBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQkJUG9pbnQgb2xkcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlpbnQgcG9pbnRJbmRleCA9IG1zZy5nZXRQb3NpdGlvbigpOwotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBuZXdVbWFQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLm5ld01vZGVsUG9pbnQocC54LCBwLnkpOwotLy8JCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IG9sZFVtYVBvaW50ID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotLy8JCQkJCQkJCS5uZXdNb2RlbFBvaW50KG9sZHAueCwgb2xkcC55KTsKLQkJCQkJCWlmIChwb2ludEluZGV4ID09IE5vdGlmaWNhdGlvbi5OT19JTkRFWCkgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJJbmRleCBmb3IgYmVuZHBvaW50IGlzIC0xLCBDYW5ub3Qgc2V0IHRoZSBiZW5kIHBvaW50IGxvY2F0aW9uLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkucmVtb3ZlKHBvaW50SW5kZXgpOwotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkuYWRkKHBvaW50SW5kZXgsIG5ld1VtYVBvaW50KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQkJcCA9IChQb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLm5vdGlmeUNoYW5nZWQoKTogbmV3IHNvdXJjZSBlbmQKLQkJCQkJLy8gcG9pbnQ6ICIgKyBwICsgIi4gIiArIGdldFNvdXJjZSgpKTsKLQkJCQkJaWYgKHAgIT0gbnVsbCkgewotCQkJCQkJLy8gdHJhbnNsYXRlIHRvIHJlbGF0aXZlIHBvc2l0aW9uCi0JCQkJCQkvLwotCQkJCQkJLy8gcC50cmFuc2xhdGUoZ2V0U291cmNlKCkuZ2V0TG9jYXRpb24oKS5nZXROZWdhdGVkKCkpOwotCQkJCQkJZ2V0U291cmNlR3JhcGhDb25uZWN0b3IoKS5zZXRQb3NpdGlvbigKLQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwgcC55KSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJCXAgPSAoUG9pbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi5ub3RpZnlDaGFuZ2VkKCk6IG5ldyB0YXJnZXQgZW5kCi0JCQkJCS8vIHBvaW50OiAiICsgcCArICIuICIgKyBnZXRUYXJnZXQoKSk7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCS8vIHRyYW5zbGF0ZSB0byByZWxhdGl2ZSBwb3NpdGlvbgotCQkJCQkJLy8KLQkJCQkJCS8vIHAudHJhbnNsYXRlKExpbmtJbXBsLnRoaXMuZ2V0VGFyZ2V0KCkuZ2V0TG9jYXRpb24oKS5nZXROZWdhdGVkKCkpOwotCQkJCQkJZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKS5zZXRQb3NpdGlvbigKLQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwgcC55KSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQkJLy8gVE9ETwotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCQkvLyBUT0RPCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgR3JhcGhDb25uZWN0b3IgZ2V0U291cmNlR3JhcGhDb25uZWN0b3IoKSB7Ci0JCXJldHVybiAoR3JhcGhDb25uZWN0b3IpICgoR3JhcGhFZGdlKSBnZXRPYmplY3QoKSkuZ2V0QW5jaG9yKCkuZ2V0KDApOwotCX0KLQotCXByaXZhdGUgR3JhcGhDb25uZWN0b3IgZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKSB7Ci0JCXJldHVybiAoR3JhcGhDb25uZWN0b3IpICgoR3JhcGhFZGdlKSBnZXRPYmplY3QoKSkuZ2V0QW5jaG9yKCkuZ2V0KDEpOwotCX0KLQotfSAvLyBMaW5rSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTGlua2VkT2JqZWN0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTGlua2VkT2JqZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWU5MmNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtlZE9iamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaW5rZWQgT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwjZ2V0TGlua2VkRWxlbWVudCA8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5rZWRPYmplY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cwotCQlMaW5rZWRPYmplY3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtlZEVsZW1lbnQoKSA8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtlZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQ7Ci0JcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpbmtlZE9iamVjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktFRF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TGlua2VkRWxlbWVudCgpIHsKLQkJaWYgKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpbGlua2VkRWxlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZExpbmtlZEVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KWxpbmtlZEVsZW1lbnQ7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpZVJlc29sdmVQcm94eShvbGRMaW5rZWRFbGVtZW50KTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG9sZExpbmtlZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQsIG9sZExpbmtlZEVsZW1lbnQsIGxpbmtlZEVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlua2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBiYXNpY0dldExpbmtlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBsaW5rZWRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmtlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBuZXdMaW5rZWRFbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnQgb2xkTGlua2VkRWxlbWVudCA9IGxpbmtlZEVsZW1lbnQ7Ci0JCWxpbmtlZEVsZW1lbnQgPSBuZXdMaW5rZWRFbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQsIG9sZExpbmtlZEVsZW1lbnQsIGxpbmtlZEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMaW5rZWRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOgotCQkJCXNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDoKLQkJCQlzZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGxpbmtlZEVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQl0aGlzLm9iamVjdCA9IG5ld09iamVjdDsKLQl9Ci0KLX0gLy8gTGlua2VkT2JqZWN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWM0NGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNb2RlbEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJTW9kZWxGYWN0b3J5IHRoZU1vZGVsRmFjdG9yeSA9IChNb2RlbEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZU1vZGVsRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZU1vZGVsRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBNb2RlbEZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkRJQUdSQU06IHJldHVybiBjcmVhdGVEaWFncmFtKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LOiByZXR1cm4gY3JlYXRlTGluaygpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERTogcmV0dXJuIGNyZWF0ZU5hbWVkTm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfRElBR1JBTTogcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERTogcmV0dXJuIGNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTogcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFOiByZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTogcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9OT0RFOiByZXR1cm4gY3JlYXRlUm9sZU5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEU6IHJldHVybiBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFOiByZXR1cm4gY3JlYXRlVGFza05vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREU6IHJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREU6IHJldHVybiBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEU6IHJldHVybiBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUJTT0xVVEVfQkVORFBPSU5UOgotCQkJCXJldHVybiBjcmVhdGVBYnNvbHV0ZUJlbmRwb2ludEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUE9JTlQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvaW50RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdG9yRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQlNPTFVURV9CRU5EUE9JTlQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBYnNvbHV0ZUJlbmRwb2ludFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5QT0lOVDoKLQkJCQlyZXR1cm4gY29udmVydFBvaW50VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gY29udmVydFJvbGVEZXNjcmlwdG9yVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gY3JlYXRlRGlhZ3JhbSgpIHsKLQkJRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IG5ldyBEaWFncmFtSW1wbCgpOwotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmsgY3JlYXRlTGluaygpIHsKLQkJTGlua0ltcGwgbGluayA9IG5ldyBMaW5rSW1wbCgpOwotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkTm9kZSBjcmVhdGVOYW1lZE5vZGUoKSB7Ci0JCU5hbWVkTm9kZUltcGwgbmFtZWROb2RlID0gbmV3IE5hbWVkTm9kZUltcGwoKTsKLQkJcmV0dXJuIG5hbWVkTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGlhZ3JhbUltcGwgYWN0aXZpdHlEaWFncmFtID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5RGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFR5cGVkTm9kZSBjcmVhdGVUeXBlZE5vZGUoKSB7Ci0JCVR5cGVkTm9kZUltcGwgdHlwZWROb2RlID0gbmV3IFR5cGVkTm9kZUltcGwoKTsKLQkJcmV0dXJuIHR5cGVkTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpIHsKLQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwgd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSA9IG5ldyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Tm9kZSBjcmVhdGVXb3JrUHJvZHVjdE5vZGUoKSB7Ci0JCVdvcmtQcm9kdWN0Tm9kZUltcGwgd29ya1Byb2R1Y3ROb2RlID0gbmV3IFdvcmtQcm9kdWN0Tm9kZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVOb2RlIGNyZWF0ZVJvbGVOb2RlKCkgewotCQlSb2xlTm9kZUltcGwgcm9sZU5vZGUgPSBuZXcgUm9sZU5vZGVJbXBsKCk7Ci0JCXJldHVybiByb2xlTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCkgewotCQlSb2xlVGFza0NvbXBvc2l0ZUltcGwgcm9sZVRhc2tDb21wb3NpdGUgPSBuZXcgUm9sZVRhc2tDb21wb3NpdGVJbXBsKCk7Ci0JCXJldHVybiByb2xlVGFza0NvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlIGNyZWF0ZVRhc2tOb2RlKCkgewotCQlUYXNrTm9kZUltcGwgdGFza05vZGUgPSBuZXcgVGFza05vZGVJbXBsKCk7Ci0JCXJldHVybiB0YXNrTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKSB7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwgd29ya0JyZWFrZG93bkVsZW1lbnROb2RlID0gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCkgewotCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgd29ya1Byb2R1Y3RDb21wb3NpdGUgPSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdENvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFic29sdXRlQmVuZHBvaW50IGNyZWF0ZUFic29sdXRlQmVuZHBvaW50RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQWJzb2x1dGVCZW5kcG9pbnQpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFic29sdXRlQmVuZHBvaW50VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGNyZWF0ZVBvaW50RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUG9pbnQpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFBvaW50VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3JGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChSb2xlRGVzY3JpcHRvcilzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Um9sZURlc2NyaXB0b3JUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpIHsKLQkJcmV0dXJuIChNb2RlbFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgTW9kZWxQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvLyBNb2RlbEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NmZhZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNb2RlbFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsaW5rZWRPYmplY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5hbWVkTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgbm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlEaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0eXBlZE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0Tm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBub2RlQ29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tOb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBhYnNvbHV0ZUJlbmRwb2ludEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcG9pbnRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHJvbGVEZXNjcmlwdG9yRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUKLQkgKiBwYWNrYWdlIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMgZmFjdG9yeQotCSAqIG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkgKiBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNb2RlbFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE1vZGVsUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlNb2RlbFBhY2thZ2VJbXBsIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBNb2RlbFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlTW9kZWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU1vZGVsUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTW9kZWxQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpbmtfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGlua19Tb3VyY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpbmtfVGFyZ2V0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rX0JlbmRwb2ludHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpbmtfU291cmNlRW5kUG9pbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpbmtfVGFyZ2V0RW5kUG9pbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGlua2VkT2JqZWN0KCkgewotCQlyZXR1cm4gbGlua2VkT2JqZWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpbmtlZE9iamVjdF9MaW5rZWRFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGlua2VkT2JqZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZWROb2RlKCkgewotCQlyZXR1cm4gbmFtZWROb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZE5vZGVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVkTm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5vZGUoKSB7Ci0JCXJldHVybiBub2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX0xvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX1dpZHRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX0hlaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Tm9kZV9JbmNvbWluZ0Nvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5vZGVfUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHlEaWFncmFtKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEaWFncmFtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFR5cGVkTm9kZSgpIHsKLQkJcmV0dXJuIHR5cGVkTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VHlwZWROb2RlX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0eXBlZE5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdE5vZGUoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0Tm9kZV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3ROb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Tm9kZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5vZGVDb250YWluZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE5vZGVDb250YWluZXJfTm9kZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlub2RlQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZU5vZGUoKSB7Ci0JCXJldHVybiByb2xlTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlVGFza0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrTm9kZSgpIHsKLQkJcmV0dXJuIHRhc2tOb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tOb2RlX0luZGV4KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza05vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKSB7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGVfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKSB7Ci0JCXJldHVybiBhYnNvbHV0ZUJlbmRwb2ludEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQb2ludCgpIHsKLQkJcmV0dXJuIHBvaW50RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnkgZ2V0TW9kZWxGYWN0b3J5KCkgewotCQlyZXR1cm4gKE1vZGVsRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJZGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESUFHUkFNKTsKLQotCQlsaW5rRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKGxpbmtFQ2xhc3MsIExJTktfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpbmtFQ2xhc3MsIExJTktfX1NPVVJDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGlua0VDbGFzcywgTElOS19fVEFSR0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19CRU5EUE9JTlRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19TT1VSQ0VfRU5EX1BPSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19UQVJHRVRfRU5EX1BPSU5UKTsKLQotCQlsaW5rZWRPYmplY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTElOS0VEX09CSkVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGlua2VkT2JqZWN0RUNsYXNzLCBMSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVCk7Ci0KLQkJbmFtZWROb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE5BTUVEX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKG5hbWVkTm9kZUVDbGFzcywgTkFNRURfTk9ERV9fTkFNRSk7Ci0KLQkJbm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShub2RlRUNsYXNzLCBOT0RFX19MT0NBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobm9kZUVDbGFzcywgTk9ERV9fV0lEVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKG5vZGVFQ2xhc3MsIE5PREVfX0hFSUdIVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uobm9kZUVDbGFzcywgTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG5vZGVFQ2xhc3MsIE5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShub2RlRUNsYXNzLCBOT0RFX19SRUFEX09OTFkpOwotCi0JCWFjdGl2aXR5RGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ESUFHUkFNKTsKLQotCQl0eXBlZE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVFlQRURfTk9ERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodHlwZWROb2RlRUNsYXNzLCBUWVBFRF9OT0RFX19UWVBFKTsKLQotCQl3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pOwotCi0JCXdvcmtQcm9kdWN0Tm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfTk9ERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3ROb2RlRUNsYXNzLCBXT1JLX1BST0RVQ1RfTk9ERV9fVFlQRSk7Ci0KLQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURldGFpbERpYWdyYW1FQ2xhc3MsIEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVCk7Ci0KLQkJbm9kZUNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOT0RFX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uobm9kZUNvbnRhaW5lckVDbGFzcywgTk9ERV9DT05UQUlORVJfX05PREVTKTsKLQotCQlyb2xlTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX05PREUpOwotCi0JCXJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfVEFTS19DT01QT1NJVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLCBST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVgpOwotCi0JCXRhc2tOb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfTk9ERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza05vZGVFQ2xhc3MsIFRBU0tfTk9ERV9fSU5ERVgpOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERSk7Ci0KLQkJd29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERSk7Ci0KLQkJd29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0NPTVBPU0lURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3MsIFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWFic29sdXRlQmVuZHBvaW50RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEFCU09MVVRFX0JFTkRQT0lOVCk7Ci0JCXBvaW50RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFBPSU5UKTsKLQkJcm9sZURlc2NyaXB0b3JFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUk9MRV9ERVNDUklQVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVVtYVBhY2thZ2UgdGhlVW1hUGFja2FnZSA9IChVbWFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFVtYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJZGlhZ3JhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5vZGVDb250YWluZXIoKSk7Ci0JCWxpbmtFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMaW5rZWRPYmplY3QoKSk7Ci0JCW5hbWVkTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5vZGUoKSk7Ci0JCW5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMaW5rZWRPYmplY3QoKSk7Ci0JCWFjdGl2aXR5RGlhZ3JhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpYWdyYW0oKSk7Ci0JCXR5cGVkTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5vZGUoKSk7Ci0JCXdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtKCkpOwotCQl3b3JrUHJvZHVjdE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZE5vZGUoKSk7Ci0JCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpYWdyYW0oKSk7Ci0JCW5vZGVDb250YWluZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlKCkpOwotCQlyb2xlTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkTm9kZSgpKTsKLQkJcm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlQ29udGFpbmVyKCkpOwotCQl0YXNrTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkTm9kZSgpKTsKLQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkTm9kZSgpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWROb2RlKCkpOwotCQl3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5vZGVDb250YWluZXIoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhkaWFncmFtRUNsYXNzLCBEaWFncmFtLmNsYXNzLCAiRGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobGlua0VDbGFzcywgTGluay5jbGFzcywgIkxpbmsiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgIiIsIDAsIDEsIExpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZShnZXRMaW5rX1NvdXJjZSgpLCB0aGlzLmdldE5vZGUoKSwgdGhpcy5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSwgInNvdXJjZSIsIG51bGwsIDAsIDEsIExpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldExpbmtfVGFyZ2V0KCksIHRoaXMuZ2V0Tm9kZSgpLCB0aGlzLmdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpLCAidGFyZ2V0IiwgbnVsbCwgMCwgMSwgTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMaW5rX0JlbmRwb2ludHMoKSwgdGhpcy5nZXRBYnNvbHV0ZUJlbmRwb2ludCgpLCAiYmVuZHBvaW50cyIsIG51bGwsIDAsIC0xLCBMaW5rLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19Tb3VyY2VFbmRQb2ludCgpLCB0aGlzLmdldFBvaW50KCksICJzb3VyY2VFbmRQb2ludCIsIG51bGwsIDAsIDEsIExpbmsuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMaW5rX1RhcmdldEVuZFBvaW50KCksIHRoaXMuZ2V0UG9pbnQoKSwgInRhcmdldEVuZFBvaW50IiwgbnVsbCwgMCwgMSwgTGluay5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhsaW5rZWRPYmplY3RFQ2xhc3MsIExpbmtlZE9iamVjdC5jbGFzcywgIkxpbmtlZE9iamVjdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldExpbmtlZE9iamVjdF9MaW5rZWRFbGVtZW50KCksIHRoZVVtYVBhY2thZ2UuZ2V0TWV0aG9kRWxlbWVudCgpLCBudWxsLCAibGlua2VkRWxlbWVudCIsIG51bGwsIDAsIDEsIExpbmtlZE9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobmFtZWROb2RlRUNsYXNzLCBOYW1lZE5vZGUuY2xhc3MsICJOYW1lZE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWROb2RlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBOYW1lZE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG5vZGVFQ2xhc3MsIE5vZGUuY2xhc3MsICJOb2RlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Tm9kZV9Mb2NhdGlvbigpLCB0aGlzLmdldFBvaW50KCksICJsb2NhdGlvbiIsIG51bGwsIDAsIDEsIE5vZGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXROb2RlX1dpZHRoKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ3aWR0aCIsICItMSIsIDAsIDEsIE5vZGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldE5vZGVfSGVpZ2h0KCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJoZWlnaHQiLCAiLTEiLCAwLCAxLCBOb2RlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZShnZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKSwgdGhpcy5nZXRMaW5rKCksIHRoaXMuZ2V0TGlua19UYXJnZXQoKSwgImluY29taW5nQ29ubmVjdGlvbnMiLCBudWxsLCAwLCAtMSwgTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSwgdGhpcy5nZXRMaW5rKCksIHRoaXMuZ2V0TGlua19Tb3VyY2UoKSwgIm91dGdvaW5nQ29ubmVjdGlvbnMiLCBudWxsLCAwLCAtMSwgTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXROb2RlX1JlYWRPbmx5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVhZE9ubHkiLCBudWxsLCAwLCAxLCBOb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhhY3Rpdml0eURpYWdyYW1FQ2xhc3MsIEFjdGl2aXR5RGlhZ3JhbS5jbGFzcywgIkFjdGl2aXR5RGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3ModHlwZWROb2RlRUNsYXNzLCBUeXBlZE5vZGUuY2xhc3MsICJUeXBlZE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VHlwZWROb2RlX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBUeXBlZE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3MsIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uY2xhc3MsICJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdE5vZGVFQ2xhc3MsIFdvcmtQcm9kdWN0Tm9kZS5jbGFzcywgIldvcmtQcm9kdWN0Tm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdE5vZGVfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAidHlwZSIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0Tm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzLCBBY3Rpdml0eURldGFpbERpYWdyYW0uY2xhc3MsICJBY3Rpdml0eURldGFpbERpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtX0F1dG9MYXlvdXQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhdXRvTGF5b3V0IiwgbnVsbCwgMCwgMSwgQWN0aXZpdHlEZXRhaWxEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhub2RlQ29udGFpbmVyRUNsYXNzLCBOb2RlQ29udGFpbmVyLmNsYXNzLCAiTm9kZUNvbnRhaW5lciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE5vZGVDb250YWluZXJfTm9kZXMoKSwgdGhpcy5nZXROb2RlKCksIG51bGwsICJub2RlcyIsIG51bGwsIDAsIC0xLCBOb2RlQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhyb2xlTm9kZUVDbGFzcywgUm9sZU5vZGUuY2xhc3MsICJSb2xlTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mocm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MsIFJvbGVUYXNrQ29tcG9zaXRlLmNsYXNzLCAiUm9sZVRhc2tDb21wb3NpdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZVRhc2tDb21wb3NpdGVfUm93SW5kZXgoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInJvd0luZGV4IiwgbnVsbCwgMCwgMSwgUm9sZVRhc2tDb21wb3NpdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHRhc2tOb2RlRUNsYXNzLCBUYXNrTm9kZS5jbGFzcywgIlRhc2tOb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tOb2RlX0luZGV4KCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJpbmRleCIsICItMSIsIDAsIDEsIFRhc2tOb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFQ2xhc3MsIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuY2xhc3MsICJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVFQ2xhc3MsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcywgIldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3MsIFdvcmtQcm9kdWN0Q29tcG9zaXRlLmNsYXNzLCAiV29ya1Byb2R1Y3RDb21wb3NpdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGVfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAidHlwZSIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0Q29tcG9zaXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoYWJzb2x1dGVCZW5kcG9pbnRFRGF0YVR5cGUsIEFic29sdXRlQmVuZHBvaW50LmNsYXNzLCAiQWJzb2x1dGVCZW5kcG9pbnQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocG9pbnRFRGF0YVR5cGUsIFBvaW50LmNsYXNzLCAiUG9pbnQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocm9sZURlc2NyaXB0b3JFRGF0YVR5cGUsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAiUm9sZURlc2NyaXB0b3IiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvLyBNb2RlbFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9OYW1lZE5vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9OYW1lZE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ODRhNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTmFtZWROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZE5vZGVJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBOYW1lZE5vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlICAvLwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JcHJvdGVjdGVkIGNsYXNzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIHsKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJc2V0TmFtZShtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldE5vZGUoKSwgCi0JCQkJCQluZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQkJCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBOYW1lZE5vZGVJbXBsLnRoaXM7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBMaW5rIGFkZEluY29taW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHNvdXJjZSkgewotCQlOb2RlIHNyY05vZGUgPSBmaW5kTm9kZShzb3VyY2UpOwotCQlpZiAoc3JjTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQlsaW5rLnNldFRhcmdldCh0aGlzKTsKLQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvZiBzcmNOb2RlIGJlZm9yZSBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbGluawotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIFVNQSBkYXRhCi0JCS8vCi0JCU5vZGVJbXBsIHNyY05vZGVJbXBsID0gKE5vZGVJbXBsKSBzcmNOb2RlOwotCQlib29sZWFuIG5vdGlmeSA9IHNyY05vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlzcmNOb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlsaW5rLnNldFNvdXJjZShzcmNOb2RlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNyY05vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZmluZE5vZGUoTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50KSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwgbGlua2VkRWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgYWRkT3V0Z29pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCU5vZGUgdGFyZ2V0Tm9kZSA9IGZpbmROb2RlKHRhcmdldCk7Ci0JCWlmICh0YXJnZXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGluayBsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2YgdGFyZ2V0Tm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlSW1wbCBub2RlSW1wbCA9IChOb2RlSW1wbCkgdGFyZ2V0Tm9kZTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbGluay5zZXRUYXJnZXQodGFyZ2V0Tm9kZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJbGluay5zZXRTb3VyY2UodGhpcyk7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJLy8gbG9vayBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gd2l0aCBzb3VyY2UgYXMgbGlua2VkIG9iamVjdCBvZiB0aGUKLQkJLy8gc291cmNlIG5vZGUKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbAotCQkJCQkmJiBsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpID09IHNvdXJjZSkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHNvdXJjZU5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQkvLyBsb29rIGZvciB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiB3aXRoIHNvdXJjZSBhcyBsaW5rZWQgb2JqZWN0IG9mIHRoZQotCQkvLyBzb3VyY2Ugbm9kZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsCi0JCQkJCSYmIGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0T2JqZWN0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVHcmFwaGljYWxEYXRhKGxpbmspOwotCQkJCS8vIGRpc2FibGUgaW50ZXJuYWwgbm90aWZpY2F0aW9uIG9mIHRoZSBzb3VyY2Ugbm9kZQotCQkJCS8vCi0JCQkJTm9kZUltcGwgdGFyZ2V0Tm9kZSA9IChOb2RlSW1wbCkgbGluay5nZXRUYXJnZXQoKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IHRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQl0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCX0KLQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQlsaW5rLnNldE9iamVjdChudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0KLQkJaWYgKG5ld09iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkJLy8gdXNlIHByZXNlbnRhdGlvbiBuYW1lCi0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgbmV3T2JqZWN0OwotCQkJbmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gaWYgaXQncyBibGFuayB0aGVuIHVzZSBuYW1lCi0JCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBuZXdPYmplY3Q7Ci0JCQluYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQotCQl0aGlzLm5hbWUgPSBuYW1lOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2Jhc2ljU2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlzdXBlci5iYXNpY1NldE9iamVjdChuZXdPYmplY3QpOwotCi0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSBuZXdPYmplY3QpKSB7Ci0JCQkvLyBsaXN0ZW4gdG8gY2hhbmdlIGluIHRoZSBiYXNlCi0JCQkvLwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgbmV3T2JqZWN0KQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCWlmIChiYXNlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJCQliYXNlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJCQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBnZXRPYmplY3QoKTsKLQkJCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhlLmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCQkJCQkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJCQkJCQkJCW5hbWUgPSBtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKTsKLQkJCQkJCQkJCWlmICghbmFtZS5lcXVhbHMob2xkTmFtZSkpIHsKLQkJCQkJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCQkJCQlOYW1lZE5vZGVJbXBsLnRoaXMsIC0xLAotCQkJCQkJCQkJCQlNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRSwKLQkJCQkJCQkJCQkJb2xkTmFtZSwgbmFtZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQkJYmFzZS5lQWRhcHRlcnMoKS5hZGQoYmFzZUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNkaXNwb3NlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBnZXRPYmplY3QoKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAoYmFzZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlvYmouZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2NyZWF0ZU5vZGVBZGFwdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQkJcmV0dXJuOwotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTmFtZWROb2RlLmNsYXNzKSkgewotCQkJCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUCi0JCQkJCQkJCSYmIGdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCVN0cmluZyBuZXdOYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKChCcmVha2Rvd25FbGVtZW50KSBnZXRPYmplY3QoKSk7Ci0JCQkJCQkJZS5zZXRQcmVzZW50YXRpb25OYW1lKG5ld05hbWUpOwotCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsoZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJCWUuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJCX0KLQotCQkJfQotCQl9OwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gbm90aWZpY2F0aW9uRW5hYmxlZCkgewotCQl0aGlzLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZmljYXRpb25FbmFibGVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NlZCgpIHsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBnZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJaWYgKHN1cHByZXNzaW9uICE9IG51bGwpIHsKLQkJCU9iamVjdCBvID0gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIgOiBnZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKG8pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRXcmFwcGVyKCkgewotCQlyZXR1cm4gaXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGl0ZW0gcHJvdmlkZXIgZm9yIHRoZSB0aGlzIG5vZGUgaWYgdGhlcmUgaXMgYSByZWFkLW9ubHkgd3JhcHBlcgotCSAqIGZvciB0aGUgbm9kZSBpbiB0aGUgZ2l2ZW4gZWxlbWVudCBjb2xsZWN0aW9uCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gYWxsRWxlbWVudHMKLQkgKi8KLQl2b2lkIHNldEl0ZW1Qcm92aWRlcihDb2xsZWN0aW9uIGFsbEVsZW1lbnRzKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRFbGVtZW50KGFsbEVsZW1lbnRzLAotCQkJCWdldE9iamVjdCgpKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQlpdGVtUHJvdmlkZXIgPSB3cmFwcGVyOwotCQkJCXJlYWRPbmx5ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQWRhcHRlckltcGwgYmFzZUxpc3RlbmVyOwotCi0JLyoqCi0JICogSXRlbSBwcm92aWRlciBvZiB0aGUgbGlua2VkIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXI7Ci0KLX0gLy8gTmFtZWROb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUNvbnRhaW5lckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVDb250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGYyMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUNvbnRhaW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob2RlIENvbnRhaW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlQ29udGFpbmVySW1wbCNnZXROb2RlcyA8ZW0+Tm9kZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlQ29udGFpbmVySW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMKLQkJTm9kZUNvbnRhaW5lciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZXMoKSA8ZW0+Tm9kZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Tm9kZT4gbm9kZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVDb250YWluZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PE5vZGU+IGdldE5vZGVzKCkgewotCQlpZiAobm9kZXMgPT0gbnVsbCkgewotCQkJbm9kZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8Tm9kZT4oTm9kZS5jbGFzcywgdGhpcywgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUyk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5vZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCXJldHVybiBnZXROb2RlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCWdldE5vZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXROb2RlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTm9kZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQkJZ2V0Tm9kZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCXJldHVybiBub2RlcyAhPSBudWxsICYmICFub2Rlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNzZXRSZWFkT25seShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gbmV3UmVhZE9ubHkpIHsKLQkJc3VwZXIuc2V0UmVhZE9ubHkobmV3UmVhZE9ubHkpOwotCQlpZiAobmV3UmVhZE9ubHkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBjaGlsZCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQljaGlsZC5zZXRSZWFkT25seShuZXdSZWFkT25seSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVtb3ZlZE5vZGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJhY2tUb0RpYWdyYW0oQ29sbGVjdGlvbiByZW1vdmVkTm9kZXMpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cyA9IGRpYWdyYW0uZ2V0QWxsQnJlYWtkb3duRWxlbWVudHModHJ1ZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmICghYnJlYWtkb3duRWxlbWVudHMuY29udGFpbnMobm9kZS5nZXRPYmplY3QoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCS8vIHsKLQkJLy8gT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJLy8gaWYobm9kZSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKXsKLQkJLy8gTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZSlub2RlKS5nZXROb2RlcygpOwotCQkvLyBib29sZWFuIGRlc3Ryb3kgPSB0cnVlOwotCQkvLyBmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkvLyBPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZihvYmogaW5zdGFuY2VvZiBUYXNrTm9kZSkgZGVzdHJveSA9IGZhbHNlOwotCQkvLyB9Ci0JCS8vIGlmKGRlc3Ryb3kpIGl0ZXIucmVtb3ZlKCk7Ci0JCS8vIH0KLQkJLy8gfQotCQlpZiAoIXJlbW92ZWROb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5hZGRBbGwocmVtb3ZlZE5vZGVzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3ROb2RlcyhDb2xsZWN0aW9uIG5vZGVzKSB7Ci0JCWlmICghbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBpdGVyLm5leHQoKTsKLQkJCQlub2RlLnZpc2libGUgPSB0cnVlOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBpdGVyLm5leHQoKTsKLQkJCQlpZighbm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCQkJbm9kZS52aXNpYmxlID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBpdGVyLm5leHQoKTsKLQkJCQlub2RlLnZpc2libGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkaXNwb3NlIGFsbCBub2RlcwotCQkvLwotCQlmb3IgKE9iamVjdCBub2RlIDogbmV3IEFycmF5TGlzdDxOb2RlPihub2RlcykpIHsJCQotCQkJKChOb2RlSW1wbClub2RlKS5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi19IC8vIE5vZGVDb250YWluZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Ob2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5ZjU3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsLk1ldGhvZEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSU5vZGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0SW5jb21pbmdDb25uZWN0aW9ucyA8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucyA8ZW0+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjaXNSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUltcGwgZXh0ZW5kcyBMaW5rZWRPYmplY3RJbXBsIGltcGxlbWVudHMgTm9kZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUG9pbnQgTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGxvY2F0aW9uID0gTE9DQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2lkdGgoKSA8ZW0+V2lkdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgV0lEVEhfRURFRkFVTFQgPSAtMTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgd2lkdGggPSBXSURUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWlnaHQoKSA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBIRUlHSFRfRURFRkFVTFQgPSAtMTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIZWlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaGVpZ2h0ID0gSEVJR0hUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpIDxlbT5JbmNvbWluZyBDb25uZWN0aW9uczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PExpbms+IGluY29taW5nQ29ubmVjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkgPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TGluaz4gb3V0Z29pbmdDb25uZWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFEX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVhZE9ubHkoKSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHkgPSBSRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbm9kZUFkYXB0ZXI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgbmV3TG9jYXRpb24pIHsKLQkJUG9pbnQgb2xkTG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OLCBvbGRMb2NhdGlvbiwgbG9jYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHdpZHRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgbmV3V2lkdGgpIHsKLQkJaW50IG9sZFdpZHRoID0gd2lkdGg7Ci0JCXdpZHRoID0gbmV3V2lkdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSCwgb2xkV2lkdGgsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gaGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IG5ld0hlaWdodCkgewotCQlpbnQgb2xkSGVpZ2h0ID0gaGVpZ2h0OwotCQloZWlnaHQgPSBuZXdIZWlnaHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQsIG9sZEhlaWdodCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxMaW5rPiBnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkgewotCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlpbmNvbWluZ0Nvbm5lY3Rpb25zID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PExpbms+KExpbmsuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCk7Ci0JCX0KLQkJcmV0dXJuIGluY29taW5nQ29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxMaW5rPiBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkgewotCQlpZiAob3V0Z29pbmdDb25uZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlvdXRnb2luZ0Nvbm5lY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q8TGluaz4oTGluay5jbGFzcywgdGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TLCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFKTsKLQkJfQotCQlyZXR1cm4gb3V0Z29pbmdDb25uZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdpZHRoOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHdpZHRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWlnaHQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaGVpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFkT25seTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZWFkT25seSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgaW5jb21pbmcgY29ubmVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBsaW5rCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAobGluay5nZXRUYXJnZXQoKSA9PSBudWxsIHx8IGxpbmsuZ2V0U291cmNlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5hZGRHcmFwaGljYWxEYXRhKGxpbmspOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgb3V0Z29pbmcgY29ubmVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBsaW5rCi0JICogQHBhcmFtIG9sZFNvdXJjZQotCSAqIEBwYXJhbSBvbGRUYXJnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhDb25uZWN0b3JQYWlyKG9sZFNvdXJjZS5nZXRHcmFwaE5vZGUoKSwKLQkJLy8gb2xkVGFyZ2V0LmdldEdyYXBoTm9kZSgpKTsKLQkJCi0JCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGdldFVNQURpYWdyYW0oKSB7Ci0JCWlmIChnZXREaWFncmFtKCkgPT0gbnVsbCkKLQkJCXJldHVybiB1bWFEaWFncmFtOwotCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpLmdldFVNQURpYWdyYW0oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlIGdldFVNQUNvbnRhaW5lcigpIHsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gdW1hQ29udGFpbmVyOwotCQlyZXR1cm4gY29udGFpbmVyLmdldEdyYXBoTm9kZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNzZXRVTUFDb250YWluZXIob3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VU1BQ29udGFpbmVyKEdyYXBoTm9kZSB1bWFDb250YWluZXIpIHsKLQkJdGhpcy51bWFDb250YWluZXIgPSB1bWFDb250YWluZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eU5vZGUjc2V0VU1BRGlhZ3JhbShvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VU1BRGlhZ3JhbShvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gdW1hRGlhZ3JhbSkgewotCQl0aGlzLnVtYURpYWdyYW0gPSB1bWFEaWFncmFtOwotCQl1bWFDb250YWluZXIgPSB1bWFEaWFncmFtOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBOb2RlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJCWdldEdyYXBoTm9kZSgpLmdldFNpemUoKS5zZXRXaWR0aCgKLQkJCQkJCW5ldyBEb3VibGUobXNnLmdldE5ld0ludFZhbHVlKCkpKTsKLQkJCQlyZXR1cm47Ci0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoKLQkJCQlpZiAoZ2V0R3JhcGhOb2RlKCkgIT0gbnVsbCkgewotCQkJCQlnZXRHcmFwaE5vZGUoKS5nZXRTaXplKCkuc2V0SGVpZ2h0KAotCQkJCQkJCW5ldyBEb3VibGUobXNnLmdldE5ld0ludFZhbHVlKCkpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCi0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlpZiAoZ2V0R3JhcGhOb2RlKCkgIT0gbnVsbCAmJiBtc2cuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJCVBvaW50IHAgPSAoUG9pbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlnZXRHcmFwaE5vZGUoKS5nZXRQb3NpdGlvbigpLnNldFgobmV3IERvdWJsZShwLngpKTsKLQkJCQkJZ2V0R3JhcGhOb2RlKCkuZ2V0UG9zaXRpb24oKS5zZXRZKG5ldyBEb3VibGUocC55KSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJTGluayBsaW5rOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlsaW5rID0gKExpbmspIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlhZGRUb1VNQShsaW5rKTsKLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCWFkZFRvVU1BKChMaW5rKSBpdGVyLm5leHQoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlsaW5rID0gKExpbmspIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQkoKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpKS5yZW1vdmVGcm9tVU1BKGxpbmssIGxpbmsKLQkJCQkJCQkJLmdldFNvdXJjZSgpLCAoTm9kZSkgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCWxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQkJKChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLAotCQkJCQkJCQkJbGluay5nZXRTb3VyY2UoKSwgKE5vZGUpIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWxpbmsgPSAoTGluaykgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJCSgoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCkpLmFkZFRvVU1BKGxpbmspOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCWxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJKChOb2RlSW1wbCkgbGluay5nZXRUYXJnZXQoKSkuYWRkVG9VTUEobGluayk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlsaW5rID0gKExpbmspIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCQlyZW1vdmVGcm9tVU1BKGxpbmssIChOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSwgbGluawotCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCWxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJcmVtb3ZlRnJvbVVNQShsaW5rLCAoTm9kZSkgbXNnLmdldE5vdGlmaWVyKCksIGxpbmsKLQkJCQkJCQkJCS5nZXRUYXJnZXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJldHVybjsKLQotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgZ3JhcGhub2RlIGRhdGEgYW5kIGFzc29jaWF0ZXMgdGhlIGFkYXB0ZXJzLgotCSAqIEBwYXJhbSBuZXdPYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCWlmIChuZXdPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLm9iamVjdCA9IG5ld09iamVjdDsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG5ld09iamVjdDsKLQkJCi0JCWdyYXBoTm9kZSA9IGdldEdyYXBoTm9kZShlbGVtZW50KTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGVJbXBsLnNldE9iamVjdCgpOiBlbGVtZW50OiAnIiArCi0JCS8vIGVsZW1lbnQuZ2V0TmFtZSgpICsgIicsIGdyYXBoTm9kZTogIiArIGdyYXBoTm9kZSk7Ci0KLQkJaWYoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCS8vIHBvcHVsYXRlL3N5bmNoIGRhdGEKLQkJCS8vCi0JCQlpZiAoaGVpZ2h0ID09IEhFSUdIVF9FREVGQVVMVCkgewotCQkJCXNldEhlaWdodChncmFwaE5vZGUuZ2V0U2l6ZSgpLmdldEhlaWdodCgpLmludFZhbHVlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlncmFwaE5vZGUuZ2V0U2l6ZSgpLnNldEhlaWdodChuZXcgRG91YmxlKGhlaWdodCkpOwotCQkJfQotCi0JCQlpZiAod2lkdGggPT0gV0lEVEhfRURFRkFVTFQpIHsKLQkJCQlzZXRXaWR0aChncmFwaE5vZGUuZ2V0U2l6ZSgpLmdldFdpZHRoKCkuaW50VmFsdWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWdyYXBoTm9kZS5nZXRTaXplKCkuc2V0V2lkdGgobmV3IERvdWJsZSh3aWR0aCkpOwotCQkJfQotCi0JCQlpZiAobG9jYXRpb24gPT0gTE9DQVRJT05fRURFRkFVTFQpIHsKLQkJCQlzZXRMb2NhdGlvbihHcmFwaGljYWxEYXRhSGVscGVyLnRvUG9pbnQoZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkuc2V0WChuZXcgRG91YmxlKGxvY2F0aW9uLngpKTsKLQkJCQlncmFwaE5vZGUuZ2V0UG9zaXRpb24oKS5zZXRZKG5ldyBEb3VibGUobG9jYXRpb24ueSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIG1ldGhvZEVsZW1lbnRBZGFwdGVyCi0JCS8vCi0JCWdldE1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCWlmIChtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsICYmICFlbGVtZW50LmVBZGFwdGVycygpLmNvbnRhaW5zKG1ldGhvZEVsZW1lbnRBZGFwdGVyKSkgewotCQkJZWxlbWVudC5lQWRhcHRlcnMoKS5hZGQobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCQl9Ci0KLQkJaWYobm9kZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcigpOwotCQl9Ci0JCWlmKG5vZGVBZGFwdGVyICE9IG51bGwgJiYgIWVBZGFwdGVycygpLmNvbnRhaW5zKG5vZGVBZGFwdGVyKSkgewotCQkJZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJfQotCQkJCQotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlzZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIGV4dGVuZHMgQWRhcHRlckltcGwgCi0JaW1wbGVtZW50cyBJTm9kZUNoYW5nZUxpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUikgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldE5vZGUoKSwgCi0JCQkJCQluZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQkJCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpOwotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gTm9kZUltcGwudGhpczsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHRoYXQgd2lsbCBzeW5jaHJvbml6ZQotCSAqIHRoZSBjaGFuZ2UgZnJvbSBtZXRob2QgZWxlbWVudCB0byB0aGUgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgZWxlbWVudCBhZGFwdGVyIG9mIHRoaXMgbm9kZQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50QWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlyZXR1cm4gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRHcmFwaE5vZGUoCi0JCQkJCWdldFVNQURpYWdyYW0oKSwgbWV0aG9kRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwjc2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCQotCQliYXNpY1NldE9iamVjdChuZXdPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKCkgewotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCS8vIFRPRE86IGZvcmNlIHN1YmNsYXNzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBJTm9kZUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXREaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlFT2JqZWN0IHBhcmVudCA9IGVDb250YWluZXI7Ci0JCWZvciAoOyBwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIERpYWdyYW0pOyBwYXJlbnQgPSBwYXJlbnQKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJcmV0dXJuIChEaWFncmFtKSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI3NldERpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNhZGRDb25zdW1lcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQlpZiAoIWNvbnN1bWVycy5jb250YWlucyhjb25zdW1lcikpIHsKLQkJCWNvbnN1bWVycy5hZGQoY29uc3VtZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI3JlbW92ZUNvbnN1bWVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWNvbnN1bWVycy5yZW1vdmUoY29uc3VtZXIpOwotCQlpZiAoY29uc3VtZXJzLmlzRW1wdHkoKSkgewotCQkJLy8gbm8gbW9yZSBjb25zdW1lciBvZiB0aGlzIG5vZGUsIGl0IHNob3VsZCBiZSBkaXNwb3NlZAotCQkJZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ2V0T2JqZWN0KCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJCX0KLQkJfQotCi0JCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCWVBZGFwdGVycygpLnJlbW92ZShub2RlQWRhcHRlcik7Ci0JCX0KLQotCQl1bWFDb250YWluZXIgPSBudWxsOwotCQl1bWFEaWFncmFtID0gbnVsbDsKLQkJZ3JhcGhOb2RlID0gbnVsbDsKLQkJCi0JCWlmKG91dGdvaW5nQ29ubmVjdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChPYmplY3QgbGluayA6IG91dGdvaW5nQ29ubmVjdGlvbnMpIHsKLQkJCQkoKExpbmspbGluaykuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JCWJvb2xlYW4gb2xkUmVhZE9ubHkgPSByZWFkT25seTsKLQkJcmVhZE9ubHkgPSBuZXdSZWFkT25seTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWSwgb2xkUmVhZE9ubHksIHJlYWRPbmx5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikoSW50ZXJuYWxFTGlzdDw/PilnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikoSW50ZXJuYWxFTGlzdDw/PilnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFdpZHRoKCkpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRIZWlnaHQoKSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuIGdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCQlyZXR1cm4gaXNSZWFkT25seSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKChQb2ludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJc2V0V2lkdGgoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6Ci0JCQkJc2V0SGVpZ2h0KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTGluaz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCWdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpbms+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKExPQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCQlzZXRXaWR0aChXSURUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXNldEhlaWdodChIRUlHSFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCWdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCWdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCQlzZXRSZWFkT25seShSRUFEX09OTFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCQkJcmV0dXJuIExPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvbiAhPSBudWxsIDogIUxPQ0FUSU9OX0VERUZBVUxULmVxdWFscyhsb2NhdGlvbik7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCQlyZXR1cm4gd2lkdGggIT0gV0lEVEhfRURFRkFVTFQ7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6Ci0JCQkJcmV0dXJuIGhlaWdodCAhPSBIRUlHSFRfRURFRkFVTFQ7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gaW5jb21pbmdDb25uZWN0aW9ucyAhPSBudWxsICYmICFpbmNvbWluZ0Nvbm5lY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiBvdXRnb2luZ0Nvbm5lY3Rpb25zICE9IG51bGwgJiYgIW91dGdvaW5nQ29ubmVjdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJCXJldHVybiByZWFkT25seSAhPSBSRUFEX09OTFlfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSB1bWFDb250YWluZXI7Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSB1bWFEaWFncmFtOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlIGdyYXBoTm9kZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCi0JcHJvdGVjdGVkIElOb2RlQ2hhbmdlTGlzdGVuZXIgbWV0aG9kRWxlbWVudEFkYXB0ZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLQkKLQkvKioKLQkgKiBhZGREZWZhdWx0V29ya09yZGVyIGlzIG1vdmVkIGZyb20KLQkgKiBHcmFwaGljYWxEYXRhSGVscGVyLmFkZERlZmF1bHRXb3JrT3JkZXIoTmFtZWROb2RlSW1wbCwKLQkgKiBXb3JrYnJlYWtkb3duRWxlbWVudCkgTWV0aG9kIHdpbGwgc2V0IG5vdGlmaWNhdGlvbkVuYWJsZWQgZmxhZyB0byBmYWxzZQotCSAqIG9mIGFsbCBhZGFwdGVycyBvZiB0eXBlIE1ldGhvZEVsZW1lbnRBZGFwdGVyIG9mIFN1Y2Nlc3NvciBvYmplY3QgYmVmb3JlCi0JICogY3JlYXRpbmcgYSBXb3JrT3JkZXIgb2JqZWN0LiBBZnRlciBjcmVhdGlvbiBvZiBXb3JrT3JkZXIgKFByZWRlY2Vzc29yCi0JICogbGluaykgcmVzdG9yZXMgdGhlIG5vdGlmaWNhdGlvbkVuYWJsZWQgZmxhZyBvZiBTdWNjZXNzb3IncyBhZGFwdGVycyBvZgotCSAqIHR5cGUgTWV0aG9kRWxlbWVudEFkYXB0ZXIuCi0JICogCi0JICogZWc6IElmIGFuIEFjdGl2aXR5ICJhY3RBIiBpcyBleHRlbmRlZCBpbiBhbm90aGVyIENQLiBCYXNlICJhY3RBIiBBRAotCSAqIGRpYWdyYW0gaXMgb3BlbmVkLCBhbmQgRXh0ZW5kZWQgImFjdEEiIEFEIERpYWdyYW0gaXMgb3BlbmVkLiBPbiBjcmVhdGluZwotCSAqIHByZWRlY2Vzc29yIGxpbmsgYmV0d2VlbiBhbnkgdHdvIGNoaWxkIGFjdGl2aXRpZXMsIGNyZWF0ZXMgYSBleHRyYSBsaW5rCi0JICogaW4gRXh0ZW5kZWQgImFjdEEiIEFEIGRpYWdyYW0sIGJlY2F1c2UgY3JlYXRpbmcgd29ya29yZGVyIHdpbGwgbm90aWZ5IHRoZQotCSAqIGV4dGVuZGVkICJhY3RBIiBkaWFncmFtIHRvIGRyYXcgYSBsaW5rLiBUbyBhdm9pZCBkdXBsaWNhdGUgbGlua3MgaW4gdGhlCi0JICogZXh0ZW5kZWQgYWN0aXZpdHkgZGlhZ3JhbSwgd2UgaGF2ZSB0byBzZXQgbm90aWZpY2F0aW9uRW5hYmxlZCBmbGFnIHRvCi0JICogZmFsc2UsIGJlZm9yZSBjcmVhdGluZyBhIFdvcmtPcmRlciBvYmplY3QuCi0JICogCi0JICovCi0JcHVibGljIFdvcmtPcmRlciBhZGREZWZhdWx0V29ya09yZGVyKE5hbWVkTm9kZUltcGwgbm9kZSwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRCcmVha2Rvd25FbGVtZW50KSB7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgbGlzdCA9ICgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCkpLmVBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGFwdGVyKSB7Ci0JCQkJTm9kZUltcGwgbm9kZW9iaiA9IChOb2RlSW1wbCkgKChNZXRob2RFbGVtZW50QWRhcHRlcikgb2JqKQotCQkJCQkJLmdldE5vZGUoKTsKLQkJCQlib29sZWFuIHByZWROb3RpZmljYXRpb24gPSBub2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJKChOb2RlSW1wbCkgKCgoTWV0aG9kRWxlbWVudEFkYXB0ZXIpIG9iaikuZ2V0Tm9kZSgpKSkubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCW1hcC5wdXQobm9kZW9iaiwgbmV3IEJvb2xlYW4ocHJlZE5vdGlmaWNhdGlvbikpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuIFVtYVV0aWwuY3JlYXRlRGVmYXVsdFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJLmdldE9iamVjdCgpLCBwcmVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZ5KTsKLQkJCVNldCBzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KG9iamVjdCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJYm9vbGVhbiBwcmVkbm90ID0gKChCb29sZWFuKSBvYmopLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkoKE5vZGVJbXBsKSBvYmplY3QpLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBwcmVkbm90OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpIHsKLQkJRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQlyZXR1cm4gZGlhZ3JhbS5pc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0JCXJldHVybiB2aXNpYmxlIDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBub3RpZmljYXRpb25FbmFibGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkKSB7Ci0JCXRoaXMubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JfQotCQotfSAvLyBOb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZU5vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Sb2xlTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwMjAwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Sb2xlTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMgUm9sZU5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBSb2xlTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlJPTEVfTk9ERTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFJvbGVEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBSb2xlRGVzY3JpcHRvckFkYXB0ZXIuY2xhc3M7Ci0JfQotfSAvLyBSb2xlTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZVRhc2tDb21wb3NpdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjVkMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZVRhc2tDb21wb3NpdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBUYXNrIENvbXBvc2l0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlVGFza0NvbXBvc2l0ZUltcGwjZ2V0Um93SW5kZXggPGVtPlJvdyBJbmRleDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlSW1wbCBleHRlbmRzIE5vZGVDb250YWluZXJJbXBsIGltcGxlbWVudHMKLQkJUm9sZVRhc2tDb21wb3NpdGUgewotCQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3dJbmRleCgpIDxlbT5Sb3cgSW5kZXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvd0luZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBST1dfSU5ERVhfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um93SW5kZXgoKSA8ZW0+Um93IEluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3dJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCByb3dJbmRleCA9IFJPV19JTkRFWF9FREVGQVVMVDsKLQotLy8JcHJpdmF0ZSBpbnQgcm93SW5kZXg7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFJvbGVUYXNrQ29tcG9zaXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9UQVNLX0NPTVBPU0lURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJvd0luZGV4KCkgewotCQlyZXR1cm4gcm93SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um93SW5kZXgoaW50IG5ld1Jvd0luZGV4KSB7Ci0JCWludCBvbGRSb3dJbmRleCA9IHJvd0luZGV4OwotCQlyb3dJbmRleCA9IG5ld1Jvd0luZGV4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYLCBvbGRSb3dJbmRleCwgcm93SW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVg6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFJvd0luZGV4KCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVg6Ci0JCQkJc2V0Um93SW5kZXgoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXNldFJvd0luZGV4KFJPV19JTkRFWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVg6Ci0JCQkJcmV0dXJuIHJvd0luZGV4ICE9IFJPV19JTkRFWF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvd0luZGV4OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJvd0luZGV4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhDb2xsZWN0aW9uIG1peGVkQ29sbGVjdGlvbiwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWl4ZWRDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYoIGVsZW1lbnQgPT0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpICkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjc2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCXBvcHVsYXRlTm9kZXMobmV3T2JqZWN0KTsKLS8vCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLS8vCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIG5ld09iamVjdDsKLS8vCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLS8vCQkJQ29sbGVjdGlvbiBhbGxFbGVtZW50cyA9IGRpYWdyYW0uZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJTGlzdCBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzY3JpcHRvcik7Ci0vLwkJCWlmICghcHJpbWFyeVRhc2tEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsgLy8gb3ZlcnJpZGluZwotLy8JCQkJCQkJCQkJCQkJCQkJCQotLy8JCQkJLy8gdXNlIGxpc3QgdG8gbWFpbnRhaW4gb3JkZXIgb2YKLS8vCQkJCS8vIHRhc2tkZXNjcmlwdG9ycy4KLS8vCQkJCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJdGFza0Rlc2NyaXB0b3JzLmFkZEFsbChwcmltYXJ5VGFza0Rlc2NyaXB0b3JzKTsKLS8vCQkJCS8vIHRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocm9sZURlc2NyaXB0b3IuZ2V0UGVyZm9ybXNBZGRpdGlvbmFsbHkoKSk7Ci0vLwkJCQkvLyB0YXNrRGVzY3JpcHRvcnMuYWRkQWxsKHJvbGVEZXNjcmlwdG9yLmdldEFzc2lzdHNJbigpKTsKLS8vCi0vLwkJCQlIYXNoU2V0IHNlbGVjdGVkRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotLy8JCQkJTGlzdCB0YXNrTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkKLS8vCQkJCVN0cmluZyBhdXRvbGF5b3V0ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRBdXRvTGF5b3V0RmxhZygoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKSk7IAotLy8JCQkJaWYoYXV0b2xheW91dCAhPSBudWxsKXsKLS8vCQkJCQlpbnQgaW5kZXggPSAwOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0vLwkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotLy8JCQkJCQkJCSYmIFRuZ1V0aWwuY29udGFpbnModGFza0Rlc2NyaXB0b3JzLCBvYmopKSB7Ci0vLwkJCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotLy8KLS8vCQkJCQkJCS8vIGVsaW1pbmF0ZSBkZXNjcmlwdG9yIHRoYXQgaXMgZHVwbGljYXRlLAotLy8JCQkJCQkJLy8gc3VwcHJlc3NlZCBvciBmaWx0ZXJlZCBvdXQKLS8vCQkJCQkJCS8vCi0vLwkJCQkJCQlpZiAoIXNlbGVjdGVkRGVzY3JpcHRvcnMuY29udGFpbnModGFza0Rlc2NyaXB0b3IpCi0vLwkJCQkJCQkvLyAmJiBjb250YWlucyhhbGxFbGVtZW50cywgdGFza0Rlc2NyaXB0b3IpIC8vIG1ha2UKLS8vCQkJCQkJCS8vIHN1cmUgdGhhdCB0YXNrIGRlc2NyaXB0b3IgaXMgb2YgdGhlIG93bmluZwotLy8JCQkJCQkJLy8gYWN0aXZpdHkKLS8vCQkJCQkJCSkgewotLy8JCQkJCQkJCXNlbGVjdGVkRGVzY3JpcHRvcnMuYWRkKHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotLy8JCQkJCQkJCQkJdGhpcywgdGFza0Rlc2NyaXB0b3IsCi0vLwkJCQkJCQkJCQlUYXNrTm9kZS5jbGFzcyk7Ci0vLwkJCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotLy8JCQkJCQkJCQlub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotLy8JCQkJCQkJCQkJCS5jcmVhdGVUYXNrTm9kZSgpOwotLy8JCQkJCQkJCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQkJCQkJCQkJbm9kZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotLy8JCQkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpCi0vLwkJCQkJCQkJCQkJLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJCQkJCWlmKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksIAotLy8JCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCkgPT0gbnVsbAotLy8JCQkJCQkJCQkJCXx8IEdyYXBoaWNhbERhdGFIZWxwZXIuaXNBdXRvTGF5b3V0KChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpKSl7Ci0vLwkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUKLS8vCQkJCQkJCQkJCQkuZ2V0R3JhcGhOb2RlKCksCi0vLwkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLAotLy8JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGluZGV4KS50b1N0cmluZygpKTsKLS8vCQkJCQkJCQkJCWluZGV4Kys7Ci0vLwkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCi0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQkJLy8gU29ydCB0aGUgdGFza05vZGUgYmFzZWQgb24gdGhlaXIgaW5kZXggaWYgYXV0b2xheW91dCBpcwotLy8JCQkJCS8vIGZhbHNlCi0vLwkJCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRQotLy8JCQkJCQkJLmVxdWFscyhhdXRvbGF5b3V0KSkgewotLy8JCQkJCQlDb2xsZWN0aW9ucy5zb3J0KHRhc2tOb2RlcywgY29tcGFyYXRvcik7Ci0vLwkJCQkJfQotLy8JCQkgIH1lbHNlewotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQkKLS8vCQkJCQkJLy8gZWxpbWluYXRlIGRlc2NyaXB0b3IgdGhhdCBpcyBkdXBsaWNhdGUsIHN1cHByZXNzZWQgb3IgZmlsdGVyZWQgb3V0Ci0vLwkJCQkJCS8vCi0vLwkJCQkJCWlmKCFzZWxlY3RlZERlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKQotLy8JCQkJCQkJCSYmIGNvbnRhaW5zKGFsbEVsZW1lbnRzLCB0YXNrRGVzY3JpcHRvcikgLy8gbWFrZSBzdXJlIHRoYXQgdGFzayBkZXNjcmlwdG9yIGlzIG9mIHRoZSBvd25pbmcgYWN0aXZpdHkKLS8vCQkJCQkJKSB7Ci0vLwkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7CQkJCQkKLS8vCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksCi0vLwkJCQkJCQkJCXRhc2tEZXNjcmlwdG9yLCBUYXNrTm9kZS5jbGFzcyk7Ci0vLwkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLS8vCQkJCQkJCW5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0vLwkJCQkJCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQkJCQkJCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLS8vCQkJCQkJfQotLy8JCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJaWYoIXRhc2tOb2Rlcy5pc0VtcHR5KCkpIHsKLS8vCQkJCQkvLyBhZGQgcm9sZSBub2RlCi0vLwkJCQkJLy8KLS8vCQkJCQlOb2RlIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlTm9kZSgpOwotLy8JCQkJCW5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotLy8JCQkJCW5vZGUuc2V0T2JqZWN0KHJvbGVEZXNjcmlwdG9yKTsKLS8vCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0vLwkJCQkJLy8gYWRkIHRhc2sgbm9kZXMKLS8vCQkJCQkvLwotLy8JCQkJCWdldE5vZGVzKCkuYWRkQWxsKHRhc2tOb2Rlcyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJCi0JfQotCQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlpZiAoZ2V0VU1BRGlhZ3JhbSgpID09IG51bGwpIHsKLQkJCQkvLyBuZXcgTWV0aG9kRWxlbWVudAotCQkJCS8vCi0JCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJfQotCQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwgbWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJCS8vIGNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBnZXRVTUFEaWFncmFtKCkpOwotCQkJCWdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgYXV0b2xheW91dCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXREaWFncmFtKCkpOwotCQkJaWYoYXV0b2xheW91dCAhPSBudWxsKXsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUsIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgbmV3IEludGVnZXIocm93SW5kZXgpLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBmaW5kR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG1ldGhvZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCSYmIG1ldGhvZEVsZW1lbnQgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpKSB7Ci0KLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KGVsZW1lbnQsIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCk7Ci0JCQkJCi0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGluZGV4ID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKGluZGV4ICE9IG51bGwpIHsKLQkJCQkJCWlmIChnZXRSb3dJbmRleCgpID09IG5ldyBJbnRlZ2VyKGluZGV4KS5pbnRWYWx1ZSgpKQotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQl9Ci0JCQkJfWVsc2V7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwlwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKGVsZW1lbnQpOwotLy8JCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkobm9kZSwKLS8vCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgbmV3IEludGVnZXIocm93SW5kZXgpCi0vLwkJCQkJCS50b1N0cmluZygpKTsKLS8vCQlyZXR1cm4gbm9kZTsKLS8vCX0KLQkKLQlwcml2YXRlIGNsYXNzIFJvbGVEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayB7Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZihtc2cgaW5zdGFuY2VvZiBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24pIHsKLQkJCQlPYmplY3QgZmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKW1zZykuZ2V0T3Bwc2l0ZUZlYXR1cmUoKTsKLQkJCQlpZihmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMpIHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJYWRkTm9kZSgoVGFza0Rlc2NyaXB0b3IpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlyZW1vdmVOb2RlKG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWFkZE5vZGUoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCXJlbW92ZU5vZGUoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNT1ZFRUVFRUVFRCIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCWlmKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJSb2xlVGFza0NvbXBvc2l0ZUltcGwucmVtb3ZlTm9kZSgpOiBbRVJST1JdIG5vIGRpYWdyYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlZE5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgUm9sZU5vZGUpIHsKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpZ2V0RGlhZ3JhbSgpOwotCQkJCQlMaXN0IGxpc3QgPSBkLmdldFJlYWxpemVkUHJpbWFyeVRhc2tEZXNjcmlwdG9ycygoUm9sZURlc2NyaXB0b3IpIG5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3Quc2l6ZSgpIDwgMSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCXJlbW92ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobm9kZS5nZXRPYmplY3QoKSA9PSBvbGRWYWx1ZSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmVtb3ZlZE5vZGVzLmFkZChub2RlKTsKLQkJCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlOb2RlIHdwbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLCBvbGRWYWx1ZSk7Ci0JCQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLnJlbW92ZSh3cG5vZGUpOwotCQkJCQl3cG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwgb2xkVmFsdWUpOwotCQkJCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5yZW1vdmUod3Bub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vZGVzLmlzRW1wdHkoKSkgewotCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKHRoaXMpOwotCQl9Ci0JCS8vIHB1c2hCYWNrVG9EaWFncmFtKHJlbW92ZWROb2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWFkZE5vZGUoZ2V0Tm9kZXMoKSwgZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZihkZXNjcmlwdG9yLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJZGVzY3JpcHRvciwgVGFza05vZGUuY2xhc3MpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlub2RlID0gZGlhZ3JhbS5jcmVhdGVOb2RlKGRlc2NyaXB0b3IpOwotCQkJaWYobm9kZSAhPSBudWxsKSB7Ci0JCQkJaW50IGkgPSBnZXROZXh0SW5kZXgoZ2V0Tm9kZXMoKSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUYXNrTm9kZUltcGwpIHsKLQkJCQkJKChUYXNrTm9kZUltcGwpIG5vZGUpLmRvU2V0SW5kZXgoaSArIDEpOwotCQkJCX0KLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJQ29sbGVjdGlvbiBpbnB1dE91dHB1dE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWRpYWdyYW0uY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoZGVzY3JpcHRvciwgaW5wdXRPdXRwdXROb2Rlcyk7CQkJCQotCQkJCWlmICghaW5wdXRPdXRwdXROb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJZGlhZ3JhbS5nZXROb2RlcygpLmFkZEFsbChpbnB1dE91dHB1dE5vZGVzKTsKLQkJCQkJZGlhZ3JhbS5wb3B1bGF0ZUxpbmtzKGlucHV0T3V0cHV0Tm9kZXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0gCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50cy5jb250YWlucyhub2RlLmdldE9iamVjdCgpKSkgewotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0JCS8vIHB1c2hCYWNrVG9EaWFncmFtKG5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlhZGROb2RlKG5vZGVzLCBkZXNjcmlwdG9yKTsKLQkJfQotCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gUm9sZURlc2NyaXB0b3JBZGFwdGVyLmNsYXNzOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TmV4dEluZGV4KExpc3Qgbm9kZXMpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwkJCQotLy8JCQlpZihvYmogaW5zdGFuY2VvZiBOb2RlKXsKLS8vCQkJCU5vZGUgbm9kZSA9IChOb2RlKW9iajsKLS8vCQkJCS8vU3RyaW5nIHRlbXAgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShub2RlLmdldEdyYXBoTm9kZSgpLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpLmdldFZhbHVlKCk7Ci0vLwkJCQlMaXN0IGxpc3QgPSBub2RlLmdldEdyYXBoTm9kZSgpLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0vLwkJCQlpZihsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKXsKLS8vCQkJCQlmb3IgKGludCBpID0gbGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotLy8JCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBsaXN0LmdldChpKTsKLS8vCQkJCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWC5lcXVhbHMocHJvcC5nZXRLZXkoKSkpewotLy8JCQkJCQkJaW50IHRlbXAgID0gSW50ZWdlci5wYXJzZUludChwcm9wLmdldFZhbHVlKCkpOwotLy8JCQkJCQkJaWYodGVtcCA+IGluZGV4ICkgaW5kZXggPSB0ZW1wOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBUYXNrTm9kZUltcGwpIHsKLQkJCQlpbnQgaWQgPSAoKFRhc2tOb2RlSW1wbClvYmopLmRvR2V0SW5kZXgoKTsKLQkJCQlpZihpZCA+IGluZGV4KSB7Ci0JCQkJCWluZGV4ID0gaWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotCQkJaWYgKG9iajEgPT0gb2JqMikKLQkJCQlyZXR1cm4gMDsKLQkJCWlmKG9iajEgaW5zdGFuY2VvZiBUYXNrTm9kZUltcGwgJiYgb2JqMiBpbnN0YW5jZW9mIFRhc2tOb2RlSW1wbCl7Ci0JCQkJVGFza05vZGVJbXBsIG5vZGUxID0gKFRhc2tOb2RlSW1wbClvYmoxOwotCQkJCVRhc2tOb2RlSW1wbCBub2RlMiA9IChUYXNrTm9kZUltcGwpb2JqMjsKLQkJCQlpZihub2RlMS5kb0dldEluZGV4KCkgPiAgbm9kZTIuZG9HZXRJbmRleCgpKQotCQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQl9OwotCi0JcHVibGljIHZvaWQgY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ29sbGVjdGlvbiBub2RlcykgewotCQlOb2RlIG5ld05vZGUgPSBudWxsOwotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpOwotCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQl9Ci0JCWlmICghZGVzY3JpcHRvci5nZXRPdXRwdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGUgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgaW50IHR5cGUpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya3Byb2R1Y3RDb21wb3NpdGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFVNQUNvbnRhaW5lcihnZXRHcmFwaE5vZGUoKSk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0VHlwZSh0eXBlKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHdvcmtwcm9kdWN0Q29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIFRhc2tOb2RlIGNyZWF0ZVRhc2tOb2RlKFRhc2tEZXNjcmlwdG9yIHRkKSB7Ci0JCVRhc2tOb2RlIHRhc2tOb2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCVRhc2tOb2RlIHRuID0gKFRhc2tOb2RlKSBub2RlOwotCQkJCWlmKHRuLmdldExpbmtlZEVsZW1lbnQoKSA9PSB0ZCkgewotCQkJCQl0YXNrTm9kZSA9IHRuOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYodGFza05vZGUgPT0gbnVsbCkgewotCQkJdGFza05vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0JCQl0YXNrTm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJdGFza05vZGUuc2V0T2JqZWN0KHRkKTsKLQkJcmV0dXJuIHRhc2tOb2RlOwotCX0KLQkKLQlwcml2YXRlIFJvbGVOb2RlIGNyZWF0ZVJvbGVOb2RlKFJvbGVEZXNjcmlwdG9yIHJkKSB7Ci0JCVJvbGVOb2RlIHJvbGVOb2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBSb2xlTm9kZSkgewotCQkJCVJvbGVOb2RlIHJuID0gKFJvbGVOb2RlKSBub2RlOwotCQkJCWlmKHJuLmdldExpbmtlZEVsZW1lbnQoKSA9PSByZCkgewotCQkJCQlyb2xlTm9kZSA9IHJuOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYocm9sZU5vZGUgPT0gbnVsbCkgewotCQkJcm9sZU5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVOb2RlKCk7Ci0JCQlyb2xlTm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JCQlyb2xlTm9kZS5zZXRPYmplY3QocmQpOwotCQl9Ci0JCXJldHVybiByb2xlTm9kZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcG9wdWxhdGVOb2RlcyhPYmplY3QgbmV3T2JqZWN0KXsKLQkJCi0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIG5ld09iamVjdDsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCQlDb2xsZWN0aW9uIGFsbEVsZW1lbnRzID0gZGlhZ3JhbS5nZXRBbGxCcmVha2Rvd25FbGVtZW50cyh0cnVlKTsKLQkJCUxpc3QgdGFza05vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAoIXByaW1hcnlUYXNrRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7IC8vIG92ZXJyaWRpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCi0JCQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJdGFza0Rlc2NyaXB0b3JzLmFkZEFsbChwcmltYXJ5VGFza0Rlc2NyaXB0b3JzKTsKLQkJCQlIYXNoU2V0IHNlbGVjdGVkRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWJvb2xlYW4gYXV0b0xheW91dCA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbClnZXREaWFncmFtKCkpLmlzQXV0b0xheW91dCgpOwotCQkJCWlmKGF1dG9MYXlvdXQpIHsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJaW50IHJvd1Rhc2tzQ291bnQgPSAwOwotCQkJCQlpbnQgc3RhcnRDb3VudCA9IDA7Ci0JCQkJCQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkJCQkJJiYgVG5nVXRpbC5jb250YWlucyh0YXNrRGVzY3JpcHRvcnMsIG9iaikpIHsKLQkJCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotCQkJCQkJCQotCQkJCQkJCWlmKHN0YXJ0Q291bnQgPCByb3dJbmRleCAqIEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFza3NQZXJSb3coKSl7Ci0JCQkJCQkJCXN0YXJ0Q291bnQrKzsKLQkJCQkJCQl9IGVsc2UgewotCi0JCQkJCQkJCWlmICghc2VsZWN0ZWREZXNjcmlwdG9ycwotCQkJCQkJCQkJCS5jb250YWlucyh0YXNrRGVzY3JpcHRvcikpIHsKLQkJCQkJCQkJCXNlbGVjdGVkRGVzY3JpcHRvcnMuYWRkKHRhc2tEZXNjcmlwdG9yKTsKLQkJCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJCQkJCQkJCXRoaXMsIHRhc2tEZXNjcmlwdG9yLAotCQkJCQkJCQkJCQlUYXNrTm9kZS5jbGFzcyk7Ci0JCQkJCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0vLwkJCQkJCQkJCQlub2RlID0gY3JlYXRlVGFza05vZGUodGFza0Rlc2NyaXB0b3IsCi0vLwkJCQkJCQkJCQkJCWluZGV4LCBhbGxFbGVtZW50cyk7Ci0JCQkJCQkJCQkJbm9kZSA9IGNyZWF0ZVRhc2tOb2RlKHRhc2tEZXNjcmlwdG9yKTsKLQkJCQkJCQkJCQlUYXNrTm9kZUltcGwgdG4gPSAoVGFza05vZGVJbXBsKSBub2RlOwotCQkJCQkJCQkJCWlmIChhdXRvTGF5b3V0IHx8IHRuLmRvR2V0SW5kZXgoKSA9PSAtMSkgewotCQkJCQkJCQkJCQl0bi5kb1NldEluZGV4KGluZGV4KTsKLS8vCQkJCQkJCQkJCQlpbmRleCsrOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkvL3JldHVybiBub2RlOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJLy8gdGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IGxpbmsgYmV0d2VlbiB0aGUgbm9kZSBhbmQgbGlua2VkIGVsZW1lbnQgaXMgZXN0YWJsaXNoZWQKLQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLQotCQkJCQkJCQkJaWYgKHJvd1Rhc2tzQ291bnQgPCBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCQkJCS5nZXRUYXNrc1BlclJvdygpKSB7Ci0JCQkJCQkJCQkJdGFza05vZGVzLmFkZChub2RlKTsKLQkJCQkJCQkJCQlpZihub2RlIGluc3RhbmNlb2YgVGFza05vZGUpewotCQkJCQkJCQkJCQkoKFRhc2tOb2RlKW5vZGUpLnNldEluZGV4KGluZGV4KTsKLQkJCQkJCQkJCQkJaW5kZXgrKzsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJcm93VGFza3NDb3VudCsrOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBTb3J0IHRoZSB0YXNrTm9kZSBiYXNlZCBvbiB0aGVpciBpbmRleCBpZiBhdXRvbGF5b3V0IGlzCi0JCQkJCS8vIGZhbHNlCi0JCQkJCWlmICghYXV0b0xheW91dCkgewotCQkJCQkJQ29sbGVjdGlvbnMuc29ydCh0YXNrTm9kZXMsIGNvbXBhcmF0b3IpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlzdCBvbGRUYXNrRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCURpYWdyYW0gdW1hRGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oKTsKLQkJCQkJaWYodW1hRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBMYW1lIHdheSBvZiBkb2luZyB0aGlzLCB0byBmaXggYSBkZWZlY3Qgb2YgMS4wIHRvIDEuMC4xIG1pZ3JhdGlvbgkJCQkgIAotCQkJCQkJTGlzdCBncmFwaE5vZGVzID0gdW1hRGlhZ3JhbS5nZXRDb250YWluZWQoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyYXBoTm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJR3JhcGhOb2RlIGVsZW1lbnQgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgYnJpZGdlID0gZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQkJaWYoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSl7Ci0JCQkJCQkJCU9iamVjdCB0YXNrT2JqZWN0ID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKWJyaWRnZSkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQlMaXN0IGxpc3QgPSBlbGVtZW50LmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJCQkJCWlmICh0YXNrRGVzY3JpcHRvcnMuY29udGFpbnModGFza09iamVjdCkgJiYgcHJvcGVydHkgPT0gbnVsbCkgewotCQkJCQkJCQkJb2xkVGFza0Rlc2NyaXB0b3JzLmFkZCh0YXNrT2JqZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZihub2RlLmdldExpbmtlZEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCW9sZFRhc2tEZXNjcmlwdG9ycy5hZGQobm9kZS5nZXRMaW5rZWRFbGVtZW50KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0KLQkJCQkJCS8vIGVsaW1pbmF0ZSBkZXNjcmlwdG9yIHRoYXQgaXMgZHVwbGljYXRlLCBzdXBwcmVzc2VkIG9yIGZpbHRlcmVkIG91dAotCQkJCQkJLy8KLQkJCQkJCWlmKCFzZWxlY3RlZERlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKQotCQkJCQkJCQkmJiBjb250YWlucyhhbGxFbGVtZW50cywgdGFza0Rlc2NyaXB0b3IpIC8vIG1ha2Ugc3VyZSB0aGF0IHRhc2sgZGVzY3JpcHRvciBpcyBvZiB0aGUgb3duaW5nIGFjdGl2aXR5Ci0JCQkJCQkpIHsKLQkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7CQkJCQkKLQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwKLQkJCQkJCQkJCXRhc2tEZXNjcmlwdG9yLCBUYXNrTm9kZS5jbGFzcyk7Ci0JCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCQlub2RlID0gY3JlYXRlVGFza05vZGUodGFza0Rlc2NyaXB0b3IpOwotCQkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0JCQkJCQkJfQotCQkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZighdGFza05vZGVzLmlzRW1wdHkoKSkgewotCQkJCS8vIGFkZCByb2xlIG5vZGUKLQkJCQkvLwotCQkJCU5hbWVkTm9kZUltcGwgbmFtZWROb2RlID0gKChOYW1lZE5vZGVJbXBsKSBjcmVhdGVSb2xlTm9kZShyb2xlRGVzY3JpcHRvcikpOwotCQkJCW5hbWVkTm9kZS52aXNpYmxlID0gdHJ1ZTsKLQkJCQluYW1lZE5vZGUuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLQkJCQlnZXROb2RlcygpLmFkZChuYW1lZE5vZGUpOwkJCi0JCQkJdGFza05vZGVzLmFkZChuYW1lZE5vZGUpOwotCQkJfQotCQkJc2VsZWN0Tm9kZXModGFza05vZGVzKTsKLQkJfQotCQkKLQl9Ci0JCi0vLwlwdWJsaWMgTm9kZSBjcmVhdGVUYXNrTm9kZShUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgaW50IGluZGV4LCBDb2xsZWN0aW9uIGFsbEVsZW1lbnRzKSB7Ci0vLwkJTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrTm9kZSgpOwotLy8JCW5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotLy8JCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksCi0vLwkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpID09IG51bGwKLS8vCQkJCXx8IEdyYXBoaWNhbERhdGFIZWxwZXIKLS8vCQkJCQkJLmlzQXV0b0xheW91dCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCkpKSB7Ci0vLwkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkobm9kZS5nZXRHcmFwaE5vZGUoKSwKLS8vCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsIG5ldyBJbnRlZ2VyKGluZGV4KQotLy8JCQkJCQkJLnRvU3RyaW5nKCkpOwotLy8JCQlpbmRleCsrOwotLy8JCX0KLS8vCQlyZXR1cm4gbm9kZTsKLS8vCX0KLQkKLX0gLy8gUm9sZVRhc2tDb21wb3NpdGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UYXNrTm9kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1Rhc2tOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWEyMWUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1Rhc2tOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzIFRhc2tOb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXgoKSA8ZW0+SW5kZXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTkRFWF9FREVGQVVMVCA9IC0xOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXgoKSA8ZW0+SW5kZXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4ID0gSU5ERVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFza05vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFRhc2tEZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5UQVNLX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIGluZGV4OwotCX0KLQkKLQlwdWJsaWMgaW50IGRvR2V0SW5kZXgoKSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCVByb3BlcnR5IHByb3AgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5KHRoaXMsIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCk7Ci0JCQlpZihwcm9wICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgaSA9IEludGVnZXIucGFyc2VJbnQocHJvcC5nZXRWYWx1ZSgpKTsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRJbmRleCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGV4KGludCBuZXdJbmRleCkgewotCQlpbnQgb2xkSW5kZXggPSBpbmRleDsKLQkJaW5kZXggPSBuZXdJbmRleDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVgsIG9sZEluZGV4LCBpbmRleCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1NldEluZGV4KGludCBuZXdJbmRleCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KGdldEdyYXBoTm9kZSgpLCAKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLCBTdHJpbmcudmFsdWVPZihuZXdJbmRleCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0SW5kZXgobmV3SW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWDoKLQkJCQlzZXRJbmRleChJTkRFWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYOgotCQkJCXJldHVybiBpbmRleCAhPSBJTkRFWF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGluZGV4OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGluZGV4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWhhbmRsZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCWhhbmRsZWQgPSB0cnVlOwotCQkJCWJyZWFrOwkJCQkKLQkJCX0KLQkJCWlmKGhhbmRsZWQgJiYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREIHx8IG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpKSB7IAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0vLwkJCQkJZGlhZ3JhbS5zZXRPYmplY3QoZGlhZ3JhbS5nZXRPYmplY3QoKSk7Ci0JCQkJCUNvbGxlY3Rpb24gaW5wdXRPdXB1dE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlkaWFncmFtLmNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKChUYXNrRGVzY3JpcHRvcikgbXNnLmdldE5vdGlmaWVyKCksIGlucHV0T3VwdXROb2Rlcyk7Ci0JCQkJCWlmKCFpbnB1dE91cHV0Tm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkQWxsKGlucHV0T3VwdXROb2Rlcyk7Ci0JCQkJCQlkaWFncmFtLnBvcHVsYXRlTGlua3MoaW5wdXRPdXB1dE5vZGVzLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0vLwkJCU1ldGhvZEVsZW1lbnQgb2JqOwotLy8JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpKSB7Ci0vLwkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0vLwkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotLy8JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLS8vCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0vLwkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotLy8JCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLS8vCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLS8vCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLS8vCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8JCQkJYnJlYWs7Ci0vLwkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLS8vCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCWFkZE91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLS8vCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0vLwkJCQkJcmVtb3ZlT3V0Z29pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0vLwkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQlhZGRPdXRnb2luZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0vLwkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJcmVtb3ZlT3V0Z29pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0KLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklOb2RlQ2hhbmdlTGlzdGVuZXIjZ2V0Tm9kZSgpCi0JCSAqLwotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIFRhc2tOb2RlSW1wbC50aGlzOwotCQl9Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbCNzZXRPYmplY3QoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JLy8gT2JqZWN0IG9sZE9iamVjdCA9IG9iamVjdDsKLQkvLyBvYmplY3QgPSBuZXdPYmplY3Q7Ci0JLy8gaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCS8vIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JLy8gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX09CSkVDVCwgb2xkT2JqZWN0LCBvYmplY3QpKTsKLQkvLwotCS8vIGlmKG5ld09iamVjdCA9PSBudWxsKSByZXR1cm47Ci0JLy8JCQotCS8vIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBuZXdPYmplY3Q7Ci0JLy8gaWYoZWxlbWVudCAhPSBudWxsICYmIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpICE9IG51bGwpIHsKLQkvLyAvLyByZW1vdmUgb2xkIG1ldGhvZEVsZW1lbnRBZGFwdGVyCi0JLy8gLy8KLQkvLyBPYmplY3Qgb2xkQWRhcHRlciA9IFVtYVV0aWwuZ2V0QWRhcHRlcihlbGVtZW50LAotCS8vIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpKTsKLQkvLyBpZihvbGRBZGFwdGVyICE9IG51bGwpIHsKLQkvLyBlbGVtZW50LmVBZGFwdGVycygpLnJlbW92ZShvbGRBZGFwdGVyKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGdyYXBoTm9kZSA9Ci0JLy8gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRHcmFwaE5vZGUoZ2V0VU1BRGlhZ3JhbSgpLAotCS8vIGVsZW1lbnQpOwotCS8vICAgICAgICAKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGVJbXBsLnNldE9iamVjdCgpOiBlbGVtZW50OiAnIiArCi0JLy8gZWxlbWVudC5nZXROYW1lKCkgKyAiJywgZ3JhcGhOb2RlOiAiICsgZ3JhcGhOb2RlKTsKLQkvLyAgICAgICAgCi0JLy8gLy8gcG9wdWxhdGUgZGF0YQotCS8vIC8vCi0JLy8gc2V0SGVpZ2h0KGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0SGVpZ2h0KCkuaW50VmFsdWUoKSk7Ci0JLy8gc2V0TG9jYXRpb24oR3JhcGhpY2FsRGF0YUhlbHBlci50b1BvaW50KGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpKSk7Ci0JLy8gc2V0V2lkdGgoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRXaWR0aCgpLmludFZhbHVlKCkpOwotCS8vICAgICAgICAKLQkvLyAvLyBhZGQgbWV0aG9kRWxlbWVudEFkYXB0ZXIKLQkvLyAvLwotCS8vIGlmKG1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkvLyBlbGVtZW50LmVBZGFwdGVycygpLmFkZChtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyB0aGlzLmVBZGFwdGVycygpLmFkZChjcmVhdGVOb2RlQWRhcHRlcigpKTsKLQkvLwotCS8vIHNldE5hbWUoZWxlbWVudC5nZXROYW1lKCkpOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNhZGRUb1VNQShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGdldE9iamVjdCgpOwotCQlOb2RlSW1wbCBub2RlSW1wbCA9IChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub3RpZmljYXRpb25FbmFibGVkOwotCQlib29sZWFuIG5vdGlmeVNvdXJjZSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkvLyB0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5U291cmNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI3JlbW92ZUZyb21VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUsIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0JCXRhc2tEZXNjLmdldE91dHB1dCgpLnJlbW92ZShsaW5rLmdldFRhcmdldCgpLmdldE9iamVjdCgpKTsKLQotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci0KLX0gLy8gVGFza05vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UeXBlZE5vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UeXBlZE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjlmYTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVHlwZWROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZWQgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UeXBlZE5vZGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZE5vZGVJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBUeXBlZE5vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUWVBFX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFR5cGVkTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlRZUEVEX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IG5ld1R5cGUpIHsKLQkJaW50IG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRUeXBlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJCXNldFR5cGUoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJLy9wb3B1bGF0ZSBkYXRhIGZyb20gbGlua2VkIEdyYXBoTm9kZQotCQkvLyAKLQkJZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgbmV3T2JqZWN0OwotCQlzZXRXaWR0aChncmFwaE5vZGUuZ2V0U2l6ZSgpLmdldFdpZHRoKCkuaW50VmFsdWUoKSk7Ci0JCXNldEhlaWdodChncmFwaE5vZGUuZ2V0U2l6ZSgpLmdldEhlaWdodCgpLmludFZhbHVlKCkpOwotCQlzZXRMb2NhdGlvbihHcmFwaGljYWxEYXRhSGVscGVyLnRvUG9pbnQoZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkpKTsKLS8vCQkgdGhpcy5lQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgewotCQkvLyAvKiAobm9uLUphdmFkb2MpCi0JCS8vICogQHNlZQotCQkvLyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkvLyAqLwotCQkvLyBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gR3JhcGhOb2RlIGdyYXBoTm9kZSA9IChHcmFwaE5vZGUpIGdldE9iamVjdCgpOwotCQkvLyBzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChUeXBlZE5vZGUuY2xhc3MpKSB7Ci0JCS8vIGNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1dJRFRIOgotCQkvLyBncmFwaE5vZGUuZ2V0U2l6ZSgpLnNldFdpZHRoKG5ldyBEb3VibGUobXNnLmdldE5ld0ludFZhbHVlKCkpKTsKLQkJLy8gcmV0dXJuOwotCQkvLyAgICAgICAgICAgICAgICAgICAgCi0JCS8vIGNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX0hFSUdIVDoKLQkJLy8gZ3JhcGhOb2RlLmdldFNpemUoKS5zZXRIZWlnaHQobmV3IERvdWJsZShtc2cuZ2V0TmV3SW50VmFsdWUoKSkpOwotCQkvLyByZXR1cm47Ci0JCS8vICAgICAgICAgICAgICAgICAgICAgICAgCi0JCS8vIGNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX0xPQ0FUSU9OOgotCQkvLyBQb2ludCBwID0gKFBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlZE5vZGVJbXBsJC5ub3RpZnlDaGFuZ2VkKCk6IG5ldyBsb2NhdGlvbjogIiArCi0JCS8vIHAgKyAiLiAiICsgVHlwZWROb2RlSW1wbC50aGlzKTsKLQkJLy8gZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkuc2V0WChuZXcgRG91YmxlKHAueCkpOwotCQkvLyBncmFwaE5vZGUuZ2V0UG9zaXRpb24oKS5zZXRZKG5ldyBEb3VibGUocC55KSk7Ci0JCS8vIHJldHVybjsKLQkJLy8gICAgICAgICAgICAgICAgICAgIAotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJLy8gTGluayBsaW5rOwotCQkvLyBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJLy8gYWRkVG9VTUEoKExpbmspIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gYWRkVG9VTUEoKExpbmspIGl0ZXIubmV4dCgpKTsKLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkvLyBsaW5rID0gKExpbmspIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBpZihsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJLy8gKChOb2RlSW1wbClsaW5rLmdldFNvdXJjZSgpKS5yZW1vdmVGcm9tVU1BKGxpbmssIGxpbmsuZ2V0U291cmNlKCksCi0JCS8vIChOb2RlKW1zZy5nZXROb3RpZmllcigpKTsKLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0T2xkVmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkvLyBpZihsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJLy8gKChOb2RlSW1wbClsaW5rLmdldFNvdXJjZSgpKS5yZW1vdmVGcm9tVU1BKGxpbmssIGxpbmsuZ2V0U291cmNlKCksCi0JCS8vIChOb2RlKW1zZy5nZXROb3RpZmllcigpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIHJldHVybjsKLQkJLy8KLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkvLyBhZGRUb1VNQSgoTGluaykgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBhZGRUb1VNQSgoTGluaykgaXRlci5uZXh0KCkpOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCS8vIGxpbmsgPSAoTGluaykgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCS8vIGlmKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkvLyByZW1vdmVGcm9tVU1BKGxpbmssIChOb2RlKW1zZy5nZXROb3RpZmllcigpLCBsaW5rLmdldFRhcmdldCgpKTsKLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0T2xkVmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkvLyBpZihsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJLy8gcmVtb3ZlRnJvbVVNQShsaW5rLCAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSwgbGluay5nZXRUYXJnZXQoKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gfQotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQkvLyB9KTsKLQkJZUFkYXB0ZXJzKCkuYWRkKG5ldyBOb2RlQWRhcHRlcigpKTsKLQl9Ci0JCi0JcHVibGljIENsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlCi0JCQkJCSYmICgoVHlwZWROb2RlKSBsaW5rLmdldFRhcmdldCgpKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluawotCQkJCQkJLmdldFRhcmdldCgpLCB0YXJnZXRBY3ROb2Rlcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0QWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5hbWVkTm9kZUltcGwgbm9kZSA9ICgoTmFtZWROb2RlSW1wbCkgaXRlci5uZXh0KCkpOwotCQkJCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCS5nZXRPYmplY3QoKSwgKFdvcmtCcmVha2Rvd25FbGVtZW50KSBsaW5rCi0JCQkJCQkJLmdldFNvdXJjZSgpLmdldE9iamVjdCgpKSA9PSBudWxsKSB7Ci0JCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKG5vZGUsIChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluawotCQkJCQkJCQkuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCS8vIFByZWRlY2Vzc29yIHNob3VsZCBiZSBjcmVhdGVkIG9ubHkgaW4gY2FzZSBvZgotCQkJLy8gU3luY3Jvbml6YXRpb24gQmFyLCBub3QgZm9yIERlY2lzaW9uUG9pbnQuCi0JCQlpZiAoKChUeXBlZE5vZGUpIGxpbmsuZ2V0U291cmNlKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJQ29sbGVjdGlvbiBzcmNBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmdldFN5bmNCYXJTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBsaW5rCi0JCQkJCQkuZ2V0U291cmNlKCksIHNyY0FjdE5vZGVzKTsKLQkJCQlDb2xsZWN0aW9uIHRhcmdldEFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U3luY0JhclRhcmdldE5vZGVzKChUeXBlZE5vZGUpIGxpbmsKLQkJCQkJCS5nZXRUYXJnZXQoKSwgdGFyZ2V0QWN0Tm9kZXMpOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0QWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5hbWVkTm9kZUltcGwgbm9kZSA9ICgoTmFtZWROb2RlSW1wbCkgaXRlci5uZXh0KCkpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgKChOb2RlKSBpdGVyYXRvcgotCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJCS5nZXRPYmplY3QoKSwgcHJlZCkgPT0gbnVsbCkgewotCQkJCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIobm9kZSwgcHJlZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCVR5cGVkTm9kZSB0eXBlZE5vZGUgPSAoVHlwZWROb2RlKSBvbGRTb3VyY2U7Ci0JCUNvbGxlY3Rpb24gc3JjQWN0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFNvdXJjZU5vZGVzKHR5cGVkTm9kZSwKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCi0JCWlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gT2JqZWN0IHByZWQgPSAoKE5vZGUpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVXb3JrT3JkZXIoKE5hbWVkTm9kZUltcGwpCi0JCQkJLy8gb2xkVGFyZ2V0LCBwcmVkKTsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgbm9kZSwgb2xkVGFyZ2V0KSkgewotCQkJCQl3aGlsZSAoVW1hVXRpbC5maW5kV29ya09yZGVyKAotCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgb2xkVGFyZ2V0LmdldE9iamVjdCgpLAotCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKSkgIT0gbnVsbCkgewotCQkJCQkJVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgb2xkVGFyZ2V0LmdldE9iamVjdCgpLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG9sZFRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXMoCi0JCQkJCShUeXBlZE5vZGUpIG9sZFRhcmdldCwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQotCQkJLy8gcmVtb3ZlIHRoZSB3b3JrIG9yZGVycyBvZiB0YXJnZXQgYWN0aXZpdGllcyB0aGF0IGhhdmUgdGhlCi0JCQkvLyBwcmVkZWNlc3NvciBpbiBzcmNBY3ROb2RlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5hbWVkTm9kZUltcGwgbm9kZSA9ICgoTmFtZWROb2RlSW1wbCkgaXRlci5uZXh0KCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJLy8gT2JqZWN0IHByZWQgPSAoKE5vZGUpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlV29ya09yZGVyKG5vZGUsIHByZWQpOwotCQkJCQlOb2RlIHByZWRub2RlID0gKE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgcHJlZG5vZGUsCi0JCQkJCQkJbm9kZSkpIHsKLQkJCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkbm9kZS5nZXRPYmplY3QoKSkgIT0gbnVsbCkgewotCQkJCQkJCVVtYVV0aWwKLQkJCQkJCQkJCS5yZW1vdmVXb3JrT3JkZXIoCi0JCQkJCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCQkJCQkJCS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkbm9kZQotCQkJCQkJCQkJCQkJCS5nZXRPYmplY3QoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci19IC8vIFR5cGVkTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5ODA4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMKLQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFOwotCX0KLQotCXByaXZhdGUgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCVdvcmtPcmRlciBvYmo7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvYmogPSAoV29ya09yZGVyKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCi0JCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJaWYgKG9sZFRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJLy8gdGhpcyBpcyBhIGRpcmVjdCBsaW5rCi0JCQkvLyByZW1vdmUgV29ya09yZGVyCi0JCQkvLwotCQkJLy8gR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQkJLy8gV29ya09yZGVyIG9yZGVyID0gKFdvcmtPcmRlcikKLQkJCS8vICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSllZGdlLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJLy8gV29ya0JyZWFrZG93bkVsZW1lbnQgYmUgPSBVbWFVdGlsLmdldE93bmVyKG9yZGVyKTsKLQkJCS8vIGlmKGJlICE9IG51bGwpIHsKLQkJCU5hbWVkTm9kZUltcGwgdGFyZ2V0ID0gKE5hbWVkTm9kZUltcGwpIG9sZFRhcmdldDsKLQkJCWJvb2xlYW4gbm90aWZ5ID0gdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQl0cnkgewotCQkJCXRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJLy8gYmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5yZW1vdmUob3JkZXIpOwotCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG9sZFNvdXJjZSwKLQkJCQkJCW9sZFRhcmdldCkpIHsKLQkJCQkJd2hpbGUgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldAotCQkJCQkJCS5nZXRPYmplY3QoKSwgb2xkU291cmNlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQlVbWFVdGlsLnJlbW92ZVdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldAotCQkJCQkJCQkuZ2V0T2JqZWN0KCksIG9sZFNvdXJjZS5nZXRPYmplY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQkJfQotCQkJLy8gfQotCQl9IGVsc2UgaWYgKG9sZFRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJLy8gZ2V0IGFsbCB0aGUgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlcyB0aGF0IHRoaXMgVHlwZWROb2RlIGFyZQotCQkJLy8gY29taW5nIHRvIGFuZAotCQkJLy8gcmVtb3ZlIHRoZSBXb3JrT3JkZXJzIHdpdGggdGhpcyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUncwotCQkJLy8gYWN0aXZpdHkgYXMgcHJlZGVjZXNzb3IgZnJvbSB0aGVtCi0JCQkvLwotCQkJQ29sbGVjdGlvbiBhY3ROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXMoCi0JCQkJCShUeXBlZE5vZGUpIG9sZFRhcmdldCwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5hbWVkTm9kZUltcGwgbm9kZSA9IChOYW1lZE5vZGVJbXBsKSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJYm9vbGVhbiBub3RpZnkgPSBub2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJbm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG9sZFNvdXJjZSwKLQkJCQkJCQlub2RlKSkgewotCQkJCQkJd2hpbGUgKFVtYVV0aWwuZmluZFdvcmtPcmRlcihlLCBvbGRTb3VyY2UuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCQlVbWFVdGlsLnJlbW92ZVdvcmtPcmRlcihlLCBvbGRTb3VyY2UuZ2V0T2JqZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZW1vdmUgZ3JhcGhpY2FsIGRhdGEgZnJvbSBVTUEgbW9kZWwKLQkJLy8KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpbmsKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlOb2RlIHNyYyA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCWlmIChzcmMgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCS8vIHRoaXMgaXMgYSBkaXJlY3QgbGluawotCQkJLy8gYWRkIG5ldyBXb3JrT3JkZXIgb2JqZWN0IHRvIFVNQQotCQkJLy8KLQkJCVdvcmtPcmRlciBvcmRlciA9IG51bGw7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBsaW5rLmdldFRhcmdldCgpCi0JCQkJCS5nZXRPYmplY3QoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNyYy5nZXRPYmplY3QoKTsKLQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoc3VjYywgcHJlZCkgPT0gbnVsbCkgewotCQkJCU5vZGVJbXBsIHNvdXJjZU5vZGUgPSAoKE5vZGVJbXBsKSBzcmMpOwotCQkJCWJvb2xlYW4gc291cmNlTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkvL1VtYVV0aWwuY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihzdWNjLCBwcmVkKTsKLQkJCQkJLy9DcmVhdGUgYSB3b3Jrb3JkZXIgYW5kIGRpc2FibGUgbm90aWZpY2F0aW9uIGZsYWcuCi0JCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIoKE5hbWVkTm9kZUltcGwpbGluay5nZXRUYXJnZXQoKSwgcHJlZCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gc291cmNlTm90aWZ5OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc2V0IHRoZSBXb3JrT3JkZXIgYXMgdGhlIGVsZW1lbnQgb2YgdGhlIFNlbWFudGljTW9kZWwgb2YgdGhlCi0JCQkvLyBsaW5rJ3MgR3JhcGhFZGdlCi0JCQkvLwotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIG9yZGVyKTsKLQkJfSBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCS8vIGdldCBhbGwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlcyB0aGF0IGFyZSBjb21taW5nIHRvIHRoaXMKLQkJCS8vIFR5cGVkTm9kZSwgYm90aCBkaXJlY3RseSBhbmQgaW5kaXJlY3RseQotCQkJLy8gYW5kIGNyZWF0ZSB3b3JrIG9yZGVycyB3aXRoIHRoZWlyIGFjdGl2aXR5IGFzIHByZWRlY2Vzc29yCi0JCQkvLwotCi0JCQkvLyBQcmVkZWNlc3NvciBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IGluIGNhc2Ugb2YKLQkJCS8vIFN5bmNyb25pemF0aW9uIEJhciwgbm90IGZvciBEZWNpc2lvblBvaW50LgotCQkJaWYgKCgoVHlwZWROb2RlKSBzcmMpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJCi0JCQkJQ29sbGVjdGlvbiBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBHZXQgdGhlIGNvbGxlY3Rpb24gaW5jb21pbmcgY29ubmVjdGlvbiBvZiBzeW5jYmFyIAotCQkJCS8vIGV4Y2x1ZGluZyBkZWNpc2lvbnBvaW50IGluY29taW5nIGNvbm5lY3Rpb24KLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmdldFN5bmNCYXJTb3VyY2VOb2RlcygoVHlwZWROb2RlKXNyYywgYWN0Tm9kZXMpOwotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGxpbmsKLQkJCQkJCS5nZXRUYXJnZXQoKS5nZXRPYmplY3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKHN1Y2MsIHByZWQpID09IG51bGwpIHsKLQkJCQkJCU5vZGVJbXBsIHNvdXJjZU5vZGUgPSAoKE5vZGVJbXBsKSBub2RlKTsKLQkJCQkJCWJvb2xlYW4gc291cmNlTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkvL1VtYVV0aWwuY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihzdWNjLCBwcmVkKTsKLQkJCQkJCQkvLyBDcmVhdGUgYSB3b3Jrb3JkZXIgYW5kIGRpc2FibGUgbm90aWZpY2F0aW9uIGZsYWcuCi0JCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcigoTmFtZWROb2RlSW1wbClsaW5rLmdldFRhcmdldCgpLHByZWQpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBzb3VyY2VOb3RpZnk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBhZGRJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJTGluayBsaW5rID0gc3VwZXIuYWRkSW5jb21pbmdDb25uZWN0aW9uKHNvdXJjZSk7Ci0JCWlmIChsaW5rID09IG51bGwpCi0JCQlyZXR1cm4gbGluazsKLQotCQlXb3JrT3JkZXIgd29ya09yZGVyID0gVW1hVXRpbC5maW5kV29ya09yZGVyKAotCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0T2JqZWN0KCksIHNvdXJjZSk7Ci0JCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCB3b3JrT3JkZXIpOwotCi0JCXJldHVybiBsaW5rOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGFkZE91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQlMaW5rIGxpbmsgPSBzdXBlci5hZGRPdXRnb2luZ0Nvbm5lY3Rpb24odGFyZ2V0KTsKLQotCQlXb3JrT3JkZXIgd29ya09yZGVyID0gVW1hVXRpbC5maW5kV29ya09yZGVyKAotCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0LCBnZXRPYmplY3QoKSk7Ci0JCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCB3b3JrT3JkZXIpOwotCi0JCXJldHVybiBsaW5rOwotCX0KLQotfSAvLyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQwOTc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCBleHRlbmRzIE5vZGVDb250YWluZXJJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUWVBFX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0NPTVBPU0lURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgbmV3VHlwZSkgewotCQlpbnQgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IFRZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbmFsTm9kZUxpbmsgewotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJZG9IYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCWlmKFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbC50aGlzLmdldE5vZGVzKCkuaXNFbXB0eSgpKSB7CQkJCQotCQkJCS8vIHJlZnJlc2ggZGlhZ3JhbQotCQkJCS8vCi0JCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQkJCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlkaWFncmFtLmdldE5vZGVzKCkucmVtb3ZlKFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbC50aGlzKTsKLQkJCQkJZGlhZ3JhbS5zZXRPYmplY3QoZGlhZ3JhbS5nZXRPYmplY3QoKSk7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGRvSGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgdHlwZSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlhZGROb2RlKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiB0eXBlID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCXJlbW92ZU5vZGUob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiB0eXBlID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJYWRkTm9kZShvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgdHlwZSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCXJlbW92ZU5vZGUob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCURpYWdyYW1JbXBsIGRpYWdyYW0gPSAoRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJaWYgKGRpYWdyYW0uZmlsdGVyID09IG51bGwpIHsKLQkJCUNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZGlhZ3JhbS5maWx0ZXI7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJCi0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCQlwb3B1bGF0ZU5vZGVzKG5ld09iamVjdCk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQotCQlzdXBlci5iYXNpY1NldE9iamVjdChuZXdPYmplY3QpOwotCQkKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJLy8gU2V0IHRoZSBUeXBlIGluZm9ybWF0aW9uIGZvciB3b3JrcHJvZHVjdCBjb21wb3NpdGUuCi0JCQlpZiAodHlwZSA9PSBUWVBFX0VERUZBVUxUKSB7Ci0JCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5QnlLZXkobGlzdCwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKHByb3BlcnR5LmdldFZhbHVlKCkpOwotCQkJCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJcHJvcGVydHkuc2V0VmFsdWUobmV3IEludGVnZXIoZ2V0VHlwZSgpKS50b1N0cmluZygpKTsKLQkJCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgd3BkTm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSAmJiBub2RlLmdldExpbmtlZEVsZW1lbnQoKSA9PSB3cGQpIHsKLQkJCQl3cGROb2RlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYod3BkTm9kZSA9PSBudWxsKSB7Ci0JCQl3cGROb2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0JCQl3cGROb2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQkJfQotCQl3cGROb2RlLnNldE9iamVjdCh3cGQpOwotCQlyZXR1cm4gd3BkTm9kZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcG9wdWxhdGVOb2RlcyhPYmplY3QgbmV3T2JqZWN0KXsKLQkJaWYgKG5ld09iamVjdCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlMaXN0IHdwbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChnZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJaWYgKCEoKFRhc2tEZXNjcmlwdG9yKSBuZXdPYmplY3QpLmdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpKQotCQkJCQl3cGxpc3QuYWRkQWxsKCgoVGFza0Rlc2NyaXB0b3IpIG5ld09iamVjdCkKLQkJCQkJCQkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghKChUYXNrRGVzY3JpcHRvcikgbmV3T2JqZWN0KS5nZXRPdXRwdXQoKS5pc0VtcHR5KCkpCi0JCQkJCXdwbGlzdC5hZGRBbGwoKChUYXNrRGVzY3JpcHRvcikgbmV3T2JqZWN0KS5nZXRPdXRwdXQoKSk7Ci0JCQl9Ci0KLQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKCk7Ci0JCQlDb2xsZWN0aW9uIGFsbEVsZW1lbnRzID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKWdldERpYWdyYW0oKSkKLQkJCQkJCQkJCQkuZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoZmFsc2UpOwotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCi0JCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IGdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpOwotLy8JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9ICBuZXcgU3VwcHJlc3Npb24oVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGdldE9iamVjdCgpKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7CQkJCi0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQod3BEZXNjcmlwdG9yKSkgewotCQkJCQkKLQkJCQkJT2JqZWN0IHdyYXBwZXIgPSBudWxsOwotLy8JCQkJCWlmKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotLy8JCQkJCQl3cmFwcGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQod3BEZXNjcmlwdG9yLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJCX0KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoVG5nVXRpbC51bndyYXAoZWxlbWVudCkgPT0gd3BEZXNjcmlwdG9yKXsKLQkJCQkJCQl3cmFwcGVyID0gZWxlbWVudDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZih3cmFwcGVyID09IG51bGwgJiYgYWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQkJCQl3cmFwcGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQod3BEZXNjcmlwdG9yLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQl9Ci0JCQkJCWlmKHdyYXBwZXIgPT0gbnVsbCl7Ci0JCQkJCQl3cmFwcGVyID0gd3BEZXNjcmlwdG9yOwotCQkJCQl9Ci0JCQkJCWlmICghc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKHdyYXBwZXIpKSB7Ci0JCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJCXdwRGVzY3JpcHRvcik7Ci0JCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJCQkJbm9kZSA9IGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUod3BEZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBsaW5rIGJldHdlZW4gdGhlIG5vZGUgYW5kIGxpbmtlZCBlbGVtZW50IGlzIGVzdGFibGlzaGVkCi0JCQkJCQkJLy8KLQkJCQkJCQlub2RlLnNldE9iamVjdCh3cERlc2NyaXB0b3IpOwotCQkJCQkJfQotCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotCQkJCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlzZWxlY3ROb2Rlcyhub2Rlcyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTm9kZShDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJYWRkTm9kZShub2RlcywgZGVzY3JpcHRvcik7Ci0JCX0KLQotCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTm9kZShPYmplY3Qgb2xkVmFsdWUpIHsKLQkJQ29sbGVjdGlvbiByZW1vdmVkTm9kZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJTm9kZSBub2RlID0gZmluZE5vZGUoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLAotCQkJCQlnZXRPYmplY3QoKSk7Ci0JCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5yZW1vdmUobm9kZSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXRPYmplY3QoKSA9PSBvbGRWYWx1ZSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmVtb3ZlZE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQkvLyBwdXNoQmFja1RvRGlhZ3JhbShyZW1vdmVkTm9kZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE5vZGUoT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJYWRkTm9kZShnZXROb2RlcygpLCBkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBPYmplY3QgZGVzY3JpcHRvcikgewotCQkKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJTm9kZSBub2RlID0gZmluZE5vZGUoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLAotCQkJCQlkZXNjcmlwdG9yKTsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlub2RlID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCkpCi0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoCi0JCQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvciwgdGhpcy50eXBlKTsKLQkJCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcil7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzICwKLQkJCQkJZGVzY3JpcHRvcik7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpewotCQkJCQlub2RlID0gZGlhZ3JhbS5jcmVhdGVOb2RlKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKi8KLS8vCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLS8vCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0vLwkJCWlmIChlbGVtZW50cy5jb250YWlucyhub2RlLmdldE9iamVjdCgpKSkgewotLy8JCQkJbm9kZXMuYWRkKG5vZGUpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWdldE5vZGVzKCkucmVtb3ZlQWxsKG5vZGVzKTsKLS8vCQlwdXNoQmFja1RvRGlhZ3JhbShub2Rlcyk7Ci0vLwl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gVGFza0Rlc2NyaXB0b3JBZGFwdGVyLmNsYXNzOwotCX0KLQotCXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbigpIHsKLQkJaWYgKGdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCXJldHVybiBzdXBlci5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChnZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJcmV0dXJuIHN1cGVyLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFBvaW50KC0xLCAtMSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJaWYgKGdldFVNQURpYWdyYW0oKSA9PSBudWxsKSB7Ci0JCQkJLy8gbmV3IE1ldGhvZEVsZW1lbnQKLQkJCQkvLwotCQkJCXJldHVybiBjcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCQl9Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IGZpbmRHcmFwaE5vZGUoZ2V0VU1BRGlhZ3JhbSgpLCBtZXRob2RFbGVtZW50KTsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlub2RlID0gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJCS8vIGNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBnZXRVTUFEaWFncmFtKCkpOwotCQkJCWdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGZpbmRHcmFwaE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3QgbWV0aG9kRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIGVsZW1lbnQgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFNlbWFudGljTW9kZWwoKSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkJCQkJJiYgbWV0aG9kRWxlbWVudCA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGVsZW1lbnQKLQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCkpIHsKLQotCQkJCUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHR5cGVTdHJpbmcgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodHlwZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZ2V0VHlwZSgpID09IG5ldyBJbnRlZ2VyKHR5cGVTdHJpbmcpLmludFZhbHVlKCkpCi0JCQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCW1vZGVsQnJpZGdlLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCWdyYXBoTm9kZS5zZXRTZW1hbnRpY01vZGVsKG1vZGVsQnJpZGdlKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwb2ludCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCk7Ci0JCXBvaW50LnNldFgobmV3IERvdWJsZSgtMSkpOwotCQlwb2ludC5zZXRZKG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFBvc2l0aW9uKHBvaW50KTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gZGltID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGltZW5zaW9uKCk7Ci0JCWRpbS5zZXRXaWR0aChuZXcgRG91YmxlKC0xKSk7Ci0JCWRpbS5zZXRIZWlnaHQobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0U2l6ZShkaW0pOwotCi0JCS8vIEZvciBzZXR0aW5nIHR5cGUgb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUKLQkJUHJvcGVydHkgcHJvcGVydHkgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpOwotCQlwcm9wZXJ0eS5zZXRLZXkoR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCXByb3BlcnR5LnNldFZhbHVlKG5ldyBJbnRlZ2VyKGdldFR5cGUoKSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCWdyYXBoTm9kZS5zZXQoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSwgbGlzdCk7Ci0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JcHVibGljIE5vZGUgZmluZE5vZGUoQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50LmdldE9iamVjdCgpCi0JCQkJCSYmIGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCWlmICgoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBlbGVtZW50KS5nZXRUeXBlKCkgPT0gdGhpcy50eXBlKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJaWYobWV0aG9kRWxlbWVudEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRBZGFwdGVyOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCl7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSAoKElBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLX0gLy8gV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmZDdiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCBleHRlbmRzIERpYWdyYW1JbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSB7Ci0JcHJpdmF0ZSBjbGFzcyBXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpdml0eUFkYXB0ZXIgaW1wbGVtZW50cwotCQkJSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLQl9OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCWRpYWdyYW1DaGFuZ2VMaXN0ZW5lciA9IG5ldyBXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIElXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTID0gewkJCQotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIAotCX07IAotCi0JLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZQotCS8vCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc1NTIKLQkJCUxpc3Qgd3JhcHBlcnMgPSBQcm9jZXNzVXRpbC5nZXRXcmFwcGVycyh3cmFwcGVyLCBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTKTsKLQkJCWlmKHdyYXBwZXJzICE9IG51bGwgJiYgd3JhcHBlcnMuc2l6ZSgpID4gMCl7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpd3JhcHBlcnMuZ2V0KDApOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChnZXRPYmplY3QoKSwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSAoKElBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkJLmdldFdQQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCWdldE9iamVjdCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJfQotCQl9Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCS8vIHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGdldE9iamVjdCgpKTsKLQkJCS8vIGNvbW1lbnRlZCBhYm92ZSBsaW5lLCBGb3IgZGlhZ3JhbXMgLSByb2xsdXAgc2hvdWxkIGJlIGZhbHNlLCBmb3IKLQkJCS8vIGhhbmRsaW5nIHJvbGx1cCBzdGF0ZSBiZWxvdyBjb2RlLgotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWV4dHJhY3RDaGlsZHJlbihhZGFwdGVyLCBnZXRPYmplY3QoKSwgY2hpbGRyZW4sIHRydWUpOwotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5vZGVzKCkgewotCQkvLyBBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCi0JCS8vIGdldCBhbGwgV29ya1Byb2R1Y3REZXNjcmlwdG9ycyB1bmRlciB0aGUgYWN0aXZpdHkKLQkJLy8KLQkJc3VwZXIucG9wdWxhdGVOb2RlcygpOwotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYWN0LAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCi0JCS8vIEFycmF5TGlzdCB3cERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3ROb2RlIG5vZGUgPSAoV29ya1Byb2R1Y3ROb2RlKSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsIGVsZW1lbnQpOwotCQkJCWlmKG5vZGUgPT0gbnVsbCkgewotCQkJCQlub2RlID0gKFdvcmtQcm9kdWN0Tm9kZSkgdG9Ob2RlKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQl9Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlOwotCQkJCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuaXRlbVByb3ZpZGVyID0gd3JhcHBlcjsKLQkJCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJbm9kZS5zZXRUeXBlKDEpOwotCQkJCX0KLQkJCQlpZiAoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQlub2RlLnNldFR5cGUoMik7Ci0JCQkJfQotCQkJCWlmICgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCQkJbm9kZS5zZXRUeXBlKDMpOwotCQkJCX0KLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJc2VsZWN0Tm9kZXMobm9kZXMpOwotCX0KLQlwcm90ZWN0ZWQgTm9kZSB0b05vZGUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpewotCQkJcmV0dXJuIHN1cGVyLnRvTm9kZShlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBuZXdOb2RlKCkgewotCQlyZXR1cm4gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdE5vZGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU07Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGdldEJyZWFrZG93bkVsZW1lbnRUeXBlKCkgewotCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVW1hTW9kZWwoaW50IHBvc2l0aW9uLCBOb2RlIGFkZGVkTm9kZSkgewkJCi0JCWlmIChhZGRlZE5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkoKEFjdGl2aXR5KSBnZXRPYmplY3QoKSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoCi0JCQkJCShCcmVha2Rvd25FbGVtZW50KSBhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCXN1cGVyLmFkZFRvVW1hTW9kZWwocG9zaXRpb24sIGFkZGVkTm9kZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChpbnQgaW5kZXgsIE5vZGUgbm9kZSkgewotCQlpZihub2RlLmdldE9iamVjdCgpID09IG51bGwpIHsKLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm9kZUFkZGVkKGluZGV4LCBub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJc3VwZXIucG9wdWxhdGVMaW5rcygpOwotCQkKLQkJLy8gQ2xlYW4gdXAgdW4tdXNlZCB0aGUgbGlua3MuCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCUFycmF5TGlzdDxMaW5rPiBsaW5rc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxMaW5rPigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vZGUKLQkJCQkJLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoIWlzVmFsaWQobGluaykpIHsKLQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmtzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJCX0KLQkJCWxpbmtzVG9SZW1vdmUuY2xlYXIoKTsKLQkJCWxpbmtzVG9SZW1vdmUgPSBudWxsOwotCQl9Ci0JCS8vIFJlZnJlc2ggbGlua3MgYmFzZWQgb24gbW9kZWwgaW5mby4KLQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0JCQlOb2RlIG5vZGUgPSAoKE5vZGUpaXRlci5uZXh0KCkpOwotCQkJT2JqZWN0IHdiZSA9IG51bGw7Ci0JCQkvL3diZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkvL2lmKHdiZSAhPSBudWxsKXsKLQkJCXdiZSA9ICBub2RlLmdldE9iamVjdCgpOwotCQkJaWYod2JlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCQlMaXN0IGltcGFjdGVkQnkgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcil3YmUpLmdldEltcGFjdGVkQnkoKTsKLQkJCQlpZighaW1wYWN0ZWRCeS5pc0VtcHR5KCkpewotCQkJCQlmb3IoSXRlcmF0b3IgaXRlcjEgPSBpbXBhY3RlZEJ5Lml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspewotCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHNvdXJjZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpaXRlcjEubmV4dCgpOwotCQkJCQkJTGluayBsaW5rID0gZmluZExpbmsobm9kZSwgc291cmNlKTsKLQkJCQkJCWlmKGxpbmsgPT0gbnVsbCl7Ci0JCQkJCQkJTmFtZWROb2RlSW1wbCBub2RlSW1wbCA9ICgoTmFtZWROb2RlSW1wbCkgbm9kZSk7Ci0JCQkJCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJbm9kZUltcGwuYWRkSW5jb21pbmdDb25uZWN0aW9uKHNvdXJjZSk7IAotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoTGluayBsaW5rKSB7Ci0JCWlmIChsaW5rLmdldFNvdXJjZSgpID09IG51bGwgfHwgbGluay5nZXRUYXJnZXQoKSA9PSBudWxsCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRTb3VyY2UoKSkKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFRhcmdldCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgTGluayBmaW5kTGluayhOb2RlIHRhcmdldCwgT2JqZWN0IHNvdXJjZUxpbmtlZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCWlmKHNvdXJjZS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gc291cmNlTGlua2VkRWxlbWVudCkgewotCQkJCXJldHVybiBsaW5rOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0gLy8gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2YzBkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCS8vIFRPRE86IGltcGxlbWVudCBoYW5kbGluZyBzdXBwcmVzcy4KLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsLk1ldGhvZEVsZW1lbnRBZGFwdGVyI2dldE5vZGUoKQotCQkgKi8KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbC50aGlzOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwjZmluZE5vZGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBOb2RlIGZpbmROb2RlKE1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksIGxpbmtlZEVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNhZGRUb1VNQShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRPYmplY3QoKTsKLQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvZiBzb3VyY2Ugbm9kZSBiZWZvcmUgY2hhbmdpbmcgdGhlIFVNQSBvYmplY3QKLQkJLy8gYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCS8vIHNvIGl0IHdpbGwgbm90IGNyZWF0ZSBkdXBsaWNhdGUgbGlua3MKLQkJLy8KLQkJTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBub3RpZnlUYXJnZXQgPSBub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotLy8JCQl3cGQuZ2V0T3V0cHV0RnJvbSgpLmFkZChsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpKTsKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpOwotCQkJaWYodGFza0Rlc2MgIT0gbnVsbCkgewotCQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLmFkZCh3cGQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnlUYXJnZXQ7Ci0JCX0KLQotCQkvLyBUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKTsKLQkJLy8gdGQuZ2V0T3V0cHV0KCkuYWRkKGdldE9iamVjdCgpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjcmVtb3ZlRnJvbVVNQShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSwgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRPYmplY3QoKTsKLS8vCQl3cGQuZ2V0TWFuZGF0b3J5SW5wdXRUbygpLnJlbW92ZShvbGRUYXJnZXQuZ2V0T2JqZWN0KCkpOwotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgb2xkVGFyZ2V0LmdldE9iamVjdCgpOwotCQlpZih0YXNrRGVzYyAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZSh3cGQpOwotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdE5vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGNjNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3ROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3ROb2RlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdE5vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUWVBFX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQlwcml2YXRlIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBXb3JrUHJvZHVjdE5vZGVJbXBsLnRoaXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0KLQkJCXRyeSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJCQlNZXRob2RFbGVtZW50IG9iajsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZihiLmJvb2xlYW5WYWx1ZSgpPT10cnVlKXsKLQkJCQkJCQlyZW1vdmVMaW5rcygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3ROb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBuZXdUeXBlKSB7Ci0JCWludCBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRUeXBlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbGluawotCQkJCS5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKTsKLQotCQlOb2RlSW1wbCBzb3VyY2UgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGVJbXBsIHRhcmdldCA9IChOb2RlSW1wbCkgbGluay5nZXRUYXJnZXQoKTsKLQkJYm9vbGVhbiBub3RpZnlTb3VyY2UgPSBzb3VyY2Uubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBub3RpZnlUYXJnZXQgPSB0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCXNvdXJjZS5ub3RpZmljYXRpb25FbmFibGVkID0gdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWRlc2NyaXB0b3IuZ2V0SW1wYWN0cygpLmFkZCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBsaW5rLmdldFRhcmdldCgpLmdldE9iamVjdCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNvdXJjZS5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5U291cmNlOwotCQkJdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnlUYXJnZXQ7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2xkVGFyZ2V0Ci0JCQkJLmdldE9iamVjdCgpOwotCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgdGFyZ2V0IG5vZGUgYmVmb3JlIHJlbW92aW5nIGl0cwotCQkvLyBkZXNjcmlwdG9yIGZyb20gdGhlIGRlcGVuZGVuY3kgbGlzdAotCQkvLwotCQlOYW1lZE5vZGVJbXBsIG5vZGVJbXBsID0gKE5hbWVkTm9kZUltcGwpIG9sZFNvdXJjZTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJZGVzY3JpcHRvci5nZXRJbXBhY3RlZEJ5KCkucmVtb3ZlKG5vZGVJbXBsLmdldE9iamVjdCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaW5rcygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHNvdXJjZU5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJLy9saW5rLnNldFRhcmdldChudWxsKTsKLQkJCQlsaW5rLnNldE9iamVjdChudWxsKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCB0YXJnZXROb2RlID0gKE5vZGVJbXBsKSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCXRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCS8vbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19IC8vIFdvcmtQcm9kdWN0Tm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxZGYxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OWQ5NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1JbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTEyYTVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25zdHJhaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGRpYWdyYW0gcHVibGlzaCBvcHRpb25zIGFuZCByZWZlcmVuY2VzIHRvIHVzZXItc3BlY2lmaWVkCi0gKiBkaWFncmFtcyB0byByZXBsYWNlIHRoZSBhY3Rpdml0eSBkaWFncmFtLCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSwgb3Igd29yawotICogcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0gZm9yIGFuIGFjdGl2aXR5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUluZm8gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRF9JTUFHRV9VUkkgPSAiYWRfaW1hZ2VfdXJpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9JTUFHRV9VUkkgPSAiYWRkX2ltYWdlX3VyaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUERfSU1BR0VfVVJJID0gIndwZF9pbWFnZV91cmkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9BRF9JTUFHRSA9ICJwdWJsaXNoX2FkX2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQUREX0lNQUdFID0gInB1Ymxpc2hfYWRkX2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfV1BEX0lNQUdFID0gInB1Ymxpc2hfd3BkX2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUiA9ICJ8IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgU3RyaW5nIEFEX0ltYWdlVVJJOwotCi0JcHJpdmF0ZSBTdHJpbmcgQUREX0ltYWdlVVJJOwotCi0JcHJpdmF0ZSBTdHJpbmcgV1BEX0ltYWdlVVJJOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hBREltYWdlOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hBRERJbWFnZTsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoV1BESW1hZ2U7Ci0KLQlwcml2YXRlIENvbnN0cmFpbnQgY29uc3RyYWludDsKLQotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGlhZ3JhbTsKLQotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIHdwZERpYWdyYW07Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuZCBsb2FkcyBhIERpYWdyYW1JbmZvIGluc3RhbmNlIGZvciBhIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIERpYWdyYW1JbmZvKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgRGlhZ3JhbUluZm8oKSB7Ci0JCUFEX0ltYWdlVVJJID0gQUREX0ltYWdlVVJJID0gV1BEX0ltYWdlVVJJID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW1JbmZvIGxvYWQoKSB7Ci0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oKTsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb25zdHJhaW50LmdldEJvZHkoKSwKLQkJCQlERUxJTUlURVIpOyB0b2tlbnMuaGFzTW9yZVRva2VucygpOykgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJaW50IGlkID0gdG9rZW4uaW5kZXhPZignPScpOwotCQkJaW50IG1heCA9IHRva2VuLmxlbmd0aCgpIC0gMTsKLQkJCWlmIChpZCAhPSAtMSAmJiBpZCA8IG1heCkgewotCQkJCVN0cmluZyBrZXkgPSB0b2tlbi5zdWJzdHJpbmcoMCwgaWQpOwotCQkJCWlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShBRF9JTUFHRV9VUkkpKSB7Ci0JCQkJCWluZm8uQURfSW1hZ2VVUkkgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKEFERF9JTUFHRV9VUkkpKSB7Ci0JCQkJCWluZm8uQUREX0ltYWdlVVJJID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShXUERfSU1BR0VfVVJJKSkgewotCQkJCQlpbmZvLldQRF9JbWFnZVVSSSA9IHRva2VuLnN1YnN0cmluZyhpZCArIDEpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoUFVCTElTSF9BRF9JTUFHRSkpIHsKLQkJCQkJaW5mby5wdWJsaXNoQURJbWFnZSA9IEJvb2xlYW4udmFsdWVPZigKLQkJCQkJCQl0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShQVUJMSVNIX0FERF9JTUFHRSkpIHsKLQkJCQkJaW5mby5wdWJsaXNoQURESW1hZ2UgPSBCb29sZWFuLnZhbHVlT2YoCi0JCQkJCQkJdG9rZW4uc3Vic3RyaW5nKGlkICsgMSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoUFVCTElTSF9XUERfSU1BR0UpKSB7Ci0JCQkJCWluZm8ucHVibGlzaFdQREltYWdlID0gQm9vbGVhbi52YWx1ZU9mKAotCQkJCQkJCXRva2VuLnN1YnN0cmluZyhpZCArIDEpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0JCWlmIChjb25zdHJhaW50ID09IG51bGwpIHsKLQkJCWNvbnN0cmFpbnQgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KGFjdGl2aXR5LAotCQkJCQlDb25zdHJhaW50TWFuYWdlci5BQ0lUSVZZX0RJQUdSQU0sIHRydWUpOwotCQl9Ci0JCWlmIChhY3Rpdml0eURpYWdyYW0gIT0gbnVsbCkgewotCQkJQURfSW1hZ2VVUkkgPSBhY3Rpdml0eURpYWdyYW0uZ2V0R3VpZCgpOwotCQl9Ci0JCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW0gIT0gbnVsbCkgewotCQkJQUREX0ltYWdlVVJJID0gYWN0aXZpdHlEZXRhaWxEaWFncmFtLmdldEd1aWQoKTsKLQkJfQotCQlpZiAod3BkRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlXUERfSW1hZ2VVUkkgPSB3cGREaWFncmFtLmdldEd1aWQoKTsKLQkJfQotCi0JCURpYWdyYW1JbmZvIGluZm8gPSBsb2FkKCk7Ci0KLQkJaWYgKEFEX0ltYWdlVVJJICE9IG51bGwpIHsKLQkJCWluZm8uQURfSW1hZ2VVUkkgPSBBRF9JbWFnZVVSSTsKLQkJfQotCQlpZiAoQUREX0ltYWdlVVJJICE9IG51bGwpIHsKLQkJCWluZm8uQUREX0ltYWdlVVJJID0gQUREX0ltYWdlVVJJOwotCQl9Ci0JCWlmIChXUERfSW1hZ2VVUkkgIT0gbnVsbCkgewotCQkJaW5mby5XUERfSW1hZ2VVUkkgPSBXUERfSW1hZ2VVUkk7Ci0JCX0KLQkJaW5mby5wdWJsaXNoQURJbWFnZSA9IHB1Ymxpc2hBREltYWdlOwotCQlpbmZvLnB1Ymxpc2hBRERJbWFnZSA9IHB1Ymxpc2hBRERJbWFnZTsKLQkJaW5mby5wdWJsaXNoV1BESW1hZ2UgPSBwdWJsaXNoV1BESW1hZ2U7Ci0KLQkJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoQURfSU1BR0VfVVJJKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJaW5mby5BRF9JbWFnZVVSSSkuYXBwZW5kKERFTElNSVRFUikuYXBwZW5kKFBVQkxJU0hfQURfSU1BR0UpCi0JCQkJLmFwcGVuZCgnPScpLmFwcGVuZChTdHJpbmcudmFsdWVPZihpbmZvLnB1Ymxpc2hBREltYWdlKSkKLQkJCQkuYXBwZW5kKERFTElNSVRFUikuYXBwZW5kKEFERF9JTUFHRV9VUkkpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZm8uQUREX0ltYWdlVVJJKSkuYXBwZW5kKERFTElNSVRFUikKLQkJCQkuYXBwZW5kKFBVQkxJU0hfQUREX0lNQUdFKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmZvLnB1Ymxpc2hBRERJbWFnZSkpLmFwcGVuZChERUxJTUlURVIpCi0JCQkJLmFwcGVuZChXUERfSU1BR0VfVVJJKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmZvLldQRF9JbWFnZVVSSSkpLmFwcGVuZChERUxJTUlURVIpCi0JCQkJLmFwcGVuZChQVUJMSVNIX1dQRF9JTUFHRSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5mby5wdWJsaXNoV1BESW1hZ2UpKS50b1N0cmluZygpOwotCi0JCWNvbnN0cmFpbnQuc2V0Qm9keShzdHIpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGlzIERpYWdyYW1JbmZvIG9iamVjdCBmcm9tIHRoZSBtb2RlbAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWNvbnN0cmFpbnQgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KGFjdGl2aXR5LAotCQkJCUNvbnN0cmFpbnRNYW5hZ2VyLkFDSVRJVllfRElBR1JBTSwgZmFsc2UpOwotCQlpZiAoY29uc3RyYWludCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlEaWFncmFtSW5mbyBpbmZvID0gbG9hZCgpOwotCi0JCUFEX0ltYWdlVVJJID0gaW5mby5BRF9JbWFnZVVSSTsKLQkJQUREX0ltYWdlVVJJID0gaW5mby5BRERfSW1hZ2VVUkk7Ci0JCVdQRF9JbWFnZVVSSSA9IGluZm8uV1BEX0ltYWdlVVJJOwotCQlwdWJsaXNoQURJbWFnZSA9IGluZm8ucHVibGlzaEFESW1hZ2U7Ci0JCXB1Ymxpc2hBRERJbWFnZSA9IGluZm8ucHVibGlzaEFEREltYWdlOwotCQlwdWJsaXNoV1BESW1hZ2UgPSBpbmZvLnB1Ymxpc2hXUERJbWFnZTsKLQotCQlhY3Rpdml0eURpYWdyYW0gPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoQURfSW1hZ2VVUkkpOwotCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoQUREX0ltYWdlVVJJKTsKLQkJd3BkRGlhZ3JhbSA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbChXUERfSW1hZ2VVUkkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QURfSW1hZ2VVUkkoKSB7Ci0JCXJldHVybiBBRF9JbWFnZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFERF9JbWFnZVVSSSgpIHsKLQkJcmV0dXJuIEFERF9JbWFnZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdQRF9JbWFnZVVSSSgpIHsKLQkJcmV0dXJuIFdQRF9JbWFnZVVSSTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotCSAqIGluc3RlYWQuCi0JICogCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaEFEREltYWdlKCkgewotCQlyZXR1cm4gcHVibGlzaEFEREltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JICogaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaEFEREltYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFEREltYWdlKGJvb2xlYW4gcHVibGlzaEFEREltYWdlKSB7Ci0JCXRoaXMucHVibGlzaEFEREltYWdlID0gcHVibGlzaEFEREltYWdlOwotCQlzYXZlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgYWN0aXZpdHkgZGlhZ3JhbSBpbnN0ZWFkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eURpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2hBREltYWdlKCkgewotCQlyZXR1cm4gcHVibGlzaEFESW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgaW1hZ2UgZm9yIGFjdGl2aXR5IGRpYWdyYW0KLQkgKiBpbnN0ZWFkIG9mIHRoZSBhY3Rpdml0eSBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hBREltYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFESW1hZ2UoYm9vbGVhbiBwdWJsaXNoQURJbWFnZSkgewotCQl0aGlzLnB1Ymxpc2hBREltYWdlID0gcHVibGlzaEFESW1hZ2U7Ci0JCXNhdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JICogaW5zdGVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSAjZ2V0V1BERGlhZ3JhbSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaFdQREltYWdlKCkgewotCQlyZXR1cm4gcHVibGlzaFdQREltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGltYWdlIGZvciB3b3JrIHByb2R1Y3QKLQkgKiBkZXBlbmRlbmN5IGRpYWdyYW0gaW5zdGVhZCBvZiB0aGUgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoV1BESW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoV1BESW1hZ2UoYm9vbGVhbiBwdWJsaXNoV1BESW1hZ2UpIHsKLQkJdGhpcy5wdWJsaXNoV1BESW1hZ2UgPSBwdWJsaXNoV1BESW1hZ2U7Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldEFjdGl2aXR5RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHVzZXItc3BlY2lmaWVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLgotCSAqIAotCSAqIEByZXR1cm4gYSB7QGxpbmsgU3VwcG9ydGluZ01hdGVyaWFsfSB3aXRoIHRoZSBkaWdyYW0gaW4gaXRzIG1haW4KLQkgKiAgICAgICAgIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSB7Ci0JCXJldHVybiBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB1c2VyLXNwZWNpZmllZCB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtLgotCSAqIAotCSAqIEByZXR1cm4gYSB7QGxpbmsgU3VwcG9ydGluZ01hdGVyaWFsfSB3aXRoIHRoZSBkaWdyYW0gaW4gaXRzIG1haW4KLQkgKiAgICAgICAgIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRXUEREaWFncmFtKCkgewotCQlyZXR1cm4gd3BkRGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXUEREaWFncmFtKFN1cHBvcnRpbmdNYXRlcmlhbCB3cGREaWFncmFtKSB7Ci0JCWlmICh0aGlzLndwZERpYWdyYW0gIT0gd3BkRGlhZ3JhbSkgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZCA9IHRoaXMud3BkRGlhZ3JhbTsKLQkJCXRoaXMud3BkRGlhZ3JhbSA9IHdwZERpYWdyYW07Ci0JCQl1cGRhdGUob2xkLCB3cGREaWFncmFtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJaWYgKHRoaXMuYWN0aXZpdHlEZXRhaWxEaWFncmFtICE9IGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZCA9IHRoaXMuYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCQkJdGhpcy5hY3Rpdml0eURldGFpbERpYWdyYW0gPSBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0JCQl1cGRhdGUob2xkLCBhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEaWFncmFtKFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURpYWdyYW0pIHsKLQkJaWYgKHRoaXMuYWN0aXZpdHlEaWFncmFtICE9IGFjdGl2aXR5RGlhZ3JhbSkgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZCA9IHRoaXMuYWN0aXZpdHlEaWFncmFtOwotCQkJdGhpcy5hY3Rpdml0eURpYWdyYW0gPSBhY3Rpdml0eURpYWdyYW07Ci0JCQl1cGRhdGUob2xkLCBhY3Rpdml0eURpYWdyYW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCBmb3IgdGhlIGRpYWdyYW0gd2l0aCB0aGUgZ2l2ZW4gVVJJCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW1VUkkKLQkgKiBAcmV0dXJuIG51bGwgb2YgdGhlIFN1cHBvcnRpbmdNYXRlcmlhbCBvYmplY3QgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZQotCSAqICAgICAgICAgbGlicmFyeQotCSAqLwotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIGdldFN1cHBvcnRpbmdNYXRlcmlhbChTdHJpbmcgZGlhZ3JhbVVSSSkgewotCQkvLyBkaWFncmFtVVJJIGlzIHRoZSBHVUlEIG9mIHRoZSBzdXBwb3J0aW5nIG1hdGVyaWFsIHRoYXQgbXVzdCBiZSBpbiB0aGUKLQkJLy8gbGlzdAotCQkvLyBvZiBzdXBwb3J0aW5nIG1hdGVyaWFscyBvZiB0aGUgYWN0aXZpdHkKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIGUgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlLmdldEd1aWQoKS5lcXVhbHMoZGlhZ3JhbVVSSSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlKFN1cHBvcnRpbmdNYXRlcmlhbCBvbGQsIFN1cHBvcnRpbmdNYXRlcmlhbCBuZXUpIHsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkucmVtb3ZlKG9sZCk7Ci0JCX0KLQkJaWYgKG5ldSAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuYWRkKG5ldSk7Ci0JCX0KLQkJc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc3VwcG9ydGluZyBtYXRlcmlhbCBpcyBhIHVzZXItZGVmaW5lZCBkaWFncmFtIG9mIHRoaXMKLQkgKiBEaWFncmFtSW5mbydzIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIHNtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlhZ3JhbShTdXBwb3J0aW5nTWF0ZXJpYWwgc20pIHsKLQkJcmV0dXJuIHNtICE9IG51bGwKLQkJCQkmJiAoc20gPT0gYWN0aXZpdHlEaWFncmFtIHx8IHNtID09IGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB8fCBzbSA9PSB3cGREaWFncmFtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzM2I2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci0KLS8qKgotICogRXh0ZW5zaW9uIHRvIGNvbnRyaWJ1dGUgdG8gZXh0ZW5zaW9uIHBvaW50Ci0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5kaWFncmFtTWFuYWdlciIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjcsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1NYW5hZ2VyIGltcGxlbWVudHMgSURpYWdyYW1NYW5hZ2VyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlciNnZXREaWFncmFtKG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHksCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlKSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oYWN0LCB0eXBlLAotCQkJCWZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmYzU0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW1SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsRGF0YUhlbHBlciB7Ci0JLyoqIERpYWdyYW0gdHlwZSBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ESUFHUkFNID0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQotCXN0YXRpYyBmaW5hbCBpbnRbXSBESUFHUkFNX1RZUEVTID0geyBBQ1RJVklUWV9ESUFHUkFNLAotCQkJQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gfTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBESUFHUkFNX1RZUEVfVEVYVFMgPSB7Ci0JCQlEaWFncmFtUmVzb3VyY2VzLnR5cGVfYWN0aXZpdHksIERpYWdyYW1SZXNvdXJjZXMudHlwZV9XUEQsIERpYWdyYW1SZXNvdXJjZXMudHlwZV9hY3Rpdml0eURldGFpbCB9OyAKLQotCS8qKiBQcm9wZXJ0eSBuYW1lcyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUgPSAid3BDb21wb3NpdGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBwcm9wZXJ0eSBuYW1lcyBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gKiovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVVRPX0xBWU9VVCA9ICJhdXRvbGF5b3V0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSU5ERVggPSAiaW5kZXgiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHByb3BlcnR5IHZhbHVlcyBjb25zdGFudHMgZm9yIGF1dG9sYXlvdXQgKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogVHlwZSBpbmZvIGZvciBVSSBub2RlIChAc2VlIFR5cGVkTm9kZSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX1NZTkNIX0JBUiA9ICJzeW5jaG5vbml6YXRpb24gYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9TVEFSVCA9ICJzdGFydCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9FTkQgPSAiZW5kIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0RFQ0lTSU9OID0gImRlY2lzaW9uIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0ZSRUVfVEVYVCA9ICJmcmVlIHRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogRGlhZ3JhbSB0eXBlIHN0cmluZyBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1dPUktGTE9XID0gIldvcmtmbG93IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9XT1JLX1BST0RVQ1RfREVQRU5ERU5DWSA9ICJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fQUNUSVZJVFlfREVUQUlMID0gIkFjdGl2aXR5IERldGFpbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRElBR1JBTV9UQVNLU19QRVJfUk9XID0gIkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX1RBU0tTX1BFUl9ST1ciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFBvaW50IHRvUG9pbnQob3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQocC5nZXRYKCkuZG91YmxlVmFsdWUoKSwgcC5nZXRZKCkuZG91YmxlVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IG5ld01vZGVsUG9pbnQoaW50IHgsIGludCB5KSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCk7Ci0JCXAuc2V0WChuZXcgRG91YmxlKHgpKTsKLQkJcC5zZXRZKG5ldyBEb3VibGUoeSkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5IGZpbmRQcm9wZXJ0eShHcmFwaE5vZGUgbm9kZSwgU3RyaW5nIHByb3BLZXkpIHsKLQkJZm9yIChpbnQgaSA9IG5vZGUuZ2V0UHJvcGVydHkoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgbm9kZS5nZXRQcm9wZXJ0eSgpLmdldChpKTsKLQkJCWlmIChwcm9wS2V5LmVxdWFscyhwcm9wLmdldEtleSgpKSkKLQkJCQlyZXR1cm4gcHJvcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGltZW5zaW9uIG5ld01vZGVsRGltZW5zaW9uKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlEaW1lbnNpb24gc2l6ZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpbWVuc2lvbigpOwotCQlzaXplLnNldFdpZHRoKG5ldyBEb3VibGUod2lkdGgpKTsKLQkJc2l6ZS5zZXRIZWlnaHQobmV3IERvdWJsZShoZWlnaHQpKTsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbGxDb25uZWN0aW9ucyhOb2RlIG5vZGUsIEdyYXBoTm9kZSBncmFwaE5vZGUpIHsKLQkJYm9vbGVhbiBvbGQgPSBub2RlLmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBub2RlCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncmFwaE5vZGUuZ2V0QW5jaG9yYWdlKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4gPSAoKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbm4uZ2V0R3JhcGhFZGdlKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZihlZGdlLmdldEFuY2hvcigpLnNpemUoKSA+IDEpIHsgCi0JCQkJCQlHcmFwaENvbm5lY3RvciB0YXJnZXRDb25uZWN0b3I7Ci0JCQkJCQlMaW5rIGxpbmsgPSBudWxsOwotCQkJCQkJaWYgKGVkZ2UuZUNvbnRhaW5lcigpID09IGdyYXBoTm9kZSkgewotCQkJCQkJCXRhcmdldENvbm5lY3RvciA9IChHcmFwaENvbm5lY3RvcikgZWRnZS5nZXRBbmNob3IoKQotCQkJCQkJCS5nZXQoMSk7Ci0JCQkJCQkJR3JhcGhOb2RlIHRhcmdldEdyYXBoTm9kZSA9IChHcmFwaE5vZGUpIHRhcmdldENvbm5lY3RvcgotCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJaWYgKGdyYXBoTm9kZS5lQ29udGFpbmVyKCkgPT0gdGFyZ2V0R3JhcGhOb2RlCi0JCQkJCQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQkJCQkJCU9iamVjdCBsaW5rZWRPYmplY3QgPSB0YXJnZXRHcmFwaE5vZGU7Ci0JCQkJCQkJCWlmICh0YXJnZXRHcmFwaE5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCQkJbGlua2VkT2JqZWN0ID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB0YXJnZXRHcmFwaE5vZGUKLQkJCQkJCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKGxpbmtlZE9iamVjdCAhPSBudWxsKXsKLQkJCQkJCQkJCU5vZGUgdGFyZ2V0Tm9kZSA9IGZpbmROb2RlKGRpYWdyYW0sIGxpbmtlZE9iamVjdCk7Ci0JCQkJCQkJCQlsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0JCQkJCQkJCQlsaW5rLnNldFNvdXJjZShub2RlKTsKLQkJCQkJCQkJCWxpbmsuc2V0VGFyZ2V0KHRhcmdldE5vZGUpOwotCQkJCQkJCQkJbGluay5zZXRPYmplY3QoZWRnZSk7Ci0JCQkJCQkJCX1lbHNlewotCQkJCQkJCQkJaWYoTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkpewotCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGlua2VkIG9iamVjdCBpcyBudWxsOiBmb3I6ICIrIG5vZGUuZ2V0R3JhcGhOb2RlKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkiOiBmb3IgZ3JhcGhDb25uZWN0b3I6ICIrCXRhcmdldENvbm5lY3Rvcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbm9kZS5lU2V0RGVsaXZlcihvbGQpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbSwKLQkJCUdyYXBoTm9kZSBnTm9kZSwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBnTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQlJTm9kZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElOb2RlQ2hhbmdlTGlzdGVuZXIpIFVtYVV0aWwKLQkJCQkJLmdldEFkYXB0ZXIoKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpLmdldEVsZW1lbnQoKSwKLQkJCQkJCQlhZGFwdGVyVHlwZSk7Ci0JCQlyZXR1cm4gbGlzdGVuZXIuZ2V0Tm9kZSgpOwotCQl9Ci0KLQkJLy8gZ05vZGUgaXMgbm90IGEgYWN0aXZpdHkncyBHcmFwaE5vZGUuIFRyeSB0byBmaW5kIGEgTm9kZSB3aXRoIGdOb2RlIGFzCi0JCS8vIGEgbGlua2VkIG9iamVjdCBpbiB0aGUgZGlhZ3JhbS4KLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGdOb2RlID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBub2RlIHdob3NlIGxpbmtlZCBvYmplY3QgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoTm9kZUNvbnRhaW5lciBjb250YWluZXIsIE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkgfHwgb2JqZWN0ID09IGVsZW1lbnQuZ2V0TGlua2VkRWxlbWVudCgpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IG9yIG9uZSBvZiBpdHMgYmFzZSBpcyB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0LAotCQkJYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IG5vZGUuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0gZWxzZSBpZiAoY2hlY2tCYXNlCi0JCQkJCSYmIG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBub2RlCi0JCQkJCQkuZ2V0T2JqZWN0KCkpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgdmUgIT0gbnVsbDsgdmUgPSB2ZQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlpZiAodmUgPT0gb2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBvYmplY3QpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSAKLQkJCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJbm9kZSA9IGZpbmROb2RlKChOb2RlQ29udGFpbmVyKSBlbGVtZW50LCBvYmplY3QpOwotCQkJCWlmIChub2RlICE9IG51bGwpCi0JCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50LmdldE9iamVjdCgpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG9iamVjdCwgQ2xhc3MgdHlwZSkgewotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlIAotCQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQlub2RlID0gZmluZE5vZGUoKE5vZGVDb250YWluZXIpIGVsZW1lbnQsIG9iamVjdCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkgJiYgdHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGluayBmaW5kTGluayhOb2RlIHNvdXJjZSwgT2JqZWN0IHRhcmdldExpbmtlZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCWlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5nZXRMaW5rZWRFbGVtZW50KCkgPT0gdGFyZ2V0TGlua2VkRWxlbWVudCkgewotCQkJCXJldHVybiBsaW5rOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKGludCB0eXBlKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCXJldHVybiBHUkFQSF9OT0RFX0RFQ0lTSU9OOwotCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9FTkQ7Ci0JCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJcmV0dXJuIEdSQVBIX05PREVfU1RBUlQ7Ci0JCWNhc2UgVHlwZWROb2RlLlNZTkNIX0JBUjoKLQkJCXJldHVybiBHUkFQSF9OT0RFX1NZTkNIX0JBUjsKLQkJY2FzZSBUeXBlZE5vZGUuRlJFRV9URVhUOgotCQkJcmV0dXJuIEdSQVBIX05PREVfRlJFRV9URVhUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgR3JhcGhOb2RlIG5ld1R5cGVkR3JhcGhOb2RlKGludCB0eXBlKSB7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaE5vZGUoKTsKLQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgYnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQkJYnJpZGdlLnNldFR5cGVJbmZvKGdldFR5cGVTdHJpbmcodHlwZSkpOwotCQlncmFwaE5vZGUuc2V0U2VtYW50aWNNb2RlbChicmlkZ2UpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHBvaW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKTsKLQkJcG9pbnQuc2V0WChuZXcgRG91YmxlKC0xKSk7Ci0JCXBvaW50LnNldFkobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0UG9zaXRpb24ocG9pbnQpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiBkaW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaW1lbnNpb24oKTsKLQkJZGltLnNldFdpZHRoKG5ldyBEb3VibGUoLTEpKTsKLQkJZGltLnNldEhlaWdodChuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRTaXplKGRpbSk7Ci0KLQkJaWYgKHR5cGUgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJZ3JhcGhOb2RlLnNldE5hbWUoRGlhZ3JhbVJlc291cmNlcy5hZGRGcmVlVHh0KTsgCi0JCX0KLQkJaWYgKHR5cGUgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJUHJvcGVydHkgcHJvcGVydHkgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpOwotCQkJcHJvcGVydHkuc2V0S2V5KEdSQVBIX05PREVfRlJFRV9URVhUKTsKLQkJCXByb3BlcnR5LnNldFZhbHVlKERpYWdyYW1SZXNvdXJjZXMuYWRkRnJlZVR4dCk7IAotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJZ3JhcGhOb2RlLnNldChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZLCBsaXN0KTsKLQkJfQotCi0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpbmsKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlR3JhcGhpY2FsRGF0YShMaW5rIGxpbmspIHsKLQkJLy8gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVHcmFwaENvbm5lY3RvclBhaXIobGluay5nZXRTb3VyY2UoKS5nZXRHcmFwaE5vZGUoKSwKLQkJLy8gbGluay5nZXRUYXJnZXQoKS5nZXRHcmFwaE5vZGUoKSk7Ci0JCQotCQlHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGxpbmsuZ2V0T2JqZWN0KCk7Ci0JCWlmKGVkZ2UgIT0gbnVsbCkgewotCQkJR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVHcmFwaEVkZ2UoZWRnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGluawotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRHcmFwaGljYWxEYXRhKExpbmsgbGluaykgewotCQlHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGxpbmsuZ2V0T2JqZWN0KCk7Ci0JCWlmIChlZGdlID09IG51bGwpIHsKLQkJCS8vIG5ldyBsaW5rCi0JCQkvLwotCQkJZWRnZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkR3JhcGhDb25uZWN0b3JQYWlyKAotCQkJCQlsaW5rLmdldFNvdXJjZSgpLmdldEdyYXBoTm9kZSgpLAotCQkJCQlsaW5rLmdldFRhcmdldCgpLmdldEdyYXBoTm9kZSgpKTsKLQkJCWxpbmsuc2V0T2JqZWN0KGVkZ2UpOwotCi0JCQkvLyBzYXZlIHRoZSBzb3VyY2UgZW5kIHBvaW50IGFuZCB0YXJnZXQgZW5kIHBvaW50IGZyb20gdGhlIGdpdmVuCi0JCQkvLyBsaW5rCi0JCQkvLwotCQkJbGluay5zZXRTb3VyY2VFbmRQb2ludChsaW5rLmdldFNvdXJjZUVuZFBvaW50KCkpOwotCQkJbGluay5zZXRUYXJnZXRFbmRQb2ludChsaW5rLmdldFRhcmdldEVuZFBvaW50KCkpOwotCQl9IGVsc2UgewotCQkJLy8gdW5kbyBkZWxldGVkIGxpbmsKLQkJCS8vCi0JCQlHcmFwaE5vZGUgc3JjTm9kZSA9IGxpbmsuZ2V0U291cmNlKCkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQlHcmFwaE5vZGUgdGFyZ2V0Tm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQlPYmplY3Qgc3JjQ29ubmVjdG9yID0gZWRnZS5nZXRBbmNob3IoKS5nZXQoMCk7Ci0JCQlzcmNOb2RlLmdldEFuY2hvcmFnZSgpLmFkZCgoR3JhcGhDb25uZWN0b3IpIHNyY0Nvbm5lY3Rvcik7Ci0JCQlzcmNOb2RlLmdldENvbnRhaW5lZCgpLmFkZChlZGdlKTsKLQkJCU9iamVjdCB0YXJnZXRDb25uZWN0b3IgPSBlZGdlLmdldEFuY2hvcigpLmdldCgxKTsKLQkJCXRhcmdldE5vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKChHcmFwaENvbm5lY3RvcikgdGFyZ2V0Q29ubmVjdG9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZW1hbnRpY01vZGVsKExpbmsgbGluaywgV29ya09yZGVyIHdvcmtPcmRlcikgewotCQkvLyBzZXQgdGhlIFdvcmtPcmRlciBhcyB0aGUgZWxlbWVudCBvZiB0aGUgU2VtYW50aWNNb2RlbCBvZiB0aGUgbGluaydzCi0JCS8vIEdyYXBoRWRnZQotCQkvLwotCQlHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGxpbmsuZ2V0T2JqZWN0KCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQlicmlkZ2Uuc2V0RWxlbWVudCh3b3JrT3JkZXIpOwotCQllZGdlLnNldFNlbWFudGljTW9kZWwoYnJpZGdlKTsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlKSB7Ci0JLy8gTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBnZXRTb3VyY2VBY3Rpdml0eU5vZGVzKGFjdE5vZGVzLCB0eXBlZE5vZGUpOwotCS8vIHJldHVybiBhY3ROb2RlczsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0U291cmNlTm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ2xhc3MgdHlwZSkgewotCQlMaXN0IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRTb3VyY2VOb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlLCB0eXBlKTsKLQkJcmV0dXJuIGFjdE5vZGVzOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTb3VyY2VBY3Rpdml0eU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIFR5cGVkTm9kZQotCS8vIHR5cGVkTm9kZSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBMaW5rIGxpbmsgPSAoTGluaylpdGVyLm5leHQoKTsKLQkvLyBOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JLy8gaWYoc291cmNlIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JLy8gYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JLy8gZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgc291cmNlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCS8vIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUpIHsKLQkvLyBMaXN0IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGdldFRhcmdldEFjdGl2aXR5Tm9kZXMoYWN0Tm9kZXMsIHR5cGVkTm9kZSk7Ci0JLy8gcmV0dXJuIGFjdE5vZGVzOwotCS8vIH0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRUYXJnZXROb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlLCBDbGFzcyB0eXBlKSB7Ci0JCUxpc3QgYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldFRhcmdldE5vZGVzKGFjdE5vZGVzLCB0eXBlZE5vZGUsIHR5cGUpOwotCQlyZXR1cm4gYWN0Tm9kZXM7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyB2b2lkIGdldFRhcmdldEFjdGl2aXR5Tm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgVHlwZWROb2RlCi0JLy8gdHlwZWROb2RlKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOwotCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIExpbmsgbGluayA9IChMaW5rKWl0ZXIubmV4dCgpOwotCS8vIE5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkvLyBpZih0YXJnZXQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkvLyBhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZih0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkvLyBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKGFjdE5vZGVzLCAoVHlwZWROb2RlKSB0YXJnZXQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyBhbGwgbm9kZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSB0aGF0IGFyZSBkaXJlY3Qgb3IgaW5kaXJlY3QgdGFyZ2V0cyBvZgotCSAqIHRoZSBnaXZlbiBzb3VyY2UgdHlwZWROb2RlLgotCSAqIAotCSAqIEBwYXJhbSBhY3ROb2RlcwotCSAqIEBwYXJhbSB0eXBlZE5vZGUKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUYXJnZXROb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUgdHlwZWROb2RlLAotCQkJQ2xhc3MgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJaWYgKHR5cGUuaXNJbnN0YW5jZSh0YXJnZXQpKSB7Ci0JCQkJYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCWdldFRhcmdldE5vZGVzKGFjdE5vZGVzLCAoVHlwZWROb2RlKSB0YXJnZXQsIHR5cGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFNvdXJjZU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIFR5cGVkTm9kZSB0eXBlZE5vZGUsCi0JCQlDbGFzcyB0eXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAodHlwZS5pc0luc3RhbmNlKHNvdXJjZSkpIHsKLQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJZ2V0U291cmNlTm9kZXMoYWN0Tm9kZXMsIChUeXBlZE5vZGUpIHNvdXJjZSwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE5vZGUgZ2V0Rmlyc3RTb3VyY2VOb2RlKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENsYXNzIHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCWlmICh0eXBlLmlzSW5zdGFuY2Uoc291cmNlKSkgewotCQkJCXJldHVybiBzb3VyY2U7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCXNvdXJjZSA9IGdldEZpcnN0U291cmNlTm9kZSgoVHlwZWROb2RlKSBzb3VyY2UsIHR5cGUpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHNvdXJjZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlciByZW1vdmVXb3JrT3JkZXIoTmFtZWROb2RlSW1wbCBub2RlLAotCQkJT2JqZWN0IHByZWRCcmVha2Rvd25FbGVtZW50KSB7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCS5nZXRPYmplY3QoKSwgcHJlZEJyZWFrZG93bkVsZW1lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlciBhZGREZWZhdWx0V29ya09yZGVyKE5hbWVkTm9kZUltcGwgbm9kZSwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRCcmVha2Rvd25FbGVtZW50KSB7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkuZ2V0T2JqZWN0KCksIHByZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZnkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc05vUm9sZURlc2NyaXB0b3JBc3NvY2lhdGVkKAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuaXNFbXB0eSgpOwotCQkvLyBjb21tZW50ZWQgLSByZXF1aXJlbWVudHMgbm90IHRvIGFsbG93IGFkZGl0aW9uYWwgcGVyZm9ybWVyIGFuZAotCQkvLyBhc3Npc3RlZCBieSBpbiBkaWFncmFtcy4KLQkJLy8gJiYgdGFza0Rlc2NyaXB0b3IuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5pc0VtcHR5KCk7Ci0JCS8vICYmIHRhc2tEZXNjcmlwdG9yLmdldEFzc2lzdGVkQnkoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoTm9kZUNvbnRhaW5lciBjb250YWluZXIsIE5vZGUgbm9kZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkID09IG5vZGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyCi0JCQkJCSYmIGNvbnRhaW5zKChOb2RlQ29udGFpbmVyKSBjaGlsZCwgbm9kZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlZnJlc2hGcm9tQmFzZShEaWFncmFtIGRpYWdyYW0pIHsKLQkJLy8gZmluZCB0aGUgYmFzZSBkaWFncmFtCi0JCS8vCi0JCVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKTsKLQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSB1bWFNb2RlbEJyaWRnZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbW9kZWxCcmlkZ2UpOwotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSB1bWFNb2RlbEJyaWRnZS5nZXRFbGVtZW50KCk7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgPT0gbnVsbAotCQkJCQl8fCBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW50IGRpYWdyYW1UeXBlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSk7Ci0JCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCQljYXNlIEFDVElWSVRZX0RJQUdSQU06IHsKLQkJCQlEaWFncmFtIGJhc2VEaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldFVNQURpYWdyYW0oYmFzZSwgZGlhZ3JhbVR5cGUsIGZhbHNlKTsKLQkJCQlpZiAoYmFzZURpYWdyYW0gPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUxpc3Qgb2xkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gY29weURpYWdyYW0oYmFzZURpYWdyYW0pOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhc2VEaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYXBoTm9kZSBiYXNlTm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQltb2RlbEJyaWRnZSA9IGJhc2VOb2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJLy8gdGhpcyBpcyBhIGVsZW1lbnQncyBub2RlCi0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCQkJR3JhcGhOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5maW5kR3JhcGhOb2RlKAotCQkJCQkJCQlkaWFncmFtLCBlKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoaXNVSUdyYXBoTm9kZShiYXNlTm9kZSkpIHsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gZmluZFVJR3JhcGhOb2RlKGRpYWdyYW0sIGJhc2VOb2RlCi0JCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIC8vIHJlbW92ZSBhbGwgdGhlIEdyYXBoRWRnZXMgb2YgdGhlIG9sZCBub2RlcwotCQkJCS8vIC8vCi0JCQkJLy8gTGlzdCByZW1vdmVFZGdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkvLyBHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7Ci0JCQkJLy8gaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaEVkZ2UpIHsKLQkJCQkvLyByZW1vdmVFZGdlcy5hZGQoZWxlbWVudCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gaWYoIXJlbW92ZUVkZ2VzLmlzRW1wdHkoKSkgewotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZUVkZ2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhFZGdlKChHcmFwaEVkZ2UpCi0JCQkJLy8gaXRlci5uZXh0KCkpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQkvLyByZW1vdmUgb2xkIG5vZGVzCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLnJlbW92ZUFsbChvbGROb2Rlcyk7Ci0KLQkJCQkvLyByZW1vdmUgdW51c2VkIG9sZCBVSSBub2RlcyAmJiBub2RlcyBvZiBjb250cmlidXRvci9yZXBsYWNlcgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGlzVUlHcmFwaE5vZGUobm9kZSkKLQkJCQkJCQkmJiBub2RlLmdldEJyaWVmRGVzY3JpcHRpb24oKSAhPSBudWxsCi0JCQkJCQkJJiYgbm9kZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkubGVuZ3RoKCkgPiAwCi0JCQkJCS8vICYmIG5vZGUuZ2V0Q29udGFpbmVkKCkuaXNFbXB0eSgpCi0JCQkJCSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gbm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKQotCQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCQkmJiAoKEFjdGl2aXR5KSBlKQotCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyByZXBsYWNlIGFzc29jaWF0ZWQgYmFzZSBlbGVtZW50IHdpdGggY29udHJpYnV0aW5nL3JlcGxhY2luZwotCQkJCS8vIGVsZW1lbnQKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlRWxlbWVudCA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmZpbmRHcmFwaE5vZGUoCi0JCQkJCQkJCWNvcHksIGJhc2VFbGVtZW50KTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBub2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWJyaWRnZS5zZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGFkZCBuZXcgbm9kZXMKLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkQWxsKGNvcHkuZ2V0Q29udGFpbmVkKCkpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0OiB7Ci0JCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRVTUFEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQkJaWYgKGJhc2VEaWFncmFtID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlMaXN0IG9sZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCURpYWdyYW0gY29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFwaE5vZGUgYmFzZU5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJbW9kZWxCcmlkZ2UgPSBiYXNlTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCS8vIHRoaXMgaXMgYSBlbGVtZW50J3Mgbm9kZQotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQkJZGlhZ3JhbSwgZSk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gcmVtb3ZlIG9sZCBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5yZW1vdmVBbGwob2xkTm9kZXMpOwotCi0JCQkJLy8gYWRkIG5ldyBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGRBbGwoY29weS5nZXRDb250YWluZWQoKSk7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gYmFzZUd1aWQKLQkgKiAgICAgICAgICAgIHRoZSBHVUlEIG9mIHRoZSBiYXNlIFVJIEdyYXBoTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBHcmFwaE5vZGUgZmluZFVJR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgU3RyaW5nIGJhc2VHdWlkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVUlHcmFwaE5vZGUobm9kZSkKLQkJCQkJJiYgYmFzZUd1aWQuZXF1YWxzKG5vZGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VJR3JhcGhOb2RlKEdyYXBoTm9kZSBnTm9kZSkgewotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZ05vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgewotCQkJU3RyaW5nIHR5cGVJbmZvID0gKChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgbW9kZWxCcmlkZ2UpCi0JCQkJCS5nZXRUeXBlSW5mbygpOwotCQkJaWYgKHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX0RFQ0lTSU9OKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9FTkQpCi0JCQkJCXx8IHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX1NUQVJUKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9TWU5DSF9CQVIpCi0JCQkJCXx8IHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX0ZSRUVfVEVYVCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNvcHlEaWFncmFtKERpYWdyYW0gYmFzZURpYWdyYW0pIHsKLQkJRGlhZ3JhbSBjb3B5ID0gKERpYWdyYW0pIFRuZ1V0aWwuY29weShiYXNlRGlhZ3JhbSk7Ci0KLQkJLy8gSEFDSzoKLQkJLy8gZ28gdGhydSB0aGUgbm9kZXMgb2YgdGhlIGRpYWdyYW0gY29weSwgaWYgYW55IG5vZGUgaXMgYSBVSS1vbmx5IG5vZGUKLQkJLy8gKHNlZSBUeXBlZE5vZGUpCi0JCS8vIHNhdmUgdGhlIEdVSUQgb2YgdGhlIG9yaWdpbmFsIG9uZSBpbiBpdHMgYnJpZWZEZXNjcmlwdGlvbiB0byByZW1lbWJlcgotCQkvLyB3aG8gaXMgYmFzZS4KLQkJLy8KLQkJaW50IHNpemUgPSBjb3B5LmdldENvbnRhaW5lZCgpLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUdyYXBoTm9kZSBnTm9kZSA9IChHcmFwaE5vZGUpIGNvcHkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpOwotCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuaXNVSUdyYXBoTm9kZShnTm9kZSkpIHsKLQkJCQlnTm9kZS5zZXRCcmllZkRlc2NyaXB0aW9uKCgoRGlhZ3JhbUVsZW1lbnQpIGJhc2VEaWFncmFtCi0JCQkJCQkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpKS5nZXRHdWlkKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZGlhZ3JhbXMgb2YgdGhpcyBhY3Rpdml0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RlZEFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QpIHsKLQkJcmV0dXJuIGdldERpYWdyYW1zKGFjdCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCUFycmF5TGlzdCBkaWFncmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCWFjdCwgRElBR1JBTV9UWVBFU1tpXSwgY3JlYXRlKTsKLQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQlkaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpYWdyYW1UeXBlVGV4dChEaWFncmFtIGRpYWdyYW0pIHsKLQkJaW50IHR5cGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pOwotCQlpZiAodHlwZSAhPSAtMSkgewotCQkJcmV0dXJuIERJQUdSQU1fVFlQRV9URVhUU1t0eXBlXTsKLQkJfQotCQlyZXR1cm4gRGlhZ3JhbVJlc291cmNlcy50eXBlX3Vua25vd247IAotCX0KLQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHN1cHByZXNzZWQgZmxhZyBvZiBhbGwgZGlhZ3JhbXMgaW4gdGhlIGdpdmVuIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBbGxEaWFncmFtU3VwcHJlc3NlZChQcm9jZXNzIHByb2MsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHByb2MpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjE4OTQ5MDE0NDc2MzcxMTE0TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDb2xsZWN0aW9uIGRpYWdyYW1zID0gZ2V0RGlhZ3JhbXMoKEFjdGl2aXR5KSBpdGVyLm5leHQoKSwKLQkJCQkJc3VwcHJlc3NlZCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZihzdXBwcmVzc2VkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlVU1BUG9pbnQoQ29sbGVjdGlvbiB1bWFQb2ludHMsIGludCB4LCBpbnQgeSkKLQkvLyB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdW1hUG9pbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50KSBpdGVyLm5leHQoKTsKLQkvLyBpZihwLmdldFgoKS5pbnRWYWx1ZSgpID09IHggJiYgcC5nZXRZKCkuaW50VmFsdWUoKSA9PSB5KSB7Ci0JLy8gaXRlci5yZW1vdmUoKTsKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGluayhMaW5rIGxpbmspIHsKLQkJTm9kZSBzb3VyY2VOb2RlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJTm9kZSB0YXJnZXROb2RlID0gbGluay5nZXRUYXJnZXQoKTsKLQkJYm9vbGVhbiBzcmNOb3RpZnkgPSBzb3VyY2VOb2RlICE9IG51bGwgPyBzb3VyY2VOb2RlLmVEZWxpdmVyKCkgOiBmYWxzZTsKLQkJYm9vbGVhbiB0YXJnZXROb3RpZnkgPSB0YXJnZXROb2RlICE9IG51bGwgPyB0YXJnZXROb2RlLmVEZWxpdmVyKCkKLQkJCQk6IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKHNvdXJjZU5vZGUgIT0gbnVsbCkgewotCQkJCXNvdXJjZU5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJfQotCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCXRhcmdldE5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJfQotCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKHNyY05vdGlmeSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Tm9kZS5lU2V0RGVsaXZlcih0YXJnZXROb3RpZnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIG9iamVjdCBvciBpdHMgd3JhcHBlciBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBhbGxFbGVtZW50cwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmRFbGVtZW50KENvbGxlY3Rpb24gYWxsRWxlbWVudHMsIE9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlID09IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCQkvLyBJZiBvYmplY3QgKGUpIGlzIGEgd29ya3Byb2R1Y3QgZGVzY3JpcHRvciggc3ViLWFydGlmYWN0KQotCQkJLy8gcGFzc2VkIGNvbGxlY3Rpb24gZG9ub3QgaGF2ZSB3cmFwcGVyIGZvciBzdWItYXJ0aWZhY3QsIGNoZWNrIHRoZQotCQkJLy8gY29udGFpbmVyIGFydGlmYWN0J3Mgd3JhcHBlci4KLQkJCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTkxNAotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCU9iamVjdCBjaGlsZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0Q2hpbGRyZW4oZWxlbWVudCksIGUpOwotCQkJCWlmKGNoaWxkRWxlbWVudCAhPSBudWxsKXsKLQkJCQkJcmV0dXJuIGNoaWxkRWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gY2hlY2sgaWYgYW55IGR1cGxpY2F0ZSBwcmVkZWNlc3NvciBpbiB0aGUgcHJlZGVjZXNzb3JzIGxpc3Qgb2YKLQkgKiBXb3JrQnJlYWtkb3duRWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RHVwbGljYXRlUHJlZGVjZXNzb3JzKFdvcmtCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHByZWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRQcmVkcyhlLCBwcmVkbGlzdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG9iaikpIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgYWxsIHRoZSBwcmVkZWNlc3NvcnMgYWN0aXZpdGllcyBpbnN0ZWFkIG9mCi0JICogd29ya29yZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UHJlZHMoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgcHJlZGxpc3QgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIHdvcmtvcmRlciA9IChXb3JrT3JkZXIpIGl0b3IubmV4dCgpOwotCQkJbGlzdC5hZGQod29ya29yZGVyLmdldFByZWQoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB0byBjaGVjayBiZWZvcmUgZGVsZXRpbmcgYSBsaW5rLiBJZiBkdXBsaWNhdGUgcHJlZGVjZXNzb3IgZXhpc3RzCi0JICogaW4gdGhlIGxlZ2FjeSBkYXRhLCBjaGVjayBpZiBkZWxldGluZyBsaW5rIHNob3VsZCByZW1vdmUgYWxsIHRoZQotCSAqIHByZWRlY2Vzc29ycyBvciBub3QgYnkgdmVyaWZ5aW5nIGlmIHRhcmdldCBvciBpbmRpcmVjdCB0YXJnZXQgaGF2ZSBkaXJlY3QKLQkgKiBvciBpbmRpcmVjdCBsaW5rcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVtb3ZlQWxsUHJlZHMoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwKLQkJCU5vZGUgb2xkVGFyZ2V0KSB7Ci0KLQkJaWYgKG9sZFRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJTGlzdCBpbmxpc3QgPSBvbGRUYXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaW5saXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgaW5jb21pbmdsaW5rID0gKExpbmspIGl0b3IubmV4dCgpOwotCQkJCS8vIFJBVExDMDAzODQyNDUgOiBQcmVkZWNlc3NvciBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIG9ubHkgaW4KLQkJCQkvLyBjYXNlIG9mIFN5bmNocm9uaXphdGlvbiBCYXIuCi0JCQkJaWYgKGluY29taW5nbGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZQotCQkJCQkJJiYgKChUeXBlZE5vZGUpIGluY29taW5nbGluay5nZXRTb3VyY2UoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQkJQ29sbGVjdGlvbiBjb2wgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFNvdXJjZU5vZGVzKAotCQkJCQkJCShUeXBlZE5vZGUpIGluY29taW5nbGluay5nZXRTb3VyY2UoKSwKLQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQlpZiAoY29sLmNvbnRhaW5zKG9sZFNvdXJjZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCWlmIChpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkuZXF1YWxzKG9sZFNvdXJjZSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIGdldCB0aGUgc291cmNlcyBvZiBTeW5jQmFyIGluQ29tbWluZyBjb25uZWN0aW9ucwotCSAqIGFuZCBpZiBzeW5jYmFyIGhhdmUgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGRlY2lzaW9uIHBvaW50LCAKLQkgKiBhbmQgZGVjaXNpb24gcG9pbnQgaGF2ZSBpbmNvbW1pbmcgY29ubmVjdGlvbnMgKHdvcmticmVhZGRvd24gZWxlbXRucykKLQkgKiBjb2xsZWN0aW9ucyB3aWxsIGlnbm9yZSBhbGwgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gZnJvbSBkZWNpc2lvbiBwb2ludC4gIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3luY0JhclNvdXJjZU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENvbGxlY3Rpb24gYWN0Tm9kZXMpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXsKLQkJCQkJYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JCQkJfWVsc2UgaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJCQkJaWYoKChUeXBlZE5vZGUpc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikKLQkJCQkJCWdldFN5bmNCYXJTb3VyY2VOb2RlcygoVHlwZWROb2RlKXNvdXJjZSxhY3ROb2Rlcyk7Ci0JCQkJfQotCQl9Ci0JfQotCS8qCi0JICogTWV0aG9kIHRvIGNvbGxlY3Qgc3luY2hyb25pemF0aW9uIGJhciBvdXRnb2luZyBjb25uZWN0aW9uCi0JICogZXhjZXB0IGFueSBjb25uZWN0aW9uIGdvaW5nIGZyb20gZGVjaXNpb24gcG9pbnRzLiAgCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN5bmNCYXJUYXJnZXROb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlLCBDb2xsZWN0aW9uIGFjdE5vZGVzKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCQkJCX1lbHNlIGlmKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCQkJCWlmKCgoVHlwZWROb2RlKXRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpCi0JCQkJCQlnZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSl0YXJnZXQsIGFjdE5vZGVzKTsKLQkJCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0LCBDbGFzcyBub2RlVHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSAmJiBub2RlVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gYWRkIGEgcHJvcGVydHkgdG8gR3JhcGhOb2RlIHByb3BlcnR5IGxpc3QKLQkgKiAoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSkgVmVyaWZpZXMgcHJvcGVydHkgZXhpc3RzIG9yIG5vdCwgaWYgbm90Ci0JICogY3JlYXRlcyBhIHByb3BlcnR5IHdpdGggZ2l2ZW4ga2V5IGFuZCB2YWx1ZS4gYW5kIHNldCBpbnRvIGdyYXBoIG5vZGUKLQkgKiBwcm9wZXJ0eSBsaXN0LCBpZiBleGlzdHMganVzdCBzZXRzIHZhbHVlIGZvciBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZ3JhcGhOb2RlCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gUHJvcGVydHkKLQkgKiBAYXV0aG9yIHNrYW5ub29yCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eShHcmFwaE5vZGUgZ3JhcGhOb2RlLCBTdHJpbmcga2V5LAotCQkJU3RyaW5nIHZhbHVlKSB7Ci0JCVByb3BlcnR5IHByb3BlcnR5ID0gbnVsbDsKLQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eSA9IGZpbmRQcm9wZXJ0eShncmFwaE5vZGUsIGtleSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCXByb3BlcnR5LnNldEtleShrZXkpOwotCQkJcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlncmFwaE5vZGUuc2V0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFksIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQl9IGVsc2UgewotCQkJcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0JCi0JLyoqCi0JICogQWNjZXNpYmxlIG1ldGhvZCBmb3IgQWN0aXZpdHlEZXRhaWxEaWFncmFtLCB0byBnZXQgYSBhdXRvbGF5b3V0IGZsYWcgZnJvbQotCSAqIEdyYXBoaE5vZGUgcHJvcGVydHkgbGlzdC4gcmV0dXJuIHN0cmluZyBjYW4gYmUKLQkgKiBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT0xBWU9VVF9WQUxVRV9UUlVFLAotCSAqIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPTEFZT1VUX1ZBTFVFX0ZBTFNFLCBvciBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdXRvTGF5b3V0RmxhZyhBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSkgewotCQlTdHJpbmcgZmxhZyA9IG51bGw7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBkaWFncmFtLmdldEdyYXBoTm9kZSgpOwotCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCUxpc3QgcHJvcExpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCWlmIChwcm9wTGlzdCAhPSBudWxsICYmIHByb3BMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KGdyYXBoTm9kZSwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVCk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJZmxhZyA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmbGFnOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvTGF5b3V0KEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtKXsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGRpYWdyYW0uZ2V0R3JhcGhOb2RlKCk7Ci0JCWlmKGdyYXBoTm9kZSAhPSBudWxsKXsKLQkJCUxpc3QgcHJvcExpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCWlmKHByb3BMaXN0ICE9IG51bGwgJiYgcHJvcExpc3Quc2l6ZSgpID4gMCl7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eSgKLQkJCQkJZ3JhcGhOb2RlLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQpOwotCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQlTdHJpbmcgdGVtcCA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCWlmKHRlbXAgIT0gbnVsbCAmJiB0ZW1wICE9ICIiICYmICAvLyROT04tTkxTLTEkCi0JCQkJCQkJKEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9UUlVFLmVxdWFscyh0ZW1wKQotCQkJCQkJCQkJfHwgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX0ZBTFNFLmVxdWFscyh0ZW1wKSkpewotCQkJCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRlbXApLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFza3NQZXJSb3coKXsKLS8vCQlTdHJpbmcgY291bnQgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLS8vCQkJCS5nZXRTdHJpbmcoR3JhcGhpY2FsRGF0YUhlbHBlci5BRERfRElBR1JBTV9UQVNLU19QRVJfUk9XKTsKLS8vCQlpZiAoY291bnQgIT0gbnVsbCAmJiBjb3VudC5sZW5ndGgoKSA+IDApIHsKLS8vCQkJdHJ5IHsKLS8vCQkJCWludCBpID0gSW50ZWdlci5wYXJzZUludChjb3VudCk7Ci0vLwkJCQlyZXR1cm4gaTsKLS8vCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5lKSB7Ci0vLwkJCQlyZXR1cm4gMTA7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIDEwOwotCQkKLQkJaW50IGNvdW50ID0gUHJvdmlkZXJzLmdldEF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZSgpLmdldEludChHcmFwaGljYWxEYXRhSGVscGVyLkFERF9ESUFHUkFNX1RBU0tTX1BFUl9ST1cpOwotCQlpZiAoY291bnQgPD0gMCkKLQkJCXJldHVybiAxMDsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IG9mIHtAbGluayBQcm9wZXJ0eX0gb2JqZWN0cwotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eUJ5S2V5KExpc3QgbGlzdCwgU3RyaW5nIGtleSkgewotCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGlyb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlyb3IuaGFzTmV4dCgpOykgewotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBpcm9yLm5leHQoKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlpZiAocHJvcGVydHkuZ2V0S2V5KCkuZXF1YWxzKGtleSkpIHsKLQkJCQkJCXJldHVybiBwcm9wZXJ0eTsKLQkJCQkJfQotLy8JCQkJCQllbHNlIHsKLS8vCQkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5IGdldFByb3BlcnR5KE5vZGUgbm9kZSwgU3RyaW5nIGtleSkgewotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gbm9kZS5nZXRHcmFwaE5vZGUoKTsKLQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0UHJvcGVydHkoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IGxpc3Quc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgbGlzdC5nZXQoaSk7Ci0JCQkJCWlmIChrZXkuZXF1YWxzKHByb3AuZ2V0S2V5KCkpKSB7Ci0JCQkJCQlyZXR1cm4gcHJvcDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmYmJhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVmFyeUFjdGl2aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBEaWFncmFtIGRhdGEgc3RvcmVkIGluIFVNQTogU2VtYW50aWNNb2RlbEJyaWRnZSAuUHJlc2VudGF0aW9uIGRpYWdyYW0gdHlwZSwKLSAqIGl0cyB2YWx1ZSBjYW4gYmUgb25lIG9mIGZvbGxvd2luZyBjb25zdGFudHMgZGVmaW5lZCBpbiBHcmFwaGljYWxEYXRhSGVscGVyCi0gKiBESUFHUkFNX1dPUktGTE9XLCBESUFHUkFNX1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZLCBESUFHUkFNX0FDVElWSVRZX0RFVEFJTAotICogCi0gKiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlIC5FbGVtZW50IEJyZWFrZG93bkVsZW1lbnQgdGhhdCB0aGUgRGlhZ3JhbUVsZW1lbnQgb2YKLSAqIHRoaXMgU2VtYW50aWNNb2RlbEJyaWRnZSByZXByZXNlbnRzCi0gKiAKLSAqIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IC5UeXBlSW5mbyB0eXBlIGluZm9ybWF0aW9uIGZvciBUeXBlZE5vZGUsIGl0cwotICogdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4gR3JhcGhpY2FsRGF0YUhlbHBlcgotICogd3BDb21wb3NpdGVUeXBlIFdvcmtQcm9kdWN0Q29tcG9zaXRlIHR5cGUKLSAqIAotICogRGlhZ3JhbUVsZW1lbnQgLlByb3BlcnR5IChsaXN0IG9mIHByb3BlcnRpZXMpCi0gKiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdyYXBoaWNhbERhdGFNYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkaWFncmFtUHJlc2VudGF0aW9ucyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLkRJQUdSQU1fV09SS0ZMT1csCi0JCQlHcmFwaGljYWxEYXRhSGVscGVyLkRJQUdSQU1fV09SS19QUk9EVUNUX0RFUEVOREVOQ1ksCi0JCQlHcmFwaGljYWxEYXRhSGVscGVyLkRJQUdSQU1fQUNUSVZJVFlfREVUQUlMIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIGNoaWxkVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IEFjdGl2aXR5LmNsYXNzLAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBEZXNjcmlwdG9yLmNsYXNzIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIGRpYWdyYW1DaGFuZ2VMaXN0ZW5lckNsYXNzZXMgPSBuZXcgQ2xhc3NbXSB7Ci0JCQlJQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3MsCi0JCQlJV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzLAotCQkJSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBHcmFwaGljYWxEYXRhTWFuYWdlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvL3ByaXZhdGUgTWFwIGdyYXBoaWNhbERhdGFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBMaXN0PElDb21tYW5kTGlzdGVuZXI+IGNvbW1hbmRMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIEdyYXBoaWNhbERhdGFNYW5hZ2VyKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgR3JhcGhpY2FsRGF0YU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEdyYXBoaWNhbERhdGFNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgR3JhcGhpY2FsRGF0YU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8vIHB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKEFjdGl2aXR5IGFjdCwgaW50IGRpYWdyYW1UeXBlLCBBY3Rpdml0eQotCS8vIHBhcmVudCkgewotCS8vIC8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYWN0LAotCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gLy8gT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGFjdCk7Ci0JLy8gLy8gaWYocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBpZihwYXJlbnQgPT0gbnVsbCkgewotCS8vIC8vIG5ldyBBY3Rpdml0eQotCS8vIC8vCi0JLy8gcmV0dXJuIGNyZWF0ZUdyYXBoTm9kZShhY3QpOwotCS8vIH0KLQkvLyBpZighYWN0LmdldFN1cGVyQWN0aXZpdGllcygpLmNvbnRhaW5zKHBhcmVudCkpIHsKLQkvLyB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHN1cGVyIGFjdGl2aXR5IGZvciAiICsgYWN0ICsKLQkvLyAiOiAiICsgcGFyZW50KTsKLQkvLyB9Ci0JLy8gQWN0aXZpdHkgcGFyZW50QWN0ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JLy8gRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbShwYXJlbnRBY3QsIGRpYWdyYW1UeXBlKS5nZXRVTUFEaWFncmFtKCk7Ci0JLy8gcmV0dXJuIGdldEdyYXBoTm9kZShkaWFncmFtLCBhY3QpOwotCS8vIH0KLQotCS8qKgotCSAqIEdldHMgdGhlIEdyYXBoTm9kZSBvZiB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgZm9yIHRoZSBnaXZlbiBkaWFncmFtLgotCSAqIENyZWF0ZSB0aGUgR3JhcGhOb2RlIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCWlmIChkaWFncmFtID09IG51bGwpIHsKLQkJCS8vIG5ldyBNZXRob2RFbGVtZW50Ci0JCQkvLwotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJfQotCQlHcmFwaE5vZGUgbm9kZSA9IGZpbmRHcmFwaE5vZGUoZGlhZ3JhbSwgbWV0aG9kRWxlbWVudCk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCW5vZGUgPSBjcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCQljcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZGlhZ3JhbSk7Ci0JCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLmFkZChub2RlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEdyYXBoTm9kZSBmaW5kR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG1ldGhvZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCSYmIG1ldGhvZEVsZW1lbnQgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcHVibGljIERpYWdyYW1FbGVtZW50IGdldERpYWdyYW1FbGVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCS8vIHJldHVybiBnZXRHcmFwaE5vZGUoKEFjdGl2aXR5KSBvYmplY3QpOwotCS8vIH0KLQkvLyBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCS8vIFdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBvYmplY3Q7Ci0JLy8gQnJlYWtkb3duRWxlbWVudCBiZSA9IHdvcmtPcmRlci5nZXRQcmVkKCk7Ci0JLy8gaWYoYmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCS8vIEdyYXBoTm9kZSBncmFwaE5vZGUgPSBnZXRHcmFwaE5vZGUoKEFjdGl2aXR5KSBiZSk7Ci0JLy8gTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldENvbnRhaW5lZCgpOwotCS8vIFBvbHlsaW5lIHBvbHlsaW5lID0gbnVsbDsKLQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCS8vIE9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLQkvLyBpZihvYmogaW5zdGFuY2VvZiBQb2x5bGluZSkgewotCS8vIHBvbHlsaW5lID0gKFBvbHlsaW5lKSBvYmo7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyBpZihwb2x5bGluZSA9PSBudWxsKSB7Ci0JLy8gcG9seWxpbmUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2x5bGluZSgpOwotCS8vIGxpc3QuYWRkKDAsIHBvbHlsaW5lKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIHBvbHlsaW5lOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIERpYWdyYW0gY3JlYXRlRGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCBkaWFncmFtVHlwZSkgewotCQkvLyBjaGVjayBpZiB0aGlzIGFjdGl2aXR5IGNvbnRyaWJ1dGVzL2V4dGVuZHMgb3RoZXIgYWN0aXZpdHkgYW5kIHRyeQotCQkvLyBjb3B5Ci0JCS8vIHRoZSBleGlzdGluZyBkaWFncmFtIGZyb20gdGhlIGJhc2UKLQkJLy8KLQkJaWYgKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdCkpIHsKLQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBnZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgYWN0Ci0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQlpZiAoYmFzZURpYWdyYW0gIT0gbnVsbCkgewotCQkJCURpYWdyYW0gY29weSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuY29weURpYWdyYW0oYmFzZURpYWdyYW0pOwotCi0JCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBjb3B5Ci0JCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCW1vZGVsQnJpZGdlLnNldEVsZW1lbnQoYWN0KTsKLQkJCQlyZXR1cm4gY29weTsKLQkJCX0KLQkJfQotCi0JCURpYWdyYW0gZGlhZ3JhbSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpYWdyYW0oKTsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJbW9kZWxCcmlkZ2Uuc2V0RWxlbWVudChhY3QpOwotCQltb2RlbEJyaWRnZS5zZXRQcmVzZW50YXRpb24oZGlhZ3JhbVByZXNlbnRhdGlvbnNbZGlhZ3JhbVR5cGVdKTsKLQkJZGlhZ3JhbS5zZXRTZW1hbnRpY01vZGVsKG1vZGVsQnJpZGdlKTsKLQotCQkvLyBnZXREaWFncmFtKGFjdCwgZGlhZ3JhbVR5cGUpLnNldFVNQURpYWdyYW0oZGlhZ3JhbSk7Ci0KLQkJcG9wdWxhdGVEaWFncmFtKGRpYWdyYW0sIGFjdCwgZGlhZ3JhbVR5cGUpOwotCi0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURpYWdyYW0oRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3QsIGludCBkaWFncmFtVHlwZSkgewotCQkvLyBjcmVhdGUgR3JhcGhOb2RlIGZvciBlYWNoIEJyZWFrZG93bkVsZW1lbnQgYW5kIGFkZCBpdCB0byB0aGUgZGlhZ3JhbQotCQkvLwotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGRUeXBlc1tkaWFncmFtVHlwZV0uaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCUdyYXBoTm9kZSBub2RlID0gY3JlYXRlR3JhcGhOb2RlKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLmFkZChub2RlKTsKLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjcmVhdGUgR3JhcGhDb25uZWN0b3JzIGZvciBlYWNoIEJyZWFrZG93bkVsZW1lbnQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJY3JlYXRlR3JhcGhDb25uZWN0b3JzKG5vZGUsIGRpYWdyYW0sIGRpYWdyYW1UeXBlKTsKLQkJfQotCX0KLQotLy8JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQWN0aXZpdHlEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0KSB7Ci0vLwkJLy8gY3JlYXRlIEdyYXBoTm9kZSBmb3IgZWFjaCBjaGlsZCBhY3Rpdml0eSBhbmQgYWRkIGl0IHRvIHRoZSBkaWFncmFtCi0vLwkJLy8gCi0vLwkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotLy8JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlBY3Rpdml0eSBjaGlsZEFjdCA9IChBY3Rpdml0eSkgZWxlbWVudDsKLS8vCQkJCUdyYXBoTm9kZSBub2RlID0gY3JlYXRlR3JhcGhOb2RlKGNoaWxkQWN0KTsKLS8vCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotLy8JCQkJbm9kZXMuYWRkKG5vZGUpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQkvLyBjcmVhdGUgR3JhcGhDb25uZWN0b3JzIGZvciBlYWNoIGNoaWxkIGFjdGl2aXR5Ci0vLwkJLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLS8vCQkJY3JlYXRlR3JhcGhDb25uZWN0b3JzKG5vZGUsIGRpYWdyYW0pOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKEFjdGl2aXR5IGFjdCwKLQkJCWludCBkaWFncmFtVHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lckNsYXNzZXNbZGlhZ3JhbVR5cGVdLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gKElEaWFncmFtQ2hhbmdlTGlzdGVuZXIpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoTm9kZSgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQlncmFwaE5vZGUuc2V0U2VtYW50aWNNb2RlbChtb2RlbEJyaWRnZSk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcG9pbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpOwotCQlwb2ludC5zZXRYKG5ldyBEb3VibGUoLTEpKTsKLQkJcG9pbnQuc2V0WShuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRQb3NpdGlvbihwb2ludCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIGRpbSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpbWVuc2lvbigpOwotCQlkaW0uc2V0V2lkdGgobmV3IERvdWJsZSgtMSkpOwotCQlkaW0uc2V0SGVpZ2h0KG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFNpemUoZGltKTsKLQotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCXB1YmxpYyBHcmFwaEVkZ2UgYWRkR3JhcGhDb25uZWN0b3JQYWlyKERpYWdyYW0gZGlhZ3JhbSwKLQkJCUdyYXBoTm9kZSBncmFwaE5vZGUsIFdvcmtPcmRlciBlbGVtZW50KSB7Ci0JCUdyYXBoQ29ubmVjdG9yIHNyY0Nvbm5lY3RvciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUdyYXBoQ29ubmVjdG9yKCk7Ci0JCWdyYXBoTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQoc3JjQ29ubmVjdG9yKTsKLQkJR3JhcGhFZGdlIGVkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaEVkZ2UoKTsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCWJyaWRnZS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQllZGdlLnNldFNlbWFudGljTW9kZWwoYnJpZGdlKTsKLQkJZ3JhcGhOb2RlLmdldENvbnRhaW5lZCgpLmFkZChlZGdlKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQoc3JjQ29ubmVjdG9yKTsKLQotCQlHcmFwaE5vZGUgc3VjY05vZGUgPSBnZXRHcmFwaE5vZGUoZGlhZ3JhbSwgVW1hVXRpbAotCQkJCS5nZXRPd25pbmdBY3Rpdml0eShlbGVtZW50KSk7Ci0JCUdyYXBoQ29ubmVjdG9yIHRhcmdldENvbm5lY3RvciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUdyYXBoQ29ubmVjdG9yKCk7Ci0JCXN1Y2NOb2RlLmdldEFuY2hvcmFnZSgpLmFkZCh0YXJnZXRDb25uZWN0b3IpOwotCQllZGdlLmdldEFuY2hvcigpLmFkZCh0YXJnZXRDb25uZWN0b3IpOwotCQlyZXR1cm4gZWRnZTsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhFZGdlIGFkZEdyYXBoQ29ubmVjdG9yUGFpcihHcmFwaE5vZGUgc3JjTm9kZSwKLQkJCUdyYXBoTm9kZSB0YXJnZXROb2RlKSB7Ci0JCUdyYXBoQ29ubmVjdG9yIHNyY0Nvbm5lY3RvciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUdyYXBoQ29ubmVjdG9yKCk7Ci0JCXNyY05vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0JCUdyYXBoRWRnZSBlZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhFZGdlKCk7Ci0JCXNyY05vZGUuZ2V0Q29udGFpbmVkKCkuYWRkKGVkZ2UpOwotCQllZGdlLmdldEFuY2hvcigpLmFkZChzcmNDb25uZWN0b3IpOwotCi0JCUdyYXBoQ29ubmVjdG9yIHRhcmdldENvbm5lY3RvciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUdyYXBoQ29ubmVjdG9yKCk7Ci0JCXRhcmdldE5vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHRhcmdldENvbm5lY3Rvcik7Ci0JCWVkZ2UuZ2V0QW5jaG9yKCkuYWRkKHRhcmdldENvbm5lY3Rvcik7Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUdyYXBoRWRnZShHcmFwaEVkZ2UgZWRnZSkgewotCQlFY29yZVV0aWwucmVtb3ZlKGVkZ2UpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGdlLmdldEFuY2hvcigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhDb25uZWN0b3IgY29ubiA9IChHcmFwaENvbm5lY3RvcikgaXRlci5uZXh0KCk7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKGNvbm4pOwotCQl9Ci0JfQotCi0JLy8gcHVibGljIHZvaWQgcmVtb3ZlR3JhcGhDb25uZWN0b3JQYWlyKEdyYXBoTm9kZSBzcmNOb2RlLCBHcmFwaE5vZGUKLQkvLyB0YXJnZXROb2RlKSB7Ci0JLy8gLy8gZmluZCB0aGUgc291cmNlIEdyYXBoQ29ubmVjdG9yIGFuZCByZW1vdmUgaXQsIGl0cyBHcmFwaEVkZ2UsIGFuZCBpdHMKLQkvLyB0YXJnZXQgR3JhcGhDb25uZWN0b3IKLQkvLyAvLwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHNyY05vZGUuZ2V0QW5jaG9yYWdlKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCS8vIHsKLQkvLyBHcmFwaENvbm5lY3RvciBjb25uZWN0b3IgPSAoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0b3IuZ2V0R3JhcGhFZGdlKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkvLyAuaGFzTmV4dCgpOykgewotCS8vIEdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCS8vIE9iamVjdCB0YXJnZXRDb25uZWN0b3IgPSBlZGdlLmdldEFuY2hvcigpLmdldCgxKTsKLQkvLyBpZih0YXJnZXROb2RlLmdldEFuY2hvcmFnZSgpLnJlbW92ZSh0YXJnZXRDb25uZWN0b3IpKSB7Ci0JLy8gc3JjTm9kZS5nZXRDb250YWluZWQoKS5yZW1vdmUoZWRnZSk7Ci0JLy8gLy8gZG9uJ3QgcmVtb3ZlIHRoZSBlZGdlIGZyb20gY29ubmVjdG9yIHRvIHN1cHBvcnQgdW5kbwotCS8vIC8vCi0JLy8gLy8gaXRlcmF0b3IucmVtb3ZlKCk7Ci0JLy8gfQotCS8vIH0KLQkvLyBpZihjb25uZWN0b3IuZ2V0R3JhcGhFZGdlKCkuaXNFbXB0eSgpKSB7Ci0JLy8gaXRlci5yZW1vdmUoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUdyYXBoQ29ubmVjdGlvblBhaXIoR3JhcGhOb2RlIGdyYXBoTm9kZSwKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JhcGhOb2RlLmdldEFuY2hvcmFnZSgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJR3JhcGhDb25uZWN0b3IgY29ubiA9IChHcmFwaENvbm5lY3RvcikgaXRlci5uZXh0KCk7Ci0JCQlHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGNvbm4uZ2V0R3JhcGhFZGdlKCkuZ2V0KDApOwotCQkJaWYgKGVkZ2UuZUNvbnRhaW5lcigpID09IGdyYXBoTm9kZSkgewotCQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4yID0gKEdyYXBoQ29ubmVjdG9yKSBlZGdlLmdldEFuY2hvcigpLmdldCgxKTsKLQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IGNvbm4yLmdldEdyYXBoRWxlbWVudCgpCi0JCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCQkmJiAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGJyaWRnZSkuZ2V0RWxlbWVudCgpID09IFVtYVV0aWwKLQkJCQkJCQkJLmdldE93bmluZ0FjdGl2aXR5KHdvcmtPcmRlcikpIHsKLQkJCQkJY29ubjIuZ2V0R3JhcGhFbGVtZW50KCkuZ2V0QW5jaG9yYWdlKCkucmVtb3ZlKGNvbm4yKTsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJZ3JhcGhOb2RlLmdldENvbnRhaW5lZCgpLnJlbW92ZShlZGdlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVHcmFwaENvbm5lY3RvcnMoR3JhcGhOb2RlIGdyYXBoTm9kZSwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhncmFwaE5vZGUsIGRpYWdyYW0sIGdldERpYWdyYW1UeXBlKGRpYWdyYW0pKTsKLQl9Ci0KLQlpbnQgZ2V0RGlhZ3JhbVR5cGUoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCVN0cmluZyB0eXBlU3RyID0gZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbVByZXNlbnRhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkaWFncmFtUHJlc2VudGF0aW9uc1tpXS5lcXVhbHModHlwZVN0cikpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVHcmFwaENvbm5lY3RvcnMoR3JhcGhOb2RlIGdyYXBoTm9kZSwgRGlhZ3JhbSBkaWFncmFtLAotCQkJaW50IGRpYWdyYW1UeXBlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZTsKLQkJCQkvLyBjcmVhdGUgY29ubmVjdG9ycwotCQkJCS8vCi0JCQkJLy8gTGlzdCBsaXN0ID0gYWN0LmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQkJLy8gaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCQkvLwkJCQkKLQkJCQkvLyBBY3Rpdml0eSBwYXJlbnQgPSAoQWN0aXZpdHkpCi0JCQkJLy8gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKWRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCQkJLy8gTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IHBhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkvLyBXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgbGlzdC5nZXQoaSk7Ci0JCQkJLy8gaWYoYnJlYWtkb3duRWxlbWVudHMuY29udGFpbnMod29ya09yZGVyLmdldFByZWQoKSkpIHsKLQkJCQkvLyBhZGRHcmFwaENvbm5lY3RvclBhaXIoZGlhZ3JhbSwgZ3JhcGhOb2RlLCB3b3JrT3JkZXIpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCUdyYXBoTm9kZSBzcmNOb2RlID0gZmluZEdyYXBoTm9kZShkaWFncmFtLCB3b3JrT3JkZXIKLQkJCQkJCQkuZ2V0UHJlZCgpKTsKLQkJCQkJaWYgKHNyY05vZGUgIT0gbnVsbCkgewotCQkJCQkJYWRkR3JhcGhDb25uZWN0b3JQYWlyKHNyY05vZGUsIGdyYXBoTm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQljYXNlIEdyYXBoaWNhbERhdGFIZWxwZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlc2NyaXB0b3IuZ2V0SW1wYWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBpbXBhY3RlZERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJR3JhcGhOb2RlIHRhcmdldE5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5maW5kR3JhcGhOb2RlKAotCQkJCQkJCWRpYWdyYW0sIGltcGFjdGVkRGVzY3JpcHRvcik7Ci0JCQkJCWlmICh0YXJnZXROb2RlICE9IG51bGwpIHsKLQkJCQkJCWFkZEdyYXBoQ29ubmVjdG9yUGFpcihncmFwaE5vZGUsIHRhcmdldE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhazsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgVU1BIGRpYWdyYW0gZnJvbSB0aGUgVU1BIG1vZGVsIGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgZGlhZ3JhbSB0eXBlIGNvbnN0YW50cyBkZWZpbmVkIGluCi0JICogICAgICAgICAgICB7QGxpbmsgR3JhcGhpY2FsRGF0YUhlbHBlciBHcmFwaGljYWxEYXRhSGVscGVyIH0KLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogICAgICAgICAgICBpZiB0cnVlLCBuZXcgVU1BIGRpYWdyYW0gd2lsbCBiZSBjcmVhdGVkIGlmIHRoZSBhY3Rpdml0eSBkb2VzCi0JICogICAgICAgICAgICBub3QgaGF2ZSBvbmUgYWxyZWFkeS4KLQkgKiBAcmV0dXJuCi0JICogQHNlZSBHcmFwaGljYWxEYXRhSGVscGVyI0FDVElWSVRZX0RJQUdSQU0KLQkgKiBAc2VlIEdyYXBoaWNhbERhdGFIZWxwZXIjQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0KLQkgKiBAc2VlIEdyYXBoaWNhbERhdGFIZWxwZXIjV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTQotCSAqLwotCXB1YmxpYyBEaWFncmFtIGdldFVNQURpYWdyYW0oQWN0aXZpdHkgZSwgaW50IGRpYWdyYW1UeXBlLCBib29sZWFuIGNyZWF0ZSkgewotCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCi0JCS8vIC8vIGxvb2sgZm9yIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgaW4gYWN0aXZpdHkncyBhZGFwdGVyIGxpc3QgZmlyc3QKLQkJLy8gSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKQotCQkvLyBVbWFVdGlsLmdldEFkYXB0ZXIoZSwgZGlhZ3JhbUxpc3RlbmVyVHlwZSk7Ci0JCS8vIGlmKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJLy8gZGlhZ3JhbSA9IGxpc3RlbmVyLmdldERpYWdyYW0oKS5nZXRVTUFEaWFncmFtKCk7Ci0JCS8vIGlmKGRpYWdyYW0gIT0gbnVsbCkgcmV0dXJuIGRpYWdyYW07Ci0JCS8vIH0KLQotCQlPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXI7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0RGlhZ3JhbXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQlpZiAobW9kZWxCcmlkZ2UgIT0gbnVsbAotCQkJCQkJJiYgbW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCQkmJiBlID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbW9kZWxCcmlkZ2UpCi0JCQkJCQkJCS5nZXRFbGVtZW50KCkKLQkJCQkJCSYmIGRpYWdyYW1QcmVzZW50YXRpb25zW2RpYWdyYW1UeXBlXQotCQkJCQkJCQkuZXF1YWxzKCgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbW9kZWxCcmlkZ2UpCi0JCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKSkgewotCQkJCQlyZXR1cm4gZGlhZ3JhbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3JlYXRlKSB7Ci0JCQkvLyBjb3VsZCBub3QgZmluZCBpdCwgY3JlYXRlIG5ldyBvbmUKLQkJCS8vCi0JCQlkaWFncmFtID0gY3JlYXRlRGlhZ3JhbShlLCBkaWFncmFtVHlwZSk7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldERpYWdyYW1zKCkuYWRkKGRpYWdyYW0pOwotCQkJfQotCQkJcmV0dXJuIGRpYWdyYW07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcHVibGljIERpYWdyYW0gZ2V0VU1BRGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCBkaWFncmFtVHlwZSkgewotCS8vIERpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JLy8gICAgICAgIAotCS8vIC8vIGxvb2sgZm9yIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgaW4gYWN0aXZpdHkncyBhZGFwdGVyIGxpc3QgZmlyc3QKLQkvLyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKGFjdCwKLQkvLyBkaWFncmFtVHlwZSk7Ci0JLy8gaWYobGlzdGVuZXIgIT0gbnVsbCkgewotCS8vIGRpYWdyYW0gPSBsaXN0ZW5lci5nZXREaWFncmFtKCkuZ2V0VU1BRGlhZ3JhbSgpOwotCS8vIGlmKGRpYWdyYW0gIT0gbnVsbCkgcmV0dXJuIGRpYWdyYW07Ci0JLy8gfQotCS8vIE9iamVjdCBjb250YWluZXIgPSBhY3QuZUNvbnRhaW5lcigpOwotCS8vIGlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JLy8gUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXI7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldERpYWdyYW1zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkvLyBTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JLy8gaWYobW9kZWxCcmlkZ2UgIT0gbnVsbCAmJiBtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkvLyAmJiBhY3QgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKW1vZGVsQnJpZGdlKS5nZXRFbGVtZW50KCkKLQkvLyAmJgotCS8vIGRpYWdyYW1QcmVzZW50YXRpb25zW2RpYWdyYW1UeXBlXS5lcXVhbHMoKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKW1vZGVsQnJpZGdlKS5nZXRQcmVzZW50YXRpb24oKSkpCi0JLy8gewotCS8vIHJldHVybiBkaWFncmFtOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyAvLyBjb3VsZCBub3QgZmluZCBpdCwgY3JlYXRlIG5ldyBvbmUKLQkvLyAvLwotCS8vIHJldHVybiBjcmVhdGVEaWFncmFtKGFjdCwgZGlhZ3JhbVR5cGUpOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3QsCi0JCQlpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihhY3QsCi0JCQkJZGlhZ3JhbVR5cGUpOwotCQlyZXR1cm4gbGlzdGVuZXIgPT0gbnVsbCA/IG51bGwgOiBsaXN0ZW5lci5nZXREaWFncmFtKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIGNvbW1hbmQgbGlzdGVuZXJzIHRoYXQgd2lsbCBoYW5kbGUgdGhlIGRpYWdyYW0gcmVsYXRlZCBjaGFuZ2VzIG9mIHRoZSBjb21tYW5kcyBvZiBpbnRlcmVzc2VzCi0JICogCi0JICogQHJldHVybgotCSAqIEBzZWUgSUNvbW1hbmRMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBMaXN0PElDb21tYW5kTGlzdGVuZXI+IGdldENvbW1hbmRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWNvbW1hbmRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDb21tYW5kTGlzdGVuZXI+KCk7Ci0JCX0KLQotCQljb21tYW5kTGlzdGVuZXJzLmFkZChuZXcgSUNvbW1hbmRMaXN0ZW5lcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gZ2V0IGNvbnRyaWJ1dG9yL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBjb21tYW5kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0ocGFyZW50QWN0LAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTSwgZmFsc2UpOwotCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlCi0JCQkJCQkvLyBjb250cmlidXRvcmUvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJCQkvLwotCQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGZpbmRHcmFwaE5vZGUoZGlhZ3JhbSwgYmFzZSk7Ci0JCQkJCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBncmFwaE5vZGUKLQkJCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQkJaWYgKGJyaWRnZS5nZXRFbGVtZW50KCkgIT0gYWN0KSB7Ci0JCQkJCQkJCWJyaWRnZS5zZXRFbGVtZW50KGFjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZihhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikgewotCQkJCQkJLy8gY29weSBkaWFncmFtcyBhbmQgdGhlaXIgcHVibGlzaGluZyBvcHRpb25zCi0JCQkJCQkvLwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBHcmFwaGljYWxEYXRhSGVscGVyLkRJQUdSQU1fVFlQRVMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpbnQgZGlhZ3JhbVR5cGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLkRJQUdSQU1fVFlQRVNbaV07Ci0JCQkJCQkJZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oYmFzZSwgZGlhZ3JhbVR5cGUsIGZhbHNlKTsKLQkJCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkJCURpYWdyYW0gY29weSA9IGdldFVNQURpYWdyYW0oYWN0LCBkaWFncmFtVHlwZSwgdHJ1ZSk7Ci0JCQkJCQkJCWNvcHkuc2V0U3VwcHJlc3NlZChkaWFncmFtLmdldFN1cHByZXNzZWQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0JCQkJcmV0dXJuIFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3M7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByZVVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gZ2V0IG9sZCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLS8vCQkJCVZhcnlBY3Rpdml0eUNvbW1hbmQgY21kID0gKFZhcnlBY3Rpdml0eUNvbW1hbmQpIGNvbW1hbmQ7Ci0vLwkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyID0gY21kLmdldFdyYXBwZXIoKTsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUFjdCA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0ocGFyZW50QWN0LAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTSwgZmFsc2UpOwotCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIHRoZSBvbGQgY29udHJpYnV0b3JlL3JlcGxhY2VyCi0JCQkJCQkvLyBvbGQgYW5kIHJlbGluayBpdCB0byB0aGUgYmFzZSBhY3Rpdml0eQotCQkJCQkJLy8KLQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIGFjdCk7Ci0JCQkJCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBncmFwaE5vZGUKLQkJCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQkJaWYgKGJyaWRnZS5nZXRFbGVtZW50KCkgIT0gYmFzZUFjdCkgewotCQkJCQkJCQlicmlkZ2Uuc2V0RWxlbWVudChiYXNlQWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHBvc3RVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQkKLQkJCX0KLQotCQl9KTsKLQotCQlyZXR1cm4gY29tbWFuZExpc3RlbmVyczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzBlYTU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotLyoqCi0gKiBEaWFncmFtIGNoYW5nZSBsaXN0ZW5lciBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcwotCQlJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyYWRjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGFuZ2UgbGlzdGVuZXIgZm9yIGFjdGl2aXR5IGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjY2UzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLS8qKgotICogTm9kZSBjaGFuZ2UgbGlzdGVuZXIgZm9yIGFjdGl2aXR5IG5vZGUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aXZpdHlOb2RlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBJTm9kZUNoYW5nZUxpc3RlbmVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViMDk0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklBZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBGaWx0ZXIgdGhhdCBwcm92aWRlcyBhZGFwdGVyIGZhY3RvcmllcyBmb3IgZGlmZmVyZW50IHZpZXdzIG9mIHByb2Nlc3MKLSAqIGJyZWFrZG93biBzdHJ1Y3R1cmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGV4dGVuZHMgSUZpbHRlciwgSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE4OWE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci0KLS8qKgotICogQWRhcHRlciB0byBsaXN0ZW4gdG8gZGlhZ3JhbSBjaGFuZ2VzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXIgewotCURpYWdyYW0gZ2V0RGlhZ3JhbSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDgwZDA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLS8qKgotICogQWRhcHRlciB0byBsaXN0ZW4gdG8gY2hhbmdlcyBpbiBkaWFncmFtIG5vZGUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTm9kZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWRhcHRlciB7Ci0JTm9kZSBnZXROb2RlKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNjAyZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotLyoqCi0gKiBEaWFncmFtIGNoYW5nZSBsaXN0ZW5lciBmb3Igd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NGQ4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgTW9kZWxQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTW9kZWxBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEBPdmVycmlkZQotCQkJCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIE1vZGVsU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KLQkJbmV3IE1vZGVsU3dpdGNoPEFkYXB0ZXI+KCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEaWFncmFtQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlTGluayhMaW5rIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMaW5rQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlTGlua2VkT2JqZWN0KExpbmtlZE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTGlua2VkT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlTmFtZWROb2RlKE5hbWVkTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZWROb2RlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZShOb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOb2RlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlQWN0aXZpdHlEaWFncmFtKEFjdGl2aXR5RGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlEaWFncmFtQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlVHlwZWROb2RlKFR5cGVkTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVHlwZWROb2RlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbShXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya1Byb2R1Y3ROb2RlKFdvcmtQcm9kdWN0Tm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3ROb2RlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlQWN0aXZpdHlEZXRhaWxEaWFncmFtKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZUNvbnRhaW5lcihOb2RlQ29udGFpbmVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOb2RlQ29udGFpbmVyQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZU5vZGUoUm9sZU5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVOb2RlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZVRhc2tDb21wb3NpdGUoUm9sZVRhc2tDb21wb3NpdGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFza05vZGUoVGFza05vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tOb2RlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZShXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya1Byb2R1Y3RDb21wb3NpdGUoV29ya1Byb2R1Y3RDb21wb3NpdGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlQWRhcHRlcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgQE92ZXJyaWRlCi0JCQkJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rIDxlbT5MaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlua0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0IDxlbT5MaW5rZWQgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVMaW5rZWRPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSA8ZW0+TmFtZWQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZWROb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIDxlbT5Ob2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtIDxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSA8ZW0+VHlwZWQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlVHlwZWROb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIDxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlIDxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3ROb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0gPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXIgPGVtPk5vZGUgQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZUNvbnRhaW5lckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGUgPGVtPlJvbGUgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUgPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlIDxlbT5UYXNrIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza05vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZSA8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nb2RlbEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlODhjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsU3dpdGNoPFQ+IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE1vZGVsU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgVCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkRJQUdSQU06IHsKLQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcihkaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKGRpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChkaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LOiB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VMaW5rKGxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChsaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUOiB7Ci0JCQkJTGlua2VkT2JqZWN0IGxpbmtlZE9iamVjdCA9IChMaW5rZWRPYmplY3QpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QobGlua2VkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFOiB7Ci0JCQkJTmFtZWROb2RlIG5hbWVkTm9kZSA9IChOYW1lZE5vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VOYW1lZE5vZGUobmFtZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKG5hbWVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KG5hbWVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERTogewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTm9kZShub2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qobm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfRElBR1JBTTogewotCQkJCUFjdGl2aXR5RGlhZ3JhbSBhY3Rpdml0eURpYWdyYW0gPSAoQWN0aXZpdHlEaWFncmFtKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQWN0aXZpdHlEaWFncmFtKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlhZ3JhbShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERTogewotCQkJCVR5cGVkTm9kZSB0eXBlZE5vZGUgPSAoVHlwZWROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVHlwZWROb2RlKHR5cGVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh0eXBlZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh0eXBlZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06IHsKLQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPSAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0od29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlhZ3JhbSh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUod29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFOiB7Ci0JCQkJV29ya1Byb2R1Y3ROb2RlIHdvcmtQcm9kdWN0Tm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdE5vZGUod29ya1Byb2R1Y3ROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZE5vZGUod29ya1Byb2R1Y3ROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHdvcmtQcm9kdWN0Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHdvcmtQcm9kdWN0Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06IHsKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW0gYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSOiB7Ci0JCQkJTm9kZUNvbnRhaW5lciBub2RlQ29udGFpbmVyID0gKE5vZGVDb250YWluZXIpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKG5vZGVDb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUobm9kZUNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KG5vZGVDb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfTk9ERTogewotCQkJCVJvbGVOb2RlIHJvbGVOb2RlID0gKFJvbGVOb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZU5vZGUocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkTm9kZShyb2xlTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShyb2xlTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHJvbGVOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFOiB7Ci0JCQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSAoUm9sZVRhc2tDb21wb3NpdGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlVGFza0NvbXBvc2l0ZShyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcihyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHJvbGVUYXNrQ29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREU6IHsKLQkJCQlUYXNrTm9kZSB0YXNrTm9kZSA9IChUYXNrTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tOb2RlKHRhc2tOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZE5vZGUodGFza05vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUodGFza05vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh0YXNrTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERTogewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZE5vZGUod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFOiB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUod29ya0JyZWFrZG93bkVsZW1lbnROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZE5vZGUod29ya0JyZWFrZG93bkVsZW1lbnROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURTogewotCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtQcm9kdWN0Q29tcG9zaXRlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3RDb21wb3NpdGUod29ya1Byb2R1Y3RDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIod29ya1Byb2R1Y3RDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUod29ya1Byb2R1Y3RDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh3b3JrUHJvZHVjdENvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGNhc2VEaWFncmFtKERpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlTGluayhMaW5rIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rZWQgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlua2VkIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZUxpbmtlZE9iamVjdChMaW5rZWRPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlTmFtZWROb2RlKE5hbWVkTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGNhc2VOb2RlKE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlQWN0aXZpdHlEaWFncmFtKEFjdGl2aXR5RGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR5cGVkIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGNhc2VUeXBlZE5vZGUoVHlwZWROb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0Tm9kZShXb3JrUHJvZHVjdE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBY3Rpdml0eURldGFpbERpYWdyYW0oQWN0aXZpdHlEZXRhaWxEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTm9kZUNvbnRhaW5lcihOb2RlQ29udGFpbmVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlTm9kZShSb2xlTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlVGFza0NvbXBvc2l0ZShSb2xlVGFza0NvbXBvc2l0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGFza05vZGUoVGFza05vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZShXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0Q29tcG9zaXRlKFdvcmtQcm9kdWN0Q29tcG9zaXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01vZGVsU3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9UeFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL1R4VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDI5YTk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL1R4VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFR4VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBERUZBVUxUX1RYX09QVElPTlMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXN0YXRpYyB7Ci0JCVR4VXRpbC5ERUZBVUxUX1RYX09QVElPTlMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9VTlBST1RFQ1RFRCwgQm9vbGVhbi5UUlVFKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcnVuSW5UcmFuc2FjdGlvbihFT2JqZWN0IG9iamVjdFRvTW9kaWZ5LAotCQkJUnVubmFibGUgbW9kaWZ5T3BlcmF0aW9uKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKG9iamVjdFRvTW9kaWZ5KTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQkJCQotCQlpZiAoZG9tYWluID09IG51bGwpIHsKLQkJCW1vZGlmeU9wZXJhdGlvbi5ydW4oKTsKLQkJfSBlbHNlIHsKLQkJCXJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBtb2RpZnlPcGVyYXRpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBydW5JblRyYW5zYWN0aW9uKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCWZpbmFsIFJ1bm5hYmxlIG1vZGlmeU9wZXJhdGlvbikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCW5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihkb21haW4sICIiLCBERUZBVUxUX1RYX09QVElPTlMpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJbW9kaWZ5T3BlcmF0aW9uLnJ1bigpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCi0JCX0uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxN2M4YTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHRoZSBhY3Rpdml0eSBkaWFncmFtIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZDFlM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA4MDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9uczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGIyZmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWEwNTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBEaWFncmFtIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjYTkzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvRGlhZ3JhbVVJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvRGlhZ3JhbVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMmZhYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL0RpYWdyYW1VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkiOyAgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1VSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIERpYWdyYW1VSVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1VSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL2FjdGlvbnMvQ3VzdG9tQXJyYW5nZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL2FjdGlvbnMvQ3VzdG9tQXJyYW5nZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmVmZGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9hY3Rpb25zL0N1c3RvbUFycmFuZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuaW50ZXJuYWwuQXJyYW5nZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21BcnJhbmdlQWN0aW9uIGV4dGVuZHMgQXJyYW5nZUFjdGlvbiB7Ci0KLQkKLQlwcml2YXRlIERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQ7Ci0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgdmlld2VyOwotCi0JLyoqCi0JICogQHBhcmFtIHdvcmtiZW5jaFBhZ2UKLQkgKiBAcGFyYW0gc2VsZWN0aW9uT25seQotCSAqLwotCXB1YmxpYyBDdXN0b21BcnJhbmdlQWN0aW9uKElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UsCi0JCQlib29sZWFuIHNlbGVjdGlvbk9ubHksIERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQsIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIod29ya2JlbmNoUGFnZSwgc2VsZWN0aW9uT25seSk7Ci0JCXRoaXMuZGlhZ3JhbUVkaXRQYXJ0ID0gZGlhZ3JhbUVkaXRQYXJ0OwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VsZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gZGlhZ3JhbUVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFncmFtRWRpdFBhcnQgZ2V0RGlhZ3JhbUVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZGlhZ3JhbUVkaXRQYXJ0OwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhZ3JhbUNvbW1hbmRTdGFjayBnZXREaWFncmFtQ29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gbmV3IERpYWdyYW1Db21tYW5kU3RhY2soKElEaWFncmFtRWRpdERvbWFpbil2aWV3ZXIuZ2V0RWRpdERvbWFpbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtRWRpdG9ySGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtRWRpdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzI0ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQUREaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5EaWFncmFtT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgZGlhZ3JhbSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0b3JIZWxwZXIgewotCXByaXZhdGUgTWFwPFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPiBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCA9IG5ldyBIYXNoTWFwPFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPigpOwotCQotCXB1YmxpYyBEaWFncmFtRWRpdG9ySGVscGVyKCkgewotCX0KLQkKLQlwdWJsaWMgRGlhZ3JhbU1hbmFnZXIgZ2V0RGlhZ3JhbU1hbmFnZXIoUHJvY2VzcyBwcm9jKSB7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmdldChwcm9jKTsKLQkJaWYobWdyICE9IG51bGwgJiYgbWdyLmlzRGlzcG9zZWQoKSkgewotCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2MpOwotCQkJbWdyID0gbnVsbDsKLQkJfQotCQlpZihtZ3IgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJCW1nciA9IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmdldChwcm9jKTsKLQkJCQlpZihtZ3IgPT0gbnVsbCkgewotCQkJCQltZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jLCB0aGlzKTsKLQkJCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucHV0KHByb2MsIG1ncik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtZ3I7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBvcGVuRGlhZ3JhbShJRWRpdG9yUGFydCBwYXJ0LCBpbnQgZGlhZ3JhbVR5cGUsIE9iamVjdCBzZWxlY3RlZE9iamVjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJdHJ5IHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQlzZWxlY3RlZE9iamVjdCwgc3VwcHJlc3Npb24sIGRpYWdyYW1UeXBlKTsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtRWRpdG9yKHBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgaW5wdXQsIGdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoZGlhZ3JhbVR5cGUpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgaW50IHR5cGUpIHsKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQkJRGlhZ3JhbU1hbmFnZXIgZE1nciA9IGdldERpYWdyYW1NYW5hZ2VyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkpOwotCQlpZiAoZE1nciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IGRNZ3IuZ2V0RGlhZ3JhbXMoYWN0aXZpdHksIHR5cGUpOwotCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKSBsaXN0LmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiQ29yZSBlcnJvciByZXRyaWV2aW5nIGEgZGlhZ3JhbSBpbiBwcm9jZXNzIGVkaXRvcjoiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSAKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QpIHsKLQotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBnZXREaWFncmFtTWFuYWdlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KSk7Ci0JCXRyeXsKLQkJCUFycmF5TGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IG5ldyBBcnJheUxpc3Q8RGlhZ3JhbT4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRGlhZ3JhbUhlbHBlci5ESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTGlzdDxEaWFncmFtPiBsaXN0ID0gbWdyLmdldERpYWdyYW1zKGFjdCwgRGlhZ3JhbUhlbHBlci5ESUFHUkFNX1RZUEVTW2ldKTsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW1zLmFkZEFsbChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZGlhZ3JhbXM7Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCl7Ci0JCWZvciAoRGlhZ3JhbU1hbmFnZXIgbWdyIDogcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAudmFsdWVzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldERpYWdyYW1UeXBlKERpYWdyYW0gZGlhZ3JhbSl7Ci0JCXJldHVybiBEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaWFncmFtVHlwZVN0cmluZyhEaWFncmFtIGRpYWdyYW0pewotCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZVN0cmluZyhkaWFncmFtKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlc0hpbnQgZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludChpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgZGlhZ3JhbSBlZGl0b3JzCi0JICogCi0JICogQHBhcmFtIGNsb3NlRWxlbWVudAotCSAqIEBwYXJhbSBjbG9zZUVkaXRvclJlZnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VEaWFncmFtRWRpdG9ycyhPYmplY3QgY2xvc2VFbGVtZW50LCAKLQkJCWphdmEudXRpbC5MaXN0PElFZGl0b3JSZWZlcmVuY2U+IGNsb3NlZEVkaXRvclJlZnMpIHsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IERpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZih3b3JrYmVuY2hQYWdlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlpZihjbG9zZWRFZGl0b3JSZWZzID09IG51bGwpIHsKLQkJCWNsb3NlZEVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCX0KLQkJQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChkaWFncmFtSW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkvLyBjbG9zZSB0aGUgcGFyZW50IGVkaXRvciB0b28sIGlmIG9wZW5lZC4KLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlpZihlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCQkJY2xvc2VEaWFncmFtRWRpdG9ycyhwYXJlbnQsIGNsb3NlZEVkaXRvclJlZnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKSB7Ci0JCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBjaGVjayB3aGV0aGVyIGVsZW1lbnQgaXMgY2hpbGQgb2YgY2xvc2VFbGVtZW50Ci0JCQkJCQkvLyBkaXJlY3RseS9pbmRpcmVjdGx5Ci0JCQkJCQlpZiAoY2xvc2VFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJUHJvY2Vzc1V0aWwuZ2V0Q2hpbGRFbGVtZW50cygKLQkJCQkJCQkJCShBY3Rpdml0eSkgY2xvc2VFbGVtZW50LCBBY3Rpdml0eS5jbGFzcywKLQkJCQkJCQkJCWNvbGxlY3Rpb24pOwotCQkJCQkJCWlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQkJcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIERpYWdyYW0gZWRpdG9ycyBvZiBvYmplY3QgaXRzZWxmIHdpbGwgYmUgY2xvc2VkLiBBbmQgUGFyZW50IGRpYWdyYW0KLQkgKiBlZGl0b3JzIHdpbGwgYmUgcmVmcmVzaGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUGFyZW50RGlhZ3JhbUVkaXRvcnMoT2JqZWN0IHJlZnJlc2hFbGVtZW50LAotCQkJamF2YS51dGlsLkxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gb3BlbkVkaXRvclJlZnMsIGJvb2xlYW4gcGFyZW50UmVmcmVzaCkgewotCQlvcGVuRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJLy8gTm93IHJlZnJlc2ggb2JqZWN0J3MgcGFyZW50J3MgZGlhZ3JhbXMuCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkKLQkJCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChkaWFncmFtSW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYocGFyZW50UmVmcmVzaCl7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCU9iamVjdCBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotCQkJCQkJCQkJLmdldFBhcmVudChudWxsKTsKLQkJCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJaWYgKGVsZW1lbnQuZXF1YWxzKHJlZnJlc2hFbGVtZW50KSkKLQkJCQkJCQkJCXJlZnJlc2hQYXJlbnREaWFncmFtRWRpdG9ycyhwYXJlbnQsCi0JCQkJCQkJCQkJCW9wZW5FZGl0b3JSZWZzLCBwYXJlbnRSZWZyZXNoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpZighcGFyZW50UmVmcmVzaCl7Ci0JCQkJCQkJaWYoZWxlbWVudCA9PSByZWZyZXNoRWxlbWVudCl7Ci0JCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICgoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCS5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQllbHNlIGlmIChyZWZyZXNoRWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJT2JqZWN0IGxvY2FsUmVmcmVzaEVsZW1lbnQgPSByZWZyZXNoRWxlbWVudDsKLQkJCQkJCQl3aGlsZSAoKGxvY2FsUmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGxvY2FsUmVmcmVzaEVsZW1lbnQpCi0JCQkJCQkJCQkJCS5nZXRPd25lcigpICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGxvY2FsUmVmcmVzaEVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldE93bmVyKCkuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlsb2NhbFJlZnJlc2hFbGVtZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgbG9jYWxSZWZyZXNoRWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0T3duZXIoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZigoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCl7Ci0JCQkJCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJaWYgKCgoQWN0aXZpdHkpIGJhc2UpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJCS5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJQ29sbGVjdGlvbiBjID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkKLQkJCQkJCQkJLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQkJaWYgKGMgIT0gbnVsbCAmJiBjLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSkgewotCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBvcGVuRWRpdG9yUmVmcy5zaXplKCk7Ci0JCS8vIElFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJRWRpdG9yUmVmZXJlbmNlKSBvcGVuRWRpdG9yUmVmcwotCQkJCQkuZ2V0KGkpOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgZWRpdG9yKS5yZWZyZXNoRGlhZ3JhbSgpOwotCQkJCWlmKGVkaXRvciBpbnN0YW5jZW9mIEFERGlhZ3JhbUVkaXRvcil7Ci0JCQkJCSgoQUREaWFncmFtRWRpdG9yKWVkaXRvcikucnVuUmVzZXRMYXlvdXRBY3Rpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIGNvbW1hbmQgbGlzdGVuZXJzIHRoYXQgd2lsbCBoYW5kbGUgdGhlIGRpYWdyYW0gcmVsYXRlZCBjaGFuZ2VzIG9mIHRoZSBjb21tYW5kcyBvZiBpbnRlcmVzc2VzCi0JICogCi0JICogQHJldHVybgotCSAqIEBzZWUgSUNvbW1hbmRMaXN0ZW5lcgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBMaXN0PElDb21tYW5kTGlzdGVuZXI+IGdldENvbW1hbmRMaXN0ZW5lcnMoKSB7Ci0vLwkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgPT0gbnVsbCkgewotLy8JCQljb21tYW5kTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJQ29tbWFuZExpc3RlbmVyPigpOwotLy8JCX0KLS8vCi0vLwkJY29tbWFuZExpc3RlbmVycy5hZGQobmV3IElDb21tYW5kTGlzdGVuZXIoKSB7Ci0vLwkJCQotLy8JCQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpIHsKLS8vCQkJCS8vIGdldCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLS8vCQkJCS8vCi0vLwkJCQlpZih0cnVlKSByZXR1cm47Ci0vLwkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNvbW1hbmQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0vLwkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotLy8JCQkJRGlhZ3JhbU1hbmFnZXIgZE1nciA9IG51bGw7Ci0vLwkJCQlEaWFncmFtTWFuYWdlciBiYXNlTWdyID0gbnVsbDsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotLy8JCQkJCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0vLwkJCQkJCWRNZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsCi0vLwkJCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MocGFyZW50QWN0KSk7Ci0vLwkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0vLwkJCQkJCUxpc3Q8RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkTWdyLmdldERpYWdyYW1zKHBhcmVudEFjdCwKLS8vCQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0vLwkJCQkJCWlmICghZGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJCQlkaWFncmFtID0gZGlhZ3JhbXMuZ2V0KDApOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLS8vCQkJCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgYmFzZSBhbmQgbGluayBpdCB0byB0aGUKLS8vCQkJCQkJCS8vIGNvbnRyaWJ1dG9yZS9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLS8vCQkJCQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKGRpYWdyYW0sIGJhc2UpOwotLy8JCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotLy8JCQkJCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLS8vCQkJCQkJCQkJCS5nZXROb2RlQWRhcHRlcihub2RlLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbAotLy8JCQkJCQkJCQkJJiYgYWRhcHRlci5nZXRFbGVtZW50KCkgIT0gYWN0KSB7Ci0vLwkJCQkJCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoKEVNb2RlbEVsZW1lbnQpIG5vZGUKLS8vCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgpLCBhY3QpOwotLy8JCQkJCQkJCQlCcmlkZ2VIZWxwZXIKLS8vCQkJCQkJCQkJCQkudW5tYXJrSW5IZXJpdGVkKChFTW9kZWxFbGVtZW50KSBub2RlCi0vLwkJCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgpKTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJaWYgKGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpIHsKLS8vCQkJCQkJCS8vIGNvcHkgZGlhZ3JhbXMgYW5kIHRoZWlyIHB1Ymxpc2hpbmcgb3B0aW9ucwotLy8JCQkJCQkJYmFzZU1nciA9IERpYWdyYW1NYW5hZ2VyCi0vLwkJCQkJCQkJCS5nZXRJbnN0YW5jZShUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZSkpOwotLy8JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBEaWFncmFtSGVscGVyLkRJQUdSQU1fVFlQRVMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCQkJCQlpbnQgZGlhZ3JhbVR5cGUgPSBEaWFncmFtSGVscGVyLkRJQUdSQU1fVFlQRVNbaV07Ci0vLwkJCQkJCQkJTGlzdCBiYXNlRGlhZ3JhbXMgPSBiYXNlTWdyLmdldERpYWdyYW1zKGJhc2UsCi0vLwkJCQkJCQkJCQlkaWFncmFtVHlwZSk7Ci0vLwkJCQkJCQkJaWYgKCFiYXNlRGlhZ3JhbXMuaXNFbXB0eSgpICYmIGJhc2VEaWFncmFtcy5nZXQoMCkgIT0gbnVsbCkgewotLy8JCQkJCQkJCQlEaWFncmFtIGNvcHkgPSBiYXNlTWdyLmNyZWF0ZURpYWdyYW0oYWN0LAotLy8JCQkJCQkJCQkJCWRpYWdyYW1UeXBlLCBudWxsKTsKLS8vCQkJCQkJCQkJaWYgKGlzUHVibGlzaERpYWdyYW0oYmFzZSwgZGlhZ3JhbVR5cGUpKSB7Ci0vLwkJCQkJCQkJCQlzZXREaWFncmFtT3B0aW9ucyhhY3QsIGRpYWdyYW1UeXBlKTsKLS8vCQkJCQkJCQkJfQotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0vLwkJCQkJCi0vLwkJCQl9Ci0vLwkJCQlmaW5hbGx5ewotLy8JCQkJCWlmKGRNZ3IgIT0gbnVsbCl7Ci0vLwkJCQkJCWRNZ3IucmVsZWFzZSgpOwotLy8JCQkJCX0KLS8vCQkJCQlpZihiYXNlTWdyICE9IG51bGwpewotLy8JCQkJCQlkTWdyLnJlbGVhc2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCXB1YmxpYyBDbGFzcyBnZXRDb21tYW5kVHlwZSgpIHsKLS8vCQkJCXJldHVybiBWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzOwotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotLy8JCQkJLy8gZ2V0IG9sZCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLS8vCQkJCS8vCi0vLwkJCQlpZih0cnVlKSByZXR1cm47Ci0vLwkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNvbW1hbmQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUFjdCA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwkJCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0vLwkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotLy8JCQkJCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MocGFyZW50QWN0KSk7Ci0vLwkJCQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsgCi0vLwkJCQkJdHJ5IHsKLS8vCQkJCQkJTGlzdCBkaWFncmFtcyA9IGRNZ3IuZ2V0RGlhZ3JhbXMocGFyZW50QWN0LAotLy8JCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0vLwkJCQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbXMuZ2V0KDApOwotLy8JCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIHRoZSBvbGQKLS8vCQkJCQkJCS8vIGNvbnRyaWJ1dG9yZS9yZXBsYWNlcgotLy8JCQkJCQkJLy8gb2xkIGFuZCByZWxpbmsgaXQgdG8gdGhlIGJhc2UgYWN0aXZpdHkKLS8vCQkJCQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKGRpYWdyYW0sIGFjdCk7Ci0vLwkJCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlcgotLy8JCQkJCQkJCQkJLmdldE5vZGVBZGFwdGVyKG5vZGUuZ2V0RWxlbWVudCgpKTsKLS8vCQkJCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsCi0vLwkJCQkJCQkJCQkmJiBhZGFwdGVyLmdldEVsZW1lbnQoKSAhPSBiYXNlQWN0KSB7Ci0vLwkJCQkJCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoKEVNb2RlbEVsZW1lbnQpIG5vZGUKLS8vCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgpLCBiYXNlQWN0KTsKLS8vCQkJCQkJCQkJQnJpZGdlSGVscGVyCi0vLwkJCQkJCQkJCQkJLm1hcmtJbmhlcml0ZWQoKEVNb2RlbEVsZW1lbnQpIG5vZGUKLS8vCQkJCQkJCQkJCQkJCS5nZXRFbGVtZW50KCkpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCQkvLyByZW1vdmUgZGlhZ3JhbXMgCi0vLwkJCQkJCQotLy8JCQkJCQkKLS8vCQkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotLy8JCQkJCQkKLS8vCQkJCQl9Ci0vLwkJCQkJZmluYWxseSB7Ci0vLwkJCQkJCQkKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCXB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0vLwkJCQkKLS8vCQkJfQotLy8KLS8vCQl9KTsKLS8vCi0vLwkJcmV0dXJuIGNvbW1hbmRMaXN0ZW5lcnM7Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpYWdyYW1PcHRpb25zKEFjdGl2aXR5IGFjdGl2aXR5ICwgaW50IGRpYWdyYW1UeXBlKXsKLQkJc3dpdGNoKGRpYWdyYW1UeXBlKXsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBRChhY3Rpdml0eSwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFERChhY3Rpdml0eSwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoV1BERChhY3Rpdml0eSwgZmFsc2UpOwotCQkJYnJlYWs7CQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1Ymxpc2hEaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBpbnQgZGlhZ3JhbVR5cGUpewotCQlzd2l0Y2goZGlhZ3JhbVR5cGUpewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIERpYWdyYW1PcHRpb25zLmlzUHVibGlzaEFEKGFjdGl2aXR5KTsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoQUREKGFjdGl2aXR5KTsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hXUEREKGFjdGl2aXR5KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtRWRpdG9yU3RhdGVQcmVzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkZmNiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtRWRpdG9yU3RhdGVQcmVzZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLlNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9yU3RhdGVQcmVzZXJ2ZXIgewotCXByaXZhdGUgSUVkaXRvclJlZmVyZW5jZSBkaWFncmFtRWRpdG9yUmVmOwotCXByaXZhdGUgYm9vbGVhbiBkaXJ0eTsKLQotCXB1YmxpYyBEaWFncmFtRWRpdG9yU3RhdGVQcmVzZXJ2ZXIoT2JqZWN0IGFjdGl2aXR5T3JXcmFwcGVyLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSgKLQkJCQluZXcgRGlhZ3JhbUVkaXRvcklucHV0KGFjdGl2aXR5T3JXcmFwcGVyLCBzdXBwcmVzc2lvbiwgZGlhZ3JhbVR5cGUpLCAKLQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoZGlhZ3JhbVR5cGUpKTsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQlTdHJpbmcgZWRpdG9ySWQgPSBEaWFncmFtRWRpdG9yVXRpbC5nZXRFZGl0b3JJZChkaWFncmFtVHlwZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA9IGVkaXRvclJlZnNbaV07Ci0JCQkJaWYoaW5wdXQuZXF1YWxzKGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpKSAmJiBlZGl0b3JSZWYuZXF1YWxzKGVkaXRvcklkKSkgewotCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQlkaWFncmFtRWRpdG9yUmVmID0gZWRpdG9yUmVmOwkJCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKGRpYWdyYW1FZGl0b3JSZWYgIT0gbnVsbCkgewotCQkJCWRpcnR5ID0gZGlhZ3JhbUVkaXRvclJlZi5nZXRFZGl0b3IoZmFsc2UpLmlzRGlydHkoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzdG9yZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChkaWFncmFtRWRpdG9yUmVmICE9IG51bGwgJiYgIWRpcnR5KSB7Ci0JCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIGRpYWdyYW1FZGl0b3JSZWYKLQkJCQkJCS5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJCUlEb2N1bWVudFByb3ZpZGVyIGRvY1Byb3ZpZGVyID0gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCi0JCQkJCS8vIHRoaXMgd2lsbCBjbGVhciBkaXJ0eSBmbGFnIG9mIHRoZSBlZGl0b3IKLQkJCQkJLy8KLQkJCQkJaWYgKGRvY1Byb3ZpZGVyIGluc3RhbmNlb2YgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikgewotCQkJCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSBkb2NQcm92aWRlcikKLQkJCQkJCQkJLm1hcmtEb2N1bWVudEFzU2F2ZWQoKElGaWxlRWRpdG9ySW5wdXQpIGRpYWdyYW1FZGl0b3JSZWYKLQkJCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtSW1hZ2VTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtSW1hZ2VTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZDg4MDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXIuTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlci5OZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyLk5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGlhZ3JhbU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LlByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogUHJvdmlkZXMgc2VydmljZSBtZXRob2RzIGZvciBjcmVhdGluZyBkaWFncmFtIGltYWdlcyBmb3IgYWN0aXZpdHkgZWxlbWVudHMKLSAqICAgCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW1hZ2VTZXJ2aWNlIGltcGxlbWVudHMgSURpYWdyYW1JbWFnZVNlcnZpY2UgewotCi0Jc3RhdGljIGJvb2xlYW4gZGVidWcgID0gRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBob2xkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBGaWxlIHB1YkRpcjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZm9yWE1MRXhwb3J0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiB0eXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0JcHJpdmF0ZSBEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaFVuY3JlYXRlZEFERCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZXhpc3QgPSB0cnVlOwotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0KLQlzdGF0aWMgewotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1csIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSk7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwsIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWSwgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRUeXBlKFN0cmluZyBkaWFncmFtVHlwZSkgewotCQlJbnRlZ2VyIHR5cGUgPSAoSW50ZWdlcikgdHlwZU1hcC5nZXQoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHlwZS5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzSGludCBnZXRQcmVmZXJlbmNlSGludChTdHJpbmcgZGlhZ3JhbVR5cGUpewotCQlpbnQgdHlwZSA9IGdldEludFR5cGUoZGlhZ3JhbVR5cGUpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ1R5cGUoaW50IHR5cGUpIHsKLQkJc3dpdGNoKHR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JU2hlbGwgc2hlbGwgPSBudWxsOwotCi0JcHJpdmF0ZSBTZXQ8RGlhZ3JhbU1hbmFnZXI+IGRpYWdyYW1NYW5hZ2VycyA9IG5ldyBIYXNoU2V0PERpYWdyYW1NYW5hZ2VyPigpOwotCi0vLwlwdWJsaWMgRGlhZ3JhbUltYWdlU2VydmljZSgpIHsKLS8vCQl0aGlzKG51bGwsIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpKTsKLS8vCX0KLQotCXB1YmxpYyBEaWFncmFtSW1hZ2VTZXJ2aWNlKEZpbGUgcHViRGlyKSB7Ci0JCXRoaXMobnVsbCwgcHViRGlyKTsKLQl9Ci0KLQlwdWJsaWMgRGlhZ3JhbUltYWdlU2VydmljZShDb21wb3NpdGUgcGFyZW50LCBGaWxlIHB1YkRpcikgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgZ2V0RGlhZ3JhbVZpZXdlcihpbnQgZGlhZ3JhbVR5cGUsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCS8vIGlmIHRoZSBzaGVsbCB3aW5kb3cgaXMgZGlzdHJveWVkLCByZWNyZWF0ZSBpdAotCQlpZiAoKHRoaXMuc2hlbGwgIT0gbnVsbCkgJiYgdGhpcy5zaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMucGFyZW50ID0gbnVsbDsKLQkJCXRoaXMuc2hlbGwgPSBudWxsOwotCQl9Ci0JCWdldFZpZXdlckhvbGRlcihwYXJlbnQpOwotCi0JCXN3aXRjaCAoZGlhZ3JhbVR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBuZXcgTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyKGhvbGRlciwgd3JhcHBlcik7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IE5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlcihob2xkZXIsd3JhcHBlcik7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBuZXcgTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlcihob2xkZXIsd3JhcHBlcik7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFZpZXdlckhvbGRlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJaWYgKHNoZWxsID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJc2hlbGwgPSBjcmVhdGVTaGVsbCgpOwotCQkJfQotCQkJc2hlbGwub3BlbigpOwotCQkJcGFyZW50ID0gc2hlbGw7Ci0JCX0KLQotCQlpZiAoaG9sZGVyICE9IG51bGwpIHsKLQkJCWhvbGRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlob2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlob2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOyAvLyBzaXplIGNhbid0IGJlIDAsMAotCQkvLyBvdGhlcndpc2UgdGhlIGRpYWdyYW0KLQkJLy8gd2lsbCBub3QgYmUgcGFpbnRlZAotCQlob2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlob2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBTaGVsbCBjcmVhdGVTaGVsbCgpIHsKLQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwgMCwgMCwgMCk7Ci0JCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKChzaGVsbCAhPSBudWxsKSAmJiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWZvciAoRGlhZ3JhbU1hbmFnZXIgbWdyIDogZGlhZ3JhbU1hbmFnZXJzKSB7Ci0JCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzYXZlIHRoZSBlbGVtZW50IGRpYWdyYW0gaW1hZ2UgYW5kIHJldHVybnMgdGhlIGltYWdlIGZpbGUgdXJsLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIGltZ1BhdGgKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBJRmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqICAgICAgICAgICAgU3VwcHJlc3Npb24KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgaW1hZ2UgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlI3NhdmVEaWFncmFtKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyBzYXZlRGlhZ3JhbShmaW5hbCBPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIAotCQkJZmluYWwgU3RyaW5nIGRpYWdyYW1UeXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBpbml0aWFsaXplIHRoZSBkaWFncmFtSW5mbwotCQlkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJLy8gZ3JhYiB0aGUgVUkgdGhyZWFkIHRvIGF2b2lkIHRocmVhZCBhY2Nlc3MgZXJyb3IKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCV9faW50ZXJuYWxfc2F2ZURpYWdyYW0od3JhcHBlciwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUsIGZpbHRlciwgc3VwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGRpYWdyYW1JbmZvOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNVc2VyRGVmaW5lZERpYWdyYW0oQWN0aXZpdHkgZSwgU3RyaW5nIGltZ1BhdGgsIGludCB0eXBlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgdXNlciBkZWZpbmVkIGRpYWdyYW0sIHVzZSBpdAotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIGluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbygKLQkJCQkoQWN0aXZpdHkpIGUpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWlmIChpbmZvLmNhblB1Ymxpc2hBREltYWdlKCkpIHsKLQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkKLQkJCQkJCSYmIGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJaWYgKGluZm8uY2FuUHVibGlzaEFEREltYWdlKCkpIHsKLQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkKLQkJCQkJCSYmIGluZm8uY2FuUHVibGlzaEFEREltYWdlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJaWYgKGluZm8uY2FuUHVibGlzaFdQREltYWdlKCkpIHsKLQkJCQlyZXR1cm4gKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwpCi0JCQkJCQkmJiBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgX19pbnRlcm5hbF9zYXZlRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsCi0JCQlTdHJpbmcgZGlhZ3JhbVR5cGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJaWYgKHN1cC5pc1N1cHByZXNzZWQod3JhcHBlcikpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJaW50IHR5cGUgPSBnZXRJbnRUeXBlKGRpYWdyYW1UeXBlKTsKLQkJaWYgKHR5cGUgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJX2ludGVybmFsX2dlbmVyYXRlSW1hZ2Uod3JhcHBlciwgaW1nUGF0aCwgdHlwZSwgZmlsdGVyLCBzdXAsIHRydWUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGlhZ3JhbSBKUEVHIGZvciBnaXZlbiBBY3Rpdml0eSBhbmQgIAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIGltZ1BhdGgKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRGlhZ3JhbUltYWdlKGZpbmFsIE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwgCi0JCQlmaW5hbCBpbnQgZGlhZ3JhbVR5cGUsIGZpbmFsIElGaWx0ZXIgZmlsdGVyLAotCQkJZmluYWwgU3VwcHJlc3Npb24gc3VwLCBmaW5hbCBib29sZWFuIHJlYWxpemVkRGlhZ3JhbSl7Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlfaW50ZXJuYWxfZ2VuZXJhdGVJbWFnZSh3cmFwcGVyLCBpbWdQYXRoLCBkaWFncmFtVHlwZSwgZmlsdGVyLCBzdXAsIGZhbHNlLCByZWFsaXplZERpYWdyYW0pOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGltZ1BhdGg7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSBkaWFncmFtIHZpZXdlciBhbmQgZ2VuZXJhdGUgaW1hZ2UgYW5kIHNhdmVzIHRoZSBpbWFnZS4KLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiBAcGFyYW0gY2FsY3VsYXRlRGlhZ3JhbUluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgX2ludGVybmFsX2dlbmVyYXRlSW1hZ2UoT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLAotCQkJaW50IHR5cGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXAsIGJvb2xlYW4gY2FsY3VsYXRlRGlhZ3JhbUluZm8sCi0JCQlib29sZWFuIHJlYWxpemVkRGlhZ3JhbSl7Ci0JCQotCQlleGlzdCA9IHRydWU7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJCi0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG87Ci0JCQotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCQkvLyBrZWVwIHRoZSBkaXJ0eSBmbGFnIGFuZCByZXNldCBiYWNrIHRvIGF2b2lkIG1ha2UgdGhlIGxpYnJhcnkgZGlydHkKLQkJYm9vbGVhbiBkaXJ0eUZsYWcgPSBlLmVSZXNvdXJjZSgpLmlzTW9kaWZpZWQoKTsKLQotCQl0cnkgewotCQkJCi0JCQlPYmplY3Qgb2JqZWN0ID0gY2FuQ3JlYXRlSW1hZ2Uod3JhcHBlciwgaW1nUGF0aCwgdHlwZSwgZmlsdGVyLCBzdXApOwotCQkJaWYocmVhbGl6ZWREaWFncmFtICYmIG9iamVjdCA9PSBudWxsKXsKLQkJCQlyZXR1cm47Ci0JCQl9ZWxzZXsKLQkJCQl3cmFwcGVyID0gb2JqZWN0OwotCQkJfQotCQkJdHJ5IHsKLQkJCQl2aWV3ZXIgPSBnZXREaWFncmFtVmlld2VyKHR5cGUsIHdyYXBwZXIpOwotCQkJCWlmKGNvbmZpZyAhPSBudWxsKXsKLQkJCQkJdmlld2VyLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQl9Ci0JCQkJRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gdmlld2VyLmxvYWREaWFncmFtKHdyYXBwZXIsICFleGlzdCwgZmlsdGVyLCBzdXApOwotCQkJCWlmKGRpYWdyYW1FZGl0UGFydCA9PSBudWxsKXsKLQkJCQkJaWYoZGVidWcpewotCQkJCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS4KLQkJCQkJCWxvZ0Vycm9yKCJQdWJsaXNoaW5nOiBEaWFncmFtSW1hZ2VTZXJ2aWNlIHZpZXdlciBFZGl0UGFydCBpcyBudWxsOiAiK3dyYXBwZXIpOwkvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX1lbHNlewotCQkJCQlpZihkaWFncmFtRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmKGNhbGN1bGF0ZURpYWdyYW1JbmZvKXsKLQkJCQkJZGlhZ3JhbUluZm8gPSB2aWV3ZXIuZ2V0RGlhZ3JhbUluZm8oKTsKLQkJCQl9Ci0JCQkJaW1hZ2UgPSB2aWV3ZXIuY3JlYXRlRGlhZ3JhbUltYWdlKCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJLy8gc2F2ZSB0aGUgaW1hZ2UKLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUocHViRGlyLCBpbWdQYXRoKTsKLQotCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgY3JlYXRlZCBvdGhlcndpc2UgZXhjZXB0aW9uCi0JCQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCWlmICghcGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJCQlwYXJlbnQubWtkaXJzKCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQl9Ci0JCQkJCU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCQkJCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10geyBpbWFnZS5nZXRJbWFnZURhdGEoKSB9OwotCQkJCQlsb2FkZXIuc2F2ZShvcywgU1dULklNQUdFX0pQRUcpOwkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkiRmFpbGVkIHRvIGNyZWF0ZSBkaWFncmFtIGltYWdlIGZvciIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoY2FsY3VsYXRlRGlhZ3JhbUluZm8gJiYgZGlhZ3JhbUluZm8gIT0gbnVsbCAmJiAhZGlhZ3JhbUluZm8uaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW1JbmZvLnNldEltYWdlRmlsZVBhdGgoaW1nUGF0aCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMSkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQkvLyBkZWxldGUgdGhlIG5ld2x5IGNyZWF0ZWQgZGlhZ3JhbSBmcm9tIHRoZSBsaWJyYXJ5Ci0JCQlpZiAoIWV4aXN0KSB7Ci0JCQkJRGlhZ3JhbSBkID0gZ2V0RGlhZ3JhbShlLCB0eXBlKTsKLQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCURpYWdyYW1IZWxwZXIuZGVsZXRlRGlhZ3JhbShkLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkV4Y2VwdGlvbiIrZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJLy8gcmVzdG9yZSB0aGUgZGlydHkgZmxhZwotCQkJCWUuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQoZGlydHlGbGFnKTsKLQotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQl2aWV3ZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMSkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JcHJpdmF0ZSBPYmplY3QgY2FuQ3JlYXRlSW1hZ2UoT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLAotCQkJaW50IHR5cGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbil7Ci0KLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5ewotCQkJLy9NZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClvOwotCQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSkgbzsKLQkJCWlmIChoYXNVc2VyRGVmaW5lZERpYWdyYW0oKEFjdGl2aXR5KSBlLCBpbWdQYXRoLCB0eXBlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJLy8gQ2hlY2sgZGlhZ3JhbSBleGlzdHMsIGRvbid0IGdlbmVyYXRlIGZvciBzdXBwcmVzc2VkLgotCQkJRGlhZ3JhbSBkID0gZ2V0RGlhZ3JhbShlLCB0eXBlKTsKLQotCQkJLy8gQ2hlY2sgcHVibGlzaGluZyBvcHRpb25zLgotCQkJZXhpc3QgPSAoZCAhPSBudWxsKTsKLQkJCQotCQkJaWYgKGlzRm9yWE1MRXhwb3J0KCkpIHsKLQkJCQlpZiAoZXhpc3QgJiYgY2FuUHVibGlzaERpYWdyYW0oZCxlKSkgewotCQkJCQlyZXR1cm4gZTsKLQkJCQl9CQkJCQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlpZiAoZXhpc3QpIHsKLQkJCQkKLQkJCQlpZighY2FuUHVibGlzaERpYWdyYW0oZCxlKSkgcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJaWYgKHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0gKSB7Ci0JCQkJCQotCQkJCQkvLyBJZiBhbiBleHRlbnNpb24gaGFzIGl0cyBvd24gZGlhZ3JhbS4gQmFzZSBpcyByZXBsYWNlZCBvcgotCQkJCQkvLyBjb250cmlidXRlZC5leHRlbnNpb24gZGlhZ3JhbSBzaG93cyByZWFsaXplZCBlbGVtZW50IGluIHVuZGVmaW5lZAotCQkJCQkvLyBsb2NhdGlvbi4gSW4gcHVibGlzaGluZyBkb24ndCBkaXNwbGF5IGV4dGVuc2lvbiBkaWFncmFtIGV2ZW4gaWYgaXQgaGFzCi0JCQkJCS8vIGl0cyBvd24gZGlhZ3JhbSBpZiByZWFsaXplZCBlbGVtZW50cyBhcmUgY29taW5nIGluIHRocm91Z2gKLQkJCQkJLy8gdmFyaWFiaWxpdHkuCi0JCQkJCWlmICggaXNCcmVha2Rvd25FbGVtZW50c1JlcGxhY2VkKGUsIGZpbHRlcikgKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQotCQkJCQkvLyBpZiB0aGUgb2JqZWN0IGlzIGEgd3JhcHBlciwgdGhlIGRpYWdyYW0gaXMgZnJvbSBpdCdzIGJhc2UsCi0JCQkJCS8vIGRvbid0IHNob3cgdGhlIEFEIGlkIHRoZSBwcmVmZXJlbmNlIGlzIG5vdCBzZXQKLQkJCQkJaWYgKCAoZSAhPSB3cmFwcGVyKSAmJiAhcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCS8vIENoZWNrIHZhcmlhYmlsaXR5IGFuZCBiYXNlJ3MgdmFyaWFiaWxpdHkuCi0vLwkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWRCYXNlID0gY2hlY2tWYXJpYWJpbGl0eShlLAotLy8JCQkJCQkJZmlsdGVyLCB0eXBlKTsKLS8vCQkJCQlpZiAoY2FsY3VsYXRlZEJhc2UgIT0gbnVsbCkgewotLy8JCQkJCQl3cmFwcGVyID0gY2FsY3VsYXRlZEJhc2U7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQl9IGVsc2UgaWYgKCB0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkgewotCQkJCQlpZiAoIChlICE9IHdyYXBwZXIpICYmICFwdWJsaXNoVW5jcmVhdGVkQUREICkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9IGVsc2UgewotCi0JCQkJaWYgKCh0eXBlID09IElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGlhZ3JhbSB1biBvcGVuZWQgZXh0ZW5zaW9uIHB1Ymxpc2guCi0JCQkJaWYgKHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pIHsKLQkJCQkJLy8gSWYgb3B0aW9uIGlzIG5vdCBjaGVja2VkLCBkb24ndCBnZW5lcmF0ZSBhIGRpYWdyYW0KLQkJCQkJaWYgKCFwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbikKLQkJCQkJCXJldHVybiBudWxsOwotCi0JCQkJCS8vIElmIGV4dGVuc2lvbiBpcyBtb2RpZmllZCBkb24ndCBnZW5lcmF0ZSBpdC4KLQkJCQkJaWYgKCFlLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQotCQkJCQkvLyBDaGVjayBhbnkgY2hpbGQgaXMgc3VwcHJlc3NlZC4gCi0JCQkJCS8vIGlmIGFueSBjaGlsZCBpcyBzdXBwcmVzZWQgZG9uJ3QgZ2VuZXJhdGUgZGlhZ3JhbQotCQkJCQlpZihhbnlDaGlsZHJlblN1cHByZXNzZWQod3JhcHBlciwgZmlsdGVyLCBzdXBwcmVzc2lvbikpIAotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQotCQkJCQkvLyBDaGVjayB2YXJpYWJpbGl0eSBhbmQgYmFzZSdzIHZhcmlhYmlsaXR5LgotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZEJhc2UgPSBjaGVja1ZhcmlhYmlsaXR5KGUsCi0JCQkJCQkJZmlsdGVyLCB0eXBlKTsKLQkJCQkJaWYgKGNhbGN1bGF0ZWRCYXNlID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJd3JhcHBlciA9IGNhbGN1bGF0ZWRCYXNlOwotCQkJCQllID0gKEFjdGl2aXR5KSBjYWxjdWxhdGVkQmFzZTsKLQkJCQkJZXhpc3QgPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChwdWJsaXNoVW5jcmVhdGVkQUREID09IGZhbHNlCi0JCQkJCQkmJiB0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkgewotCQkJCQlib29sZWFuIGNvbnRyaWJ1dG9yZXhpc3QgPSBmYWxzZTsKLQkJCQkJLy8gVGhpcyBpcyBuZWVkLCBpZiBjb250cmlidXRvciBoYXMgYSBBREQgZGlhZ3JhbSwgYmFzZSBkb24ndAotCQkJCQkvLyBiYXNlIHNob3VsZCBnZW5lcmF0ZSBBREQgaW4gYnJvd3NpbmcuCi0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJfQotCQkJCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCQkvLyBHZXQgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycyBmaXJzdCwgYW5kIGNoZWNrIGltbWVkaWF0ZQotCQkJCQkvLyBjb250cmlidXRvcnMKLQkJCQkJLy8gaGF2ZSBhbnl0aGluZyBleHRyYSBicmVha2Rvd24gZWxlbWVudHMuCi0JCQkJCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGUsIGNvbmZpZyk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQkJaWYgKGl0ZXJhdG9yICE9IG51bGwpIHsKLQkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCU9iamVjdCBhY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChhY3QgIT0gbnVsbCkgewotCQkJCQkJCQkJRGlhZ3JhbSBkeCA9IGdldERpYWdyYW0oKEFjdGl2aXR5KWFjdCwgdHlwZSk7Ci0JCQkJCQkJCQlpZiAoZHggIT0gbnVsbCkgewotCQkJCQkJCQkJCWNvbnRyaWJ1dG9yZXhpc3QgPSB0cnVlOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghY29udHJpYnV0b3JleGlzdCkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5QdWJsaXNoRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN3aXRjaCAoRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJaWYgKERpYWdyYW1PcHRpb25zLmlzUHVibGlzaEFEKGFjdGl2aXR5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJaWYgKERpYWdyYW1PcHRpb25zLmlzUHVibGlzaEFERChhY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJaWYgKERpYWdyYW1PcHRpb25zLmlzUHVibGlzaFdQREQoYWN0aXZpdHkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhbnlDaGlsZHJlblN1cHByZXNzZWQoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIod3JhcHBlciwgZmlsdGVyKTsKLQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGZhbHNlOwotCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQl9Ci0JCWVsc2UgaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcil7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCS8vIGZpbHRlciBvdXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtZW50KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZihzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoY2hpbGQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIHJvbGxlZC11cCBmbGFnCi0JCQkvLwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCSgoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXIpLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBNb3ZlZCBjb2RlIGZyb20gZ2V0Q2hpbGRyZW4uIGdldEFkYXB0ZXIoKSB3aWxsIHJldHVybiBBZGFwdGVyLAotCSAqIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gZmluZCBpdGVtcHJvdmlkZXIgZm9yIHRoZSBjaGlsZHJlbi4gCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGdldEFkYXB0ZXIoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyKXsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlhZGFwdGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXdyYXBwZXI7Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0QWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdCgKLQkJCQkJd3JhcHBlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JCi0JQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBjaGVja1ZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCWludCB0eXBlKSB7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQljb25maWcgPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgYWxsIENvbnRyaWJ1dG9ycyBmcm9tIHBhcmVudCBjaGFpbiBhbmQgY29udHJpYnV0b3IgY2hhaW4gZm9yIHRoZQotCQkvLyBlbGVtZW50IGUuCi0JCVZhcmlhYmlsaXR5SW5mbyBlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJTGlzdCBjb250cmlidXRvcnMgPSBlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKHZlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlBY3Rpdml0eSByZXBsYWNlciA9IChBY3Rpdml0eSkgQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwKLQkJCQljb25maWcpOwotCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJdmUgPSByZXBsYWNlcjsKLQkJCURpYWdyYW0gcmVwbGFjZXJEaWFncmFtID0gZ2V0RGlhZ3JhbShyZXBsYWNlciwgdHlwZSk7Ci0JCQlpZiAocmVwbGFjZXJEaWFncmFtICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVwbGFjZXI7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IGdldERpYWdyYW0oKEFjdGl2aXR5KSB2ZSwgdHlwZSk7Ci0JCQlpZiAoYmFzZURpYWdyYW0gIT0gbnVsbCkgewotCQkJCQotCQkJCS8vIENoZWNrIGZpcnN0IGlmIGJhc2VEaWFncmFtIGlzIHN1cHByZXNzZWQuCi0JCQkJaWYoQnJpZGdlSGVscGVyLmlzU3VwcHJlc3NlZChiYXNlRGlhZ3JhbSkpIHJldHVybiBudWxsOwotCQkJCQotCQkJCS8vIEZpbmQgdGhlIGNvbnRyaWJ1dG9ycyBvZiBCYXNlCi0JCQkJVmFyaWFiaWxpdHlJbmZvIHZlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIHZlKTsKLQkJCQlMaXN0IHZlQ29udHJpYnV0b3JzID0gdmVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCQkJCWlmIChjb250cmlidXRvcnMuc2l6ZSgpICE9IHZlQ29udHJpYnV0b3JzLnNpemUoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udHJpYnV0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCF2ZUNvbnRyaWJ1dG9ycy5jb250YWlucyhuZXh0KSkgewotCQkJCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkJLmlzRW1wdHkoKSkgewotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHZlOwotCQkJCQotCQkJfWVsc2V7Ci0JCQkJLy8gSWYgbm8gYmFzZSBkaWFncmFtLCBjaGVjayBiYXNlIG9mIGJhc2UgaGFkIGFueSBkaWFncmFtLgotCQkJCXJldHVybiBjaGVja1ZhcmlhYmlsaXR5KHZlLCBmaWx0ZXIsIHR5cGUpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGNoZWNrVmFyaWFiaWxpdHkoVmFyaWFiaWxpdHlFbGVtZW50IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJaW50IHR5cGUsIGJvb2xlYW4gY2hlY2tVREQpIHsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gdWRkSW5mbyA9IG51bGw7Ci0JCQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQljb25maWcgPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgYWxsIENvbnRyaWJ1dG9ycyBmcm9tIHBhcmVudCBjaGFpbiBhbmQgY29udHJpYnV0b3IgY2hhaW4gZm9yIHRoZQotCQkvLyBlbGVtZW50IGUuCi0JCVZhcmlhYmlsaXR5SW5mbyBlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJTGlzdCBjb250cmlidXRvcnMgPSBlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKHZlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlBY3Rpdml0eSByZXBsYWNlciA9IChBY3Rpdml0eSkgQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwKLQkJCQljb25maWcpOwotCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJdmUgPSByZXBsYWNlcjsKLQkJCURpYWdyYW0gcmVwbGFjZXJEaWFncmFtID0gZ2V0RGlhZ3JhbShyZXBsYWNlciwgdHlwZSk7Ci0JCQlpZihjaGVja1VERCl7Ci0JCQkJdWRkSW5mbyA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKHJlcGxhY2VyKTsKLQkJCQlpZih1ZGRJbmZvLmNhblB1Ymxpc2hBREltYWdlKCkgJiYgdWRkSW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKXsKLQkJCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJCX0KLQkJCX1lbHNlewotCQkJCWlmIChyZXBsYWNlckRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcmVwbGFjZXI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQkKLQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBudWxsOwotCQkJaWYoY2hlY2tVREQpewotCQkJCXVkZEluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbygoQWN0aXZpdHkpdmUpOwotCQkJfWVsc2V7Ci0JCQkJYmFzZURpYWdyYW0gPSBnZXREaWFncmFtKChBY3Rpdml0eSkgdmUsIHR5cGUpOwotCQkJfQotCQkJCi0JCQlpZiAoYmFzZURpYWdyYW0gIT0gbnVsbCB8fCAodWRkSW5mbyAhPSBudWxsICYmIHVkZEluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSAmJiB1ZGRJbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpICE9IG51bGwpKSB7Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgZmlyc3QgaWYgYmFzZURpYWdyYW0gaXMgc3VwcHJlc3NlZC4KLS8vCQkJCWlmKEJyaWRnZUhlbHBlci5pc1N1cHByZXNzZWQoYmFzZURpYWdyYW0pKSByZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQkvLyBGaW5kIHRoZSBjb250cmlidXRvcnMgb2YgQmFzZQotCQkJCVZhcmlhYmlsaXR5SW5mbyB2ZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZSk7Ci0JCQkJTGlzdCB2ZUNvbnRyaWJ1dG9ycyA9IHZlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQkJCQlpZiAoY29udHJpYnV0b3JzLnNpemUoKSAhPSB2ZUNvbnRyaWJ1dG9ycy5zaXplKCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRyaWJ1dG9ycy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghdmVDb250cmlidXRvcnMuY29udGFpbnMobmV4dCkpIHsKLQkJCQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJCS5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB2ZTsKLQkJCQkKLQkJCX1lbHNlewotCQkJCS8vIElmIG5vIGJhc2UgZGlhZ3JhbSwgY2hlY2sgYmFzZSBvZiBiYXNlIGhhZCBhbnkgZGlhZ3JhbS4KLQkJCQlyZXR1cm4gY2hlY2tWYXJpYWJpbGl0eSh2ZSwgZmlsdGVyLCB0eXBlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0KLQkvKioKLQkgKiBTZXQgdGhlIHdpbmRvdydzIHByZWZlcmVuY2UgYXR0cmlidXRlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMucHVibGlzaFVuY3JlYXRlZEFERCA9IGZsYWc7Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgd2luZG93J3MgcHJlZmVyZW5jZSBhdHRyaWJ1dGUgZm9yIEFjaXRpdnl0IERpYWdyYW0KLQkgKiAKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihib29sZWFuIGZsYWcpewotCQl0aGlzLnB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gZmxhZzsKLQl9Ci0KLS8vCXByaXZhdGUgRGlhZ3JhbUdlbmVyYXRvciBjcmVhdGVEaWFncmFtSW1hZ2UoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FUCwgSW1hZ2VGaWxlRm9ybWF0IGZpbGVGb3JtYXQpCi0vLwl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJQ29weVRvSW1hZ2VVdGlsIHV0aWwgPSBuZXcgQ29weVRvSW1hZ2VVdGlsKCk7Ci0vLwkJRGlhZ3JhbUdlbmVyYXRvciBkR2VuID0gdXRpbC5jb3B5VG9JbWFnZShkaWFncmFtRVAsIG5ldyBQYXRoKHB1YkRpci5nZXRQYXRoKCkpLCBmaWxlRm9ybWF0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCQlkR2VuLmNyZWF0ZUFXVEltYWdlRm9yRGlhZ3JhbSgpOwotLy8JCXJldHVybiBkR2VuOwotLy8JfQotCQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgZSwgaW50IHR5cGUpewotCQlEaWFncmFtTWFuYWdlciBkTWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoZSk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCWlmIChkTWdyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJTGlzdDxEaWFncmFtPiBsaXN0ID0gZE1nci5nZXREaWFncmFtcyhlLCB0eXBlKTsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgbGlzdC5nZXQoMCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBpbiBnZXREaWFncmFtKCkiICsgZXguZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQkKLQlwcml2YXRlIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKEFjdGl2aXR5IGUpIHsKLQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpLCB0aGlzKTsKLQkJZGlhZ3JhbU1hbmFnZXJzIC5hZGQobWdyKTsKLQkJcmV0dXJuIG1ncjsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWcoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCS8qKgotCSAqIHNldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCi0JLyoqCi0JICogQ2hlY2tzIGFueSBicmVha2Rvd25lbGVtZW50cyBvZiBhbiBBY3Rpdml0eSBoYXMgYSByZXBsYWNlci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgICBWYXJpYWJpbGl0eUVsZW1lbnQgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnIAotCSAqIAkJCQlNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHJldHVybiBWYXJpYWJpbGl0eUVsZW1lbnQgdGhlIHJlcGxhY2VyIGlmIHRoZXJlIGlzIG9uZSBhbmQgT05MWSBvbmUsCi0JICogICAgICAgICBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFrZG93bkVsZW1lbnRzUmVwbGFjZWQoQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlcikgewotCQkJY29uZmlnID0gKChJTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmKENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoKEFjdGl2aXR5KWVsZW1lbnQsIGNvbmZpZykgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvKioKLQkgKiBNZXRob2QgdG8gZ2V0IGEgRGlhZ3JhbVZpZXdlciBmb3IgZ2l2ZW4gYWN0aXZpdHkuICAKLQkgKiBXaXRob3V0IGRvaW5nIHJlYWxpemF0aW9uIGFuZCBkb2Vzbid0IGNoZWNrIGZvciBkaWFncmFtIGV4aXN0cyBvciBub3QuIAotCSAqLwotCQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgZ2V0RGlhZ3JhbVZpZXdlcihmaW5hbCBPYmplY3Qgd3JhcHBlciwKLQkJCWZpbmFsIGludCB0eXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCl7Ci0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSkgbzsKLQkJCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQlpZiAodHlwZSA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXZpZXdlciA9IGdldERpYWdyYW1WaWV3ZXIodHlwZSwgd3JhcHBlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCQotCXB1YmxpYyBBY3Rpdml0eSBnZXRSZWFsaXplZEZvclVubW9kaWZpZWQoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyLCAKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uKXsKLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICggYWN0aXZpdHkgPT0gbnVsbCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZiAoIXB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIElmIGV4dGVuc2lvbiBpcyBtb2RpZmllZCBkb24ndCBnZW5lcmF0ZSBpdC4KLQkJaWYgKCFhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJLy8gQ2hlY2sgYW55IGNoaWxkIGlzIHN1cHByZXNzZWQuIAotCQkvLyBpZiBhbnkgY2hpbGQgaXMgc3VwcHJlc2VkIGRvbid0IGdlbmVyYXRlIGRpYWdyYW0KLQkJaWYoYW55Q2hpbGRyZW5TdXBwcmVzc2VkKGFjdGl2aXR5LCBmaWx0ZXIsIHN1cHByZXNzaW9uKSkgCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIENoZWNrIHZhcmlhYmlsaXR5IGFuZCBiYXNlJ3MgdmFyaWFiaWxpdHkuCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBjYWxjdWxhdGVkQmFzZSA9IGNoZWNrVmFyaWFiaWxpdHkoYWN0aXZpdHksCi0JCQkJZmlsdGVyLCBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSwgdHJ1ZSk7Ci0JCWlmIChjYWxjdWxhdGVkQmFzZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXdyYXBwZXIgPSBjYWxjdWxhdGVkQmFzZTsKLQkJcmV0dXJuIChBY3Rpdml0eSl3cmFwcGVyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcHViRGlyCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHViRGlyKEZpbGUgcHViRGlyKSB7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNGb3JYTUxFeHBvcnQoKSB7Ci0JCXJldHVybiBmb3JYTUxFeHBvcnQ7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmb3JYTUxFeHBvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JYTUxFeHBvcnQoYm9vbGVhbiBmb3JYTUxFeHBvcnQpIHsKLQkJdGhpcy5mb3JYTUxFeHBvcnQgPSBmb3JYTUxFeHBvcnQ7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1VSVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1VSVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2OGUxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtVUlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlGaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5EZWNpc2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRmluYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkluaXRpYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBBIFVJIHNlcnZpY2UgZm9yIGV4dGVybmFsIGVjb3JlIG1hcCB0byBhY2VzcyBFUEYgRGlhZ3JhbXMgYW5kIGNyZWF0aW5nCi0gKiBkaWFncmFtIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIENoaW5oIFZvCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVUlTZXJ2aWNlIGltcGxlbWVudHMgSURpYWdyYW1VSVNlcnZpY2UgewotCi0Jc3RhdGljIGJvb2xlYW4gZGVidWcgPSBEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4gbm9kZVR5cGVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotCXB1YmxpYyBEaWFncmFtVUlTZXJ2aWNlKCkgewotCi0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuQUNUSVZJVFlfTk9ERSwgQWN0aXZpdHkuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLlBIQVNFX05PREUsIFBoYXNlLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5JVEVSQVRJT05fTk9ERSwgSXRlcmF0aW9uLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5UQVNLX0RFU0NSSVBUT1JfTk9ERSwKLQkJCQlUYXNrRGVzY3JpcHRvci5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuTUlMRVNUT05FX05PREUsIE1pbGVzdG9uZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuSU5JVElBTF9OT0RFLCBJbml0aWFsTm9kZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuRklOQUxfTk9ERSwgRmluYWxOb2RlLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5GT1JLX05PREUsIEZvcmtOb2RlLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5KT0lOX05PREUsIEpvaW5Ob2RlLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5NRVJHRV9OT0RFLCBNZXJnZU5vZGUuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLkRFQ0lTSU9OX05PREUsIERlY2lzaW9uTm9kZS5jbGFzcyk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuSURpYWdyYW1VSVNlcnZpY2UjY3JlYXRlQWN0aXZpdHlEaWFncmFtKG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpCi0JICovCi0JcHVibGljIERpYWdyYW0gY3JlYXRlQWN0aXZpdHlEaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5KSB7CQotCQlFT2JqZWN0IHVtbEFjdGl2aXR5ID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5KCkpOwotCQlpZiAodW1sQWN0aXZpdHkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSl1bWxBY3Rpdml0eSkuc2V0TmFtZShhY3Rpdml0eS5nZXROYW1lKCkpOwotCQl9Ci0JCWlmICh1bWxBY3Rpdml0eSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoKEVNb2RlbEVsZW1lbnQpIHVtbEFjdGl2aXR5LCBhY3Rpdml0eSk7Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBkaWFncmFtCi0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0odW1sQWN0aXZpdHksIERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQsCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCWRpYWdyYW0uc2V0RWxlbWVudCh1bWxBY3Rpdml0eSk7Ci0JCWlmICh1bWxBY3Rpdml0eSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlkaWFncmFtLnNldE5hbWUoYWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuSURpYWdyYW1VSVNlcnZpY2UjY3JlYXRlRWRnZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcpCi0JICovCi0JcHVibGljIEVkZ2UgY3JlYXRlRWRnZShEaWFncmFtIGRpYWdyYW0sIFZpZXcgc291cmNlLCBWaWV3IHRhcmdldCwKLQkJCVN0cmluZyBsaW5rTmFtZSkgewotCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBwYXJlbnRBY3Rpdml0eSA9IG51bGw7Ci0JCUVPYmplY3Qgb2JqID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJcGFyZW50QWN0aXZpdHkgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIG9iajsKLQkJfQotCQlpZiAocGFyZW50QWN0aXZpdHkgIT0gbnVsbCkgewotCQkJQ29udHJvbEZsb3cgZmxvdyA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdykgcGFyZW50QWN0aXZpdHkKLQkJCQkJLmNyZWF0ZUVkZ2UobGlua05hbWUgPSAobGlua05hbWUgIT0gbnVsbCkgPyBsaW5rTmFtZSA6ICIiLAkvLyROT04tTkxTLTEkCi0JCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udHJvbEZsb3coKSk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCQlpZiAoc291cmNlLmdldEVsZW1lbnQoKSAhPSBudWxsICYmIHNvdXJjZS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpCi0JCQkJCWZsb3cuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIHNvdXJjZS5nZXRFbGVtZW50KCkpOwotCQkJfQotCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJaWYgKHRhcmdldC5nZXRFbGVtZW50KCkgIT0gbnVsbCAmJiB0YXJnZXQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKQotCQkJCQlmbG93LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSB0YXJnZXQuZ2V0RWxlbWVudCgpKTsKLQkJCX0KLQkJCWlmIChmbG93IGluc3RhbmNlb2YgQ29udHJvbEZsb3cpIHsKLQkJCQlFZGdlIGVkZ2UgPSBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNvdXJjZSwgdGFyZ2V0LCBmbG93LAotCQkJCQkJbmV3IEludGVnZXIoQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKGVkZ2UsIGZsb3csIG5ldyBJbnRlZ2VyKAotCQkJCQkJQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJCi0JCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCWVkZ2Uuc2V0U291cmNlKHNvdXJjZSk7CQkJCQotCQkJCX0KLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJZWRnZS5zZXRUYXJnZXQodGFyZ2V0KTsJCQkJCQotCQkJCX0KLQkJCQlyZXR1cm4gZWRnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuSURpYWdyYW1VSVNlcnZpY2UjY3JlYXRlTm9kZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTm9kZSBjcmVhdGVOb2RlKERpYWdyYW0gZGlhZ3JhbSwgU3RyaW5nIG5vZGVUeXBlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkgPSBudWxsOwotCQlOb2RlIG5vdGF0aW9uTm9kZSA9IG51bGw7Ci0JCUVPYmplY3Qgb2JqID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJcGFyZW50QWN0aXZpdHkgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIG9iajsKLQkJfQotCi0JCWlmIChwYXJlbnRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZVR5cGUgPT0gSU5JVElBTF9OT0RFKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoSW5pdGlhbE5vZGUpIHBhcmVudEFjdGl2aXR5LmNyZWF0ZU5vZGUoCi0JCQkJCQlub2RlTmFtZSA9IChub2RlTmFtZSAhPSBudWxsKSA/IG5vZGVOYW1lIDogIiIsCS8vJE5PTi1OTFMtMSQKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxOb2RlKCkpOwotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IEZJTkFMX05PREUpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChBY3Rpdml0eUZpbmFsTm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5vZGVOYW1lID0gKG5vZGVOYW1lICE9IG51bGwpID8gbm9kZU5hbWUKLQkJCQkJCQkJOiAiIiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlGaW5hbE5vZGUoKSk7CS8vJE5PTi1OTFMtMSQKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gRk9SS19OT0RFKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoRm9ya05vZGUpIHBhcmVudEFjdGl2aXR5LmNyZWF0ZU5vZGUoCi0JCQkJCQlub2RlTmFtZSA9IChub2RlTmFtZSAhPSBudWxsKSA/IG5vZGVOYW1lIDogIiIsCS8vJE5PTi1OTFMtMSQKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEZvcmtOb2RlKCkpOwotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IEpPSU5fTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEpvaW5Ob2RlKSBwYXJlbnRBY3Rpdml0eS5jcmVhdGVOb2RlKAotCQkJCQkJbm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZSA6ICIiLAkvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpKTsKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBERUNJU0lPTl9OT0RFKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoRGVjaXNpb25Ob2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZQotCQkJCQkJCQk6ICIiLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWNpc2lvbk5vZGUoKSk7CS8vJE5PTi1OTFMtMSQKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IE1FUkdFX05PREUpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChNZXJnZU5vZGUpIHBhcmVudEFjdGl2aXR5LmNyZWF0ZU5vZGUoCi0JCQkJCQlub2RlTmFtZSA9IChub2RlTmFtZSAhPSBudWxsKSA/IG5vZGVOYW1lIDogIiIsCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVyZ2VOb2RlKCkpOwotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCU1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RhdGlvbk5vZGU7Ci0JfQotCi0JLyoJCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZSNjcmVhdGVOb2RlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0sCi0JICogICAgICBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBOb2RlIGNyZWF0ZU5vZGUoRGlhZ3JhbSBkaWFncmFtLCBXb3JrQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IHBhcmVudEFjdGl2aXR5ID0gbnVsbDsKLQkJTm9kZSBub3RhdGlvbk5vZGUgPSBudWxsOwotCQlFT2JqZWN0IG9iaiA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCXBhcmVudEFjdGl2aXR5ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBvYmo7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSAiIjsJLy8kTk9OLU5MUy0xJAotCQlpZihlLmdldFByZXNlbnRhdGlvbk5hbWUoKSAhPSBudWxsKXsKLQkJCW5hbWUgPSBlLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfWVsc2V7Ci0JCQluYW1lID0gZS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCWlmIChwYXJlbnRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQkJLy8gUGhhc2UKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQotCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBlKSk7Ci0KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCi0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCQkvLyBJdGVyYXRpb24KLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQotCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBlKSk7Ci0KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkvLyBBY3Rpdml0eQotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShuYW1lLAotCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCi0JCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSh1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkvLyBUYXNrIGRlc2NyaXB0b3IKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShuYW1lLAotCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0KLQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgZSkpOwotCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlCi0JCQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCQkJbm90YXRpb25Ob2RlLAotCQkJCQkJCQl1bWxOb2RlLAotCQkJCQkJCQluZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCS8vIE1pbGVzdG9uZQotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKTsKLQotCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBlKSk7Ci0KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RhdGlvbk5vZGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2dldEVkZ2VzKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVkZ2VzKERpYWdyYW0gZGlhZ3JhbSkgewotCQlyZXR1cm4gZGlhZ3JhbS5nZXRQZXJzaXN0ZWRFZGdlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIGRpYWdyYW0gbm9kZXMgaW4gdGhlIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBub2RlVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsTm9kZXMoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCXJldHVybiBkaWFncmFtLmdldFBlcnNpc3RlZENoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2dldE5vZGVzKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0sCi0JICogICAgICBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBMaXN0PE5vZGU+IGdldE5vZGVzKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlTdHJpbmcgbm9kZVR5cGUpIHsKLQkJTGlzdDxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJTGlzdCBhbGxOb2RlcyA9IGRpYWdyYW0uZ2V0UGVyc2lzdGVkQ2hpbGRyZW4oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsTm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCUVPYmplY3QgZWxlbWVudCA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJCUNsYXNzIGNsYXNzVHlwZSA9IChDbGFzcykgbm9kZVR5cGVzTWFwLmdldChub2RlVHlwZSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZXggPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKAotCQkJCQkJCQkJKEVNb2RlbEVsZW1lbnQpIGVsZW1lbnQsIGFjdGl2aXR5Ci0JCQkJCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYgKGV4ICE9IG51bGwgJiYgY2xhc3NUeXBlLmlzSW5zdGFuY2UoZXgpKSB7Ci0JCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoY2xhc3NUeXBlICE9IG51bGwgJiYgY2xhc3NUeXBlLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBpbnQgdHlwZSwKLS8vCQkJYm9vbGVhbiBjcmVhdGUpIHsKLS8vCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotLy8JCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsCi0vLwkJCQkuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkpOwotLy8KLS8vCQlpZiAoZE1nciAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlMaXN0IGxpc3QgPSBkTWdyLmdldERpYWdyYW1zKGFjdGl2aXR5LCB0eXBlKTsKLS8vCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLS8vCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotLy8JCQkJfQotLy8JCQkJaWYgKGRpYWdyYW0gPT0gbnVsbCAmJiBjcmVhdGUpIHsKLS8vCQkJCQlkaWFncmFtID0gZE1nci5jcmVhdGVEaWFncmFtKGFjdGl2aXR5LCB0eXBlLAotLy8JCQkJCQkJZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCh0eXBlKSk7Ci0vLwkJCQl9Ci0vLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlpZiAoZGVidWcpIHsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvcmUgZXJyb3IgY3JlYXRpbmcgYSBkaWFncmFtOiIgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQkJKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0vLwkJCQl9Ci0vLwkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotLy8JCQkJCQkiQ29yZSBlcnJvciBjcmVhdGluZyBhIGRpYWdyYW06IiwgZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfSBmaW5hbGx5IHsKLS8vCQkJCWlmIChkTWdyICE9IG51bGwpIHsKLS8vCQkJCQlkTWdyLnJlbGVhc2UoKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gZGlhZ3JhbTsKLS8vCX0KLQotLy8JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlc0hpbnQgZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludChpbnQgZGlhZ3JhbVR5cGUpIHsKLS8vCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0vLwkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLS8vCQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0vLwkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0vLwkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotLy8JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0vLwkJCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRGlhZ3JhbShJRWRpdG9yUGFydCBwYXJ0LCBpbnQgZGlhZ3JhbVR5cGUsCi0vLwkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLS8vCQl0cnkgewotLy8JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLS8vCQkJCQlzZWxlY3RlZE9iamVjdCwgc3VwcHJlc3Npb24sIGRpYWdyYW1UeXBlKTsKLS8vCQkJRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW1FZGl0b3IocGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLAotLy8JCQkJCWlucHV0LCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSwKLS8vCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLS8vCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vCQl9Ci0vLwl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBpbnQgdHlwZSkgewotLy8JCXJldHVybiBnZXREaWFncmFtKGFjdGl2aXR5LCB0eXBlLCBmYWxzZSk7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9JRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1JbWFnZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0MzNiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9JRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciB0aGUgZ2VuZXJhdGluZyBkaWFncmFtIGltYWdlLiAgCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUltYWdlU2VydmljZSBleHRlbmRzIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIHsKLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgZGlhZ3JhbSBpbWFnZSBmb3IgZ2l2ZW4gYWN0aXZpdHkgYW5kIHJldHVybnMgZGlhZ3JhbSBpbWFnZSBwYXRoIHN0cmluZy4KLQkgKiBUaGlzIG1ldGhvZCBkb24ndCBjYWxjdWxhdGUgdGhlIGltYWdlIG1hcCBmb3IgZ2VuZXJhdGVkIGRpYWdyYW0gaW1hZ2UuICBJbiBvcmRlciB0byBjYWxjdWxhdGUKLQkgKiBJbWFnZSBmb3IgZ2VuZXJhdGVkIGRpYWdyYW0gdXNlIHtAbGluayBJQWN0aXZpdHlEaWFncmFtU2VydmljZX0ncyBzYXZlRGlhZ3JhbShPYmplY3Qgd3JhcGVyLCBTdHJpbmcgaW1nUGF0aCwgU3RyaW5nIGRpYWdyYW1UeXBlLAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCk7IAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIGltZ1BhdGgKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqIEBwYXJhbSByZWFsaXplZERpYWdyYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZURpYWdyYW1JbWFnZShmaW5hbCBPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIAotCQkJZmluYWwgaW50IGRpYWdyYW1UeXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCwgZmluYWwgYm9vbGVhbiByZWFsaXplZERpYWdyYW0pOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1VSVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0lEaWFncmFtVUlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDZhNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1VSVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQ2xhc3MgZm9yIG1hcHBpbmcgYmV0d2VlbiBBY3Rpdml0eSBEaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgQ2hpbmggVm8KLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbVVJU2VydmljZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9OT0RFID0gIkFjdGl2aXR5IjsJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfTk9ERSA9ICJQaGFzZSI7CQkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVSQVRJT05fTk9ERSA9ICJJdGVyYXRpb24iOwkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFU0NSSVBUT1JfTk9ERSA9ICJUYXNrRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTEVTVE9ORV9OT0RFID0gIk1pbGVzdG9uZSI7CS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfTk9ERSA9ICJJbml0aWFsTm9kZSI7CS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkFMX05PREUgPSAiRmluYWxOb2RlIjsJCS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUktfTk9ERSA9ICJGb3JrTm9kZSI7CQkJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9OT0RFID0gIkpvaW5Ob2RlIjsJCQkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9OT0RFID0gIk1lcmdlTm9kZSI7CQkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNJU0lPTl9OT0RFID0gIkRlY2lzaW9uTm9kZSI7CS8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGRpYWdyYW0gbm9kZXMgaW4gdGhlIGRpYWdyYW0KLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsTm9kZXMoRGlhZ3JhbSBkaWFncmFtKTsKLQotCS8qKgotCSAqIFJldHVybiBkaWFncmFtIG5vZGUgZm9yIGdpdmVuIG5vZGUgdHlwZSB1bmRlciBnaXZlbiBhY3Rpdml0eSBhbmQgZGlhZ3JhbQotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIG5vZGVUeXBlCi0JICogCQkJZS5nLiBJRGlhZ3JhbVVJU2VydmljZS5BQ1RJVklUWV9OT0RFLCBldGMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Q8Tm9kZT4gZ2V0Tm9kZXMoRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCVN0cmluZyBub2RlVHlwZSk7Ci0KLQkvKioKLQkgKiBUbyBjcmVhdGUgYSBsaW5rCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEBwYXJhbSBsaW5rTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRWRnZSBjcmVhdGVFZGdlKERpYWdyYW0gZGlhZ3JhbSwgVmlldyBzb3VyY2UsIFZpZXcgdGFyZ2V0LCBTdHJpbmcgbGlua05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFnYW0gbm9kZSBmb3IgdGhlIGdpdmVuIG5vZGUgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG5vZGVUeXBlCi0JICogQHBhcmFtIG5vZGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBOb2RlIGNyZWF0ZU5vZGUoRGlhZ3JhbSBkaWFncmFtLCBTdHJpbmcgbm9kZVR5cGUsIFN0cmluZyBub2RlTmFtZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgZGlhZ3JhbSBub2RlIGZvciB0aGUgZ2l2ZW4gd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIHdiZUVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE5vZGUgY3JlYXRlTm9kZShEaWFncmFtIGRpYWdyYW0sIFdvcmtCcmVha2Rvd25FbGVtZW50IHdiZUVsZW1lbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgZWRnZXMgaW4gdGhlIGRpYWdyYW0KLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RWRnZXMoRGlhZ3JhbSBkaWFncmFtKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWN0aXZpdHkgZGlhZ3JhbSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHkpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmZjFhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU1dUR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgZ3JhcGhpY2FsIHZpZXdlciBvZiB0aGUgZWxlbWVudCBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByb3RlY3RlZCBPYmplY3Qgd3JhcHBlcjsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdyYXBoaWNhbFZpZXdlciBvbiB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcigpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdyYXBoaWNhbCB2aWV3ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgZ3JhcGhpY2FsIHZpZXdlcgotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoCi0JCQkJQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCQlTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCByb290ID0gbmV3IFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQoKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJLy8gZmluZCB0aGUgZmlndXJlIHRvIGJlIHNhdmVkCi0JCUxheWVyTWFuYWdlciBsbSA9IChMYXllck1hbmFnZXIpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCUxheWVyTWFuYWdlci5JRCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gbG0uZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwcHJlc3Npb25Ub0RpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU9iamVjdCBlID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYykpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBpbWFnZSBmcm9tIGZpZ3VyZSBjcmVhdGVkIGluIGxvYWREaWFncmFtIG1ldGhvZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgY3JlYXRlRGlhZ3JhbUltYWdlKCkgewotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZSgpOwotCi0JCVNXVEdyYXBoaWNzIGdyYXBoaWNzID0gbnVsbDsKLQkJR0MgZ2MgPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQlpbnQgaGVpZ2h0ID0gYm91bmRzLmhlaWdodDsKLQkJCWludCB3aWR0aCA9IGJvdW5kcy53aWR0aDsKLQotCQkJLy8gY3JlYXRlIGEgbmV3IGltYWdlIGFuZCByZXBhaW50IHRoZSBncmFwaAotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJCWdjID0gbmV3IEdDKGltYWdlKTsKLQkJCWdyYXBoaWNzID0gbmV3IFNXVEdyYXBoaWNzKGdjKTsKLQkJCWZpZ3VyZS5wYWludChncmFwaGljcyk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCi0JCQlpZiAoZ3JhcGhpY3MgIT0gbnVsbCkKLQkJCQlncmFwaGljcy5kaXNwb3NlKCk7Ci0JCQlpZiAoZ2MgIT0gbnVsbCkKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUNvbnRyb2wgY3RybCA9IGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGN0cmwgIT0gbnVsbCkgewotCQkJCQljdHJsLmRpc3Bvc2UoKTsKLQkJCQl9Ci0KLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IGdyYXBoaWNhbFZpZXdlci5nZXRDb250ZW50cygpOwotCQkJCWlmKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCQkJZWRpdFBhcnQuc2V0TW9kZWwobnVsbCk7Ci0JCQkJfQotCi0JCQkJZ3JhcGhpY2FsVmlld2VyID0gbnVsbDsKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJU3VwcHJlc3Npb24gc3VwKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKTsKLQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgRGlhZ3JhbUluZm8gZ2V0RGlhZ3JhbUluZm8oKTsKLQlwdWJsaWMgYWJzdHJhY3QgRWRpdFBhcnQgbG9hZERpYWdyYW0oT2JqZWN0IHdyYXBwZXIsIGJvb2xlYW4gbmVlZFJlc2V0LAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXguamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzODVjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUltYWdlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbWFnZS5JbWFnZUZpbGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXggZXh0ZW5kcwotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCQotCXByb3RlY3RlZCBjbGFzcyBEaWFncmFtR3JhcGhpY2FsVmlld2VyRXggZXh0ZW5kcyBEaWFncmFtR3JhcGhpY2FsVmlld2VyIGltcGxlbWVudHMgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQ7Ci0JCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkgewotCQkJaWYoaW5wdXQgPT0gbnVsbCkgewotCQkJCWlucHV0ID0gbmV3IERpYWdyYW1FZGl0b3JJbnB1dCh3cmFwcGVyLCBudWxsLCBEaWFncmFtSW1hZ2VTZXJ2aWNlLmdldEludFR5cGUoZ2V0RGlhZ3JhbVR5cGUoKSkpOwotCQkJfQotCQkJcmV0dXJuIGlucHV0OwotCQl9Ci0KLQkJcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCX07Ci0KLQlwcm90ZWN0ZWQgR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IG51bGw7Ci0JcHJvdGVjdGVkIERpYWdyYW0gZGlhZ3JhbTsKLQlwcm90ZWN0ZWQgRGlhZ3JhbU1hbmFnZXIgZG1ncjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZyA9IERpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsgCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeChDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQlzdXBlcihwYXJlbnQsIHdyYXBwZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBmb3IgZ2l2ZW4gb2JqZWN0IChvbmx5IGZvciB7QGxpbmsgQWN0aXZpdHl9IGFuZCBwYWNrcyB0aGUgYm91bmRzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyIAl7QGxpbmsgT2JqZWN0fSAJCi0JICogQHBhcmFtIG5lZWRSZXNldCBib29sZWFuCi0JICogQHBhcmFtIGZpbHRlciAJe0BsaW5rIElGaWx0ZXJ9Ci0JICogQHBhcmFtIHN1cAkJe0BsaW5rIFN1cHByZXNzaW9ufQotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBsb2FkRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgYm9vbGVhbiBuZWVkUmVzZXQsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHZpZXdlciB3aXRoIHRoZSBlZGl0IHBhcnQKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBjcmVhdGVFZGl0UGFydCh3cmFwcGVyLCBmaWx0ZXIsIHN1cCk7Ci0JCWlmKGVkaXRQYXJ0ID09IG51bGwpewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJFZGl0cGFydCBpcyBudWxsOiAiKyB3cmFwcGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGVkaXRQYXJ0OwotCQl9Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IChEaWFncmFtRWRpdFBhcnQpZWRpdFBhcnQ7CQkKLQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbUVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkuZVJlc291cmNlKCk7Ci0JCWJvb2xlYW4gb2xkRGVsaXZlciA9IHJlc291cmNlLmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvbiB0aGUgcmVzb3VyY2UgY2hhbmdlIGR1cmluZyByZWZyZXNoIHRvCi0JCQkvLyBhdm9pZCBtYWtpbmcgdGhlIGRpYWdyYW0gZWRpdG9yIGRpcnR5Ci0JCQkvLwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCXJlZnJlc2goZGlhZ3JhbUVkaXRQYXJ0KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZS5lU2V0RGVsaXZlcihvbGREZWxpdmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gYXNrIGZvciBpbW1lZGlhdGUgdXBkYXRlIG9mIHRoZSBjb250cm9sIHNvIHRoYXQgdGhlIGRpYWdyYW0gZmlndXJlCi0JCS8vIHdpbGwgYmUgY29tcHV0ZWQKLQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0JCWlmKGVkaXRQYXJ0ICE9IG51bGwpewotCQkJaWYoZGVidWcpewotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJRWRpdFBhcnQgbmFtZSA9IChFZGl0UGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlWaWV3IHZpZXcgPSAoVmlldyluYW1lLmdldE1vZGVsKCk7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHZpZXcuZ2V0VHlwZSgpICsiOiIgKyBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSArICIsIiArIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIGZvciBicm93c2luZywgaW4gb3JkZXIgdG8gcmVuZGVyIGFjdGl2aXR5IGNvbnRyaWJ1dGluZydzCi0JCS8vIGNoaWxkcmVuLiAgSW4gcHJvY2Vzc0F1dGhvcmluZyB3ZSBkb24ndCBkbyByZWFsaXphdGlvbiwgaW4gb3JkZXIgdG8gZGlzcGxheWVkIAotCQkvLyByZWFsaXplZCBlbGVtZW50cywgd2UgaGF2ZSB0byBjbGVhbnVwIEFERCBkaWFncmFtIGFuZCByZWNyZWF0ZS4gbmVlZHRvUmVzZXQgb3IgY2xlYW51cGRpYWdyYW0uCi0JCS8vIE9ubHkgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLgotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZihvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmIGdldERpYWdyYW1UeXBlKCkgIT0gbnVsbCAmJiAKLQkJCQlnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpewotCQkJaWYoVG5nVXRpbC5oYXNDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KW8pKXsKLQkJCQluZWVkUmVzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmVlZFJlc2V0KSB7Ci0JCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0JCX0KLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQkJaWYgKGZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCQkJaWYgKGJvdW5kcy54IDwgMCB8fCBib3VuZHMueSA8IDApIHsKLQkJCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpewotCQkJCQkoKEFjdGl2aXR5RWRpdFBhcnQpIGVkaXRQYXJ0KS5tb3ZlRmlndXJlKC1ib3VuZHMueCwgLWJvdW5kcy55KTsKLQkJCQl9Ci0JCQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0KLQkJCQlib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWRpdFBhcnQ7Ci0JfQotCi0JCi0JLyoqCi0JICogcmV0dXJucyB7QGxpbmsgRGlhZ3JhbUluZm99Ci0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIGdldERpYWdyYW1JbmZvKCkgewotCQlEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJT2JqZWN0IGVsZW1lbnQgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQllbGVtZW50ID0gKChMaW5rZWRPYmplY3QpIGVsZW1lbnQpLmdldE9iamVjdCgpOwotCQl9Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KXsKLQkJCSBlbGVtZW50ID0gKChWaWV3KWVsZW1lbnQpLmdldEVsZW1lbnQoKTsKLQkJCWlmKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCl7Ci0JCQkJZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KWVsZW1lbnQpOwotCQkJfQotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGUpewotCQkJCWVsZW1lbnQgPSAoKE5vZGUpZWxlbWVudCkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlkaWFncmFtSW5mbyA9IG5ldyBEaWFncmFtSW5mbyhnZXREaWFncmFtVHlwZSgpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQlsb2FkRGlhZ3JhbUluZm8ocGFydCwgZGlhZ3JhbUluZm8pOwotCQl9Ci0KLQkJcmV0dXJuIGRpYWdyYW1JbmZvOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVEaWFncmFtSW1hZ2UoSW1hZ2VGaWxlRm9ybWF0IGltYWdlRmlsZUZvcm1hdCl7Ci0vLwkJQ29weVRvSW1hZ2VVdGlsIGltID0gbmV3IENvcHlUb0ltYWdlVXRpbCgpOwotCQkvL2ltLmNvcHlUb0ltYWdlKHBhcnQsIGRlc3RpbmF0aW9uLCBmb3JtYXQsIG1vbml0b3IpCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKAotCQkJCUNvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIEVkaXRQYXJ0U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJvb3RFZGl0UGFydChnZXREaWFncmFtKCkpOwotLy8JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotLy8JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLS8vCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCQkKLQkJLy8gU2V0IGVkaXRpbmcgZG9tYWluCi0vLwkJRGlhZ3JhbUVkaXREb21haW4gZWRpdERvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLS8vICAgICAgICBlZGl0RG9tYWluLnNldENvbW1hbmRTdGFjaygKLS8vICAgICAgICAgICAgbmV3IERpYWdyYW1Db21tYW5kU3RhY2soZWRpdERvbWFpbikpOwotLy8KLS8vICAgICAgICB2aWV3ZXIuc2V0RWRpdERvbWFpbihlZGl0RG9tYWluKTsKLSAgICAgICAgCi0vLyAgICAgICAgUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCA9IERpYWdyYW1JbWFnZVNlcnZpY2UuZ2V0UHJlZmVyZW5jZUhpbnQoCi0vLyAgICAgICAgCQlnZXREaWFncmFtVHlwZSgpKTsKLS8vICAgICAgICBpZiAocm9vdCBpbnN0YW5jZW9mIElEaWFncmFtUHJlZmVyZW5jZVN1cHBvcnQpIHsKLS8vICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VzSGludCA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBwcmVmZXJlbmNlc0hpbnQgPSAoKElEaWFncmFtUHJlZmVyZW5jZVN1cHBvcnQpIHJvb3QpCi0vLyAgICAgICAgICAgICAgICAgICAgLmdldFByZWZlcmVuY2VzSGludCgpOwotLy8gICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgKChJRGlhZ3JhbVByZWZlcmVuY2VTdXBwb3J0KSByb290KQotLy8gICAgICAgICAgICAgICAgICAgIC5zZXRQcmVmZXJlbmNlc0hpbnQocHJlZmVyZW5jZXNIaW50KTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB2aWV3ZXIKLS8vICAgICAgICAgICAgICAgIC5ob29rV29ya3NwYWNlUHJlZmVyZW5jZVN0b3JlKChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQKLS8vICAgICAgICAgICAgICAgICAgICAuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotLy8gICAgICAgIH0KLS8vICAgICAgICAKLS8vICAgICAgICBEaWFncmFtRXZlbnRCcm9rZXIuc3RhcnRMaXN0ZW5pbmcoVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSkpOwotLy8gICAgICAgIHZpZXdlci5zZXRDb250ZW50cyhkaWFncmFtKTsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbSBnZXREaWFncmFtKCl7Ci0JCWlmIChkaWFncmFtID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0JCQkJCQlkbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbAotCQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhhY3QpLCB0aGlzKTsKLQkJCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IGRtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBEaWFncmFtSW1hZ2VTZXJ2aWNlCi0JCQkJCQkJCS5nZXRJbnRUeXBlKGdldERpYWdyYW1UeXBlKCkpKTsKLQkJCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJEaWFncmFtIGlzIGVtcHR5IGZvciAiICsgYWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ3JlYXRpbmcgZGlhZ3JhbSBvZiAgIiArIGdldERpYWdyYW1UeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWRpYWdyYW0gPSBkbWdyLmNyZWF0ZURpYWdyYW0oKEFjdGl2aXR5KSBUbmdVdGlsCi0JCQkJCQkJLnVud3JhcCh3cmFwcGVyKSwgRGlhZ3JhbUltYWdlU2VydmljZQotCQkJCQkJCS5nZXRJbnRUeXBlKGdldERpYWdyYW1UeXBlKCkpLCBEaWFncmFtSW1hZ2VTZXJ2aWNlCi0JCQkJCQkJLmdldFByZWZlcmVuY2VIaW50KGdldERpYWdyYW1UeXBlKCkpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IGUgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkoKE5vZGUpZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCgpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdDw/PiBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCi0JCQlpZiAobyBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbzsKLQkJCQlPYmplY3QgbW9kZWwgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IGUgPSBtb2RlbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJCQllID0gKChMaW5rZWRPYmplY3QpIGUpLmdldE9iamVjdCgpOwotCQkJCX0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJZSA9ICgoVmlldykgZSkuZ2V0RWxlbWVudCgpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJCQkJCWxvYWREaWFncmFtSW5mbygoR3JhcGhpY2FsRWRpdFBhcnQpIG8sIGRpYWdyYW1JbmZvKTsKLQkJCQkJCX0KLQkJCQkJCWUgPSAoKE5vZGUpIGUpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZiAoZSAhPSBudWxsICYmIGUgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJYm9vbGVhbiBzdXBwcmVzc2VkOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE5hbWVkTm9kZSkgbW9kZWwpLmlzU3VwcHJlc3NlZCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCUlGaWd1cmUgZiA9IHBhcnQuZ2V0RmlndXJlKCk7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmLmdldEJvdW5kcygpOwotCi0JCQkJCVN0cmluZyBhbHRUYWcgPSBudWxsOwotCQkJCQlpZiAoZiBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJCQkJYWx0VGFnID0gKChXcmFwTGFiZWwpIGYpLmdldFRleHQoKTsKLQkJCQkJfQotCQkJCQlkaWFncmFtSW5mby5hZGRBcmVhKChNZXRob2RFbGVtZW50KSBlLCBib3VuZHMueCwgYm91bmRzLnksCi0JCQkJCQkJYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBhbHRUYWcsIHN1cHByZXNzZWQpOwotCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlpZihkbWdyICE9IG51bGwpewotCQkJZG1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCUVPYmplY3QgZSA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkoKE5vZGUpZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQpewotCQl0cnkgewotCQkJRGlhZ3JhbUVkaXRvclV0aWwucmVmcmVzaChlZGl0UGFydCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQlEaWFncmFtRWRpdG9yVXRpbC5yZWZyZXNoTGFiZWxzKGVkaXRQYXJ0KTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJaWYoZGVidWcpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgZGlhZ3JhbSByZWZyZXNoIHdoaWxlIHB1Ymxpc2hpbmcgOiAiICsgZSk7CSAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRGlhZ3JhbUVsZW1lbnQoZmluYWwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBtb2RlbCwgZmluYWwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCAgCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXAsIGZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgZmluYWwgSUZpbHRlciBmaWx0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKG1vZGVsKTsKLQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3AgPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZG9tYWluLCAiIikgewkvLyROT04tTkxTLTEkCi0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZCA9IAotCQkJCQkob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgbW9kZWwuZ2V0RWxlbWVudCgpOwotCQkJCWQuc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJCQlpZihmaWx0ZXIgPT0gbnVsbCAmJiBjb25maWd1cmF0aW9uICE9IG51bGwpewotCQkJCQlQcm9jZXNzQ29uZmlndXJhdG9yIHAgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcpOwotCQkJCQlkLnNldEZpbHRlcihwKTsKLQkJCQl9ZWxzZXsKLQkJCQkJZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQl9Ci0JCQkJZC5zZXRMaW5rZWRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQkKLQkJfTsKLQkJdHJ5IHsKLQkJCW9wLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCl7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNTE3NWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuc2VydmljZS5EaWFncmFtUmVzZXRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EaWFncmFtQWN0aW9uc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZ3JhcGhpY2FsIHZpZXdlciBmb3IgdGhlIEFjdGl2aXR5RGV0YWlsIGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIE5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlciBleHRlbmRzCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4IHsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBOZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJc3VwZXIocGFyZW50LCB3cmFwcGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eSBlID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWUgPSAoQWN0aXZpdHkpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQl9IGVsc2UgaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJZSA9IChBY3Rpdml0eSkgd3JhcHBlcjsKLQkJfQotCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJdXBkYXRlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbSwgKE1ldGhvZEVsZW1lbnQpZSwgc3VwLCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJCWZpbHRlciwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlEaWFncmFtRWRpdERvbWFpbiBkb21haW4gPSBuZXcgRGlhZ3JhbUVkaXREb21haW4obnVsbCk7Ci0JCQkoKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKWdyYXBoaWNhbFZpZXdlcikuc2V0RWRpdERvbWFpbihkb21haW4pOwotCQkJcGFydCA9IEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoaWNFZGl0UGFydChkaWFncmFtKTsKLQkJCWlmKHBhcnQgPT0gbnVsbCl7Ci0JCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS4KLQkJCQlsb2dFcnJvcigiUHVibGlzaGluZzogQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gRWRpdFBhcnQgY3JlYXRpb24gZmFpbGVkIGZvciA6ICIrZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBwYXJ0OwotCQl9Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjZ2V0RGlhZ3JhbVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCX0KLQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjbGVhblVwRGlhZ3JhbSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGRlcCAhPSBudWxsKSB7Ci0JCQlkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGRlcC5nZXRDaGlsZHJlbigpKTsKLQotCQkJLy8gY2xlYW4gdXAgdGhlIGRpYWdyYW0KLQkJCURlZmF1bHRFZGl0RG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4obnVsbCk7Ci0JCQlBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSA9IG5ldyBBY3Rpb25SZWdpc3RyeSgpOwotCi0JCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UgYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uc1NlcnZpY2UoCi0JCQkJCWRtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLCBnZXRHcmFwaGljYWxWaWV3ZXIoKSwKLQkJCQkJZWRpdGluZ0RvbWFpbiwgYWN0aW9uUmVnaXN0cnkpOwotCQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0KLQkJCURpYWdyYW1SZXNldFNlcnZpY2Ugc2VydmljZSA9IG5ldyBEaWFncmFtUmVzZXRTZXJ2aWNlKGRtZ3IKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgZ2V0R3JhcGhpY2FsVmlld2VyKCksIGVkaXRpbmdEb21haW4sCi0JCQkJCWFjdGlvblJlZ2lzdHJ5KTsKLQkJCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQkJCS8vIFRPRE86IG5lZWQgdG8gaW1wcm92ZSB0aGlzIGZ1bmN0aW9uLiBIYXZlIHRvIGNhbGwgaXQgdHdpY2UgcmlnaHQgbm93Ci0JCQkvLyBzbyBpdCBjYW4gbGF5b3V0IHRoZSBkaWFncmFtIGNvcnJlY3RseS4KLQkJCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsJCQkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWRjYjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgQWN0aXZpdHkgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXggewotCi0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCBhY3QpIHsKLQkJc3VwZXIocGFyZW50LGFjdCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJQWN0aXZpdHkgZSA9IG51bGw7Ci0JCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQllID0gKEFjdGl2aXR5KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCWFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcigKLQkJCQkJKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgd3JhcHBlcik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZSA9IChBY3Rpdml0eSkgd3JhcHBlcjsKLQkJCQlhZGFwdGVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlhZGFwdGVyLnNldFZpZXcoZGlhZ3JhbSk7Ci0JCQkJYWRhcHRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQlhZGFwdGVyLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCQkJYWRhcHRlci5zZXRFZGl0aW5nRG9tYWluKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBUcmFuc2FjdGlvblV0aWwKLQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbS5nZXRFbGVtZW50KCkpKTsKLQkJCQlkaWFncmFtLmdldEVsZW1lbnQoKS5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCQkJRGlhZ3JhbUVkaXREb21haW4gZG9tYWluID0gbmV3IERpYWdyYW1FZGl0RG9tYWluKG51bGwpOwotCQkJCSgoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGdyYXBoaWNhbFZpZXdlcikKLQkJCQkJCS5zZXRFZGl0RG9tYWluKGRvbWFpbik7Ci0JCQkJcGFydCA9IEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoaWNFZGl0UGFydCgKLQkJCQkJCWRpYWdyYW0pOwotCQkJCWlmIChwYXJ0ID09IG51bGwpIHsKLQkJCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkiUHVibGlzaGluZzogQWN0aXZpdHkgRGlhZ3JhbSBFZGl0UGFydCBjcmVhdGlvbiBmYWlsZWQgZm9yIDogIgkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrIGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gcGFydDsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNnZXREaWFncmFtVHlwZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KQotCQkJewotCQkJCUFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQgcGFydGl0aW9uID0gKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIG87Ci0JCQkJTGlzdCBwYXJ0aXRpb25DaGlsZHJlbiA9IHBhcnRpdGlvbi5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHBhcnRpdGlvbkNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCU9iamVjdCBvMSA9IGkubmV4dCgpOwotCQkJCQlpZiAobzEgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCl7Ci0JCQkJCQlsb2FkRGlhZ3JhbUluZm8oKEdyYXBoaWNhbEVkaXRQYXJ0KSBvMSwgZGlhZ3JhbUluZm8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBvOwotCQkJCU9iamVjdCBtb2RlbCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3QgZSA9IG1vZGVsOwotCQkJCQotCQkJCWlmKGUgaW5zdGFuY2VvZiBWaWV3KXsKLQkJCQkJRU1vZGVsRWxlbWVudCBleCA9IChFTW9kZWxFbGVtZW50KSgoVmlldyllKS5nZXRFbGVtZW50KCk7Ci0JCQkJCWlmKGV4ICE9IG51bGwpewotCQkJCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJYm9vbGVhbiBzdXBwcmVzc2VkOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KUJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSgoTm9kZSltb2RlbCkuZ2V0RWxlbWVudCgpKSkuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCUlGaWd1cmUgZiA9IHBhcnQuZ2V0RmlndXJlKCk7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmLmdldEJvdW5kcygpOwotCi0JCQkJCVN0cmluZyBhbHRUYWcgPSBudWxsOwotCQkJCQlpZiAoZiBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJCQkJYWx0VGFnID0gKChXcmFwTGFiZWwpIGYpLmdldFRleHQoKTsKLQkJCQkJfQotCQkJCQlkaWFncmFtSW5mby5hZGRBcmVhKChNZXRob2RFbGVtZW50KSBlLCBib3VuZHMueCwKLQkJCQkJCWJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIGFsdFRhZywgc3VwcHJlc3NlZCk7Ci0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlkaWFncmFtSW5mby5hZGRHcmFwaGljYWxOb2RlcygpOwotCQkJfSAKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQljb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZCgKLQkJCQlDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0JCURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKERpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBFZGl0UGFydFNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVSb290RWRpdFBhcnQoZ2V0RGlhZ3JhbSgpKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLS8vCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiYmRkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5EaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBXb3JrUHJvZHVjdCBEZXBlbmRlbmN5IGRpYWdyYW0uCi0gKiAgCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyIGV4dGVuZHMKLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXggewotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIE5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJc3VwZXIocGFyZW50LCB3cmFwcGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eSBlID0gbnVsbDsKLQkJaWYod3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQllID0gKEFjdGl2aXR5KVRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQl9ZWxzZSBpZih3cmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJZSA9IChBY3Rpdml0eSl3cmFwcGVyOwotCQl9Ci0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQl1cGRhdGVEaWFncmFtRWxlbWVudChkaWFncmFtLCAoTWV0aG9kRWxlbWVudCllLCBzdXAsIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQkJZmlsdGVyLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLQkJCSgoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpZ3JhcGhpY2FsVmlld2VyKS5zZXRFZGl0RG9tYWluKGRvbWFpbik7Ci0JCQlwYXJ0ID0gRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJaWYocGFydCA9PSBudWxsKXsKLQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLgotCQkJCWxvZ0Vycm9yKCJQdWJsaXNoaW5nOiBXb3JrUHJvZHVjdCBEaWFncmFtIEVkaXRQYXJ0IGNyZWF0aW9uIGZhaWxlZCBmb3IgOiAiK2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gcGFydDsKLQkJfQotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2dldERpYWdyYW1UeXBlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBFZGl0UGFydFNlcnZpY2UKLQkJLmdldEluc3RhbmNlKCkuY3JlYXRlUm9vdEVkaXRQYXJ0KGdldERpYWdyYW0oKSk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotLy8JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGI2MTUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIHBsdWctaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2RlYnVnPWZhbHNlCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgb2YgdmlzdWFsSUQgcHJvY2Vzc2luZwotb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9kZWJ1Zy92aXN1YWxJRD10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1N2FlNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZTc4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMsIAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZ2VmO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWksCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWE7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5kcmF3MmQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTJkYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2RpYWdyYW0vd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZGlhZ3JhbS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZGlhZ3JhbS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2R0b29sMTYvV1BEREVkaXRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvZHRvb2wxNi9XUERERWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVmNWM3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvZHRvb2wxNi9XUERERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9ldG9vbDE2L1dQRERFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2V0b29sMTYvV1BEREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjEyZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2V0b29sMTYvV1BEREVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY3NmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL29iajE2L1VtYURpYWdyYW1GaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvVW1hRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTIyOWNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvVW1hRGlhZ3JhbUZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY4NWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld01vZGVsV2l6YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld1VtYVdpemFyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL3dpemJhbi9OZXdVbWFXaXphcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzA1YjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld1VtYVdpemFyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21lc3NhZ2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTM1ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI05MU19NRVNTQUdFRk9STUFUX1ZBUgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRPRE86IG1hbnVhbGx5IHB1dCBrZXlzIGFuZCB2YWx1ZXMKLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1GYWlsZWQgdG8gbG9hZCBtb2RlbCBmaWxlIHswfQotRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZXMKLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsPUNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGU9VXBkYXRpbmcgY2FjaGUgZmFpbGVkCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ9RmFpbGVkIHRvIHJlZnJlc2ggaGllcmFyY2h5IGZvciBjaGFuZ2VkIHJlc291cmNlCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yPXsxfQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcj1VbmFibGUgdG8gbG9hZCBkaWFncmFtIHJlc291cmNlCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3I9RGlhZ3JhbSBpcyBub3QgcHJlc2VudCBpbiByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcj1FcnJvciBsb2FkaW5nIGRpYWdyYW0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcj1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrPVNhdmluZyBkaWFncmFtCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaz1TYXZpbmcgezB9Ci1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1Nb2RlbCBmaWxlIGxvYWRpbmcgZmFpbGVkCi1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlPUluaXRpYWxpemUgbmV3IHswfSBkaWFncmFtIGZpbGUKLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlPVNlbGVjdCBkb21haW4gbW9kZWwKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lPUluaXRpYWxpemUgbmV3IGRpYWdyYW0gZmlsZQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlPURpYWdyYW0gZmlsZQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgZGlhZ3JhbSBiYXNlZCBvbiB7MH0gbW9kZWwgY29udGVudAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZT1TZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlPURpYWdyYW0gcm9vdCBlbGVtZW50Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbj1TZWxlY3Qgc2VtYW50aWMgbW9kZWwgZWxlbWVudCB0byBiZSBkZXBpY3RlZCBvbiBkaWFncmFtCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZT1TZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQ6Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U9RGlhZ3JhbSByb290IGVsZW1lbnQgaXMgbm90IHNlbGVjdGVkCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZT1JbnZhbGlkIGRpYWdyYW0gcm9vdCBlbGVtZW50IGlzIHNlbGVjdGVkCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kPUluaXRpYWxpemluZyBkaWFncmFtIGNvbnRlbnRzCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yPUluY29ycmVjdCBtb2RlbCBvYmplY3Qgc3RvcmVkIGFzIGEgcm9vdCByZXNvdXJjZSBvYmplY3QKLU1vZGVsMUdyb3VwX3RpdGxlPW1vZGVsCi1Db250cm9sRmxvdzFDcmVhdGlvblRvb2xfdGl0bGU9Q29udHJvbCBGbG93Ci1Db250cm9sRmxvdzFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IENvbnRyb2wgRmxvdwotV29ya1Byb2R1Y3REZXNjcmlwdG9yMkNyZWF0aW9uVG9vbF90aXRsZT1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotV29ya1Byb2R1Y3REZXNjcmlwdG9yMkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQotQ29tbWFuZE5hbWVfT3BlbkRpYWdyYW09T3BlbiBEaWFncmFtCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZGZkMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIgotICAgIG1vZGVsSUQ9IldQREQiCi0gICAgc2FtZUZpbGVGb3JEaWFncmFtQW5kTW9kZWw9InRydWUiCi0gICAgZGlhZ3JhbUZpbGVFeHRlbnNpb249IndwZGQiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5Ij4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90O05ldyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTmFtZWROb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5hbWVkTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOYW1lZE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rVmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTGlua0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4RDsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEQ7JiN4QTsvLyBkaXNwYXRjaE5leHQ/JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgwLCAwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAtMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua05hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJMaW5rTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIExpbmtOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBMaW5rTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Im1vZGVsIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvbGlua19wYWwxNi5naWYiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29yayBQcm9kdWN0IERlc2NyaXB0b3IiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIKLSAgICAgIG5hbWU9IldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gUGx1Z2luIgotICAgICAgcHJvdmlkZXI9IkVQRiIKLSAgICAgIHByaW50aW5nRW5hYmxlZD0idHJ1ZSIKLSAgICAgIGFjdGl2YXRvckNsYXNzTmFtZT0iV1BERGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IiLz4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZncmFwaCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZncmFwaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1ZDIzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ3JhcGgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdyYXBoOkNhbnZhcyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdyYXBoPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dyYXBoaWNhbERlZmluaXRpb24iIG5hbWU9Im1vZGVsIj4KLSAgPGZpZ3VyZXMKLSAgICAgIG5hbWU9IkRlZmF1bHQiPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZUNvbm5lY3Rpb24iCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkxpbmsiCi0gICAgICAgIG5hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgIHRhcmdldERlY29yYXRpb249Ik9wZW5BcnJvdyI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVEZWNvcmF0aW9uIgotICAgICAgICAgIG5hbWU9Ik9wZW5BcnJvdyI+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICB5PSIxIi8+Ci0gICAgICAgIDx0ZW1wbGF0ZS8+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICB5PSItMSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJMaW5rTmFtZSIKLSAgICAgICAgICBuYW1lPSJMaW5rTmFtZUZpZ3VyZSIKLSAgICAgICAgICB0ZXh0PSIiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iV29ya1Byb2R1Y3ROb2RlIgotICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdE5vZGVGaWd1cmUiCi0gICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJOYW1lZE5vZGVOYW1lIgotICAgICAgICAgIG5hbWU9Ik5hbWVkTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iTmV3IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIi8+Ci0gICAgPC9maWd1cmVzPgotICA8L2ZpZ3VyZXM+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iV29ya1Byb2R1Y3ROb2RlIgotICAgICAgZmlndXJlPSJXb3JrUHJvZHVjdE5vZGVGaWd1cmUiLz4KLSAgPGNvbm5lY3Rpb25zCi0gICAgICBuYW1lPSJMaW5rIgotICAgICAgZmlndXJlPSJMaW5rRmlndXJlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkxpbmtOYW1lIgotICAgICAgZmlndXJlPSJMaW5rTmFtZUZpZ3VyZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJOYW1lZE5vZGVOYW1lIgotICAgICAgZmlndXJlPSJOYW1lZE5vZGVOYW1lRmlndXJlIi8+Ci08L2dtZmdyYXBoOkNhbnZhcz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZtYXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQ5ZjRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZm1hcDpNYXBwaW5nIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z21mbWFwPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L21hcHBpbmdzIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Tm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNOYW1lZE5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8Y29udGV4dE1lbnUKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AYWxsTWVudXMuMCIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3ROb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bGlua3M+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rIi8+Ci0gICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNMaW5rTmFtZSIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTGluayIvPgotICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlIi8+Ci0gICAgPGxpbmtNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjbW9kZWwiLz4KLSAgICA8ZG9tYWluTW9kZWwKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIi8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZ0b29sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZnRvb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTc5MmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZnRvb2wKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZnRvb2w6VG9vbFJlZ2lzdHJ5IHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxhbGxNZW51cwotICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q29udGV4dE1lbnUiCi0gICAgICBkZWZhdWx0PSIvL0BhbGxNZW51cy4wL0BpdGVtcy4wIj4KLSAgICA8aXRlbXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6TWVudUFjdGlvbiIKLSAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0IE5vZGUiCi0gICAgICAgIGtpbmQ9IkNVU1RPTSIKLSAgICAgICAgaG90S2V5PSJBTFQrVyIvPgotICA8L2FsbE1lbnVzPgotICA8cGFsZXR0ZT4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0ibW9kZWwiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93Ij4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgIDwvdG9vbHM+Ci0gIDwvcGFsZXR0ZT4KLTwvZ21mdG9vbDpUb29sUmVnaXN0cnk+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQyLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDIuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTdlMGNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDIuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbC8yLjAiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgdmFsaWRhdGlvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIi8+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTsmI3hBO29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBuYW1lZE5vZGVOYW1lRmlndXJlMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hBO25hbWVkTm9kZU5hbWVGaWd1cmUwLnNldFRleHQoJnF1b3Q7TmV3IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yJnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQobmFtZWROb2RlTmFtZUZpZ3VyZTApOyYjeEE7c2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShuYW1lZE5vZGVOYW1lRmlndXJlMCk7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5hbWVkTm9kZU5hbWVGaWd1cmU7ICYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOYW1lZE5vZGVOYW1lRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5OyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4QTsmI3g5OyYjeDk7Zk5hbWVkTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rVmlld0ZhY3RvcnkiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkxpbmtDcmVhdGVDb21tYW5kIgotICAgICAgICByZW9yaWVudENvbW1hbmRDbGFzc05hbWU9IkxpbmtSZW9yaWVudENvbW1hbmQiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTGlua0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIExpbmtGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZSh0cnVlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3RhdGFibGVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4QTtkZi5zZXRGaWxsKHRydWUpOyYjeEE7ZGYuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTtkZi5zZXRPdXRsaW5lKHRydWUpOyYjeEE7ZGYuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTtkZi5zZXRMaW5lV2lkdGgoMSk7JiN4QTtkZi5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4QTtwbC5hZGRQb2ludChnZXRNYXBNb2RlKCkuRFB0b0xQKC0xKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDEpJiN4QTspOyYjeEE7cGwuYWRkUG9pbnQoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApJiN4QTspOyYjeEE7cGwuYWRkUG9pbnQoZ2V0TWFwTW9kZSgpLkRQdG9MUCgtMSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgtMSkmI3hBOyk7JiN4QTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4QTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMykmI3hBOyk7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTGlua05hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBMaW5rTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTGlua05hbWVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0ibW9kZWwiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZiIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICAgIDxwcmVmZXJlbmNlUGFnZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5nZW5lcmFsIgotICAgICAgICBuYW1lPSJEaWFncmFtIERpYWdyYW0iPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLmFwcGVhcmFuY2UiCi0gICAgICAgICAgbmFtZT0iQXBwZWFyYW5jZSIKLSAgICAgICAgICBraW5kPSJBcHBlYXJhbmNlIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0uY29ubmVjdGlvbnMiCi0gICAgICAgICAgbmFtZT0iQ29ubmVjdGlvbnMiCi0gICAgICAgICAga2luZD0iQ29ubmVjdGlvbnMiLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5wcmludGluZyIKLSAgICAgICAgICBuYW1lPSJQcmludGluZyIKLSAgICAgICAgICBraW5kPSJQcmludGluZyIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLnJ1bGVyc0FuZEdyaWQiCi0gICAgICAgICAgbmFtZT0iUnVsZXJzIEFuZCBHcmlkIgotICAgICAgICAgIGtpbmQ9IlJ1bGVyc0FuZEdyaWQiLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5wYXRobWFwcyIKLSAgICAgICAgICBuYW1lPSJQYXRobWFwcyIKLSAgICAgICAgICBraW5kPSJQYXRobWFwcyIvPgotICAgIDwvcHJlZmVyZW5jZVBhZ2VzPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4vPgotICA8ZWRpdG9yLz4KLSAgPG5hdmlnYXRvcj4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGdyb3VwTmFtZT0ibGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0ic291cmNlIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gIDwvbmF2aWdhdG9yPgotICA8cHJvcGVydHlTaGVldD4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJhcHBlYXJhbmNlIi8+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iZGlhZ3JhbSIvPgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ3VzdG9tUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJkb21haW4iCi0gICAgICAgIGxhYmVsPSJDb3JlIj4KLSAgICAgIDxmaWx0ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVUYWJGaWx0ZXIiPgotICAgICAgICA8dHlwZXM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzwvdHlwZXM+Ci0gICAgICAgIDx0eXBlcz5vcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ8L3R5cGVzPgotICAgICAgICA8Z2VuZXJhdGVkVHlwZXM+YWJzdHJhY3ROYXZpZ2F0b3JJdGVtPC9nZW5lcmF0ZWRUeXBlcz4KLSAgICAgIDwvZmlsdGVyPgotICAgIDwvdGFicz4KLSAgPC9wcm9wZXJ0eVNoZWV0PgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLyIvPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZtYXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQyLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmMWNjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQyLmdtZm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvbWFwcGluZ3MvMi4wIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Tm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTmFtZWROb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPGNvbnRleHRNZW51Ci0gICAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQGFsbE1lbnVzLjAiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4xIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluayIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNMaW5rTmFtZSIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTGluayIvPgotICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlIi8+Ci0gICAgPGxpbmtNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjbW9kZWwiLz4KLSAgICA8ZG9tYWluTW9kZWwKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIi8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDMuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMy5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOTkzNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMy5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsLzIuMCIgcGFja2FnZU5hbWVQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiCi0gICAgbW9kZWxJRD0iV1BERCIKLSAgICBzYW1lRmlsZUZvckRpYWdyYW1BbmRNb2RlbD0idHJ1ZSIKLSAgICBkaWFncmFtRmlsZUV4dGVuc2lvbj0id3BkZCI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3RvcnkiCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7TmV3IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yJnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOYW1lZE5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTmFtZWROb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5hbWVkTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rVmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTGlua0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4RDsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEQ7JiN4QTsvLyBkaXNwYXRjaE5leHQ/JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgwLCAwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAtMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua05hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJMaW5rTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIExpbmtOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBMaW5rTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJtb2RlbCI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiCi0gICAgICBuYW1lPSJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtIFBsdWdpbiIKLSAgICAgIHByb3ZpZGVyPSJFUEYiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IldQRERpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yIi8+Ci0gIDxwcm9wZXJ0eVNoZWV0PgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9IlRlc3RpbmcgMTIzIgotICAgICAgICBsYWJlbD0iVGVzdGluZyAxMjMiLz4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJBZHZhbmNlZCIKLSAgICAgICAgbGFiZWw9IkFkdmFuY2VkIi8+Ci0gIDwvcHJvcGVydHlTaGVldD4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBmMDlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcmVmZXJlbmNlcy5nZW5lcmFsPVdQREQgRGlhZ3JhbQotcHJlZmVyZW5jZXMuYXBwZWFyYW5jZT1BcHBlYXJhbmNlCi1wcmVmZXJlbmNlcy5jb25uZWN0aW9ucz1Db25uZWN0aW9ucwotcHJlZmVyZW5jZXMucHJpbnRpbmc9UHJpbnRpbmcKLXByZWZlcmVuY2VzLnJ1bGVyc0FuZEdyaWQ9UnVsZXJzICYgR3JpZAotcHJlZmVyZW5jZXMucGF0aG1hcHM9UGF0aCBNYXBzCi0KLWVkaXRvck5hbWU9V1BERCBEaWFncmFtIEVkaXRvcgotbmV3V2l6YXJkTmFtZT1XUEREIERpYWdyYW0KLW5ld1dpemFyZERlc2M9Q3JlYXRlcyBXUEREIGRpYWdyYW0uCi0KLWluaXREaWFncmFtQWN0aW9uTGFiZWw9SW5pdGlhbGl6ZSB3cGRkIGRpYWdyYW0gZmlsZQotbG9hZFJlc291cmNlQWN0aW9uTGFiZWw9TG9hZCBSZXNvdXJjZS4uLgotCi1uYXZpZ2F0b3JDb250ZW50TmFtZT0qLndwZGQgZGlhZ3JhbSBjb250ZW50cwotCi1tZXRhdHlwZS5uYW1lLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzk9VW5kZWZpbmVkCi1tZXRhdHlwZS5uYW1lLldvcmtQcm9kdWN0Tm9kZV8xMDAxPVdvcmtQcm9kdWN0Tm9kZQotbWV0YXR5cGUubmFtZS5MaW5rXzMwMDE9TGluawotCi10YWIuVGVzdGluZy4xMjM9VGVzdGluZyAxMjMKLXRhYi5BZHZhbmNlZD1BZHZhbmNlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLXBsdWdpbk5hbWU9RVBGIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0KLSMgTmVlZCB0cmFuc2xhdGlvbgotZWxlbWVudF90eXBlX2NvbnRyb2xfZmxvdz1Db250cm9sIEZsb3cKLWVsZW1lbnRfdHlwZV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yPVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZmFiOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgZXh0ZW5zaW9uPSJ3cGRkIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgICAgPHBhcnNlcgotICAgICAgICAgdHlwZT0id3BkZCIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5Ij4KLSAgICAgIDwvcGFyc2VyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgPCEtLQotICAgICA8ZWRpdG9yCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIgotICAgICAgICBuYW1lPSJXUEREIERpYWdyYW0gRWRpdG9yIgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZiIKLSAgICAgICAgZXh0ZW5zaW9ucz0id3BkZCIKLSAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yIgotICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KLSAgICAgPC9lZGl0b3I+Ci0gICAgIC0tPgotICAgICA8ZWRpdG9yCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIgotICAgICAgICBuYW1lPSJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtIEVkaXRvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1dQRERFZGl0b3IuZ2lmIgotICAgICAgICBleHRlbnNpb25zPSJ3cGRkIgotICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3IiCi0gICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtTWF0Y2hpbmdTdHJhdGVneSIKLSAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IiPgotICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gIAkgIDx3aXphcmQKLSAgCSAgICAgbmFtZT0iV1BERCBEaWFncmFtIgotICAJICAgICBpY29uPSJpY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZiIKLSAgCSAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzIgotICAJICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1DcmVhdGlvbldpemFyZCIKLSAgCSAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtQ3JlYXRpb25XaXphcmRJRCI+Ci0gIAkgIAkgPGRlc2NyaXB0aW9uPgotICAJICAJCUNyZWF0ZXMgV1BERCBkaWFncmFtLgotICAJICAJIDwvZGVzY3JpcHRpb24+ICAKLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAtLT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgIDwhLS0gPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudWkub2JqZWN0Q29udHJpYnV0aW9uLklGaWxlMSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioubW9kZWwiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IkluaXRpYWxpemUgd3BkZCBkaWFncmFtIGZpbGUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbklEIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC51aS5vYmplY3RDb250cmlidXRpb24uV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0MiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb25JRCIKLSAgICAgICAgICAgICAgIGxhYmVsPSJMb2FkIFJlc291cmNlLi4uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5EZWxldGVEaWFncmFtIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlRGVsZXRlRGlhZ3JhbV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJURlbGV0ZURpYWdyYW1fdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVyZWZyZXNoX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgIC0tPiAgICAgICAgICAgICAgICAgICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uSXRlbVByb3ZpZGVycyI+Ci0gICAgICA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxwYXJ0Q29udHJpYnV0aW9uIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxwYXJ0QWN0aW9uIG1lbnViYXJQYXRoPSIvZmlsZS9wcmludCIgaWQ9InByaW50UHJldmlld0FjdGlvbiI+Ci0gICAgICAgICAgICA8L3BhcnRBY3Rpb24+Ci0gICAgICAgICA8L3BhcnRDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4KLSAgICAgPCEtLSA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciIKLSAgICAgICAgICAgIGNoZWNrUGx1Z2luTG9hZGVkPSJmYWxzZSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgIDwvY29udHJpYnV0aW9uSXRlbVByb3ZpZGVyPgotICAgICAgLS0+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5nbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXJzIj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IldQRERQcmVzZW50YXRpb24iPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImRlbGV0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0ic2F2ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1XaXRoUHJpbnRHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iV1BERFByZXNlbnRhdGlvblByaW50Ij4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwcmludCIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLnByb3ZpZGVycy5EaWFncmFtSURFR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IldQRERQcmVzZW50YXRpb25JREUiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImJvb2ttYXJrIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDwhLS0KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVVJUmVuZGVyR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9IldQRERSZW5kZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImN1dCIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjb3B5Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InBhc3RlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIC0tPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3UHJvdmlkZXJzIj4KLSAgICAgIDx2aWV3UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1WaWV3UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIiBzZW1hbnRpY0hpbnRzPSJXUEREIi8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUiIHNlbWFudGljSGludHM9IiIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgIDwvdmlld1Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRQcm92aWRlcnMiPgotICAgICAgPGVkaXRwYXJ0UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FZGl0UGFydFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvZWRpdHBhcnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhbGV0dGVQcm92aWRlcnMiPgotICAgICAgPHBhbGV0dGVQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbVBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EZWZhdWx0UGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgPFByaW9yaXR5IG5hbWU9Ik1lZGl1bSIvPgotICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICAgIDxjb250cmlidXRpb24+Ci0gICAgICAgICAgICA8cHJlZGVmaW5lZEVudHJ5ICAgIAotICAgICAgICAgICAgCWlkPSJnZW9zaGFwZURyYXdlciIgICBwYXRoPSIvIj4KLSAgICAgICAgICAgIAk8ZXhwYW5kIGZvcmNlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgPC9wcmVkZWZpbmVkRW50cnk+IAotICAgICAgICA8L2NvbnRyaWJ1dGlvbj4KLSAgICAgIDwvcGFsZXR0ZVByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVycyI+Ci0gICAgICA8bW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXNQcm92aWRlcnMiPgotICAgICAgPFByb3BlcnRpZXNQcm92aWRlcgotICAgICAgICAgICAgdmVyaWZ5UGx1Z2luTG9hZGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtUHJvcGVydHlQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1Byb3BlcnRpZXNQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvblByb3ZpZGVycyI+Ci0gICAgICA8SWNvblByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciLz4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgICAgPEljb25Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLmludGVybmFsLnByb3ZpZGVycy5HZW9TaGFwZUljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkKLSAgICAgICAgICAgICAgIG5hbWU9Ik1lZGl1bSI+Ci0gICAgICAgICA8L1ByaW9yaXR5PgotICAgICAgICAgPG9iamVjdCBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbikiIGlkPSJHZW9TaGFwZSI+Ci0gICAgICAgIAkgPG1ldGhvZCBuYW1lPSJnZXRUeXBlKCkiIHZhbHVlPSJvdmFsLHRyaWFuZ2xlLHJlY3RhbmdsZSxzaGFkb3dSZWN0YW5nbGUscmVjdGFuZ2xlM0Qscm91bmRSZWN0YW5nbGUsaGV4YWdvbixvY3RhZ29uLHBlbnRhZ29uLGRpYW1vbmQsY3lsaW5kZXIsbGluZSIvPgotCSAgICAgPC9vYmplY3Q+Ci0gICAgICAgICA8Y29udGV4dCBlbGVtZW50cz0iR2VvU2hhcGUiPgotICAgICAgICAgPC9jb250ZXh0PgotICAgICAgPC9JY29uUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlclByb3ZpZGVycyI+Ci0gICAgICA8UGFyc2VyUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1QYXJzZXJQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1BhcnNlclByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVzIj4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5oZWxwZXJzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSI3OSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3ROb2RlXzEwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3IiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJXb3JrUHJvZHVjdE5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVycy5Xb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5MaW5rXzMwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2NvbnRyb2xfZmxvdyIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkxpbmsiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVycy5MaW5rRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZUJpbmRpbmdzIj4KLSAgICAgIDxjbGllbnRDb250ZXh0IGlkPSJXUEREQ2xpZW50Q29udGV4dCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuZWRpdGluZ0RvbWFpbiIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5FZGl0aW5nRG9tYWluIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2NsaWVudENvbnRleHQ+IAotICAgICAgPGJpbmRpbmcgY29udGV4dD0iV1BERENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLldvcmtQcm9kdWN0Tm9kZV8xMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLkxpbmtfMzAwMSIvPgotICAgICAgICAgPGFkdmljZSByZWY9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5hZHZpY2Uubm90YXRpb25EZXBkZW5kZW50cyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHBhdHRlcm49Ii4qIi8+Ci0gICAgICA8L2JpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDYyZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIGV4dGVuZHMKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQoCi0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgbGFiZWwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgZWRnZUFkYXB0b3IuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFdvcmtzcGFjZUZpbGVzKHZpZXcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZEZpbGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGdldEVkZ2VBZGFwdG9yKCkgewotCQlyZXR1cm4gZWRnZUFkYXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkZ2VBZGFwdG9yKElBZGFwdGFibGUgZWRnZUFkYXB0b3IpIHsKLQkJdGhpcy5lZGdlQWRhcHRvciA9IGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQlhc3NlcnQgbnVsbCAhPSBlZGdlQWRhcHRvciA6ICJOdWxsIGNoaWxkIGluIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQkJRWRnZSBlZGdlID0gKEVkZ2UpIGdldEVkZ2VBZGFwdG9yKCkuZ2V0QWRhcHRlcihFZGdlLmNsYXNzKTsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZSA6ICJOdWxsIGVkZ2UgaW4gRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JCVZpZXcgdGVtcFZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQllZGdlLnNldFNvdXJjZShlZGdlLmdldFRhcmdldCgpKTsKLQkJZWRnZS5zZXRUYXJnZXQodGVtcFZpZXcpOwotCi0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0xpbmtDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGY4MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0xpbmtDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE5vZGUgbXlDb250YWluZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBOb2RlIG15U291cmNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTm9kZSBteVRhcmdldDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua0NyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEsIE5vZGUgY29udGFpbmVyLAotCQkJTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0KSB7Ci0JCXN1cGVyKHJlcSk7Ci0JCXN1cGVyLnNldEVsZW1lbnRUb0VkaXQoY29udGFpbmVyKTsKLQkJbXlDb250YWluZXIgPSBjb250YWluZXI7Ci0JCW15U291cmNlID0gc291cmNlOwotCQlteVRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gbXlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG15U291cmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBteVRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJTGluayBuZXdFbGVtZW50ID0gKExpbmspIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldChteVRhcmdldCk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZShteVNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvTGlua1Jlb3JpZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4ZjdmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvTGlua1Jlb3JpZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rUmVvcmllbnRDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCByZW9yaWVudERpcmVjdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVPYmplY3Qgb2xkRW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgRU9iamVjdCBuZXdFbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtSZW9yaWVudENvbW1hbmQoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdC5nZXRMYWJlbCgpLCByZXF1ZXN0LmdldFJlbGF0aW9uc2hpcCgpLCByZXF1ZXN0KTsKLQkJcmVvcmllbnREaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwotCQlvbGRFbmQgPSByZXF1ZXN0LmdldE9sZFJlbGF0aW9uc2hpcEVuZCgpOwotCQluZXdFbmQgPSByZXF1ZXN0LmdldE5ld1JlbGF0aW9uc2hpcEVuZCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoIShnZXRFbGVtZW50VG9FZGl0KCkgaW5zdGFuY2VvZiBMaW5rKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7Ci0JCQlyZXR1cm4gY2FuUmVvcmllbnRTb3VyY2UoKTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFNvdXJjZSgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgTm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgdGFyZ2V0ID0gZ2V0TGluaygpLmdldFRhcmdldCgpOwotCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRMaW5rKCkuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIGdldE5ld1NvdXJjZSgpLCB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFRhcmdldCgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgTm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgc291cmNlID0gZ2V0TGluaygpLmdldFNvdXJjZSgpOwotCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRMaW5rKCkuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgZ2V0TmV3VGFyZ2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghY2FuRXhlY3V0ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkiSW52YWxpZCBhcmd1bWVudHMgaW4gcmVvcmllbnQgbGluayBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIHJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiByZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRTb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFNvdXJjZShnZXROZXdTb3VyY2UoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFRhcmdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlnZXRMaW5rKCkuc2V0VGFyZ2V0KGdldE5ld1RhcmdldCgpKTsKLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaW5rIGdldExpbmsoKSB7Ci0JCXJldHVybiAoTGluaykgZ2V0RWxlbWVudFRvRWRpdCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXRPbGRTb3VyY2UoKSB7Ci0JCXJldHVybiAoTm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXROZXdTb3VyY2UoKSB7Ci0JCXJldHVybiAoTm9kZSkgbmV3RW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXRPbGRUYXJnZXQoKSB7Ci0JCXJldHVybiAoTm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXROZXdUYXJnZXQoKSB7Ci0JCXJldHVybiAoTm9kZSkgbmV3RW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdjNWUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlOYW1lZE5vZGUgbmV3Tm9kZSA9IChOYW1lZE5vZGUpc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9bmV3Tm9kZS5nZXREaWFncmFtKCk7Ci0JCWRpYWdyYW0uc2V0RGVmYXVsdE5hbWUobmV3Tm9kZSk7Ci0JCXJldHVybiBuZXdOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvRGlhZ3JhbUJhc2VFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOGQ0NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvRGlhZ3JhbUJhc2VFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0SGVscGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1BPTElDWV9DT01NQU5EID0gImVkaXQgcG9saWN5IGNvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldEluc3RlYWRDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7Ci0JCUlDb21tYW5kIGVwQ29tbWFuZCA9IChJQ29tbWFuZCkgcmVxLmdldFBhcmFtZXRlcihFRElUX1BPTElDWV9DT01NQU5EKTsKLQkJcmVxLnNldFBhcmFtZXRlcihFRElUX1BPTElDWV9DT01NQU5ELCBudWxsKTsKLQkJSUNvbW1hbmQgZWhDb21tYW5kID0gc3VwZXIuZ2V0SW5zdGVhZENvbW1hbmQocmVxKTsKLQkJaWYgKGVwQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCWlmIChlaENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVwQ29tbWFuZDsKLQkJfQotCQlDb21wb3NpdGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChudWxsKTsKLQkJY29tbWFuZC5hZGQoZXBDb21tYW5kKTsKLQkJY29tbWFuZC5hZGQoZWhDb21tYW5kKTsKLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9MaW5rRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3OWQzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9MaW5rRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgxODc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlciBleHRlbmRzCi0JCURpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWYwMjc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9EaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ0ZTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9EaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgbW9kZWw7Ci0JCQlzd2l0Y2ggKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKSB7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBMaW5rTmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCS8vIEhhbmRsZSBjcmVhdGlvbiBvZiB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBFZGl0UGFydHMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDZWxsRWRpdG9yTG9jYXRvciBnZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IoCi0JCQlJVGV4dEF3YXJlRWRpdFBhcnQgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpCi0JCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yTG9jYXRvcigoV3JhcExhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOwotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcigoTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHByaXZhdGUgY2xhc3MgVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCB3cmFwTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoV3JhcExhYmVsIHdyYXBMYWJlbCkgewotCQkJdGhpcy53cmFwTGFiZWwgPSB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRXcmFwTGFiZWwoKSB7Ci0JCQlyZXR1cm4gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0V3JhcExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJCWlmIChnZXRXcmFwTGFiZWwoKS5pc1RleHRXcmFwcGVkKCkKLQkJCQkJJiYgZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUocmVjdC53aWR0aCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJfQotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkgewotCQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0TGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0TGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpIHsKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0RpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0RpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODZlOWVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5MYWJlbExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCUlGaWd1cmUgcmVmRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLmdldEZpZ3VyZSgpOwotCQlpbnQgZHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBvZmZzZXQgPSBuZXcgUG9pbnQoZHgsIGR5KTsKLQkJZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuc2V0Q29uc3RyYWludChnZXRGaWd1cmUoKSwKLQkJCQluZXcgTGFiZWxMb2NhdG9yKHJlZkZpZ3VyZSwgb2Zmc2V0LCBnZXRLZXlQb2ludCgpKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcmVsb2NhdGUoSUZpZ3VyZSB0YXJnZXQpIHsKLQkJCQkJCVBvaW50IGxvY2F0aW9uID0gZ2V0UmVmZXJlbmNlUG9pbnQoKS5nZXRUcmFuc2xhdGVkKAotCQkJCQkJCQlnZXRPZmZzZXQoKSk7Ci0JCQkJCQlsb2NhdGlvbi50cmFuc2xhdGUoLXRhcmdldC5nZXRCb3VuZHMoKS53aWR0aCAvIDIsIDApOwotCQkJCQkJdGFyZ2V0LnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCQkJCXRhcmdldC5zZXRTaXplKG5ldyBEaW1lbnNpb24oCi0JCQkJCQkJCXRhcmdldC5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGgsIHRhcmdldAotCQkJCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0TGFiZWxMb2NhdGlvbihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24oKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLmdldEZpZ3VyZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldExhYmVsTG9jYXRpb24oSUZpZ3VyZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHBhcmVudC5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvTGlua0VkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvTGlua0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjlmNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtFZGl0UGFydCBleHRlbmRzIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IExpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKSB7Ci0KLQkJcmV0dXJuIG5ldyBMaW5rRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgUG9seWxpbmVDb25uZWN0aW9uRXggewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGlua0ZpZ3VyZSgpIHsKLQotCQkJc2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7Ci0JCQlQb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgUG9seWxpbmVEZWNvcmF0aW9uKCk7Ci0JCQkvLyBkaXNwYXRjaE5leHQ/Ci0KLQkJCVBvaW50TGlzdCBwbCA9IG5ldyBQb2ludExpc3QoKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAxKTsKLQkJCXBsLmFkZFBvaW50KDAsIDApOwotCQkJcGwuYWRkUG9pbnQoLTEsIC0xKTsKLQkJCWRmLnNldFRlbXBsYXRlKHBsKTsKLQkJCWRmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOwotCi0JCQlyZXR1cm4gZGY7Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBvdmVycmlkZUNvbG9yID0gRGlhZ3JhbUNvcmVVdGlsLmdldExpbmtPdmVycmlkZUNvbG9yKChFZGdlKSBnZXRNb2RlbCgpKTsKLQkJc3VwZXIuc2V0Rm9yZWdyb3VuZENvbG9yKG92ZXJyaWRlQ29sb3IgIT0gbnVsbCA/IG92ZXJyaWRlQ29sb3IgOiBjb2xvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvTGlua05hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlNzMxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvTGlua05hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rTmFtZUVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHsKLQkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQpLCBuZXcgUG9pbnQoMCwgNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEtleVBvaW50KCkgewotCQlyZXR1cm4gQ29ubmVjdGlvbkxvY2F0b3IuTUlERExFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQkvLwkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJLy8JCQkJLmdldEl0ZW1JbWFnZURlc2NyaXB0b3IoZ2V0UGFyc2VyRWxlbWVudCgpKTsKLQkJLy8JCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJLy8JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJLy8JCX0KLQkJLy8JCXJldHVybiBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBMaW5rTmFtZUZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTGlua05hbWVGaWd1cmUgZXh0ZW5kcyBXcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGlua05hbWVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiIik7CS8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWRmMDQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfSUQgPSAiV1BERCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3OTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuVklFV19fVklTSUJMRS5lcXVhbHMoZXZlbnQuZ2V0RmVhdHVyZSgpKSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gZXZlbnQuZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciA9PSBnZXRNb2RlbCgpKQotCQkJCXJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0JCQllbHNlIGlmIChldmVudC5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCQkJCURpYWdyYW1FZGl0b3JVdGlsLnJlZnJlc2hDb25uZWN0aW9uRWRpdFBhcnRzKHRoaXMpOwotCQkJfQotCQl9IGVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWM4MDljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJV29ya1Byb2R1Y3ROb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoV29ya1Byb2R1Y3ROb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKS5nZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLldQRERfTmV3X1dvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCQkJc2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZk5hbWVkTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmTmFtZWROb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTmFtZWROb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1MzhjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQkvLwkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJLy8JCQkJLmdldEl0ZW1JbWFnZURlc2NyaXB0b3IoZ2V0UGFyc2VyRWxlbWVudCgpKTsKLQkJLy8JCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJLy8JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJLy8JCX0KLQkJLy8JCXJldHVybiBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCUltYWdlIGltYWdlID0gRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSwgdHJ1ZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9ICBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdE5vZGVfMTAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIERpYWdyYW1FZGl0UGFydEZhY3RvcnkKLQkJCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0KLQkJCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbW9kZWwgPSAoTm9kZSkgb2JqOwotCQkJCQkJRU9iamVjdCB1bWFOb2RlID0gbW9kZWwuZ2V0RWxlbWVudCgpOwotCQkJCQkJCi0JCQkJCQlpZiAodW1hTm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB1bWFOb2RlOwotCQkJCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQkJZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKQotCQkJCQkJCS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjZkOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVkaXRIZWxwZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5HZXRFZGl0Q29udGV4dFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVycy5EaWFncmFtQmFzZUVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcyBTZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogRXh0ZW5kZWQgcmVxdWVzdCBkYXRhIGtleSB0byBob2xkIGVkaXRwYXJ0IHZpc3VhbCBpZC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTVUFMX0lEX0tFWSA9ICJ2aXN1YWxfaWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGQgdmlzdWFsIGlkIG9mIGVkaXRlZCBlZGl0cGFydCB0byBleHRlbmRlZCBkYXRhIG9mIHRoZSByZXF1ZXN0Ci0JICogc28gY29tbWFuZCBzd2l0Y2ggY2FuIGRlY2lkZSB3aGF0IGtpbmQgb2YgZGlhZ3JhbSBlbGVtZW50IGlzIGJlaW5nIGVkaXRlZC4KLQkgKiBJdCBpcyBkb25lIGluIHRob3NlIGNhc2VzIHdoZW4gaXQncyBub3QgcG9zc2libGUgdG8gZGVkdWNlIGRpYWdyYW0KLQkgKiBlbGVtZW50IGtpbmQgZnJvbSBkb21haW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZWNvbm5lY3RSZXF1ZXN0KSB7Ci0JCQlPYmplY3QgdmlldyA9ICgoUmVjb25uZWN0UmVxdWVzdCkgcmVxdWVzdCkuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJLmdldE1vZGVsKCk7Ci0JCQlpZiAodmlldyBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQlJbnRlZ2VyIGlkID0gbmV3IEludGVnZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRCgoVmlldykgdmlldykpOwotCQkJCXJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkucHV0KFZJU1VBTF9JRF9LRVksIGlkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZpc3VhbCBpZCBmcm9tIHJlcXVlc3QgcGFyYW1ldGVycy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRWaXN1YWxJRChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJT2JqZWN0IGlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVklTVUFMX0lEX0tFWSk7Ci0JCXJldHVybiBpZCBpbnN0YW5jZW9mIEludGVnZXIgPyAoKEludGVnZXIpIGlkKS5pbnRWYWx1ZSgpIDogLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUVkaXRDb21tYW5kUmVxdWVzdCBjb21wbGV0ZWRSZXF1ZXN0ID0gY29tcGxldGVSZXF1ZXN0KHJlcXVlc3QpOwotCQlPYmplY3QgZWRpdEhlbHBlckNvbnRleHQgPSBjb21wbGV0ZWRSZXF1ZXN0LmdldEVkaXRIZWxwZXJDb250ZXh0KCk7Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIFZpZXcKLQkJCQl8fCAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBJRWRpdEhlbHBlckNvbnRleHQgJiYgKChJRWRpdEhlbHBlckNvbnRleHQpIGVkaXRIZWxwZXJDb250ZXh0KQotCQkJCQkJLmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIFZpZXcpKSB7Ci0JCQkvLyBubyBzZW1hbnRpYyBjb21tYW5kcyBhcmUgcHJvdmlkZWQgZm9yIHB1cmUgZGVzaWduIGVsZW1lbnRzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgPT0gbnVsbCkgewotCQkJZWRpdEhlbHBlckNvbnRleHQgPSBWaWV3VXRpbAotCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRFbGVtZW50VHlwZShlZGl0SGVscGVyQ29udGV4dCk7Ci0JCWlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZSgKLQkJCQkib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5kZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCWVsZW1lbnRUeXBlID0gbnVsbDsKLQkJfQotCQlDb21tYW5kIGVwQ29tbWFuZCA9IGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJaWYgKGVwQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZXBDb21tYW5kIGluc3RhbmNlb2YgSUNvbW1hbmRQcm94eSA/ICgoSUNvbW1hbmRQcm94eSkgZXBDb21tYW5kKQotCQkJCQkuZ2V0SUNvbW1hbmQoKQotCQkJCQk6IG5ldyBDb21tYW5kUHJveHkoZXBDb21tYW5kKTsKLQkJCWNvbXBsZXRlZFJlcXVlc3Quc2V0UGFyYW1ldGVyKAotCQkJCQlEaWFncmFtQmFzZUVkaXRIZWxwZXIuRURJVF9QT0xJQ1lfQ09NTUFORCwgY29tbWFuZCk7Ci0JCX0KLQkJQ29tbWFuZCBlaENvbW1hbmQgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVsZW1lbnRUeXBlLmdldEVkaXRDb21tYW5kKGNvbXBsZXRlZFJlcXVlc3QpOwotCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWlmICghKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCkpIHsKLQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCQkJCW51bGwpLmNvbXBvc2UoY29tbWFuZCk7Ci0JCQkJfQotCQkJCWVoQ29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc2hvdWxkUHJvY2VlZCA9IHRydWU7Ci0JCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCXNob3VsZFByb2NlZWQgPSBzaG91bGRQcm9jZWVkKChEZXN0cm95UmVxdWVzdCkgY29tcGxldGVkUmVxdWVzdCk7Ci0JCX0KLQkJaWYgKHNob3VsZFByb2NlZWQpIHsKLQkJCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJQ29tbWFuZCBkZWxldGVWaWV3Q29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KAotCQkJCQkJbmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgKFZpZXcpIGdldEhvc3QoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKSkpOwotCQkJCWVoQ29tbWFuZCA9IGVoQ29tbWFuZCA9PSBudWxsID8gZGVsZXRlVmlld0NvbW1hbmQgOiBlaENvbW1hbmQKLQkJCQkJCS5jaGFpbihkZWxldGVWaWV3Q29tbWFuZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goSUVkaXRDb21tYW5kUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlQ29tbWFuZCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ29uZmlndXJlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENvbmZpZ3VyZUNvbW1hbmQoKENvbmZpZ3VyZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChEZXN0cm95RWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZCgoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RHVwbGljYXRlQ29tbWFuZCgoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIEdldEVkaXRDb250ZXh0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldEVkaXRDb250ZXh0Q29tbWFuZCgoR2V0RWRpdENvbnRleHRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIE1vdmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0TW92ZUNvbW1hbmQoKE1vdmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFNldFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRTZXRDb21tYW5kKChTZXRSZXF1ZXN0KSByZXEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25maWd1cmVDb21tYW5kKENvbmZpZ3VyZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2V0Q29tbWFuZChTZXRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RWRpdENvbnRleHRDb21tYW5kKEdldEVkaXRDb250ZXh0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNU0xXcmFwcGVyKElDb21tYW5kIGNtZCkgewotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY21kKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KCkgewotCQlyZXR1cm4gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGNvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgbmV3IHJlbGF0aW9uc2hpcCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBnb2VzIHVwIGJ5IGNvbnRhaW5tZW50IGhpZXJhcmNoeSBzdGFydGluZyBmcm9tCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgaW5zdGFuY2Ugb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBjbGFzcy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKE9iamVjdCB1ZWxlbWVudCwKLQkJCUVDbGFzcyBjb250YWluZXJDbGFzcywgSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJaWYgKHVlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIHVlbGVtZW50OwotCQkJZm9yICg7IGVsZW1lbnQgIT0gbnVsbDsgZWxlbWVudCA9IGVsZW1lbnQuZUNvbnRhaW5lcigpKSB7Ci0JCQkJaWYgKGNvbnRhaW5lckNsYXNzLmlzU3VwZXJUeXBlT2YoZWxlbWVudC5lQ2xhc3MoKSkpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZWRpdGluZyBkb21haW4gZnJvbSB0aGUgaG9zdCBlZGl0IHBhcnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tbWFuZCB0byBkZXN0cm95IHRoZSBsaW5rLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoVmlldyB2aWV3LCBib29sZWFuIGNvbmZpcm0pIHsKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKQotCQkJCS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHZpZXcpOwotCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoCi0JCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBjb25maXJtKTsKLQkJcmV0dXJuIGVkaXRQYXJ0LmdldENvbW1hbmQobmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIocmVxdWVzdCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9NQVApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmRzIHRvIGRlc3Ryb3kgYWxsIGhvc3QgaW5jb21pbmcgYW5kIG91dGdvaW5nIGxpbmtzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRDb21tYW5kIGdldERlc3Ryb3lFZGdlc0NvbW1hbmQoYm9vbGVhbiBjb25maXJtKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRWRnZSkgaXQubmV4dCgpLCBjb25maXJtKSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRWRnZSkgaXQubmV4dCgpLCBjb25maXJtKSk7Ci0JCX0KLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMaW5rQ29uc3RyYWludHMgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlTGlua18zMDAxKE5vZGUgY29udGFpbmVyLCBOb2RlIHNvdXJjZSwKLQkJCQlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIGNhbkV4aXN0TGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5FeGlzdExpbmtfMzAwMShOb2RlIGNvbnRhaW5lciwgTm9kZSBzb3VyY2UsCi0JCQkJTm9kZSB0YXJnZXQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3M2FiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXlvdXRFZGl0UG9saWN5IGdldFJlYWxMYXlvdXRFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWxMYXlvdXRFZGl0UG9saWN5KExheW91dEVkaXRQb2xpY3kgcmVhbExheW91dEVkaXRQb2xpY3kpIHsKLQkJdGhpcy5yZWFsTGF5b3V0RWRpdFBvbGljeSA9IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVybmFsTGFiZWwoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRFeHRlcm5hbExhYmVscyhHcm91cFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChlZGl0UGFydCkpIHsKLQkJCQkJZWRpdFBhcnRzLmFkZChlZGl0UGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSRVFfTU9WRV9DSElMRFJFTi5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKSB7Ci0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNiUmVxdWVzdCA9IChDaGFuZ2VCb3VuZHNSZXF1ZXN0KSByZXF1ZXN0OwotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscyhjYlJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBjYlJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0JCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJCQkmJiBlZGl0UGFydHMuc2l6ZSgpID4gZXh0TGFiZWxzLnNpemUoKSkgewotCQkJCQlMaXN0IG90aGVyID0gbmV3IEFycmF5TGlzdChlZGl0UGFydHMpOwotCQkJCQlvdGhlci5yZW1vdmVBbGwoZXh0TGFiZWxzKTsKLQkJCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhvdGhlcik7Ci0JCQkJCWNtZCA9IHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJfQotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZXh0TGFiZWxzKTsKLQkJCQlDb21tYW5kIGV4dExhYmVsc0NtZCA9IGdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhlZGl0UGFydHMpOwotCQkJCXJldHVybiBjbWQgPT0gbnVsbCA/IGV4dExhYmVsc0NtZCA6IGNtZC5jaGFpbihleHRMYWJlbHNDbWQpOwotCQkJfQotCQl9Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0KSB7Ci0JCQlMaXN0IGV4dExhYmVscyA9IGdldEV4dGVybmFsTGFiZWxzKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5ID09IG51bGwgPyBudWxsIDogcmVhbExheW91dEVkaXRQb2xpY3kKLQkJCQkuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb25zdHJhaW50Rm9yKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldykgY2hpbGQKLQkJCQkuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpKQotCQkJCS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKGR4LCBkeSwgMCwgMCk7Ci0JCWNoaWxkLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCXIudHJhbnNsYXRlKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJJiYgcmVhbExheW91dEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci51bmRlcnN0YW5kc1JlcXVlc3QocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVDaGlsZChFZGl0UGFydCBjaGlsZCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIuc2V0SG9zdChob3N0KTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNldEhvc3QoaG9zdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5hY3RpdmF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmRlYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3kuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93VGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZXJhc2VUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTFkNWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5lZGl0aGVscGVycy5DcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzLkRpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgewotCQkJQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyIHJlcXVlc3RBZGFwdGVyID0gKChDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSByZXF1ZXN0KQotCQkJCQkuZ2V0Q29ubmVjdGlvblZpZXdBbmRFbGVtZW50RGVzY3JpcHRvcigpCi0JCQkJCS5nZXRDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIoKTsKLQkJCXJldHVybiAoSUVsZW1lbnRUeXBlKSByZXF1ZXN0QWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25XaXRoUmVvcmllbnRlZFZpZXdDb21wbGV0ZUNvbW1hbmQoCi0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlDb21tYW5kUHJveHkgYyA9IChJQ29tbWFuZFByb3h5KSBzdXBlcgotCQkJCS5nZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKHJlcXVlc3QpOwotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gKENvbXBvc2l0ZUNvbW1hbmQpIGMuZ2V0SUNvbW1hbmQoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIHJjdkNvbW1hbmQgPSBuZXcgRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sIG51bGwpOwotCQlyY3ZDb21tYW5kLnNldEVkZ2VBZGFwdG9yKGdldFZpZXdBZGFwdGVyKCkpOwotCQljYy5jb21wb3NlKHJjdkNvbW1hbmQpOwotCQlyZXR1cm4gYzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTc0MzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19UaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMID0gRGlhZ3JhbVVJTWVzc2FnZXMuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGVfRG9Ob3RQcm9tcHRBZ2FpblRvZ2dsZV9sYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCWJvb2xlYW4gaXNEZWxldGVGcm9tS2V5Qm9hcmQgPSBkZWxldGVSZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQ7Ci0JCWlmIChzaG91bGREZWxldGVTZW1hbnRpYygpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBwcm9jZWVkVG9EZWxldGVWaWV3ID0gdHJ1ZTsKLQkJCWlmIChpc0RlbGV0ZUZyb21LZXlCb2FyZCkgewotCQkJCUdyb3VwUmVxdWVzdFZpYUtleWJvYXJkIGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkID0gKEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSBkZWxldGVSZXF1ZXN0OwotCQkJCWlmIChncm91cFJlcXVlc3RWaWFLZXlib2FyZC5pc1Nob3dJbmZvcm1hdGlvbkRpYWxvZygpKSB7Ci0JCQkJCXByb2NlZWRUb0RlbGV0ZVZpZXcgPSBzaG93UHJvbXB0KCk7Ci0JCQkJCWdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLnNldFNob3dJbmZvcm1hdGlvbkRpYWxvZyhmYWxzZSk7Ci0JCQkJCWlmICghKHByb2NlZWRUb0RlbGV0ZVZpZXcpKQotCQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVNlbWFudGljKCkgewotCQlBc3NlcnQuaXNUcnVlKGdldEhvc3QoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KTsKLQkJQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgY2VwID0gKEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JCWJvb2xlYW4gaXNDYW5vbmljYWwgPSBmYWxzZTsKLQkJaWYgKGNlcC5nZXRTb3VyY2UoKSAhPSBudWxsKQotCQkJaXNDYW5vbmljYWwgPSBJc0Nhbm9uaWNhbChjZXAuZ2V0U291cmNlKCkpOwotCQlpZiAoY2VwLmdldFRhcmdldCgpICE9IG51bGwpCi0JCQlyZXR1cm4gaXNDYW5vbmljYWwgPyBpc0Nhbm9uaWNhbCA6IElzQ2Fub25pY2FsKGNlcC5nZXRUYXJnZXQoKSk7Ci0JCXJldHVybiBpc0Nhbm9uaWNhbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIElzQ2Fub25pY2FsKEVkaXRQYXJ0IGVwKSB7Ci0JCUVkaXRQYXJ0IHBhcmVudCA9IGVwLmdldFBhcmVudCgpOwotCQlyZXR1cm4gcGFyZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQgPyAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJlbnQpCi0JCQkJLmlzQ2Fub25pY2FsKCkKLQkJCQk6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkobmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIgc2VtUmVxID0gbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChlZGl0aW5nRG9tYWluLCBmYWxzZSksIGRlbGV0ZVJlcXVlc3QKLQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKSk7Ci0JCUNvbW1hbmQgc2VtYW50aWNDbWQgPSBnZXRIb3N0KCkuZ2V0Q29tbWFuZChzZW1SZXEpOwotCQlpZiAoc2VtYW50aWNDbWQgIT0gbnVsbCAmJiBzZW1hbnRpY0NtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjYyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJCWNjLmFkZChzZW1hbnRpY0NtZCk7Ci0JCQlyZXR1cm4gY2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJvbXB0KCkgewotCQlib29sZWFuIHByb21wdCA9ICgoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKQotCQkJCS5nZXRCb29sZWFuKElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAocHJvbXB0KQotCQkJaWYgKHNob3dNZXNzYWdlRGlhbG9nKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dNZXNzYWdlRGlhbG9nKCkgewotCQlNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZQotCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUsCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFLAotCQkJCQkJREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCwgZmFsc2UsCi0JCQkJCQkoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKQotCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZXRlQ29tbWFuZCgoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjODRlNzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5IGV4dGVuZHMgTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93U2VsZWN0aW9uKCk7Ci0JCQlzaG93Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlRm9jdXMoKTsKLQkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsCi0JCQkJCQk1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCU1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsKLQkJbW92ZUhhbmRsZS5zZXRCb3JkZXIobnVsbCk7Ci0JCW1vdmVIYW5kbGUuc2V0RHJhZ1RyYWNrZXIobmV3IERyYWdFZGl0UGFydHNUcmFja2VyRXgoZ2V0SG9zdCgpKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1vdmVIYW5kbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4ZDM5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRGZWVkYmFja0JvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kczsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlib3VuZHMgPSAoKExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLmdldFRleHRCb3VuZHMoKTsKLQkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcyA9IGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsKLQkJZ2V0RmVlZGJhY2tMYXllcigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUoYm91bmRzKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0RmlsbChmYWxzZSk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgewotCQlMYWJlbCBzb3VyY2UgPSAoTGFiZWwpIGdldEhvc3RGaWd1cmUoKTsKLQkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7Ci0JCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOwotCQl0YXJnZXQuc2V0Rm9udChzb3VyY2UuZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCkgewotCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQl1cGRhdGVMYWJlbCgoTGFiZWwpIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpLmV4cGFuZCg1LAotCQkJCQkJNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb2N1c0ZlZWRiYWNrKCkgewotCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRmVlZGJhY2soKSB7Ci0JCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0xpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjU4Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0xpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjMTE0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0U2VtYW50aWNIb3N0KCkgewotCQlyZXR1cm4gaG9zdCgpLmdldE1vZGVsKCkgIT0gbnVsbCA/IHN1cGVyLmdldFNlbWFudGljSG9zdCgpIDogbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE9uQWN0aXZhdGUoKSB7CQkKLQkJc3VwZXIucmVmcmVzaE9uQWN0aXZhdGUoKTsKLQkJCi0JCUVkaXRQYXJ0IGVwID0gZ2V0SG9zdCgpOwotCQlpZihlcCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkgewotCQkJRGlhZ3JhbUVkaXRvclV0aWwuaW5pdGlhbGl6ZU9uQWN0aXZhdGUoKERpYWdyYW1FZGl0UGFydCkgZXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoTm9kZUNvbnRhaW5lcikgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQluZXh0VmFsdWUpOwotCQkJaWYgKFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgKHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCkgfHwgdmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ29ubmVjdGlvbnNMaXN0KCkgewotCQlMaXN0IGNvbm5lY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGRpYWdyYW0gPSAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgKChWaWV3KSBnZXRIb3N0KCkKLQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQljb25uZWN0aW9ucy5hZGRBbGwobm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjb25uZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2VFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gKChMaW5rKSByZWxhdGlvbnNoaXApLmdldFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFRhcmdldEVsZW1lbnQoRU9iamVjdCByZWxhdGlvbnNoaXApIHsKLQkJaWYgKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIExpbmspIHsKLQkJCXJldHVybiAoKExpbmspIHJlbGF0aW9uc2hpcCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oRWRnZSBjb25uZWN0b3IsCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXJldHVybiBzdXBlci5zaG91bGRJbmNsdWRlQ29ubmVjdGlvbihjb25uZWN0b3IsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgewotCQlMaXN0IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ2hpbGRyZW4oKSk7Ci0JCUxpc3QgY3JlYXRlZENvbm5lY3Rpb25WaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0Nvbm5lY3Rpb25zKCkpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoQ29ubmVjdGlvbnMoKSk7Ci0KLQkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7Ci0JCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXIKLQkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7Ci0JCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsKLQkJfQotCi0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwoY3JlYXRlZENvbm5lY3Rpb25WaWV3cyk7Ci0JCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gbXlMaW5rRGVzY3JpcHRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIG15RU9iamVjdDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCQl0cnkgewotCQkJY29sbGVjdEFsbExpbmtzKGdldERpYWdyYW0oKSk7Ci0JCQlDb2xsZWN0aW9uIGV4aXN0aW5nTGlua3MgPSBuZXcgTGlua2VkTGlzdChnZXREaWFncmFtKCkuZ2V0RWRnZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGRpYWdyYW1MaW5rcyA9IGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKTsgZGlhZ3JhbUxpbmtzCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRnZSBuZXh0RGlhZ3JhbUxpbmsgPSAoRWRnZSkgZGlhZ3JhbUxpbmtzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rT2JqZWN0ID0gbmV4dERpYWdyYW1MaW5rLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rU3JjID0gbmV4dERpYWdyYW1MaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtEc3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaW50IGRpYWdyYW1MaW5rVmlzdWFsSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFZpc3VhbElEKG5leHREaWFncmFtTGluayk7Ci0JCQkJZm9yIChJdGVyYXRvciBtb2RlbExpbmtEZXNjcmlwdG9ycyA9IG15TGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkuaXRlcmF0b3IoKTsgbW9kZWxMaW5rRGVzY3JpcHRvcnMuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIG1vZGVsTGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKGRpYWdyYW1MaW5rT2JqZWN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCS5nZXRMaW5rRWxlbWVudCgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtTcmMgPT0gbmV4dExpbmtEZXNjcmlwdG9yLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtEc3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0RGVzdGluYXRpb24oKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rVmlzdWFsSUQgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0VmlzdWFsSUQoKSkgewotCQkJCQkJZGlhZ3JhbUxpbmtzLnJlbW92ZSgpOwotCQkJCQkJbW9kZWxMaW5rRGVzY3JpcHRvcnMucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkZWxldGVWaWV3cyhleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb25zKG15TGlua0Rlc2NyaXB0b3JzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW15TGlua0Rlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQlteUVPYmplY3QyVmlld01hcC5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0QWxsTGlua3MoVmlldyB2aWV3KSB7Ci0JCUVPYmplY3QgbW9kZWxFbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCWludCBkaWFncmFtRWxlbWVudFZpc3VhbElEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAoZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCkgewotCQljYXNlIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQlteUVPYmplY3QyVmlld01hcC5wdXQobW9kZWxFbGVtZW50LCB2aWV3KTsKLQkJCXN0b3JlTGlua3MobW9kZWxFbGVtZW50LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWRlZmF1bHQ6IHsKLQkJfQotCQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbiA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaGlsZHJlbgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkcmVuLm5leHQoKTsKLQkJCQljb2xsZWN0QWxsTGlua3MoY2hpbGRWaWV3KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gY3JlYXRlQ29ubmVjdGlvbnMoQ29sbGVjdGlvbiBsaW5rRGVzY3JpcHRvcnMpIHsKLQkJaWYgKGxpbmtEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUxpc3QgYWRhcHRlcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yID0gbGlua0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWZpbmFsIExpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkJLm5leHQoKTsKLQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXRTb3VyY2UoKSk7Ci0JCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0RGVzdGluYXRpb24oKSk7Ci0JCQlpZiAoc291cmNlRWRpdFBhcnQgPT0gbnVsbCB8fCB0YXJnZXRFZGl0UGFydCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvcigKLQkJCQkJbmV4dExpbmtEZXNjcmlwdG9yLmdldFNlbWFudGljQWRhcHRlcigpLCBudWxsLAotCQkJCQlWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLCAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOwotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0IGNjciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QoCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9TVEFSVCk7Ci0JCQljY3Iuc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJc291cmNlRWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJY2NyLnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fRU5EKTsKLQkJCUNvbW1hbmQgY21kID0gdGFyZ2V0RWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQlleGVjdXRlQ29tbWFuZChjbWQpOwotCQkJCUlBZGFwdGFibGUgdmlld0FkYXB0ZXIgPSAoSUFkYXB0YWJsZSkgY2NyLmdldE5ld09iamVjdCgpOwotCQkJCWlmICh2aWV3QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXJzLmFkZCh2aWV3QWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBnZXRFZGl0UGFydEZvcihFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgbXlFT2JqZWN0MlZpZXdNYXAuZ2V0KG1vZGVsRWxlbWVudCk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQl2aWV3KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MgPSBjb250YWluZXIuZUNsYXNzKCk7Ci0JCXN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcywgZGlhZ3JhbSk7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19MaW5rXzMwMDEoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0xpbmtfMzAwMShFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLmlzU3VwZXJUeXBlT2YoY29udGFpbmVyTWV0YWNsYXNzKSkgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGUpIGNvbnRhaW5lcikuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JCQkJCS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbmV4dFZhbHVlID0gKChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpKTsKLQkJCQlpbnQgbGlua1ZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKG5leHRWYWx1ZSk7Ci0JCQkJaWYgKExpbmtFZGl0UGFydC5WSVNVQUxfSUQgPT0gbGlua1ZJRCkgewotCQkJCQlPYmplY3Qgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKExpbmspIG5leHRWYWx1ZSkKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCUVPYmplY3QgZHN0ID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKExpbmspIG5leHRWYWx1ZSkKLQkJCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQkJaWYgKHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCUVPYmplY3Qgc3JjID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJCW15TGlua0Rlc2NyaXB0b3JzLmFkZChuZXcgTGlua0Rlc2NyaXB0b3Ioc3JjLCBkc3QsCi0JCQkJCQkJCQluZXh0VmFsdWUsIERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxLAotCQkJCQkJCQkJbGlua1ZJRCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MsIERpYWdyYW0gZGlhZ3JhbSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIExpbmtEZXNjcmlwdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15U291cmNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlEZXN0aW5hdGlvbjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15TGlua0VsZW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgaW50IG15VmlzdWFsSUQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSUFkYXB0YWJsZSBteVNlbWFudGljQWRhcHRlcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUVPYmplY3QgbGlua0VsZW1lbnQsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbGlua0VsZW1lbnQ7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBFT2JqZWN0QWRhcHRlcihsaW5rRWxlbWVudCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbnVsbDsKLQkJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsKLQkJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLCBpbnQgbGlua1ZJRCkgewotCQkJbXlTb3VyY2UgPSBzb3VyY2U7Ci0JCQlteURlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JCQlteVZpc3VhbElEID0gbGlua1ZJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gbXlTb3VyY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RGVzdGluYXRpb24oKSB7Ci0JCQlyZXR1cm4gbXlEZXN0aW5hdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRMaW5rRWxlbWVudCgpIHsKLQkJCXJldHVybiBteUxpbmtFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoKSB7Ci0JCQlyZXR1cm4gbXlWaXN1YWxJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgSUFkYXB0YWJsZSBnZXRTZW1hbnRpY0FkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gbXlTZW1hbnRpY0FkYXB0ZXI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MGRlNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzLldvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZHMuRHVwbGljYXRlRU9iamVjdHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdE5vZGVfMTAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBXb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCS8vCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJLy8JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJLy8JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcmVxKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQgZXh0ZW5kcwotCQkJRHVwbGljYXRlRU9iamVjdHNDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCgKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJCUR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4sIHJlcS5nZXRMYWJlbCgpLCByZXEKLQkJCQkJLmdldEVsZW1lbnRzVG9CZUR1cGxpY2F0ZWQoKSwgcmVxCi0JCQkJCS5nZXRBbGxEdXBsaWNhdGVkRWxlbWVudHNNYXAoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkYTAwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkMTdkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyNzQ2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kcy5MaW5rUmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDZiNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ3JlYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZSBkaWFncmFtTW9kZWxGaWxlUGFnZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRpYWdyYW07Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IHRydWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gd29ya2JlbmNoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgUmVzb3VyY2UgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSB7Ci0JCXJldHVybiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoCi0JCQlib29sZWFuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKSB7Ci0JCXRoaXMub3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlID0gbmV3IERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UoCi0JCQkJIkRpYWdyYW1Nb2RlbEZpbGUiLCBnZXRTZWxlY3Rpb24oKSwgIndwZGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlLnNldFRpdGxlKCJDcmVhdGUgV1BERCBEaWFncmFtIik7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlCi0JCQkJLnNldERlc2NyaXB0aW9uKCJTZWxlY3QgZmlsZSB0aGF0IHdpbGwgY29udGFpbiBkaWFncmFtIGFuZCBkb21haW4gbW9kZWxzLiIpOwotCQlhZGRQYWdlKGRpYWdyYW1Nb2RlbEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihudWxsKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWRpYWdyYW0gPSBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCWRpYWdyYW1Nb2RlbEZpbGVQYWdlLmdldFVSSSgpLCBtb25pdG9yKTsKLQkJCQlpZiAoaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpICYmIGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtKGRpYWdyYW0pOwotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJIkVycm9yIG9wZW5pbmcgZGlhZ3JhbSBlZGl0b3IiLCBudWxsLCBlCi0JCQkJCQkJCQkJLmdldFN0YXR1cygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkiQ3JlYXRpb24gUHJvYmxlbXMiLCBudWxsLCAoKENvcmVFeGNlcHRpb24pIGUKLQkJCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpKS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBjcmVhdGluZyBkaWFncmFtIiwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZSgiTmV3IFdQREQgRGlhZ3JhbSIpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoImljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjFmNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvcldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVFeHRlbnNpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZmlsZUV4dGVuc2lvbikgewotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJdGhpcy5maWxlRXh0ZW5zaW9uID0gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBjcmVhdGUgZmlsZXMgd2l0aCB0aGlzIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBmaWxlRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGdldEZpbGVQYXRoKCkudG9TdHJpbmcoKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0RmlsZVBhdGgoKSB7Ci0JCUlQYXRoIHBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCXBhdGggPSBwYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCXNldEZpbGVOYW1lKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5nZXRVbmlxdWVGaWxlTmFtZSgKLQkJCQlnZXRDb250YWluZXJGdWxsUGF0aCgpLCBnZXRGaWxlTmFtZSgpLCBnZXRFeHRlbnNpb24oKSkpOwotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbAotCQkJCSYmICFnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi4iICsgZXh0ZW5zaW9uKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKAotCQkJCQkiRmlsZSBuYW1lIHNob3VsZCBoYXZlICcnezB9JycgZXh0ZW5zaW9uLiIsIGV4dGVuc2lvbikpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDIyZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGl0b3JDbGFzcygpIHsKLQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySWQoKSB7Ci0JCXJldHVybiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yLklEOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkYjAwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU1GQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBvdXJTYXZlT3B0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChvdXJTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvdXJTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwKLQkJCQkJUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOwotCQl9Ci0JCXJldHVybiBvdXJTYXZlT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5EaWFncmFtKFJlc291cmNlIGRpYWdyYW0pCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gRWRpdFVJVXRpbC5vcGVuRWRpdG9yKChFT2JqZWN0KSBkaWFncmFtLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWZpbGUuc2V0Q2hhcnNldCgiVVRGLTgiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZmlsZSAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUZpbGVOYW1lKElQYXRoIGNvbnRhaW5lckZ1bGxQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWlmIChjb250YWluZXJGdWxsUGF0aCA9PSBudWxsKSB7Ci0JCQljb250YWluZXJGdWxsUGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsIHx8IGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmaWxlTmFtZSA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmICFleHRlbnNpb24uZXF1YWxzKGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQl9Ci0JCWV4dGVuc2lvbiA9IGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJZmlsZU5hbWUgPSBmaWxlUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJaW50IGkgPSAxOwotCQl3aGlsZSAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMoZmlsZVBhdGgpKSB7Ci0JCQlpKys7Ci0JCQlmaWxlUGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSArIGkpOwotCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgd2l6YXJkIGluIGEgZGlhbG9nLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuV2l6YXJkKFNoZWxsIHNoZWxsLCBXaXphcmQgd2l6YXJkLCBTdHJpbmcgc2V0dGluZ3NLZXkpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHBsdWdpbkRpYWxvZ1NldHRpbmdzID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3aXphcmREaWFsb2dTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQlpZiAod2l6YXJkRGlhbG9nU2V0dGluZ3MgPT0gbnVsbCkgewotCQkJd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbihzZXR0aW5nc0tleSk7Ci0JCX0KLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZERpYWxvZ1NldHRpbmdzKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZShNYXRoLm1heCg1MDAsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQk1MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlRGlhZ3JhbShVUkkgZGlhZ3JhbVVSSSwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2ssIDMpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbVVSSSk7Ci0JCWZpbmFsIFN0cmluZyBkaWFncmFtTmFtZSA9IGRpYWdyYW1VUkkubGFzdFNlZ21lbnQoKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwKLQkJCQlNZXNzYWdlcy5EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBtb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOwotCQkJCWF0dGFjaE1vZGVsVG9SZXNvdXJjZShtb2RlbCwgZGlhZ3JhbVJlc291cmNlKTsKLQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsCi0JCQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCWRpYWdyYW0uc2V0TmFtZShkaWFncmFtTmFtZSk7Ci0JCQkJCWRpYWdyYW0uc2V0RWxlbWVudChtb2RlbCk7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQotCQkJCQlkaWFncmFtUmVzb3VyY2UKLQkJCQkJCQkuc2F2ZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCi0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQkiVW5hYmxlIHRvIHN0b3JlIG1vZGVsIGFuZCBkaWFncmFtIHJlc291cmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJc2V0Q2hhcnNldChXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpKTsKLQkJcmV0dXJuIGRpYWdyYW1SZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgZG9tYWluIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGNhbnZhcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsKLQkJcmV0dXJuIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIFN0b3JlIG1vZGVsIGVsZW1lbnQgaW4gdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYXR0YWNoTW9kZWxUb1Jlc291cmNlKAotCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBtb2RlbCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0RWxlbWVudHNJbkRpYWdyYW0oCi0JCQlJRGlhZ3JhbVdvcmtiZW5jaFBhcnQgZGlhZ3JhbVBhcnQsIExpc3QvKkVkaXRQYXJ0Ki9lZGl0UGFydHMpIHsKLQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmRlc2VsZWN0QWxsKCk7Ci0KLQkJRWRpdFBhcnQgZmlyc3RQcmltYXJ5ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmFwcGVuZFNlbGVjdGlvbihuZXh0UGFydCk7Ci0JCQlpZiAoZmlyc3RQcmltYXJ5ID09IG51bGwgJiYgbmV4dFBhcnQgaW5zdGFuY2VvZiBJUHJpbWFyeUVkaXRQYXJ0KSB7Ci0JCQkJZmlyc3RQcmltYXJ5ID0gbmV4dFBhcnQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWVkaXRQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5yZXZlYWwoCi0JCQkJCWZpcnN0UHJpbWFyeSAhPSBudWxsID8gZmlyc3RQcmltYXJ5IDogKEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCQkuZ2V0KDApKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbVBhcnQsCi0JCQlFT2JqZWN0IGVsZW1lbnQsIExpc3QgZWRpdFBhcnRDb2xsZWN0b3IpIHsKLQkJSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBkaWFncmFtUGFydAotCQkJCS5nZXRWaWV3ZXIoKTsKLQkJZmluYWwgaW50IGludGlhbE51bU9mRWRpdFBhcnRzID0gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlldykgeyAvLyBzdXBwb3J0IG5vdGF0aW9uIGVsZW1lbnQgbG9va3VwCi0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJCWVsZW1lbnQpOwotCQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQoZWRpdFBhcnQpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRJRCA9IEVNRkNvcmVVdGlsLmdldFByb3h5SUQoZWxlbWVudCk7Ci0JCUxpc3QgYXNzb2NpYXRlZFBhcnRzID0gdmlld2VyLmZpbmRFZGl0UGFydHNGb3JFbGVtZW50KGVsZW1lbnRJRCwKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQkvLyBwZXJmb3JtIHRoZSBwb3NzaWJsZSBoaWVyYXJjaHkgZGlzam9pbnQgLT4gdGFrZSB0aGUgdG9wLW1vc3QgcGFydHMgb25seQotCQlmb3IgKEl0ZXJhdG9yIGVkaXRQYXJ0SXQgPSBhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKTsgZWRpdFBhcnRJdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRJdC5uZXh0KCk7Ci0JCQlFZGl0UGFydCBwYXJlbnRQYXJ0ID0gbmV4dFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl3aGlsZSAocGFyZW50UGFydCAhPSBudWxsICYmICFhc3NvY2lhdGVkUGFydHMuY29udGFpbnMocGFyZW50UGFydCkpIHsKLQkJCQlwYXJlbnRQYXJ0ID0gcGFyZW50UGFydC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCWlmIChwYXJlbnRQYXJ0ID09IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQobmV4dFBhcnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGludGlhbE51bU9mRWRpdFBhcnRzID09IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSkgewotCQkJaWYgKCFhc3NvY2lhdGVkUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGFzc29jaWF0ZWRQYXJ0cy5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1QYXJ0LCBlbGVtZW50Ci0JCQkJCQkJLmVDb250YWluZXIoKSwgZWRpdFBhcnRDb2xsZWN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpIC0gaW50aWFsTnVtT2ZFZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmlldyBmaW5kVmlldyhEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0LAotCQkJRU9iamVjdCB0YXJnZXRFbGVtZW50LCBMYXp5RWxlbWVudDJWaWV3TWFwIGxhenlFbGVtZW50MlZpZXdNYXApIHsKLQkJYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsVVJJID0gZmFsc2U7Ci0JCWlmICh0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCWhhc1N0cnVjdHVyYWxVUkkgPSAoKFhNTFJlc291cmNlKSB0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0SUQodGFyZ2V0RWxlbWVudCkgPT0gbnVsbDsKLQkJfQotCi0JCVZpZXcgdmlldyA9IG51bGw7Ci0JCWlmIChoYXNTdHJ1Y3R1cmFsVVJJCi0JCQkJJiYgIWxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuaXNFbXB0eSgpKSB7Ci0JCQl2aWV3ID0gKFZpZXcpIGxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuZ2V0KAotCQkJCQl0YXJnZXRFbGVtZW50KTsKLQkJfSBlbHNlIGlmIChmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1FZGl0UGFydCwgdGFyZ2V0RWxlbWVudCwKLQkJCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyKSA+IDApIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyCi0JCQkJCS5nZXQoMCk7Ci0JCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyLmNsZWFyKCk7Ci0JCQl2aWV3ID0gZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcgPyAoVmlldykgZWRpdFBhcnQKLQkJCQkJLmdldE1vZGVsKCkgOiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICh2aWV3ID09IG51bGwpID8gZGlhZ3JhbUVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkgOiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExhenlFbGVtZW50MlZpZXdNYXAgewotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudDJWaWV3TWFwOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFZpZXcgc2NvcGU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgU2V0IGVsZW1lbnRTZXQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBMaXN0IGVkaXRQYXJ0VG1wSG9sZGVyID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGF6eUVsZW1lbnQyVmlld01hcChWaWV3IHNjb3BlLCBTZXQgZWxlbWVudHMpIHsKLQkJCXRoaXMuc2NvcGUgPSBzY29wZTsKLQkJCXRoaXMuZWxlbWVudFNldCA9IGVsZW1lbnRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBNYXAgZ2V0RWxlbWVudDJWaWV3TWFwKCkgewotCQkJaWYgKGVsZW1lbnQyVmlld01hcCA9PSBudWxsKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkvLyBtYXAgcG9zc2libGUgbm90YXRpb24gZWxlbWVudHMgdG8gaXRzZWxmIGFzIHRoZXNlIGNhbid0IGJlIGZvdW5kIGJ5IHZpZXcuZ2V0RWxlbWVudCgpCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJCVZpZXcgdmlldyA9IChWaWV3KSBlbGVtZW50OwotCQkJCQkJaWYgKHZpZXcuZ2V0RGlhZ3JhbSgpID09IHNjb3BlLmdldERpYWdyYW0oKSkgewotCQkJCQkJCWVsZW1lbnQyVmlld01hcC5wdXQoZWxlbWVudCwgZWxlbWVudCk7IC8vIHRha2Ugb25seSB0aG9zZSB0aGF0IHBhcnQgb2Ygb3VyIGRpYWdyYW0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKHNjb3BlLCBlbGVtZW50MlZpZXdNYXAsIGVsZW1lbnRTZXQpOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgTWFwIGJ1aWxkRWxlbWVudDJWaWV3TWFwKFZpZXcgcGFyZW50VmlldywgTWFwIGVsZW1lbnQyVmlld01hcCwKLQkJCQlTZXQgZWxlbWVudHMpIHsKLQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCi0JCQlpZiAocGFyZW50Vmlldy5pc1NldEVsZW1lbnQoKQotCQkJCQkmJiAhZWxlbWVudDJWaWV3TWFwLmNvbnRhaW5zS2V5KHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpKQotCQkJCQkmJiBlbGVtZW50cy5jb250YWlucyhwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkpIHsKLQkJCQllbGVtZW50MlZpZXdNYXAucHV0KHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpLCBwYXJlbnRWaWV3KTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQl9IC8vTGF6eUVsZW1lbnQyVmlld01hcAkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTg3OTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JGaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvciBleHRlbmRzIElERUVkaXRvckZpbGVDcmVhdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yIElOU1RBTkNFID0gbmV3IERpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1GaWxlQ3JlYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICIud3BkZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRmMTU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMKLQkJRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlzdXBlci5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlEaWFncmFtQ29yZVV0aWwuaGlkZUNvbm5lY3Rpb25IYW5kbGVzKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzdjMWI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLkRlbXVsdGlwbGV4aW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLk5vdGlmaWNhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLkVkaXRvclN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC51dGlsLkRpYWdyYW1JT1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEaWFncmFtRG9jdW1lbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCSYmIGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbGVtZW50OwotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGNyZWF0ZURvY3VtZW50KGVkaXRvcklucHV0KTsKLQotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IG5ldyBSZXNvdXJjZVNldEluZm8oZG9jdW1lbnQsIGVkaXRvcklucHV0KTsKLQkJaW5mby5zZXRNb2RpZmljYXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbykpOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCSYmIGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCXNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCXNldHVwRG9jdW1lbnQoZWxlbWVudCwgZG9jdW1lbnQpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZ2l2ZW4gZG9jdW1lbnQgYXMgaXQgd291bGQgYmUgcHJvdmlkZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUKLQkgKiBjb250ZW50IG9mIHRoZSBkb2N1bWVudCBpcyBub3QgY2hhbmdlZC4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgotCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBibHVlLXByaW50IGVsZW1lbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRvIHNldCB1cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gZm9yIHN1YmNsYXNzZXMKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZVNldEluZm8gaW5mbykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCArPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRW1wdHlEb2N1bWVudCgpIHsKLQkJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERpYWdyYW1Eb2N1bWVudCgpOwotCQlkb2N1bWVudC5zZXRFZGl0aW5nRG9tYWluKGNyZWF0ZUVkaXRpbmdEb21haW4oKSk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQllZGl0aW5nRG9tYWluLnNldElEKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLkVkaXRpbmdEb21haW4iKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBOb3RpZmljYXRpb25GaWx0ZXIgZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkuY3JlYXRlTm90aWZpZXJGaWx0ZXIoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKS5hbmQoCi0JCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkJLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcihOb3RpZmljYXRpb24uQUREKSkuYW5kKAotCQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoCi0JCQkJCQkJCVJlc291cmNlU2V0LmNsYXNzLAotCQkJCQkJCQlSZXNvdXJjZVNldC5SRVNPVVJDRV9TRVRfX1JFU09VUkNFUykpOwotCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVyKCkgewotCi0JCQlwcml2YXRlIE5vdGlmaWVyIG15VGFyZ2VyOwotCi0JCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQkJCXJldHVybiBteVRhcmdlcjsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJaWYgKGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCQlPYmplY3QgdmFsdWUgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJCSgoUmVzb3VyY2UpIHZhbHVlKS5zZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQkJCW15VGFyZ2VyID0gbmV3VGFyZ2V0OwotCQkJfQotCi0JCX0pOwotCi0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgZWxlbWVudCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkaWFncmFtRG9jdW1lbnQgPSAoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGRpYWdyYW1Eb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJU3RvcmFnZSBzdG9yYWdlID0gKChGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKTsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IERpYWdyYW1JT1V0aWwubG9hZChkb21haW4sIHN0b3JhZ2UsIHRydWUsCi0JCQkJCWdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWRvY3VtZW50LnNldENvbnRlbnQoZGlhZ3JhbSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlVUkkgdXJpID0gKChVUklFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0VVJJKCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UoCi0JCQkJCQl1cmkudHJpbUZyYWdtZW50KCksIGZhbHNlKTsKLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKAotCQkJCQkJCXVyaS50cmltRnJhZ21lbnQoKSk7Ci0JCQkJfQotCQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcChHTUZSZXNvdXJjZUZhY3RvcnkKLQkJCQkJCQkJLmdldERlZmF1bHRMb2FkT3B0aW9ucygpKTsKLQkJCQkJCS8vIEBzZWUgMTcxMDYwIAotCQkJCQkJLy8gb3B0aW9ucy5wdXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJCXJlc291cmNlLmxvYWQob3B0aW9ucyk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yKTsKLQkJCQl9Ci0JCQkJaWYgKHVyaS5mcmFnbWVudCgpICE9IG51bGwpIHsKLQkJCQkJRU9iamVjdCByb290RWxlbWVudCA9IHJlc291cmNlLmdldEVPYmplY3QodXJpLmZyYWdtZW50KCkpOwotCQkJCQlpZiAocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgcm9vdEVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudCgoRGlhZ3JhbSkgcm9vdEVsZW1lbnQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjcCA9IG51bGw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCXRocm93bkV4Y3AgPSAoQ29yZUV4Y2VwdGlvbikgZTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJCXRocm93bkV4Y3AgPSBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJbXNnICE9IG51bGwgPyBtc2cKLQkJCQkJCQkJCQkJOiBNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yLAotCQkJCQkJCQkJZSkpOwotCQkJCX0KLQkJCQl0aHJvdyB0aHJvd25FeGNwOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RGlhZ3JhbURvY3VtZW50KGVsZW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpOwotCQkJaWYgKGRpYWdyYW1SZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSk7Ci0JCQkJcmV0dXJuIGZpbGUgPT0gbnVsbCB8fCBmaWxlLmdldExvY2F0aW9uKCkgPT0gbnVsbAotCQkJCQkJfHwgIWZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5leGlzdHMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEZWxldGVkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvIGdldFJlc291cmNlU2V0SW5mbyhPYmplY3QgZWRpdG9ySW5wdXQpIHsKLQkJcmV0dXJuIChSZXNvdXJjZVNldEluZm8pIHN1cGVyLmdldEVsZW1lbnRJbmZvKGVkaXRvcklucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvIGluc3RhbmNlb2YgUmVzb3VyY2VTZXRJbmZvKSB7Ci0JCQlSZXNvdXJjZVNldEluZm8gcmVzb3VyY2VTZXRJbmZvID0gKFJlc291cmNlU2V0SW5mbykgaW5mbzsKLQkJCXJlc291cmNlU2V0SW5mby5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUVsZW1lbnRJbmZvKGVsZW1lbnQsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlU3RhdGUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb21wdXRhdGlvbkNvbnRleHQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzMlZhbGlkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJZmlsZXMyVmFsaWRhdGUuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoCi0JCQkJCShJRmlsZVtdKSBmaWxlczJWYWxpZGF0ZS50b0FycmF5KG5ldyBJRmlsZVtmaWxlczJWYWxpZGF0ZQotCQkJCQkJCS5zaXplKCldKSwgY29tcHV0YXRpb25Db250ZXh0KTsKLQkJfQotCi0JCXN1cGVyLmRvVmFsaWRhdGVTdGF0ZShlbGVtZW50LCBjb21wdXRhdGlvbkNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsKLQkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mby5pc1JlYWRPbmx5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIWlzU3RhdGVWYWxpZGF0ZWQoZWxlbWVudCkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsKLQkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mby5pc01vZGlmaWFibGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNNb2RpZmlhYmxlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJaW5mby5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJaW5mby5zZXRNb2RpZmlhYmxlKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWluZm8uc2V0UmVhZE9ubHkoZmFsc2UpOwotCQkJaW5mby5zZXRNb2RpZmlhYmxlKHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVXBkYXRlU3RhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaW5mby5zZXRVcGRhdGVDYWNoZSh0cnVlKTsKLQkJfQotCQlzdXBlci5kb1VwZGF0ZVN0YXRlQ2FjaGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5mby5pc1N5bmNocm9uaXplZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1N5bmNocm9uaXplZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRSZXNldFJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJCQkubW9kaWZ5UnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChjb21wdXRlU2NoZWR1bGluZ1J1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U3luY2hyb25pemVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLnJlZnJlc2hSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFZhbGlkYXRlU3RhdGVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJZmlsZXMuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkudmFsaWRhdGVFZGl0UnVsZSgKLQkJCQkJCQkoSUZpbGVbXSkgZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBjb21wdXRlU2NoZWR1bGluZ1J1bGUoSVJlc291cmNlIHRvQ3JlYXRlT3JNb2RpZnkpIHsKLQkJaWYgKHRvQ3JlYXRlT3JNb2RpZnkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkubW9kaWZ5UnVsZSgKLQkJCQkJdG9DcmVhdGVPck1vZGlmeSk7Ci0KLQkJSVJlc291cmNlIHBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnk7Ci0JCWRvIHsKLQkJCS8qCi0JCQkgKiBYWFggVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MDEKLQkJCSAqIElSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUgc2hvdWxkIGl0ZXJhdGUgdGhlIGhpZXJhcmNoeQotCQkJICogaXRzZWxmLgotCQkJICovCi0JCQl0b0NyZWF0ZU9yTW9kaWZ5ID0gcGFyZW50OwotCQkJcGFyZW50ID0gdG9DcmVhdGVPck1vZGlmeS5nZXRQYXJlbnQoKTsKLQkJfSB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5leGlzdHMoKSk7Ci0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmNyZWF0ZVJ1bGUoCi0JCQkJdG9DcmVhdGVPck1vZGlmeSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQloYW5kbGVFbGVtZW50Q2hhbmdlZChpbmZvLCBuZXh0UmVzb3VyY2UsIG1vbml0b3IpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmRvU3luY2hyb25pemUoZWxlbWVudCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZURvY3VtZW50KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGVsZW1lbnQsCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoIW92ZXJ3cml0ZSAmJiAhaW5mby5pc1N5bmNocm9uaXplZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3IsCi0JCQkJCQkJCW51bGwpKTsKLQkJCX0KLQkJCWluZm8uc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQlMaXN0IHJlc291cmNlcyA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2ssCi0JCQkJCQlyZXNvdXJjZXMuc2l6ZSgpICsgMSk7IC8vIlNhdmluZyBkaWFncmFtIgotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJbW9uaXRvcgotCQkJCQkJCS5zZXRUYXNrTmFtZShOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaywKLQkJCQkJCQkJCQkJbmV4dFJlc291cmNlLmdldFVSSSgpKSk7Ci0JCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQluZXh0UmVzb3VyY2Uuc2F2ZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCQlFZGl0b3JTdGF0dXNDb2Rlcy5SRVNPVVJDRV9GQUlMVVJFLCBlCi0JCQkJCQkJCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHgpIHsKLQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCXRocm93IHg7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluZm8uc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mbyBpbmZvLAotCQkJUmVzb3VyY2UgY2hhbmdlZFJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGNoYW5nZWRSZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQsCi0JCQkJCQkJCWV4KTsKLQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLkZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZAotCQkJfQotCQl9Ci0JCWNoYW5nZWRSZXNvdXJjZS51bmxvYWQoKTsKLQotCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7Ci0JCWluZm8uZlN0YXR1cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzZXREb2N1bWVudENvbnRlbnQoaW5mby5mRG9jdW1lbnQsIGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaW5mby5mU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlpZiAoIWluZm8uZkNhbkJlU2F2ZWQpIHsKLQkJCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJfQotCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7Ci0JCWZpcmVFbGVtZW50Q29udGVudFJlcGxhY2VkKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRNb3ZlZChJRWRpdG9ySW5wdXQgaW5wdXQsIFVSSSB1cmkpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZSBuZXdGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKAotCQkJCQluZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ld0ZpbGUgPT0gbnVsbCA/IG51bGwKLQkJCQkJOiBuZXcgRmlsZUVkaXRvcklucHV0KG5ld0ZpbGUpKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUT0RPOiBhcHBlbmQgc3VmZml4IHRvIHRoZSBVUkkhICh1c2UgZGlhZ3JhbSBhcyBhIHBhcmFtZXRlcikKLQkJZmlyZUVsZW1lbnRNb3ZlZChpbnB1dCwgbmV3IFVSSUVkaXRvcklucHV0KHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUVkaXRvcklucHV0IGNyZWF0ZUlucHV0V2l0aEVkaXRpbmdEb21haW4oSUVkaXRvcklucHV0IGVkaXRvcklucHV0LAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXJldHVybiBlZGl0b3JJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElEaWFncmFtRG9jdW1lbnQgZ2V0RGlhZ3JhbURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoSURpYWdyYW1Eb2N1bWVudCkgZG9jOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBnZXRPcGVyYXRpb25SdW5uZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VTZXRJbmZvIGV4dGVuZHMgRWxlbWVudEluZm8gewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGxvbmcgbXlNb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdvcmtzcGFjZVN5bmNocm9uaXplciBteVN5bmNocm9uaXplcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSURpYWdyYW1Eb2N1bWVudCBteURvY3VtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElFZGl0b3JJbnB1dCBteUVkaXRvcklucHV0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVcGRhdGVDYWNoZSA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteU1vZGlmaWFibGUgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15UmVhZE9ubHkgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgbXlSZXNvdXJjZVNldExpc3RlbmVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvKElEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7Ci0JCQlzdXBlcihkb2N1bWVudCk7Ci0JCQlteURvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQlteUVkaXRvcklucHV0ID0gZWRpdG9ySW5wdXQ7Ci0JCQlzdGFydFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlteVJlc291cmNlU2V0TGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG15UmVzb3VyY2VTZXRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gbXlNb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25TdGFtcChsb25nIG1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQlteU1vZGlmaWNhdGlvblN0YW1wID0gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQkJcmV0dXJuIG15RG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dCgpIHsKLQkJCXJldHVybiBteUVkaXRvcklucHV0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCWdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKG15UmVzb3VyY2VTZXRMaXN0ZW5lcik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCQlyZXR1cm4gbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5zaXplKCkgPT0gMDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVblN5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCB2b2lkIHN0b3BSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyLmRpc3Bvc2UoKTsKLQkJCW15U3luY2hyb25pemVyID0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydFJlc291cmNlTGlzdGVuaW5nKCkgewotCQkJbXlTeW5jaHJvbml6ZXIgPSBuZXcgV29ya3NwYWNlU3luY2hyb25pemVyKG15RG9jdW1lbnQKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgbmV3IFN5bmNocm9uaXplckRlbGVnYXRlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlQ2FjaGUoKSB7Ci0JCQlyZXR1cm4gbXlVcGRhdGVDYWNoZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVDYWNoZShib29sZWFuIHVwZGF0ZSkgewotCQkJbXlVcGRhdGVDYWNoZSA9IHVwZGF0ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0JCQlyZXR1cm4gbXlNb2RpZmlhYmxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWFibGUoYm9vbGVhbiBtb2RpZmlhYmxlKSB7Ci0JCQlteU1vZGlmaWFibGUgPSBtb2RpZmlhYmxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gbXlSZWFkT25seTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCQlteVJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzCi0JCQkJV29ya3NwYWNlU3luY2hyb25pemVyLkRlbGVnYXRlIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZUNoYW5nZWQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMsIHJlc291cmNlLAotCQkJCQkJCQludWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VEZWxldGVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWZpcmVFbGVtZW50RGVsZXRlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlTW92ZWQoUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQkJCWZpbmFsIFVSSSBuZXdVUkkpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG15RG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpID09IHJlc291cmNlKSB7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaGFuZGxlRWxlbWVudE1vdmVkKFJlc291cmNlU2V0SW5mby50aGlzCi0JCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSwgbmV3VVJJKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaGFuZGxlUmVzb3VyY2VEZWxldGVkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lciBleHRlbmRzIEVDb250ZW50QWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm90aWZpY2F0aW9uRmlsdGVyIG15TW9kaWZpZWRGaWx0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUmVzb3VyY2VTZXRJbmZvIG15SW5mbzsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsKLQkJCW15SW5mbyA9IGluZm87Ci0JCQlteU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcigKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCkub3IoCi0JCQkJCU5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLlVOU0VUKSkuYW5kKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRmVhdHVyZUZpbHRlcihSZXNvdXJjZS5jbGFzcywKLQkJCQkJCQlSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTU9ESUZJRUQpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlU2V0KSB7Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQkJaWYgKCFub3RpZmljYXRpb24uaXNUb3VjaCgpCi0JCQkJCSYmIG15TW9kaWZpZWRGaWx0ZXIubWF0Y2hlcyhub3RpZmljYXRpb24pKSB7Ci0JCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IG15SW5mby5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCkKLQkJCQkJCQkJJiYgIW1vZGlmaWVkOykgewotCQkJCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCQltb2RpZmllZCA9IG5leHRSZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYm9vbGVhbiBkaXJ0eVN0YXRlQ2hhbmdlZCA9IGZhbHNlOwotCQkJCQkJc3luY2hyb25pemVkIChteUluZm8pIHsKLQkJCQkJCQlpZiAobW9kaWZpZWQgIT0gbXlJbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQkJCW15SW5mby5mQ2FuQmVTYXZlZCA9IG1vZGlmaWVkOwotCQkJCQkJCQlkaXJ0eVN0YXRlQ2hhbmdlZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCQkJCW15SW5mby5zZXRTeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkaXJ0eVN0YXRlQ2hhbmdlZCkgewotCQkJCQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQobXlJbmZvCi0JCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSwgbW9kaWZpZWQpOwotCi0JCQkJCQkJaWYgKCFtb2RpZmllZCkgewotCQkJCQkJCQlteUluZm8KLQkJCQkJCQkJCQkuc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKG15SW5mbykpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiNDk5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVVJJIGRvbWFpbk1vZGVsVVJJOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZG9tYWluTW9kZWxVUkkgPSBudWxsOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA9PSBmYWxzZQotCQkJCXx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQlkb21haW5Nb2RlbFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKQotCQkJCS50b1N0cmluZygpLCB0cnVlKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCUVPYmplY3QgZGlhZ3JhbVJvb3QgPSBudWxsOwotCQl0cnkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShkb21haW5Nb2RlbFVSSSwgdHJ1ZSk7Ci0JCQlkaWFncmFtUm9vdCA9IChFT2JqZWN0KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBkb21haW5Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGRpYWdyYW1Sb290ID09IG51bGwpIHsKLQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJLm9wZW5FcnJvcigKLQkJCQkJCQlnZXRTaGVsbCgpLAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlLAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVdpemFyZCB3aXphcmQgPSBuZXcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkKGRvbWFpbk1vZGVsVVJJLAotCQkJCWRpYWdyYW1Sb290LCBlZGl0aW5nRG9tYWluKTsKLQkJd2l6YXJkCi0JCQkJLnNldFdpbmRvd1RpdGxlKE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGUsCi0JCQkJCQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCkpOwotCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwucnVuV2l6YXJkKGdldFNoZWxsKCksIHdpemFyZCwKLQkJCQkiSW5pdERpYWdyYW1GaWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4Y2ZmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbi5Mb2FkUmVzb3VyY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQgbXlTZWxlY3RlZEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBteVNoZWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJbXlTaGVsbCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlMb2FkUmVzb3VyY2VEaWFsb2cgbG9hZFJlc291cmNlRGlhbG9nID0gbmV3IExvYWRSZXNvdXJjZURpYWxvZyhteVNoZWxsLAotCQkJCW15U2VsZWN0ZWRFbGVtZW50LmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCWxvYWRSZXNvdXJjZURpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCW15U2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJbXlTZWxlY3RlZEVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0KSBzdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gbXlTZWxlY3RlZEVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjA3YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7Ci0JCXRyeSB7Ci0JCQllZGl0b3JJbnB1dCA9IGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZWRpdG9ySW5wdXQuZXF1YWxzKGlucHV0KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQKLQkJCQkmJiBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gKChVUklFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFVSSSgpLmVxdWFscygKLQkJCQkJKChVUklFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVSSSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2VhNTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMudmlldy5DcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gbXlFZGl0aW5nRG9tYWluOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQoVVJJIGRvbWFpbk1vZGVsVVJJLCBFT2JqZWN0IGRpYWdyYW1Sb290LAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlhc3NlcnQgZG9tYWluTW9kZWxVUkkgIT0gbnVsbCA6ICJEb21haW4gbW9kZWwgdXJpIG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnQgZGlhZ3JhbVJvb3QgIT0gbnVsbCA6ICJEb2FncmFtIHJvb3QgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGVkaXRpbmdEb21haW4gIT0gbnVsbCA6ICJFZGl0aW5nIGRvbWFpbiBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlteUZpbGVDcmVhdGlvblBhZ2UgPSBuZXcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZSwKLQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlCi0JCQkJLnNldFRpdGxlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihOTFMuYmluZCgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb24sCi0JCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKSk7Ci0JCUlQYXRoIGZpbGVQYXRoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkb21haW5Nb2RlbFVSSS50cmltRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWlmIChkb21haW5Nb2RlbFVSSS5pc1BsYXRmb3JtUmVzb3VyY2UoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkKLQkJCQkJLnRvUGxhdGZvcm1TdHJpbmcodHJ1ZSkpOwotCQl9IGVsc2UgaWYgKGRvbWFpbk1vZGVsVVJJLmlzRmlsZSgpKSB7Ci0JCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGRvbWFpbk1vZGVsVVJJLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIDogdXNlIHNvbWUgZGVmYXVsdCBwYXRoCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVW5zdXBwb3J0ZWQgVVJJOiAiICsgZG9tYWluTW9kZWxVUkkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKGZpbGVQYXRoKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCS5nZXRVbmlxdWVGaWxlTmFtZShmaWxlUGF0aCwgZmlsZU5hbWUsICJ3cGRkIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSA9IG5ldyBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWUpOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJLnNldFRpdGxlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbik7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2Uuc2V0TW9kZWxFbGVtZW50KGRpYWdyYW1Sb290KTsKLQotCQlteUVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbXlGaWxlQ3JlYXRpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG15RmlsZUNyZWF0aW9uUGFnZSk7Ci0JCWFkZFBhZ2UoZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUlGaWxlIGRpYWdyYW1GaWxlID0gbXlGaWxlQ3JlYXRpb25QYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLnNldENoYXJzZXQoZGlhZ3JhbUZpbGUpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0JCVVSSSBkaWFncmFtTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG15RWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSByZXNvdXJjZVNldAotCQkJCS5jcmVhdGVSZXNvdXJjZShkaWFncmFtTW9kZWxVUkkpOwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQlteUVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZCwKLQkJCQlhZmZlY3RlZEZpbGVzKSB7Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlpbnQgZGlhZ3JhbVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0RGlhZ3JhbVZpc3VhbElEKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkJCQkJLmdldE1vZGVsRWxlbWVudCgpKTsKLQkJCQlpZiAoZGlhZ3JhbVZJRCAhPSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEKSB7Ci0JCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Ci0JCQkJCQkJLm5ld0Vycm9yQ29tbWFuZFJlc3VsdChNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yKTsKLQkJCQl9Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UuZ2V0TW9kZWxFbGVtZW50KCksCi0JCQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCWRpYWdyYW1SZXNvdXJjZS5zYXZlKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtUmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJTYXZlIG9wZXJhdGlvbiBmYWlsZWQgZm9yOiAiICsgZGlhZ3JhbU1vZGVsVVJJLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBvcGVuIGVkaXRvciIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMKLQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJCXN1cGVyKHBhZ2VOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgewotCQkJcmV0dXJuIE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJYm9vbGVhbiByZXN1bHQgPSBWaWV3U2VydmljZS5nZXRJbnN0YW5jZSgpLnByb3ZpZGVzKAotCQkJCQluZXcgQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb24obmV3IEVPYmplY3RBZGFwdGVyKAotCQkJCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSwKLQkJCQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpKTsKLQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQgPyBudWxsCi0JCQkJCTogTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2UpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbVBhbGV0dGVGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbVBhbGV0dGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDg5MzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QYWxldHRlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFBhbGV0dGUoUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3QpIHsKLQkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZU1vZGVsMUdyb3VwKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgIm1vZGVsIiBwYWxldHRlIHRvb2wgZ3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZU1vZGVsMUdyb3VwKCkgewotCQlQYWxldHRlR3JvdXAgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlR3JvdXAoCi0JCQkJTWVzc2FnZXMuTW9kZWwxR3JvdXBfdGl0bGUpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVDb250cm9sRmxvdzFDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxKTsKLQkJTGlua1Rvb2xFbnRyeSBlbnRyeSA9IG5ldyBMaW5rVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLldQRERfUGFsZXR0ZV9jb250cm9sX2Zsb3dfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5XUEREX1BhbGV0dGVfY29udHJvbF9mbG93X2NyZWF0ZV90ZXh0LCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmsoKSkpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yMkNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3ROb2RlXzEwMDEpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0LAotCQkJCSBEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZVRvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCBlbGVtZW50VHlwZXM7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm9kZVRvb2xFbnRyeShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCQlMaXN0IGVsZW1lbnRUeXBlcykgewotCQkJc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBudWxsLCBudWxsKTsKLQkJCXRoaXMuZWxlbWVudFR5cGVzID0gZWxlbWVudFR5cGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCQlUb29sIHRvb2wgPSBuZXcgVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sKGVsZW1lbnRUeXBlcyk7Ci0JCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW5rVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IHJlbGF0aW9uc2hpcFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJTGlzdCByZWxhdGlvbnNoaXBUeXBlcykgewotCQkJc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBudWxsLCBudWxsKTsKLQkJCXRoaXMucmVsYXRpb25zaGlwVHlwZXMgPSByZWxhdGlvbnNoaXBUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sKHJlbGF0aW9uc2hpcFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCXJldHVybiB0b29sOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDk5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIFRoaXMgcmVnaXN0cnkgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZSBvZiB2aXN1YWwgb2JqZWN0IHNob3VsZCBiZQotICogY3JlYXRlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgRGlhZ3JhbSwgTm9kZSwgQ2hpbGROb2RlIG9yIExpbmsgcmVwcmVzZW50ZWQgCi0gKiBieSBhIGRvbWFpbiBtb2RlbCBvYmplY3QuCi0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19LRVkgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJKyAiL2RlYnVnL3Zpc3VhbElEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFZpZXcgdmlldykgewotCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCWlmIChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKHZpZXcKLQkJCQkJLmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRWaXN1YWxJRCh2aWV3LmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZGVsSUQoVmlldyB2aWV3KSB7Ci0JCVZpZXcgZGlhZ3JhbSA9IHZpZXcuZ2V0RGlhZ3JhbSgpOwotCQl3aGlsZSAodmlldyAhPSBkaWFncmFtKSB7Ci0JCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBhbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoIm1vZGVsSUQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsID8gZGlhZ3JhbS5nZXRUeXBlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaXN1YWxJRChTdHJpbmcgdHlwZSkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQodHlwZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oREVCVUdfS0VZKSkpIHsKLQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiVW5hYmxlIHRvIHBhcnNlIHZpZXcgdHlwZSBhcyBhIHZpc3VhbElEIG51bWJlcjogIgkvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKGludCB2aXN1YWxJRCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodmlzdWFsSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXREaWFncmFtVmlzdWFsSUQoZG9tYWluRWxlbWVudCwgZG9tYWluRWxlbWVudE1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXREaWFncmFtVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50LAotCQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpCi0JCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiBpc0RpYWdyYW1Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5KChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSBkb21haW5FbGVtZW50KSkgewotCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJcmV0dXJuIGdldFVucmVjb2duaXplZERpYWdyYW1JRChkb21haW5FbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywgRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXROb2RlVmlzdWFsSUQoY29udGFpbmVyVmlldywgZG9tYWluRWxlbWVudCwKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCVN0cmluZyBjb250YWluZXJNb2RlbElEID0gZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KTsKLQkJaWYgKCFXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaW50IGNvbnRhaW5lclZpc3VhbElEOwotCQlpZiAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJY29udGFpbmVyVmlzdWFsSUQgPSBnZXRWaXN1YWxJRChjb250YWluZXJWaWV3KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChjb250YWluZXJWaWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCWNvbnRhaW5lclZpc3VhbElEID0gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWludCBub2RlVmlzdWFsSUQgPSBzZW1hbnRpY0hpbnQgIT0gbnVsbCA/IGdldFZpc3VhbElEKHNlbWFudGljSGludCkKLQkJCQk6IC0xOwotCQlzd2l0Y2ggKGNvbnRhaW5lclZpc3VhbElEKSB7Ci0JCWNhc2UgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3ROb2RlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Tm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVXb3JrUHJvZHVjdE5vZGVfMTAwMSgoV29ya1Byb2R1Y3ROb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzlDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rXzMwMDFMaW5rTGFiZWxJRChzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKGRvbWFpbkVsZW1lbnQsIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50LAotCQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluaygpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTGlua1dpdGhDbGFzc0xpbmtfMzAwMSgoTGluaykgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQlyZXR1cm4gTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoZG9tYWluRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlhZ3JhbVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzkoCi0JCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVdvcmtQcm9kdWN0Tm9kZV8xMDAxKFdvcmtQcm9kdWN0Tm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3ROb2RlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkTGlua18zMDAxTGlua0xhYmVsSUQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlua1dpdGhDbGFzc0xpbmtfMzAwMShMaW5rIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01lc3NhZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyOTUxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0JLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJtZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JCi0gICAgCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw7Ci0JCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZTsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb247Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZDsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3I7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZWwxR3JvdXBfdGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sRmxvdzFDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sRmxvdzFDcmVhdGlvblRvb2xfZGVzYzsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3IyQ3JlYXRpb25Ub29sX2Rlc2M7Ci0JICAgICAgICAKLSAgICAgICAgCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZE5hbWVfT3BlbkRpYWdyYW07Ci0gICAgCi0gICAgLy9UT0RPOiBwdXQgYWNjZXNzb3IgZmllbGRzIG1hbnVhbGx5CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3N2NlZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIFdpemFyZCBwYWdlIHRoYXQgYWxsb3dzIHRvIHNlbGVjdCBlbGVtZW50IGZyb20gbW9kZWwuCi0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RlZE1vZGVsRWxlbWVudDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyZWVWaWV3ZXIgbW9kZWxWZXdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RlbEVsZW1lbnQoKSB7Ci0JCXJldHVybiBzZWxlY3RlZE1vZGVsRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxFbGVtZW50KEVPYmplY3QgbW9kZWxFbGVtZW50KSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbW9kZWxFbGVtZW50OwotCQlpZiAobW9kZWxWZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQoc2VsZWN0ZWRNb2RlbEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kZWxWZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCX0KLQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBwbGF0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBsYXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBsYXRlLnNldExheW91dChsYXlvdXQpOwotCQlzZXRDb250cm9sKHBsYXRlKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwbGF0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldFNlbGVjdGlvblRpdGxlKCkpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCW1vZGVsVmV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwbGF0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJbW9kZWxWZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJbW9kZWxWZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCW1vZGVsVmV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQl9Ci0JCW1vZGVsVmV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UudGhpcwotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gbW9kZWwgZWxlbWVudCBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJcmV0dXJuICJTZWxlY3QgbW9kZWwgZWxlbWVudDoiOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZlYXR1cmVNYXAuRW50cnkpIHsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKEZlYXR1cmVNYXAuRW50cnkpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IChFT2JqZWN0KSBzZWxlY3RlZEVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIHNwZWNpZmljIHZhbGlkYXRpb24gb2YgdGhlIHNlbGVjdGVkIG1vZGVsIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERJbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUERESW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjQ5YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgV1BEREltYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxDTDE2ID0gImljb25zL2Z1bGwvZWxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETENMMTYgPSAiaWNvbnMvZnVsbC9kbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUT09MMTYgPSAiaWNvbnMvZnVsbC9ldG9vbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVE9PTDE2ID0gImljb25zL2Z1bGwvZHRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfRURJVE9SID0gRVRPT0wxNiArICJXUERERWRpdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9FRElUT1IgPSBEVE9PTDE2Ci0JCQkrICJXUERERWRpdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19FRElUT1IgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9FRElUT1IpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRURJVE9SID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRURJVE9SKTsJCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlMTY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5EaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIERpYWdyYW0gRWRpdG9yIGZvciBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAY3VzdG9tCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEREaWFncmFtRWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotLy8JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VzSGludCgpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlc0hpbnQoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJTGlzdDxJRWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3ROb2RlXzEwMDEpOwotCQlJQWN0aW9uIGFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERSwgCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwCi0JCQkJLCBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG1lbnUuZmluZChBY3Rpb25JZHMuTUVOVV9ESUFHUkFNX0FERCk7Ci0JCWlmKGl0ZW0gIT0gbnVsbCAmJiBpdGVtIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKXsKLQkJCUlNZW51TWFuYWdlciBhZGRNZW51ID0gKElNZW51TWFuYWdlcilpdGVtOwotCQkJaWYoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5zaXplKCkgPT0gMCl7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIG51bGwsIERpYWdyYW1Db25zdGFudHMuRElBR1JBTV9BRERfTUVOVV9HRU5FUkFMX0dST1VQLCAKLQkJCQkJCXRydWUsIHRydWUpOwkKLQkJCQlhZGRUb01lbnUoYWRkTWVudSxEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFLCAKLQkJCQkJCURpYWdyYW1Db25zdGFudHMuRElBR1JBTV9BRERfTUVOVV9HRU5FUkFMX0dST1VQLCB0cnVlLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg7IAotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldFBhcnRJbWFnZSgpIHsKLQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZnVsbC9ldG9vbDE2L1dQRERFZGl0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGdldENyZWF0ZUNvbnRyb2xGbG93UmVxdWVzdCgpewotCQlMaXN0PElFbGVtZW50VHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQlsaXN0LmFkZChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSk7Ci0JCUNyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGNvbm5lY3Rpb25SZXF1ZXN0ID0gCi0JCQluZXcgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QobGlzdCwgZmFsc2UsCi0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb25SZXF1ZXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUEREaWFncmFtRWRpdG9yUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzkxZmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUEREaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV1BERGlhZ3JhbUVkaXRvclBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZmVyZW5jZXNIaW50IERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCA9IG5ldyBQcmVmZXJlbmNlc0hpbnQoCi0JCQlJRCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgV1BERGlhZ3JhbUVkaXRvclBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBteURvY3VtZW50UHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4oKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCVByZWZlcmVuY2VzSGludC5yZWdpc3RlclByZWZlcmVuY2VTdG9yZShESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlhZGFwdGVyRmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXUEREaWFncmFtRWRpdG9yUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhmYWN0b3JpZXMpOwotCQlyZXR1cm4gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhMaXN0IGZhY3RvcmllcykgewotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihPYmplY3QgaXRlbSkgewotCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGl0ZW0sIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCWxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoaXRlbSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihJRCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmVzcGVjdHMgaW1hZ2VzIHJlc2lkaW5nIGluIGFueSBwbHVnLWluLiBJZiBwYXRoIGlzIHJlbGF0aXZlLAotCSAqIHRoZW4gdGhpcyBidW5kbGUgaXMgbG9va2VkIHVwIGZvciB0aGUgaW1hZ2UsIG90aGVyd2lzZSwgZm9yIGFic29sdXRlIAotCSAqIHBhdGgsIGZpcnN0IHNlZ21lbnQgaXMgdGFrZW4gYXMgaWQgb2YgcGx1Zy1pbiB3aXRoIGltYWdlCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gaW1hZ2UsIGVpdGhlciBhYnNvbHV0ZSAod2l0aCBwbHVnLWluIGlkIGFzIGZpcnN0IHNlZ21lbnQpLCBvciByZWxhdGl2ZSBmb3IgYnVuZGxlZCBpbWFnZXMKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZmluZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBJUGF0aCBwID0gbmV3IFBhdGgocGF0aCk7Ci0JCWlmIChwLmlzQWJzb2x1dGUoKSAmJiBwLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihwLnNlZ21lbnQoMCksIHAKLQkJCQkJLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzdHJpbmcgZnJvbSBwbHVnLWluJ3MgcmVzb3VyY2UgYnVuZGxlCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKSwgIiUiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICogQ2xpZW50IGRvIG5vdCBuZWVkIHRvIGRpc3Bvc2UgdGhpcyBpbWFnZS4gSW1hZ2VzIHdpbGwgYmUgZGlzcG9zZWQgYXV0b21hdGljYWxseS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gaW1hZ2UgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0QnVuZGxlZEltYWdlKFN0cmluZyBwYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocGF0aCwgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwYXRoKSk7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZ2V0RG9jdW1lbnRQcm92aWRlcigpIHsKLQkJaWYgKG15RG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteURvY3VtZW50UHJvdmlkZXIgPSBuZXcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gbXlEb2N1bWVudFByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IpIHsKLQkJbG9nRXJyb3IoZXJyb3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJZXJyb3IgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCBlcnJvciwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKGVycm9yLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZ0luZm8obWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlnZXRMb2coKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsIElTdGF0dXMuT0ssCi0JCQkJCQltZXNzYWdlLCB0aHJvd2FibGUpKTsKLQkJZGVidWcobWVzc2FnZSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQlpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOGM1ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMubWFya2VyLk1hcmtlck5hdmlnYXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvciBleHRlbmRzIERpYWdyYW1Eb2N1bWVudEVkaXRvcgotCQlpbXBsZW1lbnRzIElHb3RvTWFya2VyLCBJTWV0aG9kRWRpdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhbGV0dGVSb290IGNyZWF0ZVBhbGV0dGVSb290KFBhbGV0dGVSb290IGV4aXN0aW5nUGFsZXR0ZVJvb3QpIHsKLQkJUGFsZXR0ZVJvb3Qgcm9vdCA9IHN1cGVyLmNyZWF0ZVBhbGV0dGVSb290KGV4aXN0aW5nUGFsZXR0ZVJvb3QpOwotCQluZXcgRGlhZ3JhbVBhbGV0dGVGYWN0b3J5KCkuZmlsbFBhbGV0dGUocm9vdCk7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJc2V0RG9jdW1lbnRQcm92aWRlcihXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldERvY3VtZW50UHJvdmlkZXIoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCU1hcmtlck5hdmlnYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkuZ290b01hcmtlcih0aGlzLCBtYXJrZXIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJcGVyZm9ybVNhdmVBcyhuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNhdmVBcyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlTYXZlQXNEaWFsb2cgZGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhzaGVsbCk7Ci0JCUlGaWxlIG9yaWdpbmFsID0gaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0ID8gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkuZ2V0RmlsZSgpCi0JCQkJOiBudWxsOwotCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbCk7Ci0JCX0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCS8vIGVkaXRvciBoYXMgYmVlbiBwcm9ncmFtbWF0aWNhbGx5IGNsb3NlZCB3aGlsZSB0aGUgZGlhbG9nIHdhcyBvcGVuCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHByb3ZpZGVyLmlzRGVsZXRlZChpbnB1dCkgJiYgb3JpZ2luYWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJIlRoZSBvcmlnaW5hbCBmaWxlICcnezB9JycgaGFzIGJlZW4gZGVsZXRlZC4iLCBvcmlnaW5hbAotCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJZGlhbG9nLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlQYXRoIGZpbGVQYXRoID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJZmluYWwgSUVkaXRvcklucHV0IG5ld0lucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJLy8gQ2hlY2sgaWYgdGhlIGVkaXRvciBpcyBhbHJlYWR5IG9wZW4KLQkJSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgbWF0Y2hpbmdTdHJhdGVneSA9IGdldEVkaXRvckRlc2NyaXB0b3IoKQotCQkJCS5nZXRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXRjaGluZ1N0cmF0ZWd5Lm1hdGNoZXMoZWRpdG9yUmVmc1tpXSwgbmV3SW5wdXQpKSB7Ci0JCQkJTWVzc2FnZURpYWxvZwotCQkJCQkJLm9wZW5XYXJuaW5nKHNoZWxsLCAiUHJvYmxlbSBEdXJpbmcgU2F2ZSBBcy4uLiIsCi0JCQkJCQkJCSJTYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuIFRhcmdldCBmaWxlIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGVkaXRvci4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlwcm92aWRlci5hYm91dFRvQ2hhbmdlKG5ld0lucHV0KTsKLQkJCWdldERvY3VtZW50UHJvdmlkZXIobmV3SW5wdXQpLnNhdmVEb2N1bWVudChwcm9ncmVzc01vbml0b3IsCi0JCQkJCW5ld0lucHV0LAotCQkJCQlnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSksIHRydWUpOwotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB4LmdldFN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuQ0FOQ0VMKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiU2F2ZSBQcm9ibGVtcyIsCi0JCQkJCQkiQ291bGQgbm90IHNhdmUgZmlsZS4iLCB4LmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXByb3ZpZGVyLmNoYW5nZWQobmV3SW5wdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlzZXRJbnB1dChuZXdJbnB1dCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQoIXN1Y2Nlc3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZXNIaW50KCkgewotCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpIHsKLQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnRQcm92aWRlciBnZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsID8gZ2V0RG9jdW1lbnRQcm92aWRlcigpCi0JCQkJLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpIDogbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJcmV0dXJuICgoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjYzYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNzlmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDFlY2Y3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzM2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCURpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdExpbmVTdHlsZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZGUyMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuUHJpbnRpbmdQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByaW50aW5nUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4MTRlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBSdWxlckdyaWRQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUFic3RyYWN0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDJlMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUFic3RyYWN0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuU2V0VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuU2V0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbUFic3RyYWN0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmlld1BhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IHZpZXdQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZWRpdFBhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IGVkaXRQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaWV3UGF0dGVybigpIHsKLQkJcmV0dXJuIHZpZXdQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gdmlld1Byb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld1BhdHRlcm4oU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXRoaXMudmlld1BhdHRlcm4gPSB2aWV3UGF0dGVybjsKLQkJdmlld1Byb2Nlc3NvciA9IGNyZWF0ZVZpZXdQcm9jZXNzb3Iodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVWaWV3UHJvY2Vzc29yKFN0cmluZyB2aWV3UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRQYXR0ZXJuKCkgewotCQlyZXR1cm4gZWRpdFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBlZGl0UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0UGF0dGVybihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJdGhpcy5lZGl0UGF0dGVybiA9IGVkaXRQYXR0ZXJuOwotCQllZGl0UHJvY2Vzc29yID0gY3JlYXRlRWRpdFByb2Nlc3NvcihlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZUVkaXRQcm9jZXNzb3IoU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdChlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbnRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0Vmlld1BhdHRlcm4oKSwKLQkJCQlnZXRWaWV3UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0RWRpdFBhdHRlcm4oKSwKLQkJCQlnZXRFZGl0UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3Nvcik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXJFZGl0U3RhdHVzIGlzVmFsaWRFZGl0U3RyaW5nKElBZGFwdGFibGUgZWxlbWVudCwKLQkJCVN0cmluZyBlZGl0U3RyaW5nKSB7Ci0JCVBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShlZGl0U3RyaW5nLCBwb3MpOwotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCAiSW52YWxpZCBpbnB1dCBhdCAiCi0JCQkJCQkJKyBwb3MuZ2V0RXJyb3JJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlTmV3VmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBTdHJpbmcgbmV3U3RyaW5nLAotCQkJaW50IGZsYWdzKSB7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShuZXdTdHJpbmcsCi0JCQkJbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotCQlpZiAodmFsdWVzID09IG51bGwKLQkJCQl8fCB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpLmdldENvZGUoKSAhPSBJUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlQ29tbWFuZChhZGFwdGVyLCB2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwKLQkJCU9iamVjdFtdIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoSUFkYXB0YWJsZSBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJU2V0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IFNldFJlcXVlc3QoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IFNldFZhbHVlQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKFN0cmluZy5jbGFzcy5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkTmV3VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoQm9vbGVhbi5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgdmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBCb29sZWFuIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKHMuY2hhckF0KDApKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBDaGFyYWN0ZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEJ5dGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEJ5dGUoKChOdW1iZXIpIHZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gQnl0ZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBCeXRlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgQnl0ZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoU2hvcnQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBTaG9ydCgoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gU2hvcnQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gU2hvcnQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTaG9ydCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSW50ZWdlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcigoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEludGVnZXIudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gSW50ZWdlciB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEludGVnZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKExvbmcuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IExvbmcoKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gTG9uZy52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBMb25nIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgTG9uZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRmxvYXQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdCgoKE51bWJlcikgdmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRmxvYXQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRmxvYXQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBGbG9hdCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRG91YmxlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IERvdWJsZSgoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBEb3VibGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBEb3VibGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBFRW51bSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9ICgoRUVudW0pIHR5cGUpCi0JCQkJCQkJLmdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWlmIChsaXRlcmFsID09IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVW5rbm93biBsaXRlcmFsOiAiICsgdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU3RyaW5nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEludmFsaWRWYWx1ZSB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkJcHVibGljIEludmFsaWRWYWx1ZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDQ0MDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbml0ZW0uQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLmFjdGlvbnMuUHJpbnRQcmV2aWV3QWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5FbmhhbmNlZFByaW50QWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQsCi0JCQlJV29ya2JlbmNoUGFydERlc2NyaXB0b3IgcGFydERlc2NyaXB0b3IpIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscyhQcmludFByZXZpZXdBY3Rpb24uSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uKAotCQkJCQluZXcgRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWN0aW9uKGFjdGlvbklkLCBwYXJ0RGVzY3JpcHRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwMmFmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkFic3RyYWN0RWRpdFBhcnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkNyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LklFZGl0UGFydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5EaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2FjaGluZzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkUGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkVmlldzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIoKSB7Ci0JCXNldEZhY3RvcnkobmV3IERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKSk7Ci0JCXNldEFsbG93Q2FjaGluZyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRQYXJ0RmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmFjdG9yeShFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FsbG93Q2FjaGluZygpIHsKLQkJcmV0dXJuIGFsbG93Q2FjaGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldEFsbG93Q2FjaGluZyhib29sZWFuIGFsbG93Q2FjaGluZykgewotCQl0aGlzLmFsbG93Q2FjaGluZyA9IGFsbG93Q2FjaGluZzsKLQkJaWYgKCFhbGxvd0NhY2hpbmcpIHsKLQkJCWNhY2hlZFBhcnQgPSBudWxsOwotCQkJY2FjaGVkVmlldyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJRWRpdFBhcnQgcGFydCA9IGZhY3RvcnkuY3JlYXRlRWRpdFBhcnQobnVsbCwgdmlldyk7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQlyZXR1cm4gKElHcmFwaGljYWxFZGl0UGFydCkgcGFydDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElHcmFwaGljYWxFZGl0UGFydCBnZXRDYWNoZWRQYXJ0KFZpZXcgdmlldykgewotCQlpZiAoY2FjaGVkVmlldyAhPSBudWxsICYmIGNhY2hlZFZpZXcuZ2V0KCkgPT0gdmlldykgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIGNhY2hlZFBhcnQuZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGNyZWF0ZUdyYXBoaWNFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gZ2V0Q2FjaGVkUGFydCh2aWV3KTsKLQkJCWNhY2hlZFBhcnQgPSBudWxsOwotCQkJY2FjaGVkVmlldyA9IG51bGw7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBhcnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUVkaXRQYXJ0KHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIENyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbikgewotCQkJVmlldyB2aWV3ID0gKChJRWRpdFBhcnRPcGVyYXRpb24pIG9wZXJhdGlvbikuZ2V0VmlldygpOwotCQkJaWYgKCFXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc0FsbG93Q2FjaGluZygpICYmIGdldENhY2hlZFBhcnQodmlldykgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSkgewotCQkJCQljYWNoZWRQYXJ0ID0gbmV3IFdlYWtSZWZlcmVuY2UocGFydCk7Ci0JCQkJCWNhY2hlZFZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZSh2aWV3KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWxlbWVudFR5cGVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWxlbWVudFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjE5OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FbGVtZW50VHlwZXMgZXh0ZW5kcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW1FbGVtZW50VHlwZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBlbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEltYWdlUmVnaXN0cnlLZXkoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9ICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbGVtZW50KTsKLQkJCUVDbGFzcyBlQ29udGFpbmluZ0NsYXNzID0gZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3NpZmllciBlVHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChlQ29udGFpbmluZ0NsYXNzICE9IG51bGwgJiYgIWVDb250YWluaW5nQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJZWxlbWVudCA9IGVDb250YWluaW5nQ2xhc3M7Ci0JCQl9IGVsc2UgaWYgKGVUeXBlIGluc3RhbmNlb2YgRUNsYXNzCi0JCQkJCSYmICEoKEVDbGFzcykgZVR5cGUpLmlzQWJzdHJhY3QoKSkgewotCQkJCWVsZW1lbnQgPSBlVHlwZTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVsZW1lbnQ7Ci0JCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcigKLQkJCQkJCQkJZUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmNyZWF0ZShlQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQkvLyBUT0RPIDogc3VwcG9ydCBzdHJ1Y3R1cmFsIGZlYXR1cmVzCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcga2V5ID0gZ2V0SW1hZ2VSZWdpc3RyeUtleShlbGVtZW50KTsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihJQWRhcHRhYmxlIGhpbnQpIHsKLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShJQWRhcHRhYmxlIGhpbnQpIHsKLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgJ3R5cGUnIG9mIHRoZSBlY29yZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVOYW1lZEVsZW1lbnQgZ2V0RWxlbWVudChJQWRhcHRhYmxlIGhpbnQpIHsKLQkJT2JqZWN0IHR5cGUgPSBoaW50LmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwotCi0JCQllbGVtZW50cy5wdXQoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSwKLQkJCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkpOwotCi0JCQllbGVtZW50cy5wdXQoV29ya1Byb2R1Y3ROb2RlXzEwMDEsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0Tm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KExpbmtfMzAwMSwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rKCkpOwotCQl9Ci0JCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgV29ya1Byb2R1Y3ROb2RlXzEwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5Xb3JrUHJvZHVjdE5vZGVfMTAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTGlua18zMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuTGlua18zMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZShpZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFNldCBLTk9XTl9FTEVNRU5UX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tub3duRWxlbWVudFR5cGUoSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0JCWlmIChLTk9XTl9FTEVNRU5UX1RZUEVTID09IG51bGwpIHsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMgPSBuZXcgSGFzaFNldCgpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChXb3JrUHJvZHVjdE5vZGVfMTAwMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChMaW5rXzMwMDEpOwotCQl9Ci0JCXJldHVybiBLTk9XTl9FTEVNRU5UX1RZUEVTLmNvbnRhaW5zKGVsZW1lbnRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Y2Y0MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLkdldEljb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb24uSUljb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUljb25Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJSWNvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbihJQWRhcHRhYmxlIGhpbnQsIGludCBmbGFncykgewotCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRJbWFnZShoaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldEljb25PcGVyYXRpb24pIHsKLQkJCXJldHVybiAoKEdldEljb25PcGVyYXRpb24pIG9wZXJhdGlvbikuZXhlY3V0ZSh0aGlzKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlNDc3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMubW9kZWxpbmdhc3Npc3RhbnQuTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBleHRlbmRzIE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yUG9wdXBCYXIoSUFkYXB0YWJsZSBob3N0KSB7Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdE5vZGVfMTAwMSk7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2UoSUFkYXB0YWJsZSBzb3VyY2UpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25UYXJnZXQoSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJQWRhcHRhYmxlIHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JTb3VyY2UoSUFkYXB0YWJsZSB0YXJnZXQsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudCh0YXJnZXQsIGdldFR5cGVzRm9yU291cmNlKHRhcmdldCwKLQkJCQlyZWxhdGlvbnNoaXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoc291cmNlLCBnZXRUeXBlc0ZvclRhcmdldChzb3VyY2UsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoSUFkYXB0YWJsZSBob3N0LCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCWlmICh0eXBlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldFJvb3QoKS5nZXRDb250ZW50cygpLmdldE1vZGVsKCk7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNBcHBsaWNhYmxlRWxlbWVudChlbGVtZW50LCB0eXBlcykpIHsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdEVsZW1lbnQoKEVPYmplY3RbXSkgZWxlbWVudHMudG9BcnJheShuZXcgRU9iamVjdFtlbGVtZW50cwotCQkJCS5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYWJsZUVsZW1lbnQoRU9iamVjdCBlbGVtZW50LCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCUlFbGVtZW50VHlwZSB0eXBlID0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRUeXBlKAotCQkJCWVsZW1lbnQpOwotCQlyZXR1cm4gdHlwZXMuY29udGFpbnModHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdEVsZW1lbnQoRU9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpOwotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJc2hlbGwsIGxhYmVsUHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSgiQXZhaWxhYmxlIGRvbWFpbiBtb2RlbCBlbGVtZW50czoiKTsKLQkJZGlhbG9nLnNldFRpdGxlKCJTZWxlY3QgZG9tYWluIG1vZGVsIGVsZW1lbnQiKTsKLQkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLQkJZGlhbG9nLnNldEVsZW1lbnRzKGVsZW1lbnRzKTsKLQkJRU9iamVjdCBzZWxlY3RlZCA9IG51bGw7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJc2VsZWN0ZWQgPSAoRU9iamVjdCkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjNDRhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFsZXR0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMucGFsZXR0ZS5JUGFsZXR0ZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtUGFsZXR0ZUZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVBhbGV0dGVQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFsZXR0ZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9QYWxldHRlKElFZGl0b3JQYXJ0IGVkaXRvciwgT2JqZWN0IGNvbnRlbnQsCi0JCQlQYWxldHRlUm9vdCByb290LCBNYXAgcHJlZGVmaW5lZEVudHJpZXMpIHsKLQkJRGlhZ3JhbVBhbGV0dGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGlhZ3JhbVBhbGV0dGVGYWN0b3J5KCk7Ci0JCWZhY3RvcnkuZmlsbFBhbGV0dGUocm9vdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJLy8gbm8gY29uZmlndXJhdGlvbgotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlyZXR1cm4gZmFsc2U7IC8vIGFsbCBsb2dpYyBpcyBkb25lIGluIHRoZSBzZXJ2aWNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFyc2VyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0MzJjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFyc2VyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5HZXRQYXJzZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFyc2VyUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhcnNlclByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgd29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRXb3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyID0gY3JlYXRlV29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlV29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkTm9kZV9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgbGlua0xpbmtOYW1lXzQwMDJQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldExpbmtMaW5rTmFtZV80MDAyUGFyc2VyKCkgewotCQlpZiAobGlua0xpbmtOYW1lXzQwMDJQYXJzZXIgPT0gbnVsbCkgewotCQkJbGlua0xpbmtOYW1lXzQwMDJQYXJzZXIgPSBjcmVhdGVMaW5rTGlua05hbWVfNDAwMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBsaW5rTGlua05hbWVfNDAwMlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlTGlua0xpbmtOYW1lXzQwMDJQYXJzZXIoKSB7Ci0JCURpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGlua19OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBnZXRQYXJzZXIoaW50IHZpc3VhbElEKSB7Ci0JCXN3aXRjaCAodmlzdWFsSUQpIHsKLQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldExpbmtMaW5rTmFtZV80MDAyUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcihJQWRhcHRhYmxlIGhpbnQpIHsKLQkJU3RyaW5nIHZpZCA9IChTdHJpbmcpIGhpbnQuZ2V0QWRhcHRlcihTdHJpbmcuY2xhc3MpOwotCQlpZiAodmlkICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlkKSk7Ci0JCX0KLQkJVmlldyB2aWV3ID0gKFZpZXcpIGhpbnQuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQYXJzZXJPcGVyYXRpb24pIHsKLQkJCUlBZGFwdGFibGUgaGludCA9ICgoR2V0UGFyc2VyT3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldEhpbnQoKTsKLQkJCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLmdldEVsZW1lbnQoaGludCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBnZXRQYXJzZXIoaGludCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMWRjNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5HZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5JQ29tcG9zaXRlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSVByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvcGVydGllcy5wcm92aWRlcnMuR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIgZXh0ZW5kcyBHZW5lcmljRU1GUHJvcGVydGllc1Byb3ZpZGVyCi0JCWltcGxlbWVudHMgSVByb3BlcnRpZXNQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gKChHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgb3BlcmF0aW9uKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tcG9zaXRlUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQob2JqZWN0KTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5U291cmNlKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmlldykgewotCQkJdmlldyA9IChWaWV3KSBvYmplY3Q7Ci0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBvYmplY3Q7Ci0JCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQl2aWV3ID0gKFZpZXcpIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZpZXcgIT0gbnVsbAotCQkJCSYmIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJcmV0dXJuIHZpZXcuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzMjZkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgZXh0ZW5kcyBEaWFncmFtQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZUZvcm1hdCBERUZBVUxUX1BST0NFU1NPUiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJInswfSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Vmlld1Byb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRFZGl0UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXREb21haW5FbGVtZW50KEVPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJZWxlbWVudCA9IGdldERvbWFpbkVsZW1lbnQoZWxlbWVudCk7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oZWxlbWVudCwgZmVhdHVyZSwgcHJvY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oRU9iamVjdCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KG5ldyBPYmplY3RbXSB7IHZhbHVlIH0sIG5ldyBTdHJpbmdCdWZmZXIoKSwKLQkJCQluZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQllbGVtZW50ID0gZ2V0RG9tYWluRWxlbWVudChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbAotCQkJCS5nZXRFZGl0aW5nRG9tYWluKGVsZW1lbnQpOwotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlPYmplY3QgdmFsdWUgPSB2YWx1ZXMubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF0gOiBudWxsOwotCQlJQ29tbWFuZCBjb21tYW5kID0gZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgY29tbWFuZAotCQkJCS5nZXRMYWJlbCgpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbW1hbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RpbmdFdmVudChPYmplY3QgZXZlbnQsIGludCBmbGFncykgewotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsKLQkJCXJldHVybiBpc0FmZmVjdGluZ0ZlYXR1cmUoKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBZmZlY3RpbmdGZWF0dXJlKE9iamVjdCBldmVudEZlYXR1cmUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgPT0gZXZlbnRGZWF0dXJlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3N2Y4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyIGV4dGVuZHMgRGlhZ3JhbUFic3RyYWN0UGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZmVhdHVyZXM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIoTGlzdCBmZWF0dXJlcykgewotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdChmZWF0dXJlcy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQodmFsdWVzLnRvQXJyYXkobmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXSksCi0JCQkJbmV3IFN0cmluZ0J1ZmZlcigpLCBuZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCAhPSBmZWF0dXJlcy5zaXplKCkpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCS5nZXQoaSksIHZhbHVlc1tpXSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgIlNldCBWYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQljb21tYW5kCi0JCQkJCS5jb21wb3NlKGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlPYmplY3QgZmVhdHVyZSA9ICgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxM2RkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtVmlld1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuQWJzdHJhY3RWaWV3UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzLkxpbmtOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5MaW5rVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVmlld1Byb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWaWV3UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGRpYWdyYW1LaW5kKQotCQkJCSYmIERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldERpYWdyYW1WaXN1YWxJRChzZW1hbnRpY0VsZW1lbnQpICE9IC0xKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0Tm9kZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlpZiAoY29udGFpbmVyVmlldyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIURpYWdyYW1FbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRUNsYXNzIHNlbWFudGljVHlwZSA9IGdldFNlbWFudGljRUNsYXNzKHNlbWFudGljQWRhcHRlcik7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWludCBub2RlVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUsIHNlbWFudGljSGludCk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBXb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBMaW5rTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRnZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIURpYWdyYW1FbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRUNsYXNzIHNlbWFudGljVHlwZSA9IGdldFNlbWFudGljRUNsYXNzKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChzZW1hbnRpY1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaW50IGxpbmtWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUpOwotCQlzd2l0Y2ggKGxpbmtWSUQpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIExpbmtWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKHNlbWFudGljQWRhcHRlciwKLQkJCQljb250YWluZXJWaWV3LCBzZW1hbnRpY0hpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElFbGVtZW50VHlwZSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyKSB7Ci0JCWlmIChzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ2xhc3MgZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCS8vIEhhbmRsZSB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBjbGFzc2VzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMWRmNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvc2hlZXQvRGlhZ3JhbVNoZWV0TGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9zaGVldC9EaWFncmFtU2hlZXRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOWU0MDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9zaGVldC9EaWFncmFtU2hlZXRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnNoZWV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVNoZWV0TGFiZWxQcm92aWRlciBleHRlbmRzIERlY29yYXRpbmdMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVNoZWV0TGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdCBzZWxlY3RlZCA9IHVud3JhcChlbGVtZW50KTsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoc2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKHVud3JhcChlbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgT2JqZWN0IHVud3JhcChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gdW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGVsZW1lbnQpLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQlyZXR1cm4gdW53cmFwRWRpdFBhcnQoKEVkaXRQYXJ0KSBlbGVtZW50KTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHVud3JhcFZpZXcodmlldyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgT2JqZWN0IHVud3JhcEVkaXRQYXJ0KEVkaXRQYXJ0IHApIHsKLQkJaWYgKHAuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXJldHVybiB1bndyYXBWaWV3KChWaWV3KSBwLmdldE1vZGVsKCkpOwotCQl9Ci0JCXJldHVybiBwLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgT2JqZWN0IHVud3JhcFZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKSA9PSBudWxsID8gdmlldyA6IHZpZXcuZ2V0RWxlbWVudCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4ZDZmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdExhYmVsVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5NZWFzdXJlbWVudFVuaXRIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExhYmVsVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvTGlua1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODFhYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSURlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQmVuZHBvaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtWaWV3RmFjdG9yeSBleHRlbmRzIENvbm5lY3Rpb25WaWV3RmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0Jc3RhdGljIHsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX1VOUFJPVEVDVEVELCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fTk9USUZJQ0FUSU9OUywgQm9vbGVhbi5UUlVFKTsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX1RSSUdHRVJTLCBCb29sZWFuLlRSVUUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvdXRpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3LmZhY3Rvcmllcy5WaWV3RmFjdG9yeSNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcpCi0JICogCi0JICogT3ZlcnJpZGUgY3JlYXRlVmlldyBzaW5jZSB0aGVyZSBpcyBhIGJ1ZyBpbiAKLQkgKiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeS5qYXZhCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhmaW5hbCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCWZpbmFsIFZpZXcgY29udGFpbmVyVmlldywgZmluYWwgU3RyaW5nIHNlbWFudGljSGludCwKLQkJCWZpbmFsIGludCBpbmRleCwgZmluYWwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlmaW5hbCBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0KLQkJc2V0UHJlZmVyZW5jZXNIaW50KHByZWZlcmVuY2VzSGludCk7Ci0KLQkJZmluYWwgRWRnZSBlZGdlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFZGdlKCk7Ci0JCUxpc3Qgc3R5bGVzID0gY3JlYXRlU3R5bGVzKGVkZ2UpOwotCQlpZiAoc3R5bGVzLnNpemUoKSA+IDApIHsKLQkJCWVkZ2UuZ2V0U3R5bGVzKCkuYWRkQWxsKHN0eWxlcyk7Ci0JCX0KLQotCQlCZW5kcG9pbnRzIGJlbmRQb2ludHMgPSBjcmVhdGVCZW5kcG9pbnRzKCk7Ci0JCWlmIChiZW5kUG9pbnRzICE9IG51bGwpIHsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kUG9pbnRzKTsKLQkJfQotCi0JCUVPYmplY3Qgc2VtYW50aWNFbCA9IHNlbWFudGljQWRhcHRlciA9PSBudWxsID8gbnVsbAotCQkJCTogKEVPYmplY3QpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoc2VtYW50aWNFbCA9PSBudWxsKQotCQkJLy8gZW5mb3JjZSBhIHNldCB0byBOVUxMCi0JCQllZGdlLnNldEVsZW1lbnQobnVsbCk7Ci0JCWVsc2UgaWYgKHJlcXVpcmVzRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcpKSB7Ci0JCQllZGdlLnNldEVsZW1lbnQoc2VtYW50aWNFbCk7Ci0JCX0KLQotCQllZGdlLnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQotCQkvLyBkZWNvcmF0ZSB2aWV3IGFzc3VtZXMgdGhlIHZpZXcgaGFkIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgc28gCi0JCS8vIHdlIGhhZCB0byBjYWxsIGluc2VydCBjaGlsZCBiZWZvcmUgY2FsbGluZyBkZWNvcmF0ZSB2aWV3Ci0JCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBpbmRleCwgcGVyc2lzdGVkKTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXRFZGl0aW5nRG9tYWluKHNlbWFudGljRWwsCi0JCQkJY29udGFpbmVyVmlldyk7Ci0KLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNVblByb3RlY3RlZFNpbGVudFRyYW5zYWN0aW9uSW5Qcm9ncmVzcyhkb21haW4pKSB7Ci0JCQkJLy8gZGVjb3JhdGUgdmlldyBoYWQgdG8gcnVuIGFzIGEgc2lsZW50IG9wZXJhdGlvbiBvdGhlciB3aXNlCi0JCQkJLy8gaXQgd2lsbCBnZW5lcmF0ZSB0b28gbWFueSBldmVudHMKLQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKAotCQkJCQkJZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LLCBvcHRpb25zKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS5jYXRjaGluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlEZWJ1Z09wdGlvbnMuRVhDRVBUSU9OU19DQVRDSElORywKLQkJCQkJCQlnZXRDbGFzcygpLCAiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxvZy53YXJuaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSVN0YXR1c0NvZGVzLklHTk9SRURfRVhDRVBUSU9OX1dBUk5JTkcsCi0JCQkJCQkJImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlZGdlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTI1OGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5EaWFncmFtVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5NZWFzdXJlbWVudFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5IGV4dGVuZHMgRGlhZ3JhbVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhZ2VTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyB2aWV3LCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcodmlldywgc2VtYW50aWNBZGFwdGVyLCBkaWFncmFtS2luZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZWFzdXJlbWVudFVuaXQgZ2V0TWVhc3VyZW1lbnRVbml0KCkgewotCQlyZXR1cm4gTWVhc3VyZW1lbnRVbml0LlBJWEVMX0xJVEVSQUw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiOWZlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU3OTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWMzZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kb2M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmZDRkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZmVhdHVyZVBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kb2M7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTkwODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LmluaSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRmNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQubWFwcGluZ3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTJiNjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuMi4wCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2NlNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBEb2N1bWVudGF0aW9uCi0KLWZlYXR1cmVUZXh0PUVQRiBEb2N1bWVudGF0aW9uXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hcHBsaWNhdGlvbl8zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2FwcGxpY2F0aW9uXzMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxMjlmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgbmwvCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzOTQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIC0gZG9rdW1lbnRhdGlvbgotCi1mZWF0dXJlVGV4dD1FUEYtZG9rdW1lbnRhdGlvblxuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CeWdnZWV0aWtldDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFjNGMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgLSBEb2t1bWVudGF0aW9uCi0KLWZlYXR1cmVUZXh0PUVQRiAtIERva3VtZW50YXRpb25cblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQtS2VubnVuZzogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZXMvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZXMvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0ZWExOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RG9jdW1lbnRhY2lcdTAwZjNuIGRlIEVQRgotCi1mZWF0dXJlVGV4dD1Eb2N1bWVudGFjaVx1MDBmM24gZGUgRVBGXG5cCi1cblwKLVZlcnNpXHUwMGYzbjogezF9IFxuXAotRXRpcXVldGEgZGUgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDAsIDIwMDcuICBSZXNlcnZhZG9zIHRvZG9zIGxvcyBkZXJlY2hvcy5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZnIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZnIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhYzZmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RG9jdW1lbnRhdGlvbiBFUEYKLQotZmVhdHVyZVRleHQ9RG9jdW1lbnRhdGlvbiBFRkZcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotTGliZWxsXHUwMGU5IGRlIHZlcnNpb24gOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRhY2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvaXQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1Eb2N1bWVudGF6aW9uZSBFUEYKLQotZmVhdHVyZVRleHQ9RG9jdW1lbnRhemlvbmUgRVBGXG5cCi1cblwKLVZlcnNpb25lOiB7MX0gXG5cCi1FdGljaGV0dGEgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IGNvbnRyaWJ1dG9yIEVjbGlwc2UgZSBhbHRyaSAyMDAwLCAyMDA3LiAgVHV0dGkgaSBkaXJpdHRpIHJpc2VydmF0aS5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvamEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvamEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiM2JmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2phL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIERvY3VtZW50YXRpb24KLQotZmVhdHVyZVRleHQ9RVBGIFx1OGNjN1x1NjU5OVxuXAotXG5cCi1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6IHsxfSBcblwKLVx1MzBkM1x1MzBlYlx1MzBjOVx1MzBmYlx1MzBlOVx1MzBkOVx1MzBlYjogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2Mvbmwva28vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2Mvbmwva28vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlMGFlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFx1YmIzOFx1YzExYwotCi1mZWF0dXJlVGV4dD1FUEYgXHViYjM4XHVjMTFjXG5cCi1cblwKLVx1YmM4NFx1YzgwNDogezF9IFxuXAotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3N2Y3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBkbyBFUEYKLQotZmVhdHVyZVRleHQ9RG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBkbyBFUEZcblwKLVxuXAotVmVyc1x1MDBlM286IHsxfSBcblwKLUNvbnN0cnVcdTAwZTdcdTAwZTNvOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBFY2xpcHNlIGUgb3V0cm9zIDIwMDAsIDIwMDcuIFRvZG9zIG9zIERpcmVpdG9zIFJlc2VydmFkb3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3J1L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3J1L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzc4NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPVx1MDQxNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBFUEYKLQotZmVhdHVyZVRleHQ9XHUwNDE0XHUwNDNlXHUwNDNhXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIEVQRlxuXAotXG5cCi1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGY6IHsxfSBcblwKLVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzMDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgXHUwNDEyXHUwNDQxXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0NDlcdTA0MzhcdTA0NDlcdTA0MzVcdTA0M2RcdTA0NGIuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZWQwNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBcdTY1ODdcdTY4NjMKLQotZmVhdHVyZVRleHQ9RVBGIFx1NjU4N1x1Njg2M1xuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX0gXG5cCi1cdTVkZTVcdTRmNWNcdTcyNDhcdTY3MmNcdTY4MDdcdTdiN2VcdWZmMWF7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIFxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMGQ2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIERvY3VtZW50YXRpb24KLQotZmVhdHVyZVRleHQ9RVBGIFx1NjU4N1x1NGVmNlxuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX1cblwKLVx1NWVmYVx1N2Y2ZVx1NmExOVx1N2M2NFx1ZmYxYXswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3YTM2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgRG9jdW1lbnRhdGlvbiBGZWF0dXJlCi0jZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgRG9jdW1lbnRhdGlvbiBGZWF0dXJlIChOTFMpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyNzRlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgUmljaCBUZXh0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNGJmYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE3ZjA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUNsYXNzUGF0aDogZXhwb3J0bXNwdWkuamFyCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWksCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkNDNjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLmV4cG9ydG1zcHVpLmphciA9IHNyYy8KLW91dHB1dC5leHBvcnRtc3B1aS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBleHBvcnRtc3B1aS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvaWNvbnMvZXRvb2wxNi9leHBfbXNfcHJqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2V0b29sMTYvZXhwX21zX3Byai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OThkMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvaWNvbnMvZXRvb2wxNi9leHBfbXNfcHJqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NTg5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9pY29ucy9mdWxsL3dpemJhbi9leHBfbXNfcHJqX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY0ZWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFdpemFyZHMKLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9TWljcm9zb2Z0IFByb2plY3QKLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUV4cG9ydCBhIHByb2Nlc3MgdG8gYSBNaWNyb3NvZnQgUHJvamVjdC4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQwOTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuRXhwb3J0TVNQV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXRvb2wxNi9leHBfbXNfcHJqLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLkV4cG9ydE1TUFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJleHBvcnRNU1BXaXphcmQiCi0gICAgICAgICBuYW1lPSJFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0V4cG9ydE1TUFdpemFyZC5leHNkIiAvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5FeHBvcnRNU1BXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NjaGVtYS9FeHBvcnRNU1BXaXphcmQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NjaGVtYS9FeHBvcnRNU1BXaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmOWEzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zY2hlbWEvRXhwb3J0TVNQV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpIiBpZD0iZXhwb3J0TVNQV2l6YXJkIiBuYW1lPSJFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBleHRlbmQgdGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLmV4cG9ydE1TUFdpemFyZCZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmQKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuTXlFeHBvcnRNU1BXaXphcmQmcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5NeVNlbGVjdFByb2Nlc3NQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLlNlbGVjdFByb2Nlc3NQYWdlJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLk15TmV3V2l6YXJkUGFnZSZxdW90OwotICAgICAgICAgICAgICAgdHlwZT0mcXVvdDtuZXcmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLlNlbGVjdFB1Ymxpc2hPcHRpb25zUHJvY2Vzc1BhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIGluc2VydD0mcXVvdDthZnRlciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAmbHQ7L3dpemFyZCZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9FeHBvcnRNU1BVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2Y2MzNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9FeHBvcnRNU1BVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0TVNQVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHBvcnRNU1BVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL0V4cG9ydE1TUFVJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MWEwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFVJIG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydE1TUFVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEV4cG9ydE1TUFVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhwb3J0TVNQVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0T3B0aW9uc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdGVkUHJvY2Vzc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hXZWJTaXRlQ2hlY2tCb3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hQcm9jZXNzQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2plY3ROYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpckxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG92ZXJ3cml0ZVRleHRfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdQcm9jZXNzQ29udGVudFdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGxldGVkVGV4dF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BJbnRlcm5hbEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlsbGVnYWxBcmd1bWVudF9tc2c7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFeHBvcnRNU1BVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU2ZjFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9RXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0Ci0KLSMgU2VsZWN0IEV4cG9ydCBPcHRpb25zIFdpemFyZCBQYWdlCi1zZWxlY3RFeHBvcnRPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgZXhwb3J0IG9wdGlvbnMKLXNlbGVjdEV4cG9ydE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWN0IHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgZXhwb3J0IG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXhwb3J0IHRoZSBzZWxlY3RlZCBwcm9jZXNzLgotc2VsZWN0ZWRQcm9jZXNzTGFiZWxfdGV4dD1TZWxlY3RlZCBwcm9jZXNzOgotY29uZmlndXJhdGlvbkxhYmVsX3RleHQ9TWV0aG9kIGNvbmZpZ3VyYXRpb246Ci1wdWJsaXNoV2ViU2l0ZUNoZWNrQm94X3RleHQ9UHVibGlzaCB0aGUgcHJvY2VzcyB3ZWJzaXRlCi1wdWJsaXNoQ29uZmlnQnV0dG9uX3RleHQ9UHVibGlzaCB0aGUgZW50aXJlIG1ldGhvZCBjb25maWd1cmF0aW9uCi1wdWJsaXNoUHJvY2Vzc0J1dHRvbl90ZXh0PVB1Ymxpc2ggY29udGVudCB0aGF0IGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIHNlbGVjdGVkIHByb2Nlc3MKLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PUV4cG9ydCBvbmx5IGJyZWFrZG93biBlbGVtZW50cyB0aGF0IGFyZSBwbGFubmVkCi0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMKLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgcHVibGlzaGluZyBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHB1Ymxpc2ggdGhlIHdlYnNpdGUgZm9yIHRoZSBleHBvcnRlZCBwcm9jZXNzLgotCi0jIFNlbGVjdCBFeHBvcnQgRGlyZWN0b3J5IFdpemFyZCBwYWdlCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZnkgcHJvamVjdCBuYW1lIGFuZCBleHBvcnQgZGlyZWN0b3J5Ci1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RleHQ9U3BlY2lmeSB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZSBhbmQgZXhwb3J0IGRpcmVjdG9yeS4KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1OYW1lOgotZGlyTGFiZWxfdGV4dD1EaXJlY3Rvcnk6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotZXhwb3J0TVNQVGFza19uYW1lPUV4cG9ydGluZyBzZWxlY3RlZCBwcm9jZXNzIHRvIE1pY3Jvc29mdCBQcm9qZWN0Li4uCi0KLSMgV2FybmluZyBNZXNzYWdlcwotb3ZlcndyaXRlVGV4dF9tc2c9SVVQTTAxMDBXOiBBIE1pY3Jvc29mdCBQcm9qZWN0ICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gJyd7MX0nJy5cblxuRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIGl0PwotbWlzc2luZ1Byb2Nlc3NDb250ZW50V2FybmluZ19tc2c9SVVQTTAxMDJXOiBUaGUgcHVibGlzaGVkIHByb2Nlc3Mgd2Vic2l0ZSB3aWxsIG5vdCBjb250YWluIGFueSBjb250ZW50IHJlbGF0ZWQgdG8gdGhlIGV4cG9ydGVkIHByb2Nlc3MuXG5cbkRvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci0KLSMgSW5mb3JtYXRpb25hbCBNZXNzYWdlcwotY29tcGxldGVkVGV4dF9tc2c9SVVQTTAxMDNJOiBUaGUgc2VsZWN0ZWQgcHJvY2VzcyAnJ3swfScnIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleHBvcnRlZCB0byBNaWNyb3NvZnQgUHJvamVjdCBYTUwgZmlsZSAnJ3sxfScnLgotCi0jIEVycm9yIE1lc3NhZ2VzCi1leHBvcnRNU1BFcnJvcl9tc2c9SVVQTTAxMDVFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgZXhwb3J0aW5nIHRoZSBzZWxlY3RlZCBwcm9jZXNzICcnezB9JycgdG8gTWljcm9zb2Z0IFByb2plY3QgJyd7MX0nJy4KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotZXhwb3J0TVNQSW50ZXJuYWxFcnJvcl9tc2c9QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotaWxsZWdhbEFyZ3VtZW50X21zZz17MH0gcmV0dXJucyBhIG51bGwgb3IgaW52YWxpZCB2YWx1ZS4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY4YWRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyByZXNvdXJjaW5nIHN1cHBvcnQgZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgd2l6YXJkLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9FeHBvcnRNU1BVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcHJlZmVyZW5jZXMvRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njc3ODNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9FeHBvcnRNU1BVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFVJUHJlZmVyZW5jZXMgewotCi0JLy8gVGhlIHB1Ymxpc2ggd2ViIHNpdGUgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfV0VCU0lURSA9ICJwdWJsaXNoV2ViU2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHVVJBVElPTiA9ICJwdWJsaXNoQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX09OTFlfUExBTk5FRF9XQlNfRUxFTUVOVFMgPSAiZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBwcm9jZXNzIG5hbWUgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfTkFNRSA9ICJwcm9jZXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1yIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX05BTUUgPSAiY29uZmlndXJhdGlvbk5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TX1BST0pFQ1RfTkFNRVMgPSAibXNwcm9qZWN0TmFtZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgZXhwb3J0IGRpcmVjdG9yaWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfRElSRUNUT1JJRVMgPSAiZXhwb3J0RGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBNU1AgZGlyZWN0b3J5IG5hbWUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhQT1JUX0RJUl9OQU1FID0gIkV4cG9ydCIgKyBGaWxlVXRpbC5GSUxFX1NFUCArICJNU1AiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJIAotCQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBNU1AgZGlyZWN0b3J5LgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0RXhwb3J0RGlyID0gbnVsbDsKLQkKLQlzdGF0aWMgewotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX1dFQlNJVEUsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX0NPTkZJR1VSQVRJT04sIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfT05MWV9QTEFOTkVEX1dCU19FTEVNRU5UUywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChDT05GSUdVUkFUSU9OX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQUk9DRVNTX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChNU19QUk9KRUNUX05BTUVTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRVhQT1JUX0RJUkVDVE9SSUVTLCBnZXREZWZhdWx0RXhwb3J0RGlyKCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIHRoZSBwcmVmZXJlbmNlIGlzIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFdlYlNpdGUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihQVUJMSVNIX1dFQlNJVEUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hXZWJTaXRlKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfV0VCU0lURSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9DT05GSUdVUkFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hDb25maWd1cmF0aW9uKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfQ09ORklHVVJBVElPTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYUE9SVF9PTkxZX1BMQU5ORURfV0JTX0VMRU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShFWFBPUlRfT05MWV9QTEFOTkVEX1dCU19FTEVNRU5UUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByb2Nlc3MgbmFtZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9jZXNzTmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoUFJPQ0VTU19OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9jZXNzIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb2Nlc3NOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoUFJPQ0VTU19OQU1FLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25maWd1cmF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQ09ORklHVVJBVElPTl9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0aW9uTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKENPTkZJR1VSQVRJT05fTkFNRSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0TVNQcm9qZWN0TmFtZXMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBNU19QUk9KRUNUX05BTUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0TVNQcm9qZWN0TmFtZXNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChwcmVmU3RvcmUsIE1TX1BST0pFQ1RfTkFNRVMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lIHRvIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIHRlbXBsYXRlIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTVNQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBNU19QUk9KRUNUX05BTUVTLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGV4cG9ydCBNU1AgZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZXhwb3J0IE1TUCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RXhwb3J0RGlyKCkgewotCQlpZiAoZGVmYXVsdEV4cG9ydERpciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0RXhwb3J0RGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRFeHBvcnREaXIgPSBkZWZhdWx0RXhwb3J0RGlyICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQICsgREVGQVVMVF9FWFBPUlRfRElSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRFeHBvcnREaXIgPSBkZWZhdWx0RXhwb3J0RGlyICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgREVGQVVMVF9FWFBPUlRfRElSX05BTUU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRFeHBvcnREaXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RXhwb3J0RGlyZWN0b3JpZXMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBFWFBPUlRfRElSRUNUT1JJRVMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGV4cG9ydCBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEV4cG9ydERpcmVjdG9yaWVzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBFWFBPUlRfRElSRUNUT1JJRVMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBleHBvcnQgZGlyZWN0b3J5IHRvIHRoZSBleHBvcnQgZGlyZWN0b3JpZXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBhbiBleHBvcnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4cG9ydERpcihTdHJpbmcgZGlyKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIEVYUE9SVF9ESVJFQ1RPUklFUywgZGlyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJmODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgd2l6YXJkLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL0V4cG9ydE1TUFdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvRXhwb3J0TVNQV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZTZlYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvRXhwb3J0TVNQV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLkV4cG9ydE1TUE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuRXhwb3J0TVNQU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5FeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLklFeHBvcnRNU1BTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuU2VsZWN0UHJvY2Vzc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5QdWJsaXNoaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgd2l6YXJkLgotICogPHA+Ci0gKiBUaGlzIHdpemFyZCBleHBvcnRzIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgdG8gYSBNaWNyb3NvZnQKLSAqIFByb2plY3QuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGdlbmVyYXRlcyBhIFhNTCBmaWxlIHRoYXQgYWRoZXJlcyB0byB0aGUKLSAqIE1pY3Jvc29mdCBQcm9qZWN0IDIwMDMgWE1MIFNjaGVtYS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BXaXphcmQgZXh0ZW5kcyBCYXNlV2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IEV4cG9ydE1TUFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgUHVibGlzaCBDb25maWd1cmF0aW9uIHdpemFyZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5leHBvcnRNU1BXaXphcmQiOyAvLyROT04tTkxTLTEkCQotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwcm9jZXNzLgotCXByb3RlY3RlZCBTZWxlY3RQcm9jZXNzUGFnZSBzZWxlY3RQcm9jZXNzUGFnZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZXhwb3J0IG9wdGlvbnMuCi0JcHJvdGVjdGVkIFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlIHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JcHJvdGVjdGVkIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2U7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGV4cG9ydCBkaXJlY3RvcnkuCi0JcHJvdGVjdGVkIFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2Ugc2VsZWN0RXhwb3J0RGlyUGFnZTsKLQotCS8vIFRoZSBleHBvcnQgb3B0aW9ucy4KLQlwcm90ZWN0ZWQgRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zID0gbmV3IEV4cG9ydE1TUE9wdGlvbnMoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFdpemFyZCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkgewotCQlyZXR1cm4gV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgPT0gbnVsbCkgewotCQkJc2VsZWN0UHJvY2Vzc1BhZ2UgPSBuZXcgU2VsZWN0UHJvY2Vzc1BhZ2UoKTsKLQkJCXNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlID0gbmV3IFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKCk7Ci0JCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCk7Ci0JCQlzZWxlY3RFeHBvcnREaXJQYWdlID0gbmV3IFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UoKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0UHJvY2Vzc1BhZ2UpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RFeHBvcnRPcHRpb25zUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdEV4cG9ydERpclBhZ2UpOwotCQl9IGVsc2UgewotCQkJTGlzdDxJV2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgQXJyYXlMaXN0PElXaXphcmRQYWdlPigpOwotCi0JCQlJV2l6YXJkUGFnZSBwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdFByb2Nlc3NQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RQcm9jZXNzUGFnZSA9IG5ldyBTZWxlY3RQcm9jZXNzUGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RQcm9jZXNzUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlID0gbmV3IFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RFeHBvcnREaXJQYWdlID0gbmV3IFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0RXhwb3J0RGlyUGFnZSk7Ci0JCQl9Ci0KLQkJCXN1cGVyLmdldE5ld1dpemFyZFBhZ2VzKHdpemFyZFBhZ2VzKTsKLQotCQkJZm9yIChJdGVyYXRvcjxJV2l6YXJkUGFnZT4gaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBpdC5uZXh0KCk7Ci0JCQkJc3VwZXIuYWRkUGFnZSh3aXphcmRQYWdlKTsKLQkJCX0KLQotCQkJd2l6YXJkRXh0ZW5kZXIuaW5pdFdpemFyZFBhZ2VzKHdpemFyZFBhZ2VzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NU1Byb2plY3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCWlmICghIHdpemFyZEV4dGVuZGVyLmNhbkZpbmlzaCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpID09IHNlbGVjdEV4cG9ydERpclBhZ2UKLQkJCQkmJiBzZWxlY3RFeHBvcnREaXJQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2RvRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkb0ZpbmlzaCgpIHsKLQkJcmV0dXJuIGV4cG9ydE1TUChzZWxlY3RQcm9jZXNzUGFnZS5nZXRQcm9jZXNzKCksIGdldEV4cG9ydE9wdGlvbnMoKSwKLQkJCQlFeHBvcnRNU1BTZXJ2aWNlLmdldEluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEV4cG9ydHMgdGhlIHNlbGVjdGVkIHByb2Nlc3MuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0TVNQKFByb2Nlc3MgcHJvY2VzcywgRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zLAotCQkJSUV4cG9ydE1TUFNlcnZpY2Ugc2VydmljZSkgewotCQlpZiAocHJvY2VzcyA9PSBudWxsIHx8IGV4cG9ydE9wdGlvbnMgPT0gbnVsbCB8fCBzZXJ2aWNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUZpbGUgZXhwb3J0RGlyOwotCQlTdHJpbmcgbXNwcm9qZWN0TmFtZTsKLQotCQl0cnkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiZXhwb3J0T3B0aW9ucy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGV4cG9ydE9wdGlvbnMuZ2V0UHVibGlzaFdlYlNpdGUoKSkgewotCQkJCWlmIChzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgIT0gbnVsbCkgewotCQkJCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2Uuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQkJfQotCi0JCQkJaWYgKCFQdWJsaXNoaW5nVXRpbC5oYXNWYWxpZFByb2Nlc3NWaWV3KGNvbmZpZywgcHJvY2VzcykpIHsKLQkJCQkJYm9vbGVhbiBvayA9IEV4cG9ydE1TUFVJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMubWlzc2luZ1Byb2Nlc3NDb250ZW50V2FybmluZ19tc2cpOwotCQkJCQlpZiAoIW9rKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWV4cG9ydERpciA9IGV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCk7Ci0JCQlpZiAoZXhwb3J0RGlyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJImV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQltc3Byb2plY3ROYW1lID0gZXhwb3J0T3B0aW9ucy5nZXRNU1Byb2plY3ROYW1lKCk7Ci0JCQlpZiAobXNwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJleHBvcnRPcHRpb25zLmdldE1TUHJvamVjdE5hbWUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNwbGF5SWxsZWdhbEFyZ3VtZW50RXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgbXNwcm9qZWN0RmlsZU5hbWUgPSBtc3Byb2plY3ROYW1lICsgIi54bWwiOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgbXNwcm9qZWN0RmlsZSA9IG5ldyBGaWxlKGV4cG9ydERpciwgbXNwcm9qZWN0RmlsZU5hbWUpOwotCQlpZiAobXNwcm9qZWN0RmlsZS5leGlzdHMoKSkgewotCQkJYm9vbGVhbiBvayA9IEV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUsCi0JCQkJCQkJTkxTLmJpbmQoRXhwb3J0TVNQVUlSZXNvdXJjZXMub3ZlcndyaXRlVGV4dF9tc2csCi0JCQkJCQkJCQkobmV3IFN0cmluZ1tdIHsgbXNwcm9qZWN0RmlsZU5hbWUsCi0JCQkJCQkJCQkJCWV4cG9ydERpci5nZXRBYnNvbHV0ZVBhdGgoKSB9KSkpOwotCQkJaWYgKCFvaykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBzZXJ2aWNlLmV4cG9ydE1TUHJvamVjdChwcm9jZXNzLCBleHBvcnRPcHRpb25zKTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKAotCQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQkJTkxTLmJpbmQoRXhwb3J0TVNQVUlSZXNvdXJjZXMuY29tcGxldGVkVGV4dF9tc2csCi0JCQkJCQkJCShuZXcgU3RyaW5nW10geyBwcm9jZXNzLmdldE5hbWUoKSwKLQkJCQkJCQkJCQltc3Byb2plY3RGaWxlLmdldEFic29sdXRlUGF0aCgpIH0pKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQlOTFMuYmluZChFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BFcnJvcl9tc2csCi0JCQkJCQkJKG5ldyBTdHJpbmdbXSB7IHByb2Nlc3MuZ2V0TmFtZSgpLAotCQkJCQkJCQkJbXNwcm9qZWN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSB9KSksCi0JCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUEVycm9yX3JlYXNvbiwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcHJvY2VzcyB0bwotCSAqIGV4cG9ydC4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHJvY2Vzc1BhZ2UgZ2V0U2VsZWN0UHJvY2Vzc1BhZ2UoKSB7Ci0JCXJldHVybiBzZWxlY3RQcm9jZXNzUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdGhlIGV4cG9ydCBvcHRpb25zLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZSBnZXRFeHBvcnRPcHRpb25zUGFnZSgpIHsKLQkJcmV0dXJuIHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBwdWJsaXNoaW5nCi0JICogb3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSgpIHsKLQkJcmV0dXJuIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZXhwb3J0Ci0JICogZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlIGdldFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UoKSB7Ci0JCXJldHVybiBzZWxlY3RFeHBvcnREaXJQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydCBvcHRpb25zLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BPcHRpb25zIGdldEV4cG9ydE9wdGlvbnMoKSB7Ci0JCWV4cG9ydE9wdGlvbnMuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihzZWxlY3RFeHBvcnRPcHRpb25zUGFnZQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQlleHBvcnRPcHRpb25zLnNldEV4cG9ydERpcihuZXcgRmlsZShzZWxlY3RFeHBvcnREaXJQYWdlCi0JCQkJLmdldEV4cG9ydERpcmVjdG9yeSgpKSk7Ci0JCWV4cG9ydE9wdGlvbnMuc2V0TVNQcm9qZWN0TmFtZShzZWxlY3RFeHBvcnREaXJQYWdlLmdldE1TUHJvamVjdE5hbWUoKSk7Ci0JCWV4cG9ydE9wdGlvbnMuc2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyhzZWxlY3RFeHBvcnRPcHRpb25zUGFnZQotCQkJCS5nZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzU2VsZWN0aW9uKCkpOwotCi0JCWlmIChzZWxlY3RFeHBvcnRPcHRpb25zUGFnZS5nZXRQdWJsaXNoV2ViU2l0ZVNlbGVjdGlvbigpKSB7Ci0JCQlQdWJsaXNoT3B0aW9ucyBwdWJsaXNoaW5nT3B0aW9ucyA9IHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZQotCQkJCQkuZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQkJCWJvb2xlYW4gcHVibGlzaENvbmZpZyA9IHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlCi0JCQkJCS5nZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCk7Ci0JCQlib29sZWFuIHB1Ymxpc2hQcm9jZXNzID0gc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UKLQkJCQkJLmdldFB1Ymxpc2hQcm9jZXNzU2VsZWN0aW9uKCk7Ci0JCQlwdWJsaXNoaW5nT3B0aW9ucy5zZXRQdWJsaXNoQ29uZmlndXJhdGlvbihwdWJsaXNoQ29uZmlnKTsKLQkJCXB1Ymxpc2hpbmdPcHRpb25zLnNldFB1Ymxpc2hQcm9jZXNzKHB1Ymxpc2hQcm9jZXNzKTsKLQkJCWV4cG9ydE9wdGlvbnMuc2V0UHVibGlzaFdlYlNpdGUocHVibGlzaGluZ09wdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAocHVibGlzaENvbmZpZyB8fCBwdWJsaXNoUHJvY2VzcykpOwotCQkJZXhwb3J0T3B0aW9ucy5zZXRQdWJsaXNoaW5nT3B0aW9ucyhwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCX0gZWxzZSB7Ci0JCQlleHBvcnRPcHRpb25zLnNldFB1Ymxpc2hXZWJTaXRlKGZhbHNlKTsKLQkJCWV4cG9ydE9wdGlvbnMuc2V0UHVibGlzaGluZ09wdGlvbnMobnVsbCk7Ci0JCX0KLQotCQlyZXR1cm4gZXhwb3J0T3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgYWJvdXQgYW4gaWxsZWdhbCBhcmd1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgYXJndW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5SWxsZWdhbEFyZ3VtZW50RXJyb3IoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEV4cG9ydE1TUFVJUmVzb3VyY2VzLmlsbGVnYWxBcmd1bWVudF9tc2csCi0JCQkJKG5ldyBTdHJpbmdbXSB7IG5hbWUgfSkpOwotCQlFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BJbnRlcm5hbEVycm9yX21zZywKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BFcnJvcl9yZWFzb24sCi0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlMmViYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLnByZWZlcmVuY2VzLkV4cG9ydE1TUFVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZSBhbmQKLSAqIGV4cG9ydCBkaXJlY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdGVtcGxhdGVDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gcHJvamVjdE5hbWVDb21ibzsKLQotCXByb3RlY3RlZCBDb21ibyBleHBvcnREaXJDb21ibzsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEV4cG9ydE1TUFVJUmVzb3VyY2VzLnNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX21zX3Byal93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJdGVtcGxhdGVDb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKGNvbXBvc2l0ZSwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMucHJvamVjdE5hbWVMYWJlbF90ZXh0KTsKLQotCQlwcm9qZWN0TmFtZUNvbWJvID0gY3JlYXRlQ29tYm9ib3godGVtcGxhdGVDb21wb3NpdGUsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKHRlbXBsYXRlQ29tcG9zaXRlLCBFeHBvcnRNU1BVSVJlc291cmNlcy5kaXJMYWJlbF90ZXh0KTsKLQotCQlleHBvcnREaXJDb21ibyA9IGNyZWF0ZUNvbWJvYm94KHRlbXBsYXRlQ29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24odGVtcGxhdGVDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nW10gdGVtcGxhdGVOYW1lcyA9IEV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuZ2V0TVNQcm9qZWN0TmFtZXMoKTsKLQkJaWYgKHRlbXBsYXRlTmFtZXMgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWVzLmxlbmd0aCA+IDApIHsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0SXRlbXModGVtcGxhdGVOYW1lcyk7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQodGVtcGxhdGVOYW1lc1swXSk7Ci0JCX0KLQotCQlTdHJpbmdbXSBleHBvcnREaXJzID0gRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5nZXRFeHBvcnREaXJlY3RvcmllcygpOwotCQlpZiAoZXhwb3J0RGlycyAhPSBudWxsICYmIGV4cG9ydERpcnMubGVuZ3RoID4gMCkgewotCQkJZXhwb3J0RGlyQ29tYm8uc2V0SXRlbXMoZXhwb3J0RGlycyk7Ci0JCQlleHBvcnREaXJDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0KLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCQlleHBvcnREaXJDb21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQkJZXhwb3J0RGlyQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXByb2plY3ROYW1lQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlleHBvcnREaXJDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRNU1Byb2plY3ROYW1lKCkubGVuZ3RoKCkgPiAwCi0JCQkJJiYgZ2V0RXhwb3J0RGlyZWN0b3J5KCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNU1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHBvcnREaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBleHBvcnREaXJDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5hZGRNU1Byb2plY3ROYW1lKGdldE1TUHJvamVjdE5hbWUoKSk7Ci0JCUV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuYWRkRXhwb3J0RGlyKGdldEV4cG9ydERpcmVjdG9yeSgpKTsKLQkJbW9kaWZ5TGlzdGVuZXIgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydE9wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZWFmYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkucHJlZmVyZW5jZXMuRXhwb3J0TVNQVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgZXhwb3J0IG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb25maWdDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBwcm9jZXNzVGV4dDsKLQotCXByb3RlY3RlZCBDb21ibyBjb25maWdDb21ibzsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgb3B0aW9uc0NvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaFdlYlNpdGVSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcHVibGlzaE9wdGlvbnNDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaFByb2Nlc3NSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c0NoZWNrQm94OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0RXhwb3J0T3B0aW9uc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RFeHBvcnRPcHRpb25zV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCWNvbmZpZ0NvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLCAyKTsKLQotCQljcmVhdGVMYWJlbChjb25maWdDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0ZWRQcm9jZXNzTGFiZWxfdGV4dCk7Ci0KLQkJcHJvY2Vzc1RleHQgPSBjcmVhdGVUZXh0KGNvbmZpZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29uZmlnQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25MYWJlbF90ZXh0KTsKLQotCQljb25maWdDb21ibyA9IG5ldyBDb21ibyhjb25maWdDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29uZmlnQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJb3B0aW9uc0NvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLCAxKTsKLQotCQlwdWJsaXNoV2ViU2l0ZVJhZGlvQnV0dG9uID0gY3JlYXRlQ2hlY2tib3gob3B0aW9uc0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5wdWJsaXNoV2ViU2l0ZUNoZWNrQm94X3RleHQpOwotCi0JCXB1Ymxpc2hPcHRpb25zQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShvcHRpb25zQ29tcG9zaXRlLCAxKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgcHVibGlzaE9wdGlvbnNDb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAtNTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAxMjsKLQotCQlwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihwdWJsaXNoT3B0aW9uc0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnQnV0dG9uX3RleHQpOwotCi0JCXB1Ymxpc2hQcm9jZXNzUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihwdWJsaXNoT3B0aW9uc0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5wdWJsaXNoUHJvY2Vzc0J1dHRvbl90ZXh0KTsKLQotCQlleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzQ2hlY2tCb3ggPSBjcmVhdGVDaGVja2JveChvcHRpb25zQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0KTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCWlmIChFeHBvcnRNU1BVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hXZWJTaXRlKCkpIHsKLQkJCXB1Ymxpc2hXZWJTaXRlUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gRXhwb3J0TVNQVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoQ29uZmlndXJhdGlvbigpOwotCQlwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHB1Ymxpc2hDb25maWcpOwotCQlwdWJsaXNoUHJvY2Vzc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbighcHVibGlzaENvbmZpZyk7Ci0KLQkJdXBkYXRlUHVibGlzaE9wdGlvbnNCdXR0b25zKCk7Ci0KLQkJZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c0NoZWNrQm94Ci0JCQkJLnNldFNlbGVjdGlvbihFeHBvcnRNU1BVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWNvbmZpZ0NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHVibGlzaFdlYlNpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXVwZGF0ZVB1Ymxpc2hPcHRpb25zQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgQ29uZmlndXJhdGlvbiBDb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb25maWdDb21ibyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJU3RyaW5nW10gY29udGV4dE5hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldENvbnRleHRzKHByb2Nlc3MpOwotCQljb25maWdDb21iby5zZXRJdGVtcyhjb250ZXh0TmFtZXMpOwotCQlTdHJpbmcgZGVmYXVsdENvbnRleHQgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZ2V0TmFtZSgpOwotCQljb25maWdDb21iby5zZXRUZXh0KGRlZmF1bHRDb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgcmFkaW8gYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQdWJsaXNoT3B0aW9uc0J1dHRvbnMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCk7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlwdWJsaXNoUHJvY2Vzc1JhZGlvQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2Vzcykgb2JqOwotCQkJcHJvY2Vzc1RleHQuc2V0VGV4dChwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQl1cGRhdGVDb25maWdDb21ibyhwcm9jZXNzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCkKLQkJCQkmJiBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuc2l6ZSgpID09IDApIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMubWlzc2luZ1ZpZXdFcnJvcl9tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2UjZ2V0TmV4dFBhZ2VEYXRhKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5leHRQYWdlRGF0YSgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCUlXaXphcmRQYWdlIG5leHRQYWdlID0gbnVsbDsKLQotCQlpZiAoZ2V0UHVibGlzaFdlYlNpdGVTZWxlY3Rpb24oKSkgewotCQkJbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZSgpOwotCQl9IGVsc2UgewotCQkJbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZSgpLmdldE5leHRQYWdlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV4dFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlTdHJpbmcgY29uZmlnTmFtZSA9IGNvbmZpZ0NvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9uKGxpYnJhcnksIGNvbmZpZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggd2ViIHNpdGUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaFdlYlNpdGVSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoUHJvY2Vzc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hQcm9jZXNzUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBjb25maWd1cmF0aW9uIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c0NoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoV2ViU2l0ZShnZXRQdWJsaXNoV2ViU2l0ZVNlbGVjdGlvbigpKTsKLQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRQdWJsaXNoQ29uZmlndXJhdGlvbihnZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCkpOwotCQlFeHBvcnRNU1BVSVByZWZlcmVuY2VzCi0JCQkJLnNldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c1NlbGVjdGlvbigpKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5zZXRDb25maWd1cmF0aW9uTmFtZShjb25maWcuZ2V0TmFtZSgpKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjMzA3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVJlc291cmNlczsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyBmb3IgdGhlCi0gKiBwcm9jZXNzIHdlYiBzaXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbXNfcHJqX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZDUyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBleHBvcnRpbmcgcHJvY2Vzc2VzIHRvIE1pY3Jvc29mdCBQcm9qZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyNzRlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgUmljaCBUZXh0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDMxYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZjOWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLkV4cG9ydE1TUFBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBleHBvcnRtc3AuamFyCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMmU0NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLmV4cG9ydG1zcC5qYXIgPSBzcmMvCi1vdXRwdXQuZXhwb3J0bXNwLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGV4cG9ydG1zcC5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZS8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjRlZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgV2l6YXJkcwotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdAotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0LgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2N2UyZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi08IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5FeHBvcnRNU1BXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01TUHJvamVjdC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Aud2l6YXJkcy5FeHBvcnRUb01TUHJvamVjdFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJleHBvcnRNU1BXaXphcmQiCi0gICAgICAgICBuYW1lPSJFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0V4cG9ydE1TUFdpemFyZC5leHNkIiAvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Aud2l6YXJkcy5FeHBvcnRUb01TUHJvamVjdFdpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0tLT4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmM3MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGFuIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BFeGNlcHRpb24gZXh0ZW5kcyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MjMxODk3MDA1NjE4MDYyNjJMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSwgZXJyb3JNc2cpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWM3MjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UHJvY2Vzc09wdGlvbnM7Ci0KLS8qKgotICogVGhlIGV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSA3LjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUE9wdGlvbnMgZXh0ZW5kcyBFeHBvcnRQcm9jZXNzT3B0aW9ucyB7Ci0KLQlwcml2YXRlIFN0cmluZyBtc3Byb2plY3ROYW1lOwotCi0JLyoqCi0JICogR2V0cyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleHBvcnRlZCBNaWNyb3NvZnQgUHJvamVjdCBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNU1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gbXNwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBleHBvcnRlZCBNaWNyb3NvZnQgUHJvamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1TUHJvamVjdE5hbWUoU3RyaW5nIG1zcHJvamVjdE5hbWUpIHsKLQkJdGhpcy5tc3Byb2plY3ROYW1lID0gbXNwcm9qZWN0TmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzNGQyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRNU1BQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0TVNQUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzhjOTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0TVNQUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEV4cG9ydE1TUFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4cG9ydE1TUFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQVGFza19uYW1lOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRXhwb3J0TVNQUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjI3MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFNlcnZpY2UgaW1wbGVtZW50cyBJRXhwb3J0TVNQU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydE1TUFNlcnZpY2UgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0TVNQU2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRXhwb3J0TVNQU2VydmljZS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IEV4cG9ydE1TUFNlcnZpY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuSUV4cG9ydE1TUFNlcnZpY2UjZXhwb3J0TVNQcm9qZWN0KFByb2Nlc3MsCi0JICogICAgICBFeHBvcnRNU1BPcHRpb25zKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydE1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsCi0JCQlFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMpIHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBFeHBvcnRNU1BYTUxTZXJ2aWNlKCkuZXhwb3J0KHByb2Nlc3MsIGV4cG9ydE9wdGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZmExMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIEV4cG9ydCBQcm9qZWN0IFBsYW4gU2VydmljZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTAzNjg5ODY4NTcyNDgwMzU5TDsKLQotCS8qKgotCSAqIFRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZSByb290Q2F1c2U7Ci0KLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJdGhpcyhyb290Q2F1c2UsIHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0JCXRoaXMuZXJyb3JNc2cgPSBlcnJvck1zZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKSB7Ci0JCXJldHVybiByb290Q2F1c2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTE9wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWVmMDBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlcjsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBmaWxlIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BYTUxPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoZWRfdXJsOwotCi0JcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQWE1MT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2hlZCBVUkwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCXJldHVybiBwdWJsaXNoZWRfdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiwgaWYgYW55LCB0aGF0IG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWV4Y2VwdGlvbiA9IG51bGw7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0TVNQUmVzb3VyY2VzLmV4cG9ydE1TUFRhc2tfbmFtZSk7Ci0JCXRyeSB7Ci0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0JCQlwdWJsaXNoZWRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoZWRVcmwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCXB1Ymxpc2hNZ3IgPSBudWxsOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MzExYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoSFRNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBQbGFuIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIEJ1Z3MgZml4ZWQ6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwODkKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwODYKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwOTUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcyNjUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUxNTUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY5NTkKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTczMjEKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTkyMzAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIzMzYKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg4MDEgZml4IGZvcgotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Njk1MQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzQyOAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQWE1MU2VydmljZSB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IEV4cG9ydE1TUFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIEFsbCBUYXNrcyByZWZlcmVuY2VkIGJ5IHRoZSBleHBvcnRlZCBQcm9qZWN0IFRlbXBsYXRlLgotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgcm9sZXNUb1VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgdGFza1VpZFRvV2JzV2FwcGVyUGF0aE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd2JzV2FwcGVyUGF0aFRvTG9jYWxQcmVkTGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd2JzR3VpZFRvVGFza1VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd2JzV3JhcHBlclBhdGhUb1ByZWRMaXN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIFRoZSBuYW1lIG9mIHRoZSBjb250ZW50IGZvbGRlci4gVGhpcyB3aWxsIGJlIG5hbWVkIGFmdGVyIHRoZSBjb250ZXh0LgotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRGb2xkZXJOYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgYWJUYXJnZXREaXI7Ci0KLQkvLyBJZiB0cnVlLCBvbmx5IGV4cG9ydCBicmVha2Rvd24gZWxlbWVudHMgd2l0aCAnaXNQbGFubmVkJyBhdHRyaWJ1dGVzIHNldAotCS8vIHRvIHRydWUuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRFbGVtZW50czsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQ29udGVudFNpdGUgPSBmYWxzZTsKLQotCXByaXZhdGUgaW50IHRhc2tfdWlkID0gMTsKLQotCXByaXZhdGUgaW50IHJlc191aWQgPSAxOwotCi0JcHJpdmF0ZSBpbnQgYXNzaWduX3VpZCA9IDE7Ci0KLQlwcm90ZWN0ZWQgTXNwcm9qZWN0RmFjdG9yeSBwcm9qZWN0RmFjdG9yeSA9IE1zcHJvamVjdEZhY3RvcnkuZUlOU1RBTkNFOwotCi0JLy8gVGhlIHByb2Nlc3MgdG8gYmUgZXhwb3J0ZWQuCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIHByb2Nlc3NDb25maWc7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3Rvcnk7Ci0KLQkvLyBUaGUgcHJvY2VzcyBjb25maWd1cmF0b3IgZm9yIGZpbHRlcmluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYQotCS8vIGNvbmZpZ3VyYXRpb24uCi0JcHJpdmF0ZSBQcm9jZXNzQ29uZmlndXJhdG9yIGJyZWFrZG93bkVsZW1lbnRGaWx0ZXI7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHdic0NvbnRlbnRQcm92aWRlcjsKLQotCS8vIE1hcCBwcm9jZXNzZXMgdG8gc3VwcHJlc3Npb24gb2JqZWN0cy4KLQlwcml2YXRlIE1hcCBzdXBwcmVzc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBUaGUgc3VwcHJlc3Npb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcHJvY2VzcyB0byBiZQotCS8vIGV4cG9ydGVkLgotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQkvLyBUaGUgV0JTIGVsZW1lbnQgcGF0aHMuCi0JcHJpdmF0ZSBTdGFjayBlbGVtZW50UGF0aHMgPSBuZXcgU3RhY2soKTsKLQotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudEVsZW1lbnRQYXRoOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgY3VycmVudFByZWRMaXN0OwotCQotCXByaXZhdGUgSGFzaE1hcDxUYXNrLCBXb3JrQnJlYWtkb3duRWxlbWVudD4gdGFza1RvV2JlTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQWE1MU2VydmljZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHBvcnQgYSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QgWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0KFByb2Nlc3MgcHJvY2VzcywgRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zKQotCQkJdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gewotCQlTdHJpbmcgbXNwcm9qZWN0TmFtZSA9IGV4cG9ydE9wdGlvbnMuZ2V0TVNQcm9qZWN0TmFtZSgpOwotCQlGaWxlIGV4cG9ydERpciA9IGV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCk7Ci0JCXB1Ymxpc2hDb250ZW50U2l0ZSA9IGV4cG9ydE9wdGlvbnMuZ2V0UHVibGlzaFdlYlNpdGUoKTsKLQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBleHBvcnRPcHRpb25zLmdldFB1Ymxpc2hpbmdPcHRpb25zKCk7Ci0JCXByb2Nlc3NDb25maWcgPSBleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBleHBvcnRpbmcgdG8gTWljcm9zb2Z0IFByb2plY3QhIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHByb2Nlc3MgICAgICAgICAgPSAiICsgcHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbmZpZ3VyYXRpb24gICAgPSAiICsgcHJvY2Vzc0NvbmZpZyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIG1zcHJvamVjdE5hbWUgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBtc3Byb2plY3ROYW1lKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCB0YXJnZXREaXIgICAgICAgICAgICAgICAgID0gIiArIGV4cG9ydERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHB1Ymxpc2hDb25maWdPcHRpb25zICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCX0KLQotCQkvLyBjb25zdHJ1Y3QgdGhlIGV4cG9ydCB0YXJnZXQgeG1sIGZpbGUgcGF0aAotCQlpZiAoIWV4cG9ydERpci5leGlzdHMoKSkgewotCQkJZXhwb3J0RGlyLm1rZGlycygpOwotCQl9Ci0JCWFiVGFyZ2V0RGlyID0gZXhwb3J0RGlyLmdldEFic29sdXRlUGF0aCgpOwotCQlQYXRoIGV4cG9ydFBhdGggPSBuZXcgUGF0aChhYlRhcmdldERpcik7Ci0JCWJvb2xlYW4gZW5kV2l0aFhtbEV4dCA9IG1zcHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBvcnRQYXRoU3RyID0gKGV4cG9ydFBhdGguYXBwZW5kKGVuZFdpdGhYbWxFeHQgPyBtc3Byb2plY3ROYW1lCi0JCQkJOiAobXNwcm9qZWN0TmFtZSArICIueG1sIikpKS50b09TU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZXhwb3J0UGF0aFN0ciAgICAgICAgICAgICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBleHBvcnRQYXRoU3RyKTsKLQotCQkvLyBjb25zdHJ1Y3QgdGhlIGVtcHR5IE1TIHByb2plY3QgeG1sIHRlbXBsYXRlIGZpbGUgcGF0aAotCQlTdHJpbmcgZW1wdHlUZW1wbGF0ZUZpbGUgPSBFeHBvcnRNU1BQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEluc3RhbGxQYXRoKCkKLQkJCQkrICJ0ZW1wbGF0ZSIgLy8kTk9OLU5MUy0xJAotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAibXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBlbXB0eVRlbXBsYXRlRmlsZSAgICAgICAgICAgICA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGVtcHR5VGVtcGxhdGVGaWxlKTsKLQotCQkvLyBjb3B5IHRoZSBlbXB0eSB0ZW1wbGF0ZSBNUyBwcm9qZWN0IHhtbCBmaWxlIHRvIHRoZSBleHBvcnQgdGFyZ2V0Ci0JCXRyeSB7Ci0JCQlGaWxlIHNyYyA9IG5ldyBGaWxlKGVtcHR5VGVtcGxhdGVGaWxlKTsKLQkJCUZpbGUgZHN0ID0gbmV3IEZpbGUoZXhwb3J0UGF0aFN0cik7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmMsIGRzdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSShleHBvcnRQYXRoU3RyKTsKLQotCQl0cnkgewotCi0JCQlYTUxSZXNvdXJjZSByZXMgPSBuZXcgTXNwcm9qZWN0UmVzb3VyY2VJbXBsKGZpbGVVUkkpOwotCQkJcmVzLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJcmVzLmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMubG9hZChudWxsKTsKLQotCQkJRG9jdW1lbnRSb290IGRvY1Jvb3QgPSAoRG9jdW1lbnRSb290KSByZXMuZ2V0RU9iamVjdCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9qZWN0ID0gKFByb2plY3QpIGRvY1Jvb3QuZ2V0UHJvamVjdCgpOwotCi0JCQl0YXNrVG9XYmVNYXAgPSBuZXcgSGFzaE1hcDxUYXNrLCBXb3JrQnJlYWtkb3duRWxlbWVudD4oKTsKLQkJCWlmICghIGdlbmVyYXRlTVNQcm9qZWN0KHByb2Nlc3MsIHByb2plY3QsIGV4cG9ydE9wdGlvbnMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXMuc2F2ZShudWxsKTsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnRNU1Byb2plY3QocHJvamVjdCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgRXhwb3J0TVNQRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0cyBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QKLQkgKiBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBhIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdAotCSAqIEBwYXJhbSBleHBvcnRPcHRpb25zCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgdXNlciBzcGVjaWZpZWQgZXhwb3J0IG9wdGlvbnMKLQkgKiBAdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZU1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsIFByb2plY3QgcHJvamVjdCwKLQkJCUV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCS8vIEdldCB0aGUgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlCi0JCQkJLy8gcHJvY2Vzcy4KLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQljb25maWcgPSAoKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzcykuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQljb25maWcgPSAoKENhcGFiaWxpdHlQYXR0ZXJuKSBwcm9jZXNzKS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENyZWF0ZSB0aGUgc3ViIGZvbGRlciB0byBzdG9yZSB0aGUgcHVibGlzaGVkIEhUTUwgY29udGVudCBmaWxlcy4KLQkJCWNvbnRlbnRGb2xkZXJOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQotCQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBleHBvcnRPcHRpb25zCi0JCQkJCS5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQkJaWYgKHB1Ymxpc2hDb250ZW50U2l0ZSAmJiBwdWJsaXNoaW5nT3B0aW9ucyAhPSBudWxsKSB7Ci0JCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoZXhwb3J0T3B0aW9ucy5nZXRFeHBvcnREaXIoKSwKLQkJCQkJCWNvbnRlbnRGb2xkZXJOYW1lKTsKLQkJCQlpZiAoIWNvbnRlbnREaXIuZXhpc3RzKCkpIHsKLQkJCQkJY29udGVudERpci5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHZpZUJ1aWxkZXIgbWV0aG9kQ29uZmlnID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBjb25maWcpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB2aWVCdWlsZGVyIHB1Ymxpc2hDb25maWdPcHRpb25zID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCQkJfQotCi0JCQkJLy8gUHVibGlzaCB0aGUgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uLgotCQkJCWlmICghcHVibGlzaENvbmZpZ3VyYXRpb24oY29udGVudERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgY29uZmlnLAotCQkJCQkJcHVibGlzaGluZ09wdGlvbnMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSBleHBvcnRPcHRpb25zCi0JCQkJCS5nZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKCk7Ci0KLQkJCS8vIEdlbmVyYXRlIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgZmlsZS4KLQkJCS8vIHBvcHVsYXRlIHRoZSBwcm9qZWN0J3MgYXR0cmlidXRlcwotCQkJcHJvamVjdC5zZXROYW1lKHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCXByb2plY3Quc2V0U3RhcnREYXRlKG5ldyBEYXRlKCkpOwotCQkJcHJvamVjdC5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoKSk7Ci0JCQlwcm9qZWN0LnNldExhc3RTYXZlZChuZXcgRGF0ZSgpKTsKLQkJCXByb2plY3Quc2V0RmluaXNoRGF0ZShuZXcgRGF0ZSgpKTsKLQkJCQotCQkJc2V0UHJvamVjdEV4dGVuZGVkQXR0cmlidXRlcyhwcm9qZWN0KTsKLQotCQkJZ2VuZXJhdGVPcGVyYXRvblJ1bihwcm9jZXNzLCBwcm9qZWN0LCBjb25maWcpOwotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVPcGVyYXRvblJ1bihQcm9jZXNzIHByb2Nlc3MsIFByb2plY3QgcHJvamVjdCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZmluYWwgUHJvY2VzcyBmcHJvY2VzcyA9IHByb2Nlc3M7Ci0JCWZpbmFsIFByb2plY3QgZnByb2plY3QgPSBwcm9qZWN0OwotCQlmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGZjb25maWcgPSBjb25maWc7Ci0JCQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEV4cG9ydE1TUFJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQlnZW5lcmF0ZShmcHJvY2VzcywgZnByb2plY3QsIGZjb25maWcpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtRGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJcG1EaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKFByb2Nlc3MgcHJvY2VzcywgUHJvamVjdCBwcm9qZWN0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBFeGNlcHRpb24gewotCQlnZW5lcmF0ZVByb2plY3RSZXNvdXJjZXMocHJvY2VzcywgY29uZmlnLCBwcm9qZWN0KTsKLQkJZ2VuZXJhdGVQcm9qZWN0VGFza3MocHJvY2VzcywgY29uZmlnLCBwcm9qZWN0KTsKLQkJZ2VuZXJhdGVMaW5rcyhwcm9jZXNzLCBwcm9qZWN0KTsKLQkJZ2VuZXJhdGVXUERzKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0IG9wdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydE9wdGlvbnMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiB1c2VyIHNwZWNpZmllZCBleHBvcnQgb3B0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cG9ydE9wdGlvbnMoRXhwb3J0T3B0aW9ucyBleHBvcnRPcHRpb25zKSB7Ci0JCUJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyA9IChCb29sZWFuKSBleHBvcnRPcHRpb25zCi0JCQkJLmdldChFeHBvcnRPcHRpb25zLkVYUE9SVF9PTkxZX1BMQU5ORURfRUxFTUVOVFMpOwotCQl0aGlzLmV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgcHJvamVjdCByZXNvdXJjZXMgZm9yIGFsbCB0aGUgdGFzayBkZXNjcmlwdG9ycyBpbiB0aGUKLQkgKiBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIHByb2Nlc3MKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHVzZWQgdG8gZmlsdGVyIHRoZSB3b3JrIGJyZWFrZG93bgotCSAqICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgYW4gb2JqZWN0IHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgTWljcm9zb2Z0IFByb2plY3QgV0JTCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgTWljcm9zb2Z0IFByb2plY3QgV0JTCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2VzKFByb2Nlc3MgcHJvY2VzcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcpKTsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCi0JCQlMaXN0IGVsZW1lbnRzID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA+IDApIHsKLQkJCQlnZW5lcmF0ZVByb2plY3RSZXNvdXJjZShjb250ZW50UHJvdmlkZXIsCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcHJvY2VzcywgcHJvamVjdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBwcm9qZWN0IHJlc291cmNlcyBmb3IgYWxsIHRoZSByb2xlIGRlc2NyaXB0b3JzIGluIHRoZQotCSAqIHByb2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQsIFByb2plY3QgcHJvamVjdCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCXx8IGJyZWFrZG93bkVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJfHwgKGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgJiYgIWJyZWFrZG93bkVsZW1lbnQKLQkJCQkJCS5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWFkZFJlc291cmNlKGJyZWFrZG93bkVsZW1lbnQsIHByb2plY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhicmVha2Rvd25FbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IHByb3ZpZGVyLmdldFZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQlhZGRSZXNvdXJjZSgoQnJlYWtkb3duRWxlbWVudCkgdmFsdWUsIHByb2plY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJYWRkUmVzb3VyY2UoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHByb2plY3QpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlPYmplY3QgdmFsdWUgPSBwcm92aWRlci5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoY29udGVudFByb3ZpZGVyLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHZhbHVlLCBwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWdlbmVyYXRlUHJvamVjdFJlc291cmNlKGNvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLy8gZm9yIGVhY2ggUm9sZURlc2NyaXB0b3IsIGNyZWF0ZSBhIE1TIFByb2plY3QgcmVzb3VyY2UKLQkvLyBmb3IgdGhlIFJvbGVEZXNjcmlwdG9yIGFuZCBpdHMgdW5kZXJseWluZyByb2xlLCByZW1lbWJlciB0aGUgYXNzaWduZWQKLQkvLyByZXNfdWlkCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2UoQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBQcm9qZWN0IHByb2opCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCEoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdW5kZXJseWluZyByb2xlIG9mIHRoaXMgcm9sZURlc2NyaXB0b3IKLQkJLy8gYW5kIHNraXAgdGhlIGNyZWF0aW9uIGlmIGEgcmVzb3VyY2UgZm9yIHRoZSByb2xlIGFscmVhZHkgZXhpc3RzCi0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBicmVha2Rvd25FbGVtZW50OwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBoYW5kbGUgUm9sZURlc2NyaXB0b3IgPSAiICsgcm9sZURlc2NyaXB0b3IpOyAvLyROT04tTkxTLTEkCi0JCVJvbGUgcmVmX2VkUm9sZSA9IHJvbGVEZXNjcmlwdG9yLmdldFJvbGUoKTsKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaGFuZGxlIFJlZi1lZCBSb2xlID0gIiArIHJlZl9lZFJvbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2hlY2sgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IHJlc291cmNlIGJhc2VkIG9uIFJvbGVEZXNjcmlwdG9yJ3MgZGlzcGx5Ci0JCS8vIG5hbWUKLQkJYm9vbGVhbiBuZXdSRFJlc291cmNlID0gdHJ1ZTsKLQkJU3RyaW5nIHJkUmVzb3VyY2VOYW1lID0gZ2V0RGlzcGxheU5hbWUocm9sZURlc2NyaXB0b3IpOwotCQlpZiAocm9sZXNUb1VpZE1hcC5nZXQocmRSZXNvdXJjZU5hbWUpICE9IG51bGwpIHsKLQkJCW5ld1JEUmVzb3VyY2UgPSBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyByZXNvdXJjZSBiYXNlZCBvbiBhc3NvY2lhdGVkIHJvbGUncwotCQkvLyBkaXNwbHkgbmFtZQotCQlib29sZWFuIG5ld1JvbGVSZW91cmNlID0gZmFsc2U7Ci0JCVN0cmluZyByb2xlUmVzb3VyY2VOYW1lID0gbnVsbDsKLQkJaWYgKHJlZl9lZFJvbGUgIT0gbnVsbAotCQkJCSYmIHJvbGVzVG9VaWRNYXAKLQkJCQkJCS5nZXQoKHJvbGVSZXNvdXJjZU5hbWUgPSBnZXREaXNwbGF5TmFtZShyZWZfZWRSb2xlKSkpID09IG51bGwKLQkJCQkmJiAhcm9sZVJlc291cmNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHJkUmVzb3VyY2VOYW1lKSkgewotCQkJbmV3Um9sZVJlb3VyY2UgPSB0cnVlOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoZSBSb2xlRGVzY3JpcHRvcgotCQlpZiAobmV3UkRSZXNvdXJjZSkgewotCQkJUmVzb3VyY2UgYVJlcyA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZVJlc291cmNlKCk7Ci0KLQkJCWFSZXMuc2V0VUlEKEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlhUmVzLnNldElEKEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlhUmVzLnNldE5hbWUocmRSZXNvdXJjZU5hbWUpOwotCQkJcHJvai5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpLmFkZChhUmVzKTsKLQotCQkJcm9sZXNUb1VpZE1hcC5wdXQocmRSZXNvdXJjZU5hbWUsIEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlyZXNfdWlkKys7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSByZXNvdXJjZSBmb3IgdGhlIHVuZGVybHlpbmcgYXNzb2NpYXRlZCByb2xlIHRvbwotCQlpZiAobmV3Um9sZVJlb3VyY2UpIHsKLQkJCVJlc291cmNlIGFSZXMgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVSZXNvdXJjZSgpOwotCi0JCQlhUmVzLnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXRJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXROYW1lKHJvbGVSZXNvdXJjZU5hbWUpOwotCQkJcHJvai5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpLmFkZChhUmVzKTsKLQotCQkJcm9sZXNUb1VpZE1hcC5wdXQocm9sZVJlc291cmNlTmFtZSwgQmlnSW50ZWdlci52YWx1ZU9mKHJlc191aWQpKTsKLQkJCXJlc191aWQrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgTVMgUHJvamVjdCBXQlMgZm9yIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5Ci0JICogcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBwcm9jZXNzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiB1c2VkIHRvIGZpbHRlciB0aGUgd29yayBicmVha2Rvd24KLQkgKiAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdlbmVyYXRpbmcgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFRhc2tzKFByb2Nlc3MgcHJvY2VzcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTYXZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGV4cG9ydGVkIHByb2Nlc3MuCi0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0KLQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl0cnkgewotCQkJLy8gQWRkIHRoZSBzdXBwcmVzc2lvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzIHRvIGJlCi0JCQkvLyBleHBvcnRlZAotCQkJLy8gdG8gdGhlIHN1cHByZXNzaW9uIG1hcC4KLQkJCXN1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKHByb2Nlc3MpOwotCQkJc3VwcHJlc3Npb25NYXAucHV0KHByb2Nlc3MsIHN1cHByZXNzaW9uKTsKLQotCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWJyZWFrZG93bkVsZW1lbnRGaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcpOwotCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGJyZWFrZG93bkVsZW1lbnRGaWx0ZXIpOwotCi0JCQl3YnNDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCXdic0FkYXB0ZXJGYWN0b3J5KTsKLQotCQkJLy8gdGVzdAotCQkJLy8gZW51bWVyYXRlUHJvY2Vzc1ByZWRlY2Vzc29yTGlzdHMoKTsKLQotCQkJY3VycmVudEVsZW1lbnQgPSBwcm9jZXNzOwotCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCWdlbmVyYXRlUHJvamVjdFRhc2sod2JzQ29udGVudFByb3ZpZGVyLAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHByb2Nlc3MsIDEsIHByb2plY3QpOwotCQkJfSBlbHNlIHsKLQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCWlmIChicmVha2Rvd25FbGVtZW50cy5zaXplKCkgPiAwKSB7Ci0JCQkJCWdlbmVyYXRlUHJvamVjdFRhc2sod2JzQ29udGVudFByb3ZpZGVyLAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBwcm9jZXNzLCAxLCBwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKHN1cHByZXNzaW9uTWFwICE9IG51bGwpIHsKLQkJCQlzdXBwcmVzc2lvbk1hcC5jbGVhcigpOwotCQkJCXN1cHByZXNzaW9uTWFwID0gbnVsbDsKLQkJCX0KLQkJCWlmICh3YnNDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXdic0NvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW51bWVyYXRlUHJvY2Vzc1ByZWRlY2Vzc29yTGlzdHMoKSB7Ci0JCS8vIFdCUyB0cmVlCi0JCUl0ZXJhdG9yIHdic1RyZWVJdGVyYXRvciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSwgcHJvY2Vzcyk7Ci0JCU9iamVjdCBvYmo7Ci0JCXdoaWxlICh3YnNUcmVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlvYmogPSB3YnNUcmVlSXRlcmF0b3IubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0cmVlSXRlcmF0b3I6ICIgKyBvYmopOyAvLyROT04tTkxTLTEkCi0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHdic0FkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlQcmVkZWNlc3Nvckxpc3QgcHJlZExpc3QgPSBhZGFwdGVyLmdldFByZWRlY2Vzc29ycygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGUgPSAoSUJTSXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBwcmVkTGlzdDogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHVud3JhcHBlZFByZWRMaXN0OiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgTWljcm9zZnQgUHJvamVjdCB0YXNrIGZvciBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBwcm92aWRlcgotCSAqIEBwYXJhbSBicmVha2Rvd25FbGVtZW50Ci0JICogICAgICAgICAgICBhIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHN0ckJ1ZgotCSAqICAgICAgICAgICAgYSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgWE1MCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0VGFzaygKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCU9iamVjdCBlbGVtZW50T3JXcmFwcGVyLCBpbnQgdGFza09MZXZlbCwgUHJvamVjdCBwcm9qKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCS51bndyYXAoZWxlbWVudE9yV3JhcHBlcik7Ci0KLQkJLy8gbm90IHJlYWxseSBuZWNjZXNzYXJ5IGhlcmUKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKQotCQkJCXx8IChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmICFicmVha2Rvd25FbGVtZW50Ci0JCQkJCQkuZ2V0SXNQbGFubmVkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGlzU3ViVGFza3NQbGFubmVkID0gZmFsc2U7Ci0JCWlmIChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmIGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmIGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhlbGVtZW50T3JXcmFwcGVyKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQkJfHwgKChBY3Rpdml0eSkgd3JhcHBlZEVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudDsKLQkJCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJCQl8fCBkZXNjcmlwdG9yLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgdGFzayBmb3IgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCS8vIGRlY2lkZWQganVzdCB0byBjaGVjayB0aGUgaXNQbGFubmVkIGZsYWcgb24gdGhlIFdCUwotCQlib29sZWFuIGlzUGxhbm5lZFRhc2sgPSBicmVha2Rvd25FbGVtZW50LmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpOwotCQlUYXNrIG5ld1Rhc2sgPSBudWxsOwotCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgfHwgZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCSYmIGlzUGxhbm5lZFRhc2spIHsKLQkJCWJvb2xlYW4gc3VwcHJlc3NlZCA9IGlzU3VwcHJlc3NlZChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCW5ld1Rhc2sgPSBhZGRUYXNrKGVsZW1lbnRPcldyYXBwZXIsIHRhc2tPTGV2ZWwsIHByb2opOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgZXhwb3J0IHBsYW5uZWQgb25seSB3YnMsIHRoZW4gd2UgbmVlZCB0byBkbyB0aGUgcm9sZSByb2xsdXAKLQkJLy8gY2FsY3VsYXRpb24KLQkJaWYgKGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgJiYgbmV3VGFzayAhPSBudWxsCi0JCQkJJiYgYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJJiYgY29udGVudFByb3ZpZGVyICE9IG51bGwgJiYgIWlzU3ViVGFza3NQbGFubmVkKSB7Ci0JCQlBcnJheUxpc3Qgcm9sbHVwUm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlib29sZWFuIHJiID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoY29udGVudFByb3ZpZGVyLAotCQkJCQlicmVha2Rvd25FbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkvLyBpZiB0aGUgd2hvbGUgc3VidHJlZSBvZiB0aGUgYnJlYWtkb3duRWxlbW50IGlzIG5vdCBwbGFubmVkCi0JCQkvLyB0aGVuIHJvbGwgdXAgYWxsIHRoZSByb2xlcwotCQkJaWYgKCFyYikgewotCQkJCUhhc2hTZXQgcm9sZXNTZXQgPSBuZXcgSGFzaFNldChyb2xsdXBSb2xlcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZXNTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyByb2xlTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlhZGRBc3NpZ25tZW50KHJvbGVOYW1lLCBuZXdUYXNrLmdldFVJRCgpLmludFZhbHVlKCksIHByb2opOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGV4cG9ydCB0aGUgbmV4dCBsZXZlbCB3YnMKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQllbGVtZW50UGF0aHMucHVzaChicmVha2Rvd25FbGVtZW50LmdldEd1aWQoKSk7Ci0JCQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIKLQkJCQkJCS5nZXRFbGVtZW50cyhlbGVtZW50T3JXcmFwcGVyKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJCQkJLy8gZ2V0IHRoZSBjdXJyZW50IGVsZW1lbnRPcldyYXBwZXIgYW5kIHRoZSBoaWVyYXJjYWwgZ3VpZAotCQkJCQkvLyBwYXRoIHRvIGl0Ci0JCQkJCWN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2VsZW1lbnRQYXRocy5zaXplKCldOwotCQkJCQllbGVtZW50UGF0aHMudG9BcnJheShwYXRocyk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBwYXRoU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZChwYXRoc1tqXSArICIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJT2JqZWN0IHdyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQkJCXBhdGhTdHIuYXBwZW5kKCgoQnJlYWtkb3duRWxlbWVudCkgd3JhcHBlZCkuZ2V0R3VpZCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGhTdHIuYXBwZW5kKCgoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudEVsZW1lbnQpCi0JCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQl9Ci0JCQkJCWN1cnJlbnRFbGVtZW50UGF0aCA9IHBhdGhTdHIudG9TdHJpbmcoKTsKLQkJCQkJLy8gaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIiBwYXRoOiAiICsKLQkJCQkJLy8gY3VycmVudEVsZW1lbnRQYXRoKTsKLQotCQkJCQlnZW5lcmF0ZVByb2plY3RUYXNrKGNvbnRlbnRQcm92aWRlciwgZWxlbWVudCwKLQkJCQkJCQl0YXNrT0xldmVsICsgMSwgcHJvaik7Ci0JCQkJfQotCQkJCWdlbmVyYXRlTGlua3MocHJvY2VzcywgcHJvaik7Ci0JCQkJZWxlbWVudFBhdGhzLnBvcCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgc3VwcHJlc3NlZCB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluCi0JICogaXRzIG93bmluZyBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdAotCSAqIEByZXR1cm4gPG9jZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBhIHN1cHByZXNzZWQgd29yayBicmVha2Rvd24KLQkgKiAgICAgICAgIGVsZW1lbnQgaW4gaXRzIG93bmluZyBwcm9jZXNzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVzY3JpcHRvciA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgKChEZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlQcm9jZXNzIG93bmluZ1Byb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mob2JqZWN0KTsKLQkJCVN1cHByZXNzaW9uIG93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbiA9IChTdXBwcmVzc2lvbikgc3VwcHJlc3Npb25NYXAKLQkJCQkJLmdldChvd25pbmdQcm9jZXNzKTsKLQkJCWlmIChvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24gPT0gbnVsbCkgewotCQkJCW93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihvd25pbmdQcm9jZXNzKTsKLQkJCQlzdXBwcmVzc2lvbk1hcC5wdXQob3duaW5nUHJvY2Vzcywgb3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uKTsKLQkJCX0KLQkJCWlmIChvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvd25pbmdQcm9jZXNzICE9IHByb2Nlc3MKLQkJCQkJJiYgb2JqZWN0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQllbGVtZW50UGF0aHMucHVzaCgoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldEd1aWQoKSk7Ci0JCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2VsZW1lbnRQYXRocy5zaXplKCldOwotCQkJCWVsZW1lbnRQYXRocy50b0FycmF5KHBhdGhzKTsKLQkJCQlPYmplY3Qgd3JhcHBlciA9IHN1cHByZXNzaW9uLmdldE9iamVjdEJ5UGF0aChwYXRocywKLQkJCQkJCXdic0FkYXB0ZXJGYWN0b3J5KTsKLQkJCQllbGVtZW50UGF0aHMucG9wKCk7Ci0JCQkJcmV0dXJuIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZCh3cmFwcGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRhc2sgdG8gYSBNaWNyb3NvZnQgUHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHRhc2tPTGV2ZWwKLQkgKiAgICAgICAgICAgIHRoZSBvdXRsaW5lIGxldmVsCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIGEgTWljcm9zb2Z0IFByb2plY3Qgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgbmV3bHkgYWRkZWQgdGFzawotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgVGFzayBhZGRUYXNrKE9iamVjdCBlbGVtZW50T3JXcmFwcGVyLCBpbnQgdGFza09MZXZlbCwKLQkJCVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhc2sgdGFzayA9IGFkZFRhc2tfKGVsZW1lbnRPcldyYXBwZXIsIHRhc2tPTGV2ZWwsIHByb2plY3QpOwotCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsCi0JCQkJLnVud3JhcChlbGVtZW50T3JXcmFwcGVyKTsKLQkJCXRhc2tUb1diZU1hcC5wdXQodGFzaywgZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCQotCXByaXZhdGUgVGFzayBhZGRUYXNrXyhPYmplY3QgZWxlbWVudE9yV3JhcHBlciwgaW50IHRhc2tPTGV2ZWwsCi0JCQlQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmIChlbGVtZW50T3JXcmFwcGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCS51bndyYXAoZWxlbWVudE9yV3JhcHBlcik7Ci0JCQotCQlUYXNrIHRhc2sgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVUYXNrKCk7Ci0JCXRhc2suc2V0TmFtZShnZXREaXNwbGF5TmFtZShlbGVtZW50KSk7Ci0JCXRhc2suc2V0T3V0bGluZUxldmVsKEJpZ0ludGVnZXIudmFsdWVPZih0YXNrT0xldmVsKSk7Ci0JCXRhc2suc2V0VUlEKEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCkpOwotCQl0YXNrLnNldElEKEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCkpOwotCQl0YXNrLnNldFR5cGUoQmlnSW50ZWdlci52YWx1ZU9mKDApKTsKLQotCQlHcmVnb3JpYW5DYWxlbmRhciBnY0RhdGUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLQkJLy8gZ2NEYXRlLmFkZChHcmVnb3JpYW5DYWxlbmRhci5EQVRFLCA4MCk7Ci0JCURhdGUgc3RhcnREYXRlID0gZ2NEYXRlLmdldFRpbWUoKTsKLQkJdGFzay5zZXRTdGFydChzdGFydERhdGUpOwotCQkvLyB0YXNrLnNldER1cmF0aW9uKCJQVDIwSDBNMFMiKTsKLQotCQlTdHJpbmcgbm90ZXMgPSBnZXRCcmllZkRlc2NyaXB0aW9uKGVsZW1lbnQpOwotCQlpZiAobm90ZXMgIT0gbnVsbCAmJiBub3Rlcy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0YXNrLnNldE5vdGVzKG5vdGVzKTsKLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQl0YXNrLnNldE1pbGVzdG9uZSh0cnVlKTsKLQkJCXRhc2suc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJfQotCi0JCS8vIEFzc2lnbiB0aGUgdGFzayB0byBhbGwgdGhlIGFzc29jaWF0ZWQgcm9sZXMuCi0JCUxpc3Qgcm9sZXNMaXN0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcm9sZXNMaXN0ID0gZ2V0Um9sZXNGb3JUYXNrRCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2spIHsKLQkJCXJvbGVzTGlzdCA9IGdldFJvbGVzRm9yVGFzaygob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrKSBlbGVtZW50KTsKLQkJfQotCQlpZiAocm9sZXNMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcm9sZU5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlhZGRBc3NpZ25tZW50KHJvbGVOYW1lLCB0YXNrX3VpZCwgcHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgdGhlIGdlbmVyYXRlZCBVUkwgbGluayB0byB0aGUgdGFzay4KLQkJaWYgKHB1Ymxpc2hDb250ZW50U2l0ZSkgewotCQkJU3RyaW5nIGxpbmtVUkwgPSBnZXRFbGVtZW50VVJMKGVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayByZWZfZWRUYXNrID0gdGFza0Rlc2NyaXB0b3IuZ2V0VGFzaygpOwotCQkJCXJlZmVyZW5jZWRUYXNrcy5hZGQocmVmX2VkVGFzayk7Ci0JCQl9Ci0JCQl0YXNrLnNldEh5cGVybGlua0FkZHJlc3MobGlua1VSTCk7Ci0JCX0KLQotCQkvLyBhVGFzay5zZXRUeXBlKG5ldyBCaWdJbnRlZ2VyKCIxIikpOwotCQkvLyBhVGFzay5zZXRTdGFydChuZXcgRGF0ZSgpKTsKLQkJLy8gYVRhc2suc2V0U3VtbWFyeShmYWxzZSk7Ci0JCS8vIGFUYXNrLnNldENvbnN0cmFpbnRUeXBlKG5ldyBCaWdJbnRlZ2VyKCIyIikpOwotCi0JCS8vIEFkZCB0aGUgdGFzayB0byB0aGUgTWljcm9zb2Z0IFByb2plY3Qgb2JqZWN0LgotCQlwcm9qZWN0LmdldFRhc2tzKCkuZ2V0VGFzaygpLmFkZCh0YXNrKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRoZUN1cnJlbnQgZWxlbWVudDogdGFza1VpZD0iICsgdGFza191aWQgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIsICIgKyBjdXJyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICAgcGF0aDogIiArIGN1cnJlbnRFbGVtZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIFN0b3JlIHRoZSB0YXNrJ3MgbG9jYWwgcHJlZGVjZXNzb3JzLgotCQlzdG9yZVRhc2tQcmVkZWNlc3NvcnMoZWxlbWVudCk7Ci0KLQkJdGFza1VpZFRvV2JzV2FwcGVyUGF0aE1hcC5wdXQoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tfdWlkKSwKLQkJCQljdXJyZW50RWxlbWVudFBhdGgpOwotCQl3YnNHdWlkVG9UYXNrVWlkTWFwCi0JCQkJLnB1dChlbGVtZW50LmdldEd1aWQoKSwgQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tfdWlkKSk7Ci0KLQkJLy8gZ2V0IHByZWRlY2Vzc29ycyBvZiBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSB3YnNBZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50T3JXcmFwcGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlQcmVkZWNlc3Nvckxpc3QgY3VycmVudFByZWRMaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBndWlkUHJlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRQcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGVidWcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgd3JhcHBlclByZWRMaXN0TWVtYmVyOiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCB1bndyYXBwZWRFID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAodW53cmFwcGVkRSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJLy9ndWlkUHJlZExpc3QuYWRkKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZEUpLmdldEd1aWQoKSk7Ci0JCQkJZ3VpZFByZWRMaXN0LmFkZCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZEUpOwotCQkJCWlmIChkZWJ1ZykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgdW53cmFwcGVkUHJlZExpc3RNZW1iZXI6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgdW53cmFwcGVkRSk7Ci0JCQl9Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQl1bndyYXBwZWRFID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQkvL2d1aWRQcmVkTGlzdC5hZGQoKChCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWRFKS5nZXRHdWlkKCkpOwotCQkJCWd1aWRQcmVkTGlzdC5hZGQoKEJyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZEUpOwotCQkJCWlmIChkZWJ1ZykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgdW53cmFwcGVkUHJlZExpc3RNZW1iZXI6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgdW53cmFwcGVkRSk7Ci0JCQl9Ci0JCX0KLQkJd2JzV3JhcHBlclBhdGhUb1ByZWRMaXN0TWFwLnB1dChjdXJyZW50RWxlbWVudFBhdGgsIGd1aWRQcmVkTGlzdCk7Ci0JCWlmIChkZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIF9fd3JhcHBlclByZWRMaXN0OiAiICsgZ3VpZFByZWRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXRhc2tfdWlkKys7Ci0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbihXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgYnJpZWZEZXNjID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCWlmICgoYnJpZWZEZXNjID09IG51bGwgfHwgYnJpZWZEZXNjLnRyaW0oKS5sZW5ndGgoKSA8PSAwKSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayByZWZfZWRUYXNrID0gdGFza0Rlc2NyaXB0b3IuZ2V0VGFzaygpOwotCQkJCWlmIChyZWZfZWRUYXNrICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCByZWFsaXplZEVsZW1lbnQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHJlZl9lZFRhc2ssIHByb2Nlc3NDb25maWcpOwotCQkJCQlpZiAoZGVidWcpIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHJlYWxpemVkRWxlbWVudCA9ICIgKyByZWFsaXplZEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChyZWFsaXplZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCU9iamVjdCBicmllZkRlc2NPYmogPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUocmVhbGl6ZWRFbGVtZW50LCBhdHRyaWJ1dGUsIHByb2Nlc3NDb25maWcpOwotCQkJCQkJYnJpZWZEZXNjID0gYnJpZWZEZXNjT2JqLnRvU3RyaW5nKCk7Ci0JCQkJCQlpZiAoZGVidWcpIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHJlYWxpemVkIGJyaWVmIGRlc2MgPSAiICsgYnJpZWZEZXNjKTsJIC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBicmllZkRlc2M7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFzc2lnbm1lbnQoU3RyaW5nIHJlc05hbWUsIGludCB0YXNrVWlkLCBQcm9qZWN0IHByb2opIHsKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gcHJvamVjdEZhY3RvcnkuY3JlYXRlQXNzaWdubWVudCgpOwotCi0JCWFzc2lnbm1lbnQuc2V0VUlEKEJpZ0ludGVnZXIudmFsdWVPZihhc3NpZ25fdWlkKSk7Ci0JCWFzc2lnbm1lbnQuc2V0VGFza1VJRChCaWdJbnRlZ2VyLnZhbHVlT2YodGFza1VpZCkpOwotCQlCaWdJbnRlZ2VyIHJlc0lEID0gKEJpZ0ludGVnZXIpIHJvbGVzVG9VaWRNYXAuZ2V0KHJlc05hbWUpOwotCQlhc3NpZ25tZW50LnNldFJlc291cmNlVUlEKHJlc0lEKTsKLQotCQlwcm9qLmdldEFzc2lnbm1lbnRzKCkuZ2V0QXNzaWdubWVudCgpLmFkZChhc3NpZ25tZW50KTsKLQotCQlhc3NpZ25fdWlkKys7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJvbGVzRm9yVGFza0QoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IpIHsKLQkJQXJyYXlMaXN0IHJvbGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKFJvbGVEZXNjcmlwdG9yIHJkIDogdGFza0Rlc2NyaXB0b3IuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSkgewotCi0JCQkvLyBSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JwID0KLQkJCS8vIHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JwID0gKFJvbGVEZXNjcmlwdG9yKSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudChyZCwgYnJlYWtkb3duRWxlbWVudEZpbHRlcgotCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCi0JCQlpZiAocm9sZURlc2NycCAhPSBudWxsKSB7Ci0JCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlRGVzY3JwKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBMaXN0IHJvbGVEZXNjcnBMaXN0ID0KLQkJLy8gdGFza0Rlc2NyaXB0b3IuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJTGlzdCByb2xlRGVzY3JwTGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnRzKAotCQkJCXRhc2tEZXNjcmlwdG9yLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJYnJlYWtkb3duRWxlbWVudEZpbHRlci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjcnBMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NycCA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlyb2xlc0xpc3QuYWRkKGdldERpc3BsYXlOYW1lKHJvbGVEZXNjcnApKTsKLQkJfQotCi0JCXJldHVybiByb2xlc0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJvbGVzRm9yVGFzayhvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgdW1hVGFzaykgewotCQlBcnJheUxpc3Qgcm9sZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoUm9sZSByb2xlOiB1bWFUYXNrLmdldFBlcmZvcm1lZEJ5KCkpIHsKLQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQlyb2xlc0xpc3QuYWRkKGdldERpc3BsYXlOYW1lKHJvbGUpKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgbGlzdCA9IHVtYVRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdGVyLm5leHQoKTsKLQkJCXJvbGVzTGlzdC5hZGQoZ2V0RGlzcGxheU5hbWUocm9sZSkpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVzTGlzdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FsY3VsYXRlUm9sbHVwUm9sZXMoCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQsIExpc3Qgcm9sbHVwUm9sZXMpIHsKLQotCQlib29sZWFuIGlzQW55U3ViVGFza1BsYW5uZWQgPSBmYWxzZTsKLQotCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhicmVha2Rvd25FbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCXx8ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSBjYWxjdWxhdGVSb2xsdXBSb2xlcyhjb250ZW50UHJvdmlkZXIsCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHJvbGx1cFJvbGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3Qgd3JhcHBlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQl8fCAoKEFjdGl2aXR5KSB3cmFwcGVkRWxlbWVudCkuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoCi0JCQkJCQkJCWNvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHdyYXBwZWRFbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQl8fCBkZXNjcmlwdG9yLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJvbGx1cFJvbGVzCi0JCQkJCQkJLmFkZEFsbChnZXRSb2xlc0ZvclRhc2tEKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCU9iamVjdCB3cmFwcGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIHdyYXBwZWRFbGVtZW50OwotCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQl8fCBkZXNjcmlwdG9yLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJvbGx1cFJvbGVzCi0JCQkJCQkJCS5hZGRBbGwoZ2V0Um9sZXNGb3JUYXNrRCgoVGFza0Rlc2NyaXB0b3IpIHdyYXBwZWRFbGVtZW50KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXNBbnlTdWJUYXNrUGxhbm5lZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50J3MgcHJlZGVjZXNzb3JzLCBzdG9yZXMgdGhlbSBpbiBhbgotCSAqIDxvY2RlPkFycmF5TGlzdDwvY29kZT4sIGFuZCBwdXQgaXQgaW50byBhIG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVGFza1ByZWRlY2Vzc29ycyhXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgcHJlZGVjZXNzb3JzID0gZWxlbWVudC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQlMaXN0IHByZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwgJiYgcHJlZGVjZXNzb3JzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHByZWRlY2Vzc29ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaS5uZXh0KCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkZWNlc3NvciA9IHdvcmtPcmRlci5nZXRQcmVkKCk7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGxvY2FsUHJlZExpc3RNZW1iZXI6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgcHJlZGVjZXNzb3IpOwotCQkJCX0KLQkJCQlpZiAocHJlZGVjZXNzb3IgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcHJlZEd1aWQgPSBwcmVkZWNlc3Nvci5nZXRHdWlkKCk7Ci0JCQkJCWlmIChwcmVkR3VpZCAhPSBudWxsKQotCQkJCQkJcHJlZExpc3QuYWRkKHByZWRHdWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIGxvY2FsIHByZWRsaXN0IGZvciAiICsgZWxlbWVudC5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIgPSAiICsgcHJlZExpc3QudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXdic1dhcHBlclBhdGhUb0xvY2FsUHJlZExpc3RNYXAucHV0KGN1cnJlbnRFbGVtZW50UGF0aCwgcHJlZExpc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTGlua3MoUHJvY2VzcyBwcm9jZXNzLCBQcm9qZWN0IHByb2plY3QpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRUxpc3QgdGFza3MgPSBwcm9qZWN0LmdldFRhc2tzKCkuZ2V0VGFzaygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCQotCQkJQmlnSW50ZWdlciB0YXNrVWlkID0gdGFzay5nZXRVSUQoKTsKLQkJCS8vIHNraXAgdGhlIE1TIHByb2plY3QgaGlkZGVuIHRhc2sgd2l0aCB1aWQgPSAwCi0JCQlpZiAodGFza1VpZC5pbnRWYWx1ZSgpID09IDApCi0JCQkJY29udGludWU7Ci0KLQkJCVN0cmluZyB3YnNQYXRoU3RyID0gKFN0cmluZykgdGFza1VpZFRvV2JzV2FwcGVyUGF0aE1hcC5nZXQodGFza1VpZCk7Ci0KLQkJCUhhc2hNYXA8U3RyaW5nLCBXb3JrT3JkZXI+IHByZWRHdWlkVG9XT01hcCA9IGdldFByZWRHdWlkVG9XT01hcCh0YXNrVG9XYmVNYXAuZ2V0KHRhc2spKTsKLQkJCQotCQkJLy8gTGlzdCBwcmVkTGlzdCA9IChBcnJheUxpc3QpCi0JCQkvLyB3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwLmdldCh3YnNQYXRoU3RyKTsKLQkJCUxpc3QgcHJlZExpc3QgPSAoQXJyYXlMaXN0KSB3YnNXcmFwcGVyUGF0aFRvUHJlZExpc3RNYXAKLQkJCQkJLmdldCh3YnNQYXRoU3RyKTsKLQkJCWlmIChwcmVkTGlzdCAhPSBudWxsKSB7Ci0JCQkJTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJLy9TdHJpbmcgcHJlZEd1aWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcHJlZEVsZW0gPSAoTWV0aG9kRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlTdHJpbmcgcHJlZEd1aWQgPSBwcmVkRWxlbS5nZXRHdWlkKCk7Ci0JCQkJCQotCQkJCQlCaWdJbnRlZ2VyIHByZWRUYXNrVWlkID0gKEJpZ0ludGVnZXIpIHdic0d1aWRUb1Rhc2tVaWRNYXAKLQkJCQkJCQkuZ2V0KHByZWRHdWlkKTsKLQotCQkJCQlpZiAocHJlZFRhc2tVaWQgPT0gbnVsbAotCQkJCQkJCXx8IHByZWRUYXNrVWlkLmludFZhbHVlKCkgPT0gdGFza1VpZC5pbnRWYWx1ZSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgdGFza1VpZCA9ICIgKyB0YXNrVWlkIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyAiLCB3YnNQYXRoU3RyID0gIiArIHdic1BhdGhTdHIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBsb2NhbFByZWRMaXN0OiAiICsgcHJlZExpc3QpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBmb3VuZCBwcmVkIGd1aWQ6ICIgKyBwcmVkR3VpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCS8vcmVtb3ZlTGlzdC5hZGQocHJlZEd1aWQpOwotCQkJCQlyZW1vdmVMaXN0LmFkZChwcmVkRWxlbSk7Ci0KLQkJCQkJUHJlZGVjZXNzb3JMaW5rIHByZUxpbmsgPSBwcm9qZWN0RmFjdG9yeQotCQkJCQkJCS5jcmVhdGVQcmVkZWNlc3NvckxpbmsoKTsKLQkJCQkJdGFzay5nZXRQcmVkZWNlc3NvckxpbmsoKS5hZGQocHJlTGluayk7Ci0JCQkJCXByZUxpbmsuc2V0UHJlZGVjZXNzb3JVSUQocHJlZFRhc2tVaWQpOwotCQkJCQkKLQkJCQkJLy9wcmVMaW5rLnNldFR5cGUobmV3IEJpZ0ludGVnZXIoIjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQmlnSW50ZWdlciBiaWdJbnQgPSBnZXRMaW5rVHlwZUludChwcmVkR3VpZFRvV09NYXAuZ2V0KHByZWRHdWlkKSk7Ci0JCQkJCWlmIChiaWdJbnQgIT0gbnVsbCkgewotCQkJCQkJcHJlTGluay5zZXRUeXBlKGJpZ0ludCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXByZUxpbmsuc2V0Q3Jvc3NQcm9qZWN0KGZhbHNlKTsKLQkJCQkJcHJlTGluay5zZXRMaW5rTGFnKG5ldyBCaWdJbnRlZ2VyKCIwIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByZUxpbmsuc2V0TGFnRm9ybWF0KG5ldyBCaWdJbnRlZ2VyKCI3IikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXByZWRMaXN0LnJlbW92ZUFsbChyZW1vdmVMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQmlnSW50ZWdlciBnZXRMaW5rVHlwZUludChXb3JrT3JkZXIgd28pIHsKLQkJaWYgKHdvID09IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZz4gZ2V0TGlua1R5cGVJbnQsIHdvID09IG51bGwuIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJV29ya09yZGVyVHlwZSB3b1R5cGUgPSB3by5nZXRMaW5rVHlwZSgpOwotCQlpZiAod29UeXBlID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKSB7Ci0JCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIoIjEiKTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCQlpZiAod29UeXBlID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpIHsKLQkJCXJldHVybiBuZXcgQmlnSW50ZWdlcigiMyIpOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JCWlmICh3b1R5cGUgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKSB7Ci0JCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIoIjAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh3b1R5cGUgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpIHsKLQkJCXJldHVybiBuZXcgQmlnSW50ZWdlcigiMiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgV29ya09yZGVyPiBnZXRQcmVkR3VpZFRvV09NYXAoV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBXb3JrT3JkZXI+IHByZWRHdWlkVG9XT01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgV29ya09yZGVyPigpOwotCQlpZiAod2JlICE9IG51bGwpIHsKLQkJCUxpc3Q8V29ya09yZGVyPiB3b0xpc3QgPSB3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCWludCBzeiA9IHdvTGlzdCA9PSBudWxsID8gMCA6IHdvTGlzdC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN6OyBpKyspIHsKLQkJCQlXb3JrT3JkZXIgd28gPSB3b0xpc3QuZ2V0KGkpOwotCQkJCWlmICh3byA9PSBudWxsIHx8IHdvLmdldFByZWQoKSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlwcmVkR3VpZFRvV09NYXAucHV0KHdvLmdldFByZWQoKS5nZXRHdWlkKCksIHdvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZEd1aWRUb1dPTWFwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBIVE1MIGNvbnRlbnQgZmlsZSBVUkwgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBVUkwgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGNvbnRlbnQgZmlsZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudFVSTChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBlbGVtZW50UGF0aCA9IG51bGw7Ci0JCVN0cmluZyBlbGVtZW50RmlsZU5hbWUgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLQkJCWVsZW1lbnRGaWxlTmFtZSA9IFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGVsZW1lbnQsCi0JCQkJCVJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50UGF0aCAhPSBudWxsICYmIGVsZW1lbnRGaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQllbGVtZW50UGF0aCA9IGVsZW1lbnRQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCWVsZW1lbnRGaWxlTmFtZSA9IGVsZW1lbnRGaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQlTdHJpbmcgdXJsID0gY29udGVudEZvbGRlck5hbWUKLQkJCQkJKyAiLyIgKyBlbGVtZW50UGF0aCArIGVsZW1lbnRGaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGFiVGFyZ2V0RGlyICsgRmlsZS5zZXBhcmF0b3IgKyB1cmw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXkgbmFtZSBvZiBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBnaXZlbiBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5TmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW5hbWUgPSBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQluYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBYTUxVdGlsLmVzY2FwZUF0dHIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUHVibGlzaGVzIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhwb3J0ZWQKLQkgKiBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gdG8gcHVibGlzaAotCSAqIEBwYXJhbSBwdWJsaXNoQ29uZmlnT3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHB1Ymxpc2hlZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcHVibGlzaGluZyB0aGUgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hDb25maWd1cmF0aW9uKFN0cmluZyBkaXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHVibGlzaE9wdGlvbnMgcHVibGlzaENvbmZpZ09wdGlvbnMpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHVibGlzaE1hbmFnZXIgcHVibGlzaE1nciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwdWJsaXNoTWdyID0gbmV3IFB1Ymxpc2hNYW5hZ2VyKCk7Ci0JCQlwdWJsaXNoTWdyLmluaXQoZGlyLCBjb25maWcsIG5ldyBQdWJsaXNoSFRNTE9wdGlvbnMoCi0JCQkJCXB1Ymxpc2hDb25maWdPcHRpb25zKSk7Ci0KLQkJCUV4cG9ydE1TUFhNTE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgRXhwb3J0TVNQWE1MT3BlcmF0aW9uKAotCQkJCQlwdWJsaXNoTWdyKTsKLQkJCVB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZGxnID0gbmV3IFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHB1Ymxpc2hNZ3IKLQkJCQkJCQkuZ2V0Vmlld0J1aWxkZXIoKSk7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBVSUhlbHBlci5ydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLAotCQkJCQlkbGcsIHRydWUsIEV4cG9ydE1TUFJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUpOwotCQkJaWYgKG9wZXJhdGlvbi5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgb3BlcmF0aW9uLmdldEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3MgJiYgIWRsZy5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB1Ymxpc2hNZ3IgIT0gbnVsbCkgewotCQkJCXB1Ymxpc2hNZ3IuZGlzcG9zZSgpOwotCQkJCXB1Ymxpc2hNZ3IgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSB0cmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRNU1Byb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG4kJCQgcmVhZC1pbiBwcm9qZWN0ID0gIiArIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0KLQkJRUxpc3QgdGFza3MgPSBwcm9qZWN0LmdldFRhc2tzKCkuZ2V0VGFzaygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2sgZWxlbWVudCA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGEgdGFzayA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRUxpc3QgcmVzb3VyY2VzID0gcHJvamVjdC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlIGVsZW1lbnQgPSAob3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSkgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgYSByZXNvdXJjZSA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRUxpc3QgYXNzaWdubWVudHMgPSBwcm9qZWN0LmdldEFzc2lnbm1lbnRzKCkuZ2V0QXNzaWdubWVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NpZ25tZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFzc2lnbm1lbnQgZWxlbWVudCA9IChBc3NpZ25tZW50KSBpdGVyLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGFuIGFzc2lnbm1lbnQgPSAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkPT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgSGFzaE1hcDxUYXNrLCBXb3JrQnJlYWtkb3duRWxlbWVudD4gZ2V0VGFza1RvV2JlTWFwKCkgewotCQlyZXR1cm4gdGFza1RvV2JlTWFwOwotCX0KLQkKLQkvL1RvIGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvamVjdEV4dGVuZGVkQXR0cmlidXRlcyhQcm9qZWN0IHByb2plY3QpIHsKLQl9Ci0KLQkvL1RvIGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVXUERzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE9wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOWE4NDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQSBIYXNoTWFwIGZvciBFeHBvcnQgT3B0aW9ucwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRPcHRpb25zIGV4dGVuZHMgSGFzaE1hcCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTg5NzAxMjE1OTEzMjEyMjczTDsKLQkKLQkvKioKLQkgKiBUaGUgcHVibGlzaCBzZWxlY3RlZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJRyA9ICJwdWJsaXNoQ29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgd29ya2JyZWFrZG93biBlbGVtZW50cyBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX09OTFlfUExBTk5FRF9FTEVNRU5UUyA9ICJleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydCBlZmZvcnQgZXN0aW1hdGVzIGZvciB3b3JrYnJlYWtkb3duIGVsZW1lbnRzIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfRVNUSU1BVEVTID0gImV4cG9ydEVzdGltYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBlc3RpbWF0aW5nIG1vZGVsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBlZmZvcnQgZXN0aW1hdGVzIG9mIHRoZQotCSAqIGV4cG9ydGVkIHdvcmticmVha2Rvd24gZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVElOR19NT0RFTCA9ICJlc3RpbWF0aW5nTW9kZWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0T3B0aW9ucygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9JRXhwb3J0TVNQU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0lFeHBvcnRNU1BTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTM0YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0lFeHBvcnRNU1BTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHBvcnRNU1BTZXJ2aWNlIHsKLQotCS8qKgotCSAqIEV4cG9ydCBhIHByb2Nlc3MgdG8gYSBNaWNyb3NvZnQgUHJvamVjdCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzCi0JICogQHBhcmFtIGV4cG9ydE9wdGlvbnMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiB1c2VyIHNwZWNpZmllZCBleHBvcnQgb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQotCSAqIEB0aHJvd3MgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydE1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsCi0JCQlFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMpIHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YWM5NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQKLWV4cG9ydE1TUFdpemFyZF90aXRsZT1FeHBvcnQgTWljcm9zb2Z0IFByb2plY3QKLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotZXhwb3J0TVNQVGFza19uYW1lPUV4cG9ydGluZyBzZWxlY3RlZCBwcm9jZXNzIHRvIE1pY3Jvc29mdCBQcm9qZWN0Li4uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhNTIyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU1MGMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3RlbXBsYXRlL21zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vZXBmLmVjbGlwc2Uub3JnL21zcHJvamVjdCI+Ci08TmFtZT5tc3Byb2plY3RfMjAwM190ZW1wbGF0ZS54bWw8L05hbWU+Ci08Q29tcGFueT5FY2xpcHNlLm9yZzwvQ29tcGFueT4KLTxBdXRob3I+PC9BdXRob3I+Ci08Q3JlYXRpb25EYXRlPjIwMDYtMDItMTBUMTQ6MzY6MDA8L0NyZWF0aW9uRGF0ZT4KLTxMYXN0U2F2ZWQ+MjAwNi0wMi0xMFQxNToxOTowMDwvTGFzdFNhdmVkPgotPFNjaGVkdWxlRnJvbVN0YXJ0PjE8L1NjaGVkdWxlRnJvbVN0YXJ0PgotPFN0YXJ0RGF0ZT4yMDA2LTAyLTEwVDA4OjAwOjAwPC9TdGFydERhdGU+Ci08RmluaXNoRGF0ZT4yMDA2LTAyLTEwVDA4OjAwOjAwPC9GaW5pc2hEYXRlPgotPEZZU3RhcnREYXRlPjE8L0ZZU3RhcnREYXRlPgotPENyaXRpY2FsU2xhY2tMaW1pdD4wPC9Dcml0aWNhbFNsYWNrTGltaXQ+Ci08Q3VycmVuY3lEaWdpdHM+MjwvQ3VycmVuY3lEaWdpdHM+Ci08Q3VycmVuY3lTeW1ib2w+JDwvQ3VycmVuY3lTeW1ib2w+Ci08Q3VycmVuY3lTeW1ib2xQb3NpdGlvbj4wPC9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uPgotPENhbGVuZGFyVUlEPjE8L0NhbGVuZGFyVUlEPgotPERlZmF1bHRTdGFydFRpbWU+MDg6MDA6MDA8L0RlZmF1bHRTdGFydFRpbWU+Ci08RGVmYXVsdEZpbmlzaFRpbWU+MTc6MDA6MDA8L0RlZmF1bHRGaW5pc2hUaW1lPgotPE1pbnV0ZXNQZXJEYXk+NDgwPC9NaW51dGVzUGVyRGF5PgotPE1pbnV0ZXNQZXJXZWVrPjI0MDA8L01pbnV0ZXNQZXJXZWVrPgotPERheXNQZXJNb250aD4yMDwvRGF5c1Blck1vbnRoPgotPERlZmF1bHRUYXNrVHlwZT4wPC9EZWZhdWx0VGFza1R5cGU+Ci08RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWw+MzwvRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWw+Ci08RGVmYXVsdFN0YW5kYXJkUmF0ZT4wPC9EZWZhdWx0U3RhbmRhcmRSYXRlPgotPERlZmF1bHRPdmVydGltZVJhdGU+MDwvRGVmYXVsdE92ZXJ0aW1lUmF0ZT4KLTxEdXJhdGlvbkZvcm1hdD43PC9EdXJhdGlvbkZvcm1hdD4KLTxXb3JrRm9ybWF0PjI8L1dvcmtGb3JtYXQ+Ci08RWRpdGFibGVBY3R1YWxDb3N0cz4wPC9FZGl0YWJsZUFjdHVhbENvc3RzPgotPEhvbm9yQ29uc3RyYWludHM+MDwvSG9ub3JDb25zdHJhaW50cz4KLTxJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk+MTwvSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5PgotPE11bHRpcGxlQ3JpdGljYWxQYXRocz4wPC9NdWx0aXBsZUNyaXRpY2FsUGF0aHM+Ci08TmV3VGFza3NFZmZvcnREcml2ZW4+MTwvTmV3VGFza3NFZmZvcnREcml2ZW4+Ci08TmV3VGFza3NFc3RpbWF0ZWQ+MTwvTmV3VGFza3NFc3RpbWF0ZWQ+Ci08U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzPjE8L1NwbGl0c0luUHJvZ3Jlc3NUYXNrcz4KLTxTcHJlYWRBY3R1YWxDb3N0PjA8L1NwcmVhZEFjdHVhbENvc3Q+Ci08U3ByZWFkUGVyY2VudENvbXBsZXRlPjA8L1NwcmVhZFBlcmNlbnRDb21wbGV0ZT4KLTxUYXNrVXBkYXRlc1Jlc291cmNlPjE8L1Rhc2tVcGRhdGVzUmVzb3VyY2U+Ci08RmlzY2FsWWVhclN0YXJ0PjA8L0Zpc2NhbFllYXJTdGFydD4KLTxXZWVrU3RhcnREYXk+MDwvV2Vla1N0YXJ0RGF5PgotPE1vdmVDb21wbGV0ZWRFbmRzQmFjaz4wPC9Nb3ZlQ29tcGxldGVkRW5kc0JhY2s+Ci08TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2s+MDwvTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2s+Ci08TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ+MDwvTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ+Ci08TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkPjA8L01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZD4KLTxCYXNlbGluZUZvckVhcm5lZFZhbHVlPjA8L0Jhc2VsaW5lRm9yRWFybmVkVmFsdWU+Ci08QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzPjE8L0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcz4KLTxDdXJyZW50RGF0ZT4yMDA2LTAyLTEwVDA4OjAwOjAwPC9DdXJyZW50RGF0ZT4KLTxNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMPjE8L01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw+Ci08QXV0b2xpbms+MTwvQXV0b2xpbms+Ci08TmV3VGFza1N0YXJ0RGF0ZT4wPC9OZXdUYXNrU3RhcnREYXRlPgotPERlZmF1bHRUYXNrRVZNZXRob2Q+MDwvRGVmYXVsdFRhc2tFVk1ldGhvZD4KLTxQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZD4wPC9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZD4KLTxFeHRlbmRlZENyZWF0aW9uRGF0ZT4xOTg0LTAxLTAxVDAwOjAwOjAwPC9FeHRlbmRlZENyZWF0aW9uRGF0ZT4KLTxBY3R1YWxzSW5TeW5jPjE8L0FjdHVhbHNJblN5bmM+Ci08UmVtb3ZlRmlsZVByb3BlcnRpZXM+MDwvUmVtb3ZlRmlsZVByb3BlcnRpZXM+Ci08QWRtaW5Qcm9qZWN0PjA8L0FkbWluUHJvamVjdD4KLTxPdXRsaW5lQ29kZXMvPgotPFdCU01hc2tzLz4KLTxFeHRlbmRlZEF0dHJpYnV0ZXMvPgotPENhbGVuZGFycz4KLTxDYWxlbmRhcj4KLTxVSUQ+MTwvVUlEPgotPE5hbWU+U3RhbmRhcmQ8L05hbWU+Ci08SXNCYXNlQ2FsZW5kYXI+MTwvSXNCYXNlQ2FsZW5kYXI+Ci08QmFzZUNhbGVuZGFyVUlEPi0xPC9CYXNlQ2FsZW5kYXJVSUQ+Ci08V2Vla0RheXM+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjE8L0RheVR5cGU+Ci08RGF5V29ya2luZz4wPC9EYXlXb3JraW5nPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT4yPC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjM8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+NDwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT41PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjY8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+NzwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjA8L0RheVdvcmtpbmc+Ci08L1dlZWtEYXk+Ci08L1dlZWtEYXlzPgotPC9DYWxlbmRhcj4KLTwvQ2FsZW5kYXJzPgotPFRhc2tzPgotPFRhc2s+Ci08VUlEPjA8L1VJRD4KLTxJRD4wPC9JRD4KLTxUeXBlPjE8L1R5cGU+Ci08SXNOdWxsPjA8L0lzTnVsbD4KLTxDcmVhdGVEYXRlPjIwMDYtMDItMTBUMTQ6MzY6MDA8L0NyZWF0ZURhdGU+Ci08V0JTPjA8L1dCUz4KLTxPdXRsaW5lTnVtYmVyPjA8L091dGxpbmVOdW1iZXI+Ci08T3V0bGluZUxldmVsPjA8L091dGxpbmVMZXZlbD4KLTxQcmlvcml0eT41MDA8L1ByaW9yaXR5PgotPFN0YXJ0PjIwMDYtMDItMTBUMDg6MDA6MDA8L1N0YXJ0PgotPEZpbmlzaD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9GaW5pc2g+Ci08RHVyYXRpb24+UFQwSDBNMFM8L0R1cmF0aW9uPgotPER1cmF0aW9uRm9ybWF0PjUzPC9EdXJhdGlvbkZvcm1hdD4KLTxXb3JrPlBUMEgwTTBTPC9Xb3JrPgotPFJlc3VtZVZhbGlkPjA8L1Jlc3VtZVZhbGlkPgotPEVmZm9ydERyaXZlbj4wPC9FZmZvcnREcml2ZW4+Ci08UmVjdXJyaW5nPjA8L1JlY3VycmluZz4KLTxPdmVyQWxsb2NhdGVkPjA8L092ZXJBbGxvY2F0ZWQ+Ci08RXN0aW1hdGVkPjE8L0VzdGltYXRlZD4KLTxNaWxlc3RvbmU+MDwvTWlsZXN0b25lPgotPFN1bW1hcnk+MTwvU3VtbWFyeT4KLTxDcml0aWNhbD4xPC9Dcml0aWNhbD4KLTxJc1N1YnByb2plY3Q+MDwvSXNTdWJwcm9qZWN0PgotPElzU3VicHJvamVjdFJlYWRPbmx5PjA8L0lzU3VicHJvamVjdFJlYWRPbmx5PgotPEV4dGVybmFsVGFzaz4wPC9FeHRlcm5hbFRhc2s+Ci08RWFybHlTdGFydD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9FYXJseVN0YXJ0PgotPEVhcmx5RmluaXNoPjIwMDYtMDItMTBUMDg6MDA6MDA8L0Vhcmx5RmluaXNoPgotPExhdGVTdGFydD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9MYXRlU3RhcnQ+Ci08TGF0ZUZpbmlzaD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9MYXRlRmluaXNoPgotPFN0YXJ0VmFyaWFuY2U+MDwvU3RhcnRWYXJpYW5jZT4KLTxGaW5pc2hWYXJpYW5jZT4wPC9GaW5pc2hWYXJpYW5jZT4KLTxXb3JrVmFyaWFuY2U+MDwvV29ya1ZhcmlhbmNlPgotPEZyZWVTbGFjaz4wPC9GcmVlU2xhY2s+Ci08VG90YWxTbGFjaz4wPC9Ub3RhbFNsYWNrPgotPEZpeGVkQ29zdD4wPC9GaXhlZENvc3Q+Ci08Rml4ZWRDb3N0QWNjcnVhbD4zPC9GaXhlZENvc3RBY2NydWFsPgotPFBlcmNlbnRDb21wbGV0ZT4wPC9QZXJjZW50Q29tcGxldGU+Ci08UGVyY2VudFdvcmtDb21wbGV0ZT4wPC9QZXJjZW50V29ya0NvbXBsZXRlPgotPENvc3Q+MDwvQ29zdD4KLTxPdmVydGltZUNvc3Q+MDwvT3ZlcnRpbWVDb3N0PgotPE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvT3ZlcnRpbWVXb3JrPgotPEFjdHVhbER1cmF0aW9uPlBUMEgwTTBTPC9BY3R1YWxEdXJhdGlvbj4KLTxBY3R1YWxDb3N0PjA8L0FjdHVhbENvc3Q+Ci08QWN0dWFsT3ZlcnRpbWVDb3N0PjA8L0FjdHVhbE92ZXJ0aW1lQ29zdD4KLTxBY3R1YWxXb3JrPlBUMEgwTTBTPC9BY3R1YWxXb3JrPgotPEFjdHVhbE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrPgotPFJlZ3VsYXJXb3JrPlBUMEgwTTBTPC9SZWd1bGFyV29yaz4KLTxSZW1haW5pbmdEdXJhdGlvbj5QVDBIME0wUzwvUmVtYWluaW5nRHVyYXRpb24+Ci08UmVtYWluaW5nQ29zdD4wPC9SZW1haW5pbmdDb3N0PgotPFJlbWFpbmluZ1dvcms+UFQwSDBNMFM8L1JlbWFpbmluZ1dvcms+Ci08UmVtYWluaW5nT3ZlcnRpbWVDb3N0PjA8L1JlbWFpbmluZ092ZXJ0aW1lQ29zdD4KLTxSZW1haW5pbmdPdmVydGltZVdvcms+UFQwSDBNMFM8L1JlbWFpbmluZ092ZXJ0aW1lV29yaz4KLTxBQ1dQPjA8L0FDV1A+Ci08Q1Y+MDwvQ1Y+Ci08Q29uc3RyYWludFR5cGU+MDwvQ29uc3RyYWludFR5cGU+Ci08Q2FsZW5kYXJVSUQ+LTE8L0NhbGVuZGFyVUlEPgotPExldmVsQXNzaWdubWVudHM+MTwvTGV2ZWxBc3NpZ25tZW50cz4KLTxMZXZlbGluZ0NhblNwbGl0PjE8L0xldmVsaW5nQ2FuU3BsaXQ+Ci08TGV2ZWxpbmdEZWxheT4wPC9MZXZlbGluZ0RlbGF5PgotPExldmVsaW5nRGVsYXlGb3JtYXQ+ODwvTGV2ZWxpbmdEZWxheUZvcm1hdD4KLTxJZ25vcmVSZXNvdXJjZUNhbGVuZGFyPjA8L0lnbm9yZVJlc291cmNlQ2FsZW5kYXI+Ci08SGlkZUJhcj4wPC9IaWRlQmFyPgotPFJvbGx1cD4wPC9Sb2xsdXA+Ci08QkNXUz4wPC9CQ1dTPgotPEJDV1A+MDwvQkNXUD4KLTxQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZT4wPC9QaHlzaWNhbFBlcmNlbnRDb21wbGV0ZT4KLTxFYXJuZWRWYWx1ZU1ldGhvZD4wPC9FYXJuZWRWYWx1ZU1ldGhvZD4KLTxBY3R1YWxXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxXb3JrUHJvdGVjdGVkPgotPEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZD5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPgotPC9UYXNrPgotPC9UYXNrcz4KLTxSZXNvdXJjZXM+Ci08UmVzb3VyY2U+Ci08VUlEPjA8L1VJRD4KLTxJRD4wPC9JRD4KLTxUeXBlPjE8L1R5cGU+Ci08SXNOdWxsPjA8L0lzTnVsbD4KLTxXb3JrR3JvdXA+MDwvV29ya0dyb3VwPgotPE1heFVuaXRzPjE8L01heFVuaXRzPgotPFBlYWtVbml0cz4wPC9QZWFrVW5pdHM+Ci08T3ZlckFsbG9jYXRlZD4wPC9PdmVyQWxsb2NhdGVkPgotPENhbkxldmVsPjE8L0NhbkxldmVsPgotPEFjY3J1ZUF0PjM8L0FjY3J1ZUF0PgotPFdvcms+UFQwSDBNMFM8L1dvcms+Ci08UmVndWxhcldvcms+UFQwSDBNMFM8L1JlZ3VsYXJXb3JrPgotPE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvT3ZlcnRpbWVXb3JrPgotPEFjdHVhbFdvcms+UFQwSDBNMFM8L0FjdHVhbFdvcms+Ci08UmVtYWluaW5nV29yaz5QVDBIME0wUzwvUmVtYWluaW5nV29yaz4KLTxBY3R1YWxPdmVydGltZVdvcms+UFQwSDBNMFM8L0FjdHVhbE92ZXJ0aW1lV29yaz4KLTxSZW1haW5pbmdPdmVydGltZVdvcms+UFQwSDBNMFM8L1JlbWFpbmluZ092ZXJ0aW1lV29yaz4KLTxQZXJjZW50V29ya0NvbXBsZXRlPjA8L1BlcmNlbnRXb3JrQ29tcGxldGU+Ci08U3RhbmRhcmRSYXRlPjA8L1N0YW5kYXJkUmF0ZT4KLTxTdGFuZGFyZFJhdGVGb3JtYXQ+MjwvU3RhbmRhcmRSYXRlRm9ybWF0PgotPENvc3Q+MDwvQ29zdD4KLTxPdmVydGltZVJhdGU+MDwvT3ZlcnRpbWVSYXRlPgotPE92ZXJ0aW1lUmF0ZUZvcm1hdD4yPC9PdmVydGltZVJhdGVGb3JtYXQ+Ci08T3ZlcnRpbWVDb3N0PjA8L092ZXJ0aW1lQ29zdD4KLTxDb3N0UGVyVXNlPjA8L0Nvc3RQZXJVc2U+Ci08QWN0dWFsQ29zdD4wPC9BY3R1YWxDb3N0PgotPEFjdHVhbE92ZXJ0aW1lQ29zdD4wPC9BY3R1YWxPdmVydGltZUNvc3Q+Ci08UmVtYWluaW5nQ29zdD4wPC9SZW1haW5pbmdDb3N0PgotPFJlbWFpbmluZ092ZXJ0aW1lQ29zdD4wPC9SZW1haW5pbmdPdmVydGltZUNvc3Q+Ci08V29ya1ZhcmlhbmNlPjA8L1dvcmtWYXJpYW5jZT4KLTxDb3N0VmFyaWFuY2U+MDwvQ29zdFZhcmlhbmNlPgotPFNWPjA8L1NWPgotPENWPjA8L0NWPgotPEFDV1A+MDwvQUNXUD4KLTxDYWxlbmRhclVJRD4yPC9DYWxlbmRhclVJRD4KLTxCQ1dTPjA8L0JDV1M+Ci08QkNXUD4wPC9CQ1dQPgotPElzR2VuZXJpYz4wPC9Jc0dlbmVyaWM+Ci08SXNJbmFjdGl2ZT4wPC9Jc0luYWN0aXZlPgotPElzRW50ZXJwcmlzZT4wPC9Jc0VudGVycHJpc2U+Ci08Qm9va2luZ1R5cGU+MDwvQm9va2luZ1R5cGU+Ci08QWN0dWFsV29ya1Byb3RlY3RlZD5QVDBIME0wUzwvQWN0dWFsV29ya1Byb3RlY3RlZD4KLTxBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ+UFQwSDBNMFM8L0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZD4KLTxDcmVhdGlvbkRhdGU+MjAwNi0wMi0xMFQxNDozNjowMDwvQ3JlYXRpb25EYXRlPgotPC9SZXNvdXJjZT4KLTwvUmVzb3VyY2VzPgotPEFzc2lnbm1lbnRzLz4KLTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzMxYmQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSB4bWwgZXhwb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzllMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlhYzc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJjYzJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjQ0YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTMwNGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydCBYTUwgUGx1Zy1pbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgRXhwb3J0IFhNTCBXaXphcmQKLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MCi1leHBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1FeHBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBhIFhNTCBmaWxlLgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0NjQ2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzLkV4cG9ydFhNTFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkcy5FeHBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0WE1MV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkcy5FeHBvcnRYTUxXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4YzFmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvRXhwb3J0WE1MUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydFhNTFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cG9ydFhNTFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmUxNDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBtZXNzYWdlIHJlc291cmNlIGJ1bmRsZSBhY2Nlc3NvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHBvcnRYTUxSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gRXhwb3J0WE1MUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhwb3J0WE1MUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RYTUxGaWxlUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlVGV4dF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRpbmdYTUxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRYTUxGaWxlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0WE1MV2l6YXJkX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxTZXJ2aWNlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfbm9fcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9ub19mZWF0dXJlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9ub19jbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9uZXdfaWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFeHBvcnRYTUxSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MjdlN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZToKLSMKLQotIyBFeHBvcnQgWE1MIFdpemFyZAotZXhwb3J0WE1MV2l6YXJkX3RpdGxlPUV4cG9ydCBYTUwKLQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UKLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZWN0IHRoZSB0eXBlIG9mIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gZXhwb3J0LgotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9RXhwb3J0IHRoZSBlbnRpcmUgbWV0aG9kIGxpYnJhcnkKLWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMKLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydCBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1TcGVjaWZ5IGV4cG9ydCBmaWxlCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVNwZWNpZnkgYSBkZXN0aW5hdGlvbiBYTUwgZmlsZSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudC4KLWZpbGVMYWJlbF90ZXh0PVhNTCBGaWxlOgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cKLW92ZXJ3cml0ZVRleHRfbXNnPScnezB9JycgYWxyZWFkeSBleGlzdHMuXG5EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgaXQ/Ci0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWV4cG9ydGluZ1hNTF90ZXh0PUV4cG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIFhNTCBmaWxlLi4uCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWludmFsaWRYTUxGaWxlX2Vycm9yPVRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgaXMgbm90IHZhbGlkLgotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogVGhlIEV4cG9ydCBmYWlsZWQ6IHswfQotZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZz1FeHBvcnQgY29tcGxldGVkLiBQbGVhc2UgcmV2aWV3IHRoZSBsb2cgZmlsZXMgdW5kZXIgdGhlIGV4cG9ydCBkaXJlY3RvcnkuCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPUVycm9yIGV4cG9ydGluZyBsaWJyYXJ5OiB7MH0KLWV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvcj1FcnJvciBzZXR0aW5nIGZlYXR1cmUgdmFsdWU6OiBFbGVtZW50PXswfSwgZmVhdHVyZT17MX0KLXhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw9VW5hYmxlIHRvIGxvYWQgWE1MIHNvdXJjZSAnJ3swfScnCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1ObyBtZXRob2QgcGx1Zy1pbiBmb3IgaWQgezB9Ci14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9VW5hYmxlIHRvIGdldCBYTUwgZmVhdHVyZSBmb3IgezB9X3sxfQoteG1sTGlicmFyeV9ub19jbGFzcz1VbmFibGUgdG8gZ2V0IEVDbGFzcyBmb3IgezB9Ci14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm9yIGNyZWF0aW5nIGVsZW1lbnQsIGRvIG5vdCBrbm93IGhvdyB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmUgezB9Ci14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1FcnJvciBjcmVhdGluZyBlbGVtZW50LCBjYW5ub3Qgc2V0IHZhbHVlIHswfSB0byBjb250YWluZXIgezF9Ci14bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZT1JbnZhbGlkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIGZvciBmZWF0dXJlIHswfSwgd2l0aCB2YWx1ZSB7MX0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9RXJyb3Igc2V0dGluZyBhdHRyaWJ1dGUsIFVuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmU9ezB9LCBvYmplY3Q9ezF9LCB2YWx1ZT17Mn0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9RG9uJyd0IGtub3cgaG93IHRvIHNldCB2YWx1ZSBmb3IgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm9yIHNldHRpbmcgcmVmZXJlbmNlLCBVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9Ci14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPVByb2Nlc3MgJyd7MH0nJyBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgY29udGFpbmVyLiBUaGUgY29udGFpbmVyIGlzIG9mIHR5cGUgJyd7MX0nJywgd2hpY2ggaXMgbm90IGEgcHJvY2VzcyBwYWNrYWdlLgoteG1sTGlicmFyeV9uZXdfaWQ9RWxlbWVudCB7MH0gaXMgYXNzaWduZWQgd2l0aCBhIG5ldyBpZCB7MX0gYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgb25lCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9RWxlbWVudCBJZCAnJ3swfScnIGlzIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBlbGVtZW50Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDk5ODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBFeHBvcnQgWE1MIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9FeHBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL0V4cG9ydFhNTFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWZiYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL0V4cG9ydFhNTFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgZXhwb3J0IHR5cGUgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1RZUEUgPSAiZXhwb3J0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRklMRSA9ICJ4bWxGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoRVhQT1JUX1RZUEUsIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZKTsgCi0JCXN0b3JlLnNldERlZmF1bHQoWE1MX0ZJTEUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydCB0eXBlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZXhwb3J0IHR5cGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEV4cG9ydFR5cGUoKSB7Ci0JCXJldHVybiBFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludCgKLQkJCQlFWFBPUlRfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0ZWQgdHlwZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBleHBvcnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpZWQgZXhwb3J0IHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXhwb3J0VHlwZShpbnQgZXhwb3J0VHlwZSkgewotCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEVYUE9SVF9UWVBFLAotCQkJCWV4cG9ydFR5cGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydGVkIFhNTCBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZXhwb3J0ZWQgWE1MIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiBFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlYTUxfRklMRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0ZWQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYTUxGaWxlKFN0cmluZyBwYXRoKSB7Ci0JCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoWE1MX0ZJTEUsCi0JCQkJcGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjMjBjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgRXhwb3J0IFhNTCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0MGY0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5CYXNlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5VcmxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UgaGFuZGxlciBmb3IgY29udGVudCBpbiB0aGUgZXhwb3J0ZWQgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFJlc291cmNlSGFuZGxlciBleHRlbmRzIEJhc2VSZXNvdXJjZUhhbmRsZXIgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFJlc291cmNlSGFuZGxlcihGaWxlIHNvdXJjZUxpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCkgewotCQlzdXBlcihzb3VyY2VMaWJSb290LCB0YXJnZXRMaWJSb290KTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSB1cmwuIEZvciBYTUwgZXhwb3J0LCB3ZSBzaG91bGQgcmVzZXJ2ZSB0aGUgcmVzb3VyY2UgbG9jYXRpb25zLgotCSAqLwotCXB1YmxpYyBVcmxJbmZvIHJlc29sdmVGaWxlVXJsKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBsb2FkVXJsSW5mb1dpdGhGaXhlZFBhdGgob3duZXIsIHNyY1VybCk7Ci0JfQotCi0JCi0JLyoqCi0JICogdGhlIHJlc291cmNlIHBhdGggd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbGliYXJ5IHJvb3QuIHVybHMgbmVlZHMgdG8gYmUKLQkgKiBmaXhlZAotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG93bmVyIG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkKLQkgKiBAcGFyYW0gc3JjVXJsCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhGaXhlZFBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0JCVVybEluZm8gaW5mbyA9IG5ldyBVcmxJbmZvKCk7Ci0JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsKLQkJU3RyaW5nIHNyY0ZpbGUgPSBnZXRGaWxlUmVsUGF0aChvd25lciwgc3JjVXJsKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCBvd25lckVsZW0gPSBudWxsOwotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQlvd25lckVsZW0gPSAob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgb3duZXI7Ci0JCX0KLQkJaWYgKHNyY0ZpbGUgIT0gbnVsbCAmJiBvd25lckVsZW0gIT0gbnVsbCkgewkJCQotCQkJTWV0aG9kUGx1Z2luIHNyY1BsdWdpbiA9IGdldFNvdXJjZVBsdWdpbihvd25lckVsZW0pOwotCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Ioc3JjUGx1Z2luKTsKLQkJCVN0cmluZyBzcmNQbHVnaW5QYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChzcmNQbHVnaW4pOwotCQkJRmlsZSBzcmNSb290ID0gKG5ldyBGaWxlKHNyY1BsdWdpblBhdGgpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkKLQkJCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNyY1Jvb3QsIHNyY0ZpbGUpOwotCQkJaWYgKCFpbmZvLnNvdXJjZUZpbGUuaXNGaWxlKCkgfHwgIWluZm8uc291cmNlRmlsZS5leGlzdHMoKSkgewotCQkJCVN0cmluZyBuZXdTcmNGaWxlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQluZXdTcmNGaWxlID0gTmV0VXRpbC5kZWNvZGVVUkwoc3JjRmlsZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJaWYgKG5ld1NyY0ZpbGUgIT0gbnVsbCkgewotCQkJCQlzcmNGaWxlID0gbmV3U3JjRmlsZTsKLQkJCQkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc3JjUm9vdCwgc3JjRmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc3JjRmlsZSk7Ci0JCQlpbmZvLnRhcmdldFVybCA9IHNyY0ZpbGUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRTb3VyY2VQbHVnaW4ob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCBvd25lckVsZW0pIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KG93bmVyRWxlbS5nZXRJZCgpKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZVJlbFBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIGlkID0gKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSBvd25lcikKLQkJCQkJCS5nZXRJZCgpOwotCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGlkKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJRmlsZSBmID0gbmV3IEZpbGUobmV3IEZpbGUoc291cmNlTGliUm9vdCwKLQkJCQkJCQkJUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkpLCBzcmNVcmwpOwotCQkJCQkJU3RyaW5nIHBhdGggPSBmLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCQkJCXJldHVybiBwYXRoLnN1YnN0cmluZyhzb3VyY2VMaWJSb290LmdldENhbm9uaWNhbFBhdGgoKQotCQkJCQkJCQkubGVuZ3RoKCkgKyAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gTG9nIGVycm9yIGhlcmUKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGNvcHlpbmcgdGhlIHJlc291cmNlIGZpbGUgZnJvbSB0aGUgc291cmNlIGxpYnJhcnkgdG8gdGhlIHRhcmdldAotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290Ci0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlLCBFT2JqZWN0IG9iaiwgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gdW1hUGx1Z2luKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKHVtYVBsdWdpbik7Ci0JCVN0cmluZyBzcmNQbHVnaW5QYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aCh1bWFQbHVnaW4pOwotCQlGaWxlIHNyY1BsdWdpblJvb3QgPSBuZXcgRmlsZShzcmNQbHVnaW5QYXRoKTsKLQkJCi0JCUZpbGUgc3JjID0gbmV3IEZpbGUoc3JjUGx1Z2luUm9vdC5nZXRQYXJlbnRGaWxlKCksIHNvdXJjZUZpbGUpOwotCQlpZiAoIHNyYy5leGlzdHMoKSApIHsKLQkJCUZpbGUgdGd0ID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc291cmNlRmlsZSk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmMsIHRndCk7Ci0JCX0KLQl9Ci0JCi0vLwkvKioKLS8vCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQuIHVybHMgd2lsbCBub3QgYmUKLS8vCSAqIGNoYW5nZWQgYnV0IHJlc291cmNlIGZpbGVzIGlzIHJlbGljYXRlZC4KLS8vCSAqIAotLy8JICogQHBhcmFtIG93bmVyCi0vLwkgKiBAcGFyYW0gc3JjVXJsCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhSZWxhdGl2ZVBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0vLwkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0vLwkJCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOyAvLyBubyB1cmwgY2hhbmdlCi0vLwotLy8JCQkvLyBnZXQgdGhlIHJtYyBvYmplY3QKLS8vCQkJaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgewotLy8JCQkJU3RyaW5nIGlkID0gKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSBvd25lcikKLS8vCQkJCQkJLmdldElkKCk7Ci0vLwkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotLy8JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotLy8JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChpZCk7Ci0vLwkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotLy8JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShuZXcgRmlsZShzb3VyY2VMaWJSb290LAotLy8JCQkJCQkJCVJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnQpKSwgc3JjVXJsKTsKLS8vCQkJCQkJZiA9IGYuZ2V0Q2Fub25pY2FsRmlsZSgpOwotLy8KLS8vCQkJCQkJaW5mby5zb3VyY2VGaWxlID0gZjsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNyY1VybCkKLS8vCQkJCQkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotLy8KLS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIGxvZyBlcnJvciBUT0RPCi0vLwkJfQotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjNjZhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogU3RvcmVzIHRoZSBzZWxlY3Rpb25zIGFuZCBzZXR0aW5ncyBtYWRlIGJ5IHRoZSB1c2VyIGluIHRoZSBFeHBvcnQgWE1MIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MRGF0YSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfTUVUSE9EX0xJQlJBUlkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX01FVEhPRF9QTFVHSU5TID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9NRVRIT0RfQ09ORklHUyA9IDM7Ci0KLQlwcm90ZWN0ZWQgaW50IGV4cG9ydFR5cGUgPSBFWFBPUlRfTUVUSE9EX0xJQlJBUlk7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHNlbGVjdGVkUGx1Z2luczsKLQkKLQlwcm90ZWN0ZWQgSGFzaFNldCBhc3NvY2lhdGVkQ29uZmlnczsKLQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkQ29uZmlnczsKLQotCXByb3RlY3RlZCBTdHJpbmcgeG1sRmlsZTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgZXhwb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhwb3J0VHlwZSgpIHsKLQkJcmV0dXJuIGV4cG9ydFR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZXhwb3J0IHR5cGUuCi0JICogCi0JICogQHBhcmFtIGV4cG9yVHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXhwb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0VHlwZShpbnQgZXhwb3J0VHlwZSkgewotCQl0aGlzLmV4cG9ydFR5cGUgPSBleHBvcnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRQbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFzc29jaWF0ZWQgY29uZmlncyB3aXRoIHJlc3BlY3RlZCB0byBzZWxlY3RlZCBwbHVnLWlucwotCSAqIAotCSAqIEBwYXJhbSBhc3NvY2lhdGVkQ29uZmlnTWFwCi0JICogICAgICAgICAgIE1hcCBvZiBzZWxlY3RlZCBwbHVnLWlucyB0byBhc3NvY2lhdGVkIGNvbmZpZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NvY2lhdGVkQ29uZmlncyhNYXAgYXNzb2NpYXRlZENvbmZpZ01hcCkgewotCQlpZiAoYXNzb2NpYXRlZENvbmZpZ01hcCA9PSBudWxsIHx8IGFzc29jaWF0ZWRDb25maWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzb2NpYXRlZENvbmZpZ3MgPSBuZXcgSGFzaFNldCgpOyAKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFzc29jaWF0ZWRDb25maWdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTGlzdCBjb25maWdMaXN0ID0gKExpc3QpIGl0Lm5leHQoKTsKLQkJCWludCBzeiA9IGNvbmZpZ0xpc3QgPT0gbnVsbCA/IDAgOiBjb25maWdMaXN0LnNpemUoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKCFhc3NvY2lhdGVkQ29uZmlncy5jb250YWlucyhjb25maWcuZ2V0R3VpZCgpKSkgewotCQkJCQlhc3NvY2lhdGVkQ29uZmlncy5hZGQoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbnMuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbnMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFBsdWdpbnMoQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJc2VsZWN0ZWRQbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRDb25maWdzKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWdzKExpc3QgY29uZmlncykgewotCQlzZWxlY3RlZENvbmZpZ3MgPSBjb25maWdzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIFhNTCBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiB4bWxGaWxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIFhNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTEZpbGUoU3RyaW5nIHhtbEZpbGUpIHsKLQkJdGhpcy54bWxGaWxlID0geG1sRmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxMb2dnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MzM0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5GaWxlTG9nZ2VyOwotCi0KLS8qKgotICogTG9nZ2VyIGNsYXNzIGZvciB4bWwgZXhwb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MTG9nZ2VyIGV4dGVuZHMgRmlsZUxvZ2dlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HU19GT0xERVIgPSAibG9ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxMb2dnZXIoRmlsZSBsb2dSb290KSB7Ci0JCXN1cGVyKG5ldyBGaWxlKGxvZ1Jvb3QsIExPR1NfRk9MREVSKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNDg1N2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkNvbnRlbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLklSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtSW1hZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuRGlhZ3JhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5NaWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogWG1sRXhwb3J0IHNlcnZpY2UgY2xhc3MgdG8gcHJvY2VzcyB0aGUgZXhwb3J0aW5nIHRhc2sKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFNlcnZpY2UgewotCi0JLy8gU3RyaW5nIHhtbFBhdGg7Ci0JcHJpdmF0ZSBFeHBvcnRYTUxEYXRhIGRhdGE7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBYTUxMaWJyYXJ5IHhtbExpYjsKLQotCXByaXZhdGUgTGlzdCBkaXNjYXJkZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUV4cG9ydFhNTExvZ2dlciBsb2dnZXIgPSBudWxsOwotCi0JLy8gaW4gY2FzZSB3ZSBuZWVkIHRvIG1hcHBpbmcgdGhlIHVtYSBvYmplY3RzIHRvIHhtbCBvYmplY3RzCi0JLy8gc3VjaCBhcyB0aGUgY29udGVudCBjYXRlZ29yaWVzCi0JcHJpdmF0ZSBNYXAgdW1hSWRUb1htbElkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIERpYWdyYW1IYW5kbGVyIGRpYWdyYW1IYW5kbGVyOwotCQotCS8vdGRzIHdpdGggc3RlcHMKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiB0ZE1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFhNTFNlcnZpY2UoRXhwb3J0WE1MRGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JCWxvZ2dlciA9IG5ldyBFeHBvcnRYTUxMb2dnZXIobmV3IEZpbGUodGhpcy5kYXRhLnhtbEZpbGUpCi0JCQkJLmdldFBhcmVudEZpbGUoKSk7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIGxvZ2dlciBmaWxlLgotCSAqLwotCXB1YmxpYyBGaWxlIGdldExvZ1BhdGgoKSB7Ci0JCXJldHVybiBsb2dnZXIuZ2V0TG9nUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsb2dnZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERvZXMgWE1MIGxpYnJhcnkgZXhwb3J0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhwb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCi0JCQlJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRXhwb3J0UmVzb3VyY2VIYW5kbGVyKAotCQkJCQluZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSksIG5ldyBGaWxlKGRhdGEKLQkJCQkJCQkuZ2V0WE1MRmlsZSgpKS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG5ldyBDb250ZW50UHJvY2Vzc29yKGhhbmRsZXIsCi0JCQkJCXRoaXMubG9nZ2VyKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIoCi0JCQkJCW5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKSwgbmV3IEZpbGUoZGF0YQotCQkJCQkJCS5nZXRYTUxGaWxlKCkpLmdldFBhcmVudEZpbGUoKSkgewotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudE1hcChpbnQgcGFzc0lkKSB7Ci0JCQkJCWlmIChwYXNzSWQgIT0gMCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0vKgkJCQkJU3RyaW5nIGxpYkZvbGRlclBhdGggPSBnZXRTb3VyY2VMaWJSb290KCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCWludCBpeCA9IGxpYkZvbGRlclBhdGgubGVuZ3RoKCk7Ki8KLQkJCQkJCi0JCQkJCU1hcDxTdHJpbmcsIE1hcEVudHJ5VmFsdWU+IG1hcCA9IGdldEVsZW1lbnRNYXAoKTsKLQkJCQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmICh2YWx1ZS50YXJnZXRGaWxlID09IG51bGwpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWUuc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJRURhdGFPYmplY3QgeG1sT2JqID0gZ2V0WG1sT2JqZWN0KHZhbHVlLmVsZW1lbnQpOwotCQkJCQkJCWlmICh4bWxPYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKSB7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYyA9IAotCQkJCQkJCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKSB4bWxPYmo7Ci0JCQkJCQkJCVN0cmluZyB1cmkgPSB2YWx1ZS5zb3VyY2VGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJCQlTdHJpbmcgc3JjUm9vdEZvbGRlclBhdGggPSBnZXRSb290KHZhbHVlLmVsZW1lbnQpLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJCQlpbnQgaXggPSBzcmNSb290Rm9sZGVyUGF0aC5sZW5ndGgoKTsKLQkJCQkJCQkJCi0JCQkJCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoaXggKyAxKTsKLQkJCQkJCQkJdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkodXJpKS50b1N0cmluZygpOwotCQkJCQkJCQlwcm9jLnNldERpYWdyYW1VUkkodXJpKTsKLQkJCQkJCQl9CQkKLQkJCQkJCX0gCi0JCQkJCX0JCi0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWV4cG9ydERpYWdyYW1JbWFnZUZpbGVzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCXByaXZhdGUgdm9pZCBleHBvcnREaWFncmFtSW1hZ2VGaWxlcygpIHsKLQkJCQkJU3RyaW5nIGZvbGRlclBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCQkJCi0JCQkJCURpYWdyYW1JbWFnZVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSBuZXcgRGlhZ3JhbUltYWdlU2VydmljZShudWxsKTsKLQkJCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0Rm9yWE1MRXhwb3J0KHRydWUpOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCU1hcDxTdHJpbmcsIE1hcEVudHJ5VmFsdWU+IG1hcCA9IGdldEVsZW1lbnRNYXAoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCQlNYXBFbnRyeVZhbHVlIHZhbHVlID0gaXQubmV4dCgpOwotCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgdmFsdWUuZWxlbWVudDsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCWRpYWdyYW1TZXJ2aWNlLnNldENvbmZpZyhjb25maWcpOwotCQkJCQkJCUlDb25maWd1cmF0aW9uTWFuYWdlciBtZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZyk7Ci0JCQkJCQkJaWYgKG1nciA9PSBudWxsKSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBtZ3IuZ2V0RWxlbWVudExheW91dE1hbmFnZXIoKTsKLQkJCQkJCQlpZiAobGF5b3V0TWdyID09IG51bGwpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gbGF5b3V0TWdyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpLmdldEZpbHRlcigpOwotCQkJCQkJCQotCQkJCQkJCUZpbGUgZGlhZ3JhbVhtaUZpbGUgPSB2YWx1ZS50YXJnZXRGaWxlOwotCQkJCQkJCWlmIChkaWFncmFtWG1pRmlsZSA9PSBudWxsIHx8ICFkaWFncmFtWG1pRmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHViRGlyKGRpYWdyYW1YbWlGaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJTWFwIGFjdGl2aXRpZXMgPSBNaWdyYXRpb25VdGlsLmdldEFjdGl2aXRpZXMocHJvYywgdHJ1ZSk7CQotCQkJCQkJCWZvciAoQWN0aXZpdHkgYWN0OiAoQ29sbGVjdGlvbjxBY3Rpdml0eT4pIGFjdGl2aXRpZXMudmFsdWVzKCkpIHsKLQkJCQkJCQkJU3RyaW5nW10gdHlwZXMgPSB7CVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVywKLQkJCQkJCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLAotCQkJCQkJCQkJCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZfTsKLQkJCQkJCQkJCi0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCVN0cmluZyBpbWFnZVBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRYbWxFeHBvcnRlZERpYWdyYW1JbWFnZUZpbGVOYW1lKGFjdCwgdHlwZXNbaV0sIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0pQRUcpOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlkaWFncmFtU2VydmljZS5zYXZlRGlhZ3JhbShhY3QsIGltYWdlUGF0aCwgdHlwZXNbaV0sIGZpbHRlciwgU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYykpOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxTZXJ2aWNlX2Vycm9yLAotCQkJCQkJCQkJCQkJCWUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFNlcnZpY2VfZXJyb3IsCi0JCQkJCQkJCQllLmdldE1lc3NhZ2UoKSksIGUpOwotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewkJCQkJCQkJCQkKLQkJCQkJCWRpYWdyYW1TZXJ2aWNlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCS8vIEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLnByaW50RmVhdHVyZU5hbWVNYXBwaW5nKCk7Ci0KLQkJCS8vIGV4cG9ydCB0aGUgY3VycmVudCBsaWJyYXJ5IHRvIHRoZSB4bWwgZmlsZQotCQkJLy8gZ2V0IHRoZSBjdXJyZW50IGxpYnJhcnkgaW5zdGFuY2UgYW5kIGV4cG9ydCBhbGwgdG8gdGhlIHhtbAotCQkJTWV0aG9kTGlicmFyeSBzcmMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQl0aGlzLnhtbExpYiA9IG5ldyBYTUxMaWJyYXJ5KGNvbnRlbnRQcm9jLCBsb2dnZXIsIGRhdGEKLQkJCQkJLmdldFhNTEZpbGUoKSk7Ci0KLQkJCXRoaXMueG1sTGliLmNyZWF0ZUxpYnJhcnkoc3JjLmdldEd1aWQoKSwgc3JjLmdldE5hbWUoKSk7Ci0JCQlFRGF0YU9iamVjdCB0YXJnZXQgPSB0aGlzLnhtbExpYi5nZXRSb290KCk7Ci0KLQkJCWNyZWF0RURhdGFPYmplY3RUcmVlKHNyYywgdGFyZ2V0KTsKLQkJCWl0ZXJhdEVEYXRhT2JqZWN0KHNyYyk7Ci0KLQkJCXRoaXMueG1sTGliLmZpeExpYnJhcnlGb3JFeHBvcnQoKTsKLQkJCXRoaXMueG1sTGliLmZpeFRhc2tEZXNjcmlwdG9yc0ZvckV4cG9ydCh0ZE1hcCk7Ci0JCQkKLQkJCWRpYWdyYW1IYW5kbGVyLnZpc2l0RWxlbWVudE1hcCgwKTsKLQkJCWlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpIHsKLQkJCQl4bWxMaWIuc3RvcmVFeHRyYUluZm8oc3JjLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQl9Ci0JCQl0aGlzLnhtbExpYi5zYXZlKCk7Ci0JCQlkaWFncmFtSGFuZGxlci5leGVjdXRlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MU2VydmljZV9lcnJvciwKLQkJCQkJZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BsdWdpblNlbGVjdGVkKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJaWYgKGRhdGEuZXhwb3J0VHlwZSA9PSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TKSB7Ci0JCQlyZXR1cm4gKGRhdGEuc2VsZWN0ZWRQbHVnaW5zICE9IG51bGwpCi0JCQkJCSYmIGRhdGEuc2VsZWN0ZWRQbHVnaW5zLmNvbnRhaW5zKHBsdWdpbik7Ci0JCX0gZWxzZSBpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbmZpZ0V4Y2x1ZGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpIHsKLQkJCXJldHVybiBkYXRhLmFzc29jaWF0ZWRDb25maWdzID09IG51bGwgfHwgCi0JCQkJCSFkYXRhLmFzc29jaWF0ZWRDb25maWdzLmNvbnRhaW5zKGNvbmZpZy5nZXRHdWlkKCkpOwotCQl9IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdEVEYXRhT2JqZWN0VHJlZShNZXRob2RFbGVtZW50IHNyY09iaiwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldE9iaikgewotCi0JCS8vIGlmIGl0J3MgYSBwbHVnaW4sIHNraXAgYWxsIHRoZSBzeXN0ZW0gcGFja2FnZXMKLQkJLy8gYW5kIGZpbmQgdGhlIHRvcCBtb3N0IHVzZXIgcGFja2FnZXMKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgc3JjT2JqOwotCQkJaWYgKCFpc1BsdWdpblNlbGVjdGVkKHBsdWdpbikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGFsbCBzeXN0ZW0gcGFja2FnZXMgYXJlIGRpc2NhcmRlZAotCQkJZGlzY2FyZGVkRWxlbWVudHMuYWRkQWxsKFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKSk7Ci0KLQkJCUxpc3QgdG9wbW9zdFVzZXJQYWNrYWdlcyA9IGdldFRvcG1vc3RVc2VyUGFja2FnZShwbHVnaW4pOwotCQkJTGlzdCBjYXRlZ29yeVBrZ3MgPSBUbmdVdGlsLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKHBsdWdpbik7Ci0KLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgeG1sUGtnID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHRoaXMueG1sTGliCi0JCQkJCS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJZCA9IHhtbFBrZy5nZXRJZCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHRvcG1vc3RVc2VyUGFja2FnZXMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSBpdHAubmV4dCgpOwotCi0JCQkJLy8gaWYgaXQncyBhIGNhdGVnb3J5IHBhY2thZ2UsCi0JCQkJLy8gY3JlYXRlIGFsbCBjb250YWluZWQgZWxlbWVudHMgaW4gdGhlIHNpbmdsZSBjdXN0b20gY2F0ZWdvcnkKLQkJCQkvLyBwYWNrYWdlCi0JCQkJaWYgKGNhdGVnb3J5UGtncy5jb250YWlucyhwa2cpKSB7Ci0KLQkJCQkJLy8gc2V0IHRoZSBpdCBtYXBwaW5nCi0JCQkJCXNldElkTWFwcGluZyhwa2cuZ2V0R3VpZCgpLCBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlSWQpOwotCQkJCQljcmVhdEVEYXRhT2JqZWN0VHJlZShwa2csIHhtbFBrZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUocGtnLCB0YXJnZXRPYmopOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcmNPYmouZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBuZXh0T2JqID0gaXQubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgY2hpbGQgPSBuZXh0T2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCA/Ci0JCQkJCQkoTWV0aG9kRWxlbWVudCkgbmV4dE9iaiA6IG51bGw7Ci0JCQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gaW4gdW1hIG1vZGVsLCBXb3JrT3JkZXIgaXMgY29udGFpbmVkIGluIHBhY2thZ2UKLQkJCQkvLyBpbiB4bWwgbW9kZWwsIFdvcmtPcmRlciBpcyBjb250YWluZWQgYnkgdGhlIG93bmluZwotCQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50LAotCQkJCS8vIHNvIGRlbGF5IHRoZSBjcmVhdGlvbiBpZiB0aGUgb3duZXIgaXMgYSBwYWNrYWdlCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya09yZGVyCi0JCQkJCQkmJiBzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCQkmJiAhaXNQbHVnaW5TZWxlY3RlZCgoTWV0aG9kUGx1Z2luKSBjaGlsZCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gJiYKLQkJCQkJaXNDb25maWdFeGNsdWRlZCgoTWV0aG9kQ29uZmlndXJhdGlvbikgY2hpbGQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICghaXNEaXNjYXJkZWQoY2hpbGQpKSB7Ci0JCQkJCWNyZWF0ZVhtbE9iamVjdChjaGlsZCwgdGFyZ2V0T2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SWRNYXBwaW5nKFN0cmluZyB1bWFJZCwgU3RyaW5nIHhtbElkKSB7Ci0JCWlmICghdW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KHVtYUlkKSkgewotCQkJdW1hSWRUb1htbElkTWFwLnB1dCh1bWFJZCwgeG1sSWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0WG1sSWQoU3RyaW5nIHVtYUlkKSB7Ci0JCWlmICh1bWFJZFRvWG1sSWRNYXAuY29udGFpbnNLZXkodW1hSWQpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgdW1hSWRUb1htbElkTWFwLmdldCh1bWFJZCk7Ci0JCX0KLQkJcmV0dXJuIHVtYUlkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc2NhcmRlZChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBkaXNjYXJkZWRFbGVtZW50cy5jb250YWlucyhvKTsKLQl9Ci0KLQlwcml2YXRlIEVEYXRhT2JqZWN0IGdldFhtbE9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlTdHJpbmcgaWQgPSBzcmNPYmouZ2V0R3VpZCgpOwotCQlpZiAodW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KGlkKSkgewotCQkJaWQgPSAoU3RyaW5nKSB1bWFJZFRvWG1sSWRNYXAuZ2V0KGlkKTsKLQkJfQotCQlyZXR1cm4gdGhpcy54bWxMaWIuZ2V0RWxlbWVudChpZCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgdW1hIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdW1hRWxlbWVudAotCSAqIEBwYXJhbSB0YXJnZXRDb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgdW1hRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lcikgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHVtYUVsZW1lbnQuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQljcmVhdGVYbWxPYmplY3QodW1hRWxlbWVudCwgdGFyZ2V0Q29udGFpbmVyLCBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgdW1hIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdW1hRWxlbWVudAotCSAqIEBwYXJhbSB0YXJnZXRDb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgdW1hRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lciwgU3RyaW5nIGNvbnRhaW5tZW50RmVhdHVyZSkgewotCi0JCXRyeSB7Ci0JCQlpZiAodW1hRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBnZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgc28gd2UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IG9mIHRoZQotCQkJLy8gc2FtZSB0eXBlCi0JCQlTdHJpbmcgZWxlbWVudFR5cGUgPSB1bWFFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQlFRGF0YU9iamVjdCB4bWxFbGVtZW50ID0geG1sTGliLmNyZWF0ZUVsZW1lbnQodGFyZ2V0Q29udGFpbmVyLAotCQkJCQljb250YWlubWVudEZlYXR1cmUsIHVtYUVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpLAotCQkJCQllbGVtZW50VHlwZSwgdW1hRWxlbWVudC5nZXRHdWlkKCkpOwotCQkJCi0JCQlpZiAodW1hRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7CQkJCQkKLQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgdW1hRWxlbWVudDsKLQkJCQlpZiAodGQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCQkJTGlzdCBzdGVwcyA9IHRkLmdldFNlbGVjdGVkU3RlcHMoKTsKLQkJCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgIXN0ZXBzLmlzRW1wdHkoKSkgewotCQkJCQkJaWYgKHRkTWFwID09IG51bGwpIHsKLQkJCQkJCQl0ZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGFza0Rlc2NyaXB0b3I+KCk7Ci0JCQkJCQl9Ci0JCQkJCQl0ZE1hcC5wdXQodGQuZ2V0R3VpZCgpLCB0ZCk7Ci0JCQkJCX0KLQkJCQl9CQkJCi0JCQl9Ci0JCQkKLQkJCWlmICh4bWxFbGVtZW50ICE9IG51bGwpIHsKLQotCQkJCS8vIHJlY3Vyc2l2ZQotCQkJCWNyZWF0RURhdGFPYmplY3RUcmVlKHVtYUVsZW1lbnQsIHhtbEVsZW1lbnQpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgdGhlIGVycm9yIGFuZCBjb250aW51ZT8/PwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpdGVyYXRFRGF0YU9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlkaWFncmFtSGFuZGxlci5yZWdpc3RlckVsZW1lbnQoc3JjT2JqLCB0cnVlKTsKLQkJCi0JCWlmIChzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBzcmNPYmo7Ci0JCQlpZiAoIWlzUGx1Z2luU2VsZWN0ZWQocGx1Z2luKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWlmIChpc1Byb2Nlc3NlZChzcmNPYmouZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFByb2Nlc3NlZChzcmNPYmouZ2V0R3VpZCgpKTsKLQotCQlFRGF0YU9iamVjdCB0YXJnZXRPYmogPSBnZXRYbWxPYmplY3Qoc3JjT2JqKTsKLQotCQkvLyBpZiBvYmplY3QgaXMgbm90IGNyZWF0ZWQsCi0JCS8vIHdoaWNoIG1lYW5zIGl0J3MgZWl0aGVyIGEgc3lzdGVtIHBhY2thZ2Ugb3Igc29tZXRoaW5nIHdyb25nCi0JCWlmICh0YXJnZXRPYmogPT0gbnVsbCkgewotCQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkvLyBpdGVyYXRlIHRoZSBjaGlsZCBwYWNrYWdlcwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZFBhY2thZ2UpIHNyY09iaikuZ2V0Q2hpbGRQYWNrYWdlcygpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIC8vIGVsZW1lbnRzIGNhbiBiZSByZWZlcmVuY2UgaW4gb3RoZXIgcGx1Z2lucwotCQkJLy8gLy8gZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHRoaXMKLQkJCS8vIGVsc2UgaWYgKCFpc0Rpc2NhcmRlZChzcmNPYmopICkgewotCQkJLy8gbG9nZ2VyLmxvZ1dhcm5pbmcoIldhcm5pbmc6IHhtbCBvYmplY3Qgbm90IGNyZWF0ZWQgZm9yICIgKwotCQkJLy8gTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoc3JjT2JqKSApOwotCQkJLy8gfQotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlFQ2xhc3MgZUNsYXNzID0gc3JjT2JqLmVDbGFzcygpOwotCi0JCUVMaXN0IGZlYXR1cmVzID0gZUNsYXNzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCi0JCQlPYmplY3QgdmFsdWUgPSBzcmNPYmouZUdldChmZWF0dXJlKTsKLQotCQkJdHJ5IHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0ICYmICEgZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJtZXRob2RFbGVtZW50UHJvcGVydHkiKSkgey8vJE5PTi1OTFMtMSQJCi0JCQkJCWZvciAoSXRlcmF0b3IgaXR2ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXR2Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgc3JjX3ZhbHVlID0gKE1ldGhvZEVsZW1lbnQpIGl0di5uZXh0KCk7Ci0KLQkJCQkJCS8vIGhhbmRsZSB0aGUKLQkJCQkJCS8vIFVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IKLQkJCQkJCS8vIGZlYXR1cmUgdmFsdWUKLQkJCQkJCS8vIHRoZSBXb3JrT3JkZXIgaW4gdW1hIGlzIGEgcHJvY2VzcyBlbGVtZW50IGluIGEKLQkJCQkJCS8vIHBhY2thZ2UKLQkJCQkJCS8vIGluIHhtbCBtb2RlbCwgaXQncyBhbiBFRGF0YU9iamVjdCBjb250YWluZWQgYnkgdGhlCi0JCQkJCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJCQkJaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCQkJCS8vIGdldCB0aGUgb3duZXIgb2YgdGhlIFdvcmtPcmRlcgotCQkJCQkJCUVEYXRhT2JqZWN0IHdvcmtPcmRlciA9IGdldFhtbE9iamVjdChzcmNfdmFsdWUpOwotCQkJCQkJCWlmICh3b3JrT3JkZXIgPT0gbnVsbCkgewotCQkJCQkJCQljcmVhdGVYbWxPYmplY3Qoc3JjX3ZhbHVlLCB0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ3b3Jrb3JkZXIgdmFsdWUiKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gc2V0IHRoZSByZWZlcmVuY2UKLQkJCQkJCVN0cmluZyB4bWxJZCA9IGdldFhtbElkKHNyY192YWx1ZS5nZXRHdWlkKCkpOwotCQkJCQkJeG1sTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZS5nZXROYW1lKCksCi0JCQkJCQkJCXhtbElkLCBzcmNfdmFsdWUuZ2V0VHlwZSgpKTsKLQotCQkJCQkJaXRlcmF0RURhdGFPYmplY3Qoc3JjX3ZhbHVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCS8vIGdldCB0aGUgeG1sIG9iamVjdCBhbmQgaXRlcmF0ZSBhZ2FpbgotCQkJCQlNZXRob2RFbGVtZW50IHNyY192YWx1ZSA9IChNZXRob2RFbGVtZW50KSB2YWx1ZTsKLQotCQkJCQkvLyBpZiAoIHNyY192YWx1ZSBpbnN0YW5jZW9mIFdvcmtPcmRlciApIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ3b3Jrb3JkZXIgdmFsdWUiKTsKLQkJCQkJLy8gfQotCi0JCQkJCS8vIGVsZW1lbnRzIGxpa2UgUHJlc2VudGF0aW9uIG1heSBub3QgaGF2ZSBhIENvbnRlbnQKLQkJCQkJLy8gRGVzY3JpcHRpb24KLQkJCQkJLy8gdGhlIG9uZSByZXR1cm5lZCBtYXkgbm90IGhhdmUgYSBjb250YWluZXIKLQkJCQkJaWYgKHNyY192YWx1ZS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHhtbElkID0gZ2V0WG1sSWQoc3JjX3ZhbHVlLmdldEd1aWQoKSk7Ci0JCQkJCQl4bWxMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlLmdldE5hbWUoKSwKLQkJCQkJCQkJeG1sSWQsIHNyY192YWx1ZS5nZXRUeXBlKCkpOwotCi0JCQkJCQlpdGVyYXRFRGF0YU9iamVjdChzcmNfdmFsdWUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICghaXNEaXNjYXJkZWQoc3JjT2JqKSkgewotCQkJCQkvLyBpZiAoIHRhcmdldE9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJocnJlIik7Ci0JCQkJCS8vIH0KLQotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXJUeXBlKSB7Ci0JCQkJCQl2YWx1ZSA9ICgoV29ya09yZGVyVHlwZSkgdmFsdWUpLmdldE5hbWUoKTsKLQkJCQkJfQotCi0JCQkJCXhtbExpYi5zZXRBdHJpYnV0ZUZlYXR1cmVWYWx1ZSh0YXJnZXRPYmosCi0JCQkJCQkJZmVhdHVyZS5nZXROYW1lKCksIHZhbHVlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3IsCi0JCQkJCQlMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShzcmNPYmopLCBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JCQkJbG9nZ2VyLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLy8gZ29pZCBvZiBwcm9jZXNzZWQgZWxlbWVudAotCXByaXZhdGUgTGlzdCBwcm9jZXNzZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlpZiAoIXByb2Nlc3NlZEVsZW1lbnRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQlwcm9jZXNzZWRFbGVtZW50cy5hZGQoZ3VpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0VG9wbW9zdFVzZXJQYWNrYWdlKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19jb3JlX2NvbnRlbnQgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfY3VzdG9tX2NhdGVnb3JpZXMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfZGlzY2lwbGluZXMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfZG9tYWlucyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfcm9sZXNldHMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ190b29scyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3dwdHlwZXMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2NwID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2RwID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19wcm9jX2NvbnRyaWJ1dGlvbiA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCi0JCUxpc3QgcGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGtncy5hZGQocGtnX2NvcmVfY29udGVudCk7Ci0JCXBrZ3MuYWRkKHBrZ19jdXN0b21fY2F0ZWdvcmllcyk7Ci0JCXBrZ3MuYWRkKHBrZ19kaXNjaXBsaW5lcyk7Ci0JCXBrZ3MuYWRkKHBrZ19kb21haW5zKTsKLQkJcGtncy5hZGQocGtnX3JvbGVzZXRzKTsKLQkJcGtncy5hZGQocGtnX3Rvb2xzKTsKLQkJcGtncy5hZGQocGtnX3dwdHlwZXMpOwotCQlwa2dzLmFkZChwa2dfY3ApOwotCQlwa2dzLmFkZChwa2dfZHApOwotCi0JCWlmICggcGtnX3Byb2NfY29udHJpYnV0aW9uICE9IG51bGwgKSB7Ci0JCQlwa2dzLmFkZChwa2dfcHJvY19jb250cmlidXRpb24pOwotCQl9Ci0JCQotCQlyZXR1cm4gcGtnczsKLQotCQkvLyBMaXN0IHN5c3RlbVBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0JCS8vCQkKLQkJLy8gTGlzdCB1bnByb2Nlc3NlZFBrZ3MgPSBuZXcgQXJyYXlMaXN0KHBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpKTsKLQkJLy8gd2hpbGUgKHVucHJvY2Vzc2VkUGtncy5zaXplKCkgPiAwICkgewotCQkvLyBNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSB1bnByb2Nlc3NlZFBrZ3MucmVtb3ZlKDApOwotCQkvLyBpZiAoICFzeXN0ZW1Qa2dzLmNvbnRhaW5zKHBrZykgKSB7Ci0JCS8vIGlmICggIXBrZ3MuY29udGFpbnMocGtnKSApIHsKLQkJLy8gcGtncy5hZGQocGtnKTsKLQkJLy8gfQotCQkvLyBjb250aW51ZTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyBmb3IgKCBJdGVyYXRvciBpdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOwotCQkvLyApIHsKLQkJLy8gTWV0aG9kUGFja2FnZSBwID0gKE1ldGhvZFBhY2thZ2UpaXQubmV4dCgpOwotCQkvLyBpZiAoIHN5c3RlbVBrZ3MuY29udGFpbnMocCkgKQotCQkvLyB7Ci0JCS8vIGlmICggIXVucHJvY2Vzc2VkUGtncy5jb250YWlucyhwKSApIHsKLQkJLy8gdW5wcm9jZXNzZWRQa2dzLmFkZChwKTsKLQkJLy8gfQotCQkvLyB9IGVsc2UgewotCQkvLyBpZiAoICFwa2dzLmNvbnRhaW5zKHApICkgewotCQkvLyBwa2dzLmFkZChwKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gaWYgKCB1bnByb2Nlc3NlZFBrZ3Muc2l6ZSgpID09IDAgKSB7Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyAvLyBuZWVkIHRvIGluY2x1ZGUgdGhlIGNvbnRlbnQgcGFja2FnZXMKLQkJLy8gcGtncy5hZGRBbGwoVG5nVXRpbC5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pKTsKLQotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbVBhY2thZ2UoRURhdGFPYmplY3QgZWxlbWVudCkgewotCS8vCQkKLQkvLyBpZiAoICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8JCQotCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JLy8gaWYgKCBwbHVnaW4gPT0gbnVsbCApIHsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vCQkKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pLmNvbnRhaW5zKGVsZW1lbnQpOwotCS8vCQkKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRmVhdHVyZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9GZWF0dXJlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJlNThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9GZWF0dXJlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0KLS8qKgotICogbWFuYWdlIHRoZSBmZWF0dXJlcyBvZiBFQ2xhc3MuCi0gKiBtYWludGFpbnMgYSBtYXAgb2YgZmVhdHVyZSBuYW1lIHRvIHRoZSBFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0IGZvciBlYXNpZXIgYWNjZXNzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZU1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBGZWF0dXJlTWFuYWdlcigpOwotCQotCS8vcHJpdmF0ZSBNYXAgY2xhc3NNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8vIG1hcCBvZiB1bWEgZmVhdHVyZSBuYW1lIHRvIHRoZSBjb3JyZXNwb25kaW5nIHhtbCBmZWF0dXJlIG5hbWUKLQlwcml2YXRlIE1hcCBmZWF0dXJlTmFtZU1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0JCi0JLy8gdW1hIGZlYXR1cmVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKLQlwcml2YXRlIExpc3QgdW5uZWVkZWRSbWNGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHhtbCBmZWF0dXJlcyB0aGF0IGNhbiBiZSBpZ25vcmVkCi0JcHJpdmF0ZSBMaXN0IHVubmVlZGVkWG1sRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBtYXAgb2YgRUNsYXNzIG5hbWUgdG8gRUNsYXNzIE9iamVjdCBmb3IgeG1sIG1vZGVsCi0JLy8gbm90ZTogd2UgY2FuJ3QgdXNlIGZlYXR1cmUuZ2V0RVR5cGUoKSB0byBnZXQgdGhlIEVDbGFzcyBmcm9tIGZlYXR1cmUKLQkvLyB0aGUgcHJvYmxlbSBpcyB0aGUgYWJvdmUgcmV0dXJuZWQgRUNsYXNzIG1heSBub3QgYmUgdGhlIGNvbmNyZWF0ZSBFQ2xhc3MsIGluc3RlYWQsIGl0IGlzIHRoZSBiYXNlIGNsYXNzCi0JLy8gZm9yIGV4YW1wbGUsIGl0IHJldHVybnMgTWV0aG9kUGFja2FnZSBpbnN0ZWFkIG9mIFByb2Nlc3NQYWNrYWdlIG9yIENvbnRlbnRQYWNrYWdlCi0JLy8gc28gd2UgaGF2ZSB0byBtYWludGFpbiBhIG1hcCBtYW51YWxseQotCXByaXZhdGUgTWFwIHhtbEVDbGFzc01hcCA9IG5ldyBUcmVlTWFwKCk7Ci0JCi0JLy8gbWFwIG9mIEVjbGFzIG5hbWUgdG8gRUNsYXNzIG9iamVjdCBmb3IgdW1hIG1vZGVsCi0JcHJpdmF0ZSBNYXAgdW1hRUNsYXNzTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkKLQlwcml2YXRlIEZlYXR1cmVNYW5hZ2VyKCkgewotCQkKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJPcHRpb25hbElucHV0VG8iLCAib3B0aW9uYWxJbnB1dFRvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIlJvbGUiLCAicm9sZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJUYXNrIiwgInRhc2siKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYWN0aXZpdHlSZWZlcmVuY2VzIiwgImFjdGl2aXR5UmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImFnZ3JlZ2F0ZWRSb2xlcyIsICJhZ2dyZWdhdGVkUm9sZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJhc3NldHMiLCAicmV1c2FibGVBc3NldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJhdHRhY2htZW50cyIsICJhdHRhY2htZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJhc2VDb25maWd1cmF0aW9ucyIsICJiYXNlQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJiYXNlZE9uUHJvY2Vzc2VzIiwgImJhc2VQcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJhc2VzIiwgInJlZmVyZW5jZWRNZXRob2RQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYm9keSIsICJtYWluRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYnJlYWtkb3duRWxlbWVudHMiLCAiYnJlYWtkb3duRWxlbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjYXRlZ29yaXplZEVsZW1lbnRzIiwgImNhdGVnb3JpemVkRWxlbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjaGVja2xpc3RzIiwgImNoZWNrbGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjaGlsZFBhY2thZ2VzIiwgIm1ldGhvZFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLCAiY29tbXVuaWNhdGlvbnNNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb25jZXB0cyIsICJjb25jZXB0LHdoaXRlcGFwZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29uY2VwdHNBbmRQYXBlcnMiLCAiY29uY2VwdCx3aGl0ZXBhcGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbnRhaW5lZEFydGlmYWN0cyIsICJjb250YWluZWRBcnRpZmFjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb250ZW50RWxlbWVudHMiLCAiY29udGVudEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29udGVudFJlZmVyZW5jZXMiLCAiY29udGVudFJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb3B5cmlnaHRTdGF0ZW1lbnQiLCAiY29weXJpZ2h0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIsICJkZWxpdmVyZWRXb3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJkaXNjaXBsaW5lcyIsICJkaXNjaXBsaW5lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImVkdWNhdGlvbk1hdGVyaWFscyIsICJlZHVjYXRpb25NYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJlc3RpbWF0aW9uQ29uZGVyYXRpb25zIiwgImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJleGFtcGxlcyIsICJleGFtcGxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImd1aWQiLCAiaWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZ3VpZGVsaW5lcyIsICJndWlkZWxpbmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiaG93dG9TdGFmZiIsICJob3dUb1N0YWZmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImluY2x1ZGVzUGF0dGVybnMiLCAiaW5jbHVkZXNQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImludGVyZmFjZXMiLCAiaW50ZXJmYWNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImxpbmtUb1ByZWRlY2Vzc29yIiwgInByZWRlY2Vzc29yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIm1ldGhvZFBhY2thZ2VzIiwgIm1ldGhvZFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibWV0aG9kUGx1Z2lucyIsICJtZXRob2RQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgib3duZWRSdWxlcyIsICJvd25lZFJ1bGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIiwgIm1ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicHJvY2Vzc0VsZW1lbnRzIiwgInByb2Nlc3NFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInByb2Nlc3NWaWV3cyIsICJwcm9jZXNzVmlldyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZWZlcmVuY2VXb3JrZmxvd3MiLCAicmVmZXJlbmNlV29ya2Zsb3ciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicmVwb3J0cyIsICJyZXBvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicmV1c2FibGVBc3NldHMiLCAicmV1c2FibGVBc3NldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXVzZWRQYWNrYWdlcyIsICJyZXVzZWRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJvYWRtYXBzIiwgInJvYWRtYXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicm9sZVNldHMiLCAicm9sZVNldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyb2xlcyIsICJyb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInNlY3Rpb25EZXNjcmlwdGlvbiIsICJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzZWN0aW9ucyIsICJzZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInNlbGVjdGVkU3RlcHMiLCAic3RlcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJDYXRlZ29yaWVzIiwgInN1YkNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YmRpc2NpcGxpbmUiLCAic3ViRGlzY2lwbGluZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJQcmFjdGljZXMiLCAic3ViUHJhY3RpY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3ViU2VjdGlvbnMiLCAic3ViU2VjdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJkb21haW5zIiwgInN1YmRvbWFpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdXBlckFjdGl2aXRpZXMiLCAic3VwZXJBY3Rpdml0eSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdXBwb3J0aW5nTWF0ZXJpYWxzIiwgInN1cHBvcnRpbmdNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJ0YXNrcyIsICJ0YXNrIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRlYW1Sb2xlcyIsICJyb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRlbXBsYXRlcyIsICJ0ZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJ0b29sTWVudG9ycyIsICJ0b29sTWVudG9yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIldvcmtQcm9kdWN0IiwgIndvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIndvcmtQcm9kdWN0cyIsICJ3b3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcmVkIiwgInZhbHVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsICJtZXRob2RFbGVtZW50UHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicmVxdWlyZWRSZXN1bHRzIiwgInJlcXVpcmVkUmVzdWx0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImZ1bGZpbGxzIiwgImZ1bGZpbGwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgiY29udGFpbmVyQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgibW9kaWZpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgicGFyZW50UGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJkaWFncmFtcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJtb2RpZmllcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJzdGVwcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJ3b3JrZWRPbkJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoImRpYWdyYW1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cDEiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFhtbEZlYXR1cmVzLmFkZCgiZ3JvdXAyIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRYbWxGZWF0dXJlcy5hZGQoInByZWRlY2Vzc29yMSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlsb2FkWG1sQ2xhc3NlcygpOwotCQlsb2FkUm1jQ2xhc3NlcygpOwotCQkKLS8vCQkvLyBwcmludCBvdXQgdGhlIEVDbGFzc2VzIGFuZCBmZWF0dXJlIG1hcCwgZm9yIHRlc3RpbmcgcHVycG9zZQotLy8JCS8vIGRvbid0IGRlbGV0ZSB0aGlzIGNvZGUgc2VnbWVudAotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09IExvYWRpbmcgRUNsYXNzZXMgZm9yIFhNTCBVbWEgbW9kZWwgPT09PT09PT09PT09PT09PT0iKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0geG1sRUNsYXNzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgaXQubmV4dCgpKTsJCQkKLS8vCQl9Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZU5hbWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0vLwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotLy8JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7Ci0vLwkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCApIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRmZWF0dXJlTmFtZU1hcC5wdXQoXCIiICsga2V5ICsgIlwiLCBcIiIgKyB2YWx1ZSArICJcIik7Iik7CQotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFJtY0NsYXNzZXMoKSB7Ci0JCQotCQkvLyBsb2FkIEVDbGFzcyBtYXAKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmNlcHQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvYWRtYXAoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSk7CQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgbG9hZFhtbENsYXNzZXMoKSB7Ci0JCQotCQkvLyBsb2FkIEVDbGFzcyBtYXAKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25jZXB0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uc3RyYWludCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSk7Ci0vLwkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhdGVnb3J5VHlwZSgpKTsKLS8vCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2F0ZWdvcnlUeXBlT2JqZWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGluZ01ldHJpYygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGNvbWUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3MoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcG9ydCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2FkbWFwKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlbXBsYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya09yZGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkpOwkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRNb2RlbENsYXNzZXMoTWFwIGNsYXNzTWFwLCBFQ2xhc3MgY2xhenopIHsKLQotCQlTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKLQkJaWYoIGNsYXNzTWFwLmNvbnRhaW5zS2V5KG5hbWUpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQljbGFzc01hcC5wdXQobmFtZSwgY2xhenopOwotCQkJCi0JCS8vZm9yIChJdGVyYXRvciBpdCA9IGNsYXp6LmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQlmb3IgKEl0ZXJhdG9yIGVsZW1lbnRzID0gRXh0ZW5kZWRNZXRhRGF0YS5JTlNUQU5DRS5nZXRBbGxFbGVtZW50cyhjbGF6eikuaXRlcmF0b3IoKTsgCi0JCQkJZWxlbWVudHMuaGFzTmV4dCgpOyApIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWVsZW1lbnRzLm5leHQoKTsKLQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gZVN0cnVjdHVyYWxGZWF0dXJlLmdldEVUeXBlKCk7Ci0JCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcyllQ2xhc3NpZmllcjsJCQkJCi0JCQkJLy8gcmVjdXJzaXZlbHkgZmluZCB0aGUgbmVzdGVkdCBmZWF0dXJlcwotCQkJCWxvYWRNb2RlbENsYXNzZXMoY2xhc3NNYXAsIGVDbGFzcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAcGFyYW0gdW1hRmVhdHVyZU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHhtbCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0WG1sRmVhdHVyZShFQ2xhc3MgY2xhenosIFN0cmluZyB1bWFGZWF0dXJlTmFtZSkgewotCQlyZXR1cm4gZ2V0WG1sRmVhdHVyZShjbGF6eiwgdW1hRmVhdHVyZU5hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdW1hQ2xhenoKLQkgKiBAcGFyYW0geG1sRmVhdHVyZU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRSbWNGZWF0dXJlKEVDbGFzcyB1bWFDbGF6eiwgU3RyaW5nIHhtbEZlYXR1cmVOYW1lKSB7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gdW1hQ2xhenouZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotCQkJU3RyaW5nIHVtYUZlYXR1cmVuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQkKLQkJCS8vIGlmIHRoZSBmZWF0dXJlIG5hbWUgaXMgdGhlIHNhbWUsIGdvdCBpdAotCQkJaWYgKCB1bWFGZWF0dXJlbmFtZS5lcXVhbHMoeG1sRmVhdHVyZU5hbWUpICkgewotCQkJCXJldHVybiBmZWF0dXJlOwotCQkJfQotCQkJCi0JCQkvLyBjaGVjayBpZiB0aGUgZmVhdHVyZSBuYW1lIGlzIG1hcHBlZCB0byBhbm90aGVyIHhtbCBmZWF0dXJlIG5hbWUKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSA9IChTdHJpbmcpZmVhdHVyZU5hbWVNYXAuZ2V0KHVtYUZlYXR1cmVuYW1lKTsKLQkJCWlmICggZmVhdHVyZU5hbWUgIT0gbnVsbCApIHsKLQkJCQlpbnQgaSA9IGZlYXR1cmVOYW1lLmluZGV4T2YoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICggaSA+IDAgKSB7Ci0JCQkJCWlmICggZmVhdHVyZU5hbWUuc3Vic3RyaW5nKDAsaSkuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKSB8fCAKLQkJCQkJCSBmZWF0dXJlTmFtZS5zdWJzdHJpbmcoaSsxKS5lcXVhbHMoeG1sRmVhdHVyZU5hbWUpCSkgewotCQkJCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIGZlYXR1cmVOYW1lLmVxdWFscyh4bWxGZWF0dXJlTmFtZSkgKSB7Ci0JCQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQotCQkvL1N5c3RlbS5vdXQucHJpbnQoIkZlYXR1cmVNYW5hZ2VyOiBVbmFibGUgdG8gZmluZCB1bWEgZmVhdHVyZSBmb3IgeG1sIGZlYXR1cmUiICsgeG1sRmVhdHVyZU5hbWUpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjbGF6egotCSAqIEBwYXJhbSB1bWFGZWF0dXJlTmFtZQotCSAqIEBwYXJhbSBvYmplY3RUeXBlCi0JICogQHJldHVybiB0aGUgY29ycnNwb25kaW5nIHhtbCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0WG1sRmVhdHVyZShFQ2xhc3MgY2xhenosIFN0cmluZyB1bWFGZWF0dXJlTmFtZSwgU3RyaW5nIG9iamVjdFR5cGUpIHsKLQotCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSB1bWFGZWF0dXJlTmFtZTsKLQkJaWYgKCBmZWF0dXJlTmFtZU1hcC5jb250YWluc0tleShmZWF0dXJlTmFtZSkgKSB7Ci0JCQlmZWF0dXJlTmFtZSA9IChTdHJpbmcpZmVhdHVyZU5hbWVNYXAuZ2V0KGZlYXR1cmVOYW1lKTsKLQkJCQotCQkJLy8gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHVuaXF1ZSwgdXNlIHRoZSBmaXJzdCBvbmUKLQkJCWludCBpID0gZmVhdHVyZU5hbWUuaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIGkgPiAwICkgewotCQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZU5hbWUuc3Vic3RyaW5nKDAsIGkpOwotCQkJCWlmICggb2JqZWN0VHlwZSAhPSBudWxsICkgewkJCQkKLQkJCQkJLy8gcGljayB0aGUgZmVhdHVyZSBiYXNlZCBvbiBvYmplY3QgdHlwZQotCQkJCQlpZiAoICFuYW1lLmVxdWFsc0lnbm9yZUNhc2Uob2JqZWN0VHlwZSkgKSB7Ci0JCQkJCQluYW1lID0gZmVhdHVyZU5hbWUuc3Vic3RyaW5nKGkrMSk7Ci0JCQkJCX0KLQkJCQkJaWYgKCAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKG9iamVjdFR5cGUpICkgewotCQkJCQkJbmFtZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJZmVhdHVyZU5hbWUgPSBuYW1lOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIGZlYXR1cmVOYW1lID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBjbGF6ei5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZU5hbWUpOwotCQlpZiAoIChmZWF0dXJlPT1udWxsKSAmJiAoY2xhenouZ2V0TmFtZSgpLmVxdWFscygiQ29udGVudENhdGVnb3J5UGFja2FnZSIpKSAmJiBmZWF0dXJlTmFtZS5lcXVhbHMoImNvbnRlbnRFbGVtZW50IikgKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZmVhdHVyZSA9IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCk7Ci0JCX0KLQotLy8JCWlmICggZmVhdHVyZSA9PSBudWxsICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHhtbCBmZWF0dXJlICIgKyBmZWF0dXJlTmFtZSArICIgZm9yIGNsYXNzICIgKyBjbGF6ei5nZXROYW1lKCkpOwotLy8JCX0KLQkJCi0JCXJldHVybiBmZWF0dXJlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdW1hRUNsYXNzTmFtZQotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgeG1sIGVjbGFzcwotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRUNsYXNzKFN0cmluZyB1bWFFQ2xhc3NOYW1lKSB7Ci0vLwkJRUNsYXNzIHJvb3RDbGFzcyA9IEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290KG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFKTsKLS8vCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcylyb290Q2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKHVtYUVDbGFzc05hbWUpOwotLy8JCXJldHVybiBlQ2xhc3M7Ci0JCQotCQlFQ2xhc3MgY2xzID0gKEVDbGFzcyl4bWxFQ2xhc3NNYXAuZ2V0KHVtYUVDbGFzc05hbWUpOwotLy8JCWlmICggY2xzID09IG51bGwgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8geG1sIEVDbGFzcyBmb3IgdW1hIGNsYXNzICIgKyB1bWFFQ2xhc3NOYW1lKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gY2xzOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0geG1sRUNsYXNzTmFtZQotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRUNsYXNzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJtY0VDbGFzcyhTdHJpbmcgeG1sRUNsYXNzTmFtZSkgewotCQlFQ2xhc3MgY2xzID0gKEVDbGFzcyl1bWFFQ2xhc3NNYXAuZ2V0KHhtbEVDbGFzc05hbWUpOwotLy8JCWlmICggY2xzID09IG51bGwgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gdW1hIEVDbGFzcyBmb3IgeG1sIGNsYXNzICIgKyB4bWxFQ2xhc3NOYW1lKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gY2xzOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZmVhdHVyZW5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgdW5uZWVkZWQgZ2l2ZW4gYnkgZmVhdHVyZW5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbm5lZWRlZFJtY0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmVuYW1lKSB7Ci0JCXJldHVybiB1bm5lZWRlZFJtY0ZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmVuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZlYXR1cmVuYW1lCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB4bWwgZmVhdHVyZSBpcyB1bm5lZWRlZCBnaXZlbiBieSBmZWF0dXJlbmFtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VubmVlZGVkWG1sRmVhdHVyZShTdHJpbmcgZmVhdHVyZW5hbWUpIHsKLQkJcmV0dXJuIHVubmVlZGVkWG1sRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZW5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludHMgdGhlIGZlYXR1cmUtbmFtZSBtYXAuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRGZWF0dXJlTmFtZU1hcHBpbmcoKSB7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmNlcHQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb21haW4oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVsaW5lKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RMaWJyYXJ5KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZExpYnJhcnkoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlsZXN0b25lKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbGVzdG9uZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGNvbWUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXBvcnQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXVzYWJsZUFzc2V0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2FkbWFwKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2soKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlbXBsYXRlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlbXBsYXRlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2woKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2xNZW50b3IoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXaGl0ZXBhcGVyKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdoaXRlcGFwZXIoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSk7Ci0vLwkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSk7Ci0vLwkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSk7Ci0KLQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgcHJpbnRGZWF0dXJlKEVPYmplY3Qgb2JqMSwgRU9iamVjdCBvYmoyKSB7Ci0JCUxpc3QgbWF0Y2hlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB1bm1hdGNoZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdW1hRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCi0JCUVMaXN0IGZlYXR1cmVzID0gb2JqMS5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJaWYgKCBmZWF0dXJlTmFtZU1hcC5jb250YWluc0tleShuYW1lKSApIHsKLQkJCQlTdHJpbmcgeG1sX25hbWUgPSAoU3RyaW5nKSBmZWF0dXJlTmFtZU1hcC5nZXQobmFtZSk7Ci0JCQkJaW50IGluZHggPSB4bWxfbmFtZS5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIGluZHggPiAwICkgewotCQkJCQltYXRjaGVkLmFkZCh4bWxfbmFtZS5zdWJzdHJpbmcoMCwgaW5keCkpOwotCQkJCQltYXRjaGVkLmFkZCh4bWxfbmFtZS5zdWJzdHJpbmcoaW5keCsxKS50cmltKCkpOwkJCQkJCi0JCQkJfQotCQkJCWVsc2UgaWYgKCAhbWF0Y2hlZC5jb250YWlucyh4bWxfbmFtZSkgKSB7Ci0JCQkJCW1hdGNoZWQuYWRkKHhtbF9uYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICghdW5uZWVkZWRSbWNGZWF0dXJlcy5jb250YWlucyhuYW1lKSAmJiAhdW1hRmVhdHVyZXMuY29udGFpbnMobmFtZSkgKSB7Ci0JCQkJdW1hRmVhdHVyZXMuYWRkKG5hbWUpOwotCQkJfQotCQl9CQkJCi0JCQotCQlmZWF0dXJlcyA9IG9iajIuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQkJCWlmICggdW1hRmVhdHVyZXMuY29udGFpbnMobmFtZSkgKSB7Ci0JCQkJdW1hRmVhdHVyZXMucmVtb3ZlKG5hbWUpOwotCQkJfSBlbHNlIGlmICghdW5uZWVkZWRYbWxGZWF0dXJlcy5jb250YWlucyhuYW1lKSAmJiAhbWF0Y2hlZC5jb250YWlucyhuYW1lKSAmJiAhdW5tYXRjaGVkLmNvbnRhaW5zKG5hbWUpICkgewotCQkJCXVubWF0Y2hlZC5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0JCi0JCQotCQlpZiAoIHVtYUZlYXR1cmVzLnNpemUoKSArIHVubWF0Y2hlZC5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PSB1bi1tYXRjaGVkIGZlYXR1cmVzIGZvciAiICsgb2JqMS5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiID09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZm9yICggSXRlcmF0b3IgaXQgPSB1bWFGZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRmZWF0dXJlTmFtZU1hcC5wdXQoXCIiICsgbmFtZSArICJcIiwgXCJcIik7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obmFtZSk7Ci0JCX0KLQkJZm9yICggSXRlcmF0b3IgaXQgPSB1bm1hdGNoZWQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JfQotCQotLy8JcHVibGljIGNsYXNzIEZlYXR1cmVNYXAgewotLy8JCXByaXZhdGUgTWFwIGZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQotLy8JCUZlYXR1cmVNYXAoRUNsYXNzIGNsYXp6KSB7Ci0vLwkJCUVMaXN0IGZlYXR1cmVzID0gY2xhenouZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotLy8JCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotLy8JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZS5nZXROYW1lKCksIGZlYXR1cmUpOwotLy8JCQl9CQkJCi0vLwkJfQotLy8JCQotLy8JCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLS8vCQkJcmV0dXJuIChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVNYXAuZ2V0KGZlYXR1cmVOYW1lKTsJCQkKLS8vCQl9Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL1hNTExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2OWYxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQ29udGVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbW1vbmouc2RvLlR5cGU7Ci0KLS8qKgotICogWG1sTGlicmFyeSByZXByZXNlbnRzIGEgbWV0aG9kIGxpYnJhcnkgbG9hZGVkIGZyb20gYSBzcGVjaWZpZWQgeG1sIGZpbGUgVGhlCi0gKiB4bWwgZmlsZSBzaG91bGQgYmUgdmFsaWQgdG8gdGhlIHhtbCBzY2hlbWEgZm9yIE1ldGhvZExpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIFhNTExpYnJhcnkgewotCi0JcHJpdmF0ZSBTdHJpbmcgZmlsZVBhdGg7Ci0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyOwotCi0JcHJpdmF0ZSBDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSByb290T2JqZWN0OwotCi0JLy8gbWFwIG9mIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZSBmb3IgZWFjaCBwbHVnaW4gaWQKLQlwcml2YXRlIE1hcCBjb250ZW50Q2F0ZWdvcnlQa2dNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gbWFwIG9mIGNyZWF0ZWQgZWxlbWVudHMsIGd1aWQgLSBFRGF0YU9iamVjdAotCXByaXZhdGUgTWFwIGVsZW1lbnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBYTUxMaWJyYXJ5KENvbnRlbnRQcm9jZXNzb3IgY29udGVudFByb2MsIElMb2dnZXIgbG9nZ2VyLAotCQkJU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCXRoaXMuY29udGVudFByb2MgPSBjb250ZW50UHJvYzsKLQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JCXRoaXMuZmlsZVBhdGggPSBmaWxlUGF0aDsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gcm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3RPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBmaWxlIHBhdGggc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmZpbGVQYXRoOwotCX0KLQotCS8qKgotCSAqIGdldCBhbiBhcnJheSBvZiBwbHVnaW4gaWRzIGluIHRoZSBsaWJyYXJ5Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQbHVnaW5JZHMoKSB7Ci0JCUxpc3QgcGx1Z2lucyA9IHJvb3RPYmplY3QuZ2V0TWV0aG9kUGx1Z2luKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbcGx1Z2lucy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCWlkc1tpXSA9ICgoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldChpKSkuZ2V0SWQoKTsKLQkJfQotCi0JCXJldHVybiBpZHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIGEgbmV3IFhNTCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVMaWJyYXJ5KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQotCQlNZXRob2RMaWJyYXJ5IHJvb3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIiI7CQkJCQkJCQkvLyROT04tTkxTLTEkCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBWZXJzaW9uVXRpbC5nZXRBbGxUb29sSURzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnModG9vbElEKS5nZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRYTUxTY2hlbWFWZXJzaW9uKCkuZ2V0VG9vbFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdmVyc2lvbiArPSBWZXJzaW9uVXRpbC5YTUxfVkVSU0lPTlNfU0VQQVJBVE9SOwotCQkJfQotCQkJdmVyc2lvbiArPSB0b29sSUQgKyBWZXJzaW9uVXRpbC5YTUxfVE9PTF9WRVJTSU9OX1NFUEFSQVRPUiArIHRvb2xWZXJzaW9uOwkJCi0JCX0KLQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyb290LnNldFRvb2wodmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZShpZCwgbmFtZSwgcm9vdCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHhtbCBmaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8qCQl0cnkgeyovCi0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQotCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCi0JCQkvLwotCQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSSgobmV3IEZpbGUodGhpcy5maWxlUGF0aCkpLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KLQkJCS8vCi0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpCi0JCQkJCS5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0KLQkJCXJlc291cmNlLmxvYWQobmV3IEhhc2hNYXAoKSk7Ci0KLQkJCS8vIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZmlsZVVSSSwgZmFsc2UpOwotCi0JCQkvLyBFQ2xhc3MgZUNsYXNzID0KLQkJCS8vIEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290KHVtYVBhY2thZ2UpOwotCi0JCQlEb2N1bWVudFJvb3Qgcm9vdCA9IChEb2N1bWVudFJvb3QpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByb290LmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdHIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCQl0aGlzLnJvb3RPYmplY3QgPSAoTWV0aG9kTGlicmFyeSkgbzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotLyoKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgbG9hZGVkIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWwsIGZpbGVQYXRoKSwgZSk7Ci0JCX0qLwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSB0aGUgbGlicmFyeSBhbmQgcmV0dXJuIHRoZSByb290IG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBmaWxlUGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgY3JlYXRlKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIE1ldGhvZEVsZW1lbnQgcm9vdCkgewotCi0JCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldAotCQkvLwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQotCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KLQkJLy8KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5maWxlUGF0aCk7Ci0JCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KLQkJLy8KLQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpCi0JCQkJLmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCi0JCS8vIEFkZCB0aGUgaW5pdGlhbCBtb2RlbCBvYmplY3QgdG8gdGhlIGNvbnRlbnRzLgotCQkvLyByb290LnNldElkKGlkKTsKLQkJLy8gcm9vdC5zZXROYW1lKG5hbWUpOwotCi0JCXNldEVsZW1lbnQoaWQsIHJvb3QpOwotCi0JCS8vIHRoaXMucm9vdE9iamVjdCA9IHJvb3Q7Ci0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHJvb3QpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc291cmNlLnNhdmUob3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlpZiAocm9vdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCXRoaXMucm9vdE9iamVjdCA9IChNZXRob2RMaWJyYXJ5KSByb290OwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMucm9vdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuIGEgY29udGVudCBjYXRlcmdvcnkgcGFja2FnZSBpbiB0aGUgcGx1Z2luIGdpdmVuIGJ5IHBsdWdpbklkLgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKFN0cmluZyBwbHVnaW5JZCkgewotCi0JCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgcGtnID0gKENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIGNvbnRlbnRDYXRlZ29yeVBrZ01hcAotCQkJCS5nZXQocGx1Z2luSWQpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCXJldHVybiBwa2c7Ci0JCX0KLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZ2V0RWxlbWVudChwbHVnaW5JZCk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfbm9fcGx1Z2luLAotCQkJCQlwbHVnaW5JZCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCk7Ci0JCXBrZy5zZXROYW1lKCJDb250ZW50Q2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0KLQkJc2V0RWxlbWVudChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHBrZyk7Ci0KLQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2UoKS5hZGQocGtnKTsKLQotCQljb250ZW50Q2F0ZWdvcnlQa2dNYXAucHV0KHBsdWdpbklkLCBwa2cpOwotCQlyZXR1cm4gcGtnOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB4bWwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZSB0byB0aGUgZmlsZSBzeXN0ZW0uCi0JCS8vCi0JCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3RPYmplY3QuZVJlc291cmNlKCk7Ci0JCXJlc291cmNlLnNhdmUob3B0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IG9wZW4oKSB7Ci0JCXJldHVybiByb290T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBiYXNlIGxpYnJhcnkgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0RWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKEVEYXRhT2JqZWN0KSBlbGVtZW50c01hcC5nZXQoZ3VpZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBsaWJyYXJ5IGVsZW1lbnQuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnQoKChNZXRob2RFbGVtZW50KSBvYmopLmdldElkKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gZWxtZW5lbnQgaWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudElkKEVEYXRhT2JqZWN0IG9iaikgewotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldElkKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQlyZXR1cm4gKChXb3JrT3JkZXIpIG9iaikuZ2V0SWQoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbGVtZW50KFN0cmluZyBndWlkLCBFRGF0YU9iamVjdCBvYmopIHsKLQkJLy8gYWRkRWxlbWVudFRvQ29udGFpbmVyKGNvbnRhaW5lciwgb2JqKTsKLQkJaWYgKCFlbGVtZW50c01hcC5jb250YWluc0tleShndWlkKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudCkgb2JqKS5zZXRJZChndWlkKTsKLQkJCX0KLQotCQkJZWxlbWVudHNNYXAucHV0KGd1aWQsIG9iaik7Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgYWRkRWxlbWVudFRvQ29udGFpbmVyKEVEYXRhT2JqZWN0IGNvbnRhaW5lciwgRURhdGFPYmplY3QKLQkvLyBjaGlsZCkgewotCS8vCQkKLQkvLyB0cnkgewotCS8vIGlmICggY29udGFpbmVyID09IG51bGwgKSB7Ci0JLy8gcmV0dXJuOwotCS8vIH0KLQkvLwkJCQotCS8vIGlmICggY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IHx8IGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8Ci0JLy8gY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlICkgewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8JCQkKLQkvLyB3aGlsZSAoICEoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgJiYgKGNvbnRhaW5lciAhPSBudWxsKSApIHsKLQkvLyBjb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOwotCS8vIH0KLQkvLwkJCQotCS8vIGlmICggY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgKSB7Ci0JLy8gKChDb250ZW50UGFja2FnZSljb250YWluZXIpLmdldENvbnRlbnRFbGVtZW50KCkuYWRkKGNoaWxkKTsKLQkvLyB9IGVsc2UgaWYgKCBjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSApIHsKLQkvLyAoKFByb2Nlc3NQYWNrYWdlKWNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKS5hZGQoY2hpbGQpOwotCS8vIH0gZWxzZSB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb24ndCBrbm93IGhvdyB0byBzZXQgZWxlbWVudCAiICsgY2hpbGQpOwotCS8vIH0KLQkvLyB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogY3JlYXRlIGEgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgZ3VpZAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIGNvbnRhaW5lciBvZiB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkCi0JICogQHBhcmFtIHVtYUZlYXR1cmVOYW1lCi0JICogICAgICAgICAgICB1bWEgZmVhdHVyZSBmb3IgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSB1bWFFQ2xhc3NOYW1lCi0JICogICAgICAgICAgICB1bWEgRUNsYXNzIG5hbWUgZm9yIHRoZSBmZWF0dXJlCi0JICogQHBhcmFtIHVtYUVsZW1lbnRUeXBlCi0JICogICAgICAgICAgICB1bWEgZWxlbWVudCB0eXBlIGZvciB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkCi0JICogQHBhcmFtIGd1aWQKLQkgKiAgICAgICAgICAgIGd1aWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEByZXR1cm4gRURhdGFPYmplY3QgdGhlIFhtbCB1bWEgZWxlbWVudAotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVFbGVtZW50KEVEYXRhT2JqZWN0IGNvbnRhaW5lciwKLQkJCVN0cmluZyB1bWFGZWF0dXJlTmFtZSwgU3RyaW5nIHVtYUVDbGFzc05hbWUsIFN0cmluZyB1bWFFbGVtZW50VHlwZSwKLQkJCVN0cmluZyBndWlkKSB7Ci0KLQkJRURhdGFPYmplY3Qgb2JqID0gZ2V0RWxlbWVudChndWlkKTsKLQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQlpZiAoRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuaXNVbm5lZWRlZFJtY0ZlYXR1cmUodW1hRmVhdHVyZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUoCi0JCQkJCWNvbnRhaW5lci5lQ2xhc3MoKSwgdW1hRmVhdHVyZU5hbWUsIHVtYUVsZW1lbnRUeXBlKTsKLQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX2ZlYXR1cmUsIGNvbnRhaW5lcgotCQkJCQkJCQkuZUNsYXNzKCkuZ2V0TmFtZSgpLCB1bWFGZWF0dXJlTmFtZSkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBpZiAoICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpICkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBjcmVhdGluZyBlbGVtZW50OiBjb250YWlubWVudCBmZWF0dXJlCi0JCQkvLyBzaG91bGQgYmUgRVJlZmVyZW5jZSB0eXBlLiAiICsgZmVhdHVyZS5nZXROYW1lKCkpOwotCQkJLy8gLy9yZXR1cm4gbnVsbDsKLQkJCS8vIH0KLQotCQkJLy8gLy8gdGhpcyBpcyBhbiBlYXNpZXIgd2F5LCB0ZXN0IGl0LAotCQkJLy8gLy8gZG9lcyBub3Qgd29yayBzaW5jZSBmZWF0dXJlLmdldEVUeXBlKCkgcmV0dXJucyB0aGUgYmFzZQotCQkJLy8gZWxlbWVudCB0eXBlLCBub3QgdGhlIGV4dGVuZGVkIG9uZQotCQkJLy8gLy8gZm9yIGV4YW1wbGUsIGl0IHJldHVybnMgTWV0aG9kUGFja2FnZSBpbnN0ZWFkIG9mCi0JCQkvLyBQcm9jZXNzUGFja2FnZSBvciBDb250ZW50UGFja2FnZQotCQkJLy8gLy8gc28gd2UgbmVlZCB0byBtYWtlIG91ciBvd24gbWFwCi0JCQkvLyBFQ2xhc3NpZmllciBjID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJLy8gaWYgKCAhYy5nZXROYW1lKCkuZXF1YWxzKHVtYUVDbGFzc05hbWUpICkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFQ2xhc3MgbmFtZSBub3QgbWF0Y2g6ICIgKyBjLmdldE5hbWUoKSArICIKLQkJCS8vIC0tLSAiICsgdW1hRUNsYXNzTmFtZSk7Ci0JCQkvLyB9Ci0KLQkJCUVDbGFzcyBvYmpDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFCi0JCQkJCS5nZXRYbWxFQ2xhc3ModW1hRUNsYXNzTmFtZSk7Ci0JCQlpZiAob2JqQ2xhc3MgPT0gbnVsbCkgewotCQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfbm9fY2xhc3MsIHVtYUVDbGFzc05hbWUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJb2JqID0gKEVEYXRhT2JqZWN0KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsKLQkJCXNldEVsZW1lbnQoZ3VpZCwgb2JqKTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCS8vIFdvcmtPcmRlciBpcyBub3QgY29udGFpbmVkIGluIGEgcHJvY2Vzc1BhY2thZ2UgaW4geG1sIG1vZGVsCi0JCQkJLy8gaXQncyBjb250YWluZWQgYnkgdGhlIGJyZWFrZG93bkVsZW1lbnQKLQkJCQkvLyBzbyB3ZSBzYXZlIHRoZSBlbGVtZW50IGlkLW9iamVjdCB0byB0aGUgbWFwIGFuZCBjb250aW51ZQotCQkJCS8vIGRvbid0IHNldCB0aGUgZmVhdHVyZSB2YWx1ZQotCQkJCQotCQkJCS8vIHRoZSB3b3JrT3JkZXIgaW4gRVBGIFVNQSBtb2RlbCBpcyByZWZlcmVuY2VkIGJ5IGZlYXR1cmUKLQkJCQkvLyBXb3JrQnJlYWtEb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvciwKLQkJCQkvLyB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlIGluIHRoZSB4bWwgbW9kZWwgaXMgCi0JCQkJLy8gV29ya0JyZWFrRG93bkVsZW1lbnRfUHJlZGVjZXNzb3IsIAotCQkJCS8vIHRoZSBmZWF0dXJlIHZhbHVlIGlzIGEgbGlzdCBvZiBndWlkIG9mIHRoZSBXb3JrT3JkZXJzCi0JCQkJLy8gd2hlbiB0aGlzIGZlYXR1cmUgdmFsdWUgaXMgc2V0IGluIHRoZSBzZXRSZWZlcmVuY2VWYWx1ZSgpIGNhbGwKLQkJCQkvLyBnZXQgdGhlIFhtbFVtYSBvYmplY3QsIGlmIGl0J3MgV29ya09yZGVyLCAKLQkJCQkvLyBhZGQgdG8gdGhlIGN1cnJlbnQgd29ya29yZGVyIHRvIHRoZSBXb3JrQnJlYWtEb3duRWxlbWVudAotCQkJCS8vIEppbmh1YSBYaSwgMDgvMjQvMjAwNgotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0KLQkJCS8vIG5vdGU6IGFsbCBlbGVtZW50IHJlZmVyZW5jZXMgYXJlIHN0cmluZyB0eXBlIChpZCkKLQkJCS8vIHBhY2thZ2UgcmVmZXJlbmNlcyBhcmUgb2JqZWN0IHJlZmVyZW5jZXMKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJCQl2YWx1ZXMuYWRkKGd1aWQpOwotCi0JCQkJCQkvLyBuZWVkIHRvIHB1dCB0aGUgb2JqZWN0IGluIGEgY29udGFpbmVyCi0JCQkJCQkvLyBmb3IgZXhhbXBsZSwgdGhlIENvbnRhaWVkQXJ0aWZhY3RzCi0JCQkJCQlhZGRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0KLQkJCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZXMuYWRkKG9iaik7Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkubG9nV2FybmluZyhOTFMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50LAotCQkJCQkJCQkJCQkJZmVhdHVyZS5nZXROYW1lKCkpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoCi0JCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlLCBvYmosCi0JCQkJCQkJY29udGFpbmVyKSwgZSk7Ci0JCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQkJY29udGFpbmVyLmVTZXQoZmVhdHVyZSwgZ3VpZCk7Ci0JCQkJCWFkZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgb2JqKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCWNvbnRhaW5lci5lU2V0KGZlYXR1cmUsIG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoCi0JCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQsCi0JCQkJCQkJZmVhdHVyZS5nZXROYW1lKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb2JqOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb0NvbnRhaW5lcihFT2JqZWN0IGNvbnRhaW5lciwgRU9iamVjdCBvYmopIHsKLQotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCSgoQ29udGVudFBhY2thZ2UpIGNvbnRhaW5lcikuZ2V0Q29udGVudEVsZW1lbnQoKS5hZGQoKENvbnRlbnRFbGVtZW50KW9iaik7Ci0JCX0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKS5hZGQoKFByb2Nlc3NFbGVtZW50KW9iaik7Ci0JCQkvLyB9IGVsc2UgaWYgKCAob2JqIGluc3RhbmNlb2YgQ29uc3RyYWludCkgJiYgKGNvbnRhaW5lciBpbnN0YW5jZW9mCi0JCQkvLyBNZXRob2RFbGVtZW50KSApIHsKLQkJCS8vIC8vIHRoZSBvd25lciBydWxlIHNob3VsZCBiZSBhIGNvbnRhaW5tZW50IDAuLm4gZmVhdHVyZSwgd2FpdGluZwotCQkJLy8gZm9yIG1vZGVsIGZpeAotCQkJLy8gLy8oKE1ldGhvZEVsZW1lbnQpY29udGFpbmVyKS5zZXRPCi0JCX0gZWxzZSB7Ci0JCQlhZGRUb0NvbnRhaW5lcihjb250YWluZXIuZUNvbnRhaW5lcigpLCBvYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZS4KLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHJpYnV0ZUZlYXR1cmVWYWx1ZShFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwKLQkJCU9iamVjdCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCBmZWF0dXJlTmFtZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBFRGF0YU9iamVjdCkgewotCQkJaWYgKGZlYXR1cmVOYW1lLmVxdWFscygibWV0aG9kRWxlbWVudFByb3BlcnR5IikpIHsJCS8vJE5PTi1OTFMtMSQKLQkJCQlzZXRNZXBGZWF0dXJlVmFsdWUob2JqLCBmZWF0dXJlTmFtZSwgdmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWUsCi0JCQkJCWZlYXR1cmVOYW1lLCB2YWx1ZSkpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSBmZWF0dXJlIGFuZCBzZXQgdGhlIHZhbHVlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0WG1sRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCi0JCQkvLyBpZ25vcmUgbWlzc2luZyBmZWF0dXJlcyBmb3IgV29ya09yZGVyCi0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBXb3JrT3JkZXIpKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBmZWF0dXJlTmFtZSwgb2JqLCB2YWx1ZSB9OwotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZ1dhcm5pbmcoTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yLAotCQkJCQkJCQkJCXBhcmFzKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyAxNTg2ODggLSBNaXNzaW5nIHRlbXBsYXRlIGZpbGVzIGluIGV4cG9ydGVkIHhtbCBsaWJyYXJ5Ci0JCS8vIHByb2Nlc3MgdGhlIGF0dGFjaG1lbnQgdXJsCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKSApIHsKLQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKLQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVBdHRhY2htZW50UmVzb3VyY2VzKG9iaiwgdmFsdWUudG9TdHJpbmcoKS50cmltKCkpOwotCQkJfQotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JCQotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygidmFyaWFiaWxpdHlUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IFZhcmlhYmlsaXR5VHlwZS5nZXQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoImxpbmtUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IFdvcmtPcmRlclR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBqYXZhLnV0aWwuRGF0ZSkgewotCQkJCQkvLyBjb252ZXJ0IGphdmEudXRpbC5EYXRlIHRvIHhtbCBEYXRlCi0JCQkJCXZhbHVlID0gZ2V0WG1sRGF0ZSgoamF2YS51dGlsLkRhdGUpIHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKChjb250ZW50UHJvYyAhPSBudWxsKQotCQkJCQkJJiYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQkmJiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXZhbHVlID0gY29udGVudFByb2MucmVzb2x2ZVJlc291cmNlRmlsZXMoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgKFN0cmluZykgdmFsdWUpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBqYXZhLm5ldC5VUkkpIHsJCQkJCQkJCQkKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gc3JjUGx1Z2luID0gRXhwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFNvdXJjZVBsdWdpbigob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgb2JqKTsJCQotCQkJCQl2YWx1ZSA9IHNyY1BsdWdpbi5nZXROYW1lKCkgKyAiLyIgKyAoKGphdmEubmV0LlVSSSkgdmFsdWUpLmdldFBhdGgoKTsgLy8vLyROT04tTkxTLTEkCi0JCQkJCWlmIChjb250ZW50UHJvYyAhPSBudWxsKSB7Ci0JCQkJCQljb250ZW50UHJvYy5jb3B5UmVzb3VyY2UoKFN0cmluZykgdmFsdWUsIG9iaiwgc3JjUGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGZlYXR1cmVOYW1lLCBvYmosIHZhbHVlIH07Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzIsCi0JCQkJCQkJCQkJCQlwYXJhcyksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKEV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zKTsgCi0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXBGZWF0dXJlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlMaXN0IHNyY0xpc3QgPSAoTGlzdCkgdmFsdWU7Ci0JCWlmIChzcmNMaXN0ID09IG51bGwgfHwgc3JjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCUxpc3QgdGd0TGlzdCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgc3JjTGlzdC5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IHNyY0l0ZW0gPSBzcmNMaXN0LmdldChpKTsKLQkJCWlmIChzcmNJdGVtIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkpIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXAgPSAKLQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgc3JjSXRlbTsKLQkJCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCS5nZXRYbWxFQ2xhc3MoIk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOwkvLyROT04tTkxTLTEkCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUob2JqQ2xhc3MpOwotCQkJCXhtbE1lcC5zZXRWYWx1ZShtZXAuZ2V0VmFsdWUoKSk7Ci0JCQkJeG1sTWVwLnNldE5hbWUobWVwLmdldE5hbWUoKSk7Ci0JCQkJdGd0TGlzdC5hZGQoeG1sTWVwKTsKLQkJCX0KLQkJfQotCQkvL29iai5lU2V0KGZlYXR1cmUsIHRndExpc3QpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgaWQgcmVmZXJlbmNlcyBmb3IgdGhlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEVEYXRhT2JqZWN0IHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgZmVhdHVyZSBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGlkVmFsdWUKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgaWQgcmVmZXJlbmNlIHZhbHVlIG9mIHRoZSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlVHlwZQotCSAqICAgICAgICAgICAgVHlwZSB0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIHJlZmVyZW5jZS4gTmVlZCB0byBoYXZlIHRoaXMgdG8KLQkgKiAgICAgICAgICAgIGRldGVybWluZSB0aGUgeG1sIGZlYXR1cmUgaW4gY2FzZSB0aGUgZmVhdHVyZSBtYXBwdGluZyBpcyBub3QKLQkgKiAgICAgICAgICAgIHVuaXF1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlTdHJpbmcgaWRWYWx1ZSwgVHlwZSB2YWx1ZVR5cGUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCBpZFZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5pc1VubmVlZGVkUm1jRmVhdHVyZShmZWF0dXJlTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgdGhlIGZlYXR1cmUgYW5kIHNldCB0aGUgdmFsdWUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUsIHZhbHVlVHlwZS5nZXROYW1lKCkpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGZlYXR1cmVOYW1lLCBvYmosIGlkVmFsdWUgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlLCBwYXJhcykpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHN0ciA9IGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXROYW1lKCk7Ci0JCWlmIChzdHIuZXF1YWxzKCJTdHJpbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgbCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIWwuY29udGFpbnMoaWRWYWx1ZSkpIHsKLQkJCQkJbC5hZGQoaWRWYWx1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlvYmouZVNldChmZWF0dXJlLCBpZFZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSkgewotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgYnJlYWtkb3duIGVsZW1lbnQuIEluIHVtYSwgYnJlYWtkb3duCi0JCQkvLyBlbGVtZW50cyBhcmUgdW5kZXIgcHJvY2VzcyBwYWNrYWdlcwotCQkJLy8gaW4geG1sIG1vZGVsLCB0aGV5IGFyZSBvd25lZCBieSB0aGUgYWN0aXZpdHkKLQkJCUVEYXRhT2JqZWN0IHYgPSBnZXRFbGVtZW50KGlkVmFsdWUpOwotCQkJaWYgKHYgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJRU9iamVjdCBvbGRfY29udGFpbmVyID0gdi5lQ29udGFpbmVyKCk7Ci0JCQkJTGlzdCBsID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghbC5jb250YWlucyh2KSkgewotCQkJCQlsLmFkZCh2KTsKLQkJCQl9Ci0KLQkJCQkvLyBpZiB0aGUgb2xkIGNvbnRhaW5lciBwYWNrYWdlIGlzIGVtcHR5LCBkZWxldGUgaXQKLQkJCQlpZiAoKG9sZF9jb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQkJCSYmIChvbGRfY29udGFpbmVyLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkJCWlmICgoKFByb2Nlc3NQYWNrYWdlKSBvbGRfY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudCgpCi0JCQkJCQkJLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQkoKFByb2Nlc3NQYWNrYWdlKSBvbGRfY29udGFpbmVyLmVDb250YWluZXIoKSkKLQkJCQkJCQkJLmdldE1ldGhvZFBhY2thZ2UoKS5yZW1vdmUob2xkX2NvbnRhaW5lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSApIHsKLQkJCS8vIHRoZSBvcmtlciBvcmRlciBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCS8vIHNpbmNlIGluIFhtbCBtb2RlbCB0aGUgd29yayBvcmRlciBpcyBjb250YWluZWQgYnkgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkvLyBKaW5odWEgWGksIDA4LzI0LzIwMDYKLQkJCU9iamVjdCB2ID0gZ2V0RWxlbWVudChpZFZhbHVlKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJKChXb3JrQnJlYWtkb3duRWxlbWVudClvYmopLmdldFByZWRlY2Vzc29yKCkuYWRkKChXb3JrT3JkZXIpdik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3QgaGFuZGxlZCwgYWRkIHdhcm5pbmcgbG9nCi0JCQkvLyB0aGUgaWQgZmVhdHVyZSB2YWx1ZSBpcyBub3Qgc2V0Ci0JCQkvLyBKSW5odWEgWGksIFRPRE8KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkdAotCSAqIEByZXR1cm4gYSBYbWwgZGF0ZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFhtbERhdGUoamF2YS51dGlsLkRhdGUgZHQpIHsKLQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzcyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkdFN0ciA9IHNkZi5mb3JtYXQoZHQpOwotCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJyAnLCAnVCcpOwotCQlFRGF0YVR5cGUgdHlwZSA9IFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXREYXRlVGltZSgpOwotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcodHlwZSwgZHRTdHIpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCXN0ciA9IG1lLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBtZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmogIT0gbnVsbCkgewotCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qKgotCSAqIGZpeCB0aGUgbGlicmFyeSBzbyB0aGF0IGl0IG1lZXRzIHRoZSB1bWEgbGlicmFyeSBzdGFuZGFyZHMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhMaWJyYXJ5Rm9ySW1wb3J0KCkgewotCi0JCWZpeEd1aWQoKE1ldGhvZEVsZW1lbnQpIHJvb3RPYmplY3QpOwotCi0JCWlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kTGlicmFyeSkgcm9vdE9iamVjdCkuZ2V0TWV0aG9kUGx1Z2luKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlmaXhQbHVnaW4oKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlmaXhQbHVnaW4oKE1ldGhvZFBsdWdpbikgcm9vdE9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBmaXggdGhlIGxpYnJhcnkgc28gdGhhdCBpdCBtZWV0cyB0aGUgeG1sIHNjaGVtYSBzdGFuZGFyZHMKLQkgKiBhbHNvIHJlbW92ZSBwb3NzaWJsZSBzdHJ1Y3R1cmUgZXJyb3JzIHN1Y2ggYXMgUHJvY2Vzc0NvbXBvbmVudCB3aXRob3V0IHByb2Nlc3MgaW4gaXQuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4TGlicmFyeUZvckV4cG9ydCgpIHsKLQotCQlMaXN0IGludmFsaWRJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kTGlicmFyeSkgcm9vdE9iamVjdCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KW9iaikuZ2V0UHJvY2VzcygpOwotCQkJCWlmICggcHJvYyA9PSBudWxsICkgewotCQkJCQlpbnZhbGlkSXRlbXMuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIHRoZSBvYmplY3RzCi0JCXdoaWxlIChpbnZhbGlkSXRlbXMuc2l6ZSgpID4gMCApIHsKLQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpaW52YWxpZEl0ZW1zLnJlbW92ZSgwKTsKLQkJCUVjb3JlVXRpbC5yZW1vdmUob2JqKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBmaXggdGFzayBkZXNjcmlwdG9ycyBmb3IgZXhwb3J0Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4VGFza0Rlc2NyaXB0b3JzRm9yRXhwb3J0KE1hcDxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiB0ZE1hcCkgewotCQlpZiAodGRNYXAgPT0gbnVsbCB8fCB0ZE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgVGFza0Rlc2NyaXB0b3I+PiBpdCA9IHRkTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgVGFza0Rlc2NyaXB0b3I+IGVudHJ5ID0gaXQubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIHhtbFRkID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yKSBlbGVtZW50c01hcC5nZXQoZ3VpZCk7Ci0JCQlhc3NlcnQoeG1sVGQgIT0gbnVsbCk7Ci0JCQlpZiAoeG1sVGQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJTGlzdCBzdGVwcyA9IHRkLmdldFNlbGVjdGVkU3RlcHMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzdGVwcy5zaXplKCk7IGkrKykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCBzdGVwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgc3RlcHMuZ2V0KGkpOwotCQkJCVNlY3Rpb24geG1sU3RlcCA9ICAoU2VjdGlvbikgZWxlbWVudHNNYXAuZ2V0KHN0ZXAuZ2V0R3VpZCgpKTsKLQkJCQlhc3NlcnQoeG1sU3RlcCAhPSBudWxsKTsKLQkJCQlpZiAoeG1sU3RlcCAhPSBudWxsKSB7Ci0JCQkJCXhtbFN0ZXAgPSAoU2VjdGlvbikgRWNvcmVVdGlsLmNvcHkoeG1sU3RlcCk7Ci0JCQkJCXhtbFRkLmdldFN0ZXAoKS5hZGQoeG1sU3RlcCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9CQkKLQl9Ci0JCQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIHJlZmVyZW5jZWQgcGx1Z2lucyBmb3IgdGhlIGxpYnJhcnkuIFRoZSByZWZlcmVuY2VkIHBsdWdpbnMKLQkgKiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvbmVzIGluc2lkZSB0aGlzIGxpYnJhcnkuIFdoZW4gaW1wb3J0aW5nLCB0aGVzZQotCSAqIHBsdWdpbnMgbXVzdCBiZSBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgYWxyZWFkeS4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHJlZmVyZW5jZWQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZmVyZW5jZWRQbHVnaW5zKCkgewotCi0JCUxpc3QgZXh0ZXJuYWxQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICghKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcmV0dXJuIGV4dGVybmFsUGx1Z2luczsKLQkJfQotCi0JCUxpc3Qgc2VsZWN0ZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChNZXRob2RMaWJyYXJ5KSByb290T2JqZWN0KS5nZXRNZXRob2RQbHVnaW4oKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcGx1Z2luLmdldElkKCk7Ci0JCQlzZWxlY3RlZFBsdWdpbnMuYWRkKGlkKTsKLQkJCWlmIChleHRlcm5hbFBsdWdpbnMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZXh0ZXJuYWxQbHVnaW5zLnJlbW92ZShpZCk7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcGx1Z2luLmdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5pdGVyYXRvcigpOyBpdHIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcmVmID0gKFN0cmluZykgaXRyLm5leHQoKTsKLQkJCQlpZiAoIXNlbGVjdGVkUGx1Z2lucy5jb250YWlucyhyZWYpCi0JCQkJCQkmJiAhZXh0ZXJuYWxQbHVnaW5zLmNvbnRhaW5zKHJlZikpIHsKLQkJCQkJZXh0ZXJuYWxQbHVnaW5zLmFkZChyZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBleHRlcm5hbFBsdWdpbnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpeEd1aWQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIHRoZSB4bWwgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGlkIHNwZWNpZmllZCwgY3JlYXRlIGEgbmV3IG9uZQotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldElkKCk7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCQllbGVtZW50LnNldElkKGlkKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9uZXdfaWQsCi0JCQkJCWdldFN0cmluZyhlbGVtZW50KSwgaWQpOwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBlbGVtZW50IGhhcyBhIHVuaXF1ZSBpZCBvciBub3QKLQkJCU9iamVjdCBvbGQgPSBnZXRFbGVtZW50KGlkKTsKLQkJCWlmICgob2xkICE9IG51bGwpICYmIChvbGQgIT0gZWxlbWVudCkpIHsKLQkJCQlpZiAoISAoIChvbGQgaW5zdGFuY2VvZiBTZWN0aW9uKSAmJiAKLQkJCQkJCShlbGVtZW50IGluc3RhbmNlb2YgU2VjdGlvbikgCi0JCQkJCSAgICkpIHsKLQkJCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoCi0JCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlLCBpZCkpOwotCQkJCX0KLQkJCX0KLQotCQkJc2V0RWxlbWVudChpZCwgZWxlbWVudCk7Ci0JCX0KLQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGRyZW4KLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlmaXhHdWlkKChNZXRob2RFbGVtZW50KSBvKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXhQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCi0JCS8vIGZpbmQgYWxsIHByb2Nlc3NlcyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIHdyYXBwZWQgd2l0aCBhCi0JCS8vIFByb2Nlc3NDb21wb25lbnQsCi0JCS8vIGlmIG5vdCwgY3JlYXRlIG9uZS4KLQkJLy8gY29sbGVjdCB0aGUgcHJvY2Vzc2VzIHRvIGJlIGZpeGVkLAotCQkvLyBkb24ndCBmaXggd2l0aGluIHRoZSBpdGVyYXRpb24sIG1heSBjYXVzZSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQkvLyBleGVjZXB0aW9uCi0JCUxpc3QgcHJvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNQcm9jZXNzKG8pKSB7Ci0JCQkJcHJvY3MuYWRkKG8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb2NzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9jcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UHJvY2Vzcygob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykgaXQubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluIEVQRiwgYSBwcm9jZXNzIChDYXBhYmlsaXR5IHBhdHRlcm4gYW5kIERlbGl2ZXJ5IFByb2Nlc3MpIGNhbiBiZSByZXNpZGUKLQkgKiBpbiBhIFByb2Nlc3NQYWNrYWdlIG9yIGEgUHJvY2Vzc0NvbXBvbmVudC4gSWYgaXQncyBpbiBhIHByb2Nlc3NDb21wb25lbnQsCi0JICogaXQgaXMgdHJlYXRlZCBhcyBhIHJvb3QgbGV2ZWwgcHJvY2Vzcy4gSWYgaXQncyBpbiBhIFByb2Nlc3NQYWNrYWdlLCBpdCBpcwotCSAqIHRyZWF0ZWQgYXMgYSBsb2NhbCBjb3B5IG9mIGFub3RoZXIgcHJvY2Vzcy4gU28gd2UgbmVlZCB0byBjaGVjayB0aGUKLQkgKiBwYXJlbnQgYW5kIHNlZSBpdCB0aGlzIHByb2Nlc3MgaXMgY29udGFpbmVkIGJ5IGEgUHJvY2Vzc0NvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvY2VzcyhFT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJb2JqID0gb2JqLmVDb250YWluZXIoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gaWYgaXQncyBpbW1lZGlhdGUgcGFyZW50IGlzIG5vdCBhIFByb2Nlc3NDb21wb25lbnQgYnV0IGl0J3Mgd2l0aGluIGEKLQkJLy8gUHJvY2Vzc0NvbXBvbmVudAotCQkvLyBpdCdzIGEgbG9jYWwgY29weSBvZiB0aGUgcHJvY2VzcwotCQl3aGlsZSAoKChvYmogPSBvYmouZUNvbnRhaW5lcigpKSAhPSBudWxsKQotCQkJCSYmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpeFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jKSB7Ci0JCUVEYXRhT2JqZWN0IGNvbnRhaW5lciA9IChFRGF0YU9iamVjdCkgcHJvYy5lQ29udGFpbmVyKCk7Ci0JCVByb2Nlc3NDb21wb25lbnQgcGMgPSBudWxsOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyLAotCQkJCQkJCXByb2MuZ2V0TmFtZSgpLCBjb250YWluZXIuZ2V0VHlwZSgpLmdldE5hbWUoKSk7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhtc2cpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCVN0cmluZyBpZCA9IGdldFRhcmdldFBhcmVudElkKHByb2MuZ2V0SWQoKSk7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlpZCA9IEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQkJfQotCi0JCXBjLnNldElkKGlkKTsKLQkJcGMuc2V0TmFtZShwcm9jLmdldE5hbWUoKSk7Ci0JCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKS5yZW1vdmUocHJvYyk7Ci0JCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0TWV0aG9kUGFja2FnZSgpLmFkZChwYyk7Ci0JCXBjLnNldFByb2Nlc3MocHJvYyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBpZiB0aGUgcHJvY2VzcyBleGlzdHMgaW4gdGhlIHRhcmdldCBsaWJyYXJ5LCBnZXQgdGhlIHByb2Nlc3MgY29tcG9uZW50IGlkCi0JICogZnJvbSB0aGUgdGFyZ2V0IGxpYnJhcnkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRUYXJnZXRQYXJlbnRJZChTdHJpbmcgaWQpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChpZCk7Ci0JCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQlvYmogPSBvYmouZUNvbnRhaW5lcigpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSBvYmopLmdldEd1aWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGtnCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBhbGwgcHJvY2Vzc2VzIGluIHBrZy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3Nlcyhwa2csIHByb2Nlc3Nlcyk7Ci0KLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnLCBMaXN0IHByb2Nlc3NlcykgewotCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwID0gKChQcm9jZXNzQ29tcG9uZW50KSBwa2cpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocCAhPSBudWxsICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkpIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZy5nZXRNZXRob2RQYWNrYWdlKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHByb2Nlc3Nlcyk7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTYXZlIGV4dHJhIGluZm8gKGFsbCBwbHVnaW4gZ3VpZHMgYW5kIG5hbWVzKSBpbiBsaWJUYWcncyBNZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZUV4dHJhSW5mbyhMaXN0PG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUocm9vdE9iamVjdAotCQkJCS5lQ2xhc3MoKSwgIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOwkJLy8kTk9OLU5MUy0xJAotCQkKLQkJTGlzdCBtZXBMaXN0ID0gKExpc3QpIHJvb3RPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJRUNsYXNzIG1lcENsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0WG1sRUNsYXNzKCJNZXRob2RFbGVtZW50UHJvcGVydHkiKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUobWVwQ2xhc3MpOwotCQkKLQkJLy9WZXJzaW9uCi0JCXhtbE1lcC5zZXRWYWx1ZSgiMCIpOwkvLyROT04tTkxTLTEkCi0JCW1lcExpc3QuYWRkKHhtbE1lcCk7Ci0JCQkJCQotCQlmb3IgKEl0ZXJhdG9yPG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gcGx1ZyA9IGl0Lm5leHQoKTsKLQkJCQotCQkJeG1sTWVwID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgRWNvcmVVdGlsLmNyZWF0ZShtZXBDbGFzcyk7Ci0JCQl4bWxNZXAuc2V0VmFsdWUocGx1Zy5nZXRHdWlkKCkpOwotCQkJbWVwTGlzdC5hZGQoeG1sTWVwKTsKLQkJCQotCQkJeG1sTWVwID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgRWNvcmVVdGlsLmNyZWF0ZShtZXBDbGFzcyk7Ci0JCQl4bWxNZXAuc2V0VmFsdWUocGx1Zy5nZXROYW1lKCkpOwotCQkJbWVwTGlzdC5hZGQoeG1sTWVwKTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGd1aWQgdG8gcGx1Z2luIG1hcAotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEd1aWRUb1BsdWdOYW1lTWFwKCkgewotCQlpZiAoZ3VpZFRvUGx1Z05hbWVNYXAgPT0gbnVsbCkgewotCQkJcmVjYWxsRXh0cmFJbmZvKCk7Ci0JCX0JCQotCQlyZXR1cm4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWNhbGxFeHRyYUluZm8oKSB7Ci0JCXRyeSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUocm9vdE9iamVjdAotCQkJCQkuZUNsYXNzKCksICJtZXRob2RFbGVtZW50UHJvcGVydHkiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQotCQkJTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IG1lcExpc3QgPSAoTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+KSByb290T2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAobWVwTGlzdCA9PSBudWxsIHx8IG1lcExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZ3VpZFRvUGx1Z05hbWVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJCQotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG1lcCA9IG1lcExpc3QuZ2V0KDApOwotCQkJaWYgKG1lcC5nZXRWYWx1ZSgpLmVxdWFscygiMCIpKSB7IC8vJE5PTi1OTFMtMSQgIAotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbWVwTGlzdC5zaXplKCk7KSB7Ci0JCQkJCVN0cmluZyBndWlkID0gbWVwTGlzdC5nZXQoaSkuZ2V0VmFsdWUoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBtZXBMaXN0LmdldChpKzEpLmdldFZhbHVlKCk7Ci0JCQkJCWd1aWRUb1BsdWdOYW1lTWFwLnB1dChndWlkLCBuYW1lKTsKLQkJCQkJaSArPSAyOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjc2NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEV4cG9ydCBYTUwgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9FeHBvcnRYTUxXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL0V4cG9ydFhNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA0Mjg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL0V4cG9ydFhNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgd2l6YXJkLgotICogPHA+Ci0gKiBUaGlzIHdpemFyZCBpcyB1c2VkIHRvIGV4cG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIFhNTCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcml2YXRlIFNlbGVjdEV4cG9ydFR5cGVQYWdlIHNlbGVjdEV4cG9ydFR5cGVQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdFBsdWdpblBhZ2Ugc2VsZWN0UGx1Z2luUGFnZTsKLQotCXByb3RlY3RlZCBWaWV3UGx1Z2luSW5mb1BhZ2Ugdmlld1BsdWdpbkluZm9QYWdlOwotCi0JcHJvdGVjdGVkIFZpZXdFeHBvcnRTdW1tYXJ5UGFnZSB2aWV3RXhwb3J0U3VtbWFyeVBhZ2U7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdFhNTEZpbGVQYWdlIHNlbGVjdFhNTEZpbGVQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydFhNTERhdGEgeG1sRGF0YSA9IG5ldyBFeHBvcnRYTUxEYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luRXhwb3J0RGF0YSBwbHVnaW5EYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBjb25maWdEYXRhID0gbmV3IENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc2VsZWN0RXhwb3J0VHlwZVBhZ2UgPSBuZXcgU2VsZWN0RXhwb3J0VHlwZVBhZ2UoKTsKLQkJc2VsZWN0UGx1Z2luUGFnZSA9IG5ldyBTZWxlY3RQbHVnaW5QYWdlKHBsdWdpbkRhdGEpOwotCQl2aWV3UGx1Z2luSW5mb1BhZ2UgPSBuZXcgVmlld1BsdWdpbkluZm9QYWdlKHBsdWdpbkRhdGEpOwotCQl2aWV3RXhwb3J0U3VtbWFyeVBhZ2UgPSBuZXcgVmlld0V4cG9ydFN1bW1hcnlQYWdlKHBsdWdpbkRhdGEpOwotCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoY29uZmlnRGF0YSk7Ci0JCXNlbGVjdFhNTEZpbGVQYWdlID0gbmV3IFNlbGVjdFhNTEZpbGVQYWdlKCk7Ci0KLQkJYWRkUGFnZShzZWxlY3RFeHBvcnRUeXBlUGFnZSk7Ci0JCWFkZFBhZ2Uoc2VsZWN0UGx1Z2luUGFnZSk7Ci0JCWFkZFBhZ2Uodmlld1BsdWdpbkluZm9QYWdlKTsKLQkJYWRkUGFnZSh2aWV3RXhwb3J0U3VtbWFyeVBhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdFhNTEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L1hNTEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gc2VsZWN0WE1MRmlsZVBhZ2UKLQkJCQkmJiBzZWxlY3RYTUxGaWxlUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIHhtbEZpbGVQYXRoID0gc2VsZWN0WE1MRmlsZVBhZ2UuZ2V0UGF0aCgpOwotCQlGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZSh4bWxGaWxlUGF0aCk7Ci0JCWlmICh4bWxGaWxlLmV4aXN0cygpKSB7Ci0JCQlib29sZWFuIG9rID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy5iaW5kKAotCQkJCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLm92ZXJ3cml0ZVRleHRfbXNnLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgeG1sRmlsZVBhdGggfSkpOwotCQkJaWYgKCFvaykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJRXhwb3J0WE1MU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0aW5nWE1MX3RleHQsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQl4bWxEYXRhLnNldFhNTEZpbGUoc2VsZWN0WE1MRmlsZVBhZ2UuZ2V0UGF0aCgpKTsKLQkJCQkJc2VydmljZSA9IG5ldyBFeHBvcnRYTUxTZXJ2aWNlKHhtbERhdGEpOwotCQkJCQlzZXJ2aWNlLmRvRXhwb3J0KG1vbml0b3IpOwotCQkJCQlFeHBvcnRYTUxQcmVmZXJlbmNlcy5zZXRFeHBvcnRUeXBlKHhtbERhdGEuZ2V0RXhwb3J0VHlwZSgpKTsKLQkJCQkJRXhwb3J0WE1MUHJlZmVyZW5jZXMuc2V0WE1MRmlsZSh4bWxEYXRhLmdldFhNTEZpbGUoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCXNlcnZpY2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF9lcnJvciwKLQkJCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSksIHJlYWxFeGNlcHRpb24pOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9IEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nOwotCQlNc2dCb3gucHJvbXB0KG1zZywgU1dULk9LKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlNmNiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gKiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5lcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29uZmlnUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXN1cGVyLnNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXdpemFyZC54bWxEYXRhLnNldFNlbGVjdGVkQ29uZmlncyh3aXphcmQuY29uZmlnRGF0YS5zZWxlY3RlZENvbmZpZ3MpOwkJCi0JCXJldHVybiB3aXphcmQuc2VsZWN0WE1MRmlsZVBhZ2U7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0RXhwb3J0VHlwZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdEV4cG9ydFR5cGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGExMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0RXhwb3J0VHlwZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgdGhlIHR5cGUgb2YgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEV4cG9ydFR5cGVQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RFeHBvcnRUeXBlUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHBvcnRQbHVnaW5zUmFkaW9CdXR0b247Ci0KLQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgotCS8vcHJpdmF0ZSBCdXR0b24gZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0VHlwZVBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFhNTFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihjb250YWluZXIsCi0JCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0LCAxLCBmYWxzZSk7Ci0KLQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCi0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCi0JCS8vZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkvLwkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0LCAxLCBmYWxzZSk7Ci0JCQotCQlzd2l0Y2ggKEV4cG9ydFhNTFByZWZlcmVuY2VzLmdldEV4cG9ydFR5cGUoKSkgewotCQljYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZOgotCQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TOgotCQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgkJCQotCQkvL2Nhc2UgRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0NPTkZJR1M6Ci0JCS8vCWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vCWJyZWFrOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlleHBvcnRQbHVnaW5zUmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCQkKLQkJLy9leHBvcnRDb25maWdzUmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGdldEVycm9yTWVzc2FnZSgpID09IG51bGw7Ci0JfQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCi0JCWlmIChleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0xJQlJBUlkpOwotCQkJcmV0dXJuIHdpemFyZC5zZWxlY3RYTUxGaWxlUGFnZTsKLQkJfSBlbHNlIGlmIChleHBvcnRQbHVnaW5zUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpOwotCQkJcmV0dXJuIHdpemFyZC5zZWxlY3RQbHVnaW5QYWdlOwotCQl9Ci0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCi0JCS8vZWxzZSBpZiAoZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCS8vCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0NPTkZJR1MpOwotCQkvLwlyZXR1cm4gd2l6YXJkLnNlbGVjdENvbmZpZ1BhZ2U7Ci0JCS8vfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiNmYzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zIHRvCi0gKiBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UGx1Z2luUGFnZSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5TZWxlY3RQbHVnaW5QYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFBsdWdpblBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc3VwZXIuc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJd2l6YXJkLnhtbERhdGEuc2V0U2VsZWN0ZWRQbHVnaW5zKHdpemFyZC5wbHVnaW5EYXRhLnNlbGVjdGVkUGx1Z2lucyk7Ci0JCVZpZXdQbHVnaW5JbmZvUGFnZSBwYWdlID0gd2l6YXJkLnZpZXdQbHVnaW5JbmZvUGFnZTsKLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwNzFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgWE1MIGZpbGUgdG8gc3RvcmUgdGhlCi0gKiBleHBvcnRlZCBtZXRob2QgbGlicmFyeSBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0WE1MRmlsZVBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHBhdGhUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFhNTEZpbGVQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGZpbGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsZUxhYmVsLnNldFRleHQoRXhwb3J0WE1MUmVzb3VyY2VzLmZpbGVMYWJlbF90ZXh0KTsKLQotCQlwYXRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXBhdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwYXRoVGV4dC5zZXRUZXh0KEV4cG9ydFhNTFByZWZlcmVuY2VzLmdldFhNTEZpbGUoKSk7Ci0JCXBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1ZhbGlkUGF0aChwYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKSkgewotCQkJCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UoRXhwb3J0WE1MUmVzb3VyY2VzLmludmFsaWRYTUxGaWxlX2Vycm9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEV4cG9ydFhNTFJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuU0FWRSk7Ci0JCQkJZmQuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi54bWwiLCAiKi4qIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nIHBhdGggPSBmZC5vcGVuKCk7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJcGF0aFRleHQuc2V0VGV4dChwYXRoKTsKLQkJCQkJb2sgPSBpc1ZhbGlkUGF0aChwYXRoKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKG9rKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIHNwZWNpZmljIHBhdGggaXMgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmljIHBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNwZWNpZmllZCBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUGF0aChTdHJpbmcgcGF0aCkgewotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJaWYgKGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKSAmJiBwYXRoLmVuZHNXaXRoKCIueG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBubyBtb3JlIHBhZ2UKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIFhNTCBmaWxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5wYXRoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld0V4cG9ydFN1bW1hcnlQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3RXhwb3J0U3VtbWFyeVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjODYzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3RXhwb3J0U3VtbWFyeVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpblN1bW1hcnlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgYSBzdW1tYXJ5IG9mIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbnMgdGhhdAotICogd2lsbCBiZSBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3RXhwb3J0U3VtbWFyeVBhZ2UgZXh0ZW5kcyBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBWaWV3RXhwb3J0U3VtbWFyeVBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQlyZXR1cm4gd2l6YXJkLnNlbGVjdFhNTEZpbGVQYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld1BsdWdpbkluZm9QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3UGx1Z2luSW5mb1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3OWRjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3UGx1Z2luSW5mb1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLlBsdWdpbkluZm9QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kCi0gKiBwbHVnLWlucyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZpZXdQbHVnaW5JbmZvUGFnZSBleHRlbmRzIFBsdWdpbkluZm9QYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFZpZXdQbHVnaW5JbmZvUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzdXBlci5zYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQl3aXphcmQueG1sRGF0YS5zZXRBc3NvY2lhdGVkQ29uZmlncyh3aXphcmQucGx1Z2luRGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwKTsKLQkJVmlld0V4cG9ydFN1bW1hcnlQYWdlIHBhZ2UgPSB3aXphcmQudmlld0V4cG9ydFN1bW1hcnlQYWdlOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjMWNjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBleHBvcnRpbmcgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBYTUwuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3NTk0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBleHBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhYTQ5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjOTgyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzgwY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxYmFmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0F1dGhvcmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0NvbnRlbnRQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Gb2xkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQxOWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUGFja2FnaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUGFja2FnaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2Mzk0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1JvbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUm9sZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUm9sZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9UYXNrcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1Rhc2tzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YmQ4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1Rhc2tzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9lcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTdhOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9lcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX2xpYl9jb25mLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXRvb2wxNi9leHBfbGliX2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdkNGUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXRvb2wxNi9leHBfbGliX2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9ldG9vbDE2L2V4cF9tZXRoX3BsdWdpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX21ldGhfcGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2ZjhiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX21ldGhfcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQ0YjViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjNTY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy93YXJuaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZTIwYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy93YXJuaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWY3ZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgUGVyc3BlY3RpdmUKLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1QYWNrYWdpbmcKLQotIyBDYXRlZ29yeQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPVBhY2thZ2luZwotCi0jIFZpZXdzCi1wYWNrYWdpbmdWaWV3TmFtZT1QYWNrYWdpbmcgTWV0aG9kIExpYnJhcnkKLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1MaWJyYXJ5IFBhY2thZ2luZyBNZXNzYWdlCi0KLSMgQWN0aW9uIFNldAotcGFja2FnaW5nQWN0aW9uU2V0PVBhY2thZ2luZwotCi0jIEFjdGlvbnMKLW5ld0NvbmZpZ0FjdGlvbj0mQ29uZmlndXJhdGlvbgotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1DcmVhdGUgYSBuZXcgbGlicmFyeSBDb25maWd1cmF0aW9uCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmF0aW9uCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1PcGVuIGFuIGV4aXN0aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbgotCi0jIEV4cG9ydCBXaXphcmQgQ2F0ZWdvcnkKLWV4cG9ydENhdGVnb3J5TmFtZT1NZXRob2QKLQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZAotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUxpYnJhcnkgQ29uZmlndXJhdGlvbgotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb249RXhwb3J0IGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1leHBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1NZXRob2QgUGx1Zy1pbnMKLWV4cG9ydE1ldGhvZFBsdWdpbnM9RXhwb3J0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucy4KLQotCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczZjQ4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iL2ljb25zL2V0b29sMTYvZXhwX2xpYl9jb25mLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9ldG9vbDE2L2V4cF9tZXRoX3BsdWdpbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+IAotICAgICAgICAgICAgICAgJWV4cG9ydE1ldGhvZFBsdWdpbnMKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4gCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIi8+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0UGx1Z2luV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydE9wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0T3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjEzYjQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0T3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGUgZXhwb3J0IG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0T3B0aW9ucyB7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBleHBvcnREaXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRPcHRpb25zKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgZXhwb3J0IGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGlyZWN0b3J5IGZvciBzdG9yaW5nIHRoZSBleHBvcnRlZCBjb250ZW50Ci0JICovCi0JcHVibGljIEZpbGUgZ2V0RXhwb3J0RGlyKCkgewotCQlyZXR1cm4gZXhwb3J0RGlyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc2VsZWN0ZWQgZXhwb3J0IGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwb3J0RGlyCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeSBmb3Igc3RvcmluZyB0aGUgZXhwb3J0ZWQgY29udGVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydERpcihGaWxlIGV4cG9ydERpcikgewotCQl0aGlzLmV4cG9ydERpciA9IGV4cG9ydERpcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTJmNWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBFeHBvcnQgcGx1Z2luIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHBvcnRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UHJvY2Vzc09wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UHJvY2Vzc09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4NTk5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgZXhwb3J0IHByY29lc3Mgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQcm9jZXNzT3B0aW9ucyBleHRlbmRzIEV4cG9ydE9wdGlvbnMgewotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hXZWJTaXRlOwotCi0JcHJpdmF0ZSBQdWJsaXNoT3B0aW9ucyBwdWJsaXNoaW5nT3B0aW9uczsKLQotCXByaXZhdGUgYm9vbGVhbiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UHJvY2Vzc09wdGlvbnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZXhwb3J0IHRoZSBwcm9jZXNzLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZXhwb3J0IHRoZSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcHJvY2VzcyB3ZWIgc2l0ZSBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvY2VzcyB3ZWIgc2l0ZSBzaG91bGQgYmUgcHVibGlzaGVkCi0JICogICAgICAgICBhcyBwYXJ0IG9mIHRoZSBleHBvcnQgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFdlYlNpdGUoKSB7Ci0JCXJldHVybiBwdWJsaXNoV2ViU2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIHByb2Nlc3Mgd2ViIHNpdGUgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoV2ViU2l0ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggdGhlIHByb2Nlc3Mgd2ViIHNpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoV2ViU2l0ZShib29sZWFuIHB1Ymxpc2hXZWJTaXRlKSB7Ci0JCXRoaXMucHVibGlzaFdlYlNpdGUgPSBwdWJsaXNoV2ViU2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaGluZyBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHB1Ymxpc2ggdGhlIHByb2Nlc3MKLQkgKiAgICAgICAgIHdlYiBzaXRlCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlyZXR1cm4gcHVibGlzaGluZ09wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoaW5nT3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwdWJsaXNoIHRoZQotCSAqICAgICAgICAgICAgcHJvY2VzcyB3ZWIgc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hpbmdPcHRpb25zKFB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zKSB7Ci0JCXRoaXMucHVibGlzaGluZ09wdGlvbnMgPSBwdWJsaXNoaW5nT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIHNob3VsZCBiZQotCSAqICAgICAgICAgZXhwb3J0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpIHsKLQkJcmV0dXJuIGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKAotCQkJYm9vbGVhbiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKSB7Ci0JCXRoaXMuZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyA9IGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZDU2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydENvbmZpZ1dpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0NvbmZpZ1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25maWdQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3BlY2lmeVBhdGhQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNwZWNpZnlQYXRoUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVQbHVnaW5QYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFBsdWdpbkVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kZWZhdWx0X2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUxpYnJhcnlQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUxpYnJhcnlQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFeHBvcnRSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxZjE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFCi0jCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWV4cG9ydENvbmZpZ1dpemFyZF90aXRsZT1FeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1TZWxlY3QgZXhwb3J0IHR5cGUKLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZWN0IHRoZSB0eXBlIG9mIGxpYnJhcnkgY29uZmlndXJhdGlvbiB0byBleHBvcnQuCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PUV4cG9ydCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCBhbGwgaXRzIG1ldGhvZCBwbHVnLWlucwotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PUV4cG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucwotc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLXNlbGVjdENvbmZpZ1BhZ2VfZGVzYz1TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBleHBvcnQuIEFsbCByZWZlcmVuY2VkIG1ldGhvZCBwbHVnLWlucyBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBleHBvcnQuCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PU1ldGhvZCBjb25maWd1cmF0aW9uczoKLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1TZWxlY3QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucwotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIHRvIGV4cG9ydC4KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1NZXRob2QgY29uZmlndXJhdGlvbnM6Ci1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9UmV2aWV3IGNvbmZpZ3VyYXRpb24gZXJyb3JzCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1BbiBpbnRlZ3JpdHkgY2hlY2sgaGFzIGJlZW4gcGVyZm9ybWVkIG9uIHRoZSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbi4gUmV2aWV3IHRoZSBlcnJvciByZXBvcnQgYW5kIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBjb3JyZWN0aXZlIGFjdGlvbnMuCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU9U3BlY2lmeSBleHBvcnQgZGlyZWN0b3J5Ci1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1TcGVjaWZ5IGEgZGVzdGluYXRpb24gZGlyZWN0b3J5IHRvIHN0b3JlIHRoZSBleHBvcnRlZCBjb25maWd1cmF0aW9uLgotCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUV4cG9ydCBNZXRob2QgUGx1Zy1pbnMKLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgcGx1Zy1pbnMKLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0byBleHBvcnQuCi1zZWxlY3RQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1NZXRob2QgcGx1Zy1pbnM6Ci1yZXZpZXdQbHVnaW5zUGFnZV90aXRsZT1SZXZpZXcgZGVwZW5kZW5jaWVzCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXNjPVNlbGVjdCBlYWNoIG1ldGhvZCBwbHVnLWluIHRvIHJldmlldyBpdHMgZGVwZW5kZW5jaWVzLiBDbGljayBCYWNrIHRvIHNlbGVjdCB0aGUgZGVwZW5kZW50IHBsdWctaW5zIGlmIHRoZXkgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgZXhwb3J0LgotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0aG9kIFBsdWctaW5zOgotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9RGVwZW5kZW50IG1ldGhvZCBwbHVnLWluczoKLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1Bc3NvY2lhdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uczoKLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlPUNvbmZpcm0gZXhwb3J0Ci1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjPUNvbmZpcm0gdGhlIG1ldGhvZCBwbHVnLWlucyB0aGF0IHdpbGwgYmUgZXhwb3J0ZWQuCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PU5vIG1ldGhvZCBwbHVnLWluIGhhcyBiZWVuIHNlbGVjdGVkLgotc3BlY2lmeVBhdGhQYWdlX3RpdGxlPVNwZWNpZnkgZXhwb3J0IGRpcmVjdG9yeQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9U3BlY2lmeSBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgbWV0aG9kIHBsdWctaW5zLgotU2F2ZVBsdWdpblBhZ2VfZGVzYz1FeHBvcnQgdGhlIHNlbGVjdGVkIHBsdWctaW5zIGFuZCBjb25maWd1cmF0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW4gV2l6YXJkIEVycm9yCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBFcnJvciBlbmNvdW50ZXJlZCBpbiBleHBvcnRpbmcKLQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZwotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbgotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogVGhlIGV4cG9ydCBvcGVyYXRpb24gY2Fubm90IHByb2NlZWQuCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFseXppbmcgbGlicmFyeSBjb25maWd1cmF0aW9uLi4uCi0KLSMgVGhlIGZvbGxvd2luZyBtZXNzYWdlcyBoYXZlIG5vdCBiZWVuIHJldmlld2VkLgotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGluZyBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9RXhwb3J0IGRvbmUuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPUNoZWNraW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uLi5cbgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1ObyBjb25maWd1cmF0aW9uIHNlbGVjdGVkLlxuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8zPVRoZXJlIGlzIG5vIHByb2JsZW0gaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uXG4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9VGhlcmUgYXJlIHswfSBwcm9ibGVtcyBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gXG5Zb3UgY2FuIG9wZW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGFuZCBmaXggdGhvc2UgcHJvYmxlbXMuIFxuT3IgeW91IGNhbiBjaG9vc2UgdG8gaWdub3JlIHRoZXNlIHByb2JsZW1zIGFuZCBjb250aW51ZS4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1DaGVja2luZyBjb25maWd1cmF0aW9uLCBwbGVhc2Ugd2FpdC4uLgotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1DaG9vc2UgTWV0aG9kIENvbmZpZ3VyYXRpb24KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U9QnJvd3NlLi4uCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9VXNlIGRlZmF1bHQgZGlyZWN0b3J5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGluZyBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogRXhwb3J0IGZhaWxlZDogRXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogRXhwb3J0IGZhaWxlZDogRXJyb3IgY29weWluZyBsaWJyYXJ5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogRXhwb3J0IGZhaWxlZDogRXJyb3IgbWFraW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjbG9zdXJlCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogRXhwb3J0IGZhaWxlZDogRXJyb3Igc2F2aW5nIGxpYnJhcnkKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5hbWU6Ci1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPURpcmVjdG9yeToKLUV4cG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcgotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPURlZmF1bHQgVGl0bGUKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPURlZmF1bHQgZGVzY3JpcHRpb246Ci1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0aW5nIHBsdWctaW5zLi4uCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9Q3JlYXRpbmcgZXhwb3J0IGRpcmVjdG9yeS4uLgotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPUNvcHlpbmcgZmlsZXMuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1HZW5lcmF0aW5nIGxpYnJhcnkgYW5kIHJlc291cmNlIGZpbGUuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1FeHBvcnQgZG9uZS4KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW4KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9RXhwb3J0IG5hbWU6Ci1TYXZlTGlicmFyeVBhZ2VfZGVzYz1FeHBvcnQgdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucyBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9ucwotRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE9QW5hbHl6aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbi4uLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNmFhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBFeHBvcnQgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9CYXNlRXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9CYXNlRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY1MzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQmFzZUV4cG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aGUgRXhwb3J0IFNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFeHBvcnRTZXJ2aWNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cG9ydEZpbGUgPSAiZXhwb3J0LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlGaWxlID0gImxpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFBsdWdpbk5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJZFNlbGVjdGVkKFN0cmluZyB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGVkSWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWlmICh1cmkuaW5kZXhPZihpZCkgPj0gMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkUGx1Z2luUmVzb3VyY2UoU3RyaW5nIHVyaSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0ZWRQbHVnaW5OYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGx1Z2luX25hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgocGx1Z2luX25hbWUgKyAiLyIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNvdXJjZVNlbGVjdGVkKFN0cmluZyB1cmkpIHsKLQkJaWYgKGlzSWRTZWxlY3RlZCh1cmkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaXNTZWxlY3RlZFBsdWdpblJlc291cmNlKHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpYnJhcnlEb2N1bWVudCBwcm9jZXNzTGlicmFyeUZpbGUoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KSB7Ci0JCXRyeSB7Ci0JCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgTGlicmFyeURvY3VtZW50KHNvdXJjZSk7Ci0KLQkJCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQkJTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudC5nZXRQbHVnaW5zKCk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNJZFNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUGx1Z2luKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCQlub2RlcyA9IGRvY3VtZW50LmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlpID0gMDsKLQkJCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQkKLQkJCQkvLyAxNDIzNzkgLSB1cGRhdGUgcGx1Z2luIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkJCS8vIGNvbmZpZ3VyYXRpb24gaXMgc2F2ZWQgYXMgc2VwZXJhdGUgcmVzb3VyY2Ugc2luY2UgMS4wbTMKLQkJCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQodXJpKSkgewotCQkJCQlkb2N1bWVudC5yZW1vdmVDb25maWd1cmF0aW9uKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlNYXAgcGx1Z2luTWFwID0gTWV0aG9kRWxlbWVudFV0aWwuYnVpbGRNYXAocGx1Z2lucyk7Ci0KLQkJCW5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaWQpOwotCQkJCVN0cmluZyB1cmkgPSBnZXRQbHVnaW5SZXNNZ3JVcmkoaWQsIG5vZGUsIHBsdWdpbk1hcCk7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQoaWQpCi0JCQkJCQkmJiAhaXNSZXNvdXJjZVNlbGVjdGVkKFVSTERlY29kZXIuZGVjb2RlKHVyaSwgIlVURi04IikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNSZXNvdXJjZVNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUxpc3QgcGx1Z2luTGlzdCA9ICBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlkb2N1bWVudC5zdG9yZUV4dHJhSW5mbyhwbHVnaW5MaXN0KTsKLQkJCQotCQkJZG9jdW1lbnQuc2F2ZUFzKHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCXJldHVybiBkb2N1bWVudDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGx1Z2luUmVzTWdyVXJpKFN0cmluZyBpZCwgRWxlbWVudCBub2RlLCBNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IHBsdWdpbk1hcCkgewotCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfdXJpKTsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IHBsdWdpbk1hcC5nZXQoaWQpOwotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdVcmkgPSBwbHVnaW4uZ2V0TmFtZSgpICsgIi9wbHVnaW4ueG1pIjsgIC8vJE5PTi1OTFMtMSQKLQkJCWlmICghIG5ld1VyaS5lcXVhbHModXJpKSkgewotCQkJCW5vZGUuc2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX3VyaSwgbmV3VXJpKTsKLQkJCQlyZXR1cm4gbmV3VXJpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnREYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YmY5ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGV4cG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIHsKLQotCXB1YmxpYyBib29sZWFuIGV4cG9ydE9uZUNvbmZpZzsKLQotCXB1YmxpYyBib29sZWFuIGV4cG9ydENvbmZpZ1NwZWNzOwotCi0JcHVibGljIExpc3Qgc2VsZWN0ZWRDb25maWdzOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBicm9rZW4gcmVmZXJlbmNlcyBzaG91bGQgYmUgcmVtb3ZlZCBvciBub3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyA9IGZhbHNlOwotCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbnVsbDsKLQotCXB1YmxpYyBTdHJpbmcgZXJyb3JNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5lcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEoKSB7Ci0JCWxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0JCWxsRGF0YS5sb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxZjhmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogRXhwb3J0cyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjbHVkZXMgPSAiLmNvcHlhcmVhLmRhdCwgKiovLmNvcHlhcmVhLmRhdCwgLmNvcHlhcmVhLmRiLCAqKi8uY29weWFyZWEuZGIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzID09IG51bGwKLQkJCQkJfHwgZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwKTsgCi0JCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQkJRmlsZSBleHBvcnRMaWJGb2xkZXIgPSBuZXcgRmlsZShleHBvcnRMaWJQYXRoKTsKLQkJCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCQl9Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBkYXRhLnNlbGVjdGVkQ29uZmlncwotCQkJCQkuZ2V0KDApOwotCQkJZXhwb3J0Q29uZmlnKGNvbmZpZy5nZXROYW1lKCksIGV4cG9ydExpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgZXhwb3J0Q29uZmlnKFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUsIFN0cmluZyBmaWxlUGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gbmVlZCB0byBkaXNhYmxlIHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGluZwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQlkb0VleHBvcnRDb25maWcoc2VsZWN0ZWRDb25maWdOYW1lLCBmaWxlUGF0aCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0VleHBvcnRDb25maWcoU3RyaW5nIHNlbGVjdGVkQ29uZmlnTmFtZSwgU3RyaW5nIGZpbGVQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlNZXRob2RMaWJyYXJ5IGN1cnJlbnRMaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIExvYWQgdGhlIHdob2xlIE1ldGhvZCBMaWJyYXJ5LgotCQkJTGlicmFyeVV0aWwubG9hZEFsbChjdXJyZW50TGliKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBsb2FkaW5nIGxpYnJhcnkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJZGF0YS5lcnJvck1zZyA9IEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENvcHkgdGhlIGN1cnJlbnQgbGlicmFyeSB0byBhIG5ldyBsaWJyYXJ5LAotCQkvLyBzaW5jZSB3ZSBuZWVkIHRvIG1ha2UgY2hhbmdlcyB3aGVuIHBhY2thZ2luZyB0aGUgbmV3IGxpYnJhcnkuCi0JCU1ldGhvZExpYnJhcnkgbmV3TGlicmFyeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluZXdMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIEVjb3JlVXRpbC5jb3B5KGN1cnJlbnRMaWIpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHNDsgCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlJQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBEZXRhY2ggdGhlIG5ldyBsaWJyYXJ5IGZyb20gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc28gaXQgY2FuIGJlCi0JCQkvLyBhZGRlZCB0byBhIG5ldyBMaWJyYXJ5IFByb2Nlc3NvciBpbnN0YW5jZS4KLQkJCUxpYnJhcnlVdGlsLmRldGFjaEZyb21SZXNvdXJjZShuZXdMaWJyYXJ5KTsKLQotCQkJLy8gQ3JlYXRlIGEgbmV3IExpYnJhcnkgTWFuYWdlciBhbmQgY3JlYXRlIGEgbmV3IHJlc291cmNlIGZvciB0aGUKLQkJCS8vIG5ldyBsaWJyYXJ5LgotCQkJLy8gVE9ETzogVXBkYXRlIHRoZSBVSSB0byBwcm9tcHQgZm9yIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlLgotCQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlwYXJhbXMucHV0KCJsaWJyYXJ5LnBhdGgiLCBmaWxlUGF0aCk7IAkvLyROT04tTkxTLTEkCi0JCQlwYXJhbXMucHV0KCJsaWJyYXJ5UmVnaXN0ZXJUeXBlIiwgIkNvbmZpZ0V4cG9ydCIpOyAJCS8vJE5PTi1OTFMtMSQJCS8vJE5PTi1OTFMtMiQJCQotCQkJCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyTWV0aG9kTGlicmFyeShuZXdMaWJyYXJ5LCAieG1pIiwgcGFyYW1zKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy8gQmVnaW4gcGFja2FnaW5nIHRoZSBuZXcgbGlicmFyeSBmb3IgZXhwb3J0LgotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24obmV3TGlicmFyeSwgc2VsZWN0ZWRDb25maWdOYW1lKTsKLQotCQkJLy8gVmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG1ha2Ugc3VyZSB0aGUgZ2xvYmFsIHBhY2thZ2VzIGFyZQotCQkJLy8gc2VsZWN0ZWQuIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGxpYnJhcnkKLQkJCS8vIGNhbid0IGJlIGxvYWRlZC4KLQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCi0JCQljbG9zdXJlID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKG51bGwsIGNvbmZpZyk7Ci0JCQljbG9zdXJlLnBhY2thZ2VMaWJyYXJ5KGRhdGEucmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgbWFraW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjbG9zdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMTsgCi0KLQkJCWlmIChjbG9zdXJlICE9IG51bGwpCi0JCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQkKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkudW5SZWdpc3Rlck1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0JCQkKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlMaWJyYXJ5VXRpbC5zYXZlQWxsKG5ld0xpYnJhcnkpOwotCi0JCQkvLyB0aGUgZmlyc3Qgcm91bmQgb2Ygc2F2ZSB3aWxsIGNyZWF0ZSB0aGUgcmVzb3VyY2Ugc3RydWN0dXJlLAotCQkJLy8gbmVlZCB0byBzYXZlIGFnYWluIHRvIG1ha2Ugc3VyZSBhbGwgcmVmZXJlbmNlcyBhcmUgc2F2ZWQuCi0JCQkvLyBUaGlzIHN0ZXAgaXMgY3JpdGljYWwgc2luY2UgdGhlIGZpcnN0IHJvdW5kIG9ubHkgY3JlYXRlZCB0aGUgZGF0YQotCQkJLy8gc3RydWN0dXJlCi0JCQkvLyBzb21lIG9mIHRoZSBjcm9zcy1yZWZlcmVuY2VkIGVsZW1lbnRzIG1pZ2h0IGJlIGxvc3Qgb24gdGhlIGZpcnN0Ci0JCQkvLyBzYXZpbmcKLQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggcmVmZXJlbmNlcwotCQkJLy8gdG8gYSBuZXcgcGx1Z2luLAotCQkJLy8gd2hpY2ggYXJlIG5vdCBzYXZlZCB5ZXQsIHRob3NlIHJlZmVyZW5jZXMgd2lsbCBiZSBsb3N0LgotCQkJLy8gMTQ1ODkxIC0gSW1wb3J0IENvbmZpZ3VyYXRpb246IGRlZmF1bHQgY29uZmlnIGlzIGxvc3MgYWZ0ZXIKLQkJCS8vIGltcG9ydAotCQkJTGlicmFyeVV0aWwuc2F2ZUFsbChuZXdMaWJyYXJ5KTsKLQotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHNhdmluZyBsaWJyYXJ5IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOTsgCi0KLQkJCWlmIChjbG9zdXJlICE9IG51bGwpCi0JCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkudW5SZWdpc3Rlck1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENvcHkgdGhlIHJlc291cmNlIGZpbGVzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIG5ldyBsaWJyYXJ5LgotCQkvLyBGb3Igc2ltcGxpY2l0eSBzYWtlLCBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBpZiB0aGUgZmlsZXMgZG8gbm90Ci0JCS8vIGV4aXN0IGluIHRoZSB0YXJnZXQgbGlicmFyeSBvciBpZiB0aGUgZmlsZXMgYXJlIG5ld2VyCi0JCS8vU3RyaW5nIGluY2x1ZGVzID0gInJlc291cmNlcy8qKiwgKiovcmVzb3VyY2VzLyoqIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgaW5jbHVkZXMgPSAicmVzb3VyY2VzLyoqLCAqKi9yZXNvdXJjZXMvKiosICoqL2RpYWdyYW0ueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgc3JjRGlyID0gTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGN1cnJlbnRMaWIpOwotCQlGaWxlIGRlc3REaXIgPSBMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgobmV3TGlicmFyeSk7Ci0KLQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc3JjRGlyLCBkZXN0RGlyLCBpbmNsdWRlcywgZXhjbHVkZXMpOwotCQloYW5kbGVFeHRyYVJlc291cmNlQ29weShjdXJyZW50TGliLCBuZXdMaWJyYXJ5LCBzcmNEaXIsIGRlc3REaXIsIGluY2x1ZGVzKTsKLQotCQkvLyBDbG9zZSB0aGUgbmV3bHkgY3JlYXRlZCBsaWJyYXJ5LgotCQlpZiAoY2xvc3VyZSAhPSBudWxsKQotCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeHRyYVJlc291cmNlQ29weShNZXRob2RMaWJyYXJ5IGJhc2VMaWIsIE1ldGhvZExpYnJhcnkgZXhwb3J0ZWRMaWIsIEZpbGUgYmFzZUxpYkRpciwgRmlsZSBleHBvcnRlZExpYkRpciwgU3RyaW5nIGluY2x1ZGVzKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCU1hcCBleHBvcnRlZFBsdWdpbk1hcCA9IE1ldGhvZEVsZW1lbnRVdGlsLmJ1aWxkTWFwKGJhc2VMaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCi0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlUGx1Z2lucyA9IGJhc2VMaWIuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2VQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gYmFzZVBsdWdpbnMuZ2V0KGkpOwotCQkJRmlsZSBwbHVnaW5Gb2xkZXIgPSBuZXcgRmlsZShsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQYXRoKHBsdWdpbikpOwotCQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBiYXNlTGliRGlyLmVxdWFscyhwbHVnaW5Gb2xkZXIuZ2V0UGFyZW50RmlsZSgpKTsJCQkKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMRCBwbHVnaW5Gb2xkZXI6ICIgKyBwbHVnaW5Gb2xkZXIgKyAiLCBwcm9jZXNzZWQ6ICIgKyBwcm9jZXNzZWQpOwotCQkJaWYgKCEgcHJvY2Vzc2VkKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGV4cG9ydGVkUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZXhwb3J0ZWRQbHVnaW5NYXAuZ2V0KHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCWlmIChleHBvcnRlZFBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlGaWxlIGRlc3REaXIgPSBuZXcgRmlsZShleHBvcnRlZExpYkRpciwgZXhwb3J0ZWRQbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihwbHVnaW5Gb2xkZXIsIGRlc3REaXIsIGluY2x1ZGVzLCBleGNsdWRlcyk7Ci0JCQl9Ci0KLQkJfQkJCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlYy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWRkYzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1vZGVscyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNwZWMgewotCi0JcHVibGljIFN0cmluZyBuYW1lOwotCi0JcHVibGljIFN0cmluZyBndWlkOwotCi0JcHVibGljIFN0cmluZyB2ZXJzaW9uOwotCi0JcHVibGljIFN0cmluZyBicmllZl9kZXNjOwotCi0JcHVibGljIExpc3QgcGx1Z2luSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIExpc3QgcGFja2FnZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBMaXN0IHZpZXdJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYygpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTUzZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEV4cG9ydHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2UgZXh0ZW5kcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IGEgY29uZmlndXJhdGlvbiBzcGVjaWZpY2FpdG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzID09IG51bGwgfHwgZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMCk7IAotCi0JCS8vIENyZWF0ZSB0aGUgZXhwb3J0IGxpYnJhcnkgZm9sZGVyLgotCQlGaWxlIGxpYkZvbGRlcjsKLQkJRmlsZSBleHBvcnRMaWJGb2xkZXI7Ci0KLQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSAobmV3IEZpbGUoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJZXhwb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoZXhwb3J0TGliUGF0aCk7Ci0JCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlleHBvcnRMaWJGb2xkZXIubWtkaXIoKTsKLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGRhdGEuc2VsZWN0ZWRDb25maWdzCi0JCQkJLmdldCgwKTsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgY29uZmlnLmVDb250YWluZXIoKTsKLQkJVVJJIHVyaSA9IGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCWxpYkZvbGRlciA9IChuZXcgRmlsZShwYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCi0JCS8vIFByZXBhcmUgdGhlIGlkIHNlbGVjdGlvbnMsCi0JCWdldFNlbGVjdGVkSWRzKGRhdGEuc2VsZWN0ZWRDb25maWdzKTsKLQotCQkvLyBMb2FkIHRoZSBsaWJyYXJ5LnhtaSBhbmQgcmVtb3ZlIHVubmVlZGVkIGVsZW1lbnRzLgotCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBwcm9jZXNzTGlicmFyeUZpbGUobmV3IEZpbGUobGliRm9sZGVyLCBsaWJyYXJ5RmlsZSksIG5ldyBGaWxlKAotCQkJCWV4cG9ydExpYkZvbGRlciwgZXhwb3J0RmlsZSkpOwotCi0JCWlmICggZG9jdW1lbnQgIT0gbnVsbCApIHsKLQkJCS8vIGNvcHkgdGhlIGNvbmlmdXJhdGlvbiBmaWxlcwotCQkJLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCQljb3B5Q29uZmlndXJhdGlvbkZpbGVzKGRvY3VtZW50LCBsaWJGb2xkZXIsIGV4cG9ydExpYkZvbGRlcik7Ci0JCX0KLQkJCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMSk7IAotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlDb25maWd1cmF0aW9uRmlsZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50LCBGaWxlIGxpYkZvbGRlciwgRmlsZSBleHBvcnRMaWJGb2xkZXIpIHsKLQkJLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLnNlbGVjdGVkQ29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlTdHJpbmcgdXJpID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlTdHJpbmcgc3JjVXJpID0gbnVsbDsKLQkJCWlmICh1cmkgPT0gbnVsbCkgewotCQkJCVVSSSByZXNVcmkgPSBjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJc3JjVXJpID0gcmVzVXJpLnRvRmlsZVN0cmluZygpOwotCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQl1cmkgPSBkb2N1bWVudC5kZWNvZGVVcmkodXJpKTsKLQkJCX0KLQkJCWlmICggdXJpICE9IG51bGwgKSB7Ci0JCQkJRmlsZSBzcmMgPSBzcmNVcmkgPT0gbnVsbCA/IG5ldyBGaWxlKGxpYkZvbGRlciwgdXJpKSA6IG5ldyBGaWxlKHNyY1VyaSk7Ci0JCQkJRmlsZSB0YXJnZXQgPSAgbmV3IEZpbGUoZXhwb3J0TGliRm9sZGVyLCB1cmkpOwotCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGFyZ2V0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2V0U2VsZWN0ZWRJZHMoTGlzdCBjb25maWdzKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgc2VsZWN0ZWQgY29uZmlnIGlkcy4KLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlpZiAoc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gQWRkIHRoZSBjb25maWd1cmF0aW9uLgotCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkvLyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIG1ldGhvZCBwbHVnaW4gaWRzIGFuZAotCQkJLy8gbWV0aG9kIHBhY2thZ2UgaWRzIHNvIHRoYXQgdGhlaXIgZW50cmllcyBpbiB0aGUgcmVzb3VyY2UgZmlsZSBjYW4KLQkJCS8vIGJlIGtlcHQuCi0JCQlMaXN0IHJlZnMgPSBjb25maWcuZUNyb3NzUmVmZXJlbmNlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdHIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IG8gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRXhwb3J0UGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIicgaW4gY29uZmlndXJhdGlvbiAnIiArIGNvbmZpZy5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0RpYWdyYW1IYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0RpYWdyYW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGNiOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9EaWFncmFtSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgZGlhZ3JhbSBleHBvcnQvaW1wb3J0Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSGFuZGxlciB7Ci0JCi0JLy9UbyBkbzogbmVlZCB0byBjb25zaWRlciBlbGVtZW50IHJlbmFtZSBpc3N1ZS4gCi0JLy8JCSAtPiBSZXNvdmxlIHRoZSBpbnZvbHZlZCBmaWxlIG5hbWVzIGFmdGVyIGFsbCByZXNvdXJjZSBuYW1lcyBhcmUgc2V0dGxlZC4KLQkvLwkJIC0+IExldCBhIHN1YiBjbGFzcyB0byB0YWtlIG9mIGl0PwotCi0JcHJpdmF0ZSBGaWxlIHNvdXJjZUxpYlJvb3Q7Ci0JcHJpdmF0ZSBGaWxlIHRhcmdldExpYlJvb3Q7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPigpOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIERpYWdyYW1IYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXRoaXMuc291cmNlTGliUm9vdCA9IHNvdXJjZUxpYlJvb3Q7Ci0JCXRoaXMudGFyZ2V0TGliUm9vdCA9IHRhcmdldExpYlJvb3Q7Ci0JfQotCQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBnZXRFbGVtZW50TWFwKCkgewotCQlyZXR1cm4gZWxlbWVudE1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb1Byb2Nlc3MoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWJvb2xlYW4gYiA9IGVsZW0gaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiB8fAotCQkJCQkJCQllbGVtIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzOwotCQlyZXR1cm4gYjsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmVnaXN0ZXJFbGVtZW50KGVsZW0sIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSwgYm9vbGVhbiBwcm9jZXNzRW50cnkpIHsKLQkJaWYgKCEgbmVlZFRvUHJvY2VzcyhlbGVtKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50TWFwLmNvbnRhaW5zS2V5KGVsZW0uZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlNYXBFbnRyeVZhbHVlIG1hcEVudHJ5VmFsdWUgPSBuZXcgTWFwRW50cnlWYWx1ZSgpOwotCQltYXBFbnRyeVZhbHVlLmVsZW1lbnQgPSBlbGVtOwotCQllbGVtZW50TWFwLnB1dChlbGVtLmdldEd1aWQoKSwgbWFwRW50cnlWYWx1ZSk7CQkKLQkJCi0JCWlmIChwcm9jZXNzRW50cnkpIHsKLQkJCXByb2Nlc3NFbnRyeShlbGVtLCBtYXBFbnRyeVZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXJFbGVtZW50cygpIHsKLQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IGVsZW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCXByb2Nlc3NFbnRyeSh2YWx1ZS5lbGVtZW50LCB2YWx1ZSk7Ci0JCX0JCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeShNZXRob2RFbGVtZW50IGVsZW0sIE1hcEVudHJ5VmFsdWUgbWFwRW50cnlWYWx1ZSkgewotCQlGaWxlW10gZmlsZXMgPSBnZXRGaWxlcyhlbGVtKTsKLQkJRmlsZSBzb3VyY2VGaWxlID0gZmlsZXNbMF07Ci0JCUZpbGUgdGFyZ2V0RmlsZSA9IGZpbGVzWzFdOwotCi0JCWlmIChzb3VyY2VGaWxlICE9IG51bGwgJiYgc291cmNlRmlsZS5leGlzdHMoKSkgewotCQkJbWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlID0gc291cmNlRmlsZTsKLQkJfQotCi0JCWlmICh0YXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0JCQlpZiAobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlID09IG51bGwgfHwgbmVlZENvcHkobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlLCB0YXJnZXRGaWxlKSkgewotCQkJCW1hcEVudHJ5VmFsdWUudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7Ci0JCQl9Ci0JCQltYXBFbnRyeVZhbHVlLmV4aXN0aW5nID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtYXBFbnRyeVZhbHVlLnNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCW1hcEVudHJ5VmFsdWUudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbWFwRW50cnlWYWx1ZTogIik7CQkJCQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obWFwRW50cnlWYWx1ZS50b0RlYnVnU3RyaW5nKCJMRD4gIikpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZWRGaWxlcygpIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IGVsZW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCWlmICh2YWx1ZS5leGlzdGluZyAmJiB2YWx1ZS50YXJnZXRGaWxlICE9IG51bGwpIHsKLQkJCQlyZXQuYWRkKHZhbHVlLnRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGFsbCB0aGUgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJZXhlY3V0ZV8oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCBleGVjdXRlXygpIHsKLQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBlbGVtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXBFbnRyeVZhbHVlIHZhbHVlID0gaXQubmV4dCgpOwotCQkJaWYgKHZhbHVlLnRhcmdldEZpbGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICh2YWx1ZS5zb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQlGaWxlIHBhcmVudEZpbGUgPSB2YWx1ZS50YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZSh2YWx1ZS5zb3VyY2VGaWxlLCB2YWx1ZS50YXJnZXRGaWxlKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRDogRmlsZSBjb3BpZWQ6ICIgKyB2YWx1ZS5zb3VyY2VGaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWUudGFyZ2V0RmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGNvcHkgYWN0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZENvcHkoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQlyZXQgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCXx8IChkZXN0Lmxlbmd0aCgpICE9IHNvdXJjZS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNYXBFbnRyeVZhbHVlIHsKLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCQlwdWJsaWMgRmlsZSBzb3VyY2VGaWxlOwotCQlwdWJsaWMgRmlsZSB0YXJnZXRGaWxlOwotCQlwdWJsaWMgYm9vbGVhbiBleGlzdGluZyA9IGZhbHNlOwkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIHRvRGVidWdTdHJpbmcoU3RyaW5nIHByb21wdCkgewotCQkJU3RyaW5nIHN0ciA9IHByb21wdCArICJlbGVtZW50OiAiICsgZWxlbWVudC5nZXROYW1lKCk7CQkvLyROT04tTkxTLTEkCi0JCQlzdHIgKz0gIlxuIiArIHByb21wdCArICJzb3VyY2VGaWxlOiAiICsgc291cmNlRmlsZTsJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc3RyICs9ICJcbiIgKyBwcm9tcHQgKyAidGFyZ2V0RmlsZTogIiArIHRhcmdldEZpbGU7CQkvLyROT04tTkxTLTEkIAkvLyROT04tTkxTLTIkCi0JCQlzdHIgKz0gIlxuIiArIHByb21wdCArICJleGlzdGluZzogIiArIGV4aXN0aW5nOwkJCS8vJE5PTi1OTFMtMSQgCS8vJE5PTi1OTFMtMiQJCQkKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJCi0JfQotCi0JcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmV0dXJuIGdldEZpbGVzKGVsZW0sIHRydWUpOwotCX0KLQkKLQkvL1swXTogc291cmNlRmlsZQotCS8vWzFdOiB0YXJnZXRGaWxlCi0JcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhNZXRob2RFbGVtZW50IGVsZW0sIGJvb2xlYW4gZXhwb3J0KSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlWzJdOwotCQkKLQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbSk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWxlbWVudFBhdGg6ICIgKyBlbGVtZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudFBhdGggPT0gbnVsbCB8fCBlbGVtZW50UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbGVtZW50UGF0aCBpcyBudWxsIG9yIGVtcHR5ISIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmlsZXM7Ci0JCX0KLQotCQlTdHJpbmcgZGlhZ3JhbVBhdGggPSBlbGVtZW50UGF0aCArIGVsZW0uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyAKLQkJCQkJCQkJImRpYWdyYW0ueG1pIjsJCQkJLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWFncmFtUGF0aCAwOiAiICsgZGlhZ3JhbVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlGaWxlIHNyY1Jvb3QgPSBzb3VyY2VMaWJSb290OwotCQlGaWxlIHRndFJvb3QgPSB0YXJnZXRMaWJSb290OwotCQkKLQkJCi0JCWlmIChleHBvcnQpIHsKLQkJCXNyY1Jvb3QgPSAgZ2V0Um9vdChlbGVtKTsKLQkJfSBlbHNlIHsKLQkJCXRndFJvb3QgPSAgZ2V0Um9vdChlbGVtKTsKLQkJfQotCQkKLQkJaWYgKGV4cG9ydCkgewotCQkJUmVzb3VyY2UgcmVzID0gZWxlbS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCUZpbGUgbW9kZWxGaWxlID0gbmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlGaWxlIGZvbGRlciA9IG1vZGVsRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJU3RyaW5nIGZvbGRlclBhdGggPSBmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCQlpbnQgaXggPSBzcmNSb290LmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpOwotCQkJCWlmIChmb2xkZXJQYXRoLmxlbmd0aCgpID4gaXgKLQkJCQkJCSYmIGZvbGRlclBhdGguc3Vic3RyaW5nKDAsIGl4KS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQkJCQlzcmNSb290LmdldEFic29sdXRlUGF0aCgpKSkgewotCQkJCQlkaWFncmFtUGF0aCA9IGZvbGRlclBhdGguc3Vic3RyaW5nKGl4ICsgMSkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgImRpYWdyYW0ueG1pIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSBVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoZWxlbSk7Ci0JCQlpZiAocGMgIT0gbnVsbCAmJiAhIHBjLmdldE5hbWUoKS5lcXVhbHMoZWxlbS5nZXROYW1lKCkpKSB7Ci0JCQkJZGlhZ3JhbVBhdGggPSBlbGVtZW50UGF0aCArIHBjLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrICJkaWFncmFtLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJZmlsZXNbMF0gPSBuZXcgRmlsZShzcmNSb290LCBkaWFncmFtUGF0aCk7Ci0JCWZpbGVzWzFdID0gbmV3IEZpbGUodGd0Um9vdCwgZGlhZ3JhbVBhdGgpOwkJCi0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnRNYXAoaW50IHBhc3NJZCkgewotCX0KLQotCXB1YmxpYyBGaWxlIGdldFNvdXJjZUxpYlJvb3QoKSB7Ci0JCXJldHVybiBzb3VyY2VMaWJSb290OwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXRSb290KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihlbGVtKTsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKGVsZW0pOwotCQlGaWxlIHJvb3QgPSAobmV3IEZpbGUocGx1Z2luUGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0VGFyZ2V0TGliUm9vdCgpIHsKLQkJcmV0dXJuIHRhcmdldExpYlJvb3Q7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvTGlicmFyeURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWZjZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYSBtZXRob2QgbGlicmFyeSB1c2luZyBhIERPTSBkb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeURvY3VtZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19tZXRob2RQbHVnaW5zID0gIm1ldGhvZFBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zID0gInByZWRlZmluZWRDb25maWd1cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19yZXNvdXJjZURlc2NyaXB0b3JzID0gInJlc291cmNlRGVzY3JpcHRvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcmVzb3VyY2VTdWJNYW5hZ2VycyA9ICJzdWJNYW5hZ2VycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfaHJlZiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9pZCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfdXJpID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfZ3VpZCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfdmFsdWUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBvcnRGaWxlID0gImV4cG9ydC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5RmlsZSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBGaWxlIGxpYkZpbGU7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBsaWJUYWcgPSBudWxsOwotCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVzVGFnID0gbnVsbDsKLQkKLQlwcml2YXRlIEhhc2hNYXAgZ3VpZFRvVXJpTWFwID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RG9jdW1lbnQoRmlsZSBsaWJGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saWJGaWxlID0gbGliRmlsZTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwobGliRmlsZSk7Ci0KLQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlsaWJUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJfQotCi0JCW5vZGVzID0gcm9vdAotCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXNUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IGZpZWxkCi0gICAgICovCi0JcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJGaWxlIGZpZWxkCi0gICAgICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGliVGFnIGZpZWxkCi0gICAgICovCi0JcHVibGljIEVsZW1lbnQgZ2V0TGliVGFnKCkgewotCQlyZXR1cm4gbGliVGFnOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZQotICAgICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IGd1aWQKLSAgICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlHdWlkKCkgewotCQlyZXR1cm4gbGliVGFnLmdldEF0dHJpYnV0ZSgiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgdGFnCi0gICAgICovCi0JcHVibGljIEVsZW1lbnQgZ2V0UmVzb3VyY2VUYWcoKSB7Ci0JCXJldHVybiByZXNUYWc7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHBsdWdpbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luKEVsZW1lbnQgbm9kZSkgewotCQlsaWJUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNvbmZpZyBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSByZXNvdXJjZSBkZXNjcmlwdG9yIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoRWxlbWVudCBub2RlKSB7Ci0JCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHBsdWdpbiBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0UGx1Z2lucygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfbWV0aG9kUGx1Z2lucyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb25maWd1cmF0aW9uIG5vZGUgbGlzdAotICAgICAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHJlc291cmNlIGRlc2NyaXB0b3Igbm9kZSBsaXN0Ci0gICAgICovCi0JcHVibGljIE5vZGVMaXN0IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiByZXNUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX3Jlc291cmNlRGVzY3JpcHRvcnMpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgcmVzb3VyY2Ugc3VibWFuYWdlciBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpIHsKLQkJcmV0dXJuIHJlc1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfcmVzb3VyY2VTdWJNYW5hZ2Vycyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBsdWdpbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luKEVsZW1lbnQgbm9kZSkgewotCQlsaWJUYWcuYXBwZW5kQ2hpbGQoZ2V0VmFsaWROb2RlKG5vZGUpKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29uZmlndXJhdGlvbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlc291cmNlIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZShFbGVtZW50IG5vZGUpIHsKLQkJcmVzVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZhbGlkIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgTm9kZSBnZXRWYWxpZE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gZG9jdW1lbnQuaW1wb3J0Tm9kZShub2RlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgcGx1Z2lucyBieSBndWlkCi0JICogCi0JICogQHBhcmFtIHJlbW92ZUxpc3QKLQkgKiAgICAgICAgICAgIExpc3QgYSBsaXN0IG9mIGd1aWRzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2lucyhMaXN0IHJlbW92ZUxpc3QpIHsKLQkJLy8gSW1wb3J0aW5nIGEgcGFja2FnZSBvZiBwbGdpbnMgdHdpY2UgZ2VuZXJhdGVzIDIKLQkJLy8gaWRlbnRpY2FsIHBsdWdpbnMKLQkJLy8gcmVtb3ZlIHRoZSBub2RlIHdpbGwgY2F1c2UgdGhlIG5vZGUgbGlzdCB0byBzaHJpbmssIHNvIGRvbid0IGluY3JlYXNlCi0JCS8vIHRoZSBpbmRleAotCQlOb2RlTGlzdCBub2RlcyA9IGdldFBsdWdpbnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZChub2RlKTsKLQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGxpc3QgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBub2RlcwotICAgICAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25zKExpc3QgcmVtb3ZlTGlzdCkgewotCQkvLyByZW1vdmUgdGhlIHVubmVlZGVkIGNvbmZpZ3VyYXRpb25zCi0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZChub2RlKTsKLQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGxpc3QgZnJvbSB0aGUgcmVzb3VyY2Ugbm9kZXMKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUVudHJpZXMoTGlzdCByZW1vdmVMaXN0KSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2lkKTsKLQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX3VyaSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQotCQkJCS8vIGNoZWNrIHRoZSBwbHVnaW4geG1pIGZpbGUsIGlmIGV4aXN0cywgZGVsZXRlIHRoZSBmb2xkZXIKLQkJCQlGaWxlIHBsdWduX2ZpbGUgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJCWlmIChwbHVnbl9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCS8vIGRlbGV0ZSB0aGUgZm9sZGVyID8/PwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJLy8gYWxzbyByZW1vdmUgdGhlIHN1YiBtYW5hZ2VycwotCQlub2RlcyA9IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJaSA9IDA7Ci0JCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXNvdXJjZSB1cmkgZm9yIHRoZSByZXNvdXJjZSBndWlkCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXJpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVyaShTdHJpbmcgZ3VpZCkgewotCQlTdHJpbmcgdXJpID0gZ2V0VXJpRnJvbUd1aWRUb1VyaU1hcChndWlkKTsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl1cmkgPSBnZXRSZXNvdXJjZVVyaV8oZ3VpZCk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkvL2FkZFRvR3VpZFRvVXJpTWFwKGd1aWQsIHVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VVcmlfKFN0cmluZyBndWlkKSB7Ci0JCi0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKysgKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaWQpOwotCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdXJpKTsKLQkJCWlmICggZ3VpZC5lcXVhbHMoaWQpICkgewotCQkJCXJldHVybiBkZWNvZGVVcmkodXJpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVjb3JlZCBVUkkuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGVVcmkoU3RyaW5nIHVyaSkgewotCQl0cnkgewotCQkJdXJpID0gVVJMRGVjb2Rlci5kZWNvZGUodXJpLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiB1cmk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgZ2l2ZW4gdGhlIHVyaS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlRnJvbVVyaShTdHJpbmcgdXJpKSB7Ci0JCXVyaSA9IGRlY29kZVVyaSh1cmkpOwotCQkKLQkJaW50IGkgPSB1cmkuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpID4gMCkgewotCQkJdXJpID0gdXJpLnN1YnN0cmluZygwLCBpKTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmlsZShsaWJGaWxlLmdldFBhcmVudEZpbGUoKSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlQXMobGliRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRvY3VtZW50IGluIHRoZSBmaWxlIGdpdmVuIGJ5IGZpbGVQYXRoTmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXMoU3RyaW5nIGZpbGVQYXRoTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhNTFV0aWwuc2F2ZURvY3VtZW50KHRoaXMuZG9jdW1lbnQsIGZpbGVQYXRoTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIGRvY3VtZW50IGZvciBjb25maWd1dGF0aW9uIHNwZWNpZmljYXRpb24gZXhwb3J0L2ltcG9ydCBvbmx5PwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlnU3BlY3NPbmx5KCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGdldFBsdWdpbnMoKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKGhyZWYpOwotCQkJU3RyaW5nIHVyaSA9IGdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJCi0JCQkvLyBjaGVjayBpZiB0aGUgcmVzb3VyY2UgZmlsZXMgYXJlIHRoZXJlCi0JCQlGaWxlIHBsdWduX2ZpbGUgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJaWYgKHBsdWduX2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBzdGF0aWMgaGxwZXIgbWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLyoqCi0JICogUmV0dXJucyBzdWJtYW5hZ2VyJ3MgYmFzZSBndWlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN1Yk1hbmFnZXJCYXNlR3VpZChTdHJpbmcgaHJlZikgewotCQlmaW5hbCBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJInVtYTovLyguKj8pIyguKj8pIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihocmVmKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlyZXR1cm4gbS5ncm91cCgxKTsKLQkJfQotCi0JCXJldHVybiBocmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY2hpbGQgdmFsdWUgb2YgdGhlIGNoaWxkIHRhZyBnaXZlbiBieSBjaGlsZFRhZ05hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRWYWx1ZShFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IHRhZy5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCQkmJiAoKEVsZW1lbnQpIG5vZGUpLmdldFRhZ05hbWUoKS5lcXVhbHMoY2hpbGRUYWdOYW1lKSkgewotCQkJCXJldHVybiBnZXROb2RlVGV4dCgoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiB0ZXh0IG9mIGEgbGVhZiBub2RlLCB3aXRob3V0IGNoaWxkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0KEVsZW1lbnQgdGFnKSB7Ci0KLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBndWlkIGZyb20gaHJlZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkRnJvbUhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJaW50IGkgPSBocmVmLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaSA+IDApIHsKLQkJCXJldHVybiBocmVmLnN1YnN0cmluZyhpICsgMSk7Ci0JCX0KLQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGd1aWQgb2YgdGhlIG5vZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZChFbGVtZW50IG5vZGUpIHsKLQkJU3RyaW5nIGlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoInhtaTppZCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwICkgewotCQkJU3RyaW5nIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpOwotCQkJaWQgPSBnZXRHdWlkRnJvbUhyZWYoaHJlZik7Ci0JCX0KLQkJCi0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JcHJvdGVjdGVkIEVsZW1lbnQgZ2V0Q29uZmlnTm9kZShFbGVtZW50IGNvbmZpZ05vZGUpIHsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gbmV3IG1vZGVsIGRlZmluZXMgaHJlZiBmb3IgY29uZmlndXJhdGlvbiAKLQkJCVN0cmluZyBocmVmID0gY29uZmlnTm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKTsKLQkJCWlmIChocmVmID09IG51bGwgfHwgaHJlZi5sZW5ndGgoKSA9PSAwICkgewotCQkJCXJldHVybiBjb25maWdOb2RlOwotCQkJfSAKLQotCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYoaHJlZik7Ci0JCQlTdHJpbmcgdXJpID0gZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlpZiAoIHVyaSA9PSBudWxsICkgewotCQkJCXJldHVybiBjb25maWdOb2RlOwotCQkJfQotCQkJCi0JCQlGaWxlIHNvdXJjZSA9IGdldEZpbGVGcm9tVXJpKHVyaSk7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgY29uZmlnVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJY29uZmlnVGFnID0gcm9vdDsKLQkJCX0gZWxzZSB7Ci0JCQkJTm9kZUxpc3Qgbm9kZXMgPSByb290Ci0JCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQljb25maWdUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjb25maWdUYWc7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb25maWdOb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIENvbmZpZ3VyYXRpb25TcGVjIGluc3RhbmNlIGdpdmVuIHRoZSBlbGVtZW50IG5vZGUgY29uZmlnLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYyBnZXRDb25maWd1cmF0aW9uU3BlYyhFbGVtZW50IGNvbmZpZykgewotCQlDb25maWd1cmF0aW9uU3BlYyBzcGVjID0gbmV3IENvbmZpZ3VyYXRpb25TcGVjKCk7Ci0JCQotCQlFbGVtZW50IGNvbmZpZ05vZGUgPSBnZXRDb25maWdOb2RlKGNvbmZpZyk7Ci0JCXNwZWMuZ3VpZCA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKCJ4bWk6aWQiKTsgLy8kTk9OLU5MUy0xJAotCQlzcGVjLm5hbWUgPSBjb25maWdOb2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCXNwZWMuYnJpZWZfZGVzYyA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKCJicmllZkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIGdldCBwbHVnaW5zCi0JCU5vZGVMaXN0IG5vZGVzID0gY29uZmlnTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWV0aG9kUGx1Z2luU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZikpOwotCQkJCXNwZWMucGx1Z2luSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYWNrYWdlcwotCQlub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQkJc3BlYy5wYWNrYWdlSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldCB2aWV3cwotCQlub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByb2Nlc3NWaWV3cyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tSHJlZihub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpKTsKLQkJCQlzcGVjLnZpZXdJZHMuYWRkKGd1aWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNwZWM7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgZ3VpZC91cmkgcGFpciB0byBndWlkVG9VcmlNYXAuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9HdWlkVG9VcmlNYXAoU3RyaW5nIGd1aWQsIFN0cmluZyB1cmkpIHsKLQkJaWYgKGd1aWRUb1VyaU1hcCA9PSBudWxsKSB7Ci0JCQlndWlkVG9VcmlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWd1aWRUb1VyaU1hcC5wdXQoZ3VpZCwgdXJpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB1cmkgZnJvbSBndWlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpRnJvbUd1aWRUb1VyaU1hcChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gZ3VpZFRvVXJpTWFwID09IG51bGwgPyBudWxsIDogKFN0cmluZykgZ3VpZFRvVXJpTWFwLmdldChndWlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlnRG9jVmlzaXRvciB7Ci0JCXB1YmxpYyB2b2lkIHZpc2l0KEZpbGUgZmlsZSwgRWxlbWVudCBub2RlKSB7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmlzaXQgY29uZmlndXJhdGlvbiBmaWxlcyBnaXZlbiBieSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZvbGRlciBjb25maWdEaXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZpc2l0Q29uZmlnRmlsZXMoRmlsZSBjb25maWdEaXIsIENvbmZpZ0RvY1Zpc2l0b3IgdmlzaXRvcikgewkKLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQkJcmV0dXJuICFwYXRobmFtZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiY3ZzIikgJiYgCQkvLyROT04tTkxTLTEkCi0JCQkJCQlwYXRobmFtZS5pc0RpcmVjdG9yeSgpIHx8IHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKTsKLQkJCX0JCQkKLQkJfTsJCQotCQlGaWxlW10gZmlsZXMgPSBjb25maWdEaXIubGlzdEZpbGVzKGZpbHRlcik7Ci0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLQkJCQkJCS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCQlEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGZpbGUpOwotCQkJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQl2aXNpdG9yLnZpc2l0KGZpbGUsIHJvb3QpOwkJCQkKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGEgbWFwIGZyb20gcGx1aWduIGd1aWRzIHRvIHJlc291cmNlIG1hbmFnZXIgZ3VpZHMuCi0JICovCi0JcHVibGljIE1hcCBidWlsZFBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAoTGlzdCBwbHVnaW5HdWlkcykgewotCQlpZiAocGx1Z2luR3VpZHMgPT0gbnVsbCB8fCBwbHVnaW5HdWlkcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUxpc3Qgc3ViTWdycyA9IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJaWYgKHN1Yk1ncnMgPT0gbnVsbCB8fCBzdWJNZ3JzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkJCQotCQlIYXNoTWFwIHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luR3VpZHMuc2l6ZSgpOyBpKyspIHsJCQkKLQkJCVN0cmluZyBwbHVnaW5HdWlkID0gKFN0cmluZykgcGx1Z2luR3VpZHMuZ2V0KGkpOwotCQkJcGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcC5wdXQocGx1Z2luR3VpZCwgbnVsbCk7Ci0JCX0KLQkJYm9vbGVhbiBpc0VtcHR5ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHN1Yk1ncnMuZ2V0TGVuZ3RoKCk7IGkrKykgewkJCQotCQkJRWxlbWVudCBtZ3IgPSAoRWxlbWVudCkgc3ViTWdycy5pdGVtKGkpOwotCQkJU3RyaW5nICBocmVmID0gbWdyLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpOwotCQkJU3RyaW5nIHBsdWdpbkd1aWQgPSBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQoaHJlZik7Ci0JCQlpZiAocGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcC5jb250YWluc0tleShwbHVnaW5HdWlkKSkgewotCQkJCXBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAucHV0KHBsdWdpbkd1aWQsIGdldEd1aWRGcm9tSHJlZihocmVmKSk7Ci0JCQkJaXNFbXB0eSA9IGZhbHNlOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGlzRW1wdHkgPyAgbnVsbCA6IHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXA7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgZXh0cmEgaW5mbyAoYWxsIHBsdWdpbiBndWlkcyBhbmQgbmFtZXMpIGluIGxpYlRhZydzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRXh0cmFJbmZvKExpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0KLQkJRWxlbWVudCB2ZXJzaW9uTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCXZlcnNpb25Ob2RlLnNldEF0dHJpYnV0ZShBVFRSX3ZhbHVlLCAiMCIpOwkvLyROT04tTkxTLTEkIAotCQlsaWJUYWcuYXBwZW5kQ2hpbGQodmVyc2lvbk5vZGUpOwkJCi0JCQotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnID0gaXQubmV4dCgpOwotCQkJCi0JCQlFbGVtZW50IGd1aWROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5KTsJCi0JCQlndWlkTm9kZS5zZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSwgcGx1Zy5nZXRHdWlkKCkpOwotCQkJRWxlbWVudCBuYW1lTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7CQotCQkJbmFtZU5vZGUuc2V0QXR0cmlidXRlKEFUVFJfdmFsdWUsIHBsdWcuZ2V0TmFtZSgpKTsKLQkJCQotCQkJbGliVGFnLmFwcGVuZENoaWxkKGd1aWROb2RlKTsKLQkJCWxpYlRhZy5hcHBlbmRDaGlsZChuYW1lTm9kZSk7Ci0JCX0KLQkJCi0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVjYWxsRXh0cmFJbmZvKCkgewotCQl0cnkgewotCQkJTm9kZUxpc3Qgbm9kZXMgPSBnZXRNZXRob2RFbGVtZW50UHJvcGVydGllcygpOwotCQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUVsZW1lbnQgdmVyc2lvbk5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCVN0cmluZyB2ZXJzaW9uU3RyID0gdmVyc2lvbk5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdmFsdWUpOwotCQkJCi0JCQlpZiAodmVyc2lvblN0ci5lcXVhbHMoIjAiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTspIHsKLQkJCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSk7Ci0JCQkJCW5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpICsgMSk7Ci0JCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSk7Ci0JCQkJCWd1aWRUb1BsdWdOYW1lTWFwLnB1dChndWlkLCBuYW1lKTsKLQkJCQkJaWYgKGZhbHNlKSB7CQkJCQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZ3VpZDogIiArIGd1aWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBuYW1lOiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQkJCQkJCi0JCQkJCWkgKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZ3VpZFRvUGx1Z05hbWVNYXAgPSBudWxsOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBHZXQgZ3VpZCB0byBwbHVnaW4gbWFwCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0R3VpZFRvUGx1Z05hbWVNYXAoKSB7Ci0JCWlmIChndWlkVG9QbHVnTmFtZU1hcCA9PSBudWxsKSB7Ci0JCQlyZWNhbGxFeHRyYUluZm8oKTsKLQkJfQkJCi0JCXJldHVybiBndWlkVG9QbHVnTmFtZU1hcDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBtZXRob2RFbGVtZW50UHJvcGVydHkgbm9kZSBsaXN0Ci0gICAgICovCi0JcHJpdmF0ZSBOb2RlTGlzdCBnZXRNZXRob2RFbGVtZW50UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTU4MzMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBleHBvcnQgYSBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRXhwb3J0RGF0YSB7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHNlbGVjdGVkUGx1Z2lucyA9IG51bGw7Ci0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBudWxsOwotCi0JcHVibGljIEhhc2h0YWJsZSBhc3NvY2lhdGVkQ29uZmlnTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLy8gZG9uJ3QgbmVlZCBpdCBhZnRlciB0aGUgc2VydmljZSBjb2RlIGNoYW5nZXMKLQlwdWJsaWMgTGlzdCBhc3NvY2lhdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkV4cG9ydERhdGEoKSB7Ci0JCWxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0JCWxsRGF0YS5sb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgcGx1Z2lucy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGdldFNlbGVjdGVkUGx1Z2lucygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkUGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaXN0IG9mIHNlbGVjdGVkIHBsdWdpbnMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQbHVnaW5zKENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBzZWxlY3RlZFBsdWdpbnMpIHsKLQkJdGhpcy5zZWxlY3RlZFBsdWdpbnMgPSBzZWxlY3RlZFBsdWdpbnM7Ci0JfTsKLQotCS8qKgotCSAqIHZhbGlkYXRlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGRzIGFzc29jaWF0ZWRDb25maWdNYXAuCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRBc3NvY2lhdGVkQ29uZmlnTWFwKCkgewotCQlpZiAoZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJYXNzb2NpYXRlZENvbmZpZ01hcC5jbGVhcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJYXNzb2NpYXRlZENvbmZpZ01hcC5wdXQoZWxlbWVudCwgTGlicmFyeVV0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGEyZWUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBFeHBvcnRzIG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0byBhIHRhcmdldCBkaXJlY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydFNlcnZpY2UgZXh0ZW5kcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5FeHBvcnRTZXJ2aWNlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIFJ1biB0byBleHBvcnQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwKTsgCi0KLQkJQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBkYXRhLnNlbGVjdGVkUGx1Z2luczsKLQkJaWYgKHBsdWdpbnMgPT0gbnVsbCB8fCBwbHVnaW5zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzEpOyAKLQotCQkvLyBDcmVhdGUgdGhlIGxpYnJhcnkgZm9sZGVyIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5LgotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IChuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKSkpLmdldEFic29sdXRlUGF0aCgpOwotCQlGaWxlIGV4cG9ydExpYkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYlBhdGgpOwotCQlpZiAoIWV4cG9ydExpYkZvbGRlci5leGlzdHMoKSkgewotCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzIpOyAKLQotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCVN0cmluZyBjdXJyTGliUGF0aCA9IGN1cnJMaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCUZpbGUgY3VyckxpYkZpbGUgPSBuZXcgRmlsZShjdXJyTGliUGF0aCk7Ci0JCQotCQkvLyBJdGVyYXRlIHRoZSBzZWxlY3RlZCBwbHVnLWlucyBhbmQgY29weSB0aGVpciBhc3NvY2lhdGVkIG1vZGVsIGZpbGVzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIFN0ZXAgMTogQ3JlYXRlIHRoZSBwbHVnLWluIGZvbGRlci4KLQkJCVVSSSB1cmkgPSBwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQotCQkJRmlsZSBwbHVnaW5Gb2xkZXIgPSAobmV3IEZpbGUocGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQotCQkJU3RyaW5nIHBsdWdpblBhdGggPSBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQlGaWxlIGV4cG9ydFBsdWdpbkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYkZvbGRlciwgcGx1Z2luUGF0aCk7Ci0KLQkJCS8vIFN0ZXAgMjogQ29weSB0aGUgcGx1Zy1pbiBmaWxlcy4KLQkJCWNvcHlEaXIocGx1Z2luRm9sZGVyLCBleHBvcnRQbHVnaW5Gb2xkZXIpOwkJCQotCQl9Ci0KLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0czKTsgCi0KLQkJLy8gR2V0IHRoZSBzZWxlY3RlZCBwbHVnLWluIGFuZCBjb25maWd1cmF0aW9uIGlkcyBzbyB3ZSBjYW4gcmVtb3ZlIHRoZQotCQkvLyB1bm5lZWRlZCBzdHVmZi4KLQkJZ2V0U2VsZWN0ZWRJZHMoZGF0YS5zZWxlY3RlZFBsdWdpbnMsIGRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcCk7Ci0KLQkJLy8gU3RlcCAzOiBMb2FkIHRoZSBsaWJyYXJ5LnhtaSBhbmQgdGhlIHJlc21nci54bWksIHJlbW92ZSB0aGUgdW5uZWVkZWQKLQkJLy8gc3R1ZmYuCi0JCUZpbGUgbGliRm9sZGVyID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBwcm9jZXNzTGlicmFyeUZpbGUoY3VyckxpYkZpbGUsIG5ldyBGaWxlKAotCQkJCWV4cG9ydExpYkZvbGRlciwgZXhwb3J0RmlsZSkpOwotCi0JCWlmICggZG9jdW1lbnQgIT0gbnVsbCApIHsKLQkJCS8vIGNvcHkgdGhlIGNvbmlmdXJhdGlvbiBmaWxlcwotCQkJLy8gMTQyMzc5IC0gdXBkYXRlIHBsdWdpbiBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJCWNvcHlDb25maWd1cmF0aW9uRmlsZXMoZG9jdW1lbnQsIGxpYkZvbGRlciwgZXhwb3J0TGliRm9sZGVyKTsKLQkJfQotCQkKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0KTsgCi0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGNvcHlDb25maWd1cmF0aW9uRmlsZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50LCBGaWxlIGxpYkZvbGRlciwgRmlsZSBleHBvcnRMaWJGb2xkZXIpIHsKLQkJLy8gLy8gMTQyMzc5IC0gdXBkYXRlIHBsdWdpbiBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJLy8gR2V0IHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlkcy4KLQkJZm9yIChJdGVyYXRvciBpdGMgPSBkYXRhLmFzc29jaWF0ZWRDb25maWdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlncyA9IChMaXN0KSBpdGMubmV4dCgpOwotCQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyB1cmkgPSBkb2N1bWVudC5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCQlGaWxlIHNyYyA9IG51bGw7Ci0JCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJCS8vaWYgYSBwcm9jZXNzIHJlZmVycyB0byBhIGNvbmZpZyB0aGF0IGRvZXMgbm90IGV4aXN0Ci0JCQkJCS8vdGhlbiB0aGVyZSB3b3VsZCBiZSBubyByZXNvdXJjZSBmb3IgdGhlIGNvbmZpZwotCQkJCQlpZiAoY29uZmlnLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCVVSSSByZXNVcmkgPSBjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQkJdXJpID0gZG9jdW1lbnQuZGVjb2RlVXJpKHVyaSk7Ci0JCQkJCXNyYyA9IG5ldyBGaWxlKHJlc1VyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJfQkJCQkKLQkJCQlpZiAoIHVyaSAhPSBudWxsICkgewotCQkJCQkvL0ZpbGUgc3JjID0gbmV3IEZpbGUobGliRm9sZGVyLCB1cmkpOwotCQkJCQlpZiAoc3JjID09IG51bGwpIHsKLQkJCQkJCXNyYyA9IG5ldyBGaWxlKGxpYkZvbGRlciwgdXJpKTsKLQkJCQkJfQotCQkJCQlGaWxlIHRhcmdldCA9ICBuZXcgRmlsZShleHBvcnRMaWJGb2xkZXIsIHVyaSk7Ci0JCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgZGlyZWN0b3JpZXMgZnJvbSAiZnJvbURpciIgdG8gInRvRGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIpIHsKLQkJQ29weSBjcCA9IG5ldyBDb3B5KCk7Ci0JCWNwLnNldE92ZXJ3cml0ZSh0cnVlKTsKLQkJRmlsZVNldCBzZXQgPSBuZXcgRmlsZVNldCgpOwotCQlzZXQuc2V0RXhjbHVkZXMoQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuZXhjbHVkZXMpOwotCQlzZXQuc2V0RGlyKGZyb21EaXIpOwotCQljcC5hZGRGaWxlc2V0KHNldCk7Ci0JCWNwLnNldFRvZGlyKHRvRGlyKTsKLQkJY3Auc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJY3Auc2V0UHJlc2VydmVMYXN0TW9kaWZpZWQodHJ1ZSk7Ci0JCWNwLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U2VsZWN0ZWRJZHMoQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMsIE1hcCBjb25maWdzTWFwKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgdGhlIHBsdWctaW4gaWRzIGFuZCBuYW1lcy4KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gcGx1Z2luLmdldEd1aWQoKTsKLQkJCXNlbGVjdGVkUGx1Z2luTmFtZXMuYWRkKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCXNlbGVjdGVkSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNhdmUgdGhlIGxpYnJhcnkgZ3VpZCBzbyB0aGF0IHRoZSBlbnRyeSBpbiByZXNnci54bWkgd2lsbCBiZSBrZXB0LgotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIHBsdWdpbi5lQ29udGFpbmVyKCk7Ci0JCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQlzZWxlY3RlZElkcy5hZGQobGliLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaWRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0YyA9IGNvbmZpZ3NNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlncyA9IChMaXN0KSBpdGMubmV4dCgpOwotCQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJCWlmIChzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBBZGQgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkJLy8gRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgc2F2ZSB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIHBhY2thZ2UKLQkJCQkvLyBpZHMgc28gdGhhdCB0aGVpciBlbnRyaWVzIGluIHRoZSByZXNvdXJjZSBmaWxlIGNhbiBiZSBrZXB0LgotCQkJCUxpc3QgcmVmcyA9IGNvbmZpZy5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJCWlmICghc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQlzZWxlY3RlZElkcy5hZGQoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAiJyBpbiBjb25maWd1cmF0aW9uICciICsgY29uZmlnLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDRhYWE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gZXhwb3J0IHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzOTU1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRGVzdGluYXRpb25Db21tb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgYW4KLSAqIGV4cG9ydCBvciBpbXBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzdGluYXRpb25Db21tb25QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21ibyBleHBvcnRQYXRoQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uQ29tbW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYyk7Ci0JCXRoaXMubGxEYXRhID0gbGxEYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXIpOwotCQkKLQkJZXhwb3J0UGF0aENvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlLCAxKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2UpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCQkKLQotCQlpbml0Q29udHJvbHMoKTsKLQkJCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQljcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlleHBvcnRQYXRoQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsJCi0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuRm9jdXNJbiwgdGhpcyk7Ci0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJZXhwb3J0UGF0aENvbWJvLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuRGlyZWN0b3J5RGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JfQotCQotCS8qKgotCSAqIEFkZHMgYWRkaXRpb25hbCBjb250cm9scyB0byB0aGlzIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gY29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWV4cG9ydFBhdGhDb21iby5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCVdpemFyZCB3aXphcmQgPSAoV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl3aXphcmQuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb0RhdGFNb2RlbCgpIHsKLQkJU3RyaW5nIGxpYk5hbWUgPSBleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAobGliTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghbGliTmFtZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQlsaWJOYW1lID0gbGliTmFtZS5zdWJzdHJpbmcoCi0JCQkJCQlsaWJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGxpYk5hbWUKLQkJCQkJCQkJLmxlbmd0aCgpKTsKLQkJCX0gZWxzZQotCQkJCWxpYk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWxsRGF0YS5zZXRMaWJOYW1lKGxpYk5hbWUpOwotCQlsbERhdGEuc2V0UGFyZW50Rm9sZGVyKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCQkJZGQuc2V0RmlsdGVyUGF0aChleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1c2UgdGhlIG9wZW5lZCBkaXJzIHRvIGluaXQgY29tYm8gbGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb21ib0l0ZW1zKCkgewotCQlyZXR1cm47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmZkZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0NoZWNraW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0IG9mIGEgY29uZmlndXJhdGlvbiBpbnRlZ3JpdHkgY2hlY2suCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHRWaWV3ZXIgdGV4dFZpZXdlcjsKLQotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBzdHlsZTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmNoZWNrQ29uZmlnUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5jaGVja0NvbmZpZ1BhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRleHRWaWV3ZXIgPSBjcmVhdGVUZXh0Vmlld2VyKGNvbnRhaW5lciwgMzYwLCAxNjAsIDEpOwotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlTdW1tYXJ5KCkgewotCQlzdHlsZSA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCURvY3VtZW50IGRvYyA9IGdldFN1bW1hcnlUZXh0KCk7Ci0JCXRleHRWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQkJdGV4dFZpZXdlci5jaGFuZ2VUZXh0UHJlc2VudGF0aW9uKHN0eWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWRpc3BsYXlTdW1tYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRvY3VtZW50IG9mIHN1bW1hcnkgdGV4dC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0U3VtbWFyeVRleHQoKSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciB0ZXh0QnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChkYXRhLnNlbGVjdGVkQ29uZmlncy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzIpOwotCQl9IGVsc2UgewotCQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZGF0YS5zZWxlY3RlZENvbmZpZ3MKLQkJCQkJLmdldCgwKTsKLQkJCWlmICgoY2xvc3VyZSA9PSBudWxsKSB8fCAoY2xvc3VyZS5nZXRDb25maWd1cmF0aW9uKCkgIT0gY29uZmlnKSkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCQkJCQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShudWxsLCBjb25maWcpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJCQlFeHBvcnRSZXNvdXJjZXMuRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgZXJyb3JzID0gY2xvc3VyZS5nZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzMpOwotCQl9IGVsc2UgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLmJpbmQoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80LAotCQkJCQkobmV3IE9iamVjdFtdIHsgSW50ZWdlci50b1N0cmluZyhlcnJvcnMuc2l6ZSgpKSB9KSkpOwotCQl9Ci0KLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KHRleHRCdWYudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Nob29zZU1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2OGQ5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgdHlwZXMgb2YgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZSBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ0Nob29zZU1vZGUgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ0Nob29zZU1vZGUuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIEJ1dHRvbiBvbmVDb25maWdCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTcGVjQnV0dG9uOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJb25lQ29uZmlnQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0LCAxLCB0cnVlKTsKLQotCQljb25maWdTcGVjQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQsIDEsCi0JCQkJZmFsc2UpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW9uZUNvbmZpZ0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJY29uZmlnU3BlY0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCWRhdGEuZXhwb3J0T25lQ29uZmlnID0gb25lQ29uZmlnQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlkYXRhLmV4cG9ydENvbmZpZ1NwZWNzID0gY29uZmlnU3BlY0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlpZiAoZGF0YS5leHBvcnRPbmVDb25maWcpIHsKLQkJCUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLnNlbGVjdENvbmZpZ1BhZ2U7Ci0JCQlyZXR1cm4gcGFnZTsKLQkJfSBlbHNlIGlmIChkYXRhLmV4cG9ydENvbmZpZ1NwZWNzKSB7Ci0JCQlFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLnNlbGVjdFNwZWNzUGFnZTsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmRjYzQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgZm9yIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgb2YgYW4KLSAqIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FLCBkYXRhLmxsRGF0YSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIGV4cG9ydERpcnMgPSBFeHBvcnRVSVByZWZlcmVuY2VzLmdldEV4cG9ydENvbmZpZ0RpcnMoKTsKLQkJaWYgKGV4cG9ydERpcnMgIT0gbnVsbCAmJiBleHBvcnREaXJzLmxlbmd0aCA+IDApIHsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRJdGVtcyhleHBvcnREaXJzKTsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0JCXN1cGVyLmluaXRDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJaWYgKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwCi0JCQkJJiYgIWV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJCXdpemFyZC5va1RvQ29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlMGNlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8KLSAqIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjdHJsX3RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1BhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7Ci0KLQkJY3RybF90YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCAxMjAsIDEpOwotCQl0YWJsZSA9IGN0cmxfdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotLyoJCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsqLwotCQkKLQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RDb25maWd1cmF0aW9uPigKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCWlmIChjb25maWdMaXN0LnNpemUoKSA+IDEpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxNZXRob2RDb25maWd1cmF0aW9uPiBzb3J0KGNvbmZpZ0xpc3QsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gYSA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uW2NvbmZpZ0xpc3Quc2l6ZSgpXTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBjb25maWdMaXN0LnRvQXJyYXkoYSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY3RybF90YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX3RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChjb25maWdzICE9IG51bGwpIHsKLQkJCWN0cmxfdGFibGVWaWV3ZXIuc2V0SW5wdXQoY29uZmlncyk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQotCQljdHJsX2JyaWVmRGVzYyA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMzYwLCA4MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlncyAhPSBudWxsICYmIGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF90YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3RybF90YWJsZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF07Ci0JCUxpc3QgYXJyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYXJyTGlzdC5hZGQoY29uZmlnKTsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBhcnJMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuY29uZmlnQ2hlY2tpbmdQYWdlOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN0cmxfdGFibGVWaWV3ZXIKLQkJCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotICAgIAlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgIAkJcmV0dXJuIGZhbHNlOwotICAgIAl9Ci0gICAgICAgIHJldHVybiBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWMwMjQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZAotICogY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCXByaXZhdGUgTGlzdCBjaGVja2VkQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoY29udGFpbmVyLCAxKTsKLQkJdGFibGUgPSBjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0KLS8qCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ki8KLQkJCi0JCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQlpZiAoY29uZmlnTGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCS5nZXRDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48TWV0aG9kQ29uZmlndXJhdGlvbj4gc29ydChjb25maWdMaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGEgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbltjb25maWdMaXN0LnNpemUoKV07Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gY29uZmlnTGlzdC50b0FycmF5KGEpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAoY29uZmlncyAhPSBudWxsKSB7Ci0JCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldElucHV0KGNvbmZpZ3MpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAzNjAsIDgwLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb25maWdzICE9IG51bGwgJiYgY29uZmlncy5sZW5ndGggPiAwKSB7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQljaGVja2VkQ291bnQrKzsKLQkJCWNoZWNrZWRDb25maWdMaXN0LmFkZChvYmopOwotCQl9IGVsc2UgewotCQkJY2hlY2tlZENvdW50LS07Ci0JCQljaGVja2VkQ29uZmlnTGlzdC5yZW1vdmUob2JqKTsKLQkJfQotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGNoZWNrZWRDb3VudCA+IDA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURhdGFUb01vZGVsKCkgewotCQlkYXRhLnNlbGVjdGVkQ29uZmlncyA9IGNoZWNrZWRDb25maWdMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuZGVzdGluYXRpb25QYWdlOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMyNmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZSBtb2RlUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2Ugc2VsZWN0U3BlY3NQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UgY29uZmlnQ2hlY2tpbmdQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZSBkZXN0aW5hdGlvblBhZ2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBva1RvQ29tcGxldGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgZmFsc2UsIG51bGwsIG51bGwsCi0JCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJbW9kZVBhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZShkYXRhKTsKLQkJYWRkUGFnZShtb2RlUGFnZSk7Ci0KLQkJc2VsZWN0U3BlY3NQYWdlID0gbmV3IEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZShkYXRhKTsKLQkJYWRkUGFnZShzZWxlY3RTcGVjc1BhZ2UpOwotCi0JCXNlbGVjdENvbmZpZ1BhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZShkYXRhKTsKLQkJYWRkUGFnZShzZWxlY3RDb25maWdQYWdlKTsKLQotCQljb25maWdDaGVja2luZ1BhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlKGRhdGEpOwotCQlhZGRQYWdlKGNvbmZpZ0NoZWNraW5nUGFnZSk7Ci0KLQkJZGVzdGluYXRpb25QYWdlID0gbmV3IEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZShkYXRhKTsKLQkJYWRkUGFnZShkZXN0aW5hdGlvblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9DT05GSUdVUkFUT04pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCS8vIENhbm5vdCBjb21wbGV0ZSB0aGUgd2l6YXJkIGlmIGl0J3Mgbm90IHRoZSBsYXN0IHBhZ2UuCi0JCWlmICh0aGlzLmdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gZGVzdGluYXRpb25QYWdlKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2tUb0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSBkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKTsKLQkJaWYgKCFjaGVja0FuZENyZWF0ZURpcihleHBvcnRMaWJQYXRoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCQlFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQlpZiAoZGF0YS52YWxpZGF0ZSgpKSB7Ci0JCQkJCQlpZiAoZGF0YS5leHBvcnRDb25maWdTcGVjcykgewotCQkJCQkJCS8vIEV4cG9ydCBjb25maWd1cmF0aW9uIHNwZWNzIG9ubHkuCi0JCQkJCQkJKG5ldyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlKGRhdGEpKQotCQkJCQkJCQkJLnJ1bihtb25pdG9yKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCQkJCQkJCShuZXcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihtb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGF0YS5lcnJvck1zZyAhPSBudWxsICYmIGRhdGEuZXJyb3JNc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLAotCQkJCQlkYXRhLmVycm9yTXNnKTsKLQkJfQotCi0JCS8vIFNhdmUgdGhlIGV4cG9ydCBwYXRoIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCUV4cG9ydFVJUHJlZmVyZW5jZXMuYWRkRXhwb3J0Q29uZmlnRGlyKGV4cG9ydExpYlBhdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyKSB7Ci0JCXJldHVybiBEaXJlY3RvcnlWYWxpZGF0b3IuY2hlY2tBbmRDcmVhdGVEaXIoZGlyLAotCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZSwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuRXhwb3J0UGx1Z2luRXJyb3JfbXNnLCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI3YzQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIGEgc3VtbWFyeSBvZiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zIHRoYXQKLSAqIHdpbGwgYmUgZXhwb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHRWaWV3ZXIgdGV4dFZpZXdlcjsKLQotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBzdHlsZTsKLQotCXByaXZhdGUgUGx1Z2luRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQl0ZXh0Vmlld2VyID0gY3JlYXRlVGV4dFZpZXdlcihjb250YWluZXIsIDM2MCwgMTYwLCAxKTsKLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCIiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRleHRWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcGxheVN1bW1hcnkoKSB7Ci0JCXN0eWxlID0gbmV3IFRleHRQcmVzZW50YXRpb24oKTsKLQkJRG9jdW1lbnQgZG9jID0gZ2V0U3VtbWFyeVRleHQoKTsKLQkJdGV4dFZpZXdlci5zZXREb2N1bWVudChkb2MpOwotCQl0ZXh0Vmlld2VyLmNoYW5nZVRleHRQcmVzZW50YXRpb24oc3R5bGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJZGlzcGxheVN1bW1hcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZG9jdW1lbnQgb2YgdGhlIHN1bW1hcnkgdGV4dC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0U3VtbWFyeVRleHQoKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0QnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChkYXRhLnNlbGVjdGVkUGx1Z2lucyA9PSBudWxsIHx8IGRhdGEuc2VsZWN0ZWRQbHVnaW5zLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgRG9jdW1lbnQoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0KTsKLQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luIDogZGF0YS5zZWxlY3RlZFBsdWdpbnMpIHsKLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IHBsdWdpbi5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEKSk7Ci0JCQl0ZXh0QnVmLmFwcGVuZChwbHVnaW4uZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVC5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikuYXBwZW5kKEF1dGhvcmluZ1VJVGV4dC5BVVRIT1JTX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmLmFwcGVuZCgiXHRcdCIpLmFwcGVuZChwbHVnaW4uZ2V0QXV0aG9ycygpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKHBsdWdpbi5nZXRWZXJzaW9uKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0XHQiKS5hcHBlbmQocGx1Z2luLmdldEJyaWVmRGVzY3JpcHRpb24oKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0Ci0JCQkJCS5sZW5ndGgoKTsgCi0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgKLQkJCQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQpCi0JCQkJCS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3QgZGVwZW5kZW50UGx1Z2luTGlzdCA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQkJYm9vbGVhbiBhZGRMaW5lZmVlZCA9IHRydWU7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRlbnRQbHVnaW5MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlx0XHQiKS5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYWRkTGluZWZlZWQgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChhZGRMaW5lZmVlZCkKLQkJCQl0ZXh0QnVmLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0Ci0JCQkJCS5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKAotCQkJCQkJCUV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQpCi0JCQkJCS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3QgYXNzb2NpYXRlZENvbmZpZ0xpc3QgPSAoTGlzdCkgZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFzc29jaWF0ZWRDb25maWdMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGVsZW1lbnQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlx0XHQiKS5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXRleHRCdWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQodGV4dEJ1Zi50b1N0cmluZygpKTsKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5OTBiYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1ldGhvZCBQbHVnLWluIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UGx1Z2luV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0UGx1Z2luUGFnZSBwYWdlMTsKLQotCXByb3RlY3RlZCBQbHVnaW5JbmZvUGFnZSBwYWdlMjsKLQotCXByb3RlY3RlZCBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZSBwYWdlMzsKLQotCXByb3RlY3RlZCBTYXZlUGx1Z2luUGFnZSBwYWdlNDsKLQotCXByb3RlY3RlZCBib29sZWFuIG9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFBsdWdpbkV4cG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRQbHVnaW5XaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgZmFsc2UsIG51bGwsIG51bGwsCi0JCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0TWV0aG9kUGx1Z2lucy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwYWdlMSA9IG5ldyBTZWxlY3RQbHVnaW5QYWdlKGRhdGEpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQotCQlwYWdlMiA9IG5ldyBQbHVnaW5JbmZvUGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0KLQkJcGFnZTMgPSBuZXcgRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UocGFnZTMpOwotCi0JCXBhZ2U0ID0gbmV3IFNhdmVQbHVnaW5QYWdlKGRhdGEpOwotCQlhZGRQYWdlKHBhZ2U0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAodGhpcy5nZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IHBhZ2U0KQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2tUb0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSBkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKTsKLQkJaWYgKGNoZWNrQW5kQ3JlYXRlRGlyKGV4cG9ydExpYlBhdGgpID09IGZhbHNlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5XaXphcmRfTVNHMSwKLQkJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCi0JCQkJCWlmIChkYXRhLnZhbGlkYXRlKCkpIHsKLQkJCQkJCShuZXcgUGx1Z2luRXhwb3J0U2VydmljZShkYXRhKSkucnVuKG1vbml0b3IpOwotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3IsCi0JCQkJCXJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFNhdmUgdGhlIGV4cG9ydCBwYXRoIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCUV4cG9ydFVJUHJlZmVyZW5jZXMuYWRkRXhwb3J0UGx1Z2luRGlyKGV4cG9ydExpYlBhdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyKSB7Ci0JCXJldHVybiBEaXJlY3RvcnlWYWxpZGF0b3IuY2hlY2tBbmRDcmVhdGVEaXIoZGlyLAotCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGUsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbkVycm9yX21zZywgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OThlZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBFeHBvcnQgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0VUlQcmVmZXJlbmNlcyB7Ci0KLQkvLyBUaGUgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9QTFVHSU5fRElSUyA9ICJleHBvcnRQbHVnaW5EaXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfQ09ORklHX0RJUlMgPSAiZXhwb3J0Q29uZmlnRGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yeSBuYW1lLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYUE9SVF9QTFVHSU5fRElSX05BTUUgPSAiRXhwb3J0IiArIEZpbGVVdGlsLkZJTEVfU0VQICsgIlBsdWdpbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJIAotCi0JLy8gVGhlIGRlZmF1bHQgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IG5hbWUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhQT1JUX0NPTkZJR19ESVJfTkFNRSA9ICJFeHBvcnQiICsgRmlsZVV0aWwuRklMRV9TRVAgKyAiQ29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJIAotCi0JLy8gVGhlIGRlZmF1bHQgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3J5LgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0RXhwb3J0UGx1Z2luRGlyID0gbnVsbDsKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEV4cG9ydENvbmZpZ0RpciA9IG51bGw7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHN0b3JlLgotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0Jc3RhdGljIHsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRVhQT1JUX1BMVUdJTl9ESVJTLCBnZXREZWZhdWx0RXhwb3J0UGx1Z2luRGlyKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfQ09ORklHX0RJUlMsIGdldERlZmF1bHRFeHBvcnRDb25maWdEaXIoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RXhwb3J0UGx1Z2luRGlyKCkgewotCQlpZiAoZGVmYXVsdEV4cG9ydFBsdWdpbkRpciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0RXhwb3J0UGx1Z2luRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRFeHBvcnRQbHVnaW5EaXIgPSBkZWZhdWx0RXhwb3J0UGx1Z2luRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfRVhQT1JUX1BMVUdJTl9ESVJfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdEV4cG9ydFBsdWdpbkRpciA9IGRlZmF1bHRFeHBvcnRQbHVnaW5EaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBERUZBVUxUX0VYUE9SVF9QTFVHSU5fRElSX05BTUU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRFeHBvcnRQbHVnaW5EaXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFeHBvcnRQbHVnaW5EaXJzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKHByZWZTdG9yZSwgRVhQT1JUX1BMVUdJTl9ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0RXhwb3J0UGx1Z2luRGlyc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgRVhQT1JUX1BMVUdJTl9ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgZXhwb3J0IGRpcmVjdG9yeSB0byB0aGUgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBhbiBleHBvcnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4cG9ydFBsdWdpbkRpcihTdHJpbmcgZGlyKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIEVYUE9SVF9QTFVHSU5fRElSUywgZGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFeHBvcnRDb25maWdEaXIoKSB7Ci0JCWlmIChkZWZhdWx0RXhwb3J0Q29uZmlnRGlyID09IG51bGwpIHsKLQkJCWRlZmF1bHRFeHBvcnRDb25maWdEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwTmFtZSA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCk7Ci0JCQlpZiAoYXBwTmFtZSAhPSBudWxsICYmIGFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmYXVsdEV4cG9ydENvbmZpZ0RpciA9IGRlZmF1bHRFeHBvcnRDb25maWdEaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBhcHBOYW1lICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgREVGQVVMVF9FWFBPUlRfQ09ORklHX0RJUl9OQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlkZWZhdWx0RXhwb3J0Q29uZmlnRGlyID0gZGVmYXVsdEV4cG9ydENvbmZpZ0RpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIERFRkFVTFRfRVhQT1JUX0NPTkZJR19ESVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdEV4cG9ydENvbmZpZ0RpcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEV4cG9ydENvbmZpZ0RpcnMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBFWFBPUlRfQ09ORklHX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRFeHBvcnRDb25maWdEaXJzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBFWFBPUlRfQ09ORklHX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBleHBvcnQgZGlyZWN0b3J5IHRvIHRoZSBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcwotCSAqIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgYW4gZXhwb3J0IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHBvcnRDb25maWdEaXIoU3RyaW5nIGRpcikgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBFWFBPUlRfQ09ORklHX0RJUlMsIGRpcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvUGx1Z2luSW5mb1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9QbHVnaW5JbmZvUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGViMzY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9QbHVnaW5JbmZvUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLkNvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJldmlldyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBtZXRob2QKLSAqIHBsdWctaW5zIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkluZm9QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBQbHVnaW5JbmZvUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjdHJsX3RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXI7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlcjsKLQotCXByaXZhdGUgTGlzdCBkZXBlbmRlbnRQbHVnaW5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IGFzc29jaWF0ZWRDb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbmZvUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQpOwotCi0JCWN0cmxfdGFibGVWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcihjb250YWluZXIsIDM2MCwgNjAsIDEpOwotCQl0YWJsZSA9IGN0cmxfdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY3RybF90YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX3RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwpIHsKLQkJCWN0cmxfdGFibGVWaWV3ZXIuc2V0SW5wdXQoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS50b0FycmF5KCkpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dCk7Ci0KLQkJY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDYwLCAxKTsKLQkJY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0SW5wdXQoZGVwZW5kZW50UGx1Z2luTGlzdCk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQpOwotCi0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlcgotCQkJCS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIKLQkJCQkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyLnNldElucHV0KGFzc29jaWF0ZWRDb25maWdMaXN0KTsKLQotCQlpZiAoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKSAhPSBudWxsCi0JCQkJJiYgIWRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXNFbXB0eSgpKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlkaXNwbGF5UmVsYXRlZEluZm8oZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF90YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBwbHVnaW4gPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZGlzcGxheVJlbGF0ZWRJbmZvKChNZXRob2RQbHVnaW4pIHBsdWdpblswXSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKSAhPSBudWxsCi0JCQkJJiYgIWRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXNFbXB0eSgpKSB7Ci0JCQljdHJsX3RhYmxlVmlld2VyLnNldElucHV0KGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkudG9BcnJheSgpKTsKLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCWRpc3BsYXlSZWxhdGVkSW5mbyhkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5UmVsYXRlZEluZm8oTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZiAocGx1Z2luID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZGVwZW5kZW50UGx1Z2luTGlzdCA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0SW5wdXQoZGVwZW5kZW50UGx1Z2luTGlzdC50b0FycmF5KCkpOwotCQlhc3NvY2lhdGVkQ29uZmlnTGlzdCA9IExpYnJhcnlVdGlsLmdldEFzc29jaWF0ZWRDb25maWd1cmF0aW9ucyhwbHVnaW4pOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIuc2V0SW5wdXQoYXNzb2NpYXRlZENvbmZpZ0xpc3QudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURhdGFUb01vZGVsKCkgewotCQkvLyBGSVhNRSEgUmVmYWN0b3IgdG8gdXNlOiBkYXRhLmJ1aWxkQXNzb2NpYXRlZENvbmZpZ01hcCgpCi0JCWlmIChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwpIHsKLQkJCWRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcC5jbGVhcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQlkYXRhLmFzc29jaWF0ZWRDb25maWdNYXAucHV0KGVsZW1lbnQsIExpYnJhcnlVdGlsCi0JCQkJCQkuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKGVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIHBhZ2UgPSAoKEV4cG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCkpLnBhZ2UzOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TYXZlUGx1Z2luUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWI5YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGluZm9ybXMgdGhlIHVzZXIgdGhhdCBjaGFuZ2VzIHRvIHRoZSBleGlzdGluZyBtZXRob2QKLSAqIHBsdWctaW5zIHdpbGwgYmUgc2F2ZWQgcHJpb3IgdG8gYW4gZXhwb3J0IG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVBsdWdpblBhZ2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2F2ZVBsdWdpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2F2ZVBsdWdpblBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc3BlY2lmeVBhdGhQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNwZWNpZnlQYXRoUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmdbXSBleHBvcnREaXJzID0gRXhwb3J0VUlQcmVmZXJlbmNlcy5nZXRFeHBvcnRQbHVnaW5EaXJzKCk7Ci0JCWlmIChleHBvcnREaXJzICE9IG51bGwgJiYgZXhwb3J0RGlycy5sZW5ndGggPiAwKSB7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0SXRlbXMoZXhwb3J0RGlycyk7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChleHBvcnREaXJzWzBdKTsKLQkJfQotCQlzdXBlci5pbml0Q29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJRXhwb3J0UGx1Z2luV2l6YXJkIHdpemFyZCA9IChFeHBvcnRQbHVnaW5XaXphcmQpIGdldFdpemFyZCgpOwotCQlpZiAoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiAhZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQl3aXphcmQub2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDc3MzM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIG1ldGhvZCBwbHVnLWlucyB0byBiZQotICogZXhwb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFBsdWdpblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFBsdWdpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9yOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByaXZhdGUgaW50IGNoZWNrZWRDb3VudCA9IDA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBjaGVja2VkUGx1Z2luTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JcHJpdmF0ZSBQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCQotCXByaXZhdGUgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UGx1Z2luUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyMSA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lcjEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lcjEsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0KTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVCdXR0b24oCi0JCQkJY29udGFpbmVyMSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKLQkJCQljb250YWluZXIxLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcihjb250YWluZXIsIDEpOwotCQl0YWJsZSA9IGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IChsaWJyYXJ5ID09IG51bGwpID8gbmV3IEFycmF5TGlzdCgpIDogbmV3IEFycmF5TGlzdChsaWJyYXJ5Ci0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQotCQlpZiAocGx1Z2lucy5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxNZXRob2RQbHVnaW4+c29ydChwbHVnaW5zLCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChwbHVnaW5zICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQocGx1Z2lucy50b0FycmF5KCkpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhUKTsKLQkJY3RybF9hdXRob3IgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDM2MCwgNDAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJY3RybF92ZXJzaW9uID0gY3JlYXRlVGV4dChjb250YWluZXIsICIiLCAzNjAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAzNjAsIDgwLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChwbHVnaW5zICE9IG51bGwgJiYgIXBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldCgwKSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMocGx1Z2lucyk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoZmluYWwgTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmNsZWFyKCk7Ci0JCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZEFsbChwbHVnaW5zKTsKLQkJCQkJY2hlY2tlZENvdW50ID0gY2hlY2tlZFBsdWdpbkxpc3Quc2l6ZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQljaGVja2VkUGx1Z2luTGlzdC5jbGVhcigpOwotCQkJCQljaGVja2VkQ291bnQgPSAwOwotCQkJCX0KLQkJCQkKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCWNoZWNrZWRDb3VudCsrOwotCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZCgoTWV0aG9kUGx1Z2luKW9iaik7Ci0JCQl9IGVsc2UgewotCQkJCWNoZWNrZWRDb3VudC0tOwotCQkJCWNoZWNrZWRQbHVnaW5MaXN0LnJlbW92ZShvYmopOwotCQkJfQotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBwbHVnaW4gPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZFBsdWdpbikgcGx1Z2luWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQljdHJsX2F1dGhvci5zZXRUZXh0KHBsdWdpbi5nZXRBdXRob3JzKCkpOwotCQljdHJsX3ZlcnNpb24uc2V0VGV4dChwbHVnaW4uZ2V0VmVyc2lvbigpKTsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChwbHVnaW4uZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGNoZWNrZWRDb3VudCA+IDA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURhdGFUb01vZGVsKCkgewotCQlkYXRhLnNldFNlbGVjdGVkUGx1Z2lucyhjaGVja2VkUGx1Z2luTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJUGx1Z2luSW5mb1BhZ2UgcGFnZSA9ICgoRXhwb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKSkucGFnZTI7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzY3OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGV4cG9ydGluZyBtZXRob2QgcGx1Zy1pbnMgYW5kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMzZkYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4ZGZlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5Eb2NQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5oZWxwCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUNsYXNzUGF0aDogZG9jLmphcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYWNjZXNzaWJpbGl0eS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYWNjZXNzaWJpbGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZTA2YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2FjY2Vzc2liaWxpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IiBsaW5rX3RvPSJtYWluLnhtbCNhY2Nlc3NpYmlsaXR5X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSBvdmVydmlldyIgaHJlZj0iaHRtbC90b3BpY3MvY19hY2Nlc3NpYmlsaXR5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU2V0dGluZyBhY2Nlc3NpYmlsaXR5IHByZWZlcmVuY2VzIiBocmVmPSJodG1sL3RvcGljcy90X2FjY2Vzc2liaWxpdHlfcHJlZmVyZW5jZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTZWxlY3RpbmcgYW4gYWx0ZXJuYXRlIGJyb3dzZXIiIGhyZWY9Imh0bWwvdG9waWNzL3RfYWNjZXNzaWJpbGl0eV9zZXRfYnJvd3Nlci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IktleWJvYXJkIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3JfYWNjZXNzaWJpbGl0eV9uYXZpZ2F0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRm9udHMgYW5kIGNvbG9ycyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9hY2Nlc3NpYmlsaXR5X2ZvbnRzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwMGZhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXNvdXJjZS5kb2MuamFyID0gc3JjLwotb3V0cHV0LmRvYy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGRvYy5qYXIsXAotICAgICAgICAgICAgICAgZG9jLnppcCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhY2Nlc3NpYmlsaXR5LnhtbCxcCi0gICAgICAgICAgICAgICBjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnQueG1sLFwKLSAgICAgICAgICAgICAgIGNvbnRleHRzX2F1dGhvcmluZ191aS54bWwsXAotICAgICAgICAgICAgICAgY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sLFwKLSAgICAgICAgICAgICAgIGNyZWF0aW5nX3Byb2Nlc3Nlcy54bWwsXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkLnhtbCxcCi0gICAgICAgICAgICAgICBnbG9zc2FyeS54bWwsXAotICAgICAgICAgICAgICAgbWFpbi54bWwsXAotICAgICAgICAgICAgICAgb3ZlcnZpZXcueG1sLFwKLSAgICAgICAgICAgICAgIHB1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbCxcCi0gICAgICAgICAgICAgICB0dXRvcmlhbHMueG1sLFwKLSAgICAgICAgICAgICAgIHZlcnNpb25fY29udHJvbC54bWwsXAotICAgICAgICAgICAgICAgY2hlYXRzaGVldHMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemVtZXRoY29udC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1MjY5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ2F0ZWdvcml6ZSBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjY2F0ZWdvcml6ZW1ldGhvZGNvbnRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjdlZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNhdGVnb3JpemluZyBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50X2lkIj4gIAotICA8dG9waWMgbGFiZWw9IlN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC90b3BpY3MvY19tZXRob2RfY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgdmlldyB3aXRoIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5ODdlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbWV0aG9kcmVmX29yX2h5cGVybGluay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkFkZCBhIE1ldGhvZCBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIChVUkwpIj4KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHJlZmVyZW5jZXMgb3IgaHlwZXJsaW5rcyB0byBvdGhlciBjb250ZW50IHdpdGhpbiB5b3VyIGNvbnRlbnQgdGV4dDogcmVmZXJlbmNlcyAgdG8gb3RoZXIgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgdGV4dCBvdXRzaWRlIHRoZSBtZXRob2QgbGlicmFyeSB3aXRoIGEgVVJMLiBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIGNyZWF0aW5nIGJvdGggdHlwZXMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNyZWF0ZSBhIEh5cGVybGluayB0byBhbm90aGVyIGVsZW1lbnQgaW4gdGhlIE1ldGhvZCBMaWJyYXJ5IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHJlY29nbml6ZSBhIHRleHQgZmllbGQgdGhhdCBzdXBwb3J0cyBoeXBlcmxpbmtzIGJ5IHRoZSBsaXR0bGUgdHJpYW5nbGUgbmV4dCB0byB0aGUgdGV4dCBmaWVsZCdzIGxhYmVsLiAgVGhpcyB0cmlhbmdsZSBhbGxvd3MgeW91IHRvIGV4cGFuZCB0aGUgdGV4dCBmaWVsZCBpbnRvIGEgZnVsbCBzaXplIGVkaXRvciB3aXRoIGFuIGVkaXRvciB0b29sYmFyIHByb3ZpZGluZyByaWNoIHRleHQgZWRpdGluZyBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZm9udCBzdHlsZXMsIGJ1bGxldCBwb2ludHMsIGV0Yy48YnIvPjxici8+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgaW4gdGhlIHRleHQgZmllbGQgc2ltcGx5IGZpbmQgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgb3IgY29uZmlndXJhdGlvbiB2aWV3IGFuZCBkcmFnIGl0IGludG8gYW4gZXhwYW5kZWQgb3IgY29sbGFwc2VkIGZvcm0gZmllbGQuPGJyLz48YnIvPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyBwb3NpdGlvbiB0aGUgY3Vyc29yIHdoZXJlIHlvdSB3YW50IHRoZSBsaW5rIHRvIGJlIGFkZGVkIGFuZCBjbGljayB0aGUgQWRkIExpbmsgYnV0dG9uIGluIHRoZSB0b29sIGJhci4gSXQgb3BlbnMgdGhlIEFkZCBMaW5rIGRpYWxvZyB0aGF0IHByb3ZpZGVzIHlvdSBhbW9uZ3N0IG90aGVycyB3aXRoIHRocmVlIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGxpbmtzIHRvIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYnkgc2VsZWN0aW5nIHRoZSBlbGVtZW50IHZpYSB0aGUgIkJyb3dzZS4uLiIgYnV0dG9uLiAgRXZlcnkgb3B0aW9uIG9mZmVycyBhIGRpZmZlcmVudCB3YXkgZm9yIGRpc3BsYXlpbmcgdGhlIGxpbmsncyBuYW1lOjxici8+PGJyLz4iTWV0aG9kIEVsZW1lbnQiOiBsaW5rcyB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50IG5hbWUuIjxici8+PGJyLz4iTWV0aG9kIHdpdGggdHlwZSBwcmVmaXgiOiBsaW5rIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZSBhbmQgdHlwZS48YnIvPjxici8+Ik1ldGhvZCBlbGVtZW50IHdpdGggY3VzdG9tIHRleHQiOiBsaW5rIHRoYXQgZGlzcGxheXMgYSB1c2VyIGRlZmluZWQgdGV4dC4gVG8gZGVmaW5lIHRoaXMgdGV4dCBtYW5pcHVsYXRlIHRoZSB0ZXh0IGluIGJldHdlZW4gdGhlICZsdDthJmd0OyZsdDsvYSZndDsgdGFncyBpbiB0aGUgVVJMIHRleHQgZmllbGQgb25jZSB5b3UgaGF2ZSBzZWxlY3RlZCBhbiBlbGVtZW50IHVzaW5nIHRoZSAiQnJvd3NlLi4uIiBidXR0b24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgSHlwZXJsaW5rIHRvIGFuIEV4dGVybmFsIHBhZ2UgdXNpbmcgYSBVUkwiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhbiBleHRlcm5hbCBVUkwsIGV4cGFuZCB0aGUgZWRpdG9yLCBwb3NpdGlvbiB0aGUgY3Vyc29yIHdoZXJlIHlvdSB3YW50IHRoZSBsaW5rIHRvIGJlIGFkZGVkIGFuZCB0aGVuIGNsaWNrIHRoZSAiQWRkIExpbmsiIGJ1dHRvbiBpbiB0aGUgdG9vbCBiYXIuIEZpbGwgaW4gdGhlIGRpYWxvZyB3aXRoIHRoZSBsaW5rIFVSTCBkZXRhaWxzIGFuZCB0aGVuIGNsaWNrIE9LLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2Q1NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG5ld21ldGhvZGNvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJBZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIGNoZWF0IHNoZWV0IGd1aWRlcyB5b3UgdGhvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29udGVudC4gWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG1ldGhvZCBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UgcHJvZHVjZS4gVGhpcyBzZXBhcmF0ZXMgeW91ciBjb250ZW50IGZyb20gY29udGVudCB0aGF0IHlvdSByZXVzZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFuZCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IHJlbGVhc2VzIG9mIHN1Y2ggdGhpcmQgcGFydHkgcGx1Zy1pbnMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLjxici8+PGJyLz5BbGwgcGx1Zy1pbnMgc2hpcHBlZCB3aXRoIHlvdXIgbWV0aG9kIGxpYnJhcnkgYXJlIHByb3RlY3RlZCBmcm9tIGRpcmVjdCBtb2RpZmljYXRpb24uIENyZWF0aW5nIG5ldyBlbGVtZW50cyBpbiB5b3VyIG93biBwbHVnLWluIGFuZCB0aGVuIHJlbGF0aW5nIHRob3NlIGVsZW1lbnRzIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgbG9ja2VkIHBsdWctaW4gYWxsb3dzIHlvdSB0byB0YWlsb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NrZWQgcGx1Zy1pbiBmb3IgeW91ciBvd24gdXNlLiBJZiB5b3UgaGF2ZSBub3QgY3JlYXRlZCB5b3VyIG93biBtZXRob2QgcGx1Zy1pbiwgcGVyZm9ybSB0aGUgIkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiIgY2hlYXQgc2hlZXQgZmlyc3QuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiCi0JCXRpdGxlPSJTZWxlY3Qgb3IgQ3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db250ZW50IHBhY2thZ2VzIGFyZSB1c2VkIHRvIGdyb3VwIHJlbGF0ZWQgbWV0aG9kIGNvbnRlbnQgdG9nZXRoZXIuIFNpbmNlIGNvbnRlbnQgcGFja2FnZXMgYXJlIHNlbGVjdGFibGUgYXQgcHVibGljYXRpb24gdGltZSwgaXQgaXMgcmVjb21tZW5kZWQgcHJhY3RpY2UgdG8gZ3JvdXAgY29udGVudCB0aGF0IG5lZWRzIHRvIGJlIHB1Ymxpc2hlZCB0b2dldGhlciBpbnRvIHRoZSBzYW1lIGNvbnRlbnQgcGFja2FnZS48YnIvPjxici8+RmluZCB5b3VyIG1ldGhvZCBwbHVnLWluIGluIHRoZSBMaWJyYXJ5IHZpZXcuIERyaWxsIGludG8gdGhlIHBsdWctaW4ncyBwYWNrYWdlcyB0byBsb2NhdGUgdGhlIHBhY2thZ2UgY2FsbGVkICJDb250ZW50IFBhY2thZ2VzIi4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGFsbCBwYWNrYWdlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4gbWV0aG9kIGVsZW1lbnRzLiBTZWxlY3QgYW5kIGV4cGFuZCBhIHBhY2thZ2UgaW4gdGhlICJDb250ZW50IFBhY2thZ2VzIiBoaWVyYXJjaHkgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgZWxlbWVudCwgb3IgdG8gY3JlYXRlIGEgbmV3IGNvbnRlbnQgcGFja2FnZS4gUmlnaHQgY2xpY2sgYSBwYWNrYWdlIGFuZCBzZWxlY3QgTmV3IC0mZ3Q7IENvbnRlbnQgUGFja2FnZS48YnIvPjxici8+QW4gZWRpdG9yIG9wZW5zIHRoYXQgYWxsb3dzIHlvdSB0byBwcm92aWRlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBwYWNrYWdlIGFzIHdlbGwgYXMgdG8gYnJpZWZseSBkZXNjcmliZSBpdHMgcHVycG9zZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwiCi0JCXRpdGxlPSJDcmVhdGUgTWV0aG9kIENvbnRlbnQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+SW4geW91ciBleHBhbmRlZCBjb250ZW50IHBhY2thZ2Ugd2l0aGluIHRoZSBsaWJyYXJ5IHZpZXcsIHJpZ2h0IGNsaWNrIGFueSBvbmUgb2Ygcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzLCBvciBndWlkYW5jZSB0byBjcmVhdGUgYW55IG9mIHRoZXNlIGNvbnRlbnQgZWxlbWVudHMuIEhpZ2hsaWdodCAiTmV3IiBhbmQgdGhlbiBzZWxlY3QgdGhlIGNvbmNyZXRlIHR5cGUgb2YgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gY3JlYXRlIChlLmcuIGZvciB3b3JrIHByb2R1Y3RzIGNob29zZSBiZXR3ZWVuIGFydGlmYWN0LCBvdXRjb21lLCBvciBkZWxpdmVyYWJsZSkuIFRoZSBuZXcgZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpdHMgcmVzcGVjdGl2ZSBlZGl0b3IgaXMgb3BlbmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkRldGFpbCB0aGUgTmV3bHkgQ3JlYXRlZCBNZXRob2QgQ29udGVudCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIGZpZWxkcyBpbiB0aGUgY29udGVudCBlbGVtZW50IGVkaXRvciB0byBzcGVjaWZ5IHRoZSBjb250ZW50IGVsZW1lbnQgZGV0YWlscy4gU3RhcnQgYnkgYXNzaWduaW5nIGEgdW5pcXVlICJOYW1lIiB0byB0aGUgZWxlbWVudCBhcyB3ZWxsIGFzIGdpdmluZyBpdCBhICJQcmVzZW50YXRpb24gTmFtZSIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4dGVybmFsIHZpc2libGUgbmFtZSB3aGVuIG90aGVyIGVsZW1lbnRzIHJlZmVyIHRvIHRoaXMgZWxlbWVudCBvciB3aGVuIHRoZSBlbGVtZW50IGlzIHB1Ymxpc2hlZC48YnIvPjxici8+RXZlcnkgZWxlbWVudCBvd25zIHNldmVyYWwgc3BlY2lmaWMgY29udGVudCBmaWVsZHMgZGlzdHJpYnV0ZWQgb24gc2V2ZXJhbCBzdGFja2VkIGVkaXRvciB0YWJzIGFuZCBzZWN0aW9ucyB3aXRoaW4gdGhlc2UgdGFicyB0aGF0IHlvdSBjYW4gdXNlIGZvciB5b3VyIGRlc2NyaXB0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgZGVzY3JpcHRpb24gZmllbGRzIGFzIHdlbGwgYXMgaG93IHRvIHVzZSB0aGUgcmljaCB0ZXh0IGVkaXRvciBzZWUgdGhlIG9ubGluZSBoZWxwLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4NTQzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYXBwbHljYXBhYmlsaXR5cGF0dGVybi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+V2hlbiBkZXZlbG9waW5nIGEgcHJvY2VzcyB5b3UgZG8gbm90IG5lZWQgdG8gd29yayBmcm9tIHNjcmF0Y2ggYnkgY3JlYXRpbmcgYWN0aXZpdGllcyBhbmQgZGVzY3JpcHRvcnMgb25lIGJ5IG9uZS4gIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggYXBwbHlpbmcgcHJlLWRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHBhcnRzIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPkEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBhY3Rpdml0aWVzIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIHBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBhIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkgcGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiBZb3UgY2FuIGFwcGx5IHRoZSBzYW1lIHBhdHRlcm4gc2V2ZXJhbCB0aW1lcyB0byB0aGUgc2FtZSBwcm9jZXNzIGFuZCBkZWZpbmUgbG9jYWwgbW9kaWZpY2F0aW9ucyB0byBlYWNoIGluZGl2aWR1YWwgcGF0dGVybiBhcHBsaWNhdGlvbi4gVGhpcyBhbGxvd3MgeW91IHRvIGV4cHJlc3Mgc3BlY2lmaWMgY2hhbmdlcyBlYWNoIHRpbWUgdGhlIHBhdHRlcm4gaXMgYmVpbmcgcGVyZm9ybWVkIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUgYSBwcm9jZXNzIHJlcHJlc2VudHMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkZpbmQgYW4gQWN0aXZpdHkgdG8gd2hpY2ggYSBQYXR0ZXJuIHdpbGwgYmUgQXBwbGllZCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+R2l2ZW4gdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IG9wZW5lZCB5b3VyIHByb2Nlc3MgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBzd2l0Y2ggdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSB0YWIgYW5kIHJldmlldyB5b3VyIHByb2Nlc3MuIEZpbmQgdGhlIGxvY2F0aW9uIHdoZXJlIHlvdSB3YW50IHRvIGFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuLiBBIGNhcGFiaWxpdHkgcGF0dGVybiBoYXMgdG8gYmUgYXBwbGllZCB0byBvbmUgc3BlY2lmaWMgYWN0aXZpdHkgKGluY2x1ZGluZyBpdGVyYXRpb24gb3IgcGhhc2Ugd2hpY2ggYXJlIHNwZWNpYWwgYWN0aXZpdGllcykgaW4gYSBwcm9jZXNzLiBTdWNoIGFuIGFjdGl2aXR5IGNhbiBlaXRoZXIgYmUgZGVmaW5lZCBsb2NhbGx5IGluIHRoZSBwcm9jZXNzIChwcmVzZW50ZWQgYXMgYSBuYW1lIGluIGEgc3RhbmRhcmQgYmxhY2sgZm9udCkgb3IgYW4gYWN0aXZpdHkgd2hpY2ggaGFkIGJlZW4gYWRkZWQgdG8gdGhlIHByb2Nlc3MgYnkgYXBwbHlpbmcgYW5vdGhlciBjYXBhYmlsaXR5IHBhdHRlcm4gKHByZXNlbnRlZCBhcyBhIG5hbWUgaW4gYSBncmVlbi1pdGFsaWMgZm9udCkuPGJyLz48YnIvPklmIHlvdSB3YW50IHRvIGFwcGx5IGEgcGF0dGVybiB0byBhIGxvY2FsIGFjdGl2aXR5IChibGFjayBmb250KSwgZ28gdG8gc3RlcCAiU2VsZWN0IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXciLiBJZiB5b3Ugd2FudCB0byBhcHBseSBhIHBhdHRlcm4gdG8gYW4gYWN0aXZpdHkgZnJvbSBhbm90aGVyIHBhdHRlcm4gKGdyZWVuIGl0YWxpYyBmb250KSwgcGxlYXNlIGdvIHRvIHN0ZXAgIkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+T25seSBpZiB5b3Ugd2FudCB0byBhcHBseSBhIHBhdHRlcm4gdG8gYW4gYWN0aXZpdHkgZnJvbSBhbm90aGVyIHBhdHRlcm4gKHJlY29nbml6YWJsZSBieSB0aGUgZ3JlZW4gaXRhbGljIGZvbnQpIHRoZW4geW91IG5lZWQgdG8gY3JlYXRlIGFuIGFjdGl2aXR5IGNvbnRyaWJ1dGlvbiwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYWtlIGxvY2FsIGNoYW5nZXMgdG8gdGhlIGFjdGl2aXR5Ljxici8+PGJyLz5GaW5kIHRoZSBhY3Rpdml0eSdzIHBhcmVudCBlbGVtZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMgYSBub3QgYSBsb2NhbCBlbGVtZW50IChncmVlbiBpdGFsaWMgZm9udCkgdGhlbiB5b3UgZmlyc3QgbmVlZCBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gdGhpcyBwYXJlbnQgYW5kIHNvIG9uIChpZiB0aGUgcGFyZW50J3MgcGFyZW50IGlzIG5vdCBsb2NhbCB0aGVuIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byB0aGUgcGFyZW50J3MgcGFyZW50IGZpcnN0LCBldGMuKSA8YnIvPjxici8+VG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGEgbm9uLWxvY2FsIGFjdGl2aXR5LCByaWdodC1jbGljayB0aGUgbm9uLWxvY2FsIGFjdGl2aXR5IGFuZCB0aGVuIGNsaWNrICJDb250cmlidXRlIi4gRG8gdGhpcyB3aXRoIGFsbCBwYXJlbnRzIHRvcC1kb3duIHVudGlsIHlvdSByZWFjaCB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91IHdhbnQgdG8gYXBwbHkgdGhlIHBhdHRlcm4uIE9uY2UgeW91IGNsaWNrZWQgIkNvbnRyaWJ1dGUiLCB0aGUgYWN0aXZpdHkgYmVjb21lIGxvY2FsIGFuZCBpcyBwcmVzZW50ZWQgd2l0aCBhIHN0YW5kYXJkIGJsYWNrIGZvbnQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgCi0JCXRpdGxlPSJTZWxlY3QgYSBDYXBhYmlsaXR5IFBhdHRlcm4gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+RmluZCBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBFeHBhbmQgdGhlIHBhY2thZ2UgIlByb2Nlc3NlcyAtJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zIiBhcyB3ZWxsIGFzIGl0cyBzdWItcGFja2FnZXMuIFNlbGVjdCB0aGUgcGF0dGVybiB5b3Ugd2FudCB0byBhcHBseSB0byB5b3VyIHByb2Nlc3MuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQXBwbHkgdGhlIENhcGFiaWxpdHkgUGF0dGVybiBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIEFjdGl2aXR5IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIGFwcGx5IGVpdGhlciB0aGUgd2hvbGUgY2FwYWJpbGl0eSBwYXR0ZXJuIHRvIHlvdXIgcHJvY2VzcyBvciBqdXN0IG9uZSBvciBtb3JlIGFjdGl2aXRpZXMgZnJvbSBpdC4gVG8gYXBwbHkgdGhlIHdob2xlIGNhcGFiaWxpdHkgcGF0dGVybiBkcmFnIHRoZSBwYXR0ZXJuIG92ZXIgdGhlIGFjdGl2aXR5IHNlbGVjdGVkIGVhcmxpZXIgaW4geW91ciBwcm9jZXNzLiBUbyBhcHBseSBvbmUgb3IgbW9yZSBhY3Rpdml0aWVzIG9mIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gc2VsZWN0IHRoZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gWW91IGNhbiBtdWx0aSBzZWxlY3QgYnkgcHJlc3NpbmcgY3RybCArIHNlbGVjdCwgb3Igc2hpZnQgKyBzZWxlY3QgdG8gY2FwdHVyZSBhbiBhbGwtaW5jbHVzaXZlIHNlY3Rpb24uPGJyLz48YnIvPkRyYWcgdGhlbSB0byB0aGUgYWN0aXZpdHkgc2VsZWN0ZWQgZWFybGllciBpbiB5b3VyIHByb2Nlc3MuIEFmdGVyIGRyYWdnaW5nIHRoZSBwYXR0ZXJuIG9yIGFjdGl2aXRpZXMgeW91IHdpbGwgYmUgcHJvbXB0ZWQgeW91IHRvIGFwcGx5IHRoZSBwYXR0ZXJuL2FjdGl2aXRpZXMgdmlhIEV4dGVuZHMgKGR5bmFtaWMgYmluZGluZykgb3IgQ29weSAoU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGVzZSB0d28gY2hvaWNlcykuIE1ha2UgeW91ciBjaG9pY2UgYnkgY2xpY2tpbmcuPGJyLz48YnIvPkFzIGFuIGFsdGVybmF0aXZlIHRvIGRyYWdnaW5nIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4geW91IGNhbiBhbHNvIHJpZ2h0LWNsaWNrIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCB0byBhcHBseSB0aGUgcGF0dGVybiBhbmQgc2VsZWN0IHRoZSBtZW51IG9wdGlvbiAiQXBwbHkgUGF0dGVybiAtJmd0OyBDb3B5Li4uIiBvciAiQXBwbHkgUGF0dGVybiAtJmd0OyBFeHRlbmQuLi4iPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJdGl0bGU9Ik1ha2UgTG9jYWwgQ2hhbmdlcyB0byBhIFBhdHRlcm4gQXBwbGljYXRpb24iCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+SWYgeW91IGFwcGxpZWQgdGhlIHBhdHRlcm4gdmlhIGNvcHksIHlvdSBjYW4gZnJlZWx5IG1ha2UgbW9kaWZpY2F0aW9ucyB0byB0aGUgY29waWVkIGVsZW1lbnRzLiBJZiB5b3UgYXBwbGllZCB0aGUgcGF0dGVybiB2aWEgZXh0ZW5kcyAoZHluYW1pYyBiaW5kaW5nKSB5b3UgY2FuIHN0aWxsIHByb3ZpZGUgbG9jYWwgYWRkaXRpb25zIHRvIHRoZSBwYXR0ZXJuIGJ5IGRlZmluaW5nIGEgY29udHJpYnV0aW9uIHRvIHRoZSBwYXR0ZXJuJ3MgYWN0aXZpdGllcy4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgb2YgdGhlIHN0ZXAgIkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iIGFib3ZlIHRvIGRlZmluZSBzdWNoIGEgY29udHJpYnV0aW9uLiBBZnRlciB5b3UgY3JlYXRlIHRoZSBsb2NhbCBhY3Rpdml0eSBjb250cmlidXRpb24sIHlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgZGVzY3JpcHRvcnMgb3IgcGF0dGVybnMgdG8gdGhpcyBhY3Rpdml0eS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQl0aXRsZT0iU3VwcHJlc3MgUGF0dGVybiBFbGVtZW50cyIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHN1cHByZXNzIGVsZW1lbnRzIHN1Y2ggYXMgZGVzY3JpcHRvcnMgb3IgYWN0aXZpdGllcyBvZiBhIGR5bmFtaWNhbGx5IGJvdW5kcyBwYXR0ZXJuICh2aWEgZXh0ZW5kcykgYnkgcmlnaHQgY2xpY2tpbmcgYW5kIHNlbGVjdGluZyAiU3VwcHJlc3MiIGZyb20gdGhlIGNvbnRleHQgbWVudS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVhcHJvY2Vzcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Yzc5NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgUHJvY2VzcyAoQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MpIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoaXMgY2hlYXQgc2hlZXQgZ3VpZGVzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyBhIFByb2Nlc3MuIFRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiBwcm9jZXNzZXM6IENhcGFiaWxpdHkgUGF0dGVybnMgYW5kIERlbGl2ZXJ5IFByb2Nlc3Nlcy4gQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIEFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMsIHdoaWxlIGEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHR5cGUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdC4gU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgZm9yIG1vcmUgZGV0YWlscy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCIKLQkJdGl0bGU9IlNlbGVjdCBvciBDcmVhdGUgYSBEZWZhdWx0IE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciB5b3VyIFByb2Nlc3MiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91ciBwcm9jZXNzIGNhbiBjb250YWluIGNvbnRlbnQgZnJvbSBtYW55IGRpZmZlcmVudCBtZXRob2QgcGx1Zy1pbnMuIFRoZSBjb250ZW50IGVsZW1lbnRzIGZyb20gdGhlc2UgcGx1Zy1pbnMsIHN1Y2ggYXMgdGFza3Mgb3Igd29yayBwcm9kdWN0cywgYXBwbGllZCB0byB5b3VyIHByb2Nlc3MgdmlhIGRyYWcgYW5kIGRyb3AsIGNhbiBoYXZlIG1hbnkgY29udHJpYnV0aW9ucyBvciByZXBsYWNlbWVudHMuIFN1Y2ggY29udHJpYnV0aW9ucyBvciByZXBsYWNlbWVudHMgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIHRoYXQgbmVlZCB0byBiZSBjb25zaWRlcmVkIGZvciBjcmVhdGluZyB0aGUgcHJvY2VzcyBlbGVtZW50cyB3aXRoIHRoZWlyIG1pcnJvcmVkIHNldCBvZiByZWxhdGlvbnNoaXBzLjxici8+PGJyLz5Gb3IgdGhhdCByZWFzb24geW91IG5lZWQgdG8gZGVmaW5lIGEgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHZpc2libGUgc2V0IG9mIGVsZW1lbnRzIGFuZCByZWxhdGlvbnNoaXBzIHdoZW4gdGhlIHByb2Nlc3MgaXMgYXV0aG9yZWQuIFRoaXMgcHJvY2VzcyBhdXRob3JpbmcgY29uZmlndXJhdGlvbiBpcyByZWZlcnJlZCB0byBhcyB0aGUgIkRlZmF1bHQgQ29uZmlndXJhdGlvbiIgZm9yIHRoZSBwcm9jZXNzIGFuZCBzaG91bGQgZGVmaW5lIHRoZSBsYXJnZXN0IHJlYXNvbmFibGUgc2V0IG9mIG1ldGhvZCBwbHVnLWlucywgY29udGVudCBwYWNrYWdlcywgYW5kIG90aGVyIHByb2Nlc3NlcyBmcm9tIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdpbGwgYmUgcmVmZXJyZWQgdG8gYnkgdGhlIHByb2Nlc3MgYXQgc29tZSBwb2ludC48YnIvPjxici8+SW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYSBwcm9jZXNzIGNhbiBiZSBsaW5rZWQgdG8gbWFueSBhZGRpdGlvbmFsIG1ldGhvZCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCB0byBhbHNvIHByb2R1Y2UgdmFsaWQgcmVzdWx0cy4gSG93ZXZlciwgYWxsIG90aGVyIHZhbGlkIGNvbmZpZ3VyYXRpb25zIG5lZWQgdG8gZGVmaW5lIHN1Yi1zZXRzIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBJbiBvdGhlciB3b3JkcywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGxpbmsgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIHByb2Nlc3MgdGhhdCByZWZlcnMgdG8gZWxlbWVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYmVjYXVzZSBzdWNoIGVsZW1lbnRzIHdlcmUgbm90IGNvbnNpZGVyZWQgd2hlbiB0aGUgcHJvY2VzcyB3YXMgY3JlYXRlZC48YnIvPjxici8+UHJvY2VzcyBlbGVtZW50cyB0aGF0IHJlZmVyIHRvIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBzdWNoIGEgY29uZmlndXJhdGlvbiB3aWxsIG5vdCBiZSBzaG93biBpbiB0aGUgcHJvY2VzcyB3aGVuIHB1Ymxpc2hlZCBvciB1c2VkIHVuZGVyIHN1Y2ggYSBjb25maWd1cmF0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IGhpZGUgY29udGVudCBmcm9tIGEgcHJvY2VzcyBieSBtb3ZpbmcgY29udGVudCBwYWNrYWdlcyBpbiBvciBvdXQgb2YgdGhlIHJlbGF0ZWQgY29uZmlndXJhdGlvbi48YnIvPjxici8+VGhlcmVmb3JlLCBiZWZvcmUgeW91IHN0YXJ0IGNyZWF0aW5nIGEgcHJvY2VzcywgcmV2aWV3IHlvdXIgbGlzdCBvZiBjb25maWd1cmF0aW9ucyBpbiB0aGUgbGlicmFyeSB2aWV3IGFuZCBkZWNpZGUgd2hpY2ggY29uZmlndXJhdGlvbiB5b3UgYXJlIGdvaW5nIHRvIHVzZS4gIElmIG5lY2Vzc2FyeSwgb3BlbiBjb25maWd1cmF0aW9ucyBhbmQgZXhhbWluZSB0aGVpciBzcGVjaWZpY2F0aW9uLiBJZiB5b3UgZG8gbm90IGZpbmQgYSBmaXR0aW5nIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSByaWdodCBzZXQgb2YgZWxlbWVudHMsIGNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByb2Nlc3MgYW5kIG1ldGhvZCBjb25maWd1cmF0aW9uIHNlZSB0aGUgc2VjdGlvbiAiUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXciIGluIHRoZSBvbmxpbmUgaGVscC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwiCi0JCXRpdGxlPSJDaG9vc2UgYSBNZXRob2QgUGx1Zy1pbiB0byBIb2xkIHlvdXIgUHJvY2VzcyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+U2luY2UgeW91IGNhbm5vdCBhZGQgcHJvY2Vzc2VzIHRvIHdyaXRlLWxvY2tlZCB0aGlyZC1wYXJ0eSBtZXRob2QgcGx1Zy1pbnMgeW91ciBwcm9jZXNzIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaW4gb25lIG9mIHlvdXIgb3duIG1ldGhvZCBwbHVnLWlucy4gVGhlcmVmb3JlLCBpdCBpcyBiZXN0IHRvIGNyZWF0ZSB5b3VyIHByb2Nlc3Mgd2l0aGluIHRoZSBwbHVnLWluIGluIHdoaWNoIGl0IGlzIGdvaW5nIHRvIGJlIHVzZWQuIEZvciBpbnN0YW5jZSwgaWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBhIHNldCBvZiBjYXBhYmlsaXR5IHBhdHRlcm5zIHRvIHVzZSB0byBhc3NlbWJsZSBhIGRlbGl2ZXJ5IHByb2Nlc3MsIHRyeSB0byBtYWludGFpbiBhbGwgb2YgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4uPGJyLz48YnIvPklmIHlvdSBoYXZlIG5vdCBjcmVhdGVkIGEgbWV0aG9kIHBsdWctaW4sIGdvIHRvIHRoZSAiQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIiBjaGVhdCBzaGVldC48YnIvPjxici8+SW4gdGhlIGxpYnJhcnkgdmlldywgc2VsZWN0IGEgcGx1Zy1pbiBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtZXRob2QgcGx1Zy1pbnMuIEljb25zIHRoYXQgYXBwZWFyIHRvIGJlIGdyYXllZC1vdXQgaGF2ZSBiZWVuIGxvY2tlZCBmb3IgbW9kaWZpY2F0aW9uIGFuZCBjYW5ub3QgYmUgdXNlZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwiIAotCQl0aXRsZT0iRmluZCBvciBDcmVhdGUgYSBQcm9jZXNzIFBhY2thZ2UiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlByb2Nlc3NlcyBjYW4gYmUgb3JnYW5pemVkIHdpdGggcHJvY2VzcyBwYWNrYWdlcyB0byBpbmNyZWFzZSBtYWludGFpbmFiaWxpdHkgYW5kIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgcHJvY2VzcyB1c2VyIHRvIGJyb3dzZSBhbmQgZmluZCB0aGVtLiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB5b3UgY2FuIGNyZWF0ZSBjYXBhYmlsaXR5IHBhdHRlcm5zIG9ubHkgaW4gYSBjYXBhYmlsaXR5IHBhdHRlcm5zIHBhY2thZ2Ugb3Igc3ViLXBhY2thZ2UgYW5kIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvbmx5IGluIGEgZGVsaXZlcnkgcHJvY2VzcyBwYWNrYWdlIG9yIHN1Yi1wYWNrYWdlLjxici8+PGJyLz5Vc2luZyB0aGUgbGlicmFyeSB2aWV3LCByZXZpZXcgdGhlIHN0cnVjdHVyZSBvZiBwcm9jZXNzIHBhY2thZ2VzIGF2YWlsYWJsZSBpbiB0aGUgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3Ugc2VsZWN0ZWQgb3IgY3JlYXRlZCBpbiB0aGUgbGFzdCBzdGVwIGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIHBhY2thZ2VzIHByZXNlbnQgYXMgYSBjb250YWluZXIgZm9yIHlvdXIgcHJvY2Vzcy4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBuZXcgUHJvY2VzcyBQYWNrYWdlIGJ5IHJpZ2h0LWNsaWNraW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgcGFja2FnZSBvciBzdWItcGFja2FnZSBhbmQgdGhlbiBjbGlja2luZyBOZXcgLSZndDsgUHJvY2VzcyBQYWNrYWdlLiBJbiB0aGUgZGlhbG9nIGJveCB0aGF0IGFwcGVhcnMsIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgYW5kIHRoZW4gY2xpY2sgT0suPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgCi0JCXRpdGxlPSJDcmVhdGUgdGhlIENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzIgotCQlza2lwPSJmYWxzZSI+CQotCQk8ZGVzY3JpcHRpb24+VG8gY3JlYXRlIGEgbmV3IGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzOiBSaWdodCBjbGljayB0aGUgc2VsZWN0ZWQgb3IgbmV3bHkgY3JlYXRlZCBwcm9jZXNzIHBhY2thZ2UgYW5kIHRoZW4gY2xpY2sgTmV3IC0mZ3Q7IENhcGFiaWxpdHkgUGF0dGVybiBvciBOZXcgLSZndDsgRGVsaXZlcnkgUHJvY2Vzcy4gIEluIHRoZSBkaWFsb2cgYm94IHRoYXQgYXBwZWFycywgc3BlY2lmeSB0aGUgcHJvY2VzcyBuYW1lIGFuZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYW5kIHRoZW4gY2xpY2sgT0suIFRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHRoZSBlZGl0b3IgaXMgb3BlbmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCXRpdGxlPSJEb2N1bWVudCB5b3VyIFByb2Nlc3MiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPldpdGggdGhlIHByb2Nlc3MgZWRpdG9yIG9wZW5lZCBpbiB0aGUgRGVzY3JpcHRpb24gdGFiLCBkb2N1bWVudCB5b3VyIHByb2Nlc3MgdXNpbmcgdGhlIGF2YWlsYWJsZSB0ZXh0IGZpZWxkcy4gIEF0IGEgbWluaW11bSBwcm92aWRlIGEgcHJlc2VudGF0aW9uIG5hbWUgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHlvdXIgcHJvY2Vzcy4gIFNlZSB0aGUgb25saW5lIGhlbHAgZm9yIGRlZmluaXRpb25zIG9mIGVhY2ggYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZmllbGQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi08aXRlbQotCQl0aXRsZT0iRGVjaWRlIG9uIHlvdXIgUHJpbWFyeSBQcm9jZXNzIEF1dGhvcmluZyBWaWV3IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIGRldmVsb3AgYSBwcm9jZXNzIGZyb20gdGhyZWUgZGlmZmVyZW50IHZpZXdzOjxici8+PGJyLz5CcmVha2Rvd24gU3RydWN0dXJlOiAgQ3JlYXRlIHlvdXIgcHJvY2VzcyBieSBkZWZpbmluZyBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS4gIENyZWF0ZSBpdGVyYXRpb25zIGFuZCBhY3Rpdml0aWVzIGZpcnN0IGFuZCB0aGVuIHBvcHVsYXRlIHlvdXIgYWN0aXZpdGllcyBieSBlaXRoZXIgYXBwbHlpbmcgdGFza3MgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IG9yIGFwcGx5aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMuIEdvIHRvIHN0ZXAgIkRldmVsb3AgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIgdG8gd29yayB3aXRoIHRoaXMgdmlldy48YnIvPjxici8+VGVhbSBBbGxvY2F0aW9uOiBDcmVhdGUgeW91ciBwcm9jZXNzIGJ5IGRlZmluaW5nIHdoaWNoIHRlYW1zIGFuZCByb2xlcyBzaGFsbCBwYXJ0aWNpcGF0ZSBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kaW5nIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgYW5kIHRhc2tzIGZyb20gdGhlcmUuICBHbyB0byBzdGVwICJEZXZlbG9wIHRoZSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlIiB0byB3b3JrIHdpdGggdGhpcyB2aWV3Ljxici8+PGJyLz5Xb3JrIFByb2R1Y3QgVXNhZ2U6IENyZWF0ZSB5b3VyIHByb2Nlc3MgYnkgZGVmaW5pbmcgd2hpY2ggd29yayBwcm9kdWN0cyBzaG91bGQgYmUgY3JlYXRlZCBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kaW5nIHRhc2tzIGFuZCByb2xlcyBmcm9tIHRoZXJlLiBHbyB0byBzdGVwICJEZXZlbG9wIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmUiIHRvIHdvcmsgd2l0aCB0aGlzIHZpZXcuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwiIAotCQl0aXRsZT0iRGV2ZWxvcCB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3Ugc3RhcnQsIGVuc3VyZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPlRvIGFjY2VzcyB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgc2VsZWN0IHRoZSAiV29yayBCcmVha2Rvd24gU3RydWN0dXJlIiB0YWIgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLjxici8+PGJyLz5SaWdodC1jbGljayB0aGUgZWxlbWVudCBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0aGVuIGNsaWNrIE5ldyBDaGlsZCAtJmd0OyBBY3Rpdml0eSB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY3JlYXRlIGEgcGhhc2Ugb3IgaXRlcmF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHlvdXIgcHJvY2Vzcy4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzIHRvIHNldC11cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci48YnIvPjxici8+UmV2aWV3IHRoZSBsaXN0IG9mIHRhc2tzIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIEluIHRoaXMgdmlldyB0YXNrcyBhcmUgc29ydGVkIGJ5IGRpc2NpcGxpbmUuIERyaWxsIGludG8gdGhlIGRpc2NpcGxpbmVzIGhpZXJhcmNoeSB0byBzZWUgd2hpY2ggdGFza3MgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uIFNlbGVjdCBhIHRhc2sgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8geW91ciBicmVha2Rvd24gc3RydWN0dXJlIGFuZCBkcmFnIGl0IG9uIHRvcCBvZiBvbmUgb2YgdGhlIGFjdGl2aXRpZXMgeW91IGp1c3QgY3JlYXRlZC4gVGhlIHRhc2sgaXMgYWRkZWQgYXMgYSBzby1jYWxsZWQgdGFzayBkZXNjcmlwdG9yIChhbiBvY2N1cnJlbmNlIG9mIGEgdGFzayBpbiBvbmUgc3BlY2lmaWMgYWN0aXZpdHkpLjxici8+PGJyLz5SZXZpZXcgdGhlIHRhc2sgZGVzY3JpcHRvcidzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkIHRoZW4gc2VsZWN0IHRoZSB0YXNrIGluIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCAiUHJvcGVydGllcyIuIFVzZSB0aGUgdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yLjxici8+PGJyLz5QZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yIGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGNoYW5nZSBwZXJmb3JtaW5nIHJvbGVzLCBjaGFuZ2UgdGhlIGlucHV0cyBhbmQgb3V0cHV0cywgZXRjLiBXaGVuIGNoYW5naW5nIHRoZSB0YXNrIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIGluIHRoZSBwcm9wZXJ0eSB3aW5kb3cgdGFicyByb2xlcyBvciB3b3JrIHByb2R1Y3RzLCB5b3UgY2FuIGVpdGhlciBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgJ0FkZC4uJyBidXR0b24gb3IgY29ubmVjdCB5b3VyIHRhc2sgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5Ljxici8+PGJyLz5JbnN0ZWFkIG9mIGRyYWdnaW5nIHRhc2sgb25lIGJ5IG9uZSB5b3UgY2FuIGFsc28gYXBwbHkgd2hvbGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBhY3Rpdml0aWVzIGZyb20gb3RoZXIgcHJvY2Vzc2VzIGF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uICBTZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgYW55IGFjdGl2aXR5IG9mIHN1Y2ggYSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgYXZhaWxhYmxlIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIGRyYWcgaXQgb24gdG9wIG9mIGFuIGFjdGl2aXR5IHdpdGhpbiB5b3VyIHByb2Nlc3MgYnJlYWtkb3duIGluIHRoZSBwcm9jZXNzIGVkaXRvci4gKEZpbmQgYSBkZXRhaWxlZCB3YWxrdGhyb3VnaCB0byBhcHBseWluZyBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIGNoZWF0IHNoZWV0ICJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiIuKTxici8+PGJyLz5Db250aW51ZSBhZGRpbmcgbW9yZSB0YXNrcywgYWN0aXZpdGllcyBvciBwYXR0ZXJucyB0byB5b3VyIGFjdGl2aXRpZXMgb3Igc3dpdGNoIHRvIHRoZSB0ZWFtIGFsbG9jYXRpb24gdGFiIHRvIGFkZCByb2xlcyBvciB0byB0aGUgd29yayBwcm9kdWN0IHVzYWdlIHRhYiB0byBhZGQgd29yayBwcm9kdWN0cy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCIgCi0JCXRpdGxlPSJEZXZlbG9wIHRoZSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3Ugc3RhcnQsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBjbGljayB0aGUgIlRlYW0gQWxsb2NhdGlvbiIgdGFiIHRvIG9wZW4gdGhlIHRlYW0gYWxsb2NhdGlvbiBlZGl0b3IuPGJyLz48YnIvPlJpZ2h0LWNsaWNrIHRoZSBlbGVtZW50IGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gY2xpY2sgTmV3IENoaWxkIC0mZ3Q7IEFjdGl2aXR5IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBwaGFzZSBvciBpdGVyYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgeW91ciBwcm9jZXNzLiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMgdG8gc2V0LXVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyBjYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyLjxici8+PGJyLz5Zb3UgY2FuIGFkZCByb2xlcyBkaXJlY3RseSB0byB5b3VyIGFjdGl2aXRpZXMgbm93LiBJbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LCByZXZpZXcgdGhlIGxpc3Qgb2Ygcm9sZXMuIEluIHRoaXMgdmlldyByb2xlcyBhcmUgb3JnYW5pemVkIGludG8gcm9sZSBzZXRzLiBEcmlsbCBpbnRvIHRoZSByb2xlIHNldHMgaGllcmFyY2h5IHRvIHNlZSB3aGljaCByb2xlcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi4gU2VsZWN0IGEgUm9sZSB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB5b3VyIGFjdGl2aXR5IGFuZCBkcmFnIGl0IG9uIHRvcCBvZiB0aGUgYWN0aXZpdHkgeW91IGNyZWF0ZWQgZWFybGllci4gVGhlIHJvbGUgaXMgYWRkZWQgYXMgYSByb2xlIGRlc2NyaXB0b3IgKGFuIG9jY3VycmVuY2Ugb2YgYSByb2xlIGluIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSkuPGJyLz48YnIvPklmIHRoZSByb2xlIHRoYXQgeW91IGp1c3QgZHJhZ2dlZCBoYXMgcmVzcG9uc2liaWxpdHkgcmVsYXRpb25zaGlwcyB0byB3b3JrIHByb2R1Y3RzIGRlZmluZWQsIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdSB0byBhZGQgYW55IG9mIHRoZSB3b3JrIHByb2R1Y3RzIHRvIHRoZSBwcm9jZXNzLiBTZWxlY3QgemVybyB0byBtYW55IHdvcmsgcHJvZHVjdHMgYW5kIHRoZW4gY2xpY2sgT0suPGJyLz48YnIvPkZvciBlYWNoIHNlbGVjdGVkIHdvcmsgcHJvZHVjdCB0aGUgbmV4dCB3aXphcmQgd2luZG93IHByb21wdHMgeW91IHRvIHNlbGVjdCB0YXNrcyB0aGF0IHByb2R1Y2UgdGhlc2Ugd29yayBwcm9kdWN0cy4gQWdhaW4sIHNlbGVjdCB6ZXJvIHRvIG1hbnkgdGFza3MgYW5kIHRoZW4gY2xpY2sgT0sgdG8gYWRkIHRoZXNlIGVsZW1lbnRzIHRvIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+UmV2aWV3IHRoZSByb2xlIGRlc2NyaXB0b3IncyBkZXRhaWxzIGluIGl0cyBwcm9wZXJ0aWVzIHZpZXcuIElmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCB0aGVuIHNlbGVjdCB0aGUgcm9sZSBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIi4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IuIFlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIGFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgY2hhbmdlIHdvcmsgcHJvZHVjdHMgdGhlIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yLCBldGMuPGJyLz48YnIvPldoZW4gY2hhbmdpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcuKAmXMgcmVsYXRpb25zaGlwcyBpbiB0aGUgcHJvcGVydHkgd2luZG93IHRhYuKAmXMgcm9sZXMgb3Igd29yayBwcm9kdWN0cywgeW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgIkFkZOKApiIgYnV0dG9uLCBvciBjb25uZWN0IHlvdXIgcm9sZSBkZXNjcmlwdG9yIHdpdGggd29yayBwcm9kdWN0cyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS48YnIvPjxici8+Q29udGludWUgYWRkaW5nIG1vcmUgcm9sZXMgdG8geW91ciBhY3Rpdml0aWVzLCBvciBzd2l0Y2ggdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSB0YWIgdG8gYWRkIHRhc2tzIG9yIHRvIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgdGFiIHRvIGFkZCB3b3JrIHByb2R1Y3RzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi08aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwiIAotCQl0aXRsZT0iRGV2ZWxvcCB0aGUgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZSIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgeW91IHN0YXJ0LCBlbnN1cmUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPkluIHRoZSBwcm9jZXNzIGVkaXRvciwgY2xpY2sgdGhlICJXb3JrIFByb2R1Y3QgVXNhZ2UiIHRhYiB0byBvcGVuIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgZWRpdG9yLjxici8+PGJyLz5SaWdodC1jbGljayB0aGUgZWxlbWVudCBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0aGVuIGNsaWNrIE5ldyBDaGlsZCAtJmd0OyBBY3Rpdml0eSB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY3JlYXRlIGEgcGhhc2Ugb3IgaXRlcmF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHlvdXIgcHJvY2Vzcy4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzIHRvIHNldC11cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci48YnIvPjxici8+UmV2aWV3IHRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gSW4gdGhpcyB2aWV3IHdvcmsgcHJvZHVjdHMgYXJlIHNvcnRlZCBieSBkb21haW4gYXMgd2VsbCBhcyB3b3JrIHByb2R1Y3QgdHlwZXMuICBEcmlsbCBpbnRvIGVpdGhlciBvZiB0aGVzZSBoaWVyYXJjaGllcyB0byBzZWUgd2hpY2ggd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi4gU2VsZWN0IGEgd29yayBwcm9kdWN0IHlvdSB3YW50IHRvIGFkZCB0byBhbiBhY3Rpdml0eSBhbmQgdGhlbiBkcmFnIGl0IG9uIHRvcCBvZiBhbiBBY3Rpdml0eSB0aGF0IHlvdSBjcmVhdGVkIGVhcmxpZXIuIFRoZSB3b3JrIHByb2R1Y3QgaXMgYWRkZWQgYXMgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciAoYW4gb2NjdXJyZW5jZSBvZiBhIHdvcmsgcHJvZHVjdCBpbiBvbmUgc3BlY2lmaWMgYWN0aXZpdHkpLjxici8+PGJyLz5BZnRlciB5b3UgaGF2ZSBhZGRlZCB0aGUgd29yayBwcm9kdWN0IHRvIHRoZSBhY3Rpdml0eSwgYSB3aXphcmQgcHJvbXB0cyB5b3UgdG8gYWRkIHRhc2tzIHRoYXQgcHJvZHVjZSB0aGlzIHdvcmsgcHJvZHVjdCB0byB0aGlzIGFjdGl2aXR5LiBTZWxlY3QgemVybyB0byBtYW55IHRhc2tzIGFuZCB0aGVuIGNsaWNrIE9LLiBUaGUgd2l6YXJkIGFkZHMgdGFzayBkZXNjcmlwdG9ycyBmb3IgZWFjaCBzZWxlY3RlZCB0YXNrIHRvIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUuPGJyLz48YnIvPlJldmlldyB0aGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9y4oCZcyBkZXRhaWxzIGluIGl0cyBwcm9wZXJ0aWVzIHZpZXcuIElmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCB0aGVuIHNlbGVjdCB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCAiUHJvcGVydGllcyIuIFVzZSB0aGUgdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IuIFlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUgYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBhZGQgZW50cnkgYW5kIGV4aXQgc3RhdGVzLCBldGMuPGJyLz48YnIvPldoZW4gY2hhbmdpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcuKAmXMgcmVsYXRpb25zaGlwcyBpbiB0aGUgcHJvcGVydHkgd2luZG93IHRhYuKAmXMgcm9sZXMgb3Igd29yayBwcm9kdWN0cywgeW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgIkFkZOKApiIgYnV0dG9uLCBvciBjb25uZWN0IHlvdXIgcm9sZSBkZXNjcmlwdG9yIHdpdGggd29yayBwcm9kdWN0cyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBBY3Rpdml0eS48YnIvPjxici8+Q29udGludWUgYnkgYWRkaW5nIG1vcmUgd29yayBwcm9kdWN0cyB0byB5b3VyIGFjdGl2aXRpZXMsIG9yIHN3aXRjaCB0byB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIHRhYiB0byBhZGQgdGFza3Mgb3IgdGhlIHRlYW0gYWxsb2NhdGlvbiB0YWIgdG8gYWRkIHJvbGVzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi08aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgCi0JCXRpdGxlPSJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVyIG9yIENhcGFiaWxpdHkgUGF0dGVybidzIEFjdGl2aXR5IgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBkbyBub3QgbmVlZCB0byBkZXZlbG9wIHlvdXIgcHJvY2VzcyBmcm9tIHNjcmF0Y2ggYnkgYWRkaW5nIGRlc2NyaXB0b3JzIG9uZSBieSBvbmUgYXMgZGVzY3JpYmVkIGluIHRoZSBsYXN0IHN0ZXBzLiAgWW91IGNhbiBhbHNvIHJldXNlIGV4aXN0aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgb3IgZXZlbiBjYXBhYmlsaXR5IHBhdHRlcm4gcGFydHMuIEdvIHRvIHRoZSBjaGVhdCBzaGVldCAiQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iIHRvIHNlZSBob3cuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJkMzA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBDb25maWd1cmF0aW9uIj4KLQk8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBjaGVhdCBzaGVldCBndWlkZXMgeW91IHRob3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEJlY2F1c2UgdGhlIG1ldGhvZCBsaWJyYXJ5IGNhbiBjb250YWluIGxhcmdlIG51bWJlcnMgb2YgZWxlbWVudHMsIHlvdSBtYXkgd2FudCB0byBsaW1pdCB5b3VyIHdvcmsgdG8gYSB1c2VyLWRlZmluZWQgc3Vic2V0IG9mIHRoZSBsaWJyYXJ5IGNhbGxlZCBtZXRob2QgY29uZmlndXJhdGlvbi4gQSBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbmVzIGEgd29ya2luZyBzZXQgb2YgcGFja2FnZXMgd2l0aGluIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IGhlbHBzIHlvdSBsaW1pdCB5b3VyIHZpZXcgdG8gYSBzdWJzZXQgb2YgYWxsIGVsZW1lbnRzLiBNZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIG5vdCBvbmx5IHVzZWQgZm9yIGNyZWF0aW5nIHByb2Nlc3NlcyAoeW91IGRyYWcgYW5kIGRyb3AgZWxlbWVudHMgaW50byBhIHByb2Nlc3MgZnJvbSBoZXJlKSwgYnV0IGFsc28gZm9yIHB1YmxpY2F0aW9uLCBiZWNhdXNlIGEgY29uZmlndXJhdGlvbiBkZWZpbmVzIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgcHVibGlzaGVkIGluIEhUTUwgYW5kIHdoaWNoIHdpbGwgbm90Ljxici8+PGJyLz5UaGUgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXJlIGRpc3BsYXllZCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBUaGUgY29uZmlndXJhdGlvbiB2aWV3IGFsbG93cyB5b3UgdG8gYnJvd3NlIHRoZSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLCBhbmQgdG8gcG9wdWxhdGUgcHJvY2Vzc2VzIGJ5IGRyYWdnaW5nIGVsZW1lbnRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpbnRvIHRoZSBwcm9jZXNzIGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIKLQkJdGl0bGU9IlByZXBhcmUgQ3JlYXRpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIGNyZWF0aW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24geW91IHNob3VsZCBkZXRlcm1pbmUgeW91ciBuZWVkcyBhbmQgZ29hbHMgZm9yIHRoZSBjb25maWd1cmF0aW9uLiBPbmUgc2NlbmFyaW8gZm9yIGNyZWF0aW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBuZXcgbWV0aG9kIHBsdWctaW4gaW4gd2hpY2ggeW91IHdhbnQgdG8gZGVmaW5lIG1ldGhvZCBlbGVtZW50cyB0aGF0IGV4dGVuZCBhbiBhbHJlYWR5IGV4aXN0aW5nIHBsdWctaW4uIEluIHRoaXMgY2FzZSwgeW91IG5lZWQgdG8gY3JlYXRlIGEgY29uZmlndXJhdGlvbiB0aGF0IGluY2x1ZGVzIHlvdXIgbmV3IHBsdWctaW4gYXMgd2VsbCBhcyB0aGUgZXhpc3RpbmcgcGx1Zy1pbi4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluIGZpcnN0IHRoZW4gZ28gdGhlIGNoZWF0ICJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iLjxici8+PGJyLz5Bbm90aGVyIHNjZW5hcmlvIGZvciBjcmVhdGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIHRoYXQgeW91IHdhbnQgdG8gZGVmaW5lIGEgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIHB1YmxpY2F0aW9uIHB1cnBvc2VzIG9uIGV4aXN0aW5nIHBsdWctaW5zLCBkZWZpbmluZyB3aGljaCBlbGVtZW50cyB0byBwdWJsaXNoLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgc2V0IG9mIGNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBkb2VzIG5vdCBtZWV0IHlvdXIgbmVlZHMsIHlvdSBjb3VsZCBub3cgZWl0aGVyIGN1c3RvbWl6ZSBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uIG9yIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IGNvbmZpZ3VyYXRpb24gZnJvbSBzY3JhdGNoLjxici8+PGJyLz5JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gZ28gdG8gdGhlIG5leHQgc3RlcCAiQ3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gYnkgY29weWluZyBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uIi48YnIvPjxici8+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIHNraXAgdG8gc3RlcCAiQ3JlYXRlIGEgbmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaCIuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gYnkgQ29weWluZyBhbiBFeGlzdGluZyBDb25maWd1cmF0aW9uIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkV4cGFuZCB0aGUgIkNvbmZpZ3VyYXRpb25zIiBwYWNrYWdlIGF0IHRoZSBlbmQgb2YgdGhlIExpYnJhcnkgdmlldy4gUmlnaHQgY2xpY2sgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHlvdSB3YW50IHRvIGNvcHksIGFuZCB0aGVuIHNlbGVjdCAiQ29weSIgZnJvbSB0aGUgbWVudS4gUmlnaHQgY2xpY2sgdGhlIGNvbmZpZ3VyYXRpb25zIHBhY2thZ2UgYW5kIHRoZW4gc2VsZWN0ICJQYXN0ZSIgZnJvbSB0aGUgbWVudS48YnIvPjxici8+QSBkaWFsb2cgcHJvbXB0cyB5b3VyIGZvciBhIG5ldyBjb25maWd1cmF0aW9uIG5hbWUuIFByb3ZpZGUgYSBuYW1lIHRoYXQgcmVmbGVjdHMgdGhlIGNoYXJhY3RlciBvciBwdXJwb3NlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4gVG8gY29udGludWUgc3BlY2lmeWluZyB5b3VyIG1ldGhvZCBjb25maWd1cmF0aW9uLCBza2lwIHRvIHN0ZXAgIlNwZWNpZnkgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJDcmVhdGUgYSBuZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbSBTY3JhdGNoIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPlJpZ2h0IGNsaWNrIHRoZSBjb25maWd1cmF0aW9ucyBwYWNrYWdlIGFuZCBzZWxlY3QgTmV3IC0mZ3Q7IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20gdGhlIG1lbnUuIFRoZSBuZXcgY29uZmlndXJhdGlvbiBpcyBhZGRlZCB0byB0aGUgbGlzdCBhbmQgaXRzIGVkaXRvciBpcyBvcGVuZWQuIENoYW5nZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCBpdHMgY2hhcmFjdGVyIG9yIHB1cnBvc2UgYW5kIHRoZW4gY29udGludWUgdG8gdGhlIG5leHQgc3RlcCwgIlNwZWNpZnkgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJTcGVjaWZ5IHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q2xpY2sgdGhlICJQbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbiIgdGFiIGluIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBlZGl0b3IgdG8gZ28gdG8gdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiBmb3JtLiBUaGlzIGZvcm0gZGlzcGxheXMgYSBsaXN0IG9mIGFsbCBtZXRob2QgcGx1Zy1pbnMgYW5kIGZvciBldmVyeSBwbHVnLWluIGFsbCBvZiBpdHMgY29udGVudCBwYWNrYWdlcyBhcyB3ZWxsIGFzIGFsbCBwcm9jZXNzZXMuIFVzZSB0aGUgY2hlY2sgYm94ZXMgdG8gYWRkIG9yIHJlbW92ZSBwbHVnLWlucywgcGFja2FnZXMsIGFuZCBwcm9jZXNzZXMgdG8gb3IgZnJvbSB5b3VyIGNvbmZpZ3VyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIAotCQl0aXRsZT0iUHJldmlldyB5b3VyIENvbmZpZ3VyYXRpb24gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiBpbW1lZGlhdGVseSBwcmV2aWV3IHlvdXIgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gUmVmcmVzaCB5b3VyIGNvbmZpZ3VyYXRpb24gdmlldyBieSBjbGlja2luZyB0aGUgdmlldydzICJSZWZyZXNoIEFsbCIgaWNvbi4gRHJpbGwgaW50byB0aGUgdHJlZSBzdHJ1Y3R1cmVzIGRpc3BsYXllZCBieSB0aGUgY29uZmlndXJhdGlvbiB2aWV3IHRvIHNlZSBlbGVtZW50cyBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCIgCi0JCXRpdGxlPSJEZWZpbmUgTmF2aWdhdGlvbiBWaWV3cyBmb3IgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5BIG5hdmlnYXRpb24gdmlldyBpcyBhIG5hdmlnYXRpb24gdHJlZSBicm93c2VyIGZvciBhIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVkIGFzIEhUTUwuIEV2ZXJ5IHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGNhbiBoYXZlIHNldmVyYWwgdmlld3MgdGhhdCBhcmUgZGlzcGxheWVkIGFzIHN0YWNrZWQgdHJlZSBicm93c2VyIHRhYnMuIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG5hdmlnYXRpb24gdmlldyBpcyBkZWZpbmVkIGFzIGN1c3RvbSBjYXRlZ29yaWVzLiBBIGN1c3RvbSBjYXRlZ29yeSBpcyBhIHVzZXItZGVmaW5lZCBjb2xsZWN0aW9uIG9mIGNhdGVnb3JpemluZyBlbGVtZW50cywgd2hpY2ggbWF5IGl0c2VsZiBjb250YWluIHN1YmNhdGVnb3JpZXMuIFRoaXMgc3RydWN0dXJlIGlzIHdoYXQgZGVmaW5lcyB0aGUgc3RydWN0dXJlIGZvciB0aGUgdHJlZSBicm93c2VyLiAoRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQ3VzdG9tIENhdGVnb3JpZXMsIHNlZSB0aGUgb25saW5lIGhlbHAuKSBUaGVyZWZvcmUsIHRvIGRlZmluZSBhIG5hdmlnYXRpb24gdmlldyB5b3Ugc2VsZWN0IGEgY3VzdG9tIGNhdGVnb3J5IGFuZCBhbGwgb2YgdGhpcyBjYXRlZ29yaWVzIHN1Yi1lbGVtZW50cyBtYWtlIHVwIHRoZSB0cmVlIGJyb3dzZXIgc3RydWN0dXJlIGRpc3BsYXllZCBieSB0aGUgdmlldy48YnIvPjxici8+VG8gYWRkIG5hdmlnYXRpb24gdmlld3MgdG8geW91ciBjb25maWd1cmF0aW9uIGNsaWNrIHRoZSAiVmlld3MiIHRhYiBpbiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IuIFVzZSB0aGUgIkFkZCBWaWV3Li4uIiBhbmQgIlJlbW92ZSBWaWV3IiBidXR0b25zIHRvIHNlbGVjdCB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgeW91IHdhbnQgdG8gYWRkIGFuZCByZW1vdmUgYXMgYSB2aWV3LCByZXNwZWN0aXZlbHkuIENsaWNrIHRoZSB0YWIgb2YgdGhlIHZpZXdzIHlvdSBqdXN0IGFkZGVkIHRvIHByZXZpZXcuPGJyLz48YnIvPlRvIHNlbGVjdCBhIHZpZXcgdG8gZGlzcGxheSBhcyB0aGUgc3RhcnQtdXAgdmlldywgY2xpY2sgdGhlICJNYWtlIERlZmF1bHQiIGJ1dHRvbi4gVGhlIHN0YXJ0LXVwIHZpZXcgaXMgdGhlIGZpcnN0IHZpZXcgc2hvd24gd2hlbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCB3aGVuIHN0YXJ0aW5nIHVwLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2RwbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0M2FiMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiAtLT4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPkJlY2F1c2UgdGhlIHBsdWctaW5zIHNoaXBwZWQgd2l0aCB0aGUgbWV0aG9kIGxpYnJhcnkgYXJlIGxvY2tlZCBhbmQgcmVhZC1vbmx5LCBhbGwgeW91ciBjaGFuZ2VzLCBhZGRpdGlvbnMsIGFuZCBleHRlbnNpb25zIHRvIGV4aXN0aW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaGF2ZSB0byBiZSBwbGFjZWQgaW4geW91ciBvd24gbWV0aG9kIHBsdWctaW5zLiBIb3dldmVyLCB5b3UgY2FuIHVzZSB2YXJpb3VzIGNhcGFiaWxpdGllcyB0byBsb2dpY2FsbHkgbWVyZ2UgeW91ciBwbHVnLWluIGNvbnRlbnRzIGludG8gb3RoZXIgcGx1Zy1pbnMgYWxsb3dpbmcgeW91LCBhcyBhIHJlc3VsdCwgdG8gcHVibGlzaCBleHRlbmRlZCBtZXRob2RzIGFuZCBwcm9jZXNzZXMgdGhhdCBzZWFtbGVzc2x5IGluY29ycG9yYXRlIHlvdXIgbWV0aG9kIGVsZW1lbnRzLiBUbyBjcmVhdGUgeW91ciBvd24gbWV0aG9kIHBsdWctaW5zIGZvbGxvdyB0aGVzZSBzdGVwcy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iVXNlIHRoZSBNZXRob2QgUGx1Zy1pbiBXaXphcmQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIG5ldyBtZXRob2QgcGx1Zy1pbiB1c2luZyB0aGUgIk5ldyBNZXRob2QgUGx1Zy1pbiIgd2l6YXJkLiBUbyBvcGVuIHRoZSB3aXphcmQgc2VsZWN0IEZpbGUgLSZndDsgTmV3IC0mZ3Q7IE1ldGhvZCBQbHVnLWluLiBTcGVjaWZ5IGF0IGxlYXN0IHRoZSBuYW1lIGZvciB5b3VyIG5ldyBtZXRob2QgcGx1Zy1pbiBhbmQgc2VsZWN0IHRoZSBjaGVjayBib3ggZm9yIGFueSBvdGhlciBtZXRob2QgcGx1Zy1pbnMgd2hpY2ggY29udGVudCB5b3Ugd2lzaCB0byBleHRlbmQgb3IgcmV1c2UuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iT3BlbiB0aGUgTWV0aG9kIFBsdWdpbiBFZGl0b3IiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgdGhlIHBsdWctaW4sIHlvdSBjYW4gbWFrZSBjaGFuZ2VzIHRvIGl0cyBzcGVjaWZpY2F0aW9ucyBpbiB0aGUgbWV0aG9kIHBsdWctaW4gZWRpdG9yLiBJbiB0aGUgbGlicmFyeSB2aWV3LCBkb3VibGUgY2xpY2sgdGhlIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IGp1c3QgY3JlYXRlZCB0byBvcGVuIHRoZSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iU3BlY2lmeSBWZXJzaW9uIEluZm9ybWF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5JbiBhZGRpdGlvbiB0byB0aGUgaW5mb3JtYXRpb24gYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIG1ldGhvZCBwbHVnLWluIHdpemFyZCwgeW91IGNhbiBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHBsdWctaW4uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iU2VsZWN0IHRoZSBEZWZhdWx0IENvcHlyaWdodCBEZWZpbml0aW9uIEZpbGUiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgIlNlbGVjdCIgYnV0dG9uIHRvIHNwZWNpZnkgd2hpY2ggcGFnZSBvZiB0aGUgdHlwZSAiU3VwcG9ydGluZyBNYXRlcmlhbCIgY29udGFpbnMgdGhlIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBmb3IgZWxlbWVudHMgb2YgdGhpcyBwbHVnLWluLiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV2ZXJ5IHBhZ2UgdGhhdCBnZXRzIHB1Ymxpc2hlZCBiYXNlZCBvbiBhbiBlbGVtZW50IGZyb20gdGhpcyBwbHVnLWluLiAgTm90ZSwgdGhhdCBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cyBjYW4gb3ZlcnJpZGUgdGhpcyBzdGFuZGFyZCBzZWxlY3Rpb24gd2l0aCB0aGUgY29weXJpZ2h0IGZpZWxkIGluIHRoZWlyIG93biBlZGl0b3JzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTY1MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJOYXZpZ2F0ZSBNZXRob2QgQ29udGVudCI+Ci0JPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGVyZSBhcmUgdHdvIHdheXMgdG8gbmF2aWdhdGUgbWV0aG9kIGNvbnRlbnQ6IGJ5IHVzaW5nIHRoZSBwaHlzaWNhbCBsaWJyYXJ5IHN0cnVjdHVyZSBpbiB0aGUgbGlicmFyeSB2aWV3IG9yIGJ5IHVzaW5nIHRoZSBsb2dpY2FsIGNhdGVnb3JpemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuICBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIGJvdGggc2NlbmFyaW9zLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgdGl0bGU9IlN3aXRjaCB0byBBdXRob3JpbmcgUGVyc3BlY3RpdmUiIHNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiB3b3JrIHdpdGggdHdvIHBlcnNwZWN0aXZlczogdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSBhbmQgdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlLiBBIHBlcnNwZWN0aXZlIGRlZmluZXMgYSBzZXQgb2Ygdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBiZSBhdmFpbGFibGUgZm9yIHNwZWNpZmljIHRhc2tzLiBUaGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIHByb3ZpZGVzIHZpZXdzIGFuZCBmdW5jdGlvbnMgdG8gbmF2aWdhdGUgYW5kIGF1dGhvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLCB3aGlsZSB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUgYWxsb3dzIHlvdSB0byBwcmV2aWV3IGFuZCBicm93c2UgYSBtZXRob2QgY29uZmlndXJhdGlvbi4gVGhpcyBjaGVhdCBzaGVldCByZWZlcnMgdG8gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS48YnIvPjxici8+Q2xpY2sgdGhlICJPcGVuIFBlcnNwZWN0aXZlIiBidXR0b24gb3IgdGhlIFdpbmRvdy0mZ3Q7T3BlbiBQZXJzcGVjdGl2ZSBtZW51IGFuZCB0aGVuIHNlbGVjdCAiQXV0aG9yaW5nIiB0byBzd2l0Y2ggdG8gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbCIgdGl0bGU9Ik9wZW4gdGhlIExpYnJhcnkgVmlldyIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3UgZG8gbm90IHNlZSBhIHRyZWUtYnJvd3NlciB2aWV3IGxhYmVsZWQgIkxpYnJhcnkiIGluIHlvdXIgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIGNsaWNrIHRoZSBXaW5kb3ctJmd0O1Jlc2V0IFBlcnNwZWN0aXZlIG1lbnUuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiIHRpdGxlPSJEcmlsbCBpbnRvIE1ldGhvZCBDb250ZW50IFBhY2thZ2VzIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5XaXRoaW4gdGhlIGxpYnJhcnkgdmlldyB0cmVlLWJyb3dzZXIsIGV4cGFuZCBhIHBsdWctaW4gYW5kIGRyaWxsIGludG8gdGhlIHBhY2thZ2VzICJNZXRob2QgQ29udGVudCItJmd0OyJDb250ZW50IFBhY2thZ2VzIiBhbmQgaXRzIHN1Yi1wYWNrYWdlcy4gRXhhbWluZSB0aGUgY29udGVudHMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJSZXZpZXcgQ29udGVudCBQYWNrYWdlcyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+RXZlcnkgY29udGVudCBwYWNrYWdlIGNvbnRhaW5zIGRpZmZlcmVudCB0eXBlcyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyB3aGljaCBhcmUgc29ydGVkIGludG8gZGlmZmVyZW50IGNhdGVnb3JpZXMuIFRoZSBjYXRlZ29yaWVzIGFyZSByb2xlcywgdGFza3MsIHdvcmsgcHJvZHVjdHMsIGFuZCBndWlkYW5jZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sIiB0aXRsZT0iT3BlbiBhIE1ldGhvZCBDb250ZW50IEVsZW1lbnQgRWRpdG9yIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgYSBtZXRob2QgZWxlbWVudCwgc3VjaCBhcyBhIHRhc2ssIGFuZCBkb3VibGUgY2xpY2sgdG8gb3BlbiBpdHMgZWRpdG9yLjxici8+PGJyLz5UaGUgZWRpdG9yIHByb3ZpZGVzIHRhYnMgYW5kIGZvcm1zIHRvIG9yZ2FuaXplIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIHRoZSBlbGVtZW50LiAgU2VsZWN0IHRoZSBkaWZmZXJlbnQgdGFicyBhbmQgdGhlIGJvdHRvbSBvZiBldmVyeSBlZGl0b3IgYW5kIHJldmlldyB0aGUgZGlmZmVyZW50IGZvcm1zIGRpc3BsYXllZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCIgdGl0bGU9IkV4YW1pbmUgQ2F0ZWdvcmllcyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2l0aGluIHRoZSBsaWJyYXJ5IHZpZXcgdHJlZS1icm93c2VyLCBleHBhbmQgdGhlIHBhY2thZ2VzIHRvIHRoZSBzYW1lIGxldmVsIGFzIGNvbnRlbnQgcGFja2FnZXMgdW50aWwgeW91IGZpbmQgdGhlICJDdXN0b20gQ2F0ZWdvcmllcyIgYW5kICJTdGFuZGFyZCBDYXRlZ29yaWVzIiBwYWNrYWdlcy4gRHJpbGwgaW50byB0aGVzZSBwYWNrYWdlcyBhbmQgdGhlbiBleGFtaW5lIHRoZWlyIGNvbnRlbnRzLjxici8+PGJyLz5FdmVyeSBjYXRlZ29yeSBsaXN0ZWQgaGVyZSBpcyBhIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsLiAgT3BlbiB0aGUgZGVzY3JpcHRpb24gb2YgYSBjYXRlZ29yeSBzdWNoIGFzIGEgZGlzY2lwbGluZSBvciBhIGRvbWFpbiBieSBkb3VibGUgY2xpY2tpbmcgdGhlIGNhdGVnb3J5IHdoaWNoIG9wZW5zIHRoZSBjYXRlZ29yeSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIHRpdGxlPSJTZWxlY3QgYSBDb25maWd1cmF0aW9uIGZvciB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IiBza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlY2F1c2UgdGhlIG1ldGhvZCBsaWJyYXJ5IGNhbiBjb250YWluIGxhcmdlIG51bWJlcnMgb2YgZWxlbWVudHMsIHlvdSBtYXkgd2FudCB0byBsaW1pdCB5b3VyIHdvcmsgdG8gYSB1c2VyLWRlZmluZWQgc3Vic2V0IG9mIHRoZSBsaWJyYXJ5IGNhbGxlZCBtZXRob2QgY29uZmlndXJhdGlvbi4gQSBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB3b3JraW5nIHNldCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgaGVscHMgeW91IGxpbWl0IHlvdXIgdmlldyB0byBhIHN1YnNldCBvZiBhbGwgZWxlbWVudHMuIFRoZSBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhcmUgZGlzcGxheWVkIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuPGJyLz48YnIvPlRoZSBjb25maWd1cmF0aW9uIHZpZXcgZGlzcGxheXMgY2F0ZWdvcml6ZWQgbWV0aG9kIGVsZW1lbnRzIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBoYXMgYmVlbiBzZWxlY3RlZCBpbiB0aGUgdW5sYWJlbGVkIGNvbWJvIGJveCBpbiB0aGUgdG9vbCBiYXIuICBVc2UgdGhpcyBjb21ibyBib3ggdG8gc2VsZWN0IGEgY29uZmlndXJhdGlvbi48YnIvPjxici8+QWZ0ZXIgc2VsZWN0aW5nIGEgY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGlzIChyZS0pcG9wdWxhdGVkIHdpdGggbmV3IHRyZWVzIHNob3dpbmcgZWxlbWVudHMgZnJvbSB0aGF0IGNvbmZpZ3VyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRyaWxsIGludG8gQ2F0ZWdvcmllcyBpbiBDb25maWd1cmF0aW9uIFZpZXciIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkRyaWxsIGludG8gdGhlIGNvbmZpZ3VyYXRpb24gdmlldydzIGNhdGVnb3JpZXMgZm9sZGVycyBhbmQgZXhhbWluZSB0aGUgZWxlbWVudHMgbGlzdGVkIHRoZXJlLjxici8+PGJyLz5BcyBpbiB0aGUgbGlicmFyeSB2aWV3IHlvdSBjYW4gb3BlbiBlbGVtZW50cyBsaXN0ZWQgaGVyZSB2aWEgYSBkb3VibGUtY2xpY2suIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgY29tcHV0ZXMgc28tY2FsbGVkIGNvbnRyaWJ1dGlvbnMgYW5kIHJlcGxhY2VtZW50cyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyAoc2VlICJWYXJpYWJpbGl0eSBPdmVydmlldyIgaW4gdGhlIG9ubGluZSBoZWxwIGZvciBtb3JlIGRldGFpbHMpLiBJZiBhbiBlbGVtZW50IGhhcyBjb250cmlidXRpbmcgZWxlbWVudHMgdGhlbiBhIGRvdWJsZSBjbGljayB3aWxsIHNob3cgeW91IGEgZGlhbG9nIHdpdGggYWxsIHRoZSBlbGVtZW50cyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBjb250cmlidXRpb24uICBTZWxlY3Qgb25lIGVsZW1lbnQgdG8gb3BlbiBpdHMgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj4KLQkJPGRlc2NyaXB0aW9uLz4KLQk8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL3JlcGxhY2VleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1ZmI2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJSZXBsYWNlIEV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZSkiPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHRhaWxvciBleGlzdGluZyBtZXRob2QgZWxlbWVudHMsIHN1Y2ggYXMgYW4gZWxlbWVudCB0aGF0IGlzIGRlZmluZWQgaW4gYSBsb2NrZWQgcGx1Zy1pbiwgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgaXQsIGJ1dCBieSByZXBsYWNpbmcgaXQgd2l0aCBvbmUgb2YgeW91ciBvd24gZWxlbWVudHMgZGVmaW5lZCBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbi4gVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgc3VjaCBhIHJlcGxhY2VtZW50LiAgU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJWYXJpYWJpbGl0eSBPdmVydmlldyIgZm9yIGFuIGludHJvZHVjdGlvbiBvbiB2YXJpYWJpbGl0eSBhbmQgcmVwbGFjZW1lbnRzLjxici8+PGJyLz5SZXBsYWNlbWVudHMgY2FuIGFsc28gYmUgYXBwbGllZCB3aXRoaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4gYmV0d2VlbiBtZXRob2QgY29udGVudCBlbGVtZW50cyBmcm9tIGRpZmZlcmVudCBjb250ZW50IHBhY2thZ2VzLiAgVGhpcyBpcyB1c2VmdWwgaW4gdGhlIGNhc2Ugd2hlcmUgeW91IHdhbnQgdG8gcHJvdmlkZSBhbHRlcm5hdGl2ZSBjb250ZW50IHRoYXQgY2FuIGJlIHNlbGVjdGVkIHVzaW5nIGRpZmZlcmVudCBtZXRob2QgY29uZmlndXJhdGlvbnMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlBsYW4geW91ciBSZXBsYWNlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2hlbiBkZWZpbmluZyB0aGUgcmVwbGFjZW1lbnQgb2YgYW4gZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnQgeW91IG5lZWQgdG8ga25vdyB3aGVyZSB0aGUgZXhpc3RpbmcgZWxlbWVudCB0aGF0IHlvdSB3YW50IHRvIHJlcGxhY2UgaXMgcGh5c2ljYWxseSBsb2NhdGVkIHdpdGhpbiBpdHMgbWV0aG9kIHBsdWctaW4uIFlvdSBhbHNvIG5lZWQgdG8gZGVjaWRlIHdlcmUgdG8gY3JlYXRlIGFuZCBwbGFjZSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuIFR5cGljYWxseSB5b3UgY3JlYXRlIHRoZSByZXBsYWNpbmcgZWxlbWVudCB3aXRoaW4gYSBzcGVjaWZpYyBjb250ZW50IHBhY2thZ2UgaW4geW91ciBvd24gbWV0aG9kIHBsdWctaW4uIEZpbmFsbHksIHlvdSBuZWVkIHRvIGtub3cgd2hhdCB0aGUgcmVwbGFjaW5nIGVsZW1lbnQncyBjb250ZW50IGlzLCBiZWNhdXNlIGFsbCBvZiB0aGUgcmVwbGFjZWQgZWxlbWVudOKAmXMgY29udGVudCAoaS5lLiBpdHMgdGV4dCBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgaXRzIHJlbGF0aW9uc2hpcHMgdGhhdCBwb2ludCB0byBvdGhlciBlbGVtZW50cykgd2lsbCBiZSByZW1vdmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIKLQkJdGl0bGU9IkNyZWF0ZSBhIFJlcGxhY2luZyBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgaW4geW91ciBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBpbnRlbmQgdG8gYmUgdGhlIHJlcGxhY2luZyBjb250ZW50IGVsZW1lbnQuIFJlbWVtYmVyLCB5b3UgbXVzdCBwcm92aWRlIHRoaXMgZWxlbWVudCB3aXRoIGl0cyBvd24gY29udGVudCBiZWNhdXNlIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSByZXBsYWNlZCBlbGVtZW50IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBlbXB0eSBmaWVsZHMsIGlmIHlvdSBkbyBub3QgcHJvdmlkZSBuZXcgZGVzY3JpcHRpb25zLjxici8+PGJyLz5HbyB0byBjaGVhdCBzaGVldCAiQWRkIGEgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZSIgdG8gYmUgZ3VpZGVkIHRocm91Z2ggdGhlc2Ugc3RlcHMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sIiAKLQkJdGl0bGU9IlNwZWNpZnkgdGhlIFJlcGxhY2VtZW50IFJlbGF0aW9uc2hpcCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+R28gdG8gdGhlICJDb250ZW50IFZhcmlhYmlsaXR5IiBzZWN0aW9uIG9mIHRoZSBlbGVtZW50cyBkZXNjcmlwdGlvbiB0YWIuIFNlbGVjdCAiUmVwbGFjZXMiIGZyb20gdGhlIGNvbWJvIGJveC4gQ2xpY2sgdGhlICJTZWxlY3QuLi4iIGJ1dHRvbiBvZiB0aGUgYmFzZSByb2xlIGZpZWxkIGFuZCBzZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCB5b3VyIG5ldyBlbGVtZW50IHJlcGxhY2VzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIAotCQl0aXRsZT0iUmV2aWV3IHlvdXIgUmVwbGFjZWQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VG8gcmV2aWV3IHlvdXIgcmVwbGFjZWQgZWxlbWVudCwgc2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBjb21ibyBib3ggaW4gdGhlIHRvb2wgYmFyIHRoYXQgY29udGFpbnMgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgY29udGVudCBwYWNrYWdlcyBvZiBib3RoIGVsZW1lbnRzIHBhcnRpY2lwYXRpbmcgaW4geW91ciByZXBsYWNlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRoZSBjb25maWd1cmF0aW9uIG11c3QgY29udGFpbiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgYXMgd2VsbCBhcyB0aGUgcmVwbGFjZWQgYmFzZSBlbGVtZW50Ljxici8+PGJyLz5Td2l0Y2ggdG8gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlLiBGaW5kIGFuZCBzZWxlY3QgdGhlIHJlcGxhY2luZyBlbGVtZW50IChpLmUuIHlvdXIgbmV3IGVsZW1lbnQpIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFRoZSBjb250ZW50IHdpbmRvdyBkaXNwbGF5cyB0aGUgcmVzdWx0cyBvZiB0aGUgcmVwbGFjZW1lbnQuIFJldmlldyBhbiBlbGVtZW50IHRoYXQgcmVmZXJyZWQgdG8gdGhlIHJlcGxhY2VkIGVsZW1lbnQuIEluIG90aGVyIHdvcmRzLCBpZiB5b3UgcmVwbGFjZWQgYW4gYXJ0aWZhY3QsIGZpbmQgYSB0YXNrIHRoYXQgdXNlZCB0aGlzIGFydGlmYWN0IGFzIGFuIGlucHV0IG9yIG91dHB1dC4gTWFrZSBzdXJlIHRoaXMgZWxlbWVudCBub3cgcmVmZXJzIHRvIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjcyNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL3RhaWxvcmV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJUYWlsb3IgRXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlKSBVc2luZyBDb250cmlidXRpb24iPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHRhaWxvciBleGlzdGluZyBtZXRob2QgZWxlbWVudHMsIHN1Y2ggYXMgYW4gZWxlbWVudCB0aGF0IGlzIGRlZmluZWQgaW4gYSBsb2NrZWQgbWV0aG9kIHBsdWctaW4sIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIGl0LCBidXQgYnkgY29udHJpYnV0aW5nIG5ldyBjb250ZW50IG9yIHJlbGF0aW9uc2hpcHMgdG8gaXQgZnJvbSBhbiBlbGVtZW50IGRlZmluZWQgaW4gb25lIG9mIHlvdXIgb3duIG1ldGhvZCBwbHVnLWlucy4gVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgc3VjaCBhIGNvbnRyaWJ1dGlvbi4gIFNlZSB0aGUgb25saW5lIGhlbHAgc2VjdGlvbiAiVmFyaWFiaWxpdHkgT3ZlcnZpZXciIGZvciBhbiBpbnRyb2R1Y3Rpb24gb24gdmFyaWFiaWxpdHkgYW5kIGNvbnRyaWJ1dGlvbnMuPGJyLz48YnIvPkNvbnRyaWJ1dGlvbnMgY2FuIGFsc28gYmUgYXBwbGllZCB3aXRoaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4gYmV0d2VlbiBlbGVtZW50cyBmcm9tIGRpZmZlcmVudCBjb250ZW50IHBhY2thZ2VzLiBUaGlzIGlzIHVzZWZ1bCBpbiB0aGUgZXZlbnQgeW91IHdhbnQgdG8gYnVpbGQgdXAgeW91ciBjb250ZW50IGVsZW1lbnRzIGluIGxheWVycyBvZiBjb21wbGV4aXR5IGJ5IGdyYWR1YWxseSBhZGRpbmcgbW9yZSBhbmQgbW9yZSBjb250ZW50IHZpYSBjb250cmlidXRpb24uICBUaGUgcmVzcGVjdGl2ZSBsZXZlbHMgb2YgY29udHJpYnV0aW9uIGNhbiB0aGVuIGJlIHNlbGVjdGVkIHdpdGhpbiBtZXRob2QgY29uZmlndXJhdGlvbnMgdGhhdCBhbGxvdyB5b3UgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZSBjb250ZW50IHBhY2thZ2VzIHdpdGggdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iUGxhbiB5b3VyIENvbnRyaWJ1dGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIHlvdSBjYW4gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGFuIGV4aXN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgeW91IG5lZWQgdG8ga25vdyB3aGVyZSB0aGlzIGVsZW1lbnQgaXMgbG9jYXRlZCB3aXRoaW4gaXRzIG1ldGhvZCBwbHVnLWluLiBZb3UgYWxzbyBuZWVkIHRvIGRlY2lkZSB3aGVyZSB0byBjcmVhdGUgYW5kIHBsYWNlIHRoZSBjb250cmlidXRpbmcgZWxlbWVudC4gVHlwaWNhbGx5LCB5b3UgY3JlYXRlIHRoaXMgZWxlbWVudCBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbiwgaW4gYSBzcGVjaWZpYyBjb250ZW50IHBhY2thZ2UuIEZpbmFsbHksIHlvdSBuZWVkIHRvIGtub3cgd2hhdCBpdCBpcyB5b3UgYWN0dWFsbHkgd2FudCB0byBjb250cmlidXRlLiBUaGlzIGNvdWxkIGJlIGFkZGl0aW9uYWwgdGV4dCBmb3IgdGhlIGZvcm0gZmllbGRzLCBuZXcgcmVsYXRpb25zaGlwcyB0byBvdGhlciBlbGVtZW50cywgb3IgbmV3IGNhdGVnb3JpemF0aW9ucy4gKFNlZSB0aGUgb25saW5lIGhlbHAgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGVzZSBmaWVsZHMgYW5kIHJlbGF0aW9uc2hpcHMuKTwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIKLQkJdGl0bGU9IkNyZWF0ZSBhIENvbnRyaWJ1dGluZyBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIGNvbnRlbnQgZWxlbWVudCBpbiB5b3VyIG1ldGhvZCBwbHVnLWluIHRoYXQgcHJvdmlkZXMgY29udHJpYnV0aW9ucyB0byB0aGUgY29udGVudCBlbGVtZW50IHRoYXQgeW91IHdpc2ggdG8gdGFpbG9yLiAgR28gdG8gdGhlIGNoZWF0IHNoZWV0ICJBZGQgYSBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlIiB0byBiZSBndWlkZWQgdGhyb3VnaCB0aGVzZSBzdGVwcy48YnIvPjxici8+QWRkIHlvdXIgY29udHJpYnV0aW9ucyBzdWNoIGFzIHJldmlzZWQgdGV4dCBmb3IgZm9ybSBmaWVsZHMgb3IgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIHRvIHlvdXIgbWV0aG9kIGNvbnRlbnQgZWxlbWVudC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sIiAKLQkJdGl0bGU9IlNwZWNpZnkgdGhlIENvbnRyaWJ1dGlvbiBSZWxhdGlvbnNoaXAiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkdvIHRvIHRoZSAiQ29udGVudCBWYXJpYWJpbGl0eSIgc2VjdGlvbiBvZiB0aGUgZWxlbWVudHMgZGVzY3JpcHRpb24gdGFiLiBTZWxlY3QgIkNvbnRyaWJ1dGVzIiBmcm9tIHRoZSBjb21ibyBib3guIENsaWNrIHRoZSAiU2VsZWN0Li4uIiBidXR0b24gb2YgdGhlIGJhc2Ugcm9sZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCB5b3Ugd2FudCB5b3VyIG5ldyBlbGVtZW50IHRvIGNvbnRyaWJ1dGUgdG8uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgCi0JCXRpdGxlPSJSZXZpZXcgeW91ciBDb250cmlidXRpb25zIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5UbyByZXZpZXcgeW91ciBjb250cmlidXRpb25zIHNlbGVjdCAob3IgY3JlYXRlIGZpcnN0IGFuZCB0aGVuIHNlbGVjdCkgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbWJvIGJveCBpbiB0aGUgdG9vbCBiYXIgdGhhdCBjb250YWlucyB0aGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIG9mIGJvdGggb2YgdGhlIGVsZW1lbnRzIHBhcnRpY2lwYXRpbmcgaW4geW91ciBjb250cmlidXRpb24uICBJbiBvdGhlciB3b3JkcyB0aGUgY29uZmlndXJhdGlvbiBoYXMgdG8gY29udGFpbiB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQgYXMgd2VsbCBhcyB0aGUgYmFzZSBlbGVtZW50Ljxici8+PGJyLz5Td2l0Y2ggdG8gdGhlICJCcm93c2luZyBQZXJzcGVjdGl2ZSIuIEZpbmQgYW5kIHNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IChpLmUuIHRoZSBlbGVtZW50IHlvdSBjb250cmlidXRlZCB0bykgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gVGhlIGNvbnRlbnQgd2luZG93IGRpc3BsYXlzIHRoZSByZXN1bHRzIG9mIHRoZSBjb250cmlidXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+CQotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb2RlX21hbmFnZW1lbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvZGVfbWFuYWdlbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjMyYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvZGVfbWFuYWdlbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHRvYyBsYWJlbD0iU3VwcG9ydCBmb3IgY29kZSBtYW5hZ2VtZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjb2RlX21hbmFnZW1lbnRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBDVlMiIGhyZWY9Imh0bWwvaGVscC9jbV9jdnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBvcnQgZm9yIFJhdGlvbmFsIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC9oZWxwL2NtX3JhdGlvbmFsY2MuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBSYXRpb25hbCBDQ1JDIiBocmVmPSJodG1sL2hlbHAvY21fY2NyYy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29uY2VwdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTg4MWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNvbmNlcHRzIiBsaW5rX3RvPSJtYWluLnhtbCNjb25jZXB0c19pZCI+Ci0gICA8dG9waWMgbGFiZWw9Ik92ZXJ2aWV3IG9mIEVQRiBDb21wb3NlciIgaHJlZj0iaHRtbC9vdmVydmlldy9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L21ldGhvZF9jb250ZW50X2F1dGhvcmluZ19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L3Byb2Nlc3NfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L21ldGhvZF9jb25maWd1cmF0aW9uc19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlVzZXIgcm9sZXMgYW5kIHJvbGUgc3BlY2lmaWMgdGFza3MiIGhyZWY9Imh0bWwvaGVscC91c2VyX3JvbGVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9tZXRob2RfY29udGVudC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19TZWFyY2gueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX1NlYXJjaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0N2I4MDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX1NlYXJjaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgIGlkPSJvcGVuX3NlYXJjaF9kaWFsb2dfYWN0aW9uX2NvbnRleHQiID4KLSAgICAgIAk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAJCTx0b3BpYyBsYWJlbD0iU2VhcmNoIGZvciBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL3NlYXJjaGZvcm1ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIAk8L2NvbnRleHQ+Ci0KLSAgIAk8Y29udGV4dCAgaWQ9ImZpbGVfc2VhcmNoX2FjdGlvbl9jb250ZXh0IiA+Ci0gICAgIAkgPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gCQk8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9zZWFyY2hmb3JtZXRob2RfY29udGVudC5odG1sIi8+Ci0gICAJPC9jb250ZXh0PgotICAgCQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19hdXRob3JpbmdfdWkueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOWYxMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08Y29udGV4dHM+IAotCTxjb250ZXh0ICBpZD0iZmlsZV9uZXdfbGlicmFyeV9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X292ZXJ2aWV3Lmh0bWwiICBsYWJlbD0iTWV0aG9kIGxpYnJhcnkgb3ZlcnZpZXciLz4gIAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX25ld19wbHVnaW5fY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9wbHVnaW4uaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZmlsZV9uZXdfY29uZmlndXJhdGlvbl9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZmlsZV9vcGVuX2xpYnJhcnlfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbGlicmFyeV9vdmVydmlldy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBsaWJyYXJ5IG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX29wZW5fY29uZmlndXJhdGlvbl9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0ibGlicmFyeV9uYXZpZ2F0b3Jfdmlld19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbGlicmFyeV92aWV3Lmh0bWwiICBsYWJlbD0iTGlicmFyeSB2aWV3Ii8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2F1dGhvcmluZ19wZXJzcGVjdGl2ZS5odG1sIiAgbGFiZWw9IkF1dGhvcmluZyBwZXJzcGVjdGl2ZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX3ZpZXdfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29uZmlndXJhdGlvbl92aWV3Lmh0bWwiICBsYWJlbD0iQ29uZmlndXJhdGlvbiB2aWV3Ii8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCIgIGxhYmVsPSJCcm93c2luZyBwZXJzcGVjdGl2ZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCQkJPCEtLSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgbmF2aWdhdG9yIG5vZGUgc2Vuc2l0aXZlIEYxIGNvbnRleHQgaGVscHMgLS0+Ci0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19tZXRob2RfcGx1Z2luX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgbWV0aG9kIHBsdWctaW4gbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2NvbnRlbnRfcGFja2FnZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IENvbnRlbnRQYWNrYWdlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld190YXNrX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgbWV0aG9kIFRhc2sgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3dvcmtfcHJvZHVjdF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFdvcmtQcm9kdWN0IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19ndWlkYW5jZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IEd1aWRhbmNlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19kaXNjaXBsaW5lX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgRGlzY2lwbGluZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IERpc2NpcGxpbmVHcm91cGluZyBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfZG9tYWluX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgRG9tYWluIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19yb2xlX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUm9sZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfd29ya19wcm9kdWN0X3R5cGVfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBXb3JrUHJvZHVjdFR5cGUgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcm9sZV9zZXRfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBSb2xlU2V0IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfdG9vbF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IG1ldGhvZCBUb29sIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3JvbGVfc2V0X2dyb3VwaW5nX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUm9sZVNldEdyb3VwaW5nIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IEN1c3RvbUNhdGVnb3J5IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3Byb2Nlc3NfY29tcG9uZW50X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUHJvY2Vzc0NvbXBvbmVudCBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcHJvY2Vzc19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFByb2Nlc3Mgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X21ldGhvZF9jb25maWd1cmF0aW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgTWV0aG9kQ29uZmlndXJhdGlvbiBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJPCEtLSBlbmQgb2YgdGhlIGxpYnJhcnkgbmF2aWdhdG9yIG5vZGUgc2Vuc2l0aXZlIEYxIGNvbnRleHQgaGVscHMgLS0+Ci0JCi0JCi0JPCEtLSBmb3JtIGVkaXRvciBzZWN0aW9uIGNvbnRleHQgaGVscCAtLT4KLQkKLQk8Y29udGV4dCAgaWQ9InBsdWdpbl9lZGl0b3JfZGVzY3JpcHRpb25fYWxsX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX3BsdWdpbi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZHBsdWdpbi5odG1sIiAgbGFiZWw9Ik1ldGhvZCBwbHVnLWluIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX2VkaXRvcl9hbGxfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9jb25maWd1cmF0aW9uLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24iLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImNvbnRlbnRfcGFja2FnZV9lZGl0b3JfYWxsX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jb250ZW50cGFja2FnZS5odG1sIiAgbGFiZWw9IkNyZWF0aW5nIGEgY29udGVudCBwYWNrYWdlIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgcGFja2FnZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3JvbGVfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3Rhc2tfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHRhc2siLz4gIAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl93b3JrX3Byb2R1Y3RfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIgIGxhYmVsPSJDcmVhdGUgd29yayBwcm9kdWN0Ii8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9ndWlkYW5jZV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIiAgbGFiZWw9IkNyZWF0aW5nIGd1aWRhbmNlIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9kaXNjaXBsaW5lX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2RvbWFpbl9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3dvcmtfcHJvZHVjdF90eXBlX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3JvbGVfc2V0X2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfcm9sc2Vfc2V0X2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfdG9vbF9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQkJCTwhLS0gYmVnaW5uaW5nIG9mIHNlY3Rpb24gYmFzZWQgRjEgY29udGV4dCBoZWxwIC0tPgotCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2RldGFpbF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZGV0YWlsX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX25vdGF0aW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9ub3RhdGlvbl9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl90YWlsb3JpbmdfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3RhaWxvcmluZ19jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl92ZXJzaW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl92ZXJzaW9uX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2ljb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2ljb25fY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCTwhLS0gZW5kIG9mIHNlY3Rpb24gYmFzZWQgRjEgY29udGV4dCBoZWxwIC0tPgotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2NwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0JCTx0b3BpYyBocmVmPSJodG1sL2hlbHAvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgIGxhYmVsPSJDYXBhYmlsaXR5IHBhdHRlcm4iLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2RwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0JCTx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGVsaXZlcnlfcHJvY2Vzcy5odG1sIiAgbGFiZWw9IkRlbGl2ZXJ5IHByb2Nlc3MiLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9wcm9jZXNzX3dic19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dicy5odG1sIiAgbGFiZWw9IkRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX3Byb2Nlc3Nfb2JzX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIgIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfcHJvY2Vzc19wYnNfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIgIGxhYmVsPSJEZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX3B1Ymxpc2hfd2l6YXJkX2FsbF9wYWdlc19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCIgIGxhYmVsPSJQdWJsaXNoaW5nIG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJyaWNoX3RleHRfZWRpdG9yX2NvbnRleHRfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3JpY2h0ZXh0ZWRpdG9yLmh0bWwiICBsYWJlbD0iUmljaCB0ZXh0IGVkaXRvciIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9hZGRfaHlwZXJsaW5rLmh0bWwiICBsYWJlbD0iQWRkaW5nIGEgcmVmZXJlbmNlIG9yIGh5cGVybGluayIvPiAKLQk8L2NvbnRleHQ+IAotCQotPC9jb250ZXh0cz4gCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRlcmV1c2FibGVtZXRob2Rjb250ZW50LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGVlZmI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0ZXJldXNhYmxlbWV0aG9kY29udGVudF9pZCI+Ci0gIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL21ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9jb250ZW50Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByb2xlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3JvbGUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB0YXNrIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3Rhc2suaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB3b3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgZ3VpZGFuY2UiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZ3VpZGFuY2UuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5Lmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDb250cmlidXRlcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2NvbnRyaWJ1dGVzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2V4dGVuZHMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJSZXBsYWNlcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X3JlcGxhY2UuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJWYXJpYWJpbGl0eSBhc3NvY2lhdGlvbnMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9hc3NvY2lhdGlvbnMuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgcHJldmlldyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19tZXRob2RfY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxY2JiNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTx0b2MgbGFiZWw9IkNyZWF0aW5nIHJldXNhYmxlIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjcmVhdGluZ19tZXRob2RfY29udGVudF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBNZXRob2QgQ29udGVudCIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfbWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBSb2xlIiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV9yb2xlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgVGFzayIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfdGFzay5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIFdvcmsgUHJvZHVjdCIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgR3VpZGFuY2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX2d1aWRhbmNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iR3VpZGFuY2UgUmVsYXRpb25zaGlwcyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9ndWlkYW5jZV9yZWxhdGlvbnNoaXBzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUmljaCBUZXh0IEVkaXRvciIgaHJlZj0iaHRtbC90b3BpY3MvY19yaWNodGV4dF9lZGl0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIiBocmVmPSJodG1sL3RvcGljcy90X2FkZF9oeXBlcmxpbmsuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgQ29udGVudCBWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC90b3BpY3MvY192YXJpYWJpbGl0eS5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZXMgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5X2V4dGVuZHMuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJSZXBsYWNlcyBWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC90b3BpY3MvY192YXJpYWJpbGl0eV9yZXBsYWNlcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkV4dGVuZHMgYW5kIHJlcGxhY2VzIHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5X2V4dGVuZF9yZXBsYWNlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb25zIEltcGFjdGVkIGJ5IFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9yX3ZhcmlhYmlsaXR5X2Fzc29jaWF0aW9ucy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIFZhcmlhYmlsaXR5IFJlbGF0aW9uc2hpcHMiIGhyZWY9Imh0bWwvdG9waWNzL3RfdmFyaWFiaWxpdHlfYnJvd3NpbmcuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50IiBocmVmPSJodG1sL3RvcGljcy90X2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgSW5kZXggRW50cmllcyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9pbmRleF9zeW50YXguaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDaGFuZ2luZyBUaGUgRmVlZGJhY2sgQWRkcmVzcyIgaHJlZj0iaHRtbC90b3BpY3MvY19jaGFuZ2luZ19mZWVkYmFjay5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldlYiBTaXRlIFNlYXJjaCIgaHJlZj0iaHRtbC90b3BpY3MvY19zaXRlX3NlYXJjaC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikdsb3NzYXJ5IGVudHJpZXMiIGhyZWY9Imh0bWwvdG9waWNzL2NfZ2xvc3NhcnkuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIEdsb3NzYXJ5IEVudHJpZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfZ2xvc3NhcnlfY3JlYXRlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRWRpdGluZyBHbG9zc2FyeSBFbnRyaWVzIiBocmVmPSJodG1sL3RvcGljcy90X2dsb3NzYXJ5X2VkaXQuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJEZWxldGluZyBHbG9zc2FyeSBFbnRyaWVzIiBocmVmPSJodG1sL3RvcGljcy90X2dsb3NzYXJ5X2RlbGV0ZS5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDb3B5cmlnaHQgbm90aWNlcyIgaHJlZj0iaHRtbC90b3BpY3MvY19jb3B5cmlnaHQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNvcHlyaWdodCBOb3RpY2VzIGluIGEgTmV3IFBsdWctSW4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY29weXJpZ2h0X25ld19wbHVnaW4uaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDaGFuZ2luZyB0aGUgRGVmYXVsdCBDb3B5cmlnaHQgTm90aWNlIiBocmVmPSJodG1sL3RvcGljcy90X2NvcHlyaWdodF9jaGFuZ2luZ19kZWZhdWx0Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iT3ZlcnJpZGluZyB0aGUgQ29weXJpZ2h0IE5vdGljZSBpbiBhIFBsdWctaW4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY29weXJpZ2h0X292ZXJyaWRpbmdfZGVmYXVsdC5odG1sIi8+Ci0gICA8L3RvcGljPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX3Byb2Nlc3Nlcy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlOWY0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ3JlYXRpbmcgcHJvY2Vzc2VzIiBsaW5rX3RvPSJtYWluLnhtbCNjcmVhdGluZ19wcm9jZXNzZXNfaWQiPiAgCi0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL3RvcGljcy90X2NhcGFiaWxpdHlfcGF0dGVybl9jcmVhdGUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvdG9waWNzL3RfZGV2ZWxvcF93YnMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlIiBocmVmPSJodG1sL3RvcGljcy90X2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIiBocmVmPSJodG1sL3RvcGljcy90X2RldmVsb3Bfd29ya3Byb2R1Y3Rfc3RydWN0dXJlLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJBcHBseWluZyBjYXBhYmlsaXR5IHBhdHRlcm5zIiBocmVmPSJodG1sL3RvcGljcy9jX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIj4KLSAgICA8dG9waWMgbGFiZWw9IkNvcHlpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY2FwYWJpbGl0eV9wYXR0ZXJuX2NvcHkuaHRtbCIvPgotICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kaW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL3RvcGljcy90X2NhcGFiaWxpdHlfcGF0dGVybl9leHRlbmQuaHRtbCIvPgotICAgIDx0b3BpYyBsYWJlbD0iRGVlcCBjb3B5aW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL3RvcGljcy90X2NhcGFiaWxpdHlfcGF0dGVybl9kZWVwX2NvcHkuaHRtbCIvPgotICAgIDwvdG9waWM+Ci0gIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBlbGVtZW50IHByb3BlcnRpZXMgdmlldyIgaHJlZj0iaHRtbC90b3BpY3MvY19wcm9wZXJ0aWVzX3ZpZXcuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIGFjdGl2aXR5IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX2FjdGl2aXR5X3ZhcmlhYmlsaXR5Lmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJVc2luZyBwcm9jZXNzIHRvIG1ldGhvZCBzeW5jaHJvbml6YXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfdXNpbmdfc3luY2hyb25pemF0aW9uLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggcHJvY2VzcyBkaWFncmFtcyIgaHJlZj0iaHRtbC90b3BpY3MvY19wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICAgICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkaWFncmFtcyIgaHJlZj0iaHRtbC90b3BpY3MvY19hY3Rpdml0eV9kaWFncmFtcy5odG1sIi8+Ci0gICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyIgaHJlZj0iaHRtbC90b3BpY3MvY19hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbXMuaHRtbCIvPgotICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5ncHJvY2Vzc2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmYzdiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGluZyBQcm9jZXNzZXMiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5ncHJvY2Vzc2VzX2lkIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC9oZWxwL2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3RlYW1fc3RydWN0dXJlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dvcmtwcm9kdWN0X3N0cnVjdHVyZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvYXBwbHlfY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGVsZW1lbnQgcHJvcGVydGllcyB2aWV3IiBocmVmPSJodG1sL2hlbHAvcHJvcGVydGllc192aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3MgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kaWFncmFtcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbXMuaHRtbCIvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2RvYy56aXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZG9jLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0OGM0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZG9jLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nX3N0YXJ0ZWQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdfc3RhcnRlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNDVjMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdfc3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08dG9jIGxhYmVsPSJHZXR0aW5nIHN0YXJ0ZWQiIGxpbmtfdG89Im1haW4ueG1sI2dldHRpbmdfc3RhcnRlZF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlVzZXIgSW50ZXJmYWNlIFJlZmVyZW5jZSIgaHJlZj0iaHRtbC90b3BpY3Mvcl91c2VyX2ludGVyZmFjZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkF1dGhvcmluZyBQZXJzcGVjdGl2ZSIgaHJlZj0iaHRtbC90b3BpY3MvY19hdXRob3JpbmdfcGVyc3BlY3RpdmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2luZyBQZXJzcGVjdGl2ZSIgaHJlZj0iaHRtbC90b3BpY3MvY19icm93c2luZ19wZXJzcGVjdGl2ZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNvbmZpZ3VyYXRpb24gdmlldyIgaHJlZj0iaHRtbC90b3BpY3MvY19jb25maWd1cmF0aW9uX3ZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQiIGhyZWY9Imh0bWwvdG9waWNzL3RfYnJvd3NlX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50IiBocmVmPSJodG1sL3RvcGljcy90X3NlYXJjaF9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgTWV0aG9kIFBsdWctaW4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX21ldGhvZF9wbHVnaW4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBDb250ZW50IFBhY2thZ2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX2NvbnRlbnRfcGFja2FnZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIiBocmVmPSJodG1sL3RvcGljcy90X21ldGhvZF9jb25maWd1cmF0aW9uX25ldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIEEgQ29weSBvZiBhIE1ldGhvZCBDb25maWd1cmF0aW9uIiBocmVmPSJodG1sL3RvcGljcy90X21ldGhvZF9jb25maWd1cmF0aW9uX2NvcHkuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdzdGFydGVkLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nc3RhcnRlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjE3ZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdzdGFydGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIiBsaW5rX3RvPSJtYWluLnhtbCNnZXR0aW5nc3RhcnRlZF9pZCI+Ci0gIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGxpYnJhcnkgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVG9vbCBpbnRlcmZhY2UiIGhyZWY9Imh0bWwvaGVscC91c2VyaW50ZXJmYWNlX292ZXJ2aWV3Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJBdXRob3JpbmcgcGVyc3BlY3RpdmUiIGhyZWY9Imh0bWwvaGVscC9hdXRob3JpbmdfcGVyc3BlY3RpdmUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJCcm93c2luZyBwZXJzcGVjdGl2ZSIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzaW5nX3BlcnNwZWN0aXZlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ29uZmlndXJhdGlvbiBWaWV3IiBocmVmPSJodG1sL2hlbHAvY29uZmlndXJhdGlvbl92aWV3Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iTGlicmFyeSB2aWV3IiBocmVmPSJodG1sL2hlbHAvbGlicmFyeV92aWV3Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQnJvd3NlIGFuZCBwcmV2aWV3IG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvYnJvd3NlX2NvbnRlbnQuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJTZWFyY2ggZm9yIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvc2VhcmNoX2NvbnRlbnQuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHBsdWctaW4iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX3BsdWdpbi5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGNvbnRlbnQgcGFja2FnZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jb250ZW50cGFja2FnZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9jb25maWd1cmF0aW9uLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dsb3NzYXJ5LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nbG9zc2FyeS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGRmN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dsb3NzYXJ5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTx0b2MgbGFiZWw9Ikdsb3NzYXJ5IiBsaW5rX3RvPSJtYWluLnhtbCNnbG9zc2FyeV9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IkFjdGl2aXR5IiBocmVmPSJodG1sL3RvcGljcy9nX2FjdGl2aXR5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQXJ0aWZhY3QiIGhyZWY9Imh0bWwvdG9waWNzL2dfYXJ0aWZhY3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDaGVja2xpc3QiIGhyZWY9Imh0bWwvdG9waWNzL2dfY2hlY2tsaXN0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ29uY2VwdCIgaHJlZj0iaHRtbC90b3BpY3MvZ19jb25jZXB0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGVlcCBjb3B5IiBocmVmPSJodG1sL3RvcGljcy9nX2RlZXBfY29weS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRlbGl2ZXJhYmxlIiBocmVmPSJodG1sL3RvcGljcy9nX2RlbGl2ZXJhYmxlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC90b3BpY3MvZ19kZWxpdmVyeV9wcm9jZXNzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGlzY2lwbGluZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19kaXNjaXBsaW5lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRG9tYWluIiBocmVmPSJodG1sL3RvcGljcy9nX2RvbWFpbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkVzdGltYXRpbmcgY29uc2lkZXJhdGlvbnMiIGhyZWY9Imh0bWwvdG9waWNzL2dfZXN0aW1hdGluZ19jb25zaWRlcmF0aW9ucy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkVzdGltYXRpbmcgZ3VpZGVsaW5lIiBocmVmPSJodG1sL3RvcGljcy9nX2VzdGltYXRpbmdfZ3VpZGVsaW5lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRXhhbXBsZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19leGFtcGxlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iR3VpZGVsaW5lIiBocmVmPSJodG1sL3RvcGljcy9nX2d1aWRlbGluZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikl0ZXJhdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvZ19pdGVyYXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJMaWJyYXJ5IHZpZXciIGhyZWY9Imh0bWwvdG9waWNzL2dfbGlicmFyeV92aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWlsZXN0b25lIiBocmVmPSJodG1sL3RvcGljcy9nX21pbGVzdG9uZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik91dGNvbWUiIGhyZWY9Imh0bWwvdG9waWNzL2dfb3V0Y29tZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlBoYXNlIiBocmVmPSJodG1sL3RvcGljcy9nX3BoYXNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJhY3RpY2UiIGhyZWY9Imh0bWwvdG9waWNzL2dfcHJhY3RpY2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcmV2aWV3IiBocmVmPSJodG1sL3RvcGljcy9nX3ByZXZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSZXBvcnQiIGhyZWY9Imh0bWwvdG9waWNzL2dfcmVwb3J0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUmV1c2FibGUgYXNzZXQiIGhyZWY9Imh0bWwvdG9waWNzL2dfcmV1c2FibGVfYXNzZXQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSb2FkbWFwIiBocmVmPSJodG1sL3RvcGljcy9nX3JvYWRtYXAuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSb2xlIiBocmVmPSJodG1sL3RvcGljcy9nX3JvbGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSb2xlIHNldCIgaHJlZj0iaHRtbC90b3BpY3MvZ19yb2xlc2V0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUm9sZSBzZXQgZ3JvdXBpbmciIGhyZWY9Imh0bWwvdG9waWNzL2dfcm9sZXNldF9ncm91cGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN0ZXAiIGhyZWY9Imh0bWwvdG9waWNzL2dfc3RlcC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnRpbmcgbWF0ZXJpYWwiIGhyZWY9Imh0bWwvdG9waWNzL2dfc3VwcG9ydGluZ19tYXRlcmlhbC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN5bmNocm9uaXphdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvZ19zeW5jaHJvbml6YXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUYXNrIiBocmVmPSJodG1sL3RvcGljcy9nX3Rhc2suaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUZW1wbGF0ZSIgaHJlZj0iaHRtbC90b3BpY3MvZ190ZW1wbGF0ZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRlcm0gZGVmaW5pdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvZ190ZXJtX2RlZmluaXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUb29sIG1lbnRvciIgaHJlZj0iaHRtbC90b3BpY3MvZ190b29sX21lbnRvci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldoaXRlIHBhcGVyIiBocmVmPSJodG1sL3RvcGljcy9nX3doaXRlcGFwZXIuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvdG9waWNzL2dfd29ya19wcm9kdWN0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV29yayBwcm9kdWN0IGRlc2NyaXB0b3IiIGhyZWY9Imh0bWwvdG9waWNzL2dfd29ya19wcm9kdWN0X2Rlc2NyaXB0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JrIHByb2R1Y3Qga2luZCIgaHJlZj0iaHRtbC90b3BpY3MvZ193b3JrX3Byb2R1Y3Rfa2luZC5odG1sIi8+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9BdXRob3JQZXJzcC5KUEcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9BdXRob3JQZXJzcC5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNGU3OTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvQXV0aG9yUGVyc3AuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E1NjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sI21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYWJvdXRlcGZjb21wb3NlciIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhYm91dGVwZmNvbXBvc2VyIj48YSBuYW1lPSJhYm91dGVwZmNvbXBvc2VyIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWJvdXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvaDE+Ci08ZGl2PjxwPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKS4gRVBGIENvbXBvc2VyIGlzIGEgdG9vbCBwbGF0Zm9ybSB0aGF0Ci1lbmFibGVzIHByb2Nlc3MgZW5naW5lZXJzIGFuZCBtYW5hZ2VycyB0byBpbXBsZW1lbnQsIGRlcGxveSwgYW5kIG1haW50YWluCi1wcm9jZXNzZXMgZm9yIG9yZ2FuaXphdGlvbnMgb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy4gVHlwaWNhbGx5LCB0d28ga2V5IHByb2JsZW1zCi1uZWVkIHRvIGJlIGFkZHJlc3NlZCB0byBzdWNjZXNzZnVsbHkgZGVwbG95IG5ldyBwcm9jZXNzZXMuPC9wPgotPHA+Rmlyc3QsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gYmUgZWR1Y2F0ZWQgb24gdGhlIG1ldGhvZHMgYXBwbGljYWJsZQotdG8gdGhlIHJvbGVzIHRoYXQgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiBTb2Z0d2FyZSBkZXZlbG9wZXJzIHR5cGljYWxseQotbmVlZCB0byBsZWFybiBob3cgdG8gZG8gYW5hbHlzaXMgYW5kIGRlc2lnbiwgdGVzdGVycyBuZWVkIHRvIGxlYXJuIGhvdyB0bwotdGVzdCBpbXBsZW1lbnRhdGlvbnMgYWdhaW5zdCByZXF1aXJlbWVudHMsIG1hbmFnZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvIG1hbmFnZQotdGhlIHByb2plY3Qgc2NvcGUgYW5kIGNoYW5nZSwgYW5kIHNvIG9uLiBTb21lIG9yZ2FuaXphdGlvbnMgYXNzdW1lIHRoYXQgZGV2ZWxvcGVycwotaW1wbGljaXRseSBrbm93IGhvdyB0byBkbyBzdWNoIHdvcmsgd2l0aG91dCBkb2N1bWVudGluZyB0aGVpciBtZXRob2RzLCBidXQKLW1hbnkgb3JnYW5pemF0aW9ucyB3YW50IHRvIGVzdGFibGlzaCBjb21tb24gYW5kIHJlZ3VsYXRlZCBwcmFjdGljZXMsIHRvIGRyaXZlCi1zcGVjaWZpYyBpbXByb3ZlbWVudCBvYmplY3RpdmVzLCBhbmQgdG8gbWVldCBjb21wbGlhbmNlIHN0YW5kYXJkcy4gPC9wPgotPHA+U2Vjb25kLCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRvIGFwcGx5IHRoZXNlIG1ldGhvZHMKLXRocm91Z2hvdXQgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFRoYXQgaXMsIHRoZXkgbmVlZCB0byBkZWZpbmUgb3Igc2VsZWN0Ci1hIGRldmVsb3BtZW50IHByb2Nlc3MuIEZvciBleGFtcGxlLCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2RzIGhhdmUgdG8KLWJlIGFwcGxpZWQgZGlmZmVyZW50bHkgaW4gZWFybHkgcGhhc2VzIG9mIGEgcHJvamVjdCB3aGVyZSB0aGUgZm9jdXMgaXMgb24KLWVsaWNpdGF0aW9uIG9mIHN0YWtlaG9sZGVyIG5lZWRzIGFuZCByZXF1aXJlbWVudHMgYW5kIHNjb3BpbmcgYSB2aXNpb24sIHRoYW4KLWluIGxhdGVyIHBoYXNlcyB3aGVyZSB0aGUgZm9jdXMgaXMgb24gbWFuYWdpbmcgcmVxdWlyZW1lbnRzIHVwZGF0ZXMgYW5kIGNoYW5nZXMKLWFuZCBwZXJmb3JtaW5nIGltcGFjdCBhbmFseXNpcyBvZiB0aGVzZSByZXF1aXJlbWVudHMgY2hhbmdlcy4gVGVhbXMgYWxzbyBuZWVkCi1jbGVhciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgZGlmZmVyZW50IHRhc2tzIG9mIHRoZSBtZXRob2RzIHJlbGF0ZSB0byBlYWNoCi1vdGhlciwgZm9yIGV4YW1wbGUsIGhvdyB0aGUgY2hhbmdlIG1hbmFnZW1lbnQgbWV0aG9kIGltcGFjdHMgdGhlIHJlcXVpcmVtZW50cwotbWFuYWdlbWVudCBtZXRob2QgYXMgd2VsbCBhcyByZWdyZXNzaW9uIHRlc3RpbmcgbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4KLUV2ZW4gc2VsZi1vcmdhbml6aW5nIHRlYW1zIG5lZWQgdG8gZGVmaW5lIGEgcHJvY2VzcyB0aGF0IGdpdmVzIGF0IG1pbmltdW0KLXNvbWUgZ3VpZGFuY2Ugb24gaG93IHRoZSBkZXZlbG9wbWVudCB3aWxsIGJlIHNjb3BlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUsCi13aGVuIG1pbGVzdG9uZXMgd2lsbCBiZSBhY2hpZXZlZCBhbmQgdmVyaWZpZWQsIGFuZCBzbyBvbi4gIDwvcD4KLTxkaXYgY2xhc3M9InAiPlRvIHRoYXQgZW5kLCBFUEYgQ29tcG9zZXIgaGFzIHR3byBtYWluIHB1cnBvc2VzOjx1bD48bGk+VG8gcHJvdmlkZSBhIGtub3dsZWRnZSBiYXNlIG9mIGludGVsbGVjdHVhbCBjYXBpdGFsIHdoaWNoIHlvdSBjYW4gYnJvd3NlLAotbWFuYWdlIGFuZCBkZXBsb3kuIFRoaXMgY29udGVudCBjYW4gaW5jbHVkZSBleHRlcm5hbGx5IGRldmVsb3BlZCBjb250ZW50LAotYW5kLCBtb3JlIGltcG9ydGFudGx5LCBjYW4gaW5jbHVkZSB5b3VyIG93biBjb250ZW50IGluY2x1ZGluZyBvZiB3aGl0ZXBhcGVycywKLWd1aWRlbGluZXMsIHRlbXBsYXRlcywgcHJpbmNpcGxlcywgYmVzdCBwcmFjdGljZXMsIGludGVybmFsIHByb2NlZHVyZXMgYW5kCi1yZWd1bGF0aW9ucywgdHJhaW5pbmcgbWF0ZXJpYWwsIGFuZCBhbnkgb3RoZXIgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgeW91cgotbWV0aG9kcy4gVGhpcyBrbm93bGVkZ2UgYmFzZSBjYW4gdXNlZCBmb3IgcmVmZXJlbmNlIGFuZCBlZHVjYXRpb24uIEl0IGFsc28KLWZvcm1zIHRoZSBiYXNpcyBmb3IgZGV2ZWxvcGluZyBwcm9jZXNzZXMgKHRoZSBzZWNvbmQgcHVycG9zZSkuIEVQRiBDb21wb3NlciBpcyBkZXNpZ25lZAotdG8gYmUgYSBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtIHRoYXQgcHJvdmlkZXMgYSBjb21tb24gbWFuYWdlbWVudCBzdHJ1Y3R1cmUKLWFuZCBsb29rIGFuZCBmZWVsIGZvciBhbGwgb2YgeW91ciBjb250ZW50LCByYXRoZXIgdGhhbiBiZWluZyBhIGRvY3VtZW50IG1hbmFnZW1lbnQKLXN5c3RlbSBpbiB3aGljaCB5b3Ugd291bGQgc3RvcmUgYW5kIGFjY2VzcyBoYXJkIHRvIG1haW50YWluIGxlZ2FjeSBkb2N1bWVudHMKLWFsbCBpbiB0aGVpciBvd24gc2hhcGVzIGFuZCBmb3JtYXRzLiBBbGwgY29udGVudCBtYW5hZ2VkIGluIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkCi10byBodG1sIGFuZCBkZXBsb3llZCB0byBXZWIgc2VydmVycyBmb3IgZGlzdHJpYnV0ZWQgdXNhZ2UuIDwvbGk+Ci08bGk+VG8gcHJvdmlkZSBwcm9jZXNzIGVuZ2luZWVyaW5nIGNhcGFiaWxpdGllcyBieSBzdXBwb3J0aW5nIHByb2Nlc3MgZW5naW5lZXJzCi1hbmQgcHJvamVjdCBtYW5hZ2VycyBpbiBzZWxlY3RpbmcsIHRhaWxvcmluZywgYW5kIHJhcGlkbHkgYXNzZW1ibGluZyBwcm9jZXNzZXMKLWZvciB0aGVpciBjb25jcmV0ZSBkZXZlbG9wbWVudCBwcm9qZWN0cy4gRVBGIENvbXBvc2VyIHByb3ZpZGVzIGNhdGFsb2dzIG9mIHByZS1kZWZpbmVkCi1wcm9jZXNzZXMgZm9yIHR5cGljYWwgcHJvamVjdCBzaXR1YXRpb25zIHRoYXQgY2FuIGJlIGFkYXB0ZWQgdG8gaW5kaXZpZHVhbAotbmVlZHMuIEl0IGFsc28gcHJvdmlkZXMgcHJvY2VzcyBidWlsZGluZyBibG9ja3MsIGNhbGxlZCBjYXBhYmlsaXR5IHBhdHRlcm5zLAotdGhhdCByZXByZXNlbnQgYmVzdCBkZXZlbG9wbWVudCBwcmFjdGljZXMgZm9yIHNwZWNpZmljIGRpc2NpcGxpbmVzLCB0ZWNobm9sb2dpZXMsCi1vciBtYW5hZ2VtZW50IHN0eWxlcy4gVGhlc2UgYnVpbGRpbmcgYmxvY2tzIGZvcm0gYSB0b29sa2l0IGZvciBxdWljayBhc3NlbWJseQotb2YgcHJvY2Vzc2VzIGJhc2VkIG9uIHByb2plY3Qtc3BlY2lmaWMgbmVlZHMuIEVQRiBDb21wb3NlciBhbHNvIGFsbG93cyB5b3UgdG8gc2V0IHVwCi15b3VyIG93biBvcmdhbml6YXRpb24tc3BlY2lmaWMgY2FwYWJpbGl0eSBwYXR0ZXJuIGxpYnJhcmllcy4gRmluYWxseSwgdGhlCi1wcm9jZXNzZXMgY3JlYXRlZCB3aXRoIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkIGFuZCBkZXBsb3llZCBhcyBXZWIgc2l0ZXMuIDwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgS2V5IENvbmNlcHRzPC9zdHJvbmc+PHVsPjxsaT5Qcm92aWRlcyBjb21wbGV0ZWx5IHJlZGVzaWduZWQgdG9vbHMgZm9yIGF1dGhvcmluZywgY29uZmlndXJpbmcsIHZpZXdpbmcsCi1hbmQgcHVibGlzaGluZyBkZXZlbG9wbWVudCBwcm9jZXNzZXMuIDwvbGk+Ci08bGk+UHJvdmlkZXMganVzdC1pbi10aW1lIGdlbmVyYXRpb24gb2YgcHVibGljYXRpb24gcHJldmlld3MgaW4gZGVkaWNhdGVkCi1icm93c2luZyBwZXJzcGVjdGl2ZSB0aGF0IGFsbG93cyByYXBpZCBjb25maWd1cmF0aW9uIHN3aXRjaGluZy4gPC9saT4KLTxsaT5NYW5hZ2VzIG1ldGhvZCBjb250ZW50IHVzaW5nIHNpbXBsZSBmb3JtLWJhc2VkIHVzZXIgaW50ZXJmYWNlcy4gVGhlcmVmb3JlLAotVU1MIG1vZGVsaW5nIHNraWxscyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLiA8L2xpPgotPGxpPlByb3ZpZGVzIGludHVpdGl2ZSByaWNoIHRleHQgZWRpdG9ycyBmb3IgY3JlYXRpbmcgaWxsdXN0cmF0aXZlIGNvbnRlbnQKLWRlc2NyaXB0aW9ucy4gRWRpdG9ycyBhbGxvdyB1c2Ugb2Ygc3R5bGVzLCBpbWFnZXMsIHRhYmxlcywgaHlwZXJsaW5rcywgYW5kCi1kaXJlY3QgSFRNTCBlZGl0aW5nLjwvbGk+Ci08bGk+QWxsb3dzIGNyZWF0aW5nIHByb2Nlc3NlcyB3aXRoIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9ycyBhbmQgd29ya2Zsb3cKLWRpYWdyYW1zIHRocm91Z2ggdXNlIG9mIG11bHRpLXByZXNlbnRhdGlvbiBwcm9jZXNzIGVkaXRvcnMuIEJyZWFrZG93biBzdHJ1Y3R1cmUKLWVkaXRvciBzdXBwb3J0cyBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3czogd29yay1icmVha2Rvd24gdmlldywgd29yayBwcm9kdWN0Ci11c2FnZSB2aWV3LCBhbmQgdGVhbSBhbGxvY2F0aW9uIHZpZXcuIEVQRiBDb21wb3NlciBhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplcyBhbGwgcHJlc2VudGF0aW9ucwotd2l0aCBwcm9jZXNzIGNoYW5nZXMuIDwvbGk+Ci08bGk+UHJvdmlkZXMgc3VwcG9ydCBmb3IgbWFueSBhbHRlcm5hdGl2ZSBsaWZlY3ljbGUKLW1vZGVscy4gRm9yIGV4YW1wbGUsIHdhdGVyZmFsbCwgaW5jcmVtZW50YWwsIG9yIGl0ZXJhdGl2ZSBtb2RlbHMgY2FuIGJlIGNyZWF0ZWQKLXdpdGggdGhlIHNhbWUgb3ZlcmxhcHBpbmcgbWV0aG9kIGNvbnRlbnQuIDwvbGk+Ci08bGk+SW1wcm92ZWQgcmV1c2UgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzLiBUaGUgcGx1Zy1pbiBtZWNoYW5pc21zCi1mcm9tIHBhc3QgdmVyc2lvbnMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgZXh0ZW5zaW9ucyBmb3IgYnJlYWtkb3duCi1zdHJ1Y3R1cmVzLjwvbGk+Ci08bGk+U3VwcG9ydHMgcmV1c2FibGUgZHluYW1pY2FsbHktbGlua2VkIHByb2Nlc3MgcGF0dGVybnMgb2YgYmVzdCBwcmFjdGljZXMKLWZvciByYXBpZCBwcm9jZXNzIGFzc2VtYmx5IHZpYSBkcmFnLWFuZC1kcm9wLiA8L2xpPgotPC91bD4KLTwvZGl2PgotPHA+PHN0cm9uZz5LZXkgVGVybWlub2xvZ3kgYW5kIENvbmNlcHRzPC9zdHJvbmc+PC9wPgotPHA+VG8gZWZmZWN0aXZlbHkgd29yayB3aXRoIEVQRiBDb21wb3NlciwgeW91IG5lZWQgdG8gdW5kZXJzdGFuZCBhIGZldwotY29uY2VwdHMgdGhhdCBhcmUgdXNlZCB0byBvcmdhbml6ZSB0aGUgY29udGVudC4gVGhlIHBhZ2VzIE1ldGhvZCBDb250ZW50IEF1dGhvcmluZwotT3ZlcnZpZXcgYW5kIFByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IGNvbnRhaW4gbW9yZSBkZXRhaWwgYW5kIGNvbmNyZXRlIGV4YW1wbGVzCi1vZiBob3cgdG8gd29yayBpbiB0aGUgdG9vbC4gVGhpcyBwYWdlIHByb3ZpZGVzIHlvdSB3aXRoIGEgZ2VuZXJhbCBvdmVydmlldwotb2YgdGhlc2UgY29uY2VwdHMuIDwvcD4KLTxwPlRoZSBtb3N0IGZ1bmRhbWVudGFsIHByaW5jaXBsZSBpbiBFUEYgQ29tcG9zZXIgaXMgdGhlIHNlcGFyYXRpb24gb2YgcmV1c2FibGUgY29yZQotbWV0aG9kIGNvbnRlbnQgZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiBUaGlzIGRpcmVjdGx5IHJlbGF0ZXMgYmFjawotdG8gdGhlIHR3byBwdXJwb3NlcyBvZiBFUEYgQ29tcG9zZXIgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBzZWN0aW9uLiBBbG1vc3QgYWxsIG9mIEVQRiBDb21wb3NlcidzCi1jb25jZXB0cyBhcmUgY2F0ZWdvcml6ZWQgYWxvbmcgdGhpcyBzZXBhcmF0aW9uLiBNZXRob2QgY29udGVudCBkZXNjcmliZXMgd2hhdAotaXMgdG8gYmUgcHJvZHVjZWQsIHRoZSBuZWNlc3Nhcnkgc2tpbGxzIHJlcXVpcmVkIGFuZCB0aGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucwotZGVzY3JpYmluZyBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkLiBUaGVzZSBtZXRob2QgY29udGVudAotZGVzY3JpcHRpb25zIGFyZSBpbmRlcGVuZGVudCBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIGRlc2NyaWJlCi10aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYW5kCi1yZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcwotb2YgcHJvamVjdHMuIDwvcD4KLTxwPjxpbWcgc3JjPSJ1bWFfaHVtcC5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHRoaXMgc2VwYXJhdGlvbiBpcyBkZXBpY3RlZCBpbiBCYXNpYyBVbmlmaWVkCi1Qcm9jZXNzLiBNZXRob2QgY29udGVudCwgZGVzY3JpYmluZyBob3cgZGV2ZWxvcG1lbnQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQsCi1pcyBjYXRlZ29yaXplZCBieSBkaXNjaXBsaW5lcyBhbG9uZyB0aGUgeS1heGlzIG9mIHRoZSBkaWFncmFtLiBUaGUgd29yayBkZXNjcmliZWQKLWluIGEgcHJvY2VzcyBpcyBzZWVuIGFsb25nIHRoZSB4LWF4aXMgcmVwcmVzZW50aW5nIHRoZSB0aW1lbGluZS4gVGhpcyBpcyB0aGUKLWxpZmVjeWNsZSBvZiBhIGRldmVsb3BtZW50IHByb2plY3QuIEl0IGV4cHJlc3NlcyB3aGVuIHdoYXQgd29yayB3aWxsIGJlIHBlcmZvcm1lZC4KLVRoZSBncmFwaCBpbiB0aGUgaWxsdXN0cmF0aW9uIHJlcHJlc2VudHMgYW4gZXN0aW1hdGVkIHdvcmtsb2FkIGZvciBlYWNoIGRpc2NpcGxpbmUuCi1BcyB5b3Ugc2VlLCBmb3IgZXhhbXBsZSwgb25lIG5ldmVyIHN0b3BzIHdvcmtpbmcgb24gcmVxdWlyZW1lbnRzIGluIE9wZW5VUC9CYXNpYywgYnV0Ci10aGVyZSBhcmUgY2VydGFpbmx5IHBlYWsgdGltZXMgaW4gd2hpY2ggbW9zdCBvZiB0aGUgcmVxdWlyZW1lbnRzIGVsaWNpdGF0aW9uCi1hbmQgZGVzY3JpcHRpb24gd29yayBpcyBwZXJmb3JtZWQuIFRoZXJlIGFyZSBhbHNvIHRpbWVzIGF0IHdoaWNoIGEgZG93bndhcmQKLXRyZW5kIG5lZWRzIHRvIGJlIG9ic2VydmVkIHdoZXJlIGZld2VyIGFuZCBmZXdlciByZXF1aXJlbWVudHMgY2hhbmdlcyBoYXZlCi10byBiZSBwcm9jZXNzZWQgdG8gYnJpbmcgdGhlIHByb2plY3QgdG8gYSBjbG9zZS4gVGhpcyBhdm9pZHMgd2hhdCBpcyByZWZlcnJlZAotdG8gYXMgZmVhdHVyZSBjcmVlcCBpbiB3aGljaCByZXF1aXJlbWVudHMgd29yayByZW1haW5zIGNvbnN0YW50IG9yIGV2ZW4gaW5jcmVhc2VzLgotSGVuY2UsIGEgbGlmZWN5Y2xlIChwcm9jZXNzKSBleHByZXNzZXMgdGhlIHZhcmlhbmNlcyBvZiB3b3JrIHBlcmZvcm1lZCBpbgotdGhlIHZhcmlvdXMgZGlzY2lwbGluZXMgKG1ldGhvZCBjb250ZW50KS4gPC9wPgotPHA+PGltZyBzcmM9Im1ldGhfdnNfcHJvYy5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBwaWN0dXJlIGFib3ZlIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiB0aGUga2V5IGVsZW1lbnRzIHVzZWQgaW4gRVBGIENvbXBvc2VyIGFuZAotaG93IHRoZXkgcmVsYXRlIHRvIG1ldGhvZCBjb250ZW50IG9yIHByb2Nlc3MuIEFzIHlvdSBzZWUsIG1ldGhvZCBjb250ZW50IGlzCi1wcmltYXJpbHkgZXhwcmVzc2VkIHVzaW5nIHdvcmsgcHJvZHVjdHMsIHJvbGVzLCB0YXNrcywgYW5kIGd1aWRhbmNlLiBHdWlkYW5jZSwKLXN1Y2ggYXMgY2hlY2tsaXN0cywgZXhhbXBsZXMsIG9yIHJvYWRtYXBzLCBjYW4gYWxzbyBiZSBkZWZpbmVkIHRvIHByb3ZpZGUKLWV4ZW1wbGFyeSB3YWxrdGhyb3VnaHMgb2YgYSBwcm9jZXNzLiBPbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBkaWFncmFtLAoteW91IHNlZSB0aGUgZWxlbWVudHMgdXNlZCB0byByZXByZXNlbnQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gVGhlIG1haW4gZWxlbWVudAotaXMgdGhlIGFjdGl2aXR5IHRoYXQgY2FuIGJlIG5lc3RlZCB0byBkZWZpbmUgYnJlYWtkb3duIHN0cnVjdHVyZXMgYXMgd2VsbAotYXMgcmVsYXRlZCB0byBlYWNoIG90aGVyIHRvIGRlZmluZSBhIGZsb3cgb2Ygd29yay4gQWN0aXZpdGllcyBhbHNvIGNvbnRhaW4KLWRlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlIG1ldGhvZCBjb250ZW50LiBBY3Rpdml0aWVzIGFyZSB1c2VkIHRvIGRlZmluZSBwcm9jZXNzZXMKLW9mIHdoaWNoIEVQRiBDb21wb3NlciBzdXBwb3J0IHR3byBtYWluIGtpbmRzOiBkZWxpdmVyeSBwcm9jZXNzZXMgYW5kIGNhcGFiaWxpdHkgcGF0dGVybnMuCi1EZWxpdmVyeSBwcm9jZXNzZXMgcmVwcmVzZW50IGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgcHJvY2VzcyB0ZW1wbGF0ZSBmb3IKLXBlcmZvcm1pbmcgb25lIHNwZWNpZmljIHR5cGUgb2YgcHJvamVjdC4gVGhleSBkZXNjcmliZSBhIGNvbXBsZXRlIGVuZC10by1lbmQKLXByb2plY3QgbGlmZWN5Y2xlIGFuZCBhcmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIKLWNoYXJhY3RlcmlzdGljcy4gQ2FwYWJpbGl0eSBwYXR0ZXJucyBhcmUgcHJvY2Vzc2VzIHRoYXQgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUKLXByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIG9yIGEgYmVzdAotcHJhY3RpY2UuIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgZGVsaXZlcnkgcHJvY2Vzc2VzCi1vciBsYXJnZXIgY2FwYWJpbGl0eSBwYXR0ZXJucy4gVGhpcyBlbnN1cmVzIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uCi1vZiB0aGVpciBrZXkgYmVzdCBwcmFjdGljZXMgaW4gcHJvY2VzcyBhdXRob3JpbmcgYWN0aXZpdGllcyBpbiBFUEYgQ29tcG9zZXIuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNtZXRob2RhdXRob3JpbmdvdmVydmlldyI+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FjdGl2aXR5Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hY3Rpdml0eS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODUyMTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FjdGl2aXR5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBY3Rpdml0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFjdGl2aXR5IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFjdGl2aXR5PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhY3Rpdml0eSI+PGEgbmFtZT0iYWN0aXZpdHkiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BY3Rpdml0eTwvaDE+Ci08ZGl2PjxwPkFjdGl2aXRpZXMgcmVwcmVzZW50IHRoZSBrZXkgYnVpbGRpbmcgYmxvY2tzIGZvciBwcm9jZXNzZXMuIEFjdGl2aXRpZXMKLXJlcHJlc2VudCBhIGdyb3VwaW5nIG9mIGJyZWFrZG93biBlbGVtZW50cyBzdWNoIGFzIG90aGVyIGFjdGl2aXRpZXMsIHRhc2sKLWRlc2NyaXB0b3JzLCByb2xlIGRlc2NyaXB0b3JzLCA8YSBocmVmPSJ3b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwjd29ya3Byb2R1Y3RkZXNjcmlwdG9ycyI+d29yayBwcm9kdWN0IGRlc2NyaXB0b3JzPC9hPiwgYW5kIDxhIGhyZWY9Im1pbGVzdG9uZS5odG1sI21pbGVzdG9uZSI+bWlsZXN0b25lczwvYT4uIEluIGFkZGl0aW9uIHRvIGJyZWFrZG93biBzdHJ1Y3R1cmVzLCBhY3Rpdml0aWVzCi1jYW4gYWxzbyBiZSBwcmVzZW50ZWQgaW4gYWN0aXZpdHkgZGlhZ3JhbXMgdGhhdCBncmFwaGljYWxseSBzaG93IHRoZSBmbG93Ci1vZiB3b3JrIGJ5IHNob3dpbmcgd2hpY2ggYWN0aXZpdGllcyBwcmVjZWRlIG90aGVyIGFjdGl2aXRpZXMuIDxhIGhyZWY9InBoYXNlLmh0bWwjcGhhc2UiPlBoYXNlPC9hPiBhbmQgPGEgaHJlZj0iaXRlcmF0aW9uLmh0bWwjaXRlcmF0aW9uIj5pdGVyYXRpb248L2E+IGFyZQotc3BlY2lhbCB0eXBlcyBvZiBhY3Rpdml0aWVzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHByb3BlcnRpZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGFyZWZlcmVuY2Vvcmh5cGVybGluay5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMTI1MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFkZGFyZWZlcmVuY2Vvcmh5cGVybGluayIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08ZGl2IGNsYXNzPSJuZXN0ZWQwIiBpZD0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIj48YSBuYW1lPSJhZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsiPjwhLS0gLS0+PC9hPjxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbms8L2gxPgotPGRpdj48cD5Zb3UgY2FuIGFkZCB0d28gdHlwZXMgb2YgcmVmZXJlbmNlcyBvciBoeXBlcmxpbmtzIHRvIHlvdXIgY29udGVudCB0ZXh0OgotcmVmZXJlbmNlcyAgdG8gb3RoZXIgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwKLXRleHQgd2l0aCBhIFVSTCB0aGF0IHJlc2lkZXMgb3V0c2lkZSB0aGUgbWV0aG9kIGxpYnJhcnkuPC9wPgotPHA+VGV4dCBmaWVsZHMgdGhhdCBzdXBwb3J0IGh5cGVybGlua3MgaGF2ZSBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9InR3aXN0eSBzeW1ib2wxLkpQRyIgYWx0PSIiIC8+IG5leHQgdG8gdGhlIHRleHQgZmllbGQncyBsYWJlbC4gQ2xpY2sgdGhlIHN5bWJvbCB0byBleHBhbmQKLXRoZSBmaWVsZCBpbnRvIGEgZnVsbCB0ZXh0IGVkaXRvci4gPC9wPgotPHA+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgaW50byBhIHRleHQKLWZpZWxkLCBsb2NhdGUgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gY3JlYXRlIGEgbGluayB0byBpbiB0aGUgbGlicmFyeSBvciBjb25maWd1cmF0aW9uCi12aWV3IGFuZCB0aGVuIGRyYWcgaXQgaW50byB0aGUgYXBwcm9wcmlhdGUgdGV4dCBmaWVsZCwgVGhlIGxpbmsgdG8gdGhlIGVsZW1lbnQKLWlzIGFkZGVkIGFzIGEgbWV0aG9kIGVsZW1lbnQgd2l0aCB0eXBlIHByZWZpeCwgbWVhbmluZyB0aGF0IHRoZSBtZXRob2QgZWxlbWVudAotbmFtZSBpcyBwcmVmaXhlZCB3aXRoIHRoZSBtZXRob2QgZWxlbWVudCB0eXBlLiBZb3UgY2FuIGFsc28gZHJhZyBhIG1ldGhvZAotZWxlbWVudCBpbnRvIGFuIHVuZXhwYW5kZWQgdGV4dCBmaWVsZCB0aGF0IHN1cHBvcnRzIGh5cGVybGlua3Mgd2l0aCB0aGUgc2FtZQotcmVzdWx0LjwvcD4KLTxkaXYgY2xhc3M9InAiPllvdSBjYW4gdXNlIHRoZSBBZGQgTGluayBmdW5jdGlvbiBpbiB0aGUgcmljaCB0ZXh0IGVkaXRvciB0byBhZGQgbGlua3MKLXRoYXQgYXJlIHJlZmVyZW5jZXMgdG8gb3RoZXIgbWV0aG9kIGVsZW1lbnRzIG9yIGxpbmtzIHRvIGZpbGVzIG9yIFdlYiBwYWdlcy4KLVRoaXMgZ2l2ZXMgeW91IGZ1cnRoZXIgb3B0aW9ucyBpbiBob3cgeW91ciBsaW5rcyBhcmUgZGlzcGxheWVkLjxvbD48bGk+SW4gdGhlIHRleHQgZWRpdG9yLCBwb3NpdGlvbiB0aGUgY3Vyc29yIHdoZXJlIHlvdSB3YW50IHRvIGluc2VydCB0aGUgbGluawotYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+QWRkIExpbms8L3N0cm9uZz4gYnV0dG9uIDxpbWcgc3JjPSJhZGRsaW5rX2NvLmdpZiIgYWx0PSIiIC8+IGluIHRoZSB0b29sIGJhci4gVGhlIEFkZCBMaW5rIGRpYWxvZyBvcGVucy48L2xpPgotPGxpPkNsaWNrIHRoZSA8c3Ryb25nPkJyb3dzZTwvc3Ryb25nPiBidXR0b24gdG8gbG9jYXRlIGFuZCBzZWxlY3QgdGhlIGVsZW1lbnQgeW91IHdpc2gKLXRvIGNyZWF0ZSBhIGxpbmsgdG8uIFRoZXJlIGFyZSBzZXZlcmFsIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGxpbmtzIHRvIG90aGVyCi1jb250ZW50IGVsZW1lbnRzLCB3aXRoIGVhY2ggb3B0aW9uIG9mZmVyaW5nIGEgZGlmZmVyZW50IHdheSBmb3IgZGlzcGxheWluZwotdGhlIGxpbmsncyBuYW1lOjx1bD48bGk+TWV0aG9kIGVsZW1lbnQ6IHRoZSBsaW5rIGRpc3BsYXlzIHRoZSBlbGVtZW50IG5hbWUuPC9saT4KLTxsaT5NZXRob2Qgd2l0aCB0eXBlIHByZWZpeDogdGhlIGxpbmsgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZSBhbmQgdHlwZS48L2xpPgotPGxpPk1ldGhvZCBlbGVtZW50IHdpdGggY3VzdG9tIHRleHQ6IHRoZSBsaW5rIGRpc3BsYXlzIHVzZXIgZGVmaW5lZCB0ZXh0LgotVG8gZGVmaW5lIHRoaXMgdGV4dCBtYW5pcHVsYXRlIHRoZSB0ZXh0IGluIGJldHdlZW4gdGhlICZsdDthJmd0OyZsdDsvYSZsdDsKLXRhZ3MgaW4gdGhlIFVSTCB0ZXh0IGZpZWxkIG9uZSB5b3UgaGF2ZSBzZWxlY3RlZCBhbiBlbGVtZW50IHVzaW5nIHRoZSA8c3Ryb25nPkJyb3dzZTwvc3Ryb25nPiBidXR0b24uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhbiBleHRlcm5hbCBVUkwsIHNlbGVjdCBVUkwgZnJvbSB0aGUgVHlwZSBkcm9wCi1kb3duIGxpc3QsIHR5cGUgdGhlIFVSTCBkZXRhaWxzIGluIHRoZSBVUkwgZmllbGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLTxsaT5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYSBmaWxlLCBpbiB0aGUgVHlwZSBkcm9wIGRvd24gbGlzdCwgY2xpY2sgPHN0cm9uZz5GaWxlPC9zdHJvbmc+LAotZW50ZXIgdGhlIGZpbGUgbmFtZSBvciBicm93c2UgdG8gZmluZCB0aGUgZmlsZSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4KLUVhY2ggdGltZSB5b3UgYWRkIGEgbGluayB5b3UgY2FuIGNob29zZSB0byBoYXZlIHRoZSB0YXJnZXQgb3BlbiBpbiB0aGUgc2FtZQotYnJvd3NlciB3aW5kb3cgb3IgaW4gYSBuZXcgd2luZG93LjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj48L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkaW1nX2NvLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGltZ19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYmQ3MjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkaW1nX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGxpbmtfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkbGlua19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYTM4NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkbGlua19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRvcmRsaXN0X2NvLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZG9yZGxpc3RfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzFkNjc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZG9yZGxpc3RfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdGFibGVfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdGFibGVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTM2ZGQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHRhYmxlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHVub3JkbGlzdF9jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR1bm9yZGxpc3RfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDc0OWU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHVub3JkbGlzdF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MzY4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+PGEgbmFtZT0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPldoZW4gZGV2ZWxvcGluZyBhIHByb2Nlc3MsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGV2ZWxvcCB0aGUgcHJvY2VzcwotZnJvbSBzY3JhdGNoLCBhZGRpbmcgZGVzY3JpcHRvcnMgb25lIGJ5IG9uZS4gWW91IGNhbiByZXVzZSBleGlzdGluZyBjYXBhYmlsaXR5Ci1wYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cyB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MKLWNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGZvciB3aGljaCBpdCBpcyBhcHBsaWVkLiBBIGNhcGFiaWxpdHkKLXBhdHRlcm4gbXVzdCBiZSBhcHBsaWVkIHRvIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSBpbiBhIHByb2Nlc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZXJlIGFyZSB0d28gd2F5cyB0byBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjogQ29weSBhbmQgRXh0ZW5kLiA8cD48c3Ryb25nPkNvcHkKLWEgY2FwYWJpbGl0eSBwYXR0ZXJuOjwvc3Ryb25nPjwvcD4KLTxkaXYgY2xhc3M9InAiPklmIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGNvcGllZCBpbnRvIGEgcHJvY2VzcywKLW1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGluIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYXJlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZQotb3JpZ2luYWwuIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gZWxlbWVudHMgY2FuIGJlIGFsdGVyZWQsIGRlbGV0ZWQgb3IgY2hhbmdlZAotYXMgeW91IHdhbnQgaW4gdGhlIHByb2Nlc3MgZWRpdG9yIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBtZXRob2QgY29udGVudAotZWxlbWVudHMuIE1ldGhvZCBlbGVtZW50cyBpbiBhIGNvcGllZCBjYXBhYmlsaXR5IHBhdHRlcm4gYXBwZWFyIGluIHJlZ3VsYXIKLWJsYWNrIGZvbnQuIFRvIGNvcHkgYSBjYXBhYmlsaXR5IHBhdHRlcm46PG9sPjxsaT5JbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiwKLXNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBpdHMgcGFydHMgdGhhdCB5b3Ugd2FudCB0byBjb3B5IGludG8gYW4gYWN0aXZpdHkKLWluIGEgcHJvY2VzcyBhbmQgZHJhZyB0aGUgcGF0dGVybiBvciBwYXJ0cyBpbnRvIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3UKLXdhbnQgaXQgdG8gYXBwbHkuIFRvIHNlbGVjdCBtdWx0aXBsZSBhY3Rpdml0aWVzIGluIGEgY2FwYWJpbGl0eSBwYXR0ZXJuLCBwcmVzcwotdGhlIENUUkwgb3IgU0hJRlQga2V5cyB3aGlsZSB5b3Ugc2VsZWN0LiA8L2xpPgotPGxpPkluIHRoZSBwb3AtdXAgYm94IHRoYXQgYXBwZWFycywgY2xpY2sgPHN0cm9uZz5Db3B5PC9zdHJvbmc+LiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi1uYW1lIGlzIGRpc3BsYXllZCBpbiBibGFjayBhbmQgaXMgbm93IGF2YWlsYWJsZSBmb3IgeW91IHRvIGVkaXQuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPk9yLDxvbD48bGk+SW4gdGhlIHByb2Nlc3MgdmlldywgcmlnaHQgY2xpY2sgYW4gYWN0aXZpdHksIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+QXBwbHkKLVBhdHRlcm4gJmd0OyBDb3B5PC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzIHdpbmRvdyBhcHBlYXJzLjwvbGk+Ci08bGk+RHJpbGwgZG93biBpbnRvIHRoZSBwcm9jZXNzIHRyZWUgdW50aWwgeW91IGxvY2F0ZSB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi15b3Ugd2FudCB0byBjb3B5LjwvbGk+Ci08bGk+U2VsZWN0IHRoZSBwYXR0ZXJuLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzCi13aW5kb3cgY2xvc2VzIGFuZCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGFwcGxpZWQuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxwPjxzdHJvbmc+RXh0ZW5kIGEgY2FwYWJpbGl0eSBwYXR0ZXJuOjwvc3Ryb25nPjwvcD4KLTxkaXYgY2xhc3M9InAiPklmIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi1pcyBleHRlbmRlZCBpbnRvIGEgcHJvY2VzcywgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybgotcmV0YWluIGEgY29ubmVjdGlvbiB0byB0aGUgb3JpZ2luYWwuIEV4dGVuZGVkIGNhcGFiaWxpdHkgcGF0dGVybiBlbGVtZW50cwotY2Fubm90IGJlIGRlbGV0ZWQgb3IgbW9kaWZpZWQgYW5kIGFwcGVhciBhcyByZWFkLW9ubHkgaW4gYSBncmVlbi1pdGFsaWMgZm9udC4KLVRvIGV4dGVuZCBhIGNhcGFiaWxpdHkgcGF0dGVybjogPG9sPjxsaT5JbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiwKLXNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBpdHMgcGFydHMgdGhhdCB5b3Ugd2FudCB0byBleHRlbmQgaW50byBhbiBhY3Rpdml0eQotaW4gYSBwcm9jZXNzIGFuZCBkcmFnIHRoZSBwYXR0ZXJuIG9yIHBhcnRzIGludG8gdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdQotd2FudCBpdCB0byBhcHBseS4gVG8gc2VsZWN0IG11bHRpcGxlIGFjdGl2aXRpZXMgaW4gYSBjYXBhYmlsaXR5IHBhdHRlcm4sIHByZXNzCi10aGUgQ1RSTCBvciBTSElGVCBrZXlzIHdoaWxlIHlvdSBzZWxlY3QuPC9saT4KLTxsaT5JbiB0aGUgcG9wLXVwIGJveCB0aGF0IGFwcGVhcnMsIGNsaWNrIDxzdHJvbmc+RXh0ZW5kPC9zdHJvbmc+LiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi1uYW1lIGlzIGRpc3BsYXllZCBpbiBncmVlbiwgd2hpY2ggaW5kaWNhdGVzIGl0IGlzIHBhcnQgb2YgYSBwcm9jZXNzIGRlZmluZWQKLWVsc2V3aGVyZS48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+T3IsIDxvbD48bGk+SW4gdGhlIHByb2Nlc3MgdmlldywgcmlnaHQgY2xpY2sgYW4gYWN0aXZpdHkgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5BcHBseQotUGF0dGVybiAmZ3Q7IEV4dGVuZDwvc3Ryb25nPi4gVGhlIFNlbGVjdCBEaWFsb2cgRm9yIFByb2Nlc3NlcyB3aW5kb3cgYXBwZWFycy48L2xpPgotPGxpPkRyaWxsIGRvd24gaW50byB0aGUgcHJvY2VzcyB0cmVlIHVudGlsIHlvdSBsb2NhdGUgdGhlIGNhcGFiaWxpdHkgcGF0dGVybgoteW91IHdhbnQgdG8gZXh0ZW5kLjwvbGk+Ci08bGk+U2VsZWN0IHRoZSBwYXR0ZXJuLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzCi13aW5kb3cgY2xvc2VzIGFuZCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGFwcGxpZWQuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJZiB5b3UgZG8gbm90IHdhbnQgYSBzcGVjaWZpYyBhY3Rpdml0eSBvciB0YXNrIGluIHRoZSBjYXBhYmlsaXR5Ci1wYXR0ZXJuIHRvIGJlIGluY2x1ZGVkIGluIHlvdXIgcHJvY2VzcyB5b3UgY2FuIHN1cHByZXNzIGl0LiBUaGUgYWN0aXZpdHkgb3IKLXRhc2sgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBwdWJsaXNoZWQgcHJvY2VzcyBvciBiZSBleHBvcnRlZCB0byBhIHByb2plY3QKLXBsYW5uaW5nIHRvb2wuIFRvIHN1cHByZXNzIGEgcHJvY2VzcyBlbGVtZW50LCByaWdodCBjbGljayB0aGUgZWxlbWVudCBhbmQKLXRoZW4gc2VsZWN0IDxzdHJvbmc+U3VwcHJlc3M8L3N0cm9uZz4uIFRoZSBlbGVtZW50IGFwcGVhcnMgZ3JheWVkIG91dCBpbiB0aGUgcHJvY2Vzcwotdmlldy48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJwIj5UbyBhZGQgZWxlbWVudHMgdG8gYW4gYWN0aXZpdHkgaW4gYW4gZXh0ZW5kZWQgY2FwYWJpbGl0eSBwYXR0ZXJuOjxvbD48bGk+RmluZCB0aGUgYWN0aXZpdHkncyBwYXJlbnQgZWxlbWVudC4gSWYgdGhpcyBlbGVtZW50IGlzIGEgbm90IGEgbG9jYWwgZWxlbWVudAotdGhhdCBhcHBlYXJzIGluIGdyZWVuIGl0YWxpYyBmb250LCB0aGVuIHlvdSBuZWVkIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0bwotdGhpcyBwYXJlbnQgZmlyc3QuICBJZiB0aGUgcGFyZW50J3MgcGFyZW50IGlzIG5vdCBsb2NhbCwgYWxzbyBhcHBlYXJpbmcgaW4KLWdyZWVuIGl0YWxpYyBmb250LCB0aGVuIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byB0aGUgcGFyZW50IGZpcnN0LAotYW5kIHNvIG9uLiA8L2xpPgotPGxpPlRvIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byBhbiBleHRlbmRlZCBhY3Rpdml0eSwgcmlnaHQgY2xpY2sgdGhlIGV4dGVuZGVkCi1hY3Rpdml0eSBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNvbnRyaWJ1dGU8L3N0cm9uZz4uIFRoZSBhY3Rpdml0eSBiZWNvbWVzIGxvY2FsIGFuZAotYXBwZWFycyBpbiBhIHN0YW5kYXJkIGJsYWNrIGZvbnQuIERvIHRoaXMgd2l0aCBhbGwgcGFyZW50IGVsZW1lbnRzLCB0b3AtZG93biwKLXVudGlsIHlvdSByZWFjaCB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91IHdhbnQgdG8gYXBwbHkgdGhlIGVsZW1lbnQuIE9uY2UKLXlvdSBjbGljayBDb250cmlidXRlLCB0aGUgYWN0aXZpdHkgYmVjb21lcyBsb2NhbCBhbmQgaXMgcHJlc2VudGVkIGluIHN0YW5kYXJkCi1ibGFjayBmb250LjwvbGk+Ci08L29sPgotRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiPkNvbnRyaWJ1dGVzPC9hPi48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiPlJlcGxhY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJwcm9jZXNzLmh0bWwjcHJvY2VzcyI+UHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXJ0aWZhY3QuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FydGlmYWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTVmYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXJ0aWZhY3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im91dGNvbWUuaHRtbCNvdXRjb21lIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFydGlmYWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhcnRpZmFjdCI+PGEgbmFtZT0iYXJ0aWZhY3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BcnRpZmFjdDwvaDE+Ci08ZGl2PjxwPkFuIGFydGlmYWN0IGlzIGEgdGFuZ2libGUgd29yayBwcm9kdWN0IHRoYXQgaXMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZAotYnkgdGFza3MuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbAotYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuIDwvcD4KLTxwPlJvbGVzIHVzZSBhcnRpZmFjdHMgdG8gcGVyZm9ybSB0YXNrcyBhbmQgdG8gcHJvZHVjZSBvdGhlciBhcnRpZmFjdHMuIEVhY2gKLWFydGlmYWN0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSByb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeQotdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbgotcHJvZHVjZWQgaW4gYSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9ubHkKLW9uZSByb2xlIGlzIHJlc3BvbnNpYmxlIGZvciBhbiBhcnRpZmFjdCwgb3RoZXIgcm9sZXMgbWF5IHVzZSB0aGUgYXJ0aWZhY3RzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSI+RGVsaXZlcmFibGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im91dGNvbWUuaHRtbCNvdXRjb21lIj5PdXRjb21lPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2F1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzY0YTY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2F1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBdXRob3JpbmcgUGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlIj48YSBuYW1lPSJhdXRob3JpbmdwZXJzcGVjdGl2ZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvaDE+Ci08ZGl2PjxwPlRoZSBBdXRob3JpbmcgUGVyc3BlY3RpdmUgcHJvdmlkZXMgdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSBhbmQKLWF1dGhvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiBZb3UgbXVzdCBiZSBpbiB0aGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlCi10byBjcmVhdGUgb3IgbW9kaWZ5IGFueSBlbGVtZW50IHR5cGVzLjwvcD4KLTxwPkNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+IGFuZCBzZWxlY3QgQXV0aG9yaW5nIHRvIG9wZW4gdGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZS4gPC9wPgotPHA+PGltZyBzcmM9IkF1dGhvclBlcnNwLkpQRyIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSBjb250YWlucyB0d28gVmlld3M6IHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGFuZCB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gRG91YmxlIGNsaWNrIGFueSBlbGVtZW50IGluIHRoZQotTGlicmFyeSBWaWV3IG9yIENvbmZpZ3VyYXRpb24gVmlldyB0byBvcGVuIHRoZSBFZGl0b3Igd2luZG93IG9uIHRoZSByaWdodC4KLVRoZSBFZGl0b3Igd2luZG93IGNvbnRhaW5zIHNldmVyYWwgdGFicyB0aHJvdWdoIHdoaWNoIHlvdSBjYW4gZWRpdCBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIGVsZW1lbnQgeW91IGhhdmUgc2VsZWN0ZWQuPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9Im5leHRsaW5rIj48c3Ryb25nPk5leHQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYm9sZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ib2xkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjNDY4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ib2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NjMDE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJCcm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQiPjxhIG5hbWU9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+WW91IGNhbiBicm93c2UgbWV0aG9kIGNvbnRlbnQgaW4gYm90aCB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiBhbmQgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+LiBXaGlsZSBhdXRob3JpbmcgbWV0aG9kIGNvbnRlbnQsIHlvdSBjYW4gc2VlIGEgcHJldmlldwotb2YgdGhlIHB1Ymxpc2hlZCBwYWdlIGZvciB0aGUgY29udGVudCB5b3UgYXJlIGVkaXRpbmcgYnkgc2VsZWN0aW5nIHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiCi1hdCB0aGUgYm90dG9tIG9mIHRoZSBjb250ZW50IGVkaXRvci4gQ2xpY2sgYW55IGxpbmsgaW4gdGhlIGRpc3BsYXllZCBwYWdlCi10byBnbyB0byB0aGF0IHBhZ2UuIFVzZSB0aGUgYnV0dG9ucyBpbiB0aGUgZWRpdG9yIHRvb2xiYXIgdG8gcGVyZm9ybSBmYW1pbGlhcgotYnJvd3NlciBhY3Rpb25zIHN1Y2ggYXMgYmFjayBvciByZWZyZXNoLiBXaGlsZSBicm93c2luZyBtZXRob2QgY29udGVudCBpbgotdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlIHlvdSBjYW4gc2VlIGEgcHJldmlldyBvZiBhbnkgbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQKLWluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXMgaXQgYXBwZWFycyBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBicm93c2UgYW5kIHByZXZpZXcgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+IGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCA8c3Ryb25nPkF1dGhvcmluZzwvc3Ryb25nPi4gVGhlIEF1dGhvcmluZyBwZXJzcGVjdGl2ZQotb3BlbnMgd2l0aCB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBhbmQgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiBvbgotdGhlIGxlZnQgYW5kIHRoZSBjb250ZW50IHZpZXcgb24gdGhlIHJpZ2h0LiBJZiBhIG1ldGhvZCBlbGVtZW50IGlzIHNlbGVjdGVkLAotdGhlIGFwcHJvcHJpYXRlIGVkaXRvciBpcyBvcGVuIG9uIHRoZSByaWdodC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwbG9yZSB0aGUgY29udGVudHMgaW4gdGhlIGJvdGggdGhlIExpYnJhcnkgVmlldyBhbmQgQ29uZmlndXJhdGlvbgotVmlldyBieSBleHBhbmRpbmcgdGhlIGRpZmZlcmVudCBjb250ZW50IHBhY2thZ2VzIGFuZCBtZXRob2QgcGx1Zy1pbnMgZG93bgotdG8gdGhlaXIgbWV0aG9kIGVsZW1lbnRzLiBEb3VibGUgY2xpY2sgYW4gZWxlbWVudCB0byBvcGVuIGl0IGluIHRoZSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiIGF0IHRoZSBib3R0b20gb2YgdGhlIGNvbnRlbnQgZWRpdG9yCi10byBwcmV2aWV3IHRoZSBjb250ZW50IG9mIGFueSBzZWxlY3RlZCBlbGVtZW50Ljwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSBwcmV2aWV3Ci1wYWdlIGluIHRoZSBjb250ZW50IGVkaXRvciBkb2VzIG5vdCByZXNvbHZlIGNvbnRlbnQgdmFyaWFiaWxpdHkgcmVsYXRpb25zaGlwcy4KLUlmIHlvdSBhcmUgZXh0ZW5kaW5nLCBjb250cmlidXRpbmcgdG8sIG9yIHJlcGxhY2luZyBhIGJhc2UgY29udGVudCBpdGVtLCB5b3UKLWNhbiBvbmx5IHNlZSB0aGUgcmVzdWx0IG9mIHRoaXMgaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyBpbiB0aGUgQnJvd3NpbmcKLVBlcnNwZWN0aXZlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSI+VmFyaWFiaWxpdHk8L2E+LjwvZGl2PgotPHA+PC9wPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBicm93c2UgYW5kIHByZXZpZXc8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4gaW4gdGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjo8L3A+Ci08b2w+PGxpPkNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+IGFuZCBzZWxlY3QgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPi4gVGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPiBvcGVucyB3aXRoIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+IG9uIHRoZSBsZWZ0IGFuZCB0aGUgQ29udGVudCBWaWV3IG9uIHRoZSByaWdodC48cD48L3A+Ci08L2xpPgotPGxpPlNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZHJvcC1kb3duIGxpc3QgaW4KLXRoZSB0b29sIGJhci4gVGhlIGNvbnRlbnQgb2YgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRlbnQKLXZpZXcsIGFzIGl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLjxwPjwvcD4KLTwvbGk+Ci08bGk+RXhwbG9yZSBhbmQgcHJldmlldyB0aGUgY29udGVudCBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IGJ5IGV4cGFuZGluZwotdGhlIGNhdGVnb3JpZXMgYW5kIG90aGVyIGZvbGRlcnMgZG93biB0byBtZXRob2QgZWxlbWVudHMuIENsaWNrIGEgbWV0aG9kIGVsZW1lbnQKLXRvIG9wZW4gaXQgaW4gdGhlIGNvbnRlbnQgdmlldy48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZXBlcnNwLkpQRyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZXBlcnNwLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2OTFmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VwZXJzcC5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2luZ3BlcnNwZWN0aXZlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2luZ3BlcnNwZWN0aXZlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWZlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQnJvd3NpbmcgUGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYnJvd2luZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJicm93aW5ncGVyc3BlY3RpdmUiPjxhIG5hbWU9ImJyb3dpbmdwZXJzcGVjdGl2ZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9oMT4KLTxkaXY+PHA+VGhlIEJyb3dzaW5nIFBlcnNwZWN0aXZlIGFsbG93cyB5b3UgdG8gcHJldmlldyBhbmQgbmF2aWdhdGUgdGhyb3VnaCBhIE1ldGhvZAotQ29uZmlndXJhdGlvbiB3aXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcy48L3A+Ci08cD5DbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPiBhbmQgc2VsZWN0IDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gdG8gb3BlbiB0aGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUuPC9wPgotPHA+PGltZyBzcmM9ImJyb3dzZXBlcnNwLkpQRyIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlIGNvbnRhaW5zIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LCB3aGljaCBzaG93cyB0aGUgY29udGVudCBpbiB0aGUgY3VycmVudGx5Ci1zZWxlY3RlZCBjb25maWd1cmF0aW9uLiBDbGljayBhbnkgZWxlbWVudCBpbiB0aGUgQ29uZmlndXJhdGlvbgotVmlldyB0byBwcmV2aWV3IHRoZSBlbGVtZW50IGluIHRoZSBDb250ZW50IFZpZXcgYXMgaXQgd2lsbCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQKLVdlYiBzaXRlLiBUaGUgQ29udGVudCBWaWV3IHByb3ZpZGVzIGJyb3dzZXItbGlrZSBuYXZpZ2F0aW9uIGZlYXR1cmVzLiBDbGljawotYW55IGxpbmsgaW4gdGhlIGRpc3BsYXllZCBwYWdlIHRvIGdvIHRvIHRoYXQgcGFnZS4gVXNlIHRoZSBidXR0b25zIGluIHRoZQotQ29udGVudCBWaWV3IHRvb2xiYXIgdG8gcGVyZm9ybSBmYW1pbGlhciBicm93c2VyIGFjdGlvbnMgc3VjaCBhcyBiYWNrIG9yIHJlZnJlc2guPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9InByZXZpb3VzbGluayI+PHN0cm9uZz5QcmV2aW91cyB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jYXBhYmlsaXR5cGF0dGVybi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlNTZhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jYXBhYmlsaXR5cGF0dGVybi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ2FwYWJpbGl0eSBQYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkaXNjaXBsaW5lLmh0bWwjZGlzY2lwbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNhcGFiaWxpdHkgUGF0dGVybjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2FwYWJpbGl0eXBhdHRlcm4iPjxhIG5hbWU9ImNhcGFiaWxpdHlwYXR0ZXJuIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9oMT4KLTxkaXY+PHA+QSBDYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBzcGVjaWFsIHByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyCi1vZiBhY3Rpdml0aWVzIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiBDYXBhYmlsaXR5IHBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlCi1wcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgZGlzY2lwbGluZSBhbmQgY2FuCi1iZSBkaXJlY3RseSB1c2VkIGJ5IGEgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuIENhcGFiaWxpdHkgcGF0dGVybnMKLWFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIKLWNhcGFiaWxpdHkgcGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMKLXRoZXkgZXhwcmVzcy48L3A+Ci08cD5FeGFtcGxlcyBvZiBhIGNhcGFiaWxpdHkgcGF0dGVybiBjb3VsZCBiZSAidXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzCi1tYW5hZ2VtZW50IiwgInVzZSBjYXNlIGFuYWx5c2lzIiwgb3IgInVuaXQgdGVzdGluZyIuIFR5cGljYWxseSwgYnV0IG5vdCBuZWNlc3NhcmlseSwKLWNhcGFiaWxpdHkgcGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duCi1vZiByZXVzYWJsZSBjb21wbGV4IGFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIHJvbGVzIHdoaWNoIHBlcmZvcm0gdGFza3MKLXdpdGhpbiB0aGVzZSBhY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kCi1wcm9kdWNlZC4gQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYwotcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuIEluCi1vdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUKLWluIGEgZGVsaXZlcnkgcHJvY2Vzcy4gdGhlcmVieSBlbmFibGluZyBpdHMgYWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZAotdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgZGVsaXZlcnkgcHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZwotYXBwbGllZC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGlzY2lwbGluZS5odG1sI2Rpc2NpcGxpbmUiPkRpc2NpcGxpbmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jaGVja2xpc3QuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NoZWNrbGlzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDc4YWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NoZWNrbGlzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ2hlY2tsaXN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNoZWNrbGlzdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DaGVja2xpc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNoZWNrbGlzdCI+PGEgbmFtZT0iY2hlY2tsaXN0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q2hlY2tsaXN0PC9oMT4KLTxkaXY+PHA+QSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZgotaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpZmllZC4gQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbgotcmV2aWV3cyBzdWNoIGFzIGEgd2Fsay10aHJvdWdocyBvciBpbnNwZWN0aW9ucy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jbGVhcmNvbnRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2xlYXJjb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzNWY0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jbGVhcmNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29sbGFwc2VkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbGxhcHNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODc3NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29sbGFwc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmNlcHQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmNlcHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5ODJhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25jZXB0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29uY2VwdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY29uY2VwdCI+PGEgbmFtZT0iY29uY2VwdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbmNlcHQ8L2gxPgotPGRpdj48cD5BIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQKLXdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MKLW1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBndWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXZlcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IKLXRhc2tzIG9yIGFjdGl2aXRpZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1ZTZiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmUxMWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb25maWd1cmF0aW9ucyBhbmQgUHVibGlzaGluZyBPdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJQdXQgeW91ciBzaG9ydCBkZXNjcmlwdGlvbiBoZXJlOyB1c2VkIGZvciBmaXJzdCBwYXJhZ3JhcGggYW5kIGFic3RyYWN0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJQdXQgeW91ciBzaG9ydCBkZXNjcmlwdGlvbiBoZXJlOyB1c2VkIGZvciBmaXJzdCBwYXJhZ3JhcGggYW5kIGFic3RyYWN0LiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Db25maWd1cmF0aW9ucyBhbmQgUHVibGlzaGluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXciPgotPGgzPk1ldGhvZCBDb25maWd1cmF0aW9ucyBPdmVydmlldzwvaDM+Ci08cD5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHNoaXBzIHdpdGggYSBsb3Qgb2YgY29udGVudCBvdXQgb2YgdGhlIGJveC4gSXQgaW5jbHVkZXMKLSAgdGhlIE9wZW5VUCBmcmFtZXdvcmsgYW5kIHZhcmlvdXMgcGx1Zy1pbnMgZXh0ZW5kaW5nCi0gIE9wZW5VUC9CYXNpYyB3aXRoIGRvbWFpbi1zcGVjaWZpYyBhZGRpdGlvbnMuIE5vIG9yZ2FuaXphdGlvbiBvciBwcm9qZWN0IHJlcXVpcmVzIGFsbCBvZiB0aGlzCi0gIGRvY3VtZW50YXRpb24gYWxsIGF0IG9uY2UsIGJ1dCB3b3VsZCB3b3JrIHdpdGggYSBzZWxlY3Rpb24gb2Ygc3BlY2lmaWMgc3Vic2V0cy48L3A+Ci08cD4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKSBtYW5hZ2VzIGZvciB0aGF0IHB1cnBvc2Ugc28tY2FsbGVkIG1ldGhvZAotICBjb25maWd1cmF0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIHNwZWNpZnkgd29ya2luZyBzZXRzIG9mIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotICBmb3IgYSBzcGVjaWZpYyBjb250ZXh0LCBzdWNoIGFzIGEgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgT3BlblVQIGZyYW1ld29yayB0aGF0Ci0gIHlvdSB3YW50IHRvIHB1Ymxpc2ggYW5kIGRlcGxveSBmb3IgYSBnaXZlbiBzb2Z0d2FyZSBwcm9qZWN0IG9yIGFzIGEgZm91bmRhdGlvbgotICBmb3IgYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24uIEFsbCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIGFyZSBvcmdhbml6ZWQKLSAgaW4gbWV0aG9kIHBsdWctaW5zLCB3aGljaCBhcmUgb3JnYW5pemVkIGludG8gbWV0aG9kIHBhY2thZ2VzLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGlzIHNpbXBseSBhIHNlbGVjdGlvbiBvZiB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L3A+Ci08cD48aW1nIHNyYz0iY29uZi5naWYiIHdpZHRoPSI2NjUiPjwvcD4KLTxwPllvdSBjcmVhdGUgYW5kIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBkZXBpY3RlZAotICBpbiB0aGUgZmlndXJlIGFib3ZlLiBZb3UgY291bGQgc3RhcnQgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgYnkgY29weWluZyBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgc2hpcCB3aXRoIEVQRiBDb21wb3NlciBhbmQgbW9kaWZ5IGl0IHRvIGZpdAotICB5b3VyIHNwZWNpZmljIG5lZWRzLiBZb3UgY2FuIGFkZCBvciByZW1vdmUgd2hvbGUgbWV0aG9kIHBsdWctaW5zIGFzIHdlbGwgYXMKLSAgbWFrZSBzZWxlY3Rpb24gd2l0aCBlYWNoIHBsdWctaW4gYnkgY2hlY2tpbmcgb3IgdW4tY2hlY2tpbmcgcGFja2FnZXMuIDwvcD4KLTxwPiBZb3UgY2FuIHVzZSB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gYXMgeW91ciB3b3JraW5nIHNldCBmb3IgeW91ciBFUEYgQ29tcG9zZXIKLSAgd29yay4gVGhlIGFjdHVhbCBjb250ZW50IG9mIHRoZSBjb25maWd1cmF0aW9uLCBpLmUuIHRoZSBpbmNsdWRlZCBtZXRob2QgY29udGVudAotICBhbmQgcHJvY2VzcyBlbGVtZW50cyBhcmUgYWx3YXlzIGFjY2Vzc2libGUgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4gVXNlIHRoZQotICBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIgdG8gc2VsZWN0IHRoZSBjdXJyZW50bHkgdXNlZCBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08aDM+UHVibGlzaGluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIHRoZSBiYXNpcyBmb3IgcHVibGlzaGluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotICBBIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGFuIGh0bWwgV2ViIHNpdGUgdGhhdCBwcmVzZW50cyBhbGwgdGhlIG1ldGhvZAotICBjb250ZW50IGFuZCBwcm9jZXNzZXMgb2YgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbmF2aWdhYmxlIGFuZCBzZWFyY2hhYmxlCi0gIHdheS4gSXQgdXNlcyB0aGUgcmVsYXRpb25zaGlwcyBlc3RhYmxpc2hlZCBkdXJpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3MKLSAgYXV0aG9yaW5nIHRvIGdlbmVyYXRlIGh5cGVybGlua3MgYmV0d2VlbiBlbGVtZW50cyBhcyB3ZWxsIGFzIHByb3ZpZGVzIHRyZWUKLSAgYnJvd3NlcnMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgdXNlci1kZWZpbmVkIGNhdGVnb3JpemF0aW9ucyBvZgotICB0aGUgY29udGVudC4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBhbiBleGFtcGxlIG9mIHRoZSBwdWJsaXNoZWQgJ0NsYXNzaWMgUlVQJwotICBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08cD48aW1nIHNyYz0icHViLmdpZiIgd2lkdGg9IjU1MCI+PC9wPgotPHA+Rm9yIHB1Ymxpc2hpbmcgc2ltcGx5IGNyZWF0ZSBhbmQgc2VsZWN0IGEgY29uZmlndXJhdGlvbi4gVGhlIHB1YmxpY2F0aW9uIHdpemFyZAotICB3aWxsIGRvIHRoZSByZXN0IGZvciB5b3UgYW5kIG9ubHkgcHVibGlzaCBjb250ZW50IHRoYXQgaXMgcGFydCBvZiB0aGUgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IGFkb3B0IGNvbnRlbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAgc3VjaCBhcyByZW1vdmluZwotICByZWZlcmVuY2VzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIHRvIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgb3IgcmVtb3ZpbmcgYWN0aXZpdGllcyBmcm9tIHlvdXIgcHJvY2Vzc2VzIHRoYXQgb25seSBjb250YWluIHdvcmsgZGVmaW5lZCBvdXRzaWRlCi0gIG9mIHRoZSBjb25maWd1cmF0aW9uIHNldC4gSGVuY2UsIHB1Ymxpc2hpbmcgd2lsbCBvbmx5IGluY2x1ZGUgdGhlIGNvbnRlbnQgdGhhdAotICB5b3UgcmVhbGx5IG5lZWQuIFlvdSBjYW4gYWx3YXlzIHByZXZpZXcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiB1c2luZyBFUEYgQ29tcG9zZXIncwotYnJvd3NpbmcgcGVyc3BlY3RpdmUuPC9wPgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNjE5MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbmZpZ3VyYXRpb24gVmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJsaWJyYXJ5dmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb252aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNvbmZpZ3VyYXRpb24gVmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY29uZmlndXJhdGlvbnZpZXciPjxhIG5hbWU9ImNvbmZpZ3VyYXRpb252aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29uZmlndXJhdGlvbiBWaWV3PC9oMT4KLTxkaXY+PHA+VGhlIENvbmZpZ3VyYXRpb24gdmlldyBzaG93cyB0aGUgY29udGVudCBlbGVtZW50cyBpbiBhIGxpYnJhcnkgZmlsdGVyZWQKLWJ5IGEgY29uZmlndXJhdGlvbi4gPC9wPgotPHA+QSBjb25maWd1cmF0aW9uIGlzIGEgc3Vic2V0IG9mIHRoZSA8YSBocmVmPSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sI3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Ij5tZXRob2QgbGlicmFyeTwvYT4gY29udGVudC4gT25jZSBhIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQKLWluIHRoZSBDb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3gsIHRoZSBDb25maWd1cmF0aW9uIHZpZXcgaXMgcmVmcmVzaGVkIHdpdGgKLXRoZSBjb250ZW50IGZyb20gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIFRoZSBjb250ZW50IGluIHRoZSBDb25maWd1cmF0aW9uCi12aWV3IGlzIGFsd2F5cyBwcmVzZW50ZWQgaW4gdGhlIHNhbWUgd2F5IGluIHN0YW5kYXJkIGNhdGVnb3JpZXMsIHByb2Nlc3NlcywKLWN1c3RvbSBjYXRlZ29yaWVzLCBhbmQgZ3VpZGFuY2UuIFRoZSBDb25maWd1cmF0aW9uIHZpZXcgZG9lcyBub3Qgc2hvdyBhbnkKLXBoeXNpY2FsIGZvbGRlcnMuIEZvbGRlcnMgYXJlIG9ubHkgc2hvd24gaW4gdGhlIExpYnJhcnkgdmlldy48L3A+Ci08cD48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCI+TGlicmFyeSBWaWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29udHJpYnV0ZXMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbnRyaWJ1dGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDFiYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29udHJpYnV0ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbnRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHRlbmRzLmh0bWwjZXh0ZW5kcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icmVwbGFjZS5odG1sI3JlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbnRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNvbnRyaWJ1dGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb250cmlidXRlcyI+PGEgbmFtZT0iY29udHJpYnV0ZXMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db250cmlidXRlczwvaDE+Ci08ZGl2PjxwPkEgY29udHJpYnV0aW5nIGVsZW1lbnQgYWRkcyB0byB0aGUgYmFzZSBlbGVtZW50LiBDb250cmlidXRlcyBwcm92aWRlcyBhCi13YXkgZm9yIGVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgZWxlbWVudCB3aXRob3V0Ci1kaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIHN1Y2ggYXMgaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4KLVRoZSBlZmZlY3QsIGFmdGVyIGNvbnRyaWJ1dGlvbiwgaXMgdGhhdCB0aGUgYmFzZSBlbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZAotd2l0aCBhbiBlbGVtZW50IHRoYXQgY29tYmluZXMgdGhlIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyBvZiB0aGUgY29udHJpYnV0aW5nCi1lbGVtZW50IHdpdGggdGhlIGJhc2UgZWxlbWVudC48L3A+Ci08cD5Vc2UgdGhlIENvbnRlbnQgVmFyaWFiaWxpdHkgc2VjdGlvbiBvbiB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIG1ha2UgYW4gZWxlbWVudAotY29udHJpYnV0ZSB0byBhbm90aGVyIGVsZW1lbnQuIFNlbGVjdCA8c3Ryb25nPkNvbnRyaWJ1dGVzPC9zdHJvbmc+IGFzIHRoZSBWYXJpYWJpbGl0eQotdHlwZSBhbmQgdGhlbiBzZWxlY3QgdGhlIGJhc2UgZWxlbWVudCB0byB3aGljaCB0aGlzIGVsZW1lbnQgd2lsbCBjb250cmlidXRlLgotVGhlIGJhc2UgZWxlbWVudCBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudCBhcyB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQuPC9wPgotPHA+QW55IGluZm9ybWF0aW9uIHlvdSBlbnRlciBpbiB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGJhc2UKLWVsZW1lbnQuIFRleHQgZmllbGRzIGluIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBhcmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUKLXJlc3BlY3RpdmUgdGV4dCBmaWVsZHMgaW4gdGhlIGJhc2UgZWxlbWVudC48L3A+Ci08cD5Db250cmlidXRpb24gb25seSBhZGRzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyB0byB0aGUgYmFzZS4gSXQgbmV2ZXIKLW92ZXJyaWRlcyBvciByZXBsYWNlcyBhbnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFzZS4gSW4gb3RoZXIgd29yZHMsIGlmIHRoZQotYmFzZSBpcyBhbGxvd2VkIGFuIGFzc29jaWF0aW9uIHRvIGV4YWN0bHkgb25lIG90aGVyIGVsZW1lbnQgYW5kIGhhcyB0aGlzIG9uZQotYWxyZWFkeSBkZWZpbmVkLCBpdCBpcyBub3QgYmVpbmcgcmVwbGFjZWQgYnkgYSBjb250cmlidXRvcidzIGFzc29jaWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+Q29udHJpYnV0aW9uIHJ1bGVzOjwvc3Ryb25nPjx1bD48bGk+QXR0cmlidXRlcyBhcmUgYXBwZW5kZWQgZXhjZXB0IGZvciBpZGVudGlmeWluZy9uYW1pbmcgYXR0cmlidXRlcyBhbmQgbm9uLXN0cmluZwotYXR0cmlidXRlcyBzdWNoIGFzIGJvb2xlYW4sIGRhdGUsIGV0Yy48L2xpPgotPGxpPk91dGdvaW5nIHRvLW9uZSBhc3NvY2lhdGlvbnMgb2YgdGhlIGNvbnRyaWJ1dG9yIGFyZSBpZ25vcmVkIGlmIHRoZSBiYXNlCi1hbHJlYWR5IGhhcyBzdWNoIGFuIGFzc29jaWF0aW9uIG9yIGlmIHRoZSBiYXNlIGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgY29udHJpYnV0aW5nCi1lbGVtZW50IChpLmUuIGl0IGNhbm5vdCBiZSBkZWNpZGVkIHdoaWNoIGNvbnRyaWJ1dGlvbiBzaG91bGQgYmUgY2hvc2UsIHRoZW4KLW5vbmUgd2lsbCBiZSBjaG9zZW4pLjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBiYXNlIGVsZW1lbnRzIG9mIGEgY29udHJpYnV0aW9uLjwvbGk+Ci08bGk+SW5jb21pbmcgYXNzb2NpYXRpb25zIHRvIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCB3aXRoIGEgdG8tb25lIGNvbnN0cmFpbnQKLW9uIHRoZSBvdGhlciBhc3NvY2lhdGlvbiBlbmQgYXJlIGlnbm9yZWQgaWYgdGhlIGJhc2UgYWxyZWFkeSBoYXMgc3VjaCBhbiBpbmNvbWluZwotYXNzb2NpYXRpb24gb3IgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjb250cmlidXRpb24gdG8gY29uc2lkZXIgZm9yIHRoZQotYmFzZSBlbGVtZW50LjwvbGk+Ci08bGk+T3RoZXIgaW5jb21pbmcgYXNzb2NpYXRpb25zIHRvIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBhcmUgYWRkZWQgdG8gdGhlCi1iYXNlIGVsZW1lbnRzIG9mIGEgY29udHJpYnV0aW9uLjwvbGk+Ci08bGk+QSBiYXNlIGVsZW1lbnQgb2YgYSBjb250cmlidXRpb24gY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBjb250cmlidXRvcjwvbGk+Ci08bGk+Q29udHJpYnV0aW9uIHdvcmtzIHRyYW5zaXRpdmVseSwgaS5lLiBhIGNvbnRyaWJ1dGlvbiBlbGVtZW50IGNvbnRyaWJ1dGVzCi1pdHMgb3duIGNvbnRyaWJ1dG9ycy48L2xpPgotPC91bD4KLVNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IHRvIGZpbmQgdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCBlbGVtZW50Ci10eXBlLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImV4dGVuZHMuaHRtbCNleHRlbmRzIj5FeHRlbmRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiPlJlcGxhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvcHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNmRmZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29weS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjU4YjhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVjb250ZW50cGFja2FnZSI+PGEgbmFtZT0iY3JlYXRlY29udGVudHBhY2thZ2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5NZXRob2QgY29udGVudCBpcyBvcmdhbml6ZWQgaW50byBjb250ZW50IHBhY2thZ2VzIHdoaWNoLCBpbiB0dXJuLAotYXJlIGNvbnRhaW5lZCBpbiBtZXRob2QgcGx1Zy1pbnMuPC9wPgotQmVmb3JlIGNyZWF0aW5nIGEgY29udGVudCBwYWNrYWdlLCB5b3UKLXNob3VsZCBjcmVhdGUgYSBtZXRob2QgcGx1Zy1pbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IHNob3VsZCBhbHdheXMgY3JlYXRlIGEgbmV3IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+IGFuZCA8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4gaW4gYSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPiB0aGF0Ci15b3UgcHJvZHVjZS4gVGhpcyBzZXBhcmF0ZXMgeW91ciBjb250ZW50IGZyb20gb3JpZ2luYWwgY29udGVudCBzaGlwcGVkIHdpdGgKLXRoZSB0b29sIGFuZCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IGxpYnJhcnkgcmVsZWFzZXMKLXdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdQotY2Fubm90IGNyZWF0ZSBhIG5ldyBjb250ZW50IHBhY2thZ2Ugb3IgYW55IG90aGVyIGVsZW1lbnQgaW4gYSBsb2NrZWQgcGx1Zy1pbi48L2Rpdj4KLTxwPlRvCi1jcmVhdGUgYSBjb250ZW50IHBhY2thZ2U6PC9wPgotPC9kaXY+Ci08b2w+PGxpPjxzcGFuPkZpbmQgeW91ciBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5EcmlsbCBpbnRvIHRoZSBwbHVnLWluIHRvIGxvY2F0ZSB0aGUgcGFja2FnZSBjYWxsZWQgPHN0cm9uZz5Db250ZW50Ci1QYWNrYWdlczwvc3Ryb25nPi4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGFsbCBwYWNrYWdlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4KLW1ldGhvZCBlbGVtZW50cy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5SaWdodCBjbGljayB0aGUgY29udGVudCBwYWNrYWdlIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IENvbnRlbnQKLVBhY2thZ2U8L3N0cm9uZz4uIFRoZSBjb250ZW50IHBhY2thZ2UgZWRpdG9yIGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+VW5kZXIgR2VuZXJhbCBJbmZvcm1hdGlvbiwgZ2l2ZSB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZSBhIHVuaXF1ZQotbmFtZSBhbmQgcHJvdmlkZSBhIGJyaWVmIGRlc2NyaXB0aW9uLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNhdmUgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UgaW4gb25lIG9mIHRocmVlIHdheXM6PC9zcGFuPjxvbCB0eXBlPSJhIj48bGk+PHNwYW4+Q2xpY2sgdGhlIGRpc2sgaWNvbiBpbiB0aGUgdG9vbGJhci48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TZWxlY3QgPHN0cm9uZz5GaWxlICZndDsgU2F2ZTwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TaW1wbHkgY2xvc2UgdGhlIGNvbnRlbnQgZWRpdG9yLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSB0b29sIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBub2RlcyBmb3IgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2s8L2E+LCA8YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZTwvYT4sIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT4sIGFuZCA8YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT4gdW5kZXIgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UuPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkZWYyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+PGEgbmFtZT0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5BIERlbGl2ZXJ5IFByb2Nlc3MgZGVzY3JpYmVzIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2gKLWZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgdHlwZSBvZiBwcm9qZWN0LiBBIERlbGl2ZXJ5IFByb2Nlc3MgZGVzY3JpYmVzIHdoYXQKLWlzIHByb2R1Y2VkLCBob3cgaXQgaXMgcHJvZHVjZWQgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBmb3IgdGhlIGVudGlyZSBwcm9qZWN0Ci1saWZlY3ljbGUuPC9wPgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGNyZWF0ZWQgZm9yIGEgcGFydGljdWxhciB0eXBlIG9mIHByb2plY3QKLXRvIHJlZmxlY3QgdGhlIHNwZWNpZmljIHBsYW5uaW5nIGFuZCBwcm9qZWN0IG1hbmFnZW1lbnQgbmVlZHMuIDxwPkJlZm9yZQotY3JlYXRpbmcgYSBkZWxpdmVyeSBwcm9jZXNzOjwvcD4KLTx1bD48bGk+U2VsZWN0IGEgbWV0aG9kIHBsdWctaW4gdG8gaG9sZCB5b3VyIHByb2Nlc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4uPC9saT4KLTxsaT5GaW5kIG9yIGNyZWF0ZSBhIHByb2Nlc3MgcGFja2FnZS48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBwb3B1bGF0ZSBhIHByb2Nlc3Mgd2l0aCBtZXRob2QgZWxlbWVudHM6PHVsPjxsaT5CeSBpbmNvcnBvcmF0aW5nIGluZGl2aWR1YWwgbWV0aG9kIGVsZW1lbnRzIGJ5IGRyYWdnaW5nIHRoZSBlbGVtZW50cyBvbnRvCi1hbiBhY3Rpdml0eSBpbiB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPkJ5IGluY2x1ZGluZyBhbHJlYWR5IGRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucy48L2xpPgotPGxpPkJ5IGluY2x1ZGluZyBwYXJ0cyBvZiBhbHJlYWR5IGRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucy48L2xpPgotPGxpPkJ5IGNyZWF0aW5nIGRlc2NyaXB0b3JzIGRpcmVjdGx5IGluIHRoZSBwcm9jZXNzLCB3aGljaCBhcmUgZWl0aGVyIHVucmVsYXRlZAotdG8gYW55IG1ldGhvZCBjb250ZW50IG9yIHJlbGF0ZWQgdG8gbWV0aG9kIGNvbnRlbnQgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLjwvbGk+Ci08L3VsPgotVG8gY3JlYXRlIGEgRGVsaXZlcnkgUHJvY2Vzczo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uY2UgeW91IGhhdmUgc2VsZWN0ZWQgb3IgY3JlYXRlZCBhIHByb2Nlc3MgcGFja2FnZSwgcmlnaHQgY2xpY2sKLXRoZSBwcm9jZXNzIHBhY2thZ2UuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+TmV3ICZndDsgRGVsaXZlcnkgUHJvY2Vzczwvc3Ryb25nPi4gVGhlIE5ldyBQcm9jZXNzIENvbXBvbmVudAotZGlhbG9nIGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBuYW1lIGZvciB0aGUgZGVsaXZlcnkgcHJvY2VzcyBpbnRvIHRoZSA8c3Ryb25nPk5hbWU8L3N0cm9uZz4gZmllbGQKLWFuZCB0aGVuIHNlbGVjdCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkcm9wIGRvd24gbGlzdC4gWW91ciBwcm9jZXNzCi1jYW4gY29udGFpbiBjb250ZW50IGZyb20gbWFueSBkaWZmZXJlbnQgbWV0aG9kIHBsdWctaW5zLiBmb3IgdGhpcyByZWFzb24geW91Ci1uZWVkIHRvIGRlZmluZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSB2aXNpYmxlIHNldCBvZiBlbGVtZW50cyBhbmQKLXJlbGF0aW9uc2hpcHMgd2hlbiB0aGUgcHJvY2VzcyBpcyBhdXRob3JlZC4gVGhpcyBwcm9jZXNzIGF1dGhvcmluZyBjb25maWd1cmF0aW9uCi1pcyByZWZlcnJlZCB0byBhcyB0aGUgRGVmYXVsdCBDb25maWd1cmF0aW9uIGZvciB0aGUgcHJvY2VzcyBhbmQgc2hvdWxkIGRlZmluZQotdGhlIGxhcmdlc3QgcmVhc29uYWJsZSBzZXQgb2YgbWV0aG9kIHBsdWctaW5zLCBjb250ZW50IHBhY2thZ2VzLCBhbmQgb3RoZXIKLXByb2Nlc3NlcyBmcm9tIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdpbGwgYmUgcmVmZXJyZWQgdG8gYnkgdGhlIHByb2Nlc3MKLWF0IHNvbWUgcG9pbnQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHRoZSBwcm9jZXNzIGVkaXRvcgotaXMgb3BlbmVkLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmIHRoZSBQcm9wZXJ0aWVzIHdpbmRvdyBvcGVucyB0byB0aGUgcmlnaHQgb2YKLXRoZSBwcm9jZXNzIGVkaXRvciwgY2xpY2sgdGhlIDxzdHJvbmc+eDwvc3Ryb25nPiB0byBjbG9zZSBpdC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBwcm9jZXNzIGVkaXRvciwgdW5kZXIgdGhlIERlc2NyaXB0aW9uIHRhYiwgZG9jdW1lbnQgeW91cgotcHJvY2VzcyB1c2luZyB0aGUgYXZhaWxhYmxlIHRleHQgZmllbGRzLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZQotUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyIHRoZSB0ZXh0IGZvciBhbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkKLXN5bWJvbCA8aW1nIHNyYz0iY29sbGFwc2VkLmdpZiIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sgdGhlIHN5bWJvbAotdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUgc3ltYm9sIGFnYWluIHRvIGNsb3NlIHRoZSBSaWNoIFRleHQKLUVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+PC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EZWNpZGUgb24geW91ciBwcmltYXJ5IHByb2Nlc3MgYXV0aG9yaW5nIHZpZXcuIFlvdSBkZXZlbG9wIGEgcHJvY2VzcwotdXNpbmcgdGhyZWUgZGlmZmVyZW50IHZpZXdzOjwvc3Bhbj48dWw+PGxpPjxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9zdHJvbmc+OiBEZWZpbmUgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUKLWluIHlvdXIgcHJvY2Vzcy4gQ3JlYXRlIGl0ZXJhdGlvbnMgYW5kIGFjdGl2aXRpZXMgZmlyc3QsIGFuZCB0aGVuIHBvcHVsYXRlCi15b3VyIGFjdGl2aXRpZXMgYnkgYXBwbHlpbmcgdGFza3MgZnJvbSB5b3VyIE1ldGhvZCBDb250ZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotc2VlIDxhIGhyZWY9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+VGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggdGVhbXMgYW5kIHJvbGVzIHNoYWxsIHBhcnRpY2lwYXRlCi1pbiBhY3Rpdml0aWVzIGFuZCB0aGVuIGZpbmQgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBhbmQgdGFza3MgZnJvbSB0aGVyZS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggd29yayBwcm9kdWN0cyBzaG91bGQgYmUgY3JlYXRlZAotaW4gYWN0aXZpdGllcyBhbmQgZmluZCB0YXNrcyBhbmQgcm9sZXMgZnJvbSB0aGVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+PGEgaHJlZj0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cyB0byB0aGUgZGVsaXZlcnkgcHJvY2Vzcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCI+RGVsaXZlcnkgUHJvY2VzczwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwcm9jZXNzLmh0bWwjcHJvY2VzcyI+UHJvY2VzczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmJhNDY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIj48YSBuYW1lPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSBtZXRob2QgY29uZmlndXJhdGlvbiBhbGxvd3MgeW91IHRvIHNlbGVjdCBhbmQgZGVzZWxlY3QgZnJvbSB0aGUKLWNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3MgYXZhaWxhYmxlIGluIHRoZSBtZXRob2QgbGlicmFyeSdzIHNldCBvZiBwbHVnLWlucy4KLVRoZSBzZWxlY3Rpb25zIHlvdSBtYWtlIGhlbHAgeW91IG5hcnJvdyBkb3duIHRoZSBjb250ZW50IHlvdSBhcmUgcmVhbGx5IGludGVyZXN0ZWQKLWluIHdvcmtpbmcgd2l0aCwgYXMgd2VsbCBhcyBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgdGhlIFdlYiBzaXRlIHlvdSB1bHRpbWF0ZWx5Ci1wdWJsaXNoIHRvIGRlcGxveSB5b3VyIHByb2Nlc3MuIEEgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBhIG5hbWUgYW5kIHRoZW4gc2F2ZWQKLXNvIGl0IGNhbiBiZSBjaGFuZ2VkIGFuZCB0aGVuIHJlLXB1Ymxpc2hlZCBhdCBhIGxhdGVyIGRhdGUuPC9wPgotQmVmb3JlIGNyZWF0aW5nCi1hIG1ldGhvZCBjb25maWd1cmF0aW9uLCBhc3Nlc3MgeW91ciBuZWVkcyBhbmQgZ29hbHMgZm9yIHRoZSBjb25maWd1cmF0aW9uLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlcmUgYXJlIHR3byB3YXlzIHRvIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uOjxhIG5hbWU9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uX19jcmVhdGUiPjwhLS0gLS0+PC9hPjx1bCBpZD0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb25fX2NyZWF0ZSI+PGxpPkNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbiBmcm9tIHNjcmF0Y2guPC9saT4KLTxsaT5DcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uPC9saT4KLTwvdWw+Ci08c3Ryb25nPlRvIGNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbiBmcm9tIHNjcmF0Y2g6PC9zdHJvbmc+PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5NYWtlIHN1cmUgeW91IGFyZSB3b3JraW5nIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTGlicmFyeSB2aWV3LCByaWdodCBjbGljayB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uczwvc3Ryb25nPiBmb2xkZXIKLWFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IE1ldGhvZCBDb25maWd1cmF0aW9uPC9zdHJvbmc+LiBZb3VyIG5ldyBjb25maWd1cmF0aW9uCi1pcyBjcmVhdGVkIGFuZCB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgaXMgb3BlbmVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3Igd2luZG93LCB0eXBlIGEgbmFtZSBmb3IgeW91ciBjb25maWd1cmF0aW9uCi1pbiB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkLiBJZiB5b3UgY2xpY2sgYW55d2hlcmUgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gb3IgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiwgeW91Ci13aWxsIGJlIGFibGUgdG8gc2VlIHlvdXIgbmV3IGNvbmZpZ3VyYXRpb24gbmFtZSBpbiB0aGUgQ29uZmlndXJhdGlvbnMgZm9sZGVyCi1pbiB0aGUgTGlicmFyeSB2aWV3IHRyZWUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBkZXNjcmlwdGlvbiBmb3IgeW91ciBjb25maWd1cmF0aW9uIGluIHRoZSBEZXNjcmlwdGlvbiBmaWVsZCwKLWFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlIEFsbDwvc3Ryb25nPiB0byBzYXZlIHlvdXIgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BdCB0aGUgYm90dG9tIG9mIHRoZSBlZGl0b3Igd2luZG93LCBjbGljayB0aGUgPHN0cm9uZz5QbHVnLWluIGFuZCBQYWNrYWdlCi1TZWxlY3Rpb248L3N0cm9uZz4gdGFiLiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBzZWN0aW9uIGRpc3BsYXlzIGEgbGlzdCBvZiBhbGwKLW1ldGhvZCBwbHVnLWlucyB0aGVpciBjb250ZW50IHBhY2thZ2VzIGFuZCBwcm9jZXNzZXMuIFVzZSB0aGUgY2hlY2sgYm94ZXMKLXRvIGFkZCBvciByZW1vdmUgcGx1Zy1pbnMsIHBhY2thZ2VzLCBhbmQgcHJvY2Vzc2VzIHRvIG9yIGZyb20geW91ciBjb25maWd1cmF0aW9uLgotRXhwYW5kIGVhY2ggcGx1Zy1pbiB0byBzZWxlY3QgYW5kIGRlc2VsZWN0IGluZGl2aWR1YWwgcGFja2FnZXMgYW5kIHByb2Nlc3Nlcy48L3NwYW4+IDxwPkFzIHlvdSBtYWtlIHlvdXIgc2VsZWN0aW9ucywgd2FybmluZyBzaWducyBtYXkgYXBwZWFyIGFnYWluc3QKLXNvbWUgb2YgdGhlIHBsdWctaW4gYW5kIHBhY2thZ2UgbmFtZXMsIGFuZCB0aGUgQ29uZmlndXJhdGlvbiBXYXJuaW5nIExvZyB2aWV3Ci1tYXkgYmUgZGlzcGxheWVkLiBUaGVzZSB3YXJuaW5ncyBhcmUgaW50ZW5kZWQgdG8gaGVscCBlbnN1cmUgdGhhdCB5b3UgY3JlYXRlCi1hIGNvbmZpZ3VyYXRpb24gdGhhdCAibWFrZXMgc2Vuc2UiLjwvcD4KLTxwPklmIHlvdSByZWZlcmVuY2UgYW4gZWxlbWVudCBpbiBhCi1wYWNrYWdlIHRoYXQgaXMgZnJvbSBhbm90aGVyIHBhY2thZ2UsIHlvdSBjYW4gb25seSBzZWUgdGhlIGZ1bGwgZGV0YWlscyBmb3IKLXRoYXQgZWxlbWVudCBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZSBpZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBlbGVtZW50Ci1pcyBpbiB0aGUgY29uZmlndXJhdGlvbi4gSWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlCi1jb25maWd1cmF0aW9uLCB0aGUgIm9mZmVuZGluZyIgcGFja2FnZSBpcyBtYXJrZWQgd2l0aCBhIHdhcm5pbmcgc2lnbi4gWW91Ci1tYXkgY2hvb3NlIG5vdCB0byBpbmNsdWRlIHRoZSBmdWxsIGRldGFpbHMgb2YgYSByZWZlcmVuY2VkIGVsZW1lbnQuIENsaWNrCi10aGUgPHN0cm9uZz5BZGQgTWlzc2luZyBSZWZlcmVuY2VzPC9zdHJvbmc+IGJ1dHRvbiB0byBhdXRvbWF0aWNhbGx5IGFuZCByZWN1cnNpdmVseQotYWRkIHBhY2thZ2VzIGNvbnRhaW5pbmcgYW55IGVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gYWxyZWFkeSBzZWxlY3RlZAotcGFja2FnZXMuIFNpbmNlIHRoaXMgaXMgcmVjdXJzaXZlLCBhIGxhcmdlIG51bWJlciBvZiBwYWNrYWdlcyBtYXkgYmUgYWRkZWQsCi1wZXJoYXBzIG1ha2luZyB5b3VyIGNvbmZpZ3VyYXRpb24gbGFyZ2VyIHRoYW4geW91IHdhbnQgaXQgdG8gYmUuPC9wPgotPHA+SWYKLXlvdSBoYXZlIGVsZW1lbnRzIGluIGEgcGFja2FnZSB0aGF0IGNvbnRyaWJ1dGUgdG8sIGV4dGVuZCwgb3IgcmVwbGFjZSBlbGVtZW50cwotaW4gYW5vdGhlciBwYWNrYWdlLCBpdCBpcyBhbiBlcnJvciBpZiB0aGUgYmFzZSBwYWNrYWdlIGlzIG5vdCBpbmNsdWRlZCBpbgotdGhlIGNvbmZpZ3VyYXRpb24uIEVycm9ycyBhcmUgbWFya2VkIHdpdGggYSByZWQgY3Jvc3MuIElmIHlvdSBkcmlsbCBkb3duIGludG8KLWEgcGx1Zy1pbiBvciBwYWNrYWdlIG1hcmtlZCB3aXRoIGEgY3Jvc3MgeW91IHdpbGwgZGlzY292ZXIgdGhlICJvZmZlbmRpbmciCi1wYWNrYWdlIGFuZCB0aGVuIHlvdSBjYW4gZmluZCB0aGUgcGFja2FnZXMgeW91IG5lZWQgdG8gaW5jbHVkZSB0byByZXNvbHZlCi10aGUgZXJyb3IuIEFsdGVybmF0aXZlbHkgeW91IGNhbiBjbGljayB0aGUgPHN0cm9uZz5NYWtlIGNsb3N1cmUgYnkgZml4aW5nIGVycm9yczwvc3Ryb25nPiBidXR0b24KLXRvIGF1dG9tYXRpY2FsbHkgZml4IHRoZSBlcnJvcnMgYnkgYWRkaW5nIHRoZSBtaXNzaW5nIGJhc2UgcGFja2FnZXMuPC9wPgotPHA+VGhlCi1Db25maWd1cmF0aW9uIFdhcm5pbmcgTG9nIGxpc3RzIGFuZCBleHBsYWlucyBhbGwgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUKLWNvbmZpZ3VyYXRpb24uPC9wPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgQWxsPC9zdHJvbmc+PC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRlZmluZSB0aGUgdmlld3MgZm9yIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4gQSB2aWV3IGlzIGEgbmF2aWdhdGlvbgotdHJlZSBicm93c2VyIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uIEV2ZXJ5IHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGNhbgotaGF2ZSBzZXZlcmFsIHZpZXdzIHRoYXQgYXJlIGRpc3BsYXllZCBhcyBzdGFja2VkIHRyZWUgYnJvd3NlciB0YWJzLiBUaGUgc3RydWN0dXJlCi1vZiB0aGUgdmlldyBpcyBkZWZpbmVkIGFzIGEgQ3VzdG9tIENhdGVnb3J5Ljwvc3Bhbj48b2wgdHlwZT0iYSI+PGxpPjxzcGFuPkluIHRoZSBDb25maWd1cmF0aW9uIEVkaXRvciwgY2xpY2sgdGhlIDxzdHJvbmc+Vmlld3M8L3N0cm9uZz4gdGFiLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkFkZCBWaWV3PC9zdHJvbmc+IGJ1dHRvbi4gVGhlIFNlbGVjdCBDYXRlZ29yaWVzIGRpYWxvZwotYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JZiBuZWVkZWQsIGNsaWNrIHRoZSAoKykgc2lnbiB0byBleHBhbmQgdGhlIEN1c3RvbSBDYXRlZ29yaWVzCi1mb2xkZXIgYW5kIHRoZW4gc2VsZWN0IHRoZSBjYXRlZ29yeSB5b3Ugd2FudCB0byB1c2UgYXMgeW91ciB2aWV3LiBDbGljayB0aGUKLSgrKSBzaWduIHRvIGV4cGFuZCB5b3VyIGNob3NlbiBjYXRlZ29yeSBhbmQgdmlldyBpdCdzIGNvbnRlbnRzLiBQcmVzcyBhbmQKLWhvbGQgdGhlIENUUkwga2V5IHRvIHNlbGVjdCBtdWx0aXBsZSB2aWV3cy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgZGlhbG9nIHdpbmRvdyBkaXNhcHBlYXJzIGFuZCB0aGUgdmlld3MKLXlvdSBzZWxlY3RlZCBhcmUgYWRkZWQgdG8gdGhlIENvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSB2aWV3IHlvdSB3YW50IHRvIGRpc3BsYXkgYXMgeW91ciBjb25maWd1cmF0aW9uJ3Mgc3RhcnQtdXAKLXZpZXcgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+TWFrZSBEZWZhdWx0PC9zdHJvbmc+IGJ1dHRvbi4gVGhlIHN0YXJ0LXVwIHZpZXcgaXMgdGhlCi1maXJzdCB2aWV3IHNob3duIHdoZW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBkaXNwbGF5ZWQgZm9yIHRoZSBmaXJzdAotdGltZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgU2F2ZSBhbGw8L3N0cm9uZz4gdG8gc2F2ZSB5b3VyIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHN0cm9uZz5UbyBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb248L3N0cm9uZz46PG9sPjxsaT5NYWtlIHN1cmUgeW91IGFyZSB3b3JraW5nIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+LjxwPjwvcD4KLTwvbGk+Ci08bGk+SW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sCi1leHBhbmQgdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlci48cD48L3A+Ci08L2xpPgotPGxpPiBSaWdodCBjbGljayB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24geW91IHdhbnQgdG8gY29weSBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNvcHk8L3N0cm9uZz4uPHA+PC9wPgotPC9saT4KLTxsaT5SaWdodCBjbGljayB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uczwvc3Ryb25nPiBmb2xkZXIgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5QYXN0ZTwvc3Ryb25nPi4KLVR5cGUgYSBuYW1lIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gaW4gdGhlIHBvcC11cCB3aW5kb3cuIFRoZSBjb3BpZWQgbWV0aG9kCi1jb25maWd1cmF0aW9uIGlzIHBhc3RlZCBpbnRvIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIuPHA+PC9wPgotPC9saT4KLTxsaT5Eb3VibGUgY2xpY2sgdGhlIG5ld2x5IHBhc3RlZCBtZXRob2QgY29uZmlndXJhdGlvbiB0byBvcGVuIGl0cyBjb25maWd1cmF0aW9uCi1lZGl0b3IuPHA+PC9wPgotPC9saT4KLTxsaT5Gb2xsb3cgc3RlcHMgMyB0aHJvdWdoIDEwIGluIDxzdHJvbmc+VG8gQ3JlYXRlIGEgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20KLVNjcmF0Y2g8L3N0cm9uZz4gYWJvdmUgdG8gY29udGludWUuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwiPk1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQ2MjMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2RwbHVnaW4uaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhbWV0aG9kcGx1Z2luIj48YSBuYW1lPSJjcmVhdGVhbWV0aG9kcGx1Z2luIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5NZXRob2QgUGx1Zy1pbnMgYWxsb3cgdGhlIGV4dGVuc2lvbiBvciBjdXN0b21pemF0aW9uIG9mIGJhc2UgbGlicmFyeQotY29udGVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIHRoYXQgYmFzZSBjb250ZW50IGJ5IGRlZmluaW5nIHRoZSBkaWZmZXJlbmNlcwotdG8gdGhlIGNvbnRlbnQuIFlvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgY29udGVudCBpbiBhIG1ldGhvZCBwbHVnLWluIHRoYXQKLXlvdSBwcm9kdWNlIHRvIHNlcGFyYXRlIHlvdXIgY29udGVudCBmcm9tIHRoZSBvcmlnaW5hbCBPcGVuVVAvQmFzaWMgY29udGVudC4gVGhpcwotYWxzbyBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IHJlbGVhc2VzIG9mIHRoZSBPcGVuVVAvQmFzaWMgTWV0aG9kCi1MaWJyYXJ5IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gUGx1Zy1pbnMKLXRoYXQgYXJlIHNoaXBwZWQgd2l0aCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGFyZSBsb2NrZWQgYW5kIHJlYWQtb25seS4KLVRoZXNlIHBsdWctaW5zIGFyZSBncmF5ZWQgb3V0IGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LCBpbmRpY2F0aW5nIHRoYXQgdGhleSBhcmUgbG9ja2VkLjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW46PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBiZWdpbiB0aGUgbWV0aG9kIHBsdWctaW4gY3JlYXRpb24gcHJvY2VzcyBpbiBvbmUgb2YgdHdvCi13YXlzOjwvc3Bhbj48dWw+PGxpPkNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE1ldGhvZCBQbHVnLWluPC9zdHJvbmc+LiBPciw8L2xpPgotPGxpPkluIHRoZSBMaWJyYXJ5IHZpZXcsIHJpZ2h0IGNsaWNrIGFuIGV4aXN0aW5nIHBsdWctaW4gYW5kIHNlbGVjdCA8c3Ryb25nPk5ldwotTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uPC9saT4KLTwvdWw+Ci0gVGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgb3BlbnMuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHlvdXIgbmV3IHBsdWctaW4gaW4gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZCBhbmQgdGhlbgotc2VsZWN0IGEgcGx1Z2luIGluIHRoZSA8c3Ryb25nPlJlZmVyZW5jZWQgUGx1Zy1pbnM8L3N0cm9uZz4gZmllbGQuIFRoZSBwbHVnLWluIHlvdSBjcmVhdGUKLWV4dGVuZHMgdGhlIHBsdWctaW4geW91IHNlbGVjdCBmcm9tIHRoZSBsaXN0IGFuZCBhbGxvd3MgeW91IHRvIHVzZSBjb250ZW50Ci1mcm9tIHRoZSBzZWxlY3RlZCBwbHVnLWluIGFzIHlvdSBjcmVhdGUgeW91ciBvd24gcGx1Zy1pbiBjb250ZW50Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Qcm92aWRlIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHBsdWctaW4gYW5kIGxpc3QgaXRzIGF1dGhvcnMKLXRvIGhlbHAgeW91IGFuZCBvdGhlcnMga2VlcCB0cmFjayBvZiB0aGUgcGx1Zy1pbnMgaW4gdGhlIGxpYnJhcnkuIFlvdSBjYW4KLXJldHVybiB0byBlZGl0IHRoaXMgaW5mb3JtYXRpb24gYXQgYW55IHRpbWUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+LiBZb3VyIG5ldyBwbHVnLWluIG5vdyBhcHBlYXJzIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IHdpdGggdGhlIG90aGVyCi1NZXRob2QgUGx1Zy1pbnMuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sIj5NZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIj5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVkYTVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIE1ldGhvZCBWaWV3IHdpdGggQ3VzdG9tIENhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InB1Ymxpc2hpbmdvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyI+PGEgbmFtZT0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIE1ldGhvZCBWaWV3IHdpdGggQ3VzdG9tIENhdGVnb3JpZXM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj5DdXN0b20gY2F0ZWdvcmllcyBhbGxvdyB5b3UgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGFjY29yZGluZyB0byBhbnkKLXNjaGVtZSB5b3Ugd2FudC4gQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHB1Ymxpc2hhYmxlCi12aWV3cywgcHJvdmlkaW5nIGEgbWVhbnMgdG8gb3JnYW5pemUgbWV0aG9kIGNvbnRlbnQgcHJpb3IgdG8gcHVibGlzaGluZy48cD5UbwotY3JlYXRlIGEgbmV3IGN1c3RvbSBjYXRlZ29yeTo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+U3dpdGNoIHRvIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPk9wZW4gdGhlIDxzdHJvbmc+TWV0aG9kIENvbnRlbnQ8L3N0cm9uZz4gZm9sZGVyIGluIHRoZSBtZXRob2QgcGx1Zy1pbiB3aGVyZQoteW91IHdhbnQgdG8gY3JlYXRlIHRoZSBjdXN0b20gY2F0ZWdvcnkuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIEN1c3RvbSBDYXRlZ29yaWVzIGZvbGRlciBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgQ3VzdG9tCi1DYXRlZ29yeTwvc3Ryb25nPi4gVGhlIGVkaXRvciB3aW5kb3cgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+UHJvdmlkZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VzdG9tIGNhdGVnb3J5IGluIHRoZQotZmllbGRzIGF2YWlsYWJsZSB1bmRlciB0aGUgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiB0YWIuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+VW5kZXIgdGhlIDxzdHJvbmc+QXNzaWduPC9zdHJvbmc+IHRhYiwgeW91IGNhbiBzZWxlY3QgdGhlIHRoaW5ncyB5b3Ugd2FudAotdG8gaW5jbHVkZSBpbiB0aGUgY3VzdG9tIGNhdGVnb3J5LiBTZWxlY3QgaW5kaXZpZHVhbCBtZXRob2QgZWxlbWVudHMsIHByb2Nlc3NlcywKLXN0YW5kYXJkIGNhdGVnb3JpZXMgb3IgY3VzdG9tIGNhdGVnb3JpZXMuIFRoZSBjdXN0b20gY2F0ZWdvcnkKLWlzIGFsc28gYXZhaWxhYmxlIHRvIGFkZCB0byBpbmRpdmlkdWFsIGVsZW1lbnRzIG9uIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiCi1pbiB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPk9uY2UgeW91IGFzc2lnbiBjb250ZW50IHRvIHRoZSBjdXN0b20gY2F0ZWdvcnksIHlvdSBjYW4gbW9kaWZ5Ci10aGUgc2VxdWVuY2Ugb2YgdGhlIGl0ZW1zIGluIHRoZSBjYXRlZ29yeS4gVGhpcyBhZmZlY3RzIHRoZSBzZXF1ZW5jZSBvZiB0aGUKLWl0ZW1zIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGFuZCA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LCBhcwotd2VsbCBhcyBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZSBpZiB0aGUgY3VzdG9tIGNhdGVnb3J5IGlzIGluY2x1ZGVkIGFzIGEgdmlldwotaW4gYSBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlRvIHNhdmUgeW91ciBuZXcgY3VzdG9tIGNhdGVnb3J5LCBjbGljayA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlPC9zdHJvbmc+IG9yIGNsb3NlCi10aGUgZWRpdG9yIGFuZCBjbGljayA8c3Ryb25nPlllczwvc3Ryb25nPiB3aGVuIHByb21wdGVkIHRvIHNhdmUgdGhlIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBub3cgdXNlIHRoZSBjdXN0b20gY2F0ZWdvcnkgYXMgYSB2aWV3IGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uPG9sPjxsaT5Td2l0Y2ggdG8gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9saT4KLTxsaT5JbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiwKLWRvdWJsZSBjbGljayB0aGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgYSB2aWV3LiBUaGUgY29uZmlndXJhdGlvbgotZWRpdG9yIG9wZW5zLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+Vmlld3M8L3N0cm9uZz4gdGFiIGFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPkFkZCBWaWV3PC9zdHJvbmc+IGJ1dHRvbi4KLVRoZSBTZWxlY3QgQ2F0ZWdvcmllcyBkaWFsb2cgYXBwZWFycy4gVGhlIFNlbGVjdCBDYXRlZ29yaWVzIGRpYWxvZyBkaXNwbGF5cwotYWxsIHRoZSBzdGFuZGFyZCBhbmQgY3VzdG9tIGNhdGVnb3JpZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9saT4KLTxsaT5TZWxlY3Qgb25lIG9yIG1vcmUgY2F0ZWdvcmllcyB0byBpbmNsdWRlIGFzIGEgdmlldyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24KLWFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSB2aWV3IGRpc3BsYXkgcHJvdmlkZXMgYSBwcmV2aWV3IG9mIGhvdyB0aGUgdmlldwotd2lsbCBhcHBlYXIgbiB0aGUgcHVibGlzaGVkIHRyZWUgYnJvd3Nlci48L2xpPgotPGxpPlNlbGVjdCBhIHZpZXcgdG8gZGlzcGxheSBhcyB0aGUgZGVmYXVsdCBzdGFydC11cCB2aWV3IGluIHRoZSBwdWJsaXNoZWQKLVdlYiBzaXRlLCBhbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5NYWtlIERlZmF1bHQ8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+VG8gc2F2ZSB0aGUgY29uZmlndXJhdGlvbiwgY2xpY2sgPHN0cm9uZz5GaWxlICZndDsgU2F2ZTwvc3Ryb25nPiBvciBjbG9zZSB0aGUgY29uZmlndXJhdGlvbgotZWRpdG9yIGFuZCBjbGljayA8c3Ryb25nPlllczwvc3Ryb25nPiB3aGVuIHByb21wdGVkIHRvIHNhdmUgdGhlIGNoYW5nZXMuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InB1Ymxpc2hpbmdvdmVydmlldy5odG1sIj5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzlkMzY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwjcHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj48YSBuYW1lPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgQ2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUKLWNsdXN0ZXIgb2YgYWN0aXZpdGllcyBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50Ci1kZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuIENhcGFiaWxpdHkgcGF0dGVybnMgY2FuIGJlIHVzZWQgYXMKLWJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkgcGF0dGVybnMuIDwvcD4KLUJlZm9yZQotY3JlYXRpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm46PHVsPjxsaT5TZWxlY3QgYSBtZXRob2QgcGx1Zy1pbiB0byBob2xkIHlvdXIgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPi48L2xpPgotPGxpPkZpbmQgb3IgY3JlYXRlIGEgcHJvY2VzcyBwYWNrYWdlLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5BIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbgotb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gSW4gb3RoZXIgd29yZHMsIGEgY2FwYWJpbGl0eQotcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgc28gdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEKLWRlbGl2ZXJ5IHByb2Nlc3MuIFRoaXMgZW5hYmxlcyB0aGUgcGF0dGVybidzIGFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQKLXRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcKLWFwcGxpZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+LjxkaXYgY2xhc3M9InAiPllvdSBkbyBub3QgbmVlZCB0byBkZXZlbG9wIHlvdXIgcHJvY2VzcyBmcm9tIHNjcmF0Y2g7Ci15b3UgY2FuIHJldXNlIGV4aXN0aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgb3IgZXZlbiBjYXBhYmlsaXR5IHBhdHRlcm4gcGFydHMuCi1UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHBvcHVsYXRlIGEgcHJvY2VzcyB3aXRoIG1ldGhvZCBlbGVtZW50czo8dWw+PGxpPkJ5IGluY29ycG9yYXRpbmcgaW5kaXZpZHVhbCBtZXRob2QgZWxlbWVudHMgYnkgZHJhZ2dpbmcgdGhlIGVsZW1lbnRzIG9udG8KLWFuIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIHBhcnRzIG9mIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgY3JlYXRpbmcgZGVzY3JpcHRvcnMgZGlyZWN0bHkgaW4gdGhlIHByb2Nlc3MsIHdoaWNoIGFyZSBlaXRoZXIgdW5yZWxhdGVkCi10byBhbnkgbWV0aG9kIGNvbnRlbnQgb3IgcmVsYXRlZCB0byBtZXRob2QgY29udGVudCBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiBUbyBjcmVhdGUgYSBjYXBhYmlsaXR5IHBhdHRlcm46PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbmNlIHlvdSBoYXZlIHNlbGVjdGVkIG9yIGNyZWF0ZWQgYSBwcm9jZXNzIHBhY2thZ2UsIHJpZ2h0IGNsaWNrCi10aGUgPHN0cm9uZz5Qcm9jZXNzIFBhY2thZ2U8L3N0cm9uZz4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+TmV3IOKAkyZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9zdHJvbmc+LiBUaGUgTmV3IFByb2Nlc3MgQ29tcG9uZW50Ci1kaWFsb2cgYm94IGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBuYW1lIGZvciB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGludG8gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZAotYW5kIHRoZW4gc2VsZWN0IGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGRyb3AgZG93biBsaXN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgcHJvY2VzcyBpcyBjcmVhdGVkIGFuZCB0aGUgcHJvY2VzcyBlZGl0b3IKLWlzIG9wZW5lZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCB1bmRlciB0aGUgRGVzY3JpcHRpb24gdGFiLCBkb2N1bWVudCB5b3VyCi1wcm9jZXNzIHVzaW5nIHRoZSBhdmFpbGFibGUgdGV4dCBmaWVsZHMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlCi1SaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yIGFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eQotc3ltYm9sIDxpbWcgc3JjPSJ0d2lzdHkgc3ltYm9sMS5KUEciIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrCi10aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlIHN5bWJvbCBhZ2FpbiB0byBjbG9zZQotdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RGVjaWRlIG9uIHlvdXIgcHJpbWFyeSBwcm9jZXNzIGF1dGhvcmluZyB2aWV3LiBZb3UgZGV2ZWxvcCBhIHByb2Nlc3MKLXVzaW5nIHRocmVlIGRpZmZlcmVudCB2aWV3czogPC9zcGFuPjx1bD48bGk+PHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3N0cm9uZz46IERlZmluZSBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZQotaW4geW91ciBwcm9jZXNzLiBDcmVhdGUgaXRlcmF0aW9ucyBhbmQgYWN0aXZpdGllcyBmaXJzdCwgYW5kIHRoZW4gcG9wdWxhdGUKLXlvdXIgYWN0aXZpdGllcyBieSBhcHBseWluZyB0YXNrcyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+VGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggdGVhbXMgYW5kIHJvbGVzIHNoYWxsIHBhcnRpY2lwYXRlCi1pbiBhY3Rpdml0aWVzIGFuZCB0aGVuIGZpbmQgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBhbmQgdGFza3MgZnJvbSB0aGVyZS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvYT4uPC9saT4KLTxsaT48c3Ryb25nPldvcmsgUHJvZHVjdCBVc2FnZTwvc3Ryb25nPjogRGVmaW5lIHdoaWNoIHdvcmsgcHJvZHVjdHMgc2hvdWxkIGJlIGNyZWF0ZWQKLWluIGFjdGl2aXRpZXMgYW5kIGZpbmQgdGFza3MgYW5kIHJvbGVzIGZyb20gdGhlcmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9hPi48L2xpPgotPC91bD4KLSA8cD5PbmNlIHlvdSBoYXZlIGNyZWF0ZWQgeW91ciBjYXBhYmlsaXR5IHBhdHRlcm4sIHlvdSBuZWVkIHRvIGFwcGx5Ci1pdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgPGEgaHJlZj0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyb2xlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcm9sZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWE2OTAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyb2xlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgUm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgUm9sZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXJvbGUiPjxhIG5hbWU9ImNyZWF0ZWFyb2xlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgUm9sZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgPHNwYW4gY2xhc3M9ImtleXdvcmQiPlJvbGU8L3NwYW4+IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywKLWFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgaW5kaXZpZHVhbHMuPC9wPgotWW91IHNob3VsZCBhbHdheXMKLWNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQgaW4gYSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPiB0aGF0IHlvdSBwcm9kdWNlLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgcm9sZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGFuZCB0aGUgY29udGVudCBwYWNrYWdlIGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgcm9sZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiwgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgUm9sZTwvc3Ryb25nPi4gVGhlCi1yb2xlIGVkaXRvciBhcHBlYXJzIHdpdGggdGhlIERlc2NyaXB0aW9uIHRhYiBzZXQgYXMgdGhlIGRlZmF1bHQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIGEgdW5pcXVlIG5hbWUgZm9yIHlvdXIgcm9sZS4gVGhlIHJvbGUgbmFtZQotaXMgdGhlIGZpbGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlIExpYnJhcnkgdmlldy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZXNlbnRhdGlvbiBuYW1lIGZpZWxkLCB0eXBlIGEgcHJlc2VudGF0aW9uIG5hbWUuIFRoZSBwcmVzZW50YXRpb24KLW5hbWUgaXMgdGhlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHlvdXIgcHVibGlzaGVkIGNvbnRlbnQgYW5kIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIGFsc28gbWFrZSB0aGlzIG5hbWUgYXBwZWFyIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGJ5IHRvZ2dsaW5nIHRoZSA8c3Ryb25nPlNob3cgUHJlc2VudGF0aW9uIE5hbWVzPC9zdHJvbmc+IGJ1dHRvbgotaW4gdGhlIExpYnJhcnkgVmlldyB0b29sYmFyLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQsIHR5cGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUKLW5ldyBSb2xlLiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5ldyBSb2xlIGluIHRoZSBNYWluIERlc2NyaXB0aW9uCi1maWVsZC4gVGhlIG1haW4gZGVzY3JpcHRpb24gaXMgYSBtb3JlIGRldGFpbGVkIHZlcnNpb24gb2YgdGhlIGRlc2NyaXB0aW9uCi15b3UgdHlwZWQgaW50byB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHlvdSBjYW4gY3JlYXRlCi10ZXh0IGZvciB0aGUgZGVzY3JpcHRpb246PC9zcGFuPiA8dWw+PGxpPkRpcmVjdGx5LCBieSB0eXBpbmcgaXQgbWFudWFsbHkgaW4gdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbm90aGVyIHNpbWlsYXIgcm9sZSBhbmQgdGhlbiBtb2RpZnkgYnkgdXNpbmcgdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbiBIVE1MIHNvdXJjZSBzdWNoIGFzIGEgcHVibGlzaGVkIE9wZW5VUC9CYXNpYyBXZWIgc2l0ZS48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUgUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyIHRoZSB0ZXh0IGZvcgotYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0iY29sbGFwc2VkLmdpZiIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sgdGhlIHN5bWJvbCB0byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZQotc3ltYm9sIGFnYWluIHRvIGNsb3NlIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT4uPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5VbmRlciBWZXJzaW9uIEluZm9ybWF0aW9uLCBwcm92aWRlIGFueSBwZXJ0aW5lbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIHJvbGUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4gdGFiIGFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24KLXRvIHRoZSByaWdodCBvZiB0aGUgIlJvbGUgaXMgcmVzcG9uc2libGUgZm9yOiIgZmllbGQuIFRoZSBTZWxlY3QgRGlhbG9nIGZvcgotV29yayBQcm9kdWN0cyBkaWFsb2cgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIGZyb20gdGhlIGxpc3QuIEEgZGVzY3JpcHRpb24gb2YKLXRoZSB3b3JrIHByb2R1Y3QgeW91IHNlbGVjdCBhcHBlYXJzIGluIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZCBhdCB0aGUKLWJvdHRvbSBvZiB0aGUgZGlhbG9nIGJveC48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGUgbGlzdCBvZiB3b3JrIHByb2R1Y3RzIGluIHRoZQotIldvcmsgcHJvZHVjdHMgdGhhdCBhcmUgb3V0cHV0IG9mIHRhc2tzIHRoYXQgdGhpcyByb2xlIHBlcmZvcm1zIiBmaWVsZCBpcwotY2FsY3VsYXRlZCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aCB0aGUgcm9sZSBlZGl0b3IuIEEgd29yayBwcm9kdWN0IGFwcGVhcnMKLWhlcmUgaWYgaXQgaXMgYW4gb3V0cHV0IG9mIGEgdGFzayB0aGF0IHRoZSByb2xlIHBlcmZvcm1zLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIGRpYWxvZyBib3ggY2xvc2VzIGFuZCB0aGUgIlJvbGUgaXMgcmVzcG9uc2libGUKLWZvcjoiIGZpZWxkIGlzIHBvcHVsYXRlZC48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBTZWxlY3RlZCBlbGVtZW50cyBpbiBhbiBBZGQvUmVtb3ZlCi1zZWN0aW9uIGRpc3BsYXkgYm90aCB0aGUgZWxlbWVudCBuYW1lIChwbHVnLWluIG5hbWUpIGFuZCB0aGUgInBhdGgiIChwYWNrYWdlCi1uYW1lKSB0byB0aGF0IGVsZW1lbnQuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cyB5b3UKLXRvIGFkZCBhbmQgcmVtb3ZlIGd1aWRhbmNlIGZvciB0aGUgcm9sZS4gVG8gYWRkIGd1aWRhbmNlLCBjbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLAotc2VsZWN0IHRoZSBndWlkYW5jZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZSBndWlkYW5jZSwKLXNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgZmllbGQgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uIFdoZW4geW91IHNlbGVjdAotYSBndWlkYW5jZSBlbGVtZW50LCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGd1aWRhbmNlIGlzIGRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIuIEEgcm9sZSBjYW4gYmUgaW5jbHVkZWQgaW4gb25lCi1vciBtb3JlIHJvbGVzZXRzIGFuZCBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzLiBPcGVuIHRoZSBhcHByb3ByaWF0ZQotU2VsZWN0IGRpYWxvZyBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIG5leHQgdG8gdGhlIGNhdGVnb3J5IGxpc3RzLgotWW91IGNhbiByZW1vdmUgYSByb2xlIGZyb20gYSBjYXRlZ29yeSBieSBzZWxlY3RpbmcgaXQgYW5kIHRoZW4gY2xpY2tpbmcgdGhlIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZAotcm9sZSBhbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGlua2xpc3QiPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF0YXNrLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhdGFzay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJlMjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF0YXNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgVGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYXRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgVGFzazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXRhc2siPjxhIG5hbWU9ImNyZWF0ZWF0YXNrIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgVGFzazwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgdGFzayBpcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gRXZlcnkgdGFzayBpcyBhc3NpZ25lZCB0bwotYSBzcGVjaWZpYyByb2xlLiBUaGUgZ3JhbnVsYXJpdHkgb2YgYSB0YXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldwotZGF5cyBhbmQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgdW1iZXIgb2Ygd29yayBwcm9kdWN0cy48L3A+Ci1Zb3UKLXNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQgeW91IHByb2R1Y2UuIDwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgdGFzazo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGFuZCB0aGUgY29udGVudCBwYWNrYWdlIGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgdGFzay48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgPHN0cm9uZz5UYXNrczwvc3Ryb25nPiwgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgVGFzazwvc3Ryb25nPi4gVGhlCi10YXNrIGVkaXRvciBhcHBlYXJzIHdpdGggdGhlIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz4gdGFiIHNldCBhcyB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5hbWUgZmllbGQsIHR5cGUgYSB1bmlxdWUgbmFtZSBmb3IgeW91ciB0YXNrLiB0aGUgdGFzayBuYW1lCi1pcyB0aGUgZmlsZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZXNlbnRhdGlvbiBuYW1lIGZpZWxkLCB0eXBlIGEgcHJlc2VudGF0aW9uIG5hbWUuIFRoZSBwcmVzZW50YXRpb24KLW5hbWUgaXMgdGhlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHlvdXIgcHVibGlzaGVkIGNvbnRlbnQgYW5kIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LgotWW91IGNhbiBhbHNvIG1ha2UgdGhpcyBuYW1lIGFwcGVhciBpbiB0aGUgTGlicmFyeSB2aWV3IGJ5IHRvZ2dsaW5nIHRoZSA8c3Ryb25nPlNob3cKLVByZXNlbnRhdGlvbiBOYW1lczwvc3Ryb25nPiBidXR0b24gaW4gdGhlIExpYnJhcnkgdmlldyB0b29sYmFyLjwvc3Bhbj4gPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLCB0eXBlIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlCi1uZXcgdGFzay48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5ldyB0YXNrIGluIHRoZSBNYWluIERlc2NyaXB0aW9uCi1maWVsZC4gVGhlIG1haW4gZGVzY3JpcHRpb24gaXMgYSBtb3JlIGRldGFpbGVkIHZlcnNpb24gb2YgdGhlIGRlc2NyaXB0aW9uCi15b3UgdHlwZWQgaW50byB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHlvdSBjYW4gY3JlYXRlCi10ZXh0IGZvciB0aGUgZGVzY3JpcHRpb246PC9zcGFuPiA8dWw+PGxpPkRpcmVjdGx5LCBieSB0eXBpbmcgaXQgbWFudWFsbHkgaW4gdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbm90aGVyIHNpbWlsYXIgcm9sZSBhbmQgdGhlbiBtb2RpZnkgYnkgdXNpbmcgdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbiBIVE1MIHNvdXJjZSBzdWNoIGFzIGEgcHVibGlzaGVkIE9wZW5VUC9CYXNpYyBXZWIgc2l0ZS48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUgUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyIHRoZSB0ZXh0IGZvcgotYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0iY29sbGFwc2VkLmdpZiIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sgdGhlIHN5bWJvbCB0byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZQotc3ltYm9sIGFnYWluIHRvIGNsb3NlIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT4uPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db21wbGV0ZSB0aGUgb3RoZXIgdGFzayBzcGVjaWZpYyBmaWVsZHMgaW4gRGV0YWlsIEluZm9ybWF0aW9uIGFzCi1uZWVkZWQuIFNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5Ij5WYXJpYWJpbGl0eTwvYT4gZm9yCi1pbmZvcm1hdGlvbiBvbiBjcmVhdGluZyB2YXJpYWJpbGl0eS4gPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gVGhlIFN0ZXBzIEVkaXRvciBhcHBlYXJzLjwvc3Bhbj4gPGRpdiBjbGFzcz0icCI+QQotdGFzayBjYW4gaGF2ZSBhIHNlcmllcyBvZiBzdGVwcyB0aGF0IGRldGFpbCBob3cgdG8gcGVyZm9ybSB0aGF0IHRhc2suIFRoZQotU3RlcCBFZGl0b3IgYWxsb3dzIHlvdSB0bzo8dWw+PGxpPkNyZWF0ZSBhIG5ldyBzdGVwPHVsPjxsaT5DbGljayB0aGUgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+R2l2ZSB0aGUgVGFzayBhIG5hbWUgaW4gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZC48L2xpPgotPGxpPkRlc2NyaWJlIHRoZSBUYXNrIGluIHRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IGZpZWxkLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5SZW1vdmUgYSBzdGVwPHVsPjxsaT5TZWxlY3QgdGhlIHN0ZXAgdG8gcmVtb3ZlIGluIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IGZpZWxkLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+RGVsZXRlPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+TW92ZSBhIHN0ZXAgdXAgdGhlIGxpc3Q8dWw+PGxpPlNlbGVjdCB0aGUgc3RlcCB5b3Ugd2FudCB0byBtb3ZlIHVwLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+TW92ZSBVcDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPk1vdmUgYSBzdGVwIGRvd24gdGhlIGxpc3Q8dWw+PGxpPlNlbGVjdCB0aGUgc3RlcCB5b3Ugd2FudCB0byBtb3ZlIGRvd24uPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5Nb3ZlIERvd248L3N0cm9uZz4gYnV0dG9uPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+Um9sZXM8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MgeW91Ci10byBkZWZpbmUgdGhlIHJvbGVzIHRoYXQgcGVyZm9ybSB0aGUgdGFzay4gWW91IHNob3VsZCBzZWxlY3QgYSByb2xlIGFzIHRoZQotUGVyZm9ybWluZyBSb2xlIGZvciB0aGlzIHRhc2suIFlvdSBjYW4gYWxzbyBhZGQgb25lIG9yIG1vcmUgcm9sZXMgYXMgQWRkaXRpb25hbAotUGVyZm9ybWVycy4gVG8gYWRkIGEgcm9sZSwgY2xpY2sgdGhlIDxzdHJvbmc+U2VsZWN0PC9zdHJvbmc+IG9yIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiBhcwotYXBwcm9wcmlhdGUsIHNlbGVjdCB0aGUgcm9sZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvCi1yZW1vdmUgYSByb2xlLCBzZWxlY3QgaXQgaW4gdGhlIEd1aWRhbmNlIGJveCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5DbGVhcjwvc3Ryb25nPiBvciA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBhcwotYXBwcm9wcmlhdGUuIFdoZW4geW91IHNlbGVjdCBhIHJvbGUgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoYXQgcm9sZSBpcwotZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzPC9zdHJvbmc+IHRhYi4gVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3IgYWxsb3dzCi15b3UgdG8gZGVmaW5lIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgdGhpcyB0YXNrLgotWW91IGNhbiBzZWxlY3QgYW55IG51bWJlciBvZiB3b3JrIHByb2R1Y3RzIGFzIE1hbmRhdG9yeSBJbnB1dHMsIE9wdGlvbmFsIElucHV0cywKLWFuZCBPdXRwdXRzLiBUbyBhZGQgYSB3b3JrIHByb2R1Y3QsIGNsaWNrIHRoZSBhcHByb3ByaWF0ZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24sCi1zZWxlY3QgdGhlIHdvcmsgcHJvZHVjdHMgeW91IHdhbnQgdG8gYWRkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUbyByZW1vdmUKLWEgd29yayBwcm9kdWN0LCBzZWxlY3QgaXQgaW4gdGhlIGFwcHJvcHJpYXRlIGJveCBhbmQgdGhlbiBjbGljayB0aGUgY29ycmVzcG9uZGluZyA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uCi1XaGVuIHlvdSBzZWxlY3QgYSB3b3JrIHByb2R1Y3QgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrIHByb2R1Y3QgaXMKLWRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+R3VpZGFuY2U8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MgeW91Ci10byBhZGQgYW5kIHJlbW92ZSBndWlkYW5jZSBmb3IgdGhlIHRhc2suIFRvIGFkZCBndWlkYW5jZSwgY2xpY2sgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwKLXNlbGVjdCB0aGUgZ3VpZGFuY2UgeW91IHdhbnQgdG8gYWRkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUbyByZW1vdmUgZ3VpZGFuY2UsCi1zZWxlY3QgaXQgaW4gdGhlIEd1aWRhbmNlIGJveCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPi4gV2hlbiB5b3Ugc2VsZWN0Ci1hIGd1aWRhbmNlIGVsZW1lbnQgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBndWlkYW5jZSBpcyBkaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiLiBBIHRhc2sgY2FuIGJlIGluY2x1ZGVkIGluIG9uZQotZGlzY2lwbGluZSBhbmQgYW55IG51bWJlciBvZiBjdXN0b20gY2F0ZWdvcmllcy4gT3BlbiB0aGUgU2VsZWN0IGRpYWxvZyBieQotY2xpY2tpbmcgdGhlIGFwcHJvcHJpYXRlIDxzdHJvbmc+U2VsZWN0PC9zdHJvbmc+IG9yIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiBuZXh0IHRvIHRoZSBjYXRlZ29yeQotbGlzdHMuIFNlbGVjdCBhIHNpbmdsZSBkaXNjaXBsaW5lIG9yIGFueSBudW1iZXIgb2YgY3VzdG9tIGNhdGVnb3JpZXMsIGFuZAotdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBZb3UgY2FuIHJlbW92ZSBhIHRhc2sgZnJvbSBhIGNhdGVnb3J5IGJ5IHNlbGVjdGluZyBpdAotYW5kIHRoZW4gY2xpY2tpbmcgdGhlIGFwcHJvcHJpYXRlIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB0YXNrIGFzCi1pdCB3aWxsIGFwcGVhciBpbiBhIHB1Ymxpc2hlZCBXZWIgcGFnZSwgYW5kIHRoZW4gc2F2ZSBieSBjbG9zaW5nIHRoZSB0YWIuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzRmOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgV29yayBQcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWF3b3JrcHJvZHVjdCI+PGEgbmFtZT0iY3JlYXRlYXdvcmtwcm9kdWN0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PGRpdiBjbGFzcz0icCI+V29yayBwcm9kdWN0IGlzIGEgZ2VuZXJhbCB0ZXJtIGZvciB0YXNrIGlucHV0cyBhbmQgb3V0cHV0cy4gVGhlcmUKLWFyZSB0aHJlZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3Q6PHVsPjxsaT48YSBocmVmPSJhcnRpZmFjdC5odG1sI2FydGlmYWN0Ij5BcnRpZmFjdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im91dGNvbWUuaHRtbCNvdXRjb21lIj5PdXRjb21lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSI+RGVsaXZlcmFibGU8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLVlvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQgaW4gYSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPiB0aGF0IHlvdSBwcm9kdWNlLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgd29yayBwcm9kdWN0OjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBDb250ZW50IFBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSB3b3JrCi1wcm9kdWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4sIGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZzo8L3NwYW4+IDx1bD48bGk+PHN0cm9uZz5OZXcgJmd0OyBBcnRpZmFjdDwvc3Ryb25nPjwvbGk+Ci08bGk+PHN0cm9uZz5OZXcgJmd0OyBPdXRjb21lPC9zdHJvbmc+PC9saT4KLTxsaT48c3Ryb25nPk5ldyAmZ3Q7IERlbGl2ZXJhYmxlPC9zdHJvbmc+PC9saT4KLTwvdWw+Ci1UaGUgV29yayBQcm9kdWN0IGVkaXRvciBmb3IgdGhlIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IHlvdSBhcmUKLWNyZWF0aW5nIGFwcGVhcnMgd2l0aCB0aGUgRGVzY3JpcHRpb24gdGFiIHNldCBhcyB0aGUgZGVmYXVsdC48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmFtZSBmaWVsZCwgdHlwZSBhIHVuaXF1ZSBuYW1lIGZvciB5b3VyIHdvcmsgcHJvZHVjdC4gVGhlCi13b3JrIHByb2R1Y3QgbmFtZSBpcyB0aGUgZmlsZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPi4gPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVzZW50YXRpb24gbmFtZSBmaWVsZCwgdHlwZSBhIHByZXNlbnRhdGlvbiBuYW1lLiB0aGUgcHJlc2VudGF0aW9uCi1uYW1lIGlzIHRoZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB5b3VyIHB1Ymxpc2hlZCBjb250ZW50IGFuZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gWW91IGNhbiBhbHNvIG1ha2UgdGhpcyBuYW1lIGFwcGVhciBpbiB0aGUgbGlicmFyeQotdmlldyBieSB0b2dnbGluZyB0aGUgPHN0cm9uZz5TaG93IFByZXNlbnRhdGlvbiBOYW1lczwvc3Ryb25nPiBidXR0b24gaW4gdGhlIGxpYnJhcnkKLXZpZXcgdG9vbGJhci48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLCB0eXBlIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlCi1uZXcgd29yayBwcm9kdWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IHdvcmsgcHJvZHVjdCBpbiB0aGUKLU1haW4gRGVzY3JpcHRpb24gZmllbGQuIFRoZSBtYWluIGRlc2NyaXB0aW9uIGlzIGEgbW9yZSBkZXRhaWxlZCB2ZXJzaW9uIG9mCi10aGUgZGVzY3JpcHRpb24geW91IHR5cGVkIGludG8gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLiBUaGVyZSBhcmUgdGhyZWUKLXdheXMgdG8gY3JlYXRlIHRleHQgZm9yIHRoZSBkZXNjcmlwdGlvbjo8L3NwYW4+IDx1bD48bGk+RGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFub3RoZXIgc2ltaWxhciB3b3JrIHByb2R1Y3QgYW5kIHRoZW4gbW9kaWZ5IHVzaW5nIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW4gSFRNTCBzb3VyY2UsIHN1Y2ggYXMgYSBwdWJsaXNoZWQgT3BlblVQL0Jhc2ljIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yCi1hbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlCi1zeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIDxzdHJvbmc+Tm90YXRpb248L3N0cm9uZz4sIHByb3ZpZGUgYW55IG5vdGF0aW9ucyBhYm91dCB0aGUgV29yayBQcm9kdWN0Ljwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEFydGlmYWN0cyBhbmQgRGVsaXZlcmFibGVzIGNvbnRhaW4gdGhlIE5vdGF0aW9uIGZpZWxkcywgd2hpbGUKLU91dGNvbWVzIGRvIG5vdC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIDxzdHJvbmc+SWNvbjwvc3Ryb25nPiB5b3UgY2FuIHNlbGVjdCBhIG5vZGUgaWNvbiB0byBhcHBlYXIgd2l0aCB0aGUKLXdvcmsgcHJvZHVjdCBpbiB0aGUgTGlicmFyeSBhbmQgQ29uZmlndXJhdGlvbiB2aWV3cyBhbmQgaW4gdGhlIHRyZWUgYnJvd3NlcgotaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuIFRoZSBub2RlIGljb24gc2hvdWxkIGJlIDE2IHggMTYgcGl4ZWxzLiBZb3UgY2FuIGFsc28KLXNlbGVjdCBhIFNoYXBlIGljb24gdG8gYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlCi13b3JrIHByb2R1Y3QuIHRoZSBTaGFwZSBpY29uIHNob3VsZCBiZSAzMiB4IDMyIHBpeGVscy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29tcGxldGUgdGhlIG90aGVyIHdvcmsgcHJvZHVjdCBzcGVjaWZpYyBmaWVsZHMgYXMgbmVlZGVkLiBTZWUgPGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSI+VmFyaWFiaWxpdHk8L2E+IGZvciBpbmZvcm1hdGlvbgotb24gYWRkaW5nIHZhcmlhYmlsaXR5IHRvIHlvdXIgd29yayBwcm9kdWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+R3VpZGFuY2U8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MKLXlvdSB0byBhZGQgYW5kIHJlbW92ZSBndWlkYW5jZSBmb3IgdGhlIHdvcmsgcHJvZHVjdC4gVG8gYWRkIGd1aWRhbmNlLCBjbGljawotdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwgc2VsZWN0IHRoZSBndWlkYW5jZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uCi1UbyByZW1vdmUgZ3VpZGFuY2UsIHNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgZmllbGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+LgotV2hlbiB5b3Ugc2VsZWN0IGEgZ3VpZGFuY2UgZWxlbWVudCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGd1aWRhbmNlIGlzCi1kaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYi4gQSB3b3JrIHByb2R1Y3QgY2FuIGJlIGluY2x1ZGVkCi1pbiBvbmUgZG9tYWluLCBhbnkgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdCB0eXBlcywgYW5kIGFueSBudW1iZXIgb2YgY3VzdG9tCi1jYXRlZ29yaWVzLiBPcGVuIHRoZSBhcHByb3ByaWF0ZSBTZWxlY3QgZGlhbG9nIGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPlNlbGVjdDwvc3Ryb25nPiBvciA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24KLW5leHQgdG8gdGhlIGNhdGVnb3J5IGxpc3RzLiBTZWxlY3QgYSBzaW5nbGUgZG9tYWluIG9yIGFueSBudW1iZXIgb2Ygd29yayBwcm9kdWN0Ci1raW5kcyBvciBjdXN0b20gY2F0ZWdvcmllcyBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBZb3UgY2FuIHJlbW92ZSBhIHdvcmsKLXByb2R1Y3QgZnJvbSBhIGNhdGVnb3J5IGJ5IHNlbGVjdGluZyBpdCBhbmQgdGhlbiBjbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB0aGUgd29yayBwcm9kdWN0IGlzIGEgZGVsaXZlcmFibGUsIHlvdSBjYW4gZGVmaW5lIHdoYXQgdGhlIGRlbGl2ZXJhYmxlCi1jb25zaXN0cyBvZiBvbiB0aGUgRGVsaXZlcmFibGUgUGFydHMgdGFiLiBDbGljayB0aGUgPHN0cm9uZz5EZWxpdmVyYWJsZSBQYXJ0czwvc3Ryb25nPiB0YWIuCi1UaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBvbmx5IGFwcGVhcnMgZm9yIGRlbGl2ZXJhYmxlcyBhbmQgaXQgYWxsb3dzIHlvdSB0bwotYWRkIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgcGFydCBvZiB0aGUgZGVsaXZlcmFibGUuIFRvIGFkZCB3b3JrIHByb2R1Y3RzLAotY2xpY2sgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwgc2VsZWN0IHRoZSB3b3JrIHByb2R1Y3RzIHlvdSB3YW50IHRvIGFkZCwgYW5kCi10aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZSBhIHdvcmsgcHJvZHVjdCwgc2VsZWN0IGl0IGluIHRoZSB3b3JrIHByb2R1Y3RzCi1hcyBkZWxpdmVyYWJsZSBwYXJ0czogZmllbGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+LiBXaGVuIHlvdSBzZWxlY3QKLWEgd29yayBwcm9kdWN0IHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgd29yayBwcm9kdWN0IGlzIGRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgd29yayBwcm9kdWN0LAotYW5kIHRoZW4gc2F2ZSBieSBjbG9zaW5nIHRoZSB0YWIuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwiPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVndWlkYW5jZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlZ3VpZGFuY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmMzMwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVndWlkYW5jZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBHdWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBHdWlkYW5jZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlZ3VpZGFuY2UiPjxhIG5hbWU9ImNyZWF0ZWd1aWRhbmNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIEd1aWRhbmNlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+R3VpZGFuY2UgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byA8YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZTwvYT4sIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPiwgYW5kIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwiPldvcmsgUHJvZHVjdDwvYT4uIEd1aWRhbmNlCi1wcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gcGVyZm9ybSB5b3VyIHJvbGUsIGhvdyB0byBjcmVhdGUgYSB3b3JrIHByb2R1Y3QsCi1ob3cgdG8gcGVyZm9ybSB5b3VyIHRhc2ssIGFuZCBzbyBvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPi48L3A+Ci08cD5Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQKLXlvdSBwcm9kdWNlLjwvcD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gY3JlYXRlPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGFuZCB0aGUgQ29udGVudCBQYWNrYWdlIGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSBHdWlkYW5jZQotdW50aWwgeW91IHNlZSB0aGUgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIEd1aWRhbmNlKS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk5ldyAmZ3Q7ICJndWlkYW5jZSB0eXBlIjwvc3Ryb25nPi4KLVRoZSBndWlkYW5jZSBlZGl0b3IgZm9yIHRoYXQgcGFydGljdWxhciBndWlkYW5jZSB0eXBlIG9wZW5zLiA8L3NwYW4+IDxkaXYgY2xhc3M9InAiPlRoZQotZm9sbG93aW5nIGd1aWRhbmNlIHR5cGVzIGhhdmUgdGhlIHNhbWUgZWRpdG9yIHdoaWNoIGluY2x1ZGVzIGEgRGVzY3JpcHRpb24KLXRhYiBhbmQgYSBQcmV2aWV3IHRhYjo8dWw+PGxpPjxhIGhyZWY9ImNvbmNlcHQuaHRtbCNjb25jZXB0Ij5Db25jZXB0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZXhhbXBsZS5odG1sI2V4YW1wbGUiPkV4YW1wbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJndWlkZWxpbmUuaHRtbCNndWlkZWxpbmUiPkd1aWRlbGluZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJlcG9ydC5odG1sI3JlcG9ydCI+UmVwb3J0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icmV1c2FibGVhc3NldC5odG1sI3JldXNhYmxlYXNzZXQiPlJldXNhYmxlIEFzc2V0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icm9hZG1hcC5odG1sI3JvYWRtYXAiPlJvYWRtYXA8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbCI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRlcm1kZWZpbml0aW9uLmh0bWwjdGVybWRlZmluaXRpb24iPlRlcm0gRGVmaW5pdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRvb2xtZW50b3IuaHRtbCN0b29sbWVudG9yIj5Ub29sIE1lbnRvcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IndoaXRlcGFwZXIuaHRtbCN3aGl0ZXBhcGVyIj5XaGl0ZXBhcGVyPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Vc2UgdGhlIGZpZWxkcyBpbiB0aGUgY29udGVudCBlbGVtZW50IGVkaXRvciB0byBzcGVjaWZ5IHRoZSBndWlkYW5jZQotZGV0YWlscy4gU3RhcnQgYnkgYXNzaWduaW5nIGEgdW5pcXVlIG5hbWUgdG8gdGhlIGd1aWRhbmNlIGVsZW1lbnQgYWxvbmcgd2l0aAotYSBwcmVzZW50YXRpb24gbmFtZSB0aGF0IGlzIHVzZWQgYXMgdGhlIGV4dGVybmFsIHZpc2libGUgbmFtZSB3aGVuIG90aGVyIGVsZW1lbnRzCi1yZWZlciB0byB0aGlzIGVsZW1lbnQsIG9yIHdoZW4gdGhlIGVsZW1lbnQgaXMgcHVibGlzaGVkLiBFdmVyeSBndWlkYW5jZSB0eXBlCi1oYXMgc3BlY2lmaWMgY29udGVudCBmaWVsZHMgaW4gdGhlIGNvbnRlbnQgZWRpdG9yIHRoYXQgYXJlIGRpc3RyaWJ1dGVkIG92ZXIKLXR3byBvciBtb3JlIHN0YWNrZWQgdGFicy4gVXNlIHRoZSBjb250ZW50IGZpZWxkcyB0byBkZXNjcmliZSB5b3VyIGd1aWRhbmNlCi10eXBlLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIKLXRoZSB0ZXh0IGZvciBhbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4KLUNsaWNrIHRoZSBzeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT4uPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgSWNvbiBzZWN0aW9uLCBzZWxlY3QgYSBOb2RlIGljb24gdG8gYXBwZWFyIHdpdGggdGhlIHdvcmsKLXByb2R1Y3QgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gYW5kCi1pbiB0aGUgdHJlZSBicm93c2VyIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLiBUaGUgbm9kZSBpY29uIHNob3VsZCBiZSAxNiB4Ci0xNiBwaXhlbHMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgYSBTaGFwZSBpY29uIHRvIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSBwdWJsaXNoZWQKLXBhZ2UgZm9yIHRoZSB3b3JrIHByb2R1Y3QuIFRoZSBzaGFwZSBpY29uIHNob3VsZCBiZSAzMiB4IDMyIHBpeGVscy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgd29yayBwcm9kdWN0Ci1hbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIHR5cGVzIG9mIHNvbWUgdHlwZXMgb2YgZ3VpZGFuY2UgdG8gYQotbGltaXRlZCBudW1iZXIgb2Ygb3RoZXIgZ3VpZGFuY2UgdHlwZXMuIFRvIGNoYW5nZSBhIGd1aWRhbmNlIHR5cGUsIGNsaWNrIHRoZSA8c3Ryb25nPkNoYW5nZQotVHlwZTwvc3Ryb25nPiBidXR0b24gYW5kIHNlbGVjdCBhbiBhdmFpbGFibGUgbmV3IHR5cGUuPHA+SWYgdGhlIHR5cGUgb2YgZ3VpZGFuY2UKLWlzIGEgPGEgaHJlZj0icHJhY3RpY2UuaHRtbCNwcmFjdGljZSI+UHJhY3RpY2U8L2E+LCB5b3UgY2FuIGFkZAotcmVmZXJlbmNlcyB0byBvdGhlciBlbGVtZW50cy4gSWYgdGhlIGd1aWRhbmNlIGlzIGEgPGEgaHJlZj0idGVtcGxhdGUuaHRtbCI+VGVtcGxhdGU8L2E+LAoteW91IGNhbiBhdHRhY2ggYSBmaWxlIHRvIHRoZSBndWlkYW5jZS48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjI2ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIE1ldGhvZCBDb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQiPjxhIG5hbWU9ImNyZWF0ZW1ldGhvZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5NZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLAotZGVzY3JpYmluZyBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZQotcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlCi1tZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkCi10byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy48L3A+Ci08cD5NZXRob2QgY29udGVudCBlbGVtZW50cyBhcmU6PC9wPgotPHVsPjxsaT48YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFzazwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCI+R3VpZGFuY2U8L2E+PC9saT4KLTwvdWw+Ci1DbGljayBoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBtZXRob2QgY29udGVudDo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LAotZXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIGZvbGRlciBjb250YWluaW5nIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IHlvdQotd2FudCB0byBjcmVhdGUsIGNsaWNrIDxzdHJvbmc+TmV3PC9zdHJvbmc+IGFuZCB0aGVuIHNlbGVjdCB0aGUgZWxlbWVudCB0aGF0IGFwcGVhcnMuCi1UaGUgbmV3IGVsZW1lbnQgaXMgY3JlYXRlZCBhbmQgaXRzIHJlc3BlY3RpdmUgZWRpdG9yIG9wZW5zLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEZvcgotV29yayBQcm9kdWN0cywgY2hvb3NlIGJldHdlZW4gQXJ0aWZhY3QsIE91dGNvbWUsIG9yIERlbGl2ZXJhYmxlLiBGb3IgR3VpZGFuY2UsCi1jaG9vc2UgZnJvbSB0aGUgbGlzdCBvZiBndWlkYW5jZSB0eXBlcy48L2Rpdj4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCI+Q3JlYXRlIGEgUm9sZTwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwiPkNyZWF0ZSBhIFRhc2s8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCI+VmFyaWFiaWxpdHk8L2E+PC9zdHJvbmc+PGJyIC8+Ci1WYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2UKLW9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nCi10aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcKLXRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0ibGlua2xpc3QiPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2N1dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2YxMWQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2N1dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyYWJsZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcmFibGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiMjY2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyYWJsZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsaXZlcmFibGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ib3V0Y29tZS5odG1sI291dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGVsaXZlcmFibGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGVsaXZlcmFibGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRlbGl2ZXJhYmxlIj48YSBuYW1lPSJkZWxpdmVyYWJsZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlbGl2ZXJhYmxlPC9oMT4KLTxkaXY+PHA+QSBkZWxpdmVyYWJsZSBpcyBhIGNvbGxlY3Rpb24gb2Ygd29yayBwcm9kdWN0cywgdXN1YWxseSBhcnRpZmFjdHMuIEEgZGVsaXZlcmFibGUKLWlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb2Ygd29yayBwcm9kdWN0cwotcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEKLXByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyLCBvciBvdGhlcgotc3Rha2Vob2xkZXIuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJhcnRpZmFjdC5odG1sI2FydGlmYWN0Ij5BcnRpZmFjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcnlwcm9jZXNzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyeXByb2Nlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1ZTliYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyeXByb2Nlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlbGl2ZXJ5IFByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRlbGl2ZXJ5IFByb2Nlc3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRlbGl2ZXJ5cHJvY2VzcyI+PGEgbmFtZT0iZGVsaXZlcnlwcm9jZXNzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVsaXZlcnkgUHJvY2VzczwvaDE+Ci08ZGl2PjxwPkEgRGVsaXZlcnkgUHJvY2VzcyBpcyB0aGUgcHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZQotZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiBBIERlbGl2ZXJ5IFByb2Nlc3MgY2FuIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcKLWFuZCBydW5uaW5nIGEgcHJvamVjdC4gSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkCi1waGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzLjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTIzYTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj48YSBuYW1lPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5JbiB0aGUgVGVhbSBBbGxvY2F0aW9uIHZpZXcsIHlvdSBjYW4gY3JlYXRlIGEgcHJvY2VzcyBieSBkZWZpbmluZwotd2hpY2ggcm9sZXMgcGFydGljaXBhdGUgaW4gYWN0aXZpdGllcyBhbmQgZmluZCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZAotdGFza3MgZnJvbSB0aGVyZS4gWW91IGNhbiBhbHNvIHJldmlldyB0aGUgcm9sZXMgaW4gYSBwcm9jZXNzIHRoYXQgaGFzIGJlZW4KLWNyZWF0ZWQgYnkgYWRkaW5nIHRhc2tzIG9yIHdvcmsgcHJvZHVjdHMgdG8gdGhlIHByb2Nlc3MuIEJlZm9yZSB5b3UgY3JlYXRlCi1hIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbAotYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi1mb3IgeW91ciBwcm9jZXNzLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gZGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmU6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhY2Nlc3MgdGhlIHRlYW0gYWxsb2NhdGlvbiBlZGl0b3IsIHNlbGVjdCB0aGUgPHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz4gdGFiCi1pbiB0aGUgcHJvY2VzcyBlZGl0b3IuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHRvcGljLCB0aGUKLWJyZWFrZG93biBlbGVtZW50IGV4YW1wbGUgdXNlZCBpcyA8YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT4uCi1PdGhlciBicmVha2Rvd24gZWxlbWVudHMgaW5jbHVkZSAoYnV0IGFyZSBub3QgbGltaXRlZCB0bykgPGEgaHJlZj0icGhhc2UuaHRtbCNwaGFzZSI+UGhhc2U8L2E+IGFuZCA8YSBocmVmPSJpdGVyYXRpb24uaHRtbCNpdGVyYXRpb24iPkl0ZXJhdGlvbjwvYT4uCi1UaGUgZWxlbWVudCB5b3UgdXNlIGRlcGVuZHMgb24gdGhlIHNjb3BlIG9mIHRoZSBwcm9jZXNzIHlvdSBjcmVhdGUuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZWxlbWVudCAoZWl0aGVyIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBvciA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+KSB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgc3RydWN0dXJlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk5ldwotQ2hpbGQgJmd0OyBBY3Rpdml0eTwvc3Ryb25nPiB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcwotdG8gc2V0IHVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyAoYXMgd2VsbCBhcyBwaGFzZXMgYW5kIGl0ZXJhdGlvbnMpCi1jYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyIGFjY29yZGluZyB0byBob3cgZWFjaCByZWxhdGVzIGluIHRoZSBoaWVyYXJjaHkuCi1Zb3UgY2FuIGFkZCByb2xlcyBkaXJlY3RseSB0byB5b3VyIGFjdGl2aXRpZXMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcsIHJldmlldyB0aGUgbGlzdCBvZiByb2xlcy4gSW4gdGhpcyB2aWV3LAotdGFza3MgYXJlIHNvcnRlZCBieSByb2xlIHNldHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRyaWxsIGludG8gdGhlIHJvbGUgc2V0cyBoaWVyYXJjaHkgdG8gc2VlIHdoaWNoIHJvbGVzIGFyZSBhdmFpbGFibGUKLWluIHRoaXMgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgcm9sZSBhbmQgZHJhZyBpdCBvbiB0b3Agb2YgdGhlIGFwcHJvcHJpYXRlIGFjdGl2aXR5LiBUaGUKLXJvbGUgaXMgYWRkZWQgYXMgYSByb2xlIGRlc2NyaXB0b3IuIElmIHRoZSByb2xlIGlzIHJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3RzCi1pbiB0aGUgY29uZmlndXJhdGlvbidzIG1ldGhvZCBjb250ZW50LCBhIHdpemFyZCBhcHBlYXJzIHByb21wdGluZyB5b3UgdG8gYWRkCi13b3JrIHByb2R1Y3RzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3Qgb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBGb3IKLWVhY2ggc2VsZWN0ZWQgd29yayBwcm9kdWN0IHRoZSBuZXh0IHdpemFyZCB3aW5kb3cgcHJvbXB0cyB5b3UgdG8gc2VsZWN0IHRhc2tzCi10aGF0IHByb2R1Y2UgdGhlc2Ugd29yayBwcm9kdWN0cy4gQWdhaW4sIHNlbGVjdCBvbmUgb3IgbW9yZSB0YXNrcyBhbmQgdGhlbgotY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPiB0byBhZGQgdGhlc2UgZWxlbWVudHMgdG8geW91ciBwcm9jZXNzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SZXZpZXcgdGhlIHJvbGUgZGVzY3JpcHRvcidzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYKLXRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCwgaW4gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsCi1yaWdodCBjbGljayB0aGUgcm9sZSBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+LiBVc2UgdGhlIHRhYnMgb24gdGhlCi1zaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IuCi1JbiB0aGUgcHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIGFsc28gcGVyZm9ybSBpbmRpdmlkdWFsIG1vZGlmaWNhdGlvbnMgb2YgdGhlCi1yb2xlIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLAotY2hhbmdlIHdvcmsgcHJvZHVjdHMgdGhlIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yLCBhbmQgbW9yZS4gV2hlbiBjaGFuZ2luZwotdGhlIHRhc2sgZGVzY3JpcHRvcidzIHJlbGF0aW9uc2hpcHMgdW5kZXIgdGhlIHJvbGVzIG9yIHdvcmsgcHJvZHVjdHMgdGFicywKLXlvdSBjYW4gYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+QWRkLi4uPC9zdHJvbmc+IGJ1dHRvbiwKLW9yIGNvbm5lY3QgeW91ciB0YXNrIGRlc2NyaXB0b3Igd2l0aCB0YXNrcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sI3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L2E+PC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbnRpbnVlIGFkZGluZyByb2xlcyB0byB5b3VyIGFjdGl2aXRpZXMuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBwcmV2aWV3IHdoYXQgeW91ciBwcm9jZXNzIHdpbGwgbG9vayBsaWtlIGluIGEgcHVibGlzaGVkIFdlYgotc2l0ZSBhdCBhbnkgdGltZSBieSBzd2l0Y2hpbmcgdG8gdGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPiBhbmQgdGhlbiBzZWxlY3RpbmcgdGhlIHByb2Nlc3MsIG9yIGFuIGFjdGl2aXR5IGluIHRoZQotcHJvY2VzcywgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIFlvdSBjYW4gdXNlIHRoZQotbGlua3Mgb24gdGhlIHBhZ2UgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgcHJvY2Vzcy4gU3dpdGNoIGJhY2sgdG8gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4gdG8KLWNvbnRpbnVlIGVkaXRpbmcgeW91ciBwcm9jZXNzLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NDdlYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPjxhIG5hbWU9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5BIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBpcyBhIGhpZXJhcmNoaWNhbCBicmVha2Rvd24gb2Ygd29yaywgc3VjaAotYXMgYWN0aXZpdGllcywgdGFza3MsIGFuZCBzdGVwcywgZGVmaW5pbmcgYSBwcm9jZXNzLiA8cD5CZWZvcmUgY3JlYXRpbmcgYQotd29yayBicmVha2Rvd24gc3RydWN0dXJlLCBiZSBzdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wKLWJhciBpcyB0aGUgc2FtZSBhcyB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi1mb3IgeW91ciBwcm9jZXNzLjwvcD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gZGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFjY2VzcyB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgc2VsZWN0IHRoZSA8c3Ryb25nPldvcmsKLUJyZWFrZG93biBTdHJ1Y3R1cmU8L3N0cm9uZz4gdGFiIGluIGEgcHJvY2VzcyBlZGl0b3IuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBicmVha2Rvd24KLXN0cnVjdHVyZSBpcyBjcmVhdGVkIHdpdGggYnJlYWtkb3duIGVsZW1lbnRzLiBFeGFtcGxlcyBvZiBicmVha2Rvd24gZWxlbWVudHMKLWFyZSA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4sIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPiwgPGEgaHJlZj0iYWN0aXZpdHkuaHRtbCNhY3Rpdml0eSI+QWN0aXZpdHk8L2E+LAotb3IgdGFzayBkZXNjcmlwdG9yLiBUeXBpY2FsbHksIGEgcHJvY2VzcyBpcyBjcmVhdGVkIGJ5IGRlZmluaW5nCi1pdHMgcGhhc2VzIGFuZCBpdGVyYXRpb25zIHdpdGhpbiBvciBhY3Jvc3MgdGhlc2UgcGhhc2VzLiBQaGFzZXMgYW5kIGl0ZXJhdGlvbnMKLWFyZSB0aGVuIGZ1cnRoZXIgYnJva2VuIGRvd24gaW50byBsZXZlbHMgb2YgYWN0aXZpdGllcy4gRmluYWxseSwgeW91IGNhbiBwb3B1bGF0ZQotYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUncyBhY3Rpdml0eSB3aXRoIHRhc2sgZGVzY3JpcHRvcnMuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZWxlbWVudCAoZWl0aGVyIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBvciA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+KSB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgc3RydWN0dXJlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk5ldwotQ2hpbGQgJmd0OyBBY3Rpdml0eTwvc3Ryb25nPiB0byBjcmVhdGUgdGhlIG5ldyBhY3Rpdml0eS4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzCi10byBzZXQgdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIChhcyB3ZWxsIGFzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucykKLWNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIgYWNjb3JkaW5nIHRvIGhvdyBlYWNoIHJlbGF0ZXMgaW4gdGhlIGhpZXJhcmNoeS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIGFjdGl2aXR5IGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4gdG8gb3BlbgotdGhlIFByb3BlcnRpZXMgdmlldy4gQ29tcGxldGUgdGhlIGluZm9ybWF0aW9uIHVuZGVyIHRoZSBEb2N1bWVudGF0aW9uIHRhYgotZm9yIHRoZSBhY3Rpdml0eS4gVGhpcyBpbmZvcm1hdGlvbiBhcHBlYXJzIGluIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZQotYWN0aXZpdHkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJldmlldyB0aGUgbGlzdCBvZiB0YXNrcyBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IHRvIHNlZSB3aGljaAotdGFza3MgYXJlIGF2YWlsYWJsZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgdGFzayB0byBhZGQgdG8gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gZHJhZyBpdAotb24gdG9wIG9mIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCBpdCB0byBiZWxvbmcuIFRoZSB0YXNrIGlzIGFkZGVkIGFzCi1hIHRhc2sgZGVzY3JpcHRvciB0byB0aGF0IGFjdGl2aXR5Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB0aGUgcHJvcGVydGllcyB2aWV3IGZvciB0aGUgYWN0aXZpdHkgaXMgbm90IGRpc3BsYXllZCwgc2VsZWN0Ci10aGUgdGFzayBpbiB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgcmlnaHQgY2xpY2ssIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4uCi1DbGljayB0aGUgPHN0cm9uZz5Eb2N1bWVudGF0aW9uPC9zdHJvbmc+IHRhYiBhbmQgdGhlbiBjb21wbGV0ZSB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQKLXVuZGVyIHRoaXMgdGFiLiBUaGlzIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlCi1hY3Rpdml0eS4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudAotYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yLiBJbiB0aGUgcHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHBlcmZvcm0gaW5kaXZpZHVhbAotbW9kaWZpY2F0aW9ucyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsCi1hZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGFuZCBjaGFuZ2UgcGVyZm9ybWluZyByb2xlcywgYW1vbmcgb3RoZXJzLiBXaGVuCi1jaGFuZ2luZyB0aGUgdGFzayBkZXNjcmlwdG9yJ3MgcmVsYXRpb25zaGlwcyB1bmRlciB0aGUgcm9sZXMgb3Igd29yayBwcm9kdWN0cwotdGFicywgeW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uLAotb3IgY29ubmVjdCB5b3VyIHRhc2sgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5LgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwjcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyI+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvYT4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbnRpbnVlIGFkZGluZyB0YXNrcyB0byB0aGUgYWN0aXZpdHkgb3IgYWN0aXZpdGllcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIHByZXZpZXcgd2hhdCB5b3VyIHByb2Nlc3Mgd2lsbCBsb29rIGxpa2UgaW4gYSBwdWJsaXNoZWQgV2ViCi1zaXRlIGF0IGFueSB0aW1lIGJ5IHN3aXRjaGluZyB0byB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgcHJvY2Vzcywgb3IgYW4gYWN0aXZpdHkgaW4gdGhlCi1wcm9jZXNzLCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gWW91IGNhbiB1c2UgdGhlCi1saW5rcyBvbiB0aGUgcGFnZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBwcm9jZXNzLiBTd2l0Y2ggYmFjayB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiB0bwotY29udGludWUgZWRpdGluZyB5b3VyIHByb2Nlc3MuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwYTA2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj48YSBuYW1lPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkluIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UgdmlldywgeW91IGNhbiBjcmVhdGUgYSBwcm9jZXNzIGJ5IGRlZmluaW5nCi13aGljaCB3b3JrIHByb2R1Y3RzIHdpbGwgYmUgY3JlYXRlZCBhbmQgdXNlZCBpbiB0aGUgcHJvY2VzcywgYW5kIHRoZW4gZmluZGluZwotcmVzcG9uc2libGUgcm9sZXMgYW5kIHRhc2tzIGZyb20gdGhlcmUuIFlvdSBjYW4gYWxzbyByZXZpZXcgdGhlIHdvcmsgcHJvZHVjdHMKLWluIGEgcHJvY2VzcyB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYnkgYWRkaW5nIHRhc2tzIG9yIHJvbGVzIHRvIHRoZSBwcm9jZXNzLjxwPkJlZm9yZQoteW91IGNyZWF0ZSBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZAotaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdAotY29uZmlndXJhdGlvbiBmb3IgeW91ciBwcm9jZXNzLjwvcD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gZGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmU6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhY2Nlc3MgdGhlIHdvcmsgcHJvZHVjdCB1c2FnZSBlZGl0b3IsIHNlbGVjdCB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3QKLVVzYWdlPC9zdHJvbmc+IHRhYiBpbiB0aGUgcHJvY2VzcyBlZGl0b3IuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRm9yIHRoZSBwdXJwb3NlcyBvZgotdGhpcyB0b3BpYywgdGhlIGJyZWFrZG93biBlbGVtZW50IGV4YW1wbGUgdXNlZCBpcyA8YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT4uIE90aGVyIGJyZWFrZG93biBlbGVtZW50cyBpbmNsdWRlIChidXQgYXJlIG5vdCBsaW1pdGVkCi10bykgPGEgaHJlZj0icGhhc2UuaHRtbCNwaGFzZSI+UGhhc2U8L2E+IGFuZCA8YSBocmVmPSJpdGVyYXRpb24uaHRtbCNpdGVyYXRpb24iPkl0ZXJhdGlvbjwvYT4uIFRoZSBlbGVtZW50IHlvdSB1c2UgZGVwZW5kcyBvbiB0aGUgc2NvcGUgb2YgdGhlIHByb2Nlc3MKLXlvdSBjcmVhdGUuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZWxlbWVudCAoZWl0aGVyIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBvciA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+KSB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgc3RydWN0dXJlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk5ldwotQ2hpbGQgJmd0OyBBY3Rpdml0eTwvc3Ryb25nPiB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcwotdG8gc2V0IHVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyAoYXMgd2VsbCBhcyBwaGFzZXMgYW5kIGl0ZXJhdGlvbnMpCi1jYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyIGFjY29yZGluZyB0byBob3cgZWFjaCByZWxhdGVzIGluIHRoZSBoaWVyYXJjaHkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJldmlldyB0aGUgbGlzdCBvZiB3b3JrIHByb2R1Y3RzIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBJbiB0aGlzIHZpZXcsIHdvcmsgcHJvZHVjdHMgYXJlIHNvcnRlZCBieSBkb21haW4gYXMKLXdlbGwgYXMgd29yayBwcm9kdWN0IGtpbmRzLiBEcmlsbCBpbnRvIGVpdGhlciBvZiB0aGVzZSBoaWVyYXJjaGllcyB0byBzZWUKLXdoaWNoIHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHdvcmsgcHJvZHVjdCB0byBhZGQgdG8gYWN0aXZpdHkgYW5kIHRoZW4gZHJhZyBpdCBvbiB0b3AKLW9mIHRoZSBhY3Rpdml0eSB3aGljaCB5b3Ugd2FudCBpdCB0byBiZWxvbmcuIFRoZSB3b3JrIHByb2R1Y3QgaXMgYWRkZWQgYXMKLWEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gdGhhdCBhY3Rpdml0eS4gSWYgdGhlIHdvcmsgcHJvZHVjdCBpcyBhbiBvdXRwdXQKLXRvIG9uZSBvciBtb3JlIHRhc2tzIGluIHRoZSBjb25maWd1cmF0aW9uLCBhIHdpemFyZCBhcHBlYXJzIHByb21wdGluZyB5b3UKLXRvIGFkZCB0aGUgdGFzay4gPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSXQgaXMgbm90IHJlcXVpcmVkIHRvIGFkZCBhIHRhc2suIEEgdmFsaWQKLXByb2Nlc3MgY2FuIGNvbnRhaW4ganVzdCByb2xlcyBhbmQgd29yayBwcm9kdWN0cy48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIGVudHJ5IGFuZCBleGl0IHN0YXRlcyBvZiB0aGUgd29yayBwcm9kdWN0IGZvciB0aGUgYWN0aXZpdHkKLXRvIHdoaWNoIGl0IHdhcyBhZGRlZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZGV0YWlscyBpbiB0aGUgcHJvcGVydGllcwotdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkLCByaWdodCBjbGljayB0aGUgd29yayBwcm9kdWN0Ci1kZXNjcmlwdG9yIGluIHRoZSBwcm9jZXNzIGVkaXRvciwgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPi4gVXNlIHRoZQotdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUKLXdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLiBJbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIGFsc28gcGVyZm9ybSBpbmRpdmlkdWFsCi1tb2RpZmljYXRpb25zIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwKLWFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgYWRkIGVudHJ5IGFuZCBleGl0IHN0YXRlcywgYW5kIG1vcmUuIFdoZW4gY2hhbmdpbmcKLXRoZSByb2xlIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIHVuZGVyIHRoZSBSb2xlcyBvciBXb3JrIFByb2R1Y3RzIHRhYnMsCi15b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZC4uLjwvc3Ryb25nPiBidXR0b24sCi1vciBjb25uZWN0IHlvdXIgcm9sZSBkZXNjcmlwdG9yIHdpdGggdGFza3MgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCNwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29udGludWUgYWRkaW5nIHdvcmsgcHJvZHVjdHMgdG8geW91ciBhY3Rpdml0aWVzLiA8L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5TZWUgYWxzbzo8L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBiMWIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGlmZmVyZW5jZXMgQmV0d2VlbiBJQk0gUlVQIDIwMDMgYW5kIE1pZ3JhdGVkIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1pZ3JhdGlvbm92ZXJ2aWV3Lmh0bWwjbWlncmF0aW9ub3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1pZ3JhdGVhbnJwdzIwMDNwbHVnaW4uaHRtbCNtaWdyYXRlYW5ycHcyMDAzcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRpZmZlcmVuY2VzIEJldHdlZW4gSUJNIFJVUCAyMDAzIGFuZCBNaWdyYXRlZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudCI+PGEgbmFtZT0iZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EaWZmZXJlbmNlcyBCZXR3ZWVuIElCTSBSVVAgMjAwMyBhbmQgTWlncmF0ZWQgQ29udGVudDwvaDE+Ci08ZGl2PjxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgY29udGVudCBpcyBiYXNlZCBvbiBJQk0gVW5pZmllZAotTWV0aG9kIEFyY2hpdGVjdHVyZS48L3A+Ci08dWw+PGxpPjxzdHJvbmc+QWN0aXZpdGllcyBoYXZlIGJlZW4gcmVuYW1lZCB0byB0YXNrPC9zdHJvbmc+OiBUbyBwcm92aWRlIGEgdGlnaHRlciBsaW5rCi10byBwcm9jZXNzIGVuYWN0bWVudCBhbmQgcHJvamVjdCBtYW5hZ2VtZW50IHdlIHJlbmFtZWQgdGhlIGxvd2VzdCBhc3NpZ25hYmxlCi11bml0cyBvZiB3b3JrIHRvIFRhc2ssIGJlY2F1c2UgdGhpcyBpcyB0aGUgdGVybSBtb3N0IGNvbW1vbmx5IHVzZWQuPC9saT4KLTxsaT48c3Ryb25nPldvcmtmbG93IGRldGFpbHMgcmVuYW1lZCB0byBhY3Rpdml0eTwvc3Ryb25nPjogV29ya2Zsb3dzIGFyZSBjb21tb25seSBleHByZXNzZWQKLWluIGhpZXJhcmNoaWVzIG9mIGFjdGl2aXR5IGRpYWdyYW1zIChlLmcuIGFjdGl2aXR5IGRpYWdyYW1zIGRlZmluZWQgaW4gdGhlCi1VTUwgMi4wKS4gIEFsdGhvdWdoIFJVUCBvbmx5IHByb3ZpZGVkIG9uZSBsZXZlbCBvZiB3b3JrZmxvdyBicmVha2Rvd24sIFVNQQotaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBtdWx0aXBsZSBsZXZlbHMgb2Ygc3VjaCBhIGJyZWFrZG93bi4gQmVjYXVzZSB0aGUgd29yZAotQWN0aXZpdHkgd2FzIG1vcmUgY29tbW9ubHkgdXNlZCB0byBleHByZXNzIHRoZSBlbGVtZW50cyBvZiBhY3Rpdml0eSBkaWFncmFtcwotYXMgd2VsbCBhcyB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBpdHNlbGYsIHdlIGRlY2lkZWQgdG8gcmVwbGFjZSB0aGUgbmFtZSBXb3JrZmxvdwotRGV0YWlsIHVzZWQgaW4gUlVQIHdpdGggdGhlIG5hbWUgQWN0aXZpdHkuICBXZSByZWFsaXplIHRoYXQgdGhlIHNoaWZ0IGluIHRoZQotdXNhZ2Ugb2YgdGhlIHdvcmQgQWN0aXZpdHkgbWlnaHQgY2F1c2UgY29uZnVzaW9uIHdpdGggZXhpc3RpbmcgUlVQIHVzZXJzLgotIEhvd2V2ZXIsIG9uZSBpbXBvcnRhbnQgZ29hbCBvZiB0aGUgVU1BIHdvcmsgd2FzIHRvIHVzZSB0ZXJtcyBpbiB0aGUgd2F5IHRoZXkKLWFyZSBtb3N0IGNvbW1vbmx5IHVzZWQgaW4gc3RhbmRhcmRzIGFuZCBpbmR1c3RyeS4gPC9saT4KLTxsaT48c3Ryb25nPlRhc2tzIChmb3JtZXIgUlVQIEFjdGl2aXRpZXMpIGNhbiBiZSBwZXJmb3JtZWQgYnkgbWFueSByb2xlczwvc3Ryb25nPjogCi1JbiBSVVAgMjAwMyBhbiBhY3Rpdml0eSB3YXMgbW9kZWxlZCBhcyBhbiBvcGVyYXRpb24gb2YgYSByb2xlLiAgQ3VzdG9tZXIgZmVlZGJhY2ssCi1hIGxvb2sgYXQgb3RoZXIgcHJvY2VzcyBtb2RlbGluZyBhcHByb2FjaGVzLCBhcyB3ZWxsIGFzIGNoYW5nZXMgaW50cm9kdWNlZAotaW4gVU1MIDIuMCBpbmRpY2F0ZWQgdGhhdCB0aGlzIHdhcyBhIHRvbyByZXN0cmljdGl2ZSB3YXkgb2YgbW9kZWxpbmcgaHVtYW4KLWJlaGF2aW9yLiAgVGhpcyBhcHByb2FjaCBkaWQgbm90IGFsbG93IGV4cHJlc3NpbmcgdGhhdCBzb21lIHdvcmsgd2FzIHBlcmZvcm1lZAotYXMgYSBjb2xsYWJvcmF0aW9uIG9mIGRpZmZlcmVudCByb2xlcy4gIFVNQSBhZGRyZXNzZXMgdGhpcyBpc3N1ZSBieSBtYWtpbmcKLVRhc2sgYW4gaW5kZXBlbmRlbnQgbW9kZWwgZWxlbWVudCB0byB3aGljaCBwZXJmb3JtaW5nIHJvbGVzIGNhbiBiZSBhc3NpZ25lZAotYXMgcmVzb3VyY2VzLiAgVU1BIHRoZXJlZm9yZSBub3cgYWxsb3dzIHNldmVyYWwgcm9sZXMgdG8gYmUgYXNzaWduZWQgdG8gYQotdGFzay4gIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpdCBzdGlsbCBhbGxvd3MgYSBwcmltYXJ5IHBlcmZvcm1pbmcgcm9sZQotdG8gYmUgaWRlbnRpZmllZCAoYmVpbmcgcmVzcG9uc2libGUgZm9yIHRoZSB0YXNrKSBhcyB3ZWxsIGFzIHNldmVyYWwgYWRkaXRpb25hbAotcGVyZm9ybWVycy48L2xpPgotPGxpPjxzdHJvbmc+UmVmaW5lbWVudCBvZiB0aGUgYXJ0aWZhY3QgY29uY2VwdDwvc3Ryb25nPjogUlVQIG9ubHkgdXNlZCB0aGUgY29uY2VwdCBvZgotYXJ0aWZhY3QgdG8gZGVmaW5lIHRoaW5ncyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuCi0gVU1BIGRlZmluZXMgYW4gZXh0ZW5kZWQgdGF4b25vbXkgZm9yIHRoZXNlIGNvbmNlcHRzLiAgSXQgZGVmaW5lcyB0aGUgZ2VuZXJhbAotY29uY2VwdCBvZiB3b3JrIHByb2R1Y3QsIHdoaWNoIGhhcyB0aHJlZSBkaWZmZXJlbnQgc3BlY2lhbGl6YXRpb25zIChzcGVjaWZpYwotd29yayBwcm9kdWN0IHR5cGVzKTogQXJ0aWZhY3RzIChtYW5hZ2VkIHdvcmsgcHJvZHVjdHMpLCBEZWxpdmVyYWJsZXMgKHBhY2thZ2VkCi13b3JrIHByb2R1Y3RzIHRoYXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gYSBzdGFrZWhvbGRlciBmb3IgcmV2aWV3KSwgYW5kIE91dGNvbWUKLSh1bm1hbmFnZWQsIGludGFuZ2libGUgd29yayBwcm9kdWN0cykuPC9saT4KLTxsaT48c3Ryb25nPkRpZmZlcmVudCBjYXRlZ29yaXphdGlvbnMgZm9yIHdvcmsgcHJvZHVjdHMgYW5kIHJvbGVzPC9zdHJvbmc+OiBJbiBSVVAsCi1hcnRpZmFjdHMgYW5kIHJvbGVzIHdlcmUgYWxsIGNhdGVnb3JpemVkIGJ5IGRpc2NpcGxpbmUuIEhvd2V2ZXIsIHNvbWV0aW1lcwotYXJ0aWZhY3RzIHdlcmUgdXNlZCBhY3Jvc3MgZGlzY2lwbGluZXMgYW5kIGEgY2F0ZWdvcml6YXRpb24gdG8gb25seSBvbmUgZGlzY2lwbGluZQotY2F1c2VkIGNvbmZ1c2lvbi4gIEluIFVNQSBkaWZmZXJlbnQgY2F0ZWdvcmllcyBoYXZlIGJlZW4gZGVmaW5lZCBmb3Igd29yawotZGVmaW5pdGlvbnMgKGRpc2NpcGxpbmUgZm9yIHRhc2tzIGFuZCBhY3Rpdml0aWVzKSwgd29yayBwcm9kdWN0cyAoZG9tYWluIGFuZAotd29yayBwcm9kdWN0IGtpbmQpLCBhbmQgcm9sZXMgKHJvbGUgc2V0cykuPC9saT4KLTxsaT48c3Ryb25nPlByb2Nlc3MgQ29tcG9uZW50cyByZW5hbWVkIHRvIE1ldGhvZCBQYWNrYWdlPC9zdHJvbmc+OiAgVGhlIGNvbmNlcHQgb2YgY29tcG9uZW50Ci1pcyBjb21tb25seSB1c2VkIGluIG1hbnkgc3RhbmRhcmRzIGFuZCB0ZWNobm9sb2dpZXMuICBNb3N0IGFwcGxpY2F0aW9ucyBvZgotY29tcG9uZW50IGxpbmsgaXQgdG8gdGhlIGFic3RyYWN0aW9uIG9mIGVuY2Fwc3VsYXRpb24gZGVmaW5pbmcgYSBjb21wb25lbnQKLWFzIGEgYmxhY2sgYm94IHdoaWNoIGNhbiBiZSB1c2VkIHZpYSB3ZWxsLWRlZmluZWQgaW50ZXJmYWNlcy4gIFJVUCBjb21wb25lbnQKLWRpZCBub3QgZnVsZmlsbCB0aGlzIGJsYWNrIGJveCBjcml0ZXJpb24uICBBbHNvIHRoZSBTUEVNIHN0YW5kYXJkIGRlZmluZWQKLXBhY2thZ2VzIGFzIHdlbGwgYXMgY29tcG9uZW50cy4gVG8gYmUgY29tcGxpYW50IHRvIFNQRU0gYW5kIHRoZSBpbmR1c3RyeSB1c2FnZQotb2YgdGhlIHdvcmQgY29tcG9uZW50LCB3ZSByZW5hbWVkIFByb2Nlc3MgQ29tcG9uZW50IHRvIE1ldGhvZCBQYWNrYWdlICgnbWV0aG9kJwotYmVjYXVzZSBpdCBjYW4gY29udGFpbiBtZXRob2QgZWxlbWVudHMgb3IgcHJvY2VzcyBlbGVtZW50cyk8L2xpPgotPGxpPjxzdHJvbmc+U2VwYXJhdGlvbiBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyBmcm9tIHByb2Nlc3MgZWxlbWVudHM8L3N0cm9uZz46IEluCi1SVVAgMjAwMyB5b3UgY3JlYXRlZCBhIG5ldyBwcm9jZXNzIGJ5IGRlZmluaW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gYW5kIGRvY3VtZW50aW5nCi1tYW51YWxseSBpbiBhIGRldmVsb3BtZW50IGNhc2UgYXJ0aWZhY3QgY2hhbmdlcyB0byBzdGFuZGFyZCBSVVAuICBVTUEgcHJvdmlkZXMKLWV4dGVuZGVkIGNvbmNlcHRzIGluIGFkZGl0aW9uIHRvIHRoZSBjb25maWd1cmF0aW9uIGNvbmNlcHQgZm9yIHRhaWxvcmluZyBwcm9jZXNzZXMuCi0gSXQgYWxsb3dzIHlvdSB0byBtb2RlbCBjb25jcmV0ZWx5IGZvciBhIHByb2Nlc3Mgd2hhdCB3b3JrIGRlZmluZWQgaW4gdGhlCi1tZXRob2QgY29udGVudCB5b3Ugd2FudCB0byBhY3R1YWxseSBkbyBpbiBlYWNoIHBoYXNlLCBiZWNhdXNlIHlvdSBjYW4gZWFzaWx5Ci1hZGQsIHJlbW92ZSwgYW5kIHJlb3JkZXIgZWxlbWVudHMgaW4gdGhlIHByb2Nlc3Mgc3RydWN0dXJlLCByZXVzaW5nIG9yIG5vdAotcmV1c2luZyB3aGF0ZXZlciB5b3Ugd2FudCBmcm9tIHRoZSBtZXRob2QgY29udGVudC4gSXQgYWNoaWV2ZXMgdGhlc2UgZmVhdHVyZXMKLWJ5IGEgbW9yZSBjbGVhciBzZXBhcmF0aW9uIG9mIG1ldGhvZCBjb250ZW50IChlLmcuIHRhc2tzIGRlZmluZWQgZm9yIGRpc2NpcGxpbmVzKQotYW5kIHRoZSBhcHBsaWNhdGlvbiBvZiBtZXRob2QgY29udGVudCBpbiBwcm9jZXNzIChleHByZXNzZWQgd2l0aCBhY3Rpdml0eQotZGlhZ3JhbXMgYW5kL29yIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZXMpIGFzIHdlbGwgYXMgdGhlIG1vZGVsaW5nIG9mIHByb2Nlc3NlcwotKGkuZS4gY3JlYXRpbmcgbmV3IG9yIGFkYXB0ZWQgYWN0aXZpdHkgZGlhZ3JhbXMgb3IgbmV3IG9yIGFkYXB0ZWQgd29yayBicmVha2Rvd24KLXN0cnVjdHVyZXMpLiAgSXQgaW50cm9kdWNlcyBhIGZldyBuZXcgY29uY2VwdHMgc3VjaCBhcyBkZXNjcmlwdG9yIHRoYXQgc3VwcG9ydAotdGhpcyBzZXBhcmF0aW9uIGFuZCBhY2hpZXZlIG5ldyBjYXBhYmlsaXRpZXMgZm9yIG1haW50YWluaW5nIGFuZCByZXVzaW5nIG1hbnkKLWRpZmZlcmVudCBmYW1pbGllcyBvZiBhbHRlcm5hdGl2ZSBwcm9jZXNzZXMgYW5kIHByb2Nlc3MgcGFydHMgYWxsIHdpdGhpbiB0aGUKLXNhbWUgY29uZmlndXJhdGlvbi48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1pZ3JhdGlvbm92ZXJ2aWV3Lmh0bWwjbWlncmF0aW9ub3ZlcnZpZXciPk1pZ3JhdGlvbiBPdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtaWdyYXRlYW5ycHcyMDAzcGx1Z2luLmh0bWwjbWlncmF0ZWFucnB3MjAwM3BsdWdpbiI+TWlncmF0ZSBhbiBJQk0gUlVQIDIwMDMuMDYgUGx1Z2luPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Rpc2NpcGxpbmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Rpc2NpcGxpbmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1YTI5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaXNjaXBsaW5lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEaXNjaXBsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRpc2NpcGxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGlzY2lwbGluZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGlzY2lwbGluZSI+PGEgbmFtZT0iZGlzY2lwbGluZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRpc2NpcGxpbmU8L2gxPgotPGRpdj48cD5BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrczwvYT4gdGhhdAotYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciBhcmVhIG9mIGNvbmNlcm4gd2l0aGluIHRoZSBvdmVyYWxsIElUIGVudmlyb25tZW50LgotRm9yIGV4YW1wbGUsIG9uIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgaXQgaXMgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbgotcmVxdWlyZW1lbnRzIHRhc2tzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gdGFza3MuIFNlcGFyYXRpbmcKLXRoZXNlIHRhc2tzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIHRhc2tzIGVhc2llciB0byBjb21wcmVoZW5kLgotRGlzY2lwbGluZXMgY2FuIGJlIG9yZ2FuaXplZCB1c2luZyBEaXNjaXBsaW5lIEdyb3VwaW5ncy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RvbWFpbi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZG9tYWluLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNDIzNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZG9tYWluLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEb21haW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZG9tYWluIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRvbWFpbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZG9tYWluIj48YSBuYW1lPSJkb21haW4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Eb21haW48L2gxPgotPGRpdj48cD5BIERvbWFpbiBpcyBhIHJlZmluZWFibGUsIGxvZ2ljYWwsIGhpZXJhcmNoeSBvZiByZWxhdGVkIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdHM8L2E+IGdyb3VwZWQgdG9nZXRoZXIgYmFzZWQgb24gdGltaW5nLCByZXNvdXJjZXMsCi1vciByZWxhdGlvbnNoaXAuIFdoaWxlIGEgRG9tYWluIGNhdGVnb3JpemVzIG1hbnkgd29yayBwcm9kdWN0cywgYSB3b3JrIHByb2R1Y3QKLWJlbG9uZ3MgdG8gb25seSBvbmUgRG9tYWluLiBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucy4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leGFtcGxlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leGFtcGxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMWE1MTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXhhbXBsZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRXhhbXBsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJleGFtcGxlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImV4YW1wbGUiPjxhIG5hbWU9ImV4YW1wbGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeGFtcGxlPC9oMT4KLTxkaXY+PHA+QW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhbiBleGFtcGxlIG9mIGEKLWNvbXBsZXRlZCB3b3JrIHByb2R1Y3QuIDwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4dGVuZHMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4dGVuZHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZmI0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leHRlbmRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFeHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZXh0ZW5kcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5FeHRlbmRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJleHRlbmRzIj48YSBuYW1lPSJleHRlbmRzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RXh0ZW5kczwvaDE+Ci08ZGl2PjxwPkFuIGV4dGVuZGluZyBlbGVtZW50IGluaGVyaXRzIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgYmFzZSBlbGVtZW50LiBFeHRlbnNpb24KLWFsbG93cyBNZXRob2QgUGx1Zy1pbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBiYXNlIHBsdWctaW4gYnkgcHJvdmlkaW5nCi1hIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBleHRlbmRpbmcgZWxlbWVudC4gQXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24KLWluc3RhbmNlcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlICJiYXNlZC1vbiIgZWxlbWVudCB0byB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuCi1UaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGV4dGVuZGluZyBlbGVtZW50IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSAiYmFzZWQtb24iCi1lbGVtZW50LCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiBFeHRlbmRzIGlzIG5vdCB1c2VkIHRvIG1vZGlmeQotY29udGVudCBvZiB0aGUgYmFzZSBwbHVnLWluLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZwotcGx1Zy1pbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZC4KLUZvciBleGFtcGxlLCBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlCi1vZiByZXZpZXcuIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgYW5kIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nCi1lbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHRocm91Z2ggdGhlIGV4dGVuZHMKLXJlbGF0aW9uc2hpcC4gRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIGNhcGFiaWxpdHkKLXBhdHRlcm5zIHRvIHByb2Nlc3NlczogQSBwYXR0ZXJuIGlzIGFwcGxpZWQgYnkgZGVmaW5pbmcgYW4gZXh0ZW5kcyByZWxhdGlvbnNoaXAKLWZyb20gYW4gYWN0aXZpdHkgb2YgdGhlIGFwcGx5aW5nIHByb2Nlc3NlcyB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuLiBUaGUKLWFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9uIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzCi10byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgcHJvY2VzcyBhZnRlciBpbnRlcnByZXRhdGlvbi48L3A+Ci08cD5Vc2UgdGhlIENvbnRlbnQgVmFyaWFiaWxpdHkgc2VjdGlvbiBvbiB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIG1ha2UgYW4gZWxlbWVudAotZXh0ZW5kIGFub3RoZXIgZWxlbWVudC4gU2VsZWN0IDxzdHJvbmc+RXh0ZW5kczwvc3Ryb25nPiBhcyB0aGUgVmFyaWFiaWxpdHkgVHlwZSwgYW5kCi10aGVuIHNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IHdoaWNoIHRoaXMgZWxlbWVudCBleHRlbmRzLiBUaGUgYmFzZSBlbGVtZW50Ci1tdXN0IGJlIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudCBhcyB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuPC9wPgotPHA+QW55IGluZm9ybWF0aW9uIHlvdSBlbnRlciBpbiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGJhc2UKLWVsZW1lbnQgaW4gY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBlbGVtZW50LiBUZXh0IGZpZWxkcyBpbiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQKLWFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSByZXNwZWN0aXZlIHRleHQgZmllbGRzIGluIHRoZSBiYXNlIGVsZW1lbnQuPC9wPgotPHA+RXh0ZW5kcyBvbmx5IGRlZmluZXMgaW5oZXJpdGFuY2UgZm9yIHRoZSBleHRlbmRpbmcgZWxlbWVudC4gVGhlIGJhc2UgcmVtYWlucwotdW50b3VjaGVkLiBJZiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaXMgYWxsb3dlZCBhbiBhc3NvY2lhdGlvbiB0byBvbmx5IG9uZQotb3RoZXIgZWxlbWVudCBhbmQgaGFzIHN1Y2ggYW4gZWxlbWVudCBkZWZpbmVkIGl0c2VsZiwgaW5oZXJpdGFuY2Ugd2lsbCBub3QKLW92ZXJyaWRlIHRoaXMgYXNzb2NpYXRpb24uPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5FeHRlbmRzIHJ1bGVzOjwvc3Ryb25nPjx1bD48bGk+QXR0cmlidXRlIHZhbHVlcyBvZiB0aGUgYmFzZSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlIGV4dGVuZGluZyBlbGVtZW50Ci1pZiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIG5vdCBkZWZpbmVkIGl0cyBvd24gdmFsdWVzLjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tbWFueSBhc3NvY2lhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZQotZXh0ZW5kaW5nIGVsZW1lbnQuPC9saT4KLTxsaT5PdXRnb2luZyB0by1vbmUgYXNzb2NpYXRpb25zIGFyZSBvbmx5IGluaGVyaXRlZCBpZiB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQKLWRvZXMgbm90IGRlZmluZSBpdHMgb3duIHRvLW9uZSBhc3NvY2lhdGlvbi48L2xpPgotPGxpPkV4dGVuZHMgd29ya3MgdHJhbnNpdGl2ZWx5LCBpLmUuIGlmIGFuIGV4dGVuZGluZyBlbGVtZW50IGlzIGV4dGVuZGVkIGl0c2VsZiwKLXRoZSBzZWNvbmQgZXh0ZW5zaW9uIGluaGVyaXRzIGZyb20gaXRzIGRpcmVjdCBhbmQgaW5kaXJlY3QgYmFzZSBlbGVtZW50cy48L2xpPgotPGxpPkNvbnRyaWJ1dGlvbiBwcmVjZWRlcyBFeHRlbmRzLCBpLmUuIGNvbnRyaWJ1dGlvbiBpcyBldmFsdWF0ZWQgZmlyc3QgYW5kCi10aGVuIGV4dGVuZGluZyBlbGVtZW50cyBpbmhlcml0IGFmdGVyd2FyZHMgZnJvbSB0aGUgYmFzZSBlbGVtZW50IChpbmNsdWRpbmcKLWFsbCBvZiBpdHMgY29udHJpYnV0aW9uKS48L2xpPgotPGxpPlJlcGxhY2UgcHJlY2VkZXMgRXh0ZW5kcywgaS5lLiBpZiBhIGJhc2UgZWxlbWVudCBoYXMgYSByZXBsYWNlIGFuZCBleHRlbmRzCi1yZWxhdGlvbnNoaXAsIHRoZSBleHRlbmRpbmcgZWxlbWVudCBpbmhlcml0cyBmcm9tIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L2xpPgotPC91bD4KLVNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhc3NvY2lhdGlvbnMgZm9yIGVhY2ggZWxlbWVudAotdHlwZS48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiPlJlcGxhY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIj5Db250cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9maW5kcmVwbGFjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9maW5kcmVwbGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Mzk2M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZmluZHJlcGxhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGFuY2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRhbmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NzJhNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGFuY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHdWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5HdWlkYW5jZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZ3VpZGFuY2UiPjxhIG5hbWU9Imd1aWRhbmNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R3VpZGFuY2U8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5HdWlkYW5jZSBpcyBhIGdlbmVyYWwgdGVybSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5yb2xlczwvYT4sIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj50YXNrczwvYT4sIGFuZCA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij53b3JrIHByb2R1Y3RzPC9hPi4gRXhhbXBsZXMgb2YgZ3VpZGFuY2UgYXJlOjx1bD48bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+R3VpZGVsaW5lPC9zcGFuPjwvc3Ryb25nPiAtIFByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdwotdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcywgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsCi1kZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuCi1BbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50Ci1hcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24KLW9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlCi10aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkCi1hY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgYW5kIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+VGVtcGxhdGU8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQKLXByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywKLWFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zCi1hbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5Ci1iZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YQotc3RvcmVzLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+Q2hlY2tsaXN0PC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0Ci1pZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaWZpZWQuIENoZWNrbGlzdHMKLWFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Ub29sIE1lbnRvcjwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdAotc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmssIGVpdGhlcgotaW4gdGhlIGNvbnRleHQgb2YsIG9yIGluZGVwZW5kZW50IGZyb20sIGEgdGFzayBvciBhY3Rpdml0eS48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L3NwYW4+PC9zdHJvbmc+IC0gVXNlZCBhcyBhIGNhdGNoIGFsbCBmb3IKLW90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkCi10byBhbGwga2luZHMgb2YgY29udGVudCBlbGVtZW50cywgaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UmVwb3J0PC9zcGFuPjwvc3Ryb25nPiAtIEEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0Ci1pcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtCi1vZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LAotd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsCi1hbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uCi1pbnRvIGEgcmVwb3J0LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+Q29uY2VwdDwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcwota2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4KLUNvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIGd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzCi1zZXZlcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3Mgb3IgYWN0aXZpdGllcy48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlByYWN0aWNlPC9zcGFuPjwvc3Ryb25nPiAtIFJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5Ci1vZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdAotb3IgcHJvY2VzcyBxdWFsaXR5LiBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuCi1UaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1heSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3IKLXNwZWNpZmljIHByb2Nlc3MuIDxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UmV1c2FibGUgQXNzZXQ8L3NwYW4+PC9zdHJvbmc+IC0gUHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0KLWZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uCi1pbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLgotVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyBob3cgdGhlCi1hc3NldCBzaG91bGQgYmUgdXNlZC48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlRlcm0gRGVmaW5pdGlvbjwvc3Bhbj48L3N0cm9uZz4gLSBEZWZpbmVzIGNvbmNlcHRzIGFuZCBpcyB1c2VkCi10byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIEEgdGVybSBkZWZpbml0aW9uIGlzIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIGNvbnRlbnQKLWVsZW1lbnRzLCBidXQgaXRzIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIHRlcm0gaXMgdXNlZCBpbiB0aGUKLWNvbnRlbnQgZWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPldoaXRlIFBhcGVyPC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lhbCBjb25jZXB0IGd1aWRhbmNlIHRoYXQKLWhhcyBiZWVuIGV4dGVybmFsIHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4KLWlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPkV4YW1wbGU8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMKLWFuIGV4YW1wbGUgb2YgYSBjb21wbGV0ZWQgd29yayBwcm9kdWN0LjwvbGk+Ci08L3VsPgotU2VlIGFsc286PC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGVsaW5lLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkZWxpbmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllNzg4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkZWxpbmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikd1aWRlbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJndWlkZWxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+R3VpZGVsaW5lPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJndWlkZWxpbmUiPjxhIG5hbWU9Imd1aWRlbGluZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkd1aWRlbGluZTwvaDE+Ci08ZGl2PjxwPkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsCi1vbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcywgb3IgdGhhdCBwcm92aWRlcwotYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuCi1BbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50Ci1hcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24KLW9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlCi10aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkCi1hY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcywgYW5kIG1hdHVyaXR5LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2libWRpdGEuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaWJtZGl0YS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYTI2YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaWJtZGl0YS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0udW5yZXNvbHZlZCB7IGJhY2tncm91bmQtY29sb3I6IHNreWJsdWU7IH0KLS5ub1RlbXBsYXRlIHsgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OyB9Ci0KLS5zaWRlYmFyIHtiYWNrZ3JvdW5kOiBzaWx2ZXIgfQotLnRvYyB7Zm9udC1zaXplOiBzbWFsbDsgfQotCi0uYmFzZSB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7IH0KLS5icmVhZGNydW1iIHsgZm9udC1zaXplIDogc21hbGxlcjt9Ci0ucHJlcmVxIHsgbWFyZ2luLWxlZnQgOiAyMHB4O30KLS5oaWVyYXJjaHkgeyBkaXNwbGF5OiBibG9jazsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS5uZXN0ZWQwIHsgbWFyZ2luLXRvcCA6IDFlbTt9Ci0ubmVzdGVkMSB7IH0KLS5uZXN0ZWQyIHsgfQotCi0ucCB7bWFyZ2luLXRvcDogMWVtfQotCi0udGFibGVib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0udGFibGVub2JvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLWNhcHRpb24geyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LXN0eWxlOiBpdGFsaWMgfQotLnNpbXBsZXRhYmxlYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnNpbXBsZXRhYmxlbm9ib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uY2hvaWNldGFibGVib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uY2hvaWNldGFibGVub2JvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLmZpZ2NhcCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uZmlnZGVzYyB7IGZvbnQtc3R5bGU6IG5vcm1hbCB9Ci0KLS5maWdub25lIHttYXJnaW4tdG9wOiAxZW19Ci0uZmlnYm9yZGVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdzaWRlcyB7IGJvcmRlci1sZWZ0IDogMnB4IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci1yaWdodCA6IDJweCBzb2xpZDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdib3R0b20geyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcGJvdCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLnN5bm5vbmUge21hcmdpbi10b3A6IDFlbX0KLS5zeW5ib3JkZXIgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLnN5bnNpZGVzIHsgYm9yZGVyLWxlZnQgOiAycHggc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXJpZ2h0IDogMnB4IHNvbGlkOyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3ludG9wIHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLnN5bmJvdHRvbSB7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3ludG9wYm90IHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotCi0uc2tpcCB7IG1hcmdpbi10b3A6IDFlbSB9Ci0uc2tpcHNwYWNlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnVsbGlua3MgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotLnVsY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLm9sY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0IHsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdHdpdGhjaGlsZCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0uc3VibGlua2xpc3QgeyBtYXJnaW4tbGVmdDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnJlbGNvbmNlcHRzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHRhc2tzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHJlZiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxpbmZvIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotZGl2LmJyZWFkY3J1bWIge21hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS50b3BpY3RpdGxlMSB7IG1hcmdpbi10b3A6IDBwYzsgbWFyZ2luLWJvdHRvbTogLjFlbTsgZm9udC1zaXplOiAxLjM0ZW07IH0KLS50b3BpY3RpdGxlMiB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjQ1ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyB9Ci0udG9waWN0aXRsZTMgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC4xN2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNCB7IG1hcmdpbi10b3A6IC44M2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNSB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU2IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnNlY3Rpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMGVtOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDt9Ci0uc2VjdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5leGFtcGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0ubm90ZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ubm90ZXRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLm5vdGVsaXN0dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0udGlwIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS50aXB0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5mYXN0cGF0aCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uZmFzdHBhdGh0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5pbXBvcnRhbnQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmltcG9ydGFudHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlbWVtYmVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZW1lbWJlcnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlc3RyaWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZXN0cmljdGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmF0dGVudGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uYXR0ZW50aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VydGl0bGUgeyBtYXJnaW4tdG9wOiAxZW07IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXIgeyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogc29saWQ7IGJvcmRlci13aWR0aDogdGhpbjsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi10b3A6IDJweDsgbWFyZ2luLWJvdHRvbSA6IDFlbTsgfQotLmNhdXRpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmNhdXRpb24geyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLWJvdHRvbSA6IDFlbTsgfQotCi11bC5zaW1wbGUgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotCi0uZmlyc3Rjb2wgeyBmb250LXdlaWdodCA6IGJvbGQ7fQotCi0uYm9sZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uYm9sZEl0YWxpYyB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5pdGFsaWMgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS51bmRlcmxpbmVkIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS51aWNvbnRyb2wgeyBmb250LXdlaWdodDogYm9sZDsgfQotLnBhcm1uYW1lIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZwYXJtbmFtZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLmt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uZGVma3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udmFyIHsgZm9udC1zdHlsZSA6IGl0YWxpYzt9Ci0uc2hvcnRjdXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotCi0ucHRvY0gxIHtmb250LXNpemU6IHgtc21hbGw7IH0KLS5wdG9jSDIge2ZvbnQtc2l6ZTogeC1zbWFsbDsgfQotCi0uc21hbGxDYXBzIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgZm9udC1zaXplOiBzbWFsbGVyOyB9Ci0uc3RpdGxlIHsgZm9udC1zdHlsZTogaXRhbGljOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLm50ZSB7fQotCi0uZGx0ZXJtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kbHRlcm1leHBhbmQgeyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMWVtOyB9Ci0uZGVmTGlzdEhlYWQgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS5wYXJtTGlzdEt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ucGFybUxpc3RWYXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5wayB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotCi0qW2NvbXBhY3Q9InllcyJdPmxpIHsgbWFyZ2luLXRvcDogMGVtO30KLSpbY29tcGFjdD0ibm8iXT5saSB7IG1hcmdpbi10b3A6IC41M2VtO30JCi0ubGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc2xpZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRsZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRkZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnN0ZXBleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3Vic3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotZGl2LmltYWdlbGVmdCB7IHRleHQtYWxpZ246IGxlZnQgfQotZGl2LmltYWdlY2VudGVyIHsgdGV4dC1hbGlnbjogY2VudGVyIH0KLWRpdi5pbWFnZXJpZ2h0IHsgdGV4dC1hbGlnbjogcmlnaHQgfQotZGl2LmltYWdlanVzdGlmeSB7IHRleHQtYWxpZ246IGp1c3RpZnkgfQotCi1wcmUuc2NyZWVuIHsgcGFkZGluZzogNXB4IDVweCA1cHggNXB4OyBib3JkZXI6IG91dHNldDsgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsgbWFyZ2luLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tIDogMnB4OyB3aGl0ZS1zcGFjZTogcHJlfQotCi1DSVRFIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci1FTSB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotU1RST05HIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLVZBUiB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBTdHlsZXMgYWRkZWQgdG8gc3VwcG9ydCAuTkVUIG91dHB1dC4gTm90IHVzZWQgYnkgc3RhbmRhcmQgcHJvY2Vzc2luZy4gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1ib2R5LmRvdG5ldCAvKiBUaGlzIGJvZHkgdGFnIHJlcXVpcmVzIHRoZSB1c2Ugb2Ygb25lIG9mIHRoZSBzZXRzIG9mIGJhbm5lciBhbmQvb3IgdGV4dCBkaXYgaWRzICovCi0JewotCW1hcmdpbjogMHB4IDBweCAwcHggMHB4OwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOyAKLQljb2xvcjogIzAwMDAwMDsKLQl3aWR0aDogMTAwJTsKLQl9Ci0KLWRpdi5uc3RleHQgLyogQ3JlYXRlcyB0aGUgc2Nyb2xsaW5nIHRleHQgYXJlYSBmb3IgTm9uc2Nyb2xsaW5nIHJlZ2lvbiB0b3BpYyAqLwotCXsKLQlwYWRkaW5nOiA1cHggMTBweCAwcHggMjJweDsgCi0JfQotCi1kaXYubnNiYW5uZXIgLyogQ3JlYXRlcyBOb25zY3JvbGxpbmcgYmFubmVyIHJlZ2lvbiAqLwotCXsKLQlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JbGVmdDogMHB4OwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsKLQlib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTk5OTsKLQl9Ci0KLWRpdi5iYW5uZXJyb3cxIC8qIHByb3ZpZGVzIGZ1bGwtd2lkdGggY29sb3IgdG8gdG9wIHJvdyBpbiBydW5uaW5nIGhlYWQgKi8KLQl7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsKLQl9Ci0KLS8qICAgICAgIFNUWUxFUyBGT1IgUlVOTklORyBIRUFEUyAgICAgICovCi0KLXRhYmxlLmJhbm5lcnBhcnRoZWFkLCB0YWJsZS5iYW5uZXJ0aXRsZSAvKiBHZW5lcmFsIHZhbHVlcyBmb3IgdGhlIFJ1bm5pbmcgSGVhZCB0YWJsZXMgKi8KLQl7Ci0JcG9zaXRpb246IHJlbGF0aXZlOwotCWxlZnQ6IDBweDsKLQl0b3A6IDBweDsKLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0JbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci0JaGVpZ2h0OiAyMXB4OyAKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotCWJvcmRlci1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiAwcHg7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsgCi0JZm9udC1zaXplOiAxMDAlOwotCX0KLXRhYmxlLmJhbm5lcnBhcnRoZWFkIHRkIC8qIEdlbmVyYWwgVmFsdWVzIGZvciBjZWxscyBpbiB0aGUgdG9wIHJvdyBvZiBydW5uaW5nIGhlYWQgKi8KLQl7Ci0JbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Ci0JcGFkZGluZzogMnB4IDBweCAwcHggNHB4OwotCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci0JLypib3JkZXItd2lkdGg6IDBweCAwcHggMXB4IDBweDsgKi8KLQlib3JkZXItd2lkdGg6IDBweAotCWJvcmRlci1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLWNvbG9yOiAjOTk5OTk5OwotCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyAKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQl9Ci10YWJsZS5iYW5uZXJwYXJ0aGVhZCB0ZC5wcm9kdWN0IC8qIFZhbHVlcyBmb3IgdG9wIHJpZ2h0IGNlbGwgaW4gcnVubmluZyBoZWFkICovCi0JeyAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb3dzIGZvciBhIHNlY29uZCB0ZXh0IGJsb2NrIGluIHRoZSBydW5uaW5nIGhlYWQgKi8KLQl0ZXh0LWFsaWduOiByaWdodDsKLQlwYWRkaW5nOiAycHggNXB4IDBweCA1cHg7Ci0JfQotCi1oMS5kdEgxIHsKLQltYXJnaW4tbGVmdDogLTE4cHg7Ci0JfQotZGl2LnRpdGxlcm93IC8qIHByb3ZpZGVzIG5vbi1zY3JvbGwgdG9waWMgdGl0bGUgYXJlYSAocmVxdWlyZXMgc2NyaXB0KSAqLwotCXsKLQl3aWR0aDogMTAwJTsgLyogRm9yY2VzIHRhYmxlcyB0byBoYXZlIGNvcnJlY3QgcmlnaHQgbWFyZ2luICovCi0JcGFkZGluZzogMHB4IDEwcHggMHB4IDIycHg7IAotCWJhY2tncm91bmQtY29sb3I6ICM5OWNjZmY7ICAgICAgICAKLQl9Ci1kaXYudGl0bGVyb3cgaDEKLQl7Ci0JbWFyZ2luLXRvcDogMGVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IC4yZW0KLQl9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pbmRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaW5kZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxZmI3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRhbGljLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0YWxpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTNlMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0ZXJhdGlvbi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRlcmF0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGEzNmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRlcmF0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJdGVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iaXRlcmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkl0ZXJhdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iaXRlcmF0aW9uIj48YSBuYW1lPSJpdGVyYXRpb24iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JdGVyYXRpb248L2gxPgotPGRpdj48cD5JdGVyYXRpb24gaXMgYSBncm91cCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4KLUl0ZXJhdGlvbiByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4KLXJlcGV0aXRpdmUgY3ljbGVzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2xpYnJhcnl2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9saWJyYXJ5dmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjI3ZTk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2xpYnJhcnl2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJMaWJyYXJ5IFZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibGlicmFyeXZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TGlicmFyeSBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJsaWJyYXJ5dmlldyI+PGEgbmFtZT0ibGlicmFyeXZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaWJyYXJ5IFZpZXc8L2gxPgotPGRpdj48cD5UaGUgTGlicmFyeSBWaWV3IGRpc3BsYXlzIHRoZSBNZXRob2QgUGx1Zy1pbnMgYW5kIENvbmZpZ3VyYXRpb25zIGNvbnRhaW5lZAotaW4gYSA8YSBocmVmPSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIj5NZXRob2QgTGlicmFyeTwvYT4uPC9wPgotPHA+VGhlIExpYnJhcnkgVmlldyBpcyBhdmFpbGFibGUgb25seSBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiBhbmQsCi13aGVuIG9wZW4sIGVuYWJsZXMgdGhlIGNyZWF0aW9uLCBtb2RpZmljYXRpb24gYW5kIHZpZXdpbmcgb2YgYWxsIGVsZW1lbnQgdHlwZXMuPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9InByZXZpb3VzbGluayI+PHN0cm9uZz5QcmV2aW91cyB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCI+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMmNlZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aF92c19wcm9jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhfdnNfcHJvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDVhYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aF92c19wcm9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ1NjdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2RhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Ij48YSBuYW1lPSJtZXRob2RhdXRob3JpbmdvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBjb250ZW50IGlzIGRlc2NyaWJlZCBieSBkZWZpbmluZyB0YXNrcyB0aGF0IGhhdmUgd29yayBwcm9kdWN0cyBhcwotaW5wdXRzIGFuZCBvdXRwdXRzIGFuZCB0aGF0IGFyZSBwZXJmb3JtZWQgYnkgcm9sZXMuIFRoZSByb2xlcyBhbHNvIGRlZmluZQotcmVzcG9uc2liaWxpdHkgcmVsYXRpb25zaGlwcyB0byB0aGUgd29yayBwcm9kdWN0cy48L3A+Ci08cD48aW1nIHNyYz0ibWMuZ2lmIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIGRlcGljdHMgdHlwaWNhbCBzb3VyY2VzIGZvciBtZXRob2QgY29udGVudCwgYXMgd2VsbCBhcwotaG93IHRoZSBtZXRob2QgY29udGVudCBpcyByZXByZXNlbnRlZC4gVG8gbGVhcm4gYWJvdXQgZGV2ZWxvcG1lbnQgbWV0aG9kcywKLXBlb3BsZSByZXNlYXJjaCBpbiBsaWJyYXJpZXMgb3IgcmVjZWl2ZSB0cmFpbmluZy4gRGV2ZWxvcG1lbnQgbWV0aG9kcyBhcmUKLXR5cGljYWxseSBkZXNjcmliZWQgaW4gcHVibGljYXRpb25zIHN1Y2ggYXMgYm9va3MsIGFydGljbGVzLCB0cmFpbmluZyBtYXRlcmlhbCwKLXN0YW5kYXJkcyBhbmQgcmVndWxhdGlvbnMsIG9yIGFueSBvdGhlciBmb3JtIG9mIGRvY3VtZW50YXRpb24uIFRoZXNlIHNvdXJjZXMKLXVzdWFsbHkgZG9jdW1lbnQgbWV0aG9kcyBieSBwcm92aWRpbmcgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyCi13YXkgb2YgYWNoaWV2aW5nIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbCB1bmRlciBnZW5lcmFsIGNpcmN1bXN0YW5jZXMuCi1Tb21lIGV4YW1wbGVzIGFyZTogdHJhbnNmb3JtaW5nIGEgcmVxdWlyZW1lbnRzIGRvY3VtZW50IGludG8gYW4gYW5hbHlzaXMgbW9kZWw7Ci1kZWZpbmluZyBhbiBhcmNoaXRlY3R1cmFsIG1lY2hhbmlzbSBiYXNlZCBvbiBmdW5jdGlvbmFsIGFuZCBub24tZnVuY3Rpb25hbAotcmVxdWlyZW1lbnRzOyBjcmVhdGluZyBhIHByb2plY3QgcGxhbiBmb3IgYSBkZXZlbG9wbWVudCBpdGVyYXRpb247IGRlZmluaW5nCi1hIHF1YWxpdHkgYXNzdXJhbmNlIHBsYW4gZm9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzOyByZWRlc2lnbmluZyBhIGJ1c2luZXNzCi1vcmdhbml6YXRpb24gYmFzZWQgb24gYSBuZXcgc3RyYXRlZ2ljIGRpcmVjdGlvbiwgYW5kIHNvIG9uLiA8L3A+Ci08cD5UaGlzIHRvb2wgdGFrZXMgY29udGVudCBzdWNoIGFzIHRoZSBjb250ZW50IGRlc2NyaWJlZCBhYm92ZSwgYW5kIHN0cnVjdHVyZXMKLWl0IGluIG9uZSBzcGVjaWZpYyB3YXkgdXNpbmcgYSBwcmVkZWZpbmVkIHNjaGVtYSBvZiBjb25jZXB0cy4gVGhpcyBzY2hlbWEKLXN1cHBvcnRzIHRoZSBvcmdhbml6YXRpb24gb2YgbGFyZ2UgYW1vdW50cyBvZiBkZXNjcmlwdGlvbnMgZm9yIGRldmVsb3BtZW50Ci1tZXRob2RzIGFuZCBwcm9jZXNzZXMuIFN1Y2ggbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBkbyBub3QgaGF2ZSB0byBiZQotbGltaXRlZCB0byBzb2Z0d2FyZSBlbmdpbmVlcmluZywgYnV0IGNhbiBhbHNvIGNvdmVyIG90aGVyIGRlc2lnbiBhbmQgZW5naW5lZXJpbmcKLWRpc2NpcGxpbmVzIHN1Y2ggYXMgbWVjaGFuaWNhbCBlbmdpbmVlcmluZywgYnVzaW5lc3MgdHJhbnNmb3JtYXRpb24sIHNhbGVzCi1jeWNsZXMsIGFuZCBzbyBvbi4gPC9wPgotPHA+VGhlIHNjaGVtYSBmb3IgbWV0aG9kIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQgdGhpcyB0b29sIGFzIGEgY29uc3RydWN0IG9mCi1yb2xlcyBkZWZpbmluZyBkZXZlbG9wbWVudCBza2lsbHMgYW5kIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHdvcmsgcHJvZHVjdHMuCi1UaGVzZSB3b3JrIHByb2R1Y3RzIGFyZSBwcm9kdWNlZCBieSB0YXNrcyB0aGF0IGFyZSBwZXJmb3JtZWQgYnkgdGhlIHJvbGVzCi1hbmQgaGF2ZSB0aGUgd29yayBwcm9kdWN0cyBhcyBpbnB1dHMgYW5kIG91dHB1dHMuIFRoZSBzY3JlZW4gY2FwdHVyZSBpbiB0aGUKLWZpZ3VyZSBhYm92ZSBzaG93cyBob3cgc3VjaCBtZXRob2QgY29udGVudCBlbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIHRyZWUKLWJyb3dzZXJzIG9uIHRoZSBsZWZ0LiBUaGVzZSB0cmVlIGJyb3dzZXJzLCBzaW1pbGFyIHRvIGEgbGlicmFyeSwgcHJvdmlkZSBkaWZmZXJlbnQKLWluZGV4ZXMgb2YgdGhlIGF2YWlsYWJsZSBlbGVtZW50cyBmb3IgcmFwaWQgYWNjZXNzLiBUaGUgc2NyZWVuIGNhcHR1cmUgc2hvd3MKLW9uIHRoZSByaWdodCBhbiBleGFtcGxlIG9mIGEgdGFzayBwcmVzZW50YXRpb24uIFRoaXMgdGFzayBwcmVzZW50YXRpb24gZGVmaW5lcwotdGhlIHRhc2sgaW4gdGVybXMgb2Ygc3RlcHMgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZCB0byBhY2hpZXZlIHRoZSB0YXNrJ3MKLXB1cnBvc2UuIFlvdSBjYW4gc2VlIHRoYXQgdGhlIHRhc2sgaGFzIHZhcmlvdXMgcmVsYXRpb25zaGlwcywgc3VjaCBhcyByZWxhdGlvbnNoaXBzCi10byBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgd29yayBwcm9kdWN0cyB0aGF0IHNlcnZlIGFzIGlucHV0cyBhbmQgb3V0cHV0cwotdG8gdGhlIHRhc2suIEZpbmQgbW9yZSBkZXRhaWxzIG9uIHRhc2tzLCByb2xlLCBhbmQgd29yayBwcm9kdWN0cyBpbiB0aGUgb25saW5lCi1oZWxwIGhlcmUuIEluIGFkZGl0aW9uIHRvIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMsIHRoaXMgdG9vbCBzdXBwb3J0cwotdGhlIGFkZGl0aW9uIG9mIGd1aWRhbmNlIGVsZW1lbnRzLiBHdWlkYW5jZSBhcmUgc3VwcGxlbWVudGFyeSBmcmVlLWZvcm0gZG9jdW1lbnRhdGlvbgotc3VjaCBhcyB3aGl0ZSBwYXBlcnMsIGNvbmNlcHQgZGVzY3JpcHRpb25zLCBndWlkZWxpbmVzLCB0ZW1wbGF0ZXMsIGV4YW1wbGVzLAotYW5kIHNvIG9uLiA8L3A+Ci08cD5UaGlzIHRvb2wgcHJvdmlkZXMgdmFyaW91cyBmb3JtLWJhc2VkIGVkaXRvcnMgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudAotZWxlbWVudHMuIERvY3VtZW50IHlvdXIgdGFzaywgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIGFuZCBndWlkYW5jZSBlbGVtZW50cwotdXNpbmcgaW50dWl0aXZlIHJpY2gtdGV4dCBlZGl0b3JzIHRoYXQgYWxsb3cgeW91IHRvIGNvcHkgYW5kIHBhc3RlIHRleHQgZnJvbQotb3RoZXIgc291cmNlcyBzdWNoIGFzIHdlYiBwYWdlcyBvciBkb2N1bWVudHMuIFVzZSBzaW1wbGUgZGlhbG9ncyB0byBlc3RhYmxpc2gKLXJlbGF0aW9uc2hpcHMgYmV0d2VlbiBjb250ZW50IGVsZW1lbnRzLiBGb3IgZXhhbXBsZSwgbWFrZSBhIHdvcmsgcHJvZHVjdCB0aGUKLWlucHV0IHRvIHlvdXIgdGFzayBzaW1wbHkgYnkgc2VsZWN0aW5nIGl0IGluIGEgZGlhbG9nLjwvcD4KLTxwPlVzaW5nIHRoaXMgdG9vbCwgeW91IGNhbiBvcmdhbml6ZSBjb250ZW50IGluIHBoeXNpY2FsIGNvbnRlbnQgcGFja2FnZXMKLXRoYXQgYWxsb3cgeW91IHRvIG1hbmFnZSB5b3VyIGNvbnRlbnQgaW4gY29uZmlndXJhYmxlIHVuaXRzLiBZb3UgY2FuIGFsc28KLWNhdGVnb3JpemUgeW91ciBjb250ZW50IGJhc2VkIG9uIGEgc2V0IG9mIHByZWRlZmluZWQgY2F0ZWdvcmllcyAoZm9yIGV4YW1wbGUsCi1jYXRlZ29yaXplIHlvdXIgdGFza3MgaW50byBkZXZlbG9wbWVudCBkaXNjaXBsaW5lcywgb3IgeW91ciB3b3JrIHByb2R1Y3RzCi1pbnRvIGRvbWFpbnMpIG9yIGNyZWF0ZSB5b3VyIG93biBjYXRlZ29yaXphdGlvbiBzY2hlbWVzIGZvciB5b3VyIGNvbnRlbnQgd2l0aAoteW91ciBvd24gdXNlci1kZWZpbmVkIGNhdGVnb3JpZXMgdGhhdCBhbGxvdyB5b3UgdG8gaW5kZXggY29udGVudCBpbiBhbnkgd2F5Ci15b3Ugd2FudC4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDBmMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb25maWd1cmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sI2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb25maWd1cmF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtZXRob2Rjb25maWd1cmF0aW9ucyI+PGEgbmFtZT0ibWV0aG9kY29uZmlndXJhdGlvbnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29uZmlndXJhdGlvbjwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdXNlci1kZWZpbmVkIHN1YnNldHMgb2YgZWxlbWVudHMgY29udGFpbmVkIGluCi10aGUgTWV0aG9kIExpYnJhcnkuPC9wPgotPHA+QSBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbmVzIGEgd29ya2luZyBzZXQgb2YgcGFja2FnZXMgd2l0aGluIHRoZSBtZXRob2QKLWxpYnJhcnkgdGhhdCBoZWxwcyB5b3UgbGltaXQgeW91ciB2aWV3IHRvIGEgc3Vic2V0IG9mIGVsZW1lbnRzLiBUaGUgZWxlbWVudHMKLXRoYXQgYXJlIHBhcnQgb2YgYSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIE1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdXNlZCBmb3IgY3JlYXRpbmcgcHJvY2Vzc2VzCi1hbmQgZm9yIHB1YmxpY2F0aW9uIGJ5IGRlZmluaW5nIHdoaWNoIGVsZW1lbnRzIGFyZSBwdWJsaXNoZWQgaW4gSFRNTCBhbmQgd2hpY2gKLWFyZSBub3QuPC9wPgotPHA+QSBtZXRob2QgY29uZmlndXJhdGlvbiBjb25zaXN0cyBvZiB0aHJlZSBzcGVjaWZ5aW5nIHBhcnRzOjwvcD4KLTx1bD48bGk+QSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbi48L2xpPgotPGxpPkEgc2VsZWN0aW9uIGZyb20gdGhlIHNldCBvZiBwbHVnLWlucyBhbmQgcGFja2FnZXMuPC9saT4KLTxsaT5BIHNlbGVjdGlvbiBvZiB2aWV3cyB0byBiZSBwdWJsaXNoZWQgaW4gdGhlIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPHA+SW4gYSBtZXRob2QgY29uZmlndXJhdGlvbiwgeW91IGFyZSBhYmxlIHRvIHNlbGVjdCBhbmQgZGVzZWxlY3QgZnJvbSB0aGUKLWNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3MgYXZhaWxhYmxlIGluIHRoZSBtZXRob2QgbGlicmFyeSdzCi1zZXQgb2YgcGx1Zy1pbnMuIFRoZSBzZWxlY3Rpb25zIHlvdSBtYWtlIGhlbHAgZGV0ZXJtaW5lIHRoZSBjb250ZW50IG9mIHlvdXIKLXB1Ymxpc2hlZCBXZWIgc2l0ZS4gQSBjb25maWd1cmF0aW9uIGlzIGdpdmVuIGEgbmFtZSBhbmQgdGhlbiBzYXZlZCBzbyBpdCBjYW4KLWJlIGNoYW5nZWQgYW5kIHRoZW4gcmUtcHVibGlzaGVkIGF0IGEgbGF0ZXIgZGF0ZS48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sI2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIj5DcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2JkZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+PGEgbmFtZT0iY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQ8L2gxPgotPGRpdj48cD5NZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nCi1ob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkLCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50Ci1vZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZAotZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvCi1zcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy48L3A+Ci08cD5NZXRob2QgY29udGVudCBlbGVtZW50cyBhcmU6PC9wPgotPHVsPjxsaT48YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFzazwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCI+R3VpZGFuY2U8L2E+PC9saT4KLTwvdWw+Ci08cD5BIFByb2Nlc3MgRW5naW5lZXIgYXV0aG9ycyB0aGVzZSBlbGVtZW50cywgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuCi10aGVtLCBhbmQgdGhlbiBjYXRlZ29yaXplcyB0aGVtLiBNZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLAotZGVzY3JpYmluZyBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZQotcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlc2UKLW1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQKLXRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPkZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkZXZlbG9wcyBhbiBhcHBsaWNhdGlvbgotZnJvbSBzY3JhdGNoIHBlcmZvcm1zIGRldmVsb3BtZW50IHRhc2tzIHN1Y2ggYXMgIkRldmVsb3AgVmlzaW9uIiBvciAiVXNlIENhc2UKLURlc2lnbiIgc2ltaWxhciB0byBhIHByb2plY3QgdGhhdCBleHRlbmRzIGFuIGV4aXN0aW5nIHNvZnR3YXJlIHN5c3RlbS4gSG93ZXZlciwKLXRoZSB0d28gcHJvamVjdHMgd2lsbCBwZXJmb3JtIHRoZSB0YXNrcyBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgd2l0aCBhCi1kaWZmZXJlbnQgZW1waGFzaXMsIGkuZS4sIHRoZXkgcGVyZm9ybSB0aGUgc3RlcHMgb2YgdGhlc2UgdGFza3MgYXQgZGlmZmVyZW50Ci1wb2ludHMgb2YgdGltZSBhbmQgcGVyaGFwcyBhcHBseSBpbmRpdmlkdWFsIHZhcmlhdGlvbnMgYW5kIGFkZGl0aW9ucy4gPC9wPgotPHA+TWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gbWV0aG9kIGNvbnRlbnQgcGFja2FnZXMgd2hpY2gsCi1pbiB0dXJuLCBhcmUgY29udGFpbmVkIHdpdGhpbiBhIE1ldGhvZCBwbHVnLWluLiBJbiBvcmRlciB0byBzZXBhcmF0ZSB5b3VyCi1vd24gY29udGVudCBmcm9tIG9yaWdpbmFsIE9wZW5VUCBjb250ZW50LCB5b3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3Ci1tZXRob2QgY29udGVudCBpbiBhIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IHByb2R1Y2UuIENyZWF0aW5nIG1ldGhvZCBjb250ZW50Ci1pbiBhIG1ldGhvZCBwbHVnLWluIG9mIHlvdXIgb3duIGFsc28gYWxsb3dzIHlvdSB0byB1cGRhdGUgeW91ciBvd24gbGlicmFyeQotd2l0aCBuZXcgcmVsZWFzZXMgb2YgdGhlIE9wZW5VUCBsaWJyYXJ5IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50Ci10aGF0IHlvdSBoYXZlIGNyZWF0ZWQgaW4geW91ciBvd24gcGx1Zy1pbnMuPC9wPgotPHA+U2VlIGFsc286PC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTY0OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb250ZW50IENhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj48YSBuYW1lPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2gxPgotPGRpdj48cD5NZXRob2QgQ29udGVudCBlbGVtZW50cyBhcmUgb3JnYW5pemVkIGludG8gbG9naWNhbCBjYXRlZ29yaWVzLiBUaGUgY2F0ZWdvcmllcwotY2FuIGFwcGVhciBpbiB5b3VyIGZpbmFsLCBwdWJsaXNoZWQgV2ViIHNpdGUgYXMgdmlld3MuPC9wPgotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjYXRlZ29yeTogU3RhbmRhcmQgYW5kIEN1c3RvbS48L3A+Ci08cD48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U3RhbmRhcmQgQ2F0ZWdvcmllczwvaDQ+PHA+U3RhbmRhcmQgQ2F0ZWdvcmllcyBwcm92aWRlCi1hIG1lYW5zIHRvIGNhdGVnb3JpemUgY29yZSBtZXRob2QgY29udGVudCBpbiBsaW5lIHdpdGggdGhlIGJlc3QgcHJhY3RpY2VzCi1mb3IgY3JlYXRpbmcgc3RydWN0dXJlZCBtZXRob2RzLiBTdGFuZGFyZCBDYXRlZ29yaWVzIGFyZSBsaW5rZWQgd2l0aCBhIHNwZWNpZmljCi1tZXRob2QgY29udGVudCB0eXBlLCBlLmcuIERpc2NpcGxpbmVzIGNvbnRhaW4gb25seSB0YXNrcy4gPC9wPgotPGRpdiBjbGFzcz0icCI+U3RhbmRhcmQKLUNhdGVnb3J5IHR5cGVzIGFyZTo8dWw+PGxpPjxzdHJvbmc+RGlzY2lwbGluZXM8L3N0cm9uZz4gLSBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrczwvYT4gdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yIGFyZWEgb2YgY29uY2VybiB3aXRoaW4KLXRoZSBvdmVyYWxsIElUIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwgb24gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0LAotaXQgaXMgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgdGFza3MgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGgKLWFuYWx5c2lzIGFuZCBkZXNpZ24gdGFza3MuIFNlcGFyYXRpbmcgdGhlc2UgdGFza3MgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcwotbWFrZXMgdGhlIHRhc2tzIGVhc2llciB0byBjb21wcmVoZW5kLiBEaXNjaXBsaW5lcyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIERpc2NpcGxpbmUKLUdyb3VwaW5ncy48L2xpPgotPGxpPjxzdHJvbmc+RG9tYWluczwvc3Ryb25nPiAtIEEgRG9tYWluIGlzIGEgcmVmaW5lYWJsZSwgbG9naWNhbCwgaGllcmFyY2h5IG9mIHJlbGF0ZWQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0czwvYT4gZ3JvdXBlZAotdG9nZXRoZXIgYmFzZWQgb24gdGltaW5nLCByZXNvdXJjZXMsIG9yIHJlbGF0aW9uc2hpcC4gV2hpbGUgYSBEb21haW4gY2F0ZWdvcml6ZXMKLW1hbnkgd29yayBwcm9kdWN0cywgYSB3b3JrIHByb2R1Y3QgYmVsb25ncyB0byBvbmx5IG9uZSBEb21haW4uIERvbWFpbnMgY2FuCi1iZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucy4gPC9saT4KLTxsaT48c3Ryb25nPldvcmsgUHJvZHVjdCBLaW5kczwvc3Ryb25nPiAtIFdvcmsgUHJvZHVjdCBLaW5kIGlzIGFub3RoZXIgY2F0ZWdvcnkgZm9yCi1ncm91cGluZyA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPi4KLUEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgd29yayBwcm9kdWN0IGtpbmRzLiBBcyBhbiBleGFtcGxlLCB5b3UgbWlnaHQKLXdhbnQgdG8gaGF2ZSBhIHNlcmllcyBvZiB3b3JrIHByb2R1Y3Qga2luZHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvdmVyYWxsCi1pbnRlbnQgb2Ygd29yayBwcm9kdWN0cywgc3VjaCBhcyBzcGVjaWZpY2F0aW9uLCBwbGFuLCBvciBtb2RlbC48L2xpPgotPGxpPjxzdHJvbmc+Um9sZSBTZXRzPC9zdHJvbmc+IC0gQSBSb2xlIFNldCBpcyB1c2VkIHRvIGdyb3VwIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlczwvYT4gd2l0aCBjZXJ0YWluIGNvbW1vbmFsaXRpZXMgdG9nZXRoZXIuIEZvciBleGFtcGxlLAotaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgYW4gQW5hbHlzdCByb2xlIHNldCBjb3VsZCBiZSB1c2VkIHRvCi1ncm91cCB0b2dldGhlciByb2xlcyBzdWNoIGFzIEJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCwgU3lzdGVtIEFuYWx5c3QgYW5kCi1SZXF1aXJlbWVudHMgU3BlY2lmaWVyLiBFYWNoIG9mIHRoZXNlIHJvbGVzIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kCi1oYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IG1heSBiZSByZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyBjZXJ0YWluIHRhc2tzCi1hbmQgY3JlYXRpbmcgY2VydGFpbiB3b3JrIHByb2R1Y3RzLiBSb2xlIHNldHMgY2FuIGJlIG9yZ2FuaXplZCB1c2luZyBSb2xlCi1TZXQgR3JvdXBpbmdzLjwvbGk+Ci08bGk+PHN0cm9uZz5Ub29sczwvc3Ryb25nPiAtIFRvb2xzIGlzIGEgY29udGFpbmVyIGZvciA8YSBocmVmPSJ0b29sbWVudG9yLmh0bWwjdG9vbG1lbnRvciI+VG9vbCBNZW50b3JzPC9hPi4gVG9vbHMgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucwotb2YgYSB0b29sIGFuZCBpdCdzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5DdXN0b20gQ2F0ZWdvcmllczwvaDQ+PHA+Q3VzdG9tIENhdGVnb3JpZXMgYXJlIGhpZ2hseSBjdXN0b21pemFibGUKLWFuZCBjYW4gY29udGFpbiBhbnkgdHlwZSBvZiBlbGVtZW50LiBDdXN0b20gQ2F0ZWdvcmllcyBhbGxvdyB5b3UgdG8gY2F0ZWdvcml6ZQotY29udGVudCBhY2NvcmRpbmcgdG8gYW55IHNjaGVtZSB5b3Ugd2FudCBhbmQgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHB1Ymxpc2hhYmxlCi1WaWV3cywgcHJvdmlkaW5nIGEgbWVhbnMgdG8gb3JnYW5pemUgdGhlIG1ldGhvZCBjb250ZW50IHByaW9yIHRvIHB1Ymxpc2hpbmcuCi1Gb3IgZXhhbXBsZSwgeW91IGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0aGF0IGxvZ2ljYWxseSBvcmdhbml6ZXMgY29udGVudAotcmVsZXZhbnQgdG8geW91ciBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudCwgc3VjaCBhcyBhIFRlc3RpbmcgY2F0ZWdvcnkKLXRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50cwotcmVsZXZhbnQgdG8gdGVzdGluZy48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhODVmOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb250ZW50IFBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kY29udGVudHBhY2thZ2UiPjxhIG5hbWU9Im1ldGhvZGNvbnRlbnRwYWNrYWdlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvaDE+Ci08ZGl2PjxwPkEgTWV0aG9kIHBhY2thZ2UgaXMgYSBjb250YWluZXIgZm9yIG1ldGhvZCBlbGVtZW50cy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZAotaW4gbWV0aG9kIHBhY2thZ2VzIHRvIHN0cnVjdHVyZSBhIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMKLWFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gTWV0aG9kIGVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UKLWNhbiByZXVzZSBlbGVtZW50cyBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgbGluayBiZXR3ZWVuIHRoZW0uIEZvcgotZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IKLXRhc2tzIGRlZmluZWQgaW4gYW5vdGhlciBwYWNrYWdlLCBlbnN1cmluZyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZgotdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiBBbHNvLCBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5Ci1pbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuPC9wPgotPHA+PC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlN0cnVjdHVyZSBvZiBhIE1ldGhvZCBQYWNrYWdlPC9oND48cD5BbHRob3VnaCBhIG1ldGhvZAotcGFja2FnZSBpcyBhIGNvbnRhaW5lciBmb3IgbWV0aG9kIGVsZW1lbnRzLCBpdHMgc3RydWN0dXJlIGlzIGJyb2tlbiBkb3duIGludG8KLXNtYWxsZXIgcGFja2FnZXMgdG8gYmV0dGVyIG9yZ2FuaXplIHRoZSBjb250ZW50LCBzdWNoIGFzIGNvbnRlbnQgcGFja2FnZXMsCi1zdGFuZGFyZCBjYXRlZ29yaWVzLCBhbmQgY3VzdG9tIGNhdGVnb3JpZXMuPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbCNjcmVhdGVjb250ZW50cGFja2FnZSI+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kcGx1Z2luLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RwbHVnaW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzOTA0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RwbHVnaW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBQbHVnLWluIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIFBsdWctaW48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZHBsdWdpbiI+PGEgbmFtZT0ibWV0aG9kcGx1Z2luIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIFBsdWctaW48L2gxPgotPGRpdj48cD5BbGwgY29udGVudCBpcyBvcmdhbml6ZWQgaW4gbWV0aG9kIHBsdWctaW5zLiBBIG1ldGhvZCBwbHVnLWluIGlzIGEgY29udGFpbmVyCi1mb3IgbWV0aG9kIHBhY2thZ2VzIHdoaWNoLCBpbiB0dXJuLCBjb250YWluIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudC4KLU1ldGhvZCBwbHVnLWlucyBhbmQgbWV0aG9kIHBhY2thZ2VzIGFsbG93IHlvdSB0byBvcmdhbml6ZSB5b3VyIGNvbnRlbnQgYXQKLWEgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgdGhhdCBzdWl0cyB5b3VyIG5lZWRzIGZvciBhdXRob3JpbmcgYW5kIHJldXNpbmcgdGhlCi1jb250ZW50LiA8L3A+Ci08cD5XaGVuIHlvdSBjcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiwgeW91IHdpbGwgdXN1YWxseSB3YW50IHRvIHJldXNlIGNvbnRlbnQKLWluIG90aGVyIHBsdWctaW5zLiBZb3UgbWF5IHdhbnQgdG8gbW9kaWZ5IG9yIGV4dGVuZCB0aGUgY29udGVudCBpbiB0aGVzZSBvdGhlcgotcGx1Zy1pbnMgb3IgYWRkIHlvdXIgb3duIGNvbnRlbnQuIFdoZW4geW91IGNyZWF0ZSBhIHBsdWctaW4geW91Ci1jYW4gcmVmZXJlbmNlIGFueSBudW1iZXIgb2Ygb3RoZXIgcGx1Zy1pbnMgdGhhdCB3YW50IHRvIHVzZSBpbiB0aGlzIHdheS4gQQotbWV0aG9kIHBsdWctaW4gY2FuIGFsc28gYmUgc3RhbmQtYWxvbmUgYW5kIG5vdCByZWZlcmVuY2Ugb3RoZXIgcGx1Zy1pbnMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWlsZXN0b25lLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9taWxlc3RvbmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljYzc3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9taWxlc3RvbmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1pbGVzdG9uZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtaWxlc3RvbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWlsZXN0b25lPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtaWxlc3RvbmUiPjxhIG5hbWU9Im1pbGVzdG9uZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1pbGVzdG9uZTwvaDE+Ci08ZGl2PjxwPkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgcHJvamVjdCwgc3VjaAotYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeQotc3VjaCBhcyB0aGUgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3BlbnBlcnNwLkpQRyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL29wZW5wZXJzcC5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNGE2MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3BlbnBlcnNwLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGNvbWUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzZmJlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRjb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJPdXRjb21lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJvdXRjb21lIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk91dGNvbWU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im91dGNvbWUiPjxhIG5hbWU9Im91dGNvbWUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5PdXRjb21lPC9oMT4KLTxkaXY+PHA+QW4gb3V0Y29tZSBpcyBhbiBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0aGF0IG1heSBiZSBhIHJlc3VsdCBvciBzdGF0ZS4KLU91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkKLWRlZmluZWQuIDwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCI+QXJ0aWZhY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiPkRlbGl2ZXJhYmxlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0ZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRkZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2NDY5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRkZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Bhc3RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3ZTY5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wYXN0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wZXJzcGVjdGl2ZXMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BlcnNwZWN0aXZlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGMzZTVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BlcnNwZWN0aXZlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUGVyc3BlY3RpdmVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icGVyc3BlY3RpdmVzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlBlcnNwZWN0aXZlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icGVyc3BlY3RpdmVzIj48YSBuYW1lPSJwZXJzcGVjdGl2ZXMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QZXJzcGVjdGl2ZXM8L2gxPgotPGRpdj48cD5BIFBlcnNwZWN0aXZlIGRlZmluZXMgYSBzZXQgb2Ygdmlld3MgYW5kIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIHNwZWNpZmljCi10YXNrcy4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBjb250YWlucyB0d28gd29ya2luZyBwZXJzcGVjdGl2ZXM6IGFuCi1BdXRob3JpbmcgUGVyc3BlY3RpdmUgYW5kIGEgQnJvd3NpbmcgUGVyc3BlY3RpdmUuPC9wPgotPHA+VGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZwotUGVyc3BlY3RpdmU8L2E+IHByb3ZpZGVzIHZpZXdzIGFuZCBmdW5jdGlvbnMgdG8gbmF2aWdhdGUgYW5kIGF1dGhvciBtZXRob2QKLWNvbnRlbnQgYW5kIHByb2Nlc3Nlcywgd2hpbGUgdGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPiwgYXMgaXRzIG5hbWUgaW1wbGllcywgYWxsb3dzIHlvdQotdG8gcHJldmlldyBhbmQgbmF2aWdhdGUgdGhyb3VnaCBhIDxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPiB3aXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcy48L3A+Ci08cD5UbyBzZWxlY3QgYSBwZXJzcGVjdGl2ZSwgY2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4uPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9waGFzZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGhhc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyZmVhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9waGFzZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUGhhc2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icGhhc2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UGhhc2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InBoYXNlIj48YSBuYW1lPSJwaGFzZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlBoYXNlPC9oMT4KLTxkaXY+PHA+QSBQaGFzZSBpcyBhIHNwZWNpYWwgdHlwZSBvZiBhY3Rpdml0eSB0aGF0IHJlcHJlc2VudHMgYSBzaWduaWZpY2FudAotcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggYSBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZQotb3Igc2V0IG9mIGRlbGl2ZXJhYmxlcy48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmFjdGljZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJhY3RpY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3NGNhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmFjdGljZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJhY3RpY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJhY3RpY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHJhY3RpY2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByYWN0aWNlIj48YSBuYW1lPSJwcmFjdGljZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByYWN0aWNlPC9oMT4KLTxkaXY+PHA+QSBwcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUKLWEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiBQcmFjdGljZXMKLWFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzCi10aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuIEV4YW1wbGVzCi1mb3IgcHJhY3RpY2VzIHdvdWxkIGJlIG1hbmFnZSByaXNrcywgY29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5LCBhcmNoaXRlY3R1cmUKLWNlbnRyaWMsIGFuZCBjb21wb25lbnQgYmFzZWQgZGV2ZWxvcG1lbnQsIHRvIG5hbWUgYSBmZXcuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJldmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJldmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E0ZjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByZXZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByZXZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJldmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QcmV2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwcmV2aWV3Ij48YSBuYW1lPSJwcmV2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJldmlldzwvaDE+Ci08ZGl2PjxwPlByZXZpZXcgZGlzcGxheXMgeW91ciBjb250ZW50IGluIGJyb3dzZXIgZm9ybWF0IHNpbWlsYXIgdG8KLWhvdyBpdCB3aWxsIGFwcGVhciB0byBhbiBlbmQgdXNlciBicm93c2luZyBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jYXV0aC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jYXV0aC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjhlODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2F1dGguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZjODJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Qcm9jZXNzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwcm9jZXNzIj48YSBuYW1lPSJwcm9jZXNzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvY2VzczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkEgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnByb2Nlc3M8L3NwYW4+IGRlc2NyaWJlcyBob3cgYSBwYXJ0aWN1bGFyIHBpZWNlCi1vZiB3b3JrIHNob3VsZCBiZSBkb25lLiBUaGUgd29yayBtYXkgaGF2ZSBhIHJlbGF0aXZlbHkgc21hbGwgc2NvcGUsIGluIHdoaWNoCi1jYXNlIGl0IGNhbiBiZSBkZXNjcmliZWQgYXMgYSBjYXBhYmlsaXR5IHBhdHRlcm4sIG9yIG1heSBhZGRyZXNzIGEgZnVsbCBwcm9qZWN0Ci1saWZlY3ljbGUsIGluIHdoaWNoIGNhc2UgaXQgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGRlbGl2ZXJ5IHByb2Nlc3MuIEEgcHJvY2VzcwotY2FuIHJldXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgc3RydWN0dXJlIGFuZCBzZXF1ZW5jZQotZm9yIGNhcnJ5aW5nIG91dCB3b3JrLjwvcD4KLTxwPlRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiBwcm9jZXNzLCBhIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4gYW5kCi1hIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4uCi1BIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHNwZWNpYWwgcHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIKLW9mIGFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMsIHdoaWxlIGEgZGVsaXZlcnkgcHJvY2VzcyBkZXNjcmliZXMKLWEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyB0eXBlIG9mIHByb2plY3QuPC9wPgotPHA+RWFjaAotdGltZSBhIHRhc2sgaXMgaW5jbHVkZWQgaW4gYSBwcm9jZXNzLCBhIHJlZmVyZW5jZSBvYmplY3QgdG8gdGhhdCB0YXNrIGlzIGNyZWF0ZWQKLWluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzLiBUaGlzIGlzIGNhbGxlZCBhIHRhc2sgZGVzY3JpcHRvci4gVGhlIHNhbWUKLXRhc2sgY2FuIGJlIHJlZmVyZW5jZWQgYW55IG51bWJlciBvZiB0aW1lcyBpbiB0aGUgc2FtZSBwcm9jZXNzLiBJbiBvdGhlciB3b3JkcywKLW9uZSB0YXNrIGNhbiBoYXZlIG1hbnkgdGFzayBkZXNjcmlwdG9ycy4gQSB0YXNrIGRlc2NyaXB0b3IgY2FuIGFsc28gbW9kaWZ5Ci10aGUgYmFzZSB0YXNrIHdpdGhvdXQgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIHRhc2suIEZvciBleGFtcGxlLCByb2xlcyBhbmQgd29yawotcHJvZHVjdHMgY2FuIGJlIGFkZGVkIG9yIHN1cHByZXNzZWQsIGFuZCBzdGVwcyBjYW4gYmUgc3VwcHJlc3NlZCBvciByZS1zZXF1ZW5jZWQuPC9wPgotPHA+Um9sZXMKLWFuZCB3b3JrIHByb2R1Y3RzIGNhbiBhbHNvIGJlIGluY2x1ZGVkIGluIHByb2Nlc3NlcyBhcyByb2xlIGRlc2NyaXB0b3JzIGFuZAotd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLiBSb2xlcyBhbmQgd29yayBwcm9kdWN0cyBjYW4gYmUgY3VzdG9taXplZCB0byBmaXQKLXdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIHByb2Nlc3MgaW4gd2hpY2ggdGhleSBhcmUgdXNlZC48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWNjYjRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwjcHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+PGEgbmFtZT0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2gxPgotPGRpdj48cD5BIGRldmVsb3BtZW50IHByb2Nlc3MgZGVmaW5lcyBzZXF1ZW5jZXMgb2YgdGFza3MgcGVyZm9ybWVkIGJ5IHJvbGVzIGFuZAotd29yayBwcm9kdWN0cyBwcm9kdWNlZCBvdmVyIHRpbWUuIDwvcD4KLTxwPjxpbWcgc3JjPSJwcm9jYXV0aC5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlByb2Nlc3NlcyBhcmUgdHlwaWNhbGx5IGV4cHJlc3NlZCBhcyB3b3JrZmxvd3Mgb3IgYnJlYWtkb3duCi1zdHJ1Y3R1cmVzLiBEZWZpbmluZyBhIHN0cmljdCBzZXF1ZW5jZSBhcyBpbiBhIHdhdGVyZmFsbCBtb2RlbCBpcyBhcyBtdWNoCi1hIHByb2Nlc3MgYXMgZGVmaW5pbmcgc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyBpbiBpdGVyYXRpb25zIG9mIHBhcmFsbGVsIHdvcmsuCi1UaGV5IGp1c3QgcmVwcmVzZW50IGRpZmZlcmVudCBkZXZlbG9wbWVudCBhcHByb2FjaGVzLiBIZW5jZSwgZm9yIGRlZmluaW5nCi1hIHByb2Nlc3MsIG9uZSBjYW4gdGFrZSBtZXRob2QgY29udGVudCBhbmQgY29tYmluZSBpdCBpbnRvIHN0cnVjdHVyZXMgdGhhdAotc3BlY2lmeSBob3cgdGhlIHdvcmsgc2hhbGwgYmUgb3JnYW5pemVkIG92ZXIgdGltZSwgdG8gbWVldCB0aGUgbmVlZHMgb2YgYQotcGFydGljdWxhciB0eXBlIG9mIGRldmVsb3BtZW50IHByb2plY3QgKHN1Y2ggYXMgc29mdHdhcmUgZm9yIGEgb25saW5lIHN5c3RlbQotdmVyc3VzIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtKS4gRVBGIENvbXBvc2VyIHN1cHBvcnRzIHByb2Nlc3NlcwotYmFzZWQgb24gZGlmZmVyZW50IGRldmVsb3BtZW50IGFwcHJvYWNoZXMgYWNyb3NzIG1hbnkgZGlmZmVyZW50IGxpZmVjeWNsZQotbW9kZWxzLCBpbmNsdWRpbmcgd2F0ZXJmYWxsLCBpbmNyZW1lbnRhbCwgYW5kIGl0ZXJhdGl2ZSBsaWZlY3ljbGVzLiBFUEYgQ29tcG9zZXIgYWxzbwotc3VwcG9ydHMgZGlmZmVyZW50IHByZXNlbnRhdGlvbnMgZm9yIHByb2Nlc3MsIHN1Y2ggYXMgd29yay1icmVha2Rvd24gc3RydWN0dXJlCi1vciB3b3JrZmxvdyBwcmVzZW50YXRpb25zLiBZb3UgY2FuIGFsc28gZGVmaW5lIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIgdGhhdCB1c2UgYQotbWluaW1hbCBzZXQgb2YgbWV0aG9kIGNvbnRlbnQgdG8gZGVmaW5lIHByb2Nlc3NlcyBmb3IgYWdpbGUsIHNlbGYtb3JnYW5pemluZwotdGVhbXMuPC9wPgotPHA+VGhlIEVQRiBDb21wb3NlciBzY3JlZW4gY2FwdHVyZSBhYm92ZSBzaG93cyBhbiBleGFtcGxlIG9mIGEgcHJvY2VzcyBwcmVzZW50ZWQgYXMKLWEgYnJlYWtkb3duIHN0cnVjdHVyZSBvZiBuZXN0ZWQgYWN0aXZpdGllcyBhcyB3ZWxsIGFzIGEgd29ya2Zsb3cgb3IgYWN0aXZpdHkKLWRpYWdyYW0gZm9yIG9uZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LCB0aGUgaW5jZXB0aW9uIHBoYXNlLiBJdCBhbHNvIGluZGljYXRlcwotd2l0aCB0aGUgdHdvIGJsdWUgYXJyb3dzIHRoYXQgdGhlIHBhcnRpY3VsYXIgbWV0aG9kIGNvbnRlbnQgdGFzayAiRGV0YWlsIGEKLVVzZSBDYXNlIiBoYXMgYmVlbiBhcHBsaWVkIGluIHRoZSBwcm9jZXNzIHR3aWNlOyBmaXJzdGx5IGluIHRoZSBpbmNlcHRpb24KLXBoYXNlIHVuZGVyIHRoZSBhY3Rpdml0eSAiRGVmaW5lIHRoZSBTeXN0ZW0sIiBhbmQgc2Vjb25kbHksIGluIHRoZSBlbGFib3JhdGlvbgotcGhhc2UgaW4gdGhlIGFjdGl2aXR5ICJSZWZpbmUgdGhlIHN5c3RlbSBkZWZpbml0aW9uIi4gWW91IHNlZSBiZWxvdyBlYWNoIG9mCi10aGVzZSB0YXNrIGFwcGxpY2F0aW9ucywgcmVmZXJyZWQgdG8gYXMgYSB0YXNrIGRlc2NyaXB0b3JzIGluIEVQRiBDb21wb3NlciwgbGlzdHMgb2YKLXRoZSBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gSWYgeW91Ci1sb29rIGNsb3NlbHksIHlvdSBzZWUgdGhhdCB0aGVzZSBsaXN0cyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIG9mIHRoZXNlIHR3bwotdGFzayBkZXNjcmlwdG9ycywgZXhwcmVzc2luZyBkaWZmZXJlbmNlcyBpbiBwZXJmb3JtaW5nIHRoZSAiRGV0YWlsIGEgVXNlIENhc2UiCi1tZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLiBZb3Ugc2VlIGRpZmZlcmVudCByb2xlcyBpbnZvbHZlZCBhbmQgY2hhbmdlcwotaW4gdGhlIGxpc3Qgb2YgaW5wdXRzIHRvIGJlIGNvbnNpZGVyZWQgYW5kIG91dHB1dHMgdG8gYmUgcHJvZHVjZWQgb3IgdXBkYXRlZC4KLVRoZXNlIGNoYW5nZXMgd2VyZSBkZWZpbmVkIGJ5IHRoZSBhdXRob3IgdGhhdCBjcmVhdGVkIHRoaXMgcHJvY2VzcyB0byBleHByZXNzCi10aGUgZXhhY3QgZm9jdXMgb2YgdGhlIHRhc2sgcGVyZm9ybWFuY2UgZm9yIGVhY2ggb2NjdXJyZW5jZS4gSW4gYWRkaXRpb24gdG8KLXVwZGF0aW5nIHRoZSByb2xlcywgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzIGZvciBhIHRhc2sgZGVzY3JpcHRvciwKLXlvdSBjYW4gYWxzbyBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgdGhlCi1leGFjdCBzdGVwcyBvZiB0aGUgdGFzayB0aGF0IHNob3VsZCBhbmQgc2hvdWxkIG5vdCBiZSBwZXJmb3JtZWQgZm9yIHRoaXMgcGFydGljdWxhcgotb2NjdXJyZW5jZSBvZiB0aGUgdGFzay4gPC9wPgotPHA+RVBGIENvbXBvc2VyIHByb3ZpZGVzIHlvdSB3aXRoIGEgcHJvY2VzcyBlZGl0b3IgdGhhdCBzdXBwb3J0cyBkaWZmZXJlbnQgYnJlYWtkb3duCi1zdHJ1Y3R1cmUgdmlld3MgYXMgd2VsbCBhcyBncmFwaGljYWwgcHJvY2VzcyBwcmVzZW50YXRpb25zLiBBcyBhIHByb2Nlc3MgYXV0aG9yLAoteW91IHR5cGljYWxseSBzdGFydCBieSBjcmVhdGluZyBhbiBhY3Rpdml0eSBicmVha2Rvd24sIGRpdmlkaW5nIGFuZCBicmVha2luZwoteW91ciBwcm9jZXNzIGRvd24gaW50byBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBoaWdoLWxldmVsIGFjdGl2aXRpZXMuIEluc3RlYWQKLW9mIGNyZWF0aW5nIHlvdXIgYWN0aXZpdGllcyBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseQotd29yayBpbiBhIGdyYXBoaWNhbCBhY3Rpdml0eSBkaWFncmFtIGVkaXRvciB0aGF0IGFsbG93cyB5b3UgdG8gZ3JhcGhpY2FsbHkKLWNyZWF0ZSBhIHdvcmtmbG93IGZvciB5b3VyIGFjdGl2aXRpZXMuIFRvIGFzc2lnbiBtZXRob2QgY29udGVudCB0byB5b3VyIHByb2Nlc3MsCi15b3UgdGhlbiBoYXZlIHRoZSBjaG9pY2Ugb2Ygd29ya2luZyBpbiBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3cyAod29yayBicmVha2Rvd24KLXN0cnVjdHVyZSwgd29yayBwcm9kdWN0IHVzYWdlLCBvciB0ZWFtIGFsbG9jYXRpb24gdmlldykuIEVhY2ggdmlldyBzdXBwb3J0cwotYSBkaWZmZXJlbnQgYXBwcm9hY2ggZm9yIGNyZWF0aW5nIGEgcHJvY2Vzcy4gWW91IGNhbiBkZWZpbmUgdGhlIHdvcmsgdG8gYmUKLWRvbmUsIGRlZmluZSB0aGUgcmVzdWx0cyB0byBiZSBwcm9kdWNlZCwgb3IgZGVmaW5lIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdXIKLXJvbGVzLiBJZiByZXF1ZXN0ZWQsIHRoZSBlZGl0b3IgdXBkYXRlcyB0aGUgb3RoZXIgcHJvY2VzcyB2aWV3cyBzZW1pLWF1dG9tYXRpY2FsbHkKLXVzaW5nIHdpemFyZHMgdGhhdCBwcm9tcHQgeW91IGZvciBkZWNpc2lvbnMgb24gc2VsZWN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLiA8L3A+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJwcm9jZXNzLmh0bWwiPlByb2Nlc3M8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiPlByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTQyZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij48YSBuYW1lPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvaDE+Ci08ZGl2PjxwPldoZW4geW91IGFyZSBlZGl0aW5nIGEgcHJvY2VzcywgdGhlIHByb2Nlc3MgZWxlbWVudCBwcm9wZXJ0aWVzIHZpZXcgYWxsb3dzCi15b3UgdG8gZWRpdCBhbGwgdGhlIGRldGFpbHMgZm9yIGEgc2luZ2xlIGVsZW1lbnQgaW4gdGhlIHByb2Nlc3MuIElmIHlvdSBjbGljawotaW4gYW55IHJvdyBpbiBhIHByb2Nlc3MgZGlzcGxheSwgeW91IHdpbGwgc2VlIHRoZSBmdWxsIGRldGFpbHMgb2YgdGhlIHByb2Nlc3MKLWVsZW1lbnQgaW4gdGhlIHJvdyBpbiB0aGUgcHJvcGVydGllcyB2aWV3LjwvcD4KLTxwPklmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IG9wZW4sIHJpZ2h0IGNsaWNrIGFueSByb3cgaW4gYSBwcm9jZXNzIGFuZAotc2VsZWN0IDxzdHJvbmc+U2hvdyBQcm9wZXJ0aWVzIFZpZXc8L3N0cm9uZz4uPC9wPgotPHA+VGhlIHByb3BlcnRpZXMgdmlldyBpcyB0aGUgZWRpdG9yIGZvciBhY3Rpdml0aWVzLCB0YXNrIGRlc2NyaXB0b3JzLCByb2xlcwotZGVzY3JpcHRvcnMsIGFuZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMuIFRoZSBpbmZvcm1hdGlvbiBmb3IKLWEgZGVzY3JpcHRvciBpcyBzaW1pbGFyIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBlbGVtZW50IGVkaXRvciwgYnV0IGl0Ci1hbHNvIGhhcyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBlbGVtZW50IGluIHRoZSBwcm9jZXNzLiBUaGUgcHJvY2VzcyBpbmZvcm1hdGlvbgotaXMgYWxzbyBkaXNwbGF5ZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcm93IGluIHRoZSBwcm9jZXNzIGRpc3BsYXkuPC9wPgotPHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uIHRhYjo8L3N0cm9uZz48L3A+Ci08cD5UaGUgTmFtZSBhbmQgUHJlc2VudGF0aW9uIE5hbWUgZGVmYXVsdCB0byB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyBpbiB0aGUKLWJhc2UgbWV0aG9kIGVsZW1lbnQuIFRoZXNlIG5hbWVzIGNhbiBiZSBjaGFuZ2VkIGluIGEgZGVzY3JpcHRvci48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSBjZXJ0YWluIGFzcGVjdHMgb2YgdGhlIGVsZW1lbnQKLWluIHRoZSBwcm9jZXNzIGFuZCBjYW4gYmUgc2V0IGZvciBhbGwgdHlwZXMgb2YgcHJvY2VzcyBlbGVtZW50czo8dWw+PGxpPjxzdHJvbmc+T3B0aW9uYWw8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSBlbGVtZW50Ci1pcyBjb25zaWRlcmVkIG9wdGlvbmFsIGluIHRoZSBwcm9jZXNzLiBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgc2FmZSB0byByZW1vdmUKLXRoZSBlbGVtZW50LiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkIChmYWxzZSksIHRoZSBlbGVtZW50IGlzIGNvbnNpZGVyZWQgbWFuZGF0b3J5Ci1hbmQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT48c3Ryb25nPk11bHRpcGxlIE9jY3VycmVuY2VzPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdAotd2hlbiB0aGUgcHJvY2VzcyBpcyBpbnN0YW50aWF0ZWQgYXMgYSBwcm9qZWN0IG9yIG90aGVyIHByb2Nlc3MsIGl0IGlzIGV4cGVjdGVkCi10aGF0IHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhpcyBlbGVtZW50LiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkCi0oZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBzaG91bGQgb25seSBiZSBhIHNpbmdsZSBvY2N1cnJlbmNlIG9mIHRoaXMKLWVsZW1lbnQgd2hlbiB0aGUgcHJvY2VzcyBpcyBpbnN0YW50aWF0ZWQuPC9saT4KLTxsaT48c3Ryb25nPlBsYW5uZWQ8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5jbHVkZWQKLWluIGFuIGV4cG9ydCB0byBhIHByb2plY3QgbWFuYWdlbWVudCB0b29sLiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkIChmYWxzZSksCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiBhbiBleHBvcnQuPC9saT4KLTxsaT48c3Ryb25nPlN1cHByZXNzZWQ8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIHRoZSBlbGVtZW50IHdpbGwgbm90IGFwcGVhcgotaW4gYSBwdWJsaXNoZWQgcHJvY2Vzcy4gVGhpcyBpcyB1c3VhbGx5IHVzZWQgdG8gbW9kaWZ5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi1pbmNsdWRlZCBpbiBhIHByb2Nlc3MuIFRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSBhcyBkZWZhdWx0LjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgZm9sbG93aW5nIGVsZW1lbnRzIGNhbiBiZSBzZXQgZm9yIHRhc2sgZGVzY3JpcHRvcnMgYW5kIGFjdGl2aXRpZXM6PHVsPjxsaT48c3Ryb25nPkV2ZW50IERyaXZlbjwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlCi10YXNrIG9yIGFjdGl2aXR5IHdpbGwgYmUgaW5pdGlhdGVkIHdoZW4gYSBwYXJ0aWN1bGFyIGV2ZW50IG9jY3Vycy4gSWYgdGhpcwotaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgb3IgYWN0aXZpdHkgd2lsbCBiZSBpbml0aWF0ZWQKLWJhc2VkIG9uIG90aGVyIHRhc2tzIGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+PHN0cm9uZz5PbmdvaW5nPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzawotb3IgYWN0aXZpdHkgaXMgY29udGludW91cy4gSWYgdGhpcyBpcyBub3QgY2hlY2tlZCAoZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdAotdGhlIHRhc2sgb3IgYWN0aXZpdHkgaGFzIGEgY2xlYXIgc3RhcnQgYW5kIGZpbmlzaCBpbiB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPjxzdHJvbmc+UmVwZWF0YWJsZTwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sKLW9yIGFjdGl2aXR5IGNhbiBpdGVyYXRlIHdoZW4gdGhlIHByb2Nlc3MgaXMgaW5zdGFudGlhdGVkLiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkCi0oZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBvciBhY3Rpdml0eSB3aWxsIG9ubHkgb2NjdXIgb25jZSBpbiB0aGUKLXByb2Nlc3MuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPkRlcGVuZGVuY3kgRmllbGQ6IFlvdSBjYW4gYWRkIG9uZSBvciBtb3JlIGRlcGVuZGVuY2llcyBmb3IgYSB0YXNrIG9yIGFjdGl2aXR5LgotQ2xpY2sgdGhlIDxzdHJvbmc+QWRkLi4uPC9zdHJvbmc+IGJ1dHRvbiBhbmQgZW50ZXIgdGhlIGluZGV4IG51bWJlciBmb3IgdGhlIHRhc2sgb3IKLWFjdGl2aXR5IG9uIHdoaWNoIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgZGVwZW5kZW50LiBUaGUgZGVwZW5kZW5jeSAodHlwZSkKLWRlZmF1bHRzIHRvIEZpbmlzaC10by1TdGFydC4gSWYgeW91IHdhbnQgdG8gc2V0IGFub3RoZXIgZGVwZW5kZW5jeSB0eXBlLCBjbGljawotdGhlIDxzdHJvbmc+RWRpdDwvc3Ryb25nPiBidXR0b24gYW5kIHNlbGVjdCB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jeSB0eXBlIGluIHRoZSBkZXBlbmRlbmN5Ci1kcm9wIGRvd24gYm94LiBZb3UgY2FuIGVudGVyIGEgZGlmZmVyZW50IGluZGV4IG51bWJlciBvbiB0aGUgRWRpdCBkaWFsb2cuCi1Zb3UgY2FuIGFsc28gcmVtb3ZlIGEgZGVwZW5kZW5jeSBieSBzZWxlY3RpbmcgdGhlIGRlcGVuZGVuY3kgYW5kIGNsaWNraW5nCi10aGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvcD4KLTxwPlRoZSBiYXNlIG1ldGhvZCBlbGVtZW50IGZvciB0aGUgZGVzY3JpcHRvciBpcyBkaXNwbGF5ZWQgb24gdGhlIHBhZ2UuIFlvdQotY2FuIHNlbGVjdCBhIGRpZmZlcmVudCBlbGVtZW50IGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkxpbmsgTWV0aG9kIEVsZW1lbnQ8L3N0cm9uZz4gYnV0dG9uCi1hbmQgc2VsZWN0aW5nIHRoZSByZXF1aXJlZCBlbGVtZW50LjwvcD4KLTxwPjxzdHJvbmc+RG9jdW1lbnRhdGlvbiB0YWI6PC9zdHJvbmc+PC9wPgotPHA+VGhlIGRvY3VtZW50YXRpb24gdGFiIGNvbnRhaW5zIGRlc2NyaXB0aXZlIGF0dHJpYnV0ZXMgZm9yIHRoZSBkZXNjcmlwdG9yCi1vciBhY3Rpdml0eS48L3A+Ci08cD48c3Ryb25nPlJvbGwtVXAgdGFiczo8L3N0cm9uZz48L3A+Ci08cD5UaGUgcHJvcGVydGllcyB2aWV3IGZvciBhbiBhY3Rpdml0eSBpbmNsdWRlcyByb2xsLXVwIHRhYnMgdGhhdCBwcm92aWRlCi1saXN0cyBvZiB0YXNrcywgcm9sZXMsIG9yIHdvcmsgcHJvZHVjdHMgInJvbGxlZCB1cCIsIG9yIHN1bW1hcml6ZWQsIGZvciB0aGUKLWFjdGl2aXR5LjwvcD4KLTxwPjxzdHJvbmc+QXNzb2NpYXRpb24gdGFiczo8L3N0cm9uZz48L3A+Ci08cD5UaGUgcmVtYWluaW5nIHRhYnMgYXJlIHVzZWQgdG8gYWRkIG9yIHJlbW92ZSBhc3NvY2lhdGlvbnMgYmV0d2VlbiB0aGUgYWN0aXZpdHkKLW9yIGRlc2NyaXB0b3IgdG8gbWV0aG9kIGVsZW1lbnRzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Yi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzI1NDc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Yi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjI5YTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIGEgTWV0aG9kIFdlYiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwjcHVibGlzaGluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHBvcnRhcHJvY2Vzc29ybWV0aG9kY29udGVudHRvYXBsYW5uaW5ndG9vbC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIiPjxhIG5hbWU9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlB1Ymxpc2hpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiB0byBhIE1ldGhvZCBXZWI8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5Vc2luZyB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQsIHlvdSBjYW4gc2VsZWN0IGZyb20KLWEgc2VyaWVzIG9mIHB1YmxpY2F0aW9uIG9wdGlvbnMgdG8gdHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGludG8gYSBwdWJsaXNoZWQKLW1ldGhvZCBXZWIuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBwdWJsaXNoIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb246PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSB0b29sYmFyLCBzZWxlY3QgPHN0cm9uZz5Db25maWd1cmF0aW9uICZndDsgUHVibGlzaDwvc3Ryb25nPi4gVGhlIFB1Ymxpc2gKLU1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZCBhcHBlYXJzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbiB0aGUgU2VsZWN0IENvbmZpZ3VyYXRpb24gcGFnZSwgc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uIHlvdQotd2FudCB0byBwdWJsaXNoIGZyb20gdGhlIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBsaWJyYXJ5IGFuZAotdGhlbiBjbGljayA8c3Ryb25nPk5leHQ8L3N0cm9uZz4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBTcGVjaWZ5IFB1Ymxpc2hpbmcgT3B0aW9ucyBwYWdlOjwvc3Bhbj48dWw+PGxpPlByb3ZpZGUgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV2ViIHNpdGUgaW4gdGhlCi1QdWJsaWNhdGlvbiBwYXRoIGZpZWxkLjwvbGk+Ci08bGk+UHJvdmlkZSBhIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIG1ldGhvZCB3ZWIuPC9saT4KLTxsaT5TZWxlY3QgYSBiYW5uZXIgaW1hZ2UgdG8gdXNlLjwvbGk+Ci08bGk+U2VsZWN0IGEgZmlsZSB0byB1c2UgZm9yIHRoZSAiYWJvdXQiIGluZm9ybWF0aW9uLjwvbGk+Ci08bGk+UHJvdmlkZSBhIGZlZWRiYWNrIFVSTDwvbGk+Ci08bGk+Q2hvb3NlIHRvIGluY2x1ZGUgYSBnbG9zc2FyeSwgaW5kZXgsIHNlYXJjaCBjYXBhYmlsaXR5IGFuZC9vciBwcm9jZXNzCi10cmVlIGN1c3RvbWl6YXRpb24uPC9saT4KLTxsaT5DaG9vc2UgdG8gY2hlY2sgdGhhdCBleHRlcm5hbCBoeXBlcmxpbmtzIGFyZSB2YWxpZC48L2xpPgotPGxpPkNob29zZSB0byBwdWJsaXNoIGFjdGl2aXR5IGRpYWdyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBlZGl0ZWQsIHN1Y2gKLWFzIGFjdGl2aXR5IGRpYWdyYW1zIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB0aGUgdG9vbCwgYnV0IG5vdCBtYW51YWxseQotZWRpdGVkLjwvbGk+Ci08L3VsPgotIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBDaG9vc2luZyB0byBpbmNsdWRlIGVpdGhlciB0aGUgc2VhcmNoIGNhcGFiaWxpdHkgb3IgdG8gc3VwcG9ydAotY3VzdG9taXphdGlvbiBvZiB0aGUgcHJvY2VzcyB2aWV3IHdpbGwgaW5jbHVkZSB0aGUgYnJvd3NlciBhcHBsZXQgaW4gdGhlIHB1Ymxpc2hlZAotV2ViIHNpdGUuIElmIHlvdSBjaG9vc2Ugbm90IHRvIHB1Ymxpc2ggd2l0aCB0aGUgbGFzdCB0d28gb3B0aW9ucywgdGhlIGJyb3dzZXIKLWFwcGxldCB3aWxsIG5vdCBiZSBpbmNsdWRlZC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+LiBQdWJsaXNoaW5nIGlzIGluaXRpYXRlZC48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCNwdWJsaXNoaW5nb3ZlcnZpZXciPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdvdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTgwZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQdWJsaXNoaW5nIE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwjY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwjcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHBvcnRhcHJvY2Vzc29ybWV0aG9kY29udGVudHRvYXBsYW5uaW5ndG9vbC5odG1sI2V4cG9ydGFwcm9jZXNzb3JtZXRob2Rjb250ZW50dG9hcGxhbm5pbmd0b29sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InB1Ymxpc2hpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QdWJsaXNoaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwdWJsaXNoaW5nb3ZlcnZpZXciPjxhIG5hbWU9InB1Ymxpc2hpbmdvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2gxPgotPGRpdj48cD5UaGUgdWx0aW1hdGUgb3V0cHV0IG9mIEVQRiBDb21wb3NlciBpcyBhIHB1Ymxpc2hlZCBXZWIgc2l0ZSB3aXRoIG1ldGhvZAotZ3VpZGFuY2UgYW5kIHByb2Nlc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgcHJvamVjdCB0ZWFtLiBUaGUgaW5mb3JtYXRpb24KLWNvbnRhaW5lZCBpbiB0aGUgV2ViIHNpdGUgcHJvdmlkZXMgYSBwcm9qZWN0IHRlYW0gd2l0aCBhIGNvbnNpc3RlbnQgbWV0aG9kCi1mb3IgdGhlIGVudGlyZSB0ZWFtIHRvIGZvbGxvdyBhbmQgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgZW5kLXRvLWVuZAotd29yayBsaWZlY3ljbGUuIDwvcD4KLTxwPkl0IGlzIGVhc3kgdG8gY29uZmlndXJlIGEgcHJvY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb3Igc2l6ZSBvZiBwcm9qZWN0Ci1hbmQgdG8gcHVibGlzaCB0aGUgZ3VpZGFuY2UgdG8gYSBXZWIgc2l0ZS4gQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIHNlbGVjdGlvbgotb2YgQ29udGVudCBQYWNrYWdlcyBhY3Jvc3MgZGlmZmVyZW50IE1ldGhvZCBQbHVnLWlucyBjb250YWluaW5nIHRoZSBtZXRob2QKLWFuZCBwcm9jZXNzIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBwdWJsaXNoZWQgV2ViIHNpdGUuIEF0IHB1Ymxpc2hpbmcKLXRpbWUsIHRoZSBjb25maWd1cmF0aW9uIGlzIGNvbWJpbmVkIHdpdGggZGlmZmVyZW50IE1ldGhvZCBWaWV3cyB3aGljaCBkZWZpbmUKLXRoZSBXZWIgc2l0ZSdzIG5hdmlnYXRpb24gc3RydWN0dXJlcyBhbmQgY29udGVudCBvcmdhbml6YXRpb24uPC9wPgotPHA+VGhlIEJyb3dzaW5nIFBlcnNwZWN0aXZlIHJlbmRlcnMgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIGNvbnRlbnQgaW4gSFRNTAotZm9ybWF0IHdpdGhpbiB0aGUgdG9vbCwgcHJvdmlkaW5nIGEgbmF2aWdhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QKLW9yIHByb2Nlc3MgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24uPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sI2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMiPkNyZWF0ZSBhIE1ldGhvZCBWaWV3IHdpdGggQ3VzdG9tIENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sI3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiI+UHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIGEgTWV0aG9kIFdlYjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBsYWNlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBsYWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZWUyZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4dGVuZHMuaHRtbCNleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJlcGxhY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXBsYWNlcyI+PGEgbmFtZT0icmVwbGFjZXMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SZXBsYWNlczwvaDE+Ci08ZGl2PjxwPkEgcmVwbGFjaW5nIGVsZW1lbnQgcmVwbGFjZXMgcGFydHMgb2YgdGhlIGJhc2UgZWxlbWVudC4gUmVwbGFjZXMgcHJvdmlkZXMKLWEgd2F5IGZvciBhbiBlbGVtZW50IHRvIHJlcGxhY2UgYSBiYXNlIGVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkKLW9mIHRoZSBiYXNlIGVsZW1lbnQncyBleGlzdGluZyBwcm9wZXJ0aWVzLiBUaGlzIGlzLCBpbiBtb3N0IGNhc2VzLCB1c2VkIGZvcgotbWV0aG9kIHBsdWctaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgY29udGVudCBlbGVtZW50cyBzdWNoIGFzIHJvbGVzLAotdGFza3MsIG9yIGFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZWx5IG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSB0aGUKLWZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMuIFRoZSBlZmZlY3Qgb2YgdGhpcywgaXMgdGhhdCB0aGUKLWJhc2UgY29udGVudCBlbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuZXcgcmVwbGFjaW5nIGVsZW1lbnQKLXRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5Ci1uZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy48L3A+Ci08cD5Vc2UgdGhlIENvbnRlbnQgVmFyaWFiaWxpdHkgc2VjdGlvbiBvbiB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIG1ha2UgYW4gZWxlbWVudAotcmVwbGFjZSBhbm90aGVyIGVsZW1lbnQuIFNlbGVjdCA8c3Ryb25nPlJlcGxhY2VzPC9zdHJvbmc+IGFzIHRoZSB2YXJpYWJpbGl0eSB0eXBlIGFuZAotc2VsZWN0IHRoZSBiYXNlIGVsZW1lbnQgdGhhdCB0aGlzIGVsZW1lbnQgd2lsbCByZXBsYWNlLiBUaGUgYmFzZSBlbGVtZW50IG11c3QKLWJlIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudCBhcyB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuPC9wPgotPHA+V2hlbiB5b3UgcmVwbGFjZSBhbiBlbGVtZW50LCBhbGwgdGhlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMgYXJlIHJlcGxhY2VkCi1ieSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuIElmIGEgZGVzY3JpcHRpb24gYXR0cmlidXRlIGluIHRoZSByZXBsYWNpbmcgZWxlbWVudAotaXMgYmxhbmssIGJ1dCB0aGUgYmFzZSBlbGVtZW50IGhhcyBjb250ZW50LCB0aGUgYXR0cmlidXRlIHdpbGwgYmUgYmxhbmsgaW4KLXRoZSByZXN1bHRpbmcgZWxlbWVudC48L3A+Ci08cD5SZXBsYWNlIGFsd2F5cyByZXBsYWNlcyBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudAotd2l0aCB0aGUgcmVwbGFjaW5nIGVsZW1lbnQncyBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMsIGV4Y2VwdCBmb3IgaW5jb21pbmcKLWFzc29jaWF0aW9ucywgd2hpY2ggYXJlIG9ubHkgYWRkZWQgdG8gdGhlIGJhc2UsIGJ1dCBkbyBub3QgcmVwbGFjZSB0aGUgYmFzZSdzCi1pbmNvbWluZyBhc3NvY2lhdGlvbnMuPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5SZXBsYWNlcyBydWxlczo8L3N0cm9uZz48dWw+PGxpPkF0dHJpYnV0ZXMgb2YgdGhlIGJhc2UgZWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCBhdHRyaWJ1dGVzIG9mIHRoZSByZXBsYWNpbmcKLWVsZW1lbnQgaW5jbHVkaW5nIGlkZW50aWZpZXIgb2YgdGhlIGJhc2UgZWxlbWVudC48L2xpPgotPGxpPk91dGdvaW5nIHRvLW9uZSBhbmQgdG8tbWFueSBhc3NvY2lhdGlvbnMgb2YgdGhlIHJlcGxhY2luZyBlbGVtZW50IHJlcGxhY2UKLWFueSBvdXRnb2luZyBhc3NvY2lhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudC4gSWYgdGhlIGNvbnRyaWJ1dG9yIGRvZXMgbm90Ci1oYXZlIGFueSBvdXRnb2luZyBhc3NvY2lhdGlvbnMsIHRoZW4gbmVpdGhlciB3aWxsIHRoZSByZXN1bHRpbmcgZWxlbWVudC48L2xpPgotPGxpPkluY29taW5nIGFzc29jaWF0aW9ucyB3aXRoIGEgdG8tbWFueSBjb25zdHJhaW50IG9uIHRoZSBvdGhlciBhc3NvY2lhdGlvbgotZW5kIHRvIHRoZSByZXBsYWNlZCBlbGVtZW50IGFyZSBwcmVzZXJ2ZWQgYW5kIGF1Z21lbnRlZCB3aXRoIGluY29taW5nIGFzc29jaWF0aW9ucwotb2YgdGhlIHJlcGxhY2luZyBlbGVtZW50LjwvbGk+Ci08bGk+SW5jb21pbmcgYXNzb2NpYXRpb25zIHdpdGggYSB0by1vbmUgY29uc3RyYWludCBvbiB0aGUgb3RoZXIgYXNzb2NpYXRpb24KLWVuZCB0byB0aGUgcmVwbGFjZWQgZWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBpbmNvbWluZyBhc3NvY2lhdGlvbgotb2YgdGhlIHJlcGxhY2luZyBlbGVtZW50LiBJZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBzdWNoIGFuIGFzc29jaWF0aW9uCi10aGVuIHRoZSByZXN1bHRpbmcgZWxlbWVudCBrZWVwcyB0aGUgaW5jb21pbmcgYXNzb2NpYXRpb24gb2YgdGhlIGJhc2UgZWxlbWVudC48L2xpPgotPGxpPkEgYmFzZSBlbGVtZW50IG9mIGEgcmVwbGFjZW1lbnQgY2FuIGhhdmUgb25seSBvbmUgcmVwbGFjaW5nIGVsZW1lbnQgcGVyCi1jb25maWd1cmF0aW9uLiBJZiBtb3JlIHRoYW4gb25lIHJlcGxhY2luZyBlbGVtZW50IGlzIHByZXNlbnQsIG5vIHJlcGxhY2VtZW50Ci10YWtlcyBwbGFjZS48L2xpPgotPGxpPlJlcGxhY2VtZW50IHdvcmtzIHRyYW5zaXRpdmVseSwgaS5lLiBpZiBhIHJlcGxhY2luZyBlbGVtZW50IGlzIHJlcGxhY2VkCi1pdHNlbGYsIHRoZSBmaW5hbCByZXBsYWNlciBwcmV2YWlscy48L2xpPgotPGxpPkNvbnRyaWJ1dGlvbiBwcmVjZWRlcyBSZXBsYWNlbWVudCwgaS5lLiBjb250cmlidXRpb24gaXMgZXZhbHVhdGVkIGZpcnN0Ci1hbmQgdGhlbiByZXBsYWNlbWVudCBwZXJmb3JtZWQgYWZ0ZXJ3YXJkLiBUaGUgZXZhbHVhdGlvbiBvZiBjb250cmlidXRpb24gYW5kCi1yZXBsYWNlbWVudCBpcyBwZXJmb3JtZWQgdG9wLWRvd24gaW4gdGhlIHNwZWNpYWxpemF0aW9uIGhpZXJhcmNoeS48L2xpPgotPC91bD4KLVNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhc3NvY2lhdGlvbnMgZm9yIGVhY2ggZWxlbWVudAotdHlwZS48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJleHRlbmRzLmh0bWwjZXh0ZW5kcyI+RXh0ZW5kczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyI+Q29udHJpYnV0ZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwb3J0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1M2EyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBvcnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJlcG9ydCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyZXBvcnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UmVwb3J0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXBvcnQiPjxhIG5hbWU9InJlcG9ydCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlcG9ydDwvaDE+Ci08ZGl2PjxwPkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUKLWJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4KLUZvciBleGFtcGxlLCBhIHJlcG9ydCBtYXkgY29tYmluZSBhIGdyYXBoaWNhbCBtb2RlbCBmcm9tIGEgZGVzaWduIHRvb2wgd2l0aAotdGV4dHVhbCBpbmZvcm1hdGlvbiBkb2N1bWVudHMgaW50byBhIHJlcG9ydC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXVzYWJsZWFzc2V0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXVzYWJsZWFzc2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMDExNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmV1c2FibGVhc3NldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmV1c2FibGUgQXNzZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icmV1c2FibGVhc3NldCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5SZXVzYWJsZSBBc3NldDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmV1c2FibGVhc3NldCI+PGEgbmFtZT0icmV1c2FibGVhc3NldCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJldXNhYmxlIEFzc2V0PC9oMT4KLTxkaXY+PHA+QSByZXVzYWJsZSBhc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LgotVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyBob3cgdGhlCi1hc3NldCBzaG91bGQgYmUgdXNlZC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yaWNodGV4dGVkaXRvci5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmljaHRleHRlZGl0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjMWE0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yaWNodGV4dGVkaXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmljaCBUZXh0IEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyaWNodGV4dGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5SaWNoIFRleHQgRWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyaWNodGV4dGVkaXRvciI+PGEgbmFtZT0icmljaHRleHRlZGl0b3IiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SaWNoIFRleHQgRWRpdG9yPC9oMT4KLTxkaXY+PHA+VGhlIFJpY2ggVGV4dCBFZGl0b3IgcHJvdmlkZXMgc2ltcGxlIHRleHQgZm9ybWF0dGluZyBmdW5jdGlvbnMKLXRoYXQgYWxsb3cgYW4gYXV0aG9yIHRvIGNoYW5nZSBob3cgc2VjdGlvbnMgb2YgdGV4dCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQKLVdlYiBzaXRlLiBUaGUgUmljaCBUZXh0IEVkaXRvciBhbGxvd3MgaW5kaXZpZHVhbCBjb21wb25lbnRzIG9mIHRleHQgdG8gYmUKLWNoYW5nZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBvdmVyYWxsIHN0eWxlIHNoZWV0KHMpIHRoYXQgZGV0ZXJtaW5lIHRoZQotc3R5bGUgYW5kIGZvcm1hdCBvZiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgUmljaCBUZXh0IEVkaXRvciBhbGxvd3MgeW91IHRvOjx1bD48bGk+Q29weSwgY3V0IGFuZCBwYXN0ZSB0ZXh0LiBTaW1wbHkgaGlnaGxpZ2h0IHRoZSB0ZXh0IHlvdSB3YW50IHRvIGN1dCBvcgotY29weSBhbmQgdGhlbiBjbGljayB0aGUgQ3V0IDxpbWcgc3JjPSJjdXQuZ2lmIiBhbHQ9IiIgLz4gb3IgQ29weSA8aW1nIHNyYz0iY29weS5naWYiIGFsdD0iIiAvPiBidXR0b25zLiBUbyBwYXN0ZSB0ZXh0LCBwbGFjZSB0aGUgY3Vyc29yCi13aGVyZSB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSB0ZXh0IGFuZCB0aGVuIGNsaWNrIHRoZSBQYXN0ZSBidXR0b24gPGltZyBzcmM9InBhc3RlLmdpZiIgYWx0PSIiIC8+LjwvbGk+Ci08bGk+UmVtb3ZlIGFsbCB0aGUgY29udGVudHMgaW4gdGhlIHRleHQgZWRpdG9yIHdpbmRvdyBhdCBvbmNlIGJ5IGNsaWNraW5nCi10aGUgQ2xlYXIgQ29udGVudCBidXR0b24gPGltZyBzcmM9ImNsZWFyY29udGVudC5naWYiIGFsdD0iIiAvPi48L2xpPgotPGxpPkNoYW5nZSB0aGUgYXBwZWFyYW5jZSBvZiB5b3VyIHRleHQgYnkgbWFraW5nIGl0IGJvbGQsIGl0YWxpY2l6ZWQsIG9yIHVuZGVybGluaW5nCi1pdC4gSGlnaGxpZ2h0IHRoZSB0ZXh0IHlvdSB3YW50IHRvIGNoYW5nZSBhbmQgdGhlbiBjbGljayB0aGUgQm9sZCA8aW1nIHNyYz0iYm9sZC5naWYiIGFsdD0iIiAvPiwgSXRhbGljcyA8aW1nIHNyYz0iaXRhbGljLmdpZiIgYWx0PSIiIC8+LAotb3IgVW5kZXJsaW5lIDxpbWcgc3JjPSJ1bmRlcmxpbmUuZ2lmIiBhbHQ9IiIgLz4gYnV0dG9uLjwvbGk+Ci08bGk+Q3JlYXRlIFN1cGVyIG9yIFN1YiBzY3JpcHQgYnkgY2xpY2tpbmcgdGhlIFN1cGVyc2NyaXB0IDxpbWcgc3JjPSJzdXBlcnNjcmlwdC5naWYiIGFsdD0iIiAvPiBvciBTdWJzY3JpcHQgPGltZyBzcmM9InN1YnNjcmlwdC5naWYiIGFsdD0iIiAvPiBidXR0b25zLjwvbGk+Ci08bGk+QWRkIG51bWJlcmVkIG9yIGJ1bGxldGVkIGxpc3RzIHVzaW5nIHRoZSBvcmRlcmVkIDxpbWcgc3JjPSJhZGRvcmRsaXN0X2NvLmdpZiIgYWx0PSIiIC8+IG9yIHVub3JkZXJlZCBsaXN0IDxpbWcgc3JjPSJhZGR1bm9yZGxpc3RfY28uZ2lmIiBhbHQ9IiIgLz4gYnV0dG9ucy48L2xpPgotPGxpPkluZGVudCBvciBPdXRkZW50IHRleHQgdXNpbmcgdGhlIEluZGVudCA8aW1nIHNyYz0iaW5kZW50LmdpZiIgYWx0PSIiIC8+IG9yIE91dGRlbnQgPGltZyBzcmM9Im91dGRlbnQuZ2lmIiBhbHQ9IiIgLz4gYnV0dG9ucy48L2xpPgotPGxpPkZpbmQgYW5kIHJlcGxhY2UgdGV4dC4gQ2xpY2sgdGhlIEZpbmQvUmVwbGFjZSBidXR0b24gPGltZyBzcmM9ImZpbmRyZXBsYWNlLmdpZiIgYWx0PSIiIC8+LiBUaGUgRmluZC9SZXBsYWNlIGRpYWxvZyBib3ggYXBwZWFycy4gVHlwZSB0aGUgdGV4dCB5b3UKLXdhbnQgdG8gZmluZCBpbiB0aGUgRmluZCBmaWVsZCBhbmQsIGlmIHlvdSBhcmUgcmVwbGFjaW5nIHRoYXQgdGV4dCwgdHlwZSB0aGUKLXJlcGxhY2VtZW50IHRleHQgaW4gdGhlIFJlcGxhY2Ugd2l0aCBmaWVsZC4gWW91IGNhbiBzZWFyY2ggZm9yd2FyZCBvciBiYWNrCi1hbmQgc3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHlvdXIgc2VhcmNoIHRvIGJlIGNhc2Ugc2Vuc2l0aXZlIG9yIHNlYXJjaCBmb3IKLW9ubHkgcGFydHMgb2Ygd29yZHMuPC9saT4KLTxsaT5BZGQgb3IgY3JlYXRlIGh5cGVybGlua3MgdXNpbmcgdGhlIEFkZCBsaW5rIGJ1dHRvbiA8aW1nIHNyYz0iYWRkbGlua19jby5naWYiIGFsdD0iIiAvPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImFkZGFyZWZlcmVuY2Vvcmh5cGVybGluay5odG1sI2FkZGFyZWZlcmVuY2Vvcmh5cGVybGluayI+QWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluazwvYT4uPC9saT4KLTxsaT5BZGQgaW1hZ2VzLiBDbGljayB0aGUgQWRkIEltYWdlIGJ1dHRvbiA8aW1nIHNyYz0iYWRkaW1nX2NvLmdpZiIgYWx0PSIiIC8+LiBUaGUgQWRkIEltYWdlIGRpYWxvZyBib3ggYXBwZWFycy4gQnJvd3NlIGZvciB0aGUgaW1hZ2UgeW91J2QgbGlrZQotdG8gYWRkIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLTxsaT5BZGQgdGFibGVzLiBDbGljayB0aGUgQWRkIFRhYmxlIGJ1dHRvbiA8aW1nIHNyYz0iYWRkdGFibGVfY28uZ2lmIiBhbHQ9IiIgLz4uIFRoZSBBZGQgVGFibGUgZGlhbG9nIGJveCBhcHBlYXJzLiBTcGVjaWZ5IHRoZSB0YWJsZSBwYXJhbWV0ZXJzCi1hbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2FkbWFwLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2FkbWFwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOTliZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9hZG1hcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9hZG1hcCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyb2FkbWFwIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJvYWRtYXA8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvYWRtYXAiPjxhIG5hbWU9InJvYWRtYXAiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2FkbWFwPC9oMT4KLTxkaXY+PHA+QSBSb2FkbWFwIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBob3cgYSBwcm9jZXNzIGlzCi10eXBpY2FsbHkgcGVyZm9ybWVkLiBPZnRlbiBwcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZwotYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGUgcHJvY2Vzcy4KLUluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUKLXByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIHJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dAotaG93IGFjdGl2aXRpZXMgYW5kIHRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFiZDlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2xlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyb2xlIj48YSBuYW1lPSJyb2xlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Um9sZTwvaDE+Ci08ZGl2PjxwPkEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzCi1vZiBhbiBpbmRpdmlkdWFsIG9yIGluZGl2aWR1YWxzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWJiYzFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJvbGUgU2V0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvbGVzZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Um9sZSBTZXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvbGVzZXQiPjxhIG5hbWU9InJvbGVzZXQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2xlIFNldDwvaDE+Ci08ZGl2PjxwPkEgUm9sZSBTZXQgaXMgdXNlZCB0byBncm91cCA8YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZXM8L2E+IHdpdGgKLWNlcnRhaW4gY29tbW9uYWxpdGllcyB0b2dldGhlci4gRm9yIGV4YW1wbGUsIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsCi1hbiBBbmFseXN0IHJvbGUgc2V0IGNvdWxkIGJlIHVzZWQgdG8gZ3JvdXAgdG9nZXRoZXIgcm9sZXMgc3VjaCBhcyBCdXNpbmVzcwotUHJvY2VzcyBBbmFseXN0LCBTeXN0ZW0gQW5hbHlzdCBhbmQgUmVxdWlyZW1lbnRzIFNwZWNpZmllci4gRWFjaCBvZiB0aGVzZQotcm9sZXMgd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBtYXkgYmUKLXJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIGNlcnRhaW4gdGFza3MgYW5kIGNyZWF0aW5nIGNlcnRhaW4gd29yayBwcm9kdWN0cy4KLVJvbGUgc2V0cyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIFJvbGUgU2V0IEdyb3VwaW5ncy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXRncm91cGluZy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldGdyb3VwaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzVmYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldGdyb3VwaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSb2xlIFNldCBHcm91cGluZyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icm9sZXNldC5odG1sI3JvbGVzZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJvbGUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyb2xlc2V0Z3JvdXBpbmciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Um9sZSBTZXQgR3JvdXBpbmc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvbGVzZXRncm91cGluZyI+PGEgbmFtZT0icm9sZXNldGdyb3VwaW5nIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Um9sZSBTZXQgR3JvdXBpbmc8L2gxPgotPGRpdj48cD5Sb2xlIHNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gcm9sZSBzZXQgZ3JvdXBpbmdzLiBGb3IgZXhhbXBsZSwgZGlmZmVyZW50Ci1tZXRob2QgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzIHdoaWNoLCBob3dldmVyLCBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQKLWZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLAotZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBzZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQKLU9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJyb2xlc2V0Lmh0bWwjcm9sZXNldCI+Um9sZSBTZXQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJvbGUuaHRtbCI+Um9sZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhjb250LkpQRyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhjb250LkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDljNTBkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRoY29udC5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDI1NTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2VhcmNoIGZvciBNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ic2VhcmNoZm9ybWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5TZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Ij48YSBuYW1lPSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2VhcmNoIGZvciBNZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIFNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBiZWdpbiB5b3VyIHNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQuPC9zcGFuPjx1bD48bGk+U2VsZWN0IDxzdHJvbmc+U2VhcmNoICZndDsgU2VhcmNoPC9zdHJvbmc+PC9saT4KLTxsaT48c3Ryb25nPlNlYXJjaCAmZ3Q7IEZpbGU8L3N0cm9uZz48L2xpPgotPGxpPkNsaWNrIHRoZSBTZWFyY2ggYnV0dG9uIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjxpbWcgc3JjPSJzZWFyY2hmb3JtZXRoY29udC5KUEciIGFsdD0iIiAvPjwvc3Bhbj4gaW4gdGhlIHRvb2wgYmFyLjwvbGk+Ci08L3VsPgotIFRoZSBTZWFyY2ggZGlhbG9nIHdpbmRvdyBvcGVucy48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayBlaXRoZXIgdGhlIDxzdHJvbmc+RmlsZSBTZWFyY2g8L3N0cm9uZz4gdGFiIG9yIHRoZSA8c3Ryb25nPk1ldGhvZCBTZWFyY2g8L3N0cm9uZz4gdGFiCi1hbmQgdGhlbiBzZXQgeW91ciBjcml0ZXJpYS4gVXNpbmcgdGhlIDxzdHJvbmc+RmlsZSBTZWFyY2g8L3N0cm9uZz4gdGFiLCB5b3UgY2FuIHNlYXJjaAotZm9yIGNvbnRlbnQgYnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgY29udGVudC4gVXNpbmcgdGhlIDxzdHJvbmc+TWV0aG9kIFNlYXJjaDwvc3Ryb25nPiB0YWIsCi15b3UgY2FuIHNlYXJjaCB0aGUgbWV0aG9kIGNvbnRlbnQgaXRzZWxmLjwvc3Bhbj48dWw+PGxpPjxzdHJvbmc+VXNpbmcgRmlsZSBTZWFyY2g8L3N0cm9uZz46IFR5cGUgYSB0ZXh0IHN0cmluZyB0byBzZWFyY2ggZm9yIHdpdGhpbgotdGhlIGZpbGVzIChvcHRpb25hbCksIG9yIHR5cGUgYSBmaWxlIG5hbWUgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nIGZpbGUKLW5hbWVzLiBZb3UgbXVzdCB1c2UgYSBwYXR0ZXJuLiBVc2UgKiBpZiB5b3Ugd2FudCB0byBzZWFyY2ggZm9yIHRoZSB0ZXh0IGluCi1hbGwgZmlsZXMuIExlYXZlIGFsbCBvdGhlciBvcHRpb25zIGFzIGRlZmF1bHQuPC9saT4KLTxsaT48c3Ryb25nPlVzaW5nIE1ldGhvZCBTZWFyY2g8L3N0cm9uZz46IFR5cGUgYSB0ZXh0IHN0cmluZyB0byBzZWFyY2ggZm9yIHdpdGhpbgotdGhlIGZpbGVzIChvcHRpb25hbCksIG9yIHR5cGUgYSBuYW1lIHBhdHRlcm4gZm9yIG1hdGNoaW5nIGVsZW1lbnQgbmFtZXMgYW5kCi1wcmVzZW50YXRpb24gbmFtZXMuIFlvdSBtdXN0IHVzZSBhIHBhdHRlcm4uIFVzZSAqIGlmIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IKLXRleHQgaW4gYWxsIGZpbGVzLiBJbiB0aGUgU2NvcGUgc2VjdGlvbiwgeW91IGNhbiByZXN0cmljdCB5b3VyIHNlYXJjaCB0byBhCi1zdWJzZXQgb2YgZWxlbWVudCB0eXBlcy48L2xpPgotPC91bD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+U2VhcmNoPC9zdHJvbmc+LiBUaGUgU2VhcmNoIFZpZXcgb3BlbnMgd2l0aCB5b3VyIHNlYXJjaCByZXN1bHRzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgU2VhcmNoIFZpZXcsIHlvdSBjYW4gZHJpbGwgZG93biBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cwotYW5kIGRvdWJsZS1jbGljayBhbiBlbGVtZW50IHRvIG9wZW4gdGhlIGVkaXRvciBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQuIElmCi15b3UgaGF2ZSBMaW5rIHdpdGggRWRpdG9yIHNlbGVjdGVkIGluIHRoZSBsaWJyYXJ5IHZpZXcsIHRoZSBsaWJyYXJ5IHZpZXcgZGlzcGxheQotY2hhbmdlcyB0byBzaG93IHlvdSB3aGVyZSB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpcyBpbiB0aGUgbGlicmFyeS48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YmFlYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlN0YW5kYXJkIE1ldGhvZCBMaWJyYXJ5IE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIG1ldGhvZCBwbHVnLWlucyBhbmQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuIEFsbCBtZXRob2QgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIG1ldGhvZCBsaWJyYXJ5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBtZXRob2QgcGx1Zy1pbnMgYW5kIG1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiBBbGwgbWV0aG9kIGVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBtZXRob2QgbGlicmFyeS4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ic3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U3RhbmRhcmQgTWV0aG9kIExpYnJhcnkgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Ij48YSBuYW1lPSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN0YW5kYXJkIE1ldGhvZCBMaWJyYXJ5IE92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgbWV0aG9kIHBsdWctaW5zIGFuZAotbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuIEFsbCBtZXRob2QgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIG1ldGhvZAotbGlicmFyeS48L3A+Ci08cD5NdWNoIGxpa2UgYSBsaWJyYXJ5IGhhcyBib29rcywgYSBtZXRob2QgbGlicmFyeSBoYXMgbWV0aG9kIHBsdWctaW5zLiBXaGVyZQotYSBsaWJyYXJ5IGJvb2sgaXMgbWFkZSB1cCBvZiBzZWN0aW9ucyBvciBjaGFwdGVycyBhbmQgY29udGVudCB3aXRoaW4gdGhvc2UKLWNoYXB0ZXJzLCA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPm1ldGhvZAotcGx1Zy1pbnM8L2E+IGFyZSBtYWRlIHVwIG9mIDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPm1ldGhvZCBjb250ZW50PC9hPiBhbmQgcHJvY2Vzc2VzLiBNZXRob2QgY29udGVudCBjb250YWlucwotY29udGVudCBwYWNrYWdlcyBhbmQgYm90aCA8YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5zdGFuZGFyZCBhbmQgY3VzdG9tIGNhdGVnb3JpZXM8L2E+LCB3aGlsZSBwcm9jZXNzZXMgc3RydWN0dXJlCi10aGlzIGNvbnRlbnQgaW50byBwcm9jZXNzIGZyYWdtZW50cyBjYWxsZWQgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Y2FwYWJpbGl0eSBwYXR0ZXJuczwvYT4gYW5kIGZ1bGwgbGlmZWN5Y2xlIHByb2Nlc3NlcyBjYWxsZWQgPGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwiPmRlbGl2ZXJ5IHByb2Nlc3NlczwvYT4uPC9wPgotPHA+QSBtZXRob2QgbGlicmFyeSBhbHNvIGhhcyBvbmUgb3IgbW9yZSA8YSBocmVmPSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIj5tZXRob2QgY29uZmlndXJhdGlvbnM8L2E+IHRoYXQgZmlsdGVyIHRoZSBsaWJyYXJ5IGFuZCBwcm92aWRlCi1zbWFsbGVyIHdvcmtpbmcgc2V0cyBvZiBsaWJyYXJ5IGNvbnRlbnQgZm9yIHRoZSBlbmQgdXNlci48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGVwLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZWQwYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RlcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3RlcCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzdGVwIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlN0ZXA8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InN0ZXAiPjxhIG5hbWU9InN0ZXAiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdGVwPC9oMT4KLTxkaXY+PHA+QSBTdGVwIGlzIGEgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSB0YXNrLiBUaGUgY29sbGVjdGlvbgotb2Ygc3RlcHMgZGVmaW5lZCBmb3IgYSB0YXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8KLWFjaGlldmUgdGhlIG92ZXJhbGwgZ29hbCBvZiB0aGUgdGFzay4gTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkCi1lYWNoIHRpbWUgYSB0YXNrIGlzIGludm9rZWQgaW4gYSBwcm9jZXNzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1YnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdWJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDMzYzgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1YnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBlcnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBlcnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNjc1Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwZXJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwcG9ydGluZ21hdGVyaWFsLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjNmQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlN1cHBvcnRpbmcgTWF0ZXJpYWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ic3VwcG9ydGluZ21hdGVyaWFsIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InN1cHBvcnRpbmdtYXRlcmlhbCI+PGEgbmFtZT0ic3VwcG9ydGluZ21hdGVyaWFsIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3VwcG9ydGluZyBNYXRlcmlhbDwvaDE+Ci08ZGl2PjxwPlN1cHBvcnRpbmcgTWF0ZXJpYWwgaXMgYSBjYXRjaC1hbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlCi1ub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgY29udGVudAotZWxlbWVudHMsIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90YXNrLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90YXNrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNTU3NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGFzay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VGFzazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFzayI+PGEgbmFtZT0idGFzayI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRhc2s8L2gxPgotPGRpdj48cD5BIFRhc2sgaXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gYSBzcGVjaWZpYwotUm9sZS4gVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cyBhbmQKLXVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIHVtYmVyIG9mIFdvcmsgUHJvZHVjdHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVtcGxhdGUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3RlbXBsYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTcxMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVtcGxhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlRlbXBsYXRlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InRlbXBsYXRlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRlbXBsYXRlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZW1wbGF0ZSI+PGEgbmFtZT0idGVtcGxhdGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5UZW1wbGF0ZTwvaDE+Ci08ZGl2PjxwPkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSB3b3JrIHByb2R1Y3QKLXdpdGggYSBwcmVkZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywKLWEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBzZWN0aW9ucwotYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW4gYmUgcHJvdmlkZWQKLWZvciBkb2N1bWVudHMgYXMgd2VsbCBhcyBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZXJtZGVmaW5pdGlvbi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVybWRlZmluaXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1YTM1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZXJtZGVmaW5pdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVGVybSBEZWZpbml0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InRlcm1kZWZpbml0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRlcm0gRGVmaW5pdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVybWRlZmluaXRpb24iPjxhIG5hbWU9InRlcm1kZWZpbml0aW9uIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VGVybSBEZWZpbml0aW9uPC9oMT4KLTxkaXY+PHA+VGVybSBkZWZpbml0aW9ucyBkZWZpbmVzIGEgc3BlY2lmaWMgdGVybSwgY29uY2VwdCwgb3Igb3RoZXIgaWRlYSByZWxldmFudAotdG8gbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQuIEEgdGVybSBkZWZpbml0aW9uIGlzIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvCi1hbnkgY29udGVudCBlbGVtZW50cywgYnV0IHJlbGF0aW9uc2hpcHMgYXJlIGRlcml2ZWQgd2hlbiB0aGUgdGVybSBpcyB1c2VkCi1pbiB0aGUgZGVzY3JpcHRpb24gdGV4dCBpbiBhIGNvbnRlbnQgZWxlbWVudC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90b29sbWVudG9yLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90b29sbWVudG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxM2VmNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdG9vbG1lbnRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVG9vbCBNZW50b3IiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idG9vbG1lbnRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Ub29sIE1lbnRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idG9vbG1lbnRvciI+PGEgbmFtZT0idG9vbG1lbnRvciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRvb2wgTWVudG9yPC9oMT4KLTxkaXY+PHA+QSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMKLXRvb2wgdG8gYWNjb21wbGlzaCBhIHBpZWNlIG9mIHdvcmsuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5MzBiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAxOiBFeHBsb3JlIHRoZSBVc2VyIEludGVyZmFjZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggdGhlIG1ham9yIHBhcnRzIG9mIHRoZSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHVzZXIgaW50ZXJmYWNlLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggcGVyc3BlY3RpdmUuIFRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIGRpc3BsYXllZCBuZWFyIHRoZSB0b3AgcmlnaHQgb2YgdGhlIHNjcmVlbi4gWW91IHdpbGwgc2VlIGVpdGhlciBBdXRob3Jpbmcgb3IgQnJvd3NpbmcuIENsaWNrIG9uIHRoZSA8c3Ryb25nPk9wZW4gUGVyc3BlY3RpdmU8L3N0cm9uZz4gaWNvbiwgYW5kIHNlbGVjdCB0aGUgb3RoZXIgcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkV4cGxvcmUgdGhlIDxzdHJvbmc+TGlicmFyeTwvc3Ryb25nPiA8c3Ryb25nPlZpZXc8L3N0cm9uZz4uIFRoZSBsaWJyYXJ5IHZpZXcgaXMgYXZhaWxhYmxlIGluIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSCWIGl0IGlzIG5vdCBzaG93biBpbiB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUuIFRoZSBMaWJyYXJ5IFZpZXcgc2hvd3MgeW91IGFsbCB0aGUgY29udGVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LiBUaGUgaGlnaGVzdCBsZXZlbCBjb250ZW50IHVuaXQgaXMgYSBwbHVnaW4uIENsaWNrIG9uIHNvbWUgPHN0cm9uZz4rPC9zdHJvbmc+IHNpZ25zIGFuZCBleHBsb3JlIHRoZSBjb250ZW50LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5EcmlsbCBkb3duIGludG8gYSBwbHVnaW4gYXMgZm9sbG93czogPHN0cm9uZz5NZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXMgJmd0OyBbYW55XSAmZ3Q7IFRhc2tzPC9zdHJvbmc+LiBEb3VibGUgY2xpY2sgb24gYSB0YXNrLiBUaGUgVGFzayBFZGl0b3IgaXMgZGlzcGxheWVkIG9uIHRoZSByaWdodCBvZiB0aGUgc2NyZWVuLiBUaGVyZSBhcmUgc2VwYXJhdGUgZWRpdG9ycyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBjb250ZW50IHRoYXQgeW91IGNhbiBjcmVhdGUgaW4gYSBsaWJyYXJ5LiBFYWNoIGVkaXRvciBoYXMgYSBzZXJpZXMgb2YgdGFicyBhbmQgYSBudW1iZXIgb2YgZm9ybSBlbGVtZW50cyBvbiBlYWNoIHRhYi4gWW91IGNhbiBmaW5kIG91dCBtb3JlIGFib3V0IHRoZXNlIGluIHRoZSA8dT5DcmVhdGUgTWV0aG9kIENvbnRlbnQgPC91PnR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIEEgcHJldmlldyBvZiBhbiBIVE1MIHBhZ2UgaXMgZGlzcGxheWVkLiBUaGlzIGlzIHdoYXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgd2lsbCBsb29rIGxpa2UgaW4gYSBwdWJsaXNoZWQgd2ViIHNpdGUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5icm93c2luZyBwZXJzcGVjdGl2ZTwvc3Ryb25nPi4gVGhlIENvbmZpZ3VyYXRpb24gVmlldyBpcyBub3cgZGlzcGxheWVkLiBUaGUgY29uZmlndXJhdGlvbiB2aWV3IGFsd2F5cyBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGJ1dCB0aGUgY29udGVudCBjaGFuZ2VzIGJhc2VkIG9uIHdoaWNoIGNvbmZpZ3VyYXRpb24gaXMgY3VycmVudGx5IHNlbGVjdGVkLiBEcmlsbCBkb3duIGludG8gdGhlIERpc2NpcGxpbmVzIGZvbGRlciB1bnRpbCB5b3UgZ2V0IHRvIHRhc2tzIGFuZCBjbGljayBvbiBhIHRhc2suIFRoZSBIVE1MIHByZXZpZXcgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgc2hvd24gb24gdGhlIHJpZ2h0IG9mIHRoZSBzY3JlZW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCBjb25maWd1cmF0aW9ucy4gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpcyBkaXNwbGF5ZWQgaW4gdGhlIHNlbGVjdGlvbiBib3ggYmVsb3cgdGhlIG1haW4gbWVudSBiYXIuIFNlbGVjdCBhIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZHJvcCBkb3duIGxpc3QuIFlvdSB3aWxsIHNlZSB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IHJlZnJlc2ggd2hlbiB5b3UgZG8gdGhpcy4gPC9wPgotICA8L2xpPgotICA8bGk+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPmF1dGhvcmluZzwvc3Ryb25nPiA8c3Ryb25nPnBlcnNwZWN0aXZlPC9zdHJvbmc+LiBEcmlsbCBkb3duIGludG8gYSBwbHVnaW4gYXMgZm9sbG93czogPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgW2FueV0gJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zPC9zdHJvbmc+LiBOb3RlIHRoYXQgbm90IGFsbCBwbHVnaW5zIGhhdmUgY2FwYWJpbGl0eSBwYXR0ZXJucy4gRG91YmxlLWNsaWNrIG9uIGEgY2FwYWJpbGl0eSBwYXR0ZXJuLiBUaGUgcmlnaHQgc2lkZSBvZiB0aGUgc2NyZWVuIGlzIG5vdyBmaWxsZWQgd2l0aCB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIGVkaXRvciBhbmQgdGhlIFByb3BlcnRpZXMgVmlldy4gWW91IGNhbiBmaW5kIG91dCBtb3JlIGFib3V0IHRoZXNlIGluIHRoZSA8dT5Xb3JraW5nIHdpdGggUHJvY2Vzc2VzPC91PiB0dXRvcmlhbC48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzIuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwN2E5MjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMjogQnJvd3NlIE1ldGhvZCBDb250ZW50IHZpYSBCcm93c2luZyBQZXJzcGVjdGl2ZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggYnJvd3NpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYSBsaWJyYXJ5IHVzaW5nIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBkcm9wLWRvd24gbGlzdCBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG1haW4gbWVudSBiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNlbGVjdCA8c3Ryb25nPkJyb3dzaW5nIHBlcnNwZWN0aXZlPC9zdHJvbmc+LiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IGFwcGVhcnMgb24gdGhlIGxlZnQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlRvIHZpZXcgYSBUYXNrLCBjbGljayA8c3Ryb25nPkRpc2NpcGxpbmVzICZndDsgUlVQIERpc2NpcGxpbmVzICZndDsgQW5hbHlzaXMgJmFtcDsgRGVzaWduICZndDsgRGVzaWduIHRoZSBVc2VyIEludGVyZmFjZTwvc3Ryb25nPi4gQSBwcmV2aWV3IG9mIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+UHJpbWFyeSBQZXJmb3JtZXIgPC9zdHJvbmc+bGluayBpbiB0aGUgcmVsYXRpb25zaGlwcyBzZWN0aW9uLiBUaGlzIHdpbGwgc2hvdyB0aGUgcHJldmlldyBwYWdlIGZvciB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPllvdSBjYW4gY2xpY2sgb24gYW55IGxpbmtzIGluIHRoZSBwcmV2aWV3IGFuZCB1c2UgdGhlIGJhY2sgaWNvbiBpbiB0aGUgcHJldmlldyB0b29sYmFyIHRvIHJldHVybiB0byBwcmV2aW91cyBwYWdlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+VmlldyBvdGhlciBlbGVtZW50cyBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IHRyZWUgliBlLmcuIHVuZGVyIERvbWFpbnMsIFJvbGUgU2V0cywgZXRjLiA8L3A+Ci0gIDwvbGk+Ci08L29sPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8zLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTExYTgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDM6IEJyb3dzZSBQcm9jZXNzIENvbnRlbnQgdmlhIEJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+IFRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggYnJvd3NpbmcgcHJvY2VzcyBjb250ZW50IGluIGEgbGlicmFyeSB1c2luZyB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUgPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5UbyB2aWV3IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgQW5hbHlzaXMgYW5kIERlc2lnbjwvc3Ryb25nPi4gQSBwcmV2aWV3IG9mIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZSBzZWxlY3RlZCBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5BIENhcGFiaWxpdHkgUGF0dGVybiBjb250YWlucyBhIGxhcmdlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBhbmQgaXMgZGlzcGxheWVkIG92ZXIgZm91ciB0YWJzIJYgRGVzY3JpcHRpb24sIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IFVzYWdlIGFuZCBUZWFtIEFsbG9jYXRpb24uIEV4cGxvcmUgdGhlIGluZm9ybWF0aW9uIG9uIGVhY2ggdGFiLiAKLSAgICA8cD5Ob3RlIHRoYXQgd2hlbiB5b3UgY2xpY2sgb24gYSB0YXNrIGluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgdGFiIHlvdSBwcmV2aWV3IGEgkVRhc2sgRGVzY3JpcHRvcicuIEEgVGFzayBEZXNjcmlwdG9yIGlzIGEgdGFzayB3aXRoaW4gYSBwcm9jZXNzLiBUaGUgdGFzayBkZXNjcmlwdG9yIHBhZ2UgaGFzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrIGFzIGl0IGlzIHVzZWQgYXQgYSBzcGVjaWZpYyBwb2ludCBpbiBhIHByb2Nlc3MuIFRoZSB0YXNrIGRlc2NyaXB0b3IgaGFzIGEgbGluayB0byB0aGUgVGFzayBvbiB3aGljaCBpdCBpcyBiYXNlZC4gPC9wPgotICAgIDxwPkNsaWNraW5nIG9uIGEgcm9sZSBvciB3b3JrIHByb2R1Y3QgaW4gYSB0YXNrIGRlc2NyaXB0b3IgdGFrZXMgeW91IHRvIGEgUm9sZSBEZXNjcmlwdG9yIG9yIGEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IuIFRoZXNlIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJvbGUgb3Igd29yayBwcm9kdWN0IGF0IHRoZSBzYW1lIHBvaW50IGluIHRoZSBwcm9jZXNzIGFuZCBhbHNvIHByb3ZpZGUgbGlua3MgYmFjayB0byB0aGUgY29yZSBtZXRob2QgZWxlbWVudCBvbiB3aGljaCB0aGV5IGFyZSBiYXNlZC4gPC9wPgotICA8L2xpPgotICA8bGk+VG8gdmlldyBhIERlbGl2ZXJ5IFByb2Nlc3MsIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgRGVsaXZlcnkgUHJvY2Vzc2VzICZndDsgQ2xhc3NpYyBSVVAgTGlmZWN5Y2xlPC9zdHJvbmc+LiBUaGUgZGlzcGxheSBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIHNpbWlsYXIgdG8gYSBDYXBhYmlsaXR5IFBhdHRlcm4uIDwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF80Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjZmNDViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDQ6IEJyb3dzZSBNZXRob2QgQ29udGVudCB2aWEgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+IFRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggYnJvd3NpbmcgbGlicmFyeSBjb250ZW50IHdoaWxlIGluIHRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byBBdXRob3JpbmcgcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBMaWJyYXJ5IFZpZXcsIG5hdmlnYXRlIHRvIDxzdHJvbmc+UlVQICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzICZndDsgRGVzaWduICZndDsgR1VJIERlc2lnbiAmZ3Q7IFJvbGU8L3N0cm9uZz5zLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgYSByb2xlIChkb3VibGUgY2xpY2spIGFuZCB1c2UgdGhlIHByZXZpZXcgdGFiIGF0IHRoZSBib3R0b20gb2YgdGhlIHJvbGUgd2luZG93IHRvIHZpZXcgdGhlIGh0bWwgcmVwcmVzZW50YXRpb24gb2YgdGhhdCByb2xlIGFuZCBpdHMgcmVsYXRpb25zaGlwcyB0byBvdGhlciBtZXRob2QgZWxlbWVudHMuIFZpZXcgdGhlIG90aGVyIHRhYnMgdG8gc2VlIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgd2hlbiBhdXRob3JpbmcgdGhlIG1ldGhvZCBjb250ZW50IGFuZCByZWxhdGlvbnNoaXBzIGZvciBhIHJvbGUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJlcGVhdCBzdGVwIDMgdG8gcHJldmlldyBhIDxzdHJvbmc+dGFzazwvc3Ryb25nPiAsIDxzdHJvbmc+d29yayBwcm9kdWN0PC9zdHJvbmc+LCBhbmQgPHN0cm9uZz5ndWlkYW5jZSBlbGVtZW50PC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF81Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQ1MWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDU6IFNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGJlY29tZSBmYW1pbGlhciB3aXRoIHRoZSBzZWFyY2ggZnVuY3Rpb24gaW4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPnBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5PcGVuIHVwIHRoZSBTZWFyY2ggZGlhbG9nIGJ5IDogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNraW5nIG9uIHRoZSBGbGFzaGxpZ2h0IGljb24gaW4gdGhlIHRvb2xiYXIgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgIDxwPjxzdHJvbmc+T3IgPC9zdHJvbmc+PC9wPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgU2VsZWN0aW5nIDxzdHJvbmc+U2VhcmNoIC8gU2VhcmNoPC9zdHJvbmc+IGluIHRoZSBtYWluIG1lbnUuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+TWV0aG9kIFNlYXJjaDwvc3Ryb25nPiB0YWIuIEVudGVyIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkRhdGFiYXNlPC9zcGFuPiBpbiB0aGUgdGV4dCBib3ggYW5kIGNsaWNrIG9uIDxzdHJvbmc+U2VhcmNoPC9zdHJvbmc+LiBJdCB3aWxsIHRha2UgYSBmZXcgc2Vjb25kcyB0byBmaW5kIGFsbCB0aGUgaGl0cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RHJpbGwgZG93biBpbiB0aGUgc2VhcmNoIHJlc3VsdHMgYW5kIGRvdWJsZS1jbGljayBvbiBhbiBlbGVtZW50LiBUaGUgZWRpdG9yIGZvciB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBvcGVuZWQuIElmIHlvdSBoYXZlIDxzdHJvbmc+TGluayB3aXRoIEVkaXRvcjwvc3Ryb25nPiBzZWxlY3RlZCBpbiB0aGUgbGlicmFyeSB2aWV3LCB0aGUgbGlicmFyeSB2aWV3IGRpc3BsYXkgY2hhbmdlcyB0byBzaG93IHlvdSB3aGVyZSB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBpbiB0aGUgbGlicmFyeS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+T3BlbiB0aGUgc2VhcmNoIGRpYWxvZyBhZ2FpbiBhbmQgcmVwZWF0IHRoZSBzYW1lIHNlYXJjaCBidXQgdGhpcyB0aW1lIHJlZHVjZSB0aGUgc2NvcGUgdG8ganVzdCBsb29rIGZvciB0YXNrcy4gVW5jaGVjayBhbGwgdGhlIG90aGVyIGNvbnRlbnQgdHlwZXMgaW4gdGhlIHNjb3BlIHBhbmVsLiBUaGUgc2VhcmNoIHNob3VsZCBiZSBxdWlja2VyIGFuZCByZXN1bHQgaW4gZmV3ZXIgaGl0cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+T3BlbiB0aGUgc2VhcmNoIGRpYWxvZyBhZ2FpbiBhbmQgcmVwZWF0IHRoZSBzYW1lIHNlYXJjaCBidXQgdGhpcyB0aW1lIGFkZCA8c3Ryb25nPnJ1cF8qPC9zdHJvbmc+IGFzIGEgZmlsZSBuYW1lIHBhdHRlcm4uIE1ha2Ugc3VyZSB0aGUgc2NvcGUgaXMgc3RpbGwgc2V0IHRvIHRhc2tzLiBUaGUgc2VhcmNoIHNob3VsZCBiZSBldmVuIHF1aWNrZXIgYW5kIHJlc3VsdCBpbiBldmVuIGZld2VyIGhpdHMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkV4cGVyaW1lbnQgd2l0aCBvdGhlciBNZXRob2QgU2VhcmNoZXMuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9pbnRyby5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTJkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPlR1dG9yaWFsOiAKLQotCi0gTmF2aWdhdGUgdGhlIFVzZXIgSW50ZXJmYWNlCi0KLTwvYT48L2gxPgotPGgyPjxhPkludHJvZHVjdGlvbiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgdHV0b3JpYWwgaXMgdG8gZ2V0IGZhbWlsaWFyIHdpdGggdXNlciBpbnRlcmZhY2UgYW5kIHRoZSB3YXkgbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQgaXMgc3RvcmVkIGFuZCB2aWV3ZWQuIDwvcD4KLTxwPkEgTWV0aG9kIExpYnJhcnkgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YgPHN0cm9uZz48ZW0+bWV0aG9kIHBsdWctaW5zLiA8L2VtPjwvc3Ryb25nPldpdGhpbiBhIHBsdWdpbiwgY29udGVudCBpcyBzZXBhcmF0ZWQgaW50byA8c3Ryb25nPjxlbT5NZXRob2QgQ29udGVudCA8L2VtPjwvc3Ryb25nPiAodGFza3MsIHJvbGVzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZSkgYW5kIDxzdHJvbmc+PGVtPlByb2Nlc3NlcyA8L2VtPjwvc3Ryb25nPiAoY2FwYWJpbGl0eSBwYXR0ZXJucyBhbmQgZGVsaXZlcnkgcHJvY2Vzc2VzKS4gVGhpcyBpcyBob3cgdGhlIExpYnJhcnkgVmlldywgd2hpY2ggc2hvd3MgYWxsIHRoZSBjb250ZW50IGluIHRoZSBsaWJyYXJ5IGlzIG9yZ2FuaXplZC4gPC9wPgotPHA+QSBjb25maWd1cmF0aW9uIGlzIGEgc3Vic2V0IG9mIHRoZSBtZXRob2QgbGlicmFyeSBjb250ZW50LiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IHNob3dzIHRoZSBjb250ZW50IGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gT25jZSBhIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQsIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgaXMgcmVmcmVzaGVkIHdpdGggdGhlIGNvbnRlbnQgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4gVGhlIGNvbnRlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpcyBhbHdheXMgbGFpZCBvdXQgdXNpbmcgdGhlIHNhbWUgc2V0IG9mIGZvbGRlcnMgcmVnYXJkbGVzcyBvZiB3aGljaCBjb25maWd1cmF0aW9uIGlzIHNlbGVjdGVkLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgaGFzIHR3byCRcGVyc3BlY3RpdmVzJy4gVGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSBwcm92aWRlcyBmdWxsIGJyb3dzaW5nIGFuZCBhdXRob3JpbmcgY2FwYWJpbGl0aWVzLiBUaGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUgYWxsb3dzIGJyb3dzaW5nIGNvbnRlbnQgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiA8L3A+Ci08cD5Db250ZW50IGlzIGNyZWF0ZWQgYW5kIG1haW50YWluZWQgdXNpbmcgYSBzZXJpZXMgb2YgPHN0cm9uZz48ZW0+ZWRpdG9ycy4gPC9lbT48L3N0cm9uZz48L3A+Ci08aDI+Jm5ic3A7PC9oMj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzEuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDFjODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDE6IENyZWF0ZSBvciBNb2RpZnkgYSBNZXRob2QgQ29udGVudCBQYWNrYWdlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyB0YXNrIGlzIHRvIGNyZWF0ZSBhIG5ldyA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZSA8L3N0cm9uZz4gd2l0aGluIGEgPHN0cm9uZz5NZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IE1ldGhvZCBQbHVnLWluOiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uIAotICAgIDxwPk9yIDwvcD4KLSAgICA8cD5SaWdodC1jbGljayBhbiBleGlzdGluZyBQbHVnLWluIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uIDxicj4KLSAgVGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgaXMgbGF1bmNoZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBOZXcgTWV0aG9kIFBsdWctaW4gd2l6YXJkLCBwcm92aWRlIGEgbmFtZSBmb3IgdGhlIG5ldyBwbHVnLWluLiBJbiB0aGlzIGluc3RhbmNlLCB3ZSdsbCBjYWxsIGl0IE15IFBsdWdpbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IDxzdHJvbmc+UlVQIDwvc3Ryb25nPiBpbiB0aGUgUmVmZXJlbmNlZCBQbHVnLWlucyBwYW5lbCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4uIFRoaXMgbWVhbnMgdGhhdCB5b3VyIHBsdWctaW4gd2lsbCBleHRlbmQgdGhlIFJVUCBwbHVnLWluIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlbGVjdCBjb250ZW50IGZyb20gdGhlIFJVUCBwbHVnLWluIGFzIHlvdSBjcmVhdGUgeW91ciBvd24gcGx1Zy1pbiBjb250ZW50LiA8YnI+Ci0gICAgICA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBQbHVnaW48L3NwYW4+IG5vdyBhcHBlYXJzIGluIHRoZSBMaWJyYXJ5IFZpZXcgb24gdGhlIGxlZnQgc2lkZSBvZiB5b3VyIHNjcmVlbi4gSXQgaXMgbm90IGdyYXllZCBvdXQgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vdCBsb2NrZWQgYW5kIHRoYXQgeW91IGNhbiBlZGl0IGl0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5Eb3VibGUgY2xpY2sgb24gPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgUGx1Z2luPC9zcGFuPiB0byBvcGVuIHRoZSBQbHVnaW4gZWRpdG9yLiBBYm91dCBoYWxmd2F5IGRvd24gdGhlIHBhZ2UgeW91IHdpbGwgc2VlIHRoZSCRTG9jayBQbHVnaW4nIGNoZWNrYm94LiBUaGlzIHdpbGwgYmUgdW5jaGVja2VkIGZvciB5b3VyIG5ldyBwbHVnaW4uIElmIHlvdSBvcGVuIHRoZSBwbHVnaW4gZWRpdG9yIGZvciB0aGUgUlVQIHBsdWdpbiB0aGlzIGZpZWxkIHdpbGwgYmUgY2hlY2tlZC4gPC9saT4KLTwvb2w+Ci08cD5UbyBjcmVhdGUgYSBNZXRob2QgUGFja2FnZTogPC9wPgotPG9sIHN0YXJ0PSI2Ij4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBMaWJyYXJ5IFZpZXcsIGNsaWNrIDxzdHJvbmc+TXkgUGx1Z2luICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzPC9zdHJvbmc+LiAgPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+UmlnaHQtY2xpY2sgPHN0cm9uZz5Db250ZW50IFBhY2thZ2VzPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSGlnaGxpZ2h0IDxzdHJvbmc+TmV3PC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29udGVudCBQYWNrYWdlPC9zdHJvbmc+IHRvIGNyZWF0ZSBhIG5ldyBDb250ZW50IFBhY2thZ2UuIDxicj4KLSAgICAgIFRoZSBDb250ZW50IFBhY2thZ2UgZWRpdG9yIGlzIGRpc3BsYXllZCBhbmQgeW91IGNhbiBuYW1lIHRoZSBwYWNrYWdlIGFuZCBwcm92aWRlIGEgQnJpZWYgRGVzY3JpcHRpb24uIFdlJ2xsIGNhbGwgaXQgk015IENvbnRlbnQgUGFja2FnZZQuIDxicj4KLSAgICAgIDxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFlvdSBjYW5ub3QgY3JlYXRlIGEgbmV3IENvbnRlbnQgUGFja2FnZSBvciBhbnkgb3RoZXIgZWxlbWVudCBpbiBhIGxvY2tlZCBwbHVnaW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPlNhdmUgeW91ciBuZXcgY29udGVudC4gPC9saT4KLTwvb2w+Ci08cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcgZWxlbWVudCBvciBtb2RpZnkgYW4gZXhpc3RpbmcgZWxlbWVudCwgYSCRKicgYXBwZWFycyBpbiB0aGUgdGFiIG5leHQgdG8gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQsIGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBuZWVkcyB0byBiZSBzYXZlZC4gQW4gZWxlbWVudCBjYW4gYmUgc2F2ZWQgYnkgY2xvc2luZyB0aGUgZWRpdG9yLCBjbGlja2luZyB0aGUgZGlzayBpY29uIGluIHRoZSB0b29sYmFyLCBvciBjbGlja2luZyA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlIDwvc3Ryb25nPi4gPC9wPgotPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBub2RlcyBmb3IgdGFza3MsIHJvbGVzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZSB1bmRlciB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZS4gPC9wPgotPGgxPiZuYnNwOzwvaDE+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmNDU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMjogQ3JlYXRlIFdvcmsgUHJvZHVjdDwvYT5zIDwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQuIFNwZWNpZmljYWxseSwgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIDwvc3Ryb25nPm9mIHR5cGUgPHN0cm9uZz4gQXJ0aWZhY3QgPC9zdHJvbmc+LiBZb3UgY2FuIGNyZWF0ZSBhbnkgY29udGVudCBidXQgc29tZSBleGFtcGxlcyBhcmUgcHJvdmlkZWQgaWYgeW91IHdhbnQgdG8gdXNlIHRoZW0uIFRoZXNlIGV4YW1wbGVzIGFyZSByZWZlcnJlZCB0byBpbiBvdGhlciB0dXRvcmlhbHMuIDwvcD4KLTxwPk1ldGhvZCBhbmQgUHJvY2VzcyBlbGVtZW50cyBoYXZlIHR3byBuYW1lcyBpbiBFUEYgQ29tcG9zZXI6IE5hbWUgYW5kIFByZXNlbnRhdGlvbiBOYW1lLiA8L3A+Ci08cD5UaGUgTmFtZSBmaWVsZCBpcyB1c2VkIGFzIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBpdGVtLiBJbiBSVVAsIHdlIGFyZSBjYXJlZnVsIGhvdyB3ZSBuYW1lIHRoZSBmaWxlcyBhbmQgdXNlIGNvbnZlbnRpb25zIHN1Y2ggYXMgbG93ZXIgY2FzZSwgbm8gc3BhY2VzLCBhbmQgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzLiBXZSBkbyB0aGlzIHNvIHRoYXQgdGhlIG5hbWUgaXMgYSB2YWxpZCBmaWxlIG5hbWUgb24gYWxsIG9wZXJhdGluZyBzeXN0ZW1zIGFuZCBmb3IgaW50ZWdyYXRpb24gd2l0aCBzb3VyY2UgY29udHJvbCBzb2Z0d2FyZSBpbiB0aGUgZnV0dXJlLiBUaGUgTmFtZSBpcyBzaG93biBpbiB0aGUgTGlicmFyeSBWaWV3LiA8L3A+Ci08cD5UaGUgUHJlc2VudGF0aW9uIE5hbWUgaXMgdGhlIG5hbWUgdGhhdCBpcyBzaG93biBvbiBwdWJsaXNoZWQgcGFnZXMgYW5kIGl0IGlzIGFsc28gc2hvd24gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldy4gVGhpcyBuYW1lIGNhbiBjb250YWluIGFueSBjaGFyYWN0ZXJzLCBidXQgYnkgY29udmVudGlvbiBpbiBSVVAsIHdlIHVzZSB0aGUgc2FtZSB0ZXh0IGFzIHRoZSBOYW1lLCBqdXN0IHByZXR0aWVyLiA8L3A+Ci08cD5JbiB0aGUgTGlicmFyeSB2aWV3IHlvdSBjYW4gY2hvb3NlIHRvIGRpc3BsYXkgTmFtZXMgb3IgUHJlc2VudGF0aW9uIE5hbWVzLiBZb3UgY2FuIHN3aXRjaCB0aGUgbmFtZSBkaXNwbGF5IHVzaW5nIHRoZSCRU2hvdyBQcmVzZW50YXRpb24gTmFtZXMnIGJ1dHRvbiBpbiB0aGUgTGlicmFyeSB2aWV3IHRvb2xiYXIuIDwvcD4KLTxwPkluIGdlbmVyYWwsIHlvdSBjcmVhdGUgbmV3IGVsZW1lbnRzIGJ5IHJpZ2h0LWNsaWNraW5nIHRoZSBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG5ldyBlbGVtZW50LiBGb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgbmV3IHJvbGUgaW4gYSBjb250ZW50IHBhY2thZ2UsIHJpZ2h0LWNsaWNrIHRoZSA8c3Ryb25nPlJvbGVzIDwvc3Ryb25nPiBmb2xkZXIsIGhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Sb2xlPC9zdHJvbmc+LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gV2l0aGluIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IENvbnRlbnQgUGFja2FnZTwvc3Bhbj4gcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBIaWdobGlnaHQgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5BcnRpZmFjdDwvc3Ryb25nPi4gVGhlIGFydGlmYWN0IGVkaXRvciBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgTmFtZSBmaWVsZCwgdHlwZSB0aGUgbmV3IEFydGlmYWN0IG5hbWUuIEluIHRoaXMgaW5zdGFuY2UsIHdlJ2xsIGNhbGwgaXQgPHN0cm9uZz5teV9ydXBfbmF2bWFwPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gSW4gdGhlIDxzdHJvbmc+UHJlc2VudGF0aW9uIE5hbWU8L3N0cm9uZz4gZmllbGQsIHR5cGU6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPk15IFJVUCBOYXZpZ2F0aW9uIE1hcDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb248L3N0cm9uZz4gZmllbGQsIHR5cGU6Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD5UaGUgTmF2aWdhdGlvbiBNYXAgZXhwcmVzc2VzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHVzZXItaW50ZXJmYWNlIGVsZW1lbnRzIGluIHRoZSBzeXN0ZW0sIGFsb25nIHdpdGggdGhlaXIgcG90ZW50aWFsIG5hdmlnYXRpb24gcGF0aHdheXMuPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPGxpPiBJbiB0aGUgPHN0cm9uZz5QdXJwb3NlPC9zdHJvbmc+IGZpZWxkIHR5cGU6IAotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+VGhlcmUgaXMgb25lIE5hdmlnYXRpb24gTWFwIHBlciBzeXN0ZW0uIFRoZSBwdXJwb3NlIG9mIHRoZSBOYXZpZ2F0aW9uIE1hcCBpcyB0byBleHByZXNzIHRoZSBwcmluY2lwYWwgdXNlciBpbnRlcmZhY2UgcGF0aHMgdGhyb3VnaCB0aGUgc3lzdGVtLiBUaGVzZSBhcmUgdGhlIG1haW4gcGF0aHdheXMgdGhyb3VnaCB0aGUgc2NyZWVucyBvZiB0aGUgc3lzdGVtIGFuZCBub3QgbmVjZXNzYXJpbHkgYWxsIG9mIHRoZSBwb3NzaWJsZSBwYXRocy4gSXQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSByb2FkIG1hcCBvZiB0aGUgc3lzdGVtJ3MgdXNlciBpbnRlcmZhY2UuIFRoZSBOYXZpZ2F0aW9uIE1hcCBtYWtlcyBpdCBlYXN5IHRvIHNlZSBob3cgbWFueSAmcXVvdDtjbGlja3MmcXVvdDsgaXQgd2lsbCB0YWtlIGEgdXNlciB0byBnZXQgdG8gYSBzcGVjaWZpYyBzY3JlZW4uIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgcHJldmlldyB0YWIgdG8gdmlldyB0aGUgbmV3IEFydGlmYWN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSB0aGUgQXJ0aWZhY3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBSZXBlYXQgc3RlcHMgMiB0aHJvdWdoIDkgdXNpbmcgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5BcnRpZmFjdCBOYW1lPC9zdHJvbmc+OiBteV9ydXBfdXNlcl9pbnRlcmZhY2VfcHJvdG90eXBlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlByZXNlbnRhdGlvbiBOYW1lPC9zdHJvbmc+OiBNeSBSVVAgVUkgUHJvdG90eXBlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uPC9zdHJvbmc+OiBBIHVzZXItaW50ZXJmYWNlIHByb3RvdHlwZSBpcyBhbiBleGFtcGxlIG9mIHRoZSB1c2VyIGludGVyZmFjZSB0aGF0IGlzIGJ1aWx0IGluIG9yZGVyIHRvIGV4cGxvcmUgYW5kL29yIHZhbGlkYXRlIHRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ24uIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlB1cnBvc2U6IDwvc3Ryb25nPiBUaGUgZm9sbG93aW5nIHJvbGVzIHVzZSB0aGUgdXNlci1pbnRlcmZhY2UgcHJvdG90eXBlOiA8L3A+Ci0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPHA+LSA8c3Ryb25nPnVzZXItaW50ZXJmYWNlIGRlc2lnbmVyczwvc3Ryb25nPiAsIHRvIGV4cGxvcmUgYW5kL29yIHZhbGlkYXRlIHRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ24gYmVmb3JlIHRvbyBtdWNoIGlzIGludmVzdGVkIGluIGl0IDwvcD4KLSAgICAgICAgPHA+LSA8c3Ryb25nPnJlcXVpcmVtZW50cyBzcGVjaWZpZXJzIDwvc3Ryb25nPiwgdG8gdW5kZXJzdGFuZCB0aGUgdXNlciBpbnRlcmZhY2UgZm9yIGEgVXNlIENhc2UgPC9wPgotICAgICAgICA8cD48c3Ryb25nPi0gc3lzdGVtIGFuYWx5c3RzIDwvc3Ryb25nPiwgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgaW50ZXJmYWNlIGltcGFjdHMgdGhlIGFuYWx5c2lzIG9mIHRoZSBzeXN0ZW0gPC9wPgotICAgICAgICA8cD4tIDxzdHJvbmc+ZGVzaWduZXJzIDwvc3Ryb25nPiwgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgaW50ZXJmYWNlIGltcGFjdHMgYW5kIHdoYXQgaXQgcmVxdWlyZXMgZnJvbSB0aGUgJnF1b3Q7aW5zaWRlJnF1b3Q7IG9mIHRoZSBzeXN0ZW0gPC9wPgotICAgICAgICA8cD4gLSA8c3Ryb25nPm1hbmFnZXJzIDwvc3Ryb25nPiwgdG8gcGxhbiBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyBhY3Rpdml0aWVzIDwvcD4KLSAgICAgIDwvYmxvY2txdW90ZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci08L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzMuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDZlODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDM6IENyZWF0ZSBSb2xlcyA8L2E+PC9oMj4KLTxwPlRvIGNyZWF0ZSBhIFJvbGUgaW4gTXkgQ29udGVudCBQYWNrYWdlOiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+V2l0aGluIE15IENvbnRlbnQgUGFja2FnZSByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5Sb2xlcyA8L3N0cm9uZz4gZm9sZGVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5IaWdobGlnaHQgPHN0cm9uZz5OZXcgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Um9sZTwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIDxzdHJvbmc+TmFtZSBmaWVsZCA8L3N0cm9uZz4gdHlwZTogbXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZTwvc3Ryb25nPiBmaWVsZCB0eXBlOiBNeSBVSSBEZXNpZ25lci4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+IGZpZWxkIHR5cGU6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPlRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ25lciBjb29yZGluYXRlcyB0aGUgZGVzaWduIG9mIHRoZSB1c2VyIGludGVyZmFjZS4gVXNlci1pbnRlcmZhY2UgZGVzaWduZXJzIGFyZSBhbHNvIGludm9sdmVkIGluIGdhdGhlcmluZyB1c2FiaWxpdHkgcmVxdWlyZW1lbnRzIGFuZCBwcm90b3R5cGluZyBjYW5kaWRhdGUgdXNlci1pbnRlcmZhY2UgZGVzaWducyB0byBtZWV0IHRob3NlIHJlcXVpcmVtZW50cy4gPC9wPgotICAgIDxwPjxzdHJvbmc+VGlwIDwvc3Ryb25nPiAtIHRoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cyB0aGF0IHlvdSBjYW4gY3JlYXRlIHRoZSB0ZXh0IGFib3ZlIGZvciB0aGUgbmV3IHJvbGU6IDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyBEaXJlY3RseSwgYnkgdHlwaW5nIGl0IG1hbnVhbGx5IGluIHRoZSBFUEYgQ29tcG9zZXIgZWRpdG9yLiA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgQnkgY29weWluZyBmcm9tIGFub3RoZXIgc2ltaWxhciByb2xlIGFuZCB0aGVuIG1vZGlmeSB1c2luZyB0aGUgZWRpdG9ycyAoZS5nLiBydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIpLiA8L3A+Ci0gICAgJiMxNDk7Jm5ic3A7QnkgY29weWluZyBmcm9tIGFuIGh0bWwgc291cmNlIHN1Y2ggYXMgdGhlIHR1dG9yaWFsIHlvdSBhcmUgcmVhZGluZy4gPC9ibG9ja3F1b3RlPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4gICAgVHJ5IHRoZSA8c3Ryb25nPlJpY2ggVGV4dCBFZGl0b3IgPC9zdHJvbmc+IGZvciBlZGl0aW5nIHRoZSA8c3Ryb25nPk1haW4gRGVzY3JpcHRpb24uIDwvc3Ryb25nPllvdSBjYW4gb3BlbiB0aGUgUmljaCBUZXh0IEVkaXRvciBmb3IgYW55IGl0ZW0gdGhhdCBoYXMgYSCRdHdpc3R5JyA8aW1nIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgc3JjPSJ0dXRvcmlhbF8yX2V4XzNfY2xpcF9pbWFnZTAwMi5naWYiPnN5bWJvbCAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyBUaGUgdXNlci1pbnRlcmZhY2UgZGVzaWduZXIgcm9sZSBpcyBub3QgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZyB0aGUgdXNlciBpbnRlcmZhY2UuIEluc3RlYWQsIHRoaXMgcm9sZSBmb2N1c2VzIG9uIHRoZSBkZXNpZ24gYW5kIHRoZSAmcXVvdDt2aXN1YWwgc2hhcGluZyZxdW90OyBvZiB0aGUgdXNlciBpbnRlcmZhY2UsIGJ5OiA8L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8b2w+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4gLSBDYXB0dXJpbmcgcmVxdWlyZW1lbnRzIG9uIHRoZSB1c2VyIGludGVyZmFjZSwgaW5jbHVkaW5nIHVzYWJpbGl0eSByZXF1aXJlbWVudHMuIDwvcD4KLSAgICAgIDxwPi0gQnVpbGRpbmcgdXNlci1pbnRlcmZhY2UgcHJvdG90eXBlcy48L3A+Ci0gICAgICA8cD4tIEludm9sdmluZyBvdGhlciBzdGFrZWhvbGRlcnMgb2YgdGhlIHVzZXIgaW50ZXJmYWNlLCBzdWNoIGFzIGVuZC11c2VycywgaW4gdXNhYmlsaXR5IHJldmlld3MgYW5kIHVzZSB0ZXN0aW5nIHNlc3Npb25zLiA8L3A+Ci0gICAgICA8cD4tIFJldmlld2luZyBhbmQgcHJvdmlkaW5nIHRoZSBhcHByb3ByaWF0ZSBmZWVkYmFjayBvbiB0aGUgZmluYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVzZXIgaW50ZXJmYWNlLCBhcyBjcmVhdGVkIGJ5IG90aGVyIGRldmVsb3BlcnM7IHRoYXQgaXMsIGRlc2lnbmVycyBhbmQgaW1wbGVtZW50ZXJzLiA8L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L29sPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz4gliBpZiB5b3UgY29weSB0ZXh0IGZyb20gYSBNaWNyb3NvZnQgV29yZCBkb2N1bWVudCB5b3Ugd2lsbCBnZXQgYSBsb3Qgb2YgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBuZWVkZWQgaW4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gWW91IGNhbiBzZWUgdGhpcyBpZiB5b3Ugb3BlbiB0aGUgSFRNTCBlZGl0b3IgaW4gdGhlIFJpY2ggVGV4dCBFZGl0b3IuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+V29ya1Byb2R1Y3RzIDwvc3Ryb25nPiB0YWI7IG1ha2UgdGhpcyBuZXcgcm9sZSByZXNwb25zaWJsZSBmb3IgdGhlIG15X3J1cF9uYXZtYXAgYW5kIG15X3J1cF91c2VyX2ludGVyZmFjZV9wcm90b3R5cGUgYXJ0aWZhY3RzIHRoYXQgeW91IHByZXZpb3VzbHkgY3JlYXRlZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+QWRkIDwvc3Ryb25nPiBidXR0b24uIFRoaXMgZGlzcGxheXMgYSBzZWxlY3Rpb24gZGlhbG9nIHdoZXJlIHlvdSBjYW4gc2VsZWN0IHRoZSBXb3JrIFByb2R1Y3RzIHRvIGFkZC4gPC9wPgotICA8L2xpPgotICA8bGk+T25jZSB5b3UgaGF2ZSBzZWxlY3RlZCB0aGUgYXBwcm9wcmlhdGUgV29yayBQcm9kdWN0cywgY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHdvcmsgcHJvZHVjdHMgeW91IHNlbGVjdGVkIGFwcGVhciBpbiB0aGUgPHN0cm9uZz5SZXNwb25zaWJsZSBmb3I6IDwvc3Ryb25nPiBwYW5lbC4gCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD5Ob3RlIHRoYXQgc2VsZWN0ZWQgZWxlbWVudHMgaW4gYW4gQWRkL1JlbW92ZSBzZWN0aW9uIGRpc3BsYXkgYm90aCB0aGUgZWxlbWVudCBuYW1lIGFuZCB0aGUgkXBhdGgnIHRvIHRoYXQgZWxlbWVudCCWIHRoZSBQbHVnaW4gbmFtZSBhbmQgcGFja2FnZSBuYW1lLiA8L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8bGk+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgcm9sZSBhbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIGVkaXRvci4gPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfM19jbGlwX2ltYWdlMDAyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzNfY2xpcF9pbWFnZTAwMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmZjODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfM19jbGlwX2ltYWdlMDAyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjkyMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA0OiBDcmVhdGUgVGFza3MgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNyZWF0ZSBhIHRhc2sgYW5kIHRoZW4gcmVsYXRlIHRoYXQgdGFzayB0byB0aGUgb3RoZXIgZWxlbWVudHMgeW91IGhhdmUgY3JlYXRlZC4gPC9wPgotPHA+VG8gY3JlYXRlIGEgVGFzayBpbiBNeSBDb250ZW50IFBhY2thZ2U6IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBXaXRoaW4gTXkgQ29udGVudCBQYWNrYWdlIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlRhc2tzIDwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBIaWdobGlnaHQgPHN0cm9uZz5OZXcgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+VGFzazwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+VXNlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSB0YXNrOiAgPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+VGFzazogPC9zdHJvbmc+IG15X2Rlc2lnbl91c2VyX2ludGVyZmFjZSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHJlc2VudGF0aW9uIE5hbWUgPC9zdHJvbmc+OiBNeSBEZXNpZ24gVXNlciBJbnRlcmZhY2UgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uOiA8L3N0cm9uZz4gVG8gcHJvZHVjZSBhIGRlc2lnbiBvZiB0aGUgdXNlciBpbnRlcmZhY2UgdGhhdCBzdXBwb3J0cyB0aGUgcmVhc29uaW5nIGFib3V0LCBhbmQgdGhlIGVuaGFuY2VtZW50IG9mLCBpdHMgdXNhYmlsaXR5LiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+U3RlcHMgPC9zdHJvbmc+KFVzZSBzdGVwcyB0YWIpOjwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPi0gRGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiByZWxhdGVkIHVzZXJzIDwvcD4KLSAgICAtIElkZW50aWZ5IHRoZSBwcmltYXJ5IHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIDwvYmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Sb2xlcyAoUHJpbWFyeSBQZXJmb3JtZXIpOiA8L3N0cm9uZz5teV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdHMgKE1hbmRhdG9yeSBJbnB1dCkgPC9zdHJvbmc+IHJ1cF9zb2Z0d2FyZV9yZXF1aXJlbWVudCAodW5kZXIgcmVxdWlyZW1lbnRzKSA8c3Ryb25nPjwvc3Ryb25nPjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIDwvc3Ryb25nPiAoT3V0cHV0cyk6IG15X3J1cF9uYXZtYXAgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkd1aWRhbmNlOiA8L3N0cm9uZz5yZXByZXNlbnRpbmdfZ3JhcGhpY2FsX3VzZXItaW50ZXJmYWNlcyAodW5kZXIgZ3VpX2Rlc2lnbikgPHN0cm9uZz48L3N0cm9uZz48L3A+Ci0gICYjMTQ5OyZuYnNwOyA8c3Ryb25nPkNhdGVnb3JpZXM6IDwvc3Ryb25nPnJ1cF9hbmFseXNpc19kZXNpZ25fZGlzY2lwbGluZSA8c3Ryb25nPjwvc3Ryb25nPjwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkIHRhc2sgYW5kIHNhdmUgYnkgY2xvc2luZyB0aGUgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ3JlYXRlIGFub3RoZXIgdGFzayB1c2luZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+VGFzazogPC9zdHJvbmc+IG15X3Byb3RvdHlwZV91c2VyX2ludGVyZmFjZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5QcmVzZW50YXRpb24gbmFtZSA8L3N0cm9uZz46IE15IFByb3RvdHlwZSBVc2VyIEludGVyZmFjZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjogPC9zdHJvbmc+IFRvIHByb3RvdHlwZSB0aGUgc3lzdGVtJ3MgdXNlciBpbnRlcmZhY2UgaW4gYW4gYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgdXNlci1pbnRlcmZhY2UgZGVzaWduIGFnYWluc3QgdGhlIGZ1bmN0aW9uYWwgYW5kIHVzYWJpbGl0eSByZXF1aXJlbWVudHMuIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlN0ZXBzOiA8L3N0cm9uZz48L3A+Ci0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPHA+LSZuYnNwOyBEZXNpZ24gdGhlIHVzZXIgaW50ZXJmYWNlIHByb3RvdHlwZSA8L3A+Ci0gICAgICAgIDxwPi0mbmJzcDsgSW1wbGVtZW50IHRoZSB1c2VyIGludGVyZmFjZSBwcm90b3R5cGUgPC9wPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+Um9sZXMgKFByaW1hcnkgUGVyZm9ybWVyKTogPC9zdHJvbmc+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdHMgKE1hbmRhdG9yeSBJbnB1dCkgPC9zdHJvbmc+IG15X3J1cF9uYXZtYXAgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyAoT3V0cHV0cyk6IDwvc3Ryb25nPm15X3J1cF91c2VyX2ludGVyZmFjZV9wcm90b3R5cGUgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+Q2F0ZWdvcmllczogPC9zdHJvbmc+cnVwX2FuYWx5c2lzX2Rlc2lnbl9kaXNjaXBsaW5lIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF81Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhZGVhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF81Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDU6IFdvcmtpbmcgd2l0aCBTdGVwcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gdW5kZXJzdGFuZCB0aGUgU3RlcCBFZGl0b3IgdGhhdCBpcyBwYXJ0IG9mIHRoZSBUYXNrIEVkaXRvci4gPC9wPgotPHA+V2hlbiB5b3UgY3JlYXRlIGEgdGFzaywgeW91IGNhbiBkZWZpbmUgYSBzZXJpZXMgb2Ygc3RlcHMgdGhhdCBkZXRhaWwgaG93IHRvIHBlcmZvcm0gdGhlIHRhc2suIFRoZSBTdGVwIEVkaXRvciBhbGxvd3MgeW91IHRvIGFkZCBuZXcgc3RlcHMsIGNoYW5nZSB0aGUgc2VxdWVuY2Ugb2Ygc3RlcHMgYW5kIHRvIGRlbGV0ZSBzdGVwcy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+T3BlbiB0aGUgbXlfZGVzaWduX3VzZXJfaW50ZXJmYWNlIHRhc2sgb3IgY3JlYXRlIGEgbmV3IHRhc2suIENsaWNrIG9uIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2xpPgotICA8bGk+Q3JlYXRlIGEgbmV3IHN0ZXA6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsgRW50ZXIgYSBuYW1lIGZvciB0aGUgc3RlcCBpbiB0aGUgkVN0ZXBzJyBib3guIDwvcD4KLSAgICA8cD4mIzE0OTsgRW50ZXIgYSA8c3Ryb25nPkRlc2NyaXB0aW9uIDwvc3Ryb25nPiCWIHlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIGZvciB0aGlzLiA8L3A+Ci0gICAgPHA+JiMxNDk7IENsaWNrIHRoZSA8c3Ryb25nPkFkZCA8L3N0cm9uZz4gYnV0dG9uLiA8L3A+Ci0gICAgPHA+JiMxNDk7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+ICAgIFJlbW92ZSBhIHN0ZXAgOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsgUmV0dXJuIHRvIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gPC9wPgotICAgIDxwPiYjMTQ5OyBDbGljayB0aGUgc3RlcCB0byByZW1vdmUgaW4gdGhlIFN0ZXBzIHBhbmVsLiA8L3A+Ci0gICAgPHA+JiMxNDk7IENsaWNrIHRoZSA8c3Ryb25nPkRlbGV0ZSA8L3N0cm9uZz4gYnV0dG9uLiA8L3A+Ci0gICAgPHA+JiMxNDk7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+ICAgIE1vdmUgYSBzdGVwIHVwIHRoZSBsaXN0OiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgUmV0dXJuIHRvIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgc3RlcCB5b3Ugd2FudCB0byBtb3ZlIHVwLjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ2xpY2sgdGhlIDxzdHJvbmc+VXAgPC9zdHJvbmc+IGJ1dHRvbi48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+TW92ZSBhIHN0ZXAgZG93biB0aGUgbGlzdCA6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgUmV0dXJuIHRvIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgc3RlcCB5b3Ugd2FudCB0byBtb3ZlIGRvd24uPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgPHN0cm9uZz5Eb3duIDwvc3Ryb25nPiBidXR0b24uPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBTZWUgdGhlIHJlc3VsdHMgb24gdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF82Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMmRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF82Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDY6IENyZWF0ZSBHdWlkYW5jZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIG1ldGhvZCA8c3Ryb25nPkd1aWRhbmNlIDwvc3Ryb25nPiBlbGVtZW50cy4gVGhlcmUgaXMgYSByYW5nZSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgZ3VpZGFuY2UgdGhhdCBjYW4gYmUgY3JlYXRlZC4gRm9yIHRoaXMgdGFzayB3ZSB3aWxsIHNpbXBseSBjcmVhdGUgYSByZXByZXNlbnRhdGl2ZSBndWlkYW5jZSBlbGVtZW50LCBhIGNoZWNrbGlzdC4gT25jZSB5b3UgaGF2ZSBkb25lIHRoaXMsIHRyeSBhdXRob3JpbmcgYWRkaXRpb25hbCBHdWlkYW5jZSB0eXBlcy4gPC9wPgotPHA+SW4gYSBjaGVja2xpc3QsIENoZWNrIEl0ZW1zIGFyZSBjcmVhdGVkIGluIHRoZSBzYW1lIHdheSBhcyBTdGVwcyBpbiBhIHRhc2sgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIDxzdHJvbmc+Q2hlY2sgSXRlbXMgPC9zdHJvbmc+IHRhYiBpbiB0aGUgPHN0cm9uZz5DaGVja2xpc3QgRWRpdG9yPC9zdHJvbmc+LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5XaXRoaW4gPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgQ29udGVudCBQYWNrYWdlPC9zcGFuPiByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5HdWlkYW5jZSA8L3N0cm9uZz4gZm9sZGVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5IaWdobGlnaHQgPHN0cm9uZz5OZXcgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q2hlY2tsaXN0PC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5OYW1lIHRoZSBndWlkYW5jZSwgbXlfY3JlYXRlX3BoeXNpY2FsX2FwcGVhcmFuY2VfY2hlY2tsaXN0LCBhbmQgcHJvdmlkZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIE15IENyZWF0ZSBQaHlzaWNhbCBBcHBlYXJhbmNlIENoZWNrbGlzdC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEFkZCB0aGUgZm9sbG93aW5nIGNoZWNrIGl0ZW1zOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ3JlYXRlIGJyYW5kaW5nIHNwZWNpZmljYXRpb25zIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgRGVmaW5lIHBoeXNpY2FsIHNwZWNpZmljYXRpb25zIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+QWRkIHRoZSBjaGVja2xpc3QgdG8gdGhlIDxzdHJvbmc+IG15X3Byb3RvdHlwZV91c2VyX2ludGVyZmFjZSA8L3N0cm9uZz50YXNrIGFuZCB0aGVuIGxvb2sgZm9yIGl0IG9uIHRoZSBwcmV2aWV3IHBhZ2UuIDwvbGk+Ci08L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzcuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDQ2MGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNzogTWFuYWdlIEd1aWRhbmNlIDwvYT48L2gyPgotPHA+R3VpZGFuY2UgY2FuIGJlIGF0dGFjaGVkIHRvIGFueSBDb3JlIE1ldGhvZCBDb250ZW50IG9yIFByb2Nlc3MgRWxlbWVudC4gR3VpZGFuY2UgY2FuIGV2ZW4gYmUgYXR0YWNoZWQgdG8gYSBHdWlkYW5jZSBlbGVtZW50LiA8L3A+Ci08cD5UaGUgZ29hbCBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNhcnJ5IG91dCBzb21lIHNpbXBsZSBndWlkYW5jZSBtYW5hZ2VtZW50IHRhc2tzIChpLmUuLCBhZGRpbmcgYW5kIHJlbW92aW5nIGd1aWRhbmNlLik8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5OYXZpZ2F0ZSB0byB0aGUgYXJ0aWZhY3QgPHN0cm9uZz5teV9ydXBfbmF2bWFwIDwvc3Ryb25nPiB0aGF0IHlvdSBjcmVhdGVkIGluIGV4ZXJjaXNlIDIgaW4gdGhpcyB0dXRvcmlhbC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEFkZCB0aGUgQ29uY2VwdCBQYXBlciA8c3Ryb25nPnByb2Nlc3NfdmlldyA8L3N0cm9uZz4gZnJvbSB0aGUgUlVQIHBsdWctaW4uIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPlRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZSBTZWxlY3QgRGlhbG9nIGlzIHJlc3RyaWN0ZWQgdG8ganVzdCB0aG9zZSBpdGVtcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIGFkZGVkLiBUaGUgbGlzdCBjYW4gYmUgbG9uZyB0aG91Z2guIFlvdSBjYW4gZW50ZXIgYSBzZWFyY2ggc3RyaW5nLCBzdWNoIGFzIJFwcm8nIGluIHRoZSCRTmFtZSBwYXR0ZXJucycgYm94IHRvIGZpbHRlciB0aGUgaXRlbXMgdGhhdCBhcmUgZGlzcGxheWVkLiBOb3RlIHRoYXQgeW91IGNhbiB1c2UgdGhlIENvbGxhcHNlIEFsbCBhbmQgRXhwYW5kIEFsbCBidXR0b25zIG9uIHRoaXMgZGlhbG9nIHRvIGNoYW5nZSB0aGUgd2F5IHRoZSB0cmVlIGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5BZGQgPHN0cm9uZz5teV9jcmVhdGVfcGh5c2ljYWxfYXBwZWFyYW5jZV9jaGVja2xpc3QgPC9zdHJvbmc+IENoZWNrbGlzdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiIHRvIHZpZXcgeW91ciB3b3JrLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5SZW1vdmUgdGhlIENvbmNlcHQgUGFwZXIgcHJvY2Vzc192aWV3LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB5b3VyIHdvcmsuIDwvbGk+Ci08L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzguaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjM2OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA4OiBDcmVhdGUgTmV3IFN0YW5kYXJkIENhdGVnb3J5IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byB1bmRlcnN0YW5kIGFuZCB1c2UgPHN0cm9uZz5TdGFuZGFyZCBDYXRlZ29yaWVzLiA8L3N0cm9uZz5JbiBwcmFjdGljZSwgdGhpcyB3aWxsIG5vdCBiZSBkb25lIHZlcnkgb2Z0ZW4sIGFzIFN0YW5kYXJkIENhdGVnb3JpZXMgdGVuZCB0byBiZSByZWxhdGl2ZWx5IHN0YWJsZS4gQWxzbywgaWYgeW91IGFyZSBjcmVhdGluZyBhIHBsdWctaW4gdGhhdCBleHRlbmRzIFJVUCwgeW91IHNob3VsZCBhdHRlbXB0IHRvIHVzZSB0aGUgUlVQIFN0YW5kYXJkIENhdGVnb3JpZXMgYmVmb3JlIGNyZWF0aW5nIG5ldyBvbmVzLiA8L3A+Ci08cD48c3Ryb25nPlN0YW5kYXJkIENhdGVnb3JpZXMgPC9zdHJvbmc+IHByb3ZpZGUgYSBtZWFucyB0byBjYXRlZ29yaXplIGNvcmUgbWV0aG9kIGNvbnRlbnQgaW4gbGluZSB3aXRoIGJlc3QgcHJhY3RpY2VzIGZvciBjcmVhdGluZyBzdHJ1Y3R1cmVkIG1ldGhvZHMuIEluIG9yZGVyIHRvIGVuY291cmFnZSBnb29kIG1ldGhvZCBzdHJ1Y3R1cmUgd2UgcHJvdmlkZSBzdGFuZGFyZCBjYXRlZ29yaWVzIGZvciBncm91cGluZyA8c3Ryb25nPlRhc2tzIDwvc3Ryb25nPmludG8gPHN0cm9uZz48ZW0+RGlzY2lwbGluZXMgPC9lbT48L3N0cm9uZz4sIDxzdHJvbmc+V29yayBQcm9kdWN0cyA8L3N0cm9uZz4gaW50byA8c3Ryb25nPjxlbT5Eb21haW5zIDwvZW0+PC9zdHJvbmc+LCA8c3Ryb25nPlJvbGVzIDwvc3Ryb25nPiBpbnRvIDxzdHJvbmc+PGVtPlJvbGUgU2V0cyA8L2VtPjwvc3Ryb25nPiwgYW5kIDxzdHJvbmc+VG9vbC1NZW50b3JzIDwvc3Ryb25nPiBpbnRvIDxzdHJvbmc+PGVtPlRvb2xzIDwvZW0+PC9zdHJvbmc+LiBVbmxpa2UgPHN0cm9uZz48ZW0+Q3VzdG9tIDwvZW0+IENhdGVnb3JpZXMgPC9zdHJvbmc+LCA8c3Ryb25nPlN0YW5kYXJkIENhdGVnb3JpZXMgPC9zdHJvbmc+IGJ5IGRlZmluaXRpb24gYXJlIGxpbmtlZCB3aXRoIGEgc3BlY2lmaWMgbWV0aG9kIGNvbnRlbnQgdHlwZSCWIGUuZy4gUm9sZSBTZXRzIHdpdGggUm9sZXMsIERpc2NpcGxpbmVzIHdpdGggVGFza3MsIGFuZCBEb21haW5zIHdpdGggV29yayBQcm9kdWN0cy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IFN0YW5kYXJkIENhdGVnb3JpZXM8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Sb2xlIFNldCA8L3N0cm9uZz5uYW1lZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9kZXNpZ248L3NwYW4+IHdpdGggYSBwcmVzZW50YXRpb24gbmFtZSBvZiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBEZXNpZ248L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQWRkIHRoZSByb2xlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4gdG8gdGhlPHNwYW4gY2xhc3M9InN0eWxlMSI+IG15X2Rlc2lnbjwvc3Bhbj4gPHN0cm9uZz5Sb2xlIFNldDwvc3Ryb25nPi4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+VGhlcmUgYXJlIHR3byB3YXlzIHlvdSBjYW4gZG8gdGhpczogPC9wPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgSW4gdGhlIFN0YW5kYXJkIENhdGVnb3J5IGVkaXRvciBmb3IgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZGVzaWduPC9zcGFuPiwgb3BlbiB0aGUgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiB0YWIsIGFuZCBhZGQgdGhlIHJvbGUgdG8gdGhlIHJvbGVzZXQuIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDtJbiB0aGUgUm9sZSBlZGl0b3IgZm9yIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4sIG9wZW4gdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIgYW5kIGFkZCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZGVzaWduPC9zcGFuPiBjYXRlZ29yeSBhcyBhIFNlbGVjdGVkIFJvbGVzZXQuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotPC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzkuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzg5MzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA5OiA8L2E+QWRkaW5nIFlvdXIgUGx1Zy1pbiB0byB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IDwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGxlYXJuIGhvdyB0byBpbmNsdWRlIHlvdXIgcGx1Zy1pbiBpbiBhIGNvbmZpZ3VyYXRpb24uIDwvcD4KLTxwPkJlZm9yZSB5b3VyIG5ldyBlbGVtZW50cyBjYW4gYmUgc2VlbiBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LCB5b3UgbmVlZCB0byBmaXJzdCBhZGQgeW91ciBuZXcgcGx1Zy1pbiB0byBhIGNvbmZpZ3VyYXRpb24uIFdlJ2xsIGFkZCB0aGUgbmV3IHBsdWctaW4gdG8gdGhlIENvbmZpZyBmb3IgUlVQIGNvbmZpZ3VyYXRpb24gYW5kIHNlZSB0aGUgcmVzdWx0cyBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+cGVyc3BlY3RpdmUgYW5kIGluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldyA8L3N0cm9uZz50cnkgdG8gZmluZCB5b3VyIG5ldyBjb250ZW50LiBGb3IgZXhhbXBsZSBsb29rIGZvciBNeSBEZXNpZ24gUm9sZXNldC4gWW91IHNob3VsZG4ndCBzZWUgaXQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPnBlcnNwZWN0aXZlIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29uZmlndXJhdGlvbnMgPC9zdHJvbmc+IGF0IHRoZSBib3R0b20gb2YgdGhlIHRyZWUgZGlzcGxheS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE1ha2UgYSBjb3B5IG9mIHRoZSA8c3Ryb25nPlJVUCBmb3IgU21hbGwgUHJvamVjdHMgPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24uIFJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlJVUCBmb3IgU21hbGwgUHJvamVjdHMgPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24gYW5kIHNlbGVjdCA8c3Ryb25nPkNvcHkgPC9zdHJvbmc+LiBUaGVuIHJpZ2h0LWNsaWNrIG9uIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIgYW5kIGNsaWNrIDxzdHJvbmc+UGFzdGUgPC9zdHJvbmc+LiBOYW1lIHRoZSBuZXcgY29uZmlndXJhdGlvbiA8c3Ryb25nPk15IFJVUCBmb3IgU21hbGwgUHJvamVjdHMuIDwvc3Ryb25nPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEb3VibGUtY2xpY2sgb24gdGhlIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gY29uZmlndXJhdGlvbiB0byBvcGVuIHRoZSBDb25maWd1cmF0aW9uIEVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENsaWNrIG9uIHRoZSA8c3Ryb25nPlBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCA8c3Ryb25nPk15IFBsdWdpbiA8L3N0cm9uZz4gdG8gdGhlIGNvbmZpZ3VyYXRpb24gYnkgY2hlY2tpbmcgdGhlIGJveCBuZXh0IHRvIGl0IGluIHRoZSBDb25maWd1cmF0aW9uIENvbXBvbmVudHMgZmllbGQuIElmIHlvdSBleHBhbmQgPHN0cm9uZz5NeSBQbHVnaW4gPC9zdHJvbmc+IHlvdSB3aWxsIHNlZSB0aGF0IHRoZSBmdWxsIGNvbnRlbnRzIG9mIHRoZSBwbHVnLWluIGhhdmUgYmVlbiBzZWxlY3RlZC4gCi0gICAgICBZb3UgbWF5IHNlZSBzb21lIGVycm9ycyBpbiB0aGUgTGlicmFyeSBFcnJvciBMb2cgdmlldy4gWW91IGNhbiBjbGljayB0aHJvdWdoIHRoZXNlIGVycm9ycyBvciBpZ25vcmUgdGhlbSBmb3Igbm93LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xvc2UgdGhlIGVkaXRvciBhbmQgc2F2ZSB0aGUgY2hhbmdlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENoYW5nZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz5pbiB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gYm94IGluIHRoZSBFUEYgQ29tcG9zZXIgdG9vbGJhciwganVzdCBiZWxvdyB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUgYW5kIG5vdyBsb29rIGZvciB5b3VyIGNvbnRlbnQgaW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LiBZb3Ugc2hvdWxkIG5vdyBzZWUgPHN0cm9uZz5NeSBEZXNpZ24gUm9sZXNldCA8L3N0cm9uZz4uIFlvdSBzaG91bGQgYWxzbyBzZWUgeW91ciBuZXcgV29yayBQcm9kdWN0cyBpbiB0aGUgVW5jYXRlZ29yaXplZCBmb2xkZXIgdW5kZXIgRG9tYWlucy4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4mbmJzcDs8L2Jsb2NrcXVvdGU+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfaW50cm8uaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2VjYTg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT48YT5UdXRvcmlhbDogQ3JlYXRlIE1ldGhvZCBDb250ZW50IDwvYT48L2gxPgotPGgyPjxhPkludHJvZHVjdGlvbiA8L2E+PC9oMj4KLTxwPkVQRiBDb21wb3NlciBzZXBhcmF0ZXMgcmV1c2FibGUgPHN0cm9uZz5tZXRob2QgY29udGVudCA8L3N0cm9uZz4gZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gPHN0cm9uZz5wcm9jZXNzZXMgPC9zdHJvbmc+LiBUaGUgcHJpbWFyeSBtZXRob2QgY29udGVudCBlbGVtZW50cyBhcmUgPHN0cm9uZz50YXNrcyA8L3N0cm9uZz4sIDxzdHJvbmc+cm9sZXMgPC9zdHJvbmc+LCA8c3Ryb25nPndvcmsgcHJvZHVjdHMgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPi4gQSBQcm9jZXNzIEVuZ2luZWVyIHVzZXMgRVBGIENvbXBvc2VyIHRvIGF1dGhvciB0aGVzZSBlbGVtZW50cywgZGVmaW5lIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlbSwgYW5kIHRvIGNhdGVnb3JpemUgdGhlbS4gTWV0aG9kIGNvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YgPHN0cm9uZz5NZXRob2QgUGx1Zy1pbnMgPC9zdHJvbmc+IHRoYXQgYWxsb3dzIHRoZSBleHRlbnNpb24gb3IgY3VzdG9taXphdGlvbiBvZiBiYXNlIGxpYnJhcnkgY29udGVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIHRoYXQgYmFzZSBjb250ZW50LiBXaGVuIHdlIHNoaXAgYSBsaWJyYXJ5IHdpdGggRVBGIENvbXBvc2VyIHRoZSBsaWJyYXJ5IGlzIHByb3RlY3RlZCBmcm9tIGRpcmVjdCBtb2RpZmljYXRpb24uIFRoZSBSVVAgcGx1Z2lucyBhcmUgZ3JheWVkIG91dCBpbiB0aGUgTGlicmFyeSB2aWV3IGluZGljYXRpbmcgdGhhdCB0aGV5IGFyZSBsb2NrZWQuIDwvcD4KLTxwPjxzdHJvbmc+WW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBjb250ZW50IGluIGEgTWV0aG9kIFBsdWctaW4gdGhhdCB5b3UgcHJvZHVjZS4gPC9zdHJvbmc+VGhpcyBzZXBhcmF0ZXMgeW91ciBjb250ZW50IGZyb20gdGhlIG9yaWdpbmFsIE9wZW5VUCBjb250ZW50IGFuZCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IHJlbGVhc2VzIG9mIHRoZSBPcGVuVVAgbGlicmFyeSB3aXRob3V0IGFmZmVjdGluZyB0aGUgY29udGVudCB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgaW4geW91ciBvd24gcGx1Zy1pbnMuIDwvcD4KLTxwPkluIHRoaXMgdHV0b3JpYWwgeW91IHdpbGwgdXNlIHNldmVyYWwgkWVkaXRvcnMnLiBFYWNoIGVkaXRvciBvcGVucyBpbiBpdHMgb3duIHRhYiBpbiB0aGUgY29udGVudCBkaXNwbGF5IHNlY3Rpb24gb2YgdGhlIHNjcmVlbi4gSXQgaXMgZ29vZCBwcmFjdGljZSB0byBjbG9zZSBhbiBlZGl0b3Igd2hlbiB5b3UgaGF2ZSBmaW5pc2hlZCB3aXRoIGl0LiBUaGlzIGVuc3VyZXMgdGhhdCB5b3Ugc2F2ZSBhbnkgY2hhbmdlcyB5b3UgbWFrZS4gPC9wPgotPHA+SWYgeW91IGRvIGhhdmUgc2V2ZXJhbCBlZGl0b3JzIG9wZW4sIHlvdSBtYXkgd2FudCB0byB0dXJuIG9uIHRoZSCRTGluayB3aXRoIEVkaXRvcicgZmVhdHVyZSBieSBjbGlja2luZyBvbiB0aGUgTGluayB3aXRoIEVkaXRvciBidXR0b24gaW4gdGhlIExpYnJhcnkgdmlldyB0b29sYmFyLiBJZiB0aGlzIGlzIHNlbGVjdGVkLCB3aGVuIHlvdSBzd2l0Y2ggYmV0d2VlbiBlZGl0b3JzLCB0aGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCBlZGl0b3IgaXMgaGlnaGxpZ2h0ZWQgaW4gdGhlIExpYnJhcnkgdmlldy4gPC9wPgotPHA+VGhlIGZvbGxvd2luZyBleGVyY2lzZXMgdGFrZSB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gb2Ygk2NvcmUgbWV0aG9kIGNvbnRlbnSULiA8L3A+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OWIwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAxOiBBZGRpbmcgdG8gYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSByb2xlIHVzaW5nIENvbnRyaWJ1dGlvbiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgcm9sZSBpbiBSVVAgdXNpbmcgkWNvbnRyaWJ1dGlvbicuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5UaGlzIGV4ZXJjaXNlIGFkZHMgY29udGVudCB0byB0aGUgTXkgUGx1Z2luIHBsdWdpbi4gSWYgeW91IGhhdmUgbm90IGNhcnJpZWQgb3V0IHRoZSCRQ3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQgdHV0b3JpYWwsIGNyZWF0ZSBpdCBub3cuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZSBpbiB0aGUgTXkgUGx1Z2luIHBsdWctaW4gY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGlvbjwvc3Bhbj4gVGVzdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIG5ldyBDb250cmlidXRpb24gVGVzdCBjb250ZW50IHBhY2thZ2UsIGNyZWF0ZSBhIG5ldyBSb2xlOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb250cmlidXRpbmdfdWlfZGVzaWduZXI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5QYWdlIGRvd24gdGhlIERlc2NyaXB0aW9uIHRhYiB0byB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIGFuZCB0aGVuLCBpbiB0aGUgPHN0cm9uZz5WYXJpYWJpbGl0eSBUeXBlIDwvc3Ryb25nPiwgc2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXMgPC9zdHJvbmc+IGFuZCBjaG9vc2UgdGhlIGJhc2Ugcm9sZTogPHN0cm9uZz5ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIgPC9zdHJvbmc+LiBZb3Ugd2lsbCBmaW5kIHRoaXMgaW4gPHN0cm9uZz5SVVAgJmd0OyBEZXNpZ24gJmd0OyBHVUkgRGVzaWduPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ29tcGxldGUgdGhlIGZvbGxvd2luZzogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEFkZCBCcmllZiBEZXNjcmlwdGlvbjogQ29udHJpYnV0aW5nIGJyaWVmIGRlc2NyaXB0aW9uIHRleHQgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBBZGQgTWFpbiBEZXNjcmlwdGlvbiA6IENvbnRyaWJ1dGluZyBtYWluIGRlc2NyaXB0aW9uIHRleHQgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBTYXZlIChieSBjbG9zaW5nIHRoZSByb2xlIGVkaXRvcikuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q3JlYXRlIGEgbmV3IENvbmZpZ3VyYXRpb24gYnkgc2VsZWN0aW5nIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zIDwvc3Ryb25nPiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgVmlldyB0cmVlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5SaWdodCBjbGljayB0aGUgZm9sZGVyIHRvIGNyZWF0ZSBuZXcgY29uZmlndXJhdGlvbiBhbmQgdGhlbiBuYW1lIHRoZSBjb25maWd1cmF0aW9uIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlZhcmlhYmlsaXR5IENvbmZpZ3VyYXRpb248L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IHRoZSBSVVAgYmFzZSBhbmQgeW91ciBwbHVnLWluIChNeSBQbHVnaW4pIGJ5IG1hcmtpbmcgdGhlIGNoZWNrYm94ZXMuIFNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gKGNsb3NlIHRoZSBjb25maWd1cmF0aW9uIHRhYikuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNldCCTY3VycmVudCBjb25maWd1cmF0aW9ulCCWIGxvY2F0ZWQgdW5kZXIgbWFpbiBtZW51IGJhciBhcyCTVmFyaWFiaWxpdHkgQ29uZmlndXJhIHRpb26ULiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gcGVyc3BlY3RpdmUgYW5kIHRoZW4gb3BlbiB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIgcm9sZS4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFlvdSBzaG91bGQgc2VlIHRoZSB0ZXh0IHRoYXQgeW91IGluY2x1ZGVkIGluIHRoZSBDb250cmlidXRpbmcgcm9sZSBkaXNwbGF5ZWQgaW4gdGhlIFVzZXItSW50ZXJmYWNlIERlc2lnbmVyLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IHJlc29sdmVzIHRoZSB2YXJpYWJpbGl0eSByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBwbHVnLWlucyBpbiBhIGNvbmZpZ3VyYXRpb24gYW5kIHNob3dzIHRoZSByZXN1bHRzIGFzIHRoZXkgd2lsbCBiZSBwdWJsaXNoZWQgaW4gYSBwdWJsaXNoZWQgd2ViIHNpdGUuIDwvcD4KLTwvYmxvY2txdW90ZT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8yLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzc5NzNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDI6IEFkZGluZyB0byBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHdvcmsgcHJvZHVjdCB1c2luZyA8dT5Db250cmlidXRpb248L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSA8c3Ryb25nPldvcmsgUHJvZHVjdCA8L3N0cm9uZz4gKDxzdHJvbmc+QXJ0aWZhY3Q8L3N0cm9uZz4pIGluIFJVUCB1c2luZyCRY29udHJpYnV0aW9uJy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBXaXRoaW4gdGhlIENvbnRyaWJ1dGlvbiBUZXN0IHBhY2thZ2UgY3JlYXRlIGEgbmV3IGFydGlmYWN0IGNhbGxlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb250cmlidXRpbmdfbmF2bWFwPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24sIE1haW4gRGVzY3JpcHRpb248L3N0cm9uZz4sIDxzdHJvbmc+UHVycG9zZTwvc3Ryb25nPiwgZXRjLiwgOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Db250cmlidXRpbmcgQnJpZWYgRGVzY3JpcHRpb24sIENvbnRyaWJ1dGluZyBNYWluIERlc2NyaXB0aW9uLCBhbmQgQ29udHJpYnV0aW5nIFB1cnBvc2U8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gPHN0cm9uZz5WYXJpYWJpbGl0eSBSZWxhdGlvbnNoaXAgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPkNvbnRyaWJ1dGVzIDwvc3Ryb25nPiwgYW5kIGZvciA8c3Ryb25nPmJhc2UgYXJ0aWZhY3QgPC9zdHJvbmc+IHNlbGVjdCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfbmF2bWFwPC9zcGFuPi4gU2F2ZSBieSBjbG9zaW5nIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZSBhbmQgdmlldyB0aGUgTmF2aWdhdGlvbiBNYXAgYXJ0aWZhY3QgaW4gdGhlIDxzdHJvbmc+QW5hbHlzaXMgYW5kIERlc2lnbiBEb21haW4gPC9zdHJvbmc+IGZvbGRlciBpbiA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldy4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+IFlvdSBzaG91bGQgc2VlIHRoZSB0ZXh0IHRoYXQgeW91IGluY2x1ZGVkIGluIHRoZSBDb250cmlidXRpbmcgcm9sZSBkaXNwbGF5ZWQgaW4gdGhlIFVzZXItSW50ZXJmYWNlIERlc2lnbmVyLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPiZuYnNwOzwvYmxvY2txdW90ZT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8zLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRkOTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDM6IEFkZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHRhc2sgdXNpbmcgPHU+Q29udHJpYnV0aW9uPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgPHN0cm9uZz5UYXNrIDwvc3Ryb25nPiBpbiBSVVAgdXNpbmcgkWNvbnRyaWJ1dGlvbicuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5XaXRoaW4gdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGlvbiBUZXN0IDwvc3Bhbj5wYWNrYWdlIGNyZWF0ZSBhIG5ldyA8c3Ryb25nPlRhc2s8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRyaWJ1dGluZ19kZXNpZ25fdXNlcl9pbnRlcmZhY2U8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiwgTWFpbiBkZXNjcmlwdGlvbiA8L3N0cm9uZz4sIDxzdHJvbmc+UHVycG9zZTwvc3Ryb25nPiwgZXRjLiw6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGluZyBCcmllZiBEZXNjcmlwdGlvbiB0ZXh0LCBDb250cmlidXRpbmcgTWFpbiBEZXNjcmlwdGlvbiB0ZXh0LCBhbmQgQ29udHJpYnV0aW5nIFB1cnBvc2UgdGV4dC4gPC9zcGFuPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdHdvIG5ldyBzdGVwczogPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW5nIFN0ZXAgMSA8L3NwYW4+YW5kPHNwYW4gY2xhc3M9InN0eWxlMSI+IENvbnRyaWJ1dGluZyBTdGVwIDI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gPHN0cm9uZz5WYXJpYWJpbGl0eSBSZWxhdGlvbnNoaXAgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPkNvbnRyaWJ1dGVzPC9zdHJvbmc+LCBhbmQgZm9yIGJhc2UgPHN0cm9uZz50YXNrIDwvc3Ryb25nPiBzZWxlY3QsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPmRlc2lnbl91c2VyX2ludGVyZmFjZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBHbyBiYWNrIHRvIHRoZSA8c3Ryb25nPlN0ZXBzIDwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrIHRoZSA8c3Ryb25nPk9yZGVyIDwvc3Ryb25nPiBidXR0b24uIFlvdSBjYW4gbm93IGluc2VydCB5b3VyIG5ldyBzdGVwcyBpbnRvIHRoZSBvcmlnaW5hbCBzdGVwcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2F2ZSB0aGUgbmV3IHRhc2sgYnkgY2xvc2luZyB0aGUgdGFzayBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlIGFuZCB2aWV3IHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5EZXNpZ24gdGhlIFVzZXIgSW50ZXJmYWNlPC9zcGFuPiB0YXNrIGluIHRoZSA8c3Ryb25nPkRpc2NpcGxpbmVzIDwvc3Ryb25nPiBmb2xkZXIgaW4gPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXcgPC9zdHJvbmc+LiBZb3Ugd2lsbCBmaW5kIGl0IHVuZGVyIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5BbmFseXNpc18mYW1wOyBEZXNpZ248L3NwYW4+IGRpc2NpcGxpbmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBMb29rIGF0IHRoZSBkZXNjcmlwdGlvbnMgYW5kIHRoZSBzdGVwcyB0byBzZWUgaG93IHlvdXIgbmV3IG1hdGVyaWFsIHdhcyBjb250cmlidXRlZC4gWW91IHNob3VsZCBzZWUgdGhlIHRleHQgdGhhdCB5b3UgaW5jbHVkZWQgaW4gdGhlIENvbnRyaWJ1dGluZyByb2xlIGRpc3BsYXllZCBpbiB0aGUgVXNlciBJbnRlcmZhY2UgdGFzay4gPC9wPgotICA8L2xpPgotICA8bGk+IFlvdSBjYW4gYWxzbyB0cnkgc3BlY2lmeWluZyBhZGRpdGlvbmFsIDxzdHJvbmc+YXJ0aWZhY3RzIDwvc3Ryb25nPiwgPHN0cm9uZz5ndWlkYW5jZSA8L3N0cm9uZz4sIDxzdHJvbmc+YWRkaXRpb25hbCBwZXJmb3JtZXIgcm9sZXM8L3N0cm9uZz4sIGV0Yy4sIGluIHRoZSBjb250cmlidXRpbmcgdGFzayAoaW4gQXV0aG9yaW5nIHBlcnNwZWN0aXZlKSBhbmQgdGhlbiB2aWV3IHRoZSByZXN1bHQgaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyB0byBzZWUgdGhlIGJlaGF2aW9yLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWNlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgcm9sZSB1c2luZyA8dT5FeHRlbmRzPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGJhc2UgbWV0aG9kIGNvbnRlbnQgdmlhIGV4dGVuZHMgdmFyaWFiaWxpdHkuIEV4dGVuZHMgdmFyaWFiaWxpdHkgd29ya3MgZGlmZmVyZW50bHkgdGhhbiBDb250cmlidXRlcyB2YXJpYWJpbGl0eSBpbiB0aGF0IHRoZSBtZXRob2QgY29udGVudCBlbGVtZW50IHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSBtZXRob2QgZWxlbWVudCBpbmhlcml0cyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZXh0ZW5kZWQgYmFzZSBlbGVtZW50LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Db250ZW50IFBhY2thZ2UgPC9zdHJvbmc+IGluIHRoZSBNeSBQbHVnaW4gUGx1Zy1pbiBjYWxsZWQgRXh0ZW5kcyBUZXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+Um9sZSA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfdWlfZGVzaWduZXIsPC9zcGFuPiB3aXRoIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBSVVAgVUkgRGVzaWduZXI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIFZhcmlhYmlsaXR5IFR5cGUgc2VsZWN0IDxzdHJvbmc+RXh0ZW5kcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSByb2xlOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjwvc3Ryb25nPjogRXh0ZW5kcyBSb2xlIEJyaWVmIERlc2NyaXB0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5NYWluIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogRXh0ZW5kcyBSb2xlIE1haW4gRGVzY3JpcHRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSBuZXcgcm9sZSBieSBjbG9zaW5nIHRoZSByb2xlIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+IFVwZGF0ZSB0aGUgVmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbiB0byBpbmNsdWRlIHRoZSBuZXcgY29udGVudCBwYWNrYWdlLiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4gJiMxNDk7Jm5ic3A7T3BlbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+VmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbjwvc3Bhbj4gYW5kIGV4cGFuZCA8c3Ryb25nPk15IFBsdWdpbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgQ29udGVudCBQYWNrYWdlcy4gPC9zdHJvbmc+IDwvcD4KLSAgICA8cD4mIzE0OTsgVW5jaGVjayBDb250cmlidXRpb24gVGVzdC4gPC9wPgotICAgIDxwPiYjMTQ5OyBNYWtlIHN1cmUgPHN0cm9uZz5FeHRlbmRzIFRlc3QgPC9zdHJvbmc+aXMgY2hlY2tlZC4gVGhpcyBpcyBkb25lIHNvIHRoZXJlIHRoYXQgYXJlIG5vIGNvbmZsaWN0aW5nIGV4dGVuc2lvbnMgdG8gdGhlIHNhbWUgbWV0aG9kIGVsZW1lbnQuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xvc2UgYW5kIHNhdmUgdGhlIGNoYW5nZXMgdG8gdGhlIGNvbmZpZ3VyYXRpb24uIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+IEluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBVSSBEZXNpZ25lciByb2xlPC9zcGFuPiBpbiB0aGUgVW5jYXRlZ29yaXplZCBSb2xlcyBmb2xkZXIgdW5kZXIgdGhlIJM8c3Ryb25nPlJvbGUgU2V0czwvc3Ryb25nPpQgZm9sZGVyLiBZb3Ugd2lsbCBzZWUgaW4gdGhlIGh0bWwgcGFnZSB0aGF0IGNvbnRlbnQgZW50ZXJlZCBpbiB0aGUgZXh0ZW5kaW5nIHJvbGUgaGFzIGJlZW4gcmVwbGFjZWQsIHdoZXJlYXMgY29udGVudCBub3QgcHJvdmlkZWQgaGFzIGJlZW4gaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgYXJ0aWZhY3QuIE5vdGUgdGhhdCB0aGUgZXh0ZW5kZWQgcm9sZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Vc2VyLUludGVyZmFjZSBEZXNpZ25lcjwvc3Bhbj4gcmVtYWlucyB1bmNoYW5nZWQuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF81Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiODUxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF81Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA1OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSBXb3JrIFByb2R1Y3QgdXNpbmcgPHU+RXh0ZW5kczwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIGJhc2UgbWV0aG9kIHdvcmsgcHJvZHVjdCB1c2luZyBleHRlbmRzIHZhcmlhYmlsaXR5LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgPC9zdHJvbmc+IGluIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFRlc3Q8L3NwYW4+IENvbnRlbnQgUGFja2FnZSBjYWxsZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc19ydXBfbmF2bWFwPC9zcGFuPiB3aXRoIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBSVVAgTmF2bWFwPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPmV4dGVuZHMgPC9zdHJvbmc+IGFuZCBjaG9vc2UgdGhlIGJhc2UgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgPC9zdHJvbmc+PHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX25hdm1hcDwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogRXh0ZW5kcyBOYXZtYXAgQnJpZWYgRGVzY3JpcHRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIGFuZCB0aGVuIHN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBOYXZtYXA8L3NwYW4+IHdvcmsgcHJvZHVjdCBpbiB0aGUgPHN0cm9uZz5VbmNhdGVnb3JpemVkIEZvbGRlciA8L3N0cm9uZz4gdW5kZXIgPHN0cm9uZz5Eb21haW5zIDwvc3Ryb25nPi4gWW91IHdpbGwgc2VlIGluIHRoZSBodG1sIHBhZ2UgdGhhdCBjb250ZW50IGVudGVyZWQgaW4gdGhlIGV4dGVuZGluZyBhcnRpZmFjdCBoYXMgYmVlbiByZXBsYWNlZCwgd2hlcmVhcyBjb250ZW50IG5vdCBwcm92aWRlZCBoYXMgYmVlbiBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSBhcnRpZmFjdC4gTm90ZSB0aGF0IHRoZSBleHRlbmRlZCBhcnRpZmFjdCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5OYXZpZ2F0aW9uIE1hcDwvc3Bhbj4gcmVtYWlucyB1bmNoYW5nZWQuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF82Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGI0YzUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDY6IEV4dGVuZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIFRhc2sgdXNpbmcgPHU+RXh0ZW5kczwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIGJhc2UgbWV0aG9kIHRhc2sgdXNpbmcgZXh0ZW5kcyB2YXJpYWJpbGl0eS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPnRhc2sgPC9zdHJvbmc+IGluIHRoZSBFeHRlbmRzIFRlc3QgY29udGVudCBwYWNrYWdlIGNhbGxlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX2Rlc2lnbl91c2VyX2ludGVyZmFjZTwvc3Bhbj4sIHdpdGggcHJlc2VudGF0aW9uIG5hbWUsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgRGVzaWduIFVzZXIgSW50ZXJmYWNlLiA8L3NwYW4+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUsIDwvc3Ryb25nPiBzZWxlY3QgPHN0cm9uZz5leHRlbmRzIDwvc3Ryb25nPiBhbmQgY2hvb3NlIHRoZSBiYXNlIHRhc2sgZGVzaWduX3VzZXJfaW50ZXJmYWNlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgVGFzayBCcmllZiBEZXNjcmlwdGlvbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgPHN0cm9uZz5TdGVwcyA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZCBTdGVwIDEsIEV4dGVuZCBTdGVwIDIgPC9zcGFuPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIDxzdHJvbmc+Um9sZSA8L3N0cm9uZz4gY3JlYXRlZCBpbiBleGVyY2lzZSA0OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX3VpX2Rlc2lnbmVyPC9zcGFuPiwgYXMgUHJpbWFyeSBQZXJmb3JtZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIFdvcmsgUHJvZHVjdCBjcmVhdGVkIGluIGV4ZXJjaXNlIDU6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfcnVwX25hdm1hcDwvc3Bhbj4sIGFzIGFuIE91dHB1dC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCA8c3Ryb25nPkd1aWRhbmNlIDwvc3Ryb25nPihjaG9vc2UgYW55IGd1aWRhbmNlKSA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIHRoZSA8c3Ryb25nPnRhc2sgPC9zdHJvbmc+IHRvIHRoZSBhcHByb3ByaWF0ZSBTdGFuZGFyZCBDYXRlZ29yeTogPHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX2FuYWx5c2lzX2Rlc2lnbl9kaXNjaXBsaW5lPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgYW5kIHRoZW4gc3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgRGVzaWduIFVzZXIgSW50ZXJmYWNlPC9zcGFuPiB0YXNrIHVuZGVyIHRoZSA8c3Ryb25nPkRpc2NpcGxpbmVzIDwvc3Ryb25nPiBmb2xkZXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkFuYWx5c2lzICZhbXA7IERlc2lnbjwvc3Bhbj4gZGlzY2lwbGluZS4gWW91IHdpbGwgc2VlIGluIHRoZSBodG1sIHBhZ2UgdGhhdCBtZXRob2QgY29udGVudCBhbmQgcmVsYXRpb25zaGlwcyBoYXZlIGJlZW4gaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgdGFzayBhbmQgZXh0ZW5kZWQgYnkgdGhlIHBsdWctaW4gZXh0ZW5kaW5nIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMuIE5vdGUgdGhhdCB0aGUgZXh0ZW5kZWQgdGFzayByZW1haW5zIHVuY2hhbmdlZC48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzcuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTVkNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNzogRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgdXNpbmcgPHU+UmVwbGFjZTwvdT4gdmFyaWFiaWxpdHkgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBiYXNlIG1ldGhvZCBjb250ZW50IHVzaW5nIHJlcGxhY2UgdmFyaWFiaWxpdHkuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+Y29udGVudCBwYWNrYWdlIDwvc3Ryb25nPiBuYW1lZCwgPHNwYW4gY2xhc3M9InN0eWxlMSI+UmVwbGFjZSBUZXN0PC9zcGFuPiwgaW4gdGhlIE15IFBsdWdpbiBwbHVnLWluLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+cm9sZSA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X3JlcGxhY2VfdWlfZGVzaWduZXIgcm9sZTwvc3Bhbj4gd2l0aCBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgUmVwbGFjZSBVSSBEZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgPHN0cm9uZz5WYXJpYWJpbGl0eSBUeXBlIDwvc3Ryb25nPiBzZWxlY3QgPHN0cm9uZz5yZXBsYWNlcyA8L3N0cm9uZz4gYW5kIHRoZW4gY2hvb3NlIHRoZSA8c3Ryb25nPmJhc2Ugcm9sZSA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+UmVwbGFjZSBCcmllZiBEZXNjcmlwdGlvbi48L3NwYW4+IDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPk1haW4gRGVzY3JpcHRpb24gPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5SZXBsYWNlIE1haW4gRGVzY3JpcHRpb248L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSB0aGUgcm9sZSBieSBjbG9zaW5nIHRoZSByb2xlIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFVwZGF0ZSB0aGUgVmFyaWFiaWxpdHkgVGVzdCBDb25maWd1cmF0aW9uOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4gJiMxNDk7Jm5ic3A7T3BlbiB0aGUgVmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbiBhbmQgZXhwYW5kIDxzdHJvbmc+TXkgUGx1Z2luICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzPC9zdHJvbmc+LiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7VW5jaGVjayA8c3Ryb25nPkV4dGVuZHMgVGVzdDwvc3Ryb25nPi4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwO0NoZWNrIDxzdHJvbmc+UmVwbGFjZSBUZXN0PC9zdHJvbmc+LiBUaGlzIGlzIGRvbmUgc28gdGhlcmUgYXJlIG5vIGNvbmZsaWN0aW5nIGV4dGVuc2lvbnMgaW4gdGhlIHNhbWUgbWV0aG9kIGVsZW1lbnQuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiwgeW91IHdpbGwgc2VlIHRoYXQgdGhlcmUgaXMgbm8gbG9uZ2VyIGEgKFJVUCkgPHNwYW4gY2xhc3M9InN0eWxlMSI+VXNlci1JbnRlcmZhY2UgRGVzaWduZXI8L3NwYW4+IHJvbGUgaW4gdGhlIDxzdHJvbmc+Um9sZSBTZXRzIDwvc3Ryb25nPiBmb2xkZXIuIEl0IHdhcyByZXBsYWNlZCBieSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBSZXBsYWNlIFVJIERlc2lnbmVyPC9zcGFuPiByb2xlLiBNb3Jlb3Zlciwgb3RoZXIgY29udGVudCBlbGVtZW50cyBpbiB0aGUgYmFzZSBwbHVnLWluIHRoYXQgcmVmZXJlbmNlZCB0aGUgKFJVUCkgPHNwYW4gY2xhc3M9InN0eWxlMSI+VXNlci1JbnRlcmZhY2UgRGVzaWduZXI8L3NwYW4+IHJvbGUgbm93IHJlZmVyZW5jZSB0aGUgcmVwbGFjaW5nIHJvbGUgaW5zdGVhZCAoZS5nLiwgaWYgeW91IG9wZW4gdGhlIGRpc2NpcGxpbmVzIGZvbGRlciBhbmQgdmlldyB0aGUgdGFzayA8c3BhbiBjbGFzcz0ic3R5bGUxIj5EZXNpZ24gVGhlIFVzZXIgSW50ZXJmYWNlPC9zcGFuPiB5b3Ugd2lsbCBzZWUgdGhhdCB0aGUgPHN0cm9uZz5QZXJmb3JtaW5nIFJvbGUgPC9zdHJvbmc+IGlzIG5vdyA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBSZXBsYWNlIFVJIERlc2lnbmVyPC9zcGFuPi4pIDxzdHJvbmc+UmVwbGFjZSA8L3N0cm9uZz4gd29ya3MgaW4gYSBzaW1pbGFyIHdheSBmb3IgPHN0cm9uZz50YXNrczwvc3Ryb25nPiwgPHN0cm9uZz5hcnRpZmFjdHMgPC9zdHJvbmc+LCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5jYXRlZ29yaWVzIDwvc3Ryb25nPiAoZmVlbCBmcmVlIHRvIHRyeSBpdCBvdXQpLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2ludHJvLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhNzhjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48L2gyPgotPGgxPjxhPjwvYT48YT5UdXRvcmlhbDogQ3JlYXRlIFJldXNhYmxlIE1ldGhvZCBDb250ZW50IDwvYT48L2gxPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCBpcyB0byB1bmRlcnN0YW5kIHRoZSB2YXJpZXR5IG9mIHdheXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaW4gYSBiYXNlIHBsdWctaW4gY2FuIGJlIGV4dGVuZGVkIGFuZCBtb2RpZmllZCBieSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiA8L3A+Ci08cD5UaGUgkUNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50JyB0dXRvcmlhbCBzaG93cyBob3cgdG8gY3JlYXRlIG5ldyBjb250ZW50IGluIGEgcGx1Zy1pbi4gSW4gdGhpcyB0dXRvcmlhbCB3ZSB3aWxsIHNlZSBob3cgdG8gZXh0ZW5kIGV4aXN0aW5nIGNvbnRlbnQgaW4gYSBwbHVnLWluLiA8L3A+Ci08cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPkluIHRoZSBmb2xsb3dpbmcgZXhlcmNpc2VzIHdlIGNyZWF0ZSBzZXBhcmF0ZSBDb250ZW50IFBhY2thZ2VzIHRvIGRlbW9uc3RyYXRlIGVhY2ggb2YgdGhlIHdheXMgdGhhdCBhIG1ldGhvZCBwbHVnLWluIGNhbiBtb2RpZnkgY29udGVudCBpbiBhbm90aGVyIHBsdWctaW4gKGkuZS4gZXh0ZW5kcywgcmVwbGFjZXMsIGFuZC9vciBjb250cmlidXRlcykuIFRoaXMgaXMgZm9yIGVhc3kgaWxsdXN0cmF0aW9uIG9mIHRoZSBlZmZlY3Qgb2YgYXBwbHlpbmcgZWFjaCB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IHZhcmlhYmlsaXR5LiA8L3A+Ci1NYW5hZ2luZyBjb250ZW50IHZpYSB0aGUgTWV0aG9kIFBsdWctaW4gbWVjaGFuaXNtIGlzIGEga2V5IGFuZCB2ZXJ5IHBvd2VyZnVsIGZlYXR1cmUgb2YgRVBGIENvbXBvc2VyLiBUaGlzIHR1dG9yaWFsIGV4cGxvcmVzIHRoZSBlZmZlY3RzIG9mIHRoZSBkaWZmZXJlbnQgdmFyaWFiaWxpdHkgdHlwZXMgaW4gdGhlIGZvbGxvd2luZyBleGVyY2lzZXMuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8xLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYzMzNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IFB1Ymxpc2hpbmcgYSBwcmUtZGVmaW5lZCBjb25maWd1cmF0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBwdWJsaXNoIGEgPHN0cm9uZz5Db25maWd1cmF0aW9uIDwvc3Ryb25nPnRoYXQgaXMgaW5jbHVkZWQgaW4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgSW4gdGhlIDxzdHJvbmc+TGlicmFyeSBWaWV3PC9zdHJvbmc+LCBvcGVuIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIgYW5kIHNlbGVjdCB0aGUgY29uZmlndXJhdGlvbjogTXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cy4gVGhpcyBvcGVucyB0aGUgQ29uZmlndXJhdGlvbiBFZGl0b3IuIAotICAgIDxwPlRoZSBQbHVnIGluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbiB0YWIgc2hvd3MgdGhlIHBsdWctaW5zIGFuZCBwYWNrYWdlcyB3aXRoaW4gZWFjaCBwbHVnLWluIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBDb25maWd1cmF0aW9uLiBUaGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIGluIHRoZSBDb25maWd1cmF0aW9uIGNhbiBiZSBhZGp1c3RlZCBieSBzZWxlY3RpbmcgYW5kIGRlc2VsZWN0aW5nIHRoZW0gaW4gdGhlIHRyZWUgZGlzcGxheS4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFJldmlldyA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+PHN0cm9uZz5WaWV3cyA8L3N0cm9uZz46IChpLmUuIGhvdyB0aGUgcHVibGlzaGVkIHNpdGUgd2lsbCBiZSBsYWlkIG91dCkuIAotICAgIDxwPlNlbGVjdCB0aGUgPHN0cm9uZz5WaWV3cyA8L3N0cm9uZz4gdGFiIGluIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvci4gQSBWaWV3IGlzIGEgQ3VzdG9tIENhdGVnb3J5IHRoYXQgaXMgZGVzaWduZWQgZm9yIHB1YmxpY2F0aW9uLiBSZXF1aXJlZCBwYWNrYWdlcyBhbmQgY29udGVudCBlbGVtZW50cyBhcmUgYXNzaWduZWQgdG8gYSBDdXN0b20gQ2F0ZWdvcnkuIFRoZSBDdXN0b20gQ2F0ZWdvcnkgY2FuIHRoZW4gYmUgYWRkZWQgYXMgYSBWaWV3IHRvIGEgQ29uZmlndXJhdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFNlbGVjdCA8c3Ryb25nPkRlZmF1bHQ8L3N0cm9uZz4gVmlldy4KLSAgICA8cD5PbmUgb2YgdGhlIHZpZXdzIGNhbiBiZSBzZWxlY3RlZCBhcyB0aGUgRGVmYXVsdCBWaWV3IGJ5IHNlbGVjdGluZyB0aGUgVmlldyBhbmQgY2xpY2tpbmcgdGhlIJFNYWtlIERlZmF1bHQnIGJ1dHRvbi4gV2hlbiB0aGUgY29uZmlndXJhdGlvbiBpcyBwdWJsaXNoZWQsIHRoZSBEZWZhdWx0IFZpZXcgd2lsbCBiZSBzZWxlY3RlZCB3aGVuIHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBvcGVuZWQgaW4gdGhlIEVQRiBDb21wb3NlciBCcm93c2VyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xvc2UgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0czwvc3Ryb25nPiBpbiB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gYm94IGluIHRoZSBFUEYgQ29tcG9zZXIgdG9vbGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gJmd0OyBQdWJsaXNoIDwvc3Ryb25nPiBmcm9tIHRoZSBtYWluIG1lbnUgYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgU3RlcCB0aHJvdWdoIFB1Ymxpc2ggd2l6YXJkLCBhY2NlcHRpbmcgdGhlIGRlZmF1bHRzLCBhbmQgcHVibGlzaCB0aGUgY29uZmlndXJhdGlvbi4gSXQgd2lsbCB0YWtlIGEgZmV3IG1pbnV0ZXMgdG8gZ2VuZXJhdGUgdGhlIHdlYiBzaXRlLiBBc3N1bWluZyB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCBqYXZhIGVudmlyb25tZW50LCB0aGUgRVBGIENvbXBvc2VyIEJyb3dzZXIgYXBwbGV0IHNob3VsZCBsYXVuY2ggYWxsb3dpbmcgeW91IHRvIHZpZXcgdGhlIHJlc3VsdGluZyBwdWJsaXNoZWQgd2ViIHNpdGUgKGFjY2VwdCB0aGUgc2VjdXJpdHkgd2FybmluZ3Mgd2hlbiB0aGUgYXBwbGV0IGZpcmVzIHVwKS4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gVGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZSBoYXMgYSByaWNoZXIgb3JnYW5pemF0aW9uIGFuZCBsYXktb3V0IGFzIGRlZmluZWQgYnkgdGhlIENvbmZpZ3VyYXRpb24gVmlldywgYXMgY29tcGFyZWQgdG8gdGhlIG1vcmUgc2ltcGxlIHZpZXcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudCBhdmFpbGFibGUgd2l0aGluIHRoZSBFUEYgQ29tcG9zZXIgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4uIDwvcD4KLTwvYmxvY2txdW90ZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzIuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzhlMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMjogQ3JlYXRlIE5ldyBDdXN0b20gQ2F0ZWdvcnkgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHVuZGVyc3RhbmQgYW5kIHVzZSA8c3Ryb25nPkN1c3RvbSBDYXRlZ29yaWVzIDwvc3Ryb25nPi4gPC9wPgotPHA+PHN0cm9uZz5DdXN0b20gQ2F0ZWdvcmllcyA8L3N0cm9uZz4gYWxsb3cgeW91IHRvIGNhdGVnb3JpemUgY29udGVudCBhY2NvcmRpbmcgdG8gYW55IHNjaGVtZSB5b3Ugd2FudC4gQ3VzdG9tIENhdGVnb3JpZXMgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHB1Ymxpc2hhYmxlIDxzdHJvbmc+Vmlld3MgPC9zdHJvbmc+IHByb3ZpZGluZyBhIG1lYW5zIHRvIG9yZ2FuaXplIG1ldGhvZCBjb250ZW50IHByaW9yIHRvIHB1Ymxpc2hpbmcuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBOYXZpZ2F0ZSB0byA8c3Ryb25nPk15IFBsdWctaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IEN1c3RvbSBDYXRlZ29yaWVzPC9zdHJvbmc+LiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSBjcmVhdGVkIHRoaXMgcGx1Z2luLCBjcmVhdGUgaXQgbm93LCBvciBnbyB0aHJvdWdoIHRoZSA8dT5DcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudDwvdT4gdHV0b3JpYWwuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgY3VzdG9tIGNhdGVnb3J5IG5hbWVkLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+LiBSaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5DdXN0b20gQ2F0ZWdvcmllczwvc3Ryb25nPiBmb2xkZXIsIGhpZ2hsaWdodCA8c3Ryb25nPk5ldywgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q3VzdG9tIENhdGVnb3J5IDwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIE9wZW4gdGhlIDxzdHJvbmc+QXNzaWduIDwvc3Ryb25nPiB0YWIuIElmIHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb250ZW50X3BhY2thZzwvc3Bhbj5lLCBhZGQgdGhlIDxzdHJvbmc+cm9sZXMgPC9zdHJvbmc+LCA8c3Ryb25nPmFydGlmYWN0czwvc3Ryb25nPiwgPHN0cm9uZz50YXNrcywgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPiBmcm9tIGl0IGludG8gdGhlIGN1c3RvbSBjYXRlZ29yeS4gSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgcGFja2FnZSwgYWRkIGNvbnRlbnQgZnJvbSBhbm90aGVyIGFyZWEgaW4gdGhlIGxpYnJhcnkuIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFlvdSBjYW4gZG8gbXVsdGlwbGUgc2VsZWN0IHVzaW5nIHNoaWZ0IG9yIGNvbnRyb2wga2V5IC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmU8L3NwYW4+LiBZb3Ugd2lsbCBmaW5kIHRoaXMgdW5kZXIgPHN0cm9uZz5SVVAgJmd0OyBEaXNjaXBsaW5lcyAmZ3Q7IHJ1cF9kaXNjaXBsaW5lcy4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+IE9wZW4gb25lIG9mIHRoZSBlbGVtZW50cyB5b3UgYXNzaWduZWQgdG8gdGhlIG5ldyBjdXN0b20gY2F0ZWdvcnkuIE9ic2VydmUgaG93IHRoZSBjdXN0b20gY2F0ZWdvcnkgaXMgbm93IHJlZmxlY3RlZCBpbiB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzIDwvc3Ryb25nPiB0YWIuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkMTM5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAzOiBDcmVhdGUgYSBjdXN0b21pemVkIGNvbmZpZ3VyYXRpb24gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNyZWF0ZSB5b3VyIG93biBjdXN0b21pemVkIGNvbmZpZ3VyYXRpb24uIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IENvbmZpZ3VyYXRpb248L3N0cm9uZz4uIE9yLCB5b3UgY2FuIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zPC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgTGlicmFyeSBWaWV3IGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgQ29uZmlndXJhdGlvbi4gPC9zdHJvbmc+VGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yIGlzIGxhdW5jaGVkLjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBOYW1lIHRoZSBjb25maWd1cmF0aW9uLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb25maWd1cmF0aW9uPC9zcGFuPi48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+UGx1Zy1pbiBhbmQgUGFja2FnZSBTZWxlY3Rpb24gPC9zdHJvbmc+IHRhYi4gSW4gdGhlIGxpc3Qgb2YgUGx1Z2lucywgY2hlY2sgTXkgUGx1Z2luIHRoYXQgeW91IGNyZWF0ZWQgaW4gdGhlIDx1PkNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50PC91PiB0dXRvcmlhbC4gVGhpcyBwbHVnaW4gaGFzIFJVUCBhcyBhIGJhc2UgYW5kIHJlZmVyZW5jZXMgcGFydHMgb2YgdGhlIFJVUCBjb250ZW50LCBhbmQgYWxzbyBoYXMgZWxlbWVudHMgdGhhdCBleHRlbmQsIGNvbnRyaWJ1dGUgdG8sIGFuZCByZXBsYWNlIGJhc2UgUlVQIGNvbnRlbnQuIDxicj4KLSAgICAgIElmIHlvdSBkbyBub3QgaGF2ZSB0aGlzIHBsdWdpbiwgY29uc2lkZXIgY29tcGxldGluZyB0aGUgPHU+Q3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQ8L3U+IHR1dG9yaWFsIGJlZm9yZSBjb250aW51aW5nIHdpdGggdGhpcyB0dXRvcmlhbC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFRoZSBkaXNwbGF5IHdpbGwgZ2l2ZSB5b3UgYSBzZXJpZXMgb2Ygd2FybmluZ3MgYW5kIHRoZSBMaWJyYXJ5IEVycm9yIExvZyB2aWV3IHdpbGwgYmUgZGlzcGxheWVkLiA8YnI+Ci0gICAgICBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGdpdmVzIHRoZXNlIHdhcm5pbmdzIHRvIGhlbHAgZW5zdXJlIHRoYXQgeW91IGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCCRbWFrZXMgc2Vuc2UnLiBJZiB5b3UgcmVmZXJlbmNlIGFuIGVsZW1lbnQsIHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byBzZWUgdGhlIGZ1bGwgZGV0YWlscyBmb3IgdGhhdCBlbGVtZW50IGluIGEgcHVibGlzaGVkIHdlYiBzaXRlIGlmIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIElmIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uLCB0aGUgkW9mZmVuZGluZycgcGFja2FnZSBpcyBtYXJrZWQgYXMgYSB3YXJuaW5nIJYgeW91IG1heSBjaG9vc2Ugbm90IHRvIGluY2x1ZGUgdGhlIGZ1bGwgZGV0YWlscyBvZiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2hlY2sgdGhlIDxzdHJvbmc+QWRkIE1pc3NpbmcgUmVmZXJlbmNlczwvc3Ryb25nPiBidXR0b24uIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGFuZCByZWN1cnNpdmVseSBhZGQgcGFja2FnZXMgY29udGFpbmluZyBhbnkgZWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBhbHJlYWR5IHNlbGVjdGVkIHBhY2thZ2VzLiBFeHBsb3JlIHdoYXQgcGFja2FnZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBjb25maWd1cmF0aW9uLiBZb3Ugd2lsbCBwcm9iYWJseSBub3cgc2VlIGFsbCBvZiBSVVAgc2VsZWN0ZWQuIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgaW50ZXItY29ubmVjdGVkIG5hdHVyZSBvZiBSVVAuIFVuY2hlY2sgUlVQIHRvIHJlc3RvcmUgdGhlIHdhcm5pbmdzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJpbGwgZG93biBpbnRvIHRoZSBjb250ZW50IHBhY2thZ2VzIGluIHRoZSBNeSBQbHVnaW4sIHBsdWdpbiBwYWNrYWdlICAgYnkgY2xpY2tpbmcgb24gdGhlIDxzdHJvbmc+Kzwvc3Ryb25nPiBzaWducy4gVW5jaGVjayB0aGU8c3Ryb25nPiBFeHRlbmRzIFRlc3QgPC9zdHJvbmc+YW5kIDxzdHJvbmc+UmVwbGFjZSBUZXN0IDwvc3Ryb25nPmNvbnRlbnQgcGFja2FnZXMuIFVuY2hlY2tpbmcgdGhlc2UgYXZvaWRzIGNvbmZsaWN0cyB0aGF0IG1heSBvY2N1ciBiZWNhdXNlIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBpcyBhZmZlY3RlZCBieSB0aGUgcGx1Z2lucy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFRoZXJlIHNob3VsZCBiZSBhIDxzdHJvbmc+Kzwvc3Ryb25nPiBieSB0aGUgPHN0cm9uZz5Db250cmlidXRpb24gVGVzdDwvc3Ryb25nPiBwYWNrYWdlLiBDbGljayB0aGUgPHN0cm9uZz5NYWtlIENsb3N1cmUgYnkgRml4aW5nIEVycm9yczwvc3Ryb25nPiBidXR0b24uIFRoaXMgYXV0b21hdGljYWxseSBtYWtlcyB5b3VyIGNvbmZpZ3VyYXRpb24gY29tcGxldGUgYmFzZWQgb24gd2hhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEcmlsbCBkb3duIGludG8gdGhlIFJVUCBwbHVnaW4sIGFuZCBzZWUgd2hhdCBwYWNrYWdlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuIFRoZXNlIHdpbGwgYmUgdGhlIHBhY2thZ2VzIHRoYXQgY29udGFpbiB0aGUgZWxlbWVudHMgdXNlZCBhcyBiYXNlIGVsZW1lbnRzIGluIHRoZSBDb25maWd1cmF0aW9uIFRlc3QgY29udGVudCBwYWNrYWdlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgb24gdGhlIDxzdHJvbmc+Vmlld3M8L3N0cm9uZz4gdGFiLiAKLSAgICA8cD5BbnkgY3VzdG9tIGNhdGVnb3J5IGNhbiBiZSBhZGRlZCBhcyBhIHZpZXcgdG8gYSBjb25maWd1cmF0aW9uLiBZb3UgY2FuIGNyZWF0ZWQgYW55IG51bWJlciBvZiBjdXN0b20gY2F0ZWdvcmllcyBhbmQgdGhleSBhcmUgdmVyeSBmbGV4aWJsZSBpbiB0ZXJtcyBvZiB0aGUgY29udGVudCB0aGF0IHlvdSBjYW4gYWRkIHRvIGEgY3VzdG9tIGNhdGVnb3J5IGFuZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNvbnRlbnQgYXBwZWFycy4gPC9wPgotICAgIDxwPkFkZCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY3VzdG9tX2NhdGVnb3J5PC9zcGFuPiBjdXN0b20gY2F0ZWdvcnkgYXMgYSB2aWV3IGluIHRoZSBjb25maWd1cmF0aW9uLiA8L3A+Ci0gICAgPHA+RXhwZXJpbWVudCB3aXRoIGFkZGluZyBvdGhlciBjdXN0b20gY2F0ZWdvcmllcyBhcyB2aWV3cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE1ha2UgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY3VzdG9tX2NhdGVnb3J5PC9zcGFuPiB0aGUgZGVmYXVsdCB2aWV3IGJ5IHNlbGVjdGluZyB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY3VzdG9tX2NhdGVnb3J5PC9zcGFuPiB0YWIgYW5kIGNsaWNraW5nIHRoZSA8c3Ryb25nPk1ha2UgRGVmYXVsdDwvc3Ryb25nPiBidXR0b24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGNsb3NpbmcgdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbmZpZ3VyYXRpb248L3NwYW4+IGluIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3ggYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuLiBZb3Ugd2lsbCBzZWUgdGhlIGl0ZW1zIGRpc3BsYXllZCBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IGNoYW5nZS4gPC9wPgotICA8L2xpPgotICA8bGk+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gRXhwbG9yZSB0aGUgY29udGVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBZb3Ugc2hvdWxkIHNlZSB0aGUgY29udGVudCB5b3UgY3JlYXRlZCBpbiB5b3VyIHBsdWdpbnMgYW5kIHNvbWUgUlVQIGNvbnRlbnQuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfNC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4YmUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA0OiBQdWJsaXNoaW5nIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24gPC9hPjwvaDI+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+Q29uZmlndXJhdGlvbiAmZ3Q7IFB1Ymxpc2ggPC9zdHJvbmc+IGZyb20gdGhlIG1haW4gbWVudSBiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgbXktY29uZmlndXJhdGlvbiBpbiB0aGUgbGlzdCBvZiBjb25maWd1cmF0aW9ucy4gPC9wPgotICA8L2xpPgotICA8bGk+IFN0ZXAgdGhyb3VnaCBQdWJsaXNoIHdpemFyZCwgYWNjZXB0aW5nIHRoZSBkZWZhdWx0cywgYW5kIHB1Ymxpc2ggdGhlIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgdGFrZSBhIGZldyBtaW51dGVzIHRvIGdlbmVyYXRlIHRoZSB3ZWIgc2l0ZS4gQXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgamF2YSBlbnZpcm9ubWVudCwgdGhlIEVQRiBDb21wb3NlciBCcm93c2VyIGFwcGxldCBzaG91bGQgbGF1bmNoIGFsbG93aW5nIHlvdSB0byB2aWV3IHRoZSByZXN1bHRpbmcgcHVibGlzaGVkIHdlYiBzaXRlIChhY2NlcHQgdGhlIHNlY3VyaXR5IHdhcm5pbmdzIHdoZW4gdGhlIGFwcGxldCBmaXJlcyB1cCkuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Ci0gIDxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSBwdWJsaXNoZWQgd2ViIHNpdGUgaGFzIGEgcmljaGVyIG9yZ2FuaXphdGlvbiBhbmQgbGF5LW91dCBhcyBkZWZpbmVkIGJ5IHRoZSBDb25maWd1cmF0aW9uIFZpZXcsIGFzIGNvbXBhcmVkIHRvIHRoZSBtb3JlIHNpbXBsZSB2aWV3IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRlbnQgYXZhaWxhYmxlIHdpdGhpbiB0aGUgRVBGIENvbXBvc2VyIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3IDwvc3Ryb25nPi4gPC9wPgotPC9ibG9ja3F1b3RlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfaW50cm8uaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjFkYjdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT48YT5UdXRvcmlhbDogUHVibGlzaGluZyBhbmQgRXhwb3J0aW5nIDwvYT48L2gxPgotPHA+RVBGIENvbXBvc2VyIGlzIGVzc2VudGlhbGx5IGEgY29udGVudCBtYW5hZ2VtZW50IGFwcGxpY2F0aW9uLiBUaGUgdWx0aW1hdGUgb3V0cHV0IG9mIEVQRiBDb21wb3NlciBpcyBhIFdlYiBzaXRlIHdpdGggcHVibGlzaGVkIG1ldGhvZCBndWlkYW5jZSBhbmQgcHJvY2Vzc2VzIHRoYXQgY2FuIGJlIHZpZXdlZCBieSBhIHByb2plY3QgdGVhbS4gPC9wPgotPHA+RVBGIENvbXBvc2VyIG1ha2VzIGl0IGVhc3kgdG8gY29uZmlndXJlIGEgcHJvY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb3Igc2l6ZSBvZiBwcm9qZWN0IGFuZCB0byBwdWJsaXNoIHRoZSBndWlkYW5jZSB0byBhIFdlYiBzaXRlLiBBIE1ldGhvZCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+IGlzIGEgc2VsZWN0aW9uIG9mIDxzdHJvbmc+Q29udGVudCBQYWNrYWdlcyA8L3N0cm9uZz4gYWNyb3NzIGRpZmZlcmVudCA8c3Ryb25nPk1ldGhvZCBQbHVnLWlucyA8L3N0cm9uZz4gY29udGFpbmluZyB0aGUgbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuIEF0IHB1Ymxpc2hpbmcgdGltZSwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY29tYmluZWQgd2l0aCBkaWZmZXJlbnQgTWV0aG9kIDxzdHJvbmc+Vmlld3MgPC9zdHJvbmc+IHdoaWNoIGRlZmluZSB0aGUgd2Vic2l0ZSdzIG5hdmlnYXRpb24gc3RydWN0dXJlcyBhbmQgY29udGVudCBvcmdhbml6YXRpb24uIDwvcD4KLTxwPlRoZSBFUEYgQ29tcG9zZXIgPHN0cm9uZz5Ccm93c2luZyBQZXJzcGVjdGl2ZSA8L3N0cm9uZz4gcmVuZGVycyB0aGUgTWV0aG9kIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz4gY29udGVudCBpbiBodG1sIGZvcm1hdCB3aXRoaW4gRVBGIENvbXBvc2VyLCBwcm92aWRpbmcgYSBuYXZpZ2FibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZC9wcm9jZXNzIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoYXQgQ29uZmlndXJhdGlvbi4gPC9wPgotPHA+VGhpcyB0dXRvcmlhbCB1c2VzIGNvbnRlbnQgdGhhdCBpcyBjcmVhdGVkIGluIHRoZSCRQ3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQnIGFuZCCRRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgdXNpbmcgVmFyaWFiaWxpdHknIHR1dG9yaWFscy4gPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyYjgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAxOiBCcm93c2UgUHJvY2VzcyBDb250ZW50IHVzaW5nIEJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBnZXQgYSBiYXNpYyB1bmRlcnN0YW5kaW5nIG9mIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuIDwvcD4KLTxwPihOb3RlIHRoYXQgdGhpcyBpcyBhIHJlcGVhdCBvZiBleGVyY2lzZSAyIGluIHRoZSA8dT5Ccm93c2UgdGhlIExpYnJhcnk8L3U+IHR1dG9yaWFsLikgPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgdGhlIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0czwvc3Ryb25nPiBjb25maWd1cmF0aW9uLiBJZiB5b3UgaGF2ZSBub3QgY3JlYXRlZCB0aGlzIGNvbmZpZ3VyYXRpb24sIHNlbGVjdCB0aGUgPHN0cm9uZz5SVVAgZm9yIFNtYWxsIFByb2plY3RzPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBUbyB2aWV3IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgQW5hbHlzaXMgYW5kIERlc2lnbjwvc3Ryb25nPi4gQSBwcmV2aWV3IG9mIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZSBzZWxlY3RlZCBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQSBDYXBhYmlsaXR5IFBhdHRlcm4gY29udGFpbnMgYSBsYXJnZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gYW5kIGlzIGRpc3BsYXllZCBvdmVyIGZvdXIgdGFicyCWIDxzdHJvbmc+RGVzY3JpcHRpb24sIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IFVzYWdlLCA8L3N0cm9uZz5hbmQ8c3Ryb25nPiBUZWFtIEFsbG9jYXRpb248L3N0cm9uZz4uIEV4cGxvcmUgdGhlIGluZm9ybWF0aW9uIG9uIGVhY2ggdGFiLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UbyB2aWV3IGEgRGVsaXZlcnkgUHJvY2VzcywgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBEZWxpdmVyeSBQcm9jZXNzZXMgJmd0OyBDbGFzc2ljIFJVUCBMaWZlY3ljbGU8L3N0cm9uZz4uIFRoZSBkaXNwbGF5IGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgc2ltaWxhciB0byBhIENhcGFiaWxpdHkgUGF0dGVybi4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8yLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThlZmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAyOiBFeHBsb3JlIGEgUHJvY2VzcyB1c2luZyBBdXRob3JpbmcgcGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIGV4cGxvcmUgdGhlIGluZm9ybWF0aW9uIGFuZCBlZGl0b3JzIGZvciBwcm9jZXNzZXMuIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIHVzZWQgYXMgYW4gZXhhbXBsZSBidXQgdGhlIHNhbWUgYXBwbGllcyB0byBEZWxpdmVyeSBQcm9jZXNzZXMuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBMaWJyYXJ5IFZpZXcsIGNsaWNrIDxzdHJvbmc+UlVQICZndDsgUHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3M8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkRvdWJsZSBjbGljayB0aGUgPHN0cm9uZz5BbmFseXNpcyBhbmQgRGVzaWduIENhcGFiaWxpdHkgUGF0dGVybjwvc3Ryb25nPiBhbmQgZXhhbWluZSB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UaGUgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiB0YWIgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc2VjdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBmdWxseSBkZXNjcmliZSB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuLiAKLSAgICA8cD5BIENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGF0IGxlYXN0IG9uZSBjb25maWd1cmF0aW9uIGJ1dCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG1hbnkuIFRoZSBjb25maWd1cmF0aW9uIHNldHMgdGhlIHNjb3BlIGZvciBjb3JlIG1ldGhvZCBjb250ZW50IGFuZCBvdGhlciBwcm9jZXNzIGVsZW1lbnRzIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENsaWNrIHRoZSA8c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIEFjdGl2aXRpZXMgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBhbmQgdGhlIChjb3JlIG1ldGhvZCBjb250ZW50KSB0YXNrcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBlYWNoIEFjdGl2aXR5LiA8L3A+Ci0gICAgPHA+V2hlbiBhIHRhc2sgaXMgYWRkZWQgdG8gYSBwcm9jZXNzLCB0aGUgcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGFyZSBhbHNvIHB1bGxlZCBpbnRvIHRoZSBwcm9jZXNzLiA8L3A+Ci0gICAgPHA+RWFjaCB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0IHNob3duIGluIHRoZSBhY3Rpdml0eSBpcyBhY3R1YWxseSBhbiBpbnN0YW5jZSBvZiB0aGUgZWxlbWVudCBhcyBpdCBpcyB1c2VkIGF0IHRoZSBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZSBwcm9jZXNzLiBTbyB3aGF0IHlvdSBzZWUgaW4gdGhlIHByb2Nlc3MgYXJlIGFjdHVhbGx5IFRhc2sgRGVzY3JpcHRvcnMsIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENsaWNrIHRoZSA8c3Ryb25nPlRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIGFjdGl2aXRpZXMgaW4gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhbmQgdGhlIHJvbGVzIHRoYXQgYXJlIHRoZSBwZXJmb3JtZXJzIG9mIHRoZSB0YXNrcyBpbiB0aGUgYWN0aXZpdGllcy4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENsaWNrIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdCBVc2FnZTwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIGFjdGl2aXRpZXMgaW4gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhbmQgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgaW5wdXQgYW5kIG91dHB1dHMgb2YgdGhlIHRhc2tzIGluIHRoZSBhY3Rpdml0aWVzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgb24gdGhlIDxzdHJvbmc+Q29uc29saWRhdGVkIFZpZXc8L3N0cm9uZz4gdGFiLiAKLSAgICA8cD5UaGlzIHNob3dzIHRoZSBmdWxsIHNldCBvZiBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuLiBJdCBzaG93cyB0aGUgdGFza3MsIHdvcmsgcHJvZHVjdHMgYW5kIHJvbGVzIHdpdGhpbiBlYWNoIGFjdGl2aXR5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgUmlnaHQgY2xpY2sgYW55IDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gaW4gdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlIHZpZXcsIDwvc3Ryb25nPiBhbmQgY2xpY2sgb24gPHN0cm9uZz5TaG93IFByb3BlcnRpZXMgVmlldzwvc3Ryb25nPi4gCi0gICAgPHA+VGhpcyBkaXNwbGF5cyBhIG5ldyB2aWV3IHRoYXQgc2hvd3MgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFzayAodGFzayBkZXNjcmlwdG9yKSBhcyBpdCBpcyB1c2VkIGluIHRoZSBwcm9jZXNzIGFuZCBhbGxvd3MgeW91IHRvIGN1c3RvbWl6ZSB0aGUgdGFzayBhcyBpdCBpcyB1c2VkIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgICA8cD5UaGUgUHJvcGVydGllcyBWaWV3IGhhcyBhIG51bWJlciBvZiB0YWJzIHRoYXQgb3JnYW5pemUgdGhlIHRhc2sgZGVzY3JpcHRvciBpbmZvcm1hdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+RG9jdW1lbnRhdGlvbjwvc3Ryb25nPiB0YWIuIFRoaXMgYWxsb3dzIHlvdSB0byBlbnRlciBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoaXMgVGFzayBEZXNjcmlwdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiB0YWIuIFRoaXMgYWxsb3dzIHlvdSB0byByZXBsYWNlLCByZW1vdmUgb3IgYWRkIHRvIHRoZSByb2xlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcmUgbWV0aG9kIHRhc2sgZm9yIHRoaXMgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgdGhlIHRhc2sgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4gdGFiLiBUaGlzIGFsbG93cyB5b3UgdG8gcmVwbGFjZSwgcmVtb3ZlIG9yIGFkZCB0byB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcmUgbWV0aG9kIHRhc2sgZm9yIHRoaXMgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgdGhlIHRhc2sgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIGFkanVzdCB0aGUgdGFzayBzdGVwcyBhcyB0aGV5IGFyZSBhcHBsaWVkIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldoZW4gYSByb2xlIGlzIHNlbGVjdGVkIGluIHRoZSBUZWFtIEFsbG9jYXRpb24gdmlldywgb3IgYSB3b3JrIHByb2R1Y3QgaXMgc2VsZWN0ZWQgaW4gdGhlIFdvcmsgUHJvZHVjdCBVc2FnZSB2aWV3LCB0aGUgUHJvcGVydGllcyBWaWV3IGFsbG93cyB5b3UgdG8gZWRpdCB0aGVzZSBlbGVtZW50cyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Q2xpY2sgb24gYW4gPHN0cm9uZz5BY3Rpdml0eTwvc3Ryb25nPiBpbiB0aGUgcHJvY2Vzcy4gPGJyPgotICAgIFRoZSBwcm9wZXJ0aWVzIHZpZXcgYWxsb3dzIHlvdSB0byBzZWUgcm9sbC11cHMgb2YgdGhlIHRhc2tzLCByb2xlcywgYW5kIHdvcmsgcHJvZHVjdHMgaW4gdGhlIGFjdGl2aXR5LiBSb2xsLXVwcyBjYW4gYWxzbyBiZSBkaXNwbGF5ZWQgaW4gdGhlIG1haW4gY29udGVudCB3aW5kb3cgYnkgc2VsZWN0aW5nIHRoZSA8c3Ryb25nPlJvbGwtVXA8L3N0cm9uZz4gb3B0aW9uIGluIHRoZSBjb250ZXh0IHNlbnNpdGl2ZSBtZW51LiBUaGUgUm9sbC1VcCB2aWV3IGNhbiBiZSB0dXJuZWQgb2ZmIGJ5IHNlbGVjdGluZywgPHN0cm9uZz5Sb2xsLURvd248L3N0cm9uZz4uIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzNWFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMzogQ3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gbGVhcm4gaG93IHRvIGNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MgdXNpbmcgY29yZSBtZXRob2QgY29udGVudCBkaXJlY3RseS4gPC9wPgotPHA+SW4gPHN0cm9uZz5Qcm9jZXNzIEF1dGhvcmluZyA8L3N0cm9uZz4gd2UgZG8gbm90IGRpcmVjdGx5IGluY2x1ZGUgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBjb3JlIG1ldGhvZCBlbGVtZW50cyBpbiB0aGUgV0JTIGJ1dCByYXRoZXIgY3JlYXRlIGxvY2FsIHJlZmVyZW5jZXMgdGVybWVkIDxzdHJvbmc+ZGVzY3JpcHRvcnMgPC9zdHJvbmc+IHRoYXQgcmVmZXIgYmFjayB0byB0aGUgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IGJ1dCBhbHNvIGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIGxvY2FsIHByb2Nlc3MuIDwvcD4KLTxwPkRlc2NyaXB0b3JzIGFsc28gcHJvdmlkZSBhIG1lY2hhbmlzbSB3aGVyZWJ5IHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBpbiBjb3JlIG1ldGhvZCBhdXRob3JpbmcgKGUuZy4gcm9sZXMgYXNzb2NpYXRlZCB3aXRoIGEgdGFzaywgaW5wdXQgYW5kIG91dHB1dCwgd29yayBwcm9kdWN0cywgZXRjLiksIGNhbiBiZSBkZWZpbmVkIG9yIGNoYW5nZWQgbG9jYWxseSB3aXRoaW4gdGhlIHByb2Nlc3MuIDwvcD4KLTxvbD4KLSAgPGxpPiAgICBDcmVhdGUgYSBuZXcgRGVsaXZlcnkgUHJvY2VzcyBpbiB0aGUgTXkgUGx1Z2luLCBwbHVnLWluIGNhbGxlZCwgTXkgUlVQLiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD5XaGVuIHlvdSBjcmVhdGUgYSBwcm9jZXNzIHlvdSBhcmUgYXNrZWQgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgQ29uZmlndXJhdGlvbiB0byBiZSB1c2VkIHdpdGggdGhlIHByb2Nlc3MuIFNlbGVjdCB0aGUgTXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cyBjb25maWd1cmF0aW9uLiBJZiB5b3UgbmF2ZSBub3QgY3JlYXRlZCB0aGlzIGNvbmZpZ3VyYXRpb24sIHNlbGVjdCBSVVAgZm9yIFNtYWxsIFByb2plY3RzLiA8L3A+Ci0gICAgPHA+QSBwcm9jZXNzIGhhcyBhIGhpZXJhcmNoeSBvZiBhY3Rpdml0aWVzIGFuZCBjYW4gaW5jbHVkZSB0aGUgc3BlY2lhbCB0eXBlcyBvZiBhY3Rpdml0eSCWIFBoYXNlcyBhbmQgSXRlcmF0aW9ucy4gVGhlc2Ugc3RydWN0dXJlcyBjYW4gYWxzbyBiZSBjcmVhdGVkIGluIENhcGFiaWxpdHkgUGF0dGVybnMuIEZpcnN0IG9mIGFsbCwgd2UnbGwgY3JlYXRlIHNvbWUgYWN0aXZpdGllcyBkaXJlY3RseSBhbmQgcmV1c2Ugc29tZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGxhdGVyLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPiBUbyBjcmVhdGUgdGhlIEluY2VwdGlvbiBQaGFzZSwgaW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSB2aWV3LCByaWdodCBjbGljayB0aGUgPHN0cm9uZz5NeSBSVVAgPC9zdHJvbmc+UHJvY2VzcywgYW5kIHRoZW4gc2VsZWN0LCA8c3Ryb25nPk5ldyBDaGlsZCAmZ3Q7IFBoYXNlIDwvc3Ryb25nPi4gQ2FsbCB0aGUgUGhhc2UsIDxzdHJvbmc+SW5jZXB0aW9uPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgCi0gICAgPHA+VG8gY3JlYXRlIHRoZSBSZXF1aXJlbWVudHMgRGlzY2lwbGluZSBpbiBJbmNlcHRpb24sIGluIHRoZSA8c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSA8L3N0cm9uZz4gdmlldywgcmlnaHQgY2xpY2sgPHN0cm9uZz5JbmNlcHRpb24sIDwvc3Ryb25nPiBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3IDwvc3Ryb25nPjxzdHJvbmc+Q2hpbGQgJmd0OyBBY3Rpdml0eSA8L3N0cm9uZz4uIENhbGwgdGhpcyA8c3Ryb25nPlJlcXVpcmVtZW50czwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+VG8gYWRkIFRhc2tzIHRvIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHksIGluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+IHZpZXcsIG9wZW4gdGhlIFJlcXVpcmVtZW50cyBEaXNjaXBsaW5lIGFuZCB0aGVuIGRyYWcgYW5kIGRyb3AgdGhlIGZvbGxvd2luZyB0YXNrcyBvbnRvIHRoZSBSZXF1aXJlbWVudHMgQWN0aXZpdHkgeW91IGhhdmUganVzdCBjcmVhdGVkOiAgPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IERldmVsb3AgVmlzaW9uIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgRGV0YWlsIHRoZSBTb2Z0d2FyZSBSZXF1aXJlbWVudHMgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBGaW5kIEFjdG9ycyBhbmQgdXNlIENhc2VzIDwvcD4KLSAgICA8cD5XaGVuIHlvdSBpbmNsdWRlIHRoZXNlIHRhc2tzIGluIHlvdXIgcHJvY2VzcywgdGhlIGFzc29jaWF0ZWQgcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIGFsc28gaW5jbHVkZWQgaW4gdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFlvdSBjYW4gcmV2aWV3IHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBtZXRob2QgZWxlbWVudCBpbiB0aGUgPHN0cm9uZz5Qcm9wZXJ0aWVzIDwvc3Ryb25nPiB2aWV3LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3VzdG9taXplIHRoZSBzdGVwcyBmcm9tIHRoZSBGaW5kIEFjdG9ycyBhbmQgVXNlIENhc2VzIHRhc2sgZm9yIHRoZSBJbmNlcHRpb24gcGhhc2UuIENsaWNrIG9uIHRoZSA8c3Ryb25nPkZpbmQgQWN0b3JzIGFuZCBVc2UgQ2FzZXM8L3N0cm9uZz4gdGFzayBkZXNjcmlwdG9yLCBhbmQgb3BlbiB0aGUgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+IHZpZXcuIENsaWNrIG9uIHRoZSA8c3Ryb25nPlN0ZXBzPC9zdHJvbmc+IHRhYi4gUmVtb3ZlIHRoZSBsYXN0IGZvdXIgc3RlcHMgYW5kIGNsb3NlIHRoZSBwcm9wZXJ0aWVzIHZpZXcuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gcGVyc3BlY3RpdmUgYW5kIHNlbGVjdCA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IERlbGl2ZXJ5IFByb2Nlc3NlcyAmZ3Q7IE15IFJVUDwvc3Ryb25nPi4gVGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSB0YWIgaXMgZGlzcGxheWVkLiBDbGljayBvbiA8c3Ryb25nPkZpbmQgQWN0b3JzIGFuZCBVc2UgQ2FzZXM8L3N0cm9uZz4uIE9ubHkgdGhlIGZpcnN0IHRocmVlIHN0ZXBzIGZyb20gdGhlIGNvcmUgbWV0aG9kIHRhc2sgYXJlIGluY2x1ZGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5NYWtlIG90aGVyIGNoYW5nZXMgdG8gdGhlIHRhc2tzIGluIHRoZSBkZWxpdmVyeSBwcm9jZXNzIHlvdSBoYXZlIGp1c3QgY3JlYXRlZCBhbmQgc2VlIGhvdyB0aGV5IGFyZSByZWZsZWN0ZWQgd2hlbiB5b3UgdmlldyB0aGUgcHJvY2VzcyBpbiB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF80Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjYwZDJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDQ6IENyZWF0ZSBhIG5ldyBkZWxpdmVyeSBQcm9jZXNzIHVzaW5nIGNhcGFiaWxpdHkgcGF0dGVybnMuIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBsZWFybiBob3cgdG8gY3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyB1c2luZyA8c3Ryb25nPkNhcGFiaWxpdHkgUGF0dGVybnMgPC9zdHJvbmc+LiA8L3A+Ci08cD5BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHByb2Nlc3MgkWZyYWdtZW50Jy4gSXQgcmVwcmVzZW50cyBhIHByb2Nlc3MgdGhhdCBjYW4gYmUgcmV1c2VkIG1hbnkgdGltZXMgaW4gdGhlIHNhbWUgcHJvY2VzcyBhbmQgLyBvciBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLiBPcmdhbml6aW5nIGNvcmUgbWV0aG9kIGNvbnRlbnQgaW50byBjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCB0aGVuIHVzaW5nIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm5zIHRvIGNvbnN0cnVjdCBmdWxsIGxpZmUtY3ljbGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGlzIGEga2V5IGZlYXR1cmUgb2YgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gPC9wPgotPHA+QSBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIGluY2x1ZGVkIGluIGFub3RoZXIgcHJvY2VzcyAoYW5vdGhlciBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgYSBkZWxpdmVyeSBwcm9jZXNzKSBpbiB0d28gd2F5czogPC9wPgotPGJsb2NrcXVvdGU+Ci0gIDxwPiYjMTQ5OyZuYnNwOyBDb3B5IJYgdGhpcyBjcmVhdGVzIGEgZnVsbCBjb3B5IG9mIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIHRhcmdldCBwcm9jZXNzIGJ1dCBkb2VzIG5vdCByZXRhaW4gYW55IGxpbmtzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNhcGFiaWxpdHkgcGF0dGVybi4gVGhlIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgY3VzdG9taXplZCBpbiB0aGUgbmV3IHByb2Nlc3MuIEFueSBjaGFuZ2VzIHRoYXQgYXJlIHN1YnNlcXVlbnRseSBtYWRlIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYXJlIG5vdCByZWZsZWN0ZWQgaW4gdGhlIHByb2Nlc3MgaW50byB3aGljaCBpdCB3YXMgY29waWVkLiA8L3A+Ci0gIDxwPiYjMTQ5OyZuYnNwOyBFeHRlbmRzIJYgdGhpcyBleHRlbmRzIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaW50byB0aGUgcHJvY2Vzcy4gVGhlIHByb2Nlc3MgcmV0YWlucyBsaW5rcyB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBhbnkgc3Vic2VxdWVudCBjaGFuZ2VzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYXJlIHJlZmxlY3RlZCBpbiB0aGUgcHJvY2VzcyBpbnRvIHdoaWNoIGl0IGlzIGV4dGVuZGVkLiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSBjdXN0b21pemVkIGJ5IHN1cHByZXNzaW5nIHRhc2tzLCByb2xlcywgYW5kIHdvcmsgcHJvZHVjdHMuIE90aGVyIGNoYW5nZXMgY2Fubm90IGJlIG1hZGUuIDwvcD4KLTwvYmxvY2txdW90ZT4KLTxwPldlIHdpbGwgYWRkIHNvbWUgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byB0aGUgRGVsaXZlcnkgUHJvY2VzcyB5b3UgY3JlYXRlZCBpbiBFeGVyY2lzZSAzLiA8L3A+Ci08cD5UbyBhZGQgYSBDYXBhYmlsaXR5IFBhdHRlcm4gdXNpbmcgQ29weTogPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIGFuZCBvcGVuIHRoZSBNeSBSVVAgZGVsaXZlcnkgcHJvY2VzcyB5b3UgY3JlYXRlZCBpbiBFeGVyY2lzZSAzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIENvbmZpZ3VyYXRpb25zIFZpZXcgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93cyAmZ3Q7IFByb2plY3QgTWFuYWdlbWVudC4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERyYWcgYW5kIGRyb3AgdGhlIDxzdHJvbmc+UHJvamVjdCBNYW5hZ2VtZW50IDwvc3Ryb25nPiBDYXBhYmlsaXR5IFBhdHRlcm4gb250byB0aGUgSW5jZXB0aW9uIHBoYXNlIGluIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+Q29weSA8L3N0cm9uZz4gaW4gdGhlIHBvcC11cCBib3guIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgIEV4cGFuZCBvbmUgb2YgdGhlIGFjdGl2aXRpZXMgaW4gdGhlIFByb2plY3QgTWFuYWdlbWVudCBjYXBhYmlsaXR5IHBhdHRlcm4gdG8gdGhlIFRhc2sgbGV2ZWwuIE5vdGUgdGhhdCB0aGUgdGFzayBuYW1lIGlzIGRpc3BsYXllZCBpbiBibGFjay4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBpcyBhdmFpbGFibGUgZm9yIHlvdSB0byBlZGl0LiBBbnkgY2hhbmdlcyBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHdpbGwgbm90IGJlIHJlZmxlY3RlZCBpbiB5b3VyIHByb2Nlc3MuIFlvdSBjYW4gZWRpdCB0aGUgdGFzayBpbiB0aGUgUHJvcGVydGllcyB2aWV3LiA8L2xpPgotPC9vbD4KLTxwPlRvIGFkZCBhIENhcGFiaWxpdHkgUGF0dGVybiB1c2luZyBFeHRlbmRzOiAgPC9wPgotPG9sIHN0YXJ0PSI2Ij4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgUGhhc2UgaW4gdGhlIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzLiBSaWdodC1jbGljayBvbiB0aGUgZmlyc3Qgcm93IGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgQ2hpbGQgJmd0OyBQaGFzZSA8L3N0cm9uZz4uIENhbGwgdGhlIHBoYXNlLCBFbGFib3JhdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyBJdGVyYXRpb24gaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlLiBSaWdodC1jbGljayBvbiB0aGUgRWxhYm9yYXRpb24gcGhhc2UgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBDaGlsZCAmZ3Q7IEl0ZXJhdGlvbiA8L3N0cm9uZz4uIENhbGwgdGhlIGl0ZXJhdGlvbiwgRWxhYm9yYXRpb24gSXRlcmF0aW9uIDEuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgQ29uZmlndXJhdGlvbnMgVmlldywgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93cyAmZ3Q7IFByb2plY3QgTWFuYWdlbWVudC4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERyYWcgYW5kIGRyb3AgdGhlIDxzdHJvbmc+UHJvamVjdCBNYW5hZ2VtZW50IDwvc3Ryb25nPiBDYXBhYmlsaXR5IFBhdHRlcm4gb250byB0aGUgRWxhYm9yYXRpb24gSXRlcmF0aW9uIDEgaXRlcmF0aW9uIGluIE15IFJVUCBQcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+RXh0ZW5kIDwvc3Ryb25nPiBpbiB0aGUgcG9wLXVwIGJveC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEV4cGFuZCBvbmUgb2YgdGhlIGFjdGl2aXRpZXMgaW4gdGhlIFByb2plY3QgTWFuYWdlbWVudCBjYXBhYmlsaXR5IHBhdHRlcm4geW91IGhhdmUganVzdCBhZGRlZCB0byB0aGUgVGFzayBsZXZlbC4gTm90ZSB0aGF0IHRoZSB0YXNrIG5hbWUgaXMgZGlzcGxheWVkIGluIGdyZWVuIGl0YWxpY3MuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgaXMgaW4gYSBwYXJ0IG9mIGEgcHJvY2VzcyBkZWZpbmVkIGVsc2V3aGVyZSCWIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLiBBbnkgY2hhbmdlcyB0byB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHdpbGwgYmUgcmVmbGVjdGVkIGluIHlvdXIgcHJvY2Vzcy4gQWxzbywgdGhlIFByb3BlcnRpZXMgdmlldyBzaG93cyB0aGUgdGFzayBkZXRhaWxzLCBidXQgdGhleSBjYW5ub3QgYmUgZWRpdGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5SaWdodCBjbGljayBvbiBhIHRhc2sgaW4gdGhlIGV4dGVuZGVkIGNhcGFiaWxpdHkgcGF0dGVybiBhbmQgc2VsZWN0IDxzdHJvbmc+U3VwcHJlc3MgPC9zdHJvbmc+LiBUaGUgdGFzayBpcyBncmF5ZWQgb3V0LiBUaGUgdGFzayB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHRoZSBkZWxpdmVyeSBwcm9jZXNzLCBub3Igd2lsbCBpdCBiZSBpbmNsdWRlZCBpbiBhbiBleHBvcnQgb2YgdGhlIHByb2Nlc3MuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF81Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGJmODJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSA1OiBDcmVhdGUgUHJvY2VzcyBEaWFncmFtcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXhwbG9yZSB0aGUgZGlhZ3JhbSBmZWF0dXJlcyBvZiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgc3VwcG9ydHMgdGhyZWUgdHlwZXMgb2YgcHJvY2VzcyBkaWFncmFtLiBUaGVzZSBhcmU6IDwvcD4KLTxibG9ja3F1b3RlPgotICAgICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5BY3Rpdml0eSBEaWFncmFtPC9zdHJvbmc+IDwvcD4KLSAgICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgICAgPHA+ICAgICAgICAgICAgVGhpcyBzaG93cyB0aGUgKHN1YikgYWN0aXZpdGllcyBpbiBhIGhpZ2hlciBsZXZlbCBhY3Rpdml0eS4gSXQgc2hvd3MgdGhlIHNlcXVlbmNlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgYWN0aXZpdGllcy4gPC9wPgotICAgICAgICA8L2Jsb2NrcXVvdGU+Ci0gIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkFjdGl2aXR5IERldGFpbDwvc3Ryb25nPiCWIHNpbWlsYXIgdG8gUlVQIFdvcmtmbG93IERldGFpbCA8L3A+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiAgICAgIFRoaXMgc2hvd3MgdGhlIHRhc2tzIGluIGFuIGFjdGl2aXR5IHdpdGggdGhlaXIgcGVyZm9ybWluZyByb2xlcyBhbmQgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvc3Ryb25nPiA8L3A+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPlRoaXMgZGlhZ3JhbSBjYW4gYmUgdXNlZCB0byBzaG93IGhvdyBhIHdvcmsgcHJvZHVjdCBpcyBkZXBlbmRlbnQgb24gb3RoZXIgd29yayBwcm9kdWN0cy4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5UaGVzZSBkaWFncmFtcyBjYW4gdGhlbiBiZSBpbmNsdWRlZCBpbiB0aGUgcHVibGlzaGVkIHdlYiBzaXRlLiBUaGUgZGlhZ3JhbXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkICh0byBhIGRlZ3JlZSkgYW5kIGluaGVyZW50bHkgc3luY2hyb25pemVkIHdpdGggdGhlIFdCUy4gQ2hhbmdlcyB0byB0aGUgcHJvY2VzcyBzdHJ1Y3R1cmUgdXNpbmcgdGhlIGRpYWdyYW0gZWRpdG9yIGFyZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiB0aGUgV0JTLCBhbmQgdmljZSB2ZXJzYS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IHRoZSBNeSBSVVAgZGVsaXZlcnkgcHJvY2VzcyB0aGF0IHlvdSBoYXZlIGJlZW4gd29ya2luZyBvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SGlnaGxpZ2h0IHRoZSBkZWxpdmVyeSBwcm9jZXNzIGluIHRoZSBXQlMgYW5kIHRoZW4gcmlnaHQtY2xpY2suIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIDxzdHJvbmc+RGlhZ3JhbXMgJmd0OyBPcGVuIEFjdGl2aXR5IERpYWdyYW08L3N0cm9uZz4uIFRoZSBkaWFncmFtIGVkaXRvciBzaG91bGQgb3Blbiwgc2hvd2luZyB0aGUgdG9wIGxldmVsIGFjdGl2aXRpZXMgLSBwaGFzZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkV4cGFuZCB0aGUgPHN0cm9uZz5QYWxldHRlIDwvc3Ryb25nPiBvbiB0aGUgcmlnaHQgb2YgdGhlIGRpYWdyYW0gdmlldy4gQWxsIHRoZSBlbGVtZW50cyByZXF1aXJlZCB0byBjcmVhdGUgYW4gPHN0cm9uZz5BY3Rpdml0eSBEaWFncmFtIDwvc3Ryb25nPiBhcmUgYXZhaWxhYmxlIG9uIHRoZSBwYWxldHRlLiBBZGQgYSBuZXcgcGhhc2UgdG8gdGhlIGRpYWdyYW0gliBjYWxsIGl0LCBDb25zdHJ1Y3Rpb24uIENyZWF0ZSBsaW5rcyBiZXR3ZWVuIHRoZSBwaGFzZXMgdG8gc2hvdyB0aGUgc2VxdWVuY2Ugb2YgdGhlIHBoYXNlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIGJhY2sgdG8gdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlIDwvc3Ryb25nPnZpZXcgYW5kIG5vdGljZSB0aGUgbmV3IHBoYXNlLiBBbHNvIG5vdGljZSB0aGF0IHRoZSBsaW5rcyB5b3UgYWRkZWQgb24gdGhlIGRpYWdyYW0gYXJlIHJlZmxlY3RlZCBpbiB0aGUgUHJlZGVjZXNzb3JzIGNvbHVtbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RG91YmxlIGNsaWNrIHRoZSA8c3Ryb25nPkluY2VwdGlvbiBQaGFzZTwvc3Ryb25nPiBpbiB0aGUgZGlhZ3JhbSCWIGl0IHdpbGwgZHJpbGwgZG93biB0byBzaG93IHRoZSBjb250YWluZWQgQWN0aXZpdGllcyAodGhlIHJ1bGUgaXMgdGhhdCB0aGUgZWRpdG9yIHdpbGwgZGlzcGxheSB0aGUgcHJvY2VzcyBlbGVtZW50cyBhdCB0aGUgbGV2ZWwgYmVsb3cgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgZWxlbWVudCkuIFN1Y2Nlc3NpdmUgZHJpbGwgZG93biB0aHJvdWdoIHRoZSBsZXZlbHMgaXMgcG9zc2libGUgYnkgY2xpY2tpbmcgb24gdGhlIGRpYWdyYW0gZWxlbWVudHMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsb3NlIHRoZSBkaWFncmFtcyB5b3UgaGF2ZSBvcGVuZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIHJpZ2h0LWNsaWNrIG9uIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHkgYW5kIHNlbGVjdCwgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IE9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uIDwvc3Ryb25nPlRoZSBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gSXQgc2hvd3M6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgVGhlIFJvbGVzIHRoYXQgcGVyZm9ybSB0YXNrcyBpbiB0aGUgYWN0aXZpdHkgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBUaGUgVGFza3MgdGhhdCB0aGUgcm9sZXMgcGVyZm9ybSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIGVhY2ggdGFzayA8L3A+Ci0gICAgPHA+WW91IGNhbiBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGUgZGlhZ3JhbSBidXQgeW91IGNhbm5vdCBhZGQgb3IgcmVtb3ZlIGFueSBlbGVtZW50cyBmcm9tIHRoZSBkaWFncmFtLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkNsb3NlIHRoZSBkaWFncmFtcyB5b3UgaGF2ZSBvcGVuZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBJbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCByaWdodC1jbGljayBvbiB0aGUgUmVxdWlyZW1lbnRzIGFjdGl2aXR5IGFuZCBzZWxlY3QsIDxzdHJvbmc+RGlhZ3JhbXMgJmd0OyBPcGVuIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0uIDwvc3Ryb25nPlRoZSB3b3JrIHByb2R1Y3RzIHVzZWQgaW4gdGhlIGFjdGl2aXR5IGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBkaWFncmFtLiAgPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+QWRkIGEgKGRlcGVuZGVuY3kpIGxpbmsgYmV0d2VlbiB0d28gd29yayBwcm9kdWN0cy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgd29yayBwcm9kdWN0IGF0IHRoZSBhcnJvdyBlbmQgb2YgdGhlIGxpbmsgaXMgZGVwZW5kZW50IG9uIHRoZSBvdGhlciB3b3JrIHByb2R1Y3QsIGkuZS4sIHRoZSBvdGhlciB3b3JrIHByb2R1Y3QgbmVlZHMgdG8gYmUgY3JlYXRlZCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHNlY29uZCB3b3JrIHByb2R1Y3QuCi0gIDwvcD4KLSAgPHA+QWRkIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gdGhlIGRpYWdyYW0uIDwvcD4KLTwvYmxvY2txdW90ZT4KLTxvbCBzdGFydD0iMTIiPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIGJhY2sgdG8gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIG9wZW4gdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+IHZpZXcuIE5vdGljZSB0aGUgbmV3IHdvcmsgcHJvZHVjdCBpbiB0aGUgUmVxdWlyZW1lbnRzIGFjdGl2aXR5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5PbmNlIHlvdSBoYXZlIGVkaXRlZCBhIGRpYWdyYW0sIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgaXQgb3IgZXhjbHVkZSBpdCB3aGVuIHB1Ymxpc2hpbmcgdGhlIHByb2Nlc3MgaW4gYSBjb25maWd1cmF0aW9uLiBJbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5SZXF1aXJlbWVudHM8L3N0cm9uZz4gYWN0aXZpdHkgYW5kIHNlbGVjdCA8c3Ryb25nPkRpYWdyYW1zICZndDsgUHVibGlzaGluZyBPcHRpb25zLiA8L3N0cm9uZz5DaGVjayBvciB1bmNoZWNrIHRoZSB0eXBlcyBvZiBkaWFncmFtIGxpc3RlZC4gSWYgYSBkaWFncmFtIHR5cGUgaXMgbm90IGxpc3RlZCwgaXQgbWVhbnMgdGhhdCB5b3UgaGF2ZSBub3QgZWRpdGVkIHRoYXQgZGlhZ3JhbSB0eXBlIGZvciB0aGUgYWN0aXZpdHkgeWV0LiA8L3A+Ci0gIDwvbGk+Ci0gIDwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9pbnRyby5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYTM1MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPjwvYT48YT5UdXRvcmlhbDogV29ya2luZyB3aXRoIFByb2Nlc3NlcyA8L2E+PC9oMT4KLTxwPjxzdHJvbmc+PGVtPlByb2Nlc3MgQXV0aG9yaW5nIDwvZW0+PC9zdHJvbmc+IGFsbG93cyBhIFByb2Nlc3MgRW5naW5lZXIgdG8gaW5jb3Jwb3JhdGUgPHN0cm9uZz48ZW0+TWV0aG9kIEVsZW1lbnRzIDwvZW0+PC9zdHJvbmc+IGludG8gcHJvY2VzcyBzdHJ1Y3R1cmVzLiBGb3IgZXhhbXBsZSwgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgZm9ybWF0IGZhbWlsaWFyIHRvIFByb2plY3QgTWFuYWdlcnMuIFRoZSBwcm9jZXNzZXMgY2FuIGJlIGluY2x1ZGVkIGluIGEgY29uZmlndXJhdGlvbiB0byBiZSBwdWJsaXNoZWQgYXMgcGFydCBvZiB0aGUgcHVibGlzaGVkIHdlYiBzaXRlLiA8L3A+Ci08cD5JbiA8c3Ryb25nPjxlbT5NZXRob2QgPC9lbT4gQXV0aG9yaW5nIDwvc3Ryb25nPiB0aGUgUHJvY2VzcyBFbmdpbmVlciBkZWZpbmVzIHJvbGVzLCB0YXNrcywgd29yayBwcm9kdWN0cyBhbmQgZ3VpZGFuY2UgYW5kIGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGVzZSBlbGVtZW50cy4gPC9wPgotPHA+SW4gPHN0cm9uZz48ZW0+UHJvY2VzcyA8L2VtPiBBdXRob3JpbmcgPC9zdHJvbmc+IHRoZSBwcm9jZXNzIGVuZ2luZWVyIGRlZmluZXMgYWRkaXRpb25hbCBsaWZlY3ljbGUgZWxlbWVudHMgc3VjaCBhcyA8c3Ryb25nPkFjdGl2aXRpZXMgPC9zdHJvbmc+IChzdW1tYXJ5IHRhc2tzKSwgPHN0cm9uZz5QaGFzZXMgPC9zdHJvbmc+LCA8c3Ryb25nPkl0ZXJhdGlvbnMgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPk1pbGVzdG9uZXMgPC9zdHJvbmc+LCB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgdG8gY29tcG9zZSB0aGUgY29yZSBlbGVtZW50cyBpbnRvIHByb2Nlc3Nlcy4gQSBjb21wbGV0ZSBwcm9jZXNzIGNvcnJlc3BvbmRpbmcgdG8gYSBwcm9qZWN0IHBsYW4gb3IgYSBwaGFzZSB3ZSBjYWxsIGEgPHN0cm9uZz48ZW0+RGVsaXZlcnkgUHJvY2VzcyA8L2VtPjwvc3Ryb25nPjxlbT4oY29ycmVzcG9uZGluZyB0byBTbWFsbCBSVVAsIGZvciBleGFtcGxlKSA8L2VtPi4gV2UgY2FuIGFsc28gY3JlYXRlIHNtYWxsZXIgbW9yZSBncmFudWxhciBzZWN0aW9ucyBvZiBwcm9jZXNzLCB0ZXJtZWQgPHN0cm9uZz48ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJucyA8L2VtPjwvc3Ryb25nPiB0aGF0IGNhbiBiZSB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBtb3JlIGVhc2lseSBjb21wb3NlIGRlbGl2ZXJ5IHByb2Nlc3Nlcy4gPC9wPgotPHA+RWFjaCB0aW1lIGEgdGFzayBpcyBpbmNsdWRlZCBpbiBhIHByb2Nlc3MsIGEgY29weSBvZiB0aGF0IHRhc2sgaXMgY3JlYXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvY2Vzcy4gV2UgY2FsbCB0aGlzIGEgVGFzayBEZXNjcmlwdG9yLiBUaGUgc2FtZSB0YXNrIGNhbiBiZSBpbmNsdWRlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgdGhlIHNhbWUgUlVQIHRhc2sgdG8gYmUgaW5jbHVkZWQgaW4gZWFjaCBJdGVyYXRpb24gaW4gZWFjaCBSVVAgUGhhc2UuIEEgVGFzayBEZXNjcmlwdG9yIGNhbiBhbHNvIG1vZGlmeSB0aGUgYmFzZSB0YXNrIHdpdGhvdXQgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIHRhc2suIEZvciBleGFtcGxlLCByb2xlcyBhbmQgd29yayBwcm9kdWN0cyBjYW4gYmUgYWRkZWQgb3Igc3VwcHJlc3NlZCwgc3RlcHMgY2FuIGJlIHN1cHByZXNzZWQgb3IgcmUtc2VxdWVuY2VkLiA8L3A+Ci08cD5vbGVzIGFuZCBXb3JrIFByb2R1Y3RzIGFyZSBhbHNvIGluY2x1ZGVkIGluIHByb2Nlc3NlcyBhcyBSb2xlIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuIFNvIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGNhbiBhbHNvIGJlIGN1c3RvbWl6ZWQgdG8gZml0IHdpdGggdGhlIGNvbnRleHQgb2YgdGhlIHByb2Nlc3MgaW4gd2hpY2ggdGhleSBhcmUgdXNlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90d2lzdHkgc3ltYm9sMS5KUEcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90d2lzdHkgc3ltYm9sMS5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjExYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHdpc3R5IHN5bWJvbDEuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW1hX2h1bXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW1hX2h1bXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VtYV9odW1wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VuZGVybGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bmRlcmxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc2OGM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VuZGVybGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlLkpQRyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2UuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjM2OGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2UuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyODM5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlRvb2wgSW50ZXJmYWNlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibGlicmFyeXZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ic2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Ub29sIEludGVyZmFjZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Ij48YSBuYW1lPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Ub29sIEludGVyZmFjZTwvaDE+Ci08ZGl2PjxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZAotRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZTo8L3A+Ci08cD48aW1nIHNyYz0idXNlcmludGVyZmFjZS5KUEciIGFsdD0iIiAvPjwvcD4KLTxkaXYgY2xhc3M9InAiPjx1bD48bGk+PHN0cm9uZz5Db25maWd1cmF0aW9uIGRyb3AtZG93biBzZWxlY3Rpb24gYm94PC9zdHJvbmc+IC0gVGhlIGNvbmZpZ3VyYXRpb24gZHJvcC1kb3duCi1zZWxlY3Rpb24gYm94IGFsbG93cyB5b3UgdG8gc2VsZWN0IGEgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Y29uZmlndXJhdGlvbjwvYT4gaW4gd2hpY2ggdG8gd29yay4gPC9saT4KLTxsaT48c3Ryb25nPk9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uPC9zdHJvbmc+IC0gQ2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uCi10byBzZWxlY3QgYSA8YSBocmVmPSJwZXJzcGVjdGl2ZXMuaHRtbCNwZXJzcGVjdGl2ZXMiPnBlcnNwZWN0aXZlPC9hPi4KLVRoZXJlIGFyZSB0d28gcGVyc3BlY3RpdmVzIHRvIHNlbGVjdCBmcm9tOiBUaGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi4gPC9saT4KLTxsaT48c3Ryb25nPkxpYnJhcnkgVmlldzwvc3Ryb25nPiAtIFRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5Ci1WaWV3PC9hPiBkaXNwbGF5cyB0aGUgTWV0aG9kIFBsdWctaW5zIGFuZCBDb25maWd1cmF0aW9ucyBjb250YWluZWQgaW4gYQotTWV0aG9kIExpYnJhcnkuPC9saT4KLTxsaT48c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiAtIFRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+IHNob3dzIHRoZSBjb250ZW50IGVsZW1lbnRzIGluIGEgbGlicmFyeQotZmlsdGVyZWQgYnkgYSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+PHN0cm9uZz5Db250ZW50IEVkaXRvcnMgYW5kIFByZXZpZXc8L3N0cm9uZz4gLSBXaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nCi1QZXJzcGVjdGl2ZTwvYT4sIHRoZSB3aW5kb3cgb24gdGhlIHJpZ2h0IHNpZGUgb2YgeW91ciBzY3JlZW4gY29udGFpbnMgY29udGVudAotZWRpdG9ycywgd2hpY2ggYWxsb3cgeW91IHRvIGNyZWF0ZSBvciBtb2RpZnkgZWxlbWVudCB0eXBlcy4gV2hlbiB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcKLVBlcnNwZWN0aXZlPC9hPiBpcyBvcGVuLCB0aGUgd2luZG93IG9uIHRoZSByaWdodCBjb250YWlucyBhIHByZXZpZXcgb2YKLXlvdXIgY29udGVudCBhcyBpdCB3aWxsIGFwcGVhciBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS48L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPG9sPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwiPkxpYnJhcnkgVmlldzwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0ic2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sIj5TZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50PC9hPjxiciAvPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjE2NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0b3BpYyIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJVc2VyIFJvbGVzIGFuZCBSb2xlIFNwZWNpZmljIFRhc2tzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InVzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlVzZXIgUm9sZXMgYW5kIFJvbGUgU3BlY2lmaWMgVGFza3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InVzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzIj48YSBuYW1lPSJ1c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzZXIgUm9sZXMgYW5kIFJvbGUgU3BlY2lmaWMgVGFza3M8L2gxPgotPGRpdj48cD5UaGVyZSBhcmUgZm91ciBwcmltYXJ5IHJvbGVzIHBsYXllZCBieSB0aGUgdXNlcnMgb2YgdGhpcyB0b29sOjwvcD4KLTx1bD48bGk+TWV0aG9kIEF1dGhvcjwvbGk+Ci08bGk+UHJvY2VzcyBBdXRob3I8L2xpPgotPGxpPlByb2Nlc3MgQ29uZmlndXJhdG9yPC9saT4KLTxsaT5QcmFjdGl0aW9uZXI8L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+TWV0aG9kIEF1dGhvcjwvc3Ryb25nPiAtIFRoZSBNZXRob2QgQXV0aG9yIHVzZXMgdGhlIHRvb2wgb24gYSByZWd1bGFyIGJhc2lzCi10byBwcm92aWRlIHN0YW5kYXJkIHByb2Nlc3NlcyBmb3IgdXNlIGluIGFuIG9yZ2FuaXphdGlvbi4gVGhlIE1ldGhvZCBBdXRob3IKLXVzZXMgdGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdG9vbCB0bzo8dWw+PGxpPkNyZWF0ZSBwbHVnLWlucy48L2xpPgotPGxpPkNyZWF0ZSBuZXcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+RXh0ZW5kIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGJ5IHJldXNpbmcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBieSByZXVzaW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSBjdXN0b20gY2F0ZWdvcmllcyBmb3IgdXNlIGFzIHZpZXdzIGluIGEgY29uZmlndXJhdGlvbi48L2xpPgotPGxpPkNyZWF0ZSBhbmQgbW9kaWZ5IGNvbmZpZ3VyYXRpb25zLjwvbGk+Ci08bGk+UHVibGlzaCBjb25maWd1cmF0aW9ucyBvciBwcm9jZXNzZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+UHJvY2VzcyBBdXRob3I8L3N0cm9uZz4gLSBUaGUgUHJvY2VzcyBBdXRob3IncyBnb2FsIGlzIHRvIHByb2R1Y2UgYSBkZWxpdmVyeQotcHJvY2VzcyBmb3IgdGhlaXIgcHJvamVjdChzKSBieSByZXVzaW5nIG1ldGhvZCBlbGVtZW50cy4gVGhlIFByb2Nlc3MgQXV0aG9yCi11c2VzIHRoZSB0b29sIG9jY2FzaW9uYWxseSwgYXMgcHJvamVjdCBuZWVkcyBkaWN0YXRlLCB0eXBpY2FsbHkgc3VwcG9ydGluZwotb25lIG9yLCBtb3JlIGxpa2VseSwgc2V2ZXJhbCBwcm9qZWN0cyBieSBzcGVjaWZ5aW5nIHRoZSBwcm9jZXNzZXMgdG8gYmUgZm9sbG93ZWQuCi1UaGUgUHJvY2VzcyBBdXRob3IgdXNlcyB0aGUgcHJvY2VzcyBhdXRob3JpbmcgYW5kIGNvbmZpZ3VyYXRpb24gcHVibGlzaGluZwotZnVuY3Rpb25hbGl0eSBvZiB0aGlzIHRvb2wgdG86PHVsPjxsaT5DcmVhdGUgcGx1Zy1pbnMuPC9saT4KLTxsaT5DcmVhdGUgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBieSByZXVzaW5nIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSBkZWxpdmVyeSBwcm9jZXNzZXMgYnkgcmV1c2luZyBjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5DcmVhdGUgY3VzdG9tIGNhdGVnb3JpZXMgZm9yIHVzZSBhcyB2aWV3cyBpbiBhIGNvbmZpZ3VyYXRpb24uIDwvbGk+Ci08bGk+Q3JlYXRlIGFuZCBtb2RpZnkgY29uZmlndXJhdGlvbnMuPC9saT4KLTxsaT5QdWJsaXNoIGNvbmZpZ3VyYXRpb25zIG9yIHByb2Nlc3Nlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5Qcm9jZXNzIENvbmZpZ3VyYXRvcjwvc3Ryb25nPiAtIFRoZSBQcm9jZXNzIENvbmZpZ3VyYXRvcidzIGdvYWwgaXMgdG8gcHJvZHVjZQotYSBkZWxpdmVyeSBwcm9jZXNzIGZvciB0aGVpciBwcm9qZWN0KHMpIGJ5IHJhcGlkbHkgbGV2ZXJhZ2luZyByZWFkeS1tYWRlIHBsdWctaW5zLgotVGhlIFByb2Nlc3MgQ29uZmlndXJhdG9yIHVzZXMgdGhpcyB0b29sIG9jY2FzaW9uYWwsIGFzIHByb2plY3QgbmVlZHMgZGljdGF0ZSwKLXR5cGljYWxseSBzdXBwb3J0aW5nIG9uZSBvciBzZXZlcmFsIHByb2plY3RzIGJ5IHNwZWNpZnlpbmcgdGhlIHByb2Nlc3MgZm9yCi10aGUgcHJvamVjdHMuIFRoZSBQcm9jZXNzIENvbmZpZ3VyYXRvciB1c2VzIHRoZSBjb25maWd1cmF0aW9uCi1wdWJsaXNoaW5nIGZ1bmN0aW9uYWxpdHkgaW4gdGhpcyB0b29sIHRvOjx1bD48bGk+Q3JlYXRlIGFuZCBtb2RpZnkgY29uZmlndXJhdGlvbnMuPC9saT4KLTxsaT5QdWJsaXNoIGNvbmZpZ3VyYXRpb25zIG9yIHByb2Nlc3Nlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+PHN0cm9uZz5QcmFjdGl0aW9uZXI8L3N0cm9uZz4gLSBBIFByYWN0aXRpb25lcidzIGdvYWwgaXMgdG8gY29ycmVjdGx5IHVzZSB0aGUgb3JnYW5pemF0aW9uJ3MKLXByb2Nlc3NlcyBhbmQgYmVzdCBwcmFjdGljZXMgZWZmZWN0aXZlbHkuIEEgUHJhY3RpdGlvbmVyIHVzZXMgYSBwdWJsaXNoZWQKLWNvbmZpZ3VyYXRpb24gb24gYSByZWd1bGFyIGJhc2lzIGRyaXZlbiBieSB0aGUgd29yayBiZWluZyBwZXJmb3JtZWQgdG8gdmlldwotcHJvY2Vzc2VzIGFuZCBtZXRob2RzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFhOWI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29udHJpYnV0ZXMuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icmVwbGFjZS5odG1sI3JlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHRlbmRzLmh0bWwjZXh0ZW5kcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5WYXJpYWJpbGl0eTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idmFyaWFiaWxpdHkiPjxhIG5hbWU9InZhcmlhYmlsaXR5Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFyaWFiaWxpdHk8L2gxPgotPGRpdj48cD5WYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2UKLW9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nCi10aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcKLXRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC48L3A+Ci08cD5WYXJpYWJpbGl0eSBhbGxvd3MgeW91IHRvIGZhY3RvciB5b3VyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkCi11bml0cyBhbmQgdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kCi1lYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gVmFyaWFiaWxpdHkgYWxzbyBhbGxvd3MgeW91IHRvIGV4dGVuZCBhbmQKLXRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHlvdSBkbyBub3Qgb3duIGFuZCBjYW5ub3QgZGlyZWN0bHkgbW9kaWZ5LAotYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5aW5nIHlvdXIgcGVyc29uYWwKLWNoYW5nZXMgdG8gdGhlIHVwZ3JhZGVzLjwvcD4KLTxwPlRoZSB1c2Ugb2YgdmFyaWFiaWxpdHkgYWZmZWN0cyB0d28gY2hhcmFjdGVyaXN0aWNzIG9mIGEgbWV0aG9kIGVsZW1lbnQ6Ci1pdHMgYXR0cmlidXRlcyBhbmQgaXRzIHJlbGF0aW9uc2hpcHMgd2l0aCBvdGhlciBjb250ZW50IGVsZW1lbnRzLiBJZiBhbiBlbGVtZW50Ci1hbGxvd3MgdmFyaWFiaWxpdHksIHRoZSBzcGVjaWZpY2F0aW9uIGlzIHNob3duIGF0IHRoZSBib3R0b20gb2YgdGhlIGVsZW1lbnQncwotZGVzY3JpcHRpb24gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJwIj5Gb3IgdGhlIHB1cnBvc2VzIG9mIHZhcmlhYmlsaXR5LCB0aGVyZSBhcmUgdGhyZWUgZ3JvdXBzIG9mIGluZm9ybWF0aW9uCi1mb3IgYW55IGVsZW1lbnQgdG8gYmUgY29uc2lkZXJlZDo8dWw+PGxpPjxzdHJvbmc+QXR0cmlidXRlczwvc3Ryb25nPiAtIHBpZWNlcyBvZiBkYXRhIGFib3V0IGFuIGVsZW1lbnQgc3VjaCBhcyBNYWluIERlc2NyaXB0aW9uLjwvbGk+Ci08bGk+PHN0cm9uZz5JbmNvbWluZyBBc3NvY2lhdGlvbnM8L3N0cm9uZz4gLSBhc3NvY2lhdGlvbnMgdG8gb3RoZXIgZWxlbWVudHMgd2hlcmUgdGhlCi1hc3NvY2lhdGlvbiByZWZlcmVuY2UgaXMgaGVsZCBpbiB0aGUgb3RoZXIgZWxlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRoZSBvdGhlcgotZWxlbWVudCBoYXMgcmVmZXJlbmNlcyB0byB0aGUgc3ViamVjdCBlbGVtZW50LjwvbGk+Ci08bGk+PHN0cm9uZz5PdXRnb2luZyBBc3NvY2lhdGlvbnM8L3N0cm9uZz4gLSBhc3NvY2lhdGlvbnMgdG8gb3RoZXIgZWxlbWVudHMgd2hlcmUgdGhlCi1hc3NvY2lhdGlvbiByZWZlcmVuY2UgaXMgaGVsZCBpbiB0aGUgc3ViamVjdCBlbGVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhlCi1zdWJqZWN0IGVsZW1lbnQgaGFzIHJlZmVyZW5jZXMgdG8gdGhlIG90aGVyIGVsZW1lbnQuPC9saT4KLTwvdWw+Ci1JbiBhZGRpdGlvbiwgYXNzb2NpYXRpb25zIGNhbiBiZSBvbmUtdG8tb25lIG9yIG9uZS10by1tYW55LiBTZWUgPGEgaHJlZj0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9hPiBmb3IKLWEgZnVsbCBsaXN0IG9mIHRoZSBhc3NvY2lhdGlvbnMgZm9yIGVhY2ggdHlwZSBvZiBlbGVtZW50LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlZhcmlhYmlsaXR5IFR5cGU8L2g0PjxkaXYgY2xhc3M9InAiPlZhcmlhYmlsaXR5Ci10eXBlIGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgb25lIGVsZW1lbnQgYWZmZWN0cyBhbm90aGVyIGVsZW1lbnQgdXNpbmcgdmFyaWFiaWxpdHkuCi1UaGUgdmFyaWFiaWxpdHkgdHlwZXMgYXJlOjx1bD48bGk+PHN0cm9uZz5Ob3QgQXBwbGljYWJsZTwvc3Ryb25nPiAtIFRoZSBlbGVtZW50IGlzIGEgYmFzZSBlbGVtZW50IGFuZCBkb2VzIG5vdCBhZmZlY3QKLWFub3RoZXIgZWxlbWVudCB0aHJvdWdoIHZhcmlhYmlsaXR5LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFuIGVsZW1lbnQncwotdmFyaWFiaWxpdHkgdHlwZS48L2xpPgotPC91bD4KLTx1bD48bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+Q29udHJpYnV0ZXM8L3NwYW4+PC9zdHJvbmc+IC0KLUEgY29udHJpYnV0aW5nIGVsZW1lbnQgYWRkcyB0byB0aGUgYmFzZSBlbGVtZW50LiBDb250cmlidXRlcyBwcm92aWRlcyBhIHdheQotZm9yIGVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgZWxlbWVudCB3aXRob3V0Ci1kaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIHN1Y2ggYXMgaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4KLVRoZSBlZmZlY3QsIGFmdGVyIGNvbnRyaWJ1dGlvbiwgaXMgdGhhdCB0aGUgYmFzZSBlbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZAotd2l0aCBhbiBlbGVtZW50IHRoYXQgY29tYmluZXMgdGhlIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyBvZiB0aGUgY29udHJpYnV0aW5nCi1lbGVtZW50IHdpdGggdGhlIGJhc2UgZWxlbWVudC48L2xpPgotPC91bD4KLTx1bD48bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UmVwbGFjZXM8L3NwYW4+PC9zdHJvbmc+IC0KLUEgcmVwbGFjaW5nIGVsZW1lbnQgcmVwbGFjZXMgcGFydHMgb2YgdGhlIGJhc2UgZWxlbWVudC4gUmVwbGFjZXMgcHJvdmlkZXMKLWEgd2F5IGZvciBhbiBlbGVtZW50IHRvIHJlcGxhY2UgYSBiYXNlIGVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkKLW9mIHRoZSBiYXNlIGVsZW1lbnQncyBleGlzdGluZyBwcm9wZXJ0aWVzLiBUaGlzIGlzLCBpbiBtb3N0IGNhc2VzLCB1c2VkIGZvcgotbWV0aG9kIHBsdWctaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgY29udGVudCBlbGVtZW50cyBzdWNoIGFzIHJvbGVzLAotdGFza3MsIG9yIGFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZWx5IG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSB0aGUKLWZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMuIFRoZSBlZmZlY3Qgb2YgdGhpcywgaXMgdGhhdCB0aGUKLWJhc2UgY29udGVudCBlbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuZXcgcmVwbGFjaW5nIGVsZW1lbnQKLXRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5Ci1uZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy48L2xpPgotPC91bD4KLTx1bD48bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+RXh0ZW5kczwvc3Bhbj48L3N0cm9uZz4gLQotQW4gZXh0ZW5kaW5nIGVsZW1lbnQgaW5oZXJpdHMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBiYXNlIGVsZW1lbnQuIEV4dGVuc2lvbgotYWxsb3dzIE1ldGhvZCBQbHVnLWlucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIGJhc2UgcGx1Zy1pbiBieSBwcm92aWRpbmcKLWEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIGV4dGVuZGluZyBlbGVtZW50LiBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbgotaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgImJhc2VkLW9uIiBlbGVtZW50IHRvIHRoZSBleHRlbmRpbmcgZWxlbWVudC4KLVRoZSByZXN1bHQgaXMgdGhhdCB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlICJiYXNlZC1vbiIKLWVsZW1lbnQsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuIEV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5Ci1jb250ZW50IG9mIHRoZSBiYXNlIHBsdWctaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nCi1wbHVnLWluIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkLgotRm9yIGV4YW1wbGUsIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUKLW9mIHJldmlldy4gVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgZWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcKLWVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdGhyb3VnaCB0aGUgZXh0ZW5kcwotcmVsYXRpb25zaGlwLiBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgY2FwYWJpbGl0eQotcGF0dGVybnMgdG8gcHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcAotZnJvbSBhbiBhY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgcHJvY2Vzc2VzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZQotYWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb24gaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMKLXRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBwcm9jZXNzIGFmdGVyIGludGVycHJldGF0aW9uLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY29udHJpYnV0ZXMuaHRtbCI+Q29udHJpYnV0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImV4dGVuZHMuaHRtbCNleHRlbmRzIj5FeHRlbmRzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWEzZDJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPjxhIG5hbWU9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgaW5jb21pbmcgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9ucyBmb3IgZWFjaAotZWxlbWVudCB0eXBlIGZvciB3aGljaCB2YXJpYWJpbGl0eSBjYW4gYmUgdXNlZC4gQXNzb2NpYXRpb25zIGFsc28gaGF2ZSBhIGNhcmRpbmFsaXR5Ci1vZiB0by1tYW55IG9yIHRvLW9uZS4KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0ciB2YWxpZ249ImJvdHRvbSI+PHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iZDBlMTYiPkVsZW1lbnQgVHlwZTwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJkMGUxOCI+QXNzb2NpYXRlZCBFbGVtZW50IFR5cGU8L3RoPgotPHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iZDBlMjAiPkFzc29jaWF0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgcm93c3Bhbj0iOCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+V29yayBQcm9kdWN0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jb250YWluZWQgYXJ0aWZhY3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5kZWxpdmVyYWJsZSBwYXJ0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Z3VpZGFuY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNvbnRhaW5lciBhcnRpZmFjdDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRlbGl2ZXJhYmxlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cmVzcG9uc2libGUgcm9sZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmlucHV0IGFuZCBvdXRwdXQgdG8gdGFza3M8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSI0IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Sb2xlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yZXNwb25zaWJsZSBmb3Igd29yayBwcm9kdWN0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5ndWlkYW5jZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cGVyZm9ybWVyIGluIHRhc2s8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSI3IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5UYXNrPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5wcmltYXJ5IHBlcmZvcm1lciByb2xlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmFkZGl0aW9uYWwgcGVyZm9ybWVyIHJvbGVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5pbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmd1aWRhbmNlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5zdGVwczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5kaXNjaXBsaW5lPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2IGQwZTE4IGQwZTIwICI+Q2F0ZWdvcmllczwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5DdXN0b20gQ2F0ZWdvcnk8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIGVsZW1lbnRzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5vdGhlciBjdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSI0IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5EaXNjaXBsaW5lPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCB0YXNrczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cmVmZXJlbmNlZCB3b3JrZmxvdyBhY3Rpdml0eTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5kaXNjaXBsaW5lIGdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+RGlzY2lwbGluZSBHcm91cGluZzwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgZGlzY2lwbGluZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkRvbWFpbjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgd29yayBwcm9kdWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+c3ViLWRvbWFpbnM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnN1cGVyLWRvbWFpbnM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Xb3JrIFByb2R1Y3QgVHlwZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgd29yayBwcm9kdWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+Um9sZSBTZXQ8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHJvbGVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yb2xlIHNldCBncm91cGluZzwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlJvbGUgU2V0IEdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCByb2xlIHNldHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiBkMGUxOCBkMGUyMCAiPkd1aWRhbmNlPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlByYWN0aWNlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jb250ZW50IGVsZW1lbnQ8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPk90aGVyIEd1aWRhbmNlIFR5cGVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5zZWN0aW9ucyB2aWEgY29udGVudCBkZXNjcmlwdGlvbnM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9jb25mLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNWU2YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzQyYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jX3ZzX3AuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tY192c19wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmMWIwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jX3ZzX3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tZXRob2RhdXRob3JpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWV0aG9kYXV0aG9yaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOGRkMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tZXRob2RhdXRob3JpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2gzPgotPHA+TWV0aG9kIGNvbnRlbnQgZGVzY3JpYmVzIHJvbGVzLCB0aGUgdGFza3MgdGhhdCB0aGV5IHBlcmZvcm0sIHRoZSB3b3JrIHByb2R1Y3RzCi0gIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkIGJ5IHRob3NlIHRhc2tzLCBhbmQgc3VwcG9ydGluZyBndWlkYW5jZS48L3A+Ci08cD48aW1nIHNyYz0ibWMuZ2lmIj48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIGRlcGljdHMgdHlwaWNhbCBzb3VyY2VzIGZvciBtZXRob2QgY29udGVudCwgYXMgd2VsbCBhcyBob3cKLSAgdGhlIG1ldGhvZCBjb250ZW50IGlzIHJlcHJlc2VudGVkIGluIEVQRiBDb21wb3Nlci4gTWFueSBkZXZlbG9wbWVudCBtZXRob2RzIGFyZSBkZXNjcmliZWQKLSAgaW4gcHVibGljYXRpb25zIHN1Y2ggYXMgYm9va3MsIGFydGljbGVzLCB0cmFpbmluZyBtYXRlcmlhbCwgc3RhbmRhcmRzIGFuZCByZWd1bGF0aW9ucywKLSAgYW5kIG90aGVyIGZvcm1zIG9mIGRvY3VtZW50YXRpb24uIFRoZXNlIHNvdXJjZXMgdXN1YWxseSBkb2N1bWVudCBtZXRob2RzIGJ5Ci0gIHByb3ZpZGluZyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgd2F5IG9mIGFjaGlldmluZyBhIHNwZWNpZmljCi0gIGRldmVsb3BtZW50IGdvYWwgdW5kZXIgZ2VuZXJhbCBjaXJjdW1zdGFuY2VzLiBTb21lIGV4YW1wbGVzIGFyZTogdHJhbnNmb3JtaW5nCi0gIGEgcmVxdWlyZW1lbnRzIGRvY3VtZW50IGludG8gYW4gYW5hbHlzaXMgbW9kZWw7IGRlZmluaW5nIGFuIGFyY2hpdGVjdHVyYWwgbWVjaGFuaXNtCi0gIGJhc2VkIG9uIGZ1bmN0aW9uYWwgYW5kIG5vbi1mdW5jdGlvbmFsIHJlcXVpcmVtZW50czsgY3JlYXRpbmcgYSBwcm9qZWN0IHBsYW4KLSAgZm9yIGEgZGV2ZWxvcG1lbnQgaXRlcmF0aW9uOyBkZWZpbmluZyBhIHF1YWxpdHkgYXNzdXJhbmNlIHBsYW4gZm9yIGZ1bmN0aW9uYWwKLSAgcmVxdWlyZW1lbnRzOyByZWRlc2lnbmluZyBhIGJ1c2luZXNzIG9yZ2FuaXphdGlvbiBiYXNlZCBvbiBhIG5ldyBzdHJhdGVnaWMgZGlyZWN0aW9uLAotICBhbmQgc28gb24uPC9wPgotPHA+RVBGIENvbXBvc2VyIHRha2VzIGNvbnRlbnQgc3VjaCBhcyB0aGF0IGRlc2NyaWJlZCBhYm92ZSwgYW5kIHN0cnVjdHVyZXMgaXQgaW4gYSBzcGVjaWZpYwotICBzY2hlbWEgb2Ygcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIFRoaXMgc2NoZW1hIHN1cHBvcnRzIHRoZQotICBvcmdhbml6YXRpb24gb2YgbGFyZ2UgYW1vdW50cyBvZiBkZXNjcmlwdGlvbnMgZm9yIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4KLSAgU3VjaCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGRvIG5vdCBoYXZlIHRvIGJlIGxpbWl0ZWQgdG8gc29mdHdhcmUgZW5naW5lZXJpbmcsCi0gIGJ1dCBjYW4gYWxzbyBjb3ZlciBvdGhlciBkZXNpZ24gYW5kIGVuZ2luZWVyaW5nIGRpc2NpcGxpbmVzIHN1Y2ggYXMgbWVjaGFuaWNhbAotICBlbmdpbmVlcmluZywgYnVzaW5lc3MgdHJhbnNmb3JtYXRpb24sIHNhbGVzIGN5Y2xlcywgYW5kIHNvIG9uLjwvcD4KLTxwPiBUaGUgRVBGIENvbXBvc2VyIHNjcmVlbiBjYXB0dXJlIGluIHRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHN1Y2ggbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMKLSAgYXJlIG9yZ2FuaXplZCBpbiB0cmVlIGJyb3dzZXJzIG9uIHRoZSBsZWZ0LiBUaGVzZSB0cmVlIGJyb3dzZXJzLCBzaW1pbGFyIHRvCi0gIGEgbGlicmFyeSwgcHJvdmlkZSBkaWZmZXJlbnQgaW5kZXhlcyBvZiB0aGUgYXZhaWxhYmxlIGVsZW1lbnRzIGZvciByYXBpZCBhY2Nlc3MuCi0gIFRoZSBzY3JlZW4gY2FwdHVyZSBzaG93cyBvbiB0aGUgcmlnaHQgYW4gZXhhbXBsZSBvZiBhIHRhc2sgcHJlc2VudGF0aW9uLiBUaGlzCi0gIHRhc2sgcHJlc2VudGF0aW9uIGRlZmluZXMgdGhlIHRhc2sgaW4gdGVybXMgb2Ygc3RlcHMgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZAotICB0byBhY2hpZXZlIHRoZSB0YXNrJ3MgcHVycG9zZS4gWW91IGNhbiBzZWUgdGhhdCB0aGUgdGFzayBoYXMgdmFyaW91cyByZWxhdGlvbnNoaXBzLAotICBzdWNoIGFzIHJlbGF0aW9uc2hpcHMgdG8gcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHdvcmsgcHJvZHVjdHMgdGhhdCBzZXJ2ZQotICBhcyBpbnB1dHMgYW5kIG91dHB1dHMgdG8gdGhlIHRhc2suIEZpbmQgb3V0IG1vcmUgZGV0YWlscyBvbiB0YXNrcywgcm9sZSwgYW5kCi0gIHdvcmsgcHJvZHVjdHMgaW4gdGhlIG9ubGluZSBoZWxwIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5oZXJlPC9hPi4KLSAgSW4gYWRkaXRpb24gdG8gcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cywgRVBGIENvbXBvc2VyIHN1cHBvcnRzIHRoZSBhZGRpdGlvbiBvZgotICBndWlkYW5jZSBlbGVtZW50cy4gR3VpZGFuY2UgYXJlIHN1cHBsZW1lbnRhcnkgZnJlZS1mb3JtIGRvY3VtZW50YXRpb24gc3VjaCBhcwotICB3aGl0ZXBhcGVycywgY29uY2VwdCBkZXNjcmlwdGlvbnMsIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgZXhhbXBsZXMsIGFuZCBzbyBvbi48L3A+Ci08cD5FUEYgQ29tcG9zZXIgcHJvdmlkZXMgdmFyaW91cyBmb3JtLWJhc2VkIGVkaXRvcnMgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBlbGVtZW50cy4KLSAgRG9jdW1lbnQgeW91ciB0YXNrLCByb2xlcywgd29yayBwcm9kdWN0cywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzIHVzaW5nIGludHVpdGl2ZQotICByaWNoLXRleHQgZWRpdG9ycyB0aGF0IGFsbG93IHlvdSB0byBjb3B5IGFuZCBwYXN0ZSB0ZXh0IGZyb20gb3RoZXIgc291cmNlcyBzdWNoCi0gIGFzIHdlYiBwYWdlcyBvciBkb2N1bWVudHMuIFVzZSBzaW1wbGUgZGlhbG9ncyB0byBlc3RhYmxpc2ggcmVsYXRpb25zaGlwcyBiZXR3ZWVuCi0gIGNvbnRlbnQgZWxlbWVudHMuPC9wPgotPHA+RVBGIENvbXBvc2VyIG9yZ2FuaXplcyBjb250ZW50IGluIHBoeXNpY2FsIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhbGxvdyB5b3UgdG8gbWFuYWdlCi0gIHlvdXIgY29udGVudCBpbiBjb25maWd1cmFibGUgdW5pdHMuIEVQRiBDb21wb3NlciBhbHNvIGFsbG93cyB5b3UgdG8gY2F0ZWdvcml6ZSB5b3VyIGNvbnRlbnQKLSAgYmFzZWQgb24gYSBzZXQgb2YgcHJlZGVmaW5lZCBjYXRlZ29yaWVzIChmb3IgZXhhbXBsZSwgY2F0ZWdvcml6ZSB5b3VyIHRhc2tzCi0gIGludG8gZGV2ZWxvcG1lbnQgZGlzY2lwbGluZXMsIG9yIHlvdXIgd29yayBwcm9kdWN0cyBpbnRvIGRvbWFpbnMpIG9yIGNyZWF0ZQotICB5b3VyIG93biBjYXRlZ29yaXphdGlvbiBzY2hlbWVzIGZvciB5b3VyIGNvbnRlbnQgd2l0aCB5b3VyIG93biB1c2VyLWRlZmluZWQKLSAgY2F0ZWdvcmllcyB0aGF0IGFsbG93IHlvdSB0byBpbmRleCBjb250ZW50IGluIGFueSB3YXkgeW91IHdhbnQuPC9wPgotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBtZXRob2QgY29udGVudCBhdXRob3Jpbmcgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5NZXRob2QKLSAgICAgIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9vdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9vdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2Y5MTQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aGVhZD4KLTx0aXRsZT5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPkludHJvZHVjdGlvbiB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpPC9oMz4KLTxwPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKS4gRVBGIENvbXBvc2VyIGlzIGEgdG9vbCBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMKLSAgcHJvY2VzcyBlbmdpbmVlcnMgYW5kIG1hbmFnZXJzIHRvIGltcGxlbWVudCwgZGVwbG95LCBhbmQgbWFpbnRhaW4gcHJvY2Vzc2VzCi0gIGZvciBvcmdhbml6YXRpb25zIG9yIGluZGl2aWR1YWwgcHJvamVjdHMuIFR5cGljYWxseSwgdHdvIGtleSBwcm9ibGVtcyBuZWVkIHRvCi0gIGJlIGFkZHJlc3NlZCB0byBzdWNjZXNzZnVsbHkgZGVwbG95IG5ldyBwcm9jZXNzZXMuPC9wPgotPHA+IEZpcnN0LCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIGJlIGVkdWNhdGVkIG9uIHRoZSBtZXRob2RzIGFwcGxpY2FibGUgdG8KLSAgdGhlIHJvbGVzIHRoYXQgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiBTb2Z0d2FyZSBkZXZlbG9wZXJzIHR5cGljYWxseSBuZWVkCi0gIHRvCi0gIGxlYXJuCi0gIGhvdwotICB0bwotICBkbyBhbmFseXNpcyBhbmQgZGVzaWduLCB0ZXN0ZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvIHRlc3QgaW1wbGVtZW50YXRpb25zIGFnYWluc3QKLSAgIHJlcXVpcmVtZW50cywgbWFuYWdlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gbWFuYWdlIHRoZSBwcm9qZWN0IHNjb3BlIGFuZCBjaGFuZ2UsCi0KLSAgYW5kIHNvIG9uLiBTb21lIG9yZ2FuaXphdGlvbnMgYXNzdW1lIHRoYXQgZGV2ZWxvcGVycyBpbXBsaWNpdGx5IGtub3cgaG93IHRvCi0gICBkbyBzdWNoIHdvcmsgd2l0aG91dCBkb2N1bWVudGluZyB0aGVpciBtZXRob2RzLCBidXQgbWFueSBvcmdhbml6YXRpb25zIHdhbnQKLQotICB0byBlc3RhYmxpc2ggY29tbW9uIGFuZCByZWd1bGF0ZWQgcHJhY3RpY2VzLCB0byBkcml2ZSBzcGVjaWZpYyBpbXByb3ZlbWVudAotICBvYmplY3RpdmVzLCAgYW5kIHRvIG1lZXQgY29tcGxpYW5jZSBzdGFuZGFyZHMuPC9wPgotPHA+IFNlY29uZCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0byBhcHBseSB0aGVzZSBtZXRob2RzIHRocm91Z2hvdXQKLSAgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFRoYXQgaXMsIHRoZXkgbmVlZCB0byBkZWZpbmUgb3Igc2VsZWN0IGEgZGV2ZWxvcG1lbnQKLSAgcHJvY2Vzcy4gRm9yCi0KLSAgZXhhbXBsZSwgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQgbWV0aG9kcyBoYXZlIHRvIGJlIGFwcGxpZWQgZGlmZmVyZW50bHkgaW4KLSAgZWFybHkgIHBoYXNlcyBvZiBhIHByb2plY3Qgd2hlcmUgdGhlIGZvY3VzIGlzIG9uIGVsaWNpdGF0aW9uIG9mIHN0YWtlaG9sZGVyCi0gIG5lZWRzIGFuZAotICByZXF1aXJlbWVudHMgYW5kIHNjb3BpbmcgYSB2aXNpb24sIHRoYW4gaW4gbGF0ZXIgcGhhc2VzIHdoZXJlIHRoZSBmb2N1cyBpcwotICBvbiAgbWFuYWdpbmcgcmVxdWlyZW1lbnRzIHVwZGF0ZXMgYW5kIGNoYW5nZXMgYW5kIHBlcmZvcm1pbmcgaW1wYWN0IGFuYWx5c2lzCi0gIG9mCi0gIHRoZXNlIHJlcXVpcmVtZW50cyBjaGFuZ2VzLiBUZWFtcyBhbHNvIG5lZWQgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlCi0gIGRpZmZlcmVudCAgdGFza3Mgb2YgdGhlIG1ldGhvZHMgcmVsYXRlIHRvIGVhY2ggb3RoZXIsIGZvciBleGFtcGxlLCBob3cgdGhlCi0gIGNoYW5nZSBtYW5hZ2VtZW50Ci0gIG1ldGhvZCBpbXBhY3RzIHRoZSByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2QgYXMgd2VsbCBhcyByZWdyZXNzaW9uIHRlc3RpbmcKLSAgIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIEV2ZW4gc2VsZi1vcmdhbml6aW5nIHRlYW1zIG5lZWQgdG8gZGVmaW5lCi0gIGEKLSAgcHJvY2VzcyB0aGF0IGdpdmVzIGF0IG1pbmltdW0gc29tZSBndWlkYW5jZSBvbiBob3cgdGhlIGRldmVsb3BtZW50IHdpbGwgYmUKLSAgc2NvcGVkICB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUsIHdoZW4gbWlsZXN0b25lcyB3aWxsIGJlIGFjaGlldmVkIGFuZCB2ZXJpZmllZCwKLSAgYW5kCi0gIHNvIG9uLiA8L3A+Ci08cD5UbyB0aGF0IGVuZCwgRVBGIENvbXBvc2VyIGhhcyB0d28gbWFpbiBwdXJwb3NlczogPC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+PHVsPgotICA8bGk+VG8gcHJvdmlkZSBhIGtub3dsZWRnZSBiYXNlIG9mIGludGVsbGVjdHVhbCBjYXBpdGFsIHdoaWNoIHlvdSBjYW4gYnJvd3NlLAotICAgIG1hbmFnZSBhbmQgZGVwbG95LiBUaGlzIGNvbnRlbnQgY2FuIGluY2x1ZGUgZXh0ZXJuYWxseSBkZXZlbG9wZWQgY29udGVudCwKLSAgICBhbmQsIG1vcmUgaW1wb3J0YW50bHksIGNhbiBpbmNsdWRlIHlvdXIgb3duIGNvbnRlbnQgaW5jbHVkaW5nIG9mIHdoaXRlcGFwZXJzLAotICAgIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgcHJpbmNpcGxlcywgYmVzdCBwcmFjdGljZXMsIGludGVybmFsIHByb2NlZHVyZXMgYW5kCi0gICAgcmVndWxhdGlvbnMsIHRyYWluaW5nIG1hdGVyaWFsLCBhbmQgYW55IG90aGVyIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHlvdXIKLSAgICBtZXRob2RzLiBUaGlzIGtub3dsZWRnZSBiYXNlIGNhbiB1c2VkIGZvciByZWZlcmVuY2UgYW5kIGVkdWNhdGlvbi4gSXQgYWxzbwotICAgIGZvcm1zIHRoZSBiYXNpcyBmb3IgZGV2ZWxvcGluZyBwcm9jZXNzZXMgKHRoZSBzZWNvbmQgcHVycG9zZSkuIEVQRiBDb21wb3NlciBpcyBkZXNpZ25lZAotICAgIHRvIGJlIGEgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0IHByb3ZpZGVzIGEgY29tbW9uIG1hbmFnZW1lbnQgc3RydWN0dXJlCi0gICAgYW5kIGxvb2sgYW5kIGZlZWwgZm9yIGFsbCBvZiB5b3VyIGNvbnRlbnQsIHJhdGhlciB0aGFuIGJlaW5nIGEgZG9jdW1lbnQgbWFuYWdlbWVudAotICAgIHN5c3RlbSBpbiB3aGljaCB5b3Ugd291bGQgc3RvcmUgYW5kIGFjY2VzcyBoYXJkIHRvIG1haW50YWluIGxlZ2FjeSBkb2N1bWVudHMKLSAgICBhbGwgaW4gdGhlaXIgb3duIHNoYXBlcyBhbmQgZm9ybWF0cy4gQWxsIGNvbnRlbnQgbWFuYWdlZCBpbiBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZAotICAgIHRvIGh0bWwgYW5kIGRlcGxveWVkIHRvIFdlYiBzZXJ2ZXJzIGZvciBkaXN0cmlidXRlZCB1c2FnZS48YnI+Ci0gIDwvbGk+Ci0gIDxsaT5UbyBwcm92aWRlIHByb2Nlc3MgZW5naW5lZXJpbmcgY2FwYWJpbGl0aWVzIGJ5IHN1cHBvcnRpbmcgcHJvY2VzcyBlbmdpbmVlcnMKLSAgICBhbmQgcHJvamVjdCBtYW5hZ2VycyBpbiBzZWxlY3RpbmcsIHRhaWxvcmluZywgYW5kIHJhcGlkbHkgYXNzZW1ibGluZyBwcm9jZXNzZXMKLSAgICBmb3IgdGhlaXIgY29uY3JldGUgZGV2ZWxvcG1lbnQgcHJvamVjdHMuIEVQRiBDb21wb3NlciBwcm92aWRlcyBjYXRhbG9ncyBvZiBwcmUtZGVmaW5lZAotICAgIHByb2Nlc3NlcyBmb3IgdHlwaWNhbCBwcm9qZWN0IHNpdHVhdGlvbnMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBpbmRpdmlkdWFsCi0gICAgbmVlZHMuIEl0IGFsc28gcHJvdmlkZXMgcHJvY2VzcyBidWlsZGluZyBibG9ja3MsIGNhbGxlZCBjYXBhYmlsaXR5IHBhdHRlcm5zLAotICAgIHRoYXQgcmVwcmVzZW50IGJlc3QgZGV2ZWxvcG1lbnQgcHJhY3RpY2VzIGZvciBzcGVjaWZpYyBkaXNjaXBsaW5lcywgdGVjaG5vbG9naWVzLAotICAgIG9yIG1hbmFnZW1lbnQgc3R5bGVzLiBUaGVzZSBidWlsZGluZyBibG9ja3MgZm9ybSBhIHRvb2xraXQgZm9yIHF1aWNrIGFzc2VtYmx5Ci0gICAgb2YgcHJvY2Vzc2VzIGJhc2VkIG9uIHByb2plY3Qtc3BlY2lmaWMgbmVlZHMuIEVQRiBDb21wb3NlciBhbHNvIGFsbG93cyB5b3UgdG8gc2V0IHVwCi0gICAgeW91ciBvd24gb3JnYW5pemF0aW9uLXNwZWNpZmljIGNhcGFiaWxpdHkgcGF0dGVybiBsaWJyYXJpZXMuIEZpbmFsbHksIHRoZQotICAgIHByb2Nlc3NlcyBjcmVhdGVkIHdpdGggRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQgYW5kIGRlcGxveWVkIGFzIFdlYiBzaXRlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGgzPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIncyBLZXkgQ2FwYWJpbGl0aWVzPC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBuZXcga2V5IGNhcGFiaWxpdGllczo8L3A+Ci0gIDxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+IFByb3ZpZGVzIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0b29scyBmb3IgYXV0aG9yaW5nLCBjb25maWd1cmluZywgdmlld2luZywKLSAgICBhbmQgcHVibGlzaGluZyBkZXZlbG9wbWVudCBwcm9jZXNzZXMuPC9saT4KLSAgPGxpPiBQcm92aWRlcyBqdXN0LWluLXRpbWUgZ2VuZXJhdGlvbiBvZiBwdWJsaWNhdGlvbiBwcmV2aWV3cyBpbiBkZWRpY2F0ZWQgYnJvd3NpbmcKLSAgICBwZXJzcGVjdGl2ZSB0aGF0IGFsbG93cyByYXBpZCBjb25maWd1cmF0aW9uIHN3aXRjaGluZy48L2xpPgotICA8bGk+IE1hbmFnZXMgbWV0aG9kIGNvbnRlbnQgdXNpbmcgc2ltcGxlIGZvcm0tYmFzZWQgdXNlciBpbnRlcmZhY2VzLiBUaGVyZWZvcmUsCi0gICAgVU1MIG1vZGVsaW5nIHNraWxscyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLjwvbGk+Ci0gIDxsaT4gUHJvdmlkZXMgaW50dWl0aXZlIHJpY2ggdGV4dCBlZGl0b3JzIGZvciBjcmVhdGluZyBpbGx1c3RyYXRpdmUgY29udGVudAotICAgIGRlc2NyaXB0aW9ucy4gRWRpdG9ycyBhbGxvdyB1c2Ugb2Ygc3R5bGVzLCBpbWFnZXMsIHRhYmxlcywgaHlwZXJsaW5rcywgYW5kCi0gICAgZGlyZWN0IGh0bWwgZWRpdGluZy48L2xpPgotICA8bGk+QWxsb3dzIGNyZWF0aW5nIHByb2Nlc3NlcyB3aXRoIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9ycyBhbmQgd29ya2Zsb3cKLSAgICBkaWFncmFtcyB0aHJvdWdoIHVzZSBvZiBtdWx0aS1wcmVzZW50YXRpb24gcHJvY2VzcyBlZGl0b3JzLiBCcmVha2Rvd24gc3RydWN0dXJlCi0gICAgZWRpdG9yIHN1cHBvcnRzIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzOiB3b3JrLWJyZWFrZG93biB2aWV3LCB3b3JrIHByb2R1Y3QKLSAgICB1c2FnZSB2aWV3LCBhbmQgdGVhbSBhbGxvY2F0aW9uIHZpZXcuIEVQRiBDb21wb3NlciBhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplcyBhbGwgcHJlc2VudGF0aW9ucwotICAgIHdpdGggcHJvY2VzcyBjaGFuZ2VzLiA8L2xpPgotICA8bGk+UHJvdmlkZXMgc3VwcG9ydCBmb3IgbWFueSBhbHRlcm5hdGl2ZSBsaWZlY3ljbGUKLSAgICBtb2RlbHMuIEZvciBleGFtcGxlLCB3YXRlcmZhbGwsIGluY3JlbWVudGFsLCBvciBpdGVyYXRpdmUgbW9kZWxzIGNhbiBiZSBjcmVhdGVkCi0gICAgd2l0aCB0aGUgc2FtZSBvdmVybGFwcGluZyBtZXRob2QgY29udGVudC48L2xpPgotICA8bGk+SW1wcm92ZWQgcmV1c2UgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzLiBUaGUgcGx1Zy1pbiBtZWNoYW5pc21zIGZyb20KLSAgICBwYXN0IHZlcnNpb25zIGhhdmUgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IGV4dGVuc2lvbnMgZm9yIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwvbGk+Ci0gIDxsaT5TdXBwb3J0cyByZXVzYWJsZSBkeW5hbWljYWxseS1saW5rZWQgcHJvY2VzcyBwYXR0ZXJucyBvZiBiZXN0IHByYWN0aWNlcwotICAgIGZvciByYXBpZCBwcm9jZXNzIGFzc2VtYmx5IHZpYSBkcmFnLWFuZC1kcm9wLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08aDM+S2V5IFRlcm1pbm9sb2d5IGFuZCBDb25jZXB0czwvaDM+Ci08cD5UbyBlZmZlY3RpdmVseSB3b3JrIHdpdGggRVBGIENvbXBvc2VyLCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIGEgZmV3IGNvbmNlcHRzCi0gIHRoYXQgYXJlIHVzZWQgdG8gb3JnYW5pemUgdGhlIGNvbnRlbnQuIFRoZSBwYWdlcyA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+TWV0aG9kCi0gIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj5Qcm9jZXNzCi0gIEF1dGhvcmluZyBPdmVydmlldzwvYT4gY29udGFpbiBtb3JlIGRldGFpbCBhbmQgY29uY3JldGUgZXhhbXBsZXMgb2YgaG93IHRvIHdvcmsKLSAgaW4gdGhlIHRvb2wuIFRoaXMgcGFnZSBwcm92aWRlcyB5b3Ugd2l0aCBhIGdlbmVyYWwgb3ZlcnZpZXcgb2YgdGhlc2UgY29uY2VwdHMuPC9wPgotPHA+VGhlIG1vc3QgZnVuZGFtZW50YWwgcHJpbmNpcGxlIGluIEVQRiBDb21wb3NlciBpcyB0aGUgc2VwYXJhdGlvbiBvZiByZXVzYWJsZSBjb3JlIG1ldGhvZAotICBjb250ZW50IGZyb20gaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gVGhpcyBkaXJlY3RseSByZWxhdGVzIGJhY2sgdG8gdGhlCi0gIHR3byBwdXJwb3NlcyBvZiBFUEYgQ29tcG9zZXIgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBzZWN0aW9uLiBBbG1vc3QgYWxsIG9mIEVQRiBDb21wb3NlcidzIGNvbmNlcHRzCi0gIGFyZSBjYXRlZ29yaXplZCBhbG9uZyB0aGlzIHNlcGFyYXRpb24uIE1ldGhvZCBjb250ZW50IGRlc2NyaWJlcyB3aGF0IGlzIHRvIGJlCi0gIHByb2R1Y2VkLCB0aGUgbmVjZXNzYXJ5IHNraWxscyByZXF1aXJlZCBhbmQgdGhlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZGVzY3JpYmluZwotICBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkLiBUaGVzZSBtZXRob2QgY29udGVudCBkZXNjcmlwdGlvbnMKLSAgYXJlIGluZGVwZW5kZW50IG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgZGVzY3JpYmUgdGhlIGRldmVsb3BtZW50Ci0gIGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZAotICBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy48L3A+Ci08cD48aW1nIHNyYz0idW1hX2h1bXAuZ2lmIj48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIHNob3dzIGhvdyB0aGlzIHNlcGFyYXRpb24gaXMgZGVwaWN0ZWQgaW4gQmFzaWMgVW5pZmllZAotICBQcm9jZXNzLiBNZXRob2QgY29udGVudCwgZGVzY3JpYmluZyBob3cgZGV2ZWxvcG1lbnQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQsCi0gIGlzIGNhdGVnb3JpemVkIGJ5IGRpc2NpcGxpbmVzIGFsb25nIHRoZSB5LWF4aXMgb2YgdGhlIGRpYWdyYW0uIFRoZSB3b3JrIGRlc2NyaWJlZAotICBpbiBhIHByb2Nlc3MgaXMgc2VlbiBhbG9uZyB0aGUgeC1heGlzIHJlcHJlc2VudGluZyB0aGUgdGltZWxpbmUuIFRoaXMgaXMgdGhlCi0gIGxpZmVjeWNsZSBvZiBhIGRldmVsb3BtZW50IHByb2plY3QuIEl0IGV4cHJlc3NlcyB3aGVuIHdoYXQgd29yayB3aWxsIGJlIHBlcmZvcm1lZC4KLSAgVGhlIGdyYXBoIGluIHRoZSBpbGx1c3RyYXRpb24gcmVwcmVzZW50cyBhbiBlc3RpbWF0ZWQgd29ya2xvYWQgZm9yIGVhY2ggZGlzY2lwbGluZS4KLSAgQXMgeW91IHNlZSwgZm9yIGV4YW1wbGUsIG9uZSBuZXZlciBzdG9wcyB3b3JraW5nIG9uIHJlcXVpcmVtZW50cyBpbiBSVVAsIGJ1dAotICB0aGVyZSBhcmUgY2VydGFpbmx5IHBlYWsgdGltZXMgaW4gd2hpY2ggbW9zdCBvZiB0aGUgcmVxdWlyZW1lbnRzIGVsaWNpdGF0aW9uCi0gIGFuZCBkZXNjcmlwdGlvbiB3b3JrIGlzIHBlcmZvcm1lZC4gVGhlcmUgYXJlIGFsc28gdGltZXMgYXQgd2hpY2ggYSBkb3dud2FyZAotICB0cmVuZCBuZWVkcyB0byBiZSBvYnNlcnZlZCB3aGVyZSBmZXdlciBhbmQgZmV3ZXIgcmVxdWlyZW1lbnRzIGNoYW5nZXMgaGF2ZSB0bwotICBiZSBwcm9jZXNzZWQgdG8gYnJpbmcgdGhlIHByb2plY3QgdG8gYSBjbG9zZS4gVGhpcyBhdm9pZHMgd2hhdCBpcyByZWZlcnJlZCB0bwotICBhcyBmZWF0dXJlIGNyZWVwIGluIHdoaWNoIHJlcXVpcmVtZW50cyB3b3JrIHJlbWFpbnMgY29uc3RhbnQgb3IgZXZlbiBpbmNyZWFzZXMuCi0gIEhlbmNlLCBhIGxpZmVjeWNsZSAocHJvY2VzcykgZXhwcmVzc2VzIHRoZSB2YXJpYW5jZXMgb2Ygd29yayBwZXJmb3JtZWQgaW4gdGhlCi0gIHZhcmlvdXMgZGlzY2lwbGluZXMgKG1ldGhvZCBjb250ZW50KS48L3A+Ci08cD48aW1nIHNyYz0ibWNfdnNfcC5naWYiPjwvcD4KLTxwPlRoZSBwaWN0dXJlIGFib3ZlIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiB0aGUga2V5IGVsZW1lbnRzIHVzZWQgaW4gRVBGIENvbXBvc2VyIGFuZCBob3cKLSAgdGhleSByZWxhdGUgdG8gbWV0aG9kIGNvbnRlbnQgb3IgcHJvY2Vzcy4gQXMgeW91IHNlZSwgbWV0aG9kIGNvbnRlbnQgaXMgcHJpbWFyaWx5Ci0gIGV4cHJlc3NlZCB1c2luZyB3b3JrIHByb2R1Y3RzLCByb2xlcywgdGFza3MsIGFuZCBndWlkYW5jZS4gR3VpZGFuY2UsIHN1Y2ggYXMKLSAgY2hlY2tsaXN0cywgZXhhbXBsZXMsIG9yIHJvYWRtYXBzLCBjYW4gYWxzbyBiZSBkZWZpbmVkIHRvIHByb3ZpZGUgZXhlbXBsYXJ5Ci0gIHdhbGt0aHJvdWdocyBvZiBhIHByb2Nlc3MuIE9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGRpYWdyYW0sIHlvdSBzZWUgdGhlCi0gIGVsZW1lbnRzIHVzZWQgdG8gcmVwcmVzZW50IHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuIFRoZSBtYWluIGVsZW1lbnQgaXMgdGhlIGFjdGl2aXR5Ci0gIHRoYXQgY2FuIGJlIG5lc3RlZCB0byBkZWZpbmUgYnJlYWtkb3duIHN0cnVjdHVyZXMgYXMgd2VsbCBhcyByZWxhdGVkIHRvIGVhY2gKLSAgb3RoZXIgdG8gZGVmaW5lIGEgZmxvdyBvZiB3b3JrLiBBY3Rpdml0aWVzIGFsc28gY29udGFpbiBkZXNjcmlwdG9ycyB0aGF0IHJlZmVyZW5jZQotICBtZXRob2QgY29udGVudC4gQWN0aXZpdGllcyBhcmUgdXNlZCB0byBkZWZpbmUgcHJvY2Vzc2VzIG9mIHdoaWNoIEVQRiBDb21wb3NlciBzdXBwb3J0Ci0gIHR3byBtYWluIGtpbmRzOiBkZWxpdmVyeSBwcm9jZXNzZXMgYW5kIGNhcGFiaWxpdHkgcGF0dGVybnMuIERlbGl2ZXJ5IHByb2Nlc3NlcwotICByZXByZXNlbnQgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBwcm9jZXNzIHRlbXBsYXRlIGZvciBwZXJmb3JtaW5nIG9uZSBzcGVjaWZpYwotICB0eXBlIG9mIHByb2plY3QuIFRoZXkgZGVzY3JpYmUgYSBjb21wbGV0ZSBlbmQtdG8tZW5kIHByb2plY3QgbGlmZWN5Y2xlIGFuZCBhcmUKLSAgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzLiBDYXBhYmlsaXR5Ci0gIHBhdHRlcm5zIGFyZSBwcm9jZXNzZXMgdGhhdCBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYQotICBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgZGlzY2lwbGluZSBvciBhIGJlc3QgcHJhY3RpY2UuIFRoZXkgYXJlIGFsc28KLSAgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgZGVsaXZlcnkgcHJvY2Vzc2VzIG9yIGxhcmdlciBjYXBhYmlsaXR5Ci0gIHBhdHRlcm5zLiBUaGlzIGVuc3VyZXMgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlaXIga2V5IGJlc3QgcHJhY3RpY2VzCi0gIGluIHByb2Nlc3MgYXV0aG9yaW5nIGFjdGl2aXRpZXMgaW4gRVBGIENvbXBvc2VyLiA8L3A+Ci0KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlciwgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwiPk92ZXJ2aWV3PC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbCI+R2V0dGluZwotICAgICAgU3RhcnRlZDwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiODY4ODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHJvY2Vzc2F1dGhvcmluZy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wcm9jZXNzYXV0aG9yaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzODQyMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wcm9jZXNzYXV0aG9yaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aGVhZD4KLTx0aXRsZT5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvaDM+Ci08cD5BIGRldmVsb3BtZW50IHByb2Nlc3MgZGVmaW5lcyBzZXF1ZW5jZXMgb2YgdGFza3MgcGVyZm9ybWVkIGJ5IHJvbGVzIGFuZCB3b3JrCi0gIHByb2R1Y3RzIHByb2R1Y2VkIG92ZXIgdGltZS48L3A+Ci08cD48aW1nIHNyYz0icC5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgdGhhdCBwcm9jZXNzZXMgYXJlIHR5cGljYWxseSBleHByZXNzZWQgYXMgd29ya2Zsb3dzCi0gIG9yIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiBEZWZpbmluZyBhIHN0cmljdCBzZXF1ZW5jZSBhcyBpbiBhIHdhdGVyZmFsbCBtb2RlbAotICBpcyBhcyBtdWNoIGEgcHJvY2VzcyBhcyBkZWZpbmluZyBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIGluIGl0ZXJhdGlvbnMgb2YgcGFyYWxsZWwKLSAgd29yay4gVGhleSBqdXN0IHJlcHJlc2VudCBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcy4gSGVuY2UsIGZvciBkZWZpbmluZwotICBhIHByb2Nlc3MsIG9uZSBjYW4gdGFrZSBtZXRob2QgY29udGVudCBhbmQgY29tYmluZSBpdCBpbnRvIHN0cnVjdHVyZXMgdGhhdCBzcGVjaWZ5Ci0gIGhvdyB0aGUgd29yayBzaGFsbCBiZSBvcmdhbml6ZWQgb3ZlciB0aW1lLCB0byBtZWV0IHRoZSBuZWVkcyBvZiBhIHBhcnRpY3VsYXIKLSAgdHlwZSBvZiBkZXZlbG9wbWVudCBwcm9qZWN0IChzdWNoIGFzIHNvZnR3YXJlIGZvciBhIG9ubGluZSBzeXN0ZW0gdmVyc3VzIHNvZnR3YXJlCi0gIGFuZCBoYXJkd2FyZSBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtKS4gRVBGIENvbXBvc2VyIHN1cHBvcnRzIHByb2Nlc3NlcyBiYXNlZCBvbiBkaWZmZXJlbnQKLSAgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcyBhY3Jvc3MgbWFueSBkaWZmZXJlbnQgbGlmZWN5Y2xlIG1vZGVscywgaW5jbHVkaW5nIHdhdGVyZmFsbCwKLSAgaW5jcmVtZW50YWwsIGFuZCBpdGVyYXRpdmUgbGlmZWN5Y2xlcy4gRVBGIENvbXBvc2VyIGFsc28gc3VwcG9ydHMgZGlmZmVyZW50IHByZXNlbnRhdGlvbnMKLSAgZm9yIHByb2Nlc3MsIHN1Y2ggYXMgd29yay1icmVha2Rvd24gc3RydWN0dXJlIG9yIHdvcmtmbG93IHByZXNlbnRhdGlvbnMuIFlvdQotICBjYW4gYWxzbyBkZWZpbmUgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciB0aGF0IHVzZSBhIG1pbmltYWwgc2V0IG9mIG1ldGhvZCBjb250ZW50IHRvCi0gIGRlZmluZSBwcm9jZXNzZXMgZm9yIGFnaWxlLCBzZWxmLW9yZ2FuaXppbmcgdGVhbXMuPC9wPgotPHA+IFRoZSBFUEYgQ29tcG9zZXIgc2NyZWVuIGNhcHR1cmUgYWJvdmUgc2hvd3MgYW4gZXhhbXBsZSBvZiBhIHByb2Nlc3MgcHJlc2VudGVkIGFzIGEKLSAgYnJlYWtkb3duIHN0cnVjdHVyZSBvZiBuZXN0ZWQgYWN0aXZpdGllcyBhcyB3ZWxsIGFzIGEgd29ya2Zsb3cgb3IgYWN0aXZpdHkgZGlhZ3JhbQotICBmb3Igb25lIHBhcnRpY3VsYXIgYWN0aXZpdHksIHRoZSBpbmNlcHRpb24gcGhhc2UuIEl0IGFsc28gaW5kaWNhdGVzIHdpdGggdGhlCi0gIHR3byBibHVlIGFycm93cyB0aGF0IHRoZSBwYXJ0aWN1bGFyIG1ldGhvZCBjb250ZW50IHRhc2sgJnF1b3Q7RGV0YWlsIGEgVXNlIENhc2UmcXVvdDsKLSAgaGFzIGJlZW4gYXBwbGllZCBpbiB0aGUgcHJvY2VzcyB0d2ljZTsgZmlyc3RseSBpbiB0aGUgaW5jZXB0aW9uIHBoYXNlIHVuZGVyCi0gIHRoZSBhY3Rpdml0eSAmcXVvdDtEZWZpbmUgdGhlIFN5c3RlbSwmcXVvdDsgYW5kIHNlY29uZGx5LCBpbiB0aGUgZWxhYm9yYXRpb24KLSAgcGhhc2UgaW4gdGhlIGFjdGl2aXR5ICZxdW90O1JlZmluZSB0aGUgc3lzdGVtIGRlZmluaXRpb24mcXVvdDsuIFlvdSBzZWUgYmVsb3cKLSAgZWFjaCBvZiB0aGVzZSB0YXNrIGFwcGxpY2F0aW9ucywgcmVmZXJyZWQgdG8gYXMgYSB0YXNrIGRlc2NyaXB0b3JzIGluIEVQRiBDb21wb3NlciwgbGlzdHMKLSAgb2YgdGhlIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiBJZiB5b3UKLSAgbG9vayBjbG9zZWx5LCB5b3Ugc2VlIHRoYXQgdGhlc2UgbGlzdHMgYXJlIGRpZmZlcmVudCBmb3IgZWFjaCBvZiB0aGVzZSB0d28gdGFzawotICBkZXNjcmlwdG9ycywgZXhwcmVzc2luZyBkaWZmZXJlbmNlcyBpbiBwZXJmb3JtaW5nIHRoZSAmcXVvdDtEZXRhaWwgYSBVc2UgQ2FzZSZxdW90OwotICBtZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLiBZb3Ugc2VlIGRpZmZlcmVudCByb2xlcyBpbnZvbHZlZCBhbmQgY2hhbmdlcwotICBpbiB0aGUgbGlzdCBvZiBpbnB1dHMgdG8gYmUgY29uc2lkZXJlZCBhbmQgb3V0cHV0cyB0byBiZSBwcm9kdWNlZCBvciB1cGRhdGVkLgotICBUaGVzZSBjaGFuZ2VzIHdlcmUgZGVmaW5lZCBieSB0aGUgYXV0aG9yIHRoYXQgY3JlYXRlZCB0aGlzIHByb2Nlc3MgdG8gZXhwcmVzcwotICB0aGUgZXhhY3QgZm9jdXMgb2YgdGhlIHRhc2sgcGVyZm9ybWFuY2UgZm9yIGVhY2ggb2NjdXJyZW5jZS4gSW4gYWRkaXRpb24gdG8KLSAgdXBkYXRpbmcgdGhlIHJvbGVzLCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIGEgdGFzayBkZXNjcmlwdG9yLCB5b3UKLSAgY2FuIGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsIHRleHR1YWwgZGVzY3JpcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBleGFjdAotICBzdGVwcyBvZiB0aGUgdGFzayB0aGF0IHNob3VsZCBhbmQgc2hvdWxkIG5vdCBiZSBwZXJmb3JtZWQgZm9yIHRoaXMgcGFydGljdWxhcgotICBvY2N1cnJlbmNlIG9mIHRoZSB0YXNrLjwvcD4KLTxwPkVQRiBDb21wb3NlciBwcm92aWRlcyB5b3Ugd2l0aCBhIHByb2Nlc3MgZWRpdG9yIHRoYXQgc3VwcG9ydHMgZGlmZmVyZW50IGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAgdmlld3MgYXMgd2VsbCBhcyBncmFwaGljYWwgcHJvY2VzcyBwcmVzZW50YXRpb25zLiBBcyBhIHByb2Nlc3MgYXV0aG9yLCB5b3UgdHlwaWNhbGx5Ci0gIHN0YXJ0IGJ5IGNyZWF0aW5nIGFuIGFjdGl2aXR5IGJyZWFrZG93biwgZGl2aWRpbmcgYW5kIGJyZWFraW5nIHlvdXIgcHJvY2VzcwotICBkb3duIGludG8gcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgaGlnaC1sZXZlbCBhY3Rpdml0aWVzLiBJbnN0ZWFkIG9mIGNyZWF0aW5nCi0gIHlvdXIgYWN0aXZpdGllcyBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSB3b3JrCi0gIGluIGEgZ3JhcGhpY2FsIGFjdGl2aXR5IGRpYWdyYW0gZWRpdG9yIHRoYXQgYWxsb3dzIHlvdSB0byBncmFwaGljYWxseSBjcmVhdGUKLSAgYSB3b3JrZmxvdyBmb3IgeW91ciBhY3Rpdml0aWVzLiBUbyBhc3NpZ24gbWV0aG9kIGNvbnRlbnQgdG8geW91ciBwcm9jZXNzLCB5b3UKLSAgdGhlbiBoYXZlIHRoZSBjaG9pY2Ugb2Ygd29ya2luZyBpbiBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3cyAod29yayBicmVha2Rvd24gc3RydWN0dXJlLAotICB3b3JrIHByb2R1Y3QgdXNhZ2UsIG9yIHRlYW0gYWxsb2NhdGlvbiB2aWV3KS4gRWFjaCB2aWV3IHN1cHBvcnRzIGEgZGlmZmVyZW50Ci0gIGFwcHJvYWNoIGZvciBjcmVhdGluZyBhIHByb2Nlc3MuIFlvdSBjYW4gZGVmaW5lIHRoZSB3b3JrIHRvIGJlIGRvbmUsIGRlZmluZQotICB0aGUgcmVzdWx0cyB0byBiZSBwcm9kdWNlZCwgb3IgZGVmaW5lIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdXIgcm9sZXMuIElmIHJlcXVlc3RlZCwKLSAgdGhlIGVkaXRvciB1cGRhdGVzIHRoZSBvdGhlciBwcm9jZXNzIHZpZXdzIHNlbWktYXV0b21hdGljYWxseSB1c2luZyB3aXphcmRzCi0gIHRoYXQgcHJvbXB0IHlvdSBmb3IgZGVjaXNpb25zIG9uIHNlbGVjdGluZyBtZXRob2QgY29udGVudCBlbGVtZW50cy48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIHByb2Nlc3MgYXV0aG9yaW5nIHNlZSB0aGUgb25saW5lIGhlbHA6PC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPlByb2Nlc3MKLSAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Yi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Yi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjU0NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWJsaXNoaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Ymxpc2hpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiOGMxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Ymxpc2hpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPkNvbmZpZ3VyYXRpb24gYW5kIFB1Ymxpc2hpbmc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+TWV0aG9kIENvbmZpZ3VyYXRpb25zIE92ZXJ2aWV3PC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgc2hpcHMgd2l0aCBhIGxvdCBvZiBjb250ZW50IG91dCBvZiB0aGUgYm94LiBJdCBpbmNsdWRlcwotICB0aGUgT3BlbiBVbmlmaWVkIFByb2Nlc3MgKE9wZW5VUCkgZnJhbWV3b3JrIGFuZCB2YXJpb3VzIHBsdWctaW5zIGV4dGVuZGluZwotICBPcGVuVVAvQmFzaWMgd2l0aCBkb21haW4tc3BlY2lmaWMgYWRkaXRpb25zLiBObyBvcmdhbml6YXRpb24gb3IgcHJvamVjdCByZXF1aXJlcyBhbGwgb2YgdGhpcwotICBkb2N1bWVudGF0aW9uIGFsbCBhdCBvbmNlLCBidXQgd291bGQgd29yayB3aXRoIGEgc2VsZWN0aW9uIG9mIHNwZWNpZmljIHN1YnNldHMuPC9wPgotPHA+IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgKEVQRiBDb21wb3NlcikgbWFuYWdlcyBmb3IgdGhhdCBwdXJwb3NlIHNvLWNhbGxlZCBtZXRob2QKLSAgY29uZmlndXJhdGlvbnMsIHdoaWNoIGFsbG93IHlvdSB0byBzcGVjaWZ5IHdvcmtpbmcgc2V0cyBvZiBjb250ZW50IGFuZCBwcm9jZXNzZXMKLSAgZm9yIGEgc3BlY2lmaWMgY29udGV4dCwgc3VjaCBhcyBhIHNwZWNpZmljIHZhcmlhbnQgb2YgdGhlIFJVUCBmcmFtZXdvcmsgdGhhdAotICB5b3Ugd2FudCB0byBwdWJsaXNoIGFuZCBkZXBsb3kgZm9yIGEgZ2l2ZW4gc29mdHdhcmUgcHJvamVjdCBvciBhcyBhIGZvdW5kYXRpb24KLSAgZm9yIGEgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uLiBBbGwgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciBhcmUgb3JnYW5pemVkCi0gIGluIG1ldGhvZCBwbHVnLWlucywgd2hpY2ggYXJlIG9yZ2FuaXplZCBpbnRvIG1ldGhvZCBwYWNrYWdlcy4gQSBtZXRob2QgY29uZmlndXJhdGlvbgotICBpcyBzaW1wbHkgYSBzZWxlY3Rpb24gb2YgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMuPC9wPgotPHA+PGltZyBzcmM9ImNvbmYuZ2lmIj48L3A+Ci08cD5Zb3UgY3JlYXRlIGFuZCBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgZGVwaWN0ZWQKLSAgaW4gdGhlIGZpZ3VyZSBhYm92ZS4gWW91IGNvdWxkIHN0YXJ0IGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGJ5IGNvcHlpbmcgb25lIG9mIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHNoaXAgd2l0aCBFUEYgQ29tcG9zZXIgYW5kIG1vZGlmeSBpdCB0byBmaXQKLSAgeW91ciBzcGVjaWZpYyBuZWVkcy4gWW91IGNhbiBhZGQgb3IgcmVtb3ZlIHdob2xlIG1ldGhvZCBwbHVnLWlucyBhcyB3ZWxsIGFzCi0gIG1ha2Ugc2VsZWN0aW9uIHdpdGggZWFjaCBwbHVnLWluIGJ5IGNoZWNraW5nIG9yIHVuLWNoZWNraW5nIHBhY2thZ2VzLiA8L3A+Ci08cD4gWW91IGNhbiB1c2UgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGFzIHlvdXIgd29ya2luZyBzZXQgZm9yIHlvdXIgRVBGIENvbXBvc2VyCi0gIHdvcmsuIFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgY29uZmlndXJhdGlvbiwgaS5lLiB0aGUgaW5jbHVkZWQgbWV0aG9kIGNvbnRlbnQKLSAgYW5kIHByb2Nlc3MgZWxlbWVudHMgYXJlIGFsd2F5cyBhY2Nlc3NpYmxlIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuIFVzZSB0aGUKLSAgY29tYm8gYm94IGluIHRoZSB0b29sYmFyIHRvIHNlbGVjdCB0aGUgY3VycmVudGx5IHVzZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPGgzPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2gzPgotPHA+TWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB0aGUgYmFzaXMgZm9yIHB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4KLSAgQSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBhbiBodG1sIFdlYiBzaXRlIHRoYXQgcHJlc2VudHMgYWxsIHRoZSBtZXRob2QKLSAgY29udGVudCBhbmQgcHJvY2Vzc2VzIG9mIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiBhIG5hdmlnYWJsZSBhbmQgc2VhcmNoYWJsZQotICB3YXkuIEl0IHVzZXMgdGhlIHJlbGF0aW9uc2hpcHMgZXN0YWJsaXNoZWQgZHVyaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzCi0gIGF1dGhvcmluZyB0byBnZW5lcmF0ZSBoeXBlcmxpbmtzIGJldHdlZW4gZWxlbWVudHMgYXMgd2VsbCBhcyBwcm92aWRlcyB0cmVlCi0gIGJyb3dzZXJzIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIHVzZXItZGVmaW5lZCBjYXRlZ29yaXphdGlvbnMgb2YKLSAgdGhlIGNvbnRlbnQuIFRoZSBmaWd1cmUgYmVsb3cgc2hvd3MgYW4gZXhhbXBsZSBvZiB0aGUgcHVibGlzaGVkICdDbGFzc2ljIFJVUCcKLSAgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPHA+PGltZyBzcmM9InB1Yi5naWYiPjwvcD4KLTxwPkZvciBwdWJsaXNoaW5nIHNpbXBseSBjcmVhdGUgYW5kIHNlbGVjdCBhIGNvbmZpZ3VyYXRpb24uIFRoZSBwdWJsaWNhdGlvbiB3aXphcmQKLSAgd2lsbCBkbyB0aGUgcmVzdCBmb3IgeW91IGFuZCBvbmx5IHB1Ymxpc2ggY29udGVudCB0aGF0IGlzIHBhcnQgb2YgdGhlIG1ldGhvZAotICBjb25maWd1cmF0aW9uLiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSBhZG9wdCBjb250ZW50IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gIHN1Y2ggYXMgcmVtb3ZpbmcKLSAgcmVmZXJlbmNlcyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyB0byBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBjb25maWd1cmF0aW9uCi0gIG9yIHJlbW92aW5nIGFjdGl2aXRpZXMgZnJvbSB5b3VyIHByb2Nlc3NlcyB0aGF0IG9ubHkgY29udGFpbiB3b3JrIGRlZmluZWQgb3V0c2lkZQotICBvZiB0aGUgY29uZmlndXJhdGlvbiBzZXQuIEhlbmNlLCBwdWJsaXNoaW5nIHdpbGwgb25seSBpbmNsdWRlIHRoZSBjb250ZW50IHRoYXQKLSAgeW91IHJlYWxseSBuZWVkLiBZb3UgY2FuIGFsd2F5cyBwcmV2aWV3IGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gdXNpbmcgRVBGIENvbXBvc2VyJ3MKLWJyb3dzaW5nIHBlcnNwZWN0aXZlLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvdW1hX2h1bXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS91bWFfaHVtcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOThmMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS91bWFfaHVtcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93aGl0ZXBhcGVyLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93aGl0ZXBhcGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlY2UzM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2hpdGVwYXBlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2hpdGVwYXBlciIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3aGl0ZXBhcGVyIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldoaXRlcGFwZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9IndoaXRlcGFwZXIiPjxhIG5hbWU9IndoaXRlcGFwZXIiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XaGl0ZXBhcGVyPC9oMT4KLTxkaXY+PHA+QSBXaGl0ZXBhcGVyIGlzIGEgc3BlY2lhbCB0eXBlIG9mIGNvbmNlcHQgZ3VpZGFuY2UgdGhhdCBpcyBleHRlcm5hbGx5IHJldmlld2VkCi1vciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50Ci1lbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3QuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YTJjMTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldvcmsgUHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Indvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldvcmsgUHJvZHVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya3Byb2R1Y3QiPjxhIG5hbWU9Indvcmtwcm9kdWN0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29yayBQcm9kdWN0PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+V29yayBwcm9kdWN0IGlzIGEgZ2VuZXJhbCB0ZXJtIGZvciB0YXNrIGlucHV0cyBhbmQgb3V0cHV0cywKLWRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLAotb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiBUaGUgdGhyZWUgdHlwZXMgb2Ygd29yayBwcm9kdWN0IGFyZTo8dWw+PGxpPjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RkZXNjcmlwdG9ycy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RkZXNjcmlwdG9ycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZjYTk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtwcm9kdWN0ZGVzY3JpcHRvcnMiPjxhIG5hbWU9Indvcmtwcm9kdWN0ZGVzY3JpcHRvcnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnM8L2gxPgotPGRpdj48cD5BIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGlzIGEgd29yayBwcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYwotYWN0aXZpdHkuIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZgotd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIG9mIHRhc2sgZGVzY3JpcHRvcnMgYW5kIHJvbGUgZGVzY3JpcHRvcnMuIE9uZSB3b3JrCi1wcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycywgZWFjaCB3aXRoaW4gdGhlCi1jb250ZXh0IG9mIGFuIGFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGtpbmQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0a2luZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2RkYjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0a2luZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29yayBQcm9kdWN0IEtpbmQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0id29ya3Byb2R1Y3RraW5kIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldvcmsgUHJvZHVjdCBLaW5kPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JrcHJvZHVjdGtpbmQiPjxhIG5hbWU9Indvcmtwcm9kdWN0a2luZCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmsgUHJvZHVjdCBLaW5kPC9oMT4KLTxkaXY+PHA+V29yayBQcm9kdWN0IEtpbmQgaXMgYW5vdGhlciBjYXRlZ29yeSBmb3IgZ3JvdXBpbmcgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0czwvYT4uIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgd29yayBwcm9kdWN0Ci1raW5kcy4gQXMgYW4gZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gaGF2ZSBhIHNlcmllcyBvZiB3b3JrIHByb2R1Y3Qga2luZHMKLXRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3ZlcmFsbCBpbnRlbnQgb2Ygd29yayBwcm9kdWN0cywgc3VjaCBhcyBzcGVjaWZpY2F0aW9uLAotcGxhbiwgb3IgbW9kZWwuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvbWFpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvbWFpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzNhMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL21haW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJFUEYgQ29tcG9zZXIiID4KLTx0b3BpYyBsYWJlbD0iT3ZlcnZpZXciPgotCTxhbmNob3IgaWQ9Im92ZXJ2aWV3X2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJHZXR0aW5nIHN0YXJ0ZWQiPgotCTxhbmNob3IgaWQ9ImdldHRpbmdfc3RhcnRlZF9pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiPgotCTxhbmNob3IgaWQ9ImNyZWF0aW5nX21ldGhvZF9jb250ZW50X2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDYXRlZ29yaXppbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiPgotCTxhbmNob3IgaWQ9ImNhdGVnb3JpemluZ19tZXRob2RfY29udGVudF9pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcHJvY2Vzc2VzIj4KLQk8YW5jaG9yIGlkPSJjcmVhdGluZ19wcm9jZXNzZXNfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYW5kIGV4cG9ydGluZyI+Ci0JPGFuY2hvciBpZD0icHVibGlzaGluZ19leHBvcnRpbmdfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlVzaW5nIHZlcnNpb24gY29udHJvbCBzeXN0ZW0iID4KLQk8YW5jaG9yIGlkPSJ2ZXJzaW9uX2NvbnRyb2xfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkFjY2Vzc2liaWxpdHkiID4KLQk8YW5jaG9yIGlkPSJhY2Nlc3NpYmlsaXR5X2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJHbG9zc2FyeSI+Ci0JPGFuY2hvciBpZD0iZ2xvc3NhcnlfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlR1dG9yaWFscyIgPgotCTxhbmNob3IgaWQ9InR1dG9yaWFsc19pZCIvPgotPC90b3BpYz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9vdmVydmlldy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvb3ZlcnZpZXcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTk0ZTg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9vdmVydmlldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08dG9jIGxhYmVsPSJFUEYgQ29tcG9zZXIgb3ZlcnZpZXciIGxpbmtfdG89Im1haW4ueG1sI292ZXJ2aWV3X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iRVBGIENvbXBvc2VyIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L2FfcHJvZHVjdF9vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy9hX21ldGhvZF9jb250ZW50X2F1dGhvcmluZ19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L2FfcHJvY2Vzc19hdXRob3Jpbmdfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvYV9tZXRob2RfY29uZmlndXJhdGlvbnNfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJLZXkgY29uY2VwdHMiPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgbGlicmFyeSIgaHJlZj0iaHRtbC90b3BpY3MvY19tZXRob2RfbGlicmFyeS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgcGFja2FnZSIgaHJlZj0iaHRtbC90b3BpY3MvY19tZXRob2RfY29udGVudF9wYWNrYWdlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9jb25maWd1cmF0aW9ucy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBwbHVnLWluIiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9wbHVnaW4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJHdWlkYW5jZSIgaHJlZj0iaHRtbC90b3BpY3MvY19ndWlkYW5jZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByb2Nlc3MiIGhyZWY9Imh0bWwvdG9waWNzL2NfcHJvY2Vzcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVXNlciByb2xlcyBhbmQgcm9sZS1zcGVjaWZpYyB0YXNrcyIgaHJlZj0iaHRtbC90b3BpY3MvY191c2VyX3JvbGVzLmh0bWwiLz4KLTwvdG9waWM+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmE1YjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBEb2N1bWVudGF0aW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotCi0jIENoZWF0IFNoZWV0cwotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPU1ldGhvZCBBdXRob3JpbmcgQ2hlYXQgU2hlZXRzCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1HZXR0aW5nIFN0YXJ0ZWQKLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9Q3JlYXRlIFJldXNhYmxlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0PVdyaXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVdvcmsgd2l0aCBQcm9jZXNzZXMKLUNoZWF0c2hlZXROYXZpZ2F0ZU1ldGhvZENvbnRlbnQ9TmF2aWdhdGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RDb25maWd1cmF0aW9uPUNyZWF0ZSB5b3VyIG93biBNZXRob2QgQ29uZmlndXJhdGlvbgotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PUFkZCBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9VGFpbG9yIGV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlKSBVc2luZyBDb250cmlidXRpb24KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9UmVwbGFjZSBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkKLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1BZGQgYSBNZXRob2QgUmVmZXJlbmNlIG9yIEh5cGVybGluayAoVVJMKQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4KLUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzPUNyZWF0ZSBhIFByb2Nlc3MgKENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzKQotCi0KLQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0MjZiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICAJPHRvYwotICAgICAgICAgICAgZmlsZT0ibWFpbi54bWwiCi0gICAgICAgICAgICBwcmltYXJ5PSJ0cnVlIj4KLSAgICAgIAk8L3RvYz4KLSAgICAgIAk8dG9jCi0JCWZpbGU9ImdldHRpbmdfc3RhcnRlZC54bWwiPgotICAgICAgCTwvdG9jPgotICAgICAgCTx0b2MKLQkJZmlsZT0ib3ZlcnZpZXcueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotICAgICAgCTx0b2MKLQkJZmlsZT0iY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotICAgICAgCTx0b2MKLQkJZmlsZT0iY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50LnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLSAgICAgIAk8dG9jCi0JCWZpbGU9ImNyZWF0aW5nX3Byb2Nlc3Nlcy54bWwiPgotICAgICAgCTwvdG9jPgotCi0gICAgICAJPHRvYwotCQlmaWxlPSJwdWJsaXNoaW5nX2V4cG9ydGluZy54bWwiPgotICAgICAgCTwvdG9jPgotCi0JPHRvYwotCQlmaWxlPSJ2ZXJzaW9uX2NvbnRyb2wueG1sIj4KLQk8L3RvYz4KLQk8dG9jCi0JCWZpbGU9ImFjY2Vzc2liaWxpdHkueG1sIj4KLQk8L3RvYz4KLQk8dG9jCi0JCWZpbGU9Imdsb3NzYXJ5LnhtbCI+Ci0JPC90b2M+Ci0JPHRvYwotCQlmaWxlPSJ0dXRvcmlhbHMueG1sIj4KLQk8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBGMSBjb250ZXh0IGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4gCi0JCTxjb250ZXh0cyBmaWxlPSIkbmwkL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIvPiAKLQk8L2V4dGVuc2lvbj4KLQotIAk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4gCi0gICAgICA8Y29udGV4dHMgZmlsZT0iJG5sJC9jb250ZXh0c19TZWFyY2gueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPiAKLSAgIAk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cyIKLSAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWUiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmdldHN0YXJ0ZWQiIAotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmdldHN0YXJ0ZWQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXROYXZpZ2F0ZU1ldGhvZENvbnRlbnQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmNyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmdldHN0YXJ0ZWQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuY3JlYXRlbWV0aG9kcGx1Z2luIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5nZXRzdGFydGVkIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kcGx1Z2luLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50IiAKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMiIAotICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVzdWFibGUuY29udGVudCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5hZGRuZXdtZXRob2Rjb250ZW50IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXN1YWJsZS5jb250ZW50IgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnRhaWxvcmV4aXN0aW5nbWV0aG9kZWxlbWVudHMiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlc3VhYmxlLmNvbnRlbnQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHMiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlcGxhY2VleGlzdGluZ21ldGhvZGVsZW1lbnRzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXN1YWJsZS5jb250ZW50IgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHMiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzIgotICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMud3JpdGUuY29udGVudCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy53cml0ZS5jb250ZW50IgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYWRkbWV0aG9kcmVmX29yX2h5cGVybGluay54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cyIKLSAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWUiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnByb2Nlc3NlcyIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5hcHBseWNhcGFiaWxpdHlwYXR0ZXJuIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5wcm9jZXNzZXMiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybiIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuY3JlYXRlYXByb2Nlc3MiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnByb2Nlc3NlcyIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0Q3JlYXRlUHJvY2VzcyIvPgotICAgPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoYW5kZXhwb3J0LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoYW5kZXhwb3J0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyZWMzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGFuZGV4cG9ydC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlB1Ymxpc2hpbmcgYW5kIGV4cG9ydGluZyIgbGlua190bz0ibWFpbi54bWwjcHVibGlzaGFuZGV4cG9ydF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSBtZXRob2Qgd2ViIiBocmVmPSJodG1sL2hlbHAvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoaW5nX2V4cG9ydGluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OWU5MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08dG9jIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmcgbWV0aG9kIGNvbnRlbnQiIGxpbmtfdG89Im1haW4ueG1sI3B1Ymxpc2hpbmdfZXhwb3J0aW5nX2lkIj4gIAotCTx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhIGNvbmZpZ3VyYXRpb24gYXMgYSB3ZWIgc2l0ZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9wdWJsaXNoaW5nX2h0bWwuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIHRvIE1pY3Jvc29mdCBQcm9qZWN0IiBocmVmPSJodG1sL3RvcGljcy90X21zcHJvamVjdF9leHBvcnQuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIGEgbGlicmFyeSBjb25maWd1cmF0aW9uIiBocmVmPSJodG1sL3RvcGljcy90X2NvbmZpZ3VyYXRpb25fZXhwb3J0Lmh0bWwiLz4JCi0JPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfY29uZmlndXJhdGlvbl9pbXBvcnQuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIGEgcGx1Zy1pbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9wbHVnaW5fZXhwb3J0Lmh0bWwiLz4JCi0JPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYSBwbHVnLWluIiBocmVmPSJodG1sL3RvcGljcy90X3BsdWdpbl9pbXBvcnQuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIFhNTCIgaHJlZj0iaHRtbC90b3BpY3MvdF94bWxfZXhwb3J0Lmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9IkltcG9ydGluZyBYTUwiIGhyZWY9Imh0bWwvdG9waWNzL3RfeG1sX2ltcG9ydC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9yZWZlcmVuY2UueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YTZiYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3JlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0ibWFpbi54bWwjcmVmZXJlbmNlX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iU3Vwb3J0IGZvciBjb2RlIG1hbmFnZW1lbnQgc3lzdGVtcyIgaHJlZj0iaHRtbC9oZWxwL2NtX292ZXJ2aWV3Lmh0bWwiPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBDVlMiIGhyZWY9Imh0bWwvaGVscC9jbV9jdnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBvcnQgZm9yIFJhdGlvbmFsIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC9oZWxwL2NtX3JhdGlvbmFsY2MuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBSYXRpb25hbCBDQ1JDIiBocmVmPSJodG1sL2hlbHAvY21fY2NyYy5odG1sIi8+Ci08L3RvcGljPgotCi0gICA8dG9waWMgbGFiZWw9IkFjY2Vzc2liaWxpdHkiIGhyZWY9Imh0bWwvaGVscC9hY19tYWluLmh0bWwiPgotICAgPHRvcGljIGxhYmVsPSJLZXlib2FyZCBuYXZpZ2F0aW9uIiBocmVmPSJodG1sL2hlbHAvYWNfbmF2aWdhdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkZvbnRzIGFuZCBjb2xvcnMiIGhyZWY9Imh0bWwvaGVscC9hY19mb250c2FuZGNvbG9ycy5odG1sIi8+Ci08L3RvcGljPgotICAgCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL0RvY1BsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvRG9jUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZGE5M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvRG9jUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIERvY1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBEb2NQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBEb2NQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2NQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLS8vCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBEb2NQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0vLwkJdHJ5IHsKLS8vCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0vLwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLS8vCQkJcmV0dXJuIGtleTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0vLwlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0vLwkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLkRvY1BsdWdpblJlc291cmNlcyIpOwotLy8JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0vLwkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLS8vCQl9Ci0vLwkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotLy8JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotLy8JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYyIsIHBhdGgpOwotLy8JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmRiODZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBEb2N1bWVudGF0aW9uIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90YXNrcy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDQ2MTY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90YXNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlRhc2tzIiBsaW5rX3RvPSJtYWluLnhtbCN0YXNrc19pZCI+ICAKLQotICA8IS0tIENyZWF0aW5nIHJldXNhYmxlIG1ldGhvZCBjb250ZW50IC0tPgotICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIHJldXNhYmxlIG1ldGhvZCBjb250ZW50Ij4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCB2aWV3IHdpdGggY3VzdG9tIGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY3VzdG9tX2NhdGVnb3JpZXMuaHRtbCIvPiAKLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9jb250ZW50Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByb2xlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3JvbGUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB0YXNrIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3Rhc2suaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB3b3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgZ3VpZGFuY2UiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZ3VpZGFuY2UuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJNZXRob2QgQ29udGVudCBWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5Lmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDb250cmlidXRlcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2NvbnRyaWJ1dGVzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2V4dGVuZHMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJSZXBsYWNlcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X3JlcGxhY2UuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJBc3NvY2lhdGlvbnMgaW1wYWN0ZWQgYnkgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9hc3NvY2lhdGlvbnMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJCcm93c2luZyB2YXJpYWJpbGl0eSBhc3NvY2lhdGlvbnMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9icm93c2luZy5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQnJvd3NlIGFuZCBwcmV2aWV3IG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvYnJvd3NlX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBpbmRleCBlbnRyaWVzIiBocmVmPSJodG1sL2hlbHAvaW5kZXhpbmcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBnbG9zc2FyeSBlbnRyaWVzIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnlfZW50cmllcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNoYW5naW5nIGNvcHlyaWdodCBub3RpY2VzIiBocmVmPSJodG1sL2hlbHAvY2hhbmdpbmdfY29weXJpZ2h0Lmh0bWwiLz4KLTwvdG9waWM+Ci0KLSAgPCEtLSBDYXRlZ29yaXppbmcgbWV0aG9kIGNvbnRlbnQgLS0+Ci0gIDx0b3BpYyBsYWJlbD0iQ2F0ZWdvcml6aW5nIG1ldGhvZCBjb250ZW50Ij4KLSAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgdmlldyB3aXRoIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2N1c3RvbV9jYXRlZ29yaWVzLmh0bWwiLz48L3RvcGljPgotCi0gIDwhLS0gQ3JlYXRpbmcgcHJvY2Vzc2VzIC0tPgotICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIHByb2Nlc3NlcyI+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9kZWxpdmVyeV9wcm9jZXNzLmh0bWwiPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dicy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3RlYW1fc3RydWN0dXJlLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd29ya3Byb2R1Y3Rfc3RydWN0dXJlLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJBcHBseSBhIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2FwcGx5X2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGVsZW1lbnQgcHJvcGVydGllcyBWaWV3IiBocmVmPSJodG1sL2hlbHAvcHJvcGVydGllc192aWV3Lmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJVc2luZyBkZWVwIGNvcHkiIGhyZWY9Imh0bWwvaGVscC91c2luZ19kZWVwX2NvcHkuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIGFjdGl2aXR5IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdXNpbmdfYWN0aXZpdHlfdmFyaWFiaWxpdHkuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzIGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvcHJvY2Vzc19kaWFncmFtcy5odG1sIj4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kaWFncmFtcy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RldGFpbF9kaWFncmFtcy5odG1sIi8+Ci0KLSAgPC90b3BpYz4KLQotICA8IS0tIFB1Ymxpc2hpbmcgTWV0aG9kIENvbnRlbnQgLS0+Ci0gIDx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhbmQgZXhwb3J0aW5nIG1ldGhvZCBjb250ZW50Ij4KLSAgIDx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIGEgbWV0aG9kIHdlYiIgaHJlZj0iaHRtbC9oZWxwL3B1Ymxpc2hpbmcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgdG8gTWljcm9zb2Z0IFByb2plY3QiIGhyZWY9Imh0bWwvaGVscC9leHBvcnRfdG9fbXNwcm9qZWN0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iWE1MIEltcG9ydC9FeHBvcnQiIGhyZWY9Imh0bWwvaGVscC9leHBvcnRfdG9feG1sLmh0bWwiLz4KLSA8L3RvcGljPgotCi0gIDwhLS0gV29ya2luZyB3aXRoIFRleHR1YWwgRGVzY3JpcHRpb25zIC0tPgotIDx0b3BpYyBsYWJlbD0iUmljaCB0ZXh0IGVkaXRvciIgaHJlZj0iaHRtbC9oZWxwL3JpY2h0ZXh0ZWRpdG9yLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQWRkIGEgcmVmZXJlbmNlIG9yIGh5cGVybGluayIgaHJlZj0iaHRtbC9oZWxwL2FkZF9oeXBlcmxpbmsuaHRtbCIvPgotICA8L3RvcGljPgotICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODU5NmM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIHRvcGljPSJodG1sL3RvYy5odG1sIj4KLSAgIDx0b3BpYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIj4KLSAgICAgIDxhbmNob3IgaWQ9ImdldHRpbmdzdGFydGVkIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDb25jZXB0cyI+Ci0gICAgICA8YW5jaG9yIGlkPSJjb25jZXB0cyIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iVGFza3MiPgotICAgICAgPGFuY2hvciBpZD0idGFza3MiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlJlZmVyZW5jZSI+Ci0gICAgICA8YW5jaG9yIGlkPSJyZWZlcmVuY2UiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlNhbXBsZXMiPgotICAgICAgPGFuY2hvciBpZD0ic2FtcGxlcyIvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2NvbmNlcHRzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2Njb25jZXB0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDllMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2NvbmNlcHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDb25jZXB0cyIgbGlua190bz0idG9jLnhtbCNjb25jZXB0cyI+IAotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyIgIGhyZWY9Imh0bWwvY29uY2VwdHMvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvY29uY2VwdHMvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvY29uY2VwdHMvc3VidG9waWMyLmh0bWwiIC8+IAotCTwvdG9waWM+IAotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2dldHRpbmdzdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYjMxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkdldHRpbmcgU3RhcnRlZCIgbGlua190bz0idG9jLnhtbCNnZXR0aW5nc3RhcnRlZCI+IAotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyIgIGhyZWY9Imh0bWwvZ2V0dGluZ3N0YXJ0ZWQvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvZ2V0dGluZ3N0YXJ0ZWQvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvZ2V0dGluZ3N0YXJ0ZWQvc3VidG9waWMyLmh0bWwiIC8+Ci0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NyZWZlcmVuY2UueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NWM1YTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3JlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iUmVmZXJlbmNlIiBsaW5rX3RvPSJ0b2MueG1sI3JlZmVyZW5jZSI+IAotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyIgIGhyZWY9Imh0bWwvcmVmZXJlbmNlL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL3JlZmVyZW5jZS9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9yZWZlcmVuY2Uvc3VidG9waWMyLmh0bWwiIC8+IAotCTwvdG9waWM+IAotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jc2FtcGxlcy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jc2FtcGxlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5N2VmYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3NhbXBsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlNhbXBsZXMiIGxpbmtfdG89InRvYy54bWwjc2FtcGxlcyI+IAotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyIgIGhyZWY9Imh0bWwvc2FtcGxlcy9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9zYW1wbGVzL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL3NhbXBsZXMvc3VidG9waWMyLmh0bWwiIC8+IAotCTwvdG9waWM+IAotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jdGFza3MueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3Rhc2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxNDU0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jdGFza3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlRhc2tzIiBsaW5rX3RvPSJ0b2MueG1sI3Rhc2tzIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC90YXNrcy9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC90YXNrcy9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC90YXNrcy9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90dXRvcmlhbHMueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3R1dG9yaWFscy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTg2OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3R1dG9yaWFscy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlR1dG9yaWFscyIgbGlua190bz0ibWFpbi54bWwjdHV0b3JpYWxzX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iRXhwbG9yZSB0aGUgdXNlciBpbnRlcmZhY2UiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfaW50cm8uaHRtIj4KLQk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2NvbmNlcHRzLmh0bSIgLz4gCi0gICAJPHRvcGljIGxhYmVsPSJCYXNpYyBuYXZpZ2F0aW9uIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4MS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJCcm93c2UgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfZXgyLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkJyb3dzZSBwcm9jZXNzIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkJyb3dzZSB3aGlsZSBhdXRob3JpbmciIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfZXg0Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IlNlYXJjaCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDUuaHRtIiAvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2ludHJvLmh0bSI+Ci0JPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9jb25jZXB0cy5odG0iIC8+IAotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY29udGVudCBwYWNrYWdlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4MS5odG0iIC8+Ci0JPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB3b3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXgyLmh0bSIgLz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXgzLmh0bSIgLz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHRhc2siIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXg0Lmh0bSIgLz4KLQk8dG9waWMgbGFiZWw9Ildvcmsgd2l0aCBzdGVwcyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDUuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgZ3VpZGFuY2UiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXg2Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9Ik1hbmFnZSBndWlkYW5jZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDcuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgc3RhbmRhcmQgY2F0ZWdvcnkiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXg4Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZCBhIHBsdWctaW4iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXg5Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlJldXNlIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2ludHJvLmh0bSI+Ci0gICAJPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZSB0byBhIHJvbGUiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXgxLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGUgdG8gYSB3b3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXgyLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGUgdG8gYSB0YXNrIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4My5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJFeHRlbmQgYSByb2xlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4NC5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJFeHRlbmQgYSB3b3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXg1Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkV4dGVuZCBhIHRhc2siIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXg2Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IlJlcGxhY2UgYSByb2xlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4Ny5odG0iIC8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggcHJvY2Vzc2VzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2ludHJvLmh0bSI+Ci0gICAgICAgCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfY29uY2VwdHMuaHRtIiAvPiAKLSAgIAk8dG9waWMgbGFiZWw9IkJyb3dzZSBwcm9jZXNzIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXgxLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkV4cGxvcmUgcHJvY2VzcyBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2V4Mi5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2V4My5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJVc2UgY2FwYWJpbGl0eSBwYXR0ZXJucyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDQuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcHJvY2VzcyBkaWFncmFtIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2V4NS5odG0iIC8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2ludHJvLmh0bSI+Ci0gICAgICAgCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfY29uY2VwdHMuaHRtIiAvPiAKLSAgIAk8dG9waWMgbGFiZWw9IlB1Ymxpc2ggYSBjb25maWd1cmF0aW9uIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2V4MS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfZXgyLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGN1c3RvbSBjb25maWd1cmF0aW9uIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2V4My5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJQdWJsaXNoIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfZXg0Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy92ZXJzaW9uX2NvbnRyb2wueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3ZlcnNpb25fY29udHJvbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2MyMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3ZlcnNpb25fY29udHJvbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHRvYyBsYWJlbD0iVXNpbmcgdmVyc2lvbiBjb250cm9sIHN5c3RlbXMiIGxpbmtfdG89Im1haW4ueG1sI3ZlcnNpb25fY29udHJvbF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlVzaW5nIFJhdGlvbmFsIENsZWFyQ2FzZSIgPgotICAgCTx0b3BpYyBsYWJlbD0iSW50ZWdyYXRpb24gd2l0aCBSYXRpb25hbCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL2NfY2xlYXJjYXNlX292ZXJ2aWV3Lmh0bWwiLz4KLSAJPHRvcGljIGxhYmVsPSJJbnN0YWxsaW5nIGFuZCBjb25maWd1cmluZyBSYXRpb25hbCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2luc3RhbGwuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iSW5zdGFsbGluZyBhbmQgY29uZmlndXJpbmcgUmF0aW9uYWwgQ0NSQyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfY2NyY19pbnN0YWxsLmh0bWwiLz4gICAKLSAgICAJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIENsZWFyQ2FzZSB2aWV3IiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9jcmVhdGVfdmlldy5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHZpZXciIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX25ld192aWV3Lmh0bWwiLz4KLSAJPHRvcGljIGxhYmVsPSJVc2luZyBDbGVhckNhc2UgZHluYW1pYyB2aWV3cyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfZHluYW1pY192aWV3cy5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJBZGRpbmcgYSBuZXcgbGlicmFyeSB0byBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX25ld19saWJyYXJ5Lmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9IkFkZGluZyBhbiBleGlzdGluZyBsaWJyYXJ5IHRvIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfZXhpc3RpbmdfbGlicmFyeS5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gd2l0aCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2ltcG9ydF9jb25maWd1cmF0aW9uLmh0bWwiLz4KLSAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGEgcGx1Zy1pbiB0byBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2FkZF9wbHVnaW4uaHRtbCIvPgotICAJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBjb25maWd1cmF0aW9uIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9uZXdfY29uZmlndXJhdGlvbi5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJBZGRpbmcgYSBjb250ZW50IHBhY2thZ2UgdG8gQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9jb250ZW50X3BhY2thZ2UuaHRtbCIvPiAKLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIG5ldyBtZXRob2QgZWxlbWVudCB0byBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2FkZF9lbGVtZW50Lmh0bWwiLz4KLSAgCTx0b3BpYyBsYWJlbD0iRWRpdGluZyBtZXRob2QgZWxlbWVudHMgd2l0aCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2VkaXRfZWxlbWVudC5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJEZWxldGluZyBtZXRob2QgZWxlbWVudHMgd2l0aCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2RlbGV0ZV9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9Ik1vdmluZyBtZXRob2QgZWxlbWVudHMgd2l0aCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX21vdmVfZWxlbWVudC5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIGNhcGFiaWxpdHkgcGF0dGVybiB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiLz4KLSAJPHRvcGljIGxhYmVsPSJNdWx0aS1Vc2VyIHNjZW5hcmlvcyB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvY19jbGVhcmNhc2VfbXVsdGl1c2VyLmh0bWwiLz4KLSAgCTx0b3BpYyBsYWJlbD0iRGlzYWJsaW5nIFJhdGlvbmFsIENDUkMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2NjcmNfZGlzYWJsZS5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJVc2luZyBDVlMiID4KLSAgIAk8dG9waWMgbGFiZWw9Ikluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfaW5zdGFsbC5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyB2aWV3IHdpdGggQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19uZXdfdmlldy5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJBZGRpbmcgYSBuZXcgbGlicmFyeSB0byBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX25ld19saWJyYXJ5Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIHBsdWctaW4gdG8gQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19hZGRfcGx1Z2luLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhbiBlbGVtZW50IHRvIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfYWRkX2VsZW1lbnQuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgYW4gZWxlbWVudCB1bmRlciBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX2RlbGV0ZV9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkVkaXRpbmcgYW4gZWxlbWVudCB1bmRlciBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX2VkaXRfZWxlbWVudC5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJNb3ZpbmcgYW4gZWxlbWVudCB1bmRlciBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX21vdmVfZWxlbWVudC5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJWZXJzaW9uIGNvbnRyb2wgcmVmZXJlbmNlIiA+Ci0gICAJPHRvcGljIGxhYmVsPSJWZXJzaW9uIGNvbnRyb2wgZm9yIHNwZWNpZmljIGZpbGVzIiBocmVmPSJodG1sL3RvcGljcy9yX2NsZWFyY2FzZV9maWxlcy5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJDb21tb24gYWN0aW9ucyBpbXBhY3Qgb24gc3BlY2lmaWMgZmlsZXMiIGhyZWY9Imh0bWwvdG9waWNzL3JfY2xlYXJjYXNlX2FjdGlvbnMuaHRtbCIvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3dvcmt3aXRodGV4dGRlc2MueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3dvcmt3aXRodGV4dGRlc2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjg3NmZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy93b3Jrd2l0aHRleHRkZXNjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iV29ya2luZyB3aXRoIFRleHR1YWwgRGVzY3JpcHRpb25zIiBsaW5rX3RvPSJtYWluLnhtbCN3b3Jrd2l0aHRleHRkZXNjX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iUmljaCBUZXh0IEVkaXRvciIgaHJlZj0iaHRtbC9oZWxwL3JpY2h0ZXh0ZWRpdG9yLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluayIgaHJlZj0iaHRtbC9oZWxwL2FkZF9oeXBlcmxpbmsuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5ZDFkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgeG1sIGltcG9ydCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjc1OTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWw8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzNmVkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbCwKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJjYzJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZXRvb2wxNi9pbXBfeG1sLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2V0b29sMTYvaW1wX3htbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZWU3NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZXRvb2wxNi9pbXBfeG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL2ltcF94bWxfd2l6YmFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL2ltcF94bWxfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkODQ2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9pbXBfeG1sX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTU0N2ZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEltcG9ydCBYTUwgUGx1Zy1pbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgSW1wb3J0IFhNTCBXaXphcmQKLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MCi1pbXBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1JbXBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBzdG9yZWQgaW4gYSBYTUwgZmlsZS4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDQ1ZTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMuSW1wb3J0WE1MV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXRvb2wxNi9pbXBfeG1sLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzLkltcG9ydFhNTFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVpbXBvcnRYTUxXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVpbXBvcnRYTUxXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzLkltcG9ydFhNTFdpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQxYmNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9JbXBvcnRYTUxQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBJbXBvcnRYTUxQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgVW1hUGFja2FnZSB1bWFQYWNrYWdlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1MUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCQkKLQkJLy9BbGxvdyBVbWFQYWNrYWdlIGJlIGluaXRpYWxpemVkIGJlZm9yZSBhbnkgaW1wb3J0IGFjdGlvbgotCQl1bWFQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQkvLyBzZXQgdGhpcyB0byBhbGxvdyBwYXJzZSBsYXJnZSB4bWwgZmlsZQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImVudGl0eUV4cGFuc2lvbkxpbWl0IiwgIjEwMDAwMDAwMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltcG9ydFhNTFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDMyYzZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9JbXBvcnRYTUxSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBtZXNzYWdlIHJlc291cmNlIGJ1bmRsZSBhY2Nlc3NvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbXBvcnRYTUxSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gSW1wb3J0WE1MUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW1wb3J0WE1MUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RYTUxGaWxlUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3B0aW9uR3JvdXBfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25Hcm91cDFfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG92ZXJ3cml0ZVJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXJnZVJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRpbmdYTUxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld19sb2dfZmlsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkWE1MRmlsZV9lcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9taXNzaW5nX3BsdWdpbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9ub19lY2xhc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X25vX3BhY2thZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9vYmplY3Rfc3RyaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZERhdGE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZFRvb2w7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEltcG9ydFhNTFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmNGUzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIwotIyBNZXNzYWdlIElEIFJhbmdlOgotIwotCi0jIEltcG9ydCBYTUwgV2l6YXJkCi1pbXBvcnRYTUxXaXphcmRfdGl0bGU9SW1wb3J0IFhNTAotCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UKLXNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlPVNwZWNpZnkgaW1wb3J0IGZpbGUKLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9U3BlY2lmeSB0aGUgWE1MIGZpbGUgY29udGFpbmluZyB0aGUgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBpbXBvcnQsIGFuZCBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGltcG9ydCBvcGVyYXRpb24gdG8gcGVyZm9ybS4KLWZpbGVMYWJlbF90ZXh0PVhNTCBGaWxlOgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi1vcHRpb25Hcm91cF90ZXh0PU1lcmdlIG9wdGlvbgotb3B0aW9uR3JvdXAxX3RleHQ9Q2hlY2sgYmFzZSBwbHVnLWluIG9wdGlvbgotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1PdmVycmlkZSBleGlzdGluZyBtZXRob2QgbGlicmFyeSBjb250ZW50IHdpdGggdGhlIGltcG9ydGVkIGNvbnRlbnQKLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1NZXJnZSBpbXBvcnRlZCBjb250ZW50IGludG8gdGhlIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5Ci0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWltcG9ydGluZ1hNTF90ZXh0PUltcG9ydGluZyBYTUwgbGlicmFyeSBjb250ZW50IGludG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuLi4KLQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZwotcmV2aWV3X2xvZ19maWxlcz1UaGUgaW1wb3J0IG9wZXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuIFJldmlldyB0aGUgbG9nIGZpbGVzIGluIHRoZSBcbicnezB9JycgZm9sZGVyIGZvciBhbnkgZXJyb3JzLgotaW1wb3J0WE1MRXJyb3JfbXNnPUlVUE0wMDAwRTogVGhlIGltcG9ydCBvcGVyYXRpb24gY2Fubm90IHByb2NlZWQuCi1pbXBvcnRYTUxFcnJvcl9yZWFzb249SVVQTTAwMDlFOiBUaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBpcyByZWFkLW9ubHkuXG5cbk1ha2Ugc3VyZSB0aGF0ICcnezB9JycgaXMgd3JpdGFibGUgb3IgY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IGFuZCB0cnkgYWdhaW4uCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWludmFsaWRYTUxGaWxlX2Vycm9yPVRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgaXMgbm90IHZhbGlkLgotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQTTAwMTBFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIHdhcyBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gKHswfSkgb2YgezF9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHsxfS4KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQTTAwMTFFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIHdhcyBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gb2YgezB9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHswfS4KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogVGhlIHNwZWNpZmllZCBYTUwgZmlsZSB3YXMgZXhwb3J0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uICh7MH0pIG9mIHsxfS4gWW91IG11c3QgdXBncmFkZSB7MX0gaW4gb3JkZXIgdG8gaW1wb3J0IHRoZSBmaWxlLiAgCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRTogVGhlIHNwZWNpZmllZCBYTUwgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGUuICAKLQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X25vdF9oYW5kbGVkPUVsZW1lbnQgbm90IGhhbmRsZWQ6IHswfQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxlbWVudCB3aXRob3V0IElEOiB7MH0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1JbXBvcnQgZmFpbGVkOiB7MH0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49TWlzc2luZyByZXF1aXJlZCBwbHVnLWluIHswfQotaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM9TWlzc2luZyByZXF1aXJlZCBwbHVnLWluKHMpLiBQbGVhc2UgY2hlY2sgdGhlIGxvZyBmaWxlcyBmb3IgZGV0YWlscwotCi1saWJyYXJ5X2Vycm9yX25vX2VjbGFzcz1FcnJvciBjcmVhdGluZyBDb250ZW50Q2F0ZWdvcnk6IFVuYWJsZSB0byBnZXQgRUNsYXNzIGZvciB7MH0KLWxpYnJhcnlfbm9fcGFja2FnZT1VbmFibGUgdG8gZmluZCBvd25pbmcgcGFja2FnZSBmb3Igb2JqZWN0IHswfQotbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1FcnJvciBjcmVhdGluZyBlbGVtZW50OiB7MH0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1vYmplY3QgezB9LCBmZWF0dXJlIHsxfQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9RXJyb3Igc2V0dGluZyBhdHRyaWJ1dGU6IEludmFsaWQgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUgezB9Ci1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGU9RXJyb3Igc2V0dGluZyBhdHRyaWJ1dGUgZm9yIG9iamVjdCB7MH0sIGZlYXR1cmUgezF9LCBhbmQgdmFsdWUgezJ9Ci1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMz1EbyBub3Qga25vdyBob3cgdG8gc2V0IGF0dHJpYnV0ZSBmb3Igb2JqZWN0IHswfSwgZmVhdHVyZSB7MX0sIGFuZCB2YWx1ZSB7Mn0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJvciBzZXR0aW5nIHJlZmVyZW5jZSBmb3IgZmVhdHVyZSB7MH06IG5vIGVsZW1lbnQgd2l0aCBpZCB7MX0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yPUVycm9yIHNldHRpbmcgcmVmZXJlbmNlIGZvciBvYmplY3QgezB9LCBmZWF0dXJlIHsxfSwgYW5kIHZhbHVlIHsyfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhNzIzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEltcG9ydCBYTUwgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL0ltcG9ydFhNTFByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvSW1wb3J0WE1MUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhZTE1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvSW1wb3J0WE1MUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MUHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogVGhlIGltcG9ydCBYTUwgZmlsZSBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRklMRSA9ICJ4bWxGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG1lcmdlIG9wdGlvbiBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9PUFRJT04gPSAibWVyZ2VPcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogbGFzdCBpbXBvcnQgY2hlY2sgcGx1Z2lucyBvcHRpb24gcHJlZmVyZW5jZSBrZXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19CQVNFX1BMVUdJTlNfT1BUSU9OID0gImNoZWNrQmFzZVBsdWdpbnNPcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxfRklMRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoTUVSR0VfT1BUSU9OLCBmYWxzZSk7IAotCQlzdG9yZS5zZXREZWZhdWx0KENIRUNLX0JBU0VfUExVR0lOU19PUFRJT04sIHRydWUpOyAJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IFhNTCBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgaW1wb3J0IFhNTCBmaWxlIHByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYTUxGaWxlKCkgewotCQlyZXR1cm4gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJWE1MX0ZJTEUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGltcG9ydCBYTUwgZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIFhNTCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFhNTEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxfRklMRSwKLQkJCQlwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXJnZSBvcHRpb24gZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1lcmdlIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0TWVyZ2VPcHRpb24oKSB7Ci0JCXJldHVybiBJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJTUVSR0VfT1BUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXJnZSBvcHRpb24gZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBtZXJnZU9wdGlvbgotCSAqICAgICAgICAgICAgdGhlIHVzZXIgc3BlY2lmaWVkIG1lcmdlIG9wdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNZXJnZU9wdGlvbihib29sZWFuIG1lcmdlT3B0aW9uKSB7Ci0JCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJTUVSR0VfT1BUSU9OLCBtZXJnZU9wdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoZWNrQmFzZVBsdWdpbnMgb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaGVja0Jhc2VQbHVnaW5zIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2hlY2tCYXNlUGx1Z2luc09wdGlvbigpIHsKLQkJcmV0dXJuIEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlDSEVDS19CQVNFX1BMVUdJTlNfT1BUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVja0Jhc2VQbHVnaW5zIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICB0aGUgdXNlciBzcGVjaWZpZWQgY2hlY2tCYXNlUGx1Z2lucyBvcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2hlY2tCYXNlUGx1Z2luc09wdGlvbihib29sZWFuIGIpIHsKLQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlDSEVDS19CQVNFX1BMVUdJTlNfT1BUSU9OLCBiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjE2NGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBJbXBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFJlc291cmNlSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTFkZDU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkJhc2VSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLlVybEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiByZXNvdXJjZSBoYW5kbGVyIGZvciBjb250ZW50IGluIHRoZSBpbXBvcnRlZCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgQmFzZVJlc291cmNlSGFuZGxlciB7Ci0KLQkJCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIHNvdXJjZUxpYlJvb3QKLQkgKiBAcGFyYW0gdGFyZ2V0TGliUm9vdAotCSAqLwotCXB1YmxpYyBJbXBvcnRSZXNvdXJjZUhhbmRsZXIoRmlsZSBzb3VyY2VMaWJSb290LCBGaWxlIHRhcmdldExpYlJvb3QpIHsKLQkJc3VwZXIoc291cmNlTGliUm9vdCwgdGFyZ2V0TGliUm9vdCk7Ci0JfQotCQotCS8qKgotCSAqIHJlc29sdmUgdGhlIHVybC4gcHV0IHRoZSByZXNvdXJjZXMgaW50byB0aGUgbG9jYXRpb24gYmFzZWQgb24gdGhlIGxpYnJhcnkgcmVzb3VyY2Ugc3RydWN0dXJlIGRlZmluaXRpb24uCi0JICovCi0JcHVibGljIFVybEluZm8gcmVzb2x2ZUZpbGVVcmwoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotCi0JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzcmNVcmwpLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7IAotCQlpbmZvLnRhcmdldEZpbGUgPSBudWxsOwotCi0JCWlmIChpbmZvLnNvdXJjZUZpbGUgPT0gbnVsbCB8fCAhaW5mby5zb3VyY2VGaWxlLmV4aXN0cygpICkgewotCQkJcmV0dXJuIGluZm87Ci0JCX0KLQkJCi0JCWlmICggb3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJLy8gZml4IHRoZSB0YXJnZXQgdXJsIGFuZCAKLQkJCWluZm8udGFyZ2V0VXJsID0gZml4VXJsKHNyY1VybCk7Ci0JCQkKLQkJCS8vU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFJlc291cmNlUGF0aChvd25lcik7Ci0JCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aCggKE1ldGhvZEVsZW1lbnQpb3duZXIpOwotCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IoKE1ldGhvZEVsZW1lbnQpb3duZXIpOwotCQkJU3RyaW5nIHNyY1BsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKChNZXRob2RFbGVtZW50KW93bmVyKTsKLQkJCUZpbGUgc3JjUm9vdCA9IChuZXcgRmlsZShzcmNQbHVnaW5QYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUoc3JjUm9vdCwgZWxlbWVudFBhdGgpLCBpbmZvLnRhcmdldFVybCk7CQotCQl9IGVsc2UgewotCQkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7IAotCQkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc3JjVXJsKTsKLQkJfQotCi0JCXJldHVybiBpbmZvOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZpeFVybChTdHJpbmcgdXJsKSB7Ci0JCXVybCA9IHVybC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsgIAotCQlpbnQgaW5keCA9IHVybC5sYXN0SW5kZXhPZihSZXNvdXJjZUhlbHBlci5SRVNPVVJDRV9GT0xERVIgKyAiLyIpOyAgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGluZHggPj0wICkgewotCQkJcmV0dXJuIHVybC5zdWJzdHJpbmcoaW5keCk7Ci0JCX0KLQkJCi0JCS8vIHB1dCB0aGUgcmVzb3VyY2UgaW50byB0aGUgcmVzb3VyY2VzIGZvbGRlcgotCQlyZXR1cm4gbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuUkVTT1VSQ0VfRk9MREVSLCB1cmwpCi0JCQkudG9TdHJpbmcoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsgCi0JfQotCQotCS8qKgotCSAqIGNvcHlpbmcgdGhlIHJlc291cmNlIGZpbGUgZnJvbSB0aGUgc291cmNlIGxpYnJhcnkgdG8gdGhlIHRhcmdldAotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290Ci0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlLCBFT2JqZWN0IG9iaiwgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gdW1hUGx1Z2luKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKHVtYVBsdWdpbik7Ci0JCVN0cmluZyB0Z3RQbHVnaW5QYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aCh1bWFQbHVnaW4pOwotCQlGaWxlIHRndFBsdWdpblJvb3QgPSBuZXcgRmlsZSh0Z3RQbHVnaW5QYXRoKTsKLQkJRmlsZSBzcmNQbHVnaW5Sb290ID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgdW1hUGx1Z2luLmdldE5hbWUoKSk7Ci0JCQotCQlGaWxlIHNyYyA9IG5ldyBGaWxlKHNyY1BsdWdpblJvb3QsIHNvdXJjZUZpbGUpOwotCQlpZiAoIHNyYy5leGlzdHMoKSApIHsKLQkJCUZpbGUgdGd0ID0gbmV3IEZpbGUodGd0UGx1Z2luUm9vdCwgc291cmNlRmlsZSk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmMsIHRndCk7Ci0JCX0KLQl9Ci0JCi0vLwkvKioKLS8vCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxpYmFyeSByb290LiB1cmxzIG5lZWRzIHRvIGJlIGZpeGVkCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGlicmFyeQotLy8JICogQHBhcmFtIHNyY1VybCB0aGUgdXJsIHJlZmVyZW5jZWQgaW4gdGhlIHNvdXJjZSBjb250ZW50Ci0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhGaXhlZFBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0vLwkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLS8vCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLS8vCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsKLS8vCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzcmNVcmwpOwotLy8JCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNyY1VybCk7Ci0vLwotLy8JCWlmICggb3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSAgewotLy8JCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aCggKE1ldGhvZEVsZW1lbnQpb3duZXIpOwotLy8JCQlpbmZvLnRhcmdldFVybCA9IGJhY2tQYXRoICsgc3JjVXJsOwotLy8JCX0KLS8vCQlyZXR1cm4gaW5mbzsJCi0vLwl9Ci0vLwkKLS8vCS8qKgotLy8JICogdGhlIHJlc291cmNlIHBhdGggd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgb3duZXIgZWxlbWVudC4gCi0vLwkgKiB1cmxzIHdpbGwgbm90IGJlIGNoYW5nZWQgYnV0IHJlc291cmNlIGZpbGVzIGlzIHJlbGljYXRlZC4KLS8vCSAqIEBwYXJhbSBvd25lciBvd25lciB0aGUgb3duZXIgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGlicmFyeQotLy8JICogQHBhcmFtIHNyY1VybAotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwcml2YXRlIFVybEluZm8gbG9hZFVybEluZm9XaXRoUmVsYXRpdmVQYXRoKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgewotLy8JCVVybEluZm8gaW5mbyA9IG5ldyBVcmxJbmZvKCk7Ci0vLwkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0vLwkJaW5mby50YXJnZXRVcmwgPSBpbmZvLnNvdXJjZVVybDsgLy8gbm8gdXJsIGNoYW5nZQotLy8JCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY1VybCk7Ci0vLwkJCi0vLwkJaWYgKCBvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICB7Ci0vLwkJCS8vU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFJlc291cmNlUGF0aChvd25lcik7Ci0vLwkJCVN0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRSZXNvdXJjZVBhdGgoKE1ldGhvZEVsZW1lbnQpb3duZXIpOwotLy8JCQlpbmZvLnRhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBlbGVtZW50UGF0aCksIHNyY1VybCk7CQkJCi0vLwkJfQotLy8KLS8vCQlyZXR1cm4gaW5mbzsKLS8vCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1MU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjU5YzFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQ29udGVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuSVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkRpYWdyYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5GZWF0dXJlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5YTUxMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5GaWxlTW9kaWZ5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkxpYnJhcnlJbXBvcnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5QbHVnaW5Nb2RpZnlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uSU1pZ3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWFwcGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBYbWwgaW1wb3J0IHNlcnZpY2UgY2xhc3MgdG8gcHJvY2VzcyB0aGUgaW1wb3J0aW5nIHRhc2sKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTFNlcnZpY2UgewotCi0JcHJpdmF0ZSBMaXN0IHVubG9ja2VkUGx1Z2luczsgCi0JCi0JcHJpdmF0ZSBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBNYXAgcmVuYW1lRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZSA9IGZhbHNlOwotCQotCXByaXZhdGUgSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgeG1sUGF0aDsKLQotCXByaXZhdGUgWE1MTGlicmFyeSB4bWxMaWI7Ci0KLQlwcml2YXRlIFVtYUxpYnJhcnkgdW1hTGliOwotCi0JcHJpdmF0ZSBJbXBvcnRYTUxvZ2dlciBsb2dnZXIgPSBuZXcgSW1wb3J0WE1Mb2dnZXIoKTsKLQotCXByaXZhdGUgTGlzdCBkaXNjYXJkZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0JCi0JLy90ZHMgd2l0aCBzdGVwcwotCXByaXZhdGUgTWFwPFN0cmluZywgVGFza0Rlc2NyaXB0b3I+IHRkTWFwOwotCQotCS8vIG1hcCB4bWwgV29ya09yZGVyIHRvIHVtYSBXb3JrT3JkZXIKLQlNYXAgd29ya09yZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIElNaWdyYXRvciBtaWdyYXRvcjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucyA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1MU2VydmljZSgpIHsKLQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSB4bWwgZmlsZS4KLQkgKiBAcGFyYW0geG1sUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBsb2FkWG1sKGZpbmFsIFN0cmluZyB4bWxQYXRoKSB7Ci0JCVN0cmluZyB2ZXJzaW9uRXJyb3IgPSB2ZXJzaW9uQ2hlY2soeG1sUGF0aCwJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZSk7CQkKLQkJaWYgKHZlcnNpb25FcnJvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQkKLQkJdGhpcy54bWxQYXRoID0geG1sUGF0aDsKLQotCQlsb2dnZXIubG9nTWVzc2FnZSgiTG9hZGluZyB4bWwgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMueG1sTGliID0gbmV3IFhNTExpYnJhcnkobnVsbCwgbG9nZ2VyLCB4bWxQYXRoKTsKLQkJCXRoaXMueG1sTGliLmxvYWQoKTsKLQkJCXJldCA9IGNoZWNrT2xkUGx1Z2lucygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKAotCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbCwgeG1sUGF0aCksIGUpOwotCQkJZmluYWwgU3RyaW5nIGVyclN0ciA9IGUudG9TdHJpbmcoKTsKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewkKLQkJCQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbCwgeG1sUGF0aCksIGVyclN0cik7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja09sZFBsdWdpbnMoKSB7Ci0JCQotCQl1bmxvY2tlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZU5hbWVUb0NoZWNrID0gbmV3IEFycmF5TGlzdCgpOwotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIGd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IGJhc2VQbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbikgYmFzZVBsdWdpbnMuZ2V0KGkpOwotCQkJbWFwLnB1dChwbHVnaW4uZ2V0TmFtZSgpLCBwbHVnaW4pOwotCQkJZ3VpZE1hcC5wdXQocGx1Z2luLmdldEd1aWQoKSwgcGx1Z2luKTsKLQkJfQotCQkKLQkJTGlzdCBwbHVnaW5zID0gKChNZXRob2RMaWJyYXJ5KSB4bWxMaWIuZ2V0Um9vdCgpKS5nZXRNZXRob2RQbHVnaW4oKTsKLQkJTGlzdCBndWlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBwbHVnaW5zLmdldChpKTsKLQkJCWd1aWRzLmFkZChlbGVtLmdldElkKCkpOwotCQkJCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gCi0JCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luKSBtYXAuZ2V0KGVsZW0uZ2V0TmFtZSgpKTsKLQkJCWJvb2xlYW4gdG9BZGQgPSBmYWxzZTsKLQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwgJiYgISBiYXNlUGx1Z2luLmdldEd1aWQoKS5lcXVhbHMoZWxlbS5nZXRJZCgpKQotCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCXRvQWRkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmFzZVBsdWdpbiA9IAotCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4pIGd1aWRNYXAuZ2V0KGVsZW0uZ2V0SWQoKSk7Ci0JCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCAvKiYmICEgYmFzZVBsdWdpbi5nZXROYW1lKCkuZXF1YWxzKGVsZW0uZ2V0TmFtZSgpKSovCi0JCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCQl0b0FkZCA9IHRydWU7Ci0JCQkJfSAKLQkJCX0KLQkJCWlmICh0b0FkZCkgewotCQkJCXVubG9ja2VkUGx1Z2lucy5hZGQoYmFzZVBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCWJhc2VQbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCVJlc291cmNlIHJlcyA9IGJhc2VQbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJZmlsZU5hbWVUb0NoZWNrLmFkZChmaWxlTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChmaWxlTmFtZVRvQ2hlY2suc2l6ZSgpID4gMCkgewotCQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gZmlsZU5hbWVUb0NoZWNrOwkKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCWlmICghIHVubG9ja2VkUGx1Z2lucy5pc0VtcHR5KCkgJiYgKGZpbGVDaGVja2VkT3V0U3RhdHVzICE9IG51bGwpCi0JCQkJJiYgIWZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJLy8gbG9nIGVycm9yCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1zZyA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ7IAotCQkJCQluZXcgTXNnRGlhbG9nKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkpCi0JCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIGZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWZpbmFsIFBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkoZ3VpZHMsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgZmFsc2UpOwkJCi0KLQkJLy8gYWxsb3cgdXNlciB0byBwcm9jZWVkIHdpdGggbG9ja2VkIHBsdWdpbnMKLQkJaWYgKCBtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCApIHsKLQkJCWZpbmFsIGJvb2xlYW4gcmV0W10gPSBuZXcgYm9vbGVhblsxXTsKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyBXSVpBUkRfVElUTEUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBtb2RpZnlJbmZvLmdldExvY2tlZE1lc3NhZ2UoKS50b1N0cmluZygpICsKLQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZTsgCi0JCQkJCXJldFswXSA9IEltcG9ydFhNTFBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUNvbmZpcm1hdGlvbihXSVpBUkRfVElUTEUsIG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0pOwkJCi0JCQlyZXR1cm4gcmV0WzBdOwotCQl9IAkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbG9nIGZpbGUuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0TG9nUGF0aCgpIHsKLQkJcmV0dXJuIGxvZ2dlci5nZXRMb2dQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJZGlzY2FyZGVkRWxlbWVudHMuY2xlYXIoKTsKLQkJd29ya09yZGVyTWFwLmNsZWFyKCk7Ci0JCWxvZ2dlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBYTUwgZXhwb3J0LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ltcG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQkKLQkJCWhhbmRsZVR5cGVDaGFuZ2VzKCk7Ci0JCQkKLQkJCUlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBJbXBvcnRSZXNvdXJjZUhhbmRsZXIobmV3IEZpbGUoCi0JCQkJCXhtbFBhdGgpLmdldFBhcmVudEZpbGUoKSwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKSk7Ci0KLQkJCUNvbnRlbnRQcm9jZXNzb3IgY29udGVudFByb2MgPSBuZXcgQ29udGVudFByb2Nlc3NvcihoYW5kbGVyLAotCQkJCQl0aGlzLmxvZ2dlcik7Ci0JCQkKLQkJCWRpYWdyYW1IYW5kbGVyID0gbmV3IERpYWdyYW1IYW5kbGVyKG5ldyBGaWxlKAotCQkJCQl4bWxQYXRoKS5nZXRQYXJlbnRGaWxlKCksIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKSkgewkJCQkKLQkJCQkvL1swXTogc291cmNlRmlsZQotCQkJCS8vWzFdOiB0YXJnZXRGaWxlCi0JCQkJcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQkJCQlGaWxlW10gZmlsZXMgPSBzdXBlci5nZXRGaWxlcyhlbGVtLCBmYWxzZSk7Ci0JCQkJCQkJCQkJCi0JCQkJCUVEYXRhT2JqZWN0IHhtbE9iaiA9IHhtbExpYi5nZXRFbGVtZW50KGVsZW0uZ2V0R3VpZCgpKTsKLQkJCQkJaWYgKHhtbE9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYyA9IAotCQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykgeG1sT2JqOwotCQkJCQkJU3RyaW5nIHVyaSA9IHByb2MuZ2V0RGlhZ3JhbVVSSSgpOwotCQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRTb3VyY2VMaWJSb290KCksIHVyaSk7Ci0JCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxEOiBmaWxlOiAiICsgZmlsZSk7Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJZmlsZXNbMF0gPSBmaWxlOwotCQkJCQkJCQlmaWxlc1sxXSA9IG5ldyBGaWxlKGdldFRhcmdldExpYlJvb3QoKSwgdXJpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ6IGZpbGVzWzBdOiAiICsgZmlsZXNbMF0pOwotCQkJCQkJCX0KLQkJCQkJCX0JCQkJCQotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gZmlsZXM7Ci0JCQkJfQotCQkJCQotCQkJfTsKLQotCQkJdGhpcy54bWxMaWIuZml4TGlicmFyeUZvckltcG9ydCgpOwotCi0JCQkvLyBtYWtlIHN1cmUgYWxsIHRoZSBkZXBlbmRlbnQgcGx1Z2lucyBhcmUgdGhlcmUKLQkJCUxpc3QgcmVmZXJlbmNlZFBsdWdpbnMgPSB4bWxMaWIuZ2V0UmVmZXJlbmNlZFBsdWdpbnMoKTsKLQkJCWlmIChyZWZlcmVuY2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZQotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJCUxpc3QgcGx1Z2lucyA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luKSBpdAotCQkJCQkJCQkubmV4dCgpKS5nZXRHdWlkKCk7Ci0JCQkJCQlyZWZlcmVuY2VkUGx1Z2lucy5yZW1vdmUoaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaXNDaGVja0Jhc2VQbHVnaW5zKCkgJiYgcmVmZXJlbmNlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IHhtbExpYi5nZXRHdWlkVG9QbHVnTmFtZU1hcCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZWZlcmVuY2VkUGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBuYW1lQW5kSWQgPSAiIjsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gbWFwLmdldChpZCk7Ci0JCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJbmFtZUFuZElkICs9IG5hbWUgKyAiLCAiOy8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQluYW1lQW5kSWQgKz0gaWQ7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9taXNzaW5nX3BsdWdpbiwgbmFtZUFuZElkKSwKLQkJCQkJCQludWxsKTsJCQkKLQkJCQl9Ci0KLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zKTsKLQkJCX0KLQotCQkJdGhpcy51bWFMaWIgPSBuZXcgVW1hTGlicmFyeShyZW5hbWVFbGVtZW50TWFwLCBjb250ZW50UHJvYywgbG9nZ2VyLCBvdmVyd3JpdGUpOwotCi0JCQlFRGF0YU9iamVjdCB4bWxSb290ID0gdGhpcy54bWxMaWIuZ2V0Um9vdCgpOwotCQkJRURhdGFPYmplY3QgdW1hUm9vdCA9IHRoaXMudW1hTGliLmdldFJvb3QoKTsKLQkJCQotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImNyZWF0ZSB0YXJnZXQgbGlicmFyeSBlbGVtZW50cyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUoeG1sUm9vdCwgdW1hUm9vdCk7Ci0KLQkJCWxvZ2dlcgotCQkJCQkubG9nTWVzc2FnZSgiY29weWluZyBhbGwgZmVhdHVyZSB2YWx1ZXMgZm9yIHRhcmdldCBsaWJyYXJ5IGVsZW1lbnRzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgeG1sUm9vdCk7Ci0KLQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJmaXggdGhlIHRhcmdldCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl1bWFMaWIuZml4TGlicmFyeSgpOwotCQkJdW1hTGliLmZpeFRhc2tEZXNjcmlwdG9ycyh0ZE1hcCk7Ci0KLQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmhhbmRsZU5hbWVSZXBsYWNlKHJlbmFtZUVsZW1lbnRNYXApOwotCQkJCi0JCQlkaWFncmFtSGFuZGxlci5wb3N0UmVnaXN0ZXJFbGVtZW50cygpOwotCQkJCi0JCQkvLyBkZWxldGUgdGhlIHVuLW5lZWRlZCBlbGVtZW50cwotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImRlbGV0ZSB1bm5lZWRlZCBlbGVtZW50cyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJdW1hTGliLmRlbGV0ZUVsZW1lbnRzKCk7Ci0JCQkKLQkJCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IEZpbGVNb2RpZnlDaGVja2VyLmdldE1vZGlmaWVkRmlsZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS4KLQkJCQkJCQkJCQlnZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwoZGlhZ3JhbUhhbmRsZXIuZ2V0TW9kaWZpZWRGaWxlcygpKTsKLQkJCWZpbmFsIElTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5zeW5jRXhlY0NoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJCi0JCQlpZiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgic2F2aW5nIHRhcmdldCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCQkJTGlzdCBjb25maWdzID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJCWludCBjb25maWdTeiA9IGNvbmZpZ3MgPT0gbnVsbCA/IDAgOiBjb25maWdzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8Y29uZmlnU3o7IGkrKykgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gCi0JCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uICkgY29uZmlncy5nZXQoaSk7Ci0JCQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoY29uZmlnU3ogIT0gMCkgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgY3VyckxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGN1cnJMaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCWlmIChwZXJzaXN0ZXIgaW5zdGFuY2VvZiBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgewotCQkJCQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgaXAgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHBlcnNpc3RlcjsKLQkJCQkJCUZpbGUgY29uZmlnRm9sZGVyID0gaXAuZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoY3VyckxpYik7Ci0JCQkJCQlpZiAoY29uZmlnRm9sZGVyICE9IG51bGwpIHsKLQkJCQkJCQlpcC5zZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihjdXJyTGliLCBjb25maWdGb2xkZXIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZG9uJ3QgcmVmcmVzaCB0aGUgd29ya3NwYWNlCi0JCQkJaWYgKHVubG9ja2VkUGx1Z2lucyAhPSBudWxsICYmICEgdW5sb2NrZWRQbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJCQlMaWJyYXJ5SW1wb3J0TWFuYWdlci5sb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBmYWxzZSwgZmFsc2UpOwotCQkJCWRpYWdyYW1IYW5kbGVyLmV4ZWN1dGUoKTsJCQkJCi0JCi0JCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoInJlLW9wZW4gdGFyZ2V0IGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJaWYgKG1pZ3JhdG9yICE9IG51bGwpIHsKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJbWlncmF0b3IubWlncmF0ZVhtbEltcG9ydGVkTGliKGxpYiwgbW9uaXRvcik7CQkJCQkKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0KLQkJCQkJCi0JCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImltcG9ydCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZDsgCi0JCQkJCQluZXcgTXNnRGlhbG9nKEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCBmaWxlQ2hlY2tlZE91dFN0YXR1cyk7Ci0JCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9CQotCQkJCQkJCi0JCQkvL1Jlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS8vCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgbW9uaXRvcik7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotCi0JCQl0aHJvdyBlOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdEVEYXRhT2JqZWN0VHJlZShFRGF0YU9iamVjdCB4bWxPYmosIEVEYXRhT2JqZWN0IHVtYU9iaikgewotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB4bWxPYmouZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRURhdGFPYmplY3QgY2hpbGQgPSAoRURhdGFPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWNyZWF0ZVJtY09iamVjdChjaGlsZCwgdW1hT2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSbWNPYmplY3QoRURhdGFPYmplY3QgeG1sRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lcikgewotCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGdldCB0aGUgdGFyZ2V0Q29udGFpbmVyJ3MgY29udGFpbmluZyBmZWF0dXJlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0geG1sRWxlbWVudC5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCWNyZWF0ZVJtY09iamVjdCh4bWxFbGVtZW50LCB0YXJnZXRDb250YWluZXIsIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUm1jT2JqZWN0KEVEYXRhT2JqZWN0IHhtbEVsZW1lbnQsCi0JCQlFRGF0YU9iamVjdCB0YXJnZXRDb250YWluZXIsIFN0cmluZyBjb250YWlubWVudFhtbEZlYXR1cmUpIHsKLQotCQl0cnkgewotCQkJaWYgKHhtbEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJRURhdGFPYmplY3QgdW1hRWxlbWVudCA9IG51bGw7Ci0KLQkJCS8vIGRvbid0IGNyZWF0ZSBjb250ZW50IGNhdGVnb3J5IHBhY2thZ2Ugc2luY2UgaW4gdW1hLCBpdCdzCi0JCQkvLyBzZXBlcmF0ZWQgYmFzZWQgb24gdHlwZQotCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgeG1sRWxlbWVudDsKLQkJCQl1bWFFbGVtZW50ID0gdW1hTGliLmNyZWF0ZU1ldGhvZFBsdWdpbihwbHVnaW4uZ2V0SWQoKSwgcGx1Z2luCi0JCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCX0gZWxzZSBpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHsKLQkJCQkvLyBkb24ndCBjcmVhdGUsIGRvIG5vdGhpbmcKLQkJCQkvLyBtYXJrIGFzIGRpc2NhcmRlZCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNvcHkgaXQncyBhdHRyaWJ1dGVzCi0JCQkJc2V0RGlzY2FyZGVkKCgoQ29udGVudENhdGVnb3J5UGFja2FnZSkgeG1sRWxlbWVudCkuZ2V0SWQoKSk7Ci0KLQkJCX0gZWxzZSBpZiAoKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpCi0JCQkJCSYmICEoeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEb21haW4gCi0JCQkJCQkJfHwgeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKQotCQkJCQl8fCAoeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSkgewotCQkJCS8vIGNyZWF0ZSB0aGUgY29udGVudCBjYXRlZ29yaWVzIGZvciByb290IGNvbnRlbnQgY2F0ZWdvcmllcywKLQkJCQkvLyBub3QgZm9yIHN1Yi1kb21haW4gYW5kIHN1Yi1kaXNjaXBsaW5lCi0JCQkJLy8gMTU0MTQzIC0gaW1wb3J0IHhtbCBkaWQgbm90IHJlc2VydmUgdGhlIHN1Yi1kaXNjaXBsaW5lIHN0cnVjdHVyZQotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGdldFBsdWdpbih4bWxFbGVtZW50KS5nZXRJZCgpOwotCQkJCXVtYUVsZW1lbnQgPSB1bWFMaWIuY3JlYXRlQ29udGVudENhdGVnb3J5KHBsdWdpbklkLCB4bWxFbGVtZW50Ci0JCQkJCQkuZUNsYXNzKCkuZ2V0TmFtZSgpLCB4bWxFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCksCi0JCQkJCQl4bWxMaWIuZ2V0RWxlbWVudElkKHhtbEVsZW1lbnQpKTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQkvLyBpZiB0aGlzIGlzIHJvb3QgbGV2ZWwgcGFja2FnZSwgZmluZCB0aGUgY29ycmVzcG9uZGluZwotCQkJCS8vIGNvbnRhaW5lciBmb3IgdGhlIFVNQSBvYmplY3QKLQkJCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJCSYmIHhtbEVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCXRhcmdldENvbnRhaW5lciA9IHVtYUxpYgotCQkJCQkJCQkuZ2V0Q29udGVudFJvb3RQYWNrYWdlKHRhcmdldENvbnRhaW5lcik7Ci0JCQkJCX0gZWxzZSBpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCU9iamVjdCBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSB4bWxFbGVtZW50KQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCXRhcmdldENvbnRhaW5lciA9IHVtYUxpYgotCQkJCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCXRhcmdldENvbnRhaW5lciA9IHVtYUxpYgotCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc1Jvb3RQYWNrYWdlKHRhcmdldENvbnRhaW5lcik7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCQlMaXN0IHByb2NzID0geG1sTGliCi0JCQkJCQkJCS5nZXRBbGxQcm9jZXNzZXMoKE1ldGhvZFBhY2thZ2UpIHhtbEVsZW1lbnQpOwotCQkJCQkJaWYgKHByb2NzICE9IG51bGwgJiYgcHJvY3Muc2l6ZSgpID4gMCkgewotCQkJCQkJCU9iamVjdCBwcm9jID0gcHJvY3MuZ2V0KDApOwotCQkJCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc1Jvb3RQYWNrYWdlKHRhcmdldENvbnRhaW5lcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmICh0YXJnZXRDb250YWluZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yICYmCi0JCQkJCWNvbnRhaW5tZW50WG1sRmVhdHVyZS5lcXVhbHMoInN0ZXAiKSkgewkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZ2V0IHRoZSBjb250YWlubWVudCBmZWF0dXJlIHNvIHdlIGNhbiBjcmVhdGUgdGhlIG9iamVjdCBvZgotCQkJCS8vIHRoZSBzYW1lIHR5cGUKLQkJCQl1bWFFbGVtZW50ID0gdW1hTGliLmNyZWF0ZUVsZW1lbnQodGFyZ2V0Q29udGFpbmVyLAotCQkJCQkJY29udGFpbm1lbnRYbWxGZWF0dXJlLCB4bWxFbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKSwKLQkJCQkJCXhtbEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSwgeG1sTGliCi0JCQkJCQkJCS5nZXRFbGVtZW50SWQoeG1sRWxlbWVudCkpOwotCQkJCQotCQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIHhtbEVsZW1lbnQ7Ci0JCQkJCWlmICh0ZC5nZXRUYXNrKCkgIT0gbnVsbCkgewotCQkJCQkJTGlzdCBzdGVwcyA9IHRkLmdldFN0ZXAoKTsKLQkJCQkJCWlmIChzdGVwcyAhPSBudWxsICYmICFzdGVwcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlpZiAodGRNYXAgPT0gbnVsbCkgewotCQkJCQkJCQl0ZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGFza0Rlc2NyaXB0b3I+KCk7Ci0JCQkJCQkJfQotCQkJCQkJCXRkTWFwLnB1dCh0ZC5nZXRJZCgpLCB0ZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyB4bWwgV29ya09yZGVyIGRvZXMgbm90IGhhdmUgYW4gaWQsIG5lZWQgdG8gbWFwIHRoZSB1bWEgT2JqZWN0Ci0JCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJd29ya09yZGVyTWFwLnB1dCh4bWxFbGVtZW50LCB1bWFFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlY3Vyc2l2ZSwKLQkJCS8vIG5vdGUsIHVtYSBlbGVtZW50IG1pZ2h0IGJlIG51bGwgc2luY2Ugd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZQotCQkJLy8gb3duZXIgb2YgdGhlIGVsZW1lbnQgeWV0Ci0JCQljcmVhdEVEYXRhT2JqZWN0VHJlZSh4bWxFbGVtZW50LCB1bWFFbGVtZW50KTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIHRoZSBlcnJvciBhbmQgY29udGludWU/Pz8KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oRU9iamVjdCBlbGVtZW50KSB7Ci0JCXdoaWxlICgoZWxlbWVudCAhPSBudWxsKSAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQllbGVtZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gKE1ldGhvZFBsdWdpbikgZWxlbWVudDsKLQl9Ci0KLQlwcml2YXRlIEVEYXRhT2JqZWN0IGdldFJtY09iamVjdChNZXRob2RFbGVtZW50IHhtbE9iaikgewotCQlpZiAoeG1sT2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcmV0dXJuIHVtYUxpYi5nZXRSb290KCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgaWQgPSB4bWxPYmouZ2V0SWQoKTsKLQkJCXJldHVybiB0aGlzLnVtYUxpYi5nZXRFbGVtZW50KGlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpdGVyYXRFRGF0YU9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlpdGVyYXRFRGF0YU9iamVjdF8oc3JjT2JqKTsKLQkJRURhdGFPYmplY3QgdGFyZ2V0T2JqID0gZ2V0Um1jT2JqZWN0KHNyY09iaik7Ci0JCWlmICh0YXJnZXRPYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCWRpYWdyYW1IYW5kbGVyLnJlZ2lzdGVyRWxlbWVudCgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB0YXJnZXRPYmopOyAKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaXRlcmF0RURhdGFPYmplY3RfKE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0KLQkJbG9nZ2VyCi0JCQkJLmxvZ01lc3NhZ2UoIiA9PT0gcHJvY2Vzc2luZyBlbGVtZW50ICIgKyBzcmNPYmouZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6ICIgKyBzcmNPYmouZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaWYgKGlzUHJvY2Vzc2VkKHNyY09iai5nZXRJZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFByb2Nlc3NlZChzcmNPYmouZ2V0SWQoKSk7Ci0KLQkJLy8gaWYgb2JqZWN0IGlzIG5vdCBjcmVhdGVkLCBpdCdzIHhtbCB3cmFwcGVyIHBhY2thZ2UKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHsKLQotCQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGQgcGFja2FnZXMKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHNyY09iaikKLQkJCQkJLmdldENvbnRlbnRDYXRlZ29yeSgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUVEYXRhT2JqZWN0IHRhcmdldE9iaiA9IGdldFJtY09iamVjdChzcmNPYmopOwotCQlFQ2xhc3MgZUNsYXNzID0gc3JjT2JqLmVDbGFzcygpOwotCi0JCUVMaXN0IGZlYXR1cmVzID0gZUNsYXNzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJYm9vbGVhbiBpc05ld0VsZW1lbnQgPSB1bWFMaWIuaXNOZXdFbGVtZW50KHNyY09iai5nZXRJZCgpKSB8fCBzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5OwotCQlib29sZWFuIGlzT2xkUGx1Z2luID0gIWlzTmV3RWxlbWVudCAmJiAoc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCQkJCQotCQkJaWYgKEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmlzVW5uZWVkZWRYbWxGZWF0dXJlKGZlYXR1cmUuZ2V0TmFtZSgpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGlzT2xkUGx1Z2luICYmIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpID09IGZlYXR1cmUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJT2JqZWN0IHZhbHVlID0gc3JjT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWJvb2xlYW4gaXNNZXAgPSBmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCQotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QgJiYgISBpc01lcCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0diA9ICgoTGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7IGl0dgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgc3JjX3ZhbHVlID0gaXR2Lm5leHQoKTsKLQotCQkJCQkJaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCi0JCQkJCQkJLy8gaXQncyBhbiBpZCByZWZlcmVuY2UKLQkJCQkJCQl1bWFMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCAoU3RyaW5nKSBzcmNfdmFsdWUpOwotCQkJCQkJfSBlbHNlIGlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJLy8gc2V0IHRoZSByZWZlcmVuY2UKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlOwotCQkJCQkJCVN0cmluZyBndWlkID0gZS5nZXRJZCgpOwotCi0JCQkJCQkJLy8gZG9uJ3Qgc2V0IHRoZSBjb250YWlubWVudCBmZWF0dXJlIHZhbHVlIHNpbmNlCi0JCQkJCQkJLy8gaXQncyBhbHJlYWR5IGhhbmRsZWQKLQkJCQkJCQkvLyB3aGVuIGNyZWF0aW5nIHRoZSBsaWJyYXJ5IHN0cnVjdHVyZQotCQkJCQkJCWlmICghaXNEaXNjYXJkZWQoZ3VpZCkgJiYgZS5lQ29udGFpbmVyKCkgIT0gc3JjT2JqKSB7Ci0JCQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCQkuZ2V0TmFtZSgpLCBndWlkKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlKTsKLQkJCQkJCX0gZWxzZSBpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCQkJLy8gV29ya09yZGVyIGlzIG5vdCBtZXRob2QgZWxlbWVudCBhbmQgZG9lcyBub3QgaGF2ZQotCQkJCQkJCS8vIGFuIGlkLCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcKLQkJCQkJCQkvLyBzZXQgdGhlIHByZWRlCi0JCQkJCQkJV29ya09yZGVyIHdyID0gKFdvcmtPcmRlcikgc3JjX3ZhbHVlOwotCQkJCQkJCU9iamVjdCB1bWFXciA9IHdvcmtPcmRlck1hcC5nZXQod3IpOwotCQkJCQkJCXVtYUxpYi5zZXRXb3JrT3JkZXIodW1hV3IsIHdyLmdldFZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlsb2dnZXIKLQkJCQkJCQkJCS5sb2dNZXNzYWdlKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQsIHNyY192YWx1ZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiAhIGlzTWVwKSB7Ci0KLQkJCQkJLy8gZ2V0IHRoZSB4bWwgb2JqZWN0IGFuZCBpdGVyYXRlIGFnYWluCi0JCQkJCU9iamVjdCBzcmNfdmFsdWUgPSB2YWx1ZTsKLQotCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCQlsb2dnZXIubG9nTWVzc2FnZSgid29ya29yZGVyIHZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIGlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcKLQkJCQkJCQkmJiAhaXNEaXNjYXJkZWQoKFN0cmluZykgc3JjX3ZhbHVlKSkgewotCQkJCQkJLy8gaXQncyBhbiBpZCByZWZlcmVuY2UKLQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUuZ2V0TmFtZSgpLAotCQkJCQkJCQkoU3RyaW5nKSBzcmNfdmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCS8vIHNldCB0aGUgcmVmZXJlbmNlCi0JCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlKS5nZXRJZCgpOwotCQkJCQkJaWYgKGd1aWQgPT0gbnVsbCkgewotCQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkLCAoKE1ldGhvZEVsZW1lbnQpIHNyY192YWx1ZSkKLQkJCQkJCQkJCS5nZXROYW1lKCkpKTsKLQkJCQkJCX0KLQkJCQkJCWlmICghaXNEaXNjYXJkZWQoZ3VpZCkpIHsKLQkJCQkJCQl1bWFMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCBndWlkKTsKLQkJCQkJCX0KLQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbG9nZ2VyCi0JCQkJCQkJCS5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQsIHNyY192YWx1ZSkpOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodGFyZ2V0T2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImhycmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyVHlwZSkgewotCQkJCQkJdmFsdWUgPSAoKFdvcmtPcmRlclR5cGUpIHZhbHVlKS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWJvb2xlYW4gcmVuYW1lID0gZmFsc2U7Ci0JCQkJCWlmICghaXNOZXdFbGVtZW50ICYmIGZlYXR1cmUgPT0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSkgewotCQkJCQkJU3RyaW5nIG9sZE5hbWUgPSAoU3RyaW5nKXRhcmdldE9iai5lR2V0KG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCQlTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpc3JjT2JqLmVHZXQoZmVhdHVyZSk7CQkJCQotCQkJCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhvbGROYW1lKSkgewotCQkJCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmVuc3VyZVVuaXF1ZU5hbWVGb3JFeGlzdGluZ0VsZW1lbnQKLQkJCQkJCQkJKChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHRhcmdldE9iaiwgb2xkTmFtZSwgbmV3TmFtZSwgcmVuYW1lRWxlbWVudE1hcCk7Ci0JCQkJCQkJcmVuYW1lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXJlbmFtZSkgewotCQkJCQkJdW1hTGliLnNldEF0cmlidXRlRmVhdHVyZVZhbHVlKHRhcmdldE9iaiwKLQkJCQkJCQkJZmVhdHVyZS5nZXROYW1lKCksIHZhbHVlKTsKLQkJCQkJfQotCQkJCQlpZiAoaXNOZXdFbGVtZW50ICYmIGZlYXR1cmUgPT0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IGVsZW0gPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB0YXJnZXRPYmo7Ci0JCQkJCQlFT2JqZWN0IGNlb2JqID0gZWxlbS5lQ29udGFpbmVyKCk7CQkJCQkJCi0JCQkJCQlpZiAoY2VvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgJiYgCi0JCQkJCQkJCSEgdW1hTGliLmlzTmV3RWxlbWVudCgoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgY2VvYmopLmdldEd1aWQoKSkpIHsKLQkJCQkJCQlMaWJyYXJ5SW1wb3J0TWFuYWdlci5lbnN1cmVVbmlxdWVOYW1lKGNlb2JqLCBlbGVtLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgdGhlIGVycm9yIGFuZCBjb250aW51ZT8/PwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLy8gZ29pZCBvZiBwcm9jZXNzZWQgZWxlbWVudAotCXByaXZhdGUgTGlzdCBwcm9jZXNzZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlpZiAoIXByb2Nlc3NlZEVsZW1lbnRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQlwcm9jZXNzZWRFbGVtZW50cy5hZGQoZ3VpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXNjYXJkZWQoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBkaXNjYXJkZWRFbGVtZW50cy5jb250YWlucyhpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc2NhcmRlZChTdHJpbmcgaWQpIHsKLQkJZGlzY2FyZGVkRWxlbWVudHMuYWRkKGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyBvdmVyd3JpdGUgYXR0cmlidXRlLgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlKGJvb2xlYW4gYikgewotCQlvdmVyd3JpdGUgPSBiOwotCX0JCi0JCi0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbkNoZWNrKGZpbmFsIFN0cmluZyB4bWxQYXRoLCBmaW5hbCBTdHJpbmcgdGl0bGUpIHsKLQkJZmluYWwgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1sxXTsKLQkJcmV0WzBdID0gbnVsbDsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewkKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQkJCi0JCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwuY2hlY2tYTUxWZXJzaW9uKG5ldyBGaWxlKHhtbFBhdGgpKTsKLQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChpbmZvLnJlc3VsdCA8IDApIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWlncmF0b3IgPSBNYXBwaW5nVXRpbC5nZXRNaWdyYXRvckJ5TGliUGF0aCh4bWxQYXRoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmV0WzBdID0gZS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKG1pZ3JhdG9yID09IG51bGwgJiYgcmV0WzBdID09IG51bGwpIHsKLQkJCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7CQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2wsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9Ci0JCQkJCX0gCi0JCQkJfQotCQkJCWlmIChyZXRbMF0gIT0gbnVsbCkgewotCQkJCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgcmV0WzBdKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSk7CQkKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JIHB1YmxpYyB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKCkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgYmFzZUxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlIYXNoTWFwIGJhc2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5jb2xsZWN0UG90ZW50aWFsVHlwZUNoYW5nZWQoYmFzZUxpYiwgYmFzZU1hcCk7Ci0JCQotCQlIYXNoTWFwIGVDbGFzc09iak1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUhhc2hNYXAgaW1wb3J0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHhtbExpYi5nZXRSb290KCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UgfHwKLQkJCQlvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCU1ldGhvZEVsZW1lbnQgeG1sRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJU3RyaW5nIGVDbGFzc05hbWUgPSB4bWxFbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlPYmplY3QgZUNsYXNzT2JqID0gZUNsYXNzT2JqTWFwLmdldChlQ2xhc3NOYW1lKTsKLQkJCQlpZiAoZUNsYXNzT2JqID09IG51bGwpIHsKLQkJCQkJRUNsYXNzIG9iakVDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0VDbGFzcyhlQ2xhc3NOYW1lKTsKLQkJCQkJaWYgKG9iakVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQllQ2xhc3NPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUob2JqRUNsYXNzKTsKLQkJCQkJCWVDbGFzc09iak1hcC5wdXQoZUNsYXNzTmFtZSwgZUNsYXNzT2JqKTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVDbGFzc09iaiAhPSBudWxsKSB7Ci0JCQkJCWltcG9ydE1hcC5wdXQoeG1sRWxlbWVudC5nZXRJZCgpLCBlQ2xhc3NPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuaGFuZGxlVHlwZUNoYW5nZXMoYmFzZU1hcCwgaW1wb3J0TWFwKTsJCi0JfQotCSAKLQlwcml2YXRlIGJvb2xlYW4gaXNDaGVja0Jhc2VQbHVnaW5zKCkgewotCQlyZXR1cm4gY2hlY2tCYXNlUGx1Z2luczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja0Jhc2VQbHVnaW5zKGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucykgewotCQl0aGlzLmNoZWNrQmFzZVBsdWdpbnMgPSBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxvZ2dlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MmQwZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5GaWxlTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotCi0vKioKLSAqIExvZ2dlciBjbGFzcyBmb3IgeG1sIGltcG9ydAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1Mb2dnZXIgZXh0ZW5kcyBGaWxlTG9nZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1NfRk9MREVSID0gImxvZ3MvaW1wb3J0L3htbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBJbXBvcnRYTUxvZ2dlcigpIHsKLQkJc3VwZXIobmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCksIExPR1NfRk9MREVSKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL1VtYUxpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkMmQzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQ29udGVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5GZWF0dXJlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotCi0vKioKLSAqIFVtYUxpYnJhcnkgcmVwcmVzZW50cyBhIG1ldGhvZCBsaWJyYXJ5IGFuZCBwcm92aWRlIG1ldGhvZHMgdG8gY3JlYXRlIGVsZW1lbnRzCi0gKiBhbmQgc2V0IGF0dHJpYnV0ZXMgYW5kIGZlYXR1cmUgdmFsdWVzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFMaWJyYXJ5IHsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGUgPSBmYWxzZTsJCi0JCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcjsKLQotCXByaXZhdGUgQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBNYXAgbmV3RWxlbWVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgTWFwIHJlbmFtZUVsZW1lbnRNYXA7Ci0KLQkvLyBtYXAgb2YgY3JlYXRlZCBlbGVtZW50cywgZ3VpZCAtIEVEYXRhT2JqZWN0Ci0JTWFwIGVsZW1lbnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGtlZXAgdGhlIHNvdXJjZSBlbGVtZW50IGlkcyBzbyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBub3QgaW4gdGhlIHhtbCBzb3VyY2UgbGlicmFyeQotCS8vIHRoaXMgaXMgbmVlZGVkIGZvciBkZWxldGluZyB1bi1uZWVkZWQgZWxlbWVudHMKLQkvLyAxNTQxNDkgLSBhbGxvdyBwYWNrYWdlIGxldmVsIG1lcmdpbmcgZm9yIHhtbCBpbXBvcnQKLQlIYXNoU2V0IHNvdXJjZUVsZW1lbnRJRHMgPSBuZXcgSGFzaFNldCgpOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKiBAcGFyYW0gY29udGVudFByb2MKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogQHBhcmFtIG92ZXJ3cml0ZQotCSAqLwotCXB1YmxpYyBVbWFMaWJyYXJ5KE1hcCByZW5hbWVFbGVtZW50TWFwLCBDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jLCBJTG9nZ2VyIGxvZ2dlciwgYm9vbGVhbiBvdmVyd3JpdGUpIHsKLQkJdGhpcy5yZW5hbWVFbGVtZW50TWFwID0gcmVuYW1lRWxlbWVudE1hcDsKLQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JCXRoaXMuY29udGVudFByb2MgPSBjb250ZW50UHJvYzsKLQkJdGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGU7Ci0KLQkJYnVpbGRFbGVtZW50c01hcCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGlicmFyeSBhcyB0aGUgcm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRFbGVtZW50c01hcCgpIHsKLQkJLy8gYnVpbGQgdGhlIGVsZW1lbnRzIG1hcCBmb3IgZWFzeSBvcGVyYXRpb24KLQotCQllbGVtZW50c01hcC5jbGVhcigpOwotCQllbGVtZW50c01hcC5wdXQoZ2V0Um9vdCgpLmdldEd1aWQoKSwgZ2V0Um9vdCgpKTsKLQkJVHJlZUl0ZXJhdG9yIGl0ID0gZ2V0Um9vdCgpLmVBbGxDb250ZW50cygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWVsZW1lbnRzTWFwLnB1dCgoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29udGVudCBjYXRlcmdvcnkuCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHBhcmFtIHhtbEVDbGFzc05hbWUKLQkgKiBAcGFyYW0geG1sRWxlbWVudFR5cGUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGNyZWF0ZUNvbnRlbnRDYXRlZ29yeShTdHJpbmcgcGx1Z2luSWQsCi0JCQlTdHJpbmcgeG1sRUNsYXNzTmFtZSwgU3RyaW5nIHhtbEVsZW1lbnRUeXBlLCBTdHJpbmcgaWQpIHsKLQotCQlzZXRTb3VyY2VJZChpZCk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIHNhbWUgb2JqZWN0IGNyZWF0ZWQgb25seSBvbmNlCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoaWQpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZ2V0RWxlbWVudChwbHVnaW5JZCk7Ci0KLQkJRUNsYXNzIG9iakNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRUNsYXNzKHhtbEVDbGFzc05hbWUpOwotCQlpZiAob2JqQ2xhc3MgPT0gbnVsbCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzLCB4bWxFQ2xhc3NOYW1lKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7Ci0JCXNldEVsZW1lbnQoaWQsIG9iaik7Ci0KLQkJQ29udGVudFBhY2thZ2Ugcm9vdFBrZyA9IChDb250ZW50UGFja2FnZSkgZ2V0Um9vdFBhY2thZ2UocGx1Z2luLCBvYmopOwotCQlyb290UGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZCgoQ29udGVudENhdGVnb3J5KW9iaik7Ci0JCXJldHVybiBvYmo7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9vdCBwYWNrYWdlCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGhvZFBhY2thZ2UgZ2V0Um9vdFBhY2thZ2UoTWV0aG9kUGx1Z2luIHBsdWdpbiwgT2JqZWN0IG9iaikgewotCi0JCVN0cmluZ1tdIHBhdGggPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgfHwgb2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb29sKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGg7Ci0JCX0KLQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBhdGgpOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfbm9fcGFja2FnZSwgb2JqKSk7IAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1ldGhvZCBwbHVnaW4uCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlTWV0aG9kUGx1Z2luKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc2FtZSBvYmplY3QgY3JlYXRlZCBvbmx5IG9uY2UKLQkJRURhdGFPYmplY3Qgb2JqID0gZ2V0RWxlbWVudChpZCk7Ci0JCWJvb2xlYW4gaXNPbGQgPSBvYmogIT0gbnVsbDsKLQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvcHRpb25zLnB1dCgicmVuYW1lRWxlbWVudE1hcCIsIHJlbmFtZUVsZW1lbnRNYXApOy8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpbihuYW1lLCBpZCwgb3B0aW9ucyk7Ci0KLQkJCXNldEVsZW1lbnQoaWQsIG9iaik7Ci0JCX0KLQotCQkvLyBtYWtlIHN1cmUgdGhlIHN5c3RlbSBwYWNrYWdlcyBhcmUgaW5jbHVkZWQKLQkJc2V0U291cmNlSWQoaWQpOwotCQlMaXN0IHBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKChNZXRob2RQbHVnaW4pb2JqKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpaXQubmV4dCgpOwotCQkJc2V0U291cmNlSWQocGtnLmdldEd1aWQoKSk7Ci0JCQlpZiAoIWlzT2xkKSB7Ci0JCQkJbmV3RWxlbWVudHNNYXAucHV0KHBrZy5nZXRHdWlkKCksIHBrZyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBvYmo7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBjb250ZW50J3Mgcm9vdCBwYWNrYWdlLgotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldENvbnRlbnRSb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLQkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGNhcGFiaWxpdHkgcGF0dGVybicgcm9vdCBwYWNrYWdlLgotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldENhcGFiaWxpdHlQYXR0ZXJuUm9vdFBhY2thZ2UoRURhdGFPYmplY3QgcGx1Z2luKSB7Ci0JCWlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKChNZXRob2RQbHVnaW4pIHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBkZWxpdmVyeSBwcm9jZXNzJyByb290IHBhY2thZ2UuCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0RGVsaXZlcnlQcm9jZXNzUm9vdFBhY2thZ2UoRURhdGFPYmplY3QgcGx1Z2luKSB7Ci0JCWlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKChNZXRob2RQbHVnaW4pIHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCX0KLQotLy8JcHVibGljIEVEYXRhT2JqZWN0IGdldFByb2Nlc3NDb250cmlidXRpb25Sb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLS8vCQlpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgoTWV0aG9kUGx1Z2luKSBwbHVnaW4sCi0vLwkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLS8vCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWxlbWVudC4KLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogQHBhcmFtIHhtbEZlYXR1cmVOYW1lCi0JICogQHBhcmFtIHhtbEVDbGFzc05hbWUKLQkgKiBAcGFyYW0geG1sRWxlbWVudFR5cGUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGNyZWF0ZUVsZW1lbnQoRURhdGFPYmplY3QgY29udGFpbmVyLAotCQkJU3RyaW5nIHhtbEZlYXR1cmVOYW1lLCBTdHJpbmcgeG1sRUNsYXNzTmFtZSwgU3RyaW5nIHhtbEVsZW1lbnRUeXBlLAotCQkJU3RyaW5nIGlkKSB7Ci0KLQkJc2V0U291cmNlSWQoaWQpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc2FtZSBvYmplY3QgY3JlYXRlZCBvbmx5IG9uY2UKLQkJRURhdGFPYmplY3Qgb2JqID0gZ2V0RWxlbWVudChpZCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJRU9iamVjdCBlb2JqID0gb2JqLmVDb250YWluZXIoKTsKLQkJCQlpZiAoZW9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCVByb2Nlc3NQYWNrYWdlIHAgPSAoUHJvY2Vzc1BhY2thZ2UpIGVvYmo7Ci0JCQkJCXNldFNvdXJjZUlkKHAuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0KLQkJLy8gaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gKSB7Ci0JCS8vIHJldHVybiBnZXRFbGVtZW50KGlkKTsKLQkJLy8gfQotCi0JCS8vIC8vIHRoaXMgaXMgYW4gZWFzaWVyIHdheSwgdGVzdCBpdCwKLQkJLy8gLy8gZG9lcyBub3Qgd29yayBzaW5jZSBmZWF0dXJlLmdldEVUeXBlKCkgcmV0dXJucyB0aGUgYmFzZSBlbGVtZW50Ci0JCS8vIHR5cGUsIG5vdCB0aGUgZXh0ZW5kZWQgb25lCi0JCS8vIC8vIGZvciBleGFtcGxlLCBpdCByZXR1cm5zIE1ldGhvZFBhY2thZ2UgaW5zdGVhZCBvZiBQcm9jZXNzUGFja2FnZSBvcgotCQkvLyBDb250ZW50UGFja2FnZQotCQkvLyAvLyBzbyB3ZSBuZWVkIHRvIG1ha2Ugb3VyIG93biBtYXAKLQkJLy8gRUNsYXNzaWZpZXIgYyA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQotCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNFQ2xhc3MoeG1sRUNsYXNzTmFtZSk7Ci0JCWlmIChvYmpDbGFzcyA9PSBudWxsKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9ub19lY2xhc3MsIHhtbEVDbGFzc05hbWUpKTsgCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7CQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCS8vIFdvcmtPcmRlciBpcyBub3QgYSBtZXRob2QgZWxlbWVudCBpbiB4bWwgdW1hLCBuZWVkIHRvIGNyZWF0ZSBpdAotCQkJLy8gd2l0aCBhIGd1aWQKLQkJCS8vaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0KLQkJCS8vIGFsc28gbmVlZCB0byBhZGQgdGhlIGVsZW1lbnQgaW50byB0aGUgY29udGFpbmVyIG9mIHRoZSBvd25lcgotCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyLmVDb250YWluZXIoKSkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKAotCQkJCQkoV29ya09yZGVyKW9iaik7Ci0JCX0KLQotCQlzZXRFbGVtZW50KGlkLCBvYmopOwotCi0JCXRyeSB7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGNvbnRhaW5lcjsKLQkJCQkvLyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5ldyBwbHVnaW4KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJLy8gY29udGVudCBwYWNrYWdlIGFuZCBvd25lciBpcyBQbHVnaW4sIGdvdG8gdGhlIHJvb3QKLQkJCQkJLy8gY29udGVudCBwYWNrYWdlCi0JCQkJCU1ldGhvZFBhY2thZ2UgcGtnX2NvcmVfY29udGVudCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCQkJcGx1Z2luLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCQkJCXBrZ19jb3JlX2NvbnRlbnQuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoQ29udGVudFBhY2thZ2Upb2JqKTsKLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJTWV0aG9kUGFja2FnZSBwa2dfY3AgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQkJCXBrZ19jcC5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KW9iaik7Ci0KLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSByb290IHByb2Nlc3MgcGFja2FnZQotCQkJCQkvLyBwdXQgaW50byB0aGUgcm9vdCBkZWxpdmVyeSBwcm9jZXNzZXMgcGFja2FnZQotCQkJCQlNZXRob2RQYWNrYWdlIHBrZ19kcCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQkJCXBrZ19kcC5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChQcm9jZXNzUGFja2FnZSlvYmopOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0KLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFCi0JCQkJCQkuZ2V0Um1jRmVhdHVyZShjb250YWluZXIuZUNsYXNzKCksIHhtbEZlYXR1cmVOYW1lKTsKLQkJCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCWlmICgoY29udGFpbmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCQkmJiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkmJiBvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0KLQkJCQkJLy8gdGhlIGNvbnRhaW5lciBuZWVkcyB0byBiZSBhIHByb2Nlc3MgcGFja2FnZQotCQkJCQlFT2JqZWN0IHBrZyA9IGNvbnRhaW5lcjsKLQkJCQkJd2hpbGUgKChwa2cgIT0gbnVsbCkgJiYgIShwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCQkJCXBrZyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiB0aGUgb2JqZWN0IGlzIGFuIGFjdGl2aXR5LCBjcmVhdGUgYSBwYWNrYWdlIGZvciBpdCBhbmQKLQkJCQkJLy8gYWxsIGl0J3MgYnJlYWtkb3duIGVsZW1lbnRzCi0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCQlMaXN0IGNoaWxkUGtncyA9ICgoUHJvY2Vzc1BhY2thZ2UpIHBrZykKLQkJCQkJCQkJLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBwID0gbnVsbDsKLQkJCQkJCWlmICh0cnVlIHx8IGNoaWxkUGtncy5zaXplKCkgPT0gMCkgewkvLzE1ODM2MzogYWx3YXlzIGNyZWF0ZSBhIHBhY2thZ2UgZm9yIGFjdAotCQkJCQkJCXBwID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQkJCQlwcC5zZXROYW1lKCgoTWV0aG9kRWxlbWVudCkgY29udGFpbmVyKS5nZXROYW1lKCkpOwotCQkJCQkJCXNldEVsZW1lbnQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpLCBwcCk7Ci0JCQkJCQkJc2V0U291cmNlSWQocHAuZ2V0R3VpZCgpKTsKLQkJCQkJCQljaGlsZFBrZ3MuYWRkKHBwKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHAgPSAoUHJvY2Vzc1BhY2thZ2UpIGNoaWxkUGtncy5nZXQoMCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXBrZyA9IHBwOwotCQkJCQl9Ci0KLQkJCQkJKChQcm9jZXNzUGFja2FnZSkgcGtnKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoKFByb2Nlc3NFbGVtZW50KW9iaik7Ci0JCQkJfQotCi0JCQkJLy8gbm90ZTogYWxsIGVsZW1lbnQgcmVmZXJlbmNlcyBhcmUgc3RyaW5nIHR5cGUgKGlkKQotCQkJCS8vIHBhY2thZ2UgcmVmZXJlbmNlcyBhcmUgb2JqZWN0IHJlZmVyZW5jZXMKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBjb250YWluZXIuZUdldChmZWF0dXJlKTsKLQkJCQkJdmFsdWVzLmFkZChvYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbnRhaW5lci5lU2V0KGZlYXR1cmUsIG9iaik7Ci0JCQkJfQotCQkJfQkJCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudCwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gb2JqOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbGVtZW50KFN0cmluZyBndWlkLCBFRGF0YU9iamVjdCBvYmopIHsKLQkJLy8gYWRkRWxlbWVudFRvQ29udGFpbmVyKGNvbnRhaW5lciwgb2JqKTsKLQkJCQkKLQkJaWYgKCFlbGVtZW50c01hcC5jb250YWluc0tleShndWlkKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudCkgb2JqKS5zZXRHdWlkKGd1aWQpOwotCQkJfQotCi0JCQllbGVtZW50c01hcC5wdXQoZ3VpZCwgb2JqKTsKLQkJCQkJCi0JCQlzZXREaXJ0eShvYmopOwotCQkJbmV3RWxlbWVudHNNYXAucHV0KGd1aWQsIG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U291cmNlSWQoU3RyaW5nIGlkKSB7Ci0JCS8vIDE1NDE0OSAtIGFsbG93IHBhY2thZ2UgbGV2ZWwgbWVyZ2luZyBmb3IgeG1sIGltcG9ydAotCQlpZiAoICFzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKGlkKSApIHsKLQkJCXNvdXJjZUVsZW1lbnRJRHMuYWRkKGlkKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RGlydHkoRU9iamVjdCBvYmopIHsKLQkJLy8gbWFyayB0aGUgcmVzb3VyY2UgYXMgZGlydHkKLQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQlpZiAoIHJlcyAhPSBudWxsICYmICFyZXMuaXNNb2RpZmllZCgpICkgewotCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgZWxlbWVudCBnaXZlbiB0aGUgZ3VpZC4KLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0RWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKEVEYXRhT2JqZWN0KSBlbGVtZW50c01hcC5nZXQoZ3VpZCk7Ci0JfQotCi0JcHJpdmF0ZSBEYXRlIGNyZWF0ZURhdGUoU3RyaW5nIGRhdGVTdHIpIHsKLQkJZGF0ZVN0ciA9IGRhdGVTdHIucmVwbGFjZSgnVCcsICcgJyk7Ci0JCVNpbXBsZURhdGVGb3JtYXQgZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIGhoOm1tOnNzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGYucGFyc2UoZGF0ZVN0ciwgbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlzdHIgPSBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJfSBlbHNlIGlmIChvYmogIT0gbnVsbCkgewotCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qKgotCSAqIFNldHMgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUuCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlPYmplY3QgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIG9sZE5vdGlmeSA9IG9iai5lRGVsaXZlcigpOwotCQlvYmouZVNldERlbGl2ZXIoZmFsc2UpOwotCQlzZXRBdHJpYnV0ZUZlYXR1cmVWYWx1ZV8ob2JqLCBmZWF0dXJlTmFtZSwgdmFsdWUpOwotCQlvYmouZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEF0cmlidXRlRmVhdHVyZVZhbHVlXyhFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwKLQkJCU9iamVjdCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCBmZWF0dXJlTmFtZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIEVEYXRhT2JqZWN0KSB7Ci0JCQlpZiAoZmVhdHVyZU5hbWUuZXF1YWxzKCJtZXRob2RFbGVtZW50UHJvcGVydHkiKSkgewkJLy8kTk9OLU5MUy0xJAotCQkJCXNldE1lcEZlYXR1cmVWYWx1ZShvYmosIGZlYXR1cmVOYW1lLCB2YWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzIsIHZhbHVlKSk7IAotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0ZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCB2YWx1ZSB9OwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZSwgcGFyYXMpICsgb2JqKTsgCi0JCQlyZXR1cm47Ci0JCX0gCi0JCQotCQlzZXREaXJ0eShvYmopOwotCi0JCS8vIDE1ODY4OCAtIE1pc3NpbmcgdGVtcGxhdGUgZmlsZXMgaW4gZXhwb3J0ZWQgeG1sIGxpYnJhcnkKLQkJLy8gcHJvY2VzcyB0aGUgYXR0YWNobWVudCB1cmwKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSApIHsKLQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKLQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVBdHRhY2htZW50UmVzb3VyY2VzKG9iaiwgdmFsdWUudG9TdHJpbmcoKS50cmltKCkpOwotCQkJfQotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JCQotCQllbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJLy8gaWYgdGhlIHVtYSBmZWF0dXJlIGlzIGEgcmVmZXJlbmNlIGZlYXR1cmUKLQkJCS8vIGJ1dCB0aGUgeG1sIGZlYXR1cmUgaXMgYW4gYXR0cmlidXRlCi0JCQkvLyB0aGUgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYSBndWlkCi0JCQlPYmplY3QgZSA9IGdldEVsZW1lbnQoKFN0cmluZykgdmFsdWUpOwotCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLmFkZChlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvYmouZVNldChmZWF0dXJlLCBlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksCi0JCQkJCQlmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUgfTsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZSwgcGFyYXMpOyAKLQkJCQlsb2dnZXIubG9nV2FybmluZyhtc2cpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInZhcmlhYmlsaXR5VHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBWYXJpYWJpbGl0eVR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJsaW5rVHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBXb3JrT3JkZXJUeXBlLmdldCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSkgewotCQkJCQkvLyBjb252ZXJ0IGphdmEudXRpbC5EYXRlIHRvIHhtbCBEYXRlCi0JCQkJCXZhbHVlID0gY3JlYXRlRGF0ZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygibm9kZWljb24iKSAvLyROT04tTkxTLTEkCi0JCQkJCQl8fCBmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInNoYXBlaWNvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTWV0aG9kUGx1Z2luIHRndFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBvYmopOwotCQkJCQlpbnQgaXggPSB0Z3RQbHVnaW4uZ2V0TmFtZSgpLmxlbmd0aCgpICsgMTsKLQkJCQkJCQkJCQkKLQkJCQkJdmFsdWUgPSBuZXcgamF2YS5uZXQuVVJJKHZhbHVlLnRvU3RyaW5nKCkuc3Vic3RyaW5nKGl4KSk7Ci0KLQkJCQkJLy8gbmVlZCB0byBjb3B5IHRoZSByZXNvdXJjZSBmaWxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeQotCQkJCQljb250ZW50UHJvYy5jb3B5UmVzb3VyY2UoKChqYXZhLm5ldC5VUkkpIHZhbHVlKS5nZXRQYXRoKCksIG9iaiwgdGd0UGx1Z2luKTsKLQkJCQl9IGVsc2UgaWYgKChjb250ZW50UHJvYyAhPSBudWxsKQotCQkJCQkJJiYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQkmJiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXZhbHVlID0gY29udGVudFByb2MucmVzb2x2ZVJlc291cmNlRmlsZXMoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgKFN0cmluZykgdmFsdWUpOwotCQkJCX0KLQkJCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwKLQkJCQkJCXZhbHVlIH07Ci0JCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGUsIHBhcmFzKSwgZSk7IAotCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwgdmFsdWUgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMywgcGFyYXMpKTsgCi0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXBGZWF0dXJlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlMaXN0IHNyY0xpc3QgPSAoTGlzdCkgdmFsdWU7Ci0JCWludCBzeiA9IHNyY0xpc3QgPT0gbnVsbCA/IDAgOiBzcmNMaXN0LnNpemUoKTsJCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0ZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCUxpc3QgdGd0TGlzdCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJaW50IHRzeiA9IHRndExpc3QgPT0gbnVsbCA/IDAgOiB0Z3RMaXN0LnNpemUoKTsKLQotCQkvL1NvdXJjZSBsaXN0IGlzIGVtcHR5Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlpZiAodHN6ID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0Z3RMaXN0LnJlbW92ZUFsbCh0Z3RMaXN0KTsKLQkJCXNldERpcnR5KG9iaik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vU29ydWNlIGFuZCB0YXJnZXQgYXJlIHBvdGVudGlhbGx5IHRoZSBzYW1lCi0JCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCQlpZiAoc3ogPT0gdHN6KSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCWZvciAoaW50IGk9MDsgaSA8IHN6OyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgc3JjTWVwID0gCi0JCQkJCShvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkpIHNyY0xpc3QuZ2V0KGkpOwotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB0Z3RNZXAgPSAKLQkJCQkJKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgdGd0TGlzdC5nZXQoaSk7Ci0JCQkJaWYgKCEgc3JjTWVwLmdldE5hbWUoKS5lcXVhbHModGd0TWVwLmdldE5hbWUoKSkpIHsKLQkJCQkJc2FtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCEgc3JjTWVwLmdldFZhbHVlKCkuZXF1YWxzKHRndE1lcC5nZXRWYWx1ZSgpKSkgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2FtZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL1NvcnVjZSBhbmQgdGFyZ2V0IGFyZSBub3QgdGhlIHNhbWUKLQkJdGd0TGlzdC5yZW1vdmVBbGwodGd0TGlzdCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IHN6OyBpKyspIHsKLQkJCU9iamVjdCBzcmNJdGVtID0gc3JjTGlzdC5nZXQoaSk7Ci0JCQlpZiAoc3JjSXRlbSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXAgPSAKLQkJCQkJCShvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkpIHNyY0l0ZW07Ci0JCQkJRUNsYXNzIG9iakNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UKLQkJCQkuZ2V0Um1jRUNsYXNzKCJNZXRob2RFbGVtZW50UHJvcGVydHkiKTsJLy8kTk9OLU5MUy0xJAotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB4bWxNZXAgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsKLQkJCQl4bWxNZXAuc2V0VmFsdWUobWVwLmdldFZhbHVlKCkpOwotCQkJCXhtbE1lcC5zZXROYW1lKG1lcC5nZXROYW1lKCkpOwotCQkJCXRndExpc3QuYWRkKHhtbE1lcCk7Ci0JCQl9Ci0JCX0KLQkJc2V0RGlydHkob2JqKTsKLQkJLy9vYmouZVNldChmZWF0dXJlLCB0Z3RMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHBhcmFtIGlkCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VWYWx1ZShFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwgU3RyaW5nIGlkKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCBmZWF0dXJlTmFtZSA9PSBudWxsIHx8IGlkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRU9iamVjdCB2YWx1ZSA9IGdldEVsZW1lbnQoaWQpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZSwgZmVhdHVyZU5hbWUsIGlkKSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgdGhlIGZlYXR1cmUgYW5kIHNldCB0aGUgdmFsdWUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwgaWQgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMiwgcGFyYXMpKTsgCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBkb24ndCBpdGVyYXRlIHRoZSBjb250YWlubWVudCBmZWF0dXJlCi0JCWlmICh2YWx1ZS5lQ29udGFpbmVyKCkgPT0gb2JqKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBTdHJpbmcgc3RyID0gZmVhdHVyZS5nZXRFVHlwZSgpLmdldE5hbWUoKTsKLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCXRyeSB7Ci0JCQkJTGlzdCBpdGVtcyA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIWl0ZW1zLmNvbnRhaW5zKHZhbHVlKSkgewotCQkJCQlpdGVtcy5hZGQodmFsdWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCBpZCB9OwotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQlOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzIsIHBhcmFzKSwgZSk7IAotCQkJfQotCQl9IGVsc2UgewotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JCQotCQlzZXREaXJ0eShvYmopOwotCX0KLQotCS8qKgotCSAqIFNldHMgd29yayBvcmRlci4KLQkgKiBAcGFyYW0gdW1hV29ya09yZGVyCi0JICogQHBhcmFtIHByZWRJZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtPcmRlcihPYmplY3QgdW1hV29ya09yZGVyLCBTdHJpbmcgcHJlZElkKSB7Ci0JCWlmICh1bWFXb3JrT3JkZXIgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQocHJlZElkKTsKLQkJCSgoV29ya09yZGVyKSB1bWFXb3JrT3JkZXIpLnNldFByZWQoZSk7Ci0JCQkKLQkJCXNldERpcnR5KChFT2JqZWN0KXVtYVdvcmtPcmRlcik7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpeGVzIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgZml4TGlicmFyeSgpIHsKLQkJTWV0aG9kTGlicmFyeSByb290T2JqZWN0ID0gZ2V0Um9vdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChNZXRob2RMaWJyYXJ5KSByb290T2JqZWN0KS5nZXRNZXRob2RQbHVnaW5zKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZml4IHRhc2sgZGVzY3JpcHRvcnMgZm9yIGltcG9ydAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeFRhc2tEZXNjcmlwdG9ycyhNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4gdGRNYXApIHsKLQkJaWYgKHRkTWFwID09IG51bGwgfHwgdGRNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPj4gaXQgPSB0ZE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiBlbnRyeSA9IGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIHVtYVRkID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnRzTWFwLmdldChndWlkKTsKLQkJCWFzc2VydCh1bWFUZCAhPSBudWxsKTsKLQkJCWlmICh1bWFUZCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlMaXN0IHN0ZXBzID0gdGQuZ2V0U3RlcCgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHN0ZXBzLnNpemUoKTsgaSsrKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCBzdGVwID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIHN0ZXBzLmdldChpKTsKLQkJCQlTZWN0aW9uIHVtYVN0ZXAgPSAgKFNlY3Rpb24pIGVsZW1lbnRzTWFwLmdldChzdGVwLmdldElkKCkpOwotCQkJCWFzc2VydCh1bWFTdGVwICE9IG51bGwpOwotCQkJCWlmICh1bWFTdGVwICE9IG51bGwpIHsKLQkJCQkJdW1hVGQuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZCh1bWFTdGVwKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0JCQotCX0KLQotCXByaXZhdGUgTWV0aG9kUGFja2FnZSBjcFJvb3QgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIGRwUm9vdCA9IG51bGw7Ci0KLS8vCXByaXZhdGUgTWV0aG9kUGFja2FnZSBwY1Jvb3QgPSBudWxsOwotCi0JcHJpdmF0ZSB2b2lkIGZpeFBsdWdpbihNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0KLQkJLy8gZml4IHRoZSByb290IGN1c3RvbSBjYXRlZ29yaWVzCi0JCWZpeEN1c3RvbUNhdGVnb3JpZXMocGx1Z2luKTsKLQotCQlMaXN0IGNwUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBkcFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJTGlzdCBwY1BrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJY3BSb290ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQlkcFJvb3QgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotLy8JCXBjUm9vdCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotLy8JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCk7Ci0JCWdldEFsbFBhY2thZ2VzKGNwUm9vdCwgY3BQa2dzKTsKLQkJZ2V0QWxsUGFja2FnZXMoZHBSb290LCBkcFBrZ3MpOwotCQkKLS8vCQlpZiAoIHBjUGtncyAhPSBudWxsICkgewotLy8JCQlnZXRBbGxQYWNrYWdlcyhwY1Jvb3QsIHBjUGtncyk7Ci0vLwkJfQotCQkJCi0JCUxpc3QgcHJvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KWl0Lm5leHQoKTsKLQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gby5lRGVsaXZlcigpOwotCQkJdHJ5CXsKLQkJCQkvLyB0dXJuIG9mZiBub3RpZmljYXRpb25zIHRvIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2NrIG9yIHRocmVhZCBpc3N1ZQotCQkJCS8vIDE1NDE0MiAtIGltcG9ydCB4bWwgY2F1c2VkIHRocmVhZCBhY2Nlc3MgZXJyb3IKLQkJCQlvLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJcHJvY3MuYWRkKG8pOwotCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQlTdHJpbmcgcE5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgbykuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQlpZiAocE5hbWUgPT0gbnVsbCB8fCBwTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgbykKLQkJCQkJCQkJLnNldFByZXNlbnRhdGlvbk5hbWUoKChEZXNjcmliYWJsZUVsZW1lbnQpIG8pCi0JCQkJCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCi0JCQkJLy8gZml4IHRoZSBuYW1lIHN0cmluZwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiAhKG8gaW5zdGFuY2VvZiBTZWN0aW9uKSkgewotCQkJCQlTdHJpbmcgbmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3X25hbWUgPSBTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWUpOwotCQkJCQlpZiAoICFuZXdfbmFtZS5lcXVhbHMobmFtZSkgKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnQpIG8pLnNldE5hbWUobmV3X25hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlvLmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvY3Muc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2NzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgcHJvYyA9IHBjLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQlpZiAoIWRwUGtncy5jb250YWlucyhwYykpIHsKLQkJCQkJCW1vdmVQcm9jZXNzQ29tcG9uZW50KHBjLCBkcFJvb3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJaWYgKCFjcFBrZ3MuY29udGFpbnMocGMpKSB7Ci0JCQkJCQltb3ZlUHJvY2Vzc0NvbXBvbmVudChwYywgY3BSb290KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBbGxQYWNrYWdlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCBwa2dzKSB7Ci0JCXBrZ3MuYWRkKHBrZyk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWdldEFsbFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHBrZ3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbW92ZSB0aGUgcHJvY2VzcyBwYWNrYWdlIHRvIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLCBpZiB0aGUgcGFja2FnZSBpcwotCSAqIHRoZSBvbmx5IGNoaWxkIG9mIGl0J3MgcGFyZW50LCBtb3ZlIGl0J3MgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIHBrZwotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW92ZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJTWV0aG9kUGFja2FnZSBjb250YWluZXIpIHsKLQkJLy8gbWFrZSBzdXJlIENhcGFiaWxpdHkgcGF0dGVybnMgYXJlIGluIHRoZSBDYXBhYmlsaXR5IHBhY2thZ2VzCi0JCU9iamVjdCBvID0gcGtnLmVDb250YWluZXIoKTsKLQkJaWYgKChvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJJiYgKCgoUHJvY2Vzc1BhY2thZ2UpIG8pLmdldENoaWxkUGFja2FnZXMoKS5zaXplKCkgPT0gMSkKLQkJCQkmJiBvICE9IGNwUm9vdCAmJiBvICE9IGRwUm9vdCApIHsKLQkJCW1vdmVQcm9jZXNzQ29tcG9uZW50KChQcm9jZXNzUGFja2FnZSkgbywgY29udGFpbmVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnRhaW5lci5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBmaW5kIHRoZSByb290IGN1c3RvbSBjYWdlZ29yeSBhbmQgcHV0IHRvIHRoZSByb290IHBhY2thZ2UKLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4Q3VzdG9tQ2F0ZWdvcmllcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KHBrZy5nZXRDb250ZW50RWxlbWVudHMoKSk7Ci0KLQkJTGlzdCByb290SXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgaXRlbXMucmVtb3ZlKDApOwotCQkJcm9vdEl0ZW1zLmFkZChjYyk7Ci0JCQkKLQkJCS8vIDE1ODY5MUN1c3RvbSBDYXRlZ29yeSBpcyBkaWZmZXJlbnQgaW4gZXhwb3J0ZWQgbGlicmFyeQotCQkJLy8gbmVlZCB0byByZW1vdmUgc3ViLWNhdGVnb3JpZXMgcmVjdXJzaXZlbHkKLQkJCWZpeEN1c3RvbUNhdGVnb3JpZXMoY2MsIGl0ZW1zLCByb290SXRlbXMpOwotCQl9Ci0KLQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkQWxsKAotCQkJCXJvb3RJdGVtcyk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogZmluZCB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcmllcyBieSByZW1vdmluZyB0aGUgc3ViLWNhdGVnb3JpZXMgcmVjdXJzaXZlbHkKLQkgKiAKLQkgKiBAcGFyYW0gY2MKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiBAcGFyYW0gcm9vdEl0ZW1zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeEN1c3RvbUNhdGVnb3JpZXMoQ3VzdG9tQ2F0ZWdvcnkgY2MsIExpc3QgaXRlbXMsIExpc3Qgcm9vdEl0ZW1zKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjYy5nZXRTdWJDYXRlZ29yaWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQlpdGVtcy5yZW1vdmUoaXRlbSk7Ci0JCQlyb290SXRlbXMucmVtb3ZlKGl0ZW0pOwotCQkJZml4Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpaXRlbSwgaXRlbXMsIHJvb3RJdGVtcyk7Ci0JCX0KLQkJCi0JCS8vIGFsc28gaXRlcmF0ZSB0aGUgY29udGFpbmVkIGVsZW1lbnRzCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBjYy5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaXRlbXMucmVtb3ZlKGl0ZW0pOwotCQkJCXJvb3RJdGVtcy5yZW1vdmUoaXRlbSk7Ci0JCQkJZml4Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpaXRlbSwgaXRlbXMsIHJvb3RJdGVtcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZGVsZXRlIHRoZSB1bi1uZWVkZWQgZWxlbWVudHMgYXJlIGNsZWFyIHJlc291cmNlcyAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVFbGVtZW50cygpIHsKLQkJCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQotCQlMaXN0IGRlbGV0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50c01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCllbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKCBzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKGlkKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAob3ZlcndyaXRlKSB7Ci0JCQkJYm9vbGVhbiB0b0RlbGV0ZSA9ICEoZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCQkJCQkJfHwgZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmICh0b0RlbGV0ZSkgewotCQkJCQlNZXRob2RFbGVtZW50IHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJCQl0b0RlbGV0ZSA9IHBsdWdpbiAhPSBudWxsICYmICFpc05ld0VsZW1lbnQocGx1Z2luLmdldEd1aWQoKSkKLQkJCQkJJiYgc291cmNlRWxlbWVudElEcy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHRvRGVsZXRlKSB7Ci0JCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCWhhbmRsZUFjdGl2aXR5UmVtb3ZhbChlKTsKLQkJCQkJLy9FY29yZVV0aWwucmVtb3ZlKGUpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICggKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgJiYgVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSggKEN1c3RvbUNhdGVnb3J5KWUgKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0JCQkKLQkJCQotCQkJLy8gZGVsZXRlIHRoZSBlbGVtZW50IGlmIHRoZSBjb250YWluZyBwYWNrYWdlIGlzIGluIHRoZSBzb3VyY2UgbGlicmFyeQotCQkJLy8gZG9uJ3QgZGVsZXRlIGlmIHRoZSBwYWNrYWdlIGlzIG5vdCBpbiB0aGUgeG1sIGxpYnJhcnkKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVG5nVXRpbC5nZXRNZXRob2RQYWNrYWdlKGUpOwotCQkJCi0JCQlpZiAoIHBrZyAhPSBudWxsICkgeyAKLQkJCQlTdHJpbmcgcGlkID0gcGtnLmdldEd1aWQoKTsKLQkJCQlpZiAoIHNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMocGlkKSApIHsKLQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlKTsKLQkJCQkJaGFuZGxlQWN0aXZpdHlSZW1vdmFsKGUpOwotCQkJCQkKLQkJCQkJLy8gZGVsZXRlIHRoZSBlbGVtZW50IGZyb20gdGhlIGxpYnJhcnkKLQkJCQkJLy9FY29yZVV0aWwucmVtb3ZlKGUpOwkJCQkKLQkJCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkKLQkJCQkJYm9vbGVhbiB0b0NoZWNrID0gdHJ1ZTsKLQkJCQkJTWV0aG9kUGFja2FnZSBwYyA9IHBrZzsJCQkJCQotCQkJCQl3aGlsZShwYyAhPSBudWxsICYmICEgKHBjIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCQkJCXBjID0gVG5nVXRpbC5nZXRQYXJlbnRNZXRob2RQYWNrYWdlKHBjKTsKLQkJCQkJfQotCQkJCQlpZiAocGMgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQl0b0NoZWNrID0gc291cmNlRWxlbWVudElEcy5jb250YWlucyhwYy5nZXRHdWlkKCkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAodG9DaGVjaykgewotCQkJCQkJcGtnID0gVG5nVXRpbC5nZXRNZXRob2RQYWNrYWdlKHBrZyk7Ci0JCQkJCQl3aGlsZSAocGtnICE9IG51bGwpIHsKLQkJCQkJCQlwaWQgPSBwa2cuZ2V0R3VpZCgpOwotCQkJCQkJCWlmIChzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKHBpZCkpIHsKLQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCQkJaGFuZGxlQWN0aXZpdHlSZW1vdmFsKGUpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJcGtnID0gVG5nVXRpbC5nZXRQYXJlbnRNZXRob2RQYWNrYWdlKHBrZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGRlbGV0ZSB0aGUgcmVzb3VyY2VzCi0JCWRlbGV0ZVJlc29ydWNlcyhkZWxldGVkRWxlbWVudHMpOwotCX0KLQotCS8vCTE2NDU4MQotCXByaXZhdGUgdm9pZCBoYW5kbGVBY3Rpdml0eVJlbW92YWwoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUJyZWFrZG93bkVsZW1lbnQgZWFjdCA9IChCcmVha2Rvd25FbGVtZW50KSBlOwotCQlBY3Rpdml0eSBzYWN0ID0gZWFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJaWYgKHNhY3QgIT0gbnVsbCkgewotCQkJc2FjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZShlYWN0KTsKLQkJfQotCX0KLQkKLQkvLyBjbGVhciByZXNvdXJjZXMgZm9yIGRlbGV0ZWQgZWxlbWVudHMKLQlwcml2YXRlIHZvaWQgZGVsZXRlUmVzb3J1Y2VzKExpc3QgZGVsZXRlZEVsZW1lbnRzKSB7Ci0JCWlmICggZGVsZXRlZEVsZW1lbnRzLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGRlbGV0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCi0JCQlFT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlpZiAoIGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgKSB7Ci0JCQkJb2JqID0gKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQl9IGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8Ci0JCQkJCW92ZXJ3cml0ZSAmJiBlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW9iaiA9IGU7Ci0JCQl9Ci0JCQlpZiAoIG9iaiAhPSBudWxsICkgewotCQkJCU1ldGhvZEVsZW1lbnQgcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQkJUmVzb3VyY2UgcGx1Z2luUmVzID0gcGx1Z2luID09IG51bGwgPyBudWxsIDogcGx1Z2luLmVSZXNvdXJjZSgpOwotCQkJCQotCQkJCVJlc291cmNlIHJlcyA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCQlpZiAoIHJlcyAhPSBudWxsICYmIHJlcyAhPSBwbHVnaW5SZXMpIHsJCS8vUHJvdGVjdGVkIGZyb20gYnVncyBsaWtlIDE3NzA0MgotCQkJCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVsZXRpbmcgcmVzb3VyY2U6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoICFmaWxlTWdyLmRlbGV0ZShmaWxlKSApIHsKLQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmFibGUgdG8gZGVsZXRlIGZpbGU6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlFT2JqZWN0IHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihyZXMpOwotCQkJCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUocmVzTWdyKTsKLQkJCQkJfQotCQkJCQlFT2JqZWN0IHJlc0RlcyA9IE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlRGVzY3JpcHRvcihyZXMpOwotCQkJCQlpZiAocmVzRGVzICE9IG51bGwpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUocmVzRGVzKTsKLQkJCQkJfQotCQkJCQlpZiAob3ZlcndyaXRlKSB7CQkJCQkJCi0JCQkJCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGZpbGUpLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCUZpbGUgZmlsZXNbXSA9IGZvbGRlci5saXN0RmlsZXMoKTsKLQkJCQkJCWlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwICkgewotCQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVsZXRpbmcgZm9sZGVyIHJlc291cmNlOiAiICsgZm9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlpZiAoICFmaWxlTWdyLmRlbGV0ZShmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpICkgewotCQkJCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmFibGUgdG8gZGVsZXRlIGZvbGRlciBmaWxlOiAiICsgZm9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCQkJCQkJCi0JCQl9Ci0JCQkKLQkJCUVjb3JlVXRpbC5yZW1vdmUoZSk7Ci0JCX0KLQl9Ci0JCQkKLQkvKioKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBnaXZlbiBieSBndWlkIGlzIG5ldy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld0VsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIG5ld0VsZW1lbnRzTWFwLmNvbnRhaW5zS2V5KGd1aWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5YjE2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgSW1wb3J0IFhNTCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL0ltcG9ydFhNTFdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvSW1wb3J0WE1MV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWFhOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvSW1wb3J0WE1MV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzLkltcG9ydFhNTFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzLkltcG9ydFhNTFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5MaWJyYXJ5QmFja3VwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgSW1wb3J0IFhNTCB3aXphcmQuCi0gKiA8cD4KLSAqIFRoaXMgd2l6YXJkIGlzIHVzZWQgdG8gaW1wb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgc3RvcmVkIGluIGEgWE1MIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JSW1wb3J0WE1MU2VydmljZSBzZXJ2aWNlID0gbmV3IEltcG9ydFhNTFNlcnZpY2UoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBzdWNjZWVkID0gdHJ1ZTsKLQkKLQlwcml2YXRlIFNlbGVjdFhNTEZpbGVQYWdlIGZpbGVQYWdlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltcG9ydFhNTFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQkvLyBjaGVjayBvdXQgdGhlIGxpYnJhcnkgZmlyc3QKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCWZpbGVNZ3IuY2hlY2tNb2RpZnkoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSwKLQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCkpIHsKLQkJCUZpbGUgbGlicmFyeUZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCksCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRSk7Ci0JCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTEVycm9yX21zZywKLQkJCQkJTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTEVycm9yX3JlYXNvbiwKLQkJCQkJCQlsaWJyYXJ5RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCB0cnVlLCBudWxsLCBudWxsLCBJbXBvcnRYTUxQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRYTUwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlmaWxlUGFnZSA9IG5ldyBTZWxlY3RYTUxGaWxlUGFnZSgpOwotCQlhZGRQYWdlKGZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L1hNTEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCWlmIChyZWZyZXNoKSB7Ci0JCQkvL05lZWRlZDogYmVjYXVzZSBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBhZGRzIGV2ZW50cyB0byBSZWZyZXNoSm9iIGF0IHRoZQotCQkJLy9lbmQgb2YgInJ1biIgY2FsbCEKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQkJCi0JCWZpbmFsIGJvb2xlYW4gcmV0W10gPSBuZXcgYm9vbGVhblsxXTsJCQotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlyZXRbMF0gPSBwZXJmb3JtRmluaXNoXygpOwotCQkJfQkJCQotCQl9KTsKLQkJaWYgKHJlZnJlc2gpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOyAvLyB0ZW1wIHNvbHV0aW9uIGZvciBwb3RlbnRpYWwgcmFjaW5nCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJCi0JCQotCQlydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnJldmlld19sb2dfZmlsZXMsCi0JCQkJCQlzZXJ2aWNlLmdldExvZ1BhdGgoKSk7Ci0JCQkJCU1zZ0JveC5wcm9tcHQobXNnLCBTV1QuT0spOwotCQkJfQkJCQotCQl9KTsJCQotCQkKLQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCXJldHVybiByZXRbMF07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1GaW5pc2hfKCkgewotCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBDdXJyZW50TGlicmFyeShudWxsLCBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRpbmdYTUxfdGV4dCwKLQkJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCi0JCQkJCVN0cmluZyB4bWxGaWxlID0gZmlsZVBhZ2UuZ2V0UGF0aCgpOwotCQkJCQlib29sZWFuIG1lcmdlT3B0aW9uID0gZmlsZVBhZ2UuZ2V0TWVyZ2VPcHRpb24oKTsKLQkJCQkJYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zID0gZmlsZVBhZ2UuZ2V0Q2hlY2tCYXNlUGx1Z2lucygpOwotCQkJCQlzZXJ2aWNlLnNldE92ZXJ3cml0ZSghbWVyZ2VPcHRpb24pOwotCQkJCQlzZXJ2aWNlLnNldENoZWNrQmFzZVBsdWdpbnMoY2hlY2tCYXNlUGx1Z2lucyk7Ci0JCQkJCXN1Y2NlZWQgPSBzZXJ2aWNlLmxvYWRYbWwoeG1sRmlsZSk7Ci0JCQkJCWlmICghIHN1Y2NlZWQpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQkJCQkJCi0JCQkJCXNlcnZpY2UuZG9JbXBvcnQobW9uaXRvcik7Ci0JCQkJCUltcG9ydFhNTFByZWZlcmVuY2VzLnNldFhNTEZpbGUoeG1sRmlsZSk7Ci0JCQkJCUltcG9ydFhNTFByZWZlcmVuY2VzLnNldE1lcmdlT3B0aW9uKG1lcmdlT3B0aW9uKTsKLQkJCQkJSW1wb3J0WE1MUHJlZmVyZW5jZXMuc2V0Q2hlY2tCYXNlUGx1Z2luc09wdGlvbihjaGVja0Jhc2VQbHVnaW5zKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGUsCi0JCQkJCXJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCByZWFsRXhjZXB0aW9uKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghc3VjY2VlZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5yZXZpZXdfbG9nX2ZpbGVzLAotCQkvLwlzZXJ2aWNlLmdldExvZ1BhdGgoKSk7Ci0JCS8vTXNnQm94LnByb21wdChtc2csIFNXVC5PSyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyB3aXphcmQgYW5kIGZyZWVzIGFsbCBTV1QgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXNlcnZpY2UuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGY1NDlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwucHJlZmVyZW5jZXMuSW1wb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgWE1MIGZpbGUgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxGaWxlUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFhNTEZpbGVQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGV4dCBwYXRoVGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWVyZ2VPcHRpb24gPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFhNTEZpbGVQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShJbXBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vaW1wX3htbF93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgZmlsZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmaWxlTGFiZWwuc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMuZmlsZUxhYmVsX3RleHQpOyAKLQotCQlwYXRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXBhdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwYXRoVGV4dC5zZXRUZXh0KEltcG9ydFhNTFByZWZlcmVuY2VzLmdldFhNTEZpbGUoKSk7CQkKLQkJcGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzVmFsaWRQYXRoKHBhdGhUZXh0LmdldFRleHQoKS50cmltKCkpKSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShJbXBvcnRYTUxSZXNvdXJjZXMuaW52YWxpZFhNTEZpbGVfZXJyb3IpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoSW1wb3J0WE1MUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUZpbGVEaWFsb2cgZmQgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQlmZC5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLnhtbCIsICIqLioiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgcGF0aCA9IGZkLm9wZW4oKTsKLQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQlwYXRoVGV4dC5zZXRUZXh0KHBhdGgpOwotCQkJCQlvayA9IGlzVmFsaWRQYXRoKHBhdGgpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUob2spOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBvcHRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCW9wdGlvbkdyb3VwLnNldFRleHQoSW1wb3J0WE1MUmVzb3VyY2VzLm9wdGlvbkdyb3VwX3RleHQpOwotCi0JCW1lcmdlT3B0aW9uID0gSW1wb3J0WE1MUHJlZmVyZW5jZXMuZ2V0TWVyZ2VPcHRpb24oKTsKLQkJCQotCQlCdXR0b24gb3ZlcndyaXRlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cCwKLQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMub3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dCwgMSwgIW1lcmdlT3B0aW9uKTsKLQkJb3ZlcndyaXRlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbWVyZ2VPcHRpb24gPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gbWVyZ2VSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwLAotCQkJCUltcG9ydFhNTFJlc291cmNlcy5tZXJnZVJhZGlvQnV0dG9uX3RleHQsIDEsIG1lcmdlT3B0aW9uKTsKLQkJbWVyZ2VSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltZXJnZU9wdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJCi0JCUdyb3VwIG9wdGlvbkdyb3VwMSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uR3JvdXAxLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YTEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGExLmhvcml6b250YWxTcGFuID0gMzsKLQkJb3B0aW9uR3JvdXAxLnNldExheW91dERhdGEoZ3JpZERhdGExKTsKLQkJb3B0aW9uR3JvdXAxLnNldFRleHQoSW1wb3J0WE1MUmVzb3VyY2VzLm9wdGlvbkdyb3VwMV90ZXh0KTsKLQkJY2hlY2tCYXNlUGx1Z2lucyA9IEltcG9ydFhNTFByZWZlcmVuY2VzLmdldENoZWNrQmFzZVBsdWdpbnNPcHRpb24oKTsKLQkJCQotCQlCdXR0b24gY2hlY2tCYXNlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cDEsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLmNoZWNrQmFzZVJhZGlvQnV0dG9uX3RleHQsIDEsIGNoZWNrQmFzZVBsdWdpbnMpOwkKLQkJY2hlY2tCYXNlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY2hlY2tCYXNlUGx1Z2lucyA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIGlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ob3B0aW9uR3JvdXAxLAotCQkJCUltcG9ydFJlc291cmNlcy5pZ25vcmVSZW1vdmVSYWRpb0J1dHRvbl90ZXh0LCAxLCAhY2hlY2tCYXNlUGx1Z2lucyk7Ci0JCWlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNoZWNrQmFzZVBsdWdpbnMgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1ZhbGlkUGF0aChwYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVzZXIgc3BlY2lmaWMgcGF0aCBpcyB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHVzZXIgc3BlY2lmaWMgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHBhdGggaXMgdmFsaWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpKSB7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIFhNTCBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGltcG9ydCBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzZWxlY3RlZCB0aGUgbWVyZ2Ugb3B0aW9uLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSBvdmVyd3JpdGUgb3B0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TWVyZ2VPcHRpb24oKSB7Ci0JCXJldHVybiBtZXJnZU9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaXNQYWdlQ29tcGxldGUoKTsKLQl9CQotCQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGNoZWNrIGJhc2UgcGx1Z2luIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSBjaGVjayBiYXNlIHBsdWdpbiBvcHRpb24sCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlIGlnbm9yZSBjaGVjayBiYXNlIHBsdWdpbiBvcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDaGVja0Jhc2VQbHVnaW5zKCkgewotCQlyZXR1cm4gY2hlY2tCYXNlUGx1Z2luczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZWU2MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgaW1wb3J0aW5nIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgc3RvcmVkIGluIFhNTC4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWNkOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgSW1wb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5pbXBvcnQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNDQxNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTAyZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZywKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzc4MGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0F1dGhvcmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0F1dGhvcmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWJhZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9JbXBvcnRpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9JbXBvcnRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTYzOTRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvSW1wb3J0aW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZXRvb2wxNi9pbXBfbGliX2NvbmYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9saWJfY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzJjZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9saWJfY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2V0b29sMTYvaW1wX21ldGhfcGx1Z2luLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZXRvb2wxNi9pbXBfbWV0aF9wbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTk0NDNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZXRvb2wxNi9pbXBfbWV0aF9wbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbGliX2NvbmZfd2l6YmFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vaW1wX2xpYl9jb25mX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTFlMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbGliX2NvbmZfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vaW1wX21ldGhfcGx1Z2luX3dpemJhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2ltcF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWJkNjZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vaW1wX21ldGhfcGx1Z2luX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyMTk4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBJbXBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkKLWltcG9ydENhdGVnb3J5TmFtZT1NZXRob2QKLQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZAotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUxpYnJhcnkgQ29uZmlndXJhdGlvbgotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0PUltcG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9TWV0aG9kIFBsdWctaW5zCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnQgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zLgotCi0KLQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDE2MDYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBpY29uPSIvaWNvbnMvZXRvb2wxNi9pbXBfbGliX2NvbmYuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+IAotICAgICAgICAgICAgICAgJWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dAotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5JbXBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBpY29uPSIvaWNvbnMvZXRvb2wxNi9pbXBfbWV0aF9wbHVnaW4uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5JbXBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0Ci0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5JbXBvcnRQbHVnaW5XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS5jb21tYW5kTGluZVJ1bm5lcnMiPgotICAgICAgPGNvbW1hbmRMaW5lUnVubmVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db21tYW5kTGluZVBsdWdpbkltcG9ydGVyIgotICAgICAgICAgICAgcnVubmVySWQ9ImNvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTNiYjg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBJbXBvcnQgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEltcG9ydFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBvcnRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I3OGRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbXBvcnRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfaGFuZGxlVG9vbFZlcnNpb25fZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF93YXJuX2NpcmN1bGFyX3BsdWdpbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlnczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZFRvb2w7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25Hcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQmFzZVJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWdub3JlUmVtb3ZlUmFkaW9CdXR0b25fdGV4dDsKLQkJCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW1wb3J0UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MDhjZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQotIwotCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1pbXBvcnRDb25maWdXaXphcmRfdGl0bGU9SW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbgotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZ5IGltcG9ydCBkaXJlY3RvcnkKLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dD1TcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uIHRvIGltcG9ydC4KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPVJldmlldyBsaWJyYXJ5IGNoYW5nZXMKLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9UmV2aWV3IHRoZSBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBtYWRlIHRvIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5Lgotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3Qgb25lIG9yIG1vcmUgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBpbXBvcnQuCi0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQKLWltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9SW1wb3J0IE1ldGhvZCBQbHVnLWlucwotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9U3BlY2lmeSBpbXBvcnQgZGlyZWN0b3J5Ci1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBtZXRob2QgcGx1Zy1pbnMgdG8gaW1wb3J0Lgotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IG1ldGhvZCBwbHVnLWlucwotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zIHRvIGltcG9ydC4gSWYgYSBzZWxlY3RlZCBwbHVnLWluIGFscmVhZHkgZXhpc3RzIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LCB2ZXJpZnkgdGhlIHZlcnNpb24gZGlmZmVyZW5jZXMuCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUltcG9ydCBwbHVnLWluIGZhaWxlZAotCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cwPVZhbGlkYXRpbmcgc2VsZWN0ZWQgbGlicmFyeSBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPVRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjb25maWd1cmF0aW9uLgotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRpbmcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uLi4KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9Q2Fubm90IGltcG9ydCB0aGUgY3VycmVudGx5IG9wZW5lZCBsaWJyYXJ5IGludG8gaXRzZWxmLgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPUltcG9ydGluZyBtZXRob2QgY29uZmlndXJhdGlvbi4uLgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb249SW1wb3J0IGNvbmZpZ3VyYXRpb24gZmFpbGVkCi0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1DaGVja291dCBmYWlsZWQKLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9U29tZSBmaWxlcyBhcmUgbm90IGNoZWNrZWQgb3V0LCBkbyB5b3Ugd2FudCB0byB0cnkgYWdhaW4/Ci0KLUltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU9SW1wb3J0aW5nIENvbmZpZ3VyYXRpb24gUmVwb3J0Ci1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBMaWJyYXJ5IGlzIHJlYWQtb25seS4KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPUltcG9ydGluZyBtZXRob2QgcGx1Zy1pbi4uLgotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycm9yCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogVGhlIGZvbGxvd2luZyBzZWxlY3RlZCBwbHVnLWluKHMpIGFscmVhZHkgZXhpc3QgYW5kIHJlLWltcG9ydGluZyB0aGUgc2FtZSBwbHVnLWluKHMpIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvbmUocyk6XG5cbiB7MH0gXG5cbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8KLUltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlPVxuXG5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9jaXJjdWxhcl9wbHVnaW5zPUNpcmN1bGFyIHJlZmVyZW5jZXMgZGV0ZWN0ZWQgYW1vbmcgdGhlIGZvbGxvd2luZyBwbHVnLWlucwotCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPVRoZSBmb2xsb3dpbmcgZWxlbWVudHMgd2lsbCBiZSBpbXBvcnRlZDoKLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3I9RXJyb3IKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1BbmFseXppbmcKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1TZWxlY3QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBpbXBvcnQKLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZAotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9VGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPU5vIGRpcmVjdG9yeSBzcGVjaWZpZWQKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPUF2YWlsYWJsZSBwbHVnLWlucyBpbiB0aGUgaW1wb3J0IGRpcmVjdG9yeToKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I9QXV0aG9yOgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249VmVyc2lvbjoKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPUJyaWVmIGRlc2NyaXB0aW9uOgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IExpYnJhcnkgaXMgcmVhZC1vbmx5LgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVZhbGlkYXRpbmcgc2VsZWN0ZWQgcGx1Zy1pbnMuLi4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1UaGUgc3BlY2lmaWVkIHBhdGggZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIG1ldGhvZCBwbHVnLWluLgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPUltcG9ydGluZyBtZXRob2QgcGx1Zy1pbi4uLgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PVRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbiBjYW5ub3QgYmUgaW1wb3J0ZWQuIEl0cyBkZXBlbmRlbnQgcGx1Zy1pbiAnJ3swfScnIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1UaGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW4gY2Fubm90IGJlIGltcG9ydGVkLiBBIGRlcGVuZGVudCBwbHVnLWluIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1Db250ZW50Ci1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1JbiBJbXBvcnQKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWx5emluZyBmaWxlcy4uLgotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPVllcwotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yPUVycm9yCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1JbiBMaWJyYXJ5Ci1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1TdGF0dXMKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVNlbGVjdGVkIHBsdWctaW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9U2VsZWN0ZWQgcGx1Zy1pbiBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9Q29uZmlndXJhdGlvbiBmb3VuZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb249Tm8gY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIHNlbGVjdGVkLgotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY0RhdGFMYWJlbD1TZWxlY3RlZCBjb25maWd1cmF0aW9uIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5Ci1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzPUF2YWlsYWJsZSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5OgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZAotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYz1CcmllZiBkZXNjcmlwdGlvbjoKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aD1UaGUgc3BlY2lmaWVkIHBhdGggZG9lcyBub3QgZXhpc3QuCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249Tm8gcGx1Zy1pbiBzZWxlY3RlZC4KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPU5vIGRpcmVjdG9yeSBzcGVjaWZpZWQKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PVBsdWctaW4gezB9IGlzIHJlYWQtb25seVxuCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBQbHVnLWluIHswfSBpcyBsb2NrZWRcbgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlPVNvbWUgb2YgdGhlIHBsdWctaW4ocykgaW4gdGhlIGxpYnJhcnkgYXJlIGVpdGhlciBsb2NrZWQgb3IgcmVhZC1vbmx5LlxuIFBsZWFzZSB1bmxvY2sgdGhlIHBsdWctaW5zIGFuZCBtYWtlIHN1cmUgdGhlIGZpbGVzIGFyZSB1cGRhdGFibGUuCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVNlbGVjdGVkIHBsdWctaW4gaW4gdGhlIGltcG9ydCBkaXJlY3RvcnkKLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1Db250ZW50IFR5cGUKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGxpYnJhcnkuCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBFMDIwNEU6IFRoZSBzcGVjaWZpZWQgZmlsZXMgd2VyZSBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gKHswfSkgb2YgezF9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHsxfS4KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBUaGUgc3BlY2lmaWVkIGZpbGVzIHdlcmUgZXhwb3J0ZWQgYnkgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHswfS4gVGhlIGZpbGVzIG11c3QgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB7MH0uCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IFRoZSBzcGVjaWZpZWQgZmlsZXMgd2VyZSBleHBvcnRlZCBieSBhIG5ld2VyIHZlcnNpb24gKHswfSkgb2YgezF9LiBZb3UgbXVzdCB1cGdyYWRlIHsxfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGVzLiAgCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogVGhlIHNwZWNpZmllZCBmaWxlcyBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGVzLgotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfaGFuZGxlVG9vbFZlcnNpb25fZXJyb3I9SVVQRTAyMDhFOiBGYWlsZWQgdG8gdXBncmFkZSB0aGUgcGx1Zy1pbihzKS4KLW9wdGlvbkdyb3VwX3RleHQ9SW1wb3J0IG9wdGlvbgotY2hlY2tCYXNlUmFkaW9CdXR0b25fdGV4dD1DaGVjayBiYXNlIHBsdWctaW5zCi1pZ25vcmVSZW1vdmVSYWRpb0J1dHRvbl90ZXh0PUlnbm9yZSBhbmQgcmVtb3ZlIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiOTAzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBJbXBvcnQgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db21tYW5kTGluZVBsdWdpbkltcG9ydGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiYmM4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHMuQ29tbWFuZExpbmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBmb3IgaW1wb3J0aW5nIHBsdWdpbiBkcml2ZW4gYnkgY29tbWFuZCBsaW5lCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlciBleHRlbmRzIENvbW1hbmRMaW5lUnVubmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5zVGFnID0gIkltcG9ydFBsdWdpbnMiOyAJLy8kTk9OLU5MUy0xJCIJCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNlbGVjdGVkUGx1Z2luVGFnID0gIlNlbGVjdGVkUGx1Z2luIjsgLy8kTk9OLU5MUy0xJCIKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQmFzZUxpYnJhcnlGb2xkZXJVcmlBdHQ9ICJiYXNlTGlicmFyeUZvbGRlclVyaSI7CQkvLyROT04tTkxTLTEkIgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJbXBvcnRMaWJyYXJ5Rm9sZGVyVXJpQXR0PSAiaW1wb3J0TGlicmFyeUZvbGRlclVyaSI7CQkvLyROT04tTkxTLTEkIgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBOYW1lQXR0PSAibmFtZSI7CQkvLyROT04tTkxTLTEkIgotCi0JcHJpdmF0ZSBTdHJpbmcgYmFzZUxpYlBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgaW1wb3J0TGliUGF0aDsKLQkKLQlwcml2YXRlIFNldDxTdHJpbmc+IHNlbGVjdGVkUGx1Z2luczsKLQkKLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKCEgc3VwZXIuZXhlY3V0ZShhcmdzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRyeSB7Ci0JCQlsb2FkSW5wdXRGaWxlKCk7Ci0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSgiT3Blbm5pbmcgYmFzZSBsaWJyYXJ5IGFuZCBwcmVwYXJpbmcgaW1wb3J0IC4uLiIpOy8vJE5PTi1OTFMtMSQiCi0JCQkJCQlYTUlMaWJyYXJ5VXRpbC5vcGVuTWV0aG9kTGlicmFyeShiYXNlTGliUGF0aCk7Ci0KLQkJCQkJCUZpbGUgaW1wb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoaW1wb3J0TGliUGF0aCk7Ci0KLQkJCQkJCVBsdWdpbkltcG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5JbXBvcnREYXRhKCk7Ci0JCQkJCQlkYXRhLmxsRGF0YS5zZXRMaWJOYW1lKGltcG9ydExpYkZvbGRlci5nZXROYW1lKCkpOwotCQkJCQkJZGF0YS5sbERhdGEuc2V0UGFyZW50Rm9sZGVyKGltcG9ydExpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlmaW5hbCBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgUGx1Z2luSW1wb3J0aW5nU2VydmljZShkYXRhKTsKLQkJCQkJCXNlcnZpY2UudmFsaWRhdGUobnVsbCk7Ci0JCQkJCQkKLQkJCQkJCUxpc3QgaW1wb3J0UGx1Z2lucyA9IGRhdGEuZ2V0UGx1Z2lucygpOwotCQkJCQkJZm9yIChpbnQgaT0wOyBpIDwgaW1wb3J0UGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJCQkJCVBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbmZvKSBpbXBvcnRQbHVnaW5zLmdldChpKTsKLQkJCQkJCQlpbmZvLnNlbGVjdGVkID0gc2VsZWN0ZWRQbHVnaW5zLmlzRW1wdHkoKSB8fCBzZWxlY3RlZFBsdWdpbnMuY29udGFpbnMoaW5mby5uYW1lKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXNlcnZpY2UucGVyZm9ybUltcG9ydChtb25pdG9yKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQlwbURpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkSW5wdXRGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbC5sb2FkWG1sKGdldElucHV0RmlsZSgpKTsJCi0JCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAoISByb290LmdldFRhZ05hbWUoKS5lcXVhbHMoSW1wb3J0UGx1Z2luc1RhZykpIHsKLQkJCVN0cmluZyBtc2cgPSAiVGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlOiAgIiArIEltcG9ydFBsdWdpbnNUYWc7ICAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JCWJhc2VMaWJQYXRoID0gcm9vdC5nZXRBdHRyaWJ1dGUoQmFzZUxpYnJhcnlGb2xkZXJVcmlBdHQpOwotCQlpbXBvcnRMaWJQYXRoID0gcm9vdC5nZXRBdHRyaWJ1dGUoSW1wb3J0TGlicmFyeUZvbGRlclVyaUF0dCk7Ci0JCXNlbGVjdGVkUGx1Z2lucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCi0JCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzeiA9IG5vZGVzID09IG51bGwgPyAwIDogbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFscyhTZWxlY3RlZFBsdWdpblRhZykpIHsKLQkJCQkJU3RyaW5nIG5hbWUgID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTmFtZUF0dCk7CQkJCQkKLQkJCQkJc2VsZWN0ZWRQbHVnaW5zLmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OTY5NzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBNb2RlbHMgYSBsaXN0IG9mIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1NwZWNzIHsKLQotCS8vIEEgbGlzdCBvZiBjb25maWd1cmF0aW9uIGVudHJpZXMuCi0JcHVibGljIExpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ1NwZWNzKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgZW50cnkuCi0JICovCi0JcHVibGljIEVudHJ5IG5ld0VudHJ5KCkgewotCQlFbnRyeSBlID0gbmV3IEVudHJ5KCk7Ci0JCWNvbmZpZ3MuYWRkKGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBpdGVyYXRvciBmb3IgdGhlIGNvbmZpZyBzcGVjcy4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBjb25maWdzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIEVudHJ5IHsKLQotCQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWMgY29uZmlnU3BlYyA9IG51bGw7Ci0KLQkJcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZXhpc3RpbmdDb25maWcgPSBudWxsOwotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdGVkID0gdHJ1ZTsKLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKGNvbmZpZ1NwZWMgIT0gbnVsbCkKLQkJCQlpZiAoY29uZmlnU3BlYy5uYW1lICE9IG51bGwpCi0JCQkJCXJldHVybiBjb25maWdTcGVjLm5hbWU7Ci0JCQlyZXR1cm4gInVua25vd24gY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDA2OWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuTGlicmFyeURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbXBvcnQgb2YgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbmZpZyBzcGVjcyBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIENvbmZpZ1NwZWNzIGdldENvbmZpZ1NwZWNzKGZpbmFsIExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQlmaW5hbCBDb25maWdTcGVjcyBjb25maWdTcGVjcyA9IG5ldyBDb25maWdTcGVjcygpOwotCi0JCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUoZG9jdW1lbnQuZ2V0RmlsZSgpLmdldFBhcmVudCgpLCBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7CQkJCi0JCUxpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTGlicmFyeURvY3VtZW50LkNvbmZpZ0RvY1Zpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdChGaWxlIGZpbGUsIEVsZW1lbnQgbm9kZSkgewotCQkJCUNvbmZpZ1NwZWNzLkVudHJ5IGVudHJ5ID0gY29uZmlnU3BlY3MubmV3RW50cnkoKTsKLQkJCQllbnRyeS5jb25maWdTcGVjID0gZG9jdW1lbnQuZ2V0Q29uZmlndXJhdGlvblNwZWMobm9kZSk7Ci0JCQkJZW50cnkuZXhpc3RpbmdDb25maWcgPSBnZXRFeGlzdGluZ0NvbmZpZyhlbnRyeS5jb25maWdTcGVjLmd1aWQpOwotCQkJfQotCQl9OwkJCQotCQlMaWJyYXJ5RG9jdW1lbnQudmlzaXRDb25maWdGaWxlcyhjb25maWdEaXIsIHZpc2l0b3IpOwkJCQotCQlyZXR1cm4gY29uZmlnU3BlY3M7Ci0JfQotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGdldEV4aXN0aW5nQ29uZmlnKFN0cmluZyBndWlkKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOwotCQkJaWYgKGNvbmZpZy5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIGNvbmZpZzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEltcG9ydHMgdGhlIHNlbGVjdGVkIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gc3BlY3MKLQkgKiAgICAgICAgICAgIEEgbGlicmFyeSBjb25maWd1cmF0aW9uIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ltcG9ydChDb25maWdTcGVjcyBzcGVjcykgewotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGxpYik7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29uZmlnU3BlY3MuRW50cnkgZW50cnkgPSAoQ29uZmlnU3BlY3MuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZW50cnkuc2VsZWN0ZWQpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjcmVhdGVDb25maWcoZW50cnkuY29uZmlnU3BlYyk7Ci0KLQkJCQkJaWYgKGVudHJ5LmV4aXN0aW5nQ29uZmlnICE9IG51bGwpIHsKLQkJCQkJCS8vIE1lcmdlIHRoZSBuZXcgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIGludG8gdGhlIGV4aXN0aW5nCi0JCQkJCQkvLyBvbmUsCi0JCQkJCQkvLyBhbnl0aGluZyBpbiB0aGUgY3VycmVudCBjb25maWd1YXRpb24gc2hvdWxkIGJlIGtlcHQuCi0JCQkJCQkvLyBFY29yZVV0aWwucmVwbGFjZShlbnRyeS5leGlzdGluZ0NvbmZpZywgY29uZmlnKTsKLQkJCQkJCUxpc3QgcGx1Z2lucyA9IGVudHJ5LmV4aXN0aW5nQ29uZmlnCi0JCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCQkJCUxpc3QgcGtncyA9IGVudHJ5LmV4aXN0aW5nQ29uZmlnCi0JCQkJCQkJCS5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJCQlMaXN0IHZpZXdzID0gZW50cnkuZXhpc3RpbmdDb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRwLm5leHQoKTsKLQkJCQkJCQlpZiAoIXBsdWdpbnMuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJcGx1Z2lucy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBpdHAubmV4dCgpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQlwa2dzLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0cAotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRwLm5leHQoKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJdmlld3MuYWRkKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIEFkZCB0aGUgY29uZmlndXJhdGlvbi4KLQkJCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGQoY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkobGliLCBmYWxzZSwgZmFsc2UpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlnKENvbmZpZ3VyYXRpb25TcGVjIHNwZWMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLy8gU2V0IHRoZSBhdHRyaWJ1dGVzLgotCQljb25maWcuc2V0TmFtZShzcGVjLm5hbWUpOwotCQljb25maWcuc2V0QnJpZWZEZXNjcmlwdGlvbihzcGVjLmJyaWVmX2Rlc2MpOwotCQljb25maWcuc2V0R3VpZChzcGVjLmd1aWQpOwotCi0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjLnBsdWdpbklkcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAhcGx1Z2lucy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlwbHVnaW5zLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjLnBhY2thZ2VJZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgIXBrZ3MuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJcGtncy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3BlYy52aWV3SWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICF2aWV3cy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQl2aWV3cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0Y2U2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeUxvY2F0aW9uRGF0YTsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBpbXBvcnQgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSB7Ci0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBuZXcgTGlicmFyeUxvY2F0aW9uRGF0YSgpOwotCi0JcHJpdmF0ZSBFcnJvckluZm8gZXJyb3IgPSBuZXcgRXJyb3JJbmZvKCk7Ci0KLQkvLyBJZiBzcGVjcyAhPSBudWxsLCBpdCdzIGEgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIG9ubHkuCi0JcHVibGljIENvbmZpZ1NwZWNzIHNwZWNzID0gbnVsbDsKLQotCXB1YmxpYyBMaXN0IGltcG9ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBJbmRpY2F0ZSBpZiB5b3Ugd2FudCB0byByZXBsYWNlIGV4aXN0aW5nIG1ldGhvZCBwYWNrYWdlcy4KLQlwdWJsaWMgYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkltcG9ydERhdGEoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBpZiBhbnkuCi0JICovCi0JcHVibGljIEVycm9ySW5mbyBnZXRFcnJvckluZm8oKSB7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKLQotCQlwcml2YXRlIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJcHVibGljIEVycm9ySW5mbygpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKLQkJCXJldHVybiBlcnJvck1lc3NhZ2UudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJZXJyb3JNZXNzYWdlLnNldExlbmd0aCgwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI5YTI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuTGlicmFyeURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWwuQ29udmVydEd1aWRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLlR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5PcGVuTGlicmFyeVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogSW1wb3J0cyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHsKLQotCXByaXZhdGUgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBVcGdyYWRlQ2FsbGVySW5mbyB1cEdyYWRlSW5mbzsKLQkKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGE7Ci0KLQlMaWJyYXJ5RG9jdW1lbnQgaW1wb3J0aW5nTGliRG9jID0gbnVsbDsKLQotCUxpYnJhcnlEaWZmTWFuYWdlciBkaWZmTWdyID0gbnVsbDsKLQotCUNvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlciBzcGVjc01nciA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UoQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEFuYWx5emVzIHRoZSBpbXBvcnRlZCBsaWJyYXJ5IHdpdGggcmVzcGVjdCB0byB0aGUgYmFzZSBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFuYWx5emUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMCk7Ci0JCQl9Ci0KLQkJCWRhdGEuZ2V0RXJyb3JJbmZvKCkuY2xlYXIoKTsKLQotCQkJLy8gUHJlcGFyZSB0aGUgbGlicmFyeSBmaWxlcy4KLQkJCVN0cmluZyBwYXRoID0gZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCk7Ci0JCQlpZiAocGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmxpYnJhcnlGaWxlKSA8IDApIHsKLQkJCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmxpYnJhcnlGaWxlOwotCQkJfQotCQkJRmlsZSBpbXBvcnRpbmdMaWJQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkKLQkJCWJvb2xlYW4gaXNMaWJyYXJ5RmlsZSA9IHRydWU7Ci0JCQlpZiAoIWltcG9ydGluZ0xpYlBhdGguZXhpc3RzKCkpIHsKLQkJCQlpbXBvcnRpbmdMaWJQYXRoID0gbmV3IEZpbGUoaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCQlMaWJyYXJ5RG9jdW1lbnQuZXhwb3J0RmlsZSk7Ci0JCQkJaXNMaWJyYXJ5RmlsZSA9IGZhbHNlOwotCQkJfQotCi0JCQlpZiAoIWltcG9ydGluZ0xpYlBhdGguZXhpc3RzKCkpIHsKLQkJCQlkYXRhCi0JCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJCS5hZGRFcnJvcigKLQkJCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzEsIGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCkpKTsgCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlib29sZWFuIGhhbmRsZVZlcnNpb24gPSBpc0xpYnJhcnlGaWxlOwotCQkJaWYgKGhhbmRsZVZlcnNpb24pIHsKLQkJCQl1cEdyYWRlSW5mbyA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5VcGdyYWRlSW5mbyhVcGdyYWRlQ2FsbGVySW5mby51cGdyYWRlSW1wb3J0Q29uZmlnLCBpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQlpZiAoISBoYW5kbGVUb29sVmVyc2lvbihpbXBvcnRpbmdMaWJQYXRoLCB1cEdyYWRlSW5mbykpIHsKLQkJCQkJU3RyaW5nIGVyck1zZyA9IHVwR3JhZGVJbmZvLmdldEVycm9yTXNnKCk7Ci0JCQkJCWlmIChlcnJNc2cgPT0gbnVsbCB8fCBlcnJNc2cubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJZXJyTXNnID0gSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uOwotCQkJCQl9Ci0JCQkJCWRhdGEKLQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCS5hZGRFcnJvcigKLQkJCQkJCQlOTFMuYmluZChlcnJNc2csIGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCkpKTsgCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCWltcG9ydGluZ0xpYlBhdGggPSB1cEdyYWRlSW5mby5nZXRDb3BpZWRMaWJGaWxlKCk7Ci0JCQkJfQotCQkJfQotCQkJCQkJCi0JCQlpbXBvcnRpbmdMaWJEb2MgPSBuZXcgTGlicmFyeURvY3VtZW50KGltcG9ydGluZ0xpYlBhdGgpOwotCi0JCQlib29sZWFuIGlzQ29uZmlnU3BlY3MgPSBpbXBvcnRpbmdMaWJEb2MuaXNDb25maWdTcGVjc09ubHkoKTsKLQotCQkJaWYgKGlzQ29uZmlnU3BlY3MpIHsKLQotCQkJCXNwZWNzTWdyID0gbmV3IENvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlcigpOwotCi0JCQkJLy8gU2NhbiB0aGUgbGlicmFyeSBmaWxlIGZvciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotCQkJCWRhdGEuc3BlY3MgPSBzcGVjc01nci5nZXRDb25maWdTcGVjcyhpbXBvcnRpbmdMaWJEb2MpOwotCi0JCQl9IGVsc2UgewotCQkJCWlmICghaXNMaWJyYXJ5RmlsZSkgewotCQkJCQlkYXRhCi0JCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzEsIGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCkpKTsgCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZGF0YS5zcGVjcyA9IG51bGw7Ci0KLQkJCQkvLyBPcGVuIHRoZSBsaWJyYXJ5IGFuZCBjb21wYXJlIHRoZSBkaWZmZXJlbmNlLgotCQkJCQotCQkJCS8vIG5lZWQgdG8gb3BlbiBhbmQgY2xvc2UgdGhlIGxpYnJhcnkgdG8gaGF2ZSB0aGUgcHJvamVjdCByZXNvdXJjZXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkKLQkJCQlTdHJpbmcgbGliRGlyID0gaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAiQ29uZmlndXJhdGlvbiBJbXBvcnQgUHJvamVjdCAoIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIEludGVnZXIudG9IZXhTdHJpbmcobGliRGlyLmhhc2hDb2RlKCkpICsgIikiOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QobGliRGlyLCBwcm9qZWN0TmFtZSwgbW9uaXRvcik7Ci0JCQkJdHJ5IHsKLQkJCQkJTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5ID0gTGlicmFyeVV0aWwKLQkJCQkJCQkubG9hZExpYnJhcnkoaW1wb3J0aW5nTGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgYmFzZUxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCQotCQkJCQloYW5kbGVUeXBlQ2hhbmdlcyhiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JCQkJCQotCQkJCQlTdHJpbmcgYmFzZUxpYkRpciA9IG51bGw7Ci0JCQkJCXRyeSB7CS8vTm90IG5lY2Nlc3NhcnksIGJ1dCBwcmV2ZW50IGludHJvZHVjaW5nIGFueSBwb3RlbnRpYWwgcmVncmVzc2lvbiBkdWUgdG8gdGhpcyBjaGFuZ2UKLQkJCQkJCUZpbGUgYkZpbGUgPSBuZXcgRmlsZShiYXNlTGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOzsKLQkJCQkJCWJhc2VMaWJEaXIgPSBiRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsJCQkJCQkKLQkJCQkJfQotCQkJCQlpZiAobGliRGlyLmVxdWFsc0lnbm9yZUNhc2UoYmFzZUxpYkRpcikpIHsKLQkJCQkJCWRhdGEKLQkJCQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCQkJCS5hZGRFcnJvcigKLQkJCQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMiwgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkKLQkJCQkJZml4SW1wb3J0TGlicmFyeVN5c3RlbVBhY2thZ2VHVUlEcyhiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JCQkJCQotCQkJCQlkaWZmTWdyID0gbmV3IExpYnJhcnlEaWZmTWFuYWdlcihiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JCQkJCWRpZmZNZ3IuYnVpbGREaWZmVHJlZSgpOwotCQkJCQkKLQkJCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJCWRpZmZNZ3Iucm9vdERpZmZUcmVlLmRlYnVnRHVtcCgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChsaWJEaXIsIG1vbml0b3IpOwotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmRlbGV0ZVByb2plY3QobGliRGlyLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IGRhdGEuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGdldEltcG9ydERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc3BlYyBvbmx5IGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNzT25seSgpIHsKLQkJcmV0dXJuIChkYXRhLnNwZWNzICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmYgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldERpZmZUcmVlKCkgewotCQlyZXR1cm4gZGlmZk1nci5nZXREaWZmVHJlZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltcG9ydCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEltcG9ydGluZ0xpYnJhcnkoKSB7Ci0JCXJldHVybiBkaWZmTWdyLmdldEltcG9ydGluZ0xpYnJhcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgaW1wb3J0LgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1JbXBvcnQoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQkvLyBuZWVkIHRvIGRpc2FibGUgdGhlIHdvcmtzcGFjZSByZWZyZXNoaW5nCi0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJaWYocmVmcmVzaCkgewotCQkJLy8gZGlzYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIGR1cmluZyBpbXBvcnQKLQkJCS8vCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMyk7Ci0JCQl9Ci0KLQkJCWlmIChpc1NwZWNzT25seSgpKSB7Ci0JCQkJc3BlY3NNZ3IuZG9JbXBvcnQoZGF0YS5zcGVjcyk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyIGltcG9ydGluZ01nciA9IG5ldyBMaWJyYXJ5SW1wb3J0TWFuYWdlcihkaWZmTWdyLCBkYXRhLmltcG9ydExpc3QpOwkJCQotCQkJCWltcG9ydGluZ01nci5kb01lcmdlKGRhdGEucmVwbGFjZUV4aXN0aW5nLCBtb25pdG9yKTsKLQkJCX0KLQkJCQotCQkJLy8gcmVmcmVzaCBsaWJyYXJ5IGZpbGVzIGluIHdvcmtzcGFjZQotCQkJLy8KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHJlZnJlc2gpIHsKLQkJCQkvLyByZS1lbmFibGUgcmVzb3VyY2UgcmVmcmVzaGluZyAKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJaWYgKHVwR3JhZGVJbmZvICE9IG51bGwpIHsKLQkJCQl1cEdyYWRlSW5mby5yZW1vdmVDb3BpZWRMaWJyYXJ5KCk7Ci0JCQkJdXBHcmFkZUluZm8gPSBudWxsOwotCQkJfQotCQl9CQotCQkKLQkJdHJ5IHsKLQkJCS8vIFJlb3BlbiB0aGUgbGlicmFyeS4KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsJCQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGUgdG9vbCB2ZXJzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25DaGVjayhmaW5hbCBTdHJpbmcgeG1sUGF0aCwgZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0JCWZpbmFsIFN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbMV07Ci0JCXJldFswXSA9IG51bGw7Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7CQkJCQotCQkJCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24obmV3IEZpbGUoeG1sUGF0aCkpOwotCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGluZm8ucmVzdWx0IDwgMCkgewotCQkJCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGluZm8ucmVzdWx0ID4gMCkgewotCQkJCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGRUb29sLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0KLQkJCQkJfSAKLQkJCQl9Ci0JCQkJaWYgKHJldFswXSAhPSBudWxsKSB7Ci0JCQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCByZXRbMF0pOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBGaXhlcyB0aGUgaW1wb3J0ZWQgbGlicmFyeSdzIHN5c3RlbSBwYWNrYWdlIGd1aWRzIHdpdGggdGhvc2UgYmFzZSdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKE1ldGhvZExpYnJhcnkgYmFzZUxpYnJhcnksIE1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQlIYXNoTWFwIHBsdWdpbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHBsdWdpbnMgPSBiYXNlTGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldChpKTsKLQkJCXBsdWdpbnNNYXAucHV0KHBsdWdpbi5nZXRHdWlkKCksIHBsdWdpbik7Ci0JCX0KLQkJaWYgKHBsdWdpbnNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgaW1wb3J0UGx1Z2luc1RvRml4ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGltcG9ydFBsdWdpbnMgPSBpbXBvcnRMaWJyYXR5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgaW1wb3J0UGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGltcG9ydFBsdWdpbnMuZ2V0KGkpOwotCQkJaWYgKHBsdWdpbnNNYXAuY29udGFpbnNLZXkocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlpbXBvcnRQbHVnaW5zVG9GaXguYWRkKHBsdWdpbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9MDsgaSA8IGltcG9ydFBsdWdpbnNUb0ZpeC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIGltcG9ydFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGltcG9ydFBsdWdpbnNUb0ZpeC5nZXQoaSk7Ci0JCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnNNYXAuZ2V0KGltcG9ydFBsdWdpbi5nZXRHdWlkKCkpOwotCQkJaWYgKGJhc2VQbHVnaW4gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJTGlzdCBpbXBvcnRQYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoaW1wb3J0UGx1Z2luKTsKLQkJCUhhc2hNYXAgaW1wb3J0UGFja2FnZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBqPTA7IGogPCBpbXBvcnRQYWNrYWdlcy5zaXplKCk7IGorKykgewotCQkJCU1ldGhvZEVsZW1lbnQgaW1wb3J0UGFja2FnZSA9IChNZXRob2RFbGVtZW50KSBpbXBvcnRQYWNrYWdlcy5nZXQoaik7Ci0JCQkJaW1wb3J0UGFja2FnZU1hcC5wdXQoaW1wb3J0UGFja2FnZS5nZXROYW1lKCksIGltcG9ydFBhY2thZ2UpOwotCQkJfQotCQkJCi0JCQlMaXN0IGJhc2VQYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoYmFzZVBsdWdpbik7CQkJCi0JCQlmb3IgKGludCBqPTA7IGogPCBiYXNlUGFja2FnZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQlNZXRob2RFbGVtZW50IGJhc2VQYWNrYWdlID0gKE1ldGhvZEVsZW1lbnQpIGJhc2VQYWNrYWdlcy5nZXQoaik7Ci0JCQkJTWV0aG9kRWxlbWVudCBpbXBvcnRQYWNrYWdlID0gKE1ldGhvZEVsZW1lbnQpIGltcG9ydFBhY2thZ2VNYXAuZ2V0KGJhc2VQYWNrYWdlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGltcG9ydFBhY2thZ2UgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGd1aWQgPSBiYXNlUGFja2FnZS5nZXRHdWlkKCk7Ci0JCQkJaWYgKCEgaW1wb3J0UGFja2FnZS5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJCWltcG9ydFBhY2thZ2Uuc2V0R3VpZChndWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKE1ldGhvZExpYnJhcnkgYmFzZUxpYiwgTWV0aG9kTGlicmFyeSBpbXBvcnRMaWIpIHsKLQkJSGFzaE1hcCBiYXNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJY29sbGVjdFBvdGVudGlhbFR5cGVDaGFuZ2VkKGJhc2VMaWIsIGJhc2VNYXApOwotCQlIYXNoTWFwIGltcG9ydE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbGxlY3RQb3RlbnRpYWxUeXBlQ2hhbmdlZChpbXBvcnRMaWIsIGltcG9ydE1hcCk7Ci0JCWhhbmRsZVR5cGVDaGFuZ2VzKGJhc2VNYXAsIGltcG9ydE1hcCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBNZXRob2RFbGVtZW50IHR5cGUgY2hhbmdlcy4gTm90ZTogZm9yIE1ldGhvZEVsZW1lbnQgb2JqZWN0cyBpbiBpbXBvcnRNYXAKLQkgKiBvbmx5IGVDbGFzcyB0eXBlIGlzIHVzZWQgaW4gdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKEhhc2hNYXAgYmFzZU1hcCwgSGFzaE1hcCBpbXBvcnRNYXApIHsKLQkJQXJyYXlMaXN0IHRvQ2hhbmdlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGltcG9ydE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBndWlkID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlNZXRob2RFbGVtZW50IGJhc2VFbGVtID0gKE1ldGhvZEVsZW1lbnQpIGJhc2VNYXAuZ2V0KGd1aWQpOwotCQkJaWYgKGJhc2VFbGVtICE9IG51bGwpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoISBlbGVtLmVDbGFzcygpLmVxdWFscyhiYXNlRWxlbS5lQ2xhc3MoKSkpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtUGFpcltdID0gbmV3IE1ldGhvZEVsZW1lbnRbXSB7YmFzZUVsZW0sIGVsZW19OwotCQkJCQl0b0NoYW5nZUxpc3QuYWRkKGVsZW1QYWlyKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPHRvQ2hhbmdlTGlzdC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtUGFpcltdID0gKE1ldGhvZEVsZW1lbnRbXSkgdG9DaGFuZ2VMaXN0LmdldChpKTsKLQkJCWZpbmFsIE1ldGhvZEVsZW1lbnQgYmFzZUVsZW0gPSBlbGVtUGFpclswXTsKLQkJCWZpbmFsIE1ldGhvZEVsZW1lbnQgaW1wb3J0RWxlbSA9IGVsZW1QYWlyWzFdOwotCQkJaWYgKGJhc2VFbGVtIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUNvbnZlcnRHdWlkYW5jZVR5cGUuY29udmVydEd1aWRhbmNlKChHdWlkYW5jZSkgYmFzZUVsZW0sIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgbnVsbCwgaW1wb3J0RWxlbS5lQ2xhc3MoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gZWxzZSBpZiAoYmFzZUVsZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVR5cGVDb252ZXJ0ZXIuY29udmVydEFjdGl2aXR5KChBY3Rpdml0eSkgYmFzZUVsZW0sIGltcG9ydEVsZW0uZUNsYXNzKCkpOyAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbGxlY3RzIGVsZW1lbnRzIGluIGxpYiB0aGF0IG1heSBoYXZlIHR5cGUgY2hhbmdlcyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdFBvdGVudGlhbFR5cGVDaGFuZ2VkKE1ldGhvZExpYnJhcnkgbGliLCBIYXNoTWFwIG1hcCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlIHx8Ci0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCW1hcC5wdXQoZWxlbS5nZXRHdWlkKCksIGVsZW0pOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYW5kbGVUb29sVmVyc2lvbihGaWxlIGxpYkZpbGUsIGZpbmFsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHsKLQkJZmluYWwgU3RyaW5nIGxpYkZvbGRlclBhdGggPSBsaWJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJldFswXSA9IE9wZW5MaWJyYXJ5V2l6YXJkLmhhbmRsZVRvb2xWZXJzaW9uKGxpYkZvbGRlclBhdGgsIGluZm8pOwotCQkJfQotCQl9KTsJCQkJCQkJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0JCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFVwZ3JhZGVJbmZvIGV4dGVuZHMgVXBncmFkZUNhbGxlckluZm8gewotCQkKLQkJcHVibGljIFVwZ3JhZGVJbmZvKGludCBjYWxsZXJUeXBlLCBGaWxlIGxpYkZpbGUpIHsKLQkJCXN1cGVyKGNhbGxlclR5cGUsIGxpYkZpbGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjb3B5TGlicmFyeSgpIHsKLQkJCVN0cmluZyB1c2VySG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkZXNMaWJGb2xkZXJQYXRoID0gdXNlckhvbWUgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrICJFUEYiICsgRmlsZS5zZXBhcmF0b3IgKyAiRXhwb3J0IiArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIExvbmcudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSkgKyBGaWxlLnNlcGFyYXRvcjsJCQotCQkJRmlsZSBkZXNMaWJGb2xkZXIgPSBuZXcgRmlsZShkZXNMaWJGb2xkZXJQYXRoKTsKLQkJCWlmICghZGVzTGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZGVzTGliRm9sZGVyLm1rZGlycygpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhkZXNMaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQkJCi0JCQlQbHVnaW5FeHBvcnRTZXJ2aWNlLmNvcHlEaXIoZ2V0TGliRmlsZSgpLmdldFBhcmVudEZpbGUoKSwgZGVzTGliRm9sZGVyKTsKLQkJCXNldENvcGllZExpYkZpbGUobmV3IEZpbGUoZGVzTGliRm9sZGVyUGF0aCArIGdldExpYkZpbGUoKS5nZXROYW1lKCkpKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29waWVkTGlicmFyeSgpIHsKLQkJCWlmIChnZXRDb3BpZWRMaWJGaWxlKCkgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKGdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKS5kZWxldGUoKTsKLQkJCXNldENvcGllZExpYkZpbGUobnVsbCk7Ci0JCX0KLQl9OwkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0RpckNvcHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRGlyQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFjNDg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRGlyQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNvcHkgZmlsZXMgZnJvbSBvbmUgZGlyIHRvIGFub3RoZXIsIGFuZCBkZWxldGUgdGhlIHVuLW5lZWRlZCBmaWxlcyBmcm9tIHNvdXJjZSBkaXIuCi0gKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpckNvcHkgewotCi0JLy9wcml2YXRlIElTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCQotCUZpbGUgc3JjRGlyOwotCUZpbGUgdGFyZ2V0RGlyOwotCQotCS8vIG5ldyBmaWxlcyB0byBiZSBhZGRlZCB0byB0aGUgdGFyZ2V0Ci0JTGlzdCBuZXdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvLyBmaWxlcyBleGlzdHMgaW4gYm90aCBzcmMgYW5kIHRhcmdldCBkaXIKLQlMaXN0IG9sZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZpbGVzIG9ubHkgaW4gdGFyZ2V0IGRpciwgdGhlc2UgZmlsZXMgYXJlIHRyZWF0ZWQgYXMgZGVsZXRlZCBpbiB0aGUgc3JjIGZvbGRlci4KLQlMaXN0IGRlbGV0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXJDb3B5KEZpbGUgc3JjRGlyLCBGaWxlIHRhcmdldERpcikgewotCQl0aGlzLnNyY0RpciA9IHNyY0RpcjsKLQkJdGhpcy50YXJnZXREaXIgPSB0YXJnZXREaXI7Ci0JCQotCQlwcmVwYXJlKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBDUF9GT0RMRVIgPSBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBEUF9GT0RMRVIgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUxJVkVSWV9QUk9DRVNTX1BBVEggKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBjaGVjayBvdXQgdGhlIGV4aXN0aW5nIGZpbGVzLCBkZWxldGUgdGhlIGZpbGVzIGZyb20gY20sIGFuZCBhZGQgbmV3IGZpbGVzLCBjb3B5IHRoZSBmaWxlcyBvdmVyCi0JICoKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCkgewotCQkJCi0JCS8vIGNoZWNrIG91dCBmaWxlcwotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG9sZEZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpaXQubmV4dCgpOwkJCQkJCQotCQkJaWYgKG5lZWRDb3B5KG5ldyBGaWxlKHNyY0RpciwgcGF0aCksIG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkpKSB7CS8vMTU0MzIxCi0JCQkJZmlsZXMuYWRkKG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9Ci0JCQotCQlJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkoZmlsZXMpOwotCQkKLQkJaWYgKCAhZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpICkgewotCQkJcmV0dXJuIGZpbGVDaGVja2VkT3V0U3RhdHVzOwotCQl9Ci0JCQkKLQkJLy8gZGVsZXRlIGZpbGVzCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBkZWxldGVkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhdGgpOwotCQkJZmlsZU1nci5kZWxldGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCS8vIGRlbGV0ZSB0aGUgZW1wdHkgQ1AgYW5kIERQIGZvbGRlcgotCQkJcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7IAotCQkJaWYgKCBwYXRoLnN0YXJ0c1dpdGgoQ1BfRk9ETEVSKSB8fCBwYXRoLnN0YXJ0c1dpdGgoRFBfRk9ETEVSKSApIHsKLQkJCQlGaWxlIGZvbGRlciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCVN0cmluZ1tdIGl0ZW1zID0gZm9sZGVyLmxpc3QoKTsKLQkJCQlpZiAoIGl0ZW1zID09IG51bGwgfHwgaXRlbXMubGVuZ3RoID09IDAgKSB7Ci0JCQkJCWZpbGVNZ3IuZGVsZXRlKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7CQkJCQotCQkJCX0KLQkJCX0KLQkJfQkKLQkJCi0JCS8vIGNvcHkgb2xkIGZpbGVzCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gb2xkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShuZXcgRmlsZShzcmNEaXIsIHBhdGgpLCBuZXcgRmlsZSh0YXJnZXREaXIsIHBhdGgpKTsKLQkJfQotCQkKLQkJLy8gY29weSBuZXcgZmlsZXMKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBuZXdGaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKG5ldyBGaWxlKHNyY0RpciwgcGF0aCksIG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmlsZUNoZWNrZWRPdXRTdGF0dXM7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBwcmVwYXJlKCkgewotCQlMaXN0IGFsbFNyY0ZpbGVzID0gZ2V0QWxsRmlsZXMoc3JjRGlyKTsKLQkJTGlzdCBhbGxUYXJnZXRGaWxlcyA9IGdldEFsbEZpbGVzKHRhcmdldERpcik7Ci0KLQkJd2hpbGUgKCBhbGxUYXJnZXRGaWxlcy5zaXplKCkgPiAwICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWFsbFRhcmdldEZpbGVzLnJlbW92ZSgwKTsKLQkJCWlmICggYWxsU3JjRmlsZXMuY29udGFpbnMocGF0aCkgKSB7Ci0JCQkJb2xkRmlsZXMuYWRkKHBhdGgpOwotCQkJCWFsbFNyY0ZpbGVzLnJlbW92ZShwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVsZXRlZEZpbGVzLmFkZChwYXRoKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gdGhlIHJlbWFpbmluZyBmaWxlcyBpbiB0aGUgdGFyZ2V0IGxpc3QgaXMgdGhlIG5ldyBmaWxlcwotCQluZXdGaWxlcy5hZGRBbGwoYWxsU3JjRmlsZXMpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIHRoZSBmaWxlcyB3aXRoIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3QKLQkgKiBAcGFyYW0gZGlyIHRoZSByb290IGRpcgotCSAqIEByZXR1cm4gTGlzdCBhbGwgZmlsZXMgaW4gdGhlIGRpciwgd2l0aCByZWxhdGl2ZSBwYXRoIHRvIHRoZSByb290Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFsbEZpbGVzKEZpbGUgZGlyKSB7Ci0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUZpbGVVdGlsLmdldEFsbEZpbGVzKGRpciwgZmlsZXMsIHRydWUpOwotCi0JCS8vIGNvbnZlcnQgdG8gbGlzdCBvZiBwYXRoLCBub3QgRmlsZQotCQlVUkkgYmFzZVVybCA9IGRpci50b1VSSSgpOwotCQkKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoIGkgPCBmaWxlcy5zaXplKCkgKSB7Ci0JCQlGaWxlIGYgPSAoRmlsZSlmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoIGNhbklnbm9yZShmLmdldEFic29sdXRlUGF0aCgpKSB8fCBjYW5JZ25vcmUoZikpIHsKLQkJCQlmaWxlcy5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSByZWwgPSBiYXNlVXJsLnJlbGF0aXZpemUoZi50b1VSSSgpKTsKLQkJCQlmaWxlcy5zZXQoaSwgcmVsLmdldFBhdGgoKSk7CQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19GT0xERVIgPSBGaWxlLnNlcGFyYXRvciArICJDVlMiICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1ZOX0ZPTERFUiA9IEZpbGUuc2VwYXJhdG9yICsgIi5zdm4iICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBjYW5JZ25vcmUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCBwYXRoLmluZGV4T2YoQ1ZTX0ZPTERFUikgPj0wICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCBwYXRoLmluZGV4T2YoU1ZOX0ZPTERFUikgPj0wICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaWdub3JlRmlsZXMgPSB7Ci0JCQkJCQkJCQkiLmNvcHlhcmVhLmRhdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSIuY29weWFyZWEuZGIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX07CQkJCi0JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGlnbm9yZUZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoaWdub3JlRmlsZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb3B5IGFjdGlvbiBpcyBuZWVkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRDb3B5KEZpbGUgc291cmNlLCBGaWxlIGRlc3QpIHsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJcmV0ID0gKGRlc3QubGFzdE1vZGlmaWVkKCkgIT0gc291cmNlLmxhc3RNb2RpZmllZCgpKQotCQkJCQl8fCAoZGVzdC5sZW5ndGgoKSAhPSBzb3VyY2UubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRWxlbWVudERpZmZUcmVlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0VsZW1lbnREaWZmVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWI4MTkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRWxlbWVudERpZmZUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0KLS8qKgotICogRGlzcGxheXMgdGhlIGVsZW1lbnQgZGlmZmVyZW5jZXMgaW4gYSB0cmVlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudERpZmZUcmVlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfU0FNRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUZGX1NUQVRFX05FVyA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUZGX1NUQVRFX0NIQU5HRUQgPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElGRl9TVEFURV9PTERfT05MWSA9IDU7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZTE7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZTI7Ci0KLQkvLyBUaGUgcGFyZW50IGluIHRoZSBiYXNlIGxpYnJhcnkgaWYgZTIgaXMgYSBuZXcgZWxlbWVudC4KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZTFfcGFyZW50OwotCi0JcHJpdmF0ZSBFbGVtZW50RGlmZlRyZWUgcGFyZW50ID0gbnVsbDsKLQotCS8vIERlZmluZSB0aGUgZGlmZiBzdGF0ZSBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgY29tcGFyZWQgdG8gdGhlIGZpcnN0IG9uZS4KLQlwcml2YXRlIGludCBkaWZmU3RhdGUgPSBESUZGX1NUQVRFX1NBTUU7Ci0KLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRGlydHlDaGlsZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlKE1ldGhvZEVsZW1lbnQgZTEsIE1ldGhvZEVsZW1lbnQgZTIpIHsKLQkJdGhpcyhlMSwgZTIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVsZW1lbnREaWZmVHJlZShNZXRob2RFbGVtZW50IGUxLCBNZXRob2RFbGVtZW50IGUyLAotCQkJTWV0aG9kRWxlbWVudCBlMV9wYXJlbnQpIHsKLQkJdGhpcy5lMV9wYXJlbnQgPSBlMV9wYXJlbnQ7Ci0JCXRoaXMuZTEgPSBlMTsKLQkJdGhpcy5lMiA9IGUyOwotCi0JCXJlc29sdmVEaWZmU3RhdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRCYXNlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGUxOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgbWV0aG9kIGVsZW1lbnQncyBwYXJlbnQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0QmFzZVBhcmVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlMV9wYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEltcG9ydEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlMjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZWxlbWVudCBpcyBuZXcgdG8gdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0JCXJldHVybiAoZTEgPT0gbnVsbCkgJiYgKGUyICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBlbGVtZW50IGV4aXN0cyBvbmx5IGluIHRoZSBsaWJyYXJ5IGFuZCBub3QgaW4gdGhlCi0JICogY29uZmlndXJhdGlvbiB0byBiZSBpbXBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09sZE9ubHkoKSB7Ci0JCXJldHVybiAoZTEgIT0gbnVsbCkgJiYgKGUyID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGJhc2UgYW5kIGltcG9ydCBlbGVtZW50cyBhcmUgbm90IG51bGwsIAotCSAqIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQm90aCgpIHsKLQkJcmV0dXJuIChlMSAhPSBudWxsKSAmJiAoZTIgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGNoaWxkIG5vZGUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoRWxlbWVudERpZmZUcmVlIGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNEaXJ0eUNoaWxkIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNEaXJ0eUNoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5oYXNEaXJ0eUNoaWxkOwotCX0KLQotCS8qKgotCSAqIFNldHMgaGFzRGlydHlDaGlsZCBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlydHlDaGlsZChib29sZWFuIGZsYWcpIHsKLQkJaGFzRGlydHlDaGlsZCA9IGhhc0RpcnR5Q2hpbGQgfHwgZmxhZzsKLQkJaWYgKGhhc0RpcnR5Q2hpbGQgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5zZXREaXJ0eUNoaWxkKGhhc0RpcnR5Q2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFBhcmVudChFbGVtZW50RGlmZlRyZWUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlpZiAoZGlmZlN0YXRlICE9IERJRkZfU1RBVEVfU0FNRSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LnNldERpcnR5Q2hpbGQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQuCi0JICovCi0JcHVibGljIEVsZW1lbnREaWZmVHJlZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBoYXNDaGlsZHJlbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLnNpemUoKSA+IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoaWxkIGxpc3QuCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaWZmIHN0YXRlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBjb21wYXJpbmcgdG8gdGhlIGZpcnN0IG9uZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldERpZmZTdGF0ZSgpIHsKLQkJcmV0dXJuIGRpZmZTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWVzc2FnZSBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaWZmTWVzc2FnZSgpIHsKLQkJcmV0dXJuICJbIiArIGdldFZlcnNpb24oZTEpICsgIl0gOiBbIiArIGdldFZlcnNpb24oZTIpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXByaXZhdGUgdm9pZCByZXNvbHZlRGlmZlN0YXRlKCkgewotCQkvLyBob3cgdG8gZmlkZCB0d28gZWxlbWVudHM/Ci0JCS8vIDEuIGF0dHJpYnV0ZXMKLQkJLy8gMi4gdmVyc2lvbiBudW1iZXIKLQkJLy8gMy4gY2hpbGRyZW4KLQkJLy8gNC4gcmVmZXJlbmNlcwotCQkvLyA1LiAuLi4KLQkJaWYgKGUxID09IG51bGwpIHsKLQkJCWRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfTkVXOwotCQl9IGVsc2UgaWYgKGUyID09IG51bGwpIHsKLQkJCWRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfT0xEX09OTFk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZTEgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9TQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlkaWZmU3RhdGUgPSBESUZGX1NUQVRFX0NIQU5HRUQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRWZXJzaW9uKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBnZXRQYWNrYWdlKGVsZW1lbnQpLmdldFZlcnNpb24oKTsKLQl9Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCBnZXRQYWNrYWdlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCkgewotCQkJcmV0dXJuIChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQpIGVsZW1lbnQ7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0UGFja2FnZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCkpOwotCX0KLQotCS8vIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgZWxlbWVudCBpbmZvcm1hdGlvbi4KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGUxICE9IG51bGwpIHsKLQkJCXJldHVybiBlMS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKGUyICE9IG51bGwpIHsKLQkJCXJldHVybiBlMi5nZXROYW1lKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlNZXRob2RFbGVtZW50IGUgPSBlMTsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJZSA9IGUyOwotCQl9Ci0KLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGUuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWJ1Z0R1bXAoKSB7Ci0JCWRlYnVnRHVtcCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlYnVnRHVtcChpbnQgbGV2ZWwsIFN0cmluZyBpbmRlbnQpIHsKLQkJU3RyaW5nIGxpbmUgPSBudWxsOwotCQlpZiAoZTEgPT0gbnVsbCkgewotCQkJbGluZSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJbGluZSA9IGUxLmdldEd1aWQoKSArICIsICIgKyBlMS5nZXROYW1lKCkgKyAiLCAiICsgZTEuZUNsYXNzKCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlvdXRMbihsZXZlbCwgaW5kZW50LCBsaW5lKTsKLQkJCi0JCWlmIChlMiA9PSBudWxsKSB7Ci0JCQlsaW5lID0gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlsaW5lID0gZTIuZ2V0R3VpZCgpICsgIiwgIiArIGUyLmdldE5hbWUoKSArICIsICIgKyBlMi5lQ2xhc3MoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCW91dExuKGxldmVsLCBpbmRlbnQsIGxpbmUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJRWxlbWVudERpZmZUcmVlIGNoaWxkID0gKEVsZW1lbnREaWZmVHJlZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJY2hpbGQuZGVidWdEdW1wKGxldmVsICsgMSwgaW5kZW50ICsgIiAgICIpOyAvLyROT04tTkxTLTEkCi0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3V0TG4oaW50IGxldmVsLCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgbGluZSkgewotCQlTdHJpbmcgc3RyID0gaW5kZW50ICsgbGV2ZWwgKyAiOiAiICsgbGluZTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRmlsZU1vZGlmeUNoZWNrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRmlsZU1vZGlmeUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5ODI4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0ZpbGVNb2RpZnlDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNoZWNrIGZpbGVzIGZvciBtb2RpZmljYXRpb25zCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZU1vZGlmeUNoZWNrZXIgewotCi0JLyoqCi0JICogQ2hlY2tzIG1vZGlmaWNhdGlvbiBzdGF0dXMgb2YgdGhlIGdpdmVuIGxpc3Qgb2YgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KExpc3QgbW9kaWZpZWRGaWxlcykgewotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1ttb2RpZmllZEZpbGVzLnNpemUoKV07Ci0JCQltb2RpZmllZEZpbGVzLnRvQXJyYXkocGF0aHMpOwotCQkJCi0JCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGZpbGVNZ3IuY2hlY2tNb2RpZnkocGF0aHMsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBhbGwgdGhlIGZpbGVzIGFyZSB1cGRhdGFibGUJCQkKLQkJCUxpc3QgcmVhZG9ubHlGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKysgKSB7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aHNbaV0pOwotCQkJCWlmICggZi5leGlzdHMoKSAmJiAhZi5jYW5Xcml0ZSgpICkgewotCQkJCQlyZWFkb25seUZpbGVzLmFkZChwYXRoc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIHJlYWRvbmx5RmlsZXMuc2l6ZSgpID4gMCApIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRSZXNvdXJjZXMuRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzLkZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c7IAotCQkJCWlmICggbmV3IE1zZ0RpYWxvZyhJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpKS5kaXNwbGF5UHJvbXB0KHRpdGxlLCBtc2cpICkgewotCQkJCQlyZXR1cm4gY2hlY2tNb2RpZnkocmVhZG9ubHlGaWxlcyk7Ci0JCQkJfQotCQkJfQkJCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZS5nZXRNZXNzYWdlKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIG1vZGlmaWNhdGlvbiBzdGF0dXMgb2YgdGhlIGdpdmVuIGxpc3Qgb2YgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN5bmNFeGVjQ2hlY2tNb2RpZnkoZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzKSB7Ci0JCWZpbmFsIElTdGF0dXNbXSByZXQgPSBuZXcgSVN0YXR1c1sxXTsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJldFswXSA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cnVucyB0aGUgbW9kaWZpZWQgZmlsZSBsaXN0IG9mIHRoZSBnaXZlbiByZXNvdXJjZSBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGlmaWVkRmlsZXMoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQkJcmV0LmFkZChyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeURpZmZNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlEaWZmTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQxNGFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeURpZmZNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG1ldGhvZCBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGFuZAotICogdGhvc2UgdGhhdCB3aWxsIGJlIGltcG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeURpZmZNYW5hZ2VyIHsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeTsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5OwotCi0JLy8gTWFwIG9mIHVpZCB0byBFbGVtZW50RGlmZlRyZWUsIHRoZSByb290IG9mIHRoZSBFbGVtZW50RGlmZlRyZWUgaXMgdGhlCi0JLy8gbGlicmFyeS4KLQlwcml2YXRlIE1hcCBkaWZmRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBNYXAgb2YgdWlkIHRvIGVsZW1lbnQgZm9yIGltcG9ydCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0JcHJpdmF0ZSBNYXAgaW1wb3J0RWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBpZCB0byBlbGVtZW50IG1hcCBvZiB0aGUgY3VycmVudCBsaWJyYXJ5LgotCXByaXZhdGUgTWFwIGN1cnJlbnRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIFRoZSBkaWZmIHRyZWUuCi0JRWxlbWVudERpZmZUcmVlIHJvb3REaWZmVHJlZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RGlmZk1hbmFnZXIoTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSwKLQkJCU1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQl0aGlzLmJhc2VMaWJyYXJ5ID0gYmFzZUxpYnJhcnk7Ci0JCXRoaXMuaW1wb3J0TGlicmF0eSA9IGltcG9ydExpYnJhdHk7Ci0KLQkJcm9vdERpZmZUcmVlID0gbmV3IEVsZW1lbnREaWZmVHJlZShiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0SW1wb3J0aW5nTGlicmFyeSgpIHsKLQkJcmV0dXJuIHRoaXMuaW1wb3J0TGlicmF0eTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgdGhlIGRpZmZlcmVuY2UgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGJ1aWxkRGlmZlRyZWUoKSB7Ci0JCS8vIEJ1aWxkIHRoZSB1aWQgdG8gZWxlbWVudCBtYXAgZm9yIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkJYnVpbGRVSURNYXAoaW1wb3J0TGlicmF0eS5lQ29udGVudHMoKSwgaW1wb3J0RWxlbWVudE1hcCwgdHJ1ZSwgZmFsc2UpOwotCi0JCWJ1aWxkVUlETWFwKGJhc2VMaWJyYXJ5LmVDb250ZW50cygpLCBjdXJyZW50RWxlbWVudE1hcCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJLy8gR2V0IGFsbCB0aGUgc3lzdGVtIHBhY2thZ2VzIGluIGVhY2ggcGx1Zy1pbiBzbyB3ZSBjYW4gZmlsdGVyIG91dAotCQkvLyB0aG9zZSBwYWNrYWdlcyB3aGVuIGNvbXBhcmluZyB0aGUgbGlicmFyaWVzLgotCi0JCS8vIEl0ZXJhdGUgdGhlIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSwgYW5kIGJ1aWxkIGEgZGlmZiB0cmVlIGJ5Ci0JCS8vIGNvbXBhcmluZyB0byB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JCUxpc3QgcGx1Z2lucyA9IGJhc2VMaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCUxpc3Qgc3lzdGVtUGFja2FnZXMgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0JCQkKLQkJCS8vIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGRpZmYgdHJlZSAKLQkJCS8vIG90aGVyd2lzZSB0aGUgY2F0ZWdvcnkgaW5mb3JtYXRpb24gd2lsbCBiZSBsb3N0Ci0JCQlMaXN0IGNhdGVnb3J5TGlzdCA9IFRuZ1V0aWwuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZXMocGx1Z2luKTsKLQkJCWZvciAoIEl0ZXJhdG9yIGl0YyA9IGNhdGVnb3J5TGlzdC5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOyApIHsKLQkJCQlPYmplY3QgbyA9IGl0Yy5uZXh0KCk7Ci0JCQkJaWYgKCBzeXN0ZW1QYWNrYWdlcy5jb250YWlucyhvKSApIHsKLQkJCQkJc3lzdGVtUGFja2FnZXMucmVtb3ZlKG8pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gdGhlIHJvb3QgY3VzdG9tY2F0ZWdvdHkgcGFja2FnZSBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbnRvIHRoZSBkaWZmIHRyZWUKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgc3lzdGVtUGFja2FnZXMuc2l6ZSgpICkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2Upc3lzdGVtUGFja2FnZXMuZ2V0KGkpOwotCQkJCWlmICggVG5nVXRpbC5pc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZShwa2cpICkgewotCQkJCQlzeXN0ZW1QYWNrYWdlcy5yZW1vdmUocGtnKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gQnVpbGQgdGhlIGRpZmYgdHJlZSBieSBpdGVyYXRpbmcgdGhlIGN1cnJlbnQgbGlicmFyeS4KLQkJCWl0ZXJhdGVFbGVtZW50KHBsdWdpbiwgcm9vdERpZmZUcmVlLCBzeXN0ZW1QYWNrYWdlcyk7Ci0JCX0KLQotCQlMaXN0IGNvbmZpZ3MgPSBiYXNlTGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCi0JCQkvLyBCdWlsZCB0aGUgZGlmZiB0cmVlIGJ5IGl0ZXJhdGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQkJaXRlcmF0ZUVsZW1lbnQoY29uZmlnLCByb290RGlmZlRyZWUsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCX0KLQotCQkvLyBQcm9jZXNzIHRoZSBuZXcgZWxlbWVudHMgaW4gdGhlIGltcG9ydCBsaWJyYXJ5IGFuZCBhZGQgdGhlbSB0byB0aGUKLQkJLy8gZGlmZiB0cmVlLgotCQloYW5kbGVOZXdFbGVtZW50cyhpbXBvcnRMaWJyYXR5KTsKLQotCQlyZXR1cm4gcm9vdERpZmZUcmVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmZlcm5lY2UgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldERpZmZUcmVlKCkgewotCQlyZXR1cm4gcm9vdERpZmZUcmVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmZlcm5lY2UgbWFwLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RGlmZlRyZWVNYXAoKSB7Ci0JCXJldHVybiBkaWZmRWxlbWVudE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlcyB0aGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGFuZCBidWlsZCBhIGRpZmYgdHJlZSBieQotCSAqIGNvbXBhcmluZyB0byB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmVHJlZSwgTGlzdCBzeXN0ZW1QYWNrYWdlcykgewotCQlpZiAoIXNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgZGlmZmVsZW1lbnQgVUlEIG1hcC4KLQkJaWYgKCFzeXN0ZW1QYWNrYWdlcy5jb250YWlucyhlbGVtZW50KQotCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlTdHJpbmcgdWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQlFbGVtZW50RGlmZlRyZWUgZGlmZkNoaWxkID0gbmV3IEVsZW1lbnREaWZmVHJlZShlbGVtZW50LAotCQkJCQkoTWV0aG9kRWxlbWVudCkgaW1wb3J0RWxlbWVudE1hcC5nZXQodWlkKSk7Ci0JCQlkaWZmRWxlbWVudE1hcC5wdXQodWlkLCBkaWZmQ2hpbGQpOwotCQkJZGlmZlRyZWUuYWRkQ2hpbGQoZGlmZkNoaWxkKTsKLQkJCWRpZmZUcmVlID0gZGlmZkNoaWxkOwotCQl9Ci0KLQkJLy8gQ2hlY2sgd2l0aCB0aGUgaW1wb3J0aW5nIGVsZW1lbnQgYW5kIGNyZWF0ZSBhbiBFbGVtZW50RGlmZkluZm8gb2JqZWN0Ci0JCUVMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgY2hpbGQgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQkJaWYgKHNlbGVjdGFibGUoY2hpbGQpKSB7Ci0JCQkJCQlpdGVyYXRlRWxlbWVudChjaGlsZCwgZGlmZlRyZWUsIHN5c3RlbVBhY2thZ2VzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkVycm9yISAiICsgZSArICIgaXMgbm90IGEgTWV0aG9kRWxlbWVudCBvYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgbmV3bHkgYWRkZWQgZWxlbWVudHMgaW4gdGhlIGltcG9ydGluZyBsaWJyYXJ5LCBhZGQgdGhlIG5ldwotCSAqIGVsZW1lbnRzIGludG8gdGhlIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXdFbGVtZW50cyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFzZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaXNOZXdFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQkvLyBUaGlzIGlzIGEgbmV3IGVsZW1lbnQsIGZpbmQgdGhlIHBhcmVudCBpbiB0aGUgYmFzZSBsaWJyYXJ5LgotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQl3aGlsZSAoaXNOZXdFbGVtZW50KHBhcmVudCkpIHsKLQkJCQllbGVtZW50ID0gcGFyZW50OwotCQkJCXBhcmVudCA9IChNZXRob2RFbGVtZW50KSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQkvLyBBbHdheXMgbWVyZ2UgbGlicmF5IHBsdWdpbnMgZXZlbiBpdCdzIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeS4KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcGFyZW50ID0gYmFzZUxpYnJhcnk7Ci0JCQl9Ci0KLQkJCS8vIE5lZWQgdG8gZmluZCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSBzbyB0aGF0IHdlCi0JCQkvLyBrbm93IHdoZXJlIHRvIGFkZCB0aGUgbmV3IGVsZW1lbnQuCi0JCQlNZXRob2RFbGVtZW50IGxpYl9wYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgY3VycmVudEVsZW1lbnRNYXAKLQkJCQkJLmdldChwYXJlbnQuZ2V0R3VpZCgpKTsKLQkJCWlmIChsaWJfcGFyZW50ID09IG51bGwpIHsKLQkJCQlsaWJfcGFyZW50ID0gYmFzZUxpYnJhcnk7Ci0JCQl9Ci0JCQlFbGVtZW50RGlmZlRyZWUgZWxlbWVudERpZmZUcmVlID0gbmV3IEVsZW1lbnREaWZmVHJlZShudWxsLAotCQkJCQllbGVtZW50LCBsaWJfcGFyZW50KTsKLQotCQkJLy8gRmluZCB0aGUgcGFyZW50IGRpZmYgdHJlZS4KLQkJCUVsZW1lbnREaWZmVHJlZSBwYXJlbnREaWZmVHJlZSA9IG51bGw7Ci0JCQl3aGlsZSAoKHBhcmVudERpZmZUcmVlID09IG51bGwpICYmIChwYXJlbnQgIT0gbnVsbCkpIHsKLQkJCQlwYXJlbnREaWZmVHJlZSA9IChFbGVtZW50RGlmZlRyZWUpIGRpZmZFbGVtZW50TWFwLmdldChwYXJlbnQKLQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCXBhcmVudCA9IChNZXRob2RFbGVtZW50KSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQlpZiAocGFyZW50RGlmZlRyZWUgPT0gbnVsbCkgewotCQkJCXBhcmVudERpZmZUcmVlID0gcm9vdERpZmZUcmVlOwotCQkJfQotCi0JCQlwYXJlbnREaWZmVHJlZS5hZGRDaGlsZChlbGVtZW50RGlmZlRyZWUpOwotCQl9IGVsc2UgewotCQkJLy8gSXRlcmF0ZSB0aGUgY2hpbGRyZW4uCi0JCQlMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRjID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRjLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqOyAKLQkJCQkJaGFuZGxlTmV3RWxlbWVudHMoZSk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFjdXJyZW50RWxlbWVudE1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVUlETWFwKExpc3QgZWxlbWVudHMsIE1hcCBlbGVtZW50VUlETWFwLCBib29sZWFuIHJlY3Vyc2l2ZSwgYm9vbGVhbiBmdWxsKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCWlmIChzZWxlY3RhYmxlKGVsZW1lbnQpIHx8IGZ1bGwpIHsKLQkJCQkJU3RyaW5nIHVpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCQllbGVtZW50VUlETWFwLnB1dCh1aWQsIGVsZW1lbnQpOwotCi0JCQkJCWlmIChyZWN1cnNpdmUpIHsKLQkJCQkJCWJ1aWxkVUlETWFwKGVsZW1lbnQuZUNvbnRlbnRzKCksIGVsZW1lbnRVSURNYXAsCi0JCQkJCQkJCXJlY3Vyc2l2ZSwgZnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCAhKGUgaW5zdGFuY2VvZiBQb2ludCB8fCBlIGluc3RhbmNlb2YgRGltZW5zaW9uIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50UHJvcGVydHkpICl7Ci0JCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkiSW1wb3J0IGVycm9yLiAiICsgZSArICIgaXMgbm90IGEgTWV0aG9kRWxlbWVudCBvYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RhYmxlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50IGdpdmVuIGJ5IHRoZSBndWlkLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEV4aXN0aW5nRWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpY3VycmVudEVsZW1lbnRNYXAuZ2V0KGd1aWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjk2MmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeUltcG9ydE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5EaWFncmFtSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbXBvcnRpbmcgb2YgYSBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUltcG9ydE1hbmFnZXIgewotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlbmFtZVBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwIHJlbmFtZUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIHNldEVsZW1lbnRNYXAgPSBudWxsOwotCi0JcHJpdmF0ZSBMaWJyYXJ5RGlmZk1hbmFnZXIgZGlmZk1ncjsKLQlwcml2YXRlIEVsZW1lbnREaWZmVHJlZSByb290VHJlZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY29uZmlnRm9sZGVyRXJyb3IgPSBmYWxzZTsKLQotCS8vcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gbnVsbDsKLQotCS8vcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFmY3AgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5ID0gbnVsbDsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgaW1wb3J0aW5nTGlicmFyeSA9IG51bGw7Ci0KLQkvLyBndWlkIG9mIHJlcGxhY2VkIGVsZW1lbnQgaWQgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIGJhc2UgbGlicmFyeQotCS8vIHdlIG5lZWQgdGhpcyB0byByZWRpcmVjdCB0aGUgcmVmZXJlbmNlIG9mIG5ldyBlbGVtZW50cyBmcm9tIHRoZSBpbXBvcnRpbmcKLQkvLyBsaWJyYXR5IHRvIHRoZSBiYXNlIGxpYnJhcnkKLQlwcml2YXRlIE1hcCByZXBsYWNlZEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8ga2VlcCB0aGUgbmV3IGVsZW1lbnRzLCB3ZSBuZWVkIHRvIGl0ZXJhdGUgdGhlaXIgZmVhdHVyZSB2YWx1ZSBhbmQKLQkvLyByZWRpcmVjdCB0aGUgdmFsZXUgZWxlbWVudAotCS8vIGZyb20gdGhlIGltcG9ydGluZyBsaWJyYXJ5IHRvIHRoZSBiYXNlIGxpYnJhcnkKLQlwcml2YXRlIExpc3QgbmV3RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCS8vIGRlbGV0ZWQgZWxlbWVudHMsCi0JcHJpdmF0ZSBMaXN0IGRlbGV0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JLy8gbGlzdCBvZiB1c2VyIHNlbGVjdGVkIGl0ZW1zIHRvIGJlIGltcG9ydGVkCi0JTGlzdCBjaGVja2VkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvLyBmbGFnIHRvIGluZGljYXRlIHRoZSBmaWxlIGNoZW91dCBzdGF0dXMKLQlJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gbnVsbDsKLQkKLQkvLyByZXNvdXJjZSBmaWxlIHBhdGggZm9yIG5ldyByZXNvcnVjZXMKLQlMaXN0IG5ld1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlSZXNvdXJjZVNjYW5uZXIgcmVzU2Nhbm5lcjsKLQkKLQlwcml2YXRlIERpYWdyYW1IYW5kbGVyIGRpYWdyYW1IYW5kbGVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlJbXBvcnRNYW5hZ2VyKExpYnJhcnlEaWZmTWFuYWdlciBkaWZmTWdyLAotCQkJTGlzdCBjaGVja2VkSXRlbXMpIHsKLQkJdGhpcy5kaWZmTWdyID0gZGlmZk1ncjsKLQkJdGhpcy5yb290VHJlZSA9IGRpZmZNZ3IuZ2V0RGlmZlRyZWUoKTsKLQkJCi0JCWlmICggY2hlY2tlZEl0ZW1zICE9IG51bGwgKSB7Ci0JCQkvLyBjaGVja2VkTGlzdCBjb250YWlucyBhIGxpc3Qgb2YgRWxlbWVudERpZmZUcmVlIG9iamVjdHMKLQkJCS8vIGdldCB0aGUgcGFja2FnZXMgYXMgd2VsbAotCQkJdGhpcy5jaGVja2VkTGlzdC5hZGRBbGwoY2hlY2tlZEl0ZW1zKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGVja2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUgPSAoRWxlbWVudERpZmZUcmVlKSBpdC5uZXh0KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsKLQkJCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCQkJY2hlY2tlZExpc3QuYWRkKGUpOwotCQkJCX0KLQkJCQkJCQkJCi0JCQkJaWYgKCBlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCApIHsKLQkJCQkJTGlicmFyeVV0aWwuZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSllLCBjaGVja2VkTGlzdCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGFsc28gaW5jbGR1ZSB0aGUgaGlkZGVuIHJvb3QgY3VzdG9tIHBhY2thZ2UgaWYgdGhlIHBhY2thZ2UgaXMgdGhlIEN1c3RvbUNhdGVnb3JpZXMgcGFja2FnZQotCQkJCS8vIDE1MDg5NSAtIEltcG9ydCBDb25maWc6IEN1c3RvbUNhdGVnb3J5IGRpZCBub3Qgc3luYyB1cCBieSBpbXBvcnQKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlICkgewotCQkJCQlMaXN0IGNoaWxkcmVuID0gKChNZXRob2RQYWNrYWdlKWUpLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCQkJaWYgKCBjaGlsZHJlbi5zaXplKCkgPT0gMSApIHsKLQkJCQkJCU1ldGhvZFBhY2thZ2UgcGtnICA9IChNZXRob2RQYWNrYWdlKWNoaWxkcmVuLmdldCgwKTsKLQkJCQkJCWlmICggVG5nVXRpbC5pc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZShwa2cpICkgewotCQkJCQkJCWNoZWNrZWRMaXN0LmFkZChwa2cpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWUgPSBkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0JCQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQkJCWNoZWNrZWRMaXN0LmFkZChlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCBlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCApIHsKLQkJCQkJTGlicmFyeVV0aWwuZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSllLCBjaGVja2VkTGlzdCk7Ci0JCQkJfQotCi0JCQkJCi0JCQkJLy8gZm9yIG5ldyBpdGVtLCBhZGQgYWxsIHRoZSBzdWIgcGFja2FnZXMKLQkJCQlpZiAoIGRpZmZUcmVlLmlzTmV3KCkgKSB7Ci0JCQkJCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiApIHsKLQkJCQkJCWNoZWNrZWRMaXN0LmFkZEFsbChMaWJyYXJ5VXRpbC5nZXRBbGxQYWNrYWdlcygoTWV0aG9kUGx1Z2luKWUpKTsKLQkJCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgKSB7Ci0JCQkJCQlMaWJyYXJ5VXRpbC5nZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKWUsIGNoZWNrZWRMaXN0KTsKLQkJCQkJfSAKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRMaXN0ID0gbnVsbDsKLQkJfQotCQkKLQkJCi0JCWluaXQoKTsKLQotCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlicmFyeS4KLQkJYmFzZUxpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgdGhpcy5yb290VHJlZS5nZXRCYXNlRWxlbWVudCgpOwotCQlpbXBvcnRpbmdMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIHRoaXMucm9vdFRyZWUKLQkJCQkuZ2V0SW1wb3J0RWxlbWVudCgpOwotCi0JCS8vIGNyZWF0ZSB0aGUgcmVzb3VyY2Ugc2Nhbm5lcgotCQlyZXNTY2FubmVyID0gbmV3IFJlc291cmNlU2Nhbm5lcigKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoaW1wb3J0aW5nTGlicmFyeSksIAotCQkJCUxpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChiYXNlTGlicmFyeSksIHJlbmFtZVBsdWdpbk1hcCk7Ci0JCQkKLQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIoCi0JCQkJTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGltcG9ydGluZ0xpYnJhcnkpLCAKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoYmFzZUxpYnJhcnkpKSB7CQkJCQotCQkJLy9bMF06IHNvdXJjZUZpbGUKLQkJCS8vWzFdOiB0YXJnZXRGaWxlCi0JCQlwcm90ZWN0ZWQgRmlsZVtdIGdldEZpbGVzKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEZpbGVzKGVsZW0sIGZhbHNlKTsKLQkJCX0KLQkJCQotCQl9OwotCQkKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotLy8JCS8vIFNldCB0aGUgdHJlZSBjb250ZW50LgotLy8JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotLy8KLS8vCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCi0vLwkJCQlmYWN0b3JpZXMpOwotLy8JCWFmY3AgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotLy8KLS8vCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLS8vCi0vLwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgotLy8JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LAotLy8JCQkJY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcCgpKTsKLS8vCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2VsZWN0ZWQoRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlKSB7Ci0JCWlmICggY2hlY2tlZExpc3QgPT0gbnVsbCB8fCBjaGVja2VkTGlzdC5jb250YWlucyhkaWZmVHJlZSkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJTWV0aG9kRWxlbWVudCBlID0gZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsJCQotCQlpZiAoIGUgPT0gbnVsbCApIHsKLQkJCWUgPSBkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc1NlbGVjdGVkKGUpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxlY3RlZChNZXRob2RFbGVtZW50IGUpIHsKLQkJCi0JCWlmICggY2hlY2tlZExpc3QgPT0gbnVsbCB8fCAKLQkJCQllIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IAotCQkJCWUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IAotCQkJCWUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmICggY2hlY2tlZExpc3Quc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0JCQlyZXR1cm4gY2hlY2tlZExpc3QuY29udGFpbnMoZSk7Ci0JCX0KLQkJCi0JCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KUxpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZSk7Ci0JCWlmICggbyA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IAotCQkKLQkJaWYgKCBvIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gY2hlY2tlZExpc3QuY29udGFpbnMobyk7Ci0JfQotCQotCS8qKgotCSAqIERvZXMgbWVyZ2UgZnJvbSB0aGUgaW1wb3J0IGxpYnJhcnkgaW50byB0aGUgYmFzZSBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRvTWVyZ2UoYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZ0ZvbGRlckVycm9yID0gZmFsc2U7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNZXJnaW5nIGNvbmZpZ3VyYXRpb24gLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkJCi0JCS8vIFNhdmUgdGhlIGxpYnJhcnkgcGF0aCBiZWZvcmUgZGV0YWNoaW5nIHRoZSByZXNvdXJjZS4KLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2FkaW5nIGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJTGlzdCB1bmxvY2tlZFBsdWdpbnMgPSB1bmxvY2tQbHVnaW5zKCk7Ci0JCWlmICghIHVubG9ja2VkUGx1Z2lucy5pc0VtcHR5KCkgJiYgKGZpbGVDaGVja2VkT3V0U3RhdHVzICE9IG51bGwpCi0JCQkJJiYgIWZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJLy8gbG9nIGVycm9yCi0JCQlmaWxlQ2hlY2tPdXRFcnJvcigpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlicmFyeVV0aWwubG9hZEFsbChiYXNlTGlicmFyeSk7Ci0JCUxpYnJhcnlVdGlsLmxvYWRBbGwoaW1wb3J0aW5nTGlicmFyeSk7Ci0KLQkJLy8gRGV0YWNoIHRoZSBuZXcgbGlicmFyeSBmcm9tIHRoZSBjdXJyZW50IHJlc291cmNlIHNvIGl0IGNhbiBiZQotCQkvLyBhZGRlZCB0byBhIG5ldyBMaWJyYXJ5IFByb2Nlc3NvciBpbnN0YW5jZS4KLQkJTGlicmFyeVV0aWwuZGV0YWNoRnJvbVJlc291cmNlKGltcG9ydGluZ0xpYnJhcnkpOwotCi0JCS8vIGZvciB0ZXN0Ci0JCWltcG9ydGluZ0xpYnJhcnkuc2V0TmFtZSgiSW1wb3J0aW5nTGliOiAiICsgaW1wb3J0aW5nTGlicmFyeS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzIGNvbmZpZ3VyYXRpb24gZGlmZiB0cmVlIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBiZWZvcmUgcHJvY2Vzc2luZywgc2F2ZSB0aGUgb3JpZ2luYWwgcmVzb3VyY2VzIAotCQkvLyBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZSBuZXdseSBhZGRlZCByZXNvdXJjZXMKLQkJTGlzdCBvbGRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KAotCQkJCWJhc2VMaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOwotCQkKLQkJLy8gSXRlcmF0ZSBlYWNoIGVsZW1lbnQgYW5kIHRoZSBuZWNlc3NhcnkgbWVyZ2VzLgotCQlwcm9jZXNzRGlmZlRyZWUocm9vdFRyZWUsIHJlcGxhY2VFeGlzdGluZyk7Ci0KLQkJaGFuZGxlU2V0RWxlbWVudHMoKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInBlcmZvcm0gaW50ZWdyaXR5IGNoZWNraW5nIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBwZXJmb3JtIGFuIGludGVncml0eSBjaGVjayBvZiB0aGUgbGlicmFyeQotCQkvLyBmaXggYW55IGRhbmZsaW5nIGVsZW1lbnRzIGR1ZSB0byBwYWNrYWdlL2VsZW1lbnQgcmVwbGFjZW1lbnQKLQkJZG9JbnRlZ3JpdHlDaGVjaygpOwotCi0JCS8vIG5vdyBwcm9jZXNzIHRoZSBuZXcgcmVzb3VyY2VzIGFuZCBtYXJrIHRoZW0gZGlyc3Qgc28gdGhhdCAKLQkJLy8gdGhlIGRhdGEgd2lsbCBiZSBzYXZlZCBhZ2Fpbi4gCi0JCS8vIFRoaXMgc3RlcCBpcyBjcml0aWNhbCBzaW5jZSB0aGUgZmlyc3Qgcm91bmQgb25seSBjcmVhdGVkIHRoZSBkYXRhIHN0cnVjdHVyZQotCQkvLyBzb21lIG9mIHRoZSBjcm9zcy1yZWZlcmVuY2VkIGVsZW1lbnRzIG1pZ2h0IGJlIGxvc3Qgb24gdGhlIGZpcnN0IHNhdmluZwotCQkvLyBmb3IgZXhhbXBsZSwgd2hlbiBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiB3aXRoIHJlZmVyZW5jZXMgdG8gYSBuZXcgcGx1Z2luLAotCQkvLyB3aGljaCBhcmUgbm90IHNhdmVkIHlldCwgdGhvc2UgcmVmZXJlbmNlcyB3aWxsIGJlIGxvc3QuCi0JCS8vIDE0NTg5MSAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBkZWZhdWx0IGNvbmZpZyBpcyBsb3NzIGFmdGVyIGltcG9ydAotCQloYW5kbGVOZXdSZXNvdXJjZXMob2xkUmVzb3VyY2VzKTsKLQkJCi0JCWhhbmRsZU5hbWVSZXBsYWNlKHJlbmFtZUVsZW1lbnRNYXApOwotCQkKLQkJZGlhZ3JhbUhhbmRsZXIucG9zdFJlZ2lzdGVyRWxlbWVudHMoKTsKLQkJCi0JCS8vIGdldCBhbGwgdGhlIG1vZGlmaWVkIHJlc291cmNlcyBhbmQgcmVzb3VyY2UgZmlsZXMKLQkJLy8gY2hlY2sgQ00gZm9yIGZpbGUgY2hlY2stb3V0Ci0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNrIG91dCBmaWxlcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkvLyBjbGVhciByZXNvdXJjZXMgZm9yIGRlbGV0ZWQgZWxlbWVudHMKLQkJZGVsZXRlUmVzb3J1Y2VzKCk7Ci0JCi0JCWNoZWNrTW9kaWZpZWRGaWxlcygpOwotCQkJCQotCQlpZiAoIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSApIHsKLQkJIAotCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvcHlpbmcgcmVzb3VyY2UgZmlsZXMgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJlc1NjYW5uZXIuZXhlY3V0ZSgpOwotCQkJZGlhZ3JhbUhhbmRsZXIuZXhlY3V0ZSgpOwotCi0JCQlpZiAoIGRlYnVnICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJaWYgKCEgY29uZmlnRm9sZGVyRXJyb3IpIHsKLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQkJbG9ja1VubG9ja2VkUGx1Z2lucyh1bmxvY2tlZFBsdWdpbnMpOwotCQkJCX0KLQkJCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShiYXNlTGlicmFyeSwgZmFsc2UsIGZhbHNlKTsKLQkJCX0KLQkJfSAKLQkJZWxzZSB7Ci0JCQlmaWxlQ2hlY2tPdXRFcnJvcigpOwotCQl9CQotLy8gaWYgKCBkZWJ1ZyApIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29weWluZyByZXNvdXJjZSBmaWxlcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotLy8gfQotLy8KLS8vIC8vIENvcHkgdGhlIHJlc291cmNlIGZpbGVzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIG5ldyBsaWJyYXJ5LgotLy8gLy8gRm9yIHNpbXBsaWNpdHkgc2FrZSwgY29weSBhbGwgcmVzb3VyY2UgZmlsZXMgaWYgdGhlIGZpbGVzIGRvIG5vdAotLy8gLy8gZXhpc3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5IG9yIGlmIHRoZSBmaWxlcyBhcmUgbmV3ZXIuCi0vLyBTdHJpbmcgaW5jbHVkZXMgPSAicmVzb3VyY2VzLyoqLCAqKi9yZXNvdXJjZXMvKioiOyAvLyROT04tTkxTLTEkCi0vLwotLy8gTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc3JjRGlyLCBkZXN0RGlyLCBpbmNsdWRlcywgbnVsbCk7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWVyZ2luZyBjb25maWd1cmF0aW9uIGRvbmUuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGVDaGVja091dEVycm9yKCkgewotCQkvLyBsb2cgZXJyb3IKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb247IAotCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCBmaWxlQ2hlY2tlZE91dFN0YXR1cyk7Ci0JCQkJfQotCQl9KTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDaGVja291dCBmaWxlcyBmYWlsZWQgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5ld1Jlc291cmNlcyhMaXN0IG9sZFJlc291cmNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYmFzZUxpYnJhcnkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKWl0Lm5leHQoKTsKLQkJCWlmICggIW9sZFJlc291cmNlcy5jb250YWlucyhyZXMpICkgewotCQkJCWxvZ05ld1Jlc291cmNlKHJlcyk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgZGlmZiB0cmVlLiBPbmx5IG5lZWQgdG8gZG8gdGhlIGZpcnN0IGxldmVsIHNpbmNlIHRoZQotCSAqIHJlcGxhY2Ugb3IgYWRkIGlzIGRvbmUgYXQgdGhlIG1ldGhvZCBwYWNrYWdlIGxldmVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGlmZlRyZWUoRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlLAotCQkJYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGlmZlRyZWUgPT0gbnVsbCB8fCAhaXNTZWxlY3RlZChkaWZmVHJlZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGVyZSBpcyBhIGNoYW5nZS4KLQkJaW50IHN0YXRlID0gZGlmZlRyZWUuZ2V0RGlmZlN0YXRlKCk7Ci0JCU1ldGhvZEVsZW1lbnQgYmFzZSA9IGRpZmZUcmVlLmdldEJhc2VFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgaW1wID0gZGlmZlRyZWUuZ2V0SW1wb3J0RWxlbWVudCgpOwotCQlpZiAocmVwbGFjZUV4aXN0aW5nICYmIChzdGF0ZSA9PSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9DSEFOR0VEKSApIHsKLQotCQkJaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGUgY29uZmlndXJhdGlvbiBieSBhZGRpbmcgdGhlIG5ldyBwYWNrYWdlcyBpbnRvIHRoZQotCQkJCS8vIGNvbmZpZ3VyYXRpb24KLQkJCQlkb1JlcGxhY2VDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBiYXNlLCAoTWV0aG9kQ29uZmlndXJhdGlvbikgaW1wKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCQkvLyBSZXBsYWNlIHRoZSBwbHVnaW4gd2l0aCB0aGUgbm9uLXBhY2thZ2UgZmVhdHVyZXMuCi0JCQkJZG9SZXBsYWNlUGx1Z2luKChNZXRob2RQbHVnaW4pIGJhc2UsIChNZXRob2RQbHVnaW4pIGltcCk7Ci0JCQl9Ci0JCQllbHNlIGlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJCS8vIFJlcGxhY2UgdGhlIHBhY2thZ2UuCi0JCQkJZG9SZXBsYWNlUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgYmFzZSwgKE1ldGhvZFBhY2thZ2UpIGltcCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGRlYnVnICkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldoYXQgaXMgdGhpczogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGJhc2UpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9ORVcpIHsKLQkJCS8vIEFkZCB0aGUgbmV3IHBhY2thZ2UgZnJvbSBpbXBvcnQgbGlicmFyeS4KLQkJCWRvQWRkKGRpZmZUcmVlLmdldEJhc2VQYXJlbnRFbGVtZW50KCksIGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKSk7IAotCQl9Ci0KLQkJLy8gUHJvY2VzcyB0aGUgY2hpbGRyZW4gcmVjdXJzaXZlbHkgaWYgaXQncyBub3QgYSBuZXcgb25lLgotCQlpZiAoc3RhdGUgIT0gRWxlbWVudERpZmZUcmVlLkRJRkZfU1RBVEVfTkVXKSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gZGlmZlRyZWUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlwcm9jZXNzRGlmZlRyZWUoKEVsZW1lbnREaWZmVHJlZSkgaXQubmV4dCgpLAotCQkJCQkJCXJlcGxhY2VFeGlzdGluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGJ5IHJlcGxhY2luZyB0aGUgbm9uLXBhY2thZ2UgZmVhdHVyZXMsIGFuZAotCSAqIGFkZGluZyB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2xkT2JqLCBNZXRob2RDb25maWd1cmF0aW9uIG5ld09iaikKLQl7Ci0JCWlmICggaXNSZXBsYWNlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0JCQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG9sZE9iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCS8vIGRvbid0IGRlbGV0ZSBvbGQgZmVhdHVyZSB2YWx1ZXMKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0vLyBwcml2YXRlIHZvaWQgbWVyZ2VFbGVtZW50TGlzdChMaXN0IHNvdXJjZSwgTGlzdCB0YXJnZXQpCi0vLyB7Ci0vLyBMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vIGZvciAoIEl0ZXJhdG9yIGl0ID0gdGFyZ2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotLy8gewotLy8gTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8gaWRzLmFkZChlLmdldEd1aWQoKSk7Ci0vLyB9Ci0vLwotLy8gZm9yICggSXRlcmF0b3IgaXQgPSBzb3VyY2UuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0vLyB7Ci0vLyBNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0vLyBpZiAoICFpZHMuY29udGFpbnMoZS5nZXRHdWlkKCkpICkKLS8vIHsKLS8vIHRhcmdldC5hZGQoZSk7Ci0vLyB9Ci0vLyB9Ci0vLyB9Ci0KLQkvKioKLQkgKiByZXBsYWNlIHRoZSBwbHVnaW4gZmVhdHVyZXMsIGJ1dCBub3QgdGhlIHBsdWdpbiBvYmplY3QgYW5kIGl0J3MgcGFja2FnZXMKLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9SZXBsYWNlUGx1Z2luKE1ldGhvZFBsdWdpbiBvbGRPYmosIE1ldGhvZFBsdWdpbiBuZXdPYmopIHsKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQkJCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMob2xkT2JqKTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQkJaWYgKCBmZWF0dXJlICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpICkKLQkJCQl7Ci0JCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCS8qIE5vLCBkb24ndCBkbyB0aGlzLCBmaXggdGhlIGRpZmYgbWFuYWdlciB0byBpbmNsdWRlIHRoZSByb290IHBhY2thZ2UgaW5zdGVhZAotCQkJCSAqIDE1MDg5NSAtIEltcG9ydCBDb25maWc6IEN1c3RvbUNhdGVnb3J5IGRpZCBub3Qgc3luYyB1cCBieSBpbXBvcnQKLQkJCQllbHNlIHsKLQkJCQkJLy8gY3VzdG9tIGNhdGVnb3JpZXMgcGFja2FnZSBuZWVkcyBzcGVjaWFsIGhhbmRpbmcKLQkJCQkJLy8gd2UgbmVlZCB0byBzdGFydCB3aXRoIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeSBvdGhlcndpc2UKLQkJCQkJLy8gYWxsIGNoaWxkIGNhdGVnb3JpZXMgd2lsbCBiZSBsb3N0Ci0JCQkJCU1ldGhvZFBhY2thZ2Ugb2xkUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2Uob2xkT2JqLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIKTsKLS8vIENvbnRlbnRQYWNrYWdlIG5ld1BrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKG5ld09iaiwKLS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCk7Ci0JCQkJCXNldFJlcGxhY2VkKG9sZFBrZyk7Ci0JCQkJCQotCQkJCQkvLyBmaW5kIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeSBhbmQgc3RhcnQgZnJvbSB0aGVyZQotCQkJCQlDdXN0b21DYXRlZ29yeSBvbGRDQyA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KG9sZE9iaik7Ci0JCQkJCUN1c3RvbUNhdGVnb3J5IG5ld0NDID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkobmV3T2JqKTsKLQkJCQkJb2xkUGtnID0gKE1ldGhvZFBhY2thZ2Upb2xkQ0MuZUNvbnRhaW5lcigpOwotCQkJCQlzZXRSZXBsYWNlZChvbGRQa2cpOwotCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZENDLCBuZXdDQyk7Ci0JCQkJfQotCQkJCSovCi0JCQl9Ci0JCX0KLQotCX0KLQotCi0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgYXRycmlidXRlcyBhbmQgY29udGFpbmVkIGVsZW1lbnRzLCBidXQgbm90IHRoZSBjaGlsZAotCSAqIHBhY2thZ2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZVBhY2thZ2UoTWV0aG9kUGFja2FnZSBvbGRPYmosIE1ldGhvZFBhY2thZ2UgbmV3T2JqKSB7Ci0JCWlmICggaXNSZXBsYWNlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGFjaW5nIHBhY2thZ2UgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG9sZE9iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJCi0JCWJvb2xlYW4gaXNQcm9jZXNzUGFja2FnZSA9IG9sZE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlOwotCQkKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgJiYKLQkJCQkJICFpc1Byb2Nlc3NQYWNrYWdlKQotCQkJCXsJCQkJCQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotLy8gcHJpdmF0ZSBNZXRob2RFbGVtZW50IG9iak9sZCA9IG51bGw7Ci0vLyBwcml2YXRlIE1ldGhvZEVsZW1lbnQgb2JqTmV3ID0gbnVsbDsKLS8vIHByaXZhdGUgdm9pZCB0ZXN0SXQoKSB7Ci0vLyBpZiAoIG9iak9sZCAhPSBudWxsICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJPbGQgY29udGFpbmVyID0iICsgb2JqT2xkLmVDb250YWluZXIoKSk7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5ldyBjb250YWluZXIgPSIgKyBvYmpOZXcuZUNvbnRhaW5lcigpKTsKLS8vIGlmICggb2JqT2xkLmVDb250YWluZXIoKSA9PSBudWxsICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJvbGQgaXMgZ29uZSEiKTsKLS8vIH0KLS8vIGlmICggb2JqTmV3LmVDb250YWluZXIoKSA9PSBudWxsICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJuZXcgaXMgZ29uZSEiKTsKLS8vIH0KLS8vIH0KLS8vIH0KLQkKLQkvKioKLQkgKiByZXBsYWNlIHRoZSBlbGVtZW50IGJ5IHJlcGxhY2luZyB0aGUgZmVhdHVyZSB2YWx1ZXMsIGJ1dCBkb24ndCByZXBsYWNlCi0JICogdGhlIG9iamVjdCBpZiBpdCBpcyBtYXJrZWQgYXMgbm90IHJlcGxhY2VhYmxlLiByZWN1cnNpdmUgdGhlIGZlYXR1cmUKLQkgKiB2YWx1ZSBhbmQgcmVwbGFjZSBpdAotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2xkT2JqLCBNZXRob2RFbGVtZW50IG5ld09iaikgewotCQkKLQkJLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSByZXBsYWNlZCBvciBub3QKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIGRpZmZNZ3Iuc2VsZWN0YWJsZShvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCAhaXNTZWxlY3RlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBpZiBjb250ZW50IGRlc2NyaXB0aW9uLCBjaGVjayBpZiBpdCdzIGNoYW5nZWQgb3Igbm90Ci0JCWlmICggKG9sZE9iaiBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgJiYgKG5ld09iaiBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgKSB7Ci0JCQlpZiAoIExpYnJhcnlVdGlsLmlzSWRlbnRpY2FsKChDb250ZW50RGVzY3JpcHRpb24pb2xkT2JqLCAoQ29udGVudERlc2NyaXB0aW9uKW5ld09iaikgKSB7Ci0JCQkJaWYgKGRlYnVnICkgewotCQkJCQlSZXNvdXJjZSByZXMgPSBvbGRPYmouZVJlc291cmNlKCk7Ci0JCQkJCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklkZW50aWNhbCBlbGVtZW50IG5vdCByZXBsYWNlZDogIiArIHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSApOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZXZlbiB0aG91Z2ggdGhlIGNvbnRlbnQgaXMgdGhlIHNhbWUsIHdlIHN0aWxsIG5lZWQgdG8gY29weSB0aGUgcmVzb3VyY2VzCi0JCQkJc2NhblJlc291cmNlcyhvbGRPYmosIHRydWUpOwotCQkJCXJldHVybjsKLQkJCX0gCi0JCX0KLQkJCi0JCS8vIHNldCByZXBhbGNlZCBmaXJzdCB0byBhdm9pZCBjYWxsaW5nIGludG8gdGhlIHNhbWUgb2JqZWN0IHJlY3Vyc2l2ZWx5Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBsYWNpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob2xkT2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG9sZE9iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCi0JCQkJLy8gcGFja2FnZSBzdHJ1Y3R1cmUgaXMgaGFuZGxlZCBieSB0aGUgZGlmZiB0cmVlCi0JCQkJLy8gc28gd2UgZG9uJ3QgcHJvY2VzcyB0aGUgcmVsYXRlZCBmZWF0dXJlCi0JCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpCi0JCQkJCQl8fCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpIAotCQkJCQkJfHwgZmVhdHVyZS5pc0Rlcml2ZWQoKSApCi0JCQkJewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgbmV3IHZhbHVlIGZyb20gdGhlIGltcG9ydGluZyBsaWJyYXJ5IHRvIHRoZSBvbGQgb2JqZWN0IGluIHRoZQotCSAqIGJhc2UgbGlicmFyeS4gaWYgdGhlIHZhbHVlIG9yIG9ubGUgb2YgdmFsdWVzIGFyZSBub3QgcmVwbGFjZWFibGUsIHN1YWNoCi0JICogYXMgTWV0aG9kTGlicmFyeSwgTWV0aG9kUGx1Z2luLCBNZXRob2RQYWNrYWdlLCBldGMsIHRob3NlIHZhbHVlcyBzaG91bGQKLQkgKiBiZSBzdWJzdGl0dWVkIHdpdGggdGhlIG9uZSBpbiB0aGUgb2xkIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JCi0KLQlzdGF0aWMgTWV0aG9kRWxlbWVudCBuZXdDb250ID0gbnVsbDsKLQlzdGF0aWMgTWV0aG9kRWxlbWVudCBuZXdFbGVtID0gbnVsbDsKLQlwcml2YXRlIHZvaWQgc2V0RmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSwgYm9vbGVhbiBkb0RlbGV0ZSkKLQl7CQkKLQkJaWYgKCBjYW5JZ25vcmUoZmVhdHVyZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gZWxlbWVudC5lRGVsaXZlcigpOwotCQl0cnkKLQkJewotCQkJLy8gdHVybiBvZmYgbm90aWZpY2F0aW9ucyB0byBhdm9pZCBwb3NzaWJsZSBkZWFkbG9jayBvciB0aHJlYWQgaXNzdWUKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCi0JCQlpZiAoIGNhblJlc2V0KGZlYXR1cmUpICkgewotCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICggZmVhdHVyZS5pc01hbnkoKSAmJiBuZXdWYWx1ZSBpbnN0YW5jZW9mIExpc3QpCi0JCQl7Ci0JCQkJTGlzdCBvbGRWYWx1ZSA9IChMaXN0KWVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJtZXRob2RFbGVtZW50UHJvcGVydHkiKSkgewkJLy8kTk9OLU5MUy0xJAotCQkJCQlzZXRNZXBGZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwgb2xkVmFsdWUsIChMaXN0KSBuZXdWYWx1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJRWxlbWVudExpc3REaWZmIGRpZmYgPSBuZXcgRWxlbWVudExpc3REaWZmKG9sZFZhbHVlLCAoTGlzdCluZXdWYWx1ZSk7Ci0JCQkJaWYgKCBkb0RlbGV0ZSAmJiBkaWZmLmRlbGV0ZWRJdGVtcy5zaXplKCkgPiAwICkgewotCQkJCQlvbGRWYWx1ZS5yZW1vdmVBbGwoZGlmZi5kZWxldGVkSXRlbXMpOwotCQkJCQlsb2dSZW1vdmVkRWxlbWVudHMoZGlmZi5kZWxldGVkSXRlbXMpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIERlbGV0aW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlczogIiArICBkaWZmLmRlbGV0ZWRJdGVtcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICggZGlmZi5uZXdJdGVtcy5zaXplKCkgPiAwICkgewkJCQkJCi0JCQkJCS8vIHNhdmUgdGhlIG5ldyBlbGVtZW50cyBhbmQgZml4IHRoZSByZWZlcmVuY2VzIGxhdGVyCi0JCQkJCS8vIG5vdGU6IHRoZSBuZXdseSBhZGRlZCBmZWF0dXJlIHZhbHVlcyBtaWdodCBub3QgYmUgUkVBTExZCi0JCQkJCS8vIG5ldyBlbGVtZW50IHRvIHRoZSBiYXNlIGxpYnJhcnkKLQkJCQkJLy8gaXQgbWlnaHQgYmUganVzdCBhIG5ld2x5IGFkZGVkIHJlZmVyZW5jZSwgc28gY2hlY2sgYW5kCi0JCQkJCS8vIG1ha2Ugc3VyZQotCQkJCQkvLyBpZiBpdCdzIG9sZCBlbGVtZW50LCBkbyByZXBsYWNlIGFnYWluCi0JCQkJCWZvciAoIEl0ZXJhdG9yIGl0biA9IGRpZmYubmV3SXRlbXMuaXRlcmF0b3IoKTsgaXRuLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KWl0bi5uZXh0KCk7Ci0JCQkJCQkKLQkJCQkJCS8vIG9ubHkgcHJvY2VzcyB0aGUgbmV3IG9iamVjdCBpZiBpdCdzIHNlbGVjdGVkCi0JCQkJCQlpZiAoIGlzU2VsZWN0ZWQobmV3T2JqKSApIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IG9sZE9iaiA9IGRpZmZNZ3IuZ2V0RXhpc3RpbmdFbGVtZW50KG5ld09iai5nZXRHdWlkKCkpOwotCQkJCQkJCWlmICggb2xkT2JqID09IG51bGwgKSB7Ci0JCQkJCQkJCW9sZFZhbHVlLmFkZChuZXdPYmopOwotCQkJCQkJCQkvL2xvZ05ld0VsZW1lbnQobmV3T2JqKTsKLQkJCQkJCQkJbG9nTmV3RWxlbWVudFVuZGVyRXhpc3RpbmdQbHVnaW4obmV3T2JqKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlvbGRWYWx1ZS5hZGQob2xkT2JqKTsKLQkJCQkJCQkJZG9SZXBsYWNlRWxlbWVudChvbGRPYmosIG5ld09iaik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIEFkZGluZyBmZWF0dXJlIHZhbHVlLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkgKyAiLCAgZWxlbWVudDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiLCB2YWx1ZXM6ICIgKyAgZGlmZi5uZXdJdGVtcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0KLQkJCQlpZiAoIGRpZmYub2xkTmV3TWFwLnNpemUoKSA+IDAgKSB7Ci0JCQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gZGlmZi5vbGROZXdNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCQkJTWV0aG9kRWxlbWVudCBvbGRPYmogPSAoTWV0aG9kRWxlbWVudCllbnRyeS5nZXRLZXkoKTsKLQkJCQkJCQotCQkJCQkJLy8gb25seSBwcm9jZXNzIHRoZSBuZXcgb2JqZWN0IGlmIGl0J3Mgc2VsZWN0ZWQKLQkJCQkJCWlmICggIWlzU2VsZWN0ZWQob2xkT2JqKSApIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJTWV0aG9kRWxlbWVudCBuZXdPYmogPSAoTWV0aG9kRWxlbWVudCllbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJaWYgKCBjYW5SZXNldChvbGRPYmopICkgewotCQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBSZXNldHRpbmcgZmVhdHVyZSB2YWx1ZSwgZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpICsgIiwgIGVsZW1lbnQ6ICIgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiLCB2YWx1ZTogIiArICBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvbGRPYmopKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQotCQkJCQkJCUVjb3JlVXRpbC5yZXBsYWNlKGVsZW1lbnQsIGZlYXR1cmUsIG9sZE9iaiwgbmV3T2JqKTsKLQkJCQkJCQlsb2dSZXNldEVsZW1lbnQobmV3T2JqKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZG9SZXBsYWNlRWxlbWVudChvbGRPYmosIG5ld09iaik7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJewotCQkJCS8vIGlmIHRoZSBvbGQgYW5kIG5ldyBlbGVtZW50IGFyZSB0aGUgc2FtZSwKLQkJCQkvLyBvbmx5IHJlcGxhY2UgdGhlIGZlYXR1cmUgdmFsdWUKLQkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCllbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBuID0gKE1ldGhvZEVsZW1lbnQpbmV3VmFsdWU7Ci0JCQkJCi0JCQkJLy8gb25seSBwcm9jZXNzIHRoZSBuZXcgb2JqZWN0IGlmIGl0J3Mgc2VsZWN0ZWQKLQkJCQlpZiAoIChvID09IG51bGwgfHwgaXNTZWxlY3RlZChvKSkgJiYgaXNTZWxlY3RlZChuKSApIHsKLQotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIFJlcGxhY2luZ2luZyBmZWF0dXJlIHZhbHVlLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkgKyAiLCAgZWxlbWVudDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiLCB2YWx1ZTogIiArICBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQotCQkJCQlpZiAoIG5ld1ZhbHVlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uICkgewotCQkJCQkJLy8gYWx3YXlzIHJlcGxhY2UgY29udGVudCBkZXNjcmlwdGlvbiAobm90IHJlc2V0KSB0bwotCQkJCQkJLy8gcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgcmVzb3VyY2UgKHhtaSBmaWxlKQotCQkJCQkJLy8gc2luY2UgdGhlIGNvbnRlbnREZXNjcmlwdGlvbiBpcyB1bmlxdWUgdGhlIGEgbWV0aG9kCi0JCQkJCQkvLyBlbGVtZW50LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNvbXBhcmUgdGhlIGd1aWQKLQkJCQkJCQkJCQkJCQotCQkJCQkJLy8gaWYgYm90aCBvYmplY3QgaGFzIG5vIGNvbnRhaW5lciwgdGhlcmUgaXMgbm8gc3VjaAotCQkJCQkJLy8gZGVzY3JpcHRpb24sIGlnbm9yZSBpdAotCQkJCQkJaWYgKCBvLmVDb250YWluZXIoKSAhPSBudWxsIHx8IG4uZUNvbnRhaW5lcigpICE9IG51bGwgKSB7Ci0JCQkJCQkJaWYgKCBvLmVDb250YWluZXIoKSA9PSBudWxsICkgewotCQkJCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbyk7Ci0JCQkJCQkJfQotCQkJCQkJCWRvUmVwbGFjZUVsZW1lbnQobywgbik7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gaWYgdGhlIGVsZW1lbnQgY2FuIGJlIHJlcGxhY2VkLCBzdWNoIGFzIGZvcgotCQkJCQkvLyBDb250ZW50RGVzY3JpcHRpb24gZWxlbWVudAotCQkJCQkvLyBzZXQgdGhlIHZhbHVlIGRpcmVjdGx5Ci0JCQkJCWVsc2UgaWYgKCBjYW5SZXNldChuKSApIHsKLQkJCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJCQkvL2xvZ05ld0VsZW1lbnQobik7Ci0JCQkJCQlsb2dOZXdFbGVtZW50VW5kZXJFeGlzdGluZ1BsdWdpbihuKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWlmICggbyAhPSBudWxsICYmIG4gIT0gbnVsbCAmJiBvLmdldEd1aWQoKS5lcXVhbHMobi5nZXRHdWlkKCkpICkgewotCQkJCQkJCSBkb1JlcGxhY2VFbGVtZW50KG8sIG4pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7CQkJCQkJCQkJCQkJCQotCQkJCQkJCXJlZ2lzdGVyU2V0RWxlbWVudChlbGVtZW50LCBmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJCQkJCi0JCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJCQkvL2xvZ05ld0VsZW1lbnQobik7Ci0JCQkJCQkJbG9nTmV3RWxlbWVudFVuZGVyRXhpc3RpbmdQbHVnaW4obik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpICkgewotCQkJCS8vIGNoZWNrIGRpZmZlcmVuY2UgbmFtZSwgaWYgcmVwbGFjZSwgbmVlZCB0byByZW5hbWUgcmVzb3VyY2VzIGlmIGlmIGhhcyBpdCdzIG93biByZXNvdXJjZQotCQkJCS8vIGxpa2UgY29udGVudCBlbGVtZW50cywgcGx1Z2lucywgY29uZmlndWlyYXRpb25zLCBhbmQgcHJvY2VzcyBjb21wb25lbnRzCQkJCQkKLQkJCQlpZiAoISAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkTmFtZSA9IChTdHJpbmcpZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKSB7CQkJCQkKLQkJCQkJZW5zdXJlVW5pcXVlTmFtZUZvckV4aXN0aW5nRWxlbWVudChlbGVtZW50LCBvbGROYW1lLCAoU3RyaW5nKSBuZXdWYWx1ZSwgcmVuYW1lRWxlbWVudE1hcCk7CQkJCQkJCQkJCQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkKLQkJCQkvLyBzY2FuIGFuZCBjb3B5IHRoZSByZXNvdXJjZXMKLQkJCQlzY2FuUmVzb3VyY2VzKGVsZW1lbnQsIGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1lcEZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IG9sZFZhbHVlLCBMaXN0IG5ld1ZhbHVlKSB7Ci0JCWludCBzeiA9IG5ld1ZhbHVlLnNpemUoKTsKLQkJaWYgKG9sZFZhbHVlLnNpemUoKSA9PSBzeikgewotCQkJaWYgKHN6ID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlib29sZWFuIHNhbWUgPSB0cnVlOwotCQkJZm9yIChpbnQgaT0wOyBpIDwgc3o7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvbGRNZXAgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBvbGRWYWx1ZS5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG5ld01lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIG5ld1ZhbHVlLmdldChpKTsKLQkJCQlpZiAoISBvbGRNZXAuZ2V0TmFtZSgpLmVxdWFscyhuZXdNZXAuZ2V0TmFtZSgpKSB8fAotCQkJCQkhIG9sZE1lcC5nZXRWYWx1ZSgpLmVxdWFscyhuZXdNZXAuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJc2FtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2FtZSkgewotCQkJCXJldHVybjsKLQkJCX0JCQkJCQotCQl9Ci0JCW9sZFZhbHVlLnJlbW92ZUFsbChvbGRWYWx1ZSk7Ci0JCW9sZFZhbHVlLmFkZEFsbChuZXdWYWx1ZSk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2NhblJlc291cmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0KLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlpZiAoICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJc2NhblJlc291cmNlcyhlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggIXJlY3Vyc2l2ZSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWl0Lm5leHQoKTsKLQkJCQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQlzY2FuUmVzb3VyY2VzKChNZXRob2RFbGVtZW50KW9iaiwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzY2FuUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlkaWFncmFtSGFuZGxlci5yZWdpc3RlckVsZW1lbnQoZWxlbWVudCk7Ci0JCQotCQkvLyBzY2FuIHRoZSByZXNvdXJjZXMKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSApIHsKLQkJCS8vIHByb2Nlc3MgdGhlIGF0dGFjaG1lbnRzCi0JCQlTdHJpbmcgdXJscyA9IChTdHJpbmcpbmV3VmFsdWU7Ci0JCQlpZiAoICh1cmxzICE9IG51bGwpICYmIHVybHMubGVuZ3RoKCkgIT0gMCApIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybHMsICJ8Iik7IC8vIHRoaXMgaXMgaGFyZGNvZGVkIHNvbWVob3cgLy8kTk9OLU5MUy0xJAotCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkgKSB7Ci0JCQkJCVN0cmluZyB1cmwgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJcmVzU2Nhbm5lci5jb3B5UmVzb3VyY2UgKGVsZW1lbnQsIHVybCk7Ci0JCQkJfQkJCQkJCQotCQkJfQotCQl9IGVsc2UgaWYgKCBuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZyApIHsKLQkJCXJlc1NjYW5uZXIuc2NhbihlbGVtZW50LCBuZXdWYWx1ZS50b1N0cmluZygpKTsKLQkJfSBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFVSSSApIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCXJlc1NjYW5uZXIuY29weVJlc291cmNlICggKChVUkkpbmV3VmFsdWUpLmdldFBhdGgoKSwgcGx1Z2luKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBkb0FkZChFT2JqZWN0IG93bmVyLCBNZXRob2RFbGVtZW50IG5ld09iaikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudCluZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gdGhlIG93bmVyIGNhbiBvbmx5IGJlIGxpYnJhcnkgYW5kIHBhY2thZ2UKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZW5zdXJlVW5pcXVlTmFtZShvd25lciwgbmV3T2JqLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCi0JCWJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsJCQkKLQkJCS8vIGNhbiBiZSBjb25maWd1cmF0aW9uIG9yIHBsdWdpbgotCQkJaWYgKG5ld09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKW5ld09iajsJCQkJCi0JCQkJCi0JCQkJY2hlY2tNb2RpZmllZEZpbGVzKCk7CQkJCQotCQkJCWVycm9yID0gISBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCk7CQkJCQotCQkJCQkJCQkKLQkJCQkvLyBkb24ndCBpbnRpdGlhbGl6ZSB0aGUgc3RvcmFnZSBzaW5jZSB0aGlzIHdpbGwgcmVjcmVhdGUgdGhlIGdsb2JhbCBwYWNrYWdlcwotCQkJCS8vIGFuZCBzdWNoIGNhdXNpbmcgdHdvIHNldCBvZiBnbG9iYWwgcGFja2FnZXMKLQkJCQkvLyAxNDU4NTAgLSBJbXBvcnQgQ29uZmlndXJhdGlvbjogQ1AvRFBzIGRpZCBub3Qgc2hvd24gaW4gYXV0aGVyaW5nCi0JCQkJLy8gTW9kZWxTdG9yYWdlLmluaXRpYWxpemUocGx1Z2luKTsKLQkJCQkvLyBOTywgc2luY2UgdGhlIGdsb2JhbCBwYWNrYWdlcyBhcmUgYWxyZWFkeSBjcmVhdGVkCi0JCQkJaWYgKCFlcnJvcikgewotCQkJCQkoKE1ldGhvZExpYnJhcnkpb3duZXIpLmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCU11bHRpRmlsZVhNSUhlbHBlckltcGwudW5tb2RpZmllZEdldFZhbHVlID0gdHJ1ZTsKLQkJCQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KChNZXRob2RMaWJyYXJ5KW93bmVyLCBmYWxzZSwgZmFsc2UpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJTXVsdGlGaWxlWE1JSGVscGVySW1wbC51bm1vZGlmaWVkR2V0VmFsdWUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkJCQkJCi0JCQl9IGVsc2UgaWYgKG5ld09iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0JCQkJY2hlY2tNb2RpZmllZEZpbGVzKCk7CQkJCQotCQkJCWVycm9yID0gY29uZmlnRm9sZGVyRXJyb3IgfHwgISBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCk7Ci0JCQkJaWYgKCFlcnJvcikgewotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KW93bmVyOwotCQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkKChNZXRob2RDb25maWd1cmF0aW9uKW5ld09iaik7Ci0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCWlmIChwZXJzaXN0ZXIgaW5zdGFuY2VvZiBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgewotCQkJCQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgaXAgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHBlcnNpc3RlcjsKLQkJCQkJCUZpbGUgY29uZmlnRm9sZGVyID0gaXAuZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGliKTsKLQkJCQkJCWlmIChjb25maWdGb2xkZXIgIT0gbnVsbCkgewotCQkJCQkJCWlwLnNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYiwgY29uZmlnRm9sZGVyKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZXJyb3IgPSB0cnVlOwotCQkJCQkJCWNvbmZpZ0ZvbGRlckVycm9yID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoISBlcnJvcikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLnVubW9kaWZpZWRHZXRWYWx1ZSA9IHRydWU7Ci0JCQkJCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoKE1ldGhvZExpYnJhcnkpb3duZXIsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCU11bHRpRmlsZVhNSUhlbHBlckltcGwudW5tb2RpZmllZEdldFZhbHVlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yID0gdHJ1ZTsJCQkKLQkJCX0KLQkJfSBlbHNlIGlmICggKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgCi0JCQkJJiYgKG93bmVyLmVDb250YWluZXIoKSAhPSBudWxsKSAKLQkJCQkmJiAobmV3T2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgKSB7Ci0JCQkoKE1ldGhvZFBhY2thZ2Upb3duZXIpLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpbmV3T2JqKTsKLQkJfSBlbHNlIHsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCQkJCi0JCWlmICggZXJyb3IgKSB7Ci0JCQlTdHJpbmcgb3duZXJTdHIgPSBvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgPyAKLQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoKE1ldGhvZEVsZW1lbnQpb3duZXIpIDogb3duZXIudG9TdHJpbmcoKTsKLQkJCQkJCi0JCQlTdHJpbmcgbXNnID0gImNhbid0IGFkZCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobmV3T2JqKSAvLyROT04tTkxTLTEkCi0JCQkrICIgdG8gIiArIG93bmVyU3RyOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobXNnKTsgCi0JCQlpZiAoIGRlYnVnICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbG9nTmV3RWxlbWVudChuZXdPYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTW9kaWZpZWRDb25maWdzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdCBjb25maWdMaXN0ID0gTGlicmFyeVV0aWwuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKHBsdWdpbik7Ci0JCUxpc3QgYmFzZUNvbmZpZ3MgPSBiYXNlTGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJTWFwIGJhc2VDb25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8YmFzZUNvbmZpZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGJhc2VDb25maWdzLmdldChpKTsKLQkJCWJhc2VDb25maWdNYXAucHV0KGNvbmZpZy5nZXRHdWlkKCksIGNvbmZpZyk7Ci0JCX0KLQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29uZmlnTGlzdC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnTGlzdC5nZXQoaSk7Ci0JCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgYmFzZUNvbmZpZ01hcC5nZXQoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZSByZXMgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkRmlsZXMuYWRkKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQkJZmlsZUNoZWNrT3V0RXJyb3IoKTsKLQkJCi0JCXJldHVybiBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvSW50ZWdyaXR5Q2hlY2soKQotCXsJCQotCQkvLyBub3cgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnRzIG1heSBoYXZlIGZlYXR1cmUgdmFsdWUgZWxlbWVudCB0aGF0Ci0JCS8vIHN0aWxsIHBvaW50aW5nIHRvIHRoZSBpbXBvcnRpbmcgbGlicmFyeQotCQkvLyB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhvc2Ugd2l0aCB0aGUgb25lIGluIHRoZSBiYXNlIGxpYnJhcnkKLQkJd2hpbGUgKG5ld0VsZW1lbnRzLnNpemUoKSA+IDApIHsKLQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpbmV3RWxlbWVudHMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlpZiAoIG5ld09iaiBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50ICkgewotCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudCluZXdPYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKG5ld09iaik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gd2hpbGUgZml4aW5nIG5ldyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGUgY29uZmlndXJhdGlvbnMgbmVlZHMgdG8gYmUgZml4ZWQKLQkJTGlzdCBjb25maWdzID0gYmFzZUxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbilpdC5uZXh0KCk7Ci0JCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCwgY29uZmlnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBwcm9jZXNzZWROZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkKLQkKLQkvKioKLQkgKiBpdGVyYXRlIGFsbCBmZWF0dXJlcywgaWYgdGhlIGZlYXR1cmUgdmFsdWUgcmVmZXJlbmNlcyBhbiBlbGVtZW50IHdoaWNoIGlzCi0JICogYW4gb2xkIGVsZW1lbnQsIHJlcGxhY2UgaXQgd2l0aCB0aGUgb2xkIGVsZW1lbnQuIGlmIHRoZSBlbGVtZW50IGlzIG5ldywKLQkgKiBpdGVyYXRlIGl0J3MgY29udGFpbm1lbnQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCWlmICggcHJvY2Vzc2VkTmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcHJvY2Vzc2VkTmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaXhpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobmV3T2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhuZXdPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG5ld09iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQotCQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQotCQkJCQkvLyBmaXhpbmcgdGhlIGZlYXR1cmUgdmFsdWUgbWF5IGNhdXNlIHRoZSBsaXN0IHRvIGNoYW5nZQotCQkJCQkvLyBpdGVyYXRlIG9uIGEgbmV3IGNvcHkgdG8gYXZvaWQKLQkJCQkJLy8gQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0PSBuZXcgQXJyYXlMaXN0KCgoTGlzdCl2YWx1ZSkpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCBvKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgZml4RGlhZ3JhbShEaWFncmFtRWxlbWVudCBuZXdPYmopIHsJCQotCi0JCWlmICggcHJvY2Vzc2VkTmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcHJvY2Vzc2VkTmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaXhpbmcgZGlhZ3JhbSBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG5ld09iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gbmV3T2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCi0JCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCi0JCQkJCS8vIGZpeGluZyB0aGUgZmVhdHVyZSB2YWx1ZSBtYXkgY2F1c2UgdGhlIGxpc3QgdG8gY2hhbmdlCi0JCQkJCS8vIGl0ZXJhdGUgb24gYSBuZXcgY29weSB0byBhdm9pZAotCQkJCQkvLyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCQkJCWZvciAoSXRlcmF0b3IgaXQ9IG5ldyBBcnJheUxpc3QoKChMaXN0KXZhbHVlKSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCQkJaWYgKCBvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgKSB7Ci0JCQkJCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCBvKTsKLQkJCQkJCQl9IGVsc2UgaWYgKCAobyBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSApIHsKLQkJCQkJCQkJZml4RGlhZ3JhbSgoRGlhZ3JhbUVsZW1lbnQpbyk7Ci0JCQkJCQkJfSAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpICkgewotCQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIHZhbHVlKTsKLQkJCQkJfSBlbHNlIGlmICggKHZhbHVlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpICkgewotCQkJCQkJZml4RGlhZ3JhbSgoRGlhZ3JhbUVsZW1lbnQpdmFsdWUpOwotCQkJCQl9IAotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIG9sZCBlbGVtZW50IGluIHRoZSBiYXNlLCBpZiB5ZXMsIHJlcGxhY2UgaXQgd2l0aAotCSAqIHRoZSBvbGQgb25lIGlmIGl0J3MgbmV3LCBpdGVyYXRlIGl0J3MgZmVhdHVyZSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhOZXdFbGVtZW50RmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBvYmopIHsKLQkJaWYgKCAhKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmaXhpbmcgZWxlbWVudCBmZWF0dXJlIHZhbHVlICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIGZlYXR1cmU9IiArIGZlYXR1cmUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlib29sZWFuIG9sZE5vdGlmeSA9IGVsZW1lbnQuZURlbGl2ZXIoKTsKLQkJdHJ5Ci0JCXsKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCi0JCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KW9iajsKLQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gZ2V0UmVwbGFjZWQobmV3T2JqLmdldEd1aWQoKSk7Ci0JCQlpZiAoIG9sZE9iaiA9PSBudWxsICkgewotCQkJCS8vIGdldCBleGlzdGluZyBlbGVtZW50LCBmb3IgZXhhbXBsZSwgdGhlIGdsb2JhbCBwYWNrYWdlcyBpbiB0aGUKLQkJCQkvLyBjb25maWd1cmF0aW9uIGZlYXR1cmUKLQkJCQlvbGRPYmogPSBkaWZmTWdyLmdldEV4aXN0aW5nRWxlbWVudChuZXdPYmouZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBvbGRPYmogPT0gbnVsbCApIHsKLQkJCQkvLyBpdCdzIGEgbmV3IG9uZQotCQkJCWZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKG5ld09iaik7Ci0JCQl9IGVsc2UgewotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCS8vIHJlcGxhY2UgdGhlIG5ld09iaiB3aXRoIHRoZSBvbGRPYmoKLQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UoZWxlbWVudCwgZmVhdHVyZSwgbmV3T2JqLCBvbGRPYmopOyAKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBpZiByZXBsYWNlIGZhaWxlZCwgcmVtb3ZlIHRoZSBmZWF0dXJlCi0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZWxlbWVudCwgZmVhdHVyZSwgbmV3T2JqKTsgCi0JCQkJCWlmIChkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGFjZWluZyBmZWF0dXJlIHZhbHVlIGZhaWxlZCBmb3IgZWxlbWVudCBbIiAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIl0sIGZlYXR1cmUgWyIgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyBmZWF0dXJlLmdldE5hbWUoKSArICJdLCB2YWx1ZT0iICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgbmV3T2JqICsgIi4gVGhlIGZlYXR1cmUgdmFsdWUgaXMgcmVtb3ZlZC4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVzZXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWJvb2xlYW4gcmVzZXQgPSBmYWxzZTsKLQkJCi0JCS8vIGFuIGVsZW1lbnQgY2FuIGJlIHJlc2V0IGlmIHlvdSBhcmUgc3VyZSB0aGF0IG5vIG90aGVyIGVsZW1lbnQocykKLQkJLy8gcmVmZXJlbmNlIHRvIGl0Ci0JCS8vIHJlc2V0IGVsZW1lbnRzIG1heSBoYXZlIHJlZmVyZW5jZXMgdG8gb3RoZXIgZWxlbWVudHMgaW4gdGhlIGltcG9ydGluZwotCQkvLyBsaWJyYXJ5LCB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIGxhdGVyCi0JCQotCQkvLyBmb3IgYW55dGhpbmcgY29udGFpbmVkIGJ5IENvbnRlbnREZXNjcmlwdGlvbiwgcmVzZXQgaXQKLQkJaWYgKCBlID09IG51bGwgLyogfHwgZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKi8KLQkJCQl8fCBlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpIHsKLQkJCXJlc2V0ID0gdHJ1ZTsKLQkJfQotCQkJCQotCQlyZXR1cm4gcmVzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIGZvciBhbnl0aGluZyBjb250YWluZWQgYnkgQ29udGVudERlc2NyaXB0aW9uLCByZXNldCBpdAotCQkvLyBubyBkb24ndCByZXNldCB0aGUgc2VjdGlvbnMgc2luY2UgaXQgd2lsbCBjYXVzZSB0aGUgb25lIGluIHRoZQotCQkvLyBpbXBvcnRpbmcgbGlicmFyeSByZW1vdmVkCi0JCS8vIHdoaWNoIGNhdXNlZCBwcm9ibGVtIGZvciBUYXNrRGVzY3JpcHRpb24gd2hlcmUgdGhlIHNhbWUgZmVhdHVyZQotCQkvLyAoU3RlcHMpIGNhbid0IGZpbmQgdGhlIHN0ZXBzIGZyb20gdGhlIGltcG9ydGluZyBsaWJyYXJ5Ci0JCS8vIHdoaWNoIHRoZW4gd2lsbCB0cmVhdCB0aGUgc3RlcHMgaW4gdGhlIGJhc2UgbGlicmFyeSBiZWluZyBkZXRldGVkCi0vLyBpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkpIHsKLS8vIHJldHVybiB0cnVlOwotLy8gfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkvLyBkb24ndCByZXNldCB0aGUgcGx1Z2luIGxvY2sgc3RhdHVzCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyAxNDYxNDQgLSBJbXBvcnQgQ29uZmlndXJhdGlvbjogc29tZSB1bmNoYW5nZSBlbGVtZW50cyBkaXNhcHBlYXIgaW4gYXV0aG9yaW5nIGFmdGVyIGltcG9ydAotCQkvLyB0aGlzIGlzIGNhdXNlZCBieSBhIGJ1ZyBpbiBBcnRpZmFjdEltcGwsIHdoZW4gc2V0Q29udGFpbmVyQXJ0aWZhY3QgdG8gbnVsbCwgCi0JCS8vICBpdCBzZXQgdGhlIGVDb250YWluZXIgdG8gbnVsbCwgaWYgdGhlIGVDb250YWluZXIgaXMgYSBjb250ZW50IHBhY2thZ2UsIAotCQkvLyB0aGUgYXJ0aWZhY3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYWNrYWdlCi0JCS8vICB0aGlzIGJ1ZyB3aWxsIGJlIGZpeGVkIGluIE00LiAKLQkJLy8gZm9yIG5vdywgaWdub3JlIHRoaXMgZmVhdHVyZSBzaW5jZSB0aGlzIGlzIGFuIG9wcG9zaXRlIGZlYXR1cmUsIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIGl0CQotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVwbGFjZWQoTWV0aG9kRWxlbWVudCBvbGRPYmopIHsKLQkJcmV0dXJuIHJlcGxhY2VkRWxlbWVudE1hcC5jb250YWluc0tleShvbGRPYmouZ2V0R3VpZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVwbGFjZWQoTWV0aG9kRWxlbWVudCBvbGRPYmopIHsKLQkJU3RyaW5nIGd1aWQgPSBvbGRPYmouZ2V0R3VpZCgpOwotCQlpZiAoICFyZXBsYWNlZEVsZW1lbnRNYXAuY29udGFpbnNLZXkoZ3VpZCkgKSB7Ci0JCQlyZXBsYWNlZEVsZW1lbnRNYXAucHV0KGd1aWQsIG9sZE9iaik7Ci0JCQlzZXRNb2RpZmllZChvbGRPYmopOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb2xkIGVsZW1lbnQgYmVlbiByZXBsYWNlZAotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGdldFJlcGxhY2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoTWV0aG9kRWxlbWVudClyZXBsYWNlZEVsZW1lbnRNYXAuZ2V0KGd1aWQpOwotCX0KLQkKLQkvKioKLQkgKiB3aGVuIG5ldyBlbGVtZW50cyBhcmUgYWRkZWQgaW50byB0aGUgbGlicmFyeSwgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UKLQkgKiBmaWxlcyBtdXN0IGJlIGNvcGllZCBvdmVyIGFzIHdlbGwKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHlOZXdFbGVtZW50UmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotLy8JCUxpc3QgcHJvcGVydGllcyA9IG5ld09iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLS8vCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLS8vCQkJCU9iamVjdCB2YWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotLy8JCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFVSSSApIHsKLS8vCQkJCQlyZXNTY2FubmVyLmNvcHlSZXNvdXJjZSgoKFVSSSl2YWx1ZSkuZ2V0UGF0aCgpKTsKLS8vCQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotLy8JCQkJCXJlc1NjYW5uZXIuc2NhbihuZXdPYmosIChTdHJpbmcpdmFsdWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3T2JqLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotLy8JCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotLy8JCQkJY29weU5ld0VsZW1lbnRSZXNvdXJjZXMoKE1ldGhvZEVsZW1lbnQpbyk7Ci0vLwkJCX0KLS8vCQl9Ci0JCQotCQlzY2FuUmVzb3VyY2VzKG5ld09iaiwgdHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dOZXdFbGVtZW50KE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBvcmlnaW5hbCBsaWJyYXJ5Ci0JCS8vIHNpbmNlIHdlIGhhdmUgdGhlIGd1aWQtZWxlbWVudCBtYXAgYnVpbGQgdXAgaW4gdGhlIGRpZmYgbWFuYWdlciwKLQkJLy8gY2hlY2sgdGhlcmUKLQkJaWYgKCAhbmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSAmJiBkaWZmTWdyLmdldEV4aXN0aW5nRWxlbWVudChuZXdPYmouZ2V0R3VpZCgpKSA9PSBudWxsKSB7Ci0JCQluZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCWNvcHlOZXdFbGVtZW50UmVzb3VyY2VzKG5ld09iaik7Ci0JCQlzZXRNb2RpZmllZChuZXdPYmopOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dSZXNldEVsZW1lbnQoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJaWYgKCAhbmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCW5ld0VsZW1lbnRzLmFkZChuZXdPYmopOwotCQkJc2V0TW9kaWZpZWQobmV3T2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dOZXdSZXNvdXJjZShSZXNvdXJjZSByZXMgKSB7Ci0JCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkKLQkJCS8vIG1hcmsgdGhlIHJlc291cmNlIGFzIGRpcnR5IHNvIHRoYXQgd2UgY2FuIHNhdmUgaXQgYWdhaW4KLQkJCS8vIHRoZSBmaXJzdCBzYXZlIG1heSBsb3NlIGNyb3NzIHJlZmVyZW5jZXMgCi0JCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWlmICggIW5ld1Jlc291cmNlcy5jb250YWlucyhmaWxlKSApIHsKLQkJCQluZXdSZXNvdXJjZXMuYWRkKGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dSZW1vdmVkRWxlbWVudHMoTGlzdCBpdGVtcykgewotCQkKLQkJaWYgKCBpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyByZW1vdmVkIGVsZW1lbnRzIGNhbiBiZSByZW1vdmVkIGZyb20gYW55IGZlYXR1cmUKLQkJLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQncyBjb250YWluZXIgaXMgbnVsbAotCQkvLyBpZiBpcywgdGhlbiB0aGUgZWxlbWVudCBpcyBkZWxldGVkIGFuZCB0aGUgcmVzb3VyY2Ugc2hvdWxkIGJlIGRlbGV0ZWQKLQkJLy8gYXMgd2VsbAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCWlmICggKGUuZUNvbnRhaW5lcigpID09IG51bGwpICYmICFkZWxldGVkRWxlbWVudHMuY29udGFpbnMoZSkgKSB7CQkJCi0JCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlKTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TW9kaWZpZWQoRU9iamVjdCBvYmopIHsKLQkJaWYgKCBvYmogIT0gbnVsbCApIHsKLQkJCVJlc291cmNlIHJlcyA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkJaWYgKCAhcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwkJCQkKLQkJCQl9Ci0vLyB9IGVsc2UgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJObyByZXNvdXJjZSBmb3IgIiArIG9iaik7Ci0JCQkJCi0JCQkJaWYgKGRlYnVnICYmIHJlcy5pc01vZGlmaWVkKCkgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZWQ6ICIgKyByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TW9kaWZpZWRSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJCi0JCS8vIGF2b2lkIHRoZSBuZXdseSBhZGRlZCBlbGVtZW50IHJlc291cmNlcwotCQlMaXN0IG1vZGlmaWVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUmVzb3VyY2UgcmVzID0gbGliLmVSZXNvdXJjZSgpOwotCQlpZiAoIHJlcyAhPSBudWxsICkgewotCQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gcmVzLmdldFJlc291cmNlU2V0KCk7Ci0JCQlmb3IgKCBJdGVyYXRvciBpdCA9IHJlc1NldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCXJlcyA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCWlmICggcmVzICE9IG51bGwgJiYgcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCQkJU3RyaW5nIGZpbGUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCWlmICggbmV3UmVzb3VyY2VzLmNvbnRhaW5zKGZpbGUpICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIG1vZGlmaWVkOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQkJCi0JCQkJCW1vZGlmaWVkTGlzdC5hZGQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZExpc3Q7Ci0JfQotCi0JLy8gY2xlYXIgcmVzb3VyY2VzIGZvciBkZWxldGVkIGVsZW1lbnRzCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlc29ydWNlcygpIHsKLQkJaWYgKCBkZWxldGVkRWxlbWVudHMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkKLQkJCUVPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCQlvYmogPSAoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKSB7Ci0JCQkJb2JqID0gZTsKLQkJCX0KLQkJCWlmICggb2JqICE9IG51bGwgKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyByZXNvdXJjZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggIWZpbGVNZ3IuZGVsZXRlKGZpbGUpICkgewotCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCQkJCQkKLQkJCX0KLQkJfQotCX0KLQotCQotCXB1YmxpYyBjbGFzcyBFbGVtZW50TGlzdERpZmYgewotCi0JCUxpc3QgbmV3SXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZGVsZXRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gdXNlIExpbmtlZEhhc2hNYXAgdG8gcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIHZhbHVlcwotCQlNYXAgb2xkTmV3TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQotCQkvLyB3aXRoIHRoZSBvbGQgYW5kIG5ldyBsaXN0IG9mIE1ldGhvZEVsZW1lbnRzLAotCQkvLyBmaW5kIHRoZSBjb21tb24gb25lcywgdGhlIGRlbGV0ZWQgb25lcywgYW5kIHRoZSBuZXcgb25lcwotCQlwdWJsaWMgRWxlbWVudExpc3REaWZmKExpc3Qgb2xkTGlzdCwgTGlzdCBuZXdMaXN0KSB7Ci0JCQkvLyBNYXAgb2xkTGlzdEd1aWRNYXAgPSBnZXRHdWlkTWFwKG9sZExpc3QpOwotCQkJTWFwIG5ld0xpc3RHdWlkTWFwID0gZ2V0R3VpZE1hcChuZXdMaXN0KTsKLQotCQkJbmV3SXRlbXMuYWRkQWxsKG5ld0xpc3QpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb2xkTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCVN0cmluZyBndWlkID0gb2xkT2JqLmdldEd1aWQoKTsKLQkJCQlPYmplY3QgbmV3T2JqID0gbmV3TGlzdEd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCWlmICggbmV3T2JqICE9IG51bGwgKSB7Ci0JCQkJCW9sZE5ld01hcC5wdXQob2xkT2JqLCBuZXdPYmopOwotCQkJCQluZXdJdGVtcy5yZW1vdmUobmV3T2JqKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gaXQncyBiZWVuIGRlbGV0ZWQKLQkJCQkJZGVsZXRlZEl0ZW1zLmFkZChvbGRPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgTWFwIGdldEd1aWRNYXAoTGlzdCBpdGVtcykgewotCQkJTWFwIG0gPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdD0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJbS5wdXQoZS5nZXRHdWlkKCksIGUpOwotCQkJfQotCi0JCQlyZXR1cm4gbTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogSGFuZGxlcyBuYW1lIHJlcGxhY2VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVOYW1lUmVwbGFjZShNYXAgcmVuYW1lRWxlbWVudE1hcCkgewotCQlJdGVyYXRvciBpdCA9IHJlbmFtZUVsZW1lbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3RbXSB2YWwgPSAoT2JqZWN0W10pZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFswXTsKLQkJCVN0cmluZyBuZXdOYW1lID0gdmFsLmxlbmd0aCA9PSA0ID8gZWxlbWVudC5nZXRHdWlkKCkgOiAoU3RyaW5nKSB2YWxbMV07Ci0JCQlyZW5hbWUoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQlpZiAodmFsLmxlbmd0aCA9PSA0KSB7Ci0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB2YWxbMl07Ci0JCQkJbmV3TmFtZSA9IChTdHJpbmcpIHZhbFszXTsKLQkJCQlyZW5hbWUoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQkJCi0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB2YWxbMF07Ci0JCQkJbmV3TmFtZSA9IChTdHJpbmcpIHZhbFsxXTsKLQkJCQlyZW5hbWUoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vTWFrZSByZXNvdWNlcyBkaXJ0eSBhZ2FpbiwgYXMgcmVuYW1lIHByb2Nlc3Mgd291bGQgbWFyayByZXNvdWNlIHVuLW1vZGlmaWVkCi0JCWl0ID0gcmVuYW1lRWxlbWVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdFtdIHZhbCA9IChPYmplY3RbXSllbnRyeS5nZXRWYWx1ZSgpOwkJCQotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFswXTsKLQkJCWVsZW1lbnQuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAobmV3TmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgZWxlbWVudC5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQllbGVtZW50LnNldE5hbWUobmV3TmFtZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCXByb2Muc2V0TmFtZShuZXdOYW1lKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUxpYnJhcnlWaWV3LnJ1blJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyU2V0RWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIGd1aWQwID0gKChNZXRob2RFbGVtZW50KW5ld1ZhbHVlKS5nZXRHdWlkKCk7Ci0JCVN0cmluZyBndWlkMSA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQlPYmplY3RbXSB2YWwgPSBuZXcgT2JqZWN0WzNdOwotCQl2YWxbMF0gPSBmZWF0dXJlOwotCQl2YWxbMV0gPSBuZXdWYWx1ZTsKLQkJdmFsWzJdID0gZWxlbWVudDsKLQkJaWYgKHNldEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJc2V0RWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJc2V0RWxlbWVudE1hcC5wdXQoZWxlbWVudC5nZXROYW1lKCkgKyBndWlkMCArIGd1aWQxLCB2YWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlU2V0RWxlbWVudHMoKSB7Ci0JCWlmIChzZXRFbGVtZW50TWFwID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2V0RWxlbWVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdFtdIHZhbCA9IChPYmplY3RbXSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSB2YWxbMF07Ci0JCQlNZXRob2RFbGVtZW50IG5ld1ZhbHVlID0gKE1ldGhvZEVsZW1lbnQpIHZhbFsxXTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB2YWxbMl07Ci0JCQlTdHJpbmcgZ3VpZCA9IG5ld1ZhbHVlLmdldEd1aWQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgbWVyZ2VkVmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgcmVwbGFjZWRFbGVtZW50TWFwLmdldChndWlkKTsKLQkJCWlmIChtZXJnZWRWYWx1ZSAhPSBudWxsICYmIG1lcmdlZFZhbHVlICE9IG5ld1ZhbHVlKSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG1lcmdlZFZhbHVlKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdW5pcXVlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVVuaXF1ZU5hbWUoRU9iamVjdCBvd25lciwgTWV0aG9kRWxlbWVudCBuZXdPYmosIE1hcCByZW5hbWVFbGVtZW50TWFwKSB7Ci0JCWlmIChvd25lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2xhc3MgY2xzID0gbmV3T2JqLmdldENsYXNzKCk7Ci0JCU1hcCBuYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgb3duZXIuZUNvbnRlbnRzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvbGRPYmogPSBvd25lci5lQ29udGVudHMoKS5nZXQoaSk7Ci0JCQlpZiAob2xkT2JqLmdldENsYXNzKCkgPT0gY2xzICYmIG9sZE9iaiAhPSBuZXdPYmopIHsKLQkJCQlNZXRob2RFbGVtZW50IG9sZEVsZW0gPSAoTWV0aG9kRWxlbWVudCkgb2xkT2JqOwotCQkJCW5hbWVNYXAucHV0KG9sZEVsZW0uZ2V0TmFtZSgpLCBvbGRFbGVtKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgbmFtZSA9IG5ld09iai5nZXROYW1lKCk7Ci0JCVN0cmluZyByZW5hbWVkID0gbmFtZTsKLQkJd2hpbGUgKG5hbWVNYXAuY29udGFpbnNLZXkocmVuYW1lZCkpIHsKLQkJCXJlbmFtZWQgKz0gIl9yZW5hbWVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChyZW5hbWVkICE9IG5hbWUpIHsKLQkJCW5ld09iai5zZXROYW1lKHJlbmFtZWQpOwotCQkJCi0JCQlPYmplY3RbXSBlbnRyeVZhbCA9IG5ldyBPYmplY3RbNF07Ci0JCQllbnRyeVZhbFswXSA9IG5ld09iajsKLQkJCWVudHJ5VmFsWzFdID0gbmFtZTsKLQkJCWVudHJ5VmFsWzJdID0gbmFtZU1hcC5nZXQobmFtZSk7Ci0JCQllbnRyeVZhbFszXSA9IHJlbmFtZWQ7Ci0JCQlyZW5hbWVFbGVtZW50TWFwLnB1dChuZXdPYmouZ2V0R3VpZCgpLCBlbnRyeVZhbCk7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB1bmlxdWUgbmFtZSBmb3IgZXhpc3RpbmcgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVW5pcXVlTmFtZUZvckV4aXN0aW5nRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSwgTWFwIHJlbmFtZUVsZW1lbnRNYXApIHsKLQkJRU9iamVjdCBlbGVtZW50T3duZXIgPSBlbGVtZW50LmVDb250YWluZXIoKTsJCQkJCQotCQlpZiAoZWxlbWVudE93bmVyICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCWVuc3VyZVVuaXF1ZU5hbWUoZWxlbWVudE93bmVyLCBlbGVtZW50LCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG5ld05hbWUpKSB7CS8vaWYgaGFuZGxlZCB0aGVuIHJldHVybgotCQkJCXJldHVybjsKLQkJCX0JCQkKLQkJCWVsZW1lbnQuc2V0TmFtZShvbGROYW1lKTsKLQkJfQkJCQotCQlPYmplY3RbXSBlbnRyeVZhbCA9IG5ldyBPYmplY3RbMl07Ci0JCWVudHJ5VmFsWzBdID0gZWxlbWVudDsKLQkJZW50cnlWYWxbMV0gPSBuZXdOYW1lOwotCQlyZW5hbWVFbGVtZW50TWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgZW50cnlWYWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmaWVkRmlsZXMoKSB7Ci0JCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKGJhc2VMaWJyYXJ5KTsKLQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwocmVzU2Nhbm5lci5nZXRGaWxlc1RvYmVSZXBsYWNlZCgpKTsKLQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwoZGlhZ3JhbUhhbmRsZXIuZ2V0TW9kaWZpZWRGaWxlcygpKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShtb2RpZmllZEZpbGVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHVubG9ja1BsdWdpbnMoKSB7Ci0KLQkJTGlzdCBwbHVnaW5JZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kUGx1Z2luPigpOwotCQlNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IGd1aWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4oKTsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VQbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBiYXNlUGx1Z2lucy5nZXQoaSk7Ci0JCQltYXAucHV0KHBsdWdpbi5nZXROYW1lKCksIHBsdWdpbik7Ci0JCQlndWlkTWFwLnB1dChwbHVnaW4uZ2V0R3VpZCgpLCBwbHVnaW4pOwotCQl9Ci0JCQotCQlpZiAobWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHBsdWdpbklkczsKLQkJfQotCQkKLQkJTGlzdCBmaWxlTmFtZVRvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBpbXBvcnRQbHVnaW5zID0gaW1wb3J0aW5nTGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0UGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGltcG9ydFBsdWdpbnMuZ2V0KGkpOwotCQkJU3RyaW5nIG5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGd1aWQgPSBwbHVnaW4uZ2V0R3VpZCgpOwotCQkJCi0JCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbjAgPSBndWlkTWFwLmdldChndWlkKTsKLQkJCWlmIChiYXNlUGx1Z2luMCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUwID0gYmFzZVBsdWdpbjAuZ2V0TmFtZSgpOwotCQkJCWlmICghIG5hbWUwLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZW5hbWVQbHVnaW5NYXAucHV0KG5hbWUwLCBuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gbWFwLmdldChuYW1lKTsKLQkJCWJvb2xlYW4gdG9BZGQgPSBmYWxzZTsKLQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwgJiYgISBiYXNlUGx1Z2luLmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkKLQkJCQkJJiYgISBiYXNlUGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkpIHsKLQkJCQl0b0FkZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWJhc2VQbHVnaW4gPSBndWlkTWFwLmdldChndWlkKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsIC8qJiYgISBiYXNlUGx1Z2luLmdldE5hbWUoKS5lcXVhbHMobmFtZSkqLwotCQkJCQkJJiYgISBiYXNlUGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkpIHsKLQkJCQkJdG9BZGQgPSB0cnVlOwotCQkJCX0gCi0JCQl9Ci0JCQkKLQkJCWlmICh0b0FkZCl7CQkJCQotCQkJCXBsdWdpbklkcy5hZGQoYmFzZVBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCWJhc2VQbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCVJlc291cmNlIHJlcyA9IGJhc2VQbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJZmlsZU5hbWVUb0NoZWNrLmFkZChmaWxlTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCQkKLQkJaWYgKGZpbGVOYW1lVG9DaGVjay5zaXplKCkgPiAwKSB7Ci0JCQlmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMgPSBmaWxlTmFtZVRvQ2hlY2s7CQotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShtb2RpZmllZEZpbGVzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIHBsdWdpbklkczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdW5sb2NrZWRQbHVnaW5zCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvY2tVbmxvY2tlZFBsdWdpbnMoTGlzdCB1bmxvY2tlZFBsdWdpbnMpIHsKLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuY29udGFpbnMocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nTmV3RWxlbWVudFVuZGVyRXhpc3RpbmdQbHVnaW4oTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IobmV3T2JqKTsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKG5ld09iaik7Ci0JCWlmIChwbHVnaW5QYXRoICE9IG51bGwpIHsKLQkJCWxvZ05ld0VsZW1lbnQobmV3T2JqKTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjVkNDczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBpbXBvcnQgYSBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkltcG9ydERhdGEgewotCi0JLy8gdGhlc2UgYXJlIHNldCBieSB0aGUgd2l6YXJkCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbmV3IExpYnJhcnlMb2NhdGlvbkRhdGEoKTsKLQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZUV4aXN0aW5nUGx1Z2luczsKLQotCS8vIHRoZXNlIGFyZSBmaWxsZWQgaW4gYnkgdGhlIGltcG9ydGluZyBzZXJ2aWNlCi0JcHVibGljIFN0cmluZyBsaWJyYXJ5VmVyc2lvbjsKLQotCXByaXZhdGUgTGlzdDxQbHVnaW5JbmZvPiBwbHVnaW5zID0gbmV3IEFycmF5TGlzdDxQbHVnaW5JbmZvPigpOwotCi0JcHJpdmF0ZSBMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEVycm9ySW5mbyBlcnJvciA9IG5ldyBFcnJvckluZm8oKTsKLQotCS8vIGFwIHRoZSBndWlkIHRvIHVybCBmb3IgYmFzZSBwbHVnaW4sIHRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0aW9uIGF2YWlsYWJsZQotCXB1YmxpYyBNYXAgYmFzZVBsdWdpblVybE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbXBvcnREYXRhKCkgewotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgY29udGVudHMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXBsdWdpbnMuY2xlYXIoKTsKLQkJY29uZmlncy5jbGVhcigpOwotCQllcnJvci5lcnJvck1lc3NhZ2Uuc2V0TGVuZ3RoKDApOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgcGx1Z2lucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVBsdWdpbnMoKSB7Ci0JCVBsdWdpbkluZm8gaW5mbzsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IHBsdWdpbnMuc2l6ZSgpKSB7Ci0JCQlpbmZvID0gKFBsdWdpbkluZm8pIHBsdWdpbnMuZ2V0KGkpOwotCQkJaWYgKGluZm8udXJsID09IG51bGwpIHsKLQkJCQlwbHVnaW5zLnJlbW92ZShpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbkluZm8gb2JqZWN0IGdpdmVuIHRoZSBndWlkLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbmZvIGdldFBsdWdpbkluZm8oU3RyaW5nIGd1aWQpIHsKLQkJUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yPFBsdWdpbkluZm8+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLmd1aWQuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIGluZm87Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgUGx1Z2luSW5mbyBvYmplY3QgZ2l2ZW4gdGhlIGd1aWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luSW5mbyhTdHJpbmcgZ3VpZCkgewotCQlQbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3I8UGx1Z2luSW5mbz4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uZ3VpZC5lcXVhbHMoZ3VpZCkpIHsKLQkJCQlwbHVnaW5zLnJlbW92ZShpbmZvKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIENvbmZpZ3VhcmF0aW9uSW5mbyBvYmplY3QgZ2l2ZW4gdGhlIGd1aWQuCi0JICovCi0JcHVibGljIENvbmZpZ3VhcmF0aW9uSW5mbyBnZXRDb25maWdJbmZvKFN0cmluZyBndWlkKSB7Ci0KLQkJaWYgKCBndWlkID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGd1aWQuZXF1YWxzKGNpbmZvLmd1aWQpICkgewotCQkJCXJldHVybiBjaW5mbzsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgUGx1Z2luSW5mbyBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIFBsdWdpbkluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0PFBsdWdpbkluZm8+IGdldFBsdWdpbnMoKSB7Ci0JCXJldHVybiBwbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgQ29uZmlnSW5mbyBvYmplY3RzCi0JICogCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0Q29uZmlncygpIHsKLQkJcmV0dXJuIGNvbmZpZ3M7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGlmIGFueQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIEVycm9ySW5mbyBnZXRFcnJvckluZm8oKSB7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUGx1Z2luSW5mbyB7Ci0KLQkJLy8gSWYgbm90IG51bGwsIHRoaXMgaXMgYSB2YWxpZCBwbHVnLWluLgotCQlwdWJsaWMgU3RyaW5nIHVybCA9IG51bGw7Ci0KLQkJcHVibGljIFN0cmluZyBuYW1lOwotCi0JCXB1YmxpYyBTdHJpbmcgZ3VpZDsKLQotCQlwdWJsaWMgU3RyaW5nIHZlcnNpb247Ci0KLQkJcHVibGljIFN0cmluZyBicmllZl9kZXNjOwotCi0JCXB1YmxpYyBTdHJpbmcgYXV0aG9yczsKLQotCQlwdWJsaWMgU3RyaW5nIGNoYW5nZURhdGU7Ci0KLQkJcHVibGljIExpc3QgdXNlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gSWYgbnVsbCwgdGhpcyBwbHVnLWluIGRvZXMgbm90IGV4aXN0cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQlwdWJsaWMgTWV0aG9kUGx1Z2luIGV4aXN0aW5nUGx1Z2luID0gbnVsbDsKLQotCQkvLyBJZiB0cnVlLCByZXBsYWNlIHRoZSBjdXJyZW50IHBsdWctaW4gd2l0aCB0aGUgb25lIGluIHRoZSBpbXBvcnQKLQkJLy8gbGlicmFyeS4gSWYgZmFsc2UsIGRvbid0IGltcG9ydCB0aGUgcGx1Zy1pbi4KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgUGx1Z2luSW5mbygpIHsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDb25maWd1YXJhdGlvbkluZm8gewotCi0JCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQotCQlwdWJsaWMgU3RyaW5nIGd1aWQ7Ci0KLQkJcHVibGljIFN0cmluZyB2ZXJzaW9uOwotCi0JCS8vIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGV4aXN0aW5nQ29uZmlnID0gbnVsbDsKLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0KLQkJcHVibGljIENvbmZpZ3VhcmF0aW9uSW5mbygpIHsKLQkJfQotCi0JfQotCi0JcHVibGljIGNsYXNzIEVycm9ySW5mbyB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXJyb3JNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCXB1YmxpYyBFcnJvckluZm8oKSB7Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKLQkJCXJldHVybiBlcnJvck1lc3NhZ2UudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJZXJyb3JNZXNzYWdlLnNldExlbmd0aCgwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydGluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3YzQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydGluZ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkxpYnJhcnlEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEltcG9ydHMgYSBtZXRob2QgcGx1Zy1pbiBpbnRvIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luSW1wb3J0aW5nU2VydmljZSB7Ci0KLQlwcml2YXRlIFVwZ3JhZGVDYWxsZXJJbmZvIHVwR3JhZGVJbmZvOwotCQotCS8vVGVtcCBmbGFnIGluZGljYXRpbmcgdXNlIG9mIHRoZSBuZXcgbWVyZ2Ugc2NoZW1lCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuZXdNZXJnZVNjaGVtZSA9IHRydWU7IAotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCQotCXByaXZhdGUgUGx1Z2luSW1wb3J0RGF0YSBkYXRhOwotCQotCXByaXZhdGUgT2JqZWN0IHZhbGlkYXRlSG9va0RhdGE7Ci0KLQlMaWJyYXJ5RG9jdW1lbnQgaW1wb3J0aW5nTGliRG9jOwotCUxpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2M7Ci0KLQkvLyBGbGFnIHRvIGluZGljYXRlIHRoZSBmaWxlIGNoZWNrb3V0IHN0YXR1cy4KLQlJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gbnVsbDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBGaWxlIGRlZmF1bHRDb25maWdGb2xkZXI7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWxlPiB0YXJnZXRGaWxlTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luSW1wb3J0aW5nU2VydmljZShQbHVnaW5JbXBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHBsdWctaW4gYWdhaW5zdCB0aGUgY3VycmVudCBsaWJyYXJ5LCBjb2xsZWN0cyBhbGwgdGhlCi0JICogaW5mb3JtYXRpb25zIGluY2x1ZGluZyBwbHVnLWluIGluZm8sIGNvbmZpZ3VhdGlvbiBpbmZvIGFuZCBlcnJvciBpbmZvLgotCSAqIENhbGwgdGhpcyBtZXRob2QsIHRoZW4gY2FsbCBnZXRFcnJvcigpLCBnZXRQbHVnaW5zKCksIGdldENvbmZpZ3MoKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzApOyAKLQkJCX0KLQotCQkJaWYgKHRoaXMuZGF0YSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQl0aGlzLmRhdGEuY2xlYXIoKTsKLQotCQkJLy8gUHJlcGFyZSB0aGUgbGliIGZpbGVzLgotCQkJRmlsZSBpbXBvcnRpbmdMaWJQYXRoID0gbmV3IEZpbGUoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIExpYnJhcnlEb2N1bWVudC5leHBvcnRGaWxlKTsKLQkJCWlmICghaW1wb3J0aW5nTGliUGF0aC5leGlzdHMoKSkgewotCQkJCWRhdGEKLQkJCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxLCBpbXBvcnRpbmdMaWJQYXRoLnRvU3RyaW5nKCkpKTsgCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlib29sZWFuIGhhbmRsZVZlcnNpb24gPSB0cnVlOwotCQkJaWYgKGhhbmRsZVZlcnNpb24pIHsKLQkJCQl1cEdyYWRlSW5mbyA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5VcGdyYWRlSW5mbyhVcGdyYWRlQ2FsbGVySW5mby51cGdyYWRlSW1wb3J0UGx1Z2luLCBpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQlpZiAoISBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5oYW5kbGVUb29sVmVyc2lvbihpbXBvcnRpbmdMaWJQYXRoLCB1cEdyYWRlSW5mbykpIHsKLQkJCQkJZGF0YQotCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luLCBpbXBvcnRpbmdMaWJQYXRoLnRvU3RyaW5nKCkpKTsgCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCWltcG9ydGluZ0xpYlBhdGggPSB1cEdyYWRlSW5mby5nZXRDb3BpZWRMaWJGaWxlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgdmVyc2lvbkVycm9yID0gQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UudmVyc2lvbkNoZWNrKGltcG9ydGluZ0xpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUpOwotCQkJCWlmICh2ZXJzaW9uRXJyb3IgIT0gbnVsbCkgewotCQkJCQlkYXRhLmdldEVycm9ySW5mbygpLmFkZEVycm9yKHZlcnNpb25FcnJvcik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXZhbGlkYXRlSG9vayhtb25pdG9yLCBpbXBvcnRpbmdMaWJQYXRoLCB2YWxpZGF0ZUhvb2tEYXRhKTsKLQotCQkJaW1wb3J0aW5nTGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJdGFyZ2V0TGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChsaWJGaWxlKTsKLQotCQkJc2NhbkxpYnJhcnlGaWxlKGltcG9ydGluZ0xpYkRvYyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSG9vayhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZpbGUgaW1wb3J0aW5nTGliUGF0aCwgT2JqZWN0IG9iamVjdCkgewotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBpbXBvcnQuCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUltcG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIG5lZWQgdG8gZGlzYWJsZSB0aGUgd29ya3NwYWNlIHJlZnJlc2hpbmcKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQl0cnkgewotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkvLyBkaXNhYmxlIHJlc291cmNlIHJlZnJlc2hpbmcgZHVyaW5nIGltcG9ydAotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlfX2RvSW1wb3J0KG1vbml0b3IpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJCWlmICh1cEdyYWRlSW5mbyAhPSBudWxsKSB7Ci0JCQkJdXBHcmFkZUluZm8ucmVtb3ZlQ29waWVkTGlicmFyeSgpOwotCQkJCXVwR3JhZGVJbmZvID0gbnVsbDsKLQkJCX0KLQkJCWRlZmF1bHRDb25maWdGb2xkZXIgPSBudWxsOwotCQkJdGFyZ2V0RmlsZU1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX19kb0ltcG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzMpOyAKLQkJCX0KLQotCQkJTGlzdCB1bmxvY2tlZFBsdWdpbnMgPSB1bmxvY2tQbHVnaW5zKCk7Ci0JCQlpZiAoKGZpbGVDaGVja2VkT3V0U3RhdHVzICE9IG51bGwpCi0JCQkJCSYmICFmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkpIHsKLQkJCQkvLyBsb2cgZXJyb3IKLQkJCQlkaXNwbGF5Q2hlY2tPdXRFcnJvcigpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gVG8gaW1wb3J0IHRoZSBwbHVnLWlucywgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOgotCQkJLy8gMS4gRGVsZXRlIHRoZSBwbHVnLWlucyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGlmIHVzZXIgc3BlY2lmeQotCQkJLy8gcmVtb3ZlCi0JCQkvLyAyLiBDb3B5IHRoZSBzZWxlY3RlZCBwbHVnaW4gZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JCQkvLyAzLiBVcGRhdGUgdGhlIGxpYnJhcnkueG1pCi0JCQkvLyA0LiBSZWxvYWQgdGhlIGxpYnJhcnkKLQkJCQotCQkJRmlsZSBsaWJGaWxlID0gdGFyZ2V0TGliRG9jLmdldEZpbGUoKTsKLQkJCWRlZmF1bHRDb25maWdGb2xkZXIgPSBudWxsOwotCQkJdGFyZ2V0RmlsZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRmlsZT4oKTsKLQkJCQotCQkJaWYgKG5ld01lcmdlU2NoZW1lKSB7CQkJCi0JCQkJaWYgKCEgbWVyZ2UodGFyZ2V0TGliRG9jKSkgewotCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luOyAKLQkJCQkJCQluZXcgTXNnRGlhbG9nKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQkJbG9ja1VubG9ja2VkUGx1Z2lucyh1bmxvY2tlZFBsdWdpbnMpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfQotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbW9uaXRvcik7Ci0JCQkJcmV0dXJuOwotCQkJfQkJCQotCi0JCQkvLyAvLyBSZW1vdmUgZXhpc3RpbmcgZW50cmllcy4KLQkJCS8vIHJlbW92ZUV4aXN0aW5nRW50cmllcyh0YXJnZXRMaWJEb2MpOwotCi0JCQkvLyBJbXBvcnQgZW50cmllcyBhbmQgY29weSBmaWxlcy4KLQkJCWlmIChpbXBvcnRFbnRyaWVzKHRhcmdldExpYkRvYykpIHsKLQkJCQkvLyBTYXZlIHRoZSB1cGRhdGVkIGxpYnJhcnkgZmlsZS4KLQkJCQl0YXJnZXRMaWJEb2Muc2F2ZSgpOwotCi0JCQkJLy8gUmVwbGFjZSB0aGUgZ3VpZCBvZiB0aGUgb2xkIE1ldGhvZExpYnJhcnkgd2l0aCB0aGUgbmV3IG9uZS4KLQkJCQlmaXhMaWJyYXJ5R3VpZChsaWJGaWxlLmdldFBhcmVudEZpbGUoKSwgaW1wb3J0aW5nTGliRG9jCi0JCQkJCQkuZ2V0TGlicmFyeUd1aWQoKSwgdGFyZ2V0TGliRG9jLmdldExpYnJhcnlHdWlkKCkpOwotCi0JCQkJLy8gUmVvcGVuIHRoZSBsaWJyYXJ5LgotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJCS8vIEZpbmFsbHksIHJlLWxvY2sgdGhlIHVubG9ja2VkIHBsdWdpbnMgYW5kIHNhdmUgdGhlIGxpYnJhcnkKLQkJCQkvLyBhZ2Fpbi4KLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQkJbG9ja1VubG9ja2VkUGx1Z2lucyh1bmxvY2tlZFBsdWdpbnMpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmUtb3BlbiBsaWJyYXJ5IGFuZCBmcmVzaCB0aGUgd29ya3NwYWNlLgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQkvLyByZWZyZXNoIGxpYnJhcnkgZmlsZXMgaW4gd29ya3NwYWNlCi0JCQkvLwotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHVubG9ja1BsdWdpbnMoKSB7Ci0KLQkJTGlzdCBwbHVnaW5JZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kUGx1Z2luPigpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gYmFzZVBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGJhc2VQbHVnaW5zLmdldChpKTsKLQkJCW1hcC5wdXQocGx1Z2luLmdldE5hbWUoKSwgcGx1Z2luKTsKLQkJfQotCQlMaXN0PE1ldGhvZFBsdWdpbj4gcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQotCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoKGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgJiYgaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKLQkJCQkJaW5mby5leGlzdGluZ1BsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCXBsdWdpbklkcy5hZGQoaW5mby5leGlzdGluZ1BsdWdpbi5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBtYXAuZ2V0KGluZm8ubmFtZSk7Ci0JCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCAmJiAhIGJhc2VQbHVnaW4uZ2V0R3VpZCgpLmVxdWFscyhpbmZvLmd1aWQpCi0JCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCQlwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucy5hZGQoYmFzZVBsdWdpbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQloYW5kbGVFeHRyYVVubG9ja1BsdWdpbnMocGx1Z2luSWRzLCBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucyk7Ci0JCQotCQlyZXR1cm4gcGx1Z2luSWRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeHRyYVVubG9ja1BsdWdpbnMoTGlzdCBwbHVnaW5JZHMsCi0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMpIHsKLQkJaWYgKHBvc3NpYmxlRXh0cmFVbmxvY2tQbHVnaW5zID09IG51bGwgfHwgcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgZmlsZU5hbWVUb0NoZWNrID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc3NpYmxlRXh0cmFVbmxvY2tQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMuZ2V0KGkpOwotCQkJU3RyaW5nIGd1aWQgPSBwbHVnaW4uZ2V0R3VpZCgpOwotCQkJaWYgKCEgcGx1Z2luSWRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJcGx1Z2luLnNldFVzZXJDaGFuZ2VhYmxlKG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQlwbHVnaW5JZHMuYWRkKGd1aWQpOwotCQkJCVJlc291cmNlIHJlcyA9IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFVSSSgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlmaWxlTmFtZVRvQ2hlY2suYWRkKGZpbGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsZU5hbWVUb0NoZWNrLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IGZpbGVOYW1lVG9DaGVjazsJCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvY2tVbmxvY2tlZFBsdWdpbnMoTGlzdCB1bmxvY2tlZFBsdWdpbnMpIHsKLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuY29udGFpbnMocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbXBvcnRFbnRyaWVzKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MpIHsKLQkJLy8gMS4gRmluZCB0aGUgZW50cmllcyB0byBiZSByZW1vdmVkLgotCQlMaXN0IGltcG9ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSB7Ci0JCQkJCW5ld0xpc3QuYWRkKGluZm8uZ3VpZCk7Ci0JCQkJfQotCi0JCQkJaW1wb3J0TGlzdC5hZGQoaW5mby5ndWlkKTsKLQkJCX0KLQkJfQotCi0JCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY2luZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChjaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChjaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsKSB7Ci0JCQkJCW5ld0xpc3QuYWRkKGNpbmZvLmd1aWQpOwotCQkJCX0KLQotCQkJCWltcG9ydExpc3QuYWRkKGNpbmZvLmd1aWQpOwotCi0JCQl9Ci0JCX0KLQotCQkvLyAyLiBJdGVyYXRlIHRoZSBkb2N1ZW1udCBhbmQgYWRkIHRoZSBuZXcgZW50cmllcy4KLQkJaWYgKCFuZXdNZXJnZVNjaGVtZSkgewotCQkJaW1wb3J0TGliRW50cmllcyh0YXJnZXRMaWJEb2MsIG5ld0xpc3QpOwotCQl9IGVsc2UgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQllbnN1cmVVbmlxdWVOYW1lcyhsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCWVuc3VyZVVuaXF1ZU5hbWVzKGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvcHlGaWxlcyh0YXJnZXRMaWJEb2MsIGltcG9ydExpc3QsIG5ld0xpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRMaWJFbnRyaWVzKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIExpc3QgbmV3TGlzdCkgewotCi0JCWlmIChuZXdMaXN0ID09IG51bGwgfHwgbmV3TGlzdC5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQWRkIHBsdWctaW5zLgotCQlOb2RlTGlzdCBub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRHdWlkKG5vZGUpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkUGx1Z2luKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGNvbmZpZ3VyYXRpb25zLgotCQlub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0R3VpZChub2RlKTsKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0TGliRG9jLmFkZENvbmZpZ3VyYXRpb24obm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgcmVzb3VyY2UgZW50cmllcwotCQlub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2lkKTsKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0TGliRG9jLmFkZFJlc291cmNlKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIHRoZSByZXNvdXJjZSBzdWIgbWFuYWdlcnMuCi0JCW5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gTGlicmFyeURvY3VtZW50LmdldFN1Yk1hbmFnZXJCYXNlR3VpZChub2RlCi0JCQkJCS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZikpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkUmVzb3VyY2Uobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb3B5RmlsZXMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTGlzdCBpbXBvcnRMaXN0LAotCQkJTGlzdCBuZXdMaXN0KSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGltcG9ydExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgc3JjX3VyaSA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCVN0cmluZyB0YXJnZXRfdXJpOwotCQkJaWYgKHNyY191cmkgPT0gbnVsbCB8fCBzcmNfdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJdGFyZ2V0X3VyaSA9IHNyY191cmk7Ci0JCQkvKgotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRfdXJpID0gc3JjX3VyaTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFyZ2V0X3VyaSA9IHRhcmdldExpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsgLy8gdGhlIHJlc291cmNlCi0JCQkJLy8gbWlnaHQgYmUKLQkJCQkvLyByZW5hbWVkCi0JCQl9Ci0JCQkqLwotCi0JCQkvLyBDaGVjayB0aGUgcGx1Z2luLnhtaSBmaWxlLiBJZiBpdCBleGlzdHMsIGNvcHkgdGhlIGZvbGRlciB0bwotCQkJLy8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLQkJCWZpbmFsIEZpbGUgc3JjX2ZpbGUgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0RmlsZUZyb21Vcmkoc3JjX3VyaSk7Ci0JCQlpZiAoc3JjX2ZpbGUuZXhpc3RzKCkpIHsKLS8qCQkJCWZpbmFsIEZpbGUgdGFyZ2V0X2ZpbGUgPSB0YXJnZXRMaWJEb2MKLQkJCQkJCS5nZXRGaWxlRnJvbVVyaSh0YXJnZXRfdXJpKTsqLwotCQkJCQotCQkJCWZpbmFsIEZpbGUgdGFyZ2V0X2ZpbGUgPSBnZXRUYXJnZXRGaWxlKGxpYiwgZ3VpZCk7Ci0JCQkJaWYgKHRhcmdldF9maWxlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQl0YXJnZXRGaWxlTWFwLnB1dChndWlkLCB0YXJnZXRfZmlsZSk7Ci0KLQkJCQkvLyBpZiBpdCdzIGEgY29uZmlndXJhdGlvbiwgb25seSBjb3B5IHRoZSBmaWxlLAotCQkJCS8vIGlmIGl0J3MgYSBwbHVnaW4sIGNvcHkgdGhlIHdob2xlIGRpcmVjdG9yeQotCi0JCQkJaWYgKGRhdGEuZ2V0UGx1Z2luSW5mbyhndWlkKSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0YXJnZXRfZmlsZS5leGlzdHMoKSkgewotCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJRGlyQ29weSBjb3B5ID0gbmV3IERpckNvcHkoc3JjX2ZpbGUKLQkJCQkJCQkJCQkuZ2V0UGFyZW50RmlsZSgpLCB0YXJnZXRfZmlsZQotCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IGNvcHkuZXhlY3V0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29weURpcihzcmNfZmlsZS5nZXRQYXJlbnRGaWxlKCksIHRhcmdldF9maWxlCi0JCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChkYXRhLmdldENvbmZpZ0luZm8oZ3VpZCkgIT0gbnVsbCAmJiBEaXJDb3B5Lm5lZWRDb3B5KHNyY19maWxlLCB0YXJnZXRfZmlsZSkpIHsKLQkJCQkJZmluYWwgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKHRhcmdldF9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlmaWxlcy5hZGQodGFyZ2V0X2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlcgotCQkJCQkJCQkJCS5jaGVja01vZGlmeShmaWxlcyk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMgPT0gbnVsbAotCQkJCQkJCXx8IGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjX2ZpbGUsIHRhcmdldF9maWxlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkJCSYmICFmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkpIHsKLQkJCQkJLy8gbG9nIGVycm9yCi0JCQkJCWRpc3BsYXlDaGVja091dEVycm9yKCk7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5Q2hlY2tPdXRFcnJvcigpIHsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW47IAotCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywKLQkJCQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgZGlyZWN0b3JpZXMgZnJvbSAiZnJvbURpciIgdG8gInRvRGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIpIHsKLQkJQ29weSBjcCA9IG5ldyBDb3B5KCk7Ci0JCWNwLnNldE92ZXJ3cml0ZSh0cnVlKTsKLQkJRmlsZVNldCBzZXQgPSBuZXcgRmlsZVNldCgpOwotCQlzZXQuc2V0RXhjbHVkZXMoQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuZXhjbHVkZXMpOwotCQlzZXQuc2V0RGlyKGZyb21EaXIpOwotCQljcC5hZGRGaWxlc2V0KHNldCk7Ci0JCWNwLnNldFRvZGlyKHRvRGlyKTsKLQkJY3Auc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJY3AuZXhlY3V0ZSgpOwotCi0JfQotCi0JLy8gLyoqCi0JLy8gKiByZW1vdmUgdGhlIHBsdWdpbiBlbnRyeSBmcm9tIHRoZSBsaWJyYXJ5IGRvY3VtZW50Ci0JLy8gKgotCS8vICogQHBhcmFtIGRvY3VtZW50Ci0JLy8gKiBMaWJyYXJ5RG9jdW1lbnQKLQkvLyAqIEBwYXJhbSBndWlkCi0JLy8gKiBTdHJpbmcgZ3VpZCBvZiB0aGUgcGx1Z2luCi0JLy8gKi8KLQkvLyBwcml2YXRlIHZvaWQgcmVtb3ZlRXhpc3RpbmdFbnRyaWVzKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCS8vIC8vIDEuIEZpbmQgdGhlIGVudHJpZXMgdG8gYmUgcmVtb3ZlZC4KLQkvLyBMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkvLyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCS8vIGlmICgoaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JLy8gcmVtb3ZlTGlzdC5hZGQoaW5mby5ndWlkKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gY2luZm87Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0Q29uZmlncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkvLyBjaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCS8vIGlmICgoY2luZm8uZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgJiYgY2luZm8uc2VsZWN0ZWQpIHsKLQkvLyByZW1vdmVMaXN0LmFkZChjaW5mby5ndWlkKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gLy8gMi4gSXRlcmF0ZSB0aGUgZG9jdWVtbnQgYW5kIHJlbW92ZSB0aGUgZW50cmllcy4KLQkvLyBkb2N1bWVudC5yZW1vdmVQbHVnaW5zKHJlbW92ZUxpc3QpOwotCS8vIGRvY3VtZW50LnJlbW92ZUNvbmZpZ3VyYXRpb25zKHJlbW92ZUxpc3QpOwotCS8vIGRvY3VtZW50LnJlbW92ZVJlc291cmNlRW50cmllcyhyZW1vdmVMaXN0KTsKLQkvLyB9Ci0KLQkgLyoqIAotCSAgKiBWYWxpZGF0ZXMgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdmFsaWRhdGVTZWxlY3Rpb24oKSB7Ci0JCWlmICghIGlzQ2hlY2tCYXNlUGx1Z2lucygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlkYXRhLmdldEVycm9ySW5mbygpLmNsZWFyKCk7Ci0KLQkJLy8gSXRlcmF0ZSB0aGUgbmV3IHBsdWdpbnMsIG1ha2Ugc3VyZSB0aGUgYmFzZSBpcyBpbmNsdWRlZAotCQkvLyBlaXRoZXIgYXMgYW4gaW1wb3J0aW5nIHBsdWdpbiwgb3IgaXMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotCQkvLyBnZXQgdGhlIG1ldGhvZCBwbHVnaW5zIGluIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBwbHVnaW5zID0gKGxpYnJhcnkgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBsaWJyYXJ5Ci0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJTWFwIHBsdWdpbmlkcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlwbHVnaW5pZHMucHV0KHBsdWdpbi5nZXRHdWlkKCksIHBsdWdpbik7Ci0JCX0KLQotCQkvLyBUaGUgYmFzZSBwbHVnLWlucyBNVVNUIGJlIGVpdGhlciBhIHNlbGVjdGVkIG9uZSBvciBhbiBleGlzdGluZyBvbmUKLQkJLy8gb3RoZXJ3aXNlLCBjYW4ndCBpbXBvcnQKLQkJU2V0IGJhc2VQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsKLQotCQlTZXQgbmV3UGx1Z2lucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Ci0JCQkJCS5uZXh0KCk7Ci0JCQkvL2lmIChpbmZvLnNlbGVjdGVkICYmIChpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpKSB7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCW5ld1BsdWdpbnMuYWRkKGluZm8uZ3VpZCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGIgPSBpbmZvLnVzZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Yi5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBiYXNlID0gaXRiLm5leHQoKTsKLQkJCQkJaWYgKCFiYXNlUGx1Z2lucy5jb250YWlucyhiYXNlKSkgewotCQkJCQkJYmFzZVBsdWdpbnMuYWRkKGJhc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld1BsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGJhc2VQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgdXJpID0gKFN0cmluZykgZGF0YS5iYXNlUGx1Z2luVXJsTWFwLmdldChndWlkKTsKLQkJCQlpZiAoIW5ld1BsdWdpbnMuY29udGFpbnMoZ3VpZCkgJiYgIXBsdWdpbmlkcy5jb250YWluc0tleShndWlkKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1LCB1cmkpOyAKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXAgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0R3VpZFRvUGx1Z05hbWVNYXAoKTsKLQkJCQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZ3VpZFRvUGx1Z05hbWVNYXAgPT0gbnVsbCA/IG51bGwgOiBndWlkVG9QbHVnTmFtZU1hcC5nZXQoZ3VpZCk7Ci0JCQkJCQlpZiAocGx1Z2luTmFtZSA9PSBudWxsIHx8IHBsdWdpbk5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1LCBndWlkKTsgCQkKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzUsIAotCQkJCQkJCQkJcGx1Z2luTmFtZSArICIsICIgKyBndWlkKTsgCQkvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGF0YS5nZXRFcnJvckluZm8oKS5hZGRFcnJvcihtZXNzYWdlKTsKLQotCQkJCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGRhdGEuZ2V0RXJyb3JJbmZvKCkuZ2V0RXJyb3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2NhbkxpYnJhcnlGaWxlKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQl2aXNpdExpYlRhZyhkb2N1bWVudCk7Ci0JCXZpc2l0UmVzb3VyY2VUYWcoZG9jdW1lbnQpOwotCQlkYXRhLnZhbGlkYXRlUGx1Z2lucygpOwotCi0JCS8vIENoZWNrIGJhc2UgcGx1Zy1pbiBkZXBlbmRlbmNpZXMuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Ci0JCQkJCS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGJhc2UgPSBpbmZvLnVzZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0YmFzZQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdGJhc2UubmV4dCgpOwotCQkJCQlpZiAoIWRhdGEuYmFzZVBsdWdpblVybE1hcC5jb250YWluc0tleShndWlkKSkgewotCQkJCQkJZGF0YS5iYXNlUGx1Z2luVXJsTWFwLnB1dChndWlkLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGRhdGEuZ2V0UGx1Z2lucygpLnNpemUoKSA+IDEpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbz4oKSB7Ci0KLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIG8xLAotCQkJCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIG8yKSB7Ci0JCQkJCWlmIChvMSA9PSBvMikgewotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkJCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG8xLm5hbWUsIG8yLm5hbWUpOwotCi0JCQkJfQotCi0JCQl9OwotCi0JCQlDb2xsZWN0aW9ucy48UGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvPiBzb3J0KGRhdGEuZ2V0UGx1Z2lucygpLAotCQkJCQljb21wYXJhdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdExpYlRhZyhMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gUmVsb2FkIHRoZSBlbGVtZW50IG1hcHBpbmcuCi0JCU5vZGVMaXN0IG5vZGVzID0gZG9jdW1lbnQuZ2V0UGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIHBpID0gZGF0YS5uZXcgUGx1Z2luSW5mbygpOwotCQkJcGkuZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRHdWlkKG5vZGUpOwotCQkJZGF0YS5nZXRQbHVnaW5zKCkuYWRkKHBpKTsKLQotCQkJLy8gQ2hlY2sgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5LCBnZXQgdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24uCi0JCQlsb2FkRXhpc3RpbmdQbHVnaW5JbmZvKHBpKTsKLQkJfQotCi0JCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCWJ1aWxkQ29uZmlnSW5mb0Zyb21GaWxlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdFJlc291cmNlVGFnKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGRvY3VtZW50LmdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaWQpOwotCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX3VyaSk7Ci0KLQkJCS8vIExvYWQgdGhlIHBsdWdpbi54bWkgZmlsZSBmb3IgZGV0YWlsIGluZm9ybWF0aW9uLgotCQkJRmlsZSBmaWxlID0gZG9jdW1lbnQuZ2V0RmlsZUZyb21VcmkodXJpKTsKLQotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIHBpID0gZGF0YS5nZXRQbHVnaW5JbmZvKGd1aWQpOwotCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQlsb2FkUGx1Z2luSW5mbyhmaWxlLCBwaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gUmVtb3ZlIHRoZSBwbHVnLWluIGluZm8gZW50cnkgc2luY2UgdGhpYXMgaXMgbm90Ci0JCQkJCS8vIGEgdmFsaWQgcGx1Zy1pbiB0byBpbXBvcnQuCi0JCQkJCWRhdGEucmVtb3ZlUGx1Z2luSW5mbyhndWlkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIG5vdCBwbHVnaW4sIG1pZ2h0IGJlIGEgY29uZmlndXJhdGlvbgotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpID0gZGF0YQotCQkJCQkJLmdldENvbmZpZ0luZm8oZ3VpZCk7Ci0JCQkJaWYgKGNpICE9IG51bGwpIHsKLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWxvYWRDb25maWdJbmZvKGZpbGUsIGNpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb25maWdJbmZvKEZpbGUgc291cmNlLAotCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbykgewotCQl0cnkgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwoc291cmNlKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCQlFbGVtZW50IGNvbmZpZ1RhZyA9IG51bGw7Ci0JCQlpZiAocm9vdC5nZXRUYWdOYW1lKCkuZXF1YWxzKAotCQkJCQkib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQljb25maWdUYWcgPSByb290OwotCQkJfSBlbHNlIHsKLQkJCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QKLQkJCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWNvbmZpZ1RhZyA9IChFbGVtZW50KSBub2Rlcy5pdGVtKDApOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNvbmZpZ1RhZyAhPSBudWxsKSB7Ci0JCQkJaW5mby5uYW1lID0gY29uZmlnVGFnLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFBsdWdpbkluZm8oRmlsZSBzb3VyY2UsIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvKSB7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgcGx1Z2luVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlwbHVnaW5UYWcgPSByb290OwotCQkJfSBlbHNlIHsKLQkJCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QKLQkJCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJcGx1Z2luVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocGx1Z2luVGFnICE9IG51bGwpIHsKLQkJCQlpbmZvLm5hbWUgPSBwbHVnaW5UYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLnZlcnNpb24gPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby5icmllZl9kZXNjID0gTGlicmFyeURvY3VtZW50LmdldENoaWxkVmFsdWUocGx1Z2luVGFnLAotCQkJCQkJImJyaWVmRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8uYXV0aG9ycyA9IExpYnJhcnlEb2N1bWVudC5nZXRDaGlsZFZhbHVlKHBsdWdpblRhZywKLQkJCQkJCSJhdXRob3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLmNoYW5nZURhdGUgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkiY2hhbmdlRGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby51cmwgPSBzb3VyY2UudG9TdHJpbmcoKTsKLQotCQkJCS8vIEdldCB0aGUgYmFzZSBwbHVnLWlucy4KLQkJCQlOb2RlTGlzdCBub2RlcyA9IHBsdWdpblRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYmFzZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQotCQkJCQlpbnQgaW5keCA9IGd1aWQuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbmR4ID4gMCkgewotCQkJCQkJZ3VpZCA9IGd1aWQuc3Vic3RyaW5nKGluZHggKyAxKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZHggPSBndWlkLmluZGV4T2YoInVtYTovLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoaW5keCA+PSAwKSB7Ci0JCQkJCQkJZ3VpZCA9IGd1aWQuc3Vic3RyaW5nKGluZHggKyA2KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbmZvLnVzZWRQbHVnaW5zLmFkZChndWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeGlzdGluZ1BsdWdpbkluZm8oUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8pIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlMaXN0IHBsdWdpbnMgPSAobGlicmFyeSA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGxpYnJhcnkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHBsdWdpbi5nZXRHdWlkKCkuZXF1YWxzKGluZm8uZ3VpZCkpIHsKLQkJCQlpbmZvLmV4aXN0aW5nUGx1Z2luID0gcGx1Z2luOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeGlzdGluZ0NvbmZpZ0luZm8oUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbykgewotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWlmIChjb25maWdzID09IG51bGwgfHwgY29uZmlncy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0JCQlpZiAoY29uZmlnLmdldEd1aWQoKS5lcXVhbHMoaW5mby5ndWlkKSkgewotCQkJCWluZm8uZXhpc3RpbmdDb25maWcgPSBjb25maWc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZ3VpZCBvZiB0aGUgb2xkIG1ldGhvZCBsaWJyYXJ5IHdpdGggdGhlIG5ldyBvbmUuCi0JICogPHA+Ci0JICogU2VhcmNoIGZvciB0aGUgZm9sbG93aW5nIGZpbGVzOiBsaWJyYXJ5LnhtaSwgcGx1Z2luLnhtaSwgbW9kZWwueG1pLgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhMaWJyYXJ5R3VpZChGaWxlIHBhdGgsIFN0cmluZyBvbGRHdWlkLCBTdHJpbmcgbmV3R3VpZCkgewotCQlpZiAoIXBhdGguaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRmlsZVtdIGZpbGVzID0gcGF0aC5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKLQotCQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gbmFtZS5lcXVhbHMoImxpYnJhcnkueG1pIikgfHwgbmFtZS5lcXVhbHMoInBsdWdpbi54bWkiKSB8fCBuYW1lLmVxdWFscygibW9kZWwueG1pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0pOwotCi0JCWlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCWZpeExpYnJhcnlHdWlkKGZpbGVzW2ldLCBvbGRHdWlkLCBuZXdHdWlkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gUmVhZCBpbiB0aGUgZmlsZSwgdXBkYXRlIGl0IGFuZCBzYXZlIHRoZSBmaWxlLgotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBzb3VyY2UgPSBGaWxlVXRpbC5yZWFkRmlsZShmaWxlc1tpXSwKLQkJCQkJCQlGaWxlVXRpbC5FTkNPRElOR19VVEZfOCkudG9TdHJpbmcoKTsKLQkJCQkJaWYgKHNvdXJjZS5pbmRleE9mKG9sZEd1aWQpID49IDApIHsKLQkJCQkJCS8vIFRPRE86IFRoaXMgaXMgYSByZWdleHAgcmVwYWxjZW1lbnQsIGlzIGl0IHNhZmU/Ci0JCQkJCQlzb3VyY2UgPSBzb3VyY2UucmVwbGFjZUFsbChvbGRHdWlkLCBuZXdHdWlkKTsKLQotCQkJCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJCQkJc291cmNlKTsKLQkJCQkJfQotCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbWVyZ2UoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vQ29weSBmaWxlcyBvbmx5IGFzIG5ld01lcmdlU2NoZW1lID0gdHJ1ZQotCQlpZiAoISBpbXBvcnRFbnRyaWVzKHRhcmdldExpYkRvYykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCVJlc291cmNlIHJlczAgPSBsaWIuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IwID0gKFJlc291cmNlTWFuYWdlcikgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlczApOwotCQlSZXNvdXJjZVNldCByZXNTZXQgPSByZXMwLmdldFJlc291cmNlU2V0KCk7Ci0JCQotCQltZXJnZVBsdWdpbnModGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCk7CQkKLQkJbWVyZ2VDb25maWdzKHRhcmdldExpYkRvYywgbGliLCByZXNNZ3IwLCByZXNTZXQpOwotCQkKLQkJbGliLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkKLQkJc2F2ZShsaWIsIG51bGwpOwkJCQkKLQkJCi0JCS8vZml4TGlicmFyeUd1aWQodGFyZ2V0TGliRG9jLmdldEZpbGUoKS5nZXRQYXJlbnRGaWxlKCksIGltcG9ydGluZ0xpYkRvYwotCQkvLwkJLmdldExpYnJhcnlHdWlkKCksIHRhcmdldExpYkRvYy5nZXRMaWJyYXJ5R3VpZCgpKTsKLQkJCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCi0JCWlmICghIGlzQ2hlY2tCYXNlUGx1Z2lucygpKSB7Ci0JCQlsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGxpYik7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWlzc2luZ0Jhc2VQbHVnaW5zID0gY29sbGVjdE1pc3NpbmdCYXNlUGx1Z2lucyhsaWIpOwotCQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOy8vIGNvbGxlY3RJbXBvcnRlZENvbmZpZ3VyYXRpb25zKGxpYik7CQkJCi0JCQljaGVja01vZGlmeShjb25maWdzKTsKLQkJCWlmICghIG1pc3NpbmdCYXNlUGx1Z2lucy5pc0VtcHR5KCkgfHwgISBjb25maWdzLmlzRW1wdHkoKSkgewkJCQotCQkJCWxpYi5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsJCQkJCi0JCQkJU2V0PFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSA9IG5ldyBMaW5rZWRIYXNoU2V0PFJlc291cmNlPigpOwotCQkJCWNvbGxlY3RSZXNvdXJjZXN0b1NhdmUocmVzb3VyZXNUb1NhdmUsIG1pc3NpbmdCYXNlUGx1Z2lucyk7Ci0JCQkJY29sbGVjdFJlc291cmNlc3RvU2F2ZShyZXNvdXJlc1RvU2F2ZSwgY29uZmlncyk7Ci0JCQkJc2F2ZShsaWIsIHJlc291cmVzVG9TYXZlKTsJCQkJCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tNb2RpZnkoTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzKSB7Ci0JCWlmIChjb25maWdzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBMaXN0IGNvbmZpZ0ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlncy5nZXQoaSk7Ci0JCQlSZXNvdXJjZSByZXMgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQljb25maWdGaWxlcy5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkoY29uZmlnRmlsZXMpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PE1ldGhvZFBsdWdpbj4gY29sbGVjdE1pc3NpbmdCYXNlUGx1Z2lucyhNZXRob2RMaWJyYXJ5IGxpYikgewotCQlMaXN0PE1ldGhvZFBsdWdpbj4gcmV0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCQotCQlNYXAgbWFwID0gTWV0aG9kRWxlbWVudFV0aWwuYnVpbGRNYXAobGliLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLnNlbGVjdGVkICkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtYXAuZ2V0KGluZm8uZ3VpZCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlcyA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQkJCQlmb3IgKGludCBpPTA7IGkgPCBiYXNlcy5zaXplKCk7IGkrKykgewotCQkJCQkJTWV0aG9kUGx1Z2luIGJhc2UgPSBiYXNlcy5nZXQoaSk7Ci0JCQkJCQlpZiAoISBtYXAuY29udGFpbnNLZXkoYmFzZS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJcmV0LmFkZChwbHVnaW4pOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0OwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RSZXNvdXJjZXN0b1NhdmUoU2V0PFJlc291cmNlPiByZXNvdXJjZXMsIExpc3Q8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJZm9yIChpbnQgaT0wOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCWNvbGxlY3RSZXNvdXJjZXN0b1NhdmUocmVzb3VyY2VzLCBlbGVtZW50cy5nZXQoaSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb2xsZWN0UmVzb3VyY2VzdG9TYXZlKFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzLCBNZXRob2RFbGVtZW50IHBhcmVudCkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7CQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlSZXNvdXJjZSByZXMgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJUmVzb3VyY2UgcmVzID0gcGFyZW50LmVSZXNvdXJjZSgpOwotCQlyZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNhdmUoSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciwgU2V0PFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSkgCi0JCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAocmVzb3VyZXNUb1NhdmUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gcmVzb3VyZXNUb1NhdmUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlcyA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGl0Lm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKCEgcmVzLmlzU3luY2hyb25pemVkKCkpIHsKLQkJCQkJcmVzLmxvYWQocmVzLmdldFJlc291cmNlU2V0KCkuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0JCQkJfQotCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0JCi0KLQlwcml2YXRlIHZvaWQgc2F2ZShNZXRob2RMaWJyYXJ5IGxpYiwgU2V0PFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSkgewotCQkvL0xpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGxpYiwgZmFsc2UsIGZhbHNlKTsKLQkJCi0JCS8vVGhpcyBpcyB0ZW1wLCBhbmQgY2FuIGJlIHJldm9tdmVkIGFmdGVyIGEgZml4IGlzIGRvbmUgZm9yIHBhc3NpbmcgcGVyc2lzdGVyJ3Mgb3B0aW9uIHRvIHNhdmUKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCU1hcCBkZWZhdWx0U2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJT2JqZWN0IG9sZERlZmF1bHRPcHRpb25WYWwgPSBkZWZhdWx0U2F2ZU9wdGlvbnMuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKTsKLQkJCi0JCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCU1hcCBzYXZlT3B0aW9ucyA9IHBlcnNpc3Rlci5nZXRTYXZlT3B0aW9ucygpOwotCQlpZiAoISBpc0NoZWNrQmFzZVBsdWdpbnMoKSAmJiByZXNvdXJlc1RvU2F2ZSAhPSBudWxsKSB7Ci0JCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsIEJvb2xlYW4uVFJVRSk7Ci0JCQlkZWZhdWx0U2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLCBCb29sZWFuLlRSVUUpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXNhdmUocGVyc2lzdGVyLCByZXNvdXJlc1RvU2F2ZSk7Ci0JCQlwZXJzaXN0ZXIuc2F2ZShsaWIuZVJlc291cmNlKCkpOwotCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICghIGlzQ2hlY2tCYXNlUGx1Z2lucygpICYmIHJlc291cmVzVG9TYXZlICE9IG51bGwpIHsJCQkJCi0JCQkJaWYgKG9sZERlZmF1bHRPcHRpb25WYWwgPT0gbnVsbCkgewotCQkJCQlkZWZhdWx0U2F2ZU9wdGlvbnMucmVtb3ZlKE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkZWZhdWx0U2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLCBvbGREZWZhdWx0T3B0aW9uVmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWVyZ2VQbHVnaW5zKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIE1ldGhvZExpYnJhcnkgbGliLCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyMCwgUmVzb3VyY2VTZXQgcmVzU2V0KSB7Ci0JCUxpc3QgZXhpc3RpbmdQbHVnaW5HdWlkcyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLnNlbGVjdGVkICYmIGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJCWlmIChleGlzdGluZ1BsdWdpbkd1aWRzID09IG51bGwpIHsKLQkJCQkJZXhpc3RpbmdQbHVnaW5HdWlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl9Ci0JCQkJZXhpc3RpbmdQbHVnaW5HdWlkcy5hZGQoaW5mby5ndWlkKTsKLQkJCX0KLQkJfQotCQkKLQkJTWFwIHBnVG9SZ01hcCA9IGltcG9ydGluZ0xpYkRvYy5idWlsZFBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAoZXhpc3RpbmdQbHVnaW5HdWlkcyk7CQkJCQotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSB7Ci0JCQkJbWVyZ2VFbGVtZW50KGluZm8uZ3VpZCwgdGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCwgbGliLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQl9IGVsc2UgaWYgKGluZm8uc2VsZWN0ZWQgJiYgcGdUb1JnTWFwICE9IG51bGwpIHsJLy8xNTE3ODYKLQkJCQlSZXNvdXJjZSByZXMgPSBpbmZvLmV4aXN0aW5nUGx1Z2luLmVSZXNvdXJjZSgpOwotCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJCQlTdHJpbmcgZXhpc3RpbmdHdWlkID0gcmVzTWdyLmdldEd1aWQoKTsKLQkJCQlTdHJpbmcgaW1wb3J0ZWRHdWlkID0gKFN0cmluZykgcGdUb1JnTWFwLmdldChpbmZvLmd1aWQpOwotCQkJCWlmIChpbXBvcnRlZEd1aWQgIT0gbnVsbCAmJiAhaW1wb3J0ZWRHdWlkLmVxdWFscyhleGlzdGluZ0d1aWQpKSB7Ci0JCQkJCXJlc01nci5zZXRHdWlkKGltcG9ydGVkR3VpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtZXJnZUNvbmZpZ3MoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTWV0aG9kTGlicmFyeSBsaWIsIFJlc291cmNlTWFuYWdlciByZXNNZ3IwLCBSZXNvdXJjZVNldCByZXNTZXQpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0Q29uZmlncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLnNlbGVjdGVkICYmIGluZm8uZXhpc3RpbmdDb25maWcgPT0gbnVsbCkgewotCQkJCW1lcmdlRWxlbWVudChpbmZvLmd1aWQsIHRhcmdldExpYkRvYywgbGliLCByZXNNZ3IwLCByZXNTZXQsIGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCQl9CQkJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWVyZ2VFbGVtZW50KFN0cmluZyBndWlkLCBMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCAKLQkJCU1ldGhvZExpYnJhcnkgbGliLCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyMCwgUmVzb3VyY2VTZXQgcmVzU2V0LCBMaXN0IGVsZW1lbnRzKXsKLQkJU3RyaW5nIHNyY191cmkgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCWlmIChzcmNfdXJpID09IG51bGwgfHwgc3JjX3VyaS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy9GaWxlIHRhcmdldF9maWxlID0gdGFyZ2V0TGliRG9jLmdldEZpbGVGcm9tVXJpKHNyY191cmkpOwotCQlGaWxlIHRhcmdldF9maWxlID0gdGFyZ2V0RmlsZU1hcC5nZXQoZ3VpZCk7Ci0JCQotCQlTdHJpbmcgcGF0aCA9IHRhcmdldF9maWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlSZXNvdXJjZSByZXMgPSByZXNTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwkJCi0JCQotCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyMCwgZWxlbWVudCwgdXJpKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihyZXMpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCXJlc01ncjAuZ2V0U3ViTWFuYWdlcnMoKS5hZGQocmVzTWdyKTsKLQkJfQotCX0JCQotCQotCXByaXZhdGUgdm9pZCBidWlsZENvbmZpZ0luZm9Gcm9tRmlsZXMoKSB7CQotCQlGaWxlIGNvcGllZExpYlBhdGggPSB1cEdyYWRlSW5mbyA9PSBudWxsID8gbnVsbCA6IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJRmlsZSBpbXBvcnRpbmdMaWJQYXRoID0gY29waWVkTGliUGF0aCA9PSBudWxsID8gbmV3IEZpbGUoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmV4cG9ydEZpbGUpIDogY29waWVkTGliUGF0aDsKLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpLCBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCQotCQlMaWJyYXJ5RG9jdW1lbnQuQ29uZmlnRG9jVmlzaXRvciB2aXNpdG9yID0gbmV3IExpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yKCkgewotCQkJcHVibGljIHZvaWQgdmlzaXQoRmlsZSBmaWxlLCBFbGVtZW50IG5vZGUpIHsKLQkJCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaSA9IGRhdGEubmV3IENvbmZpZ3VhcmF0aW9uSW5mbygpOwotCQkJCWNpLmd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ndWlkKTsKLQkJCQljaS5uYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZS5nZXROYW1lKCk7Ci0JCQkJaW1wb3J0aW5nTGliRG9jLmFkZFRvR3VpZFRvVXJpTWFwKGNpLmd1aWQsIHVyaSk7Ci0JCQkJZGF0YS5nZXRDb25maWdzKCkuYWRkKGNpKTsKLQkJCQkvLyBDaGVjayB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnksIGdldCB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbi4KLQkJCQlsb2FkRXhpc3RpbmdDb25maWdJbmZvKGNpKTsKLQkJCQlpZiAoY2kuZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJCQlVUkkgcmVzVXJpID0gY2kuZXhpc3RpbmdDb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQkJdXJpID0gdGFyZ2V0TGliRG9jLmRlY29kZVVyaSh1cmkpOwotCQkJCQl0YXJnZXRMaWJEb2MuYWRkVG9HdWlkVG9VcmlNYXAoY2kuZ3VpZCwgdXJpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlMaWJyYXJ5RG9jdW1lbnQudmlzaXRDb25maWdGaWxlcyhjb25maWdEaXIsIHZpc2l0b3IpOwkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVVuaXF1ZU5hbWVzKExpc3QgZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1hcCBuYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50cy5nZXQoaSk7Ci0JCQluYW1lTWFwLnB1dChlbGVtLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLCBlbGVtKTsKLQkJfQotCQkKLQkJTGlzdCBpbXBvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW1wb3J0ZWRFeGlzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlbGVtZW50cy5nZXQoMCkgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGluZm8uc2VsZWN0ZWQpIHsKLQkJCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCB8fCAKLQkJCQkJCQkhaW5mby5leGlzdGluZ1BsdWdpbi5nZXROYW1lKCkuZXF1YWxzKGluZm8ubmFtZSkpIHsKLQkJCQkJCWltcG9ydGVkTGlzdC5hZGQoaW5mby5uYW1lKTsKLQkJCQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpIHsKLQkJCQkJCQlpbXBvcnRlZEV4aXN0TGlzdC5hZGQoaW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCQlpZiAoaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsIHx8IAotCQkJCQkJCSFpbmZvLmV4aXN0aW5nQ29uZmlnLmdldE5hbWUoKS5lcXVhbHMoaW5mby5uYW1lKSkgewotCQkJCQkJaW1wb3J0ZWRMaXN0LmFkZChpbmZvLm5hbWUpOwotCQkJCQkJaWYgKGluZm8uZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJCQkJCWltcG9ydGVkRXhpc3RMaXN0LmFkZChpbmZvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGltcG9ydGVkTGlzdC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpbXBvcnRlZExpc3QuZ2V0KGkpOwotCQkJU3RyaW5nIHJlbmFtZWQgPSBuYW1lOwotCQkJd2hpbGUgKG5hbWVNYXAuY29udGFpbnNLZXkocmVuYW1lZC50b1VwcGVyQ2FzZSgpKSkgewotCQkJCXJlbmFtZWQgKz0gIl9yZW5hbWVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJlbmFtZWQgIT0gbmFtZSkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBuYW1lTWFwLmdldChuYW1lLnRvVXBwZXJDYXNlKCkpOwotCQkJCUxpYnJhcnlWaWV3LnJ1blJlbmFtZShlbGVtLCByZW5hbWVkKTsKLQkJCX0JCQkKLQkJfQkJCQkKLQkJZm9yIChpbnQgaT0wOyBpPGltcG9ydGVkRXhpc3RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgaW5mbyA9IGltcG9ydGVkRXhpc3RMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8gaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gPyAKLQkJCQkJKE1ldGhvZEVsZW1lbnQpKChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGluZm8pLmV4aXN0aW5nUGx1Z2luIDoKLQkJCQkJKE1ldGhvZEVsZW1lbnQpKChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaW5mbykuZXhpc3RpbmdDb25maWc7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IGluZm8gaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gPyAKLQkJCQkJKFN0cmluZykoKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaW5mbykubmFtZSA6Ci0JCQkJCShTdHJpbmcpKChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaW5mbykubmFtZTsJCQkJCQkJCQotCQkJTGlicmFyeVZpZXcucnVuUmVuYW1lKGVsZW0sIG5ld05hbWUpOwkJCi0JCX0JCi0JCQotCQkKLQkJCi0JfQotCQotCXByaXZhdGUgRmlsZSBnZXRUYXJnZXRGaWxlKGZpbmFsIE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgZ3VpZCkgewotCQlGaWxlIHBhcmVudCA9IG51bGw7Ci0JCWZpbmFsIEZpbGVbXSBwZmlsZXMgPSBuZXcgRmlsZVsxXTsgCi0JCWZpbmFsIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKTsKLQkJQ29uZmlndWFyYXRpb25JbmZvIGNpbmZvID0gZGF0YS5nZXRDb25maWdJbmZvKGd1aWQpOwotCQlpZiAoY2luZm8gIT0gbnVsbCkgewotCQkJRmlsZSBmaWxlID0gZ2V0UmVzb3VyY2VGaWxlKGNpbmZvLmV4aXN0aW5nQ29uZmlnKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJCWlmIChkZWZhdWx0Q29uZmlnRm9sZGVyID09IG51bGwpIHsKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBmaWxlc1swXSA9IHBlcnNpc3Rlci5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihsaWIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcGFyZW50ID0gcGZpbGVzWzBdOwotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJZGVmYXVsdENvbmZpZ0ZvbGRlciA9IHBhcmVudDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyZW50ID0gZGVmYXVsdENvbmZpZ0ZvbGRlcjsKLQkJCX0KLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGVmYXVsdENvbmZpZ0ZvbGRlcjogIiArIHBhcmVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVBsdWdpbkluZm8gcGluZm8gPSBkYXRhLmdldFBsdWdpbkluZm8oZ3VpZCk7Ci0JCQlpZiAocGluZm8gIT0gbnVsbCkgewotCQkJCUZpbGUgZmlsZSA9IGdldFJlc291cmNlRmlsZShwaW5mby5leGlzdGluZ1BsdWdpbik7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmlsZTsKLQkJCQl9Ci0JCQkJcGFyZW50ID0gcGVyc2lzdGVyLmNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihwaW5mby5uYW1lLCBsaWIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBmaWxlTmFtZSA9IGNpbmZvID09IG51bGwgPyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX1BMVUdJTl9NT0RFTF9GSUxFTkFNRSA6IAotCQkJCQkJCQkJY2luZm8ubmFtZSArIE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfRklMRV9FWFRFTlNJT047CQotCQlyZXR1cm4gbmV3IEZpbGUocGFyZW50LCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja0Jhc2VQbHVnaW5zKCkgewotCQlyZXR1cm4gY2hlY2tCYXNlUGx1Z2luczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja0Jhc2VQbHVnaW5zKGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucykgewotCQl0aGlzLmNoZWNrQmFzZVBsdWdpbnMgPSBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQkKLQlwcml2YXRlIEZpbGUgZ2V0UmVzb3VyY2VGaWxlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlSZXNvdXJjZSByZXMgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOwotCQlyZXR1cm4gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlSG9va0RhdGEoKSB7Ci0JCXJldHVybiB2YWxpZGF0ZUhvb2tEYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlSG9va0RhdGEoT2JqZWN0IHZhbGlkYXRlSG9va0RhdGEpIHsKLQkJdGhpcy52YWxpZGF0ZUhvb2tEYXRhID0gdmFsaWRhdGVIb29rRGF0YTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9SZXNvdXJjZVNjYW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUmVzb3VyY2VTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzliYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9SZXNvdXJjZVNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBzY2FuIGFuZCBjb3B5IHJlc291cmNlcyBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTY2FubmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3NyY19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoInNyY1xccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIjxhXFxzKz8oW14+XSopPiguKj8pPC9hPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2hyZWZfcmVmID0gUGF0dGVybi5jb21waWxlKCJocmVmXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlGaWxlIHNyY0xpYlJvb3Q7Ci0JRmlsZSB0YXJnZXRMaWJSb290OwotCQotCXByaXZhdGUgTWFwIG5ld0ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGV4aXN0aW5nRmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JTWFwPFN0cmluZywgU3RyaW5nPiByZW5hbWVQbHVnaW5NYXA7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIFJlc291cmNlU2Nhbm5lcihGaWxlIHNyY0xpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCwgTWFwPFN0cmluZywgU3RyaW5nPiByZW5hbWVQbHVnaW5NYXApIHsKLQkJdGhpcy5zcmNMaWJSb290ID0gc3JjTGliUm9vdDsKLQkJdGhpcy50YXJnZXRMaWJSb290ID0gdGFyZ2V0TGliUm9vdDsKLQkJdGhpcy5yZW5hbWVQbHVnaW5NYXAgPSByZW5hbWVQbHVnaW5NYXA7Ci0JfQotCQotCS8qKgotCSAqIHNjYW4gdGggZXRleHQgYW5kIGNvcHkgdGhlIHJlc291cmNlcwotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHNvdXJjZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzY2FuKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBzb3VyY2UpIHsKLQkJCi0JCXRyeQotCQl7Ci0JCQkvLyBwcm9jZXNzIGltYWdlcyBhbmQgb3RoZXIgc3JjIHJlc291cmNlcwotCQkJTWF0Y2hlciBtID0gcF9zcmNfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXdoaWxlICggbS5maW5kKCkgKQotCQkJewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDEpOwotCQkJCXByb2Nlc3NVcmwob3duZXIsIHVybCk7Ci0JCQl9Ci0KLQkJCS8vIHByb2Nlc3MgaHJlZnMKLQkJCW0gPSBwX2hyZWZfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCQotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQkJCX0JCQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQl7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBwcm9jZXNzIHRoZSB1cmwgYW5kIGNvcHkgdGhlIHJlc291cmNlCi0JICogaWYgdGhlIG93bmVyIGVsZW1lbnQgaXMgc3BlY2lmaWVkLCB0aGUgdXJsIGlzIHJlbGF0aXZlIHRvIHRoZSBvd25lciBlbGVtZW50LCAKLQkgKm90aGVyd2lzZSBpdCdzIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5Ci0JICoKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gdXJsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NVcmwoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCkgewotCQlwcm9jZXNzVXJsKG93bmVyLCB1cmwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1VybChNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCQotCQlpZiAoIHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpbnQgaW5kZXggPSB1cmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaW5kZXggPj0gMCApCi0JCXsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlpbmRleCA9IHVybC5pbmRleE9mKCI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA+PSAwICkKLQkJewotCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQkJCi0JCWlmICh1cmwudHJpbSgpLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHRoZSB1cmwgaXMgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQKLQkJLy8gbmVlZCB0byBjb252ZXJ0IHRvIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkJRmlsZSBzcmNGaWxlID0gbnVsbDsKLQkJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICggb3duZXIgIT0gbnVsbCApIHsKLQkJCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihvd25lcik7Ci0JCQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgob3duZXIpOwotCQkJCS8vc3JjRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHNyY0xpYlJvb3QsIGVsZW1lbnRQYXRoKSwgdXJsKTsKLQkJCQkvL2lmICghc3JjRmlsZS5pc0ZpbGUoKSB8fCAhc3JjRmlsZS5leGlzdHMoKSkgewotCQkJCQllbGVtZW50UGF0aCA9IGdldEVsZW1lbnRQYXRoV2l0aFJlbmFtZWRQbHVnaW4oZWxlbWVudFBhdGgpOwotCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUoc3JjTGliUm9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwotCQkJCS8vfQotCQkJCWlmICghc3JjRmlsZS5pc0ZpbGUoKSB8fCAhc3JjRmlsZS5leGlzdHMoKSkgewotCQkJCQl1cmwgPSBOZXRVdGlsLmRlY29kZVVSTCh1cmwpOwotCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUoc3JjTGliUm9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwotCQkJCX0KLQkJCQkvL3RhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBlbGVtZW50UGF0aCksIHVybCk7Ci0JCQkJU3RyaW5nIHBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKG93bmVyKTsKLQkJCQlGaWxlIHRhcmdldFJvb3QgPSAobmV3IEZpbGUocGx1Z2luUGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUodGFyZ2V0Um9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQkJfQkJCQotCQkJCUZpbGUgc3JjUGx1Z2luUm9vdCA9IG5ldyBGaWxlKHNyY0xpYlJvb3QsIHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290LCB1cmwpOwotCQkJCWlmICghc3JjRmlsZS5pc0ZpbGUoKSB8fCAhc3JjRmlsZS5leGlzdHMoKSkgewotCQkJCQl1cmwgPSBOZXRVdGlsLmRlY29kZVVSTCh1cmwpOwotCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUoc3JjUGx1Z2luUm9vdCwgdXJsKTsKLQkJCQl9Ci0JCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IocGx1Z2luKTsJCQkJCi0JCQkJU3RyaW5nIHNyY1BsdWdpblJvb3RQYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChwbHVnaW4pOwkKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUoc3JjUGx1Z2luUm9vdFBhdGgsIHVybCk7CQkJCQotCQkJfQotCQkJCi0JCQlpZiAoIHNyY0ZpbGUuaXNGaWxlKCkgJiYgc3JjRmlsZS5leGlzdHMoKSApIHsKLQotCQkJCXNyY0ZpbGUgPSBzcmNGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCQl0YXJnZXRGaWxlID0gdGFyZ2V0RmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQkJCi0JCQkJaWYgKCB0YXJnZXRGaWxlLmV4aXN0cygpICkgewotCQkJCQlpZiAoICFleGlzdGluZ0ZpbGVNYXAuY29udGFpbnNLZXkoc3JjRmlsZSkgKSB7Ci0JCQkJCQlpZiAoIHNyY0ZpbGUubGVuZ3RoKCkgIT0gdGFyZ2V0RmlsZS5sZW5ndGgoKSAKLQkJCQkJCQkJfHwgc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSAhPSB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpICkKLQkJCQkJCXsKLQkJCQkJCQlleGlzdGluZ0ZpbGVNYXAucHV0KHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCAhbmV3RmlsZU1hcC5jb250YWluc0tleShzcmNGaWxlKSApIHsKLQkJCQkJCW5ld0ZpbGVNYXAucHV0KHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBMb2cgdGhlIGVycm9yIGFuZCBwcm9jZWVkLiBUT0RPCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50UGF0aFdpdGhSZW5hbWVkUGx1Z2luKFN0cmluZyBlbGVtZW50UGF0aCkgewotCQlpZiAocmVuYW1lUGx1Z2luTWFwICE9IG51bGwgJiYgISByZW5hbWVQbHVnaW5NYXAuaXNFbXB0eSgpKSB7Ci0JCQlpbnQgaXggPSBlbGVtZW50UGF0aC5pbmRleE9mKCJcXCIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChpeCA+IDApIHsKLQkJCQlTdHJpbmcgYmFzZVBsdWdpbk5hbWUgPSAgZWxlbWVudFBhdGguc3Vic3RyaW5nKDAsIGl4KTsKLQkJCQlTdHJpbmcgaW1wb3J0UGx1Z2luTmFtZSA9IHJlbmFtZVBsdWdpbk1hcC5nZXQoYmFzZVBsdWdpbk5hbWUpOwotCQkJCWlmIChpbXBvcnRQbHVnaW5OYW1lICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGltcG9ydFBsdWdpbk5hbWUgKyBlbGVtZW50UGF0aC5zdWJzdHJpbmcoaXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudFBhdGg7Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHVybCwgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlwcm9jZXNzVXJsKG51bGwsIHVybCwgcGx1Z2luKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsKSB7Ci0JCXByb2Nlc3NVcmwob3duZXIsIHVybCk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyB0byBiZSByZXBsYWNlZAotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgZmlsZSBwYXRoIHN0cmluZwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbGVzVG9iZVJlcGxhY2VkKCkgewotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIGV4aXN0aW5nRmlsZU1hcC5zaXplKCkgPiAwICkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGV4aXN0aW5nRmlsZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCUZpbGUgZiA9IChGaWxlKWl0Lm5leHQoKTsKLQkJCQlpZiAoZiAhPSBudWxsICkgewotCQkJCQlTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCWlmICggIWZpbGVzLmNvbnRhaW5zKHBhdGgpICkgewotCQkJCQkJZmlsZXMuYWRkKHBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCQotCS8qKgotCSAqIGNvcHkgYWxsIHRoZSBmaWxlcyB0byB0aGUgZGVzdGluYXRpb24KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3RmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCUZpbGUgc3JjRmlsZSA9IChGaWxlKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUZpbGUgdGFyZ2V0RmlsZSA9IChGaWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCX0JCi0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXhpc3RpbmdGaWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJRmlsZSBzcmNGaWxlID0gKEZpbGUpIGVudHJ5LmdldEtleSgpOwotCQkJRmlsZSB0YXJnZXRGaWxlID0gKEZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJfQkKLQl9Ci0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIxMTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gaW1wb3J0IHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzJhN2JlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuRWxlbWVudERpZmZUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgZGlmZiByZXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlcigpIHsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGlmZlRyZWUpIHsKLQkJCQotCQkJTWV0aG9kRWxlbWVudCBlID0gKChFbGVtZW50RGlmZlRyZWUpaW5wdXRFbGVtZW50KS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCi0JCQkvLyBkb24ndCBzaG93IHN1Yi1wYWNrYWdlcyB1bmRlciBwcm9jZXNzIGNvbXBvbmVudCwgaGlkZSB0aGUgcHJvY2VzcyBkZXRpYWwKLQkJCWlmICggKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSApIHsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCQkJfQotCi0JCQlMaXN0IGl0ZW1zID0gKChFbGVtZW50RGlmZlRyZWUpIGlucHV0RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQkJTGlzdCBkaXJ0eUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVsZW1lbnREaWZmVHJlZSBpdGVtID0gKEVsZW1lbnREaWZmVHJlZSkgaXQubmV4dCgpOwotCQkJCQlpZiAoaXRlbS5pc09sZE9ubHkoKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIDE1MDg5NUltcG9ydCBDb25maWc6IEN1c3RvbUNhdGVnb3J5IGRpZCBub3Qgc3luYyB1cCBieSBpbXBvcnQKLQkJCQkJLy8gdG8gZml4IHRoaXMgcHJvYmxlbSwgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBIaWRkZW4gcm9vdCBjdXN0b21DYXRlZ29yeSBwYWNrYWdlIAotCQkJCQkvLyBidXQgbmVlZCB0byBoaWRlIGhlcmUKLQkJCQkJTWV0aG9kRWxlbWVudCBiYXNlID0gaXRlbS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCQlpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgCi0JCQkJCQkJJiYgVG5nVXRpbC5pc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZSgoTWV0aG9kUGFja2FnZSliYXNlKSApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlkaXJ0eUl0ZW1zLmFkZChpdGVtKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8RWxlbWVudERpZmZUcmVlPigpIHsKLQkJCQkJCXB1YmxpYyBpbnQgY29tcGFyZShFbGVtZW50RGlmZlRyZWUgbzEsIEVsZW1lbnREaWZmVHJlZSBvMikgewotCQkJCQkJCWlmIChvMSA9PSBvMikgewotCQkJCQkJCQlyZXR1cm4gMDsKLQkJCQkJCQl9Ci0JCQkJCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCQkJCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG8xLmdldE5hbWUoKSwgbzIuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJQ29sbGVjdGlvbnMuPEVsZW1lbnREaWZmVHJlZT4gc29ydChkaXJ0eUl0ZW1zLCBjb21wYXJhdG9yKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGRpcnR5SXRlbXMudG9BcnJheSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50cyhwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGlmZlRyZWUpIHsKLQkJCXJldHVybiAoKEVsZW1lbnREaWZmVHJlZSkgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGlmZlRyZWUpIHsKLQkJCXJldHVybiAoKEVsZW1lbnREaWZmVHJlZSkgZWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGM5ZmMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkVsZW1lbnREaWZmVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgZGlmZiByZXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmUmVwb3J0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyLAotCQlJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUZyb21PYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlID0gKEVsZW1lbnREaWZmVHJlZSkgb2JqZWN0OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlyZXR1cm4gZGlmZlRyZWUuZ2V0TmFtZSgpOwotCi0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCQlyZXR1cm4gZGlmZlRyZWUuZ2V0Q29udGVudFR5cGUoKTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikgewotCQkJCXJldHVybiAoZGlmZlRyZWUuZ2V0SW1wb3J0RWxlbWVudCgpID09IG51bGwpID8gIiIgOiBJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzOyAvLyROT04tTkxTLTEkCQkJCi0gCi0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDMpIHsKLQkJCQlyZXR1cm4gKGRpZmZUcmVlLmdldEJhc2VFbGVtZW50KCkgPT0gbnVsbCkgPyAiIiA6IEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM7IC8vJE5PTi1OTFMtMSQJCQotIAotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSA0KSB7Ci0JCQkJcmV0dXJuIGRpZmZUcmVlLmdldERpZmZNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblRleHQob2JqZWN0LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB3ZSB3b24ndCBldmVyIGdlbmVyYXRlIHRoZXNlIG5vdGlmaWNhdGlvbnMsIHdlIGNhbiBqdXN0IGlnbm9yZQotCSAqIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qKgotCSAqIFNpbmNlIHdlIHdvbid0IGV2ZXIgYWRkIGxpc3RlbmVycywgd2UgY2FuIGp1c3QgaWdub3JlIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qKgotCSAqIEFsd2F5cyByZXR1cm5zIHRydWUgZm9yIG5vdy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGlkKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydFZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmNjQwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBiZWZvcmUgYW5kIGFmdGVyIG1ldGhvZCBsaWJyYXJ5IGRpZmZlcmVuY2VzIGZvciBhbiBpbXBvcnQKLSAqIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlmZlJlcG9ydFZpZXdlciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByb3RlY3RlZCBDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCUNvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGE7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlEaWZmUmVwb3J0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JCQotCQl0cmVlVmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcihwYXJlbnQpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKQotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IERpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIoKSk7Ci0JCWNyZWF0ZVRhYmxlQ29sdW1ucygpOwotCQkKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYmxlIGNvbHVtbnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlQ29sdW1ucygpIHsKLQkJVHJlZSB0cmVlID0gdHJlZVZpZXdlci5nZXRUcmVlKCk7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgMCk7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQpOyAKLQkJY29sdW1uLnNldFdpZHRoKDIwMCk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDEpOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl90eXBlKTsgCi0JCWNvbHVtbi5zZXRXaWR0aCgxNTApOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCAyKTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0KTsgCi0JCWNvbHVtbi5zZXRXaWR0aCg3NSk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDMpOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9pbl9saWIpOyAKLQkJY29sdW1uLnNldFdpZHRoKDc1KTsKLQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgNCk7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cyk7IAotCQljb2x1bW4uc2V0V2lkdGgoMTAwKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgcmV2aXcuCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1JlcG9ydChPYmplY3QgaW5wdXQpIHsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlzZXRDaGVja1N0YXRlcygpOwotCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8vIGFkZCBhIGNoZWNrIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcgotCQl0cmVlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0JCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoZXZlbnQuZ2V0RWxlbWVudCgpLCBjaGVja2VkKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDaGVja1N0YXRlcyhPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0KLQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGNoZWNrZWQgPT0gdHJ1ZSkgewotCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJY2hlY2tQYXJlbnQoY3AsIGVsZW1lbnQpOwotCQkJLy8gdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQl9Ci0JCWVsc2UKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCBmYWxzZSk7Ci0JCQkKLQkJc2VsZWN0aW9uQ2hpbGRyZW4oZWxlbWVudCwgY2hlY2tlZCk7Ci0KLQkJc2V0RGF0YSh0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGlsZHJlbihPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB0cmVlVmlld2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlPYmplY3RbXSBjaGlsZHMgPSBjcC5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjaGlsZHNbaV0sIGNoZWNrZWQpOwotCQkJc2VsZWN0aW9uQ2hpbGRyZW4oY2hpbGRzW2ldLCBjaGVja2VkKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFyZW50KElUcmVlQ29udGVudFByb3ZpZGVyIGNwLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IC8qCi0JCQkJCQkJCQkJCQkJCQkJICogfHwgZWxlbWVudCA9PQotCQkJCQkJCQkJCQkJCQkJCSAqIGN1cnJlbnRSb290Tm9kZQotCQkJCQkJCQkJCQkJCQkJCSAqLykgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9iamVjdCBwYXJlbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoY3AuZ2V0UGFyZW50KGVsZW1lbnQpKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLnNldENoZWNrZWQocGFyZW50LCB0cnVlKTsKLQkJCS8vIGNvbmZpZ0ZhY3RvcnkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5hZGQoKEVPYmplY3QpcGFyZW50LAotCQkJLy8gZmFsc2UpOwotCQkJY2hlY2tQYXJlbnQoY3AsIHBhcmVudCk7Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q2hlY2tTdGF0ZXMoKSB7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQl0cnkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB0cmVlVmlld2VyLmdldElucHV0KCk7Ci0JCQlzZWxlY3Rpb25DaGlsZHJlbihlbGVtZW50LCB0cnVlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQotCQlzZXREYXRhKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RGF0YShPYmplY3RbXSBzZWxzKSB7Ci0JCWlmICggc2VscyA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlkYXRhLmltcG9ydExpc3QuY2xlYXIoKTsKLQkJZm9yICggaW50IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKyApIHsKLQkJCWRhdGEuaW1wb3J0TGlzdC5hZGQoc2Vsc1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlnUmVwb3J0UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ1JlcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlYjNjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlnUmVwb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgdGhlIHJlc3VsdCBvZiBhbiBpbXBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0Q29uZmlnUmVwb3J0UGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgaW1wb3J0aW5nU2VydmljZTsKLQotCURpZmZSZXBvcnRWaWV3ZXIgdmlld2VyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0Q29uZmlnUmVwb3J0UGFnZShDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBpbXBvcnRpbmdTZXJ2aWNlKSB7Ci0JCXN1cGVyKEltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlKTsKLQkJdGhpcy5pbXBvcnRpbmdTZXJ2aWNlID0gaW1wb3J0aW5nU2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USAotCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0KLQkJdmlld2VyID0gbmV3IERpZmZSZXBvcnRWaWV3ZXIoY29udGFpbmVyLCBpbXBvcnRpbmdTZXJ2aWNlCi0JCQkJLmdldEltcG9ydERhdGEoKSk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU2hvdyByZXN1bHQuCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1Jlc3VsdCgpIHsKLQkJLy8gQW5hbHl6ZSB0aGUgaW1wb3J0aW5nIGNvbmZpZ3VyYXRpb24gYW5kIHJlcG9ydCByZXN1bHQuCi0JCWltcG9ydGluZ1NlcnZpY2UuYW5hbHl6ZShudWxsKTsKLQotCQl2aWV3ZXIuc2hvd1JlcG9ydChpbXBvcnRpbmdTZXJ2aWNlLmdldERpZmZUcmVlKCkpOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDlhYWE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBpbXBvcnRzIGV4cG9ydGVkIGxpYnJhcnkgY29uZmlndXJhdGlvbnMgaW50byB0aGUgY3VycmVudCBtZXRob2QKLSAqIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBva1RvQ29tcGxldGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlIHBhZ2UxOwotCi0JcHJvdGVjdGVkIFNlbGVjdENvbmZpZ3NUb0ltcG9ydCBjb25maWdQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlIHNwZWNzUGFnZTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnREYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSgKLQkJCWRhdGEpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJZmlsZU1nci5jaGVja01vZGlmeShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCkpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlLAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIEltcG9ydFBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0ltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhZ2UxID0gbmV3IFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UoZGF0YSwgc2VydmljZSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCi0JCWNvbmZpZ1BhZ2UgPSBuZXcgU2VsZWN0Q29uZmlnc1RvSW1wb3J0KHNlcnZpY2UpOwotCQlhZGRQYWdlKGNvbmZpZ1BhZ2UpOwotCi0JCXNwZWNzUGFnZSA9IG5ldyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZShkYXRhKTsKLQkJYWRkUGFnZShzcGVjc1BhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9DT05GSUdVUkFUT04pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBva1RvQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQkvLyBQcm9tcHQgdGhlIHVzZXIgdG8gYmFjayB1cCBsaWJyYXJ5LgotCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBDdXJyZW50TGlicmFyeShudWxsLCBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQkvLyBTdGFydCB0aGUgaW1wb3J0LgotCQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxLAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJCXNlcnZpY2UucGVyZm9ybUltcG9ydChtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yLAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBTYXZlIHRoZSBpbXBvcnQgcGF0aCB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQlJbXBvcnRVSVByZWZlcmVuY2VzLmFkZEltcG9ydENvbmZpZ0RpcihkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0UGx1Z2luV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0UGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZGNlMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFBsdWdpbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5QbHVnaW5EZXBJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5QbHVnaW5EZXBlbmRlbmN5SW5mb01ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5MaWJyYXJ5QmFja3VwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBpbXBvcnRzIGFuIGV4cG9ydGVkIG1ldGhvZCBwbHVnLWlucyBpbnRvIHRoZSBjdXJycmVudCBtZXRob2QKLSAqIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRQbHVnaW5XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UgcGFnZTE7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0UGx1Z2luc1RvSW1wb3J0IHBhZ2UyOwotCi0JcHJvdGVjdGVkIFBsdWdpbkltcG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5JbXBvcnREYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlID0gbmV3IFBsdWdpbkltcG9ydGluZ1NlcnZpY2UoZGF0YSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRQbHVnaW5XaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCS8vIGNoZWNrIG91dCB0aGUgbGlicmFyeSBmaXJzdAotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJZmlsZU1nci5jaGVja01vZGlmeShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJfQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlSZWFkT25seSgpKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUsCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCB0cnVlLCBudWxsLCBudWxsLCBJbXBvcnRQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRNZXRob2RQbHVnaW5zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhZ2UxID0gbmV3IFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZShkYXRhLCBzZXJ2aWNlKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJcGFnZTIgPSBuZXcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0KGRhdGEsIHNlcnZpY2UpOwotCQlhZGRQYWdlKHBhZ2UyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAodGhpcy5nZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IHBhZ2UyKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcGFnZTIuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCS8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBwbHVnLWlucyBhcmUgdXBkYXRhYmxlIG9yIG5vdC4KLQkJUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gY2hlY2tNb2RpZnkoKTsKLQotCQkvLyBpZiBvbmx5IGxvY2tlZCwgd2UgY2FuIGF1dG8tdW5sb2NrIGFuZCByZWxvY2sgdGhlIHBsdWdpbnMKLQkJLy8gaWYgdGhlIHBsdWluIGlzIHJlYWRvbmx5LCB1c2VyIG5lZWQgdG8gbWFudWFsbHkgbWFrZSBpdCB1cGRhdGFibGUKLQkJLy8gY3VzdG9tZXJzIG5lZWQgdG8gbWFudWFsbHkgdW5sb2NrIGFuZCBsb2NrIHBsdWdpbnMKLQkJLy8gZHVyaW5nIGNvbnRlbnQgbGlicmFyeSB1cGdyYWRlCi0KLQkJaWYgKG1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCS8vIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZS4KLQkJCVN0cmluZyBlcnJvciA9IG1vZGlmeUluZm8uZ2V0UmVhZG9ubHlNZXNzYWdlKCkudG9TdHJpbmcoKTsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvciwgZXJyb3IpOwotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoKGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgJiYgaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKS5hcHBlbmQoaW5mby5uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCWJvb2xlYW4geWVzID0gSW1wb3J0UGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zLAotCQkJCQkJCQkJCQlidWZmZXIudG9TdHJpbmcoKSkpOwotCi0JCQlpZiAoIXllcykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGFsbG93IHVzZXIgdG8gcHJvY2VlZCB3aXRoIGxvY2tlZCBwbHVnaW5zCi0JCWlmIChtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBtb2RpZnlJbmZvLmdldExvY2tlZE1lc3NhZ2UoKS50b1N0cmluZygpCi0JCQkJCSsgSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOwotCQkJYm9vbGVhbiB5ZXMgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlLCBtZXNzYWdlKTsKLQkJCWlmICgheWVzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gUHJvbXB0IHVzZXIgdG8gYmFjayB1cCBsaWJyYXJ5LgotCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBDdXJyZW50TGlicmFyeShudWxsLCBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX01TRzEsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQkvLyBTdGFydCB0aGUgaW1wb3J0LgotCQkJCQlzZXJ2aWNlLnBlcmZvcm1JbXBvcnQobW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yLCAKLQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWNoZWNrUGx1Z2luQ2lyY3VsYXJEZXBlbmRlbmN5KCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJLy8gU2F2ZSB0aGUgaW1wb3J0IHBhdGggdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJSW1wb3J0VUlQcmVmZXJlbmNlcy5hZGRJbXBvcnRQbHVnaW5EaXIoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkpOwotCi0JCUltcG9ydFVJUHJlZmVyZW5jZXMuc2V0Q2hlY2tCYXNlUGx1Z2lucyhzZXJ2aWNlLmlzQ2hlY2tCYXNlUGx1Z2lucygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbk1vZGlmeUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQbHVnaW5Nb2RpZnlJbmZvIGNoZWNrTW9kaWZ5KCkgewotCQkvLyBTdHJpbmdCdWZmZXIgZXJyb3IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IG5ldyBQbHVnaW5Nb2RpZnlJbmZvKCk7Ci0KLQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGluZm8uZXhpc3RpbmdQbHVnaW47Ci0JCQlpZiAoKHBsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKHBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7Ci0JCQkJCS8vIFRoZSBwbHVnLWluIGlzIGxvY2tlZAotCQkJCQltb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gVGhlIHBsdWctaW4gZXhpc3RzIGluIHRoZSBjdXJyZW50IGxpYnJhcnksIG1ha2Ugc3VyZSB0aGUKLQkJCQkJLy8gcGx1Zy1pbiBpcyB1cGRhdGFibGUuCi0JCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBnZXRTaGVsbCgpKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQltb2RpZnlJbmZvLnJlYWRvbmx5UGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZnlJbmZvOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1BsdWdpbkNpcmN1bGFyRGVwZW5kZW5jeSgpIHsKLQkJUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgbWdyID0gbmV3IFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyKAotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCVBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyLkNoZWNrUmVzdWx0IHJlc3VsdCA9IG1ncgotCQkJCS5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeShudWxsLCBmYWxzZSk7Ci0JCWlmIChyZXN1bHQuY2lyY3VsYXJMaXN0ICE9IG51bGwgJiYgIXJlc3VsdC5jaXJjdWxhckxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGNpclBsdWdpbnMgPSAoTGlzdCkgcmVzdWx0LmNpcmN1bGFyTGlzdC5nZXQoMCk7Ci0JCQlTdHJpbmcgbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2lyUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJCVBsdWdpbkRlcEluZm8gcGluZm8gPSAoUGx1Z2luRGVwSW5mbykgY2lyUGx1Z2lucy5nZXQoaSk7Ci0JCQkJaWYgKGkgIT0gMCkgewotCQkJCQltc2cgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQltc2cgKz0gcGluZm8uZ2V0UGx1Z2luKCkuZ2V0TmFtZSgpOwotCQkJfQotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZygKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF93YXJuX2NpcmN1bGFyX3BsdWdpbnMsCi0JCQkJCW1zZyk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0VUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4MjkzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0VUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEltcG9ydCBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFVJUHJlZmVyZW5jZXMgewotCi0JLy8gVGhlIGltcG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfUExVR0lOX0RJUlMgPSAiaW1wb3J0UGx1Z2luRGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0NPTkZJR19ESVJTID0gImltcG9ydENvbmZpZ0RpcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY2hlY2sgYmFzZSBwbHVnLWlucyBwcmVmZXJlbmNlIGtleQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0JBU0VfUExVR0lOUyA9ICJjaGVja0Jhc2VQbHVnaW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGRlZmF1bHQgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3J5IG5hbWUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU1QT1JUX1BMVUdJTl9ESVJfTkFNRSA9ICJFeHBvcnQiICsgRmlsZVV0aWwuRklMRV9TRVAgKyAiUGx1Z2lucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkgCi0KLQkvLyBUaGUgZGVmYXVsdCBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgbmFtZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTVBPUlRfQ09ORklHX0RJUl9OQU1FID0gIkV4cG9ydCIgKyBGaWxlVXRpbC5GSUxFX1NFUCArICJDb25maWd1cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkgCi0KLQkvLyBUaGUgZGVmYXVsdCBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkuCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRJbXBvcnRQbHVnaW5EaXIgPSBudWxsOwotCi0JLy8gVGhlIGRlZmF1bHQgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0SW1wb3J0Q29uZmlnRGlyID0gbnVsbDsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQlzdGF0aWMgewotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTVBPUlRfUExVR0lOX0RJUlMsIGdldERlZmF1bHRJbXBvcnRQbHVnaW5EaXIoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElNUE9SVF9DT05GSUdfRElSUywgZ2V0RGVmYXVsdEltcG9ydENvbmZpZ0RpcigpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQ0hFQ0tfQkFTRV9QTFVHSU5TLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGltcG9ydCBwbHVnLWluIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGltcG9ydCBwbHVnLWluIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRJbXBvcnRQbHVnaW5EaXIoKSB7Ci0JCWlmIChkZWZhdWx0SW1wb3J0UGx1Z2luRGlyID09IG51bGwpIHsKLQkJCWRlZmF1bHRJbXBvcnRQbHVnaW5EaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwTmFtZSA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCk7Ci0JCQlpZiAoYXBwTmFtZSAhPSBudWxsICYmIGFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmYXVsdEltcG9ydFBsdWdpbkRpciA9IGRlZmF1bHRJbXBvcnRQbHVnaW5EaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBhcHBOYW1lICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgREVGQVVMVF9JTVBPUlRfUExVR0lOX0RJUl9OQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlkZWZhdWx0SW1wb3J0UGx1Z2luRGlyID0gZGVmYXVsdEltcG9ydFBsdWdpbkRpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIERFRkFVTFRfSU1QT1JUX1BMVUdJTl9ESVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdEltcG9ydFBsdWdpbkRpcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEltcG9ydFBsdWdpbkRpcnMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBJTVBPUlRfUExVR0lOX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltcG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRJbXBvcnRQbHVnaW5EaXJzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBJTVBPUlRfUExVR0lOX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBpbXBvcnQgZGlyZWN0b3J5IHRvIHRoZSBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIGFuIGltcG9ydCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSW1wb3J0UGx1Z2luRGlyKFN0cmluZyBkaXIpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgSU1QT1JUX1BMVUdJTl9ESVJTLCBkaXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEltcG9ydENvbmZpZ0RpcigpIHsKLQkJaWYgKGRlZmF1bHRJbXBvcnRDb25maWdEaXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdEltcG9ydENvbmZpZ0RpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcHBOYW1lID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKTsKLQkJCWlmIChhcHBOYW1lICE9IG51bGwgJiYgYXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZWZhdWx0SW1wb3J0Q29uZmlnRGlyID0gZGVmYXVsdEltcG9ydENvbmZpZ0RpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0lNUE9SVF9DT05GSUdfRElSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRJbXBvcnRDb25maWdEaXIgPSBkZWZhdWx0SW1wb3J0Q29uZmlnRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgREVGQVVMVF9JTVBPUlRfQ09ORklHX0RJUl9OQU1FOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0SW1wb3J0Q29uZmlnRGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SW1wb3J0Q29uZmlnRGlycygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIElNUE9SVF9DT05GSUdfRElSUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEltcG9ydENvbmZpZ0RpcnNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChwcmVmU3RvcmUsIElNUE9SVF9DT05GSUdfRElSUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGltcG9ydCBkaXJlY3RvcnkgdG8gdGhlIGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzCi0JICogcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBhbiBpbXBvcnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEltcG9ydENvbmZpZ0RpcihTdHJpbmcgZGlyKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIElNUE9SVF9DT05GSUdfRElSUywgZGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjaGVjayBiYXNlIHBsdWctaW5zIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDaGVja0Jhc2VQbHVnaW5zKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oQ0hFQ0tfQkFTRV9QTFVHSU5TKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBub3RDaGVja0Jhc2VQbHVnaW5zIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGVja0Jhc2VQbHVnaW5zKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKENIRUNLX0JBU0VfUExVR0lOUywgdmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1BsdWdpbk1vZGlmeUluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9QbHVnaW5Nb2RpZnlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjI5YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1BsdWdpbk1vZGlmeUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gY29uc3RydWN0IGEgbWVzc2FnZSB0aGF0IGxpc3RzIGFsbCB0aGUgbG9ja2VkIG9yIHJlYWQtb25seQotICogbWV0aG9kIHBsdWctaW5zIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5Nb2RpZnlJbmZvIHsKLQotCXB1YmxpYyBMaXN0PE1ldGhvZFBsdWdpbj4gbG9ja2VkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JcHVibGljIExpc3Q8TWV0aG9kUGx1Z2luPiByZWFkb25seVBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbk1vZGlmeUluZm8oKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIG1lc3NhZ2UgdGhhdCBsaXN0cyBhbGwgdGhlIGxvY2tlZCBtZXRob2QgcGx1Zy1pbnMuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZ0J1ZmZlcjxjb2RlPiBjb250YWluaW5nIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRMb2NrZWRNZXNzYWdlKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbG9ja2VkUGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIG1zZyA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkLAotCQkJCQkJCXBsdWdpbi5nZXROYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZChtc2cpOwotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgbWVzc2FnZSB0aGF0IGxpc3RzIGFsbCB0aGUgcmVhZC1vbmx5IG1ldGhvZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nQnVmZmVyPGNvZGU+IGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFJlYWRvbmx5TWVzc2FnZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlYWRvbmx5UGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIG1zZyA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHksCi0JCQkJCQkJcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKG1zZyk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyZDc1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ1NwZWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgY29uZmlndXJhdGlvbgotICogc3BlY2lmaWNhaXRvbnMgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHMgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHMgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uZmlnU3BlY05vU2VsZWN0aW9uID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb25maWdTcGVjRGF0YUxhYmVsID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9jaGtib3hUYWJsZVZpZXdlcjsKLQotCS8vIDIgY29udHJvbHMgZm9yIGRpc3BsYXlpbmcgY29uZmlnc3BlYyBpbmZvIGZvciBwbHVnaW5zIGluIGltcG9ydCBkaXJlY3RvcnkKLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NJbXBvcnQ7Ci0KLQlwcml2YXRlIExhYmVsIGltcG9ydENvbmZpZ1NwZWNMYWJlbDsKLQotCS8vIDIgY29udHJvbHMgZm9yIGRpc3BsYXlpbmcgY29uZmlnc3BlYyBpbmZvIGZvciBwbHVnaW5zIGluIHRoZSBsaWJyYXJ5Ci0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjTGlicmFyeTsKLQotCXByaXZhdGUgTGFiZWwgbGlicmFyeUNvbmZpZ1NwZWNMYWJlbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlKENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vaW1wX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCi0JCUNvbXBvc2l0ZSB0YWJsZUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljcmVhdGVMYWJlbCh0YWJsZUNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncywgMik7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIgPSBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlQ29udGFpbmVyLCAxKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfQ09ORklHVVJBVE9OOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlDb21wb3NpdGUgaW1wb3J0Q29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJaW1wb3J0Q29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJaW1wb3J0Q29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZUltcG9ydENvbmZpZ1NwZWNJbmZvKGltcG9ydENvbnRhaW5lcik7Ci0KLQkJQ29tcG9zaXRlIGxpYnJhcnlDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsaWJyYXJ5Q29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJbGlicmFyeUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljcmVhdGVMaWJyYXJ5Q29uZmlnU3BlY0luZm8obGlicmFyeUNvbnRhaW5lcik7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJbXBvcnRDb25maWdTcGVjSW5mbyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWltcG9ydENvbmZpZ1NwZWNMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgY29uZmlnU3BlY05vU2VsZWN0aW9uLCAxKTsKLQkJY3JlYXRlTGluZShjb250YWluZXIsIDEpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYywgMSk7Ci0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEwMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGlicmFyeUNvbmZpZ1NwZWNJbmZvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbGlicmFyeUNvbmZpZ1NwZWNMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgY29uZmlnU3BlY05vU2VsZWN0aW9uLAotCQkJCTEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjLCAxKTsKLQkJY3RybF9icmllZkRlc2NMaWJyYXJ5ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEwMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChDb25maWdTcGVjcy5FbnRyeSkgY29uZmlnc1swXSk7Ci0JCX0gZWxzZSB7Ci0JCQljbGVhckRpc3BsYXlBdHRyaWJ1dGVzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoQ29uZmlnU3BlY3MuRW50cnkgc3BlYykgewotCQljdHJsX2JyaWVmRGVzY0ltcG9ydAotCQkJCS5zZXRUZXh0KHNwZWMuY29uZmlnU3BlYy5icmllZl9kZXNjID09IG51bGwgPyAiIiA6IHNwZWMuY29uZmlnU3BlYy5icmllZl9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlpbXBvcnRDb25maWdTcGVjTGFiZWwuc2V0VGV4dChjb25maWdTcGVjRGF0YUxhYmVsKTsKLQotCQlpZiAoc3BlYy5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dChzcGVjLmV4aXN0aW5nQ29uZmlnCi0JCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJbGlicmFyeUNvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGxpYnJhcnlDb25maWdTcGVjRXhpc3RzKTsKLQkJfSBlbHNlIHsKLQkJCWxpYnJhcnlDb25maWdTcGVjTGFiZWwuc2V0VGV4dChsaWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0cyk7Ci0JCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckRpc3BsYXlBdHRyaWJ1dGVzKCkgewotCQljdHJsX2JyaWVmRGVzY0ltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJbGlicmFyeUNvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGNvbmZpZ1NwZWNOb1NlbGVjdGlvbik7Ci0JCWltcG9ydENvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGNvbmZpZ1NwZWNOb1NlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpLmxlbmd0aCA+IDApIHsKLQkJCS8vIFNldCBkYXRhLnNwZWNzLmNvbmZpZ3MgbGlzdCwgZml4IHRoZSBzZWxlY3RlZCBmaWVsZCBvZiBlYWNoCi0JCQkvLyBlbnRyeS4KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBkYXRhLnNwZWNzLmNvbmZpZ3MuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbmZpZ1NwZWNzLkVudHJ5IGUgPSAoQ29uZmlnU3BlY3MuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENoZWNrZWQoZSkpCi0JCQkJCWUuc2VsZWN0ZWQgPSB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZS5zZWxlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCQl9Ci0KLQkJLy8gQWx3YXlzIHJldHVybiBmYWxzZSBzbyB0aGF0IHRoZSAiTmV4dCIgYnV0dG9uIGlzIG5ldmVyIGVuYWJsZWQuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldElucHV0KGRhdGEuc3BlY3MuY29uZmlncyk7Ci0JCWlmIChkYXRhLnNwZWNzLmNvbmZpZ3Muc2l6ZSgpID4gMCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCWRhdGEuc3BlY3MuY29uZmlncy5nZXQoMCkpOwotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ3NUb0ltcG9ydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ3NUb0ltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDVlYzliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdzVG9JbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgdGhhdCB3aWxsIGJlCi0gKiBpbXBvcnRlZC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ3NUb0ltcG9ydCBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdENvbmZpZ3NUb0ltcG9ydC5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQotCXByaXZhdGUgRGlmZlJlcG9ydFZpZXdlciBkaWZmOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29uZmlnc1RvSW1wb3J0KENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDEsIDEpOwotCQlkaWZmID0gbmV3IERpZmZSZXBvcnRWaWV3ZXIoY29udGFpbmVyLCBzZXJ2aWNlLmdldEltcG9ydERhdGEoKSk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5va1RvQ29tcGxldGUgPSB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlkaWZmLnNob3dSZXBvcnQoc2VydmljZS5nZXREaWZmVHJlZSgpKTsKLQkJKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDMxZjcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRGVzdGluYXRpb25Db21tb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUKLSAqIGNvbmZpZ3VyYXRpb25zIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0YXR1cyBva1N0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywKLQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLCAwLAotCQkJIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGE7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHNlcnZpY2U7Ci0KLQlwcml2YXRlIFN0YXR1cyBzdGF0dXMgPSBva1N0YXR1czsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UoQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YSwKLQkJCUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FLCBkYXRhLmxsRGF0YSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vaW1wX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmdbXSBleHBvcnREaXJzID0gSW1wb3J0VUlQcmVmZXJlbmNlcy5nZXRJbXBvcnRDb25maWdEaXJzKCk7Ci0JCWlmIChleHBvcnREaXJzICE9IG51bGwgJiYgZXhwb3J0RGlycy5sZW5ndGggPiAwKSB7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0SXRlbXMoZXhwb3J0RGlycyk7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChleHBvcnREaXJzWzBdKTsKLQkJfQotCQlzdXBlci5pbml0Q29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYm9vbGVhbiByZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQlzdGF0dXMgPSBva1N0YXR1czsKLQkJaWYgKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJCUZpbGUgbGliRGlyID0gbmV3IEZpbGUoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKSk7Ci0JCQlpZiAoIWxpYkRpci5leGlzdHMoKSkgewotCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsCi0JCQkJCQkwLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aCwKLQkJCQkJCW51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm5WYWx1ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzEsCi0JCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCXNlcnZpY2UuYW5hbHl6ZShtb25pdG9yKTsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgotCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KLQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCVN0cmluZyBlcnJvciA9IGRhdGEuZ2V0RXJyb3JJbmZvKCkuZ2V0RXJyb3IoKTsKLQkJaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLAotCQkJCQkwLCBlcnJvciwgbnVsbCk7Ci0JCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJQmFzZVdpemFyZFBhZ2UgcGFnZSA9IG51bGw7Ci0JCWlmIChkYXRhLnNwZWNzICE9IG51bGwpCi0JCQlwYWdlID0gKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc3BlY3NQYWdlOwotCQllbHNlIHsKLQkJCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IGNoZWNrTW9kaWZ5KCk7Ci0KLQkJCS8vIGlmIG9ubHkgbG9ja2VkLCB3ZSBjYW4gYXV0by11bmxvY2sgYW5kIHJlbG9jayB0aGUgcGx1Z2lucwotCQkJLy8gaWYgdGhlIHBsdWluIGlzIHJlYWRvbmx5LCB1c2VyIG5lZWQgdG8gbWFudWFsbHkgbWFrZSBpdCB1cGRhdGFibGUKLQkJCS8vIGN1c3RvbWVycyBuZWVkIHRvIG1hbnVhbGx5IHVubG9jayBhbmQgbG9jayBwbHVnaW5zIGR1cmluZyBjb250ZW50Ci0JCQkvLyBsaWJyYXJ5IHVwZ3JhZGUKLQotCQkJaWYgKG1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLnNpemUoKSA+IDApIHsKLQotCQkJCWVycm9yID0gbW9kaWZ5SW5mby5nZXRSZWFkb25seU1lc3NhZ2UoKS50b1N0cmluZygpOwotCi0JCQkJLy8gc2hvdyBlcnJvciBtZXNzYWdlIGJveAotCQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3IsIGVycm9yKTsKLQotCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsCi0JCQkJCQkwLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZSwKLQkJCQkJCW51bGwpOwotCQkJCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0KLQkJCS8vIGFsbG93IHVzZXIgdG8gcHJvY2VlZCB3aXRoIGxvY2tlZCBwbHVnaW5zCi0JCQlpZiAobW9kaWZ5SW5mby5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQlTdHJpbmcgV0laQVJEX1RJVExFID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZTsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IG1vZGlmeUluZm8uZ2V0TG9ja2VkTWVzc2FnZSgpLnRvU3RyaW5nKCkKLQkJCQkJCSsgSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOwotCQkJCWJvb2xlYW4geWVzID0gSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oV0laQVJEX1RJVExFLCBtZXNzYWdlKTsKLQkJCQlpZiAoIXllcykgewotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsCi0JCQkJCQkJMCwKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlLAotCQkJCQkJCW51bGwpOwotCQkJCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQkJCQlyZXR1cm4gdGhpczsKLQkJCQl9Ci0JCQl9Ci0JCQlwYWdlID0gKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuY29uZmlnUGFnZTsKLQkJfQotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgUGx1Z2luTW9kaWZ5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIFBsdWdpbk1vZGlmeUluZm8gY2hlY2tNb2RpZnkoKSB7Ci0JCXJldHVybiBjaGVja01vZGlmeShMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5HdWlkcyhzZXJ2aWNlCi0JCQkJLmdldEltcG9ydGluZ0xpYnJhcnkoKSksIGdldFNoZWxsKCksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBQbHVnaW5Nb2RpZnlJbmZvIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBsdWdpbk1vZGlmeUluZm8gY2hlY2tNb2RpZnkoTGlzdCBndWlkcywgU2hlbGwgc2hlbGwsCi0JCQlib29sZWFuIGNoZWNrRWRpdCkgewotCQlQbHVnaW5Nb2RpZnlJbmZvIG1vZGlmeUluZm8gPSBuZXcgUGx1Z2luTW9kaWZ5SW5mbygpOwotCQkvLyBTdHJpbmdCdWZmZXIgZXJyb3IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIExpc3QgZ3VpZHMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5HdWlkcyhzZXJ2aWNlCi0JCS8vIC5nZXRJbXBvcnRpbmdMaWJyYXJ5KCkpOwotCi0JCUxpc3QgcGx1Z2lucyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZ3VpZHMuY29udGFpbnMocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlpZiAocGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKLQkJCQkJLy8gcGx1Z2luIGlzIGxvY2tlZAotCQkJCQltb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJfSBlbHNlIGlmIChjaGVja0VkaXQpIHsKLQkJCQkJLy8gcGx1Z2luIGV4aXN0cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LCBtYWtlIHN1cmUgdGhlCi0JCQkJCS8vIHBsdWdpbiBpcyB1cGRhdGFibGUKLQkJCQkJLy8gSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIGdldFNoZWxsKCkpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHBsdWdpbiwgc2hlbGwpOwotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCW1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLmFkZChwbHVnaW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmeUluZm87Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNjYW5GbGlwVG9OZXh0UGFnZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseVRvU3RhdHVzTGluZSgpIHsKLQkJaWYgKHN0YXR1cyAhPSBva1N0YXR1cykKLQkJCXNldEVycm9yTWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiYTM3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRGVzdGluYXRpb25Db21tb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlCi0gKiBtZXRob2QgcGx1Zy1pbnMgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssCi0JCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUGx1Z2luSW1wb3J0RGF0YSBkYXRhOwotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2U7Ci0KLQlwcml2YXRlIFN0YXR1cyBzdGF0dXMgPSBPS19TVEFUVVM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UoUGx1Z2luSW1wb3J0RGF0YSBkYXRhLAotCQkJUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShJbXBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vaW1wX21ldGhfcGx1Z2luX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nW10gZXhwb3J0RGlycyA9IEltcG9ydFVJUHJlZmVyZW5jZXMuZ2V0SW1wb3J0UGx1Z2luRGlycygpOwotCQlpZiAoZXhwb3J0RGlycyAhPSBudWxsICYmIGV4cG9ydERpcnMubGVuZ3RoID4gMCkgewotCQkJZXhwb3J0UGF0aENvbWJvLnNldEl0ZW1zKGV4cG9ydERpcnMpOwotCQkJZXhwb3J0UGF0aENvbWJvLnNldFRleHQoZXhwb3J0RGlyc1swXSk7Ci0JCX0KLQkJc3VwZXIuaW5pdENvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJvb2xlYW4gcmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJc3RhdHVzID0gT0tfU1RBVFVTOwotCQlpZiAoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCWlmICghbGliRGlyLmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZCwgMCwKLQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aCwgbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVyblZhbHVlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQotCQkvLyBWYWxpZGF0ZSBmaXJzdCBiZWZvcmUgZ29pbmcgdG8gdGhlIG5leHQgcGFnZS4KLQkJc2VydmljZS52YWxpZGF0ZShudWxsKTsKLQkJU3RyaW5nIGVycm9yID0gZGF0YS5nZXRFcnJvckluZm8oKS5nZXRFcnJvcigpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDApIHsKLQkJCXN1cGVyLnNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfSBlbHNlIHsKLQkJCVNlbGVjdFBsdWdpbnNUb0ltcG9ydCBwYWdlID0gKChJbXBvcnRQbHVnaW5XaXphcmQpIGdldFdpemFyZCgpKS5wYWdlMjsKLQkJCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCQlyZXR1cm4gcGFnZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjY2FuRmxpcFRvTmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwbHlUb1N0YXR1c0xpbmUoKSB7Ci0JCWlmIChzdGF0dXMgIT0gT0tfU1RBVFVTKQotCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQllbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG9wdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJb3B0aW9uR3JvdXAuc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMub3B0aW9uR3JvdXBfdGV4dCk7Ci0KLQkJYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zID0gSW1wb3J0VUlQcmVmZXJlbmNlcy5nZXRDaGVja0Jhc2VQbHVnaW5zKCk7Ci0JCXNldENoZWNrQmFzZVBsdWdpbnMoY2hlY2tCYXNlUGx1Z2lucyk7Ci0KLQkJQnV0dG9uIGNoZWNrQmFzZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ob3B0aW9uR3JvdXAsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLmNoZWNrQmFzZVJhZGlvQnV0dG9uX3RleHQsIDEsIGNoZWNrQmFzZVBsdWdpbnMpOwotCQljaGVja0Jhc2VSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRDaGVja0Jhc2VQbHVnaW5zKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gaWdub3JlUmVtb3ZlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cCwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuaWdub3JlUmVtb3ZlUmFkaW9CdXR0b25fdGV4dCwgMSwKLQkJCQkhY2hlY2tCYXNlUGx1Z2lucyk7Ci0JCWlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldENoZWNrQmFzZVBsdWdpbnMoZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDaGVja0Jhc2VQbHVnaW5zKGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucykgewotCQlzZXJ2aWNlLnNldENoZWNrQmFzZVBsdWdpbnMoY2hlY2tCYXNlUGx1Z2lucyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0UGx1Z2luc1RvSW1wb3J0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0UGx1Z2luc1RvSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTI1ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdFBsdWdpbnNUb0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHRoZSBtZXRob2QgcGx1Zy1pbnMgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UGx1Z2luc1RvSW1wb3J0IGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJQ2hlY2tTdGF0ZUxpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQbHVnaW5zVG9JbXBvcnQuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeVBsdWdpbkV4aXN0cyA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbkV4aXN0czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5UGx1Z2luTm90RXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBsdWdpbk5vU2VsZWN0aW9uID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwbHVnaW5EYXRhTGFiZWwgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbkRhdGFMYWJlbDsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9ySW1wb3J0OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbkltcG9ydDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzY0ltcG9ydDsKLQotCXByaXZhdGUgTGFiZWwgaW1wb3J0UGx1Z2luTGFiZWw7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9hdXRob3JMaWJyYXJ5OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbkxpYnJhcnk7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NMaWJyYXJ5OwotCi0JcHJpdmF0ZSBMYWJlbCBsaWJyYXJ5UGx1Z2luTGFiZWw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQlwcml2YXRlIGludCBjaGVja2VkQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBMaXN0IGNoZWNrZWRQbHVnaW5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnREYXRhIGRhdGE7Ci0KLQlwcml2YXRlIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZTsKLQkKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQbHVnaW5zVG9JbXBvcnQoUGx1Z2luSW1wb3J0RGF0YSBkYXRhLAotCQkJUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotCQlDb21wb3NpdGUgdGFibGVDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lcjEgPSBuZXcgQ29tcG9zaXRlKHRhYmxlQ29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lcjEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lcjEsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zKTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVCdXR0b24oCi0JCQkJY29udGFpbmVyMSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKLQkJCQljb250YWluZXIxLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQkJCQkKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIodGFibGVDb250YWluZXIsIDIpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlDb21wb3NpdGUgaW1wb3J0Q29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJaW1wb3J0Q29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVJbXBvcnRQbHVnaW5JbmZvKGltcG9ydENvbnRhaW5lcik7Ci0KLQkJQ29tcG9zaXRlIGxpYnJhcnlDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsaWJyYXJ5Q29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVMaWJyYXJ5UGx1Z2luSW5mbyhsaWJyYXJ5Q29udGFpbmVyKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUltcG9ydFBsdWdpbkluZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbXBvcnRQbHVnaW5MYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgcGx1Z2luTm9TZWxlY3Rpb24sIDEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yLCAxKTsKLQkJY3RybF9hdXRob3JJbXBvcnQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgNDAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbiwgMSk7Ci0JCWN0cmxfdmVyc2lvbkltcG9ydCA9IGNyZWF0ZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2MsIDEpOwotCQljdHJsX2JyaWVmRGVzY0ltcG9ydCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCAxMDAsIDEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpYnJhcnlQbHVnaW5JbmZvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbGlicmFyeVBsdWdpbkxhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBwbHVnaW5Ob1NlbGVjdGlvbiwgMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3IsIDEpOwotCQljdHJsX2F1dGhvckxpYnJhcnkgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgNDAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbiwgMSk7Ci0JCWN0cmxfdmVyc2lvbkxpYnJhcnkgPSBjcmVhdGVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjLCAxKTsKLQkJY3RybF9icmllZkRlc2NMaWJyYXJ5ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEwMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCQotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCQlJbXBvcnRQbHVnaW5XaXphcmQgd2l6YXJkID0gKEltcG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCQkJaWYgKCEgd2l6YXJkLmRhdGEuZ2V0UGx1Z2lucygpLmlzRW1wdHkoKSkgewotCQkJCQljaGVja2VkUGx1Z2luTGlzdC5jbGVhcigpOwotCQkJCQljaGVja2VkUGx1Z2luTGlzdC5hZGRBbGwod2l6YXJkLmRhdGEuZ2V0UGx1Z2lucygpKTsKLQkJCQkJY2hlY2tlZENvdW50ID0gY2hlY2tlZFBsdWdpbkxpc3Quc2l6ZSgpOwotCQkJCQlzZXRBbGxTZWxlY3RlZCh3aXphcmQuZGF0YSwgdHJ1ZSk7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gc2VydmljZS52YWxpZGF0ZVNlbGVjdGlvbigpOwotCQkJCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQl9KTsKLQotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJCQljaGVja2VkUGx1Z2luTGlzdC5jbGVhcigpOwotCQkJCWNoZWNrZWRDb3VudCA9IDA7Ci0JCQkJSW1wb3J0UGx1Z2luV2l6YXJkIHdpemFyZCA9IChJbXBvcnRQbHVnaW5XaXphcmQpIGdldFdpemFyZCgpOwotCQkJCXNldEFsbFNlbGVjdGVkKHdpemFyZC5kYXRhLCBmYWxzZSk7Ci0JCQkJCi0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQl9KTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRBbGxTZWxlY3RlZChQbHVnaW5JbXBvcnREYXRhIGRhdGEsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJZm9yIChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzogZGF0YS5nZXRQbHVnaW5zKCkpIHsKLQkJCWluZm8uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJLy8gU2V0IHRoZSBmbGFnIHRvIGltcG9ydCB0aGUgc2VsZWN0ZWQgcGx1Zy1pbnMuCi0JCWlmIChvYmogaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIHsKLQkJCSgoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBvYmopLnNlbGVjdGVkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCQl9Ci0JCVN0cmluZyBtZXNzYWdlID0gc2VydmljZS52YWxpZGF0ZVNlbGVjdGlvbigpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQotCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQljaGVja2VkQ291bnQrKzsKLQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZChvYmopOwotCQl9IGVsc2UgewotCQkJY2hlY2tlZENvdW50LS07Ci0JCQljaGVja2VkUGx1Z2luTGlzdC5yZW1vdmUob2JqKTsKLQkJfQotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcGx1Z2luID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChQbHVnaW5JbmZvKSBwbHVnaW5bMF0pOwotCQl9IGVsc2UgewotCQkJY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoUGx1Z2luSW5mbyBwbHVnaW4pIHsKLQkJY3RybF9hdXRob3JJbXBvcnQuc2V0VGV4dChwbHVnaW4uYXV0aG9ycyA9PSBudWxsID8gIiIgOiBwbHVnaW4uYXV0aG9ycyk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92ZXJzaW9uSW1wb3J0Ci0JCQkJLnNldFRleHQocGx1Z2luLnZlcnNpb24gPT0gbnVsbCA/ICIiIDogcGx1Z2luLnZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0Ci0JCQkJLnNldFRleHQocGx1Z2luLmJyaWVmX2Rlc2MgPT0gbnVsbCA/ICIiIDogcGx1Z2luLmJyaWVmX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCWltcG9ydFBsdWdpbkxhYmVsLnNldFRleHQocGx1Z2luRGF0YUxhYmVsKTsKLQotCQlpZiAocGx1Z2luLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpIHsKLQkJCWxpYnJhcnlQbHVnaW5MYWJlbC5zZXRUZXh0KGxpYnJhcnlQbHVnaW5FeGlzdHMpOwotCQkJY3RybF9hdXRob3JMaWJyYXJ5LnNldFRleHQocGx1Z2luLmV4aXN0aW5nUGx1Z2luLmdldEF1dGhvcnMoKSk7Ci0JCQljdHJsX3ZlcnNpb25MaWJyYXJ5LnNldFRleHQocGx1Z2luLmV4aXN0aW5nUGx1Z2luLmdldFZlcnNpb24oKSk7Ci0JCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dChwbHVnaW4uZXhpc3RpbmdQbHVnaW4KLQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJyYXJ5UGx1Z2luTGFiZWwuc2V0VGV4dChsaWJyYXJ5UGx1Z2luTm90RXhpc3RzKTsKLQkJCWN0cmxfYXV0aG9yTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF92ZXJzaW9uTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpIHsKLQkJaW1wb3J0UGx1Z2luTGFiZWwuc2V0VGV4dChwbHVnaW5Ob1NlbGVjdGlvbik7Ci0JCWN0cmxfYXV0aG9ySW1wb3J0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0ltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWxpYnJhcnlQbHVnaW5MYWJlbC5zZXRUZXh0KHBsdWdpbk5vU2VsZWN0aW9uKTsKLQkJY3RybF9hdXRob3JMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkxpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGNoZWNrZWRDb3VudCA+IDApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJTGlzdCBwbHVnaW5zID0gZGF0YS5nZXRQbHVnaW5zKCk7Ci0JCWlmIChwbHVnaW5zICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQocGx1Z2lucy50b0FycmF5KCkpOwotCQkJaWYgKCFwbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocGx1Z2lucwotCQkJCQkJLmdldCgwKSk7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjEwN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGltcG9ydGluZyBtZXRob2QgcGx1Zy1pbnMgYW5kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzOWQ5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiOTA5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogTGlicmFyeSBFZGl0IFVJIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLkxpYnJhcnlFZGl0VUlQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4NjNlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjQxMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aUhlbHBlciI+Ci0gICAgICA8dWlIZWxwZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVJSGVscGVyIj4KLSAgICAgIDwvdWlIZWxwZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0xpYnJhcnlFZGl0VUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvTGlicmFyeUVkaXRVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzM3ZjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvTGlicmFyeUVkaXRVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlFZGl0VUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlFZGl0VUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RWRpdFVJUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1Byb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1Byb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OWUwZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Qcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBUaGlzIGphdmEgZmlsZSBleHRlbmRzIGpmYWNlIExpc3RTZWxlY3Rpb25EaWFsb2cgYW5kIHJlbW92ZSBjYW5jZWwgYnV0dG9uCi0gKiBmcm9tIGRpYWxvZwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMQotICoKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgTGlzdFNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwdWJsaWMgUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBpbnB1dCwKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLSAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIFN0cmluZyBtZXNzYWdlKQotCXsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGlucHV0LCBjb250ZW50UHJvdmlkZXIsIGxhYmVsUHJvdmlkZXIsIG1lc3NhZ2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1RlYW1TZWxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVGVhbVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ0NGI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVGVhbVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBVSSBEaWFsb2cgY2xhc3Mgd2hpY2ggd2lsbCBhc2sgdXNlciB0byBhc3NpZ24gYSByb2xlIHRvIHRlYW0gYXV0b21hdGljYWxseS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlYW1TZWxlY3Rpb24gewotCi0JLyoqCi0JICogSXQgc2hvd3MgZGlhbG9nIGJveCBhbGwgdGVhbXMuIFJldHVybnMgdGVhbSB1c2VyIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZWFtUHJvZmlsZSBnZXRTZWxlY3RlZFRlYW0oTGlzdCB0ZWFtTGlzdCwgUm9sZSByb2xlLCBTaGVsbCBzaGVsbCkgewotLy8JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotLy8JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotLy8JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotLy8JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0vLwkJCQkJcmV0dXJuICgoVGVhbVByb2ZpbGUpIG9iaikuZ2V0TmFtZSgpOwotLy8JCQkJfQotLy8JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0vLwkJCX0KLS8vCQl9OwotLy8JCWlmKHNoZWxsID09IG51bGwpIHsKLS8vCQkJdHJ5IHsKLS8vCQkJCXNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOyAvL01zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLS8vCQkJfQotLy8JCQljYXRjaChFeGNlcHRpb24gZSkgewotLy8JCQkJCi0vLwkJCX0KLS8vCQl9Ci0vLwkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBsYWJlbFByb3ZpZGVyKTsKLS8vCi0vLwkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotLy8JCWRsZy5zZXRFbGVtZW50cyh0ZWFtTGlzdC50b0FycmF5KCkpOwotLy8JCWRsZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0vLwkJZGxnCi0vLwkJCQkuc2V0TWVzc2FnZShOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3RUZWFtc0RpYWxvZ190ZXh0LCAobmV3IE9iamVjdFtdIHsgcm9sZS5nZXROYW1lKCkgfSkpKTsgCi0vLwkJZGxnLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotLy8JCWRsZy5zZXRGaWx0ZXIobnVsbCk7Ci0vLwkJZGxnLm9wZW4oKTsKLS8vCQlPYmplY3Qgb2JqID0gZGxnLmdldEZpcnN0UmVzdWx0KCk7Ci0vLwkJLy8gZGlzcG9zZQotLy8JCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotLy8JCXJldHVybiAoVGVhbVByb2ZpbGUpIG9iajsKLQkJCi0JCWZpbmFsIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlmaW5hbCBJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCWZpbmFsIFN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlOwotCQkJZmluYWwgU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNlbGVjdFRlYW1zRGlhbG9nX3RleHQsIChuZXcgT2JqZWN0W10geyByb2xlLmdldE5hbWUoKSB9KSk7Ci0JCQlmaW5hbCBMaXN0IGZpbmFsU2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmaW5hbCBMaXN0IGZpbmFsVGVhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmaW5hbFRlYW1zLmFkZEFsbCh0ZWFtTGlzdCk7Ci0KLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlMaXN0IHNlbGVjdGVkID0gdWlIYW5kbGVyLnNlbGVjdChmaW5hbFRlYW1zLCBsYWJlbFByb3ZpZGVyLCBmYWxzZSwKLQkJCQkJCQlmaW5hbFRlYW1zLCB0aXRsZSwgbXNnKTsKLQotCQkJCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCkKLQkJCQkJCWZpbmFsU2VsZWN0ZWQuYWRkQWxsKHNlbGVjdGVkKTsKLQkJCQl9Ci0JCQl9LCB0cnVlKTsKLQotCQkJaWYgKGZpbmFsU2VsZWN0ZWQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYoZmluYWxTZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiAoVGVhbVByb2ZpbGUpIGZpbmFsU2VsZWN0ZWQuZ2V0KDApOwotCQl9Ci0KLQkJLy8gbm8gdXNlciBpbnRlcmFjdGlvbiBoYW5kbGVyIGF2YWlsYWJsZQotCQkvLyByZXR1cm4gbnVsbAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVUlIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwMjZhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uTW9kYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLldvcmtiZW5jaEpvYjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIFVJSGVscGVyIGltcGxlbWVudHMgSVVJSGVscGVyIHsKLQkvKioKLQkgKiBHZXQgdGVhbXMgaW4gc2NvcGUKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSByb2xlCi0JICogQHBhcmFtIHRlYW1MaXN0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRUZWFtc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGUsIFJvbGUgcm9sZSwgTGlzdCB0ZWFtTGlzdCkgewotCQkvLyBnZXQgY2hpbGRyZW4gZm9yIGFjdGl2aXR5Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIG9iajsKLQkJCQlMaXN0IGFsbFRlYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIGdldCBhbGwgc3ViIHRlYW1zIGFzIHdlbGwKLQkJCQlQcm9jZXNzVXRpbC5nZXRBbGxTdWJUZWFtcyh0ZWFtLCBhbGxUZWFtcyk7Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIHRlYW1JdG9yID0gYWxsVGVhbXMuaXRlcmF0b3IoKTsgdGVhbUl0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gdGVhbUl0b3IubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCQkvLyBnZXQgcm9sZXMgZnJvbSB0ZWFtcwotCQkJCQkJTGlzdCByb2xlcyA9IFByb2Nlc3NVdGlsLmdldFJvbGVzKCgoVGVhbVByb2ZpbGUpIG8pCi0JCQkJCQkJCS5nZXRUZWFtUm9sZXMoKSk7Ci0JCQkJCQlpZiAocm9sZXMuY29udGFpbnMocm9sZSkpIHsKLQkJCQkJCQl0ZWFtTGlzdC5hZGQobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFyZW50Ci0JCU9iamVjdCBjdXJyZW50UGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlKTsKLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJLy8gZ28gdXAKLQkJCWdldFRlYW1zSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsCi0JCQkJCXJvbGUsIHRlYW1MaXN0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVUlIZWxwZXIjZ2V0VGVhbShvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5LCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGdldFRlYW0oQWN0aXZpdHkgYWN0aXZpdHksIFJvbGUgcm9sZSwgT2JqZWN0IFVJQ29udGV4dCkgewotCQlMaXN0IHRlYW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIGZpbmQgb3V0IGFsbCB0ZWFtIGluIHZpc2libGUgc2NvcGUKLQkJZ2V0VGVhbXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCBhY3Rpdml0eSwgcm9sZSwgdGVhbUxpc3QpOwotCQlpZiAodGVhbUxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCXJldHVybiAoVGVhbVByb2ZpbGUpIHRlYW1MaXN0LmdldCgwKTsKLQkJfQotCQlpZiAodGVhbUxpc3Quc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIFRlYW1TZWxlY3Rpb24uZ2V0U2VsZWN0ZWRUZWFtKHRlYW1MaXN0LCByb2xlLAotCQkJCQlVSUNvbnRleHQgaW5zdGFuY2VvZiBTaGVsbCA/IChTaGVsbCkgVUlDb250ZXh0IDogbnVsbCk7Ci0JCX0KLQkJLy8gdGhlcmUgYXJlIG5vIHRlYW1zIHRvIGFzc2lnbgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVVJSGVscGVyI3J1bkluTW9kYWxDb250ZXh0KG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MsIGJvb2xlYW4sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bkluTW9kYWxDb250ZXh0KGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24sCi0JCQlib29sZWFuIGZvcmssIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IHVpQ29udGV4dCkgewotCQlvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsKLQkJCX0KLQkJCQotCQl9OwotCQl0cnkgewotCQkJTW9kYWxDb250ZXh0LnJ1bihvcCwgdHJ1ZSwgbW9uaXRvciwgKChTaGVsbCl1aUNvbnRleHQpCi0JCQkJCS5nZXREaXNwbGF5KCkpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQlUaHJvd2FibGUgZXg7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlleCA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkKLQkJCQkJCS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXggPSBlOwotCQkJfQotCQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGV4KTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQltc2csIGV4KTsKLQkJfQotCi0JfQotCi0JcHVibGljIExpc3Qgc2VsZWN0VGFza3MoTGlzdCB0YXNrTGlzdCwgV29ya1Byb2R1Y3Qgd3ApIHsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2x1bW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKG9iaik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCQl9Ci0JCX07Ci0KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoTGlzdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCVByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQl0YXNrTGlzdCwKLQkJCQkJY29udGVudFByb3ZpZGVyLAotCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQlOTFMKLQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnLAotCQkJCQkJCQkJd3AuZ2V0TmFtZSgpKSk7Ci0KLQkJCWRsZy5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3MpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQkJCU9iamVjdFtdIG9ianMgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0KLQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmICgob2JqcyAhPSBudWxsKSAmJiAob2Jqcy5sZW5ndGggPiAwKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykgewotCQkJCQlzZWxlY3RlZFRhc2tzLmFkZChvYmpzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc2VsZWN0ZWRUYXNrczsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGRpc3Bvc2UKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0IHNlbGVjdFdvcmtQcm9kdWN0cyhMaXN0IHdwTGlzdCwgUm9sZSByb2xlKSB7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgY29sdW1uKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShvYmopOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQkJfQotCQl9OwotCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJLy8gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLAotCQkJCQl3cExpc3QsCi0JCQkJCWNvbnRlbnRQcm92aWRlciwKLQkJCQkJbGFiZWxQcm92aWRlciwKLQkJCQkJTkxTCi0JCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnLAotCQkJCQkJCQkJcm9sZS5nZXROYW1lKCkpKTsKLQotCQkJZGxnCi0JCQkJCS5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzKTsgCi0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCQkJT2JqZWN0W10gb2JqcyA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJTGlzdCBzZWxlY3RlZFdwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmICgob2JqcyAhPSBudWxsKSAmJiAob2Jqcy5sZW5ndGggPiAwKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykgewotCQkJCQlzZWxlY3RlZFdwcy5hZGQob2Jqc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNlbGVjdGVkV3BzOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZGlzcG9zZQotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJ1bm5hYmxlV2l0aFByb2dyZXNzIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JCXByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbjsKLQotCQlwdWJsaWMgUnVubmFibGVXaXRoUHJvZ3Jlc3MoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wKSB7Ci0JCQl0aGlzLm9wZXJhdGlvbiA9IG9wOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsKLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBydW5Bc0pvYihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIFN0cmluZyB0YXNrTmFtZSwKLQkJCU9iamVjdCBzaGVsbCkgewotCQlKb2Igam9iID0gbmV3IFdvcmtzcGFjZUpvYih0YXNrTmFtZSkgewotCi0JCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQkvLyBtb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQkJcnVubmFibGUucnVuKG1vbml0b3IpOwotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJVGhyb3dhYmxlIGV4OwotCQkJCQlpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpIHsKLQkJCQkJCWV4ID0gZS5nZXRDYXVzZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZXggPSBlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luCi0JCQkJCQkJLmdldFBsdWdpbigpLmdldElkKCksIDAsIGV4LnRvU3RyaW5nKCksIGV4KTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luCi0JCQkJCQkJLmdldFBsdWdpbigpLmdldElkKCksIDAsIGUudG9TdHJpbmcoKSwgZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuc2hvd0luRGlhbG9nKChTaGVsbCkgc2hlbGwsIGpvYik7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCQlyZXR1cm4gam9iLmdldFJlc3VsdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJ1bkluVUkoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIE9iamVjdCBzaGVsbCkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJc2hlbGwgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpOwotCQl9Ci0JCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coKFNoZWxsKSBzaGVsbCk7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoY29udGV4dCwKLQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFByb2dyZXNzKHJ1bm5hYmxlKSwgcnVsZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOwotCQkJRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpLmdldE1lc3NlbmdlcigpCi0JCQkJLnNob3dFcnJvcih0aXRsZSwgZS50b1N0cmluZygpLCBudWxsLCBlKTsKLS8vCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLS8vCQkJCQllLnRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCWZpbmFsIElSdW5uYWJsZUNvbnRleHQgcnVubmFibGVDb250ZXh0LCBmaW5hbCBib29sZWFuIGNhbkNhbmNlbCwgZmluYWwgU3RyaW5nIG1zZykgewotCQlmaW5hbCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCBudWxsKTsgCi0KLQkJZmluYWwgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhtc2csIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bihtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIG1zZzsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXNzYWdlRXhjZXB0aW9uKSB7Ci0JCQkJCQltc2cgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RyV3JpdGVyKSk7Ci0JCQkJCQltc2cgPSBzdHJXcml0ZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCQltc2csIGUpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQl0cnkgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJ1bm5hYmxlQ29udGV4dC5ydW4odHJ1ZSwgY2FuQ2FuY2VsLCBvcGVyYXRpb24pOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlydW5uYWJsZUNvbnRleHQucnVuKHRydWUsIGNhbkNhbmNlbCwgb3BlcmF0aW9uKTsKLQkJCX0KLQotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpCi0JCQkJCQkuZ2V0TWVzc2VuZ2VyKCkuc2hvd0Vycm9yKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnV2l0aERldGFpbHMsCi0JCQkJCQkJCXN0YXR1cyk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KLQkJCS8vCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjZXB0aW9uKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJYm9vbGVhbiBjYW5DYW5jZWwsIFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIHJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZ2V0UnVubmFibGVDb250ZXh0KCksIGZhbHNlLCBtc2cpOwotCX0KLQotCXB1YmxpYyBJUnVubmFibGVDb250ZXh0IGdldFJ1bm5hYmxlQ29udGV4dCgpIHsKLQkJU2hlbGwgc2hlbGw7Ci0JCU9iamVjdCB1aUN0eCA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKS5nZXRVSUNvbnRleHQoKTsKLQkJaWYgKHVpQ3R4IGluc3RhbmNlb2YgU2hlbGwpIHsKLQkJCXNoZWxsID0gKFNoZWxsKSB1aUN0eDsKLQkJfSBlbHNlIHsKLQkJCXNoZWxsID0gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWaWV3ZXIgZG9HZXRWaWV3ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFByb2Nlc3MgcHJvYykgewotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBFeHBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoCi0JCQkJCSgoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDb250ZW50UHJvdmlkZXIgJiYgbGlzdGVuZXIgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsJCQkJCQotCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGxpc3RlbmVyKS5nZXRWaWV3ZXIoKTsKLQkJCQkJaWYgKHZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJCSYmICgoUHJvY2Vzc0NvbXBvbmVudCkgdmlld2VyLmdldElucHV0KCkpCi0JCQkJCQkJCQkuZ2V0UHJvY2VzcygpID09IHByb2MpCi0JCQkJCQlyZXR1cm4gdmlld2VyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoTmVlZGVkKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGl0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGdpdmVuIHByb2Nlc3MgaXMgY3VycmVudGx5IG9wZW5lZCBpbiBlZGl0b3IKLQkJLy8KLQkJVmlld2VyIHZpZXdlciA9IGRvR2V0Vmlld2VyKGFkYXB0ZXJGYWN0b3J5LCBwcm9jZXNzKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldENvbnRyaWJ1dG9ycyhwcm9jZXNzKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKHJlZnJlc2hOZWVkZWQoYWRhcHRlckZhY3RvcnksIGFkYXB0ZXIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMocHJvY2VzcywKLQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChyZWZyZXNoTmVlZGVkKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsVmlld2VycyhmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29udGVudFByb3ZpZGVyICYmIGxpc3RlbmVyIGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CQkJCQkKLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgbGlzdGVuZXIpLmdldFZpZXdlcigpOwotCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkKLQkJCQkJCQkJJiYgdmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoVmlld2VyKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIFByb2Nlc3MgcHJvYykgewotCQlmaW5hbCBWaWV3ZXIgdmlld2VyID0gZG9HZXRWaWV3ZXIoZmFjdG9yeSwgcHJvYyk7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCQotCQkJfSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoSURzSW5WaWV3ZXIoZmluYWwgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAotCQkJCQkJYWRhcHRlckZhY3RvcnkuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGxpc3RlbmVyKS5nZXRWaWV3ZXIoKTsKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkJCQkJJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpCi0JCQkJCQkJCSYmIHZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgdmlld2VyLmdldElucHV0KCkpCi0JCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkuYWRhcHQocHJvYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQlpZiAoaXRlbVByb3ZpZGVyLmlzUmVmcmVzaEFsbElEc1JlcXVpcmVkKCkpIHsKLQkJCQkJCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZChmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0sIHRydWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Vmlld2VyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJcmV0dXJuIGRvR2V0Vmlld2VyKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5TYWZlbHkoZmluYWwgUnVubmFibGUgcnVubmFibGUsIGJvb2xlYW4gc3luY2hyb25vdXMpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vCi0JCX0KLQkJCi0JCVJ1bm5hYmxlIHJ1bm5lciA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCWlmKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkvLwotCQkJdHJ5IHsKLQkJCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCi0JCQl9Ci0JCQlpZihkaXNwbGF5ICE9IG51bGwpIHsKLQkJCQlpZihzeW5jaHJvbm91cykgewotCQkJCQlkaXNwbGF5LnN5bmNFeGVjKHJ1bm5lcik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uZXIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJ1bm5lci5ydW4oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkvLwotCQkJaWYoc3luY2hyb25vdXMpIHsKLQkJCQlydW5uZXIucnVuKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEJ1c3lJbmRpY2F0b3IoUnVubmFibGUgcnVubmFibGUpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIHJ1bm5hYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5JblVJKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCVNoZWxsIHNoZWxsID0gKFNoZWxsKSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJSm9iIGpvYiA9IG5ldyBXb3JrYmVuY2hKb2IodGFza05hbWUpIHsKLQotCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bihtb25pdG9yKTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocm93YWJsZSBleDsKLQkJCQkJaWYgKGUuZ2V0Q2F1c2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlleCA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWV4ID0gZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJCQkJCS5nZXRQbHVnaW4oKS5nZXRJZCgpLCAwLCBleC50b1N0cmluZygpLCBleCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJCQkJCS5nZXRQbHVnaW4oKS5nZXRJZCgpLCAwLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnNob3dJbkRpYWxvZyhzaGVsbCwgam9iKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YWIxMTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzcwZmI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWVkY2VmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24sCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlciwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvciwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NThiMDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvY2hlY2tlZF9ib3guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9jaGVja2VkX2JveC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWNiOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9jaGVja2VkX2JveC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfQ29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19Db25jZXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmODRkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19Db25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX0Rpc2NpcGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfUm9sZVNldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfUm9sZVNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzY0M2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtQcm9kdWN0X2VzdGltYXRlX0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzE0NzY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY2ZDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3RzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlndXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyNGZkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlndXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhNWQ3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3Nlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjRhOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWlucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWlucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjk0NGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRm9sZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQxOWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Gb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjE0MTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM4Y2U4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDM1MTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L091dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nVGVtcGxhdGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ1RlbXBsYXRlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjZlZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nVGVtcGxhdGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWxpZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbGllcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMWJhNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbGllcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc2VzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWYzZTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJjZmZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXBzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExYmM1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZENhdGVnb3JpZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTgzODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTIxZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGJkODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrc19jZnYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzX2Nmdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzX2Nmdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODY2ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWJmZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvcnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3JzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29scy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNGY4ZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVycy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlcnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI0ODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdmYTY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvZW1wdHlfcGFja19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L2VtcHR5X3BhY2tfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4Mjg0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvZW1wdHlfcGFja19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWMyOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wcm9jZm9sZF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Byb2Nmb2xkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGUyNzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Byb2Nmb2xkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvdG9vbHNldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvdG9vbHNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNGY4ZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Rvb2xzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy91bmNoZWNrZWRfYm94LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvdW5jaGVja2VkX2JveC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjlmOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy91bmNoZWNrZWRfYm94LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDlkZmY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkgRWRpdAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLV9VSV9Db250ZW50X2dyb3VwPU1ldGhvZCBDb250ZW50Ci0KLV9VSV9EaXNjaXBsaW5lc19ncm91cD1EaXNjaXBsaW5lcwotX1VJX0RvbWFpbnNfZ3JvdXA9RG9tYWlucwotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9V29yayBQcm9kdWN0IEtpbmRzCi1fVUlfUm9sZV9TZXRzX2dyb3VwPVJvbGUgU2V0cwotX1VJX1Rvb2xzX2dyb3VwPVRvb2xzCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1TdGFuZGFyZCBDYXRlZ29yaWVzCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9Q3VzdG9tIENhdGVnb3JpZXMKLV9VSV9NZXRob2RDb250ZW50X2dyb3VwPUNvbnRlbnQgUGFja2FnZXMKLQotX1VJX1Byb2Nlc3Nlc19ncm91cD1Qcm9jZXNzZXMKLV9VSV9QbGFubmluZ1RlbXBsYXRlc19ncm91cD1QbGFubmluZyBUZW1wbGF0ZXMKLQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PUNhcGFiaWxpdHkgUGF0dGVybnMKLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3NlcwotX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQ9RGlmZmVyZW50aWFsIFByb2Nlc3NlcwotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX3RleHQ9UGxhbm5pbmcgVGVtcGxhdGVzCi0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9RGlmZmVyZW50aWFsIFByb2Nlc3MKLQotX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQ9Q29uZmlndXJhdGlvbnMKLQotX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0PVByb2Nlc3MgRmFtaWxpZXMKLQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1VbmNhdGVnb3JpemVkCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVVuY2F0ZWdvcml6ZWQgVGFza3MKLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9VW5jYXRlZ29yaXplZCBSb2xlcwotCi1fVUlfR3VpZGFuY2VzX2dyb3VwPUd1aWRhbmNlCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9Q2hlY2tsaXN0cwotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1Db25jZXB0cwotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1FeGFtcGxlcwotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9UHJhY3RpY2VzCi1fVUlfR3VpZGFuY2VzX1JlcG9ydHM9UmVwb3J0cwotX1VJX0d1aWRhbmNlc19SZXVzYWJsZUFzc2V0cz1SZXVzYWJsZSBBc3NldHMKLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1Sb2FkbWFwCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9U3VwcG9ydGluZyBNYXRlcmlhbHMKLV9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcz1UZWNobmlxdWVzCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1UZW1wbGF0ZXMKLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPVRlcm0gRGVmaW5pdGlvbnMKLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9VG9vbCBNZW50b3JzCi1fVUlfR3VpZGFuY2VzX1doaXRlcGFwZXJzPVdoaXRlcGFwZXJzCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1HdWlkZWxpbmVzCi1fVUlfS2V5X0NvbmNlcHRzPUtleSBDb25jZXB0cwotCi0KLV9VSV9Sb2xlc19ncm91cD1Sb2xlcwotX1VJX1Rhc2tzX2dyb3VwPVRhc2tzCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVdvcmsgUHJvZHVjdHMKLV9VSV9BY3Rpdml0aWVzX2dyb3VwPUFjdGl2aXRpZXMKLQotIyBCcmVha2Rvd24gc3RydWN0dXJlIGNvbHVtbiBkaXNwbGF5IG5hbWVzCi1CU19Db2x1bW5fbmFtZT1OYW1lCi1CU19Db2x1bW5fcHJlZml4PVByZWZpeAotQlNfQ29sdW1uX2lkPUluZGV4Ci1CU19Db2x1bW5fcHJlZGVjZXNzb3JzPVByZWRlY2Vzc29ycwotQlNfQ29sdW1uX2lzX3JlcGVhdGFibGU9UmVwZWF0YWJsZQotQlNfQ29sdW1uX2lzX29uZ29pbmc9T25nb2luZwotQlNfQ29sdW1uX2lzX2V2ZW50X2RyaXZlbj1FdmVudC1Ecml2ZW4KLUJTX0NvbHVtbl9lbnRyeV9zdGF0ZT1FbnRyeSBTdGF0ZQotQlNfQ29sdW1uX2V4aXRfc3RhdGU9RXhpdCBTdGF0ZQotQlNfQ29sdW1uX3RlYW1zPVRlYW0KLUJTX0NvbHVtbl90eXBlPVR5cGUKLUJTX0NvbHVtbl9tb2RlbF9pbmZvPU1vZGVsIEluZm8KLUJTX0NvbHVtbl9wcmVzZW50YXRpb25fbmFtZT1QcmVzZW50YXRpb24gTmFtZQotQlNfQ29sdW1uX2RlbGl2ZXJhYmxlPURlbGl2ZXJhYmxlCi1CU19Db2x1bW5faXNfb3B0aW9uYWw9T3B0aW9uYWwKLUJTX0NvbHVtbl9pc19wbGFubmVkPVBsYW5uZWQKLUJTX0NvbHVtbl9oYXNfbXVsdGlwbGVfb2NjdXJyZW5jZXM9TXVsdGlwbGUgT2NjdXJyZW5jZXMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmFlNDIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idGV4dFJlZmVyZW5jZVJlcGxhY2VyIiBuYW1lPSJUZXh0IFJlZmVyZW5jZSBSZXBsYWNlciIgc2NoZW1hPSJzY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRpYWdyYW1NYW5hZ2VyIiBuYW1lPSJEaWFncmFtIE1hbmFnZXIiIHNjaGVtYT0ic2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbW1hbmRMaXN0ZW5lcnMiIG5hbWU9IkNvbW1hbmQgTGlzdGVuZXJzIiBzY2hlbWE9InNjaGVtYS9jb21tYW5kTGlzdGVuZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImxpYnJhcnlJbnNwZWN0b3IiIG5hbWU9IkxpYnJhcnkgSW5zcGVjdG9yIiBzY2hlbWE9InNjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im5lc3RlZENvbW1hbmRQcm92aWRlcnMiIG5hbWU9Ik5lc3RlZCBDb21tYW5kIFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIiBuYW1lPSJPcHBvc2l0ZUZlYXR1cmUgTG9hZGVycyIgc2NoZW1hPSJzY2hlbWEvb3Bwb3NpdGVGZWF0dXJlTG9hZGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1c2VySW50ZXJhY3Rpb25IYW5kbGVyIiBuYW1lPSJVc2VyIEludGVyYWN0aW9uIEhhbmRsZXIiIHNjaGVtYT0ic2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdGlvblN1cHBvcnQiIG5hbWU9IlZhbGlkYXRpb24gU3VwcG9ydCIgc2NoZW1hPSJzY2hlbWEvdmFsaWRhdGlvblN1cHBvcnQuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idWlIZWxwZXIiIG5hbWU9IlVJIEhlbHBlciIgc2NoZW1hPSJzY2hlbWEvdWlIZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYWRhcHRlckZhY3RvcmllcyIgbmFtZT0iQWRhcHRlciBGYWN0b3JpZXMiIHNjaGVtYT0ic2NoZW1hL2FkYXB0ZXJGYWN0b3JpZXMuZXhzZCIvPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvYWRhcHRlckZhY3Rvcmllcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvYWRhcHRlckZhY3Rvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2JjODIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2FkYXB0ZXJGYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0iYWRhcHRlckZhY3RvcmllcyIgbmFtZT0iQWRhcHRlciBGYWN0b3JpZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzYTcwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9jb21tYW5kTGlzdGVuZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImNvbW1hbmRMaXN0ZW5lcnMiIG5hbWU9IkNvbW1hbmQgTGlzdGVuZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb21tYW5kTGlzdGVuZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29tbWFuZExpc3RlbmVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgbWlncmF0b3IuIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBpbXBsZW1lbnRhdGlvbiBvZiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9kaWFncmFtTWFuYWdlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvZGlhZ3JhbU1hbmFnZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3NTdhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9kaWFncmFtTWFuYWdlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJkaWFncmFtTWFuYWdlciIgbmFtZT0iRGlhZ3JhbSBNYW5hZ2VyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkaWFncmFtTWFuYWdlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRpYWdyYW1NYW5hZ2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjExYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbGlicmFyeUluc3BlY3Rvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJsaWJyYXJ5SW5zcGVjdG9yIiBuYW1lPSJMaWJyYXJ5IEluc3BlY3RvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBJbnNwZWN0IGNvbnRlbnRzIG9mIGxpYmFyeSBmb3IgZGVidWcgb3IgdGVzdGluZyBwdXJwb3NlLiBUaGUgaW50ZW50aW9uIGlzIHRvIHByb3ZpZGUgYSBjb252ZWllbnQgcGxhY2UgdG8gaG9vayBhbnkgZXh0ZXJuYWwgZGVidWcgb3IgdGVzdGluZyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG5vdCBwYXJ0IG9mIEVQRi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlJbnNwZWN0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaWJyYXJ5SW5zcGVjdG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSUxpYnJhcnlJbnNwZWN0b3IKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkOTM3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9uZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9Im5lc3RlZENvbW1hbmRQcm92aWRlcnMiIG5hbWU9Ik5lc3RlZCBDb21tYW5kIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBQcm92aWRlcnMgb2YgbmVzdGVkIGNvbW1hbmRzIHRvIGV4ZWN1dGUgcmlnaHQgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBjb21tYW5kLiBUaGUgZXh0ZW5zaW9uIG11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5lc3RlZENvbW1hbmRQcm92aWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJuZXN0ZWRDb21tYW5kUHJvdmlkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2E5ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvb3Bwb3NpdGVGZWF0dXJlTG9hZGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIiBuYW1lPSJPcHBvc2l0ZUZlYXR1cmUgTG9hZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib3Bwb3NpdGVGZWF0dXJlTG9hZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS90ZXh0UmVmZXJlbmNlUmVwbGFjZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3RleHRSZWZlcmVuY2VSZXBsYWNlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzA5ZDNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3RleHRSZWZlcmVuY2VSZXBsYWNlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiIG5hbWU9IlRleHQgUmVmZXJlbmNlIFJlcGxhY2VyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFJlcGxhY2VzIHRleHR1YWwgcmVmZXJlbmNlcyB0byB0aGUgb2xkIG9iamVjdHMgd2l0aCByZWZlcmVuY2VzIHRvIG5ldyBvYmplY3RzCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBtaWdyYXRvci4gVGhpcyBjbGFzcyBtdXN0IGJlIGEgcHVibGljIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyJmx0Oy9jb2RlJmd0OyB3aXRoIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVRleHRSZWZlcmVuY2VSZXBsYWNlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdWlIZWxwZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3VpSGVscGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGU4MzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdWlIZWxwZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0idWlIZWxwZXIiIG5hbWU9IlVJIEhlbHBlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBvZiBzb21lIFVJLXNwZWNpZmljIG9wZXJhdGlvbnMvZnVuY3Rpb25zCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1aUhlbHBlciIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idWlIZWxwZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklVSUhlbHBlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjUKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JVUlIZWxwZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzMTY4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS91c2VySW50ZXJhY3Rpb25IYW5kbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9InVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiIG5hbWU9IlVzZXIgSW50ZXJhY3Rpb24gSGFuZGxlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gaW50ZXJhY3Qgd2l0aCB1c2VyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1c2VySW50ZXJhY3Rpb25IYW5kbGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idXNlckludGVyYWN0aW9uSGFuZGxlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIHB1YmxpYyBjbGFzcyB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLiBUaGlzIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IG5vbi1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3ZhbGlkYXRpb25TdXBwb3J0LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS92YWxpZGF0aW9uU3VwcG9ydC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzlkZGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3ZhbGlkYXRpb25TdXBwb3J0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9InZhbGlkYXRpb25TdXBwb3J0IiBuYW1lPSJWYWxpZGF0aW9uIFN1cHBvcnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgU3VwcG9ydHMgY29udHJpYnV0aW9uL3JlcGxhY2VtZW50IG9mIHZhbGlkYXRvcnMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmFsaWRhdGlvbkZhY3RvcnkiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmFsaWRhdGlvbkZhY3RvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImNsYXNzIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVwbGFjZSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlmIHNldCB0byAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0OyB3aWxsIHJlcGxhY2UgYW55IG90aGVyIGV4aXN0aW5nIHZhbGlkYXRpb24gZmFjdG9yeSBpbiB0aGUgc3lzdGVtLiBJdCBpcyAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsgYnkgZGVmYXVsdC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmQwN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQSBzdWJjbGFzcyBvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciB0aGF0IGtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZQotICogY29udGFpbmluZyBmZWF0dXJlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIGFuZCBpbXBsZW1lbnRzIENvbXBhcmFibGUgdG8gc3VwcG9ydAotICogc29ydGluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCi0JcHVibGljIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9CQkKLQotCXB1YmxpYyBMaXN0IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmKGNoYW5nZU5vdGlmaWVyIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIGNoYW5nZU5vdGlmaWVyKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKG51bGwsIFRuZ1V0aWwudW53cmFwKHZhbHVlKSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgZ2l2ZW4gd3JhcHBlcnMgYnkga2VlcGluZyBleGlzdGluZywgcmVtb3ZpbmcvZGlzcG9zZSBvbGQsIGFuZAotCSAqIGFkZGluZyBuZXcgb25lcy4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcnMKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChDb2xsZWN0aW9uIHdyYXBwZXJzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCUNvbGxlY3Rpb24gdmFsdWVzLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCWlmICghdmFsdWVzLnJlbW92ZSh3cmFwcGVyLmdldFZhbHVlKCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl3cmFwcGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl3cmFwcGVycy5hZGQobmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIoZmVhdHVyZSwgaXRlcgotCQkJCQkubmV4dCgpLCBvd25lciwgYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCU9iamVjdCBvdGhlclZhbHVlID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0VmFsdWUoKTsKLQkJaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCXx8ICEob3RoZXJWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIHZhbHVlKS5nZXROYW1lKCkuY29tcGFyZVRvKAotCQkJCSgoTWV0aG9kRWxlbWVudCkgb3RoZXJWYWx1ZSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lBZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lBZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzUzZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3Igd29yayBicmVha2Rvd24gc3RydWN0dXJlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRlYW0gdXNhZ2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQWRhcHRlckZhY3RvcnkgZ2V0VEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciB3b3JrIHByb2R1Y3QgdXNhZ2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3IgY29uc29saWRhdGVkIHZpZXcgb2YgdGhlIHByb2Nlc3MuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlZWVmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGJyZWFrIGRvd24gZWxlbWVudCBpdGVtIHByb3ZpZGVycyB0aGF0IHdhbnQKLSAqIHRvIG1hbnRhaW4gYSBsaXN0IGNhY2hlZCBjaGlsZHJlbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgY2FjaGVkIGNoaWxkcmVuLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGNhY2hlZCBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21DYWNoZSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY2FjaGVkIHJvbGx1cCBjaGlsZGVuLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGNhY2hlZCByb2xsdXAgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29tbWFuZExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb21tYW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0N2JiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb21tYW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGNvbW1hbmRzIHRoYXQgd2FudCB0byBub3RpZnkgdGhlaXIgbGlzdGVuZXJzIG9mCi0gKiBjZXJ0YWluIGV2ZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZExpc3RlbmVyIHsKLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gcHJpb3IgdG8gdGhlIGV4ZWN1dGlvbiB0aGUgZ2l2ZW4gY29tbWFuZAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgcHJlRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHRoYXQgYSBjb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBhIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHByaW9yIHRvIHRoZSB1bmRvIG9mIHRoZSBnaXZlbiBjb21tYW5kCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIGFuIHVuZG8gY29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIHByZVVuZG8oQ29tbWFuZCBjb21tYW5kKTsKLQotCQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBhZnRlciB1bmRvCi0JICovCi0JCi0JcHVibGljIHZvaWQgcG9zdFVuZG8oQ29tbWFuZCBjb21tYW5kKTsKLQkvKioKLQkgKiBHZXRzIHRoZSBjb21tYW5kIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb21tYW5kIGNsYXNzLgotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRDb21tYW5kVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhiNmRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGlzcGxheSBhCi0gKiBmaWx0ZXJlZCBsaXN0IG9mIGNoaWxkcmVuIGFuZCBoYXZlIHRoZWlyIGRlZmF1bHQgbGFiZWwgb3ZlcndyaXR0ZW4gYXQKLSAqIHJ1bnRpbWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYWJsZSB7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaWx0ZXIgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciB0aGlzIG9iamVjdCdzIGNoaWxkcmVuLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGFuIDxjb2RlPklGaWx0ZXI8L2NvZGU+IG9iamVjdAotCSAqIEBzZWUgSUZpbHRlcgotCSAqLwotCXZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsIGZvciB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYQotCSAqICAgICAgICAgICAgc3RyaW5nIGxhYmVsCi0JICovCi0Jdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiZWYyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0byBvYnRhaW4gYW5kIHJlc29sdmUgbWV0aG9kIGVsZW1lbnQgYXR0cmlidXRlcyBhbmQKLSAqIHJlZmVyZW5jZXMgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIHZhcmlhYmlsaXR5IGVsZW1lbnQgaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2ZQotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGFuIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIEVBdHRyaWJ1dGUgYXR0ciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIGNvbnRlbnQgZGVzY3JpcHRpb24gaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBhbiBhdHRyaWJ1dGUgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoQ29udGVudERlc2NyaXB0aW9uIGRlc2MsIERlc2NyaWJhYmxlRWxlbWVudCBvd25lciwKLQkJCUVBdHRyaWJ1dGUgYXR0ciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVmZXJlbmNlIHZhbHVlIG9mIGEgdmFyaWFiaWxpdHkgZWxlbWVudCBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZlCi0JICogICAgICAgICAgICBhIHZhcmlhYmlsaXR5IGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmCi0JICogICAgICAgICAgICBhIHJlZmVyZW5jZSByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIEVSZWZlcmVuY2UgcmVmLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVmZXJlbmNlIHZhbHVlIG9mIGEgY29udGVudCBkZXNjcmlwdGlvbiBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2MKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG93bmVyIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIHJlZgotCSAqICAgICAgICAgICAgYSByZWZlcmVuY2UgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoQ29udGVudERlc2NyaXB0aW9uIGRlc2MsIERlc2NyaWJhYmxlRWxlbWVudCBvd25lciwKLQkJCUVSZWZlcmVuY2UgcmVmLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2UgdmFsdWUgb2YgYSBtZXRob2QgZWxlbWVudCBvcHBvc2l0ZSBmZWF0dXJlIGluIGEgbWV0aG9kCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhbiBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG1ldGhvZCBlbGVtZW50IGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZDM4NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIGFuZCBjb21tYW5kcyB0aGF0IHdhbnQgdG8gZmlsdGVyCi0gKiBkb3duIHJlbGF0ZWQgbWV0aG9kIGVsZW1lbnRzIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0b3IgZXh0ZW5kcyBJTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyLCBJRmlsdGVyLCBBZGFwdGVyIHsKLQotCXZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm4gYSBub24tTlVMTCwgdGhlIGl0ZW0gcHJvdmlkZXIgd2lsbCB1c2UgdGhlIHJldHVybmVkCi0JICogY29sbGVjdGlvbiBhcyBjaGlsZHJlbiBpbiBwbGFjZSBvZiBpdHMgZGVmYXVsdCBjaGlscmVuLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gY2hpbGRGZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCUNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSk7Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGlzIG9iamVjdCBhY2NvcmRpbmcgdG8gdmFyaWFiaWxpdHkgcnVsZXMuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gcmVzb2x2ZWQgb2JqZWN0IHRoYXQgaXMgZWl0aGVyIHRoZSBvYmplY3QgaXRzZWxmLCBvciBpdHMgcmVwbGFjZXIKLQkgKiAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgdmFyaWFiaWxpdHkgb2YgdGhpcyBvYmplY3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JT2JqZWN0IHJlc29sdmUoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBHZXRzIHZhcmlhYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWQKLQkgKiBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIGNvbmZpZ3VyYXRvciBhbmQgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHZhcmlhYmlsaXR5IHJ1bGVzLgotCSAqIAotCSAqIEBwYXJhbSB2ZQotCSAqIEByZXR1cm4KLQkgKiBAc2VlIFZhcmlhYmlsaXR5SW5mbwotCSAqLwotCVZhcmlhYmlsaXR5SW5mbyBnZXRWYXJpYWJpbGl0eUluZm8oVmFyaWFiaWxpdHlFbGVtZW50IHZlKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHRhc2tzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0VW5jYXRlZ29yaXplZFRhc2tGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB3b3JrcHJvZHVjdHMgd2l0aG91dCBhIGRvbWFpbgotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHdvcmtwcm9kdWN0cyB3aXRob3V0IGEgV1AgVHlwZQotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFdwVHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgcm9sZXMKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkUm9sZUZpbHRlcigpOwotCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCB0b29sIG1lbnRvcnMKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlcigpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIGRpc2NpcGxpbmVzIGFuZCBkaXNwbGluZSBncm91cGluZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXREaXNjaXBsaW5lc0ZpbHRlcigpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHJvbGVzZXRzIGFuZCByb2xlc2V0IGdyb3VwaW5ncwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFJvbGVTZXRzRmlsdGVyKCk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNiOThhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBjb25maWd1cmF0aW9uIGZpbHRlciBmYWN0b3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0b3JGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25maWd1cmF0aW9uIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gZmlsdGVyLgotCSAqLwotCUlDb25maWd1cmF0b3IgY3JlYXRlQ29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRGVmYXVsdE5hbWVTZXR0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSURlZmF1bHROYW1lU2V0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjBhN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRGVmYXVsdE5hbWVTZXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBpdGVtIHByb3ZpZGVycyB0aGF0IHdhbnQgdG8gYXNzaWduIGEgZGVmYXVsdCBuYW1lCi0gKiBmb3IgZWFjaCBuZXdseSBjcmVhdGVkIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZWZhdWx0TmFtZVNldHRlciB7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IG5hbWUgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaik7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBJRCBvZiB0aGUgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIG1ldGhvZCBlbGVtZW50cyB3aG9zZSBkZWZhdWx0Ci0JICogbmFtZSBzZXQgdGhyb3VnaCB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRCBvZiBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG93bmVyIGNsYXNzIG9mIHRoZSBmZWF0dXJlIHRoYXQgY29udGFpbnMgbWV0aG9kIGVsZW1lbnRzIHdob3NlCi0JICogZGVmYXVsdCBuYW1lIHNldCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG93bmVyIGNsYXNzIG9mIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5MmEwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogQSBnZW5lcmljIGZpbHRlciB0aGF0IHVzZXMgdGhlIHZpc2l0b3IgZGVzaWduIHBhdHRlcm4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbHRlciB7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYnkgdGhpcyBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgdGhlIHZpc2l0aW5nIG9iamVjdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBhY2NlcHRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JR3JvdXBDb250YWluZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUdyb3VwQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMjA1NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JR3JvdXBDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBpdGVtIHByb3ZpZGVycyB0aGF0IHdhbnQgdG8gbGV0IGNsaWVudHMgYWNjZXNzIGl0cwotICoge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgPGVtPmdyb3VwIGl0ZW0gcHJvdmlkZXJzPC9lbT59Ci0gKiBieSBuYW1lLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElHcm91cENvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBncm91cCBpdGVtIHByb3ZpZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBncm91cCBpdGVtIHByb3ZpZGVyCi0JICogQHJldHVybiBhIDxjb2RlPlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyPGNvZGU+IG9iamVjdAotCSAqLwotCU9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUxpYnJhcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUxpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyYTUzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBpdGVtIHByb3ZpZGVycyB0aGF0IHdhbnQgdG8gaW5jbHVkZSBVSSBmb2xkZXJzCi0gKiBhbmQgZmVhdHVyZSBkZXJpdmVkIGNoaWxkcmVuLiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyBpdGVtIHByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIGEgcGFyZW50IG9iamVjdCwgdHlwaWNhbGx5IGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQl2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNoaWxkcmVuIGZlYXR1cmVzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBmZWF0dXJlcyBmb3IgcmV0cmlldmluZyB0aGUgY2hpbGQgZWxlbWVudHMKLQkgKi8KLQlDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOThlMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyIHsKLQlNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSU5hbWVkRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lOYW1lZEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmMxYTVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSU5hbWVkRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVkRmlsdGVyIGV4dGVuZHMgSUZpbHRlciB7Ci0JU3RyaW5nIGdldE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhMjg2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyIHsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIFBsdWdpbiBQYWNrYWdlIHByZXNlbnRhdGlvbiBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpc0ZsYXQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGxheW91dCBpcyBub3cgZmxhdCBtb2RlLiBpZiA8Y29kZT5mYWxzZTwvY29kZT4sCi0JICogbGF5b3V0IGlzIGhpZXJhcmNoaWNhbC4KLQkgKi8KLQl2b2lkIGxheW91dENoYW5nZWQoYm9vbGVhbiBpc0ZsYXQpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lSZWZlcmVuY2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lSZWZlcmVuY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTk0MmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUmVmZXJlbmNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGFkYXB0ZXIgZmFjdG9yaWVzIGZvciBjbGVhbmluZyB1cCByZWZlcmVuY2VzIHRvCi0gKiB1bnVzZWQgaXRlbSBwcm92aWRlcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZmVyZW5jZXIgewotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHRvIGFuIGl0ZW0gcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqICAgICAgICAgICAgYSByZWZlcmVuY2UgdG8gYW4gaXRlbSBwcm92aWRlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlZmVyZW5jZSBpcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgcmVmKTsKLQotCS8qKgotCSAqIENsZWFucyB1cCBhbGwgdW51c2VkIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lTdGF0ZWZ1bEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JU3RhdGVmdWxJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzMmNlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lTdGF0ZWZ1bEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IHN0YXRlZnVsdCBpdGVtIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8gYmUKLSAqIGRpc3Bvc2VkIGFmdGVyIHRoZXkgYXJlIG5vIGxvbmdlciB1c2VkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciBleHRlbmRzIElEaXNwb3NhYmxlIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmQ2NTk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdyYXBwZXIgewotCi0JT2JqZWN0IHdyYXAoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsCi0JCQlpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzZmYxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogRmFjdG9yeSB0byBjcmVhdGUge0BsaW5rIElXcmFwcGVySXRlbVByb3ZpZGVyfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB3cmFwcGVyIG9mIGdpdmVuIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb3duZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgdmFsdWUgaXMgbG9jYXRlZC4gSWYgZmVhdHVyZSBpcyBub24tbnVsbCwgdGhpcyBpbmRleCBpcyB3aXRoaW4gdGhhdCBmZWF0dXJlLgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjNkYTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlciB7Ci0JSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGdldFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzcyYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgRWRpdCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5RWRpdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlFZGl0UGx1Z2luIHBsdWdpbjsKLQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvLyBUaGUgc2hhcmVkIGltYWdlIGhhc2ggbWFwLgotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGltYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlFZGl0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlFZGl0UGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5bWJvbGljTmFtZSgpIHsKLQkJcmV0dXJuIGdldElkKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JICAgIE9iamVjdCByZXN1bHQgPSBpbWFnZXMuZ2V0KGtleSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBkb0dldEltYWdlKGtleSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWlmKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJaW1hZ2VzLnB1dChrZXksIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBkb0dldEltYWdlKFN0cmluZyBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JICAgIFVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwgKyBrZXkgKyAiLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsgCi0JICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JICAgIHJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGltYWdlIGdpdmVuIHRoZSBVUkkuCi0JICogCi0JICogQHBhcmFtIGltYWdlVVJJCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBVUkkuCi0JICogQHJldHVybiBUaGUgaW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTaGFyZWRJbWFnZShVUkkgaW1hZ2VVUkkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbWFnZVVSSS50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MzNiY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IEVkaXQgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlicmFyeUVkaXRSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfZGVlcF9jb3B5X3ZhcmlhYmlsaXR5X3Byb21wdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkX3RvX2RlZmF1bHRfY29uZmlnX2RsZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdF9jb3B5X29yX2V4dGVuZF9kZWxpdmVyeV9wcm9jZXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdSZXNvdXJjZXNfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5X2Vycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nICByZXBsYWNpbmdfYW5jZXN0b3JfZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRmVhdHVyZVZhbHVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZV9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ0FjdGl2aXRpZXNfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWVwQ29weV9wcm9tcHRNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWVwQ29weV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0Q29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VQcm9jZXNzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0VGVhbXNEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aXRsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBsdWdpbk5hbWVFcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9Db25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vQmFzZVByb2Nlc3NFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQcm9jZXNzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUVsZW1lbnRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZG9Db21tYW5kRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlX291dG9mc3luY2hfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlX291dG9mc3luY2hfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbXNnV2l0aERldGFpbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlRmlsZUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmluZ1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmluZ0ZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0ZpbGVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc1RvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbENvbnRyaWJ1dGVzVG9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VzX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kc19yZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxSZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5yZXNvbHZlZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaXN0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5rbm93bl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tbWFuZF9kb25lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfcmVmX2RlbGV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3JlZl9kZWxldGUyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfcmVmZXJlbmNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZ2VuZXJpY0Vycl9tZXNzYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX2V4dGVuZHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX3JlcGxhY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc19sb2NhbFJlcGxhY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190b29sc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19hY3Rpdml0aWVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bmNocm9uaXplQ29tcGxldGVEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0VsZW1lbnRfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZF9NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFR5cGVfTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9NYW51YWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9BbHBoYWJldGljOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX01ldGhvZFR5cGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3BlY2lmeU5hbWVUZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fRklOSVNIX1RPX1NUQVJUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fRklOSVNIX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX1NUQVJUOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1BsdWdpblVJUGFja2FnZUNvbnRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2I2NjlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFN0b3JlcyAoaW4gbWVtb3J5IG9ubHkpIHRoZSBGbGF0L0hpZXJhcmNoaWNhbCBwbHVnaW4tcGFja2FnZSBsYXlvdXQKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZUNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGx1Z2luVUlQYWNrYWdlQ29udGV4dCBJTlNUQU5DRSA9IG5ldyBQbHVnaW5VSVBhY2thZ2VDb250ZXh0KCk7IAotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmxhdExheW91dCA9IGZhbHNlOwotCQotCXByaXZhdGUgTGlzdDxJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElFUkFSQ0hJQ0FMX0xBWU9VVD0gImhpZXJhcmNoaWNhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFUX0xBWU9VVD0gImZsYXQiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZsYXRMYXlvdXQoKSB7Ci0JCXJldHVybiBpc0ZsYXRMYXlvdXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRvZ2dsZUxheW91dCgpIHsKLQkJaXNGbGF0TGF5b3V0ID0gIWlzRmxhdExheW91dDsKLQkJbm90aWZ5TGlzdGVuZXJzKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF5b3V0QXNTdHJpbmcoKSB7Ci0JCWlmIChpc0ZsYXRMYXlvdXQoKSkgewotCQkJcmV0dXJuIEZMQVRfTEFZT1VUOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIEhJRVJBUkNISUNBTF9MQVlPVVQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0SGllcmFyY2hpY2FsKCkgewotCQlpc0ZsYXRMYXlvdXQgPSBmYWxzZTsKLQkJbm90aWZ5TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RmxhdCgpIHsKLQkJaXNGbGF0TGF5b3V0ID0gdHJ1ZTsKLQkJbm90aWZ5TGlzdGVuZXJzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExheW91dEZsYXRXaXRob3V0Tm90aWZ5KGJvb2xlYW4gZmxhZykgewotCQlpc0ZsYXRMYXlvdXQgPSBmbGFnOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXI+KCk7Ci0JCX0KLQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycygpIHsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyPiBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5sYXlvdXRDaGFuZ2VkKGlzRmxhdExheW91dCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ByZXNlbnRhdGlvbkNvbnRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJlc2VudGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGYzMjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJlc2VudGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciA3LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlc2VudGF0aW9uQ29udGV4dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVzZW50YXRpb25Db250ZXh0IElOU1RBTkNFID0gbmV3IFByZXNlbnRhdGlvbkNvbnRleHQoKTsgCi0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWVzID0gZmFsc2U7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBDb21wYXJhdG9ycy5ERUZBVUxUX0NPTVBBUkFUT1I7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIHJldmVyc2VDb21wYXJhdG9yID0gQ29tcGFyYXRvcnMuUkVWRVJTRV9ERUZBVUxUX0NPTVBBUkFUT1I7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIG1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvciA9IENvbXBhcmF0b3JzLk1FVEhPRF9UWVBFX0NPTVBBUkFUT1I7Ci0JCi0JCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGd1aWRhbmNlVHlwZUNvbXBhcmF0b3IgPSBuZXcgVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3IjZ2V0RGVmYXVsdENvbXBhcmF0b3IoKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RGVmYXVsdENvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gY29tcGFyYXRvcjsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlpbnQgaWQgPSAoKEd1aWRhbmNlKSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCWlmIChpZCA9PSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTikgewotCQkJCQlpZCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJCX0KLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBDb21wYXJhdG9yIHByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvciA9IG5ldyBUeXBlQ29tcGFyYXRvcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvciNnZXREZWZhdWx0Q29tcGFyYXRvcigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBjb21wYXJhdG9yOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgaW50IGdldE9yZGVySWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlyZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9OwotCi0KLQkKLQlwcml2YXRlIFByZXNlbnRhdGlvbkNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBzaG93UHJlc2VudGF0aW9uTmFtZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWVzKGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWVzKSB7Ci0JCXRoaXMuc2hvd1ByZXNlbnRhdGlvbk5hbWVzID0gc2hvd1ByZXNlbnRhdGlvbk5hbWVzOwotCQljb21wYXJhdG9yID0gc2hvd1ByZXNlbnRhdGlvbk5hbWVzID8gQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUiA6IENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUjsKLQkJcmV2ZXJzZUNvbXBhcmF0b3IgPSBzaG93UHJlc2VudGF0aW9uTmFtZXMgPyBDb21wYXJhdG9ycy5SRVZFUlNFX1BSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IgOiBDb21wYXJhdG9ycy5SRVZFUlNFX0RFRkFVTFRfQ09NUEFSQVRPUjsKLQkJbWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yID0gc2hvd1ByZXNlbnRhdGlvbk5hbWVzID8gQ29tcGFyYXRvcnMuTUVUSE9EX1RZUEVfUFJFU19OQU1FX0NPTVBBUkFUT1IgOiBDb21wYXJhdG9ycy5NRVRIT0RfVFlQRV9DT01QQVJBVE9SOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBjb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFJldmVyc2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gcmV2ZXJzZUNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0R3VpZGFuY2VUeXBlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIGd1aWRhbmNlVHlwZUNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UHJvY2Vzc1BhY2thZ2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VDb21wYXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFByZXNOYW1lQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UHJlc05hbWVSZXZlcnNlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIENvbXBhcmF0b3JzLlJFVkVSU0VfUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUjsKLQl9Ci0JCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UHJlc05hbWVNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBDb21wYXJhdG9ycy5NRVRIT0RfVFlQRV9QUkVTX05BTUVfQ09NUEFSQVRPUjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJvdmlkZXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Byb3ZpZGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTExMGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJvdmlkZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvdmlkZXJzIHsKLQotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmF0b3JGYWN0b3J5IGNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmZXJlbmNlU3RvcmU7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBhdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmU7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIFByb3ZpZGVycygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmF0b3JGYWN0b3J5IGdldENvbmZpZ3VyYXRvckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0b3JGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0b3JGYWN0b3J5KAotCQkJSUNvbmZpZ3VyYXRvckZhY3RvcnkgY29uZmlndXJhdG9yRmFjdG9yeSkgewotCQlQcm92aWRlcnMuY29uZmlndXJhdG9yRmFjdG9yeSA9IGNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoCi0JCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlndXJhdGlvbkFwcGxpY2F0b3IpIHsKLQkJUHJvdmlkZXJzLmNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yID0gY29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmZXJlbmNlU3RvcmUpIHsKLQkJUHJvdmlkZXJzLnByZWZlcmVuY2VTdG9yZSA9IHByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGdldEF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIGF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlKSB7Ci0JCWF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZSA9IHN0b3JlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckNvbW1hbmRMaXN0ZW5lcihJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUxpc3QgbGlzdGVuZXJzID0gKExpc3QpIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAuZ2V0KGxpc3RlbmVyCi0JCQkJLmdldENvbW1hbmRUeXBlKCkpOwotCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAucHV0KGxpc3RlbmVyLmdldENvbW1hbmRUeXBlKCksIGxpc3RlbmVycyk7Ci0JCX0gZWxzZSBpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDb21tYW5kTGlzdGVuZXIoSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlMaXN0IGxpc3RlbmVycyA9IChMaXN0KSBjb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwLmdldChsaXN0ZW5lcgotCQkJCS5nZXRDb21tYW5kVHlwZSgpKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWlmIChsaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQkJY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5yZW1vdmUobGlzdGVuZXIuZ2V0Q29tbWFuZFR5cGUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29tbWFuZExpc3RlbmVycyhDbGFzcyBjb21tYW5kVHlwZSkgewotCQlyZXR1cm4gKExpc3QpIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAuZ2V0KGNvbW1hbmRUeXBlKTsKLQl9Ci0KLQlzdGF0aWMgewotCQkvLyByZWdpc3RlciBjb21tYW5kIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBjb250cmlidXRlZCB2aWEgZXh0ZW5zaW9uIHBvaW50IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZExpc3RlbmVycwotCQkvLwotCQl0cnkgewotCQkJU3RyaW5nIG5hbWVzcGFjZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpOwotCQkJU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSA9ICJjb21tYW5kTGlzdGVuZXJzIjsgLy8kTk9OLU5MUy0xJAotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlpZihleHQgaW5zdGFuY2VvZiBJQ29tbWFuZExpc3RlbmVyKSB7Ci0JCQkJCQkJCQlyZWdpc3RlckNvbW1hbmRMaXN0ZW5lcigoSUNvbW1hbmRMaXN0ZW5lcikgZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI0NWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBHZW5lcmljIERpYWxvZyBUaXRsZXMKLW1vdmVEaWFsb2dfdGl0bGU9TW92ZQotZGVsZXRlRGlhbG9nX3RpdGxlPURlbGV0ZSBFbGVtZW50Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPUNhbm5vdCByZW5hbWUgezB9ICcnezF9JycgdG8gJyd7Mn0nJy4gUmVzb2x2ZSB0aGUgaXNzdWUgc2hvd24gaW4gRGV0YWlscyBhbmQgY2xpY2sgT0sgdG8gY29udGludWUgb3IgQ2FuY2VsIHRvIGFib3J0IHRoaXMgb3BlcmF0aW9uLgotCi0jIENvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsIERpYWxvZwotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZT1Db25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbAotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVRoZSBlbGVtZW50KHMpIHlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGFyZSBzdGlsbCBiZWluZyByZWZlcmVuY2VkIGJ5IG90aGVyIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgbGlicmFyeS4gRGVsZXRpbmcgdGhlc2UgZWxlbWVudHMgd2lsbCByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGVtLCB0aGVyZWZvcmUsIHdpbGwgdXBkYXRlIHRoZSByZWZlcnJpbmcgZWxlbWVudHMgYXMgd2VsbC4gIE1ha2Ugc3VyZSB5b3UgaGF2ZSBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgcmVmZXJyaW5nIGVsZW1lbnRzIGJlZm9yZSBjbGlja2luZyBPSy4gIENsaWNrIERldGFpbHMgdG8gcmV2aWV3IHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIHRoZSBlbGVtZW50KHMpIHRoYXQgeW91IGFyZSBhYm91dCB0byBkZWxldGUuCi0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZwotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1SZXNvbHZlIEVsZW1lbnQgTmFtZSBDb25mbGljdAotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PUVudGVyIGEgbmV3IHswfSBmb3IgJyd7MX0nJzoKLQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZwotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlPVNlbGVjdCBEZWxpdmVyYWJsZXMKLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVNlbGVjdCBhIGRlbGl2ZXJhYmxlIHdoZXJlIHlvdSB3YW50IHdvcmsgcHJvZHVjdCAnJ3swfScnIHRvIGJlIGFzc2lnbmVkLgotCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cKLW5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGU9TmV3IFByb2Nlc3MgQ29tcG9uZW50Ci1uYW1lTGFiZWxfdGV4dD1OYW1lOgotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9RGVmYXVsdCBDb25maWd1cmF0aW9uOgotYmFzZVByb2Nlc3NMYWJlbF90ZXh0PUJhc2UgUHJvY2VzczoKLWJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0PUJhc2VkIG9uIFByb2Nlc3NlczoKLVNwZWNpZnlOYW1lVGV4dD1TcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZwotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVNlbGVjdCBhc3NvY2lhdGlvbiBmb3IgdGhlIHRhc2sgJyd7MH0nJwotCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cKLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9UmVtb3ZlIEFzc29jaWF0aW9uCi0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZwotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9U2VsZWN0IFRlYW1zCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVNlbGVjdCBhIHRlYW0gd2hlcmUgeW91IHdhbnQgYSByb2xlICcnezB9JycgdG8gYmUgYXNzaWduZWQuCi0KLSMgVGFzayBTZWxlY3Rpb24gRGlhbG9nCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVRhc2sgU2VsZWN0aW9uCi10aXRsZUxhYmVsX3RleHQ9U2VsZWN0IHRhc2tzLi4KLQotIyBFcnJvciBNZXNzYWdlcwotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMEU6IFRoZSB7MH0gbmFtZSBpcyBtaXNzaW5nLlxuQWxsIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cyBtdXN0IGhhdmUgYSBuYW1lLlxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAxRTogVGhlIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy5cbkEgbWV0aG9kIGVsZW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuXG5FbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzI9RW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLiBQbGVhc2Ugc3BlY2lmeSBhbm90aGVyIG5hbWUuCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBzdGFydCB3aXRoIGEgc3BhY2UuXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5BIG1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IGVuZCB3aXRoIGEgcGVyaW9kLlxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gIiA8ID4gOyB8XG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2c9SVVQTDAxMDVFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5BIG1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IGNvbnRhaW4gdGhlIGNoYXJhY3RlcjogJlxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkUGx1Z2luTmFtZUVycm9yX21zZz1JVVBMMDEyMUU6IFRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC5cbkEgbWV0aG9kIHBsdWctaW4nJ3MgbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/ICIgPCA+IDsgfCAjICUgJydcbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2c9RmlsZSBwYXRoIG5hbWUgdG9vIGxvbmcgKGV4Y2VlZGluZyAnJ3swfScnKSAKLW5vQ29uZmlnRXJyb3JfbXNnPVRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGRvZXMgbm90IGNvbnRhaW4gYW55IG1ldGhvZCBjb25maWd1cmF0aW9uLlxuQSBtZXRob2QgY29uZmlndXJhdGlvbiBpcyBuZWVkZWQgdG8gY3JlYXRlIGEgbmV3IHByb2Nlc3MuXG5DcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBUaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIGFueSBkZWxpdmVyeSBwcm9jZXNzZXMuXG5BIGJhc2UgZGVsaXZlcnkgcHJvY2VzcyBpcyBuZWVkZWQgdG8gY3JlYXRlIGEgbmV3IHByb2Nlc3MgY29udHJpYnV0aW9uLlxuQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyBhbmQgdHJ5IGFnYWluLgotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RTogTm8gbWV0aG9kIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc2VsZWN0ZWQuXG5BIGRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgbmV3IHByb2Nlc3MuXG5TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotbm9CYXNlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOEU6IE5vIGRlbGl2ZXJ5IHByb2Nlc3MgaGFzIGJlZW4gc2VsZWN0ZWQuXG5BIHByb2Nlc3MgY29udHJpYnV0aW9uIHJlcXVpcmVzIGEgYmFzZSBkZWxpdmVyeSBwcm9jZXNzLlxuU2VsZWN0IGEgZGVsaXZlcnkgcHJvY2VzcyBhbmQgdHJ5IGFnYWluLgotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUU6IFRoZSBwcm9jZXNzIGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogVGhlIGVsZW1lbnQgY2Fubm90IGJlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2c9SVVQTDAxMTJFOiBUaGUgY29udGVudCBmaWxlIGZvciB0aGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBvciByZW5hbWVkIHRvIG1hdGNoIHRoZSBlbGVtZW50IG5hbWUuXG5cbkEgZmlsZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLlxuXG5FbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9QSBjb250ZW50IGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXRzLiBQbGVhc2Ugc3BlY2lmeSBhbm90aGVyIG5hbWUuCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IFRoZSB1bmRvIGNvbW1hbmQgJyd7MH0nJyBjYW5ub3QgYmUgY29tcGxldGVkLlxuXG5BbiBlcnJvciBoYXMgb2NjdXJyZWQ6IHsxfQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogVGhlIHNwZWNpZmllZCBwcmVkZWNlc3NvciBpbmRleCBpcyBpbnZhbGlkLlxuXG5BIHByZWRlY2Vzc29yIGluZGV4IG11c3QgYmUgYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSAnSW5kZXgnIGNvbHVtbi5cblxuU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGFuZCB0cnkgYWdhaW4uCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgdG8gJyd7MX0nJy4gIE9ubHkgb25lIGFzc29jaWF0aW9uIG9mIHRoaXMga2luZCBpcyBhbGxvd2VkLiAgVG8gYXNzaWduICcnezB9JycgdG8gJyd7Mn0nJyB5b3UgbmVlZCB0byBmaXJzdCByZW1vdmUgaXQgZnJvbSAnJ3sxfScnLgotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIFNlZSBlcnJvciBsb2cgZm9yIG1vcmUgZGV0YWlscy4KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IE5hbWUgY29uZmxpY3Qgd2lsbCBvY2N1ciBhZnRlciB0aGlzIG9wZXJhdGlvbi4gQ2hlY2sgZWxlbWVudCdzIG5hbWUgZm9yIGR1cGxpY2F0aW9uIGFuZCB0cnkgYWdhaW4KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IE5hbWUgY29uZmxpY3Qgd2lsbCBvY2N1ciBhZnRlciB0aGlzIG9wZXJhdGlvbi4gQ2hlY2sgZWxlbWVudCdzIHByZXNlbnRhdGlvbiBuYW1lIGZvciBkdXBsaWNhdGlvbiBhbmQgdHJ5IGFnYWluCi0KLSMgRXJyb3IgUmVhc29ucwotZXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIHByb2Nlc3MgJyd7MH0nJy4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHJlbW92aW5nIHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVGaWxlRXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIGZpbGUgJyd7MH0nJy4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPURldGVjdGVkIG1ldGhvZCBlbGVtZW50cyB3aXRoIGludmFsaWQgcmVmZXJlbmNlcyBhcyBhIHJlc3VsdCBvZiBjcm9zcyBwbHVnLWluIGNvcHkuXG5UaGVzZSByZWZlcmVuY2VzIHdpbGwgYmUgcmVtb3ZlZC4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci11bnJlc29sdmVkT2JqZWN0RXJyb3JfcmVhc29uPUNhbm5vdCBtb2RpZnkgYW4gdW5yZXNvbHZlZCBvYmplY3Q6IHswfShVUkkgPSB7MX0pezJ9Ci0KLSMgV2FybmluZyBtZXNzYWdlcwotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogQ291bGQgbm90IGZpbmQgb25lIG9yIG1vcmUgc291cmNlIGVsZW1lbnRzLiBBc3NvY2lhdGVkIGZpbGVzIGluIHRoZSByZXNvdXJjZXMgZm9sZGVyIHdpbGwgbm90IGJlIGNvcGllZC4KLUFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMTlXOiBDb3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBzb3VyY2UgZWxlbWVudHMuIEFzc29jaWF0ZWQgUHJvY2VzcyBQYWNrYWdlcyB3aWxsIG5vdCBiZSBjb3BpZWQuCi1BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c9RG8geW91IHdhbnQgdG8gY29weSBhbGwgZGVzY3JpcHRvcnM/XG5cbkNsaWNraW5nIG9uIE5vIHdpbGwgY29weSBvbmx5IHRoZSBkZXNjcmlwdG9ycyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi1kZWVwQ29weV9wcm9tcHRNc2c9WW91IHdpbGwgZ2V0IGEgY29weSBvZiBhbGwgZHluYW1pY2FsbHkgbGlua2VkIGVsZW1lbnRzIHRoYXQgeW91IG5lZWQgdG8gbWFpbnRhaW4gc2VwYXJhdGVseSBmcm9tIG5vdyBvbi4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1kZWVwQ29weV90aXRsZT1EZWVwIENvcHkKLQotIyBQcm9ncmVzcyBtZXNzYWdlcwotY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lPUNyZWF0aW5nIHByb2Nlc3MgY29tcG9uZW50ICcnezB9JycuLi4KLXByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lPVByb2Nlc3NpbmcgcmVmZXJlbmNlcy4uLgotZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZT1EZWxldGluZyBlbGVtZW50cyBhbmQgYXNzb2NpYXRlZCBmaWxlcy4uLgotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPUNoZWNraW5nIGZvciByZWZlcmVuY2VzLi4uCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9UmVtb3ZpbmcgcmVmZXJlbmNlcy4uLgotc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZT1TYXZpbmcgbW9kaWZpZWQgZmlsZShzKS4uLgotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1DaGVja2luZyBhZmZlY3RlZCByZXNvdXJjZXMuLi4KLW1vdmluZ1Rhc2tfbmFtZT1Nb3ZpbmcuLi4KLW1vdmluZ0ZpbGVzVGFza19uYW1lPU1vdmluZyBmaWxlcy4uLgotY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZT1Db3B5aW5nIHJlc291cmNlcy4uLgotY29weWluZ0FjdGl2aXRpZXNfbXNnPUNvcHlpbmcgYWN0aXZpdHkgJyd7MH0nJwotc2F2aW5nRmlsZVRhc2tfbmFtZT1TYXZpbmcgZmlsZSAnJ3swfScnLi4uCi1zYXZpbmdSZXNvdXJjZXNfbXNnPVNhdmluZyByZXNvdXJjZXMKLQotIyBVSSBUZXh0Ci1lbGVtZW50X3RleHQ9ZWxlbWVudAotY3JlYXRlRWxlbWVudF90ZXh0PUNyZWF0ZSBFbGVtZW50Ci1jcmVhdGVQcm9jZXNzX3RleHQ9Q3JlYXRlIFByb2Nlc3MKLWNvbnRyaWJ1dGVzVG9fdGV4dD1Db250cmlidXRlcyB0bwotbG9jYWxDb250cmlidXRlc1RvX3RleHQ9TG9jYWxseSBDb250cmlidXRlcyB0bwotZXh0ZW5kc190ZXh0PUV4dGVuZHMKLXJlcGxhY2VzX3RleHQ9UmVwbGFjZXMKLWV4dGVuZHNfcmVwbGFjZXNfdGV4dD1FeHRlbmRzIGFuZCBSZXBsYWNlcwotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsbHkgUmVwbGFjZXMKLWxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0PUxvY2FsIFJlcGxhY2VtZW50IGFuZCBEZWVwIENvcCZ5Ci1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9Ci1kZWxpdmVyYWJsZXNfdGV4dD1EZWxpdmVyYWJsZXMKLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9Q29udHJpYnV0ZSBUbyBBY3Rpdml0eQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1Ecm9wIEFjdGl2aXR5Ci1yZXBsYWNlQWN0aXZpdHlfdGV4dD1SZXBsYWNlIEFjdGl2aXR5Ci1maWxlX3RleHQ9ZmlsZQotZGlyZWN0b3J5X3RleHQ9ZGlyZWN0b3J5Ci11bnJlc29sdmVkX3RleHQ9KHVucmVzb2x2ZWQgJyd7MH0nJykKLWFzc2lzdHNfdGV4dD1Bc3Npc3RpbmcgUGVyZm9ybWVyCi11bmtub3duX3RleHQ9VW5rbm93bgotY29tbWFuZF9kb25lPURvbmUKLQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLgotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICh7MX0gJyd7Mn0nJyBpbiAnJ3szfScnKQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQotdWlfcmVmX2RlbGV0ZT1UaGUgZGVzY3JpcHRvciAnJ3swfScnIGhhcyB0aGUgZm9sbG93aW5nIHJlZmVyZW5jZXMgd2hpY2ggYXJlIG5vdCB1c2VkIGFueXdoZXJlLlxuU2VsZWN0IHRoZSBvbmVzIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZToKLXVpX3JlZl9kZWxldGUyPVRoZXNlIGZvbGxvd2luZyByZWZlcmVuY2VzIGFyZSBub3QgYmVpbmcgdXNlZCBhbnl3aGVyZS5cblNlbGVjdCB0aGUgb25lcyB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBkZWxldGU6Ci11aV9yZWZlcmVuY2VzPVJlZmVyZW5jZXMKLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249V29yayBwcm9kdWN0IGRlc2NyaXB0b3IgJyd7MH0nJyBpcyBhc3NvY2lhdGVkIChPdXRwdXQgRnJvbSkgd2l0aCB0YXNrIGRlc2NyaXB0b3IgJyd7MX0nJwotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9T3B0aW9ucwotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPVJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBvdXRwdXQgb2YgdGhlIHRhc2sgZGVzY3JpcHRvcgotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrPURlbGV0ZSB0YXNrIGRlc2NyaXB0b3IgZnJvbSB0aGUgYWN0aXZpdHkKLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9VGhlIHNlbGVjdGVkIGVsZW1lbnQgJyd7MH0nJyBpcyBub3QgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB5b3VyIHByb2Nlc3MuXG5EbyB5b3Ugd2FudCB0byBhZGQgaXQgYW5kIGl0cyBkZXBlbmRlbmNpZXMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbj8KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1FcnJvcnMgb2NjdXJyZWQgaW4gdGhlIG9wZXJhdGlvbi4gQ2xpY2sgb24gZGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbgotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPU5vIGRlc2NyaXB0b3Igd2l0aCBsaW5rZWQgbWV0aG9kIGVsZW1lbnQgZm91bmQgdG8gc3luY2hyb25pemUKLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9RXJyb3IgcmVmcmVzaGluZyB2aWV3ZXIKLWNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dD1FbGVtZW50KHMpIGxpc3RlZCBpbiBEZXRhaWxzIG1pZ2h0IGhhdmUgaWxsZWdhbCByZWZlcmVuY2VzIHRvIHRoaXMgZ3VpZGFuY2UgYWZ0ZXIgY29udmVyc2lvbi4gQ2xpY2sgT0sgdG8gcmVtb3ZlIHRoZW0gYW5kIGNvbnRpbnVlLgotY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fdGl0bGU9Q29uZmlybSBEZXNjcmlwdG9ycyBEZWxldGlvbgotY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fbXNnPVRoZSBlbGVtZW50KHMpIHlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGFyZSBzdGlsbCBiZWluZyByZWZlcmVuY2VkIGJ5IGRlc2NyaXB0b3JzIGluIHRoZSBtZXRob2QgbGlicmFyeS4gIENsaWNrIFllcyBpZiB5b3Ugd2FudCB0byBkZWxldGUgdGhlc2UgZGVzY3JpcHRvcnMgYXMgd2VsbC4gIE1ha2Ugc3VyZSB5b3UgaGF2ZSBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgZGVzY3JpcHRvcnMgYmVmb3JlIGNsaWNraW5nIFllcy4gIENsaWNrIERldGFpbHMgdG8gcmV2aWV3IHRoZSBsaXN0IG9mIGRlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlIHRoZSBlbGVtZW50KHMpIHRoYXQgeW91IGFyZSBhYm91dCB0byBkZWxldGUuCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPVVuaGFuZGxlZCBleGNlcHRpb24KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ9Q2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9VGhlIHdvcmsgcHJvZHVjdCAnJ3swfScnIGlzIGFuIG91dHB1dCB0byB0aGUgZm9sbG93aW5nIHRhc2tzLlxuU2VsZWN0IHRoZSB0YXNrcyBmb3Igd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3JzLgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1UaGUgcm9sZSAnJ3swfScnIGhhcyB0aGUgZm9sbG93aW5nIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMuXG5TZWxlY3QgdGhlIHdvcmsgcHJvZHVjdHMgZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBkZXNjcmlwdG9ycy4KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPUZhdGFsIGVycm9yCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVdvcmsgUHJvZHVjdHMKLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9Q2Fubm90IGxpbmsgYSBicmVha2Rvd24gZWxlbWVudCB0byBvbmUgb2YgaXRzIHN1Yi1lbGVtZW50LgotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1DYW5ub3QgbGluayB0byBlbGVtZW50IG90aGVyIHRoYW4gd29yayBicmVha2Rvd24gZWxlbWVudC4KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9Q2Fubm90IGxpbmsgYSBicmVha2Rvd24gZWxlbWVudCB0byBvbmUgb2YgaXRzIGNoaWxkcmVuLgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVRhc2tzCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1UYXNrIFNlbGVjdGlvbi4uLgotdXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXI9XCBcIGNoaWxkJ3MgYWRhcHRlcjoKLQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PUNvdWxkIG5vdCBzZXQgcGFyZW50IGZvciBjaGlsZAotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUNhbm5vdCBlZGl0IHJlc291cmNlLgotdXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvPWNvbnRyaWJ1dGVzIHRvICcnezB9JycKLXV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvPWxvY2FsbHkgY29udHJpYnV0ZXMgdG8gJyd7MH0nJwotcHJvY2Vzc19leHRlbmRzPWV4dGVuZHMgJyd7MH0nJwotcHJvY2Vzc19yZXBsYWNlcz1yZXBsYWNlcyAnJ3swfScnCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9bG9jYWxseSByZXBsYWNlcyAnJ3swfScnCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1EaXNjaXBsaW5lcwotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1EaXNjaXBsaW5lIEdyb3VwaW5ncwotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9V2hpdGVwYXBlcnMKLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVRvb2wgTWVudG9ycwotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9VG9vbHMKLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJvbGVzCi1GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dD1UYXNrcwotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9UmV1c2FibGUgQXNzZXRzCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9TW9zdCBjb21tb24KLUZpbHRlckNvbnN0YW50c19wcm9jZXNzZXNfdGV4dD1Qcm9jZXNzZXMKLUZpbHRlckNvbnN0YW50c19hY3Rpdml0aWVzX3RleHQ9QWN0aXZpdGllcwotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVByYWN0aWNlcwotRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0PVRlbXBsYXRlcwotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PVdvcmsgUHJvZHVjdHMKLUZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ9Q2hlY2tsaXN0cwotRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dD1HdWlkZWxpbmVzCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dD1Sb2xlIFNldHMKLUZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0PUd1aWRhbmNlCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1Db25jZXB0cwotRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ9RXhhbXBsZXMKLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1Db250ZW50IFBhY2thZ2VzCi1GaWx0ZXJDb25zdGFudHNfcm9sZWRlc2NyaXB0b3JzX3RleHQ9Um9sZSBEZXNjcmlwdG9ycwotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1Sb2xlIFNldCBHcm91cGluZ3MKLUZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dD1UYXNrIERlc2NyaXB0b3JzCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9Q29udGVudCBFbGVtZW50cwotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVByZXBhcmluZyBzeW5jaHJvbml6YXRpb24uLi4KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3JzCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9QWxsIENvbnRlbnQgRWxlbWVudHMKLUZpbHRlckNvbnN0YW50c19zdXBwb3J0aW5nbWF0ZXJpYWxzX3RleHQ9U3VwcG9ydGluZyBNYXRlcmlhbHMKLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM9RXJyb3Igc2F2aW5nIGZpbGUocykKLUZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ9Q3VzdG9tIENhdGVnb3JpZXMKLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ9V29yayBQcm9kdWN0IEtpbmRzCi1EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnPURlbGV0aW9uIGNvbXBsZXRlZCB3aXRoIHdhcm5pbmcKLUZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ9TWV0aG9kIFBsdWctaW5zCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luPUlVUEwwMTIwRTogVGhlIHBsdWctaW4gJyd7MH0nJyBpcyBsb2NrZWQuCi1GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0PURvbWFpbnMKLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9Um9hZG1hcHMKLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9UmVwb3J0cwotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1EZWZhdWx0IFMmeW5jaHJvbml6YXRpb24gZnJvbSBNZXRob2QgQ29udGVudAotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPUN1c3RvbSBTeW5jaHJvbmkmemF0aW9uLi4uCi1TeW5jaHJvbml6ZUNvbXBsZXRlRGlhbG9nX1RpdGxlPVN5bmNocm9uaXphdGlvbiBDb21wbGV0ZQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9U3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCi1zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlX21zZz1UaGUgZm9sbG93aW5nIGRlc2NyaXB0b3JzIGFyZSBub3QgdXNlZCBhbnl3aGVyZSBhZnRlciBkZWxldGlvbiBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuXG5TZWxlY3QgZGVzY3JpcHRvcnMgeW91IHdhbnQgdG8gZGVsZXRlLgotCi1DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZF9NZXNzYWdlPVNwZWNpZnkgbmFtZSBhbmQgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgezB9IHRvIGJlIGNyZWF0ZWQuCi0jIFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotVXNlckludGVyYWN0aW9uSGVscGVyX1Byb2Nlc3NQYWNrYWdlX05hbWU9TmFtZToKLQotIyBNZXRob2RDcmVhdGVDaGlsZENvbW1hbmQKLW5ld0VsZW1lbnRfdGV4dD1OZXcgezB9Ci11cGRhdGVfb3V0b2ZzeW5jaF90aXRsZT1VcGRhdGUgY29uZmxpY3QKLXVwZGF0ZV9vdXRvZnN5bmNoX21zZz1UaGUgZmlsZShzKSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbS4gRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBjaGFuZ2VzPwotZHVwbGljYXRlRmVhdHVyZVZhbHVlPUNhbm5vdCBoYXZlIDIgZWxlbWVudHMgdW5kZXIgJyd7MH0nJyB3aXRoIHRoZSBzYW1lIHZhbHVlIGZvciAnJ3sxfScnCi1hcHBseV9wYXR0ZXJuX2Vycm9yX21zZz1DYW5ub3QgYXBwbHkgYWN0aXZpdHkgJyd7MH0nJyB0byB0aGUgcHJvY2VzcyAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi1hcHBseV9wYXR0ZXJuX2Vycm9yX21zZzE9Q2Fubm90IGFwcGx5IGFjdGl2aXR5ICcnezB9JycgdG8gdGhlIHByb2Nlc3MgJyd7MX0nJyBzaW5jZSAnJ3swfScnIGFscmVhZHkgaGFzIG9uZSBvciBtb3JlIGNvbnRyaWJ1dGVkL3JlcGxhY2VkIGFjdGl2aXRpZXMgYXMgaXRzIGNoaWxkcmVuLgotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT1BY3Rpdml0eSAnJ3swfScnIGNhbm5vdCBzZXQgdmFyaWFiaWxpdHkgd2l0aCBvbmUgb2YgaXRzIGRpcmVjdCBwYXJlbnQuCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IHNldCB2YXJpYWJpbGl0eSB3aXRoICcnezF9Jycgc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzM9Q2Fubm90IHJlcGxhY2VzIGEgdG9wIHByb2Nlc3Mgd2l0aCBhbiBhY3Rpdml0eS4KLWFjdGl2aXR5X2RlZXBfY29weV92YXJpYWJpbGl0eV9wcm9tcHQ9VGhlIHNvdXJjZSBhY3Rpdml0eSBtaWdodCBoYXZlIGV4dGVybmFsIGNvbnRyaWJ1dGlvbnMgb3IgcmVwbGFjZW1lbnRzLlxuRG8geW91IHdhbnQgdG8gY29weSB0aGVtIGFzIHdlbGw/XG5cbkNsaWNraW5nIG9uIE5vIHdpbGwgY29weSBvbmx5IHRoZSBvcmlnaW5hbCBhY3Rpdml0eS4KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZz1BY3Rpdml0eSAnJ3swfScnIGNhbm5vdCBzZXQgdmFyaWFiaWxpdHkgd2l0aCAnJ3sxfScnIHNpbmNlICcnezF9JycgYWxyZWFkeSBoYXMgb25lIG9yIG1vcmUgY29udHJpYnV0ZWQvcmVwbGFjZWQgYWN0aXZpdGllcyBhcyBpdHMgY2hpbGRyZW4uCi12YXJpYWJpbGl0eV9lcnJvcl9tc2c9VmFyaWFiaWxpdHkgZWxlbWVudCAnJ3swfScnIGNhbm5vdCBzZXQgdmFyaWFiaWxpdHkgd2l0aCAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi1jaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZz1DYW5ub3QgcGVyZm9ybSB0aGUgb3BlcmF0aW9uIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi0KLSMgVmFsaWRhdGlvbiBtZXNzYWdlcwotdmFyaWFiaWxpdHlfZWxlbWVudF9jaXJjdWxhcl9sb29wX2Vycm9yX21zZz1DaXJjdWxhciBkZXBlbmRlbmN5IGxvb3AgZGV0ZWN0ZWQgLi4uIAotcmVwbGFjaW5nX2FuY2VzdG9yX2Vycm9yX21zZz1SZXBsYWNpbmcgYW4gYW5jZXN0b3IgZXJyb3IgaXMgZGV0ZWN0ZWQuCi1jYW5ub3RfY29weV9vcl9leHRlbmRfZGVsaXZlcnlfcHJvY2Vzcz1DYW5ub3QgY29weSBvciBleHRlbmQgYSBkZWxpdmVyeSBwcm9jZXNzIG9yIGFueSBvZiBpdHMgYWN0aXZpdGllcy4KLQotIyBTb3J0IG9wdGlvbnMKLVNvcnRUeXBlX0xhYmVsPVNvcnQgVHlwZToKLVNvcnRUeXBlX01hbnVhbD1NYW51YWwKLVNvcnRUeXBlX0FscGhhYmV0aWM9QWxwaGFiZXRpYwotU29ydFR5cGVfUmV2ZXJzZUFscGhhYmV0aWM9UmV2ZXJzZSBBbHBoYWJldGljCi1Tb3J0VHlwZV9NZXRob2RUeXBlPUVsZW1lbnQgVHlwZQotCi1Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX0ZJTklTSF9UT19TVEFSVD1GUwotV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fRklOSVNIPUZGCi1Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX0ZJTklTSD1TRgotV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9TVEFSVF9UT19TVEFSVD1TUwotYWRkX3RvX2RlZmF1bHRfY29uZmlnX2RsZ190aXRsZT1BZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1N0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTJmMDA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgc3RydWN0dXJlZCBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJR3JvdXBDb250YWluZXIsCi0JCUlTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJpdmF0ZSBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsU3RydWN0dXJlKE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0KSB7Ci0JCXRoaXMubW9kZWxTdHJ1Y3QgPSBtb2RlbFN0cnVjdDsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxTdHJ1Y3R1cmUgZ2V0TW9kZWxTdHJ1Y3R1cmUoKSB7Ci0JCXJldHVybiBtb2RlbFN0cnVjdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX01ldGhvZFBsdWdpbl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cEl0ZW1Qcm92aWRlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBudWxsOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UbmdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UbmdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmVkMDY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVG5nQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsLlRuZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBUaGUgZmFjdG9yeSBmb3IgYWxsIHRoZSBhZGFwdGVyIGZhY3Rvcmllcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRuZ0FkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gVG5nQWRhcHRlckZhY3RvcnlJbXBsLmNyZWF0ZUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIoKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFkYXB0ZXJGYWN0b3J5W10gcHJvY2Vzc0FkYXB0ZXJGYWN0b3JpZXMgPSB7Ci0JCUlOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCUlOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCUlOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQl9OwotCi0JLyoqCi0JICogR2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgTGlicmFyeSB2aWV3LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIExpYnJhcnkgdmlldwotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgZmlsdGVyCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uZmlndXJhdGlvbiB2aWV3Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLiBDbGllbnQgaXMKLQkgKiByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZS4gQ2xpZW50IGlzCi0JICogcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLgotCSAqIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbnNvbGlkYXRlZCBCcmVha2Rvd24gU3RydWN0dXJlLgotCSAqIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25zb2xpZGF0ZWQgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUuCi0JICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nV0JTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciBwdWJsaXNoZWQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlLgotCSAqIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1RCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgcHVibGlzaGVkIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUuIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV29yayBQcm9kdWN0IEJyZWFrZG93bgotCSAqICAgICAgICAgU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dQQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgQ29uc29saWRhdGVkIEJyZWFrZG93bgotCSAqIFN0cnVjdHVyZS4gQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBDb25zb2xpZGF0ZWQgQnJlYWtkb3duCi0JICogICAgICAgICBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nQ0JTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgbGlicmFyeS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgbGlicmFyeQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUxpYnJhcnlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdAotCSAqIEJyZWFrZG93biBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duCi0JICogU3RydWN0dXJlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgZWRpdG9yCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbnNvbGlkYXRlZAotCSAqIEJyZWFrZG93biBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbnNvbGlkYXRlZCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3IgSXRlbXNGaWx0ZXIgcGFja2FnZS4gRWl0aGVyCi0JICogZ2V0RmlsdGVyVmlld19BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgb3IKLQkgKiBnZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgc2hvdWxkIGJlIHVzZWQuIEJvdGggY2FuIGJlCi0JICogdXNlZCBhdCB0aGUgc2FtZSB0aW1lIGRlcGVuZHMgb24gcHVycG9zZS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogR2V0cyBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgZmlsdGVyCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldE9CU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IGZpbHRlcgotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGZpbHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duCi0JICogU3RydWN0dXJlIGZpbHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QKLQkgKiBCcmVha2Rvd24gU3RydWN0dXJlIGZpbHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqICAgICAgICAgZmlsdGVyCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UEJTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBpdGVtIGZpbHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBpdGVtIGZpbHRlcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgYWRhcHRlciBmYWN0b3JpZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKTsKLQotCS8qKgotCSAqIFJlbGVhc2VzIHVudXNlZCBvYmplY3RzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2MzZGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBJdGVtIHByb3ZpZGVyIGZvciBVSSB0cmFuc2llbnQgb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdyb3VwL29yZ2FuaXplCi0gKiBtb2RlbCBvYmplY3RzIGluIGEgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUNvbmZpZ3VyYWJsZSwgSURlZmF1bHROYW1lU2V0dGVyLAotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBjaGlsZEZpbHRlcjsKLQotCXByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJcGFyZW50LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJcGFyZW50LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKGNoaWxkRmlsdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBjaGlsZEZpbHRlci5hY2NlcHQob2JqKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKHRhcmdldCwgZWRpdGluZ0RvbWFpbiwgc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFJlc291cmNlTG9jYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCwKLQkgKiAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQ6Ci0JCS8vIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWNjZXB0QXNDaGlsZChlbGVtZW50KSkgewotCQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sCi0JCQkJKEVPYmplY3QpIHRhcmdldCwgZmVhdHVyZSwgc2VsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVSZW1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZVJlbW92ZUNvbW1hbmQoZG9tYWluLCAoRU9iamVjdCkgdGFyZ2V0LAotCQkJCWZlYXR1cmUsIGNvbGxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZVJlbW92ZUNvbW1hbmQ6IGNhbgotCQkvLyBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZU1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVNb3ZlQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgdmFsdWUsIGluZGV4KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVNb3ZlQ29tbWFuZDogY2FuCi0JCS8vIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQlpZiAoY29tbWFuZENsYXNzID09IFJlbW92ZUNvbW1hbmQuY2xhc3MpIHsKLQkJCWNvbW1hbmRQYXJhbWV0ZXIuc2V0T3duZXIodGFyZ2V0KTsKLQkJfQotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBkb21haW4sIGNvbW1hbmRDbGFzcywKLQkJCQljb21tYW5kUGFyYW1ldGVyKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVDb21tYW5kOiAiICsKLQkJLy8gY29tbWFuZENsYXNzICsgIiwgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpICsgIiwgb3duZXI6ICIgKwotCQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgKyAiLCBjb2xsZWN0aW9uOiAiICsKLQkJLy8gY29tbWFuZFBhcmFtZXRlci5nZXRDb2xsZWN0aW9uKCkpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ2hpbGRyZW5TdG9yZSBzdG9yZSA9IGdldENoaWxkcmVuU3RvcmUodGFyZ2V0KTsKLQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCXJldHVybiBzdG9yZS5nZXRDaGlsZHJlbigpOwotCQl9Ci0KLQkJc3RvcmUgPSBjcmVhdGVDaGlsZHJlblN0b3JlKHRhcmdldCk7Ci0JCUxpc3QgcmVzdWx0ID0gc3RvcmUgIT0gbnVsbCA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSB0YXJnZXQ7Ci0KLQkJaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwotCQkKLQkJZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW5GZWF0dXJlcyh0YXJnZXQpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpLm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOyBpbmRleCsrKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsIGluZGV4KTsKLQkJCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0JCQkJCQkJc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGQoY2hpbGQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsCi0JCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0JCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0JCQkJCQlzdG9yZS5zZXRWYWx1ZShmZWF0dXJlLCBjaGlsZCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGNoaWxkcmVuID0gc3RvcmUgIT0gbnVsbCA/IHN0b3JlLmdldENoaWxkcmVuKCkgOiByZXN1bHQ7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgZmxvYXQsIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlib29sZWFuIGNhbkV4ZWMgPSB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCWNhbkV4ZWMgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlDb21tYW5kIGNtZDsKLQkJaWYgKGNhbkV4ZWMpIHsKLQkJCWNtZCA9IHN1cGVyLmNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwKLQkJCQkJb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWNtZCA9IFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVNb3ZlQ29tbWFuZDogY2FuCi0JCS8vIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBtc2cpOwotCi0JCS8vIGlmKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkvLyBpZihmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpIHsKLQkJLy8gYm9vbGVhbiBub3RpZnkgPSBmYWxzZTsKLQkJLy8gc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCS8vIE9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJLy8gbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkvLyBvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCS8vIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJLy8gZm9yX2NoZWNrOgotCQkvLyBmb3IoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIGlmKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCS8vIG5vdGlmeSA9IHRydWU7Ci0JCS8vIGJyZWFrIGZvcl9jaGVjazsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJLy8gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gZm9yX2NoZWNrOgotCQkvLyBmb3IoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIGlmKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCS8vIG5vdGlmeSA9IHRydWU7Ci0JCS8vIGJyZWFrIGZvcl9jaGVjazsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLwotCQkvLyB9Ci0JCS8vIGlmKG5vdGlmeSkgewotCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgdGhpcywgdHJ1ZSwgZmFsc2UpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5jaGlsZEZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9WYXJpYWJpbGl0eUluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVmFyaWFiaWxpdHlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGU3NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9WYXJpYWJpbGl0eUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHN0b3JpbmcgdmFyaWFiaWxpdHkgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eUluZm8gewotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXI7Ci0KLQlwcml2YXRlIExpc3QgaW5oZXJpdGFuY2VMaXN0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY29udHJpYnV0b3JzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIGEgdmFyaWFiaWxpdHkgZWxlbWVudAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUluZm8oVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvd25lciBvZiB0aGlzIFZhcmlhYmlsaXR5SW5mbyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgb3duZXIgb2YgdGhpcyBWYXJpYWJpbGl0eUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWFsaXplZCBpbmhlcml0YW5jZSBsaXN0IGluIHRoZSBvcmRlciBmcm9tIHRoZSByZXNvbHZlZCBvYmplY3QKLQkgKiBvZiB0aGUgb3duZXIgdG8gdGhlIGl0cyB0b3AgYmFzZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5oZXJpdGFuY2VMaXN0KCkgewotCQlpZiAoaW5oZXJpdGFuY2VMaXN0ID09IG51bGwpIHsKLQkJCWluaGVyaXRhbmNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gaW5oZXJpdGFuY2VMaXN0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIGNvbnRyaWJ1dG9yIHRvCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbnRyaWJ1dG9ycygpIHsKLQkJaWYgKGNvbnRyaWJ1dG9ycyA9PSBudWxsKSB7Ci0JCQljb250cmlidXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRyaWJ1dG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzdhNmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuYnJlYWtkb3duZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOGQ3OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NaWxlc3RvbmVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9NaWxlc3RvbmVfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGI3NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ3VzdG9tIENhdGVnb3JpZXMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY2NlcHQob2JqKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCUxpc3QgbXlDYXRlZ29yaWVzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJLmdldEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KSBvYmopOwotCQkJaWYgKG15Q2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKG15Q2F0ZWdvcmllcy5zaXplKCkgPT0gMSkgewotCQkJCS8vIHJvb3QgY3VzdG9tIGNhdGVnb3J5IGlzIHVuZGUgdGhlIGhpZGRlbiBwYWNrYWdlIGFuZCB3aWxsIG5vdAotCQkJCS8vIGJlIHByb2Nlc3NlZC4KLQkJCQkvLyBuZWVkIHRvIHNob3cgc3ViIGNhdGVnb3JpZXMgdW5kZXIgaXQKLQkJCQlDdXN0b21DYXRlZ29yeSBjID0gKEN1c3RvbUNhdGVnb3J5KSBteUNhdGVnb3JpZXMuZ2V0KDApOwotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KGMpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIEN1c3RvbUNhdGVnb3J5LmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NVU1RPTV9DQVRFR09SWSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwNWMzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LkVNRkVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwuSUxpc3RlbmVyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY3VzdG9tIGNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJTGlzdGVuZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJLy8gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQotCQkvLyBDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqZWN0OwotCQkvLyBpZihjYXRlZ29yeS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyBpZihwYXJlbnQgIT0gbnVsbCkgewotCQkvLyByZXR1cm4gcGFyZW50OwotCQkvLyB9Ci0JCS8vCQkKLQkJLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCS8vIC8vaWYocGx1Z2luID09IG51bGwpIHJldHVybiBudWxsOwotCQkvLwkJCQotCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikKLQkJLy8gLExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIikKLQkJLy8gfTsKLQkJLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH0KLQotCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpKTsKLQkJCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1Byb2Nlc3NFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmIGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCUVDbGFzcyBwYXJlbnRDbGFzcyA9IHJlZmVyZW5jZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3MgY2hpbGRDbGFzcyA9ICgoRU9iamVjdCkgY2hpbGQpLmVDbGFzcygpOwotCQkJU3RyaW5nIG5hbWUgPSAiZnVsbC9jdG9vbDE2L0NyZWF0ZSIgKyBwYXJlbnRDbGFzcy5nZXROYW1lKCkgKyAiXyIgKyByZWZlcmVuY2UuZ2V0TmFtZSgpICsgIl8iICsgY2hpbGRDbGFzcy5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl0cnkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShuYW1lKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBFTUZFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQ2hpbGQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlUmVtb3ZlZChDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSkgewotCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYXRlZ29yeSkuaXNFbXB0eSgpKSB7Ci0JCQkvLyByZW1vdmUgYWxsIHN1YmNhdGVnb3JpZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYXRlZ29yeS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJRWNvcmVVdGlsLnJlbW92ZShjYXRlZ29yeSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCS8vIGJvb2xlYW4gcmVmcmVzaEN1c3RvbUNhdGVnb3J5Um9vdCA9IGZhbHNlOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCS8vZm9yIGVwZiBkZWZlY3Q6MTc0MDQzCi0JCQlpZighVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKXsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCWlmKHBsdWdpbiAhPW51bGwpewotCQkJCQlDdXN0b21DYXRlZ29yeSByb290ID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKTsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHJvb3QsIHRydWUsIGZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlicmVhazsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTOgotCQkJcGtnID0gKENvbnRlbnRQYWNrYWdlKSAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKQotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJaWYgKChwa2cgIT0gbnVsbCkKLQkJCQkJJiYgKE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUKLQkJCQkJCQkuZXF1YWxzKHBrZy5nZXROYW1lKCkpKSkgewotCQkJCS8vIG5vdGlmaWVyIGlzIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeQotCQkJCS8vCi0JCQkJcGtnID0gKENvbnRlbnRQYWNrYWdlKSBwa2cuZUNvbnRhaW5lcigpOwotCQkJfQotCQkJT2JqZWN0IG9iajsKLQkJCUN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5OwotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iajsKLQkJCQkJaWYgKGNhdGVnb3J5LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGNhdGVnb3J5KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHJlZnJlc2hDdXN0b21DYXRlZ29yeVJvb3QgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iajsKLQkJCQkJCWlmIChjYXRlZ29yeS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoY2F0ZWdvcnkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyByZWZyZXNoQ3VzdG9tQ2F0ZWdvcnlSb290ID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkKLQkJCQkvLyByZW1vdmluZyBzdWJjYXRlZ29yaWVzIGlzIGhhbmRsZWQgYnkgdGhlIHJlbW92ZSBjb21tYW5kCi0JCQkJLy8KLS8vCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotLy8JCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0vLwkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLS8vCQkJCQloYW5kbGVSZW1vdmVkKChDdXN0b21DYXRlZ29yeSkgb2JqKTsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpCi0vLwkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQlvYmogPSBpdGVyLm5leHQoKTsKLS8vCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLS8vCQkJCQkJaGFuZGxlUmVtb3ZlZCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCS8vIC8vIHJlZnJlc2ggd3JhcHBlcnMKLQkJCS8vIC8vCi0JCQkvLyBpZih3cmFwcGVycyAhPSBudWxsKSB7Ci0JCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHdyYXBwZXJzKS5pdGVyYXRvcigpOwotCQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCS8vIGl0ZXIubmV4dCgpLCB0cnVlLCBmYWxzZSkpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8JCQkKLQkJCS8vIGlmKHJlZnJlc2hDdXN0b21DYXRlZ29yeVJvb3QpIHsKLQkJCS8vIC8vIHN1YiBjYXRlZ29yeSBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGN1c3RvbQotCQkJLy8gY2F0ZWdvcnkKLQkJCS8vIC8vIG5lZWQgdG8gcmVmcmVzaCB0aGUgZm9sZGVyIGZvciBhbGwgY3VzdG9tIGNhdGVnb3JpZXMKLQkJCS8vIC8vCi0JCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCk7Ci0JCQkvLwkJCQkKLQkJCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpCi0JCQkvLyAsTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkJLy8gfTsKLQkJCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCksIHRydWUsIGZhbHNlKSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqZWN0OwotCQlyZXR1cm4gIWNhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pc0VtcHR5KCkKLQkJLy8gfHwgIWNhdGVnb3J5LmdldFN1YkNhdGVnb3JpZXMoKS5pc0VtcHR5KCkKLQkJOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJU3RyaW5nIGNjTmFtZSA9ICgoQ3VzdG9tQ2F0ZWdvcnkpb2JqKS5nZXROYW1lKCk7Ci0JCQlpZiAoY2NOYW1lID09IG51bGwgfHwgY2NOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ1VTVE9NX0NBVEVHT1JZOwotCQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKEN1c3RvbUNhdGVnb3J5KSBwYXJlbnQsIChDdXN0b21DYXRlZ29yeSkgb2JqLCBiYXNlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ3VzdG9tQ2F0ZWdvcnkuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJLy8gY2hlY2sgY3VzdG9tIGNhdGVnb3J5IGZvciBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JCQkJLy8KLQkJCQlpZiAoIShvd25lciBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCAmJiBUbmdVdGlsCi0JCQkJCQkuaXNBbmNlc3Nvck9mKChDdXN0b21DYXRlZ29yeSkgZWxlbWVudCwKLQkJCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb3duZXIpKSkgewotCQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVSZW1vdmVDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkpCi0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJCVVSSSBpbWdVcmkgPSBUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoCi0JCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBpbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJLy8gZG8gbm90aGluZywgYWxyZWFkeSBoYW5kbGVkIGJ5IHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbikKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJTm90aWZ5Q2hhbmdlZExpc3RlbmVyPiBnZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZihjaGFuZ2VOb3RpZmllciBpbnN0YW5jZW9mIENoYW5nZU5vdGlmaWVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxJTm90aWZ5Q2hhbmdlZExpc3RlbmVyPigoQ2hhbmdlTm90aWZpZXIpIGNoYW5nZU5vdGlmaWVyKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCi0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpb2JqZWN0KSl7Ci0JCQlMaXN0IHNvcnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc29ydExpc3QuYWRkQWxsKGNvbCk7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRMaXN0LCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCQlyZXR1cm4gc29ydExpc3Q7Ci0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTGlzdCBzb3J0TGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cygoTWV0aG9kRWxlbWVudClvYmplY3QsIGNvbC50b0FycmF5KCkpOwotCQkJcmV0dXJuIHNvcnRMaXN0OwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjNkOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9EaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJEaXNjaXBsaW5lcyIgZm9sZGVyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBEaXNjaXBsaW5lc0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LlRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciNpc0luaGVyaXRlZChvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaGVyaXRlZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIChjYXRlZ29yeSBpbnN0YW5jZW9mIERpc2NpcGxpbmUgfHwgY2F0ZWdvcnkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpCi0JCQkJJiYgY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVEaXNjaXBsaW5lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCUxpc3QgZ3JvdXBzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSkgb2JqKTsKLQkJCWlmIChncm91cHMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoT2JqZWN0IGdyb3VwIDogZ3JvdXBzKSB7Ci0JCQkJCWlmIChncm91cCBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJCQkJaWYgKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChEaXNjaXBsaW5lR3JvdXBpbmcpZ3JvdXApID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChEaXNjaXBsaW5lKW9iaikpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjY2VwdChvYmopOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCURpc2NpcGxpbmUgY2hpbGQgPSAoRGlzY2lwbGluZSkgZWxlbWVudDsKLQkJCQlEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChjaGlsZCwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIERpc2NpcGxpbmUuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkVfR1JPVVBJTkcpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5YzZiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuRU1GRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSURlZmF1bHROYW1lU2V0dGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVEaXNjaXBsaW5lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0KLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJLy8gaWYobW9kZWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCS8vIElHcm91cENvbnRhaW5lciBncm91cENvbnRhaW5lciA9IChJR3JvdXBDb250YWluZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcigoRU9iamVjdCltb2RlbCwgSUdyb3VwQ29udGFpbmVyLmNsYXNzKTsKLQkJLy8gaWYoZ3JvdXBDb250YWluZXIgIT0gbnVsbCkgewotCQkvLyBncm91cENvbnRhaW5lciA9IChJR3JvdXBDb250YWluZXIpCi0JCS8vIGdyb3VwQ29udGFpbmVyLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSk7Ci0JCS8vIHJldHVybgotCQkvLyBncm91cENvbnRhaW5lci5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKTsKLQkJLy8gfQotCQkvLyAvLyBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTW9kZWxJdGVtUHJvdmlkZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcigoRU9iamVjdCltb2RlbCwgTWV0aG9kTW9kZWxJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBpZihpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkvLyAvLyByZXR1cm4gaXRlbVByb3ZpZGVyLmdldERpc2NpcGxpbmVDYXRlZ29yaWVzKCk7Ci0JCS8vIC8vIH0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCS5nZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQlFQ2xhc3MgcGFyZW50Q2xhc3MgPSByZWZlcmVuY2UuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzIGNoaWxkQ2xhc3MgPSAoKEVPYmplY3QpIGNoaWxkKS5lQ2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gImZ1bGwvY3Rvb2wxNi9DcmVhdGUiICsgcGFyZW50Q2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcmVmZXJlbmNlLmdldE5hbWUoKSArICJfIiArIGNoaWxkQ2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UobmFtZSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1GRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFN0cmluZyBsYWJlbCA9IFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkvLyBnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpKTsKLQkJLy8gQ29udGVudENhdGVnb3J5IGNhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSkgb2JqZWN0OwotCQkvLyBpZihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkvLyBNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9Ci0JCS8vIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCS8vIGlmKGJhc2VQbHVnaW4gIT0gbnVsbCkgewotCQkvLyBsYWJlbCA9IGxhYmVsICsgIiAoaW5oZXJpdGVkIGZyb20gIiArIGJhc2VQbHVnaW4uZ2V0TmFtZSgpICsgJyknOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBjb21tZW50aW5nIGJlbG93LCB1c2VmdWwgZm9yIHN0YXRlZnVsIGl0ZW1wcm92aWRlci4KLQkJLy9UbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JCQotCQkvLyBGb3Igc3RhdGVsZXNzIGl0ZW1wcm92aWRlciwgbmVlZCB0aGlzLgotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnOwotCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCWJvb2xlYW4gcmVmcmVzaFBhcmVudCA9IGZhbHNlOwotCQkJcGtnID0gKENvbnRlbnRQYWNrYWdlKSAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKQotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCWlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZGlzY2lwbGluZSk7Ci0JCQkJfSBlbHNlIGlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSA9PSBwa2cpIHsKLQkJCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZGlzY2lwbGluZSk7Ci0JCQkJCX0gZWxzZSBpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgPT0gcGtnKSB7Ci0JCQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZnJlc2hQYXJlbnQpIHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCWdldFBhcmVudCh0YXJnZXQpLCB0cnVlLCBmYWxzZSkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gRGlzY2lwbGluZSBjaGlsZCA9IChEaXNjaXBsaW5lKSBpdGVyLm5leHQoKTsKLQkvLyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKQotCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIGl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBNYWtpbmcgcGx1Z2luIGxldmVsIHVuaXF1ZW5lc3Mgb2YgZGlzY2lwbGluZSwgb24gcmVtb3ZpbmcgZGlzY2lwbGluZSByZWZlcmVuY2UgCi0JCQkvLyBmcm9tIGRpc2NpcGxpbmUgZ3JvdXBpbmcsIGRpc2NpcGxpbmUgZ29lcyBiYWNrIHRvIHRvcGxldmVsIGNhdXNpbmcgZHVwbGljYXRlLiAKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KAotCQkJCQkoKENvbnRlbnRQYWNrYWdlKSAoKChEaXNjaXBsaW5lR3JvdXBpbmcpIHBhcmVudCkKLQkJCQkJCQkuZUNvbnRhaW5lcigpKSkuZ2V0Q29udGVudEVsZW1lbnRzKCksCi0JCQkJCURpc2NpcGxpbmUuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoRGlzY2lwbGluZUdyb3VwaW5nKSB0YXJnZXQpCi0JCQkJCS5nZXREaXNjaXBsaW5lcygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIERpc2NpcGxpbmVHcm91cGluZy5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkNmQ2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsLklMaXN0ZW5lclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciwgSURlZmF1bHROYW1lU2V0dGVyLCBJTGlzdGVuZXJQcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotLy8JCWlmIChwYXJlbnQgIT0gbnVsbCkKLS8vCQkJcmV0dXJuIHBhcmVudDsKLS8vCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKW9iamVjdDsKLQkJaWYoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCXBhcmVudCA9ICBzdXBlci5nZXRQYXJlbnQoZGlzY2lwbGluZSk7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkaXNjaXBsaW5lKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJLAotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQl9OwotCi0JCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIobW9kZWwsIHBhdGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy9yZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJaWYoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKXsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJLy8gcmVmcmVzaCB1bmNhdGVnb3JpemVkIHRhc2tzIGZvbGRlcgotCQkJLy8gVG5nVXRpbC5yZWZyZXNoQWRhcHRlcihMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1RBU0tTX1BBVEgsCi0JCQkvLyBub3RpZmljYXRpb24pOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47CQkKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCQkKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYoY2hhbmdlTm90aWZpZXIgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQ2hhbmdlIENhdGVnb3JpZXMgZGlzcGxheSBpbiBMaWJyYXJ5IE5hdmlnYXRvcgotCQkvLyAoY29tbWVudGVkIGZvciB0aGlzIGRlZmVjdCkKLQkJLy8gcmV0dXJuICEoKERpc2NpcGxpbmUpIG9iamVjdCkuZ2V0VGFza3MoKS5pc0VtcHR5KCk7Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCS8vIHJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpCi0JCS8vIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQkJLy9yZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gRGlzY2lwbGluZS5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEaXNjaXBsaW5lKSB0YXJnZXQpLmdldFN1YmRpc2NpcGxpbmUoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkvL3JldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmYTg3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRvbWFpbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Eb21haW5JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERvbWFpbl9TdWJkb21haW5zKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pIG9iamVjdDsKLQkJaWYgKGRvbWFpbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkb21haW4pOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQksCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQotCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKG1vZGVsLCBwYXRoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvL1RuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJc2V0RGVmYXVsdE5hbWUobm90aWZpY2F0aW9uKTsKLQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERvbWFpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCS5nZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlV3JhcHBlcnMoQ29sbGVjdGlvbiBvYmplY3RzKSB7Ci0JCWlmICh3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQl3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0KLQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlci5maWxsKHdyYXBwZXJzLCBudWxsLCBvYmplY3RzLCB0aGlzLAotCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHdyYXBwZXJzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoRG9tYWluKSBwYXJlbnQpCi0JCQkJCS5nZXRTdWJkb21haW5zKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoRG9tYWluKSB0YXJnZXQpLmdldFN1YmRvbWFpbnMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gRG9tYWluLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbnNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzk4M2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkRvbWFpbnMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEb21haW5zSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURvbWFpbigpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRG9tYWluOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Eb21haW5zIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgRG9tYWluLmNsYXNzKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RPTUFJTik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ3ZjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5FTUZFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQgZ3JvdXBpbmcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSURlZmF1bHROYW1lU2V0dGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgRGlzcG9zYWJsZSBjaGlsZHJlbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2xlU2V0KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0KLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTW9kZWxJdGVtUHJvdmlkZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcigoRU9iamVjdCltb2RlbCwgTWV0aG9kTW9kZWxJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpZihpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkvLyByZXR1cm4gaXRlbVByb3ZpZGVyLmdldFJvbGVTZXRzKCk7Ci0JCS8vIH0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UgJiYgY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotCQkJRUNsYXNzIHBhcmVudENsYXNzID0gcmVmZXJlbmNlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCUVDbGFzcyBjaGlsZENsYXNzID0gKChFT2JqZWN0KSBjaGlsZCkuZUNsYXNzKCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICJmdWxsL2N0b29sMTYvQ3JlYXRlIiArIHBhcmVudENsYXNzLmdldE5hbWUoKSArICJfIiArIHJlZmVyZW5jZS5nZXROYW1lKCkgKyAiXyIgKyBjaGlsZENsYXNzLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKG5hbWUpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEVNRkVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvY3Rvb2wxNi9DcmVhdGVDaGlsZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCi0JCS8vIFN0cmluZyBsYWJlbCA9IFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkvLyBnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpKTsKLQkJLy8gQ29udGVudENhdGVnb3J5IGNhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSkgb2JqZWN0OwotCQkvLyBpZihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkvLyBNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9Ci0JCS8vIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCS8vIGlmKGJhc2VQbHVnaW4gIT0gbnVsbCkgewotCQkvLyBsYWJlbCA9IGxhYmVsICsgIiAoaW5oZXJpdGVkIGZyb20gIiArIGJhc2VQbHVnaW4uZ2V0TmFtZSgpICsgJyknOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkvLyBFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCS8vIENoaWxkcmVuU3RvcmUgY2hpbGRyZW5TdG9yZSA9IGdldENoaWxkcmVuU3RvcmUob2JqZWN0KTsKLQkvLwkJCi0JLy8gaWYgKGNoaWxkcmVuU3RvcmUgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPQotCS8vIChFU3RydWN0dXJhbEZlYXR1cmUpbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkvLyBFTGlzdCBjaGlsZHJlbiA9IGNoaWxkcmVuU3RvcmUuZ2V0TGlzdChmZWF0dXJlKTsKLQkvLyBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLQkvLyB7Ci0JLy8gaW50IGluZGV4ID0gbm90aWZpY2F0aW9uLmdldFBvc2l0aW9uKCk7Ci0JLy8JCQkJCi0JLy8gc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpCi0JLy8gewotCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkvLyB7Ci0JLy8gRUxpc3QgdmFsdWVzID0gKEVMaXN0KW9iamVjdC5lR2V0KGZlYXR1cmUpOwotCS8vCQkJCQkJCi0JLy8gaWYgKHZhbHVlcy5zaXplKCkgPT0gMCkKLQkvLyB7Ci0JLy8gZGlzcG9zZVdyYXBwZXJzKGNoaWxkcmVuKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwkJCi0JLy8gc3VwZXIudXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvL1RuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJc2V0RGVmYXVsdE5hbWUobm90aWZpY2F0aW9uKTsKLQkJCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJQ29udGVudFBhY2thZ2UgcGtnOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZVNldEdyb3VwaW5nLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzoKLQotCQkJcGtnID0gKENvbnRlbnRQYWNrYWdlKSAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKQotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJUm9sZVNldCByb2xlU2V0OwotCQkJYm9vbGVhbiByZWZyZXNoUGFyZW50ID0gZmFsc2U7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCXJvbGVTZXQgPSAoUm9sZVNldCkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKHJvbGVTZXQuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChyb2xlU2V0KTsKLQkJCQl9IGVsc2UgaWYgKHJvbGVTZXQuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlyb2xlU2V0ID0gKFJvbGVTZXQpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChyb2xlU2V0KTsKLQkJCQkJfSBlbHNlIGlmIChyb2xlU2V0LmVDb250YWluZXIoKSA9PSBwa2cpIHsKLQkJCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJaWYgKHJlZnJlc2hQYXJlbnQpIHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCWdldFBhcmVudCh0YXJnZXQpLCB0cnVlLCBmYWxzZSkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBSb2xlU2V0IGNoaWxkID0gKFJvbGVTZXQpIGl0ZXIubmV4dCgpOwotCQkvLyBSb2xlU2V0SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChSb2xlU2V0SXRlbVByb3ZpZGVyKQotCQkvLyBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQkvLyB9Ci0JCWlmIChjaGlsZHJlbiBpbnN0YW5jZW9mIExpc3QpCi0JCQlDb2xsZWN0aW9ucy5zb3J0KChMaXN0KSBjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0KLQkJLy8gcmV0dXJuIGNyZWF0ZVdyYXBwZXJzKGNoaWxkcmVuKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoT2JqZWN0IG9iamVjdCkgewotCS8vIE9iamVjdCB3cmFwcGVyID0gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCAoRU9iamVjdCkgdGFyZ2V0LAotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLCBvYmplY3QsIC0xKTsKLQkvLyBpZih3cmFwcGVycyA9PSBudWxsKSB7Ci0JLy8gd3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCS8vIH0KLQkvLyB3cmFwcGVycy5hZGQod3JhcHBlcik7Ci0JLy8gcmV0dXJuIHdyYXBwZXI7Ci0JLy8gfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlV3JhcHBlcnMoQ29sbGVjdGlvbiBvYmplY3RzKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0KLQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlci5maWxsKGNoaWxkcmVuLCBudWxsLCBvYmplY3RzLCB0YXJnZXQsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uZGlzcG9zZSgpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVQ7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCS8vIE1ha2luZyBwbHVnaW4gbGV2ZWwgdW5pcXVlbmVzcyBvZiByb2xlc2V0LCBvbiByZW1vdmluZyByb2xlc2V0IHJlZmVyZW5jZSAKLQkJCS8vIGZyb20gcm9sZXNldCBncm91cGluZywgcm9sZXNldCBnb2VzIGJhY2sgdG8gdG9wbGV2ZWwgY2F1c2luZyBkdXBsaWNhdGUuIAotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoCi0JCQkJCSgoQ29udGVudFBhY2thZ2UpICgoKFJvbGVTZXRHcm91cGluZykgcGFyZW50KQotCQkJCQkJCS5lQ29udGFpbmVyKCkpKS5nZXRDb250ZW50RWxlbWVudHMoKSwKLQkJCQkJCQlSb2xlU2V0LmNsYXNzKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEVfU0VUKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVQ7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChSb2xlU2V0R3JvdXBpbmcpIHRhcmdldCkuZ2V0Um9sZVNldHMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIFJvbGVTZXRHcm91cGluZy5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDY4ZDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwuSUxpc3RlbmVyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUgc2V0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciwgSUxpc3RlbmVyUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVTZXRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl9OwotCi0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGlmKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkvLyBjaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCkpOwotCQkvLyB9Ci0JCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZVNldC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQkvLyByZWZyZXNoIHdyYXBwZXJzCi0JCQkvLwotCQkJaWYgKHdyYXBwZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHdyYXBwZXJzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgaXRlcgotCQkJCQkJCS5uZXh0KCksIHRydWUsIGZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZWZyZXNoIHVuY2F0ZWdvcml6ZWQgcm9sZXMKLQkJCS8vCi0JCQkvLyBUbmdVdGlsLnJlZnJlc2hBZGFwdGVyKExpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfUk9MRVNfUEFUSCwKLQkJCS8vIG5vdGlmaWNhdGlvbik7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZihjaGFuZ2VOb3RpZmllciBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBjaGFuZ2VOb3RpZmllcik7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JCi0JLy8gQ2hhbmdlIENhdGVnb3JpZXMgZGlzcGxheSBpbiBMaWJyYXJ5IE5hdmlnYXRvcgotCS8vIEFkZCBiZWxvdyBtZXRob2QgdG8gYXZvaWQgY2hpbGRyZW4gZm9yIHRoaXMgSXRlbVByb3ZpZGVyLiArCi0JLy8gc2lnbiB0b28uCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIFJvbGVTZXQgcm9sZVNldCA9IChSb2xlU2V0KSBvYmplY3Q7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZVNldC5nZXRSb2xlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIFJvbGUgcm9sZSA9IChSb2xlKSBpdGVyLm5leHQoKTsKLQkvLyAvLyBsb29rIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIE9iamVjdExpbmtJdGVtUHJvdmlkZXIgZm9yIHRoaXMgdGFzayBpbgotCS8vIHRoZSBjdXJyZW50IGNoaWxkcmVuIGxpc3QgZmlyc3QKLQkvLyAvLwotCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIgY2hpbGQgPSBmaW5kRXhpc3RpbmdPYmplY3RMaW5rSXRlbVByb3ZpZGVyKHJvbGUpOwotCS8vIGlmKGNoaWxkID09IG51bGwpIHsKLQkvLyBjaGlsZCA9IG5ldyBPYmplY3RMaW5rSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIHJvbGUpOwotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyBjaGlsZHJlbi5yZW1vdmUoY2hpbGQpOwotCS8vIH0KLQkvLyBuZXdDaGlsZHJlbi5hZGQoY2hpbGQpOwotCS8vIH0KLQkvLyAvLyBkaXNwb3NlIHRoZSBvbGQgY2hpbGRyZW4KLQkvLyAvLwotCS8vIGlmKGNoaWxkcmVuICE9IG51bGwpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3RMaW5rSXRlbVByb3ZpZGVyIGNoaWxkID0gKE9iamVjdExpbmtJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCS8vIGNoaWxkLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGNoaWxkcmVuID0gbmV3Q2hpbGRyZW47Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJLy8gcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkKLQkJLy8gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOGUwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJSb2xlIFNldHMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldHNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyI2lzSW5oZXJpdGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gKGNhdGVnb3J5IGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nIHx8IGNhdGVnb3J5IGluc3RhbmNlb2YgUm9sZVNldCkKLQkJCQkmJiBjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVTZXQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJTGlzdCBncm91cHMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KSBvYmopOwotCQkJaWYgKGdyb3Vwcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChPYmplY3QgZ3JvdXAgOiBncm91cHMpIHsKLQkJCQkJaWYgKGdyb3VwIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQkJCQlpZiAoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKFJvbGVTZXRHcm91cGluZylncm91cCkgPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKFJvbGVTZXQpb2JqKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIFJvbGVTZXRHcm91cGluZy5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVF9HUk9VUElORyk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIFJvbGVTZXQuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1N0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmZjUzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1N0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJTdGFuZGFyZCBDYXRlZ29yaWVzIiBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUdyb3VwQ29udGFpbmVyIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwdWJsaWMgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TdGFuZGFyZENhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpIHsKLQkJCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQkvLyBpZihvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkvLyBUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpdGFyZ2V0KS5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCS8vIChNZXRob2RFbGVtZW50KSBvYmosICJOZXcgQ29udGVudCBQYWNrYWdlIik7Ci0JCS8vIH0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbnRlbnRQYWNrYWdlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZyBuYW1lOwotCQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIgY2hpbGQ7Ci0KLQkJCS8vIGNyZWF0ZSB0aGUgZGlzY2lwbGluZXMgY2F0ZWdvcmllcyBmb2xkZXIKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVsZW1lbnQpICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRUYXJnZXQoKSk7Ci0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJY29udGVudFBrZywgbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJfQotCi0JCQkvLyBjcmVhdGUgZG9tYWluIGNhdGVnb3JpZXMgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IERvbWFpbnNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJCQluYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgd29yayBwcm9kdWN0IHR5cGVzIGZvbGRlcgotCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJY29udGVudFBrZywgbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHJvbGUgc2V0IGZvbGRlcgotCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBSb2xlU2V0c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkJCW5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSB0b29sIGZvbGRlcgotCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBUb29sc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywgbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVG9vbEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZWNkMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBhIHRvb2wuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRvb2xJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Ub29sX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjYzNDgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVG9vbHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiVG9vbHMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbHNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVG9vbHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVG9vbCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFRvb2wgY2hpbGQgPSAoVG9vbCkgaXRlci5uZXh0KCk7Ci0JCS8vIFRvb2xJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFRvb2xJdGVtUHJvdmlkZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChjaGlsZCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQkvLyB9Ci0KLQkJLy8gQ2hhbmdlIENhdGVnb3JpZXMgZGlzcGxheSBpbiBMaWJyYXJ5IE5hdmlnYXRvcgotCQkvLyAoY29tbWVudGVkIGZvciB0aGlzIGRlZmVjdCkKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFbGVtZW50KQotCQkvLyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpb2JqZWN0KS5nZXRUYXJnZXQoKSk7Ci0JCS8vIENvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCS8vIFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlciB1bmNhdGVnb3JpemVkID0gbmV3Ci0JCS8vIFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29yZUNvbnRlbnRQa2cpOwotCQkvLyBjaGlsZHJlbi5hZGQodW5jYXRlZ29yaXplZCk7Ci0JCS8vIGlmKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpIHsKLQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyB9Ci0JCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dCh1bmNhdGVnb3JpemVkLmdldFRleHQobnVsbCksIHVuY2F0ZWdvcml6ZWQpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBUb29sLmNsYXNzKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1RPT0wpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1RyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3Mjg5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1RyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgY2F0ZWdvcnkgZm9sZGVycy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUdyb3VwQ29udGFpbmVyIHsKLQotCXByb3RlY3RlZCBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJT2JqZWN0IHVuY2F0ZWdvcml6ZWQgPSBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCk7Ci0JCWlmICh1bmNhdGVnb3JpemVkICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZCh1bmNhdGVnb3JpemVkKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSB0YXJnZXQpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpIHsKLQkJCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKG5vdGlmeSkgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgdGhpcywgdHJ1ZSwKLQkJCQkJCQlmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0ZWQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXJldHVybiBhY2NlcHRBc0NoaWxkKGNhdGVnb3J5KQotCQkJCSYmIGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZGQ5YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZWl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB3b3JrIHByb2R1Y3Qga2luZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgV29ya1Byb2R1Y3RLaW5kSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVdyYXBwZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0KLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCXJldHVybiBuZXcgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihmZWF0dXJlLCB2YWx1ZSwgb2JqZWN0LAotCQkJCQlhZGFwdGVyRmFjdG9yeSkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIHJldHVybiAhKChXb3JrUHJvZHVjdFR5cGUpIG9iamVjdCkuZ2V0V29ya1Byb2R1Y3RzKCkuaXNFbXB0eSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjd3JhcChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdyYXAoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHN1cGVyLndyYXAob2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwZGUyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJXb3JrIFByb2R1Y3QgS2luZHMiIGZvbGRlci4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgV29ya1Byb2R1Y3RLaW5kc0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFdvcmtQcm9kdWN0VHlwZSBjaGlsZCA9IChXb3JrUHJvZHVjdFR5cGUpIGl0ZXIubmV4dCgpOwotCQkvLyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0KLQkJLy8gKFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNoaWxkLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIChjb21tZW50ZWQgZm9yIHRoaXMgZGVmZWN0KQotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVsZW1lbnQpCi0JCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJLy8gV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHVuY2F0ZWdvcml6ZWQgPQotCQkvLyBuZXcKLQkJLy8gV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkvLyBjb3JlQ29udGVudFBrZyk7Ci0JCS8vIGNoaWxkcmVuLmFkZCh1bmNhdGVnb3JpemVkKTsKLQkJLy8gaWYoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPT0gbnVsbCkgewotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIH0KLQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KHVuY2F0ZWdvcml6ZWQuZ2V0VGV4dChudWxsKSwgdW5jYXRlZ29yaXplZCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgV29ya1Byb2R1Y3RUeXBlLmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1dPUktfUFJPRFVDVF9UWVBFKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3NmIyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3Igc3RhbmRhcmQgYW5kIGN1c3RvbSBjYXRlZ29yaWVzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BY3Rpb25NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGEzNzk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGV4ZWN1dGlvbiBvZiBlZGl0aW5nIGNvbW1hbmRzIHdpdGggZnVsbCBzdXBwb3J0IGZvciBkaXJ0eSBmbGFnLAotICogdW5kbyBhbmQgcmVkby4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQWN0aW9uTWFuYWdlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JcHJpdmF0ZSBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotCi0JcHVibGljIEFjdGlvbk1hbmFnZXIoKSB7Ci0JCWNvbW1hbmRTdGFjayA9IGNyZWF0ZUNvbW1hbmRTdGFjaygpOwotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCWNvbW1hbmRTdGFjayk7Ci0JfQotCi0JcHJvdGVjdGVkIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBuZXcgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQXNNb2RpZmllck9mKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcmVnaXN0ZXJBc01vZGlmaWVyT2YocmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQXNNb2RpZmllck9mKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN5bmNocm9uaXplZCAoUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUCkgewotCQkJU2V0IG1vZHMgPSAoU2V0KSBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLmdldChyZXNvdXJjZSk7Ci0JCQlpZiAobW9kcyA9PSBudWxsKSB7Ci0JCQkJbW9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5wdXQocmVzb3VyY2UsIG1vZHMpOwotCQkJfQotCQkJbW9kcy5hZGQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyQXNNb2RpZmllcigpIHsKLQkJc3luY2hyb25pemVkIChSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRNb2RpZmllZFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJU2V0IG1vZHMgPSAoU2V0KSBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLmdldChyZXNvdXJjZSk7Ci0JCQkJaWYgKG1vZHMgIT0gbnVsbCkgewotCQkJCQltb2RzLnJlbW92ZSh0aGlzKTsKLQkJCQkJaWYgKG1vZHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBiZWZvcmUgaXQgcmVtb3ZlZCBmcm9tCi0JCQkJCQkvLyBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQCi0JCQkJCQkvLyAKLQkJCQkJCXNhdmUocmVzb3VyY2UpOwotCQkJCQkJUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5yZW1vdmUocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUNvbW1hbmQgY21kID0gbnVsbDsKLQkJT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsKLQkJc3dpdGNoIChhY3Rpb25UeXBlKSB7Ci0JCWNhc2UgQUREOiB7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCWNtZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJCQlpbmRleCk7Ci0JCQl9IGVsc2UgewotCQkJCWNtZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBBRERfTUFOWTogewotCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQljbWQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsCi0JCQkJCQkoQ29sbGVjdGlvbikgdmFsdWUsIGluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLAotCQkJCQkJKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUkVNT1ZFOiB7Ci0JCQljbWQgPSBuZXcgUmVtb3ZlQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUkVNT1ZFX01BTlk6IHsKLQkJCWNtZCA9IG5ldyBSZW1vdmVDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwKLQkJCQkJKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU0VUOiB7Ci0JCQlvbGRWYWx1ZSA9IG9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKChvbGRWYWx1ZSAhPSBudWxsICYmICFvbGRWYWx1ZS5lcXVhbHModmFsdWUpKQotCQkJCQl8fCAob2xkVmFsdWUgPT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSkgewotCQkJCWNtZCA9IG5ldyBTZXRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJfQotCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21tYW5kU3RhY2suZG9FeGVjdXRlKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbW1hbmRTdGFjay51bmRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJY29tbWFuZFN0YWNrLnJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1bmRvQWxsKCkgewotCQlib29sZWFuIGIgPSBjb21tYW5kU3RhY2sudW5kb0FsbCgpOwotCQl1bnJlZ2lzdGVyQXNNb2RpZmllcigpOwotCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChudWxsKTsKLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUlzRG9uZSgpIHsKLQkJY29tbWFuZFN0YWNrLnNhdmVJc0RvbmUoKTsKLQkJdW5yZWdpc3RlckFzTW9kaWZpZXIoKTsKLQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobnVsbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCQlib29sZWFuIHJldCA9IGNvbW1hbmRTdGFjay5pc1NhdmVOZWVkZWQoKTsKLQkJaWYgKCFyZXQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRNb2RpZmllZFJlc291cmNlcygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljb21tYW5kU3RhY2suZmx1c2goKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJc3luY2hyb25pemVkIChSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQKSB7Ci0JCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJU2V0IG1vZHMgPSAoU2V0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChtb2RzLmNvbnRhaW5zKHRoaXMpKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCQl9Ci0JfQotCi0JLy8gcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCS8vIGNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkvLyBjaGFuZ2VOb3RpZmllci5hZGQobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkvLyB9Ci0JLy8KLQkvLyBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKLQkvLyB7Ci0JLy8gY2hhbmdlTm90aWZpZXIucmVtb3ZlKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JLy8gfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nIGhlcmUsIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdG8gcHJvdmlkZSBzYXZpbmcgdGhlCi0JICogcmVzb3VyY2UgYmVmb3JlIGl0IGdvdCByZW1vdmVkIGZyb20gUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIGNvbW1hbmRTdGFjazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQpIHsKLQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tbWFuZFN0YWNrLmRvRXhlY3V0ZShjbWQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb0NhdGVnb3J5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvQ2F0ZWdvcnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjc1YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvQ2F0ZWdvcnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBhc3NpZ24gYSBtZXRob2QgZWxlbWVudCB0byBhIGNhdGVnb3J5LiBJZiB0aGUgY2F0ZWdvcnkKLSAqIGlzIGluIGEgYmFzZSBtZXRob2QgcGx1Zy1pbiBvZiB0aGUgZWxlbWVudCwgdGhpcyBjb21tYW5kIHdpbGwgYXV0b21hdGljYWxseQotICogY3JlYXRlIGEgY29udHJpYnV0b3IgdG8gdGhlIGJhc2UgY2F0ZWdvcnkgYW5kIGFzc2lnbiB0aGUgZWxlbWVudCB0byB0aGUKLSAqIGNvbnRyaWJ1dGluZyBjYXRlZ29yeS4gVGhpcyBpcyBhdm9pZHMgbW9kaWZ5aW5nIHRoZSBiYXNlIG1ldGhvZCBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVG9DYXRlZ29yeUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3I7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSB1c2VkQ2F0ZWdvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZU5ld0NvbnRyaWJ1dG9yID0gZmFsc2U7Ci0KLQlwcml2YXRlIENvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBPYmplY3Qgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCi0JcHJpdmF0ZSBMaXN0IHVzZWRDYXRlZ29yaWVzOwotCi0JcHVibGljIEFkZFRvQ2F0ZWdvcnlDb21tYW5kKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgsIGJvb2xlYW4gY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yLAotCQkJTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuY2F0ZWdvcnlQa2dQYXRoID0gY2F0ZWdvcnlQa2dQYXRoOwotCQl0aGlzLmNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvciA9IGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcjsKLQkJdGhpcy51c2VkQ2F0ZWdvcmllcyA9IHVzZWRDYXRlZ29yaWVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCS8vIGNoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIHdpbGwgbW9kaWZ5IHRoZSBlbGVtZW50IGluIG9wcG9zaXRlIGZlYXR1cmUKLQkJLy8gdmFsdWUKLQkJLy8KLQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKGNhdGVnb3J5LCBmZWF0dXJlLAotCQkJCWVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuICJBZGQgVG8gQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gY3JlYXRlIGNvbnRyaWJ1dG9yIGZvciBjYXRlZ29yeSBpZiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgcGx1Z2luIHdpdGgKLQkJLy8gdGhlIGVsZW1lbnQKLQkJLy8KLQkJTWV0aG9kUGx1Z2luIGVsZW1lbnRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQlpZiAoY2F0ZWdvcnlQbHVnaW4gIT0gZWxlbWVudFBsdWdpbgotCQkJCSYmIE1pc2MuaXNCYXNlT2YoY2F0ZWdvcnlQbHVnaW4sIGVsZW1lbnRQbHVnaW4pKSB7Ci0JCQlpZiAoY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIkNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byBhbiBleHRlbmRlZCBjYXRlZ29yeSB0aGF0IGlzIGluIGEgZGlmZmVyZW50IHBsdWctaW46ICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJY2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbGVtZW50UGx1Z2luLAotCQkJCQljYXRlZ29yeVBrZ1BhdGgpOwotCQkJQ29udGVudENhdGVnb3J5IGNvbnRyaWIgPSBudWxsOwotCQkJaWYgKGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcikgewotCQkJCS8vIGxvb2sgZm9yIHRoZSBleGlzdGluZyBjb250cmlidXRvciBmb3IgdGhlIGNhdGVnb3J5Ci0JCQkJLy8KLQkJCQljb250cmliID0gVG5nVXRpbC5maW5kQ29udHJpYnV0b3IoY2F0ZWdvcnlQa2csIGNhdGVnb3J5KTsKLQkJCX0KLQotCQkJaWYgKGNvbnRyaWIgPT0gbnVsbCkgewotCQkJCWNyZWF0ZU5ld0NvbnRyaWJ1dG9yID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5ID0gY29udHJpYjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl9Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoY3JlYXRlTmV3Q29udHJpYnV0b3IpIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmliID0gKENvbnRlbnRDYXRlZ29yeSkgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZShjYXRlZ29yeS5lQ2xhc3MoKSk7Ci0JCQljb250cmliLnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoY2F0ZWdvcnkpOwotCQkJY29udHJpYi5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQkJCWNhdGVnb3J5UGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjb250cmliKTsKLQkJCXVzZWRDYXRlZ29yeSA9IGNvbnRyaWI7Ci0JCQlpZiAodXNlZENhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSByb290ID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoVW1hVXRpbAotCQkJCQkJLmdldE1ldGhvZFBsdWdpbih1c2VkQ2F0ZWdvcnkpKTsKLQkJCQlMaXN0IGxpc3QgPSByb290LmdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJCQlsaXN0LmFkZCh1c2VkQ2F0ZWdvcnkpOwotCQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUocm9vdCwgKEN1c3RvbUNhdGVnb3J5KXVzZWRDYXRlZ29yeSwgY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5LnNldE5hbWUoY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCQlvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSA9IG1yRU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQoCi0JCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpZiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gdXNlZENhdGVnb3J5KSB7Ci0JCQkJCUVPYmplY3Qgb2xkT3BwVmFsID0gKEVPYmplY3QpIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlOwotCQkJCQkoKENvbGxlY3Rpb24pIG9sZE9wcFZhbC5lR2V0KGZlYXR1cmUpKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCWlmIChvbGRPcHBWYWwuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG9sZE9wcFZhbC5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQotCQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNvbGxlY3Rpb24uY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpZiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gdXNlZENhdGVnb3J5KSB7Ci0JCQkJCUVPYmplY3Qgb2xkT3BwVmFsID0gKEVPYmplY3QpIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlOwotCQkJCQlvbGRPcHBWYWwuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJaWYgKG9sZE9wcFZhbC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkT3BwVmFsLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICh1c2VkQ2F0ZWdvcnkgIT0gb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUpIHsKLQkJCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmICh1c2VkQ2F0ZWdvcnkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotCQkJdXNlZENhdGVnb3JpZXMucmVtb3ZlKGNhdGVnb3J5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJY29sbGVjdGlvbi5yZW1vdmUoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJfQotCi0JCS8vIHJlc3RvcmUgb2xkIHZhbHVlIG9mIHRoZSBzaW5nbGUtdmFsdWUgb3Bwb3NpdGUgZmVhdHVyZQotCQkvLwotCQlpZiAoIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSAmJiBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsCi0JCQkJJiYgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gdXNlZENhdGVnb3J5KSB7Ci0JCQlFT2JqZWN0IG9sZE9wcFZhbCA9IChFT2JqZWN0KSBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBvbGRPcHBWYWwuZUdldChmZWF0dXJlKSkuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRPcHBWYWwuZVNldChmZWF0dXJlLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChjcmVhdGVOZXdDb250cmlidXRvcikgewotCQkJaWYgKFRuZ1V0aWwuaXNFbXB0eSh1c2VkQ2F0ZWdvcnkpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHVzZWRDYXRlZ29yeVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHVzZWRDYXRlZ29yeSk7Ci0JCQkJRWNvcmVVdGlsLnJlbW92ZSh1c2VkQ2F0ZWdvcnkpOwotCQkJCWlmICh1c2VkQ2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeSh1c2VkQ2F0ZWdvcnlQbHVnaW4pCi0JCQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5yZW1vdmUodXNlZENhdGVnb3J5KTsKLQkJCQl9Ci0JCQkJdXNlZENhdGVnb3J5ID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoIXVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotCQkJdXNlZENhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLQkJfQotCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1c2VkQ2F0ZWdvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjY2MgotCQkvLyBCZWxvdyBhZGRpbmcgY2F0ZWdvcnkncyByZXNvdXJjZSB0byBtb2RpZmllZFJlc291cmNlcyBpcyBuZWVkZWQsIAotCQkvLyBiZWNhdXNlIGJlZm9yZSBleGVjdXRpbmcgY29tbWFuZCwgbmVlZCB0byB2ZXJpZnkgaWYgcmVzb3VyY2UgaXMgbXV0YWJsZSBvciBub3QKLQkJLy8gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSBjYWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBhY3R1YWwgZXhlY3V0ZSgpIGluIGZldyBjYXNlcy4KLQkJLy8gVXNlZnVsIGluIHNwZWNpYWwgY2FzZXMgbGlrZSBpZiByZXNvdXJjZSBpcyBpbiB2ZXJzaW9uIGNvbnRyb2wuCi0JCS8vCi0JCWlmKGNhdGVnb3J5ICE9IG51bGwgJiYgY2F0ZWdvcnkuZVJlc291cmNlKCkgIT0gbnVsbAotCQkJCSYmIG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNhdGVnb3J5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQkKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvU2VjdGlvbkxpc3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWU1MjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvU2VjdGlvbkxpc3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gYWRkIGEgbmV3IHNlY3Rpb24gdG8gdGhlIHNlY3Rpb24gbGlzdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFRvU2VjdGlvbkxpc3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0OwotCi0JcHJpdmF0ZSBTZWN0aW9uIHNlY3Rpb247Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRkZWQ7Ci0KLQlwdWJsaWMgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQoQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQsCi0JCQlTZWN0aW9uIHNlY3Rpb24sIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0KSB7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy5zZWN0aW9uTGlzdCA9IHNlY3Rpb25MaXN0OwotCQl0aGlzLnNlY3Rpb24gPSBzZWN0aW9uOwotCi0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCX1lbHNlewotCQkJLy8gVGhpcyBjaGVjayBpcyBkb25lIHRvIGJ5cGFzcyBhZGRpdGlvbiBvZiBzZWN0aW9uIHRvIG1ldGhvZCBlbGVtZW50Ci0JCQkvLyBmb3IgZmlyc3QgdGltZSwgaWYgcGx1Z2luLnhtaSBmaWxlIGNoZWNrZWQtb3V0IHdpdGggdmVyc2lvbiBjb250cm9sLiAKLQkJCWlmKGNvbnRlbnRFbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwpewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250ZW50RWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmIChjb250ZW50RWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzZWN0aW9uTGlzdC5hZGQoc2VjdGlvbik7Ci0JCWFkZGVkID0gdHJ1ZTsKLQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChhZGRlZCkgewotCQkJc2VjdGlvbkxpc3QucmVtb3ZlKHNlY3Rpb24pOwotCQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQkJCWFkZGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9CYXRjaENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9CYXRjaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmMTY4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQmF0Y2hDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIGZlYXR1cmVzIG9mIG11bHRpcGxlIG9iamVjdHMgaW4KLSAqIGEgc2luZ2xlIGJhdGNoLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhdGNoQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBNYXAgb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwOwotCXByaXZhdGUgTWFwIG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcDsKLQlwcml2YXRlIGJvb2xlYW4gY2xlYXI7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNsZWFyIGlmIHRydWUgd2lsbCBjbGVhciB0aGUgbWFueS12YWx1ZWQgZmVhdHVyZSBiZWZvcmUgYWRkaW5nIG5ldyB2YWx1ZXMgCi0JICovCi0JcHVibGljIEJhdGNoQ29tbWFuZChib29sZWFuIGNsZWFyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY2xlYXIgPSBjbGVhcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2NhbkV4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCAmJiAhb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZihvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgPT0gbnVsbCB8fCBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcCA9PSBudWxsKSB7Ci0JCQlvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmVudHJ5U2V0KCkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5Ci0JCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJaWYoY2xlYXIpIHsKLQkJCQkJCWVPYmouZVNldChmZWF0dXJlLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCSgoTGlzdCkgZU9iai5lR2V0KGZlYXR1cmUpKS5hZGRBbGwoKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJT2JqZWN0IG9sZFZhbHVlID0gZU9iai5lR2V0KGZlYXR1cmUpOwotCQkJCQlpZiAob2xkVmFsdWUgIT0gZW50cnkuZ2V0VmFsdWUoKSkgewotCQkJCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShlT2JqLCBmZWF0dXJlKTsKLQkJCQkJCWVPYmouZVNldChmZWF0dXJlLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwgJiYgIW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJKChMaXN0KSBlT2JqLmVHZXQoZmVhdHVyZSkpCi0JCQkJCQkJCS5yZW1vdmVBbGwoKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0KLQkJLy8gcmVzdG9yZSBvbGQgdmFsdWUKLQkJLy8KLQkJaWYgKG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcCAhPSBudWxsICYmICFvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbnRyeQotCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJZU9iai5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5jbGVhcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmVWYWx1ZShFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlhZGRGZWF0dXJlVmFsdWUoZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksIG9iaiwgZmVhdHVyZSwgdmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHZhbHVlcyB0byBhICdtYW55JyBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZSB3aXRoIG1hbnkgdmFsdWVzCi0JICogQHBhcmFtIHZhbHVlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmVWYWx1ZXMoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIHZhbHVlcykgewotCQlhZGRGZWF0dXJlVmFsdWVzKGdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLCBvYmosIGZlYXR1cmUsIHZhbHVlcyk7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSB7Ci0JCWlmKG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCA9PSBudWxsKSB7Ci0JCQlvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNhdmVPbGRGZWF0dXJlVmFsdWUoRU9iamVjdCBlT2JqLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IHZhbHVlID0gZU9iai5lR2V0KGZlYXR1cmUpOwotCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQl2YWx1ZSA9IG5ldyBBcnJheUxpc3QoKExpc3QpdmFsdWUpOwotCQl9Ci0JCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmdldChlT2JqKTsKLQkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAucHV0KGVPYmosIGZlYXR1cmVNYXApOwotCQl9Ci0JCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCAhPSBudWxsKSB7Ci0JCQlvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuY2xlYXIoKTsKLQkJCW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcCAhPSBudWxsKSB7Ci0JCQlvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAuY2xlYXIoKTsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlKE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLAotCQkJRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLmdldChvYmplY3QpOwotCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZU1hcCk7Ci0JCX0KLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBmZWF0dXJlTWFwLmdldChmZWF0dXJlKTsKLQkJCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQodmFsdWUpOwotCQl9IGVsc2UgewotCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEZlYXR1cmVWYWx1ZXMoTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsCi0JCQlFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcC5nZXQob2JqZWN0KTsKLQkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLnB1dChvYmplY3QsIGZlYXR1cmVNYXApOwotCQl9Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBmZWF0dXJlTWFwLmdldChmZWF0dXJlKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIGxpc3QpOwotCQl9Ci0JCWxpc3QuYWRkQWxsKHZhbHVlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTIxNzczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotLyoqCi0gKiBMaXN0ZW5zIHRvIGNoYW5nZXMgdG8gYSBjb21tZW5kIHN0YWNrLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBVkVEID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYRUNVVEVEID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVORE8gPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ET19BTEwgPSA4OwotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQotCXB1YmxpYyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQoT2JqZWN0IHNvdXJjZSwgaW50IHR5cGUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY3MjcyOTQ2MDQyOTI5MTZMOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGF0dXNDaGVja2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YXR1c0NoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0ZWY2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YXR1c0NoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIENoZWNrcyB0aGUgc3RhdHVzIG9mIGFuIGV4ZWN1dGVkIGNvbW1hbmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDIxLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kU3RhdHVzQ2hlY2tlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzUm9sbGJhY2tFcnJvcihJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gaGFzRXJyb3Ioc3RhdHVzLCBTYXZlU3RhdHVzLlJPTExCQUNLX0VSUk9SKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzU2F2ZUVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBoYXNFcnJvcihzdGF0dXMsIFNhdmVTdGF0dXMuU0FWRV9FUlJPUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc0Vycm9yKElTdGF0dXMgc3RhdHVzLCBpbnQgZXJyQ29kZSkgewotCQlpZiAoc3RhdHVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVN0YXR1c1tdIHN0YXR1c2VzID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlTdGF0dXMgY2hpbGRTdGF0dXMgPSBzdGF0dXNlc1tpXTsKLQkJCWlmIChjaGlsZFN0YXR1cyBpbnN0YW5jZW9mIFNhdmVTdGF0dXMKLQkJCQkJJiYgKGNoaWxkU3RhdHVzLmdldENvZGUoKSAmIGVyckNvZGUpID09IGVyckNvZGUpIHsKLQkJCQlyZXQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0RlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwMGZiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGRlbGV0ZSBhIG1ldGhvZCBlbGVtZW50IHBlcm1hbmVudGx5LiBUaGlzIGludm9sdmVzCi0gKiBkZWxldGluZyB0aGUgc3RvcmFnZSBjb250ZW50IGFuZCByZW1vdmluZyBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmRXcmFwcGVyIHsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlZlJlbW92ZWQ7Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbW1hbmRMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXI7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGVsZW1lbnRzVG9EZWxldGVDb250ZW50OwotCi0JcHJvdGVjdGVkIFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvLyBNYXAgb2YgZWxlbWVudCB0byBNYXAgb2YgaXRzIHJlZmVyZW5jZXIgdG8gZmVhdHVyZXMgbGlzdAotCS8vCi0JcHJvdGVjdGVkIE1hcDxFT2JqZWN0LCBNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+Pj4gZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXA7Ci0KLQlwcml2YXRlIEJhdGNoQ29tbWFuZCBiYXRjaENvbW1hbmQgPSBuZXcgQmF0Y2hDb21tYW5kKHRydWUpOwotCi0JLyoqCi0JICogTGlzdCBvZiBSZWZlcmVuY2Ugb2JqZWN0cwotCSAqIAotCSAqIEBzZWUgUmVmZXJlbmNlCi0JICovCi0JcHJvdGVjdGVkIEFycmF5TGlzdCByZW1vdmVkUmVmZXJlbmNlczsKLQotCXB1YmxpYyBib29sZWFuIGZhaWxlZDsKLQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtUmVtb3ZlUmVmZXJlbmNlczsKLQkKLQlwcml2YXRlIEFycmF5TGlzdDxDb21tYW5kPiBuZXN0ZWRDb21tYW5kczsKLQotCXByaXZhdGUgSGFzaFNldDxEZXNjcmlwdG9yPiBkZXNjcmlwdG9yczsKLQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IG9iamVjdHMgdG8gYmUgcGVybWFuZW50bHkgZGVsZXRlZC4KLQkgKi8KLQlwdWJsaWMgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXRoaXMoY29tbWFuZCwgZWxlbWVudHMsIHRydWUpOwotCX0KLQotCXB1YmxpYyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMsCi0JCQlib29sZWFuIGNvbmZpcm1SZW1vdmVSZWZzKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzKTsKLQkJY29tbWFuZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY29uZmlybVJlbW92ZVJlZmVyZW5jZXMgPSBjb25maXJtUmVtb3ZlUmVmczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQliYXRjaENvbW1hbmQuZGlzcG9zZSgpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRzVG9EZWxldGVDb250ZW50ICE9IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9EZWxldGVDb250ZW50LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwICE9IG51bGwpIHsKLQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJlbW92ZWRSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXJlbW92ZWRSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCX0KLQkJLy8gRGlzcG9zZSBuZXN0ZWQgY29tbWFuZHMuCi0JCWlmKG5lc3RlZENvbW1hbmRzICE9IG51bGwpewotCQkJaWYoIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSl7Ci0JCQkJZm9yIChDb21tYW5kIGNvbW1hbmQgOiBuZXN0ZWRDb21tYW5kcykgewotCQkJCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN1cGVyRXhlY3V0ZSgpIHsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlQcmVFeGVjdXRlKCkgewotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgY21kTGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJY21kTGlzdGVuZXIucHJlRXhlY3V0ZSh0aGlzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVByZVVuZG8oKSB7Ci0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBjbWRMaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQljbWRMaXN0ZW5lci5wcmVVbmRvKHRoaXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRWxlbWVudHMoKSB7Ci0JCUFycmF5TGlzdCBuZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCVJlbW92ZUNvbW1hbmQgY21kID0gZ2V0UmVtb3ZlQ29tbWFuZChlbGVtZW50KTsKLQkJCQlpZiAoY21kLmdldEZlYXR1cmUoKSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UKLQkJCQkJCSYmICgoRVJlZmVyZW5jZSkgY21kLmdldEZlYXR1cmUoKSkuaXNDb250YWlubWVudCgpCi0JCQkJCQkmJiBjbWQuZ2V0T3duZXJMaXN0KCkuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJLy8gY3VzdG9tIGNhdGVnb3J5IHdpbGwgYmUgZGVsZXRlZCBwZXJtYW5lbnRseQotCQkJCQkvLyBmaW5kIGFsbCBzdWJjYXRlZ29yeSB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBieSBhbnkgb3RoZXIKLQkJCQkJLy8gY3VzdG9tIGNhdGVnb3J5Ci0JCQkJCS8vIGluIHRoZSBzYW1lIHBsdWdpbiB0byBkZWxldGUgdGhlbSBhcyB3ZWxsCi0JCQkJCS8vCi0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IFRuZ1V0aWwKLQkJCQkJCQkuZ2V0RXhjbHVzaXZlU3ViQ3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQpOwotCQkJCQlpZiAoIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBzdWJDYXQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKCFlbGVtZW50cy5jb250YWlucyhzdWJDYXQpCi0JCQkJCQkJCQkmJiAhbmV3RWxlbWVudHMuY29udGFpbnMoc3ViQ2F0KSkgewotLy8JCQkJCQkJCWNtZC5nZXRDb2xsZWN0aW9uKCkuYWRkKHN1YkNhdCk7Ci0JCQkJCQkJCUNvbGxlY3Rpb24gY29sID0gY21kLmdldENvbGxlY3Rpb24oKTsKLQkJCQkJCQkJY29sLmFkZChzdWJDYXQpOwkJCQkJCQkJCi0JCQkJCQkJCW5ld0VsZW1lbnRzLmFkZChzdWJDYXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbGVtZW50cy5hZGRBbGwobmV3RWxlbWVudHMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFJlbW92ZUNvbW1hbmQgZm9yIHRoZSBnaXZlbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFJlbW92ZUNvbW1hbmQgZ2V0UmVtb3ZlQ29tbWFuZChPYmplY3QgZSkgewotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCWlmICgoKFJlbW92ZUNvbW1hbmQpIGNvbW1hbmQpLmdldENvbGxlY3Rpb24oKS5jb250YWlucyhlKSkgewotCQkJCXJldHVybiAoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZDsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgQ29tcG91bmRDb21tYW5kKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbXBvdW5kQ29tbWFuZCkgY29tbWFuZCkuZ2V0Q29tbWFuZExpc3QoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNtZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQkJCVJlbW92ZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCA9IChSZW1vdmVDb21tYW5kKSBjbWQ7Ci0JCQkJCWlmIChyZW1vdmVDb21tYW5kLmdldENvbGxlY3Rpb24oKS5jb250YWlucyhlKSkgewotCQkJCQkJcmV0dXJuIHJlbW92ZUNvbW1hbmQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcHJlcGFyZUVsZW1lbnRzKCk7Ci0KLQkJbm90aWZ5UHJlRXhlY3V0ZSgpOwotCi0JCWVsZW1lbnRzVG9EZWxldGVDb250ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0PERlc2NyaXB0b3I+KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KGVsZW1lbnRzVG9EZWxldGVDb250ZW50LAotCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlwcmVwYXJlUmVtb3ZpbmdSZWZlcmVuY2VzKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwKLQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZSk7IAotCi0KLQkJaWYoIWNvbmZpcm1SZW1vdmluZ1JlZmVyZW5jZXMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlTZXQgdW5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLy8gZ2V0IHRoZSBvd25lciByZXNvdXJjZXMgYmVmb3JlIHRoZSBlbGVtZW50cyBnb3QgcmVtb3ZlZCBmcm9tCi0JCS8vIGNvbnRhaW5lciBpbiBzdXBlckV4ZWN1dGUoKQotCQkvLwotCQljb2xsZWN0T3duZXJSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMsIHVubW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCXN1cGVyRXhlY3V0ZSgpOwotCQkKLQkJZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JCQotCQkvLyBDb2xsZWN0IHRoZSBuZXN0ZWQgY29tbWFuZCBtb2RpZmllZCByZXNvdXJjZXMgZm9yIHNhdmluZy4gCi0JCWNvbGxlY3ROZXN0ZWRDb21tYW5kUmVzb3VyY2VzKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBnZXQgcmVzb3VyY2VzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGFmZmVjdGVkIGJ5IHRoaXMgY29tbWFuZAotCQkvLyB1bnRpbCBub3cKLQkJLy8KLQkJY29sbGVjdFJlc291cmNlcyhtb2RpZmllZFJlc291cmNlcywgc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCi0JCW1vZGlmaWVkUmVzb3VyY2VzLnJlbW92ZUFsbCh1bm1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQlmaW5hbCBFeGNlcHRpb25bXSBleGNlcHRpb25zID0gbmV3IEV4Y2VwdGlvblsxXTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuV2l0aEJ1c3lJbmRpY2F0b3IobmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlUmVmZXJlbmNlcygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4Y2VwdGlvbnNbMF0gPSBlOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlpZiAoZXhjZXB0aW9uc1swXSAhPSBudWxsKSB7Ci0JCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZUVsZW1lbnRFcnJvcl9tc2csCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb24sCi0JCQkJCWV4Y2VwdGlvbnNbMF0pOwotCQkJCQotCQkJdW5kbygpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKGdldFJlZmVyZW5jaW5nUmVzb3VyY2VzKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9EZWxldGVDb250ZW50Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCi0JCUhhc2hTZXQ8UmVzb3VyY2U+IGRlbGV0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoISAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkpIHsKLQkJCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgb2JqOwotCQkJCVVtYVV0aWwuZ2V0UmVzb3VyY2VzKGUsIGRlbGV0ZWRSZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBleGNsdWRlIGRlbGV0ZWQgcmVzb3VyY2VzIGZyb20gdGhlIHNldCBvZiBtb2RpZmllZCByZXNvdXJjZXMKLQkJLy8KLQkJbW9kaWZpZWRSZXNvdXJjZXMucmVtb3ZlQWxsKGRlbGV0ZWRSZXNvdXJjZXMpOwotCQkKLQkJLy8gZXhjbHVkZSBhbnkgcmVzb3VyY2UgdGhhdCBpcyBjb250YWluZWQgYnkgdGhlIGRlbGV0ZWQgcmVzb3VyY2VzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlbGV0ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBkZWxldGVkUmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihnZXRQZXJzaXN0ZXIoKS5pc0NvbnRhaW5lZEJ5KHJlc291cmNlLCBkZWxldGVkUmVzb3VyY2UpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQkJCi0JCS8vIGNoZWNrIGFmZmVjdGVkIHJlc291cmNlcyBmb3IgdW5tb2RpZmlhYmxlCi0JCS8vCi0JCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRWxlbWVudEVycm9yX21zZywgc3RhdHVzKTsKLQotCQkJdW5kbygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDMpOyAvLyROT04tTkxTLTEkCi0JCQkJZ2V0UGVyc2lzdGVyKCk7Ci0KLQkJCQkvLyBzYXZlIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIGNoYW5nZWQgYWZ0ZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkJCQkvLyBkZWxldGVkIGVsZW1lbnRzCi0JCQkJLy8gaGFkIGJlZW4gcmVtb3ZlZAotCQkJCS8vCi0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvcgotCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWUpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZGVsZXRlQ29udGVudCgpOwotCi0JCQkJCS8vIHNhdmUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJCS8vCi0JCQkJCW1vbml0b3Iuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZpbmdSZXNvdXJjZXNfbXNnKTsKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0KLQkJCQkJZXhlY3V0ZWQgPSB0cnVlOwotCi0JCQkJCXJlbW92ZUFkYXB0ZXJzKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0cnkgewotCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJZmFpbGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQkvLyBpZiAoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCS8vIExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJLy8gaWYgKGZhaWxlZCkgewotCQkvLyBub3RpZnlGYWlsdXJlKCk7Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHVuZG8oKTsKLQkJLy8gfQotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQotLy8JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCAoU2hlbGwpIG51bGwpOwotCQkKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZSk7Ci0KLQkJaWYgKGV4ZWN1dGVkKSB7Ci0JCQl0cnkgewotCQkJCUxpc3Qgd2FybmluZ3MgPSBwZXJzaXN0ZXIuZ2V0V2FybmluZ3MoKTsKLQkJCQlpZiAoIXdhcm5pbmdzLmlzRW1wdHkoKSkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGU7Ci0JCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnOwotCQkJCQlTdHJpbmdCdWZmZXIgcmVhc29uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3YXJuaW5ncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCUV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCQlTdHJpbmcgc3RyID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCQlpZiAoIVN0clV0aWwuaXNCbGFuayhzdHIpKSB7Ci0JCQkJCQkJcmVhc29uLmFwcGVuZChzdHIpLmFwcGVuZCgnXG4nKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24KLQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQkKLQkJCW5vdGlmeUV4ZWN1dGVkKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmFpbGVkKSB7Ci0JCQkJbm90aWZ5RmFpbHVyZSgpOwotCQkJfSBlbHNlIHsKLQkJCQl1bmRvKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29uZmlybVJlbW92aW5nUmVmZXJlbmNlcygpIHsKLQkJaWYgKCFlbGVtZW50VG9SZW1vdmVkUmVmc01hcC5pc0VtcHR5KCkpIHsKLQkJCS8vIGNvbGxlY3Qgc2V0IG9mIHJlZmVyZW5jZXJzCi0JCQlIYXNoU2V0PEVPYmplY3Q+IHJlZmVyZW5jZXJzID0gbmV3IEhhc2hTZXQ8RU9iamVjdD4oKTsKLQkJCWZvciAoTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gcmVmZXJlbmNlclRvRmVhdHVyZXNNYXAgOiBlbGVtZW50VG9SZW1vdmVkUmVmc01hcC52YWx1ZXMoKSkgewotCQkJCS8vIGNvbGxlY3Qgb25seSByZWZlcmVuY2VyIHdpdGggYW4gdW5pZGlyZWN0aW9uYWwgb3IgY29udGFpbm1lbnQKLQkJCQkvLyByZWxhdGlvbnNoaXAKLQkJCQkvLwotCQkJCWZvciAoTWFwLkVudHJ5PEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gZW50cnkgOiByZWZlcmVuY2VyVG9GZWF0dXJlc01hcC5lbnRyeVNldCgpKSB7Ci0JCQkJCUNvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCWJvb2xlYW4gY2FuQ29sbGVjdCA9IGZhbHNlOwotCQkJCQlib29sZWFuIGhhc0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQkJY2hlY2tfcmVmOiBmb3IgKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmIDogZmVhdHVyZXMpIHsKLQkJCQkJCWlmICghY2FuQ29sbGVjdCAmJiBmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGY7Ci0JCQkJCQkJaWYgKHJlZi5pc0NvbnRhaW5tZW50KCkKLQkJCQkJCQkJCXx8IHJlZi5nZXRFT3Bwb3NpdGUoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCWNhbkNvbGxlY3QgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKCFoYXNEZXNjcmlwdG9yICYmIChmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKQotCQkJCQkJCQl8fCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKQotCQkJCQkJCQl8fCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpKSkgewotCQkJCQkJCWhhc0Rlc2NyaXB0b3IgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJaWYoY2FuQ29sbGVjdCAmJiBoYXNEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJYnJlYWsgY2hlY2tfcmVmOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY2FuQ29sbGVjdCkgewotCQkJCQkJcmVmZXJlbmNlcnMuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCQkJfQotCQkJCQlpZihoYXNEZXNjcmlwdG9yICYmIGVudHJ5LmdldEtleSgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJZGVzY3JpcHRvcnMuYWRkKChEZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNvbmZpcm0gd2l0aCB1c2VyIGJlZm9yZSByZW1vdmluZyBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJCS8vCi0JCQlpZiAoY29uZmlybVJlbW92ZVJlZmVyZW5jZXMpIHsJCQkJCi0JCQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkJCWlmKCFkZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gYXNrIHVzZXIgdG8gZGVsZXRlIHRoZSBkZXNjcmlwdG9ycyB0aGF0IGFyZSBhc3NvY2lhdGVkCi0JCQkJCS8vIHdpdGggdGhlIGNvbnRlbnQgZWxlbWVudCB0byBiZSBkZWxldGVkCi0JCQkJCS8vCi0JCQkJCWZvciAoRU9iamVjdCBlIDogZGVzY3JpcHRvcnMpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZWxlbWVudFR5cGVfdGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSwgVG5nVXRpbAotCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGUpKTsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sCi0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkwLCBtc2csIG51bGwpOwotCQkJCQkJbXVsdGlTdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCXN3aXRjaCAodWlIYW5kbGVyCi0JCQkJCQkJCS5zZWxlY3RPbmUoCi0JCQkJCQkJCQkJbmV3IGludFtdIHsKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsCi0JCQkJCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8sCi0JCQkJCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMIH0sCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fdGl0bGUsCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fbXNnLAotCQkJCQkJCQkJCW11bHRpU3RhdHVzKSkgewotCQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJCQkJCWRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYoIWRlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJCQkvLyByZW1vdmUgdGhlIGRlc2NyaXB0b3JzIHRoYXQgdXNlciB3YW50ZWQgdG8gZGVsZXRlIGZyb20gdGhlIHJlZmVyZW5jZXJzCi0JCQkJCS8vCi0JCQkJCXJlZmVyZW5jZXJzLnJlbW92ZUFsbChkZXNjcmlwdG9ycyk7Ci0JCQkJfQotCQkJCW11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEVPYmplY3QgZSA6IHJlZmVyZW5jZXJzKSB7Ci0JCQkJCS8vIGRvbid0IHNob3cgcHJlZGVmaW5lZCBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCWlmICghKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlKSkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZWxlbWVudFR5cGVfdGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSwgVG5nVXRpbAotCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGUpKTsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sCi0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkwLCBtc2csIG51bGwpOwotCQkJCQkJbXVsdGlTdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG11bHRpU3RhdHVzLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHVpSGFuZGxlcgotCQkJCQkJCQkuc2VsZWN0T25lKAotCQkJCQkJCQkJCW5ldyBpbnRbXSB7Ci0JCQkJCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fT0ssCi0JCQkJCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMIH0sCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQsIG11bHRpU3RhdHVzKSA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBpZiB0aGUgcmVmZXJlbmNlcnMgY2FuIGJlIGNoYW5nZWQKLQkJCS8vCi0JCQlmb3IgKEVPYmplY3QgZSA6IHJlZmVyZW5jZXJzKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoZSwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRQotCQkJCQkJCS5zaG93RXJyb3IoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVFbGVtZW50RXJyb3JfbXNnLAotCQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHN0YXRlZnVsIGFkYXB0ZXJzLCB0aGVuIHJlbW92ZXMgYWxsIGFkYXB0ZXJzIHRoYXQgYXJlCi0JICogYXR0YWNoZWQgdG8gdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFkYXB0ZXJzKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmVBZGFwdGVycygpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVN0YXRlZnVsSXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJU3RhdGVmdWxJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIpCi0JCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElSZWZlcmVuY2VyKSB7Ci0JCQkJCQkoKElSZWZlcmVuY2VyKSBhZGFwdGVyRmFjdG9yeSkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsZW1lbnQuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgc3RhdGVmdWwgYWRhcHRlcnMsIHRoZW4gcmVtb3ZlcyBhbGwgYWRhcHRlcnMgdGhhdCBhcmUKLQkgKiBhdHRhY2hlZCB0byB0aGUgZGVsZXRlZCBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFkYXB0ZXJzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBvYmo7Ci0JCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlyZW1vdmVBZGFwdGVycyhlKTsKLQkJCQkJfQotCQkJCQlyZW1vdmVBZGFwdGVycyhlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5RmFpbHVyZSgpIHsKLQkJRXZlbnRPYmplY3QgZXZlbnRPYmplY3QgPSBuZXcgRXZlbnRPYmplY3QodGhpcyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIubm90aWZ5RmFpbHVyZShldmVudE9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKSB7Ci0JCWlmIChwZXJzaXN0ZXIgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKQotCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlFeGVjdXRlZCgpIHsKLQkJRXZlbnRPYmplY3QgZXZlbnRPYmplY3QgPSBuZXcgRXZlbnRPYmplY3QodGhpcyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5jb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKENvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub3RpZnlFeGVjdXRlZChldmVudE9iamVjdCk7Ci0JCX0KLQotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgY21kTGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJY21kTGlzdGVuZXIubm90aWZ5RXhlY3V0ZWQodGhpcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2luZ1Jlc291cmNlcygpIHsKLQkJSGFzaFNldCByZWZlcnJlcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZWZlcmVuY2VzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBNYXAgcmVmZXJyZXJUb0ZlYXR1cmVzTWFwID0gKE1hcCkgaXRlci5uZXh0KCk7Ci0JCS8vIHJlZmVycmVycy5hZGRBbGwocmVmZXJyZXJUb0ZlYXR1cmVzTWFwLmtleVNldCgpKTsKLQkJLy8gfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJcmVmZXJyZXJzLmFkZChyZWYub3duZXIpOwotCQl9Ci0KLQkJSGFzaFNldCByZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcnJlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIENvbGxlY3RzIG93bmVyIHJlc291cmNlcyBvZiB0aGUgZWxlbWVudHMgdG8gYmUgZGVsZXRlZCB0byBzYXZlIGxhdGVyLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdE93bmVyUmVzb3VyY2VzKFNldCByZXNvdXJjZXMsIFNldCB1bm1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gY29udGFpbmVyLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZWxlbWVudCkpIHsKLQkJCQkJCXVubW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdFJlc291cmNlcyhTZXQgcmVzb3VyY2VzLCBDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlT2JqID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJaWYgKGVPYmouZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKGVPYmouZVJlc291cmNlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJc3VwZXIucmVkbygpOwotCQlyZW1vdmVSZWZlcmVuY2VzKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gdG9EZWxldGVMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvRGVsZXRlQ29udGVudC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJaWYgKGUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJdG9EZWxldGVMaXN0LmFkZChlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcGVyc2lzdGVyLmRlbGV0ZSh0b0RlbGV0ZUxpc3QpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJJiYgd2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKChFT2JqZWN0KSBlbGVtZW50KSkgewotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhblJlbW92ZVJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCS8vIGlmIGUgaXMgb25lIG9mIHRoZSBkZWxldGVkIGVsZW1lbnRzLCBtYWtlIHN1cmUgdGhhdCBpdCBhY3R1YWxseSBnb3QKLQkJLy8gZGVsZXRlZCBieSBjaGVja2luZyBpdHMgY29udGFpbmVyCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlID09IG9iaikgewotCQkJCXJldHVybiBlLmVDb250YWluZXIoKSA9PSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGFsbCBvcHBvc2l0ZSBmZWF0dXJlcyBvZiB0aGUgZWxlbWVudHMgdG8gYmUgZGVsZXRlZAotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBlbGVtZW50cyB3aG9zZSBvcHBvc2l0ZSBmZWF0dXJlcyBhcmUgbG9hZGVkCi0JICovCi0JcHVibGljIExpc3QgbG9hZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCUhhc2hTZXQgb3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgZGVsZXRlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGUuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJTWFwIG9wcG9zaXRlRmVhdHVyZU1hcCA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmVNYXAgIT0gbnVsbAotCQkJCQkJCQkmJiAhb3Bwb3NpdGVGZWF0dXJlTWFwLmlzRW1wdHkoKSkgewotCQkJCQkJCW9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJCS5hZGRBbGwob3Bwb3NpdGVGZWF0dXJlTWFwLmtleVNldCgpKTsKLQkJCQkJCQlkZWxldGVkR1VJRHMuYWRkKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsZW1lbnRzLmFkZChlKTsKLQkJCQlNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGRBbGwob3Bwb3NpdGVGZWF0dXJlTWFwLmtleVNldCgpKTsKLQkJCQkJZGVsZXRlZEdVSURzLmFkZCgoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMobmV3IEFycmF5TGlzdChvcHBvc2l0ZUZlYXR1cmVzKSwgZGVsZXRlZEdVSURzKTsKLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29udGFpbmVkQnlEZWxldGVkRWxlbWVudChFT2JqZWN0IGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZGVsZXRlZCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChkZWxldGVkIGluc3RhbmNlb2YgRU9iamVjdCAmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZSwgZGVsZXRlZCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGlmIDxjb2RlPmVsZW1lbnRUb0RlbGV0ZTwvY29kZT4KLQkgKiB3aWxsIGJlIHJlbW92ZWQgZnJvbSA8Y29kZT5yZWZlcmVuY2VzPC9jb2RlPiBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0c1RvUmVtb3ZlCi0JICogICAgICAgICAgICBvdXRwdXQKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcgotCSAqICAgICAgICAgICAgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdG8gZWxlbWVudFRvRGVsZXRlCi0JICogQHBhcmFtIHJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEVSZWZlcmVuY2V9IHRoYXQgY29udGFpbnMgZWxlbWVudFRvRGVsZXRlCi0JICogQHJldHVybiB0cnVlIGlmIG9uZSBvZiB0aGUgY29sbGVjdGVkIG9iamVjdHMgaXMgdGhlCi0JICogICAgICAgICA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPiBvciB0aGUgY29udGFpbmVyIG9mCi0JICogICAgICAgICA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbGxlY3RPYmplY3RzVG9SZW1vdmUoQ29sbGVjdGlvbiBvYmplY3RzVG9SZW1vdmUsCi0JCQlFT2JqZWN0IGVsZW1lbnRUb0RlbGV0ZSwgRU9iamVjdCByZWZlcmVuY2VyLCBDb2xsZWN0aW9uIHJlZmVyZW5jZXMpIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY21kTGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY21kTGlzdGVuZXIgaW5zdGFuY2VvZiBJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcikgewotCQkJCQl0cnkgewotCQkJCQkJYm9vbGVhbiBiID0gKChJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcikgY21kTGlzdGVuZXIpCi0JCQkJCQkJCS5jb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKG9iamVjdHNUb1JlbW92ZSwKLQkJCQkJCQkJCQllbGVtZW50VG9EZWxldGUsIHJlZmVyZW5jZXIsIHJlZmVyZW5jZXMpOwotCQkJCQkJaWYgKGIpIHsKLQkJCQkJCQlyZXQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICh3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoY29tbWFuZCwgZWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29tcG91bmRDb21tYW5kKSBjb21tYW5kKS5nZXRDb21tYW5kTGlzdCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAod2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKGNtZCwgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihDb21tYW5kIGNtZCwKLQkJCUVPYmplY3QgZWxlbWVudCkgewotCQlpZiAoY21kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJUmVtb3ZlQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKChSZW1vdmVDb21tYW5kKSBjbWQpOwotCQkJcmV0dXJuIHJlbW92ZUNvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLmNvbnRhaW5zKGVsZW1lbnQpCi0JCQkJCSYmIHJlbW92ZUNvbW1hbmQuZ2V0T3duZXIoKSA9PSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVJlbW92aW5nUmVmZXJlbmNlcygpIHsKLQkJTGlzdCBlbGVtZW50cyA9IGxvYWRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0KLQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAgPSBuZXcgSGFzaE1hcDxFT2JqZWN0LCBNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+Pj4oKTsKLQkJSGFzaFNldCBvYmplY3RzVG9SZW1vdmUgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+IHJlZk1hcCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlZmVyZW5jZU1hcChlbGVtZW50KTsKLQkJCWlmICghcmVmTWFwLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVPYmplY3QgcmVmZXJlbmNlciA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCWJvb2xlYW4gYiA9IGNvbGxlY3RPYmplY3RzVG9SZW1vdmUob2JqZWN0c1RvUmVtb3ZlLAotCQkJCQkJCWVsZW1lbnQsIHJlZmVyZW5jZXIsIHJlZmVyZW5jZXMpOwotCQkJCQlpZiAoYiB8fCBlbGVtZW50cy5jb250YWlucyhyZWZlcmVuY2VyKQotCQkJCQkJCXx8IGlzQ29udGFpbmVkQnlEZWxldGVkRWxlbWVudChyZWZlcmVuY2VyKSkgewotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFyZWZNYXAuaXNFbXB0eSgpKQotCQkJCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcC5wdXQoZWxlbWVudCwgcmVmTWFwKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBlbnRyaWVzIGZvciBvYmplY3RzVG9SZW1vdmUgdG8gZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0c1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiBtYXAgPSBlbGVtZW50VG9SZW1vdmVkUmVmc01hcC5nZXQob2JqKTsKLQkJCWlmIChtYXAgPT0gbnVsbCkgewotCQkJCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAucHV0KG9iaiwgbWFwKTsKLQkJCX0KLQkJCUVPYmplY3QgY29udGFpbmVyID0gb2JqLmVDb250YWluZXIoKTsKLQkJCUVSZWZlcmVuY2UgY29udGFpbm1lbnRGZWF0dXJlID0gb2JqLmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJCUNvbGxlY3Rpb24gcmVmcyA9IChDb2xsZWN0aW9uKSBtYXAuZ2V0KGNvbnRhaW5lcik7Ci0JCQlpZiAocmVmcyA9PSBudWxsKSB7Ci0JCQkJcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZWZzLmFkZChjb250YWlubWVudEZlYXR1cmUpOwotCQkJCW1hcC5wdXQoY29udGFpbmVyLCByZWZzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFyZWZzLmNvbnRhaW5zKGNvbnRhaW5tZW50RmVhdHVyZSkpIHsKLQkJCQkJcmVmcy5hZGQoY29udGFpbm1lbnRGZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgYWxsIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGVsZW1lbnQ7Ci0JCQkJTWFwIG9ialRvUmVmc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZU9iamVjdAotCQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJCQlFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZUl0ZXJhdG9yCi0JCQkJCQkJLmZlYXR1cmUoKTsKLQkJCQkJaWYgKGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbCkgewotCQkJCQkJTGlzdCByZWZzID0gKExpc3QpIG9ialRvUmVmc01hcC5nZXQoZU9iaik7Ci0JCQkJCQlpZiAocmVmcyA9PSBudWxsKSB7Ci0JCQkJCQkJcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmpUb1JlZnNNYXAucHV0KGVPYmosIHJlZnMpOwotCQkJCQkJfQotCQkJCQkJcmVmcy5hZGQoZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJTWFwIG1hcCA9IChNYXApIGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmdldChlT2JqZWN0KTsKLQkJCQlpZiAobWFwID09IG51bGwpIHsKLQkJCQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAucHV0KGVPYmplY3QsIG9ialRvUmVmc01hcCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbWVyZ2Ugb2JqVG9SZWZzTWFwIHRvIG1hcAotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb2JqVG9SZWZzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJT2JqZWN0IG9iaiA9IGVudHJ5LmdldEtleSgpOwotCQkJCQkJQ29sbGVjdGlvbiByZWZzID0gKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCQlDb2xsZWN0aW9uIGV4aXN0aW5nUmVmcyA9IChDb2xsZWN0aW9uKSBtYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZXhpc3RpbmdSZWZzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByZWZzLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCByZWYgPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKCFleGlzdGluZ1JlZnMuY29udGFpbnMocmVmKSkgewotCQkJCQkJCQkJZXhpc3RpbmdSZWZzLmFkZChyZWYpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQltYXAucHV0KG9iaiwgcmVmcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsZWN0ZWRPYmplY3RzCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoaXMgY29tbWFuZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KENvbGxlY3Rpb24gY29sbGVjdGVkT2JqZWN0cywKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgaXMgbm8gbG9uZ2VyIG5lZWRlZCBzaW5jZSBhZmZlY3RlZAotCQkvLyBzdWJjYXRlZ29yaWVzIGFyZSBhZGRlZAotCQkvLyB0byB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byBiZSBkZWxldGVkCi0JCS8vCi0JCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJLy8gLy8gaGF2ZSB0byBoYW5kbGUgQ3VzdG9tQ2F0ZWdvcnkgc3BlY2lhbGx5IHNpbmNlIGRlbGV0aW5nIGEKLQkJLy8gLy8gQ3VzdG9tQ2F0ZWdvcnkgbWlnaHQgdHJpZ2VyIGRlbGV0aW5nCi0JCS8vIC8vIGl0cyBzdWJjYXRlZ29yaWVzIGV2ZW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgQ3VzdG9tQ2F0ZWdvcnkKLQkJLy8gYW5kCi0JCS8vIC8vIGl0cyBzdWJjYXRlZ29yaWVzIGlzCi0JCS8vIC8vIG5vbi1jb250YWlubWVudCByZWZlcmVuY2UKLQkJLy8gLy8KLQkJLy8gSXRlcmF0b3IgaXRlcjEgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudCwgZmFsc2UpIHsKLQkJLy8KLQkJLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYyODU5Njk5MjMxMzg3ODE0MzdMOwotCQkvLyBwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIENvbGxlY3Rpb24gY2F0RWxlbWVudHMgPSAoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpCi0JCS8vIC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjYXRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJLy8gaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkvLyBjaGlsZHJlbi5hZGQoZSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJLy8gfQotCQkvLwotCQkvLyB9OwotCQkvLyB3aGlsZSAoaXRlcjEuaGFzTmV4dCgpKSB7Ci0JCS8vIGNvbGxlY3RlZE9iamVjdHMuYWRkKGl0ZXIxLm5leHQoKSk7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNtZExpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNtZExpc3RlbmVyIGluc3RhbmNlb2YgSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCSgoSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIpIGNtZExpc3RlbmVyKQotCQkJCQkJCQkuY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoCi0JCQkJCQkJCQkJY29sbGVjdGVkT2JqZWN0cywgZWxlbWVudCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuY2VzKCkgewotCQlpZiAocmVmUmVtb3ZlZCkKLQkJCXJldHVybjsKLQotCQlpZiAocmVtb3ZlZFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVkUmVmZXJlbmNlcy5jbGVhcigpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgcmVmZXJlbmNlZCA9IChNZXRob2RFbGVtZW50KSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChjYW5SZW1vdmVSZWZlcmVuY2VzKHJlZmVyZW5jZWQpKSB7Ci0JCQkJTWFwIHJlbW92ZWRSZWZNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZW1vdmVkUmVmTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnQgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVPYmplY3QgcmVmZXJlbmNlciA9IChFT2JqZWN0KSBlbnQuZ2V0S2V5KCk7Ci0JCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSAoQ29sbGVjdGlvbikgZW50LmdldFZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIxCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgcmVmZXJlbmNlci5lR2V0KGZlYXR1cmUpKTsKLQotCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihyZWZlcmVuY2VkKTsKLQkJCQkJCQkvLyBsaXN0LnJlbW92ZShpbmRleCk7Ci0JCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCWxpc3QucmVtb3ZlKGluZGV4KTsKLQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKG5ldyBSZWZlcmVuY2UocmVmZXJlbmNlciwKLQkJCQkJCQkJCQlmZWF0dXJlLCByZWZlcmVuY2VkLCBpbmRleCkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5yZW1vdmVSZWZlcmVuY2VzKCk6IGluZGV4PSIgKyBpbmRleCArICIsIHNpemU9IiArIGxpc3Quc2l6ZSgpICsgIiwgcmVmZXJlbmNlcj0iICsgcmVmZXJlbmNlciArICIsIHJlZmVyZW5jZWQ9IiArIHJlZmVyZW5jZWQgKyAiLCBmZWF0dXJlPSIgKyBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gd29yay1hcm91bmQ6IHRyeSB0byBmaW5kIHRoZSBwcm94eSBhbmQgcmVtb3ZlCi0JCQkJCQkJCS8vIGl0LgotCQkJCQkJCQkvLyBUT0RPOiBraW5kIG9mIGhhY2ssIG5lZWRzIHJldmlzaXQKLQkJCQkJCQkJLy8KLQkJCQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIHJlZmVyZW5jZWQpCi0JCQkJCQkJCQkJLmdldEd1aWQoKTsKLQkJCQkJCQkJZmluZF9wcm94eTogZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgcmVmID0gKEludGVybmFsRU9iamVjdCkgbGlzdAotCQkJCQkJCQkJCQkuZ2V0KGkpOwotCQkJCQkJCQkJVVJJIHVyaSA9IHJlZi5lUHJveHlVUkkoKTsKLQkJCQkJCQkJCWlmICh1cmkgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBndWlkLmVxdWFscyh1cmkuZnJhZ21lbnQoKSkpIHsKLQkJCQkJCQkJCQlsaXN0LnJlbW92ZShpKTsKLQkJCQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQobmV3IFJlZmVyZW5jZSgKLQkJCQkJCQkJCQkJCXJlZmVyZW5jZXIsIGZlYXR1cmUsCi0JCQkJCQkJCQkJCQlyZWZlcmVuY2VkLCBpKSk7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZF9wcm94eTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmVmZXJlbmNlci5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChuZXcgUmVmZXJlbmNlKHJlZmVyZW5jZXIsCi0JCQkJCQkJCQlmZWF0dXJlLCByZWZlcmVuY2VkLCAtMSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oInJlbW92ZWRSZWZlcmVuY2VzOiBzaXplPSIgKyByZW1vdmVkUmVmZXJlbmNlcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQliYXRjaENvbW1hbmQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkuY2xlYXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVmLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpIHsKLQkJCQliYXRjaENvbW1hbmQKLQkJCQkJCS5hZGRGZWF0dXJlVmFsdWUoCi0JCQkJCQkJCXJlZi5nZXRPd25lcigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRQotCQkJCQkJCQkJCS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJaWYgKHJlZi5nZXRPd25lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJLy8gRmlsbCBibGFuayBwcmVzZW50YXRpb24gbmFtZSBvZiBleHRlbmRlZC9sb2NhbGx5Ci0JCQkJCS8vIGNvbnRyaWJ1dGluZyBhY3Rpdml0eSB3aXRoIHByZXNlbnRhdGlvbiBuYW1lCi0JCQkJCS8vIGZyb20gYmFzZSBhY3Rpdml0eSB3aGVuIGJhc2UgaXMgZGVsZXRlZAotCQkJCQkvLwotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHJlZi5nZXRPd25lcigpOwotCQkJCQlWYXJpYWJpbGl0eVR5cGUgdlR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJCWlmICgodlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMgfHwgdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikKLQkJCQkJCQkmJiBTdHJVdGlsLmlzTnVsbChhY3QuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgcmVmLmdldFZhbHVlKCk7Ci0JCQkJCQliYXRjaENvbW1hbmQKLQkJCQkJCQkJLmFkZEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkJCQlhY3QsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCQkJCQkJUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCWJhdGNoQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCQlyZWZSZW1vdmVkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmVzb2x2ZSBhbGwgdGFyZ2V0IGZlYXR1cmVzIHNvCi0JICogb3Bwb3NpdGUgZmVhdHVyZXMgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgYXJlIGZ1bGx5IGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZXRlZEdVSURzCi0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhMaXN0IG9wcG9zaXRlRmVhdHVyZXMsIFNldCBkZWxldGVkR1VJRHMpIHsKLQkJLy8KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzdG9yZVJlZmVyZW5jZXMoTGlzdCByZW1vdmVkUmVmZXJlbmNlcykgewotCQlmb3IgKGludCBpID0gcmVtb3ZlZFJlZmVyZW5jZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSByZW1vdmVkUmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgcmVmLm93bmVyLmVHZXQocmVmLmZlYXR1cmUpOwotCQkJCWlmIChyZWYuaW5kZXggIT0gLTEpIHsKLQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0cwotCQkJCQkvLwotCQkJCQlpZiAoIWxpc3QuY29udGFpbnMocmVmLnZhbHVlKSkgewotCQkJCQkJaWYgKHJlZi5pbmRleCA8IGxpc3Quc2l6ZSgpKSB7Ci0JCQkJCQkJbGlzdC5hZGQocmVmLmluZGV4LCByZWYudmFsdWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLnJlbW92ZVJlZmVyZW5jZXMoKTogaW5kZXg9IiArIHJlZi5pbmRleCArICIsIHNpemU9IiArIGxpc3Quc2l6ZSgpICsgIiwgcmVmZXJlbmNlcj0iICsgcmVmLm93bmVyICsgIiwgcmVmZXJlbmNlZD0iICsgcmVmLnZhbHVlICsgIiwgZmVhdHVyZT0iICsgcmVmLmZlYXR1cmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCQl9Ci0JCQkJCQkJbGlzdC5hZGQocmVmLnZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLnJlbW92ZVJlZmVyZW5jZXMoKTogcmVmZXJlbmNlIGFscmVhZHkgZXhpc3RzOiByZWZlcmVuY2VyPSIgKyByZWYub3duZXIgKyAiLCByZWZlcmVuY2VkPSIgKyByZWYudmFsdWUgKyAiLCBmZWF0dXJlPSIgKyByZWYuZmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWxpc3QuYWRkKHJlZi52YWx1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZWYub3duZXIuZVNldChyZWYuZmVhdHVyZSwgcmVmLnZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVSZWZlcmVuY2VzKCkgewotCQlpZiAoIXJlZlJlbW92ZWQpCi0JCQlyZXR1cm47Ci0KLQkJYmF0Y2hDb21tYW5kLnVuZG8oKTsKLQkJcmVzdG9yZVJlZmVyZW5jZXMocmVtb3ZlZFJlZmVyZW5jZXMpOwotCi0JCXJlZlJlbW92ZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlub3RpZnlQcmVVbmRvKCk7Ci0JCXRyeSB7Ci0JCQlzdXBlci51bmRvKCk7Ci0JCQlyZXN0b3JlUmVmZXJlbmNlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJbm90aWZ5RmFpbHVyZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAoZXhlY3V0ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29tbWFuZExpc3RlbmVyKENvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIWNvbW1hbmRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kTGlzdGVuZXIoQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNvbW1hbmRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDb21tYW5kTGlzdGVuZXIgewotCQl2b2lkIG5vdGlmeUV4ZWN1dGVkKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KTsKLQotCQl2b2lkIG5vdGlmeUZhaWx1cmUoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJTGlzdCBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCWlmICghbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJbmVzdGVkQ29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGNtZFByb3ZpZGVyID0gKElOZXN0ZWRDb21tYW5kUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQl0cnkgewotCQkJCQkJQ29tbWFuZCBjbWQgPSBjbWRQcm92aWRlci5yZW1vdmVSZWxhdGVkT2JqZWN0cyhlbGVtZW50cywKLQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJbmVzdGVkQ29tbWFuZHMuYWRkKGNtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzMgotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0TmVzdGVkQ29tbWFuZFJlc291cmNlcyhTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCQkJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPERlc2NyaXB0b3I+IGdldERlc2NyaXB0b3JzVG9EZWxldGUoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFeGVjdXRlZCgpIHsKLQkJcmV0dXJuIGV4ZWN1dGVkOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9GdWxseVJldmVydGlibGVDb21tYW5kU3RhY2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9GdWxseVJldmVydGlibGVDb21tYW5kU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzY2ZhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbC5TdHJpbmdSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEEgY29tbWFuZCBzdGFjayB0aGF0IHRyaWVzIGl0cyBiZXN0IHRvIGZ1bGx5IHJldmVydCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBleHRlbmRzIEJhc2ljQ29tbWFuZFN0YWNrIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElFcnJvclJlcG9ydGVyIHsKLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIG1zZyk7Ci0JfQotCi0JcHJpdmF0ZSBJRXJyb3JSZXBvcnRlciBlcnJSZXBvcnRlcjsKLQotCXByaXZhdGUgQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwdWJsaWMgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrKEFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCXRoaXMuYWN0aW9uTWdyID0gYWN0aW9uTWdyOwotCX0KLQotCXB1YmxpYyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2soQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlJRXJyb3JSZXBvcnRlciBlcnJSZXBvcnRlcikgewotCQl0aGlzKGFjdGlvbk1ncik7Ci0JCXRoaXMuZXJyUmVwb3J0ZXIgPSBlcnJSZXBvcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclJlcG9ydGVyKElFcnJvclJlcG9ydGVyIGVyclJlcG9ydGVyKSB7Ci0JCXRoaXMuZXJyUmVwb3J0ZXIgPSBlcnJSZXBvcnRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQXNNb2RpZmllcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IFRuZ1V0aWwuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoY29tbWFuZCk7Ci0JCWlmKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIFN0cmluZ1Jlc291cmNlKSkKLQkJCQkJYWN0aW9uTWdyLnJlZ2lzdGVyQXNNb2RpZmllck9mKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJaWYgKCFjb21tYW5kLmNhblVuZG8oKSkKLQkJCXJldHVybiBmYWxzZTsgLy8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90Ci0JCS8vIGV4ZWN1dGUgY29tbWFuZCB0aGF0IGNhbm5vdCBkZSB1bmRvbmUiKTsKLQkJc3VwZXIuZXhlY3V0ZShjb21tYW5kKTsKLQkJCi0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEFjdGl2aXR5RHJvcENvbW1hbmQKLQkJLy8KLQkJLy8gVE9ETzogYWxsIGNvbW1hbmRzIG11c3QgcmV0dXJuIGEgY29ycmVjdCB2YWx1ZSBpbiBnZXRBZmZlY3RlZE9iamVjdCgpCi0JCS8vIGlmIGdldEFmZmVjdGVkT2JqZWN0KCkgcmV0dXJuIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHRoZSBhY3Rpb24gbWFuYWdlcgotCQkvLyB3aWxsIG5vdCByZWdpc3RlciBpdCBhcyBhIG1vZGlmaWVyIG9mIHRoZSByZXNvdXJjZXMgcmV0dXJuZWQgYnkgZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCQkvLyBhbmQgdGhlIGVkaXRvciBtaWdodCBub3QgYmUgbWFya2VkIGRpcnR5IGFzIHRoZSByZXN1bHQuCi0JCS8vCi0JCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBCU0RyYWdBbmREcm9wQ29tbWFuZCAmJiBjb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJaWYodG9wICE9IC0xKSB7Ci0JCQkJY29tbWFuZExpc3QucmVtb3ZlKHRvcC0tKTsKLQkJCQlpZih0b3AgIT0gLTEpIHsKLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KHRvcCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlib29sZWFuIHJldCA9IGdldE1vc3RSZWNlbnRDb21tYW5kKCkgIT0gbnVsbDsKLQkJaWYgKHJldCAmJiBhY3Rpb25NZ3IgIT0gbnVsbCkgewkJCQotCQkJcmVnaXN0ZXJBc01vZGlmaWVyKGNvbW1hbmQpOwotCQl9Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LkVYRUNVVEVEKSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJZG9FeGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCXN1cGVyLnJlZG8oKTsKLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQodGhpcywKLQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuRVhFQ1VURUQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoY2FuVW5kbygpKSB7Ci0JCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KHRvcC0tKTsKLQkJCXRyeSB7Ci0JCQkJY29tbWFuZC51bmRvKCk7Ci0JCQkJbW9zdFJlY2VudENvbW1hbmQgPSBjb21tYW5kOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5sb2cobmV3IFdyYXBwZWRFeGNlcHRpb24oCi0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9JZ25vcmVFeGNlcHRpb25fZXhjZXB0aW9uIiksIGV4Y2VwdGlvbikuZmlsbEluU3RhY2tUcmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJbW9zdFJlY2VudENvbW1hbmQgPSBudWxsOwotCQkJCXRvcCsrOwotCi0JCQkJaWYgKGVyclJlcG9ydGVyICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0W10gb2JqZWN0ID0gbmV3IE9iamVjdFsxXTsKLQkJCQkJb2JqZWN0WzBdID0gY29tbWFuZDsKLQkJCQkJb2JqZWN0WzFdID0gZXhjZXB0aW9uOwotCQkJCQllcnJSZXBvcnRlci5zaG93RXJyb3IoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5kb0NvbW1hbmRFcnJvcl9tc2csIG9iamVjdCkpOyAKLQkJCQl9Ci0JCQl9Ci0JCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ETykpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdW5kb0FsbCgpIHsKLQkJdHJ5IHsKLQkJCXdoaWxlIChjYW5VbmRvKCkpIHsKLQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KHRvcC0tKTsKLQkJCQl0cnkgewotCQkJCQljb21tYW5kLnVuZG8oKTsKLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSBjb21tYW5kOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5sb2cobmV3IFdyYXBwZWRFeGNlcHRpb24oCi0JCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0lnbm9yZUV4Y2VwdGlvbl9leGNlcHRpb24iKSwgZXhjZXB0aW9uKS5maWxsSW5TdGFja1RyYWNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSBudWxsOwotCQkJCQl0b3ArKzsKLQotCQkJCQlpZiAoZXJyUmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQkJLy8gZXJyUmVwb3J0ZXIuc2hvd0Vycm9yKCJDYW5ub3QgdW5kbyBjb21tYW5kOiAnIiArCi0JCQkJCQkvLyBjb21tYW5kICsgIicsIGV4Y2VwdGlvbjogIiArIGV4Y2VwdGlvbik7Ci0JCQkJCQlPYmplY3RbXSBvYmplY3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJCQkJb2JqZWN0WzBdID0gY29tbWFuZDsKLQkJCQkJCW9iamVjdFsxXSA9IGV4Y2VwdGlvbjsKLQkJCQkJCWVyclJlcG9ydGVyCi0JCQkJCQkJCS5zaG93RXJyb3IoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5kb0NvbW1hbmRFcnJvcl9tc2csIG9iamVjdCkpOyAKLQkJCQkJfQotCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ET19BTEwpKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhFdmVudE9iamVjdCBldmVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkoKENvbW1hbmRTdGFja0xpc3RlbmVyKSBpLm5leHQoKSkuY29tbWFuZFN0YWNrQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoKSB7Ci0JCS8vCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUlzRG9uZSgpIHsKLQkJc3VwZXIuc2F2ZUlzRG9uZSgpOwotCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5TQVZFRCkpOwotCQljb21tYW5kTGlzdC5jbGVhcigpOwotCQl0b3AgPSAtMTsKLQkJc2F2ZUluZGV4ID0gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2sjaXNTYXZlTmVlZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NhdmVOZWVkZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JQWN0aW9uTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjA3ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNsYXNzIGlzIHVzZWQgdG8gc3VwcG9ydCB1bmRvIG9wZXJhdGlvbnMgaW4gdGhlCi0gKiBmb3JtIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbk1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUID0gTm90aWZpY2F0aW9uLlNFVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IE5vdGlmaWNhdGlvbi5BREQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSBOb3RpZmljYXRpb24uUkVNT1ZFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX01BTlkgPSBOb3RpZmljYXRpb24uQUREX01BTlk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfTUFOWSA9IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWTsKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBhY3Rpb24gYXMgZGVzY3JpYmVkIGluIHBhcmFtZXRlcnMKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uVHlwZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBhYm92ZSBkZWZpbmVkIGFjdGlvbiBjb25zdGFudHMKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHBlcmZvcm0gYWN0aW9uIHVwb24KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdG8gYmUgbW9kaWZpZWQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHZhbHVlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBzcGVjaWZ5IC0xIGlmIG5vIGluZGV4Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsbCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gY29tbWFuZAotCSAqIAotCSAqIEBwYXJhbSBjbWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWxsLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gZXhlY3V0ZShJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kKTsKLQotCXZvaWQgdW5kbygpOwotCi0Jdm9pZCByZWRvKCk7Ci0KLQlib29sZWFuIHVuZG9BbGwoKTsKLQotCXZvaWQgc2F2ZUlzRG9uZSgpOwotCi0JYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIEdldHMgcmVzb3VyY2VzIGZpcnN0IG1vZGlmaWVkIGJ5IHRoaXMgYWN0aW9uIG1hbmFnZXIKLQkgKi8KLQlDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0KLQl2b2lkIGRpc3Bvc2UoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDcxMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMTcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIgZXh0ZW5kcyBJQ29tbWFuZExpc3RlbmVyIHsKLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHdob3NlIGNvbnRlbnQgbXVzdCBiZSBkZWxldGVkIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGRlbGV0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbGxlY3RlZE9iamVjdHMKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgZGVsZXRlZC4KLQkgKi8KLQl2b2lkIGNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KENvbGxlY3Rpb24gY29sbGVjdGVkT2JqZWN0cywgTWV0aG9kRWxlbWVudCBlbGVtZW50KTsJCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgaWYgPGNvZGU+ZWxlbWVudFRvRGVsZXRlPC9jb2RlPiB3aWxsIGJlIHJlbW92ZWQgZnJvbSAKLQkgKiA8Y29kZT5yZWZlcmVuY2VzPC9jb2RlPiBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0c1RvUmVtb3ZlIG91dHB1dCAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlciBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0byBlbGVtZW50VG9EZWxldGUKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcyBjb2xsZWN0aW9uIG9mIHtAbGluayBFUmVmZXJlbmNlfSB0aGF0IGNvbnRhaW5zIGVsZW1lbnRUb0RlbGV0ZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBvbmUgb2YgdGhlIGNvbGxlY3RlZCBvYmplY3RzIGlzIHRoZSA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPiBvciBjb250YWluZXIgb2YgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4KLQkgKi8KLQlib29sZWFuIGNvbGxlY3RPYmplY3RzVG9SZW1vdmUoQ29sbGVjdGlvbiBvYmplY3RzVG9SZW1vdmUsIEVPYmplY3QgZWxlbWVudFRvRGVsZXRlLCBFT2JqZWN0IHJlZmVyZW5jZXIsIENvbGxlY3Rpb24gcmVmZXJlbmNlcyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JSW50ZXJhY3RpdmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JSW50ZXJhY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiMWMwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUludGVyYWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW50ZXJhY3RpdmUgewotCXZvaWQgc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihJVXNlckludGVyYWN0aW9uSGFuZGxlciBoYW5kbGVyKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTW9kaWZ5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjQ0OTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kaWZ5Q29tbWFuZCB7Ci0JCi0JQ29sbGVjdGlvbiBnZXRNb2RpZmllZE9iamVjdHMoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU5lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzg5Nzg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIFByb3ZpZGVzIG5lc3RlZCBjb21tYW5kcyB0byBleGVjdXRlIHJpZ2h0IGFmdGVyIHRoZSBleGVjdXRpb24gb2YgdGhlIG1haW4gY29tbWFuZAotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5lc3RlZENvbW1hbmRQcm92aWRlciB7Ci0JQ29tbWFuZCBjcmVhdGVSZWxhdGVkT2JqZWN0cyhDb2xsZWN0aW9uPD8+IGNyZWF0ZWRFbGVtZW50cywgQ29tbWFuZCBjcmVhdGVDb21tYW5kKTsKLQlDb21tYW5kIHJlbW92ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb248Pz4gZGVsZXRlZEVsZW1lbnRzLCBDb21tYW5kIGRlbGV0ZUNvbW1hbmQpOwotCUNvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lSZXNvdXJjZUF3YXJlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lSZXNvdXJjZUF3YXJlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDUwZDYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JUmVzb3VyY2VBd2FyZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmVzb3VyY2UgYXdhcmUgY29tbWFuZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCUNvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOTE5NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGhhbmRsZSB1c2VyIGludGVyYWN0aW9ucyBkdXJpbmcgY29tbWFuZCBleGVjdXRpb24KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHsKLQkvKioKLQkgKiBEZWxpdmVycyBtZXNzYWdlcyB0byB1c2VycwotCSAqIAotCSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI2LCAyMDA2Ci0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElNZXNzZW5nZXIgewotCQkvKioKLQkJICogU2hvd3MgaW5mb3JtYXRpb24gbWVzc2FnZQotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICovCi0JCXZvaWQgc2hvd0luZm8oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQotCQkvKioKLQkJICogU2hvd3Mgd2FybmluZyBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKi8KLQkJdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCi0JCS8qKgotCQkgKiBTaG93cyB3YXJuaW5nIG1lc3NhZ2Ugd2l0aCByZWFzb24KLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqIEBwYXJhbSBzdHJpbmcKLQkJICovCi0JCXZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKTsKLQotCQkvKioKLQkJICogU2hvd3MgZXJyb3IgbWVzc2FnZQotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICovCi0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIGVycm9yIG1lc3NhZ2Ugd2l0aCBzdGF0dXMKLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqIEBwYXJhbSBzdGF0dXMKLQkJICovCi0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpOwotCi0JCS8qKgotCQkgKiBTaG93cyBlcnJvciBtZXNzYWdlIHdpdGggcmVhc29uIGFuZCBleGNlcHRpb24KLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqIEBwYXJhbSByZWFzb24KLQkJICogQHBhcmFtIGV4Y2VwdGlvbgotCQkgKi8KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJCUV4Y2VwdGlvbiBleGNlcHRpb24pOwotCi0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsCi0JCQkJRXhjZXB0aW9uIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQWN0aW9uIGNvbnN0YW50IGZvciB1c2VyIGFjY2VwdGFuY2UKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9PSyA9IDA7Ci0KLQkvKioKLQkgKiBBY3Rpb24gY29uc3RhbnQgZm9yIHVzZXIgY2FuY2VsbGF0aW9uCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0FOQ0VMID0gMTsKLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgcmV0cnkKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9SRVRSWSA9IDI7Ci0KLQkvKioKLQkgKiBBY3Rpb24gY29uc3RhbnQgZm9yIGFib3J0Ci0JICovCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQUJPUlQgPSAzOwotCQotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1lFUyA9IDQ7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fTk8gPSA1OwotCi0JLyoqCi0JICogU2VsZWN0cyBvYmplY3RzIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0IDxjb2RlPm9iamVjdHNUb1NlbGVjdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9iamVjdHNUb1NlbGVjdAotCSAqICAgICAgICAgICAgb2JqZWN0cyBmb3IgdXNlciB0byBzZWxlY3QKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqICAgICAgICAgICAgbGFiZWwgcHJvdmlkZXIgdXNlZCB0byBkaXNwbGF5IHRoZSBnaXZlbiBvYmplY3RzIHRvIHVzZXIKLQkgKiBAcGFyYW0gbXVsdGlwbGUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgYWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uLCBzaW5nbGUKLQkgKiAgICAgICAgICAgIHNlbGVjdGlvbiBpZiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSBvZiB0aGlzIHNlbGVjdGlvbiBhY3Rpb24gdG8gZGlzcGxheSB0byB1c2VyCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSB0byB1c2VyCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBlbGVtZW50cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBzZWxlY3Rpb24gd2FzIGNhbmNlbGVkLgotCSAqLwotCUxpc3Qgc2VsZWN0KExpc3Qgb2JqZWN0c1RvU2VsZWN0LCBJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkJCWJvb2xlYW4gbXVsdGlwbGUsIExpc3QgaW50aXRpYWxTZWxlY3Rpb24sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIG9ubHkgb25lIGFjdGlvbiBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBhY3Rpb25zLiBUaGUgYWN0aW9ucyBtdXN0Ci0JICogYmUgdGhlIGNvbnN0YW50cyB7QGxpbmsgI0FDVElPTl9BQk9SVH0sIHtAbGluayAjQUNUSU9OX0NBTkNFTH0sCi0JICoge0BsaW5rICNBQ1RJT05fT0t9LCB7QGxpbmsgI0FDVElPTl9SRVRSWX0sIEFDVElPTl9YWFgKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9ucwotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybgotCSAqLwotCWludCBzZWxlY3RPbmUoaW50W10gYWN0aW9ucywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cyk7Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB1c2VyIGlucHV0cy4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHVzZXJJbnB1dHMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2Yge0BsaW5rIFVzZXJJbnB1dCB1c2VyIGlucHV0c30gdGhhdCBoYXZlIGluZm9ybWF0aW9uCi0JICogICAgICAgICAgICBhYm91dCBpbnB1dCByZXF1ZXN0cyBhbmQgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dC4gVGhlIGlucHV0Ci0JICogICAgICAgICAgICByZWZlcmVuY2Ugc2hvdWxkIGJlIHNldCB0byB0aGUgb2JqZWN0IHRoYXQgdXNlciBzcGVjaWZpZWQgb3IKLQkgKiAgICAgICAgICAgIHNlbGVjdGVkLgotCSAqIEByZXR1cm4gZmFsc2UgaWYgdXNlciBjYW5jZWxsZWQgdGhpcyByZXF1ZXN0Ci0JICovCi0JYm9vbGVhbiByZXF1ZXN0SW5wdXQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBMaXN0PFVzZXJJbnB1dD4gdXNlcklucHV0cyk7Ci0KLQkvKioKLQkgKiBHZXRzIFVJIGNvbnRleHQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBVSSBjb250ZXh0Ci0JICovCi0JT2JqZWN0IGdldFVJQ29udGV4dCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbWVzc2VuZ2VyCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlNZXNzZW5nZXIgZ2V0TWVzc2VuZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWNhNTIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5VbmlxdWVuZXNzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGFkZCBhIG1ldGhvZCBlbGVtZW50IHRvIGEgY29udGFpbmluZyBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCBleHRlbmRzIENvbW1hbmRXcmFwcGVyIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxFQ2xhc3MsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gdHlwZVRvRXhjbHVkZWRGZWF0dXJlc0Zyb21DaGVjayA9IG5ldyBIYXNoTWFwPEVDbGFzcywgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PigpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBleGNsdWRlRnJvbUNoZWNrKEVDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSB0eXBlVG9FeGNsdWRlZEZlYXR1cmVzRnJvbUNoZWNrLmdldCh0eXBlKTsKLQkJaWYoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJZmVhdHVyZXMgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCX0KLQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhblVuZG8gPSB0cnVlOwotCi0JcHJvdGVjdGVkIEFkZENvbW1hbmQgYWRkQ29tbWFuZDsKLQotCS8vIHByb3RlY3RlZCBNYXAgZWxlbWVudFRvTmV3TmFtZU1hcDsKLQlwcm90ZWN0ZWQgTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcDsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZVhSZWZSZXF1aXJlZDsKLQotCXByb3RlY3RlZCBNZXRob2RQbHVnaW4gb3duZXJQbHVnaW47Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGFkZExpc3Q7Ci0KLQlwcm90ZWN0ZWQgTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzVG9DaGVjazsKLQotCXByaXZhdGUgQXJyYXlMaXN0IG5lc3RlZENvbW1hbmRzOwotCi0JcHJpdmF0ZSBIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzKGNvbW1hbmQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCQlhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQlzZXRSdW5XaXRoUHJvZ3Jlc3MocnVuV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSdW5XaXRoUHJvZ3Jlc3MoYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJdGhpcy5ydW5XaXRoUHJvZ3Jlc3MgPSBydW5XaXRoUHJvZ3Jlc3M7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGNhblVuZG87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUVycm9yKElTdGF0dXMgZXJyb3JTdGF0dXMpIHsKLQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihnZXRMYWJlbCgpLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5jcmVhdGVFbGVtZW50RXJyb3JfbXNnLCBlcnJvclN0YXR1cyk7Ci0JCXN0YXR1cy5hZGQoZXJyb3JTdGF0dXMpOwotCQlzdGF0dXMuYWRkQWxsKGVycm9yU3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkKLQkJLy8gZGlzcG9zZSB0aGUgbmVzdGVkIGNvbW1hbmRzCi0JCWlmIChuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJT2JqZWN0IHNoZWxsID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJLy8gQ2hlY2sgd2hldGhlciB0aGUgb3duZXIgcmVzb3VyY2UgY2FuIGJlIG1vZGlmaWVkLgotCQkvLwotCQlDb2xsZWN0aW9uIHJlc291cmNlc1RvQ2hhbmdlID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJSVN0YXR1cyBleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCXJlc291cmNlc1RvQ2hhbmdlLCBzaGVsbCk7Ci0JCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCWhhbmRsZUVycm9yKGV4ZWNTdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKAotCQkJCWFkZENvbW1hbmQsIHNoZWxsKTsKLQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJaGFuZGxlRXJyb3IoZXhlY1N0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCQkJCSYmICFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tPdXRPZlN5bmNoKHJlc291cmNlc1RvQ2hhbmdlKSkgewotCQkJc3RhdHVzLmFkZChTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZighY2hlY2tGb2xkZXIoc2hlbGwpKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCWRvQWRkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5kb05lc3RlZENvbW1hbmRzKCkgewotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZC5jYW5VbmRvKCkpIHsKLQkJCQkJCWNtZC51bmRvKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9sZGVyKE9iamVjdCBzaGVsbCkgewotCQkvLyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIHRvIGJlIGFkZGVkIHdpbGwgYmUgc2F2ZWQgaW4gaXRzIG93biBmaWxlCi0JCS8vIGNoZWNrIGlmIHRoZSBmb2xkZXIgdG8gc2F2ZSB0aGUgZmlsZSB0byBjYW4gYmUgbW9kaWZpZWQKLQkJLy8KLQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSBTZXJ2aWNlcy5nZXRMaWJyYXJ5UGVyc2lzdGVyKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKTsKLQkJQXJyYXlMaXN0IGZvbGRlcnNUb0NoZWNrID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIHBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZShlbGVtZW50KSkgewotCQkJCVN0cmluZyBmb2xkZXIgPSBwZXJzaXN0ZXIuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKAotCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGFkZENvbW1hbmQKLQkJCQkJCS5nZXRPd25lcigpKTsKLQkJCQlTdHJpbmcgYmFzZUZvbGRlciA9IG51bGw7Ci0JCQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGFkZENvbW1hbmQKLQkJCQkJCQkuZ2V0T3duZXIoKSk7Ci0JCQkJCWJhc2VGb2xkZXIgPSBuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJhc2VGb2xkZXIgPSBuZXcgRmlsZShwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQlmb2xkZXJzVG9DaGVjay5hZGQoYmFzZUZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgZm9sZGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoIWZvbGRlcnNUb0NoZWNrLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nW10gZm9sZGVycyA9IG5ldyBTdHJpbmdbZm9sZGVyc1RvQ2hlY2suc2l6ZSgpXTsKLQkJCWZvbGRlcnNUb0NoZWNrLnRvQXJyYXkoZm9sZGVycyk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCkKLQkJCQkJLmNoZWNrTW9kaWZ5KGZvbGRlcnMsIHNoZWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCWhhbmRsZUVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNNb3ZlKCkgewotCQlDb21tYW5kIGNtZCA9IFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQlpZiAoY21kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChBZGRDb21tYW5kKSBjbWQpLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvd25lclBsdWdpbgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBMaXN0IG9mIFJlZmVyZW5jZSBvYmplY3RzIHRoYXQga2VlcHMgdGhlIGluZm8gb2YgaWxsZWdhbCBvdXRnb2luZwotCSAqICAgICAgICAgcmVmZXJlbmNlcwotCSAqIEBzZWUgUmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlZmVyZW5jZT4gZ2V0SWxsZWdhbE91dGdvaW5nUmVmZXJlbmNlcygKLQkJCU1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwgRU9iamVjdCBlLCBDb2xsZWN0aW9uPFJlZmVyZW5jZT4gaWxsZWdhbFJlZmVyZW5jZXMpIHsKLQkJaWYgKGlsbGVnYWxSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWlsbGVnYWxSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2U+KCk7Ci0JCX0KLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3I8RU9iamVjdD4gZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcjxFT2JqZWN0PikgZQotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJaWYgKCFmZWF0dXJlLmlzRGVyaXZlZCgpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVPYmplY3QpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW4gIT0gb3duZXJQbHVnaW4KLQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKHBsdWdpbiwgb3duZXJQbHVnaW4pKSB7Ci0JCQkJCS8vIGlsbGVnYWwgcmVmZXJlbmNlIHRvIGJlIHJlbW92ZWQKLQkJCQkJLy8KLQkJCQkJaWxsZWdhbFJlZmVyZW5jZXMKLQkJCQkJCQkuYWRkKG5ldyBSZWZlcmVuY2UoZSwgZmVhdHVyZSwgZU9iamVjdCwgLTEpKTsKLQkJCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VzCi0JCQkJCQkJLmFkZChuZXcgUmVmZXJlbmNlKGUsIGZlYXR1cmUsIGUuZUdldChmZWF0dXJlKSwgLTEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaWxsZWdhbFJlZmVyZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVSZWZlcmVuY2VzKENvbGxlY3Rpb248UmVmZXJlbmNlPiByZWZlcmVuY2VzKSB7Ci0JCWZvciAoUmVmZXJlbmNlIHJlZjogcmVmZXJlbmNlcykgewotCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdDw/PiBsaXN0ID0gKChMaXN0PD8+KSByZWYub3duZXIuZUdldChyZWYuZmVhdHVyZSkpOwotCQkJCWxpc3QucmVtb3ZlKHJlZi52YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBMaXN0IG9mIFJlZmVyZW5jZSBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlZmVyZW5jZT4gcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMoTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLAotCQkJRU9iamVjdCBlKSB7Ci0JCUNvbGxlY3Rpb248UmVmZXJlbmNlPiByZW1vdmVSZWZzID0gZ2V0SWxsZWdhbE91dGdvaW5nUmVmZXJlbmNlcyhvd25lclBsdWdpbiwgZSwKLQkJCQludWxsKTsKLQotCQkvLyByZW1vdmUgaWxsZWdhbCByZWZlcmVuY2VzCi0JCS8vCi0JCXJlbW92ZVJlZmVyZW5jZXMocmVtb3ZlUmVmcyk7Ci0KLQkJcmV0dXJuIHJlbW92ZVJlZnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNOZXh0KEl0ZXJhdG9yIGl0ZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpdGVyLmhhc05leHQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSWxsZWdhbFJlZmVyZW5jZShNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlFT2JqZWN0IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZQotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaGFzTmV4dChmZWF0dXJlSXRlcmF0b3IpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSB4LXJlZiBvYmplY3QgaXMgaW4gdGhlIG1vdmUgbGlzdAotCQkJLy8KLQkJCWlmICghbW92ZUxpc3QuY29udGFpbnMoZU9iamVjdCkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iamVjdCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbiAhPSBvd25lclBsdWdpbgotCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YocGx1Z2luLCBvd25lclBsdWdpbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaXMgcmVmZXJlbmNlZCBpbGxlZ2FsbHkgYWZ0ZXIgdGhlIG1vdmUuCi0JICogCi0JICogQHBhcmFtIG93bmVyUGx1Z2luCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gbW92ZUxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmZXJlbmNlZElsbGVnYWxseShNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlcyhlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoIW1vdmVMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW4gIT0gb3duZXJQbHVnaW4KLQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKG93bmVyUGx1Z2luLCBwbHVnaW4pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LCBudWxsKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQl0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbihUbmdVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXNUbygKLQkJCU1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwgTWV0aG9kRWxlbWVudCBlLCBDb2xsZWN0aW9uIG1vdmVMaXN0KSB7Ci0JCUFycmF5TGlzdCBhZmZlY3RlZFJlZmVyZW5jZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZWZlcmVuY2VzKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFtb3ZlTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luICE9IG93bmVyUGx1Z2luCi0JCQkJCQkmJiAhTWlzYy5pc0Jhc2VPZihvd25lclBsdWdpbiwgcGx1Z2luKSkgewotCQkJCQljaGVja01vZGlmeShlbGVtZW50KTsKLQkJCQkJcmVtb3ZlUmVmZXJlbmNlcyhlbGVtZW50LCBlKTsKLQkJCQkJYWZmZWN0ZWRSZWZlcmVuY2Vycy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZmZlY3RlZFJlZmVyZW5jZXJzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGNyb3NzIHJlZmVyZW5jZXMgb2YgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4gdG8KLQkgKiA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSByZWZlcmVuY2VyCi0JICogQHBhcmFtIHJlZmVyZW5jZWQKLQkgKiBAcGFyYW0geFJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBjb2xsZWN0aW9uIG9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzCi0JICogQHJldHVybiBjb2xsZWN0aW9uIG9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRYUmVmZXJlbmNlcyhFT2JqZWN0IHJlZmVyZW5jZXIsCi0JCQlFT2JqZWN0IHJlZmVyZW5jZWQsIENvbGxlY3Rpb24geFJlZmVyZW5jZXMpIHsKLQkJaWYgKHhSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIHJlZmVyZW5jZXIKLQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCS8vIGlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCS8vIGlmKCgoTGlzdClyZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSkpLmNvbnRhaW5zKHJlZmVyZW5jZWQpKSB7Ci0JCQkvLyB4UmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlCi0JCQlpZiAoZU9iamVjdCA9PSByZWZlcmVuY2VkKSB7Ci0JCQkJeFJlZmVyZW5jZXMuYWRkKGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB4UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gPGNvZGU+cmVmZXJlbmNlZDwvY29kZT4gZnJvbQotCSAqIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZXIKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZAotCSAqIEByZXR1cm4gQ29sbGVjdGlvbiBvZiByZWZlcmVuY2VzIHRvIHRoZSA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiByZW1vdmVSZWZlcmVuY2VzKEVPYmplY3QgcmVmZXJlbmNlciwKLQkJCUVPYmplY3QgcmVmZXJlbmNlZCkgewotCQlDb2xsZWN0aW9uIHJlbW92ZVJlZnMgPSBnZXRYUmVmZXJlbmNlcyhyZWZlcmVuY2VyLCByZWZlcmVuY2VkLCBudWxsKTsKLQotCQkvLyByZW1vdmUgaWxsZWdhbCByZWZlcmVuY2VzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZVJlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHJlZmVyZW5jZXIuZUdldChmKSkucmVtb3ZlKHJlZmVyZW5jZWQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZWZlcmVuY2VyLmVTZXQoZiwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVtb3ZlUmVmczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSWxsZWdhbFJlZmVyZW5jZUluY2x1ZGluZ0FsbENoaWxkcmVuKAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJaWYgKG93bmVyUGx1Z2luID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpKSB7Ci0JCQkvLyBtb3ZlIHdpdGhpbiB0aGUgc2FtZSBwbHVnaW4sIG5vIGZ1cnRoZXIgY2hlY2sKLQkJCS8vCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2Uob3duZXJQbHVnaW4sIGUsIG1vdmVMaXN0KSkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2Uob3duZXJQbHVnaW4sIChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCksCi0JCQkJCW1vdmVMaXN0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNUb0NoZWNrKCkgewotCQlpZiAoZmVhdHVyZXNUb0NoZWNrID09IG51bGwpIHsKLQkJCWZlYXR1cmVzVG9DaGVjayA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCQkJZmVhdHVyZXNUb0NoZWNrLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQotCQl9Ci0JCXJldHVybiBmZWF0dXJlc1RvQ2hlY2s7Ci0JfQotCi0JcHJvdGVjdGVkIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0JCWlmKGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZSl7Ci0JCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVWYWxpZGF0b3IoYWRkQ29tbWFuZC5nZXRPd25lcigpLCAoRVJlZmVyZW5jZSkgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCksIChFQ2xhc3MpbnVsbCwgZSwgZmVhdHVyZSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIG9iamVjdHNUb0NoZWNrTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBnZXRPZmZTdHJpbmdUb0NoZWNrTmFtZShPYmplY3QgZSwgQ29sbGVjdGlvbiBvYmplY3RzVG9DaGVja05hbWUpIHsKLQkJLy8gaWYoYWRkQ29tbWFuZC5nZXRPd25lcigpIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgJiYKLQkJLy8gYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgPT0KLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkJLy8gJiYgZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29udGVudFBhY2thZ2UpZSkuZUFsbENvbnRlbnRzKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJLy8gb2JqZWN0c1RvQ2hlY2tOYW1lLmFkZChlbGVtZW50KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gZWxzZQotCQlpZiAoYWRkQ29tbWFuZC5nZXRPd25lcigpIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkmJiBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpCi0JCQkJJiYgZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJJiYgIShlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCWdldFByb2Nlc3NDb21wb25lbnRzKChQcm9jZXNzUGFja2FnZSkgZSwgb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIG9iamVjdHNUb0NoZWNrTmFtZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0UHJvY2Vzc0NvbXBvbmVudHMoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzVG9DaGVja05hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZFBrZyA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW9iamVjdHNUb0NoZWNrTmFtZS5hZGQoY2hpbGRQa2cpOwotCQkJfSBlbHNlIGlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudHMoKFByb2Nlc3NQYWNrYWdlKSBjaGlsZFBrZywKLQkJCQkJCW9iamVjdHNUb0NoZWNrTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tTdHJpbmdWYWx1ZShOYW1lZEVsZW1lbnQgZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIG9iamVjdHNUb0FkZCkgewotCQlDb2xsZWN0aW9uIGV4Y2x1ZGVkRmVhdHVyZXNUb0NoZWNrID0gdHlwZVRvRXhjbHVkZWRGZWF0dXJlc0Zyb21DaGVjay5nZXQoZS5lQ2xhc3MoKSk7IAotCQlpZihleGNsdWRlZEZlYXR1cmVzVG9DaGVjayAhPSBudWxsICYmIGV4Y2x1ZGVkRmVhdHVyZXNUb0NoZWNrLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBjcmVhdGVWYWxpZGF0b3IoZSwgZmVhdHVyZSk7Ci0JCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5ld05hbWUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQluZXdOYW1lID0gY2hlY2tTdHJpbmdWYWx1ZShlLCBmZWF0dXJlLCB2YWxpZGF0b3IsIG9iamVjdHNUb0FkZCk7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQluZXdOYW1lID0gbmV3TmFtZS50cmltKCk7Ci0JCQkJZS5lU2V0KGZlYXR1cmUsIG5ld05hbWUpOwotCQkJCWZlYXR1cmVDaGFuZ2VkKGUsIGZlYXR1cmUsIG5ld05hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrU3RyaW5nVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJQXJyYXlMaXN0IG9iamVjdHNUb0NoZWNrTmFtZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBvYmplY3RzVG9BZGQgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKTsKLQotCQkvLyBmZWF0dXJlIHZhbHVlIGNoZWNrCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHNUb0FkZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWNoZWNrU3RyaW5nVmFsdWUoZSwgZmVhdHVyZSwgb2JqZWN0c1RvQWRkKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJZ2V0T2ZmU3RyaW5nVG9DaGVja05hbWUoZSwgb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHNUb0NoZWNrTmFtZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0JCQlpZiAoIWNoZWNrU3RyaW5nVmFsdWUoZSwgZiwgb2JqZWN0c1RvQ2hlY2tOYW1lKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBkZWFsIHdpdGggZWxlbWVudCBjaGFuZ2UgZHVyaW5nIGFkZAotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmVhdHVyZUNoYW5nZWQoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IG5ld1ZhbHVlKSB7Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9DaGVja05hbWUoQWRkQ29tbWFuZCBhZGRDb21tYW5kKSB7Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJLy8gbmVlZCB0byBnZXQgYWxsIHByb2Nlc3MgY29tcG9uZW50cyBpbiB0aGlzIHBhY2thZ2UgdG8gY2hlY2sKLQkJCQkvLyBuYW1lCi0JCQkJLy8KLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlbGVtZW50LCBmYWxzZSkgewotCi0JCQkJCS8qKgotCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCQlyZXR1cm4gKChQcm9jZXNzUGFja2FnZSkgb2JqZWN0KS5nZXRDaGlsZFBhY2thZ2VzKCkKLQkJCQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IHBrZyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZChwa2cpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIG5hbWUgb2YgYWxsIGVsZW1lbnRzIHRvIGJlIGFkZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhZGRDb21tYW5kCi0JICogQHJldHVybiBhIGVsZW1lbnQgdG8gbmV3IGZlYXR1cmUgbmFtZSBtYXAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdXNlcgotCSAqICAgICAgICAgY2FuY2VsZWQgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBjaGVja05hbWUoQWRkQ29tbWFuZCBhZGRDb21tYW5kKSB7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHNUb0NoZWNrID0gZ2V0RWxlbWVudHNUb0NoZWNrTmFtZShhZGRDb21tYW5kKTsKLQkJSGFzaE1hcCBlbGVtZW50VG9OZXdOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBmZWF0dXJlIHZhbHVlIGNoZWNrCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9DaGVjay5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGFkZENvbW1hbmQKLQkJCQkJCS5nZXRPd25lcigpLCBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSwKLQkJCQkJCShDb250ZW50RWxlbWVudCkgZSwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihlKSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoCi0JCQkJCQlhZGRDb21tYW5kLmdldE93bmVyKCksIGUpOwotCQkJfQotCi0JCQlTdHJpbmcgbmV3TmFtZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld05hbWUgPSBjaGVja1N0cmluZ1ZhbHVlKGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdmFsaWRhdG9yLCBlbGVtZW50c1RvQ2hlY2spOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkvLyBuZXcgbmFtZSByZXF1aXJlZCwgY2hlY2sgaWYgdGhlIGVsZW1lbnQgY2FuIGJlIG1vZGlmaWVkCi0JCQkJLy8KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSwgZS5nZXROYW1lKCksCi0JCQkJCQkJCW5ld05hbWUgfSk7Ci0JCQkJd2hpbGUgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10gewotCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fT0ssCi0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwgfSwgdGl0bGUsCi0JCQkJCQkJCW1zZywgbnVsbCkgPT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCkgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gY2FuY2VsIHRoZSBvcGVyYXRpb24gaWYgdGhlcmUgaXMgbm8gdXNlciBpbnRlcmFjdGlvbiBoYW5kbGVyCi0JCQkJCQkvLwotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxlbWVudFRvTmV3TmFtZU1hcC5wdXQoZSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFRvTmV3TmFtZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZmVhdHVyZSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogQHBhcmFtIG9iamVjdHNUb0FkZAotCSAqIEByZXR1cm4gbmV3IGZlYXR1cmUgdmFsdWUgdGhhdCB1c2VyIGhhcyBjaG9vc2VuIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGUgZmVhdHVyZSB2YWx1ZSBpcyB2YWxpZAotCSAqIEB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1N0cmluZ1ZhbHVlKE5hbWVkRWxlbWVudCBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIElWYWxpZGF0b3IgdmFsaWRhdG9yLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzVG9BZGQpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE86IFRoZSB2YWxpZGF0b3IgaXMgZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHRoYXQgaXMgdG9vIGxvbmcgZm9yCi0JCS8vIHRoZSBkaWFsb2cuCi0JCS8vIGZlYXR1cmUgdmFsdWUgY2hlY2sKLQkJZmluYWwgU3RyaW5nVmFsaWRhdG9yIHN0clZhbGlkYXRvciA9IGdldFN0cmluZ1ZhbGlkYXRvcigpOwotCQlzdHJWYWxpZGF0b3Iuc2V0RWxlbWVudHMob2JqZWN0c1RvQWRkKTsKLQkJc3RyVmFsaWRhdG9yLnNldEZlYXR1cmUoZmVhdHVyZSk7Ci0JCXN0clZhbGlkYXRvci5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKLQotCQlTdHJpbmcgc3RyID0gKFN0cmluZykgZS5lR2V0KGZlYXR1cmUpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIG1zZyA9IHN0clZhbGlkYXRvci5pc1ZhbGlkKHN0cik7Ci0JCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQkJU3RyVXRpbC50b0xvd2VyKGZlYXR1cmVUeHQpLCBlLmdldE5hbWUoKSk7Ci0JCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIGUuZUdldChmZWF0dXJlKTsKLQotCQkJCUlWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IoKSB7Ci0KLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQlpZiAoc3RyVmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkuZ2V0U2ltcGxlRXJyb3JNZXNzYWdlKHN0clZhbGlkYXRvcgotCQkJCQkJCQkJCQkuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJaWYodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJVXNlcklucHV0IGlucHV0ID0gbmV3IFVzZXJJbnB1dCgiIiwgVXNlcklucHV0LlRFWFQsIGZhbHNlLCBudWxsLCBudWxsLCBpbnB1dFZhbGlkYXRvciwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5wdXQuc2V0SW5wdXQoY3VycmVudFZhbHVlKTsKLQkJCQkJTGlzdDxVc2VySW5wdXQ+IHVzZXJJbnB1dHMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGlucHV0KTsKLQkJCQkJaWYodWlIYW5kbGVyLnJlcXVlc3RJbnB1dCh0aXRsZSwgZGxnTXNnLCB1c2VySW5wdXRzKSkgewotCQkJCQkJcmV0dXJuIChTdHJpbmcpIHVzZXJJbnB1dHMuZ2V0KDApLmdldElucHV0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQlpZiAoYWZmZWN0ZWRPYmplY3RzID09IG51bGwpIHsKLQkJCUVPYmplY3Qgb3duZXIgPSBhZGRDb21tYW5kLmdldE93bmVyKCk7Ci0JCQlhZmZlY3RlZE9iamVjdHMgPSBvd25lciA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUCi0JCQkJCTogQ29sbGVjdGlvbnMuc2luZ2xldG9uKG93bmVyKTsKLQkJfQotCQlyZXR1cm4gYWZmZWN0ZWRPYmplY3RzOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9DaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2soT2JqZWN0IGUpIHsKLQkJLy8gZG9uJ3QgY2hlY2sgb24gUHJvY2Vzc1BhY2thZ2UsIFByb2Nlc3NFbGVtZW50IGZvciBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJLy8gYi9jIHByb2Nlc3MgdmFsaWRhdGlvbiBpcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uLCBub3QgcGx1Z2luCi0JCS8vIHZpc2liaWxpdHkKLQkJLy8KLQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSB8fCBlIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gZ2V0RWxlbWVudHNUb0NoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKTsKLQkJYWRkTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCS8vIFN0cmluZyBuZXdOYW1lID0gKFN0cmluZykgZWxlbWVudFRvTmV3TmFtZU1hcC5nZXQoZWxlbWVudCk7Ci0JCQkvLyBpZihuZXdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCS8vIH0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWRkTGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBpbGxlZ2FsIHJlZmVyZW5jZSBpbiB0aGUgbW92ZWQgb2JqZWN0cwotCQkvLwkJCi0JCW93bmVyUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYWRkQ29tbWFuZC5nZXRPd25lcigpKTsKLQkJcmVtb3ZlWFJlZlJlcXVpcmVkID0gZmFsc2U7Ci0JCWlmIChvd25lclBsdWdpbiAhPSBudWxsKSB7Ci0JCQlmaW5kX3hQbHVnaW5SZWY6IGZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQotCQkJCWlmIChpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2soZWxlbWVudCkpIHsKLQkJCQkJY29udGludWUgZmluZF94UGx1Z2luUmVmOwotCQkJCX0KLQkKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2VJbmNsdWRpbmdBbGxDaGlsZHJlbihvd25lclBsdWdpbiwKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgYWRkTGlzdCkpIHsKLQkJCQkJCXJlbW92ZVhSZWZSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb247IAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCWlmIChhZGRGZWF0dXJlSXNDb250YWlubWVudCgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQkJYm9vbGVhbiBzYXZlT3duZXJSZXNvdXJjZSA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSkpIHsKLQkJCQkJc2F2ZU93bmVyUmVzb3VyY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzYXZlT3duZXJSZXNvdXJjZSkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFkZENvbW1hbmQuZ2V0T3duZXIoKS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCQkJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQlyZXR1cm4gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2RpZmllZFJlc291cmNlcygpIHsKLQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldFBlcnNpc3RlcigpOwotCQl0cnkgewotCi0JCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRNb2RpZmllZFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQljYW5VbmRvID0gZmFsc2U7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZUZpbGVFcnJvcl9yZWFzb24sIAotCQkJCQkJCXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UKLQkJCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCkpOwotCQkJCQlzdGF0dXMuYWRkKG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFmZmVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMuYWRkKFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKSk7Ci0JCQkJfQotCi0JCQkJQ29sbGVjdGlvbiBtb2RpZmllZCA9IHJlc01nci5jb3B5UmVmZXJlbmNlZENvbnRlbnRzKAotCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cywgZWxlbWVudFRvT2xkUGx1Z2luTWFwKTsKLQkJCQltb2RpZmllZAotCQkJCQkJLmFkZEFsbChyZXBsYWNlVGV4dFJlZmVyZW5jZXMoZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cykpOwotCQkJCWlmIChtb2RpZmllZCAhPSBudWxsICYmICFtb2RpZmllZC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZUZpbGVFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQlyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJSVN0YXR1cyBuZXdTdGF0dXMgPSBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQlzdGF0dXMuYWRkKG5ld1N0YXR1cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5ST0xMQkFDS19FUlJPUiwgbXNnLnRvU3RyaW5nKCksIGUpOwotCQkJCQlzdGF0dXMuYWRkKG5ld1N0YXR1cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGV4dHVhbCBkZXNjcmlwdGlvbnMgaW4gdGhlIGNvcGllZCBlbGVtZW50cyBjb250YWluIHJlZmVyZW5jZXMgKFVSTHMpCi0JICogdG8gb3RoZXIgZWxlbWVudHMgd2l0aGluIHRoZSBzYW1lIGNvcGllZCBwcm9jZXNzIHRoZW4gcmVwbGFjZSB0aGVzZQotCSAqIHJlZmVyZW5jZXMgd2l0aCByZWZlcmVuY2VzIHRoYXQgcG9pbnQgdG8gdGhlIG5ldyBlbGVtZW50cyBpbiB0aGUgY29waWVkCi0JICogc3RydWN0dXJlcy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVwbGFjZVRleHRSZWZlcmVuY2VzKAotCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHR4dFJlZlJlcGxhY2VyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXRUZXh0UmVmZXJlbmNlUmVwbGFjZXIoKTsKLQkJaWYgKHR4dFJlZlJlcGxhY2VyID09IG51bGwpCi0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkJLy8gZ2V0IG1hcAotCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQkJLy8gdGhlIFRleHRSZWZlcmVuY2VSZXBsYWNlciBleHBlY3RzIGEgbWFwIG9mIG9sZC10by1uZXcuIHdlCi0JCQkvLyBoYXZlIGEgbWFwIG9mIG5ldy10by1vbGQsIHNvIGNvbnZlcnQgaXQKLQkJCU1hcCBvbGRUb05ld09iamVjdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJT2JqZWN0IHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIHZhbCAhPSBudWxsKQotCQkJCQlvbGRUb05ld09iamVjdE1hcC5wdXQodmFsLCBrZXkpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgY2hpbGRJdGVyID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgY2hpbGRJdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGNoaWxkSXRlci5uZXh0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgYXR0cmlidXRlcyA9IGNoaWxkLmVDbGFzcygpCi0JCQkJCQkJLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgYXR0cmlidXRlcwotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkKLQkJCQkJCQkJJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKQotCQkJCQkJCQkmJiAoYXR0cmlidXRlLmlzTWFueSgpIHx8IGNoaWxkCi0JCQkJCQkJCQkJLmVJc1NldChhdHRyaWJ1dGUpKQotCQkJCQkJCQkmJiBhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKQotCQkJCQkJCQkJCS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gTGl0ZXJhbHMuU1RSSU5HCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlQ2xhc3MoKSkgewotCQkJCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgY2hpbGQuZUdldChhdHRyaWJ1dGUpOwotCQkJCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIG5ld3RleHQgPSB0eHRSZWZSZXBsYWNlci5yZXBsYWNlKHRleHQsCi0JCQkJCQkJCQkJY2hpbGQsIG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJCQkJCQkJaWYgKCFuZXd0ZXh0LmVxdWFscyh0ZXh0KSkgewotCQkJCQkJCQkJY2hpbGQuZVNldChhdHRyaWJ1dGUsIG5ld3RleHQpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNoaWxkLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9BZGQoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBjaGVjayBmZWF0dXJlIHZhbHVlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEZlYXR1cmVzVG9DaGVjaygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghY2hlY2tTdHJpbmdWYWx1ZShmZWF0dXJlKSkgewotCQkJCQkvLyB1c2VyIGNhbmNlbGVkIHRoZSBvcGVyYWlvbgotCQkJCQkvLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlib29sZWFuIHNob3dXYXJuaW5nID0gZmFsc2U7Ci0JCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCU1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCi0JCQkJLy8gY2hlY2sgZmlyc3QgZWxlbWVudCBvZiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCS8vIGlmIGl0J3MgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB3ZSBhcmUgcGFzdGluZyBhbmQKLQkJCQkvLyBtYXkgbmVlZCB0byB3YXJuIHRoZSB1c2VyCi0JCQkJLy8gaWYgaXQncyBub3QgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB0aGVuIHdlIGFyZQotCQkJCS8vIHByb2JhYmx5IGFkZGluZyBhIG5ldyBlbGVtZW50Ci0JCQkJaWYgKGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpICE9IG51bGwKLQkJCQkJCSYmIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnNpemUoKSA+IDAKLQkJCQkJCSYmIGNvcHlUb09yaWdpbmFsTWFwLmNvbnRhaW5zS2V5KGFkZENvbW1hbmQKLQkJCQkJCQkJLmdldENvbGxlY3Rpb24oKS50b0FycmF5KClbMF0pKSB7Ci0JCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkmJiAhKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBlbnRyeQotCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoZW50cnkuZ2V0S2V5KCksCi0JCQkJCQkJCQkJcGx1Z2luKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBwbHVnaW4gPT0gbnVsbCwgb3JpZ2luYWwgZWxlbWVudCB3YXMgcHJvYmFibHkKLQkJCQkJCQkJLy8gZGVsZXRlZAotCQkJCQkJCQlzaG93V2FybmluZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2hvd1dhcm5pbmcpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkuc2hvd1dhcm5pbmcoCi0JCQkJCQkJCWdldExhYmVsKCksCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZyk7Ci0JCQl9Ci0KLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBtc2dCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJbXNnQnVmZi5hcHBlbmQobXNnKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQotCQkJSVByb2dyZXNzTW9uaXRvciBkZWZhdWx0TW9uaXRvciA9IG51bGw7Ci0JCQlpZiAoIXJ1bldpdGhQcm9ncmVzcykgewotCQkJCWRlZmF1bHRNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCX0KLQotCQkJaWYgKHJ1bldpdGhQcm9ncmVzcykgewotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgCi0JCQl9IGVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCW9wZXJhdGlvbi5ydW4oZGVmYXVsdE1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtc2dCdWZmLmxlbmd0aCgpID4gMCkgewotCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQlpZih1aUhhbmRsZXIgICE9IG51bGwpIHsKLQkJCQkJaW50IHJldCA9IHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHtJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLCBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8gfSwgCi0JCQkJCQkJZ2V0TGFiZWwoKSwgbXNnQnVmZi50b1N0cmluZygpLCBudWxsKTsKLQkJCQkJaWYocmV0ID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzLAotCQkJCQludWxsKTsgCi0JCQlvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkKSB7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQlyZW1vdmVJbGxlZ2FsUmVmZXJlbmNlcyhvd25lclBsdWdpbiwgZWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gYWRkIHRoZSBlbGVtZW50cwotCQkJCQkvLwotCQkJCQlzdXBlckV4ZWN1dGUoKTsKLQotCQkJCQlleGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQotCQkJCQlpZiAod2lsbFNhdmVNb2RpZmllZFJlc291cmNlcygpKSB7Ci0JCQkJCQlJU3RhdHVzIHJlc3VsdCA9IHNhdmVOZXdFbGVtZW50c1dpdGhPd25SZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc3VsdC5pc09LKCkpIHsKLQkJCQkJCQltb25pdG9yCi0JCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lKTsgCi0JCQkJCQkJc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXN0YXR1cy5hZGQocmVzdWx0KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJLy8gRklYTUU6IHRoaXMgY2F1c2VzIGRlYWQtbG9jayBhdAotCQkJCQkJLy8gTGlicmFyeVByb2Nlc3Nvci5ub3RpZnlMaXN0ZW5lcnMoKS4gVGhlIG1ldGhvZAotCQkJCQkJLy8gaXMgc3luY2hyb25pemVkLCB0aGlzIG1pZ2h0IGJlIHRoZSBjYXVzZSBvZiB0aGUKLQkJCQkJCS8vIGRlYWQtbG9jawotCQkJCQkJLy8KLQkJCQkJCXVuZG8oKTsKLQkJCQkJCQotCQkJCQkJaWYoQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzUm9sbGJhY2tFcnJvcihzdGF0dXMpKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbjw/PiBjcmVhdGVkRWxlbWVudHMgPSBjb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCQkJCQkJZm9yIChPYmplY3Qgb2JqZWN0IDogY3JlYXRlZEVsZW1lbnRzKSB7Ci0JCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJcGVyc2lzdGVyLmRlbGV0ZSgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQl9CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlpZiAocnVuV2l0aFByb2dyZXNzKSB7Ci0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24ucnVuKGRlZmF1bHRNb25pdG9yKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoZ2V0TGFiZWwoKSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnV2l0aERldGFpbHMsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoZ2V0TGFiZWwoKSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnLCBudWxsLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRGZWF0dXJlSXNDb250YWlubWVudCgpIHsKLQkJcmV0dXJuIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCSYmICgoRVJlZmVyZW5jZSkgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkpLmlzQ29udGFpbm1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhZGRlZCBlbGVtZW50cyB0aGF0IGFyZSBuZXcgdG8gdGhlIGxpYnJhcnkgYW5kIGNhbiBoYXZlIG93bgotCSAqIHJlc291cmNlIHRoYXQgbm8gb3RoZXIgcmVzb3VyY2UgcmVmZXJzIHRvIChsaWtlIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBzYXZlTmV3RWxlbWVudHNXaXRoT3duUmVzb3VyY2UoKSB7Ci0JCWlmIChhZGRGZWF0dXJlSXNDb250YWlubWVudCgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0KLQkJCQkJaWYgKG1lIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwKLQkJCQkJCW1lIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IAotCQkJCQkJbWUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7CQkJCQkJCi0JCQkJCQlJU3RhdHVzIGlzID0gY2hlY2tGaWxlUGF0aExlbmd0aEJlZm9yZVNhdmUobWUpOwotCQkJCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gaXM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAocGVyc2lzdGVyLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKG1lKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShtZSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQkJCQkJbXNnID0gZS50b1N0cmluZygpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja0ZpbGVQYXRoTGVuZ3RoQmVmb3JlU2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCX0KLQkJaWYgKCEgTmFtZUNoZWNrZXIuY2hlY2tGaWxlUGF0aExlbmd0aChwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlLCBlbGVtZW50LCBlbGVtZW50LmdldE5hbWUoKSwgCi0JCQkJSVZhbGlkYXRvci5NYXhGaWxlUGF0aE5hbWVMZW5ndGgsIG51bGwpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2csIAotCQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihJVmFsaWRhdG9yLk1heEZpbGVQYXRoTmFtZUxlbmd0aCkgfSApOwotCQkJcmV0dXJuIG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYgKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJaWYgKCFhZGRMaXN0LmlzRW1wdHkoKSkgewotCQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHMoYWRkTGlzdCwKLQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJbmVzdGVkQ29tbWFuZHMuYWRkKGNtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRhaW5tZW50SW5mbyB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCi0JCWludCBpbmRleDsKLQotCQlDb250YWlubWVudEluZm8oRU9iamVjdCBjb250YWluZXIsIGludCBpbmRleCkgewotCQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciB7Ci0JCXByaXZhdGUgTWV0aG9kUGx1Z2luIHRhcmdldFBsdWdpbjsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHNUb01vdmU7Ci0KLQkJLyoqCi0JCSAqIGxpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkJICogCi0JCSAqIEBzZWUgUmVmZXJlbmNlCi0JCSAqLwotCQlwcml2YXRlIExpc3QgaWxsZWdhbFJlZmVyZW5jZXM7Ci0KLQkJcHJpdmF0ZSBTZXQgYWZmZWN0ZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXM7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNlYXJjaE91dGdvaW5nUmVmczsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2VhcmNoSW5jb21pbmdSZWZzOwotCi0JCXB1YmxpYyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcihNZXRob2RQbHVnaW4gdGFyZ2V0UGx1Z2luLAotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb01vdmUsIGJvb2xlYW4gc2VhcmNoT3V0Z29pbmdSZWZzLAotCQkJCWJvb2xlYW4gc2VhcmNoSW5jb21pbmdSZWZzKSB7Ci0JCQl0aGlzLnRhcmdldFBsdWdpbiA9IHRhcmdldFBsdWdpbjsKLQkJCXRoaXMuZWxlbWVudHNUb01vdmUgPSBlbGVtZW50c1RvTW92ZTsKLQkJCXRoaXMuc2VhcmNoT3V0Z29pbmdSZWZzID0gc2VhcmNoT3V0Z29pbmdSZWZzOwotCQkJdGhpcy5zZWFyY2hJbmNvbWluZ1JlZnMgPSBzZWFyY2hJbmNvbWluZ1JlZnM7Ci0JCX0KLQotCQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkUmVzb3VyY2VzKCkgewotCQkJaWYgKGFmZmVjdGVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHNUb01vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0KLQkJCQkJCS8vIGdldCBvdXRnb2luZyByZWZlcmVuY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKHNlYXJjaE91dGdvaW5nUmVmcwotCQkJCQkJCQkmJiAhaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKG9iaikpIHsKLQkJCQkJCQlnZXRJbGxlZ2FsT3V0Z29pbmdSZWZlcmVuY2VzKHRhcmdldFBsdWdpbiwgZSwKLQkJCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VzKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gZ2V0IGluY29taW5nIHJlZmVyZW5jZXMKLQkJCQkJCS8vCi0JCQkJCQlpZiAoc2VhcmNoSW5jb21pbmdSZWZzKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRSZWZlcmVuY2VzKGUpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIKLQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQlpZiAoIWVsZW1lbnRzVG9Nb3ZlLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHBsdWdpbiAhPSB0YXJnZXRQbHVnaW4KLQkJCQkJCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YodGFyZ2V0UGx1Z2luLAotCQkJCQkJCQkJCQkJCXBsdWdpbikpIHsKLQkJCQkJCQkJCQlDb2xsZWN0aW9uIHhSZWZzID0gZ2V0WFJlZmVyZW5jZXMoCi0JCQkJCQkJCQkJCQllbGVtZW50LCBlLCBudWxsKTsKLQkJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0geFJlZnMuaXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcjEKLQkJCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcwotCQkJCQkJCQkJCQkJCS5hZGQobmV3IFJlZmVyZW5jZShlbGVtZW50LAotCQkJCQkJCQkJCQkJCQkJZiwgZSkpOwotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGlsbGVnYWxSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlZi5vd25lci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZmZlY3RlZFJlc291cmNlcy5hZGQocmVmLm93bmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhZmZlY3RlZFJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUlsbGVnYWxSZWZlcmVuY2VzKCkgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbGxlZ2FsUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgcmVmLm93bmVyLmVHZXQocmVmLmZlYXR1cmUpKTsKLQkJCQkJLy8gVE9ETzogbmVlZHMgcmV2aXNpdAotCQkJCQkvLyBUaGlzIGNvZGUgdGhyb3dzCi0JCQkJCS8vIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0JEJhc2ljSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQkvLyBzb21ldGltZXMKLQkJCQkJLy8KLQkJCQkJLy8gaWYocmVmLmluZGV4ICE9IC0xKSB7Ci0JCQkJCS8vIGxpc3QucmVtb3ZlKHJlZi5pbmRleCk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gZWxzZSB7Ci0JCQkJCS8vIGxpc3QucmVtb3ZlKHJlZi52YWx1ZSk7Ci0JCQkJCS8vIH0KLQotCQkJCQlsaXN0LnJlbW92ZShyZWYudmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChyZWYuZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkpIHsKLQkJCQkJCS8vU2hvdWxkIHF1ZXJ5IHRoZSBkZWZhdWx0IHZhbHVlIGlmIGV4dGVuZGVkIGZvciBhbnkgYXR0cmlidXRlIGZlYXR1cmUKLQkJCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCBWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIG51bGwpOwotCQkJCQkJaWYgKHJlZi5mZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJCQlyZWYub3duZXIuZVNldChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwgVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQocmVmKTsKLQkJCX0KLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzdG9yZVJlbW92ZWRSZWZlcmVuY2VzKCkgewotCQkJaWYgKHJlbW92ZWRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gcmVtb3ZlZFJlZmVyZW5jZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgcmVtb3ZlZFJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJCWlmIChyZWYuZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKSk7Ci0JCQkJCWlmIChyZWYuaW5kZXggIT0gLTEpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0cwotCQkJCQkJCS8vCi0JCQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHJlZi52YWx1ZSkpIHsKLQkJCQkJCQkJaWYgKHJlZi5pbmRleCA8IGxpc3Quc2l6ZSgpKSB7Ci0JCQkJCQkJCQlsaXN0LmFkZChyZWYuaW5kZXgsIHJlZi52YWx1ZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlsaXN0LmFkZChyZWYudmFsdWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxpc3QuYWRkKHJlZi52YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZWYub3duZXIuZVNldChyZWYuZmVhdHVyZSwgcmVmLnZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1vdmVPcGVyYXRpb24gZXh0ZW5kcyBDb21tYW5kV3JhcHBlciB7Ci0JCS8qKiBDb25zdGFudHMgZm9yIHN0YXRlIG9mIHRoZSBtb3ZlIG9wZXJhdGlvbiAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU1RBUlQgPSAwOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TQVZFRF9GSUxFUyA9IDgwOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9NT1ZFRF9GSUxFUyA9IDcwOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT1BJRURfUkVTT1VSQ0VTID0gOTA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VORCA9IDEwMDsKLQotCQkvLyBwcml2YXRlIENvbW1hbmQgY29tbWFuZDsKLQkJcHJpdmF0ZSBBZGRDb21tYW5kIGFkZENvbW1hbmQ7Ci0KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIG1vdmVMaXN0OwotCi0JCXByaXZhdGUgYm9vbGVhbiByZW1vdmVYUmVmUmVxdWlyZWQgPSBmYWxzZTsKLQotCQlwcml2YXRlIGJvb2xlYW4gaXNSZWZlbnJlY2VkSWxsZWdhbGx5ID0gZmFsc2U7Ci0KLQkJcHJpdmF0ZSBNZXRob2RQbHVnaW4gb3duZXJQbHVnaW47Ci0KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudFRvT2xkUGx1Z2luTWFwOwotCi0JCXByaXZhdGUgTWFwIGVsZW1lbnRUb05ld05hbWVNYXA7Ci0KLQkJcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQkJcHJpdmF0ZSBPYmplY3Qgc2hlbGw7Ci0KLQkJcHJpdmF0ZSBIYXNoU2V0IG1vdmVkUmVzb3VyY2VzOwotCi0JCXByaXZhdGUgTXVsdGlTdGF0dXMgc3RhdHVzOwotCi0JCS8qKgotCQkgKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBtb3ZlIG9wZXJhdGlvbiwgaXQgY2FuIGJlIG9uZSBvZiB0aGUgc3RhdGUKLQkJICogY29uc3RhbnRzCi0JCSAqLwotCQlwcml2YXRlIGludCBzdGF0ZTsKLQotCQlwcm90ZWN0ZWQgU2V0IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JCXByaXZhdGUgSWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIgaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXI7Ci0KLQkJcHJpdmF0ZSBIYXNoTWFwIGVsZW1lbnRUb09sZENvbnRhaW5lck1hcDsKLQotCQlwdWJsaWMgTW92ZU9wZXJhdGlvbihDb21tYW5kIGNvbW1hbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQlPYmplY3Qgc2hlbGwpIHsKLQkJCXN1cGVyKGNvbW1hbmQpOwotCQkJYWRkQ29tbWFuZCA9IChBZGRDb21tYW5kKSBUbmdVdGlsLnVud3JhcChjb21tYW5kKTsKLQkJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBNYXAgZ2V0RWxlbWVudFRvT2xkUGx1Z2luTWFwKCkgewotCQkJcmV0dXJuIGVsZW1lbnRUb09sZFBsdWdpbk1hcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXR1cy4KLQkJICovCi0JCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2tzIGlmIHJlbG9hZGluZyBsaWJyYXJ5IGlzIG5lZWRlZCBpbiBjYXNlIG9mIG1vdmUgZmFpbHVyZQotCQkgKiAKLQkJICogQHJldHVybgotCQkgKiBAc2VlICNnZXRTdGF0dXMoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVsb2FkTmVlZGVkKCkgewotCQkJcmV0dXJuIHN0YXR1cyAhPSBudWxsCi0JCQkJCSYmIENvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1JvbGxiYWNrRXJyb3Ioc3RhdHVzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQkvLyB1bmRvIG5hbWUgY2hhbmdlCi0JCQkvLwotCQkJaWYgKGVsZW1lbnRUb05ld05hbWVNYXAgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb05ld05hbWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJZS5zZXROYW1lKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGVsZW1lbnRUb09sZENvbnRhaW5lck1hcCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJQ29udGFpbm1lbnRJbmZvIGNvbnRhaW5tZW50SW5mbyA9IChDb250YWlubWVudEluZm8pIGVudHJ5Ci0JCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCk7Ci0JCQkJCWlmIChmLmlzTWFueSgpKSB7Ci0JCQkJCQkoKExpc3QpIGNvbnRhaW5tZW50SW5mby5jb250YWluZXIuZUdldChmKSkuYWRkKAotCQkJCQkJCQljb250YWlubWVudEluZm8uaW5kZXgsIGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29udGFpbm1lbnRJbmZvLmNvbnRhaW5lci5lU2V0KGYsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIgIT0gbnVsbCkgewotCQkJCWlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyLnJlc3RvcmVSZW1vdmVkUmVmZXJlbmNlcygpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXJ1bigpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzdGF0ZSA9IFNUQVRFX1NUQVJUOwotCi0JCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9yZWFzb24sIG51bGwpOyAKLQotCQkJaWYgKGNoZWNrTmFtZSgpKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIHRoaXMKLQkJCQkvLyBjb21tYW5kIGNhbiBiZSBtb2RpZmllZAotCQkJCS8vCi0JCQkJSVN0YXR1cyBleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKGFkZENvbW1hbmQsIHNoZWxsKTsKLQkJCQlpZiAoIWV4ZWNTdGF0dXMuaXNPSygpKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbnVsbCwgZXhlY1N0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBTdHJpbmdCdWZmZXIgbXNnQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZSk7IAotCQkJCQkJU3RyaW5nIG1zZyA9IGNoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKTsKLQkJCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJCW1zZ0J1ZmZlci5hcHBlbmQobXNnKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQotCQkJCUlTdGF0dXMgc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbCk7Ci0JCQkJaWYoIXN0YXQuaXNPSygpKSB7Ci0JCQkJCXN0YXR1cy5hZGQoc3RhdCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAobXNnQnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJCWlmKHVpSGFuZGxlciAgIT0gbnVsbCkgewotCQkJCQkJaW50IHJldCA9IHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHtJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLCBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8gfSwgCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLm1vdmVEaWFsb2dfdGl0bGUsIG1zZ0J1ZmZlci50b1N0cmluZygpLCBudWxsKTsKLQkJCQkJCWlmKHJldCA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8pIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzYXZlIHJlZmVyZW5jZSB0byBvbGQgcmVzb3VyY2Ugb2YgYWxsIGVsZW1lbnRzIGluIHRoZQotCQkJCS8vIG1vdmVMaXN0Ci0JCQkJLy8KLQkJCQlmaW5hbCBNYXAgZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJLy8gc2F2ZSB0aGUgcmVmZXJlbmNlIHRvIG9sZCByZXNvdXJjZQotCQkJCQkJLy8KLQkJCQkJCWVsZW1lbnRUb09sZFJlc291cmNlTWFwLnB1dChlbGVtZW50LCBlbGVtZW50Ci0JCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkIHx8IGlzUmVmZW5yZWNlZElsbGVnYWxseSkgewotCQkJCQkvLyBnZXQgc2V0IG9mIHJlc291cmNlcyB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgZHVyaW5nIHRoaXMKLQkJCQkJLy8gbW92ZQotCQkJCQkvLwotCQkJCQlpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciA9IG5ldyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcigKLQkJCQkJCQlvd25lclBsdWdpbiwgbW92ZUxpc3QsIHJlbW92ZVhSZWZSZXF1aXJlZCwKLQkJCQkJCQlpc1JlZmVucmVjZWRJbGxlZ2FsbHkpOwotCQkJCQlydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZSk7IAotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIKLQkJCQkJCQkJCS5nZXRBZmZlY3RlZFJlc291cmNlcygpOwotCQkJCQkJfQotCi0JCQkJCX07Ci0JCQkJCXN0YXQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5Jbk1vZGFsQ29udGV4dChydW5uYWJsZSwgdHJ1ZSwgbW9uaXRvciwgc2hlbGwpOwotCQkJCQlpZighc3RhdC5pc09LKCkpIHsKLQkJCQkJCXN0YXR1cy5hZGQoc3RhdCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBjaGVjayBhZmZlY3RlZCByZXNvdXJjZXMgZm9yIHVubW9kaWZpYWJsZQotCQkJCQlleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLCBzaGVsbCk7Ci0JCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbnVsbCwgZXhlY1N0YXR1cyk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWUpOyAKLQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyLnJlbW92ZUlsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1bmRvKCk7Ci0JCQkJCQlTdHJpbmcgbXNnID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZSk7Ci0JCQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCTAsIG1zZywgZSkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJLy8gc2V0IG5ldyBuYW1lIGlmIHRoZXJlIGlzIGFueQotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvTmV3TmFtZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlOYW1lZEVsZW1lbnQgZWxlbWVudCA9IChOYW1lZEVsZW1lbnQpIGVudHJ5LmdldEtleSgpOwotCQkJCQllbGVtZW50LnNldE5hbWUoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RVbml0KSB7Ci0JCQkJCQltb3ZlZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCQkJQ29udGVudEVsZW1lbnQgZSA9IChDb250ZW50RWxlbWVudCkgZWxlbWVudDsKLQkJCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZSkpIHsKLQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGUuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIG1vdmUgZWxlbWVudHMKLQkJCQkvLwotCQkJCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKExpYnJhcnlFZGl0UmVzb3VyY2VzLm1vdmluZ1Rhc2tfbmFtZSk7IAotCQkJCQkJZG9Nb3ZlKG1vbml0b3IsIGVsZW1lbnRUb09sZFJlc291cmNlTWFwLAotCQkJCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbCk7Ci0JCQkJaWYoIXN0YXQuaXNPSygpKSB7Ci0JCQkJCXVuZG8oKTsKLQkJCQkJc3RhdHVzLmFkZChzdGF0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCi0JCQkJLy8gY2hlY2sgbW92ZWQgcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiBtb2RpZmlhYmxlIHJlc291cmNlcwotCQkJCS8vIGZvciB1bm1vZGlmaWFibGUKLQkJCQkvLwotCQkJCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChtb3ZlZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2VzLnJlbW92ZUFsbChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJZXhlY1N0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLmNoZWNrTW9kaWZ5KHJlc291cmNlcywgc2hlbGwpOwotCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZlRGlhbG9nX3RpdGxlLCBudWxsLCBleGVjU3RhdHVzKTsKLQotCQkJCQl1bmRvKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBzYXZlIHJlc291cmNlcwotCQkJCS8vCi0JCQkJcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJU3RhdHVzIHNhdmVTdGF0dXMgPSBzYXZlKG1vbml0b3IpOwotCQkJCQkJCWlmICghc2F2ZVN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJc3RhdHVzLmFkZChzYXZlU3RhdHVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJdGhyb3cgZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlzdGF0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuSW5Nb2RhbENvbnRleHQocnVubmFibGUsIHRydWUsIG1vbml0b3IsIHNoZWxsKTsKLQkJCQlpZighc3RhdC5pc09LKCkpIHsKLQkJCQkJc3RhdHVzLmFkZChzdGF0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHJ1biBuZXN0ZWQgY29tbWFuZHMKLQkJCQkvLwotCQkJCU5lc3RlZENvbW1hbmRFeGNlY3V0b3IgbmVzdGVkQ29tbWFuZEV4Y2VjdXRvciA9IG5ldyBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKHRoaXMpOwotCQkJCXRyeSB7Ci0JCQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXN0YXRlID0gU1RBVEVfRU5EOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGludGVyYWN0cyB3aXRoIHVzZXIKLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBjaGVja05hbWUoKSB7Ci0JCQllbGVtZW50VG9OZXdOYW1lTWFwID0gTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuY2hlY2tOYW1lKGFkZENvbW1hbmQpOwotCQkJcmV0dXJuIGVsZW1lbnRUb05ld05hbWVNYXAgIT0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBMb25nIHJ1bm5pbmcgbWV0aG9kCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCkgewotCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpKTsKLQkJCW1vdmVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQotCQkJCS8vIC8vIHNldCBuZXcgbmFtZSBpZiB0aGVyZSBpcyBhbnkKLQkJCQkvLyAvLwotCQkJCS8vIFN0cmluZyBuZXdOYW1lID0gKFN0cmluZykgZWxlbWVudFRvTmV3TmFtZU1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJLy8gaWYobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQkJLy8gKChOYW1lZEVsZW1lbnQpZWxlbWVudCkuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVW5pdCkgewotCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkvLyBDb250ZW50RWxlbWVudCBlID0gKENvbnRlbnRFbGVtZW50KSBlbGVtZW50OwotCQkJCS8vIGlmKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGUpKSB7Ci0JCQkJLy8gbW92ZWRSZXNvdXJjZXMuYWRkKGUuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KGVsZW1lbnQsIFVtYVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQltb3ZlTGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBpbGxlZ2FsIHJlZmVyZW5jZSBpbiB0aGUgbW92ZWQgb2JqZWN0cwotCQkJLy8JCQkKLQkJCW93bmVyUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYWRkQ29tbWFuZC5nZXRPd25lcigpKTsKLQkJCWZpbmRfeFBsdWdpblJlZjogZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0KLQkJCQlpZiAoaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKGVsZW1lbnQpKSB7Ci0JCQkJCWNvbnRpbnVlIGZpbmRfeFBsdWdpblJlZjsKLQkJCQl9Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2VJbmNsdWRpbmdBbGxDaGlsZHJlbihvd25lclBsdWdpbiwKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgbW92ZUxpc3QpKSB7Ci0JCQkJCQlyZW1vdmVYUmVmUmVxdWlyZWQgPSB0cnVlOwotCQkJCQkJYnJlYWsgZmluZF94UGx1Z2luUmVmOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlmaW5kX2lsbGVnYWxSZWZlcmVuY2VyOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb3ZlTGlzdC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKGlzUmVmZXJlbmNlZElsbGVnYWxseShvd25lclBsdWdpbiwKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgbW92ZUxpc3QpKSB7Ci0JCQkJCQlpc1JlZmVucmVjZWRJbGxlZ2FsbHkgPSB0cnVlOwotCQkJCQkJYnJlYWsgZmluZF9pbGxlZ2FsUmVmZXJlbmNlcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChyZW1vdmVYUmVmUmVxdWlyZWQgfHwgaXNSZWZlbnJlY2VkSWxsZWdhbGx5KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uOyAKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIExvbmcgcnVubmluZyBtZXRob2QKLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBkb01vdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCU1hcCBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcCwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWVsZW1lbnRUb09sZENvbnRhaW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOwotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVsZW1lbnQuZUNvbnRhaW5pbmdGZWF0dXJlKCk7Ci0JCQkJCWludCBpbmRleDsKLQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCWluZGV4ID0gKChMaXN0KSBjb250YWluZXIuZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJLmluZGV4T2YoZWxlbWVudCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbmRleCA9IC0xOwotCQkJCQl9Ci0JCQkJCWVsZW1lbnRUb09sZENvbnRhaW5lck1hcC5wdXQoZWxlbWVudCwgbmV3IENvbnRhaW5tZW50SW5mbygKLQkJCQkJCQljb250YWluZXIsIGluZGV4KSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBtb3ZlIHRoZSBlbGVtZW50cwotCQkJLy8KLQkJCWFkZENvbW1hbmQuZXhlY3V0ZSgpOwotCi0JCQkvLyBjb2xsZWN0IHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIG1vZGlmZWQgYXMgcmVzdWx0IG9mIHRoaXMgbW92ZQotCQkJLy8KLQkJCVJlc291cmNlIG5ld1Jlc291cmNlID0gYWRkQ29tbWFuZC5nZXRPd25lcigpLmVSZXNvdXJjZSgpOwotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG5ld1Jlc291cmNlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCUVPYmplY3Qgb2xkQ29udGFpbmVyID0gKChDb250YWlubWVudEluZm8pIGVsZW1lbnRUb09sZENvbnRhaW5lck1hcAotCQkJCQkJCS5nZXQoZWxlbWVudCkpLmNvbnRhaW5lcjsKLQkJCQkJaWYgKG9sZENvbnRhaW5lci5lUmVzb3VyY2UoKSAhPSBuZXdSZXNvdXJjZQotCQkJCQkJCSYmICFvbGRDb250YWluZXIuZVJlc291cmNlKCkuZ2V0Q29udGVudHMoKQotCQkJCQkJCQkJLmlzRW1wdHkoKSkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG9sZENvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQkJCQlSZXNvdXJjZSBvbGRSZXNvdXJjZSA9IChSZXNvdXJjZSkgZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAKLQkJCQkJCQkJLmdldChlbGVtZW50KTsKLQkJCQkJCWlmIChvbGRDb250YWluZXIuZVJlc291cmNlKCkgIT0gb2xkUmVzb3VyY2UpIHsKLQkJCQkJCQltb3ZlZFJlc291cmNlcy5hZGQob2xkUmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJT2JqZWN0IHBsdWdpbiA9IGVsZW1lbnRUb09sZFBsdWdpbk1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJCWlmIChvd25lclBsdWdpbiAhPSBwbHVnaW4pIHsKLQkJCQkJCS8vIGl0J3MgYSBjcm9zcy1wbHVnaW4gbW92ZSwgYWRkIHRoZSByZXNvdXJjZXMgb2YgdGhvc2UKLQkJCQkJCS8vIGNoaWxkcmVuIHRoYXQgaGF2ZSBkaXJlY3QgcmVzb3VyY2UKLQkJCQkJCS8vIHRvIHRoZSBtb3ZlUmVzb3VyY2VzIGxpc3QKLQkJCQkJCS8vCQkJCQkJCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmIChVbWFVdGlsLmhhc0RpcmVjdFJlc291cmNlKGUpKSB7Ci0JCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChlLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwLnB1dChlLCBwbHVnaW4pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCAmJgotCQkJCQkJLy8gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oKERlc2NyaWJhYmxlRWxlbWVudCkKLQkJCQkJCS8vIGVsZW1lbnQpKSB7Ci0JCQkJCQkvLyBtb3ZlZFJlc291cmNlcy5hZGQoKChEZXNjcmliYWJsZUVsZW1lbnQpZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQkJCQkJLy8gZWxlbWVudFRvT2xkUGx1Z2luTWFwLnB1dCgoKERlc2NyaWJhYmxlRWxlbWVudCllbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCS8vIHBsdWdpbik7Ci0JCQkJCQkvLyB9Ci0JCQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsKLQkJCQkJCS8vIGl0ZXJhdG9yCi0JCQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCQkJLy8gT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkvLyBpZihlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICYmCi0JCQkJCQkvLyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbigoRGVzY3JpYmFibGVFbGVtZW50KQotCQkJCQkJLy8gZSkpIHsKLQkJCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZCgoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkvLyBlbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KCgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJLy8gcGx1Z2luKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIH0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgSVN0YXR1cyBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcywKLQkJCQkJbnVsbCk7IAotCi0JCQltb25pdG9yLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZSk7IAotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzCi0JCQkJCS5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQlzYXZlOiBkbyB7Ci0JCQkJdHJ5IHsKLQotCQkJCQlpZiAoIW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZpbmdGaWxlc1Rhc2tfbmFtZSk7IAotCi0JCQkJCQkvLyBtb3ZlIHRoZSBtb3ZlZCByZXNvdXJjZXMKLQkJCQkJCS8vCi0JCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24obW92ZWRSZXNvdXJjZXMpOwotCQkJCQl9Ci0JCQkJCXN0YXRlID0gU1RBVEVfTU9WRURfRklMRVM7Ci0KLQkJCQkJLy8gc2F2ZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJCS8vCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBtb25pdG9yLnN1YlRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlNhdmluZwotCQkJCQkJCS8vICcnezB9JyciLCBwYXRoQXJncykpOwotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlRmlsZUVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgOiByZXNvdXJjZS50b1N0cmluZygpKTsKLQkJCQkJCQlzdGF0dXMuYWRkKG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgZSkpOwotCQkJCQkJCWJyZWFrIHNhdmU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQlzdGF0ZSA9IFNUQVRFX1NBVkVEX0ZJTEVTOwotCi0JCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lKTsgCi0KLQkJCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5hZGRBbGwocmVzb3VyY2UKLQkJCQkJCQkJCS5nZXRDb250ZW50cygpKTsKLQkJCQkJCX0KLQotCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5hZGRBbGwoYWRkQ29tbWFuZAotCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCi0JCQkJCQlDb2xsZWN0aW9uIG1vZGlmaWVkID0gcmVzTWdyLmNvcHlSZWZlcmVuY2VkQ29udGVudHMoCi0JCQkJCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMsCi0JCQkJCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCk7Ci0JCQkJCQlpZiAobW9kaWZpZWQgIT0gbnVsbCAmJiAhbW9kaWZpZWQuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWQuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCQlPYmplY3RbXSBwYXRoQXJncyA9IHsgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZS5nZXRVUkkoKQotCQkJCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCl9OwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkJCQkuc3ViVGFzayhNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmluZ0ZpbGVUYXNrX25hbWUsCi0JCQkJCQkJCQkJCQkJCQlwYXRoQXJncykpOyAKLQkJCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZUZpbGVFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJcGF0aEFyZ3MpOyAKLQkJCQkJCQkJCXN0YXR1cy5hZGQobmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKSk7Ci0JCQkJCQkJCQlicmVhayBzYXZlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJc3RhdGUgPSBTVEFURV9DT1BJRURfUkVTT1VSQ0VTOwotCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihtc2cpKTsKLQkJCQkJSVN0YXR1cyBuZXdTdGF0dXMgPSBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLnRvU3RyaW5nKCksIGUpOwotCQkJCQlzdGF0dXMuYWRkKG5ld1N0YXR1cyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQlTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihtc2cpKTsKLQkJCQkJCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCQlTYXZlU3RhdHVzLlJPTExCQUNLX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwKLQkJCQkJCQkJCWUpOwotCQkJCQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gd2hpbGUgKGZhbHNlKTsKLQotCQkJbW9uaXRvci5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbW1hbmRfZG9uZSk7IAotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlc291cmNlTWFuYWdlciB7Ci0KLQkJLyoqCi0JCSAqIENvcGllcyB0aGUgY29udGVudCByZXNvdXJjZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGUgY29udGVudCBvZgotCQkgKiB0aGUgZ2l2ZW4gZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gbW92ZWQvY29waWVkIHRvIG5ldyBsb2NhdGlvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiAgICAgICAgICAgIEVsZW1lbnRzIHRoYXQgYXJlIG1vdmVkIG9yIGNvcGllZC4KLQkJICogQHJldHVybiBjb2xsZWN0aW9uIG9mIG1vZGlmaWVkIHJlc291cmNlcyBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbC4KLQkJICovCi0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IGNvcHlSZWZlcmVuY2VkQ29udGVudHMoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50cywKLQkJCQlNYXA8TWV0aG9kRWxlbWVudCwgTWV0aG9kUGx1Z2luPiBlbGVtZW50VG9PbGRQbHVnaW5NYXApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNSZXNvdXJjZU1hbmFnZXIgaW1wbGVtZW50cyBSZXNvdXJjZU1hbmFnZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5SZXNvdXJjZU1hbmFnZXIjY29weVJlZmVyZW5jZWRDb250ZW50cyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBjb3B5UmVmZXJlbmNlZENvbnRlbnRzKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMsCi0JCQkJTWFwPE1ldGhvZEVsZW1lbnQsIE1ldGhvZFBsdWdpbj4gZWxlbWVudFRvT2xkUGx1Z2luTWFwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyKSB7Ci0JCU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLnJlc01nciA9IHJlc01ncjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdWYWxpZGF0b3IgZ2V0U3RyaW5nVmFsaWRhdG9yKCkgewotCQlpZiAoc3RyaW5nVmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXN0cmluZ1ZhbGlkYXRvciA9IG5ldyBTdHJpbmdWYWxpZGF0b3IoKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nVmFsaWRhdG9yOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nVmFsaWRhdG9yIHN0cmluZ1ZhbGlkYXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvciB7Ci0KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JCXByaXZhdGUgSVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkJcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZ1ZhbGlkYXRvcigpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gZWxlbWVudHMKLQkJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gaW5jbHVkZSBpbiB0aGUgY2hlY2suCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nVmFsaWRhdG9yKENvbGxlY3Rpb24gZWxlbWVudHMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGVsZW1lbnRzIHRvIGluY2x1ZGUgaW4gdGhlIGNoZWNrLgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnRzCi0JCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGluY2x1ZGUgaW4gdGhlIGNoZWNrLgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RWxlbWVudHMoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFVuaXF1ZW5lc3NWYWxpZGF0b3IpIHsKLQkJCQlFT2JqZWN0IG9iaiA9ICgoVW5pcXVlbmVzc1ZhbGlkYXRvcikgdmFsaWRhdG9yKS5nZXRFT2JqZWN0KCk7Ci0JCQkJaW50IGNsYXNzSUQgPSBvYmouZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCQkJbmV3VGV4dCA9IG5ld1RleHQudHJpbSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBlLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChvYmogIT0gZSAmJiBjbGFzc0lEID09IGUuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkKLQkJCQkJCQkmJiBuZXdUZXh0LmVxdWFsc0lnbm9yZUNhc2Uoc3RyKSkgewotCQkJCQkJLy8gcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwKLQkJCQkJCS8vIGRhdGEpOwotCQkJCQkJcmV0dXJuIE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJCQkJCQluZXdUZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB2YWxpZGF0b3IuaXNWYWxpZChuZXdUZXh0KTsKLQkJfQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZmRjYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGNoaWxkIG1ldGhvZCBlbGVtZW50IGFuZCBhZGQgaXQgdG8gdGhlCi0gKiBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCBleHRlbmRzIENyZWF0ZUNoaWxkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBjaGlsZCwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24sIEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY2hpbGQsIGluZGV4LCBzZWxlY3Rpb24sIGhlbHBlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN1cGVyRXhlY3V0ZSgpIHsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQl2YWxpZGF0b3IgPSBuZXcgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCWlmIChuZXdUZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlTdHJpbmcgZWxlbWVudFRleHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50X3RleHQ7IAotCQkJCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2csIGVsZW1lbnRUZXh0KTsgCi0JCQkJCX0KLQkJCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvd25lci5lR2V0KGZlYXR1cmUpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGNoaWxkLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5ld1RleHQpKSB7Ci0JCQkJCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywgbmV3VGV4dCk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTdHJpbmcgdGl0bGUgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5uZXdFbGVtZW50X3RleHQsIGhlbHBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pKTsgCi0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKCk7Ci0vLwkJZmluYWwgU3RyaW5nIG5hbWUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIucmVxdWVzdE5hbWUoY2hpbGQsCi0vLwkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCB0aXRsZSwgdmFsaWRhdG9yKTsKLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlVc2VySW5wdXQgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChMaWJyYXJ5RWRpdFJlc291cmNlcy5uYW1lTGFiZWxfdGV4dCwgVXNlcklucHV0LlRFWFQsIAotCQkJCWZhbHNlLCBudWxsLCBudWxsLCB2YWxpZGF0b3IsIHRoaXMpOwkJCi0JCWlmKHVpSGFuZGxlci5yZXF1ZXN0SW5wdXQodGl0bGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNwZWNpZnlOYW1lVGV4dCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1c2VySW5wdXQpKSkgeyAKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgdXNlcklucHV0LmdldElucHV0KCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJKChOYW1lZEVsZW1lbnQpIGNoaWxkKS5zZXROYW1lKG5hbWUpOwotCQkJCXN1cGVyRXhlY3V0ZSgpOwotCQkJCWV4ZWN1dGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChleGVjdXRlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG93bmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlpZiAoZXhlY3V0ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkKCkgewotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCQotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjVhY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBTdHJpbmcga2V5OwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGRWYWx1ZTsKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlCi0JCS8vIHZhbHVlCi0JCS8vCi0JCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShlbGVtZW50LCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSwKLQkJCQllbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsCi0JCQkJJiYgbW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJfQotCQkKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvbGRQcm9wZXJ0eSA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5nZXRJbnN0YW5jZSgpLmdldFByb3BlcnR5KGVsZW1lbnQsIGtleSk7Ci0JCWlmIChvbGRQcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlvbGRWYWx1ZSA9IG9sZFByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlvbGRWYWx1ZSA9IG51bGw7Ci0JCX0KLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyLmdldEluc3RhbmNlKCkuc2V0UHJvcGVydHkoZWxlbWVudCwga2V5LCB2YWx1ZSk7Ci0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5zZXRQcm9wZXJ0eShlbGVtZW50LCBrZXksIG9sZFZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5yZW1vdmVQcm9wZXJ0eShlbGVtZW50LCBrZXkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWE4NDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBtb3ZlIGEgdmlldyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gKiBAYXV0aG9yIFhpYW5nIERvbmcgSHUKLSAqIEBzaW5jZSAxLjIKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzgyNwotICovCi1wdWJsaWMgY2xhc3MgTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBMaXN0IGVsZW1lbnRzTGlzdDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0JCi0JcHVibGljIE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBMaXN0IGVsZW1lbnRzTGlzdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgZGlyZWN0aW9uKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmVsZW1lbnRzTGlzdCA9IGVsZW1lbnRzTGlzdDsKLQkJdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlyZWRvKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJRUxpc3QgbGlzdCA9IChFTGlzdCkgY29uZmlnLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJbGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEb3duKSB7Ci0JCQkJCWlmIChpbmRleCA8IGxpc3Quc2l6ZSgpKQotCQkJCQkJbGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQkJbW92ZWQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljb25maWcuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJfQotCQlpZiAoY29uZmlnLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb25maWcuZVJlc291cmNlKCkpOwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG1vdmVkKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUVMaXN0IGxpc3QgPSAoRUxpc3QpIGNvbmZpZy5lR2V0KGZlYXR1cmUpOwotCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCQkJaWYgKGluZGV4IDwgbGlzdC5zaXplKCkpCi0JCQkJCQkJbGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCQlsaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCQl9Ci0JCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQljb25maWcuZVNldChmZWF0dXJlLCBvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCW1vdmVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb25maWcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkxpc3RDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4OGMxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluTGlzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHJlb3JkZXIgYSBtZXRob2QgZWxlbWVudCB3aXRoaW4gYSBjYXRlZ29yeS4KLSAqIAotICogMS41OiAgUmVmYWN0b3JlZCB0byB3b3JrIGZvciBhbnkgTWV0aG9kRWxlbWVudCdzIHJlZmVyZW5jZSBsaXN0cy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlSW5MaXN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVVAgPSAxOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERPV04gPSAwOwotCQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgTGlzdDxPYmplY3Q+IGVsZW1lbnRzTGlzdDsKLQkKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGVsZW1lbnRPcmRlckxpc3Q7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0KLQlwdWJsaWMgTW92ZUluTGlzdENvbW1hbmQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMaXN0PE9iamVjdD4gZWxlbWVudHNMaXN0LAotCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3Qgb3JkZXJMaXN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlpbnQgZGlyZWN0aW9uKSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZWxlbWVudHNMaXN0ID0gZWxlbWVudHNMaXN0OwkJCi0JCXRoaXMuZWxlbWVudE9yZGVyTGlzdCA9IG9yZGVyTGlzdCA7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBNb3ZlSW5MaXN0Q29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBNb3ZlSW5MaXN0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gaXQgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJaW50IGluZGV4ID0gZWxlbWVudE9yZGVyTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJZWxlbWVudE9yZGVyTGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBET1dOKSB7Ci0JCQkJCWlmIChpbmRleCA8IGVsZW1lbnRPcmRlckxpc3Quc2l6ZSgpKQotCQkJCQkJZWxlbWVudE9yZGVyTGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQkJbW92ZWQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudE9yZGVyTGlzdC5hcHBseSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWludCBpbmRleCA9IGVsZW1lbnRPcmRlckxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA8IGVsZW1lbnRPcmRlckxpc3Quc2l6ZSgpKQotCQkJCQkJZWxlbWVudE9yZGVyTGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRE9XTikgewotCQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCQllbGVtZW50T3JkZXJMaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCQl9Ci0JCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbGVtZW50T3JkZXJMaXN0LmFwcGx5KCk7Ci0JCQltb3ZlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmNmM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW9yZGVyIGEgc2VjdGlvbiB3aXRoaW4gYSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0OwotCi0JcHJpdmF0ZSBMaXN0PD8gZXh0ZW5kcyBTZWN0aW9uPiBlbGVtZW50c0xpc3Q7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IHVzZWRDb250ZW50RWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCUxpc3Q8PyBleHRlbmRzIFNlY3Rpb24+IGVsZW1lbnRzTGlzdCwgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3QsIGludCBkaXJlY3Rpb24pIHsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnNlY3Rpb25MaXN0ID0gc2VjdGlvbkxpc3Q7Ci0JCXRoaXMuZWxlbWVudHNMaXN0ID0gZWxlbWVudHNMaXN0OwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kUGx1Z2luIHRhc2tQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb250ZW50RWxlbWVudCk7Ci0JCU1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzTGlzdC5nZXQoMCkpOwotCi0JCWlmICh0YXNrUGx1Z2luICE9IGVsZW1lbnRQbHVnaW4KLQkJCQkmJiBNaXNjLmlzQmFzZU9mKHRhc2tQbHVnaW4sIGVsZW1lbnRQbHVnaW4pKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldENvbnRyaWJ1dG9ycyhjb250ZW50RWxlbWVudCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAodmUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4odmUpID09IGVsZW1lbnRQbHVnaW4pIHsKLQkJCQkJdXNlZENvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSB2ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh1c2VkQ29udGVudEVsZW1lbnQgPT0gbnVsbCkgewotCQkJdXNlZENvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAodXNlZENvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gZWxlbWVudHNMaXN0LnNpemUoKTsKLQkJZm9yIChTZWN0aW9uIG9iamVjdCA6IGVsZW1lbnRzTGlzdCkgewotCQkJaW50IGluZGV4ID0gc2VjdGlvbkxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCWlmIChpbmRleCA8IHNlY3Rpb25MaXN0LnNpemUoKSkKLQkJCQkJc2VjdGlvbkxpc3QubW92ZShpbmRleCArIHNpemUsIG9iamVjdCk7Ci0JCQl9Ci0JCQltb3ZlZCA9IHRydWU7Ci0JCX0KLQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJaW50IHNpemUgPSBlbGVtZW50c0xpc3Quc2l6ZSgpOwotCQkJZm9yIChTZWN0aW9uIG9iamVjdCA6IGVsZW1lbnRzTGlzdCkgewotCQkJCWludCBpbmRleCA9IHNlY3Rpb25MaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA8IHNlY3Rpb25MaXN0LnNpemUoKSkKLQkJCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggKyBzaXplLCBvYmplY3QpOwotCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCX0KLQkJCQltb3ZlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCQkJbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlZENvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9OZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM2OTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9OZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvciB7Ci0JcHJpdmF0ZSBDb21tYW5kIGNvbW1hbmQ7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29tbWFuZD4gbmVzdGVkQ29tbWFuZHM7Ci0KLQlwdWJsaWMgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0JCi0JcHVibGljIExpc3Q8Q29tbWFuZD4gZ2V0TmVzdGVkQ29tbWFuZHMoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRzID09IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxDb21tYW5kPigpOwotCQl9Ci0JCXJldHVybiBuZXN0ZWRDb21tYW5kczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCUxpc3Q8SU5lc3RlZENvbW1hbmRQcm92aWRlcj4gbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpOwotCQlpZighbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA6IG5lc3RlZENvbW1hbmRQcm92aWRlcnMpIHsKLQkJCQl0cnkgewotCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZU5lc3RlZENvbW1hbmQoY29tbWFuZCk7Ci0JCQkJCWlmKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsJCQkJCQkJCi0JCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJZ2V0TmVzdGVkQ29tbWFuZHMoKS5hZGQoY21kKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG9OZXN0ZWRDb21tYW5kcygpIHsKLQkJaWYobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlpZihjbWQuY2FuVW5kbygpKSB7Ci0JCQkJCQljbWQudW5kbygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7IGNtZC5kaXNwb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQkJfQotCQkJfQotCQkJbmVzdGVkQ29tbWFuZHMuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCX0KLQkJCW5lc3RlZENvbW1hbmRzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlpZihuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvcihpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQl0cnkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCljbWQpLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQlpZihyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmOGQ4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZSB7Ci0JCi0JRU9iamVjdCBvd25lcjsKLQotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JT2JqZWN0IHZhbHVlOwotCi0JaW50IGluZGV4ID0gLTE7Ci0KLQlwdWJsaWMgUmVmZXJlbmNlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgb3duZXIuZUdldChmZWF0dXJlKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHZhbHVlKTsKLQkJfQotCX0KLQotCVJlZmVyZW5jZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTEwYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYSBtZXRob2QgZWxlbWVudCBmcm9tIGEgY2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IGNhdGVnb3J5OwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb250ZW50UGtnUGF0aDsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeTsKLQotCXByaXZhdGUgaW50IHJlbW92ZWRFbGVtZW50SW5kZXggPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpc3QgdXNlZENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJU3RyaW5nW10gY29udGVudFBrZ1BhdGgsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmNvbnRlbnRQa2dQYXRoID0gY29udGVudFBrZ1BhdGg7Ci0JCXRoaXMudXNlZENhdGVnb3JpZXMgPSB1c2VkQ2F0ZWdvcmllczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHVzZWRDYXRlZ29yeSAhPSBudWxsICYmIHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1c2VkQ2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCi0JCWlmIChjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luCi0JCQkJJiYgTWlzYy5pc0Jhc2VPZihjYXRlZ29yeVBsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCXVzZWRDYXRlZ29yeSA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQllbGVtZW50UGx1Z2luLCBjb250ZW50UGtnUGF0aCksIGNhdGVnb3J5KTsKLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmICh1c2VkQ2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCXJlbW92ZWRFbGVtZW50SW5kZXggPSAoKEVMaXN0KSBjb2xsZWN0aW9uKS5pbmRleE9mKGVsZW1lbnQpOwotCQkJfQotCQkJcmVtb3ZlZCA9IGNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQlyZW1vdmVkID0gdHJ1ZTsKLQkJfQotCQlpZiAocmVtb3ZlZCkgewotCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChyZW1vdmVkKSB7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEVMaXN0ICYmIHJlbW92ZWRFbGVtZW50SW5kZXggIT0gLTEpIHsKLQkJCQkJKChFTGlzdCkgY29sbGVjdGlvbikuYWRkKHJlbW92ZWRFbGVtZW50SW5kZXgsIGVsZW1lbnQpOwotCQkJCX0gZWxzZQotCQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZW1vdmVkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotCQkJdXNlZENhdGVnb3JpZXMucmVtb3ZlKGNhdGVnb3J5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21TZWN0aW9uTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21TZWN0aW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjRhZGUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tU2VjdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYSBzZWN0aW9uIGZyb20gYSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkOwotCi0JcHJpdmF0ZSBpbnQgcmVtb3ZlZE9iamVjdEluZGV4ID0gLTE7Ci0KLQlwdWJsaWMgUmVtb3ZlRnJvbVNlY3Rpb25MaXN0KENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdCkgewotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuc2VjdGlvbkxpc3QgPSBzZWN0aW9uTGlzdDsKLQkJdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXJlbW92ZWRPYmplY3RJbmRleCA9IHNlY3Rpb25MaXN0LmluZGV4T2Yoc2VjdGlvbik7Ci0JCXNlY3Rpb25MaXN0LnJlbW92ZShzZWN0aW9uKTsKLQkJcmVtb3ZlZCA9IHRydWU7Ci0JCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCWlmIChyZW1vdmVkT2JqZWN0SW5kZXggIT0gLTEpIHsKLQkJCQlzZWN0aW9uTGlzdC5hZGQocmVtb3ZlZE9iamVjdEluZGV4LCBzZWN0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VjdGlvbkxpc3QuYWRkKHNlY3Rpb24pOwotCQkJfQotCQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQkJCXJlbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29udGVudEVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZVJlZmVyZW5jZXNDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxODk0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBiYXNlOwotCi0JcHJpdmF0ZSBNYXA8RmVhdHVyZVZhbHVlUGFpciwgT2JqZWN0PiBmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGNvbW1hbmQgdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIGluIDxjb2RlPnBsdWdpbjwvY29kZT4KLQkgKiB0aGF0IGFyZSBlbGVtZW50cyBvZiA8Y29kZT5iYXNlPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqLwotCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZChNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RQbHVnaW4gYmFzZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAgPSBuZXcgSGFzaE1hcDxGZWF0dXJlVmFsdWVQYWlyLCBPYmplY3Q+KCk7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgcGx1Z2luCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCWlmIChmICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpCi0JCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQobmV3IEZlYXR1cmVWYWx1ZVBhaXIoZiwgcmVmKSwKLQkJCQkJCXBsdWdpbik7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkvLyBpZ25vcmUgUHJvY2Vzc0VsZW1lbnQgYi9jIGl0IGNhbiByZWZlcmVuY2VzIGFueXRoaW5nCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlbGVtZW50Ci0JCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCi0JCQkJaWYgKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0JCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQoCi0JCQkJCQkJbmV3IEZlYXR1cmVWYWx1ZVBhaXIoZiwgcmVmKSwgZWxlbWVudCk7Ci0JCQkJCWlmKGYgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQoCi0JCQkJCQkJCW5ldyBGZWF0dXJlVmFsdWVQYWlyKGZlYXR1cmUsIGVsZW1lbnQuZUdldChmZWF0dXJlKSksIGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUZlYXR1cmVWYWx1ZVBhaXIgZnZQYWlyID0gKEZlYXR1cmVWYWx1ZVBhaXIpIGVudHJ5LmdldEtleSgpOwotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoZnZQYWlyLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIGVsZW1lbnQuZUdldChmdlBhaXIuZmVhdHVyZSkpCi0JCQkJCQkucmVtb3ZlKGZ2UGFpci52YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnQuZVNldChmdlBhaXIuZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlGZWF0dXJlVmFsdWVQYWlyIGZ2UGFpciA9IChGZWF0dXJlVmFsdWVQYWlyKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGZ2UGFpci5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBlbGVtZW50LmVHZXQoZnZQYWlyLmZlYXR1cmUpKS5hZGQoZnZQYWlyLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZ2UGFpci5mZWF0dXJlLCBmdlBhaXIudmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWJhc2UgPSBwbHVnaW4gPSBudWxsOwotCQlpZihmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAgIT0gbnVsbCkgewotCQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmVhdHVyZVZhbHVlUGFpciB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JCU9iamVjdCB2YWx1ZTsKLQotCQlGZWF0dXJlVmFsdWVQYWlyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmLCBPYmplY3QgdikgewotCQkJZmVhdHVyZSA9IGY7Ci0JCQl2YWx1ZSA9IHY7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRkYTNlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci0KLS8qKgotICogQSBjb21wb3VuZCBjb21tYW5kIHRoYXQgaXMgcmVzb3VyY2UgYXdhcmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIExpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCUxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLAotCQkJU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLAotCQkJTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwKLQkJCVN0cmluZyBkZXNjcmlwdGlvbiwgTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjbWQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNtZCkKLQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2MDgxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIERyYWdBbmREcm9wQ29tbWFuZCAKLWltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kCi17Ci0KLQlwcml2YXRlIFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICogQHBhcmFtIG9wdGltaXplCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgYm9vbGVhbiBvcHRpbWl6ZSkgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uLAotCQkJCW9wdGltaXplKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQlpZihkcm9wQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBUbmdVdGlsLmdldE1vZGlmaWVkUmVzb3VyY2VzKGRyb3BDb21tYW5kKTsKLQkJCX0KLQkJCWlmKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwgfHwgbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5ZDMxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgZXh0ZW5kcwotCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBvcHRpbWl6ZQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgaW50IGluZGV4LCBib29sZWFuIG9wdGltaXplKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBvcHRpbWl6ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgaW5kZXgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdClvd25lcikuZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kLmdldENvbW1hbmRMaXN0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY21kID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSghKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgJiYgY21kIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpIHsKLQkJCQljbWQgPSAoKENvbW1hbmRXcmFwcGVyKWNtZCkuZ2V0Q29tbWFuZCgpOwotCQkJfQotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbCgoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TYXZlU3RhdHVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2F2ZVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2Y1MDk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TYXZlU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIFRoZSBzdGF0dXMgb2YgYSBzYXZlIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNhdmVTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9FUlJPUiA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST0xMQkFDS19FUlJPUiA9IDI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhdmVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgcGx1Z2luSWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJc3VwZXIoc2V2ZXJpdHksIHBsdWdpbklkLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TZXRPcHBvc2l0ZUZlYXR1cmVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NGM2OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIE9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmU7Ci0KLQlwcml2YXRlIEVPYmplY3QgdmFsdWU7Ci0KLQlwcml2YXRlIEVPYmplY3Qgb2xkVmFsdWU7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZXRPcHBvc2l0ZUZlYXR1cmVDb21tYW5kKE1ldGhvZEVsZW1lbnQgZSwKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUsIEVPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5lbGVtZW50ID0gZTsKLQkJdGhpcy5vcHBvc2l0ZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKAotCQkJCQkoTWV0aG9kRWxlbWVudCkgdmFsdWUsIG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksCi0JCQkJCWVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFZhbHVlID0gKEVPYmplY3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkucmVtb3ZlKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRWYWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIG51bGwpOwotCQkJfQotCQkJaWYgKG9sZFZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkVmFsdWUuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSB2YWx1ZS5lR2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkpKQotCQkJCQkJLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWUuZVNldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLCBlbGVtZW50KTsKLQkJCX0KLQkJCWlmICh2YWx1ZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHZhbHVlLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkucmVtb3ZlKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIG51bGwpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBvbGRWYWx1ZS5lR2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkpKQotCQkJCQkJLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2xkVmFsdWUuZVNldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1VzZXJJbnB1dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1VzZXJJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJmM2JhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Vc2VySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBDbGFzcyB0aGF0IGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5wdXQgcmVxdWVzdCBhbmQgcmVmZXJlbmNlIHRvIHRoZQotICogaW5wdXQgdXNlciBzcGVjaWZpZWQgb3Igc2VsZWN0ZWQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVzZXJJbnB1dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVCA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT04gPSAxOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlOwotCi0JcHJpdmF0ZSBMaXN0IGNob2ljZXM7Ci0KLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCXByaXZhdGUgSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBjb250ZXh0OwotCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCXB1YmxpYyBVc2VySW5wdXQoU3RyaW5nIGxhYmVsLCBpbnQgdHlwZSwgYm9vbGVhbiBtdWx0aXBsZSwgTGlzdCBjaG9pY2VzLAotCQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIE9iamVjdCBjb250ZXh0KSB7Ci0JCXRoaXMobGFiZWwsIHR5cGUsIG11bHRpcGxlLCBjaG9pY2VzLCBsYWJlbFByb3ZpZGVyLCBudWxsLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqIEBwYXJhbSBjaG9pY2VzCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCBwcm92aWRlciB0byByZXByZXNlbnQgdGhlIGVsZW1lbnQgaW4gdGhlCi0JICogICAgICAgICAgICA8Y29kZT5jaG9pY2VzPC9jb2RlPiBsaXN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICAgICA8Y29kZT5jaG9pY2VzPC9jb2RlPiBsaXN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgdGhlIHZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgaW5wdXQKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgb2YgdGhlIHVzZXIgaW5wdXQgdGhhdCBpcyBjb21tYW5kLXNwZWNpZmljIGFuZCBjYW4KLQkgKiAgICAgICAgICAgIGNvbnRhaW4gYWRkaW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgaW5wdXQuCi0JICovCi0JcHVibGljIFVzZXJJbnB1dChTdHJpbmcgbGFiZWwsIGludCB0eXBlLCBib29sZWFuIG11bHRpcGxlLCBMaXN0IGNob2ljZXMsCi0JCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBjb250ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5tdWx0aXBsZSA9IG11bHRpcGxlOwotCQl0aGlzLmNob2ljZXMgPSBjaG9pY2VzOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaG9pY2VzKCkgewotCQlyZXR1cm4gY2hvaWNlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXBsZSgpIHsKLQkJcmV0dXJuIG11bHRpcGxlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFiZWwgcHJvdmlkZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsYWJlbCBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBJSXRlbUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHZhbGlkYXRvcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZXh0IG9mIHRoaXMgdXNlciBpbnB1dAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQ3Y2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGIzNTMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYW4gYWN0aXZpdHkgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCU9iamVjdCB0b3AgPSBnZXRUb3BJdGVtKCk7Ci0JCQlpZiAodG9wIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCXByb2Nlc3MgPSAoUHJvY2VzcykgdG9wOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gIGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lIAotCQkJfHwgKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkmJiAhVG5nVXRpbC5pc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KSBjaGlsZCkKLQkJCQkmJiBQcm9jZXNzVXRpbC5hY2NlcHQoKEFjdGl2aXR5KSBjaGlsZCwgZ2V0RmlsdGVyKCksIGZhbHNlKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJLy8gcmVtb3ZlIGFueSBzdXBwcmVzc2VkIGNoaWxkCi0JCS8vCi0JCVByb2Nlc3MgcHJvYyA9IGdldFByb2Nlc3MoKTsKLQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJLy8gZ2V0UHJvY2VzcygpIG1pZ2h0IHJldHVybiBudWxsIGlmIGdldENoaWxkcmVuKE9iamVjdCkgaXMgY2FsbGVkCi0JCQkvLyBvbiBiYXNlIGFjdGl2aXR5IHRvCi0JCQkvLyByZXRyaWV2ZSBpdHMgY2hpbGRyZW4KLQkJCS8vCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChjaGlsZCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpID09IFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQpIHsKLQkJCS8vIHJlZnJlc2ggcGFyZW50IGNvbnRlbnQKLQkJCS8vCi0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJZ2V0UGFyZW50KG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3ZmQ2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBiYXNlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBjbGFzcyBmb3IgdGhlIHN0YW5kYXJkIGNhdGVnb3JpZXMgaW4KLSAqIGEgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIExpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGg7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQotCXByb3RlY3RlZCBJRmlsdGVyIHVuY2F0ZWdvcml6ZWRGaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHVuY2F0ZWdvcml6ZWRMYWJlbDsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGNhdGVnb3JpemVkRmlsdGVyOwotCi0JcHJvdGVjdGVkIE9iamVjdCB1bmNhdGVnb3JpemVkSW1hZ2U7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQlwcml2YXRlIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgdW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgU3RyaW5nIG5hbWUsIE9iamVjdCBpbWFnZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCS8vIG1ldGhvZENvbmZpZy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMuY2F0ZWdvcnlQa2dQYXRoID0gY2F0ZWdvcnlQa2dQYXRoOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpIHsKLQkJaWYgKHVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciA9IG5ldyBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLCB1bmNhdGVnb3JpemVkRmlsdGVyLAotCQkJCQl1bmNhdGVnb3JpemVkTGFiZWwsIHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIHVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHRhcmdldDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQljYXRlZ29yeVBrZ1BhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsIC8qCi0JCQkJCQkJICogJiYKLQkJCQkJCQkgKiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKHBrZykKLQkJCQkJCQkgKi8pIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCA9IChDb250ZW50Q2F0ZWdvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGNhdGVnb3JpemVkRmlsdGVyLmFjY2VwdChlbGVtZW50KQotCQkJCQkJCSYmIChmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci5hY2NlcHQoZWxlbWVudCkgOiB0cnVlKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQkJCWl0ZXIubmV4dCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gT2JqZWN0IGFkYXB0ZXIgPQotCQkJLy8gKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQl9Ci0JCQkvLyBUaGlzIGlzIG5lZWQgZm9yY2luZyB0byBzZXQgdGhlIElDb25maWd1cmF0b3IgdG8gQ2hpbGRyZW5zCi0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpIHsKLQkJCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHVuY2F0ZWdvcml6ZWRGaWx0ZXIgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKGNyZWF0ZVVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnModGFyZ2V0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobWV0aG9kQ29uZmlnLCBlZGl0aW5nRG9tYWluLAotCQkJCXNpYmxpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJY2F0ZWdvcml6ZWRGaWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5jYXRlZ29yaXplZEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl1bmNhdGVnb3JpemVkRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuY2F0ZWdvcml6ZWRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdW5jYXRlZ29yaXplZExhYmVsID0gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5jYXRlZ29yaXplZEltYWdlKE9iamVjdCBpbWcpIHsKLQkJdW5jYXRlZ29yaXplZEltYWdlID0gaW1nOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjdhNmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNhcGFiaWxpdHkgUGF0dGVybnMiIGFuZCAiRGVsaXZlcnkKLSAqIFByb2Nlc3NlcyIgZm9sZGVycyBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JTGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBwa2dQYXRoOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsCi0JCQlTdHJpbmdbXSBwa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCWxhYmVsID0gbmFtZTsKLQkJdGhpcy5wa2dQYXRoID0gcGtnUGF0aDsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQlBcnJheUxpc3QgcHJvY1BrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBrZ1BhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsCi0JCQkJCSYmIG1ldGhvZENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuY29sbGVjdENoaWxkcmVuKGNoaWxkcmVuLAotCQkJCQkJCWVsZW1lbnQsIGZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFwcm9jUGtncy5pc0VtcHR5KCkpIHsKLQkJCWNoaWxkcmVuLmFkZEFsbCgwLCBwcm9jUGtncyk7Ci0KLQkJCS8vIFRPRE86IHNvcnQgYWxwaGFiZXRpY2FsbHksIHByb2Nlc3MgcGFja2FnZXMgYmVmb3JlIHByb2Nlc3NlcwotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudAotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJUHJvY2Vzc1V0aWwuc2V0UGFyZW50KGNoaWxkLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhtZXRob2RDb25maWcsIGVkaXRpbmdEb21haW4sCi0JCQkJc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NmFmMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ3VzdG9tIENhdGVnb3JpZXMiIGZvbGRlciBpbiB0aGUKLSAqIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBleHRlbmRzIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIEN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgU3RyaW5nIG5hbWUsIE9iamVjdCBpbWFnZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLCBuYW1lLCBpbWFnZSwgY2F0ZWdvcnlQa2dQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgdGFyZ2V0OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQlDdXN0b21DYXRlZ29yeSByb290ID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKTsKLQkJCWlmIChyb290ICE9IG51bGwgJiYgcGtnICE9IG51bGwKLQkJCQkJJiYgbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJvb3QuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLmFjY2VwdChlbGVtZW50KSA6IHRydWUpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNldCBwYXJlbnQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJCQlpdGVyLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTdkMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lIGdyb3VwaW5nIGluIHRoZSBDb25maWd1cmF0aW9uCi0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQotCQkvLyBUT0RPOiBjb21tZW50ZWQgb3V0IHVudGlsIEppbmh1YSBmaXhlZCBidWdzIGluIENvbmZpZ3VyYXRpb25GaWx0ZXIKLQkJaWYgKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNvbmZpZ3VyYXRvci5nZXRDaGlsZHJlbihvYmplY3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTogcmV0dXJuZWQgZnJvbSBjb25maWd1cmF0b3I6ICIgKyBjaGlsZHJlbik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQl9Ci0JCX0KLQotCQljaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCURpc2NpcGxpbmVHcm91cGluZyBncm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iamVjdDsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25mID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pICgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgZ2V0UGFyZW50KG9iamVjdCkpCi0JCQkJLmdldFRhcmdldCgpOwotCQlUbmdVdGlsLmFkZEV4dGVuZGVkQ2hpbGRyZW4oZ3JvdXBpbmcsIG1ldGhvZENvbmYsIGNoaWxkcmVuLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCQkJaXRlci5uZXh0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBmaWx0ZXI7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWYwOThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmYyNmJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkb21haW4gaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Eb21haW5JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9TdWJkb21haW5zKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZWQwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBndWlkYW5jZSBmb2xkZXJzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUdyb3VwQ29udGFpbmVyLCBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQSBtYXAgb2YgRUNsYXNzIC8gSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgZWFjaCB0eXBlIG9mIGd1aWRhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBjaGVja0xpc3RGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBDaGVja2xpc3Q7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBjb25jZXB0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gKChvYmogaW5zdGFuY2VvZiBDb25jZXB0KSAmJiAoIShvYmogaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKSkpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgZXhhbXBsZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEV4YW1wbGU7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBwcmFjdGljZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgcmVwb3J0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUmVwb3J0OwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgcmV1c2FibGVBc3NldEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQ7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciByb2FkbWFwRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUm9hZG1hcDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGd1aWRlbGluZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRlbXBsYXRlRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVGVtcGxhdGU7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB0ZXJtRGVmaW5pdGlvbkZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgdG9vbE1lbnRvckZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3I7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB3aGl0ZVBhcGVyRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcjsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQkvLyBjaGVja2xpc3QKLQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9DaGVja2xpc3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUd1aWRhbmNlSXRlbVByb3ZpZGVyIGNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLCBuYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihjaGVja0xpc3RGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIGNvbmNlcHQKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0NvbmNlcHRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0NvbmNlcHRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGNvbmNlcHRGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIGVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBleGFtcGxlCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9FeGFtcGxlcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19FeGFtcGxlcyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihleGFtcGxlRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBwcmFjdGljZQotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvUHJhY3RpY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1ByYWN0aWNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihwcmFjdGljZUZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gUmVwb3J0Ci0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9SZXBvcnRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JlcG9ydHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIocmVwb3J0RmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBSZXVzYWJsZSBBc3NldAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIocmV1c2FibGVBc3NldEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gUmV1c2FibGUgQXNzZXQKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1JvYWRtYXBzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JvYWRtYXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIocm9hZG1hcEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gU3VwcG9ydGluZyBNYXRlcmlhbAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gLy8gVGVjaG5pcXVlCi0JCQkvLyBpbWFnZSA9Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UZWNobmlxdWVzIik7Ci0JCQkvLyBuYW1lID0KLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzIik7Ci0JCQkvLyBjaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJLy8gbmFtZSwgaW1hZ2UpOwotCQkJLy8gY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIodGVjaG5pcXVlRmlsdGVyKTsKLQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBUZW1wbGF0ZQotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvVGVtcGxhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlbXBsYXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0ZW1wbGF0ZUZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gVGVybSBEZWZpbml0aW9uCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHRlcm1EZWZpbml0aW9uRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBUb29sIE1lbnRvcgotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvVG9vbE1lbnRvcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIodG9vbE1lbnRvckZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gV2hpdGVwYXBlcgotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvV2hpdGVwYXBlcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIod2hpdGVQYXBlckZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gR3VpZGVsaW5lcwotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihndWlkZWxpbmVGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCX0KLQkJCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJLy8gU2hvdWxkIGZpbHRlciBvbmx5IGNvcHkgb25seSwgbm90IG9yZ2luYWwgY2FjaGVkIGNoaWxkcmVuIGxpc3QuCi0JCQlMaXN0IGNvcHkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljb3B5LmFkZEFsbChjaGlsZHJlbik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29weS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2VJdGVtUHJvdmlkZXIgb2JqID0gKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBpdGVyYXRvcgotCQkJCQkJLm5leHQoKTsKLQkJCQlvYmouc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJaWYgKG9iai5nZXRDaGlsZHJlbihvYmopLmlzRW1wdHkoKSkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY29weTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjOThmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGd1aWRhbmNlIHNwZWNpZmljIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ3VpZGFuY2VGaWx0ZXI7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHVibGljIGNsYXNzIENvbXBhcmVCeU5hbWUgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0JCQlTdHJpbmcgbmFtZTEgPSAoKE1ldGhvZEVsZW1lbnQpIG9iajEpLmdldE5hbWUoKTsKLQkJCVN0cmluZyBuYW1lMiA9ICgoTWV0aG9kRWxlbWVudCkgb2JqMikuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIG5hbWUxLmNvbXBhcmVUb0lnbm9yZUNhc2UobmFtZTIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgU3RyaW5nIG5hbWUsIE9iamVjdCBpbWFnZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCS8vIG1ldGhvZENvbmZpZy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCWxhYmVsID0gbmFtZTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHRhcmdldDsKLQotCQlBcnJheUxpc3QgZmlsdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGd1aWRhbmNlRmlsdGVyICE9IG51bGwpIHsKLQkJCWZpbHRlckxpc3QuYWRkKGd1aWRhbmNlRmlsdGVyKTsKLQkJfQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZpbHRlckxpc3QuYWRkKGZpbHRlcik7Ci0JCX0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCgKLQkJCQltZXRob2RDb25maWcsIGZpbHRlckxpc3QpOwotCQlMaXN0IGVsZW1lbnRzID0gZWxlbWVudExpc3QuZ2V0TGlzdCgpOwotCi0JCS8vIHNvcnQgYnkgbmFtZQotCQlDb2xsZWN0aW9ucy5zb3J0KGVsZW1lbnRzLCBuZXcgQ29tcGFyZUJ5TmFtZSgpKTsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG1ldGhvZENvbmZpZywgZWRpdGluZ0RvbWFpbiwKLQkJCQlzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEd1aWRhbmNlRmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCWd1aWRhbmNlRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4OWVmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuYnJlYWtkb3duZWxlbWVudC5NaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RwbHVnaW5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkKLQkgKi8KLQkvKgotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBhZGFwdGVyID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJYWRhcHRlci5zZXRNb2RlbFN0cnVjdHVyZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxUKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCSovCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RwbHVnaW5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJaWYgKGRvbWFpbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkb21haW5JdGVtUHJvdmlkZXIgPSBuZXcgRG9tYWluSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRvbWFpbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlU2V0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmFjdGljZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OTM0ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogS2VlcHMgdHJhY2sgb2YgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgewotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgTGlzdCBmaWx0ZXJMaXN0OwotCi0JcHJvdGVjdGVkIGNsYXNzIEVsZW1lbnRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHsKLQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMjkxNDM4OTcwMTIzOTg1OTA2TDsKLQotCQlwcm90ZWN0ZWQgRWxlbWVudEl0ZXJhdG9yKENvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJCXN1cGVyKGNvbnRlbnRQa2csIGZhbHNlKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KE9iamVjdCBvYmplY3QpIHsKLQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQkJaW50IHNpemUgPSBwYWNrYWdlcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCQkJJiYgbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhvYmopKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihjaGVja0FjY2VwdGFuY2UoKSkgewotCQkJCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCQlzaXplID0gZWxlbWVudHMuc2l6ZSgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCQkJCWlmIChhY2NlcHQob2JqKSkgewotCQkJCQkJCWNoaWxkcmVuLmFkZChvYmopOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGlsZHJlbi5hZGRBbGwocGtnLmdldENvbnRlbnRFbGVtZW50cygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuTGlzdChvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JfTsKLQkKLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCQl0aGlzLmZpbHRlckxpc3QgPSBmaWx0ZXJMaXN0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXB0YW5jZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqZWN0KSB7Ci0JCWludCBzaXplID0gZmlsdGVyTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IChJRmlsdGVyKSBmaWx0ZXJMaXN0LmdldChpKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChvYmplY3QpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIG5ld0l0ZXJhdG9yKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRJdGVyYXRvcihwa2cpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBbGxFbGVtZW50cyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotCQlmb3IoSXRlcmF0b3IgaXRlciA9IG5ld0l0ZXJhdG9yKHBrZyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmKCEoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCWxpc3QuYWRkKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWdldEFsbEVsZW1lbnRzKHBrZywgbGlzdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjA1OTMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldHNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIENvbmZpZ3VyYXRpb24KLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlHcm91cENvbnRhaW5lciwgSUNvbmZpZ3VyYWJsZSwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JLy8gY2hhbmdlZCB0byBwcm90ZWN0ZWQsIGV4dGVuZGVkIGNsYXNzIGNhbiBwbGF5IHdpdGggY2hpbGRyZW4gdmFyaWFibGUuCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgSUZpbHRlciBkaXNjaXBsaW5lc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCA9IChDb250ZW50Q2F0ZWdvcnkpIG9iajsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5hY2NlcHQoZWxlbWVudCkgLyoKLQkJCQkJCQkJCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkJCQkJCQkJICogZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCQkJCQkgKi87Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBkb21haW5GaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJLy8gQnJvd3Npbmc6IFdpdGggY2F0ZWdvcmllcywgcmVwbGFjZSBnZW5lcmFsaXphdGlvbgotCQkJLy8gY2F1c2VzIGJvdGggcmVwbGFjZW1lbnQgYW5kIGJhc2UgdG8gYmVjb21lIGludmlzaWJsZSB0byBicm93c2luZwotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERvbWFpbiAvKgotCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkgKiAoKERvbWFpbilvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgd29ya1Byb2R1Y3RUeXBlc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlIC8qCi0JCQkJCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkJCQkgKiAoKFdvcmtQcm9kdWN0VHlwZSlvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCQkJCQkgKi87Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgcm9sZVNldHNGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJLy8gQnJvd3Npbmc6IFdpdGggY2F0ZWdvcmllcywgcmVwbGFjZSBnZW5lcmFsaXphdGlvbgotCQkJLy8gY2F1c2VzIGJvdGggcmVwbGFjZW1lbnQgYW5kIGJhc2UgdG8gYmVjb21lIGludmlzaWJsZSB0byBicm93c2luZwotCQkJcmV0dXJuIFJvbGVTZXRzSXRlbVByb3ZpZGVyLmFjY2VwdChvYmopIC8qCi0JCQkJCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkJCQkgKiAoKFZhcmlhYmlsaXR5RWxlbWVudClvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCQkJCQkgKi87Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB0b29sc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbCAvKgotCQkJCQkJCQkJCSAqICYmCi0JCQkJCQkJCQkJICogKChUb29sKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgY3VzdG9tQ2F0ZWdvcmllc0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkJCS5hY2NlcHQob2JqKSAvKgotCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCSAqICgoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkgKi87Ci0JCX0KLQotCX07Ci0JCi0JLy8gdXBjYXRlZ29yaXplZCBmaWx0ZXJzIGNhbiBiZSByZXNldCBiYXNlZCBvbiBjb25maWd1cmF0b3IuCi0JcHJpdmF0ZSBJRmlsdGVyIHVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUYXNrCi0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKChUYXNrKSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciBkb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Ci0JCQkJCSYmICFBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgb2JqKS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgd3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdAotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXRXb3JrUHJvZHVjdFR5cGVzKChXb3JrUHJvZHVjdCkgb2JqKQotCQkJCQkJCS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGUKLQkJCQkJJiYgQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldHMoKFJvbGUpIG9iaikuaXNFbXB0eSgpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJRmlsdGVyIHVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcgotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXRUb29scygoVG9vbE1lbnRvcikgb2JqKS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JvdXBJdGVtUHJvdmlkZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAuY2xlYXIoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbnVsbDsKLQkJfQotCi0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQkJY2hpbGRyZW4gPSBudWxsOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkvLyByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldwotCQkvLyBPYmplY3RMaW5rSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIChOb3RpZmllcikgb2JqZWN0KSk7Ci0JCS8vIH0KLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBjb25mID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCS8vICgoT2JqZWN0TGlua0l0ZW1Qcm92aWRlcikgb2JqZWN0KS5nZXRMaW5rZWRPYmplY3QoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25mID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iamVjdDsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nIG5hbWU7Ci0JCQlPYmplY3QgdW5jYXRlZ29yaXplZEltYWdlOwotCQkJQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBjaGlsZDsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwKLQkJCQkJY29uZiwKLQkJCQkJbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFza3NfY2Z2IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEZpbHRlcih1bmNhdGVnb3JpemVkVGFza0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcihkaXNjaXBsaW5lc0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkTGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJdW5jYXRlZ29yaXplZEltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Rhc2tzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RvbWFpbnMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEZpbHRlcihkb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIpOwotCQkJdW5jYXRlZ29yaXplZEltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkSW1hZ2UodW5jYXRlZ29yaXplZEltYWdlKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKGRvbWFpbkZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsCi0JCQkJCW5hbWUsIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHdwVHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcik7Ci0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIod29ya1Byb2R1Y3RUeXBlc0ZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb25mLCBuYW1lLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEZpbHRlcih1bmNhdGVnb3JpemVkUm9sZUZpbHRlcik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcihyb2xlU2V0c0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkTGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJdW5jYXRlZ29yaXplZEltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb25mLCBuYW1lLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIodG9vbHNGaWx0ZXIpOwotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEZpbHRlcih1bmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlcik7Ci0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQlPYmplY3Qgb3RoZXJDaGlsZCA9IG5ldyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQpOwotCQkJY2hpbGRyZW4uYWRkKG90aGVyQ2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIG90aGVyQ2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBhY2thZ2VzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQkJY2hpbGQuc2V0UGFyZW50KGNvbmYpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIoY3VzdG9tQ2F0ZWdvcmllc0ZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQlHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGNoaWxkMSA9IG5ldyBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgY29uZik7Ci0JCQljaGlsZDEuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQxKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZDEpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihvYmplY3QpOwotCS8vIH0KLQkvLyAgICAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJCi0JCWlmICggKGZpbHRlciAhPSBjb25maWd1cmF0b3IpICYmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSApIHsKLQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBmaWx0ZXI7Ci0JCQlpZiAoIGNvbmZpZ3VyYXRvciAhPSBudWxsICkgewkJCQotCQkJCS8vIGNyZWF0ZSB0aGUgdW5jYXRlZ29yaXplZCBmaWx0ZXJzLiBJZiBJQ29uZmlndXJhdG9yIGlzIHNldCwgZ2V0IHRoZSBmaWxkZXJzIGZyb20gdGhlcmUuCi0JCQkJLy8gb3RoZXJ3aXplLCB1c2UgdGhlIGRlZmF1bHQgb25lLgotCQkJCS8vIFRoaXMgaXMgbmVlZGVkIHRvIGFsbG93IGV4dHJhIHVuY2F0ZWdvcml6ZWQgZWxlbWVudHMgZHVlIHRvIHJlYWxpemF0aW9uIAotCQkJCS8vIHRvIHNob3cgdXAgaW4gdGhlIHVuLWNhdGVnb3JpemVkIGZvbGRlci4KLQkJCQkvLyBGb3IgZXhhbXBsZSwgaWYgYSBkaXNjaXBsZSBpcyByZXBsYWNlZCBieSBhbm90aGVyLCB0aGUgdGFza3MgaW4gdGhlIHJlcGxhY2VkIGRpc2NpcGxpZQotCQkJCS8vIHNob3VsZCBzaG93IHVwIGluIHRoZSB1bi1jYXRlZ29yaXplZCB0YXNrcyBmb2xkZXIKLQkJCQkvLyAxNTY0MzggLSBWYXJpYWJpbGl0eSBvZiBkaXNjaXBsaW5lcyBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHkKLQkJCQkKLQkJCQl1bmNhdGVnb3JpemVkVGFza0ZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRVbmNhdGVnb3JpemVkVGFza0ZpbHRlcigpOwotCQkJCWRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXREb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkJCQl3cFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIgPSBjb25maWd1cmF0b3IuZ2V0V3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JCQkJdW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIgPSBjb25maWd1cmF0b3IuZ2V0VW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIoKTsKLQkJCQl1bmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRVbmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlcigpOwotCQkJCQotCQkJCS8vIFtCdWcgMTYyNjAzXSBOZXc6IFJlcGxhY2luZyBkaXNjaXBsaW5lcyBkbyBhcHBlYXIgaW5zaWRlIHRoZWlyIHJlcGxhY2VkIGVsZW1lbnRzIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIGFzIHdlbGwgYXMgb3V0c2lkZSBvZiB0aGUgZGlzY2lwbGluZSBncm91cGluZwotCQkJCS8vIG5lZWQgdG8gY3VzdG9taXplIHRoZSBmaWx0ZXJzIGZvciBkaXNjaXBsaW5lcyBhbmQgcm9sZXNldHMKLQkJCQlkaXNjaXBsaW5lc0ZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXREaXNjaXBsaW5lc0ZpbHRlcigpOwotCQkJCXJvbGVTZXRzRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFJvbGVTZXRzRmlsdGVyKCk7Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCS8vIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gcGx1Z2luOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQljb25maWd1cmF0b3Iubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGIzOTc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByYWN0aWNlLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUk9BRE1BUCA9ICJyb2FkbWFwIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBDQVRFR09SSUVTID0gImNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVOS05PV04gPSAidW5rbm93biI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBQcmFjdGljZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRNb2RpZmllZENoaWxkcmVuKE9iamVjdCBwYXJlbnRPYmplY3QsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJR3JvdXBpbmdIZWxwZXIgZ3JvdXBpbmdIZWxwZXIgPSBuZXcgR3JvdXBpbmdIZWxwZXIodGhpcyk7Ci0JCWdyb3VwaW5nKHBhcmVudE9iamVjdCwgcmV0LCBjaGlsZHJlbiwgZ3JvdXBpbmdIZWxwZXIpOwotCQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIExpc3QgcmV0LCBDb2xsZWN0aW9uIGNoaWxkcmVuLCAKLQkJCUdyb3VwaW5nSGVscGVyIGdyb3VwaW5nSGVscGVyKSB7Ci0JCU1hcDxTdHJpbmcsIExpc3Q+IG1hcCA9IGdldFN1Ykdyb3VwTWFwKGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQotCQlib29sZWFuIHRvU29ydCA9IHRydWU7Ci0JCWlmIChwYXJlbnRPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgcGFyZW50T2JqZWN0OwotCQkJaWYgKGVsZW0gIT0gbnVsbCkgewotCQkJCXRvU29ydCA9ICEgQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGVsZW0pOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIGtleXMgPSBncm91cGluZ0hlbHBlci5nZXRLZXlzSW5PcmRlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBrZXkgPSBrZXlzW2ldOwotCQkJTGlzdCBzdWJncm91cENoaWxkcmVuID0gbWFwLmdldChrZXkpOwotCQkJaWYgKHN1Ymdyb3VwQ2hpbGRyZW4gPT0gbnVsbCB8fCBzdWJncm91cENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGdyb3VwaW5nSGVscGVyLnRvR3JvdXAoa2V5LCBzdWJncm91cENoaWxkcmVuKSkgewotCQkJCWlmICh0b1NvcnQpIHsKLQkJCQkJc29ydChzdWJncm91cENoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJc3ViZ3JvdXBDaGlsZHJlbiA9IGdyb3VwaW5nSGVscGVyLm5lc3RlZEdyb3VwaW5nKHBhcmVudE9iamVjdCwga2V5LCBzdWJncm91cENoaWxkcmVuKTsKLQkJCQlQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyIHN1YiA9IG5ldyBQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKAotCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSwga2V5LCBnZXRJbWFnZU9iamVjdChrZXkpLCBzdWJncm91cENoaWxkcmVuLCBwYXJlbnRPYmplY3QpOwotCQkJCXJldC5hZGQoc3ViKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRvU29ydCkgewotCQkJCQlzb3J0KHN1Ymdyb3VwQ2hpbGRyZW4pOwotCQkJCX0KLQkJCQlyZXQuYWRkQWxsKHN1Ymdyb3VwQ2hpbGRyZW4pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoTGlzdCBzdWJncm91cENoaWxkcmVuKSB7Ci0JCWlmIChzdWJncm91cENoaWxkcmVuLnNpemUoKSA+IDEpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48RnVsZmlsbGFibGVFbGVtZW50PnNvcnQoc3ViZ3JvdXBDaGlsZHJlbiwgY29tcGFyYXRvcik7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTGlzdD4gZ2V0U3ViR3JvdXBNYXAoQ29sbGVjdGlvbiBjaGlsZHJlbiwgR3JvdXBpbmdIZWxwZXIgZ3JvdXBpbmdIZWxwZXIpIHsKLQkJIE1hcDxTdHJpbmcsIExpc3Q+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgTGlzdD4oKTsgCi0JCQotCQlmb3IgKE9iamVjdCBjaGlsZDogY2hpbGRyZW4pIHsKLQkJCVN0cmluZyBrZXkgPSBncm91cGluZ0hlbHBlci5nZXRTdWJHcm91cE5hbWUoY2hpbGQpOwotCQkJYWRkKG1hcCwga2V5LCBjaGlsZCk7Ci0JCX0JCQkJCi0JCQotCQlyZXR1cm4gbWFwOwotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRJbWFnZU9iamVjdChTdHJpbmcgc3ViR3JvdXBOYW1lKSB7Ci0JCQotCQlTdHJpbmcgaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9Gb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAodHJ1ZSkgewkJCi0JCQlpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX0tleV9Db25jZXB0cyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9Db25jZXB0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX1dvcmtQcm9kdWN0c19ncm91cCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9UYXNrc19ncm91cCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9UYXNrcyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX1JvbGVzX2dyb3VwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1JvbGVzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfQWN0aXZpdGllc19ncm91cCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9Qcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfZ3JvdXAiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJLy9HdWlkYW5jZSBzdWIgZ3JvdXBzCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9DaGVja2xpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX0V4YW1wbGVzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L0V4YW1wbGVzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1ByYWN0aWNlcyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9QcmFjdGljZXMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmVwb3J0cyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9SZXBvcnRzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1JldXNhYmxlQXNzZXRzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvVGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1Rvb2xNZW50b3JzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBpbWFnZVN0ciA9PSBudWxsID8gbnVsbCA6IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKGltYWdlU3RyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVJU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkKE1hcDxTdHJpbmcsIExpc3Q+IG1hcCwgU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUxpc3QgbGlzdCA9IG1hcC5nZXQoa2V5KTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW1hcC5wdXQoa2V5LCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZCh2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJhY3RpY2VJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgcGFyZW50ID0gVG5nVXRpbAotCQkJCS5nZXROYXZpZ2F0b3JQYXJlbnRJdGVtUHJvdmlkZXIoKEd1aWRhbmNlKSBvYmplY3QpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1ByYWN0aWNlX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkgIT0gbnVsbCkgewotCQkJCVVSSSBpbWdVcmkgPSBUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoCi0JCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QsCi0JCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpKTsKLQkJCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFNoYXJlZEltYWdlKGltZ1VyaSk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCXJldHVybiBpbWFnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBHcm91cGluZ0hlbHBlciB7Ci0JCQotCQlwcml2YXRlIE9iamVjdCBncm91cGVyOwotCQkKLQkJcHVibGljIEdyb3VwaW5nSGVscGVyKE9iamVjdCBncm91cGVyKSB7Ci0JCQl0aGlzLmdyb3VwZXIgPSBncm91cGVyOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEdyb3VwZXIoKSB7Ci0JCQlyZXR1cm4gZ3JvdXBlcjsKLQkJfQkJCi0JCQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1Ykdyb3VwTmFtZShPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCXJldHVybiBST0FETUFQOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9LZXlfQ29uY2VwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfVGFza3NfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9Sb2xlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9BY3Rpdml0aWVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewkJCQotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7CQkJCi0JCQkJcmV0dXJuIENBVEVHT1JJRVM7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBVTktOT1dOOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0S2V5c0luT3JkZXIoKSB7Ci0JCQlTdHJpbmdbXSBrZXlzID0gewotCQkJCQlST0FETUFQLAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0tleV9Db25jZXB0cyIpLAkvLyROT04tTkxTLTEkCi0JCQkJCWdldFVJU3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RzX2dyb3VwIiksCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9UYXNrc19ncm91cCIpLAkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9BY3Rpdml0aWVzX2dyb3VwIiksCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9Sb2xlc19ncm91cCIpLAkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfZ3JvdXAiKSwJCS8vJE5PTi1OTFMtMSQKLQkJCQkJQ0FURUdPUklFUywKLQkJCQkJVU5LTk9XTgotCQkJfTsKLQkJCQotCQkJcmV0dXJuIGtleXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHRvR3JvdXAoU3RyaW5nIGtleSwgTGlzdCBzdWJncm91cENoaWxkcmVuKSB7Ci0JCQlpZiAoa2V5LmVxdWFscyhST0FETUFQKSB8fCAKLQkJCQlrZXkuZXF1YWxzKENBVEVHT1JJRVMpIHx8Ci0JCQkJa2V5LmVxdWFscyhVTktOT1dOKSB8fAotCQkJCXN1Ymdyb3VwQ2hpbGRyZW4uc2l6ZSgpIDwgMykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdDw/PiBuZXN0ZWRHcm91cGluZyhPYmplY3QgcGFyZW50T2JqZWN0LCBTdHJpbmcga2V5LCBMaXN0PD8+IHN1Ymdyb3VwQ2hpbGRyZW4pIHsKLQkJCWlmICghIGtleS5lcXVhbHMoUHJhY3RpY2VJdGVtUHJvdmlkZXIuZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfZ3JvdXAiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBzdWJncm91cENoaWxkcmVuOwotCQkJfQotCQkJCi0JCQlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCi0JCQlHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlciA9IG5ldyBHdWlkYW5jZUdyb3VwaW5nSGVscGVyKGdyb3VwZXIpOwotCQkJZ3JvdXBpbmcocGFyZW50T2JqZWN0LCByZXQsIHN1Ymdyb3VwQ2hpbGRyZW4sIGdyb3VwaW5nSGVscGVyKTsKLQkJCQotCQkJcmV0dXJuIHJldDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgZ3JvdXBpbmcoT2JqZWN0IHBhcmVudE9iamVjdCwgTGlzdCByZXQsCi0JCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiwgR3JvdXBpbmdIZWxwZXIgZ3JvdXBpbmdIZWxwZXIpIHsKLQkJCWlmIChncm91cGVyIGluc3RhbmNlb2YgUHJhY3RpY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKFByYWN0aWNlSXRlbVByb3ZpZGVyKSBncm91cGVyKS5ncm91cGluZyhwYXJlbnRPYmplY3QsIHJldCwKLQkJCQkJCWNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEd1aWRhbmNlR3JvdXBpbmdIZWxwZXIgZXh0ZW5kcyBHcm91cGluZ0hlbHBlciB7Ci0JCXB1YmxpYyBHdWlkYW5jZUdyb3VwaW5nSGVscGVyKE9iamVjdCBncm91cGVyKSB7Ci0JCQlzdXBlcihncm91cGVyKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdWJHcm91cE5hbWUoT2JqZWN0IG9iaikgewotCQkJCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXhhbXBsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1ByYWN0aWNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JlcG9ydHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19SZXVzYWJsZUFzc2V0cyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlbXBsYXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlyZXR1cm4gVU5LTk9XTjsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0S2V5c0luT3JkZXIoKSB7Ci0JCQlTdHJpbmdbXSBrZXlzID0gewotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzIiksCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXhhbXBsZXMiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19QcmFjdGljZXMiKSwJCQkvLyROT04tTkxTLTEkCi0JCQkJCWdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JlcG9ydHMiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19SZXVzYWJsZUFzc2V0cyIpLAkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscyIpLAkJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXMiKSwJCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnMiKSwJCS8vJE5PTi1OTFMtMSQKLQkJCQkJVU5LTk9XTgkJCQkKLQkJCX07Ci0JCQkKLQkJCXJldHVybiBrZXlzOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB0b0dyb3VwKFN0cmluZyBrZXksIExpc3Qgc3ViZ3JvdXBDaGlsZHJlbikgewotCQkJaWYgKGtleS5lcXVhbHMoVU5LTk9XTikgfHwgCi0JCQkJc3ViZ3JvdXBDaGlsZHJlbi5zaXplKCkgPCAzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0PD8+IG5lc3RlZEdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIFN0cmluZyBrZXksIExpc3Q8Pz4gc3ViZ3JvdXBDaGlsZHJlbikgewotCQkJcmV0dXJuIHN1Ymdyb3VwQ2hpbGRyZW47Ci0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NmMTRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci0KLS8qKgotICogVGhlIGJhc2UgaXRlbSBwcm92aWRlciBhZGFwdGVyIGNsYXNzIGZvciB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBpbgotICogYSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQkKLQlwcml2YXRlIExpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQkKLQlwcml2YXRlIFByYWN0aWNlIHByYWN0aWNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCVN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsIExpc3QgY2hpbGRyZW4sIE9iamVjdCBwYXJlbnRPYmplY3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCQlpZiAocGFyZW50T2JqZWN0IGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCXByYWN0aWNlID0gKFByYWN0aWNlKSBwYXJlbnRPYmplY3Q7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGlsZHJlbiA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIFByYWN0aWNlIGdldFByYWN0aWNlKCkgewotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjYzYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fTkFNRToKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAocGMuZ2V0UHJvY2VzcygpICE9IG51bGwpIHsKLQkJCQlib29sZWFuIG9sZCA9IHBjLmdldFByb2Nlc3MoKS5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5zZXROYW1lKHBjLmdldE5hbWUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKG9sZCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDgwNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBwYWNrYWdlIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChQcm9jZXNzIHByb2Nlc3MpIHsKLQkJcmV0dXJuICFUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKHByb2Nlc3MpCi0JCQkJJiYgIXByb2Nlc3MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb2xsZWN0Q2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgT2JqZWN0IGVsZW1lbnQsCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9ICgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKS5yZXNvbHZlKHByb2Nlc3MpOwotCQkJCQlpZiAoIWNoaWxkcmVuLmNvbnRhaW5zKGNoaWxkKSAmJiBmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KHByb2Nlc3MpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwcm9jZXNzKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb2xsZWN0Q2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgZWxlbWVudCwgZmlsdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgaXRlci5uZXh0KCkpOwotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudCBmb3IgdGhlIGNvbGxlY3RlZCBjaGlsZHJlbgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJUHJvY2Vzc1V0aWwuc2V0UGFyZW50KGNoaWxkLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWlmIChjb2xsZWN0Q2hpbGRyZW4oY2hpbGRyZW4sIGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCSgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzY2E5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJQcm9jZXNzZXMiIGZvbGRlciBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1vZGVsU3RydWN0KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKSB7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJfQotCi0JCQlmaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCQkJCX0KLQotCQkJfTsKLQotCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQlDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBjaGlsZCA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsCi0JCQkJCW1vZGVsU3RydWN0LmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQljaGlsZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCW1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsIG1vZGVsU3RydWN0LmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCQkJY2hpbGQuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkYmQ3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUgc2V0IGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1VuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5ZjliNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIHVuY2F0ZWdvcml6ZWQgZm9sZGVycyBhbmQgZWxlbWVudHMgaW4gdGhlCi0gKiBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJvdGVjdGVkIExpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZEZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBJRmlsdGVyIGZpbHRlciwgU3RyaW5nIGxhYmVsLAotCQkJT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCXRoaXMudW5jYXRlZ29yaXplZEZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoCi0JCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QobWV0aG9kQ29uZmlnLCBmaWx0ZXJMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVGaWx0ZXJMaXN0KCkgewotCQlBcnJheUxpc3QgZmlsdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHVuY2F0ZWdvcml6ZWRGaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQodW5jYXRlZ29yaXplZEZpbHRlcik7Ci0JCX0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZChmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJMaXN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdChjcmVhdGVGaWx0ZXJMaXN0KCkpCi0JCQkJLmdldExpc3QoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFsd2F5cyByZXR1cm4gdHJ1ZSB0byBhdm9pZCBleHBlbnNpdmUgY2FsbCB0byBnZXRDaGlsZHJlbigpIHRoYXQgd2FsawotCQkvLyB0aHJ1IHRoZQotCQkvLyB3aG9sZSBsaWJyYXJ5IHRvIGZpbmQgYWxsIHRoZSB0YXNrcyB0aGF0IGlzIG5vdCBhc3NpZ25lZCB0byBhbnkKLQkJLy8gZGlzY2lwbGluZS4KLQkJLy8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsKQotCQkJcmV0dXJuIGltYWdlOwotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzAyNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLldyYXBwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJXb3JrIFByb2R1Y3QgS2luZHMiIGZvbGRlciBpbiB0aGUKLSAqIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlciBleHRlbmRzIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlLCBjYXRlZ29yeVBrZ1BhdGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXIjY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJdGhpcy51bmNhdGVnb3JpemVkRmlsdGVyLCB0aGlzLnVuY2F0ZWdvcml6ZWRMYWJlbCwKLQkJCQl0aGlzLnVuY2F0ZWdvcml6ZWRJbWFnZSkgewotCQkJZmluYWwgY2xhc3MgRWxlbWVudExpc3QgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgewotCi0JCQkJLyoqCi0JCQkJICogQHBhcmFtIG1ldGhvZENvbmZpZwotCQkJCSAqIEBwYXJhbSBmaWx0ZXJMaXN0Ci0JCQkJICovCi0JCQkJcHVibGljIEVsZW1lbnRMaXN0KE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJCQkJTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCQkJCXN1cGVyKG1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0I25ld0l0ZXJhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UpCi0JCQkJICovCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIG5ld0l0ZXJhdG9yKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRJdGVyYXRvcihwa2cpIHsKLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjMwNzEzNjMwNzY1NzM1OTI4Mkw7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdC5FbGVtZW50SXRlcmF0b3IjZ2V0Q2hpbGRyZW5MaXN0KGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuTGlzdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJTGlzdCBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuTGlzdChvYmplY3QpOwotCQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCQljaGlsZHJlbi5hZGRBbGwoKChBcnRpZmFjdCkgb2JqZWN0KQotCQkJCQkJCQkJCS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QjY2hlY2tBY2NlcHRhbmNlKCkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0FjY2VwdGFuY2UoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBzdXBlckFjY2VwdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBzdXBlci5hY2NlcHQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQkvLyBrZWVwcyB3cmFwcGVycyBvZiBhcnRpZmFjdHMgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSB3b3JrCi0JCQkvLyBwcm9kdWN0IHR5cGUKLQkJCS8vCi0JCQlwcml2YXRlIFdyYXBwZXJNYW5hZ2VyIHdyYXBwZXJNYW5hZ2VyID0gbmV3IFdyYXBwZXJNYW5hZ2VyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLldyYXBwZXJNYW5hZ2VyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsCi0JCQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCXJldHVybiBuZXcgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIodmFsdWUsIG93bmVyLAotCQkJCQkJCW51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkvKgotCQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkJICogCi0JCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQkvLyBTdWItYXJ0aWZhY3QgY2FuIGhhdmUgYSBkaWZmZXJlbnQgc2V0IG9mIHdvcmsKLQkJCQkJCQkvLyBwcm9kdWN0IHR5cGVzIHRoYW4gdGhlIGNvbnRhaW5pbmcgYXJ0aWZhY3QuCi0JCQkJCQkJLy8gRG8gbm90IHNob3cgdGhlIGNvbXBvc2l0aW9uIGhpZXJhcmNoaWVzIGluIHRoZQotCQkJCQkJCS8vIFdvcmsgUHJvZHVjdCBUeXBlIHRyZWUgYnJvd3NlcnMgaW4gTGliLiBOYXYuCi0JCQkJCQkJLy8gYW5kIENvbmZpZy4gRXhwbG9yZXIuIFNob3cgdGhlbSBpbiBmbGF0IGxpc3RzCi0JCQkJCQkJLy8gYWNjb3JkaW5nIHRvIHRoZWlyIGNhdGVnb3JpemF0aW9ucyBpbnN0ZWFkLgotCQkJCQkJCS8vCi0JCQkJCQkJLy8gVGhpcyBpcyBub3QgdHJ1ZSBmb3IgRG9tYWlucywgd2hpY2ggc2hvdWxkIHNob3cKLQkJCQkJCQkvLyB0aGUgYXJ0aWZhY3QgbmVzdGluZyEKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQkJCX0KLQotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkJCQkJICovCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIjY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGphdmEudXRpbC5MaXN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0IGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCgKLQkJCQkJTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBFbGVtZW50TGlzdChtZXRob2RDb25maWcsIGZpbHRlckxpc3QpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlFbGVtZW50TGlzdCBlbGVtZW50TGlzdCA9IChFbGVtZW50TGlzdCkgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGNyZWF0ZUZpbHRlckxpc3QoKSk7Ci0JCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGVsZW1lbnRMaXN0LmdldExpc3QoKTsKLQkJCQlBcnJheUxpc3QgYXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudExpc3Quc3VwZXJBY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQlhcnRpZmFjdHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXdyYXBwZXJNYW5hZ2VyLnVwZGF0ZShhcnRpZmFjdHMpOwotCQkJCWNoaWxkcmVuLmFkZEFsbCh3cmFwcGVyTWFuYWdlci5nZXRXcmFwcGVycygpKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl3cmFwcGVyTWFuYWdlci5kaXNwb3NlKCk7Ci0JCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3N2RmYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjZjYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFuIGFydGlmYWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQXJ0aWZhY3RJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqZWN0OwotCQlpZiAoYXJ0aWZhY3QgIT0gbnVsbCAmJiBhcnRpZmFjdC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihhcnRpZmFjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCVRuZ1V0aWwucmVmcmVzaFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWQoVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBub3RpZmljYXRpb24pOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdG8gc2V0RGVmYXVsdE5hbWUuIElEZWZhdWx0TmFtZVNldHRlciBjYW5ub3QgYmUgdXNlZCAKLQkgKiBpbiBjYXNlIG9mIFN0YXRlbGVzcyBJdGVtUHJvdmlkZXIuCi0JICogVGhpcyBpcyB3b3JrLWFyb3VuZCBmb3Igbm93LiBJRGVmYXVsdE5hbWVTZXR0ZXIgd2lsbCBiZSBtb2RpZmllZCBsYXRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQXJ0aWZhY3QpIHBhcmVudCkKLQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKiBub3QgaW4gdXNlIChmb3Igc3RhdGVsZXNzIGl0ZW1wcm92aWRlcikgc2VlIGFib3ZlIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19BUlRJRkFDVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKEFydGlmYWN0KSB0YXJnZXQpLmdldENvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIEFydGlmYWN0LmNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3RfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNvbC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzUGFyZW50c0FjY2VwdGVkKE9iamVjdCBjaGlsZCkgewotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBnZXRIaWVyYXJjaHlMaXN0KGxpc3QsIGNoaWxkKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkvLyBpZiAoZmlsdGVyLmFjY2VwdChvYmopKQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwotCS8vIHByaXZhdGUgYm9vbGVhbiBjaGVja0NoaWxkcmVuc0FjY2VwdGVkKE9iamVjdCBvYmplY3QpIHsKLQkvLyBBcnRpZmFjdCBwYXJlbnRhcnRpZmFjdCA9ICgoQXJ0aWZhY3QpIG9iamVjdCkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkvLyBpZiAocGFyZW50YXJ0aWZhY3QgIT0gbnVsbCkgewotCS8vIGlmIChmaWx0ZXIgIT0gbnVsbCkgewotCS8vIGlmIChmaWx0ZXIuYWNjZXB0KHBhcmVudGFydGlmYWN0KSkKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyBlbHNlIHsKLQkvLyByZXR1cm4gY2hlY2tDaGlsZHJlbnNBY2NlcHRlZChwYXJlbnRhcnRpZmFjdCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwotCS8vIHByaXZhdGUgdm9pZCBnZXRIaWVyYXJjaHlMaXN0KExpc3QgbGlzdCwgT2JqZWN0IG9iamVjdCkgewotCS8vIEFydGlmYWN0IHBhcmVudCA9ICgoQXJ0aWZhY3QpIG9iamVjdCkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkvLyBpZiAocGFyZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkvLyBsaXN0LmFkZChwYXJlbnQpOwotCS8vIGdldEhpZXJhcmNoeUxpc3QobGlzdCwgcGFyZW50KTsKLQkvLyB9Ci0JLy8gfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDBhODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjb250ZW50IGRlc2NyaXB0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBBIG1hcCBvZiBFQ2xhc3MgLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciBlYWNoIHR5cGUgb2YgQ29udGVudERlc2NyaXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwkKLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QsCi0JCQlPYmplY3QgcHJvcGVydHlJZCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LAotCQkJCXByb3BlcnR5SWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFZGl0YWJsZVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0RWRpdGFibGVWYWx1ZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtUHJvdmlkZXJNYXAKLQkJCQkuZ2V0KGVPYmouZUNsYXNzKCkpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJLmNyZWF0ZUFkYXB0ZXIoZU9iaik7Ci0JCQlpdGVtUHJvdmlkZXJNYXAucHV0KGVPYmouZUNsYXNzKCksIGFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM0ZDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBDb250ZW50UGFja2FnZXNJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgUm9sZXNJdGVtUHJvdmlkZXIgcm9sZXM7Ci0KLQlwcm90ZWN0ZWQgVGFza3NJdGVtUHJvdmlkZXIgdGFza3M7Ci0KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0czsKLQotCXByb3RlY3RlZCBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZ3VpZGFuY2VzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsYWJlbDsKLQotCXByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcm9sZXMuCi0JICovCi0JcHVibGljIFJvbGVzSXRlbVByb3ZpZGVyIGdldFJvbGVzKCkgewotCQlyZXR1cm4gcm9sZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0YXNrcy4KLQkgKi8KLQlwdWJsaWMgVGFza3NJdGVtUHJvdmlkZXIgZ2V0VGFza3MoKSB7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdvcmtQcm9kdWN0cy4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyIGdldFdvcmtQcm9kdWN0cygpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCS8vIGlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkvLyBjaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBhbGxDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ2hpbGRyZW5TdG9yZSBzdG9yZSA9IGdldENoaWxkcmVuU3RvcmUob2JqZWN0KTsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RvcmUgPT0gbnVsbCkgewotCQkJc3RvcmUgPSBjcmVhdGVDaGlsZHJlblN0b3JlKG9iamVjdCk7Ci0JCQlyZXN1bHQgPSBzdG9yZSAhPSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoKTsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KS5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpLm5leHQoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJTGlzdCBjb250ZW50UGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTsgaW5kZXgrKykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsIGluZGV4KTsKLQkJCQkJCQkvLyBpZiAoc3RvcmUgIT0gbnVsbCkKLQkJCQkJCQkvLyB7Ci0JCQkJCQkJLy8gc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGQoY2hpbGQpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQkvLyBlbHNlCi0JCQkJCQkJLy8gewotCQkJCQkJCS8vIHJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQljb250ZW50UGtncy5hZGQoY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBjbGVhciBwYXJlbnQgZm9yIGNoaWxkcmVuCi0JCQkJCS8vCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudChudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHNvcnRpbmcgdGhlIGNvbnRlbnQgcGFja2FnZXMKLQkJCQkJLy8KLQkJCQkJQ29sbGVjdGlvbnMuc29ydChjb250ZW50UGtncywgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkJCQkJCS5nZXRDb21wYXJhdG9yKCkpOwotCi0JCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0JCQkJCQlzdG9yZS5nZXRMaXN0KGZlYXR1cmUpLmFkZEFsbChjb250ZW50UGtncyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXN1bHQuYWRkQWxsKGNvbnRlbnRQa2dzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwKLQkJCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0JCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJCQkJCXN0b3JlLnNldFZhbHVlKGZlYXR1cmUsIGNoaWxkKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYWxsQ2hpbGRyZW4uYWRkQWxsKHN0b3JlICE9IG51bGwgPyBzdG9yZS5nZXRDaGlsZHJlbigpIDogcmVzdWx0KTsKLQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCi0JCS8vIHJlbW92ZSBvbGQgYWRhcHRlcnMgKHJvbGVzLCB0YXNrcywgd29ya3Byb2R1Y3RzKSBmcm9tIHRoZSB0aGUKLQkJLy8gY29udGVudFBrZwotCQkvLwotCQkvLyBFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqZWN0OwotCQlpZiAocm9sZXMgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUocm9sZXMpOwotCQkJcm9sZXMgPSBuZXcgUm9sZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCQl9Ci0JCWlmICh0YXNrcyA9PSBudWxsKSB7Ci0JCQkvLyBlT2JqLmVBZGFwdGVycygpLnJlbW92ZSh0YXNrcyk7Ci0JCQl0YXNrcyA9IG5ldyBUYXNrc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JCX0KLQkJaWYgKHdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQkvLyBlT2JqLmVBZGFwdGVycygpLnJlbW92ZSh3b3JrUHJvZHVjdHMpOwotCQkJd29ya1Byb2R1Y3RzID0gbmV3IFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJY29udGVudFBrZyk7Ci0JCX0KLQkJaWYgKGd1aWRhbmNlcyA9PSBudWxsKSB7Ci0JCQkvLyBlT2JqLmVBZGFwdGVycygpLnJlbW92ZShndWlkYW5jZXMpOwotCQkJZ3VpZGFuY2VzID0gbmV3IEd1aWRhbmNlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JCX0KLQotCQlhbGxDaGlsZHJlbi5hZGQocm9sZXMpOwotCQlhbGxDaGlsZHJlbi5hZGQodGFza3MpOwotCQlhbGxDaGlsZHJlbi5hZGQod29ya1Byb2R1Y3RzKTsKLQkJYWxsQ2hpbGRyZW4uYWRkKGd1aWRhbmNlcyk7Ci0JCXJldHVybiBhbGxDaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ29udGVudFBhY2thZ2UoKSkpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkvLyAqLwotCS8vIHB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JLy8gQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkvLyAvLyBjb21tYW5kUGFyYW1ldGVyLnNldE93bmVyKCgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JLy8gQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JLy8gY29tbWFuZFBhcmFtZXRlcik7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVDb21tYW5kOiAiICsKLQkvLyBjb21tYW5kQ2xhc3MgKyAiLCBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkgKyAiLCBvd25lcjogIiArCi0JLy8gY29tbWFuZFBhcmFtZXRlci5nZXRPd25lcigpICsgIiwgY29sbGVjdGlvbjogIiArCi0JLy8gY29tbWFuZFBhcmFtZXRlci5nZXRDb2xsZWN0aW9uKCkpOwotCS8vIHJldHVybiBjbWQ7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgdHh0OwotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJdHh0ID0gbGFiZWw7Ci0JCX0gZWxzZSB7Ci0JCQl0eHQgPSBUbmdVdGlsCi0JCQkJCS5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBjaGVjayBpZiB0aGUgb2JqZWN0IGhhcyBpdHMgb3duIHJlc291cmNlIGFuZCBpdCBpcyBtb2RpZmllZCB0byBhZGQKLQkJLy8gdGhlIGRpcnR5IGZsYWcKLQkJLy8KLQkJUmVzb3VyY2UgcmVzID0gKChFT2JqZWN0KSBvYmplY3QpLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApID09IG9iamVjdAotCQkJCSYmIHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCXR4dCA9IHR4dCArICIqIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0eHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIHRhcmdldDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKGNvbnRlbnRQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgImNvbnRlbnRfcGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKGNvbnRlbnRQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgIm1ldGhvZF9wYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChtc2csIHRoaXMpOwotCi0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZ2V0R3VpZGFuY2VzKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKTsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUFycmF5TGlzdCBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhhdCB5b3UgY2Fubm90IGFkZCBNZXRob2RQYWNrYWdlIHRoYXQgaXMgbm90IGEKLQkJCS8vIENvbnRlbnRQYWNrYWdlCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBzZWxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChndWlkYW5jZXMgIT0gbnVsbCkgewotCQkJZ3VpZGFuY2VzLmRpc3Bvc2UoKTsKLQkJCWd1aWRhbmNlcyA9IG51bGw7Ci0JCX0KLQkJaWYgKHJvbGVzICE9IG51bGwpIHsKLQkJCXJvbGVzLmRpc3Bvc2UoKTsKLQkJCXJvbGVzID0gbnVsbDsKLQkJfQotCQlpZiAodGFza3MgIT0gbnVsbCkgewotCQkJdGFza3MuZGlzcG9zZSgpOwotCQkJdGFza3MgPSBudWxsOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RzLmRpc3Bvc2UoKTsKLQkJCXdvcmtQcm9kdWN0cyA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliZGI2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBndWlkYW5jZSBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSBtYXAgb2YgRUNsYXNzIC8gSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgZWFjaCB0eXBlIG9mIGd1aWRhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCwKLQkJCU9iamVjdCBwcm9wZXJ0eUlkKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsCi0JCQkJcHJvcGVydHlJZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVkaXRhYmxlVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRFZGl0YWJsZVZhbHVlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtUHJvdmlkZXJNYXAKLQkJCQkuZ2V0KGVPYmouZUNsYXNzKCkpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJLmNyZWF0ZUFkYXB0ZXIoZU9iaik7Ci0JCQlpdGVtUHJvdmlkZXJNYXAucHV0KGVPYmouZUNsYXNzKCksIGFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChlT2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoZU9iaiwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGVPYmo7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTBkODMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkd1aWRhbmNlIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgR3VpZGFuY2VGb2xkZXJJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0YWNobWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNoZWNrbGlzdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNvbmNlcHQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVFeGFtcGxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3VpZGVsaW5lKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVFc3RpbWF0ZSgpKSk7Ci0JCS8vCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJLy8gLmNyZWF0ZUVzdGltYXRpbmdNZXRyaWMoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcmFjdGljZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJlcG9ydCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2FkbWFwKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVUZWNobmlxdWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVG9vbE1lbnRvcigpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJhaW5pbmdDbGFzcygpKSk7Ci0JCS8vCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRyYWluaW5nTW9kdWxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV2hpdGVwYXBlcigpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkvLyAuY3JlYXRlV29ya1Byb2R1Y3RHdWlkZWxpbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkvLyBFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JLy8gaWYoZU9iaiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpCi0JLy8gVG5nVXRpbC5nZXRBZGFwdGVyKGVPYmosIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkvLyBpZihpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCk7Ci0JLy8gfQotCS8vIHJldHVybiBlT2JqOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DSEVDS0xJU1Q7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfV0hJVEVQQVBFUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DT05DRVBUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0VYQU1QTEU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1BSQUNUSUNFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUkVQT1JUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPQURNQVA7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUkVVU0FCTEVfQVNTRVQ7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19TVVBQT1JUSU5HX01BVEVSSUFMOwotCQkJLy8gfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZWNobmlxdWUpIHsKLQkJCS8vIGJhc2VOYW1lID0gIm5ld19UZWNobmlxdWUiOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19URU1QTEFURTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVEVSTV9ERUZJTklUSU9OOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1RPT0xfTUVOVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfR1VJREVMSU5FOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19HVUlEQU5DRTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQlpZiAobXNnLmdldE5ld1ZhbHVlKCkgaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJaWYgKG1zZy5nZXRPbGRWYWx1ZSgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJY2hlY2tfYWRkOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKGl0ZXIubmV4dCgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQkJYnJlYWsgY2hlY2tfYWRkOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWNoZWNrX3JlbW92ZTogZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmIChpdGVyLm5leHQoKSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJCWJyZWFrIGNoZWNrX3JlbW92ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocmVmcmVzaCkKLQkJCVRuZ1V0aWwucmVmcmVzaFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlcihVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgTGlzdCkgewotCQkJY2hpbGRyZW4gPSAoTGlzdCkgY29sbGVjdGlvbjsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjb2xsZWN0aW9uKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldEd1aWRhbmNlVHlwZUNvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9JRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0lFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjc3NzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0lFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBlbGVtZW50IGl0ZW0gcHJvdmlkZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU2YjA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGNvbnRlbnRQa2cgPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChjb250ZW50UGtnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoY29udGVudFBrZywgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0Um9sZXMoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUm9sZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk2NDllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlJvbGVzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0Jc3luY2hyb25pemVkIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGUoKSkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNuZXdDaGlsZEFkZGVkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkUm9sZXNJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE0ODkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHNlY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlNlY3Rpb25JdGVtUHJvdmlkZXIgewotCi0JcHVibGljIFNlY3Rpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNjgxYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgdGFzay4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0l0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVGFza0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGNvbnRlbnRQa2cgPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChjb250ZW50UGtnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoY29udGVudFBrZywgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0VGFza3MoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQkvLyBwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZG9tYWluLAotCS8vIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JLy8gLy8gaWYoY29tbWFuZENsYXNzID09IFJlbW92ZUNvbW1hbmQuY2xhc3MpIHsKLQkvLyAvLyBjb21tYW5kUGFyYW1ldGVyLnNldE93bmVyKCgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JLy8gLy8gfQotCS8vIENvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCS8vIGNvbW1hbmRQYXJhbWV0ZXIpOwotCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlQ29tbWFuZDogIiArCi0JLy8gY29tbWFuZENsYXNzICsgIiwgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpICsgIiwgb3duZXI6ICIgKwotCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSArICIsIGNvbGxlY3Rpb246ICIgKwotCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0Q29sbGVjdGlvbigpKTsKLQkvLyByZXR1cm4gY21kOwotCS8vIH0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfVGFza190eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRhc2tJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLS8vCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJY2FzZSBFdmVudFR5cGVzLk1BS0VfUFJPWFk6Ci0vLwkJCS8vIHJlZnJlc2ggcGFyZW50Ci0vLwkJCS8vCi0vLwkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBnZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotLy8JCQkKLS8vCQkJLy8gcmVmcmVzaCBpdHNlbGYKLS8vCQkJLy8KLS8vCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0vLwkJCQotLy8JCQlyZXR1cm47Ci0vLwkJfQotCQkKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjEwNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJUYXNrcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rhc2tzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rhc2tzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGFzaygpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBUYXNrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19UQVNLOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjbmV3Q2hpbGRBZGRlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gcmVmcmVzaCB0aGUgdW5jYXRlZ29yaXplZCB0YXNrcyBncm91cAotCQkvLwotCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkVGFza3NJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1RyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGRjZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1RyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgc3ViIGZvbGRlcnMgaW4gdGhlCi0gKiBMaWJyYXJ5IHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJaWYobXNnLmdldE5ld1ZhbHVlKCkgIT0gbXNnLmdldE9sZFZhbHVlKCkpIHsKLQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQkJY2hpbGRyZW5DaGFuZ2VkKG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTJlODFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHdvcmsgcHJvZHVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGVPYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihlT2JqLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRXb3JrUHJvZHVjdHMoKTsKLQkJfQotCQlyZXR1cm4gZU9iajsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9PdXRjb21lX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0FydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L091dGNvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTkzNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiV29yayBQcm9kdWN0cyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURlbGl2ZXJhYmxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlT3V0Y29tZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ERUxJVkVSQUJMRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19PVVRDT01FOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19XT1JLUFJPRFVDVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwucmVmcmVzaFVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXJzKFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBtc2cpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZmJmOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgY29yZSBtZXRob2QgZWxlbWVudHMgYW5kIGd1aWRhbmNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvSUxpc3RlbmVyUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvSUxpc3RlbmVyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZjNjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL0lMaXN0ZW5lclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaXN0ZW5lclByb3ZpZGVyIHsKLQlMaXN0PElOb3RpZnlDaGFuZ2VkTGlzdGVuZXI+IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvVG5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL1RuZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmJkZDdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvVG5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5QcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IG1ldGhvZCBsaWJyYXJ5IGFkYXB0ZXIgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRuZ0FkYXB0ZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFRuZ0FkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRuZ0FkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIoKSB7Ci0JCU9iamVjdCBwcm92aWRlciA9IEV4dGVuc2lvbkhlbHBlci5jcmVhdGUoVG5nQWRhcHRlckZhY3RvcnkuY2xhc3MsIG51bGwpOwotCQlyZXR1cm4gcHJvdmlkZXIgaW5zdGFuY2VvZiBUbmdBZGFwdGVyRmFjdG9yeSA/IChUbmdBZGFwdGVyRmFjdG9yeSkgcHJvdmlkZXIgOiBuZXcgVG5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0vLwkJcmV0dXJuIG5ldyBUbmdBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19BREFQVEVSX0ZBQ1RPUllfSUQgPSAid2JzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX0FEQVBURVJfRkFDVE9SWV9JRCA9ICJsaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0FEQVBURVJfRkFDVE9SWV9JRCA9ICJjb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgb2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgcGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIHdic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIG9ic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIHBic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5W10gcHJvY0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgbmF2aWdhdG9yQWRhcHRlckZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBwcm9jQWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVG5nQWRhcHRlckZhY3RvcnlJbXBsKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0V0JTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmICh3YnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRXQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0T0JTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG9ic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCW9ic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRPQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0UEJTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChwYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXBic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRQQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBnZXRXQlNfQWRhcHRlckZhY3RvcmllcygpIHsKLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5RnJvbUV4dGVuc2lvbihXQlNfQURBUFRFUl9GQUNUT1JZX0lEKTsKLQkJCWlmKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJCWZhY3RvcnkgPSBuZXcgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCX0KLQkJCXdic0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlmYWN0b3J5LAotCQkJCQkvLyBuZXcgQlNQcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeShmYWN0b3J5KSwKLQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCX0KLQkJcmV0dXJuIHdic0FkYXB0ZXJGYWN0b3JpZXM7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIGdldE9CU19BZGFwdGVyRmFjdG9yaWVzKCkgewotCQlpZiAob2JzQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQlPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJZmFjdG9yeSwKLQkJCQkJLy8gbmV3IEJTUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoZmFjdG9yeSksCi0JCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQl9Ci0JCXJldHVybiBvYnNBZGFwdGVyRmFjdG9yaWVzOwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBnZXRQQlNfQWRhcHRlckZhY3RvcmllcygpIHsKLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJcGJzQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWZhY3RvcnksCi0JCQkJCS8vIG5ldyBCU1Byb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KGZhY3RvcnkpLAotCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJfQotCQlyZXR1cm4gcGJzQWRhcHRlckZhY3RvcmllczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2dldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5RnJvbUV4dGVuc2lvbihMSUJSQVJZX0FEQVBURVJfRkFDVE9SWV9JRCk7Ci0JCQkJCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJCWZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJfQotCQkJCQluYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJCQkJLy8gbmV3Ci0JCQkJCQkJCQkvLyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQlmYWN0b3J5LAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmF2aWdhdG9yQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCS8vIHB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEZpbHRlclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkvLyBpZihmaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JLy8gc3luY2hyb25pemVkKHRoaXMpIHsKLQkvLyBpZihmaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JLy8gZmlsdGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkvLyBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkvLyBuZXcgY29tLmlibS5saWJyYXJ5LmVkaXQuZmlsdGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JLy8gbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JLy8gfSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZpbHRlckFkYXB0ZXJGYWN0b3J5OwotCS8vIH0KLQkvLyAgICAKLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChjb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnlGcm9tRXh0ZW5zaW9uKENPTkZJR1VSQVRJT05fQURBUFRFUl9GQUNUT1JZX0lEKTsKLQkJCQkJaWYoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCQlmYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQl9Ci0JCQkJCWNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCWZhY3RvcnksCi0JCQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb25maWd1cmF0aW9uQWRhcHRlckZhY3Rvcnk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2dldE5hdmlnYXRvclZpZXdfRmlsdGVyQWRhcHRlckZhY3RvcnkoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBZGFwdGVyRmFjdG9yeSgKLQkJCQlnZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBGaWx0ZXJJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBBZGFwdGVyLAotCQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PENsYXNzPD8+PiBDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOwotCi0JCXN0YXRpYyB7Ci0JCQlDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORy5hZGQoQWN0aXZpdHkuY2xhc3MpOwotCQkJQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcuYWRkKEN1c3RvbUNhdGVnb3J5LmNsYXNzKTsKLQkJCUNMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLmFkZChUYXNrRGVzY3JpcHRvci5jbGFzcyk7Ci0JCQlDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORy5hZGQoVGVhbVByb2ZpbGUuY2xhc3MpOwotCQkJQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcuYWRkKFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXI7Ci0KLQkJcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCQlwcml2YXRlIGJvb2xlYW4gaXNBZGFwdGVyQ29uZmlndXJhYmxlOwotCi0JCXByb3RlY3RlZCBGaWx0ZXJJdGVtUHJvdmlkZXIoSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyLCBJRmlsdGVyIGZpbHRlcikgewotCQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkJaXNBZGFwdGVyQ29uZmlndXJhYmxlID0gdHJ1ZTsKLQkJCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJfQotCi0JCX0KLQkJCi0JCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjZ2V0VGFyZ2V0KCkKLQkJICovCi0JCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNzZXRUYXJnZXQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCQlhZGFwdGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBudWxsOwotCQkJZmFrZV9sb29wOiBkbyB7Ci0JCQkJCi0JCQkJLy8gT3JkZXIgaXMgbm90IGltcG9ydGFudCwgSWYgYWRhcHRlciBpcyBJTGlicmFyeUl0ZW1Qcm92aWRlcgotCQkJCS8vIGFuZCByZXBsYWNlQ2hpbGRyZW4gaXMgZmFsc2UgYW5kIElDb25maWd1cmFibGUsIGl0IHNob3VsZCAgCi0JCQkJLy8gZ28gdG8gaXNBZGFwdGVyQ29uZmlndXJhYmxlLCBub3QgdG8gcmVndWxhciBpdGVyYXRpb24uCi0KLQkJCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcgotCQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQkJYm9vbGVhbiByZXBsYWNlQ2hpbGRyZW4gPSBmYWxzZTsKLQkJCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikKLQkJCQkJCQkuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlDb2xsZWN0aW9uPD8+IG90aGVyQ2hpbGRyZW4gPSBjb25maWd1cmF0b3IuZ2V0Q2hpbGRyZW4oCi0JCQkJCQkJCW9iamVjdCwgZmVhdHVyZSk7Ci0JCQkJCQlpZiAob3RoZXJDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCQkJcmVwbGFjZUNoaWxkcmVuID0gdHJ1ZTsKLQkJCQkJCQljaGlsZHJlbi5hZGRBbGwob3RoZXJDaGlsZHJlbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHJlcGxhY2VDaGlsZHJlbikgewotCQkJCQkJYnJlYWsgZmFrZV9sb29wOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQlpZiAoaXNBZGFwdGVyQ29uZmlndXJhYmxlKSB7Ci0JCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oY29sbGVjdGlvbik7Ci0JCQkJCWJyZWFrIGZha2VfbG9vcDsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gcmVndWxhciBhZGFwdGVyCi0JCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSB3aGlsZSAoZmFsc2UpOwotCi0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFByYWN0aWNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuICgoUHJhY3RpY2VJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldE1vZGlmaWVkQ2hpbGRyZW4ob2JqZWN0LCBjaGlsZHJlbik7Ci0JCQl9Ci0JCQkKLQkJCS8vIGFscGhhYmV0aWNhbGx5IHNvcnQgdGhlIGNoaWxkcmVuCi0JCQkvLwotCQkJaWYgKCFUbmdVdGlsLmlzSW5zdGFuY2VPZihDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORywgVG5nVXRpbAotCQkJCQkudW53cmFwKG9iamVjdCkpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwKLQkJCQkJCUNvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJfQotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbHRlckl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpIHJldHVybmVkICIgKwotCQkJLy8gY2hpbGRyZW4pOwotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIGVkaXRpbmdEb21haW4sCi0JCQkJCXNpYmxpbmcpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JCSAqLwotCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsCi0JCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDbGFzcyBjb21tYW5kQ2xhc3MsCi0JCQkJQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgY29tbWFuZENsYXNzLAotCQkJCQljb21tYW5kUGFyYW1ldGVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yCi0JCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCS8vIGFsd2F5cyByZXR1cm4gdHJ1ZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0JCQkJLy8KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KXsKLQkJCQlyZXR1cm4gYWRhcHRlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCQkJfQotCQkJaWYoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCwKLQkJCQlPYmplY3QgcHJvcGVydHlJRCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHlJRCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEVkaXRhYmxlVmFsdWUob2JqZWN0KTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBGaWx0ZXJBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5LAotCQkJSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7Ci0KLQkJcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIEZpbHRlckFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJCWlmKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQl9Ci0JCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwgfHwgYWRhcHRlciBpbnN0YW5jZW9mIEZpbHRlckl0ZW1Qcm92aWRlcgotCQkJCQl8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQkJcmV0dXJuIG5ldyBGaWx0ZXJJdGVtUHJvdmlkZXIoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIsIGZpbHRlcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCB8fCBhZGFwdGVyIGluc3RhbmNlb2YgRmlsdGVySXRlbVByb3ZpZGVyCi0JCQkJCXx8ICEoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEZpbHRlckl0ZW1Qcm92aWRlcigoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlciwgZmlsdGVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHROZXcob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBhZGFwdGVyRmFjdG9yeS5hZGFwdE5ldyh0YXJnZXQsIHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdEFsbE5ldyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkYXB0QWxsTmV3KE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeS5hZGFwdEFsbE5ldyhub3RpZmllcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNmaXJlTm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeS5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeS5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZSNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmaWx0ZXIgPSBudWxsOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nV0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JCQkJfQotCQkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVQdWJsaXNoaW5nVEJTQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nLlRCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKLQkJCQl9Ci0JCSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlV1BCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldEF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAocHJlZlN0b3JlICE9IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LnNldENvbHVtbkluZGV4VG9OYW1lTWFwKFByb2Nlc3NVdGlsCi0JCQkJCS50b0NvbHVtbkluZGV4VG9OYW1lTWFwKHByZWZTdG9yZQotCQkJCQkJCS5nZXRTdHJpbmcoTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpKTsKLQkJfQotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJYWRhcHRlckZhY3RvcnksIG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCi0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlTGlicmFyeUNvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUxpYnJhcnlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnlGcm9tRXh0ZW5zaW9uKExJQlJBUllfQURBUFRFUl9GQUNUT1JZX0lEKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCS8vIG5ldwotCQkJCQkJLy8gUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZmFjdG9yeSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQotCX0KLQkKLQkvLyBTZWN0aW9uIGZvciBUTkcgRmlsdGVyIG1vZGlmaWNhdGlvbiBwcm9jZXNzLgotCS8vIGZpbHRlciBtb2RpZmljYXRpb24gY29kZS4gU2ltaWxhciB0byBnZXRGaWx0ZXJWaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIKLQkvLyBmaWx0ZXIpCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoCi0JCQkJZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBmaWx0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zRmlsdGVyQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlckFkYXB0ZXJGYWN0b3J5KGdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAocGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQlmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldE9CU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAob2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocHJvY0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJZmluYWwgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCQlpZiAocHJlZlN0b3JlICE9IG51bGwpIHsKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChQcm9jZXNzVXRpbAotCQkJCQkJCQkJCS50b0NvbHVtbkluZGV4VG9OYW1lTWFwKHByZWZTdG9yZQotCQkJCQkJCQkJCQkJLmdldFN0cmluZyhMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkpOwotCQkJCQkJcHJlZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCi0JCQkJCQkvLyBJbml0aWFsaXplICJhdXRvIGluaGVyaXQgc3VwcHJlc3Npb24gc3RhdGVzIiBmbGFnIGZvciBjYWxjdWxhdGluZyBzdXBwcmVzc2lvbgotCQkJCQkJLy8gYW5kIGFkZCBsaXN0ZW5lciB0byBpdHMgY2hhbmdlCi0JCQkJCQkvLwotCQkJCQkJU3VwcHJlc3Npb24uc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQkJCQkJCXByZWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgZXZlbnQpIHsKLQkJCQkJCQkJaWYoTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJCQkJCQkJU3VwcHJlc3Npb24uc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJfSk7Ci0JCQkJCX0JCQkJCQotCQkJCQotCQkJCQlwcm9jQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQotCQkJCQlwcm9jQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCXByb2NBZGFwdGVyRmFjdG9yaWVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvY0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJbmF2aWdhdG9yQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJCi0JCWlmIChjb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChvYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQotCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJcGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkvLyByZW1vdmUgYWRhcHRlciBmYWN0b3J5IGFzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tCi0JCQkvLyBwcmVmZXJlbmNlIHN0b3JlCi0JCQkvLwotCQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldEF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZSgpOwotCQkJaWYgKHByZWZTdG9yZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jQWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgYWRhcHRlckZhY3RvcnkgPSBwcm9jQWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKSB7Ci0JCQkJCQlwcmVmU3RvcmUKLQkJCQkJCQkJLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcikgYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcHJvY0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXByb2NBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdDQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHVibGlzaGluZ1dQQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nLldQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JCQkJfQotCQkpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjbGVhblVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotCQlTdXBwcmVzc2lvbi5jbGVhblVwKCk7Ci0KLQkJaWYgKG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JCQotCQlpZiAob2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQkJCi0JCWlmIChwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCQkKLQkJCi0JCWlmIChjb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChvYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwcm9jQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnlGcm9tRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQkvLyBQcm9jZXNzIHRoZSBjb250cmlidXRvcnMuCi0JCS8vCi0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgImFkYXB0ZXJGYWN0b3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBmYWN0b3J5SWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYoaWQuZXF1YWxzKGZhY3RvcnlJZCkpIHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZihjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQlPYmplY3QgZmFjdG9yeSA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlpZihmYWN0b3J5IGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCQkJCXJldHVybiAoQWRhcHRlckZhY3RvcnkpIGZhY3Rvcnk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjRmZTY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGE0YjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYW4gYWN0aXZpdHkgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZihjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXJldHVybiBzdXBlci5hY2NlcHRBc0NoaWxkKGNoaWxkKTsKLQl9Ci0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJRmlsdGVyVXRpbAotCQkJCS5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSkpOwotCQlyZXR1cm4gY29sOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0NjFmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBicmVha2Rvd24gc3RydWN0dXJlIGFjdGl2aXR5IGluIHRoZQotICogbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGRJbmhlcml0ZWQoT2JqZWN0IG9iamVjdCwgTGlzdCBteUNoaWxkcmVuKSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuYWRkSW5oZXJpdGVkKG9iamVjdCwgbXlDaGlsZHJlbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMTc1MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDYXBhYmlsaXR5IFBhdHRlcm5zIiBhbmQgIkRlbGl2ZXJ5Ci0gKiBQcm9jZXNzZXMiIGZvbGRlcnMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlIHsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCS8vIHByaXZhdGUgU3RyaW5nW10gcGtnUGF0aDsKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQkvLyBwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIHBrZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGFja2FnZSBwa2csIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJdGhpcy5wa2cgPSBwa2c7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCU9iamVjdCBjaGlsZCA9IGVsZW1lbnQ7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQljaGlsZCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKGZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJaWYgKCFpc0VtcHR5UGFja2FnZShjaGlsZCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjaGlsZFBhY2thZ2VzKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoUHJvY2Vzc1BhY2thZ2UpIG9iamVjdCkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW5ld0xpc3QuYWRkQWxsKGNoaWxkcmVuKTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChpdGVyLm5leHQoKSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVBhY2thZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gdGhpcy5jaGlsZFBhY2thZ2VzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnModGFyZ2V0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlZGNkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBjb250ZW50IGNhdGVnb3J5IGZvbGRlcnMgaW4gdGhlIG1ldGhvZAotICogZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlJRmlsdGVyIGZpbHRlcjsKLQotCU9iamVjdCBpbWFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIHJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB8fCAob2JqIGluc3RhbmNlb2YKLQkJLy8gRGlzY2lwbGluZSAmJgotCQkvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpKTsKLQkJaWYgKCF0aGlzLmZpbHRlci5hY2NlcHQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUKLQkJCQkmJiAhQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSkgb2JqKQotCQkJCQkJLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQKLQkJCQkmJiAhQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgb2JqKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoY29udGVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGNvbnRlbnRBZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLmltYWdlID0gb2JqZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODllNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjb250ZW50IGNhdGVnb3J5IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmlsdGVyLmFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgY29udGVudEFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChjb250ZW50QWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgY29udGVudEFkYXB0ZXIpLnNldFBhcmVudChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3ZTA5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBmb2xkZXJzIGluIHRoZSBtZXRob2QKLSAqIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcjEubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkKLQkJCQkoKElDb25maWd1cmFibGUpIGNoaWxkKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuQ29sOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTdlNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjb250ZW50IHBhY2thZ2UgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPbmVzKG9iamVjdCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBlbXB0eSBwYWNrYWdlcyBmcm9tIHRoZSBjaGlsZHJlbiBsaXN0Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKGlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPbmVzKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGl0ZXIubmV4dCgpKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5UGFja2FnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9uZXMob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoIWlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2M5MjZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGN1c3RvbSBjYXRlZ29yeSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBTZXQgdGhlIGNoaWxkcmVuU3RvcmVNYXAgdG8gbnVsbCwgdG8gZ2V0IHRoZSB1cGRhdGVkIGN1c3RvbWNhdGVnb3JpZXMKLQkJY2hpbGRyZW5TdG9yZU1hcCA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciBvYmogPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAoIXRoaXMuZmlsdGVyLmFjY2VwdChvYmouZ2V0VmFsdWUoKSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmNTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBncm91cGluZyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCi0JCQkvLyBUT0RPOiBjb21tZW50ZWQgb3V0IHVudGlsIEppbmh1YSBmaXhlZCBidWdzIGluCi0JCQkvLyBDb25maWd1cmF0aW9uRmlsdGVyCi0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQljaGlsZHJlbiA9IGNvbmZpZ3VyYXRvci5nZXRDaGlsZHJlbihvYmplY3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKCk6IHJldHVybmVkIGZyb20gY29uZmlndXJhdG9yOiAiICsgY2hpbGRyZW4pOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCURpc2NpcGxpbmVHcm91cGluZyBncm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iamVjdDsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZiA9IChNZXRob2RDb25maWd1cmF0aW9uKSAoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIGdldFBhcmVudChvYmplY3QpKQotCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQlUbmdVdGlsLmFkZEV4dGVuZGVkQ2hpbGRyZW4oZ3JvdXBpbmcsIG1ldGhvZENvbmYsIGNoaWxkcmVuLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0KLQkJCS8vIHNldCBwYXJlbnQKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbkNvbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5sbGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5sbGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIFN0cmluZ1tdIHBhdGggPSB7Ci0JCS8vIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJLy8gLFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gLFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIH07Ci0JCS8vIE9iamVjdCBhZGFwdGVyID0KLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChwbHVnaW4sCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIElHcm91cENvbnRhaW5lciBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gaW50IGk7Ci0JCS8vIC8vIGZvcihpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCS8vIC8vIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJLy8gLy8gaWYoZ3JvdXBzID09IG51bGwpIHJldHVybiBudWxsOwotCQkvLyAvLyB9Ci0JCS8vIC8vIHJldHVybiAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCS8vIC8vcmV0dXJuIGFkYXB0ZXI7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjI5ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQlPYmplY3QgcGFyZW50OwotCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBvYmplY3Q7Ci0JCWlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkaXNjaXBsaW5lKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiZjhkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZG9tYWluIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkRvbWFpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCU9iamVjdCBwYXJlbnQ7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEb21haW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pIG9iamVjdDsKLQkJaWYgKGRvbWFpbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkb21haW4pOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXN1cGVyLnNldFBhcmVudChwYXJlbnQpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCS8vIElmIGZpbHRlciBub3QgbnVsbCBpdGVyYXRlIGNvbGxlY3Rpb24uCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQotCQlyZXR1cm4gY29sOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTliMWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgZ2xvYmFsIGNvbnN0YW50cyB1c2VkIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JJRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPX1BMVUdJTlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfUEFDS0FHRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNFVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktQUk9EVUNUVFlQRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPTUFJTlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0VMRU1FTlRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1MgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLUFJPRFVDVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0UgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVElFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19hY3Rpdml0aWVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RFU0NSSVBUT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05MWV9DT05URU5UX0VMRU1FTlRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DT05URU5UX0VMRU1FTlQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9BRE1BUCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tMSVNUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OQ0VQVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkFDVElDRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0FCTEVfQVNTRVRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVfUEFQRVJTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURFTElORVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRJTkdfTUFURVJJQUxTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfU0VUX0dST1VQSU5HUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORV9HUk9VUElOR1MgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0OyAKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCi0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBHVUlEQU5DRV9UWVBFUyA9IG5ldyBTdHJpbmdbXXsKLQkvLyBDSEVDS0xJU1RTLCBDT05DRVBUUywgRVhBTVBMRVMsIFBSQUNUSUNFUywgUkVQT1JUUywgUkVVU0FCTEVfQVNTRVRTLAotCS8vIFNVUFBPUlRJTkdfTUFURVJJQUxTLCBURU1QTEFURVMsIFRPT0xfTUVOVE9SUywgV0hJVEVfUEFQRVJTLAotCS8vIEdVSURFTElORVMsUk9BRE1BUH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRFTlRfRUxFTUVOVFMgPSBuZXcgU3RyaW5nW10geyBST0xFUywKLQkJCVRBU0tTLCBXT1JLUFJPRFVDVFMsIEdVSURBTkNFLCBTVVBQT1JUSU5HX01BVEVSSUFMUywKLQkJCU9OTFlfQ09OVEVOVF9FTEVNRU5UUywgVE9PTF9NRU5UT1JTIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRFTlRfQ0FURUdPUklFUyA9IG5ldyBTdHJpbmdbXSB7IFJPTEVTRVRTLAotCQkJV09SS1BST0RVQ1RUWVBFUywgRElTQ0lQTElORVMsIFRPT0xTLCBET01BSU5TIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJSRUFLRE9XTl9FTEVNRU5UUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlMsIFRBU0tfREVTQ1JJUFRPUlMsIFJPTEVfREVTQ1JJUFRPUlMgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBjb250ZW50RWxlbWVudFN0cnMgPSBBcnJheXMKLQkJCS5hc0xpc3QoQ09OVEVOVF9FTEVNRU5UUyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgY2F0ZWdvcnlTdHJzID0gQXJyYXlzLmFzTGlzdChDT05URU5UX0NBVEVHT1JJRVMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gQXJyYXlzCi0JCQkuYXNMaXN0KEJSRUFLRE9XTl9FTEVNRU5UUyk7Ci0KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BhY2UgPSAiLSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRFX0NPTlNJREVSQVRJT05TID0gTGlicmFyeUVkaXRQbHVnaW4KLQkJCS5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREVGSU5JVElPTlMgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKQotCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9TVFJJTkcgPSAiKiI7ICAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9DSEFSQUNURVIgPSAiPyI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5YWM5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgZWxlbWVudCBmaWx0ZXJpbmcgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJIZWxwZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKLQotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLQlwcml2YXRlIFBhdHRlcm4gcmVnZXg7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWJTdHI7Ci0KLQlwcml2YXRlIE9iamVjdCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lID0gZmFsc2U7Ci0JCi0JLy8gVGhpcyBpcyBzZXBhcmF0ZSBoYW5kbGluZyBmb3IgQ29udGVudENvbnRlZ29yeSAKLQlwcml2YXRlIFN0cmluZyBjb250ZW50Q2F0ZWdvcnlUYWJTdHI7Ci0KLQlwdWJsaWMgRmlsdGVySGVscGVyKE9iamVjdCBjb250ZW50RWxlbWVudCwgU3RyaW5nIHRhYlN0ciwgU3RyaW5nIHBhdHRlcm4sCi0KLQlTdHJpbmcgZmlsdGVyVHlwZVN0ciwgTGlzdCBhbHJlYWR5U2VsZWN0ZWRMaXN0KSB7Ci0KLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCi0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCXRoaXMudHlwZSA9IGZpbHRlclR5cGVTdHI7Ci0KLQkJdGhpcy5leGlzdGluZ0VsZW1lbnRzID0gYWxyZWFkeVNlbGVjdGVkTGlzdDsKLQotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCi0JCXNob3dQcmVzZW50YXRpb25OYW1lID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQotCi0JfQotCS8qCi0JICogbWV0aG9kIHRvIHNldCBjb250ZW50Q2F0ZWdvcnlUYWJTdHIsIHRoaXMgCi0JICogc3BlY2lhbCBoYW5kbGUgZm9yIGNvbnRlbnQgY2F0ZWdvcnksIHRhYlN0ciBpbXBsZW1lbnRhdGlvbiAKLQkgKiBkb25vdCB3b3JrIGZvciB0aGlzLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIoU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVRhYlN0cil7Ci0JCXRoaXMuY29udGVudENhdGVnb3J5VGFiU3RyID0gY29udGVudENhdGVnb3J5VGFiU3RyOwotCX0KLQkvKgotCSAqIG1ldGhvZCB0byBzZXQgY29udGVudENhdGVnb3J5VGFiU3RyLCB0aGlzIAotCSAqIHNwZWNpYWwgaGFuZGxlIGZvciBjb250ZW50IGNhdGVnb3J5LCB0YWJTdHIgaW1wbGVtZW50YXRpb24gCi0JICogZG9ub3Qgd29yayBmb3IgdGhpcy4gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIoKXsKLQkJcmV0dXJuIHRoaXMuY29udGVudENhdGVnb3J5VGFiU3RyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFscmVhZHlTZWxlY3RlZExpc3QoKSB7Ci0KLQkJcmV0dXJuIGV4aXN0aW5nRWxlbWVudHM7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCkgewotCi0JCXRoaXMuZXhpc3RpbmdFbGVtZW50cyA9IGFscmVhZHlTZWxlY3RlZExpc3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFBhdHRlcm4oT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbWF0Y2gob2JqKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBDYXRlZ29yaXplZEVsZW1lbnRzICh0cmVlIHRyYXZlcnNhbCkgb2YKLQkgKiBDdXN0b21DYXRlZ29yeSBoYXMgYW55IG1hdGNoIHdpdGggbWF0Y2hlci4gQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRDaGlsZEN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IHRvcENhdGVnb3J5KSB7Ci0JCUxpc3QgbGlzdCA9IHRvcENhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdDsKLQkJCQlpZiAobWF0Y2hlcihjYXRlZ29yeSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQ2hpbGRDdXN0b21DYXRlZ29yeShjYXRlZ29yeSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBzdWJBcnRpZmFjdHMgKHRyZWUgdHJhdmVyc2FsKSBvZiBBcnRpZmFjdAotCSAqIGhhcyBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyLiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFydGlmYWN0KEFydGlmYWN0IGFydGlmYWN0KSB7Ci0KLQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBzdWJhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqZWN0OwotCQkJCWlmIChtYXRjaGVyKHN1YmFydGlmYWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRBcnRpZmFjdChzdWJhcnRpZmFjdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgc3ViQXJ0aWZhY3RzICh0cmVlIHRyYXZlcnNhbCkgb2YgQXJ0aWZhY3QKLQkgKiBoYXMgYW55IG1hdGNoIHdpdGggIGFscmVhZHlleGlzdGluZyBlbGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFydGlmYWN0KEFydGlmYWN0IGFydGlmYWN0LCBMaXN0IGV4aXN0aW5nTGlzdCkgewotCi0JCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3Qgc3ViYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIG9iamVjdDsKLQkJCQlpZighZXhpc3RpbmdMaXN0LmNvbnRhaW5zKHN1YmFydGlmYWN0KSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IENoaWxkUGFja2FnZXMgKHRyZWUgdHJhdmVyc2FsKSBvZiBDb250ZW50Ci0JICogUGFja2FnZSBoYXMgYW55IG1hdGNoIHdpdGggbWF0Y2hlci4KLQkgKiAKLQkgKiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZENoaWxkKENvbnRlbnRQYWNrYWdlIHBrZykgewotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGRQa2cgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IChDb250ZW50UGFja2FnZSkgY2hpbGRQa2c7Ci0JCQkJaWYgKG1hdGNoZXIoY29udGVudFBrZykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQ2hpbGQoY29udGVudFBrZykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBzdWJEb21haW4gKHRyZWUgdHJhdmVyc2FsKSBvZiBEb21haW4gaGFzCi0JICogYW55IG1hdGNoIHdpdGggbWF0Y2hlciA8bGluaz5tYXRjaGVyKE9iamVjdCBvYmopPC9saW5rPgotCSAqIAotCSAqIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkU3ViRG9tYWlucyhEb21haW4gZG9tYWluKSB7Ci0JCUxpc3QgbGlzdCA9IGRvbWFpbi5nZXRTdWJkb21haW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBzdWJkb21haW4gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkb21haW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRTdWJEb21haW5zKChEb21haW4pIHN1YmRvbWFpbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkU3ViRGlzY2lwbGluZShEaXNjaXBsaW5lIGRpc2NpcGxpbmUpewotCQlMaXN0IGxpc3QgPSBkaXNjaXBsaW5lLmdldFN1YmRpc2NpcGxpbmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHN1YmRpc2NpcGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkU3ViRGlzY2lwbGluZSgoRGlzY2lwbGluZSkgc3ViZGlzY2lwbGluZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkRGlzY2lwbGluZXMoRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nKXsKLQkJTGlzdCBsaXN0ID0gZ3JvdXBpbmcuZ2V0RGlzY2lwbGluZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHN1YmRpc2NpcGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkU3ViRGlzY2lwbGluZSgoRGlzY2lwbGluZSkgc3ViZGlzY2lwbGluZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBhY3Rpdml0eSAodHJlZSB0cmF2ZXJzYWwpIG9mIGFjdGl2aXR5IGhhcwotCSAqIGFueSBtYXRjaCB3aXRoIG1hdGNoZXIgPGxpbms+bWF0Y2hlcihPYmplY3Qgb2JqKTwvbGluaz4KLQkgKiAKLQkgKiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFjdGl2aXRpZXMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKG1hdGNoZXIoZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQWN0aXZpdGllcygoQWN0aXZpdHkpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IGFjdGl2aXR5ICh0cmVlIHRyYXZlcnNhbCkgb2YgUHJvY2Vzc1BhY2thZ2UgaGFzCi0JICogYW55IG1hdGNoIHdpdGggbWF0Y2hlciA8bGluaz5tYXRjaGVyKE9iamVjdCBvYmopPC9saW5rPgotCSAqIAotCSAqIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQWN0aXZpdGllcyhQcm9jZXNzUGFja2FnZSBwcm9jUGFja2FnZSkgewotCQlMaXN0IGxpc3QgPSBwcm9jUGFja2FnZS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKG1hdGNoZXIoZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQWN0aXZpdGllcygoQWN0aXZpdHkpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBjaGVjayBjaGlsZCBwYWNrYWdlcwotCQlsaXN0ID0gcHJvY1BhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAoaGFzTWF0Y2hlZEFjdGl2aXRpZXMoKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXJUeXBlU3RyKCkgewotCi0JCS8vIFRyaW0gIi0iKGh5cGhlbikgZnJvbSB0aGUgc3RyaW5ncyAodHlwZXMpLiAgT25seSBpbiBjYXNlIG1ldGhvZHBsdWdpbgotCQkvLyBkb24ndCB0cmltICItIiBiZWNhdXNlIG1ldGhvZHBsdWctaW4gY29udGFpbiAiLSIgKGh5cGhlbilhbmQgdXNlZnVsLgotCQl3aGlsZSAodHlwZSAhPSBudWxsICYmIHR5cGUuaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuc3BhY2UpID4gLTEKLQkJCQkmJiAhdHlwZS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpKSB7Ci0JCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcodHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSkgKyAxLCB0eXBlCi0JCQkJCS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgewotCi0JCXJldHVybiBwYXR0ZXJuOwotCi0JfQotCi0JcHVibGljIFBhdHRlcm4gZ2V0UmVnZXhQYXR0ZXJuKCkgewotCi0JCXJldHVybiByZWdleDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFiU3RyKCkgewotCi0JCXJldHVybiB0YWJTdHI7Ci0KLQl9Ci0KLQkvKgotCSAqIAotCSAqIE1ldGhvZCBjaGVja3Mgd2hldGhlciBhcmJpdHJhcnkgb2JqZWN0IHBhc3NlZCBpcwotCSAqIAotCSAqIGVxdWFsIHRvIGN1cnJlbnQgY29udGVudCBlbGVtZW50J3MgdmFyaWFiaWxpdHkgb3Igbm90LgotCSAqIAotCSAqIElmIHZhcmlhYmlsaXR5IG9mIENvbnRlbnRFbGVtZW50IG1hdGNoZXMgYXJiaXRyYXJ5IG9iamVjdCwKLQkgKiAKLQkgKiByZXR1cm5zIHRydWUuCi0JICogCi0JICogQHJldHVuIGJvb2xlYW4uCi0JICogCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmlsaXR5KE9iamVjdCBvYmopIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQotCQkJT2JqZWN0IHZhcmlhYmlsaXR5T2JqZWN0ID0gKChDb250ZW50RWxlbWVudCkgY29udGVudEVsZW1lbnQpCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlPYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmouZXF1YWxzKHZhcmlhYmlsaXR5T2JqZWN0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudEVsZW1lbnQoT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0KLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyVHlwZVN0cihTdHJpbmcgZmlsdGVyVHlwZVN0cikgewotCi0JCXRoaXMudHlwZSA9IGZpbHRlclR5cGVTdHI7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7Ci0KLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2V4UGF0dGVybihQYXR0ZXJuIHJlZ2V4UGF0dGVybikgewotCi0JCXRoaXMucmVnZXggPSByZWdleFBhdHRlcm47Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJTdHIoU3RyaW5nIHRhYlN0cikgewotCi0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBhdGhCYXNlZE9uVGFiU3RyaW5nKFN0cmluZyB0YWJTdHIpIHsKLQotCQlpZiAoRmlsdGVyQ29uc3RhbnRzLmNvbnRlbnRFbGVtZW50U3Rycy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpCi0JCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRV9TRVRfR1JPVVBJTkdTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpCi0JCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORV9HUk9VUElOR1MpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTFMpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ET01BSU5TKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGg7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBUaGlzIGlzIGNvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFsbCB0aGUgY29uZGl0aW9uLCBsaWtlIG1hdGNoUGF0dGVybiwKLQkgKiBpZiBvYmplY3QgZXhpc3RzIGluIGFscmVhZHkgc2VsZWN0ZWQgbGlzdCwgY2hlY2sgdmFyaWFiaWxpdHkgbWF0Y2gsIGFuZAotCSAqIGlzIG9iamVjdCBpdHNlbGYgZG9ub3QgZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja09iamVjdEFjY2VwdGVkKE9iamVjdCBvYmopIHsKLQotCQlpZiAoIW1hdGNoKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKGFzc29jaWF0ZWQgZWxlbWVudHMpIGRvbid0IGRpc3BsYXkuCi0JCWlmIChnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbAotCQkJCSYmIGdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKXsKLQkJCS8vIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBmb3IgQXJ0aWZhY3QgYW5kIHN1Yi1hcnRpZmFjdC4KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KXsKLQkJCQlpZighaGFzTWF0Y2hlZEFydGlmYWN0KChBcnRpZmFjdClvYmosZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfWVsc2V7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNoZWNrVmFyaWFiaWxpdHkob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBpZiBvYmplY3QgaXRzZWxmIGRvbid0IGRpc3BsYXkKLQkJLy8gRG8gZXF1YWwgY2hlY2sgb25seSBvbiBlbGVtZW50cyBvdGhlcnRoYW4gbWV0aG9kIHBsdWdpbiwgSW4gY2FzZSBvZgotCQkvLyBDb3B5cmlnaHQoc3VwcG9ydGluZyBtYXRlcmlhbCkgYXNzb2NpYXRpbmcgdG8gbWV0aG9kcGx1Z2luLCBpZgotCQkvLyBtZXRob2RwbHVnaW4gKGNvbnRlbnRFbGVtdG4pIGVxdWFscwotCQkvLyBvYmosIHRoZW4gcmVzdWx0cyBmYWxzZS5QbHVnaW4gd2lsbCBsb3N0IGZyb20gdHJlZSBpbiB0aGUgZmlsdGVyLiBJbgotCQkvLyB0dXJuIHN1cHBvcnRpbmcgbWF0ZXJpYWwgZm9yIHRoYXQgcGFydGljdWxhciBwbHVnaW4gd2lsbCBub3QgYmUKLQkJLy8gZGlzcGxheWVkLgotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCAmJiBvYmouZXF1YWxzKGNvbnRlbnRFbGVtZW50KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgY2hlY2tpbmcgTWV0aG9kUGx1Z2luIGFjY2VwdGVkIG9yIG5vdC4gTWV0aG9kIG5lZWRzCi0JICogdG8gaW52b2tlZCBvbmx5IGZvciBNZXRob2RQbHVnaW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdE1ldGhvZFBsdWdpbihPYmplY3Qgb2JqKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KS5jb250YWlucyhvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIGNoZWNraW5nIENvbnRlbnQgUGFja2FnZSBhY2NlcHRlZCBvciBub3QuIE1ldGhvZAotCSAqIG5lZWRzIHRvIGludm9rZWQgb25seSBmb3IgQ29udGVudCBQYWNrYWdlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0Q29udGVudFBhY2thZ2UoT2JqZWN0IG9iaikgewotCi0JCWlmICgoKENvbnRlbnRQYWNrYWdlKSBvYmopLmdldENoaWxkUGFja2FnZXMoKS5pc0VtcHR5KCkKLQkJCQkmJiAoKENvbnRlbnRQYWNrYWdlKSBvYmopLmdldENvbnRlbnRFbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPYmplY3RJblNlbGVjdGVkSXRlbXMoT2JqZWN0IG9iaikgewotCi0JCWlmIChnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbAotCQkJCSYmIGdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKENvbnRlbnRFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gSnVzdCByZXR1cm5pbmcgdHJ1ZSwgYmVjYXVzZSBjb250cmlidXRpb24gY2hlY2tlZCBpbiBvdGhlciBwbGFjZS4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoUGF0dGVybkJhc2VkT25UeXBlKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG1hdGNoKG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuT25QcmVzZW50YXRpb25OYW1lKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG1hdGNoKG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaG93UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHNob3dQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNob3dQcmVzZW50YXRpb25OYW1lKGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJdGhpcy5zaG93UHJlc2VudGF0aW9uTmFtZSA9IHNob3dQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEdlbmVyaWMgbWV0aG9kIHRvIGNoZWNrIG1hdGNoIG9mIGFuIG9iamVjdCBiYXNlZCBvbiByZWd1bGFyIGV4cHJlc3Npb24KLQkgKiBhbHNvIGJhc2VkIG9uIHR5cGUgdGhhdCBzZWxlY3RlZCBpbiB0aGUgZGlhbG9nLgotCSAqLwotCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoKE9iamVjdCBvYmopIHsKLQotCQkvLyBEbyBub3QgZG8gUGF0dGVybiBtYXRjaCBpZiB0eXBlIG9yIHBhdHRlcm4gc3RyaW5nIGlzIG51bGwuCi0JCWlmICh0eXBlID09IG51bGwgfHwgcGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZXF1YWxzSWdub3JlQ2FzZSgiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIENoZWNrIGlmIHR5cGUgaXMgb2YgQ29udGVudCBQYWNrYWdlCi0JCWlmICh0eXBlLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0KLQkJCQlpZiAobWF0Y2hlcihvYmopIHx8IGhhc01hdGNoZWRDaGlsZCgoQ29udGVudFBhY2thZ2UpIG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQotCQkJCS8vIGVsc2UgZm9yIGFsbCBjb250ZW50IGVsZW1lbnRzLCBpZiB0aGVpciBjb250ZW50IHBha2NhZ2UKLQkJCQkvLyBtYXRjaGVzICwgcmV0dXJuIHRydWUuCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCU9iamVjdCBjb250YWluZXIgPSAoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldENvbnRhaW5lcigpOwotCQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWlmICghbWF0Y2hlcihjb250YWluZXIpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TKSkgewotCQkJLy8gQ2hlY2sgaWYgdHlwZSBpcyBvZiBNZXRob2QgUGx1Z2lucwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCS8vIGlmIGlzIGEgTWV0aG9kUGx1Z2luLCByZXR1cm4gdHJ1ZSBpZiBtYXRjaGVzIHRoZSBwYXR0ZXJuCi0JCQkJcmV0dXJuIG1hdGNoZXIob2JqKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5BQ1RJVklUSUVTKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKG1hdGNoZXIob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZEFjdGl2aXRpZXMoKEFjdGl2aXR5KW9iaik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiBoYXNNYXRjaGVkQWN0aXZpdGllcygoUHJvY2Vzc1BhY2thZ2Upb2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodHlwZSAhPSBudWxsKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQotCQkJCWlmICh0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSA+IC0xKSB7Ci0JCQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyh0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSwgdHlwZS5sZW5ndGgoKSk7Ci0JCQkJfQotCi0JCQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKS5nZXRDbGFzc0ZvclR5cGUoCi0JCQkJCQl0eXBlKTsKLQkJCQlpZiAoY2xzICE9IG51bGwgJiYgIWNscy5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJaWYgKG1hdGNoZXIob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCi0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkQ2hpbGRDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZEFydGlmYWN0KChBcnRpZmFjdCkgb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZFN1YkRvbWFpbnMoKERvbWFpbikgb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZFN1YkRpc2NpcGxpbmUoKERpc2NpcGxpbmUpb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKXsKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkRGlzY2lwbGluZXMoKERpc2NpcGxpbmVHcm91cGluZylvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBlbHNlIGZvciBhbGwgb3RoZXIgdHlwZXMgb2YgZWxlbWVudHMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UKLQkJCS8vIHRoZSBBbGwgY2FzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2Qgd2hpY2ggZG9lcyBhY3R1YWwgbWF0Y2hpbmcgb2YgZ2l2ZW4gb2JqZWN0IHdpdGggcmVndWxhcgotCSAqIGV4cHJlc3Npb24uIENoZWNrcyB0byBkbyBwcmVzZW50YXRpb25uYW1lIG9yIG5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcihPYmplY3Qgb2JqKSB7Ci0JCWlmKHJlZ2V4ICE9IG51bGwpewotCQkJTWF0Y2hlciBtID0gcmVnZXgubWF0Y2hlcigoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpKTsKLQkJCWlmIChzaG93UHJlc2VudGF0aW9uTmFtZSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJCSYmICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopLmdldFByZXNlbnRhdGlvbk5hbWUoKSAhPSBudWxsKQotCQkJCQltID0gcmVnZXgubWF0Y2hlcigoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIG0ubWF0Y2hlcygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2ZWUxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBzZXR0aW5nIHVwIHRoZSBuZWNlc3NhcnkgbWFwcyB1c2VkIGZvciBlbGVtZW50IGZpbHRlcmluZwotICogaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlckluaXRpYWxpemVyIHsKLQotCXByaXZhdGUgc3RhdGljIEZpbHRlckluaXRpYWxpemVyIGluaXRpYWxpemVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZpbHRlckluaXRpYWxpemVyKCkgewotCQlzdXBlcigpOwotCQlsb2FkVHlwZUNsYXNzKCk7Ci0JfQotCi0JLyoKLQkgKiBTaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJJbml0aWFsaXplciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluaXRpYWxpemVyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRmlsdGVySW5pdGlhbGl6ZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewotCQkJCQlpbml0aWFsaXplciA9IG5ldyBGaWx0ZXJJbml0aWFsaXplcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIHRoZSBGaWx0ZXIgVHlwZXMgYW5kIHJlc3BlY3RpdmUgY2xhc3Nlcy4gVGhpcyBuZWVkIGluIGNhc2Ugb2YgaTExOG4gLQotCSAqIENvbnN0YW50cyB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFR5cGVDbGFzcygpIHsKLQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUywgV29ya1Byb2R1Y3RUeXBlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRE9NQUlOUywgRG9tYWluLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLCBXb3JrUHJvZHVjdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMsIERvbWFpbi5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUywgV29ya1Byb2R1Y3QuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FX0dST1VQSU5HUywgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMsIERpc2NpcGxpbmUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5UQVNLUywgVGFzay5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJPTEVfU0VUX0dST1VQSU5HUywgUm9sZVNldEdyb3VwaW5nLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMsIFJvbGVTZXQuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ST0xFUywgUm9sZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFMsIENoZWNrbGlzdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTLCBDb25jZXB0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlMsCi0JCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVMsIEV4YW1wbGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTLCBHdWlkZWxpbmUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVMsIFByYWN0aWNlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUkVQT1JUUywgUmVwb3J0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTLCBSZXVzYWJsZUFzc2V0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCwgUm9hZG1hcC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5URU1QTEFURVMsIFRlbXBsYXRlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUywgVGVybURlZmluaXRpb24uY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlMsIFRvb2xNZW50b3IuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlMsIFdoaXRlcGFwZXIuY2xhc3MpOwotCQkvLyBtYXAucHV0KEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSwgR3VpZGFuY2UuY2xhc3MpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgQ2xhc3MgZm9yIGEgdHlwZSBmcm9tIHRoZSBtYXAuCi0JICovCi0JcHVibGljIENsYXNzIGdldENsYXNzRm9yVHlwZShTdHJpbmcgdHlwZSkgewotCQlPYmplY3Qgb2JqID0gbWFwLmdldCh0eXBlKTsKLQkJcmV0dXJuIChDbGFzcykgb2JqOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzYwYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIGVsZW1lbnQgZmlsdGVyaW5nIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyVXRpbCB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGl0ZXJhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb24gY2hpbGRyZW4sIElGaWx0ZXIgZmlsdGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGZvciBjb2xsZWN0aW5nIHRoZSBwYXJlbnRzIGNoYWluICh1cHdhcmQpIG9mIGFuIGJyZWFrZG93bmVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIEJyZWFrZG93bkVsZW1lbnQKLQkgKiBAcGFyYW0gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRQYXJlbnRzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgamF2YS51dGlsLkxpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJYWN0aXZpdHlMaXN0LmFkZChwYXJlbnQpOwotCQkJZ2V0UGFyZW50c0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQsCi0JCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGNoaWxkcmVuIG9mIHRoZSBhY3Rpdml0eSByZWN1cnNpdmVseSBkb3dud2FyZHMuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBhY3Rpdml0eUxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUFjdGl2aXR5IHBhcmVudCwgTGlzdCBhY3Rpdml0eUxpc3QpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQlPYmplY3QgbyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG87Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQob2JqKTsKLQkJCQkJZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBvYmosCi0JCQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlPYmplY3QgbzEgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCQkJYWN0aXZpdHlMaXN0LmFkZChvMSk7Ci0JCQkJCWdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgbzEsCi0JCQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgcmV0cml2aW5nIGFsbCB0aGUgY29udHJpYnV0b3JzIG9mCi0JICogdmFyaWFiaWxpdHllbGVtZW50IGluIGEgbGlzdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29udHJpYnV0b3JzKExpc3QgbGlzdCwgTGlzdCBnZW5lcmFsaXplcnMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJZ2VuZXJhbGl6ZXJzLmFkZChpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIHJldHJpdmluZyBhbGwgdGhlIGNvbnRyaWJ1dG9ycyBvZgotCSAqIHZhcmlhYmlsaXR5ZWxlbWVudCBpbiBhIGxpc3QuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEdlbmVyYWxpemVycyhMaXN0IGxpc3QsIExpc3QgZ2VuZXJhbGl6ZXJzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCWdlbmVyYWxpemVycy5hZGQoaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciByZXRyaXZpbmcgYWxsIHRoZSB2YXJpYWJpbGl0eSBiYXNlcyBvZgotCSAqIHZhcmlhYmlsaXR5ZWxlbWVudCBpbiBhIGxpc3QuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFZhcmlhYmlsaXR5QmFzZShMaXN0IGxpc3QsIExpc3QgdmFyaWFiaWxpdHliYXNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQkJCWZvciAoOyBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOyB2YXJpYWJpbGl0eWJhc2VzCi0JCQkJCQkuYWRkKGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKQotCQkJCQk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5IGZvciBicmVha2Rvd25lbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGJyRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQYXJlbnRBY3Rpdml0eShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCWlmIChickVsZW1lbnQgIT0gbnVsbCkgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN1YlRyZWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlciwgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlMaXN0IHRyZWVMaXN0KSB7Ci0JCUZpbHRlclV0aWwuZ2V0UGFyZW50c0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgYWN0aXZpdHksIHRyZWVMaXN0KTsKLQkJRmlsdGVyVXRpbC5nZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdGl2aXR5LCB0cmVlTGlzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN1YlRyZWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlciwgTGlzdCBsaXN0LAotCQkJTGlzdCB0cmVlTGlzdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZ2V0U3ViVHJlZShhZGFwdGVyLCAoQWN0aXZpdHkpIG9iaiwgdHJlZUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzFkODI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBndWlkYW5jZSBmb2xkZXJzIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICovCi0JcHVibGljIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQob2JqKSkKLQkJCQlpdG9yLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lBbGxGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUFsbEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGU2ZTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUFsbEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIGFsbCBtZXRob2QgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFsbEZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ2F0ZWdvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNhdGVnb3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWQyMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ2F0ZWdvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBvbmx5IGNhdGVnb3J5IGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRlZ29yeUZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi0JU3RyaW5nW10gZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDb250ZW50RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDb250ZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWRlYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ29udGVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgY29udGVudCBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudEZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi0JU3RyaW5nW10gZ2V0Q29udGVudFBhY2thZ2VQYXRoKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUN1c3RvbUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ3VzdG9tRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNTcxMTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ3VzdG9tRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgZGlzcGxheXMgb25seSBjdXN0b20gY2F0ZWdvcmllcyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ3VzdG9tRmlsdGVyIGV4dGVuZHMgSUZpbHRlciB7Ci0KLQlTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4ZDY5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBnZW5lcmljIGZpbHRlciBmb3IgZmlsdGVyaW5nIG91dCBtZXRob2QgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIgewotCi0JLyoKLQkgKiBnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCk7Ci0KLQkvKgotCSAqIHNldEhlbHBlcigpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpOwotCi0JLyoqCi0JICogQWRkZWQgZm9yIGZ1dGhlciBmaWx0ZXJpbmcuIEZvciBleGFtcGxlLCB3ZSBtYXkgc2V0IGEgZmlsZXIgdG8gcHJldmVudAotCSAqIGdlbmVyYWxpemVycyBhcyBiYXNlIGVsZW1lbnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSBhZGRpdGlvbmFsRmlsdGVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxGaWx0ZXJzKAotCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyW10gYWRkaXRpb25hbEZpbHRlcnMpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lQcm9jZXNzRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lQcm9jZXNzRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzZkMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JUHJvY2Vzc0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgcHJvY2VzcyBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc0ZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjIxYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKGNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCS8vIGlmKGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKXsKLQkJLy8gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3Ci0JCS8vIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCQlyZXR1cm4gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQkvLyBpZihyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCl7Ci0JCS8vIHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQkJcmV0dXJuIG5ldyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUm9sZVNldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0vLwkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0vLwkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcyk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCQkKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzQ4YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWNoaWxkcmVuID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZDUyOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc0FkYXB0ZXJDb25maWd1cmFibGU7Ci0JLy8gcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW47Ci0JLy8gcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCS8vIHByaXZhdGUgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJLy8gaXNBZGFwdGVyQ29uZmlndXJhYmxlID0gdHJ1ZTsKLQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlckZhY3RvcnkpLnNldEZpbHRlcihmaWx0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0bwotCSAqIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluCi0JICoge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkvLyBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcjEubmV4dCgpOwotCQkJaWYgKGZpbHRlci5hY2NlcHQoY2hpbGQpICYmIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIHAgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCXAuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJQ29sbGVjdGlvbiBjaGlsZHMgPSBwLmdldENoaWxkcmVuKGNoaWxkKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNoaWxkSXRlciA9IGNoaWxkcy5pdGVyYXRvcigpOyBjaGlsZEl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZE9iaiA9IGNoaWxkSXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJaWYgKCFjaGVja0NoaWxkcmVucyhjaGlsZE9iaikpCi0JCQkJCQkJY2hpbGRJdGVyLnJlbW92ZSgpOwotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGRPYmopKSB7Ci0JCQkJCQkJY2hpbGRJdGVyLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjaGlsZHMuaXNFbXB0eSgpKQotCQkJCQlpdGVyMS5yZW1vdmUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0NoaWxkcmVucyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldFZhbHVlKCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQob2JqZWN0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRPYmpDaGlsZHMgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgb2JqZWN0KQotCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRPYmpJdGVyID0gY2hpbGRPYmpDaGlsZHMuaXRlcmF0b3IoKTsgY2hpbGRPYmpJdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkT2JqQ2hpbGQgPSBjaGlsZE9iakl0ZXIubmV4dCgpOwotCQkJCWlmIChjaGlsZE9iakNoaWxkIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCXJldHVybiBjaGVja0NoaWxkcmVucyhjaGlsZE9iakNoaWxkKTsKLQkJCQl9Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkT2JqQ2hpbGQpKSB7Ci0JCQkJCWNoaWxkT2JqSXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hpbGRPYmpDaGlsZHMuaXNFbXB0eSgpKQotCQkJCS8vIGNoaWxkSXRlci5yZW1vdmUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODUyODQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGNvbCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKSB7Ci0JCQljb2wuYWRkQWxsKGdldENhdGVnb3J5SXRlbVByb3ZpZGVyKG9iamVjdCkuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQlyZXR1cm4gY29sOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb250ZW50RmlsdGVyKSB7Ci0JCQlyZXR1cm4gZ2V0Q29udGVudChvYmplY3QpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBbGxGaWx0ZXIpIHsKLQkJCXJldHVybiBnZXRBbGxDb250ZW50RWxlbWVudHMob2JqZWN0KTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ3VzdG9tRmlsdGVyKSB7Ci0JCQlyZXR1cm4gZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhvYmplY3QpOwotCQl9IGVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBUT0RPOiBmaWx0ZXIKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IFRuZ1V0aWwKLQkJCQkuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocm9vdEN1c3RvbUNhdGVnb3J5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCX0KLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKChNZXRob2RQbHVnaW4pIG9iamVjdCwKLQkJCQkoKElDYXRlZ29yeUZpbHRlcikgZmlsdGVyKS5nZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCkpOwotCQlDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSwgcGtnLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQljb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENvbnRlbnQoT2JqZWN0IG9iamVjdCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgoTWV0aG9kUGx1Z2luKSBvYmplY3QsCi0JCQkJKChJQ29udGVudEZpbHRlcikgZmlsdGVyKS5nZXRDb250ZW50UGFja2FnZVBhdGgoKSk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwa2csIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKHBrZyk7Ci0JfQotCi0JLy8gcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihPYmplY3Qgb2JqZWN0KQotCS8vIHsKLQkvLyBDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgoTWV0aG9kUGx1Z2luKW9iamVjdCwKLQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JLy8gQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyIGNvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlciA9IG5ldwotCS8vIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgcGtnKTsKLQkvLyBjb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JLy8gcmV0dXJuIGNvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcjsKLQkvLyB9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0QWxsQ29udGVudEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVN0cmluZ1tdIGNvcmVDb250ZW50UGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoOwotCQlDb250ZW50UGFja2FnZSBjb3JlUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoCi0JCQkJKE1ldGhvZFBsdWdpbikgb2JqZWN0LCBjb3JlQ29udGVudFBhdGgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGNvcmVQa2csIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCSgoSUNvbmZpZ3VyYWJsZSkgY29udGVudEFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQlsaXN0LmFkZEFsbChjb250ZW50QWRhcHRlci5nZXRDaGlsZHJlbihjb3JlUGtnKSk7Ci0KLQkJU3RyaW5nW11bXSBjYXRlZ29yeVBhdGhzID0gbmV3IFN0cmluZ1tdW10gewotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoIH07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeVBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBwYXRoID0gY2F0ZWdvcnlQYXRoc1tpXTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmplY3QsIHBhdGgpOwotCQkJQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlciBjb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBwa2csIGdldE5hbWUocGF0aCkpOwotCQkJY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuc2V0SW1hZ2UoZ2V0SW1hZ2UocGF0aCkpOwotCQkJY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCWxpc3QuYWRkKGNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpOwotCQl9Ci0KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVG5nVXRpbAotCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkJaWYgKHJvb3RDdXN0b21DYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZChyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCQl9Ci0KLQkJLy8gU3RyaW5nIG5hbWUgPQotCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQlQcm9jZXNzZXNJdGVtUHJvdmlkZXIgcHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnksIChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCXByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCWxpc3QuYWRkKHByb2Nlc3NJdGVtUHJvdmlkZXIpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIxLm5leHQoKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFByb2Nlc3NlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIC8vIFN0cmluZyBuYW1lID0KLQkvLyAvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsKLQkvLyAvLyAvLyROT04tTkxTLTEkCi0JLy8gUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCS8vIGFkYXB0ZXJGYWN0b3J5LCAoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCS8vIHByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JLy8gbGlzdC5hZGQocHJvY2Vzc0l0ZW1Qcm92aWRlcik7Ci0JLy8gcmV0dXJuIGxpc3Q7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nW10gcGF0aCkgewotCQlpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Eb21haW5zIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbHMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShTdHJpbmdbXSBwYXRoKSB7Ci0JCWlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmVjM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFjdGl2aXRpZXMgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiBwYWdlIG9mIGEKLSAqIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRFQ2xhc3NlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzI0MDQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYnJlYWsgZG93biBlbGVtZW50cyBpbiB0aGUgVGVhbSBBbGxvY2F0aW9uIHBhZ2UKLSAqIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwNjljNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBwcm9jZXNzZXMgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiBwYWdlCi0gKiBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHVibGljIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjY0NjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFjdGl2aXRpZXMgaW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotICogcGFnZSBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLy8gSUZpbHRlciBmaXRsZXI7Ci0JcHVibGljIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCS8vIFRoaXMgY2FsbCB0byBQQlNBY3RpaXZpdHlJdGVtUHJvdmlkZXIocHJvY2VzcyBwYWNrYWdlKSBpcyBkb25lCi0JCS8vIC0gaW4gb3JkZXIgcmVtb3ZlIGR1cGxpY2F0ZSBzdWJhcnRpZmFjdC4KLQkJY29sID0gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNvbCwgZmFsc2UpOwotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGExOTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYnJlYWsgZG93biBlbGVtZW50cyBpbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlCi0gKiBwYWdlIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiY2MwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgcHJvY2Vzc2VzIGluIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UgcGFnZQotICogb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4Yzk2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMmIwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgcGFja2FnZSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvL3ByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T2JqZWN0cyhvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9iamVjdHMoT2JqZWN0IG9iamVjdCkgewotCQlBcnJheUxpc3QgY29sID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBjaGlsZCA9IGVsZW1lbnQ7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCWNoaWxkID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2wuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5UGFja2FnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJfHwgIShvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPYmplY3RzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGFueVByb2Nlc3NDb21wb25lbnQoT2JqZWN0IHBhcmVudFByb2Nlc1BhY2thZ2UpIHsKLQkvLyBMaXN0IGxpc3QgPSAoKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnRQcm9jZXNQYWNrYWdlKS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCS8vIGlmIChmaWx0ZXIuYWNjZXB0KG9iaikpCi0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCS8vdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczMjRkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUHJvY2Vzc2VzIiBmb2xkZXIgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIsCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIE1ldGhvZFBsdWdpbgotCSAqIEBwYXJhbSBNb2RlbFN0cnVjdHVyZQotCSAqIAotCSAqIFBsdWdpbiBpcyByZXF1aXJlZCB0byBwYXNzLCB1c2VkIGluIGZpbmRpbmcgTWV0aG9kUGFja2FnZSBmb3IgcGFydGljdWxhcgotCSAqIE1vZGVsU3RydWN0dXJlLCBNb2RlbFN0cnVjdHVyZSBpcyBvcHRpb25hbC4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW10gewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0IikgfTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW11bXSBwcm9jZXNzUGF0aHMgPSBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgsCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGggfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc1BhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnMSA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkJLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcHJvY2Vzc1BhdGhzW2ldKTsKLQkJCQlpZiAocGtnMSAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCBpbWFnZSA9IFVtYUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCUNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgcGtnMSwgbmFtZXNbaV0sIGltYWdlKTsKLQkJCQkJaXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCQljaGlsZHJlbi5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MzljMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUm9sZSBTZXRzIiBmb2xkZXJzIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0KLQkJCS8vIFRPRE86IGNvbW1lbnRlZCBvdXQgdW50aWwgSmluaHVhIGZpeGVkIGJ1Z3MgaW4KLQkJCS8vIENvbmZpZ3VyYXRpb25GaWx0ZXIKLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCWNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKG9iamVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIlJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpOiByZXR1cm5lZCBmcm9tIGNvbmZpZ3VyYXRvcjogIiArIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQkJfQotCQkJfQotCi0JCQljaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlSb2xlU2V0R3JvdXBpbmcgZ3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSBvYmplY3Q7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBnZXRQYXJlbnQob2JqZWN0KSkKLQkJCQkJLmdldFRhcmdldCgpOwotCQkJVG5nVXRpbC5hZGRFeHRlbmRlZENoaWxkcmVuKGdyb3VwaW5nLCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0KLQkJCS8vIHNldCBwYXJlbnQKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBjb250ZW50QWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChjb250ZW50QWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGNvbnRlbnRBZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbkNvbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkvLyBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gfTsKLQkJLy8gT2JqZWN0IGFkYXB0ZXIgPQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gSUdyb3VwQ29udGFpbmVyIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQocGx1Z2luLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBpbnQgaTsKLQkJLy8gLy8gZm9yKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHsKLQkJLy8gLy8gZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyAvLyBpZihncm91cHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCS8vIC8vIH0KLQkJLy8gLy8gcmV0dXJuIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JCS8vIHJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJLy8gLy9yZXR1cm4gYWRhcHRlcjsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxZTM4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlIHNldCBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUm9sZVNldEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChnZXRQYXJlbnQob2JqZWN0KSk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQljb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBbGxGaWx0ZXIKLQkJCQkJfHwgZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKSB7Ci0JCQkJcmV0dXJuIGNvbDsKLQkJCX0KLQkJCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9Ci0JCQkvLyAoSXRlbVByb3ZpZGVyQWRhcHRlcikoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JCQkvLyAuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1ZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjcyMjkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBzZWxlY3Rpb24uIFRoZSBmaWx0ZXIgd2lsbAotICogY2hlY2sgaWYgb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBhcyB0aGUgYmFzZSBlbGVtZW50IG9mIHRoZSBmaWx0ZXIgb3duZXIuCi0gKiAKLSAqIEZpbHRlciBydWxlczoKLSAqIAotICogMS4gVGhlIGVsZW1lbnQgaXRzZWxmIGFuZCBpdCdzIGdlbmVyYWxpemVycyAoY29udHJpYnV0b3IsIHJlcGxhY2VyLCBvcgotICogZXh0ZW5kZXIpIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQKLSAqIDIuIEFueSBlbGVtZW50cyBpbiB0aGUgY29udGFpbm1lbnQgY2hhaW4gb2YgdGhlIGFib3ZlLCBzaG91bGQgYmUgZmlsdGVyZWQKLSAqIG91dAotICogMy4gaWYgYW55IG9mIHRoZSBiYXNlIGVsZW1lbnRzIGNhbid0IGJlIHNlbGVjdGVkLCB0aGVuIHRoaXMgZWxlbWVudCBjYW4ndAotICogYmUgc2VsZWN0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyIGltcGxlbWVudHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyIHsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIExpc3QgYmFkZ3V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLQkJLy8gZmlyc3Qgb2YgYWxsLCB5b3UgY2FuJ3QgdmFyeSB5b3Vyc2VsZgotCQliYWRndXlzLmFkZChlbGVtZW50KTsKLQotCQkvLyBnZXQgYWxsIG15IGdlbmVyYWxpemVycwotCQlJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGVsZW1lbnQpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQliYWRndXlzLmFkZCh2ZSk7Ci0KLQkJCS8vIHRoZSBjb250YWlubWVudCBjaGFpbiBvbiBteSBnZW5lcmFsaXplcnMgY2FuJ3QgYmUgbXkgYmFzZQotCQkJaGFuZGxlQ29udGFpbm1lbnRDaGFpbih2ZSk7Ci0JCX0KLQotCQkvLyBlbGVtZW50J3MgaW4gbXkgY2hhaW4gY2FuJ3QgYmUgbXkgYmFzZQotCQloYW5kbGVDb250YWlubWVudENoYWluKGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDb250YWlubWVudENoYWluKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCWlmICghaGFzQ29udGFpbm1lbnRGZWF0dXJlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCUxpc3Qgcm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsb2FkUm9vdEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KSBlLCByb290cyk7Ci0JCQliYWRndXlzLmFkZEFsbChyb290cyk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlMaXN0IHJvb3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZGVsaXZlcmFibGVQYXJ0cygoRGVsaXZlcmFibGUpIGUsIHJvb3RzKTsKLQkJCWJhZGd1eXMuYWRkQWxsKHJvb3RzKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250YWlubWVudCBmZWF0dXJlLAotCQkJLy8geW91IGNhbid0IHNlbGVjdCB0aGUgZWxlbWVudCBpbiB0aGUgY29udGFpbm1lbnQgY2hhaW4KLQkJCUVPYmplY3Qgcm9vdCA9IGdldENoYWluUm9vdChlKTsKLQkJCWlmICghYmFkZ3V5cy5jb250YWlucyhyb290KSkgewotCQkJCWJhZGd1eXMuYWRkKHJvb3QpOwotCQkJfQotCi0JCQkvKgotCQkJICogaG9sZCBvZmYgZm9yIG5vdyAvLyBhbHNvIG9ubHkgb25lIGVsZW1lbnQgaW4gYSBjaGFpbiBjYW4gYmUKLQkJCSAqIHNlbGVjdGVkIGFzIGJhc2UgLy8gc28gZ2V0IGFsbCB0aGUgYmFzZSBlbGVtZW50cyBpbiB0aGUgZWxlbWVudAotCQkJICogY2hhaW4sIGFuZCBibG9jayB0aGUgZWxlbWVudCBjaGFpbiBvZiB0aGUgYmFzZSBlbGVtZW50cwotCQkJICogZmlsdGVyVXNlZEJhc2VDaGFpbigoVmFyaWFiaWxpdHlFbGVtZW50KXJvb3QpOyBmb3IgKEl0ZXJhdG9yIGl0ID0KLQkJCSAqIHJvb3QuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTsgKSB7IE9iamVjdCBvID0gaXQubmV4dCgpOyBpZiAoCi0JCQkgKiBvLmdldENsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSApIHsKLQkJCSAqIGZpbHRlclVzZWRCYXNlQ2hhaW4oKFZhcmlhYmlsaXR5RWxlbWVudClvKTsgfSB9Ci0JCQkgKi8KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbGl2ZXJhYmxlUGFydHMoRGVsaXZlcmFibGUgZSwgTGlzdCByb290cykgewotCQlMaXN0IGxpc3QgPSAoKERlbGl2ZXJhYmxlKSBlKS5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQlyb290cy5hZGQob2JqKTsKLQkJCQkJZGVsaXZlcmFibGVQYXJ0cygoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUm9vdEN1c3RvbUNhdGVnb3JpZXMoQ3VzdG9tQ2F0ZWdvcnkgZSwgTGlzdCByb290cykgewotCQlMaXN0IGNzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlKTsKLQkJaWYgKGNzICE9IG51bGwgJiYgY3Muc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCWlmICghVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeShjYykpIHsKLQkJCQkJbG9hZFJvb3RDdXN0b21DYXRlZ29yaWVzKGNjLCByb290cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFyb290cy5jb250YWlucyhlKSkgewotCQkJCQkJcm9vdHMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICghcm9vdHMuY29udGFpbnMoZSkpIHsKLQkJCXJvb3RzLmFkZChlKTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgdm9pZCBmaWx0ZXJVc2VkQmFzZUNoYWluKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JLy8gVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkvLyBpZiAoYmFzZSAhPSBudWxsKSB7Ci0JLy8gLy8gaWYgdGhlIGVsZW1lbnQgY2hhaW4gaXMgc2VsZWN0ZWQgYXMgYmFzZSBpbiB0aGUgY3VycmVudCBjaGFpbiwKLQkvLyAvLyBubyBlbGVtZW50IGluIHRoYXQgY2hhaW4gY2FuIGJlIGZ1dGhlciBzZWxlY3RlZAotCS8vIE9iamVjdCByb290ID0gZ2V0Q2hhaW5Sb290KGJhc2UpOwotCS8vIGlmICghYmFkZ3V5cy5jb250YWlucyhyb290KSkgewotCS8vIGJhZGd1eXMuYWRkKHJvb3QpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NvbnRhaW5tZW50RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgZ2V0Q2hhaW5Sb290KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IHJvb3QgPSBlOwotCQlPYmplY3QgdHlwZSA9IGVsZW1lbnQuZ2V0VHlwZSgpOwotCQlFT2JqZWN0IHBhcmVudCA9IGU7Ci0JCXdoaWxlICgocGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKSkgIT0gbnVsbAotCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgcGFyZW50KS5nZXRUeXBlKCkgPT0gdHlwZSkgewotCQkJcm9vdCA9IHBhcmVudDsKLQkJfQotCi0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJLy8gYWx3YXlzIGFjY2VwdCBwYWNrYWdlcwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBtdXN0IGJlIHZhcmlhYmlsaXR5IGVsZW1lbnQgYW5kIGNhbid0IGJlIGl0c2VsZgotCQlpZiAob2JqID09IGVsZW1lbnQgfHwgIShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBtdXN0IGJlIHRoZSBzYW1lIHR5cGUKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQlpZiAodmUuZ2V0VHlwZSgpICE9IGVsZW1lbnQuZ2V0VHlwZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjYW4ndCBiZSBteSBhbnkgb2YgbXkgZ2VuZXJhbGl6ZXJzCi0JCWlmIChiYWRndXlzLmNvbnRhaW5zKG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGlmIHRoaXMgZWxlbWVudCdzIGJhc2UgY2hhaW4gaXMgYSBiYWRndXksIGNhbid0IGFjY2VwdCwgb3RoZXJ3aXNlLCBhCi0JCS8vIGNpcmN1bGFyIGxvY2sKLQkJd2hpbGUgKCh2ZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgIT0gbnVsbCkgewotCQkJaWYgKGJhZGd1eXMuY29udGFpbnModmUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGFueXRoaW5nIGVsc2UgPwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzA0YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZmlsdGVyaW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0Fic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9BYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjkzMGJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0Fic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBjbGFzcyBmb3IgdGhlICJQcm9jZXNzZXMiIGZvbGRlciBpbgotICogdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIgewotCXByb3RlY3RlZCBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBwcmVmU3RvcmVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tb2RlbFN0cnVjdCA9IG1vZGVsU3RydWN0OwotCi0JCS8vIGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBpZiAocHJlZlN0b3JlICE9IG51bGwpIHsKLQkJLy8gcHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgPSBwcmVmU3RvcmUKLQkJLy8gLmdldEJvb2xlYW4oTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04pOwotCQkvLyBwcmVmU3RvcmVMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8KLQkJLy8gcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKSA9PQotCQkvLyBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTikgewotCQkvLyBib29sZWFuIG5ld1ZhbHVlID0gcHJlZlN0b3JlLmdldEJvb2xlYW4oZXZlbnQKLQkJLy8gLmdldFByb3BlcnR5KCkpOwotCQkvLyBpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgIT0gbmV3VmFsdWUpIHsKLQkJLy8gcHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgPSBuZXdWYWx1ZTsKLQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJLy8gbmV3IE5vdGlmaWNhdGlvbkltcGwoLTEsIC0xLCAtMSksCi0JCS8vIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLnRoaXMsIHRydWUsCi0JCS8vIGZhbHNlKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIH07Ci0JCS8vIHByZWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZTdG9yZUxpc3RlbmVyKTsKLQkJLy8gfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIHByZWZTdG9yZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXByZWZTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZTdG9yZUxpc3RlbmVyKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWZjNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjYmM3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDb25maWd1cmF0aW9ucyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgTWV0aG9kTGlicmFyeSBtZXRob2RMaWJyYXJ5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGxpYiwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuICEob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db25maWd1cmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoTWV0aG9kTGlicmFyeSkgdGFyZ2V0KQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DT05GSUdVUkFUSU9OKTsgCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5LmNsYXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uLCB0aGlzKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kI2dldFZhbGlkYXRvcigpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3Iob3duZXIsIChNZXRob2RDb25maWd1cmF0aW9uKWNoaWxkKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkYXRvcigpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbnRlbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbnRlbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjYzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db250ZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJNZXRob2QgQ29udGVudCIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyAiTWV0aG9kQ29udGVudEl0ZW1Qcm92aWRlciIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUdyb3VwQ29udGFpbmVyIHsKLQotCXByb3RlY3RlZCBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJvdGVjdGVkIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0OwotCi0JcHJvdGVjdGVkIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJdGhpcy5tb2RlbFN0cnVjdCA9IG1vZGVsU3RydWN0OwotCX0KLQkKLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgZ2V0Q29yZUNvbnRlbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gY29yZUNvbnRlbnRQa2c7Ci0JfQotCQotCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBjb3JlQ29udGVudFBrZzsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZyBuYW1lOwotCQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIgY2hpbGQ7Ci0KLQkJCS8vIGZpbmQgY29yZSBjb250ZW50IHBhY2thZ2UKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCW1vZGVsU3RydWN0LmNvcmVDb250ZW50UGF0aCk7Ci0JCQljb3JlQ29udGVudFBrZyA9IGNvbnRlbnRQa2c7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29udGVudF9ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJLy8gY29udGVudFBrZywgbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0JCQkJLy8JICAgICAgICAKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LmRvbWFpblBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBEb21haW5zSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCS8vIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCQkJCS8vCQotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3Qud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJLy8gY29udGVudFBrZywgbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0JCQkJLy8JICAgICAgICAKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LnJvbGVTZXRQYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBSb2xlU2V0c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkvLyBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkgICAgICAgIAotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3QudG9vbFBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgVG9vbHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJLy8gbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyBjcmVhdGUgdGhlIHN0YW5kYXJkIGNhdGVnb3JpZXMgZm9sZGVyCi0JCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCW1vZGVsU3RydWN0LnN0YW5kYXJkQ2F0ZWdvcnlQYXRoKTsKLQkJCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY2hpbGQgPSBuZXcgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJCWNvbnRlbnRQa2csIG5hbWUpOwotCQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJfQotCi0JCQkJLy8gY3JlYXRlIHRoZSBjdXN0b21lIGNhdGVnb3JpZXMgZm9sZGVyCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkvLyBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQotCQkJCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKTsKLQkJCQlpZiAocm9vdEN1c3RvbUNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBub3RpZnkgPSByb290Q3VzdG9tQ2F0ZWdvcnkuZURlbGl2ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJvb3RDdXN0b21DYXRlZ29yeS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCQlyb290Q3VzdG9tQ2F0ZWdvcnkuc2V0TmFtZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXJvb3RDdXN0b21DYXRlZ29yeS5lU2V0RGVsaXZlcihub3RpZnkpOwotCQkJCQl9Ci0JCQkJCWNoaWxkcmVuLmFkZChyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQotCQkJCS8vIElDb25maWd1cmFibGUgYWRhcHRlciA9IChJQ29uZmlndXJhYmxlKQotCQkJCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChjb250ZW50UGtnLAotCQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJLy8gYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9NZXRob2RDb250ZW50X2dyb3VwIikpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjb250ZW50UGtnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0NvbnRlbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwICE9IG51bGwgPyBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSkKLQkJCQk6IG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cEl0ZW1Qcm92aWRlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBudWxsOwotCQl9Ci0JCWlmKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJcGx1Z2luID0gbnVsbDsKLQkJY29yZUNvbnRlbnRQa2cgPSBudWxsOwotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0RlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMWZhNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGVsaXZlcnkgcHJvY2VzcyBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzOGVlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuYnJlYWtkb3duZWxlbWVudC5BY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQuTWlsZXN0b25lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlRvb2xJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LkFydGlmYWN0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LkNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuUm9sZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuU2VjdGlvbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuVGFza0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSVJlZmVyZW5jZXIgewotCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIEFydGlmYWN0SXRlbVByb3ZpZGVyIG15QXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgR3VpZGFuY2VJdGVtUHJvdmlkZXIgZ3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgbXlPdXRjb21lSXRlbVByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIG15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBSZWZlcmVuY2VzIHRvIHN0YXRlZnVsIGFkYXB0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgU2V0IGRpc3Bvc2FibGVBZGFwdGVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkvLyBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGFwdGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNhZGFwdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0eXBlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIKLQkJCQkmJiBub3RpZmllciBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWVyKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJZGlzcG9zYWJsZUFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db3JlY29udGVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiByb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvcmVjb250ZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlVGFza0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlpZiAodGFza0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0YXNrSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFza0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Xb3JrcHJvZHVjdHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpIHsKLQkJaWYgKG15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbXlBcnRpZmFjdEl0ZW1Qcm92aWRlciA9IG5ldyBBcnRpZmFjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBteUFydGlmYWN0SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Xb3JrcHJvZHVjdHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpIHsKLQkJaWYgKG15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIuY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuV29ya3Byb2R1Y3RzQWRhcHRlckZhY3RvcnkjY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCkgewotCQlpZiAobXlPdXRjb21lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15T3V0Y29tZUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIuY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbXlPdXRjb21lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0ZhbWlseUFkYXB0ZXIoKQotCSAqLwotCS8qCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0ZhbWlseUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyOwotCX0KLQkqLwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlhZGFwdGVyLnNldE1vZGVsU3RydWN0dXJlKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1ldGhvZG1vZGVsc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1ldGhvZG1vZGVsc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudGNhdGVnb3JpZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlpZiAoZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBEaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudGNhdGVnb3JpZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVEb21haW5BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlciA9IG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZG9tYWluSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBSb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudGNhdGVnb3JpZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCS8vIGlmIChkaXNjaXBsaW5lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJLy8gZGlzY2lwbGluZUl0ZW1Qcm92aWRlciA9IG5ldyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiBkaXNjaXBsaW5lSXRlbVByb3ZpZGVyOwotCi0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZVNldEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQkvLyBpZiAocm9sZVNldEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCS8vIHJvbGVTZXRJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZVNldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLwotCQkvLyByZXR1cm4gcm9sZVNldEl0ZW1Qcm92aWRlcjsKLQotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUm9sZVNldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ29udGVudGNhdGVnb3JpZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUb29sQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbEFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUb29sSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50Y2F0ZWdvcmllc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hQWRhcHRlckZhY3RvcnkjY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKSB7Ci0JCWlmIChndWlkYW5jZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlndWlkYW5jZUl0ZW1Qcm92aWRlciA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gZ3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUVzdGltYXRlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqICAgICAgQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFc3RpbWF0aW5nTWV0cmljQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByYWN0aWNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlpZiAocHJhY3RpY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJhY3RpY2VJdGVtUHJvdmlkZXIgPSBuZXcgUHJhY3RpY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHByYWN0aWNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSZXBvcnRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXBvcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvYWRtYXBBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkbWFwQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZWNobmlxdWVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZWNobmlxdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlbXBsYXRlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlcm1EZWZpbml0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdEd1aWRlbGluZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0R3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCkgewotCQlpZiAoc2VjdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZWN0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFNlY3Rpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VjdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCWlmIChjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXaGl0ZXBhcGVyQWRhcHRlcigpIHsKLQkJLy8gaWYgKHdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkvLyB3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID0gbmV3IFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcmV0dXJuIHdoaXRlcGFwZXJJdGVtUHJvdmlkZXI7Ci0KLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJaWYgKGNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyID0gbmV3IENhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlpZiAoZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJaWYgKG1pbGVzdG9uZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltaWxlc3RvbmVJdGVtUHJvdmlkZXIgPSBuZXcgTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBtaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ3VpZGFuY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZ3VpZGFuY2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJZ3VpZGFuY2VJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0JCWlmIChteUFydGlmYWN0SXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCW15QXJ0aWZhY3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbXlBcnRpZmFjdEl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKG15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAobXlPdXRjb21lSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCW15T3V0Y29tZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlteU91dGNvbWVJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGFkYXB0ZXJzKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJLy8gaWYoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCS8vICgoSURpc3Bvc2FibGUpYWRhcHRlcikuZGlzcG9zZSgpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYWRhcHRlcnMuY2xlYXIoKTsKLQotCQlpZiAoIWRpc3Bvc2FibGVBZGFwdGVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpc3Bvc2FibGVBZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJRGlzcG9zYWJsZSBhZGFwdGVyID0gKElEaXNwb3NhYmxlKSBpdGVyLm5leHQoKTsKLQkJCQlhZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5jbGVhcigpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXIjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCByZWYpIHsKLQkJcmV0dXJuIGRpc3Bvc2FibGVBZGFwdGVycy5yZW1vdmUocmVmKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXIjY2xlYW5VcCgpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKLQkJQXJyYXlMaXN0IGFkYXB0ZXJzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoZGlzcG9zYWJsZUFkYXB0ZXJzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVN0YXRlZnVsSXRlbVByb3ZpZGVyCi0JCQkJCSYmIGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXJzVG9SZW1vdmUuYWRkKGFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk6IG51bWJlciBvZiBhZGFwdGVycyB0byByZW1vdmU6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgYWRhcHRlcnNUb1JlbW92ZS5zaXplKCkpOwotCQl9Ci0JCWRpc3Bvc2FibGVBZGFwdGVycy5yZW1vdmVBbGwoYWRhcHRlcnNUb1JlbW92ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTc5MDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGxpYiA9IChFT2JqZWN0KSBwYXJlbnQ7Ci0JCQlpZiAobGliID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKGxpYiwgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0Q29uZmlndXJhdGlvbnMoKQotCQkJCQk6IG51bGw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2YzNGNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlciBjb25maWd1cmF0aW9uczsKLQkKLQlwcm90ZWN0ZWQgUGx1Z2luVUlQYWNrYWdlQnVpbGRlciBwbHVnaW5Qa2dCdWlsZGVyOwotCQotCS8vcHJpdmF0ZSBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIgcHJvY0ZhbWlsaWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXBsdWdpblBrZ0J1aWxkZXIgPSBuZXcgUGx1Z2luVUlQYWNrYWdlQnVpbGRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWV0aG9kUGx1Z2luKCkpKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgCi0JcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0PE9iamVjdD4gY2hpbGRyZW47Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICYmICFQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmlzRmxhdExheW91dCgpKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBnZXRNZXRob2RQbHVnaW5zKChNZXRob2RMaWJyYXJ5KW9iamVjdCk7Ci0JCQlhZGRDaGlsZHJlbihjaGlsZHJlbiwgcGx1Z2lucywgb2JqZWN0KTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLlBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUik7Ci0JCX0gZWxzZSB7IAotCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCWNoaWxkcmVuID0gKExpc3QpIGNvbGxlY3Rpb247Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGNvbGxlY3Rpb24pOwotCQkJfQotCQkJLy8gc2V0IHBhcmVudHMKLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoaXRlci5uZXh0KCksCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SKTsKLQkJfQotCQlpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbnMgPSBuZXcgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCShNZXRob2RMaWJyYXJ5KSBvYmplY3QsIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljaGlsZHJlbi5hZGQoY29uZmlndXJhdGlvbnMpOwotCi0JCS8vIFJlbW92ZSAnUHJvY2VzcyBGYW1pbGllcycgdW50aWwgaXQgaXMgZnVsbHkgaW1wbGVtZW50ZWQKLQkJLy8KLQkJLy8gaWYocHJvY0ZhbWlsaWVzID09IG51bGwpIHsKLQkJLy8gcHJvY0ZhbWlsaWVzID0gbmV3IFByb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJLy8gKE1ldGhvZExpYnJhcnkpIG9iamVjdCwKLQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQiKSk7Ci0JCS8vIH0KLQkJLy8gY2hpbGRyZW4uYWRkKHByb2NGYW1pbGllcyk7Ci0JCQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oQ29sbGVjdGlvbjxPYmplY3Q+IGNoaWxkcmVuLCBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucywKLQkJCU9iamVjdCBwYXJlbnQpIHsKLQkJcGx1Z2luUGtnQnVpbGRlci5hZGRDaGlsZHJlbihjaGlsZHJlbiwgcGx1Z2lucywgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2lucyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCUVMaXN0PEVPYmplY3Q+IGVsZW1lbnRzID0gbGlicmFyeS5lQ29udGVudHMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoRU9iamVjdCBlbGVtZW50IDogZWxlbWVudHMpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpdGVtcy5hZGQoKE1ldGhvZFBsdWdpbillbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCi0JcHVibGljIE9iamVjdCBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25zOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJvY2Vzc0ZhbWlsaWVzKCkgewotCQkvL3JldHVybiBwcm9jRmFtaWxpZXM7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgaW50KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjb25maWd1cmF0aW9ucyAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9ucy5kaXNwb3NlKCk7Ci0JCQljb25maWd1cmF0aW9ucyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChwbHVnaW5Qa2dCdWlsZGVyICE9IG51bGwpIHsKLQkJCXBsdWdpblBrZ0J1aWxkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQkvKgotCQlpZiAocHJvY0ZhbWlsaWVzICE9IG51bGwpIHsKLQkJCXByb2NGYW1pbGllcy5kaXNwb3NlKCk7Ci0JCQlwcm9jRmFtaWxpZXMgPSBudWxsOwotCQl9Ci0JCSovCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4gdGhlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZm9yIHRoZSBwbHVnaW4gLSBlaXRoZXIgYSBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgb3IgYSBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLiBudWxsIGlmIG5vbmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRQbHVnaW5JdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCWludCBkb3RJZHggPSBwbHVnaW5OYW1lCi0JCQkJLmluZGV4T2YoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5QTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IpOwotCQlpZiAoZG90SWR4ICE9IC0xKSB7Ci0JCQlTdHJpbmcgcGFja2FnZVByb3ZpZGVyTmFtZSA9IHBsdWdpbk5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCk7Ci0JCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGtnQnVpbGRlcgotCQkJCQkuZ2V0UGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcihwYWNrYWdlUHJvdmlkZXJOYW1lKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIChNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIpIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sCi0JCQkJCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzY0NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgIkNvbnRlbnRQYWNrYWdlc0l0ZW1Qcm92aWRlciIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpIHsKLQkJCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoCi0JCQkJCSgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkuZ2V0Q2hpbGRQYWNrYWdlcygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09OVEVOVF9QQUNLQUdFKTsgCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbnRlbnRQYWNrYWdlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBzb3J0aW5nIHRoZSBjb250ZW50IHBhY2thZ2VzCi0JCS8vCi0JCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0KLQkJLy8gc2V0IHBhcmVudCBmb3IgY2hpbGRyZW4KLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWM2NzI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGV4dGVuZHMgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyBJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIG9iamVjdDsKLQotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCVN0cmluZyBuYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJT2JqZWN0IGNoaWxkID0gbmV3IENvbnRlbnRJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHBsdWdpbiwKLQkJCQkJZ2V0TW9kZWxTdHJ1Y3R1cmUoKSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHBsdWdpbiwKLQkJCQkJZ2V0TW9kZWxTdHJ1Y3R1cmUoKSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQkJY2hpbGRyZW4gPSBudWxsOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKCgoTWV0aG9kUGx1Z2luKSBvYmplY3QpLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkpID8gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4iKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBsdWdpbl9ncmV5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0JCQlUbmdVdGlsLnJlZnJlc2hQbHVnaW5FeHRlbmRlcnModGhpcywgbm90aWZpY2F0aW9uLCB0cnVlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbmFtZSA9IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCi0JCWlmICgoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSAmJiAhUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSkgewotCQkJU3RyaW5nIGRlbHRhTmFtZSA9IFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuZ2V0TmFtZURlbHRhKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKWdldFBhcmVudCgpLCBvYmplY3QpOwotCQkJcmV0dXJuIGRlbHRhTmFtZTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1BsdWdpblVJUGFja2FnZUJ1aWxkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1BsdWdpblVJUGFja2FnZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4ODUyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QbHVnaW5VSVBhY2thZ2VCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QbHVnaW5VSVBhY2thZ2VzTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZUJ1aWxkZXIgewotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyPiBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI+KCk7Ci0KLQlwdWJsaWMgUGx1Z2luVUlQYWNrYWdlQnVpbGRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIGdldFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHBsdWdpblBrZ05hbWUpIHsKLQkJcmV0dXJuIHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQocGx1Z2luUGtnTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gZ2V0Q2hpbGRyZW4oQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJQXJyYXlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYWRkQ2hpbGRyZW4oY2hpbGRyZW4sIHBsdWdpbnMsIG51bGwpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXRhaW5QbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5TmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFuYW1lcy5jb250YWlucyhrZXlOYW1lKSkgewotCQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KGtleU5hbWUpOwotCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKENvbGxlY3Rpb248T2JqZWN0PiBjaGlsZHJlbiwgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMsIE9iamVjdCBwYXJlbnQpIHsKLQkJUGx1Z2luVUlQYWNrYWdlc01hcCBtYXAgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc01hcCgpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IHBsdWdpbnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJCWludCBkb3RJZHggPSBwbHVnaW5OYW1lLmluZGV4T2YoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5QTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IpOwotCQkJaWYgKGRvdElkeCAhPSAtMSkgewotCQkJCW1hcC5hZGQocGx1Z2luTmFtZS5zdWJzdHJpbmcoMCwgZG90SWR4KSwgcGx1Z2luKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHBsdWdpbik7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwbHVnaW4sCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFNldDxNZXRob2RQbHVnaW4+Pj4gaXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnk8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlTZXQ8TWV0aG9kUGx1Z2luPiBwbHVnU2V0ID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KG5hbWUpOwotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlwcm92aWRlciA9IG5ldyBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBuYW1lLCBwbHVnU2V0KTsKLQkJCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAucHV0KG5hbWUsIHByb3ZpZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvdmlkZXIuc2V0UGx1Z2lucyhwbHVnU2V0KTsKLQkJCX0KLQkJCWV4aXN0aW5nTmFtZXMuYWRkKG5hbWUpOwotCQkJcHJvdmlkZXIuc2V0UGFyZW50KHBhcmVudCk7Ci0JCQljaGlsZHJlbi5hZGQocHJvdmlkZXIpOwotCQl9Ci0JCXJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhleGlzdGluZ05hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwICE9IG51bGwpIHsKLQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5jbGVhcigpOwotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1BsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1BsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkY2YxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QbHVnaW5VSVBhY2thZ2VzTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogSXRlbSBQcm92aWRlciBBZGFwdGVyIHRoYXQgcmVwcmVzZW50cyBhIHBsdWdpbi1wYWNrYWdlLiAgVGhpcyBpcyBhIFVJIGZvbGRlciBvbmx5Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnM7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI+IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcj4oKTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubmFtZSA9IHBhY2thZ2VOYW1lOwotCQl0aGlzLnBsdWdpbnMgPSBwbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyBJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbmFtZTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9wYWNrYWdlX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZURlbHRhKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgdG9wT2JqZWN0LCBPYmplY3QgYm90dG9tT2JqZWN0KSB7Ci0JCQotCQlTdHJpbmcgdG9wTmFtZT0gdG9wT2JqZWN0LmdldEZ1bGxOYW1lKCk7Ci0JCVN0cmluZyBib3R0b21OYW1lID0gbnVsbDsKLQkJaWYgKGJvdHRvbU9iamVjdCBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWJvdHRvbU5hbWUgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpYm90dG9tT2JqZWN0KS5nZXRGdWxsTmFtZSgpOwotCQkJCi0JCX0gZWxzZSBpZiAoYm90dG9tT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlib3R0b21OYW1lID0gKChNZXRob2RQbHVnaW4pYm90dG9tT2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCWlmKGJvdHRvbU5hbWUgPT0gbnVsbCB8fCB0b3BOYW1lLmVxdWFscyhib3R0b21OYW1lKSkKLQkJCXJldHVybiB0b3BOYW1lOwotCQl0cnkgewotCQkJU3RyaW5nIGRlbHRhbmFtZT0gYm90dG9tTmFtZS5zdWJzdHJpbmcodG9wTmFtZS5sZW5ndGgoKSsxKTsKLQkJCXJldHVybiBkZWx0YW5hbWU7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGJvdHRvbU5hbWU7Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCXJldHVybiBhZGRDaGlsZHJlbihwbHVnaW5zKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gYWRkQ2hpbGRyZW4oQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUGx1Z2luVUlQYWNrYWdlc01hcCBtYXAgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc01hcCgpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IHBsdWdpbnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBkZWx0YU5hbWUgPSBnZXROYW1lRGVsdGEodGhpcywgcGx1Z2luKTsKLQkJCWludCBkb3RJZHggPSBkZWx0YU5hbWUuaW5kZXhPZihQTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IpOwotCQkJaWYgKGRvdElkeCAhPSAtMSkgewotCQkJCW1hcC5hZGQoZGVsdGFOYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpLCBwbHVnaW4pOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBsdWdpbiwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFNldDxNZXRob2RQbHVnaW4+Pj4gaXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnk8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlTZXQ8TWV0aG9kUGx1Z2luPiBwbHVnU2V0ID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KGdldEZ1bGxOYW1lKCkgKyBQTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IgKyBuYW1lKTsKLQkJCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXIgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbmFtZSwgcGx1Z1NldCk7Ci0JCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLnB1dChnZXRGdWxsTmFtZSgpICsgUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSwgcHJvdmlkZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm92aWRlci5zZXRQbHVnaW5zKHBsdWdTZXQpOwotCQkJfQotCQkJZXhpc3RpbmdOYW1lcy5hZGQoZ2V0RnVsbE5hbWUoKSArIFBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUiArIG5hbWUpOwotCQkJcHJvdmlkZXIuc2V0UGFyZW50KHRoaXMpOwotCQkJY2hpbGRyZW4uYWRkKHByb3ZpZGVyKTsKLQkJfQotCQlyZXRhaW5QbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnMoZXhpc3RpbmdOYW1lcyk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLlBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLQkJU3RyaW5nIGZ1bGxOYW1lID0gZ2V0TmFtZSgpOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0JCXdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlmdWxsTmFtZSA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilwYXJlbnQpLmdldE5hbWUoKSArIFBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUiArIGZ1bGxOYW1lOwotCQkJcGFyZW50ID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBhcmVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGxOYW1lOwotCQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19OQU1FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gcmVtb3ZlIHRoaXMgZnJvbSB0aGUgcGx1Z2lucycgYWRhcHRlciBsaXN0Ci0JCWlmIChwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgIT0gbnVsbCkgewotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmNsZWFyKCk7Ci0JCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXlOYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGtleU5hbWUpKSB7Ci0JCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQoa2V5TmFtZSk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gZ2V0UGx1Z2lucygpIHsKLQkJcmV0dXJuIHBsdWdpbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGx1Z2lucyhDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQl0aGlzLnBsdWdpbnMgPSBwbHVnaW5zOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybiB0aGUgSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgdGhlIHBsdWdpbiAtIGVpdGhlciBhIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBvciBhIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuIG51bGwgaWYgbm9uZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldFBsdWdpbkl0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCVN0cmluZyBkZWx0YU5hbWUgPSBnZXROYW1lRGVsdGEodGhpcywgcGx1Z2luKTsKLQkJaW50IGRvdElkeCA9IGRlbHRhTmFtZS5pbmRleE9mKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SKTsKLQkJaWYgKGRvdElkeCAhPSAtMSkgewotCQkJU3RyaW5nIHBhY2thZ2VQcm92aWRlck5hbWUgPSBkZWx0YU5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCk7Ci0JCQlpZiAocGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwICE9IG51bGwpIHsKLQkJCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChnZXRGdWxsTmFtZSgpICsgUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SICsgcGFja2FnZVByb3ZpZGVyTmFtZSk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJCX0KLQkJCX0JCQkKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIocGx1Z2luLCBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaXRlbU5hbWUgbmFtZSBvZiBpdGVtIHRvIGZpbmQKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIHRoZSBNZXRob2RQbHVnaW4gb3IgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaW5kUGx1Z2luSXRlbVByb3ZpZGVyKFN0cmluZyBpdGVtTmFtZSwgTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGxpYiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQlNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGxpYnJhcnlBZGFwdGVyID0gKE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5MaXN0ID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJCWZvciAoTWV0aG9kUGx1Z2luIHBsdWdpbiA6IHBsdWdpbkxpc3QpIHsKLQkJCQlpZiAoaXRlbU5hbWUuZXF1YWxzKHBsdWdpbi5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBwbHVnaW47Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248Pz4gY2hpbGRyZW4gPSBsaWJyYXJ5QWRhcHRlci5nZXRDaGlsZHJlbihsaWIpOwotCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcGx1Z2luVHJlZUFkYXB0ZXIgPSBsaWJyYXJ5QWRhcHRlci5nZXRQbHVnaW5JdGVtUHJvdmlkZXIocGx1Z2luKTsKLQkJCQl3aGlsZSAocGx1Z2luVHJlZUFkYXB0ZXIgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWlmIChpdGVtTmFtZS5lcXVhbHMoKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBsdWdpblRyZWVBZGFwdGVyKS5nZXRGdWxsTmFtZSgpKSkgewotCQkJCQkJcmV0dXJuIHBsdWdpblRyZWVBZGFwdGVyOwotCQkJCQl9Ci0JCQkJCWNoaWxkcmVuID0gcGx1Z2luVHJlZUFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGx1Z2luVHJlZUFkYXB0ZXIpOwotCQkJCQlwbHVnaW5UcmVlQWRhcHRlciA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilwbHVnaW5UcmVlQWRhcHRlcikuZ2V0UGx1Z2luSXRlbVByb3ZpZGVyKHBsdWdpbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY1ODc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJhY3RpY2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElEZWZhdWx0TmFtZVNldHRlciB7Ci0KLQlwdWJsaWMgUHJhY3RpY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJhY3RpY2UoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IHBhcmVudCA9IFRuZ1V0aWwKLQkJCQkuZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKChHdWlkYW5jZSkgb2JqZWN0KTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBtc2cpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKSBnZXRQYXJlbnQob2JqKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHByYWN0aWNlLmdldFN1YlByYWN0aWNlcygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUFJBQ1RJQ0UpOyAKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByYWN0aWNlLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwZjFkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGlmKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkvLyBjaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSk7Ci0JCS8vIC8vCi0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX0JyZWFrZG93bkVsZW1lbnRzKCkpOwotCQkvLyAvLwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9XQlMoKSk7Ci0JCS8vIC8vCi0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX09CUygpKTsKLQkJLy8gLy8KLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfUEJTKCkpOwotCQkvLyB9Ci0JCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX05BTUU6Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJaWYgKHBjLmdldFByb2Nlc3MoKSAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBvbGQgPSBwYy5nZXRQcm9jZXNzKCkuZURlbGl2ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCQlwYy5nZXRQcm9jZXNzKCkuc2V0TmFtZShwYy5nZXROYW1lKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihvbGQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjgwNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3MgRmFtaWxpZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZExpYnJhcnkgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRmFtaWx5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NGYW1pbGllcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KQotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKE1ldGhvZExpYnJhcnkpIHRhcmdldCkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUFJPQ0VTU19GQU1JTFkpOyAKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKE1ldGhvZExpYnJhcnkpIHRhcmdldCkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09ORklHVVJBVElPTik7IAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeS5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5M2JjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIHByb2Nlc3MgZmFtaWx5IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgbGliID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGxpYiwgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRQcm9jZXNzRmFtaWxpZXMoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNjBjMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklQcm9jZXNzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIHBhY2thZ2UgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVByb2Nlc3NJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgRUNsYXNzIHByb2Nlc3NUeXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzVHlwZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NUeXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkmJiAoY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHByb2Nlc3NUeXBlICE9IG51bGwpCi0JCQkJCWl0ZW1Qcm92aWRlci5zZXRQcm9jZXNzVHlwZShwcm9jZXNzVHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KChMaXN0KSBjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGFja2FnZUNvbXBhcmF0b3IoKSk7Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUVDbGFzcyBwcm9jVHlwZSA9IGdldFByb2Nlc3NUeXBlKCk7Ci0JCWlmIChwcm9jVHlwZSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwKLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKHByb2NUeXBlCi0JCQkJCQkuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKQotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmIChwcm9jVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc1R5cGUoRUNsYXNzIHByb2Nlc3NUeXBlKSB7Ci0JCXRoaXMucHJvY2Vzc1R5cGUgPSBwcm9jZXNzVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5jcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoKSIpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gbmV3IENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsCi0JCQkJCXZhbHVlLCBpbmRleCwgY29sbGVjdGlvbiwgdGhpcyk7Ci0JCX0KLQkJLy8gcmV0dXJuIHN1cGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwKLQkJLy8gaW5kZXgsIGNvbGxlY3Rpb24pOwotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwKLQkJCQl2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24sIHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCUVDbGFzcyBwcm9jZXNzVHlwZSA9IGdldFByb2Nlc3NUeXBlKCk7Ci0JCQlpZiAocHJvY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJCWlmIChwcm9jZXNzVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChwcm9jZXNzVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkgewotCQkJCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCUVDbGFzcyBwcm9jZXNzVHlwZSA9IGdldFByb2Nlc3NUeXBlKCk7Ci0JCQlpZiAocHJvY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJCWlmIChwcm9jZXNzVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKSkgewotCQkJCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChwcm9jZXNzVHlwZS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSkpIHsKLQkJCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkgewotCQkJCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkSW1hZ2Uob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgaW50KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCS8vIGNoZWNrIHRvIGV4Y2x1ZGUgYW55IHBhc3RlZC1pbiBwYWNrYWdlIHRoYXQgY29udGFpbnMKLQkJCQkvLyBwcm9jZXNzIG9mIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhhdCBvZiB0aGlzIHBhY2thZ2UKLQkJCQkvLwotCQkJCWlmICghUHJvY2Vzc1V0aWwuaGFzUHJvY2Vzc05vdE9mVHlwZSgoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsCi0JCQkJCQlwcm9jZXNzVHlwZSkpIHsKLQkJCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJLy8gcmV0dXJuIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwKLQkJLy8gaW5kZXgpOwotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHNlbGVjdGlvbiwgaW5kZXgpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBmZWF0dXJlQ2hhbmdlZChFT2JqZWN0IG9iamVjdCwKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkmJiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJCXByb2Muc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWQ4MTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUHJvY2Vzc2VzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfQ09OVFJJQlVUSU9OU19MQUJFTCA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZTsKLQlwcml2YXRlIFByb2Nlc3NQYWNrYWdlIGNhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZTsKLQlwcml2YXRlIFByb2Nlc3NQYWNrYWdlIGRlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbW9kZWxTdHJ1Y3QpOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UgcGtnID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwKLQkJCQkJLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCQltb2RlbFN0cnVjdC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQkJY2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlID0gcGtnOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQocGtnLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWFkYXB0ZXIuc2V0UHJvY2Vzc1R5cGUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKTsKLQkJCQlhZGFwdGVyLnNldExhYmVsKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGFwdGVyLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQocGtnKTsKLQkJCX0KLQkJCXBrZyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsCi0JCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIG1vZGVsU3RydWN0LmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCQkJZGVsaXZlcnlQcm9jZXNzUGFja2FnZSA9IGRlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2U7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChwa2csCi0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJYWRhcHRlci5zZXRQcm9jZXNzVHlwZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKTsKLQkJCQlhZGFwdGVyLnNldExhYmVsKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkYXB0ZXIuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChwa2cpOwotCQkJfQotCi0JCQlpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQpIHsKLQkJCQljaGlsZHJlbi5hZGQoZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlKCkpOwotCQkJfQotCi0JCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkvLyBTdHJpbmcgbmFtZSA9Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9QbGFubmluZ1RlbXBsYXRlc19ncm91cCIpOwotCQkJLy8gT2JqZWN0IGNoaWxkID0gbmV3IFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJLy8gcGx1Z2luLCBuYW1lKTsKLQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBjb21tZW50IG91dCB0aGUgcGxhbm5pbmcgdGVtcGxhdGVzIGZvciBUTkcgcmVsZWFzZSBvbmUgYXQKLQkJCS8vIDIwMDUtMDUtMDkKLQkJCS8vIHBrZyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlKQotCQkJLy8gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkvLyBtb2RlbFN0cnVjdC5wcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGgpOwotCQkJLy8gaWYocGtnID09IG51bGwpIHsKLQkJCS8vIHBrZyA9Ci0JCQkvLyBNb2RlbFN0cnVjdHVyZS5jcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhY2thZ2UocGx1Z2luKTsKLQkJCS8vIH0KLQkJCS8vIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpCi0JCQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQocGtnLAotCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCS8vIGFkYXB0ZXIuc2V0UHJvY2Vzc1R5cGUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSk7Ci0JCQkvLyBhZGFwdGVyLnNldExhYmVsKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1BsYW5uaW5nVGVtcGxhdGVzX3RleHQiKSk7Ci0JCQkvLyBjaGlsZHJlbi5hZGQocGtnKTsKLQotCQl9IGVsc2UgewotCQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlKCk7Ci0JCQkJaWYgKCFjaGlsZHJlbi5jb250YWlucyhwa2cpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwa2cpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlKCk7Ci0JCQkJY2hpbGRyZW4ucmVtb3ZlKHBrZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBnZXRQcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UoKSB7Ci0JCWlmIChwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwKLQkJCQkJLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCQltb2RlbFN0cnVjdC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCk7Ci0JCQlpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlID09IG51bGwpIHsKLQkJCQlwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UgPSBNb2RlbFN0cnVjdHVyZQotCQkJCQkJLmNyZWF0ZVByb2Nlc3NDb250cmlidXRpb25QYWNrYWdlKHBsdWdpbik7Ci0JCQl9Ci0JCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkuYWRhcHQocHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlLAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlhZGFwdGVyLnNldExhYmVsKFBST0NFU1NfQ09OVFJJQlVUSU9OU19MQUJFTCk7Ci0JCQlhZGFwdGVyLnNldFBhcmVudCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2UgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlKCkgewotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlOwotCX0KLQkKLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2UgZ2V0RGVsaXZlcnlQcm9jZXNzUGFja2FnZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFlMzU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0NjhiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyN2U0MTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotCi0vKioKLSAqIEl0ZW0gcHJvdmlkZXIgZm9yIGFjdGl2aXR5IHVzZWQgYnkgY29uZmlndXJhdGlvbiB2aWV3IGFuZCBmaWx0ZXIgZGlhbG9nLiBUaGlzIGl0ZW0gcHJvdmlkZXIgcmV0dXJuCi0gKiBjaGlsZHJlbiBsaXN0IHRoYXQgY29udGFpbiBvbmx5IGl0cyBvd24gYWN0aXZpdGllcyBhZnRlciByZWFsaXphdGlvbiBhZ2FpbnN0IHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDMwLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRFQ2xhc3NlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNiYXNpY1NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgYmFzaWNTZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZmQxOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKEFjdGl2aXR5IHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIoQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKGdldFJlZnJlc2hFbGVtZW50KG5vdGlmaWNhdGlvbikgPT0gZ2V0RGVsZWdhdGVWYWx1ZSgpKSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBnZXRUb3BJdGVtKCk7Ci0JCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCS5hZGFwdChwcm9jLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlpZiAoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWl0ZW1Qcm92aWRlci5zZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSBudWxsOwotCQlib29sZWFuIG9sZFJvbGxlZFVwID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQkJCQlvbGRSb2xsZWRVcCA9IGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQkJaWYoaXNSb2xsZWRVcCgpICE9IG9sZFJvbGxlZFVwKSB7Ci0JCQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilpdGVtUHJvdmlkZXIpLmJhc2ljU2V0Um9sbGVkVXAoaXNSb2xsZWRVcCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChpc1JvbGxlZFVwKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkvLyByZXN0b3JlIHJvbGxlZC11cCBmbGFnCi0JCQkJLy8KLQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilpdGVtUHJvdmlkZXIpLmJhc2ljU2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXREZWxlZ2F0aW5nSXRlbVByb3ZpZGVyKCl7Ci0JCXJldHVybiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTM0YTc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eUFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkdyYXBoaWNhbERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWN0aXZpdHkncyBpdGVtIHByb3ZpZGVycyB1c2VkIGJ5IHRoZSBQcm9jZXNzIEVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElQcm9jZXNzSXRlbVByb3ZpZGVyLCBJQlNJdGVtUHJvdmlkZXIsCi0JCUlUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLCBJQ29uZmlndXJhYmxlLCBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHRvcEl0ZW0gPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHJvbGxlZFVwOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxEYXRhIGdyYXBoaWNhbERhdGE7Ci0KLQlwcml2YXRlIFByZWRlY2Vzc29yTGlzdCBwcmVkZWNlc3NvcnM7Ci0KLQlwcml2YXRlIEJvb2xlYW4gZXhwYW5kZWQ7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBiYXNlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoQWxsSURzUmVxdWlyZWQ7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJvdGVjdGVkIExpc3QgY2FjaGVkQ2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgY29udHJpYnV0ZWRXcmFwcGVyczsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlJbmZvIHZhcmlhYmlsaXR5SW5mbzsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gdHJ1ZTsKLQotCXByaXZhdGUgRGlzcG9zYWJsZSByb2xsZWRVcFdyYXBwZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihiYXNlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJRU9iamVjdCBjdXJyZW50QmFzZSA9IChFT2JqZWN0KSBiYXNlTGlzdGVuZXIuZ2V0VGFyZ2V0KCk7Ci0JCQlpZihjdXJyZW50QmFzZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudEJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZiAoZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0VGFyZ2V0KCk7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJYmFzZS5lQWRhcHRlcnMoKS5yZW1vdmUoYmFzZUxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwpIHsKLQkJCXByZWRlY2Vzc29ycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCQotCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRSb2xsdXBDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCQotCQlpZihjb250cmlidXRlZFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCWNvbnRyaWJ1dGVkV3JhcHBlcnMuZGlzcG9zZSgpOwotCQkJY29udHJpYnV0ZWRXcmFwcGVycyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBhcyBhIGNoaWxkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbHRlci5hY2NlcHQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBhcyBhIHJvbGxlZC11cCBjaGlsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQlpZiAoZmlsdGVyICE9IG51bGwgJiYgIShjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCSYmICEoY2hpbGQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCXJldHVybiBmaWx0ZXIuYWNjZXB0KGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdG9yIChlLmc6IGEKLQkgKiBUYXNrRGVzY3JpcHRvciBpcyBhc3NvY2lhdGVkIHdpdGggYSBUYXNrKS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCS8vIGRpc2FsbG93IGNyZWF0aW5nIG5ldyBjaGlsZCBpZiB0aGlzIGl0ZW0gcHJvdmlkZXIgaXMgcm9sbGVkIHVwCi0JCS8vCi0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgc2libGluZyk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihpc1RvcEFjdGl2aXR5KG9iamVjdCkpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKSk7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQkJLy8gfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNFeHBhbmRlZCgpCi0JICovCi0JcHVibGljIEJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIGV4cGFuZGVkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0RXhwYW5kZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpIHsKLQkJZXhwYW5kZWQgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFRvcEl0ZW0oKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9wSXRlbSgpIHsKLQkJaWYgKHRvcEl0ZW0gPT0gbnVsbCkgewotCQkJaWYoUHJvY2Vzc1V0aWwuaXNUb3BQcm9jZXNzKHRhcmdldCkpIHsKLQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJfQotCQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudCh0YXJnZXQpOwotCQkJaWYocGFyZW50ICE9IG51bGwpIHsKLQkJCQlPYmplY3QgaXAgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYoaXAgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBpcDsKLQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IHRvcCA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQkJCQkJaWYgKHRvcCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQkJCQkJJiYgKChQcm9jZXNzKSBwYXJlbnQpLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJCQl0b3AgPSBwYXJlbnQ7Ci0JCQkJCQkJYWRhcHRlci5zZXRUb3BJdGVtKHRvcCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdG9wOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0b3BJdGVtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0SWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RvcEFjdGl2aXR5KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iamVjdDsKLQkJT2JqZWN0IHBhcmVudCA9IGVPYmouZUNvbnRhaW5lcigpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnQ7Ci0JCQlyZXR1cm4gb2JqZWN0ID09IHBjLmdldFByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzQ2hpbGREZXNjcmlwdG9yKEFjdGl2aXR5IGFjdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnRGb3IoT2JqZWN0IGNoaWxkLCBPYmplY3QgcGFyZW50KSB7Ci0JCVByb2Nlc3NVdGlsLnNldFBhcmVudChjaGlsZCwgcGFyZW50LCBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0vLwlwcml2YXRlIENvbGxlY3Rpb24gZ2V0RGlyZWN0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCUxpc3QgbXlDaGlsZHJlbjsKLS8vCQlDaGlsZHJlblN0b3JlIHN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZShvYmplY3QpOwotLy8JCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0vLwkJCW15Q2hpbGRyZW4gPSBzdG9yZS5nZXRDaGlsZHJlbigpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCS8vIHN0b3JlID0gY3JlYXRlQ2hpbGRyZW5TdG9yZShvYmplY3QpOwotLy8JCQlMaXN0IHJlc3VsdCA9IHN0b3JlICE9IG51bGwgPyBudWxsIDogbmV3IEFycmF5TGlzdCgpOwotLy8JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotLy8KLS8vCQkJZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpLml0ZXJhdG9yKCk7IGkKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpLm5leHQoKTsKLS8vCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7CQkJCQkKLS8vCQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLS8vCQkJCQkKLS8vLy8JCQkJCS8vQ2hhbmdlIGZvciBBY3Rpdml0eSBWYXJpYWJpbGl0eS4gVG8gZG8gcmVhbGl6YXRpb24gZm9yCi0vLy8vCQkJCQkvL0Jyb3dzaW5nIGFuZCBQdWJsaXNoaW5nLgotLy8vLwkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLS8vLy8JCQkJCWlmKGZpbHRlciAhPSBudWxsICYmIGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpewotLy8vLwkJCQkJCWNoaWxkcmVuLmFkZEFsbCgoKElDb25maWd1cmF0b3IpZmlsdGVyKS5nZXRDaGlsZHJlbihvYmplY3QsIGZlYXR1cmUpKTsKLS8vLy8JCQkJCX0KLS8vLy8JCQkJCWVsc2V7Ci0vLy8vCQkJCQkJY2hpbGRyZW4gPSAoTGlzdCkgZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotLy8vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJCWludCBpbmRleCA9IDA7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTsgaW5kZXgrKykgewotLy8JCQkJCQlPYmplY3QgY2hpbGQgPSBjaS5uZXh0KCk7Ci0vLwkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotLy8JCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCk7Ci0vLwkJCQkJCQlzZXRQYXJlbnRGb3IoY2hpbGQsIG9iamVjdCk7Ci0vLwkJCQkJCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpCi0vLwkJCQkJCQkvLyBnZXRCZXN0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChjaGlsZCwKLS8vCQkJCQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwkJCQkJCQkvLyBhZGFwdGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLS8vCQkJCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGQoY2hpbGQpOwotLy8JCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJT2JqZWN0IGNoaWxkID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotLy8JCQkJCWlmIChhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotLy8JCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsCi0vLwkJCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0vLwkJCQkJCXNldFBhcmVudEZvcihjaGlsZCwgb2JqZWN0KTsKLS8vCQkJCQkJLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotLy8JCQkJCQkvLyBnZXRCZXN0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChjaGlsZCwKLS8vCQkJCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCQkJLy8gYWRhcHRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0vLwotLy8JCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotLy8JCQkJCQkJc3RvcmUuc2V0VmFsdWUoZmVhdHVyZSwgY2hpbGQpOwotLy8JCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJbXlDaGlsZHJlbiA9IHN0b3JlICE9IG51bGwgPyBzdG9yZS5nZXRDaGlsZHJlbigpIDogcmVzdWx0OwotLy8JCX0KLS8vCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRkSW5oZXJpdGVkKG9iamVjdCwgbXlDaGlsZHJlbik7Ci0vLwkJcmV0dXJuIGNoaWxkcmVuOwotLy8JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRJbW1lZGlhdGVDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQkJY2hpbGQgPSBjb25maWd1cmF0b3IucmVzb2x2ZShjaGlsZCk7Ci0JCQkJfQotCQkJCWlmKGNoaWxkICE9IG51bGwgJiYgIWNoaWxkcmVuLmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCQlzZXRQYXJlbnRGb3IoY2hpbGQsIG9iamVjdCk7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNoaWxkcmVuID0gYWRkSW5oZXJpdGVkKG9iamVjdCwgKExpc3QpIGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Um9sbGVkVXBDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQWJzdHJhY3RUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihvYmplY3QsIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMxNTk1Mzc2Mjk2MTk3MzczNjhMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlJdGVyYXRvciBpdGVyYXRvcjsKLQkJCQkJYm9vbGVhbiBiID0gYWRhcHRlci5pc1JvbGxlZFVwKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhZGFwdGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJaXRlcmF0b3IgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWFkYXB0ZXIuYmFzaWNTZXRSb2xsZWRVcChiKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gaXRlcmF0b3I7Ci0JCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkJJiYgIShvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJCXJldHVybiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQkvLyBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBkZXNjcmlwdG9yIGZvciBlYWNoIGNvbnRlbnQgZWxlbWVudCBpbiB0aGUgcm9sbC11cCBsaXN0Ci0JCS8vCi0JCUxpc3QgZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWNjZXB0QXNSb2xsZWRVcENoaWxkKGNoaWxkKSkgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCU9iamVjdCBkZXNjID0gZmluZERlc2NyaXB0b3IoZGVzY3JpcHRvcnMsIGUpOwotCQkJCQlpZihkZXNjID09IG51bGwpIHsKLQkJCQkJCWlmKGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoY2hpbGQpKSB7Ci0JCQkJCQkJY2hpbGQgPSBjcmVhdGVSb2xsdXBXcmFwcGVyKGNoaWxkLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCX0KLQkJCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCQlkZXNjcmlwdG9ycy5hZGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYoaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChjaGlsZCkpIHsKLQkJCQkJCQlDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlciA9IFByb2Nlc3NVdGlsLmdldENvbXBvc2VkV3JhcHBlcihkZXNjKTsKLQkJCQkJCQlpZihjb21wb3NlZFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQkJCQljb21wb3NlZFdyYXBwZXIuYWRkRWxlbWVudChjaGlsZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkZXNjcmlwdG9ycy5jbGVhcigpOwotCQlkZXNjcmlwdG9ycyA9IG51bGw7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHdyYXBwaW5nIG9mIHRoZSBzcGVjaWZpZWQgcm9sbHVwIGVsZW1lbnQgaXMgbmVlZGVkLiBJZiBpdCdzCi0JICogbmVlZGVkLCB0aGUgY2FsbGVyIHdpbGwgdXNlCi0JICoge0BsaW5rICNjcmVhdGVSb2xsdXBXcmFwcGVyKE9iamVjdCwgT2JqZWN0LCBBZGFwdGVyRmFjdG9yeSl9IHRvIGNyZWF0ZQotCSAqIHdyYXBwZXIgZm9yIHRoZSByb2xsdXAgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZUNvbXBvc2VkV3JhcHBlcihPYmplY3Qgb2JqZWN0LCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlUm9sbHVwV3JhcHBlcihPYmplY3Qgb2JqZWN0LCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CQkKLQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gY3JlYXRlQ29tcG9zZWRXcmFwcGVyKG9iamVjdCwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJd3JhcHBlci5yZWFkT25seSA9IHRydWU7Ci0JCXdyYXBwZXIuaXNSb2xsdXBDaGlsZCA9IHRydWU7Ci0JCQotCQlpZihyb2xsZWRVcFdyYXBwZXJzID09IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQl9Ci0JCXJvbGxlZFVwV3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCi0JCXJldHVybiB3cmFwcGVyOyAJCQotCX0JCQotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBkb0dldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlyZXR1cm4gZ2V0Um9sbGVkVXBDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGdldEltbWVkaWF0ZUNoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkKLQkJCS8vVE9ETzogcmVtb3ZlIHRoZSBlbmFibGVWYXJpYWJpbGl0eUluZm9GbGFnIGFuZCAgCi0JCQkvLyBjcmVhdGUgYW4gaW50ZXJmYWNlIG9yIGRvIGRpZmZlcmVudGx5Ci0JCQlpZihlbmFibGVWYXJpYWJpbGl0eUluZm8pCi0JCQkJdmFyaWFiaWxpdHlJbmZvID0gY29uZmlndXJhdG9yLmdldFZhcmlhYmlsaXR5SW5mbyhhY3Rpdml0eSk7Ci0JCQllbHNlIAotCQkJCXZhcmlhYmlsaXR5SW5mbyA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YXJpYWJpbGl0eUluZm8gPSBudWxsOwotCQl9Ci0JCWlmKHZhcmlhYmlsaXR5SW5mbyAhPSBudWxsKSB7Ci0JCQlPYmplY3QgcmVzb2x2ZWQgPSB2YXJpYWJpbGl0eUluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuZ2V0KDApOwotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpcCA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChyZXNvbHZlZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsJCQkKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0JCQlib29sZWFuIGIgPSBpcC5pc1JvbGxlZFVwKCk7Ci0JCQl0cnkgewotCQkJCWlwLmJhc2ljU2V0Um9sbGVkVXAoaXNSb2xsZWRVcCgpKTsKLQkJCQljaGlsZHJlbiA9IGlwLmRvR2V0Q2hpbGRyZW4ocmVzb2x2ZWQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaXAuYmFzaWNTZXRSb2xsZWRVcChiKTsKLQkJCX0KLQkJCWlmKCF2YXJpYWJpbGl0eUluZm8uZ2V0Q29udHJpYnV0b3JzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJQXJyYXlMaXN0IGNvbnRyaWJ1dGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFyaWFiaWxpdHlJbmZvLmdldENvbnRyaWJ1dG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpcCA9ICgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilhZGFwdGVyKTsKLQkJCQkJCWIgPSBpcC5pc1JvbGxlZFVwKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlwLmJhc2ljU2V0Um9sbGVkVXAoaXNSb2xsZWRVcCgpKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaXAuZ2V0SW1tZWRpYXRlQ2hpbGRyZW4oZSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQllID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQllID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkucmVzb2x2ZShlLCBjb25maWd1cmF0b3IuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCQkJaWYoZSAhPSBudWxsICYmICFUbmdVdGlsLmNvbnRhaW5zKGNoaWxkcmVuLCBlKSkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRDaGlsZHJlbi5hZGQoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFjb250cmlidXRlZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCQljaGlsZHJlbi5hZGRBbGwod3JhcENvbnRyaWJ1dGVkKGFjdGl2aXR5LCBjb250cmlidXRlZENoaWxkcmVuKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0JCXJldHVybiBkb0dldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLS8vCQlpZihpc1JvbGxlZFVwKCkpIHsKLS8vCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCQl9Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJCWNhY2hlZENoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJZ2V0Q2hpbGRyZW4odGFyZ2V0KTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IHJvbGxlZFVwOwotCQkJdHJ5IHsKLQkJCQlyb2xsZWRVcCA9IHRydWU7Ci0JCQkJZ2V0Q2hpbGRyZW4odGFyZ2V0KTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXJvbGxlZFVwID0gb2xkUm9sbGVkVXA7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGZpbmRXcmFwcGVyKE9iamVjdCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIGZpbmQgaWYgYSB3cmFwcGVyIGFscmVhZHkgZXhpc3QgZm9yIHRoZSBnaXZlbiB2YWx1ZSBhbmQgb3duZXIKLQkJLy8KLQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdCh2YWx1ZSwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUxpc3QgbGlzdGVuZXJzID0gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldExpc3RlbmVycygpOwotCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJZmluZF93cmFwcGVyX2xvb3A6IGZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQkJaWYgKHdyYXBwZXIuZ2V0VmFsdWUoKSA9PSB2YWx1ZQotCQkJCQkJCQkmJiB3cmFwcGVyLmdldFBhcmVudCh2YWx1ZSkgPT0gb3duZXIpIHsKLQkJCQkJCQlicmVhayBmaW5kX3dyYXBwZXJfbG9vcDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJd3JhcHBlciA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHdyYXBJbmhlcml0ZWQoQWN0aXZpdHkgb3duZXIsIENvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMpIHsKLQkJaWYgKHdyYXBwZXJzID09IG51bGwpIHsKLQkJCXdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQkKLQkJcmV0dXJuIHdyYXAob3duZXIsIGJyZWFrZG93bkVsZW1lbnRzLCB0cnVlLCBmYWxzZSwgd3JhcHBlcnMpOwotCX0KLQkKLQlwcml2YXRlIExpc3Qgd3JhcENvbnRyaWJ1dGVkKEFjdGl2aXR5IG93bmVyLCBDb2xsZWN0aW9uIGJyZWFrZG93bkVsZW1lbnRzKSB7Ci0JCWlmKGNvbnRyaWJ1dGVkV3JhcHBlcnMgPT0gbnVsbCkgewotCQkJY29udHJpYnV0ZWRXcmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHdyYXAob3duZXIsIGJyZWFrZG93bkVsZW1lbnRzLCBmYWxzZSwgdHJ1ZSwgY29udHJpYnV0ZWRXcmFwcGVycyk7Ci0JfQotCQotCXByaXZhdGUgSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGdldFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5KCkgewotCQlJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIpIHsKLQkJCWZhY3RvcnkgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyKWFkYXB0ZXJGYWN0b3J5KS5nZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpOwotCQl9Ci0JCWlmKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCB3cmFwKEFjdGl2aXR5IG93bmVyLCBDb2xsZWN0aW9uIGJyZWFrZG93bkVsZW1lbnRzLCBib29sZWFuIGluaGVyaXRlZCwgYm9vbGVhbiBjb250cmlidXRlZCwgRGlzcG9zYWJsZSB3cmFwcGVycykgewotCQlBcnJheUxpc3Qgd3JhcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IGdldFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IHVuV3JhcHBlZCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCQlpZiAodW5XcmFwcGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSB1bldyYXBwZWQ7Ci0JCQkJaWYgKCFUbmdVdGlsLmlzQmFzZShvd25lci5nZXRCcmVha2Rvd25FbGVtZW50cygpLCBlKSkgewotCQkJCQlPYmplY3QgY2hpbGQgPSBnZXRXcmFwcGVyKG93bmVyLCBlLCB3cmFwcGVycyk7Ci0JCQkJCWlmKGNoaWxkID09IG51bGwpIHsKLQkJCQkJCWNoaWxkID0gd3JhcHBlckZhY3RvcnkuY3JlYXRlV3JhcHBlcihlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGJlV3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQ7Ci0JCQkJCQkJaWYoaW5oZXJpdGVkKSB7Ci0JCQkJCQkJCWJlV3JhcHBlci5pc0luaGVyaXRlZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYoY29udHJpYnV0ZWQpIHsKLQkJCQkJCQkJYmVXcmFwcGVyLmNvbnRyaWJ1dGVkID0gdHJ1ZTsKLQkJCQkJCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuaXNJbmhlcml0ZWQoKSkgewotCQkJCQkJCQkJYmVXcmFwcGVyLmlzSW5oZXJpdGVkID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXdyYXBwZXJzLnJlbW92ZShjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJd3JhcHBlckxpc3QuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJd3JhcHBlcnMuZGlzcG9zZSgpOwotCQl3cmFwcGVycy5hZGRBbGwod3JhcHBlckxpc3QpOwotCQlyZXR1cm4gd3JhcHBlckxpc3Q7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRXcmFwcGVyKEFjdGl2aXR5IG93bmVyLCBCcmVha2Rvd25FbGVtZW50IGUsIENvbGxlY3Rpb24gd3JhcHBlcnMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKElXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmKHdyYXBwZXIuZ2V0T3duZXIoKSA9PSBvd25lciAmJiB3cmFwcGVyLmdldFZhbHVlKCkgPT0gZSkgewotCQkJCXJldHVybiB3cmFwcGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVCYXNlTGlzdGVuZXIoKSB7Ci0JCWlmIChiYXNlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJYmFzZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLnRoaXMKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQkJCWlmIChQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQkJCW5vdGlmaWNhdGlvbiwgYWN0LCBmYWxzZSwgdHJ1ZSkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19OQU1FOgotCQkJCQkJaWYgKGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGFjdCwgZmFsc2UsIHRydWUpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCi0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUFJFU1NFRDoKLQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCQlhY3QsIHRydWUsIGZhbHNlKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJCWFjdCwgdHJ1ZSwgdHJ1ZSkpOwotCQkJCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6IHsKLQkJCQkJCWlmKGhhbmRsZVJlcGxhY2VCcmVha2Rvd25FbGVtZW50KG5vdGlmaWNhdGlvbikpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCUxpc3QgbGlzdCA9IGdldEFmZmVjdGVkQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlib29sZWFuIHVwZGF0ZUxhYmVsID0gcmVmcmVzaENoaWxkcmVuRGF0YSgKLQkJCQkJCQkJCW5vdGlmaWNhdGlvbiwgbGlzdCk7Ci0KLQkJCQkJCQkvLyBmb3J3YXJkIG5vdGlmaWNhdGlvbgotCQkJCQkJCS8vCi0JCQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQkJCW5vdGlmaWNhdGlvbiwgYWN0LCB0cnVlLCB1cGRhdGVMYWJlbCkpOwotCi0JCQkJCQkJLy8gUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihnZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkvLyAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpKTsKLQkJCQkJCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcmV0dXJuIGJhc2VMaXN0ZW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgbGlzdGVuVG9CYXNlQWN0aXZpdHkoKSB7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgdGFyZ2V0OwotCQlpZiAoIVByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFjdGl2aXR5IGJhc2VBY3Q7Ci0JCWlmKHZhcmlhYmlsaXR5SW5mbyAhPSBudWxsKSB7Ci0JCQlpZih2YXJpYWJpbGl0eUluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuc2l6ZSgpID4gMSkgewotCQkJCWJhc2VBY3QgPSAoQWN0aXZpdHkpIHZhcmlhYmlsaXR5SW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5nZXQoMSk7Ci0JCQl9CQkJCi0JCQllbHNlIHsKLQkJCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBjb25maWd1cmF0b3IucmVzb2x2ZShhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWJhc2VBY3QgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCX0KLQkJaWYgKGJhc2VBY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWNyZWF0ZUJhc2VMaXN0ZW5lcigpOwotCQkKLQkJLy8gcmVtb3ZlIGJhc2VMaXN0ZW5lciBmcm9tIG9sZCBiYXNlLCBpZiB0aGVyZSBpcyBhbnkKLQkJLy8KLQkJRU9iamVjdCBvbGRCYXNlID0gKEVPYmplY3QpIGJhc2VMaXN0ZW5lci5nZXRUYXJnZXQoKTsKLQkJaWYob2xkQmFzZSAhPSBudWxsKSB7Ci0JCQlvbGRCYXNlLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlpZiAoIWJhc2VBY3QuZUFkYXB0ZXJzKCkuY29udGFpbnMoYmFzZUxpc3RlbmVyKSkgewotCQkJYmFzZUFjdC5lQWRhcHRlcnMoKS5hZGQoYmFzZUxpc3RlbmVyKTsKLQkJfQotCi0JCU9iamVjdCBpcCA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJhc2VBY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmKGlwIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGlwOwotCQkJYWRhcHRlci5saXN0ZW5Ub0Jhc2VBY3Rpdml0eSgpOwotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VBY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRkSW5oZXJpdGVkKE9iamVjdCBvYmplY3QsIExpc3QgbXlDaGlsZHJlbikgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkJQWN0aXZpdHkgYmFzZUFjdCA9IGxpc3RlblRvQmFzZUFjdGl2aXR5KCk7Ci0JCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIGV4dGVuZFR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJaWYgKGV4dGVuZFR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJCXJldHVybiBteUNoaWxkcmVuOwotCQkJCX0gZWxzZSBpZiAoZXh0ZW5kVHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OCi0JCQkJCQl8fCBleHRlbmRUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkJLmFkYXB0KGJhc2VBY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCUxpc3QgYWxsQ2hpbGRyZW47CQkJCQkKLQkJCQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGFkYXB0ZXIuaXNSb2xsZWRVcCgpOwotCQkJCQl0cnkgewotCQkJCQkJaWYob2xkUm9sbGVkVXApIHsKLQkJCQkJCQlhZGFwdGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJYWxsQ2hpbGRyZW4gPSB3cmFwSW5oZXJpdGVkKGFjdCwgYWRhcHRlci5nZXRDaGlsZHJlbihiYXNlQWN0KSk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlpZihvbGRSb2xsZWRVcCkgewotCQkJCQkJCWFkYXB0ZXIuYmFzaWNTZXRSb2xsZWRVcCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotLy8JCQkJCS8vIGdvIHRocnUgb3duIGNoaWxkcmVuIGxpc3QgYW5kIGluc2VydCBpdCB0byB0aGUgY29tYmluZWQKLS8vCQkJCQkvLyBjaGlsZCBsaXN0IGF0IHRoZSByaWdodCBwbGFjZS4KLS8vCQkJCQkvLwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG15Q2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyCi0vLwkJCQkJCQkJLm5leHQoKTsKLS8vCQkJCQkJVG5nVXRpbC5hZGRUbyhhbGxDaGlsZHJlbiwgZWxlbWVudCwgb2JqZWN0LCBUbmdVdGlsCi0vLwkJCQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkpOwotLy8JCQkJCX0KLQkJCQkJaWYoYWxsQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVRuZ1V0aWwuYWRkQWxsVG8oYWxsQ2hpbGRyZW4sIG15Q2hpbGRyZW4pOwotCQkJCQkJcmV0dXJuIGFsbENoaWxkcmVuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBteUNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdG9yIGluIDxjb2RlPmNoaWxkcmVuPC9jb2RlPiByZWZlcnJpbmcgdG8KLQkgKiB0aGUgc2FtZSBvYmplY3QgYXMgdGhlIHNwZWNpZmllZCBkZXNjcmlwdG9yIDxjb2RlPmNoaWxkPC9jb2RlPiBkb2VzLgotCSAqIAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBubyBkZXNjcmlwdG9yIGlzIGZvdW5kIGluIHRoZSBjaGlsZHJlbiBsaXN0IHRoYXQgcmVmZXJzCi0JICogICAgICAgICB0byB0aGUgc2FtZSBvYmplY3QgYXMgdGhlIHNwZWNpZmllZCBjaGlsZCBkb2VzLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yKExpc3QgY2hpbGRyZW4sIE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gZmluZERlc2NyaXB0b3IoY2hpbGRyZW4sIGNoaWxkKSA9PSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmREZXNjcmlwdG9yKExpc3QgY2hpbGRyZW4sIE9iamVjdCBjaGlsZCkgewotCQlPYmplY3Qgb2JqID0gZ2V0T2JqZWN0KChEZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcChjaGlsZCkpOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChpbnQgaSA9IGNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgbyA9IGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChvYmogPT0gZ2V0T2JqZWN0KChEZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcChvKSkpCi0JCQkJcmV0dXJuIG87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gcmV0dXJuCi0JCS8vIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvY3Rvb2wxNi9DcmVhdGVBY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eSIpOwotCQlyZXR1cm4gZ2V0SW1hZ2UoY2hpbGQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVSZW1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlUmVtb3ZlQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEl0ZW1Qcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUJTSXRlbVByb3ZpZGVyIGdldEl0ZW1Qcm92aWRlcihFT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIChJQlNJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihlT2JqLCBJQlNJdGVtUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXBhcmVudCA9IG9iamVjdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJaWYodGFyZ2V0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gKChBY3Rpdml0eSl0YXJnZXQpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjaGlsZHJlbiB0aGF0IGhhZCBiZWVuIGFmZmVjdGVkIGFmdGVyIGEgYW4gQURELCBSRU1PVkUsCi0JICogb3IgTU9WRSBvcGVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0QWZmZWN0ZWRDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRBZmZlY3RlZEVsZW1lbnRzKG5vdGlmaWNhdGlvbiwgY2hpbGRGaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2hDaGlsZHJlbkRhdGEoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUxpc3QgYWZmZWN0ZWRDaGlsZHJlbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUxpc3QgYWZmZWN0ZWRDaGlsZHJlbikgewotCQlyZWZyZXNoQ2hpbGRyZW5EYXRhKG5vdGlmaWNhdGlvbiwgYWZmZWN0ZWRDaGlsZHJlbik7Ci0KLQkJUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlmaW5hbCBMaXN0IG5ld09yT2xkQ2hpbGRyZW4pIHsKLQkJaWYgKCFuZXdPck9sZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRvUmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbiwgbmV3T3JPbGRDaGlsZHJlbik7Ci0JCQkJfQotCi0JCQl9OwotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KHJ1bm5hYmxlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShydW5uYWJsZSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpIHsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVQcmVkZWNlc3Nvckxpc3RDaGFuZ2UoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlyZXR1cm4gVG5nVXRpbC5oYW5kbGVQcmVkZWNlc3Nvckxpc3RDaGFuZ2UodGhpcywgbm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlUmVwbGFjZUJyZWFrZG93bkVsZW1lbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZihub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCAmJiBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSAhPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkgewotCQkJaWYobm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCWlmKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRMaW5rVG9TdWNjZXNzb3IoZSkuaXNFbXB0eSgpKSB7Ci0JCQkJCVByb2Nlc3NVdGlsLnJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhhZGFwdGVyRmFjdG9yeSwgKFByb2Nlc3MpIGdldFRvcEl0ZW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCWdldFRhcmdldCgpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKGhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZShub3RpZmljYXRpb24pKQotCQkJcmV0dXJuOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlpZihoYW5kbGVSZXBsYWNlQnJlYWtkb3duRWxlbWVudChub3RpZmljYXRpb24pKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJTGlzdCBuZXdPck9sZENoaWxkcmVuID0gZ2V0QWZmZWN0ZWRDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkJaWYgKCFuZXdPck9sZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQljcmVhdGVPck1vdmVQYWNrYWdlRm9yKG5ld09yT2xkQ2hpbGRyZW4pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQkJLy8gcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbiwgbmV3T3JPbGRDaGlsZHJlbik7Ci0KLQkJCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUFJFU1NFRDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQotCQkJLy8gUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgKFByb2Nlc3MpCi0JCQkvLyBnZXRUb3BJdGVtKCkpOwotCi0JCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3T3JPbGRDaGlsZHJlbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9yTW92ZVBhY2thZ2VGb3IoTGlzdDw/PiBuZXdDaGlsZHJlbikgewotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpICgoRU9iamVjdCkgdGFyZ2V0KS5lQ29udGFpbmVyKCk7Ci0JCWlmKHBrZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IG5ld0NoaWxkcmVuKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCWlmIChhY3QuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJLy8gY3JlYXRlIG5ldyBQcm9jZXNzUGFja2FnZSBmb3IgdGhlIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCVByb2Nlc3NQYWNrYWdlIG5ld1BrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJCW5ld1BrZy5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChuZXdQa2cpOwotCQkJCQluZXdQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ2hlY2sgaWYgdGhlIGFjdGl2aXR5J3MgUHJvY2Vzc1BhY2thZ2UgaXMgYXQgdGhlIHJpZ2h0Ci0JCQkJCS8vIHBsYWNlLgotCQkJCQkvLyBJZiBub3QsIG1vdmUgaXQgdG8gdGhlIHJpZ2h0IFByb2Nlc3NDb21wb25lbnQuCi0JCQkJCS8vCi0JCQkJCVByb2Nlc3NQYWNrYWdlIG9sZFBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJCQkJaWYgKG9sZFBrZy5lQ29udGFpbmVyKCkgIT0gcGtnKSB7Ci0JCQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChvbGRQa2cpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoKFByb2Nlc3NFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoU2V0IHNldCwgQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWJvb2xlYW4gcmV0ID0gc2V0LmFkZChlKTsKLQkJaWYgKHJldCAmJiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChBY3Rpdml0eSkgZSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWdldEFsbEJyZWFrZG93bkVsZW1lbnRzKHNldCwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvciBJRHMgaW4gdGhlIHZpZXdlcgotCSAqIAotCSAqIEBwYXJhbSBhZmZlY3RlZEJyZWFrZG93bkVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hQcmVkZWNlc3NvcnMoTm90aWZpY2F0aW9uIG1zZywKLQkJCUxpc3QgYWZmZWN0ZWRCcmVha2Rvd25FbGVtZW50cykgewotCi0JCVNldCByZWZyZXNoTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCVNldCBhbGxCcmVha2Rvd25FbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFmZmVjdGVkQnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUKLQkJCQkJfHwgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewotCQkJCXNldFBhcmVudEZvcihlLCBudWxsKTsKLQkJCX0KLQkJCWdldEFsbEJyZWFrZG93bkVsZW1lbnRzKGFsbEJyZWFrZG93bkVsZW1lbnRzLCBlKTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIucmVmcmVzaFByZWRlY2Vzc29ycygpOgotCQkvLyBhbGxCcmVha2Rvd25FbGVtZW50cz0iK2FsbEJyZWFrZG93bkVsZW1lbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbEJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IEFzc29jaWF0aW9uSGVscGVyLmdldExpbmtUb1N1Y2Nlc3NvcigKLQkJCQkJZWxlbWVudCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxLmhhc05leHQoKTspIHsKLQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQlCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldFN1Y2Nlc3Nvcih3b3JrT3JkZXIpOwotCQkJCWlmICghYWxsQnJlYWtkb3duRWxlbWVudHMuY29udGFpbnMoc3VjYykpIHsKLQkJCQkJcmVmcmVzaExpc3QuYWRkKHN1Y2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5yZWZyZXNoUHJlZGVjZXNzb3JzKCk6Ci0JCS8vIHJlZnJlc2hMaXN0PSIgKyByZWZyZXNoTGlzdCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmcmVzaExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCBjaGlsZCwgZmFsc2UsIHRydWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQYWNrYWdlRm9yKEFjdGl2aXR5IGFjdGl2aXR5LCBFT2JqZWN0IHBhcmVudEFjdGl2aXR5KSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBhcmVudCA9IChQcm9jZXNzUGFja2FnZSkgcGFyZW50QWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQlQcm9jZXNzUGFja2FnZSBuZXdQa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQluZXdQa2cuc2V0TmFtZShhY3Rpdml0eS5nZXROYW1lKCkpOwotCQlwYXJlbnQuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChuZXdQa2cpOwotCQlBcnJheUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJyZWFrZG93bkVsZW1lbnRzLmFkZChhY3Rpdml0eSk7Ci0JCWJyZWFrZG93bkVsZW1lbnRzLmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQkJbmV3UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChicmVha2Rvd25FbGVtZW50cyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKHJvb3RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gKChJQ29sdW1uQXdhcmUpIHJvb3RBZGFwdGVyRmFjdG9yeSkKLQkJCQkJLmdldENvbHVtbkluZGV4VG9OYW1lTWFwKCk7Ci0JCQlpZiAoY29sdW1uSW5kZXhUb05hbWVNYXAgIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3IEludGVnZXIoCi0JCQkJCQljb2x1bW5JbmRleCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gVG5nVXRpbC5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFRvcEl0ZW0oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApIHsKLQkJdG9wSXRlbSA9IHRvcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiByb2xsZWRVcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCXJvbGxlZFVwID0gYjsKLQkJaWYgKCFyb2xsZWRVcCkgewotCQkJLy8gdXNlciByb2xsIGRvd24gdGhpcyBhY3Rpdml0eSwgc2V0IHJvbGxlZFVwIGZsYWcgb2YgYWxsIGl0cwotCQkJLy8gb2Zmc3RyaW5nIHRvIGZhbHNlCi0JCQkvLwotCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcih0YXJnZXQsIGZhbHNlKSB7Ci0KLQkJCQkvKioKLQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCSAqLwotCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03ODQwNjg3MjY0NzUzNjQwMjUwTDsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgR3JhcGhpY2FsRGF0YSBnZXRHcmFwaGljYWxEYXRhKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsRGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaGljYWxEYXRhKEdyYXBoaWNhbERhdGEgZGF0YSkgewotCQlncmFwaGljYWxEYXRhID0gZGF0YTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQlQcm9jZXNzVXRpbC5zZXRBdHRyaWJ1dGUoZSwgcHJvcCwgdHh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQsCi0JICogICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQkoKEl0ZXJhdGlvbikgdmFsdWUpLnNldElzUmVwZWF0YWJsZShCb29sZWFuLlRSVUUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0TGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0KSBjaGFuZ2VOb3RpZmllcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRQcmVkZWNlc3NvcnMoKQotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCkgewotCQlpZiAocHJlZGVjZXNzb3JzID09IG51bGwpIHsKLQkJCXByZWRlY2Vzc29ycyA9IG5ldyBQcmVkZWNlc3Nvckxpc3QoVG5nVXRpbAotCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSwgdGFyZ2V0KTsKLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3JzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzRmlyc3RFbGVtZW50KGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCB0aGlzLCBvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNMYXN0RWxlbWVudChnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgdGhpcywgb2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVVcCgoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKG9iamVjdCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0Q2hpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBjaGlsZEZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQoYm9vbGVhbiBiKSB7Ci0JCXJlZnJlc2hBbGxJRHNSZXF1aXJlZCA9IGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoQWxsSURzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoQWxsSURzUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpZmlsdGVyOwotCQl9Ci0JCWVsc2UgewotCQkJY29uZmlndXJhdG9yID0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJhc2ljU2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCXJvbGxlZFVwID0gYjsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVWYXJpYWJpbGl0eUluZm8oKSB7Ci0JCXJldHVybiBlbmFibGVWYXJpYWJpbGl0eUluZm87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbykgewotCQl0aGlzLmVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IGVuYWJsZVZhcmlhYmlsaXR5SW5mbzsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBNb3ZlQ29tbWFuZEV4IGV4dGVuZHMgTW92ZUNvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JCXByaXZhdGUgU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlczsKLQotCQlwdWJsaWMgTW92ZUNvbW1hbmRFeChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCQl9CQkJCQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCS8vIHRyYW5zbGF0ZSB2aWV3IGluZGV4IHRvIGluZGV4IGluIGJyZWFrZG93biBlbGVtZW50cyBsaXN0Ci0JCQkvLwotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBnZXRDaGlsZHJlbihnZXRUYXJnZXQoKSk7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaW5kZXgpOwotCQkJaW5kZXggPSBvd25lckxpc3QuaW5kZXhPZihjaGlsZCk7Ci0JCQlpZihpbmRleCAhPSAtMSkgewotCQkJCXN1cGVyLmRvRXhlY3V0ZSgpOwotCQkJfQotCQkJCi0JCQkvL1RPRE86IG1vdmUgaW4gYmV0d2VlbiBncmVlbiBlbGVtZW50cwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTW92ZUNvbW1hbmRFeChkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4NjBmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBCYXNlIGl0ZW0gcHJvdmlkZXIgZm9yIGFsbCBicmVha2Rvd24gZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0l0ZW1Qcm92aWRlciwgSUJTSXRlbVByb3ZpZGVyLCBJVGFibGVJdGVtTGFiZWxQcm92aWRlciwgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgaW50IGlkOwotCi0JcHJpdmF0ZSBPYmplY3QgdG9wSXRlbTsKLQotCXByaXZhdGUgYm9vbGVhbiByb2xsZWRVcDsKLQotCXByaXZhdGUgQm9vbGVhbiBleHBhbmRlZDsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0IHByZWRlY2Vzc29yczsKLQotCXByb3RlY3RlZCBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCQotCXByb3RlY3RlZCBMaXN0IGNhY2hlZENoaWxkcmVuOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwpIHsKLQkJCXByZWRlY2Vzc29ycy5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBleHBhbmRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JCWV4cGFuZGVkID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3Qgb2JqKSB7Ci0JCXBhcmVudCA9IG9iajsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuICgoQnJlYWtkb3duRWxlbWVudClvYmplY3QpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldElkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0VG9wSXRlbSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb3BJdGVtKCkgewotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KHRhcmdldCk7Ci0JCWlmICh0b3BJdGVtID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgdG9wID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0JCQkJaWYgKHRvcCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQkJCSYmICgoUHJvY2VzcykgcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCXRvcCA9IHBhcmVudDsKLQkJCQkJYWRhcHRlci5zZXRUb3BJdGVtKHRvcCk7Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvcEl0ZW07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKHJvb3RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gKChJQ29sdW1uQXdhcmUpIHJvb3RBZGFwdGVyRmFjdG9yeSkKLQkJCQkJLmdldENvbHVtbkluZGV4VG9OYW1lTWFwKCk7Ci0JCQlpZiAoY29sdW1uSW5kZXhUb05hbWVNYXAgIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3IEludGVnZXIoCi0JCQkJCQljb2x1bW5JbmRleCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkvLyBTdHJpbmcgY29sTmFtZSA9IChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcKLQkJLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gVG5nVXRpbC5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLy8gU3RyaW5nIGNvbE5hbWUgPSAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3Ci0JCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFRvcEl0ZW0oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApIHsKLQkJdG9wSXRlbSA9IHRvcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiByb2xsZWRVcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCXJvbGxlZFVwID0gYjsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoamF2YS51dGlsLk1hcCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkvLyBpZiAobWFwICE9IG51bGwpCi0JLy8gewotCS8vIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCS8vIH0KLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0OwotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWUuc2V0TmFtZSh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JCQllLnNldElzRXZlbnREcml2ZW4oQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQllLnNldElzT25nb2luZyhCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWUuc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0TGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0KSBjaGFuZ2VOb3RpZmllcik7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzID0gbmV3IFByZWRlY2Vzc29yTGlzdChUbmdVdGlsCi0JCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLCB0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNGaXJzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0KLQkJLy8gT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCS8vIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIExpc3QgZWxlbWVudHMgPSBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKGFjdGl2aXR5LCBvYmopOwotCQkvLwkJCQotCQkvLyAvLyBpZiBpdCdzIGZpcnN0IGVsZW1lbnQsIHJldHVybiB0cnVlCi0JCS8vIGlmIChlbGVtZW50cy5nZXQoMCkuZXF1YWxzKG9iaikpCi0JCS8vIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gZWxzZSByZXR1cm4gZmFsc2U7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzTGFzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0KLQkJLy8gT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCS8vIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIExpc3QgZWxlbWVudHMgPSBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKGFjdGl2aXR5LCBvYmopOwotCQkvLwkJCQotCQkvLyAvLyBpZiBpdCdzIGxhc3QgZWxlbWVudCwgcmV0dXJuIHRydWUKLQkJLy8gaWYgKGVsZW1lbnRzLmdldChlbGVtZW50cy5zaXplKCkgLSAxKS5lcXVhbHMob2JqKSkKLQkJLy8gewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBlbHNlIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIHJldHVybiB0cnVlOwotCi0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJLy8gaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaXB0b3JJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChUbmdVdGlsLmhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZSh0aGlzLCBub3RpZmljYXRpb24pKQotCQkJcmV0dXJuOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUNvbGxlY3Rpb24gbmV3T3JPbGRDaGlsZHJlbikgewotCQlpZiAoIW5ld09yT2xkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkvLyAvLyByZWNhbGN1bGF0ZSB0aGUgSURzIG9mIGJyZWFrZG93biBlbGVtZW50cyBhbmQgcmVmcmVzaCB0aGVtCi0JCQkvLyAvLwotCQkJLy8gQWN0aXZpdHkgdG9wQWN0ID0gKEFjdGl2aXR5KSBnZXRUb3BJdGVtKCk7Ci0JCQkvLyBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQkJLy8gUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBuZXcKLQkJCS8vIEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpLCB0b3BBY3QpOwotCi0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHVibGljIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBjcmVhdGVEcm9wQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFJlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsCi0JCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGFiNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNSb2xsZWRVcDsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0IHByZWRlY2Vzc29yczsKLQotCXByaXZhdGUgQm9vbGVhbiBleHBhbmRlZDsKLQkKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYodmFsdWUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgdmFsdWU7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWZlYXR1cmUgPSAoKERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB2YWx1ZSkuZ2V0RmVhdHVyZSgpOwotCQkJfQotCQkJc2V0UmVhZE9ubHkod3JhcHBlci5pc1JlYWRPbmx5KCkpOwotCQkJc2V0Um9sbGVkVXAod3JhcHBlci5pc1JvbGx1cENoaWxkKCkpOwotCQkJaXNJbmhlcml0ZWQgPSB3cmFwcGVyLmlzSW5oZXJpdGVkOwotCQkJY29udHJpYnV0ZWQgPSB3cmFwcGVyLmNvbnRyaWJ1dGVkOwotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKEJyZWFrZG93bkVsZW1lbnQgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0V4cGFuZGVkKCkKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBpc0V4cGFuZGVkKCkgewotCQlyZXR1cm4gZXhwYW5kZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRFeHBhbmRlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYikgewotCQlleHBhbmRlZCA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gaXNSb2xsZWRVcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCWlzUm9sbGVkVXAgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHksIHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB0ZXh0VmFsdWUpIHsKLQkJUHJvY2Vzc1V0aWwuc2V0QXR0cmlidXRlKChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KSwKLQkJCQlwcm9wZXJ0eSwgdGV4dFZhbHVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNkb0NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGRvQ3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyKSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikKLQkJCQkJLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRQcmVkZWNlc3NvcnMoKQotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCkgewotCQlpZiAocHJlZGVjZXNzb3JzID09IG51bGwpIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcCh0aGlzKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXByZWRlY2Vzc29ycyA9IG5ldyBQcmVkZWNlc3Nvckxpc3QoVG5nVXRpbAotCQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSksIHRoaXMpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmVkZWNlc3NvcnMgPSBQcmVkZWNlc3Nvckxpc3QuRU1QVFlfTElTVDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3JzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuY3JlYXRlQ29tbWFuZCgpOiIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvYmplY3Q6ICIgKyBvYmplY3QpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjb21tYW5kQ2xhc3M6ICIgKyBjb21tYW5kQ2xhc3MpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjb21tYW5kUGFyYW1ldGVyOiAiICsgY29tbWFuZFBhcmFtZXRlcik7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JCQkJY29tbWFuZFBhcmFtZXRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5LCBPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM5NmNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0JcHJpdmF0ZSBMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlhZGRFbGVtZW50KHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0VmFsdWVzKCkgewotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoT2JqZWN0IGUpIHsKLQkJZ2V0VmFsdWVzKCkuYWRkKGUpOwotCX0KLQkKLQkvKioKLQkgKiBEZWNpZGVzIGlmIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHByb3BlcnR5IG9mIGFsbCBlbGVtZW50cyBpbiB0aGlzIGNvbXBvc2VkIHdyYXBwZXIgY2FuIGJlIG1lcmdlZC4KLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTWVyZ2UoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk87Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZighdmFsdWVzLmlzRW1wdHkoKSkgewotCQkJaWYoY2FuTWVyZ2UocHJvcGVydHkpKSB7Ci0JCQkJVW5pcXVlRUxpc3QgbW9kZWxJbmZvcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwkJCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBpbmZvOwotCQkJCQlpZihvIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpbmZvID0gKChJQlNJdGVtUHJvdmlkZXIpbykuZ2V0QXR0cmlidXRlKG8sIHByb3BlcnR5KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlCU0l0ZW1Qcm92aWRlciBpcCA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG8sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlpbmZvID0gaXAuZ2V0QXR0cmlidXRlKG8sIHByb3BlcnR5KTsKLQkJCQkJfQotCQkJCQlpZighU3RyVXRpbC5pc0JsYW5rKGluZm8pKSB7Ci0JCQkJCQltb2RlbEluZm9zLmFkZChpbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZighbW9kZWxJbmZvcy5pc0VtcHR5KCkpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKFN0cmluZyltb2RlbEluZm9zLmdldCgwKSk7Ci0JCQkJCWludCBtYXggPSBtb2RlbEluZm9zLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBtYXg7IGkrKykgewotCQkJCQkJbW9kZWxJbmZvLmFwcGVuZCgnLCcpLmFwcGVuZChtb2RlbEluZm9zLmdldChpKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRlZCgpIHsKLQkJZm9yKGludCBpID0gdmFsdWVzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgbyA9IHZhbHVlcy5nZXQoaSk7Ci0JCQlpZighKG8gaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSAKLQkJCQkJfHwgISgoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvKS5pc0luaGVyaXRlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhNTkxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBGZWIgMjMsIDIwMDYKLSAqIEBzaW5jZSAgNy4wLjEKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBMaXN0IG5vdGlmaWVyczsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYodmFsdWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpdmFsdWUpOwotCQkJcmVhZE9ubHkgPSB3cmFwcGVyLmlzUmVhZE9ubHkoKTsKLQkJCWlzSW5oZXJpdGVkID0gd3JhcHBlci5pc0luaGVyaXRlZDsKLQkJfQotCQlpc1JvbGx1cENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIHRoZSBub3RpZmllciBsaXN0IG9mIHRoaXMgd3JhcHBlci4gVGhlIGdpdmVuIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JICogbXVzdCBiZSBsaW5rZWQgdG8gdGhlIHNhbWUgd29yayBwcm9kdWN0IGFzIHRoZSBkZWxlZ2F0ZSB2YWx1ZSBpcyAKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBvciBpdHMgd3JhcHBlcgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdvcmtQcm9kdWN0RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKVRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxlZ2F0ZVdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKGdldERlbGVnYXRlVmFsdWUoKSk7Ci0JCWlmKGRlbGVnYXRlV3BkID09IHdwZCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9iamVjdCB3cCA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlbGVnYXRlV3BkKTsKLQkJaWYod3AgPT0gbnVsbCB8fCB3cCA9PSB3cGQuZ2V0V29ya1Byb2R1Y3QoKSkgewotCQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHdwZCwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpCi0JCQl7Ci0JCQkJKChJQ2hhbmdlTm90aWZpZXIpaXRlbVByb3ZpZGVyKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQlpZihub3RpZmllcnMgPT0gbnVsbCkgewotCQkJCQlub3RpZmllcnMgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQkJCQl9Ci0JCQkJbm90aWZpZXJzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJfQotCQl9CQotCQkKLQkJaWYoaXNJbmhlcml0ZWQgJiYgb2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLQkJCQkhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzSW5oZXJpdGVkKSB7Ci0JCQl0aGlzLmlzSW5oZXJpdGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKG5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub3RpZmllcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNoYW5nZU5vdGlmaWVyIG5vdGlmaWVyID0gKElDaGFuZ2VOb3RpZmllcikgaXRlci5uZXh0KCk7Ci0JCQkJbm90aWZpZXIucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCQlub3RpZmllcnMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZihub3RpZmllcnMgIT0gbnVsbCAmJiBub3RpZmllcnMuY29udGFpbnMobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKSB7Ci0JCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSOgotCQkJCWlmKG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpID09IHRoaXMpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHRoaXMsIGZhbHNlLCB0cnVlKSk7CQkJCQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCXN3aXRjaChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQod3JhcE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPICYmIGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlTdHJpbmcgaW5mbyA9ICgoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilnZXRWYWx1ZSgpKS5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKGluZm8pKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5mbywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUhhc2hTZXQgaW5mb1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGluZm9zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJCQlpZihpbmZvU2V0LmFkZCh0b2tlbikpIHsKLQkJCQkJCWluZm9zLmFwcGVuZCh0b2tlbikuYXBwZW5kKCcsJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaW5mb3MuZGVsZXRlQ2hhckF0KGluZm9zLmxlbmd0aCgpIC0gMSk7Ci0JCQkJaW5mbyA9IGluZm9zLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCQlpZihub3RpZmllcnMgIT0gbnVsbCAmJiAhbm90aWZpZXJzLmlzRW1wdHkoKQotCQkJCSYmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFIHx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmcgc3RyID0gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhzdHIpKSB7Ci0JCQkJc3RyYnVmLmFwcGVuZChzdHIpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm90aWZpZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCQlzdHIgPSBpdGVtUHJvdmlkZXIuZ2V0QXR0cmlidXRlKGl0ZW1Qcm92aWRlci5nZXRUYXJnZXQoKSwgcHJvcGVydHkpOwotCQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJCQlpZihzdHJidWYubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlzdHJidWYuYXBwZW5kKCcsJyk7Ci0JCQkJCX0KLQkJCQkJc3RyYnVmLmFwcGVuZChzdHIpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdHJidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmFmYTkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkdlbmVyaWNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5PQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEVsZW1lbnRBZGFwdGVyIGRyb3BBZGFwdGVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmlwdG9ySXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb21wb3NpdGVSb2xlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVXcmFwcGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBuZXcgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSB2YWx1ZSwgb2JqZWN0LCBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JCS8vIHdyYXBwZXIuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQ29tcG9zaXRlUm9sZSBjb21wb3NpdGVSb2xlID0gKENvbXBvc2l0ZVJvbGUpIG9iamVjdDsKLQkvLyBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCS8vIENvbGxlY3Rpb24gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY29tcG9zaXRlUm9sZS5nZXRBZ2dyZWdhdGVkUm9sZXMoKS5pdGVyYXRvcigpOwotCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIGNoaWxkcmVuLmFkZChuZXcKLQkvLyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKChEZXNjcmliYWJsZUVsZW1lbnQpIGl0ZXIubmV4dCgpLAotCS8vIHRoaXMsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0JLy8gfQotCS8vIHJldHVybiBjaGlsZHJlbjsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGZsb2F0LCBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsCi0JCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGNyZWF0ZURyb3BBZGFwdGVyKCkgewotCQlpZiAoZHJvcEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZHJvcEFkYXB0ZXIgPSBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgZHJvcEVsZW1lbnQpIHsKLQkJCQkJaWYgKGRyb3BFbGVtZW50IGluc3RhbmNlb2YgUm9sZQotCQkJCQkJCSYmICEoKENvbXBvc2l0ZVJvbGUpIGdldFRhcmdldCgpKQotCQkJCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNvbnRhaW5zKGRyb3BFbGVtZW50KSkgewotCQkJCQkJcmV0dXJuIGRyb3BFbGVtZW50OwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZHJvcEFkYXB0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA2MmJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcihDb21wb3NpdGVSb2xlIHJvbGUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHJvbGUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0RlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMmIxMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0RlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDMzODM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotCi0vKioKLSAqIFdyYXBwZXIgaXRlbSBwcm92aWRlciBmb3IgRGVzY3JpYmxlRWxlbWVudAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUJTSXRlbVByb3ZpZGVyLAotCQlJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIGludCBpZDsKLQotCXByaXZhdGUgT2JqZWN0IHRvcEl0ZW07Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seSA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250cmlidXRlZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGlzUm9sbHVwQ2hpbGQgPSBmYWxzZTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihEZXNjcmliYWJsZUVsZW1lbnQgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXModmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihEZXNjcmliYWJsZUVsZW1lbnQgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9CQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgd3JhcHBlciBpcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByZWFkT25seQotCSAqICAgICAgICAgICAgVGhlIHJlYWRPbmx5IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9CQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY29udHJpYnV0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRyaWJ1dGVkKCkgewotCQlyZXR1cm4gY29udHJpYnV0ZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCXJldHVybiBpc0luaGVyaXRlZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsdXBDaGlsZCgpIHsKLQkJcmV0dXJuIGlzUm9sbHVwQ2hpbGQ7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldElkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBvYmopIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFRvcEl0ZW0oKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9wSXRlbSgpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChudWxsKTsKLQkJaWYgKHRvcEl0ZW0gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCU9iamVjdCB0b3AgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJCQlpZiAodG9wID09IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcwotCQkJCQkJJiYgKChQcm9jZXNzKSBwYXJlbnQpLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQlhZGFwdGVyLnNldFRvcEl0ZW0odG9wKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRvcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG9wSXRlbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFRvcEl0ZW0oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApIHsKLQkJdG9wSXRlbSA9IHRvcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0ZpcnN0RWxlbWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNMYXN0RWxlbWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5T2JqLCBPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjbW92ZVVwKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI21vdmVEb3duKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RUNsYXNzZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJRGVzY3JpYmFibGVFbGVtZW50IGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGlkKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCW5hbWUgPSBlLmdldE5hbWUoKTsKLQkJCX0KLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB0ZXh0VmFsdWUpIHsKLQotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChqYXZhLnV0aWwuTWFwKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCS8vIGlmIChtYXAgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gY29sdW1uSW5kZXhUb05hbWVNYXAgPSBtYXA7Ci0JLy8gY29sdW1uSW5kZXhUb05hbWVNYXBDaGFuZ2VkID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRQcmVkZWNlc3NvcnMoKQotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0RXhwYW5kZWQoamF2YS5sYW5nLkJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3aXAgPSBkb0NyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKHdpcCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB3aXA7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXdyYXBwZXIuZmVhdHVyZSA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlKQotCQkJCS5nZXRGZWF0dXJlKCk7Ci0JCQl9Ci0JCQl3cmFwcGVyLnNldFJlYWRPbmx5KHJlYWRPbmx5KTsKLQkJCXdyYXBwZXIuaXNSb2xsdXBDaGlsZCA9IGlzUm9sbHVwQ2hpbGQ7Ci0JCQl3cmFwcGVyLmlzSW5oZXJpdGVkID0gaXNJbmhlcml0ZWQ7Ci0JCQl3cmFwcGVyLmNvbnRyaWJ1dGVkID0gaXNDb250cmlidXRlZCgpOwotCQl9CQkKLQkJcmV0dXJuIHdpcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGRvQ3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAodmFsdWUpOwotCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gbmV3IERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIGUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlyZXR1cm4gd3JhcHBlcjsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyKSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikKLQkJCQkJLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQl9Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwCi0JCQkJJiYgZGVsZWdhdGVJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKElJdGVtTGFiZWxQcm92aWRlcikgZGVsZWdhdGVJdGVtUHJvdmlkZXIpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAocm9vdEFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSAoKElDb2x1bW5Bd2FyZSkgcm9vdEFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQkJCWlmIChjb2x1bW5JbmRleFRvTmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcgSW50ZWdlcigKLQkJCQkJCWNvbHVtbkluZGV4KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkvLyBTdHJpbmcgY29sTmFtZSA9IChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcKLQkJLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGNoYW5nZU5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3QpIGNoYW5nZU5vdGlmaWVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHRoaXMpOwotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgKHdyYXBwZWQgb2JqZWN0OiAiICsgbyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MjdmMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8pIHsKLQkJCVN0cmluZ0J1ZmZlciBtb2RlbEluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlPYmplY3QgZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmplY3QpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQkJCU9iamVjdCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJLy8gbG9vayBmb3IgZXhpc3RpbmcgZGVzY3JpcHRvciB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkJCQkJLy8gYmFzZSBpbiB0aGUgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCQkJCWZvciAocGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsCi0JCQkJCQkJJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSk7KSB7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJT2JqZWN0IGRlc2MgPSBudWxsOwotCQkJCQkJZmluZF9kZXNjcmlwdG9yX2xvb3A6IGZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIKLQkJCQkJCQkJLmdldENoaWxkcmVuKHBhcmVudCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaXB0b3IKLQkJCQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgY2hpbGQpID09IGJhc2UpIHsKLQkJCQkJCQkJZGVzYyA9IGNoaWxkOwotCQkJCQkJCQlicmVhayBmaW5kX2Rlc2NyaXB0b3JfbG9vcDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCQkJCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQkJCQkJCXN0ciA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NfZXh0ZW5kczsgCi0JCQkJCQkJfSBlbHNlIGlmICh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpIHsKLQkJCQkJCQkJc3RyID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19yZXBsYWNlczsgCi0JCQkJCQkJfQotCQkJCQkJCVN0cmluZyBuYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGRlc2MpCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQkJCWlmIChzdHIgIT0gbnVsbCkKLQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdChzdHIsCi0JCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZSB9KSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotLy8JCQkJCVByb2Nlc3NVdGlsLmdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcihtb2RlbEluZm8sCi0vLwkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3QpOwotCQkJCQlQcm9jZXNzVXRpbC5nZXRXUERNb2RlbEluZm8obW9kZWxJbmZvLCBvYmplY3QsIHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RlbEluZm8udG9TdHJpbmcoKTsgCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJTSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJTSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNmExZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCU0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgaW50ZXJmYWNlIG9mIGFsbCBpdGVtIHByb3ZpZGVycyBmb3IgYnJlYWtkb3duIGVsZW1lbnQgdXNlZAotICogYnkgdGhlIFByb2Nlc3MgRWRpdG9yLiBJdCBkZWZpbmVzIHRoZSBjb25zdGFudHMgZm9yIGNvbHVtbiBuYW1lcyBhbmQgbWV0aG9kcwotICogdG8gc3VwcG9ydCByb3cgaW5kZXgsIHJvbGwtdXAgdmlldywgZ2V0dGluZy9zZXR0aW5nIGJyZWFrZG93biBlbGVtZW50J3MKLSAqIGF0dHJpYnV0ZXMsIHByZWRlY2Vzc29yIGxpc3QuLi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQlNJdGVtUHJvdmlkZXIgZXh0ZW5kcyAvL0lMaWJyYXJ5SXRlbVByb3ZpZGVyLAotCQlJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JLyoqIENvbHVtbiBJRCBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfUFJFREVDRVNTT1JTID0gInByZWRlY2Vzc29ycyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19SRVBFQVRBQkxFID0gImlzX3JlcGVhdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSVNfT05HT0lORyA9ICJpc19vbmdvaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX0VWRU5UX0RSSVZFTiA9ICJpc19ldmVudF9kcml2ZW4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfRU5UUllfU1RBVEUgPSAiZW50cnlfc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfRVhJVF9TVEFURSA9ICJleGl0X3N0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1RFQU1TID0gInRlYW1zIjsgLy8kTk9OLU5MUy0xJCAgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX01PREVMX0lORk8gPSAibW9kZWxfaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVTRU5UQVRJT05fTkFNRSA9ICJwcmVzZW50YXRpb25fbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9ERUxJVkVSQUJMRSA9ICJkZWxpdmVyYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19PUFRJT05BTCA9ICJpc19vcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19QTEFOTkVEID0gImlzX3BsYW5uZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gImhhc19tdWx0aXBsZV9vY2N1cnJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09MVU1OUyA9IHsgQ09MX05BTUUsIENPTF9QUkVGSVgsIENPTF9JRCwKLQkJCUNPTF9QUkVERUNFU1NPUlMsIENPTF9JU19SRVBFQVRBQkxFLCBDT0xfSVNfT05HT0lORywKLQkJCUNPTF9JU19FVkVOVF9EUklWRU4sIENPTF9FTlRSWV9TVEFURSwgQ09MX0VYSVRfU1RBVEUsIENPTF9URUFNUywKLQkJCUNPTF9UWVBFLCBDT0xfTU9ERUxfSU5GTywgQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBDT0xfREVMSVZFUkFCTEUgfTsKLQkKLQlpbnQgZ2V0SWQoKTsKLQotCXZvaWQgc2V0SWQoaW50IGlkKTsKLQotCS8vIElCU0l0ZW1Qcm92aWRlciBnZXRJdGVtUHJvdmlkZXIoRU9iamVjdCBlT2JqKTsKLQotCXZvaWQgc2V0UGFyZW50KE9iamVjdCBvYmopOwotCi0JT2JqZWN0IGdldFRvcEl0ZW0oKTsKLQotCXZvaWQgc2V0VG9wSXRlbShPYmplY3QgdG9wKTsKLQotCWJvb2xlYW4gaXNSb2xsZWRVcCgpOwotCi0Jdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpOwotCi0JYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKTsKLQotCWJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKTsKLQotCS8vIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHlPYmosIE9iamVjdCBvYmopOwotCi0Jdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKTsKLQotCXZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKTsKLQotCUNvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKTsKLQotCS8vIEdyYXBoaWNhbERhdGEgZ2V0R3JhcGhpY2FsRGF0YSgpOwotCi0JLy8gdm9pZCBzZXRHcmFwaGljYWxEYXRhKEdyYXBoaWNhbERhdGEgZGF0YSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIG9iamVjdCBhcyBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGNvbHVtbiBJRCBjb25zdGFudHMgQ09MX1hYWAotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY29sdW1uIElEIGNvbnN0YW50cyBDT0xfWFhYCi0JICogQHBhcmFtIHRleHRWYWx1ZQotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHRleHRWYWx1ZSk7Ci0KLQlMaXN0IGdldExpc3RlbmVycygpOwotCi0JUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpOwotCi0JQm9vbGVhbiBpc0V4cGFuZGVkKCk7Ci0KLQl2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYik7Ci0KLQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLCBMaXN0IGRyb3BFbGVtZW50cyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE2MmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuaW50ZXJuYWwuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUNvbHVtbkF3YXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUNvbHVtbkF3YXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzgyMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lDb2x1bW5Bd2FyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBwYXNzIHRoZSBjb2x1bW4gaW5kZXggLyBuYW1lIG1hcCBmcm9tIHRoZSB1c2VyIGludGVyZmFjZSB0bwotICogdGhlIGFkYXB0ZXIgdGhhdCBpbXBsZW1lbnRzIGl0IHNvIHRoZSBhZGFwdGVyIGNhbiBwcm92aWRlIHRoZSBjb3JyZWN0IGRhdGEKLSAqIGZvciB0aGUgY29sdW1ucyBldmVuIHRoZWlyIGluZGV4IGhhdmUgY2hhbmdlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29sdW1uQXdhcmUgewotCi0JTWFwIGdldENvbHVtbkluZGV4VG9OYW1lTWFwKCk7Ci0KLQl2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGM4NDY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NJdGVtUHJvdmlkZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDA1MjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSUNvbHVtbkF3YXJlIHsKLQotCXByaXZhdGUgTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCi0JLyoqCi0JICogUmVmZXJlbmNlcyB0byBzdGF0ZWZ1bCBhZGFwdGVycyBjcmVhdGVkIGJ5IHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSBTZXQgZGlzcG9zYWJsZUFkYXB0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gY3JlYXRlZEFkYXB0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlci5jcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5EZXNjcmlwdG9yc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQljb2x1bW5JbmRleFRvTmFtZU1hcCA9IG1hcDsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXIpCi0JCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0eXBlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCSgoSUNvbHVtbkF3YXJlKSBhZGFwdGVyKQotCQkJCQkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCQl9Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVN0YXRlZnVsSXRlbVByb3ZpZGVyCi0JCQkJJiYgbm90aWZpZXIgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmllcikuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuUHJvY2Vzc3R5cGVzQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCS8vIHJldHVybiBuZXcgUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKQotCSAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkvLyB9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiByb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrT3JkZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya09yZGVySXRlbVByb3ZpZGVyID0gbmV3IFdvcmtPcmRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gd29ya09yZGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmUjZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKQotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKSB7Ci0JCXJldHVybiBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKCFkaXNwb3NhYmxlQWRhcHRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaXNwb3NhYmxlQWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSURpc3Bvc2FibGUgYWRhcHRlciA9IChJRGlzcG9zYWJsZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWRhcHRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlkaXNwb3NhYmxlQWRhcHRlcnMuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NlMWZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlcihNaWxlc3RvbmUgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtaWxlc3RvbmUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyKE1pbGVzdG9uZSBtaWxlc3RvbmUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKG1pbGVzdG9uZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODNlNDljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk9CU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEl0ZW0gcHJvdmlkZXIgZm9yIFRlYW0gQWxsb2NhdGlvbiBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgRGlzcG9zYWJsZSByb2xsZWRVcFdyYXBwZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJLy8gaWYoaGFzQ2hpbGREZXNjcmlwdG9yKGFjdCkpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0JCS8vICAgIAkJCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSkpOwotCQkvLwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eSgpKSk7Ci0KLQkJLy8gaWYoYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQkvLyBDT01QT1NJVEUgUk9MRSBGRUFUVVJFIElTIE5PVCBBVkFJTEFCTEUgRk9SIEZJUlNUIFJFTEVBU0UuCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpKSk7Ci0JCS8vCQkJCQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUZWFtUHJvZmlsZSgpKSk7Ci0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWlsZXN0b25lKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBjaGlsZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yCi0JCQkJfHwgY2hpbGQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSB8fCBjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzQ2hpbGQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQl0cnkgewotCQkJcmV0dXJuICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfQotCQljYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgT0JTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcEVsZW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJFTlRFUjoKLQkJLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLAotCQkvLyBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbikiKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgT0JTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLAotCQkJCW9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3duZXI6ICIgKyBvd25lcik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNvbGxlY3Rpb246ICIgKyBjb2xsZWN0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbG9jYXRpb246ICIgKyBsb2NhdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG9wZXJhdGlvbnM6ICIgKyBvcGVyYXRpb25zKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3BlcmF0aW9uOiAiICsgb3BlcmF0aW9uKTsKLQkJLy8gICAgICAgIAotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJFWElUOgotCQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sCi0JCS8vIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKSIpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVmcmVzaENoaWxkcmVuKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiwKLQkvLyBqYXZhLnV0aWwuTGlzdCkKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBMaXN0Ci0JLy8gbmV3T3JPbGRDaGlsZHJlbikgewotCS8vIGlmKCFuZXdPck9sZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCS8vIFByb2Nlc3MgdG9wQWN0ID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkvLyBBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkvLwkJCQkJCQotCS8vIFByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCS8vCQkJCi0JLy8gcmV0dXJuOwotCS8vCi0JLy8gfQotCS8vIH0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNpc05ld0Rlc2NyaXB0b3IoamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yKExpc3QgY2hpbGRyZW4sIE9iamVjdCBjaGlsZCkgewotCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkvLyBjb2xsZWN0IGFsbCByb2xlIGRlc2NyaXB0b3JzIG9yIHRoZWlyIHdyYXBwZXJzIGZpcnN0IGZvciBtYXRjaGluZyB3aXRoIHRlYW0gcHJvZmlsZXMKLQkJLy8gYW5kIGVsaW1pbmF0ZSB0aGUgZHVwbGljYXRlcyBsYXRlciBpbiBnZXRDaGlsZHJlbigpCi0JCS8vCi0JCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNOZXdEZXNjcmlwdG9yKGNoaWxkcmVuLCBvYmopOwotCX0JCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGlzUm9sbGVkVXAoKSkgewotCQkJTGlzdCB0ZWFtUHJvZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhhc2hTZXQgcm9sZVRlYW1QYWlycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlIYXNoU2V0IHJvbGVEZXNjcmlwdG9yc1dpdGhvdXRMaW5rZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQotCQkJLy8gY29sbGVjdCBhbGwgdGVhbSBwcm9maWxlcyB1bmRlciB0aGlzIGFjdGl2aXR5Ci0JCQkvLwotCQkJSGFzaFNldCB2YWxpZFRlYW1Qcm9maWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAobyk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQlpZih2YWxpZFRlYW1Qcm9maWxlcy5hZGQoZSkpIHsKLQkJCQkJCXRlYW1Qcm9maWxlcy5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZURlc2NyaXB0b3IgZGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZTsKLQkJCQkJTGlzdCBsaXN0OwotCQkJCQlMaXN0IGRlc2NyaXB0b3JzID0gbnVsbDsKLQkJCQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIgPSBudWxsOwkJCQkJCi0JCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlPYmplY3QgdmFsdWUgPSAoKFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciljaGlsZCkuZ2V0VmFsdWUoKTsKLQkJCQkJCWlmKHZhbHVlIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCWNvbXBvc2VkV3JhcHBlciA9IChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB2YWx1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihjb21wb3NlZFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQkJbGlzdCA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCQkJCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29tcG9zZWRXcmFwcGVyLmdldFZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvKTsKLQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCQkJTGlzdCB0ZWFtcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcygoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtcy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCB0ZWFtID0gaXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZihsaXN0LmFkZCh0ZWFtKSkgewotCQkJCQkJCQkJCWRlc2NyaXB0b3JzLmFkZChvKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcyhkZXNjKTsKLQkJCQkJfQotCQkJCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOyAKLQkJCQkJaWYoc2l6ZSA+IDEpIHsKLQkJCQkJCWlmIChyb2xsZWRVcFdyYXBwZXJzID09IG51bGwpIHsKLQkJCQkJCQlyb2xsZWRVcFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlyZWFkT25seSA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkKQotCQkJCQkJCS5pc1JlYWRPbmx5KCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIHNob3cgb25lIGRlc2NyaXB0b3IgcGVyIHRlYW0KLQkJCQkJCS8vCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCVRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSBuZXcgVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCQkJCQkJZGVzY3JpcHRvcnMuZ2V0KGkpLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQlpdGVtUHJvdmlkZXIucmVhZE9ubHkgPSByZWFkT25seTsKLQkJCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBsaXN0LmdldChpKTsKLQkJCQkJCQkKLS8vCQkJCQkJCS8vIGFkZCB0ZWFtIHRvIHRoZSB0ZWFtIGxpc3Qgb25seSBpZiB0aGUgdGVhbSBpcyB1bmRlciB0aGlzIGFjdGl2aXR5Ci0vLwkJCQkJCQkvLwotLy8JCQkJCQkJaWYodmFsaWRUZWFtUHJvZmlsZXMuY29udGFpbnModGVhbSkpIHsKLS8vCQkJCQkJCQlhZGRUZWFtUHJvZmlsZXMob2JqZWN0LCB0ZWFtUHJvZmlsZXMsIHRlYW0pOwotLy8JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWl0ZW1Qcm92aWRlci50ZWFtID0gdGVhbTsKLQkJCQkJCQlyb2xsZWRVcFdyYXBwZXJzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQlyb2xlVGVhbVBhaXJzLmFkZChuZXcgUm9sZVRlYW1QYWlyKChSb2xlKSBnZXRPYmplY3QoZGVzYyksIHRlYW0pKTsKLQkJCQkJCX0JCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBnZXRPYmplY3QoZGVzYyk7Ci0JCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSAoc2l6ZSA9PSAxID8gbGlzdC5nZXQoMCkgOiBudWxsKTsKLQkJCQkJCWlmKHJvbGUgPT0gbnVsbCkgewotCQkJCQkJCWlmKCFyb2xlRGVzY3JpcHRvcnNXaXRob3V0TGlua2VkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChjaGlsZCk7Ci0JCQkJCQkJCQotLy8JCQkJCQkJCS8vIGFkZCB0ZWFtIHRvIHRoZSB0ZWFtIGxpc3Qgb25seSBpZiB0aGUgdGVhbSBpcyB1bmRlciB0aGlzIGFjdGl2aXR5Ci0vLwkJCQkJCQkJLy8KLS8vCQkJCQkJCQlpZih0ZWFtICE9IG51bGwgJiYgdmFsaWRUZWFtUHJvZmlsZXMuY29udGFpbnModGVhbSkpIHsKLS8vCQkJCQkJCQkJYWRkVGVhbVByb2ZpbGVzKG9iamVjdCwgdGVhbVByb2ZpbGVzLCB0ZWFtKTsKLS8vCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnNXaXRob3V0TGlua2VkRWxlbWVudHMuYWRkKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCVJvbGVUZWFtUGFpciByb2xlVGVhbVBhaXIgPSBuZXcgUm9sZVRlYW1QYWlyKHJvbGUsIHRlYW0pOwotCQkJCQkJCWlmKCFyb2xlVGVhbVBhaXJzLmNvbnRhaW5zKHJvbGVUZWFtUGFpcikpIHsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChjaGlsZCk7Ci0JCQkJCQkJCQotLy8JCQkJCQkJCS8vIGFkZCB0ZWFtIHRvIHRoZSB0ZWFtIGxpc3Qgb25seSBpZiB0aGUgdGVhbSBpcyB1bmRlciB0aGlzIGFjdGl2aXR5Ci0vLwkJCQkJCQkJLy8KLS8vCQkJCQkJCQlpZih0ZWFtICE9IG51bGwgJiYgdmFsaWRUZWFtUHJvZmlsZXMuY29udGFpbnModGVhbSkpIHsKLS8vCQkJCQkJCQkJYWRkVGVhbVByb2ZpbGVzKG9iamVjdCwgdGVhbVByb2ZpbGVzLCB0ZWFtKTsKLS8vCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQlyb2xlVGVhbVBhaXJzLmFkZChyb2xlVGVhbVBhaXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJvbGVUZWFtUGFpcnMuY2xlYXIoKTsKLQkJCXJvbGVUZWFtUGFpcnMgPSBudWxsOwotCQkJQ29sbGVjdGlvbnMuc29ydCh0ZWFtUHJvZmlsZXMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJQ29sbGVjdGlvbnMuc29ydChyb2xlRGVzY3JpcHRvcnMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHRlYW1Qcm9maWxlcyk7Ci0JCQljaGlsZHJlbi5hZGRBbGwocm9sZURlc2NyaXB0b3JzKTsKLQkJCQotCQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQkJCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRUZWFtUHJvZmlsZXMoT2JqZWN0IG93bmVyLCBDb2xsZWN0aW9uIHRlYW1Qcm9maWxlcywgVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUpIHsKLQkJaWYgKCFUbmdVdGlsLmNoZWNrRXhpc3QodGVhbVByb2ZpbGVzLCB0ZWFtUHJvZmlsZSkpIHsKLQkJCVRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gbmV3IFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJdGVhbVByb2ZpbGUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSkgewotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkJICovCi0JCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQkJCi0vLwkJCQkJLy8gZG9uJ3Qgc2hvdyByb2xlIGRlc2NyaXB0b3JzCi0vLwkJCQkJLy8KLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotLy8JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCQlpdGVyLnJlbW92ZSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQkKLQkJCQkJCi0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQodGVhbVByb2ZpbGUsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXdyYXBwZXIucmVhZE9ubHkgPSAoZ2V0VG9wSXRlbSgpICE9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpKTsKLQkJCXRlYW1Qcm9maWxlcy5hZGQod3JhcHBlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQkJUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQkJCi0JCQotCQlwdWJsaWMgVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHZhbHVlCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoUm9sZURlc2NyaXB0b3IgdmFsdWUsCi0JCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlyZWFkT25seSA9IGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUyAmJiB0ZWFtICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHRlYW0pOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgc3VwZXIKLQkJCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQl3cmFwcGVyLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCQlyZXR1cm4gd3JhcHBlcjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJvbGVUZWFtUGFpciB7Ci0JCXByaXZhdGUgUm9sZSByb2xlOwotCQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQkJUm9sZVRlYW1QYWlyKFJvbGUgcm9sZSwgVGVhbVByb2ZpbGUgdGVhbSkgewotCQkJdGhpcy5yb2xlID0gcm9sZTsKLQkJCXRoaXMudGVhbSA9IHRlYW07Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZihvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlVGVhbVBhaXIpIHsKLQkJCQlSb2xlVGVhbVBhaXIgb3RoZXIgPSAoUm9sZVRlYW1QYWlyKSBvYmo7Ci0JCQkJcmV0dXJuIHJvbGUgPT0gb3RoZXIucm9sZSAmJiAodGVhbSA9PSBvdGhlci50ZWFtIHx8ICh0ZWFtID09IG51bGwgJiYgb3RoZXIudGVhbSA9PSBudWxsKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlTdHJpbmcgc3RyID0gcm9sZS5nZXRHdWlkKCk7Ci0JCQlpZih0ZWFtICE9IG51bGwpIHsKLQkJCQlzdHIgPSBzdHIgKyB0ZWFtLmdldEd1aWQoKTsKLQkJCX0KLQkJCXJldHVybiBzdHIuaGFzaENvZGUoKTsJCQkKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChvYmplY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlUm9sbHVwV3JhcHBlcihPYmplY3Qgb2JqZWN0LCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwZXIuY3JlYXRlUm9sbHVwV3JhcHBlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdyYXBwZXIsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0MDBkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKQotCS8vICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIG5ldyBPQlNDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCS8vIHJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQkvLyB9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWFhMWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBPQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxDaGlsZHJlbigoUHJvY2Vzc0NvbnRyaWJ1dGlvbikgb2JqZWN0LAotCS8vIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksCi0JLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JLy8gcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gTGlzdCBicmVha2Rvd25FbGVtZW50cyA9ICgoQWN0aXZpdHkpYWN0aXZpdHkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JLy8gewotCS8vIE9iamVjdCBlbGVtZW50T2JqID0gaXQubmV4dCgpOwotCS8vIGlmICgoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mCi0JLy8gVGVhbVByb2ZpbGUpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgfHwgKGVsZW1lbnRPYmoKLQkvLyBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JLy8gewotCS8vIGVsZW1lbnRzLmFkZChlbGVtZW50T2JqKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzMWU1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHVibGljIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxNWZhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5QQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUEJTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciAKLWltcGxlbWVudHMgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyCi17Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgcm9sbGVkVXBXcmFwcGVyczsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCS8vIGlmKGhhc0NoaWxkRGVzY3JpcHRvcihhY3QpKSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGhhc2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCS8vIGlmKGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCQkvLyB9Ci0KLQkJLy8gfQotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1pbGVzdG9uZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0KLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCXx8IGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGlzUm9sbGVkVXAoKSkgewotCQkJTWFwIHdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyhkZXNjKTsKLQkJCQkJT2JqZWN0IHdyYXBwZXJLZXkgPSBkZXNjLmdldFdvcmtQcm9kdWN0KCkgPT0gbnVsbCA/IChPYmplY3QpZGVzYyA6IGRlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJTGlzdCB3cmFwcGVycyA9IChMaXN0KSB3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAuZ2V0KHdyYXBwZXJLZXkpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPCAxKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB0aGUgZGVzY3JpcHRvciBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKLQkJCQkJCS8vIHJvbGx1cCBsaXN0Ci0JCQkJCQkvLwotCQkJCQkJaWYod3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCQkJCXdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcC5wdXQod3JhcHBlcktleSwgd3JhcHBlcnMpOwotCQkJCQkJCXdyYXBwZXJzLmFkZChuZXcgQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKGNoaWxkLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlmb3IgKGludCBpID0gd3JhcHBlcnMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCQkJKChDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpd3JhcHBlcnMuZ2V0KGkpKS5hZGRXb3JrUHJvZHVjdERlc2NyaXB0b3IoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlib29sZWFuIGNoZWNrRXhpc3QgPSB0cnVlOwkJCQkJCQkKLQkJCQkJCQlpZih3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQl3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAucHV0KHdyYXBwZXJLZXksIHdyYXBwZXJzKTsKLQkJCQkJCQkJY2hlY2tFeGlzdCA9IGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCQlpZihjaGVja0V4aXN0KSB7Ci0JCQkJCQkJCS8vIHJlbW92ZSBhbnkgd3JhcHBlciB0aGF0IGlzIG5vdCBvZiB0eXBlIERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGZyb20gdGhlIHdyYXBwZXIgbGlzdAotCQkJCQkJCQkvLwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IHdyYXBwZXIgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZighKHdyYXBwZXIgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcikpIHsKLQkJCQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQljaGVja0V4aXN0ID0gd3JhcHBlcnMuc2l6ZSgpID4gMDsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJLy8gc2hvdyBvbmUgZGVzY3JpcHRvciBwZXIgZGVsaXZlcmFibGUKLQkJCQkJCQkvLwotCQkJCQkJCWFkZF9kZXNjcmlwdG9yczoKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBkZWxpdmVyYWJsZURlc2NyaXB0b3IgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGNoZWNrRXhpc3QpIHsKLQkJCQkJCQkJCWZvciAoaW50IGkgPSB3cmFwcGVycy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQkJCQkJCURlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIpIHdyYXBwZXJzLmdldChpKTsKLQkJCQkJCQkJCQlpZih3cmFwcGVyLmRlbGl2ZXJhYmxlRGVzY3JpcHRvciA9PSBkZWxpdmVyYWJsZURlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCQkJd3JhcHBlci5hZGRXb3JrUHJvZHVjdERlc2NyaXB0b3IoY2hpbGQpOwotCQkJCQkJCQkJCQljb250aW51ZSBhZGRfZGVzY3JpcHRvcnM7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCQkJCQkJCWRlc2MsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCQlpdGVtUHJvdmlkZXIuZGVsaXZlcmFibGVEZXNjcmlwdG9yID0gZGVsaXZlcmFibGVEZXNjcmlwdG9yOwotCQkJCQkJCQl3cmFwcGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUxpc3Qgcm9sbGVkVXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlyb2xsZWRVcENoaWxkcmVuLmFkZEFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJCQotCQkJfQotCQkJTGlzdCByZXN1bHQgPSByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4ocm9sbGVkVXBDaGlsZHJlbiwgdHJ1ZSk7Ci0JCQlpZihyb2xsZWRVcFdyYXBwZXJzID09IG51bGwpIHsKLQkJCQlyb2xsZWRVcFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJCX0KLQkJCXJvbGxlZFVwV3JhcHBlcnMuYWRkQWxsKHJlc3VsdCk7Ci0JCQkKLQkJCS8vIGRpc3Bvc2Ugd3JhcHBlcnMgb2Ygc3ViYXJ0aWZhY3QKLQkJCS8vCi0JCQlmb3IoaW50IGkgPSByb2xsZWRVcENoaWxkcmVuLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgcm9sbGVkVXBDaGlsZHJlbi5nZXQoaSk7Ci0JCQkJaWYoIXJvbGxlZFVwV3JhcHBlcnMuY29udGFpbnMod3JhcHBlcikpIHsKLQkJCQkJd3JhcHBlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQkKLQkJCXVwZGF0ZUNhY2hlZENoaWxkcmVuKHJlc3VsdCk7Ci0JCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksIGZhbHNlKTsKLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjaXNOZXdEZXNjcmlwdG9yKGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3RGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gcmV0dXJuIHRydWUgdG8gbGV0IG92ZXJyaWRlbiBnZXRDaGlsZHJlbigpIHRvIGhhbmRsZSB0aGUgdW5pcXVlbmVzcyBvZiB0aGUgcm9sbHVwIGxpc3QKLQkJLy8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPck1vdmVQYWNrYWdlRm9yKExpc3QgbmV3Q2hpbGRyZW4pIHsKLQkJc3VwZXIuY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihuZXdDaGlsZHJlbik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Q2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgcGFydCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXJhdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9Db250YWluZXIocGFydCwgdGhpcywgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0V29ya1Byb2R1Y3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFBCU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywKLQkJCQlvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgUEJTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcEVsZW1lbnRzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilvYmopLmdldFN1cGVyQWN0aXZpdGllcygpICE9IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHRBc1JvbGxlZFVwQ2hpbGQob2JqKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJCUNvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBPYmplY3QgZGVsaXZlcmFibGVEZXNjcmlwdG9yOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXJlYWRPbmx5ID0gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGRlbGl2ZXJhYmxlRGVzY3JpcHRvcik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJTGlzdDw/PiBsaXN0ID0gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXApOwotCQlpZihsaXN0LnNpemUoKSAhPSAgY2hpbGRyZW4uc2l6ZSgpKSB7Ci0JCQkvLyBwYXJlbnQgb2YgZGVzY3JpcHRvcnMgb2Ygc3ViYXJ0aWZhY3RzIGhhcyBiZWVuIHNldCB0byB0aGlzIGFjdGl2aXR5Ci0JCQkvLyBpdGVyYXRlIHRoZSBzdWJ0cmVlIG9mIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9ycyBpbiBjaGlkcmVuIGxpc3QgdG8gY29ycmVjdCB0aGlzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpY2hpbGQpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlmb3IoQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8Pz4gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KGFkYXB0ZXJGYWN0b3J5LCBjaGlsZCk7Ci0JCQkJCQlpdGVyLmhhc05leHQoKTsgaXRlci5uZXh0KCkpOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZihUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChvYmplY3QpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYmZkMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU01pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTg4ODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWxsQ2hpbGRyZW4oKFByb2Nlc3NDb250cmlidXRpb24pIG9iamVjdCwKLQkvLyBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLAotCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSk7Ci0JLy8gfQotCS8vICAgIAotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQ29sbGVjdGlvbiBlbGVtZW50cyA9IHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCS8vIHB1YmxpYyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5LCBPYmplY3Qgb2JqKQotCS8vIHsKLQkvLyBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIExpc3QgYnJlYWtkb3duRWxlbWVudHMgPSAoKEFjdGl2aXR5KWFjdGl2aXR5KS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCS8vIGZvciAoSXRlcmF0b3IgaXQgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCS8vIHsKLQkvLyBPYmplY3QgZWxlbWVudE9iaiA9IGl0Lm5leHQoKTsKLQkvLyBpZiAoKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHx8IChlbGVtZW50T2JqCi0JLy8gaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCS8vIHsKLQkvLyBlbGVtZW50cy5hZGQoZWxlbWVudE9iaik7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjFiMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwdWJsaWMgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkZjE5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVByb2Nlc3NJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvY2Vzc0xpc3RlbmVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCS8vIHByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXI7Ci0JLy8gcHJpdmF0ZSBPYmplY3QgcmVmcmVzaE9iajsKLQkvLwotCS8vIC8qKgotCS8vICoKLQkvLyAqLwotCS8vIHB1YmxpYyBQcm9jZXNzTGlzdGVuZXIoSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIE9iamVjdAotCS8vIHJlZnJlc2hPYmopIHsKLQkvLyB0aGlzLml0ZW1Qcm92aWRlciA9IGl0ZW1Qcm92aWRlcjsKLQkvLyB0aGlzLnJlZnJlc2hPYmogPSByZWZyZXNoT2JqOwotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkvLyBzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChQcm9jZXNzLmNsYXNzKSkgewotCS8vIGNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JLy8gaXRlbVByb3ZpZGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCByZWZyZXNoT2JqLAotCS8vIHRydWUsIGZhbHNlKSk7Ci0JLy8gcmV0dXJuOwotCS8vIH0KLQkvLyB9Ci0JLy8gfTsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fTkFNRToKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAocGMuZ2V0UHJvY2VzcygpICE9IG51bGwpIHsKLQkJCQlib29sZWFuIG9sZCA9IHBjLmdldFByb2Nlc3MoKS5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5zZXROYW1lKHBjLmdldE5hbWUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKG9sZCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCQkKLQkJLy8gYXZvaWQgcmVmcmVzaGluZyB2aWV3ZXJzIHdoZW4gbmV3IHByb2Nlc3MgZWxlbWVudCBvciBkaWFncmFtIGlzIGFkZGVkIHRvIHRoZSBwcm9jZXNzIGNvbXBvbmVudAotCQkvLwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fRElBR1JBTVM6Ci0JCQlyZXR1cm47Ci0JCQkKLQkJfQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JLy8gaWYocHJvYyAhPSBudWxsKSB7Ci0JLy8gaWYoVG5nVXRpbC5nZXRBZGFwdGVyKHByb2MsIFByb2Nlc3NMaXN0ZW5lci5jbGFzcykgPT0gbnVsbCkgewotCS8vIHByb2MuZUFkYXB0ZXJzKCkuYWRkKG5ldyBQcm9jZXNzTGlzdGVuZXIodGhpcywgb2JqZWN0KSk7Ci0JLy8gfQotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHByb2MuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JLy8gY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBjaGlsZHJlbjsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkvLyBwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCS8vIC8vIHJlbW92ZSBhbGwgcHJvY2VzcyBsaXN0ZW5lcnMgZnJvbSBhbGwgdGFyZ2V0cwotCS8vIC8vCi0JLy8gaWYgKHRhcmdldCAhPSBudWxsKQotCS8vIHsKLQkvLyB0YXJnZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCS8vIGlmICh0YXJnZXRzICE9IG51bGwpCi0JLy8gewotCS8vIGZvciAoSXRlcmF0b3IgaSA9IHRhcmdldHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLQkvLyB7Ci0JLy8gTm90aWZpZXIgb3RoZXJUYXJnZXQgPSAoTm90aWZpZXIpaS5uZXh0KCk7Ci0JLy8gb3RoZXJUYXJnZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gc3VwZXIuZGlzcG9zZSgpOwotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0ZWU4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMzAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NjZhYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5ODM4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCQotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoUm9sZURlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihSb2xlRGVzY3JpcHRvciB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRlZCgpIHsKLQkJaWYoZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZ2V0VmFsdWUoKSkuaXNJbmhlcml0ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNJbmhlcml0ZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiMjFiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlYWIxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRXQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDg0ZmQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7CQotCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKFRhc2tEZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZihnZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuICgoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilnZXRWYWx1ZSgpKS5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCWlmKGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmlzSW5oZXJpdGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzSW5oZXJpdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiNjRlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlczsKLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gdGVhbVJvbGVXcmFwcGVyczsKLQlwcml2YXRlIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBkcm9wQWRhcHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlYW1Qcm9maWxlKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZCgoVGVhbVByb2ZpbGUpIG93bmVyLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwgZHJvcEVsZW1lbnRzLAotCQkJCWdldERyb3BBZGFwdGVyKG93bmVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgZ2V0RHJvcEFkYXB0ZXIoT2JqZWN0IG93bmVyKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvd25lciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVEcm9wQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJLy8gYWRkIHRlYW0gcm9sZXMKLQkJLy8KLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlib29sZWFuIG51bGxGaWx0ZXIgPSBmaWx0ZXIgPT0gbnVsbDsKLQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIG9iamVjdDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwgJiYgKG51bGxGaWx0ZXIgfHwgZmlsdGVyLmFjY2VwdChkZXNjKSkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZGVzYyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50IGZvciB0aGUgY2hpbGRyZW4ncyBpdGVtIHByb3ZpZGVycwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3NVdGlsLnNldFBhcmVudChpdGVyLm5leHQoKSwgb2JqZWN0LCBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVJvbGVXcmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKElXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkvLyB3cmFwcGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLy8gdGVhbVJvbGVXcmFwcGVycy5jbGVhcigpOwotCS8vCQkKLQkvLyBzdXBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUZWFtUHJvZmlsZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlpbnQgZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCXx8IGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpIHsKLQkJCQlMaXN0IHN1YlRlYW1zID0gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sCi0JCQkJCQludWxsKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdWJUZWFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJVGVhbVByb2ZpbGUgc3ViVGVhbSA9IChUZWFtUHJvZmlsZSkgaXRlci5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvQ29udGFpbmVyKHN1YlRlYW0sIHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVM6Ci0JCQlMaXN0IGVsZW1lbnRzID0gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sIG51bGwpOwotCQkJZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJYm9vbGVhbiByZWZyZXNoVGVhbSA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQkJfHwgZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkgewotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0NvbnRhaW5lcihlLCB0aGlzLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJcmVmcmVzaFRlYW0gPSB0cnVlOwkJCQkJCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgZSwKLQkJCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVmcmVzaFRlYW0pIHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJfQotCi0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHRlYW1Qcm9maWxlLAotCQkJCQlmYWxzZSwgdHJ1ZSkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCXJvbGVEZXNjcmlwdG9yLCBmYWxzZSwgdHJ1ZSkpOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGZsb2F0LCBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsCi0JCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKQotCQkvLyB7Ci0JCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJLy8gQ29sbGVjdGlvbiB3cmFwcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFJvbGVEZXNjcmlwdG9yIGRlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkvLyB3cmFwcGVycy5hZGQoVG5nVXRpbC5nZXRXcmFwcGVyKHRlYW1Sb2xlV3JhcHBlcnMsIGRlc2MuZ2V0Um9sZSgpKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHdyYXBwZXJzOwotCQkvLyB9Ci0JCS8vIH0KLQkJOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkZXNjcmlwdG9yRXhpc3RzKE9iamVjdCByb2xlKSB7Ci0JCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gKFRlYW1Qcm9maWxlKSBnZXRUYXJnZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZXNjLmdldFJvbGUoKSA9PSByb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGNyZWF0ZURyb3BBZGFwdGVyKCkgewotCQlpZiAoZHJvcEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZHJvcEFkYXB0ZXIgPSBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgZHJvcEVsZW1lbnQpIHsKLQkJCQkJaWYgKGRyb3BFbGVtZW50IGluc3RhbmNlb2YgUm9sZQotCQkJCQkJCSYmICFkZXNjcmlwdG9yRXhpc3RzKGRyb3BFbGVtZW50KQotCQkJCQkvLyAmJiBUbmdVdGlsLmdldFdyYXBwZXIodGVhbVJvbGVXcmFwcGVycywgZHJvcEVsZW1lbnQpID09Ci0JCQkJCS8vIG51bGwKLQkJCQkJKSB7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKChSb2xlKSBkcm9wRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCXJldHVybiBkcm9wQWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIG9iamVjdCkKLQkJCQkJLmdldFN1cGVyVGVhbSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSkgewotCQkJVGVhbVByb2ZpbGUgdGVhbSA9ICgoVGVhbVByb2ZpbGUpIHBhcmVudCk7Ci0JCQlMaXN0IGxpc3QgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCWludCBsb2NhdGlvbiA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAob2JqLmVxdWFscyhsaXN0LmdldChpKSkpIHsKLQkJCQkJbG9jYXRpb24gPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCSgoRUxpc3QpIHRlYW0uZ2V0U3ViVGVhbSgpKS5tb3ZlKGxvY2F0aW9uLCBsb2NhdGlvbiAtIDEpOwotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkob2JqKTsKLQkJCVRuZ1V0aWwubW92ZVVwKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBwYXJlbnQ7Ci0JCQlMaXN0IGxpc3QgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCWludCBsb2NhdGlvbiA9IDA7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCWlmIChvYmouZXF1YWxzKGxpc3QuZ2V0KGkpKSkgewotCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJKChFTGlzdCkgdGVhbS5nZXRTdWJUZWFtKCkpLm1vdmUobG9jYXRpb24sIGxvY2F0aW9uICsgMSk7Ci0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gdGhpcy5nZXRBY3Rpdml0eShvYmopOwotCQkJVG5nVXRpbC5tb3ZlRG93bihhY3Rpdml0eSwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOykgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCXJldHVybiAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nVXRpbAotCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQkJcGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkN2I3YmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIoVGVhbVByb2ZpbGUgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcihUZWFtUHJvZmlsZSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIFRuZ1V0aWwKLQkJCQkJLnVud3JhcChvYmplY3QpKS5nZXRTdXBlclRlYW0oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDUzYTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGhhc2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGNoaWxkIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzQ2hpbGQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRU5URVI6Ci0JCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwKLQkJLy8gb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pIik7Ci0JCUNvbW1hbmQgY21kID0gbmV3IFdCU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwKLQkJCQlvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCi0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIG93bmVyOiAiICsgb3duZXIpOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiBjb2xsZWN0aW9uOiAiICsgY29sbGVjdGlvbik7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIGxvY2F0aW9uOiAiICsgbG9jYXRpb24pOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiBvcGVyYXRpb25zOiAiICsgb3BlcmF0aW9ucyk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIG9wZXJhdGlvbjogIiArIG9wZXJhdGlvbik7Ci0JCS8vICAgICAgICAKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiRVhJVDoKLQkJLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLAotCQkvLyBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbikiKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IFdCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BFbGVtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNSb2xsZWRVcENoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNSb2xsZWRVcENoaWxkKE9iamVjdCBjaGlsZCkgewotCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQlpZihvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzUm9sbGVkVXBDaGlsZChvYmopOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JLy8gaW50KQotCS8vICovCi0JLy8gcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudClvYmplY3Q7Ci0JLy8gU3RyaW5nIHByb3BlcnR5ID0gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldwotCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkvLyBCb29sZWFuIGIgPSBudWxsOwotCS8vIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JLy8gYiA9IGUuZ2V0SXNFdmVudERyaXZlbigpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCS8vIGIgPSBlLmdldElzT25nb2luZygpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSkgewotCS8vIGIgPSBlLmdldElzUmVwZWF0YWJsZSgpOwotCS8vIH0KLQkvLyBpZihiICE9IG51bGwpIHsKLQkvLyBpZihiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JLy8gcmV0dXJuIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImNoZWNrZWRfYm94Iik7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIHJldHVybiBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJ1bmNoZWNrZWRfYm94Iik7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gc3VwZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRXQlNFY2xhc3NlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI3JlZnJlc2hDaGlsZHJlbkRhdGEob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmcmVzaENoaWxkcmVuRGF0YShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJTGlzdCBhZmZlY3RlZENoaWxkcmVuKSB7Ci0JCS8vIHJlY2FsY3VsYXRlIHRoZSBJRHMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIGFuZCByZWZyZXNoIHRoZW0KLQkJLy8KLQkJUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQotCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2RvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkgewotCQlPYmplY3QgcHJvYyA9IGdldFRvcEl0ZW0oKTsKLQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHByb2MsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyKQotCQkJCQkuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKHRydWUpOwotCQl9Ci0KLQkJUHJvY2Vzc1V0aWwKLQkJCQkucmVmcmVzaElEc0luVmlld2VycygoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzV3JhcHBpbmdSb2xsdXBOZWVkZWQob2JqZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlPYmplY3Qgd3JhcHBlciA9IHN1cGVyLmNyZWF0ZVJvbGx1cFdyYXBwZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcih3cmFwcGVyLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVDb21wb3NlZFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2FuTWVyZ2UoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQgfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMKLQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCQkJfQotCQl9OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzM4MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciB7Ci0KLQlwdWJsaWMgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU01pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkgewotCQkJc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoUHJvY2Vzc1V0aWwKLQkJCQkJLnRvQ29sdW1uSW5kZXhUb05hbWVNYXAoKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKSkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjA5YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWxsQ2hpbGRyZW4oKFByb2Nlc3NDb250cmlidXRpb24pIG9iamVjdCwKLQkvLyBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLAotCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSk7Ci0JLy8gfQotCS8vICAgIAotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQ29sbGVjdGlvbiBlbGVtZW50cyA9IHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCS8vIHB1YmxpYyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5LCBPYmplY3Qgb2JqKQotCS8vIHsKLQkvLyBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIExpc3QgYnJlYWtkb3duRWxlbWVudHMgPSAoKEFjdGl2aXR5KWFjdGl2aXR5KS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCS8vIGZvciAoSXRlcmF0b3IgaXQgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCS8vIHsKLQkvLyBPYmplY3QgZWxlbWVudE9iaiA9IGl0Lm5leHQoKTsKLQkvLyBpZiAoKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZgotCS8vIE1pbGVzdG9uZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JLy8gewotCS8vIGVsZW1lbnRzLmFkZChlbGVtZW50T2JqKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFdCU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmNTdkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHVibGljIFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM5Mjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtPcmRlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIpCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JLy8gRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCS8vIHJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5MzE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRvckl0ZW1Qcm92aWRlcgotaW1wbGVtZW50cyBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIKLXsKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjYWNoZWRDaGlsZHJlbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eShPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldERlc2NyaXB0b3IoQWN0aXZpdHkgYWN0aXZpdHksIEFydGlmYWN0IGFydGlmYWN0KSB7Ci0JCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJJiYgKGFydGlmYWN0ID09ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJcmV0dXJuIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkKLQkJLy8gewotCQkvLyBjaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLS8vCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotLy8JCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSh3cERlc2MpOwotCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQlpZihzaXplID4gMCkgewotCQkJCUFycmF5TGlzdCBhcnRpZmFjdERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcihhY3Rpdml0eSwgKEFydGlmYWN0KSBsaXN0Ci0JCQkJCQkJLmdldChpKSk7Ci0JCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCWFydGlmYWN0RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFhcnRpZmFjdERlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJCQlDb2xsZWN0aW9ucy5zb3J0KGFydGlmYWN0RGVzY3JpcHRvcnMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJCQljaGlsZHJlbi5hZGRBbGwoYXJ0aWZhY3REZXNjcmlwdG9ycyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0OwotCQkKLQkJLy8gZG9uJ3Qgc2hvdyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vbi1kZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkvLyB0aGF0IGlzIGRlbGl2ZXJhYmxlIHBhcnQgb2YgYSBkZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkvLwotCQlpZighKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpKSB7Ci0JCQlPYmplY3QgcGFyZW50ID0gVG5nVXRpbC51bndyYXAoZ2V0UGFyZW50KG9iamVjdCkpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJCSYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7CQkJCQotCQkJCXVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMKLQkJLy8KLQkJaWYoIXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGdldCBkZXNjcmlwdG9ycyBvZiBjb250YWluZWQgYXJ0aWZhY3RzCi0JCS8vCQkKLQkJaWYgKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWFkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMod3BEZXNjLCBjaGlsZHJlbik7Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFGYWN0b3J5LmFkYXB0KGl0ZXIKLQkJCQkJLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWFkYXB0ZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBjaGlsZHJlbiBmcm9tIGNhY2hlLCBmaWxsIHRoZSBjaGlsZHJlbiBjYWNoZSBpZiBpdCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0vLwkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLS8vCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJTGlzdCBlbGVtZW50cyA9IFByb2Nlc3NVdGlsLmdldEFmZmVjdGVkRWxlbWVudHMobm90aWZpY2F0aW9uLCBudWxsKTsKLQkJCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpIHsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9Db250YWluZXIoZSwgdGhpcywgZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoZS5nZXRTdXBlckFjdGl2aXRpZXMoKSAhPSBudWxsKSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBlLAotCQkJCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVmcmVzaCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCB3cGQsIGZhbHNlLAotCQkJCQl0cnVlKSk7Ci0JCQlpZiAod3BkLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGRlc2NyaXB0b3IgPSBpdGVyLm5leHQoKTsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJZGVzY3JpcHRvciwgZmFsc2UsIHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDoKLQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJV29ya1Byb2R1Y3Qgd3A7Ci0JCQlib29sZWFuIGNvbnRlbnRSZWZyZXNoID0gbm90aWZpZXIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQkmJiAoKHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipbm90aWZpZXIpLmdldFdvcmtQcm9kdWN0KCkpIGluc3RhbmNlb2YgQXJ0aWZhY3QKLQkJCQkJCXx8IHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgY29udGVudFJlZnJlc2gsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdDsKLQotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSB7Ci0JCQl3cGQuc2V0QWN0aXZpdHlFbnRyeVN0YXRlKHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpIHsKLQkJCXdwZC5zZXRBY3Rpdml0eUV4aXRTdGF0ZSh0eHQpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcCwgdHh0KTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc1RvcExldmVsQXJ0aWZhY3RJbkFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QKLQkvLyBvYmopCi0JLy8gewotCS8vIEFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCS8vICAgICAgICAKLQkvLyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikKLQkvLyBhRmFjdG9yeS5hZGFwdChhY3Rpdml0eSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkvLyBDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3Rpdml0eSk7Ci0JLy8gaWYgKGNoaWxkcmVuLmNvbnRhaW5zKG9iaikpCi0JLy8gewotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZCAtICIgKyBvYmopOwotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwOwotCQkJCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJCVdvcmtQcm9kdWN0IG9ialdQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCQkJaW50IGxvY2F0aW9uID0gMDsKLQkJCQkvLyBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCSgoRUxpc3QpIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpKS5tb3ZlKGxvY2F0aW9uLAotCQkJCQkJbG9jYXRpb24gLSAxKTsKLQkJCX0KLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVVcChhY3Rpdml0eSwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwOwotCQkJCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJCVdvcmtQcm9kdWN0IG9ialdQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCQkJaW50IGxvY2F0aW9uID0gMDsKLQkJCQkvLyBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCSgoRUxpc3QpIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpKS5tb3ZlKGxvY2F0aW9uLAotCQkJCQkJbG9jYXRpb24gKyAxKTsKLQkJCX0KLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2ZhY3RvclJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBmYWN0b3JSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJaWYoIShjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IGdldEFjdGl2aXR5KHRhcmdldCk7Ci0JCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdCwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJCWNvbW1hbmRQYXJhbWV0ZXIuc2V0T3duZXIoYWN0KTsKLQkJCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVDb21tYW5kKGFjdCwgZG9tYWluLCBSZW1vdmVDb21tYW5kLmNsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmZhY3RvclJlbW92ZUNvbW1hbmQoZG9tYWluLCBjb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIEVQRiBidWcjOiAxNDQ4MjAgU29tZSBuZXN0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHNob3cgd3JvbmcgbW9kZWwgaW5mbyBpbiB3b3JrIHByb2R1Y3QgdXNhZ2UgdmlldwotCQkvLyBmb3IgZGVmZWN0LCBvdmVycmlkZSB0aGUgbWV0aG9kLCBwcmV2aW91c2x5IERlc2NyaXB0b3JJdGVtUHJvdmlkZS5nZXRBdHRyaWJ1dGUgdXNlIHRvIGhhdmUgdGhpcyBjb2RlLCBtb3ZlZCB0byBoZXJlLiAKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0vLwkJCQkJUHJvY2Vzc1V0aWwuZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKG1vZGVsSW5mbywKLS8vCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIG9iamVjdCwgdGhpcyk7Ci0JCQkJfQotLy8JCQl9Ci0JCQlyZXR1cm4gbW9kZWxJbmZvLnRvU3RyaW5nKCk7IAotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExMDNkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCQotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5QWRkQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlBZGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNTc1YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlBZGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQWRkQ29tbWFuZCBmb3IgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMTYsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqIEBzZWUgCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUFkZENvbW1hbmQgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQgewotCXByaXZhdGUgTGlzdCBwcm9jUGFja2FnZXM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQotCXByaXZhdGUgTWFwIGdldENvcHlUb09yaWdpbmFsTWFwKCkgewotCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlyZXR1cm4gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKQotCQkJCQkuZ2V0Q29weVRvT3JpZ2luYWxNYXAoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weVByb2Nlc3NQYWNrYWdlcygpIHsKLQkJaWYgKHByb2NQYWNrYWdlcyA9PSBudWxsKSB7Ci0JCQlpZiAoaGFzQ29weVRvT3JpZ2luYWxNYXAoKSkgewotCQkJCWJvb2xlYW4gc2hvd1dhcm5pbmcgPSBmYWxzZTsKLQkJCQlwcm9jUGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJQXJyYXlMaXN0PEFjdGl2aXR5PiBjb3BpZWRBY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJLy8gY2hlY2sgZmlyc3QgZWxlbWVudCBvZiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCS8vIGlmIGl0J3MgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB3ZSBhcmUgcGFzdGluZyBhbmQKLQkJCQkvLyBtYXkgbmVlZCB0byB3YXJuIHRoZSB1c2VyCi0JCQkJLy8gaWYgaXQncyBub3QgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB0aGVuIHdlIGFyZQotCQkJCS8vIHByb2JhYmx5IGFkZGluZyBhIG5ldyBlbGVtZW50CQkJCQotCQkJCWlmIChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSAhPSBudWxsCi0JCQkJCQkmJiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5zaXplKCkgPiAwCi0JCQkJCQkmJiBnZXRPcmlnaW5hbChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS50b0FycmF5KClbMF0pICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUFjdGl2aXR5IG9yaWcgPSAoQWN0aXZpdHkpIGdldE9yaWdpbmFsKGVsZW1lbnQpOwotCQkJCQkJCWlmIChvcmlnICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKG9yaWcuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJCQkJCXByb2NQYWNrYWdlcy5hZGQob3JpZy5lQ29udGFpbmVyKCkpOwotCQkJCQkJCQkJY29waWVkQWN0aXZpdGllcy5hZGQoKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNob3dXYXJuaW5nID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoc2hvd1dhcm5pbmcpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkJLnNob3dXYXJuaW5nKAotCQkJCQkJCQkJZ2V0TGFiZWwoKSwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLkFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2cpOwotCQkJCX0KLQotCQkJCWlmICghcHJvY1BhY2thZ2VzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBjb3B5IHRoZSBQcm9jZXNzUGFja2FnZSBvZiB0aGUgb3JpZ2luYWwgQWN0aXZpdHkgdG8gYWRkCi0JCQkJCS8vIGl0IHRvIHRoZSBQcm9jZXNzUGFja2FnZQotCQkJCQkvLyBvZiB0aGUgdGFyZ2V0IEFjdGl2aXR5LgotCQkJCQkvLwotCQkJCQkvLyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IG5ldwotCQkJCQkvLyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQkvLyAsIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJQ29tbWFuZCBjb21tYW5kID0gQ29weUNvbW1hbmQuY3JlYXRlKAotCQkJCQkJCWFkZENvbW1hbmQuZ2V0RG9tYWluKCksIHByb2NQYWNrYWdlcyk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQotCQkJCQkJLy8gUmVmcmVzaCB0aGUgQWRkQ29tbWFuZC5jb2xsZWN0aW9uIHdpdGggbmV3IGFjdGl2aXR5IGNvcGllcy4KLQkJCQkJCS8vCi0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpKTsKLQkJCQkJCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKTsJCQkJCQkKLQkJCQkJCWVsZW1lbnRzLmNsZWFyKCk7CQotCQkJCQkJQ29sbGVjdGlvbiBjb2wgPSBjb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJQXJyYXlMaXN0PFByb2Nlc3NQYWNrYWdlPiBwcm9jUGtnQ29waWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzUGFja2FnZT4oY29sKTsKLS8vCQkJCQkJQXJyYXlMaXN0PFByb2Nlc3NQYWNrYWdlPiBwcm9jUGtnQ29waWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzUGFja2FnZT4oY29tbWFuZC5nZXRSZXN1bHQoKSk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWludCBpbmRleCA9IGNvcGllZEFjdGl2aXRpZXMuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJCQlpZihpbmRleCAhPSAtMSkgewotCQkJCQkJCQlQcm9jZXNzUGFja2FnZSBjb3B5ID0gcHJvY1BrZ0NvcGllcy5nZXQoaW5kZXgpOwotCQkJCQkJCQllbGVtZW50ID0gZ2V0QWN0aXZpdHlDb3B5KGNvcHkpOwotCQkJCQkJCX0KLQkJCQkJCQlpZihlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpdml0eSBnZXRBY3Rpdml0eUNvcHkoUHJvY2Vzc1BhY2thZ2UgY29weSkgewotCQlpZiAoY29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCUFjdGl2aXR5IGFjdENvcHkgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNvcHkpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkvLyBjb3B5IGRhdGEgZnJvbSBQcm9jZXNzQ29tcG9uZW50IHRvIGEgbmV3Ci0JCQkvLyBQcm9jZXNzUGFja2FnZQotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnQ29weSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnQ29weS5zZXROYW1lKGFjdENvcHkuZ2V0TmFtZSgpKTsKLQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdENvcHkpOwotCQkJcGtnQ29weS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJCWNvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkpOwotCQkJcGtnQ29weS5nZXREaWFncmFtcygpCi0JCQkJCS5hZGRBbGwoY29weS5nZXREaWFncmFtcygpKTsKLQkJCXBrZ0NvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJY29weS5nZXRDaGlsZFBhY2thZ2VzKCkpOwotCi0JCQlyZXR1cm4gYWN0Q29weTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcHJlcGFyZUFkZExpc3QoKTsKLQkJY29weVByb2Nlc3NQYWNrYWdlcygpOwotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGUgaXMgYSBjaGlsZCwgZGlyZWN0IG9yIG9mIGFjdAotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2hpbGRPZihPYmplY3QgcGFyZW50LCBPYmplY3QgZSkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcGFyZW50OwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlID09IGNoaWxkKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAoaXNDaGlsZE9mKGNoaWxkLCBlKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJLy8gV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilwYXJlbnQpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCS8vIGlmKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJLy8gaWYoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkvLyBpZihVbWFVdGlsLmlzQ29udGFpbmVkQnkoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZSkuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJLy8gd3ApKSB7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2hpbGRPZihDb2xsZWN0aW9uIGVsZW1lbnRzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChpc0NoaWxkT2YoaXRlci5uZXh0KCksIGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzQ29weVRvT3JpZ2luYWxNYXAoKSB7Ci0JCUVkaXRpbmdEb21haW4gZWQgPSBhZGRDb21tYW5kLmdldERvbWFpbigpOwotCQlpZiAoZWQgaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCVRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKTsKLQkJCXJldHVybiAoZWRpdGluZ0RvbWFpbi5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpICE9IG51bGwgJiYKLQkJCQkJIWVkaXRpbmdEb21haW4uZ2V0Q29weVRvT3JpZ2luYWxNYXAoKS5pc0VtcHR5KCkpCi0JCQkJfHwgKGVkaXRpbmdEb21haW4uZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpICE9IG51bGwgJiYKLQkJCQkJCSFlZGl0aW5nRG9tYWluLmdldENsaXBib2FyZFRvT3JpZ2luYWxNYXAoKS5pc0VtcHR5KCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0T3JpZ2luYWwoT2JqZWN0IGNvcHkpIHsKLQkJVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkID0gKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJT2JqZWN0IG9yaWdpbmFsID0gZWQuZ2V0Q29weVRvT3JpZ2luYWxNYXAoKS5nZXQoY29weSk7Ci0JCWlmKG9yaWdpbmFsID09IG51bGwgJiYgZWQuZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpICE9IG51bGwpIHsKLQkJCW9yaWdpbmFsID0gZWQuZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpLmdldChjb3B5KTsKLQkJfQotCQlyZXR1cm4gb3JpZ2luYWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVBZGRMaXN0KCkgewotCQkvLyBjbGVhbnVwIGVsZW1lbnQgbGlzdCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBhY3Rpdml0eSB0byBhdm9pZCBhZGRpbmcKLQkJLy8gZWxlbWVudHMgbXVsdGlwbGUgdGltZXMKLQkJLy8JCQotCQlpZiAoaGFzQ29weVRvT3JpZ2luYWxNYXAoKSkgewotCQkJQXJyYXlMaXN0IG9yaWdpbmFscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCU1hcCBvcmlnaW5hbFRvQ29weU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgb3JpZ2luYWwgPSBnZXRPcmlnaW5hbChlbGVtZW50KTsKLQkJCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJCQlvcmlnaW5hbHMuYWRkKG9yaWdpbmFsKTsKLQkJCQkJb3JpZ2luYWxUb0NvcHlNYXAucHV0KG9yaWdpbmFsLCBlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUFycmF5TGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gQXJyYXlMaXN0IGFkZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmlnaW5hbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoaXNDaGlsZE9mKG9yaWdpbmFscywgZWxlbWVudCkpIHsKLQkJCQkJcmVtb3ZlTGlzdC5hZGQob3JpZ2luYWxUb0NvcHlNYXAuZ2V0KGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxNDc0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYXRpb25TZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnN0cmFpbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5EZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVRleHRSZWZlcmVuY2VSZXBsYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFBoeXNpY2FsbHkgY29waWVzIGFuIGFjdGl2aXR5IHdpdGggYWxsIG9mIGl0cyBkaXJlY3Qgb3IgaW5oZXJpdGVkIHN0cnVjdHVyYWwgZmVhdHVyZXMgYW5kIHJlZmVyZW5jZXMuCi0gKiAgIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBleHRlbmRzIENvcHlDb21tYW5kIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSB7Ci0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIGRpYWdyYW1UeXBlcyA9IHsKLQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLAotCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSwKLQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0KLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnlbXSBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3RvcmllczsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBFZGl0aW5nRG9tYWluIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIHsKLQotCQkvKioKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkJICovCi0JCXB1YmxpYyBFZGl0aW5nRG9tYWluKCkgewotCQkJc3VwZXIoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5DbGFzcywgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCQkgKi8KLQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQkJaWYoY29tbWFuZENsYXNzID09IENyZWF0ZUNvcHlDb21tYW5kLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIG5ldyBDcmVhdGVEZWVwQ29weUNvbW1hbmQodGhpcywgY29tbWFuZFBhcmFtZXRlci5nZXRFT3duZXIoKSwgKEhlbHBlcikgY29tbWFuZFBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJCWlmKGNvbW1hbmRDbGFzcyA9PSBJbml0aWFsaXplQ29weUNvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gbmV3IEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQodGhpcywgY29tbWFuZFBhcmFtZXRlci5nZXRFT3duZXIoKSwgKEhlbHBlcikgY29tbWFuZFBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKGNvbW1hbmRDbGFzcywgY29tbWFuZFBhcmFtZXRlcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ3JlYXRlQ29weUNvbW1hbmRzKENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQsCi0JCQlFT2JqZWN0IG9iamVjdCkgewotCi0JCS8vIE9wZXJhdGlvbiB0byBoYW5kbGUgY29weSByZXBsYWNlcnMgb2YgdGhlIGNoaWxkIGFjdGl2aXRpZXMKLQkJLy8gCi0JCWlmIChjb3B5RXh0ZXJuYWxWYXJpYXRpb25zICYmIG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmIG9iamVjdCAhPSB0aGlzLmFjdGl2aXR5LmVDb250YWluZXIoKSkgewkJCQotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKW9iamVjdDsKLQkJCWJvb2xlYW4gaXNSZXBsYWNlZCA9IGZhbHNlOwotCQkJQWN0aXZpdHkgcmVwbGFjZXIgPSBudWxsOwotCQkJQWN0aXZpdHkgb3JpZ25hbEFjdGl2aXR5ID0gbnVsbDsKLQkJCWZvcihPYmplY3QgcHJvY2VzRWxlbWVudCA6IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKSl7Ci0JCQkJaWYgKHByb2Nlc0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBY3Rpdml0eSBjaGlsZEFjdCA9IChBY3Rpdml0eSkgcHJvY2VzRWxlbWVudDsKLQkJCQkJaWYoY2hpbGRBY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gdGhpcy5hY3Rpdml0eSkgewotCQkJCQkJcmVwbGFjZXIgPSBnZXRSZXBsYWNlciggKEFjdGl2aXR5KXByb2Nlc0VsZW1lbnQgKTsKLQkJCQkJCWlmIChyZXBsYWNlciAhPSBudWxsICkgewotCQkJCQkJCWlzUmVwbGFjZWQgPSB0cnVlOwotCQkJCQkJCW9yaWduYWxBY3Rpdml0eSA9IChBY3Rpdml0eSlwcm9jZXNFbGVtZW50OwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNSZXBsYWNlZCkgewkJCQkKLQkJCQkvLyByZXNldCB0aGUgZGVmZXJyZWRJbml0aWFsaXphdGlvbkNvdW50IHNvCi0JCQkJLy8gSW5pdGlhbGl6ZUNvcHlDb21tYW5kIGNhbiBiZSBjcmVhdGVkIGZvciB0aGUgZm9sbG93aW5nCi0JCQkJLy8gQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQuIFNlZQotCQkJCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQucHJlcGFyZSgpIGZvciBtb3JlCi0JCQkJLy8gZGV0YWlscy4KLQkJCQkvLwotCQkJCWNvcHlIZWxwZXIuZGVjcmVtZW50RGVmZXJyZWRJbml0aWFsaXphdGlvbkNvdW50KCk7Ci0JCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKHJlcGxhY2VyLCAoQ29weUhlbHBlciljb3B5SGVscGVyLCBjb25maWcsIAotCQkJCQkJdGFyZ2V0UHJvY2VzcywgbW9uaXRvciwgZmFsc2UsYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCQkJY21kLmd1aWRMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmd1aWRMaXN0KTsKLQkJCQljbWQuZ3VpZExpc3QuYWRkQWxsKFByb2Nlc3NVdGlsLmdldEd1aWRMaXN0KEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuYWN0aXZpdHksIG9yaWduYWxBY3Rpdml0eSkpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCVByb2Nlc3NQYWNrYWdlIHBrZ0NvcHkgPSBjbWQucGtnQ29weTsJCQkJCQotCQkJCQkvL2Jhc2ljIHB1dDogb3JpZ2luYWwgcHJjIHBrZyB0byBjb3BpZWQgcGtnIGJhc2VkIG9uIHJlcGxhY2VkIHBhY2thZ2UuCi0JCQkJCSgoQ29weUhlbHBlciljb3B5SGVscGVyKS5iYXNpY1B1dChvYmplY3QsIHBrZ0NvcHkpOwkJCQotCQkJCQkvL2Jhc2ljIHB1dCBvcmlnaW5hbCBhY3Rpdml0eSB0byB0aGUgY29weSBvZiByZXBsYWNlciBhY3Rpdml0eS4KLQkJCQkJKChDb3B5SGVscGVyKWNvcHlIZWxwZXIpLmJhc2ljUHV0KG9yaWduYWxBY3Rpdml0eSwgY29weUhlbHBlci5nZXQocmVwbGFjZXIpKTsKLQkJCQl9ZmluYWxseXsKLQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQl9CQotCQkJCS8vIHJlc3RvcmUgdGhlIGRlZmVycmVkSW5pdGlhbGl6YXRpb25Db3VudCBzbwotCQkJCS8vIEluaXRpYWxpemVDb3B5Q29tbWFuZCBjYW4gYmUgY3JlYXRlZCBmb3IgdGhpcwotCQkJCS8vIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kCi0JCQkJY29weUhlbHBlci5pbmNyZW1lbnREZWZlcnJlZEluaXRpYWxpemF0aW9uQ291bnQoKTsJCQkJCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlzdXBlci5hZGRDcmVhdGVDb3B5Q29tbWFuZHMoY29tcG91bmRDb21tYW5kLCBvYmplY3QpOwotCQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgZm9yIHRoZSByZXBsYWNlciBvZiBhY3Rpdml0eSBpbiB0aGUgY29weSBiYXNlZCBjb25maWd1cmF0aW9uLgotCSAqICAKLQkgKiBAcGFyYW0gYWN0aXZpdHkgdGFyZ2V0IGFjdGl2aXR5Ci0JICogQHJldHVybiByZXBsY2FjZXIgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGhhdmUgb25lCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGdldFJlcGxhY2VyKEFjdGl2aXR5IGFjdGl2aXR5KXsJCQotCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl0cnkgewotCQkJaWYgKGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IgIT0gbnVsbCApIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBjb25maWdTZXR0ZXIuZ2V0T2xkQ29uZmlndXJhdGlvbigpOyAKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvcHlDb25maWcgPSBjb25maWcgPT0gbnVsbCA/IChjdXJyZW50Q29uZmlnICE9IG51bGwgPyBjdXJyZW50Q29uZmlnCi0JCQkJCQk6IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkKLQkJCQkJCTogY29uZmlnOwotCQkJCWFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb3B5Q29uZmlnKTsJCQkJCi0KLQkJCQlWYXJpYWJpbGl0eUluZm8gdmFyaWFiaWxpdHlJbmZvID0gYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5nZXRWYXJpYWJpbGl0eUluZm8oYWN0aXZpdHkpOwotCi0JCQkJaWYgKHZhcmlhYmlsaXR5SW5mbyAhPSBudWxsICYmICEgdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmlzRW1wdHkoKSApIHsKLQkJCQkJQWN0aXZpdHkgcmVwbGFjZXIgPSAoQWN0aXZpdHkpdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmdldCgwKTsKLQkJCQkJcmV0dXJuICByZXBsYWNlciA9PSBhY3Rpdml0eSA/IG51bGwgOiByZXBsYWNlcjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5ewotCQkJaWYgKGNvbmZpZ1NldHRlciAhPSBudWxsICkgewotCQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgY29udHJpYnV0b3JzIG9mIGFjdGl2aXR5IGluIHRoZSBjb3B5IGJhc2VkIGNvbmZpZ3VyYXRpb24uCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybiBhIGxpc3QgaW5jbHVkaW5nIGNvbnRyaWJ1dG9ycyBvciBlbXB0eSBsaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q29udHJpYnV0b3JzKEFjdGl2aXR5IGFjdGl2aXR5KXsKLQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJdHJ5IHsKLQkJCWlmIChhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yICE9IG51bGwgKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gY29uZmlnU2V0dGVyLmdldE9sZENvbmZpZ3VyYXRpb24oKTsgCi0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb3B5Q29uZmlnID0gY29uZmlnID09IG51bGwgPyAoY3VycmVudENvbmZpZyAhPSBudWxsID8gY3VycmVudENvbmZpZwotCQkJCQkJOiB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpCi0JCQkJCQk6IGNvbmZpZzsKLQkJCQlhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29weUNvbmZpZyk7CQkJCQotCi0JCQkJVmFyaWFiaWxpdHlJbmZvIHZhcmlhYmlsaXR5SW5mbyA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IuZ2V0VmFyaWFiaWxpdHlJbmZvKGFjdGl2aXR5KTsKLQotCQkJCWlmICh2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCApIHsKLQkJCQkJcmV0dXJuIHZhcmlhYmlsaXR5SW5mby5nZXRDb250cmlidXRvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfSBmaW5hbGx5ewotCQkJaWYgKGNvbmZpZ1NldHRlciAhPSBudWxsICkgewotCQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBjbGFzcyBDcmVhdGVEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVDb3B5Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBkb21haW4KLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlRGVlcENvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kI2RvR2V0Q2hpbGRyZW5Ub0NvcHkoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZG9HZXRDaGlsZHJlblRvQ29weSgpIHsKLQkJCUNvbmZpZ3VyYXRpb25TZXR0ZXIgY29uZmlnU2V0dGVyID0gbmV3IENvbmZpZ3VyYXRpb25TZXR0ZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl0cnkgewotCQkJCWNvbmZpZ1NldHRlci5zZXQoY29uZmlnKTsKLQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IGNvbmZpZ1NldHRlci5nZXRDb25maWd1cmF0b3IoKTsKLQkJCQkKLQkJCQkvLyBDcmVhdGUgY29tbWFuZHMgdG8gY3JlYXRlIGNvcGllcyBvZiB0aGUgY2hpbGRyZW4uCi0JCQkJLy8KLQkJCQlMaXN0PE9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpID0gb3duZXIuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLQkJCQl7Ci0JCQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQkJCWlmKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJLy8gbWFrZSBzdXJlIHRoYXQgQWN0aXZpdHkgd2lsbCBiZSBjb3BpZWQgZmlyc3QKLQkJCQkJCS8vIHNvIHJlZmVyZW5jZXMgdG8gaXRzIGluaGVyaXRlZCBlbGVtZW50cyBjYW4gYmUgcmVzb2x2ZWQKLQkJCQkJCS8vIHByb3Blcmx5Ci0JCQkJCQkvLwotCQkJCQkJaWYoY29uZmlndXJhdG9yID09IG51bGwgfHwgY29uZmlndXJhdG9yLmFjY2VwdChvKSkgewotCQkJCQkJCXJlc3VsdC5hZGQoMCwgbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXN1bHQuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kIHsKLQkJLyoqCi0JCSAqIExpc3Qgb2YgR1VJRHMgb2YgYWN0aXZpdHkgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIHByb2Nlc3MgdG8gCi0JCSAqLwotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBndWlkTGlzdDsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tYWluCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gY29weUhlbHBlcgotCQkgKi8KLQkJcHVibGljIEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQkJCWNvcHkgPSAoRU9iamVjdCkgY29weUhlbHBlci5nZXQob3duZXIpOwotCQl9Ci0JCQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQjY29weVJlZmVyZW5jZXMoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZXMoKSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gbnVsbDsKLQkJCUFjdGl2aXR5IGJhc2VDb3B5ID0gbnVsbDsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjaGlsZEJhc2VDb3BpZXMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG51bGw7Ci0JCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCQlib29sZWFuIGJhc2VBY2NlcHRlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlpZihvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvd25lcjsKLQkJCQkJaWYoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0aXZpdHkpKSB7Ci0JCQkJCQljb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJCWNvbmZpZ1NldHRlci5zZXQoY29uZmlnKTsKLQkJCQkJCWNvbmZpZ3VyYXRvciA9IGNvbmZpZ1NldHRlci5nZXRDb25maWd1cmF0b3IoKTsKLQkJCQkJCS8vIGNvcHkgaW5oZXJpdGVkIGVsZW1lbnRzIGJ5IGRlZXAtY29weWluZyBiYXNlIGFjdGl2aXR5Ci0JCQkJCQkvLwotCQkJCQkJLy8gZGVlcCBjb3B5IG9mIGJhc2UgYWN0aXZpdHkgYXQgdGhpcyBwb2ludCBpcyBlc3NlbnRpYWwgc28gcmVmZXJlbmNlcyB0byBwcmVkZWNlc3NvcnMKLQkJCQkJCS8vIHdpbGwgYmUgY29waWVkIGNvcnJlY3RseQotCQkJCQkJLy8KLQkJCQkJCWJhc2UgPSAoQWN0aXZpdHkpIGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCWJhc2VBY2NlcHRlZCA9IGNvbmZpZ3VyYXRvciA9PSBudWxsIHx8IGNvbmZpZ3VyYXRvci5hY2NlcHQoYmFzZSk7Ci0JCQkJCQlpZihiYXNlQWNjZXB0ZWQpIHsJCQkJCQkJCi0JCQkJCQkJQ29weUhlbHBlciBoZWxwZXIgPSAoQ29weUhlbHBlciljb3B5SGVscGVyOwotCQkJCQkJCUFjdGl2aXR5IG9sZEJhc2VDb3B5ID0gKEFjdGl2aXR5KSBoZWxwZXIuZ2V0KGJhc2UpOwotCQkJCQkJCS8vIHRoaXMgd2lsbCByZWRpcmVjdCBhbnkgcmVmZXJlbmNlIHRvIGNvcHkgb2YgYmFzZSBpbiBkaWFncmFtIHRvIHRoZSBjb3B5IG9mIHRoZSBhY3Rpdml0eQotCQkJCQkJCS8vCi0JCQkJCQkJaGVscGVyLnB1dFZhcmlhYmlsaXR5RWxlbWVudChiYXNlLCBhY3Rpdml0eSk7Ci0JCQkJCQkJQXJyYXlMaXN0IGNoaWxkQmFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlRWxlbWVudCA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCQkJCWlmKGJhc2VFbGVtZW50ICE9IG51bGwgJiYKLQkJCQkJCQkJCQkJKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04gfHwgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSkKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQloZWxwZXIucHV0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2VFbGVtZW50LCB2ZSk7Ci0JCQkJCQkJCQkJY2hpbGRCYXNlcy5hZGQoYmFzZUVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKGJhc2UsIGhlbHBlciwgY29uZmlnLCB0YXJnZXRQcm9jZXNzLCBtb25pdG9yLCBmYWxzZSxhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCQkJCQljbWQuY29weUV4dGVybmFsVmFyaWF0aW9ucyA9IGNvcHlFeHRlcm5hbFZhcmlhdGlvbnM7Ci0JCQkJCQkJY21kLmd1aWRMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmd1aWRMaXN0KTsKLQkJCQkJCQljbWQuZ3VpZExpc3QuYWRkQWxsKFByb2Nlc3NVdGlsLmdldEd1aWRMaXN0KEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuYWN0aXZpdHksIGFjdGl2aXR5KSk7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQotCQkJCQkJCQliYXNlQ29weSA9IChBY3Rpdml0eSkgaGVscGVyLmdldChiYXNlKTsKLQkJCQkJCQkJaWYoYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCQkJCQkJCS8vIGtlZXAgYWN0aXZpdHkgb25seSBhcyBiYWNrdXAgY29weSBvZiBiYXNlCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJaGVscGVyLnJlbW92ZVZhcmlhYmlsaXR5RWxlbWVudChiYXNlKTsKLQkJCQkJCQkJCWhlbHBlci5wdXRCYWNrdXBDb3B5KGJhc2UsIGFjdGl2aXR5KTsKLQotCQkJCQkJCQkJLy8gcHV0IGJhY2sgb2xkQmFzZUNvcHkKLQkJCQkJCQkJCWlmKG9sZEJhc2VDb3B5ICE9IG51bGwpIHsKLQkJCQkJCQkJCQloZWxwZXIuYmFzaWNQdXQoYmFzZSwgb2xkQmFzZUNvcHkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJLy8gcmVtb3ZlIHRoZSBjb3BpZXMgb2YgYWxsIGJhc2Ugc2luY2UgYmFzZSBjb3BpZXMgYXJlIG5vdCBhZGRlZCB0byB0aGUgcHJvY2VzcwotCQkJCQkJCQkvLwotCQkJCQkJCQloZWxwZXIucmVtb3ZlKGJhc2UpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZEJhc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJRU9iamVjdCBjaGlsZEJhc2VDb3B5ID0gKEVPYmplY3QpIGhlbHBlci5yZW1vdmUoaXRlci5uZXh0KCkpOwotCQkJCQkJCQkJaWYoY2hpbGRCYXNlQ29weSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJY2hpbGRCYXNlQ29waWVzLmFkZChjaGlsZEJhc2VDb3B5KTsKLQkJCQkJCQkJCQlFY29yZVV0aWwucmVtb3ZlKGNoaWxkQmFzZUNvcHkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCUFjdGl2aXR5IGFjdGl2aXR5Q29weSA9IChBY3Rpdml0eSkgY29weTsKLQotCQkJCQkJCQkvLyByZW1vdmUgdGhlIGNvcGllcyBvZiBiYXNlIGRpYWdyYW0gaWYgdGhlIGFjdGl2aXR5IGFscmVhZHkgaGF2ZSBkaWFncmFtIG9mIHRoZSBzYW1lIHR5cGUKLQkJCQkJCQkJLy8KLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCWludCB0eXBlID0gZGlhZ3JhbVR5cGVzW2ldOwotCQkJCQkJCQkJaWYoZGlhZ3JhbU1nci5nZXREaWFncmFtKGFjdGl2aXR5LCB0eXBlKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZGlhZ3JhbU1nci5nZXREaWFncmFtKGFjdGl2aXR5Q29weSwgdHlwZSk7Ci0JCQkJCQkJCQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJLy8gbW92ZSBjb250ZW50IG9mIGJhc2UgcGFja2FnZSBvdmVyIHRvIHRoZSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCQkJCQkJLy8KLQkJCQkJCQkJbW92ZUNvbnRlbnQoY21kLnBrZ0NvcHksIGFjdGl2aXR5Q29weSk7CQotCi0JCQkJCQkJCS8vIHJlY29yZCB0aGUgY29weSBvZiB0aGUgd3JhcHBlcnMKLQkJCQkJCQkJLy8KLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhc2VDb3B5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZighY2hpbGRCYXNlQ29waWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCQkJQnJlYWtkb3duRWxlbWVudCBvcmlnaW5hbCA9IChCcmVha2Rvd25FbGVtZW50KSBoZWxwZXIuZ2V0T3JpZ2luYWwoZSk7Ci0JCQkJCQkJCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oY21kLmd1aWRMaXN0KTsKLQkJCQkJCQkJCQlsaXN0LmFkZChvcmlnaW5hbC5nZXRHdWlkKCkpOwotCQkJCQkJCQkJCWhlbHBlci5wdXRXcmFwcGVyQ29weShQcm9jZXNzVXRpbC50b0d1aWRQYXRoKGxpc3QpLCBlKTsJCQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXN1cGVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0KLQkJCQlpZihiYXNlICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG93bmVyOwotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eUNvcHkgPSAoKEFjdGl2aXR5KSBjb3B5KTsJCQkJCQotCQkJCQkKLQkJCQkJaWYoYmFzZUFjY2VwdGVkKSB7Ci0JCQkJCQkvLyBjb3B5IGluaGVyaXRlZCBicmVha2Rvd24gZWxlbWVudHMgZnJvbSB0aGUgYmFzZSBhY3Rpdml0eSBpbiB0aGUgcmlnaHQgb3JkZXIKLQkJCQkJCS8vCi0JCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBjb25maWdTZXR0ZXIuZ2V0T2xkQ29uZmlndXJhdGlvbigpOwotCi0JCQkJCQkvLyBBZGQgYnJlYWtkb3duIGVsZW1lbnRzIGZyb20gYmFzZSBjb3B5IHRvIHRoZSBhY3Rpdml0eSBjb3B5LiAKLQkJCQkJCS8vIERvbid0IGFkZCBjb3B5IG9mIGJhc2UgZWxlbWVudCBvZiB0aGUgZXhpc3RpbmcgY2hpbGRyZW4KLQkJCQkJCS8vCi0JCQkJCQlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxCcmVha2Rvd25FbGVtZW50PigpOwotCQkJCQkJZm9yIChJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PiBpdGVyID0gYmFzZUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZighY2hpbGRCYXNlQ29waWVzLmNvbnRhaW5zKGUpICYmIChjb25maWd1cmF0b3IgPT0gbnVsbCB8fCBjb25maWd1cmF0b3IuYWNjZXB0KGUpKSkgewotCQkJCQkJCQlicmVha2Rvd25FbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQkJfQkJCQkJCQotCQkJCQkJfQotCQkJCQkJYWN0aXZpdHlDb3B5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKDAsIGJyZWFrZG93bkVsZW1lbnRzKTsKLQkJCQkJCWJhc2VDb3B5LnNldFN1cGVyQWN0aXZpdGllcyhudWxsKTsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoYmFzZUNvcHkpOwotCi0KLQkJCQkJCS8vIGNvcHkgb3RoZXIgc3RyaW5nIGF0dHJpYnV0ZXMgYXMgd2VsbCBhZnRlciByZWFsaXplIHRoZW0KLQkJCQkJCS8vCi0JCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvcHlDb25maWcgPSBjb25maWcgPT0gbnVsbCA/IChjdXJyZW50Q29uZmlnICE9IG51bGwgPyBjdXJyZW50Q29uZmlnCi0JCQkJCQkJCTogdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKQotCQkJCQkJCQk6IGNvbmZpZzsKLQkJCQkJCWZvciAoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzVG9Db3B5KCkpIHsKLQkJCQkJCQlpZiAoYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSgpICYmICFhdHRyaWJ1dGUuaXNEZXJpdmVkKCkpIHsKLQkJCQkJCQkJT2JqZWN0IHZhbHVlID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0QXR0cmlidXRlKGFjdGl2aXR5LCBhdHRyaWJ1dGUsIGNvcHlDb25maWcpOwotCQkJCQkJCQlhY3Rpdml0eUNvcHkuZVNldChhdHRyaWJ1dGUsIHZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGFjdGl2aXR5LmdldFByZXNlbnRhdGlvbigpOwotCQkJCQkJZm9yIChFQXR0cmlidXRlIGF0dHJpYnV0ZSA6IGNvbnRlbnQuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKSkgewotCQkJCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkgJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKQotCQkJCQkJCQkJJiYgYXR0cmlidXRlLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpID09IExpdGVyYWxzLlNUUklORy5nZXRJbnN0YW5jZUNsYXNzKCkpCi0JCQkJCQkJewotCQkJCQkJCQlPYmplY3QgdmFsdWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRBdHRyaWJ1dGUoY29udGVudCwgYWN0aXZpdHksIGF0dHJpYnV0ZSwgY29weUNvbmZpZyk7Ci0JCQkJCQkJCWFjdGl2aXR5Q29weS5nZXRQcmVzZW50YXRpb24oKS5lU2V0KGF0dHJpYnV0ZSwgdmFsdWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGNvcHkgcHJlc2VudGF0aW9uIG5hbWUKLQkJCQkJLy8KLQkJCQkJYWN0aXZpdHlDb3B5LnNldFByZXNlbnRhdGlvbk5hbWUoUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShhY3Rpdml0eSkpOwkJCQkJCi0JCQkJfQotCQkJCQotCQkJCS8vIGNvcHkgY29udHJpYnV0b3JzCQkJCQotCQkJCWlmIChjb3B5RXh0ZXJuYWxWYXJpYXRpb25zICYmIG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgKGNvcHlDb250cmlidXRvcnMgfHwgb3duZXIgIT0gQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5hY3Rpdml0eSkpIHsKLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpb3duZXI7CQkJCQkKLQkJCQkJTGlzdCBjb250cmlidXRvcnMgPSBnZXRDb250cmlidXRvcnMoYWN0aXZpdHkpOwotCQkJCQlpZiAoIWNvbnRyaWJ1dG9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJCWRvQ29weUNvbnRyaWJ1dG9ycyhjb250cmlidXRvcnMsYWN0aXZpdHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIGNsZWFyIHRoZSB2YXJpYWJpbGl0eSBkYXRhCi0JCQkJLy8KLQkJCQlpZiAoY29weSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5Q29weSA9ICgoQWN0aXZpdHkpIGNvcHkpOwotCQkJCQlhY3Rpdml0eUNvcHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChudWxsKTsKLQkJCQkJYWN0aXZpdHlDb3B5LnNldFZhcmlhYmlsaXR5VHlwZShudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihjb25maWdTZXR0ZXIgIT0gbnVsbCkgewotCQkJCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYoY29weSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0aXZpdHlDb3B5ID0gKChBY3Rpdml0eSkgY29weSk7CQkJCQkKLQotCQkJCS8vIGNsZWFyIHN1cHByZXNzaW9uIGRhdGEKLQkJCQkvLwotCQkJCUNvbnN0cmFpbnQgcnVsZSA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQoYWN0aXZpdHlDb3B5LCBDb25zdHJhaW50TWFuYWdlci5QUk9DRVNTX1NVUFBSRVNTSU9OLCBmYWxzZSk7Ci0JCQkJaWYocnVsZSAhPSBudWxsKSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUocnVsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJLyoqCi0JCSAqIENvcHkgY29udHJpYnV0b3JzCi0JCSAqIEBwYXJhbSBjb250cmlidXRvcnMKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRvQ29weUNvbnRyaWJ1dG9ycyhMaXN0IGNvbnRyaWJ1dG9ycywgQWN0aXZpdHkgb3duZXIgKSB7Ci0JCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJdHJ5IHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBjb25maWdTZXR0ZXIuZ2V0T2xkQ29uZmlndXJhdGlvbigpOwotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29weUNvbmZpZyA9IGNvbmZpZyA9PSBudWxsID8gKGN1cnJlbnRDb25maWcgIT0gbnVsbCA/IGN1cnJlbnRDb25maWcKLQkJCQkJCTogdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKQotCQkJCQkJOiBjb25maWc7Ci0JCQkJY29uZmlnU2V0dGVyLnNldChjb3B5Q29uZmlnKTsKLQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IGNvbmZpZ1NldHRlci5nZXRDb25maWd1cmF0b3IoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udHJpYnV0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJQWN0aXZpdHkgY29udHJpYnV0ZWRBY3Rpdml0eSA9IChBY3Rpdml0eSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlDb3B5SGVscGVyIGhlbHBlciA9IChDb3B5SGVscGVyKWNvcHlIZWxwZXI7Ci0JCQkJCUFjdGl2aXR5IGNvbnRyaWJ1dG9yQ29weSA9IChBY3Rpdml0eSkgaGVscGVyLmdldChjb250cmlidXRlZEFjdGl2aXR5KTsKLQkJCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKGNvbnRyaWJ1dGVkQWN0aXZpdHksIGhlbHBlciwgCi0JCQkJCQkJY29uZmlnLCB0YXJnZXRQcm9jZXNzLCBtb25pdG9yLCBmYWxzZSxhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCQkJY21kLmNvcHlDb250cmlidXRvcnMgPSBmYWxzZTsgLy8gZG9uJ3QgY29weSBjb250cmlidXRvcidzIGNvbnRyaWJ1dG9ycyBzaW5jZSB0aGV5IGFscmVhZHkgYXJlIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBjb250cmlidXRvcnMgbGlzdAotCQkJCQljbWQuZ3VpZExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuZ3VpZExpc3QpOwotCQkJCQljbWQuZ3VpZExpc3QuYWRkQWxsKFByb2Nlc3NVdGlsLmdldEd1aWRMaXN0KEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuYWN0aXZpdHksIG93bmVyKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQuZXhlY3V0ZSgpOwotCi0JCQkJCQljb250cmlidXRvckNvcHkgPSAoQWN0aXZpdHkpIGhlbHBlci5nZXQoY29udHJpYnV0ZWRBY3Rpdml0eSk7Ci0KLQkJCQkJCUFjdGl2aXR5IGFjdGl2aXR5Q29weSA9IChBY3Rpdml0eSkgY29weTsKLQotCQkJCQkJLy8gcmVtb3ZlIHRoZSBjb3BpZXMgb2YgYmFzZSBkaWFncmFtIGlmIHRoZSBhY3Rpdml0eSBhbHJlYWR5IGhhdmUgZGlhZ3JhbSBvZiB0aGUgc2FtZSB0eXBlCi0JCQkJCQkvLwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpbnQgdHlwZSA9IGRpYWdyYW1UeXBlc1tpXTsKLQkJCQkJCQlpZihkaWFncmFtTWdyLmdldERpYWdyYW0oYWN0aXZpdHksIHR5cGUpICE9IG51bGwpIHsKLQkJCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZGlhZ3JhbU1nci5nZXREaWFncmFtKGFjdGl2aXR5Q29weSwgdHlwZSk7Ci0JCQkJCQkJCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkaWFncmFtKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gbW92ZSBjb250ZW50IG9mIGJhc2UgcGFja2FnZSBvdmVyIHRvIHRoZSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCQkJCS8vCi0JCQkJCQltb3ZlQ29udGVudChjbWQucGtnQ29weSwgYWN0aXZpdHlDb3B5KTsJCi0KLQkJCQkJCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+IGl0ZXIgPSBjb250cmlidXRvckNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZihjb25maWd1cmF0b3IgPT0gbnVsbCB8fCBjb25maWd1cmF0b3IuYWNjZXB0KGUpKXsKLQkJCQkJCQkJYnJlYWtkb3duRWxlbWVudHMuYWRkKGUpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWFjdGl2aXR5Q29weS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChicmVha2Rvd25FbGVtZW50cyk7Ci0JCQkJCQljb250cmlidXRvckNvcHkuc2V0U3VwZXJBY3Rpdml0aWVzKG51bGwpOwotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShjb250cmlidXRvckNvcHkpOwotCi0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfWZpbmFsbHl7Ci0JCQkJaWYgKGNvbmZpZ1NldHRlciAhPSBudWxsICkgewotCQkJCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQcm9jZXNzUGFja2FnZSBwa2dDb3B5OwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcm90ZWN0ZWQgSURpYWdyYW1NYW5hZ2VyIGRpYWdyYW1NZ3I7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCXByb3RlY3RlZCBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgTGlua2VkTGlzdDxTdHJpbmc+IGd1aWRMaXN0OwotCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyOwotCQotCS8vdXNlZCB0byByZXRyaWV2ZSByZXBsYWNlcnMgYW5kIGNvbnRyaWJ1dG9ycwotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCQotCXByaXZhdGUgYm9vbGVhbiBjb3B5RXh0ZXJuYWxWYXJpYXRpb25zID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY29weUNvbnRyaWJ1dG9ycyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgQ29weUhlbHBlciBjb3B5SGVscGVyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFByb2Nlc3MgdGFyZ2V0UHJvY2VzcywKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiBpbml0R3VpZExpc3QsSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKSB7Ci0JCXN1cGVyKG51bGwsIGFjdGl2aXR5LmVDb250YWluZXIoKSwgY29weUhlbHBlcik7Ci0JCUFzc2VydC5pc1RydWUoYWN0aXZpdHkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UsICJBY3Rpdml0eSdzIGNvbnRhaW5lciBtdXN0IGJlIGEgUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCWRvbWFpbiA9IG5ldyBFZGl0aW5nRG9tYWluKCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnRhcmdldFByb2Nlc3MgPSB0YXJnZXRQcm9jZXNzOwotCQlkaWFncmFtTWdyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREaWFncmFtTWFuYWdlcigpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGRpYWdyYW1NZ3IsICJDb3VsZCBub3QgbG9hZCBkaWFncmFtIG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQlpZihpbml0R3VpZExpc3QpIHsKLQkJCWd1aWRMaXN0ID0gUHJvY2Vzc1V0aWwuZ2V0R3VpZExpc3QobnVsbCwgdGhpcy5hY3Rpdml0eSk7Ci0JCX0KLQkJdGhpcy5hY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yID0gYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLQl9Ci0JCi0JcHVibGljIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBDb3B5SGVscGVyIGNvcHlIZWxwZXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvY2VzcyB0YXJnZXRQcm9jZXNzLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpIHsKLQkJdGhpcyhhY3Rpdml0eSwgY29weUhlbHBlciwgY29uZmlnLCB0YXJnZXRQcm9jZXNzLCBtb25pdG9yLCB0cnVlLGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpOwkJCi0JfQotCQotCXB1YmxpYyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZChPYmplY3QgYWN0aXZpdHlPcldyYXBwZXIsIENvcHlIZWxwZXIgY29weUhlbHBlciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlQcm9jZXNzIHRhcmdldFByb2Nlc3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKSB7Ci0JCXRoaXMoKEFjdGl2aXR5KVRuZ1V0aWwudW53cmFwKGFjdGl2aXR5T3JXcmFwcGVyKSwgY29weUhlbHBlciwgY29uZmlnLCB0YXJnZXRQcm9jZXNzLCBtb25pdG9yLCAKLQkJCQlhY3Rpdml0eU9yV3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5LGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpOwotCQlpZihhY3Rpdml0eU9yV3JhcHBlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBhY3Rpdml0eU9yV3JhcHBlcjsKLQkJCWd1aWRMaXN0ID0gUHJvY2Vzc1V0aWwuZ2V0R3VpZExpc3Qod3JhcHBlcik7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyB2b2lkIHNldENvcHlFeHRlcm5hbFZhcmlhdGlvbnMoYm9vbGVhbiBjb3B5RXh0ZXJuYWxWYXJpYXRpb25zKSB7Ci0JCXRoaXMuY29weUV4dGVybmFsVmFyaWF0aW9ucyA9IGNvcHlFeHRlcm5hbFZhcmlhdGlvbnM7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuY29weWluZ0FjdGl2aXRpZXNfbXNnLCBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGFjdGl2aXR5KSkpOwotCQlzdXBlci5leGVjdXRlKCk7Ci0JCUNvbGxlY3Rpb248Pz4gcmVzdWx0ID0gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQlwa2dDb3B5ID0gKFByb2Nlc3NQYWNrYWdlKSByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlmaXhQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCQlyZXBsYWNlVGV4dFJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBmaXggdGhlIHByb2Nlc3MgY29tcG9uZW50IHRvIG1ha2UgaXQgYSBwcm9jZXNzIHBhY2thZ2UuCi0JICogVGhpcyBtZXRob2QgbWlnaHQgYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzIHRvIGFjaGl2ZSBkaWZmZXJlbmNlIHJlc3VsdC4KLQkgKiBGb3IgZXhhbXBsZSwgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZml4UHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJaWYocGtnQ29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCS8vIHJlcGxhY2UgdGhlIFByb2Nlc3NDb21wb25lbnQgd2l0aCBhIGVxdWl2YWxlbnQgUHJvY2Vzc1BhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QocGtnQ29weS5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkpOwotCQkJZmVhdHVyZXMucmV0YWluQWxsKHBrZy5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBwa2dDb3B5LmVHZXQoZmVhdHVyZSk7Ci0JCQkJcGtnLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KXBrZ0NvcHkpLmdldFByb2Nlc3MoKTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoMCwgcHJvYyk7Ci0JCQl9Ci0JCQlwa2dDb3B5ID0gcGtnOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGV4dHVhbCBkZXNjcmlwdGlvbnMgaW4gdGhlIGNvcGllZCBlbGVtZW50cyBjb250YWluIHJlZmVyZW5jZXMgKFVSTHMpIHRvIG90aGVyIGVsZW1lbnRzIAotCSAqIHdpdGhpbiB0aGUgc2FtZSBjb3BpZWQgcHJvY2VzcyB0aGVuIHJlcGxhY2UgdGhlc2UgcmVmZXJlbmNlcyB3aXRoIHJlZmVyZW5jZXMgdGhhdCBwb2ludCB0byAKLQkgKiB0aGUgbmV3IGVsZW1lbnRzIGluIHRoZSBjb3BpZWQgc3RydWN0dXJlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlVGV4dFJlZmVyZW5jZXMoKSB7Ci0JCUlUZXh0UmVmZXJlbmNlUmVwbGFjZXIgdHh0UmVmUmVwbGFjZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldFRleHRSZWZlcmVuY2VSZXBsYWNlcigpOwotCQlpZih0eHRSZWZSZXBsYWNlciA9PSBudWxsKSByZXR1cm47Ci0KLQkJTWFwIG9sZFRvTmV3T2JqZWN0TWFwID0gKChDb3B5SGVscGVyKSBjb3B5SGVscGVyKS5nZXRPYmplY3RUb0NvcHlNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnQ29weS5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgYXR0cmlidXRlcy5oYXNOZXh0KCk7ICkKLQkJCXsKLQkJCQlFQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCQlpZiAoYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSgpICYmICFhdHRyaWJ1dGUuaXNEZXJpdmVkKCkgJiYgKGF0dHJpYnV0ZS5pc01hbnkoKSB8fCBlbGVtZW50LmVJc1NldChhdHRyaWJ1dGUpKQotCQkJCQkJJiYgYXR0cmlidXRlLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpID09IExpdGVyYWxzLlNUUklORy5nZXRJbnN0YW5jZUNsYXNzKCkpCi0JCQkJewotCQkJCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGVsZW1lbnQuZUdldChhdHRyaWJ1dGUpOwotCQkJCQlpZih0ZXh0ICE9IG51bGwpIHsKLQkJCQkJCXRleHQgPSB0eHRSZWZSZXBsYWNlci5yZXBsYWNlKHRleHQsIHRhcmdldFByb2Nlc3MsIG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJCQkJCWVsZW1lbnQuZVNldChhdHRyaWJ1dGUsIHRleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRSZXN1bHQoKSB7Ci0JCWlmKHBrZ0NvcHkgIT0gbnVsbCkgewotCQkJQWN0aXZpdHkgYWN0ID0gUHJvY2Vzc1V0aWwuZmluZEFjdGl2aXR5KHBrZ0NvcHkpOwotCQkJaWYoYWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKioKLQkgKiBNb3ZlcyBjb250ZW50IG9mIHNvdXJjZSBvYmplY3QgPGNvZGU+c3JjPC9jb2RlPiBvdmVyIHRvIHRoZSB0YXJnZXQgb2JqZWMgPGNvZGU+dGFyZ2V0PC9jb2RlPgotCSAqIEBwYXJhbSBzcmMKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb3ZlQ29udGVudChQcm9jZXNzUGFja2FnZSBzcmMsIEFjdGl2aXR5IGFjdCkgewotCQlQcm9jZXNzUGFja2FnZSB0YXJnZXQgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdC5lQ29udGFpbmVyKCk7Ci0JCS8vIG1vdmUgY29udGVudCBvZiBiYXNlIHBhY2thZ2Ugb3ZlciB0byB0aGUgYWN0aXZpdHkncyBwYWNrYWdlCQkJCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChzcmMuZUNvbnRlbnRzKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBlLmVDb250YWluaW5nRmVhdHVyZSgpOwkJCQkJCQotCQkJaWYoZi5pc01hbnkoKSkgewotCQkJCSgoTGlzdCl0YXJnZXQuZUdldChmKSkuYWRkKGUpOwotCQkJfQotCQl9Ci0JCWlmKHNyYyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgYmFzZUNvcHkgPSAoKFByb2Nlc3NDb21wb25lbnQpc3JjKS5nZXRQcm9jZXNzKCk7Ci0JCQl0YXJnZXQuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGJhc2VDb3B5KTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0VG9wRWxlbWVudChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlCcmVha2Rvd25FbGVtZW50IHRvcCA9IGU7Ci0JCWZvcihCcmVha2Rvd25FbGVtZW50IG8gPSBlLmdldFN1cGVyQWN0aXZpdGllcygpOyBvICE9IG51bGw7IG8gPSBvLmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQl0b3AgPSBvOwotCQl9Ci0JCXJldHVybiB0b3A7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvcHlTdXBwcmVzc2lvblN0YXRlcygpIHsKLQkJQ29sbGVjdGlvbjw/PiByZXN1bHQgPSBnZXRSZXN1bHQoKTsKLQkJaWYocmVzdWx0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyB3cmFwcGVyUGF0aCA9IHdyYXBwZXIgIT0gbnVsbCA/IFByb2Nlc3NVdGlsLnRvR3VpZFBhdGgoZ3VpZExpc3QpIDogbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXNbaV07Ci0JCQlib29sZWFuIGlzV0JTID0gYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbnVsbDsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IG51bGw7Ci0JCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJCQljdXJyZW50Q29uZmlnID0gY29uZmlndXJhdG9yLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5maW5kQWN0aXZpdHkoKFByb2Nlc3NQYWNrYWdlKSBvd25lcik7Ci0JCQkJUHJvY2Vzc1V0aWwuaW5pdGlhbGl6ZUl0ZW1Qcm92aWRlclBhdGgoYWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQlEZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8Pz4gaXRlciA9IG5ldyBEZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PihhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0JCQkJaW50IGRlcHRoTGV2ZWwgPSAtMTsKLQkJCQlmaW5kX2RlZXBfY29waWVkX2FjdGl2aXR5OgotCQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0KLQkJCQkJCS8vIHNldCBkZXB0aCBsZXZlbCBpZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgZGVlcC1jb3BpZWQgYWN0aXZpdHkKLQkJCQkJCS8vCi0JCQkJCQlpZih3cmFwcGVyID09IG51bGwpIHsKLQkJCQkJCQlpZihjaGlsZCA9PSBhY3Rpdml0eSkgewotCQkJCQkJCQlkZXB0aExldmVsID0gaXRlci5nZXREZXB0aExldmVsKCk7Ci0JCQkJCQkJCWJyZWFrIGZpbmRfZGVlcF9jb3BpZWRfYWN0aXZpdHk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCQlTdHJpbmcgcGF0aCA9IFN1cHByZXNzaW9uLmdldFBhdGhXaXRob3V0Vmlld1R5cGUoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZCkudG9TdHJpbmcoKTsKLQkJCQkJCQkJaWYod3JhcHBlclBhdGguZXF1YWxzKHBhdGgpKSB7Ci0JCQkJCQkJCQlkZXB0aExldmVsID0gaXRlci5nZXREZXB0aExldmVsKCk7Ci0JCQkJCQkJCQlicmVhayBmaW5kX2RlZXBfY29waWVkX2FjdGl2aXR5OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQkJCQkJCi0JCQkJCX0KLQkJCQkKLQkJCQkvLyBjb3B5IHN1cHByZXNzaW9uIHN0YXRlIG9mIGFsbCBzdXBwcmVzc2VkIGVsZW1lbnRzIHVuZGVyIGRlZXAtY29waWVkIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlDb3B5SGVscGVyIGhlbHBlciA9IChDb3B5SGVscGVyKWNvcHlIZWxwZXI7Ci0JCQkJTWFwPD8sID8+IG9yaWdpbmFsVG9Db3B5TWFwID0gaGVscGVyLmdldE9iamVjdFRvQ29weU1hcCgpOwotCQkJCU1hcDxPYmplY3QsIE9iamVjdD4gZWxlbWVudE9yV3JhcHBlclRvQ29weU1hcCA9IG51bGw7Ci0JCQkJaWYoaXNXQlMpIHsKLQkJCQkJZWxlbWVudE9yV3JhcHBlclRvQ29weU1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCQkJCQlBY3Rpdml0eSBkZWVwQ29weSA9IChBY3Rpdml0eSkgcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQllbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwLnB1dCh3cmFwcGVyICE9IG51bGwgPyB3cmFwcGVyIDogYWN0aXZpdHksIGRlZXBDb3B5KTsKLQkJCQl9Ci0JCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmKGl0ZXIuZ2V0RGVwdGhMZXZlbCgpID4gZGVwdGhMZXZlbCkgewotCQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJCQlpZihlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCWlmKCFpc1dCUyAmJiBlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJLy8gc2tpcCBjb3B5aW5nIHN1cHByZXNzaW9uIHN0YXRlIGFuZCBvcmRlcmluZwotCQkJCQkJCQkvLyBicmVha2Rvd24gZWxlbWVudHMgZm9yIGFjdGl2aXR5IGluIG90aGVyIHZpZXcKLQkJCQkJCQkJLy8gdGhhbiBXQlMKLQkJCQkJCQkJLy8KLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotLy8JCQkJCQkJQnJlYWtkb3duRWxlbWVudCBvcmlnaW5hbCA9IChCcmVha2Rvd25FbGVtZW50KSBlOwotLy8JCQkJCQkJQnJlYWtkb3duRWxlbWVudCBjb3B5ID0gKEJyZWFrZG93bkVsZW1lbnQpIG9yaWdpbmFsVG9Db3B5TWFwLmdldChvcmlnaW5hbCk7Ci0vLwkJCQkJCQkKLS8vCQkJCQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLS8vCQkJCQkJCQlTdHJpbmcgY29weU5hbWUgPSAoY29weSAhPSBudWxsID8gY29weS5nZXROYW1lKCkgOiBudWxsKTsKLS8vCQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IHRvcCA9IGdldFRvcEVsZW1lbnQoY29weSk7Ci0vLwkJCQkJCQkJaWYoY29weSA9PSBudWxsIHx8ICFvcmlnaW5hbC5nZXROYW1lKCkuZXF1YWxzKGNvcHlOYW1lKSB8fCB0b3AgIT0gZGVlcENvcHkpIHsKLS8vCQkJCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJvcmlnaW5hbDogJyIgKyBvcmlnaW5hbC5nZXROYW1lKCkgKyAiJywgY29weTogJyIgKyBjb3B5TmFtZSArICInLCBjb3B5J3MgdG9wIGFjdGl2aXR5OiAiICsgdG9wKTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudCBjb3B5ID0gbnVsbDsKLQkJCQkJCQlib29sZWFuIGlzU3VwcHJlc3NlZCA9IHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChjaGlsZCk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gZmluZCBjb3B5IHRvIHN1cHByZXNzIG9yLCBpZiBlbGVtZW50IGlzIGFuIGFjdGl2aXR5LCB0byByZW9yZGVyIGl0cyBicmVha2Rvd24gZWxlbWVudHMKLQkJCQkJCQkvLwotCQkJCQkJCWlmKGlzU3VwcHJlc3NlZCB8fCBpc1dCUykgewotCQkJCQkJCQlpZihjaGlsZCA9PSBlKSB7CQotCQkJCQkJCQkJY29weSA9IChCcmVha2Rvd25FbGVtZW50KSBvcmlnaW5hbFRvQ29weU1hcC5nZXQoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZihjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjaGlsZFdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJCQkJCQkJaWYoY2hpbGRXcmFwcGVyLmlzSW5oZXJpdGVkKCkpIHsKLQkJCQkJCQkJCQlTdHJpbmcgZ3VpZFBhdGggPSBTdXBwcmVzc2lvbi5nZXRQYXRoV2l0aG91dFZpZXdUeXBlKGNoaWxkV3JhcHBlcikudG9TdHJpbmcoKTsKLQkJCQkJCQkJCQljb3B5ID0gaGVscGVyLmdldFdyYXBwZXJDb3B5KGd1aWRQYXRoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZihjb3B5ICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmKGlzU3VwcHJlc3NlZCkgewotCQkJCQkJCQkJCWNvcHkuc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYoaXNXQlMpIHsKLQkJCQkJCQkJCQllbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwLnB1dChjaGlsZCwgY29weSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyByZW9yZGVyIGJyZWFrZG93biBlbGVtZW50cyBvZiBhY3Rpdml0aWVzCi0JCQkJLy8KLQkJCQlpZihpc1dCUykgewotCQkJCQlmb3IgKE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4gZW50cnkgOiBlbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwLmVudHJ5U2V0KCkpIHsKLQkJCQkJCU9iamVjdCBvID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQlPYmplY3QgY29weSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCQlpZihjb3B5IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJCUNvbGxlY3Rpb248Pz4gY2hpbGRyZW4gPSBpcC5nZXRDaGlsZHJlbihvKTsKLQkJCQkJCQlFTGlzdDw/PiBsaXN0ID0gIChFTGlzdDw/PikgKChBY3Rpdml0eSkgY29weSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJCQlMaXN0PD8+IGNoaWxkcmVuTGlzdCA9IGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdDw/PiA/IChMaXN0PD8+KSBjaGlsZHJlbiA6IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihjaGlsZHJlbik7Ci0JCQkJCQkJaW50IHNpemUgPSBjaGlsZHJlbkxpc3Quc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJCQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuTGlzdC5nZXQoaik7Ci0JCQkJCQkJCU9iamVjdCBjaGlsZENvcHkgPSBlbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwLmdldChjaGlsZCk7Ci0JCQkJCQkJCWlmKGNoaWxkQ29weSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZihqIDwgc2l6ZSAtIDEpIHsKLQkJCQkJCQkJCQlPYmplY3QgbmV4dENoaWxkID0gY2hpbGRyZW5MaXN0LmdldChqICsgMSk7Ci0JCQkJCQkJCQkJT2JqZWN0IG5leHRDaGlsZENvcHkgPSBlbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwLmdldChuZXh0Q2hpbGQpOwkKLQkJCQkJCQkJCQlpZihuZXh0Q2hpbGRDb3B5ICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJaW50IHN1Y2NJZCA9IGxpc3QuaW5kZXhPZihuZXh0Q2hpbGRDb3B5KTsKLQkJCQkJCQkJCQkJaWYoc3VjY0lkICE9IC0xKSB7Ci0JCQkJCQkJCQkJCQlpbnQgaWQgPSBsaXN0LmluZGV4T2YoY2hpbGRDb3B5KTsKLQkJCQkJCQkJCQkJCWlmKGlkICE9IHN1Y2NJZCAtIDEpIHsKLQkJCQkJCQkJCQkJCQlpZihpZCA8IHN1Y2NJZCkgewotCQkJCQkJCQkJCQkJCQlsaXN0Lm1vdmUoc3VjY0lkIC0gMSwgaWQpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCQkJbGlzdC5tb3ZlKGlkLCBzdWNjSWQpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQkJCQkJCQkJCQkKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZWxzZSBpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRWxlbWVudCBkb2VzIG5vdCBoYXZlIGNvcHk6ICIgKyBuZXh0Q2hpbGQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFbGVtZW50IGRvZXMgbm90IGhhdmUgY29weTogIiArIGNoaWxkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY3VycmVudENvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBDb3B5SGVscGVyIGdldENvcHlIZWxwZXIoKSB7Ci0JCXJldHVybiAoQ29weUhlbHBlcikgY29weUhlbHBlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWMzZDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BY3Rpdml0eUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogRHJvcCBjb21tYW5kIGZvciBhY3Rpdml0eSB0aGF0IHN1cHBvcnRzIGV4dGVuZCwgY29weSwgYW5kIGRlZXAgY29weS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RHJvcENvbW1hbmQgZXh0ZW5kcyBCU0Ryb3BDb21tYW5kIHsKLQotCXByaXZhdGUgT2JqZWN0IHZpZXdlcjsKLQotCXByaXZhdGUgTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gb2xkUGF0dGVybnM7Ci0KLQlwcml2YXRlIExpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IHBhdHRlcm5zOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgdGFyZ2V0UHJvY2VzczsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlbGl2ZXJ5UHJvY2VzczsKLQotCXByaXZhdGUgaW50IHR5cGU7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEFjdGl2aXR5PiBhcHBsaWVkQWN0aXZpdGllczsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBBY3Rpdml0eUhhbmRsZXIgYWN0aXZpdHlIYW5kbGVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZWQ7Ci0KLQlwcm90ZWN0ZWQgSGFzaFNldDw/PiBhZGRlZE9iamVjdHM7Ci0JCi0JcHJvdGVjdGVkIElDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLQotCXB1YmxpYyBBY3Rpdml0eURyb3BDb21tYW5kKEFjdGl2aXR5IHRhcmdldCwgTGlzdCBhY3Rpdml0aWVzLCBPYmplY3Qgdmlld2VyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIGFjdGl2aXRpZXMpOwotCQlzZXRMYWJlbChMaWJyYXJ5RWRpdFJlc291cmNlcy5BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsKTsgCi0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCXRhcmdldFByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFyZ2V0KTsKLQkJCi0JCWlzRGVsaXZlcnlQcm9jZXNzID0gdGFyZ2V0UHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzczsKLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlvbGRQYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKChEZWxpdmVyeVByb2Nlc3MpIHRhcmdldFByb2Nlc3MpCi0JCQkJCS5nZXRJbmNsdWRlc1BhdHRlcm5zKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBBY3Rpdml0eURyb3BDb21tYW5kKEFjdGl2aXR5IHRhcmdldCwgTGlzdCBhY3Rpdml0aWVzLCBPYmplY3Qgdmlld2VyLCAKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LElDb25maWd1cmF0b3IgZGVlcENvcHlDb25maWd1cmF0b3IpewotCQl0aGlzKHRhcmdldCwgYWN0aXZpdGllcywgdmlld2VyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciA9IGRlZXBDb3B5Q29uZmlndXJhdG9yOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRHJvcEVsZW1lbnRzKCkgewotCQkvLyByZW1vdmUgYW55IGRyb3AgZWxlbWVudCB0aGF0IGlzIHN1cHByZXNzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0JCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJaWYoc3VwcC5pc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5wcmVwYXJlRHJvcEVsZW1lbnRzKCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQlpZih0eXBlID09IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKSB7Ci0JCQlydW5Bc0pvYiA9IHRydWU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDb3B5KCkgewotCQlmb3IgKE9iamVjdCBlIDogZHJvcEVsZW1lbnRzKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNoZWNrQ2lyY3VsYXIoKEFjdGl2aXR5KSBlKTsKLQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tFeHRlbmQoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkKLS8vCQkJaWYgKChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoKEFjdGl2aXR5KSBlbGVtZW50KSkpewotLy8JCQkJY2FuRXh0ZW5kID0gZmFsc2U7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQkKLS8vCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotLy8JCQlpZiAodGFyZ2V0UHJvY2Vzcy5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gcHJvYykgewotLy8JCQkJY2FuRXh0ZW5kID0gZmFsc2U7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQkKLS8vCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiAmJiBwcm9jICE9IHRhcmdldFByb2Nlc3MpIHsKLS8vCQkJCWNhbkV4dGVuZCA9IHRydWU7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCQkJCi0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0ZXIubmV4dCgpOwotCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCQlpZihzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzICYmIHNyY1Byb2MgIT0gdGFyZ2V0UHJvY2VzcykgewotCQkJCS8vIGNhbm5vdCBleHRlbmQgYSBkaWZmZXJlbnQgZGVsaXZlcnkgcHJvY2VzcyBvciBhbnkgb2YgaXRzIGFjdGl2aXRpZXMKLQkJCQkvLwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNhbm5vdF9jb3B5X29yX2V4dGVuZF9kZWxpdmVyeV9wcm9jZXNzLAotCQkJCQkJbnVsbCk7Ci0JCQl9Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGNoZWNrQ2lyY3VsYXIoYWN0KTsKLQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIGNoZWNrQ2lyY3VsYXIoQWN0aXZpdHkgYWN0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0OwotCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2tBY3QpIHsKLQkJCXJlc3VsdCA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkJCQkoYWN0aXZpdHksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWN0KSwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsIGFjdGl2aXR5KS5pc09LKCk7Ci0JCX0KLQkJaWYoIXJlc3VsdCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZywKLQkJCQkJbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlJQWN0aW9uVHlwZVByb3ZpZGVyIGFjdGlvblR5cGVQcm92aWRlciA9IChJQWN0aW9uVHlwZVByb3ZpZGVyKSB2aWV3ZXI7Ci0JCWlmICggdmlld2VyICE9IG51bGwpIHsKLQkJCXZpZXdlciA9IG51bGw7Ci0JCQlib29sZWFuIGNhbkNvcHkgPSBjaGVja0NvcHkoKS5pc09LKCk7Ci0JCQlib29sZWFuIGNhbkV4dGVuZCA9IGNoZWNrRXh0ZW5kKCkuaXNPSygpOwotCQkJaW50W10gY2hvaWNlcyA9IG5ldyBpbnRbMSArIChjYW5Db3B5ID8gMSA6IDApICsgKGNhbkV4dGVuZCA/IDEgOiAwKV07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlpZihjYW5Db3B5KSB7Ci0JCQkJY2hvaWNlc1tpKytdID0gSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOwotCQkJfQotCQkJaWYoY2FuRXh0ZW5kKSB7Ci0JCQkJY2hvaWNlc1tpKytdID0gSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQ7Ci0JCQl9Ci0JCQljaG9pY2VzW2ldID0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFk7Ci0JCQkKLQkJCS8vIGRlbGVnYXRlIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjb21tYW5kCi0JCQkvLwotCQkJYWN0aW9uVHlwZVByb3ZpZGVyLmV4ZWN1dGUodGhpcywgY2hvaWNlcyk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCWFjdGl2aXR5SGFuZGxlciA9IG5ldyBBY3Rpdml0eUhhbmRsZXIoKTsKLQkJdHJ5IHsKLQkJCWlmICh0eXBlID09IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKSB7Ci0JCQkJZG9EZWVwQ29weSgpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5leGVjdXRlKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlhY3Rpdml0eUhhbmRsZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFjdGl2aXR5RHJvcENvbW1hbmQuZXhlY3V0ZSgpOiBkb25lIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRGVlcENvcHkoKSB7Ci0JCWlmKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY29uZmlybURlZXBDb3B5KGRyb3BFbGVtZW50cykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlZXBDb3B5Q29uZmlnID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnM7Ci0JCXRyeSB7Ci0JCQljb3B5RXh0ZXJuYWxWYXJpYXRpb25zID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNvcHlFeHRlcm5hbFZhcmlhdGlvbnNBbGxvd2VkKHRhcmdldFByb2Nlc3MsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47CQkJCi0JCX0KLQkJYWN0aXZpdHlIYW5kbGVyLnNldENvcHlFeHRlcm5hbFZhcmlhdGlvbnMoY29weUV4dGVybmFsVmFyaWF0aW9ucyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXREZWVwQ29weUNvbmZpZyhkZWVwQ29weUNvbmZpZyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXRUYXJnZXRQcm9jZXNzKHRhcmdldFByb2Nlc3MpOwotCQkKLQkJLy8gU2V0IGEgY29uZmlndXJhdG9yIHRvIHJlc29sdmUgYW5kIGRlZXAgY29weSBjb250cmlidXRvcnMgYW5kIHJlcGxhY2VycwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0QWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcihhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJYWN0aXZpdHlIYW5kbGVyLnNldE1vbml0b3IobW9uaXRvcik7Ci0JCQkJcHJlRXhlY3V0ZWQgPSBwcmVFeGVjdXRlKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZ2V0TGFiZWwoKSk7CQkJCi0JCWlmIChwcmVFeGVjdXRlZCkgewotCQkJcmVkbygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNwcmVFeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlpZiAoIXN1cGVyLnByZUV4ZWN1dGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBwcm9jZXNzIHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIGFuZCBkZWVwLWNvcHkgdGhlIHZhbGlkIG9uZXMKLQkJLy8KLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+KCk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCS8vICYmIGVsZW1lbnQgIT0gdGFyZ2V0Ci0JCQkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJCi0vLwkJCQlpZih0eXBlID09IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKSB7Ci0vLwkJCQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGFjdCk7Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIHsKLS8vCQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLS8vCQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuICYmIHByb2MgIT0gdGFyZ2V0UHJvY2VzcykgewotLy8JCQkJCQlpZiAodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORCkgewotLy8JCQkJCQkJYWN0aXZpdHlIYW5kbGVyLmV4dGVuZChhY3QpOwotLy8JCQkJCQkJaWYgKHBhdHRlcm5zICE9IG51bGwpCi0vLwkJCQkJCQkJcGF0dGVybnMuYWRkKHByb2MpOwotLy8JCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJYWN0aXZpdHlIYW5kbGVyLmNvcHkoYWN0KTsKLS8vCQkJCQkJfQotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCWFjdGl2aXR5SGFuZGxlci5jb3B5KGFjdCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCQotCQkJCXN3aXRjaCh0eXBlKSB7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWToKLQkJCQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGVsZW1lbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EOgotCQkJCQlhY3Rpdml0eUhhbmRsZXIuZXh0ZW5kKGFjdCk7Ci0JCQkJCWlmIChwYXR0ZXJucyAhPSBudWxsKSB7Ci0JCQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCQkJCWlmKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCXBhdHRlcm5zLmFkZCgoQ2FwYWJpbGl0eVBhdHRlcm4pIHByb2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOgotCQkJCQlhY3Rpdml0eUhhbmRsZXIuY29weShhY3QpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlhcHBsaWVkQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KGFjdGl2aXR5SGFuZGxlci5nZXRBY3Rpdml0aWVzKCkpOwotCi0JCXJldHVybiAhYXBwbGllZEFjdGl2aXRpZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCUl0ZXJhdG9yPEFjdGl2aXR5PiBpdG9yID0gYXBwbGllZEFjdGl2aXRpZXMuaXRlcmF0b3IoKTsKLQotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJd2hpbGUgKGl0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0b3IubmV4dCgpOwotCi0JCQlpZiAoYWN0LmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJCSYmIGFjdC5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChNZXRob2RQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQotCQkJaWYgKHBhdHRlcm5zICE9IG51bGwgJiYgIXBhdHRlcm5zLmlzRW1wdHkoKSkgewotCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgdGFyZ2V0UHJvY2VzczsKLQkJCQlmb3IgKENhcGFiaWxpdHlQYXR0ZXJuIHBhdHRlcm4gOiBwYXR0ZXJucykgewotCQkJCQlpZiAoIXByb2MuZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNvbnRhaW5zKHBhdHRlcm4pKSB7Ci0JCQkJCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGQocGF0dGVybik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbG9uZyB0aW1lID0gMDsKLQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKGFwcGxpZWRBY3Rpdml0aWVzKTsKLQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBY3Rpdml0eURyb3BDb21tYW5kLmRvRXhlY3V0ZSgpOiBuZXcgYWN0aXZpdGllcyBhZGRlZC4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKCFhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcGllcygpLmlzRW1wdHkoKSkgewotCQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCXBvc3REZWVwQ29weSgpOwotCQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWN0aXZpdHlEcm9wQ29tbWFuZC5kb0V4ZWN1dGUoKTogcG9zdERlZXBDb3B5KCkuICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIEhhY2sgdG8gcmVmcmVzaCBwcm92aWRlcnMgZm9yY2VmdWxseSBiZWZvcmUgY2FsbGluZyBmaXhEdXBsaWNhdGVOYW1lcwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlhZGFwdGVyLmdldENoaWxkcmVuKGFjdGl2aXR5KTsKLQkJCi0JCS8vIGZpeCBkdXBsaWNhdGUgbmFtZXMgb2YgbmV3bHkgYWRkZWQgZWxlbWVudHMKLQkJZml4RHVwbGljYXRlTmFtZXMoKTsKLQkJCi0JCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9zdERlZXBDb3B5KCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRhdGlvbiBvZiB0aGUgdGFyZ2V0IHByb2Nlc3MgYW55IG1pc3NpbmcgY29udGVudAotCQkJCS8vCi0JCQkJaWYoYWRkZWRPYmplY3RzID09IG51bGwpIHsKLQkJCQkJYWRkZWRPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFkZGVkT2JqZWN0cy5jbGVhcigpOwotCQkJCX0KLQkJCQlib29sZWFuIGRlZmF1bHRDb25maWdDaGFuZ2VkID0gZmFsc2U7Ci0vLwkJCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvbiBjaGFuZ2UgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRhcmdldCBwcm9jZXNzIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBVSSByZWZyZXNoZXMKLS8vCQkJCS8vCi0vLwkJCQlib29sZWFuIG9sZE5vdGlmeSA9IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lRGVsaXZlcigpOwotLy8JCQkJdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVTZXREZWxpdmVyKGZhbHNlKTsKLS8vCQkJCXRyeSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoaXRlci5uZXh0KCkpIHsKLQotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlyZXR1cm4gKChBY3Rpdml0eSlvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQotCQkJCQl9OwkJCQkJCi0JCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZSk7Ci0JCQkJCQkJaW50IHNpemUgPSBhZGRlZE9iamVjdHMuc2l6ZSgpOwotCQkJCQkJCVByb2Nlc3NVdGlsLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24odGFyZ2V0UHJvY2VzcywgbWUsIGFkZGVkT2JqZWN0cyk7Ci0JCQkJCQkJaWYoIWRlZmF1bHRDb25maWdDaGFuZ2VkICYmIChzaXplICE9IGFkZGVkT2JqZWN0cy5zaXplKCkpKSB7Ci0JCQkJCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCWRlZmF1bHRDb25maWdDaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQlmaW5hbGx5IHsKLS8vCQkJCQl0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLS8vCQkJCX0KLQkJCX0KLQkJCQotCQl9OwotCQkKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZ2V0TGFiZWwoKSk7Ci0JCQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgZGVlcCBjb3BpZXMgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhcmdldCBwcm9jZXNzCQkJCQotCQkvLwotCQlmaW5hbCBTeW5jaHJvbml6ZUNvbW1hbmQgc3luY2hDbWQgPSBuZXcgU3luY2hyb25pemVDb21tYW5kKGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29waWVzKCksIHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSwgbnVsbCwgZmFsc2UpOwotCQl0cnkgewotCQkJcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXN5bmNoQ21kLmluaXRpbGl6ZSgpOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmUpOwotCQkJaWYoc3luY2hDbWQuaXNJbnRpYWxpemVkKCkpIHsKLQkJCQlzeW5jaENtZC5leGVjdXRlKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzeW5jaENtZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24odGFyZ2V0UHJvY2Vzcyk7Ci0JfQotCi0JLyoqCi0JICogRml4ZXMgZHVwbGljYXRlIG5hbWVzIG9mIG5ld2x5IGFkZGVkIGVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeER1cGxpY2F0ZU5hbWVzKCkgewotCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IGdldFN1cHByZXNzaW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFwcGxpZWRBY3Rpdml0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBpdGVyLm5leHQoKTsKLQkJCWZpeER1cGxpY2F0ZU5hbWVzKGFjdCwgc3VwcHJlc3Npb24pOwotCQkJZml4VGVhbVByb2ZpbGVEdXBsaWNhdGVOYW1lcyhhY3QsIHN1cHByZXNzaW9uKTsKLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZml4RHVwbGljYXRlTmFtZXMoQnJlYWtkb3duRWxlbWVudCBlLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlmaXhEdXBsaWNhdGVOYW1lcyhlLCBzdXBwcmVzc2lvbiwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpeER1cGxpY2F0ZU5hbWVzKEJyZWFrZG93bkVsZW1lbnQgZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IGUuZ2V0TmFtZSgpOwotCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgYmFzZU5hbWUsIHN1cHByZXNzaW9uKSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMTsgdHJ1ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBiYXNlTmFtZSArICdfJyArIGk7Ci0JCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoYWRhcHRlckZhY3RvcnksIGUsIG5hbWUsIHN1cHByZXNzaW9uKSA9PSBudWxsKSB7Ci0JCQkJCWUuc2V0TmFtZShuYW1lKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJhc2VOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoYWRhcHRlckZhY3RvcnksIGUsIGJhc2VOYW1lLCBzdXBwcmVzc2lvbikgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBuYW1lLCBzdXBwcmVzc2lvbikgPT0gbnVsbCkgewotCQkJCQllLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0JCQotCQotCXByaXZhdGUgdm9pZCBmaXhUZWFtUHJvZmlsZUR1cGxpY2F0ZU5hbWVzKEFjdGl2aXR5IGFjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJZm9yIChpbnQgaSA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldChpKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWZpeER1cGxpY2F0ZU5hbWVzKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCBzdXBwcmVzc2lvbiwgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWZpeFRlYW1Qcm9maWxlRHVwbGljYXRlTmFtZXMoKEFjdGl2aXR5KSBlbGVtZW50LCBzdXBwcmVzc2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb1VuZG8oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5kbygpIHsKLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwoYXBwbGllZEFjdGl2aXRpZXMpOwotCQlpZiAoaXNEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgdGFyZ2V0UHJvY2VzczsKLQkJCXByb2MuZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGRBbGwob2xkUGF0dGVybnMpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoTGlzdCBzaWJsaW5ncywgQWN0aXZpdHkgZSkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBlLmdldE5hbWUoKTsKLQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgYmFzZU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBiYXNlTmFtZSArICdfJyArIGk7Ci0JCQlpZiAoIWlzTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBuYW1lKSkgewotCQkJCWUuc2V0TmFtZShuYW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFByZXNlbnRhdGlvbk5hbWUoTGlzdCBzaWJsaW5ncywgQWN0aXZpdHkgZSkgewotCQkvLyBpZihlLmdldFByZXNlbnRhdGlvbk5hbWUoKSAhPSBudWxsICYmCi0JCS8vIGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHJldHVybjsKLQotCQlTdHJpbmcgYmFzZVByZXNlbnRhdGlvbk5hbWUgPSBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGUpOwotCQlpZiAoIWlzUHJlc2VudGF0aW9uTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBiYXNlUHJlc2VudGF0aW9uTmFtZSkpIHsKLQkJCS8vIGUuc2V0UHJlc2VudGF0aW9uTmFtZShiYXNlUHJlc2VudGF0aW9uTmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBiYXNlUHJlc2VudGF0aW9uTmFtZSArICdfJyArIGk7Ci0JCQlpZiAoIWlzUHJlc2VudGF0aW9uTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBuYW1lKSkgewotCQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShuYW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTmFtZVRha2VuKExpc3Qgc2libGluZ3MsIERlc2NyaWJhYmxlRWxlbWVudCBlLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IHNpYmxpbmdzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IHNpYmxpbmcgPSAoQnJlYWtkb3duRWxlbWVudCkgc2libGluZ3MuZ2V0KGkpOwotCQkJLy8gaWYoc2libGluZyAhPSBlICYmIG5hbWUuZXF1YWxzKHNpYmxpbmcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJaWYgKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFscyhzaWJsaW5nLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ByZXNlbnRhdGlvbk5hbWVUYWtlbihMaXN0IHNpYmxpbmdzLAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBzaWJsaW5ncy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJQnJlYWtkb3duRWxlbWVudCBzaWJsaW5nID0gKEJyZWFrZG93bkVsZW1lbnQpIHNpYmxpbmdzLmdldChpKTsKLQkJCS8vIGlmKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFscyhzaWJsaW5nLmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCWlmIChzaWJsaW5nICE9IGUKLQkJCQkJJiYgbmFtZS5lcXVhbHMoUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShzaWJsaW5nKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYoZXhlY3V0ZWQpIHsKLQkJCXJldHVybiBhcHBsaWVkQWN0aXZpdGllczsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBnZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHlIYW5kbGVyIGdldEFjdGl2aXR5SGFuZGxlcigpIHsKLQkJcmV0dXJuIGFjdGl2aXR5SGFuZGxlcjsKLQl9Ci0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCl7Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0JcHVibGljIGludCBnZXRUeXBlKCl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoCi0JCQlJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpIHsKLQkJdGhpcy5hY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yID0gYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLQl9Ci0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0NWZiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIENvbW1hbmQgdG8gc2V0IHZhcmlhYmlsaXR5IG9uIHRoZSBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgdmU7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5VHlwZSB0eXBlOwotCi0JcHJpdmF0ZSBMaXN0IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXB1YmxpYyBBY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgVmFyaWFiaWxpdHlFbGVtZW50IHZlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KSk7Ci0KLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLnZlID0gdmU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotCi0JCWVsZW1lbnRzID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyB2ZSB9KTsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oZWxlbWVudHMsIGNvbmZpZ3VyYXRvcikpCi0JCQlyZXR1cm47Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlhY3Rpdml0eS5zZXRWYXJpYWJpbGl0eVR5cGUodHlwZSk7Ci0JCWFjdGl2aXR5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQodmUpOwotCi0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5OQSk7Ci0JCQlhY3Rpdml0eS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjVhN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGFkZCBndWlkYW5jZSB0byBhY3Rpdml0eQotICogIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3QgZ3VpZGFuY2VzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXB1YmxpYyBBZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGd1aWRhbmNlcykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkpOwotCi0JCXRoaXMuZ3VpZGFuY2VzID0gZ3VpZGFuY2VzOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKGd1aWRhbmNlcykpCi0JCQlyZXR1cm47Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBndWlkYW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIG9iajsKLQotCQkJCQkvLyBndWlkYW5jZXMgZm9yIGNvbnRlbnQgZWxlbWVudAotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Q2hlY2tsaXN0cygpLmFkZCgoQ2hlY2tsaXN0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Q29uY2VwdHMoKS5hZGQoKENvbmNlcHQpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRFeGFtcGxlcygpLmFkZCgoRXhhbXBsZSkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZCgoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRHdWlkZWxpbmVzKCkuYWRkKChHdWlkZWxpbmUpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSZXVzYWJsZUFzc2V0cygpLmFkZCgoUmV1c2FibGVBc3NldCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJvYWRtYXApIHsKLQkJCQkJCWFjdGl2aXR5LmdldFJvYWRtYXBzKCkuYWRkKChSb2FkbWFwKSBpdGVtKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoIkNhbnQgc2V0IGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ3VpZGFuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBvYmo7Ci0KLQkJCQkJLy8gZ3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENoZWNrbGlzdHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENvbmNlcHRzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRFeGFtcGxlcygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJCWFjdGl2aXR5LmdldEd1aWRlbGluZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldFJldXNhYmxlQXNzZXRzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSb2FkbWFwcygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoIkNhbnQgc2V0IGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSApIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgYWN0aXZpdHkgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjEyNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci0KLS8qKgotICogQ29tbWFuZCB0byBhZGQgZ3VpZGFuY2UgdG8gYnJlYWtkb3duIGVsZW1lbnQvYWN0aXZpdHkKLSAqICAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBBZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Q8R3VpZGFuY2U+IGd1aWRhbmNlczsKLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50LCBMaXN0PEd1aWRhbmNlPiBndWlkYW5jZXMpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYnJFbGVtZW50KSk7Ci0KLQkJdGhpcy5ndWlkYW5jZXMgPSBndWlkYW5jZXM7Ci0JCXRoaXMuYnJFbGVtZW50ID0gYnJFbGVtZW50OwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihndWlkYW5jZXMpKQotCQkJcmV0dXJuOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ3VpZGFuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBvYmo7Ci0KLQkJCQkJLy8gZ3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRDaGVja2xpc3RzKCkuYWRkKChDaGVja2xpc3QpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0Q29uY2VwdHMoKS5hZGQoKENvbmNlcHQpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0RXhhbXBsZXMoKS5hZGQoKEV4YW1wbGUpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuYWRkKChTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRHdWlkZWxpbmVzKCkuYWRkKChHdWlkZWxpbmUpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKS5hZGQoKFJldXNhYmxlQXNzZXQpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCQlpZiAoYnJFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkoKEFjdGl2aXR5KSBickVsZW1lbnQpLmdldFJvYWRtYXBzKCkuYWRkKChSb2FkbWFwKSBpdGVtKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoIkNhbnQgc2V0IGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ3VpZGFuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBvYmo7Ci0KLQkJCQkJLy8gZ3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRDaGVja2xpc3RzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0Q29uY2VwdHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRFeGFtcGxlcygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQkJYnJFbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCQlpZiAoYnJFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkoKEFjdGl2aXR5KSBickVsZW1lbnQpLmdldFJvYWRtYXBzKCkucmVtb3ZlKChSb2FkbWFwKSBpdGVtKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoIkNhbnQgc2V0IGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSApIHsKLQkJCWlmIChickVsZW1lbnQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChickVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChickVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgYnJFbGVtZW50IH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJjNmFjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLQotLyoqCi0gKiBCYXNlIENvbW1hbmQgZm9yIGFkZCBtZXRob2QgZWxlbWVudHMgdG8gZGVzY3JpcHRvci4gCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnOwotCi0JcHJpdmF0ZSBIYXNoU2V0IGFkZGVkT2JqZWN0czsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCi0JcHVibGljIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kKFByb2Nlc3MgcHJvY2VzcykgewotCQlzdXBlcigpOwotCi0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGFuZCBhZGRzIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHVzZXIgY2FuY2VsZWQgdGhlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oTGlzdCBlbGVtZW50cykKLQl7Ci0JCXJldHVybiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKGVsZW1lbnRzLCBudWxsKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ2hlY2tzIGFuZCBhZGRzIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHVzZXIgY2FuY2VsZWQgdGhlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oTGlzdCBlbGVtZW50cywgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQkJaWYgKGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgPT0gbnVsbCkgewotCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCi0JCQkJc3dpdGNoIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oCi0JCQkJCQlwcm9jZXNzLCBlbGVtZW50LCBjb25maWd1cmF0b3IpKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuYWRkKGVsZW1lbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIC0xOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmlzRW1wdHkoKSkgewotCQkJCWFkZGVkT2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvY2VzcywgZWxlbWVudCwKLQkJCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJCX0KLQkJCQlpZiAoIWFkZGVkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoCi0JCQkJCQkJcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChhZGRlZE9iamVjdHMgIT0gbnVsbCAmJiAhYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkZWRPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJZGVmYXVsdENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlkZWZhdWx0Q29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZFJvbGVUb1RlYW1Db21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRSb2xlVG9UZWFtQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRkNmI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZFJvbGVUb1RlYW1Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gYWRkIHJvbGUgdG8gdGVhbSBwcm9maWxlCi0gKiAgCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkUm9sZVRvVGVhbUNvbW1hbmQgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZXM7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZURlc2NMaXN0OwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgTGlzdCBleGlzdGluZ1JvbGVEZXNjTGlzdDsKLQotCXB1YmxpYyBBZGRSb2xlVG9UZWFtQ29tbWFuZChUZWFtUHJvZmlsZSB0ZWFtLCBMaXN0IHJvbGVzKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRlYW0pKTsKLQotCQl0aGlzLnJvbGVzID0gcm9sZXM7Ci0JCXRoaXMudGVhbSA9IHRlYW07Ci0KLQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgUHJvY2Vzc1V0aWwuZ2V0UGFyZW50QWN0aXZpdHlPZlRlYW0odGVhbSk7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHJvbGVzKSkKLQkJCXJldHVybjsKLQotCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKFJvbGUpIGl0b3IubmV4dCgpKTsKLQkJCXJvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQl9Ci0KLQkJLy8gYXV0b21hdGljIGFzc2lnbm1lbnQKLQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVByb2Nlc3NVdGlsLmdldFJvbGVEZXNjcmlwdG9yKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdGl2aXR5LAotCQkJCWV4aXN0aW5nUm9sZURlc2NMaXN0LCByb2xlcyk7Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoIXJvbGVEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZCgoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCWlmICghZXhpc3RpbmdSb2xlRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBleGlzdGluZ1JvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZSgoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlpZiAoIWV4aXN0aW5nUm9sZURlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZXhpc3RpbmdSb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJaWYgKHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHRlYW0uZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0ZWFtLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiByb2xlRGVzY0xpc3Q7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE5ZmUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogCi0gKiBDb21tYW5kIHRvIGFzc2lnbiBwcmltYXJ5IHBlcmZvcm1lciB0byB0YXNrIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yIGV4dGVuZHMKLQkJQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCXByaXZhdGUgUm9sZURlc2NyaXB0b3IgbmV3Um9sZURlc2MgPSBudWxsOwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciBvbGRSb2xlRGVzYyA9IG51bGw7Ci0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCXByaXZhdGUgTGlzdCByb2xlczsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGRlc2NFeGlzdHMgPSBmYWxzZTsKLQotCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjLAotCQkJUm9sZSByb2xlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFza0Rlc2MpKTsKLQotCQl0aGlzLnJvbGUgPSByb2xlOwotCQl0aGlzLnRhc2tEZXNjID0gdGFza0Rlc2M7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCXJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyb2xlcy5hZGQocm9sZSk7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocm9sZXMpKQotCQkJcmV0dXJuOwotCi0JCWlmICghcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJbmV3Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKAotCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCWlmIChuZXdSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJbmV3Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJLmdldEluaGVyaXRlZERlc2NyaXB0b3Iocm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJaWYgKG5ld1JvbGVEZXNjID09IG51bGwpIHsKLQotCQkJCQluZXdSb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCB0ZWFtCi0JCQl0ZWFtID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oYWN0aXZpdHksIHJvbGUpOwotCi0JCQlyZWRvKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5hZGQobmV3Um9sZURlc2MpOwotCi0JCWlmIChpc05ld1JvbGVEZXNjcmlwdG9yKSB7Ci0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChuZXdSb2xlRGVzYyk7Ci0JCX0KLQotCQlpZiAodGVhbSAhPSBudWxsKSB7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZChuZXdSb2xlRGVzYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCWlmICghcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0KLQkJCXRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkucmVtb3ZlKG5ld1JvbGVEZXNjKTsKLQotCQkJaWYgKGlzTmV3Um9sZURlc2NyaXB0b3IpIHsKLQkJCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZShuZXdSb2xlRGVzYyk7Ci0JCQl9Ci0JCQlpZiAodGVhbSAhPSBudWxsKSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUobmV3Um9sZURlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHRhc2tEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodGFza0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiYTFiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIENvbW1hbmQgZm9yIGFzc2lnbiByb2xlcyB0byB0YXNrIGRlc2NyaXB0b3IuIEl0IHdpbGwgYXNzaWduIHByaW1hcnksIGFkZGl0aW9uYWwKLSAqIHBlcmZvcm1lcnMgYW5kIGFzc2lzdGVkIGJ5IHRvIGEgdGFzayBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvciBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCByb2xlczsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBpbnQgYWN0aW9uOwotCi0JTGlzdCBleGlzdGluZ1JvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgbmV3Um9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQotCS8qKgotCSAqIEFzc2lnbiByb2xlIHRvIHRhc2sgZGVzY3JpcHRvciBVc2VkIGZvciBib3RoIGFkZGl0aW9uYWxseSBwZXJmb3JtZWQgYnkKLQkgKiBhbmQgYXNzaXN0ZWQgYnkKLQkgKi8KLQlwdWJsaWMgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsIExpc3Qgcm9sZXMsCi0JCQlpbnQgYWN0aW9uLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXNrRGVzYykpOwotCi0JCXRoaXMucm9sZXMgPSByb2xlczsKLQkJdGhpcy50YXNrRGVzYyA9IHRhc2tEZXNjOwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocm9sZXMpKQotCQkJcmV0dXJuOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByb2xlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBib29sZWFuIGRlc2NFeGlzdHMgPSBmYWxzZTsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdC5uZXh0KCk7Ci0KLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gbnVsbDsKLQkJCWlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3Iocm9sZSwKLQkJCQkJYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCXJvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCWlzTmV3Um9sZURlc2NyaXB0b3IgPSB0cnVlOwotCi0JCQkJfQotCQkJfQotCQkJaWYgKGlzTmV3Um9sZURlc2NyaXB0b3IpCi0JCQkJbmV3Um9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCQllbHNlCi0JCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQotCQkJLy8gZ2V0IHRlYW0KLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VGVhbShhY3Rpdml0eSwgcm9sZSk7Ci0JCQlpZiAodGVhbSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChyb2xlRGVzYywgdGVhbSk7Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1BSSU1BUllfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmFkZEFsbChleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmFkZEFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQURESVRJT05BTF9QRVJGT1JNRVIpIHsKLQkJCXRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKGV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BU1NJU1RFRF9CWSkgewotCQkJdGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpLmFkZEFsbChleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkuYWRkQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0JCX0KLQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChuZXdSb2xlRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgbWFwLmdldChrZXkpOwotCi0JCQkJLy8gYWRkIHRvIHRlYW0KLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZCgoUm9sZURlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQlzdXBlci51bmRvKCk7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQURESVRJT05BTF9QRVJGT1JNRVIpIHsKLQkJCXRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkucmVtb3ZlQWxsKAotCQkJCQlleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLnJlbW92ZUFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9IGVsc2UJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQURESVRJT05BTF9QRVJGT1JNRVIpIHsKLQkJCXRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkucmVtb3ZlQWxsKAotCQkJCQlleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZUFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQVNTSVNURURfQlkpIHsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5yZW1vdmVBbGwoZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpLnJlbW92ZUFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBtYXAuZ2V0KGtleSk7Ci0KLQkJCQkvLyByZW1vdmUgaXQgZnJvbSB0ZWFtCi0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoKFJvbGVEZXNjcmlwdG9yKSBrZXkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJaWYgKHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHRhc2tEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodGFza0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9EZWxpdmVyYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb0RlbGl2ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZTY0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb0RlbGl2ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiAKLSAqIENvbW1hbmQgdG8gYXNzaWduIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25XUFRvRGVsaXZlcmFibGUgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgd29ya1Byb2R1Y3RzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JTGlzdCBleGlzdGluZ1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQXNzaWduV1BUb0RlbGl2ZXJhYmxlKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsIExpc3Qgd29ya1Byb2R1Y3RzKSB7Ci0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh3cERlc2MpKTsKLQotCQl0aGlzLndvcmtQcm9kdWN0cyA9IHdvcmtQcm9kdWN0czsKLQkJdGhpcy53cERlc2MgPSB3cERlc2M7Ci0KLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudEFjdGl2aXR5KHdwRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5IGZvciBicmVha2Rvd25lbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGJyRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRQYXJlbnRBY3Rpdml0eShCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbih3b3JrUHJvZHVjdHMpKQotCQkJcmV0dXJuOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJYm9vbGVhbiBkZXNjRXhpc3RzID0gZmFsc2U7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXQubmV4dCgpOwotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIG5ld1dwRGVzYyA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrZG93bkVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGJyZWFrZG93bkVsZW1lbnRzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCW5ld1dwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCVdvcmtQcm9kdWN0IGVsZW1lbnRXUCA9IG5ld1dwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3AuZXF1YWxzKGVsZW1lbnRXUCkpIHsKLQkJCQkJCS8vIGlmIGZvdW5kIHVuZGVyIHRoZSBwYXJlbnQgYWN0aXZpdHksIHJldHVybiB0aGF0Ci0JCQkJCQkvLyB3cGRlc2NyaXB0b3IKLQkJCQkJCWRlc2NFeGlzdHMgPSB0cnVlOwotCi0JCQkJCQlleGlzdGluZ1dQRGVzY0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQkJaWYgKCFkZXNjRXhpc3RzKSB7Ci0JCQkJbmV3V1BEZXNjTGlzdC5hZGQoUHJvY2Vzc1V0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKSk7Ci0JCQl9Ci0KLQkJCS8vIGdldCBkZWxpdmVyYWJsZQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3ApOwotCQkJaWYgKGRlbGl2ZXJhYmxlICE9IG51bGwpIHsKLQkJCQltYXAucHV0KG5ld1dwRGVzYywgZGVsaXZlcmFibGUpOwotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQotCQkvLyBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQlzdXBlci51bmRvKCk7Ci0KLQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJLy8gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCAmJiAgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh3cERlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh3cERlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9Sb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQ1NjQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9Sb2xlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gYXNzaWduIHdvcmsgcHJvZHVjdHMgdG8gcm9sZSBkZXNjcmlwdG9ycy4gSXQgd2lsbCBzZXQgcmVwb25zaWJsZQotICogcm9sZSBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IHdvcmtQcm9kdWN0czsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIGludCBhY3Rpb247Ci0KLQlMaXN0IGV4aXN0aW5nV1BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgbmV3V1BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjLCBMaXN0IHdvcmtQcm9kdWN0cywKLQkJCWludCBhY3Rpb24sIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHJvbGVEZXNjKSk7Ci0KLQkJdGhpcy53b3JrUHJvZHVjdHMgPSB3b3JrUHJvZHVjdHM7Ci0JCXRoaXMucm9sZURlc2MgPSByb2xlRGVzYzsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXJvbGVEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocm9sZURlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHdvcmtQcm9kdWN0cykpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHdvcmtQcm9kdWN0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXQubmV4dCgpOwotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIG5ld1dwRGVzYyA9IG51bGw7Ci0KLQkJCWJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCS5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCWlmIChuZXdXcERlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCW5ld1dwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJLmdldEluaGVyaXRlZERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWlmIChuZXdXcERlc2MgPT0gbnVsbCkgewotCQkJCQluZXdXcERlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3ApOwotCQkJCQlpc05ld0Rlc2NyaXB0b3IgPSB0cnVlOwotCi0JCQkJfQotCQkJfQotCQkJaWYgKGlzTmV3RGVzY3JpcHRvcikKLQkJCQluZXdXUERlc2NMaXN0LmFkZChuZXdXcERlc2MpOwotCQkJZWxzZQotCQkJCWV4aXN0aW5nV1BEZXNjTGlzdC5hZGQobmV3V3BEZXNjKTsKLQotCQkJLy8gZ2V0IGRlbGl2ZXJhYmxlCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQlpZiAoZGVsaXZlcmFibGUgIT0gbnVsbCkgewotCQkJCW1hcC5wdXQobmV3V3BEZXNjLCBkZWxpdmVyYWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1JFU1BPTlNJQkxFX0ZPUikgewotCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9Ci0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbWFwCi0JCQkJCQkuZ2V0KGtleSk7Ci0KLQkJCQkvLyBhZGQgdG8gZGVsaXZlcmFibGUKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBrZXkpOwotCQkJfQotCQl9Ci0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQlzdXBlci51bmRvKCk7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfUkVTUE9OU0lCTEVfRk9SKSB7Ci0JCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0KLQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBtYXAKLQkJCQkJCS5nZXQoa2V5KTsKLQotCQkJCS8vIHJlbW92ZSBpdCBmcm9tIGRlbGl2ZXJhYmxlCi0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKQotCQkJCQkJLnJlbW92ZSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBrZXkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCAmJiAgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmIChyb2xlRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJvbGVEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzODlkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGFzc2lnbiB3b3JrIHByb2R1Y3RzIHRvIHRhc2sgZGVzY3JpcHRvci4gSXQgd2lsbCBzZXQgZXh0ZXJuYWwKLSAqIGlucHV0cywgbWFuZGF0b3J5IGlucHV0cywgb3B0aW9uYWwgaW5wdXRzIGFuZCBvdXRwdXRzLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IHdvcmtQcm9kdWN0czsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBpbnQgYWN0aW9uOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlMaXN0IGV4aXN0aW5nV1BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgbmV3V1BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjLCBMaXN0IHdvcmtQcm9kdWN0cywKLQkJCWludCBhY3Rpb24sIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXNrRGVzYykpOwotCi0JCXRoaXMud29ya1Byb2R1Y3RzID0gd29ya1Byb2R1Y3RzOwotCQl0aGlzLnRhc2tEZXNjID0gdGFza0Rlc2M7Ci0JCXRoaXMuYWN0aW9uID0gYWN0aW9uOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQl0YXNrRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHRhc2tEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbih3b3JrUHJvZHVjdHMpKQotCQkJcmV0dXJuOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBuZXdXcERlc2MgPSBudWxsOwotCi0JCQlib29sZWFuIGlzTmV3RGVzY3JpcHRvciA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCW5ld1dwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkuZ2V0RGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAobmV3V3BEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQlpZiAobmV3V3BEZXNjID09IG51bGwpIHsKLQkJCQkJbmV3V3BEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKTsKLQkJCQkJaXNOZXdEZXNjcmlwdG9yID0gdHJ1ZTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmIChpc05ld0Rlc2NyaXB0b3IpCi0JCQkJbmV3V1BEZXNjTGlzdC5hZGQobmV3V3BEZXNjKTsKLQkJCWVsc2UKLQkJCQlleGlzdGluZ1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0KLQkJCS8vIGdldCBkZWxpdmVyYWJsZQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3ApOwotCQkJaWYgKGRlbGl2ZXJhYmxlICE9IG51bGwpIHsKLQkJCQltYXAucHV0KG5ld1dwRGVzYywgZGVsaXZlcmFibGUpOwotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9FWFRFUk5BTF9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX01BTkRBVE9SWV9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1BUSU9OQUxfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PVVRQVVQpIHsKLQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9Ci0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbWFwCi0JCQkJCQkuZ2V0KGtleSk7Ci0KLQkJCQkvLyBhZGQgdG8gZGVsaXZlcmFibGUKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBrZXkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQlzdXBlci51bmRvKCk7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfRVhURVJOQUxfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9NQU5EQVRPUllfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09QVElPTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1VUUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBtYXAKLQkJCQkJCS5nZXQoa2V5KTsKLQotCQkJCS8vIHJlbW92ZSBpdCBmcm9tIGRlbGl2ZXJhYmxlCi0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKQotCQkJCQkJLnJlbW92ZSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBrZXkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCAmJiAgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRhc2tEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjdlZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLklkZW50aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZXNvdXJjZUF3YXJlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBkcmFnIGFuZCBkcm9wIGNvbW1hbmQgZm9yIHByb2Nlc3MgYXV0aG9yaW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQlNEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBSZXNvdXJjZUF3YXJlRHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBCU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZURyb3BDb3B5T24oKSB7Ci0JCXJldHVybiBwcmVwYXJlRHJvcExpbmtPbigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVEcm9wTGlua09uKCkgewotCQlkcmFnQ29tbWFuZCA9IElkZW50aXR5Q29tbWFuZC5JTlNUQU5DRTsKLQkJZHJvcENvbW1hbmQgPSBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgYWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKChFT2JqZWN0KSBvd25lcikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGFjY2VwdChlKSkgewotCQkJCWxpc3QuYWRkKGUpOwotCQkJfQotCQkJLy8gZWxzZSBpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkvLyAvLyBkaXNhbGxvdyBkcm9wIGEgcHJvY2VzcyBhcyBhbiBhY3Rpdml0eQotCQkJLy8gfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSB0YXJnZXQgPSAoQWN0aXZpdHkpIG93bmVyOwotCQkJCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVja0FjdCkgewotCQkJCQlpZiAoISBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJCQkJKHRhcmdldCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlKSwgdHJ1ZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQkJCQkJCi0JCQkJfSBlbHNlIGlmICghRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koKEFjdGl2aXR5KSBlLCB0YXJnZXQpLmlzT0soKSl7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0vLwkJCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0vLwkJCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFyZ2V0KTsKLS8vCi0vLwkJCQlpZiAoIShzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzICYmIHRhcmdldFByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikpIHsKLS8vCQkJCQlhY3RMaXN0LmFkZChvYmopOwotLy8JCQkJfQotCQkJCQotCQkJCS8vIG5vIG1vcmUgY2hlY2sgdG8gcHJldmVudCBhcHBseWluZyBhbiBhY3Rpdml0eSBvZiBhIGRlbGl2ZXJ5IHByb2Nlc3Mgb250byBhIGNhcGFiaWxpdHkgcGF0dGVyCi0JCQkJLy8gc2luY2UgaW50cm9kdWN0aW9uIG9mIGRlZXAtY29weS4gRGVlcCBjb3B5IGNhbiBhbHdheXMgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIHNvdXJjZSBhbmQgdGFyZ2V0Ci0JCQkJLy8gcHJvY2Vzc2VzLgotCQkJCS8vCi0JCQkJYWN0TGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gcmVzdWx0OwotCQlpZiAobGlzdC5pc0VtcHR5KCkgJiYgYWN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKCk7Ci0JCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJY21kLmFwcGVuZChjcmVhdGVEcm9wQ29tbWFuZChvd25lciwgbGlzdCkpOwotCQkJfQotCQkJaWYgKCFhY3RMaXN0LmlzRW1wdHkoKSkgewotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQljbWQuYXBwZW5kKG5ldyBBY3Rpdml0eURyb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGFjdExpc3QsCi0JCQkJCQlnZXRUYXJnZXRWaWV3ZXIoKSwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQl9Ci0JCQlkcm9wQ29tbWFuZCA9IGNtZDsKLQkJCXJlc3VsdCA9IGRyb3BDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VGFyZ2V0Vmlld2VyKCkgewotCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIG93bmVyKTsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkuZ2V0Vmlld2VyKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIGRyb3BDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpOwkJCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLCBMaXN0IGRyb3BTcmMpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0Ryb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMTFhODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk5lc3RlZENvbW1hbmRFeGNlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIERyb3BDb21tYW5kIGNsYXNzIGZvciBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQlNEcm9wQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PEVSZWZlcmVuY2U+IEJBU0lDX1NZTkNfUkVGRVJFTkNFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxFUmVmZXJlbmNlPihBcnJheXMuYXNMaXN0KG5ldyBFUmVmZXJlbmNlW10gewotCQkJLy8gZ3VpZGFuY2UKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQl9KSkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gREVGQVVMVF9TWU5DSF9GRUFUVVJFUyA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oQXJyYXlzLmFzTGlzdCgKLQkJCW5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpLAkJCQkKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpCi0JCQl9Ci0JKSk7Ci0JCi0JLyoqCi0JICogTWFwIG9mIGxpbmtlZCBlbGVtZW50J3MgZmVhdHVyZSB0byBkZXNjcmlwdG9yJ3MgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlPiBGRUFUVVJFX01BUCA9IG5ldyBIYXNoTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCXN0YXRpYyB7Ci0JCURFRkFVTFRfU1lOQ0hfRkVBVFVSRVMuYWRkQWxsKEJBU0lDX1NZTkNfUkVGRVJFTkNFUyk7Ci0JCQotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSk7Ci0vLwkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRlZE1ldGhvZEVsZW1lbnRfRXN0aW1hdGUoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGVkTWV0aG9kRWxlbWVudF9Fc3RpbWF0ZSgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCQkvLyBndWlkYW5jZQotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKTsKLS8vCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50Xyk7CQotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gZHJvcEVsZW1lbnRzOwotCQotCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gdW53cmFwcGVkRHJvcEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnOwotCi0JcHJvdGVjdGVkIFNldDxPYmplY3Q+IGFkZGVkT2JqZWN0czsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCi0JcHJpdmF0ZSBib29sZWFuIGFkZGVkVG9EZWZhdWx0Q29uZmlnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jaHJvbml6ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxUYXNrRGVzY3JpcHRvcj4gdGFza0Rlc2NMaXN0OwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxEZXNjcmlwdG9yPiB0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZTsKLQotLy8JcHJvdGVjdGVkIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQotCS8qKgotCSAqIE1hcCBvZiBkZXNjcmlwdG9yIHRvIG9sZCByZWZyZXNoYWJsZSBmZWF0dXJlIG1hcAotCSAqLwotCXByaXZhdGUgTWFwPERlc2NyaXB0b3IsIE1hcDw/LCA/Pj4gZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcDsKLQotCS8qKgotCSAqIE1hcCBvZiBkZXNjcmlwdG9yIHRvIG1hcCBvZiBmZWF0dXJlIHRvIG5ldyB2YWx1ZXMKLQkgKi8KLS8vCXByb3RlY3RlZCBNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcDsKLS8vCXByaXZhdGUgSGFzaE1hcCBkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwOwkKLQlwcm90ZWN0ZWQgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZCBiYXRjaENvbW1hbmQ7Ci0KLS8vCXByaXZhdGUgSGFzaE1hcCB3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcDsKLQotCS8qKgotCSAqIE1hcCBvZiBUYXNrRGVzY3JpcHRvciB0byBsaXN0IG9mIG5ld2x5IGFkZGVkIHN0ZXBzCi0JICovCi0JcHJpdmF0ZSBNYXAgdGFza0Rlc2NUb05ld1N0ZXBzTWFwOwotCi0JcHJpdmF0ZSBNYXAgdGFza0Rlc2NUb09sZEVzdGltYXRlTWFwOwotCQotCXByb3RlY3RlZCBib29sZWFuIGNhbmNlbGVkOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBTZXQgc3luY2hGZWF0dXJlcyA9IERFRkFVTFRfU1lOQ0hfRkVBVFVSRVM7Ci0KLQlwcml2YXRlIEJhdGNoQ29tbWFuZCByZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZWQ7Ci0KLS8vCXByb3RlY3RlZCBPYmplY3QgVUlDb250ZXh0OwotCQotCXByb3RlY3RlZCBib29sZWFuIHJ1bkFzSm9iOwotCQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JcHJpdmF0ZSBpbnQgd29ya2VkVW5pdHM7Ci0KLQlwcml2YXRlIE5lc3RlZENvbW1hbmRFeGNlY3V0b3IgbmVzdGVkQ29tbWFuZEV4Y2VjdXRvcjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB0aGF0IHRoZSBnaXZlbiBlbGVtZW50cyBhcmUgZHJvcHBlZCBvbgotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBkcm9wIG9uIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0PE9iamVjdD4gZHJvcEVsZW1lbnRzKSB7Ci0JCXRoaXMoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzeW5jaAotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlIGNvbW1hbmQgd2lsbCBjbGVhbiB0aGUgY29udGVudCBhbmQgcmVsYXRpb25zaGlwcwotCSAqICAgICAgICAgICAgb2YgZXhpc3RpbmcgZGVzY3JpcHRvcnMgYW5kIHJlZnJlc2ggdGhlbSB3aXRoIHRoZSBsaW5rZWQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdDxPYmplY3Q+IGRyb3BFbGVtZW50cywgYm9vbGVhbiBzeW5jaCkgewotCQl0aGlzKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIG51bGwsIG51bGwsIHN5bmNoKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgZ2l2ZW4gY29udGVudCBlbGVtZW50cyB0byBpdHMgVGFza0Rlc2NyaXB0b3JzIGluIHRoZQotCSAqIGdpdmVuIGFjdGl2aXR5IHVzaW5nIHRoZSBnaXZlbiBNZXRob2RDb25maWd1cmF0aW9uIGFuZCBsaXN0IG9mCi0JICogc3luY2hyb25pemFibGUgZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIHN5bmNocm9uaXplCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzCi0JICogICAgICAgICAgICB0aGUgc3luY2hyb25pemFibGUgZmVhdHVyZXMsIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBERUZBVUxUX1NZTkNIX0ZFQVRVUkVTIHdpbGwgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdDxPYmplY3Q+IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQl0aGlzKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcywgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0PE9iamVjdD4gZHJvcEVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzLCBib29sZWFuIHN5bmNoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSk7Ci0JCXRoaXMuc3luY2hyb25pemUgPSBzeW5jaDsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCWlmIChzeW5jaEZlYXR1cmVzID09IG51bGwpIHsKLQkJCXRoaXMuc3luY2hGZWF0dXJlcyA9IERFRkFVTFRfU1lOQ0hfRkVBVFVSRVM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl9Ci0JCQotCQl0aGlzLmRyb3BFbGVtZW50cyA9IGRyb3BFbGVtZW50czsKLQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvciA9IGNyZWF0ZU5lc3RlZENvbW1hbmRFeGNlY3V0b3IoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5lc3RlZENvbW1hbmRFeGNlY3V0b3IgY3JlYXRlTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKHRoaXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQkJCWlmKHRhc2tEZXNjTGlzdCAhPSBudWxsICYmICF0YXNrRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCUxpc3QgbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkJLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJCQkJaWYgKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUlOZXN0ZWRDb21tYW5kUHJvdmlkZXIgY21kUHJvdmlkZXIgPSAoSU5lc3RlZENvbW1hbmRQcm92aWRlcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJQ29tbWFuZCBjbWQgPSBjbWRQcm92aWRlci5jcmVhdGVSZWxhdGVkT2JqZWN0cygKLQkJCQkJCQkJCQl0YXNrRGVzY0xpc3QsIEJTRHJvcENvbW1hbmQudGhpcyk7Ci0JCQkJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJCQkJZ2V0TmVzdGVkQ29tbWFuZHMoKS5hZGQoY21kKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3VwZXIuZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZURyb3BFbGVtZW50cygpIHsJCQotCQlBcnJheUxpc3Q8T2JqZWN0PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCXVud3JhcHBlZERyb3BFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKE9iamVjdCBvIDogZHJvcEVsZW1lbnRzKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG8pOwotCQkJZWxlbWVudCA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZWxlbWVudCwgY29uZmlnKTsKLQkJCWlmICghZWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkKLQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCAmJiAoKEVPYmplY3QpIGVsZW1lbnQpCi0JCQkJCQkJLmVJc1Byb3h5KCkpKSB7CQkJCQotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl1bndyYXBwZWREcm9wRWxlbWVudHMuYWRkKG8pOwotCQkJfQotCQl9Ci0JCWRyb3BFbGVtZW50cyA9IGVsZW1lbnRzOwotCX0KLQkKLS8vCS8qKgotLy8JICogU2V0cyBVSSBjb250ZXh0IGZvciB0aGlzIGNvbW1hbmQsIHRoaXMgY2FuIGJlIGEgU2hlbGwgb2JqZWN0Ci0vLwkgKiBAcGFyYW0gVUlDb250ZXh0Ci0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldFVJQ29udGV4dChPYmplY3QgVUlDb250ZXh0KSB7Ci0vLwkJdGhpcy5VSUNvbnRleHQgPSBVSUNvbnRleHQ7Ci0vLwl9Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlpZihjb25maWcgPT0gbnVsbCkgewotCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkcm9wRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZHJvcEVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYodW53cmFwcGVkRHJvcEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCXVud3JhcHBlZERyb3BFbGVtZW50cy5jbGVhcigpOwotCQl9Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JCWlmIChlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnICE9IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuY2xlYXIoKTsKLQkJfQotCQlpZiAoYWRkZWRPYmplY3RzICE9IG51bGwpIHsKLQkJCWFkZGVkT2JqZWN0cy5jbGVhcigpOwotCQl9Ci0JCWlmIChkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAodGFza0Rlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmICh0YXNrRGVzY1RvTmV3U3RlcHNNYXAgIT0gbnVsbCkgewotCQkJdGFza0Rlc2NUb05ld1N0ZXBzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjVG9PbGRFc3RpbWF0ZU1hcCAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzY1RvT2xkRXN0aW1hdGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAocmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAodGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUgIT0gbnVsbCkgewotCQkJdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUuY2xlYXIoKTsKLQkJfQotCQlpZihiYXRjaENvbW1hbmQgIT0gbnVsbCkgewotCQkJYmF0Y2hDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCQlhY3Rpdml0eSA9IHByb2Nlc3MgPSBudWxsOwotCQlpZihuZXN0ZWRDb21tYW5kRXhjZWN1dG9yICE9IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCQotCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwobmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIGFsbCB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZXMgb2YgdGhlIGdpdmVuIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjbGVhckRlc2NyaXB0b3IoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCVNldCBleGNsdWRlU3luY2hGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KERFRkFVTFRfU1lOQ0hfRkVBVFVSRVMpOwotCQlleGNsdWRlU3luY2hGZWF0dXJlcy5yZW1vdmVBbGwoc3luY2hGZWF0dXJlcyk7Ci0JCVNldCBleGNsdWRlRmVhdHVyZXM7Ci0JCWlmIChleGNsdWRlU3luY2hGZWF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCWV4Y2x1ZGVGZWF0dXJlcyA9IGV4Y2x1ZGVTeW5jaEZlYXR1cmVzOwotCQl9Ci0JCWVsc2UgewotCQkJZXhjbHVkZUZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVTeW5jaEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RGVzY3JpcHRvckZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCkpOwotCQkJCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJCQlleGNsdWRlRmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlib29sZWFuIHJldCA9IFByb2Nlc3NDb21tYW5kVXRpbC5jbGVhckRlc2NyaXB0b3IoZGVzY3JpcHRvciwKLQkJCQlkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLCBleGNsdWRlRmVhdHVyZXMpOwotCQlpZiAocmV0ICYmIGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJaWYgKHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlID09IG51bGwpIHsKLQkJCQl0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRvcj4oKTsKLQkJCX0KLQkJCXRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlLmFkZChkZXNjcmlwdG9yKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXREZXNjcmlwdG9yRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbGlua2VkRWxlbWVudEZlYXR1cmUpIHsKLQkJcmV0dXJuIChFU3RydWN0dXJhbEZlYXR1cmUpIEZFQVRVUkVfTUFQLmdldChsaW5rZWRFbGVtZW50RmVhdHVyZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCXByZXBhcmVEcm9wRWxlbWVudHMoKTsKLQkJCi0JCWJvb2xlYW4gYiA9ICFkcm9wRWxlbWVudHMuaXNFbXB0eSgpOwotCQlpZiAoYikgewotLy8JCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWJhdGNoQ29tbWFuZCA9IG5ldyBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kKGZhbHNlLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpOyAvL1RPRE86IHdoeSBjbGVhciBtdXN0IGJlIGZhbHNlID8/PwotCi0vLwkJCWlmIChzeW5jaHJvbml6ZSkgewotLy8JCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotLy8JCQl9Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGNvbGxlY3RFbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnKCkgewotCQlpZiAoZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyA9PSBudWxsKSB7Ci0JCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlzd2l0Y2ggKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbigKLQkJCQkJCXByb2Nlc3MsIGVsZW1lbnQpKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuYWRkKGVsZW1lbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIC0xOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZWxlbWVudHMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCkgewotCQlpZiAoIWFkZGVkVG9EZWZhdWx0Q29uZmlnICYmIGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgIT0gbnVsbCAmJiAhZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5pc0VtcHR5KCkpIHsKLQkJCWlmKGFkZGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQkJYWRkZWRPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFkZGVkT2JqZWN0cy5jbGVhcigpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5pdGVyYXRvcigpOyBpdGVyCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlQcm9jZXNzVXRpbC5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2Nlc3MsIGVsZW1lbnQsCi0JCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJfQotCQkJaWYgKCFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoCi0JCQkJCQlwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZVJlc291cmNlKCkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJYWRkZWRUb0RlZmF1bHRDb25maWcgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXRUb3RhbFdvcmsoKSB7Ci0JCXJldHVybiAyMDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgd29ya2VkKGludCB1bml0c09mV29yaykgewotCQltb25pdG9yLndvcmtlZCh1bml0c09mV29yayk7Ci0JCXdvcmtlZFVuaXRzID0gd29ya2VkVW5pdHMgKyB1bml0c09mV29yazsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXRSZW1haW5pbmdXb3JrKCkgewotCQlpbnQgcmVtYWluaW5nID0gZ2V0VG90YWxXb3JrKCkgLSB3b3JrZWRVbml0czsKLQkJaWYocmVtYWluaW5nIDwgMCkgewotCQkJcmVtYWluaW5nID0gMDsKLQkJfQotCQlyZXR1cm4gcmVtYWluaW5nOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZURlZmF1bHRDb25maWd1cmF0aW9uTmVlZGVkKCkgewotCQlyZXR1cm4gIXN5bmNocm9uaXplOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CQkKLQkJLy8gQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJLy8JCQkKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBjYW5jZWxlZCA9ICFhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfSk7Ci0JCS8vCQkKLQkJLy8gLy9UT0RPOiBUaGlzIGNhdXNlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBUaHJlYWRBY2Nlc3NFcnJvciB3aGVuCi0JCS8vIHNob3dpbmcgc2VsZWN0aW9uIGRpYWxvZyBpcyBuZWVkZWQKLQkJLy8gLy8KLQkJLy8gSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJLy8KLQkJLy8gcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzCi0JCS8vIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJLy8gY2FuY2VsZWQgPSAhcHJlRXhlY3V0ZSgpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JCS8vIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIG51bGwpOwotCQkvLwkJCi0JCS8vIGlmKCFjYW5jZWxlZCkgewotCQkvLyBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkvLwkJCQkKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyByZWRvKCk7Ci0JCS8vIH0KLQkJLy8JCQkJCi0JCS8vIH0pOwotCQkvLyB9Ci0KLS8vCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotLy8KLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJaWYgKCghc3luY2hyb25pemUgJiYgYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpKSAmJiBwcmVFeGVjdXRlKCkpIHsKLS8vCQkJCQlyZWRvKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0JCQotCQlpZih1cGRhdGVEZWZhdWx0Q29uZmlndXJhdGlvbk5lZWRlZCgpKSB7Ci0JCQlpZighY29sbGVjdEVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJZmluYWwgU3RyaW5nIHRhc2tOYW1lID0gKGxhYmVsID09IG51bGwgPyAiIiA6IGxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCBnZXRUb3RhbFdvcmsoKSk7Ci0JCQkJCUJTRHJvcENvbW1hbmQudGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJCQkJd29ya2VkKGdldFJlbWFpbmluZ1dvcmsoKSAvIDMpOwotCQkJCQkKLQkJCQkJLy8gdGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcHJlRXhlY3V0ZSgpIHRvIGFkZCByZXF1aXJlZCBlbGVtZW50cyB0byBjb25maWd1cmF0aW9uCi0JCQkJCS8vIHNvIHRoZSBjb21tYW5kIGNhbiByZWFsaXplIGRhdGEgY29ycmVjdGx5Ci0JCQkJCS8vCi0JCQkJCWFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJd29ya2VkKGdldFJlbWFpbmluZ1dvcmsoKSAvIDMpOwotCQkJCQkKLQkJCQkJaWYgKHByZUV4ZWN1dGUoKSkgewotCQkJCQkJd29ya2VkKGdldFJlbWFpbmluZ1dvcmsoKSAvIDMpOwotCQkJCQkJcmVkbygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJaWYocnVuQXNKb2IpIHsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5Bc0pvYihydW5uYWJsZSwgdGFza05hbWUpOwotCQl9Ci0JCWVsc2UgewotLy8JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSShydW5uYWJsZSwgKFNoZWxsKW51bGwpOwotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQl0cnkgewotCQkJLy8gYWRkIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbmVlZGVkCi0JCQkvLwotCQkJYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpOwotCQkJCi0JCQlkb0V4ZWN1dGUoKTsKLQkJCXVwZGF0ZURlc2NyaXB0b3JzKCk7Ci0JCQkKLQkJCWxvbmcgdGltZSA9IDA7Ci0JCQlpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJTRHJvcENvbW1hbmQucmVkbygpOiBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKS4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlleGVjdXRlZCA9IHRydWU7Ci0JCX0KLQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGRlc2NyaXB0b3JzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChzeW5jaHJvbml6ZSkgewotCQkJY2xlYXJEZXNjcmlwdG9ycygpOwotCQkJaWYoIWJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLmlzRW1wdHkoKSkgewotCQkJCUFycmF5TGlzdDxFUmVmZXJlbmNlPiBiYXNpY1N5bmNSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxFUmVmZXJlbmNlPigpOwotCQkJCWZvciAoT2JqZWN0IGZlYXR1cmUgOiBzeW5jaEZlYXR1cmVzKSB7Ci0JCQkJCWlmKEJBU0lDX1NZTkNfUkVGRVJFTkNFUy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCQkJYmFzaWNTeW5jUmVmZXJlbmNlcy5hZGQoKEVSZWZlcmVuY2UpIGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghYmFzaWNTeW5jUmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChPYmplY3QgZGVzYyA6IGJhdGNoQ29tbWFuZAotCQkJCQkJCS5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpKSB7Ci0JCQkJCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcikgZGVzYzsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJCWZvciAoRVJlZmVyZW5jZSByZWYgOiBiYXNpY1N5bmNSZWZlcmVuY2VzKSB7Ci0JCQkJCQkJCU9iamVjdCB2YWx1ZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50LCByZWYsIGNvbmZpZyk7Ci0JCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBkZXNjcmlwdG9yRmVhdHVyZSA9IEZFQVRVUkVfTUFQLmdldChyZWYpOwotCQkJCQkJCQlpZihkZXNjcmlwdG9yRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQkJYmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZXMoZGVzY3JpcHRvciwgZGVzY3JpcHRvckZlYXR1cmUsIChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQliYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlKGRlc2NyaXB0b3IsIGRlc2NyaXB0b3JGZWF0dXJlLCB2YWx1ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgbmV3IHZhbHVlczsKLQkJLy8KLQkJYmF0Y2hDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCi0JCXVwZGF0ZVRhc2tEZXNjcmlwdG9ycygpOwotCi0JCXNldFJlc3BvbnNpYmxlUm9sZXMoKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogQHBhcmFtIGRlc2MKLS8vCSAqIEBwYXJhbSBmZWF0dXJlCi0vLwkgKiBAcGFyYW0gdmFsdWUKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgc2F2ZU9sZEZlYXR1cmVWYWx1ZShEZXNjcmlwdG9yIGRlc2MsCi0vLwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLwkJaWYgKGRlc2NyaXB0b3JUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPT0gbnVsbCkgewotLy8JCQlkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQl9Ci0vLwkJT2JqZWN0IHZhbHVlID0gZGVzYy5lR2V0KGZlYXR1cmUpOwotLy8JCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLS8vCQkJdmFsdWUgPSBuZXcgQXJyYXlMaXN0KChMaXN0KXZhbHVlKTsKLS8vCQl9Ci0vLwkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwLmdldChkZXNjKTsKLS8vCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0vLwkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQlkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwLnB1dChkZXNjLCBmZWF0dXJlTWFwKTsKLS8vCQl9Ci0vLwkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotLy8JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCkgewotCQl1bmRvU2V0UmVzcG9uc2libGVSb2xlKCk7Ci0KLQkJdW5kb1VwZGF0ZVRhc2tEZXNjcmlwdG9ycygpOwotCi0JCS8vIHJlc3RvcmUgb2xkIHZhbHVlcwotCQkvLwotCQliYXRjaENvbW1hbmQudW5kbygpOwotCi0JCS8vIHJlc3RvcmUgdmFsdWUgZm9yIHJlZnJlc2hhYmxlIGZlYXR1cmVzIHRoYXQgaGFkIGJlZW4gY2xlYXJlZAotCQkvLwotCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCXVuZG9DbGVhckRlc2NyaXB0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJEZXNjcmlwdG9ycygpIHsKLQkJaWYgKGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlpZiAoIWJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWNsZWFyRGVzY3JpcHRvcigoRGVzY3JpcHRvcikgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQkvLyBkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBhZmZlY3RlZCB0YXNrIGRlc2NyaXB0b3JzIHdpdGggbmV3IGRhdGEgZnJvbSBtZXRob2QgY29udGVudAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVUYXNrRGVzY3JpcHRvcnMoKSB7Ci0JCWlmICh0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSAhPSBudWxsKSB7Ci0JCQkvLyByZWZyZXNoIHN0ZXBzIGZyb20gdGhlIGFzc29jaWF0ZWQgdGFzawotCQkJLy8KLQkJCWlmKHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpKSkgewotCQkJCWlmICh0YXNrRGVzY1RvTmV3U3RlcHNNYXAgPT0gbnVsbCkgewotCQkJCQl0YXNrRGVzY1RvTmV3U3RlcHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCX0KLQkJCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCVRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkJCQkJaWYgKHRhc2sgIT0gbnVsbCAmJiAhKChFT2JqZWN0KSB0YXNrKS5lSXNQcm94eSgpKSB7Ci0JCQkJCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2sKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCB0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCksIGNvbmZpZyk7Ci0JCQkJCQkKLQkJCQkJCS8vIGFkZCB0aG9zZSBzdGVwcyB0byBUYXNrRGVzY3JpcHRvciBpZiB0aGV5IGFyZSBub3QgdGhlcmUKLQkJCQkJCS8vIHlldC4KLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgbmV3U3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkucmV0YWluQWxsKHN0ZXBzKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IHN0ZXAgPSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJaWYgKCF0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY29udGFpbnMoc3RlcCkpIHsKLQkJCQkJCQkJbmV3U3RlcHMuYWRkKHN0ZXApOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghbmV3U3RlcHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbChuZXdTdGVwcyk7Ci0JCQkJCQkJdGFza0Rlc2NUb05ld1N0ZXBzTWFwLnB1dCh0YXNrRGVzYywgbmV3U3RlcHMpOwotLy8JCQkJCQkJU3lzdGVtLm91dAotLy8JCQkJCQkJLnByaW50bG4oIkJTRHJvcENvbW1hbmQudXBkYXRlVGFza0Rlc2NyaXB0b3JzKCk6IGNoYW5nZWQiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9VcGRhdGVUYXNrRGVzY3JpcHRvcnMoKSB7Ci0JCWlmICh0YXNrRGVzY1RvTmV3U3RlcHNNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza0Rlc2NUb05ld1N0ZXBzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkucmVtb3ZlQWxsKAotCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR28gdGhydSBhbGwgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBvZiB0aGlzIGFjdGl2aXR5IGFuZCBzZXQgdGhlCi0JICogcmVzcG9uc2libGUgcm9sZSBmb3IgdGhlbSBpZiB0aGVyZSBpcyBhbnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UmVzcG9uc2libGVSb2xlcygpIHsKLQkJaWYoIXN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgPSBuZXcgQmF0Y2hDb21tYW5kKHRydWUpOwotIAotCQlMaXN0IGJyRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlMaXN0IHdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBickVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCXdwRGVzY0xpc3QuYWRkKG9iaik7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJcm9sZURlc2NyaXB0b3JzLmFkZChvYmopOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZURlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpOwotCQkJUm9sZSByb2xlID0gcm9sZURlc2MuZ2V0Um9sZSgpOwotCQkJaWYgKHJvbGUgIT0gbnVsbCkgewkJCQkKLQkJCQlMaXN0IHJlc3BvbnNpYmxlV29ya1Byb2R1Y3RzID0gKExpc3QpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZShyb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIGNvbmZpZyk7Ci0JCQkJTGlzdCByZXNwb25zaWJsZVdQRExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaiA9IHdwRGVzY0xpc3Quc2l6ZSgpIC0gMTsgaiA+IC0xOyBqLS0pIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwRGVzY0xpc3QKLQkJCQkJCQkuZ2V0KGopOwotLy8JCQkJCVJvbGVEZXNjcmlwdG9yIHJlc3BvbnNpYmxlUm9sZURlc2MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9yKHdwRGVzYyk7Ci0vLwkJCQkJaWYgKHJlc3BvbnNpYmxlV29ya1Byb2R1Y3RzLmNvbnRhaW5zKHdwRGVzYwotLy8JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpCi0vLwkJCQkJCQkmJiAgcmVzcG9uc2libGVSb2xlRGVzYyAhPSByb2xlRGVzYykgewotLy8JCQkJCQl3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5wdXQod3BEZXNjLCByZXNwb25zaWJsZVJvbGVEZXNjKTsKLS8vLy8JCQkJCQl3cERlc2Muc2V0UmVzcG9uc2libGVSb2xlKHJvbGVEZXNjKTsKLS8vCQkJCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQod3BEZXNjKTsKLS8vCQkJCQl9Ci0JCQkJCQotCQkJCQlpZihyZXNwb25zaWJsZVdvcmtQcm9kdWN0cy5jb250YWlucyh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQkJCXJlc3BvbnNpYmxlV1BETGlzdC5hZGQod3BEZXNjKTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJaWYoIXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuZXF1YWxzKHJlc3BvbnNpYmxlV1BETGlzdCkpIHsKLQkJCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWVzKHJvbGVEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCByZXNwb25zaWJsZVdQRExpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IudW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCQotCQkvLyByZW1vdmUgYW55IG9iamVjdCB0aGF0IGhhZCBiZWVuIGFkZGVkIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJaWYgKGFkZGVkT2JqZWN0cyAhPSBudWxsICYmICFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGRlZFRvRGVmYXVsdENvbmZpZyA9IGZhbHNlOwotCQl9Ci0KLQkJdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCk7Ci0KLQkJZG9VbmRvKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVuZG9DbGVhckRlc2NyaXB0b3JzKCkgewotCQlpZihkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpOwotCQkJCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWRlc2MKLQkJCQkJLmVTZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCksIGVudHJ5Ci0JCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVuZG9lcyB0aGUgY2hhbmdlIG1hZGUgYnkKLQkgKiB7QGxpbmsgI3NldFJlc3BvbnNpYmxlUm9sZXMoKSBzZXRSZXNwb25zaWJsZVJvbGVzKCkgfQotCSAqLwotCXByaXZhdGUgdm9pZCB1bmRvU2V0UmVzcG9uc2libGVSb2xlKCkgewotLy8JCWlmKHdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwICE9IG51bGwgJiYgIXdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwLmlzRW1wdHkoKSkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotLy8JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpOwotLy8JCQkJKChSb2xlRGVzY3JpcHRvcikgZW50cnkuZ2V0VmFsdWUoKSkuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmUod3BkKTsKLS8vCQkJfQotLy8JCX0KLQkJaWYocmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kLnVuZG8oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0V4ZWN1dGUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvVW5kbygpOwotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUV4ZWN1dG9yIHsKLQkJYm9vbGVhbiBwcmVFeGVjdXRlKCk7Ci0KLQkJdm9pZCBkb0V4Y2VjdXRlKCk7Ci0KLQkJdm9pZCBkb1VuZG8oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Jhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTgwZTAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Jhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSA3LjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZAotCQlpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgTk9ORU1QVFlfQVRUUklCVVRFUyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoCi0JCQluZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKQotCQkJfQotCSkpOwotCQotCi0JcHJvdGVjdGVkIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgU2V0IHN5bmNoRmVhdHVyZXM7Ci0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgSGFzaE1hcCBmZWF0dXJlTWFwOwotCi0JcHVibGljIEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBzeW5jaEZlYXR1cmVzLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQlpZiAoc3luY2hGZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBCU0Ryb3BDb21tYW5kLkRFRkFVTFRfU1lOQ0hfRkVBVFVSRVM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl9Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYoZGVzY3JpcHRvci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChkZXNjcmlwdG9yLmVSZXNvdXJjZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVPbGRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgZGVzY3JpcHRvci5lR2V0KGZlYXR1cmUpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbGlua2VkIGVsZW1lbnQgaWYgcmVxdWlyZWQKLQkJLy8KLQkJTWV0aG9kRWxlbWVudCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCU9iamVjdCByZXNvbHZlZCA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlnKTsKLQkJaWYocmVzb2x2ZWQgIT0gZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwkJCQkJCi0JCQl9Ci0JCQllbHNlIGlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7CQkJCQkKLQkJCX0KLQkJCWVsc2UgaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsJCQkJCQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZmVhdHVyZSA9IG51bGw7Ci0JCQl9Ci0JCQlzYXZlT2xkRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQkJZSA9IChNZXRob2RFbGVtZW50KSByZXNvbHZlZDsKLQkJCWRlc2NyaXB0b3IuZVNldChmZWF0dXJlLCBlKTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3luY2hGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBmID0gaXRlci5uZXh0KCk7Ci0JCQlpZihmIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGY7IAotCQkJCUVBdHRyaWJ1dGUgZGVzY0F0dHJpYiA9IChFQXR0cmlidXRlKSBCU0Ryb3BDb21tYW5kLkZFQVRVUkVfTUFQLmdldChhdHRyaWIpOwotCQkJCWlmKGRlc2NBdHRyaWIgIT0gbnVsbCkgewotCQkJCQlpZihOT05FTVBUWV9BVFRSSUJVVEVTLmNvbnRhaW5zKGF0dHJpYikpIHsKLQkJCQkJCS8vIHJlZnJlc2ggYXR0cmlidXRlIHRoYXQgY2FuIG5vdCBiZSBlbXB0eQotCQkJCQkJLy8KLQkJCQkJCU9iamVjdCB2YWx1ZSA9ICBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ID8gCi0JCQkJCQkJCShTdHJpbmcpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCBhdHRyaWIsIGNvbmZpZykgCi0JCQkJCQkJCTogZS5lR2V0KGF0dHJpYik7Ci0JCQkJCQkvLyBpZiBhdHRyaXVidXRlIGlzIHByZXNlbnRhdGlvbiBuYW1lIGFuZCBuZXcgdmFsdWUgaXMgYmxhbmssIGNvcHkgbmFtZSBvdmVyCi0JCQkJCQlpZiAoKGRlc2NBdHRyaWIuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKSkgJiYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl2YWx1ZSA9IGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgPyAKLQkJCQkJCQkJCShTdHJpbmcpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBjb25maWcpIAotCQkJCQkJCQkJOiBlLmVHZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCQlPYmplY3QgZGVzY1ZhbHVlID0gZGVzY3JpcHRvci5lR2V0KGRlc2NBdHRyaWIpOwotCQkJCQkKLQkJCQkJCWlmKCh2YWx1ZSA9PSBudWxsICYmIGRlc2NWYWx1ZSAhPSBudWxsKSB8fCAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKGRlc2NWYWx1ZSkpKSB7Ci0JCQkJCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShkZXNjQXR0cmliKTsKLQkJCQkJCQlkZXNjcmlwdG9yLmVTZXQoZGVzY0F0dHJpYiwgdmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcmVzZXQgYXR0cmlidXRlIHRvIGl0cyBkZWZhdWx0IHZhbHVlCi0JCQkJCQkvLwotCQkJCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShkZXNjQXR0cmliKTsKLQkJCQkJCWRlc2NyaXB0b3IuZVNldChkZXNjQXR0cmliLCBkZXNjQXR0cmliLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmKGZlYXR1cmVNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbnRyeQotCQkJCS5nZXRLZXkoKTsKLQkJCQl0cnkgewotCQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0JCi0JCQlmZWF0dXJlTWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihmZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAuY2xlYXIoKTsKLQkJCWZlYXR1cmVNYXAgPSBudWxsOwotCQl9CQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MzUyNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBWYXJ5QWN0aXZpdHlDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIENvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7Ci0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kI2RvVmFyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYXJ5KCkgewotCQlQcm9jZXNzVXRpbC5jb250cmlidXRlVG9BY3Rpdml0eSh3cmFwcGVyLCBjcmVhdGVkQWN0aXZpdGllcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db3B5SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db3B5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmJhNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29weUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIENvcHlIZWxwZXIgZXh0ZW5kcyBDb3B5Q29tbWFuZC5IZWxwZXIgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTI2NDM4OTM5Mzk1NTYzOTAwNEw7Ci0KLQlwcml2YXRlIE1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBNYXAgYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBiYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBCcmVha2Rvd25FbGVtZW50PiB3cmFwcGVyUGF0aFRvQ29weU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQnJlYWtkb3duRWxlbWVudD4oKTsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuSGFzaE1hcCNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7CQkKLQkJc3VwZXIuY2xlYXIoKTsKLQkJY29weVRvT3JpZ2luYWxNYXAuY2xlYXIoKTsKLQkJYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLmNsZWFyKCk7Ci0JCWJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5jbGVhcigpOwotCQl3cmFwcGVyUGF0aFRvQ29weU1hcC5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE9yaWdpbmFsKE9iamVjdCBjb3B5KSB7Ci0JCXJldHVybiBjb3B5VG9PcmlnaW5hbE1hcC5nZXQoY29weSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcHV0VmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJcmV0dXJuIGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5wdXQoYmFzZSwgdmUpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHJlbW92ZVZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQlyZXR1cm4gYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLnJlbW92ZShiYXNlKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBwdXRCYWNrdXBDb3B5KFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgYmFja3VwKSB7Ci0JCXJldHVybiBiYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAucHV0KGJhc2UsIGJhY2t1cCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIjcHV0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgcHV0KEVPYmplY3Qga2V5LCBFT2JqZWN0IHZhbHVlKSB7Ci0JCWNvcHlUb09yaWdpbmFsTWFwLnB1dCh2YWx1ZSwga2V5KTsKLQkJcmV0dXJuIHN1cGVyLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBiYXNpY1B1dChFT2JqZWN0IGtleSwgRU9iamVjdCB2YWx1ZSkgewotCQlPYmplY3Qgb2xkID0gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotCQlpbml0aWFsaXphdGlvbkxpc3QucmVtb3ZlKGtleSk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyI2dldENvcHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Q29weShFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCU9iamVjdCB2ZSA9IGdldFZhcmlhYmlsaXR5RWxlbWVudChiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAsIG9iamVjdCk7Ci0JCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENvcHkoKEVPYmplY3QpIHZlKTsKLQkJCX0KLQkJfQotCQlFT2JqZWN0IGNvcHkgPSBzdXBlci5nZXRDb3B5KG9iamVjdCk7Ci0JCWlmKGNvcHkgPT0gbnVsbCkgewotCQkJLy8gZ2V0IGJhY2t1cCBjb3B5Ci0JCQkvLwotCQkJT2JqZWN0IHZlID0gZ2V0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcCwgb2JqZWN0KTsKLQkJCWlmKHZlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0Q29weSgoRU9iamVjdCkgdmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KE1hcCBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAsIE9iamVjdCBiYXNlKSB7Ci0JCU9iamVjdCB2ZSA9IG51bGw7CQkKLQkJZG8gewotCQkJYmFzZSA9IGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5nZXQoYmFzZSk7Ci0JCQlpZihiYXNlICE9IG51bGwpIHsKLQkJCQl2ZSA9IGJhc2U7Ci0JCQl9Ci0JCX0gd2hpbGUgKGJhc2UgIT0gbnVsbCk7Ci0JCXJldHVybiB2ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIjZ2V0Q29weVRhcmdldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5VGFyZ2V0KEVPYmplY3QgdGFyZ2V0LCBib29sZWFuIGNvcHlSZXF1aXJlZCkgewotCQlpZihjb3B5UmVxdWlyZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRDb3B5KHRhcmdldCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkodGFyZ2V0KTsKLQkJCWlmIChjb3BpZWQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJfQotCQkJcmV0dXJuIGNvcGllZDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTWFwIGdldE9iamVjdFRvQ29weU1hcCgpIHsKLQkJSGFzaFNldCBvYmplY3RzID0gbmV3IEhhc2hTZXQoYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLmtleVNldCgpKTsKLQkJb2JqZWN0cy5hZGRBbGwoYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLmtleVNldCgpKTsKLQkJb2JqZWN0cy5hZGRBbGwoa2V5U2V0KCkpOwkJCi0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJbWFwLnB1dChvYmplY3QsIGdldENvcHkoKEVPYmplY3QpIG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCBwdXRXcmFwcGVyQ29weShTdHJpbmcgZ3VpZFBhdGgsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQl3cmFwcGVyUGF0aFRvQ29weU1hcCAucHV0KGd1aWRQYXRoLCBlKTsKLQl9Ci0JCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0V3JhcHBlckNvcHkoU3RyaW5nIGd1aWRQYXRoKSB7Ci0JCXJldHVybiB3cmFwcGVyUGF0aFRvQ29weU1hcC5nZXQoZ3VpZFBhdGgpOwotCX0KLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBCcmVha2Rvd25FbGVtZW50PiBnZXRXcmFwcGVyUGF0aFRvQ29weU1hcCgpIHsKLQkJcmV0dXJuIHdyYXBwZXJQYXRoVG9Db3B5TWFwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkY2M5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIEV4ZWN1dGVzIHRoZSBDcmVhdGUgUHJvY2VzcyBDb21wb25lbnQgY29tbWFuZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ2hpbGRDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248RUNsYXNzPiBFQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PEVDbGFzcz4oKTsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQotCXN0YXRpYyB7Ci0JCUVDTEFTU0VTLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGFyZUJ5TmFtZSBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWV0aG9kRWxlbWVudD4gewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShNZXRob2RFbGVtZW50IG9iajEsIE1ldGhvZEVsZW1lbnQgb2JqMikgewotCQkJU3RyaW5nIG5hbWUxLCBuYW1lMjsKLQkJCWlmIChQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpIHsKLQkJCQluYW1lMSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShvYmoxKTsKLQkJCQluYW1lMiA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShvYmoyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZTEgPSAoKE1ldGhvZEVsZW1lbnQpIG9iajEpLmdldE5hbWUoKTsKLQkJCQluYW1lMiA9ICgoTWV0aG9kRWxlbWVudCkgb2JqMikuZ2V0TmFtZSgpOwkJCi0JCQl9Ci0JCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lMik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ29uZmlnVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQkJcHVibGljIElTdGF0dXMgaXNWYWxpZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqID09IG51bGwpIHsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMubm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldElkKCksIDAsIG1zZywgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbiwgSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgsIHNlbGVjdGlvbiwgaGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkob3duZXIpOwotCQkKLQkJT2JqZWN0IHNoZWxsID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJCi0JCS8vIFRoZSBvd25lciBtdXN0IGJlIHVwZGF0YWJsZS4KLQkJLy8KLQkJc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KG93bmVyLCBzaGVsbCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBjb25maWdzID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlMaXN0IG1ldGhvZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpKSB7Ci0JCQkJbWV0aG9kQ29uZmlncy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWV0aG9kQ29uZmlncy5pc0VtcHR5KCkpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJCTAsIExpYnJhcnlFZGl0UmVzb3VyY2VzLm5vQ29uZmlnRXJyb3JfbXNnLCBudWxsKTsKLS8vCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLS8vCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jcmVhdGVQcm9jZXNzX3RleHQsCi0vLwkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMubm9Db25maWdFcnJvcl9tc2cpOwkJCQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgaGVscGVyOwotCi0JCUFycmF5TGlzdCBwcm9jQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGFkYXB0ZXIuZ2V0UHJvY2Vzc1R5cGUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQlwcm9jQ2xhc3Nlcy5hZGQoRGVsaXZlcnlQcm9jZXNzLmNsYXNzKTsKLQkJCXByb2NDbGFzc2VzLmFkZChDYXBhYmlsaXR5UGF0dGVybi5jbGFzcyk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFbGVtZW50KSBvd25lcik7CQkKLQkJTGlzdCBiYXNlUHJvY0xpc3QgPSBUbmdVdGlsLmdldEF2YWlsYWJsZUJhc2VQcm9jZXNzZXMocGx1Z2luLAotCQkJCXByb2NDbGFzc2VzKTsKLQotCQkvLyBzb3J0IGJ5IG5hbWUKLQkJQ29sbGVjdGlvbnMuc29ydChtZXRob2RDb25maWdzLCBuZXcgQ29tcGFyZUJ5TmFtZSgpKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gcHJvY0N0eHMgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvblttZXRob2RDb25maWdzCi0JCQkJLnNpemUoKV07Ci0JCW1ldGhvZENvbmZpZ3MudG9BcnJheShwcm9jQ3R4cyk7Ci0KLQkJUHJvY2Vzc1tdIGJhc2VQcm9jZXNzZXMgPSBuZXcgUHJvY2Vzc1tiYXNlUHJvY0xpc3Quc2l6ZSgpXTsKLQkJYmFzZVByb2NMaXN0LnRvQXJyYXkoYmFzZVByb2Nlc3Nlcyk7Ci0KLQkJZmluYWwgUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZDsKLQkJRUNsYXNzIHByb2NUeXBlID0gYWRhcHRlci5nZXRQcm9jZXNzVHlwZSgpOwotCQlwcm9jQ29tcC5zZXRQcm9jZXNzKChQcm9jZXNzKSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUocHJvY1R5cGUpKTsKLQkJCi0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJTGlzdCB1c2VySW5wdXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmFsaWRhdG9yIG5hbWVWYWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCW93bmVyLCBwcm9jQ29tcCk7Ci0JCS8vIG5hbWUKLQkJVXNlcklucHV0IG5hbWVJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMubmFtZUxhYmVsX3RleHQsIFVzZXJJbnB1dC5URVhULAotCQkJCWZhbHNlLCBudWxsLCBudWxsLCBuYW1lVmFsaWRhdG9yLCBudWxsKTsKLQkJdXNlcklucHV0cy5hZGQobmFtZUlucHV0KTsKLQkJCi0JCS8vIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkvLwotCQlVc2VySW5wdXQgZGVmYXVsdENvbmZpZ0lucHV0ID0gbmV3IFVzZXJJbnB1dChMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dCwgVXNlcklucHV0LlNFTEVDVElPTiwKLQkJCQlmYWxzZSwgbWV0aG9kQ29uZmlncywgbmV3IEl0ZW1MYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpCi0JCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQkJCQllbHNlIHJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfSwgbmV3IENvbmZpZ1ZhbGlkYXRvcigpLCBudWxsKTsKLQkJdXNlcklucHV0cy5hZGQoZGVmYXVsdENvbmZpZ0lucHV0KTsKLQkJLy8gYmFzZSBwcm9jZXNzCi0JCVVzZXJJbnB1dCBiYXNlUHJvY0lucHV0ID0gbnVsbDsKLQkJCi0JCWlmKHByb2NDb21wLmdldFByb2Nlc3MoKSBpbnN0YW5jZW9mIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKSB7Ci0JCQliYXNlUHJvY0lucHV0ID0gbmV3IFVzZXJJbnB1dChMaWJyYXJ5RWRpdFJlc291cmNlcy5iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dCwgVXNlcklucHV0LlNFTEVDVElPTiwKLQkJCQkJdHJ1ZSwgYmFzZVByb2NMaXN0LCBuZXcgQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSksICBudWxsKTsKLQkJCXVzZXJJbnB1dHMuYWRkKGJhc2VQcm9jSW5wdXQpOwotCQl9Ci0JCQotCQlib29sZWFuIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLkNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kX01lc3NhZ2UsIAotCQkJCVRuZ1V0aWwuZ2V0VHlwZVRleHQocHJvY1R5cGUuZ2V0TmFtZSgpKS50b0xvd2VyQ2FzZSgpKTsKLQkJCi0JCS8vIHJlcXVlc3QgaW5wdXQKLQkJaWYgKHVpSGFuZGxlci5yZXF1ZXN0SW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMubmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZSwgCi0JCQkJbXNnLCB1c2VySW5wdXRzKSkgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lSW5wdXQuZ2V0SW5wdXQoKTsKLQkJCXByb2NDb21wLnNldE5hbWUobmFtZSk7Ci0JCQlwcm9jZXNzID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJcHJvY2Vzcy5zZXROYW1lKG5hbWUpOwotCQkJcHJvY2Vzcy5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQkJcHJvY2Vzcy5zZXREZWZhdWx0Q29udGV4dCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZGVmYXVsdENvbmZpZ0lucHV0LmdldElucHV0KCkpOwotCQkJaWYoYmFzZVByb2NJbnB1dCAhPSBudWxsKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIGJhc2VQcm9jSW5wdXQuZ2V0SW5wdXQoKTsKLQkJCQlpZighbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJKChQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSlwcm9jQ29tcCkuZ2V0QmFzZWRPblByb2Nlc3NlcygpLmFkZEFsbChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYW5FeGVjdXRlID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChjYW5FeGVjdXRlKSB7Ci0JCQkvLyBjcmVhdGUgcHJvY2VzcyBjb21wb25lbnQgbmVlZCB0byB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdAotCQkJLy8gaGFzIGJlZW4gc2VsZWN0ZWQgYXMKLQkJCS8vIGRlZmF1bHQgY29udGV4dCBvZiBpdHMgcHJvY2Vzcy4gQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotCQkJLy8gaXMgdXBkYXRhYmxlCi0JCQkvLwotCQkJc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KHByb2NDb21wLmdldFByb2Nlc3MoKQotCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKSwgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlzdXBlci5leGVjdXRlKCk7Ci0KLQkJCUNvbW1hbmQgY21kID0gZ2V0Q29tbWFuZCgpOwotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSAoKE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSBjbWQpLmdldFN0YXR1cygpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBwcm9jQ3R4ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCi0JCQkvLyBuZWVkIHRvIGFkZCB0aGUgcGFyZW50IHBhY2thZ2VzIGFuZCBwbHVnaW4gaW50byB0aGUgY29uZmlndXJhdGlvbgotCQkJLy8gYXMgd2VsbAotCQkJLy8gTmV3IHByb2Nlc3MgaW4gbmV3IHBsdWctaW4gbm90IGF1dG9tYXRpY2FsbHkgdmlzaWJsZSBpbgotCQkJLy8gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQlMaXN0IHBrZ3MgPSBwcm9jQ3R4LmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCWZvciAoRU9iamVjdCBvYmogPSBwcm9jQ29tcDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlwa2dzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJCXByb2NDdHguZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCQkKLQkJCXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuYWRkKHByb2NDdHgpOwotCQkJcHJvY2Vzcy5zZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKHByb2Nlc3MpKTsKLQotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiBwYXJlbnQgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpIG93bmVyKS5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpCi0JCQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiBuZXdseSBjcmVhdGVkCi0JCQkJCQkJLy8gUHJvY2Vzc0NvbXBvbmVudCBhZ2FpbiBhZnRlciBjcmVhdGluZyBwcm9jZXNzJ3MKLQkJCQkJCQkvLyBwcmVzZW50YXRpb24KLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShwcm9jQ29tcC5lUmVzb3VyY2UoKSk7Ci0KLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0KLQkJCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiB0aGUgcHJvY2VzcydzIGRlZmF1bHQKLQkJCQkJCQkvLyBjb250ZXh0Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocHJvY0N0eC5lUmVzb3VyY2UoKSk7Ci0KLQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gY3JlYXRlIG5ldyBkaWFncmFtIGZpbGUKLQkJCQkJCQkvLwotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbigKLQkJCQkJCQkJCU5MUwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQlwcm9jQ29tcC5nZXROYW1lKCkpLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkucnVuV2l0aFByb2dyZXNzKAotCQkJCQkJCXJ1bm5hYmxlLAotCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZSwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcHJvY0NvbXAuZ2V0TmFtZSgpIH0pKTsgCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlzdXBlci5yZWRvKCk7Ci0JCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGQ7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gcHJvY0N0eCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKHByb2NDdHggaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHByb2NDdHgpLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoCi0JCQkJCXByb2NDb21wKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBwcm9jQ3R4ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAocHJvY0N0eCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCSgoTWV0aG9kQ29uZmlndXJhdGlvbikgcHJvY0N0eCkuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLnJlbW92ZSgKLQkJCQkJY2hpbGQpOwotCQl9Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlUm9sZURlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVJvbGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDc3ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlUm9sZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLTsKLQotLyoqCi0gKiBEZWxldGUgcm9sZSBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVJvbGVEZXNjcmlwdG9yIGV4dGVuZHMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgTGlzdCBub3RVc2VkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnJvbGVEZXNjID0gcm9sZURlc2M7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJcm9sZURlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChyb2xlRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmIChyb2xlRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQocm9sZURlc2MuZVJlc291cmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIERlbGV0ZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMpIHsKLQkJdGhpcyhyb2xlRGVzYyk7Ci0JCXRoaXMuZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2V0IHJlZkxpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGdldCBSb2xlRGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHJlZmVyZW5jZXMKLQkJTGlzdCBhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKTsKLQkJTGlzdCBhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYyk7Ci0JCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpOwotCQlyZWZMaXN0LmFkZEFsbChhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyk7Ci0JCXJlZkxpc3QuYWRkQWxsKGFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMpOwotCQlyZWZMaXN0LmFkZEFsbChwcmltYXJ5VGFza0Rlc2NyaXB0b3JzKTsKLQkJcmVmTGlzdC5hZGRBbGwocm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMocm9sZURlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQlyb2xlRGVzYyk7Ci0JCQkJCQkKLQkJCQkJCWRlbGV0ZShyZWZUb0JlRGVsZXRlZCk7Ci0JCQl9Ci0JCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciByZWxhdGlvbnNoaXBzCi0vLwkJY2xlYXIocm9sZURlc2MuZ2V0QXNzaXN0c0luKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCXRkLmdldEFzc2lzdGVkQnkoKS5yZW1vdmUocm9sZURlc2MpOwotCQl9Ci0vLwkJY2xlYXIocm9sZURlc2MuZ2V0UGVyZm9ybXNBZGRpdGlvbmFsbHkoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZShyb2xlRGVzYyk7Ci0JCX0KLS8vCQljbGVhcihyb2xlRGVzYy5nZXRQZXJmb3Jtc0FzT3duZXIoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLnJlbW92ZShyb2xlRGVzYyk7Ci0JCX0KLQkJY2xlYXIocm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0KLQkJLy8gaWYgcm9sZSBpcyBwYXJ0IG9mIGFueSB0ZWFtLCBwbGVhc2UgcmVtb3ZlIGl0IGZyb20gdGVhbSBhcyB3ZWxsCi0JCUxpc3QgdGVhbXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMocm9sZURlc2MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUocm9sZURlc2MpOwotCi0JCQkvLyBmaW5kIG1hdGNoaW5nIHJvbGVEZXNjcmlwdG9yIGluIHRlYW0gcm9sZXMKLQkJCU9iamVjdCB0ZWFtUm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkuZmluZFJvbGVEZXNjcmlwdG9yKHRlYW0sIHJvbGVEZXNjKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKHRlYW1Sb2xlRGVzYyk7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyKExpc3QgbGlzdCkgewotCQl0cnkgewotCQkJaWYgKChsaXN0ICE9IG51bGwpICYmIChsaXN0LnNpemUoKSA+IDApKSB7Ci0KLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxZTgyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuUmVmZXJlbmNlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotCi0KLS8qKgotICogRGVsZXRlIFRhc2sgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBMaXN0IG5vdFVzZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYykgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQl0YXNrRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHRhc2tEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRGVsZXRlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsCi0JCQlib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcykgewotCQl0aGlzKHRhc2tEZXNjKTsKLQkJdGhpcy5mb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTZXQgcmVmTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLy8gZ2V0IFRhc2tEZXNjcmlwdG9yIHJlbGF0aW9uc2hpcHMgcmVmZXJlbmNlcwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRPdXRwdXQoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQotCQkJLy8gY2hlY2sgYWxsIGl0J3MgcmVmZXJlbmNlcwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXModGFza0Rlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQl0YXNrRGVzYyk7Ci0JCQkJCQkKLQkJCQkJCWRlbGV0ZShyZWZUb0JlRGVsZXRlZCk7Ci0JCQl9Ci0JCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIHRhc2tkZXNjcmlwdG9yIHJlbGF0aW9uc2hpcAotCQljbGVhcih0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldE91dHB1dCgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhcihMaXN0IGxpc3QpIHsKLQkJdHJ5IHsKLQkJCWlmICgobGlzdCAhPSBudWxsKSAmJiAobGlzdC5zaXplKCkgPiAwKSkgewotCQkJCWxpc3QuY2xlYXIoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRlYW1Qcm9maWxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzM4YTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRlYW1Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlVGVhbVByb2ZpbGUgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlVGVhbVByb2ZpbGUoVGVhbVByb2ZpbGUgdGVhbSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGVhbSA9IHRlYW07Ci0KLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudEFjdGl2aXR5KHRlYW0pOwotCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmICh0ZWFtLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0ZWFtLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gZ2V0IGFsbCBzdWJ0ZWFtIHJlY3Vyc2l2ZWx5Ci0JCUxpc3QgdGVhbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldFN1YlRlYW1zKHRlYW0sIHRlYW1MaXN0KTsKLQotCQl0ZWFtTGlzdC5hZGQodGVhbSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZWFtTGlzdC5zaXplKCk7IGkrKykgewotCQkJVGVhbVByb2ZpbGUgdHQgPSAoVGVhbVByb2ZpbGUpIHRlYW1MaXN0LmdldChpKTsKLQkJCS8vIGNsZWFyIHRlYW0ncyByb2xlZGVzY3JpcHRvcgotCQkJdHQuZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3ViVGVhbXMoVGVhbVByb2ZpbGUgdGVhbSwgTGlzdCB0ZWFtTGlzdCkgewotCQlMaXN0IGxpc3QgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlUZWFtUHJvZmlsZSB0dCA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0JCQkJdGVhbUxpc3QuYWRkKHR0KTsKLQkJCQlnZXRTdWJUZWFtcyh0dCwgdGVhbUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgYnJlYWtkb3duZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Mzk3MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUludGVyYWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgZm9yIGNsZWFuLXVwIHVudXNlZCBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIAotaW1wbGVtZW50cyBJSW50ZXJhY3RpdmUKLXsKLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0JcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzVG9EZWxldGU7Ci0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVDaGlsZHJlbjsKLQlwcml2YXRlIENvbGxlY3Rpb24gZGVsZXRlZERlc2NyaXB0b3JzOwotCXByaXZhdGUgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdXNlckludGVyYWN0aW9uSGFuZGxlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cyBsaXN0IG9mIGVsZW1lbnRzIHRvIGNoZWNrIGZvciB1bnVzZWQgZGVzY3JpcHRvcnMgdG8gZGVsZXRlIAotCSAqIEBwYXJhbSBpbmNsdWRlQ2hpbGRyZW4gaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBjaGVjayB0aGUgb2Zmc3RyaW5nIG9mIGFjdGl2aXRpZXMgaW4gdGhlIGdpdmVuIGVsZW1lbnRzCi0JICovCi0JcHVibGljIERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzLCBib29sZWFuIGluY2x1ZGVDaGlsZHJlbiwgQ29sbGVjdGlvbiBkZWxldGVkRGVzY3JpcHRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmluY2x1ZGVDaGlsZHJlbiA9IGluY2x1ZGVDaGlsZHJlbjsKLQkJdGhpcy5kZWxldGVkRGVzY3JpcHRvcnMgPSBkZWxldGVkRGVzY3JpcHRvcnM7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4gU3ViY2xhc3NzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybiB0aGUgZXhlY3V0ZWQgY29tbWFuZCB0aGF0IGRlbGV0ZWQgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpOwotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGZpbmQgYWxsIHJvbGUgYW5kIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB0aGF0IGFyZSBub3QgdXNlZAotCQkvLyBpbiBhbnkgcmVsYXRpb25zaGlwCi0JCS8vIGFuZCBkZWxldGUgdGhlbQotCQkvLwotCQlpZiAoZGVzY3JpcHRvcnNUb0RlbGV0ZSA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaXRlcjsKLQkJCWlmKGluY2x1ZGVDaGlsZHJlbikgewotCQkJCWl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudHMsIGZhbHNlKSB7Ci0JCQkJCQotCQkJCQkKLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NzE4ODg5NDA5NDAzMTQxNzA3TDsKLQkJCQkJCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlpZiAob2JqZWN0ID09IGVsZW1lbnRzKSB7Ci0JCQkJCQkJcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpIG9iamVjdCkKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCUFycmF5TGlzdCBjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmKGRlbGV0ZWREZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkJLy8gYWRkIGRlbGV0ZWQgZGVzY3JpcHRvcnMgdG8gdGhlIGxpc3QgYmVmb3JlIGNoZWNraW5nIGZvciB1bnVzZWQgZGVzY3JpcHRvcnMKLQkJCQkvLyB0aG9zZSBkZWxldGVkIGRlc2NyaXB0b3JzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFmdGVyIHRoZSBjaGVjawotCQkJCS8vCi0JCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuYWRkQWxsKGRlbGV0ZWREZXNjcmlwdG9ycyk7Ci0JCQl9Ci0JCQlmb3IgKDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCWlmICghUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcygKLQkJCQkJCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSwgKERlc2NyaXB0b3IpIGVsZW1lbnQpKSB7Ci0JCQkJCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5yZW1vdmVBbGwoZGVsZXRlZERlc2NyaXB0b3JzKTsKLQkJCWlmICghY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQkJc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZShjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJaWYoIWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJCQlDb21tYW5kIGNtZCA9IGRlbGV0ZShjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQkJY29tbWFuZExpc3QuYWRkKGNtZCk7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvRGVsZXRlLmFkZEFsbChjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZighZGVzY3JpcHRvcnNUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCQljb21tYW5kTGlzdC5jbGVhcigpOwotCQkJCWFwcGVuZChkZWxldGUoZGVzY3JpcHRvcnNUb0RlbGV0ZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlKExpc3QgZGVzY3JpcHRvcnNUb0RlbGV0ZSkgewotCQlpZih1c2VySW50ZXJhY3Rpb25IYW5kbGVyICE9IG51bGwpIHsKLQkJCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZlcmVuY2VzOwotCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGVfbXNnOwkJCQotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChkZXNjcmlwdG9yc1RvRGVsZXRlKTsKLQkJCUNvbGxlY3Rpb24gc2VsZWN0ZWQgPSB1c2VySW50ZXJhY3Rpb25IYW5kbGVyLnNlbGVjdChsaXN0LCBsYWJlbFByb3ZpZGVyLCB0cnVlLCBsaXN0LCB0aXRsZSwgbXNnKTsKLQkJCWlmKHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWRlc2NyaXB0b3JzVG9EZWxldGUucmV0YWluQWxsKHNlbGVjdGVkKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JSW50ZXJhY3RpdmUjc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihJVXNlckludGVyYWN0aW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzJhMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogRGVsZXRlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IgZXh0ZW5kcyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3Qgbm90VXNlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy53cERlc2MgPSB3cERlc2M7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJd3BEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQod3BEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKHdwRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQod3BEZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywKLQkJCWJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzKSB7Ci0JCXRoaXMod3BEZXNjKTsKLQkJdGhpcy5mb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTZXQgcmVmTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJTGlzdCBtYW5kYXRvcnlJbnB1dFRvID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IGV4dGVybmFsSW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEV4dGVybmFsSW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IG9wdGlvbmFsSW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IG91dHB1dEZyb20gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXRGcm9tKHdwRGVzYyk7Ci0JCUxpc3QgcmVzcG9uc2libGVSb2xlRGVzY0xpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cERlc2MpOwotCQkvLyBnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHJlbGF0aW9uc2hpcHMgcmVmZXJlbmNlcwotCQlyZWZMaXN0LmFkZEFsbCh3cERlc2MuZ2V0SW1wYWN0ZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGRBbGwod3BEZXNjLmdldEltcGFjdHMoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKG1hbmRhdG9yeUlucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChleHRlcm5hbElucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChvcHRpb25hbElucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChvdXRwdXRGcm9tKTsKLQkJcmVmTGlzdC5hZGQocmVzcG9uc2libGVSb2xlRGVzY0xpc3QpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKHdwRGVzYywKLQkJCQkJCShEZXNjcmlwdG9yKSBvYmplY3QpKSB7Ci0JCQkJCWlmIChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG9iamVjdCkpIC8vIGNoZWNrCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG9jYWwKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkZXNjcmlwdG9yCi0JCQkJCQlub3RVc2VkUmVmZXJlbmNlcy5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIShub3RVc2VkUmVmZXJlbmNlcy5pc0VtcHR5KCkpKSB7Ci0JCQl0cnkgewotCQkJCU9iamVjdFtdIHJlZlRvQmVEZWxldGVkID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID8gbm90VXNlZFJlZmVyZW5jZXMKLQkJCQkJCS50b0FycmF5KCkKLQkJCQkJCTogUmVmZXJlbmNlU2VsZWN0aW9uLmdldFJlZmVyZW5jZXMobm90VXNlZFJlZmVyZW5jZXMsCi0JCQkJCQkJCXdwRGVzYyk7Ci0JCQkJCQlkZWxldGUocmVmVG9CZURlbGV0ZWQpOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFib3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB3cGRlc2MgYXJ0aWZhY3QgaGFzIGFueSBzdWItYXJ0aWZhY3RzCi0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih3cERlc2MsIChBcnRpZmFjdCkgbGlzdAotCQkJCQkJLmdldChpKSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQljaGlsZHJlbi5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTGlzdCBvYmplY3RzVG9DbGVhcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmplY3RzVG9DbGVhcmVkLmFkZCh3cERlc2MpOwotCQlvYmplY3RzVG9DbGVhcmVkLmFkZEFsbChjaGlsZHJlbik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gb2JqZWN0c1RvQ2xlYXJlZC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjT2JqID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCi0JCQkJLy8gd3BEZXNjT2JqLmdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldEV4dGVybmFsSW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE9wdGlvbmFsSW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE91dHB1dEZyb20oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRXb3JrZWRPbkJ5KCkuY2xlYXIoKTsKLQkJCQljbGVhcih3cERlc2NPYmouZ2V0SW1wYWN0ZWRCeSgpKTsKLQkJCQljbGVhcih3cERlc2NPYmouZ2V0SW1wYWN0cygpKTsKLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRFeHRlcm5hbElucHV0VG8oKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXh0ZXJuYWxJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRNYW5kYXRvcnlJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1hbmRhdG9yeUlucHV0VG8uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQl0ZC5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRPcHRpb25hbElucHV0VG8oKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3B0aW9uYWxJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRPdXRwdXRGcm9tKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dHB1dEZyb20uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQl0ZC5nZXRPdXRwdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzcG9uc2libGVSb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRoaXMuYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUod3BEZXNjKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyKExpc3QgbGlzdCkgewotCQl0cnkgewotCQkJaWYgKChsaXN0ICE9IG51bGwpICYmIChsaXN0LnNpemUoKSA+IDApKQotCQkJCWxpc3QuY2xlYXIoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3QgcGFyZW50RGVzY3JpcHRvciwgQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eShwYXJlbnREZXNjcmlwdG9yKTsKLQkJaWYgKGFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQkmJiAoYXJ0aWZhY3QgPT0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODUwOTRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLQotLyoqCi0gKiBDb21tYW5kIHRvIHN5bmNocm9uaXplIGRlc2NyaXB0b3IncyBhdHRyaWJ1dGVzIGFuZCBvd24gcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAxLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NGVjYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kIGV4dGVuZHMgQmF0Y2hDb21tYW5kIHsKLQlwcml2YXRlIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQlwcml2YXRlIENvbXBvdW5kQ29tbWFuZCByZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kOwotCXByaXZhdGUgU2V0IHN5bmNoRmVhdHVyZXM7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xlYXIKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZChib29sZWFuIGNsZWFyLCBTZXQgc3luY2hGZWF0dXJlcywgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoY2xlYXIpOwotCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgewotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCX0KLQkKLQl2b2lkIHNldERlc2NyaXB0b3JzVG9SZWZyZXNoKFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCkgewotCQl0aGlzLmRlc2NyaXB0b3JzVG9SZWZyZXNoID0gZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBudWxsOwotCQl9Ci0JCQotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKSB8fCAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JCQotCQkvLyBjcmVhdGUgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZAotCQkvLwotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFkZXNjcmlwdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkKLQkJCQkmJiByZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kID09IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZC5hcHBlbmQobmV3IEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChkZXNjLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpKTsJCQkJCi0JCQl9Ci0JCX0KLQotCQkvLyByZWZyZXNoIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQudW5kbygpOwotCQl9Ci0JCQotCQlzdXBlci51bmRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9HZW5lcmljRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2OThmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9HZW5lcmljRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLQotLyoqCi0gKiBEcm9wIGNvbW1hbmQgdG8gZHJvcCBhbnkgb2JqZWN0IG9uIGEgdGFyZ2V0IHRoYXQgc3VwcG9ydHMgYWRhcHRpbmcgZHJvcAotICogb2JqZWN0IHRvIGl0cyBvd24gb2JqZWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0Ryb3BDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBkcm9wRWxlbWVudHM7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmZWF0dXJlRWxlbWVudHM7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIEVPYmplY3QgdGFyZ2V0OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXI7Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kKEVPYmplY3QgdGFyZ2V0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCUNvbGxlY3Rpb24gZHJvcEVsZW1lbnRzLCBFbGVtZW50QWRhcHRlciBkcm9wQWRhcHRlcikgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5kcm9wRWxlbWVudHMgPSBkcm9wRWxlbWVudHM7Ci0JCXRoaXMuZHJvcEFkYXB0ZXIgPSBkcm9wQWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gY29tcGlsZSB0aGUgZmVhdHVyZUVsZW1lbnRzIGxpc3QKLQkJLy8KLQkJZmVhdHVyZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWVsZW1lbnQgPSBkcm9wQWRhcHRlci5hZGFwdChlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlmZWF0dXJlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCS8vIGlmKGNyZWF0ZURlc2NyaXB0b3IpIHsKLQkJCS8vIGZlYXR1cmVFbGVtZW50cy5hZGQoUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3IoKFJvbGUpCi0JCQkvLyBlbGVtZW50KSk7Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIGZlYXR1cmVFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoIWZlYXR1cmVFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCSgoTGlzdCkgdGFyZ2V0LmVHZXQoZmVhdHVyZSkpLmFkZEFsbChmZWF0dXJlRWxlbWVudHMpOwotCQkJaWYgKHRhcmdldC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQodGFyZ2V0LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkoKExpc3QpIHRhcmdldC5lR2V0KGZlYXR1cmUpKS5yZW1vdmVBbGwoZmVhdHVyZUVsZW1lbnRzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBmZWF0dXJlRWxlbWVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudEFkYXB0ZXIgewotCQkvKioKLQkJICogQWRhcHRzIHRoZSBkcm9wIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IGVsZW1lbnQgZm9yIHRoZSBkcm9wIHRhcmdldC4KLQkJICogCi0JCSAqIEBwYXJhbSBkcm9wRWxlbWVudAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlPYmplY3QgYWRhcHQoT2JqZWN0IGRyb3BFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0lBY3Rpb25UeXBlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9JQWN0aW9uVHlwZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTU4YTFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0lBY3Rpb25UeXBlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotcHVibGljIGNsYXNzIElBY3Rpb25UeXBlQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9QUklNQVJZX1BFUkZPUk1FUiA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfQURESVRJT05BTF9QRVJGT1JNRVIgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX0FTU0lTVEVEX0JZID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9FWFRFUk5BTF9JTlBVVCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfTUFOREFUT1JZX0lOUFVUID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9PUFRJT05BTF9JTlBVVCA9IDU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfT1VUUFVUID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9SRVNQT05TSUJMRV9GT1IgPSA3OwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NGRlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBsaW5raW5nIG1ldGhvZCBlbGVtZW50IHRvIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBEZXNjcmlwdG9yIGRlc2M7Ci0KLQlwcml2YXRlIE9iamVjdCBvYmo7Ci0KLQlwcml2YXRlIExpc3Qgb2JqZWN0czsKLQotCXByaXZhdGUgaW50IGZlYXR1cmVJRDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8qKgotCSAqIEFzc2lnbiByb2xlIHRvIHRhc2sgZGVzY3JpcHRvciBVc2VkIGZvciBib3RoIGFkZGl0aW9uYWxseSBwZXJmb3JtZWQgYnkKLQkgKiBhbmQgYXNzaXN0ZWQgYnkKLQkgKi8KLQlwdWJsaWMgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kKERlc2NyaXB0b3IgZGVzYywgT2JqZWN0IG9iaiwgaW50IGZlYXR1cmVJRCkgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhkZXNjKSk7Ci0KLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy5vYmogPSBvYmo7Ci0JCXRoaXMuZmVhdHVyZUlEID0gZmVhdHVyZUlEOwotCi0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW9iamVjdHMuYWRkKG9iaik7Ci0JCX0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCWlmIChkZXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ob2JqZWN0cykpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFvYmplY3RzLmlzRW1wdHkoKSkKLQkJCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRUYXNrKChUYXNrKSBvYmopOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkoKFJvbGVEZXNjcmlwdG9yKSBkZXNjKS5zZXRSb2xlKChSb2xlKSBvYmopOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2MpLnNldFdvcmtQcm9kdWN0KChXb3JrUHJvZHVjdCkgb2JqKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFvYmplY3RzLmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0KLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLnNldFRhc2sobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCSgoUm9sZURlc2NyaXB0b3IpIGRlc2MpLnNldFJvbGUobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCQkoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzYykuc2V0V29ya1Byb2R1Y3QobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGRlc2MuZVJlc291cmNlKCkgIT0gbnVsbCAmJiAhb2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzI5NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BY3Rpdml0eUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgNiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBMb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXN1cGVyKHdyYXBwZXIpOwkJCi0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCNkb1ZhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFyeSgpIHsKLQkJLy8gZGVlcCBjb3B5IHRoZSBhY3Rpdml0eQotCQkvLwotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY29uZmlybURlZXBDb3B5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWN0aXZpdHkpKSkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzID0gKFByb2Nlc3MpIHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlZXBDb3B5Q29uZmlnID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCB3cmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlBY3Rpdml0eUhhbmRsZXIgYWN0aXZpdHlIYW5kbGVyID0gbmV3IEFjdGl2aXR5SGFuZGxlcigpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0RGVlcENvcHlDb25maWcoZGVlcENvcHlDb25maWcpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0VGFyZ2V0UHJvY2Vzcyh0YXJnZXRQcm9jZXNzKTsKLQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGFjdGl2aXR5KTsKLQkJQWN0aXZpdHkgY29weSA9IChBY3Rpdml0eSkgYWN0aXZpdHlIYW5kbGVyLmdldEFjdGl2aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlzdXBlci5kb1ZhcnkoKTsKLQkJCi0JCS8vIHJlcGxhY2UgdGhlIGxvY2FsIHJlcGxhY2VtZW50IHdpdGggZGVlcCBjb3B5Ci0JCS8vCi0JCWludCBwb3MgPSBjcmVhdGVkQWN0aXZpdGllcy5zaXplKCkgLSAxOwotCQlBY3Rpdml0eSBsb2NhbFJlcGxhY2VtZW50ID0gKEFjdGl2aXR5KSBjcmVhdGVkQWN0aXZpdGllcy5nZXQocG9zKTsJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsb2NhbFJlcGxhY2VtZW50LmdldE9wcG9zaXRlRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGxvY2FsUmVwbGFjZW1lbnQuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWlmKHZhbHVlICE9IG51bGwpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KCgoQ29sbGVjdGlvbil2YWx1ZSkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7CQkKLQkJCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG8uZUdldChmZWF0dXJlKTsKLQkJCQkJCQlsaXN0LnJlbW92ZShsb2NhbFJlcGxhY2VtZW50KTsKLQkJCQkJCQlsaXN0LmFkZChjb3B5KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW8uZVNldChmZWF0dXJlLCBjb3B5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgby5lR2V0KGZlYXR1cmUpOwotCQkJCQkJbGlzdC5yZW1vdmUobG9jYWxSZXBsYWNlbWVudCk7Ci0JCQkJCQlsaXN0LmFkZChjb3B5KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW8uZVNldChmZWF0dXJlLCBjb3B5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljcmVhdGVkQWN0aXZpdGllcy5zZXQocG9zLCBjb3B5KTsKLQkJY29weS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGxvY2FsUmVwbGFjZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJY29weS5zZXRWYXJpYWJpbGl0eVR5cGUobG9jYWxSZXBsYWNlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSk7Ci0JCWNvcHkuc2V0UHJlc2VudGVkQWZ0ZXIobG9jYWxSZXBsYWNlbWVudC5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJY29weS5zZXRQcmVzZW50ZWRCZWZvcmUobG9jYWxSZXBsYWNlbWVudC5nZXRQcmVzZW50ZWRCZWZvcmUoKSk7Ci0JCUFjdGl2aXR5IHN1cGVyQWN0ID0gbG9jYWxSZXBsYWNlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJaW50IGlkID0gc3VwZXJBY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGxvY2FsUmVwbGFjZW1lbnQpOwotCQlzdXBlckFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNldChpZCwgY29weSk7Ci0JCQotCQkvLyBhZGQgY29weSBwYWNrYWdlIHRvIHRoZSBwYWNrYWdlIG9mIHN1cGVyIGFjdGl2aXR5Ci0JCS8vCi0JCSgoUHJvY2Vzc1BhY2thZ2Upc3VwZXJBY3QuZUNvbnRhaW5lcigpKS5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChNZXRob2RQYWNrYWdlKSBjb3B5LmVDb250YWluZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZURvd25Db21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlRG93bkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4ZDJhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlRG93bkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gbW92ZSBkb3duIGVsZW1lbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZURvd25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBpbnQgZWxlbWVudExvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgaW50IHRyYW5zZmVyTG9jYXRpb24gPSAwOwotCi0JcHJpdmF0ZSBPYmplY3QgZWxlbWVudE9iajsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlczsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWRqYWNlbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBNb3ZlRG93bkNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdCBlbGVtZW50T2JqLAotCQkJQ29sbGVjdGlvbiBlQ2xhc3NlcykgewotCQlzdXBlcigpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuZWxlbWVudE9iaiA9IGVsZW1lbnRPYmo7Ci0JCXRoaXMuZUNsYXNzZXMgPSBlQ2xhc3NlczsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTGlzdCBhbGxFbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmouZXF1YWxzKGVsZW1lbnRPYmopKSB7Ci0JCQkJZWxlbWVudExvY2F0aW9uID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWZvciAoaW50IGkgPSBlbGVtZW50TG9jYXRpb24gKyAxOyBpIDw9IGFsbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gYWxsRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKFRuZ1V0aWwuaXNFQ2xhc3NJbnN0YW5jZU9mKGVDbGFzc2VzLCBvYmopKSB7Ci0JCQkJdHJhbnNmZXJMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFsbEVsZW1lbnRzLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsKLQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCWlmKGUuZ2V0UHJlc2VudGVkQWZ0ZXIoKSA9PSBuZXh0KSB7Ci0JCQlhZGphY2VudCA9IHRydWU7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZihhZGphY2VudCkgewotCQkJLy8gc3dhcCAicHJlbnNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudE9iajsKLQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIobmV4dC5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJCW5leHQuc2V0UHJlc2VudGVkQWZ0ZXIoZSk7Ci0JCX0KLQkJKChFTGlzdCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkubW92ZSh0cmFuc2ZlckxvY2F0aW9uLAotCQkJCWVsZW1lbnRMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChFTGlzdCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkubW92ZShlbGVtZW50TG9jYXRpb24sCi0JCQkJdHJhbnNmZXJMb2NhdGlvbik7Ci0JCWlmKGFkamFjZW50KSB7Ci0JCQkvLyByZXN0b3JlICJwcmVuc2VudGVkLWFmdGVyIiBlbGVtZW50Ci0JCQkvLwotCQkJQnJlYWtkb3duRWxlbWVudCBuZXh0ID0gIChCcmVha2Rvd25FbGVtZW50KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJbmV4dC5zZXRQcmVzZW50ZWRBZnRlcihlLmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihuZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZVVwQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZVVwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI5ZGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVVcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gbW92ZSB1cCB0aGUgZWxlbWVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlVXBDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBpbnQgZWxlbWVudExvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgaW50IHRyYW5zZmVyTG9jYXRpb24gPSAwOwotCi0JcHJpdmF0ZSBPYmplY3QgZWxlbWVudE9iajsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlczsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWRqYWNlbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBNb3ZlVXBDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmVsZW1lbnRPYmogPSBlbGVtZW50T2JqOwotCQl0aGlzLmVDbGFzc2VzID0gZUNsYXNzZXM7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUxpc3QgYWxsRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBhbGxFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqLmVxdWFscyhlbGVtZW50T2JqKSkgewotCQkJCWVsZW1lbnRMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGVsZW1lbnRMb2NhdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlPYmplY3Qgb2JqID0gYWxsRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKFRuZ1V0aWwuaXNFQ2xhc3NJbnN0YW5jZU9mKGVDbGFzc2VzLCBvYmopKSB7Ci0JCQkJdHJhbnNmZXJMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWxsRWxlbWVudHMuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwkJCi0JCWlmKHByZXYuZ2V0UHJlc2VudGVkQWZ0ZXIoKSA9PSBlbGVtZW50T2JqKSB7Ci0JCQlhZGphY2VudCA9IHRydWU7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZihhZGphY2VudCkgewotCQkJLy8gc3dhcCAicHJlc2VudGVkLWFmdGVyIiBlbGVtZW50Ci0JCQkvLwotCQkJQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gIChCcmVha2Rvd25FbGVtZW50KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsJCQotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCQlwcmV2LnNldFByZXNlbnRlZEFmdGVyKGUuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCQllLnNldFByZXNlbnRlZEFmdGVyKHByZXYpOwotCQl9Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUodHJhbnNmZXJMb2NhdGlvbiwKLQkJCQllbGVtZW50TG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUoZWxlbWVudExvY2F0aW9uLAotCQkJCXRyYW5zZmVyTG9jYXRpb24pOwotCQlpZihhZGphY2VudCkgewotCQkJLy8gcmVzdG9yZSAicHJlc2VudGVkLWFmdGVyIiBlbGVtZW50Ci0JCQkvLwotCQkJQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gIChCcmVha2Rvd25FbGVtZW50KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsJCQotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCQllLnNldFByZXNlbnRlZEFmdGVyKHByZXYuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCQlwcmV2LnNldFByZXNlbnRlZEFmdGVyKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjkxMTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBEcmFnIGFuZCBkcm9wIGNvbW1hbmQgZm9yIGRyYWdnaW5nIHJvbGUgaW50byBUZWFtIEFsbG9jYXRpb24KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0RyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgT0JTRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsCi0JCQlmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwKLS8vCQkJCQkJKEFjdGl2aXR5KSBvd25lciwKLS8vCQkJCQkJKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLS8vCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJCX0gZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWlmIChQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoCi0JCQkJCQkoKFRlYW1Qcm9maWxlKSBvd25lcikuZ2V0VGVhbVJvbGVzKCkpLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gbmV3IE9CU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BTcmMpOwotCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIHJldHVybiBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kKChUZWFtUHJvZmlsZSkgb3duZXIsCi0JCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwgZHJvcFNyYywKLQkJCS8vIGdldERyb3BBZGFwdGVyKG93bmVyKSk7Ci0JCQlyZXR1cm4gbmV3IEFkZFJvbGVUb1RlYW1Db21tYW5kKChUZWFtUHJvZmlsZSkgb3duZXIsIGRyb3BTcmMpOwotCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJcmV0dXJuIG5ldyBHZW5lcmljRHJvcENvbW1hbmQoKENvbXBvc2l0ZVJvbGUpIG93bmVyLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLAotCQkJCQlkcm9wU3JjLCBnZXREcm9wQWRhcHRlcihvd25lcikpOwotCQl9Ci0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgZ2V0RHJvcEFkYXB0ZXIoT2JqZWN0IG93bmVyKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG93bmVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBhZGFwdGVyLmNyZWF0ZURyb3BBZGFwdGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMWMzMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlVuaXF1ZU5hbWVQTmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIENvbW1hbmQgdG8gZHJhcCBhbmQgZHJvcCByb2xlcyB0byBUZWFtIEFsbG9jYXRpb24gYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0Ryb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgd3BEZXNjTGlzdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgTWFwPFJvbGVEZXNjcmlwdG9yLCBUZWFtUHJvZmlsZT4gcm9sZURlc2NUZWFtUHJvZmlsZU1hcDsKLQotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQotCXByaXZhdGUgSGFzaE1hcDxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3BkVG9UYXNrRmVhdHVyZXNNYXA7IC8vIG1hcCBvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgdG8KLQotCS8vIG1hcCBvZiB0YXNrIG90IGZlYXR1cmUgbGlzdAotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3JhdG9yOwotCi0JcHJpdmF0ZSBib29sZWFuIG5ld0R1cGxpY2F0ZXNSZW1vdmVkOwotCQotCXB1YmxpYyBPQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3QsIExpc3Qgcm9sZXMpIHsKLQkJc3VwZXIoYWN0LCByb2xlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBPQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsCi0JCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpOwotCQl0aGlzLmNvbmZpZ3JhdG9yID0gY29uZmlndXJhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0YXNrRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoID0gc3luY2hyb25pemUgPyBiYXRjaENvbW1hbmQKLQkJCQkuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKSA6IG51bGw7Ci0KLQkJTGlzdCBiZXMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIHVuaXF1ZU5hbWVzSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyKGJlcyk7Ci0JCQkJCi0JCWludCBzaXplID0gZHJvcEVsZW1lbnRzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSBkcm9wRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihyb2xlKSkgewotCQkJCXJvbGUgPSAoUm9sZSkgVG5nVXRpbC5nZXRCYXNlKHJvbGUpOwotCQkJfQotCi0JCQkvLyBjaGVjayBpZiB0aGUgcm9sZSBkZXNjcmlwdG9yIG9mIHRoZSByb2xlIGV4aXN0cyB1bmRlciB0aGlzCi0JCQkvLyBhY3Rpdml0eQotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBudWxsOwotCQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkuZ2V0RGVzY3JpcHRvcihyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCX0KLQotCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjcmVhdGUgcm9sZSBkZXNjcmlwdG9yIG9iamVjdAotCQkJCXJvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZShyb2xlRGVzYyk7Ci0JCQkJcm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIG5lZWQgdG8gY2xlYXIgYWxsIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlcyBvZiB0aGUgZXhpc3RpbmcKLQkJCQkvLyBkZXNjcmlwdG9yCi0JCQkJLy8KLQkJCQlpZiAoc3luY2hyb25pemUKLQkJCQkJCSYmIHJvbGVEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQliYXRjaENvbW1hbmQuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKS5hZGQocm9sZURlc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGlmIG5vdCBhIHN5bmNocm9uaXphdGlvbiwgZ2V0IGFsbCB3b3JrcHJvZHVjdHMgd2hpY2ggaGF2ZSByb2xlIGFzCi0JCS8vIHJlc3BvbnNpYmxlIHJvbGUgZm9yCi0JCS8vIHdoaWNoIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQKLQkJLy8KLQkJaWYgKCFzeW5jaHJvbml6ZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgZHJvcEVsZW1lbnRzLmdldChpKTsKLQkJCQlMaXN0IHdvcmtQcm9kdWN0cyA9IFByb2Nlc3NVdGlsLmdldFdvcmtQcm9kdWN0c0ZvclJvbGUocm9sZSwKLQkJCQkJCWNvbmZpZyk7Ci0JCQkJaWYgKCh3b3JrUHJvZHVjdHMgIT0gbnVsbCkgJiYgKCEod29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkpKSB7Ci0JCQkJCUhhc2hNYXAgd3BUb0V4aXN0aW5nRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KGFjdGl2aXR5Ci0JCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCQkJCQllbGVtZW50cy5hZGRBbGwod3BEZXNjTGlzdCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdvcmtQcm9kdWN0cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdGVyLm5leHQoKTsJCQkJCQkKLQkJCQkJCU9iamVjdCB3cGQgPSBQcm9jZXNzVXRpbC5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3BEZXNjTGlzdCwgd3ApOwotCQkJCQkJaWYod3BkID09IG51bGwpIHsKLQkJCQkJCQl3cGQgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAod3BkICE9IG51bGwpIHsKLQkJCQkJCQl3cFRvRXhpc3RpbmdEZXNjcmlwdG9yTWFwLnB1dCh3cCwgd3BkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlMaXN0IHNlbGVjdGVkV29ya1Byb2R1Y3RzID0gbmV3IEFycmF5TGlzdCgKLQkJCQkJCQl3cFRvRXhpc3RpbmdEZXNjcmlwdG9yTWFwLmtleVNldCgpKTsKLQkJCQkJd29ya1Byb2R1Y3RzLnJlbW92ZUFsbChzZWxlY3RlZFdvcmtQcm9kdWN0cyk7Ci0JCQkJCQotCQkJCQlmaW5hbCBMaXN0IGZpbmFsU2VsZWN0ZWRXcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmICghd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJCQkJZmluYWwgTGlzdCBmaW5hbFdwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZpbmFsV3BzLmFkZEFsbCh3b3JrUHJvZHVjdHMpOwotCQkJCQkJZmluYWwgUm9sZSBmaW5hbFJvbGUgPSByb2xlOwotCQkJCQkJCi0JCQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJTGlzdCBzZWxlY3RlZCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCS5zZWxlY3RXb3JrUHJvZHVjdHMoZmluYWxXcHMsIGZpbmFsUm9sZSk7Ci0JCQkJCQkJCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlmaW5hbFNlbGVjdGVkV3BzLmFkZEFsbChzZWxlY3RlZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9LCB0cnVlKTsKLQkJCQkJfQotCi0JCQkJCXNlbGVjdGVkV29ya1Byb2R1Y3RzLmFkZEFsbChmaW5hbFNlbGVjdGVkV3BzKTsKLQkJCQkJaWYgKCFzZWxlY3RlZFdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJCUhhc2hTZXQgYWxsU2VsZWN0ZWRUYXNrcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VsZWN0ZWRXb3JrUHJvZHVjdHMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgc2VsZWN0ZWRXb3JrUHJvZHVjdHMKLQkJCQkJCQkJCS5nZXQoaik7Ci0KLQkJCQkJCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwKSkgewotCQkJCQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAuZ2V0KHdwKTsKLQkJCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJd3BEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCwKLQkJCQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyk7Ci0JCQkJCQkJCXdwRGVzY0xpc3QuYWRkKHdwRGVzYyk7Ci0KLQkJCQkJCQkJLy8gYXV0b21hdGljIGFkZGluZyB0byB0aGUgZXhpc3RpbmcgZGVsaXZlcmFibGUKLQkJCQkJCQkJLy8gZGVzY3JpcHRvciBpbiB0aGUgYWN0aXZpdHkncyBzY29wZSBpZiB0aGVyZQotCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkvLyBhbnkKLQkJCQkJCQkJLy8gdmFsaWQgb25lLgotCQkJCQkJCQkvLwotCQkJCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3ApOwotCQkJCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5wdXQod3BEZXNjLAotCQkJCQkJCQkJCQlkZXNjcmlwdG9yKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwKLQkJCQkJCQkJCQkmJiB3cERlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkJCQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHdwRGVzYyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUKLQkJCQkJCQkJCQkmJiBzeW5jaEZlYXR1cmVzCi0JCQkJCQkJCQkJCQkuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKSkgewotCQkJCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMoCi0JCQkJCQkJCQkJCXdwRGVzYywgKERlbGl2ZXJhYmxlKSB3cCwgY29uZmlnLAotCQkJCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsCi0JCQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJCS8vIGdldCBhbGwgcG9zc2libGUgdGFza3MgZm9yIHRoaXMgd29ya3Byb2R1Y3QgZm9yCi0JCQkJCQkJLy8gd2hpY2ggdGFzayBkZXNjcmlwdG9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQKLQkJCQkJCQlMaXN0IHRhc2tzID0gUHJvY2Vzc1V0aWwuZ2V0VGFza3NGb3JXb3JrUHJvZHVjdCh3cCwKLQkJCQkJCQkJCWNvbmZpZyk7Ci0KLQkJCQkJCQlpZiAoKHRhc2tzICE9IG51bGwpICYmICh0YXNrcy5zaXplKCkgPiAwKSkgewotCQkJCQkJCQkvLyBleGNsdWRlIGFueSB0YXNrIHRoYXQgaXMgYWxyZWFkeSBzZWxlY3RlZCBvciBhbHJlYWR5IGV4aXN0cyBpbiBhY3Rpdml0eQotCQkJCQkJCQkvLwotCQkJCQkJCQl0YXNrcy5yZW1vdmVBbGwoYWxsU2VsZWN0ZWRUYXNrcyk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGl0ZXIubmV4dCgpOwotCQkJCQkJCQkJT2JqZWN0IHRkID0gUHJvY2Vzc1V0aWwuZ2V0VGFza0Rlc2NyaXB0b3IodGFza0Rlc2NMaXN0LCB0YXNrKTsgCi0JCQkJCQkJCQlpZih0ZCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJdGQgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcih0YXNrLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmKHRkICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaWYgKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCWZpbmFsIExpc3QgZmluYWxUYXNrcyA9IHRhc2tzOwotCQkJCQkJCQkJZmluYWwgV29ya1Byb2R1Y3QgZmluYWxXcCA9IHdwOwotCQkJCQkJCQkJZmluYWwgTGlzdCBmaW5hbFNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJTGlzdCBzZWxlY3RlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJLy8gc2hvdyB0YXNrIHNlbGVjdGlvbnMgZGlhbG9nCi0JCQkJCQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQkJTGlzdCBzZWxlY3RlZCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCQkuc2VsZWN0VGFza3MoZmluYWxUYXNrcywgZmluYWxXcCk7Ci0JCQkJCQkJCQkJCWZpbmFsU2VsZWN0ZWQuYWRkQWxsKHNlbGVjdGVkKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9LCB0cnVlKTsKLQkJCQkJCQkJCXNlbGVjdGVkVGFza3MuYWRkQWxsKGZpbmFsU2VsZWN0ZWQpOwotCQkJCQkJCQkJaWYgKChzZWxlY3RlZFRhc2tzICE9IG51bGwpCi0JCQkJCQkJCQkJCSYmICgoIXNlbGVjdGVkVGFza3MuaXNFbXB0eSgpKSkpIHsKLQkJCQkJCQkJCQlhbGxTZWxlY3RlZFRhc2tzLmFkZEFsbChzZWxlY3RlZFRhc2tzKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJLy8gSWYgbm8gdGFza3MgYXJlIHNlbGVjdGVkLCBhZGQKLQkJCQkJCQkJCQkvLyBSZXNwb25zaWJsZSByb2xlIHRvIHdwCi0JCQkJCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmFkZFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKAotCQkJCQkJCQkJCQkJd3BEZXNjLCBhY3Rpdml0eSwgcm9sZURlc2NMaXN0LAotCQkJCQkJCQkJCQkJbnVsbCwgY29uZmlnKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIElmIHRoZXJlIGFyZSBubyB0YXNrcyB0byBzaG93LCBhZGQKLQkJCQkJCQkJLy8gUmVzcG9uc2libGUgcm9sZSB0byB3cAotCQkJCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuYWRkUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BEZXNjLAotCQkJCQkJCQkJCWFjdGl2aXR5LCByb2xlRGVzY0xpc3QsIG51bGwsIGNvbmZpZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBjcmVhdGUgdGFzayBkZXNjcmlwdG9ycyBmb3IgdGhpcyB3b3JrcHJvZHVjdAotCQkJCQkJaWYgKChhbGxTZWxlY3RlZFRhc2tzICE9IG51bGwpCi0JCQkJCQkJCSYmICghKGFsbFNlbGVjdGVkVGFza3MuaXNFbXB0eSgpKSkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBhbGxTZWxlY3RlZFRhc2tzLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0KLQkJCQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGl0b3IubmV4dCgpOwotCi0JCQkJCQkJCS8vIGNhbGwgdGhpcyBtZXRob2QgZXZlbiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlCi0JCQkJCQkJCS8vIGdpdmVuIHRhc2sgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhY3Rpdml0eQotCQkJCQkJCQkvLyB0byBhZGQgYW55IGFkZGl0aW9uYWwgcmVsYXRpb25zaGlwcyBpbiBjYXNlCi0JCQkJCQkJCS8vIG9mCi0JCQkJCQkJCS8vIHJlY2VudCBjaGFuZ2UgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkJCQkJCQkvLyBvZiB0aGUgcHJvY2Vzcy4KLQkJCQkJCQkJUEJTRHJvcENvbW1hbmQKLQkJCQkJCQkJCQkuYWRkVG9EZXNjcmlwdG9yTGlzdHMoCi0JCQkJCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJCQkJYWN0aXZpdHksCi0JCQkJCQkJCQkJCQl0YXNrRGVzY0xpc3QsCi0JCQkJCQkJCQkJCQlyb2xlRGVzY0xpc3QsCi0JCQkJCQkJCQkJCQl3cERlc2NMaXN0LAotCQkJCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQkJCQkJCQliYXRjaENvbW1hbmQKLQkJCQkJCQkJCQkJCQkJLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLAotCQkJCQkJCQkJCQkJY29uZmlnLCBzeW5jaHJvbml6ZSwgc3luY2hGZWF0dXJlcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZW5zdXJlIHVuaXF1ZSBuYW1lcyBmb3Igd3AgZGVzY3JpcHRvcnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3cERlc2NMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgd3BEZXNjTGlzdC5nZXQoaSk7CQkJCi0JCQlpZiAod3BEZXNjICE9IG51bGwpIHsKLQkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKHdwRGVzYyk7CQotCQkJfQotCQl9Ci0JCXJldHVybiAoIXJvbGVEZXNjTGlzdC5pc0VtcHR5KCkgLy8gfHwgIXJvbGVBc3NvY2lhdGlvbkxpc3QuaXNFbXB0eSgpCi0JCQkJfHwgIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQl8fCAhd3BEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQl8fCAod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwgJiYgIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cwotCQkJCQkJLmlzRW1wdHkoKSkgfHwgIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkKLQkJCQl8fCAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb1JlZnJlc2gKLQkJCQkJCS5pc0VtcHR5KCkpIHx8IGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJcmVtb3ZlTmV3RHVwbGljYXRlcygpOwotCi0JCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5Ci0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJaWYgKHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgPT0gbnVsbCkgewotCQkJLy8gcHJlcGFyZSBmb3IgYXV0b21hdGljIGFzc2lnbm1lbnQgb2Ygcm9sZSBkZXNjcmlwdG9yIHRvIHRlYW0KLQkJCS8vIHByb2ZpbGUKLQkJCS8vCi0JCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VGVhbSgKLQkJCQkJCWFjdGl2aXR5LCByb2xlRGVzYy5nZXRSb2xlKCkpOwotCQkJCWlmICh0ZWFtUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAucHV0KHJvbGVEZXNjLCB0ZWFtUHJvZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHJvbGUgZGVzY3JpcHRvcnMgdG8gdGVhbSBwcm9maWxlcwotCQkvLwotCQlmb3IgKE1hcC5FbnRyeTxSb2xlRGVzY3JpcHRvciwgVGVhbVByb2ZpbGU+IGVudHJ5IDogcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5lbnRyeVNldCgpKSB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQl9Ci0KLQkJLy8gYXV0b21hdGljYWxseSBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gZGVsaXZlcmFibGUgcGFydAotCQkvLwotCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChNYXAuRW50cnk8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGVudHJ5IDoKLQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkvLyBhZGQgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmICghd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldEtleSgpOwotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKAotCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkgewotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIG5ldyBlbGVtZW50cyB0aGF0IGFyZSBkdXBsaWNhdGUgYi9jIHRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlCi0JICogcHJldmlvdXMgV0JTRHJvcENvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTmV3RHVwbGljYXRlcygpIHsKLQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQlpZiAoIW5ld0R1cGxpY2F0ZXNSZW1vdmVkKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlPYmplY3QgZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHdwZAotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpLCBhY3Rpdml0eSwKLQkJCQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJaWYgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnJlbW92ZSh3cGQpOwotCQkJCQkJfQotCQkJCQkJaWYgKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5yZW1vdmUod3BkKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAucmVtb3ZlKHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbmV3RHVwbGljYXRlc1JlbW92ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb1VuZG8oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5kbygpIHsKLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMgZnJvbSBhY3Rpdml0eQotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzIGZyb20gdGVhbSBwcm9maWxlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCX0KLQotCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJLy8gLy8gZGlzYXNzb2NpYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgd2l0aCB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vIC8vCi0JCS8vIGlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9UYXNrRmVhdHVyZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCS8vIE1hcCB0YXNrRmVhdHVyZXMgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza0ZlYXR1cmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJLy8gVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpCi0JCS8vIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGVudC5nZXRLZXkoKSwgYWN0aXZpdHksCi0JCS8vIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gKChDb2xsZWN0aW9uKWVudC5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyYXRvcjEKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZGVzY0ZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKQotCQkvLyBGRUFUVVJFX01BUC5nZXQoZik7Ci0JCS8vIGlmKGRlc2NGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCS8vICgoTGlzdCl0YXNrRGVzYy5lR2V0KGRlc2NGZWF0dXJlKSkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJLy8gdGFza0Rlc2MuZVNldChkZXNjRmVhdHVyZSwgbnVsbCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCi0JCS8vIHJlbW92ZSBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmICghd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldEtleSgpOwotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKAotCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZyb20gZGVsaXZlcmFibGUgcGFydAotCQkvLwotCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMgZnJvbSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkgewotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBHZXQgdGFzayBkZXNjcmlwdG9ycyBtYXAgZm9yIGFuIGFjdGl2aXR5Ci0JLy8gKiBAcGFyYW0gYWN0aXZpdHkKLQkvLyAqIEByZXR1cm4KLQkvLyAqLwotCS8vIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgZ2V0VGFza3NNYXBGb3JBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSkKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCS8vIGZvciAoaW50IGk9MDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKQotCS8vIHsKLQkvLyBPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikKLQkvLyB7Ci0JLy8gVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLQkvLyBUYXNrIHRhc2sgPSB0YXNrRGVzYy5nZXRUYXNrKCk7Ci0JLy8gaWYgKHRhc2sgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gbWFwLnB1dCh0YXNrLCB0YXNrRGVzYyk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIG1hcDsKLQkvLyB9Ci0JLy8JCi0JLy8JCi0JLy8gLyoqCi0JLy8gKiBTaG93IFJvbGVBc3NvY2lhdGlvbiBEaWFsb2cKLQkvLyAqIEBwYXJhbSB0YXNrcwotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgaW50IHNob3dSb2xlQXNzb2NpYXRpb25EaWFsb2coVGFzayB0YXNrKQotCS8vIHsKLQkvLwkJCi0JLy8gUm9sZUFzc29jaWF0aW9uRGlhbG9nIHJvbGVBc3NvYyA9IG5ldwotCS8vIFJvbGVBc3NvY2lhdGlvbkRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0YXNrKTsKLQkvLyByb2xlQXNzb2Mub3BlbigpOwotCS8vCQkKLQkvLyAvLyBzZWxlY3RlZCB0YXNrczsKLQkvLyByZXR1cm4gcm9sZUFzc29jLmdldFJvbGVBc3NvY2lhdGlvbigpOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcm9sZURlc2NMaXN0OwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmIChyb2xlRGVzY1RlYW1Qcm9maWxlTWFwICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl3cERlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmNmNTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBEcmFnIGFuZCBkcm9wIGNvbW1hbmQgZm9yIGRyb3BwaW5nIHdvcmsgcHJvZHVjdHMgaW50byBXUCBVc2FnZSBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0RyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgUEJTRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsCi0JCQlmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0RyYWdBbmREcm9wQ29tbWFuZCNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotCi0JCWlmKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlpZihvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosIChBY3Rpdml0eSkgb3duZXIsCi0vLwkJCQkJCSgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKSB7Ci0JCXJldHVybiBuZXcgUEJTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcFNyYyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4MWIyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVW5pcXVlTmFtZVBOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBkcmFnIGFuZCBkcm9wIHdvcmsgcHJvZHVjdHMgdG8gV29yayBQcm9kdWN0IFVzYWdlIGJyZWFrZG93bgotICogc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0Ryb3BDb21tYW5kIHsKLQlwcml2YXRlIEFycmF5TGlzdCB3cERlc2NMaXN0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgcm9sZURlc2NMaXN0OwotCi0JcHJpdmF0ZSBNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzOwotCi0JcHJpdmF0ZSBIYXNoTWFwPFdvcmtQcm9kdWN0RGVzY3JpcHRvciwgV29ya1Byb2R1Y3REZXNjcmlwdG9yPiB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcDsKLQotCXByaXZhdGUgQmF0Y2hDb21tYW5kIHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbmV3RHVwbGljYXRlc1JlbW92ZWQ7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbGlua2VkVGFza3M7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3BkVG9UYXNrRmVhdHVyZXNNYXA7Ci0KLQlwdWJsaWMgUEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3Qgd29ya1Byb2R1Y3RzKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCB3b3JrUHJvZHVjdHMpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiBAcGFyYW0gc3luY2gKLQkgKi8KLQlwdWJsaWMgUEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLCBib29sZWFuIHN5bmNoKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIHN5bmNoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzCi0JICovCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcywgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQkJc3VwZXIoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgY29uZmlnLCBzeW5jaEZlYXR1cmVzKTsKLQkJdGhpcy5jb25maWd1cmF0b3IgPSBjb25maWd1cmF0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNwcmVFeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlpZiAoIXN1cGVyLnByZUV4ZWN1dGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQl3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0YXNrRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWlmKCFzeW5jaHJvbml6ZSB8fCAoc3luY2hyb25pemUgJiYgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSkpKSB7Ci0JCQkvLyBhZGQgc3ViYXJ0aWZhY3RzIHRvIGRyb3BFbGVtZW50cyBsaXN0IGlmIHRoZXJlIGlzIGFueQotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoZHJvcEVsZW1lbnRzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlbGVtZW50LCBmYWxzZSkgewotCQkJCQkJCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00ODIwNDc3ODg3NDI2MDg3MjYyTDsKLQkJCQkJCQotCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlPYmplY3Qgc3ViQXJ0aWZhY3RzID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0UmVmZXJlbmNlKAotCQkJCQkJCQkJKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJCQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJCXJldHVybiAoKENvbGxlY3Rpb24pc3ViQXJ0aWZhY3RzKS5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX07Ci0JCQkJCQotCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlBcnRpZmFjdCBzdWJBcnRpZmFjdCA9IChBcnRpZmFjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCFkcm9wRWxlbWVudHMuY29udGFpbnMoc3ViQXJ0aWZhY3QpICYmIHByZXBhcmVBZGQoKFdvcmtQcm9kdWN0KSBzdWJBcnRpZmFjdCkpIAotCQkJCQkJewotCQkJCQkJCWRyb3BFbGVtZW50cy5hZGQoc3ViQXJ0aWZhY3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IHN5bmNocm9uaXplID8gYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgOiBudWxsOwotCQkKLQkJTGlzdCBiZXMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIHVuaXF1ZU5hbWVzSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyKGJlcyk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGRyb3BFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGRyb3BFbGVtZW50cy5nZXQoaSk7CQkJCi0JCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwKSkgewotCQkJCXdwID0gKFdvcmtQcm9kdWN0KSBUbmdVdGlsLmdldEJhc2Uod3ApOwotCQkJfQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IG51bGw7Ci0JCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCQl3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJfQotCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJd3BEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCwgY29uZmlnLAotCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKTsKLS8vCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUod3BEZXNjKTsKLQkJCQl3cERlc2NMaXN0LmFkZCh3cERlc2MpOwotCi0JCQkJLy8gYXV0b21hdGljIGFkZGluZyB0byB0aGUgZXhpc3RpbmcgZGVsaXZlcmFibGUgZGVzY3JpcHRvciBpbgotCQkJCS8vIHRoZSBhY3Rpdml0eSdzIHNjb3BlIGlmIHRoZXJlIGlzIGFueQotCQkJCS8vIHZhbGlkIG9uZS4KLQkJCQkvLwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLnB1dCh3cERlc2MsIGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCQkKLQkJCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkJCS8vIHJlcGxhY2Ugd29yayBwcm9kdWN0IHdpdGggaXRzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGluIHdwZFRvVGFza0ZlYXR1cmVzTWFwCi0JCQkJCS8vCi0JCQkJCU1hcCBmZWF0dXJlc01hcCA9IChNYXApIHdwZFRvVGFza0ZlYXR1cmVzTWFwLmdldCh3cCk7Ci0JCQkJCWlmKGZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLnJlbW92ZSh3cCk7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5wdXQod3BEZXNjLCBmZWF0dXJlc01hcCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgd3BEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh3cERlc2MpOwotCQkJCX0KLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSAmJiBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKSkgewotCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cERlc2MsCi0JCQkJCQkJKERlbGl2ZXJhYmxlKSB3cCwgY29uZmlnLCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5yZW1vdmUod3ApOwotCQkJCX0KLQkJCX0KLQotCQkKLQkJCWlmICghc3luY2hyb25pemUpIHsKLQkJCQkvLyBnZXQgYWxsIHBvc3NpYmxlIHRhc2tzIGZvciB0aGlzIHdvcmtwcm9kdWN0IGZvcgotCQkJCS8vIHdoaWNoIHRhc2sgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCQkJTGlzdCB0YXNrcyA9IFByb2Nlc3NVdGlsLmdldFRhc2tzRm9yV29ya1Byb2R1Y3Qod3AsIGNvbmZpZyk7Ci0KLQkJCQlpZiAoKHRhc2tzICE9IG51bGwpICYmICh0YXNrcy5zaXplKCkgPiAwKSkgewotCQkJCQkvLyBzaG93IHRhc2sgc2VsZWN0aW9ucyBkaWFsb2cJCQotCQkJCQlmaW5hbCBMaXN0IGZpbmFsVGFza3MgPSB0YXNrczsKLQkJCQkJZmluYWwgV29ya1Byb2R1Y3QgZmluYWxXcCA9IHdwOwotCQkJCQlmaW5hbCBMaXN0IGZpbmFsU2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJLy8gc2hvdyB0YXNrIHNlbGVjdGlvbnMgZGlhbG9nCi0JCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJTGlzdCBzZWxlY3RlZCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5zZWxlY3RUYXNrcygKLQkJCQkJCQkJCWZpbmFsVGFza3MsIGZpbmFsV3ApOwkJCQkJCQotCQkJCQkJCWZpbmFsU2VsZWN0ZWQuYWRkQWxsKHNlbGVjdGVkKTsKLQkJCQkJCX0KLQkJCQkJfSwgdHJ1ZSk7Ci0JCQkJCXNlbGVjdGVkVGFza3MuYWRkQWxsKGZpbmFsU2VsZWN0ZWQpOwotCQkJCQkKLQkJCQkJLy8gY3JlYXRlIHRhc2sgZGVzY3JpcHRvcnMgZm9yIHRoaXMgd29ya3Byb2R1Y3QKLQkJCQkJaWYgKChzZWxlY3RlZFRhc2tzICE9IG51bGwpICYmICghKHNlbGVjdGVkVGFza3MuaXNFbXB0eSgpKSkpIHsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VsZWN0ZWRUYXNrcy5zaXplKCk7IGorKykgewotCQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBzZWxlY3RlZFRhc2tzLmdldChqKTsKLQotCQkJCQkJCS8vIGNhbGwgdGhpcyBtZXRob2QgZXZlbiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlCi0JCQkJCQkJLy8gZ2l2ZW4gdGFzayBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGFjdGl2aXR5Ci0JCQkJCQkJLy8gdG8gYWRkIGFueSBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgaW4gY2FzZSBvZgotCQkJCQkJCS8vIHJlY2VudCBjaGFuZ2UgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkJCQkJCS8vIG9mIHRoZSBwcm9jZXNzLgotCQkJCQkJCVBCU0Ryb3BDb21tYW5kLmFkZFRvRGVzY3JpcHRvckxpc3RzKHRhc2ssIGFjdGl2aXR5LAotCQkJCQkJCQkJdGFza0Rlc2NMaXN0LCByb2xlRGVzY0xpc3QsIHdwRGVzY0xpc3QsCi0JCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsCi0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCQkJCWJhdGNoQ29tbWFuZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgCi0JCQkJCQkJCQljb25maWcsIHRydWUsIHN5bmNoRmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gSWYgbm8gdGFza3MgYXJlIHNlbGVjdGVkLCBhZGQgUmVzcG9uc2libGUgcm9sZSB0byB3cAotCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmFkZFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwRGVzYywgYWN0aXZpdHksCi0JCQkJCQkJCXJvbGVEZXNjTGlzdCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vCUlmIHRoZXJlIGFyZSBubyB0YXNrcyB0byBzaG93LCBhZGQgUmVzcG9uc2libGUgcm9sZSB0byB3cAotCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuYWRkUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BEZXNjLCBhY3Rpdml0eSwJcm9sZURlc2NMaXN0LCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJLy8JaW4gY2FzZSBvZiBzeW5jaHJvbml6YXRpb24sIGFkZCBSZXNwb25zaWJsZSByb2xlIHRvIHdwCi0vLwkJCQlpZiAoc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpKQotLy8JCQkJCVBCU0Ryb3BDb21tYW5kLmFkZFJlc3BvbnNpYmxlUm9sZSh3cERlc2MsIGFjdGl2aXR5LAlyb2xlRGVzY0xpc3QsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotLy8JCQl9CQkJCQotCQl9Ci0KLQkJaWYoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgPSBuZXcgQmF0Y2hDb21tYW5kKHRydWUpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgd3BEZXNjID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKS5wdXQod3BEZXNjLCAKLQkJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCBlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJCi0KLQkJLy8gZW5zdXJlIHVuaXF1ZSBuYW1lcyBmb3Igd3AgZGVzY3JpcHRvcnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3cERlc2NMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgd3BEZXNjTGlzdAotCQkJCQkuZ2V0KGkpOwotCQkJaWYgKHdwRGVzYyAhPSBudWxsKSB7Ci0JCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZSh3cERlc2MpOwotCQkJfQotCQl9Ci0JCXJldHVybiAhdGFza0Rlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgIXdwRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCAmJiB1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmNhbkV4ZWN1dGUoKSkKLQkJCQl8fCAhd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpCi0JCQkJfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JCQkJCQkuaXNFbXB0eSgpKQotCQkJCXx8IGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzdWJBcnRpZmFjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcHJlcGFyZUFkZChXb3JrUHJvZHVjdCB3cCkgewotCQlpZiAoc3luY2hyb25pemUpIHsJCi0JCQkvLyBnZXQgbGlua2VkIHRhc2tzIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3JzIGluIHRoZSBhY3Rpdml0eSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KLQkJCS8vCi0JCQlMaXN0IHRhc2tzID0gZ2V0TGlua2VkVGFza3MoKTsKLQkJCQotCQkJaWYoIXRhc2tzLmlzRW1wdHkoKSkgewotCQkJCS8vIHNlbGVjdCBvbmx5IHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgaW5wdXQgb3Igb3V0cHV0IG9mIGFuIGV4aXN0aW5nIHRhc2sgaW4gdGhlIGFjdGl2aXR5Ci0JCQkJLy8JCi0JCQkJTWFwIGZlYXR1cmVzTWFwID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldEZlYXR1cmVzTWFwKHRhc2tzLCB3cCwgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQlpZighZmVhdHVyZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHVzZSB0aGUgd3AgdG8gdGhlIGtleSBpbiB0aGUgbWFwIHJpZ2h0IG5vdyBhbmQgcmVwbGFjZSBpdCB3aXRoCi0JCQkJCS8vIGl0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBsYXRlcgotCQkJCQkvLwotCQkJCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCA9PSBudWxsKSB7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCX0KLQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucHV0KHdwLCBmZWF0dXJlc01hcCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldExpbmtlZFRhc2tzKCkgewotCQlpZihsaW5rZWRUYXNrcyA9PSBudWxsKSB7Ci0JCQlsaW5rZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFzayB0YXNrID0gKChUYXNrRGVzY3JpcHRvcillbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQkJCWlmKHRhc2sgIT0gbnVsbCAmJiBjb25maWd1cmF0b3IuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlsaW5rZWRUYXNrcy5hZGQodGFzayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbmtlZFRhc2tzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgbmV3IGVsZW1lbnRzIHRoYXQgYXJlIGR1cGxpY2F0ZSBiL2MgdGhleSBhcmUgY3JlYXRlZCBieSB0aGUgcHJldmlvdXMgV0JTRHJvcENvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTmV3RHVwbGljYXRlcygpIHsKLQkJaWYoc3luY2hyb25pemUpIHsKLQkJCWlmKCFuZXdEdXBsaWNhdGVzUmVtb3ZlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlPYmplY3QgZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHJvbGVEZXNjLmdldFJvbGUoKSwgYWN0aXZpdHksIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQluZXdEdXBsaWNhdGVzUmVtb3ZlZCA9IHRydWU7CQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlyZW1vdmVOZXdEdXBsaWNhdGVzKCk7Ci0JCQotCQkvLyBhdXRvbWF0aWNhbGx5IGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZW50cnkgOiAKLQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkvLyBhZGQgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQotCQkvLyBhc3NvY2lhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB3aXRoIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9UYXNrRmVhdHVyZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlNYXAgdGFza0ZlYXR1cmVzID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza0ZlYXR1cmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoZW50LmdldEtleSgpLCBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCksIGZhbHNlKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSAoKENvbGxlY3Rpb24pZW50LmdldFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGRlc2NGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRkVBVFVSRV9NQVAuZ2V0KGYpOwotCQkJCQkJaWYoZGVzY0ZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKExpc3QpdGFza0Rlc2MuZUdldChkZXNjRmVhdHVyZSkpLmFkZChlbnRyeS5nZXRLZXkoKSk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gVE9ETzogbmVlZCB0byBiYWNrIHVwIG9sZCB2YWx1ZSBoZXJlCi0JCQkJCQkJLy8KLQkJCQkJCQl0YXNrRGVzYy5lU2V0KGRlc2NGZWF0dXJlLCBlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmV3IGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0vLwkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3VwZGF0ZURlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJc3VwZXIudXBkYXRlRGVzY3JpcHRvcnMoKTsKLQkJCi0JCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCN1bmRvVXBkYXRlRGVzY3JpcHRvcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuZG9VcGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJLy8gcmVtb3ZlIGRlbGl2ZXJhYmxlIHBhcnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYodXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCAhPSBudWxsKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLnVuZG8oKTsKLQkJfQotCi0JCXN1cGVyLnVuZG9VcGRhdGVEZXNjcmlwdG9ycygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIGRlbGl2ZXJhYmxlIHBhcnQKLQkJLy8KLQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGRpc2Fzc29jaWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHdpdGggdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCU1hcCB0YXNrRmVhdHVyZXMgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrRmVhdHVyZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGVudC5nZXRLZXkoKSwgYWN0aXZpdHksIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gKChDb2xsZWN0aW9uKWVudC5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGRlc2NGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRkVBVFVSRV9NQVAuZ2V0KGYpOwotCQkJCQkJaWYoZGVzY0ZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKExpc3QpdGFza0Rlc2MuZUdldChkZXNjRmVhdHVyZSkpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdGFza0Rlc2MuZVNldChkZXNjRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmICh3cERlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiB3cERlc2NMaXN0OwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHRhc2tEZXNjTGlzdAotCSAqIEBwYXJhbSByb2xlRGVzY0xpc3QKLQkgKiBAcGFyYW0gd3BEZXNjTGlzdAotCSAqIEBwYXJhbSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmV3IFRhc2tEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gdGFzaywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBib29sZWFuIGFkZFRvRGVzY3JpcHRvckxpc3RzKFRhc2sgdGFzaywgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlMaXN0IHRhc2tEZXNjTGlzdCwgTGlzdCByb2xlRGVzY0xpc3QsIExpc3Qgd3BEZXNjTGlzdCwKLQkJCU1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCU1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiB1c2VFeGlzdGluZ0Rlc2NyaXB0b3IsIFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCVRhc2tEZXNjcmlwdG9yIGRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlVGFza0Rlc2NyaXB0b3IodGFzaywgYWN0aXZpdHksCi0JCQkJcm9sZURlc2NMaXN0LCB3cERlc2NMaXN0LCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIG51bGwsCi0JCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsIAotCQkJCWNvbmZpZywgdXNlRXhpc3RpbmdEZXNjcmlwdG9yLCBzeW5jaEZlYXR1cmVzKTsKLQkJaWYgKChkZXNjICE9IG51bGwpICYmICh0YXNrRGVzY0xpc3QgIT0gbnVsbCkKLQkJCQkmJiAhdGFza0Rlc2NMaXN0LmNvbnRhaW5zKGRlc2MpKSB7Ci0JCQl0YXNrRGVzY0xpc3QuYWRkKGRlc2MpOwotCQl9Ci0JCXJldHVybiBkZXNjICE9IG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcm9sZURlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl3cERlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5jbGVhcigpOwotCQl9Ci0JCWlmKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NDb21tYW5kVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0NvbW1hbmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MGI2YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0NvbW1hbmRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTm92IDIzLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9jZXNzQ29tbWFuZFV0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlW10gREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkvLyBndWlkYW5jZQotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlW10gVEFTS19ERVNDUklQVE9SX1JFRlJFU0hBQkxFX0ZFQVRVUkVTID0gewotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkgCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlW10gUk9MRV9ERVNDUklQVE9SX1JFRlJFU0hBQkxFX0ZFQVRVUkVTID0geyAKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSAKLQl9OwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIFdPUktfUFJPRFVDVF9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsKLS8vCi0vLwl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlZnJlc2hhYmxlIGZlYXR1cmUgbWFwIGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4gQSBkZXNjcmlwdG9yCi0JICogZmVhdHVyZSBpcyBjb25zaWRlcmVkIHJlZnJlc2hhYmxlIGlmIHRoZXJlIGlzIGEgc2ltaWxpYXIgZmVhdHVyZSBpbiBpdHMKLQkgKiBsaW5rZWQgTWV0aG9kRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybiB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZSBtYXAgZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgY3JlYXRlUmVmcmVzaGFibGVGZWF0dXJlTWFwKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0IGV4Y2x1ZGVGZWF0dXJlcykgewotCQlNYXAgZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFkZFRvRmVhdHVyZU1hcChkZXNjcmlwdG9yLCBERVNDUklQVE9SX1JFRlJFU0hBQkxFX0ZFQVRVUkVTLCBmZWF0dXJlTWFwLCBleGNsdWRlRmVhdHVyZXMpOwotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlhZGRUb0ZlYXR1cmVNYXAoZGVzY3JpcHRvciwgVEFTS19ERVNDUklQVE9SX1JFRlJFU0hBQkxFX0ZFQVRVUkVTLAotCQkJCQlmZWF0dXJlTWFwLCBleGNsdWRlRmVhdHVyZXMpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJYWRkVG9GZWF0dXJlTWFwKGRlc2NyaXB0b3IsIFJPTEVfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUywKLQkJCQkJZmVhdHVyZU1hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcjsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCQkJaWYgKHdwZC5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgJiYgIWV4Y2x1ZGVGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmZWF0dXJlTWFwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9GZWF0dXJlTWFwKEVPYmplY3QgZU9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzLCBNYXAgZmVhdHVyZU1hcCwgU2V0IGV4Y2x1ZGVGZWF0dXJlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJaWYgKCFleGNsdWRlRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJdmFsdWUgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQkJfQotCQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJlZmVyZW5jZShFT2JqZWN0IGUpIHsKLQkvLyBpZiAoZS5lSXNQcm94eSgpKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyBpZiAoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCS8vIC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZSk7Ci0JLy8gaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmVJc1Byb3h5KCkpIHsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIGF0dHJpYnV0ZXMuIEZvciByZWZlcmVuY2VzLCByZW1vdmUgb25seSB0aG9zZSB0aGF0IGFyZQotCSAqIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIGFueSBjb250ZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgY2xlYXJSZWZyZXNoYWJsZUZlYXR1cmVzKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0IGV4Y2x1ZGVGZWF0dXJlcykgewotCQlNYXAgZmVhdHVyZU1hcCA9IGNyZWF0ZVJlZnJlc2hhYmxlRmVhdHVyZU1hcChkZXNjcmlwdG9yLCBleGNsdWRlRmVhdHVyZXMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCWRlc2NyaXB0b3IuZVNldChmZWF0dXJlLCBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJLy8gd29yayBhcm91bmQgdG8gYXZvaWQgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0JCQkJCS8vCi0JCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgZGVzY3JpcHRvci5lR2V0KGZlYXR1cmUpKTsKLQkJCQkJc3dpdGNoIChsaXN0LnNpemUoKSkgewotCQkJCQljYXNlIDA6Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAxOgotCQkJCQkJbGlzdC5yZW1vdmUoMCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWxpc3QuY2xlYXIoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWRlc2NyaXB0b3IuZVNldChmZWF0dXJlLCBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQkJLy8gaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCS8vIExpc3QgbGlzdCA9ICgoTGlzdClkZXNjcmlwdG9yLmVHZXQoZmVhdHVyZSkpOwotCQkJCS8vIExpc3QgZWxlbWVudHNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkvLyBpZighaXNWYWxpZFJlZmVyZW5jZShlKSkgewotCQkJCS8vIGVsZW1lbnRzVG9SZW1vdmUuYWRkKGUpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gaWYoIWVsZW1lbnRzVG9SZW1vdmUuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gbGlzdC5yZW1vdmVBbGwoZWxlbWVudHNUb1JlbW92ZSk7Ci0JCQkJLy8gU3lzdGVtLm91dAotCQkJCS8vIC5wcmludGxuKCJQcm9jZXNzQ29tbWFuZFV0aWwuY2xlYXJSZWZyZXNoYWJsZUZlYXR1cmVzKCk6Ci0JCQkJLy8gY2hhbmdlZCIpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gZWxzZSB7Ci0JCQkJLy8gRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZGVzY3JpcHRvci5lR2V0KGZlYXR1cmUpOwotCQkJCS8vIGlmKG9iaiAhPSBudWxsICYmIG9iaiAhPSBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpICYmCi0JCQkJLy8gIWlzVmFsaWRSZWZlcmVuY2Uob2JqKSkgewotCQkJCS8vIGRlc2NyaXB0b3IuZVNldChmZWF0dXJlLCBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQkvLyBTeXN0ZW0ub3V0Ci0JCQkJLy8gLnByaW50bG4oIlByb2Nlc3NDb21tYW5kVXRpbC5jbGVhclJlZnJlc2hhYmxlRmVhdHVyZXMoKToKLQkJCQkvLyBjaGFuZ2VkIik7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmZWF0dXJlTWFwOwotCX0KLQotCS8qKgotCSAqIENsZWFycyBhbGwgdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmVzIG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcAotCSAqIEBwYXJhbSBleGNsdWRlRmVhdHVyZXMgZmVhdHVyZXMgdG8gZXhjbHVkZSBmcm9tIHJlZnJlc2hpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xlYXJEZXNjcmlwdG9yKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLQkJCU1hcCBkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLAotCQkJU2V0IGV4Y2x1ZGVGZWF0dXJlcykgewotCQlpZiAoZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkvLyBuZWVkIHRvIGNsZWFyIGFsbCB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZXMgb2YgdGhlIGV4aXN0aW5nCi0JCQkvLyBkZXNjcmlwdG9yCi0JCQkvLwotCQkJaWYgKCFkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLmNvbnRhaW5zS2V5KGRlc2NyaXB0b3IpKSB7Ci0JCQkJZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcAotCQkJCQkJLnB1dChkZXNjcmlwdG9yLCBjbGVhclJlZnJlc2hhYmxlRmVhdHVyZXMoZGVzY3JpcHRvciwgZXhjbHVkZUZlYXR1cmVzKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWREZXNjcmlwdG9yT2YoT2JqZWN0IGVsZW1lbnQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBPYmplY3QgZGVzY3JpcHRvciwgYm9vbGVhbiBleGNsdWRlU3VwcHJlc3NlZCkgewkJCi0JCWlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQlEZXNjcmlwdG9yIGRlc2MgPSAgKChEZXNjcmlwdG9yKWRlc2NyaXB0b3IpOwotCQkJaWYoZXhjbHVkZVN1cHByZXNzZWQgJiYgZGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCU9iamVjdCBlbGVtZW50T2JqID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYyk7Ci0JCQllbGVtZW50T2JqID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkucmVzb2x2ZShlbGVtZW50T2JqLCBjb25maWcpOwotCQkJcmV0dXJuIGVsZW1lbnQgPT0gZWxlbWVudE9iajsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBhIHZhbGlkIGRlc2NyaXB0b3Igb3IgZGVzY3JpcHRvciB3cmFwcGVyIG9mIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50PC9jb2RlPgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGVzY3JpcHRvck9yRGVzY3JpcHRvcldyYXBwZXJPZihPYmplY3QgZWxlbWVudCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlpZihzdXBwcmVzc2lvbi5pc0luU3VwcHJlc3NlZExpc3QoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGlzVmFsaWREZXNjcmlwdG9yT2YoZWxlbWVudCwgY29uZmlnLCBUbmdVdGlsLnVud3JhcChvYmplY3QpLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWREZXNjcmlwdG9yT2YoZWxlbWVudCwgY29uZmlnLCBvYmplY3QsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVuc3VwcHJlc3NlZCBkZXNjcmlwdG9yIGZyb20gYSBkZXNjcmlwdG9yIGxpc3QuIFRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgdXN1YWxseQotCSAqIHRoZSBicmVha2Rvd24gZWxlbWVudHMgb2YgYW4gYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBkZXNjcmlwdG9yTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZXNjcmlwdG9yKE9iamVjdCBvYmosIExpc3QgZGVzY3JpcHRvckxpc3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdG9yKG9iaiwgZGVzY3JpcHRvckxpc3QsIGNvbmZpZywgdHJ1ZSk7Ci0JfQotCQotCXN0YXRpYyBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3Qgb2JqLCBMaXN0IGRlc2NyaXB0b3JMaXN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBleGNsdWRlU3VwcHJlc3NlZCkgewotCQlpbnQgc2l6ZSA9IGRlc2NyaXB0b3JMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCS8vIGl0ZXJhdGUgdGhydSBsaXN0IHRvIHNlZSB3aGV0aGVyIGEgdmFsaWQgZGVzY3JpcHRvciBsaW5rZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0Ci0JCQkvLyBhbHJlYWR5IGV4aXN0cwotCQkJLy8KLQkJCU9iamVjdCBvYmplY3QgPSBkZXNjcmlwdG9yTGlzdC5nZXQoaik7Ci0JCQlpZihpc1ZhbGlkRGVzY3JpcHRvck9mKG9iaiwgY29uZmlnLCBvYmplY3QsIGV4Y2x1ZGVTdXBwcmVzc2VkKSkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHZhbGlkIGRlc2NyaXB0b3IsIGVpdGhlciBsb2NhbCBvciBpbmhlcml0ZWQsIG9mIHRoZSBnaXZlbiBvYmplY3QgdW5kZXIgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlc2NyaXB0b3IgZ2V0VmFsaWREZXNjcmlwdG9yKE9iamVjdCBvYmosIEFjdGl2aXR5IGFjdGl2aXR5LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChhY3Rpdml0eSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3Rpdml0eSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGlzVmFsaWREZXNjcmlwdG9yT3JEZXNjcmlwdG9yV3JhcHBlck9mKG9iaiwgY29uZmlnLCBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKSwgY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIChEZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9jYWwgdW5zdXBwcmVzc2VkIGRlc2NyaXB0b3Igb2YgdGhlIGdpdmVuIHJvbGUsIHRhc2ssIG9yIHdvcmtQcm9kdWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBvYmplY3QsIG9yIG51bGwgaWYgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgQWN0aXZpdHkgYWN0aXZpdHksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIFJvbGUgRGVzY3JpcHRvcnMgZm9yIHRoZSByZXNwb25zaWJsZSByb2xlcyBvZiB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0Ci0JICogZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gd3BEZXNjCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHJvbGVEZXNjcmlwdG9ycyBuZXdseSBjcmVhdGVkIHJvbGUgZGVzY3JpcHRvcnMgd2lsbCBiZSBhZGRlZCB0byB0aGlzIGxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlMaXN0PFJvbGVEZXNjcmlwdG9yPiByb2xlRGVzY3JpcHRvcnMsIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKHdwRGVzYyAhPSBudWxsKSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwKSkgewotCQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwKTsKLQkJCQl9Ci0JCQkJLy8gZ2V0IHJlc3BvbnNpYmxlIHJvbGUgZm9yIHdvcmsgcHJvZHVjdAotCQkJCUxpc3Qgcm9sZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVzKHdwKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcm9sZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHJvbGUpKSB7Ci0JCQkJCQlyb2xlID0gKFJvbGUpIFRuZ1V0aWwuZ2V0QmFzZShyb2xlKTsKLQkJCQkJfQotCQkJCQlib29sZWFuIGlzTmV3RGVzY3JpcHRvciA9IGZhbHNlOwotCQkJCQkvLyBjaGVjayBmb3Igcm9sZWRlc2NyaXB0b3Igd2hldGhlciBpdCdzIHByZXNlbnQgaW4gYWN0aXZpdHkKLQkJCQkJLy8gYnJlYWtkb3duIGVsZW1lbnRzCi0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKAotCQkJCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJLy8gY2hlY2sgZm9yIHJvbGVkZXNjcmlwdG9yIHdoZXRoZXIgaXQncyBwcmVzZW50IGluIGJhc2UKLQkJCQkJCS8vIGFjdGl2aXR5LgotCQkJCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKAotCQkJCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gY2hlY2sgZm9yIHJvbGVkZXNjcmlwdG9yIHdoZXRoZXIgaXQncyBwcmVzZW50IGluCi0JCQkJCQkJLy8gbGlzdCBvZiByb2xlZGVzY3JpcHRvcnMgcGFzc2VkIGluCi0JCQkJCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iocm9sZSwKLQkJCQkJCQkJCXJvbGVEZXNjcmlwdG9ycywgY29uZmlnKTsKLQkJCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKHJvbGVEZXNjKTsKLQkJCQkJCQkJaXNOZXdEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFpc05ld0Rlc2NyaXB0b3IgJiYgZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAKLQkJCQkJCQkmJiByb2xlRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHJvbGVEZXNjKTsKLQkJCQkJfQkJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbGxlY3RzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBmb3IgdGhlIGdpdmVuCi0JICogPGNvZGU+dGFza0Rlc2NyaXB0b3JGZWF0dXJlPC9jb2RlPiBiYXNlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlCi0JICogaW4gdGhlIGxpbmtlZCB0YXNrIG9mIHRoZSBnaXZlbiA8Y29kZT50YXNrRGVzY3JpcHRvcjwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gdGFzayB0aGUgdGFzayB0aGF0IHRoZSB0YXNrIGRlc2NyaXB0b3IgaXMgbGlua2VkIHRvCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yIHRoZSB0YXNrIGRlc2NyaXB0b3Igd2hvc2Ugd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGluIHRoZSBnaXZlbiA8Y29kZT50YXNrRGVzY3JpcHRvckZlYXR1cmU8L2NvZGU+Ci0JICogICAgICAgIHdpbGwgYmUgY29sbGVjdGVkCi0JICogQHBhcmFtIHRhc2tGZWF0dXJlIHRoZSB0YXNrIGZlYXR1cmUgdGhhdCBpcyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXNrIGRlc2NyaXB0b3IgZmVhdHVyZQotCSAqIEBwYXJhbSB0YXNrRGVzY3JpcHRvckZlYXR1cmUgdGhlIGZlYXR1cmUgb2YgdGFzayBkZXNjcmlwdG9yIHRoYXQgaG9sZHMgcmVmZXJlbmNlcyB0byAKLQkgKiAgICAgICAgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGNvbGxlY3QKLQkgKiBAcGFyYW0gYWN0aXZpdHkgdGhlIGFjdGl2aXR5IG9mIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIGNvbmZpZyB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB3cERlc2NyaXB0b3JzCi0JICogQHBhcmFtIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcAotCSAqIEBwYXJhbSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yc1RvUmVmcmVzaAotCSAqICAgICAgICAgICAgb3VwdXQgdGhhdCBrZWVwcyB0aGUgZGVzY3JpcHRvciBmZWF0dXJlcyB0aGF0IG5lZWQgdG8gYmUKLQkgKiAgICAgICAgICAgIHJlZnJlc2hlZAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwCi0JICogICAgICAgICAgICBvdXRwdXQgdGhhdCBrZWVwcyB0aGUgY29sbGVjdGVkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdFdvcmtQcm9kdWN0RGVzY3J0aXB0b3JzKAotCQkJVGFzayB0YXNrLAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IsIEVSZWZlcmVuY2UgdGFza0ZlYXR1cmUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgdGFza0Rlc2NyaXB0b3JGZWF0dXJlLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHdwRGVzY3JpcHRvcnMsCi0JCQlNYXAgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsCi0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwKSB7Ci0JCUxpc3Qgd29ya1Byb2R1Y3RzID0gKExpc3QpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpCi0JCQkJLmdldFJlZmVyZW5jZSh0YXNrLCB0YXNrRmVhdHVyZSwgY29uZmlnKTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9ycyh3b3JrUHJvZHVjdHMsIGxpc3QsIGFjdGl2aXR5LAotCQkJCXdwRGVzY3JpcHRvcnMsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwKLQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGNvbmZpZyk7Ci0JCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCUJhdGNoQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWVzKGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsIHRhc2tEZXNjcmlwdG9yLAotCQkJCQl0YXNrRGVzY3JpcHRvckZlYXR1cmUsIGxpc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZnJvbSB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0cyBmb3IgdGhlCi0JICogZ2l2ZW4gYWN0aXZpdHkgaWYgaXQgZG9lcyBub3QgaGF2ZSB0aGVtIGFscmVhZHkKLQkgKiAKLQkgKiBAcGFyYW0gd29ya1Byb2R1Y3RzCi0JICogICAgICAgICAgICBXb3JrUHJvZHVjdCBsaXN0Ci0JICogQHBhcmFtIGZlYXR1cmVWYWx1ZQotCSAqICAgICAgICAgICAgdGFyZ2V0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciBsaXN0IGZvciB0aGUgZ2l2ZW4gV29ya1Byb2R1Y3QKLQkgKiAgICAgICAgICAgIGxpc3QKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gd3BEZXNjcmlwdG9ycwotCSAqICAgICAgICAgICAgbmV3bHkgY3JlYXRlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciAob3V0cHV0KQotCSAqLwotCXN0YXRpYyB2b2lkIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcnMoTGlzdCB3b3JrUHJvZHVjdHMsCi0JCQlMaXN0IGZlYXR1cmVWYWx1ZSwgQWN0aXZpdHkgYWN0aXZpdHksIExpc3Qgd3BEZXNjcmlwdG9ycywKLQkJCU1hcCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsIE1hcCB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwKLQkJCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHdhc0VtcHR5ID0gZmVhdHVyZVZhbHVlLmlzRW1wdHkoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgd29ya1Byb2R1Y3RzLnNpemUoKTsgaisrKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3BPYmogPSAoV29ya1Byb2R1Y3QpIHdvcmtQcm9kdWN0cy5nZXQoaik7Ci0JCQkJaWYgKHdwT2JqICE9IG51bGwpIHsKLQkJCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cE9iaikpIHsKLQkJCQkJCXdwT2JqID0gKFdvcmtQcm9kdWN0KSBUbmdVdGlsLmdldEJhc2Uod3BPYmopOwotCQkJCQl9Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHdwT2JqLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCi0JCQkJCQkvLyBnZXQgaW5oZXJpdGVkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkJCQkJd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHdwT2JqLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQkJCQkJCXdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iod3BPYmosIHdwRGVzY3JpcHRvcnMsIGNvbmZpZyk7Ci0JCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdwRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3BPYmosCi0JCQkJCQkJCQkJY29uZmlnLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXApOwotCQkJCQkJCQl3cERlc2NyaXB0b3JzLmFkZCh3cERlc2MpOwotCQotCQkJCQkJCQkvLyBhdXRvbWF0aWMgYWRkaW5nIHRvIHRoZSBleGlzdGluZyBkZWxpdmVyYWJsZQotCQkJCQkJCQkvLyBkZXNjcmlwdG9yIGluIHRoZSBhY3Rpdml0eSdzIHNjb3BlIGlmIHRoZXJlCi0JCQkJCQkJCS8vIGlzCi0JCQkJCQkJCS8vIGFueQotCQkJCQkJCQkvLyB2YWxpZCBvbmUuCi0JCQkJCQkJCS8vCi0JCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cE9iaik7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLnB1dCh3cERlc2MsCi0JCQkJCQkJCQkJCWRlc2NyaXB0b3IpOwotCQkJCQkJCQl9Ci0JCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwpIHsKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh3cERlc2MpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICh3cE9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJCQkJJiYgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwICE9IG51bGwpIHsKLQkJCQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVEZWxpdmVyYWJsZVBhcnRzKHdwRGVzYywKLQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB3cE9iaiwgY29uZmlnLAotCQkJCQkJCQkJCQl3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAod2FzRW1wdHkgfHwgIWZlYXR1cmVWYWx1ZS5jb250YWlucyh3cERlc2MpKSB7Ci0JCQkJCQlmZWF0dXJlVmFsdWUuYWRkKHdwRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFzayBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gdGFzayB3aXRoaW4gdGhlIGFjdGl2aXR5IGlmIGl0Ci0JICogZG9lcyBub3QgZXhpc3QgYWxyZWFkeSwgYW5kIHVwZGF0ZSB0aGUgcm9sZURlc2NyaXB0b3JzIGFuZCB3cERlc2NyaXB0b3JzIGxpc3RzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgVGFzayBkZXNjcmlwdG9yLiBDYWxsZXIgc2hvdWxkIGFkZCB0aGUgbmV3IHRhc2sKLQkgKiBkZXNjcmlwdG9yIGFuZCB0aGUgb3RoZXJEZXNjcmlwdG9ycyBpbnRvIHRoZSBhY3Rpdml0eSdzIGJyZWFrZG93biBlbGVtZW50Ci0JICogbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSByb2xlRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIExpc3QgdG8gaG9sZCB0aGUgY3JlYXRlZCByb2xlIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JICogICAgICAgICAgICBuZXcgdGFzayBkZXNjcmlwdG9yLCBubyByb2xlIGRlc2NyaXB0b3Igd2lsbCBiZSBjcmVhdGVkIGlmCi0JICogICAgICAgICAgICByb2xlRGVzY3JpcHRvcnMgaXMgbnVsbAotCSAqIAotCSAqIEBwYXJhbSB3cERlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBMaXN0IHRvIGhvbGQgdGhlIGNyZWF0ZWQgd29ya3Byb2R1Y3QgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZAotCSAqICAgICAgICAgICAgd2l0aCB0aGlzIG5ldyB0YXNrIGRlc2NyaXB0b3IsIG5vIHdvcmtwcm9kdWN0IGRlc2NyaXB0b3Igd2lsbAotCSAqICAgICAgICAgICAgYmUgY3JlYXRlZCBpZiB3cERlc2NyaXB0b3JzIGlzIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgCi0JICogICAgICAgICAgICBNYXAgdG8gaG9sZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhbmQgZGVsaXZlcmFibGUgZGVzY3JpcHRvciB0byBhc3NpZ24KLQkgKiAgICAgICAgICAgIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0bwotCSAqICAgICAgICAgICAgIAotCSAqIEByZXR1cm4gVGFza0Rlc2NyaXB0b3Igb3IgbnVsbCBpZiB0aGUgdGFzayBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gdGFzawotCSAqICAgICAgICAgYWxyZWFkeSBleGlzdHMsIGFuZCB1cGRhdGVkIHRoZSByb2xlRGVzY3JpcHRvcnMgYW5kIHdwRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgIGxpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcihUYXNrIHRhc2ssCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCByb2xlRGVzY3JpcHRvcnMsIExpc3Qgd3BEZXNjcmlwdG9ycywKLQkJCU1hcCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsIE1hcCB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwKLQkJCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiB1c2VFeGlzdGluZ0Rlc2NyaXB0b3IsIFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3IodGFzaykpIHsKLQkJCXRhc2sgPSAoVGFzaykgVG5nVXRpbC5nZXRCYXNlKHRhc2spOwotCQl9Ci0JCi0JCS8vIGNyZWF0ZSB0YXNrIGRlc2NyaXB0b3Igb2JqZWN0Ci0JCS8vCi0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gbnVsbDsKLQkJaWYgKHVzZUV4aXN0aW5nRGVzY3JpcHRvcikKLQkJCXRhc2tEZXNjID0gCShUYXNrRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcih0YXNrLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJYm9vbGVhbiBpc05ld1Rhc2tEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCi0JCS8vIGlmICggdGFza0Rlc2MgIT0gbnVsbCApCi0JCS8vIHsKLQkJLy8gcmV0dXJuIHRhc2tEZXNjOwotCQkvLyB9Ci0JCS8vIHRhc2tEZXNjID0gY3JlYXRlVGFza0Rlc2NyaXB0b3IodGFzayk7Ci0JCi0JCWlmICh0YXNrRGVzYyA9PSBudWxsKSB7Ci0JCQl0YXNrRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVUYXNrRGVzY3JpcHRvcih0YXNrKTsKLQkJCWlzTmV3VGFza0Rlc2NyaXB0b3IgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgdGFza0Rlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQodGFza0Rlc2MpOwotCQkJfQotCQl9Ci0JCi0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCi0JCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yKSB7Ci0JCQkvLyBhZGQgYWxsIHRhc2sgc3RlcHMgdG8gVGFza0Rlc2NyaXB0b3Igc3RlcCBzZWxlY3Rpb24KLQkJCS8vCi0JCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2sKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCB0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCksIGNvbmZpZyk7Ci0JCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkQWxsKHN0ZXBzKTsKLQkJCQotCQl9Ci0JCi0JCS8vIG1vdmVkIHRoaXMgY29kZSB0byBCU0Ryb3BDb21tYW5kI2V4ZWN1dGUoKSB0byBzdXBwb3J0IHVuZG8gYW5kCi0JCS8vIHByb2dyZXNzIG1vbml0b3IKLQkJLy8KLQkJLy8gZWxzZSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3Qgc3RlcCA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZiAoIXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5jb250YWlucyhzdGVwKSkgewotCQkvLyB0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkKHN0ZXApOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQotCQlpZiAocm9sZURlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCS8vIGdldC9jcmVhdGUgcm9sZSBkZXNjcmlwdG9yIGZvciBwcmltYXJ5IHBlcmZvcm1lcnMKLQkJCS8vCi0JCQlFUmVmZXJlbmNlIHJlZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJCUxpc3QgcHJpbWFyeVBlcmZvcm1lcnMgPSBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKHJlZikgPyAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UodGFzaywKLQkJCQkJcmVmLCBjb25maWcpIDogbnVsbDsKLQkJCWlmIChwcmltYXJ5UGVyZm9ybWVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcmltYXJ5UGVyZm9ybWVycy5zaXplKCk7IGorKykgewotCQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgcHJpbWFyeVBlcmZvcm1lcnMuZ2V0KGopOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHJvbGUpKSB7Ci0JCQkJCQkvLyByb2xlID0gKFJvbGUpIFRuZ1V0aWwuZ2V0QmFzZShyb2xlKTsKLQkJCQkJCS8vIH0KLQkJCQotCQkJCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCQkJCVJvbGVEZXNjcmlwdG9yIHByaW1hcnlSb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigKLQkJCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlib29sZWFuIGlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQkJCWlmIChwcmltYXJ5Um9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCQkJCXByaW1hcnlSb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldEluaGVyaXRlZERlc2NyaXB0b3IoCi0JCQkJCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCQlpZiAocHJpbWFyeVJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJLy8gY2hlY2sgZm9yIGRlc2NyaXB0b3IgaW4gcGFzc2VkIGluIGRlc2NyaXB0b3IgbGlzdAotCQkJCQkJCQlwcmltYXJ5Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iocm9sZSwKLQkJCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMsIGNvbmZpZyk7Ci0JCQkJCQkJCWlmIChwcmltYXJ5Um9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJcHJpbWFyeVJvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQocHJpbWFyeVJvbGVEZXNjKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFpc05ld1JvbGVEZXNjcmlwdG9yCi0JCQkJCQkJCSYmIHByaW1hcnlSb2xlRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChwcmltYXJ5Um9sZURlc2MpOwotCQkJCQkJfQotCQkJCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgJiYgaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCXRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkKHByaW1hcnlSb2xlRGVzYyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUJhdGNoQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWUoZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwgdGFza0Rlc2MsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJCQkJCQkJCXByaW1hcnlSb2xlRGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCi0JCQkvLyBnZXQvY3JlYXRlIHJvbGUgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcGVyZm9ybWluZyByb2xlcwotCQkJLy8KLQkJCXJlZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsJCQkKLQkJCUxpc3QgYWRkaXRpb25hbFBlcmZvcm1lcnMgPSBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKHJlZikgPyAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UoCi0JCQkJCXRhc2ssIHJlZiwgY29uZmlnKSA6IG51bGw7Ci0JCQlpZiAoYWRkaXRpb25hbFBlcmZvcm1lcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYWRkaXRpb25hbFBlcmZvcm1lcnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJUm9sZSByb2xlT2JqID0gKFJvbGUpIGFkZGl0aW9uYWxQZXJmb3JtZXJzLmdldChqKTsKLQkJCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoCi0JCQkJCQkJcm9sZU9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCWJvb2xlYW4gaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldEluaGVyaXRlZERlc2NyaXB0b3IoCi0JCQkJCQkJCXJvbGVPYmosIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcihyb2xlT2JqLAotCQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXJvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZU9iaik7Ci0JCQkJCQkJCWlzTmV3Um9sZURlc2NyaXB0b3IgPSB0cnVlOwotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKHJvbGVEZXNjKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWlzTmV3Um9sZURlc2NyaXB0b3IKLQkJCQkJCQkmJiByb2xlRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHJvbGVEZXNjKTsKLQkJCQkJfQotCQkJCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvciAmJiBpc05ld1JvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlCYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlKAotCQkJCQkJCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLAotCQkJCQkJCQl0YXNrRGVzYywKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQkJCQkJcm9sZURlc2MpOwotCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQotCQlpZiAod3BEZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQlpZiAoIWlzTmV3VGFza0Rlc2NyaXB0b3IgJiYgIXN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkpKSB7Ci0JCQkJd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gY3JlYXRlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZvciBpbnB1dCB3b3JrcHJvZHVjdHMKLQkJCS8vCi0JCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvciB8fCBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSkpIHsKLQkJCQljb2xsZWN0V29ya1Byb2R1Y3REZXNjcnRpcHRvcnModGFzaywgdGFza0Rlc2MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIGNvbmZpZywgYWN0aXZpdHksCi0JCQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwKTsKLQkJCX0KLQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yIHx8IHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCkpKSB7Ci0JCQkJY29sbGVjdFdvcmtQcm9kdWN0RGVzY3J0aXB0b3JzKHRhc2ssIHRhc2tEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgY29uZmlnLCBhY3Rpdml0eSwKLQkJCQkJCXdwRGVzY3JpcHRvcnMsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwKLQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXApOwotCQkJfQotCQotCQkJLy8gY3JlYXRlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZvciBvdXRwdXQgd29ya3Byb2R1Y3RzCi0JCQkvLwotCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgfHwgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpKSkgewotCQkJCWNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycyh0YXNrLCB0YXNrRGVzYywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrX091dHB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCBjb25maWcsIGFjdGl2aXR5LAotCQkJCQkJd3BEZXNjcmlwdG9ycywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCk7Ci0JCQl9Ci0JCX0KLQkKLQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0YXNrRGVzYzsKLQkJfQotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcihUYXNrIHRhc2spIHsKLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCQl0YXNrRGVzYy5zZXRUYXNrKHRhc2spOwotCQl0YXNrRGVzYy5zZXROYW1lKHRhc2suZ2V0TmFtZSgpKTsKLQkJdGFza0Rlc2Muc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsCi0JCQkJLmlzQmxhbmsodGFzay5nZXRQcmVzZW50YXRpb25OYW1lKCkpID8gdGFzay5nZXROYW1lKCkgOiB0YXNrCi0JCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCS8vIHRhc2tEZXNjLnNldEJyaWVmRGVzY3JpcHRpb24odGFzay5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gdGFza0Rlc2M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkZWxpdmVyYWJsZSBwYXJ0cyBmb3IgdGhlIGdpdmVuIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZyb20gdGhlCi0JICogZGVsaXZlcmFibGUgd29yayBwcm9kdWN0cyBvZiB0aGUgZ2l2ZW4gZGVsaXZlcmFibGUgYWRkIHB1dCB0aGVtIGluCi0JICogPGNvZGU+d3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGUKLQkgKiBAcGFyYW0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzCi0JICogICAgICAgICAgICAob3V0cHV0KSBtYXAgb2Ygd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gaXRzIG5ld2x5IGNyZWF0ZWQKLQkgKiAgICAgICAgICAgIGRlbGl2ZXJhYmxlIHBhcnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlbGl2ZXJhYmxlUGFydHMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCwKLQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCU1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCkgewotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQotCQlMaXN0IGRlbGl2ZXJlZFdQcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZShkZWxpdmVyYWJsZSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwKLQkJCQljb25maWcpOwotCQlMaXN0IHBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAod3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGl2ZXJlZFdQcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlwYXJ0cy5hZGQoUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCQkJCShXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCksIGNvbmZpZywKLQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cykpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsaXZlcmVkV1BzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iod29ya1Byb2R1Y3QsIHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCksIGNvbmZpZyk7Ci0JCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQlkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCQkJCQl3b3JrUHJvZHVjdCwgY29uZmlnLCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwpIHsKLQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChkZXNjKTsKLQkJCQkJfQotCQkJCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyhkZXNjLCAoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0LAotCQkJCQkJCQljb25maWcsIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgZGVzY3JpcHRvcnNUb1JlZnJlc2gpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXBhcnRzLmFkZChkZXNjKTsKLQkJCX0KLQkJfQotCQlpZiAoIXBhcnRzLmlzRW1wdHkoKSkgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnB1dCh3cGQsIHBhcnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QKLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cwotCSAqICAgICAgICAgICAgKG91dHB1dCkgbWFwIG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGl0cyBuZXdseSBjcmVhdGVkCi0JICogICAgICAgICAgICBkZWxpdmVyYWJsZSBwYXJ0cwotCSAqIEByZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QgYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQlXb3JrUHJvZHVjdCB3cCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSBQcm9jZXNzVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3ApOwotCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSAmJiB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCkgewotCQkJY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cGQsIChEZWxpdmVyYWJsZSkgd3AsIGNvbmZpZywKLQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gd3BkOwotCX0KLQotCS8qKgotCSAqIEdldCBpbmhlcnRpZWQgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHJvbGUsIHRhc2sgb3Igd29ya1Byb2R1Y3QuIFVubGlrZSBsb2NhbCBkZXNjcmlwdG9yLCBhbiBpbmhlcml0ZWQgCi0JICogZGVzY3JpcHRvciB0aGF0IGlzIGV4dGVybmFsbHkgc3VwcHJlc3NlZCBpcyBjb25zaWRlcmVkIHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIGRlc2NyaXB0b3Igb2YgdGhlIG9iamVjdCwgbnVsbCBpZiBub3QgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJZm9yIChWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQl2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMgfHwgdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT047Ci0JCQl2YXJpYWJpbGl0eVR5cGUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYmFzZUFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCU9iamVjdCBkZXNjID0gZ2V0RGVzY3JpcHRvcihvYmosIGJhc2VBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLCBjb25maWcsIGZhbHNlKTsKLQkJCQlpZihkZXNjICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCQkJCWFjdGl2aXR5ID0gYmFzZUFjdGl2aXR5OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWFwIG9mIHRhc2sgdG8gZmVhdHVyZXMgdGhhdCBjb250YWluIHRoZSB3b3JrIHByb2R1Y3QgCi0JICogKGlucHV0IG9yIG91dHB1dCBvZiB0aGUgdGFzaykKLQkgKiAKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIE1hcCBvZiB0YXNrIHRvIGZlYXR1cmVzIHRoYXQgY29udGFpbiB0aGUgd29yayBwcm9kdWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0RmVhdHVyZXNNYXAoTGlzdCB0YXNrcywgV29ya1Byb2R1Y3Qgd3AsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCU1hcCBmZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUVSZWZlcmVuY2VbXSB0YXNrRmVhdHVyZXMgPSB7Ci0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCkKLQkJfTsKLQkJZm9yIChpbnQgaSA9IHRhc2tzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgdGFza3MuZ2V0KGkpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0YXNrRmVhdHVyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSB0YXNrRmVhdHVyZXNbal07Ci0JCQkJT2JqZWN0IHZhbHVlID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0UmVmZXJlbmNlKHRhc2ssIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCQkJaWYoKGZlYXR1cmUuaXNNYW55KCkgJiYgKChMaXN0KXZhbHVlKS5jb250YWlucyh3cCkpIHx8Ci0JCQkJCQl2YWx1ZSA9PSB3cCkgCi0JCQkJewotCQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gKENvbGxlY3Rpb24pIGZlYXR1cmVzTWFwLmdldCh0YXNrKTsKLQkJCQkJaWYoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQotCQkJCQkJZmVhdHVyZXNNYXAucHV0KHRhc2ssIGZlYXR1cmVzKTsKLQkJCQkJfQotCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmZWF0dXJlc01hcDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRGVlcENvcHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRGVlcENvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YmYwNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5OZXN0ZWRDb21tYW5kRXhjZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLS8qKgotICogUGh5c2ljYWxseSBjb3BpZXMgYSBwcm9jZXNzIHdpdGggYWxsIG9mIGl0cyBkaXJlY3Qgb3IgaW5oZXJpdGVkIHN0cnVjdHVyYWwgZmVhdHVyZXMgYW5kIHJlZmVyZW5jZXMuCi0gKiBBZGQgdGhlIG5ld2x5IGNyZWF0ZWQgcHJvY2VzcyB0byB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgcGFja2FnZS4KLSAqICAgIAotICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCB0byByZXVzZSBtb3N0IG9mIGl0J3MgZnVuY3Rpb25hbGl0eS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCBleHRlbmRzIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kIHsKLQotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0UGFja2FnZTsKLQlwcml2YXRlIFByb2Nlc3NDb21wb25lbnQgdGVtcFBjOwotCXByaXZhdGUgU3RyaW5nIG5ld1Byb2Nlc3NOYW1lOwotCXByaXZhdGUgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvciBuZXN0ZWRDb21tYW5kRXhlY3V0b3I7Ci0JCi0JcHVibGljIFByb2Nlc3NEZWVwQ29weUNvbW1hbmQob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MsIFN0cmluZyBuZXdQcm9jZXNzTmFtZSwKLQkJCUNvcHlIZWxwZXIgY29weUhlbHBlciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFByb2Nlc3NQYWNrYWdlIHRhcmdldFBhY2thZ2UsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQotCQlzdXBlcihwcm9jZXNzLCBjb3B5SGVscGVyLCBjb25maWcsIG51bGwsIG1vbml0b3IsIGNvbmZpZ3VyYXRvcik7Ci0KLQkJdGhpcy5uZXdQcm9jZXNzTmFtZSA9IG5ld1Byb2Nlc3NOYW1lOwkJCi0JCXRoaXMudGFyZ2V0UGFja2FnZSA9IHRhcmdldFBhY2thZ2U7Ci0JCWNyZWF0ZXRhcmdldFByb2Nlc3MoKTsKLQkJLy9UT0RPOiBkaXNhYmxlIGNvcHlpbmcgZGlhZ3JhbXMgZm9yIG5vdwotCQkvLwotLy8JCW5lc3RlZENvbW1hbmRFeGVjdXRvciA9IG5ldyBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKHRoaXMpOwotCX0JCi0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9CQotCQotCXB1YmxpYyBQcm9jZXNzIGdldFRhcmdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiB0YXJnZXRQcm9jZXNzOwotCX0KLQkKLQlwdWJsaWMgUHJvY2VzcyBnZXRTb3VyY2VQcm9jZXNzKCkgewotCQlyZXR1cm4gKFByb2Nlc3MpIGFjdGl2aXR5OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRldGFyZ2V0UHJvY2VzcygpIHsKLQkJLy8gY3JlYXRlIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBuZXcgcHJvY2VzcwotCQkvLyBzaW5jZSB0aGUgY29udGVudCBwcm9jZXNzb3IgbmVlZHMgdG8ga25vdyB0aGUgdGFyZXQgcHJvY2VzcyBpbiBvcmRlciB0byBmaXggdGhlIHVybHMKLQkJCi0JCXRlbXBQYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKTsKLQkJdGFyZ2V0UGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHRlbXBQYyk7Ci0JCQotCQlpZiAoIHN1cGVyLmFjdGl2aXR5IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzICkgewotCQkJdGFyZ2V0UHJvY2VzcyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0UHJvY2VzcyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7CQkJCi0JCX0KLQkJdGFyZ2V0UHJvY2Vzcy5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJdGFyZ2V0UHJvY2Vzcy5zZXRQcmVzZW50YXRpb25OYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJdGVtcFBjLnNldE5hbWUobmV3UHJvY2Vzc05hbWUpOwotCi0JCXRlbXBQYy5zZXRQcm9jZXNzKHRhcmdldFByb2Nlc3MpOwkJCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRFeGVjdXRvciAhPSBudWxsKSB7Ci0JCQluZXN0ZWRDb21tYW5kRXhlY3V0b3IuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewkJCQkKLQkJc3VwZXIuZXhlY3V0ZSgpOwkKLQkJCQkKLQkJLy8gbmV3IGNvcHkgb2YgdGhlIHByb2Nlc3MgbXVzdCBiZSBzYXZlZCBzbyBvdGhlciBuZXN0ZWQgY29tbWFuZHMgbGlrZSBkaWFncmFtIGNvcHkgY29tbWFuZCAKLQkJLy8gY2FuIGJlIGV4ZWN1dGVkLgotCQlpZihwa2dDb3B5ICE9IG51bGwgJiYgcGtnQ29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5zYXZlKHBrZ0NvcHkuZVJlc291cmNlKCkpOwotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZihuZXN0ZWRDb21tYW5kRXhlY3V0b3IgIT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRFeGVjdXRvciAhPSBudWxsKSB7Ci0JCQluZXN0ZWRDb21tYW5kRXhlY3V0b3IudW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCX0KLQkJc3VwZXIudW5kbygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmaXhQcm9jZXNzQ29tcG9uZW50KCkgewotCQkvLyByZXBsYWNlIHRoZSBwbGFjZSBob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvcGllZCBwcm9jZXNzCi0JCWlmIChwa2dDb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCApIHsKLQkJCXBrZ0NvcHkuc2V0TmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClwa2dDb3B5KS5nZXRQcm9jZXNzKCk7Ci0JCQlwcm9jLnNldE5hbWUobmV3UHJvY2Vzc05hbWUpOwotCQkJcHJvYy5zZXRQcmVzZW50YXRpb25OYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJCXRhcmdldFByb2Nlc3MgPSBwcm9jOwotCQkJRWNvcmVVdGlsLnJlcGxhY2UodGVtcFBjLCBwa2dDb3B5KTsKLQkJfQotCX0KLQkKLQkvKiAKLQkgKiByZXR1cm5zIGEgQ29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBuZXcgcHJvY2VzcwotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFJlc3VsdCgpIHsKLQkJaWYocGtnQ29weSAhPSBudWxsICYmIHBrZ0NvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggKChQcm9jZXNzQ29tcG9uZW50KXBrZ0NvcHkpLmdldFByb2Nlc3MoKSk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50QWRkQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjY0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMTYsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50QWRkQ29tbWFuZCBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kIAotaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQKLXsKLQotCXB1YmxpYyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGRpc2FibGUgcnVuIHdpdGggcHJvZ3Jlc3MgYmFyIHdoZW4gYWRkaW5nIGluIHByb2Nlc3MgZWRpdG9yCi0JCS8vCi0JCXN1cGVyKGNvbW1hbmQsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIoY29tbWFuZCwgcnVuV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQjZ2V0RmVhdHVyZXNUb0NoZWNrKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRGZWF0dXJlc1RvQ2hlY2soKSB7Ci0JCWlmIChmZWF0dXJlc1RvQ2hlY2sgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0RmVhdHVyZXNUb0NoZWNrKCkuYWRkKAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzVG9DaGVjazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI3dpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCS8vIGRvbid0IHNhdmUgdGhlIHJlc291cmNlcyBhZnRlciBlYWNoIGFkZAotCQkvLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI3NhdmVNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkvLyBkb24ndCBzYXZlIHRoZSByZXNvdXJjZXMgYWZ0ZXIgZWFjaCBhZGQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQjY3JlYXRlVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUVkaXRpbmdEb21haW4gZG9tYWluID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJJiYgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBFUmVmZXJlbmNlCi0JCQkJJiYgZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlyZXR1cm4gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlVmFsaWRhdG9yKGFkZENvbW1hbmQuZ2V0T3duZXIoKSwgbnVsbCwgZSwKLQkJCQkJZmVhdHVyZSwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVZhbGlkYXRvcihlLCBmZWF0dXJlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY4NjYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEphbiAyNiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZCBleHRlbmRzCi0JCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQlwcml2YXRlIFNldCBjb250ZW50c1RvUmVtb3ZlOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gb3duZWRFbGVtZW50c0luY2x1ZGVkOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlzdXBlcihjb21tYW5kLCBlbGVtZW50cyk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGNvbmZpcm1SZW1vdmVSZWZzCi0JICovCi0JcHVibGljIFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMsIGJvb2xlYW4gY29uZmlybVJlbW92ZVJlZnMpIHsKLQkJc3VwZXIoY29tbWFuZCwgZWxlbWVudHMsIGNvbmZpcm1SZW1vdmVSZWZzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYoIW93bmVkRWxlbWVudHNJbmNsdWRlZCkgewotCQkJQ29sbGVjdGlvbiBvd25lZEVsZW1lbnRzID0gZ2V0T3duZWRFbGVtZW50cyhlbGVtZW50cyk7Ci0JCQlpZighb3duZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQlpbmNsdWRlRWxlbWVudHMob3duZWRFbGVtZW50cyk7Ci0JCQl9Ci0JCQlvd25lZEVsZW1lbnRzSW5jbHVkZWQgPSB0cnVlOwotCQl9Ci0JCQotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldE93bmVkRWxlbWVudHMoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlBcnJheUxpc3Qgb3duZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillbGVtZW50KTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcjEgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3Iod3AsIGZhbHNlKSB7Ci0KLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDIyMTgxNzgyMjY4ODc4Mjg5TDsKLQotCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlyZXR1cm4gKChBcnRpZmFjdClvYmplY3QpLmdldENvbnRhaW5lZEFydGlmYWN0cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfTsKLQkJCQkJSGFzaFNldCB3b3JrUHJvZHVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCQl3aGlsZShpdGVyMS5oYXNOZXh0KCkpIHsKLQkJCQkJCXdvcmtQcm9kdWN0cy5hZGQoaXRlcjEubmV4dCgpKTsKLQkJCQkJfQotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkod3BkKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGJlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGJlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJCQkJCSYmIHdvcmtQcm9kdWN0cy5jb250YWlucygoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYmUpCi0JCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJCQkJb3duZWRFbGVtZW50cy5hZGQoYmUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb3duZWRFbGVtZW50czsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGNsdWRlRWxlbWVudHMoQ29sbGVjdGlvbiBleGNsdWRlZEVsZW1lbnRzKSB7Ci0JCWVsZW1lbnRzLnJlbW92ZUFsbChleGNsdWRlZEVsZW1lbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXhjbHVkZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlSZW1vdmVDb21tYW5kIGNtZCA9IGdldFJlbW92ZUNvbW1hbmQoZWxlbWVudCk7Ci0JCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCWNtZC5nZXRDb2xsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluY2x1ZGVFbGVtZW50cyhDb2xsZWN0aW9uIGluY2x1ZGVkRWxlbWVudHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5jbHVkZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZighZWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJUmVtb3ZlQ29tbWFuZCBjbWQgPSBnZXRSZW1vdmVDb21tYW5kKGVsZW1lbnQpOwotCQkJCWlmKGNtZCAhPSBudWxsKSB7Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IGNtZC5nZXRDb2xsZWN0aW9uKCk7Ci0JCQkJCWlmKCFjb2xsZWN0aW9uLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzKCkgewotCQlpZiAoZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJRU9iamVjdCBwa2cgPSAoKEFjdGl2aXR5KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuYWRkKHBrZyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW1vdmVSZWZlcmVuY2VzKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoKSB7Ci0JCWNvbnRlbnRzVG9SZW1vdmUgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBoYXZlIHRvIHJlbW92ZSB0aGUgZGVsZXRlZCBwcm9jZXNzIGVsZW1lbnRzIGZyb20gaXRzIGNvbnRhaW5lcgotCQkvLyBhbmQvb3IgcmVzb3VyY2UKLQkJLy8gc28gc3VwZXIucmVtb3ZlUmVmZXJlbmNlcygpIGNhbiByZW1vdmUgdGhlaXIgcmVmZXJlbmNlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iajsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmo7Ci0KLQkJCQkJLy8gcmVtb3ZlIGNvbnRlbnQgb2YgdGhlIGFjdGl2aXR5IGZyb20gaXRzIHJlc291cmNlCi0JCQkJCS8vCi0JCQkJCS8vIHJlbW92ZUNvbnRlbnRGcm9tUmVzb3VyY2UoYWN0LCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihhY3QpKSB7Ci0JCQkJCQljb250ZW50c1RvUmVtb3ZlLmFkZChhY3QuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gcmVtb3ZlIHRoZSBwcm9jZXNzIHBhY2thZ2Ugb2YgdGhpcyBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGVPYmouZUNvbnRhaW5lcigpOwotCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY29udGFpbmVyKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250YWluZXIuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlhY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0KLQkJCQkJCQkJLy8gcmVtb3ZlIGNvbnRlbnQgb2YgdGhlIGFjdGl2aXR5IGZyb20gaXRzCi0JCQkJCQkJCS8vIHJlc291cmNlCi0JCQkJCQkJCS8vCi0JCQkJCQkJCS8vIHJlbW92ZUNvbnRlbnRGcm9tUmVzb3VyY2UoYWN0LAotCQkJCQkJCQkvLyBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkJCQkJLmhhc1ByZXNlbnRhdGlvbihhY3QpKSB7Ci0JCQkJCQkJCQljb250ZW50c1RvUmVtb3ZlLmFkZChhY3QKLQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlUmVmZXJlbmNlcygpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kI2RlbGV0ZUNvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUNvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGVudHNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXIubmV4dCgpKTsKLQkJfQotCQllbGVtZW50c1RvRGVsZXRlQ29udGVudC5hZGRBbGwoY29udGVudHNUb1JlbW92ZSk7Ci0JCXN1cGVyLmRlbGV0ZUNvbnRlbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQjY29sbGVjdE9iamVjdHNUb1JlbW92ZShqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKENvbGxlY3Rpb24gb2JqZWN0c1RvUmVtb3ZlLCBFT2JqZWN0IGVsZW1lbnRUb0RlbGV0ZSwgRU9iamVjdCByZWZlcmVuY2VyLCBDb2xsZWN0aW9uIHJlZmVyZW5jZXMpIHsKLQkJYm9vbGVhbiByZXQgPSBzdXBlci5jb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKG9iamVjdHNUb1JlbW92ZSwgZWxlbWVudFRvRGVsZXRlLAotCQkJCXJlZmVyZW5jZXIsIHJlZmVyZW5jZXMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZWYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IHJlZmVyZW5jZXIuZUNvbnRhaW5lcigpOwotCQkJCWlmKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQlvYmplY3RzVG9SZW1vdmUuYWRkKGNvbnRhaW5lcik7Ci0JCQkJCXJldCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihjb250ZW50c1RvUmVtb3ZlICE9IG51bGwpIHsKLQkJCWNvbnRlbnRzVG9SZW1vdmUuY2xlYXIoKTsKLQkJfQotCQlpZihlbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQllbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkNmM3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE5vdiAzMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gVEFTS19ERVNDUklQVE9SX19SRUxBVElPTlNISVBTID0gewotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAkJCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFJPTEVfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUyA9IHsKLQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycywKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUyA9IHsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzCi0JfTsKLQkKLQlwcml2YXRlIEhhc2hTZXQgcmVtb3ZlZERlc2NyaXB0b3JzOwotCXByb3RlY3RlZCBib29sZWFuIGFib3J0ZWQ7IAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Fib3J0ZWQoKSB7Ci0JCXJldHVybiBhYm9ydGVkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudChEZXNjcmlwdG9yIG9iaikgewotCQkvLyBBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCS8vIGZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkvLyBmYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCS8vIGZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIGZhY3RvcnkuYWRhcHQob2JqLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBPYmplY3QgYWN0ID0gcHJvdmlkZXIuZ2V0UGFyZW50KG9iaik7Ci0JCS8vCi0JCS8vIHJldHVybiBhY3Q7Ci0KLQkJcmV0dXJuIFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkob2JqKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGUoT2JqZWN0W10gcmVmVG9iZURlbGV0ZWQpIHsKLQkJaWYgKHJlZlRvYmVEZWxldGVkICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmVG9iZURlbGV0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlEZXNjcmlwdG9yIG9iaiA9IChEZXNjcmlwdG9yKSByZWZUb2JlRGVsZXRlZFtpXTsKLQkJCQkvLyBnZXQgcGFyZW50IGFuZCByZW1vdmUgcmVmIG9iamVjdAotCQkJCU9iamVjdCBhY3QgPSBnZXRQYXJlbnQob2JqKTsKLQkJCQlpZiAoYWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCgoQWN0aXZpdHkpIGFjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUob2JqKSkgewotCQkJCQkJZ2V0UmVtb3ZlZERlc2NyaXB0b3JzKCkuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZW1vdmVkRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChyZW1vdmVkRGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJcmVtb3ZlZERlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlZERlc2NyaXB0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVwbGFjZUFjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVwbGFjZUFjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjNmOTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlcGxhY2VBY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VBY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBWYXJ5QWN0aXZpdHlDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIFJlcGxhY2VBY3Rpdml0eUNvbW1hbmQoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlzdXBlcih3cmFwcGVyKTsKLQkJc2V0TGFiZWwoTGlicmFyeUVkaXRSZXNvdXJjZXMubG9jYWxSZXBsYWNlc190ZXh0KTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVmFyeUFjdGl2aXR5Q29tbWFuZCNkb1ZhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFyeSgpIHsKLQkJUHJvY2Vzc1V0aWwucmVwbGFjZUFjdGl2aXR5TG9jYWxseSh3cmFwcGVyLCBjcmVhdGVkQWN0aXZpdGllcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZUFzc29jaWF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4NmE3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlQXNzb2NpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlQXNzb2NpYXRpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUFSWSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERJVElPTkFMID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU0lTVEVEID0gMjsKLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yOwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcjsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igb2xkUm9sZURlc2NyaXB0b3I7Ci0KLQlwdWJsaWMgUm9sZUFzc29jaWF0aW9uKGludCB0eXBlLCBSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciwKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMucm9sZURlc2NyaXB0b3IgPSByb2xlRGVzY3JpcHRvcjsKLQkJdGhpcy50YXNrRGVzY3JpcHRvciA9IHRhc2tEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBSb2xlRGVzY3JpcHRvciBnZXRPbGRSb2xlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG9sZFJvbGVEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9sZFJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9sZFJvbGVEZXNjcmlwdG9yKSB7Ci0JCXRoaXMub2xkUm9sZURlc2NyaXB0b3IgPSBvbGRSb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3IgZ2V0Um9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3IgZ2V0VGFza0Rlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZVRlYW1Qcm9maWxlQXNzb2NpYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTI4ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZVRlYW1Qcm9maWxlQXNzb2NpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVsIDI5LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGVhbVByb2ZpbGVBc3NvY2lhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OWU1MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCBmb3Igb25lLXdheSBzeW5jaHJvbml6YXRpb24gZnJvbSBtZXRob2QgdG8gcHJvY2Vzcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBOb3YgMjIsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWJvcnRlZDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGRlbGV0ZUxpc3Q7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjU3VjY2Vzc2Z1bDsKLQotCXByb3RlY3RlZCBMaXN0IGRlbGV0ZUNvbW1hbmRMaXN0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VjY2Vzc2Z1bDsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIFNldCBzeW5jaEZlYXR1cmVzOwotCi0JcHJpdmF0ZSBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBhY3Rpdml0aWVzOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dTdWNjZXNzZnVsTXNnID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbnRpYWxpemVkOwotCQotCXByaXZhdGUgQmF0Y2hDb21tYW5kIGJhdGNoQ29tbWFuZCA9IG5ldyBCYXRjaENvbW1hbmQoZmFsc2UpOwotCXByaXZhdGUgTWFwPFZhcmlhYmlsaXR5RWxlbWVudCwgVmFyaWFiaWxpdHlFbGVtZW50PiByZXBsYWNlclRvQmFzZU1hcCA9IG5ldyBIYXNoTWFwPFZhcmlhYmlsaXR5RWxlbWVudCwgVmFyaWFiaWxpdHlFbGVtZW50PigpOyAgCi0KLS8vCXByaXZhdGUgT2JqZWN0IFVJQ29udGV4dDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBTeW5jaHJvbml6ZUNvbW1hbmQgdGhhdCB1c2UgdGhlIHByb2Nlc3MgZGVmYXVsdAotCSAqIGNvbmZpZ3VyYXRpb24gdG8gc3luY2hyb25pemUgYWxsIHRoZSBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU3luY2hyb25pemVDb21tYW5kIHRoYXQgdXNlIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIAotCSAqIGFuZCBsaXN0IG9mIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzIHRvIHN5bmNocm9uaXplCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzIHRoZSBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcwotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZUNvbW1hbmQoQ29sbGVjdGlvbiBlbGVtZW50cywgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzLCBib29sZWFuIHNob3dTdWNjZXNzZnVsTXNnKSB7Ci0JCXN1cGVyKExpYnJhcnlFZGl0UmVzb3VyY2VzLkF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJdGhpcy5zaG93U3VjY2Vzc2Z1bE1zZyA9IHNob3dTdWNjZXNzZnVsTXNnOyAKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3luY2hyb25pemF0aW9uRmVhdHVyZXMoU2V0IHN5bmNoRmVhdHVyZXMpIHsKLQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRvSW5pdGlhbGl6ZSgpIHsKLQkJY29tbWFuZExpc3QuY2xlYXIoKTsKLQkJCi0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZGVsZXRlQ29tbWFuZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRlbGV0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWFkZFRvRGVsZXRlTGlzdChlbGVtZW50LCBkZWxldGVMaXN0KTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWVsZW1lbnRzLnJlbW92ZUFsbChkZWxldGVMaXN0KTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcikgb2JqZWN0OwotCQkJCWlmIChkZXNjcmlwdG9yLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJCQkmJiAhZGVsZXRlTGlzdC5jb250YWlucyhkZXNjcmlwdG9yKSkgewotCQkJCQlpZihkZXNjcmlwdG9yLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsJCQkJCQkKLQkJCQkJCS8vIGRlc2NyaXB0b3IgaXMgdXNlZCBieSBUZWFtUHJvZmlsZSB0byByZXByZXNlbnQgYSByb2xlIG9yIHVzZWQgYnkgYSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9yIHRvCi0JCQkJCQkvLyByZXByZXNlbnQgYSBkZWxpdmVyYWJsZSBwYXJ0Ci0JCQkJCQkvLwotCQkJCQkJaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilkZXNjcmlwdG9yKS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJCQlhcHBlbmQobmV3IFN5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWFwcGVuZChuZXcgQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kKGRlc2NyaXB0b3IsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJQWN0aXZpdHkgYWN0ID0gZGVzY3JpcHRvci5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCVRhc2sgdGFzayA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iamVjdCkuZ2V0VGFzaygpOwotCQkJCQkJCWlmICh0YXNrICE9IG51bGwpIHsKLQkJCQkJCQkJaWYocmVwbGFjZXJUb0Jhc2VNYXAuY29udGFpbnNLZXkodGFzaykpIHsKLQkJCQkJCQkJCXRhc2sgPSAoVGFzaykgcmVwbGFjZXJUb0Jhc2VNYXAuZ2V0KHRhc2spOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWFwcGVuZChuZXcgV0JTRHJvcENvbW1hbmQoYWN0LCBDb2xsZWN0aW9ucwotCQkJCQkJCQkJCS5zaW5nbGV0b25MaXN0KHRhc2spLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqZWN0KS5nZXRSb2xlKCk7Ci0JCQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJCQlpZihyZXBsYWNlclRvQmFzZU1hcC5jb250YWluc0tleShyb2xlKSkgewotCQkJCQkJCQkJcm9sZSA9IChSb2xlKSByZXBsYWNlclRvQmFzZU1hcC5nZXQocm9sZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYXBwZW5kKG5ldyBPQlNEcm9wQ29tbWFuZChhY3QsIENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3Qocm9sZSksIGNvbmZpZywgc3luY2hGZWF0dXJlcywgY29uZmlndXJhdG9yKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3QpCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJCQkJaWYocmVwbGFjZXJUb0Jhc2VNYXAuY29udGFpbnNLZXkod3ApKSB7Ci0JCQkJCQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgcmVwbGFjZXJUb0Jhc2VNYXAuZ2V0KHdwKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlhcHBlbmQobmV3IFBCU0Ryb3BDb21tYW5kKGFjdCwgQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkuc2luZ2xldG9uTGlzdCh3cCksIGNvbmZpZywgc3luY2hGZWF0dXJlcywgY29uZmlndXJhdG9yKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFwcGVuZENvbW1hbmRzKChBY3Rpdml0eSkgb2JqZWN0KTsKLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlhcHBlbmRDb21tYW5kcygoVGVhbVByb2ZpbGUpb2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIWRlbGV0ZUxpc3QuaXNFbXB0eSgpIHx8ICFjb21tYW5kTGlzdC5pc0VtcHR5KCkgfHwgIWFjdGl2aXRpZXMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluaXRpbGl6ZSgpIHsKLQkJYm9vbGVhbiBiID0gaXNQcmVwYXJlZDsKLQkJdHJ5IHsKLQkJCS8vIHNpbmNlIEVjbGlwc2UgMy4zLCBDb21wb3VuZENvbW1hbmQuYXBwZW5kKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBpc1ByZXBhcmVkIGlzIGFscmVhZHkgc2V0Ci0JCQkvLyBidXQgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGlzUHJlcGFyZWQgaXMgc2V0IGluIGNhbkV4ZWN1dGUoKSBhbmQgaXQgbWFrZXMgbWFueSBjYWxscyB0byBhcHBlbmQoKQotCQkJLy8gd29yay1hcm91bmQgaXMgdG8gdW5zZXQgaXNQcmVwYXJlZCBhdCBiZWdpbm5pbmcgb2YgdGhpcyBtZXRob2QgYW5kIHNldCBpdCBiYWNrIHRvIG9sZCB2YWx1ZSBhdCBtZXRob2QgZW5kLgotCQkJLy8KLQkJCWlzUHJlcGFyZWQgPSBmYWxzZTsKLQkJCXJldHVybiBpbnRpYWxpemVkID0gZG9Jbml0aWFsaXplKCk7CQkKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlzUHJlcGFyZWQgPSBiOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGludGlhbGl6ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGlhbGl6ZWQoKSB7Ci0JCXJldHVybiBpbnRpYWxpemVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDb21tYW5kcyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdvcmtQcm9kdWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCWlmICgoKERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkKLQkJCQkJCSYmICFkZWxldGVMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCVRhc2sgdGFzayA9ICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFRhc2soKTsKLQkJCQkJCWlmICh0YXNrICE9IG51bGwpIHsKLQkJCQkJCQlpZihyZXBsYWNlclRvQmFzZU1hcC5jb250YWluc0tleSh0YXNrKSkgewotCQkJCQkJCQl0YXNrID0gKFRhc2spIHJlcGxhY2VyVG9CYXNlTWFwLmdldCh0YXNrKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGFza3MuYWRkKHRhc2spOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0Um9sZSgpOwotCQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJCWlmKHJlcGxhY2VyVG9CYXNlTWFwLmNvbnRhaW5zS2V5KHJvbGUpKSB7Ci0JCQkJCQkJCXJvbGUgPSAoUm9sZSkgcmVwbGFjZXJUb0Jhc2VNYXAuZ2V0KHJvbGUpOwotCQkJCQkJCX0KLQkJCQkJCQlyb2xlcy5hZGQocm9sZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCWlmKHJlcGxhY2VyVG9CYXNlTWFwLmNvbnRhaW5zS2V5KHdwKSkgewotCQkJCQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgcmVwbGFjZXJUb0Jhc2VNYXAuZ2V0KHdwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJd29ya1Byb2R1Y3RzLmFkZCh3cCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlhcHBlbmRDb21tYW5kcygoVGVhbVByb2ZpbGUpZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCWFwcGVuZChuZXcgV0JTRHJvcENvbW1hbmQoYWN0aXZpdHksIHRhc2tzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpKTsKLQkJfQotCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJYXBwZW5kKG5ldyBPQlNEcm9wQ29tbWFuZChhY3Rpdml0eSwgcm9sZXMsIGNvbmZpZywgc3luY2hGZWF0dXJlcywgY29uZmlndXJhdG9yKSk7Ci0JCX0KLQkJaWYgKCF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlhcHBlbmQobmV3IFBCU0Ryb3BDb21tYW5kKGFjdGl2aXR5LCB3b3JrUHJvZHVjdHMsIGNvbmZpZywKLQkJCQkJc3luY2hGZWF0dXJlcywgY29uZmlndXJhdG9yKSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWFwcGVuZENvbW1hbmRzKChBY3Rpdml0eSkgaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhcHBlbmRDb21tYW5kcyhUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodGVhbSwgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJVGVhbVByb2ZpbGUgdGVhbSA9ICgoVGVhbVByb2ZpbGUpb2JqZWN0KTsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QodGVhbS5nZXRTdWJUZWFtKCkpOwotCQkJCQljaGlsZHJlbi5hZGRBbGwodGVhbS5nZXRUZWFtUm9sZXMoKSk7Ci0JCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQotCQkJLy8gc3luY2ggb25seSBvd24gcm9sZSBkZXNjcmlwdG9yIG9mIHRlYW0gcHJvZmlsZQotCQkJLy8KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICYmICgoUm9sZURlc2NyaXB0b3Ipb2JqKS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJYXBwZW5kKG5ldyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoKERlc2NyaXB0b3IpIG9iaiwgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQotCQkJT2JqZWN0IGNtZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKCgoSVJlc291cmNlQXdhcmVDb21tYW5kKWNtZCkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHNldFVJQ29udGV4dChPYmplY3QgVUlDb250ZXh0KSB7Ci0vLwkJdGhpcy5VSUNvbnRleHQgPSBVSUNvbnRleHQ7Ci0vLwl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gZGVsZXRlIGFsbCBkZXNjcmlwdG9ycyB3aG9zZSBsaW5rZWQgZWxlbWVudCBhcmUgbm8gbG9uZ2VyIGluIHRoZQotCQkvLyBjb25maWd1cmF0aW9uCi0JCS8vCi0JCWlmICghZGVsZXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCUNvbW1hbmQgY21kID0gZGVsZXRlKGRlbGV0ZUxpc3QpOwotCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJZGVsZXRlQ29tbWFuZExpc3QuYWRkKGNtZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWJhdGNoQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQotCQlpZiAoIWFib3J0ZWQpIHsKLS8vCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLS8vCi0vLwkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotLy8JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotLy8JCQkJCXByZUV4ZWNTdWNjZXNzZnVsID0gcHJlRXhlY3V0ZSgpOwotLy8JCQkJfQotLy8KLS8vCQkJfTsKLS8vCQkJCQkJCi0vLwkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGZhbHNlLCBudWxsKTsKLS8vCi0vLwkJCWlmIChwcmVFeGVjU3VjY2Vzc2Z1bCkgewotLy8JCQkJdHJ5IHsKLS8vCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotLy8JCQkJCQkKLS8vCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJCQkJc3VwZXJSZWRvKCk7Ci0vLwkJCQkJCQlzdWNjZXNzZnVsID0gdHJ1ZTsKLS8vCQkJCQkJfQotLy8JCQkJCQkKLS8vCQkJCQl9KTsKLS8vCQkJCX0KLS8vCQkJCWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotLy8JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoZ2V0TGFiZWwoKSwgZS50b1N0cmluZygpKTsKLS8vCQkJCX0KLS8vCQkJfQotCQkJCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcHJlRXhlY1N1Y2Nlc3NmdWwgPSBwcmVFeGVjdXRlKCk7Ci0JCQkJCWlmKHByZUV4ZWN1dGUoKSkgewotCQkJCQkJc3VwZXJSZWRvKCk7Ci0JCQkJCQlzdWNjZXNzZnVsID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBnZXRMYWJlbCgpKTsKLQkJCQotCQkJaWYgKHN1Y2Nlc3NmdWwpIHsJCQkJCi0JCQkJaWYoIWFjdGl2aXRpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWlmKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBuZXcgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKGVsZW1lbnRzLCB0cnVlLCBkZWxldGVMaXN0KSB7Ci0JCQkJCQkJCi0JCQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpIHsKLQkJCQkJCQkJcmV0dXJuIFN5bmNocm9uaXplQ29tbWFuZC50aGlzLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfTsKLQkJCQkJCWRlbGV0ZUNvbW1hbmRMaXN0LmFkZChkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQpOwotCQkJCQl9Ci0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChzaG93U3VjY2Vzc2Z1bE1zZykgewotCQkJCQlpZighcmVwbGFjZXJUb0Jhc2VNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZWZyZXNoVmlld2VyKCk7Ci0JCQkJCX0KLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dJbmZvKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuU3luY2hyb25pemVDb21wbGV0ZURpYWxvZ19UaXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLkF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFZpZXdlcigpIHsKLQkJaWYoZWxlbWVudHMuaXNFbXB0eSgpKSAgcmV0dXJuOwotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudHMuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgVG5nQWRhcHRlckZhY3RvcnkucHJvY2Vzc0FkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LnByb2Nlc3NBZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCVByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIoYWRhcHRlckZhY3RvcnksIHByb2MpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUmVkbygpIHsKLQkJc3VwZXIucmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdWNlc3NmdWwoKSB7Ci0JCXJldHVybiBzdWNjZXNzZnVsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yIGNvbW1hbmRzID0gY29tbWFuZExpc3QubGlzdEl0ZXJhdG9yKCk7IGNvbW1hbmRzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjb21tYW5kID0gY29tbWFuZHMubmV4dCgpOwotCQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIEJTRHJvcENvbW1hbmQgJiYgISgoQlNEcm9wQ29tbWFuZCljb21tYW5kKS5wcmVFeGVjdXRlKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCS8vIGJlIHBvbGl0ZSB0byBvdGhlciB0aHJlYWRzIChubyBlZmZlY3Qgb24gc29tZSBwbGF0Zm9ybXMpCi0JCQkvLwotCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybiB0aGUgZXhlY3V0ZWQgY29tbWFuZCB0aGF0IGRlbGV0ZWQgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpIHsKLQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQlDb21tYW5kIGNtZCA9IG5ldyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQoUmVtb3ZlQ29tbWFuZC5jcmVhdGUoZG9tYWluLAotCQkJCWVsZW1lbnRzKSwgZWxlbWVudHMpOwotCQljbWQuZXhlY3V0ZSgpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBnZXRDb25maWd1cmF0b3IoKSB7Ci0JCWlmIChjb25maWd1cmF0b3IgPT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSB0aGlzLmNvbmZpZzsKLQkJCWlmKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50cwotCQkJCQkJLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCQljb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQl9Ci0JCQljb25maWd1cmF0b3IgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdG9yRmFjdG9yeSgpCi0JCQkJCS5jcmVhdGVDb25maWd1cmF0b3IoY29uZmlnKTsKLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGRlbGV0ZUxpc3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9EZWxldGVMaXN0KE9iamVjdCBlbGVtZW50LCBMaXN0IGRlbGV0ZUxpc3QpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQlpZiAoIWdldENvbmZpZ3VyYXRvcigpLmFjY2VwdChlbGVtZW50KSkgewotCQkJCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlbGVtZW50KTsJCQkJCi0JCQkJaWYobGlua2VkRWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCAmJiBUbmdVdGlsLmlzUmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCkgbGlua2VkRWxlbWVudCkpIHsKLQkJCQkJLy8gaWYgdGhlIGxpbmtlZCBlbGVtZW50IG9mIHRoZSBkZXNjcmlwdG9yIGlzIGEgcmVwbGFjZXIsIGRlbGV0ZSB0aGUgZGVzY3JpcHRvciBpbiB0aGlzIHN5bmNocm9uaXphdGlvbgotCQkJCQkvLyBvbmx5IGlmIHRoZSBiYXNlIG9mIGxpbmtlZCBlbGVtZW50IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbgotCQkJCQkvLwotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KWxpbmtlZEVsZW1lbnQpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJd2hpbGUoYmFzZSAhPSBudWxsICYmIFRuZ1V0aWwuaXNDb250cmlidXRvck9yUmVwbGFjZXIoYmFzZSkpIHsKLQkJCQkJCWJhc2UgPSBiYXNlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZihiYXNlICE9IG51bGwpIHsKLQkJCQkJCWlmKCFnZXRDb25maWd1cmF0b3IoKS5hY2NlcHQoYmFzZSkpIHsKLQkJCQkJCQlkZWxldGVMaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWJhdGNoQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWUoKEVPYmplY3QpIGVsZW1lbnQsIAotCQkJCQkJCQkJUHJvY2Vzc1V0aWwuZ2V0TGlua1JlZmVyZW5jZSgoRGVzY3JpcHRvcikgZWxlbWVudCksIGJhc2UpOwotCQkJCQkJCXJlcGxhY2VyVG9CYXNlTWFwLnB1dCgoVmFyaWFiaWxpdHlFbGVtZW50KSBsaW5rZWRFbGVtZW50LCBiYXNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVsZXRlTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWRkVG9EZWxldGVMaXN0KGl0ZXIubmV4dCgpLCBkZWxldGVMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdXBlclVuZG8oKSB7Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuV2l0aEJ1c3lJbmRpY2F0b3IobmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFkZWxldGVDb21tYW5kTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChMaXN0SXRlcmF0b3IgY29tbWFuZHMgPSBkZWxldGVDb21tYW5kTGlzdAotCQkJCQkJCS5saXN0SXRlcmF0b3IoZGVsZXRlQ29tbWFuZExpc3Quc2l6ZSgpKTsgY29tbWFuZHMKLQkJCQkJCQkuaGFzUHJldmlvdXMoKTspIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRzLnByZXZpb3VzKCk7Ci0JCQkJCQkJY29tbWFuZC51bmRvKCk7Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQkJCS8vIFNraXAgb3ZlciB0aGUgY29tbWFuZCB0aGF0IHRocmV3IHRoZSBleGNlcHRpb24uCi0JCQkJCQkJLy8KLQkJCQkJCQljb21tYW5kcy5uZXh0KCk7Ci0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQkvLyBJdGVyYXRlIGZvcndhcmQgb3ZlciB0aGUgdW5kb25lIGNvbW1hbmRzIHRvCi0JCQkJCQkJCS8vIHJlZG8gdGhlbS4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJd2hpbGUgKGNvbW1hbmRzLmhhc05leHQoKSkgewotCQkJCQkJCQkJQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRzLm5leHQoKTsKLQkJCQkJCQkJCWNvbW1hbmQucmVkbygpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBuZXN0ZWRFeGNlcHRpb24pIHsKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJLmxvZyhuZXcgV3JhcHBlZEV4Y2VwdGlvbigKLQkJCQkJCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfSWdub3JlRXhjZXB0aW9uX2V4Y2VwdGlvbiIpLCBuZXN0ZWRFeGNlcHRpb24pLmZpbGxJblN0YWNrVHJhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0KLQkJCQkJCQl0aHJvdyBleGNlcHRpb247Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzdXBlclVuZG8oKTsKLQkJCQkKLQkJCQliYXRjaENvbW1hbmQudW5kbygpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihhY3Rpdml0aWVzICE9IG51bGwpIHsKLQkJCWFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJfQotCQlpZihkZWxldGVDb21tYW5kTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxldGVDb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBpdGVyLm5leHQoKTsKLQkJCQljbWQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWlmKGRlbGV0ZUxpc3QgIT0gbnVsbCkgewotCQkJZGVsZXRlTGlzdC5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NWU3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBzeW5jaHJvbml6ZSBhdHRyaWJ1dGVzIGFuZCBkZWxpdmVyYWJsZSBwYXJ0cyBvZiBhIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBGZWIgOSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzCi0JCUJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCB7Ci0JCi0JcHJpdmF0ZSBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0JcHJpdmF0ZSBNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzOwotCXByaXZhdGUgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZCAgdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZDsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0JCQlTZXQgc3luY2hGZWF0dXJlcywgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoZGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcywgY29uZmlnKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gdXBkYXRlIGxpbmtlZCBlbGVtZW50IGlmIG5lZWRlZAotCQkvLyBzeW5jaHJvbml6ZSBhdHRyaWJ1dGVzCi0JCS8vCi0JCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCi0JCWlmKGRlc2NyaXB0b3JzVG9SZWZyZXNoID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzID09IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcjsKLQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BkLCAoRGVsaXZlcmFibGUpd3BkLmdldFdvcmtQcm9kdWN0KCksIGNvbmZpZywKLQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCi0JCWlmKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpIHx8ICFkZXNjcmlwdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgPT0gbnVsbCkgewotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgPSBuZXcgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZCh0cnVlLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpOwotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuc2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goZGVzY3JpcHRvcnNUb1JlZnJlc2gpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKS5jbGVhcigpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgd3BEZXNjID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKS5wdXQod3BEZXNjLCAKLQkJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCBlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCQl9Ci0JCQkKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZXhlY3V0ZSgpOwotCQl9CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC51bmRvKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3ODM1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDEwLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0JcHJpdmF0ZSBIYXNoU2V0IGluaGVyaXRlZEVsZW1lbnRzOwotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0czsKLQlwcml2YXRlIEhhc2hNYXAgb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZChTdHJpbmcgbGFiZWwsIENvbGxlY3Rpb24gZWxlbWVudHMsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoYWZmZWN0ZWRPYmplY3RzICE9IG51bGwpIHsKLQkJCWFmZmVjdGVkT2JqZWN0cy5jbGVhcigpOwotCQkJYWZmZWN0ZWRPYmplY3RzID0gbnVsbDsKLQkJfQotCQkKLQkJaWYoaW5oZXJpdGVkRWxlbWVudHMgIT0gbnVsbCkgewotCQkJaW5oZXJpdGVkRWxlbWVudHMuY2xlYXIoKTsKLQkJCWluaGVyaXRlZEVsZW1lbnRzID0gbnVsbDsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwICE9IG51bGwpIHsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5jbGVhcigpOwotCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKS5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYoYWZmZWN0ZWRPYmplY3RzID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBhZmZlY3RlZE9iamVjdHM7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZihhZmZlY3RlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJYWZmZWN0ZWRPYmplY3RzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCWlmKG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCA9PSBudWxsKSB7Ci0JCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWVsc2UgewotCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEluaGVyaXRlZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gd2FzU3VwcHJlc3NlZCA9IHN1cHByZXNzaW9uLmlzSW5TdXBwcmVzc2VkTGlzdCh3cmFwcGVyKTsKLQkJCWlmKHN1cHByZXNzaW9uLnVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2Uod3JhcHBlcikpIHsKLQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKHdyYXBwZXIpOwotCQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5wdXQod3JhcHBlciwgQm9vbGVhbi52YWx1ZU9mKHdhc1N1cHByZXNzZWQpKTsKLQkJCX0JCQkJCQkJCQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewkJCi0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgIT0gbnVsbCAmJiAhb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJQm9vbGVhbiBzdXBwcmVzc2VkID0gKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYoc3VwcHJlc3NlZC5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlzdXBwcmVzc2lvbi5zdXBwcmVzcyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVudHJ5LmdldEtleSgpKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdXBwcmVzc2lvbi5yZXZlYWwoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbnRyeS5nZXRLZXkoKSkpOwotCQkJCX0KLQkJCX0KLQkJCWFmZmVjdGVkT2JqZWN0cy5jbGVhcigpOwotCQkJYWZmZWN0ZWRPYmplY3RzLmFkZEFsbChlbGVtZW50cyk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0SW5oZXJpdGVkRWxlbWVudHMoKSB7Ci0JCWlmKGluaGVyaXRlZEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWluaGVyaXRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciB0cmVlSXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCk7IHRyZWVJdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGUgPSB0cmVlSXRlci5uZXh0KCk7Ci0JCQkJCWlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGUpKSB7Ci0JCQkJCQlpbmhlcml0ZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluaGVyaXRlZEVsZW1lbnRzOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9WYXJ5QWN0aXZpdHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9WYXJ5QWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDNiZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVmFyeUFjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJ5QWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2M7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVkQWN0aXZpdGllczsKLQkKLQlwdWJsaWMgQWN0aXZpdHkgc3VwZXJBY3Rpdml0eTsKLQotCXB1YmxpYyBWYXJ5QWN0aXZpdHlDb21tYW5kKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJcHJvYyA9IChQcm9jZXNzKSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQl9Ci0KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChwcm9jLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByb2MuZVJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjcmVhdGVkQWN0aXZpdGllcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVkQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZWRBY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCX0KLQotCQlkb1ZhcnkoKTsKLQotCQlMaXN0IGxpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3MpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCWxpc3RlbmVyLm5vdGlmeUV4ZWN1dGVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9WYXJ5KCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vIGZpbmQgdGhlIG5ldyB3cmFwcGVyCi0JCS8vCi0JCU9iamVjdCBvd25lciA9IHdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgd3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG93bmVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpcC5nZXRDaGlsZHJlbihvd25lcikuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsJCQotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJgotCQkJCQkoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWNoaWxkKS5nZXRWYWx1ZSgpID09IHdyYXBwZXIuZ2V0VmFsdWUoKSkgewotCQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCUxpc3QgbGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoVmFyeUFjdGl2aXR5Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJbGlzdGVuZXIucHJlVW5kbyh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCWlmICghY3JlYXRlZEFjdGl2aXRpZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXN0b3JlT3JkZXIoKTsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY3JlYXRlZEFjdGl2aXRpZXMuZ2V0KDApOwotCQkJc3VwZXJBY3Rpdml0eSA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCWFjdC5zZXRTdXBlckFjdGl2aXRpZXMobnVsbCk7Ci0JCQljcmVhdGVkQWN0aXZpdGllcy5jbGVhcigpOwotCQl9Ci0JCQotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCWxpc3RlbmVyLnBvc3RVbmRvKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIG9yZGVyIG9mIHRoZSBzaWJsaW5ncyBvZiB0aGUgd3JhcHBlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVPcmRlcigpIHsKLQkJQWN0aXZpdHkgdmFyaWVkQWN0ID0gKEFjdGl2aXR5KSBjcmVhdGVkQWN0aXZpdGllcy5nZXQoY3JlYXRlZEFjdGl2aXRpZXMuc2l6ZSgpIC0gMSk7Ci0JCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9IHZhcmllZEFjdC5nZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJaWYocHJldiAhPSBudWxsICYmIHByb2MgPT0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHByZXYpKSB7Ci0JCQlwcmV2LnNldFByZXNlbnRlZEFmdGVyKGJlKTsKLQkJfQotCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSB2YXJpZWRBY3QuZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJaWYobmV4dCAhPSBudWxsICYmIHByb2MgPT0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKG5leHQpKSB7Ci0JCQluZXh0LnNldFByZXNlbnRlZEJlZm9yZShiZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBjcmVhdGVkQWN0aXZpdGllczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA3OGNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotCi0vKioKLSAqIERyYWcgYW5kIGRyb3AgY29tbWFuZCB0byBkcm9wIHRhc2tzIGluIFdCUyBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdCU0RyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBXQlNEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiV0JTRHJhZ0FuZERyb3BDb21tYW5kLmFjY2VwdCgpOiBvYmo9IitvYmopOwotCi0JCWlmKG9iaiBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgKEFjdGl2aXR5KSBvd25lciwKLS8vCQkJCQkJKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0RyYWdBbmREcm9wQ29tbWFuZCNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLCBMaXN0IGRyb3BTcmMpIHsKLQkJcmV0dXJuIG5ldyBXQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wU3JjKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0Ryb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3NWYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lUE5hbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBkcmFwIGFuZCBkcm9wIHRhc2tzIG9udG8gYW4gYWN0aXZpdHkgaW4gd29yayBicmVha2Rvd24gc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0Ryb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgcm9sZURlc2NMaXN0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgd3BEZXNjTGlzdDsKLQotCXByaXZhdGUgSGFzaE1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHM7Ci0KLQlwcml2YXRlIEhhc2hNYXA8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwOwotCi0JcHJpdmF0ZSBIYXNoTWFwPFJvbGVEZXNjcmlwdG9yLCBUZWFtUHJvZmlsZT4gcm9sZURlc2NUZWFtUHJvZmlsZU1hcDsKLQkKLQlwcml2YXRlIElFeGVjdXRvciBleGVjdXRvcjsKLQotCXByaXZhdGUgY2xhc3MgRXhlY3V0b3IgaW1wbGVtZW50cyBJRXhlY3V0b3IgewotCi0JCXB1YmxpYyBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCQl0YXNrRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IHN5bmNocm9uaXplID8gYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgOiBudWxsOwotCi0JCQlMaXN0IGJlcyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIHVuaXF1ZU5hbWVzSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyKGJlcyk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZHJvcEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGRyb3BFbGVtZW50cy5nZXQoaSk7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVUYXNrRGVzY3JpcHRvcih0YXNrLAotCQkJCQkJYWN0aXZpdHksIHJvbGVEZXNjTGlzdCwgd3BEZXNjTGlzdCwKLQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywKLQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCWJhdGNoQ29tbWFuZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgCi0JCQkJCQlXQlNEcm9wQ29tbWFuZC50aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQkJCXN5bmNocm9uaXplLAotCQkJCQkJc3luY2hGZWF0dXJlcyk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKGRlc2MpOwotCQkJCQl0YXNrRGVzY0xpc3QuYWRkKGRlc2MpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQWRkIHVuaXF1ZSBuYW1lIGNoZWNrIGZvciByb2xlZGVzYyBhbmQgd3AgZGVzY3JpcHRvcnMgYXMgd2VsbAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlRGVzY0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NMaXN0LmdldChpKTsJCQkKLQkJCQlpZiAocm9sZURlc2MgIT0gbnVsbCkgewotCQkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKHJvbGVEZXNjKTsJCi0JCQkJfQotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3cERlc2NMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwRGVzY0xpc3QuZ2V0KGkpOwkJCQotCQkJCWlmICh3cERlc2MgIT0gbnVsbCkgewotCQkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKHdwRGVzYyk7CQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAhdGFza0Rlc2NMaXN0LmlzRW1wdHkoKQotCQkJCQl8fCAhcm9sZURlc2NMaXN0LmlzRW1wdHkoKQotCQkJCQl8fCAhd3BEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQkJfHwgIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkKLQkJCQkJfHwgIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKQotCQkJCQl8fCBiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9FeGNlY3V0ZSgpIHsKLQkJCS8vIGF1dG9tYXRpY2FsbHkgYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGRlbGl2ZXJhYmxlIHBhcnQKLQkJCS8vCi0JCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJCWZvciAoTWFwLkVudHJ5PFdvcmtQcm9kdWN0RGVzY3JpcHRvciwgV29ya1Byb2R1Y3REZXNjcmlwdG9yPiBlbnRyeSA6IAotCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJCWlmICghZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNvbnRhaW5zKAotCQkJCQkJCWVudHJ5LmdldEtleSgpKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKAotCQkJCQkJCQkJZW50cnkuZ2V0S2V5KCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJLmxvZygiV0JTRHJvcENvbW1hbmQ6OmRvRXhlY3V0ZSAtIEFkZGluZyBkZWxpdmVyYWJsZSBwYXJ0IHRvIGRlbGl2ZXJhYmxlIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFkZCB0YXNrIGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkJLy8gYWRkIHJvbGUgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCi0JCQkvLyBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJaWYgKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoCi0JCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYocm9sZURlc2NUZWFtUHJvZmlsZU1hcCA9PSBudWxsKSB7Ci0JCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oCi0JCQkJCQkJYWN0aXZpdHksIHJvbGVEZXNjLmdldFJvbGUoKSk7Ci0JCQkJCWlmICh0ZWFtUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLnB1dChyb2xlRGVzYywgdGVhbVByb2ZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gYWRkIHJvbGUgZGVzY3JpcHRvcnMgdG8gdGVhbSBwcm9maWxlcwotCQkJLy8KLQkJCWZvciAoTWFwLkVudHJ5PFJvbGVEZXNjcmlwdG9yLCBUZWFtUHJvZmlsZT4gZW50cnkgOiByb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQotCQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQkJCX0KLQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9VbmRvKCkgewotCQkJCi0JCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0KLQkJCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQotCQkJLy8gcmVtb3ZlIHRhc2sgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCQkvLyByZW1vdmUgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWlmICghd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKAotCQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIGRlbGl2ZXJhYmxlIHBhcnQKLQkJCS8vCi0JCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMgZnJvbSB0ZWFtIHByb2ZpbGVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGRlc2NyaXB0b3JzIGZyb20gYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkvLwotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0Ci0JICogICAgICAgICAgICB0aGUgYWN0aXZpdHkgdGhhdCB0aGUgZ2l2ZW4gdGFza3MgYXJlIGRyb3BwZWQgb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiAgICAgICAgICAgIHRoZSB0YXNrcyB0byBkcm9wIG9uIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBXQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3QsIExpc3QgdGFza3MpIHsKLQkJc3VwZXIoYWN0LCB0YXNrcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBzeW5jaAotCSAqLwotCXB1YmxpYyBXQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsIGJvb2xlYW4gc3luY2gpIHsKLQkJc3VwZXIoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgc3luY2gpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgV0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcyk7Ci0JfQotCi0JcHVibGljIElFeGVjdXRvciBnZXRFeGVjdXRvcigpIHsKLQkJaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLQkJCWV4ZWN1dG9yID0gbmV3IEV4ZWN1dG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGV4ZWN1dG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGdldEV4ZWN1dG9yKCkucHJlRXhlY3V0ZSgpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlleGVjdXRvci5kb0V4Y2VjdXRlKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKHRhc2tEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGFza0Rlc2NMaXN0OwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCWV4ZWN1dG9yLmRvVW5kbygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyb2xlRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAocm9sZURlc2NUZWFtUHJvZmlsZU1hcCAhPSBudWxsKSB7Ci0JCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJd3BEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCkgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiM2NmYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTIsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kIGV4dGVuZHMKLQkJTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gY29weUhlbHBlcgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKCkgewotCQlzdXBlci5kb0V4ZWN1dGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ29weUNvbW1hbmQjZG9HZXRDaGlsZHJlblRvQ29weSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZG9HZXRDaGlsZHJlblRvQ29weSgpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmRvR2V0Q2hpbGRyZW5Ub0NvcHkoKTsKLQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb3duZXI7Ci0JCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCWlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgcGFydCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJaWYgKHBhcnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCAmJiBwYXJ0ICE9IHdwZCkgewotCQkJCQljaGlsZHJlbi5hZGQocGFydCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWlmIChkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdChvd25lciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ob3duZXIpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZCNkb0dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZG9HZXRSZXN1bHQoKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGQoY29weSk7Ci0KLQkJLy8gQ2hpbGRyZW4gdGhhdCBhcmUgc2hvd24gaW4gQlMgZHVlIHRvIGNoaWxkIHJlbGF0aW9uc2hpcCBvZiBpdHMgbGlua2VkCi0JCS8vIENvbnRlbnRFbGVtZW50Ci0JCS8vIGJ1dCB0aGV5IGFyZSBub3QgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBvd25lci4gV2UgbmVlZCB0byBhZGQKLQkJLy8gdGhlaXIgY29waWVzIHRvIHRoZSByZXN1bHQKLQkJLy8gc28gdGhleSB3aWxsIGJlIGFkZGVkIHRvIGNsaXBib2FyZCBmb3IgbGF0ZXIgcGFzdGUKLQkJLy8KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG93bmVyOwotCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCB3cGQsIGZhbHNlKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZENvcHkgPSBjb3B5SGVscGVyLmdldChUbmdVdGlsLnVud3JhcChpdGVyCi0JCQkJCQkJLm5leHQoKSkpOwotCQkJCQlpZiAoY2hpbGRDb3B5ICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdC5hZGQoY2hpbGRDb3B5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pCi0JCQkoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKS5hZGRDb3B5SW5mbyhyZXN1bHQsCi0JCQkJCWNvcHlIZWxwZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ5ODc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1hbmRzIGZvciBlZGl0aW5nIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIFByb2Nlc3MgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5NzE0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEFjdGl2aXR5IGl0ZW0gcHJvdmlkZXIgZm9yIGNvbnNvbGlkYXRlZCB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFRhc2soKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKSB7Ci0JCU9iamVjdCBwcm9jID0gZ2V0VG9wSXRlbSgpOwotCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocHJvYywKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIpCi0JCQkJCS5zZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQodHJ1ZSk7Ci0JCX0KLQotCQlQcm9jZXNzVXRpbAotCQkJCS5yZWZyZXNoSURzSW5WaWV3ZXJzKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJY2hpbGRyZW4gPSByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIGZhbHNlKTsKLQkJTGlzdCByb2xlRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd3BEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCQkKLQkJCS8vIGRvbid0IHJldHVybiByb2xlZGVzY3JpcHRvciB3aGljaCBhcmUgbGlua2VkIHRvIHRhc2tkZXNjcmlwdG9yCi0JCQkvLyAKLQkJCWlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZTsKLQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0QXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSkgCi0JCQkJewotCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gZG9uJ3QgcmV0dXJuIHdwZGVzY3JpcHRvciB3aGljaCBhcmUgbGlua2VkIHRvIGVpdGhlcgotCQkJLy8gdGFza2Rlc2NyaXB0b3Igb3Igcm9sZWRlc2NyaXB0b3IKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRFeHRlcm5hbElucHV0VG8od3BEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyh3cERlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbSh3cERlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BEZXNjKS5pc0VtcHR5KCkpCi0JCQkJewotCQkJCQl3cERlc2NyaXB0b3JzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbmV3Q2hpbGRyZW4uYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKHJvbGVEZXNjcmlwdG9ycyk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbCh3cERlc2NyaXB0b3JzKTsKLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJCi0JCXJldHVybiBuZXdDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQyOThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBhOWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIFByb2Nlc3MgaXRlbSBwcm92aWRlciBmb3IgY29uc29saWRhdGVkIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwdWJsaWMgUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJLy8gbmVlZCB0byB1cGRhdGUgdGhlIGxpYnJhcnkgdmlldwotCQkJLy8gYnV0IFByb2Nlc3NDb21wb25lbnRzIGRvbid0IGhhdmUgYSBQcmVzZW50YXRpb24gTmFtZSwgc28KLQkJCS8vIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgcHJvY0NvbXAgdG8gaXRzZWxmCi0JCQkvLyB0aGlzIHdpbGwgY2F1c2UgYSByZWZyZXNoCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJaWYgKHByb2MuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQlib29sZWFuIG9sZCA9IHByb2MuZUNvbnRhaW5lcigpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvYy5lQ29udGFpbmVyKCkuZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCQkJCWlmIChwcm9jLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpcHJvYy5lQ29udGFpbmVyKCkpLnNldE5hbWUoKChQcm9jZXNzQ29tcG9uZW50KXByb2MuZUNvbnRhaW5lcigpKS5nZXROYW1lKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXByb2MuZUNvbnRhaW5lcigpLmVTZXREZWxpdmVyKG9sZCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3ZGE2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogUm9sZURlc2NyaXB0b3IgSXRlbSBwcm92aWRlciBmb3IgY29uc29saWRhdGVkIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChuZXcgQ29tbWFuZFBhcmFtZXRlcih0YXJnZXQsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZFRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKGNoaWxkKTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb2JqZWN0LCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVEZXNjcmlwdG9yLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChQcm9jZXNzVXRpbC5pc1JlZnJlc2hSZXF1aXJlZChub3RpZmljYXRpb24sIG51bGwpKSB7Ci0JCQlQcm9jZXNzIHRvcEFjdCA9IChQcm9jZXNzKSBnZXRUb3BJdGVtKCk7Ci0JCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQotCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0JCX0KLQkJCi0JCS8vIHJlZnJlc2ggY2hpbGRyZW4gb2YgdGhpcyBpdGVtIHByb3ZpZGVyLCBpdHMgcGFyZW50IGFjdGl2aXR5IGFuZAotCQkvLyBhbGwgZXh0ZW5kZXJzLCBsb2NhbCBjb250cmlidXRvcnMgb2YgdGhlIHBhcmVudCBhY3Rpdml0eQotCQkvLwotCQlUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5yZWZyZXNoQ2hpbGRyZW4odGhpcywgbm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLS8vCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotLy8JCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCUxpc3QgbmV3Q2hpbGRyZW47Ci0JCi0JCS8vIElmIHJvbGVzIGhhcyBhbnkgb2YgdGFza2Rlc2NyaXB0b3IgbGlua2VkIHRoZW4gZG9uJ3Qgc2hvdyBhbnkKLQkJLy8gY2hpbGRyZW4gb3RoZXJ3aXNlIHNob3cgaXQncyBsaW5rZWQgd29ya3Byb2R1Y3QgZGVzY3JpcHRvcgotCQlpZighQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpIHx8Ci0JCQkJIUFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSB8fAotCQkJCSFBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpKQotCQl7Ci0JCQluZXdDaGlsZHJlbiA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBnZXQgY2hpbGRyZW4KLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQkJbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcihvYmopOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlPYmplY3QgY2hpbGQgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldFZhbHVlKCk7Ci0JCQkJCWlmICgoZmlsdGVyICE9IG51bGwpICYmIChmaWx0ZXIuYWNjZXB0KGNoaWxkKSkpIHsKLQkJCQkJCW5ld0NoaWxkcmVuLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8JCSBzb3J0IHRoZSBjaGlsZHJlbgotCQlDb2xsZWN0aW9ucy5zb3J0KG5ld0NoaWxkcmVuLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgSUZpbHRlciBnZXRGaWx0ZXIoT2JqZWN0IG9iaikgewotCQlJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCWZpbHRlciA9ICgoQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldEZpbHRlcigpOwotCQl9Ci0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhYzYzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvcyBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNhY2hlZENoaWxkcmVuOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKG5ldyBDb21tYW5kUGFyYW1ldGVyKHRhcmdldCwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQkJCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQkJCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRUZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShjaGlsZCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldENyZWF0ZUNoaWxkSW1hZ2Uob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVXcmFwcGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG9iamVjdCwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJd3JhcHBlci5zZXRSZWFkT25seShmYWxzZSk7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgcmVmcmVzaENoaWxkcmVuKEl0ZW1Qcm92aWRlckFkYXB0ZXIgaXBhLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CQkKLQkJaWYgKFByb2Nlc3NVdGlsLmlzUmVmcmVzaFJlcXVpcmVkKG5vdGlmaWNhdGlvbiwgbnVsbCkpIHsKLQkJCWlwYS5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGlwYS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCi0JCQlpZihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkvLyBuZWVkIHRvIHJlZnJlc2ggY2hpbGRyZW4gb2YgcGFyZW50IGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlBY3Rpdml0eSBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnQpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocGFyZW50LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyKQotCQkJCQkuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJcGFyZW50LCB0cnVlLCBmYWxzZSkpOwotCQkJCX0KLQotCQkJCS8vIHJlZnJlc2ggZXh0ZW5kZXJzIGFuZCBsb2NhbCBjb250cmlidXRvcnMgb2YgdGhlIHBhcmVudAotCQkJCS8vCi0JCQkJaWYocGFyZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHBhcmVudCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZih2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUwotCQkJCQkJCQl8fCB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJCQkJYWRhcHRlciA9IFRuZ1V0aWwuZ2V0QWRhcHRlckJ5VHlwZSh2ZSwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJCQkoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIpCi0JCQkJCQkJCS5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQkJCQl2ZSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXJlZnJlc2hDaGlsZHJlbih0aGlzLCBub3RpZmljYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJTGlzdCBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcmltYXJ5UGVyZm9ybWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhZGRpdGlvbmFsUGVyZm9ybWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhc3NpdGVkQnkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWFuZGF0b3J5SW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZXh0ZXJuYWxJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvcHRpb25hbElucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG91dHB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcihvYmopOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCU9iamVjdCBjaGlsZCA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0VmFsdWUoKTsKLQkJCQkKLQkJCQkKLQkJCQlpZiAoKGZpbHRlciAhPSBudWxsKSAmJiAoZmlsdGVyLmFjY2VwdChjaGlsZCkpKSB7Ci0JCQkJCWlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpKSkgewotCQkJCQkJcHJpbWFyeVBlcmZvcm1lcnMuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykKLQkJCQkJCQkuZ2V0RmVhdHVyZSgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKSkgewotCQkJCQkJYWRkaXRpb25hbFBlcmZvcm1lcnMuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkpKSB7Ci0JCQkJCQlhc3NpdGVkQnkuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpLmVxdWFscygKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkpKSB7Ci0JCQkJCQltYW5kYXRvcnlJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpKSkgewotCQkJCQkJZXh0ZXJuYWxJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKSkgewotCQkJCQkJb3B0aW9uYWxJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpKSkgewotCQkJCQkJb3V0cHV0LmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNvcnQgZm9yIGFsbCBjaGlsZHJlbgotCQlDb2xsZWN0aW9ucy5zb3J0KHByaW1hcnlQZXJmb3JtZXJzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChhZGRpdGlvbmFsUGVyZm9ybWVycywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoYXNzaXRlZEJ5LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChleHRlcm5hbElucHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChtYW5kYXRvcnlJbnB1dCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQob3B0aW9uYWxJbnB1dCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQob3V0cHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCi0JCW5ld0NoaWxkcmVuLmFkZEFsbChwcmltYXJ5UGVyZm9ybWVycyk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChhZGRpdGlvbmFsUGVyZm9ybWVycyk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChhc3NpdGVkQnkpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwoZXh0ZXJuYWxJbnB1dCk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChtYW5kYXRvcnlJbnB1dCk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChvcHRpb25hbElucHV0KTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKG91dHB1dCk7Ci0JCQotCQluZXdDaGlsZHJlbiA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihuZXdDaGlsZHJlbiwgdHJ1ZSk7Ci0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwKTsKLQl9Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2V0RmlsdGVyKE9iamVjdCBvYmopIHsKLQkJSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iaik7Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlmaWx0ZXIgPSAoKEFjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRGaWx0ZXIoKTsKLQkJfQotCi0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7IAotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5OTVkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotCi0vKioKLSAqIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBJdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZFRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKGNoaWxkKTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb2JqZWN0LCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJLy8gc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZURlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCS8vIGNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJLy8gcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCS8vIH0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQlMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotCQkvLyBzb3J0IHRoZSBjaGlsZHJlbgotCQlDb2xsZWN0aW9ucy5zb3J0KG5ld0NoaWxkcmVuLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyYTc3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIFByb2Nlc3MgZWRpdG9yJ3MgQ29uc29saWRhdGVkIFZpZXcgcGFnZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDA1YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgaW1wbGVtZW50cwotCQlJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5I2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIGNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLAotCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl2YWx1ZSA9IFRuZ1V0aWwudW53cmFwKHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKChBY3Rpdml0eSkgdmFsdWUsIG93bmVyLAotCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gbmV3IE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIoKE1pbGVzdG9uZSkgdmFsdWUsIG93bmVyLAotCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcigoQ29tcG9zaXRlUm9sZSkgdmFsdWUsCi0JCQkJCW93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoUm9sZURlc2NyaXB0b3IpIHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKFRhc2tEZXNjcmlwdG9yKSB2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LAotCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJcmV0dXJuIG5ldyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIoKFRlYW1Qcm9maWxlKSB2YWx1ZSwKLQkJCQkJb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB2YWx1ZTsKLQkJCWlmICh3cGQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdwZCwgb3duZXIsCi0JCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdwZCwgb3duZXIsCi0JCQkJCWZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbmV3IEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgdmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGVhODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgYSBwcm9jZXNzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmZjNTZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYSBQcm9jZXNzIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MDlmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5BY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGphdmEudXRpbC5Db2xsZWN0aW9uLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0NGE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1MGFhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuUHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5BY3Rpdml0eUl0ZW1Qcm92aWRlciNyZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oamF2YS51dGlsLkNvbGxlY3Rpb24sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2FiYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJhOGFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTQwNDI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWY0NzYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2ZkZjA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCU9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBUQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYmQxM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWMyNzc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2I3N2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MDA5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2M2EwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3NmQ0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCVBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBXUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMmYzZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU1Byb2Nlc3NJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzcxN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyhvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSh3cERlc2MpOwotCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkvLyBjb2xsZWN0IGFsbCBhcnRpZmFjdCBkZXNjcmlwdG9ycyBvciB0aGVpciB3cmFwcGVycyB1bmRlciB0aGUgc2FtZSBhY3Rpdml0eQotCQkJLy8KLQkJCUxpc3QgYXJ0aWZhY3REZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUNvbGxlY3Rpb24gc2libGluZ3MgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2libGluZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yIAotCQkJCQkJJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0Ci0JCQkJCQkmJiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlKSkpIHsKLQkJCQkJYXJ0aWZhY3REZXNjTGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQljaGlsZHJlbi5hZGRBbGwoUHJvY2Vzc1V0aWwuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzRGVzY3JpcHRvcnMod3BEZXNjLCBhcnRpZmFjdERlc2NMaXN0KSk7CQkJCi0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkOGM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhIHByb2Nlc3MgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lBY3Rpb25UeXBlUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSUFjdGlvblR5cGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmRiYjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSUFjdGlvblR5cGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvblR5cGVQcm92aWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1BZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORCA9IDI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVFUF9DT1BZID0gMzsKLQotCXZvaWQgc2V0SW5wdXREYXRhKE9iamVjdCBvYmplY3QpOwotCi0Jdm9pZCBzZXRBY3Rpb25NYW5hZ2VyKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncik7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyBnaXZlbiBjb21tYW5kIGJhc2VkIG9uIHRoZSBjaG9pY2UgdGhhdCB1c2VyIHNlbGVjdGVkIGZyb20gZ2l2ZW4KLQkgKiA8Y29kZT5jaG9pY2VzPC9jb2RlPi4gQ2hvaWNlIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50IHtAbGluayAjQ09QWX0sCi0JICoge0BsaW5rICNFWFRFTkR9LCBvciB7QGxpbmsgI0RFRVBfQ09QWX0KLQkgKiAKLQkgKiBAcGFyYW0gY21kCi0JICogQHBhcmFtIGNob2ljZXMKLQkgKi8KLQl2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjbWQsIGludFtdIGNob2ljZXMpOwotCi0vLwlpbnQgZ2V0QWN0aW9uVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lVSUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9JVUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZWZhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lVSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVSUhlbHBlciB7Ci0JcHVibGljIHZvaWQgcnVuU2FmZWx5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBib29sZWFuIHN5bmNocm9ub3VzKTsKLQkKLQlwdWJsaWMgdm9pZCBydW5XaXRoQnVzeUluZGljYXRvcihSdW5uYWJsZSBydW5uYWJsZSk7Ci0JCi0JcHVibGljIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgYm9vbGVhbiBjYW5DYW5jZWwsIFN0cmluZyBtc2cpOwotCi0JcHVibGljIElTdGF0dXMgcnVuQXNKb2IoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBTdHJpbmcgdGFza05hbWUsCi0JCQlPYmplY3Qgc2hlbGwpOwotCi0JcHVibGljIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSwgT2JqZWN0IHNoZWxsKTsKLQkKLQlwdWJsaWMgdm9pZCBydW5JblVJKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCVN0cmluZyB0YXNrTmFtZSk7Ci0KLQlJU3RhdHVzIHJ1bkluTW9kYWxDb250ZXh0KElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24sIGJvb2xlYW4gZm9yaywKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IHVpQ29udGV4dCk7Ci0KLQlwdWJsaWMgVGVhbVByb2ZpbGUgZ2V0VGVhbShBY3Rpdml0eSBhY3Rpdml0eSwgUm9sZSByb2xlLCBPYmplY3QgVUlDb250ZXh0KTsKLQotCS8qKgotCSAqIFNlbGVjdCB0YXNrcyB3aGljaCBoYXMgZ2l2ZW4gd29ya3Byb2R1Y3QgYXMgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTGlzdAotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBzZWxlY3RUYXNrcyhMaXN0IHRhc2tMaXN0LCBXb3JrUHJvZHVjdCB3cCk7Ci0KLQkvKioKLQkgKiBTZWxlY3QgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBmb3IgdGhlIGdpdmVuIHJvbGUKLQkgKiAKLQkgKiBAcGFyYW0gd3BMaXN0Ci0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Qgc2VsZWN0V29ya1Byb2R1Y3RzKExpc3Qgd3BMaXN0LCBSb2xlIHJvbGUpOwotCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaE5lZWRlZChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyKTsKLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hWaWV3ZXIoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgUHJvY2VzcyBwcm9jKTsKLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsVmlld2VycyhmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JcHVibGljIHZvaWQgcmVmcmVzaElEc0luVmlld2VyKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0JCi0JcHVibGljIE9iamVjdCBnZXRWaWV3ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFByb2Nlc3MgcHJvYyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUmVmZXJlbmNlU2VsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1JlZmVyZW5jZVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJjZDQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUmVmZXJlbmNlU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFVJIERpYWxvZyBjbGFzcyB3aGljaCB3aWxsIGdpdmUgdXNlciB0byBzZWxlY3QgcmVmZXJlbmNlcyB0byBiZSBkZWxldGVkCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VTZWxlY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRSZWZlcmVuY2VzKExpc3QgcmVmLCBEZXNjcmlwdG9yIGRlc2MpIHsKLQkJcmV0dXJuIGdldFJlZmVyZW5jZXMocmVmLCBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZfZGVsZXRlLAotCQkJCWRlc2MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogU2hvd3MgZGlhbG9nIGJveCBmb3IgYWxsIHJlZmVyZW5jZXMgdG8gYmUgZGVsZXRlZCBmb3IgdGhlIGdpdmVuCi0JICogZGVzY3JpcHRvci4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgbm90IGJlaW5nIHVzZWQgYW55d2hlcmUgZWxzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0UmVmZXJlbmNlcyhMaXN0IHJlZikgewotCi0JCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmX2RlbGV0ZTI7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcyhyZWYsIG1lc3NhZ2UpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEl0IHNob3dzIHNlbGVjdGlvbiBkaWFsb2cgYm94IHdpdGggbGlzdCBvZiByZWZlcmVuY2UgKDxjb2RlPnJlZjwvY29kZT4pCi0JICogZm9yIHVzZXIgdG8gc2VsZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKiBAcmV0dXJuCi0JICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHVzZXIgY2FuY2VsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFJlZmVyZW5jZXMoTGlzdCByZWYsIFN0cmluZyBtc2cpCi0JCQl0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcKLQkJLy8gQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkvLyBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkvLyByZXR1cm4gKChMaXN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8KLQkJLy8gdHJ5IHsKLQkJLy8gUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3Ci0JCS8vIFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKFBsYXRmb3JtVUkKLQkJLy8gLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIHJlZiwKLQkJLy8gY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCQkvLwotCQkvLyBkbGcuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmZXJlbmNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkvLyBpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCS8vIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkvLyB9Ci0JCS8vIE9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCS8vIHJldHVybiBvYmpzOwotCQkvLyB9IGZpbmFsbHkgewotCQkvLyBjb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQkvLyBsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJLy8gfQotCi0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZlcmVuY2VzOwotCQkJTGlzdCBzZWxlY3RlZCA9IHVpSGFuZGxlci5zZWxlY3QocmVmLCBsYWJlbFByb3ZpZGVyLCB0cnVlLCByZWYsCi0JCQkJCXRpdGxlLCBtc2cpOwotCQkJaWYgKHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBzZWxlY3RlZC50b0FycmF5KCk7Ci0JCX0KLQotCQkvLyBubyB1c2VyIGludGVyYWN0aW9uIGhhbmRsZXIgYXZhaWxhYmxlCi0JCS8vIHJldHVybiB0aGUgZW50aXJlIHJlZmVyZW5jZSBsaXN0Ci0JCS8vCi0JCXJldHVybiByZWYudG9BcnJheSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVXNlckludGVyYWN0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VzZXJJbnRlcmFjdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWNiZjI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVXNlckludGVyYWN0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBEZWZpbmVzIHN0YXRpYyBtZXRob2RzIHRoYXQgaW50ZXJhY3Qgd2l0aCB1c2VyIHZpYSBkaWFsb2cgYm94ZXMgdG8gcmV0cmlldmUKLSAqIG1vcmUgaW5mb3JtYXRpb24gb3IgY29uZmlybWF0aW9uIGZyb20gdGhlIHVzZXJzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVzZXJJbnRlcmFjdGlvbkhlbHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW5JbnRlcmFjdCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVVJSGVscGVyIHVpSGVscGVyID0gKElVSUhlbHBlcikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInVpSGVscGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVXNlckludGVyYWN0aW9uSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5JbnRlcmFjdCgpIHsKLQkJcmV0dXJuIGNhbkludGVyYWN0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhZ2FpbnN0IGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvY2VzcyB3aGV0aGVyIHRoZQotCSAqIGdpdmVuIChtZXRob2QpIG9iamVjdCBjYW4gYmUgdXNlZCBpbiB0aGUgcHJvY2Vzcy4gVGhpcyBtZXRob2Qgd2lsbCBwcm9tcHQKLQkgKiB1c2VyIHRvIGFkZCB0aGUgb2JqZWN0IGFuZCB0aG9zZSBlbGVtZW50cyB0aGF0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aCB0bwotCSAqIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZW0KLQkgKiB5ZXQuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiAgICAgICAgICAgIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICogICAgICAgICAgICA8bGk+MSBpZiB0aGUgcHJvY2VzcydlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYWxyZWFkeSBoYXMgdGhlCi0JICogICAgICAgICAgICBvYmplY3QKLQkgKiAgICAgICAgICAgIDxsaT4yIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uLCBidXQgdXNlcgotCSAqICAgICAgICAgICAgd2FudHMgdG8gYWRkIGl0IG5vdwotCSAqICAgICAgICAgICAgPGxpPjAgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHVzZXIKLQkgKiAgICAgICAgICAgIGRvbid0IHdhbnQgdG8gYWRkIGl0Ci0JICogICAgICAgICAgICA8bGk+LTEgaWYgdXNlciBjYW5jZWwgdGhlIHByb21wdCB0byBhZGQgdGhlIG9iamVjdHMgYW5kCi0JICogICAgICAgICAgICBhc3NvY2lhdGVkIGRlcGVuZGVuY2llcyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgb2JqZWN0LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYWdhaW5zdCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdpdmVuIHByb2Nlc3Mgd2hldGhlciB0aGUKLQkgKiBnaXZlbiAobWV0aG9kKSBvYmplY3QgY2FuIGJlIHVzZWQgaW4gdGhlIHByb2Nlc3MuIFRoaXMgbWV0aG9kIHdpbGwgcHJvbXB0Ci0JICogdXNlciB0byBhZGQgdGhlIG9iamVjdCBhbmQgdGhvc2UgZWxlbWVudHMgdGhhdCBpdCBpcyBhc3NvY2lhdGVkIHdpdGggdG8KLQkgKiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaGF2ZSB0aGVtCi0JICogeWV0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogICAgICAgICAgICB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2Qgb2JqZWN0Ci0JICogQHJldHVybgotCSAqICAgICAgICAgICAgPGxpPjEgaWYgdGhlIHByb2Nlc3MnZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFscmVhZHkgaGFzIHRoZQotCSAqICAgICAgICAgICAgb2JqZWN0Ci0JICogICAgICAgICAgICA8bGk+MiBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiwgYnV0IHVzZXIKLQkgKiAgICAgICAgICAgIHdhbnRzIHRvIGFkZCBpdCBub3cKLQkgKiAgICAgICAgICAgIDxsaT4wIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIGFuZCB1c2VyCi0JICogICAgICAgICAgICBkb24ndCB3YW50IHRvIGFkZCBpdAotCSAqICAgICAgICAgICAgPGxpPi0xIGlmIHVzZXIgY2FuY2VsIHRoZSBwcm9tcHQgdG8gYWRkIHRoZSBvYmplY3RzIGFuZAotCSAqICAgICAgICAgICAgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywKLQkJCU9iamVjdCBvYmplY3QsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRvciA9PSBudWxsKQotCQkJY29uZmlndXJhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRvckZhY3RvcnkoKQotCQkJCQkuY3JlYXRlQ29uZmlndXJhdG9yKHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0JCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkvLyBjaGVjayBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaWYgdGhlcmUgaXMgYW55Ci0JCQkvLwotCQkJYm9vbGVhbiBhbGxJbiA9IHRydWU7Ci0JCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCBjID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCk7IGMgIT0gbnVsbDsgYyA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGMKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCWlmICghY29uZmlndXJhdG9yLmFjY2VwdChjKSkgewotCQkJCQlhbGxJbiA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWxsSW4pIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCQlpZiAoY29uZmlndXJhdG9yLmFjY2VwdChlKSkKLQkJCXJldHVybiAxOwotCi0JCS8vIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJLy8gYXNrIHVzZXIgaWYgaGUvc2hlIHdhbnQgdG8gYWRkIGl0IHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJU3RyaW5nIG1zZyA9IE5MUwotCQkJCS5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaywKLQkJCQkJCSgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0TmFtZSgpKTsJCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlpbnQgcmV0ID0gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10gewotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLAotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8sCi0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwKLQkJCQl9LCBMaWJyYXJ5RWRpdFJlc291cmNlcy5hZGRfdG9fZGVmYXVsdF9jb25maWdfZGxnX3RpdGxlLCBtc2csIG51bGwpOwotCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIlVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbigpOiBlbGVtZW50PSIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBlICsgIiwgcGF0aD0iICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUzoKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKSwgbnVsbCk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlyZXR1cm4gMjsKLQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJCXJldHVybiAwOwotCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgdGFza3Mgd2hpY2ggaGFzIGdpdmVuIHdvcmtwcm9kdWN0IGFzIG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFza0xpc3QKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdFRhc2tzKExpc3QgdGFza0xpc3QsIFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiB1aUhlbHBlci5zZWxlY3RUYXNrcyh0YXNrTGlzdCwgd3ApOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGZvciB0aGUgZ2l2ZW4gcm9sZQotCSAqIAotCSAqIEBwYXJhbSB3cExpc3QKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2VsZWN0V29ya1Byb2R1Y3RzKExpc3Qgd3BMaXN0LCBSb2xlIHJvbGUpIHsKLQkJcmV0dXJuIHVpSGVscGVyLnNlbGVjdFdvcmtQcm9kdWN0cyh3cExpc3QsIHJvbGUpOwotCX0KLQotCS8qKgotCSAqIFJlcXVlc3RzIG5hbWUgZnJvbSB1c2VyCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBuYW1lRmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBuYW1lIG9mIG51bGwgaWYgdXNlciBjYW5jZWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcXVlc3ROYW1lKE9iamVjdCBjaGlsZCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSwgU3RyaW5nIHRpdGxlLAotCQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJSVZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXRTaW1wbGVFcnJvck1lc3NhZ2UodmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQl9OwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBjaGlsZDsKLQkJCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBlLmVHZXQobmFtZUZlYXR1cmUpOwotCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IHN0cjsKLQkJCX0KLQkJfQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmKHVpSGFuZGxlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlVc2VySW5wdXQgaW5wdXQgPSBuZXcgVXNlcklucHV0KCIiLCBVc2VySW5wdXQuVEVYVCwgZmFsc2UsIG51bGwsIG51bGwsIGlucHV0VmFsaWRhdG9yLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlpbnB1dC5zZXRJbnB1dChuYW1lKTsKLQkJYm9vbGVhbiByZXQgPSB1aUhhbmRsZXIucmVxdWVzdElucHV0KHRpdGxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZSwgCi0JCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGlucHV0KSk7Ci0JCWlmKHJldCkgewotCQkJcmV0dXJuIGlucHV0LmdldElucHV0KCkudG9TdHJpbmcoKS50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlRXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IHMgPSBtc2cuaW5kZXhPZignOicpOwotCi0JCVN0cmluZyBwcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocyA+PSAwKSB7Ci0JCQlwcmVmaXggPSBtc2cuc3Vic3RyaW5nKDAsIHMpOwotCi0JCQlTdHJpbmcgZW1wdHlFbGVtZW50TmFtZUVycm9yTXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZzsgCi0JCQlTdHJpbmcgZHVwQ29udGVudEZpbGVFcnJvck1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnOyAKLQkJCVN0cmluZyBkdXBFbGVtZW50TmFtZUVycm9yTXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c7IAotCi0JCQlpZiAoZW1wdHlFbGVtZW50TmFtZUVycm9yTXNnICE9IG51bGwKLQkJCQkJJiYgZW1wdHlFbGVtZW50TmFtZUVycm9yTXNnLnN0YXJ0c1dpdGgocHJlZml4KSkKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7IAotCQkJZWxzZSBpZiAoZHVwQ29udGVudEZpbGVFcnJvck1zZyAhPSBudWxsCi0JCQkJCSYmIGR1cENvbnRlbnRGaWxlRXJyb3JNc2cuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c7IAotCQkJZWxzZSBpZiAoZHVwRWxlbWVudE5hbWVFcnJvck1zZyAhPSBudWxsCi0JCQkJCSYmIGR1cEVsZW1lbnROYW1lRXJyb3JNc2cuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7IAotCQl9Ci0KLQkJaWYgKHMgPCAwKQotCQkJcyA9IDA7Ci0JCWVsc2UKLQkJCXMrKzsKLQkJaW50IHQgPSBtc2cuaW5kZXhPZignXG4nKTsKLQkJaWYgKHQgPCAwKQotCQkJdCA9IG1zZy5sZW5ndGgoKTsKLQotCQlyZXR1cm4gbXNnLnN1YnN0cmluZyhzLCB0KS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRlYW0gaW4gd2hpY2ggdXNlciB3b3VsZCBhdXRvbWF0aWNhbGx5IGFzc2lnbiBhIHJvbGUgaW50bwotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVhbVByb2ZpbGUgZ2V0VGVhbShBY3Rpdml0eSBhY3Rpdml0eSwgUm9sZSByb2xlKSB7Ci0JCXJldHVybiBnZXRUZWFtKGFjdGl2aXR5LCByb2xlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlYW1Qcm9maWxlIGdldFRlYW0oQWN0aXZpdHkgYWN0aXZpdHksIFJvbGUgcm9sZSwKLQkJCU9iamVjdCBVSUNvbnRleHQpIHsKLQkJcmV0dXJuIHVpSGVscGVyLmdldFRlYW0oYWN0aXZpdHksIHJvbGUsIFVJQ29udGV4dCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcyhmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyBtc2cpIHsKLQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcnVubmFibGUucnVuKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJCi0JCXJldHVybiBydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIHJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZmFsc2UsIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcygKLQkJCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgZmluYWwgYm9vbGVhbiBjYW5DYW5jZWwsCi0JCQlmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiB1aUhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGNhbkNhbmNlbCwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgcnVuQXNKb2IoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCU9iamVjdCBzaGVsbCA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJ1bkFzSm9iKHJ1bm5hYmxlLCB0YXNrTmFtZSwgc2hlbGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIHJ1bkFzSm9iKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyB0YXNrTmFtZSwgT2JqZWN0IHNoZWxsKSB7Ci0JCXJldHVybiB1aUhlbHBlci5ydW5Bc0pvYihydW5uYWJsZSwgdGFza05hbWUsIHNoZWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoZmluYWwgUnVubmFibGUgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgdGFza05hbWUpIHsKLQkJcmV0dXJuIHJ1bkluVUkocnVubmFibGUsIHRhc2tOYW1lLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyB0YXNrTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJT2JqZWN0IHNoZWxsID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmVyID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIDIpOwotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCQkJcmV0dXJuIHJ1bkluVUkocnVubmVyLCBydWxlLCBzaGVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlPYmplY3Qgc2hlbGwpIHsKLQkJcmV0dXJuIHJ1bkluVUkocnVubmFibGUsIG51bGwsIHNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSwgT2JqZWN0IHNoZWxsKSB7Ci0JCXJldHVybiB1aUhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBydWxlLCBzaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIERlbGl2ZXJhYmxlIGluIHdoaWNoIHVzZXIgd291bGQgYXV0b21hdGljYWxseSBhc3NpZ24gYSB3cCBpbnRvCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHdwCi0JICogQHJldHVybgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdldERlbGl2ZXJhYmxlKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJV29ya1Byb2R1Y3Qgd3ApIHsKLQotCQkvLyBQTEVBRSBET04nVCBDTEVBTiBVUAotCQkvLyBjb21tZW50ZWQgb3V0IGZvciBub3cgc2luY2Ugd2Ugc2h1dC1vZmYgYXV0b21hdGljIGFzc2lnbm1lbnQKLQkJLy8gb2YgZGVsaXZlcmFibGUgZm9yIG5vdwotCQkvLyBMaXN0IGRlbGl2ZXJhYmxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gLy8gZmluZCBvdXQgYWxsIGRlbGl2ZXJhYmxlcyBpbiB2aXNpYmxlIHNjb3BlCi0JCS8vIGdldERlbGl2ZXJhYmxlc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIGFjdGl2aXR5LCB3cCwKLQkJLy8gZGVsaXZlcmFibGVMaXN0KTsKLQkJLy8gaWYgKGRlbGl2ZXJhYmxlTGlzdC5zaXplKCkgPT0gMSkgewotCQkvLyByZXR1cm4gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVsaXZlcmFibGVMaXN0LmdldCgwKTsKLQkJLy8gfQotCQkvLyBpZiAoZGVsaXZlcmFibGVMaXN0LnNpemUoKSA+IDEpIHsKLQkJLy8gcmV0dXJuIERlbGl2ZXJhYmxlU2VsZWN0aW9uLmdldFNlbGVjdGVkRGVsaXZlcmFibGUoZGVsaXZlcmFibGVMaXN0LAotCQkvLyB3cCk7Ci0JCS8vIH0KLQkJLy8gdGhlcmUgYXJlIG5vIGRlbGl2ZXJhYmxlIHRvIGFzc2lnbgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQTEVBU0UgRE9OJ1QgQ0xFQU4gVVAuIFRoaXMgbWV0aG9kIGlzIGN1cnJlbnRseSBub3QgdXNlZCBzaW5jZSB3ZQotCSAqIHNodXQtb2ZmIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIGRlbGl2ZXJhYmxlLiBHZXQgZGVsaXZlcmFibGUgaW4gc2NvcGUKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGVMaXN0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXREZWxpdmVyYWJsZXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlLCBXb3JrUHJvZHVjdCB3cCwgTGlzdCBkZWxpdmVyYWJsZUxpc3QpIHsKLQkJLy8gZ2V0IGNoaWxkcmVuIGZvciBhY3Rpdml0eQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihlKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJJiYgKFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCi0JCQkJLy8gZ2V0IGRlbGl2ZXJhYmxlIHBhcnRzIGZyb20gZGVsaXZlcmFibGUKLQkJCQlMaXN0IHBhcnRzID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KHdwRGVzYwotCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCQkJaWYgKHBhcnRzLmNvbnRhaW5zKHdwKSkgewotCQkJCQlkZWxpdmVyYWJsZUxpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHBhcmVudAotCQlPYmplY3QgY3VycmVudFBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCWlmIChjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCS8vIGdvIHVwCi0JCQlnZXREZWxpdmVyYWJsZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFBhcmVudCwgd3AsIGRlbGl2ZXJhYmxlTGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVsZW1lbnQgY2FuIGJlIG1vZGlmaWVkLiBUaGlzIGluY2x1ZGVzIGxvY2sgY2hlY2sgYW5kCi0JICogZWRpdCBjaGVjay4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tNb2RpZnkoRU9iamVjdCBlbGVtZW50LCBPYmplY3Qgc2hlbGwpIHsKLQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoZWxlbWVudCkpIHsKLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KQotCQkJCQkJCQkJLmdldE5hbWUoKSB9KTsgCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJZCgpLCAwLCBtc2csIG51bGwpOwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmNoZWNrRWRpdCgoRU9iamVjdCkgZWxlbWVudCwgc2hlbGwpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdW5tb2RpZmlhYmxlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIEEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMuCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZXh0IG9mIHRoaXMgY2FsbC4gRm9yIFJDUCwgdGhpcyBpcyB0aGUgc2hlbGwuCi0JICogQHJldHVybiBBbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCUlBY2Nlc3NDb250cm9sbGVyIGFjID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpOwotCQlpZiAoYWMgPT0gbnVsbCkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VbbW9kaWZpZWRSZXNvdXJjZXMuc2l6ZSgpXTsKLQkJbW9kaWZpZWRSZXNvdXJjZXMudG9BcnJheShyZXNvdXJjZXMpOwotCQlyZXR1cm4gYWMuY2hlY2tNb2RpZnkocmVzb3VyY2VzLCBjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoIXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJcmV0dXJuIHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja091dE9mU3luY2goQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJQXJyYXlMaXN0IG91dE9mU3luY2hSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCUlSZXNvdXJjZSB3c1Jlc291cmNlID0gZ2V0V29ya3NwYWNlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJaWYgKHdzUmVzb3VyY2UgIT0gbnVsbAotCQkJCQkmJiAhd3NSZXNvdXJjZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQlvdXRPZlN5bmNoUmVzb3VyY2VzLmFkZCh3c1Jlc291cmNlKTsKLQkJCX0KLQkJfQotCQlpZiAob3V0T2ZTeW5jaFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLAotCQkJCQkiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dE9mU3luY2hSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSAoSVJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQlJU3RhdHVzLk9LLCB3c1Jlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLCBudWxsKTsKLQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCX0KLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlOwotCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVwZGF0ZV9vdXRvZnN5bmNoX21zZzsKLQotCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJcmV0dXJuIHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHtJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fT0ssCi0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUx9LCB0aXRsZSwgbXNnLCBtdWx0aVN0YXR1cykgIT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIGNoYW5nZSB0byB0aGUgZ2l2ZW4gZmVhdHVyZSBvZiB0aGUgZ2l2ZW4gZmVhdHVyZU93bmVyIHdpbGwKLQkgKiBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlT3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01vZGlmeU9wcG9zaXRlKE1ldGhvZEVsZW1lbnQgZmVhdHVyZU93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCQlpZiAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJTmFtZWRFbGVtZW50IG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlID0gKE5hbWVkRWxlbWVudCkgbXJFT2JqCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsCi0JCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBzdGlsbCBpbiB0aGUgbGlicmFyeSBhbmQgbm90Ci0JCQkJCS8vIGRlbGV0ZWQgeWV0LgotCQkJCQkvLwotCQkJCQkmJiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IHx8IG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlCi0JCQkJCQkJLmVDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQkmJiBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJLy8gc2ltcGxlIHJlamVjdCBmb3IgNy4wLjAgcmVsZWFzZQotCQkJCS8vCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0JCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJZWxlbWVudC5nZXROYW1lKCksCi0JCQkJCQkJCQkJVG5nVXRpbAotCQkJCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUpLAotCQkJCQkJCQkJCWZlYXR1cmVPd25lci5nZXROYW1lKCkgfSk7Ci0JCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJLy8gVE9ETzogdW5jb21tZW50IHRvIHVzZSB0aGlzIGNvZGUgZm9yIDcuMC4xIHJlbGVhc2UKLQkJCQkvLwotCQkJCS8vIFN0cmluZyB0aXRsZSA9ICJVcGRhdGUgUmVsYXRpb25zaGlwIjsKLQkJCQkvLyBTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkFkZGluZyAnJ3swfScnIHRvICcnezF9JycKLQkJCQkvLyB3aWxsIHJlbW92ZSAnJ3swfScnIGZyb20gJyd7Mn0nJy4gRG8geW91IHdhbnQgdG8gY29udGludWU/IgotCQkJCS8vICwgbmV3IE9iamVjdFtdIHsgZWxlbWVudC5nZXROYW1lKCksIGZlYXR1cmVPd25lci5nZXROYW1lKCksCi0JCQkJLy8gb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUuZ2V0TmFtZSgpIH0pOwotCQkJCS8vIGlmKCFMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLAotCQkJCS8vIG1zZykpIHsKLQkJCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkJLy8gfQotCQkJCS8vCQkJCQotCQkJCS8vIElTdGF0dXMgc3RhdHVzID0KLQkJCQkvLyBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUsCi0JCQkJLy8gbnVsbCk7Ci0JCQkJLy8gaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJLy8gIkNhbm5vdCB1cGRhdGUgcmVsYXRpb25zaGlwIiwgc3RhdHVzKTsKLQkJCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0NvbmZpZ3VyYXRpb25zVG9VcGRhdGUoQWRkQ29tbWFuZCBhZGRDb21tYW5kLAotCQkJT2JqZWN0IHNoZWxsKSB7Ci0JCUVPYmplY3QgcGFyZW50ID0gYWRkQ29tbWFuZC5nZXRPd25lcigpOwotCQlpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKTsKLQkJaWYgKCEoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpCi0JCQkJfHwgISgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNDb250YWlubWVudCgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHdpbGwgYmUgdXBkYXRlZCBhZnRlciB0aGlzIGNvbW1hbmQKLQkJLy8gY2FuIGJlIG1vZGlmaWVkCi0JCS8vCi0JCUFycmF5TGlzdCBjb25maWdzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1ldGhvZFBhY2thZ2UgcGFyZW50UGtnID0gKE1ldGhvZFBhY2thZ2UpIHBhcmVudDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJVG5nVXRpbC5nZXRDb25maWd1cmF0aW9uc1RvVXBkYXRlKHBhcmVudFBrZywKLQkJCQkJCShNZXRob2RQYWNrYWdlKSBlbGVtZW50LCBjb25maWdzVG9VcGRhdGUpOwotCQkJfQotCQl9Ci0JCWlmICghY29uZmlnc1RvVXBkYXRlLmlzRW1wdHkoKSkgewotCQkJQ29sbGVjdGlvbiByZXNvdXJjZXNUb0NoZWNrID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3NUb1VwZGF0ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGNvbmZpZyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXNUb0NoZWNrLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2hlY2sgYWZmZWN0ZWQgcmVzb3VyY2VzIGZvciB1bm1vZGlmaWFibGUKLQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkocmVzb3VyY2VzVG9DaGVjaywgc2hlbGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb25maXJtRGVlcENvcHkoQ29sbGVjdGlvbiBhY3Rpdml0aWVzKSB7Ci0JCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2FuSW50ZXJhY3QoKSkgewotCQkJLy8gY2hlY2tzIGlmIHRoZSBwYXR0ZXJuIG9yIGFjdGl2aXR5IGNvbnRhaW5zIGFueSBleHRlbmRpbmcgZWxlbWVudHMKLQkJCS8vIGFuZCBwcm9tcHRzIHRoZSB1c2VyIGlmIGhlIHJlYWxseQotCQkJLy8gd2FudHMgdG8gZGVlcCBjb3B5IGR5bmFtaWNhbGx5IGxpbmtlZCBhY3Rpdml0aWVzIHdhcm5pbmcgdGhlCi0JCQkvLyBwcm9jZXNzIGF1dGhvciB0aGF0IGhlIHdpbGwgZ2V0IGEgY29weQotCQkJLy8gb2YgYWxsIGR5bmFtaWNhbGx5IGxpbmtlZCBlbGVtZW50cyB0aGF0IGhlIG5lZWRzIHRvIG1haW50YWluCi0JCQkvLyBzZXBhcmF0ZWx5IGZyb20gbm93IG9uCi0JCQlib29sZWFuIHByb21wdE5lZWRlZCA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsLmhhc0luaGVyaXRlZCgoQWN0aXZpdHkpIGUpKSB7Ci0JCQkJCXByb21wdE5lZWRlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwcm9tcHROZWVkZWQpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWVwQ29weV90aXRsZTsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVlcENvcHlfcHJvbXB0TXNnOwotCQkJCWludCByZXQgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkKLQkJCQkJLnNlbGVjdE9uZShuZXcgaW50W10gewotCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsCi0JCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PCi0JCQkJCX0sIHRpdGxlLCBtc2csIG51bGwpOwotCQkJCWlmIChyZXQgPT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB1c2VyIHRvIGNob29zZSBjb25maWd1cmF0aW9uIGZvciBkZWVwIGNvcHkKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0UHJvY2VzcwotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdXNlciBjYW5jZWxsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY2hvb3NlRGVlcENvcHlDb25maWd1cmF0aW9uKAotCQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWcgPSBudWxsOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY3VycmVudENvbmZpZyAhPSBudWxsCi0JCQkJCSYmIGN1cnJlbnRDb25maWcgIT0gdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jYW5JbnRlcmFjdCgpKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWludCByZXQgPSB1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsCi0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTywKLQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTAotCQkJCQkJCX0sIExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlZXBDb3B5X3RpdGxlLCBtc2csIG51bGwpOwkJCQkJCQotCQkJCQkJc3dpdGNoIChyZXQpIHsKLQkJCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUzoKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJCQkJCWRlZXBDb3B5Q29uZmlnID0gY3VycmVudENvbmZpZzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDoKLQkJCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVlcENvcHlDb25maWc7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5RXh0ZXJuYWxWYXJpYXRpb25zQWxsb3dlZChQcm9jZXNzIHRhcmdldFByb2Nlc3MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCS8vIGFzayB1c2VycyB0byBjb3B5IGV4dGVybmFsIGNvbnRyaWJ1dGlvbihzKS9yZXBsYWNlbWVudChzKSBpZgotCQkvLyBjdXJyZW50IGNvbmZpZyBpcyBub3QgdGhlIGRlZmF1bHQgY29uZmlnIG9mIHRoZSB0YXJnZXQgcHJvY2VzcwotCQkvLwotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSAoKElDb25maWd1cmF0b3IpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjdXJyZW50Q29uZmlnICE9IG51bGwKLQkJCQkJJiYgY3VycmVudENvbmZpZyAhPSB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpIHsJCQkJCi0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X2RlZXBfY29weV92YXJpYWJpbGl0eV9wcm9tcHQ7Ci0JCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCWlmKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCWludCByZXQgPSB1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUywKLQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8sCi0JCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTAotCQkJCQkJfSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVlcENvcHlfdGl0bGUsIG1zZywgbnVsbCk7CQkJCQkJCi0JCQkJCXN3aXRjaCAocmV0KSB7Ci0JCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUzoKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTzoKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVVJSGVscGVyIGdldFVJSGVscGVyKCkgewotCQlyZXR1cm4gdWlIZWxwZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzczZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBzdXBwb3J0aW5nIGRpYWxvZ3MgZm9yIHNlbGVjdGluZyBhbmQgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmI2YTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ29weUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBVc2VkIHRvIGV4dGVuZC9jb3B5IGFjdGl2aXRpZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SGFuZGxlciB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdDxQcm9jZXNzUGFja2FnZT4gcHJvY1BhY2thZ2VzOwotCQotCS8qKgotCSAqIExpc3Qgb2YgYWN0aXZpdGllcyBvciBhY3Rpdml0eSB3cmFwcGVycyB0byBkZWVwIGNvcHkuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8T2JqZWN0PiBhY3Rpdml0aWVzVG9EZWVwQ29weTsJCi0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnOwkKLQlwcml2YXRlIExpc3QgZGVlcENvcGllczsKLQlwcml2YXRlIE1hcCBkZWVwQ29weVRvT3JpZ2luYWxNYXA7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8QWN0aXZpdHk+IGFjdGl2aXRpZXM7Ci0KLQlwcml2YXRlIE1hcCBjb3B5VG9PcmlnaW5hbDsKLQkKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCQotCXByaXZhdGUgSGVscGVyIGNvcHlIZWxwZXI7Ci0JCi0JcHJpdmF0ZSBDb3B5SGVscGVyIGRlZXBDb3B5SGVscGVyOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0JCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMgPSB0cnVlOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBBY3Rpdml0eUhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlIYW5kbGVyKCkgewotCQlhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhY3Rpdml0aWVzVG9EZWVwQ29weSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlkZWVwQ29waWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljb3B5VG9PcmlnaW5hbCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb2NQYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCWNvcHlIZWxwZXIgPSBuZXcgSGVscGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJYWN0aXZpdGllc1RvRGVlcENvcHkuY2xlYXIoKTsKLQkJY29weVRvT3JpZ2luYWwuY2xlYXIoKTsKLQkJcHJvY1BhY2thZ2VzLmNsZWFyKCk7Ci0JCWNvcHlIZWxwZXIuY2xlYXIoKTsJCQotCQlkZWVwQ29waWVzLmNsZWFyKCk7CQkKLQkJaWYoZGVlcENvcHlIZWxwZXIgIT0gbnVsbCkgewotCQkJZGVlcENvcHlIZWxwZXIuY2xlYXIoKTsKLQkJfQotCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29weUV4dGVybmFsVmFyaWF0aW9ucyhib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMpIHsKLQkJdGhpcy5jb3B5RXh0ZXJuYWxWYXJpYXRpb25zID0gY29weUV4dGVybmFsVmFyaWF0aW9uczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlwcm9jUGFja2FnZXMuYWRkKChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpKTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RGVlcENvcHlDb25maWcoKSB7Ci0JCXJldHVybiBkZWVwQ29weUNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWVwQ29weUNvbmZpZyhNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnKSB7Ci0JCXRoaXMuZGVlcENvcHlDb25maWcgPSBkZWVwQ29weUNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3MgZ2V0VGFyZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHRhcmdldFByb2Nlc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYykgewotCQl0YXJnZXRQcm9jZXNzID0gcHJvYzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXREZWVwQ29waWVzKCkgewotCQlyZXR1cm4gZGVlcENvcGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWVwQ29weShPYmplY3QgYWN0aXZpdHlPcldyYXBwZXIpIHsKLQkJT2JqZWN0IHVud3JhcHBlZCA9IFRuZ1V0aWwudW53cmFwKGFjdGl2aXR5T3JXcmFwcGVyKTsKLQkJaWYodW53cmFwcGVkIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgKChBY3Rpdml0eSl1bndyYXBwZWQpLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0aWVzVG9EZWVwQ29weS5hZGQoYWN0aXZpdHlPcldyYXBwZXIpOwotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBleHRlbmQoQWN0aXZpdHkgYWN0KSB7Ci0JCUFjdGl2aXR5IGV4dGVuZGVkQWN0ID0gUHJvY2Vzc1V0aWwuZ2VuZXJhbGl6ZShhY3QsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQlhY3Rpdml0aWVzLmFkZChleHRlbmRlZEFjdCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0PEFjdGl2aXR5PiBnZXRBY3Rpdml0aWVzKCkgewotCQlpZiAoIXByb2NQYWNrYWdlcy5pc0VtcHR5KCkgfHwgIWFjdGl2aXRpZXNUb0RlZXBDb3B5LmlzRW1wdHkoKSkgewotCQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCWlmKCFwcm9jUGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0JCQkJYWN0aXZpdGllcy5hZGRBbGwoY29weShwcm9jUGFja2FnZXMpKTsKLQkJCX0KLQkJCWlmKCFhY3Rpdml0aWVzVG9EZWVwQ29weS5pc0VtcHR5KCkpIHsKLQkJCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQl9Ci0JCQkJZm9yIChPYmplY3QgYWN0IDogYWN0aXZpdGllc1RvRGVlcENvcHkpIHsKLQkJCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKAotCQkJCQkJCWFjdCwgZ2V0RGVlcENvcHlIZWxwZXIoKSwgZGVlcENvcHlDb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCQkJCWNtZC5zZXRDb3B5RXh0ZXJuYWxWYXJpYXRpb25zKGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMpOwotCQkJCQl0cnkgewotCQkJCQkJbG9uZyB0aW1lID0gMDsKLQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJfQotCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGV4ZWN1dGVkOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKQotCQkJCQkJCQkJCQkrICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCX0KLQkJCQkJCUNvbGxlY3Rpb248Pz4gcmVzdWx0ID0gY21kLmdldFJlc3VsdCgpOwotCQkJCQkJaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJQWN0aXZpdHkgZGVlcENvcHkgPSAoQWN0aXZpdHkpIHJlc3VsdC5pdGVyYXRvcigpCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCVByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuZml4QnJlYWtkb253RWxlbWVudE9yZGVyUmVjdXJzaXZlbHkoZGVlcENvcHkpOwotCQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiUHJvY2Vzc1V0aWwuZml4QnJlYWtkb253RWxlbWVudE9yZGVyUmVjdXJzaXZlbHkoKTogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpCi0JCQkJCQkJCQkJCQkrICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNtZC5jb3B5U3VwcHJlc3Npb25TdGF0ZXMoKTsKLQkJCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkFjdGl2aXR5RGVlcENvcHlDb21tYW5kLmNvcHlTdXBwcmVzc2lvblN0YXRlcygpOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkKLQkJCQkJCQkJCQkJCSsgIiBtcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZGVlcENvcGllcy5hZGQoZGVlcENvcHkpOwotCQkJCQkJCWRlZXBDb3B5VG9PcmlnaW5hbE1hcC5wdXQoZGVlcENvcHksIGFjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYWN0aXZpdGllcy5hZGRBbGwoZGVlcENvcGllcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdGllczsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZWRlY2Vzc29ycyhMaXN0IHdvcmtCcmVha2Rvd25FbGVtZW50cykgewotCQkvLyBnZXQgdGhlIHByZWRlc3NvciBsaXN0cyBvZiBvcmlnaW5hbCB3b3JrIGJyZWFrZG93biBlbGVtZW50cwotCQkvLwotCQlMaXN0IHByZWRlY2Vzc29yTGlzdHMgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJT2JqZWN0IG9yaWdpbmFsID0gY29weVRvT3JpZ2luYWwuZ2V0KHdvcmtCcmVha2Rvd25FbGVtZW50cy5nZXQoMCkpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGVkaXRpbmdEb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob3JpZ2luYWwsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWludCBmaXJzdElEID0gYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKTsgCi0JCXByZWRlY2Vzc29yTGlzdHMuYWRkKGJzSXRlbVByb3ZpZGVyLmdldFByZWRlY2Vzc29ycygpKTsKLQkJLy8gSXRlbSBwcm92aWRlciBvZiBsYXN0IHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gdGhlIHN1YnRyZWUgd2hvc2Ugcm9vdCBpcyBvcmlnaW5hbCBhY3Rpdml0eQotCQlJQlNJdGVtUHJvdmlkZXIgbGFzdFdCSXAgPSBudWxsOwotCQlmb3IoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwgb3JpZ2luYWwsIGZhbHNlKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlpZihlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlJQlNJdGVtUHJvdmlkZXIgYnNJcCA9IG51bGw7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWJzSXAgPSAoKElCU0l0ZW1Qcm92aWRlcilvYmopOwotCQkJCQlwcmVkZWNlc3Nvckxpc3RzLmFkZChic0lwLmdldFByZWRlY2Vzc29ycygpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCU9iamVjdCBpcCA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJaWYoaXAgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWJzSXAgPSAoKElCU0l0ZW1Qcm92aWRlcilpcCk7Ci0JCQkJCQlwcmVkZWNlc3Nvckxpc3RzLmFkZChic0lwLmdldFByZWRlY2Vzc29ycygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihic0lwICE9IG51bGwpIHsKLQkJCQkJbGFzdFdCSXAgPSBic0lwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgbGFzdElEID0gbGFzdFdCSXAgIT0gbnVsbCA/IGxhc3RXQklwLmdldElkKCkgOiBmaXJzdElEOwotCQkKLQkJLy8gdXBkYXRlIHByZWRlY2Vzc29ycwotCQkvLwotCQlpbnQgc2l6ZSA9IHdvcmtCcmVha2Rvd25FbGVtZW50cy5zaXplKCk7Ci0JCUFzc2VydC5pc1RydWUoc2l6ZSA9PSBwcmVkZWNlc3Nvckxpc3RzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB3b3JrQnJlYWtkb3duRWxlbWVudHMuZ2V0KGkpOwotCQkJZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQlQcmVkZWNlc3Nvckxpc3QgcHJlZExpc3QgPSAoUHJlZGVjZXNzb3JMaXN0KSBwcmVkZWNlc3Nvckxpc3RzLmdldChpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaW50IGlkID0gYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKTsKLQkJCQlpZihpZCA+PSBmaXJzdElEICYmIGlkIDw9IGxhc3RJRCkgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB3b3JrQnJlYWtkb3duRWxlbWVudHMuZ2V0KGlkIC0gZmlyc3RJRCk7Ci0JCQkJCWUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGQoVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKGUsIHByZWQpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHByZWRlY2Vzc29yIGlzIG91dHNpZGUgb2YgdGhlIHN1YnRyZWUsIGRvbid0IHNlbGVjdCBpdCBmb3Igbm93Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjw/PiBjb3B5UHJvY2Vzc1BhY2thZ2VzKENvbGxlY3Rpb248UHJvY2Vzc1BhY2thZ2U+IHByb2NQYWNrYWdlcykgewotCQlDb21tYW5kIGNvbW1hbmQgPSBjcmVhdGVDb3B5Q29tbWFuZChlZGl0aW5nRG9tYWluLCBwcm9jUGFja2FnZXMpOwotCQlpZihjb21tYW5kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJcmV0dXJuIGNvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQl9IGZpbmFsbHkgewkJCQotCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkJCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgY29tbWFuZCB0aGF0IGNvcGllcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiBvYmplY3RzLiBJZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBtb3JlIHRoYW4gb25lIG9iamVjdCwKLQkgKiB0aGVuIGEgY29tcG91bmQgY29tbWFuZCB3aWxsIGJlIGNyZWF0ZWQgY29udGFpbmluZyBpbmRpdmlkdWFsIGNvcHkgY29tbWFuZHMgZm9yIGVhY2ggb2JqZWN0LgotCSAqLwotCXByaXZhdGUgQ29tbWFuZCBjcmVhdGVDb3B5Q29tbWFuZChmaW5hbCBFZGl0aW5nRG9tYWluIGRvbWFpbiwgZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotCXsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCB8fCBjb2xsZWN0aW9uLmlzRW1wdHkoKSkgCi0JCXsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJQ29tcG91bmRDb21tYW5kIGNvcHlDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZChDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOyApCi0JCXsKLQkJCWNvcHlDb21tYW5kLmFwcGVuZChkb21haW4uY3JlYXRlQ29tbWFuZChDb3B5Q29tbWFuZC5jbGFzcywgbmV3IENvbW1hbmRQYXJhbWV0ZXIob2JqZWN0cy5uZXh0KCksIG51bGwsIGNvcHlIZWxwZXIpKSk7Ci0JCX0KLQotCQlyZXR1cm4gY29weUNvbW1hbmQudW53cmFwKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiBwcm9jZXNzIHBhY2thZ2VzCi0JICogCi0JICogQHBhcmFtIGVkaXRpbmdEb21haW4KLQkgKiBAcGFyYW0gcHJvY1BhY2thZ2VzCi0JICogQHJldHVybiBhY3Rpdml0aWVzIG9mIHRoZSBjb3BpZXMKLQkgKi8KLQlwcml2YXRlIExpc3Q8QWN0aXZpdHk+IGNvcHkoTGlzdDxQcm9jZXNzUGFja2FnZT4gcHJvY1BhY2thZ2VzKSB7Ci0JCUNvbGxlY3Rpb248Pz4gY29weVBhY2thZ2VzID0gY29weVByb2Nlc3NQYWNrYWdlcyhwcm9jUGFja2FnZXMpOwotCQlBcnJheUxpc3Q8QWN0aXZpdHk+IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBjb3B5UGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBjb3B5ID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCUFjdGl2aXR5IGFjdENvcHkgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNvcHkpCi0JCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkvLyBjb3B5IGRhdGEgZnJvbSBQcm9jZXNzQ29tcG9uZW50IHRvIGEgbmV3Ci0JCQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2dDb3B5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQlwa2dDb3B5LnNldE5hbWUoYWN0Q29weS5nZXROYW1lKCkpOwotCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdENvcHkpOwotCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkJY29weS5nZXRQcm9jZXNzRWxlbWVudHMoKSk7Ci0JCQkJcGtnQ29weS5nZXREaWFncmFtcygpLmFkZEFsbChjb3B5LmdldERpYWdyYW1zKCkpOwotCQkJCXBrZ0NvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJCWNvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpKTsKLQkJCQkKLQkJCQlhY3Rpdml0aWVzLmFkZChhY3RDb3B5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0aXZpdGllcy5hZGQoUHJvY2Vzc1V0aWwuZmluZEFjdGl2aXR5KGNvcHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdGllczsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldERlZXBDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJcmV0dXJuIGRlZXBDb3B5VG9PcmlnaW5hbE1hcDsKLQl9Ci0JCi0JcHVibGljIEhlbHBlciBnZXRDb3B5SGVscGVyKCl7Ci0JCXJldHVybiBjb3B5SGVscGVyOwotCX0KLQkKLQlwdWJsaWMgQ29weUhlbHBlciBnZXREZWVwQ29weUhlbHBlcigpIHsKLQkJaWYoZGVlcENvcHlIZWxwZXIgPT0gbnVsbCkgewotCQkJZGVlcENvcHlIZWxwZXIgPSBuZXcgQ29weUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBkZWVwQ29weUhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKAotCQkJSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKSB7Ci0JCXRoaXMuYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5VHJlZUl0ZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlUcmVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkOTFjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlUcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLQotLyoqCi0gKiBJbnRlcmF0b3IgdXNlZCB0byBpdGVyYXRlIHRoZSBicmVha2Rvd24gZWxlbWVudCB0cmVlIG9mIGFuIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVRyZWVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY0MDIwMTc3NjgyMDU2NDIwNjhMOwotCi0JcHVibGljIEFjdGl2aXR5VHJlZUl0ZXJhdG9yKEFjdGl2aXR5IGFjdCkgewotCQlzdXBlcihhY3QsIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuICgoQWN0aXZpdHkpIG9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiOTIxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkgICAgLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCS8vCi0JCUlJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG9iamVjdCwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQotCQlyZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iamVjdCkKLQkJCQk6IHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JICAgIC8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQkvLwotCQlJSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmplY3QsIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0KLQkJcmV0dXJuIGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwgPyBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KG9iamVjdCkKLQkJCQk6IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjU4MjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NhdGVnb3J5U29ydEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIHNvcnRpbmcgb2YgQ2F0ZWdvcnkgZWxlbWVudHMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3J5U29ydEhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEUgPSAiQ2F0ZWdvcnlFbGVtZW50c1NvcnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQSA9ICJBbHBoYWJldGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBID0gIlJldmVyc2VBbHBoYWJldGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NRVRIT0RfVFlQRSA9ICJNZXRob2RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwgPSAiTWFudWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHkgdG8gc3RvcmUgdGhlIENhdGVnb3J5IHNvcnQgdHlwZQotCSAqIEBwYXJhbSBzb3J0VHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVOZXdTb3J0UHJvcGVydHkoU3RyaW5nIHNvcnRUeXBlKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCXByb3Auc2V0TmFtZShLRVlfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRSk7Ci0JCWlmIChzb3J0VHlwZSAhPSBudWxsKSB7Ci0JCQlwcm9wLnNldFZhbHVlKHNvcnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gcHJvcDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGNhdGVnb3J5IHNvcnQgcHJvcGVydHkgZm9yIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkgcHJvcGVydHkgaWYgZm91bmQsIGVsc2UgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldENhdGVnb3J5U29ydFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHByb3BzID0gZWxlbWVudC5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKEtFWV9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFLmVxdWFscyhwcm9wLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcHJvcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRydWUgaWZmIHRoZSBjYXRlZ29yeSBzb3J0LXR5cGUgaXMgc2V0IHRvIG1hbnVhbAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJIHByb3BlcnR5IGlmIGZvdW5kLCBlbHNlIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYW51YWxDYXRlZ29yeVNvcnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzb3J0VHlwZSA9IGdldENhdGVnb3J5U29ydFZhbHVlKGVsZW1lbnQpOwotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTC5lcXVhbHMoc29ydFR5cGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3J0LXR5cGUgZm9yIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50LgotCSAqIElmIG5vbmUgaXMgc2V0LCB3aWxsIHJldHVybiBBbHBoYWJldGljIHNvcnQgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQSkgYXMgYSBkZWZhdWx0Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gZ2V0Q2F0ZWdvcnlTb3J0UHJvcGVydHkoZWxlbWVudCk7Ci0JCWlmIChwcm9wID09IG51bGwpCi0JCQlyZXR1cm4gVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTDsKLQkJcmV0dXJuIHByb3AuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRDYXRlZ29yeVNvcnRUeXBlcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJldHVybkxpc3QgPSBBcnJheXMuPFN0cmluZz5hc0xpc3QoCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTCwKLQkJCQlWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFKTsKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShTdHJpbmcgc29ydFR5cGUpIHsKLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU29ydFR5cGVfQWxwaGFiZXRpYzsKLQkJfQotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljOwotCQl9Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUVUSE9EX1RZUEUuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX01ldGhvZFR5cGU7Ci0JCX0KLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX01hbnVhbDsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNvcnRlZCBjYXRlZ29yeSBlbGVtZW50IGxpc3QgYmFzZWQgb24gdGhlIGNhdGVnb3J5J3Mgc29ydCB0eXBlCi0JICogUmVzcGVjdHMgdGhlIE5hbWUvUHJlc05hbWUgdG9nZ2xlCi0JICogQHBhcmFtIGVsZW1lbnQgCi0JICogQHBhcmFtIGVsZW1lbnRzIGFycmF5IHRvIHNvcnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdD4gc29ydENhdGVnb3J5RWxlbWVudHMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPYmplY3RbXSBlbGVtZW50cykgewotCQlyZXR1cm4gc29ydENhdGVnb3J5RWxlbWVudHMoZWxlbWVudCwgZWxlbWVudHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc29ydGVkIGNhdGVnb3J5IGVsZW1lbnQgbGlzdCBiYXNlZCBvbiB0aGUgY2F0ZWdvcnkncyBzb3J0IHR5cGUKLQkgKiBAcGFyYW0gZWxlbWVudCAKLQkgKiBAcGFyYW0gZWxlbWVudHMgYXJyYXkgdG8gc29ydAotCSAqIEBwYXJhbSBmb3JjZVByZXNOYW1lU29ydCB0cnVlIHRvIGFsd2F5cyBzb3J0IGJ5IHByZXNOYW1lLiBmYWxzZSB3aWxsIHJlc3BlY3QgdGhlIHRvZ2dsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0PiBzb3J0Q2F0ZWdvcnlFbGVtZW50cyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIE9iamVjdFtdIGVsZW1lbnRzLCBib29sZWFuIGZvcmNlUHJlc05hbWVTb3J0KSB7Ci0JCS8qCi0JCSAqIFRPRE86IGNhbid0IHVzZSBnZW5lcmljcyBoZXJlIGJlY2F1c2UgRU1GIGRvZXNuJ3QgdXNlIHRoZW0geWV0IC0gdGhlIGVsZW1lbnRzIHBhcmFtCi0JCSAqIHVzdWFsbHkgY29tZXMgZnJvbSBDb250ZW50RWxlbWVudHNPcmRlckxpc3QgY2xhc3Mgd2hpY2ggZXh0ZW5kcyBFTUYncyBCYXNpY0VMaXN0IGFuZCBzbwotCQkgKiB0aGUgdG9BcnJheSgpIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIE9iamVjdFtdCi0JCSAqLwotCQlMaXN0PE9iamVjdD4gcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihBcnJheXMuPE9iamVjdD5hc0xpc3QoZWxlbWVudHMpKTsKLQkJU3RyaW5nIHNvcnRUeXBlID0gZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoZWxlbWVudCk7Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIGZpbmRNYW51YWxTb3J0T3JkZXJJbkNvbnRyaWJ1dG9ycygoQ29udGVudENhdGVnb3J5KWVsZW1lbnQsIHJldHVybkxpc3QpOwotCQkJfQotCQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpOwotCQkJaWYgKGZvcmNlUHJlc05hbWVTb3J0KQotCQkJCWNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KHJldHVybkxpc3QsIGNvbXBhcmF0b3IpOwotCQl9IGVsc2UgaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UmV2ZXJzZUNvbXBhcmF0b3IoKTsKLQkJCWlmIChmb3JjZVByZXNOYW1lU29ydCkKLQkJCQljb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZVJldmVyc2VDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48T2JqZWN0PnNvcnQocmV0dXJuTGlzdCwgY29tcGFyYXRvcik7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCk7Ci0JCQlpZiAoZm9yY2VQcmVzTmFtZVNvcnQpCi0JCQkJY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChyZXR1cm5MaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGZpbmRNYW51YWxTb3J0T3JkZXJJbkNvbnRyaWJ1dG9ycyhDb250ZW50Q2F0ZWdvcnkgY2MsIExpc3Q8T2JqZWN0PiBlbGVtZW50TGlzdCkgewotCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGd1aWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0KLQkJU3RyaW5nIHNvcnRUeXBlID0gZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoY2MpOwotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTC5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQkvLyBzZXQgdXAgR1VJRCBtYXAKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWd1aWRNYXAucHV0KCgoTWV0aG9kRWxlbWVudClvKS5nZXRHdWlkKCksCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpbyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoY2MpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmlidXRvciA9IChDb250ZW50Q2F0ZWdvcnkpb2JqOwotCQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oY29udHJpYnV0b3IsIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0Lk9SREVSX0lORk9fTkFNRSk7Ci0JCQkJCWlmIChvcmRlckluZm8gPT0gbnVsbCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJLy8gZmluZCBsYXRlc3QgT3JkZXJJbmZvIHRoYXQgY29udGFpbnMgYWxsIHRoZXNlIGVsZW1lbnRzCi0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwgfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mby5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQlMaXN0PE9iamVjdD4gcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCS8vIHNvcnQgbGlzdCBhY2NvcmRpbmcgdG8gb3JkZXJJbmZvCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZylsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlPYmplY3QgZWxlbWVudCA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm5MaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJCWd1aWRNYXAucmVtb3ZlKGd1aWQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgZWxlbWVudCBpbiB0aGUgZ3VpZE1hcCB0aGF0IGhhcyBhIGdlbmVyYWxpemVyIHdpdGggImd1aWQiCi0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gZmluZEVsZW1lbnRJbkdlbmVyYWxpemVyTGlzdChndWlkTWFwLCBndWlkKTsKLQkJCQkJCWlmIChtZSAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuTGlzdC5hZGQobWUpOwotCQkJCQkJCWd1aWRNYXAucmVtb3ZlKGd1aWQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBjb3VsZCBub3QgbG9jYXRlLCB3aWxsIHJldHVybiBvcmlnaW5hbCBsaXN0Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA9PSByZXR1cm5MaXN0LnNpemUoKSkKLQkJCQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRMaXN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGZpbmRFbGVtZW50SW5HZW5lcmFsaXplckxpc3QoTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gZ3VpZE1hcCwgU3RyaW5nIGd1aWQpIHsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RFbGVtZW50PiBpdGVyID0gZ3VpZE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCB2YWx1ZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJZm9yIChJdGVyYXRvciBnZW5JdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoKFZhcmlhYmlsaXR5RWxlbWVudCl2YWx1ZSk7Z2VuSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBnZW5lcmFsaXplciA9IGdlbkl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZ2VuZXJhbGl6ZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50KWdlbmVyYWxpemVyKS5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KWdlbmVyYWxpemVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY2MKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZFRvU29ydChNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4gJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUb29sICYmIAotCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbXBhcmF0b3JzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29tcGFyYXRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwN2IyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29tcGFyYXRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGNvbXBhcmF0b3JzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wYXJhdG9ycyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T2JqZWN0PiBERUZBVUxUX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBvMiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlPYmplY3QgbzF1bndyYXAgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlPYmplY3QgbzJ1bndyYXAgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQlpZiAobzF1bndyYXAgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIG8ydW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKCgoTWV0aG9kRWxlbWVudCkgbzF1bndyYXApLmdldE5hbWUoKSwgKChNZXRob2RFbGVtZW50KSBvMnVud3JhcCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFJFVkVSU0VfREVGQVVMVF9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG9wcG9zaXRlVmFsdWUoY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSkpOwotCQkJfQotCQkJT2JqZWN0IG8xdW53cmFwID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJT2JqZWN0IG8ydW53cmFwID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJaWYgKG8xdW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiBvMnVud3JhcCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gb3Bwb3NpdGVWYWx1ZShjb2xsYXRvci5jb21wYXJlKCgoTWV0aG9kRWxlbWVudCkgbzF1bndyYXApLmdldE5hbWUoKSwgKChNZXRob2RFbGVtZW50KSBvMnVud3JhcCkuZ2V0TmFtZSgpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgb3Bwb3NpdGVWYWx1ZShpbnQgdmFsKSB7Ci0JCWlmICh2YWwgIT0gMCkgewotCQkJdmFsID0gMCAtIHZhbDsKLQkJfQotCQlyZXR1cm4gdmFsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUeXBlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxPYmplY3Q+IGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopOwotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCWludCByZXQgPSAwOwotCQkJcmV0ID0gZ2V0T3JkZXJJZCgoRU9iamVjdCkgbzEpIC0gZ2V0T3JkZXJJZCgoRU9iamVjdCkgbzIpOwotCQkJaWYgKHJldCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRDb21wYXJhdG9yKCkuY29tcGFyZShvMSwgbzIpOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmVQcmVzZW50YXRpb25OYW1lKE1ldGhvZEVsZW1lbnQgZTEsIE1ldGhvZEVsZW1lbnQgZTIpIHsKLQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmcgbmFtZTEgPSBlMSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgPyBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KWUxKQotCQkJCTogZTEuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlpZiAobmFtZTEubGVuZ3RoKCkgPCAxKSBuYW1lMSA9IGUxLmdldE5hbWUoKTsKLQkJU3RyaW5nIG5hbWUyID0gZTIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ID8gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCllMikKLQkJCQk6IGUyLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJaWYgKG5hbWUyLmxlbmd0aCgpIDwgMSkgbmFtZTIgPSBlMi5nZXROYW1lKCk7Ci0JCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCW9iamVjdCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudClvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlvMSA9IGdldE1ldGhvZEVsZW1lbnQobzEpOwotCQkJaWYgKG8xID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJbzIgPSBnZXRNZXRob2RFbGVtZW50KG8yKTsKLQkJCWlmIChvMiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCXJldHVybiBjb21wYXJlUHJlc2VudGF0aW9uTmFtZSgoTWV0aG9kRWxlbWVudCkgbzEsIChNZXRob2RFbGVtZW50KSBvMik7Ci0JCX0KLQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPE9iamVjdD4gUkVWRVJTRV9QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJaWYoIShvMSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQlvMSA9IFRuZ1V0aWwudW53cmFwKG8xKTsKLQkJCQlpZighKG8xIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZighKG8yIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCW8yID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJCWlmKCEobzIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBvcHBvc2l0ZVZhbHVlKGNvbXBhcmVQcmVzZW50YXRpb25OYW1lKChEZXNjcmliYWJsZUVsZW1lbnQpIG8xLCAoRGVzY3JpYmFibGVFbGVtZW50KSBvMikpOwotCQl9Ci0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIE1FVEhPRF9UWVBFX0NPTVBBUkFUT1IgPSBuZXcgVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3IjZ2V0RGVmYXVsdENvbXBhcmF0b3IoKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RGVmYXVsdENvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgaW50IGdldE9yZGVySWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpbnQgaWQgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCQkJaWYgKGlkID09IFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OKSB7Ci0JCQkJCWlkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQkJfQotCQkJCXJldHVybiBpZDsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogQWx3YXlzIHNvcnQgYnkgcHJlc2VudGF0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgTUVUSE9EX1RZUEVfUFJFU19OQU1FX0NPTVBBUkFUT1IgPSBuZXcgVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3IjZ2V0RGVmYXVsdENvbXBhcmF0b3IoKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RGVmYXVsdENvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZUNvbXBhcmF0b3IoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWludCBpZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJCQlpZiAoaWQgPT0gVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT04pIHsKLQkJCQkJaWQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlkOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPE9iamVjdD4oKSB7Ci0JCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCQotCQkJCi0JCQlpZiAobzEgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyICYmIG8yIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICYmIG8yIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAxOwotCQkJfQotCQotCQkJYm9vbGVhbiB1c2VQcmVzTmFtZSA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQkJCVN0cmluZyBzMSA9IG51bGw7Ci0JCQlTdHJpbmcgczIgPSBudWxsOwotCQkJaWYgKHVzZVByZXNOYW1lICYmIG8xIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJczEgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgbzEpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJczEgPSAoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXMxID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSBvMSkuZ2V0RnVsbE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlzMSA9IChTdHJpbmcpIG8xOwotCQkJfSAKLQkJCQotCQkJaWYgKHVzZVByZXNOYW1lICYmIG8yIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJczIgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgbzIpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJczIgPSAoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8yIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXMyID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSBvMikuZ2V0RnVsbE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlzMiA9IChTdHJpbmcpIG8yOwotCQkJfQotCQkJCi0JCQlpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLQkJfQotCX07Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRhZWJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotCi0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjYW4gYmUgY29uZmlndXJlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbHRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCAyNywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vIHByaXZhdGUgU2V0IGRpc3Bvc2FibGVBZGFwdGVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvLyBwcml2YXRlIFNldCBnZXREaXNwb3NhYmxlQWRhcHRlcnMoKSB7Ci0JLy8gaWYoZGlzcG9zYWJsZUFkYXB0ZXJzID09IG51bGwpIHsKLQkvLyBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCS8vIH0KLQkvLyByZXR1cm4gZGlzcG9zYWJsZUFkYXB0ZXJzOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJLy8gZ2V0RGlzcG9zYWJsZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkvLyB9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQl9Ci0JCS8vIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkvLyBnZXREaXNwb3NhYmxlQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCS8vIH0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyBpZihkaXNwb3NhYmxlQWRhcHRlcnMgIT0gbnVsbCAmJiAhZGlzcG9zYWJsZUFkYXB0ZXJzLmlzRW1wdHkoKSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGRpc3Bvc2FibGVBZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBJRGlzcG9zYWJsZSBhZGFwdGVyID0gKElEaXNwb3NhYmxlKSBpdGVyLm5leHQoKTsKLQkvLyBhZGFwdGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHN1cGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNmaXJlTm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl0cnkgewotCQkJc3VwZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgVmlld2VyTm90aWZpY2F0aW9uKSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCi0JCQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RyV3JpdGVyKSk7Ci0JCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkuc2hvd0Vycm9yKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVyciwKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlciwKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbiwKLQkJCQkJCQkJc3RyV3JpdGVyLnRvU3RyaW5nKCksIGUpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uU2V0dGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhdGlvblNldHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTAzNDQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uU2V0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNldHRlciB7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBvbGRDb25maWc7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNldHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWNvbmZpZ3VyYXRvciA9IGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IgPyAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyIDogbnVsbDsKLQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCW9sZENvbmZpZyA9IGNvbmZpZ3VyYXRvci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc3RvcmUoKSB7Ci0JCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihvbGRDb25maWcpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJQ29uZmlndXJhdG9yIGdldENvbmZpZ3VyYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0T2xkQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG9sZENvbmZpZzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhdGlvblV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZiODZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBhZGQvcmVtb3ZlIG9iamVjdHMgZnJvbSBhIE1ldGhvZENvbmZpZ3VyYXRpb24gdXNpbmcgYW4gSUFjdGlvbk1hbmFnZXIKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25VdGlsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFjdGlvbk9uQ29sbGVjdGlvbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSwgaW50IGFjdGlvblR5cGUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTGlzdCBsaXN0RmVhdHVyZSkgewotCQlpZiAoY29uZmlnICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aW9uTWdyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gYWN0aW9uTWdyLmRvQWN0aW9uKGFjdGlvblR5cGUsIGNvbmZpZywgZmVhdHVyZSwgdmFsdWUsCi0JCQkJCQktMSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhY3Rpb25UeXBlID09IElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZKSB7Ci0JCQkJCXJldHVybiBsaXN0RmVhdHVyZS5hZGRBbGwodmFsdWUpOwotCQkJCX0gZWxzZSBpZiAoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSkgewotCQkJCQlyZXR1cm4gbGlzdEZlYXR1cmUucmVtb3ZlQWxsKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWN0aW9uT25JdGVtKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBPYmplY3QgdmFsdWUsIGludCBhY3Rpb25UeXBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgbGlzdEZlYXR1cmUpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsCi0JCQkJJiYgdmFsdWUgIT0gbnVsbAotCQkJCSYmICgoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5BREQgJiYgIWxpc3RGZWF0dXJlCi0JCQkJCQkuY29udGFpbnModmFsdWUpKSB8fCAoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5SRU1PVkUgJiYgbGlzdEZlYXR1cmUKLQkJCQkJCS5jb250YWlucyh2YWx1ZSkpKSkgewotCQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGFjdGlvbk1nci5kb0FjdGlvbihhY3Rpb25UeXBlLCBjb25maWcsIGZlYXR1cmUsIHZhbHVlLAotCQkJCQkJLTEpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5BREQpIHsKLQkJCQkJcmV0dXJuIGxpc3RGZWF0dXJlLmFkZCh2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmIChhY3Rpb25UeXBlID09IElBY3Rpb25NYW5hZ2VyLlJFTU9WRSkgewotCQkJCQlyZXR1cm4gbGlzdEZlYXR1cmUucmVtb3ZlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGx1Z2lucwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZENvbGxUb01ldGhvZFBsdWdpbkxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBNZXRob2RQbHVnaW4gdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBsdWdpbnMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb01ldGhvZFBsdWdpbkxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTWV0aG9kUGx1Z2luIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BREQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQbHVnaW5zCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQ29sbEZyb21NZXRob2RQbHVnaW5MaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBNZXRob2RQbHVnaW4gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGx1Z2lucwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUZyb21NZXRob2RQbHVnaW5MaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE1ldGhvZFBsdWdpbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBhY2thZ2VzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkQ29sbFRvTWV0aG9kUGFja2FnZUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gTWV0aG9kUGFja2FnZSB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGFja2FnZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb01ldGhvZFBhY2thZ2VMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE1ldGhvZFBhY2thZ2UgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCX0KLQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGFja2FnZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVDb2xsRnJvbU1ldGhvZFBhY2thZ2VMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIE1ldGhvZFBhY2thZ2UgZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGFja2FnZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tTWV0aG9kUGFja2FnZUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTWV0aG9kUGFja2FnZSB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBhZGRlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkQ29sbFRvQWRkZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gQ29udGVudENhdGVnb3J5IHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBhZGRlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9BZGRlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb250ZW50Q2F0ZWdvcnkgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgYWRkZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUNvbGxGcm9tQWRkZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBDb250ZW50Q2F0ZWdvcnkgZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgYWRkZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUZyb21BZGRlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb250ZW50Q2F0ZWdvcnkgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIHN1YnRyYWN0ZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZENvbGxUb1N1YnRyYWN0ZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIENvbnRlbnRDYXRlZ29yeSB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgc3VidHJhY3RlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9TdWJ0cmFjdGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbnRlbnRDYXRlZ29yeSB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQURELCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgc3VidHJhY3RlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQ29sbEZyb21TdWJ0cmFjdGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBDb250ZW50Q2F0ZWdvcnkgZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgc3VidHJhY3RlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRnJvbVN1YnRyYWN0ZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29udGVudENhdGVnb3J5IHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnN0cmFpbnRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uc3RyYWludE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjNjIwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uc3RyYWludE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgbWFuYWdlcyB0aGUgdXNlIG9mIENvbnRyYWludCBpbiBsaWJyYXJ5IHRvIHN0b3JlCi0gKiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBkYXRhCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRGVjIDEsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnN0cmFpbnRNYW5hZ2VyIHsKLQkvKiogQ29uc3RhbnRzIGZvciBjb250cmFpbiBuYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNJVElWWV9ESUFHUkFNID0gImRpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX1NVUFBSRVNTSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RyYWludCBnZXRDb25zdHJhaW50KE1ldGhvZEVsZW1lbnQgZSwKLQkJCVN0cmluZyBjb25zdHJhaW50TmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKGNvbnN0cmFpbnROYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNvbnN0cmFpbnQgY29uc3RyYWludCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZ2V0T3duZWRSdWxlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29uc3RyYWludCBjID0gKENvbnN0cmFpbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGMuZ2V0TmFtZSgpLmVxdWFscyhjb25zdHJhaW50TmFtZSkpIHsKLQkJCQljb25zdHJhaW50ID0gYzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoY29uc3RyYWludCA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJY29uc3RyYWludCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKTsKLQkJCWNvbnN0cmFpbnQuc2V0TmFtZShjb25zdHJhaW50TmFtZSk7Ci0JCQllLmdldE93bmVkUnVsZXMoKS5hZGQoY29uc3RyYWludCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnN0cmFpbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NGQzOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHN0YXRpYyBoZWxwZXIgbWV0aG9kcyB0aGF0IGFyZSByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudAotICogaW5oZXJpdGFuY2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGRlc2NlbmRpbmdTb3J0QnlDcmVhdGlvblRpbWUoTGlzdCB0YXNrcykgewotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTdGVwcyhMaXN0IHN0ZXBzLCBUYXNrIGJhc2UpIHsKLQkvLyBPYmplY3QgZmlyc3QgPSBudWxsOwotCS8vIGlmKCFzdGVwcy5pc0VtcHR5KCkpIHsKLQkvLyBmaXJzdCA9IHN0ZXBzLmdldCgwKTsKLQkvLyB9Ci0JLy8gTGlzdCB0YXNrcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhiYXNlKTsKLQkvLyBpbnQgc2l6ZSA9IHRhc2tzLnNpemUoKTsKLQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JLy8gVGFzayB0YXNrID0gKFRhc2spIHRhc2tzLmdldChpKTsKLQkvLyBMaXN0IHNlY3Rpb25zID0gdGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCS8vIGludCBudW1PZlNlY3Rpb25zID0gc2VjdGlvbnMuc2l6ZSgpOwotCS8vIFNlY3Rpb24gcHJldiA9IG51bGw7Ci0JLy8gZm9yIChpbnQgaiA9IDA7IGogPCBudW1PZlNlY3Rpb25zOyBqKyspIHsKLQkvLyBTZWN0aW9uIHNlY3Rpb24gPSAoU2VjdGlvbikgc2VjdGlvbnMuZ2V0KGopOwotCS8vIFNlY3Rpb24gcHJlZCA9IHNlY3Rpb24uZ2V0UHJlZGVjZXNzb3IoKTsKLQkvLyBpZihwcmVkID09IG51bGwpIHsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBzdGVwcyBpbiB0aGUgdGFzayB0cmVlIHRoYXQgdGhlIGdpdmVuIHRhc2sgYmVsb25ncyB0bwotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxUYXNrU3RlcHMoVGFzayB0YXNrKSB7Ci0JCVRhc2sgYmFzZSA9IChUYXNrKSBUbmdVdGlsLmdldEJhc2UodGFzayk7Ci0JCUxpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KGJhc2UuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKSk7Ci0JCUl0ZXJhdG9yIHRhc2tzID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJhc2UsIGZhbHNlKSB7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcygKLQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQlUYXNrIGN1cnJlbnRCYXNlID0gYmFzZTsKLQkJd2hpbGUgKHRhc2tzLmhhc05leHQoKSkgewotCQkJVGFzayB0ID0gKFRhc2spIHRhc2tzLm5leHQoKTsKLQkJCWlmIChjdXJyZW50QmFzZSAhPSB0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCS8vIG5ldyBpbmhlcml0YW5jZSBsZXZlbAotCQkJCS8vCi0JCQkJY3VycmVudEJhc2UgPSAoVGFzaykgdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJU2VjdGlvbiBzID0gKFNlY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJCVNlY3Rpb24gcHJlZCA9IHMuZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCQlpZiAocHJlZCAhPSBudWxsKSB7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50TGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRFbGVtZW50TGlzdCB7Ci0KLQlwcml2YXRlIENvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2c7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRWxlbWVudEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyOTE0Mzg5NzAxMjM5ODU5MDZMOwotCi0JCXByb3RlY3RlZCBFbGVtZW50SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcihjb250ZW50UGtnLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuTGlzdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCQkJCWNoaWxkcmVuLmFkZEFsbChwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpKTsKLQkJCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCQkJaWYgKGFjY2VwdChvYmopKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJfQotCQkKLQl9OwotCQotCXB1YmxpYyBDb250ZW50RWxlbWVudExpc3QoQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQl0aGlzLmNvbnRlbnRQa2cgPSBjb250ZW50UGtnOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKTsKLQotCXByb3RlY3RlZCBJdGVyYXRvciBlbGVtZW50SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnZXRBbGxFbGVtZW50cyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotLy8JCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotLy8JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotLy8JCQlpZiAoYWNjZXB0KG9iaikpIHsKLS8vCQkJCWxpc3QuYWRkKG9iaik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotLy8JCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLS8vCQkJCWdldEFsbEVsZW1lbnRzKChDb250ZW50UGFja2FnZSkgb2JqLCBsaXN0KTsKLS8vCQkJfQotLy8JCX0KLQkJCi0JCWZvcihJdGVyYXRvciBpdGVyID0gZWxlbWVudEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmKCEoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCWxpc3QuYWRkKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxFbGVtZW50cyhjb250ZW50UGtnLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRPcmRlckxpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudE9yZGVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZhMDZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudE9yZGVyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLlN0cmluZ1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGFsbCB0aGUgbG9naWNzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsCi0gKiBjb250cmlidXRlZC9pbmhlcml0ZWQgc2VjdGlvbnMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgYXMgd2VsbCBhcyBhbGxvd3MKLSAqIG1hbmlwdWxhdGUgdGhpcyBsaXN0LgotICogCi0gKiAxLjU6IFJlZmFjdG9yZWQgdG8gd29yayBvbiBhbnkgVmFyaWFiaWxpdHlFbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBleHRlbmRzIEJhc2ljRUxpc3QgewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU3Mjc5NzQ4NzA2OTIzM0w7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9JTkZPX05BTUUgPSAiY29udGVudCBlbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBERUZBVUxUX1NBVkVfT1BUSU9OUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTID0gMjsKLQotCXN0YXRpYyB7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJBU0NJSSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgZWRpdEVsZW1lbnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWl4ZWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuaXNDb250cmlidXRvcihlKTsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoVmFyaWFiaWxpdHlFbGVtZW50IGUsIGludCBzY29wZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlpZiAoc2NvcGUgPT0gQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSkgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChzY29wZSA9PSBDT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUykgewotCQkJY2FsY3VsYXRlUGFyZW50c09ubHkoZSk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVBhcmVudHNPbmx5KFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBpc0V4dGVuZGVkKGUpKSB7Ci0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzQm90aChzdXBlcnMsIGUsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJc3VwZXJzLmFkZChlKTsKLQkJCWl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWl4ZWQpIHsKLQkJCS8vIGNyZWF0ZSBhIG1hcCBvZiBHVUlEIC8gY29udHJpYnV0b3IgCi0JCQkKLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcCBndWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVNldCBlbGVtZW50cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCU9iamVjdCBlR2V0ID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKGVHZXQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoKExpc3QpIGVHZXQpOwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGVudEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlEZXNjcmliYWJsZUVsZW1lbnQgY2F0ZWdvcml6ZWRFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgaXRlcmF0b3IKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlndWlkTWFwLnB1dChjYXRlZ29yaXplZEVsZW1lbnQuZ2V0R3VpZCgpLAotCQkJCQkJCWNhdGVnb3JpemVkRWxlbWVudCk7Ci0JCQkJCWVsZW1lbnRzLmFkZChjYXRlZ29yaXplZEVsZW1lbnQpOwotCQkJCX0KLQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZ3VpZCA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5nZXQoaSk7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZ3VpZE1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChlbGVtZW50KTsKLQkJCQkJCWVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChlbGVtZW50cyk7Ci0JCX0KLQl9Ci0KLQkvLyBkZXByZWNhdGUgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBDb250ZW50RWxlbWVudE9yZGVyTGlzdChWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQllZGl0RWxlbWVudCA9IGU7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBUbmdVdGlsLmhhc0NvbnRyaWJ1dG9yKGUpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IFRuZ1V0aWwuZ2V0QmFzZShlKTsKLQkJCWl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYmFzZSkgewotCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldEltbWVkaWF0ZVZhcmlldGllcygoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0gZWxzZSBpZiAoaXNFeHRlbmRlZChlKSkgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gZXh0ZW5kZWQgaXMgdHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnMoc3VwZXJzLCBlLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvcgotCQkJT3JkZXJJbmZvIGxhdGVzdEluZm8gPSBudWxsOwotCQkJTWFwIGd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJTGlzdCBlbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWd1aWRNYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCBlbGVtZW50KTsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0KLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oZWxlbWVudCwKLQkJCQkJCU9SREVSX0lORk9fTkFNRSk7Ci0JCQkJaWYgKG9yZGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwKLQkJCQkJCQl8fCBvcmRlckluZm8uZ2V0VGltZXN0YW1wKCkgPiBsYXRlc3RJbmZvCi0JCQkJCQkJCQkuZ2V0VGltZXN0YW1wKCkpIHsKLQkJCQkJCWxhdGVzdEluZm8gPSBvcmRlckluZm87Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQkvLyByZW9yZGVyIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbGF0ZXN0IG9yZGVyIGluZm8KLQkJCQkvLwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZ3VpZCA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5nZXQoaSk7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZ3VpZE1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChlbGVtZW50KTsKLQkJCQkJCWVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChlbGVtZW50cyk7Ci0JCX0KLQkJLy8gZWxzZSB7Ci0JCS8vIC8vIGFkZEFsbChlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKTsKLQkJLy8gbWl4ZWQgPSBmYWxzZTsKLQkJLy8gfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlZChWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFM7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyByZWNlbnQgY2hhbmdlcyBpbiB0aGUgbGlzdAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KCkgewotCQlpZiAoIW1peGVkIHx8ICFjaGFuZ2VkKQotCQkJcmV0dXJuOwotCi0JCS8vIHNhdmUgdGhlIG9yZGVyIGluZm8gdG8gdGhlIG9yZGVyaW5nR3VpZGUgb2YgdGhlIGVkaXRFbGVtZW50Ci0JCS8vCi0JCVN0cmluZyBzdHIgPSBlZGl0RWxlbWVudC5nZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCU9yZGVySW5mb0NvbGxlY3Rpb24gb3JkZXJJbmZvcyA9IG51bGw7Ci0JCVN0cmluZ1Jlc291cmNlIHJlcyA9IG51bGw7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgewotCQkJb3JkZXJJbmZvcyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQl9IGVsc2UgewotCQkJcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKHN0cik7Ci0JCQl0cnkgewotCQkJCXJlcy5sb2FkKG51bGwpOwotCQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJb3JkZXJJbmZvcyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9yZGVySW5mb3MgPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmluZCB0aGUgb3JkZXIgaW5mb3IgZm9yIHNlY3Rpb25zCi0JCS8vCi0JCU9yZGVySW5mbyBzZWN0T3JkZXJJbmZvID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3JkZXJJbmZvcy5nZXRPcmRlckluZm9zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoT1JERVJfSU5GT19OQU1FLmVxdWFsc0lnbm9yZUNhc2Uob3JkZXJJbmZvLmdldE5hbWUoKSkpIHsKLQkJCQlzZWN0T3JkZXJJbmZvID0gb3JkZXJJbmZvOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlY3RPcmRlckluZm8gPT0gbnVsbCkgewotCQkJc2VjdE9yZGVySW5mbyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3JkZXJJbmZvKCk7Ci0JCQlzZWN0T3JkZXJJbmZvLnNldE5hbWUoT1JERVJfSU5GT19OQU1FKTsKLQkJCW9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLmFkZChzZWN0T3JkZXJJbmZvKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5jbGVhcigpOwotCQl9Ci0KLQkJaW50IHNpemUgPSBzaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgc2VjdCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGdldChpKTsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5hZGQoc2VjdC5nZXRHdWlkKCkpOwotCQl9Ci0JCXNlY3RPcmRlckluZm8uc2V0VGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQlyZXMgPSBuZXcgU3RyaW5nUmVzb3VyY2UobnVsbCk7Ci0JCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQob3JkZXJJbmZvcyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlcy5zYXZlKERFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJCXN0ciA9IHJlcy5nZXRTdHJpbmcoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdGlvbkxpc3QuYXBwbHkoKTogbmV3IG9yZGVyaW5nIGd1aWRlIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIHN0YXJ0IC0tLS0tLSIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIGVuZCAtLS0tLS0iKTsKLQkJCWVkaXRFbGVtZW50LnNldE9yZGVyaW5nR3VpZGUoc3RyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKFZhcmlhYmlsaXR5RWxlbWVudCBjb250ZW50RWxlbWVudCkgewotCQlpZiAoZUdldCgpLmNvbnRhaW5zKGNvbnRlbnRFbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCWlmICghY2FuUmVtb3ZlKChWYXJpYWJpbGl0eUVsZW1lbnQpIGdldChpbmRleCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJT2JqZWN0IHJlbW92ZWQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotCQkJZUdldCgpLnJlbW92ZShyZW1vdmVkKTsKLQkJCXJldHVybiByZW1vdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCWlmICghY2FuUmVtb3ZlKChWYXJpYWJpbGl0eUVsZW1lbnQpIG8pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobWl4ZWQpIHsKLQkJCWlmIChzdXBlci5yZW1vdmUobykpIHsKLQkJCQllR2V0KCkucmVtb3ZlKG8pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBlR2V0KCkucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGMpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCQlJdGVyYXRvciBlID0gaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvID0gZS5uZXh0KCk7Ci0JCQkJaWYgKGMuY29udGFpbnMobykgJiYgY2FuUmVtb3ZlKChWYXJpYWJpbGl0eUVsZW1lbnQpIG8pKSB7Ci0JCQkJCWUucmVtb3ZlKCk7Ci0JCQkJCWVHZXQoKS5yZW1vdmUobyk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLnJlbW92ZUFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJCWVHZXQoKS5hZGQoZWxlbWVudCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWVHZXQoKS5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0JCWJvb2xlYW4gYiA9IGVHZXQoKS5hZGQobyk7Ci0JCWlmIChtaXhlZCkgewotCQkJYiA9IHN1cGVyLmFkZChvKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGMpIHsKLQkJYm9vbGVhbiBiID0gZUdldCgpLmFkZEFsbChjKTsKLQkJOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGRBbGwoYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQllR2V0KCkuYWRkQWxsKGMpOwotCQkJOwotCQkJYm9vbGVhbiBiID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBlR2V0KCkuYWRkQWxsKGMpOwotCX0KLQotCXB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBlR2V0KCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCWVHZXQoKS5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIubW92ZShpbmRleCwgb2JqZWN0KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJKChFTGlzdCkgZUdldCgpKS5tb3ZlKGluZGV4LCBvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJT2JqZWN0IG1vdmVkID0gc3VwZXIubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlyZXR1cm4gbW92ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXQoaW5kZXgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5nZXQoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5zaXplKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLnNpemUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlR2V0KCkuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gZUdldCgpLmNvbnRhaW5zKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQkJcmV0dXJuIGVHZXQoKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBlR2V0KCkudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGFycmF5KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci50b0FycmF5KGFycmF5KTsKLQkJcmV0dXJuIGVHZXQoKS50b0FycmF5KGFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuaW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gZUdldCgpLmluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0JCXJldHVybiBlR2V0KCkubGFzdEluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01peGVkKCkgewotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JcHJpdmF0ZSBFTGlzdCBlR2V0KCkgewotCQlFTGlzdCBsaXN0ID0gbnVsbDsKLQkJT2JqZWN0IG9iamVjdCA9IGVkaXRFbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJbGlzdCA9IChFTGlzdCkgb2JqZWN0OwotCQl9Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EZWJ1Z1V0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EZWJ1Z1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2YjVkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVidWdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBkZWJ1ZyBwdXJwb3NlCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVidWdVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIFByaW50U3RyZWFtIG91dHB1dDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJvbXB0ID0gIkxEPiAiOyAJCQkJCS8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0KFByaW50U3RyZWFtIG9wKSB7Ci0JCW91dHB1dCA9IG9wOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvbXB0KFN0cmluZyBwdCkgewotCQlwcm9tcHQgPSBwdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gb3V0KCkgewotCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKLQkJCXJldHVybiBvdXRwdXQ7Ci0JCX0KLQkJcmV0dXJuIFN5c3RlbS5vdXQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChTdHJpbmcgYmVnaW5UaXRsZSwgU3RyaW5nIGVuZFRpdGxlLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cywgaW50IGl4KSB7Ci0JCWlmIChiZWdpblRpdGxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBzdHIgPSAiIjsJCQkJLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCQlzdHIgPSAibnVsbCI7CQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJc3RyID0gZWxlbWVudHMudG9TdHJpbmcoKTsKLQkJCX0KLQkJCW91dCgpLnByaW50bG4ocHJvbXB0ICsgYmVnaW5UaXRsZSArIHN0cik7Ci0JCX0KLQkJCi0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlvdXQoKS5wcmludGxuKHByb21wdCArIHRvU3RyaW5nKGVsZW1lbnQsIGl4KSk7Ci0JCX0KLQkJCi0JCWlmIChlbmRUaXRsZSAhPSBudWxsKSB7Ci0JCQlvdXQoKS5wcmludGxuKHByb21wdCArIGVuZFRpdGxlKTsKLQkJfQotCQlvdXQoKS5wcmludGxuKCIiKTsJCQkvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgaW50IGl4KSB7Ci0JCWlmIChpeCA9PSAxKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQpOwotCQl9IAotCQlpZiAoaXggPT0gMikgewotCQkJcmV0dXJuIGVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIiwgIiArICAvLyROT04tTkxTLTEkCi0JCQkJCWVsZW1lbnQuZ2V0R3VpZCgpICsgIiwgIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50KTsvLyROT04tTkxTLTEkIAotCQl9Ci0JCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjUxOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxFPiBleHRlbmRzCi0JCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPEU+IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI1MjcxNzgyNzc2MjAwMDgyMkw7Ci0KLQlwcml2YXRlIGludCBkZXB0aExldmVsOwotCi0JcHVibGljIERlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBvYmplY3QsIGJvb2xlYW4gaW5jbHVkZVJvb3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgaW5jbHVkZVJvb3QpOwotCX0KLQotCXB1YmxpYyBEZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlFIG9iamVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlkZXB0aExldmVsID0gc2l6ZSgpOwotCQlyZXR1cm4gc3VwZXIubmV4dCgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldERlcHRoTGV2ZWwoKSB7Ci0JCXJldHVybiBkZXB0aExldmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EaWFncmFtT3B0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RpYWdyYW1PcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MGYxNWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RpYWdyYW1PcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtT3B0aW9ucyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFVCTElTSF9BRCA9ICJwdWJsaXNoX2FkIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BVQkxJU0hfQUREID0gInB1Ymxpc2hfYWRkIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BVQkxJU0hfV1BERCA9ICJwdWJsaXNoX3dwZGQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFB1Ymxpc2hBRChBY3Rpdml0eSBhY3Rpdml0eSwgYm9vbGVhbiBiKXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KGFjdGl2aXR5LCBQUk9QX1BVQkxJU0hfQUQsIGIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaXNoQUQoQWN0aXZpdHkgYWN0aXZpdHkpewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX0FEKTsKLQkJcmV0dXJuIHByb3AgIT0gbnVsbCA/IEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3AuZ2V0VmFsdWUoKSkgOiB0cnVlOyAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFB1Ymxpc2hBREQoQWN0aXZpdHkgYWN0aXZpdHksIGJvb2xlYW4gYil7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5zZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX0FERCwgYik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hBREQoQWN0aXZpdHkgYWN0aXZpdHkpewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX0FERCk7Ci0JCXJldHVybiBwcm9wICE9IG51bGwgPyBCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wLmdldFZhbHVlKCkpIDogdHJ1ZTsgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQdWJsaXNoV1BERChBY3Rpdml0eSBhY3Rpdml0eSwgYm9vbGVhbiBiKXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KGFjdGl2aXR5LCBQUk9QX1BVQkxJU0hfV1BERCwgYik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hXUEREKEFjdGl2aXR5IGFjdGl2aXR5KXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoYWN0aXZpdHksIFBST1BfUFVCTElTSF9XUEREKTsKLQkJcmV0dXJuIHByb3AgIT0gbnVsbCA/IEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3AuZ2V0VmFsdWUoKSkgOiB0cnVlOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjJhOWU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLQotLyoqCi0gKiBBIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgdGhhdCBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRpbmdEb21haW4oRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCWlmIChlZGl0aW5nRG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWRpdGluZ0RvbWFpbikKLQkJCQkJLnNldEFkYXB0ZXJGYWN0b3J5KHRoaXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NjM4ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4cG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmU7Ci0KLQotLyoqCi0gKiBBbiBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0aGF0IGV4cG9zZXMgaW50ZXJuYWwgZGF0YQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJQ29sdW1uQXdhcmUsIElSZWZlcmVuY2VyIHsKLQotCXByaXZhdGUgTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjaGFuZ2VOb3RpZmllcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCQljb2x1bW5JbmRleFRvTmFtZU1hcCA9IG1hcDsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyRmFjdG9yaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlckZhY3RvcnkpLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKG1hcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI2dldENvbHVtbkluZGV4VG9OYW1lTWFwKCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbHVtbkluZGV4VG9OYW1lTWFwKCkgewotCQlyZXR1cm4gY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNjbGVhblVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotCQlpbnQgc2l6ZSA9IGFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElSZWZlcmVuY2VyKSB7Ci0JCQkJKChJUmVmZXJlbmNlcilhZGFwdGVyRmFjdG9yeSkuY2xlYW5VcCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHJlZikgewotCQlib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLQkJaW50IHNpemUgPSBhZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJUmVmZXJlbmNlcikgewotCQkJCSgoSVJlZmVyZW5jZXIpYWRhcHRlckZhY3RvcnkpLnJlbW92ZShyZWYpOwotCQkJCXJlbW92ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4dGVuc2lvbk1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTQzZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4dGVuc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHdpdGggbWV0aG9kcyB0byByZXRyaWV2ZSBleHRlbnNpb25zCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDI3LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJTmVzdGVkQ29tbWFuZFByb3ZpZGVyPiBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzOwotCXByaXZhdGUgc3RhdGljIExpc3Qgb3Bwb3NpdGVGZWF0dXJlTG9hZGVyczsKLQkKLQlwdWJsaWMgc3RhdGljIDxUPkxpc3Q8VD4gZ2V0RXh0ZW5zaW9ucyhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lLCBDbGFzczxUPiB0eXBlKSB7Ci0JCXJldHVybiBFeHRlbnNpb25IZWxwZXIuZ2V0RXh0ZW5zaW9ucyhuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSwgdHlwZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lKSB7Ci0JCXJldHVybiBFeHRlbnNpb25IZWxwZXIuY3JlYXRlRXh0ZW5zaW9uKG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RXh0ZW5zaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUpIHsKLQkJcmV0dXJuIEV4dGVuc2lvbkhlbHBlci5nZXRFeHRlbnNpb24obmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVRleHRSZWZlcmVuY2VSZXBsYWNlciBnZXRUZXh0UmVmZXJlbmNlUmVwbGFjZXIoKSB7Ci0JCXJldHVybiAoSVRleHRSZWZlcmVuY2VSZXBsYWNlcikgZ2V0RXh0ZW5zaW9uKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAidGV4dFJlZmVyZW5jZVJlcGxhY2VyIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PElOZXN0ZWRDb21tYW5kUHJvdmlkZXI+IGdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IGdldEV4dGVuc2lvbnMoTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIAotCQkJCQkibmVzdGVkQ29tbWFuZFByb3ZpZGVycyIsIElOZXN0ZWRDb21tYW5kUHJvdmlkZXIuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5lc3RlZENvbW1hbmRQcm92aWRlcnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRGlhZ3JhbU1hbmFnZXIgZ2V0RGlhZ3JhbU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoSURpYWdyYW1NYW5hZ2VyKSBnZXRFeHRlbnNpb24oTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJkaWFncmFtTWFuYWdlciIpOyAvLyROT04tTkxTLTEkIAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3Bwb3NpdGVGZWF0dXJlTG9hZGVycygpIHsKLQkJaWYob3Bwb3NpdGVGZWF0dXJlTG9hZGVycyA9PSBudWxsKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzID0gZ2V0RXh0ZW5zaW9ucyhMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgCi0JCQkJCSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIiwgSU5lc3RlZENvbW1hbmRQcm92aWRlci5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTG9hZGVyczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVXNlckludGVyYWN0aW9uSGFuZGxlciBnZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIChJVXNlckludGVyYWN0aW9uSGFuZGxlcikgZ2V0RXh0ZW5zaW9uKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAidXNlckludGVyYWN0aW9uSGFuZGxlciIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9HcmFwaGljYWxEYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvR3JhcGhpY2FsRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjhkMzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9HcmFwaGljYWxEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsRGF0YSB7Ci0JcHJpdmF0ZSBQb2ludCBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQotCXByaXZhdGUgRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKC0xLCAtMSk7Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBncmFwaE5vZGU7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoKSB7Ci0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhOb2RlKEdyYXBoTm9kZSBncmFwaE5vZGUpIHsKLQkJdGhpcy5ncmFwaE5vZGUgPSBncmFwaE5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIFRoZSBsb2NhdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2l6ZS4KLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaXplCi0JICogICAgICAgICAgICBUaGUgc2l6ZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gc2l6ZSkgewotCQl0aGlzLnNpemUgPSBzaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lCcmVha2Rvd25TdHJ1Y3R1cmVBZGFwdGVyRmFjdG9yaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjYxYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lCcmVha2Rvd25TdHJ1Y3R1cmVBZGFwdGVyRmFjdG9yaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZXMgYSByZWxhdGVkIHNldCBvZiBhZGFwdGVyIGZhY3RvcmllcyBmb3IgYnJlYWtkb3duCi0gKiBzdHJ1Y3R1cmUgdmlld3MKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjAsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3RvcmllcyB7Ci0JQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQotCUFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCUFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSURpYWdyYW1NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSURpYWdyYW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODY5YzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lEaWFncmFtTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci0KLS8qKgotICogTWFuYWdlcyBkaWFncmFtcyBvZiBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbU1hbmFnZXIgewotCS8qKiBEaWFncmFtIHR5cGUgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNID0gMjsKLQotCS8qKgotCSAqIEdldHMgZGlhZ3JhbSBvZiBnaXZlbiB0eXBlIGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUgY2FuIGJlIG9uZSBvZiB0aGUgY29uc3RhbnRzIHtAbGluayAjQUNUSVZJVFlfRElBR1JBTX0sIHtAbGluayAjQUNUSVZJVFlfREVUQUlMX0RJQUdSQU19LCBvciB7QGxpbmsgI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU19Ci0JICogQHJldHVybgotCSAqLwotCURpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lMaWJyYXJ5SW5zcGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWQ5MjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lMaWJyYXJ5SW5zcGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkZWJ1ZyBwdXJwb3NlCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEF1Z3VzdCAxMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUluc3BlY3RvciB7Ci0JLyoqCi0JICogU2hvdyBhbGwgY29udGVudHMgb2YgdGhlIGxpYnJhcnkKLQkgKi8KLQl2b2lkIHNob3dBbGxDb250ZW50cygpOwotCQotCS8qKgotCSAqIFNob3cgYWxsIGNvbnRlbnRzIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0Jdm9pZCBzaG93QWxsQ29udGVudHMoTWV0aG9kTGlicmFyeSBsaWIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjc4OWVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBPcHBvc2l0ZSBmZWF0dXJlIGxvYWRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAxNCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIHsKLQkvKioKLQkgKiBMb2FkcyBvcHBvc2l0ZSBmZWF0dXJlcyBmb3IgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0Jdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhDb2xsZWN0aW9uIGVsZW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkMmFjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVJ1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLSAgICAvKioKLSAgICAgKiBSdW5zIHRoaXMgb3BlcmF0aW9uLiAgUHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW52b2tlZCBieSBhbiA8Y29kZT5JUnVubmFibGVDb250ZXh0PC9jb2RlPidzIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kLAotICAgICAqIHdoaWNoIHN1cHBsaWVzIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqIEEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaG9ub3JlZCBhbmQgYWNrbm93bGVkZ2VkIAotICAgICAqIGJ5IHRocm93aW5nIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0gICAgICogICByZXF1ZXN0cyBmb3IgY2FuY2VsYXRpb24KLSAgICAgKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwKLSAgICAgKiAJaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkKLSAgICAgKiAgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGUgY2FsbGluZyBjb250ZXh0Ci0gICAgICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgCi0gICAgICogIHVzaW5nIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcgCi0gICAgICogIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPgotICAgICAqCi0gICAgICogQHNlZSBJUnVubmFibGVDb250ZXh0I3J1bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVRleHRSZWZlcmVuY2VSZXBsYWNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkZjUxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVRleHRSZWZlcmVuY2VSZXBsYWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FuIHNjYW4gdGV4dCBhbmQgcmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZQotICogb2xkIG9iamVjdHMgd2l0aCByZWZlcmVuY2VzIHRvIG5ldyBvYmplY3RzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDIyLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWZlcmVuY2VSZXBsYWNlciB7Ci0JLyoqCi0JICogUmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZSBvbGQgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbmV3Ci0JICogb2JqZWN0cyBwcm92aWRlZCBpbiB0aGUgPGNvZGU+b2xkVG9OZXdPYmplY3RNYXA8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgdGV4dAotCSAqIEBwYXJhbSBvbGRUb05ld09iamVjdE1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgcmVwbGFjZShTdHJpbmcgdGV4dCwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGI4ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElJdGVtTGFiZWxQcm92aWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0ID09IG51bGwgPyAiIiA6IG9iamVjdC50b1N0cmluZygpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9MaWJyYXJ5RWRpdENvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0xpYnJhcnlFZGl0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MmEwNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0xpYnJhcnlFZGl0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIGxpYnJhcnkgZWRpdCBwbHVnaW4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgSnVuIDMwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5RWRpdENvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1RBU0tTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX1Rhc2tzX3RleHQiKSAvLyROT04tTkxTLTEkCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9ET01BSU5fV09SS1BST0RVQ1RTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dCIpIC8vJE5PTi1OTFMtMSQJCQkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9XT1JLUFJPRFVDVFRZUEVfV09SS1BST0RVQ1RTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX3RleHQiKSAvLyROT04tTkxTLTEkCQkJCQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfUk9MRVNfUEFUSCA9IHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQiKSAvLyROT04tTkxTLTEkCQkKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1RPT0xNRU5UT1JTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX3RleHQiKSAvLyROT04tTkxTLTEkCQkJCQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9QUkVGSVggPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTiA9IFBSRUZfUFJFRklYCi0JCQkrICJlbmFibGVfcHJvY2Vzc19jb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9IRUFMVEhfQ0hFQ0sgPSBQUkVGX1BSRUZJWAotCQkJKyAiZW5hYmxlX2hlYWx0aF9jaGVjayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSA9IFBSRUZfUFJFRklYCi0JCQkrICJpbmhlcml0X3N1cHByZXNzaW9uX3N0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XQlNfQ09MVU1OUyA9IFBSRUZfUFJFRklYICsgIndic19jb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UQlNfQ09MVU1OUyA9IFBSRUZfUFJFRklYICsgInRic19jb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XUEJTX0NPTFVNTlMgPSBQUkVGX1BSRUZJWCArICJ3cGJzX2NvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ1VTVE9NX0NBVEVHT1JZID0gIm5ld19jdXN0b21fY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRElTQ0lQTElORSA9ICJuZXdfZGlzY2lwbGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ESVNDSVBMSU5FX0dST1VQSU5HID0gIm5ld19kaXNjaXBsaW5lX2dyb3VwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RPTUFJTiA9ICJuZXdfZG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JPTEVfU0VUID0gIm5ld19yb2xlX3NldCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ST0xFX1NFVF9HUk9VUElORyA9ICJuZXdfcm9sZV9zZXRfZ3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVE9PTCA9ICJuZXdfdG9vbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XT1JLX1BST0RVQ1RfVFlQRSA9ICJuZXdfd29ya19wcm9kdWN0X2tpbmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9MRSA9ICJuZXdfcm9sZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19UQVNLID0gIm5ld190YXNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dPUktQUk9EVUNUID0gIm5ld193b3JrcHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19BUlRJRkFDVCA9ICJuZXdfYXJ0aWZhY3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfREVMSVZFUkFCTEUgPSAibmV3X2RlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX09VVENPTUUgPSAibmV3X291dGNvbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ0hFQ0tMSVNUID0gIm5ld19jaGVja2xpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfV0hJVEVQQVBFUiA9ICJuZXdfd2hpdGVwYXBlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05DRVBUID0gIm5ld19jb25jZXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VTVElNQVRFID0gIm5ld19lc3RpbWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT04gPSAibmV3X2VzdGltYXRpb25fY29uc2lkZXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVNUSU1BVEFUSU5HX01FVFJJQyA9ICJuZXdfZXN0aW1hdGluZ19tZXRyaWMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVhBTVBMRSA9ICJuZXdfZXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19QUkFDVElDRSA9ICJuZXdfcHJhY3RpY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUkVQT1JUID0gIm5ld19yZXBvcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9BRE1BUCA9ICJuZXdfcm9hZG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19SRVVTQUJMRV9BU1NFVCA9ICJuZXdfcmV1c2FibGVfYXNzZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfU1VQUE9SVElOR19NQVRFUklBTCA9ICJuZXdfc3VwcG9ydGluZ19tYXRlcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19URU1QTEFURSA9ICJuZXdfdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEVSTV9ERUZJTklUSU9OID0gIm5ld190ZXJtX2RlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVE9PTF9NRU5UT1IgPSAibmV3X3Rvb2xtZW50b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfR1VJREVMSU5FID0gIm5ld19ndWlkZWxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfR1VJREFOQ0UgPSAibmV3X2d1aWRhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTlRFTlRfUEFDS0FHRSA9ICJuZXdfY29udGVudF9wYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTkZJR1VSQVRJT04gPSAibmV3X2NvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUFJPQ0VTU19GQU1JTFkgPSAibmV3X3Byb2Nlc3NfZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01lc3Nlbmdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01lc3Nlbmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTA1ZmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXI7Ci0KLS8qKgotICogRGVmYXVsdCBtZXNzZW5nZXIgdGhhdCB3aWxsIGRlbGl2ZXIgbWVzc2FnZXMgdXNpbmcgdGhlIG1lc3NlbmdlciBvZgotICoge0BsaW5rIEV4dGVuc2lvbk1hbmFnZXIjZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKSBkZWZhdWx0IHVzZXIKLSAqIGludGVyYWN0aW9uIGhhbmRsZXJ9IGlmIG9uZSBleGlzdHMuIE90aGVyd2lzZSwgaXQgd2lsbCBsb2cgdGhlIG1lc3NhZ2VzIHVzaW5nCi0gKiBwbHVnaW4ncyBsb2dnZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI1LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzZW5nZXIgaW1wbGVtZW50cyBJVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NlbmdlciBJTlNUQU5DRSA9IG5ldyBNZXNzZW5nZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgKLQkJCSJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSU1lc3NlbmdlciBkZWxlZ2F0ZTsKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQotCXByaXZhdGUgTWVzc2VuZ2VyKCkgewotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUgPSB1aUhhbmRsZXIuZ2V0TWVzc2VuZ2VyKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93RXJyb3IodGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dFcnJvcih0aXRsZSwgbXNnLCBzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd1dhcm5pbmcoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93V2FybmluZyh0aXRsZSwgbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbik7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsocmVhc29uKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChyZWFzb24pOwotCQkJfQotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0luZm8oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dJbmZvKHRpdGxlLCBtc2cpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nSW5mbyhzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd0luZm8odGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsocmVhc29uKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChyZWFzb24pOwotCQkJfQotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhkZXRhaWxzKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChkZXRhaWxzKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MDlmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4NyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlNZ3IuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5DaGFuZ2VFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqICBDbGFzcyBtYW5hZ2luZyBjYWNoZWQgbWV0aG9kIGVsZW1lbnQgcHJvcGVydGllcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBNYXkgMTAsIDIwMDgKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzIGV4dGVuZHMgQWRhcHRlckltcGwgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgU2V0PFN0cmluZz4gcHJvcE5hbWVTZXQgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4+IHByb3BlcnR5TWFwOwotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydGllcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZ1tdIHByb3BOYW1lQXJyYXkpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJaWYgKHByb3BOYW1lQXJyYXkgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wTmFtZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvcE5hbWVTZXQuYWRkKHByb3BOYW1lQXJyYXlbaV0pOwotCQkJfQotCQl9CQkKLQkJcHJvcGVydHlNYXAgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlNYXAoZWxlbWVudCwgZ2V0UHJvcE5hbWVTZXQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRQcm9wTmFtZVNldCgpIHsKLQkJcmV0dXJuICBwcm9wTmFtZVNldDsKLQl9Ci0JCi0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wTmFtZVJlZ2lzdGVyZWQoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCXJldHVybiBnZXRQcm9wTmFtZVNldCgpICE9IG51bGwgJiYgZ2V0UHJvcE5hbWVTZXQoKS5jb250YWlucyhwcm9wTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlPYmplY3Qgb2JqID0gbXNnLmdldE5vdGlmaWVyKCk7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZVByb3AgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudFByb3BlcnR5KSB7Ci0JCQltZVByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBvYmo7Ci0JCX0gZWxzZSBpZiAob2JqID09IGVsZW1lbnQpIHsKLQkJCWlmIChtc2cuZ2V0RmVhdHVyZSgpICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL1RvIGJlIGltcGxlbWVudGVkOiBkbyBub3RoaW5nIGZvciBub3cKLQotCX0KLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewotCQlMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gcHJvcExpc3QgPSBwcm9wZXJ0eU1hcC5nZXQocHJvcE5hbWUpOwotCQlyZXR1cm4gcHJvcExpc3QgPT0gbnVsbCB8fCBwcm9wTGlzdC5pc0VtcHR5KCkgPyBudWxsIDogcHJvcExpc3QuZ2V0KDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUpIHsKLQkJTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IHByb3BMaXN0ID0gcHJvcGVydHlNYXAuZ2V0KHByb3BOYW1lKTsKLQkJaWYgKHByb3BMaXN0ID09IG51bGwpIHsKLQkJCXByb3BMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+KCk7Ci0JCQlwcm9wZXJ0eU1hcC5wdXQocHJvcE5hbWUsIHByb3BMaXN0KTsKLQkJfQotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IHByb3BMaXN0LmlzRW1wdHkoKSA/IG51bGwgOiBwcm9wTGlzdC5nZXQoMCk7Ci0JCWlmIChwcm9wID09IG51bGwpIHsKLQkJCXByb3AgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCXByb3Auc2V0TmFtZShwcm9wTmFtZSk7Ci0JCQllbGVtZW50LmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmFkZChwcm9wKTsKLQkJCWlmIChwcm9wTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlwcm9wTGlzdC5hZGQocHJvcCk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIG9sZFZhbHVlID0gcHJvcC5nZXRWYWx1ZSgpOwkJCi0JCWlmIChlcXVhbChvbGRWYWx1ZSwgcHJvcFZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXByb3Auc2V0VmFsdWUocHJvcFZhbHVlKTsJCQotCQlub3RpZnlMaXN0ZW5lcnMobmV3IENoYW5nZUV2ZW50KHByb3AsIG9sZFZhbHVlLCBwcm9wVmFsdWUpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKFN0cmluZyBwcm9wTmFtZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5KHByb3BOYW1lKTsKLQkJaWYgKHByb3AgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB2YWx1ZSA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFscyhwcm9wLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZXF1YWwoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCWlmIChhICE9IG51bGwpIHsKLQkJCXJldHVybiBhLmVxdWFscyhiKTsKLQkJfQkJCi0JCXJldHVybiBiID09IG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDaGFuZ2VFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKENoYW5nZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyhDaGFuZ2VFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBvIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIENoYW5nZUV2ZW50TGlzdGVuZXIpCi0JCQkJKChDaGFuZ2VFdmVudExpc3RlbmVyKSBvKS5ub3RpZnlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQllbGVtZW50ID0gbnVsbDsKLQkJbGlzdGVuZXJzID0gbnVsbDsKLQkJcHJvcE5hbWVTZXQgPSBudWxsOwotCQlwcm9wZXJ0eU1hcCA9IG51bGw7Ci0JCQotCQkvL1RvIGRvOiByZW1vdmUgZnJvbSB0aGlzIGFkYXB0ZXIgZnJvbSBhbGwgYXR0YWNoZWQgTm90aWZpZXIgb2JqZWN0cwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTQ0MDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfT1JERVJfX1BSRURFQ0VTU09SX1BST0NFU1NfUEFUSCA9ICJwcmVkX3Byb2Nlc3NfcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfUFJPUEJMRU1fSElERV9FUlJPUlMgPSAiaGlkZV9lcnJvcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BST1BCTEVNX0hJREVfV0FSTklOR1MgPSAiaGlkZV93YXJuaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfUFJPUEJMRU1fSElERV9JTkZPUyA9ICJoaWRlX2luZm9zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWV9fSU5DTFVERURfRUxFTUVOVFMgPSAiaW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBnZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIGl0ZXIubmV4dCgpOwotCQkJCWlmKHByb3AuZ2V0TmFtZSgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJCXJldHVybiBwcm9wOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gZ2V0UHJvcGVydHkoZSwgcHJvcE5hbWUpOwotCQlpZiAocHJvcCA9PSBudWxsKSB7Ci0JCQlwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQlwcm9wLnNldE5hbWUocHJvcE5hbWUpOwotCQkJZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5hZGQocHJvcCk7Ci0JCX0KLQkJaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHByb3BWYWx1ZS5lcXVhbHMocHJvcC5nZXRWYWx1ZSgpKSkgcmV0dXJuOwotCQlpZiAocHJvcFZhbHVlID09IG51bGwgJiYgcHJvcC5nZXRWYWx1ZSgpID09IG51bGwpIHJldHVybjsKLQkJcHJvcC5zZXRWYWx1ZShwcm9wVmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiBiKSB7Ci0JCXNldFByb3BlcnR5KGUsIHByb3BOYW1lLCBTdHJpbmcudmFsdWVPZihiKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlbW92ZVByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BOYW1lKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFByb3BlcnR5KGUsIHByb3BOYW1lKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCWUuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkucmVtb3ZlKHByb3BlcnR5KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRQcm9wZXJ0eUxpc3QoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQkJTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IGFsbFByb3BzID0gZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsJCQotCQlpZiAoYWxsUHJvcHMgPT0gbnVsbCB8fCBhbGxQcm9wcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBwcm9wTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PigpOwotCQlmb3IgKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wOiBhbGxQcm9wcykgewotCQkJaWYocHJvcC5nZXROYW1lKCkuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQlwcm9wTGlzdC5hZGQocHJvcCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvcExpc3QuaXNFbXB0eSgpID8gbnVsbCA6IHByb3BMaXN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5Pj4gZ2V0UHJvcGVydHlNYXAoTWV0aG9kRWxlbWVudCBlLCBDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlNYXAgcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5Pj4oKTsKLQkJaWYgKGUgPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWVzID09IG51bGwgfHwgcHJvcGVydHlOYW1lcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBwcm9wZXJ0eU1hcDsKLQkJfQotCQotCQlmb3IgKFN0cmluZyBwcm9wTmFtZTogcHJvcGVydHlOYW1lcykgewotCQkJTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IHByb3BMaXN0ID0gZ2V0UHJvcGVydHlMaXN0KGUsIHByb3BOYW1lKTsKLQkJCXByb3BlcnR5TWFwLnB1dChwcm9wTmFtZSwgcHJvcExpc3QpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eU1hcDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDBhODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDg3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci0KLS8qKgotICogQ2xhc3MgbWFuYWdpbmcgbWV0aG9kIGVsZW1lbnQgcHJvcGVydGllcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBNYXkgMTAsIDIwMDgKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50UHJvcGVydHlNZ3IgaW5zdGFuY2UgPSBuZXcgTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyKCk7Ci0KLQlwcml2YXRlIE1hcDxNZXRob2RFbGVtZW50LCBNZXRob2RFbGVtZW50UHJvcGVydGllcz4gcmVnaXN0ZXJlZE1hcCA9IAotCQkJCQkJCW5ldyBIYXNoTWFwPE1ldGhvZEVsZW1lbnQsIE1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzPigpOwotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQotCXByaXZhdGUgTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzIHJlZ2lzdGVyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCVN0cmluZ1tdIHByb3BOYW1lcykgewotCQlNZXRob2RFbGVtZW50UHJvcGVydGllcyBwcm9wcyA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydGllcyhlbGVtZW50LCBwcm9wTmFtZXMpOwotCQlyZWdpc3RlcihlbGVtZW50LCBwcm9wcyk7Ci0JCXJldHVybiBwcm9wczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJdW5yZWdpc3RlcihlbGVtZW50KTsKLQkJcmVnaXN0ZXJlZE1hcC5wdXQoZWxlbWVudCwgcHJvcHMpOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydGllcyB1bnJlZ2lzdGVyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydGllcyBwcm9wcyA9IHJlZ2lzdGVyZWRNYXAucmVtb3ZlKGVsZW1lbnQpOwotCQlpZiAocHJvcHMgIT0gbnVsbCkgewotCQkJcHJvcHMuZGlzcG9zZSgpOwotCQl9CQkKLQkJcmV0dXJuIHByb3BzOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BOYW1lKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzIHByb3BzID0gcmVnaXN0ZXJlZE1hcC5nZXQoZSk7Ci0JCWlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnByb3BOYW1lUmVnaXN0ZXJlZChwcm9wTmFtZSkpIHsKLQkJCXJldHVybiBwcm9wcy5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7Ci0JCX0gCQkJCi0JCXJldHVybiBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoZSwgcHJvcE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydGllcyBwcm9wcyA9IHJlZ2lzdGVyZWRNYXAuZ2V0KGUpOwotCQlpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy5wcm9wTmFtZVJlZ2lzdGVyZWQocHJvcE5hbWUpKSB7Ci0JCQlwcm9wcy5zZXRQcm9wZXJ0eShwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5zZXRQcm9wZXJ0eShlLCBwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ2hhbmdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2hhbmdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hhbmdlRXZlbnRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZShDaGFuZ2VFdmVudCBldmVudCkgewotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDaGFuZ2VFdmVudCB7Ci0JCXB1YmxpYyBTdHJpbmcgcHJvcE5hbWU7Ci0JCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcEVsZW1lbnQ7Ci0JCXB1YmxpYyBTdHJpbmcgb2xkVmFsdWU7Ci0JCXB1YmxpYyBTdHJpbmcgbmV3VmFsdWU7Ci0JCXB1YmxpYyBDaGFuZ2VFdmVudChTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBvbGRWYWx1ZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCQl0aGlzLnByb3BFbGVtZW50ID0gcHJvcEVsZW1lbnQ7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJcHVibGljIENoYW5nZUV2ZW50KE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wRWxlbWVudCwgU3RyaW5nIG9sZFZhbHVlLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJCXRoaXMocHJvcEVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiBwcm9wRWxlbWVudC5nZXROYW1lKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl0aGlzLnByb3BFbGVtZW50ID0gcHJvcEVsZW1lbnQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YWExZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIENsYXNzIHdpdGggc3RhdGljIHV0aWxpdHkgbWV0aG9kcyBmb3IgcXVlcnlpbmcgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50VXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gbWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZE1vZGVsKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBvYmopOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBtb2RlbHMgYXMgc3BlY2lmaWVkLi4gMS4gTWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QgMi4KLQkgKiBSZWZlcmVuY2VkIG1vZGVscyBvZiB0aGUgbWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QgKGUuZy4gcmVmZXJlbmNlCi0JICogcmVsYXRpb25zaGlwKQotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbE1vZGVscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgYWxsTW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGdldCBtZXRob2QgbW9kZWwgb2YgdGhlIG9iamVjdAotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBnZXRNZXRob2RNb2RlbChvYmplY3QpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0KLQkJCS8vIGdldCBhbGwgYmFzZSBtb2RlbHMKLQkJCS8vCi0JCQlNaXNjLmdldEFsbEJhc2UobW9kZWwsIGFsbE1vZGVscyk7Ci0KLQkJCWFsbE1vZGVscy5hZGQobW9kZWwpOwotCi0JCX0KLQotCQlyZXR1cm4gYWxsTW9kZWxzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcmVmZXJlbmNlcyBndWlkYW5jZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZWxlY3RlZEd1aWRhbmNlcyhFT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3QgcmVmZXJlbmNlcyA9ICgoRU9iamVjdCkgb2JqZWN0KS5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgcmVmZXJlbmNlcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJaXRlbUxpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaXRlbUxpc3QKLQkJCQkuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFByYWN0aWNlcygoQ29udGVudEVsZW1lbnQpIG9iamVjdCkpOwotCi0JCXJldHVybiBpdGVtTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBlbGVtZW50cy4gVGhlIG1hcCBoYXMgZ3VpZHMgYXMga2V5cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gYnVpbGRNYXAoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PigpOwotCQkKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCW1hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbWFwOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NaXNjLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2I4MmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NaXNjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogTWFueSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgaGFkIGJlZW4gbW92ZWQgdG8gb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWwKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1pc2MgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFdvcmtQcm9kdWN0cyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJbGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCWdldEFsbFdvcmtQcm9kdWN0cygoQ29udGVudFBhY2thZ2UpIG9iaiwgbGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsV29ya1Byb2R1Y3RzKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbFdvcmtQcm9kdWN0cyhwa2csIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbFRhc2tzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJCWxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBwYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlnZXRBbGxUYXNrcygoQ29udGVudFBhY2thZ2UpIG9iaiwgbGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsVGFza3MoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsVGFza3MocGtnLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFVuY2F0ZWdvcml6ZWRUYXNrcyhDb250ZW50UGFja2FnZSBwa2cpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxVbmNhdGVnb3JpemVkVGFza3MocGtnLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxVbmNhdGVnb3JpemVkVGFza3MoQ29udGVudFBhY2thZ2UgcGtnLCBMaXN0IGxpc3QpIHsKLQkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrCi0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKChUYXNrKSBvYmopLmlzRW1wdHkoKSkgewotCQkJCWxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBwYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlnZXRBbGxVbmNhdGVnb3JpemVkVGFza3MoKENvbnRlbnRQYWNrYWdlKSBvYmosIGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihOYW1lZEVsZW1lbnQgZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZChTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkpOwotCQlmb3IgKGUgPSAoTmFtZWRFbGVtZW50KSAoKEVPYmplY3QpIGUpLmVDb250YWluZXIoKTsgZSAhPSBudWxsCi0JCQkJJiYgZSAhPSBwbHVnaW47IGUgPSAoTmFtZWRFbGVtZW50KSAoKEVPYmplY3QpIGUpLmVDb250YWluZXIoKSkgewotCQkJbGlzdC5hZGQoMCwgU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpKTsKLQkJfQotCQlTdHJpbmdbXSBwYXRoID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShwYXRoKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxOYW1lZEVsZW1lbnQ+IGdldE9iamVjdFRyZWVSZWxhdGl2ZVRvUGx1Z2luKE5hbWVkRWxlbWVudCBlKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJQXJyYXlMaXN0PE5hbWVkRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZWRFbGVtZW50PigpOwotCQlsaXN0LmFkZChlKTsKLQkJZm9yIChlID0gKE5hbWVkRWxlbWVudCllLmVDb250YWluZXIoKTsgZSAhPSBudWxsCi0JCQkJJiYgZSAhPSBwbHVnaW47IGUgPSAoTmFtZWRFbGVtZW50KWUuZUNvbnRhaW5lcigpKSB7Ci0JCQlsaXN0LmFkZCgwLCBlKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGhSZWxhdGl2ZVRvTGlicmFyeShOYW1lZEVsZW1lbnQgZSkgewotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKQotCQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoZS5nZXROYW1lKCkpOwotCQlTdHJpbmdbXSBhcnIgPSBnZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKLQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKGFycltpXSk7Ci0JCX0KLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBiYXNlIHBsdWdpbnMgb2YgdGhlIGdpdmVuIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbEJhc2UoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbEJhc2UocGx1Z2luLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbEJhc2UoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgYmFzZSA9IHBsdWdpbi5nZXRCYXNlcygpOwotCi0JCS8vIENoZWNrIGlmIHRoZSBiYXNlcyBpbiB0aGUgbGlzdCBhbHJlYWR5LgotCQlpZiAoIWxpc3QuY29udGFpbnNBbGwoYmFzZSkpIHsKLQkJCWxpc3QuYWRkQWxsKGJhc2UpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZS5zaXplKCk7IGkrKykgewotCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgYmFzZS5nZXQoaSk7Ci0JCQlnZXRBbGxCYXNlKHBsdWdpbiwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCYXNlT2YoTWV0aG9kUGx1Z2luIGJhc2UsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJfQotCQlMaXN0IGJhc2VzID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCWludCBzaXplID0gYmFzZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGJhc2UgPT0gYmFzZXMuZ2V0KGkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaXNCYXNlT2YoYmFzZSwgKE1ldGhvZFBsdWdpbikgYmFzZXMuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Nb2RlbFN0cnVjdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2EzNTkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Nb2RlbFN0cnVjdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGludGVybmFsIHN0cnVjdHVyZSBvZiBhIG1ldGhvZCBwbHVnaW4gd2l0aCBwcmVkZWZpbmVkIHBhY2thZ2VzCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxTdHJ1Y3R1cmUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNb2RlbFN0cnVjdHVyZSBERUZBVUxUID0gbmV3IE1vZGVsU3RydWN0dXJlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISURERU5fUEFDS0FHRV9OQU1FID0gIkhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BBQ0tBR0VfTkFNRSA9ICJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfQ09OVEVOVF9QQUNBS0dFX05BTUUgPSAiQ29yZUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JJRVMgPSAiQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX1NFVF9QQUNLQUdFX05BTUUgPSAiUm9sZVNldHMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORV9QQUNLQUdFX05BTUUgPSAiRGlzY2lwbGluZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JZX1BBQ0tBR0VfTkFNRSA9ICJDdXN0b21DYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DT1JFX0NPTlRFTlRfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENPUkVfQ09OVEVOVF9QQUNBS0dFX05BTUUgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUk9MRV9TRVRfUEFDS0FHRV9QQVRIID0gewotCQlDT05URU5UX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUklFUywgIFJPTEVfU0VUX1BBQ0tBR0VfTkFNRX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRElTQ0lQTElORV9ERUZfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsIERJU0NJUExJTkVfUEFDS0FHRV9OQU1FIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1RPT0xfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJUb29scyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9TVEFOREFSRF9DQVRFR09SWV9QQVRIID0gewotCQlDT05URU5UX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUklFUywgIlN0YW5kYXJkQ2F0ZWdvcmllcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9ERUxJVkVSWV9QUk9DRVNTX1BBVEggPSB7ICJEZWxpdmVyeVByb2Nlc3NlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsICJDYXBhYmlsaXR5UGF0dGVybnMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9ET01BSU5fUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJEb21haW5zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfV09SS19QUk9EVUNUX1RZUEVfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJXUCBUeXBlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIID0gewotCQlDT05URU5UX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUklFUywgIENVU1RPTV9DQVRFR09SWV9QQUNLQUdFX05BTUV9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9FU1RJTUFUSU5HX01PREVMU19QQVRIID0gewotCQlDT05URU5UX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUklFUywgIkVzdGltYXRpbmdNb2RlbHMiIH07IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9QUk9DRVNTX0NPTlRSSUJVVElPTl9QQVRIID0geyAiUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9QQVRIID0geyAiUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVzIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQUxMX1BSRURFRklORURfUEFUSFMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIFN0cmluZ1tdIGNvcmVDb250ZW50UGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSByb2xlU2V0UGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBkaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZG9tYWluUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSB0b29sUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBjYXBhYmlsaXR5UGF0dGVyblBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSB3b3JrUHJvZHVjdFR5cGVQYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIHByb2Nlc3NDb250cmlidXRpb25QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGN1c3RvbUNhdGVnb3J5UGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBlc3RpbWF0aW5nTW9kZWxQYXRoOwotCQotCXB1YmxpYyBTdHJpbmdbXSBzdGFuZGFyZENhdGVnb3J5UGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGg7Ci0KLQkvKioKLQkgKiB0aGlzIGlzIHRoZSBtZXRob2QgdG8gcmV0dXJuIGFsbCB0aGUgc3lzdGVtIGRlZmluZWQgcGFja2FnZSBwYXRoIFBsZWFzZQotCSAqIGFkZCB0aGlzIHRoaXMgYXJyYXkgd2hlbiBldmVyIHlvdSBoYXZlIG5ldyBzeXN0ZW0gcGFja2FnZXMgZGVmaW5lZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW11bXSBnZXRBbGxTeXN0ZW1QYXRocygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXVtdIHsgY29yZUNvbnRlbnRQYXRoLCByb2xlU2V0UGF0aCwKLQkJCQlkaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsIGRvbWFpblBhdGgsIHRvb2xQYXRoLAotCQkJCWNhcGFiaWxpdHlQYXR0ZXJuUGF0aCwgZGVsaXZlcnlQcm9jZXNzUGF0aCwKLQkJCQl3b3JrUHJvZHVjdFR5cGVQYXRoLCBwcm9jZXNzQ29udHJpYnV0aW9uUGF0aCwKLQkJCQljdXN0b21DYXRlZ29yeVBhdGgsIHN0YW5kYXJkQ2F0ZWdvcnlQYXRoLAotCQkJCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aCwgfTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW11bXSBnZXRDYXRlZ29yeVBhdGhzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdW10geyByb2xlU2V0UGF0aCwgZGlzY2lwbGluZURlZmluaXRpb25QYXRoLAotCQkJCWRvbWFpblBhdGgsIHRvb2xQYXRoLCB3b3JrUHJvZHVjdFR5cGVQYXRoLAotCQkJCXN0YW5kYXJkQ2F0ZWdvcnlQYXRoLCBjdXN0b21DYXRlZ29yeVBhdGgsIH07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9MaW5lcyhTdHJpbmdbXSBwYXRoKSB7Ci0JCVN0cmluZ0J1ZmZlciBsaW5lcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG1heCA9IHBhdGgubGVuZ3RoIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJbGluZXMuYXBwZW5kKHBhdGhbaV0pLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlsaW5lcy5hcHBlbmQocGF0aFttYXhdKTsKLQkJcmV0dXJuIGxpbmVzLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9GaWxlUGF0aChTdHJpbmdbXSBwYXRoKSB7Ci0JCVN0cmluZ0J1ZmZlciBsaW5lcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG1heCA9IHBhdGgubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlsaW5lcy5hcHBlbmQocGF0aFtpXSkuYXBwZW5kKCcvJyk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVzLnRvU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIHsKLQkJREVGQVVMVC5jb3JlQ29udGVudFBhdGggPSBERUZBVUxUX0NPUkVfQ09OVEVOVF9QQVRIOwotCQlERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCA9IERFRkFVTFRfRElTQ0lQTElORV9ERUZfUEFUSDsKLQkJREVGQVVMVC5yb2xlU2V0UGF0aCA9IERFRkFVTFRfUk9MRV9TRVRfUEFDS0FHRV9QQVRIOwotCQlERUZBVUxULmRvbWFpblBhdGggPSBERUZBVUxUX0RPTUFJTl9QQVRIOwotCQlERUZBVUxULnRvb2xQYXRoID0gREVGQVVMVF9UT09MX1BBVEg7Ci0JCURFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoID0gREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoID0gREVGQVVMVF9ERUxJVkVSWV9QUk9DRVNTX1BBVEg7Ci0JCURFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCA9IERFRkFVTFRfV09SS19QUk9EVUNUX1RZUEVfUEFUSDsKLQkJREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCA9IERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSDsKLQkJREVGQVVMVC5zdGFuZGFyZENhdGVnb3J5UGF0aCA9IERFRkFVTFRfU1RBTkRBUkRfQ0FURUdPUllfUEFUSDsKLQkJREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGggPSBERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIOwotCQlERUZBVUxULmVzdGltYXRpbmdNb2RlbFBhdGggPSBERUZBVUxUX0VTVElNQVRJTkdfTU9ERUxTX1BBVEg7Ci0JCURFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoID0gREVGQVVMVF9QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX1BBVEg7Ci0KLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jb3JlQ29udGVudFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5yb2xlU2V0UGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmRvbWFpblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC50b29sUGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5zdGFuZGFyZENhdGVnb3J5UGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmVzdGltYXRpbmdNb2RlbFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMKLQkJCQkuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5wcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NDb250cmlidXRpb25QYWNrYWdlKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQkvLyBib29sZWFuIG9sZCA9IHBsdWdpbi5lRGVsaXZlcigpOwotCQl0cnkgewotCQkJLy8gY3JlYXRlIFByb2Nlc3NDb250cmlidXRpb25zIHByb2Nlc3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlwa2cuc2V0TmFtZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoWzBdKTsKLQotCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24KLQkJCS8vCi0JCQlwbHVnaW4uZVNldERlbGl2ZXIoZmFsc2UpOwotCi0JCQlwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJCXJldHVybiBwa2c7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIG9yaWdpbmFsIG5vdGlmYWN0aW9uIHNldHRpbmcKLQkJCS8vCi0JCQlwbHVnaW4uZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGFja2FnZSgKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJLy8gYm9vbGVhbiBvbGQgPSBwbHVnaW4uZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZXMgcHJvY2VzcyBwYWNrYWdlCi0JCQkvLwotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCXBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoWzBdKTsKLQotCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24KLQkJCS8vCi0JCQlwbHVnaW4uZVNldERlbGl2ZXIoZmFsc2UpOwotCi0JCQlwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJCXJldHVybiBwa2c7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIG9yaWdpbmFsIG5vdGlmYWN0aW9uIHNldHRpbmcKLQkJCS8vCi0JCQlwbHVnaW4uZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QbHVnaW5VSVBhY2thZ2VzTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUGx1Z2luVUlQYWNrYWdlc01hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM4NmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QbHVnaW5VSVBhY2thZ2VzTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogSG9sZHMgYSBtYXAgb2YgUGx1Z2luIFBhY2thZ2UgbmFtZXMgdG8gdGhlIGxpc3Qgb2YgcGx1Z2lucyBjb250YWluZWQgYnkgdGhlbQotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luVUlQYWNrYWdlc01hcCBleHRlbmRzIEhhc2hNYXA8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgzMjEzNzkwMTU4NzAwOTAyNTZMOwotCi0JcHVibGljIFBsdWdpblVJUGFja2FnZXNNYXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgcGFja2FnZU5hbWUsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJU2V0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucyA9IGdldChwYWNrYWdlTmFtZSk7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpIHsKLQkJCXBsdWdpbnMgPSBuZXcgSGFzaFNldDxNZXRob2RQbHVnaW4+KCk7Ci0JCX0KLQkJcGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJcHV0KHBhY2thZ2VOYW1lLCBwbHVnaW5zKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJlZGVjZXNzb3JMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJlZGVjZXNzb3JMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZGI3NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1ByZWRlY2Vzc29yTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVkZWNlc3NvciBsaXN0IG9mIGFuIGl0ZW0gcHJvdmlkZXIgZm9yIGEgd29yawotICogYnJlYWtkb3duIGVsZW1lbnQuIEl0IGNhbGN1bGF0ZXMgdGhlIHByZWRlY2Vzc29ycyBiYXNlZCBvbiB0aGUgY3VycmVudGx5Ci0gKiBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFuZCBhY2NvcmRpbmcgdG8gdmFyaWFiaWxpdHkgcnVsZXMuIEl0IGNhbiByZWZyZXNoCi0gKiBpdHNlbGYgdXBvbiBjaGFuZ2UgaW4gcHJlZGVjZXNzb3IgbGlzdCBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JMaXN0IGV4dGVuZHMgQXJyYXlMaXN0PE9iamVjdD4gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzYxNzg1MzA5MjU3MDQxMjA4Mkw7CQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fU1RBUlQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX0ZJTklTSF9UT19TVEFSVDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX0ZJTklTSF9UT19GSU5JU0g7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19TVEFSVCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLldvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fU1RBUlRfVE9fU1RBUlQ7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19GSU5JU0ggPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX0ZJTklTSDsgCi0JcHJpdmF0ZSBNYXAgbWFwNExpbmtUeXBlID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGVjZXNzb3JMaXN0IEVNUFRZX0xJU1QgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KCkgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzkwNDY3NjA5ODIxNzA5NzAxNkw7Ci0KLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbiBjKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIGphdmEudXRpbC5Db2xsZWN0aW9uIGMpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXJlZnJlc2goKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBPYmplY3QgdG9wOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQllLmVBZGFwdGVycygpLmFkZCgwLCBsaXN0ZW5lcik7Ci0JCWlmICghbWFwNExpbmtUeXBlLmlzRW1wdHkoKSkKLQkJCW1hcDRMaW5rVHlwZS5jbGVhcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCSgoRU9iamVjdCkgZSkuZUFkYXB0ZXJzKCkucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCQljbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJpZ2h0IHRvcCBpdGVtIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRyZWUgdG8gc2VhcmNoIGZvcgotCSAqIGl0ZW0gcHJvdmlkZXJzIG9mIHByZWRlY2Vzc29ycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlpZiAoaXRlbVByb3ZpZGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCS8vIHRoaXMgcmVwcmVzZW50cyBhbiBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnQKLQkJCQkvLwotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQotCQkJCU9iamVjdCB0b3AgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJZm9yIChPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQlCcmVha2Rvd25FbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCQkJCS51bndyYXAocGFyZW50KTsKLQkJCQkJUHJvY2VzcyBwYXJlbnRQcm9jID0gVG5nVXRpbAotCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKHBhcmVudEVsZW1lbnQpOwotCQkJCQlpZiAocGFyZW50UHJvYyAhPSBwcm9jKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCQlwYXJlbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50KQotCQkJCQkJCQkuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJb2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVwdGhMZXZlbEl0ZW1Qcm92aWRlciB7Ci0JCXByaXZhdGUgaW50IGRlcHRoTGV2ZWw7Ci0JCXByaXZhdGUgT2JqZWN0IGl0ZW1Qcm92aWRlcjsKLQkJcHJpdmF0ZSBPYmplY3Qgb2JqZWN0OwotCQlwcml2YXRlIE9iamVjdCBlbGVtZW50OwotCQkKLQkJcHJpdmF0ZSBEZXB0aExldmVsSXRlbVByb3ZpZGVyKE9iamVjdCBvYmplY3QsIGludCBkZXB0aExldmVsLCBPYmplY3QgaXRlbVByb3ZpZGVyLCBPYmplY3QgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdGhpcy5kZXB0aExldmVsID0gZGVwdGhMZXZlbDsKLQkJCXRoaXMuaXRlbVByb3ZpZGVyID0gaXRlbVByb3ZpZGVyOwotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJfQkKLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0SXRlbVByb3ZpZGVyKCkgewotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlcjsKLQkJfQotCX0KLQkKLQlzdGF0aWMgTGlzdDxEZXB0aExldmVsSXRlbVByb3ZpZGVyPiBjcmVhdGVJdGVtUHJvdmlkZXJMaXN0KE9iamVjdCB0b3AsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUxpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4oKTsKLQkJRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBEZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PigKLQkJCQlhZGFwdGVyRmFjdG9yeSwgdG9wKSB7Ci0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPE9iamVjdD4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAobyk7IAotCQkJCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKS5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG8pOwotCQkJCQl9CQkJCi0JCX07Ci0JCWZvcig7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJaW50IGRlcHRoTGV2ZWwgPSBpdGVyLmdldERlcHRoTGV2ZWwoKTsKLQkJCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWxpc3QuYWRkKG5ldyBEZXB0aExldmVsSXRlbVByb3ZpZGVyKG9iamVjdCwgZGVwdGhMZXZlbCwgaXRlbVByb3ZpZGVyLCBlbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlRWxlbWVudFRvSXRlbVByb3ZpZGVyc01hcChNYXA8T2JqZWN0LCBDb2xsZWN0aW9uPE9iamVjdD4+IG1hcCwgT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBpdGVtUHJvdmlkZXIpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGl0ZW1Qcm92aWRlcnMgPSBtYXAuZ2V0KGVsZW1lbnQpOwotCQlpZihpdGVtUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCW1hcC5wdXQoZWxlbWVudCwgaXRlbVByb3ZpZGVycyk7Ci0JCX0KLQkJaXRlbVByb3ZpZGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQlpdGVtUHJvdmlkZXJzID0gbWFwLmdldCh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCWlmKGl0ZW1Qcm92aWRlcnMgPT0gbnVsbCkgewotCQkJCQlpdGVtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJCW1hcC5wdXQodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBpdGVtUHJvdmlkZXJzKTsKLQkJCQl9Ci0JCQkJaXRlbVByb3ZpZGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlNYXA8PywgQ29sbGVjdGlvbjxPYmplY3Q+PiBjcmVhdGVCcmVha2Rvd25FbGVtZW50VG9JdGVtUHJvdmlkZXJNYXAoTGlzdDxEZXB0aExldmVsSXRlbVByb3ZpZGVyPiBsaXN0KSB7Ci0JCU9iamVjdCB0b3AgPSBnZXRUb3BJdGVtKCk7Ci0JCS8vIGZpbmQgdG9wJ3MgaXRlbSBwcm92aWRlcgotCQkvLwotCQlEZXB0aExldmVsSXRlbVByb3ZpZGVyIHRvcElwID0gbnVsbDsKLQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQlmb3IgKERlcHRoTGV2ZWxJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyIDogbGlzdCkgewotCQkJaWYoaXRlbVByb3ZpZGVyLm9iamVjdCA9PSB0b3ApIHsKLQkJCQl0b3BJcCA9IGl0ZW1Qcm92aWRlcjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0SW5kZXgrKzsKLQkJCX0KLQkJfQotCQlhc3NlcnQgdG9wSXAgIT0gbnVsbCA6ICJDb3VsZCBub3QgZmluZCBpdGVtIHByb3ZpZGVyIG9mIHRvcCBvYmplY3QgaW4gdGhlIGdpdmVuIGl0ZW0gcHJvdmlkZXIgbGlzdC4iOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmQgdGhlIGluZGV4IG9mIGxhc3QgaXRlbSBwcm92aWRlciBpbiB0aGUgc3VidHJlZSBvZiB0b3AKLQkJLy8KLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaW50IGxhc3RJbmRleCA9IHN0YXJ0SW5kZXggKyAxOwotCQlmb3IgKDsgbGFzdEluZGV4IDwgc2l6ZSAmJiBsaXN0LmdldChsYXN0SW5kZXgpLmRlcHRoTGV2ZWwgPiB0b3BJcC5kZXB0aExldmVsOyBsYXN0SW5kZXgrKyk7CQkKLQkJCQotCQkvLyBjb3B5IHRoZSB0cmVlIHRvIGEgbWFwIG9mIGJyZWFrZG93biBlbGVtZW50IC8gaXRlbSBwcm92aWRlciBmb3IKLQkJLy8gcmV1c2UKLQkJLy8KLQkJSGFzaE1hcDxPYmplY3QsIENvbGxlY3Rpb248T2JqZWN0Pj4gbWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBDb2xsZWN0aW9uPE9iamVjdD4+KCk7Ci0JCWZvciAoRGVwdGhMZXZlbEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgOiBsaXN0LnN1Ykxpc3Qoc3RhcnRJbmRleCwgbGFzdEluZGV4KSkgewotCQkJdXBkYXRlRWxlbWVudFRvSXRlbVByb3ZpZGVyc01hcChtYXAsIGl0ZW1Qcm92aWRlci5lbGVtZW50LCBpdGVtUHJvdmlkZXIuaXRlbVByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQkKLQlzdGF0aWMgTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PiBjcmVhdGVCcmVha2Rvd25FbGVtZW50VG9JdGVtUHJvdmlkZXJNYXAoT2JqZWN0IHRvcCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oCi0JCQkJYWRhcHRlckZhY3RvcnksIHRvcCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvKTsgCi0JCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG8pOwotCQkJfQkJCQotCQl9OwotCQkKLQkJLy8gY29weSB0aGUgdHJlZSB0byBhIG1hcCBvZiBicmVha2Rvd24gZWxlbWVudCAvIGl0ZW0gcHJvdmlkZXIgZm9yCi0JCS8vIHJldXNlCi0JCS8vCi0JCUhhc2hNYXA8T2JqZWN0LCBDb2xsZWN0aW9uPE9iamVjdD4+IG1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBiZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlpZihiZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGlwID0gKElCU0l0ZW1Qcm92aWRlcikgKG9iaiBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlciA/IG9iaiA6Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKSk7Ci0JCQkJdXBkYXRlRWxlbWVudFRvSXRlbVByb3ZpZGVyc01hcChtYXAsIGJlLCBpcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCU9iamVjdCB1bndyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAodW53cmFwcGVkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZDsKLQkJCUxpc3Qgd29ya09yZGVycyA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCWlmICh3b3JrT3JkZXJzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQl0b3AgPSBnZXRUb3BJdGVtKCk7CQotCQkJaW5pdGlhbGl6ZShjcmVhdGVCcmVha2Rvd25FbGVtZW50VG9JdGVtUHJvdmlkZXJNYXAodG9wLCBhZGFwdGVyRmFjdG9yeSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKE1hcDw/LCBDb2xsZWN0aW9uPE9iamVjdD4+IG1hcCkgewotCi0JCWlmIChUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkJLnVud3JhcChvYmplY3QpOwotCQkJTGlzdCB3b3JrT3JkZXJzID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQkJaWYgKHdvcmtPcmRlcnMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHRvcEVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHRvcCk7Ci0JCQlTdHJpbmcgdG9wR1VJRCA9IHRvcEVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCi0JCQlpbnQgbiA9IHdvcmtPcmRlcnMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgd29ya09yZGVycy5nZXQoaSk7CQkJCQkKLQotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKHdvcmtPcmRlci5nZXRMaW5rVHlwZSgpLmdldExpdGVyYWwoKSk7Ci0KLQkJCQlCcmVha2Rvd25FbGVtZW50IHByZWQgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBpdGVtUHJvdmlkZXJzID0gbWFwLmdldChwcmVkKTsKLQkJCQlpZihpdGVtUHJvdmlkZXJzICE9IG51bGwgJiYgIWl0ZW1Qcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KHdvcmtPcmRlciwgCi0JCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLldPUktfT1JERVJfX1BSRURFQ0VTU09SX1BST0NFU1NfUEFUSCk7Ci0JCQkJCWlmKHByb3AgPT0gbnVsbCkgewotCQkJCQkJLy8gcHJlZGVjZXNzb3IgaXMgbG9jYWwgb3IgV29ya09yZGVyIGlzIGNyZWF0ZWQgYmVmb3JlIHN1cHBvcnQgZm9yICdncmVlbicgcHJlZGVjZXNzb3IKLQkJCQkJCS8vIGJ5IHNhdmluZyBpdHMgcHJvY2VzcyBwYXRoIGluIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvZiB0aGUgd29yayBvcmRlcgotCQkJCQkJLy8KLQkJCQkJCWJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVycy5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBwcm9jUGF0aCA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJCQkJCQotCQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBwYXRoIGluIHRoaXMgcHJvY2VzcwotCQkJCQkJLy8JCQkJCQkKLQkJCQkJCWludCBpbmRleDsKLQkJCQkJCVN0cmluZyBndWlkID0gdG9wR1VJRDsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdG9wRWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCA/ICgoVmFyaWFiaWxpdHlFbGVtZW50KXRvcEVsZW1lbnQpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA6IG51bGw7Ci0JCQkJCQlmb3IoaW5kZXggPSBwcm9jUGF0aC5pbmRleE9mKGd1aWQpOyBpbmRleCA9PSAtMSAmJiBiYXNlICE9IG51bGw7IGluZGV4ID0gcHJvY1BhdGguaW5kZXhPZihndWlkKSkgewotCQkJCQkJCWlmKGJhc2UgIT0gbnVsbCkgewotCQkJCQkJCQlndWlkID0gYmFzZS5nZXRHdWlkKCk7IAotCQkJCQkJCQliYXNlID0gYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQlTdHJpbmdCdWZmZXIgc3RyQnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIocHJvY1BhdGguc3Vic3RyaW5nKGluZGV4ICsgZ3VpZC5sZW5ndGgoKSkpOwotCQkJCQkJCU9iamVjdCB0b3BPYmplY3QgPSB0b3A7Ci0JCQkJCQkJZm9yKFdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IHRvcEVsZW1lbnQ7IHdiZSAhPSBudWxsOykgewotCQkJCQkJCQlzdHJCdWZmLmluc2VydCgwLCB3YmUuZ2V0R3VpZCgpKTsKLQkJCQkJCQkJc3RyQnVmZi5pbnNlcnQoMCwgJy8nKTsKLQkJCQkJCQkJaWYodG9wT2JqZWN0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJCXRvcE9iamVjdCA9IHdiZSA9ICgoV29ya0JyZWFrZG93bkVsZW1lbnQpdG9wT2JqZWN0KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXRvcE9iamVjdCA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHRvcE9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQkJCXdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAodG9wT2JqZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlzdHJCdWZmLmluc2VydCgwLCAiOi8iKS5pbnNlcnQoMCwgU3VwcHJlc3Npb24uV0JTKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBwYXRoID0gc3RyQnVmZi50b1N0cmluZygpOwotCQkJCQkJCWZpbmRfd3JhcHBlcjoKLQkJCQkJCQlmb3IgKE9iamVjdCBpdGVtUHJvdmlkZXIgOiBpdGVtUHJvdmlkZXJzKSB7Ci0JCQkJCQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCQlTdHJpbmcgcCA9IFN1cHByZXNzaW9uLmdldFBhdGgoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIpOwotCQkJCQkJCQkJaWYocGF0aC5lcXVhbHMocCkpIHsKLQkJCQkJCQkJCQlic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlcjsKLQkJCQkJCQkJCQlicmVhayBmaW5kX3dyYXBwZXI7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCWFkZChic0l0ZW1Qcm92aWRlcik7Ci0JCQkJCQltYXA0TGlua1R5cGUucHV0KGJzSXRlbVByb3ZpZGVyLmdldElkKCksIHdvcmtPcmRlci5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlzdXBlci5jbGVhcigpOwotCQlpZiAoIW1hcDRMaW5rVHlwZS5pc0VtcHR5KCkpCi0JCQltYXA0TGlua1R5cGUuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKCkgewotCQljbGVhcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCXZvaWQgcmVmcmVzaChMaXN0PERlcHRoTGV2ZWxJdGVtUHJvdmlkZXI+IGxpc3QpIHsKLQkJY2xlYXIoKTsKLQkJaW5pdGlhbGl6ZShjcmVhdGVCcmVha2Rvd25FbGVtZW50VG9JdGVtUHJvdmlkZXJNYXAobGlzdCkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24jdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0b1VuU3VwcHJlc3NlZFN0cmluZyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvVW5TdXBwcmVzc2VkU3RyaW5nKFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyByZW1vdmUgdGhlIGl0ZW0gcHJvdmlkZXJzIG9mIHRoZSBkZWxldGVkIGVsZW1lbnRzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQllID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJCS8vIG9iamVjdCBkZWxldGVkCi0JCQkJCS8vCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBlOwotCQkJCUFjdGl2aXR5IHN1cGVyQWN0ID0gYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJaWYgKHN1cGVyQWN0ID09IG51bGwgJiYgVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKSAhPSBiZSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpc0VtcHR5KCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbiA9IHNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQoaSk7Ci0JCQlpZiAoKHN1cCA9PSBudWxsKSB8fCAhc3VwLmlzU3VwcHJlc3NlZChic0l0ZW1Qcm92aWRlcikpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKGJzSXRlbVByb3ZpZGVyLmdldElkKCkpLmFwcGVuZCgnLCcpOwkJCQkKLQkJCX0KLQkJfQotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQobik7Ci0JCWlmICgoc3VwID09IG51bGwpIHx8ICFzdXAuaXNTdXBwcmVzc2VkKGJzSXRlbVByb3ZpZGVyKSkgewotCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1VuU3VwcHJlc3NlZFN0cmluZyhTdXBwcmVzc2lvbiBzdXAsIGJvb2xlYW4gaXNMaW5rVHlwZVJlcXVpcmVkKSB7Ci0JCS8vIHJlbW92ZSB0aGUgaXRlbSBwcm92aWRlcnMgb2YgdGhlIGRlbGV0ZWQgZWxlbWVudHMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCWUgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpOwotCQkJCWlmIChlID09IG51bGwpIHsKLQkJCQkJLy8gb2JqZWN0IGRlbGV0ZWQKLQkJCQkJLy8KLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCQkJQWN0aXZpdHkgc3VwZXJBY3QgPSBiZS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQlpZiAoc3VwZXJBY3QgPT0gbnVsbCAmJiBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmUpICE9IGJlKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlzRW1wdHkoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBuID0gc2l6ZSgpIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldChpKTsKLQkJCWlmICgoc3VwID09IG51bGwpIHx8ICFzdXAuaXNTdXBwcmVzc2VkKGJzSXRlbVByb3ZpZGVyKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQkgICAgT2JqZWN0IHZhbHVlID0gbWFwNExpbmtUeXBlLmdldChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCSAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBpc0xpbmtUeXBlUmVxdWlyZWQpIHsKLQkJCSAgICAJaW50IHYgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJICAgIAlTdHJpbmcgYWJicmV2ID0gdG9Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uKHYpOwotCQkJICAgIAlpZihhYmJyZXYgIT0gbnVsbCkgewotCQkJICAgIAkJc3RyQnVmLmFwcGVuZChhYmJyZXYpOwotCQkJICAgIAl9Ci0JCQkgICAgfQotCQkJCXN0ckJ1Zi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJfQotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQobik7Ci0JCWlmICgoc3VwID09IG51bGwpIHx8ICFzdXAuaXNTdXBwcmVzc2VkKGJzSXRlbVByb3ZpZGVyKSkgewotCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKG1hcDRMaW5rVHlwZS5nZXQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSkpOwotCQkJT2JqZWN0IHZhbHVlID0gbWFwNExpbmtUeXBlLmdldChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGlzTGlua1R5cGVSZXF1aXJlZCkgewotCQkgICAgCWludCB2ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZS50b1N0cmluZygpKTsKLQkJICAgIAlTdHJpbmcgYWJicmV2ID0gdG9Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uKHYpOwotCQkgICAgCWlmKGFiYnJldiAhPSBudWxsKSB7Ci0JCSAgICAJCXN0ckJ1Zi5hcHBlbmQoYWJicmV2KTsKLQkJICAgIAl9Ci0JCSAgICB9Ci0JCX0KLQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcmVwYXJlVXBkYXRlUHJlZGVjZXNzb3JzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUsCi0JCQlMaXN0PE9iamVjdD4gcHJlZGVjZXNzb3JzLCBMaXN0PFdvcmtPcmRlcj4gYWRkTGlzdCwgTGlzdDxXb3JrT3JkZXI+IHByZWRUb0JlRGVsZXRlZCkgewotCQlXb3JrT3JkZXIgd28gPSBudWxsOwotCQlpbnQgc2l6ZSA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnNpemUoKTsKLQkJCi0JCS8vIHJlbW92ZSBXb3JrT3JkZXJzIGZvciBwcmVkZWNlc3NvcnMgdGhhdCBhcmUgbm90IGluIHByZWRlY2Vzc29yIGxpc3QgYW5kIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIKLQkJLy8KLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlib29sZWFuIG51bGxGaWx0ZXIgPSBmaWx0ZXIgPT0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQl3byA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKChudWxsRmlsdGVyIHx8IGZpbHRlci5hY2NlcHQod28uZ2V0UHJlZCgpKSkpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZmluZF9wcmVkOgkJCQkJCQotCQkJCWZvcihPYmplY3QgcHJlZCA6IHByZWRlY2Vzc29ycykgewotCQkJCQlpZihwcmVkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWlmKHdvLmdldFByZWQoKSA9PSBwcmVkKSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfcHJlZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmKHByZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJaWYoaXNQcmVkZWNlc3NvcigoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHByZWQsIHdvKSkgewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIWZvdW5kKSB7Ci0JCQkJCXByZWRUb0JlRGVsZXRlZC5hZGQod28pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXNpemUgPSBwcmVkZWNlc3NvcnMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHByZWRlY2Vzc29ycy5nZXQoaSk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyID8gb2JqIDogbnVsbCk7Ci0JCQlTdHJpbmcgcHJvY1BhdGggPSBudWxsOwotCQkJZmluZF9wcmVkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd2JlCi0JCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJd28gPSAoV29ya09yZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHdvLmdldFByZWQoKSA9PSBlbGVtZW50KSB7Ci0JCQkJCWlmKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQkJaWYoaXNQcmVkZWNlc3Nvcih3cmFwcGVyLCB3bykpIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gdGhlIHByZWRlY2Vzc29yIGlzIGxvY2FsLCBubyBuZWVkIHRvIGxvb2sgZm9yIHdyYXBwZXIKLQkJCQkJCS8vCi0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7CQkJCQkKLQkJCQl3byA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJCXdvLnNldFByZWQoZWxlbWVudCk7Ci0JCQkJaWYod3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCWlmKHByb2NQYXRoID09IG51bGwpIHsKLQkJCQkJCXByb2NQYXRoID0gU3VwcHJlc3Npb24uZ2V0UGF0aCh3cmFwcGVyKTsKLQkJCQkJfQotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuc2V0UHJvcGVydHkod28sIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5XT1JLX09SREVSX19QUkVERUNFU1NPUl9QUk9DRVNTX1BBVEgsIHByb2NQYXRoKTsKLQkJCQl9Ci0JCQkJYWRkTGlzdC5hZGQod28pOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBQYXJzZXMgYSBjb21tYW5kLXNlcGFyYXRlZCBsaXN0IG9mIHByZWRlY2Vzc29yIGluZGV4ZXMgaW50byBsaXN0cyBvZgotCSAqIHByZWRlY2Vzc29yc3MgdG8gYmUgYWRkZWQgYW5kIGRlbGV0ZWQgZm9yIHVwZGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gd2JlCi0JICogQHBhcmFtIGluZGV4TGlzdAotCSAqICAgICAgICAgICAgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvciBpbmRleGVzCi0JICogQHBhcmFtIGFkZExpc3QKLQkgKiBAcGFyYW0gcHJlZFRvQmVEZWxldGVkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcmVwYXJlVXBkYXRlUHJlZGVjZXNzb3JzKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSwKLQkJCVN0cmluZyBpbmRleExpc3QsIExpc3Q8V29ya09yZGVyPiBhZGRMaXN0LCBMaXN0PFdvcmtPcmRlcj4gcHJlZFRvQmVEZWxldGVkKSB7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh3YmUpOwotCQlMaXN0PE9iamVjdD4gcHJlZGVjZXNzb3JzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWlmIChQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdCh3YmUsIGluZGV4TGlzdCwgYWRhcHRlckZhY3RvcnksCi0JCQkJcHJvY2VzcywgcHJlZGVjZXNzb3JzKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycyhhZGFwdGVyRmFjdG9yeSwgd2JlLCBwcmVkZWNlc3NvcnMsIGFkZExpc3QsIHByZWRUb0JlRGVsZXRlZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbihpbnQgd29ya09yZGVyVHlwZSkgewotCQlzd2l0Y2god29ya09yZGVyVHlwZSkgewotCQljYXNlIFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9WQUxVRToKLQkJCXJldHVybiBGSU5JU0hfVE9fRklOSVNIOwotCQljYXNlIFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIX1ZBTFVFOgotCQkJcmV0dXJuIFNUQVJUX1RPX0ZJTklTSDsKLQkJY2FzZSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUX1ZBTFVFOgotCQkJcmV0dXJuIFNUQVJUX1RPX1NUQVJUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHdyYXBwZXIgaXMgYSBwcmVkZWNlc3NvciBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBXb3JrT3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcGFyYW0gd29ya09yZGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByZWRlY2Vzc29yKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkod29ya09yZGVyLCAKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuV09SS19PUkRFUl9fUFJFREVDRVNTT1JfUFJPQ0VTU19QQVRIKTsKLQkJaWYocHJvcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgcHJvY1BhdGggPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQlTdHJpbmcgcCA9IFN1cHByZXNzaW9uLmdldFBhdGgod3JhcHBlcik7Ci0JCQlyZXR1cm4gcHJvY1BhdGguZXF1YWxzKHApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJvY2Vzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1NTQ2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJvY2Vzc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNvcHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NEZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdC5EZXB0aExldmVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgZGVmaW5lcyBzdGF0aWMgbWV0aG9kcyBmb3IgcHJvY2VzcyBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9jZXNzVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxFQ2xhc3M+IE9CU0VjbGFzc2VzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBXQlNFY2xhc3NlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPEVDbGFzcz4gUEJTRWNsYXNzZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxWYXJpYWJpbGl0eVR5cGU+IGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFZhcmlhYmlsaXR5VHlwZT4gZ2V0RXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzKCkgewotCQlpZiAoZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzID09IG51bGwpIHsKLQkJCWV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9IG5ldyBBcnJheUxpc3Q8VmFyaWFiaWxpdHlUeXBlPigpOwotCQkJZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzCi0JCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzCi0JCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTik7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCS8vIG1pZ2h0IGFsbG93IGVtcHR5IHByZXNlbnRhdGlvbiBuYW1lIGZvciBleHRlbmRlciBvciBjb250cmlidXRvci4gVGhlIGVsZW1lbnQgd2lsbCBpbmhlcml0Ci0JCS8vIHRoZSBwcmVzZW50YXRpb24gbmFtZSBmcm9tIHRoZSBiYXNlIGVsZW1lbnQuIENoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIG9uIHRoZSBpbmhlcml0ZWQgbmFtZQotCQkvLwotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKGlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiYXNlID0gKEJyZWFrZG93bkVsZW1lbnQpICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQluYW1lID0gZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIHsKLQotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFJvb3RQcm9jZXNzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyLCBPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmopOwotCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0Um9vdFByb2Nlc3MoYWRhcHRlckZhY3RvcnksIGFkYXB0ZXIsIHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBnZXRXQlNFY2xhc3NlcygpIHsKLQkJaWYgKFdCU0VjbGFzc2VzID09IG51bGwpIHsKLQkJCVdCU0VjbGFzc2VzID0gbmV3IEhhc2hTZXQ8RUNsYXNzPigpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJfQotCQlyZXR1cm4gV0JTRWNsYXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEVDbGFzcz4gZ2V0T0JTRWNsYXNzZXMoKSB7Ci0JCWlmIChPQlNFY2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlPQlNFY2xhc3NlcyA9IG5ldyBIYXNoU2V0PEVDbGFzcz4oKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCQlPQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKSk7Ci0JCQlPQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpKTsKLQkJfQotCi0JCXJldHVybiBPQlNFY2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBnZXRQQlNFY2xhc3NlcygpIHsKLQkJaWYgKFBCU0VjbGFzc2VzID09IG51bGwpIHsKLQkJCVBCU0VjbGFzc2VzID0gbmV3IEhhc2hTZXQ8RUNsYXNzPigpOwotCQkJUEJTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJCVBCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJCVBCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIFBCU0VjbGFzc2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyLCBPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iaik7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkKLQkJCXJldHVybiB0cnVlOwotCQlMaW5rZWRMaXN0IHNpYmxpbmdzID0gZ2V0U2libGluZ3MoYWRhcHRlckZhY3RvcnksIGl0ZW1Qcm92aWRlciwgb2JqKTsKLQkJaWYgKHNpYmxpbmdzICE9IG51bGwgJiYgIXNpYmxpbmdzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHNpYmxpbmdzLmdldEZpcnN0KCkgPT0gb2JqOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdCBnZXRTaWJsaW5ncyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyLCBPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iaik7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgcGFyZW50SXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAocGFyZW50SXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgTGlua2VkTGlzdChwYXJlbnRJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlua2VkTGlzdCBzaWJsaW5ncyA9IGdldFNpYmxpbmdzKGFkYXB0ZXJGYWN0b3J5LCBpdGVtUHJvdmlkZXIsIG9iaik7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsICYmICFzaWJsaW5ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzaWJsaW5ncy5nZXRMYXN0KCkgPT0gb2JqOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gYWZmZWN0ZWQgYWZ0ZXIgdGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZQotCSAqIGdpdmVuIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWZmZWN0ZWRFbGVtZW50cyhOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJTGlzdCBhZmZlY3RlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQlPYmplY3Qgb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQob2JqKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChvYmopOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG9iaikuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGFmZmVjdGVkRWxlbWVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmcmVzaFJlcXVpcmVkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCU9iamVjdCBvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBvYmopLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9Db250YWluZXIoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIpIHsKLQkJYWRkVG9Db250YWluZXIoZSwgaXRlbVByb3ZpZGVyLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBCcmVha2Rvd25FbGVtZW50IHRvIGEgbmV3IGNvbnRhaW5lciBpZiBpdCBkb2VzIG5vdCBoYXZlCi0JICogb25lIG9yIG1vdmVzIGl0IHRvIHRoZSByaWdodCBjb250YWluZXIgaWYgcmVxdWVzdGVkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0NvbnRhaW5lcihCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgYm9vbGVhbiBtb3ZlKSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IG51bGw7Ci0JCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGUpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKEVPYmplY3QpIHBhcmVudCkuZUNvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGtnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZTsKLQkJCWlmIChhY3QuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkvLyBjcmVhdGUgbmV3IFByb2Nlc3NQYWNrYWdlIGZvciB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCVByb2Nlc3NQYWNrYWdlIG5ld1BrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQluZXdQa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChuZXdQa2cpOwotCQkJCW5ld1BrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZSk7Ci0JCQl9IGVsc2UgaWYgKG1vdmUpIHsKLQkJCQkvLyBDaGVjayBpZiB0aGUgYWN0aXZpdHkncyBQcm9jZXNzUGFja2FnZSBpcyBhdCB0aGUgcmlnaHQgcGxhY2UuCi0JCQkJLy8gSWYgbm90LCBtb3ZlIGl0IHRvIHRoZSByaWdodCBQcm9jZXNzQ29tcG9uZW50LgotCQkJCS8vCi0JCQkJUHJvY2Vzc1BhY2thZ2Ugb2xkUGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpOwotCQkJCWlmIChvbGRQa2cuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChvbGRQa2cpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChlLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChlKTsKLQkJCX0gZWxzZSBpZiAobW92ZSAmJiBlLmVDb250YWluZXIoKSAhPSBwa2cpIHsKLQkJCQkvLyBtb3ZlIHRvIG5ldyBQcm9jZXNzUGFja2FnZQotCQkJCS8vCi0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IGNoaWxkLCBPYmplY3QgcGFyZW50LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudChwYXJlbnQpOwotCQl9IAotLy8JCWVsc2UgewotLy8JCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJLnByaW50bG4oTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50ICsgY2hpbGQpOyAvLyROT04tTkxTLTEkCi0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbihMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlciArIGFkYXB0ZXIpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgUm9sZURlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKFJvbGUgcm9sZSkgewotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCk7Ci0JCXJvbGVEZXNjLnNldFJvbGUocm9sZSk7Ci0JCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gcm9sZS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCXJvbGVEZXNjLnNldE5hbWUocm9sZS5nZXROYW1lKCkpOwotCQlyb2xlRGVzYy5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lKSA/IHJvbGUKLQkJCQkuZ2V0TmFtZSgpIDogcHJlc2VudGF0aW9uTmFtZSk7Ci0JCS8vIHJvbGVEZXNjLnNldEJyaWVmRGVzY3JpcHRpb24ocm9sZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gcm9sZURlc2M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJV29ya1Byb2R1Y3Qgd3ApIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQl3cERlc2Muc2V0V29ya1Byb2R1Y3Qod3ApOwotCQl3cERlc2Muc2V0TmFtZSh3cC5nZXROYW1lKCkpOwotCQl3cERlc2MKLQkJCQkuc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsod3AuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSA/IHdwCi0JCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQk6IHdwLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCS8vIHdwRGVzYy5zZXRCcmllZkRlc2NyaXB0aW9uKHdwLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCXJldHVybiB3cERlc2M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlZnJlc2hOZWVkZWQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlcikgewotCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucmVmcmVzaE5lZWRlZChhZGFwdGVyRmFjdG9yeSwgaXRlbVByb3ZpZGVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJTGlzdDxEZXB0aExldmVsSXRlbVByb3ZpZGVyPiBsaXN0ID0gUHJlZGVjZXNzb3JMaXN0LmNyZWF0ZUl0ZW1Qcm92aWRlckxpc3QocHJvYywgZmFjdG9yeSk7Ci0JCWZvciAoRGVwdGhMZXZlbEl0ZW1Qcm92aWRlciBpcCA6IGxpc3QpIHsKLQkJCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBpcC5nZXRJdGVtUHJvdmlkZXIoKTsKLQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCVByZWRlY2Vzc29yTGlzdCBwcmVkTGlzdCA9ICgoSUJTSXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCQkJaWYocHJlZExpc3QgIT0gbnVsbCkgewotCQkJCQlwcmVkTGlzdC5yZWZyZXNoKGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIElEcyBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUgdmlldyBvZiB0aGUgZ2l2ZW4gcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyIGZhY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB2aWV3IChXQlMsIFRCUywgV1BCUywKLQkgKiAgICAgICAgICAgIENCUykKLQkgKiBAcGFyYW0gcHJvYwotCSAqICAgICAgICAgICAgbXVzdCBiZSByZWZyZXNoZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oCi0JCQkJZmFjdG9yeSwgcHJvYykgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvKTsgCi0JCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG8pOwotCQkJfQkJCQotCQl9OwotCi0JCU9iamVjdCBvYmo7Ci0JCWZvciAoaW50IGlkID0gMDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBhZGFwdGVyID0gZmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCQkJJiYgVG5nVXRpbC51bndyYXAob2JqKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRJZChpZCsrKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFZpZXdlcihBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucmVmcmVzaFZpZXdlcihmYWN0b3J5LCBwcm9jKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGVsZW1lbnQgSURzIGluIHRob3NlIHZpZXdlcnMgdGhhdCByZXF1aXJlIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hJRHNJblZpZXdlcnMoZmluYWwgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJlZnJlc2hJRHNJblZpZXdlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hBbGxWaWV3ZXJzKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5yZWZyZXNoQWxsVmlld2VycyhhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hvc2UgcHJlZGVjZXNzb3IgbGlzdCB0byBiZSBjaGVja2VkLgotCSAqIEBwYXJhbSBwcmVkSWRMaXN0Ci0JICogICAgICAgICAgICBhIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzIChJbnRlZ2VyKSBhcyBzaG93biBpbiB0aGUgSUQgY29sdW1uCi0JICogICAgICAgICAgICBvZiB0aGUgZWRpdG9yCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3JzCi0JICogICAgICAgICAgICBvdXRwdXQsIHRoZSBwcmVkZWNlc3NvciBsaXN0Ci0JICogQHJldHVybiBudWxsIGlmIHByZWRMaXN0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUHJlZGVjZXNzb3JMaXN0KFdvcmtCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlMaXN0PEludGVnZXI+IHByZWRJZExpc3QsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgcHJvY2VzcywKLQkJCUxpc3Q8T2JqZWN0PiBwcmVkZWNlc3NvcnMpIHsKLQkJLy8gZ2V0IEJyZWFrZG93bkVsZW1lbnQgbGlzdCBmcm9tIElEIGxpc3QKLQkJLy8KLQkJTGlzdDxPYmplY3Q+IGJlTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlMaXN0PE9iamVjdD4gYWxsRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PihhZGFwdGVyRmFjdG9yeSwKLQkJCQlwcm9jZXNzKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcihpdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlhbGxFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQlpZiAocHJlZElkTGlzdC5jb250YWlucyhpZCkpIHsKLQkJCQliZUxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCQkvLwotCQlpbnQgc2l6ZSA9IGJlTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoYmVMaXN0LmdldChpKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvYmo7Ci0JCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoZSwgcHJlZCwgYWxsRWxlbWVudHMpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50OyAKLQkJCQl9Ci0JCQkJaWYgKFRuZ1V0aWwuaXNTdWJlbGVtZW50T2YocHJlZCwgZSwgYWRhcHRlckZhY3RvcnkpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50OyAKLQkJCQl9Ci0JCQkJaWYgKFRuZ1V0aWwuaXNTdXBlckVsZW1lbnRPZihwcmVkLCBlLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ7IAotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50OyAKLQkJfQotCi0JCWlmIChwcmVkZWNlc3NvcnMgIT0gbnVsbCkKLQkJCXByZWRlY2Vzc29ycy5hZGRBbGwoYmVMaXN0KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSBzdWNjZXNzb3IKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3IKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYWxsIGJyZWFrZG93biBlbGVtZW50cyBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqLwotCSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjZXNzb3IsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkZWNlc3NvciwgTGlzdCBsaXN0KSB7Ci0JCWlmIChzdWNjZXNzb3IgPT0gcHJlZGVjZXNzb3IpIHsKLQkJCWlmIChwcmVkZWNlc3Nvci5nZXRJc1JlcGVhdGFibGUoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHByZWRlY2Vzc29yLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgZWxlbWVudCA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IGVsZW1lbnQuZ2V0UHJlZCgpOwotCQkJaWYgKHByZWQgIT0gcHJlZGVjZXNzb3IgJiYgbGlzdC5jb250YWlucyhwcmVkKSkgewotCQkJCWlmIChjaGVja0NpcmN1bGFyKHN1Y2Nlc3NvciwgcHJlZCwgbGlzdCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxQcmVkZWNlc3Nvckxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsCi0JCQlMaXN0IGxpc3QsIExpc3QgcHJlZExpc3QpIHsKLQkJaWYgKCFwcmVkTGlzdC5jb250YWlucyhwcmVkZWNlc3NvcikpCi0JCQlwcmVkTGlzdC5hZGQocHJlZGVjZXNzb3IpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkZWNlc3Nvci5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIGVsZW1lbnQgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJLmdldFByZWQoKTsKLQkJCWlmIChwcmVkICE9IHByZWRlY2Vzc29yICYmIGxpc3QuY29udGFpbnMocHJlZCkpIHsKLQkJCQlpZiAoIXByZWRMaXN0LmNvbnRhaW5zKHByZWQpKSB7Ci0JCQkJCXByZWRMaXN0LmFkZChwcmVkKTsKLQkJCQkJZ2V0QWxsUHJlZGVjZXNzb3JMaXN0KHByZWQsIGxpc3QsIHByZWRMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGJyZWFrZG93biBlbGVtZW50IHdob3NlIHByZWRlY2Vzc29yIGxpc3QgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gcHJlZExpc3QKLQkgKiAgICAgICAgICAgIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRvcEFjdAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcnMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHByZWRlY2Vzc29yIGxpc3QKLQkgKiBAcGFyYW0gYWxsRWxlbWVudHMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHdob2xlIGJyZWFrZG93biBlbGVtZW50IGxpc3QgaXMgY29waWVkIGludG8gdGhpcwotCSAqICAgICAgICAgICAgbGlzdC4KLQkgKiBAcmV0dXJuIG51bGwgaWYgcHJlZExpc3QgaXMgdmFsaWQuIFRoZSBwcmVkZWNlc3NvciBsaXN0IGlzIHNhdmVkIGluCi0JICogICAgICAgICBwcmVkZWNlc3NvcnMgYW5kIHRoZSB3aG9sZSBicmVha2Rvd24gZWxlbWVudCBsaXN0IGlzIHNhdmVkIGluCi0JICogICAgICAgICBhbGxFbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1ByZWRlY2Vzc29yTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJU3RyaW5nIHByZWRMaXN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHRvcEFjdCwKLQkJCUxpc3Q8T2JqZWN0PiBwcmVkZWNlc3NvcnMpIHsKLQkJTGlzdDxJbnRlZ2VyPiBpZExpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJlZExpc3QsICIsIik7IHRva2Vucy5oYXNNb3JlVG9rZW5zKCk7KSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlJbnRlZ2VyIGlkOwotCQkJdHJ5IHsKLQkJCQlpZCA9IG5ldyBJbnRlZ2VyKHRva2VuKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c7IAotCQkJfQotCQkJaWRMaXN0LmFkZChpZCk7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tQcmVkZWNlc3Nvckxpc3QoZSwgaWRMaXN0LCBhZGFwdGVyRmFjdG9yeSwgdG9wQWN0LAotCQkJCXByZWRlY2Vzc29ycyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0J3MgbWV0aG9kIHBhY2thZ2UgYW5kIHBsdWdpbiB0byB0aGUgZGVmYXVsdAotCSAqIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdpdmVuIHByb2Nlc3MgaWYgdGhleSBhcmUgbm90IGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogeWV0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBhZGRlZE9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsIEVPYmplY3QgZSwKLQkJCVNldCBhZGRlZE9iamVjdHMpIHsKLQkJLy8gYWRkIHRoZSBlbGVtZW50J3MgbWV0aG9kIHBhY2thZ2UgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkvLwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlhZGRUYXNrVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoVGFzaykgZSwgYWRkZWRPYmplY3RzLCB0cnVlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBlOwotCQkJYWRkV1BUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIHdwLCBhZGRlZE9iamVjdHMpOwotCQkJTGlzdCB0YXNrcyA9IGdldFRhc2tzRm9yV29ya1Byb2R1Y3Qod3AsIGNvbmZpZyk7Ci0JCQlpZiAodGFza3MgIT0gbnVsbCkKLQkJCXsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJYWRkVGFza1RvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKFRhc2spIGl0ZXIubmV4dCgpLAotCQkJCQkJCWFkZGVkT2JqZWN0cywgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUm9sZSkgewotCQkJUm9sZSByb2xlID0gKFJvbGUpIGU7Ci0JCQlhZGRSb2xlVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCByb2xlLCBhZGRlZE9iamVjdHMpOwotCi0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlhZGRBY3Rpdml0eVRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKEFjdGl2aXR5KSBlLCBhZGRlZE9iamVjdHMpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCAoR3VpZGFuY2UpIGUsIGFkZGVkT2JqZWN0cyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBY3Rpdml0eVRvRGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLCBBY3Rpdml0eSBhY3Rpdml0eSwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJVG5nVXRpbC5hZGRUbyhjb25maWcsIFVtYVV0aWwuZ2V0UHJvY2Vzc0NvbXBvbmVudChhY3Rpdml0eSksIGFkZGVkT2JqZWN0cyk7Ci0JCS8vIGFkZCBsaW5rZWQgZWxlbWVudCBvZiBkZXNjcmlwdG9ycwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCQkJCWlmKG8gIT0gbnVsbCkgewotCQkJCQlhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIG8sIGFkZGVkT2JqZWN0cyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkvLyB0aGlzIGlzIG5lZWRlZCBmb3IgYWRkaW5nIHN1Yi1hY3Rpdml0aWVzIGRlc2NyaXB0b3JzIAotCQkJCWFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoQWN0aXZpdHkpIGUsIGFkZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgYWxsIHRoZSBiYXNlIGVsZW1lbnRzIGlmIHRoZXJlIGlzIGFueQotCQlmb3IgKEFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgYmFzZSAhPSBudWxsOyBiYXNlID0gKEFjdGl2aXR5KSBiYXNlCi0JCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCWFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCBiYXNlLCBhZGRlZE9iamVjdHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUYXNrVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsIFRhc2sgdGFzaywKLQkJCVNldCBhZGRlZE9iamVjdHMsIGJvb2xlYW4gaW5jbHVkZVdvcmtQcm9kdWN0cykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQotCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIHRhc2ssIGFkZGVkT2JqZWN0cyk7Ci0KLQkJLy8gYWRkIGFsbCBvdGhlciBkZXBlbmRlbmNpZXMKLQkJLy8KLQotCQkvLyBhZGQgcm9sZXMKLQkJQXJyYXlMaXN0PEVPYmplY3Q+IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsKLQkJZGVwZW5kZW5jaWVzLmFkZEFsbCh0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0UGVyZm9ybWVkQnkoKSk7Ci0JCWZvciAoRU9iamVjdCBlT2JqZWN0IDogZGVwZW5kZW5jaWVzKSB7Ci0JCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIGVPYmplY3QsCi0JCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCX0KLQotCQkvLyBhZGQgd29yayBwcm9kdWN0cwotCQlpZiAoaW5jbHVkZVdvcmtQcm9kdWN0cykgewotCQkJZGVwZW5kZW5jaWVzLmNsZWFyKCk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWRlcGVuZGVuY2llcy5hZGRBbGwodGFzay5nZXRPdXRwdXQoKSk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlmb3IgKEVPYmplY3QgZU9iamVjdCA6IGRlcGVuZGVuY2llcykgewotCQkJCWFkZFdQVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoV29ya1Byb2R1Y3QpIGVPYmplY3QsCi0JCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChTZWN0aW9uIHN0ZXAgOiB0YXNrLmdldFN0ZXBzKCkpIHsJCQkKLQkJCUVPYmplY3QgYmFzZSA9IHN0ZXAuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgYmFzZSwgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSb2xlVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlSb2xlIHJvbGUsIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgcm9sZSwgYWRkZWRPYmplY3RzKTsKLQkJCi0JCS8vIGFkZCB3b3JrIHByb2R1Y3RzCi0JCUFycmF5TGlzdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCWRlcGVuZGVuY2llcy5hZGRBbGwocm9sZS5nZXRNb2RpZmllcygpKTsKLQkJZGVwZW5kZW5jaWVzLmFkZEFsbChyb2xlLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKFdvcmtQcm9kdWN0KSBpdGVyLm5leHQoKSwKLQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFdQVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlXb3JrUHJvZHVjdCB3cCwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCB3cCwgYWRkZWRPYmplY3RzKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoRGVsaXZlcmFibGUpIHdwKS5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCAoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVRhc2tEZXNjcmlwdG9yU3RlcHMoQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYykgewotCQlpZiAodGFza0Rlc2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVGFzayB0YXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotCi0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KQotCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlMaXN0PFN0ZXA+IHN0ZXBzID0gKExpc3Q8U3RlcD4pIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpLCBjb25maWcpOwotCi0JCS8vIGFkZCB0aG9zZSBzdGVwcyB0byBUYXNrRGVzY3JpcHRvciBpZiB0aGV5IGFyZSBub3QgdGhlcmUgeWV0LgotCQkvLwotCQlmb3IgKFN0ZXAgc3RlcCA6IHN0ZXBzKSB7Ci0JCQlpZiAoIXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5jb250YWlucyhzdGVwKSkgewotCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGQoc3RlcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNZXRob2RFbGVtZW50IHRoYXQgdGhlIGdpdmVuIGRlc2NyaXB0b3IgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRBc3NvY2lhdGVkRWxlbWVudChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRUYXNrKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRXb3JrUHJvZHVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVSZWZlcmVuY2UgZ2V0TGlua1JlZmVyZW5jZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3Bvc2VXcmFwcGVycyhDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCB0YXNrcyB0aGF0IGhhdmUgdGhlIGdpdmVuIHdvcmtwcm9kdWN0IGluIHRoZWlyIG91dHB1dAotCSAqIGluIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGFza3NGb3JXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCB3cCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0KLQkJTGlzdCB0YXNrcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSh3cCwgQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywgY29uZmlnKTsKLQotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCB3b3JrcHJvZHVjdHMgdGhhdCBoYXZlIHRoZSByb2xlIGFzIHJlc3BvbnNpYmxlIHJvbGUgaW4gdGhlCi0JICogZ2l2ZW4gY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdvcmtQcm9kdWN0c0ZvclJvbGUoUm9sZSByb2xlLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkJTGlzdCB3cHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2Uocm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCBjb25maWcpOwotCQlyZXR1cm4gd3BzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHdvcmtwcm9kdWN0cyB3aGljaCBhcmUsIGV4Y2VwdCB0aGUgY29udHJpYnV0b3IsIGluIHRoZSBnaXZlbgotCSAqIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxXb3JrUHJvZHVjdHMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCi0JCUNvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihjb3JlQ29udGVudFBrZywgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzODMzNzUyMDY2MzI0ODM3OTM3TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCQkJCQkmJiAhVG5nVXRpbAotCQkJCQkJCQkJLmlzQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQlMaXN0IG1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJbWV0aG9kRWxlbWVudHMuYWRkKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0YXNrLCBleGNlcHQgdGhlIGNvbnRyaWJ1dG9yLCBpbiB0aGUgZ2l2ZW4gcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFRhc2tzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGNvcmVDb250ZW50UGtnLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MzM3NTIwNjYzMjQ4Mzc5MzdMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJCQkmJiAhVG5nVXRpbAotCQkJCQkJCQkJLmlzQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQlMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQl0YXNrcy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuaXNHZW5lcmFsaXplcihlLAotCQkJCWdldEV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcygpKTsKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZiAoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gbnVsbAotCQkJCXx8IGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChpc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmFzZSA9IChCcmVha2Rvd25FbGVtZW50KSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbk5hbWUoYmFzZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWxXaXRoUGF0aChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGUuZ2V0TmFtZSgpKTsKLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQlwYXRoLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHByb2MpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJcGF0aC5hcHBlbmQocGx1Z2luLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoZSAhPSBwcm9jKSB7Ci0JCQkJcGF0aC5hcHBlbmQoJy8nKS5hcHBlbmQocHJvYy5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbW9kZWwgaW5mbyBvZiB0aGUgZ2l2ZW4gQnJlYWtkb3duRWxlbWVudCBpbiB0aGUgZ2l2ZW4KLQkgKiBTdHJpbmdCdWZmZXIKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIG1vZGVsSW5mbwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRNb2RlbEluZm8oQnJlYWtkb3duRWxlbWVudCBlLCBPYmplY3QgYWRhcHRlciwKLQkJCVN0cmluZ0J1ZmZlciBtb2RlbEluZm8pIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCWlmIChtb2RlbEluZm8ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCW1vZGVsSW5mby5hcHBlbmQoIjsgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJU3RyaW5nIHBhdHRlcm4gPSBudWxsOwotCQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvOyAKLQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG87IAotCQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19leHRlbmRzOyAKLQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX3JlcGxhY2VzOyAKLQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX2xvY2FsUmVwbGFjZXM7IAotCQkJCX0KLQotCQkJCS8vIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJLy8gQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9Ci0JCQkJLy8gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWFkYXB0ZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJLy8gT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGZhY3RvcnkuYWRhcHQoYmFzZSwKLQkJCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCS8vIGlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCS8vIElCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpCi0JCQkJLy8gaXRlbVByb3ZpZGVyOwotCQkJCS8vIFByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCQkJLy8gaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJLy8gc3RyYnVmLmFwcGVuZChVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKS5nZXROYW1lKCkpLmFwcGVuZCgnOicpCi0JCQkJLy8gLmFwcGVuZChwcm9jLmdldE5hbWUoKSkuYXBwZW5kKCc6Jyk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQkvLyBQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpCi0JCQkJLy8gYmFzZSk7Ci0JCQkJLy8gaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHByb2MpOwotCQkJCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJLy8gbW9kZWxJbmZvLmFwcGVuZChVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKS5nZXROYW1lKCkpLmFwcGVuZCgnOicpOwotCQkJCS8vIH0KLQkJCQkvLyBtb2RlbEluZm8uYXBwZW5kKHByb2MuZ2V0TmFtZSgpKTsKLQkJCQkvLyB9Ci0JCQkJLy8JCQkJCi0JCQkJLy8gaWYoYmFzZSAhPSBwcm9jKSB7Ci0JCQkJLy8gbW9kZWxJbmZvLmFwcGVuZCgnOicpLmFwcGVuZChiYXNlLmdldE5hbWUoKSk7Ci0JCQkJLy8gfQotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoIiciKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXR0ZXJuICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBnZXRMYWJlbFdpdGhQYXRoKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCQkJbW9kZWxJbmZvLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHBhdGggfSkpOwotCi0JCQkJCWdldE1vZGVsSW5mbygoQnJlYWtkb3duRWxlbWVudCkgYmFzZSwgYWRhcHRlciwgbW9kZWxJbmZvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJd3JhcHBlci5nZXRPd25lcigpOwotCQkJaWYgKHdyYXBwZXIuZ2V0RmVhdHVyZSgpICE9IG51bGwpIHsKLQkJCQltb2RlbEluZm8uYXBwZW5kKFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQod3JhcHBlci5nZXRGZWF0dXJlKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0vLwkJCQkJZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKG1vZGVsSW5mbywKLS8vCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpKTsKLQkJCQkJCi0JCQkJCWdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIHdyYXBwZXIsIHdyYXBwZXIpOwotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSUQuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSUQ7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlM7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4uZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWDsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8uZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTzsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVEOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LAotCQkJT2JqZWN0IGFkYXB0ZXIpIHsKLQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldElkKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXIpLmdldFRleHQoZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbk5hbWUoZSk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRQcmVkZWNlc3NvcnMoKS50b1N0cmluZygpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIGUpCi0JCQkJCQkuZ2V0SXNFdmVudERyaXZlbigpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nCi0JCQkJCQkudmFsdWVPZigoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlKS5nZXRJc09uZ29pbmcoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIGUpCi0JCQkJCQkuZ2V0SXNSZXBlYXRhYmxlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYKSB7Ci0JCQlyZXR1cm4gZS5nZXRQcmVmaXgoKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8pIHsKLQkJCVN0cmluZ0J1ZmZlciBtb2RlbEluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlnZXRNb2RlbEluZm8oZSwgYWRhcHRlciwgbW9kZWxJbmZvKTsKLQkJCXJldHVybiBtb2RlbEluZm8udG9TdHJpbmcoKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUpIHsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQl0eXBlTmFtZSA9IHdwLmVDbGFzcygpLmdldE5hbWUoKSArICJEZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJCAgCi0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGVOYW1lID09IG51bGwgJiYgZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQl0eXBlTmFtZSA9ICgoRU9iamVjdCkgZSkuZUNsYXNzKCkuZ2V0TmFtZSgpOwotCQkJfQotCQkJaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJXyIgKyB0eXBlTmFtZSArICJfdHlwZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoKFRlYW1Qcm9maWxlKSBlKQotCQkJCQkJLmdldFN1cGVyVGVhbSgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciAmJiBhZGFwdGVyIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0VGVhbUxpc3RTdHJpbmcoZ2V0VGVhbVByb2ZpbGVzKG9iamVjdCwgKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilhZGFwdGVyLCBhZGFwdGVyRmFjdG9yeSkpOwotIAkJCX0KLQkJfQotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja051bGwod3BkLmdldEFjdGl2aXR5RW50cnlTdGF0ZSgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tOdWxsKHdwZC5nZXRBY3Rpdml0eUV4aXRTdGF0ZSgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCUxpc3QgZGVsaXZlcmFibGVzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpOwotCQkJCWlmIChkZWxpdmVyYWJsZXMuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWludCBtYXggPSBkZWxpdmVyYWJsZXMuc2l6ZSgpIC0gMTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCXN0ckJ1Zi5hcHBlbmQoCi0JCQkJCQkJVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGRlbGl2ZXJhYmxlcy5nZXQoaSkpKQotCQkJCQkJCS5hcHBlbmQoJywnKTsKLQkJCQl9Ci0JCQkJc3RyQnVmLmFwcGVuZChUbmdVdGlsCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZShkZWxpdmVyYWJsZXMuZ2V0KG1heCkpKTsKLQkJCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGUuZ2V0SXNPcHRpb25hbCgpKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihlLmdldElzUGxhbm5lZCgpKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUykgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGUuZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5IGZvciB0ZWFtIHByb2ZpbGUgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5IGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkgZm9yIHN1Yi10ZWFtcwotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGJyZWFrZG93biBlbGVtZW50cyB1bmRlciB0ZWFtYWxsb2NhdGlvbgotCSAqIEBwYXJhbSB0ZWFtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5T2ZUZWFtKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KQotCXsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsJCi0JfQotCQotCQotCS8qKgotCSAqIFJldHVybiByb2xlZGVzY3JpcHRvcnMgdW5kZXIgYWN0aXZpdHkgd2hpY2ggY291bGQgcG9zc2libGUgbWF0Y2ggZm9yCi0JICogcm9sZXMgdW5kZXIgdGhlIHRlYW1zLiBJdCB3aWxsIHJlY3Vyc2UgdGhydSBhbGwgY2hpbGQgYWN0aXZpdGllcyB0byBmaW5kIAotCSAqIHJvbGUgZGVzY3JpcHRvcnMKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHJvbGVEZXNjTGlzdAotCSAqIEBwYXJhbSByb2xlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRSb2xlRGVzY3JpcHRvcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUFjdGl2aXR5IHBhcmVudCwgIExpc3Qgcm9sZURlc2NMaXN0LCBMaXN0IHJvbGVzKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJT2JqZWN0IG8gPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlnZXRSb2xlRGVzY3JpcHRvcihhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBvYmosCi0JCQkJCQkJcm9sZURlc2NMaXN0LCByb2xlcyk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQl7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCWlmICgocm9sZURlc2MuZ2V0Um9sZSgpIT0gbnVsbCkgJiYgCi0JCQkJCQkJKHJvbGVzLmNvbnRhaW5zKHJvbGVEZXNjLmdldFJvbGUoKSkpKQotCQkJCQkJcm9sZURlc2NMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVhbUxpc3RTdHJpbmcoTGlzdCB0ZWFtUHJvZmlsZXMpIHsKLQkJaWYgKHRlYW1Qcm9maWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG1heCA9IHRlYW1Qcm9maWxlcy5zaXplKCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSh0ZWFtUHJvZmlsZXMuZ2V0KGkpKSkKLQkJCQkJLmFwcGVuZCgnLCcpOwotCQl9Ci0JCXN0ckJ1Zi5hcHBlbmQoVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHRlYW1Qcm9maWxlcy5nZXQobWF4KSkpOwotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEF0dHJpYnV0ZShXb3JrQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgcHJvcCwKLQkJCVN0cmluZyB0eHQpIHsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQllLnNldE5hbWUodHh0KTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYKSB7Ci0JCQllLnNldFByZWZpeCh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWUuc2V0SXNFdmVudERyaXZlbihCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpIHsKLQkJCWUuc2V0SXNPbmdvaW5nKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSkgewotCQkJZS5zZXRJc1JlcGVhdGFibGUoQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEF0dHJpYnV0ZShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIHR4dCwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCB0eHQsIC0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLCBCb29sZWFuCi0JCQkJCS52YWx1ZU9mKHR4dCksIC0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLCBCb29sZWFuLnZhbHVlT2YodHh0KSwKLQkJCQkJLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksIEJvb2xlYW4KLQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCB0eHQsIC0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwpIHsKLQkJCWFjdGlvbk1ncgotCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwgQm9vbGVhbgotCQkJCQkJCS52YWx1ZU9mKHR4dCksIC0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksIEJvb2xlYW4udmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUykgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLCBCb29sZWFuCi0JCQkJCS52YWx1ZU9mKHR4dCksIC0xKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSB7Ci0JCQkJYWN0aW9uTWdyCi0JCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpLAotCQkJCQkJCQl0eHQsIC0xKTsKLQkJCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpLCB0eHQsIC0xKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZW5lcmFsaXplKEFjdGl2aXR5IGJhc2UsIFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7CQkKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoYmFzZS5lQ2xhc3MoKSk7Ci0JCWFjdC5zZXROYW1lKGJhc2UuZ2V0TmFtZSgpKTsKLQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IGdldFByZXNlbnRhdGlvbk5hbWUoYmFzZSk7Ci0JCQlhY3Quc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZSkgPyBiYXNlCi0JCQkJCS5nZXROYW1lKCkgOiBwcmVzZW50YXRpb25OYW1lKTsKLQkJfQotCQlhY3Quc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChiYXNlKTsKLQkJYWN0LnNldFZhcmlhYmlsaXR5VHlwZSh0eXBlKTsKLQotCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJLy8gaW5oZXJpdCBib29sZWFuIGF0dHJpYnV0ZXMgZnJvbSBiYXNlCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYmFzZS5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChFQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYXR0cmlidXRlLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpID09IEJvb2xlYW4uY2xhc3MpIHsKLQkJCQkJYWN0LmVTZXQoYXR0cmlidXRlLCBiYXNlLmVHZXQoYXR0cmlidXRlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY29weSBwcmVkZWNlc3NvcnMgbGlzdAotCQkvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIHdpdGggdmFyaWFiaWxpdHkgcnVsZXMuCi0JCS8vCi0JCUFycmF5TGlzdCB3b3JrT3JkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGJhc2UuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKSkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl3b3JrT3JkZXJzLmFkZChUbmdVdGlsLmNvcHkoKFdvcmtPcmRlcikgaXRlci5uZXh0KCkpKTsKLQkJfQotCi0JCWFjdC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmFkZEFsbCh3b3JrT3JkZXJzKTsKLQkJcmV0dXJuIGFjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgZWxlbWVudHMgc3BlY2lmaWVkIGluIGNsYXNzICJ0eXBlIiBlZy4oUm9sZURlc2NyaXB0b3IsCi0JICogV29ya1Byb2R1Y3REZXNjcmlwdG9yIiB1bnRpbCB0aGUgcm9vdCBsZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGl0ZW1zCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFbGVtZW50c0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQsIENsYXNzIHR5cGUsIExpc3QgaXRlbXMpIHsKLQkJLy8gZ2V0IGNoaWxkcmVuIGZvciBhY3Rpdml0eQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqIC0iICsgb2JqKTsKLQkJCQkJaWYgKCEoaXRlbXMuY29udGFpbnMob2JqKSkpIHsKLQkJCQkJCWl0ZW1zLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHBhcmVudAotCQlPYmplY3QgY3VycmVudFBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCS8vIGdvIHVwCi0JCQlnZXRFbGVtZW50c0luU2NvcGUoYWRhcHRlckZhY3RvcnksCi0JCQkJCShCcmVha2Rvd25FbGVtZW50KSBjdXJyZW50UGFyZW50LCB0eXBlLCBpdGVtcyk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zOwotCi0JfQotCi0JLyoqCi0JICogR2V0IHJvbGVzIGZyb20gcm9sZWRlc2NyaXB0b3IgbGlzdAotCSAqIAotCSAqIEBwYXJhbSByb2xlRGVzY0xpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um9sZXMoTGlzdCByb2xlRGVzY0xpc3QpIHsKLQkJTGlzdCByb2xlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBvYmopLmdldFJvbGUoKTsKLQkJCQkJcm9sZUxpc3QuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9sZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFzc29jaWF0ZWQgbWV0aG9kIGVsZW1lbnQgbGlzdAotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KExpc3QgZGVzY3JpcHRvckxpc3QpIHsKLQkJTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGRlc2NyaXB0b3JMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGRlc2NyaXB0b3JMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBnZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgb2JqKTsKLQkJCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCcmVha2Rvd25FbGVtZW50IGdldFRvcEJyZWFrZG93bkVsZW1lbnQoUHJvY2Vzc0NvbXBvbmVudCBwYykgewotCQlCcmVha2Rvd25FbGVtZW50IGJlID0gcGMuZ2V0UHJvY2VzcygpOwotCQlpZiAoYmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgYWRhcHRlciA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYmUsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSkKLQkJCXJldHVybiBiZTsKLQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCWlmIChpdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpID09IG51bGwpIHsKLQkJCWl0ZW1Qcm92aWRlci5zZXRUb3BJdGVtKGJlKTsKLQkJCWl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGJlLAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0VG9wSXRlbShiZSk7Ci0JCQlpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQkJaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYmUsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRUb3BJdGVtKGJlKTsKLQkJfQotCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYmUsIGJlKTsKLQkJcmV0dXJuIGJlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlSURzKEVPYmplY3QgdG9wQWN0LCBPYmplY3QgbmV3T2JqKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHRvcEFjdCwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlib29sZWFuIHVwZGF0ZVdob2xlUHJvY2VzcyA9IHRvcEFjdCA9PSBuZXdPYmoKLQkJCQkmJiB0b3BBY3QgaW5zdGFuY2VvZiBQcm9jZXNzOwotCQlpZiAodXBkYXRlV2hvbGVQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgdG9wQWN0OwotCQkJdXBkYXRlSURzKGZhY3RvcnksIHByb2MpOwotCQkJcmVmcmVzaFZpZXdlcihmYWN0b3J5LCBwcm9jKTsKLQkJfSBlbHNlIHsKLQkJCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCWZhY3RvcnksIHRvcEFjdCk7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgaXRlciwgbmV3T2JqKTsKLQkJfQotCi0JCS8vIE5vIG1vcmUgSUQgY29sdW1uIGluIFRCUyBhbmQgV1BCUwotCQkvLwotCQkvLyBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBmYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCB0b3BBY3QpOwotCQkvLyBQcm9jZXNzVXRpbC51cGRhdGVJRHMoZmFjdG9yeSwgaXRlciwgbmV3T2JqKTsKLQkJLy8gYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHRvcEFjdCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCS8vIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoZmFjdG9yeSwgdG9wQWN0KTsKLQkJLy8gUHJvY2Vzc1V0aWwudXBkYXRlSURzKGZhY3RvcnksIGl0ZXIsIG5ld09iaik7Ci0KLQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHRvcEFjdCwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlpZiAodXBkYXRlV2hvbGVQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgdG9wQWN0OwotCQkJdXBkYXRlSURzKGZhY3RvcnksIHByb2MpOwotCQkJcmVmcmVzaFZpZXdlcihmYWN0b3J5LCBwcm9jKTsKLQkJfSBlbHNlIHsKLQkJCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCWZhY3RvcnksIHRvcEFjdCk7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgaXRlciwgbmV3T2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpdGVyCi0JICogQHBhcmFtIG5ld09iagotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVJRHMoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwKLQkJCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yIGl0ZXIsIE9iamVjdCBuZXdPYmopIHsKLQkJaW50IGlkID0gMDsKLQkJT2JqZWN0IG9iajsKLQkJTWFwIGNoYW5nZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZmFjdG9yeS5hZGFwdChvYmosCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0SWQoaWQrKyk7Ci0JCQljaGFuZ2VNYXAucHV0KG9iaiwgaXRlbVByb3ZpZGVyKTsKLQkJfQotCi0JCS8vIHJlZnJlc2ggdGhlIGxhYmVsCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGFuZ2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJQ2hhbmdlTm90aWZpZXIgYWRhcHRlciA9IChJQ2hhbmdlTm90aWZpZXIpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlvYmogPSBlbnRyeS5nZXRLZXkoKTsKLQkJCWFkYXB0ZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJbmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgb2JqLCBvYmopLCBvYmosCi0JCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICogQHNlZSAjY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyhDb2xsZWN0aW9uLCBEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLQkJCURlc2NyaXB0b3Igb2JqKSB7Ci0JCUNvbGxlY3Rpb24gZGVzY3JpcHRvcnMgPSBkZXNjcmlwdG9yICE9IG51bGwgPyBDb2xsZWN0aW9ucwotCQkJCS5zaW5nbGV0b24oZGVzY3JpcHRvcikgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCXJldHVybiBjaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKGRlc2NyaXB0b3JzLCBvYmopOwotCX0KLQotCQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWZlcmVuY2VzIG9mIHRoZSBvYmplY3QgIm9iaiIuIElmIHJlZmVyZW5jZXMKLQkgKiBleGlzdCBpbiBhbnkgZGVzY3JpcHRvciBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGlnbm9yZSBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKENvbGxlY3Rpb24gZGVzY3JpcHRvcnMsCi0JCQlEZXNjcmlwdG9yIG9iaikgewotCQlib29sZWFuIHJlZmVyZW5jZXNFeGlzdHMgPSBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJlZk9iamVjdCA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0QXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMocmVmT2JqZWN0KSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKHJlZk9iamVjdCkpOwotCQkJbGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyZWZPYmplY3QpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcyhyZWZPYmplY3QpKTsKLQotCQkJZm9yIChJdGVyYXRvciByZWZJdG9yID0gbGlzdC5pdGVyYXRvcigpOyByZWZJdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmVmSXRvck9iamVjdCA9IChPYmplY3QpIHJlZkl0b3IubmV4dCgpOwotCQkJCWlmICgoKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSAmJiAhZGVzY3JpcHRvcnMKLQkJCQkJCS5jb250YWlucyhyZWZJdG9yT2JqZWN0KSkKLQkJCQkJCXx8IChyZWZJdG9yT2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQkJCXJlZmVyZW5jZXNFeGlzdHMgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCX0KLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsJCQotCQkJcmV0dXJuIGNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUmVmZXJlbmNlcyhkZXNjcmlwdG9ycywgKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqLCBmYWxzZSwgLTEpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlUYXNrRGVzY3JpcHRvciByZWZPYmplY3QgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRBc3Npc3RlZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRPdXRwdXQoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgcmVmSXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgcmVmSXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJlZkl0b3JPYmplY3QgPSAoT2JqZWN0KSByZWZJdG9yLm5leHQoKTsKLQkJCQlpZiAoKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKQotCQkJCQkJJiYgIWRlc2NyaXB0b3JzLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKSB7Ci0JCQkJCXJlZmVyZW5jZXNFeGlzdHMgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVmZXJlbmNlc0V4aXN0czsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZXMgb2YgdGhlIHdvcmtQcm9kdWN0ZGVzY3JpcHRvciBvYmplY3QgInJlZk9iamVjdC4gCi0JICogSWYgcmVmZXJlbmNlcyBleGlzdCBpbiBhbnkgZGVzY3JpcHRvciBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGlnbm9yZSBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gcmVmT2JqZWN0Ci0JICogQHBhcmFtIHJlbW92ZVJlbGF0aW9uIC0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlJ3JlIHJlbW92aW5nIHJlbGF0aW9uCi0JICogICAgIEJ5IGRlZmF1bHQgdGhpcyBzaG91bGQgYmUgZmFsc2UuIAotCSAqICAgICBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBpZiB5b3UgYXJlIGNvbWluZyBmcm9tIHByb3BlcnRpZXMgdmlldy4gCi0JICogICAgIGVnLiByZW1vdmluZyByZWxhdGlvbnNoaXAgb2Ygd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gdGFzayBkZXNjcmlwdG9yIAotCSAqIEBwYXJhbSBmZWF0dXJlSUQKLQkgKiAJCVRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGlmICJyZW1vdmVSZWxhdGlvbiIgaXMgdHJ1ZS4gWW91IG5lZWQgdG8gZ2l2ZSBmZWF0dXJlSUQKLQkgKiAJCWZvciB3aGljaCByZWxhdGlvbiB5b3UgYXJlIHJlbW92aW5nLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JSZWZlcmVuY2VzKAotCQkJQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHJlZk9iamVjdCwgYm9vbGVhbiByZW1vdmVSZWxhdGlvbiwgaW50IGZlYXR1cmVJRCkgewotCQkKLQkJTGlzdCBhbGxPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhbGxPYmplY3RzLmFkZChyZWZPYmplY3QpOwotCi0JCUFjdGl2aXR5IHBhcmVudEFjdGl2aXR5ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShyZWZPYmplY3QpOwotCQkvLyBjaGVjayB3aGV0aGVyIHJlZmVyZW5jZSBvYmplY3QgaW5zdGFuY2Ugb2YgYXJ0aWZhY3QKLQkJaWYgKHJlZk9iamVjdC5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCUxpc3QgY29udGFpbmVkQXJ0aWZhY3RzID0gKChBcnRpZmFjdCkgcmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkpCi0JCQkJCS5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQotCQkJTGlzdCBjb250YWluZWRXcERlc2NMaXN0ID0gZ2V0V3BEZXNjRm9yQXJ0aWZhY3RzKAotCQkJCQljb250YWluZWRBcnRpZmFjdHMsIHBhcmVudEFjdGl2aXR5KTsKLQotCQkJTGlzdCBjb250YWluZXJBcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9ICgoQXJ0aWZhY3QpIHJlZk9iamVjdC5nZXRXb3JrUHJvZHVjdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJCXdoaWxlIChhcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQkJY29udGFpbmVyQXJ0aWZhY3RzLmFkZChhcnRpZmFjdCk7Ci0JCQkJYXJ0aWZhY3QgPSAoKEFydGlmYWN0KSBhcnRpZmFjdCkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJCX0KLQkJCUxpc3QgY29udGFpbmVyV3BEZXNjTGlzdCA9IGdldFdwRGVzY0ZvckFydGlmYWN0cygKLQkJCQkJY29udGFpbmVyQXJ0aWZhY3RzLCBwYXJlbnRBY3Rpdml0eSk7Ci0KLQkJCWFsbE9iamVjdHMuYWRkQWxsKGNvbnRhaW5lZFdwRGVzY0xpc3QpOwotCQkJYWxsT2JqZWN0cy5hZGRBbGwoY29udGFpbmVyV3BEZXNjTGlzdCk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE9iamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cE9iaiA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGFsbE9iamVjdHMKLQkJCQkJLmdldChpKTsKLQotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlzdC5hZGRBbGwod3BPYmouZ2V0SW1wYWN0ZWRCeSgpKTsKLQkJCWxpc3QuYWRkQWxsKHdwT2JqLmdldEltcGFjdHMoKSk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cE9iaikpOwotCQkJbGlzdC5hZGRBbGwod3BPYmouZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQotCQkJTGlzdCBpbnB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpbnB1dExpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEV4dGVybmFsSW5wdXRUbyh3cE9iaikpOwotCQkJaW5wdXRMaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKHdwT2JqKSk7Ci0JCQlpbnB1dExpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyh3cE9iaikpOwotCi0JCQlMaXN0IG91dHB1dExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXRGcm9tKHdwT2JqKTsKLQkJCWlmIChyZW1vdmVSZWxhdGlvbikKLQkJCXsKLQkJCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQkJaWYgKG91dHB1dExpc3QuY29udGFpbnNBbGwoZGVzY3JpcHRvcnMpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVCA6CQkJCQotCQkJCQlpZiAoaW5wdXRMaXN0LmNvbnRhaW5zQWxsKGRlc2NyaXB0b3JzKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJbGlzdC5hZGRBbGwoaW5wdXRMaXN0KTsKLQkJCWxpc3QuYWRkQWxsKG91dHB1dExpc3QpOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIHJlZkl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IHJlZkl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByZWZJdG9yT2JqZWN0ID0gKE9iamVjdCkgcmVmSXRvci5uZXh0KCk7Ci0JCQkJaWYgKChyZWZJdG9yT2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikKLQkJCQkJCSYmICFkZXNjcmlwdG9ycy5jb250YWlucyhyZWZJdG9yT2JqZWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCS8qKgotCSAqIFJldHVybiBsaXN0IG9mIGNvcnJlc3BvbmRpbmcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGZvciBhcnRpZmFjdHMKLQkgKiBAcGFyYW0gYXJ0aWZhY3RzCi0JICogQHBhcmFtIHBhcmVudEFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcERlc2NGb3JBcnRpZmFjdHMoTGlzdCBhcnRpZmFjdHMsCi0JCQlBY3Rpdml0eSBwYXJlbnRBY3Rpdml0eSkgewotCQlMaXN0IHdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgYXJ0aWZhY3RzLmdldChpKTsKLQkJCWlmIChwYXJlbnRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkJTGlzdCBickVsZW1lbnRzID0gcGFyZW50QWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGJyRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBick9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCQlpZiAoYnJPYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBick9iajsKLQkJCQkJCWlmICh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQkJaWYgKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpLmVxdWFscyhhcnRpZmFjdCkpCi0JCQkJCQkJCXdwRGVzY0xpc3QuYWRkKHdwRGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdwRGVzY0xpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmopIHsKLQkJQ29tcG9zaXRlUm9sZSBjb21wUm9sZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJY29tcFJvbGUuZ2V0QWdncmVnYXRlZFJvbGVzKCkuYWRkQWxsKG9iai5nZXRBZ2dyZWdhdGVkUm9sZXMoKSk7Ci0KLQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBvYmouZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQljb21wUm9sZS5zZXROYW1lKG9iai5nZXROYW1lKCkpOwotCQljb21wUm9sZS5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lKSA/IG9iagotCQkJCS5nZXROYW1lKCkgOiBwcmVzZW50YXRpb25OYW1lKTsKLQkJcmV0dXJuIGNvbXBSb2xlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUYXNrVG9BY3Rpdml0eShUYXNrIHRhc2ssIEFjdGl2aXR5IGFjdCkgewotCQlXQlNEcm9wQ29tbWFuZCBjbWQgPSBuZXcgV0JTRHJvcENvbW1hbmQoYWN0LCBDb2xsZWN0aW9ucwotCQkJCS5zaW5nbGV0b25MaXN0KHRhc2spKTsKLQkJQlNEcm9wQ29tbWFuZC5JRXhlY3V0b3IgZXhlY3V0b3IgPSBjbWQuZ2V0RXhlY3V0b3IoKTsKLQkJaWYgKGV4ZWN1dG9yLnByZUV4ZWN1dGUoKSkgewotCQkJZXhlY3V0b3IuZG9FeGNlY3V0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1Byb2Nlc3NOb3RPZlR5cGUoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJRUNsYXNzIHByb2Nlc3NUeXBlKSB7Ci0JCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHBrZykuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2MgIT0gbnVsbCAmJiAhcHJvY2Vzc1R5cGUuaXNJbnN0YW5jZShwcm9jKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZFBrZyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkUGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2MgIT0gbnVsbCAmJiAhcHJvY2Vzc1R5cGUuaXNJbnN0YW5jZShwcm9jKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAoaGFzUHJvY2Vzc05vdE9mVHlwZSgoUHJvY2Vzc1BhY2thZ2UpIGNoaWxkUGtnLCBwcm9jZXNzVHlwZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGNvcnJlc3BvZGluZyByb2xlRGVzY3JpcHRvciBpbiB0ZWFtIHNpbmNlIHdlIG1haW50YWluIHR3byByb2xlCi0JICogZGVzY3JpcHRvciBmb3IgdGhlIHNhbWUgcm9sZQotCSAqIAotCSAqIEBwYXJhbSB0ZWFtCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmRSb2xlRGVzY3JpcHRvcihUZWFtUHJvZmlsZSB0ZWFtLAotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdG9yT2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAocm9sZURlc2MgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJaWYgKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUxpc3QgZmlyc3RPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgcm9sZURlc2MpCi0JCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQkJCQlMaXN0IHNlY29uZE9iamVjdEFnZ1JvbGVzID0gKChDb21wb3NpdGVSb2xlKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJCQkJaWYgKGZpcnN0T2JqZWN0QWdnUm9sZXMuZXF1YWxzKHNlY29uZE9iamVjdEFnZ1JvbGVzKSkgewotCQkJCQkJcmV0dXJuIGl0b3JPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJvbGVEZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlpZiAoKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJCSYmICghKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSkpIHsKLQkJCQkJT2JqZWN0IG9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzYykuZ2V0Um9sZSgpOwotCQkJCQlPYmplY3QgaXRvck9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChvYmpSb2xlLmVxdWFscyhpdG9yT2JqUm9sZSkpIHsKLQkJCQkJCXJldHVybiBpdG9yT2JqZWN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbHVtbkluZGV4VG9OYW1lTWFwIGZyb20gdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbHVtbgotCSAqIG5hbWVzCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIHRvQ29sdW1uSW5kZXhUb05hbWVNYXAoU3RyaW5nIGNvbE5hbWVzKSB7Ci0JCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbE5hbWVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBpZCA9IDA7Ci0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQljb2x1bW5JbmRleFRvTmFtZU1hcC5wdXQobmV3IEludGVnZXIoaWQpLCBnZXRDb2x1bW5JRCh0b2tlbikpOwotCQkJaWQrKzsKLQkJfQotCQlyZXR1cm4gY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb2x1bW5JRChTdHJpbmcgY29sTmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IElCU0l0ZW1Qcm92aWRlci5DT0xVTU5TLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY29sID0gSUJTSXRlbVByb3ZpZGVyLkNPTFVNTlNbaV07Ci0JCQlpZiAoY29sLmVxdWFscyhjb2xOYW1lKSkgewotCQkJCXJldHVybiBjb2w7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIGFuIG5ldyBkZXNjcmlwdG9yIGNhbiBiZSBjcmVhdGVkIGZvciBhIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JLy8gdW5kZXIgdGhlIGdpdmVuIGFjdGl2aXR5LCBjb25zaWRlcmluZyBhbGwgaW5oZXJpdGVkIGRlc2NyaXB0b3JzIG9mIHRoZSBhY3Rpdml0eS4KLQkvLyBJdCBpcyBOT1QgRUZGSUNJRU5UIHRvIGNvbGxlY3QgYWxsIGxpbmtlZCBlbGVtZW50cyBvZiB0aGUgaW5oZXJpdGVkIGRlc2NyaXB0b3JzIGludG8gYSBsaXN0IGFuZCB0aGVuIGNoZWNrIGlmCi0JLy8gd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QuCi0JLy8KLQkvLyBVc2UgUHJvY2Vzc0NvbW1hbmRVdGlsI2dldFZhbGlkRGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSkgaW5zdGVhZAotCS8vCi0vLwlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KE9iamVjdCBvd25lcikgewotLy8JCUxpc3QgYmFzZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvd25lcjsKLS8vCQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0vLwkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BKSkgewotLy8JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSBhY3Rpdml0eQotLy8JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotLy8KLS8vCQkJCWlmICgoZWxlbWVudCAhPSBudWxsKSAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotLy8JCQkJCUFjdGl2aXR5IGJhc2VBY3Rpdml0eSA9IChBY3Rpdml0eSkgZWxlbWVudDsKLS8vCi0vLwkJCQkJTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IGJhc2VBY3Rpdml0eQotLy8JCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRvcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotLy8JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotLy8JCQkJCQkJT2JqZWN0IGJhc2VPYmogPSBnZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgb2JqZWN0KTsKLS8vCQkJCQkJCWlmIChiYXNlT2JqICE9IG51bGwpIHsKLS8vCQkJCQkJCQliYXNlRWxlbWVudHMuYWRkKGJhc2VPYmopOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8KLS8vCQkJCQlhY3Rpdml0eSA9IGJhc2VBY3Rpdml0eTsKLS8vCQkJCX0KLS8vCQkJCWVsc2UgewotLy8JCQkJCWJyZWFrOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gYmFzZUVsZW1lbnRzOwotLy8JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHByZWRlY2Vzc29yIGxpc3Qgb2YgYWxsIGl0ZW0gcHJvdmlkZXJzIG9mIHRoZSBnaXZlbiBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKiBAcGFyYW0gcHJvYwotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQcmVkZWNlc3NvcnMoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgUHJvY2VzcyBwcm9jLAotCQkJTGlzdCByZW1vdmVkRWxlbWVudHMpIHsKLQkJSGFzaFNldCBlbGVtZW50cyA9IG5ldyBIYXNoU2V0KHJlbW92ZWRFbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCBwcm9jKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZmFjdG9yeS5hZGFwdChvYmosCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoaXRlbVByb3ZpZGVyICE9IG51bGwKLQkJCQkJJiYgVG5nVXRpbC51bndyYXAob2JqKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGl0ZW1Qcm92aWRlci5nZXRQcmVkZWNlc3NvcnMoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChpdGVyYXRvci5uZXh0KCkpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJCWUgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpOwotCQkJCQl9Ci0JCQkJCWlmIChlbGVtZW50cy5jb250YWlucyhlKSkgewotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9BY3Rpdml0eShBY3Rpdml0eSBhY3QsIEJyZWFrZG93bkVsZW1lbnQgYmUsIE9iamVjdFtdIHByZXZBbmROZXh0KSB7Ci0JCU9iamVjdCBuZXh0ID0gcHJldkFuZE5leHRbMV07Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJaWYobmV4dCAhPSBudWxsKSB7Ci0JCQlpbnQgaWQgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKG5leHQpOwotCQkJaWYoaWQgIT0gLTEpIHsgCi0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGlkLCBiZSk7Ci0JCQkJYWRkZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmKCFhZGRlZCkgewotCQkJT2JqZWN0IHByZXYgPSBwcmV2QW5kTmV4dFswXTsKLQkJCWlmKHByZXYgIT0gbnVsbCkgewkJCQkKLQkJCQlpbnQgaWQgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKHByZXYpOwotCQkJCWlmKGlkICE9IC0xKSB7Ci0JCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChpZCArIDEsIGJlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChiZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGJlKTsKLQkJCX0KLQkJfQotCi0JfQotCQotCS8qKgotCSAqIExvY2FsbHkgY29udHJpYnV0ZXMgdG8gdGhlIGluaGVyaXRlZCBhY3Rpdml0eSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGNyZWF0ZWRBY3Rpdml0aWVzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgY29udHJpYnV0ZVRvQWN0aXZpdHkoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyLCBMaXN0IGNyZWF0ZWRBY3Rpdml0aWVzKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChudWxsKTsKLQkJT2JqZWN0W10gcHJldkFuZE5leHQgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRQcmV2aW91c0FuZE5leHQoYWRhcHRlcik7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcGFyZW50ID0gY29udHJpYnV0ZVRvQWN0aXZpdHkoCi0JCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgcGFyZW50LAotCQkJCQljcmVhdGVkQWN0aXZpdGllcyk7Ci0JCX0KLQkJQWN0aXZpdHkgYWN0ID0gUHJvY2Vzc1V0aWwuZ2VuZXJpYWxpemUoYWRhcHRlciwKLQkJCQlWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OLCBwcmV2QW5kTmV4dCk7Ci0JCUFjdGl2aXR5IHBhcmVudEFjdCA9ICgoQWN0aXZpdHkpIHBhcmVudCk7Ci0JCWFkZFRvQWN0aXZpdHkocGFyZW50QWN0LCBhY3QsIHByZXZBbmROZXh0KTsKLQkJY3JlYXRlZEFjdGl2aXRpZXMuYWRkKGFjdCk7Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JLyoqCi0JICogTG9jYWxseSByZXBsYWNlcyB0aGUgaW5oZXJpdGVkIGFjdGl2aXR5IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gY3JlYXRlZEFjdGl2aXRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZUFjdGl2aXR5TG9jYWxseSgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIsIExpc3QgY3JlYXRlZEFjdGl2aXRpZXMpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG51bGwpOwotCQlPYmplY3RbXSBwcmV2QW5kTmV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldFByZXZpb3VzQW5kTmV4dChhZGFwdGVyKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlwYXJlbnQgPSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQsCi0JCQkJCWNyZWF0ZWRBY3Rpdml0aWVzKTsKLQkJfQotCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5nZW5lcmlhbGl6ZShhZGFwdGVyLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCwgcHJldkFuZE5leHQpOwotCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSAoKEFjdGl2aXR5KSBwYXJlbnQpOwotCQlhZGRUb0FjdGl2aXR5KHBhcmVudEFjdCwgYWN0LCBwcmV2QW5kTmV4dCk7Ci0JCWNyZWF0ZWRBY3Rpdml0aWVzLmFkZChhY3QpOwotCX0KLQotCXN0YXRpYyBPYmplY3RbXSBnZXRQcmV2aW91c0FuZE5leHQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChudWxsKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQlpbnQgaWQgPSBjaGlsZHJlbi5pbmRleE9mKGFkYXB0ZXIpICsgMTsKLQkJT2JqZWN0IG5leHQgPSBudWxsOwotCQlpZiAoaWQgPCBjaGlsZHJlbi5zaXplKCkpIHsKLQkJCW5leHQgPSBjaGlsZHJlbi5nZXQoaWQpOwotCQl9Ci0JCU9iamVjdCBwcmV2ID0gbnVsbDsKLQkJaWQgLT0gMjsKLQkJaWYgKGlkID4gLTEpIHsKLQkJCXByZXYgPSBjaGlsZHJlbi5nZXQoaWQpOwotCQl9Ci0KLQkJT2JqZWN0W10gcHJldkFuZE5leHQgPSB7IHByZXYsIG5leHQgfTsKLQkJcmV0dXJuIHByZXZBbmROZXh0OwotCX0KLQotCXN0YXRpYyBBY3Rpdml0eSBnZW5lcmlhbGl6ZShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUsIE9iamVjdFtdIHByZXZBbmROZXh0KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlcgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlBY3Rpdml0eSBhY3QgPSBnZW5lcmFsaXplKChBY3Rpdml0eSkgVG5nVXRpbC51bndyYXAoYWRhcHRlciksIHR5cGUpOwotCQlPYmplY3QgbmV4dCA9IHByZXZBbmROZXh0WzFdOwotCQlpZihuZXh0ICE9IG51bGwpIHsKLQkJCWFjdC5zZXRQcmVzZW50ZWRBZnRlcigoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAobmV4dCkpOwotCQkJaWYobmV4dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkoKEJyZWFrZG93bkVsZW1lbnQpbmV4dCkuc2V0UHJlc2VudGVkQmVmb3JlKGFjdCk7Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0IHByZXYgPSBwcmV2QW5kTmV4dFswXTsKLQkJaWYocHJldiAhPSBudWxsKSB7Ci0JCQlhY3Quc2V0UHJlc2VudGVkQmVmb3JlKChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChwcmV2KSk7Ci0JCQlpZiAocHJldiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkoKEJyZWFrZG93bkVsZW1lbnQpcHJldikuc2V0UHJlc2VudGVkQWZ0ZXIoYWN0KTsKLQkJCX0KLQkJfQotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChhY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWJzSXRlbVByb3ZpZGVyLnNldEV4cGFuZGVkKGFkYXB0ZXIuaXNFeHBhbmRlZCgpKTsKLQkJcmV0dXJuIGFjdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbW1lZGlhdGUgYmFzZSBwcm9jZXNzIG9mIHRoZSBnaXZlbgotCSAqIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHRoYXQgcmVwcmVzZW50cyBhbiBpbmhlcml0ZWQKLQkgKiBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbVByb3ZpZGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRJbW1lZGlhdGVCYXNlUHJvY2VzcygKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlcikgewotCQlBY3Rpdml0eSBpbmhlcml0b3IgPSBnZXRJbmhlcml0b3IoaXRlbVByb3ZpZGVyKTsKLQkJaWYgKGluaGVyaXRvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBpbmhlcml0b3IKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3Mgb2YgdGhlIGdpdmVuIGl0ZW0gcHJvdmlkZXIgdGhhdCBpbmhlcml0cwotCSAqIHRoZSBlbGVtZW50IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBpdGVtIHByb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIGl0ZW1Qcm92aWRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGdldEluaGVyaXRvcigKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlcikgewotCQlpZiAoaXRlbVByb3ZpZGVyLmlzUmVhZE9ubHkoKSkgewotCQkJLy8gdGhpcyByZXByZXNlbnRzIGFuIGluaGVyaXRlZCBicmVha2Rvd24gZWxlbWVudAotCQkJLy8KLQkJCWZvciAoT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoaXRlbVByb3ZpZGVyKTsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHBhcmVudCkKLQkJCQkJCQkuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIChBY3Rpdml0eSkgcGFyZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHBhcmVudCBsaXN0IG9mIDxjb2RlPndyYXBwZXI8L2NvZGU+IGZyb20gPGNvZGU+ZnJvbTwvY29kZT4sCi0JICogZXhjbHVkZWQgPGNvZGU+ZnJvbTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZnJvbQotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybiBsaXN0IG9mIHVud3JhcHBlZCBwYXJlbnQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQYXJlbnRMaXN0KE9iamVjdCBmcm9tLAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlyZXR1cm4gZ2V0UGFyZW50TGlzdCh3cmFwcGVyLCBmcm9tLCB3cmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIEdVSURzIGZyb20gdGhlIHRvcCBlbGVtZW50IHRvIHRoZSB3cmFwcGVyIGluY2x1c2l2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpbmtlZExpc3Q8U3RyaW5nPiBnZXRHdWlkTGlzdChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCUxpbmtlZExpc3Q8U3RyaW5nPiBndWlkTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkJTGlzdCBwYXJlbnRMaXN0ID0gUHJvY2Vzc1V0aWwuZ2V0UGFyZW50TGlzdChudWxsLCB3cmFwcGVyKTsKLQkJaWYgKCFwYXJlbnRMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFyZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gZXhjbHVkZSBUYXNrRGVzY3JpcHRvciBhbmQgUm9sZURlc2NyaXB0b3IgZnJvbSB0aGUgcGFyZW50Ci0JCQkJLy8gcGF0aCBiL2MgdGhvc2UgZGVzY3JpcHRvcnMgY2FuIGJlCi0JCQkJLy8gcGFyZW50IG9ubHkgaW4gQ0JTIHZpZXcKLQkJCQlpZiAoIShlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlndWlkTGlzdC5hZGQoZS5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWd1aWRMaXN0LmFkZChlLmdldEd1aWQoKSk7Ci0JCXJldHVybiBndWlkTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBHVUlEcyBmcm9tIHN0YXJ0IHRvIGFjdGl2aXR5LCBleGNsdWRlZCBzdGFydCBhY3Rpdml0eS4KLQkgKiBAcGFyYW0gZnJvbQotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpbmtlZExpc3Q8U3RyaW5nPiBnZXRHdWlkTGlzdChBY3Rpdml0eSBzdGFydCwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJTGlua2VkTGlzdDxTdHJpbmc+IGd1aWRMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOwotCQlmb3IoQWN0aXZpdHkgcGFyZW50ID0gYWN0aXZpdHk7IHBhcmVudCAhPSBudWxsICYmIChzdGFydCA9PSBudWxsIHx8IHBhcmVudCAhPSBzdGFydCk7IHBhcmVudCA9IHBhcmVudC5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJZ3VpZExpc3QuYWRkRmlyc3QocGFyZW50LmdldEd1aWQoKSk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRMaXN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRHdWlkTGlzdChPYmplY3QgYWN0aXZpdHlPcldyYXBwZXIpIHsKLQkJaWYoYWN0aXZpdHlPcldyYXBwZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIGdldEd1aWRMaXN0KChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilhY3Rpdml0eU9yV3JhcHBlcik7Ci0JCX0KLQkJZWxzZSBpZihhY3Rpdml0eU9yV3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gZ2V0R3VpZExpc3QobnVsbCwgKEFjdGl2aXR5KSBhY3Rpdml0eU9yV3JhcHBlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvR3VpZFBhdGgoTGlzdDxTdHJpbmc+IGd1aWRMaXN0KSB7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKFN0cmluZyBndWlkIDogZ3VpZExpc3QpIHsKLQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKGd1aWQpOwotCQl9Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgcGFyZW50IGxpc3Qgb2YgPGNvZGU+b2JqZWN0PC9jb2RlPiBmcm9tIDxjb2RlPmZyb208L2NvZGU+LAotCSAqIGV4Y2x1ZGVkIDxjb2RlPmZyb208L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBmcm9tCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybiBsaXN0IG9mIHVud3JhcHBlZCBwYXJlbnQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQYXJlbnRMaXN0KE9iamVjdCBvYmplY3QsIE9iamVjdCBmcm9tLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlBcnJheUxpc3QgcGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gZnJvbQotCQkJCSYmIHBhcmVudCAhPSBudWxsOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKHBhcmVudCk7Ci0JCQlNZXRob2RFbGVtZW50IGU7CQkJCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWUgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudDsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQkJcGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCX0KLQkJCQlpZihQcm9jZXNzVXRpbC5pc1RvcFByb2Nlc3MoZSkpIHsKLQkJCQkJcGFyZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBtdXN0IGJlIGEgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQkJCS8vCi0JCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvYmopOwotCQkJCWUgPSAoTWV0aG9kRWxlbWVudCkgYWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQkJfQotCQkJcGFyZW50TGlzdC5hZGQoMCwgZSk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudExpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd3JhcHBlcnMgb2YgYWxsIGJyZWFrZG93biBzdHJ1Y3R1cmUgKEJTKSB2aWV3cyBpbiB0aGUgZm9sbG93aW5nCi0JICogb3JkZXI6IFdCUywgVEJTLCBXUEJTCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiAgICAgICAgICAgIHRoZSB3cmFwcGVyIG9mIGEgQlMgdmlldwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V3JhcHBlcnMoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciwgQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCUFycmF5TGlzdCByb2xsZWRVcEl0ZW1Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeSh3cmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJT2JqZWN0IHByb2MgPSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsJCQkJCQkKLQkJCUFycmF5TGlzdCBvYmplY3RzID0gbmV3IEFycmF5TGlzdChQcm9jZXNzVXRpbC5nZXRQYXJlbnRMaXN0KHByb2MsCi0JCQkJCXdyYXBwZXIpKTsKLQkJCUFycmF5TGlzdCB3cmFwcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gcm9vdEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCXdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQkJb2JqZWN0cy5hZGQoZSk7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IHByb2M7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIxLm5leHQoKTsKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBhY3Rpdml0eSBpcyByb2xsZWQgZG93biBiZWZvcmUgbG9va2luZyBpbnRvIGl0cyBjaGlsZHJlbgotCQkJCQkvLwotCQkJCQlPYmplY3QgYmUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwkJCQkJCQkJCi0JCQkJCWlmKGJlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQkJCQlpZihpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJCQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCQkJcm9sbGVkVXBJdGVtUHJvdmlkZXJzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQkJCWlmKGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCQkJcm9sbGVkVXBJdGVtUHJvdmlkZXJzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJZmluZF9jaGlsZDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0ZXIKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCA9PSBUbmdVdGlsLnVud3JhcChjaGlsZCkpIHsKLQkJCQkJCQlvYmplY3QgPSBjaGlsZDsKLQkJCQkJCQlicmVhayBmaW5kX2NoaWxkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQl3cmFwcGVycy5hZGQob2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCQkiQ291bGQgbm90IGZpbmQgd3JhcHBlciBmb3IgIiArIGUgKyAiIHVzaW5nIGFkYXB0ZXIgZmFjdG9yeSAiICsgYWRhcHRlckZhY3RvcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gd3JhcHBlcnM7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZighcm9sbGVkVXBJdGVtUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJCS8vIHJlc3RvcmUgdGhlIHJvbGxlZFVwIGZsYWcKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGxlZFVwSXRlbVByb3ZpZGVycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKSkuYmFzaWNTZXRSb2xsZWRVcCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBXb3JrUHJvZHVjdERlc2NyaXB0b3Igc3BlY2lmaWMgbW9kZWwgaW5mbyAKLQkgKiBAcGFyYW0gbW9kZWxJbmZvCi0JICogQHBhcmFtIG9iamVjdCBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb3IgaXRzIHdyYXBwZXIKLQkgKiBAcGFyYW0gaXRlbVByb3ZpZGVyIGl0ZW0gcHJvdmlkZXIgb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9yIGl0cyB3cmFwcGVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFdQRE1vZGVsSW5mbyhTdHJpbmdCdWZmZXIgbW9kZWxJbmZvLCBPYmplY3Qgb2JqZWN0LCBPYmplY3QgaXRlbVByb3ZpZGVyKSB7Ci0JCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewkKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWVsZW1lbnQ7Ci0JCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQkvLyBjaGVjayBpZiB0aGlzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGlzIHNob3duIHVuZGVyIGEgdGFzayBkZXNjcmlwdG9yIG9yIHJvbGUgZGVzY3JpcHRvcgotCQkJCS8vCi0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJYWRhcHRlckZhY3RvcnkgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpaXRlbVByb3ZpZGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCX0KLQkJCQllbHNlIGlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilpdGVtUHJvdmlkZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCWlmKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IHBhcmVudERlc2NyaXB0b3IgPSBudWxsOwotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpaXRlbVByb3ZpZGVyOwotCQkJCQlmaW5kUGFyZW50RGVzY3JpcHRvcjoKLQkJCQkJCWZvcihPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCkpIHsKLQkJCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHBhcmVudCk7Ci0JCQkJCQkJaWYoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCXBhcmVudERlc2NyaXB0b3IgPSBlOwotCQkJCQkJCQlicmVhayBmaW5kUGFyZW50RGVzY3JpcHRvcjsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJYnJlYWsgZmluZFBhcmVudERlc2NyaXB0b3I7Ci0JCQkJCQkJfQotCQkJCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQl9Ci0JCQkJCWlmKHBhcmVudERlc2NyaXB0b3IgIT0gbnVsbCkgewkKLQkJCQkJCS8vIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGlzIHNob3duIHVuZGVyIGEgdGFzayBkZXNjcmlwdG9yCi0JCQkJCQkvLyBzaG93IG9ubHkgbW9kZWwgaW5mbyByZWxhdGVkIHRvIHRoaXMgdGFzayBkZXNjcmlwdG9yCi0JCQkJCQkvLwotCQkJCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJaWYoQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUbyh3cGQpLmNvbnRhaW5zKHBhcmVudERlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJZmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkpOwotCQkJCQkJfQotCQkJCQkJaWYoQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKHdwZCkuY29udGFpbnMocGFyZW50RGVzY3JpcHRvcikpIHsKLQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXRGcm9tKHdwZCkuY29udGFpbnMocGFyZW50RGVzY3JpcHRvcikpIHsKLQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkpOwotCQkJCQkJfQotCQkJCQkJaWYoIWZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJCQkJCWlmIChtb2RlbEluZm8udG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChmZWF0dXJlKSk7Ci0JCQkJCQkJCWlmKGkgPCBmZWF0dXJlcy5zaXplKCkgLTEpewotCQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlnZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IobW9kZWxJbmZvLCB3cGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBNb2RlbEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIFdvcmtQcm9kdWN0RGVzY3JpcHRvci4gTW9kZWwKLQkgKiBJbmZvcm1hdGlvbiBpcyBmb3IgUEJTIChXb3JrUHJvZHVjdERlc2NyaXB0b3JzLCBpbmNsdWRpbmcgRXh0ZW5kZWQKLQkgKiBBY3Rpdml0eSdzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMpLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbywgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQlTdHJpbmcgY29tbWEgPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKG9iamVjdCkuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobW9kZWxJbmZvLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChjb21tYSk7Ci0JCQl9Ci0JCQltb2RlbEluZm8uYXBwZW5kKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyhvYmplY3QpLmlzRW1wdHkoKSkgewotCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCW1vZGVsSW5mby5hcHBlbmQoY29tbWEpOwotCQkJfQotCQkJbW9kZWxJbmZvLmFwcGVuZChVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20ob2JqZWN0KS5pc0VtcHR5KCkpIHsKLQkJCWlmIChtb2RlbEluZm8udG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQltb2RlbEluZm8uYXBwZW5kKGNvbW1hKTsKLQkJCX0KLQkJCW1vZGVsSW5mby5hcHBlbmQoVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREdXBsaWNhdGVEZXNjcmlwdG9yc0FmdGVyUmV2ZWFsKENvbGxlY3Rpb24gZWxlbWVudHNUb1JldmVhbCkgewotCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9SZXZlYWwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjKTsKLQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShkZXNjKTsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQllID0gKE1ldGhvZEVsZW1lbnQpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlnKTsKLQkJCQkJT2JqZWN0IGR1cGxpY2F0ZSA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGUsIGFjdCwgY29uZmlnKTsKLQkJCQkJaWYoZHVwbGljYXRlICE9IG51bGwgJiYgIWR1cGxpY2F0ZXMuY29udGFpbnMoZHVwbGljYXRlKSkgewkJCQkJCi0JCQkJCQlkdXBsaWNhdGVzLmFkZChkdXBsaWNhdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZHVwbGljYXRlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPERlc2NyaXB0b3I+IGdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJTdXBwcmVzcyhDb2xsZWN0aW9uIGVsZW1lbnRzVG9TdXBwcmVzcykgewotCQlDb2xsZWN0aW9uPERlc2NyaXB0b3I+IGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0b3I+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9TdXBwcmVzcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0JCQlpZihpdGVtIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVtOwotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2MpOwotCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGRlc2MpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGVsZW1lbnQgIT0gZGVzYyAmJiBlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvciAmJiBlbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQlpZihsaW5rZWRFbGVtZW50ID09IGUpIHsKLQkJCQkJCQkJZHVwbGljYXRlcy5hZGQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGR1cGxpY2F0ZXM7Ci0JCQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIHJlcHJlc2VudGluZyBhIGluaGVyaXRlZCBlbGVtZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSB0cmVlIG9mIHByb2Nlc3MgZWRpdG9yCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkmJiAoKERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5pc0luaGVyaXRlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFjdGl2aXR5IGhhcyBpbmhlcml0ZWQgYW55IGJyZWFrZG93biBlbGVtZW50IHZpYSBleHRlbnNpb24gb2YgbG9jYWwgY29udHJpYnV0aW9uCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbmhlcml0ZWQoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihhY3Rpdml0eSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXJldHVybiAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJaWYobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvOwotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYodmUgIT0gbnVsbCkgewotCQkJCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJaWYodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0ZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzQ29udHJpYnV0ZWQoKTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxTdWJUZWFtcyhUZWFtUHJvZmlsZSB0ZWFtLCBMaXN0IHRlYW1zKSB7Ci0JCXRlYW1zLmFkZCh0ZWFtKTsKLQkJTGlzdCBzdWJUZWFtcyA9IHRlYW0uZ2V0U3ViVGVhbSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzdWJUZWFtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVRlYW1Qcm9maWxlIHN1YlRlYW0gPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCi0JCQlnZXRBbGxTdWJUZWFtcyhzdWJUZWFtLCB0ZWFtcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoT2JqZWN0IG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlMaXN0IHRlYW1zID0gbmV3IEFycmF5TGlzdChBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMocm9sZURlc2MpKTsKLQkJCi0JCS8vIGdldCBhbGwgdGhlIHRlYW0gcHJvZmlsZXMgdGhhdCBhcmUgaW4gc2NvcGUgb2YgdGhlIHdyYXBwZXIKLQkJLy8KLQkJSGFzaFNldCB2aXNpYmxlVGVhbXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCUxpc3QgYWN0aXZpdHlUZWFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWxsU3ViVGVhbXMoKFRlYW1Qcm9maWxlKSBlLCBhY3Rpdml0eVRlYW1zKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYWN0aXZpdHlUZWFtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCXsKLQkJCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQkJCQlpZihvIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUgJiYgKChUZWFtUHJvZmlsZSlvKS5nZXRUZWFtUm9sZXMoKS5jb250YWlucyhyb2xlRGVzYykpIHsKLQkJCQkJCQl2aXNpYmxlVGVhbXMuYWRkKG8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJT2JqZWN0IG5ld1BhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQlpZihuZXdQYXJlbnQgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCW5ld1BhcmVudCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoKEFjdGl2aXR5KXBhcmVudCk7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBuZXdQYXJlbnQ7Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZSBhbnkgdGVhbSBwcm9maWxlIHRoYXQgaXMgbm90IGluIHRoZSBzY29wZSBvZiB0aGUgd3JhcHBlcgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCB0ZWFtID0gaXRlci5uZXh0KCk7Ci0JCQlpZighdmlzaWJsZVRlYW1zLmNvbnRhaW5zKHRlYW0pKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRlYW1zOwotCi0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgdmlzaWJsZSB0ZWFtIHByb2ZpbGVzIGZvciB0aGUgcm9sZSBkZXNjcmlwdG9yIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB3cmFwcGVyCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjV3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciByb2xlRGVzY1dyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFRlYW1Qcm9maWxlcyhyb2xlRGVzY1dyYXBwZXIsIHJvbGVEZXNjV3JhcHBlciwgcm9sZURlc2NXcmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHJvbGVEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjLCBhZGFwdGVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBsaXN0IG9mIHJlY3Vyc2l2ZSBjaGlsZCBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5IGFuZCBnaXZlbiB0eXBlCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q2hpbGRFbGVtZW50cyhBY3Rpdml0eSBhY3QsIENsYXNzIHR5cGUsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlmb3IgKGludCBpID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KGkpOwotCQkJaWYodHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlnZXRDaGlsZEVsZW1lbnRzKChBY3Rpdml0eSkgZWxlbWVudCwgdHlwZSwgY29sbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRmlsdGVyIGdldEZpbHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKHJvb3RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCXJldHVybiAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkpcm9vdEFkYXB0ZXJGYWN0b3J5KS5nZXRGaWx0ZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY2FsY3VsYXRlZCBsaXN0IG9mIGFydGlmYWN0IGNvbnRhaW5lZCBieSB0aGUgZ2l2ZW4gYXJ0aWZhY3QgYmFzZWQgb24gdGhlCi0JICogY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENvbnRhaW5lZEFydGlmYWN0cyhBcnRpZmFjdCBhcnRpZmFjdCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCWNvbmZpZyA9ICgoSUNvbmZpZ3VyYXRvcilmaWx0ZXIpLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQkKLQkJaWYoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAoTGlzdCkgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0UmVmZXJlbmNlKAotCQkJCQlhcnRpZmFjdCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJCWNvbmZpZyk7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzRGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGFydGlmYWN0RGVzYywgTGlzdCBhcnRpZmFjdERlc2NyaXB0b3JzKSB7Ci0JCWlmKGFydGlmYWN0RGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgYXJ0aWZhY3REZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQotCQkvLyBjb2xsZWN0IG93biBhbmQgY29udHJpYnV0aW5nIHN1YmFydGlmYWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCUFycmF5TGlzdCBjb250YWluZWREZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpID0gYXJ0aWZhY3REZXNjcmlwdG9ycy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWFydGlmYWN0RGVzY3JpcHRvcnMuZ2V0KGkpKTsKLQkJCVdvcmtQcm9kdWN0IGEgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmKGEgIT0gbnVsbCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gYS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYoY29udGFpbmVyID09IGFydGlmYWN0IHx8IAotCQkJCQkJKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFydGlmYWN0ICYmIFRuZ1V0aWwuaXNDb250cmlidXRvck9mKGFydGlmYWN0LCAoQXJ0aWZhY3QpIGNvbnRhaW5lcikpKSB7Ci0JCQkJCWNvbnRhaW5lZERlc2NyaXB0b3JzLmFkZCh3cGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVkRGVzY3JpcHRvcnM7Ci0JfQotCQotLy8JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoQXJ0aWZhY3QgcGFyZW50LCBBcnRpZmFjdCBjaGlsZCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLS8vCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0vLwkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotLy8JCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLS8vCQkJY29uZmlnID0gKChJQ29uZmlndXJhdG9yKWZpbHRlcikuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotLy8JCX0KLS8vCQkKLS8vCQlpZihjb25maWcgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNoaWxkLCBwYXJlbnQpOwotLy8JCX0KLS8vCQkKLS8vCQlmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGNmZyA9IGNvbmZpZzsJCQotLy8JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocGFyZW50LCBmYWxzZSkgewotLy8KLS8vCQkJLyoqCi0vLwkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0vLwkJCSAqLwotLy8JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLS8vCi0vLwkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2UoCi0vLwkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLS8vCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0vLwkJCQkJCWNmZykpLml0ZXJhdG9yKCk7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJfTsKLS8vCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotLy8JCQlpZihjaGlsZCA9PSBpdGVyLm5leHQoKSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxjb2RlPnBhcmVudDwvY29kZT4gY2FuIHJlcHJlc2VudCB0aGUgcGFyZW50IG9mIHRoZSBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiA8Y29kZT5jaGlsZDwvY29kZT4gYmFzZWQgb24gdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGVpciBsaW5rZWQgYXJ0aWZhY3QgYW5kIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhcnRpZmFjdCBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KFdvcmtQcm9kdWN0RGVzY3JpcHRvciBwYXJlbnQsIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBjaGlsZCwgZmluYWwgTGlzdCBhcnRpZmFjdERlc2NMaXN0KSB7Ci0vLwkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwYXJlbnQsIGZhbHNlKSB7Ci0vLwkJCQotLy8JCQkvKioKLS8vCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLS8vCQkJICovCi0vLwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotLy8JCQkKLS8vCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQkJCXJldHVybiBnZXRDb250YWluZWRBcnRpZmFjdHNEZXNjcmlwdG9ycygoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3QsIGFydGlmYWN0RGVzY0xpc3QpLml0ZXJhdG9yKCk7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJfTsKLS8vCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotLy8JCQlpZihjaGlsZCA9PSBpdGVyLm5leHQoKSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIFVtYVV0aWwuaXNDb250YWluZWRCeShjaGlsZC5nZXRXb3JrUHJvZHVjdCgpLCBwYXJlbnQuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihmaW5hbCBDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlMaXN0IGFydGlmYWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJLy8gZ2V0IHRoZSBhcnRpZmFjdCBsaXN0Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZih1bndyYXApIHsKLQkJCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCX0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGNoaWxkKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJYXJ0aWZhY3RMaXN0LmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCS8vIHByb2Nlc3MgdGhlIGFydGlmYWN0IGxpc3QgdG8gZ2V0IHRoZSB0b3AtbW9zdCBvbmVzCi0JCS8vCi0JCVNldCB0b3BNb3N0QXJ0aWZhY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJ0aWZhY3QgY2FuZGlkYXRlID0gbnVsbDsKLQkKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoIWFydGlmYWN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQotCQkJaWYgKCFmb3VuZCkKLQkJCXsKLQkJCQljYW5kaWRhdGUgPSAoQXJ0aWZhY3QpIGFydGlmYWN0TGlzdC5nZXQoMCk7Ci0JCQkJYXJ0aWZhY3RMaXN0LnJlbW92ZSgwKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaXRlci5uZXh0KCk7Ci0JCQkJZm91bmQgPSBmYWxzZTsKLQkJCQkvLyBpZihjYW5kaWRhdGUuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuY29udGFpbnMoYXJ0aWZhY3QpKSB7Ci0JCQkJaWYgKFVtYVV0aWwuaXNDb250YWluZWRCeShhcnRpZmFjdCwgY2FuZGlkYXRlKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChVbWFVdGlsLmlzQ29udGFpbmVkQnkoY2FuZGlkYXRlLCBhcnRpZmFjdCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJY2FuZGlkYXRlID0gYXJ0aWZhY3Q7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCB8fCBhcnRpZmFjdExpc3QuaXNFbXB0eSgpKQotCQkJCXRvcE1vc3RBcnRpZmFjdHMuYWRkKGNhbmRpZGF0ZSk7Ci0JCQllbHNlIGlmIChhcnRpZmFjdExpc3QuaXNFbXB0eSgpKQotCQkJCQl0b3BNb3N0QXJ0aWZhY3RzLmFkZChjYW5kaWRhdGUpOwkJCi0JCX0KLQkKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaS5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IHVud3JhcCA/IFRuZ1V0aWwudW53cmFwKGNoaWxkKSA6IGNoaWxkOwotCQkJYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpOwotCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKCEod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkpIHsKLQkJCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAodG9wTW9zdEFydGlmYWN0cy5jb250YWlucyh3cCkpIHsKLQkJCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBoZWxwcyBidWlsZCB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvciB0cmVlIGNvcnJlY3RseQotCSAqIAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqIEBwYXJhbSB1bndyYXAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihmaW5hbCBDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJTGlzdCBhcnRpZmFjdERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGdldCB0aGUgYXJ0aWZhY3QgbGlzdAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYodW53cmFwKSB7Ci0JCQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBjaGlsZCkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCWFydGlmYWN0RGVzY0xpc3QuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihhcnRpZmFjdERlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJcmV0dXJuIChMaXN0KSBjaGlsZHJlbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gcHJvY2VzcyB0aGUgYXJ0aWZhY3QgbGlzdCB0byBnZXQgdGhlIHRvcC1tb3N0IG9uZXMKLQkJLy8KLQkJU2V0IHRvcE1vc3RBcnRpZmFjdERlc2NMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCBhcnRpZmFjdERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdChhcnRpZmFjdERlc2NMaXN0KTsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNhbmRpZGF0ZSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKCFhcnRpZmFjdERlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJCi0JCQlpZiAoIWZvdW5kKQotCQkJewotCQkJCWNhbmRpZGF0ZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGFydGlmYWN0RGVzY0xpc3QuZ2V0KDApOwotCQkJCWFydGlmYWN0RGVzY0xpc3QucmVtb3ZlKDApOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3REZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgYXJ0aWZhY3REZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJZm91bmQgPSBmYWxzZTsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuaXNDb250YWluZWRCeShjYW5kaWRhdGUsIGFydGlmYWN0RGVzYywgYXJ0aWZhY3REZXNjcmlwdG9ycykpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoUHJvY2Vzc1V0aWwuaXNDb250YWluZWRCeShhcnRpZmFjdERlc2MsIGNhbmRpZGF0ZSwgYXJ0aWZhY3REZXNjcmlwdG9ycykpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJY2FuZGlkYXRlID0gYXJ0aWZhY3REZXNjOwotCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCB8fCBhcnRpZmFjdERlc2NMaXN0LmlzRW1wdHkoKSkKLQkJCQl0b3BNb3N0QXJ0aWZhY3REZXNjTGlzdC5hZGQoY2FuZGlkYXRlKTsKLQkJCWVsc2UgaWYgKGFydGlmYWN0RGVzY0xpc3QuaXNFbXB0eSgpKQotCQkJCQl0b3BNb3N0QXJ0aWZhY3REZXNjTGlzdC5hZGQoY2FuZGlkYXRlKTsJCQotCQl9Ci0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaS5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IHVud3JhcCA/IFRuZ1V0aWwudW53cmFwKGNoaWxkKSA6IGNoaWxkOwotCQkJYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpOwotCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKCEod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkpIHsKLQkJCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAodG9wTW9zdEFydGlmYWN0RGVzY0xpc3QuY29udGFpbnMod3BkKSkgewotCQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZmluZEFjdGl2aXR5KFByb2Nlc3NQYWNrYWdlIHByb2NQYWNrYWdlKSB7Ci0JCWlmKHByb2NQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudClwcm9jUGFja2FnZSkuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jUGFja2FnZQotCQkJCS5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZml4QnJlYWtkb253RWxlbWVudE9yZGVyUmVjdXJzaXZlbHkoQWN0aXZpdHkgYWN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzM2ODI2MTY4NTY2MzM1NDQ3OEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJQXJyYXlMaXN0IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gYWN0aXZpdGllcy5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlmaXhCcmVha2Rvd25FbGVtZW50T3JkZXIoKEFjdGl2aXR5KWl0ZXIubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhCcmVha2Rvd25FbGVtZW50T3JkZXIoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJRUxpc3QgbGlzdCA9IChFTGlzdCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChsaXN0KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUJyZWFrZG93bkVsZW1lbnQgc3VjYyA9IGUuZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJCWlmKHN1Y2MgIT0gbnVsbCAmJiBzdWNjICE9IGUpIHsKLQkJCQlpbnQgc3VjY0lkID0gbGlzdC5pbmRleE9mKHN1Y2MpOwotCQkJCWlmKHN1Y2NJZCAhPSAtMSkgewotCQkJCQlpbnQgaWQgPSBsaXN0LmluZGV4T2YoZSk7Ci0JCQkJCWlmKGlkICE9IHN1Y2NJZCAtIDEpIHsKLQkJCQkJCWlmKGlkIDwgc3VjY0lkKSB7Ci0JCQkJCQkJbGlzdC5tb3ZlKHN1Y2NJZCAtIDEsIGlkKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWxpc3QubW92ZShpZCwgc3VjY0lkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllLnNldFByZXNlbnRlZEFmdGVyKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGl0ZW0gcHJvdmlkZXIgcGF0aCBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHksIHRoZSBwYXRoIGZyb20gdG9wIHByb2Nlc3MgdG8gdGhlIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVJdGVtUHJvdmlkZXJQYXRoKEFjdGl2aXR5IGFjdGl2aXR5LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChhY3Rpdml0eSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXAgPSAoSUJTSXRlbVByb3ZpZGVyKSBpcDsKLQkJT2JqZWN0IHRvcCA9IGJzSXAuZ2V0VG9wSXRlbSgpOwotCQlpZighKHRvcCBpbnN0YW5jZW9mIFByb2Nlc3MpIHx8ICEoKChFT2JqZWN0KXRvcCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCS8vIGl0ZW0gcHJvdmlkZXIgdHJlZSBvZiB0aGUgb3duZXIncyBwcm9jZXNzIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQKLQkJCS8vIGluaXRpYWxpemUgaXQuCi0KLQkJCS8vIGdldCB0aGUgYWN0aXZpdHkgcGF0aAotCQkJLy8KLQkJCUFycmF5TGlzdCBhY3RQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yKGFjdGl2aXR5ID0gYWN0aXZpdHkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IGFjdGl2aXR5ICE9IG51bGw7IGFjdGl2aXR5ID0gYWN0aXZpdHkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkpIHsKLQkJCQlhY3RQYXRoLmFkZCgwLCBhY3Rpdml0eSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3RQYXRoLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhY3QgPSBpdGVyLm5leHQoKTsKLQkJCQlpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpcC5nZXRDaGlsZHJlbihhY3QpOwotCQkJfQotCQl9Ci0JfQkJCi0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gYWN0aXZpdHkgb3IgYW55IG9mIGl0cyBzdWJhY3Rpdml0aWVzIGlzIGEgY29udHJpYnV0b3Igb3IgcmVwbGFjZXIKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdGl2aXR5KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChBY3Rpdml0eSlvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2VHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYoYmFzZSAhPSBudWxsICYmICh2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMgfHwgdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSkgewotLy8JCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLS8vCQkJCWlmKHByb2MgIT0gcHJvY2VzcykgewotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQkJfQotCQkJCQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RvcFByb2Nlc3MoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgUHJvY2VzcyAmJiAoKFByb2Nlc3MpdGFyZ2V0KS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3cERlc2NMaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcihDb2xsZWN0aW9uIGVsZW1lbnRzLCBXb3JrUHJvZHVjdCB3cCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpOwotCQkJCWlmKHdwZC5nZXRXb3JrUHJvZHVjdCgpID09IHdwKSB7Ci0JCQkJCXJldHVybiB3cGQ7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tEZXNjTGlzdAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFza0Rlc2NyaXB0b3IgZ2V0VGFza0Rlc2NyaXB0b3IoQ29sbGVjdGlvbiBlbGVtZW50cywgVGFzayB0YXNrKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBlOwotCQkJCWlmKHRkLmdldFRhc2soKSA9PSB0YXNrKSB7Ci0JCQkJCXJldHVybiB0ZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3duaW5nIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgb2YgYSB3b3JrIG9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrT3JkZXIKLQkgKiAgICAgICAgICAgIGEgd29yayBvcmRlcgotCSAqIEByZXR1cm4gYSB3b3JrIGJyZWFrZG93biBlbGVtZW50IHRoYXQgb3ducyB0aGUgd29yayBvcmRlciBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGdldE93bmVyKFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFN1Y2Nlc3Nvcih3b3JrT3JkZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBnZXRDb21wb3NlZFdyYXBwZXIoT2JqZWN0IG9iamVjdCkgewotCQl3aGlsZSghKG9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JCQkJJiYgb2JqZWN0IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCW9iamVjdCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRWYWx1ZSgpOwotCQl9Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBnaXZlbiBicmVha2Rvd24gc3RydWN0dXJlIGNvbHVtbiBJRC4gVGhlCi0JICogYnJlYWtkb3duIHN0cnVjdHVyZSBjb2x1bW4gSURzIGFyZSBkZWZpbmVkIGFzIGNvbnN0YW50cyBpbgotCSAqIHtAbGluayBJQlNJdGVtUHJvdmlkZXJ9IHRoYXQgc3RhcnQgd2l0aCBDT0xfCi0JICogCi0JICogQHBhcmFtIGNvbHVtbk5hbWUKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY29sdW1ucyBJRCBjb25zdGFudHMgKENPTF9YWFgpIGRlZmluZWQgaW4KLQkgKiAgICAgICAgICAgIHtAbGluayBJQlNJdGVtUHJvdmlkZXJ9Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldENvbHVtbkRpc3BsYXlOYW1lKFN0cmluZyBjb2x1bW5JZCkgewotCQl0cnkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiQlNfQ29sdW1uXyIgKyBjb2x1bW5JZCk7IC8vJE5PTi1OTFMtMSQgCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbklkOwotCX0KLQkKLQkKLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzIHVuZGVyIHNlbGVjdGVkIGFjdGl2aXRpZXMKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUYXNrRGVzY3JpcHRvcnMoTGlzdCBzZWxlY3Rpb24pIHsKLQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdG9yT2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoaXRvck9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCXx8IGl0b3JPYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcnMoYWRhcHRlckZhY3RvcnksIGl0b3JPYmosIHRhc2tEZXNjcmlwdG9ycyk7Ci0JCQl9Ci0JCQlpZiAoaXRvck9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yCi0JCQkJCXx8IGl0b3JPYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAoIXRhc2tEZXNjcmlwdG9ycy5jb250YWlucyhpdG9yT2JqKSkKLQkJCQkJdGFza0Rlc2NyaXB0b3JzLmFkZChpdG9yT2JqKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JzOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldFRhc2tEZXNjcmlwdG9ycyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IGFjdCwKLQkJCUxpc3QgdGFza0Rlc2NyaXB0b3JzKSB7Ci0JCU9iamVjdCBsaXN0ID0gbnVsbDsKLQkJaWYgKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCS8vIGdldCBjaGlsZHJlbgotCQkJbGlzdCA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0KTsKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWxpc3QgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGFjdCkuZ2V0Q2hpbGRyZW4oYWN0KTsKLQkJfQotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3QgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGxpc3Q7Ci0JCQlmb3IgKEl0ZXJhdG9yIGNoaWxkSXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNoaWxkSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNoaWxkSXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlnZXRUYXNrRGVzY3JpcHRvcnMoYWRhcHRlckZhY3RvcnksIG9iaiwgdGFza0Rlc2NyaXB0b3JzKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaWYgKCF0YXNrRGVzY3JpcHRvcnMuY29udGFpbnMob2JqKSkKLQkJCQkJCXRhc2tEZXNjcmlwdG9ycy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhIGRlc2NyaXB0b3Igb3IgaXRzIHdyYXBwZXIgb2Ygcm9sbGVkLXVwIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JvbGxlZFVwRGVzY3JpcHRvcihPYmplY3QgbywKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmKFRuZ1V0aWwudW53cmFwKG8pIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG8pOwotCQkJaWYoVG5nVXRpbC51bndyYXAocGFyZW50KSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJT2JqZWN0IHBhcmVudEFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJcmV0dXJuIHBhcmVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIgCi0JCQkJJiYgKChJQlNJdGVtUHJvdmlkZXIpcGFyZW50QWRhcHRlcikuaXNSb2xsZWRVcCgpOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLS8vCS8qKgotLy8JICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBhIHByb2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBwcm9jZXNzIHBhY2thZ2UuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBtb25pdG9yCi0vLwkgKiBAcGFyYW0gcHJvY2VzcwotLy8JICogQHByYXJtIG5ld1Byb2Nlc3NOYW1lCi0vLwkgKiBAcGFyYW0gZGVlcENvcHlDb25maWcKLS8vCSAqIEBwYXJhbSB0YXJnZXRQYWNrYWdlCi0vLwkgKiBAcmV0dXJuIFByb2Nlc3MgdGhlIG5ld2x5IGNyZWF0ZWQgcHJvY2VzcwotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBkZWVwQ29weSgKLS8vCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCAKLS8vCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MsIAotLy8JCQlTdHJpbmcgbmV3UHJvY2Vzc05hbWUsCi0vLwkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWcsIAotLy8JCQlQcm9jZXNzUGFja2FnZSB0YXJnZXRQYWNrYWdlKSB7Ci0vLwkJQ29weUhlbHBlciBoZWxwZXIgPSBuZXcgQ29weUhlbHBlcigpOwkKLS8vCQl0cnkgewotLy8JCQlyZXR1cm4gZGVlcENvcHkobW9uaXRvciwgcHJvY2VzcywgbmV3UHJvY2Vzc05hbWUsIGRlZXBDb3B5Q29uZmlnLCB0YXJnZXRQYWNrYWdlLCBoZWxwZXIpOwotLy8JCX0KLS8vCQlmaW5hbGx5IHsKLS8vCQkJaGVscGVyLmNsZWFyKCk7Ci0vLwkJfQotLy8JfQotCQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZGVlcENvcHkoCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MsIAotCQkJU3RyaW5nIG5ld1Byb2Nlc3NOYW1lLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZywgCi0JCQlQcm9jZXNzUGFja2FnZSB0YXJnZXRQYWNrYWdlLAotCQkJQ29weUhlbHBlciBjb3B5SGVscGVyLAotCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsJCQotCQkvLyBpZiB0aGUgdGFyZ2V0UGFja2FnZSBpcyBudWxsLCB1c2UgdGhlIHNhbWUgcGFja2FnZSBvZiB0aGUgc291cmNlIHByb2Nlc3MKLQkJaWYgKCB0YXJnZXRQYWNrYWdlID09IG51bGwgKSB7Ci0JCQl0YXJnZXRQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKXByb2Nlc3MuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKTsKLQkJfQotCQkKLQkJLy8JCW5ldyBkZWVwLWNvcGllZCBwcm9jZXNzJ3MgcmVmZXJlbmNlCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBuZXdQcm9jZXNzID0gbnVsbDsKLQkKLQkJaWYobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCi0JCVByb2Nlc3NEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IFByb2Nlc3NEZWVwQ29weUNvbW1hbmQocHJvY2VzcywgbmV3UHJvY2Vzc05hbWUsIAotCQkJCWNvcHlIZWxwZXIsIGRlZXBDb3B5Q29uZmlnLCB0YXJnZXRQYWNrYWdlLCBtb25pdG9yLGNvbmZpZ3VyYXRvcik7Ci0JCXRyeSB7Ci0JCQljbWQuZXhlY3V0ZSgpOwotCQkJQ29sbGVjdGlvbiByZXN1bHQgPSBjbWQuZ2V0UmVzdWx0KCk7Ci0JCQlpZighcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCW5ld1Byb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSByZXN1bHQudG9BcnJheSgpWzBdOwotCQkJCS8vIGZpeCBicmVha2Rvd24gZWxlbWVudCBvcmRlciBvZiBhbGwgYWN0aXZpdGllcwotCQkJCS8vCi0JCQkJZml4QnJlYWtkb253RWxlbWVudE9yZGVyUmVjdXJzaXZlbHkobmV3UHJvY2Vzcyk7CQotCQkJCWNtZC5jb3B5U3VwcHJlc3Npb25TdGF0ZXMoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWNtZC5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBuZXdQcm9jZXNzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWNjZXB0KEFjdGl2aXR5IGFjdCwgSUZpbHRlciBwcm9jZXNzRmlsdGVyLCBib29sZWFuIGNoZWNrT3duaW5nUHJvY2VzcykgewotCQlpZihwcm9jZXNzRmlsdGVyID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQlpZiAoYmFzZSA9PSBudWxsKQotCQl7Ci0JCQlpZihjaGVja093bmluZ1Byb2Nlc3MpIHsKLQkJCQlyZXR1cm4gcHJvY2Vzc0ZpbHRlci5hY2NlcHQoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZih0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTiB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkKLQkJewotCQkJLy8gY2hlY2sgb3duaW5nIHByb2Nlc3Mgb2YgYmFzZSBhY3Rpdml0eSBvbmx5IGZvciBleHRlbmRzIGFuZCBsb2NhbCBjb250cmlidXRpb24vcmVwbGFjZW1lbnQKLQkJCS8vCi0JCQlib29sZWFuIHJldDsKLQkJCWRvIHsKLQkJCQlyZXQgPSBwcm9jZXNzRmlsdGVyLmFjY2VwdChUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZSkpOwotCQkJCXR5cGUgPSBiYXNlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCWJhc2UgPSAoQWN0aXZpdHkpIGJhc2UuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJfSB3aGlsZSAocmV0Ci0JCQkJCSYmIGJhc2UgIT0gbnVsbAotCQkJCQkmJiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUwotCQkJCQkJCXx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTiB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFByb2Nlc3MgdG8gd2hpY2ggYW4gYWN0aXZpdHkgYmVsb25ncwotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0UHJvY2VzcyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KGFjdGl2aXR5KTsKLQkJaWYgKHByb2NDb21wICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJcmV0dXJuIHByb2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TZWN0aW9uTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1NlY3Rpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NzU4NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1NlY3Rpb25MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLlN0cmluZ1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBsb2dpY3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBhbGwKLSAqIGNvbnRyaWJ1dGVkL2luaGVyaXRlZCBzZWN0aW9ucyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBhcyB3ZWxsIGFzIGFsbG93cwotICogbWFuaXB1bGF0ZSB0aGlzIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uTGlzdCBleHRlbmRzIEJhc2ljRUxpc3Q8U2VjdGlvbj4gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU3Mjc5NzQ4NzA2OTIzM0w7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfSU5GT19OQU1FID0gInNlY3Rpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIERFRkFVTFRfU0FWRV9PUFRJT05TID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNURVBTX0ZPUl9FTEVNRU5UX09OTFkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RFUFNfRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMgPSAyOwotCi0Jc3RhdGljIHsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIkFTQ0lJIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGVkaXRFbGVtZW50OwotCi0JcHJpdmF0ZSBib29sZWFuIG1peGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuaXNDb250cmlidXRvcihlKTsKLQl9Ci0KLQlwdWJsaWMgU2VjdGlvbkxpc3QoQ29udGVudEVsZW1lbnQgZSwgaW50IHNjb3BlKSB7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJaWYgKHNjb3BlID09IFNURVBTX0ZPUl9FTEVNRU5UX09OTFkpIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoc2NvcGUgPT0gU1RFUFNfRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMpIHsKLQkJCWNhbGN1bGF0ZVBhcmVudHNPbmx5KGUpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQYXJlbnRzT25seShDb250ZW50RWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQkvLyBpZihpc0NvbnRyaWJ1dG9yKGUpKSB7Ci0JCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gY29udHJpYnV0aW5nIGlzCi0JCS8vIHRydWUiKTsKLQkJLy8gTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQkJLy8gc3VwZXJzLmFkZChlKTsKLQkJLy8gaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQkvLyB9IGVsc2UgaWYoaXNFeHRlbmRlZChlKSkgewotCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGV4dGVuZGluZyBpcwotCQkvLyB0cnVlIik7Ci0JCS8vIExpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBVbWFVdGlsLmdldEFsbFN1cGVycyhzdXBlcnMsIGUsIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJLy8gc3VwZXJzLmFkZChlKTsKLQkJLy8gaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQkvLyB9Ci0JCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IGlzRXh0ZW5kZWQoZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gY29udHJpYnV0aW5nIGlzCi0JCQkvLyB0cnVlIik7Ci0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzQm90aChzdXBlcnMsIGUsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJc3VwZXJzLmFkZChlKTsKLQkJCWl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWl4ZWQpIHsKLQkJCS8vIGNyZWF0ZSBhIG1hcCBvZiBHVUlEIC8gY29udHJpYnV0b3IKLQkJCS8vCi0JCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCQlNYXA8U3RyaW5nLCBTZWN0aW9uPiBndWlkU2VjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VjdGlvbj4oKTsKLQkJCVNldCBzZWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWxlbWVudCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCQkuZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJZ3VpZFNlY3Rpb25NYXAucHV0KHNlY3QuZ2V0R3VpZCgpLCBzZWN0KTsKLQkJCQkJCXNlY3RzLmFkZChzZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oZWxlbWVudCwKLQkJCQkJCU9SREVSX0lORk9fTkFNRSk7Ci0JCQkJaWYgKG9yZGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwKLQkJCQkJCQl8fCBvcmRlckluZm8uZ2V0VGltZXN0YW1wKCkgPiBsYXRlc3RJbmZvCi0JCQkJCQkJCQkuZ2V0VGltZXN0YW1wKCkpIHsKLQkJCQkJCWxhdGVzdEluZm8gPSBvcmRlckluZm87Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQkvLyByZW9yZGVyIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbGF0ZXN0IG9yZGVyIGluZm8KLQkJCQkvLwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZ3VpZCA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5nZXQoaSk7Ci0JCQkJCVNlY3Rpb24gc2VjdCA9IGd1aWRTZWN0aW9uTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKHNlY3QgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKHNlY3QpOwotCQkJCQkJc2VjdHMucmVtb3ZlKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKHNlY3RzKTsKLQkJfQotCX0KLQotCS8vIGRlcHJlY2F0ZSB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdG9yCi0JcHVibGljIFNlY3Rpb25MaXN0KENvbnRlbnRFbGVtZW50IGUpIHsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgVG5nVXRpbC5oYXNDb250cmlidXRvcihlKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBUbmdVdGlsLmdldEJhc2UoZSk7Ci0JCQlpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJhc2UpIHsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQl9IGVsc2UgaWYgKGlzRXh0ZW5kZWQoZSkpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGV4dGVuZGVkIGlzIHRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJc3VwZXJzLmFkZChlKTsKLQkJCWl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWl4ZWQpIHsKLQkJCS8vIGNyZWF0ZSBhIG1hcCBvZiBHVUlEIC8gY29udHJpYnV0b3IKLQkJCS8vCi0JCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCQlNYXA8U3RyaW5nLCBTZWN0aW9uPiBndWlkU2VjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VjdGlvbj4oKTsKLQkJCUxpc3Qgc2VjdHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGVsZW1lbnQpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWd1aWRTZWN0aW9uTWFwLnB1dChzZWN0LmdldEd1aWQoKSwgc2VjdCk7Ci0JCQkJCQlzZWN0cy5hZGQoc2VjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IFRuZ1V0aWwuZ2V0T3JkZXJJbmZvKGVsZW1lbnQsCi0JCQkJCQlPUkRFUl9JTkZPX05BTUUpOwotCQkJCWlmIChvcmRlckluZm8gIT0gbnVsbCkgewotCQkJCQlpZiAobGF0ZXN0SW5mbyA9PSBudWxsCi0JCQkJCQkJfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mbwotCQkJCQkJCQkJLmdldFRpbWVzdGFtcCgpKSB7Ci0JCQkJCQlsYXRlc3RJbmZvID0gb3JkZXJJbmZvOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobGF0ZXN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJLy8gcmVvcmRlciB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIGxhdGVzdCBvcmRlciBpbmZvCi0JCQkJLy8KLQkJCQlpbnQgc2l6ZSA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IGd1aWQgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlTZWN0aW9uIHNlY3QgPSBndWlkU2VjdGlvbk1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChzZWN0ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChzZWN0KTsKLQkJCQkJCXNlY3RzLnJlbW92ZShzZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChzZWN0cyk7Ci0JCX0KLQkJLy8gZWxzZSB7Ci0JCS8vIC8vIGFkZEFsbChlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKTsKLQkJLy8gbWl4ZWQgPSBmYWxzZTsKLQkJLy8gfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlZChDb250ZW50RWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUzsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHJlY2VudCBjaGFuZ2VzIGluIHRoZSBsaXN0Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoKSB7Ci0JCWlmICghbWl4ZWQgfHwgIWNoYW5nZWQpCi0JCQlyZXR1cm47Ci0KLQkJLy8gc2F2ZSB0aGUgb3JkZXIgaW5mbyB0byB0aGUgb3JkZXJpbmdHdWlkZSBvZiB0aGUgZWRpdEVsZW1lbnQKLQkJLy8KLQkJU3RyaW5nIHN0ciA9IGVkaXRFbGVtZW50LmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJT3JkZXJJbmZvQ29sbGVjdGlvbiBvcmRlckluZm9zID0gbnVsbDsKLQkJU3RyaW5nUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlvcmRlckluZm9zID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBuZXcgU3RyaW5nUmVzb3VyY2Uoc3RyKTsKLQkJCXRyeSB7Ci0JCQkJcmVzLmxvYWQobnVsbCk7Ci0JCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCQlvcmRlckluZm9zID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3JkZXJJbmZvcyA9IChPcmRlckluZm9Db2xsZWN0aW9uKSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSBvcmRlciBpbmZvciBmb3Igc2VjdGlvbnMKLQkJLy8KLQkJT3JkZXJJbmZvIHNlY3RPcmRlckluZm8gPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSAoT3JkZXJJbmZvKSBpdGVyLm5leHQoKTsKLQkJCWlmIChPUkRFUl9JTkZPX05BTUUuZXF1YWxzSWdub3JlQ2FzZShvcmRlckluZm8uZ2V0TmFtZSgpKSkgewotCQkJCXNlY3RPcmRlckluZm8gPSBvcmRlckluZm87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2VjdE9yZGVySW5mbyA9PSBudWxsKSB7Ci0JCQlzZWN0T3JkZXJJbmZvID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcmRlckluZm8oKTsKLQkJCXNlY3RPcmRlckluZm8uc2V0TmFtZShPUkRFUl9JTkZPX05BTUUpOwotCQkJb3JkZXJJbmZvcy5nZXRPcmRlckluZm9zKCkuYWRkKHNlY3RPcmRlckluZm8pOwotCQl9IGVsc2UgewotCQkJc2VjdE9yZGVySW5mby5nZXRHVUlEcygpLmNsZWFyKCk7Ci0JCX0KLQotCQlpbnQgc2l6ZSA9IHNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBnZXQoaSk7Ci0JCQlzZWN0T3JkZXJJbmZvLmdldEdVSURzKCkuYWRkKHNlY3QuZ2V0R3VpZCgpKTsKLQkJfQotCQlzZWN0T3JkZXJJbmZvLnNldFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgewotCQkJcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKG51bGwpOwotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG9yZGVySW5mb3MpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXMuc2F2ZShERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCQlzdHIgPSByZXMuZ2V0U3RyaW5nKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3Rpb25MaXN0LmFwcGx5KCk6IG5ldyBvcmRlcmluZyBndWlkZSIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0gb3JkZXJpbmdHdWlkZSBzdGFydCAtLS0tLS0iKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0gb3JkZXJpbmdHdWlkZSBlbmQgLS0tLS0tIik7Ci0JCQllZGl0RWxlbWVudC5zZXRPcmRlcmluZ0d1aWRlKHN0cik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlbW92ZShTZWN0aW9uIHNlY3Rpb24pIHsKLQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGVkaXRFbGVtZW50KSkgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpID09IHNlY3Rpb24uZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU2VjdGlvbiByZW1vdmUoaW50IGluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJaWYgKCFjYW5SZW1vdmUoKFNlY3Rpb24pIGdldChpbmRleCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJU2VjdGlvbiByZW1vdmVkID0gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKHJlbW92ZWQpOwotCQkJcmV0dXJuIHJlbW92ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCWlmICghY2FuUmVtb3ZlKChTZWN0aW9uKSBvKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoc3VwZXIucmVtb3ZlKG8pKSB7Ci0JCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUobyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGMpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCQlJdGVyYXRvciBlID0gaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvID0gZS5uZXh0KCk7Ci0JCQkJaWYgKGMuY29udGFpbnMobykgJiYgY2FuUmVtb3ZlKChTZWN0aW9uKSBvKSkgewotCQkJCQllLnJlbW92ZSgpOwotCQkJCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShvKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZUFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFNlY3Rpb24gZWxlbWVudCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZChlbGVtZW50KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKFNlY3Rpb24gbykgewotCQlib29sZWFuIGIgPSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZChvKTsKLQkJaWYgKG1peGVkKSB7Ci0JCQliID0gc3VwZXIuYWRkKG8pOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPiBjKSB7Ci0JCWJvb2xlYW4gYiA9IGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkQWxsKGMpOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGRBbGwoYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPiBjKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoYyk7Ci0JCQlib29sZWFuIGIgPSBzdXBlci5hZGRBbGwoaW5kZXgsIGMpOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkQWxsKGluZGV4LCBjKTsKLQl9Ci0KLQlwdWJsaWMgU2VjdGlvbiBzZXQoaW50IGluZGV4LCBTZWN0aW9uIGVsZW1lbnQpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChtaXhlZCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZShpbnQgaW5kZXgsIFNlY3Rpb24gb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIubW92ZShpbmRleCwgb2JqZWN0KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJKChFTGlzdCkgZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKSkubW92ZShpbmRleCwKLQkJCQkJb2JqZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBTZWN0aW9uIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlTZWN0aW9uIG1vdmVkID0gc3VwZXIubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlyZXR1cm4gbW92ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChFTGlzdDxTZWN0aW9uPikgZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKSkubW92ZSgKLQkJCQkJdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBTZWN0aW9uIGdldChpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmdldChpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLnNpemUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnNpemUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zQWxsKGNvbGxlY3Rpb24pOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWluc0FsbCgKLQkJCQljb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIudG9BcnJheShhcnJheSk7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnRvQXJyYXkoYXJyYXkpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5pbmRleE9mKG9iamVjdCk7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNaXhlZCgpIHsKLQkJcmV0dXJuIG1peGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdGVwTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N0ZXBMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTBlYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N0ZXBMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogUmVvcmRlciBzdGVwcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RlcExpc3QgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU3NTY3MzI1ODQ5ODU4ODcxTDsKLQotCXByaXZhdGUgc3RhdGljIERlc2NyaWJhYmxlRWxlbWVudCBnZXREZXNjcmliYWJsZUVsZW1lbnQoU2VjdGlvbiBzdGVwKSB7Ci0JCXJldHVybiAoRGVzY3JpYmFibGVFbGVtZW50KSBzdGVwLmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYXNrIGN1cnJlbnRUYXNrOwotCi0JcHJpdmF0ZSBMaW5rZWRMaXN0IHN0ZXBMaXN0czsKLQotCXB1YmxpYyBTdGVwTGlzdChUYXNrIGN1cnJlbnRUYXNrLCBMaXN0IHN0ZXBMaXN0cykgewotCQl0aGlzLmN1cnJlbnRUYXNrID0gY3VycmVudFRhc2s7Ci0JCXRoaXMuc3RlcExpc3RzID0gbmV3IExpbmtlZExpc3Qoc3RlcExpc3RzKTsKLQkJcmVvcmRlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW9yZGVyKCkgewotCQlNYXAgb3duZXJTZWN0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWludCBzaXplID0gc3RlcExpc3RzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUVjb3JlRUxpc3QgZUxpc3QgPSAoRWNvcmVFTGlzdCkgc3RlcExpc3RzLmdldChpKTsKLQkJCW93bmVyU2VjdGlvbnNNYXAucHV0KGVMaXN0LmdldE5vdGlmaWVyKCksIGVMaXN0KTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHN0ZXBMaXN0cykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaXN0IHN0ZXBMaXN0ID0gKExpc3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFzdGVwTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlTZWN0aW9uIHN0ZXAgPSAoU2VjdGlvbikgc3RlcExpc3QuZ2V0KDApOwotCQkJCVNlY3Rpb24gcHJlZCA9IHN0ZXAuZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCQlpZiAocHJlZCA9PSBudWxsKSB7Ci0JCQkJCUxpc3Qgb2xkRmlyc3RMaXN0ID0gKExpc3QpIHN0ZXBMaXN0cy5nZXQoMCk7Ci0KLQkJCQkJLy8gcHV0IHRoaXMgc3RlcCBsaXN0IGF0IGJlZ2lubmluZwotCQkJCQkvLwotCQkJCQlzdGVwTGlzdHMucmVtb3ZlKHN0ZXBMaXN0KTsKLQkJCQkJc3RlcExpc3RzLmFkZCgwLCBzdGVwTGlzdCk7Ci0KLQkJCQkJLy8gc2V0IHRoaXMgc3RlcCBsaXN0IHRvIGJlIHRoZSBwcmVkZWNlc3NvciBvZiB0aGUgcHJldmlvdXMKLQkJCQkJLy8gZmlyc3QgbGlzdAotCQkJCQkvLwotCQkJCQlpZiAoIW9sZEZpcnN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCVNlY3Rpb24gb2xkRmlyc3RTdGVwID0gKFNlY3Rpb24pIG9sZEZpcnN0TGlzdC5nZXQoMCk7Ci0JCQkJCQlpZiAoVG5nVXRpbC5jYW5SZWZlcmVuY2UoCi0JCQkJCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudChvbGRGaXJzdFN0ZXApLAotCQkJCQkJCQlnZXREZXNjcmliYWJsZUVsZW1lbnQoc3RlcCkpKSB7Ci0JCQkJCQkJb2xkRmlyc3RTdGVwLnNldFByZWRlY2Vzc29yKHN0ZXApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlzdCBwcmVkTGlzdCA9IChMaXN0KSBvd25lclNlY3Rpb25zTWFwLmdldChwcmVkCi0JCQkJCQkJLmVDb250YWluZXIoKSk7Ci0JCQkJCXN0ZXBMaXN0cy5yZW1vdmUocHJlZExpc3QpOwotCQkJCQlpbnQgaWQgPSBzdGVwTGlzdHMuaW5kZXhPZihzdGVwTGlzdCk7Ci0JCQkJCXN0ZXBMaXN0cy5hZGQoaWQsIHByZWRMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgcmVhc3NpZ25QcmVkZWNlc3NvcnMoKSB7Ci0JLy8KLQkvLyB9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTdGVwcygpIHsKLQkJTGlzdCBhbGxTdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IHNpemUgPSBzdGVwTGlzdHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBzdGVwTGlzdHMuZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWxsU3RlcHMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZVVwKFNlY3Rpb24gc3RlcCkgewotCQlMaXN0IHN0ZXBzID0gY3VycmVudFRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKTsKLQkJaW50IGlkID0gc3RlcHMuaW5kZXhPZihzdGVwKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaWQgPiAwKSB7Ci0JCQlpZiAoaWQgPT0gMSkgewotCi0JCQl9Ci0JCQkvLyBtb3ZlIHRoZSBzdGVwIHdpdGhpbiBpdHMgbGlzdAotCQkJLy8KLQkJCUNvbGxlY3Rpb25zLnN3YXAoc3RlcHMsIGlkIC0gMSwgaWQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gbW92ZSB0aGUgd2hvbGUgc3RlcCBsaXN0IHVwCi0JCS8vCi0JCWlkID0gc3RlcExpc3RzLmluZGV4T2Yoc3RlcHMpOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3QgcHJlZExpc3QgPSBudWxsOwotCQlpbnQgcHJlZExpc3RJZCA9IGlkIC0gMTsKLQkJLy8gbG9vayBmb3Igbm9uLWVtcHR5IHByZWRlY2Vzc29yIGxpc3QKLQkJLy8KLQkJZmluZF9wcmVkTGlzdDogZm9yICg7IHByZWRMaXN0SWQgPiAtMTsgcHJlZExpc3RJZC0tKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgc3RlcExpc3RzLmdldChwcmVkTGlzdElkKTsKLQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlwcmVkTGlzdCA9IGxpc3Q7Ci0JCQkJYnJlYWsgZmluZF9wcmVkTGlzdDsKLQkJCX0KLQkJfQotCQlTZWN0aW9uIG9sZFByZWQgPSAoKFNlY3Rpb24pIHN0ZXBzLmdldCgwKSkuZ2V0UHJlZGVjZXNzb3IoKTsKLQkJTGlzdCBvbGRTdWNjZXNzb3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0U3VjY2Vzc29ycygoU2VjdGlvbikgc3RlcHMKLQkJCQkuZ2V0KHN0ZXBzLnNpemUoKSAtIDEpKTsKLQkJaWYgKHByZWRMaXN0ICE9IG51bGwpIHsKLQkJCXN0ZXBMaXN0cy5yZW1vdmUoc3RlcHMpOwotCQkJc3RlcExpc3RzLmFkZChwcmVkTGlzdElkLCBzdGVwcyk7Ci0JCQlTZWN0aW9uIGxhc3QgPSAoU2VjdGlvbikgcHJlZExpc3QuZ2V0KHByZWRMaXN0LnNpemUoKSAtIDEpOwotCQkJTGlzdCBvbGRQcmVkU3VjY2Vzc29ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFN1Y2Nlc3NvcnMobGFzdCk7Ci0JCQlpZiAoVG5nVXRpbC5jYW5SZWZlcmVuY2UoY3VycmVudFRhc2ssIGdldERlc2NyaWJhYmxlRWxlbWVudChsYXN0KSkpIHsKLQkJCQlzdGVwLnNldFByZWRlY2Vzc29yKGxhc3QpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFByZWRTdWNjZXNzb3JzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJc2VjdC5zZXRQcmVkZWNlc3NvcihzdGVwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGVwTGlzdHMuYWRkKDAsIHN0ZXBzKTsKLQkJfQotCQlEZXNjcmliYWJsZUVsZW1lbnQgb2xkUHJlZFRhc2sgPSBnZXREZXNjcmliYWJsZUVsZW1lbnQob2xkUHJlZCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFN1Y2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoVG5nVXRpbC5jYW5SZWZlcmVuY2UoZ2V0RGVzY3JpYmFibGVFbGVtZW50KHNlY3QpLCBvbGRQcmVkVGFzaykpIHsKLQkJCQlzZWN0LnNldFByZWRlY2Vzc29yKG9sZFByZWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZURvd24oU2VjdGlvbiBzdGVwKSB7Ci0JCUxpc3Qgc3RlcHMgPSBjdXJyZW50VGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCQlpbnQgaWQgPSBzdGVwcy5pbmRleE9mKHN0ZXApOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpZCA8IHN0ZXBzLnNpemUoKSAtIDEpIHsKLQkJCS8vIG1vdmUgdGhlIHN0ZXAgd2l0aGluIGl0cyBsaXN0Ci0JCQkvLwotCQkJQ29sbGVjdGlvbnMuc3dhcChzdGVwcywgaWQgKyAxLCBpZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBtb3ZlIHRoZSB3aG9sZSBzdGVwIGxpc3QgdXAKLQkJLy8KLQkJaWQgPSBzdGVwTGlzdHMuaW5kZXhPZihzdGVwcyk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJTGlzdCBzdWNjTGlzdCA9IG51bGw7Ci0JCWludCBzdWNjTGlzdElkID0gaWQgKyAxOwotCQlpbnQgc2l6ZSA9IHN0ZXBMaXN0cy5zaXplKCk7Ci0KLQkJLy8gbG9vayBmb3Igbm9uLWVtcHR5IHN1Y2Nlc3NvciBsaXN0Ci0JCS8vCi0JCWZpbmRfTGlzdDogZm9yICg7IHN1Y2NMaXN0SWQgPCBzaXplOyBzdWNjTGlzdElkKyspIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBzdGVwTGlzdHMuZ2V0KHN1Y2NMaXN0SWQpOwotCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCXN1Y2NMaXN0ID0gbGlzdDsKLQkJCQlicmVhayBmaW5kX0xpc3Q7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN1Y2NMaXN0ICE9IG51bGwpIHsKLQkJCXN0ZXBMaXN0cy5yZW1vdmUoc3VjY0xpc3QpOwotCQkJc3RlcExpc3RzLmFkZChpZCwgc3VjY0xpc3QpOwotCQl9IGVsc2UgewotCQkJc3RlcExpc3RzLmFkZChzdGVwcyk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N1cHByZXNzaW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3VwcHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjZjI3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3VwcHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FsY3VsYXRlcyB0aGUgc3VwcHJlc3Npb24gc3RhdGUsIGJvdGggZGlyZWN0IGFuZCBpbmRpcmVjdCwgb2YgYW55Ci0gKiBicmVha2Rvd24gZWxlbWVudCBvciBpdHMgd3JhcHBlciBpbiB0aGUgc3BlY2lmaWVkIHByb2Nlc3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBwcmVzc2lvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQlMgPSAid2JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEJTID0gInRicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQQlMgPSAid3BicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENCUyA9ICJjYnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgcHJvY1RvU3VwcHJlc3Npb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhdXRvSW5oZXJpdEludGVybWVkaWF0ZVN1cHByZXNzaW9uU3RhdGUgPSB0cnVlOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgcHJvY2VzczsKLQotCXByaXZhdGUgU2V0IHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRoczsKLQotCXByaXZhdGUgYm9vbGVhbiBtb2RpZmllZDsKLQotCXByaXZhdGUgU2V0IGludGVybmFsVW5zdXBwcmVzc2VkRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGNsZWFyQ2FjaGVkU3VwcHJlc3Npb25zKCkgewotCQlwcm9jVG9TdXBwcmVzc2lvbk1hcC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgc3VwcHJlc3Npb25zIG9mIGludmFsaWQgcHJvY2Vzc2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGNsZWFuVXAoKSB7Ci0JCUFycmF5TGlzdCBsaXN0VG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QocHJvY1RvU3VwcHJlc3Npb25NYXAua2V5U2V0KCkpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHByb2MuZUlzUHJveHkoKSkgewotCQkJCWxpc3RUb1JlbW92ZS5hZGQocHJvYyk7Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBsaXN0VG9SZW1vdmUuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcHJvY1RvU3VwcHJlc3Npb25NYXAucmVtb3ZlKGxpc3RUb1JlbW92ZS5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldEF1dG9Jbmhlcml0U3VwcHJlc3Npb25TdGF0ZXMoYm9vbGVhbiBiKSB7Ci0JCWF1dG9Jbmhlcml0SW50ZXJtZWRpYXRlU3VwcHJlc3Npb25TdGF0ZSA9IGI7Ci0JfQotCi0JcHVibGljIFN1cHByZXNzaW9uKFByb2Nlc3MgcHJvY2VzcykgewotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCQlzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPSBsb2FkU3VwcHJlc3NlZEVsZW1lbnRQYXRocygpOwotCX0KLQotCXB1YmxpYyBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCXByaXZhdGUgU2V0IGxvYWRTdXBwcmVzc2VkRWxlbWVudFBhdGhzKCkgewotCQlDb25zdHJhaW50IHJ1bGUgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KHByb2Nlc3MsCi0JCQkJQ29uc3RyYWludE1hbmFnZXIuUFJPQ0VTU19TVVBQUkVTU0lPTiwgZmFsc2UpOyAvLyAoQ29uc3RyYWludCkKLQkJLy8gcHJvY2Vzcy5nZXRPd25lZFJ1bGVzKCkuZ2V0KDApOwotCQlpZiAocnVsZSAhPSBudWxsICYmIHJ1bGUuZ2V0Qm9keSgpLmxlbmd0aCgpID4gMCkgewotCQkJU2V0IHBhdGhzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocnVsZS5nZXRCb2R5KCkpOyB0b2tlbnMKLQkJCQkJLmhhc01vcmVUb2tlbnMoKTspIHsKLQkJCQlwYXRocy5hZGQodG9rZW5zLm5leHRUb2tlbigpKTsKLQkJCX0KLQkJCXJldHVybiBwYXRoczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFNldCBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKSB7Ci0JCWlmIChzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPT0gbnVsbCkgewotCQkJc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID0gbG9hZFN1cHByZXNzZWRFbGVtZW50UGF0aHMoKTsKLQkJCWlmIChzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPT0gbnVsbCkgewotCQkJCXN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRoczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3VwcHJlc3NlZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmIChpc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJaWYgKGlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHNlbGVjdGlvbiBoYXMgYW55IGVsZW1lbnQgdGhhdCBpcyBub3Qgc3VwcHJlc3NlZCB5ZXQKLQkgKiBpbiB0aGlzIHN1cHByZXNzaW9uJ3MgcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU3VwcHJlc3MoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGNhbkRvKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBzZWxlY3Rpb24gaGFzIGFueSBlbGVtZW50IHRoYXQgaXMgc3VwcHJlc3NlZCBpbiB0aGlzCi0JICogc3VwcHJlc3Npb24ncyBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXZlYWwoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGNhbkRvKHNlbGVjdGlvbiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIGl0ZW1zIGZyb20gdGhlIGdpdmVuIHNlbGVjdGlvbiB0aGF0IGNhbiBiZSBzdXBwcmVzc2VkL3JldmVhbGVkCi0JICogKGRlcGVuZGluZyBvbiB0aGUgPGNvZGU+c3VwcHJlc3NlZDwvY29kZT4gcGFyYW1ldGVyKQotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0QXBwbGljYWJsZUl0ZW1zKENvbGxlY3Rpb24gc2VsZWN0aW9uLAotCQkJYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCUFycmF5TGlzdCBhcHBsaWNhYmxlSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJaWYgKGlzSW5TdXBwcmVzc2VkTGlzdCh3cmFwcGVyKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQlhcHBsaWNhYmxlSXRlbXMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJJiYgKChNZXRob2RFbGVtZW50KSBlKS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQlhcHBsaWNhYmxlSXRlbXMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCWFwcGxpY2FibGVJdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhcHBsaWNhYmxlSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIHZhbGlkIHRvIHN1cHByZXNzL3JldmVhbCB1cG9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gZG9uJ3Qgc2hvdyBzdXBwcmVzcy9yZXZlYWwgZm9yIHJvbGVkZXNjcmlwdG9yIHVuZGVyIHRlYW0sIHdvcmsKLQkJLy8gcHJvZHVjdCBkZXNjcmlwdG9yIHVuZGVyIGRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdCwKLQkJLy8gYW5kIHJvbGxlZC11cCBpdGVtCi0JCS8vCi0JCUJyZWFrZG93bkVsZW1lbnQgb2JqID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCWlmICh3cmFwcGVyLmlzUm9sbHVwQ2hpbGQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCW9iaiA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCW9iaiA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50OwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWlmIChvYmouZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbAotCQkJCQl8fCBvYmouZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhhcyBhbnkgaXRlbSB0aGF0IGNhbiBiZQotCSAqIHN1cHByZXNzZWQvcmV2ZWFsZWQgKGRlcGVuZGluZyBvbiB0aGUgPGNvZGU+c3VwcHJlc3NlZDwvY29kZT4KLQkgKiBwYXJhbWV0ZXIpCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5EbyhDb2xsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoaXNWYWxpZChlbGVtZW50KSkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlpZiAoaXNJblN1cHByZXNzZWRMaXN0KHdyYXBwZXIpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkJJiYgKChNZXRob2RFbGVtZW50KSBlKS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEEgYnJlYWtkb3duIGVsZW1lbnQgaXMgc3VwcHJlc3NlZCBpZiBpdHNlbGYgb3IgYW55IG9mIGl0cyBwYXJlbnQgYWN0aXZpdHkKLQkgKiBpcyBzdXBwcmVzc2VkCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIF9faXNTdXBwcmVzc2VkKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZChlLCB0cnVlLCBudWxsKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaXJlY3RseVN1cHByZXNzZWQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCUJvb2xlYW4gYiA9IGUuZ2V0U3VwcHJlc3NlZCgpOwotCQlpZiAoYiAhPSBudWxsICYmIGIuYm9vbGVhblZhbHVlKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUwotCQkJCQl8fCB2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBpc0RpcmVjdGx5U3VwcHJlc3NlZCh2ZQotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdXBwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50IHRoYXQgbWFkZSB0aGUgZ2l2ZW4gYnJlYWtkb3duCi0JICogZWxlbWVudCBiZWNvbWUgc3VwcHJlc3NlZC4gVGhpcyBtZXRob2Qgd2lsbCBjaGVjayB0aGUgc3VwcHJlc3Npb24gc3RhdGUKLQkgKiBvZiB0aGUgcGFyZW50IHVwdG8gdGhlIHNwZWNpZmllZCA8Y29kZT50b3A8L2NvZGU+IG9ubHkgaWYKLQkgKiA8Y29kZT5jaGVja1BhcmVudDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIEl0IHdpbGwgbm90IGNoZWNrIHRoZQotCSAqIHN1cHByZXNzaW9uIHN0YXRlIG9mIDxjb2RlPnRvcDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBCcmVha2Rvd25FbGVtZW50IGdldFN1cHByZXNzZWQoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJYm9vbGVhbiBjaGVja1BhcmVudCwgT2JqZWN0IHRvcCkgewotCQlpZiAoZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCXJldHVybiBlOwotCQl9Ci0KLQkJaWYgKGNoZWNrUGFyZW50KSB7Ci0JCQlmb3IgKEJyZWFrZG93bkVsZW1lbnQgYmUgPSBlOyBiZSAhPSB0b3AKLQkJCQkJJiYgYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgIT0gbnVsbDspIHsKLQkJCQliZSA9IGJlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCWlmIChiZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJcmV0dXJuIGJlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgbmVzdGVkIGFydGlmYWN0IGRlc2NyaXB0b3JzIGFuZCBkZWxpdmVyYWJsZQotCQkJLy8gcGFydHMKLQkJCS8vCi0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkvLyBsb29rIGZvciBwYXJlbnQgYXJ0aWZhY3QgZGVzY3JpcHRvciBpbiB0aGUgc2FtZSBhY3Rpdml0eQotCQkJCQkvLyBhbmQgY2hlY2sgdGhlaXIgc3VwcHJlc3Npb24gc3RhdGUKLQkJCQkJLy8KLQkJCQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShlKTsKLQkJCQkJaWYgKGFjdCAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCAhPSBlCi0JCQkJCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0IG90aGVyV3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJCQkJaWYgKG90aGVyV3AgaW5zdGFuY2VvZiBBcnRpZmFjdAotCQkJCQkJCQkJCSYmIFVtYVV0aWwuaXNDb250YWluZWRCeSh3cCwgb3RoZXJXcCkKLQkJCQkJCQkJCQkmJiB3cGQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gd3BkOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh3cERlc2MgIT0gdG9wICYmIHdwRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCUxpc3QgbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMod3BEZXNjKTsKLQkJCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJCS8vIHRoaXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgYSBkZWxpdmVyYWJsZSBwYXJ0IG9mCi0JCQkJCQkvLyBhIGRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JCQkJCQkvLyBjaGVjayB0aGUgc3VwcHJlc3Npb24gc3RhdGUgb2YgdGhlIGRlbGl2ZXJhYmxlIHdvcmsKLQkJCQkJCS8vIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkJCQkJLy8KLQkJCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBsaXN0LmdldCgwKSwKLQkJCQkJCQkJY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciB0ZWFtIHByb2ZpbGUgb3duIHJvbGUgZGVzY3JpcHRvcgotCQkJLy8KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0VGVhbVByb2ZpbGVzKChSb2xlRGVzY3JpcHRvcikgZSk7Ci0JCQkJCWlmIChsaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBsaXN0LmdldCgwKTsKLQkJCQkJCWlmICh0ZWFtICE9IHRvcCAmJiB0ZWFtICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCh0ZWFtLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHN1YiB0ZWFtIHByb2ZpbGUKLQkJCS8vCi0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlpZiAoZS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCVRlYW1Qcm9maWxlIHN1cGVyVGVhbSA9ICgoVGVhbVByb2ZpbGUpIGUpLmdldFN1cGVyVGVhbSgpOwotCQkJCQlpZiAoc3VwZXJUZWFtICE9IHRvcCAmJiBzdXBlclRlYW0gIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoc3VwZXJUZWFtLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5TdXBwcmVzc2VkTGlzdCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB3cmFwcGVyJ3MgcGF0aCBpcyBpbiBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgc2V0Ci0JCS8vCi0JCVN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkJcmV0dXJuIHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocy5jb250YWlucyhwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdXBwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50IHRoYXQgbWFkZSB0aGUgZ2l2ZW4gd3JhcHBlciBiZWNvbWUKLQkgKiBzdXBwcmVzc2VkCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGdldFN1cHByZXNzZWQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiB3cmFwcGVyIGJlY29tZQotCSAqIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIGJvb2xlYW4gY2hlY2tCYXNlKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIGNoZWNrQmFzZSwgdHJ1ZSwKLQkJCQlhdXRvSW5oZXJpdEludGVybWVkaWF0ZVN1cHByZXNzaW9uU3RhdGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiB3cmFwcGVyIGJlY29tZQotCSAqIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIGJvb2xlYW4gY2hlY2tCYXNlLAotCQkJYm9vbGVhbiBjaGVja0xvY2FsLCBib29sZWFuIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIGNoZWNrQmFzZSwgY2hlY2tMb2NhbCwKLQkJCQlpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGdldFN1cHByZXNzZWQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBib29sZWFuIGNoZWNrQmFzZSwKLQkJCWJvb2xlYW4gY2hlY2tMb2NhbCwgYm9vbGVhbiBpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwKLQkJCWJvb2xlYW4gY2hlY2tQYXJlbnQsIE9iamVjdCB0b3ApIHsKLQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkvLyB0aGlzIGlzIGEgd3JhcHBlciBvZiBsb2NhbCBlbGVtZW50Ci0JCQkvLwotCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoZSwgY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgYmFzZSBicmVha2Rvd24gZWxlbWVudCBpcyBzdXBwcmVzc2VkLCBkaXJlY3RseSBvcgotCQkvLyBpbmRpcmVjdGx5LCBpbiBpdHMgb3duIHByb2Nlc3MKLQkJLy8KLQkJaWYgKGNoZWNrQmFzZSkgewotCQkJQnJlYWtkb3duRWxlbWVudCBzdXBwcmVzc2VkID0gZ2V0U3VwcHJlc3NlZChlLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCWlmIChzdXBwcmVzc2VkICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwcHJlc3NlZDsKLQkJCX0KLQkJfQotCi0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoY2hlY2tMb2NhbCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHdyYXBwZXIgaXMgc3VwcHJlc3NlZCBpbiB0aGlzIHByb2Nlc3MKLQkJCS8vCi0JCQlpZiAoaXNJblN1cHByZXNzZWRMaXN0KHdyYXBwZXIpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSBhbnkgbG9jYWwgcGFyZW50IGlzIHN1cHByZXNzZWQKLQkJCS8vCi0JCQlpZiAoY2hlY2tQYXJlbnQpIHsKLQkJCQlwYXJlbnQgPSB3cmFwcGVyLmdldFBhcmVudCh3cmFwcGVyKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCAmJiBwYXJlbnQgIT0gdG9wKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgc3VwcHJlc3NlZCA9IGdldFN1cHByZXNzZWQoCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCwgY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCQkJCWlmIChzdXBwcmVzc2VkICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBzdXBwcmVzc2VkOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIHN1cHByZXNzZWQgaW4gb25lIG9mIHRoZSBpbW1lZGlhdGUKLQkJLy8gYmFzZSBwcm9jZXNzCi0JCS8vCi0JCWlmIChpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSkgewotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpOwotCQkJQWN0aXZpdHkgaW5oZXJpdG9yID0gUHJvY2Vzc1V0aWwuZ2V0SW5oZXJpdG9yKHdyYXBwZXIpOwotCQkJQnJlYWtkb3duRWxlbWVudCBiYXNlID0gKEJyZWFrZG93bkVsZW1lbnQpIGluaGVyaXRvcgotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCVByb2Nlc3MgaW1tZWRpYXRlQmFzZVByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZSk7Ci0JCQkJaWYgKHByb2MgIT0gaW1tZWRpYXRlQmFzZVByb2MpIHsKLQkJCQkJLy8gZmluZCB0aGUgb2JqZWN0IGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIG9mIHRoZQotCQkJCQkvLyBpbW1lZGlhdGUKLQkJCQkJLy8gYmFzZSBwcm9jZXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgc2FtZSBicmVha2Rvd24gZWxlbWVudAotCQkJCQkvLwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW5oZXJpdG9yLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJQXJyYXlMaXN0IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFBhcmVudExpc3QoaW5oZXJpdG9yLCB3cmFwcGVyKSk7Ci0JCQkJCW9iamVjdHMuYWRkKGUpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgd3JhcHBlcgotCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChvYmplY3QsCi0JCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWZpbmRfY2hpbGQ6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVyCi0JCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50ID09IFRuZ1V0aWwudW53cmFwKGNoaWxkKSkgewotCQkJCQkJCQlvYmplY3QgPSBjaGlsZDsKLQkJCQkJCQkJYnJlYWsgZmluZF9jaGlsZDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IGdldFN1cHByZXNzaW9uKGltbWVkaWF0ZUJhc2VQcm9jKTsKLQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IHN1cHByZXNzaW9uLmdldFN1cHByZXNzZWQoCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0LAotCQkJCQkJCQlmYWxzZSwgdHJ1ZSwgaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUsCi0JCQkJCQkJCWNoZWNrUGFyZW50LCBUbmdVdGlsLnVud3JhcChvYmplY3QpKTsKLQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZSBhbnkgaW5oZXJpdGVkIHBhcmVudCBpcyBzdXBwcmVzc2VkCi0JCS8vCi0JCWlmIChjaGVja1BhcmVudCkgewotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gd3JhcHBlci5nZXRQYXJlbnQod3JhcHBlcik7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJJiYgVG5nVXRpbC51bndyYXAocGFyZW50KSAhPSB0b3ApIHsKLQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCgKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgcGFyZW50LAotCQkJCQkJY2hlY2tCYXNlLCB0cnVlLCBpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwgY2hlY2tQYXJlbnQsCi0JCQkJCQl0b3ApOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2FjaGVkIHN1cHByZXNzaW9uIGZvciB0aGUgZ2l2ZW4gcHJvY2VzcyBpZiBvbmUgZXhpc3RzIG9yCi0JICogY3JlYXRlcyBuZXcgb25lCi0JICogCi0JICogQHBhcmFtIGltbWVkaWF0ZUJhc2VQcm9jCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKSB7Ci0JCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gKFN1cHByZXNzaW9uKSBwcm9jVG9TdXBwcmVzc2lvbk1hcC5nZXQocHJvYyk7Ci0JCWlmIChzdXBwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHByb2NUb1N1cHByZXNzaW9uTWFwKSB7Ci0JCQkJc3VwcHJlc3Npb24gPSAoU3VwcHJlc3Npb24pIHByb2NUb1N1cHByZXNzaW9uTWFwLmdldChwcm9jKTsKLQkJCQlpZiAoc3VwcHJlc3Npb24gPT0gbnVsbCkgewotCQkJCQlzdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQkJcHJvY1RvU3VwcHJlc3Npb25NYXAucHV0KHByb2MsIHN1cHByZXNzaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24gc3VwKSB7Ci0JCXByb2NUb1N1cHByZXNzaW9uTWFwLnB1dChzdXAuZ2V0UHJvY2VzcygpLCBzdXApOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gX19pc1N1cHByZXNzZWQoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCh3cmFwcGVyKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVUb01vZGVsKCkgewotCQlpZiAoc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBwYXRocyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1ZhbGlkKHBhdGgpKSB7Ci0JCQkJcGF0aHMuYXBwZW5kKHBhdGgpLmFwcGVuZCgnICcpOwotCQkJfQotCQl9Ci0KLQkJQ29uc3RyYWludCBydWxlID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChwcm9jZXNzLAotCQkJCUNvbnN0cmFpbnRNYW5hZ2VyLlBST0NFU1NfU1VQUFJFU1NJT04sIHRydWUpOwotCQkvLyBpZihwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5pc0VtcHR5KCkpIHsKLQkJLy8gcnVsZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKTsKLQkJLy8gcHJvY2Vzcy5nZXRPd25lZFJ1bGVzKCkuYWRkKHJ1bGUpOwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQkvLyBydWxlID0gKENvbnN0cmFpbnQpIHByb2Nlc3MuZ2V0T3duZWRSdWxlcygpLmdldCgwKTsKLQkJLy8gfQotCQkvLwkJCi0JCXJ1bGUuc2V0Qm9keShwYXRocy50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhdGggaXMgdmFsaWQgaW4gcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBwYXRoKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHBhdGgpOwotCQlTdHJpbmcgdHlwZSA9IHVyaS5zY2hlbWUoKTsKLQkJQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmIChXQlMuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChUQlMuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChXUEJTLmVxdWFscyh0eXBlKSkgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSBpZiAoQ0JTLmVxdWFscyh0eXBlKSkgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyB1c2UgcHJvY2VzcydzIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZQotCQkvLwotCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBudWxsOwotCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCk7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQljb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcikgYWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCk7Ci0JCQljdXJyZW50Q29uZmlnID0gY29uZmlndXJhdG9yLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyBndWlkID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYgKCFwcm9jZXNzLmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlPYmplY3Qgb2JqZWN0ID0gcHJvY2VzczsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpLnNlZ21lbnRDb3VudCgpOyBpKyspIHsKLQkJCQlndWlkID0gdXJpLnNlZ21lbnQoaSk7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJCWFkYXB0ZXIgPSBudWxsOwotCQkJCWZpbmRfYWRhcHRlcjogd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCQlvYmplY3QgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlpZiAoZ3VpZC5lcXVhbHMoKChNZXRob2RFbGVtZW50KSBvYmplY3QpLmdldEd1aWQoKSkpIHsKLQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGNoaWxkOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkJCS5hZGFwdChjaGlsZCwKLQkJCQkJCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrIGZpbmRfYWRhcHRlcjsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG11c3QgYmUgYW4gSXRlbVByb3ZpZGVyQWRhcHRlcgotCQkJCQkJLy8KLQkJCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIG9iamVjdDsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVtUHJvdmlkZXIKLQkJCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQkJaWYgKGd1aWQuZXF1YWxzKGUuZ2V0R3VpZCgpKSkgewotCQkJCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBpdGVtUHJvdmlkZXI7Ci0JCQkJCQkJYnJlYWsgZmluZF9hZGFwdGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBjb25maWd1cmF0aW9uCi0JCQkvLwotCQkJaWYgKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY3VycmVudENvbmZpZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gcmV2ZWFsKExpc3Qgc2VsZWN0aW9uLCBDb2xsZWN0aW9uIHJldmVhbGVkRGVzY3JpcHRvcnMpIHsKLQkvLyBib29sZWFuIHJlYWRPbmx5RWxlbWVudEFmZmVjdGVkID0gZmFsc2U7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCS8vIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPQotCS8vIChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkvLyBNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JLy8gaWYgKCF3cmFwcGVyLmlzUmVhZE9ubHkoKSkgeyAvLyB3cmFwcGVyIG9mIGxvY2FsIGVsZW1lbnQKLQkvLyBlLnNldFN1cHByZXNzZWQoQm9vbGVhbi5GQUxTRSk7Ci0JLy8gaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyByZXZlYWxlZERlc2NyaXB0b3JzLmFkZChlKTsKLQkvLyB9Ci0JLy8gfSBlbHNlIHsgLy8gd2FzIHN1cHByZXNzZWQgYnkgdGhpcyBwcm9jZXNzCi0JLy8KLQkvLyAvLyByZW1vdmUgdGhlIHBhdGggb2Ygc3VwcHJlc3NlZCBlbGVtZW50IGZyb20gdGhlIGxpc3QKLQkvLyAvLwotCS8vIFN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkvLyBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5yZW1vdmUocGF0aCk7Ci0JLy8gcmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQgPSB0cnVlOwotCS8vIH0KLQkvLyB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JLy8gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uRkFMU0UpOwotCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gcmV2ZWFsZWREZXNjcmlwdG9ycy5hZGQoZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gbW9kaWZpZWQgPSB0cnVlOwotCS8vIHJldHVybiByZWFkT25seUVsZW1lbnRBZmZlY3RlZDsKLQkvLyB9Ci0KLQkvLyAvKioKLQkvLyAqIEBwYXJhbSBzZWxlY3Rpb24KLQkvLyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNhbGwgcmV2ZWFsZWQgYW55IHJlYWQtb25seSBlbGVtZW50Ci0JLy8gKi8KLQkvLyBwdWJsaWMgYm9vbGVhbiByZXZlYWwoTGlzdCBzZWxlY3Rpb24pIHsKLQkvLyBBcnJheUxpc3QgcmV2ZWFsZWREZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBib29sZWFuIHJldCA9IHJldmVhbChzZWxlY3Rpb24sIHJldmVhbGVkRGVzY3JpcHRvcnMpOwotCS8vIExpc3QgZGVzY3JpcHRvcnNUb1JldmVhbCA9IGdldE93blJlbGF0ZWRFbGVtZW50cyhyZXZlYWxlZERlc2NyaXB0b3JzLAotCS8vIGZhbHNlKTsKLQkvLyBpZihkZXNjcmlwdG9yc1RvUmV2ZWFsICE9IG51bGwpIHsKLQkvLyBib29sZWFuIHJldDIgPSByZXZlYWwoZGVzY3JpcHRvcnNUb1JldmVhbCwgcmV2ZWFsZWREZXNjcmlwdG9ycyk7Ci0JLy8gcmV0dXJuIHJldCB8fCByZXQyOwotCS8vIH0KLQkvLyByZXR1cm4gcmV0OwotCS8vIH0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIG5lZWQgdG8gdXNlIHtAbGluayBTdXBwcmVzc2lvbkNvbW1hbmR9IGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXZlYWwoTGlzdCBzZWxlY3Rpb24pIHsKLQkJZG9TZXRTdXBwcmVzc2VkKHNlbGVjdGlvbiwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWaWV3VHlwZSgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJLy8gbm8gbmVlZCB0byBzdG9yZSBzZXBhcmF0ZSBwYXRoIGZvciBDQlMsIHJldXNlIFdCUy9UQlMvV1BCUyBwYXRocwotCQkvLwkJCi0JCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBXQlM7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlIHx8IGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFRCUzsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gV1BCUzsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJvY2VzcyBHVUlEIGluIHRoZSBnaXZlbiBHVUlEIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZFBhdGgKLQkgKiBAcmV0dXJuCi0JICogQHNlZSAjZ2V0UGF0aChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9jZXNzR1VJRChTdHJpbmcgZ3VpZFBhdGgpIHsKLQkJaW50IGlkID0gZ3VpZFBhdGguaW5kZXhPZigiOi8vIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlkICE9IC0xKSB7Ci0JCQlpbnQgYmVnaW5JbmRleCA9IGlkICsgMzsKLQkJCWlmIChiZWdpbkluZGV4IDwgZ3VpZFBhdGgubGVuZ3RoKCkpIHsKLQkJCQlpbnQgZW5kSW5kZXggPSBndWlkUGF0aC5pbmRleE9mKCcvJywgYmVnaW5JbmRleCk7Ci0JCQkJaWYgKGVuZEluZGV4ICE9IC0xKSB7Ci0JCQkJCXJldHVybiBndWlkUGF0aC5zdWJzdHJpbmcoYmVnaW5JbmRleCwgZW5kSW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBnZXRQYXRoV2l0aG91dFZpZXdUeXBlKHdyYXBwZXIpOwotCQlTdHJpbmcgdmlld1R5cGUgPSBnZXRWaWV3VHlwZSh3cmFwcGVyKTsKLQkJcGF0aC5pbnNlcnQoMCwgIjovIikuaW5zZXJ0KDAsIHZpZXdUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBnZXRQYXRoV2l0aG91dFZpZXdUeXBlKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7IAotCQlMaXN0IHBhcmVudExpc3QgPSBQcm9jZXNzVXRpbC5nZXRQYXJlbnRMaXN0KG51bGwsIHdyYXBwZXIpOwotCQlpZiAoIXBhcmVudExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJlbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkvLyBleGNsdWRlIFRhc2tEZXNjcmlwdG9yIGFuZCBSb2xlRGVzY3JpcHRvciBmcm9tIHRoZSBwYXJlbnQKLQkJCQkvLyBwYXRoIGIvYyB0aG9zZSBkZXNjcmlwdG9ycyBjYW4gYmUKLQkJCQkvLyBwYXJlbnQgb25seSBpbiBDQlMgdmlldwotCQkJCWlmICghKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciB8fCBlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKGUuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChlLmdldEd1aWQoKSk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldE93blJlbGF0ZWRFbGVtZW50cyhDb2xsZWN0aW9uIGNoYW5nZWREZXNjcmlwdG9ycywKLQkJCWJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlpZiAoIWNoYW5nZWREZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCUFycmF5TGlzdCBkZXNjcmlwdG9yc1RvQ2hhbmdlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChjaGFuZ2VkRGVzY3JpcHRvcnMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0W10gcmVsYXRpb25zaGlwcyA9IG51bGw7Ci0JCQkJaWYgKGRlc2MgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlyZWxhdGlvbnNoaXBzID0gUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLlRBU0tfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUzsKLQkJCQl9IGVsc2UgaWYgKGRlc2MgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlyZWxhdGlvbnNoaXBzID0gUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLlJPTEVfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUzsKLQkJCQl9IGVsc2UgaWYgKGRlc2MgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJcmVsYXRpb25zaGlwcyA9IFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUzsKLQkJCQl9Ci0JCQkJaWYgKHJlbGF0aW9uc2hpcHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0aW9uc2hpcHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCU9iamVjdCBmZWF0dXJlID0gcmVsYXRpb25zaGlwc1tpXTsKLQkJCQkJCWJvb2xlYW4gaXNNYW55OwotCQkJCQkJT2JqZWN0IHZhbHVlOwotCQkJCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBPcHBvc2l0ZUZlYXR1cmUpIHsKLQkJCQkJCQlPcHBvc2l0ZUZlYXR1cmUgZiA9IChPcHBvc2l0ZUZlYXR1cmUpIGZlYXR1cmU7Ci0JCQkJCQkJaXNNYW55ID0gZi5pc01hbnkoKTsKLQkJCQkJCQl2YWx1ZSA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGRlc2MpCi0JCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoZik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZTsKLQkJCQkJCQlpc01hbnkgPSBmLmlzTWFueSgpOwotCQkJCQkJCXZhbHVlID0gZGVzYy5lR2V0KGYpOwotCQkJCQkJfQotCQkJCQkJaWYgKGlzTWFueSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIHZhbHVlKQotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJRGVzY3JpcHRvciByZWYgPSAoRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAocmVmLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkCi0JCQkJCQkJCQkJJiYgIVByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCQkuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcygKLQkJCQkJCQkJCQkJCQkJY2hhbmdlZERlc2NyaXB0b3JzLCByZWYpKSB7Ci0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvQ2hhbmdlLmFkZChyZWYpOwotCQkJCQkJCQkJY2hhbmdlZERlc2NyaXB0b3JzLmFkZChyZWYpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlEZXNjcmlwdG9yIHJlZiA9IChEZXNjcmlwdG9yKSB2YWx1ZTsKLQkJCQkJCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKHJlZi5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZAotCQkJCQkJCQkJCSYmICFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKAotCQkJCQkJCQkJCQkJY2hhbmdlZERlc2NyaXB0b3JzLCByZWYpKSB7Ci0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvQ2hhbmdlLmFkZChyZWYpOwotCQkJCQkJCQkJY2hhbmdlZERlc2NyaXB0b3JzLmFkZChyZWYpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRlc2NyaXB0b3JzVG9DaGFuZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3VwcHJlc3NlcyBvciByZXZlYWxzIHRoZSBnaXZlbiBzZWxlY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuIHtAbGluayBSZXN1bHR9IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsCi0JICovCi0JcHJpdmF0ZSBSZXN1bHQgc2V0U3VwcHJlc3NlZChMaXN0IHNlbGVjdGlvbiwgYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCVJlc3VsdCByZXN1bHQgPSBkb1NldFN1cHByZXNzZWQoc2VsZWN0aW9uLCBzdXBwcmVzc2VkKTsKLQotCQkvLyBpZiBkZXNjcmlwdG9ycyBoYWQgYmVlbiBzdXBwcmVzc2VkLCByZWxhdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdAotCQkvLyB1c2VkIGFueXdoZXJlIGVsc2UgYWxzbyBuZWVkIHRvIGJlIHN1cHByZXNzZWQgKGp1c3QgbGlrZSBkZWxldGUpCi0JCS8vCQotCQlpZiAoIXJlc3VsdC5kZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZGVzY3JpcHRvcnNUb1N1cHByZXNzID0gZ2V0T3duUmVsYXRlZEVsZW1lbnRzKAotCQkJCQlyZXN1bHQuZGVzY3JpcHRvcnMsIHN1cHByZXNzZWQpOwotCQkJaWYgKGRlc2NyaXB0b3JzVG9TdXBwcmVzcyAhPSBudWxsKSB7Ci0JCQkJUmVzdWx0IHJlc3VsdDIgPSBkb1NldFN1cHByZXNzZWQoZGVzY3JpcHRvcnNUb1N1cHByZXNzLAotCQkJCQkJc3VwcHJlc3NlZCk7Ci0KLQkJCQkvLyBtZXJnZSByZXN1bHRzCi0JCQkJLy8KLQkJCQlyZXN1bHQuZWxlbWVudHMuYWRkQWxsKHJlc3VsdDIuZWxlbWVudHMpOwotCQkJCXJlc3VsdC5kZXNjcmlwdG9ycy5hZGRBbGwocmVzdWx0Mi5kZXNjcmlwdG9ycyk7Ci0JCQkJcmVzdWx0LnBhdGhzLmFkZEFsbChyZXN1bHQyLnBhdGhzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgbmVlZCB0byB1c2Uge0BsaW5rIFN1cHByZXNzaW9uQ29tbWFuZH0gaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHN1cHByZXNzKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCWRvU2V0U3VwcHJlc3NlZChzZWxlY3Rpb24sIHRydWUpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHN1cHByZXNzKExpc3Qgc2VsZWN0aW9uKSB7Ci0JLy8gQXJyYXlMaXN0IHN1cHByZXNzZWREZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBib29sZWFuIHJldCA9IHN1cHByZXNzKHNlbGVjdGlvbiwgc3VwcHJlc3NlZERlc2NyaXB0b3JzKTsKLQkvLwkJCi0JLy8gLy8gaWYgZGVzY3JpcHRvcnMgaGFkIGJlZW4gc3VwcHJlc3NlZCwgcmVsYXRlZCBlbGVtZW50cyB0aGF0IGFyZSBub3QgdXNlZAotCS8vIGFueXdoZXJlIGVsc2UgYWxzbyBuZWVkIHRvIGJlIHN1cHByZXNzZWQgKGp1c3QgbGlrZSBkZWxldGUpCi0JLy8gLy8KLQkvLyBMaXN0IGRlc2NyaXB0b3JzVG9TdXBwcmVzcyA9IGdldE93blJlbGF0ZWRFbGVtZW50cyhzdXBwcmVzc2VkRGVzY3JpcHRvcnMsCi0JLy8gdHJ1ZSk7Ci0JLy8gaWYoZGVzY3JpcHRvcnNUb1N1cHByZXNzICE9IG51bGwpIHsKLQkvLyBBcnJheUxpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGJvb2xlYW4gcmV0MiA9IHN1cHByZXNzKGRlc2NyaXB0b3JzVG9TdXBwcmVzcywgb3V0KTsKLQkvLyBpZihvdXQuc2l6ZSgpICE9IGRlc2NyaXB0b3JzVG9TdXBwcmVzcy5zaXplKCkpIHsKLQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlN1cHByZXNzaW9uLnN1cHByZXNzKExpc3QpCi0JLy8gaXMgYnVnZ3kuIik7IC8vJE5PTi1OTFMtMSQKLQkvLyB9Ci0JLy8gcmV0dXJuIHJldCB8fCByZXQyOwotCS8vIH0KLQkvLyByZXR1cm4gcmV0OwotCS8vIH0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlc3VsdCB7Ci0JCS8qKiBFbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBzdXBwcmVzc2VkIG9yIHJldmVhbGVkICovCi0JCUNvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQkJLyoqIERlc2NyaXB0b3JzIHRoYXQgaGF2ZSBiZWVuIHN1cHByZXNzZWQgb3IgcmV2ZWFsZWQgKi8KLQkJQ29sbGVjdGlvbiBkZXNjcmlwdG9yczsKLQotCQkvKioKLQkJICogUGF0aHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tCi0JCSAqIDxjb2RlPnN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRoczwvY29kZT4KLQkJICovCi0JCUNvbGxlY3Rpb24gcGF0aHM7Ci0KLQkJUmVzdWx0KCkgewotCQkJZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJcmV0dXJuIGVsZW1lbnRzLmlzRW1wdHkoKSAmJiBwYXRocy5pc0VtcHR5KCk7Ci0JCX0KLQotCQl2b2lkIGNsZWFyKCkgewotCQkJZWxlbWVudHMuY2xlYXIoKTsKLQkJCWRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQlwYXRocy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VwcHJlc3NlcyBvciByZXZlYWxzIHRoZSBnaXZlbiBzZWxlY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZgotCSAqIDxjb2RlPnN1cHByZXNzZWQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgUmVzdWx0IGRvU2V0U3VwcHJlc3NlZChMaXN0IHNlbGVjdGlvbiwgYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgUmVzdWx0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQkvLyBpZiAoIWlzU3VwcHJlc3NlZCh3cmFwcGVyKSkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQlpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCS8vIHdyYXBwZXIgb2YgbG9jYWwgZWxlbWVudAotCQkJCQkvLwotCQkJCQlpZiAoZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZihzdXBwcmVzc2VkKSk7Ci0JCQkJCQlyZXN1bHQuZWxlbWVudHMuYWRkKGUpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJcmVzdWx0LmRlc2NyaXB0b3JzLmFkZChlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFkZCB0aGUgcGF0aHMgb2Ygc3VwcHJlc3NlZCBlbGVtZW50IHRvIHRoZSBtYXAKLQkJCQkJLy8KLQkJCQkJU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCQkJCQlib29sZWFuIGI7Ci0JCQkJCWlmIChzdXBwcmVzc2VkKSB7Ci0JCQkJCQliID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkuYWRkKHBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYiA9IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLnJlbW92ZShwYXRoKTsKLQkJCQkJfQotCQkJCQlpZiAoYikgewotCQkJCQkJcmVzdWx0LnBhdGhzLmFkZChwYXRoKTsKLQkJCQkJfQotCQkJCQkvLyB9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJaWYgKGUuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZihzdXBwcmVzc2VkKSk7Ci0JCQkJCXJlc3VsdC5lbGVtZW50cy5hZGQoZSk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJcmVzdWx0LmRlc2NyaXB0b3JzLmFkZChlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQltb2RpZmllZCA9ICFyZXN1bHQuaXNFbXB0eSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzcyhMaXN0IHNlbGVjdGlvbiwgQ29sbGVjdGlvbgotCS8vIHN1cHByZXNzZWREZXNjcmlwdG9ycykgewotCS8vIGJvb2xlYW4gcmVhZE9ubHlFbGVtZW50U3VwcHJlc3NlZCA9IGZhbHNlOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0KLQkvLyAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JLy8gaWYgKCFpc1N1cHByZXNzZWQod3JhcHBlcikpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCS8vIC51bndyYXAod3JhcHBlcik7Ci0JLy8gaWYgKCF3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCS8vIC8vIHdyYXBwZXIgb2YgbG9jYWwgZWxlbWVudAotCS8vIC8vCi0JLy8gZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uVFJVRSk7Ci0JLy8gaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyBzdXBwcmVzc2VkRGVzY3JpcHRvcnMuYWRkKGUpOwotCS8vIH0KLQkvLyB9IGVsc2UgewotCS8vIC8vIGFkZCB0aGUgcGF0aHMgb2Ygc3VwcHJlc3NlZCBlbGVtZW50IHRvIHRoZSBtYXAKLQkvLyAvLwotCS8vIFN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkvLyBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5hZGQocGF0aCk7Ci0JLy8gcmVhZE9ubHlFbGVtZW50U3VwcHJlc3NlZCA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JLy8gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uVFJVRSk7Ci0JLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyBzdXBwcmVzc2VkRGVzY3JpcHRvcnMuYWRkKGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIG1vZGlmaWVkID0gdHJ1ZTsKLQkvLyByZXR1cm4gcmVhZE9ubHlFbGVtZW50U3VwcHJlc3NlZDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Vuc3VwcHJlc3NlZChMaXN0IHNlbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmICghaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWlmICghaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUlzRG9uZSgpIHsKLQkJbW9kaWZpZWQgPSBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gX19pc1N1cHByZXNzZWQoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tcG9zZWRXcmFwcGVyLmdldFZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKCFpc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQsIG9yIHRoZSBpdGVtIHByb3ZpZGVyIG9yIGFkYXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGVsZW1lbnQgaXMgc3VwcHJlc3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCBvciBhbiBhc3NvY2lhdGVkIHdyYXBwZXIsIGFkYXB0b3IsIG9yIGl0ZW0KLQkgKiAgICAgICAgICAgIHByb3ZpZGVyLCBldGMuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKE9iamVjdCBlKSB7Ci0JCS8vIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQl0cnkgewotCi0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCUNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY29tcG9zZWRXcmFwcGVyID0gUHJvY2Vzc1V0aWwuZ2V0Q29tcG9zZWRXcmFwcGVyKGUpOwotCQkJaWYoY29tcG9zZWRXcmFwcGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gX19pc1N1cHByZXNzZWQoY29tcG9zZWRXcmFwcGVyKTsKLQkJCX0KLQotCQkJaWYgKGludGVybmFsVW5zdXBwcmVzc2VkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gX19pc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gX19pc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdGFyZ2V0T2JqID0gbnVsbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJdGFyZ2V0T2JqID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBlKS5nZXRWYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQl9Ci0KLQkJCQlpZiAodGFyZ2V0T2JqICE9IG51bGwgJiYgdGFyZ2V0T2JqICE9IGUpIHsKLQkJCQkJcmV0dXJuIGlzU3VwcHJlc3NlZCh0YXJnZXRPYmopOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCX0gZmluYWxseSB7Ci0JCQkvLyBsb25nIHRpbWUgPSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCk7Ci0JCQkvLyBpZih0aW1lID4gMTAwMCkgewotCQkJLy8gQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KVRuZ1V0aWwudW53cmFwKGUpOwotCQkJLy8gU3RyaW5nIG1zZyA9ICJTdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoKTogdGltZSB0YWtlbiAobXMpICIgKwotCQkJLy8gdGltZSArCi0JCQkvLyAiXG4gcHJvY2VzczogIiArIChlIGluc3RhbmNlb2YKLQkJCS8vIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyID8KLQkJCS8vICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZSkuZ2V0VG9wSXRlbSgpIDoKLQkJCS8vIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiZSkpICsKLQkJCS8vICJcbiBlbGVtZW50OiAiICsgUHJvY2Vzc1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChiZSk7Ci0JCQkvLwkJCQkKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0luZm8obXNnKTsKLQkJCS8vIH0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHN1cHByZXNzaW9uIHN0YXRlIG9mIHRoZSBnaXZlbiA8Y29kZT53cmFwcGVyPC9jb2RlPiBmcm9tCi0JICogaXRzIGJhc2UuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2FsbCBtb2RpZmllZCB0aGUgc3VwcHJlc3Npb24gc3RhdGUKLQkgKiAgICAgICAgIG9mIHRoZSBnaXZlbiB3cmFwcGVyLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZSgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCQlib29sZWFuIHJldDsKLQkJQnJlYWtkb3duRWxlbWVudCBlID0gZ2V0U3VwcHJlc3NlZCh3cmFwcGVyLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCi0JCQkJbnVsbCk7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCXJldCA9IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLmFkZChwYXRoKTsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLnJlbW92ZShwYXRoKTsKLQkJfQotCQlpZiAocmV0KSB7Ci0JCQltb2RpZmllZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdWRlcyB0aGUgZGVzY3JpcHRvcnMgd2l0aCB0aGUgc2FtZSBsaW5rZWQgZWxlbWVudCBmcm9tIHRoZSBjaGVjawotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb25Ub1JldmVhbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNoZWNrRHVwbGljYXRlTmFtZUFmdGVyUmV2ZWFsKAotCQkJQ29sbGVjdGlvbiBzZWxlY3Rpb25Ub1JldmVhbE9yU3VwcHJlc3MsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9SZXZlYWwgPSBnZXRBcHBsaWNhYmxlSXRlbXMoCi0JCQkJc2VsZWN0aW9uVG9SZXZlYWxPclN1cHByZXNzLCBmYWxzZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9SZXZlYWwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50OwotCQkJCVN0cmluZyBtc2cgPSBQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJCQkJYWRhcHRlckZhY3RvcnksIGJlLCBiZS5nZXROYW1lKCksIHRoaXMpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uOyAKLQkJCQl9Ci0JCQkJbXNnID0gUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwgYmUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLCB0aGlzKTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbjsgCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdW53cmFwcGVkID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJaWYgKHVud3JhcHBlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCUNvbGxlY3Rpb24gc2libGluZ3MgPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCQkJCU9iamVjdCBsaW5rZWRFbGVtZW50ID0gbnVsbDsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJCWxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJbmFtZUNoZWNrTG9vcDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNpYmxpbmdzCi0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3Qgc2libGluZyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHNpYmxpbmcgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIHNpYmxpbmc7Ci0JCQkJCQkJCQkvLyBza2lwIGNoZWNraW5nIG9uIHN1cHByZXNzZWQgZWxlbWVudAotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCWlmIChiZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJCQljb250aW51ZSBuYW1lQ2hlY2tMb29wOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKGxpbmtlZEVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBzaWJsaW5nIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJCQkJCS8vIHNraXAgY2hlY2tpbmcgb24gZGVzY3JpcHRvcnMgd2l0aCB0aGUKLQkJCQkJCQkJCQkvLyBzYW1lIGxpbmtlZCBlbGVtZW50Ci0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlPYmplY3Qgb3RoZXJMaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJCQkJaWYgKG90aGVyTGlua2VkRWxlbWVudCA9PSBsaW5rZWRFbGVtZW50KSB7Ci0JCQkJCQkJCQkJCWNvbnRpbnVlIG5hbWVDaGVja0xvb3A7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJU3RyaW5nIG1zZyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJCQkJCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwgYmUKLQkJCQkJCQkJCQkJCQkJCS5nZXROYW1lKCksIHRoaXMpOwotCQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbjsgCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQltc2cgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgYmUsCi0JCQkJCQkJCQkJCQkJYmUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJCQkJCXRoaXMpOwotCQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbjsgCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWludGVybmFsVW5zdXBwcmVzc2VkRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZ1tdIGd1aWRQYXRoLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGd1aWRQYXRoLmxlbmd0aCA9PSAwIHx8IGFkYXB0ZXJGYWN0b3J5ID09IG51bGwKLQkJCQl8fCAhZ3VpZFBhdGhbMF0uZXF1YWxzKHByb2Nlc3MuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlPYmplY3Qgb2JqZWN0ID0gcHJvY2VzczsKLQkJaW50IGxlbiA9IGd1aWRQYXRoLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykgewotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0JCQkvLyBpZiBjdXJyZW50IG9iamVjdCBpcyBhbiBhY3Rpdml0eSwgbWFrZSBzdXJlIGl0IGlzIHJvbGxlZCBkb3duCi0JCQkvLyBiZWZvcmUgbG9va2luZyBpbnRvIGl0cyBjaGlsZHJlbgotCQkJLy8KLQkJCUlCU0l0ZW1Qcm92aWRlciByb2xsZWRVcEFkYXB0ZXIgPSBudWxsOwotCQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFjdGl2aXR5SXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQlpZiAoYWN0aXZpdHlJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJCQkJYWN0aXZpdHlJdGVtUHJvdmlkZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQkJcm9sbGVkVXBBZGFwdGVyID0gYWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQlpZiAoaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQkJcm9sbGVkVXBBZGFwdGVyID0gaXRlbVByb3ZpZGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJvbGxlZFVwQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCXJvbGxlZFVwQWRhcHRlci5zZXRSb2xsZWRVcCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbmRfY2hpbGQ6IHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJJiYgKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCkuZXF1YWxzKGd1aWRQYXRoW2ldKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQlicmVhayBmaW5kX2NoaWxkOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFmb3VuZCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBicmVha2Rvd24gZWxlbWVudCBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbgotCSAqIDxjb2RlPmd1aWRQYXRoPC9jb2RlPiBpcyBzdXBwcmVzc2VkIGluIHRoZSBwcm9jZXNzIG9mIHRoaXMgU3VwcHJlc3Npb24KLQkgKiBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZFBhdGgKLQkgKiBAcmV0dXJuCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHBhdGggY291bGQgbm90IGJlIGZvdW5kIHVzaW5nCi0JICogICAgICAgICAgICAgICAgdGhlIGdpdmVuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NlZChTdHJpbmdbXSBndWlkUGF0aCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0JCQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdEJ5UGF0aChndWlkUGF0aCwgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJDb3VsZCBub3QgZmluZCBvYmplY3Qgd2l0aCBwYXRoICciICsgZ3VpZFBhdGggKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gaXNTdXBwcmVzc2VkKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2V0IG9mIHN1cHByZXNzZWQgaXRlbSBvZiB0aGUgZ2l2ZW4gcHJvY2Vzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3JpZXMKLQkgKiAgICAgICAgICAgIHRoZSBhZGFwdGVyIGZhY3RvcmllcyBmb3IgV0JTLCBUQlMsIFdQQlMsIGFuZCBDQlMgdmlld3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQgZ2V0U3VwcHJlc3NlZEl0ZW1zKFByb2Nlc3MgcHJvYywKLQkJCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlTZXQgc3VwcHJlc3NlZEl0ZW1zID0gbmV3IEhhc2hTZXQoKTsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKAotCQkJCQlhZGFwdGVyRmFjdG9yaWVzW2ldLCBwcm9jKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGl0ZW0pKSB7Ci0JCQkJCXN1cHByZXNzZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBwcmVzc2VkSXRlbXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdXBwcmVzc2lvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkJcHJvdGVjdGVkIExpc3QgY29sbGVjdGlvbjsKLQotCQlwcm90ZWN0ZWQgUmVzdWx0IHJlc3VsdDsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwcmVzc2VkOwotCi0JCXByb3RlY3RlZCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQotCQlwdWJsaWMgU3VwcHJlc3Npb25Db21tYW5kKFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBMaXN0IHNlbGVjdGlvbiwKLQkJCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJCXRoaXMuc3VwcHJlc3Npb24gPSBzdXBwcmVzc2lvbjsKLQkJCWNvbGxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQl0aGlzLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3VwcHJlc3Npb24KLQkJCQkJCS5nZXRQcm9jZXNzKCkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlyZXN1bHQgPSBzdXBwcmVzc2lvbi5zZXRTdXBwcmVzc2VkKGNvbGxlY3Rpb24sIHN1cHByZXNzZWQpOwotCQkJZGlkRXhlY3V0ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGlkRXhlY3V0ZSgpIHsKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKCFyZXN1bHQuZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3VsdC5lbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCWUuc2V0U3VwcHJlc3NlZChCb29sZWFuLnZhbHVlT2YoIXN1cHByZXNzZWQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXJlc3VsdC5wYXRocy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0LnBhdGhzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHBhdGggPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChzdXBwcmVzc2VkKSB7Ci0JCQkJCQkJc3VwcHJlc3Npb24uZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkKLQkJCQkJCQkJCS5yZW1vdmUocGF0aCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXN1cHByZXNzaW9uLmdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpCi0JCQkJCQkJCQkuYWRkKHBhdGgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWRpZFVuZG8oKTsKLQkJCQlyZXN1bHQuY2xlYXIoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRpZFVuZG8oKSB7Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRSZXN1bHQoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQkJaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5RWxlbWVudEFmZmVjdGVkKCkgewotCQkJcmV0dXJuICFyZXN1bHQucGF0aHMuaXNFbXB0eSgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5jbGVhcigpOwotCQkJfQotCi0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybiBwaHlzaWNhbCBzdGF0ZSBvZiB0aGUgcHJvY2Vzc0VsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0l0c2VsZlN1cHByZXNzZWQoT2JqZWN0IG9iail7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KXsKLQkJCXJldHVybiAoKFByb2Nlc3NFbGVtZW50KW9iaikuZ2V0U3VwcHJlc3NlZCgpOwotCQl9Ci0JCQotCQlpZihvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiBQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmopKXsKLQkJCXJldHVybiBpc0luU3VwcHJlc3NlZExpc3QoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iaik7Ci0JCX0KLQkJCi0JCWlmKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICFQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmopKXsKLQkJCU9iamVjdCBvYmplY3QgPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldFN1cHByZXNzZWQoKTsKLQkJfQotCQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gaXNTdXBwcmVzc2VkKG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvVG5nVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1RuZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlZTE2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvVG5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwuQ29waWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkF0dHJpYnV0ZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkZlYXR1cmVNYXBFbnRyeVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LkNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwuSUxpc3RlbmVyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTW92ZURvd25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVVcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbC5TdHJpbmdSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIG1ldGhvZCBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUbmdVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgdW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SID0gInwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1JfU1BMSVRURVIgPSAiXFx8IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFfU0VQQVJBVE9SID0gIiwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BX1NFUEFSQVRPUl9TUExJVFRFUiA9ICJcXCwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DQVRFR09SWV9QUk9QRVJUWSA9ICJQVUJMSVNIX0NBVEVHT1JZIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGFkYXB0ZXJzIHRoYXQgYXJlIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcyBmcm9tIHRoZSBnaXZlbgotCSAqIEVPYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gY2xzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFkYXB0ZXJzKEVPYmplY3QgZU9iaiwgQ2xhc3MgY2xzKSB7Ci0JCWZvciAoSXRlcmF0b3IgYWRhcHRlcnMgPSBlT2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlhZGFwdGVycy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqLCBDbGFzcyBjbHMpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IGVPYmouZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBhZGFwdChBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBOb3RpZmllciBub3RpZmllciwKLQkJCU9iamVjdCB0eXBlLCBDbGFzcyB2aWV3VHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGFkYXB0ZXJzID0gbm90aWZpZXIuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkgJiYgdmlld1R5cGUuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5LmFkYXB0TmV3KG5vdGlmaWVyLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lLmluZGV4T2YoJy8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJ1xcJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJzonKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyonKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPycpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignIicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc8JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCc+JykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJ3wnKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJzsnKSAhPSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBzdHJpbmcgZm9yIGEgcGx1Z2luIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUGx1Z2luTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAoaXNWYWxpZEZpbGVOYW1lKG5hbWUpID09IGZhbHNlICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBuZWVkIHRvIHJlbW92ZSB0aGVzZSBjaGFyYWN0ZXJzIHNpbmNlIHRoZXkgY2F1c2VkIHByb2JsZW0gd2l0aCBlbGVtZW50IHVybCBlbmNvZGluZywgYm9va21hcmsgaXNzdWUsIAotCQkvLyBhbmQgamF2YXNjcmlwdCBzdHJpbmcgbGl0ZXJuYWwgZXNjYXBpbmcgaXNzdWUKLQkJLy8gc2VlIDE1Njk0NiAtIHBsdWdpbiBuYW1lIHNob3VsZCBub3QgYWxsb3cgJSwgIywgYW5kICcKLQkJaWYgKG5hbWUuaW5kZXhPZignJScpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignIycpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCdcJycpICE9IC0xICkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gRU9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGVDbGFzc2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIEVDbGFzcyBvYmplY3RzLiBUaGUgRU9iamVjdCBpbnN0YW5jZXMgb2YgdGhlc2UKLQkgKiAgICAgICAgICAgIEVDbGFzcyBvYmplY3RzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlaXIgb3duIGRpcmVjdG9yeS4KLQkgKiBAcmV0dXJuIG51bGwgaWYgc3VjY2Vzc2Z1bCwgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKE5hbWVkRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJcmV0dXJuIGNoZWNrTmFtZSgoKEVPYmplY3QpIGUpLmVDb250YWluZXIoKSwgZSwgbmFtZSwgVG5nVXRpbAotCQkJCS5nZXRUeXBlVGV4dChlKSwgZUNsYXNzZXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShFT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCwgQ29sbGVjdGlvbiBlQ2xhc3NlcykgewotCQlTdHJpbmcgbXNnID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBlbGVtZW50VHlwZVRleHQpOwotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5lQ29udGVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKGNoaWxkICE9IGUgJiYgaXNFQ2xhc3NJbnN0YW5jZU9mKGVDbGFzc2VzLCBjaGlsZCkKLQkJCQkJJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEVPYmplY3QgcGFyZW50LCBOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgZWxlbWVudFR5cGVUZXh0LCBJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCVN0cmluZyBtc2cgPSBjaGVja0VsZW1lbnROYW1lKG5hbWUsIGVsZW1lbnRUeXBlVGV4dCk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gcGFyZW50LmVDb250ZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlOYW1lZEVsZW1lbnQgY2hpbGQgPSAoTmFtZWRFbGVtZW50KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoY2hpbGQgIT0gZSAmJiBjaGlsZEZpbHRlci5hY2NlcHQoY2hpbGQpCi0JCQkJCSYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywgbmFtZSk7IAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBjYW4gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoZSBtZXRob2QKLQkgKiBhc3N1bWUgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGJlIHNhdmVkIHVuZGVyIHRoZSBnaXZlbiBkaXJlY3RvcnkKLQkgKiB1c2luZyB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBEaXJlY3Rvcnkgd2hlcmUgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBiZSBzYXZlZCBpbiBhIGZpbGUgb3IgYQotCSAqICAgICAgICAgICAgZGlyZWN0b3J5IGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgaXNEaXIKLQkgKiBAcGFyYW0gc2libGluZ3MKLQkgKiAgICAgICAgICAgIGV4aXNpdGluZyBzaWJsaW5ncyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPgotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBpdHMgbmFtZSB0byBiZSBjaGVja2VkLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgc3VnZ2VzdGVkIG5ldyBuYW1lIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPgotCSAqIEBwYXJhbSB0eXBlTGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHR5cGUgbGFiZWwuCi0JICogQHBhcmFtIGlzRGlyCi0JICogICAgICAgICAgICBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGJlIHNhdmVkIGEKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gbmFtZSBjYW4gYmUgdXNlZCwgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgbmFtZQotCSAqICAgICAgICAgaXMgYWxyZWFkeSB0YWtlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoRmlsZSBkaXIsIENvbGxlY3Rpb24gc2libGluZ3MsCi0JCQlOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBlbGVtZW50VHlwZVRleHQsIGJvb2xlYW4gaXNEaXIpIHsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgZWxlbWVudFR5cGVUZXh0KTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJU3RyaW5nIGZpbGVOYW1lID0gbmFtZTsKLQkJaWYgKCFpc0RpcikgewotCQkJZmlsZU5hbWUgPSBmaWxlTmFtZSArICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKSkuZ2V0RmlsZUV4dGVuc2lvbihlKTsKLQkJfQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsKLQkJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCWlmIChlICE9IG51bGwgJiYgZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQljdXJyZW50RmlsZSA9IG5ldyBGaWxlKGUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJaWYgKGlzRGlyKSB7Ci0JCQkJY3VycmVudEZpbGUgPSBjdXJyZW50RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBiID0gZmlsZS5leGlzdHMoKTsKLQkJaWYgKGIgJiYgIWZpbGUuZXF1YWxzKGN1cnJlbnRGaWxlKSkgewotCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOwotCQkJLyogVE9ETzogaXMgdGhpcyBuZWVkZWQ/IEFmdGVyIGNhbGxpbmcgTkxTLmJpbmQsIHRoZXJlIHdpbGwJbm90IGJlIGFueSBwbGFjZWhvbGRlcnMgbGVmdCBmb3IgcGFyYW1zLgotCQkJT2JqZWN0W10gcGFyYW1zID0gbmV3IE9iamVjdFsyXTsKLQkJCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQkJcGFyYW1zWzBdID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZV90ZXh0OyAKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyYW1zWzBdID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGlyZWN0b3J5X3RleHQ7IAotCQkJfQotCQkJcGFyYW1zWzFdID0gZmlsZTsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIHBhcmFtcykudG9TdHJpbmcoKTsKLQkJCSovCi0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNpYmxpbmdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgIT0gZSAmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOyAKLQkJCX0KLQkJfQotCQkvLyAKLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0VsZW1lbnROYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgZWxlbWVudFR5cGVUZXh0KSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoZWxlbWVudFR5cGVUZXh0KSk7IAotCQlpZiAobmFtZS5zdGFydHNXaXRoKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnLCBuYW1lKTsgCi0JCWlmIChuYW1lLmVuZHNXaXRoKCIuIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnLCBuYW1lKTsgCQkKLQkJaWYgKCFpc1ZhbGlkRmlsZU5hbWUobmFtZSkpCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZywgbmFtZSk7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1BsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkKLQkJU3RyaW5nIGVycm9yID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBUbmdVdGlsLmdldFR5cGVUZXh0KCJNZXRob2RQbHVnaW4iKSApOyAvLyROT04tTkxTLTEkCi0JCWlmICggZXJyb3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQkKLQkJLy8gMTU2OTQ2IC0gcGx1Z2luIG5hbWUgc2hvdWxkIG5vdCBhbGxvdyAlLCAjLCBhbmQgJwotCQlpZiAoIWlzVmFsaWRQbHVnaW5OYW1lKG5hbWUpICkgewotCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRQbHVnaW5OYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tBY3Rpdml0eU5hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGlmKCFpc1ZhbGlkRmlsZU5hbWUobmFtZSkpIHJldHVybiAiSW52YWxpZCBuYW1lOiAnIiArIG5hbWUgKyAiJy4gVGhlCi0JCS8vIG5hbWUgY2Fubm90IGNvbnRhaW4gZm9sbG93aW5nIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gXCIgPCA+IHwiOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBBY3Rpdml0eS5jbGFzcywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dCU0FjdGl2aXR5TmFtZShPYmplY3QgYWN0LCBTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjaGVja0FjdGl2aXR5TmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdCwgbmFtZSk7Ci0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dCU0FjdGl2aXR5UHJlc2VudGF0aW9uTmFtZShPYmplY3QgYWN0LAotCQkJU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIChCcmVha2Rvd25FbGVtZW50KSBhY3QsIEFjdGl2aXR5LmNsYXNzLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCW5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShPYmplY3QgZSwKLQkJCVN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlpZiAoIShlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAoQnJlYWtkb3duRWxlbWVudCkgZSwKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1JvbGVEZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZShPYmplY3QgZSwKLQkJCVN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlpZiAoIShlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCW5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFQ2xhc3NJbnN0YW5jZU9mKENvbGxlY3Rpb24gZUNsYXNzZXMsIE9iamVjdCBvYmopIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZUNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZUNsYXNzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5zdGFuY2VPZihDb2xsZWN0aW9uIGNsYXNzZXMsIE9iamVjdCBvYmopIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNsYXNzIGNsYXp6ID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChjbGF6ei5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgewotCQkJcmV0dXJuICgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldExhYmVsKG9iamVjdCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIGdldExhYmVsKCgoQ29udGVudERlc2NyaXB0aW9uKSBvYmplY3QpLmVDb250YWluZXIoKSwgYWx0ZXJuYXRpdmVMYWJlbCk7Ci0JCX0KLQkJCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqZWN0OwotCQkJaWYgKGVPYmouZUlzUHJveHkoKSkgewotCQkJCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIHVyaSA9IGVPYmouZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKQotCQkJCQkJCS5ub3JtYWxpemUoKChJbnRlcm5hbEVPYmplY3QpIGVPYmopLmVQcm94eVVSSSgpKTsKLQkJCQkJcGF0aCA9IHVyaS5pc0ZpbGUoKSA/IHVyaS50b0ZpbGVTdHJpbmcoKSA6IHVyaS50b1N0cmluZygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCi0JCQkJfQotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJcGF0aCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCSIgJyd7MH0nJyIsIG5ldyBPYmplY3RbXSB7IHBhdGggfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bnJlc29sdmVkX3RleHQsIHBhdGgpOyAKLQkJCX0KLQkJfQotCQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCQlib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lcyA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQkJaWYgKHNob3dQcmVzZW50YXRpb25OYW1lcyAmJiBvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpCi0JCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWVsc2UgaWYgKHNob3dQcmVzZW50YXRpb25OYW1lcyAmJiBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJbGFiZWwgPSAoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlpZiAobGFiZWwgPT0gbnVsbCB8fCBsYWJlbC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCWxhYmVsID0gKChOYW1lZEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC50cmltKCkubGVuZ3RoKCkgPT0gMCA/IGFsdGVybmF0aXZlTGFiZWwgOiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0LAotCQkJU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwsIGJvb2xlYW4gcHJlZmVyQmFzZSkgewotCQlTdHJpbmcgbGFiZWwgPSBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgYWx0ZXJuYXRpdmVMYWJlbCk7Ci0JCWlmIChwcmVmZXJCYXNlICYmIG9iamVjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBvYmplY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlTdHJpbmcgdmFyaWFiaWxpdHlUeHQgPSBudWxsOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5jb250cmlidXRlc1RvX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmV4dGVuZHNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZXh0ZW5kc19yZXBsYWNlc190ZXh0OwotCQkJfQotCQkJaWYgKHZhcmlhYmlsaXR5VHh0ICE9IG51bGwpIHsKLQkJCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKG9iamVjdAotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCkgewotCQkJCQlsYWJlbCA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLlV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvLCAobmV3IFN0cmluZ1tdIHsKLQkJCQkJbGFiZWwsCi0JCQkJCXZhcmlhYmlsaXR5VHh0LAotCQkJCQlUbmdVdGlsCi0JCQkJCQkJLmdldExhYmVsKAotCQkJCQkJCQkJb2JqZWN0Ci0JCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQlhbHRlcm5hdGl2ZUxhYmVsKSwKLQkJCQkJYmFzZVBsdWdpbi5nZXROYW1lKCkgfSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxhYmVsID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbywgKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCWxhYmVsLAotCQkJCQl2YXJpYWJpbGl0eVR4dCwKLQkJCQkJVG5nVXRpbC5nZXRMYWJlbChvYmplY3QKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCWFsdGVybmF0aXZlTGFiZWwpIH0pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIFByb2Nlc3NDb21wb25lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgY29tcG9uZW50LAotCQkJRUNsYXNzIHR5cGUpIHsKLQkJLy8gY3JlYXRlIG5ldyBwcm9jZXNzIGZvciB0aGUgcHJvY2VzcyBjb21wb25lbnQKLQkJLy8KLQkJUHJvY2VzcyBwcm9jID0gY29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJaWYgKHByb2MgPT0gbnVsbCkgewotCQkJcHJvYyA9IChQcm9jZXNzKSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUodHlwZSk7Ci0JCQljb21wb25lbnQuc2V0UHJvY2Vzcyhwcm9jKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSB0b3AgYWN0aXZpdHkKLQkJLy8KLQkJLy8gaWYocHJvYy5nZXRUb3BMZXZlbEJyZWFrZG93bkVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCS8vIHByb2Muc2V0VG9wTGV2ZWxCcmVha2Rvd25FbGVtZW50KGFjdCk7Ci0JCS8vIGNvbXBvbmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChhY3QpOwotCQkvLyB9Ci0KLQkJLy8gY3JlYXRlIFdCUywgT0JTLCBhbmQgUEJTCi0JCS8vCi0JCS8vIGlmKGNvbXBvbmVudC5nZXRXQlMoKSA9PSBudWxsKQotCQkvLyBjb21wb25lbnQuc2V0V0JTKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdCUygpKTsKLQkJLy8gaWYoY29tcG9uZW50LmdldFRCUygpID09IG51bGwpCi0JCS8vIGNvbXBvbmVudC5zZXRUQlMoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVEJTKCkpOwotCQkvLyBpZihjb21wb25lbnQuZ2V0V1BCUygpID09IG51bGwpCi0JCS8vIGNvbXBvbmVudC5zZXRXUEJTKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdQQlMoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCcmVha2Rvd25FbGVtZW50IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGJlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTnVsbChTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiAoc3RyID09IG51bGwgPyAiIiA6IHN0cik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVzY3JpcHRvckV4aXN0cyhSb2xlIHJvbGUsIExpc3Qgcm9sZURlc2NyaXB0b3JMaXN0KSB7Ci0JCWZvciAoaW50IGkgPSByb2xlRGVzY3JpcHRvckxpc3Quc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzY3JpcHRvckxpc3QKLQkJCQkJLmdldChpKTsKLQkJCWlmIChyb2xlRGVzYy5nZXRSb2xlKCkgPT0gcm9sZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGNvcHkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNvcGllciBjb3BpZXIgPSBuZXcgQ29waWVyKCkgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU3ODQ2NTc2MDMzOTA0NjkxTDsKLQotCQkJLyoqCi0JCQkgKiBDYWxsZWQgdG8gaGFuZGxlIHRoZSBjb3B5aW5nIG9mIGEgY3Jvc3MgcmVmZXJlbmNlOyB0aGlzIGFkZHMKLQkJCSAqIHZhbHVlcyBvciBzZXRzIGEgc2luZ2xlIHZhbHVlIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgbXVsdGlwbGljaXR5Ci0JCQkgKiB3aGlsZSBvbWl0dGluZyBhbnkgYmlkaXJlY3Rpb25hbCByZWZlcmVuY2Ugb3Igc2luZ2xlIG9wcG9zaXRlCi0JCQkgKiBmZWF0dXJlJ3MgcmVmZXJlbmNlIHRoYXQgaXNuJ3QgaW4gdGhlIGNvcHkgbWFwLgotCQkJICogCi0JCQkgKiBAcGFyYW0gZVJlZmVyZW5jZQotCQkJICogICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHRvIGNvcHkuCi0JCQkgKiBAcGFyYW0gZU9iamVjdAotCQkJICogICAgICAgICAgICB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weS4KLQkJCSAqIEBwYXJhbSBjb3B5RU9iamVjdAotCQkJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvcHkgdG8uCi0JCQkgKi8KLQkJCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLAotCQkJCQlFT2JqZWN0IGVPYmplY3QsIEVPYmplY3QgY29weUVPYmplY3QpIHsKLQkJCQlpZiAoZU9iamVjdC5lSXNTZXQoZVJlZmVyZW5jZSkpIHsKLQkJCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZS5nZXRPcHBvc2l0ZUZlYXR1cmUoZVJlZmVyZW5jZSk7Ci0JCQkJCQotCQkJCQkvLyAibWFueSIgb3Bwb3NpdGUgZmVhdHVyZSBkb2VzIG5vdCByZXF1aXJlIGNvcGllZCB0YXJnZXQsIGl0IGlzCi0JCQkJCS8vIHRyZWF0ZWQgYXMgYSByZWd1bGFyIG5vbi1jb250YWlubWVudCByZWZlcmVuY2UKLQkJCQkJLy8gVE9ETzogYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGFyZSBub3QgYXV0b21hdGljYWxseSBjb3BpZWQgaW4KLQkJCQkJLy8gRU1GIGltcGxlbWVudGF0aW9uCi0JCQkJCS8vCi0JCQkJCWJvb2xlYW4gY29waWVkVGFyZ2V0UmVxdWlyZWQgPSBlUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpICE9IG51bGwKLQkJCQkJCQl8fCAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSk7Ci0JCQkJCQkJCQkJCi0JCQkJCWlmIChlUmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJCQlMaXN0IHNvdXJjZSA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZVJlZmVyZW5jZSk7Ci0JCQkJCQlJbnRlcm5hbEVMaXN0IHRhcmdldCA9IChJbnRlcm5hbEVMaXN0KSBjb3B5RU9iamVjdAotCQkJCQkJCQkuZUdldChnZXRUYXJnZXQoZVJlZmVyZW5jZSkpOwotCQkJCQkJaWYgKHNvdXJjZS5pc0VtcHR5KCkpIHsKLQkJCQkJCQl0YXJnZXQuY2xlYXIoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGsgPSBzb3VyY2UuaXRlcmF0b3IoKTsgay5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCByZWZlcmVuY2VkRU9iamVjdCA9IGsubmV4dCgpOwotCQkJCQkJCQlPYmplY3QgY29weVJlZmVyZW5jZWRFT2JqZWN0ID0gZ2V0KHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoIWNvcGllZFRhcmdldFJlcXVpcmVkKSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwKLQkJCQkJCQkJCQkJCXJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQkrK2luZGV4OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKGNvcGllZFRhcmdldFJlcXVpcmVkKSB7Ci0JCQkJCQkJCQkJaW50IHBvc2l0aW9uID0gdGFyZ2V0Ci0JCQkJCQkJCQkJCQkuaW5kZXhPZihjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCWlmIChwb3NpdGlvbiA9PSAtMSkgewotCQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LAotCQkJCQkJCQkJCQkJCWNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJfSBlbHNlIGlmIChpbmRleCAhPSBwb3NpdGlvbikgewotCQkJCQkJCQkJCQl0YXJnZXQubW92ZShpbmRleCwKLQkJCQkJCQkJCQkJCQljb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwKLQkJCQkJCQkJCQkJCWNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkrK2luZGV4OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJT2JqZWN0IHJlZmVyZW5jZWRFT2JqZWN0ID0gZU9iamVjdC5lR2V0KGVSZWZlcmVuY2UpOwotCQkJCQkJaWYgKHJlZmVyZW5jZWRFT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwgbnVsbCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCU9iamVjdCBjb3B5UmVmZXJlbmNlZEVPYmplY3QgPSBnZXQocmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCWlmIChjb3B5UmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCQlpZiAoIWNvcGllZFRhcmdldFJlcXVpcmVkKSB7Ci0JCQkJCQkJCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwKLQkJCQkJCQkJCQkJcmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksCi0JCQkJCQkJCQkJY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCU1ldGhvZEVsZW1lbnQgY29weSA9IChNZXRob2RFbGVtZW50KSBjb3BpZXIuY29weShlbGVtZW50KTsKLQkJY29waWVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0KLQkJLy8gdW5zZXQgdGhlIEdVSUQgb2YgdGhlIGNvcHkgYW5kIGl0cyBvZmZzdHJpbmcKLQkJLy8KLQkJY29weS5zZXRHdWlkKG51bGwpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3B5LmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIGUpLnNldEd1aWQobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0QmFzZShWYXJpYWJpbGl0eUVsZW1lbnQgYykgewotCQlmb3IgKDsgYy5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsgYyA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGMKLQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKQotCQkJOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRDYXRlZ29yeSBmaW5kSW5oZXJpdGVkKENvbGxlY3Rpb24gaW5oZXJpdGVkTGlzdCwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmhlcml0ZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGVsZW1lbnQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCSYmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBjYXRlZ29yeSB8fCBlbGVtZW50Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBjYXRlZ29yeQotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudENhdGVnb3J5IHJlbW92ZUluaGVyaXRlZChMaXN0IGluaGVyaXRlZExpc3QsCi0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5oZXJpdGVkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gY2F0ZWdvcnkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbnRlbnRJdGVtUHJvdmlkZXIgZ2V0Q29udGVudEl0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKWdldEFkYXB0ZXIoCi0JCQkJcGx1Z2luLAlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQltZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGx1Z2luKTsKLQkJSUdyb3VwQ29udGFpbmVyIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikgVG5nVXRpbC5nZXRBZGFwdGVyKAotCQkJCShFT2JqZWN0KSBwbHVnaW4sIElHcm91cENvbnRhaW5lci5jbGFzcyk7Ci0JCWlmIChncm91cENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKENvbnRlbnRJdGVtUHJvdmlkZXIpIGdyb3VwQ29udGFpbmVyCi0JCQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRJdGVtUHJvdmlkZXIgY29udGVudEl0ZW1Qcm92aWRlciA9IGdldENvbnRlbnRJdGVtUHJvdmlkZXIocGx1Z2luKTsKLQkJY29udGVudEl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihjb250ZW50SXRlbVByb3ZpZGVyKTsKLQkJaWYgKGNvbnRlbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIChTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpY29udGVudEl0ZW1Qcm92aWRlci5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCVN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgPSBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIobW9kZWwpOwotCQlzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKTsKLQkJaWYgKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RG9tYWluc0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciA9IGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihtb2RlbCk7Ci0JCXN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpOwotCQlpZiAoc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCVN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgPSBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIobW9kZWwpOwotCQlzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKTsKLQkJaWYgKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRSb2xlU2V0c0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciA9IGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihtb2RlbCk7Ci0JCXN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpOwotCQlpZiAoc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VG9vbHNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCVN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgPSBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIobW9kZWwpOwotCQlzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKTsKLQkJaWYgKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIG5leHQgYXZhaWxhYmxlIG5hbWUgdGhhdCBpcyBub3QgYWxyZWFkeSB0YWtlbiBieSBhbnkgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBiYXNlTmFtZQotCSAqIEByZXR1cm4gYmFzZU5hbWUgb2YgYmFzZU5hbWVfWCB3aGVyZSBpcyBpcyB0aGUgbnVtYmVyIHN0YXJ0aW5nIGZyb20gMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVOYW1lKExpc3Q8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzLCBTdHJpbmcgYmFzZU5hbWUpIHsKLQkJaWYoaXNOYW1lVGFrZW4oZWxlbWVudHMsIG51bGwsIGJhc2VOYW1lKSkgewotCQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJCWlmICghaXNOYW1lVGFrZW4oZWxlbWVudHMsIG51bGwsIG5hbWUpKSB7Ci0JCQkJCXJldHVybiBuYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZU5hbWU7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTGlzdDw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gc2libGluZ3MsIE1ldGhvZEVsZW1lbnQgZSwKLQkJCVN0cmluZyBiYXNlTmFtZSkgewotCQlpZiAoZS5nZXROYW1lKCkgIT0gbnVsbCAmJiBlLmdldE5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNOYW1lVGFrZW4oc2libGluZ3MsIGUsIGJhc2VOYW1lKSkgewotCQkJZS5zZXROYW1lKGJhc2VOYW1lKTsKLQkJCXNldFByZXNlbnRhdGlvbk5hbWUoZSwgYmFzZU5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAyOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJc2V0UHJlc2VudGF0aW9uTmFtZShlLCBuYW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0TmFtZShDdXN0b21DYXRlZ29yeSBwYXJlbnQsIEN1c3RvbUNhdGVnb3J5IGNjLCBTdHJpbmcgYmFzZU5hbWUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBhcmVudCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IHBsdWdpbiA9PSBudWxsID8gbnVsbCA6IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShwYXJlbnQuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLCBjYywgYmFzZU5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlVbmlxdWVOYW1lSGFuZGxlciBoYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVIYW5kbGVyKCk7Ci0JCWhhbmRsZXIucmVnaXN0ZXJOYW1lcyhwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQlTdHJpbmcgbmFtZSA9IGhhbmRsZXIuZ2V0VW5pcXVlTmFtZShiYXNlTmFtZSk7Ci0JCWNjLnNldE5hbWUobmFtZSk7Ci0JCWNjLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlOwotCi0JCQlTdHJpbmdCdWZmZXIgcHJlc05hbWVCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJhc2VOYW1lLCAiXyIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGFXb3JkID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJcHJlc05hbWVCdWYuYXBwZW5kKGFXb3JkLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0JCQkJCQkrIGFXb3JkLnN1YnN0cmluZygxKSArICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZGUuc2V0UHJlc2VudGF0aW9uTmFtZShwcmVzTmFtZUJ1Zi50b1N0cmluZygpLnRyaW0oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTmFtZVRha2VuKExpc3Q8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IHNpYmxpbmdzLCBNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gc2libGluZ3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU1ldGhvZEVsZW1lbnQgc2libGluZyA9IChNZXRob2RFbGVtZW50KSBzaWJsaW5ncy5nZXQoaSk7Ci0JCQlpZiAoc2libGluZyAhPSBlICYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShzaWJsaW5nLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGV4dHJhY3QoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDbGFzcyBjbHMpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gZXh0cmFjdFR5cGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgT2JqZWN0PiBjb2xsZWN0aW9uLCBDbGFzczxUPiBjbHMpIHsKLQkJQXJyYXlMaXN0PFQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE9iamVjdD4gaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoKFQpZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyLAotCQkJTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWRlZmF1bHROYW1lU2V0dGVyLnNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJZGVmYXVsdE5hbWVTZXR0ZXIuc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlQ2F0ZWdvcnkKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZgotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHRlbmRlZENoaWxkcmVuKENvbnRlbnRDYXRlZ29yeSBiYXNlQ2F0ZWdvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYsIENvbGxlY3Rpb24gY2hpbGRyZW4sCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihiYXNlQ2F0ZWdvcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25mLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE1pc2MuaXNCYXNlT2YoYmFzZVBsdWdpbiwgcGx1Z2luKSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCQlpZiAoY2F0ZWdvcnlQa2cgIT0gbnVsbAotCQkJCQkJJiYgbWV0aG9kQ29uZi5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMoCi0JCQkJCQkJCWNhdGVnb3J5UGtnKSkgewotCQkJCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSBmaW5kSW5oZXJpdGVkKGNhdGVnb3J5UGtnCi0JCQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBiYXNlQ2F0ZWdvcnkpOwotCQkJCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQkJCQkuYWRhcHQoY2F0ZWdvcnksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5hZGRFeHRlbmRlZENoaWxkcmVuKCk6IGNvdWxkIG5vdCBmaW5kIGFkYXB0ZXIgZm9yICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVyLmdldENoaWxkcmVuKGNhdGVnb3J5KQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJCQllbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBjaGlsZDsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCQkJJiYgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQkJCQkvLyB0aGlzIGlzIGFuIG93biBjaGlsZCBvZiBhbiBleHRlbmRlZCBjYXRlZ29yeQotCQkJCQkJCQkvLyBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBjaGlsZCBsaXN0IG9mIHRoZQotCQkJCQkJCQkvLyBiYXNlIGNhdGVnb3J5IGluIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCQkJCQkvLwotCQkJCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY29sbGVjdCB0aGUgb3duIGNoaWxkcmVuIG9mIHRoZSBleHRlbmRlZCBjYXRlZ29yaWVzCi0JCQkJCQkvLyBvZiB0aGlzIGNhdGVnb3J5IGRvd24gdGhlIGluaGVyaXRhbmNlIHRyZWUKLQkJCQkJCS8vCi0JCQkJCQlhZGRFeHRlbmRlZENoaWxkcmVuKGNhdGVnb3J5LCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWxsVG8oTGlzdCBhbGxDaGlsZHJlbiwgTGlzdCBuZXdDaGlsZHJlbikgewotCQlpbnQgaWQ7Ci0JCUJyZWFrZG93bkVsZW1lbnQgY2hpbGQsIG5leHQsIGxhc3Q7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSghbmV3Q2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQljaGlsZCA9IChCcmVha2Rvd25FbGVtZW50KSBuZXdDaGlsZHJlbi5yZW1vdmUoMCk7Ci0JCQlsaXN0LmNsZWFyKCk7Ci0JCQlsaXN0LmFkZChjaGlsZCk7Ci0JCQlsYXN0ID0gbnVsbDsKLQkJCQotCQkJLy8gZmluZCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiBpbiBuZXcgY2hpbGRyZW4gbGlzdAotCQkJLy8KLQkJCWZpbmRfbGFzdDoKLQkJCWZvcihuZXh0ID0gY2hpbGQuZ2V0UHJlc2VudGVkQWZ0ZXIoKTsgbmV4dCAhPSBudWxsOyBuZXh0ID0gbmV4dC5nZXRQcmVzZW50ZWRBZnRlcigpKSB7Ci0JCQkJbGFzdCA9IG5leHQ7Ci0JCQkJaWQgPSBpbmRleE9mTmV4dEVsZW1lbnQobmV3Q2hpbGRyZW4sIG5leHQpOwotCQkJCWlmKGlkID09IC0xKSB7Ci0JCQkJCWJyZWFrIGZpbmRfbGFzdDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxpc3QuYWRkKG5ld0NoaWxkcmVuLnJlbW92ZShpZCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmKGxhc3QgIT0gbnVsbCkgewotCQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KGFsbENoaWxkcmVuLCBsYXN0KTsKLQkJCQlpZihpZCA9PSAtMSkgewotCQkJCQlhbGxDaGlsZHJlbi5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhbGxDaGlsZHJlbi5hZGRBbGwoaWQsIGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWFsbENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjaGlsZCB0byB0aGUgYWxsQ2hpbGRyZW4gbGlzdCBiYXNlZCBvbiB0aGUgcHJlc2VudGVkQmVmb3JlCi0JICogb2YgY2hpbGQuCi0JICogCi0JICogQHBhcmFtIGFsbENoaWxkcmVuCi0JICogQHBhcmFtIGNoaWxkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvKExpc3QgYWxsQ2hpbGRyZW4sIEJyZWFrZG93bkVsZW1lbnQgY2hpbGQsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9IGNoaWxkLmdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCWludCBpZDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgewotCQkJaWQgPSAtMTsKLQkJfSBlbHNlIHsKLQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KGFsbENoaWxkcmVuLCBuZXh0KTsKLQkJCS8vIGlmKGlkID09IC0xKSB7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRuZ1V0aWwuYWRkVG8oKTogaW52YWxpZCBwcmVzZW50ZWRCZWZvcmUKLQkJCS8vIG9mICIgKyBjaGlsZCk7Ci0JCQkvLyBCcmVha2Rvd25FbGVtZW50IHByZXYgPSBjaGlsZC5nZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJCS8vIGlmKHByZXYgPT0gbnVsbCkgewotCQkJLy8gaWQgPSAwOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBpZCA9IGluZGV4T2YoYWxsQ2hpbGRyZW4sIHByZXYpOwotCQkJLy8gaWYoaWQgPiAtMSkgewotCQkJLy8gaWYoaWQgPCBhbGxDaGlsZHJlbi5zaXplKCkgLSAxKSB7Ci0JCQkvLyBpZCsrOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBpZCA9IC0xOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JCWlmIChpZCA9PSAtMSkgewotCQkJYWxsQ2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCWFsbENoaWxkcmVuLmFkZChpZCwgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5kZXggb2YgbmV4dCBlbGVtZW50IG9mIHRoZSBicmVha2Rvd24gZWxlbWVudCB3aG9zZSBwcmVzZW50ZWQtYWZ0ZXIgZWxlbWVudCBpcyB0aGUgZ2l2ZW4gCi0JICogYnJlYWsgZG93biBlbGVtZW50Ci0JICogQHBhcmFtIG1peGVkTGlzdAotCSAqICAgICAgICAgICAgbWl4ZWQgbGlzdCBvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhbmQKLQkgKiAgICAgICAgICAgIEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0cwotCSAqIEBwYXJhbSBwcmVzZW50ZWRBZnRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZk5leHRFbGVtZW50KExpc3QgbWl4ZWRMaXN0LCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEFmdGVyKSB7Ci0JCWludCBzaXplID0gbWl4ZWRMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvID0gdW53cmFwKG1peGVkTGlzdC5nZXQoaSkpOwotCQkJaWYgKG8gPT0gcHJlc2VudGVkQWZ0ZXIKLQkJCQkJfHwgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgKChWYXJpYWJpbGl0eUVsZW1lbnQpbykuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IHByZXNlbnRlZEFmdGVyKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUJhc2VQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUxpc3QgcHJvY2Vzc0NsYXNzZXMpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWxsQmFzZVBsdWdpbnMgPSBNaXNjLmdldEFsbEJhc2UocGx1Z2luKTsKLQkJYWxsQmFzZVBsdWdpbnMuYWRkKDAsIHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEJhc2VQbHVnaW5zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbGxlY3Rpb24gcGFja2FnZXMgPSBnZXRSb290UHJvY2Vzc1BhY2thZ2VzKGJhc2VQbHVnaW4sCi0JCQkJCXByb2Nlc3NDbGFzc2VzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYWNrYWdlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkUGtnID0gKE9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChpc0luc3RhbmNlT2YocHJvY2Vzc0NsYXNzZXMsIHByb2MpKSB7Ci0JCQkJCQkJcHJvY2Vzc2VzLmFkZChwcm9jKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFJvb3RQcm9jZXNzUGFja2FnZVBhdGgoQ2xhc3MgcHJvY0NsYXNzKSB7Ci0JCWlmIChwcm9jQ2xhc3MgPT0gRGVsaXZlcnlQcm9jZXNzLmNsYXNzKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQl9IGVsc2UgaWYgKHByb2NDbGFzcyA9PSBDYXBhYmlsaXR5UGF0dGVybi5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQl9IGVsc2UgaWYgKHByb2NDbGFzcyA9PSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRSb290UHJvY2Vzc1BhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlDb2xsZWN0aW9uIHByb2NDbGFzc2VzKSB7Ci0JCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2NDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ2xhc3MgY2xhenogPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nW10gcGF0aCA9IGdldFJvb3RQcm9jZXNzUGFja2FnZVBhdGgoY2xhenopOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBhdGgpOwotCQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlwYWNrYWdlcy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBwbHVnaW4gaGFzIGFueSBDb250ZW50Q2F0ZWdvcnkgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDYXRlZ29yaWVzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxDb250ZW50UGFja2FnZT4gY29uUGFja3MgPSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPENvbnRlbnRQYWNrYWdlPiBjb25QYWNrc0l0ZXIgPSBjb25QYWNrcy5pdGVyYXRvcigpO2NvblBhY2tzSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50UGFja2FnZSBjb25QYWNrID0gY29uUGFja3NJdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgY29uUGFja0l0ZXIgPSBjb25QYWNrLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7Y29uUGFja0l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gY29uUGFja0l0ZXIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkJCi0KLQlwdWJsaWMgc3RhdGljIExpc3Q8UHJvY2Vzcz4gZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+KCk7Ci0JCWZvciAoTWV0aG9kUGFja2FnZSBwa2cgOiBwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKSkgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKHBrZywgcHJvY2Vzc2VzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PFByb2Nlc3M+IGdldEFsbFByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZykgewotCQlMaXN0PFByb2Nlc3M+ICBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+ICgpOwotCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMocGtnLCBwcm9jZXNzZXMpOwotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnLAotCQkJTGlzdCBwcm9jZXNzZXMpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocCAhPSBudWxsICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkpIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHByb2Nlc3Nlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZSBpcyBhIHN1YmVsZW1lbnQgb2YgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1YmVsZW1lbnRPZihPYmplY3QgcGFyZW50LCBPYmplY3QgZSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChwYXJlbnQgPT0gZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCA9PSBlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGlzU3ViZWxlbWVudE9mKGVsZW1lbnQsIGUsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cGVyRWxlbWVudE9mKE9iamVjdCBjaGlsZCwgT2JqZWN0IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoY2hpbGQgPT0gZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50ID09IGNoaWxkKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGlzU3VwZXJFbGVtZW50T2YoY2hpbGQsIGVsZW1lbnQsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHVud3JhcChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZG8gewotCQkJCW9iaiA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCX0gd2hpbGUgKG9iaiBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJZG8gewotCQkJCW9iaiA9ICgoQ29tbWFuZFdyYXBwZXIpIG9iaikuZ2V0Q29tbWFuZCgpOwotCQkJfSB3aGlsZSAob2JqIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHdoZXRoZXIgb2JqZWN0IGlzIHdyYXBwZXIgb2JqZWN0IG9yIG5vdAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV3JhcHBlZChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciB8fCBvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCB1bndyYXAoQ29tbWFuZCBjbWQpIHsKLQkJd2hpbGUgKGNtZCBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyKSB7Ci0JCQljbWQgPSAoKENvbW1hbmRXcmFwcGVyKSBjbWQpLmdldENvbW1hbmQoKTsKLQkJfQotCi0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5iYXNlPC9jb2RlPiBpcyB0aGUgYmFzZSBlbGVtZW50IG9mIGFueQotCSAqIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZShMaXN0IGVsZW1lbnRzLCBPYmplY3QgYmFzZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWlmIChiYXNlID09ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbk5hbWUoZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsIFByZXNlbnRhdGlvbk5hbWVIZWxwZXIgaGVscGVyKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQllID0gKChDb250ZW50RGVzY3JpcHRpb24pIGUpLmVDb250YWluZXIoKTsKLQkJfQotCi0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQluYW1lID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSAJewotCQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCQluYW1lID0gaGVscGVyLmdldFByZXNlbnRhdGlvbk5hbWUoKE1ldGhvZEVsZW1lbnQpIGUpOwotCQkJCX0gCi0JCQkJaWYgKGhlbHBlciA9PSBudWxsIHx8IFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCQluYW1lID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzIGdldE93bmluZ1Byb2Nlc3MoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCQlmb3IgKGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgY29udGFpbmVyKS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJT2JqZWN0IHRvcCA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQlpZih0b3AgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgdG9wOwotCQkJaWYocHJvYy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmV0dXJuIHByb2M7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIGdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpb2JqZWN0KTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgc291cmNlLAotCQkJTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJTWV0aG9kUGx1Z2luIHRhcmdldFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHRhcmdldCk7Ci0JCU1ldGhvZFBsdWdpbiBzb3VyY2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihzb3VyY2UpOwotCQlpZiAoc291cmNlUGx1Z2luID09IHRhcmdldFBsdWdpbikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gTWlzYy5pc0Jhc2VPZih0YXJnZXRQbHVnaW4sIHNvdXJjZVBsdWdpbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPcmRlckluZm8gZ2V0T3JkZXJJbmZvKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIG9yZGVySW5mb05hbWUpIHsKLQkJU3RyaW5nIHN0ciA9IGUuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKHN0cik7Ci0JCXRyeSB7Ci0JCQlyZXMubG9hZChudWxsKTsKLQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb3MgPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgcmVzCi0JCQkJCS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9yZGVySW5mb05hbWUuZXF1YWxzSWdub3JlQ2FzZShvcmRlckluZm8uZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gb3JkZXJJbmZvOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaENvbnRyaWJ1dG9ycyhJQ2hhbmdlTm90aWZpZXIgbm90aWZpZXIsCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBib29sZWFuIGNvbnRlbnRSZWZyZXNoLAotCQkJYm9vbGVhbiBsYWJlbFVwZGF0ZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgbm90aWZpY2F0aW9uCi0JCQkJLmdldE5vdGlmaWVyKCkpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlub3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJZWxlbWVudCwgY29udGVudFJlZnJlc2gsIGxhYmVsVXBkYXRlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXNlZCB0byByZWZyZXNoIHBsdWdpbnMgdGhhdCBleHRlbmQgYW5vdGhlcgotCSAqIEBwYXJhbSBub3RpZmllcgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gY29udGVudFJlZnJlc2gKLQkgKiBAcGFyYW0gbGFiZWxVcGRhdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFBsdWdpbkV4dGVuZGVycyhJQ2hhbmdlTm90aWZpZXIgbm90aWZpZXIsCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBib29sZWFuIGNvbnRlbnRSZWZyZXNoLAotCQkJYm9vbGVhbiBsYWJlbFVwZGF0ZSkgewotCQlPYmplY3Qgb2JqID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IEFzc29jaWF0aW9uSGVscGVyLmdldFBsdWdpbkRpcmVjdEV4dGVuc2lvbnMoCi0JCQkJCSgoTWV0aG9kUGx1Z2luKSBvYmopKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCW5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZWxlbWVudCwgY29udGVudFJlZnJlc2gsIGxhYmVsVXBkYXRlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGhhc0dlbmVyYWxpemVyKGUsIENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzR2VuZXJhbGl6ZXIoVmFyaWFiaWxpdHlFbGVtZW50IGUsCi0JCQlDb2xsZWN0aW9uIHZhcmlhYmlsaXR5VHlwZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhlKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGVzLmNvbnRhaW5zKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtLCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlMaXN0IHNlbGVjdGVkVmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFsbFZlcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhlbGVtKTsKLQkJZm9yIChpbnQgaT0wOyBpPGFsbFZlcy5zaXplKCk7IGkrKykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYWxsVmVzLmdldChpKTsKLQkJCWlmICh0eXBlID09IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpKSB7Ci0JCQkJc2VsZWN0ZWRWZXMuYWRkKHZlKTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRWZXMuaXRlcmF0b3IoKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0R2VuZXJhbGl6ZXJzKFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJZmluYWwgVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5NzgxNDU0Mzk0NDkyOTg0ODNMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoKHR5cGUgPT0gbnVsbCkgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgZ2VlbnJhbGl6ZXJzIG9mIGFsbCB0eXBlcywgcmVjdXJzaXZlbHkKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldEdlbmVyYWxpemVycyhWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0R2VuZXJhbGl6ZXJzKGUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0Q29udHJpYnV0b3JzKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRHZW5lcmFsaXplcnMoZSwgVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0QWRhcHRlcihNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlJR3JvdXBDb250YWluZXIgZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQocGx1Z2luLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykgewotCQkJZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkJaWYgKGdyb3VwcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVmcmVzaEFkYXB0ZXIoTWV0aG9kUGx1Z2luIHBsdWdpbiwgU3RyaW5nW10gcGF0aCwKLQkJCU5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCBhZGFwdGVyLAotCQkJCQl0cnVlLCBmYWxzZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hBZGFwdGVyKFN0cmluZ1tdIHBhdGgsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJRU9iamVjdCBlT2JqID0gbnVsbDsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJZU9iaiA9IChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWVPYmogPSAoRU9iamVjdCkgbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROZXdWYWx1ZSgpKS5nZXQoMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJZU9iaiA9IChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWVPYmogPSAoRU9iamVjdCkgbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXRPbGRWYWx1ZSgpKS5nZXQoMCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoZU9iaiAhPSBudWxsKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iaik7Ci0JCQlUbmdVdGlsLnJlZnJlc2hBZGFwdGVyKHBsdWdpbiwgcGF0aCwgbm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoVW5jYXRlZ29yaXplZFRhc2tzSXRlbVByb3ZpZGVyKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyByZWZyZXNoIHRoZSB1bmNhdGVnb3JpemVkIHRhc2tzIGdyb3VwCi0JCS8vCi0KLQkJcmVmcmVzaEFkYXB0ZXIocGx1Z2luLCBMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1RBU0tTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwKLQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX0RPTUFJTl9XT1JLUFJPRFVDVFNfUEFUSCwKLQkJCQltc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZChNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoQWRhcHRlcigKLQkJCQlwbHVnaW4sCi0JCQkJTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9XT1JLUFJPRFVDVFRZUEVfV09SS1BST0RVQ1RTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXJzKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoRG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcihwbHVnaW4sIG1zZyk7Ci0JCXJlZnJlc2hXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkKHBsdWdpbiwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRSb2xlc0l0ZW1Qcm92aWRlcigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaEFkYXB0ZXIocGx1Z2luLCBMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1JPTEVTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlcigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaEFkYXB0ZXIocGx1Z2luLAotCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfVE9PTE1FTlRPUlNfUEFUSCwgbXNnKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmIChGZWF0dXJlTWFwVXRpbC5pc0ZlYXR1cmVNYXAoZmVhdHVyZSkpIHsKLQkJCXZhbHVlID0gbmV3IEZlYXR1cmVNYXBFbnRyeVdyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCShGZWF0dXJlTWFwLkVudHJ5KSB2YWx1ZSwgb2JqZWN0LCAoRUF0dHJpYnV0ZSkgZmVhdHVyZSwKLQkJCQkJaW5kZXgsIGFkYXB0ZXJGYWN0b3J5LCBudWxsKTsKLQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJdmFsdWUgPSBuZXcgQXR0cmlidXRlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKHZhbHVlLCBvYmplY3QsCi0JCQkJCShFQXR0cmlidXRlKSBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnksIG51bGwpOwotCQl9IGVsc2UgaWYgKCEoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmlzQ29udGFpbm1lbnQoKSkgewotCQkJdmFsdWUgPSBuZXcgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihmZWF0dXJlLCB2YWx1ZSwgb2JqZWN0LAotCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKEd1aWRhbmNlIGd1aWRhbmNlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZ3VpZGFuY2UuZUNvbnRhaW5lcigpOwotCQlpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoY29udGFpbmVyLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRHdWlkYW5jZXMoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGNvbnRlbnRQa2cgPSBvYmplY3QuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGVudFBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRlbnRQa2csIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldFdvcmtQcm9kdWN0cygpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgYWRhcHRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhZGFwdGVyID0gdW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXIpLmdldEltYWdlKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihhZGFwdGVyICE9IG9iamVjdCAmJiBhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkoKElEaXNwb3NhYmxlKWFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgY29sTmFtZSkgewotCQkvLyBpZihjb2xOYW1lID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSkKLQkJLy8gaWYoY29sTmFtZSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpCi0JCWlmIChjb2xOYW1lID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCXJldHVybiBnZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudCB1cCB3aXRoaW5nIHRoZSBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZWxlbWVudE9iagotCSAqIEBwYXJhbSBlQ2xhc3NlcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbW92ZVVwKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlNb3ZlVXBDb21tYW5kIGNtZCA9IG5ldyBNb3ZlVXBDb21tYW5kKGFjdGl2aXR5LCBlbGVtZW50T2JqLCBlQ2xhc3Nlcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50IGRvd24gd2l0aGluIHRoZSBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZWxlbWVudE9iagotCSAqIEBwYXJhbSBlQ2xhc3NlcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbW92ZURvd24oQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdCBlbGVtZW50T2JqLAotCQkJQ29sbGVjdGlvbiBlQ2xhc3NlcywgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU1vdmVEb3duQ29tbWFuZCBjbWQgPSBuZXcgTW92ZURvd25Db21tYW5kKGFjdGl2aXR5LCBlbGVtZW50T2JqLAotCQkJCWVDbGFzc2VzKTsKLQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZVJvb3RDdXN0b21DYXRlZ29yeSgKLQkJCUNvbnRlbnRQYWNrYWdlIGN1c3RvbUNhdGVnb3J5UGtnKSB7Ci0JCS8vIGNyZWF0ZSByb290IGN1c3RvbSBjYXRlZ29yeQotCQkvLwotCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpOwotCQlyb290Q3VzdG9tQ2F0ZWdvcnkuc2V0TmFtZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQlDb250ZW50UGFja2FnZSBoaWRkZW5Qa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShjdXN0b21DYXRlZ29yeVBrZwotCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCksIE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQlpZiAoaGlkZGVuUGtnID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBoaWRkZW4gcGFja2FnZSB0byBzdG9yZSB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJCS8vCi0JCQloaWRkZW5Qa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJaGlkZGVuUGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSk7Ci0JCQljdXN0b21DYXRlZ29yeVBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKGhpZGRlblBrZyk7Ci0JCX0KLQkJaGlkZGVuUGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCi0JCXJldHVybiByb290Q3VzdG9tQ2F0ZWdvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDdXN0b21DYXRlZ29yeSBnZXRSb290Q3VzdG9tQ2F0ZWdvcnkoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlDb250ZW50UGFja2FnZSBjdXN0b21DYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCWlmIChjdXN0b21DYXRlZ29yeVBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlIGhpZGRlblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGN1c3RvbUNhdGVnb3J5UGtnCi0JCQkJLmdldENoaWxkUGFja2FnZXMoKSwgTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSk7Ci0JCWlmIChoaWRkZW5Qa2cgIT0gbnVsbCAmJiAhaGlkZGVuUGtnLmdldENvbnRlbnRFbGVtZW50cygpLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgaGlkZGVuUGtnLmdldENvbnRlbnRFbGVtZW50cygpLmdldCgwKTsKLQkJfQotCQlDdXN0b21DYXRlZ29yeSByb290ID0gY3JlYXRlUm9vdEN1c3RvbUNhdGVnb3J5KGN1c3RvbUNhdGVnb3J5UGtnKTsKLQkJLy8gY29kZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eTogYWRkIGFsbCB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgdW5kZXIKLQkJLy8gY3VzdG9tQ2F0ZWdvcnlQa2cKLQkJLy8gdG8gdGhlIGNvbnRlbnQgZWxlbWVudCByZWZlcmVuY2UgbGlzdCBvZiB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkgc28KLQkJLy8gdGhleSBjYW4gYmUgdmlzaWJsZQotCQkvLyBpbiB0aGUgbmV3IFVJCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGN1c3RvbUNhdGVnb3J5UGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyb290LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGQoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUm9vdEN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCUVPYmplY3QgcGtnID0gY2F0ZWdvcnkuZUNvbnRhaW5lcigpOwotCQlpZiAocGtnIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkmJiBNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FCi0JCQkJCQkuZXF1YWxzKCgoQ29udGVudFBhY2thZ2UpIHBrZykuZ2V0TmFtZSgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZShNZXRob2RQYWNrYWdlIHBrZykgewotCQlpZiAoICEocGtnIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8Ci0JCQkJIU1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUKLQkJCQkJCS5lcXVhbHMocGtnLmdldE5hbWUoKSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIHRoZSBwbHVnaW4gYW5kIG1ha2Ugc3VyZSBpdCdzIHRoZSBvYmplY3QsIFRPRE8KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlcyByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCdzIGNvbnRhaW5lciBpZiB0aGlzIGhhcyBiZWVuIG1vZGlmaWVkCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUNvbnRhaW5lclJlc291cmNlKEVPYmplY3QgZWxlbWVudCwKLQkJCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlcikgewotCQkvLyBzYXZlIGNvbnRhaW5lcidzIHJlc291cmNlCi0JCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRDYXRlZ29yeSBmaW5kQ29udHJpYnV0b3IoQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2csCi0JCQlDb250ZW50Q2F0ZWdvcnkgYmFzZUNhdGVnb3J5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3J5UGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNhdCA9IChDb250ZW50Q2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNhdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gYmFzZUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIGNhdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJaWYgKCFjYXRlZ29yeS5nZXRDb25jZXB0c0FuZFBhcGVycygpLmlzRW1wdHkoKQotCQkJCXx8ICFjYXRlZ29yeS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXJldHVybiAoKERpc2NpcGxpbmUpIGNhdGVnb3J5KS5nZXRUYXNrcygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuICgoRG9tYWluKSBjYXRlZ29yeSkuZ2V0V29ya1Byb2R1Y3RzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJcmV0dXJuICgoUm9sZVNldCkgY2F0ZWdvcnkpLmdldFJvbGVzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgVG9vbCkgewotCQkJcmV0dXJuICgoVG9vbCkgY2F0ZWdvcnkpLmdldFRvb2xNZW50b3JzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQlyZXR1cm4gKChXb3JrUHJvZHVjdFR5cGUpIGNhdGVnb3J5KS5nZXRXb3JrUHJvZHVjdHMoKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSBpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgdXNlckRlZmluZWRDYXRlZ29yeSA9ICgoQ3VzdG9tQ2F0ZWdvcnkpIGNhdGVnb3J5KTsKLQkJCXJldHVybiB1c2VyRGVmaW5lZENhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pc0VtcHR5KCkKLQkJCS8vICYmIHVzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2V0U3ViQ2F0ZWdvcmllcygpLmlzRW1wdHkoKQotCQkJOwotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjYXRlZ29yeTogIiArIGNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvcmRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9QYWNrYWdlKFdvcmtPcmRlciBvcmRlciwgQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0JCWlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChvcmRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3JkZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21QYWNrYWdlKFdvcmtPcmRlciBvcmRlciwgQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0JCWlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZShvcmRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWFkZFRvUGFja2FnZSgoV29ya09yZGVyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSwKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlhZGRUb1BhY2thZ2UoKFdvcmtPcmRlcikgaXRlci5uZXh0KCksCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZW1vdmVGcm9tUGFja2FnZSgoV29ya09yZGVyKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSwKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0T2xkVmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlyZW1vdmVGcm9tUGFja2FnZSgoV29ya09yZGVyKSBpdGVyLm5leHQoKSwKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQotCQkJCWFkYXB0ZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgZ2xvYmFsIHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgZ2xvYmFsIHBhY2thZ2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PENvbnRlbnRQYWNrYWdlPiBnZXRHbG9iYWxQYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUFycmF5TGlzdDxDb250ZW50UGFja2FnZT4gcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRQYWNrYWdlPigpOwotCQlTdHJpbmdbXVtdIGNhdGVnb3J5UGF0aHMgPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmdldENhdGVnb3J5UGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeVBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBwYXRoID0gY2F0ZWdvcnlQYXRoc1tpXTsKLQkJCUNvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlwYXRoKTsKLQkJCWlmIChjYXRlZ29yeVBrZyAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZXMuYWRkKGNhdGVnb3J5UGtnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYWNrYWdlczsKLQl9Ci0KLQkKLQkvKioKLQkgKiByZXR1cm4gYWxsIHRoZSBjb250ZW50IGNhdGVnb3J5IHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbi4gCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBnbG9iYWwgcGFja2FnZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8Q29udGVudFBhY2thZ2U+IGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIGdldEdsb2JhbFBhY2thZ2VzKHBsdWdpbik7Ci0JfQotCQotCQotCS8qKgotCSAqIHJldHVybiBhbGwgdGhlIHN5c3RlbSBkZWZpbmVkIHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgYWxsIHN5c3RlbSBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxTeXN0ZW1QYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUFycmF5TGlzdCBwYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nW11bXSBwYXRocyA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZ2V0QWxsU3lzdGVtUGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGF0aCA9IHBhdGhzW2ldOwotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwgJiYgIXBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlwYWNrYWdlcy5hZGQocGtnKTsKLQkJCQlFT2JqZWN0IG8gPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCXdoaWxlICgobyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmICFwYWNrYWdlcy5jb250YWlucyhvKSkgewotCQkJCQlwYWNrYWdlcy5hZGQobyk7Ci0JCQkJCW8gPSBvLmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbHNvIGFkZCB0aGUgaGlkZGVuIGNvc3RvbSBjYXRlZ29yeSBwYWNrYWdlCi0JCUNvbnRlbnRQYWNrYWdlIGN1c3RvbUNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5UGtnICE9IG51bGwpIHsKLQkJCUNvbnRlbnRQYWNrYWdlIGhpZGRlblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQljdXN0b21DYXRlZ29yeVBrZy5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCU1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQkJaWYgKGhpZGRlblBrZyAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZXMuYWRkKGhpZGRlblBrZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJlZGVmaW5lZChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCSYmIGlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJU3RyaW5nIHBhdGggPSBNb2RlbFN0cnVjdHVyZQotCQkJCS50b0ZpbGVQYXRoKE1pc2MuZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oZSkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBNb2RlbFN0cnVjdHVyZS5BTExfUFJFREVGSU5FRF9QQVRIUy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwcmVkZWZpbmVQYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAocHJlZGVmaW5lUGF0aC5zdGFydHNXaXRoKHBhdGgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RQYWNrYWdlIGdldE1ldGhvZFBhY2thZ2UoRU9iamVjdCBlKSB7Ci0JCWZvciAoOyAhKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAmJiBlICE9IG51bGw7IGUgPSBlLmVDb250YWluZXIoKSkKLQkJCTsKLQkJcmV0dXJuIChNZXRob2RQYWNrYWdlKSBlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZ2V0UGFyZW50TWV0aG9kUGFja2FnZShFT2JqZWN0IGUpIHsKLQkJRU9iamVjdCBlb2JqID0gZTsKLQkJd2hpbGUoZW9iaiAhPSBudWxsKSB7Ci0JCQllb2JqID0gZW9iai5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoZW9iaiA9PSBudWxsICkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIGlmIChlb2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCXJldHVybiAoTWV0aG9kUGFja2FnZSkgZW9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgZm9yY2luZyB0byBzZWxlY3QgdGhlIGdsb2JhbCBwYWNrYWdlcyBvZgotCSAqIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Z2lucywgdGhpcyBpcyBuZWVkZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXhwb3J0aW5nLgotCSAqIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1nciBpZiBub3QgbnVsbCwgd2lsbCB1c2UgdGhlIGdpdmVuIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBjaGFuZ2VkIGRpcmVjdGx5Ci0JICogQHBhcmFtIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JCUxpc3QgcGtnU2VscyA9IG5ldyBBcnJheUxpc3QoY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zVG9BZGQgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJTGlzdDxNZXRob2RQYWNrYWdlPiBwYWNrYWdlc1RvQWRkID0gbmV3IEFycmF5TGlzdDxNZXRob2RQYWNrYWdlPigpOwotCi0JCS8vIG1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgcGFja2FnZXMgYXJlIHNlbGVjdGVkLgotCQkvLyBpZiBhIHBhY2thZ2UgaXMgc2VsZWN0ZWQsIGFsbCB0aGUgcGFyZW50IHBhY2thZ2VzIG11c3QgYmUgc2VsZWN0ZWQuCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChwa2dTZWxzKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCQlFT2JqZWN0IGMgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJd2hpbGUgKCAoKGMgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB8fCAoYyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIAotCQkJCQkmJiAhcGtnU2Vscy5jb250YWlucyhjKSAmJiAhcGx1Z2lucy5jb250YWlucyhjKSApIHsKLQkJCQlpZiAoYyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlwbHVnaW5zLmFkZChjKTsKLQkJCQkJcGx1Z2luc1RvQWRkLmFkZCgoTWV0aG9kUGx1Z2luKWMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBrZ1NlbHMuYWRkKGMpOwotCQkJCQlwYWNrYWdlc1RvQWRkLmFkZCgoTWV0aG9kUGFja2FnZSljKTsKLQkJCQl9Ci0JCQkJCi0JCQkJYyA9IGMuZUNvbnRhaW5lcigpOwotCQkJfQkKLQkJCQotCQkJLy8gaWYgdGhlIHBhY2thZ2UgaXMgYSBQcm9jZXNzQ29tcG9uZW50LCBzZWxlY3QgYWxsIHRoZSBjaGlsZCBwYWNrYWdlcwotCQkJaWYgKCBwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCUxpc3Qgb2xkUGtnU2VscyA9IG5ldyBBcnJheUxpc3QocGtnU2Vscyk7Ci0JCQkJZ2V0QWxsQ2hpbGRQYWNrYWdlcyhwa2csIHBrZ1NlbHMpOwotCQkJCXBrZ1NlbHMucmVtb3ZlQWxsKG9sZFBrZ1NlbHMpOwotCQkJCXBhY2thZ2VzVG9BZGQuYWRkQWxsKHBrZ1NlbHMpOwotCQkJfQotCQl9Ci0JCUNvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBsdWdpbkxpc3QoYWN0aW9uTWdyLCBjb25maWcsIHBsdWdpbnNUb0FkZCk7Ci0JCUNvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBhY2thZ2VMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBwYWNrYWdlc1RvQWRkKTsKLQkJcGtnU2VscyA9IG5ldyBBcnJheUxpc3QoY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gbWFrZSBzdXJlIGFsbCBzeXN0ZW0gcGFja2FnZXMgYXJlIHNlbGVjdGVkCi0JCUxpc3Q8TWV0aG9kUGFja2FnZT4gc3lzUGFja2FnZXNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGFja2FnZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdHAgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRwLm5leHQoKTsKLQkJCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcGtnID0gaXQubmV4dCgpOwotCQkJCWlmICghcGtnU2Vscy5jb250YWlucyhwa2cpICYmIHBrZyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJcGtnU2Vscy5hZGQocGtnKTsKLQkJCQkJc3lzUGFja2FnZXNUb0FkZC5hZGQoKE1ldGhvZFBhY2thZ2UpcGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvTWV0aG9kUGFja2FnZUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIHN5c1BhY2thZ2VzVG9BZGQpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIGNoaWxkIHBhY2thZ2VzIG9mIHRoZSBnaXZlbiBNZXRob2RQYWNrYWdlIGFuZCBhZGQgdG8gdGhlIGxpc3QKLQkgKiBAcGFyYW0gcGtnIE1ldGhvZFBhY2thZ2UKLQkgKiBAcGFyYW0gcmVzdWx0IExpc3QgdGhlIHBhY2thZ2VzIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxDaGlsZFBhY2thZ2VzKE1ldGhvZFBhY2thZ2UgcGtnLCBMaXN0IHJlc3VsdCkgewotCQlMaXN0IHBrZ3MgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkKLQkJLy8gb25seSBhZGQgdW5pcXVlIGl0ZW1zCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IHAgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoICFyZXN1bHQuY29udGFpbnMocCkgKSB7Ci0JCQkJcmVzdWx0LmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgcmVzdWx0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBvYmplY3QncyBtZXRob2QgcGFja2FnZSBhbmQgcGx1Z2luIHRvIHRoZSBnaXZlbgotCSAqIGNvbmZpZ3VyYXRpb24gaWYgdGhleSBhcmUgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUbyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgRU9iamVjdCBvYmplY3QsCi0JCQlTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZFBhY2thZ2UgcGtnID0gZ2V0TWV0aG9kUGFja2FnZShvYmplY3QpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCWlmICghY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpKSB7Ci0JCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJCQlhZGRlZE9iamVjdHMuYWRkKHBrZyk7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCQkJCi0JCQkJLy8gMTUwNTUyIC0gUHJvY2Vzc2VzOiBJZiBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQgYnkgaXRzZWxmIGR1ZSB0byBhY3Rpb25zIGxpa2UgQ1AgZXh0ZW5kaWluZyBvciBkZWVwIGNvcHksIAotCQkJCS8vIHRoZXJlIGlzIGEgcmVmcmVzaCBpc3N1ZS4KLQkJCQkvLyBtaXNzaW5nIHRoZSAiISIgaGVyZSEKLQkJCQlpZiAoIWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJCQkJYWRkZWRPYmplY3RzLmFkZChwbHVnaW4pOwotCQkJCQotCQkJCQkvLyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBtYWtlIHN1cmUgYWxsIHJlbGF0ZWQgc3lzdGVtIHBhY2thZ2VzIGFyZSBzZWxlY3RlZC4KLQkJCQkJLy8gb3RoZXJ3aXNlIHRoZSBjb25maWd1cmF0aW9uIGV4cGxvcmVyIHdpbGwgbm90IHdvcmsKLQkJCQkJLy8gMTUwNTUyIC0gUHJvY2Vzc2VzOiBJZiBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQgYnkgaXRzZWxmIGR1ZSB0byBhY3Rpb25zIGxpa2UgQ1AgZXh0ZW5kaWluZyBvciBkZWVwIGNvcHksIHRoZXJlIGlzIGEgcmVmcmVzaCBpc3N1ZS4JCQotCQkJCQl2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCwgY29uZmlnKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb0NvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlFT2JqZWN0IG9iamVjdCwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlpbnQgc2l6ZSA9IGFkZGVkT2JqZWN0cy5zaXplKCk7Ci0JCWFkZFRvKGNvbmZpZywgb2JqZWN0LCBhZGRlZE9iamVjdHMpOwotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCS8vIGFkZCBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaWYgdGhlcmUgaXMgYW55Ci0JCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCBjID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgYyAhPSBudWxsOyBjID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYwotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJYWRkVG8oY29uZmlnLCBjLCBhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFkZGVkT2JqZWN0cy5zaXplKCkgPiBzaXplOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDwvY29kZT4gdGhhdCBpcyB0byBiZQotCSAqICAgICAgICAgICAgdXNlZCB0byBwYXJlbnQgYW55IGRpYWxvZ3Mgd2l0aCB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIFVJIGNvbnRleHQgKGRlY2xhcmVkIGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRvIGF2b2lkIGFueSBkaXJlY3QgcmVmZXJlbmNlcyBvbiB0aGUgU1dUIGNvbXBvbmVudCkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrRWRpdChFT2JqZWN0IGVPYmosIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmICgoKEludGVybmFsRU9iamVjdCkgZU9iaikuZVByb3h5VVJJKCkgIT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyBhIHVucmVzb2x2ZWQgcHJveHksIGRpc2FsbG93IGVkaXRpbmcgaXQKLQkJCS8vCi0JCQlFT2JqZWN0IHByb3h5ID0gZU9iajsKLQkJCVN0cmluZyB1cmkgPSAoKEludGVybmFsRU9iamVjdCkgcHJveHkpLmVQcm94eVVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIGNvbnRhaW5lclVSSSA9IHByb3h5LmVDb250YWluZXIoKSAhPSBudWxsID8gcHJveHkKLQkJCQkJLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQk6IG51bGw7Ci0JCQlTdHJpbmcgbG9jYXRpb247Ci0JCQlpZiAoY29udGFpbmVyVVJJICE9IG51bGwpIHsKLQkJCQlsb2NhdGlvbiA9IGNvbnRhaW5lclVSSSAhPSBudWxsICYmIGNvbnRhaW5lclVSSS5pc0ZpbGUoKSA/IGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKQotCQkJCQkJOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChsb2NhdGlvbi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCWxvY2F0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJIiBpbiAnJ3swfScnIiwgbmV3IE9iamVjdFtdIHsgbG9jYXRpb24gfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChMaWJyYXJ5RWRpdFJlc291cmNlcy51bnJlc29sdmVkT2JqZWN0RXJyb3JfcmVhc29uCi0JCQkJCSwgbmV3IE9iamVjdFtdIHsgcHJveHkuZUNsYXNzKCkuZ2V0TmFtZSgpLCB1cmksIGxvY2F0aW9uIH0pOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtc2csIG51bGwpOwotCQl9CQkJCQotCQkKLQkJSUFjY2Vzc0NvbnRyb2xsZXIgYWMgPSBTZXJ2aWNlcy5nZXRBY2Nlc3NDb250cm9sbGVyKCk7Ci0JCWlmKGFjID09IG51bGwpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBhYy5jaGVja01vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVPYmopLCBjb250ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhlIGdpdmVuIGVsZW1lbnQgZm9yIG1vZGlmaWFibGUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEB0aHJvd3MgTWVzc2FnZUV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tNb2RpZnkoRU9iamVjdCBlKSB7Ci0JCUlBY2Nlc3NDb250cm9sbGVyIGFjID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpOwotCQlpZihhYyAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGFjLmNoZWNrTW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZSksIG51bGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFVtYVV0aWwuZ2V0TWVzc2FnZShzdGF0dXMpOwotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQlPYmplY3Qgb2JqOwotCQkJCQlpZihlLmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCQlvYmogPSBlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJb2JqID0gZTsgCi0JCQkJCX0KLQkJCQkJbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoVW1hUmVzb3VyY2VzLmVycl9jYW5ub3RNb2RpZnkwLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IG9iaiB9KTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24obXNnKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcihtc2cpOwotCQkJSVN0YXR1cyBzdGF0dXNlc1tdID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQoc3RhdHVzZXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCW1zZyA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCB8fCBtc2cubGVuZ3RoKCkgPT0gMCkgewotCQkJbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlOyAKLQkJfQotCQlyZXR1cm4gbXNnOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcGxhY2VyKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXJldHVybiBiYXNlICE9IG51bGwgJiYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHZW5lcmFsaXplcihPYmplY3Qgb2JqLCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodHlwZXMgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gdHlwZXMuY29udGFpbnModmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVUZXh0KFN0cmluZyB0eXBlS2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV8iICsgdHlwZUtleSArICJfdHlwZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Vbmtub3duX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIHVzZXIgZnJpZW5kbHkgdHlwZSBuYW1lIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVUZXh0KEVPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0VHlwZVRleHQoZWxlbWVudC5lQ2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSB1c2VyLWZyaWVuZGx5IHR5cGUgbmFtZSBmb3IgYSBnaXZlbiB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVUZXh0KEVDbGFzcyB0eXBlKSB7Ci0JCXJldHVybiBnZXRUeXBlVGV4dCh0eXBlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBsb29rcyB1cCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmVhdHVyZVRleHQoT2JqZWN0IGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCXJldHVybiBnZXRGZWF0dXJlVGV4dCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiVW5rbm93biI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGxvY2tlZC4gQW4gb2JqZWN0IGlzIGNvbnNpZGVyZWQgbG9ja2VkIGlmCi0JICogaXRzIE1ldGhvZFBsdWdpbiBoYXMgdGhlIGF0dHJpYnV0ZSB1c2VyQ2hhbmdlYWJsZSBzZXQgdG8gZmFsc2UuIFRoZQotCSAqICdsb2NrZWQnIHN0YXR1cyBvZiBhbiBvYmplY3QgaXMgaW5kZXBlbmRlbnQgZnJvbSAncmVhZC1vbmx5JyBzdGF0dXMgb2YKLQkgKiBpdHMgcmVzb3VyY2UgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvY2tlZChFT2JqZWN0IG9iamVjdCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ob2JqZWN0KTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gIXBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0V4aXN0KENvbGxlY3Rpb24gd3JhcHBlcnMsIE9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHVud3JhcChpdGVyYXRvci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgPT0gZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgaW5kZXggb2YgZWxlbWVudCBvciBpdHMgd3JhcHBlciBpbiB0aGUgZ2l2ZW4gbGlzdAotCSAqIEBwYXJhbSBsaXN0IGEgbWl4ZWQgbGlzdCBvZiBlbGVtZW50IGFuZCB3cmFwcGVyCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIC0xIGlmIHRoZSBlbGVtZW50IG9yIGl0cyB3cmFwcGVyIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEluZGV4T2YoTGlzdCBsaXN0LCBPYmplY3QgZSkgewotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB1bndyYXAobGlzdC5nZXQoaSkpOwotCQkJaWYoZWxlbWVudCA9PSBlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRhaW5pbmdGZWF0dXJlKE9iamVjdCBvYmplY3QsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIpIHsKLQkJCUVPYmplY3QgcGFyZW50RU9iaiA9IChFT2JqZWN0KSBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpCi0JCQkJCS5nZXRDaGlsZHJlbkZlYXR1cmVzKHBhcmVudCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCQlpZiAoKChDb2xsZWN0aW9uKSBwYXJlbnRFT2JqLmVHZXQoZikpLmNvbnRhaW5zKG9iamVjdCkpIHsKLQkJCQkJCXJldHVybiBmOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHBhcmVudEVPYmouZUdldChmKSA9PSBvYmplY3QpIHsKLQkJCQkJCXJldHVybiBmOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgdXNlci1mcmllbmRseSBuYW1lIGZvciBhIGdpdmVuIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmVhdHVyZVRleHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3dpdGNoIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKSB7Ci0JCS8vIGNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCS8vIHJldHVybiAiUHJpbWFyeSBQZXJmb3JtZXIiOwotCQkvLyBjYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkvLyByZXR1cm4gIlNlY29uZGFyeSBQZXJmb3JtZXIiOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5hc3Npc3RzX3RleHQ7IAotCQl9Ci0KLQkJU3RyaW5nIGZlYXR1cmVLZXk7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlOwotCQkJZmVhdHVyZUtleSA9IGVGZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiXyIgKyBlRmVhdHVyZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWZlYXR1cmVLZXkgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51bmtub3duX3RleHQ7IAotCQl9Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldFN0cmluZygiX1VJXyIgKyBmZWF0dXJlS2V5ICsgIl9mZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGlicmFyeSByb290IHBhdGggZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBhc3N1bWluZyB0aGUgZWxlbWVudCBhbmQKLQkgKiBpdCdzIHBhcmVudHMgYXJlIGxvYWRlZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBGaWxlIHRoZSByb290IHBhdGggb2YgdGhlIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0TGlicmFyeVJvb3RQYXRoKEVPYmplY3QgZWxlbWVudCkgewotCQlFT2JqZWN0IHBhcmVudCA9IGVsZW1lbnQ7Ci0JCXdoaWxlICgocGFyZW50ICE9IG51bGwpICYmICEocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCX0KLQotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgdXJpID0gcGFyZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXJldHVybiBmLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZ1bGwgcGF0aCBVUkkgYnkgYXBwZW5kaW5nIHRoZSByZWxhdGl2ZSBwYXRoIFVSSSB0byB0aGUgb2JqZWN0J3MKLQkgKiBsaWJyYXJ5IHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqICAgICAgICAgICAgRU9iamVjdCB0aGUgb2JqZWN0IHRvIGZpbmQgdGhlIE1ldGhvZExpYnJhcnksIGNhbiBiZSBhbnkKLQkgKiAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSB1cmkgdG8gYmUgZml4ZWQKLQkgKiBAcmV0dXJuIFVSSSB0aGUgZnVsbCBwYXRoIHVyaQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIGdldEZ1bGxQYXRoVVJJKEVPYmplY3QgbywgVVJJIHVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQkvLyB0cnkgaWYgdGhpcyBpcyBhIHZhbGlkIFVSTCBvciBub3QKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSB1cmkudG9VUkwoKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCXJldHVybiB1cmk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJOyAvLyBub3QgYSB2YWxpZCB1cmwsIG1heWJlIGEgcmVsYXRpdmUgcGF0aAotCQl9Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQncyByZXNvdXJjZSBwYXRoCi0JCUZpbGUgZiA9IGdldExpYnJhcnlSb290UGF0aChvKTsKLQkJaWYgKGYgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBGaWxlKGYsIE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwodXJpLnRvU3RyaW5nKCkpKS50b1VSSSgpOwotCQl9Ci0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBUbyBnZXQgdGhlIG5vZGUgaWNvbi9zaGFwZSBpY29uIGZ1bGwgcGF0aCBVUkkgYnkgYXBwZW5kaW5nIHRoZSByZWxhdGl2ZSBwYXRoIFVSSSB0byB0aGUgb2JqZWN0J3MKLQkgKiBsaWJyYXJ5IHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqICAgICAgICAgICAgRU9iamVjdCB0aGUgb2JqZWN0IHRvIGZpbmQgdGhlIE1ldGhvZExpYnJhcnksIGNhbiBiZSBhbnkKLQkgKiAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSB1cmkgdG8gYmUgZml4ZWQKLQkgKiBAcmV0dXJuIFVSSSB0aGUgZnVsbCBwYXRoIHVyaQotCSAqLwotCS8vRklYTUU6IG1ha2Ugc3RvcmFnZSBpbmRlcGVuZGVudAotCXB1YmxpYyBzdGF0aWMgVVJJIGdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoRU9iamVjdCBvLCBVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVyaTsKLQkJfQotCi0JCS8vIHRyeSBpZiB0aGlzIGlzIGEgdmFsaWQgVVJMIG9yIG5vdAotCQl0cnkgewotCQkJVVJMIHVybCA9IHVyaS50b1VSTCgpOwotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHVyaTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQk7IC8vIG5vdCBhIHZhbGlkIHVybCwgbWF5YmUgYSByZWxhdGl2ZSBwYXRoCi0JCX0KLQotCQkvLyBuZWVkIHRvIGdldCB0aGUgZWxlbWVudCdzIHJlc291cmNlIHBhdGgKLQkJRmlsZSBmID0gZ2V0TGlicmFyeVJvb3RQYXRoKG8pOwotCQlTdHJpbmcgcGF0aCA9IHVyaS5nZXRQYXRoKCk7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihvKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UocGx1Z2luKSkgewotCQkJRmlsZSBwbHVnaW5EaXIgPSBuZXcgRmlsZShwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChwYXRoLmluZGV4T2YocGx1Z2luLmdldE5hbWUoKSArICIvIikgPT0gMCkgewkvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBGaWxlKGYsIE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwodXJpLnRvU3RyaW5nKCkpKQotCQkJCQkJLnRvVVJJKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgRmlsZShwbHVnaW5EaXIsIE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwodXJpLnRvU3RyaW5nKCkpKS50b1VSSSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0YWNrVHJhY2VTdHJpbmcoVGhyb3dhYmxlIGUpIHsKLQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cldyaXRlcikpOwotCQlyZXR1cm4gc3RyV3JpdGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsV2l0aFBhdGgoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldExhYmVsV2l0aFBhdGgoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCk7Ci0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQlyZXR1cm4gZ2V0TGFiZWxXaXRoUGF0aCgoKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0KS5lQ29udGFpbmVyKCkpOwotCQl9Ci0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmplY3Q7Ci0JCQlDb2xsZWN0aW9uPE5hbWVkRWxlbWVudD4gaXRlbVBhdGggPSBNaXNjLmdldE9iamVjdFRyZWVSZWxhdGl2ZVRvUGx1Z2luKG1lKTsKLQkJCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRMYWJlbChvYmplY3QsIG1lLmdldEd1aWQoKSkpOwotCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKG9iamVjdCkgIT0gbnVsbCkgewotCQkJCXBhdGgKLQkJCQkuYXBwZW5kKCIsICIpLmFwcGVuZChNZXRob2RFbGVtZW50VXRpbC5nZXRNZXRob2RNb2RlbChvYmplY3QpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yPE5hbWVkRWxlbWVudD4gaXRlciA9IGl0ZW1QYXRoLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5hbWVkRWxlbWVudCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBzID0gU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpOwotCi0JCQkJCWlmIChNb2RlbFN0cnVjdHVyZS5DT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FLmVxdWFscyhzKSB8fCBNb2RlbFN0cnVjdHVyZS5DT05URU5UX1BBQ0tBR0VfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHMpCi0JCQkJCQkJfHwgKCgoTmFtZWRFbGVtZW50KSBvYmplY3QpLmVxdWFscyhlKSkpIHsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0T3duZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWNvbW1hbmQgPSBUbmdVdGlsLnVud3JhcChjb21tYW5kKTsKLQkJRU9iamVjdCBvd25lciA9IG51bGw7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJb3duZXIgPSAoKEFkZENvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCW93bmVyID0gKChSZW1vdmVDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBTZXRDb21tYW5kKSB7Ci0JCQlvd25lciA9ICgoU2V0Q29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgTW92ZUNvbW1hbmQpIHsKLQkJCW93bmVyID0gKChNb3ZlQ29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJT2JqZWN0IG8gPSAoKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlvd25lciA9IChFT2JqZWN0KSBvOwotCQkJfQotCQl9Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXQ8UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKENvbW1hbmQgY21kKSB7Ci0JCVNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJY29sbGVjdE1vZGlmaWVkUmVzb3VyY2VzKGNtZCwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0TW9kaWZpZWRSZXNvdXJjZXMoQ29tbWFuZCBjb21tYW5kLCBTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNvbW1hbmQpCi0JCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQkJfSAKLQkJZWxzZSBpZihjb21tYW5kIGluc3RhbmNlb2YgQ29tcG91bmRDb21tYW5kKXsKLQkJCUxpc3QgY29tbWFuZExpc3QgPSAoKENvbXBvdW5kQ29tbWFuZCljb21tYW5kKS5nZXRDb21tYW5kTGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJY29sbGVjdE1vZGlmaWVkUmVzb3VyY2VzKChDb21tYW5kKSBpdGVyLm5leHQoKSwgbW9kaWZpZWRSZXNvdXJjZXMpOwkJCQkKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUVPYmplY3QgbW9kaWZpZWQgPSBUbmdVdGlsLmdldE93bmVyKGNvbW1hbmQpOwotCQkJaWYobW9kaWZpZWQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gbW9kaWZpZWQuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBjb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChTdHJpbmcgYXR0YWNobWVudFN0cmluZykgewotCQlBcnJheUxpc3QgYXR0YWNobWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhdHRhY2htZW50U3RyaW5nID09IG51bGwpCi0JCQlhdHRhY2htZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZpbGVzW10gPSBhdHRhY2htZW50U3RyaW5nCi0JCQkJLnNwbGl0KEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SX1NQTElUVEVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJYXR0YWNobWVudHMuYWRkKGZpbGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gYXR0YWNobWVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb1N0cmluZyhMaXN0IGF0dGFjaG1lbnRMaXN0KSB7Ci0JCVN0cmluZyBhdHRhY2htZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBhdHRhY2htZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoaSsrID4gMCkKLQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZwotCQkJCQkJLmNvbmNhdChHVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7Ci0JCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5jb25jYXQoYXR0YWNobWVudCk7Ci0JCX0KLQkJcmV0dXJuIGF0dGFjaG1lbnRTdHJpbmc7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGNvbnZlcnRTdHJpbmdzVG9MaXN0KFN0cmluZyBzdHJpbmcpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gc3RyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAoc3RyaW5nID09IG51bGwpCi0JCQlzdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nc1tdID0gc3RyaW5nCi0JCQkJLnNwbGl0KENPTU1BX1NFUEFSQVRPUl9TUExJVFRFUik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHN0cmluZ3NbaV0udHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlzdHJMaXN0LmFkZChzdHJpbmdzW2ldLnRyaW0oKSk7Ci0JCX0KLQkJcmV0dXJuIHN0ckxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydExpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gc3RyTGlzdCkgewotCQlTdHJpbmcgc3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlpZiAoc3RyTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0cmluZyBhU3RyaW5nOiBzdHJMaXN0KSB7Ci0JCQkJaWYgKGkrKyA+IDApCi0JCQkJCXN0cmluZyA9IHN0cmluZwotCQkJCQkJCS5jb25jYXQoQ09NTUFfU0VQQVJBVE9SKTsKLQkJCQlzdHJpbmcgPSBzdHJpbmcuY29uY2F0KGFTdHJpbmcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBNZXRob2RFbGVtZW50IGlzIGFsbG93ZWQgYW4gYXR0YWNobWVudC4gIEN1cnJlbnRseSwgb25seQotCSAqIEV4YW1wbGUsIFJlc3VhYmxlQXNzZXQsIFRlbXBsYXRlLCAgV2hpdGVwYXBlciBhcmUgYWxsb3dlZCBhdHRhY2htZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FsbG93ZWRBdHRhY2htZW50cyhNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChlIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZSBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50czwvY29kZT4gY29udGFpbnMgPGNvZGU+ZTwvY29kZT4gb3IgaGFzIGEgd3JhcHBlciBvZiA8Y29kZT5lPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhDb2xsZWN0aW9uIGVsZW1lbnRzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50ID09IGUgfHwgZSA9PSB1bndyYXAoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gQ3VzdG9tQ2F0ZWdvcnkgaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIERlc2NpYmFibGVFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNjCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgbW92ZWQgdG8ge0BsaW5rIERlcGVuZGVuY3lDaGVja2VyI2lzQW5jZXNzb3JPZihDdXN0b21DYXRlZ29yeSwgRGVzY3JpYmFibGVFbGVtZW50KX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbmNlc3Nvck9mKEN1c3RvbUNhdGVnb3J5IGNjLCBEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuaXNBbmNlc3Nvck9mKGNjLCBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlcikgewotCQlpZihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU6Ci0JCQkJaWYoUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJaWYoIVByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTmFtZWRFbGVtZW50LmNsYXNzKSAhPSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUUgKXsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBuYW1lIGNoYW5nZSBtaWdodCBjaGFuZ2UgdGhlIGVsZW1lbnQncyBvcmRlciBpbiB0aGUgc29ydGVkIGxpc3QKLQkJLy8gcmVmcmVzaCB0aGUgcGFyZW50IGNvbnRlbnQgdG8gcmVzb3J0IHRoZSBlbGVtZW50IGxpc3QKLQkJLy8KLQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgYWRhcHRlci5nZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotCX0JCi0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlbGVtZW50IDxjb2RlPmU8L2NvZGU+IGlzIGEgY29udHJpYnV0b3Igb2YgdGhlIGdpdmVuIDxjb2RlPmJhc2U8L2NvZGU+Ci0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvck9mKE9iamVjdCBiYXNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlmb3IoVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJdmUgIT0gbnVsbCAmJiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMgJiYgdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JCXZlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQlpZih2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gYmFzZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLS8vCS8qKgotLy8JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJlbnQgY29udGFpbnMgdGhlIGdpdmVuIGNoaWxkLCBlaXRoZXIgdmlhIGNvbnRhaW5tZW50IG9yIGNvbnRyaWJ1dGlvbgotLy8JICogQHBhcmFtIHBhcmVudAotLy8JICogQHBhcmFtIGNoaWxkCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEFydGlmYWN0IHBhcmVudCwgQXJ0aWZhY3QgY2hpbGQpIHsKLS8vCQlFT2JqZWN0IGNvbnRhaW5lciA9IGNoaWxkLmVDb250YWluZXIoKTsKLS8vCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotLy8JCQlBcnRpZmFjdCBjdXJyZW50UGFyZW50ID0gKEFydGlmYWN0KWNvbnRhaW5lcjsKLS8vCQkJaWYoY29udGFpbmVyID09IHBhcmVudCB8fCBpc0NvbnRyaWJ1dG9yT2YocGFyZW50LCBjdXJyZW50UGFyZW50KSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwYXJlbnQsIGZhbHNlKSB7Ci0vLwkJCQkKLS8vCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotLy8JCQkJCi0vLwkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCQkJCXJldHVybiAoKEFydGlmYWN0KW9iamVjdCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsKLS8vCQkJCX0KLS8vCQkJCQotLy8JCQl9OwotLy8JCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotLy8JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLS8vCQkJCWlmKG8gPT0gY3VycmVudFBhcmVudCB8fCBpc0NvbnRyaWJ1dG9yT2YobywgY3VycmVudFBhcmVudCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlyZXR1cm4gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNoaWxkLCBwYXJlbnQpOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29uZmlndXJhdGlvbnNUb1VwZGF0ZShNZXRob2RQYWNrYWdlIHBhcmVudCwgTWV0aG9kUGFja2FnZSBwa2csIENvbGxlY3Rpb24gY29uZmlnc1RvVXBkYXRlKSB7Ci0JCU9iamVjdCBjb25maWdzID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGFyZW50KQotCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCWlmIChjb25maWdzIGluc3RhbmNlb2YgTGlzdCkgewotCQkJZm9yIChJdGVyYXRvciBpdGNvbmZpZyA9ICgoTGlzdCkgY29uZmlncykuaXRlcmF0b3IoKTsgaXRjb25maWcKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkubmV4dCgpOwotCQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCFwa2dzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJY29uZmlnc1RvVXBkYXRlLmFkZChjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgZXN0aW1hdGVkCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkVzdGltYXRlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgVGFzayB8fCBvIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Z1Nob3dBbGwoKSB7Ci0JCUlMaWJyYXJ5SW5zcGVjdG9yIGluc3BlY3RvciA9IGdldExpYnJhcnlJbnNwZWN0b3IoKTsKLQkJaWYgKGluc3BlY3RvciAhPSBudWxsKSB7Ci0JCQlpbnNwZWN0b3Iuc2hvd0FsbENvbnRlbnRzKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnU2hvd0FsbChNZXRob2RMaWJyYXJ5IGxpYikgewotCQlJTGlicmFyeUluc3BlY3RvciBpbnNwZWN0b3IgPSBnZXRMaWJyYXJ5SW5zcGVjdG9yKCk7Ci0JCWlmIChpbnNwZWN0b3IgIT0gbnVsbCkgewotCQkJaW5zcGVjdG9yLnNob3dBbGxDb250ZW50cyhsaWIpOwotCQl9Ci0JfQotCQotCS8vVXNlZCBmb3IgZGVidWcgb25seQotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlJbnNwZWN0b3IgZ2V0TGlicmFyeUluc3BlY3RvcigpIHsKLQkJcmV0dXJuIChJTGlicmFyeUluc3BlY3RvcikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiLCAibGlicmFyeUluc3BlY3RvciIpOyAJCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IGNjLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNjKSAhPSBwbHVnaW4pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKSAmJiBjb3VudCA8IDI7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBjYXQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0KSA9PSBwbHVnaW4pIHsKLQkJCQljb3VudCsrOwotCQkJfQkJCQkJCQotCQl9Ci0JCXJldHVybiBjb3VudCA8IDI7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGdpdmVuIHdyYXBwZXIgaXMgdW5kZXIgYSBjdXN0b20gY2F0ZWdvcnkgdHJlZQotCSAqIAotCSAqIEBwYXJhbSBpdGVtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VuZGVyQ3VzdG9tQ2F0ZWdvcnlUcmVlKElXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJZG8gewotCQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQkJaWYodW53cmFwKG93bmVyKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl3cmFwcGVyID0gb3duZXIgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciA/IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgb3duZXIgOiBudWxsOwotCQl9IHdoaWxlKHdyYXBwZXIgIT0gbnVsbCk7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKEN1c3RvbUNhdGVnb3J5IGNjKSB7Ci0JCUFycmF5TGlzdCBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQljb2xsZWN0RXhjbHVzaXZlU3ViQ3VzdG9tQ2F0ZWdvcmllcyhjb2xsZWN0aW9uLCBjYywgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2MpKTsKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDdXN0b21DYXRlZ29yeSBjYywgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYy5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgc3ViID0gKEN1c3RvbUNhdGVnb3J5KSBlOwotCQkJCWlmKGlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KHN1YiwgcGx1Z2luKSkgewotCQkJCQljb2xsZWN0aW9uLmFkZChlKTsKLQkJCQkJY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoY29sbGVjdGlvbiwgc3ViLCBwbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyQnlUeXBlKE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub3RpZmllci5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmKGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgcmVtb3ZlZCByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgcmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIFRuZ1V0aWwucmVtb3ZlUmVmZXJlbmNlcyhlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgcmVmZXJlbmNlcyB0byBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG1hcCBvZiBtZXRob2QgZWxlbWVudHMgd2hvc2UgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqICAgICAgICAgYXJlIGp1c3QgcmVtb3ZlZCwgYW5kIHRoZWlyIGZlYXR1cmVzIHRoYXQgaG9sZCB0aGUgcmVmZXJlbmNlcyB0bwotCSAqICAgICAgICAgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCByZW1vdmVSZWZlcmVuY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gY2hlY2tNb2RpZnkpIHsKLQkJLy8gTGlzdCByZWZlcmVuY2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWFwIG9iamVjdEZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgZU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudDsKLQkKLQkJaWYgKGVPYmouYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSA9PSBudWxsKQotCQkJcmV0dXJuIG9iamVjdEZlYXR1cmVzTWFwOwotCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCQkJCWNoZWNrTW9kaWZ5KG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJCUxpc3QgZmVhdHVyZXMgPSAoTGlzdCkgb2JqZWN0RmVhdHVyZXNNYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9iamVjdEZlYXR1cmVzTWFwLnB1dChvYmosIGZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQkJCQljaGVja01vZGlmeShvYmopOwotCQkJCQkJfQotCQkJCQkJb2JqLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCW9iai5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQkJTGlzdCBmZWF0dXJlcyA9IChMaXN0KSBvYmplY3RGZWF0dXJlc01hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqZWN0RmVhdHVyZXNNYXAucHV0KG9iaiwgZmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdEZlYXR1cmVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkvLyByZWZlcmVuY2Vycy5hZGQobmV3IFJlZmVyZW5jZXIoKEVPYmplY3QpZW50cnkuZ2V0S2V5KCksCi0JCS8vIChMaXN0KWVudHJ5LmdldFZhbHVlKCkpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gcmVmZXJlbmNlcnM7Ci0JCXJldHVybiBvYmplY3RGZWF0dXJlc01hcDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHB1Ymxpc2hpbmcgY2F0ZWdvcnkgcHJvcGVydHkgZm9yIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkgcHJvcGVydHkgaWYgZm91bmQsIGVsc2UgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHByb3BzID0gZWxlbWVudC5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJaWYgKHByb3BzID09IG51bGwgfHwgcHJvcHMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKFBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkuZXF1YWxzKHByb3AuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiBwcm9wOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PElOb3RpZnlDaGFuZ2VkTGlzdGVuZXI+IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlzdGVuZXJQcm92aWRlcikgewotCQkJcmV0dXJuICgoSUxpc3RlbmVyUHJvdmlkZXIpIGFkYXB0ZXIpLmdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjw/PiBnZXRXcmFwcGVycyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IG9iaikgewotCQlIYXNoU2V0PE9iamVjdD4gd3JhcHBlcnMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCWZvciAoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoYWRhcHRlckZhY3RvcnksIG9iaikpIHsKLQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgdW53cmFwKGxpc3RlbmVyKSA9PSBvYmopIHsKLQkJCQl3cmFwcGVycy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3cmFwcGVyczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gdmFsdWUgaW4gdGhlIGdpdmVuIHdyYXBwZXJzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVycwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcihDb2xsZWN0aW9uIHdyYXBwZXJzLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHdyYXBwZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbGlzdGVuZXIgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiB1bndyYXAobGlzdGVuZXIpID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBsaXN0ZW5lcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyRm9yQ0MoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEN1c3RvbUNhdGVnb3J5IGNjKSB7Ci0JCS8vIGdldCBJVHJlZUNvbnRlbnRQcm92aWRlciBhZGFwYXRlcgotCQlDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJJiYgdW53cmFwKGxpc3RlbmVyKSA9PSBjYykgewotCQkJCXJldHVybiAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcilsaXN0ZW5lcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2M7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlc2VudGF0aW9uTmFtZUhlbHBlciB7Ci0JCS8vdG8gYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJCXJldHVybiBlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvV3JhcHBlck1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9XcmFwcGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjAyNWI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9XcmFwcGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogTWFuYWdlcyB3cmFwcGVycyBvZiBhbiBpdGVtIHByb3ZpZGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDE1LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBlck1hbmFnZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgdmFsdWVUb1dyYXBwZXJNYXA7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBXcmFwcGVyTWFuYWdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlcihPYmplY3QgdmFsdWUpIHsKLQkJaWYodmFsdWVUb1dyYXBwZXJNYXAgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlVG9XcmFwcGVyTWFwLmdldCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFdyYXBwZXJzKCkgewotCQlpZih2YWx1ZVRvV3JhcHBlck1hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmFsdWVUb1dyYXBwZXJNYXAudmFsdWVzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgd3JhcHBlciBmb3IgdGhlIGdpdmVuIHZhbHVlLCBvd25lciwgYW5kIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29sbGVjdGlvbiBkZWxlZ2F0ZVZhbHVlcykgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJU2V0IG9sZERlbGVnYXRlVmFsdWVzID0gZGVsZWdhdGVWYWx1ZXMgIT0gbnVsbCA/IG5ldyBIYXNoU2V0KGRlbGVnYXRlVmFsdWVzKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCi0JCWlmICh2YWx1ZVRvV3JhcHBlck1hcCA9PSBudWxsICYmICFkZWxlZ2F0ZVZhbHVlcy5pc0VtcHR5KCkpCi0JCXsKLQkJCXZhbHVlVG9XcmFwcGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQkJLy8gV3JhcCBhbnkgbmV3IGNoaWxkcmVuIGFuZCBhZGQgdGhlbSB0byB0aGUgbWFwLiBSZW1vdmUgZWFjaCBjdXJyZW50IGNoaWxkIGZyb20gdGhlIHNldCBvZiBvbGQgY2hpbGRyZW4uCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaSA9IGRlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotCQkJCi0JCQlpZiAoIXZhbHVlVG9XcmFwcGVyTWFwLmNvbnRhaW5zS2V5KGNoaWxkKSkKLQkJCXsKLQkJCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gY3JlYXRlV3JhcHBlcihjaGlsZCwgdGhpcywgYWRhcHRlckZhY3RvcnkpOwotCQkJCXZhbHVlVG9XcmFwcGVyTWFwLnB1dChjaGlsZCwgd3JhcHBlcik7Ci0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQlvbGREZWxlZ2F0ZVZhbHVlcy5yZW1vdmUoY2hpbGQpOwotCQl9Ci0JCQotCQkvLyBSZW1vdmUgYW5kIGRpc3Bvc2UgYW55IHdyYXBwZXJzIGZvciByZW1haW5pbmcgb2xkIGNoaWxkcmVuLgotCQkvLwotCQlpZiAoIW9sZERlbGVnYXRlVmFsdWVzLmlzRW1wdHkoKSkKLQkJewotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaSA9IG9sZERlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCQl7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0JCQkJCi0JCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcil2YWx1ZVRvV3JhcHBlck1hcC5yZW1vdmUoY2hpbGQpOwotCQkJCWlmICh3cmFwcGVyICE9IG51bGwpCi0JCQkJewotCQkJCQl3cmFwcGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIElmIGFueSBjaGlsZHJlbiB3ZXJlIGFkZGVkIG9yIHJlbW92ZWQsIHJlc2V0IHRoZSBpbmRpY2VzLgotCQlpZiAoY2hhbmdlZCkKLQkJewotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBpbmRleCsrKQotCQkJewotCQkJCSgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpdmFsdWVUb1dyYXBwZXJNYXAuZ2V0KGkubmV4dCgpKSkuc2V0SW5kZXgoaW5kZXgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkgICAgaWYgKHZhbHVlVG9XcmFwcGVyTWFwICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB2YWx1ZVRvV3JhcHBlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JICAgICAgewotCSAgICAgICAgKChJRGlzcG9zYWJsZSlpLm5leHQoKSkuZGlzcG9zZSgpOwotCSAgICAgIH0KLQkgICAgICB2YWx1ZVRvV3JhcHBlck1hcC5jbGVhcigpOwotCSAgICAgIHZhbHVlVG9XcmFwcGVyTWFwID0gbnVsbDsKLQkgICAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRmZTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgcHJvdmlkZXMgYQotICogY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3JkZXJJbmZvIGNyZWF0ZU9yZGVySW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9yZGVySW5mb0NvbGxlY3Rpb24gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpOwotCi19IC8vIE1vZGVsRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRhNWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgY29udGFpbnMKLSAqIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJtb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC50bmcudXRpbC5tb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsCi0JCQkuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsIDxlbT5PcmRlciBJbmZvPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk9yZGVySW5mb0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9SREVSX0lORk8gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R1VJIERzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fR1VJX0RTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lc3RhbXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fVElNRVNUQU1QID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3JkZXIgSW5mbzwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwgPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9Db2xsZWN0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9SREVSX0lORk9fQ09MTEVDVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgSW5mb3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIDxlbT5PcmRlciBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3JkZXJJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRPcmRlckluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE9yZGVySW5mb19OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRHVUlEcyA8ZW0+R1VJIERzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R1VJIERzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRHVUlEcygpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fR1VJRHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRUaW1lc3RhbXAgPGVtPlRpbWVzdGFtcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaW1lc3RhbXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldFRpbWVzdGFtcCgpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fVGltZXN0YW1wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiA8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uI2dldE9yZGVySW5mb3MgPGVtPk9yZGVyIEluZm9zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3JkZXIgSW5mb3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiNnZXRPcmRlckluZm9zKCkKLQkgKiBAc2VlICNnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPcmRlckluZm9Db2xsZWN0aW9uX09yZGVySW5mb3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2RlbEZhY3RvcnkgZ2V0TW9kZWxGYWN0b3J5KCk7Ci0KLX0gLy8gTW9kZWxQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmU0Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9yZGVySW5mbyBleHRlbmRzIEVPYmplY3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFOVUFMID0gIm1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqLwotCUVMaXN0IGdldEdVSURzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lc3RhbXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRpbWVzdGFtcDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lc3RhbXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRpbWVzdGFtcChsb25nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRPcmRlckluZm9fVGltZXN0YW1wKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JbG9uZyBnZXRUaW1lc3RhbXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0VGltZXN0YW1wIDxlbT5UaW1lc3RhbXA8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXN0YW1wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUaW1lc3RhbXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVzdGFtcChsb25nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm9Db2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZThkZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIG9yZGVyIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckluZm9Db2xsZWN0aW9uIGV4dGVuZHMgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsIHR5cGU9ImNvbS5pYm0ubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIgotCSAqICAgICAgICBjb250YWluZW1lbnQ9InRydWUiCi0JICovCi0JRUxpc3QgZ2V0T3JkZXJJbmZvcygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODc2M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kZWwiCi0gICAgbnNVUkk9Imh0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSIgbnNQcmVmaXg9ImNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yZGVySW5mbyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibWFudWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdVSURzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aW1lc3RhbXAiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yZGVySW5mb0NvbGxlY3Rpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcmRlckluZm9zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL09yZGVySW5mbyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNhNjQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXQudG5nL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLnVtYS5lZGl0LnRuZyIgcnVudGltZUphcj0idHJ1ZSIgbW9kZWxOYW1lPSJlZGl0dXRpbCIgZWRpdFBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIucHJvdmlkZXIuZWRpdHV0aWxFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIucHJlc2VudGF0aW9uLmVkaXR1dGlsRWRpdG9yUGx1Z2luIgotICAgIHJ1bnRpbWVDb21wYXRpYmlsaXR5PSJmYWxzZSI+Ci0gIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1vZGVsIiBiYXNlUGFja2FnZT0iY29tLmlibS51bWEuZWRpdC50bmcudXRpbCIgZWNvcmVQYWNrYWdlPSJlZGl0dXRpbC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlZGl0dXRpbC5lY29yZSMvL09yZGVySW5mbyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm8vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvL2dVSURzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvQ29sbGVjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm9Db2xsZWN0aW9uL29yZGVySW5mb3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJmMTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1vZGVsRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPOgotCQkJcmV0dXJuIGNyZWF0ZU9yZGVySW5mbygpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT046Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckluZm8gY3JlYXRlT3JkZXJJbmZvKCkgewotCQlPcmRlckluZm9JbXBsIG9yZGVySW5mbyA9IG5ldyBPcmRlckluZm9JbXBsKCk7Ci0JCXJldHVybiBvcmRlckluZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckluZm9Db2xsZWN0aW9uIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKSB7Ci0JCU9yZGVySW5mb0NvbGxlY3Rpb25JbXBsIG9yZGVySW5mb0NvbGxlY3Rpb24gPSBuZXcgT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIG9yZGVySW5mb0NvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1vZGVsUGFja2FnZSkgZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy8gTW9kZWxGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODgzZTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTW9kZWxQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3JkZXJJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUKLQkgKiBwYWNrYWdlIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMgZmFjdG9yeQotCSAqIG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkgKiBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwKLQkgKiBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiBTaW1wbGUgZGVwZW5kZW5jaWVzIGFyZQotCSAqIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nCi0JICogYW55dGhpbmcgZWxzZS4gVGhpcyBtZXRob2QgZHJpdmVzIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudAotCSAqIHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPgotCSAqIE9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QKLQkgKiB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQuCi0JICogVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczogbWV0YS1tb2RlbCBvYmplY3RzIGZvcgotCSAqIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueSBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZQotCSAqIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+Ci0JICogSW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZSBhbHJlYWR5Ci0JICogYmVlbiBpbml0aWFsaXplZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkKLQkJCXJldHVybiAoTW9kZWxQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCQkuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJTW9kZWxQYWNrYWdlSW1wbCB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgTW9kZWxQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpCi0JCQkJOiBuZXcgTW9kZWxQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlTW9kZWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU1vZGVsUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTW9kZWxQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE9yZGVySW5mbygpIHsKLQkJcmV0dXJuIG9yZGVySW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgb3JkZXJJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVySW5mb19HVUlEcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBvcmRlckluZm9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX1RpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBvcmRlckluZm9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkgewotCQlyZXR1cm4gb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRmFjdG9yeSBnZXRNb2RlbEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTW9kZWxGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuIFRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgdG8KLQkgKiBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpCi0JCQlyZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCW9yZGVySW5mb0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUl9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG9yZGVySW5mb0VDbGFzcywgT1JERVJfSU5GT19fR1VJX0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX1RJTUVTVEFNUCk7Ci0KLQkJb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUl9JTkZPX0NPTExFQ1RJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MsCi0JCQkJT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKAotCQkJCW9yZGVySW5mb0VDbGFzcywKLQkJCQlPcmRlckluZm8uY2xhc3MsCi0JCQkJIk9yZGVySW5mbyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRPcmRlckluZm9fTmFtZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksCi0JCQkJIm5hbWUiLCBudWxsLCAwLCAxLCBPcmRlckluZm8uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0T3JkZXJJbmZvX0dVSURzKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwKLQkJCQkiZ1VJRHMiLCBudWxsLCAwLCAtMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE9yZGVySW5mb19UaW1lc3RhbXAoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwKLQkJCQkidGltZXN0YW1wIiwgbnVsbCwgMCwgMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzLAotCQkJCU9yZGVySW5mb0NvbGxlY3Rpb24uY2xhc3MsCi0JCQkJIk9yZGVySW5mb0NvbGxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCksCi0JCQkJdGhpcy5nZXRPcmRlckluZm8oKSwKLQkJCQludWxsLAotCQkJCSJvcmRlckluZm9zIiwgbnVsbCwgMCwgLTEsIE9yZGVySW5mb0NvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vIE1vZGVsUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9Db2xsZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTg1MDFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlciBJbmZvIENvbGxlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9Db2xsZWN0aW9uSW1wbCNnZXRPcmRlckluZm9zIDxlbT5PcmRlciBJbmZvczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlckluZm9Db2xsZWN0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMKLQkJT3JkZXJJbmZvQ29sbGVjdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJJbmZvcygpIDxlbT5PcmRlciBJbmZvczwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG9yZGVySW5mb3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckluZm9Db2xsZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE9yZGVySW5mb3MoKSB7Ci0JCWlmIChvcmRlckluZm9zID09IG51bGwpIHsKLQkJCW9yZGVySW5mb3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3JkZXJJbmZvLmNsYXNzLCB0aGlzLAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyk7Ci0JCX0KLQkJcmV0dXJuIG9yZGVySW5mb3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0T3JkZXJJbmZvcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJCW1zZ3MpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJcmV0dXJuIGdldE9yZGVySW5mb3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJZ2V0T3JkZXJJbmZvcygpLmNsZWFyKCk7Ci0JCQlnZXRPcmRlckluZm9zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCWdldE9yZGVySW5mb3MoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJcmV0dXJuIG9yZGVySW5mb3MgIT0gbnVsbCAmJiAhb3JkZXJJbmZvcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBPcmRlckluZm9Db2xsZWN0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmNmMjU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9yZGVyIEluZm88L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldEdVSURzIDxlbT5HVUkgRHM8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldFRpbWVzdGFtcCA8ZW0+VGltZXN0YW1wPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9yZGVySW5mb0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE9yZGVySW5mbyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdVSURzKCkgPGVtPkdVSSBEczwvZW0+fScgYXR0cmlidXRlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0R1VJRHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBnVUlEcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXN0YW1wKCkgPGVtPlRpbWVzdGFtcDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFRpbWVzdGFtcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVTVEFNUF9FREVGQVVMVCA9IDBMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXN0YW1wKCkgPGVtPlRpbWVzdGFtcDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFRpbWVzdGFtcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgdGltZXN0YW1wID0gVElNRVNUQU1QX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckluZm9JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3JkZXJJbmZvKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEdVSURzKCkgewotCQlpZiAoZ1VJRHMgPT0gbnVsbCkgewotCQkJZ1VJRHMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTKTsKLQkJfQotCQlyZXR1cm4gZ1VJRHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIHRpbWVzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgbmV3VGltZXN0YW1wKSB7Ci0JCWxvbmcgb2xkVGltZXN0YW1wID0gdGltZXN0YW1wOwotCQl0aW1lc3RhbXAgPSBuZXdUaW1lc3RhbXA7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCU1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVAsIG9sZFRpbWVzdGFtcCwgdGltZXN0YW1wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUzoKLQkJCXJldHVybiBnZXRHVUlEcygpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlyZXR1cm4gbmV3IExvbmcoZ2V0VGltZXN0YW1wKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUU6Ci0JCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJZ2V0R1VJRHMoKS5jbGVhcigpOwotCQkJZ2V0R1VJRHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJc2V0VGltZXN0YW1wKCgoTG9uZykgbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19OQU1FOgotCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJZ2V0R1VJRHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlzZXRUaW1lc3RhbXAoVElNRVNUQU1QX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKG5hbWUpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19HVUlfRFM6Ci0JCQlyZXR1cm4gZ1VJRHMgIT0gbnVsbCAmJiAhZ1VJRHMuaXNFbXB0eSgpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlyZXR1cm4gdGltZXN0YW1wICE9IFRJTUVTVEFNUF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnVUlEczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChnVUlEcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGltZXN0YW1wOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRpbWVzdGFtcCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBPcmRlckluZm9JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODJhYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBvcmRlcmluZyBjb250ZW50IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjIzYmIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTkxMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdAotICogcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUKLSAqIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YKLQkgKiB0aGUgbW9kZWwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNb2RlbFN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBNb2RlbFN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlT3JkZXJJbmZvKE9yZGVySW5mbyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVPcmRlckluZm9BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm9Db2xsZWN0aW9uKE9yZGVySW5mb0NvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8gPGVtPk9yZGVyIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAotCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKLQkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3JkZXJJbmZvQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiA8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKLQkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCi0JICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCi0JICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIE1vZGVsQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkxNmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlCi0gKiBoaWVyYXJjaHkuIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0IGFuZCBwcm9jZWVkaW5nIHVwIHRoZQotICogaW5oZXJpdGFuY2UgaGllcmFyY2h5IHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLCB3aGljaCBpcyB0aGUKLSAqIHJlc3VsdCBvZiB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZQotCSAqIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPgotCSAqICAgICAgICAgY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4gZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8gZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOiBkb1N3aXRjaCgKLQkJCQkJKEVDbGFzcykgZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk86IHsKLQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSAoT3JkZXJJbmZvKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPcmRlckluZm8ob3JkZXJJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OOiB7Ci0JCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb0NvbGxlY3Rpb24gPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3JkZXJJbmZvQ29sbGVjdGlvbihvcmRlckluZm9Db2xsZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyIEluZm88L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU9yZGVySW5mbyhPcmRlckluZm8gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCi0JICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm9Db2xsZWN0aW9uKE9yZGVySW5mb0NvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlCi0JICogYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIE1vZGVsU3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvU3RyaW5nUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1ZGU0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogUmVzb3VyY2UgdG8gc3RvcmUgc3RyaW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgewotCXByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDsKLQotCXByaXZhdGUgU3RyaW5nIHN0cjsKLQotCXB1YmxpYyBTdHJpbmdSZXNvdXJjZShTdHJpbmcgc3RyKSB7Ci0JCXRoaXMuc3RyID0gc3RyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXNhdmUob3V0LCBvcHRpb25zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChvdXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gb3V0LnRvU3RyaW5nKGVuY29kaW5nKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghaXNMb2FkZWQpIHsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHN0cik7Ci0JCQl0cnkgewotCQkJCWxvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MWFhZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4Yjc0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhbmQgcXVlcnlpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0Fic3RyYWN0U3RyaW5nVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmMjY4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgbXNnID0gaXNWYWxpZCgoU3RyaW5nKXZhbHVlKTsKLQkJCWlmKG1zZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGMwZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRvZXMgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIHsKLQkJCi0JcHJpdmF0ZSBEZXBlbmRlbmN5SW5mb01nciBkZXBJbmZvTWdyOwotCXByaXZhdGUgSURlcGVuZGVuY3lJbmZvIHZlSW5mbzsKLQlwcml2YXRlIGJvb2xlYW4gbW92ZSA9IGZhbHNlOwotCQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhEZXBlbmRlbmN5SW5mb01nciBtZ3IsIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwKLQkJCQkJCQkJYm9vbGVhbiBmaWx0ZXIsIGJvb2xlYW4gbW92ZSkgewotCQlkZXBJbmZvTWdyID0gbWdyOwotCQl2ZUluZm8gPSBkZXBJbmZvTWdyLnJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KHZlLCBmaWx0ZXIsIGZhbHNlKTsKLQkJdGhpcy5tb3ZlID0gbW92ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlcGVuZGVuY3lJbmZvTWdyIGdldERlcEluZm9NZ3IoKSB7Ci0JCXJldHVybiBkZXBJbmZvTWdyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURlcGVuZGVuY3lJbmZvIGdldFZlSW5mbygpIHsKLQkJcmV0dXJuIHZlSW5mbzsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKHJlYWNoYWJsZShvYmosIHRydWUsIHRydWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChtb3ZlKSB7Ci0JCQlpZighKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpIHJldHVybiB0cnVlOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG9ialZlQmFzZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChvYmpWZUJhc2UgIT0gbnVsbCkgewotCQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gZGVwSW5mb01nci5yZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudChvYmpWZUJhc2UsIGZhbHNlLCBmYWxzZSk7CQotCQkJCWlmIChpbmZvLnJlYWNoYWJsZUJ5KHZlSW5mbykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlYWNoYWJsZShPYmplY3Qgb2JqLCBib29sZWFuIGNoZWNrUmVhY2hhYmxlQnlPYmosIGJvb2xlYW4gY2hlY2tSZWFjaGFibGVUb09iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZUluZm8uZ2V0RWxlbWVudCgpOwotCQlpZiAodmUgPT0gb2JqKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCQkKLQkJfQotCi0JCUlEZXBlbmRlbmN5SW5mbyBvYmpWZUluZm8gPSBkZXBJbmZvTWdyLnJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KCAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmosIGZhbHNlLCBtb3ZlKTsJCQotCQkKLQkJaWYgKGNoZWNrUmVhY2hhYmxlQnlPYmogJiYgdmVJbmZvLnJlYWNoYWJsZUJ5KG9ialZlSW5mbykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoY2hlY2tSZWFjaGFibGVUb09iaiAmJiBvYmpWZUluZm8ucmVhY2hhYmxlQnkodmVJbmZvKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gcmVhY2hhYmxlQnkoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gcmVhY2hhYmxlKG9iaiwgdHJ1ZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVUbyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiByZWFjaGFibGUob2JqLCBmYWxzZSwgdHJ1ZSk7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzUzYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGZpbHRlciBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyIGV4dGVuZHMgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgaW1wbGVtZW50cyBJRmlsdGVyIHsJCi0JCi0JcHJpdmF0ZSBNYXAgYW5jZXN0b3JNYXA7Ci0JCi0JCi0JcHVibGljIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKERlcGVuZGVuY3lJbmZvTWdyIG1nciwgVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCXN1cGVyKG1nciwgdmUsIHRydWUsIGZhbHNlKTsKLQkJCi0JCQotCQkKLQl9CQkJCi0JCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQkKLS8qCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBWZVRvQ2hlY2soT2JqZWN0IG9iaikgewotCQlyZXR1cm4gCW9iaiBpbnN0YW5jZW9mIERvbWFpbiB8fCAJCQkJLy9nZXRTdWJkb21haW5zCi0JCQkJb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgfHwgCQkvL2dldFN1YkNhdGVnb3JpZXMKLQkJCQlvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCB8fCAJCQkJLy9nZXRDb250YWluZWRBcnRpZmFjdHMKLQkJCQlvYmogaW5zdGFuY2VvZiBQcmFjdGljZSB8fCAJCQkJLy9nZXRTdWJQcmFjdGljZXMKLQkJCQlvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSB8fAkJCS8vZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzCi0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHk7CQkJCS8vZ2V0QnJlYWtkb3duRWxlbWVudHMKLQl9Ki8KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5Q2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmN2UwYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFzIHN0YXRpYyBtZXRob2RzIHRoYXQgY2hlY2sgZm9yIGN5Y2xlcyBpbiB0aGUgZWxlbWVudCBkZXBlbmRlbmN5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBlbmRlbmN5Q2hlY2tlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN0YXR1cyBFUlJPUl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0NoZWNrIAkJPSB0cnVlOwkJCS8vdGVtcCBmbGFnLCB3aWxsIGJlIHJlbW92ZWQhCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0NoZWNrQWN0IAk9IHRydWU7CQkJLy90ZW1wIGZsYWcsIHdpbGwgYmUgcmVtb3ZlZCEKLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIGN5Y2xlcyBpbiB0aGUgZGVwZW5kZW5jeSBncmFwaCBvZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpZiB0aGUKLQkgKiBnaXZlbiB2YWx1ZSBpcyBhZGRlZC9hc3NpZ25lZCB0byBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byBjaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGFkZGVkL2Fzc2lnbmVkIHRvIHRoZSBmZWF0dXJlCi0JICogQHJldHVybiBjaGVjayBzdGF0dXMsIE9LIGlmIG5vIGN5Y2xlLCBFUlJPUiBpZiB0aGVyZSB3aWxsIGJlIGNpcmN1bGFyCi0JICogICAgICAgICBkZXBlbmRlbmN5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KEVPYmplY3Qgb3duZXIsCi0JCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUykgewotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0aXZpdHksIChBY3Rpdml0eSkgdmFsdWUsIHR5cGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQlpZiAoaXNDaXJjdWxhckRlcGVuZGVuY3koKFZhcmlhYmlsaXR5RWxlbWVudCkgb3duZXIsCi0JCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIHZhbHVlKSkgewotCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUykgewotCQkJaWYgKCFjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSl2YWx1ZSwgKERlbGl2ZXJhYmxlKW93bmVyKSkgewotCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodmFsdWUpIHsKLQotCQkJCQkvKioKLQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMOwotCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2Uob2JqZWN0KSkgewotCQkJCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UoCi0JCQkJCQkJCQkJCWVsZW1lbnQpKSB7Ci0JCQkJCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJaWYgKGl0ZXIubmV4dCgpID09IG93bmVyKSB7Ci0JCQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWlmIChmZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKLQkJCQkJRU9iamVjdCB2ID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQlkbyB7Ci0JCQkJCQlpZiAodiA9PSBvd25lcikgewotCQkJCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCQlPYmplY3QgbyA9IHYuZUdldChmZWF0dXJlKTsKLQkJCQkJCWlmIChmZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShvKSkgewotCQkJCQkJCXYgPSAoRU9iamVjdCkgbzsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdiA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0gd2hpbGUgKHYgIT0gbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5IGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBpcyBhcHBsaWVkIHRvIHRoZQotCSAqIGdpdmVuIHRhcmdldCBhY3Rpdml0eSB2aWEgZXh0ZW5kIG9yIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5IGFjdGl2aXR5IHRvIGFwcGx5Ci0JICogQHBhcmFtIHRhcmdldCB0YXJnZXQgYWN0aXZpdHkgdG8gYWRkIGV4dGVuc2lvbiBvciBjb3B5IG9mIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoaXMgY2hlY2sKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0aXZpdHksIEFjdGl2aXR5IHRhcmdldCkgewotCQlpZiAoaXNQYXJlbnQoYWN0aXZpdHksIHRhcmdldCkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IHRhcmdldC5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldCk7Ci0JCWlmKCFuZXdDaGVja0FjdCAmJiBoYXNDeWNsaWNEZXBlbmRlbmN5KGFjdGl2aXR5LCBwcm9jZXNzKSB8fAotCQkJCW5ld0NoZWNrQWN0ICYmIHNvdXJjZVJlYWNoYWJsZUJ5VGFyZ2V0KGFjdGl2aXR5LCB0YXJnZXQpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3Rpdml0eS5nZXROYW1lKCksIHByb2Nlc3MuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdGl2aXR5KSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0aXZpdHkuZ2V0TmFtZSgpLCBwcm9jZXNzLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQ3ljbGljRGVwZW5kZW5jeShBY3Rpdml0eSBhY3Rpdml0eSwgUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChBY3Rpdml0eSkgb2JqZWN0KQotCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdlR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmIChiYXNlICE9IG51bGwgJiYgKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSkgewotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCQlpZiAocHJvYyA9PSBwcm9jZXNzKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhcmVudCBpcyBhIHN1cGVyIGFjdGl2aXR5IG9mIGNoaWxkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFyZW50KEFjdGl2aXR5IHBhcmVudCwgQnJlYWtkb3duRWxlbWVudCBjaGlsZCkgewotCQlmb3IgKEFjdGl2aXR5IGFjdCA9IGNoaWxkLmdldFN1cGVyQWN0aXZpdGllcygpOyBhY3QgIT0gbnVsbDsgYWN0ID0gYWN0Ci0JCQkJLmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQlpZiAoYWN0ID09IHBhcmVudCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIGN5Y2xlcyBpbiBkZXBlbmRlbmN5IHBhdGggb2YgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogPGNvZGU+YWN0PC9jb2RlPiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcyB0aGUgYmFzZSBhY3Rpdml0eSBvZgotCSAqIDxjb2RlPmFjdDwvY29kZT4gZm9yIGdpdmVuIHZhcmlhYmlsaXR5IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0LCBBY3Rpdml0eSBiYXNlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYmFzZSwgdHlwZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBiYXNlLCB0eXBlLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSwgYm9vbGVhbiBmaWx0ZXJpbmcpIHsKLQkJaWYoKGJhc2UgaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJCSYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgJiYgIShhY3QgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2czOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChpc1BhcmVudChiYXNlLCBhY3QpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9IAotCQllbHNlIGlmIChuZXdDaGVja0FjdCAmJiBmaWx0ZXJpbmcpIHsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2tGaWx0ZXIoYWN0KTsKLQkJCWlmICghIGZpbHRlci5hY2NlcHQoYmFzZSkpIHsKLQkJCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMiwKLQkJCQkJCQkJYXJncyk7Ci0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWVsc2UgaWYgKGlzQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYmFzZSkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdC5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCS8vIGJsb2NrIGZvciBjaGlsZHJlbgotCQllbHNlIGlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoYmFzZSkKLQkJCQkmJiB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQlpZihwcm9jZXNzICE9IG51bGwgJiYgaGFzQ3ljbGljRGVwZW5kZW5jeShiYXNlLCBwcm9jZXNzKSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMgdGhlIGJhc2UgZWxlbWVudAotCSAqIG9mIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgYmFzZSBlbGVtZW50Ci0JICogQHJldHVybiBzdGF0dXMgd2hpY2ggaW5kaWNhdGVzIGNpcmN1bGFyIGRlcGVuZWRlbmN5IGlzIGRldGVjdGVkIG9yIG5vdAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaXJjdWxhckRlcGVuZGVuY3koVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQkvLyBzdGFuZGFyZCBjaGVjawotCQkvLwotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXdoaWxlICh0eXBlICE9IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAodmUgIT0gbnVsbCAmJiB2ZSA9PSBlbGVtZW50KQotCQkJCXJldHVybiB0cnVlOwotCQkJYmFzZSA9IHZlOwotCQkJdHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBnaXZlbiBkZWxpdmVyYWJsZXMgbGVhZHMgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSB0b0JlUGFydAotCSAqIEBwYXJhbSBkZWxpdmVyYWJsZQotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGluZGljYXRlIHdoZXRoZXIgY2lyY3VsYXIgZGVwZW5kZW5jeSBpcwotCSAqICAgICAgICAgZGV0ZWN0ZWQsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhEZWxpdmVyYWJsZSB0b0JlUGFydCwKLQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlKSB7Ci0JCWlmIChuZXdDaGVjaykgewotCQkJcmV0dXJuICEgc291cmNlUmVhY2hhYmxlQnlUYXJnZXQodG9CZVBhcnQsIGRlbGl2ZXJhYmxlKTsKLQkJfQotCQkKLQkJaWYgKHRvQmVQYXJ0ID09IGRlbGl2ZXJhYmxlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJamF2YS51dGlsLkxpc3QgZGVsaXZlcmFibGVzID0gdG9CZVBhcnQuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChkZWxpdmVyYWJsZXMgIT0gbnVsbCAmJiBkZWxpdmVyYWJsZXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKGRlbGl2ZXJhYmxlcy5jb250YWlucyhkZWxpdmVyYWJsZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlbGl2ZXJhYmxlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJldHVybiBjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSkgb2JqLAotCQkJCQkJCWRlbGl2ZXJhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBDdXN0b21DYXRlZ29yeSBpcyBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4KLQkgKiBEZXNjaWJhYmxlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FuY2Vzc29yT2YoQ3VzdG9tQ2F0ZWdvcnkgY2MsIERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY2MsIGZhbHNlKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaXRlci5uZXh0KCkgPT0gZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2hlbiBtb3ZpbmcgYSBjb2xsZWN0aW9uIG9mIGFydGlmYWN0IG9iamVjdHMKLQkgKiBpbiAic291cmNlRWxlbWVudHMiIHVuZGVyICJkZXN0aW5hdGlvbiIKLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiBAcGFyYW0gc291cmNlRWxlbWVudHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm8gY2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMoQXJ0aWZhY3QgZGVzdGluYXRpb24sCi0JCQlDb2xsZWN0aW9uIHNvdXJjZUVsZW1lbnRzKSB7Ci0JCUhhc2hTZXQgdmFyaWFudFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWNvbGxlY3RWYXJpYW50U2V0KGRlc3RpbmF0aW9uLCB2YXJpYW50U2V0LCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQljb2xsZWN0VmFyaWFudFNldChkZXN0aW5hdGlvbiwgdmFyaWFudFNldCwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQlpZiAoISBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzMShkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMsIHZhcmlhbnRTZXQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMyKGRlc3RpbmF0aW9uLCBzb3VyY2VFbGVtZW50cyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoQXJ0aWZhY3QgZGVzdGluYXRpb24sCi0JCQlDb2xsZWN0aW9uIHNvdXJjZUVsZW1lbnRzLCBIYXNoU2V0IHZhcmlhbnRTZXQpIHsKLQkJaWYgKHNvdXJjZUVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmo7Ci0JCQkJaWYgKHZhcmlhbnRTZXQuY29udGFpbnMoYXJ0aWZhY3QpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCEgY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoZGVzdGluYXRpb24sIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpLCB2YXJpYW50U2V0KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMyKEFydGlmYWN0IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBzb3VyY2VJc09yQWJvdmVNZSgoQXJ0aWZhY3QpIG9iaiwgZGVzdGluYXRpb24pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNvdXJjZUlzT3JBYm92ZU1lKEFydGlmYWN0IHNvdXJjZSwgQXJ0aWZhY3QgbWUpIHsKLQkJaWYgKHNvdXJjZSA9PSBtZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJT2JqZWN0IG9iaiA9IG1lLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBzb3VyY2VJc09yQWJvdmVNZShzb3VyY2UsIChBcnRpZmFjdCkgb2JqKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJb2JqID0gbWUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgc291cmNlSXNPckFib3ZlTWUoc291cmNlLCAoQXJ0aWZhY3QpIG9iaikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vQ29sbGVjdCBhbGwgdmFyaWFudHMgb2YgImEiIGFuZCAiYSJzIGFuY2VzdHJvciBBcnRpZmFjdCBvYmplY3RzCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0VmFyaWFudFNldChBcnRpZmFjdCBhLCBIYXNoU2V0IHZhcmlhbnRTZXQsIFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCXdoaWxlIChhICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGEsIHR5cGUpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQl2YXJpYW50U2V0LmFkZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCQlhID0gYS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQl9Ci0JfQkJCQotCQotCXByaXZhdGUgc3RhdGljIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQkJCWJvb2xlYW4gZmlsdGVyLCBib29sZWFuIG1vdmUsIGJvb2xlYW4gZG5kKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KHZlKTsJCQkJCQkKLQkJRGVwZW5kZW5jeUluZm9NZ3IgZGVwSW5mb01nciA9IG5ldyBEZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCQlkZXBJbmZvTWdyLnNldERuZEJpdChkbmQpOwotCQlyZXR1cm4gbmV3IENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKGRlcEluZm9NZ3IsIHZlLCBmaWx0ZXIsIG1vdmUgfHwgZG5kKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzb3VyY2VSZWFjaGFibGVCeVRhcmdldChWYXJpYWJpbGl0eUVsZW1lbnQgc291cmNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCXJldHVybiBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhzb3VyY2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLnJlYWNoYWJsZUJ5KHRhcmdldCk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sgZmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsdGVyIGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSh2ZSk7CQkJCQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGRlcEluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQkJcmV0dXJuIG5ldyBDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihkZXBJbmZvTWdyLCB2ZSk7Ci0JfQkKLQkKLQkvL1JldHVybiB0cnVlIGlmIG5vIGNpcmN1bGFyIGRldGVjdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudChkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cywgYm9vbGVhbiBkbmQpIHsKLQkJaWYgKCEgRGVwZW5kZW5jeUluZm9NZ3IuVmVUb0NoZWNrKGRlc3RpbmF0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUNpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGNoZWNrID0gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soZGVzdGluYXRpb24sIGZhbHNlLCB0cnVlLCBkbmQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc291cmNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaWYgKCEgY2hlY2suYWNjZXB0KGl0Lm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckZvckFwcGx5aW5nVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBib29sZWFuIGRuZCkgewotCQlib29sZWFuIG9rID0gY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudChiYXNlLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZlKSwgdHJ1ZSk7Ci0JCWlmICghb2spIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IHZlLmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnZhcmlhYmlsaXR5X2Vycm9yX21zZywKLQkJCQkJCQlhcmdzKTsJCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKHZlKTsKLQkJCWlmICghIGZpbHRlci5hY2NlcHQoYmFzZSkpIHsKLQkJCQlPYmplY3RbXSBhcmdzID0geyB2ZS5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkJCWFyZ3MpOwkJLy9Ob3QgcmlnaHQgbWVzc2FnZSwgbmVlZCB0byBhZGQgYSBuZXcgcmVzb3VjZSBzdHJpbmcgbGF0ZXIhCi0JCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lJbmZvTWdyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUluZm9NZ3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzZDY5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUluZm9NZ3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByb2ZpbGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBjaXJjdWxhciBkZXBlbmRlbmN5IGluZm8uCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUluZm9NZ3IgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0JcHJpdmF0ZSBNYXAgcmVhY2hhYmxlSW5mb01hcDsJLy97Z3VpZCwgdXB3YXJkUmVhY2hhYmxlSW5mb30KLQlwcml2YXRlIE1hcCByZXBsYWNlck1hcDsKLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGZpbHRlckVsZW1lbnQ7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1vdmVFbGVtZW50OwotCXByaXZhdGUgTGlzdCBjaXJjdWxhckxpc3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGRuZEJpdCA9IGZhbHNlOwotCQotCXB1YmxpYyBEZXBlbmRlbmN5SW5mb01ncihNZXRob2RMaWJyYXJ5IGxpYikgewotCQl0aGlzLmxpYiA9IGxpYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9nQ2lyY3VsYXJEZXBlbmRlbmN5KFN0YWNrIHRyYWNlKSB7Ci0JCWlmIChjaXJjdWxhckxpc3QgPT0gbnVsbCkgewotCQkJY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWNpcmN1bGFyTGlzdC5hZGRBbGwodHJhY2UpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QW5kQ2xlYXJDaXJjdWxhckxpc3QoKSB7Ci0JCUxpc3QgcmV0ID0gY2lyY3VsYXJMaXN0OwotCQljaXJjdWxhckxpc3QgPSBudWxsOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlckVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiBmaWx0ZXJFbGVtZW50ID09IGVsZW07Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gbW92ZUVsZW1lbnQgPT0gZWxlbTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB2ZTogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aCh2ZSkpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gcmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQodmUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCWJvb2xlYW4gbG9vcCA9IGNpckxpc3QgIT0gbnVsbCAmJiAhY2lyTGlzdC5pc0VtcHR5KCk7Ci0JCWJvb2xlYW4gcmVwbGFjaW5nQW5jZXN0b3IgPSBpbmZvLmluaGVyaXRBbmNlc3RvcihWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQlib29sZWFuIGFjdEluaGVyZW50aW5nQW5jZXN0b3IgPSBnZXRBY3RJbmVyZW50aW5nQW5jZXN0b3IodmUpOwotCQkKLQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxvb3ApIHsKLQkJCWxvZygiRXJyb3I+IENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICIpOwkJLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJRGVwZW5kZW5jeUluZm8gbG9vcEluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBsb29wSW5mby5nZXRFbGVtZW50KCk7CQkJCQkJCQotCQkJCWxvZygiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBnZW5FcnJvck1zZyhjaXJMaXN0KSwgdmUsIG51bGwpKTsJCQkKLQkJfQotCQlpZiAocmVwbGFjaW5nQW5jZXN0b3IpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8uZ2V0RWxlbWVudCgpOwotCQkJbG9nKCJFcnJvcj4gIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSArICIgaXMgcmVwbGFjaW5nIGFuIGFuY2VzdG9yLiIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgTGlicmFyeUVkaXRSZXNvdXJjZXMucmVwbGFjaW5nX2FuY2VzdG9yX2Vycm9yX21zZywgdmUsIG51bGwpKTsJCQkJCQkJCi0JCX0KLQkJaWYgKGFjdEluaGVyZW50aW5nQW5jZXN0b3IpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8uZ2V0RWxlbWVudCgpOwotCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnLCB2ZSwgbnVsbCkpOwkJCQkJCQkKLQkJfQotCi0JCQotCQkKLQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXRBY3RJbmVyZW50aW5nQW5jZXN0b3IoVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCWlmICh2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChBY3Rpdml0eSBhY3QgPSAoKEFjdGl2aXR5KSB2ZSkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IAotCQkJCQkJCQkJYWN0ICE9IG51bGw7IGFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJCQlpZiAoYWN0ID09IGJhc2UpIHsKLQkJCQkJCXJldHVybiB0cnVlOwkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdlbkVycm9yTXNnKExpc3QgY2lyTGlzdCkgewotCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudmFyaWFiaWxpdHlfZWxlbWVudF9jaXJjdWxhcl9sb29wX2Vycm9yX21zZzsKLQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBsb29wSW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkKLQkJCWlmIChpID4gMCkgewotCQkJCW1zZyArPSAiOiAiOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJbXNnICs9IFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKTsJCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0JCQkKLQlwdWJsaWMgSURlcGVuZGVuY3lJbmZvIHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQlib29sZWFuCWlzRmlsdGVyRWxlbWVudCwgYm9vbGVhbiBpc01vdmVFbGVtZW50KSB7Ci0JCXJldHVybiByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCh2ZSwgaXNGaWx0ZXJFbGVtZW50LCBpc01vdmVFbGVtZW50LCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgSURlcGVuZGVuY3lJbmZvIHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQlib29sZWFuCWlzRmlsdGVyRWxlbWVudCwgYm9vbGVhbiBpc01vdmVFbGVtZW50LCBib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGlzRmlsdGVyRWxlbWVudCkgewotCQkJZmlsdGVyRWxlbWVudCA9IHZlOwotCQl9Ci0JCWlmIChpc01vdmVFbGVtZW50KSB7Ci0JCQltb3ZlRWxlbWVudCA9IHZlOwotCQl9CQkKLQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSAgZ2V0UHJvY2Vzc2VkSW5mbyh2ZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsJCQotCQkJaW5mbyA9IG5ld0RlcGVuZGVuY3lJbmZvKHRoaXMsIHZlKTsKLQkJfQotCQlpZiAoISBpbmZvLmlzQ29tcGxldGUoKSkgewotCQkJaW5mby5idWlsZChjaGVja0NpcmN1bGFyKTsKLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc2VkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkICE9IG51bGwgJiYgcHJvY2Vzc2VkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEZXBlbmRlbmN5SW5mbyBnZXRQcm9jZXNzZWRJbmZvKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkID09IG51bGwgPyBudWxsIDogKElEZXBlbmRlbmN5SW5mbykgcHJvY2Vzc2VkLmdldChlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUHJvY2Vzc2VkKElEZXBlbmRlbmN5SW5mbyBpbmZvKSB7Ci0JCWlmIChwcm9jZXNzZWQgPT0gbnVsbCkgewotCQkJcHJvY2Vzc2VkID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlwcm9jZXNzZWQucHV0KGluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgaW5mbyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUmVwbGFjZXJNYXAoSURlcGVuZGVuY3lJbmZvIHJlcGxhY2VySW5mbykgewotCQlpZiAocmVwbGFjZXJNYXAgPT0gbnVsbCkgewotCQkJcmVwbGFjZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJlcGxhY2VyTWFwLnB1dChyZXBsYWNlckluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgcmVwbGFjZXJJbmZvKTsKLQl9CQotCQkKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5mbyBhZGRUb1JlYWNoYWJsZUluZm9NYXAoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChyZWFjaGFibGVJbmZvTWFwID09IG51bGwpIHsKLQkJCXJlYWNoYWJsZUluZm9NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgcmVhY2hhYmxlSW5mb01hcC5nZXQoZWxlbS5nZXRHdWlkKCkpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7CQkKLQkJCWluZm8gPSBuZXdEZXBlbmRlbmN5SW5mbyh0aGlzLCBlbGVtKTsKLQkJCXJlYWNoYWJsZUluZm9NYXAucHV0KGVsZW0uZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQkJCi0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qCi0JICogRGV0ZWN0IGNpcmN1bGFyIGRlcGVuZGVuY3kgZm9yIHRoZSB3aG9sZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KCkgIHsKLQkJYnVpbGRSZWFjaGFibGVJbmZvTWFwKCk7Ci0JCQotCQlib29sZWFuIHJlcGxhY2luZ0FjZXN0b3IgPSBmYWxzZTsKLQkJaWYgKHJlcGxhY2VyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBsYWNlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSkgewotCQkJCQlyZXBsYWNpbmdBY2VzdG9yID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnICYmIGNpcmN1bGFyTGlzdCAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDaXJjdWxhciBsb29wcyBkZXRlY3RlZDogIik7CS8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaXJjdWxhckxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBpdC5uZXh0KCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN0YWNrLnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICIgKyAoaSkgKyAiOiAiICsgc3RhY2suZ2V0KGkpKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVwbGFjaW5nQWNlc3RvciB8fCBudW1DaXJjdWxhckRlcGVuZGVuY3koKSA+IDA7Ci0JfQotCQotCXByaXZhdGUgaW50IG51bUNpcmN1bGFyRGVwZW5kZW5jeSgpIHsKLQkJcmV0dXJuIGNpcmN1bGFyTGlzdCA9PSBudWxsID8gMCA6IGNpcmN1bGFyTGlzdC5zaXplKCk7Ci0JfQotCQotCS8vdG8gYmUgc3BlY2lhbGl6ZWQgYnkgc3ViIGNsYXNzZXMKLQlwcm90ZWN0ZWQgSURlcGVuZGVuY3lJbmZvIG5ld0RlcGVuZGVuY3lJbmZvKERlcGVuZGVuY3lJbmZvTWdyIG1nciwgTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiAgbmV3IFVwd2FyZFJlYWNoYWJsZUluZm8odGhpcywgZWxlbSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFJlYWNoYWJsZUluZm9NYXAoKSB7Ci0JCWxvbmcgdXNlZE1lbTAgPSAwOwotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7IAotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaXQubmV4dCgpOwotCQkJfQotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCXVzZWRNZW0wID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJfQotCQkKLQkJYnVpbGRSZWFjaGFibGVJbmZvTWFwXygpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZWFjaGFibGVJbmZvTWFwXygpIHsKLQkJcmVhY2hhYmxlSW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKFZlVG9DaGVjayhvYmopKSB7Ci0JCQkJCWFkZFRvUmVhY2hhYmxlSW5mb01hcCgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWFjaGFibGVJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgaXQubmV4dCgpOwotCQkJaWYgKCEgcHJvY2Vzc2VkKGluZm8uZ2V0RWxlbWVudCgpKSkgewotCQkJCWluZm8uYnVpbGQodHJ1ZSk7Ci0JCQl9Ci0JCX0JCi0KLQl9CQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFZlVG9DaGVjayhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAJb2JqIGluc3RhbmNlb2YgRG9tYWluIHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5IHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIFByYWN0aWNlIHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlIHx8Ci0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JfQotCQotCS8qCi0JICogQ2hlY2sgY2lyY3VsYXIgZGVwZW5kZW5jeSBmb3IgdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KFRyYWNlciB0cmFjZXIpIHsKLQkJbG9uZyB1c2VkTWVtMCA9IDA7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsgCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdC5uZXh0KCk7Ci0JCQl9Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJdXNlZE1lbTAgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQl9Ci0KLQkJQ2hlY2tSZXN1bHQgcmVzdWx0ID0gY2hlY2tDaXJjdWxhckRlcGVuZG5lY3lfKHRyYWNlcik7Ci0JCQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8oVHJhY2VyIHRyYWNlcikgewotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBuZXcgQ2hlY2tSZXN1bHQoKTsKLQkJCi0JCUhhc2hTZXQgc2VlbiA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGlpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaWl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaWl0Lm5leHQoKTsKLQkJCQlpZiAoc2Vlbi5jb250YWlucyhvYmopKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlzZWVuLmFkZChvYmopOwkJCQkKLQkJCQlpZiAoVmVUb0NoZWNrKG9iaikpIHsKLQkJCQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmosIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCQkJCQotCQkJCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQkJCQlib29sZWFuIHJlcGxhY2luZ0FuY2VzdG9yID0gaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQkJCQkJCi0JCQkJCWlmIChsb29wKSB7Ci0JCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJSURlcGVuZGVuY3lJbmZvIGxvb3BJbmZvID0gKElEZXBlbmRlbmN5SW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkJCQkJCQkKLQkJCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJcmVzdWx0LmNpcmN1bGFyTGlzdC5hZGQoY2lyTGlzdCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlcGxhY2luZ0FuY2VzdG9yKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBpbmZvLmdldEVsZW1lbnQoKTsKLQkJCQkJCXRyYWNlci50cmFjZSgiRXJyb3I+ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkgKyAiIGlzIHJlcGxhY2luZyBhbiBhbmNlc3Rvci4iKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXJlc3VsdC5yZXBsYWNpbmdBbmNlc3Rvckxpc3QuYWRkKGluZm8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkJCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrUmVzdWx0IHsKLQkJcHVibGljIExpc3QgY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlwdWJsaWMgTGlzdCByZXBsYWNpbmdBbmNlc3Rvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7Ci0JCQlyZXR1cm4gY2lyY3VsYXJMaXN0LnNpemUoKSArIHJlcGxhY2luZ0FuY2VzdG9yTGlzdC5zaXplKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0Q2lyY3VsYXJFbGVtZW50Q291bnQoKSB7Ci0JCQlpbnQgY291bnQgPSByZXBsYWNpbmdBbmNlc3Rvckxpc3Quc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0wOyBpPGNpcmN1bGFyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBjaXJjdWxhckxpc3QuZ2V0KGkpOwotCQkJCWludCBzeiA9IGxpc3QgPT0gbnVsbCA/IDAgOiBsaXN0LnNpemUoKTsKLQkJCQljb3VudCArPSBzejsKLQkJCX0KLQkJCXJldHVybiBjb3VudDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RuZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiBkbmRCaXQgJiYgbW92ZUVsZW1lbnQgPT0gZWxlbTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG5kQml0KGJvb2xlYW4gYikgewotCQlkbmRCaXQgPSBiOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VmFsaWRhdGlvbk1nci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lWYWxpZGF0aW9uTWdyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDJjYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lWYWxpZGF0aW9uTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGFsbCBkZXBlbmRlbmN5IGNoZWNrcyBmb3IgdmFsaWRhdGlvbgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyIHsKLQkKLQlwcml2YXRlIERlcGVuZGVuY3lJbmZvTWdyIHZlRGVwSW5mb01ncjsKLQlwcml2YXRlIFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyIHBsdWdpbkRlcEluZm9NZ3I7Ci0JCi0JcHVibGljIERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXZlRGVwSW5mb01nciA9IG5ldyBEZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCQlwbHVnaW5EZXBJbmZvTWdyID0gbmV3IFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyKGxpYik7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlyZXR1cm4gdmVEZXBJbmZvTWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIHBsdWdpbkRlcEluZm9NZ3IuY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koKE1ldGhvZFBsdWdpbikgZWxlbWVudCk7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDkyZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkZXBlbmRlbmN5IGluZm8gdXNlZCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNraW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZXBlbmRlbmN5SW5mbyB7Ci0JCi0Jdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpOwotCQotCWJvb2xlYW4gaXNDb21wbGV0ZSgpOwotCQotCWJvb2xlYW4gcmVhY2hhYmxlQnkoSURlcGVuZGVuY3lJbmZvIGluZm8pOwotCQotCWJvb2xlYW4gaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZSB0eXBlKTsKLQkKLQlNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JTmFtZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSU5hbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ2Mjg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JTmFtZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgbmFtZSBmb3IgYSBzcGVjaWZpZWQgb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSmFuIDMxLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lUHJvdmlkZXIgewotCVN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjUzOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAxLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRvciB7Ci0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBzdHJpbmcuIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZQotCSAqIG5ldyB0ZXh0IGlzIGludmFsaWQuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXJyb3IuCi0JICogTm90ZSB0aGF0IHRoZSBlbXB0eSBzdHJpbmcgaXMgbm90IHRyZWF0ZWQgdGhlIHNhbWUgYXMgPGNvZGU+bnVsbDwvY29kZT47Ci0JICogaXQgaW5kaWNhdGVzIGFuIGVycm9yIHN0YXRlIGJ1dCB3aXRoIG5vIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gY2hlY2sgZm9yIHZhbGlkaXR5Ci0JICogCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9yCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KTsKLQkKLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIG9iamVjdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHZhbGlkYXRlCi0JICogQHJldHVybiBhIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKTsKLQkKLQlwdWJsaWMgaW50IE1heEZpbGVQYXRoTmFtZUxlbmd0aCA9IDI1NTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWYwYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZSB0byBjcmVhdGUgdmFyaW91cyB2YWxpZGF0b3JzIHRvIHZhbGlkYXRlIHN0cmluZyB2YWx1ZSBvZgotICogc3BlY2lmaWVkIG9iamVjdCBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3JGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElWYWxpZGF0b3JGYWN0b3J5IElOU1RBTkNFID0gVmFsaWRhdG9yRmFjdG9yeQotCQkJLmNyZWF0ZVZhbGlkYXRvckZhY3RvcnkoKTsKLQotCUlWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihOYW1lZEVsZW1lbnQgZSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBuYW1lIHZhbGlkYXRvciBmb3IgYSBjb250ZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgQ29udGVudEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIG5hbWUgdmFsaWRhdG9yIGZvciBhIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBuYW1lIHZhbGlkYXRvciBmb3IgYW4gZWxlbWVudCBvZiBuZXdUeXBlIHdpdGggbmFtZSBvZiBlLmdldE5hbWUoKQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCUlWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBOYW1lZEVsZW1lbnQgZSwgRUNsYXNzIG5ld1R5cGUpOwotCi0JSVZhbGlkYXRvciBjcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUgb2JqZWN0Ci0JICogaXMgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gcGFyZW50IHZpYSB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHJlZmVyZW5jZSAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHRvIHZhbGlkYXRlIGl0cyB2YWx1ZQotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKiAgICAgICAgICAgIHRoZSBFQ2xhc3Mgb2YgdGhlIG9iamVjdCB0byB2YWxpZGF0ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgICAgbm90IGFwcGxpY2FibGUKLQkgKiBAcmV0dXJuCi0JICovCi0JSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJRUNsYXNzIGVDbGFzcywgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsKLQkKLQlJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyLCBFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwkKLQkKLQlJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBFQ2xhc3MgZUNsYXNzLCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vTmFtZUNoZWNrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9OYW1lQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ5MmQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9OYW1lQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHZhcmlvdXMgc3RhdGljIG1ldGhvZHMgdG8gdmFsaWRhdGUgbmFtZSBvZiBzcGVjaWZpZWQKLSAqIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZUNoZWNrZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVYVCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRfdGV4dDsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU5hbWVQcm92aWRlciBwcmVzZW50YXRpb25OYW1lUHJvdmlkZXIgPSBuZXcgSU5hbWVQcm92aWRlcigpIHsKLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpOwotCQkJfQotCQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChEZXNjcmliYWJsZUVsZW1lbnQpb2JqZWN0KS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgZmluYWwgQ2xhc3MgdHlwZSwKLQkJCUlOYW1lUHJvdmlkZXIgbmFtZVByb3ZpZGVyLCBTdHJpbmcgbmV3TmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc2lvbiwKLQkJCWJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIHR5cGUuaXNJbnN0YW5jZShvYmopOwotCQkJfQotCi0JCX07Ci0KLQkJcmV0dXJuIGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBlLCBjaGlsZEZpbHRlciwgbmFtZVByb3ZpZGVyLAotCQkJCW5ld05hbWUsIHN1cHByZXNpb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSwgU3RyaW5nIG5ld05hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgY2hpbGRGaWx0ZXIsCi0JCQkJY3JlYXRlTmFtZVByb3ZpZGVyKG5hbWVGZWF0dXJlKSwgbmV3TmFtZSwgc3VwcHJlc3Npb24sCi0JCQkJaWdub3JlU3VwcHJlc3NlZCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBwYXJlbnQsIE9iamVjdCBlLCBJRmlsdGVyIGNoaWxkRmlsdGVyLAotCQkJSU5hbWVQcm92aWRlciBuYW1lUHJvdmlkZXIsIFN0cmluZyBuZXdOYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgCi0JewotCQlpZiAoaWdub3JlU3VwcHJlc3NlZCkKLQkJCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsICYmIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JCS8vIGdldCBjaGlsZHJlbiBvZiB0aGUgcm9sbGVkLWRvd24gZGFwdGVyCi0JCS8vCi0JCWJvb2xlYW4gd2FzUm9sbGVkVXAgPSBmYWxzZTsKLQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJYnNJdGVtUHJvdmlkZXIgPSAoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpOwotCQkJd2FzUm9sbGVkVXAgPSBic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmICh3YXNSb2xsZWRVcCkgewotCQkJCWJzSXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCX0KLQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2FzUm9sbGVkVXApIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKHdhc1JvbGxlZFVwKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQotCQkJLy8gc2tpcCBjaGVja2luZyBvbiBzdXBwcmVzc2VkIGVsZW1lbnQKLQkJCS8vCi0vKjE3MDA1OAlpZiAoc3VwcHJlc3Npb24gIT0gbnVsbCAmJiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoaXRlbSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0qLwotCi0JCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVtKTsKLQkJCWlmIChjaGlsZCAhPSBlICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVQcm92aWRlci5nZXROYW1lKGNoaWxkKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5ld05hbWUpKSB7Ci0JCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElOYW1lUHJvdmlkZXIgY3JlYXRlTmFtZVByb3ZpZGVyKAotCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlKSB7Ci0JCWlmKG5hbWVGZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWVQcm92aWRlcjsgCi0JCX0KLQkJCi0JCXJldHVybiBuZXcgSU5hbWVQcm92aWRlcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlyZXR1cm4gKFN0cmluZykgKChFT2JqZWN0KSBvYmplY3QpLmVHZXQobmFtZUZlYXR1cmUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ2xhc3MgdHlwZSwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLAotCQkJU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSAKLQl7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIG51bGwsIGUsIHR5cGUsIG5hbWVGZWF0dXJlLCBuZXdOYW1lLAotCQkJCXN1cHByZXNzaW9uLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHBhcmVudCwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ2xhc3MgdHlwZSwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLAotCQkJU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIAotCXsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRW1wdHkoZSwgbmV3TmFtZSk7Ci0JCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0KLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gY2hvb3NlVHlwZShlKTsKLQkJfQotCQkKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gYmFzaWMgY2hlY2sKLQkJLy8KLQkJbXNnID0gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIHR5cGUsCi0JCQkJY3JlYXRlTmFtZVByb3ZpZGVyKG5hbWVGZWF0dXJlKSwgbmV3TmFtZSwgc3VwcHJlc3Npb24sCi0JCQkJaWdub3JlU3VwcHJlc3NlZCk7Ci0KLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIGRvbid0IGFsbG93IHRlYW0gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgc2FtZSBzY29wZQotCQkJLy8KLQkJCWNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLy8gUExFQVNFIERPTidUIENMRUFOIFVQLgotCQkvLyBDb21tZW50ZWQgb3V0IGZvciBub3csIHNpbmNlIHdlIGNoYW5nZSBzY29wZSBvZiBEZWxpdmVyYWJsZS4KLQkJLy8gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkvLyAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mCi0JCS8vIERlbGl2ZXJhYmxlKSB7Ci0JCS8vIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCS8vCQotCQkvLyBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyByZXR1cm4gZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkvLyAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mCi0JCS8vIERlbGl2ZXJhYmxlOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIH0KLQotCQlpZiAoY2hpbGRGaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNoZWNrTmFtZUluU2NvcGUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgbmFtZUZlYXR1cmUsIG5ld05hbWUsCi0JCQkJCWNoaWxkRmlsdGVyLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrRW1wdHkoT2JqZWN0IGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCS8vIHNraXAgY2hlY2tpbmcgb24gYWN0aXZpdHkgdGhhdCBpcyBhIGV4dGVuZGVyIG9yIGxvY2FsIGNvbnRyaWJ1dG9yCi0JCS8vCi0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmcgZWxlbWVudFR5cGU7Ci0JCWlmIChlIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQllbGVtZW50VHlwZSA9IFRuZ1V0aWwuZ2V0VHlwZVRleHQoKE5hbWVkRWxlbWVudCkgZSk7Ci0JCX0gZWxzZSB7Ci0JCQllbGVtZW50VHlwZSA9IEVMRU1FTlRfVEVYVDsKLQkJfQotCQlpZiAobmV3TmFtZSA9PSBudWxsIHx8IG5ld05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsJCQkKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQlTdHJVdGlsLnRvTG93ZXIoZWxlbWVudFR5cGUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5Ci0JICoge0BsaW5rICNjaGVja05hbWUoQWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSwgU3RyaW5nLCBTdXBwcmVzc2lvbiwgYm9vbGVhbikgY2hlY2tOYW1lKCl9Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2hvb3NlVHlwZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIEFjdGl2aXR5LmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFRhc2tEZXNjcmlwdG9yLmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFJvbGVEZXNjcmlwdG9yLmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3M7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZS5nZXRDbGFzcygpOwotCQl9Ci0JCS8vIHJldHVybiBCcmVha2Rvd25FbGVtZW50LmNsYXNzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWVJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQsIEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIHsKLQkJLy8gY2hlY2sgdXAKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gY3VycmVudFBhcmVudDsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlTdHJpbmcgbXNnID0gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIGNoaWxkRmlsdGVyLAotCQkJCQlmZWF0dXJlLCBuYW1lLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQlpZiAobXNnICE9IG51bGwpCi0JCQkJcmV0dXJuIG1zZzsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0KLQkJLy8gY2hlY2sgZG93bgotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQljdXJyZW50UGFyZW50LCBmYWxzZSk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGNoaWxkICE9IGUgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQlTdHJpbmcgY2hpbGROYW1lID0gKFN0cmluZykgKChFT2JqZWN0KSBjaGlsZCkuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZE5hbWUpKSB7Ci0JCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LAotCQkJCQkJLy8gZGF0YSk7Ci0JCQkJCQlyZXR1cm4gTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCQkJCW5hbWUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIGZlYXR1cmUsIG5hbWUsIHN1cHByZXNzaW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBuYW1lIG9yIHByZXNlbnRhdGlvbiBuYW1lIG9mIGEgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBpcwotCSAqIGFscmVhZHkgcGFydCBvZiBhIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICogQHBhcmFtIGlnbm9yZVN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJZmluYWwgQnJlYWtkb3duRWxlbWVudCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSAKLQl7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIChPYmplY3QpbnVsbCwgZSwgKENsYXNzKW51bGwsIGZlYXR1cmUsIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkhhdmVFbXB0eVByZXNlbnRhdGlvbk5hbWUoRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpZSkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlyZXR1cm4gdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCQl8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMKLQkJCQl8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OOwkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0ZpbGVQYXRoTGVuZ3RoKAotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgbWF4TGVuZ3RoLAotCQkJU3RyaW5nW10gZmlsZVBhdGhOYW1lKSB7Ci0JCVJlc291cmNlIHJlcyA9IHBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UuZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCWlmIChmaWxlUGF0aE5hbWUgIT0gbnVsbCAmJiBmaWxlUGF0aE5hbWUubGVuZ3RoID49IDEpIHsKLQkJCS8vVG8gZG86IGNhbGN1bGF0ZSBwYXRoCi0JCQkvL2ZpbGVQYXRoTmFtZVswXSA9ID8/Ci0JCX0JCQotCQkKLQkJaW50IHBhcmVudFJlc0xlbiA9IHVyaS50b0ZpbGVTdHJpbmcoKS5sZW5ndGgoKTsJCQotCQlpbnQgbG9jYWxHcm91cExlbiA9IDIwOwotCQlpZiAocGFyZW50RWxlbWVudFdpdGhSZXNvdXJjZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWxvY2FsR3JvdXBMZW4gPSAwOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlsb2NhbEdyb3VwTGVuID0gNTsJCS8vInJvbGVzIgotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJbG9jYWxHcm91cExlbiA9IDE4OwkJLy8iY2FwYWJpbGl0eXBhdHRlcm5zIgotCQl9Ci0JCS8vTW9yZSBlbHNlIGlmIGhlcmUKLQkJCi0JCWludCB0b3RhbExlbiA9IHBhcmVudFJlc0xlbiArIGxvY2FsR3JvdXBMZW4gKyBuYW1lLmxlbmd0aCgpOwkJCi0JCXJldHVybiB0b3RhbExlbiA8PSBtYXhMZW5ndGg7CQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhjNjk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgcGx1Z2luIGRlcGVuZGVuY3kgaW5mbyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkRlcEluZm8gewotCi0JcHJpdmF0ZSBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3I7Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFBsdWdpbkRlcEluZm8oUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXRoaXMubWdyID0gbWdyOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZDogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcihjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXIoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCU9iamVjdCBpbmZvID0gbWdyLmdldFByb2Nlc3NlZEluZm8oZ2V0UGx1Z2luKCkpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0UGx1Z2luKCkuZ2V0QmFzZXMoKTsKLQkJaW50IHN6ID0gcGFyZW50cyA9PSBudWxsID8gMCA6IHBhcmVudHMuc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJY29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHByb2Nlc3NlZFBhcmVudHMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaTwgc3o7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBhcmVudEVsZW0gPSAoTWV0aG9kUGx1Z2luKSBwYXJlbnRzLmdldChpKTsKLQkJCVBsdWdpbkRlcEluZm8gcGluZm8gPSAoUGx1Z2luRGVwSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgUGx1Z2luRGVwSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKFBsdWdpbkRlcEluZm8pIHByb2Nlc3NlZFBhcmVudHMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8pICB7Ci0JCWlmICghIChpbmZvIGluc3RhbmNlb2YgUGx1Z2luRGVwSW5mbykpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRyeSByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlYWNoYWJsZUJ5KChQbHVnaW5EZXBJbmZvKSBpbmZvLCBuZXcgU3RhY2soKSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8sIFN0YWNrIHN0YWNrLCBNYXAgc2VlbikgIHsKLQkJc3RhY2sucHVzaChpbmZvKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogdGhpcyAtPiAiICsgdGhpcyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZXQgPSAgcmVhY2hhYmxlQnlfKGluZm8sIHN0YWNrLCBzZWVuKTsKLQkJc3RhY2sucG9wKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeV8oUGx1Z2luRGVwSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCU1hcCB0ZXN0TWFwID0gaW5mby5wYXJlbnRNYXA7CQkKLQkJaWYgKHRlc3RNYXAgPT0gbnVsbCB8fCB0ZXN0TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGVzdE1hcC5jb250YWluc0tleShnZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQlzZWVuLnB1dChpbmZvLmdldFBsdWdpbigpLmdldEd1aWQoKSwgaW5mbyk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5EZXBJbmZvIHBhcmVudEluZm8gPSAoUGx1Z2luRGVwSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKHBhcmVudEluZm8uY29udGFpbmVkSW4oc3RhY2spKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGNvbnRhaW5lZEluIHN0YWNrOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQkJfQotCQkJCXN0YWNrLnB1c2gocGFyZW50SW5mbyk7Ci0JCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJCXN0YWNrLnBvcCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgIChyZWFjaGFibGVCeShwYXJlbnRJbmZvLCBzdGFjaywgc2VlbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQkJCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgocGx1Z2luKTsKLQl9Ci0JCi0JLy9UaGlzIHdvdWxkIHNjYWxlIHVwIGZvciBwZXJmb3JtYW5jZSB3aGVuIGluZm9MaXN0IGdldHMgbGFyZ2UKLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbmVkSW4oTGlzdCBpbmZvTGlzdCkgewotCQlpbnQgc3ogPSBpbmZvTGlzdCA9PSBudWxsID8gMCA6IGluZm9MaXN0LnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZ3VpZCA9IGdldFBsdWdpbigpLmdldEd1aWQoKTsKLQkJaWYgKHN6ID09IDEpIHsKLQkJCXJldHVybiBndWlkLmVxdWFscygoKFBsdWdpbkRlcEluZm8pIGluZm9MaXN0LmdldCgwKSkuZ2V0UGx1Z2luKCkuZ2V0R3VpZCgpKTsKLQkJfQotCQlNYXAgbGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlQbHVnaW5EZXBJbmZvIGluZm8gPSAoUGx1Z2luRGVwSW5mbykgaW5mb0xpc3QuZ2V0KGkpOwotCQkJbGlzdE1hcC5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdE1hcC5jb250YWluc0tleShndWlkKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGViYTg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByb2ZpbGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW5mbyBmb3IgcGx1Z2lucy4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYjsKLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ7Ci0JcHJpdmF0ZSBMaXN0IGNpcmN1bGFyTGlzdDsKLQkKLQlwdWJsaWMgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWIgPSBsaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvZ0NpcmN1bGFyRGVwZW5kZW5jeShTdGFjayB0cmFjZSkgewotCQlpZiAoY2lyY3VsYXJMaXN0ID09IG51bGwpIHsKLQkJCWNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQljaXJjdWxhckxpc3QuYWRkQWxsKHRyYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCkgewotCQlMaXN0IHJldCA9IGNpcmN1bGFyTGlzdDsKLQkJY2lyY3VsYXJMaXN0ID0gbnVsbDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCX0KLQkKLQlwcml2YXRlIFBsdWdpbkRlcEluZm8gcmVnaXN0ZXJQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbiwgYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7CQkKLQkJUGx1Z2luRGVwSW5mbyBpbmZvID0gIGdldFByb2Nlc3NlZEluZm8ocGx1Z2luKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewkJCi0JCQlpbmZvID0gbmV3IFBsdWdpbkRlcEluZm8odGhpcywgcGx1Z2luKTsKLQkJfQotCQlpZiAoISBpbmZvLmlzQ29tcGxldGUoKSkgewotCQkJaW5mby5idWlsZChjaGVja0NpcmN1bGFyKTsKLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHBsdWdpbjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChwbHVnaW4pKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW5EZXBJbmZvIGluZm8gPSByZWdpc3RlclBsdWdpbihwbHVnaW4sIHRydWUpOwotCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwotCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQlpZiAobG9vcCkgewotCQkJbG9nKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCVBsdWdpbkRlcEluZm8gbG9vcEluZm8gPSAoUGx1Z2luRGVwSW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQkJCQkJCQotCQkJCWxvZygiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkJbG9nKCIiKTsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBnZW5FcnJvck1zZyhjaXJMaXN0KSwgcGx1Z2luLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuRXJyb3JNc2coTGlzdCBjaXJMaXN0KSB7Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnOwotCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldFBsdWdpbigpOwkKLQkJCWlmIChpID4gMCkgewotCQkJCW1zZyArPSAiOiAiOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJbXNnICs9IFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKTsJCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0JCQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzZWQoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gcHJvY2Vzc2VkICE9IG51bGwgJiYgcHJvY2Vzc2VkLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGx1Z2luRGVwSW5mbyBnZXRQcm9jZXNzZWRJbmZvKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCA9PSBudWxsID8gbnVsbCA6IChQbHVnaW5EZXBJbmZvKSBwcm9jZXNzZWQuZ2V0KHBsdWdpbi5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Byb2Nlc3NlZChQbHVnaW5EZXBJbmZvIGluZm8pIHsKLQkJaWYgKHByb2Nlc3NlZCA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzZWQgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXByb2Nlc3NlZC5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCX0KLQkKLQkvKgotCSAqIENoZWNrIGNpcmN1bGFyIGRlcGVuZGVuY3kgYW1vbmcgdGhlIHBsdWdpbnMgb2YgdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KFRyYWNlciB0cmFjZXIsIGJvb2xlYW4gYWNjdW1FcnJvcnMpIHsKLQkJaWYgKHRyYWNlciA9PSBudWxsKSB7Ci0JCQl0cmFjZXIgPSBuZXcgVHJhY2VyKCkgewotCQkJCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7fQotCQkJfTsKLQkJfQotCQlsb25nIHVzZWRNZW0wID0gMDsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOyAKLQkJaWYgKHByb2ZpbGluZykgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWl0Lm5leHQoKTsKLQkJCX0KLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQl1c2VkTWVtMCA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCX0KLQotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8odHJhY2VyLCBhY2N1bUVycm9ycyk7Ci0JCQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8oVHJhY2VyIHRyYWNlciwgYm9vbGVhbiBhY2N1bUVycm9ycykgewotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBuZXcgQ2hlY2tSZXN1bHQoKTsKLQkJCi0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkKLQkJCVBsdWdpbkRlcEluZm8gaW5mbyA9IHJlZ2lzdGVyUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7Ci0JCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwkJCQotCQkJYm9vbGVhbiBsb29wID0gY2lyTGlzdCAhPSBudWxsICYmICFjaXJMaXN0LmlzRW1wdHkoKTsKLQkJCWlmIChsb29wKSB7Ci0JCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQkJCQkJCQotCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXN1bHQuY2lyY3VsYXJMaXN0LmFkZChjaXJMaXN0KTsKLQkJCQlpZiAoISBhY2N1bUVycm9ycykgewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQkJCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja1Jlc3VsdCB7Ci0JCXB1YmxpYyBMaXN0IGNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJCXJldHVybiBjaXJjdWxhckxpc3Quc2l6ZSgpOwotCQl9CQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTQxM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1RyYWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBUcmFjZXIgewotCXZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3ZTRhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgbWV0aG9kIGVsZW1lbnQgdW5pcXVlIG5hbWUgaGFuZGxpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVOYW1lSGFuZGxlciB7Ci0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBVbmlxdWVOYW1lSGFuZGxlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJOYW1lcyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcmVnaXN0ZXIoZWxlbWVudC5nZXROYW1lKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCXJlZ2lzdGVyKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyBuYW1lKSB7Ci0JCW5hbWVzLmFkZChuYW1lLnRvVXBwZXJDYXNlKCkpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKFN0cmluZyBvbGROYW1lKSB7CQkKLQkJU3RyaW5nIG5hbWUgPSBvbGROYW1lOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlKG5hbWVzLmNvbnRhaW5zKG5hbWUudG9VcHBlckNhc2UoKSkpIHsKLQkJCWkrKzsKLQkJCW5hbWUgPSBvbGROYW1lICsgIl8iICsgaTsJCS8vJE5PTi1OTFMtMSQgCi0JCX0JCQkKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVQTmFtZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lUE5hbWVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDBmNDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVQTmFtZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgdW5pcXVlIG5hbWUgYW5kIHByZXNlbnRhdGlvbiBuYW1lIGhhbmRsaW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB7Ci0JcHJpdmF0ZSBVbmlxdWVOYW1lSGFuZGxlciBuYW1lSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lSGFuZGxlcigpOwotCXByaXZhdGUgVW5pcXVlTmFtZUhhbmRsZXIgcG5hbWVIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVIYW5kbGVyKCk7Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQluYW1lSGFuZGxlci5yZWdpc3Rlck5hbWVzKGVsZW1lbnRzKTsKLQkJcG5hbWVIYW5kbGVyLnJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMoZWxlbWVudHMpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgZW5zdXJlVW5pcXVlKERlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gbmFtZUhhbmRsZXIuZ2V0VW5pcXVlTmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCWlmICghIG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwkJCi0JCX0KLQkJbmFtZUhhbmRsZXIucmVnaXN0ZXIobmFtZSk7Ci0JCQotCQlTdHJpbmcgcG5hbWUgPSBwbmFtZUhhbmRsZXIuZ2V0VW5pcXVlTmFtZShlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCWlmICghIHBuYW1lLmVxdWFscyhlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCWVsZW1lbnQuc2V0UHJlc2VudGF0aW9uTmFtZShwbmFtZSk7CQkKLQkJfQotCQlwbmFtZUhhbmRsZXIucmVnaXN0ZXIocG5hbWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VcHdhcmRSZWFjaGFibGVJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVXB3YXJkUmVhY2hhYmxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjE1YWZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VcHdhcmRSZWFjaGFibGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyB1cHdhcmQgcmVhY2hhYmxlIGluZm8gZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2tpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVcHdhcmRSZWFjaGFibGVJbmZvIGltcGxlbWVudHMgSURlcGVuZGVuY3lJbmZvIHsKLQotCXByaXZhdGUgRGVwZW5kZW5jeUluZm9NZ3IgbWdyOwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFVwd2FyZFJlYWNoYWJsZUluZm8oRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5tZ3IgPSBtZ3I7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBjb21wbGV0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYnVpbGQoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGQ6ICIgKyB0aGlzKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1aWxkSW5uZXIoY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyKGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewotCQlPYmplY3QgaW5mbyA9IG1nci5nZXRQcm9jZXNzZWRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0TWl4ZWRQYXJlbnRMaXN0KCk7Ci0JCWludCBzeiA9IHBhcmVudHMgPT0gbnVsbCA/IDAgOiBwYXJlbnRzLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcGFyZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBwcm9jZXNzZWRQYXJlbnRzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGk8IHN6OyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50RWxlbSA9IChNZXRob2RFbGVtZW50KSBwYXJlbnRzLmdldChpKTsKLQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gcGluZm8gPSAoVXB3YXJkUmVhY2hhYmxlSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgVXB3YXJkUmVhY2hhYmxlSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKElEZXBlbmRlbmN5SW5mbykgcHJvY2Vzc2VkUGFyZW50cy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlYWNoYWJsZUJ5KElEZXBlbmRlbmN5SW5mbyBpbmZvKSAgewotCQlpZiAoISAoaW5mbyBpbnN0YW5jZW9mIFVwd2FyZFJlYWNoYWJsZUluZm8pKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IEVudHJ5IHJlYWNoYWJsZUJ5OiB0aGlzIC0+ICIgKyB0aGlzKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IGluZm8gLT4gIiArIGluZm8pOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZWFjaGFibGVCeSgoVXB3YXJkUmVhY2hhYmxlSW5mbykgaW5mbywgbmV3IFN0YWNrKCksIG5ldyBIYXNoTWFwKCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVhY2hhYmxlQnkoVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCXN0YWNrLnB1c2goaW5mbyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVhY2hhYmxlQnk6IGluZm8gLT4gIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gIHJlYWNoYWJsZUJ5XyhpbmZvLCBzdGFjaywgc2Vlbik7Ci0JCXN0YWNrLnBvcCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVhY2hhYmxlQnlfKFVwd2FyZFJlYWNoYWJsZUluZm8gaW5mbywgU3RhY2sgc3RhY2ssIE1hcCBzZWVuKSAgewotCQlNYXAgdGVzdE1hcCA9IGluZm8ucGFyZW50TWFwOwkJCi0JCWlmICh0ZXN0TWFwID09IG51bGwgfHwgdGVzdE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHRlc3RNYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkKLQkJc2Vlbi5wdXQoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB0ZXN0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gcGFyZW50SW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAocGFyZW50SW5mby5jb250YWluZWRJbihzdGFjaykpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gY29udGFpbmVkSW4gc3RhY2s6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkKLQkJCQl9Ci0JCQkJc3RhY2sucHVzaChwYXJlbnRJbmZvKTsKLQkJCQltZ3IubG9nQ2lyY3VsYXJEZXBlbmRlbmN5KChTdGFjaykgc3RhY2suY2xvbmUoKSk7Ci0JCQkJc3RhY2sucG9wKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAgKHJlYWNoYWJsZUJ5KHBhcmVudEluZm8sIHN0YWNrLCBzZWVuKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9CQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldE1peGVkUGFyZW50TGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQljb2xsZWN0UGFyZW50TGlzdChlbGVtZW50LCBsaXN0KTsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJY29sbGVjdFBhcmVudExpc3RCeVZhcmlhbnRQYXRocyh2ZSwgbGlzdCk7Ci0JCWlmICh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMgKSB7Ci0JCQltZ3IuYWRkVG9SZXBsYWNlck1hcCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQYXJlbnRMaXN0KE1ldGhvZEVsZW1lbnQgZWxlbSwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IGdldFBhcmVudExpc3QoZWxlbSk7Ci0JCQotCQlpbnQgc3ogPSBwYXJlbnRMaXN0ID09IG51bGwgPyAwIDogcGFyZW50TGlzdC5zaXplKCk7Ci0JCWlmIChtZ3IuaXNNb3ZlRWxlbWVudChlbGVtKSkgewotCQkJaWYgKHN6ID4gMSAmJiAhKGVsZW0gaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoc3ogPiAwKSB7Ci0JCQlsaXN0LmFkZEFsbChwYXJlbnRMaXN0KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IG51bGw7Ci0JCQotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW0pOwotCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIGVsZW0pOwkJCQotCQl9IGVsc2UgewkKLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRTYW1lVHlwZVBhcmVudChlbGVtKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcGFyZW50TGlzdC5hZGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQYXJlbnRMaXN0QnlWYXJpYW50UGF0aHMoVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBMaXN0IGxpc3QpIHsKLQkJaWYgKCEgbWdyLmlzRmlsdGVyRWxlbWVudCh2ZSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBwYXJlbnRWZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gcGFyZW50VmUgPT0gbnVsbCA/IG51bGwgOiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCWxpc3QuYWRkKHBhcmVudFZlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtZ3IuaXNEbmRFbGVtZW50KHZlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBUbmdVdGlsLmdldEltbWVkaWF0ZVZhcmlldGllcyh2ZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIDsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGV4dGVuZGVyID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKCEgbWdyLmlzRmlsdGVyRWxlbWVudChleHRlbmRlcikpIHsKLQkJCQlsaXN0LmFkZChleHRlbmRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0U2FtZVR5cGVQYXJlbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5KSBlbGVtKS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJfQotCQkJCi0JCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVsZW0uZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gcGFyZW50LmdldFR5cGUoKSA9PSBlbGVtLmdldFR5cGUoKSA/IHBhcmVudCA6IG51bGw7Ci0JfQkJCi0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBwYXJlbnRWZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmIChwYXJlbnRWZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSB0eXBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQXJyYXlMaXN0IG1peFBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CQotCQljb2xsZWN0UGFyZW50TGlzdChlbGVtZW50LCBtaXhQYXJlbnRMaXN0KTsKLQkJaWYgKG1peFBhcmVudExpc3QgIT0gbnVsbCAmJiBtaXhQYXJlbnRMaXN0LmNvbnRhaW5zKHBhcmVudFZlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlVcHdhcmRSZWFjaGFibGVJbmZvIHBhcmVudFZlSW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBwYXJlbnRNYXAuZ2V0KHBhcmVudFZlLmdldEd1aWQoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBwYXJlbnRJbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICAocGFyZW50VmVJbmZvID09IHBhcmVudEluZm8pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChwYXJlbnRWZUluZm8ucmVhY2hhYmxlQnkocGFyZW50SW5mbykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vVGhpcyB3b3VsZCBzY2FsZSB1cCBmb3IgcGVyZm9ybWFuY2Ugd2hlbiBpbmZvTGlzdCBnZXRzIGxhcmdlCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5lZEluKExpc3QgaW5mb0xpc3QpIHsKLQkJaW50IHN6ID0gaW5mb0xpc3QgPT0gbnVsbCA/IDAgOiBpbmZvTGlzdC5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGd1aWQgPSBnZXRFbGVtZW50KCkuZ2V0R3VpZCgpOwotCQlpZiAoc3ogPT0gMSkgewotCQkJcmV0dXJuIGd1aWQuZXF1YWxzKCgoSURlcGVuZGVuY3lJbmZvKSBpbmZvTGlzdC5nZXQoMCkpLmdldEVsZW1lbnQoKS5nZXRHdWlkKCkpOwotCQl9Ci0JCU1hcCBsaXN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgaW5mb0xpc3QuZ2V0KGkpOwotCQkJbGlzdE1hcC5wdXQoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3RNYXAuY29udGFpbnNLZXkoZ3VpZCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0dXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTYyZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RhdHVzIGV4dGVuZHMgU3RhdHVzIHsKLQotCXByaXZhdGUgT2JqZWN0IGNoZWNrZWRPYmplY3Q7Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2hlY2tlZE9iamVjdAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgY2hlY2tlZE9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIoc2V2ZXJpdHksIExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgY29kZSwgbWVzc2FnZSwgbnVsbCk7Ci0JCXRoaXMuY2hlY2tlZE9iamVjdCA9IGNoZWNrZWRPYmplY3Q7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKFN0cmluZyBwbHVnaW5JZCwgaW50IHNldmVyaXR5LCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBjaGVja2VkT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIG51bGwpOwotCQl0aGlzLmNoZWNrZWRPYmplY3QgPSBjaGVja2VkT2JqZWN0OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hlY2tlZE9iamVjdCgpIHsKLQkJcmV0dXJuIGNoZWNrZWRPYmplY3Q7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNzdmZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIE5hbWUgdmFsaWRhdG9yIGZvciBDb250ZW50RWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yIGV4dGVuZHMgVW5pcXVlbmVzc1ZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoRU9iamVjdCBjb250YWluZXIsIENvbnRlbnRFbGVtZW50IGUsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCXN1cGVyKGNvbnRhaW5lciwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIGNoaWxkRmlsdGVyLCBlLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSwgQ29udGVudEVsZW1lbnQgZSwKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBjb250YWluaW5nRmVhdHVyZSwgY2hpbGRGaWx0ZXIsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlVuaXF1ZW5lc3NWYWxpZGF0b3IjaXNWYWxpZChTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCUNvbnRlbnRFbGVtZW50IGUgPSAoQ29udGVudEVsZW1lbnQpIG9iamVjdDsKLQotCQkvLyAxNTY5NDUgLSBFbGVtZW50IG5hbWUgbmVlZCB0byBhbGxvdyBtb3JlIHNwZWNpYWwgY2hhcmFjdGVycyBzdWNoIGFzID8gCi0JCS8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGdlbmVyYXRlIGEgcmVzb3VyY2UgZmlsZQotCQlpZiAoIGUgaW5zdGFuY2VvZiBTZWN0aW9uICkgewotCQkJcmV0dXJuIG5ld1RleHQ7Ci0JCX0KLQkJCi0JCVN0cmluZyBtc2cgPSBUbmdVdGlsLmNoZWNrRWxlbWVudE5hbWUobmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCQotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb250YWluZXIpOwotCQkKLQkJCUludGVnZXIgbWF4ID0gbmV3IEludGVnZXIoTWF4RmlsZVBhdGhOYW1lTGVuZ3RoKTsKLQkJCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgocGx1Z2luLCBlLCBuZXdUZXh0LCBtYXguaW50VmFsdWUoKSwgbnVsbCkpIHsKLQkJCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgCi0JCQkJCQluZXcgT2JqZWN0W10geyBtYXggfSApOwotCQkJCXJldHVybiBtc2c7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDaGVjayB3aGV0aGVyIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNvbnRhaW5lcik7Ci0JCQlpZihwbHVnaW4gPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSkpIHsKLQkJCQlVUkkgdXJpID0gcGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKTsJCQkKLQkJCQkJU3RyaW5nIGZvbGRlclBhdGggPSBwZXJzaXN0ZXIuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCQkJCQlTdHJpbmcgZGlyID0gbmV3IFN0cmluZ0J1ZmZlcihwbHVnaW5EaXIuZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZCgKLQkJCQkJCQlGaWxlLnNlcGFyYXRvcikuYXBwZW5kKGZvbGRlclBhdGgpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IG5ld1RleHQgKyBwZXJzaXN0ZXIuZ2V0RmlsZUV4dGVuc2lvbihlKTsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7Ci0JCQkJCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCWlmIChjb250ZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUoY29udGVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY3VycmVudEZpbGUgPSBmaWxlOwotCQkJCQl9Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpICYmICFuZXdUZXh0LmVxdWFscyhlLmdldE5hbWUoKSkgJiYgIWZpbGUuZXF1YWxzKGN1cnJlbnRGaWxlKSkgewotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnLCBmaWxlKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaXNWYWxpZChuZXdUZXh0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTBmZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0N1c3RvbUNhdGVnb3J5TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogTmFtZSB2YWxpZGF0b3IgZm9yIEN1c3RvbUNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yIGV4dGVuZHMgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBjaGlsZEZpbHRlcgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IoQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50LCBDdXN0b21DYXRlZ29yeSBlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlzdXBlcihwYXJlbnQsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUywgZSwgY2hpbGRGaWx0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTUyYmIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Eb05vdGhpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVmFsaWRhdG9yIHRoYXQgdmFsaWRhdGVzIG5vdGhpbmcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDQsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvTm90aGluZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9Ob3RoaW5nVmFsaWRhdG9yIElOU1RBTkNFID0gbmV3IERvTm90aGluZ1ZhbGlkYXRvcigpOwotCi0JcHJpdmF0ZSBEb05vdGhpbmdWYWxpZGF0b3IoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYmY1ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBOYW1lIHZhbGlkYXRvciBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXkgMTIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3OTczCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IoTWV0aG9kTGlicmFyeSBsaWIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWxpYnJhcnkgPSBsaWI7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCW5ld1RleHQgPSBuZXdUZXh0LnRyaW0oKTsgLy9maXggaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Nzk3MwotCQlJbnRlZ2VyIG1heCA9IG5ldyBJbnRlZ2VyKE1heEZpbGVQYXRoTmFtZUxlbmd0aCk7Ci0JCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgobGlicmFyeSwgY29uZmlnLCBuZXdUZXh0LCBtYXguaW50VmFsdWUoKSwgbnVsbCkpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgCi0JCQkJCW5ldyBPYmplY3RbXSB7IG1heCB9ICk7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCVN0cmluZyBjb25maWdGb2xkZXIgPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSAKLQkJCS5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoY29uZmlnKTsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudCgpLCBjb25maWdGb2xkZXIpOwotCQlyZXR1cm4gVG5nVXRpbC5jaGVja05hbWUoZGlyLCBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCBjb25maWcsCi0JCQkJbmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChjb25maWcpLCBmYWxzZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRlNjczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwkKLQotCS8qKgotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvcihNZXRob2RMaWJyYXJ5IGxpYiwgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpYiA9IGxpYjsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlTdHJpbmcgbXNnID0gVG5nVXRpbC5jaGVja1BsdWdpbk5hbWUobmV3VGV4dCk7Ci0JCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCQotCQlJbnRlZ2VyIG1heCA9IG5ldyBJbnRlZ2VyKE1heEZpbGVQYXRoTmFtZUxlbmd0aCk7Ci0JCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgobGliLCBwbHVnaW4sIG5ld1RleHQsIG1heC5pbnRWYWx1ZSgpLCBudWxsKSkgewotCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2csIAotCQkJCQluZXcgT2JqZWN0W10geyBtYXggfSApOwotCQkJcmV0dXJuIG1zZzsKLQkJfQotCQkKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJLmdldFBhcmVudEZpbGUoKTsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCA9IChwbHVnaW4gIT0gbnVsbCkgPyBUbmdVdGlsLmdldFR5cGVUZXh0KHBsdWdpbikKLQkJCQk6IFRuZ1V0aWwuZ2V0VHlwZVRleHQoIk1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBUbmdVdGlsLmNoZWNrTmFtZShkaXIsIGxpYi5nZXRNZXRob2RQbHVnaW5zKCksIHBsdWdpbiwgbmV3VGV4dCwKLQkJCQllbGVtZW50VHlwZVRleHQsIHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkOGQyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogVmFsaWRhdGVzIHRoZSBuYW1lIG9mIGEgcHJvY2VzcyBjb21wb25lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvcihQcm9jZXNzUGFja2FnZSBwYXJlbnQsCi0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnByb2NDb21wID0gcHJvY0NvbXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyByZWxhdGl2ZVBhdGggPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKQotCQkJLmdldEZvbGRlclJlbGF0aXZlUGF0aChwcm9jQ29tcCk7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwYXJlbnQpOwotCQkKLQkJSW50ZWdlciBtYXggPSBuZXcgSW50ZWdlcihNYXhGaWxlUGF0aE5hbWVMZW5ndGgpOwotCQlpZiAoISBOYW1lQ2hlY2tlci5jaGVja0ZpbGVQYXRoTGVuZ3RoKHBsdWdpbiwgcHJvY0NvbXAsIG5ld1RleHQsIG1heC5pbnRWYWx1ZSgpLCBudWxsKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnLCAKLQkJCQkJbmV3IE9iamVjdFtdIHsgbWF4IH0gKTsKLQkJCXJldHVybiBtc2c7Ci0JCX0KLQkJCi0JCUZpbGUgZGlyID0gbmV3IEZpbGUoCi0JCQkJbmV3IEZpbGUocGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudCgpCi0JCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcmVsYXRpdmVQYXRoKTsKLQkJaWYgKCEgbmV3VGV4dC5lcXVhbHMoU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdUZXh0KSkpIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnLCBuZXdUZXh0KTsgCi0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tOYW1lKGRpciwgcGFyZW50LmdldENoaWxkUGFja2FnZXMoKSwgcHJvY0NvbXAsCi0JCQkJbmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChwcm9jQ29tcCksIHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVW5pcXVlbmVzc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDExNjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVmFsaWRhdGVzIHRoZSB1bmlxdWVuZXNzIG9mIGFuIG9iamVjdCB3aXRoaW4gYSBnaXZlbiBmZWF0dXJlIHRoYXQgY29udGFpbnMgaXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVuZXNzVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JcHJvdGVjdGVkIEVPYmplY3Qgb2JqZWN0OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVOYW1lOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmU7Ci0KLQlwcml2YXRlIElGaWx0ZXIgY2hpbGRGaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBjb250YWluZXI7Ci0KLQlwdWJsaWMgVW5pcXVlbmVzc1ZhbGlkYXRvcihFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzKGNvbnRhaW5lciwgY29udGFpbmluZ0ZlYXR1cmUsIGNoaWxkRmlsdGVyLCBvYmosIGZlYXR1cmUsIFN0clV0aWwKLQkJCQkudG9Mb3dlcihUbmdVdGlsLmdldEZlYXR1cmVUZXh0KGZlYXR1cmUpKSk7Ci0JfQotCi0JcHVibGljIFVuaXF1ZW5lc3NWYWxpZGF0b3IoRU9iamVjdCBjb250YWluZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUsIElGaWx0ZXIgY2hpbGRGaWx0ZXIsCi0JCQlFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJb2JqZWN0ID0gb2JqOwotCQl0aGlzLmNvbnRhaW5pbmdGZWF0dXJlID0gY29udGFpbmluZ0ZlYXR1cmU7Ci0JCXRoaXMuY2hpbGRGaWx0ZXIgPSBjaGlsZEZpbHRlcjsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5mZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lOwotCX0KLQkKLQl2b2lkIHNldENoaWxkRmlsdGVyKElGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJdGhpcy5jaGlsZEZpbHRlciA9IGNoaWxkRmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbmV3VGV4dCA9IG5ld1RleHQudHJpbSgpOwotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5ld1RleHQpKSB7Ci0JCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQlmZWF0dXJlTmFtZSk7Ci0JCX0KLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJaWYgKGNvbnRhaW5pbmdGZWF0dXJlID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY29udGFpbmVyLmVDb250ZW50cygpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4gPSAoQ29sbGVjdGlvbikgY29udGFpbmVyLmVHZXQoY29udGFpbmluZ0ZlYXR1cmUpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgIT0gb2JqZWN0ICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpICgoRU9iamVjdCkgY2hpbGQpLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShuZXdUZXh0KSkgewotCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCW5ld1RleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjb250YWluZXIuZUNvbnRlbnRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbiA9IChDb2xsZWN0aW9uKSBjb250YWluZXIuZUdldChjb250YWluaW5nRmVhdHVyZSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCAhPSBvYmplY3QgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCVN0cmluZyBvID0gKFN0cmluZykgKChFT2JqZWN0KSBjaGlsZCkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoby5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVGZWF0dXJlVmFsdWUsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJVG5nVXRpbC5nZXRMYWJlbChjb250YWluZXIpLAotCQkJCQkJCQkJCQkJCWZlYXR1cmVOYW1lCi0JCQkJCQkJCQkJCX0pLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0Njk3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgSVZhbGlkYXRvckZhY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgSVZhbGlkYXRvckZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIExpc3QgY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBJVmFsaWRhdG9yRmFjdG9yeSBpbnN0YW5jZTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZU5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICYmIGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcmV0dXJuIG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCBlLAotCQkJCQluZXcgVHlwZUZpbHRlcihlKSk7Ci0JCX0KLQkJRU9iamVjdCBjb250YWluZXIgPSBudWxsOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJY29udGFpbmVyID0gKEVPYmplY3QpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihjb250YWluZXIsIGUsIG5ldyBUeXBlRmlsdGVyKGUpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQpCi0JICogICAgICBDaGFuZ2VkIGZyb20gQ29udGVudEVsZW1lbnQgdG8gRGVzY3JpYmFibGVFbGVtZW50LCBiZWNhdXNlCi0JICogICAgICBQcmVzZW50YXRpb25OYW1lIGF0dHJpYnV0ZSBpcyBhdmFpbGFibGUgaW4gRGVzY3JpYmFibGVFbGVtZW50LgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlPYmplY3RbXSBhcnIgPSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihwYXJlbnQsIGUpOwotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgYXJyWzBdOwotCQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IChJRmlsdGVyKSBhcnJbMV07Ci0JCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGRGaWx0ZXIgPT0gbnVsbCkgewotCQkJCQljaGlsZEZpbHRlciA9IG5ldyBUeXBlRmlsdGVyKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwgcmVmZXJlbmNlLAotCQkJCQkJY2hpbGRGaWx0ZXIsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5VbmlxdWVuZXNzVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuZXdUZXh0KQotCQkJCQkJCQkmJiBOYW1lQ2hlY2tlcgotCQkJCQkJCQkJCS5jYW5IYXZlRW1wdHlQcmVzZW50YXRpb25OYW1lKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBzdXBlci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JCXByaXZhdGUgaW50IGNsYXNzSUQ7Ci0KLQkJcHJpdmF0ZSBFQ2xhc3MgZUNsYXNzOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBUeXBlRmlsdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCQljbGFzc0lEID0gb2JqLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVGaWx0ZXIoRUNsYXNzIGVDbGFzcykgewotCQkJdGhpcy5lQ2xhc3MgPSBlQ2xhc3M7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGVDbGFzcy5pc0luc3RhbmNlKG9iaik7Ci0JCQl9Ci0KLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIGNsYXNzSUQgPT0gKChFT2JqZWN0KSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGaWx0ZXIgbm9uRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIoT2JqZWN0IHBhcmVudCwKLQkJCU9iamVjdCBjaGlsZCkgewotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBudWxsOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCSYmIGNoaWxkIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM7Ci0JCQkJY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcigKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQkJCX0KLQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzsKLQkJCQljaGlsZEZpbHRlciA9IG5vbkZpbHRlcjsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJcmVmZXJlbmNlID0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzsKLQkJCQljaGlsZEZpbHRlciA9IG5vbkZpbHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciB9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZU5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBmaW5hbCBOYW1lZEVsZW1lbnQgZSkgewotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRTsKLQkJT2JqZWN0W10gYXJyID0gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIocGFyZW50LCBlKTsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgYXJyWzBdOwotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gKElGaWx0ZXIpIGFyclsxXTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJCWZlYXR1cmUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKAotCQkJCShNZXRob2RMaWJyYXJ5KSBwYXJlbnQsIChNZXRob2RDb25maWd1cmF0aW9uKSBlKTsKLQkJfQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgZmluYWwgTmFtZWRFbGVtZW50IGUsIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FOwotCQlPYmplY3RbXSBhcnIgPSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihwYXJlbnQsIGUpOwotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBhcnJbMF07Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcihuZXdUeXBlKTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJCWZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlTmFtZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoTmFtZWRFbGVtZW50IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUgPSBUbmdVdGlsLmdldENvbnRhaW5pbmdGZWF0dXJlKGUsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgIT0gbnVsbCkgewotCQkJRU9iamVjdCBwYXJlbnQgPSAoRU9iamVjdCkgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpKS5nZXRQYXJlbnQoZSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IocGFyZW50LAotCQkJCQkJY29udGFpbmluZ0ZlYXR1cmUsIChDb250ZW50RWxlbWVudCkgZSwKLQkJCQkJCW5ldyBUeXBlRmlsdGVyKGUpKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gbmV3IFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yKAotCQkJCQkJKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnQsIChQcm9jZXNzQ29tcG9uZW50KSBlKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIG5ldyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yKAotCQkJCQkJKE1ldGhvZExpYnJhcnkpIHBhcmVudCwgKE1ldGhvZFBsdWdpbikgZSk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKAotCQkJCQkJKE1ldGhvZExpYnJhcnkpIHBhcmVudCwgKE1ldGhvZENvbmZpZ3VyYXRpb24pIGUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LCBjb250YWluaW5nRmVhdHVyZSwKLQkJCQkJCW5ldyBUeXBlRmlsdGVyKGUpLCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU5hbWVWYWxpZGF0b3IoZS5lQ29udGFpbmVyKCksIGUpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJRUNsYXNzIGVDbGFzcywgZmluYWwgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBlQ2xhc3MgIT0gbnVsbCA/IG5ldyBUeXBlRmlsdGVyKGVDbGFzcykgOiBudWxsOwotCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKHBhcmVudCwgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciwgb2JqZWN0LCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElWYWxpZGF0b3JGYWN0b3J5IGNyZWF0ZVZhbGlkYXRvckZhY3RvcnkoKSB7Ci0JCWlmIChjb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQljb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCSJ2YWxpZGF0aW9uU3VwcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKQotCQkJCQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlib29sZWFuIHJlcGxhY2UgPSBuZXcgQm9vbGVhbihjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgicmVwbGFjZSIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAocmVwbGFjZSkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMuY2xlYXIoKTsKLQkJCQkJCQkJCWluc3RhbmNlID0gKElWYWxpZGF0b3JGYWN0b3J5KSBleHQ7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMuYWRkKGV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKGZpbmFsIE9iamVjdCBwYXJlbnQsIEVDbGFzcyBlQ2xhc3MsCi0JCQlmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlmaW5hbCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FCi0JCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdDsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MocGFyZW50KTsKLQkJCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cHAgPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQkJcmV0dXJuIG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQotCQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQkJCXBhcmVudCwgYmUsIG51bGwsIGZlYXR1cmUsIG5ld1RleHQsIHN1cHAsCi0JCQkJCQkJCQl0cnVlKTsKLQkJCQkJCX0KLQotCQkJCQl9OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbHRlciBnZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIsIEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIgOiAoZU9iamVjdCAhPSBudWxsID8gbmV3IFR5cGVGaWx0ZXIoCi0JCQkJZU9iamVjdCkgOiBub25GaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyLCBmaW5hbCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkgewotCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyAmJiBvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQkJdmFsaWRhdG9yID0gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCQkJcmVmZXJlbmNlLCAoQ29udGVudEVsZW1lbnQpIG9iamVjdCwgZ2V0RmlsdGVyKAotCQkJCQkJCQkJY2hpbGRGaWx0ZXIsIG9iamVjdCkpOwotCi0JCQkJfSBlbHNlIGlmICgocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUykpIHsKLQkJCQkJLy8gRGlzY2lwbGluZSBhbmQgRGlzY2lwbGluZUdyb3VwaW5nLCBSb2xlU2V0IGFuZAotCQkJCQkvLyBSb2xlU2V0R3JvdXBpbmcKLQkJCQkJLy8gaGFuZGxpbmcKLQkJCQkJLy8gbmVjZXNzYXJ5IGluIG9yZGVyIHRvIG1haW50YWluIHVuaXF1ZW5lc3MgYWNyb3NzIHBsdWdpbi4KLQkJCQkJdmFsaWRhdG9yID0gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LmVDb250YWluZXIoKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCQl9IGVsc2UgaWYgKChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUykKLQkJCQkJCXx8IChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FKQotCQkJCQkJfHwgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTKQotCQkJCQkJfHwgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fU1VCRE9NQUlOUykKLQkJCQkJCSkgewotCQkJCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKHBhcmVudCwKLQkJCQkJCQlyZWZlcmVuY2UsIChDb250ZW50RWxlbWVudCkgb2JqZWN0LCBnZXRGaWx0ZXIoCi0JCQkJCQkJCQljaGlsZEZpbHRlciwgb2JqZWN0KSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCSYmIHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgcGFyZW50OwotCQkJCWlmIChwa2cuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJcmV0dXJuIG5ldyBQcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvcigKLQkJCQkJCQkoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudCwgKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwKLQkJCQkJCQlnZXRGaWx0ZXIoY2hpbGRGaWx0ZXIsIG9iamVjdCksIG9iamVjdCwgZmVhdHVyZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgcGFyZW50OwotCQkJCWlmIChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpIHsKLQkJCQkJaWYgKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQkJcmV0dXJuIG5ldyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yKGxpYiwKLQkJCQkJCQkJKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcigKLQkJCQkJCQkJbGliLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywKLQkJCQkJCQkJbm9uRmlsdGVyLCBvYmplY3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUykgewotCQkJCQlpZiAobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKGxpYiwKLQkJCQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoCi0JCQkJCQkJCWxpYiwKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUywKLQkJCQkJCQkJbm9uRmlsdGVyLCBvYmplY3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2YWxpZGF0b3IgPSBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcihwYXJlbnQsIHJlZmVyZW5jZSwKLQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCX0KLQotCQkJcmV0dXJuIHZhbGlkYXRvcjsKLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2UxODIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhbGlkYXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzNkMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB2YWxpZGF0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzYjhlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgQ29tbW9uIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzE4Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRmOGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb247dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2gsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLAotIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWwKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjY2E3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbWlncmF0aW9uLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL21pZ3JhdG9ycy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL21pZ3JhdG9ycy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc5ZTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi9taWdyYXRvcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaHR0cFw6Ly8vY29tL2libS91bWEuZWNvcmU9b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcgotb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcj1odHRwXDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUKLWh0dHBcOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZT1vcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yMTAyCi1vcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yMTAyPWh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWExLjAuMl8xLjAuMy5lY29yZTJlY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWExLjAuMl8xLjAuMy5lY29yZTJlY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyZTc0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMS4wLjJfMS4wLjMuZWNvcmUyZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmUyZWNvcmU6RWNvcmUyRWNvcmVNYXBwaW5nUm9vdCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlMmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDA0L0Vjb3JlMkVjb3JlIiB0b3BUb0JvdHRvbT0idHJ1ZSI+Ci0gIDxpbnB1dHMgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUjLyIvPgotICA8b3V0cHV0cyBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5lY29yZSMvIi8+Ci08L2Vjb3JlMmVjb3JlOkVjb3JlMkVjb3JlTWFwcGluZ1Jvb3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjI3ZTQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBMaWJyYXJ5IFBlcnNpc3RlbmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLVBlcnNpc3RlbmNlTWFya2VyVHlwZU5hbWU9VW5yZXNvbHZlZCBFbGVtZW50cyBQcm9ibGVtcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlYjE2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtaWdyYXRvcnMiIG5hbWU9Ik1pZ3JhdG9ycyIgc2NoZW1hPSJzY2hlbWEvbWlncmF0b3JzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlc291cmNlU2V0RmFjdG9yaWVzIiBuYW1lPSJMaWJyYXJ5IFJlc291cmNlIFNldCBGYWN0b3JpZXMiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlIiAvPgotICAgIDxwYWNrYWdlCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSIKLSAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyI+Ci0gICAgIDxtaWdyYXRvcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvciIKLSAgICAgICAgICAgbGliTnNVUkk9Imh0dHA6Ly8vY29tL2libS91bWEuZWNvcmUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5zZXJ2aWNlUHJvdmlkZXJzIj4KLSAgICAgPGFjY2Vzc0NvbnRyb2xsZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLkFjY2Vzc0NvbnRyb2xsZXIiLz4KLSAgICAgPGxpYnJhcnlQZXJzaXN0ZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5YTUlMaWJyYXJ5UGVyc2lzdGVyIgotICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgdHlwZT0ieG1pIi8+Ci0gICAgIDxmaWxlTWFuYWdlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkRlbGVnYXRlRmlsZU1hbmFnZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnJlc291cmNlU2V0RmFjdG9yaWVzIj4KLSAgICAgPHJlc291cmNlU2V0RmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlhNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkiCi0gICAgICAgICAgIHR5cGU9InhtaSIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBpZD0idW5yZXNvbHZlZFByb3h5TWFya2VyIgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIgbmFtZT0iJVBlcnNpc3RlbmNlTWFya2VyVHlwZU5hbWUiPgotICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICB2YWx1ZT0iZmFsc2UiPgotICAgICA8L3BlcnNpc3RlbnQ+Ci0gICAgIDxzdXBlcgotICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIj4KLSAgICAgPC9zdXBlcj4KLSAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICBuYW1lPSJwcm94eVVSSSI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im93bmVyR1VJRCI+Ci0gICAgIDwvYXR0cmlidXRlPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvbWlncmF0b3JzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvbWlncmF0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MGEwZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL21pZ3JhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIgaWQ9Im1pZ3JhdG9ycyIgbmFtZT0iTWlncmF0b3JzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIE1pZ3JhdG9yIG1pZ3JhdGVzIG1ldGhvZCBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtaWdyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtaWdyYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIG1pZ3JhdG9yLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklNaWdyYXRvciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpYk5zVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIHNwYWNlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB0aGlzIG1pZ3JhdG9yIGNhbiBtaWdyYXRlcwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyZxdW90OyZndDsKLSAgICAgJmx0O21pZ3JhdG9yCi0gICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3ImcXVvdDsKLSAgICAgICAgICAgbGliTnNVUkk9JnF1b3Q7aHR0cDovLy9jb20vaWJtL3VtYS5lY29yZSZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklNaWdyYXRvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NjaGVtYS9yZXNvdXJjZVNldEZhY3Rvcmllcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMmQ3YjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiBpZD0icmVzb3VyY2VTZXRGYWN0b3JpZXMiIG5hbWU9IkxpYnJhcnkgUmVzb3VyY2UgU2V0IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gY29udHJpYnV0ZSBmYWN0b3JpZXMgZm9yIGNyZWF0aW9uIG9mIGxpYnJhcnkgcmVzb3VyY2Ugc2V0LiBUaGUgZmFjdG9yaWVzIG11c3QgaW1wbGVtZW50IGludGVyZmFjZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBhbmQgbXVzdCBoYXZlIGEgcHVibGljIG5vbi1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb3VyY2VTZXRGYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlc291cmNlU2V0RmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0idHlwZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWRjYTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7Ci0JLyoqCi0JICogR2V0cyBsb2FkIHN0YW1wLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlsb25nIGdldExvYWRTdGFtcCgpOwotCQotCS8qKgotCSAqIEdldHMgcHJveHkgVVJJIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCVVSSSBnZXRQcm94eVVSSShFT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5ZGI1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEEgcmVzb3VyY2Ugc2V0IHRoYXQgbWFuYWdlcyBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc291cmNlfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2VTZXQgZXh0ZW5kcyBJVW1hUmVzb3VyY2VTZXQgewotCS8qKgotCSAqIEdldHMgdGhlIHBlcnNpc3RlbmNlIHR5cGUgdGhpcyByZXNvdXJjZSBzZXQgc3VwcG9ydHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB0eXBlCi0JICogQHNlZSBTZXJ2aWNlcyNnZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSBTZXJ2aWNlcyNYTUlfUEVSU0lTVEVOQ0VfVFlQRQotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIExvYWRzIG1ldGhvZCBsaWJyYXJpZXMgaW50byB0aGlzIHJlc291cmNlIHNldCBmcm9tIHRoZSBnaXZlbiBVUkkuCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuCi0JICovCi0Jdm9pZCBsb2FkTWV0aG9kTGlicmFyaWVzKFVSSSB1cmksIE1hcDw/LCA/PiBwYXJhbWV0ZXJzKQotCQkJdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgbWV0aG9kIGxpYnJhcmllcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGlzCi0JICogcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlMaXN0PE1ldGhvZExpYnJhcnk+IGdldE1ldGhvZExpYnJhcmllcygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbG9hZGVkIG1ldGhvZCBsaWJyYXJ5IG9mIHRoaXMgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIG5vdCBsb2FkZWQKLQkgKiAgICAgICAgIHlldC4KLQkgKiBAc2VlICNsb2FkTGlicmFyeShVUkksIE1hcCkKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGdldEZpcnN0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBHVUlEIChHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllcikKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlFT2JqZWN0IGdldEVPYmplY3QoU3RyaW5nIGd1aWQpOwotCi0JTWFwPD8sID8+IGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCi0JLyoqCi0JICogTG9hZHMgdGhlIGdpdmVuIG9wcG9zaXRlIGZlYXR1cmVzIG9mIGFsbCBsb2FkZWQgb2JqZWN0cyBpbiB0aGlzIHJlc291cmNlCi0JICogc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmVzCi0JICovCi0Jdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhMaXN0PE9wcG9zaXRlRmVhdHVyZT4gb3Bwb3NpdGVGZWF0dXJlcyk7Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgZ2l2ZW4gb3Bwb3NpdGUgZmVhdHVyZXMgb2YgdGhvc2Ugb2JqZWN0cyBpbiB0aGlzIHJlc291cmNlIHNldAotCSAqIHdob3NlIEdVSURzIGFyZSBzcGVjaWZpZWQgaW4gPGNvZGU+R1VJRHM8L2NvZGU+IHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlcwotCSAqIEBwYXJhbSBHVUlEcwotCSAqLwotCXZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdDxPcHBvc2l0ZUZlYXR1cmU+IG9wcG9zaXRlRmVhdHVyZXMsIFNldDxTdHJpbmc+IEdVSURzKTsKLQotCS8qKgotCSAqIFNhdmVzIHRoaXMgcmVzb3VyY2Ugc2V0IHdpdGggdGhlIGdpdmVuIHNhdmUgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgc2F2ZSBvcHRpb25zCi0JICogQHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24KLQkgKi8KLQl2b2lkIHNhdmUoTWFwPD8sID8+IG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoZSBnaXZlbiBvYmplY3QgaW4gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3Qgd2FzIHVubG9hZGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkKLQkgKi8KLQlib29sZWFuIHVubG9hZChFT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugb2YgdGhpcyByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIFRPRE8KLQkgKi8KLQlib29sZWFuIHVubG9hZChSZXNvdXJjZSByZXNvdXJjZSwgTWFwPD8sID8+IG9wdGlvbnMpOwotCi0JLyoqCi0JICogUmVsb2FkcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gcmVsb2FkZWQKLQkgKi8KLQlDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKTsKLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHBlcnNpc3RlZCBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzCi0JICogQHJldHVybiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCi0JICovCi0JQ29sbGVjdGlvbjxFT2JqZWN0PiByZWxvYWRPYmplY3RzKENvbGxlY3Rpb248RU9iamVjdD4gb2JqZWN0cyk7Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoaXMgcmVzb3VyY2Ugc2V0LiBUaGlzIHdpbGwgdW5sb2FkIGV2ZXJ5IHJlc291cmNlIGluIHRoaXMKLQkgKiByZXNvdXJjZSBzZXQgYW5kIHJlc2V0IHRoZSByZXNvdXJjZSBzZXQgdG8gdGhlIHN0YXRlIGJlZm9yZSBsb2FkaW5nIHRoZQotCSAqIGxpYnJhcnkuCi0JICogCi0JICovCi0Jdm9pZCB1bmxvYWQoKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnkgdW5yZXNvbHZlZCBwcm94eSBkZXRlY3RlZCBpbiB0aGUgbGlicmFyeQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpOwotCi0JLyoqCi0JICogU3Vic2NyaWJlcyB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIGxpc3RlbiB0byByZWZyZXNoIGV2ZW50cyBicm9hZGNhc3RlZAotCSAqIHdoZW5ldmVyIHJlc291cmNlcyBvciBvYmplY3RzIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IGlzIHJlZnJlc2hlZC9yZWxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAc2VlICNyZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbikKLQkgKi8KLQl2b2lkIGFkZFJlZnJlc2hMaXN0ZW5lcihJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBVbnN1YnNjcmliZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIGxpc3RlbmluZyB0byByZWZyZXNoIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVJlZnJlc2hMaXN0ZW50ZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKTsKLQotCXZvaWQgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KQotCQkJdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCUlTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxFT2JqZWN0PiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpOwotCQotCUNvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWROZXdSZXNvdXJjZXMoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTczYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSUxpYnJhcnlSZXNvdXJjZVNldH0gaW5zdGFuY2Ugb2YgdGhlIHBhcnRpY3VsYXIKLSAqIHBlcnNpc3RlbmNlIHR5cGUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjYsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwZXJzaXN0ZW5jZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBzZXQgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB0eXBlCi0JICovCi0JU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaWJyYXJ5IHJlc291cmNlIHNldAotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgbGlicmFyeSByZXNvdXJjZSBzZXQKLQkgKi8KLQlJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZUxpYnJhcnlSZXNvdXJjZVNldCgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lSZWZyZXNoSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lSZWZyZXNoSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWE3YjBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JUmVmcmVzaEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEluZm8gewotCS8qKgotCSAqIEdldHMgZXhpc3RpbmcgcmVzb3VyY2VzIHRoYXQgcmVhcHBlYXJzIGluIHdvcmtzcGFjZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkZGVkUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBHZXRzIG5ld2x5IGFkZGVkIHdvcmtzcGFjZSByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNoYW5nZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZFJlc291cmNlcygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlbW92ZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZFJlc291cmNlcygpOwotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IHRoZSBnaXZlbiByZXNvdXJjZSBqdXN0IGhhcyBiZWVuIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlU2F2ZWQoUmVzb3VyY2UgcmVzb3VyY2UpOwkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwYjAxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvTGlicmFyeVJlc291cmNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODI3MjU4NzM0NDY3ODY3NjgyOEw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjYwZGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VTZXJ2aWNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVNlcnZpY2UgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VTZXJ2aWNlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgRmFjdG9yeURlZj4gdHlwZVRvRmFjdG9yeURlZk1hcDsKLQotCXByaXZhdGUgUGVyc2lzdGVuY2VTZXJ2aWNlKCkgewotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZVNldCBmb3IgdGhlIGdpdmVuIHBlcnNpc3RlbmNlIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldChTdHJpbmcgdHlwZSkgewotCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0eXBlKTsKLQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHlwZTogIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWN0b3J5RGVmIHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQotCQlTdHJpbmcgdHlwZTsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQkKLQkJaW50IHZlcnNpb247Ci0JCQotCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBpbnN0YW5jZTsKLQotCQkvKioKLQkJICogQHBhcmFtIGJ1bmRsZQotCQkgKiBAcGFyYW0gdHlwZQotCQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JCSAqIEBwYXJhbSBpbnN0YW5jZQotCQkgKi8KLQkJcHJpdmF0ZSBGYWN0b3J5RGVmKEJ1bmRsZSBidW5kbGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lLCBpbnQgdmVyc2lvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJfQotCQkJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IGdldEZhY3RvcnkoU3RyaW5nIHBlcnNpc3RlbmNlVHlwZSkgewotCQlpZiAodHlwZVRvRmFjdG9yeURlZk1hcCA9PSBudWxsKSB7Ci0JCQl0eXBlVG9GYWN0b3J5RGVmTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGYWN0b3J5RGVmPigpOwotCQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyIKLQkJCS8vIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gY29udHJpYnV0b3JzLgotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiwgInJlc291cmNlU2V0RmFjdG9yaWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHR5cGUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwKLQkJCQkJCQkJCSYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkmJiB0eXBlICE9IG51bGwKLQkJCQkJCQkJCSYmIHR5cGUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlpbnQgdmVyc2lvbiA9IFNlcnZpY2VzLnBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlGYWN0b3J5RGVmIGZhY3RvcnlEZWYgPSB0eXBlVG9GYWN0b3J5RGVmTWFwLmdldCh0eXBlKTsJCQkJCQkJCQotCQkJCQkJCQlpZihmYWN0b3J5RGVmID09IG51bGwgfHwgZmFjdG9yeURlZi52ZXJzaW9uIDwgdmVyc2lvbikgewotCQkJCQkJCQkJdHlwZVRvRmFjdG9yeURlZk1hcC5wdXQodHlwZSwgbmV3IEZhY3RvcnlEZWYoYnVuZGxlLAotCQkJCQkJCQkJCQl0eXBlLCBjbGFzc05hbWUsIHZlcnNpb24pKTsJCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlGYWN0b3J5RGVmIGZhY3RvcnkgPSAoRmFjdG9yeURlZikgdHlwZVRvRmFjdG9yeURlZk1hcC5nZXQocGVyc2lzdGVuY2VUeXBlKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJaWYgKGZhY3RvcnkuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IHJlc291cmNlU2V0RmFjdG9yeSA9IChJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSkgZmFjdG9yeS5idW5kbGUubG9hZENsYXNzKAotCQkJCQkJCWZhY3RvcnkuY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQlpZihwZXJzaXN0ZW5jZVR5cGUuZXF1YWxzKHJlc291cmNlU2V0RmFjdG9yeS5nZXRQZXJzaXN0ZW5jZVR5cGUoKSkpIHsKLQkJCQkJCWZhY3RvcnkuaW5zdGFuY2UgPSByZXNvdXJjZVNldEZhY3Rvcnk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZmFjdG9yeS5jbGFzc05hbWUgKwotCQkJCQkJCQkiIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgd3JvbmcgcGVyc2lzdGVuY2UgdHlwZSAnIiArIHBlcnNpc3RlbmNlVHlwZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIicuIFRoZSBjb3JyZWN0IHR5cGUgbXVzdCBiZSAnIiArIHJlc291cmNlU2V0RmFjdG9yeS5nZXRQZXJzaXN0ZW5jZVR5cGUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZihERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWN0b3J5Lmluc3RhbmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0FjY2Vzc0NvbnRyb2xsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9BY2Nlc3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzJiOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0FjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklBY2Nlc3NDb250cm9sbGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sbGVyIGltcGxlbWVudHMgSUFjY2Vzc0NvbnRyb2xsZXIgewotCi0JcHVibGljIEFjY2Vzc0NvbnRyb2xsZXIoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklBY2Nlc3NDb250cm9sbGVyI2NoZWNrTW9kaWZ5KGphdmEudXRpbC5Db2xsZWN0aW9uLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb24gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmKGVPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJCXJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmNoZWNrTW9kaWZ5KGVPYmplY3RzLCBjb250ZXh0KTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUFjY2Vzc0NvbnRyb2xsZXIjY2hlY2tNb2RpZnkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlW10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmKHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJU3RyaW5nIHBhdGggPSBGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYocGF0aCAhPSBudWxsKSB7Ci0JCQkJcGF0aHMuYWRkKHBhdGgpOwotCQkJfQotCQl9Ci0JCWlmKCFwYXRocy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIGFyciA9IG5ldyBTdHJpbmdbcGF0aHMuc2l6ZSgpXTsKLQkJCXBhdGhzLnRvQXJyYXkoYXJyKTsKLQkJCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrTW9kaWZ5KGFyciwgY29udGV4dCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CQotCQkKLS8vCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLS8vCQkJCUlTdGF0dXMuT0ssIFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vZGlmeUZpbGVzRXJyb3JfbXNnLAotLy8JCQkJbnVsbCk7Ci0vLwotLy8JCUhhc2hNYXA8SUxpYnJhcnlSZXNvdXJjZVNldCwgU2V0PFJlc291cmNlPj4gcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcCA9IG5ldyBIYXNoTWFwPElMaWJyYXJ5UmVzb3VyY2VTZXQsIFNldDxSZXNvdXJjZT4+KCk7Ci0vLwkJU2V0PFJlc291cmNlPiByZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID0gbnVsbDsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotLy8JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLS8vCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLS8vCQkJCVNldCBzZXQgPSByZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwLmdldChyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLS8vCQkJCWlmKHNldCA9PSBudWxsKSB7Ci0vLwkJCQkJc2V0ID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0vLwkJCQkJcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5wdXQoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCksIHNldCk7Ci0vLwkJCQl9Ci0vLwkJCQlzZXQuYWRkKHJlc291cmNlKTsJCQkJCi0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQlpZihyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID09IG51bGwpIHsKLS8vCQkJCQlyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0vLwkJCQl9Ci0vLwkJCQlyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0LmFkZChyZXNvdXJjZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJaWYoIXJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuaXNFbXB0eSgpKSB7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCU1hcC5FbnRyeTxJTGlicmFyeVJlc291cmNlU2V0LCBTZXQ8UmVzb3VyY2U+PiBlbnRyeSA9IChFbnRyeTxJTGlicmFyeVJlc291cmNlU2V0LCBTZXQ8UmVzb3VyY2U+PikgaXRlci5uZXh0KCk7Ci0vLwkJCQlSZXNvdXJjZVtdIGFyciA9IG5ldyBSZXNvdXJjZVtlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKV07Ci0vLwkJCQllbnRyeS5nZXRWYWx1ZSgpLnRvQXJyYXkoYXJyKTsKLS8vCQkJCWVudHJ5LmdldEtleSgpLmNoZWNrTW9kaWZ5KGFyciwgY29udGV4dCk7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0lGYWlsU2FmZVNhdmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3MWNhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGEgcmVzb3VyY2UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBmYWlsLXNhZmUgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZhaWxTYWZlU2F2YWJsZSB7Ci0Jdm9pZCBjb21taXQoKTsKLQkKLQlib29sZWFuIHJlc3RvcmUoKTsKLQkKLQl2b2lkIHNldFR4SUQoU3RyaW5nIHR4SUQpOwotCQotCWJvb2xlYW4gaGFzVGVtcFVSSSgpOwotCQotCXZvaWQgdHhGaW5pc2hlZChib29sZWFuIHN1Y2Nlc3NmdWwpOwotCQotCXZvaWQgZGVsZXRlQmFja3VwKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvSVN5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3N5bmNoL0lTeW5jaHJvbml6YXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2YWYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvSVN5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guaW50ZXJuYWwuU3luY2hyb25pemF0aW9uSGVscGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3luY2hyb25pemF0aW9uSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTeW5jaHJvbml6YXRpb25IZWxwZXIgSU5TVEFOQ0UgPSBuZXcgU3luY2hyb25pemF0aW9uSGVscGVyKCk7Ci0JCi0JbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZSByZXNvdXJjZSk7Ci0JCi0JYm9vbGVhbiBpc1N5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvaW50ZXJuYWwvU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvaW50ZXJuYWwvU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzYwNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3N5bmNoL2ludGVybmFsL1N5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guSVN5bmNocm9uaXphdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbkhlbHBlciBpbXBsZW1lbnRzIElTeW5jaHJvbml6YXRpb25IZWxwZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guSVN5bmNocm9uaXphdGlvbkhlbHBlciNnZXRNb2RpZmljYXRpb25TdGFtcChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCUlGaWxlSW5mbyBpbmZvID0gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRGaWxlSW5mbyhyZXNvdXJjZSk7Ci0JCQlyZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mby5nZXRNb2RpZmljYXRpb25TdGFtcCgpIDogSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCX0KLQkJcmV0dXJuIElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnN5bmNoLklTeW5jaHJvbml6YXRpb25IZWxwZXIjaXNTeW5jaHJvbml6ZWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmlzU3luY2hyb25pemVkKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTk0YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGV4dGVuZGVkIHJlc291cmNlIHNldCB3aG9zZSBvYmplY3RzIGNhbiByZWZlcmVuY2VzIG9iamVjdHMgb2Ygb3RoZXIgcmVzb3VyY2Ugc2V0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9VTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9MT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfRVhURVJOQUwgPSAyOwotCQotCXByb3RlY3RlZCBMaXN0PFJlc291cmNlU2V0PiByZWZlcmVuY2VkUmVzb3VyY2VTZXRzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVNldD4oKTsKLQotCQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBvbmUgb2YgVVJJIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VSSV9UWVBFX0VYVEVSTkFMfSwge0BsaW5rICNVUklfVFlQRV9MT0NBTH0sIHtAbGluayAjVVJJX1RZUEVfVU5LTk9XTn0KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQlyZXR1cm4gVVJJX1RZUEVfVU5LTk9XTjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWRkKFJlc291cmNlU2V0IHJlZmVyZW5jZWRSZXNvdXJjZVNldCkgewotCQlpZighcmVmZXJlbmNlZFJlc291cmNlU2V0cy5jb250YWlucyhyZWZlcmVuY2VkUmVzb3VyY2VTZXQpKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZFJlc291cmNlU2V0cy5hZGQocmVmZXJlbmNlZFJlc291cmNlU2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXggPSBudWxsOwotCQlpbnQgdXJpVHlwZSA9IGdldFVSSVR5cGUodXJpKTsKLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfTE9DQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZ2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJCWlmKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJfQotCQlpZih1cmlUeXBlID09IFVSSV9UWVBFX1VOS05PV04gfHwgdXJpVHlwZSA9PSBVUklfVFlQRV9FWFRFUk5BTCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZFJlc291cmNlU2V0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChSZXNvdXJjZVNldCkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJb2JqZWN0ID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQkJCWlmKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXggPSBlOwotCQkJCX0KLQkJCX0KLQkJfSAKLQkJCi0JCWlmKGV4ICE9IG51bGwpIHsKLQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXRyeXsKLQkJCQlyZXNvdXJjZS51bmxvYWQoKTsJCQkKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZWZlcmVuY2VkUmVzb3VyY2VTZXRzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRmlsZVN5bmNocm9uaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRmlsZVN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTI1ZjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS91dGlsL0ZpbGVTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU3luY2hyb25pemVzIHRoZSBkb2N1bWVudCB3aXRoIGV4dGVybmFsIHJlc291cmNlIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVN5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIEJ1bmRsZSBvZiBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gdG8gYWxsb3cgZmlsZXMgYXMgdW5kZXJseWluZyBkb2N1bWVudCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyAvL2V4dGVuZHMgU3RvcmFnZUluZm8gCi0JewotCQkvKiogVGhlIHRpbWUgc3RhbXAgYXQgd2hpY2ggdGhpcyBwcm92aWRlciBjaGFuZ2VkIHRoZSBmaWxlLiAqLwotCQlwdWJsaWMgbG9uZyBmTW9kaWZpY2F0aW9uU3RhbXA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQlwdWJsaWMgYm9vbGVhbiBmQ2FuQmVTYXZlZDsKLQkJcHVibGljIElGaWxlIGZGaWxlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGZpbGUgaW5mby4KLQkJICoKLQkJICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudAotCQkgKiBAcGFyYW0gbW9kZWwgdGhlIGFubm90YXRpb24gbW9kZWwKLQkJICogQHBhcmFtIGZpbGVTeW5jaHJvbml6ZXIgdGhlIGZpbGUgc3luY2hyb25pemVyCi0JCSAqLwotCQlwdWJsaWMgRmlsZUluZm8oSUZpbGUgZmlsZSkgewotCQkJZkZpbGUgPSBmaWxlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHN5bmNocm9uaXplciBpcyBpbnN0YWxsZWQgb3Igbm90LgotCSAqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklzSW5zdGFsbGVkPSBmYWxzZTsKLQkKLQkvKiogRWxlbWVudCBpbmZvcm1hdGlvbiBvZiBhbGwgY29ubmVjdGVkIGVsZW1lbnRzICovCi0JcHJpdmF0ZSBNYXA8T2JqZWN0LCBGaWxlSW5mbz4gZkZpbGVJbmZvTWFwPSBuZXcgSGFzaE1hcDxPYmplY3QsIEZpbGVJbmZvPigpOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGZpbGUgc3luY2hyb25pemVyLiBJcyBub3QgeWV0IGluc3RhbGxlZCBvbiBhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBGaWxlU3luY2hyb25pemVyKCkgewotCQlpbnN0YWxsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZJc0luc3RhbGxlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlTW9kaWZpY2F0aW9uU3RhbXAoSUZpbGUgZmlsZSkgewotCQlGaWxlSW5mbyBpbmZvID0gZ2V0RmlsZUluZm8oZmlsZSk7Ci0JCWlmKGluZm8gIT0gbnVsbCkgewotCQkJaW5mby5mTW9kaWZpY2F0aW9uU3RhbXAgPSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBpbmZvIG9iamVjdCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgaW5mbyBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgRmlsZUluZm8gZ2V0RmlsZUluZm8oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChGaWxlSW5mbykgZkZpbGVJbmZvTWFwLmdldChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxscyB0aGUgc3luY2hyb25pemVyIG9uIHRoZSBpbnB1dCdzIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbCgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQlmSXNJbnN0YWxsZWQ9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVW5pbnN0YWxscyB0aGUgc3luY2hyb25pemVyIGZyb20gdGhlIGlucHV0J3MgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGUpIHsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGE9IGUuZ2V0RGVsdGEoKTsKLQkJdHJ5IHsKLQkJCWlmIChkZWx0YSAhPSBudWxsICYmIGZJc0luc3RhbGxlZCkgewotCQkJCVJlc291cmNlRGVsdGFWaXNpc3RvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpc3RvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IHZpc2l0b3IuZ2V0UnVubmFibGUoKTsKLQkJCQlpZihydW5uYWJsZSAhPSBudWxsKSB7Ci0JCQkJCXVwZGF0ZShydW5uYWJsZSk7Ci0JCQkJfQotCQkJfSAKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQloYW5kbGVDb3JlRXhjZXB0aW9uKHgsICJFcnJvciBoYW5kbGluZyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIERlZmluZXMgdGhlIHN0YW5kYXJkIHByb2NlZHVyZSB0byBoYW5kbGUgPGNvZGU+Q29yZUV4Y2VwdGlvbnM8L2NvZGU+LiBFeGNlcHRpb25zCi0JICogYXJlIHdyaXR0ZW4gdG8gdGhlIHBsdWctaW4gbG9nLgotCSAqCi0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNvcmVFeGNlcHRpb24oQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSk7Ci0JCUlMb2cgbG9nPSBQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKTsKLQotCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJbG9nLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQkJZWxzZQotCQkJbG9nLmxvZyhleGNlcHRpb24uZ2V0U3RhdHVzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaW5pdGlhbCBtb2RpZmljYXRpb24gc3RhbXAgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHRoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZBVEFMIEVSUk9SOiByZXNvdXJjZSBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gMDsKLQkJfQotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wPSByZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCUlQYXRoIHBhdGg9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0KLQkJbW9kaWZpY2F0aW9uU3RhbXA9IHBhdGgudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0JCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZURlbHRhVmlzaXN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwcml2YXRlIENvbGxlY3Rpb248SUZpbGU+IGNoYW5nZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCXByaXZhdGUgTWFwPElGaWxlLCBJUGF0aD4gbW92ZWRGaWxlVG9OZXdQYXRoTWFwID0gbmV3IEhhc2hNYXA8SUZpbGUsIElQYXRoPigpOwotCQlwcml2YXRlIENvbGxlY3Rpb248SUZpbGU+IGRlbGV0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxJRmlsZT4gYWRkZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0KLQkJLyoKLQkJICogQHNlZSBJUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUwotCQkJCQkmJiBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQlGaWxlSW5mbyBpbmZvID0gKEZpbGVJbmZvKSBnZXRGaWxlSW5mbyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLmZDYW5CZVNhdmVkKQotCQkJCQkJYnJlYWs7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQgPSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSkgPT0gaW5mby5mTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCQkJCWlmICgoKElSZXNvdXJjZURlbHRhLkVOQ09ESU5HICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCAmJiBpc1N5bmNocm9uaXplZCkKLQkJCQkJCQl8fCAoKElSZXNvdXJjZURlbHRhLkNPTlRFTlQgJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwICYmICFpc1N5bmNocm9uaXplZCkpIHsKLQkJCQkJCWNoYW5nZWRGaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJCWlmICgoSVJlc291cmNlRGVsdGEuTU9WRURfVE8gJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwKSB7Ci0JCQkJCQlpbmZvID0gKEZpbGVJbmZvKSBnZXRGaWxlSW5mbyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlmaW5hbCBJUGF0aCBwYXRoID0gZGVsdGEuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCQkJCW1vdmVkRmlsZVRvTmV3UGF0aE1hcC5wdXQoKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpLAotCQkJCQkJCQlwYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZm8gPSAoRmlsZUluZm8pIGdldEZpbGVJbmZvKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiAhaW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCWRlbGV0ZWRGaWxlcy5hZGQoKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCQlmaWxlID0gKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZihhY2NlcHQoZmlsZSkpIHsKLQkJCQkJCWFkZGVkRmlsZXMuYWRkKGZpbGUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIFJ1bm5hYmxlIGdldFJ1bm5hYmxlKCkgewotCQkJLy8gY29uc2lkZXIgdGhlIGZpbGUgaXMgbmV3bHkgYWRkZWQgaWYgaXQgaXMgYWNjZXB0ZWQgYW5kIG5vdCBhIG1vdmVkIGZpbGUKLQkJCS8vCi0JCQlpZiAoIWFkZGVkRmlsZXMuaXNFbXB0eSgpICYmICFtb3ZlZEZpbGVUb05ld1BhdGhNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvcjxJRmlsZT4gaXRlciA9IGFkZGVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSUZpbGUgZmlsZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobW92ZWRGaWxlVG9OZXdQYXRoTWFwLmNvbnRhaW5zVmFsdWUoZmlsZSkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihjaGFuZ2VkRmlsZXMuaXNFbXB0eSgpICYmIG1vdmVkRmlsZVRvTmV3UGF0aE1hcC5pc0VtcHR5KCkgJiYgZGVsZXRlZEZpbGVzLmlzRW1wdHkoKSAmJiBhZGRlZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQloYW5kbGVDaGFuZ2VkKFJlc291cmNlRGVsdGFWaXNpc3Rvci50aGlzKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgdXBkYXRlIGNvZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJcnVubmFibGUucnVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vbml0b3IoSUZpbGUgZmlsZSkgewotCQlGaWxlSW5mbyBpbmZvPSAoRmlsZUluZm8pIGZGaWxlSW5mb01hcC5nZXQoZmlsZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsKLQkJCWluZm8gPSBuZXcgRmlsZUluZm8oZmlsZSk7Ci0JCQlpbmZvLmZNb2RpZmljYXRpb25TdGFtcCA9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCWZGaWxlSW5mb01hcC5wdXQoZmlsZSwgaW5mbyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5tb25pdG9yKElGaWxlIGZpbGUpIHsKLQkJZkZpbGVJbmZvTWFwLnJlbW92ZShmaWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5tb25pdG9yQWxsKCkgewotCQlmRmlsZUluZm9NYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZChSZXNvdXJjZURlbHRhVmlzaXN0b3IgdmlzaXRvcikgewotCQlpZighdmlzaXRvci5jaGFuZ2VkRmlsZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVDaGFuZ2VkRmlsZXModmlzaXRvci5jaGFuZ2VkRmlsZXMpOwotCQl9Ci0JCWlmKCF2aXNpdG9yLm1vdmVkRmlsZVRvTmV3UGF0aE1hcC5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZU1vdmVkRmlsZXModmlzaXRvci5tb3ZlZEZpbGVUb05ld1BhdGhNYXApOwotCQl9Ci0JCWlmKCF2aXNpdG9yLmRlbGV0ZWRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZURlbGV0ZWRGaWxlcyh2aXNpdG9yLmRlbGV0ZWRGaWxlcyk7Ci0JCX0KLQkJaWYoIXZpc2l0b3IuYWRkZWRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUFkZGVkRmlsZXModmlzaXRvci5hZGRlZEZpbGVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVEZWxldGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gZGVsZXRlZEZpbGVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJRmlsZT4gaGFuZGxlTW92ZWRGaWxlcyhNYXA8SUZpbGUsIElQYXRoPiBtb3ZlZEZpbGVUb05ld1BhdGhNYXApIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVDaGFuZ2VkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gY2hhbmdlZEZpbGVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUZpbGU+IGhhbmRsZUFkZGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gYWRkZWRGaWxlcykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0RlbGVnYXRlRmlsZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FiYmQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRlRmlsZU1hbmFnZXIgaW1wbGVtZW50cyBJRmlsZU1hbmFnZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZyBwYXRoLCBPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRoLCBjb250ZXh0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI2NoZWNrTW9kaWZ5KGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjZGVsZXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShwYXRoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI21vdmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlKFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tb3ZlKG9sZFBhdGgsIG5ld1BhdGgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjcmVuYW1lKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc2MWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBBIGV4dGVuZGVkIHJlc291cmNlIHNldCB3aG9zZSBvYmplY3RzIGNhbiByZWZlcmVuY2VzIG9iamVjdHMgb2Ygb3RoZXIgcmVzb3VyY2Ugc2V0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9VTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9MT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfRVhURVJOQUwgPSAyOwotCQotCXByb3RlY3RlZCBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVmZXJlbmNlZFJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB7QGxpbmsgRXh0ZW5kZWRSZXNvdXJjZVNldH0gdGhhdCBjYW4gaGF2ZSByZWZlcmVuY2UgdG8gb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2Ugc2V0IAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZFJlc291cmNlU2V0KE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZWZlcmVuY2VkUmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWZlcmVuY2VkUmVzb3VyY2VTZXQgPSByZWZlcmVuY2VkUmVzb3VyY2VTZXQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBvbmUgb2YgVVJJIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VSSV9UWVBFX0VYVEVSTkFMfSwge0BsaW5rICNVUklfVFlQRV9MT0NBTH0sIHtAbGluayAjVVJJX1RZUEVfVU5LTk9XTn0KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQlyZXR1cm4gVVJJX1RZUEVfVU5LTk9XTjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXggPSBudWxsOwotCQlpbnQgdXJpVHlwZSA9IGdldFVSSVR5cGUodXJpKTsKLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfTE9DQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZ2V0RU9iamVjdChyZXNvbHZlciwgdXJpLCBsb2FkT25EZW1hbmQpOwotCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlleCA9IGU7Ci0JCQl9Ci0JCQlpZihvYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfRVhURVJOQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gcmVmZXJlbmNlZFJlc291cmNlU2V0LmdldEVPYmplY3QocmVzb2x2ZXIsIHVyaSwKLQkJCQkJCWxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJfSAKLQkJCi0JCWlmKGV4ICE9IG51bGwpIHsKLQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlMjVjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgewotCXByaXZhdGUgVVJJIGZpbmFsVVJJOwotCXByaXZhdGUgVVJJIG9sZFVSSTsKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50VHhJRDsKLQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgVVJJIHRlbXBVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFja3VwRmlsZTsKLQlwcml2YXRlIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbW1pdEVtcHR5UmVzb3VyY2U7Ci0JCi0JcHVibGljIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBpZCkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuY29udmVydGVyID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsID8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbW1pdEVtcHR5UmVzb3VyY2UoYm9vbGVhbiBjb21taXRFbXB0eVJlc291cmNlKSB7Ci0JCXRoaXMuY29tbWl0RW1wdHlSZXNvdXJjZSA9IGNvbW1pdEVtcHR5UmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcG9yYXJ5IFVSSSB0byBzYXZlIHRoaXMgcmVzb3VyY2UgdG8gYW5kIGl0IHdpbGwgYmUgcmVuYW1lZCB0bwotCSAqIHRoZSBvcmlnaW5hbCBVUkkgd2hlbiBzYXZpbmcgaXMgZG9uZQotCSAqLwotCXB1YmxpYyBVUkkgc2V0VGVtcFVSSShTdHJpbmcgdHhJRCkgewotCQlpZiAoZmluYWxVUkkgPT0gbnVsbCkgewotCQkJZmluYWxVUkkgPSBvbGRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWN1cnJlbnRUeElEID0gdHhJRDsKLQotCQkJdGVtcFVSSSA9IGNyZWF0ZVRlbXBVUkkoKTsKLQkJCXJlc291cmNlLnNldFVSSSh0ZW1wVVJJKTsKLQkJfQotCQlyZXR1cm4gdGVtcFVSSTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkkgY3JlYXRlVGVtcFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkuYXBwZW5kKAotCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgibmV3IikuYXBwZW5kKGlkKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhY2t1cEZpbGVQYXRoKCkgewotCQlTdHJpbmcgYmFja3VwRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkKLQkJCQkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgib2xkIikuYXBwZW5kKGlkKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBiYWNrdXBGaWxlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHVyaSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCAmJiAoY29tbWl0RW1wdHlSZXNvdXJjZSB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpKSB7Ci0JCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhmaW5hbFVSSSkpOwotCQkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gYmFjayB1cCB0aGUgZmlsZQotCQkJCS8vCi0JCQkJU3RyaW5nIGJhY2t1cCA9IGdldEJhY2t1cEZpbGVQYXRoKCk7Ci0JCQkJRmlsZSBiYWtGaWxlID0gbmV3IEZpbGUoYmFja3VwKTsKLQotCQkJCS8vIHRyeWluZyB0byBkZWxldGUgdGhlIG9sZCBiYWNrdXAgZmlsZSBpZiBpdCBleGlzdHMKLQkJCQkvLwotCQkJCWlmIChiYWtGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWJha0ZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZAotCQkJCQkvLyBmaWxlIGl0IGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkJLy8KLQkJCQkJaWYgKEZpbGVVdGlsLm1vdmVGaWxlKGZpbmFsRmlsZSwgYmFrRmlsZSkpIHsKLQkJCQkJCWJhY2t1cEZpbGUgPSBiYWNrdXA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCQkJZmluYWxGaWxlLCBiYWNrdXApOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbmFtZSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgb3JpZ2luYWwgbmFtZQotCQkJLy8KLQkJCUZpbGUgY3VycmVudEZpbGUgPSBuZXcgRmlsZSh3YXNNb3ZlID8gdG9GaWxlU3RyaW5nKG9sZFVSSSkKLQkJCQkJOiB0b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZShyZXNvdXJjZSwgY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkIGZpbGUgaXQKLQkJCQkvLyBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCS8vCi0JCQkJc3VjY2VzcyA9IEZpbGVVdGlsLm1vdmVGaWxlKGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCWN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2FzTW92ZSkgewotCQkJCQlkaWRNb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgdG8gb3ZlcnJpZGUgdG8gaGFuZGxlIHBvc3QgbW92ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpZE1vdmUoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQlpZiAoYmFja3VwRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlKGJhY2t1cEZpbGUpOwotCQkJCW5ldyBGaWxlKGJhY2t1cEZpbGUpLmRlbGV0ZSgpOwotCQkJCWJhY2t1cEZpbGUgPSBudWxsOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQlpZiAoY3VycmVudFR4SUQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBVUkkoKS5lcXVhbHMocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldEZpbmFsVVJJKCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbmFsVVJJOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZS5nZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQlGaWxlIHNyYyA9IG51bGwsIGRlc3QgPSBudWxsOwotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCWlmIChiYWNrdXBGaWxlICE9IG51bGwpIHsKLQkJCXNyYyA9IG5ldyBGaWxlKGJhY2t1cEZpbGUpOwotCQkJZGVzdCA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb3ZlZCA9IG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmIChtb3ZlZCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSk7Ci0JCQkJZGVzdCA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhvbGRVUkkpKTsKLQkJCQltb3ZlZCA9IGZpbGUuZXhpc3RzKCkgJiYgIWRlc3QuZXhpc3RzKCk7Ci0JCQkJaWYgKG1vdmVkKSB7Ci0JCQkJCXNyYyA9IGZpbGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShkZXN0LG5ldyBGaWxlKHRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSkpKTsKLQkJCX0KLQkJCWJvb2xlYW4gc3VjY2VzczsKLQkJCWlmIChtb3ZlZCkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHJlc291cmNlLCBzcmMsIGRlc3QpOwotCQkJCS8vIGlmKHN1Y2Nlc3MpIHsKLQkJCQkvLyBNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBudWxsKTsKLQkJCQkvLyB9Ci0JCQl9IGVsc2UgewotCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShzcmMsZGVzdCk7Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2csIHRoaXMpKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotLy8JCWJvb2xlYW4gd2FzTW92ZSA9ICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJaWYgKHN1Y2Nlc3NmdWwpIHsKLQkJCXJlc291cmNlLnNldFVSSShmaW5hbFVSSSk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0vLwkJCXVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0vLwkJCWlmKCF3YXNNb3ZlKSB7Ci0vLwkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotLy8JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotLy8JCQkJCXJlc291cmNlU2V0LmdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKS52YWxpZGF0ZU1hcmtlcnModGhpcyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3RvcmVVUkkoKTsKLS8vCQkJaWYgKHdhc01vdmUpIHsKLS8vCQkJCS8vIHJlc3RvcmUgdXJpIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzIHJlc291cmNlCi0vLwkJCQkvLwotLy8JCQkJTXVsdGlGaWxlU2F2ZVV0aWwudXBkYXRlVVJJTWFwcGluZ3ModGhpcywgb2xkVVJJLCBudWxsLCB0cnVlKTsKLS8vCQkJfQotCQl9Ci0vLwkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0vLwkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0vLwkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0vLwkJCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLS8vCQkJfQotLy8JCQlvbGRVUkkgPSBudWxsOwotLy8JCX0KLQkJY3VycmVudFR4SUQgPSBudWxsOwotCQlmaW5hbFVSSSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJlc291cmNlIFVSSSB0byB0aGUgb3JpZ2luYWwgb25lLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGwKLQkgKiBhZnRlciBzYXZpbmcgcmVnYXJsZXNzIG9mIGl0cyBzdWNjZXNzLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlVVJJKCkgewotCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLQkJCXJlc291cmNlLnNldFVSSShvbGRVUkkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzRiN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnV0aWxzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb247Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIElGaWxlTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVNYW5hZ2VyIGltcGxlbWVudHMgSUZpbGVNYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEZpbGVNYW5hZ2VyLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIEZpbGVNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0bXBkaXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZW1wRGlyKCkgewotCQlpZiAodG1wZGlyID09IG51bGwpIHsKLQkJCUdldFByb3BlcnR5QWN0aW9uIGEgPSBuZXcgR2V0UHJvcGVydHlBY3Rpb24oImphdmEuaW8udG1wZGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRtcGRpciA9ICgoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhKSk7Ci0JCX0KLQkJcmV0dXJuIHRtcGRpcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVFZGl0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEZpbGVNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgRmlsZU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGVNYW5hZ2VyKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlRm9yTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJSVJlc291cmNlIHJlc291cmNlOwotCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlCi0JCQkJCQkuZ2V0UGFyZW50KCkpOwotCQkJCWlmIChwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJlbnRSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKHBhdGgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmVzaChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJQXJyYXlMaXN0IGZvbGRlcnNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQkJCWZvciAoY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7ICFjb250YWluZXIuZXhpc3RzKCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCQkuZ2V0UGFyZW50KCkpIHsKLQkJCQlmb2xkZXJzVG9SZWZyZXNoLmFkZCgwLCBjb250YWluZXIpOwotCQkJfQotCQkJaWYgKGNvbnRhaW5lci5leGlzdHMoKSkgewotCQkJCWNvbnRhaW5lci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAoIWZvbGRlcnNUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZm9sZGVyc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGZvbGRlci5leGlzdHMoKSkgewotCQkJCQkJZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyBmaWxlIG9yIGRpcmVjdG9yeSB3aXRoIGdpdmVuIGxvY2FsIGZpbGUgc3lzdGVtCi0JICogPGNvZGU+cGF0aDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgbG9jYWwgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlZnJlc2goU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiByZWZyZXNoKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaChSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlZnJlc2godG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZShTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpIHsKLQkJcmV0dXJuIG1vdmUob2xkUGF0aCwgbmV3UGF0aCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVNvdXJjZSkgewotCQl0cnkgewotCQkJcmVmcmVzaChvbGRQYXRoKTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJLmdldFJvb3QoKTsKLQotCQkJLy8gY3JlYXRlIHRoZSBmb2xkZXJzIG9mIHRoZSBkZXN0aW5hdGlvbiBpZiB0aGV5IGRpZCBub3QgZXhpc3QKLQkJCUlQYXRoIGRlc3RQYXRoID0gbmV3IFBhdGgobmV3UGF0aCk7Ci0JCQlpZiAobmV3IEZpbGUob2xkUGF0aCkuaXNGaWxlKCkpIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihkZXN0UGF0aCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsJCQkJCi0JCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24oZGVzdFBhdGgpOwotCQkJCX0KLQkJCX0JCi0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCWlmKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVFcnJvcl9tc2csIG9sZFBhdGgsIG5ld1BhdGgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlBcnJheUxpc3QgZm9sZGVyc1RvQ3JlYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlDb250YWluZXIgY29udGFpbmVyOwotCQkJCWZvciAoY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7ICFjb250YWluZXIuZXhpc3RzKCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5nZXRQYXJlbnQoKSkgewotCQkJCQlmb2xkZXJzVG9DcmVhdGUuYWRkKDAsIGNvbnRhaW5lcik7Ci0JCQkJfQotCQkJCWlmICghZm9sZGVyc1RvQ3JlYXRlLmlzRW1wdHkoKSkgewotCQkJCQljb250YWluZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmb2xkZXJzVG9DcmVhdGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlkZXN0UGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIGlmKFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihkZXN0UGF0aCkpIHsKLQkJCQlkZXN0UGF0aCA9IG5ldyBQYXRoKGRlc3RQYXRoLnRvT1NTdHJpbmcoKS5zdWJzdHJpbmcoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkubGVuZ3RoKCkpKTsJCQkJCQkKLQkJCX0KLQkJCQotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG9sZFBhdGgpOwotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQl9Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlLm1vdmUoZGVzdFBhdGgsIHRydWUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQkJCi0JCQkJCWlmIChmb3JjZVJlbW92ZVNvdXJjZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCi0JCQkJCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0KLQkJCQkJLy8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIEVjbGlwc2UgbW92ZXMgZmlsZS9kaXJlY3RvcnkgYnkKLQkJCQkJLy8gY29weWluZyBpdCB0byBkZXN0aW5hdGlvbiB0aGVuIGRlbGV0aW5nIHRoZSBzb3VyY2UKLQkJCQkJLy8gYnV0IGRlbGV0aW9uIGZhaWxlZAotCQkJCQlJU3RhdHVzW10gc3RhdHVzZXMgPSBlLmdldFN0YXR1cygpLmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc3RhdHVzZXNbaV07Ci0JCQkJCQlpZiAoc3RhdHVzLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX0RFTEVURV9MT0NBTAotCQkJCQkJCQkmJiBzdGF0dXMuZ2V0TWVzc2FnZSgpID09IE1lc3NhZ2VzLmxvY2Fsc3RvcmVfZGVsZXRlUHJvYmxlbSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkiV2FybmluZyB3aGlsZSBtb3ZpbmcgJyd7MH0nJyB0byAnJ3sxfScnOiB7Mn0iLCBuZXcgT2JqZWN0W10geyBvbGRQYXRoLCBuZXdQYXRoLCBzdGF0dXMuZ2V0TWVzc2FnZSgpIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcobXNnKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmFpbGVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZmFpbGVkIHx8ICFuZXcgRmlsZShuZXdQYXRoKS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gbW92ZShvbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBubyBuZWVkIHRvIHJlZnJlc2ggdGhlIHdob2xlIHRyZWUgZnJvbSBzcGVjaWZpZWQgcGF0aAotCQkvLyBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKCkgcmVmcmVzaGVzIHJlc291cmNlIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5Ci0JCS8vCi0JCS8vIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPQotCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkvLyB0cnkgewotCQkvLyB3b3Jrc3BhY2VSb290LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkvLyB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCS8vIGUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkvLyB9Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZShTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJZGVsZXRlUmVzb3VyY2UocGF0aCwgbnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmcm9tQ0MoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gc3RhdHVzLmdldFBsdWdpbigpOwotCQlyZXR1cm4gcGx1Z2luSWQgIT0gbnVsbAotCQkJCSYmIHBsdWdpbklkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiY2xlYXJjYXNlIikgIT0gLTE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVtwYXRocy5sZW5ndGhdOwotCQlBcnJheUxpc3Q8U3RyaW5nPiBub3RGb3VuZEZpbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoID0gcGF0aHNbaV07Ci0JCQl0cnkgewotCQkJCXJlZnJlc2gocGF0aCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCW5vdEZvdW5kRmlsZXMuYWRkKHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlc1tpXSA9IGZpbGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFub3RGb3VuZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgTkxTCi0JCQkJCS5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmZpbGVOb3RGb3VuZEVycm9yX21zZywKLQkJCQkJCQlub3RGb3VuZEZpbGVzKSwgbnVsbCk7Ci0JCX0KLQotCQlpZiAoIXZhbGlkYXRlRWRpdEluaXRpYWxpemVkKSB7Ci0JCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCXZhbGlkYXRlRWRpdEluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJLy8gZG91YmxlLWNoZWNrIGFmdGVyIGluaXRpYWxpemF0aW9uCi0JCQkJLy8KLQkJCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQoZmlsZXMsIGNvbnRleHQpOwotCQl9Ci0KLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCwKLQkJCQkJSVN0YXR1cy5PSywgUGVyc2lzdGVuY2VSZXNvdXJjZXMubW9kaWZ5RmlsZXNFcnJvcl9tc2csCi0JCQkJCW51bGwpOwotCi0JCQkvLyBzb21lIHZlcnNpb24gY29udHJvbCBwcm92aWRlciBzdGlsbCByZXR1cm5zIE9LIHN0YXR1cyBldmVuIHRob3VnaAotCQkJLy8gdXNlciBjYW5jZWxsZWQgdGhlIGNoZWNrIG91dAotCQkJLy8gZG91YmxlLWNoZWNrIGhlcmUgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIG5vdCByZWFkLW9ubHkKLQkJCS8vCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCVN0cmluZyBsb2NhbFBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5LAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGxvY2FsUGF0aCB9KTsKLQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBSZXNvdXJjZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBmaWxlCi0JCQkJCQkJLmdldEZ1bGxQYXRoKCksIG1zZywgbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmKCFtdWx0aVN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBoYWNrIGZvciBjbGVhcmNhc2UKLQkJCWlmIChmcm9tQ0Moc3RhdHVzKSkgewotCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlc0Vycm9yX21zZzsKLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsIHN0YXR1cwotCQkJCQkJLmdldENvZGUoKSwgbXNnLCBudWxsKTsKLQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb252ZXJ0IHdvcmtzcGFjZSBwYXRoIHRvIGxvY2FsIGZpbGUgc3lzdGVtIHBhdGgKLQkJaWYgKHN0YXR1cyBpbnN0YW5jZW9mIE11bHRpU3RhdHVzKSB7Ci0JCQlNdWx0aVN0YXR1cyBtcyA9IChNdWx0aVN0YXR1cykgc3RhdHVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtcy5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IG1zLmdldENoaWxkcmVuKClbaV07Ci0JCQkJbXMuZ2V0Q2hpbGRyZW4oKVtpXSA9IHRvU3RhdHVzV2l0aExvY2FsUGF0aChjaGlsZFN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdGF0dXMgPSB0b1N0YXR1c1dpdGhMb2NhbFBhdGgoc3RhdHVzKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgdG9TdGF0dXNXaXRoTG9jYWxQYXRoKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgaW5zdGFuY2VvZiBJUmVzb3VyY2VTdGF0dXMKLQkJCQkmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5SRUFEX09OTFlfTE9DQUwpIHsKLQkJCUlSZXNvdXJjZVN0YXR1cyByZXNvdXJjZVN0YXR1cyA9ICgoSVJlc291cmNlU3RhdHVzKSBzdGF0dXMpOwotCQkJSVBhdGggcGF0aCA9IHJlc291cmNlU3RhdHVzLmdldFBhdGgoKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0JCQkJCS5nZXRGaWxlKHBhdGgpOwotCQkJU3RyaW5nIGxvY2FsUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLkZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seSwKLQkJCQkJbmV3IE9iamVjdFtdIHsgbG9jYWxQYXRoIH0pOyAKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VTdGF0dXMoc3RhdHVzCi0JCQkJCS5nZXRTZXZlcml0eSgpLCBzdGF0dXMuZ2V0Q29kZSgpLAotCQkJCQlyZXNvdXJjZVN0YXR1cy5nZXRQYXRoKCksIG1zZywgc3RhdHVzCi0JCQkJCQkJLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmcgcGF0aCwgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNoZWNrTW9kaWZ5KG5ldyBTdHJpbmdbXSB7IHBhdGggfSwgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXRoIGlzIHRlYW0tcHJpdmF0ZSBmaWxlIG9yIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVhbVByaXZhdGUoU3RyaW5nIHBhdGgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpOwotCX0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBVUkksIHVzaW5nIGEgVVJJIGNvbnZlcnRlcgotICAgICAqIGlmIG5lY2Vzc2FyeSAoYW5kIHByb3ZpZGVkKSB0byBub3JtYWxpemUgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSBhIFVSSQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgYW4gb3B0aW9uYWwgVVJJIGNvbnZlcnRlciAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUsIGlmIGF2YWlsYWJsZSBpbiB0aGUgd29ya3NwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFVSSSB1cmksIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICAgICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICgicGxhdGZvcm0iLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmICh1cmkuc2VnbWVudENvdW50KCkgPiAyKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoInJlc291cmNlIi5lcXVhbHModXJpLnNlZ21lbnQoMCkpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodXJpLmlzRmlsZSgpICYmICF1cmkuaXNSZWxhdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLSAgICAgICAgICAgICAgICBuZXcgUGF0aCh1cmkudG9GaWxlU3RyaW5nKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgdG8gc2VlIHdoZXRoZXIgbWF5IHdlIGNhbiByZXNvbHZlIGl0IHRoaXMgdGltZQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVVJJIG5vcm1hbGl6ZWQgPSBjb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCF1cmkuZXF1YWxzKG5vcm1hbGl6ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gdGhlIG5ldyBVUkkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0RmlsZShub3JtYWxpemVkLCBjb252ZXJ0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSwgVVJJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUodXJpLCBjb252ZXJ0ZXIpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhVUkkgdXJpKSB7Ci0JCXJldHVybiB0b0ZpbGVTdHJpbmcodXJpLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyBpbXBsZW1lbnRzIElGaWxlSW5mbyB7Ci0JCQotCQlwcml2YXRlIElGaWxlIGZpbGU7Ci0KLQkJcHJpdmF0ZSBGaWxlSW5mbyhJRmlsZSBmaWxlKSB7Ci0JCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl9Ci0KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCQlyZXR1cm4gZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCX0KLQotCQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQkJSVBhdGggbG9jID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQkJcmV0dXJuIGxvYyAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpIDogbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIElGaWxlSW5mbyBnZXRGaWxlSW5mbyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gbmV3IEZpbGVJbmZvKGZpbGUpIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVQYXRoUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRlZmRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogRmlsZS1iYXNlZCBVUkkgcHJvdmlkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVQYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJVVJJUHJvdmlkZXIgewotCXByb3RlY3RlZCBGaWxlUGF0aFByb3ZpZGVyKCkgewotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuSVVSSVByb3ZpZGVyI2dldFVSSShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSShFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuY3JlYXRlRmlsZVVSSSgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSUZpbGVJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lGaWxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDkwNjEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSUZpbGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlSW5mbyB7Ci0JRmlsZSBnZXRGaWxlKCk7Ci0JCi0JbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQotCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lVUklQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmVjZjVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIFVSSSBmb3IgYW4gRU9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJUHJvdmlkZXIgewotCQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZiB0aGlzIG9iamVjdCBoYXMgb3Igc2hvdWxkIGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiB0aGUgVVJJIG9yIG51bGwgaWYgdGhlIGdpdmVuIG9iamVjdCBkb2VzL3dpbGwgbm90IGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKi8KLQlVUkkgZ2V0VVJJKEVPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjc5ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEZpbGUtYmFzZWQgaW1wbGVtZW50YXRpb24gZm9yIElNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9sZGVySW5mbyB7Ci0KLQkJRUNsYXNzIGVDbGF6ejsKLQotCQlib29sZWFuIHNoYXJlZDsKLQotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gY2xhenoKLQkJICogQHBhcmFtIHNoYXJlZAotCQkgKi8KLQkJcHVibGljIEZvbGRlckluZm8oRUNsYXNzIGNsYXp6LCBib29sZWFuIHNoYXJlZCkgewotCQkJc3VwZXIoKTsKLQkJCWVDbGF6eiA9IGNsYXp6OwotCQkJdGhpcy5zaGFyZWQgPSBzaGFyZWQ7Ci0JCQl0aGlzLm5hbWUgPSBsb3dlckFuZFBsdXJhbGl6ZShjbGF6ei5nZXROYW1lKCkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgSU5TVEFOQ0UgPSBuZXcgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpOwotCi0JLy8gbmVlZCB0byBleHBvc2UgdGhpcywganhpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSID0gInJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgZm9sZGVySW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlzdGF0aWMgewotCQlmb2xkZXJJbmZvcy5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSwKLQkJCQlmYWxzZSkpOwotCQlmb2xkZXJJbmZvcy5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQl0cnVlKSk7Ci0JCWZvbGRlckluZm9zCi0JCQkJLmFkZChuZXcgRm9sZGVySW5mbyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLCB0cnVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Qgd2FybmluZ3M7Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IHBhdGggKHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4pIG9mIHRoZSBmaWxlIG9mIHRoZQotCSAqIGdpdmVuIGNvbnRlbnQgZGVzY3JpcHRpb24gb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gY29udGVudCBkb2VzIG5vdCBiZSBsb25nCi0JICogdG8gYW55IHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb3JyZWN0UGF0aChDb250ZW50RGVzY3JpcHRpb24gY29udGVudCkgewotCQlyZXR1cm4gZ2V0Q29ycmVjdFBhdGgoKERlc2NyaWJhYmxlRWxlbWVudCkgY29udGVudC5lQ29udGFpbmVyKCksCi0JCQkJY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvcnJlY3RQYXRoKERlc2NyaWJhYmxlRWxlbWVudCBlLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBwbHVnaW4uZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNvdXJjZSk7Ci0JCUZpbGUgcGx1Z2luRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gc3RhdGljR2V0Rm9sZGVyUGF0aChlLmVDbGFzcygpKTsKLQkJU3RyaW5nIGRpciA9IG5ldyBTdHJpbmdCdWZmZXIocGx1Z2luRGlyLmdldEFic29sdXRlUGF0aCgpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChmb2xkZXJQYXRoKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJLnRvU3RyaW5nKCk7Ci0KLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUsIGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgbmV4dCBhdmFpbGFibGUgZmlsZSBuYW1lIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIE11bHRpUmVzb3VyY2VFT2JqZWN0fSBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IDxjb2RlPmRpcjwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgcGF0aCB0aGF0IG11c3QgaGF2ZSBhIGZpbGUgc2VwYXJhdG9yIGF0IHRoZSBlbmQKLQkgKiBAcGFyYW0gcmVxdWVzdGVkTmFtZQotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLCBTdHJpbmcgcmVxdWVzdGVkTmFtZSwKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IGUpIHsKLQkJU3RyaW5nIGN1cnJlbnRGaWxlbmFtZSA9IG51bGw7Ci0JCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy8ga2VlcCBleGlzdGluZyBmaWxlIG5hbWUgZHVyaW5nIG1vdmUgaWYgaXQgaXMgbm90IHRha2VuIHlldC4gRG9uJ3QKLQkJCS8vIHRyeSB0byBtYXRjaCB0aGUgZWxlbWVudCdzIG5hbWUKLQkJCS8vCi0JCQlTdHJpbmcgcGF0aCA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlLmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQljdXJyZW50RmlsZW5hbWUgPSBjdXJyZW50RmlsZS5nZXROYW1lKCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGN1cnJlbnRGaWxlbmFtZSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvLyB0aGUgZWxlbWVudCBpcyBiZWluZyBtb3ZlZAotCQkJCS8vCi0JCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBlbGVtZW50IHdpdGhvdXQgYSByZXNvdXJjZSBvciBwYXRoIGlzIGFscmVhZHkgdGFrZW4KLQkJLy8KLQkJU3RyaW5nIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKS50b1N0cmluZygpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYoZmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQlpZiAoKGN1cnJlbnRGaWxlbmFtZSAhPSBudWxsICYmIGN1cnJlbnRGaWxlbmFtZS5lcXVhbHMocmVxdWVzdGVkTmFtZSkpCi0JCQkJfHwgZmlsZS5leGlzdHMoKSkgewotCQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJCXBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgnICcpCi0JCQkJCQkuYXBwZW5kKGkpLmFwcGVuZCgKLQkJCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTikKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmICghbmV3IEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIChEZXNjcmliYWJsZUVsZW1lbnQpIGNvbnRlbnQKLQkJCQkuZUNvbnRhaW5lcigpLCBjb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKFN0cmluZyBkaXIsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUuZ2V0TmFtZSgpLAotCQkJCShNdWx0aVJlc291cmNlRU9iamVjdCkgY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRpY0dldEZvbGRlclBhdGgoRUNsYXNzIGVDbGF6eikgewotCQlpbnQgc2l6ZSA9IGZvbGRlckluZm9zLnNpemUoKTsKLQkJRm9sZGVySW5mbyBpbmZvID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUZvbGRlckluZm8gZm9sZGVySW5mbyA9IChGb2xkZXJJbmZvKSBmb2xkZXJJbmZvcy5nZXQoaSk7Ci0JCQlpZiAoZm9sZGVySW5mby5lQ2xhenouaXNTdXBlclR5cGVPZihlQ2xhenopKSB7Ci0JCQkJaW5mbyA9IGZvbGRlckluZm87Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uZUNsYXp6ID09IGVDbGF6eiB8fCBpbmZvLnNoYXJlZCkgewotCQkJCXJldHVybiBpbmZvLm5hbWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKGluZm8ubmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikKLQkJCQkJCS5hcHBlbmQobG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb3dlckFuZFBsdXJhbGl6ZShTdHJpbmcgbmFtZSkgewotCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQlpZiAobmFtZS5lbmRzV2l0aCgiY2hpbGRyZW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJjaGlsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lICsgInJlbiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJkYXRhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiZGF0dW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImEiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiYnkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoInkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpICsgImllcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMikgKyAiaWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJ4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWUgKyAiZXMiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgidXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImkiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgic3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmlydHVhbCBwYXRoIHRvIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldEVsZW1lbnRWaXJ0dWFsUGF0aChNZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VSZXNvdXJjZVZpcnR1YWxQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEVsZW1lbnRWaXJ0dWFsUGF0aChlKTsKLQkJaWYgKGZvbGRlclBhdGggPT0gbnVsbCB8fCBmb2xkZXJQYXRoLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXJldHVybiBSRVNPVVJDRV9GT0xERVI7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmb2xkZXJQYXRoKTsKLQkJCWlmICggIWZvbGRlclBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgewotCQkJCWJ1ZmZlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQkJfSAKLQkJCQotCQkJYnVmZmVyLmFwcGVuZChSRVNPVVJDRV9GT0xERVIpOwkJCQkKLQkJCQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmlydHVhbCBwYXRoIHRvIHRoZSBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LiBUaGlzIHBhdGggd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCSAqIDxwbHVnaW5fbmFtZT5cZm9sZGVyX3JlbGF0aXZlX3BhdGhcCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFZpcnR1YWxQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gfHwgZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQkJLy8gZXJyb3I6IHBsdWdpbiBlbGVtZW50IHdpdGhvdXQgYSB2YWxpZCBwbHVnaW4gc2V0LiBUaGlzCi0JCQkJLy8gcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4KLQkJCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUsCi0JCQkJLy8gZm9yIGV4YW1wbGUsIHdoZW4gbGljayBvbiBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbgotCQkJCS8vIENvbmZpZ3VyYXRpb24gRXhwbG9yZXIKLQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkucHJpbnRsbigiZXJyb3IgaW4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aCgpOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luLiBUaGlzIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQlyZXR1cm4gKGZvbGRlclBhdGgubGVuZ3RoKCkgPT0gMCA/IHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciA6IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJcGx1Z2luTmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKGZvbGRlclBhdGgpCi0JCQkJLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QgZGlyZWN0b3J5IHRvIHRoZQotCSAqIGZvbGRlciBvZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCQotCXByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlRWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiB8fCBlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCQlyZXR1cm4gZm9sZGVyUGF0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVycm9yOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luIHNldC4gVGhpcwotCQkJCS8vIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuCi0JCQkJLy8gc3RpbGwgc2VlIGl0IGZyb20gdGltZSB0byB0aW1lLAotCQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGxpY2sgb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4KLQkJCQkvLyBDb25maWd1cmF0aW9uIEV4cGxvcmVyCi0JCQkJU3lzdGVtLmVycgotCQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIGVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIHBsdWdpbi4gVGhpcyBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAocGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBlcnJvcjogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZQotCQkJLy8gZml4ZWQuCi0JCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgcmVsUGx1Z2luUGF0aDsKLQkJaWYgKHBsdWdpbi5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSBsaWJSZXMgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkocGx1Z2luKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChsaWJSZXMgPT0gcGx1Z2luLmVSZXNvdXJjZSgpKSB7Ci0JCQkJLy8gdGhlIHBsdWdpbiBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShwbHVnaW4uZVJlc291cmNlKCkpOwotCQkJCVVSSSBsaWJVcmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShsaWJSZXMpOwotCQkJCVVSSSByZWxVcmkgPSB1cmkuZGVyZXNvbHZlKGxpYlVyaSk7Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHJlbFVyaS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgbGlicmFyeSBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQlyZWxQbHVnaW5QYXRoID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiAoZm9sZGVyUGF0aC5sZW5ndGgoKSA9PSAwID8gcmVsUGx1Z2luUGF0aCArIEZpbGUuc2VwYXJhdG9yOiBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCXJlbFBsdWdpblBhdGgpLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLmFwcGVuZChmb2xkZXJQYXRoKQotCQkJCS5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUVDbGFzcyBlQ2xzID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVDbHMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIHNhdmUgYWxsIHRoZSByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlU2V0LnNhdmUoKFJlc291cmNlKSBpdGVyLm5leHQoKSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZXMoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcGF0aCwKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCWlmIChuZXcgRmlsZShwYXRoKS5pc0RpcmVjdG9yeSgpICYmICFlLmVJc1Byb3h5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChtZSAhPSBudWxsICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShtZSwgZSkpIHsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZVJlc291cmNlKHBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCWlmICghVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQkvLyBEb24ndCBkZWxldGUgdGhpcyByZXNvdXJjZSdzIGZpbGUgaWYgaXQgc3RpbGwgY29udGFpbnMgb3RoZXIKLQkJLy8gTWV0aG9kRWxlbWVudAotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBlbGVtZW50ICE9IGUpIHsKLQkJCQlyZXNvdXJjZVNldC5yZW1vdmVVUklNYXBwaW5ncyhlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZSk7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgcGF0aDsKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLmhhc093bkZvbGRlcihlKSkgewotCQkJLy8gcGF0aCBpcyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBNZXRob2RQbHVnaW4vUHJvY2Vzc0NvbXBvbmVudAotCQkJLy8KLQkJCXBhdGggPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQotCQkJLy8gdW5sb2FkL3JlbW92ZSBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBmb2xkZXIKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIHVubG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZG8gewotCQkJCXVubG9hZGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQkJLy8gY29sbGVjdCBhbGwgcmVzb3VyY2VzIHdob3NlIHJvb3QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgdGhlCi0JCQkJLy8gZ2l2ZW4gZWxlbWVudAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJCQlpZiAobWUgIT0gbnVsbCAmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkobWUsIGUpKSB7Ci0JCQkJCQkJdW5sb2FkZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdW5sb2FkZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCX0KLQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwodW5sb2FkZWRSZXNvdXJjZXMpOwotCQkJfSB3aGlsZSAoIXVubG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXRoID0gcmVzb3VyY2UuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXNvdXJjZVNldC5jbGVhblVwKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlMSk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCWRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0T2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMoRU9iamVjdCBlLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcykgewotCQlpZiAoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJb2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMuYWRkKGUpOwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcygoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJLy8gY29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkaXJlY3QgcmVzb3VyY2VzIHRoYXQgYXJlIHRoZSBnaXZlbiBlbGVtZW50Ci0JCS8vIG9yIGl0cyBvZmZzdHJpbmcKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyhlLCBlbGVtZW50cyk7Ci0JCWRlbGV0ZUFuZFNhdmUoZWxlbWVudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVBbmRTYXZlKEFycmF5TGlzdCBlbGVtZW50cykgewotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWRlbGV0ZSgoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmb2xkZXIgdGhhdCBjYW4gc3RvcmUgdGhlIGNvbnRlbnQgb2YgdGhlCi0JICogZ2l2ZW4gTWV0aG9kRWxlbWVudC4gVGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gaXRzIHBsdWdpbiBmb2xkZXIgb3IgbGlicmFyeQotCSAqIGZvbGRlciBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgc3RvcmVkIGluIGEgcGx1Z2luLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBzdGF0aWNHZXRGb2xkZXJQYXRoKGUuZUNsYXNzKCkpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUU7Ci0JCX0KLQotCQlNZXRob2RVbml0IHVuaXQgPSBVbWFVdGlsLmdldE1ldGhvZFVuaXQoZSk7Ci0KLQkJaWYgKHVuaXQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHVuaXQpLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuQ0FQQUJJTElUWV9QQVRURVJOX1BBVEg7Ci0JCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfQotCQl9IGVsc2UgaWYgKHVuaXQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoKE1ldGhvZEVsZW1lbnQpIHVuaXQKLQkJCQkJLmVDb250YWluZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIHN0YXRpY0dldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCWlmICh3YXJuaW5ncyA9PSBudWxsKSB7Ci0JCQl3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gd2FybmluZ3M7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVyIGV4dGVuZHMgTWV0aG9kTGlicmFyeVBlcnNpc3RlciBpbXBsZW1lbnRzCi0JCQlGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgewotCi0JCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zOwotCi0JCXByaXZhdGUgVHhSZWNvcmQgdHhSZWNvcmQgPSBuZXcgVHhSZWNvcmQoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5UeFJlY29yZCNjbGVhcigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJCWlmICh3YXJuaW5ncyAhPSBudWxsICYmICF3YXJuaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gY29weSB0aGUgd2FybmluZyB0byBwZXJzaXN0ZXIKLQkJCQkJLy8KLQkJCQkJRmFpbFNhZmVQZXJzaXN0ZXIudGhpcy53YXJuaW5ncyA9IENvbGxlY3Rpb25zCi0JCQkJCQkJLnVubW9kaWZpYWJsZUxpc3Qod2FybmluZ3MpOwotCQkJCX0KLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgTWFwIGVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzOwotCi0JCXB1YmxpYyBGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJCXNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoCi0JCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCQl0eFJlY29yZCA9IG5ldyBUeFJlY29yZCgpOwotCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwgdHhSZWNvcmQpOwotCQkJZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJCWlmICh0eFJlY29yZC5nZXRUeElEKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBlci5nZXRXYXJuaW5ncygpOwotCQkJfQotCQkJcmV0dXJuIHR4UmVjb3JkLmdldFdhcm5pbmdzKCk7Ci0JCX0KLQotCQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQkJcmV0dXJuIHNhdmVPcHRpb25zOwotCQl9Ci0KLQkJdm9pZCBjaGVja01vdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCS8vIGRpc2FsbG93IG5ldyBvcGVyYXRpb24gb24gcmVzb3VyY2Ugd2hpY2ggaGFzIHN0YXJ0ZWQgb3BlcmF0aW9uCi0JCQkvLyB0aGF0IGlzIG5vdCBjb21taXR0ZWQKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0JCQlpZiAobWZSZXNvdXJjZS50eFN0YXJ0ZWQoKSkgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVSZXNvdXJjZUVycm9yX21zZywgcmVzb3VyY2UpKTsKLQkJCX0JCQkKLQkJfQkJCQkKLQkJCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCAmJgotCQkJCQlyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHVwZGF0ZSB2ZXJzaW9uIGluZm8gaW4gbGlicmFyeSByZXNvdXJjZSBpZiBuZWVkZWQKLQkJCQkvLwotCQkJCVJlc291cmNlIGxpYlJlc291cmNlVG9TYXZlID0gbnVsbDsKLQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCWlmKG1lICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkobWUpOwotCQkJCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2UgbGliUmVzb3VyY2UgPSBsaWIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihsaWJSZXNvdXJjZSAhPSBudWxsIAotCQkJCQkJCQkmJiBsaWJSZXNvdXJjZSAhPSByZXNvdXJjZQotCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwuY2hlY2tUb29sVmVyc2lvbihsaWJSZXNvdXJjZSkgIT0gMCkgewotCQkJCQkJCWxpYlJlc291cmNlVG9TYXZlID0gbGliUmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChzYXZlT3B0aW9ucykpIHsKLQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzOwotCQkJCQlpZihsaWJSZXNvdXJjZVRvU2F2ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKGxpYlJlc291cmNlVG9TYXZlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlcyk7Ci0JCQkJCQotCQkJCQkvLyBjaGVjayBvdXQtb2Ytc3luYwotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzLCBzYXZlT3B0aW9ucyk7Ci0JCQkJCQotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja0ZpbGVQYXRoTGVuZ3RoKHJlc291cmNlcyk7Ci0JCQkJfQotCi0JCQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgc2F2ZU9wdGlvbnMpOwotCQkJCWlmKGxpYlJlc291cmNlVG9TYXZlICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VTZXQuc2F2ZShsaWJSZXNvdXJjZVRvU2F2ZSwgc2F2ZU9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmFpbFNhZmVTYXZhYmxlKSB7Ci0JCQkJSUZhaWxTYWZlU2F2YWJsZSBmYWlsU2FmZVNhdmFibGUgPSAoSUZhaWxTYWZlU2F2YWJsZSkgcmVzb3VyY2U7Ci0JCQkJZmFpbFNhZmVTYXZhYmxlLnNldFR4SUQodHhSZWNvcmQuZ2V0VHhJRCgpKTsKLQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKLQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbigiUmVzb3VyY2UgbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuSUZhaWxTYWZlU2F2YWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjYWRqdXN0TG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWNoZWNrTW92ZShyZXNvdXJjZSk7Ci0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLnByZXBhcmVBZGp1c3RMb2NhdGlvbigKLQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCXR4UmVjb3JkLmdldFJlc291cmNlc1RvQ29tbWl0KCkuYWRkKHJlc291cmNlKTsKLQkJCQkKLQkJCQlIYXNoU2V0IHJlc291cmNlc1RvQ2hlY2sgPSBuZXcgSGFzaFNldChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2VzVG9DaGVjay5hZGRBbGwocmVzb3VyY2VzVG9DaGVjayk7Ci0JCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tNb2RpZnkocmVzb3VyY2VzVG9DaGVjayk7Ci0JCQkJCi0JCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsJCQotCQkJCQkKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tPdXRPZlN5bmNoKG1vZGlmaWVkUmVzb3VyY2VzLCBzYXZlT3B0aW9ucyk7Ci0KLQkJCQkJLy8gc2F2ZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb21taXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWNoZWNrTW92ZSgoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUhhc2hTZXQgcmVzb3VyY2VzVG9DaGVjayA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwucHJlcGFyZUFkanVzdExvY2F0aW9uKAotCQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXJlc291cmNlc1RvQ2hlY2suYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJlc291cmNlc1RvQ2hlY2suYWRkQWxsKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCWlmKCFyZXNvdXJjZXNUb0NoZWNrLmlzRW1wdHkoKSkgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlc1RvQ2hlY2spOwotCQkJfQkJCQotCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gobW9kaWZpZWRSZXNvdXJjZXMsIHNhdmVPcHRpb25zKTsKLQotCQkJCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29tbWl0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlRmlsZXMob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCS8vIGtlZXAgdGhlIGluZm8gdG8gcmVhbGx5IGRlbGV0ZSB0aGUgZmlsZXMgaW4gY29tbWl0KCkKLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLnB1dChlLCBuZXcgT2JqZWN0W10geyBwYXRoLAotCQkJCQlyZXNvdXJjZVNldCB9KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzdXBlckRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCXN1cGVyLmRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjY29tbWl0KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLQkJCS8vIHNhdmUgaXMgZG9uZQotCQkJLy8gY2FsbCBzYXZlSXNEb25lKCkgb24gZXZlcnkgc2F2ZWQgZmlsZSB0byByZW5hbWUgaXQgdG8gdGhlIGNvcnJlY3QKLQkJCS8vIG5hbWUKLQkJCWludCBzaXplID0gdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuY29tbWl0KCk7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGRvbmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpCi0JCQkJCQkuZ2V0KGkpKS50eEZpbmlzaGVkKHRydWUpOwotCQkJfQotCi0JCQkvLyBkZWxldGUgYmFja3VwCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuZGVsZXRlQmFja3VwKCk7Ci0JCQl9Ci0KLQkJCXR4UmVjb3JkLmNsZWFyKCk7Ci0KLQkJCS8vIGRlbGV0ZSBmaWxlcyBvZiBkZWxldGVkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0W10gaW5mbyA9IChPYmplY3RbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGluZm9bMF07Ci0JCQkJdHJ5IHsKLQkJCQkJc3VwZXJEZWxldGVGaWxlcygoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0S2V5KCksIHBhdGgsCi0JCQkJCQkJKFJlc291cmNlU2V0KSBpbmZvWzFdKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQkJCWUgPSAoKFdyYXBwZWRFeGNlcHRpb24pIGUpLmV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5FcnJNc2dfQ291bGROb3REZWxldGU7Ci0JCQkJCVN0cmluZyBvdGhlck1zZyA9IG51bGw7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCQkJb3RoZXJNc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJNc2cgPT0gbnVsbCkgewotCQkJCQkJb3RoZXJNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgbmV3IE9iamVjdFtdIHsgcGF0aCwKLQkJCQkJCQlvdGhlck1zZyB9KTsKLQkJCQkJZSA9IG5ldyBFeGNlcHRpb24obXNnLCBlKTsKLQkJCQkJZ2V0V2FybmluZ3MoKS5hZGQoZSk7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLmNsZWFyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJaWYgKCF0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBtYXggPSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLnNpemUoKSAtIDE7Ci0JCQkJCUFycmF5TGlzdCByZXN0b3JlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgcmVzdG9yZSBmcm9tIGJhY2t1cAotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJSUZhaWxTYWZlU2F2YWJsZSByZXNvdXJjZSA9IChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAocmVzb3VyY2UucmVzdG9yZSgpKSB7Ci0JCQkJCQkJcmVzdG9yZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3RvcmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCXJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIHRlbXAgZmlsZXMKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAoKChJRmFpbFNhZmVTYXZhYmxlKXJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCQkJCQkvLyB1cmkga2VlcHMgdGhlIHBhdGggdG8gdGVtcCBmaWxlCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJCQkJCQkJLmRlbGV0ZSgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzCi0JCQkJCS8vIGRvbmUKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQKLQkJCQkJCQkJLmdldFJlc291cmNlc1RvQ29tbWl0KCkuZ2V0KGkpKQotCQkJCQkJCQkudHhGaW5pc2hlZChmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQl0eFJlY29yZC5jbGVhcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkJICovCi0JCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZ2V0Q3VycmVudFR4SUQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDdXJyZW50VHhJRCgpIHsKLQkJCXJldHVybiB0eFJlY29yZC5nZXRUeElEKCk7Ci0JCX0KLQotCX0KLQotCUZhaWxTYWZlUGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKE1hcCBvcHRpb25zKSB7Ci0JCUZhaWxTYWZlUGVyc2lzdGVyIHBlcnNpc3RlciA9IG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0QWxsKG9wdGlvbnMpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGF0IFRYX1JFQ09SRCBzdGlsbCBrZWVwcyB0aGUgY29ycmVjdCB2YWx1ZQotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwKLQkJCQlwZXJzaXN0ZXIudHhSZWNvcmQpOwotCi0JCXJldHVybiBwZXJzaXN0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5oYXNPd25Gb2xkZXIoZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duUmVzb3VyY2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZShPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuaGFzT3duUmVzb3VyY2UoZSwKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGYWlsU2FmZVBlcnNpc3RlcigpCi0JICovCi0JcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuIG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uRmFpbFNhZmVQZXJzaXN0ZXIgZXh0ZW5kcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JCQlpbXBsZW1lbnRzIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciB7Ci0JCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2NvbW1pdCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRDdXJyZW50VHhJRCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRUeElEKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2FkanVzdExvY2F0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhZGp1c3RMb2NhdGlvbigoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCQlyZXR1cm4gc2F2ZU9wdGlvbnM7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBub25GYWlsU2FmZVBlcnNpc3RlciA9IG5ldyBOb25GYWlsU2FmZVBlcnNpc3RlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0RmlsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjc2F2ZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZighaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJTWFwIG9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsgCi0JCVJlc291cmNlIHJlcyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVsZW1lbnQpLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2U7Ci0JCWlmKHJlcyBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXM7Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHJlc291cmNlLCBvcHRpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkoZWxlbWVudCwgcmVzb3VyY2VTZXQpOwotCQkJcmVzb3VyY2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlU2V0LCBlbGVtZW50LCB1cmksIG9wdGlvbnMsIGZhbHNlKTsKLQkJfQotCQlyZXNvdXJjZS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQotCQlTdHJpbmcgc3RyID0gKFN0cmluZykgb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgQm9vbGVhbi52YWx1ZU9mKHN0cikuYm9vbGVhblZhbHVlKCkpIHsKLQkJCS8vIG5vdGlmeSBSZWZyZXNoSm9iIHRoZSB0aGlzIHJlc291cmNlIGlzIHNhdmVkIHNvIGl0IHdpbGwgbm90IGJlCi0JCQkvLyByZWxvYWRlZCBhZnRlciByZWZyZXNoaW5nIGl0Ci0JCQkvLwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc291cmNlU2F2ZWQocmVzb3VyY2UpOwotCi0JCQkvLyByZWZyZXNoIHRoZSBuZXdseSBjcmVhdGVkIHJlc291cmNlIHNvIGl0IGlzIGluIHN5bmNoIHdpdGggdGhlCi0JCQkvLyB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2gocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBGaWxlIGNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihTdHJpbmcgcGx1Z2luTmFtZSwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUZpbGUgbGliRGlyID0gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKGxpYkRpciwgcGx1Z2luTmFtZSk7Ci0JCWlmKCFwbHVnaW5EaXIuZXhpc3RzKCkpIHsKLQkJCWlmKCFwbHVnaW5EaXIubWtkaXJzKCkpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2Fubm90X2NyZWF0ZV9kaXJfbXNnLCBwbHVnaW5EaXIpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBsdWdpbkRpcjsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYnJhcnksIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlib29sZWFuIGNyZWF0ZSkgewotCQlGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShsaWJEaXIsIE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsKLQkJaWYoY29uZmlnRGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gY29uZmlnRGlyOwotCQl9IGVsc2UgaWYoY3JlYXRlKSB7Ci0JCQlpZighY29uZmlnRGlyLm1rZGlycygpKSB7Ci0JCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmNhbm5vdF9jcmVhdGVfZGlyX21zZywgY29uZmlnRGlyKSk7CQkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gY29uZmlnRGlyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSwgRmlsZSBmaWxlKSB7Ci0JCS8vIG5vdCBhbGxvd2VkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZWRCeShSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgY29udGFpbmVyUmVzb3VyY2UpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQoY29udGFpbmVyUmVzb3VyY2UpOwotCQlpZihoYXNPd25Gb2xkZXIoZSkpIHsKLQkJCVN0cmluZyBwYXRoID0gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKTsKLQkJCVN0cmluZyBjb250YWluZXJQYXRoID0gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKGNvbnRhaW5lclJlc291cmNlLmdldFVSSSgpKTsJCQotCQkJaWYocGF0aCA9PSBudWxsIHx8IGNvbnRhaW5lclBhdGggPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBuZXcgUGF0aChjb250YWluZXJQYXRoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuaXNQcmVmaXhPZihuZXcgUGF0aChwYXRoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEZvbGRlckFic29sdXRlUGF0aChlKTsKLQkJcmV0dXJuIGZvbGRlclBhdGggIT0gbnVsbCA/IG5ldyBGaWxlKGZvbGRlclBhdGgsIFJFU09VUkNFX0ZPTERFUikuZ2V0QWJzb2x1dGVQYXRoKCkgOiBSRVNPVVJDRV9GT0xERVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlKTsKLQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShsaWJyYXJ5LmVSZXNvdXJjZSgpKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlyZXR1cm4gbmV3IEZpbGUobGliRGlyLCBnZXRSZWxhdGl2ZUVsZW1lbnRQYXRoKGUpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyI2RlbGV0ZShqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtcykgewotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyhpdC5uZXh0KCksIGVsZW1lbnRzKTsKLQkJfQotCQlkZWxldGVBbmRTYXZlKGVsZW1lbnRzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZUlPRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZUlPRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzI3OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEJhc2UgZXhjZXB0aW9uIGZvciBmaWxlLWJhc2VkIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVJT0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1Nzg1MzE5ODcyMjM0NzMyMUw7Ci0KLQlwcml2YXRlIE9iamVjdCB0cm91YmxlT2JqZWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlSU9FeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlSU9FeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKFN0cmluZyBtc2csIE9iamVjdCB0cm91YmxlT2JqKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JCXRyb3VibGVPYmplY3QgPSB0cm91YmxlT2JqOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHJvdWJsZU9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRyb3VibGVPYmplY3QoKSB7Ci0JCXJldHVybiB0cm91YmxlT2JqZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjkxMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTE1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuTGlicmFyeVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLmludGVybmFsLlJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLlJlc29sdmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5FdmVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCBleHRlbmRzIFJlc291cmNlU2V0SW1wbCBpbXBsZW1lbnRzCi0JCUlQcm94eVJlc29sdXRpb25MaXN0ZW5lciwgSVVtYVJlc291cmNlU2V0LCBJTGlicmFyeVJlc291cmNlU2V0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIID0geyAiRGVsaXZlcnlQcm9jZXNzZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggPSB7Ci0JCQkiQ29udGVudCIsICJDYXBhYmlsaXR5UGF0dGVybnMiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9QUk9DRVNTX0NPTlRSSUJVVElPTl9QQVRIID0geyAiUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIH07IC8vJE5PTi1OTFMtMSQJCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIFBST0NFU1NfUEFDS0FHRV9QQVRIUyA9IHsKLQkJCURFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRILCBERUZBVUxUX0NBUEFCSUxJVFlfUEFUVEVSTl9QQVRILAotCQkJREVGQVVMVF9QUk9DRVNTX0NPTlRSSUJVVElPTl9QQVRIIH07Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gUkVQT1JUX0VSUk9SID0gdHJ1ZTsKLQotCXN0YXRpYyBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IERFRkFVTFRfU0FWRV9PUFRJT05TID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0KLQlzdGF0aWMgZmluYWwgU2V0IERFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlzdGF0aWMgewotCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbigpKTsKLQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50KCkpOwotCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJLy8gZUNsYXNzZXMuYWRkKFJlc291cmNlbWFuYWdlclBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcigpKTsKLQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCi0JCVhNTFJlc291cmNlLlhNTE1hcCB4bWxNYXAgPSBjcmVhdGVTYXZlWE1MTWFwKCk7Ci0KLQkJSGFzaFNldCBzYXZlVG9nZXRoZXIgPSBuZXcgSGFzaFNldCgpOwotCQlzYXZlVG9nZXRoZXIuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoCi0JCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCwKLQkJCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQpOwotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuU0FWRV9BTEwsICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5TQVZFX1RPR0VUSEVSX0NMQVNTX1NFVCwKLQkJCQlzYXZlVG9nZXRoZXIpOwotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UsCi0JCQkJInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUFJPQ0VTU19EQU5HTElOR19IUkVGLAotCQkJCVhNTFJlc291cmNlLk9QVElPTl9QUk9DRVNTX0RBTkdMSU5HX0hSRUZfRElTQ0FSRCk7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fWE1MX01BUCwgeG1sTWFwKTsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9DT05GSUdVUkFUSU9OX0NBQ0hFLCBCb29sZWFuLlRSVUUpOwotCi0JCUFzc29jaWF0aW9uSGVscGVyLmluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNNR1JfWE1JID0gInJlc21nci54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+IGRlZmF1bHRTYXZlT3B0aW9uczsKLQotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEVPYmplY3Q+IGd1aWRUb01ldGhvZEVsZW1lbnRNYXA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZGluZzsKLQotCXByaXZhdGUgYm9vbGVhbiBsb2FkaW5nUmVzb3VyY2VNYW5hZ2VyVHJlZTsKLQotCXByaXZhdGUgTWFwIFVSSVRvVGVtcFVSSU1hcDsKLQotCXByaXZhdGUgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlciBtYXJrZXJNYW5hbmdlcjsKLQotCXByaXZhdGUgVW5pcXVlRUxpc3Q8SVJlZnJlc2hMaXN0ZW5lcj4gcmVmcmVzaExpc3RlbmVyczsKLQotCXByb3RlY3RlZCBJVVJJUHJvdmlkZXIgdXJpUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFBhdGggY29uZmlnRm9sZGVyUGF0aDsKLQotCXByaXZhdGUgUGF0aCBsaWJGb2xkZXJQYXRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MUmVzb3VyY2UuWE1MTWFwIGNyZWF0ZUxvYWRYTUxNYXAoKSB7Ci0JCVhNTFJlc291cmNlLlhNTE1hcCB4bWxNYXAgPSBuZXcgWE1MTWFwSW1wbCgpOwotCQlTZXQgZXhjbHVkZWRBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZXhjbHVkZWRBdHRyaWJ1dGVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0d1aWQoKSk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzaWZpZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IChFQ2xhc3NpZmllcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZUNsYXNzaWZpZXI7Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKCFleGNsdWRlZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0cmliKSkgewotCQkJCQkJWE1MUmVzb3VyY2UuWE1MSW5mbyB4bWxJbmZvID0gbmV3IFhNTEluZm9JbXBsKCk7Ci0JCQkJCQl4bWxJbmZvLnNldE5hbWUoYXR0cmliLmdldE5hbWUoKSk7Ci0JCQkJCQl4bWxJbmZvCi0JCQkJCQkJCS5zZXRYTUxSZXByZXNlbnRhdGlvbihYTUxSZXNvdXJjZS5YTUxJbmZvLkVMRU1FTlQpOwotCQkJCQkJeG1sTWFwLmFkZChhdHRyaWIsIHhtbEluZm8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHhtbE1hcDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhdmVBdHRyaWJ1dGVBc0VsZW1lbnQoRUNsYXNzIGVDbGFzcywKLQkJCUNvbGxlY3Rpb24gc2VsZWN0ZWRFQ2xhc3NlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3RlZEVDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGJhc2UgPSAoRUNsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChiYXNlLmlzU3VwZXJUeXBlT2YoZUNsYXNzKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUxSZXNvdXJjZS5YTUxNYXAgY3JlYXRlU2F2ZVhNTE1hcCgpIHsKLQkJWE1MUmVzb3VyY2UuWE1MTWFwIHhtbE1hcCA9IG5ldyBYTUxNYXBJbXBsKCk7Ci0JCVNldCBleGNsdWRlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldCgpOwotCQlleGNsdWRlZEF0dHJpYnV0ZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpKTsKLQkJZXhjbHVkZWRBdHRyaWJ1dGVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQotCQkvLyBzZWxlY3Qgb25seSBDb250ZW50RGVzY3JpcHRpb24gYW5kIFNlY3Rpb24KLQkJU2V0IHNlbGVjdGVkRUNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCQlzZWxlY3RlZEVDbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXNlbGVjdGVkRUNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb24oKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzaWZpZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IChFQ2xhc3NpZmllcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZUNsYXNzaWZpZXI7Ci0KLQkJCQlpZiAoc2F2ZUF0dHJpYnV0ZUFzRWxlbWVudChlQ2xhc3MsIHNlbGVjdGVkRUNsYXNzZXMpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoIWV4Y2x1ZGVkQXR0cmlidXRlcy5jb250YWlucyhhdHRyaWIpKSB7Ci0JCQkJCQkJWE1MUmVzb3VyY2UuWE1MSW5mbyB4bWxJbmZvID0gbmV3IFhNTEluZm9JbXBsKCk7Ci0JCQkJCQkJeG1sSW5mby5zZXROYW1lKGF0dHJpYi5nZXROYW1lKCkpOwotCQkJCQkJCXhtbEluZm8KLQkJCQkJCQkJCS5zZXRYTUxSZXByZXNlbnRhdGlvbihYTUxSZXNvdXJjZS5YTUxJbmZvLkVMRU1FTlQpOwotCQkJCQkJCXhtbE1hcC5hZGQoYXR0cmliLCB4bWxJbmZvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB4bWxNYXA7Ci0JfQotCi0JcHVibGljIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJbWFya2VyTWFuYW5nZXIgPSBuZXcgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKGJvb2xlYW4gcmVwb3J0RXJyb3IpIHsKLQkJdGhpcygpOwotCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKHJlcG9ydEVycm9yKTsKLQl9Ci0KLQlwdWJsaWMgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlciBnZXRVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKCkgewotCQlyZXR1cm4gbWFya2VyTWFuYW5nZXI7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIElVUklQcm92aWRlciBnZXRVUklQcm92aWRlcigpIHsKLQkJaWYodXJpUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdXJpUHJvdmlkZXIgPSBuZXcgRmlsZVBhdGhQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiB1cmlQcm92aWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlc291cmNlQ2hhbmdlKElSZXNvdXJjZSB3c1JlcykgewotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5oYW5kbGVSZXNvdXJjZUNoYW5nZSgpOiAiICsgd3NSZXMudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBnZXRSZXNvdXJjZSgKLQkJCQlVUkkuY3JlYXRlRmlsZVVSSSh3c1Jlcy5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpLCBmYWxzZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUFycmF5TGlzdCBwcm94aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlc291cmNlLnJlbG9hZChwcm94aWVzKTsKLQotCQkJCS8vIG5vdGlmeSBNQUtFX1BST1hZIGV2ZW50IGZvciBhbGwgcHJveGllcwotCQkJCS8vCi0JCQkJTm90aWZpY2F0aW9uIG1zZyA9IG5ldyBOb3RpZmljYXRpb25JbXBsKEV2ZW50VHlwZXMuTUFLRV9QUk9YWSwKLQkJCQkJCWZhbHNlLCB0cnVlKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm94aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCW8uZU5vdGlmeShtc2cpOwotCQkJCX0KLQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBNYXA8T2JqZWN0LCBPYmplY3Q+IGdldExvYWRPcHRpb25zKCkgewotCQlNYXA8T2JqZWN0LCBPYmplY3Q+IG9wdGlvbnMgPSBzdXBlci5nZXRMb2FkT3B0aW9ucygpOwotCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9YTUxfTUFQLCBjcmVhdGVMb2FkWE1MTWFwKCkpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgTWFwPE9iamVjdCwgT2JqZWN0PiBnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChkZWZhdWx0U2F2ZU9wdGlvbnMgPT0gbnVsbCkgewotCQkJZGVmYXVsdFNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0JCQlkZWZhdWx0U2F2ZU9wdGlvbnMucHV0QWxsKERFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJfQotCi0JCXJldHVybiBkZWZhdWx0U2F2ZU9wdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZSBnZXRNZXRob2RMaWJyYXJ5UmVzb3VyY2UoKSB7Ci0JCWlmIChnZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChSZXNvdXJjZSkgZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IChNZXRob2RMaWJyYXJ5KSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlTWFuYWdlciBnZXRSb290UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCS5nZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2dldFVSSUNvbnZlcnRlcigpCi0JICovCi0JcHVibGljIFVSSUNvbnZlcnRlciBnZXRVUklDb252ZXJ0ZXIoKSB7Ci0JCWlmICh1cmlDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJdXJpQ29udmVydGVyID0gbmV3IE11bHRpRmlsZVVSSUNvbnZlcnRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gdXJpQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIFVSSSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSkgewotCQlpZiAoZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQl0cnkgewotCQkJcmVzID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQlpZiAocmVzID09IG51bGwpIHsKLQkJCQlNYXAgbWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKLQkJCQlyZXMgPSBjcmVhdGVSZXNvdXJjZSh1cmkpOwotCi0JCQkJdHJ5IHsKLQkJCQkJZGVtYW5kTG9hZEhlbHBlcihyZXMpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkvLyByZW1vdmUgdGhlIHJlc291cmNlIGZyb20gcmVzb3VyY2Ugc2V0IGlmIGl0IGNvdWxkIG5vdCBiZQotCQkJCQkvLyBsb2FkZWQKLQkJCQkJLy8KLQkJCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlcyk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCi0JCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJCW1hcC5wdXQodXJpLCByZXMpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5leGNlcHRpb24oKSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kTG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVtYW5kTG9hZChSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuZGVtYW5kTG9hZChyZXNvdXJjZSk7Ci0KLQkJLy8gcmVmcmVzaCB3b3Jrc3BhY2UgcmVzb3VyY2Ugb2YgdGhpcyByZXNvdXJjZSB0byBtYWtlIHRoZW0gc3luY2hyb25pemVkCi0JCS8vCi0JCWJvb2xlYW4gcmV0ID0gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHJlc291cmNlKTsKLQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmKCFyZXQpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5kZW1hbmRMb2FkKCk6IGNvdWxkIG5vdCByZWZyZXNoIHJlc291cmNlICIgKyByZXNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXNvbHZlcyBjb250YWluZXIgb2YgdGhlIE1ldGhvZEVsZW1lbnQgaW4gdGhlIGdpdmVuIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlQ29udGFpbmVyKFJlc291cmNlIHJlcykgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJaWYobG9hZGluZyAmJiBsaWIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXMuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJaWYoZSAhPSBsaWIgJiYgZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkvLyB0aGUgbWV0aG9kIGVsZW1lbnQgbWlnaHQgaGF2ZSBiZWVuIGxvYWRlZCBiZWZvcmUgaXRzIGNvbnRhaW5lciBhY2Nlc3NlZCBpdAotCQkJCQkvLwotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlRGVzY3JpcHRvcihyZXMpOwotCQkJCQlpZihyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJCVJlc291cmNlIGNvbnRhaW5lclJlc291cmNlID0gcmVzRGVzYy5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmKGNvbnRhaW5lclJlc291cmNlIGluc3RhbmNlb2YgWE1MUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQkJT2JqZWN0IHByb3h5ID0gKChYTUxSZXNvdXJjZUltcGwpY29udGFpbmVyUmVzb3VyY2UpLmdldElEVG9FT2JqZWN0TWFwKCkuZ2V0KGUuZ2V0R3VpZCgpKTsKLQkJCQkJCQlpZihwcm94eSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQkJRU9iamVjdCBwcm94eUVPYmplY3QgPSAoKEVPYmplY3QpcHJveHkpOyAKLQkJCQkJCQkJRVJlZmVyZW5jZSByZWYgPSBwcm94eUVPYmplY3QuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IHByb3h5RU9iamVjdC5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJCWlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQocmVmKTsKLQkJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7IGl0ZXIKLQkJCQkJCQkJCQkubmV4dCgpKQotCQkJCQkJCQkJCQk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlyZXNvbHZlQ29udGFpbmVyKGNvbnRhaW5lclJlc291cmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2dldFJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQl0cnkgewotCQkJcmVzID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0JCQkJbXNnID0gTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnLAotCQkJCQkJKG5ldyBPYmplY3RbXSB7IHVyaSwgZS5nZXRNZXNzYWdlKCkgfSkpOwotCQkJZWxzZQotCQkJCW1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZUVycm9yX21zZywgdXJpKTsKLQkJCWhhbmRsZUV4Y2VwdGlvbihtc2cpOwotCQkJdGhyb3cgZTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZnJlc2hMaXN0ZW5lcihJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyZWZyZXNoTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCXJlZnJlc2hMaXN0ZW5lcnMgPSBuZXcgVW5pcXVlRUxpc3Q8SVJlZnJlc2hMaXN0ZW5lcj4oKTsKLQkJfQotCQlyZWZyZXNoTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmcmVzaExpc3RlbnRlcihJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyZWZyZXNoTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCXJlZnJlc2hMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlSZWZyZXNoTGlzdGVuZXJzKElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJaWYocmVmcmVzaExpc3RlbmVycyAhPSBudWxsICYmICFyZWZyZXNoTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyIDogcmVmcmVzaExpc3RlbmVycykgewotCQkJCXRyeSB7Ci0JCQkJCWxpc3RlbmVyLm5vdGlmeVJlZnJlc2hlZChldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHJlc291cmNlcwotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIHJlbG9hZGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uIHJlbG9hZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlc291cmNlcykgewkJCi0JCS8vIHNhdmUgdGhlIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlcyB0byBjcmVhdGUgVVJJIGZvciB0aGVpcgotCQkvLyBwcm94aWVzIGFmdGVyIHVubG9hZAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQkKLQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5yZWxvYWRSZXNvdXJjZXMoKTogcmVzb3VyY2U9IiArIHJlc291cmNlICsgIiwgZWxlbWVudD0iICsgUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2Uuc2V0UmVzb3VyY2VEZXNjcmlwdG9yKHJlc0Rlc2MpOwotCQkJfQotCQl9Ci0KLQkJQXJyYXlMaXN0IHJlbG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoU2V0IHByb3hpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlBcnJheUxpc3QgcmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZXMpOwotCi0JCVJlc291cmNlIGxpYlJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCWJvb2xlYW4gcmVsb2FkQWxsQ29uZmlncyA9IGZhbHNlOwotCQlpZiAocmVzb3VyY2VMaXN0LnJlbW92ZShsaWJSZXNvdXJjZSkpIHsKLQkJCS8vIE1ldGhvZExpYnJhcnkgcmVzb3VyY2UgaXMgdG8gcmVsb2FkLCBpdCBtdXN0IGJlIHJlbG9hZGVkIGZpcnN0Ci0JCQkvLwkJCQotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbGliUmVzb3VyY2U7Ci0KLQkJCS8vIGNsZWFyIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLQkJCS8vCi0JCQltYXJrZXJNYW5hbmdlci5jbGVhck1hcmtlcnMocmVzb3VyY2UpOwotCi0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZS5yZWxvYWQocHJveGllcykpIHsKLQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQotCQkJCQkvLyByZXNldCB0aGUgcmVzb3VyY2UgbWFuYWdlciByZWZlcmVuY2UgaW4gVVJJQ29udmVydGVyIG9mCi0JCQkJCS8vIHRoaXMgcmVzb3VyY2Ugc2V0Ci0JCQkJCS8vIHNpbmNlIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGlzIHJlbG9hZGVkCi0JCQkJCS8vCi0JCQkJCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJdXJpQ29udmVydGVyLnJlc01nciA9IG51bGw7Ci0JCQkJCQotCQkJCQlyZWxvYWRBbGxDb25maWdzID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQotCQl9Ci0JCS8vIHJlbG9hZCB0aGUgcmVzb3VyY2VzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQotCQkJLy8gY2xlYXIgbWFya2VycyBmb3IgdGhpcyByZXNvdXJjZQotCQkJLy8KLQkJCW1hcmtlck1hbmFuZ2VyLmNsZWFyTWFya2VycyhyZXNvdXJjZSk7Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc291cmNlLnJlbG9hZChwcm94aWVzKSkgewotCQkJCQlyZWxvYWRlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCS8vIHJlaW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2Ugc2V0Ci0JCQkvLwotCQkJaW5pdGlhbGl6ZShyZWxvYWRBbGxDb25maWdzKTsKLQotCQkJLy8gbm90aWZ5IHRoZSBsaXN0ZW5lcnMKLQkJCS8vCi0JCQlpZiAocmVmcmVzaExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJSVJlZnJlc2hFdmVudCBldmVudCA9IG5ldyBSZWZyZXNoRXZlbnQocmVsb2FkZWRSZXNvdXJjZXMsCi0JCQkJCQlwcm94aWVzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHJlZnJlc2hMaXN0ZW5lcnMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlSZWZyZXNoTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVJlZnJlc2hMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJCWxpc3RlbmVyLm5vdGlmeVJlZnJlc2hlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlbG9hZGVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoYm9vbGVhbiBsb2FkQ29uZmlndXJhdGlvbnMpIHsKLQkJLy8gbG9hZCB0aGUgUmVzb3VyY2VNYW5hZ2VyIHRyZWUgYW5kIG9wcG9zaXRlIGZlYXR1cmVzCi0JCS8vCi0JCWxvYWRSZXNvdXJjZU1hbmFnZXJUcmVlKCk7Ci0KLQkJc2V0Q29udGFpbmVyc09mTG9hZGVkRWxlbWVudHMoKTsKLQkJCi0JCWlmKGxvYWRDb25maWd1cmF0aW9ucykgewotCQkJbG9hZENvbmZpZ3VyYXRpb25zKCk7Ci0JCX0KLQotCQlsb2FkT3Bwb3NpdGVGZWF0dXJlcygpOwotCi0JCS8vIHJlc2V0IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHJlZmVyZW5jZSBpbiBVUklDb252ZXJ0ZXIgb2YgdGhpcyByZXNvdXJjZQotCQkvLyBzZXQKLQkJLy8KLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpOwotCQl1cmlDb252ZXJ0ZXIucmVzTWdyID0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRhaW5lcnNPZkxvYWRlZEVsZW1lbnRzKCkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyZXNNZ3IsIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjE3MjY5MTAxNzk4NzcwMjUwNkw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iamVjdDsKLQkJCQlDb2xsZWN0aW9uIEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlMaXN0IHN1Yk1ncnMgPSBuZXcgQXJyYXlMaXN0KHJlc01nci5nZXRTdWJNYW5hZ2VycygpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdWJNZ3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQl0cnkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IHN1Yk1nciA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChzdWJNZ3IgIT0gbnVsbCAmJiAhc3ViTWdyLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHN1Yk1nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJR1VJRHMuYWRkKGUuZ2V0R3VpZCgpKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfQotCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzTWdyLmVSZXNvdXJjZSgpOwotCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0KLQkJCQkJLy8gcmVzb2x2ZSB0aGUgcHJveHkgb2YgdGhpcyBlbGVtZW50IGluIHRoZSBwYXJlbnQKLQkJCQkJLy8KLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwucmVzb2x2ZVByb3hpZXMoR1VJRHMsIHBhcmVudCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHJlc01nci5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gd29ya3NwYWNlIHJlc291cmNlIHJlcHJlc2VudHMgYSBsaWJyYXJ5IHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHdzUmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaWJyYXJ5UmVzb3VyY2UoSVJlc291cmNlIHdzUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGxpYkZvbGRlclBhdGggIT0gbnVsbCAmJiBsaWJGb2xkZXJQYXRoLmlzUHJlZml4T2Yod3NSZXNvdXJjZS5nZXRMb2NhdGlvbigpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB3b3Jrc3BhY2UgcmVzb3VyY2UgaXMgYSBuZXcgcmVzb3VyY2UgdGhhdCBjYW4gYmUgbG9hZGVkIAotCSAqIHVzaW5nIHtAbGluayAjbG9hZE5ld1Jlc291cmNlcyhDb2xsZWN0aW9uKX0KLQkgKiAgCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3UmVzb3VyY2VUb0xvYWQoSVJlc291cmNlIHdzUmVzb3VyY2UpIHsKLQkJSVBhdGggbG9jID0gd3NSZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gKGxvYyAhPSBudWxsICYmIGNvbmZpZ0ZvbGRlclBhdGggIT0gbnVsbCAKLQkJCQkmJiBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoIi4iICsgbG9jLmdldEZpbGVFeHRlbnNpb24oKSkgLy8kTk9OLU5MUy0xJAotCQkJCSYmIGNvbmZpZ0ZvbGRlclBhdGguaXNQcmVmaXhPZihsb2MpCi0JCQkJJiYgIUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNUZWFtUHJpdmF0ZShsb2MudG9TdHJpbmcoKSkpOwotCi0JfQotCQotCS8qKgotCSAqIExvYWRzIG5ldyByZXNvdXJjZXMgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBjb2xsZWN0aW9uIG9mIHtAbGluayBJUmVzb3VyY2Ugd29yayBzcGFjZSByZXNvdXJjZXN9Ci0JICogaW50byB0aGlzIHJlc291cmNlIHNldAotCSAqIFRPRE86IG1lcmdlIHRoaXMgY29kZSB0byB7QGxpbmsgI2dldFJlc291cmNlKFVSSSwgYm9vbGVhbil9Ci0JICogQHBhcmFtIHdzUmVzb3VyY2VzIGNvbGxlY3Rpb24gb2Yge0BsaW5rIElSZXNvdXJjZX0gb2JqZWN0cwotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWROZXdSZXNvdXJjZXMoQ29sbGVjdGlvbjxJUmVzb3VyY2U+IHdzUmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdCBuZXdDb25maWdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3NSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgd3NSZXNvdXJjZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYod3NSZXNvdXJjZSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCUlSZXNvdXJjZSB3c1JlcyA9IChJUmVzb3VyY2UpIHdzUmVzb3VyY2U7Ci0JCQkJSVBhdGggbG9jID0gd3NSZXMuZ2V0TG9jYXRpb24oKTsKLQkJCQlTdHJpbmcgY29uZmlnRmlsZTsKLQkJCQlpZihsb2MgIT0gbnVsbCAmJiBjb25maWdGb2xkZXJQYXRoICE9IG51bGwgCi0JCQkJCQkmJiBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoIi4iICsgbG9jLmdldEZpbGVFeHRlbnNpb24oKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJJiYgY29uZmlnRm9sZGVyUGF0aC5pc1ByZWZpeE9mKGxvYykKLQkJCQkJCSYmICFGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzVGVhbVByaXZhdGUoY29uZmlnRmlsZSA9IGxvYy50b1N0cmluZygpKSkgewotCQkJCQluZXdDb25maWdGaWxlcy5hZGQoY29uZmlnRmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBsb2FkIG5ldyBjb25maWd1cmF0aW9ucwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdDb25maWdGaWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBjb25maWdGaWxlID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlsb2FkQ29uZmlndXJhdGlvbihuZXcgRmlsZShjb25maWdGaWxlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBNZXRob2RDb25maWd1cmF0aW9uIHNpbmNlIE1ldGhvZExpYnJhcnkgd2lsbCBubwotCSAqIGxvbmdlciBrZWVwcyB0aGUgcmVmZXJlbmNlcyB0byBNZXRob2RDb25maWd1cmF0aW9ucyBhbmQgdGhlaXIgZmlsZXMuIEFueQotCSAqIFhNSSBmaWxlIHVuZGVyIGZvbGRlciAuL2NvbmZpZ3VyYXRpb25zIGFuZCBpdHMgc3ViZm9sZGVycyB3aWxsIGJlIHRyZWF0ZWQKLQkgKiBhcyBhIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhleSB3aWxsIGJlIGxvYWRlZCBhbmQgYWRkZWQgdG8gTWV0aG9kTGlicmFyeQotCSAqIGFzIGl0cyBjb25maWd1cmF0aW9ucy4KLQkgKiBAcmV0dXJuIFRPRE8KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZENvbmZpZ3VyYXRpb25zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpLAotCQkJCU11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsKLQkJcmV0dXJuIGxvYWRDb25maWd1cmF0aW9ucyhjb25maWdEaXIpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBtZXRob2QgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnRGlyCi0JICogQHJldHVybiBUT0RPCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWRDb25maWd1cmF0aW9ucyhGaWxlIGNvbmZpZ0RpcikgewotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCUl0ZXJhdG9yIGRpckl0ZXIgPSBNdWx0aUZpbGVTYXZlVXRpbC5saXN0Q29uZmlnRmlsZXMoY29uZmlnRGlyKTsKLQkJSGFzaFNldDxGaWxlPiBjb25maWdGaWxlcyA9IG5ldyBIYXNoU2V0PEZpbGU+KCk7Ci0JCXdoaWxlIChkaXJJdGVyLmhhc05leHQoKSkgewotCQkJRmlsZSBjb25maWdGaWxlID0gKEZpbGUpIGRpckl0ZXIubmV4dCgpOwotCQkJaWYoY29uZmlnRmlsZS5pc0ZpbGUoKSkgewotCQkJCWNvbmZpZ0ZpbGVzLmFkZChjb25maWdGaWxlKTsKLQkJCX0KLQkJfQotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJaWYgKGNvbmZpZ0ZpbGVzLmNvbnRhaW5zKGZpbGUpKSB7Ci0JCQkJY29uZmlnRmlsZXMucmVtb3ZlKGZpbGUpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlnRmlsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxvYWRDb25maWd1cmF0aW9uKGZpbGUpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlIGxvYWRDb25maWd1cmF0aW9uKEZpbGUgY29uZmlnRmlsZSkgewotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoY29uZmlnRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdXBlci5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJaWYoUGVyc2lzdGVuY2VVdGlsLmhhc0R1cGxpY2F0ZUdVSUQoZSwgbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKSkgewotCQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCQlOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkQ29uZmlndXJhdGlvbl9jb3VsZE5vdExvYWRfbG9nTXNnLCBjb25maWdGaWxlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkKChNZXRob2RDb25maWd1cmF0aW9uKSBlKTsKLQkJCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQlOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkQ29uZmlndXJhdGlvbl9ub3RDb25maWdGaWxlX2xvZ01zZywgY29uZmlnRmlsZSkKLQkJCQkJCQkpOwotCQkJCX0KLQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQlnZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzb3VyY2UpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oT2JqZWN0IGVycikgewotCQlpZiAoZXJyIGluc3RhbmNlb2YgVGhyb3dhYmxlKSB7Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoKEV4Y2VwdGlvbillcnIpOwotCQl9IGVsc2UgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGVyci50b1N0cmluZygpKTsKLQkJfQotCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJaWYgKGVyciBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJCSgoRXhjZXB0aW9uKSBlcnIpLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZXJyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCWlmICh1cmlDb252ZXJ0ZXIgaW5zdGFuY2VvZiBNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIHsKLQkJCSgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSB1cmlDb252ZXJ0ZXIpLmRpc3Bvc2UoKTsKLQkJfQotCQl1cmlDb252ZXJ0ZXIgPSBudWxsOwotCQlib29sZWFuIG5vdGlmeSA9IGVEZWxpdmVyKCk7Ci0JCWJvb2xlYW4gcmVwb3J0RXJyb3IgPSBSRVBPUlRfRVJST1I7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJYm9vbGVhbiBvbGRNYXJrZXJNYW5hZ2VyRW5hYmxlZCA9IG1hcmtlck1hbmFuZ2VyLmlzRW5hYmxlZCgpOwotCi0JCXRyeSB7Ci0JCQlpZihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSA9PSB0aGlzKSB7Ci0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCQkJfQotCQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJUkVQT1JUX0VSUk9SID0gZmFsc2U7Ci0JCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1hcmtlck1hbmFuZ2VyLmNsZWFyQWxsKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoZ2V0UmVzb3VyY2VzKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciB1bmxvYWRpbmcgcmVzb3VyY2U6ICIgKwotCQkJCQkvLyByZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQljbGVhckVycm9ycygpOwotCQl9IGZpbmFsbHkgewotCQkJZVNldERlbGl2ZXIobm90aWZ5KTsKLQkJCVJFUE9SVF9FUlJPUiA9IHJlcG9ydEVycm9yOwotCQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZChvbGRNYXJrZXJNYW5hZ2VyRW5hYmxlZCk7Ci0JCQlpZihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSA9PSB0aGlzKSB7Ci0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQocmVmcmVzaCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCAhPSBudWxsKSB7Ci0JCQlndWlkVG9NZXRob2RFbGVtZW50TWFwLmNsZWFyKCk7Ci0JCX0KLQotCQlnZXRSZXNvdXJjZXMoKS5jbGVhcigpOwotCi0JCWlmIChVUklUb1RlbXBVUklNYXAgIT0gbnVsbCkgewotCQkJVVJJVG9UZW1wVVJJTWFwLmNsZWFyKCk7Ci0JCX0KLQotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuY2xlYXJEZXRhY2hlZEVPYmplY3RUb0lETWFwKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRXJyb3JzKCkgewotCQkvLyBjbGVhciBhbGwgbWFya2VycwotCQltYXJrZXJNYW5hbmdlci5jbGVhckFsbCgpOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGxvYWRMaWJyYXJ5KFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9uZyBiZWdpbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCXJlc2V0KCk7Ci0KLQkJbG9uZyBhZnRlclJlc2V0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzZXQgdGltZTogIiArIChhZnRlclJlc2V0IC0gYmVnaW4pKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBsb2FkTGlicmFyeVdpdGhvdXRSZXNldChwYXRoKTsKLQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkxvYWQgdGltZTogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZ2luKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJLy8gY2hlY2sgaWYgYW55IHJlc291cmNlIGlzIG1hcmtlZCBhcyBtb2RpZmllZCBhZnRlciBsb2FkaW5nCi0JCQkvLwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJNb2RpZmllZCByZXNvdXJjZXMgYWZ0ZXIgbG9hZGluZzoiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCIgICIgKyByZXNvdXJjZS5nZXRVUkkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGliOwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgbG9hZExpYnJhcnlSZXNvdXJjZShTdHJpbmcgcGF0aCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCVJlc291cmNlIHJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCWlmICghcmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXN0ckJ1Zi5hcHBlbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlFcnJvcl9tc2cpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcmVzLmdldEVycm9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlLkRpYWdub3N0aWMgZXJyb3IgPSAoUmVzb3VyY2UuRGlhZ25vc3RpYykgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlzdHJCdWYuYXBwZW5kKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzLAotCQkJCQkJKG5ldyBPYmplY3RbXSB7IFN0cmluZy52YWx1ZU9mKGVycm9yLmdldExpbmUoKSksCi0JCQkJCQkJCVN0cmluZy52YWx1ZU9mKGVycm9yLmdldENvbHVtbigpKSwKLQkJCQkJCQkJZXJyb3IuZ2V0TWVzc2FnZSgpIH0pKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgbXNnID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKG1zZyk7Ci0JCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZExpYnJhcnlXaXRob3V0UmVzZXQoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkaW5nID0gdHJ1ZTsKLQotCQkvLyBubyByZWZyZXNoIGR1cmluZyBsb2FkCi0JCS8vCi0JCWJvb2xlYW4gYiA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJaWYoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc2V0KCk7Ci0JCX0KLQkJCi0JCS8vIGRlZmVyIGFkZGluZyBtYXJrZXJzIGR1cmluZyBsb2FkCi0JCS8vCi0JCWJvb2xlYW4gYXV0b1NjaGVkdWxlZCA9IG1hcmtlck1hbmFuZ2VyLmlzQXV0b1NjaGVkdWxlZCgpOwotCQltYXJrZXJNYW5hbmdlci5zZXRBdXRvU2NoZWR1bGVkKGZhbHNlKTsKLQkJdHJ5IHsJCQotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQljb25maWdGb2xkZXJQYXRoID0gbmV3IFBhdGgobmV3IEZpbGUobGliRmlsZS5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJbGliRm9sZGVyUGF0aCA9IG5ldyBQYXRoKGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0JCQlSZXNvdXJjZSByZXMgPSBsb2FkTGlicmFyeVJlc291cmNlKGxpYkZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsgCi0JCQl0cnkgewotCQkJCWluaXRpYWxpemUodHJ1ZSk7Ci0JCQkJCi0JCQkJLy8gU2V0IG1vZGlmaWVkIGZsYWcgb2YgbGlicmFyeSByZXNvdXJjZSB0byBmYWxzZSBpbiBjYXNlIGl0IGhhZCBiZWVuIG1vZGlmaWVkIGR1cmluZyBpbml0aWFsaXphdGlvbgotCQkJCS8vCi0JCQkJaWYocmVzICE9IG51bGwpIHsKLQkJCQkJcmVzLnNldE1vZGlmaWVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5pbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2csIHBhdGgpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZVNldCgpID09IHRoaXMpIHsKLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChiKTsKLQkJCX0KLQkJCQkJCi0JCQltYXJrZXJNYW5hbmdlci5zZXRBdXRvU2NoZWR1bGVkKGF1dG9TY2hlZHVsZWQpOwotCQkJbWFya2VyTWFuYW5nZXIuc3RhcnQoKTsKLQkJCQotCQkJbG9hZGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgb3Bwb3NpdGUgZmVhdHVyZXMgZm9yIGFsbCBsb2FkZWQgb2JqZWN0cwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJQXJyYXlMaXN0IG9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCX0KLQkJfQotCQlsb2FkT3Bwb3NpdGVGZWF0dXJlcyhvcHBvc2l0ZUZlYXR1cmVzKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBSZXNvdXJjZU1hbmFnZXIgdHJlZSBvZiB0aGUgb3BlbiBsaWJyYXJ5IGFuZCBjb25uZWN0IGFueSBsb2FkZWQKLQkgKiBNZXRob2RVbml0IHRvIHRoZSBsaWJyYXJ5IHRyZWUgYXMgd2VsbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFJlc291cmNlTWFuYWdlclRyZWUoKSB7Ci0JCWxvbmcgYmVnaW4gPSAwOwotCQkKLQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWJlZ2luID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQotCQkvLyBkaXNhYmxlIGxvZ2dpbmcgdW5yZXNvbHZlZCBwcm94aWVzIGR1cmluZyBsb2FkaW5nIHJlc291cmNlIG1hbmFnZXIKLQkJLy8gdHJlZQotCQkvLwotCQlib29sZWFuIG9sZE1hcmtlck1hbmFnZXJFbmFibGVkID0gbWFya2VyTWFuYW5nZXIuaXNFbmFibGVkKCk7Ci0JCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIHRoaXMgcHJldmVudHMgdXJpQ29udmVydGVyIGZyb20gbG9hZGluZyByZXNvdXJjZXMgd2hpbGUKLQkJCS8vIG5vcm1hbGl6aW5nIFVSSQotCQkJLy8KLQkJCXVyaUNvbnZlcnRlci5zZXRSZXNvbHZlUHJveHkoZmFsc2UpOwotCi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQkJSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8T2JqZWN0PihyZXNNZ3IsIGZhbHNlKSB7Ci0KLQkJCQkvKioKLQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCSAqLwotCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxNzI2OTEwMTc5ODc3MDI1MDZMOwotCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iamVjdDsKLQkJCQkJcmV0dXJuIHJlc01nci5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQkJbG9hZGluZ1Jlc291cmNlTWFuYWdlclRyZWUgPSB0cnVlOwotCQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJCTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQob2xkTWFya2VyTWFuYWdlckVuYWJsZWQpOwotCQkJdXJpQ29udmVydGVyLnNldFJlc29sdmVQcm94eSh0cnVlKTsKLQkJCWxvYWRpbmdSZXNvdXJjZU1hbmFnZXJUcmVlID0gZmFsc2U7Ci0KLQkJCS8vIFJlcG9ydGluZyBvZiB1bm5vcm1hbGl6ZWQgVVJJcyB3YXMgZGlzYWJsZWQgd2hpbGUgbG9hZGluZwotCQkJLy8gcmVzb3VyY2UgbWFuYWdlciB0cmVlLiBOb3cgd2UgbmVlZAotCQkJLy8gdG8gZ28gdGhydSBhbGwgdGhlIGxvYWRlZCBvYmplY3RzIHRvIGZpbmQgcHJveGllcyB3aXRoCi0JCQkvLyB1bm5vcm1hbGl6ZWQgVVJJcyBhbmQgcmVwb3J0IHRoZW0KLQkJCS8vCi0JCQl0cnkgewotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvLmVJc1Byb3h5KCkgJiYgby5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQkJVVJJIHVyaSA9IG8uZVByb3h5VVJJKCk7Ci0JCQkJCQlVUkkgbm9ybWFsaXplZFVSSSA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQkJCQkJaWYgKG5vcm1hbGl6ZWRVUkkgPT0gbnVsbCkgewotCQkJCQkJCS8vIHRoaXMgY2FsbCB3aWxsIGxvZyBlcnJvciBhYm91dCB1bnJlc29sdmVkIHByb3h5Ci0JCQkJCQkJLy8KLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgby5lQ29udGFpbmVyKCkpLmVSZXNvbHZlUHJveHkobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCQotCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmxvYWRSZXNvdXJjZU1hbmFnZXJUcmVlKCk6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKFN0cmluZyBpZCkgewotCQlyZXR1cm4gZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGdldFJlc291cmNlTWFuYWdlcigpLCBpZCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLAotCQkJU3RyaW5nIGlkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdXBlci5nZXRSZXNvdXJjZShkZXNjLmdldFJlc29sdmVkVVJJKCksIGZhbHNlKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UgPSBzdXBlci5nZXRSZXNvdXJjZShkZXNjLmdldFJlc29sdmVkVVJJKCksIHRydWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCi0JCQkJfQotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QoaWQpOwotCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcygKLQkJCQkJKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCksIGlkKTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFN0cmluZyBpZCkgewotCQkvLyBmaXJzdCwgdHJ5IHRvIGdldCB0aGUgb2JqZWN0IGZyb20gdGhlIGNhY2hlIGd1aWRUb01ldGhvZEVsZW1lbnQKLQkJLy8KLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoaWQpOwotCQlpZiAoZU9iamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIGVPYmplY3Q7Ci0KLQkJVVJJIHVyaSA9IE11bHRpRmlsZVVSSUNvbnZlcnRlci5jcmVhdGVVUkkoaWQpLmFwcGVuZEZyYWdtZW50KGlkKTsKLQkJVVJJIG5vcm1hbGl6ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJaWYgKG5vcm1hbGl6ZWQgPT0gbnVsbCkgewotCQkJLy8gdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZCBtaWdodCBub3QgaGF2ZSBkaXJlY3QgcmVzb3VyY2UsCi0JCQkvLyBoZW5jZSwgaXQgZG9lcyBub3QgaGF2ZQotCQkJLy8gaXRzIG93biBSZXNvdXJjZURlc2NyaXB0b3IgaW4gUmVzb3VyY2VNYW5hZ2VyIHRyZWUuCi0JCQkvLyBnbyB0aHJ1IGFsbCB1bmxvYWRlZCByZXNvdXJjZXMsIGxvYWQgdGhlbSwgYW5kIHRyeSB0byBmaW5kIHRoZQotCQkJLy8gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkLgotCQkJLy8KLQkJCWVPYmplY3QgPSBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoaWQpOwotCQkJaWYgKGVPYmplY3QgPT0gbnVsbCAmJiBSRVBPUlRfRVJST1IpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5vYmpOb3RGb3VuZEVycm9yX21zZywgaWQpKTsKLQkJCX0KLQkJCXJldHVybiBlT2JqZWN0OwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJcmV0dXJuIGdldEVPYmplY3QobnVsbCwgdXJpLCBsb2FkT25EZW1hbmQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzdWx0ID0gZG9DcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXN1bHQuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCWdldFJlc291cmNlcygpLmFkZChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZG9DcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKHVyaSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBiYWNrdXBSZXF1aXJlZChNYXAgb3B0aW9ucykgewotCQlCb29sZWFuIGJhY2t1cCA9IChCb29sZWFuKSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFKTsKLQkJcmV0dXJuIGJhY2t1cCAhPSBudWxsICYmIGJhY2t1cC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmFja3VwKFJlc291cmNlIHJlcykgewotCQl0cnkgewotCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlPYmplY3Qgb2JqZWN0ID0gcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeQotCQkJCQl8fCBvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIgfHwgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkKLQkJCQlyZXR1cm47Ci0KLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCVN0cmluZyBiYWNrdXBEaXIgPSBuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArICIuYmFrIjsgLy8kTk9OLU5MUy0xJAotCQkJU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCi0JCQkJCSJ5eU1NZGRISG1tc3MuUyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzID09IGxpYnJhcnkuZVJlc291cmNlKCkpIHsKLQkJCQlEYXRlRm9ybWF0LmdldEluc3RhbmNlKCkuZm9ybWF0KAotCQkJCQkJQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpOwotCQkJCUZpbGUgYmFja3VwRmlsZSA9IG5ldyBGaWxlKGJhY2t1cERpciwKLQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRQotCQkJCQkJCQkrICdfJwotCQkJCQkJCQkrIGRhdGVGb3JtYXR0ZXIuZm9ybWF0KENhbGVuZGFyLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0VGltZSgpKSk7Ci0JCQkJaWYgKCFiYWNrdXBGaWxlLmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSkgewotCQkJCQliYWNrdXBGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJRmlsZVV0aWwubW92ZUZpbGUobmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKSwgYmFja3VwRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyByZWxhdGl2ZVBhdGggPSByZXMuZ2V0VVJJKCkuZGVyZXNvbHZlKAotCQkJCQkJbGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKSkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJRmlsZSBiYWNrdXBGaWxlID0gbmV3IEZpbGUoYmFja3VwRGlyLCByZWxhdGl2ZVBhdGgKLQkJCQkJCSsgJ18nCi0JCQkJCQkrIGRhdGVGb3JtYXR0ZXIKLQkJCQkJCQkJLmZvcm1hdChDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSkpOwotCQkJCWlmICghYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJfQotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSksIGJhY2t1cEZpbGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJaGFuZGxlRXhjZXB0aW9uKE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmJhY2t1cEVycm9yX21zZywgcmVzKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVVSSU1hcHBpbmdzKEVPYmplY3QgZU9iaiwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIoZU9iagotCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCAmJiByZXNNZ3IuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCUVjb3JlVXRpbC5yZW1vdmUocmVzTWdyKTsKLQkJfQotCQlyZXNNZ3IgPSBnZXRSb290UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCWlmKHJlc01nciAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IoCi0JCQkJCXJlc01nciwgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChlT2JqKSwKLQkJCQkJbnVsbCwgdHJ1ZSk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwgJiYgZGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkZXNjLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQkJRWNvcmVVdGlsLnJlbW92ZShkZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXAoUmVzb3VyY2UgcmVtb3ZlZFJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljbGVhblVwKHJlbW92ZWRSZXNvdXJjZSwgbnVsbCk7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgY2xlYW5VcChFT2JqZWN0IG9iaiwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JLy8gdHJ5IHsKLQkvLyAvLyByZW1vdmUgYWxsIHRoZSBVUkkgbWFwcGluZ3MKLQkvLyAvLwotCS8vIHJlbW92ZVVSSU1hcHBpbmdzKG9iaiwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCS8vIH0KLQkvLyBmaW5hbGx5IHsKLQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IG9iai5lUmVzb3VyY2UoKTsKLQkvLyBpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldENvbnRlbnRzKCkuY29udGFpbnMob2JqKSkgewotCS8vIHJlc291cmNlLnVubG9hZCgpOwotCS8vIGdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQl2b2lkIGNsZWFuVXAoUmVzb3VyY2UgcmVtb3ZlZFJlc291cmNlLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8KLQkJCWlmIChyZW1vdmVkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlyZW1vdmVkUmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlZFJlc291cmNlLmxvYWQobnVsbCk7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gdGhlIGZpbGUgbWlnaHQgYWxyZWFkeSBiZSBkZWxldGVkLCBtb3ZlZCBvciBuZXZlcgotCQkJCQkvLyBjcmVhcmVkLgotCQkJCQkvLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlFT2JqZWN0IG9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlbW92ZWRSZXNvdXJjZSk7Ci0KLQkJCS8vIGlmKG9iaiA9PSBudWxsKSByZXR1cm47Ci0JCQkvLyBib29sZWFuIGNsZWFuRm9sZGVyOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkvLyBjbGVhbkZvbGRlciA9IHRydWU7Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIGNsZWFuRm9sZGVyID0gZmFsc2U7Ci0JCQkvLyB9Ci0KLQkJCS8vIE11bHRpRmlsZVVSSUNvbnZlcnRlciB1bWFVcmlDb252ZXJ0ZXIgPQotCQkJLy8gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpZ2V0VVJJQ29udmVydGVyKCkpOwotCQkJLy8gdW1hVXJpQ29udmVydGVyLmdldFJlc291cmNlTWFuYWdlcigpLnJlbW92ZVJlc291cmNlRGVzY3JpcHRvcihyZW1vdmVkUmVzb3VyY2UuZ2V0VVJJKCksCi0JCQkvLyBjbGVhbkZvbGRlcik7Ci0KLQkJCS8vIHJlbW92ZSBhbGwgdGhlIFVSSSBtYXBwaW5ncwotCQkJLy8KLQkJCXJlbW92ZVVSSU1hcHBpbmdzKG9iaiwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJLy8gY2xlYW5VcFJlc291cmNlRGVzY3JpcHRvcnMoKFByb2Nlc3NQYWNrYWdlKW9iaik7Ci0JCQkvLyB9Ci0KLQkJCXJlbW92ZWRSZXNvdXJjZS51bmxvYWQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFJlc291cmNlcygpLnJlbW92ZShyZW1vdmVkUmVzb3VyY2UpOwotCQkJVVJJIG9sZFVSSSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZW1vdmVkUmVzb3VyY2UpCi0JCQkJCS5nZXRPbGRVUkkoKTsKLQkJCWlmIChvbGRVUkkgIT0gbnVsbCkgewotCQkJCWdldFVSSVRvVGVtcFVSSU1hcCgpLnJlbW92ZShvbGRVUkkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoUHJvY2Vzc1BhY2thZ2UgcHJvY1BrZykgewotCQkvLyByZW1vdmUgQ29udGVudERlc2NyaXB0aW9uIG9mIGFsbCBQcm9jZXNzRWxlbWVudHMgaW4gdGhpcwotCQkvLyBQcm9jZXNzUGFja2FnZQotCQkvLwotCQlyZW1vdmVDb250ZW50RGVzY3JpcHRpb25zKHByb2NQa2cpOwotCi0JCUVjb3JlVXRpbC5yZW1vdmUocHJvY1BrZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2NQa2cKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29udGVudERlc2NyaXB0aW9ucyhQcm9jZXNzUGFja2FnZSBwcm9jUGtnKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2NQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzRWxlbWVudCBlbGVtZW50ID0gKFByb2Nlc3NFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlbGVtZW50KQotCQkJCQkmJiBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlyZW1vdmVQcmVzZW50YXRpb24oZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jUGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwa2cgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJlbW92ZUNvbnRlbnREZXNjcmlwdGlvbnMoKFByb2Nlc3NQYWNrYWdlKSBwa2cpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJlc2VudGF0aW9uKFByb2Nlc3NFbGVtZW50IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2F2ZShDb2xsZWN0aW9uIHJlc291cmNlcywgTWFwIG9wdGlvbnMsIGJvb2xlYW4gcHJlcGFyZVNhdmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXNhdmUocmVzLCBvcHRpb25zLCBwcmVwYXJlU2F2ZSk7Ci0JCQl9Ci0JCQlzYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCW9wdGlvbnMucmVtb3ZlKE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIHNhdmUoUmVzb3VyY2UgcmVzLCBNYXAgb3B0aW9ucywgYm9vbGVhbiBwcmVwYXJlU2F2ZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSAoU2V0KSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQlUeFJlY29yZCB0eFJlY29yZCA9IChUeFJlY29yZCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuVFhfUkVDT1JEKTsKLQkJTGlzdCByZXNvdXJjZXNUb0NvbW1pdCA9IHR4UmVjb3JkICE9IG51bGwgPyB0eFJlY29yZAotCQkJCS5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpIDogbnVsbDsKLQotCQl0cnkgewotCQkJTWV0aG9kRWxlbWVudCBlT2JqID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJCWlmIChlT2JqICE9IG51bGwpIHsKLQkJCQlpZiAocHJlcGFyZVNhdmUpIHsKLQkJCQkJaWYgKGVPYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIGVPYmo7Ci0JCQkJCQlSZXNvdXJjZSBjb250ZW50ID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpICE9IG51bGwKLQkJCQkJCQkJJiYgQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJCQkJCS5oYXNQcmVzZW50YXRpb24ocHJvY0NvbXAuZ2V0UHJvY2VzcygpKSA/IHByb2NDb21wCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkKLQkJCQkJCQkJOiBudWxsOwotCQkJCQkJYm9vbGVhbiBhbHJlYWR5TW9kaWZpZWQgPSBjb250ZW50ICE9IG51bGwKLQkJCQkJCQkJJiYgY29udGVudC5pc01vZGlmaWVkKCk7Ci0JCQkJCQlwcmVwYXJlU2F2ZShwcm9jQ29tcCk7Ci0JCQkJCQlpZiAoY29udGVudCAhPSBudWxsICYmIGNvbnRlbnQuaXNNb2RpZmllZCgpCi0JCQkJCQkJCSYmICFhbHJlYWR5TW9kaWZpZWQpIHsKLQkJCQkJCQkvLyBjb250ZW50IGlzIG1vZGlmaWVkIGFzIHJlc3VsdCBvZiBwcmVwYXJlU2F2ZSgpLAotCQkJCQkJCS8vIGl0IG5lZWRzIHRvIGJlIHNhdmVkIGFmdGVyIG1vZGVsIGlzIHNhdmVkCi0JCQkJCQkJLy8KLQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZU9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRkUmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tPiBTdGFydCBzYXZpbmcgIiArIHJlcyk7Ci0JCQkJCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJCQkJaWYgKGJhY2t1cFJlcXVpcmVkKSB7Ci0JCQkJCQkvLyBiYWNrIHVwIHJlc291cmNlIGJlZm9yZSBzYXZpbmcKLQkJCQkJCS8vCi0JCQkJCQliYWNrdXAocmVzKTsKLQkJCQkJfQotCi0JCQkJCWlmIChyZXNvdXJjZXNUb0NvbW1pdCAhPSBudWxsKSB7Ci0JCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzKS5zZXRUZW1wVVJJKHR4UmVjb3JkCi0JCQkJCQkJCS5nZXRUeElEKCkpOwotCQkJCQkJcmVzb3VyY2VzVG9Db21taXQuYWRkKHJlcyk7Ci0JCQkJCX0KLQotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlcywgb3B0aW9ucyk7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI8LS0tLSBTYXZlZCByZXNvdXJjZTogIiArIHJlcyk7Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIGEgcmVzb3VyY2Ugb2YgdGhpcyByZXNvdXJjZSBzZXQgd2l0aCB0aGUgZ2l2ZW4gc2F2ZSBvcHRpb25zCi0JICogCi0JICogQHBhcmFtIHJlcwotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhdCBsZWFzdCBhIHJlc291cmNlIGhhcyBiZWVuIHNhdmVkIGluIHRoaXMgY2FsbAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZShSZXNvdXJjZSByZXMsIE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQkvLyBjbGVhciBhbGwgZXJyb3IgbWFya2VycyBmb3IgdGhpcyByZXNvdXJjZQotLy8JCS8vCi0vLwkJbWFya2VyTWFuYW5nZXIuY2xlYXJNYXJrZXJzKHJlcyk7Ci0KLQkJaWYgKHJlcyA9PSBudWxsIHx8IHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCX0KLQotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlvcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQsCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQlib29sZWFuIG5vdEZhaWxTYWZlID0gb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuVFhfUkVDT1JEKSA9PSBudWxsOwotCQl0cnkgewotCQkJQ29sbGVjdGlvbiBzYXZlZFJlc291cmNlcyA9IG51bGw7Ci0JCQlpZihub3RGYWlsU2FmZSkgewotCQkJCXNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJfQotCQkJYm9vbGVhbiByZXQgPSBzYXZlKHJlcywgb3B0aW9ucywgdHJ1ZSk7Ci0JCQlpZihyZXQgJiYgbm90RmFpbFNhZmUpIHsKLQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzKTsKLQkJCX0KLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHNhdmVNb2RpZmllZFJlc291cmNlcyhvcHRpb25zKTsKLQkJCWlmKCFjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXJldCA9IHRydWU7Ci0JCQkJaWYobm90RmFpbFNhZmUpIHsKLQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYobm90RmFpbFNhZmUgJiYgcmV0KSB7Ci0JCQkJLy8gdXBkYXRlIHJlc291cmNlIGNhY2hlZCB0aW1lc3RhbXBzCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IHJlc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkudXBkYXRlVGltZVN0YW1wcygpOwotCQkJCQl9Ci0JCQkJfQkJCQkJCQkJCi0JCQl9Ci0JCQkKLQkJCXJldHVybiByZXQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlvcHRpb25zLnJlbW92ZShNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgb25seSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzIGluIHRoaXMgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzYXZlKG9wdGlvbnMsIGZhbHNlLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZTsKLQkJCX0KLQkJCXRocm93IG5ldyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gc2F2ZWQgYnkgdGhpcyBjYWxsCi0JICogQHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gCi0JICovCi0JQ29sbGVjdGlvbiBzYXZlTW9kaWZpZWRSZXNvdXJjZXMoTWFwIG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSAoU2V0KSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQlUeFJlY29yZCB0eFJlY29yZCA9IChUeFJlY29yZCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuVFhfUkVDT1JEKTsKLQkJTGlzdCByZXNvdXJjZXNUb0NvbW1pdCA9IHR4UmVjb3JkICE9IG51bGwgPyB0eFJlY29yZAotCQkJCS5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpIDogbnVsbDsKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJYm9vbGVhbiBiYWNrdXBSZXF1aXJlZCA9IGJhY2t1cFJlcXVpcmVkKG9wdGlvbnMpOwotCQlib29sZWFuIGNoZWNrTW9kaWZ5ID0gTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChvcHRpb25zKTsKLQkJQ29sbGVjdGlvbiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlc1RvU2F2ZSA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCWNoZWNrTW9kaWZ5KHJlc291cmNlc1RvU2F2ZSk7Ci0JCQkJaWYocmVzb3VyY2VzVG9Db21taXQgIT0gbnVsbCkgewotCQkJCQkvLyBjaGVjayBmb3Igb3V0LW9mLXN5bmNoIG9ubHkgaW4gZmFpbC1zYWZlIHNhdmluZyBmb3Igbm93Ci0JCQkJCS8vCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrT3V0T2ZTeW5jaChyZXNvdXJjZXNUb1NhdmUsIG9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQkJCWZvcihJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9TYXZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkvLyBpZihyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQlpZiAoYmFja3VwUmVxdWlyZWQpIHsKLQkJCQkJLy8gYmFjayB1cCByZXNvdXJjZSBiZWZvcmUgc2F2aW5nCi0JCQkJCS8vCi0JCQkJCWJhY2t1cChyZXNvdXJjZSk7Ci0JCQkJfQotCi0JCQkJaWYgKHJlc291cmNlc1RvQ29tbWl0ICE9IG51bGwpIHsKLQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKS5zZXRUZW1wVVJJKHR4UmVjb3JkCi0JCQkJCQkJLmdldFR4SUQoKSk7Ci0JCQkJCXJlc291cmNlc1RvQ29tbWl0LmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCi0JCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuc2F2ZShyZXNvdXJjZSwgb3B0aW9ucykpIHsKLQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0JCXJldHVybiBzYXZlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEBwYXJhbSBzYXZlQWxsCi0JICogICAgICAgICAgICBpZiB0cnVlLCBmb3JjZSBzYXZpbmcgYWxsIHRoZSByZXNvdXJjZXMgZXZlbiBpZiB0aGV5IGFyZSBub3QKLQkgKiAgICAgICAgICAgIG1vZGlmaWVkLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucywgYm9vbGVhbiBzYXZlQWxsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2F2ZShvcHRpb25zLCBzYXZlQWxsLCBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNhdmUoTWFwIG9wdGlvbnMsIGJvb2xlYW4gc2F2ZUFsbCwgYm9vbGVhbiBmYWlsU2FmZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gbmV3IEhhc2hNYXAoZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkpOwotCQl9Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQlNdWx0aUZpbGVTYXZlVXRpbC5zZXRHdWlkKGxpYnJhcnkpOwotCi0JCXByZXBhcmVTYXZlKGxpYnJhcnkpOwotCi0JCS8vIGRvIGNsZWFuLXVwIHRoaXMgcmVzb3VyY2Ugc2V0IGJlZm9yZSBzYXZpbmcKLQkJLy8KLQkJY2xlYW5VcCgpOwotCi0JCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1bWFVcmlDb252ZXJ0ZXIgPSAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpOwotCQl1bWFVcmlDb252ZXJ0ZXIuc2V0TGlicmFyeVVSSXMobGlicmFyeSk7Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBudWxsOwotCQlpZiAoZmFpbFNhZmUpIHsKLQkJCXBlcnNpc3RlciA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UKLQkJCQkJLmdldEZhaWxTYWZlUGVyc2lzdGVyKG9wdGlvbnMpOwotCQkJb3B0aW9ucyA9IHBlcnNpc3Rlci5nZXRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCXRyeSB7Ci0JCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IHNhdmluZyAiICsgc2l6ZSArICIgbG9hZGVkIHJlc291cmNlczogIgotCQkJLy8gKyBsaXN0KTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJYm9vbGVhbiBiYWNrdXBSZXF1aXJlZCA9IGJhY2t1cFJlcXVpcmVkKG9wdGlvbnMpOwotCQkJTGlzdCBzYXZlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBtb3ZlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpOwotCi0JCQkJIGlmIChyZXMuaXNNb2RpZmllZCgpICYmIAotCQkJCQkJIE11bHRpRmlsZVNhdmVVdGlsLmFkanVzdExvY2F0aW9uUmVxdWlyZWQoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzKSkgewotCQkJCQkgbW92ZVJlc291cmNlcy5hZGQocmVzKTsKLQkJCQkgfQotCi0JCQkJTWV0aG9kRWxlbWVudCBlT2JqID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJCQlpZiAoZU9iaiAhPSBudWxsICYmIGVPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChzYXZlQWxsIHx8IHJlcy5pc01vZGlmaWVkKCkpIHsKLS8vCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tPiBTdGFydCBzYXZpbmcgIiArIHJlcyk7Ci0vLwkJCQkJCWlmIChmYWlsU2FmZSkgewotLy8JCQkJCQkJc2F2ZVJlc291cmNlcy5hZGQocmVzKTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCWlmIChiYWNrdXBSZXF1aXJlZCkgewotLy8JCQkJCQkJCS8vIGJhY2sgdXAgcmVzb3VyY2UgYmVmb3JlIHNhdmluZwotLy8JCQkJCQkJCS8vCi0vLwkJCQkJCQkJYmFja3VwKHJlcyk7Ci0vLwkJCQkJCQl9Ci0vLwotLy8JCQkJCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuc2F2ZShyZXMsIG9wdGlvbnMpKSB7Ci0vLwkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0vLwkJCQkJCQkJaWYocmVzIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0vLwkJCQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlcykudXBkYXRlVGltZVN0YW1wcygpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIjwtLS0tIFNhdmVkIHJlc291cmNlOiAiICsgcmVzKTsKLQkJCQkJCQotCQkJCQkJc2F2ZVJlc291cmNlcy5hZGQocmVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYoIXNhdmVSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJUmVzb3VyY2UgbGliUmVzb3VyY2UgPSBnZXRNZXRob2RMaWJyYXJ5UmVzb3VyY2UoKTsKLQkJCQlpZighc2F2ZVJlc291cmNlcy5jb250YWlucyhsaWJSZXNvdXJjZSkgJiYgUGVyc2lzdGVuY2VVdGlsLmNoZWNrVG9vbFZlcnNpb24obGliUmVzb3VyY2UpICE9IDApIHsKLQkJCQkJc2F2ZVJlc291cmNlcy5hZGQobGliUmVzb3VyY2UpOwotCQkJCX0KLQkJCQlpZihNdWx0aUZpbGVYTUlTYXZlSW1wbC5jaGVja01vZGlmeVJlcXVpcmVkKG9wdGlvbnMpKSB7Ci0JCQkJCWNoZWNrTW9kaWZ5KHNhdmVSZXNvdXJjZXMpOwotCQkJCX0KLQkJCQlpZiAoZmFpbFNhZmUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNhdmUoc2F2ZVJlc291cmNlcywgb3B0aW9ucywgZmFsc2UpOwotCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJcGVyc2lzdGVyLmFkanVzdExvY2F0aW9uKG1vdmVSZXNvdXJjZXMpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZVJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpKSB7Ci0JCQkJCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZVJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLmFkanVzdExvY2F0aW9uKHJlc291cmNlLAotCQkJCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQkJQ29sbGVjdGlvbiBzYXZlZCA9IHNhdmVNb2RpZmllZFJlc291cmNlcyhvcHRpb25zKTsKLQkJCQkJaWYgKHNhdmVkICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhdmVkLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkudXBkYXRlVGltZVN0YW1wcygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl0aHJvdyBleGNlcHRpb247Ci0JCX0gZmluYWxseSB7Ci0JCQlvcHRpb25zLnJlbW92ZShNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG9wZW4gbGlicmFyeSB1bmRlciBhIG5ldyBsb2NhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuZXdMb2NhdGlvbgotCSAqICAgICAgICAgICAgZGlyZWN0b3J5IHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSB0bwotCSAqIEBwYXJhbSBpZgotCSAqICAgICAgICAgICAgdHJ1ZSwgcmVnZW5lcmF0ZUdVSUQgcmVnZW5lcmF0ZSBHVUlEIGZvciBhbGwgTWV0aG9kRWxlbWVudHMgaW4KLQkgKiAgICAgICAgICAgIHRoZSBvcGVuIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXMoU3RyaW5nIG5ld0xvY2F0aW9uLCBib29sZWFuIHJlZ2VuZXJhdGVHVUlELAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBsb2FkIGFsbCB0aGUgcmVzb3VyY2VzIGluIG1lbW9yeQotCQkvLwotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdlbmVyYXRlR1VJRCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuc2V0R3VpZChVbWFVdGlsLmdlbmVyYXRlR1VJRCgpKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoYW5nZSBVUkkgb2YgYWxsIGxvYWRlZCByZXNvdXJjZXMgZm9yIG5ldyBsb2NhdGlvbgotCQkvLwotCQlVUkkgb2xkRGlyID0gVVJJLmNyZWF0ZUZpbGVVUkkobmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKQotCQkJCSsgRmlsZS5zZXBhcmF0b3IpOwotCQlVUkkgbmV3RGlyID0gVVJJLmNyZWF0ZUZpbGVVUkkobmV3TG9jYXRpb24gKyBGaWxlLnNlcGFyYXRvcik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJcmVzb3VyY2Uuc2V0VVJJKHJlc291cmNlLmdldFVSSSgpLnJlcGxhY2VQcmVmaXgob2xkRGlyLCBuZXdEaXIpKTsKLQkJfQotCi0JCS8vIGNsZWFyIHRoZSBSZXNvdXJjZU1hbmFnZXIKLQkJLy8KLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9ICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSkKLQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5jbGVhcigpOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUGVyc2lzdGVuY2VSZXNvdXJjZXMuc2F2ZUxpYnJhcnlUYXNrX25hbWUpOwotCQlzYXZlKG51bGwsIHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1bmxvYWRXaXRob3V0UmVtb3ZlKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCXJlc291cmNlLnVubG9hZFdpdGhvdXRSZW1vdmUoKTsKLQkJaWYoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJaWYobGliICE9IG51bGwpIHsKLQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkucmVtb3ZlKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW5VcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBsaXN0LmdldChpKTsKLQkJCWJvb2xlYW4gcmVtb3ZlID0gZmFsc2U7Ci0JCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5jbGVhblVwKCk6IGVtcHR5IHJlc291cmNlOiAiICsgcmVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCU1ldGhvZEVsZW1lbnQgZU9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJaWYgKGVPYmogPT0gbnVsbAotCQkJCQkJfHwgKGVPYmogIT0gbGlicmFyeSAmJiBlT2JqLmVDb250YWluZXIoKSA9PSBudWxsKSkgewotCQkJCQlpZiAoZU9iaiA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiByZXNvdXJjZSB3aXRob3V0IGFueSBNZXRob2RFbGVtZW50OiAiICsgcmVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVtb3ZlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQkvLyBzb21lIHJlc291cmNlcyBtaWdodCBiZSBsb2FkZWQgZGlyZWN0bHksIG5vdCB0aHJ1IGl0cwotCQkJCQkvLyBjb250YWluZXIuIFRoZXJlZm9yZSwgd2UgY2Fubm90IGFzc3VtZQotCQkJCQkvLyB0aGF0IGEgb2JqZWN0IHdpdGhvdXQgYSBjb250YWluZXIgaW4gYSBsb2FkZWQgcmVzb3VyY2UgaXMKLQkJCQkJLy8gYSByZW1vdmVkIG9iamVjdC4KLQkJCQkJLy8KLQkJCQkJZWxzZSBpZiAoZU9iaiAhPSBsaWJyYXJ5ICYmIGVPYmouZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5jbGVhblVwKCk6IHJlc291cmNlIHdpdGhvdXQgYSBjb250YWluZXI6ICIgKyByZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlKSB7Ci0JCQkJLy8gVGhpcyBpcyBhIHJlbW92ZWQgb2JqZWN0LiBBZGQgaXRzIHBhdGggdG8gdGhlIGxpc3QgZm9yCi0JCQkJLy8gcmVtb3ZpbmcgaXRzIGZpbGVzIGxhdGVyLgotCQkJCS8vCi0JCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGRvIGNsZWFuLXVwCi0JCS8vCi0JCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmNsZWFuVXAoKTogcmVtb3ZlZCByZXNvdXJjZXM6ICIgKyByZW1vdmVkUmVzb3VyY2VzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCi0JCQl0cnkgewotCQkJCS8vIHJlbW92ZSBSZXNvdXJjZURlc2NyaXB0b3Igb2YgdGhlIHJlbW92ZWQgcmVzb3VyY2UKLQkJCQkvLwotCQkJCWNsZWFuVXAocmVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlQWxsKHJlbW92ZWRSZXNvdXJjZXMpOwotCX0KLQkKLQkvKioKLQkgKiBQcmVwYXJlcyB0aGUgbGlicmFyeSBmb3Igc2F2aW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVTYXZlKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkvLyBjaGVjayBpZiB0aGUgbGlicmFyeSBhbHJlYWR5IGhhcyBhIFJlc291cmNlTWFuYWdlcgotCQkvLyBpZiBub3QsIGNyZWF0ZSBSZXNvdXJjZU1hbmFnZXIgZm9yIGl0Ci0JCS8vCi0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGxpYnJhcnkKLQkJCQkuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5hZGRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZihsaWJSZXNNZ3IgIT0gbnVsbCkgewotCQkJTXVsdGlGaWxlU2F2ZVV0aWwucmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKGxpYlJlc01nciwgbGlicmFyeSwKLQkJCQkJcmVzb3VyY2UuZ2V0RmluYWxVUkkoKSk7Ci0JCX0KLQotCQlMaXN0IG1vZGVscyA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlpbnQgc2l6ZSA9IG1vZGVscy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlwcmVwYXJlU2F2ZSgoTWV0aG9kUGx1Z2luKSBtb2RlbHMuZ2V0KGkpKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQljbGVhblVwKChNZXRob2RQbHVnaW4pIG1vZGVscy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhblVwKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJcGx1Z2luLCBQUk9DRVNTX1BBQ0tBR0VfUEFUSFNbaV0pOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJY2xlYW5VcFByb2Nlc3Nlcyhwa2cpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVTYXZlKE1ldGhvZFBsdWdpbiBtb2RlbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFBST0NFU1NfUEFDS0FHRV9QQVRIUy5sZW5ndGg7IGkrKykgewotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKAotCQkJCQltb2RlbCwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTW2ldKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCXByZXBhcmVTYXZlKHBrZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHByb2Nlc3MgcGFja2FnZXMgb2YgdW51c2VkIGFjdGl2aXRpZXMuCi0JICogCi0JICogQHBhcmFtIHBrZwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcFByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwa2cpIHsKLQkJTGlzdCBsaXN0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBvYmo7Ci0JCQkJTGlzdCBwYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jQ29tcC5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkJZ2V0UmVtb3ZlZFBhY2thZ2VzKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwgcGFja2FnZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYWNrYWdlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZSgoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldFJlbW92ZWRQYWNrYWdlcyhQcm9jZXNzUGFja2FnZSBwa2csCi0JCQlMaXN0IHJlbW92ZWRQYWNrYWdlcykgewotCQkvLyBmaW5kIGFjdGl2aXR5Ci0JCS8vCi0JCUFjdGl2aXR5IGFjdCA9IGdldEFjdGl2aXR5KHBrZyk7Ci0KLQkJaWYgKGFjdCA9PSBudWxsIHx8IGdldFBhcmVudChhY3QpID09IG51bGwpIHsKLQkJCS8vIEludmFsaWQgcHJvY2VzcyBwYWNrYWdlLiBJdCBkb2VzIG5vdCBjb250YWluIGFueSBhY3Rpdml0eS4KLQkJCS8vIEFkZCBpdCB0byB0aGUgbGlzdCBvZiBwYWNrYWdlcyB0byBiZSByZW1vdmVkLgotCQkJLy8KLQkJCXJlbW92ZWRQYWNrYWdlcy5hZGQocGtnKTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXRSZW1vdmVkUGFja2FnZXMoKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50LAotCQkJCQkJCXJlbW92ZWRQYWNrYWdlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCS8vIGZpbmQgYWN0aXZpdHkKLQkJLy8KLQkJQWN0aXZpdHkgYWN0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0UGFyZW50KEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQkvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKGUsIElCU0l0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCS8vIHJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5nZXRQYXJlbnQoZSk7Ci0KLQkJcmV0dXJuIFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBwcm9jZXNzIHBhY2thZ2UgZm9yIHRob3NlIGFjdGl2aXRpZXMgdGhhdCBzdGlsbCBkb24ndCBiZWxvbmcgdG8KLQkgKiBhbnkgcHJvY2VzcyBwYWNrYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShQcm9jZXNzUGFja2FnZSBwa2cpIHsKLQkJTGlzdCBsaXN0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcHJlcGFyZVNhdmUoKFByb2Nlc3NDb21wb25lbnQpIG9iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlcGFyZVNhdmUoUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCkgewotCQlQcm9jZXNzIHByb2MgPSBwcm9jQ29tcC5nZXRQcm9jZXNzKCk7Ci0JCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCS8vIGFzc29jaWF0ZUFsbEFkYXB0ZXJzKHByb2MpOwotCQkJcHJlcGFyZVNhdmUocHJvYyk7Ci0KLQkJCWNsZWFuVXBEYW5nbGluZ0Rlc2NyaXB0b3JzKHByb2NDb21wKTsKLQotCQkJTGlzdCBkYW5nbGluZ1BrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHByb2NDb21wLmdldENoaWxkUGFja2FnZXMoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQ7Ci0JCQkJCXJlb3JnYW5pemUocGtnLCBkYW5nbGluZ1BrZ3MpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gY2xlYW4gdXAgZGFuZ2xpbmcgUHJvY2Vzc1BhY2thZ2VzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGFuZ2xpbmdQa2dzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWNsZWFuVXAoKFByb2Nlc3NQYWNrYWdlKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8vIC8qKgotCS8vICogQHBhcmFtIGFjdGl2aXR5Ci0JLy8gKi8KLQkvLyBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc29jaWF0ZUFsbEFkYXB0ZXJzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPQotCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JLy8gYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0aXZpdHksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3Rpdml0eSkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCS8vIGFzc29jaWF0ZUFsbEFkYXB0ZXJzKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByZXBhcmVTYXZlKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQlMaXN0IGVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQkvLyBhZGQgbmV3IGRlc2NyaXB0b3JzIGFuZCBvdGhlciBub24tYWN0aXZpdHkgYnJlYWtkb3duIGVsZW1lbnRzIG9mIHRoZQotCQkvLyBhY3Rpdml0eSB0byBpdHMgcHJvY2VzcyBwYWNrYWdlCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSAmJiBlbGVtZW50LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJcGFyZW50UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZCgoUHJvY2Vzc0VsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIG5ldyBXb3JrT3JkZXIgb2JqZWN0cyBvciByZW1vdmUgdW51c2VkIFdvcmtPcmRlciBvYmplY3RzIG9mIHRoaXMKLQkJLy8gYWN0aXZpdHkKLQkJLy8KLQkJZm9yIChXb3JrT3JkZXIgd29ya09yZGVyIDogYWN0aXZpdHkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKSkgewotCQkJaWYgKHdvcmtPcmRlci5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpICE9IG51bGwKLQkJCQkJCSYmIGdldFBhcmVudCh3b3JrT3JkZXIuZ2V0UHJlZCgpKSAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudFBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQod29ya09yZGVyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpID09IG51bGwKLQkJCQkJCXx8IGdldFBhcmVudCh3b3JrT3JkZXIuZ2V0UHJlZCgpKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJJbnZhbGlkIFdvcmtPcmRlcjogIiArIHdvcmtPcmRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwYXJlbnRQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlKHdvcmtPcmRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlZCB1bnVzZWQgZGlhZ3JhbXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFyZW50UGtnLmdldERpYWdyYW1zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGJyaWRnZSkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpICYmIGdldFBhcmVudCgoQWN0aXZpdHkpIGVsZW1lbnQpID09IG51bGwpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW50IHNpemUgPSBlbGVtZW50cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgZSA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJaWYgKGFjdC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQlwa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3QpOwotCQkJCQlMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KGopOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQlkZXNjcmlwdG9ycy5hZGQob2JqKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKGRlc2NyaXB0b3JzKTsKLQotCQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3MgcGFja2FnZSBjcmVhdGVkIGZvciBhY3Rpdml0eToKLQkJCQkJLy8gJyIgKyBhY3QuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQl9Ci0JCQkJcHJlcGFyZVNhdmUoYWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcERhbmdsaW5nRGVzY3JpcHRvcnMoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJYm9vbGVhbiByZW1vdmUgPSBmYWxzZTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMoCi0JCQkJCQkJKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5pc0VtcHR5KCkpIHsKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoCi0JCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJaWYgKCgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFN1cGVyVGVhbSgpID09IG51bGwpIHsKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChyZW1vdmUpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgcHJvY2VzcyBwYWNrYWdlcyB0byB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIHRyZWUgaWYgbmVlZGVkLgotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKiBAcGFyYW0gZGFuZ2xpbmdQa2dzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlb3JnYW5pemUoUHJvY2Vzc1BhY2thZ2UgcGtnLCBMaXN0IGRhbmdsaW5nUGtncykgewotCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShwa2cpOwotCQlpZiAoYWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBwYWNrYWdlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhY3Rpdml0eSdzIG5hbWUKLQkJLy8KLQkJaWYgKCFwa2cuZ2V0TmFtZSgpLmVxdWFscyhhY3QuZ2V0TmFtZSgpKSkgewotCQkJcGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgY29udGFpbmVyIG9mIHBrZyBpcyBhY3R1YWxseSBob2xkaW5nIHRoZSBwYXJlbnQgYWN0aXZpdHkKLQkJLy8gb2YgYWN0Ci0JCS8vCi0JCUVPYmplY3QgcGFyZW50QWN0ID0gKEVPYmplY3QpIGdldFBhcmVudChhY3QpOwotCi0JCWlmIChwYXJlbnRBY3QgPT0gbnVsbCkgewotCQkJLy8gY2xlYW5VcFJlc291cmNlRGVzY3JpcHRvcnMocGtnKTsKLQkJCS8vIGNsZWFuVXAocGtnKTsKLQkJCS8vIHJldHVybjsKLQkJCWRhbmdsaW5nUGtncy5hZGQocGtnKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRBY3QgIT0gZ2V0QWN0aXZpdHkoKFByb2Nlc3NQYWNrYWdlKSBwa2cuZUNvbnRhaW5lcigpKSkgewotCQkJLy8gbW92ZSB0aGUgcGFja2FnZSB0byB0aGUgcmlnaHQgbG9jYXRpb24sIHVuZGVyIHRoZSBwcm9jZXNzIHBhY2thZ2UKLQkJCS8vIG9mIHBhcmVudEFjdAotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgcGFyZW50QWN0LmVDb250YWluZXIoKTsKLQkJCXBhcmVudFBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCX0KLQotCQlpZiAocGFyZW50QWN0ICE9IG51bGwpIHsKLQkJCWNsZWFuVXBEYW5nbGluZ0Rlc2NyaXB0b3JzKHBrZyk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZW9yZ2FuaXplKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwgZGFuZ2xpbmdQa2dzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBFT2JqZWN0PiBnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkgewotCQlpZiAoZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCA9PSBudWxsKSB7Ci0JCQlndWlkVG9NZXRob2RFbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFT2JqZWN0PigpOwotCQl9Ci0JCXJldHVybiBndWlkVG9NZXRob2RFbGVtZW50TWFwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbCNlTm90aWZ5KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmVOb3RpZnkobm90aWZpY2F0aW9uKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmxvZygiRVJST1Igbm90aWZ5aW5nIGNoYW5nZXM6IHJlc291cmNlU2V0PSIgKyB0aGlzICsgIiwgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWFya2VyKEV4Y2VwdGlvbiBlKSB7Ci0JCXRyeSB7Ci0JCQkvLyBpbnNlcnQgcHJvYmxlbSBtYXJrZXIKLQkJCS8vCi0JCQltYXJrZXJNYW5hbmdlci5ub3RpZnlFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXgpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2FkaW5nKGJvb2xlYW4gYikgewotCQlsb2FkaW5nID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSUV4Y2VwdGlvbkNvbGxlY3RvciNjb2xsZWN0KGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChsb2FkaW5nUmVzb3VyY2VNYW5hZ2VyVHJlZSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBSZXNvbHZlRXhjZXB0aW9uKSB7Ci0JCQkJaWYgKCgoUmVzb2x2ZUV4Y2VwdGlvbikgZSkuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBNdWx0aUZpbGVJT0V4Y2VwdGlvbikgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlhZGRNYXJrZXIoZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIjcHJveHlSZXNvbHZlZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKE9iamVjdCBwcm94eSwgT2JqZWN0IHJlc29sdmVkKSB7Ci0JCWlmKHJlc29sdmVkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKHJlc29sdmVkKTsKLQkJCWlmIChndWlkICE9IG51bGwpIHsKLQkJCQlnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkucHV0KGd1aWQsIChFT2JqZWN0KSByZXNvbHZlZCk7Ci0JCQl9Ci0JCX0KLQkJbWFya2VyTWFuYW5nZXIucHJveHlSZXNvbHZlZChwcm94eSwgcmVzb2x2ZWQpOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RCeUdVSUQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGd1aWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChFT2JqZWN0IHJlc29sdmVyLCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQkvLyBsb25nIHN0YXJ0OwotCQkvLyBpZihNdWx0aUZpbGVTYXZlVXRpbC5QUk9GSUxFKSB7Ci0JCS8vIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIH0KLQotCQlVUkkgbm9ybWFsaXplZCA9ICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSkubm9ybWFsaXplKAotCQkJCXVyaSwgcmVzb2x2ZXIpOwotCQlpZiAobm9ybWFsaXplZCA9PSBudWxsKSB7Ci0JCQkvLyB3b3JrLWFyb3VuZCB0byBsb29rIHVwIGZvciBvYmplY3QgYnkgaXRzIEdVSUQgaW4gY2FzZSBpdCBoYWQgYmVlbgotCQkJLy8gbW92ZWQgdG8gb3RoZXIgcmVzb3VyY2UKLQkJCS8vCi0JCQlTdHJpbmcgZ3VpZCA9IHVyaS5mcmFnbWVudCgpOwotCQkJRU9iamVjdCBlT2JqZWN0ID0gZ2V0RU9iamVjdEJ5R1VJRChndWlkKTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCX0KLQotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLm5vcm1hbGl6ZVVSSUVycm9yX21zZywKLQkJCQkJdXJpKTsKLQkJCXRocm93IG5ldyBVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24odXJpLCBtc2cpOwotCQl9Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2Uobm9ybWFsaXplZC50cmltRnJhZ21lbnQoKSwgbG9hZE9uRGVtYW5kKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmcmFnbWVudCA9IG5vcm1hbGl6ZWQuZnJhZ21lbnQoKTsKLQkJCWlmIChmcmFnbWVudCA9PSBudWxsIHx8IGZyYWdtZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJfQotCQkJRU9iamVjdCBlT2JqZWN0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdChmcmFnbWVudCk7Ci0JCQlpZiAoZU9iamVjdCA9PSBudWxsICYmICFmcmFnbWVudC5lcXVhbHModXJpLmF1dGhvcml0eSgpKSkgewotCQkJCS8vIHdvcmstYXJvdW5kIHRvIGxvb2sgdXAgZm9yIG9iamVjdCBieSBpdHMgR1VJRCBpbiBjYXNlIGl0IGhhZAotCQkJCS8vIGJlZW4gbW92ZWQKLQkJCQkvLwotCQkJCXJldHVybiBnZXRFT2JqZWN0QnlHVUlEKGZyYWdtZW50KTsKLQkJCX0KLQkJCXJldHVybiBlT2JqZWN0OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBpZihNdWx0aUZpbGVTYXZlVXRpbC5QUk9GSUxFKSB7Ci0JCS8vCQkJCi0JCS8vIH0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhjZXB0aW9ucy4KLQkvLyAqLwotCS8vIHB1YmxpYyBMaXN0IGdldEV4Y2VwdGlvbnMoKSB7Ci0JLy8gcmV0dXJuIGV4Y2VwdGlvbnM7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzKSB7Ci0JCWludCBtYXggPSBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSAtIDE7Ci0JCWlmIChtYXggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQlIYXNoU2V0IGxvYWRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSkuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQllbGVtZW50LmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0cyB0aGUgbmV3bHkgbG9hZGVkIGVsZW1lbnRzIHRvIGxvYWQgdGhlaXIgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCS8vCi0JCQlsb2FkZWRFbGVtZW50cy5hZGRBbGwoZWxlbWVudHMpOwotCQkJZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS52YWx1ZXMoKSk7Ci0JCQllbGVtZW50cy5yZW1vdmVBbGwobG9hZGVkRWxlbWVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzLCBTZXQgZGVsZXRlZEdVSURzKSB7Ci0JCWludCBtYXggPSBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSAtIDE7Ci0JCWlmIChtYXggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQlIYXNoU2V0IGxvYWRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCQlNdWx0aVJlc291cmNlRU9iamVjdCBtckVPYmplY3QgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KTsKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgb3Bwb3NpdGVGZWF0dXJlcwotCQkJCQkJCQkuZ2V0KGkpKTsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQkJCQlpZiAoZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJCQkJaWYgKGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBlbGVtZW50Ci0JCQkJCQkJCQkJLmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQlib29sZWFuIHJlc29sdmUgPSBmYWxzZTsKLQkJCQkJCQkJCWNoZWNrX3Jlc29sdmU6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Ci0JCQkJCQkJCQkJCS5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGUgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyYXRvcgotCQkJCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoZS5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJCQkJCVN0cmluZyBndWlkID0gZS5lUHJveHlVUkkoKQotCQkJCQkJCQkJCQkJCS5mcmFnbWVudCgpOwotCQkJCQkJCQkJCQlpZiAoZGVsZXRlZEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJCQkJCQlyZXNvbHZlID0gdHJ1ZTsKLQkJCQkJCQkJCQkJCWJyZWFrIGNoZWNrX3Jlc29sdmU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAocmVzb2x2ZSkgewotCQkJCQkJCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBkZWxldGVkRWxlbWVudHMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QKLQkJCQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBkZWxldGVkR1VJRHMuY29udGFpbnMoKChNZXRob2RFbGVtZW50KSBvKS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKG8pOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWZvciAoT2JqZWN0IGUgOiBkZWxldGVkRWxlbWVudHMpIHsKLQkJCQkJCQkJCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3Qub3Bwb3NpdGVBZGQob3Bwb3NpdGVGZWF0dXJlLCBlKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0JCQkJCQkJCQkJCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZUZlYXR1cmUsIGZhbHNlKTsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgZSA9IChJbnRlcm5hbEVPYmplY3QpIHZhbHVlOwotCQkJCQkJCQkJaWYgKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJCVN0cmluZyBndWlkID0gZS5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQkJCQkJCQkJCWlmIChkZWxldGVkR1VJRHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQkJCQkJT2JqZWN0IG8gPSBlbGVtZW50LmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCQkJCQlpZihvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5vcHBvc2l0ZUFkZChvcHBvc2l0ZUZlYXR1cmUsIG8pOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQkJbXJFT2JqZWN0LmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIG8pOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gZ2V0cyB0aGUgbmV3bHkgbG9hZGVkIGVsZW1lbnRzIHRvIGxvYWQgdGhlaXIgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCS8vCi0JCQlsb2FkZWRFbGVtZW50cy5hZGRBbGwoZWxlbWVudHMpOwotCQkJZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS52YWx1ZXMoKSk7Ci0JCQllbGVtZW50cy5yZW1vdmVBbGwobG9hZGVkRWxlbWVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVW5yZXNvbHZlZFByb3h5KCkgewotCQlyZXR1cm4gbWFya2VyTWFuYW5nZXIuaGFzVW5yZXNvbHZlZFByb3h5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRVUklUb1RlbXBVUklNYXAoKSB7Ci0JCWlmIChVUklUb1RlbXBVUklNYXAgPT0gbnVsbCkgewotCQkJVVJJVG9UZW1wVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCXJldHVybiBVUklUb1RlbXBVUklNYXA7Ci0JfQotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIgZ2V0TWFya2VyTWFuYW5nZXIoKSB7Ci0JCXJldHVybiBtYXJrZXJNYW5hbmdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCWlmKCFyZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVtdIHJlc291cmNlQXJyYXkgPSBuZXcgUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV07Ci0JCQlyZXNvdXJjZXMudG9BcnJheShyZXNvdXJjZUFycmF5KTsKLQkJCWNoZWNrTW9kaWZ5KHJlc291cmNlQXJyYXksIFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkvKk1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSovKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjY2hlY2tNb2RpZnkob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVtdLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kaWZ5KFJlc291cmNlW10gcmVzb3VyY2VzLCBPYmplY3QgY29udGV4dCkgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiB7CQkKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuZG9DaGVja01vZGlmeShBcnJheXMuYXNMaXN0KHJlc291cmNlcykpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjY2hlY2tNb2RpZnkoamF2YS51dGlsLkNvbGxlY3Rpb248RU9iamVjdD4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxFT2JqZWN0PiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSGFzaFNldCBwYXRoU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZU9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG8uZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0JCQkJaWYoIW1mUmVzb3VyY2UuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gbWZSZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJcGF0aFNldC5hZGQocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHBhdGhTZXQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbcGF0aFNldC5zaXplKCldOwotCQlwYXRoU2V0LnRvQXJyYXkocGF0aHMpOwotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRocywgY29udGV4dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRQZXJzaXN0ZXIoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1bmxvYWQoUmVzb3VyY2UgcmVzb3VyY2UsIE1hcCBvcHRpb25zKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXR1cm4gdW5sb2FkV2l0aG91dFJlbW92ZSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmxvYWQoKSB7Ci0JCXJlc2V0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRGaXJzdE1ldGhvZExpYnJhcnkoKQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEZpcnN0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2dldE1ldGhvZExpYnJhcmllcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kTGlicmFyaWVzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJaWYobGliID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGxpYik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNsb2FkTWV0aG9kTGlicmFyaWVzKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgbG9hZE1ldGhvZExpYnJhcmllcyhVUkkgdXJpLCBNYXA8PywgPz4gcGFyYW1ldGVycykgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlsb2FkTGlicmFyeSh1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillOwotCQkJfQotCQkJdGhyb3cgbmV3IExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCN1bmxvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5sb2FkKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVubG9hZGVkKChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3JlbG9hZE9iamVjdHMoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gcmVsb2FkT2JqZWN0cyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSVJlc291cmNlIHdzUmVzKSB7Ci0JCUlQYXRoIHBhdGggPSB3c1Jlcy5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gcGF0aCAhPSBudWxsID8gUGVyc2lzdGVuY2VVdGlsLmdldFJlc291cmNlKHBhdGgsIHRoaXMpIDogbnVsbDsKLQl9Ci0KLS8vCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDb250YWluZWRSZXNvdXJjZXMoSVJlc291cmNlIHdzUmVzKSB7Ci0vLwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CQkKLS8vCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZE5ld1Jlc291cmNlcygpIHsKLQkJcmV0dXJuIGxvYWRDb25maWd1cmF0aW9ucygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVMaWJyYXJ5TW92ZWQoU3RyaW5nIG5ld0ZvbGRlcikgewotCQlQZXJzaXN0ZW5jZVV0aWwucmVwbGFjZVVSSVByZWZpeChuZXcgQXJyYXlMaXN0PFJlc291cmNlPihnZXRSZXNvdXJjZXMoKSksIGxpYkZvbGRlclBhdGgudG9PU1N0cmluZygpLCBuZXdGb2xkZXIpOwotCQkKLQkJLy8gY2xlYXIgY2FjaGVkIHJlc29sdmVkIFVSSSBpbiBhbGwgUmVzb3VyY2VEZXNjcmlwdG9ycwotCQkvLwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyZXNNZ3IsIGZhbHNlKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgb2JqZWN0OwotCQkJCXJldHVybiByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVJlc291cmNlTWFuYWdlciBtZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmb3IoUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgOiBtZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpKSB7Ci0JCQkJcmVzRGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVTYXZlVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVTYXZlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzg2MzJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIHJvdXRpbmVzIGZvciBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aUZpbGVTYXZlVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01PREVMX0ZJTEVOQU1FID0gIm1vZGVsLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSA9ICJjb250ZW50LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BMVUdJTl9FWFBPUlRfRklMRU5BTUUgPSAiZXhwb3J0LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUExVR0lOX01PREVMX0ZJTEVOQU1FID0gInBsdWdpbi54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZJTEVfRVhURU5TSU9OID0gIi54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX0ZJTEVfRVhURU5TSU9OID0gInVtYSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTl9QQVRIID0gImNhcGFiaWxpdHlwYXR0ZXJucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1NfUEFUSCA9ICJkZWxpdmVyeXByb2Nlc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfQ09OVFJJQlVUSU9OX1BBVEggPSAicHJvY2Vzc2NvbnRyaWJ1dGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSA9ICJjb25maWd1cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9GSUxFID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKLQkJCSJ5eU1NZGRISG1tc3MuUyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lLmluZGV4T2YoJy8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJ1xcJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJzonKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyonKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPycpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignIicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc8JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCc+JykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJ3wnKSAhPSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKFN0cmluZy52YWx1ZU9mKGUuZ2V0TmFtZSgpKSk7Ci0JCWZvciAoZSA9IChNZXRob2RFbGVtZW50KSAoKEVPYmplY3QpIGUpLmVDb250YWluZXIoKTsgZSAhPSBudWxsOyBlID0gKE1ldGhvZEVsZW1lbnQpICgoRU9iamVjdCkgZSkKLQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQlzdHJCdWZmLmluc2VydCgwLCBTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkgKyAiID4gIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RyQnVmZi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURpck5hbWUoTWV0aG9kRWxlbWVudCBvYmopIHsKLQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQlpZiAoaXNWYWxpZEZpbGVOYW1lKG5hbWUpKQotCQkJcmV0dXJuIG5hbWU7Ci0JCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5pbnZhbGlkTmFtZUVycm9yX21zZywgbmFtZSksIG9iaik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IHJlc29sdmUoRU9iamVjdCBwcm94eSkgewotCQlpZiAoIShwcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkpCi0JCQlyZXR1cm4gcHJveHk7Ci0JCUludGVybmFsRU9iamVjdCBvYmogPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm94eTsKLQkJaWYgKG9iai5lUHJveHlVUkkoKSA9PSBudWxsKQotCQkJcmV0dXJuIHByb3h5OwotCQlYTUlSZXNvdXJjZUltcGwgcmVzID0gbmV3IFhNSVJlc291cmNlSW1wbChvYmouZVByb3h5VVJJKCkpOwotCQl0cnkgewotCQkJcmVzLmxvYWQobnVsbCk7Ci0JCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0Jc3RhdGljIFJlc291cmNlIHNhdmUoRU9iamVjdCBvLCBVUkkgdXJpLCBNYXAgb3B0aW9ucykgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG8uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gc2F2ZShyZXNvdXJjZVNldCwgbywgdXJpLCBvcHRpb25zKTsKLQotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KQotCQkJCQkuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFKTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIEJvb2xlYW4udmFsdWVPZihzdHIpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkvLyBub3RpZnkgUmVmcmVzaEpvYiB0aGUgdGhpcyByZXNvdXJjZSBpcyBzYXZlZCBzbyBpdCB3aWxsIG5vdCBiZQotCQkJLy8gcmVsb2FkZWQgYWZ0ZXIgcmVmcmVzaGluZyBpdAotCQkJLy8KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvdXJjZVNhdmVkKHJlc291cmNlKTsKLQotCQkJLy8gcmVmcmVzaCB0aGUgbmV3bHkgY3JlYXRlZCByZXNvdXJjZSBzbyBpdCBpcyBpbiBzeW5jaCB3aXRoIHRoZQotCQkJLy8gd29ya3NwYWNlCi0JCQkvLwotCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHJlc291cmNlKTsKLQkJfQotCi0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2F2ZVRvZ2V0aGVyKE1hcCBvcHRpb25zLCBPYmplY3Qgb2JqKSB7Ci0JCVNldCBzYXZlVG9nZXRoZXJDbGFzc2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuU0FWRV9UT0dFVEhFUl9DTEFTU19TRVQpOwotCQlpZiAoc2F2ZVRvZ2V0aGVyQ2xhc3NlcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlVG9nZXRoZXJDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbHMgPSAoRUNsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBnaXZlbiByZXNvdXJjZSB3aGlsZSBzdGlsbCBwcmVzZXJ2aW5nCi0JICogb2JqZWN0J3MgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gbwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG8oUmVzb3VyY2UgcmVzb3VyY2UsIE11bHRpUmVzb3VyY2VFT2JqZWN0IG8pIHsKLQkJQmFzaWNFTGlzdCBjb250ZW50cyA9ICgoQmFzaWNFTGlzdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7Ci0JCWlmIChjb250ZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIHRoaXMgd2lsbCBmbGFnIHJlc291cmNlIGFzIGxvYWRlZAotCQkJLy8KLQkJCWNvbnRlbnRzLmNsZWFyKCk7Ci0KLQkJCWNvbnRlbnRzLnNldERhdGEoMSwgbmV3IE9iamVjdFtdIHsgbyB9KTsKLQkJfSBlbHNlIHsKLQkJCU9iamVjdFtdIGRhdGEgPSBjb250ZW50cy50b0FycmF5KCk7Ci0JCQlPYmplY3RbXSBuZXdEYXRhID0gbmV3IE9iamVjdFtkYXRhLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCQluZXdEYXRhW2RhdGEubGVuZ3RoXSA9IG87Ci0JCQljb250ZW50cy5zZXREYXRhKG5ld0RhdGEubGVuZ3RoLCBuZXdEYXRhKTsKLQkJfQotCQlvLmVTZXRSZXNvdXJjZSgoUmVzb3VyY2UuSW50ZXJuYWwpIHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhIG5ldyBjb250YWluZWQgRU9iamVjdCBpbiBpdHMgb3duIG5ldyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqLwotCXByaXZhdGUgc3RhdGljIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LAotCQkJRU9iamVjdCBvLCBVUkkgdXJpLCBNYXAgb3B0aW9ucykgewotCQlyZXR1cm4gc2F2ZShyZXNvdXJjZVNldCwgbywgdXJpLCBvcHRpb25zLCB0cnVlKTsKLQl9Ci0JCi0Jc3RhdGljIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LAotCQkJRU9iamVjdCBvLCBVUkkgdXJpLCBNYXAgb3B0aW9ucywgYm9vbGVhbiByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJLy8gRGV0YWNoIHRoZSBvYmplY3QgZnJvbSBjb250YWluZXIgcmVzb3VyY2UKLQkJLy8KLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgY3VycmVudFJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbwotCQkJCS5lUmVzb3VyY2UoKTsKLQotCQlpZiAoY3VycmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCWN1cnJlbnRSZXNvdXJjZS5kZXRhY2hlZChvKTsKLQkJfQotCi0JCUxpc3QgbmV3UmVzb3VyY2VEZXNjcmlwdG9ycyA9IG51bGw7Ci0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlcyA9IG51bGw7Ci0JCWlmIChjYW5TYXZlVG9nZXRoZXIob3B0aW9ucywgbykpIHsKLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCBtZlJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KTsKLQotCQkJLy8gaWYgdGhlIHVyaSBoYXMgYSB0ZW1wb3JhcnkgVVJJLCB1c2UgaXQgaW5zdGVhZCB0byBsb2NhdGUgdGhlCi0JCQkvLyByZXNvdXJjZSB0aGF0IGlzIGluIHByb2Nlc3Mgb2Ygc2F2aW5nCi0JCQkvLwotCQkJVVJJIHRlbXBVUkkgPSAoVVJJKSBtZlJlc291cmNlU2V0LmdldFVSSVRvVGVtcFVSSU1hcCgpLmdldCh1cmkpOwotCQkJaWYgKHRlbXBVUkkgIT0gbnVsbCkgewotCQkJCXVyaSA9IHRlbXBVUkk7Ci0JCQl9Ci0KLQkJCXJlcyA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG1mUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCWlmICghcmVzLmdldENvbnRlbnRzKCkuY29udGFpbnMobykpIHsKLQkJCQkJaWYgKHJlcy5nZXRGaW5hbFVSSSgpID09IHJlcy5nZXRVUkkoKSkgewotCQkJCQkJaWYgKE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQob3B0aW9ucykpIHsKLQkJCQkJCQkvLyBub3QgYSB0ZW1wIGZpbGUgb2YgZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0JCQkJCQkJLy8gdHJhbnNhY3Rpb24KLQkJCQkJCQkvLyBjaGVjayBmb3Igd3JpdGVhYmxlCi0JCQkJCQkJLy8KLQkJCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja01vZGlmeShyZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJYWRkVG8ocmVzLCBtckVPYmopOwotCi0JCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcikgewotCQkJCQkJCS8vIHJlZ2lzdGVyIHRoaXMgbmV3IG9iamVjdCB3aXRoIFJlc291cmNlTWFuYWdlcgotCQkJCQkJCS8vCi0JCQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihvLAotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQkJCWRlc2MgPSByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLCBvLCByZXMKLQkJCQkJCQkJCS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJCQlpZiAoZGVzYyAhPSBudWxsICYmIG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJCQltZlJlc291cmNlU2V0LnNhdmUocmVzLCBvcHRpb25zLCBmYWxzZSk7Ci0KLQkJCQkJCXJlcy5hdHRhY2hlZEFsbChvKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHJvbGxiYWNrCi0JCQkJCQkvLwotCi0JCQkJCQkvLyByZW1vdmUgdGhpcyBvYmplY3QgZnJvbSB0aGUgcmVzb3VyY2UKLQkJCQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShtckVPYmopOwotCQkJCQkJbXJFT2JqLmVTZXRSZXNvdXJjZSgoUmVzb3VyY2UuSW50ZXJuYWwpIG51bGwpOwotCi0JCQkJCQkvLyByZW1vdmUgdGhlIGNyZWF0ZWQgUmVzb3VyY2VEZXNjcmlwdG9yCi0JCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkZXNjKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gcmUtYXR0YWNoIHRvIGNvbnRhaW5lciByZXNvdXJjZQotCQkJCQkJaWYgKGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJY3VycmVudFJlc291cmNlLmF0dGFjaGVkKG8pOwotCQkJCQkJfQotCi0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZXM7Ci0JCQl9Ci0JCX0KLQotCQlyZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlhZGRUbyhyZXMsIG1yRU9iaik7Ci0JCWlmKG1yRU9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJYWRkUmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCX0KLQotCQlNYXAgb2JqVG9Db250YWluZXJNYXAgPSBudWxsOwotCQl0cnkgewotCQkJaWYocmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJbmV3UmVzb3VyY2VEZXNjcmlwdG9ycyA9IHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXMsCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCX0KLQotCQkJLy8gYmFjayB1cCB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgYW5kIHNldCBjb250ZW50IG9iamVjdCdzCi0JCQkvLyBjb250YWluZXIgdG8gbnVsbAotCQkJLy8KLQkJCW9ialRvQ29udGFpbmVyTWFwID0gcmVtb3ZlQ29udGFpbmVycyhyZXMpOwotCi0JCQlyZXMuc2F2ZShvcHRpb25zKTsKLQotCQkJcmVzLmF0dGFjaGVkQWxsKG8pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQotCQkJLy8gcm9sbGJhY2sKLQkJCS8vCi0KLQkJCS8vIHJlbW92ZSB0aGUgZmFpbGVkIHJlb3VzcmNlIGZyb20gdGhlIHJlc291cmNlIHNldAotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlcyk7Ci0JCQltckVPYmouZVNldFJlc291cmNlKChSZXNvdXJjZS5JbnRlcm5hbCkgbnVsbCk7Ci0KLQkJCS8vIHJlbW92ZSB0aGUgY3JlYXRlZCBSZXNvdXJjZURlc2NyaXB0b3JzCi0JCQlpZihuZXdSZXNvdXJjZURlc2NyaXB0b3JzICE9IG51bGwgJiYgIW5ld1Jlc291cmNlRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3UmVzb3VyY2VEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZSgoRU9iamVjdCkgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmUtYXR0YWNoIHRvIGNvbnRhaW5lciByZXNvdXJjZQotCQkJaWYgKGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudFJlc291cmNlLmF0dGFjaGVkKG8pOwotCQkJfQotCi0JCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgZm9yIHRoZSBjb250ZW50IG9iamVjdHMKLQkJCS8vCi0JCQlyZXN0b3JlQ29udGFpbmVycyhyZXMsIG9ialRvQ29udGFpbmVyTWFwKTsKLQkJfQotCi0JCWlmKHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcikgewotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGFkZE5ld1Jlc291cmNlTWFuYWdlcihyZXMpOwotCQkJaWYgKHJlc01nciA9PSBudWxsKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJLy8gY3JlYXRlIG5ldyBSZXNvdXJjZU1hbmFnZXIgZm9yIG5ldyBNZXRob2RQbHVnaW4KLQkJCQkJLy8KLQkJCQkJcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKG8sIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXMudXBkYXRlVGltZVN0YW1wcygpOwotCi0JCXJldHVybiByZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHJlbW92ZUNvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaW50IHNpemUgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJTWFwIG9ialRvQ29udGFpbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb3VyY2UKLQkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KGkpOwotCQkJSW50ZXJuYWxFT2JqZWN0IGNvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpIG11bHRpUmVzRU9iagotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJb2JqVG9Db250YWluZXJNYXAucHV0KG11bHRpUmVzRU9iaiwgY29udGFpbmVyKTsKLQkJCQltdWx0aVJlc0VPYmouZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIG11bHRpUmVzRU9iagotCQkJCQkJLmVDb250YWluZXJGZWF0dXJlSUQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ialRvQ29udGFpbmVyTWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRhaW5lcnMgb2Ygb2JqZWN0cyBpbiByZXNvdXJjZSdzIGNvbnRlbnRzCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBtYXAgb2Ygb2JqZWN0IHRvIGNvbnRhaW5lciBlbnRyaWVzCi0JICovCi0Jc3RhdGljIE1hcCBnZXRDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWludCBzaXplID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBtdWx0aVJlc0VPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc291cmNlCi0JCQkJCS5nZXRDb250ZW50cygpLmdldChpKTsKLQkJCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBtdWx0aVJlc0VPYmoKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCW9ialRvQ29udGFpbmVyTWFwLnB1dChtdWx0aVJlc0VPYmosIGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ialRvQ29udGFpbmVyTWFwOwotCi0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIGNvbnRhaW5lcnMgb2YgdGhlIG9iamVjdHMgaW4gcmVzb3VyY2UncyBjb250ZW50cyB0aGF0Ci0JICogcHJldmlvdXNseSBzYXZlZCBpbiBhIG1hcCByZXR1cm5lZCBmcm9tIGdldENvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0JICogb3IgcmVtb3ZlQ29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSkKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gb2JqVG9Db250YWluZXJNYXAKLQkgKiBAc2VlICNnZXRDb250YWluZXJzKFJlc291cmNlKQotCSAqIEBzZWUgI3JlbW92ZUNvbnRhaW5lcnMoUmVzb3VyY2UpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXN0b3JlQ29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSwKLQkJCU1hcCBvYmpUb0NvbnRhaW5lck1hcCkgewotCQlpbnQgc2l6ZSA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXVsdGlSZXNFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvdXJjZQotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoaSk7Ci0JCQlJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkgb2JqVG9Db250YWluZXJNYXAKLQkJCQkJLmdldChtdWx0aVJlc0VPYmopOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJbXVsdGlSZXNFT2JqLmVCYXNpY1NldENvbnRhaW5lcihjb250YWluZXIsIG11bHRpUmVzRU9iagotCQkJCQkJLmVDb250YWluZXJGZWF0dXJlSUQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tNb2RpZnkoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJY2hlY2tNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlc291cmNlKSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgZG9DaGVja01vZGlmeShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gcGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJLy8gc2tpcCBjaGVja2luZyBvbiByZXNvdXJjZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBzYXZlZCB0byBhIHRlbXBvcmFyeQotCQkJLy8gZmlsZQotCQkJLy8KLQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsICYmICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXBhdGhMaXN0LmFkZChGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKTsKLQkJfQotCQlpZighcGF0aExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbcGF0aExpc3Quc2l6ZSgpXTsKLQkJCXBhdGhMaXN0LnRvQXJyYXkocGF0aHMpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrTW9kaWZ5KHBhdGhzLAotCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpLypNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkqLyk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgbXNnID0gVW1hVXRpbC5nZXRNZXNzYWdlKHN0YXR1cyk7Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCW1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vZGlmeUZpbGVFcnJvcl9tc2csIEFycmF5cwotCQkJCQkJCS5hc0xpc3QocGF0aHMpKTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlNYXA8SUxpYnJhcnlSZXNvdXJjZVNldCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+IGxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAgPSBuZXcgSGFzaE1hcDxJTGlicmFyeVJlc291cmNlU2V0LCBDb2xsZWN0aW9uPFJlc291cmNlPj4oKTsKLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gb3RoZXJSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiBjb2xsZWN0aW9uID0gbGliUmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5nZXQocmVzb3VyY2VTZXQpOwotCQkJCWlmKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJCQljb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQkJbGliUmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5wdXQoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0LCBjb2xsZWN0aW9uKTsJCQkJCQotCQkJCX0KLQkJCQljb2xsZWN0aW9uLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvdGhlclJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWlmKCFsaWJSZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8SUxpYnJhcnlSZXNvdXJjZVNldCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+PiBpdGVyID0gbGliUmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeTxJTGlicmFyeVJlc291cmNlU2V0LCBDb2xsZWN0aW9uPFJlc291cmNlPj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZW50cnkuZ2V0S2V5KCk7CQkJCi0JCQkJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gbmV3IFJlc291cmNlW2VudHJ5LmdldFZhbHVlKCkuc2l6ZSgpXTsKLQkJCQllbnRyeS5nZXRWYWx1ZSgpLnRvQXJyYXkocmVzb3VyY2VBcnJheSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2VTZXQuY2hlY2tNb2RpZnkocmVzb3VyY2VBcnJheSwgUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKS8qTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKi8pOwotCQkJCX0gY2F0Y2ggKExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKCFvdGhlclJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWRvQ2hlY2tNb2RpZnkob3RoZXJSZXNvdXJjZXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja091dE9mU3luY2goQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzLCBNYXAgc2F2ZU9wdGlvbnMpIHsKLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9DaGVja091dE9mU3luY2g7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IG92ZXJ3cml0YWJsZVJlc291cmNlcyA9IChDb2xsZWN0aW9uPFJlc291cmNlPikgc2F2ZU9wdGlvbnMuZ2V0KAotCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5PUFRJT05TX09WRVJXUklUQUJMRV9SRVNPVVJDRVMpOwkJCQkKLQkJaWYob3ZlcndyaXRhYmxlUmVzb3VyY2VzICE9IG51bGwgJiYgIW92ZXJ3cml0YWJsZVJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCXJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4ocmVzb3VyY2VzKTsKLQkJCXJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoLnJlbW92ZUFsbChvdmVyd3JpdGFibGVSZXNvdXJjZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzb3VyY2VzVG9DaGVja091dE9mU3luY2ggPSByZXNvdXJjZXM7Ci0JCX0KLQkJaWYoIXJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoLmlzRW1wdHkoKSkgewotCQkJY2hlY2tPdXRPZlN5bmNoKHJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tPdXRPZlN5bmNoKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCS8vIGNoZWNrIGZvciBvdXQtb2Ytc3luY2gKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlcyA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCWlmKHJlcy5pc0xvYWRlZCgpICYmICFyZXMuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlpZihmaWxlLmV4aXN0cygpKSB7Ci0vLwkJCQkJbG9uZyBsYXN0TW9kaWZpZWQgPSBmaWxlLmxhc3RNb2RpZmllZCgpOwotLy8JCQkJCWlmIChyZXMuZ2V0RmlsZUxhc3RNb2RpZmllZCgpICE9IGxhc3RNb2RpZmllZCAmJiAhc2FtZShsYXN0TW9kaWZpZWQsIHJlcy5nZXRGaWxlTGFzdE1vZGlmaWVkKCkpKSB7Ci0vLwkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLS8vCQkJCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXNvdXJjZU91dE9mU3luY2hfbXNnLCByZXMKLS8vCQkJCQkJCQkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotLy8JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsKLS8vCQkJCQl9Ci0JCQkJCQotCQkJCQlpZighcmVzLmlzU3luY2hyb25pemVkKCkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzb3VyY2VPdXRPZlN5bmNoX21zZywKLQkJCQkJCQkJcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGV4aXN0aW5nIG93biByZXNvdXJjZSBvZiBhIGNvbnRhaW5lZCBFT2JqZWN0LiBBZGRzIHJlc291cmNlcwotCSAqIHRoYXQgaGF2ZSBiZWVuIG1vZGlmZWQgYWZ0ZXIgdGhpcyBjYWxsIHRvIHRoZSBNT0RJRklFRF9SRVNPVVJDRV9TRVQgb2YKLQkgKiB0aGUgc2F2ZSBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiByZXNvdXJjZSBoYXMgYmVlbiBzYXZlZCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYXZlKFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucykgewotCQlpZiAocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQotCQkvLyBzaG91bGQgbm90IGNoYW5nZSByZXNvdXJjZSBsb2NhdGlvbiBhdXRvbWF0aWNhbGx5IHdpdGhvdXQgbGV0dGluZwotCQkvLyB1c2VyIGtub3cgYWJvdXQgaXQKLQkJLy8KLQkJLy8gYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBiYWNrIHVwIHRoZSBjb250YWluZXIgcmVmZXJlbmNlcyBhbmQgc2V0IGNvbnRlbnQgb2JqZWN0J3MgY29udGFpbmVyCi0JCS8vIHRvIG51bGwKLQkJLy8KLQkJTWFwIG9ialRvQ29udGFpbmVyTWFwID0gcmVtb3ZlQ29udGFpbmVycyhyZXNvdXJjZSk7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIGNvbnRhaW5lciByZWZlcmVuY2VzIGZvciB0aGUgY29udGVudCBvYmplY3RzCi0JCQkvLwotCQkJcmVzdG9yZUNvbnRhaW5lcnMocmVzb3VyY2UsIG9ialRvQ29udGFpbmVyTWFwKTsKLQkJfQotCi0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBhZGROZXdSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyICE9IG51bGwgJiYgbW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIFJlc291cmNlTWFuYWdlciB0aGF0IGlzIGp1c3QgYWRkZWQgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgdHJlZQotCSAqICAgICAgICAgb3IgbnVsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgYWRkTmV3UmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCAmJiBjb250YWluZXIgIT0gbnVsbCAmJiByZXNNZ3IuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCS8vIG5ldyBSZXNvdXJjZU1hbmFnZXIgaXMgYWRkZWQgdG8gdGhlIHJlc291cmNlCi0JCQkvLwotCQkJUmVzb3VyY2VNYW5hZ2VyIHBhcmVudFJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihjb250YWluZXIKLQkJCQkJLmVSZXNvdXJjZSgpKTsKLQotCQkJLy8gY2hlY2sgaWYgcmVzTWdyIGlzIGFscmVhZHkgYSBzdWIgbWFuYWdlciBvZiBwYXJlbnRSZXNNZ3IgYmVmb3JlCi0JCQkvLyBhZGRpbmcgaXQKLQkJCS8vCi0JCQlpZiAoIXBhcmVudFJlc01nci5nZXRTdWJNYW5hZ2VycygpLmNvbnRhaW5zKHJlc01ncikpIHsKLQkJCQlwYXJlbnRSZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5hZGQocmVzTWdyKTsJCQkJCi0JCQkJcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHBhcmVudFJlc01nciwgZSwgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzb3VyY2UpKTsKLQkJCQlyZXR1cm4gcmVzTWdyOwotCQkJfQotCi0JCQkvLyByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocGFyZW50UmVzTWdyLCByZXNNZ3IsCi0JCQkvLyByZXNNZ3IuZVJlc291cmNlKCkuZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQocmVzTWdyLmdldEd1aWQoKSkpOwotCQkJLy8gcmV0dXJuIHJlc01ncjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9GaWxlU3RyaW5nKEVPYmplY3QgZU9iaikgewotCQlyZXR1cm4gZU9iai5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSgKLQkJCQllT2JqLmVSZXNvdXJjZSgpLmdldFVSSSgpKS50b0ZpbGVTdHJpbmcoKTsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBoYXNPd25Gb2xkZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2UoT2JqZWN0IG9iaiwgQ29sbGVjdGlvbiBzYXZlU2VwYXJhdGVseUNsYXNzU2V0KSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RVbml0KQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChzYXZlU2VwYXJhdGVseUNsYXNzU2V0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhdmVTZXBhcmF0ZWx5Q2xhc3NTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFQ2xhc3MgZUNscyA9IChFQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbHMuaXNJbnN0YW5jZShvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzdGF0aWMgVVJJIGNyZWF0ZUZpbGVVUkkoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlLmVDb250YWluZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpOwotCi0JCS8vIEhhbmRsZSBQcm9jZXNzQ29tcG9uZW50IHNwZWNpYWxseS4gUHJvY2Vzc0NvbXBvbmVudCBvYmplY3RzIGFyZQotCQkvLyBzdG9yZWQgYXMgZm9sbG93aW5nIGluIHRoZSBtZXRob2QgbGlicmFyeToKLQkJLy8gPE1ldGhvZCBMaWJyYXJ5PgotCQkvLyB8XyA8TWV0aG9kIFBsdWdpbj4KLQkJLy8gfF9wcm9jZXNzZXMKLQkJLy8gfF9jYXBhYmlsaXR5X3BhdHRlcm5zCi0JCS8vIHxfZGVsaXZlcnlfcHJvY2Vzc2VzCi0JCS8vIHxfcHJvY2Vzc19jb250cmlidXRpb25zCi0JCS8vCi0JCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCVJlc291cmNlIHJlc291cmNlID0gcGx1Z2luLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCX0KLQkJCVN0cmluZyBwbHVnaW5EaXIgPSBudWxsOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXBsdWdpbkRpciA9IG5ldyBGaWxlKGdldEZpbmFsVVJJKHJlc291cmNlKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KSBwbHVnaW4uZUNvbnRhaW5lcigpOwotCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbGliRGlyID0gbmV3IEZpbGUoKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGxpYgotCQkJCQkJCS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJCXBsdWdpbkRpciA9IGxpYkRpciArIEZpbGUuc2VwYXJhdG9yICsgcGx1Z2luLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihwbHVnaW5EaXIgPT0gbnVsbCkgewotCQkJCS8vIHBsdWdpbiBpcyBhbHJlYWR5IGRlbGV0ZWQKLQkJCQkvLwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgcmVsYXRpdmVEaXI7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZSkKLQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlyZWxhdGl2ZURpciA9IENBUEFCSUxJVFlfUEFUVEVSTl9QQVRIOwotCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBERUxJVkVSWV9QUk9DRVNTX1BBVEg7Ci0JCQl9IGVsc2UgewotCQkJCXJlbGF0aXZlRGlyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJU3RyaW5nIHBhdGggPSBwbHVnaW5EaXIgKyBGaWxlLnNlcGFyYXRvciArIHJlbGF0aXZlRGlyCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBlLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgREVGQVVMVF9NT0RFTF9GSUxFTkFNRTsKLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSB7Ci0JCQlTdHJpbmcgZGlyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZGlyID0gbmV3IEZpbGUoKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIFVtYVV0aWwKLQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50KGUpLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpCi0JCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKGRpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgREVGQVVMVF9DT05URU5UX0ZJTEVOQU1FKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQlVUkkgdXJpOwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlOwotCQkJU3RyaW5nIHBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldENvcnJlY3RQYXRoKGNvbnRlbnQpOwotCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCVN0cmluZyBkaXIgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZS5lUmVzb3VyY2UoKSkKLQkJCQkJCS5nZXRGaW5hbFVSSSgpLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKQotCQkJCQkJKyBGaWxlLnNlcGFyYXRvcjsKLQkJCQlwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZGlyLAotCQkJCQkJY29udGVudCk7Ci0JCQl9Ci0JCQl1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJCXJldHVybiB1cmk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsJCQkKLQkJCVN0cmluZyBkaXIgPSBuZXcgU3RyaW5nQnVmZmVyKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJCS5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkudHJpbVNlZ21lbnRzKDEpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoCi0JCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJCS50b1N0cmluZygpOwotCQkJU3RyaW5nIHBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsCi0JCQkJCVN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUoZS5nZXROYW1lKCkpLAotCQkJCQkoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpOwotCQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUVPYmplY3QgbGFzdENvbnRhaW5lciA9IG51bGw7Ci0JCWZvciAoTWV0aG9kRWxlbWVudCBvYmogPSAoTWV0aG9kRWxlbWVudCkgZS5lQ29udGFpbmVyKCk7IG9iaiAhPSBudWxsOyBvYmogPSAoTWV0aG9kRWxlbWVudCkgb2JqCi0JCQkJLmVDb250YWluZXIoKSkgewotCQkJbGFzdENvbnRhaW5lciA9IG9iajsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcGF0aC5pbnNlcnQoMCwgbmV3IEZpbGUoKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG9iagotCQkJCQkJLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCXBhdGguaW5zZXJ0KDAsIG9iai5nZXROYW1lKCkpLmluc2VydCgwLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJfQotCQl9Ci0JCWlmIChsYXN0Q29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBlLmVSZXNvdXJjZSgpICE9IG51bGwgPyAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCQkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkgOiBudWxsOwotCQl9Ci0JCWlmICghKGxhc3RDb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcGF0aC5pbnNlcnQoMCwgbmV3IEZpbGUodG9GaWxlU3RyaW5nKGxhc3RDb250YWluZXIpKQotCQkJCQkuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQotCQlTdHJpbmcgbW9kZWxGaWxlTmFtZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCW1vZGVsRmlsZU5hbWUgPSBERUZBVUxUX1BMVUdJTl9NT0RFTF9GSUxFTkFNRTsKLQkJfSBlbHNlIHsKLQkJCW1vZGVsRmlsZU5hbWUgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX01PREVMX0ZJTEVOQU1FOwotCQl9Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShwYXRoLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgTXVsdGlGaWxlU2F2ZVV0aWwuY3JlYXRlRGlyTmFtZShlKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyBtb2RlbEZpbGVOYW1lKTsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKEZpbGUgZmlsZSkgewotCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWRlbGV0ZShmaWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZmlsZS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0Jc3RhdGljIHZvaWQgc2V0VVJJTWFwcGluZyhFT2JqZWN0IGUsIFVSSSB1cmksIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZQotCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQl1cmlDb252ZXJ0ZXIuc2V0VVJJTWFwcGluZyhlLCB1cmksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwKLQkgKi8KLQlzdGF0aWMgdm9pZCB1cGRhdGVVUklNYXBwaW5ncyhNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJdXBkYXRlVVJJTWFwcGluZ3MocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHJlc291cmNlU2V0IGhhcyB0aGUgbG9hZGVkIHJlc291cmNlIHdpdGggdGhlIGdpdmVuCi0JICogdXJpCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlU2V0Ci0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBoYXNMb2FkZWRSZXNvdXJjZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpICYmIHJlc291cmNlLmdldFVSSSgpLmVxdWFscyh1cmkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgVVJJTWFwcGluZ3Mgd2l0aCB0aGUgZmluYWwgVVJJIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXN0YXRpYyB2b2lkIHVwZGF0ZVVSSU1hcHBpbmdzKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcywgYm9vbGVhbiBhZnRlck1vdmUpIHsKLQkJdXBkYXRlVVJJTWFwcGluZ3MocmVzb3VyY2UsIHJlc291cmNlLmdldEZpbmFsVVJJKCksIG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCWFmdGVyTW92ZSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgdXBkYXRlVVJJTWFwcGluZ3MoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLCBVUkkgdXJpLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzLCBib29sZWFuIGFmdGVyTW92ZSkgewotCQkvLyB0aGUgcmVzb3VyY2UgVVJJIGhhcyBiZWVuIGNoYW5nZWQsIHJlc2V0IGFsbCB0aGUgY2FjaGVkIHJlc29sdmVkIFVSSQotCQkvLyBpbiBhbGwgb2Zmc3RyaW5nIHJlc291cmNlIGRlc2NyaXB0b3JzCi0JCS8vIG9mIGl0cyBtYW5hZ2VyLCBpZiBpdCBoYXMgb25lLgotCQkvLwotCQlIYXNoTWFwIG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbnVsbDsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlRGVzY3JpcHRvcikgewotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9ICgoUmVzb3VyY2VEZXNjcmlwdG9yKSBvYmopOwotCQkJCQlvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLAotCQkJCQkJCWRlc2MpOwotCQkJCQlpZiAoYWZ0ZXJNb3ZlKSB7Ci0JCQkJCQlkZXNjLmNsZWFyUmVzb2x2ZWRVUkkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCS8vIHNldFVSSU1hcHBpbmcoZWxlbWVudCwgcmVzb3VyY2UuZ2V0RmluYWxVUkkoKSwKLQkJCS8vIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSByZXNvdXJjZQotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCXVyaUNvbnZlcnRlci5zZXRVUklNYXBwaW5nKGVsZW1lbnQsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJCWFmdGVyTW92ZSk7Ci0JCX0KLQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCS8vIHNldFVSSU1hcHBpbmcoZWxlbWVudCwgcmVzb3VyY2UuZ2V0VVJJKCksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJLy8gfQotCi0JCWlmIChvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB0aHJ1IHRoZSBsaXN0IG9mIGxvYWRlZCByZXNvdXJjZXMgaW4gcmVzb3VyY2Ugc2V0IHRvIHVwZGF0ZQotCQkJLy8gdGhlIFVSSQotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcAotCQkJCQkJLmdldChyZXMuZ2V0VVJJKCkpOwotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQkJcmVzLnNldFVSSShkZXNjLmdldFJlc29sdmVkVVJJKCkpOwotCQkJCQl9IGVsc2UgaWYgKHJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlkZXNjLmNsZWFyUmVzb2x2ZWRVUkkoKTsKLQkJCQkJCXJlcy5zZXRVUkkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSB1cmkKLQkgKi8KLQkvLyBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFVyaShSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBNZXRob2RFbGVtZW50IGUsIFVSSQotCS8vIHVyaSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCS8vIGlmKHJlc0Rlc2MuZ2V0SWQoKS5lcXVhbHMoZS5nZXRHdWlkKCkpKSB7Ci0JLy8gLy8gY2hhbmdlIG90aGVyIFVSSXMgdGhhdCBhcmUgY2hhbmdlZCBhcyByZXN1bHQgb2YgdGhpcyBVUkkgY2hhbmdlCi0JLy8gLy8KLQkvLyBpZih1cmkuZnJhZ21lbnQoKSA9PSBudWxsKSB7Ci0JLy8gVVJJIG9sZERpciA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ldwotCS8vIEZpbGUocmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSArCi0JLy8gRmlsZS5zZXBhcmF0b3IpOwotCS8vIFVSSSBuZXdEaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpICsKLQkvLyBGaWxlLnNlcGFyYXRvcik7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyYXRvcgotCS8vIC5oYXNOZXh0KCk7KSB7Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGVsZW1lbnQgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JLy8gVVJJIGN1cnJlbnRVcmkgPSBlbGVtZW50LmdldFJlc29sdmVkVVJJKCk7Ci0JLy8gVVJJIG5ld1VyaSA9IGN1cnJlbnRVcmkucmVwbGFjZVByZWZpeChvbGREaXIsIG5ld0Rpcik7Ci0JLy8gaWYobmV3VXJpICE9IG51bGwpIHsKLQkvLyBlbGVtZW50LnNldFJlc29sdmVkVVJJKG5ld1VyaSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmVzRGVzYy5zZXRSZXNvbHZlZFVSSSh1cmkpOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gfQotCS8vIFJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0KLQkvLyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQkvLyByZXNEZXNjLnNldElkKGUuZ2V0R3VpZCgpKTsKLQkvLyByZXNEZXNjLnNldFJlc29sdmVkVVJJKHVyaSk7Ci0JLy8gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5hZGQocmVzRGVzYyk7Ci0JLy8gfQotCS8qKgotCSAqIEdldHMgdGhlIHJpZ2h0IFJlc291cmNlTWFuYWdlciBmb3IgdGhlIGdpdmVuIEVPYmplY3QsIGNyZWF0ZXMgbmV3Ci0JICogUmVzb3VyY2VNYW5hZ2VyIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0Jc3RhdGljIFJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXJGb3IoRU9iamVjdCBlT2JqLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZU9iai5lQ29udGFpbmVyKCkgIT0gbnVsbCA/IGVPYmouZUNvbnRhaW5lcigpCi0JCQkJLmVSZXNvdXJjZSgpIDogZU9iai5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCWlmIChyZXNNZ3IgPT0gbnVsbCkgewotCQkJcmVzTWdyID0gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCk7Ci0KLQkJCS8vIGFkZCB0byBiZWdpbm5pbmcgb2YgdGhlIHJlc291cmNlJ3MgY29udGVudHMKLQkJCS8vCi0JCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCgwLCByZXNNZ3IpOwotCi0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcldpdGhEaXJlY3RSZXNvdXJjZSgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZVJlc291cmNlKCkgIT0gcmVzb3VyY2UpIHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgcGFyZW50UmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKGNvbnRhaW5lciwKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQlpZiAocGFyZW50UmVzTWdyICE9IG51bGwpIHsKLQkJCQkJcGFyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuYWRkKHJlc01ncik7Ci0JCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocGFyZW50UmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXNNZ3I7Ci0KLQl9Ci0KLQlzdGF0aWMgTGlzdCByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXJGb3IoCi0JCQkJUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJTGlzdCByZXNvdXJjZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLAotCQkJCQkJZWxlbWVudCwgcmVzb3VyY2UuZ2V0RmluYWxVUkkoKSk7Ci0JCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZURlc2NyaXB0b3JzLmFkZChyZXNEZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFyZXNvdXJjZURlc2NyaXB0b3JzLmlzRW1wdHkoKSAmJiBtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VEZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvciByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIoCi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBPYmplY3QgZWxlbWVudCwgVVJJIHVyaSkgewotCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQoZWxlbWVudCk7Ci0JCWlmIChyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGd1aWQpID09IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLCBndWlkLCB1cmkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZXMgYSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBhbmQgYWRkIGl0Ci0JLy8gdG8gdGhlIGdpdmVuIFJlc291cmNlTWFuYWdlcgotCS8vICoKLQkvLyAqIEBwYXJhbSBlCi0JLy8gKiBAcmV0dXJuIG5ld2x5IGFkZGVkIFJlc291cmNlRGVzY3JpcHRvcgotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yCi0JLy8gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlTWFuYWdlciByZXNNZ3IsIE1ldGhvZEVsZW1lbnQgZSkgewotCS8vIHJldHVybiBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLCBlLmdldEd1aWQoKSwgY3JlYXRlRmlsZVVSSShlKSk7Ci0JLy8gfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZURlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIHJlc29sdmVkVVJJLCB0aGVuCi0JICogYWRkcyBpdCB0byB0aGUgZ2l2ZW4gcmVzTWdyCi0JICogCi0JICogQHBhcmFtIHJlc01ncgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSByZXNvbHZlZFVSSQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgU3RyaW5nIGlkLCBVUkkgcmVzb2x2ZWRVUkkpIHsKLQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQkJcmVzRGVzYy5zZXRJZChpZCk7Ci0JCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCQlyZXNEZXNjLnNldFJlc29sdmVkVVJJKHJlc29sdmVkVVJJKTsKLQkJcmV0dXJuIHJlc0Rlc2M7Ci0JfQotCi0JLy8gc3RhdGljIHZvaWQgc2V0VXJpKE11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIsIE1ldGhvZEVsZW1lbnQgZSwKLQkvLyBVUkkgdXJpKSB7Ci0JLy8gc2V0VXJpKHVyaUNvbnZlcnRlciwgZSwgdXJpLCBmYWxzZSk7Ci0JLy8gfQotCi0JLy8gc3RhdGljIHZvaWQgc2V0VXJpKE11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIsIE1ldGhvZEVsZW1lbnQgZSwKLQkvLyBVUkkgdXJpLCBib29sZWFuIHNhdmVOb3cpIHsKLQkvLyBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gdXJpQ29udmVydGVyLmdldFJlc291cmNlTWFuYWdlcigpOwotCS8vIGlmKHJlc01nciA9PSBudWxsKSB7Ci0JLy8gcmVzTWdyID0gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JLy8gdXJpQ29udmVydGVyLnNldFJlc291cmNlTWFuYWdlcihyZXNNZ3IpOwotCS8vIH0KLQkvLyBzZXRVcmkocmVzTWdyLCBlLCB1cmkpOwotCS8vIHJlc01nci5lUmVzb3VyY2UoKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHdWlkKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZS5nZXRHdWlkKCkgPT0gbnVsbCB8fCBlLmdldEd1aWQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZS5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBpbiBpdHMgb3duIGZpbGUgd2hpbGUgc3RpbGwgcHJlc2VydmluZyB0aGUKLQkgKiBleGlzdGluZyBjb250YWlubWVudCBhc3NvY2lhdGlvbiBpZiB0aGVyZSBpcyBhbnkKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZSwgTWFwIG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJLmVSZXNvdXJjZSgpOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZQotCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCX0KLQkJRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsKLQotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlvcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQsCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQl0cnkgewotCQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZVVSSShlLCByZXNvdXJjZVNldCk7Ci0JCQlib29sZWFuIGNyZWF0ZVJlc291cmNlID0gcmVzb3VyY2UgPT0gbnVsbAotCQkJCQl8fCAoY29udGFpbmVyICE9IG51bGwgJiYgcmVzb3VyY2UgPT0gY29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCWlmIChjcmVhdGVSZXNvdXJjZSkgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLnNhdmUoZSwgdXJpLCBvcHRpb25zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVVJJIG9sZFVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCWlmICghb2xkVXJpLmVxdWFscyh1cmkpKSB7Ci0KLQkJCQkJLy8gcmVzb3VyY2UncyBsb2NhdGlvbiBpcyBjaGFuZ2VkLgotCQkJCQkvLyBtb3ZlIHRoZSByZXNvdXJjZSwgdGhlbiBjaGFuZ2UgaXRzIFVSSSBpZiB0aGUgcmVzb3VyY2UKLQkJCQkJLy8gbW92ZSBpcyBzdWNjZXNzZnVsLgotCQkJCQkvLyAgIAotCQkJCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tb3ZlKG9sZFVyaS50b0ZpbGVTdHJpbmcoKSwKLQkJCQkJCQl1cmkudG9GaWxlU3RyaW5nKCkpKSB7Ci0JCQkJCQkvLyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0KLQkJCQkJCS8vIChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpCi0JCQkJCQkvLyByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJCQkJLy8gTXVsdGlGaWxlU2F2ZVV0aWwuc2V0VXJpKHVyaUNvbnZlcnRlciwgZSwgdXJpKTsKLQkJCQkJCXJlc291cmNlLnNldFVSSSh1cmkpOwotCQkJCQkJdXBkYXRlVVJJTWFwcGluZ3MocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuc2F2ZShyZXNvdXJjZSwgb3B0aW9ucyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXNvdXJjZVNldC5zYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCX0gZmluYWxseSB7Ci0KLQkJfQotCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShNZXRob2RFbGVtZW50IGUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCVVSSSB1cmkgPSBudWxsOwotCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJSVVSSVByb3ZpZGVyIHVyaVByb3ZpZGVyID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldFVSSVByb3ZpZGVyKCk7Ci0JCQlpZih1cmlQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJdXJpID0gdXJpUHJvdmlkZXIuZ2V0VVJJKGUpOwotCQkJfQotCQl9Ci0JCWlmKHVyaSA9PSBudWxsKSB7Ci0JCQl1cmkgPSBjcmVhdGVGaWxlVVJJKGUpOwotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmUoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsIE1ldGhvZEVsZW1lbnQgZSwKLQkJCU1hcCBvcHRpb25zKSB7Ci0JCVVSSSB1cmkgPSBjcmVhdGVVUkkoZSwgcmVzb3VyY2VTZXQpOwotCQlzYXZlKHJlc291cmNlU2V0LCBlLCB1cmksIG9wdGlvbnMpOwotCX0KLQotCXN0YXRpYyB2b2lkIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlVUkkgbmV3RmlsZSA9IGNyZWF0ZVVSSShlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJaWYgKG5ld0ZpbGUgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvbihyZXNvdXJjZSwgbmV3RmlsZSkpIHsKLQkJCXJlc291cmNlLnNldFVSSShuZXdGaWxlKTsKLQkJCXVwZGF0ZVVSSU1hcHBpbmdzKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlLAotCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgVVJJIGdldE5ld1VSSShNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlVUkkgbmV3RmlsZSA9IGNyZWF0ZVVSSShlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJaWYgKG5ld0ZpbGUgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvblJlcXVpcmVkKHJlc291cmNlLCBuZXdGaWxlKSkgewotCQkJcmV0dXJuIG5ld0ZpbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gcHJlcGFyZUFkanVzdExvY2F0aW9uKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlVUkkgbmV3RmlsZSA9IGdldE5ld1VSSShyZXNvdXJjZSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmJhY2tVcFVSSSgpOwotCQkJcmVzb3VyY2Uuc2V0RmluYWxVUkkobmV3RmlsZSk7Ci0JCQl1cGRhdGVVUklNYXBwaW5ncygoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSwKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMsIGZhbHNlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkKE9iamVjdCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgZTsKLQkJCWlmKG8uZUlzUHJveHkoKSkgewotCQkJCVVSSSB1cmkgPSBvLmVQcm94eVVSSSgpOwotCQkJCWlmKHVyaSAhPSBudWxsICYmIE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUuZXF1YWxzKHVyaS5zY2hlbWUoKSkpIHsKLQkJCQkJU3RyaW5nIGd1aWQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCQkJaWYoZ3VpZCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZ3VpZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQlyZXR1cm4gKChSZXNvdXJjZU1hbmFnZXIpIGUpLmdldEd1aWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBhZGp1c3RMb2NhdGlvblJlcXVpcmVkKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVVSSSBuZXdVUkkpIHsKLQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKG5ld1VSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCXJldHVybiAhb2xkRmlsZS5lcXVhbHMobmV3RmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSByZXNvdXJjZSdzIFVSSSBoYXMgYmVlbiBjaGFuZ2VkIGFuZCBhZGp1c3QgdGhlIHJlc291cmNlJ3MKLQkgKiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkVXJpCi0JICogQHBhcmFtIG5ld1VyaQotCSAqLwotCXN0YXRpYyBib29sZWFuIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlLCBVUkkgbmV3VXJpKSB7Ci0JCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUobmV3VXJpLnRvRmlsZVN0cmluZygpKTsKLQkJaWYgKG9sZEZpbGUuZXF1YWxzKG5ld0ZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG1vdmUocmVzb3VyY2UsIG9sZEZpbGUsIG5ld0ZpbGUpOwotCX0KLQotCXN0YXRpYyBib29sZWFuIG1vdmUoUmVzb3VyY2UgcmVzb3VyY2UsIEZpbGUgb2xkRmlsZSwgRmlsZSBuZXdGaWxlKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJaWYgKG9sZEZpbGUuZXF1YWxzKG5ld0ZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJT2JqZWN0IG9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGhhc093bkZvbGRlcihvYmopKSB7Ci0JCQlTdHJpbmcgb2xkRGlyID0gb2xkRmlsZS5nZXRQYXJlbnRGaWxlKCkudG9TdHJpbmcoKTsKLQkJCWlmICghb2xkRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXF1YWxzKG5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpKSkgewotCQkJCWlmIChGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbmFtZShvbGRGaWxlLmdldFBhcmVudEZpbGUoKSwKLQkJCQkJCW5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpKSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRpcmVjdG9yeSAnIiArIG9sZERpciArICInIGlzIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byAnIiArIG5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldCA9IGZhbHNlOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkNvdWxkIG5vdCBtb3ZlIGRpcmVjdG9yeSAnIiArIG9sZERpciArICInIHRvICciICsgbmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFvbGRGaWxlLmdldE5hbWUoKS5lcXVhbHMobmV3RmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJb2xkRmlsZSA9IG5ldyBGaWxlKG5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpLCBvbGRGaWxlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVuYW1lKG9sZEZpbGUsIG5ld0ZpbGUpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRmlsZSAnIiArIG9sZEZpbGUgKyAiJyBpcyBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gJyIgKyBuZXdGaWxlICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldCA9IGZhbHNlOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkNvdWxkIG5vdCBtb3ZlIGZpbGUgJyIgKyBvbGRGaWxlICsgIicgdG8gJyIgKyBuZXdGaWxlICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0gZWxzZSBpZiAob2xkRmlsZS5leGlzdHMoKSkgLyogaWYob2xkRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXF1YWxzKG5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpKSkgKi97Ci0JCQlTdHJpbmcgb2xkRmlsZVN0ciA9IG9sZEZpbGUudG9TdHJpbmcoKTsKLQkJCWlmIChGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbmFtZShvbGRGaWxlLCBuZXdGaWxlKSkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkZpbGUgJyIgKyBvbGRGaWxlU3RyICsgIicgaXMgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRvICciICsgbmV3RmlsZSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJDb3VsZCBub3QgbW92ZSBmaWxlICciICsgb2xkRmlsZVN0ciArICInIHRvICciICsgbmV3RmlsZSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzTWdyCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcGFyYW0gZXhjbHVkZWRSZXNNYW5hZ2VycwotCSAqICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyIHRoYXQgYXJlIGV4Y2x1ZGVkIGZyb20gdGhpcyBzZWFyY2gKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgZmluZFJlc291cmNlRGVzY3JpcHRvcigKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IsIFN0cmluZyBndWlkLAotCQkJQ29sbGVjdGlvbiBleGNsdWRlZFJlc01hbmFnZXJzLCBib29sZWFuIHJlc29sdmVQcm94eSkgewotCQl0cnkgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGd1aWQpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZGVzYzsKLQkJCS8vIFRPRE86IChQaG9uZykgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgbmVlZGVkIHRvIGF2b2lkIGxvYWRpbmcKLQkJCS8vIHJlc291cmNlcyBleGNlc3NpdmVseQotCQkJLy8KLQkJCUl0ZXJhdG9yIGl0ZXI7Ci0JCQlpZiAocmVzb2x2ZVByb3h5KSB7Ci0JCQkJaXRlciA9IG5ldyBBcnJheUxpc3QocmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkpLml0ZXJhdG9yKCk7Ci0JCQl9IGVsc2UgewotCQkJCWl0ZXIgPSAoKEludGVybmFsRUxpc3QpIHJlc01nci5nZXRTdWJNYW5hZ2VycygpKQotCQkJCQkJLmJhc2ljSXRlcmF0b3IoKTsKLQkJCX0KLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVJlc291cmNlTWFuYWdlciBtZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobWdyICE9IG51bGwKLQkJCQkJCSYmICFtZ3IuZUlzUHJveHkoKQotCQkJCQkJJiYgKGV4Y2x1ZGVkUmVzTWFuYWdlcnMgPT0gbnVsbCB8fCAhZXhjbHVkZWRSZXNNYW5hZ2VycwotCQkJCQkJCQkuY29udGFpbnMobWdyKSkpIHsKLQkJCQkJZGVzYyA9IGZpbmRSZXNvdXJjZURlc2NyaXB0b3IobWdyLCBndWlkLAotCQkJCQkJCWV4Y2x1ZGVkUmVzTWFuYWdlcnMsIHJlc29sdmVQcm94eSk7Ci0JCQkJCWlmIChkZXNjICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZGVzYzsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc01ncgotCSAqIEByZXR1cm4gaG93IG1hbnkgUmVzb3VyY2VEZXNjcmlwdG9ycyBhcmUgaW4gdGhlIHJlc01nciBhbmQgaXRzCi0JICogICAgICAgICBTdWJNYW5hZ2VycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldENvdW50UmVzb3VyY2VEZXNjcmlwdG9ycyhSZXNvdXJjZU1hbmFnZXIgcmVzTWdyKSB7Ci0JCWludCBjb3VudCA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuc2l6ZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlTWFuYWdlciBtZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBpdGVyLm5leHQoKTsKLQkJCWNvdW50ICs9IGdldENvdW50UmVzb3VyY2VEZXNjcmlwdG9ycyhtZ3IpOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlTWFuYWdlciBjb250YWluZXJSZXNNZ3IgPSBudWxsOwotCQlNZXRob2RFbGVtZW50IG1lID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSByZXNNZ3IKLQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkvLyBoYWNrIHRvIGFkZCBtaXNzaW5nIFJlc291cmNlRGVzY3JpcHRvciBmb3IgbGlicmFyeSdzCi0JCQkJCS8vIHJlc291cmNlCi0JCQkJCS8vCi0JCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCWRlc2MgPSByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLCBlbGVtZW50LAotCQkJCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpCi0JCQkJCQkJCQkJLmdldEZpbmFsVVJJKCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBkZXNjOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtZSA9PSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCX0KLQkJCWlmIChjb250YWluZXJSZXNNZ3IgPT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoKEludGVybmFsRU9iamVjdCkgZWxlbWVudCk7Ci0JCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCWNvbnRhaW5lclJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtZSAhPSBudWxsICYmIGNvbnRhaW5lclJlc01nciAhPSBudWxsKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZihtZSAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGFpbmVyUmVzTWdyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY29udGFpbmVyUmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcigoKE1ldGhvZEVsZW1lbnQpIG1lKQotCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmKG1lLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBlbGVtZW50IGhhcyBiZWVuIGxvYWRlZCBiZWZvcmUgaXRzIGNvbnRhaW5lciBhY2Nlc3NlZCBpdAotCQkJCS8vIHRyeSB0byBmaW5kIGl0cyByZXNvdXJjZSBkZXNjcmlwdG9yIHVzaW5nIHJvb3QgcmVzb3VyY2UgbWFuYWdlcgotCQkJCS8vCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJCVJlc291cmNlTWFuYWdlciByb290UmVzTWdyID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyb290UmVzTWdyKSB7Ci0KLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpb2JqZWN0OyAKLQkJCQkJCQkJY2hpbGRyZW4uYWRkQWxsKHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkpOwotCQkJCQkJCQljaGlsZHJlbi5hZGRBbGwocmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkpOwotCQkJCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9OwotCQkJCQlVUkkgdXJpID0gZ2V0RmluYWxVUkkocmVzb3VyY2UpOwotCQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBSZXNvdXJjZURlc2NyaXB0b3IpIHsKLQkJCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIG87Ci0JCQkJCQkJaWYodXJpLmVxdWFscyhyZXNEZXNjLmdldFJlc29sdmVkVVJJKCkpKSB7Ci0JCQkJCQkJCXJldHVybiByZXNEZXNjOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvciBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKE1ldGhvZEVsZW1lbnQgZSkKLQkvLyB7Ci0JLy8gUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IG51bGw7Ci0JLy8gaWYoZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JLy8gcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGUuZVJlc291cmNlKCkpOwotCS8vIH0KLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG51bGw7Ci0JLy8gQ29sbGVjdGlvbiBleGNsdWRlZFJlc01ncnMgPSBudWxsOwotCS8vIGlmKHJlc01nciAhPSBudWxsKSB7Ci0JLy8gZGVzYyA9IGZpbmRSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLCBlLmdldEd1aWQoKSk7Ci0JLy8gaWYoZGVzYyAhPSBudWxsKSByZXR1cm4gZGVzYzsKLQkvLyBleGNsdWRlZFJlc01ncnMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc01ncik7Ci0JLy8gfQotCS8vCQkKLQkvLyBNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlKTsKLQkvLyByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIobGliLmVSZXNvdXJjZSgpKTsKLQkvLwkJCi0JLy8gcmV0dXJuIGZpbmRSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLCBlLmdldEd1aWQoKSwgZXhjbHVkZWRSZXNNZ3JzKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBSZXNvdXJjZU1hbmFnZXIgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQlyZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBlbGVtZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc01ncjsKLQl9Ci0KLQlzdGF0aWMgSW50ZXJuYWxFT2JqZWN0IGdldENvbnRhaW5lcldpdGhEaXJlY3RSZXNvdXJjZShJbnRlcm5hbEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmouZUNvbnRhaW5lcigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZXJuYWxFT2JqZWN0IGNvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpICgoSW50ZXJuYWxFT2JqZWN0KSBvYmoKLQkJCQkuZUNvbnRhaW5lcigpKTsKLQkJaWYgKGNvbnRhaW5lci5lRGlyZWN0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoY29udGFpbmVyKTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldEhSRUYoUmVzb3VyY2UgcmVzb3VyY2UsIE9iamVjdCBvYmopIHsKLQkJTWV0aG9kRWxlbWVudCBvd25lciA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJcmV0dXJuIE11bHRpRmlsZVVSSUNvbnZlcnRlci5jcmVhdGVVUkkob3duZXIuZ2V0R3VpZCgpKS5hcHBlbmRGcmFnbWVudCgKLQkJCQlnZXRHdWlkKG9iaikpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFja3VwRmlsZVN1ZmZpeCgpIHsKLQkJcmV0dXJuICJfIiArIGRhdGVGb3JtYXR0ZXIuZm9ybWF0KENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIHByb3h5IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIDxjb2RlPmd1aWQ8L2NvZGU+IHdpdGhvdXQKLQkgKiBsb2FkaW5nIGFsbCBvdGhlciBwcm94aWVzIGluIDxjb2RlPnBhcmVudDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVQcm94aWVzKENvbGxlY3Rpb24gR1VJRHMsIEVPYmplY3QgcGFyZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJlbnQuZUNsYXNzKCkuZ2V0RUFsbENvbnRhaW5tZW50cygpCi0JCQkJLml0ZXJhdG9yKCk7ICFHVUlEcy5pc0VtcHR5KCkgJiYgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBwYXJlbnQuZUdldChmZWF0dXJlKTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0LmJhc2ljSXRlcmF0b3IoKTsgIUdVSURzLmlzRW1wdHkoKQotCQkJCQkJJiYgaXRlcjEuaGFzTmV4dCgpOyBpbmRleCsrKSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBjaGlsZCA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkLmVJc1Byb3h5KCkpIHsKLQkJCQkJCVN0cmluZyBndWlkID0gY2hpbGQuZVByb3h5VVJJKCkuZnJhZ21lbnQoKTsKLQkJCQkJCWlmIChHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCS8vIHRoaXMgd2lsbCByZXNvbHZlIHRoZSBvYmplY3Qgd2l0aCBndWlkCi0JCQkJCQkJLy8KLQkJCQkJCQlsaXN0LmdldChpbmRleCk7Ci0JCQkJCQkJR1VJRHMucmVtb3ZlKGd1aWQpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb2x2ZVByb3hpZXMoR1VJRHMsIGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IGNoaWxkID0gKEludGVybmFsRU9iamVjdCkgcGFyZW50LmVHZXQoZmVhdHVyZSwKLQkJCQkJCWZhbHNlKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlpZiAoY2hpbGQuZUlzUHJveHkoKSkgewotCQkJCQkJU3RyaW5nIGd1aWQgPSBjaGlsZC5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQkJCQkJaWYgKEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJLy8gdGhpcyB3aWxsIHJlc29sdmUgdGhlIG9iamVjdCB3aXRoIGd1aWQKLQkJCQkJCQkvLwotCQkJCQkJCXBhcmVudC5lR2V0KGZlYXR1cmUpOwotCQkJCQkJCUdVSURzLnJlbW92ZShndWlkKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc29sdmVQcm94aWVzKEdVSURzLCBjaGlsZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRGaW5hbFVSSShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gcmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgPyAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpCi0JCQkJLmdldEZpbmFsVVJJKCkKLQkJCQk6IHJlc291cmNlLmdldFVSSSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbXBsCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBib29sZWFuIGFkanVzdExvY2F0aW9uUmVxdWlyZWQoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsJCQotCQlpZihlICE9IG51bGwgJiYgaGFzT3duRm9sZGVyKGUpKSB7Ci0JCQlVUkkgbmV3VVJJID0gY3JlYXRlVVJJKGUsIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCQkJaWYoYWRqdXN0TG9jYXRpb25SZXF1aXJlZChyZXNvdXJjZSwgbmV3VVJJKSAmJiAhbmV3IEZpbGUobmV3VVJJLnRvRmlsZVN0cmluZygpKS5leGlzdHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBpcyBjdXJyZW50bHkgc3luY2hyb25pemVkIHdpdGggaXRzIGRhdGEgc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIDxsaT4gLTEgZG9uJ3Qga25vdwotCSAqICAgICAgICAgPGxpPiAwIG5vCi0JICogICAgICAgICA8bGk+IDEgeWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2hlY2tTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuY2hlY2tTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogU29tZSB0ZWFtIHByb3ZpZGVycyBjaGFuZ2VkIHRoZSB0aW1lc3RhbXAgb2YgbGFzdCBmaWxlIG1vZGlmaWNhdGlvbiBieSByZW1vdmluZyBzZWNvbmQgZnJhY3Rpb24KLQkgKiBldmVuIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZC4gVGhpcyBtZXRob2QgY2hlY2sgdGhlIGN1cnJlbnQgYW5kIG9sZCB0aW1lIHN0YW1wcyBmb3IgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFRpbWVTdGFtcAotCSAqIEBwYXJhbSBsYXN0VGltZVN0YW1wCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lKGxvbmcgY3VycmVudFRpbWVTdGFtcCwgbG9uZyBsYXN0VGltZVN0YW1wKSB7Ci0JCXJldHVybiBjdXJyZW50VGltZVN0YW1wIDwgbGFzdFRpbWVTdGFtcCAmJiAoY3VycmVudFRpbWVTdGFtcCAmIDcpID09IDAgJiYgKGxhc3RUaW1lU3RhbXAgLSBjdXJyZW50VGltZVN0YW1wKSA8IDEwMDA7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBlbXB0eSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiB0cnVlIGlmIGEgbmV3IHJlc291cmNlIG1hbmFnZXIgaXMgYWRkZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgYWRkUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoMCwgcmVzTWdyKTsKLQkJCXJldHVybiByZXNNZ3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGNoZWNrRmlsZVBhdGhMZW5ndGgoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJTGlzdDxTdHJpbmc+IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsICYmICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXBhdGhMaXN0LmFkZChyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJCi0JCWlmKCFwYXRoTGlzdC5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1twYXRoTGlzdC5zaXplKCldOwotCQkJcGF0aExpc3QudG9BcnJheShwYXRocyk7Ci0KLQkJCWZvciAoaW50IGk9MDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBwYXRoc1tpXTsKLQkJCQlpZiAocGF0aHNbaV0ubGVuZ3RoKCkgPiAyNTUpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnLCBBcnJheXMKLQkJCQkJCQkJLmFzTGlzdChwYXRocykpOwotCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0cyBhbGwgcG9zc2libGUgY29uZmlndXJhdGlvbiBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSA8Y29kZT5jb25maWdEaXI8L2NvZGU+IGFuZCBpdHMgc3ViIGRpcmVjdG9yaWVzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdEaXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBsaXN0Q29uZmlnRmlsZXMoRmlsZSBjb25maWdEaXIpIHsKLQkJcmV0dXJuIGxpc3RMaWJyYXJ5RmlsZXMoY29uZmlnRGlyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBsaXN0TGlicmFyeUZpbGVzKEZpbGUgZGlyKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8RmlsZT4oZGlyLCBmYWxzZSkgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNzU4NDM2MTkzMDAwNjQwOTA3TDsKLQotCQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQkJCXJldHVybiAhRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1RlYW1Qcml2YXRlKHBhdGhuYW1lLmdldEFic29sdXRlUGF0aCgpKSAmJgotCQkJCQkJCShwYXRobmFtZS5pc0RpcmVjdG9yeSgpCi0JCQkJCQkJfHwgcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKAotCQkJCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTikpOwotCQkJCX0KLQotCQkJfTsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEZpbGU+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlGaWxlW10gZmlsZXMgPSAoKEZpbGUpIG9iamVjdCkubGlzdEZpbGVzKGZpbHRlcik7Ci0JCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChmaWxlcykuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVVSSUNvbnZlcnRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmNDI5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVVSSUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBVUkkgY29udmVydGVyIHRoYXQgY29udmVydHMgYSBmaWxlLWJhc2VkIFVSSSB0byBhIFVNQS1iYXNlZCBVUkkgYW5kIHZpY2UKLSAqIHZlcnNhIHVzaW5nIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBSZXNvdXJjZURlc2NyaXB0b3JzIG9mCi0gKiBSZXNvdXJjZU1hbmFnZXIuIEEgVU1BLWJhc2VkIFVSSSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0gKiB1bWE6Ly9HVUlEMSNHVUlEMiB3aGVyZSBHVUlEMSBpcyB0aGUgR1VJRCBvZiB0aGUgZmlsZSBhbmQgR1VJRDIgaXMgdGhlCi0gKiBvYmplY3QncyBHVUlELiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVVSSUNvbnZlcnRlciBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FID0gInVtYSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQgbG9ja2VkR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJvdGVjdGVkIFJlc291cmNlTWFuYWdlciByZXNNZ3I7Ci0KLQlwcml2YXRlIFVSSSBsaWJyYXJ5VVJJOwotCi0JcHJpdmF0ZSBVUkkgbGlicmFyeVVtYVVSSTsKLQotCXByaXZhdGUgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0OwotCi0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVQcm94eTsKLQotCXB1YmxpYyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0KSB7Ci0JCXRoaXMucmVzb3VyY2VTZXQgPSByZXNvdXJjZVNldDsKLQl9Ci0KLQl2b2lkIHNldFJlc29sdmVQcm94eShib29sZWFuIHJlc29sdmVQcm94eSkgewotCQl0aGlzLnJlc29sdmVQcm94eSA9IHJlc29sdmVQcm94eTsKLQl9Ci0KLQl2b2lkIHNldExpYnJhcnlVUklzKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlsaWJyYXJ5VVJJID0gbGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJbGlicmFyeVVtYVVSSSA9IFVSSS5jcmVhdGVVUkkobmV3IFN0cmluZ0J1ZmZlcihTQ0hFTUUpCi0JCQkJLmFwcGVuZCgiOi8vIikuYXBwZW5kKGxpYnJhcnkuZ2V0R3VpZCgpKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9ja0dVSUQoU3RyaW5nIGd1aWQpIHsKLQkJc3luY2hyb25pemVkIChsb2NrZWRHVUlEcykgewotCQkJbG9ja2VkR1VJRHMuYWRkKGd1aWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2tlZEdVSUQoU3RyaW5nIGd1aWQpIHsKLQkJc3luY2hyb25pemVkIChsb2NrZWRHVUlEcykgewotCQkJcmV0dXJuIGxvY2tlZEdVSURzLmNvbnRhaW5zKGd1aWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1bmxvY2tHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCXJldHVybiBsb2NrZWRHVUlEcy5yZW1vdmUoZ3VpZCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwjbm9ybWFsaXplKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFVSSSBub3JtYWxpemUoVVJJIHVyaSkgewotCQlyZXR1cm4gbm9ybWFsaXplKHVyaSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFVSSSBub3JtYWxpemUoVVJJIHVyaSwgRU9iamVjdCByZXNvbHZlcikgewotCQlpZiAoU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2UodXJpLnNjaGVtZSgpKSkgewotCQkJU3RyaW5nIGd1aWQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQlpZiAoaXNMb2NrZWRHVUlEKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWxvY2tHVUlEKGd1aWQpOwotCi0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBudWxsOwotCQkJCUhhc2hTZXQgZXhjbHVkZWRSZXNNYW5hZ2VycyA9IG51bGw7Ci0JCQkJaWYgKHJlc29sdmVyICE9IG51bGwgJiYgcmVzb2x2ZXIuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc29sdmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCQlkZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwuZmluZFJlc291cmNlRGVzY3JpcHRvcihyZXNNZ3IsCi0JCQkJCQkJCWd1aWQsIG51bGwsIHJlc29sdmVQcm94eSk7Ci0JCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gYWRkIHRoaXMgUmVzb3VyY2VNYW5hZ2VyIGFuZCBpdHMgc3VibWFuYWdlcnMgdG8KLQkJCQkJCQkvLyBleGNsdWRlZFJlc01hbmFnZXJzCi0JCQkJCQkJLy8gc28gdGhlIG5leHQgc2VhcmNoIGZvciBSZXNvdXJjZURlc2NyaXB0b3Igd2lsbAotCQkJCQkJCS8vIGlnbm9yZSB0aGVtCi0JCQkJCQkJLy8KLQkJCQkJCQlleGNsdWRlZFJlc01hbmFnZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHJlc01ncikgewotCi0JCQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJCQlyZXR1cm4gKChSZXNvdXJjZU1hbmFnZXIpIG9iamVjdCkKLQkJCQkJCQkJCQkJLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfTsKLQkJCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJZXhjbHVkZWRSZXNNYW5hZ2Vycy5hZGQoaXRlci5uZXh0KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGVzYyA9PSBudWxsICYmIGdldFJlc291cmNlTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCQkJZGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IoCi0JCQkJCQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCksIGd1aWQsIGV4Y2x1ZGVkUmVzTWFuYWdlcnMsCi0JCQkJCQkJcmVzb2x2ZVByb3h5KTsKLQkJCQl9Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQlVUkkgbm9ybWFsaXplZCA9IGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQotCQkJCQkvLyBjaGVjayBpZiB0aGUgcmVzb3VyY2Ugd2l0aCB0aGlzIG5vcm1hbGl6ZWQgVVJJIGhhcwotCQkJCQkvLyB0ZW1wb3JhcnkgVVJJCi0JCQkJCS8vCi0JCQkJCVVSSSB0ZW1wVVJJID0gKFVSSSkgcmVzb3VyY2VTZXQuZ2V0VVJJVG9UZW1wVVJJTWFwKCkuZ2V0KAotCQkJCQkJCW5vcm1hbGl6ZWQpOwotCQkJCQlpZiAodGVtcFVSSSAhPSBudWxsKSB7Ci0JCQkJCQlub3JtYWxpemVkID0gdGVtcFVSSTsKLQkJCQkJfQotCi0JCQkJCWlmICh1cmkuaGFzRnJhZ21lbnQoKSkgewotCQkJCQkJbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuYXBwZW5kRnJhZ21lbnQodXJpLmZyYWdtZW50KCkpOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIG5vcm1hbGl6ZWQ7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl1bmxvY2tHVUlEKGd1aWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLm5vcm1hbGl6ZSh1cmkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbCNjcmVhdGVJbnB1dFN0cmVhbShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUlucHV0U3RyZWFtKHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKG5ldyBTdHJpbmdCdWZmZXIoU0NIRU1FKQotCQkJCS5hcHBlbmQoIjovLyIpLmFwcGVuZChndWlkKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoY3JlYXRlVXJpU3RyaW5nKGUpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVcmlTdHJpbmcoT2JqZWN0IGUpIHsKLQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBlOwotCi0JCVVSSSBvYmplY3RVUkkgPSBvLmVQcm94eVVSSSgpOwotCQlpZiAob2JqZWN0VVJJICE9IG51bGwgJiYgU0NIRU1FLmVxdWFscyhvYmplY3RVUkkuc2NoZW1lKCkpKSB7Ci0JCQlyZXR1cm4gb2JqZWN0VVJJLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZSk7Ci0JCWlmIChndWlkID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKFNDSEVNRSkuYXBwZW5kKCI6Ly8iKS5hcHBlbmQoZ3VpZCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHB1YmxpYyBVUkkgdG9VbWFVcmkoVVJJIHVyaSkgewotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlGaWxlVVJJQ29udmVydGVyLnRvVW1hVXJpKCk6IHVyaT0iK3VyaSk7Ci0JLy8gaWYodXJpLnNjaGVtZSgpLmVxdWFscygidW1hIikgfHwgdXJpRGVzY01hcCA9PSBudWxsKSByZXR1cm4gdXJpOwotCS8vIGlmKGxpYnJhcnlVUkkuZXF1YWxzKHVyaSkpIHJldHVybiBsaWJyYXJ5VW1hVVJJOwotCS8vIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikKLQkvLyB1cmlEZXNjTWFwLmdldCh1cmkudHJpbUZyYWdtZW50KCkudG9TdHJpbmcoKSk7Ci0JLy8gcmV0dXJuIGRlc2MgPT0gbnVsbCA/IHVyaSA6IFVSSS5jcmVhdGVVUkkoInVtYTovLyIgKwotCS8vIGRlc2MuZ2V0SWQoKSkuYXBwZW5kRnJhZ21lbnQodXJpLmZyYWdtZW50KCkpOwotCS8vIH0KLQotCS8vIHB1YmxpYyB2b2lkIHNldFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyKSB7Ci0JLy8gdGhpcy5yZXNNZ3IgPSByZXNNZ3I7Ci0JLy8gfQotCi0JcHVibGljIFJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCWlmIChyZXNNZ3IgPT0gbnVsbCkgewotCQkJcmVzTWdyID0gcmVzb3VyY2VTZXQuZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiByZXNNZ3I7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgUmVzb3VyY2VEZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gR1VJRCBmcm9tIHJvb3QgUmVzb3VyY2VNYW5hZ2VyCi0JICogCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFJlc291cmNlRGVzY3JpcHRvciBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKGdldFJlc291cmNlTWFuYWdlcigpLAotCQkJCWd1aWQsIG51bGwsIHJlc29sdmVQcm94eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQlyZXNNZ3IuZGlzcG9zZSgpOwotCQkJcmVzTWdyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHVyaQotCSAqIEBwYXJhbSBtb2RpZmllZFJlc291cmNlcwotCSAqICAgICAgICAgICAgb3V0cHV0IG9mIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIGFmdGVyIHRoaXMgY2FsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUklNYXBwaW5nKEVPYmplY3QgZSwgVVJJIHVyaSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCXNldFVSSU1hcHBpbmcoZSwgdXJpLCBtb2RpZmllZFJlc291cmNlcywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VVJJTWFwcGluZyhFT2JqZWN0IGUsIFVSSSB1cmksIFNldCBtb2RpZmllZFJlc291cmNlcywKLQkJCWJvb2xlYW4gYWZ0ZXJNb3ZlKSB7Ci0JCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChlKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlckZvcihlLAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGd1aWQpOwotCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQlpZiAoYWZ0ZXJNb3ZlKSB7Ci0JCQkJcmVzRGVzYy5zZXRSZXNvbHZlZFVSSSh1cmkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBwcmVzZXJ2ZSB0aGUgY3VycmVudCByZXNvbHZlZCBVUkkKLQkJCQlyZXNEZXNjLmdldFJlc29sdmVkVVJJKCk7Ci0JCQkJLy8gc2V0IG5ldyBVUkkgc3RyaW5nIGZvciB0aGUgdXBjb21pbmcgbW92ZQotCQkJCXJlc0Rlc2Muc2V0VXJpKHVyaS5kZXJlc29sdmUoCi0JCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNEZXNjLmVSZXNvdXJjZSgpKSkKLQkJCQkJCS50b1N0cmluZygpKTsKLQkJCX0KLQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKQotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNEZXNjLmVSZXNvdXJjZSgpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGZpbmQgdGhlIFJlc291cmNlRGVzY3JpcHRvciBpbiBvdGhlciBSZXNvdXJjZU1hbmFnZXJzCi0JCQkvLwotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZQotCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSByZXNvdXJjZVNldC5nZXRSb290UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQlyZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwuZmluZFJlc291cmNlRGVzY3JpcHRvcihsaWJSZXNNZ3IsIGd1aWQsCi0JCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzTWdyKSwgcmVzb2x2ZVByb3h5KTsKLQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgYWxyZWFkeSBleGlzdHMKLQkJCQkvLyBjaGFuZ2UgaXRzIHVyaSwgbW92ZSBpdCBhbmQgaXRzIHN1YiBtYW5hZ2VyLCBpZiB0aGVyZSBpcyBhbnksCi0JCQkJLy8gdG8gbmV3IFJlc291cmNlTWFuYWdlcgotCQkJCS8vCi0KLQkJCQkvLyBmaW5kIHN1YiBtYW5hZ2VyCi0JCQkJUmVzb3VyY2VNYW5hZ2VyIGN1cnJlbnRSZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSByZXNEZXNjCi0JCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCVJlc291cmNlTWFuYWdlciBzdWJNZ3IgPSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRSZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQkJCVVSSSBtZ3JVUkkgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbWdyLmVSZXNvdXJjZSgpKQotCQkJCQkJCS5nZXRGaW5hbFVSSSgpOwotCQkJCQlpZiAobWdyVVJJLmVxdWFscyh1cmkpKSB7Ci0JCQkJCQlzdWJNZ3IgPSBtZ3I7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIG1vdmUgUmVzb3VyY2VEZXNjcmlwdG9yCi0JCQkJcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5hZGQocmVzRGVzYyk7Ci0JCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGN1cnJlbnRSZXNNZ3IuZVJlc291cmNlKCkpOwotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0KLQkJCQkvLyBtb3ZlIHN1YiBSZXNvdXJjZU1hbmFnZXIKLQkJCQlpZiAoc3ViTWdyICE9IG51bGwpIHsKLQkJCQkJcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuYWRkKHN1Yk1ncik7Ci0JCQkJfQotCi0JCQkJLy8gc2V0IG5ldyBVUkkKLQkJCQlpZiAoYWZ0ZXJNb3ZlKSB7Ci0JCQkJCXJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBwcmVzZXJ2ZSB0aGUgY3VycmVudCByZXNvbHZlZCBVUkkKLQkJCQkJcmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCQkvLyBzZXQgbmV3IFVSSSBzdHJpbmcgZm9yIHRoZSB1cGNvbWluZyBtb3ZlCi0JCQkJCXJlc0Rlc2Muc2V0VXJpKHVyaS5kZXJlc29sdmUocmVzRGVzYy5lUmVzb3VyY2UoKS5nZXRVUkkoKSkKLQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKQotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9IGVsc2UgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXNNZ3IsIGUsIHVyaSk7Ci0JCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlVUkkgdXJpID0gVVJJCi0JCQkJLmNyZWF0ZVVSSSgidW1hOi8vX0xQemRBR1o3RWRtQW1feFNYMkVkVUEjLy9AYnJlYWtkb3duRWxlbWVudHMuMCIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih1cmkpOwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oImRlcmVzb2x2ZWQgVVJJOiAiICsgdXJpLmRlcmVzb2x2ZShVUkkuY3JlYXRlVVJJKCJ1bWE6Ly9fTFB6ZEFHWjdFZG1BbV94U1gyRWRVQSIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOGEwOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogWE1MSGVscGVyIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JSGVscGVySW1wbCBleHRlbmRzIFhNSUhlbHBlckltcGwgewotCi0JLyoqCi0JICogUGxhdGZvcm0tc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2dFcnJvciA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzYW1lRG9jUmVmZXJlbmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNjYXJkVW5yZXNvbHZlZFJlZjsKLQkKLQkvKioKLQkgKiBBIHRlbXBvcmFyeSBmbGFnIHRvIGhhdmUgYSBxdWljayBmaXggZm9yIGdldFZhbHVlIG1ldGhvZCBjYWxsIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBwYXNzZWQKLQkgKiBvYmplY3QuIFNob3VsZCBiZSByZW1vdmVkIHdpdGggZnV0dXJlIHJlZmFjdG9yaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1bm1vZGlmaWVkR2V0VmFsdWUgPSBmYWxzZTsJCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlWE1JSGVscGVySW1wbChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgeG1pUmVzKSB7Ci0JCXN1cGVyKHhtaVJlcyk7Ci0JCXNhbWVEb2NSZWZlcmVuY2VzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCUJvb2xlYW4gYiA9IChCb29sZWFuKSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgeG1pUmVzCi0JCQkJLmdldFJlc291cmNlU2V0KCkpLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLmdldCgKLQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyk7Ci0JCWRpc2NhcmRVbnJlc29sdmVkUmVmID0gYiAhPSBudWxsID8gYi5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbCNzZXRSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyLnNldFJlc291cmNlKHJlc291cmNlKTsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCXJlc291cmNlVVJJID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmdldEZpbmFsVVJJKCk7Ci0JCQlkZXJlc29sdmUgPSByZXNvdXJjZVVSSSAhPSBudWxsICYmICFyZXNvdXJjZVVSSS5pc1JlbGF0aXZlKCkgJiYgcmVzb3VyY2VVUkkuaXNIaWVyYXJjaGljYWwoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0SFJFRihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhSRUYoRU9iamVjdCBvYmopIHsKLQkJaWYgKGRpc2NhcmRVbnJlc29sdmVkUmVmKSB7Ci0JCQkvLyByZW1vdmUgdW5yZXNvbHZlZCByZWZlcmVuY2VzCi0JCQkvLwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0Ci0JCQkJCSYmICEoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvYmopLmlzVmFsaWQoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIG9iajsKLQotCQkJVVJJIG9iamVjdFVSSSA9IG8uZVByb3h5VVJJKCk7Ci0JCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCQlSZXNvdXJjZSBvdGhlclJlc291cmNlID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJCWlmIChvdGhlclJlc291cmNlID09IG51bGwpIHsKLQkJCQkJb2JqZWN0VVJJID0gaGFuZGxlRGFuZ2xpbmdIUkVGKG9iaik7Ci0JCQkJCWlmIChvYmplY3RVUkkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc291cmNlID09IG90aGVyUmVzb3VyY2UpIHsKLQkJCQkJcmV0dXJuICIjIiArIHJlc291cmNlLmdldFVSSUZyYWdtZW50KG9iaik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbi4KLQkJCQkJCS8vIFNlZQotCQkJCQkJLy8gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5sb2FkQ29uZmlndXJhdGlvbnMoKQotCQkJCQkJLy8KLQkJCQkJCUVPYmplY3QgbGliID0gb2JqLmVDb250YWluZXIoKTsKLQkJCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQkJCW90aGVyUmVzb3VyY2UgPSBsaWIuZVJlc291cmNlKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvdGhlclJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gb3RoZXJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgCi0JCQkJCQkJCSYmICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRSZXNvdXJjZU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkJb2JqZWN0VVJJID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkob3RoZXJSZXNvdXJjZSkuYXBwZW5kRnJhZ21lbnQoZ2V0VVJJRnJhZ21lbnQob3RoZXJSZXNvdXJjZSwgb2JqKSk7Ci0JCQkJCQkJcmV0dXJuIGRlcmVzb2x2ZShvYmplY3RVUkkpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3Iob3RoZXJSZXNvdXJjZSk7Ci0JCQkJCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJb2JqZWN0VVJJID0gTXVsdGlGaWxlVVJJQ29udmVydGVyLmNyZWF0ZVVSSSgKLQkJCQkJCQkJCXJlc0Rlc2MuZ2V0SWQoKSkuYXBwZW5kRnJhZ21lbnQoCi0JCQkJCQkJCQlnZXRVUklGcmFnbWVudChvdGhlclJlc291cmNlLCBvYmopKTsKLQkJCQkJCQlyZXR1cm4gb2JqZWN0VVJJLnRvU3RyaW5nKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIW9iamVjdFVSSS5zY2hlbWUoKS5lcXVhbHMoTXVsdGlGaWxlVVJJQ29udmVydGVyLlNDSEVNRSkpIHsKLQkJCQkJU3RyaW5nIGZyYWdtZW50ID0gb2JqZWN0VVJJLmZyYWdtZW50KCk7Ci0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbAotCQkJCQkJCSYmICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkKLQkJCQkJCQkJCS5nZXRFT2JqZWN0QnlJRChmcmFnbWVudCkgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuICIjIiArIGZyYWdtZW50OyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlvYmplY3RVUkkgPSBkZXJlc29sdmUob2JqZWN0VVJJKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gb2JqZWN0VVJJLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0SFJFRihvYmopOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUHJveHlSZWZlcmVuY2UgewotCQlwcml2YXRlIEludGVybmFsRU9iamVjdCBvd25lcjsKLQotCQlwcml2YXRlIEVSZWZlcmVuY2UgcmVmZXJlbmNlOwotCi0JCXByaXZhdGUgSW50ZXJuYWxFT2JqZWN0IHByb3h5OwotCi0JCS8qKgotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIHJlZmVyZW5jZQotCQkgKiBAcGFyYW0gcHJveHkKLQkJICovCi0JCXB1YmxpYyBQcm94eVJlZmVyZW5jZShJbnRlcm5hbEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJCUludGVybmFsRU9iamVjdCBwcm94eSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQkJdGhpcy5wcm94eSA9IHByb3h5OwotCQl9Ci0KLQkJcHVibGljIEludGVybmFsRU9iamVjdCBnZXRPd25lcigpIHsKLQkJCXJldHVybiBvd25lcjsKLQkJfQotCi0JCXB1YmxpYyBJbnRlcm5hbEVPYmplY3QgZ2V0UHJveHkoKSB7Ci0JCQlyZXR1cm4gcHJveHk7Ci0JCX0KLQotCQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBwb3NpdGlvbikgewotCi0JCWludCBraW5kID0gZ2V0RmVhdHVyZUtpbmQoZmVhdHVyZSk7Ci0KLQkJdHJ5IHsKLQkJCS8vIFRPRE86IHRlbXBvcmFyeSBmaXggdG8gYXZvaWQgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLAotCQkJLy8gbmVlZHMgcmV2aXNpdAotCQkJLy8KLQkJCWlmIChraW5kID09IElTX01BTllfTU9WRSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAocG9zaXRpb24gPiAtMSAmJiBsaXN0LmluZGV4T2YodmFsdWUpID09IC0xKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXN1cGVyLnNldFZhbHVlKG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsIHBvc2l0aW9uKTsKLQotCQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElTX01BTllfQUREOgotCQkJY2FzZSBJU19NQU5ZX01PVkU6Ci0JCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIG9iamVjdC5lR2V0KGZlYXR1cmUpOwotCi0JCQkJLy8gc2F2ZSBzYW1lIGRvY3VtZW50IGZvcndhcmQgKHVuaWRpcmVjdGlvbmFsKSByZWZlcmVuY2VzIHRvCi0JCQkJLy8gcmVzb2x2ZSBhdCB0aGUgZW5kIG9mIGRvY3VtZW50IHBhcnNpbmcKLQkJCQkvLwkJCQkKLQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCQkJaWYgKHJlZi5nZXRFT3Bwb3NpdGUoKSAhPSBudWxsKSB7Ci0JCQkJCQlJbnRlcm5hbEVPYmplY3Qgb3duZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0LmJhc2ljSXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUludGVybmFsRU9iamVjdCBlbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgaXRlcgotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudC5lSXNQcm94eSgpCi0JCQkJCQkJCQkmJiBlbGVtZW50LmVQcm94eVVSSSgpLnRyaW1GcmFnbWVudCgpCi0JCQkJCQkJCQkJCS5lcXVhbHMocmVzb3VyY2VVUkkpKSB7Ci0JCQkJCQkJCXNhbWVEb2NSZWZlcmVuY2VzLmFkZChuZXcgUHJveHlSZWZlcmVuY2Uob3duZXIsCi0JCQkJCQkJCQkJcmVmLCBlbGVtZW50KSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJaWYgKGxvZ0Vycm9yKSB7Ci0JCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQlTdHJpbmcgZXJyTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigKLQkJCQkJCSJNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLnNldFZhbHVlKCk6IEVSUk9SIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiXG4gIG9iamVjdDogIikuYXBwZW5kKG9iamVjdCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiXG4gIGZlYXR1cmU6ICIpLmFwcGVuZChmZWF0dXJlKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCJcbiAgdmFsdWU6ICIpLmFwcGVuZCh2YWx1ZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiXG4gIHBvc2l0aW9uOiAiKS5hcHBlbmQocG9zaXRpb24pIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBraW5kOiAiKS5hcHBlbmQoa2luZCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKGVyck1zZyk7Ci0JCQkJfQotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXJyTXNnKTsKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbCNnZXRWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZikgewotCQlPYmplY3QgdmFsdWUgPSBzdXBlci5nZXRWYWx1ZShvYmosIGYpOwotCQkKLQkJaWYgKHVubW9kaWZpZWRHZXRWYWx1ZSkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCQotCQkvLyByZW1vdmUgYW55IHZhbHVlIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSByZXNvdXJjZQotCQkvLwotCQlpZihmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJaWYoZi5pc01hbnkoKSkgewotCQkJCWlmKGYuaXNDaGFuZ2VhYmxlKCkgJiYgdmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVMaXN0KSB7Ci0JCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSB2YWx1ZTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmKCFvLmVJc1Byb3h5KCkgJiYgby5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSB2YWx1ZTsKLQkJCQlpZighby5lSXNQcm94eSgpICYmIG8uZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JTG9hZEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JTG9hZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhZWIzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuU0FYWE1JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JTG9hZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBYTUxMb2FkIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JTG9hZEltcGwgZXh0ZW5kcyBYTUlMb2FkSW1wbCB7Ci0KLQlwdWJsaWMgTXVsdGlGaWxlWE1JTG9hZEltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBtYWtlRGVmYXVsdEhhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXcgU0FYWE1JSGFuZGxlcihyZXNvdXJjZSwgaGVscGVyLCBvcHRpb25zKSB7Ci0JCQkgIAotCQkJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKEVPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQpIHsKLQkJCQlpZiAoRVBGVmVyc2lvbnMuVE9PTF9JRC5lcXVhbHMocHJlZml4KSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmUob2JqZWN0LCBwcmVmaXgsIG5hbWUsIGlzRWxlbWVudCk7Ci0JCQl9Ci0JCQkKLQkJCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25GZWF0dXJlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzRWxlbWVudCwgRU9iamVjdCBwZWVrT2JqZWN0LCBTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAoRVBGVmVyc2lvbnMuVE9PTF9JRC5lcXVhbHMocHJlZml4KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLmhhbmRsZVVua25vd25GZWF0dXJlKHByZWZpeCwgbmFtZSwgaXNFbGVtZW50LCBwZWVrT2JqZWN0LCB2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCQkJCXN1cGVyLmVuZERvY3VtZW50KCk7Ci0KLQkJCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JSGVscGVySW1wbCkgewotCQkJCQlMaXN0IHNhbWVEb2NSZWZlcmVuY2VzID0gKChNdWx0aUZpbGVYTUlIZWxwZXJJbXBsKSBoZWxwZXIpLnNhbWVEb2NSZWZlcmVuY2VzOwotCQkJCQlpZiAoIXNhbWVEb2NSZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2FtZURvY1JlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU11bHRpRmlsZVhNSUhlbHBlckltcGwuUHJveHlSZWZlcmVuY2UgcHJveHlSZWYgPSAoTXVsdGlGaWxlWE1JSGVscGVySW1wbC5Qcm94eVJlZmVyZW5jZSkgaXRlcgotCQkJCQkJCQkJLm5leHQoKTsKLQotCQkJCQkJCS8vIHRoaXMgd2lsbCBtZXJnZSB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBtYXBzIGFzIHdlbGwKLQkJCQkJCQlFT2JqZWN0IHJlc29sdmVkID0gcHJveHlSZWYuZ2V0T3duZXIoKQotCQkJCQkJCQkJLmVSZXNvbHZlUHJveHkocHJveHlSZWYuZ2V0UHJveHkoKSk7Ci0KLQkJCQkJCQlJbnRlcm5hbEVMaXN0IHZhbHVlcyA9IChJbnRlcm5hbEVMaXN0KSBwcm94eVJlZgotCQkJCQkJCQkJLmdldE93bmVyKCkuZUdldChwcm94eVJlZi5nZXRSZWZlcmVuY2UoKSk7Ci0JCQkJCQkJaW50IGluZGV4ID0gdmFsdWVzLmJhc2ljTGlzdCgpLmluZGV4T2YoCi0JCQkJCQkJCQlwcm94eVJlZi5nZXRQcm94eSgpKTsKLQkJCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQkJdmFsdWVzLnNldFVuaXF1ZShpbmRleCwgcmVzb2x2ZWQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxMb2FkSW1wbCNsb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UsCi0JICogICAgICBqYXZhLmlvLklucHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBzdHJpcCBvZmYgdGhlIFVURi04IEJPTSBieXRlcyBpZiB0aGV5IGFyZSBzdGlsbCB0aGVyZQotCQkJLy8KLQkJCVB1c2hiYWNrSW5wdXRTdHJlYW0gcGJpcyA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKGlucHV0U3RyZWFtLCAzKTsKLQkJCWJ5dGUgYm9tW10gPSBuZXcgYnl0ZVszXTsKLQkJCWlmIChwYmlzLnJlYWQoYm9tKSA9PSAzKSB7Ci0JCQkJaWYgKGJvbVswXSAhPSAoYnl0ZSkgMHhFRiB8fCBib21bMV0gIT0gKGJ5dGUpIDB4QkIKLQkJCQkJCXx8IGJvbVsyXSAhPSAoYnl0ZSkgMHhCRikgewotCQkJCQlwYmlzLnVucmVhZChib20pOwotCQkJCX0KLQkJCX0KLQotCQkJc3VwZXIubG9hZChyZXNvdXJjZSwgcGJpcywgb3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSAmJiBoZWxwZXIgPT0gbnVsbCkgewotCQkJCS8vIHVua25vd24gZmVhdHVyZXMgZGV0ZWN0ZWQsIGxvZyB0aGUgd2FybmluZyBhbmQgaWdub3JlIHRoZW0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRFcnJvcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFeGNlcHRpb24gZXggPSAoRXhjZXB0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhleC5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVJlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlYzVkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxMb2FkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRGVmYXVsdFZhbHVlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogUmVzb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIGxpYnJhcnkgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgCi1pbXBsZW1lbnRzIElMaWJyYXJ5UmVzb3VyY2UsIElGYWlsU2FmZVNhdmFibGUKLXsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZW1wRGlyOwotCi0JcHJpdmF0ZSBVUkkgZmluYWxVUkk7Ci0KLQlwcml2YXRlIFVSSSBvbGRVUkk7Ci0KLQlwcml2YXRlIFN0cmluZyBiYWNrdXBGaWxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudFR4SUQ7Ci0KLQlwcml2YXRlIGxvbmcgbGFzdExvYWRUaW1lU3RhbXA7Ci0KLQlwcml2YXRlIFJlc291cmNlRGVzY3JpcHRvciByZXNvdXJjZURlc2NyaXB0b3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmxvYWRpbmc7Ci0KLQkvKiogQ2FjaGVkIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgcmVzb3VyY2UgZmlsZSAqLwotCXByaXZhdGUgbG9uZyBtb2RpZmljYXRpb25TdGFtcDsKLQotCXByaXZhdGUgSUZpbGVJbmZvIGZpbGVJbmZvOwotCi0JcHVibGljIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCXNldEludHJpbnNpY0lEVG9FT2JqZWN0TWFwKG5ldyBIYXNoTWFwKCkpOwkJCi0JfQotCi0JcHJvdGVjdGVkIFhNTExvYWQgY3JlYXRlWE1MTG9hZCgpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTFNhdmUoKQotCSAqLwotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbCNjcmVhdGVYTUxIZWxwZXIoKQotCSAqLwotCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSUhlbHBlckltcGwodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlI2dldElEKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCVN0cmluZyBpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZU9iamVjdCk7Ci0JCWlmIChpZCAhPSBudWxsKQotCQkJcmV0dXJuIGlkOwotCQlyZXR1cm4gc3VwZXIuZ2V0SUQoZU9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI3NldElEKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBpZCkgewotCQlPYmplY3Qgb2xkSUQgPSBpZCAhPSBudWxsID8gZ2V0RU9iamVjdFRvSURNYXAoKS5wdXQoZU9iamVjdCwgaWQpCi0JCQkJOiBnZXRFT2JqZWN0VG9JRE1hcCgpLnJlbW92ZShlT2JqZWN0KTsKLQotCQlpZihnZXRSZXNvdXJjZVNldCgpID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl9Ci0JCU1hcCBndWlkVG9NZXRob2RFbGVtZW50TWFwID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCkpCi0JCQkJLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKTsKLQotCQlpZiAob2xkSUQgIT0gbnVsbCkgewotCQkJZ2V0SURUb0VPYmplY3RNYXAoKS5yZW1vdmUob2xkSUQpOwotCQkJCi0JCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkvLyByZW1vdmUgb2JqZWN0IGZyb20gZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCBvbmx5IGlmIGl0IGlzIGEgcHJveHkKLQkJCQkvLwotCQkJCWlmKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBndWlkVG9NZXRob2RFbGVtZW50TWFwLmdldChpZCk7Ci0JCQkJCWlmKG9iaiAhPSBudWxsICYmIG9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlndWlkVG9NZXRob2RFbGVtZW50TWFwLnJlbW92ZShpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAucmVtb3ZlKGlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJZ2V0SURUb0VPYmplY3RNYXAoKS5wdXQoaWQsIGVPYmplY3QpOwotCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5wdXQoaWQsIGVPYmplY3QpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGVPYmplY3Q7Ci0JCQkJaWYgKCFlLmdldEd1aWQoKS5lcXVhbHMoaWQpKSB7Ci0JCQkJCWUuc2V0R3VpZChpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI3VzZVVVSURzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VVVUlEcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UjZ2V0VVJJRnJhZ21lbnQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUklGcmFnbWVudChFT2JqZWN0IGVPYmplY3QpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpZCA9IGdldElEKGVPYmplY3QpOwotCi0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCXJldHVybiBpZDsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlzdCB1cmlGcmFnbWVudFBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChFT2JqZWN0IGNvbnRhaW5lciA9IGVPYmplY3QuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbAotCQkJCQkJJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpID09IHRoaXM7IGNvbnRhaW5lciA9IGVPYmplY3QKLQkJCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCQkJdXJpRnJhZ21lbnRQYXRoLmFkZCgoKEludGVybmFsRU9iamVjdCkgY29udGFpbmVyKQotCQkJCQkJCS5lVVJJRnJhZ21lbnRTZWdtZW50KGVPYmplY3QuZUNvbnRhaW5pbmdGZWF0dXJlKCksCi0JCQkJCQkJCQllT2JqZWN0KSk7Ci0JCQkJCWVPYmplY3QgPSBjb250YWluZXI7Ci0JCQkJfQotCi0JCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoZ2V0VVJJRnJhZ21lbnRSb290U2VnbWVudChlT2JqZWN0KSk7Ci0KLQkJCQlmb3IgKExpc3RJdGVyYXRvciBpID0gdXJpRnJhZ21lbnRQYXRoCi0JCQkJCQkubGlzdEl0ZXJhdG9yKHVyaUZyYWdtZW50UGF0aC5zaXplKCkpOyBpLmhhc1ByZXZpb3VzKCk7KSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoJy8nKTsKLQkJCQkJcmVzdWx0LmFwcGVuZCgoU3RyaW5nKSBpLnByZXZpb3VzKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBnZXR0aW5nIFVSSSBmcmFnbWVudCBmb3IgIiArIGVPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2F0dGFjaGVkSGVscGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF0dGFjaGVkSGVscGVyKEVPYmplY3QgZU9iamVjdCkgewotCQlzdXBlci5hdHRhY2hlZEhlbHBlcihlT2JqZWN0KTsKLQotCQlpZiAodXNlSURzKCkpIHsKLQkJCVN0cmluZyBpZCA9IGdldElEKGVPYmplY3QpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQkvLyB1cGRhdGUgdGhlIGVPYmplY3RUb0lETWFwCi0JCQkJLy8KLQkJCQlnZXRFT2JqZWN0VG9JRE1hcCgpLnB1dChlT2JqZWN0LCBpZCk7Ci0JCQkJCi0JCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpKQotCQkJCQkJCS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkucHV0KGlkLCBlT2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNUcmFja2luZ01vZGlmaWNhdGlvbigpICYmIGVPYmplY3QuZVJlc291cmNlKCkgIT0gdGhpcykgewotCQkJLy8gcmVtb3ZlIHRoZSBtb2RpZmljYXRpb24gdHJhY2tpbmcgYWRhcHRlciBmcm9tIHRoZSBlT2JqZWN0Ci0JCQkvLwotCQkJZU9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUobW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhdHRhY2hlZEFsbFdpdGhJRHMoRU9iamVjdCBlT2JqKSB7Ci0JCS8vIGF0dGFjaGVkSGVscGVyKGVPYmopOwotCQkvLyBMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQkvLyBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkvLyBFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCS8vIGlmIChvLmVSZXNvdXJjZSgpID09IHRoaXMpIHsKLQkJLy8gYXR0YWNoZWRBbGxXaXRoSURzKG8pOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlJdGVyYXRvciBhbGxDb250ZW50cyA9IG5ldyBDb250ZW50VHJlZUl0ZXJhdG9yKGVPYmopOwotCi0JCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCWF0dGFjaGVkSGVscGVyKChFT2JqZWN0KSBhbGxDb250ZW50cy5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljQXR0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWVPYmouZUFkYXB0ZXJzKCkuYWRkKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCUxpc3QgbGlzdCA9IGVPYmouZUNvbnRlbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCQkJYmFzaWNBdHRhY2hlZEFsbChvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIG9uIGFuIG9iamVjdCBhbmQgYWxsIG9mIGl0cyBvZmZzdHJpbmcgb2JqZWN0cyB0aGF0IGFyZSBpbiB0aGUgc2FtZQotCSAqIHJlc291cmNlIGFzIHRoZSBvYmplY3Qgd2hlbiB0aGUgb2JqZWN0IGlzIGF0dGFjaGVkIHRvIHRoaXMgcmVzb3VyY2UuIFRoaXMKLQkgKiBtZXRob2QgaXMgZXhwZW5zaXZlLCBzbyB1c2UgaXQgd2l0aCBjYXV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICovCi0JcHVibGljIHZvaWQgYXR0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWlmICh1c2VJRHMoKSkgewotCQkJYXR0YWNoZWRBbGxXaXRoSURzKGVPYmopOwotCQl9IGVsc2UgewotCQkJYmFzaWNBdHRhY2hlZEFsbChlT2JqKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkludGVybmFsI2F0dGFjaGVkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGF0dGFjaGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlhdHRhY2hlZEFsbChlT2JqZWN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGV0YWNoZWRBbGxXaXRoSURzKEVPYmplY3QgZU9iaikgewotCQlJdGVyYXRvciBhbGxDb250ZW50cyA9IG5ldyBDb250ZW50VHJlZUl0ZXJhdG9yKGVPYmopOwotCi0JCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCWRldGFjaGVkSGVscGVyKChFT2JqZWN0KSBhbGxDb250ZW50cy5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljRGV0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCUxpc3QgbGlzdCA9IGVPYmouZUNvbnRlbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCQkJYmFzaWNEZXRhY2hlZEFsbChvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNnZXRFT2JqZWN0QnlJRChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RCeUlEKFN0cmluZyBpZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGVsZW1lbnQpOwotCQkJaWYgKGd1aWQgIT0gbnVsbCAmJiBndWlkLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQkvLyByZXR1cm4gc3VwZXIuZ2V0RU9iamVjdEJ5SUQoaWQpOwotCi0JCWlmIChpZFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgZU9iamVjdCA9IChJbnRlcm5hbEVPYmplY3QpIGlkVG9FT2JqZWN0TWFwLmdldChpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsICYmICFlT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElGaWxlSW5mbyBnZXRGaWxlSW5mbygpIHsKLQkJaWYoZmlsZUluZm8gPT0gbnVsbCB8fCAhbmV3IEZpbGUoZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmVxdWFscyhmaWxlSW5mby5nZXRGaWxlKCkpKSB7Ci0JCQlmaWxlSW5mbyA9IEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RmlsZUluZm8odGhpcyk7IAotCQl9Ci0JCXJldHVybiBmaWxlSW5mbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNsb2FkKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzVW5sb2FkaW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gb2xkID0gRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5pc1VzZVN0YXRpYygpOwotCQl0cnkgewotCQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRVc2VTdGF0aWModHJ1ZSk7Ci0JCQlzdXBlci5sb2FkKG9wdGlvbnMpOwkJCi0JCQl1cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlEZWZhdWx0VmFsdWVNYW5hZ2VyLklOU1RBTkNFLnNldFVzZVN0YXRpYyhvbGQpOwotCQl9Ci0JCQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmIChnZXRVUkkoKS50b1N0cmluZygpLmVxdWFscyh0ZXN0UmVzb3VyY2VVUklTdHIpKSB7Ci0JCQkJdGVzdFJlc291cmNlTG9hZGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGVzdFJlc291cmNlTG9hZGVkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RSZXNvdXJjZVVSSVN0ciA9ICJmaWxlOi9DOi90ZW1wL25ld2xpYi9saWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JfQotCQotCS8qKgotCSAqIFJlbG9hZHMgdGhpcyByZXNvdXJjZS4gT2xkIG9iamVjdHMgd2lsbCBiZWNvbWUgcHJveGllcyBhbmQgdGhleSB3aWxsIGJlCi0JICogYWRkZWQgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIDxjb2RlPnByb3hpZXM8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHByb3hpZXMKLQkgKi8KLQlzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxvYWQoQ29sbGVjdGlvbiBwcm94aWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNMb2FkZWQpIHsKLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQoZmFsc2UpOwotCQkJZG9VbmxvYWQocHJveGllcywgZmFsc2UpOwotCQkJLy8gZG9VbmxvYWQoKSBtaWdodCBoYXZlIHNldCB0aGlzIHJlc291cmNlIGxvYWRlZCBhZ2FpbgotCQkJLy8gc2V0IGlzTG9hZGVkIHRvIGZhbHNlIGFuZCBjb250ZW50cyB0byBudWxsIHRvIG1ha2Ugc3VyZQotCQkJLy8KLQkJCWlzTG9hZGVkID0gZmFsc2U7Ci0JCQljb250ZW50cyA9IG51bGw7Ci0JCQlpZiAobm90aWZpY2F0aW9uICE9IG51bGwpIHsKLQkJCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCQlsb2FkKGdldFJlc291cmNlU2V0KCkuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlmaW5hbCB2b2lkIHVubG9hZFdpdGhvdXRSZW1vdmUoKSB7Ci0JCWlmIChpc0xvYWRlZCkgewotCQkJLy8gc2F2ZSB0aGUgUmVzb3VyY2VEZXNjcmlwdG9yIHBmIHRoaXMgcmVzb3VyY2UgZm9yIGxhdGVyIHVzZSB0bwotCQkJLy8gY3JlYXRlIFVSSSBmb3IgdGhlIHByb3hpZXMgYWZ0ZXIgdW5sb2FkCi0JCQkvLwotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHRoaXMpOwotCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCXNldFJlc291cmNlRGVzY3JpcHRvcihyZXNEZXNjKTsKLQkJCX0KLQotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IHNldExvYWRlZChmYWxzZSk7Ci0JCQlkb1VubG9hZChudWxsLCBmYWxzZSk7Ci0JCQlpZiAobm90aWZpY2F0aW9uICE9IG51bGwpIHsKLQkJCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEb2VzIGFsbCB0aGUgd29yayBvZiB1bmxvYWRpbmcgdGhlIHJlc291cmNlLiBJdCBjYWxscwotCSAqIHtAbGluayAjdW5sb2FkZWQgdW5sb2FkZWR9IGZvciBlYWNoIG9iamVjdCBpdCB0aGUgY29udGVudAotCSAqIHtAbGluayAjZ2V0QWxsQ29udGVudHMgdHJlZX0sIGFuZCBjbGVhcnMgdGhlCi0JICoge0BsaW5rICNnZXRDb250ZW50cyBjb250ZW50c30sIHtAbGluayAjZ2V0RXJyb3JzIGVycm9yc30sIGFuZAotCSAqIHtAbGluayAjZ2V0V2FybmluZ3Mgd2FybmluZ3N9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5sb2FkKCkgewotCQlkb1VubG9hZChudWxsLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCAxNywgMjAwNgotCSAqIEBzaW5jZSAxLjAKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENvbnRlbnRUcmVlSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvciB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBvYmplY3QKLQkJICovCi0JCXByaXZhdGUgQ29udGVudFRyZWVJdGVyYXRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlzdXBlcihvYmplY3QpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUVDb250ZW50c0VMaXN0IGNvbnRlbnRzID0gbmV3IEVDb250ZW50c0VMaXN0KChFT2JqZWN0KSBvYmplY3QpIHsKLQkJCQkJLyoKLQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkgKiAKLQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdCNyZXNvbHZlKCkKLQkJCQkJICovCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIHJlc29sdmUoKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRzLmJhc2ljSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKG8uZVJlc291cmNlKCkgPT0gTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLnRoaXMKLQkJCQkJCQl8fCBvLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoaXMgcmVzb3VyY2UuIE9sZCBvYmplY3RzIHdpbGwgYmUgY29tZSBwcm94aWVzIGFuZCB3aWxsIGJlIGFkZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIDxjb2RlPnByb3hpZXM8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHByb3hpZXMKLQkgKiBAcGFyYW0gcmVtb3ZlCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIHJlbW92ZSBhbGwgdGhlIHVubG9hZGVkIG9iamVjdHMgaW4KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBmcm9tIHRoZWlyIGNvbnRhaW5lcnMgYW5kIGFsbCBvcHBvc2l0ZSBmZWF0dXJlCi0JICogICAgICAgICAgICBkYXRhIG9mIHRoZSB1bmxvYWRlZCBvYmplY3RzIHdpbGwgYmUgY2xlYXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZChDb2xsZWN0aW9uIHByb3hpZXMsIGJvb2xlYW4gcmVtb3ZlKSB7Ci0JCWlzVW5sb2FkaW5nID0gdHJ1ZTsKLQotCQl0cnkgewotCQkJLy8gZnJvbSBSZXNvdXJjZUltcGwKLQkJCS8vCi0KLQkJCUl0ZXJhdG9yIGFsbENvbnRlbnRzID0gZ2V0QWxsUHJvcGVyQ29udGVudHMobmV3IEFycmF5TGlzdCgKLQkJCQkJZ2V0Q29udGVudHMoKSkpOwotCi0JCQkvLyBUaGlzIGd1YXJkIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCBjbGVhciBkb2Vzbid0IG1ha2UgdGhlCi0JCQkvLyByZXNvdXJjZQotCQkJLy8gYmVjb21lIGxvYWRlZC4KLQkJCS8vCi0JCQlpZiAoIWdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHJlbW92ZSkgewotCQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZG9uJ3QgY2FsbCBnZXRDb250ZW50cygpLmNsZWFyKCkgdG8ga2VlcCB0aGUgcmVmZXJlbmNlcwotCQkJCQkvLyB0byBlbGVtZW50cwotCQkJCQkvLyB0aGF0IGp1c3QgYmVjYW1lIHByb3hpZXMgYWZ0ZXIgdW5sb2FkCi0JCQkJCS8vCi0JCQkJCWNvbnRlbnRzID0gbnVsbDsKLQkJCQl9Ci0KLQkJCX0KLQkJCWdldEVycm9ycygpLmNsZWFyKCk7Ci0JCQlnZXRXYXJuaW5ncygpLmNsZWFyKCk7Ci0KLQkJCUFycmF5TGlzdDxFT2JqZWN0PiB1bmxvYWRlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCQkKLQkJCUFycmF5TGlzdCBhbGxDb250ZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlhbGxDb250ZW50TGlzdC5hZGQoYWxsQ29udGVudHMubmV4dCgpKTsKLQkJCX0KLQkJCUl0ZXJhdG9yIGl0ID0gYWxsQ29udGVudExpc3QuaXRlcmF0b3IoKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGl0Ci0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQl1bmxvYWRlZChvLCByZW1vdmUpOwotCQkJCQkJdW5sb2FkZWRPYmplY3RzLmFkZChvKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCQlpZiAocHJveGllcyAhPSBudWxsICYmICF1bmxvYWRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJcHJveGllcy5hZGRBbGwodW5sb2FkZWRPYmplY3RzKTsKLQkJCX0KLQkJCWlmIChyZW1vdmUpIHsKLQkJCQkvLyByZW1vdmUgdGhlIHVubG9hZGVkIG9iamVjdHMgZnJvbSBpdHMgY29udGFpbmVyIHRvIHByZXZlbnQgdGhlCi0JCQkJLy8gd2hvbGUgbGlicmFyeSBmcm9tIHN0YXlpbmcKLQkJCQkvLyBpbiBtZW1vcnkgaWYgb25seSBvbmUgb2YgaXRzIGVsZW1lbnQgaXMgbGVha2VkCi0JCQkJLy8gCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdW5sb2FkZWRPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShvYmplY3QpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZnJvbSBYTUxSZXNvdXJjZUltbAotCQkJLy8JCQotCi0JCQlpZiAoaWRUb0VPYmplY3RNYXAgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGlkVG9FT2JqZWN0TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpKQotCQkJCQkJCS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJaWRUb0VPYmplY3RNYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJaWYgKGVPYmplY3RUb0lETWFwICE9IG51bGwpIHsKLQkJCQllT2JqZWN0VG9JRE1hcC5jbGVhcigpOwotCQkJfQotCi0JCQlpZiAoZU9iamVjdFRvRXh0ZW5zaW9uTWFwICE9IG51bGwpIHsKLQkJCQllT2JqZWN0VG9FeHRlbnNpb25NYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJaWYgKGludHJpbnNpY0lEVG9FT2JqZWN0TWFwICE9IG51bGwpIHsKLQkJCQlpbnRyaW5zaWNJRFRvRU9iamVjdE1hcC5jbGVhcigpOwotCQkJfQotCQkJCi0JCQltb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpc1VubG9hZGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5sb2FkZWQoSW50ZXJuYWxFT2JqZWN0IGludGVybmFsRU9iamVjdCkgewotCQl1bmxvYWRlZChpbnRlcm5hbEVPYmplY3QsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaW50ZXJuYWxFT2JqZWN0Ci0JICogQHBhcmFtIGNsZWFyCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiBhbGwgb3Bwb3NpdGUgZmVhdHVyZSBkYXRhIG9mIHRoZQotCSAqICAgICAgICAgICAgdW5sb2FkZWQgb2JqZWN0cyB3aWxsIGJlIGNsZWFyZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVubG9hZGVkKEludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QsIGJvb2xlYW4gY2xlYXIpIHsKLQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGludGVybmFsRU9iamVjdCk7Ci0JCWlmIChndWlkICE9IG51bGwpIHsKLQkJCVVSSSB1cmkgPSByZXNvdXJjZURlc2NyaXB0b3IgIT0gbnVsbCA/IE11bHRpRmlsZVVSSUNvbnZlcnRlcgotCQkJCQkuY3JlYXRlVVJJKHJlc291cmNlRGVzY3JpcHRvci5nZXRJZCgpKSA6IGdldFVSSSgpOwotCQkJaW50ZXJuYWxFT2JqZWN0LmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQoZ3VpZCkpOwotCQl9Ci0JCWludGVybmFsRU9iamVjdC5lQWRhcHRlcnMoKS5jbGVhcigpOwotCi0JCWlmIChpbnRlcm5hbEVPYmplY3QgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCAmJiBjbGVhcikgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXVsdGlSZXNvdXJjZUVPYmplY3QgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpbnRlcm5hbEVPYmplY3QpOwotCi0JCQkvLyBjbGVhciBvd24gb3Bwb3NpdGUgZmVhdHVyZSBtYXAKLQkJCS8vCQkJCi0JCQlNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwID0gbXVsdGlSZXNvdXJjZUVPYmplY3QKLQkJCQkJLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCQlvcHBvc2l0ZUZlYXR1cmVNYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGl0c2VsZiBmcm9tIGFsbCBvcHBvc2l0ZSBmZWF0dXJlcwotCQkJLy8gCi0JCQltdWx0aVJlc291cmNlRU9iamVjdC5yZW1vdmVGcm9tQWxsT3Bwb3NpdGVGZWF0dXJlcygpOwotCQl9Ci0JCQotCQlpZihpbnRlcm5hbEVPYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgaW50ZXJuYWxFT2JqZWN0IGluc3RhbmNlb2YgU2VjdGlvbikgewotCQkJLy8gc2V0IGFsbCBzdHJpbmcgYXR0cmlidXRlcyB0byBOVUxMIHRvIHJlbGVhc2UgbWVtb3J5Ci0JCQkvLwotCQkJZm9yIChFQXR0cmlidXRlIGF0dHIgOiBpbnRlcm5hbEVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKSkgewotCQkJCWlmKGF0dHIgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgJiYgCi0JCQkJCQlhdHRyLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oU3RyaW5nLmNsYXNzKSkgewotCQkJCQlpbnRlcm5hbEVPYmplY3QuZVNldChhdHRyLCBhdHRyLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGludGVybmFsRU9iamVjdC5lRGlyZWN0UmVzb3VyY2UoKSAhPSBudWxsICYmIGludGVybmFsRU9iamVjdCBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQkJKChNdWx0aVJlc291cmNlRU9iamVjdClpbnRlcm5hbEVPYmplY3QpLmVTZXRSZXNvdXJjZShudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRldGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQlpZiAodXNlSURzKCkpIHsKLQkJCWRldGFjaGVkQWxsV2l0aElEcyhlT2JqKTsKLQkJfSBlbHNlIHsKLQkJCWJhc2ljRGV0YWNoZWRBbGwoZU9iaik7Ci0JCX0KLQl9CQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkludGVybmFsI2RldGFjaGVkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRldGFjaGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlkZXRhY2hlZEFsbChlT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNjcmVhdGVNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZU1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbC5Nb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCS8vIGRvbid0IGhhbmRsZSBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24gYi9jIGl0IGRvZXMgbm90Ci0JCQkJLy8gcmVhbGx5IG1vZGlmeSB0aGlzIHJlc291cmNlCi0JCQkJLy8KLQkJCQlpZiAobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsI3NldE1vZGlmaWVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBpc01vZGlmaWVkKSB7Ci0JCS8vIGJvb2xlYW4gd2FzTW9kaWZpZWQgPSBpc01vZGlmaWVkKCk7Ci0JCXN1cGVyLnNldE1vZGlmaWVkKGlzTW9kaWZpZWQpOwotCQkvLyBpZihNdWx0aUZpbGVTYXZlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpIGluc3RhbmNlb2YKLQkJLy8gUHJvY2Vzc0NvbXBvbmVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpRmlsZVhNSVJlc291cmNlSW1wbC5zZXRNb2RpZmllZCgpOiAiICsKLQkJLy8gdGhpcyk7Ci0JCS8vIH0KLQkJLy8gdGhpcyBjb2RlIGlzIG5lZWRlZCB0byBzZXQgZGlydHkgZmxhZyB0byB0aGUgaXRlbSBwcm92aWRlcidzIGxhYmVsCi0JCS8vCi0JCS8vIGlmKHdhc01vZGlmaWVkICE9IGlzTW9kaWZpZWQgJiYgIWdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCS8vIC8vIHJlZnJlc2ggdGhlIGxhYmVsIG9mIHRoZSByZXNvdXJjZSdzIG9iamVjdAotCQkvLyAvLwotCQkvLyBFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBnZXRDb250ZW50cygpLmdldCgwKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gb2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkvLyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpYWRhcHRlcikuZmlyZU5vdGlmeUNoYW5nZWQobmV3Ci0JCS8vIFZpZXdlck5vdGlmaWNhdGlvbihuZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBvYmosIG9iaiksCi0JCS8vIG9iaiwgZmFsc2UsIHRydWUpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmICh0ZXN0UmVzb3VyY2VMb2FkZWQKLQkJCQkJJiYgZ2V0VVJJKCkudG9TdHJpbmcoKS5lcXVhbHModGVzdFJlc291cmNlVVJJU3RyKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaXNNb2RpZmllZD0iICsgaXNNb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmllckltcGwjZURlbGl2ZXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVEZWxpdmVyKCkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChyZXNvdXJjZVNldCAhPSBudWxsICYmICFyZXNvdXJjZVNldC5lRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzdXBlci5lRGVsaXZlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gb2xkID0gRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5pc1VzZVN0YXRpYygpOwotCQl0cnkgewotCQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRVc2VTdGF0aWModHJ1ZSk7Ci0JCQkKLQkJCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCQlvcHRpb25zID0gTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLkRFRkFVTFRfU0FWRV9PUFRJT05TOwotCQkJfQotCi0JCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCi0JCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBzYXZpbmcgTWV0aG9kTGlicmFyeSB0byByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8KLQkJCS8vIE1ldGhvZENvbmZpZ3VyYXRpb25zIGZyb20gbGlicmFyeSBmaWxlLgotCQkJLy8KLQkJCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgZTsKLQkJCQkvLyByZW1vdmUgUmVzb3VyY2VEZXNjcmlwdG9ycyBvZiBjb25maWd1cmF0aW9uIGZpbGVzCi0JCQkJLy8KLQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHRoaXMpOwotCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSByZXNNZ3IKLQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQkJCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNEZXNjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCQkJYm9vbGVhbiBvbGREZWxpdmVyID0gbGliLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbGliLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0KLQkJCQkJLy8gU2F2ZSBsaWJyYXJ5IGZpbGUgYWdhaW4gdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGNvbmZpZ3VyYXRpb25zLgotCQkJCQkvLyBUaGUgcHJldmlvdXMgc2F2ZSBpcyBzdGlsbCBuZWVkZWQgdG8gc2F2ZSBuZXcgY29uZmlndXJhdGlvbiBpbiBpdHMgb3duIGZpbGUKLQkJCQkJLy8KLQkJCQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkQWxsKGNvbmZpZ3MpOwotCQkJCQlsaWIuZVNldERlbGl2ZXIob2xkRGVsaXZlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRVc2VTdGF0aWMob2xkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBVUkkgZ2V0RmluYWxVUkkoKSB7Ci0JCWlmIChmaW5hbFVSSSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmluYWxVUkk7Ci0JCX0KLQkJcmV0dXJuIGdldFVSSSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbmFsVVJJKFVSSSB1cmkpIHsKLQkJZmluYWxVUkkgPSB1cmk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmFja1VwVVJJKCkgewotCQlvbGRVUkkgPSBnZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQlpZiAoY3VycmVudFR4SUQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBVUkkoKS5lcXVhbHMoZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFVSSSBjcmVhdGVUZW1wVVJJKCkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKTsKLQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGVtcERpcigpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChjdXJyZW50VHhJRCkKLQkJCQkuYXBwZW5kKCJuZXciKS5hcHBlbmQoZS5nZXRHdWlkKCkpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRUZW1wRGlyKCkgewotCQlpZiAodGVtcERpciA9PSBudWxsKSB7Ci0JCQl0ZW1wRGlyID0gbmV3IEZpbGUoRmlsZU1hbmFnZXIuZ2V0VGVtcERpcigpLCAiRVBGIikuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdGVtcERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZW1wb3JhcnkgVVJJIHRvIHNhdmUgdGhpcyByZXNvdXJjZSB0byBhbmQgaXQgd2lsbCBiZSByZW5hbWVkIHRvCi0JICogdGhlIG9yaWdpbmFsIFVSSSB3aGVuIHNhdmluZyBpcyBkb25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVtcFVSSShTdHJpbmcgdHhJRCkgewotCQlpZiAoZmluYWxVUkkgPT0gbnVsbCkgewotCQkJZmluYWxVUkkgPSBvbGRVUkkgPSBnZXRVUkkoKTsKLQkJCWN1cnJlbnRUeElEID0gdHhJRDsKLQotCQkJVVJJIHRlbXBVUkkgPSBjcmVhdGVUZW1wVVJJKCk7Ci0JCQlzZXRVUkkodGVtcFVSSSk7Ci0KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5wdXQob2xkVVJJLCB0ZW1wVVJJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByZXNvdXJjZSBVUkkgdG8gdGhlIG9yaWdpbmFsIG9uZS4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsCi0JICogYWZ0ZXIgc2F2aW5nIHJlZ2FybGVzcyBvZiBpdHMgc3VjY2Vzcy4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVVSSSgpIHsKLQkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0JCQlzZXRVUkkob2xkVVJJKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHR4U3RhcnRlZCgpIHsKLQkJcmV0dXJuIG1vdmVTdGFydGVkKCkgfHwgc2F2ZVN0YXJ0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUaW1lU3RhbXBzKCkgewotCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2godGhpcyk7Ci0JCWxhc3RMb2FkVGltZVN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCUlGaWxlSW5mbyBpbmZvID0gZ2V0RmlsZUluZm8oKTsKLQkJaWYoaW5mbyAhPSBudWxsKSB7Ci0JCQltb2RpZmljYXRpb25TdGFtcCA9IGluZm8uZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyByZXNvdXJjZSBpcyBjdXJyZW50bHkgc3luY2hyb25pemVkIHdpdGggaXRzIGRhdGEgc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIDxsaT4gLTEgZG9uJ3Qga25vdwotCSAqICAgICAgICAgPGxpPiAwIG5vCi0JICogICAgICAgICA8bGk+IDEgeWVzCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjaXNTeW5jaHJvbml6ZWQoKX0gaW5zdGVhZAotCSAqLwotCXB1YmxpYyBpbnQgY2hlY2tTeW5jaHJvbml6ZWQoKSB7Ci0vLwkJbG9uZyBjdXJyZW50VGltZSA9IG5ldyBGaWxlKGdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5sYXN0TW9kaWZpZWQoKTsKLS8vCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYW1lKGN1cnJlbnRUaW1lLCBmaWxlTGFzdE1vZGlmaWVkKSkgewotLy8JCQkvLyBzb21lIHRlYW0gcHJvdmlkZXJzIGNoYW5nZWQgdGhlIHRpbWVzdGFtcCBvZiBsYXN0IGZpbGUgbW9kaWZpY2F0aW9uIGJ5IHJlbW92aW5nIHNlY29uZCBmcmFjdGlvbgotLy8JCQkvLyBldmVuIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZAotLy8JCQkvLwotLy8JCQlyZXR1cm4gMTsKLS8vCQl9Ci0vLwkJcmV0dXJuIC0xOwotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWQoKSA/IDEgOiAwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpIHsKLQkJSUZpbGVJbmZvIGZpbGVJbmZvID0gZ2V0RmlsZUluZm8oKTsKLQkJaWYgKGZpbGVJbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBtb2RpZmljYXRpb25TdGFtcCA9PSBmaWxlSW5mby5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotCQlib29sZWFuIHdhc01vdmUgPSAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCWlmIChzdWNjZXNzZnVsKSB7Ci0JCQlzZXRVUkkoZmluYWxVUkkpOwotCQkJaWYoIXdhc01vdmUpIHsKLQkJCQlzZXRNb2RpZmllZChmYWxzZSk7Ci0JCQl9Ci0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2godGhpcyk7Ci0JCQl1cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQlpZighd2FzTW92ZSkgewotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZVNldC5nZXRVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKCkudmFsaWRhdGVNYXJrZXJzKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3RvcmVVUkkoKTsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJLy8gZmluYWxVUkkgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZXN0b3JpbmcgVVJJIG9mIGl0cyBjaGlsZAotCQkJCS8vIHJlc291cmNlcyBzbyB0aGUgVVJJIG9mIGl0cyBjaGlsZCByZXNvdXJjZXMgY2FuIGJlIHJlc29sdmVkCi0JCQkJLy8gY29ycmVjdGx5LiBTZWUgUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5nZXRSZXNvbHZlZFVSSSgpCi0JCQkJLy8KLQkJCQlmaW5hbFVSSSA9IG51bGw7Ci0JCQkJCi0JCQkJLy8gcmVzdG9yZSB1cmkgb2YgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoaXMgcmVzb3VyY2UKLQkJCQkvLwotCQkJCU11bHRpRmlsZVNhdmVVdGlsLnVwZGF0ZVVSSU1hcHBpbmdzKHRoaXMsIG9sZFVSSSwgbnVsbCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLQkJCX0KLQkJCW9sZFVSSSA9IG51bGw7Ci0JCX0KLQkJY3VycmVudFR4SUQgPSBudWxsOwotCQlmaW5hbFVSSSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQlpZiAoYmFja3VwRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlKGJhY2t1cEZpbGUpOwotCQkJCW5ldyBGaWxlKGJhY2t1cEZpbGUpLmRlbGV0ZSgpOwotCQkJCWJhY2t1cEZpbGUgPSBudWxsOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlc3RvcmUoKSB7Ci0JCUZpbGUgc3JjID0gbnVsbCwgZGVzdCA9IG51bGw7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJaWYgKGJhY2t1cEZpbGUgIT0gbnVsbCkgewotCQkJc3JjID0gbmV3IEZpbGUoYmFja3VwRmlsZSk7Ci0JCQlkZXN0ID0gbmV3IEZpbGUoZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb3ZlZCA9IG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmIChtb3ZlZCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWRlc3QgPSBuZXcgRmlsZShvbGRVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJCW1vdmVkID0gZmlsZS5leGlzdHMoKSAmJiAhZGVzdC5leGlzdHMoKTsKLQkJCQlpZiAobW92ZWQpIHsKLQkJCQkJc3JjID0gZmlsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNyYyAhPSBudWxsKSB7Ci0JCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKGRlc3QsbmV3IEZpbGUoZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpKTsKLQkJCX0KLQkJCWJvb2xlYW4gc3VjY2VzczsKLQkJCWlmIChtb3ZlZCkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHRoaXMsIHNyYywgZGVzdCk7Ci0JCQkJLy8gaWYoc3VjY2VzcykgewotCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnVwZGF0ZVVSSU1hcHBpbmdzKHRoaXMsIG51bGwpOwotCQkJCS8vIH0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZG9uJ3QgcmVzdG9yZSBmaWxlIGlmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2FtZQotCQkJCS8vCi0JCQkJc3VjY2VzcyA9IHNyYy5sYXN0TW9kaWZpZWQoKSA9PSBkZXN0Lmxhc3RNb2RpZmllZCgpICYmIEZpbGVVdGlsLmdldFNpemUoc3JjKSA9PSBGaWxlVXRpbC5nZXRTaXplKGRlc3QpOwotCQkJCWlmKCFzdWNjZXNzKSB7Ci0JCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShzcmMsIGRlc3QpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2csIAotCQkJCQkJRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKGdldEZpbmFsVVJJKCkpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JVVJJIGdldE9sZFVSSSgpIHsKLQkJcmV0dXJuIG9sZFVSSTsKLQl9Ci0KLQlib29sZWFuIG1vdmVTdGFydGVkKCkgewotCQlyZXR1cm4gb2xkVVJJICE9IG51bGwgJiYgIW9sZFVSSS5lcXVhbHMoZ2V0RmluYWxVUkkoKSk7Ci0JfQotCi0JYm9vbGVhbiBzYXZlU3RhcnRlZCgpIHsKLQkJcmV0dXJuIGN1cnJlbnRUeElEICE9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWZyZXNoVVJJT2ZDaGlsZFJlc291cmNlcygpIHsKLQkJLy8gcmVmcmVzaCByZXNvbHZlIFVSSXMgaW4gUmVzb3VyY2VEZXNjcmlwdG9ycyBvZiB0aGUgY2hpbGQKLQkJLy8gcmVzb3VyY2VzIG9mIHRoaXMgcmVzb3VyY2UKLQkJLy8KLQkJSGFzaE1hcDxVUkksIFJlc291cmNlRGVzY3JpcHRvcj4gb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBudWxsOwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHRoaXMpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCW9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXA8VVJJLCBSZXNvdXJjZURlc2NyaXB0b3I+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSByZXNNZ3IuZUFsbENvbnRlbnRzKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlRGVzY3JpcHRvcikgewotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9ICgoUmVzb3VyY2VEZXNjcmlwdG9yKSBvYmopOwotCQkJCQlvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYwotCQkJCQkJCS5nZXRSZXNvbHZlZFVSSSgpLCBkZXNjKTsKLQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVmcmVzaCBVUkkgb2YgbG9hZGVkIGNoaWxkIHJlc291cmNlcyBvZiB0aGlzIHJlc291cmNlCi0JCS8vCi0JCWlmIChvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB0aHJ1IHRoZSBsaXN0IG9mIGxvYWRlZCByZXNvdXJjZXMgaW4gcmVzb3VyY2Ugc2V0Ci0JCQkvLyB0byB1cGRhdGUgdGhlIFVSSQotCQkJLy8KLQkJCWZvciAoUmVzb3VyY2UgcmVzIDogZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQocmVzLmdldFVSSSgpKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCXJlcy5zZXRVUkkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCWlmIChmaW5hbFVSSSAhPSBudWxsICYmICFnZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJRmlsZSBmaW5hbEZpbGUgPSBuZXcgRmlsZShmaW5hbFVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlib29sZWFuIHdhc01vdmUgPSAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJCU9iamVjdCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQodGhpcyk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkJLy8gbmFtZSBmb3IgZmluYWxGaWxlIGlzIGFscmVhZHkgdGFrZW4KLQkJCQkJCS8vIHRyeSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIG5hbWUKLQkJCQkJCS8vCi0JCQkJCQlmaW5hbFVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLQkJCQkJCQkJLmdldE5leHRBdmFpbGFibGVGaWxlTmFtZShmaW5hbEZpbGUuZ2V0UGFyZW50KCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yLAotCQkJCQkJCQkJCShDb250ZW50RGVzY3JpcHRpb24pIGUpKTsKLQkJCQkJCWZpbmFsRmlsZSA9IG5ldyBGaWxlKGZpbmFsVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gYmFjayB1cCB0aGUgZmlsZQotCQkJCS8vCi0JCQkJU3RyaW5nIGJhY2t1cCA9IGdldEJhY2t1cEZpbGVQYXRoKCk7Ci0JCQkJRmlsZSBiYWtGaWxlID0gbmV3IEZpbGUoYmFja3VwKTsKLQotCQkJCS8vIHRyeWluZyB0byBkZWxldGUgdGhlIG9sZCBiYWNrdXAgZmlsZSBpZiBpdCBleGlzdHMKLQkJCQkvLwotCQkJCWlmIChiYWtGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWJha0ZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZAotCQkJCQkvLyBmaWxlIGl0IGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkJLy8KLQkJCQkJaWYgKEZpbGVVdGlsLm1vdmVGaWxlKGZpbmFsRmlsZSwgYmFrRmlsZSkpIHsKLQkJCQkJCWJhY2t1cEZpbGUgPSBiYWNrdXA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCQkJZmluYWxGaWxlLCBiYWNrdXApOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbmFtZSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgb3JpZ2luYWwgbmFtZQotCQkJLy8KLQkJCUZpbGUgY3VycmVudEZpbGUgPSBuZXcgRmlsZSh3YXNNb3ZlID8gb2xkVVJJLnRvRmlsZVN0cmluZygpCi0JCQkJCTogZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCQlFeGNlcHRpb24gZXggPSBudWxsOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZSh0aGlzLCBjdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc29tZSBDTSBwcm92aWRlciBsaWtlIENsZWFyQ2FzZSByZW5hbWVkIHRoZSB2ZXJzaW9uZWQgZmlsZSBpbgotCQkJCS8vIGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJLy8gaW4gdGhlIHdvcmtzcGFjZS4gVG8gYXZvaWQgdGhpcywgdXNlIG9ubHkgcmVndWxhciByZW5hbWUKLQkJCQkvLyByb3V0aW5lIG9mIGphdmEuaW8uRmlsZSBpbnN0ZWFkIG9mIElSZXNvdXJjZSByb3V0aW5lCi0JCQkJLy8KLQkJCQl0cnkgewotCQkJCQlGaWxlVXRpbC5kb01vdmVGaWxlKGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXggPSBlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5yZW5hbWVFcnJvcl9tc2csCi0JCQkJCQljdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCQlpZihleCAhPSBudWxsKSB7Ci0JCQkJCW1zZyA9IG1zZyArICI6ICIgICsgKGV4LmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZXguZ2V0TWVzc2FnZSgpIDogZXgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJCS8vIHJlZnJlc2ggcmVzb2x2ZSBVUkkgb2YgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoaXMKLQkJCQkJLy8gcmVzb3VyY2UKLQkJCQkJLy8KLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IodGhpcyk7Ci0JCQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJCXJlc0Rlc2MuY2xlYXJSZXNvbHZlZFVSSSgpOwotCQkJCQkJcmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCQl9IAotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQodGhpcyk7Ci0JCQkJCQkJaWYgKGUgIT0gbnVsbAotCQkJCQkJCQkJJiYgIWdldExpYnJhcnlQZXJzaXN0ZXIoKQotCQkJCQkJCQkJCQkuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSkpIHsKLQkJCQkJCQkJU3RyaW5nIG1zZyA9ICJGQVRBTCBFUlJPUjogbm8gUmVzb3VyY2VEZXNjcmlwdG9yIGZvdW5kIGluIHBhcmVudCByZXNvdXJjZSBmb3IgIiArIHRoaXM7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZWZyZXNoVVJJT2ZDaGlsZFJlc291cmNlcygpOwotCQkJCX0KLQotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvdXJjZVNhdmVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYWNrdXBGaWxlUGF0aCgpIHsKLQkJU3RyaW5nIGJhY2t1cEZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRlbXBEaXIoKSkKLQkJCQkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgib2xkIikuYXBwZW5kKFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpLmdldEd1aWQoKSkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYmFja3VwRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsYXN0TG9hZFRpbWVTdGFtcAotCSAqLwotCXB1YmxpYyBsb25nIGdldExhc3RMb2FkVGltZVN0YW1wKCkgewotCQlyZXR1cm4gbGFzdExvYWRUaW1lU3RhbXA7Ci0JfQotCi0Jc3RhdGljIHZvaWQgY2xlYXJEZXRhY2hlZEVPYmplY3RUb0lETWFwKCkgewotCQlERVRBQ0hFRF9FT0JKRUNUX1RPX0lEX01BUC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNEZXNjCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZURlc2NyaXB0b3IoUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MpIHsKLQkJcmVzb3VyY2VEZXNjcmlwdG9yID0gcmVzRGVzYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlI2dldExvYWRTdGFtcCgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TG9hZFN0YW1wKCkgewotCQlyZXR1cm4gZ2V0TGFzdExvYWRUaW1lU3RhbXAoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFByb3h5VVJJKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChvYmplY3QpOwotCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzb3VyY2VEZXNjcmlwdG9yID0gdGhpcy5yZXNvdXJjZURlc2NyaXB0b3IgIT0gbnVsbCA/IHRoaXMucmVzb3VyY2VEZXNjcmlwdG9yIDoKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHRoaXMpOwotCQkJVVJJIHVyaSA9IHJlc291cmNlRGVzY3JpcHRvciAhPSBudWxsID8gTXVsdGlGaWxlVVJJQ29udmVydGVyCi0JCQkJCS5jcmVhdGVVUkkocmVzb3VyY2VEZXNjcmlwdG9yLmdldElkKCkpIDogZ2V0VVJJKCk7Ci0JCQlyZXR1cm4gdXJpLmFwcGVuZEZyYWdtZW50KGd1aWQpOwotCQl9Ci0JCXJldHVybiBnZXRVUkkoKS5hcHBlbmRGcmFnbWVudChnZXRJRChvYmplY3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeElEKFN0cmluZyB0eElEKSB7Ci0JCXNldFRlbXBVUkkodHhJRCk7Ci0JfQotCQotCXByaXZhdGUgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0TGlicmFyeVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlTYXZlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlTYXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk4NDdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JU2F2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFhNTFNhdmUgaW1wbGVtZW50YXRpb24gZm9yIGxpYnJhcnkgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVYTUlTYXZlSW1wbCBleHRlbmRzIFhNSVNhdmVJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQgPSAiU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmUgb3B0aW9ucyB0byBmb3JjZSBzYXZpbmcgYWxsIHJlc291cmNlcyBpbiB0aGUgcmVzb3VyY2Ugc2V0LCB3aGV0aGVyCi0JICogdGhleSBoYXZlIGJlZW4gbW9kaWZpZWQgb3IgdW5jaGFuZ2VkLiBJdHMgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyAidHJ1ZSIKLQkgKiBvciAiZmFsc2UiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTEwgPSAiU0FWRV9BTEwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbiB0byBzYXZlIG9iamVjdHMgb2YgdGhlIHNhdmUgdHlwZSB0b2dldGhlciBpbiB0aGUgc2FtZSBmaWxlIGlmCi0JICogTXVsdGlGaWxlVXRpbC5jcmVhdGVGaWxlVVJJKCkgcmV0dXJucyB0aGUgc2FtZSBVUkkgZm9yIHRoZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9UT0dFVEhFUl9DTEFTU19TRVQgPSAiU0FWRV9UT0dFVEhFUl9DTEFTU19TRVQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLX1VQX0JFRk9SRV9TQVZFID0gIkJBQ0tfVVBfQkVGT1JFX1NBVkUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyA9ICJESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZJRURfUkVTT1VSQ0VfU0VUID0gIk1PRElGSUVEX1JFU09VUkNFX1NFVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmUgb3B0aW9uIHRvIHNwZWNpZnkgYSBUeFJlY29yZCB0byBsb2cgdGhlIHRyYW5zYWN0aW9uYWwgZGF0YSBmb3IKLQkgKiBmYWlsLXNhZmUgcGVyc2lzdGVuY2UKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLQkgKiBAc2VlIFR4UmVjb3JkCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWF9SRUNPUkQgPSAiVFhfUkVDT1JEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElfRklMRSA9ICJNVUxUSV9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gcmVmcmVzaCB0aGUgd29ya3NwYWNlIHdoZW4gbmV3IHJlc291cmNlIGlzIGNyZWF0ZWQgYW5kCi0JICogc2F2ZWQuIEl0cyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nICJ0cnVlIiBvciAiZmFsc2UiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9ORVdfUkVTT1VSQ0UgPSAiUkVGUkVTSF9ORVdfUkVTT1VSQ0UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbiB0byBjaGVjayB0aGUgcmVzb3VyY2UgZm9yIG1vZGlmaWFibGUgYmVmb3JlIHNhdmluZyBpdC4gSXRzCi0JICogdmFsdWUgbXVzdCBiZSBhIHN0cmluZyAidHJ1ZSIgb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX01PRElGWSA9ICJDSEVDS19NT0RJRlkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgU2V0IHNhdmVTZXBhcmF0ZWx5Q2xhc3NTZXQ7Ci0KLQlwcml2YXRlIE1hcCBvcHRpb25zOwotCi0JLyoqCi0JICogQHBhcmFtIGhlbHBlcgotCSAqLwotCXB1YmxpYyBNdWx0aUZpbGVYTUlTYXZlSW1wbChYTUxIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGhlbHBlcik7Ci0JfQotCi0JWE1MSGVscGVyIGdldFhNTEhlbHBlcigpIHsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxTYXZlSW1wbCNpbml0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UsCi0JICogICAgICBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIE1hcCBvcHRzKSB7Ci0JCXN1cGVyLmluaXQocmVzb3VyY2UsIG9wdHMpOwotCi0vLwkJaWYgKGVzY2FwZSAhPSBudWxsKSB7Ci0vLwkJCS8vIHVzZSBNeUVzY2FwZSB0byBub3QgZXNjYXBlIHdoaXRlc3BhY2VzCi0vLwkJCS8vCi0vLwkJCWVzY2FwZSA9IG5ldyBNeUVzY2FwZSgpOwotLy8JCX0KLQotCQlzYXZlU2VwYXJhdGVseUNsYXNzU2V0ID0gKFNldCkgb3B0cy5nZXQoU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCk7Ci0JCW9wdGlvbnMgPSBvcHRzOwotCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpOwotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQkJfQotCX0KLQotCWJvb2xlYW4gY2FuU2F2ZVNlcGFyYXRlbHkoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuaGFzT3duUmVzb3VyY2Uob2JqLCBzYXZlU2VwYXJhdGVseUNsYXNzU2V0KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVbWFIUkVGKFJlc291cmNlIHJlc291cmNlLCBJbnRlcm5hbEVPYmplY3QgbykgewotCQlpZiAoby5lSXNQcm94eSgpCi0JCQkJJiYgby5lUHJveHlVUkkoKS5zY2hlbWUoKS5lcXVhbHMoTXVsdGlGaWxlVVJJQ29udmVydGVyLlNDSEVNRSkpIHsKLQkJCXJldHVybiBvLmVQcm94eVVSSSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJU3RyaW5nIGhyZWYgPSBudWxsOwotCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCWhyZWYgPSBoZWxwZXIuZ2V0SFJFRihvKTsKLQkJfQotCQlpZiAoaHJlZiA9PSBudWxsKSB7Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHJlc291cmNlIGRlc2NyaXB0b3IgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZSArICJcbiAgb2JqZWN0OiAiICsgbyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLmdldEhSRUYocmVzb3VyY2UsIG8pOwotCQl9Ci0JCXJldHVybiBocmVmOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFNhdmVJbXBsI3NhdmVIcmVmKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlSHJlZihFT2JqZWN0IHJlbW90ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJaWYgKGYgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmICgoRVJlZmVyZW5jZSkgZikuaXNDb250YWlubWVudCgpCi0JCQkJJiYgIXRvRE9NKSB7Ci0JCQkvLyBpZiB0aGlzIEhSRUYgaXMgYSBjb250YWluZWQgZWxlbWVudCwgc2F2ZSBpdHMgSUQgYXR0cmlidXRlIHNvIHRoZQotCQkJLy8gcHJveHkgY2FuIGJlIGNhY2hlZCBpbiB0aGUKLQkJCS8vIEdVSURUb0VsZW1lbnRNYXAgZm9yIHRlbXBvcmFyeSB1c2UgYmVmb3JlIGl0IGNhbiBiZSByZXNvbHZlZC4KLQkJCS8vIFRoaXMgaGVscHMgaW1wcm92ZSBsb2FkaW5nIHRpbWUuCi0JCQkvLwotCQkJU3RyaW5nIGhyZWYgPSBoZWxwZXIuZ2V0SFJFRihyZW1vdGUpOwotCQkJaWYgKGhyZWYgIT0gbnVsbCkgewotCQkJCWlmIChlc2NhcGVVUkkgIT0gbnVsbCkgewotCQkJCQlocmVmID0gZXNjYXBlVVJJLmNvbnZlcnQoaHJlZik7Ci0JCQkJfQotCQkJCVN0cmluZyBuYW1lID0gaGVscGVyLmdldFFOYW1lKGYpOwotCQkJCWRvYy5zdGFydEVsZW1lbnQobmFtZSk7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IHJlbW90ZS5lQ2xhc3MoKTsKLQkJCQlFQ2xhc3MgZXhwZWN0ZWRUeXBlID0gKEVDbGFzcykgZi5nZXRFVHlwZSgpOwotCQkJCWlmIChzYXZlVHlwZUluZm8gPyB4bWxUeXBlSW5mby5zaG91bGRTYXZlVHlwZShlQ2xhc3MsCi0JCQkJCQlleHBlY3RlZFR5cGUsIGYpIDogZUNsYXNzICE9IGV4cGVjdGVkVHlwZQotCQkJCQkJJiYgZXhwZWN0ZWRUeXBlLmlzQWJzdHJhY3QoKSkgewotCQkJCQlzYXZlVHlwZUF0dHJpYnV0ZShlQ2xhc3MpOwotCQkJCX0KLQkJCQlTdHJpbmcgaWQgPSBoZWxwZXIuZ2V0SUQocmVtb3RlKTsKLQkJCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCQlkb2MuYWRkQXR0cmlidXRlKGlkQXR0cmlidXRlTmFtZSwgaWQpOwotCQkJCX0KLQkJCQlkb2MuYWRkQXR0cmlidXRlKFhNTFJlc291cmNlLkhSRUYsIGhyZWYpOwotCQkJCWlmIChlT2JqZWN0VG9FeHRlbnNpb25NYXAgIT0gbnVsbCkgewotCQkJCQlwcm9jZXNzQXR0cmlidXRlRXh0ZW5zaW9ucyhyZW1vdGUpOwotCQkJCQlpZiAocHJvY2Vzc0VsZW1lbnRFeHRlbnNpb25zKHJlbW90ZSkpIHsKLQkJCQkJCWRvYy5lbmRFbGVtZW50KCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkb2MuZW5kRW1wdHlFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlkb2MuZW5kRW1wdHlFbGVtZW50KCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIuc2F2ZUhyZWYocmVtb3RlLCBmKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxTYXZlSW1wbCNzYXZlRmVhdHVyZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUZlYXR1cmVzKEVPYmplY3QgbykgewotCQl0cnkgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbwotCQkJCQkuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gby5lQ29udGFpbmVyKCk7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IGludGVybmFsRU9iamVjdCA9ICgoSW50ZXJuYWxFT2JqZWN0KSBvKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgY2FuU2F2ZVNlcGFyYXRlbHkobykKLQkJCQkJCSYmIGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gY29udGFpbnNOZXdGZWF0dXJlID0gKHJlc291cmNlID09IGNvbnRhaW5lcgotCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvOwotCQkJCQlVUkkgdXJpID0gTXVsdGlGaWxlU2F2ZVV0aWwuY3JlYXRlVVJJKGUsIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCQkJCQlpZiAoY29udGFpbnNOZXdGZWF0dXJlKSB7Ci0JCQkJCQlpZiAoIWludGVybmFsRU9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCQkJLnNhdmUobywgdXJpLCBvcHRpb25zKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgUmVzb3VyY2VEZXNjcmlwdG9yIGZvciB0aGlzCi0JCQkJCQkvLyBlbGVtZW50Ci0JCQkJCQkvLyBjcmVhdGUgYSBuZXcgb25lIGlmIG5lZWRlZAotCQkJCQkJLy8KLQkJCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQkJCQlpZiAocmVzTWdyICE9IG51bGwKLQkJCQkJCQkJJiYgcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihlLmdldEd1aWQoKSkgPT0gbnVsbCkgewotCQkJCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IG5vIG90aGVyIFJlc291cmNlTWFuYWdlciBoYXMgYQotCQkJCQkJCS8vIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhpcyBlbGVtZW50Ci0JCQkJCQkJLy8KLQkJCQkJCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgcmVzb3VyY2UKLQkJCQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJCQkJCWlmICh1cmlDb252ZXJ0ZXIKLQkJCQkJCQkJCS5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKGUuZ2V0R3VpZCgpKSA9PSBudWxsKSB7Ci0JCQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcigKLQkJCQkJCQkJCQlyZXNNZ3IsIGUsIHJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCVN0cmluZyBocmVmID0gZ2V0VW1hSFJFRihyZXNvdXJjZSwgaW50ZXJuYWxFT2JqZWN0KTsKLQkJCQkJZG9jLmFkZEF0dHJpYnV0ZShYTUxSZXNvdXJjZS5IUkVGLCBocmVmKTsKLQkJCQkJZW5kU2F2ZUZlYXR1cmVzKG8sIDAsIG51bGwpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIKLQkJCQkJCSYmIGhlbHBlci5nZXRSZXNvdXJjZSgpICE9IHJlc291cmNlKSB7Ci0JCQkJCVN0cmluZyBocmVmID0gZ2V0VW1hSFJFRihyZXNvdXJjZSwgaW50ZXJuYWxFT2JqZWN0KTsKLQkJCQkJZG9jLmFkZEF0dHJpYnV0ZShYTUxSZXNvdXJjZS5IUkVGLCBocmVmKTsKLQkJCQkJZW5kU2F2ZUZlYXR1cmVzKG8sIDAsIG51bGwpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuc2F2ZUZlYXR1cmVzKG8pOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRVJST1Igc2F2aW5nIGZlYXR1cmU6ICIgKyBvKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiICBGZWF0dXJlIHJlc291cmNlOiAiICsgby5lUmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsI2FkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkgewotCQlzdXBlci5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKTsKLQkJCi0JCWlmICghdG9ET00pIHsKLQkJCS8vIHNhdmUgdG9vbCB2ZXJzaW9uIGluZm8KLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBWZXJzaW9uVXRpbC5nZXRBbGxUb29sSURzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCQlFUEZWZXJzaW9ucyBlcGZWZXJzaW9ucyA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKHRvb2xJRCk7Ci0JCQkJU3RyaW5nIG5zVXJpID0gZXBmVmVyc2lvbnMuZ2V0TnNVUkkoKTsKLQkJCQlkb2MuYWRkQXR0cmlidXRlKEV4dGVuZGVkTWV0YURhdGEuWE1MTlNfUFJFRklYICsgIjoiICsgdG9vbElELCBuc1VyaSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdG9vbFZlcnNpb24gPSBlcGZWZXJzaW9ucy5nZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRMaWJyYXJ5VmVyc2lvbigpLmdldFRvb2xWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCQlkb2MuYWRkQXR0cmlidXRlKHRvb2xJRCArICI6dmVyc2lvbiIsIHRvb2xWZXJzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFc2NhcGUgZXh0ZW5kcyBFc2NhcGUgewotCQkvLyBFTUYgMi4yIGltcHJvdmVkIEVzY2FwZSBhIGxvdCBzbyB0aGUgb3ZlcnJpZGUgdGhpcyBjbGFzcyB0byBhZGQgb3VyIGNvZGUgaXMgbm8gbG9uZ2VyIG5lZWRlZAotCQkvLyBleGNlcHQgdG8gbWFrZSBpdCBwdWJsaWMKLQkJCi0JCXB1YmxpYyBNeUVzY2FwZSgpIHsKLQkJCXNldE1hcHBpbmdMaW1pdCgweDEwRkZGRik7Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPOiBuZWVkcyB0byByZXZpc2l0IHRoaXMgY2xhc3MgcGVyaW9kaWNhbGx5IHNpbmNlIGl0cyBiYXNlIGNsYXNzIG1pZ2h0IGJlIHVwZGF0ZWQgYQotCS8vIGxvdCBpbiBFTUYuCi0vLwlwdWJsaWMgc3RhdGljIGNsYXNzIE15RXNjYXBlIGV4dGVuZHMgRXNjYXBlIHsKLS8vCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1VURl9NQVBQQUJMRV9DT0RFUE9JTlQgPSAweDEwRkZGRjsKLS8vCi0vLwkJcHJvdGVjdGVkIGZpbmFsIGNoYXJbXSBCTEFOSyA9IHt9OwotLy8JCQotLy8JCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NvbnRyb2xDaGFyYWN0ZXJzOwotLy8KLS8vCQlwdWJsaWMgTXlFc2NhcGUoKSB7Ci0vLwkJCXN1cGVyKCk7Ci0vLwkJfQotLy8JCQotLy8JCUBPdmVycmlkZQotLy8JCXB1YmxpYyB2b2lkIHNldEFsbG93Q29udHJvbENoYXJhY3RlcnMoYm9vbGVhbiBhbGxvd0NvbnRyb2xDaGFyYWN0ZXJzKSB7Ci0vLwkJCXRoaXMuYWxsb3dDb250cm9sQ2hhcmFjdGVycyA9IGFsbG93Q29udHJvbENoYXJhY3RlcnM7Ci0vLwkJfQotLy8JCQotLy8JICAgIC8qCi0vLwkgICAgICogIENvbnZlcnQgYXR0cmlidXRlIHZhbHVlczoKLS8vCSAgICAgKiAgJiB0byAmYW1wOwotLy8JICAgICAqICA8IHRvICZsdDsKLS8vCSAgICAgKiAgIiB0byAmcXVvdDsKLS8vCSAgICAgKiAgXHQgdG8gJiN4OTsKLS8vCSAgICAgKiAgXG4gdG8gJiN4QTsKLS8vCSAgICAgKiAgXHIgdG8gJiN4RDsKLS8vCSAgICAgKiAgCi0vLwkgICAgICogID4gdG8gJmd0OyAodGhpcyBpcyB1c2VkIGZvciBYTElGRidzKQotLy8JICAgICAqLwotLy8JICAgIHB1YmxpYyBTdHJpbmcgY29udmVydChTdHJpbmcgaW5wdXQpCi0vLwkgICAgewotLy8JICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0vLwkgICAgICBpbnQgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgoKTsKLS8vCSAgICAgIGdyb3coaW5wdXRMZW5ndGgpOwotLy8JICAgICAgaW50IG91dHB1dFBvcyA9IDA7Ci0vLwkgICAgICBpbnQgaW5wdXRQb3MgPSAwOwotLy8JICAgICAgY2hhciBjaCA9IDA7Ci0vLwkgICAgICB3aGlsZSAoaW5wdXRMZW5ndGgtLSA+IDApCi0vLwkgICAgICB7Ci0vLwkgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KGlucHV0UG9zKyspOyAvLyB2YWx1ZVtvdXRwdXRQb3NdOwotLy8JICAgICAgICBzd2l0Y2ggKGNoKQotLy8JICAgICAgICB7Ci0vLwkgICAgICAgICAgY2FzZSAweDE6Ci0vLwkgICAgICAgICAgY2FzZSAweDI6Ci0vLwkgICAgICAgICAgY2FzZSAweDM6Ci0vLwkgICAgICAgICAgY2FzZSAweDQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDU6Ci0vLwkgICAgICAgICAgY2FzZSAweDY6Ci0vLwkgICAgICAgICAgY2FzZSAweDc6Ci0vLwkgICAgICAgICAgY2FzZSAweDg6Ci0vLwkgICAgICAgICAgY2FzZSAweEI6Ci0vLwkgICAgICAgICAgY2FzZSAweEM6Ci0vLwkgICAgICAgICAgY2FzZSAweEU6Ci0vLwkgICAgICAgICAgY2FzZSAweEY6Ci0vLwkgICAgICAgICAgY2FzZSAweDEwOgotLy8JICAgICAgICAgIGNhc2UgMHgxMToKLS8vCSAgICAgICAgICBjYXNlIDB4MTI6Ci0vLwkgICAgICAgICAgY2FzZSAweDEzOgotLy8JICAgICAgICAgIGNhc2UgMHgxNDoKLS8vCSAgICAgICAgICBjYXNlIDB4MTU6Ci0vLwkgICAgICAgICAgY2FzZSAweDE2OgotLy8JICAgICAgICAgIGNhc2UgMHgxNzoKLS8vCSAgICAgICAgICBjYXNlIDB4MTg6Ci0vLwkgICAgICAgICAgY2FzZSAweDE5OgotLy8JICAgICAgICAgIGNhc2UgMHgxQToKLS8vCSAgICAgICAgICBjYXNlIDB4MUI6Ci0vLwkgICAgICAgICAgY2FzZSAweDFDOgotLy8JICAgICAgICAgIGNhc2UgMHgxRDoKLS8vCSAgICAgICAgICBjYXNlIDB4MUU6Ci0vLwkgICAgICAgICAgY2FzZSAweDFGOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIGlmIChhbGxvd0NvbnRyb2xDaGFyYWN0ZXJzKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQ09OVFJPTF9DSEFSQUNURVJTW2NoXSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBpbnZhbGlkIFhNTCBjaGFyYWN0ZXIgKFVuaWNvZGU6IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoY2gpICsgIikgd2FzIGZvdW5kIGluIHRoZSBlbGVtZW50IGNvbnRlbnQ6IiArIGlucHV0KTsKLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICcmJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBBTVAsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJzwnOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIExFU1MsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIC8vIGJlZ2luIG5ldyBjb2RlCi0vLwkgICAgICAgICAgY2FzZSAnPic6Ci0vLwkgICAgICAgICAgewotLy8JCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIEdSRUFURVIsIGlucHV0TGVuZ3RoKTsKLS8vCQkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCQkgICAgICAgICAgICBicmVhazsgIAotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICAvLyBlbmQgbmV3IGNvZGUJICAgICAgICAgIAotLy8JICAgICAgICAgIGNhc2UgJyInOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIFFVT1RFLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICdcbic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgTEYsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJ1xyJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBDUiwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnXHQnOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIFRBQiwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgZGVmYXVsdDoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZChjaCkpCi0vLwkgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzSGlnaFN1cnJvZ2F0ZShjaCkpCi0vLwkgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICBjaGFyIGhpZ2ggPSBjaDsKLS8vCSAgICAgICAgICAgICAgICBpZiAoaW5wdXRMZW5ndGgtLSA+IDApCi0vLwkgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dC5jaGFyQXQoaW5wdXRQb3MrKyk7IAotLy8JICAgICAgICAgICAgICAgICAgaWYgKFhNTENoYXIuaXNMb3dTdXJyb2dhdGUoY2gpKQotLy8JICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGFibGVMaW1pdCA9PSBNQVhfVVRGX01BUFBBQkxFX0NPREVQT0lOVCkKLS8vCSAgICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IGNvZGVwb2ludCBpcyBzdXBwb3J0ZWQhIAotLy8JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGhpZ2g7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbb3V0cHV0UG9zKytdID0gY2g7Ci0vLwkgICAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvZHVjZSB0aGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciBhcyBhbiBlbnRpdHkKLS8vCSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCAoIiYjeCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKFhNTENoYXIuc3VwcGxlbWVudGFsKGhpZ2gsIGNoKSkgKyAiOyIpLnRvQ2hhckFycmF5KCksIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBpbnZhbGlkIGxvdyBzdXJyb2dhdGUgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gdW5wYWlyZWQgaGlnaCBzdXJyb2dhdGUgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBpbnZhbGlkIFhNTCBjaGFyYWN0ZXIgKFVuaWNvZGU6IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoY2gpICsgIikgd2FzIGZvdW5kIGluIHRoZSBlbGVtZW50IGNvbnRlbnQ6IiArIGlucHV0KTsKLS8vCSAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAvLyBOb3JtYWwgKEJNUCkgdW5pY29kZSBjb2RlcG9pbnQuIFNlZSBpZiB3ZSBrbm93IGZvciBhIGZhY3QgdGhhdCB0aGUgZW5jb2Rpbmcgc3VwcG9ydHMgaXQ6Ci0vLwkgICAgICAgICAgICAgIGlmIChjaCA8PSBtYXBwYWJsZUxpbWl0KQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgdmFsdWVbb3V0cHV0UG9zKytdID0gY2g7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgLy8gV2Ugbm90IHN1cmUgdGhlIGVuY29kaW5nIHN1cHBvcnRzIHRoaXMgY29kZXBvaW50LCBzbyB3ZSB3cml0ZSBpdCBhcyBhIGNoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlLgotLy8JICAgICAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsICgiJiN4IiArIEludGVnZXIudG9IZXhTdHJpbmcoY2gpICsgIjsiKS50b0NoYXJBcnJheSgpLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgfQotLy8JICAgICAgfQotLy8JICAgICAgcmV0dXJuIGNoYW5nZWQgPyBuZXcgU3RyaW5nKHZhbHVlLCAwLCBvdXRwdXRQb3MpIDogaW5wdXQ7Ci0vLwkgICAgfQotLy8KLS8vCSAgICAvKgotLy8JICAgICAqICBDb252ZXJ0IGVsZW1lbnQgdmFsdWVzOgotLy8JICAgICAqICAmIHRvICZhbXA7Ci0vLwkgICAgICogIDwgdG8gJmx0OwotLy8JICAgICAqICAiIHRvICZxdW90OwotLy8JICAgICAqICBcbiB0byBsaW5lIHNlcGFyYXRvcgotLy8JICAgICAqICAKLS8vCSAgICAgKiAgXHIgdG8gYmxhbms7Ci0vLwkgICAgICogID4gdG8gJmd0OyAodGhpcyBpcyB1c2VkIGZvciBYTElGRidzKQotLy8JICAgICAqLwotLy8JICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRleHQoU3RyaW5nIGlucHV0KQotLy8JICAgIHsKLS8vCSAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotLy8JICAgICAgaW50IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0vLwkgICAgICBncm93KGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgIGludCBvdXRwdXRQb3MgPSAwOwotLy8JICAgICAgaW50IGlucHV0UG9zID0gMDsKLS8vCSAgICAgIGNoYXIgY2g7Ci0vLwkgICAgICB3aGlsZSAoaW5wdXRMZW5ndGgtLSA+IDApCi0vLwkgICAgICB7Ci0vLwkgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KGlucHV0UG9zKyspOyAvLyB2YWx1ZVtvdXRwdXRQb3NdOwotLy8JICAgICAgICBzd2l0Y2ggKGNoKQotLy8JICAgICAgICB7Ci0vLwkgICAgICAgICAgY2FzZSAweDE6Ci0vLwkgICAgICAgICAgY2FzZSAweDI6Ci0vLwkgICAgICAgICAgY2FzZSAweDM6Ci0vLwkgICAgICAgICAgY2FzZSAweDQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDU6Ci0vLwkgICAgICAgICAgY2FzZSAweDY6Ci0vLwkgICAgICAgICAgY2FzZSAweDc6Ci0vLwkgICAgICAgICAgY2FzZSAweDg6Ci0vLwkgICAgICAgICAgY2FzZSAweEI6Ci0vLwkgICAgICAgICAgY2FzZSAweEM6Ci0vLwkgICAgICAgICAgY2FzZSAweEU6Ci0vLwkgICAgICAgICAgY2FzZSAweEY6Ci0vLwkgICAgICAgICAgY2FzZSAweDEwOgotLy8JICAgICAgICAgIGNhc2UgMHgxMToKLS8vCSAgICAgICAgICBjYXNlIDB4MTI6Ci0vLwkgICAgICAgICAgY2FzZSAweDEzOgotLy8JICAgICAgICAgIGNhc2UgMHgxNDoKLS8vCSAgICAgICAgICBjYXNlIDB4MTU6Ci0vLwkgICAgICAgICAgY2FzZSAweDE2OgotLy8JICAgICAgICAgIGNhc2UgMHgxNzoKLS8vCSAgICAgICAgICBjYXNlIDB4MTg6Ci0vLwkgICAgICAgICAgY2FzZSAweDE5OgotLy8JICAgICAgICAgIGNhc2UgMHgxQToKLS8vCSAgICAgICAgICBjYXNlIDB4MUI6Ci0vLwkgICAgICAgICAgY2FzZSAweDFDOgotLy8JICAgICAgICAgIGNhc2UgMHgxRDoKLS8vCSAgICAgICAgICBjYXNlIDB4MUU6Ci0vLwkgICAgICAgICAgY2FzZSAweDFGOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIGlmIChhbGxvd0NvbnRyb2xDaGFyYWN0ZXJzKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBDT05UUk9MX0NIQVJBQ1RFUlNbY2hdLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnJic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQU1QLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICc8JzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBMRVNTLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICciJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBRVU9URSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnXG4nOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIExJTkVfRkVFRCwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgLy8gYmVnaW4gbW9kaWZpZWQKLS8vCSAgICAgICAgICBjYXNlICdccic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQkxBTkssIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJz4nOgotLy8JICAgICAgICAgIHsKLS8vLy8JICAgICAgICAgICAgaWYgKGlucHV0UG9zID49IDMgJiYgaW5wdXQuY2hhckF0KGlucHV0UG9zIC0gMikgPT0gJ10nICYmIGlucHV0LmNoYXJBdChpbnB1dFBvcyAtIDMpID09ICddJykKLS8vLy8JICAgICAgICAgICAgewotLy8vLwkgICAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIEdSRUFURVIsIGlucHV0TGVuZ3RoKTsKLS8vLy8JICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vLy8JICAgICAgICAgICAgICBicmVhazsKLS8vLy8JICAgICAgICAgICAgfQotLy8vLwkgICAgICAgICAgICAvLyBjb250aW51ZSB3aXRoIGRlZmF1bHQgcHJvY2Vzc2luZwotLy8JICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkJICAgICAgLy8gZW5kIG1vZGlmaWVkCi0vLwkgICAgICAgICAgZGVmYXVsdDoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZChjaCkpCi0vLwkgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzSGlnaFN1cnJvZ2F0ZShjaCkpCi0vLwkgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICBjaGFyIGhpZ2ggPSBjaDsKLS8vCSAgICAgICAgICAgICAgICBpZiAoaW5wdXRMZW5ndGgtLSA+IDApCi0vLwkgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dC5jaGFyQXQoaW5wdXRQb3MrKyk7IAotLy8JICAgICAgICAgICAgICAgICAgaWYgKFhNTENoYXIuaXNMb3dTdXJyb2dhdGUoY2gpKQotLy8JICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGFibGVMaW1pdCA9PSBNQVhfVVRGX01BUFBBQkxFX0NPREVQT0lOVCkKLS8vCSAgICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IGNvZGVwb2ludCBpcyBzdXBwb3J0ZWQhIAotLy8JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGhpZ2g7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbb3V0cHV0UG9zKytdID0gY2g7Ci0vLwkgICAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvZHVjZSB0aGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciBhcyBhbiBlbnRpdHkKLS8vCSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCAoIiYjeCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKFhNTENoYXIuc3VwcGxlbWVudGFsKGhpZ2gsIGNoKSkgKyAiOyIpLnRvQ2hhckFycmF5KCksIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBpbnZhbGlkIGxvdyBzdXJyb2dhdGUgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gdW5wYWlyZWQgaGlnaCBzdXJyb2dhdGUgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBpbnZhbGlkIFhNTCBjaGFyYWN0ZXIgKFVuaWNvZGU6IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoY2gpICsgIikgd2FzIGZvdW5kIGluIHRoZSBlbGVtZW50IGNvbnRlbnQ6IiArIGlucHV0KTsKLS8vCSAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAvLyBOb3JtYWwgKEJNUCkgdW5pY29kZSBjb2RlcG9pbnQuIFNlZSBpZiB3ZSBrbm93IGZvciBhIGZhY3QgdGhhdCB0aGUgZW5jb2Rpbmcgc3VwcG9ydHMgaXQ6Ci0vLwkgICAgICAgICAgICAgIGlmIChjaCA8PSBtYXBwYWJsZUxpbWl0KQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgdmFsdWVbb3V0cHV0UG9zKytdID0gY2g7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgLy8gV2Ugbm90IHN1cmUgdGhlIGVuY29kaW5nIHN1cHBvcnRzIHRoaXMgY29kZXBvaW50LCBzbyB3ZSB3cml0ZSBpdCBhcyBhIGNoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlLgotLy8JICAgICAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsICgiJiN4IiArIEludGVnZXIudG9IZXhTdHJpbmcoY2gpICsgIjsiKS50b0NoYXJBcnJheSgpLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgfQotLy8JICAgICAgfQotLy8JICAgICAgcmV0dXJuIGNoYW5nZWQgPyBuZXcgU3RyaW5nKHZhbHVlLCAwLCBvdXRwdXRQb3MpIDogaW5wdXQ7Ci0vLwkgICAgfQotLy8KLS8vCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01vZGlmeVJlcXVpcmVkKE1hcCBvcHRpb25zKSB7Ci0JCU9iamVjdCBvcHQgPSBvcHRpb25zLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlkpOwotCQlyZXR1cm4gb3B0ICE9IG51bGwgPyBCb29sZWFuLnZhbHVlT2Yob3B0LnRvU3RyaW5nKCkpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJOiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOThmNjY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBmb3IgdGhlIExpYnJhcnkgUGVyc2lzdGVuY2UgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQZXJzaXN0ZW5jZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1R4UmVjb3JkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1R4UmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YzBlYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGtlZXAgdGhlIHRyYW5zYWN0aW9uIGRhdGEgdG8gc3VwcG9ydCBmYWlsLXNhZmUgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotY2xhc3MgVHhSZWNvcmQgewotCi0JcHJpdmF0ZSBTdHJpbmcgdHhJRDsKLQotCXByaXZhdGUgTGlzdCByZXNvdXJjZXNUb0NvbW1pdDsKLQotCXByb3RlY3RlZCBMaXN0IHdhcm5pbmdzOwotCi0JLyoqCi0JICogQHBhcmFtIHR4aWQKLQkgKiBAcGFyYW0gY29tbWl0Ci0JICovCi0JcHVibGljIFR4UmVjb3JkKCkgewotCQlzdXBlcigpOwotCQlyZXNvdXJjZXNUb0NvbW1pdCA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHhJRCgpIHsKLQkJaWYgKHR4SUQgPT0gbnVsbCkgewotCQkJdHhJRCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCk7Ci0JCX0KLQkJcmV0dXJuIHR4SUQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzVG9Db21taXQoKSB7Ci0JCXJldHVybiByZXNvdXJjZXNUb0NvbW1pdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB3YXJuaW5ncwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdhcm5pbmdzKCkgewotCQlpZiAod2FybmluZ3MgPT0gbnVsbCkgewotCQkJd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHdhcm5pbmdzOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0eElEID0gbnVsbDsKLQkJcmVzb3VyY2VzVG9Db21taXQuY2xlYXIoKTsKLQkJaWYgKHdhcm5pbmdzICE9IG51bGwpIHsKLQkJCXdhcm5pbmdzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1Vubm9ybWFsaXplZFVSSUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzMzYTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBmb3IgVVJJIHRoYXQgY2Fubm90IGJlIG5vcm1hbGl6ZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXh0ZW5kcyBNdWx0aUZpbGVJT0V4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIFVSSSB1cmk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbihVUkkgdXJpLCBTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JCXRoaXMudXJpID0gdXJpOwotCX0KLQkKLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgxMjkzMTYyMTA3NTUzMzc4MTZMOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVBlcnNpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjcxMDliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVBlcnNpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlQZXJzaXN0ZXIgaW1wbGVtZW50cyBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciB7Ci0JCi0JLyoqCi0JICogQ29udHJ1Y3RzIGEgbmV3IFhNSUxpYnJhcnlQZXJzaXN0ZXIgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFhNSUxpYnJhcnlQZXJzaXN0ZXIoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZpbGVFeHRlbnNpb24oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2V0RmlsZUV4dGVuc2lvbihlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNoYXNPd25Gb2xkZXIoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25Gb2xkZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duRm9sZGVyKGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNhZGp1c3RMb2NhdGlvbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2RlbGV0ZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmRlbGV0ZShlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKQotCSAqLwotCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2dldFdhcm5pbmdzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2V0V2FybmluZ3MoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjaGFzT3duUmVzb3VyY2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZShPYmplY3QgZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5oYXNPd25SZXNvdXJjZShlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihPYmplY3QgZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5oYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjc2F2ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2F2ZShyZXNvdXJjZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI3NhdmUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5zYXZlKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBGaWxlIGNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihTdHJpbmcgcGx1Z2luTmFtZSwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihwbHVnaW5OYW1lLCBsaWJyYXJ5KTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGlicmFyeSk7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCWJvb2xlYW4gY3JlYXRlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYnJhcnksIGNyZWF0ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5LCBGaWxlIGZpbGUpIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5zZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihsaWJyYXJ5LCBmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KFJlc291cmNlIHJlc291cmNlLCBSZXNvdXJjZSBjb250YWluZXJSZXNvdXJjZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5pc0NvbnRhaW5lZEJ5KHJlc291cmNlLCBjb250YWluZXJSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUZvbGRlclBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldFJlc291cmNlRm9sZGVyUGF0aChlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbGRlckFic29sdXRlUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlciNkZWxldGUoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5kZWxldGUoZWxlbWVudHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmFmOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgaW1wbGVtZW50cyBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSNjcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZUxpYnJhcnlSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL0lNaWdyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4MDI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL0lNaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBNaWdyYXRlcyBvbmUgdmVyc2lvbiBvZiBVTUEgbGlicmFyeSB0byBhbm90aGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1pZ3JhdG9yIHsKLQotCXZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCXZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uOwotCXZvaWQgbWlncmF0ZVhtbEltcG9ydGVkTGliKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01hcHBpbmdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NYXBwaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWUwNWUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01hcHBpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gcGVyZm9ybSBsaWJyYXJ5IHVwZ3JhZGUgZnJvbQotICogb2xkZXIgdmVyc2lvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hcHBpbmdVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1pZ3JhdG9yIHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCi0JCVN0cmluZyBsaWJOc1VSSTsKLQotCQlJTWlncmF0b3IgaW5zdGFuY2U7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBidW5kbGUKLQkJICogQHBhcmFtIGNsYXNzTmFtZQotCQkgKiBAcGFyYW0gbGliTnNVUkkKLQkJICovCi0JCXB1YmxpYyBNaWdyYXRvcihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbGliTnNVUkkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5saWJOc1VSSSA9IGxpYk5zVVJJOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIG1pZ3JhdG9yczsKLQlwcml2YXRlIHN0YXRpYyBTZXQgb2xkTnNVcmlzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkanVzdGVkTGliTnNVUklNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJTWlncmF0b3IgZ2V0TWlncmF0b3IoU3RyaW5nIGxpYk5zVVJJKSB7Ci0JCWlmIChtaWdyYXRvcnMgPT0gbnVsbCkgewotCQkJbWlncmF0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkJCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5taWdyYXRvcnMiCi0JCQkvLyBleHRlbnNpb24gcG9pbnQKLQkJCS8vIGNvbnRyaWJ1dG9ycy4KLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KAotCQkJCQkJCSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIsICJtaWdyYXRvcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbnNVUkkgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJsaWJOc1VSSSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsCi0JCQkJCQkJCQkmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkJJiYgbnNVUkkgIT0gbnVsbAotCQkJCQkJCQkJJiYgbnNVUkkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQltaWdyYXRvcnMucHV0KG5zVVJJLCBuZXcgTWlncmF0b3IoYnVuZGxlLAotCQkJCQkJCQkJCWNsYXNzTmFtZSwgbnNVUkkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWlncmF0b3IgbWlncmF0b3IgPSAoTWlncmF0b3IpIG1pZ3JhdG9ycy5nZXQobGliTnNVUkkpOwotCQlpZiAobWlncmF0b3IgIT0gbnVsbCkgewotCQkJaWYgKG1pZ3JhdG9yLmluc3RhbmNlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQltaWdyYXRvci5pbnN0YW5jZSA9IChJTWlncmF0b3IpIG1pZ3JhdG9yLmJ1bmRsZS5sb2FkQ2xhc3MoCi0JCQkJCQkJbWlncmF0b3IuY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1pZ3JhdG9yLmluc3RhbmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udmVyc2lvblJlcXVpcmVkKFN0cmluZyBsaWJQYXRoLAotCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCVN0cmluZyBjdXJyZW50TnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkoKTsKLQkJU3RyaW5nIGxpYk5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKGxpYlBhdGgpOwotCQlsaWJOc1VSSSA9IGdldEFkanVzdGVkTGliTnNVUkkobGliTnNVUkksIGluZm8pOwotCi0JCWlmIChvbGROc1VyaXMuY29udGFpbnMobGliTnNVUkkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoY3VycmVudE5zVVJJLmVxdWFscyhsaWJOc1VSSSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlib29sZWFuIHJldCA9IGdldE1pZ3JhdG9yKGxpYk5zVVJJKSAhPSBudWxsOwotCQlpZiAocmV0KSB7Ci0JCQlvbGROc1VyaXMuYWRkKGxpYk5zVVJJKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvL1RoaXMgaXMgYW4gdWdseSBwaWVjZSwgYnV0IHdlIG5lZWQgaXQgZm9yIG1pZ3JhdGluZyBFUEYgMS4xLjAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWRqdXN0ZWRMaWJOc1VSSShTdHJpbmcgbGliTnNVUkksIFZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbykgewotCQlTdHJpbmcgcmV0ID0gZ2V0QWRqdXN0ZWRMaWJOc1VSSV8obGliTnNVUkksIGluZm8pOwotCQlpZiAocmV0ICE9IGxpYk5zVVJJKSB7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGxpYk5zVVJJOiAiICsgbGliTnNVUkkpOwkvLyROT04tTkxTLTEkIAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGFkanVzdGVkTGliTnNVUkk6ICIgKyByZXQpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhZGp1c3RlZExpYk5zVVJJTWFwLnB1dChsaWJOc1VSSSwgcmV0KTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWRqdXN0ZWRMaWJOc1VSSV8oU3RyaW5nIGxpYk5zVVJJLCBWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGN1cnJlbnROc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSSgpOwotCQlpZiAoISBjdXJyZW50TnNVUkkuZXF1YWxzKGxpYk5zVVJJKSkgewotCQkJcmV0dXJuIGxpYk5zVVJJOwotCQl9IGVsc2UgaWYgKCEgbGliTnNVUkkuZXF1YWxzKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCXJldHVybiBsaWJOc1VSSTsKLQkJfQotCQlpZiAoaW5mby50b29sVmVyc2lvbi5lcXVhbHMoaW5mby5jdXJyZW50TWluVG9vbFZlcnNpb24pKSB7Ci0JCQlyZXR1cm4gbGliTnNVUkk7Ci0JCX0KLQkJcmV0dXJuICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIjsJLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlNaWdyYXRvciBtaWdyYXRvciA9IGdldE1pZ3JhdG9yQnlMaWJQYXRoKGxpYlBhdGgpOwotCQlpZiAobWlncmF0b3IgIT0gbnVsbCkgewotCQkJbWlncmF0b3IubWlncmF0ZShsaWJQYXRoLCBtb25pdG9yLCBpbmZvKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNaWdyYXRvciBnZXRNaWdyYXRvckJ5TGliUGF0aChTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgbnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkobGliUGF0aCk7Ci0JCVN0cmluZyBhZGp1c3RlZExpYk5zVVJJID0gYWRqdXN0ZWRMaWJOc1VSSU1hcC5nZXQobnNVUkkpOwotCQlpZiAoYWRqdXN0ZWRMaWJOc1VSSSAhPSBudWxsKSB7Ci0JCQluc1VSSSA9IGFkanVzdGVkTGliTnNVUkk7Ci0JCX0KLQkJcmV0dXJuIGdldE1pZ3JhdG9yKG5zVVJJKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gYXJnc1swXTsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJTdGFydCBtaWdyYXRpbmcgbWV0aG9kIGxpYnJhcnkgYXQgJyIgKyBsaWJQYXRoICsgIicuLi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQltaWdyYXRlKGxpYlBhdGgsIG51bGwsIG51bGwpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1pZ3JhdGlvbiBzdWNjZXNzZnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJNaWdyYXRpb24gZmFpbGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzM4ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuQmFzaWNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGU7Ci0KLS8qKgotICogUmVzb3VyY2UgaGFuZGxlciBmb3IgbWlncmF0aW5nIFVNQSBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlciBleHRlbmRzIEJhc2ljUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOwotCi0JcHVibGljIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5CYXNpY1Jlc291cmNlSGFuZGxlciNwb3N0TG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0TG9hZChYTUxSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sCi0JCQlNYXAgb3B0aW9ucykgewotCQlpZiAoIXJlc291cmNlLmdldEVPYmplY3RUb0V4dGVuc2lvbk1hcCgpLmlzRW1wdHkoKSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1pZ3JhdGlvblJlc291cmNlSGFuZGxlci5wb3N0TG9hZCgpOiAiICsgcmVzb3VyY2UuZ2V0VVJJKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tIFN0YXJ0IHVua25vd24gZmVhdHVyZXMgLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRFT2JqZWN0VG9FeHRlbnNpb25NYXAoKS5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCS8vIGhhbmRsZSBtb3ZlZCBkYXRhCi0JCQkJCS8vCi0JCQkJCWhhbmRsZVVua25vd25EYXRhKChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKSwgKEFueVR5cGUpZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFbmQgdW5rbm93biBmZWF0dXJlcyAtLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoQW55VHlwZSB2YWx1ZSkgewotCQl0cnkgewotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEZlYXR1cmVNYXAuRW50cnkpIHZhbHVlLmdldE1peGVkKCkuZ2V0KDApOwotCQkJcmV0dXJuIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRUF0dHJpYnV0ZSBnZXRFQXR0cmlidXRlKEVDbGFzcyBlQ2xhc3MsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlQ2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYXR0cmliLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0cmliOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJZU9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gdmFsdWVzID0gKENvbGxlY3Rpb24pIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlVW5rbm93bkZlYXR1cmUoRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSk7Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlVW5rbm93bkZlYXR1cmVzKEVPYmplY3Qgb3duZXIsIEZlYXR1cmVNYXAgZmVhdHVyZU1hcCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChGZWF0dXJlTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQlpZihoYW5kbGVVbmtub3duRmVhdHVyZShvd25lciwgZiwgZW50cnkuZ2V0VmFsdWUoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25EYXRhKEVPYmplY3QgZSwgQW55VHlwZSB1bmtub3duRGF0YSkgewotCQloYW5kbGVVbmtub3duRmVhdHVyZXMoZSwgdW5rbm93bkRhdGEuZ2V0TWl4ZWQoKSk7Ci0JCWhhbmRsZVVua25vd25GZWF0dXJlcyhlLCB1bmtub3duRGF0YS5nZXRBbnlBdHRyaWJ1dGUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTaW5nbGVWYWx1ZShGZWF0dXJlTWFwIGZlYXR1cmVNYXAsCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBDb2xsZWN0aW9uIGdldFZhbHVlKEZlYXR1cmVNYXAgZmVhdHVyZU1hcCwKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlDb2xsZWN0aW9uIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCWxpc3QuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmZjM5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0b24gZm9yIElNaWdyYXRvcgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3JJbXBsIGltcGxlbWVudHMgSU1pZ3JhdG9yIHsKLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewkJCi0JfQotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWlncmF0ZVhtbEltcG9ydGVkTGliKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewkJCi0JfQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjVkMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVU1BMlVNQVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGU7Ci0KLS8qKgotICogUmVzb3VyY2UgaGFuZGxlciBmb3IgbWlncmF0aW5nIFVNQSBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ci0KLQlwcml2YXRlIExpc3QgbW92ZUluZm9zOwotCi0JcHVibGljIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCW1vdmVJbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEVBdHRyaWJ1dGUgZ2V0RUF0dHJpYnV0ZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGF0dHJpYi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHJ1bGVzIHRvIG1vdmUgZGF0YQotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE5ld0ZlYXR1cmUoRU9iamVjdCBvd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgcnVsZXMgdG8gbW92ZSBkYXRhCi0JICogCi0JICogQHBhcmFtIG9sZE93bmVyCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldE5ld093bmVyKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE5ld1ZhbHVlKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSwKLQkJCUFueVR5cGUgdmFsdWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURhdGEoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVJbmZvcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1vdmVJbmZvIGluZm8gPSAoTW92ZUluZm8pIGl0ZXIubmV4dCgpOwotCQkJRU9iamVjdCBuZXdPd25lciA9IGdldE5ld093bmVyKGluZm8ub2xkT3duZXIsIGluZm8ub2xkRmVhdHVyZU5hbWUpOwotCQkJaWYgKG5ld093bmVyICE9IG51bGwpIHsKLQkJCQlzZXRWYWx1ZShuZXdPd25lciwgaW5mby5uZXdGZWF0dXJlLCBpbmZvLnZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJZU9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gdmFsdWVzID0gKENvbGxlY3Rpb24pIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb3ZlSW5mbyB7Ci0JCUVPYmplY3Qgb2xkT3duZXI7Ci0KLQkJU3RyaW5nIG9sZEZlYXR1cmVOYW1lOwotCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdGZWF0dXJlOwotCi0JCU9iamVjdCB2YWx1ZTsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCkKLQkJCQkJLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSkKLQkJCQkJLmFwcGVuZCgiKFxuIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCIgIG9sZEZlYXR1cmVOYW1lOiAiKS5hcHBlbmQob2xkRmVhdHVyZU5hbWUpLmFwcGVuZCgnXG4nKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIiAgbmV3RmVhdHVyZTogIikuYXBwZW5kKG5ld0ZlYXR1cmUpLmFwcGVuZCgnXG4nKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIiAgdmFsdWU6ICIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCdcbicpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiKSIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNpbmdsZVZhbHVlKEZlYXR1cmVNYXAgZmVhdHVyZU1hcCwKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbGxlY3Rpb24gZ2V0VmFsdWUoRmVhdHVyZU1hcCBmZWF0dXJlTWFwLAotCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCUNvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJbGlzdC5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJNb3ZlSW5mb3MoKSB7Ci0JCW1vdmVJbmZvcy5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblJlc291cmNlSGFuZGxlciNoYW5kbGVVbmtub3duRmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVbmtub3duRmVhdHVyZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCVN0cmluZyBmZWF0dXJlTmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgbmV3RmVhdHVyZSA9IGdldE5ld0ZlYXR1cmUob3duZXIsIGZlYXR1cmVOYW1lKTsKLQkJaWYgKG5ld0ZlYXR1cmUgIT0gbnVsbCkgewotCQkJTW92ZUluZm8gbW92ZUluZm8gPSBuZXcgTW92ZUluZm8oKTsKLQkJCW1vdmVJbmZvLm9sZE93bmVyID0gb3duZXI7Ci0JCQltb3ZlSW5mby5vbGRGZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lOwotCQkJbW92ZUluZm8ubmV3RmVhdHVyZSA9IG5ld0ZlYXR1cmU7Ci0JCQltb3ZlSW5mby52YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQW55VHlwZSA/IGdldE5ld1ZhbHVlKAotCQkJCQlvd25lciwgZmVhdHVyZU5hbWUsIChBbnlUeXBlKSB2YWx1ZSkKLQkJCQkJOiB2YWx1ZTsKLQkJCW1vdmVJbmZvcy5hZGQobW92ZUluZm8pOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1vdmVJbmZvKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VwZ3JhZGVDYWxsZXJJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VcGdyYWRlQ2FsbGVySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NlNjc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VwZ3JhZGVDYWxsZXJJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQ2xhc3MgcmVwcmVzZW50aW5nIGNhbGxlciBpbmZvIGZvciBjYWxsaW5nIGxpYnJhcnkgdXBncmFkZSBjb2RlLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBncmFkZUNhbGxlckluZm8gewotCQotCXB1YmxpYyBzdGF0aWMgaW50IHVwZ3JhZGVMaWJyYXJ5ID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCB1cGdyYWRlSW1wb3J0UGx1Z2luID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCB1cGdyYWRlSW1wb3J0Q29uZmlnID0gMjsKLQkKLQlwcml2YXRlIGludCBjYWxsZXJUeXBlID0gdXBncmFkZUxpYnJhcnk7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNc2c7Ci0JRmlsZSBsaWJGaWxlOwotCUZpbGUgY29waWVkTGliRmlsZTsKLQkKLQlwdWJsaWMgVXBncmFkZUNhbGxlckluZm8oaW50IGNhbGxlclR5cGUsIEZpbGUgbGliRmlsZSkgewotCQl0aGlzLmNhbGxlclR5cGUgPSBjYWxsZXJUeXBlOwotCQl0aGlzLmxpYkZpbGUgPSBsaWJGaWxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeShVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB7Ci0JCXJldHVybiBpbmZvID09IG51bGwgfHwgaW5mby5pc1VwZ3JhZGVMaWJyYXJ5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXBncmFkZUxpYnJhcnkoKSB7Ci0JCXJldHVybiBjYWxsZXJUeXBlID09IHVwZ3JhZGVMaWJyYXJ5OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkgewotCQlyZXR1cm4gY2FsbGVyVHlwZSA9PSB1cGdyYWRlSW1wb3J0UGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1zZyhTdHJpbmcgbXNnKSB7Ci0JCWVycm9yTXNnID0gbXNnOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTXNnKCkgewotCQlyZXR1cm4gZXJyb3JNc2c7Ci0JfQkJCQotCQotCXB1YmxpYyB2b2lkIHNldENvcGllZExpYkZpbGUoRmlsZSBmaWxlKSB7Ci0JCWNvcGllZExpYkZpbGUgPSBmaWxlOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRDb3BpZWRMaWJGaWxlKCkgewotCQlyZXR1cm4gY29waWVkTGliRmlsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZpbGUgZ2V0TGliRmlsZSgpIHsKLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY29weUxpYnJhcnkoKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvcGllZExpYnJhcnkoKSB7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvTWlncmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL01pZ3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzODVhYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvTWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwuRWNvcmUyWE1MUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwuRWNvcmUyWE1MUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLmltcGwuRWNvcmUyWE1MUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC51dGlsLkVjb3JlMlhNTEV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogTWlncmF0ZXMgb25lIHZlcnNpb24gb2YgVU1BIGxpYnJhcnkgdG8gYW5vdGhlciB1c2luZyB0aGUgcHJvdmlkZWQgRWNvcmUyWE1MCi0gKiBtYXBwaW5nIGZpbGVzIGFuZCBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyLiBUaGUgRWNvcmUyWE1MIG1hcHBpbmcgZmlsZXMKLSAqIHNwZWNpZmllcyB0aGUgbmFtZSBjaGFuZ2VzIG9mIGNsYXNzZXMvYXR0cmlidXRlcyB3aGlsZSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0gKiBoYW5kbGVzIHRoZSBkYXRhIG1vdmluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOU19VUklzID0geyBNaWdyYXRvci5PTERfVU1BX05TX1VSSSwKLQkJCU1pZ3JhdG9yLk9MRF9VTUFfTlNfVVJJLCBNaWdyYXRvci5VTUFfTlNfVVJJIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUklbXSBFQ09SRTJYTUxfVVJJcyA9IHsKLQkJCVVSSQotCQkJCQkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL2NvbS5pYm0ucnBtLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYS5lY29yZTJ4bWwiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlVUkkKLQkJCQkJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3BsdWdpbi9jb20uaWJtLnJwbS5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWEyLmVjb3JlMnhtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCVVSSQotCQkJCQkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL2NvbS5pYm0ucnBtLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTMuZWNvcmUyeG1sIikgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfVU1BX05TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX05TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXh0ZW5kZWRNZXRhRGF0YVtdIGV4dGVuZGVkTWV0YURhdGFzOwotCi0JcHJpdmF0ZSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyMCByZXNvdXJjZUhhbmRsZXI7Ci0KLQlwdWJsaWMgSGFzaE1hcCBvbGRQYXRoVG9OZXdVUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIENvbGxlY3Rpb24gYW55VHlwZUZlYXR1cmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbmRlZE1ldGFEYXRhIGdldEV4dGVuZGVkTWV0YURhdGEoU3RyaW5nIG9sZE5zVVJJLAotCQkJVVJJIGVjb3JlMlhNTFVSSSkgewotCQlFUGFja2FnZS5SZWdpc3RyeSBlUGFja2FnZVJlZ2lzdHJ5ID0gbmV3IEVQYWNrYWdlUmVnaXN0cnlJbXBsKAotCQkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKTsKLQkJZVBhY2thZ2VSZWdpc3RyeS5wdXQob2xkTnNVUkksIFVtYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQlFY29yZTJYTUxSZWdpc3RyeSBlY29yZTJ4bWxSZWdpc3RyeSA9IG5ldyBFY29yZTJYTUxSZWdpc3RyeUltcGwoCi0JCQkJRWNvcmUyWE1MUmVnaXN0cnkuSU5TVEFOQ0UpOwotCi0JCWVjb3JlMnhtbFJlZ2lzdHJ5Ci0JCQkJLnB1dChvbGROc1VSSSwgRWNvcmVVdGlsLmdldE9iamVjdEJ5VHlwZShuZXcgUmVzb3VyY2VTZXRJbXBsKCkKLQkJCQkJCS5nZXRSZXNvdXJjZShlY29yZTJYTUxVUkksIHRydWUpLmdldENvbnRlbnRzKCksCi0JCQkJCQlFY29yZTJYTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRYTUxNYXAoKSkpOwotCi0JCXJldHVybiBuZXcgRWNvcmUyWE1MRXh0ZW5kZWRNZXRhRGF0YShlUGFja2FnZVJlZ2lzdHJ5LAotCQkJCWVjb3JlMnhtbFJlZ2lzdHJ5KSB7Ci0JCQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0VHlwZShFUGFja2FnZSBlUGFja2FnZSwgU3RyaW5nIG5hbWUpIHsKLQkJCQlFQ2xhc3NpZmllciB0eXBlID0gc3VwZXIuZ2V0VHlwZShlUGFja2FnZSwgbmFtZSk7Ci0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHRyeSB0byBnZXQgdHlwZSBmcm9tIHRoZSBwYWNrYWdlIHdpdGggdGhlIGdpdmVuIG5hbWUKLQkJCQkJLy8KLQkJCQkJTGlzdCBlQ2xhc3NpZmllcnMgPSBlUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBlQ2xhc3NpZmllcnMuc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IChFQ2xhc3NpZmllcikgZUNsYXNzaWZpZXJzCi0JCQkJCQkJCS5nZXQoaSk7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXJldHVybiBlQ2xhc3NpZmllcjsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCi0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIE1pZ3JhdG9yKCkgewotCQl0aGlzKE5TX1VSSXMsIEVDT1JFMlhNTF9VUklzKTsKLQl9Ci0KLQlwdWJsaWMgTWlncmF0b3IoU3RyaW5nW10gbnNVUklzLCBVUklbXSBlY29yZTJYTUxVUklzKSB7Ci0JCWludCBzaXplID0gZWNvcmUyWE1MVVJJcy5sZW5ndGg7Ci0JCWV4dGVuZGVkTWV0YURhdGFzID0gbmV3IEV4dGVuZGVkTWV0YURhdGFbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWNvcmUyWE1MVVJJcy5sZW5ndGg7IGkrKykgewotCQkJZXh0ZW5kZWRNZXRhRGF0YXNbaV0gPSBnZXRFeHRlbmRlZE1ldGFEYXRhKG5zVVJJc1tpXSwKLQkJCQkJZWNvcmUyWE1MVVJJc1tpXSk7Ci0JCX0KLQkJdGhpcy5yZXNvdXJjZUhhbmRsZXIgPSBuZXcgVU1BMlVNQVJlc291cmNlSGFuZGxlcjAoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShtc2cpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBbnlUeXBlRmVhdHVyZVZhbHVlIHsKLQkJU3RyaW5nIG93bmVySWQ7Ci0KLQkJRU9iamVjdCBvd25lcjsKLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCQlTdHJpbmcgdmFsdWVJZDsKLQotCQlBbnlUeXBlIHZhbHVlOwotCi0JCWludCBpbmRleDsKLQl9Ci0KLQljbGFzcyBNaWdyYXRvclVSSUNvbnZlcnRlciBleHRlbmRzIE11bHRpRmlsZVVSSUNvbnZlcnRlciB7Ci0JCXByaXZhdGUgUmVzb3VyY2VNYW5hZ2VyIG9sZFJlc01ncjsKLQotCQkvKioKLQkJICogQHBhcmFtIHJlc291cmNlU2V0Ci0JCSAqLwotCQlwdWJsaWMgTWlncmF0b3JVUklDb252ZXJ0ZXIoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0KSB7Ci0JCQlzdXBlcihyZXNvdXJjZVNldCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlciNub3JtYWxpemUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkJICovCi0JCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJCVVSSSBub3JtYWxpemVkID0gc3VwZXIubm9ybWFsaXplKHVyaSk7Ci0JCQlpZiAobm9ybWFsaXplZCA9PSBudWxsICYmIFNDSEVNRS5lcXVhbHNJZ25vcmVDYXNlKHVyaS5zY2hlbWUoKSkpIHsKLQkJCQlpZiAob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGlkID0gdXJpLmF1dGhvcml0eSgpOwotCQkJCQlub3JtYWxpemVkID0gZ2V0VVJJRnJvbU9sZFJlc291cmNlTWFuYWdlcihpZCk7Ci0JCQkJCWlmIChub3JtYWxpemVkICE9IG51bGwpIHsKLQkJCQkJCWlmICh1cmkuaGFzRnJhZ21lbnQoKSkgewotCQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KHVyaQotCQkJCQkJCQkJLmZyYWdtZW50KCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlub3JtYWxpemVkID0gbm9ybWFsaXplZC5hcHBlbmRGcmFnbWVudChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCXJldHVybiBub3JtYWxpemVkOwotCQl9Ci0KLQkJcHVibGljIFVSSSBnZXRVUklGcm9tT2xkUmVzb3VyY2VNYW5hZ2VyKFN0cmluZyBpZCkgewotCQkJaWYgKG9sZFJlc01nciA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBvbGRSZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGlkKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlVUkkgbm9ybWFsaXplZCA9IGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQlVUkkgbmV3VVJJID0gKFVSSSkgb2xkUGF0aFRvTmV3VVJJTWFwLmdldChub3JtYWxpemVkCi0JCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWlmIChuZXdVUkkgIT0gbnVsbCkgewotCQkJCQlub3JtYWxpemVkID0gbmV3VVJJOwotCQkJCX0KLQkJCQlyZXR1cm4gbm9ybWFsaXplZDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVVUklDb252ZXJ0ZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaWYgKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkJb2xkUmVzTWdyLmRpc3Bvc2UoKTsKLQkJCQlvbGRSZXNNZ3IgPSBudWxsOwotCQkJfQotCi0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHJlc01ncjIKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE9sZFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyKSB7Ci0JCQlvbGRSZXNNZ3IgPSByZXNNZ3I7Ci0JCX0KLQotCQlwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyIGdldE9sZFJlc291cmNlTWFuYWdlcigpIHsKLQkJCXJldHVybiBvbGRSZXNNZ3I7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlciNzZXRVUklNYXBwaW5nKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGphdmEudXRpbC5TZXQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVUklNYXBwaW5nKEVPYmplY3QgZSwgVVJJIHVyaSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQkvLyBjb2RlIHRvIHN1cHBvcnQgbWlncmF0aW9uIGZyb20gb2xkZXIgdmVyc2lvbgotCQkJLy8KLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1pZ3JhdG9yVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNaWdyYXRvclVSSUNvbnZlcnRlcikgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGUKLQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgb2xkUmVzTWdyID0gdXJpQ29udmVydGVyCi0JCQkJCQkuZ2V0T2xkUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJaWYgKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gb2xkUmVzTWdyCi0JCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcigoKE1ldGhvZEVsZW1lbnQpIGUpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJb2xkUGF0aFRvTmV3VVJJTWFwLnB1dChkZXNjLmdldFJlc29sdmVkVVJJKCkKLQkJCQkJCQkJLnRvRmlsZVN0cmluZygpLCB1cmkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlzdXBlci5zZXRVUklNYXBwaW5nKGUsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQl9Ci0JfQotCi0JY2xhc3MgTWlncmF0b3JSZXNvdXJjZVNldCBleHRlbmRzIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2dldFVSSUNvbnZlcnRlcigpCi0JCSAqLwotCQlwdWJsaWMgVVJJQ29udmVydGVyIGdldFVSSUNvbnZlcnRlcigpIHsKLQkJCWlmICh1cmlDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJCXVyaUNvbnZlcnRlciA9IG5ldyBNaWdyYXRvclVSSUNvbnZlcnRlcih0aGlzKTsKLQkJCX0KLQkJCXJldHVybiB1cmlDb252ZXJ0ZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbG9hZE9sZFJlc291cmNlTWFuYWdlcihTdHJpbmcgbGliUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIHRyeWluZyB0byBsb2FkIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9ycyBmaWxlCi0JCQkvLwotCQkJU3RyaW5nIGxpYkRpciA9IG5ldyBGaWxlKGxpYlBhdGgpLmdldFBhcmVudCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsaWJEaXIsIFJFU01HUl9YTUkpOwotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IG51bGw7Ci0JCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgbXVsdGlGaWxlVVJJQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCVJlc291cmNlIHJlc01nclJlcyA9IG5ldyBYTUlSZXNvdXJjZUltcGwoVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZQotCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKSk7IC8vIHN1cGVyLmdldFJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAotCQkJCS8vIHRydWUpOwotCQkJCXJlc01nclJlcy5sb2FkKG51bGwpOwotCQkJCWlmICghcmVzTWdyUmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCU9iamVjdCBvYmogPSByZXNNZ3JSZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQkJCXJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iajsKLQkJCQkJCS8vIHJlc01nci5yZXNvbHZlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkJCS5wcmludGxuKCJJbnZhbGlkIFJlc291cmNlTWFuYWdlciBmaWxlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCSgoTWlncmF0b3JVUklDb252ZXJ0ZXIpIG11bHRpRmlsZVVSSUNvbnZlcnRlcikKLQkJCQkJLnNldE9sZFJlc291cmNlTWFuYWdlcihyZXNNZ3IpOwotCQl9Ci0KLQkJcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZExpYnJhcnkoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQkJbG9hZE9sZFJlc291cmNlTWFuYWdlcihwYXRoKTsKLQotCQkJcmV0dXJuIGxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KHBhdGgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwjZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoU3RyaW5nIGlkKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJCWlmIChnZXRSZXNvdXJjZU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGlkKTsKLQkJCX0KLQkJCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJCVVSSSB1cmkgPSAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSkKLQkJCQkJCS5nZXRVUklGcm9tT2xkUmVzb3VyY2VNYW5hZ2VyKGlkKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQkJcmV0dXJuIHJlc291cmNlLmdldEVPYmplY3QoaWQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJCS8vIEVPYmplY3QgZU9iaiA9IHN1cGVyR2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQlFT2JqZWN0IGVPYmogPSBzdXBlci5nZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCWlmIChlT2JqID09IG51bGwKLQkJCQkJJiYgTWlncmF0b3JVUklDb252ZXJ0ZXIuU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2UodXJpCi0JCQkJCQkJLnNjaGVtZSgpKSAmJiAhdXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCQllT2JqID0gc3VwZXIuZ2V0RU9iamVjdCh1cmkuYXV0aG9yaXR5KCkpOwotCQkJfQotCQkJLy8gaWYodXJpLmF1dGhvcml0eSgpLmVxdWFscygiezExQjYwQTRCLUEwQzctNEQ1Qy04OTFBLTM0NkU4NjUyQTRFQn0iKSkKLQkJCS8vIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWlncmF0b3JSZXNvdXJjZVNldC5nZXRFT2JqZWN0KCk6IGVPYmogPSAiICsKLQkJCS8vIGVPYmopOwotCQkJLy8gfQotCQkJaWYgKGVPYmogPT0gbnVsbCB8fCBlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCSJDb3VsZCBub3QgbG9hZCBvYmplY3Qgd2l0aCBVUkkgJyIgKyB1cmkgKyAiJyAobm9ybWFsaXplZCBVUkk6ICciICsgZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSkgKyAiJykuXG5QbGVhc2Ugc2VlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlyZXR1cm4gZU9iajsKLQkJfQotCi0JCXB1YmxpYyBFT2JqZWN0IHN1cGVyR2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQkJdHJ5IHsKLQkJCQlVUkkgbm9ybWFsaXplZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQkJCWlmIChub3JtYWxpemVkID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKG5vcm1hbGl6ZWQudHJpbUZyYWdtZW50KCksIGxvYWRPbkRlbWFuZCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZyYWdtZW50ID0gbm9ybWFsaXplZC5mcmFnbWVudCgpOwotCQkJCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCB8fCBmcmFnbWVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RU9iamVjdChmcmFnbWVudCk7Ci0JCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCQkgKi8KLQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJCVJlc291cmNlIHJlc3VsdCA9IG5ldyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwodXJpKSB7Ci0JCQkJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JSGVscGVySW1wbCh0aGlzKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwKLQkJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwKLQkJCQkJCQkJaW50IHBvc2l0aW9uKSB7Ci0JCQkJCQkJYm9vbGVhbiBvbGQgPSBsb2dFcnJvcjsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlsb2dFcnJvciA9IGZhbHNlOwotCQkJCQkJCQlzdXBlcgotCQkJCQkJCQkJCS5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCQkJCQkJCQkJcG9zaXRpb24pOwotCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBBbnlUeXBlCi0JCQkJCQkJCQkJJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkvLyAmJiBvYmplY3QgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJCQkJCQkvLyAmJiBmZWF0dXJlID09Ci0JCQkJCQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkKLQkJCQkJCQkJKSB7Ci0JCQkJCQkJCQlBbnlUeXBlRmVhdHVyZVZhbHVlIGZ2YWx1ZSA9IG5ldyBBbnlUeXBlRmVhdHVyZVZhbHVlKCk7Ci0JCQkJCQkJCQkvLyBmdmFsdWUub3duZXIgPSBvYmplY3Q7Ci0JCQkJCQkJCQlmdmFsdWUub3duZXJJZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCQkJCQkuZ2V0R3VpZCgpOwotCQkJCQkJCQkJZnZhbHVlLmZlYXR1cmUgPSBmZWF0dXJlOwotCQkJCQkJCQkJLy8gZnZhbHVlLnZhbHVlID0gKEFueVR5cGUpIHZhbHVlOwotCQkJCQkJCQkJZnZhbHVlLnZhbHVlSWQgPSAoU3RyaW5nKSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJCS5nZXRTaW5nbGVWYWx1ZSgoKEFueVR5cGUpIHZhbHVlKQotCQkJCQkJCQkJCQkJCS5nZXRBbnlBdHRyaWJ1dGUoKSwgImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJZnZhbHVlLmluZGV4ID0gcG9zaXRpb247Ci0JCQkJCQkJCQlhbnlUeXBlRmVhdHVyZVZhbHVlcy5hZGQoZnZhbHVlKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlsb2dFcnJvciA9IG9sZDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBMaXN0IHNldE1hbnlSZWZlcmVuY2UoCi0JCQkJCQkJCW9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyLk1hbnlSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJCQkJCQlTdHJpbmcgbG9jYXRpb24pIHsKLQkJCQkJCQlMaXN0IGV4Y2VwdGlvbnMgPSBzdXBlci5zZXRNYW55UmVmZXJlbmNlKHJlZmVyZW5jZSwKLQkJCQkJCQkJCWxvY2F0aW9uKTsKLQkJCQkJCQlpZiAoZXhjZXB0aW9ucyA9PSBudWxsKQotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBleCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJbGxlZ2FsVmFsdWVFeGNlcHRpb24pIHsKLQkJCQkJCQkJCUlsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBpdmUgPSAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uKSBleDsKLQkJCQkJCQkJCWlmIChpdmUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFueVR5cGUKLQkJCQkJCQkJCQkJJiYgaXZlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQkJCUFueVR5cGVGZWF0dXJlVmFsdWUgZnZhbHVlID0gbmV3IEFueVR5cGVGZWF0dXJlVmFsdWUoKTsKLQkJCQkJCQkJCQlmdmFsdWUub3duZXJJZCA9ICgoTWV0aG9kRWxlbWVudCkgaXZlCi0JCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCkpLmdldEd1aWQoKTsKLQkJCQkJCQkJCQlmdmFsdWUuZmVhdHVyZSA9IGl2ZS5nZXRGZWF0dXJlKCk7Ci0JCQkJCQkJCQkJZnZhbHVlLnZhbHVlSWQgPSAoU3RyaW5nKSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJCQkuZ2V0U2luZ2xlVmFsdWUoKChBbnlUeXBlKSBpdmUKLQkJCQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpCi0JCQkJCQkJCQkJCQkJCS5nZXRBbnlBdHRyaWJ1dGUoKSwKLQkJCQkJCQkJCQkJCQkJImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWZ2YWx1ZS5pbmRleCA9IC0xOwotCQkJCQkJCQkJCWFueVR5cGVGZWF0dXJlVmFsdWVzLmFkZChmdmFsdWUpOwotCQkJCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gZXhjZXB0aW9uczsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9OwotCQkJcmVzdWx0LnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQkJZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNldCBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJY2xhc3NOYW1lcy5hZGQoIlRlY2huaXF1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbmV3IE1pZ3JhdG9yUmVzb3VyY2VTZXQoKTsKLQkJLy8gUmVzb3VyY2VNYW5hZ2VyIG9sZFJlc01nciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZWRNZXRhRGF0YXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCWlmIChpIDwgMikgewotCQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFU09VUkNFX0hBTkRMRVIsIHJlc291cmNlSGFuZGxlcik7Ci0JCQl9Ci0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpCi0JCQkJCS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwKLQkJCQkJCQlleHRlbmRlZE1ldGFEYXRhc1tpXSk7Ci0KLQkJCWlmIChpID09IDApIHsKLQkJCQlyZXNvdXJjZUhhbmRsZXIuc2F2ZVByZXNlbnRhdGlvblVSSUZvcihjbGFzc05hbWVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzb3VyY2VIYW5kbGVyLnNhdmVQcmVzZW50YXRpb25VUklGb3IobnVsbCk7Ci0JCQl9Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCS8vIGlmKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkvLyAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKXJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpKS5zZXRPbGRSZXNvdXJjZU1hbmFnZXIob2xkUmVzTWdyKTsKLQkJCS8vIHJlc291cmNlU2V0LmxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KGxpYlBhdGgpOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQlyZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCS8vIH0KLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSByZXNvdXJjZVNldC5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZiAobGliID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBsb2FkIGFsbCB0aGUgcmVzb3VyY2VzIGluIG1lbW9yeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkZWxpbmUgJiYgaSA+IDApIHsKLQkJCQkJLy8gaGFjayB0byByZXN0b3JlIHRoZSByaWdodCBwcmVzZW50YXRpb24gZm9yIG9sZCBUZWNobmlxdWUKLQkJCQkJLy8KLQkJCQkJR3VpZGVsaW5lIGd1aWRlbGluZSA9IChHdWlkZWxpbmUpIGVsZW1lbnQ7Ci0JCQkJCVVSSSB1cmkgPSByZXNvdXJjZUhhbmRsZXIuZ2V0UHJlc2VudGF0aW9uVVJJKGd1aWRlbGluZQotCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBwcmVzZW50YXRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKSByZXNvdXJjZVNldAotCQkJCQkJCQkuZ2V0RU9iamVjdCh1cmksIHRydWUpOwotCQkJCQkJZ3VpZGVsaW5lLnNldFByZXNlbnRhdGlvbihwcmVzZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJLnByaW50bG4oIkVycm9yIGl0ZXJhdGUgdGhydSBjcm9zcyByZWZlcmVuY2VzIG9mIGVsZW1lbnQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJLy8gb2xkUmVzTWdyID0KLQkJCQkvLyAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKXJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpKS5nZXRPbGRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCQkJCW1pZ3JhdGVQcm9jZXNzQ29udGVudERlc2NyaXB0aW9ucyhtb25pdG9yLCBsaWIpOwotCi0JCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVEYXRhVGFza19uYW1lKTsKLQotCQkJfQotCi0JCQlpZiAoaSA8IDIpIHsKLQkJCQlyZXNvdXJjZUhhbmRsZXIubW92ZURhdGEoKTsKLQkJCQlyZXNvdXJjZUhhbmRsZXIuY2xlYXJNb3ZlSW5mb3MoKTsKLQkJCX0KLQotCQkJaWYgKGkgPT0gZXh0ZW5kZWRNZXRhRGF0YXMubGVuZ3RoIC0gMSkgewotCQkJCW1pZ3JhdGVQcm9jZXNzZXMobW9uaXRvciwgbGliKTsKLQotCQkJCXJlc3RvcmVSZWZlcmVuY2VzKHJlc291cmNlU2V0KTsKLQotCQkJfQotCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuc2F2ZUxpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlyZXNvdXJjZVNldC5zYXZlKG51bGwsIHRydWUpOwotCQkJcmVzb3VyY2VTZXQucmVzZXQoKTsKLQotCQl9Ci0KLQkJLy8gZGVsZXRlIG9sZCByZXNtZ3IueG1pCi0JCS8vCi0JCXRyeSB7Ci0JCQlGaWxlIHJlc01nckZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShsaWJQYXRoKS5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5SRVNNR1JfWE1JKTsKLQkJCWlmIChyZXNNZ3JGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmVzTWdyRmlsZS5kZWxldGUoKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlUmVmZXJlbmNlcyhNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYW55VHlwZUZlYXR1cmVWYWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBbnlUeXBlRmVhdHVyZVZhbHVlIGVsZW1lbnQgPSAoQW55VHlwZUZlYXR1cmVWYWx1ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5vd25lcklkICE9IG51bGwgJiYgZWxlbWVudC52YWx1ZUlkICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IG93bmVyID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChlbGVtZW50Lm93bmVySWQpOwotCQkJCU9iamVjdCB2YWx1ZSA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoZWxlbWVudC52YWx1ZUlkKTsKLQkJCQlVTUEyVU1BUmVzb3VyY2VIYW5kbGVyLnNldFZhbHVlKG93bmVyLCBlbGVtZW50LmZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlhbnlUeXBlRmVhdHVyZVZhbHVlcy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWlncmF0ZVByb2Nlc3NlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlNZXRob2RMaWJyYXJ5IGxpYikgewotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZSk7Ci0KLQkJU3RyaW5nW11bXSBwcm9jUGtnUGF0aHMgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUFJPQ0VTU19QQUNLQUdFX1BBVEhTOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJQXJyYXlMaXN0IHByb2NQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9jUGtnUGF0aHMubGVuZ3RoOyBqKyspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJcHJvY1BrZ1BhdGhzW2pdKTsKLQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJcHJvY1BrZ3MuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2NQa2dzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGNoaWxkUGtnID0gKEVPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaXhQcmVzZW50YXRpb25OYW1lKHByb2MpOwotCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IE1pZ3JhdG9yLmNsYXNzLmdldE5hbWUoKQotCQkJCQkJCQkJKyAiOiBpbnZhbGlkIFByb2Nlc3NDb21wb25lbnQgKHdpdGggbm8gUHJvY2Vzcyk6ICIgKyBjaGlsZFBrZyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcbiAgUHJvY2Vzc0NvbXBvbmVudCdzIHJlc291cmNlIFVSSTogIiArIChjaGlsZFBrZy5lUmVzb3VyY2UoKSAhPSBudWxsID8gY2hpbGRQa2cuZVJlc291cmNlKCkuZ2V0VVJJKCkgOiBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcbiAgUGFyZW50IHBhY2thZ2U6ICIgKyBwa2cgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXG4gIFBhcmVudCBwYWNrYWdlJ3MgcmVzb3VyY2UgVVJJOiAiICsgKHBrZy5lUmVzb3VyY2UoKSAhPSBudWxsID8gcGtnLmVSZXNvdXJjZSgpLmdldFVSSSgpIDogbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCTsKLQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKG1zZyk7Ci0JCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1pZ3JhdGVQcm9jZXNzQ29udGVudERlc2NyaXB0aW9ucygKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsCi0JCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMubWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWUpOwotCi0JCVN0cmluZ1tdW10gcHJvY1BrZ1BhdGhzID0gTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlBST0NFU1NfUEFDS0FHRV9QQVRIUzsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUFycmF5TGlzdCBwcm9jUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvY1BrZ1BhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCXByb2NQa2dQYXRoc1tqXSk7Ci0JCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCXByb2NQa2dzLmFkZChwa2cpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jUGtncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkUGtnID0gKE9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkUGtnKQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGUpKSB7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlFQ2xhc3MgZUNscyA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyhlKTsKLQkJCWlmIChlQ2xzICE9IGNvbnRlbnQpIHsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gbmV3Q29udGVudCA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0JCQkJbmV3Q29udGVudC5zZXRNYWluRGVzY3JpcHRpb24oY29udGVudC5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJbmV3Q29udGVudC5zZXRLZXlDb25zaWRlcmF0aW9ucyhjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCW5ld0NvbnRlbnQuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoY29udGVudC5nZXRTZWN0aW9ucygpKTsKLQkJCQllLnNldFByZXNlbnRhdGlvbihuZXdDb250ZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQltaWdyYXRlQ29udGVudERlc2NyaXB0aW9uKChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpeFByZXNlbnRhdGlvbk5hbWUoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmIChlLmdldFByZXNlbnRhdGlvbk5hbWUoKSA9PSBudWxsCi0JCQkJfHwgZS5nZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShlLmdldE5hbWUoKSk7Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChBY3Rpdml0eSkgZSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyMC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvVU1BMlVNQVJlc291cmNlSGFuZGxlcjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyMzE1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwIGV4dGVuZHMgVU1BMlVNQVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIFNldCBwcm9jTW92ZWRGZWF0dXJlTmFtZXM7Ci0KLQlwcml2YXRlIE1hcCBndWlkVG9QcmVzZW50YXRpb25NYXA7Ci0KLQlwcml2YXRlIFNldCBjbGFzc05hbWVzVG9TYXZlUHJlc2VudGF0aW9uVVJJOwotCi0JcHVibGljIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwKCkgewotCQlzdXBlcigpOwotCi0JCWd1aWRUb1ByZXNlbnRhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJvY01vdmVkRmVhdHVyZU5hbWVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10gewotCQkJCSJwdXJwb3NlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAia2V5Q29uc2lkZXJhdGlvbnMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJhbHRlcm5hdGl2ZXMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJob3d0b1N0YWZmIiAvLyROT04tTkxTLTEkCi0JCQkJLCAidXNhZ2VHdWlkYW5jZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImV4dGVybmFsSWQiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJzY29wZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInVzYWdlTm90ZXMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJzY2FsZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJyaXNrTGV2ZWwiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJlc3RpbWF0aW5nVGVjaG5pcXVlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAicHJvamVjdE1lbWJlckV4cGVydGlzZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInR5cGVPZkNvbnRyYWN0IiAvLyROT04tTkxTLTEkCi0JCQkJLCAidGVjaG5pcXVlcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgIm1haW5EZXNjcmlwdGlvbiIgLy8kTk9OLU5MUy0xJAotCQl9KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXIjZ2V0TmV3RmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXROZXdGZWF0dXJlKEVPYmplY3Qgb3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlpZiAoInByZXNlbnRhdGlvbk5hbWUiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb3duZXIgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCQlpZiAocHJvY01vdmVkRmVhdHVyZU5hbWVzLmNvbnRhaW5zKGZlYXR1cmVOYW1lKSkgewotCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9ICgoUHJvY2Vzc0VsZW1lbnQpIG93bmVyKQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gZ2V0RUF0dHJpYnV0ZShjb250ZW50LmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCQkJaWYgKGF0dHJpYiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBhdHRyaWI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICgiV29ya09yZGVyIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldE5ld0ZlYXR1cmUob3duZXIsIGZlYXR1cmVOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlciNnZXROZXdPd25lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0TmV3T3duZXIoRU9iamVjdCBvbGRPd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCWlmICgicHJlc2VudGF0aW9uTmFtZSIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvbGRPd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgeyAvLyROT04tTkxTLTEkCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2xkT3duZXIuZUNvbnRhaW5lcigpKTsKLQkJCWlmIChkZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZGU7Ci0JCX0KLQkJaWYgKHByb2NNb3ZlZEZlYXR1cmVOYW1lcy5jb250YWlucyhmZWF0dXJlTmFtZSkKLQkJCQkmJiBvbGRPd25lciBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWxlbWVudCkgb2xkT3duZXIpLmdldFByZXNlbnRhdGlvbigpOwotCQl9Ci0JCWlmICgiV29ya09yZGVyIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG9sZE93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG9sZE93bmVyOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldE5ld093bmVyKG9sZE93bmVyLCBmZWF0dXJlTmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlciNnZXROZXdWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGUpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXROZXdWYWx1ZShFT2JqZWN0IG9sZE93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUsIEFueVR5cGUgdmFsdWUpIHsKLQkJaWYgKCJXb3JrT3JkZXIiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb2xkT3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgeyAvLyROT04tTkxTLTEkCi0JCQlXb3JrT3JkZXIgd29ya09yZGVyID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCk7Ci0JCQl3b3JrT3JkZXIuc2V0R3VpZCgoU3RyaW5nKSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZS5nZXRBbnlBdHRyaWJ1dGUoKSwKLQkJCQkJImd1aWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwcmVkR3VpZCA9IChTdHJpbmcpIGdldFNpbmdsZVZhbHVlKHZhbHVlLmdldEFueUF0dHJpYnV0ZSgpLAotCQkJCQkicHJlZCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocHJlZEd1aWQgPT0gbnVsbCkgewotCQkJCUludGVybmFsRU9iamVjdCBvYmogPSAoSW50ZXJuYWxFT2JqZWN0KSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZQotCQkJCQkJLmdldE1peGVkKCksICJwcmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcmVkR3VpZCA9IG9iai5lUHJveHlVUkkoKS5hdXRob3JpdHkoKTsKLQkJCX0KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIG9sZE93bmVyCi0JCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgcmVzb3VyY2VTZXQKLQkJCQkJLmdldEVPYmplY3QocHJlZEd1aWQpOwotCQkJd29ya09yZGVyLnNldFByZWQocHJlZCk7Ci0JCQl3b3JrT3JkZXIuc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKTsKLQkJCXJldHVybiB3b3JrT3JkZXI7Ci0JCX0KLQkJcmV0dXJuIGdldFRleHQodmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVQcmVzZW50YXRpb25VUklGb3IoU2V0IGNsYXNzTmFtZXMpIHsKLQkJY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSSA9IGNsYXNzTmFtZXM7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRQcmVzZW50YXRpb25VUkkoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChVUkkpIGd1aWRUb1ByZXNlbnRhdGlvbk1hcC5nZXQoZ3VpZCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyI2hhbmRsZVVua25vd25EYXRhKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25EYXRhKEVPYmplY3QgZSwgQW55VHlwZSB1bmtub3duRGF0YSkgewotCQlzdXBlci5oYW5kbGVVbmtub3duRGF0YShlLCB1bmtub3duRGF0YSk7Ci0JCQotCQlpZiAoY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSSAhPSBudWxsCi0JCQkJJiYgZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRWYWx1ZSh1bmtub3duRGF0YS5nZXRNaXhlZCgpLCAiY29udGVudEVsZW1lbnRzIikuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlBbnlUeXBlIHZhbHVlID0gKEFueVR5cGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsCi0JCQkJCQkmJiBjbGFzc05hbWVzVG9TYXZlUHJlc2VudGF0aW9uVVJJLmNvbnRhaW5zKHZhbHVlCi0JCQkJCQkJCS5lQ2xhc3MoKS5nZXROYW1lKCkpKSB7Ci0JCQkJCU9iamVjdCBwcmVzZW50YXRpb24gPSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZS5nZXRNaXhlZCgpLAotCQkJCQkJCSJwcmVzZW50YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBndWlkID0gZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0QW55QXR0cmlidXRlKCksCi0JCQkJCQkJCSJndWlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdCkgcHJlc2VudGF0aW9uKS5lUHJveHlVUkkoKTsKLQkJCQkJCWd1aWRUb1ByZXNlbnRhdGlvbk1hcC5wdXQoZ3VpZCwgdXJpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2UwMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbW50YXRpb24gZm9yIHVwZ3JhZGluZyBhIG1ldGhvZCBsaWJyYXJ5IHRvIGEgbmV3ZXIgVU1BIHZlcnNpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmYwNmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB1cGdyYWRpbmcgYSBtZXRob2QgbGlicmFyeSB0byBhIG5ld2VyIFVNQSB2ZXJzaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjA3ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHBlcnNpc3RpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hFdmVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1NmM4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHByb3ZpZGVzIGRhdGEgYWJvdXQgYSByZWZyZXNoIGV2ZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZyZXNoRXZlbnQgewotCi0JLyoqCi0JICogR2V0cyByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiByZWZyZXNoZWQuCi0JICogCi0JICogQHJldHVybiByZWZyZXNoZWQgcmVzb3VyY2VzCi0JICovCi0JQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVmcmVzaGVkUmVzb3VyY2VzKCk7Ci0JCi0JQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VW5sb2FkZWRSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIEdldHMgb2JqZWN0cyB0aGF0IGhhZCBiZWVuIHVubG9hZGVkIGFuZCBiZWNvbWUgcHJveGllcyBhZnRlciByZWZyZXNoCi0JICogCi0JICogQHJldHVybiB1bmxvYWRlZCBvYmplY3RzCi0JICovCi0JQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRVbmxvYWRlZE9iamVjdHMoKTsKLQotCS8qKgotCSAqIEdldHMgb2JqZWN0cyB0aGF0IGhhZCBiZWVuIHJlZnJlc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJlZnJlc2hlZCBvYmplY3RzCi0JICovCi0JQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRSZWZyZXNoZWRPYmplY3RzKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWJiYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpbGwgYmUgbm90aWZ5IGFib3V0IGNoYW5nZXMgaW4gcmVzb3VyY2VzIHNvIGl0IGNhbgotICogcmVhY3QgYWNjb3JkaW5nbHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEhhbmRsZXIgewotCi0Jdm9pZCByZWZyZXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDEzNDEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaDsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBpZiBsaXN0ZW5pbmcgdG8gcmVmcmVzaCBldmVudCwgd2lsbCBnZXQgbm90aWZpZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hMaXN0ZW5lciB7Ci0KLQl2b2lkIG5vdGlmeVJlZnJlc2hlZChJUmVmcmVzaEV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL1JlZnJlc2hKb2IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9SZWZyZXNoSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOWJiZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL1JlZnJlc2hKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLkxpYnJhcnlTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBCYWNrZ3JvdW5kIGpvYiB0aGF0IGtlZXBzIG5vdGlmeWluZyByZWZyZXNoIGhhbmRsZXJzIGFib3V0IGNoYW5nZXMgaW4KLSAqIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX0RFTEFZID0gMjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BSRUZJWCA9ICJFUEYgQXV0by1yZWZyZXNoOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGFkZGVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PFJlc291cmNlPigpOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PFJlc291cmNlPigpOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PFJlc291cmNlPigpOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW92ZWRSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcml2YXRlIFVuaXF1ZUVMaXN0PFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdDxSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcml2YXRlIElSZWZyZXNoSGFuZGxlciByZWZyZXNoSGFuZGxlcjsKLQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxJUmVzb3VyY2U+IGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PElSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgUmVmcmVzaEpvYigpIHsKLQkJc3VwZXIoUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzb3VyY2VBdXRvUmVmcmVzaEpvYl9uYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gYikgewotCQllbmFibGVkID0gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlU2V0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVNldChSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hIYW5kbGVyKElSZWZyZXNoSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXJlZnJlc2hIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGV4aXN0aW5nIHJlc291cmNlcyB0aGF0IHJlYXBwZWFyIGluIHdvcmtzcGFjZXMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGRlZFJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRBZGRlZFJlc291cmNlcygpIHsKLQkJcmVtb3ZlUmVzb3VyY2VzKGFkZGVkUmVzb3VyY2VzLCBzYXZlZFJlc291cmNlcyk7Ci0JCXJldHVybiBhZGRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUmVzb3VyY2U+IGdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjaGFuZ2VkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQlyZW1vdmVSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgc2F2ZWRSZXNvdXJjZXMpOwotCQlyZW1vdmVSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcyk7Ci0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgPGNvZGU+cmVzb3VyY2VzVG9SZW1vdmU8L2NvZGU+IGZyb20gPGNvZGU+cmVzb3VyY2VzPC9jb2RlPiBpZgotCSAqIHRoZSByZXNvdXJjZXMgYXJlIHN5bmNocm9uaXplZCB3aXRoIHRoZWlyIHN0b3JhZ2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlc1RvUmVtb3ZlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9SZW1vdmUpIHsKLQkJc3luY2hyb25pemVkIChyZXNvdXJjZXNUb1JlbW92ZSkgewotCQkJaWYgKCFyZXNvdXJjZXNUb1JlbW92ZS5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyID0gcmVzb3VyY2VzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IHJlc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQkJCWJvb2xlYW4gY2FuUmVtb3ZlID0gdHJ1ZTsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgbWZSZXNvdXJjZSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSk7Ci0JCQkJCQljYW5SZW1vdmUgPSBtZlJlc291cmNlLmlzU3luY2hyb25pemVkKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNhblJlbW92ZSkgewotCQkJCQkJaWYgKHJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVtb3ZlZFJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCQotCS8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW92ZWRSZXNvdXJjZXMuIAotCSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb3ZlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vdmVkUmVzb3VyY2VzOyAgICAgICAgICAgICAKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCXB1YmxpYyB2b2lkIHJlc291cmNlU2F2ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSA9PSByZXNvdXJjZVNldCkgewotCQkJc3luY2hyb25pemVkIChzYXZlZFJlc291cmNlcykgewotCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpIHsKLQkJcmV0dXJuIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOwotCQltb3ZlZFJlc291cmNlcy5jbGVhcigpOwotCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOwotCQlsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWFkZGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmNsZWFyKCk7Ci0JfQotCQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJcmV0dXJuICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNjaGVkdWxlUmVmcmVzaCgpIHsJCQotCQlpZiAoZ2V0U3RhdGUoKSA9PSBKb2IuTk9ORSkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCXNldFJ1bGUobmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShsaWIpKTsKLQkJCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCQkJfQotCQl9Ci0JfQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgV29ya3NwYWNlSm9iI3J1bkluV29ya3NwYWNlCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZWZyZXNoSGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlUaHJvd2FibGUgZXJyb3IgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihERUJVR19QUkVGSVggKyAiIHN0YXJ0aW5nIHJlZnJlc2ggam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl0cnkgewotCQkJCXJlZnJlc2hIYW5kbGVyLnJlZnJlc2gobW9uaXRvcik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWVycm9yID0gZTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKERFQlVHX1BSRUZJWAotCQkJCQkJCQkrICIgZmluaXNoZWQgcmVmcmVzaCBqb2IgaW46ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBGaWxlTWFuYWdlci5QTFVHSU5fSUQsIDAsCi0JCQkJCSJSZWZyZXNoIGVycm9yIiwgZXJyb3IpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJcmV0dXJuIHNob3VsZFJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUmVmcmVzaCgpIHsKLQkJcmV0dXJuICFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgcmVmcmVzaCBqb2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZnJlc2hKb2Iuc3RhcnQoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdGhlIHJlZnJlc2ggam9iCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZnJlc2hKb2Iuc3RvcCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJY2FuY2VsKCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKElSZXNvdXJjZSB3c1JlcykgewotCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJcmV0dXJuICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRSZXNvdXJjZSh3c1Jlcyk7Ci0JCX0KLQkJSVBhdGggcGF0aCA9IHdzUmVzLmdldExvY2F0aW9uKCk7Ci0JCXJldHVybiBwYXRoICE9IG51bGwgPyBQZXJzaXN0ZW5jZVV0aWwuZ2V0UmVzb3VyY2UocGF0aCwgcmVzb3VyY2VTZXQpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHJlc291cmNlIGNhbiBiZSBhY2NlcHRlZCBhcyBhIG5ldyByZXNvdXJjZSBvZgotCSAqIHJlc291cmNlIHNldCBvZiB0aGlzIHJlZnJlc2ggam9iIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWNjZXB0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpCi0JCQkJCS5pc05ld1Jlc291cmNlVG9Mb2FkKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghaXNFbmFibGVkKCkgfHwgcmVzb3VyY2VTZXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCXJldHVybjsJCQotCQl0cnkgewotCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkJCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQotCQkJCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JCQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBhZGRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQlwcml2YXRlIEFycmF5TGlzdDxJUmVzb3VyY2U+IGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0JCQkJCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMKLQkJCQkJCQkmJiBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJCQkJLy8gaGFuZGxlIGFkZGVkIHJlc291cmNlCi0JCQkJCQkJLy8KLQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCQkJLy8gdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIGJ1dCBub3QKLQkJCQkJCQkJCS8vIGxvYWRlZCBiL2MgdGhlIHdvcmtzcGFjZSByZXNvdXJjZQotCQkJCQkJCQkJLy8gd2FzIG5vdCBhZGRlZCB0byB0aGUgd29ya3NwYWNlIGF0IHRoZQotCQkJCQkJCQkJLy8gdGltZSBvZiBsb2FkaW5nCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQkJCQkJaWYgKCEobWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pKSB7Ci0JCQkJCQkJCQkJLy8gbm8gYXV0by1yZWxvYWQgZm9yIGNvbnRlbnQKLQkJCQkJCQkJCQkvLyBkZXNjcmlwdGlvbgotCQkJCQkJCQkJCS8vIE1ldGhvZEVsZW1lbnRFZGl0b3Igd2lsbCBkZXRlY3QKLQkJCQkJCQkJCQkvLyB0aGUgY2hhbmdlIGFuZCBsb2FkIGl0Ci0JCQkJCQkJCQkJLy8gd2hlbiBhY3RpdmF0ZWQuCi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlhZGRlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmIChhY2NlcHQoZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCQkJCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuYWRkKGRlbHRhCi0JCQkJCQkJCQkJLmdldFJlc291cmNlKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQkvLyBoYW5kbGUgZmlsZSBtb3ZlCi0JCQkJCQkJLy8KLQkJCQkJCQlpZiAoKElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00gJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwKSB7Ci0vLwkJCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YS5nZXRSZXNvdXJjZSgpKTsgICAgICAgICAgCi0vLwkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vCQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsgICAgICAgICAgICAgICAgIAotLy8JCQkJCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQkJSVBhdGggbW92ZWRGcm9tUGF0aCA9IGRlbHRhLmdldFJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCQlJUGF0aCBtb3ZlZFRvUGF0aCA9IGRlbHRhLmdldE1vdmVkVG9QYXRoKCk7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJSZXNvdXJjZSBtb3ZlZCBmcm9tICciICsgbW92ZWRGcm9tUGF0aCArICInIHRvICciICsgbW92ZWRUb1BhdGggKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQkJCWJvb2xlYW4gZW5jb2RpbmdDaGFuZ2VkID0gKChJUmVzb3VyY2VEZWx0YS5FTkNPRElORyAmIGRlbHRhCi0JCQkJCQkJCQkuZ2V0RmxhZ3MoKSkgIT0gMCk7Ci0JCQkJCQkJYm9vbGVhbiBjb250ZW50Q2hhbmdlZCA9ICgoSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmIGRlbHRhCi0JCQkJCQkJCQkuZ2V0RmxhZ3MoKSkgIT0gMCk7Ci0JCQkJCQkJaWYgKGVuY29kaW5nQ2hhbmdlZCB8fCBjb250ZW50Q2hhbmdlZCkgewotCQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbAotCQkJCQkJCQkJCSYmIE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJCQkJLmNoZWNrU3luY2hyb25pemVkKHJlc291cmNlKSAhPSAxKSB7Ci0JCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCi0JCQlyZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLnJlbW92ZWRSZXNvdXJjZXMpOwotCQkJbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IubW92ZWRSZXNvdXJjZXMpOwotCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5jaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCWFkZGVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmFkZGVkUmVzb3VyY2VzKTsKLQkJCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKTsKLQotCQkJaWYgKHNob3VsZFJlZnJlc2goKSkgewotCQkJCXNjaGVkdWxlUmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgcHJveHkgYW5kIGl0cyBjb250YWluZXJzCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHJlc29sdmUoRU9iamVjdCBwcm94eSkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLnJlc29sdmUocHJveHksIHJlc291cmNlU2V0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlZnJlc2hKb2IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWZyZXNoSm9iIGluc3RhbmNlID0gbmV3IFJlZnJlc2hKb2IoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkZjYxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvUmVmcmVzaEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIElSZWZyZXNoRXZlbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hFdmVudCBpbXBsZW1lbnRzIElSZWZyZXNoRXZlbnQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiByZWZyZXNoZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IHVubG9hZGVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEVPYmplY3Q+IHJlZnJlc2hlZE9iamVjdHMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkKLQlwdWJsaWMgUmVmcmVzaEV2ZW50KENvbGxlY3Rpb248UmVzb3VyY2U+IHVubG9hZGVkUmVzb3VyY2VzKSB7Ci0JCXRoaXMudW5sb2FkZWRSZXNvdXJjZXMgPSB1bmxvYWRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgUmVmcmVzaEV2ZW50KENvbGxlY3Rpb248UmVzb3VyY2U+IHJlZnJlc2hlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzKSB7Ci0JCXRoaXMocmVmcmVzaGVkUmVzb3VyY2VzLCB1bmxvYWRlZE9iamVjdHMsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCX0JCi0KLQkvKioKLQkgKiBAcGFyYW0gcmVmcmVzaGVkUmVzb3VyY2VzCi0JICogQHBhcmFtIHVubG9hZGVkT2JqZWN0cwotCSAqIEBwYXJhbSByZWZyZXNoZWRPYmplY3RzCi0JICovCi0JcHVibGljIFJlZnJlc2hFdmVudChDb2xsZWN0aW9uPFJlc291cmNlPiByZWZyZXNoZWRSZXNvdXJjZXMsIENvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzLCBDb2xsZWN0aW9uPEVPYmplY3Q+IHJlZnJlc2hlZE9iamVjdHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWZyZXNoZWRSZXNvdXJjZXMgPSByZWZyZXNoZWRSZXNvdXJjZXM7Ci0JCXRoaXMudW5sb2FkZWRPYmplY3RzID0gdW5sb2FkZWRPYmplY3RzOwotCQl0aGlzLnJlZnJlc2hlZE9iamVjdHMgPSByZWZyZXNoZWRPYmplY3RzOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50I2dldFJlZnJlc2hlZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlZnJlc2hlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlZnJlc2hlZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQjZ2V0VW5sb2FkZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRVbmxvYWRlZE9iamVjdHMoKSB7Ci0JCXJldHVybiB1bmxvYWRlZE9iamVjdHM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudCNnZXRSZWZyZXNoZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRSZWZyZXNoZWRPYmplY3RzKCkgewotCQlyZXR1cm4gcmVmcmVzaGVkT2JqZWN0czsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VW5sb2FkZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiB1bmxvYWRlZFJlc291cmNlczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkN2I0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBtZXRob2QgbGlicmFyeSByZWZyZXNoZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjdjNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtYW5hZ2luZyBtZXRob2QgbGlicmFyeSByZWZyZXNoZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL0xpYnJhcnlTY2hlZHVsaW5nUnVsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL0xpYnJhcnlTY2hlZHVsaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWJhZDcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9MaWJyYXJ5U2NoZWR1bGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFNjaGVkdWxpbmcgcnVsZSB1c2VkIHRvIGxvY2sgYSBsaWJyYXJ5IGR1cmluZyBhIG9wZXJhdGlvbiBhbmQgZGVmZXIgdGhlCi0gKiBicm9hZGNhc3Rpbmcgb2YgcmVzb3VyY2UgY2hhbmdlIGV2ZW50IHVudGlsIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDE1LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JLyoqCi0JICogQHBhcmFtIGxpYgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWJyYXJ5ID0gbGliOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlI2NvbnRhaW5zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlpZiAodGhpcyA9PSBydWxlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAocnVsZSBpbnN0YW5jZW9mIExpYnJhcnlTY2hlZHVsaW5nUnVsZSkgewotCQkJcmV0dXJuICgoTGlicmFyeVNjaGVkdWxpbmdSdWxlKSBydWxlKS5saWJyYXJ5ID09IGxpYnJhcnk7Ci0JCX0KLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBNdWx0aVJ1bGUpIHsKLQkJCU11bHRpUnVsZSBtcnVsZSA9IChNdWx0aVJ1bGUpIHJ1bGU7Ci0JCQlJU2NoZWR1bGluZ1J1bGVbXSBjaGlsZFJ1bGVzID0gbXJ1bGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZFJ1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCEgKGNoaWxkUnVsZXNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGFsbG93IGFueSBJUmVzb3VyY2UgcnVsZSB0byBuZXN0IHdpdGhpbiB0aGUgc2FtZSB0aHJlYWQKLQkJLy8KLQkJcmV0dXJuIHJ1bGUgaW5zdGFuY2VvZiBJUmVzb3VyY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUjaXNDb25mbGljdGluZyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlyZXR1cm4gZXF1YWxzKHJ1bGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdGhpcyA9PSBvYmoKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgTGlicmFyeVNjaGVkdWxpbmdSdWxlICYmICgoTGlicmFyeVNjaGVkdWxpbmdSdWxlKSBvYmopLmxpYnJhcnkgPT0gbGlicmFyeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGxpYnJhcnkuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGF0dGVybkNvbnN0cnVjdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGF0dGVybkNvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDZlNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BhdHRlcm5Db25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBtZXRob2RzIHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGF0dGVybkNvbnN0cnVjdG9yIHsKLQotCXByaXZhdGUgUGF0dGVybkNvbnN0cnVjdG9yKCkgewotCQkvLyBkb24ndCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLAotCQkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGJvb2xlYW4gaXNSZWdleCkKLQkJCXRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVBhdHRlcm4ocGF0dGVybiwgaXNSZWdleCwgdHJ1ZSwgaXNDYXNlU2Vuc2l0aXZlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBhdHRlcm4gZWxlbWVudCBmcm9tIHRoZSBwYXR0ZXJuIHN0cmluZyB3aGljaCBpcyBlaXRoZXIgYQotCSAqIHJlZy1leCBleHByZXNzaW9uIG9yIGluIG91ciBvbGQgJ1N0cmluZ01hdGNoZXInIGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHNlYXJjaCBwYXR0ZXJuCi0JICogQHBhcmFtIGlzUmVnZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXNzZWQgc3RyaW5nIGFscmVhZHkgaXMgYSByZWctZXgKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcGFyYW0gaXNTdHJpbmdNYXRjaGVyCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFzc2VkIHN0cmluZyBpcyBpbiB0aGUKLQkgKiAgICAgICAgICAgIFN0cmluZ01hdGNoZXIgZm9ybWF0LgotCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBjYXNlIGluc2Vuc2l0aXZlCi0JICogICAgICAgICAgICBwYXR0ZXJuCi0JICogQHBhcmFtIGlzV2hvbGVXb3JkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBwYXR0ZXJuIHRoYXQgcmVxdWlyZXMgYSB3b3JkCi0JICogICAgICAgICAgICBib3VuZGFyeSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kLgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgcGF0dGVybgotCSAqIEB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGlzUmVnZXgsCi0JCQlib29sZWFuIGlzU3RyaW5nTWF0Y2hlciwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsCi0JCQlib29sZWFuIGlzV2hvbGVXb3JkKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlZ2V4KSB7Ci0JCQlpZiAoaXNXaG9sZVdvcmQpIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXR0ZXJuLmxlbmd0aCgpICsgMTApOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYig/OiIpLmFwcGVuZChwYXR0ZXJuKS5hcHBlbmQoIilcXGIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcGF0dGVybiA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGxlbiA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAxMCk7Ci0JCQkvLyBkb24ndCBhZGQgYSB3b3JkIGJvdW5kYXJ5IGlmIHRoZSBzZWFyY2ggdGV4dCBkb2VzIG5vdCBzdGFydCB3aXRoCi0JCQkvLyBhIHdvcmQgY2hhci4gKHRoaXMgd29ya3MgYXJvdW5kIGEgdXNlciBpbnB1dCBlcnJvcikuCi0JCQlpZiAoaXNXaG9sZVdvcmQgJiYgbGVuID4gMCAmJiBpc1dvcmRDaGFyKHBhdHRlcm4uY2hhckF0KDApKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhcHBlbmRBc1JlZ0V4KGlzU3RyaW5nTWF0Y2hlciwgcGF0dGVybiwgYnVmZmVyKTsKLQkJCWlmIChpc1dob2xlV29yZCAmJiBsZW4gPiAwICYmIGlzV29yZENoYXIocGF0dGVybi5jaGFyQXQobGVuIC0gMSkpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhdHRlcm4gPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWludCByZWdleE9wdGlvbnMgPSBQYXR0ZXJuLk1VTFRJTElORTsKLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJCXJlZ2V4T3B0aW9ucyB8PSBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLlVOSUNPREVfQ0FTRTsKLQkJfQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIHJlZ2V4T3B0aW9ucyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dvcmRDaGFyKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcGF0dGVybiBlbGVtZW50IGZyb20gYW4gYXJyYXkgb2YgcGF0dGVybnMgaW4gdGhlIG9sZAotCSAqICdTdHJpbmdNYXRjaGVyJyBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm5zCi0JICogICAgICAgICAgICBUaGUgc2VhcmNoIHBhdHRlcm5zCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNyZWF0ZSBhIGNhc2UgaW5zZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHBhdHRlcm4KLQkgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmdbXSBwYXR0ZXJucywKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBwYXR0ZXJuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQkvLyBub3RlIHRoYXQgdGhpcyB3b3JrcyBvbmx5IGFzIHdlIGtub3cgdGhhdCB0aGUgb3BlcmFuZHMgb2YgdGhlCi0JCQkJLy8gb3IgZXhwcmVzc2lvbiB3aWxsIGJlIHNpbXBsZSBhbmQgbmVlZCBubyBicmFja2V0cy4KLQkJCQlwYXR0ZXJuLmFwcGVuZCgnfCcpOwotCQkJfQotCQkJYXBwZW5kQXNSZWdFeCh0cnVlLCBwYXR0ZXJuc1tpXSwgcGF0dGVybik7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVBhdHRlcm4ocGF0dGVybi50b1N0cmluZygpLCB0cnVlLCB0cnVlLCBpc0Nhc2VTZW5zaXRpdmUsCi0JCQkJZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGFwcGVuZEFzUmVnRXgoYm9vbGVhbiBpc1N0cmluZ01hdGNoZXIsCi0JCQlTdHJpbmcgcGF0dGVybiwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlib29sZWFuIGlzRXNjYXBlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjID0gcGF0dGVybi5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCS8vIHRoZSBiYWNrc2xhc2gKLQkJCWNhc2UgJ1xcJzoKLQkJCQkvLyB0aGUgYmFja3NsYXNoIGlzIGVzY2FwZSBjaGFyIGluIHN0cmluZyBtYXRjaGVyCi0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWlzRXNjYXBlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCS8vIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVzY2FwZWQgaW4gdGhlIHJlZ2V4LgotCQkJY2FzZSAnKCc6Ci0JCQljYXNlICcpJzoKLQkJCWNhc2UgJ3snOgotCQkJY2FzZSAnfSc6Ci0JCQljYXNlICcuJzoKLQkJCWNhc2UgJ1snOgotCQkJY2FzZSAnXSc6Ci0JCQljYXNlICckJzoKLQkJCWNhc2UgJ14nOgotCQkJY2FzZSAnKyc6Ci0JCQljYXNlICd8JzoKLQkJCQlpZiAoaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPyc6Ci0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJCQl9IGVsc2UgewotCQkJCQlidWZmZXIuYXBwZW5kKCdcXCcpOwotCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcqJzoKLQkJCQlpZiAoaXNTdHJpbmdNYXRjaGVyICYmICFpc0VzY2FwZWQpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiLioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJ1xcJyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGlzRXNjYXBlZCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzRXNjYXBlZCkgewotCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4MGFiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE1lc3NhZ2UgYnVuZGxlIGNsYXNzIGZvciBsaWJyYXJ5IHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFBlcnNpc3RlbmNlUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RfY3JlYXRlX2Rpcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9iak5vdEZvdW5kRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkTGlicmFyeUVycm9yX2RldGFpbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VBdXRvUmVmcmVzaEpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyTXNnX0NvdWxkTm90RGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3VwRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlGaWxlRXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVOb3RGb3VuZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZVVSSUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlUmVzb3VyY2VFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlGaWxlc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlT3V0T2ZTeW5jaF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVEYXRhVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VzVGFza19uYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGluZ0RpYWdyYW1fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucmVzb2x2ZWRQcm94eUxvZ2dlckpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRDb25maWd1cmF0aW9uX2NvdWxkTm90TG9hZF9sb2dNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkQ29uZmlndXJhdGlvbl9ub3RDb25maWdGaWxlX2xvZ01zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjNjZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbC5SZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgaGVscGVyIG1ldGhvZHMgZm9yIGxpYnJhcnkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVXRpbCB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBVUkkgb2YgVU1BLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVNQU5zVVJJKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lTlNfVVJJOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVNQU5zVVJJKFN0cmluZyBsaWJQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKQotCQkJCQkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKGxpYlBhdGgpKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCVN0cmluZyBuc1VSSSA9IHJvb3QuZ2V0QXR0cmlidXRlKCJ4bWxuczpjb20uaWJtLnVtYSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobnNVUkkgPT0gbnVsbCB8fCBuc1VSSS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluc1VSSSA9IHJvb3QuZ2V0QXR0cmlidXRlKCJ4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChuc1VSSSA9PSBudWxsIHx8IG5zVVJJLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5zVVJJID0gcm9vdC5nZXRBdHRyaWJ1dGUoInhtbG5zOnVtYSIpICsgIi91bWEuZWNvcmUiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBuc1VSSTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbnZlcnNpb25SZXF1aXJlZChTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgY3VycmVudE5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKCk7Ci0JCVN0cmluZyBsaWJOc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSShsaWJQYXRoKTsKLQkJaWYgKGN1cnJlbnROc1VSSS5lcXVhbHMobGliTnNVUkkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoTWlncmF0b3IuT0xEX1VNQV9OU19VUkkuZXF1YWxzKGxpYk5zVVJJKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlUmVzb3VyY2UoT2JqZWN0IG9iaikgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqOwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSBlLmdldFByZXNlbnRhdGlvbigpOwotCQkJcmVzb3VyY2UgPSBjb250ZW50LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQlyZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmVzb3VyY2UgPSAoKEVPYmplY3QpIG9iaikuZVJlc291cmNlKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCXJlc291cmNlID0gKFJlc291cmNlKSBvYmo7Ci0JCX0KLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHJlc291cmNlLmdldFVSSSgpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEVPYmplY3Q+IGdldFByb3hpZXMoRU9iamVjdCBvYmopIHsKLQkJQ29sbGVjdGlvbjxFT2JqZWN0PiBwcm94aWVzID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmouZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG8uZUlzUHJveHkoKSkgewotCQkJCXByb3hpZXMuYWRkKG8pOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm94aWVzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgcHJpbWFyeSB0b29sIHZlcnNpb24gc3RvcmVkIGluIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gPGxpPiA8IDAgaWYgdGhlIHZlcnNpb24gb2YgdGhlIHByaW1hcnkgdG9vbCBzdG9yZWQgaW4gdGhlIGdpdmVuIHJlc291cmNlIGlzIG1pc3Npbmcgb3Igb2xkZXIgdGhhbiBjdXJyZW50Ci0JICogICAgICAgICA8bGk+IDAgaWYgdGhlIHByaW1hcnkgdG9vbCB2ZXJzaW9uIGluIHRoZSBnaXZlbiByZXNvdXJjZSBtYXRjaGVzIHRoZSBjdXJyZW50IHZlcnNpb24KLQkgKiAgICAgICAgIDxsaT4gPiAwIGlmICB0aGUgcHJpbWFyeSB0b29sIHZlcnNpb24gaW4gdGhlIGdpdmVuIHJlc291cmNlIGlzIG5ld2VyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrVG9vbFZlcnNpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlNYXAgZmlsZVZlcnNpb25NYXAgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZShmaWxlKTsKLQkJaWYoZmlsZVZlcnNpb25NYXAgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSBmaWxlVmVyc2lvbk1hcC5nZXQoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKTsKLQkJCWlmKHZlcnNpb24gIT0gbnVsbCkgewotCQkJCUVQRlZlcnNpb25zIHZlcnNpb25zID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKTsKLQkJCQlyZXR1cm4gdmVyc2lvbnMuZ2V0Q3VycmVudFZlcnNpb24oKS5jb21wYXJlVG9vbFZlcnNpb25UbyhuZXcgVmVyc2lvbih2ZXJzaW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZpcnN0IG1ldGhvZCBlbGVtZW50IGluIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAgCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgcHJveHkgYW5kIGl0cyBjb250YWluZXJzCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCByZXNvbHZlKEVPYmplY3QgcHJveHksIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCUVPYmplY3QgcmVzb2x2ZWQ7Ci0JCXRyeSB7Ci0JCQlyZXNvbHZlZCA9IEVjb3JlVXRpbC5yZXNvbHZlKHByb3h5LCByZXNvdXJjZVNldCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXNvbHZlZCA9IHByb3h5OwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gcHJveHkuZUNvbnRhaW5lcigpOwotCQlpZiAocmVzb2x2ZWQuZUNvbnRhaW5lcigpID09IG51bGwgJiYgY29udGFpbmVyICE9IG51bGwpIHsKLQkJCWlmIChjb250YWluZXIuZUlzUHJveHkoKSkgewotCQkJCWNvbnRhaW5lciA9IHJlc29sdmUoY29udGFpbmVyLCByZXNvdXJjZVNldCk7Ci0JCQl9Ci0JCQlFUmVmZXJlbmNlIHJlZiA9IHByb3h5LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBjb250YWluZXIuZUdldChyZWYpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaXRlcgotCQkJCQkJLm5leHQoKSkKLQkJCQkJOwotCQkJfSBlbHNlIHsKLQkJCQljb250YWluZXIuZUdldChyZWYpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvbHZlZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShJUGF0aCBwYXRoLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UocGF0aC50b09TU3RyaW5nKCksIHJlc291cmNlU2V0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgcGF0aCwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAodXJpLmVxdWFscyhNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNvdXJjZSkpKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCQotCS8qKgotCSAqIFJlc29sdmVzIGNvbnRhaW5lciBvZiB0aGUgTWV0aG9kRWxlbWVudCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVDb250YWluZXIoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLnJlc29sdmVDb250YWluZXIocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoSVJlc291cmNlIGlSZXNvdXJjZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGlSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsJCQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeyAKLQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLnJlc29sdmVDb250YWluZXIocmVzb3VyY2UpOwotCQkJfQotCQkJZWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENvbnRlbnREZXNjcmlwdGlvbillbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KWNvbnRhaW5lcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsTGlicmFyeVJlc291cmNlcyhNZXRob2RMaWJyYXJ5IGxpYikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRvcEF0dHJpYnV0ZShGaWxlIGZpbGUsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCS8vIENyZWF0ZSB0aGUgU0FYIHBhcnNlciBmYWN0b3J5LgotCQlTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCQkvLyBDcmVhdGUgdGhlIFNBWCBwYXJzZXIuCi0JCXRyeSB7Ci0JCQlTQVhQYXJzZXIgc2F4UGFyc2VyID0gc3BmLm5ld1NBWFBhcnNlcigpOwotCQkJZmluYWwgU3RyaW5nW10gdmFsdWVIb2xkZXIgPSBuZXcgU3RyaW5nWzFdOwotCQkJdHJ5IHsKLQkJCXNheFBhcnNlci5wYXJzZShmaWxlLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSB7CQotCQkJCXByaXZhdGUgYm9vbGVhbiBzdGFydGVkOwotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJCWlmKHN0YXJ0ZWQpIHsKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1cmk6ICIgKyB1cmkpOwotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lOiAiICsgbG9jYWxOYW1lKTsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInFOYW1lOiAiICsgcU5hbWUpOwotCQkJCQl2YWx1ZUhvbGRlclswXSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoYXR0cmlidXRlTmFtZSk7Ci0JCQkJCXN0YXJ0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0pOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCQlyZXR1cm4gdmFsdWVIb2xkZXJbMF07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5sb2FkKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMpIHsKLQkJTWFwPE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+IHJlc291cmNlU2V0VG9VbmxvYWRlZFJlc291cmNlc01hcCA9IG5ldyBIYXNoTWFwPE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+KCk7Ci0JCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiByZW1vdmVkUmVzb3VyY2VzKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlib29sZWFuIHVubG9hZGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJCQlpZigoKElMaWJyYXJ5UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLnVubG9hZChyZXNvdXJjZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKSkgewotCQkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCQkJCXVubG9hZGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJCQl1bmxvYWRlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQkKLQkJCWlmKHVubG9hZGVkICYmIHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdW5sb2FkZWRSZXNvdXJjZXMgPSByZXNvdXJjZVNldFRvVW5sb2FkZWRSZXNvdXJjZXNNYXAuZ2V0KHJlc291cmNlU2V0KTsKLQkJCQlpZih1bmxvYWRlZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJCXVubG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQkJcmVzb3VyY2VTZXRUb1VubG9hZGVkUmVzb3VyY2VzTWFwLnB1dCgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCwgdW5sb2FkZWRSZXNvdXJjZXMpOwotCQkJCX0KLQkJCQl1bmxvYWRlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWZvciAoTWFwLkVudHJ5PE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+IGVudHJ5IDogcmVzb3VyY2VTZXRUb1VubG9hZGVkUmVzb3VyY2VzTWFwLmVudHJ5U2V0KCkpIHsKLQkJCWVudHJ5LmdldEtleSgpLm5vdGlmeVJlZnJlc2hMaXN0ZW5lcnMobmV3IFJlZnJlc2hFdmVudChlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBoYXMgYSBHVUlEIHRoYXQgaXMgdGhlIHNhbWUgYXMgR1VJRCBvZgotCSAqIG9uZSBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBoYXMgZHVwbGljYXRlIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRHVwbGljYXRlR1VJRChNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCWZvciAoTWV0aG9kRWxlbWVudCBlbGVtZW50IDogZWxlbWVudHMpIHsKLQkJCWlmKGUuZ2V0R3VpZCgpLmVxdWFscyhlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1ByZWZpeChTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBwYXRoIDogcGF0aCArIEZpbGUuc2VwYXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVVSSVByZWZpeChDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMsIFN0cmluZyBvbGRQcmVmaXgsIFN0cmluZyBuZXdQcmVmaXgpIHsKLQkJVVJJIG9sZFByZWZpeFVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKHRvUHJlZml4KG9sZFByZWZpeCkpOwotCQlVUkkgbmV3UHJlZml4VVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkodG9QcmVmaXgobmV3UHJlZml4KSk7Ci0JCWZvcihSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgewotCQkJVVJJIHVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJVVJJIG5ld1VSSSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld1VSSSA9IHVyaS5yZXBsYWNlUHJlZml4KG9sZFByZWZpeFVSSSwgbmV3UHJlZml4VVJJKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9Ci0JCQlpZihuZXdVUkkgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLnNldFVSSShuZXdVUkkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVVJJIGdldFByb3h5VVJJKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlVUkkgdXJpID0gbnVsbDsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlKSB7Ci0JCQlJTGlicmFyeVJlc291cmNlIGxpYlJlc291cmNlID0gKElMaWJyYXJ5UmVzb3VyY2UpIHJlc291cmNlOwotCQkJdXJpID0gbGliUmVzb3VyY2UuZ2V0UHJveHlVUkkob2JqZWN0KTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCXVyaSA9IHJlc291cmNlLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KHJlc291cmNlLmdldFVSSUZyYWdtZW50KG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIGdldEltcG9ydFBsdWdpblJlc291cmNlU2V0KCkgewotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQ7Ci0JCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSkgewotCQkJcHJvdGVjdGVkIHZvaWQgZGVtYW5kTG9hZChSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQlpZiAoISBza2lwRGVtYW5kTG9hZChyZXNvdXJjZSkpIHsKLQkJCQkJc3VwZXIuZGVtYW5kTG9hZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJcHJpdmF0ZSBib29sZWFuIHNraXBEZW1hbmRMb2FkKFJlc291cmNlIHJlcykgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJaWYgKCEgZmlsZS5leGlzdHMoKSAmJiBmaWxlLmdldE5hbWUoKS5lcXVhbHMoTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9QTFVHSU5fTU9ERUxfRklMRU5BTUUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyBhdHRyaWIgPSBnZXRUb3BBdHRyaWJ1dGUobmV3IEZpbGUoYXJnc1swXSksIGFyZ3NbMV0pOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oYXR0cmliKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTAzZTBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWludmFsaWROYW1lRXJyb3JfbXNnPVRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC4gQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gIiA8ID4gfAotb2JqTm90Rm91bmRFcnJvcl9tc2c9Q291bGQgbm90IGZpbmQgb2JqZWN0IHdpdGggaWQgJyd7MH0nJwotbG9hZExpYnJhcnlFcnJvcl9tc2c9RXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIGxvYWRpbmcgbWV0aG9kIGxpYnJhcnk6Ci1sb2FkTGlicmFyeUVycm9yX2RldGFpbHM9XCBcIGxpbmU6IHswfSwgY29sdW1uOiB7MX0sIG1zZzogezJ9Ci1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9Q291bGQgbm90IHJlc3RvcmUgcmVzb3VyY2UgJyd7MH0nJwotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PUZpbGUgJyd7MH0nJyBpcyByZWFkLW9ubHkKLUVyck1zZ19Db3VsZE5vdERlbGV0ZT1Db3VsZCBub3QgZGVsZXRlIHswfS4gezF9Ci1yZW5hbWVFcnJvcl9tc2c9Q291bGQgbm90IHJlbmFtZSAnJ3swfScnIHRvICcnezF9JycKLWJhY2t1cEVycm9yX21zZz1Db3VsZCBub3QgYmFja3VwIHVwIHJlc291cmNlICcnezB9JycKLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PUNvdWxkIG5vdCByZXNvbHZlIHByb3h5IHswfQotbW9kaWZ5RmlsZUVycm9yX21zZz1DYW5ub3QgbW9kaWZ5IGZpbGUgJyd7MH0nJwotZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2c9Q2Fubm90IHNhdmUgcmVzb3VyY2UuIEZpbGUgcGF0aCBuYW1lIHRvbyBsb25nIChleGNlZWRpbmcgMjU1KSAnJ3swfScnCi1sb2FkUmVzb3VyY2VFcnJvcl9tc2c9Q291bGQgbm90IGxvYWQgcmVzb3VyY2UgJyd7MH0nJwotbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZz1Db3VsZCBub3QgbG9hZCByZXNvdXJjZSAnJ3swfScnLiBSZWFzb246IHsxfQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPUludmFsaWQgbWV0aG9kIGxpYnJhcnkgZmlsZToKLWZpbGVOb3RGb3VuZEVycm9yX21zZz1Db3VsZCBub3QgbG9jYXRlIGFueSBtZXRob2QgbGlicmFyeSBmaWxlIGluIHdvcmtzcGFjZSAnJ3swfScnCi1ub3JtYWxpemVVUklFcnJvcl9tc2c9Q291bGQgbm90IGZpbmQgdGhlIG5vcm1hbGl6ZWQgVVJJIGZvciAnJ3swfScnCi1tb3ZlRXJyb3JfbXNnPUNvdWxkIG5vdCBtb3ZlICcnezB9JycgdG8gJyd7MX0nJy4gVGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzLgotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPUNhbm5vdCBtb2RpZnkgcmVhZC1vbmx5IGZpbGUocyk6IHswfQotbW92ZVJlc291cmNlRXJyb3JfbXNnPVJlc291cmNlICcnezB9JycgaXMgaW52b2x2ZWQgaW4gYSBwZXJzaXN0ZW5jZSBvcGVyYXRpb24gdGhhdCBoYXMgbm90IGJlZW4gY29tbWl0dGVkLgotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9Q291bGQgbm90IG1vZGlmeSBvbmUgb3IgbW9yZSBmaWxlcwotcmVzb3VyY2VPdXRPZlN5bmNoX21zZz1SZXNvdXJjZSBpcyBvdXQgb2Ygc3luY2ggYW5kIG5lZWRzIHRvIGJlIHJlbG9hZGVkOiB7MH0KLXJlc291cmNlQXV0b1JlZnJlc2hKb2JfbmFtZT1SZXNvdXJjZSBBdXRvLVJlZnJlc2gKLWxvYWRDb25maWd1cmF0aW9uX2NvdWxkTm90TG9hZF9sb2dNc2c9Q291bGQgbm90IGxvYWQgZmlsZTogezB9LiBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhpcyBmaWxlIGhhcyBkdXBsaWNhdGUgR1VJRC4KLWxvYWRDb25maWd1cmF0aW9uX25vdENvbmZpZ0ZpbGVfbG9nTXNnPU5vdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGZpbGU6IHswfQotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1Mb2FkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi1tb3ZlRGF0YVRhc2tfbmFtZT1Nb3ZpbmcgdGhlIGRhdGEuLi4KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVNhdmluZyBtZXRob2QgbGlicmFyeS4uLgotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1Mb2FkaW5nIGFsbCByZXNvdXJjZXMgaW50byBtZW1vcnkuLi4KLW1pZ3JhdGluZ0RpYWdyYW1fbmFtZT1NaWdyYXRpbmcgZGlhZ3JhbXMuLi4KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPU1pZ3JhdGluZyBwcm9jZXNzIGNvbnRlbnQgZGVzY3JpcHRpb25zLi4uCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPUZpeGluZyBlbXB0eSBwcmVzZW50YXRpb24gbmFtZXMuLi4KLVVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk9Q291bGQgbm90IHJlc29sdmUgcHJveHkgJyd7MH0nJwotcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZT1SZWZyZXNoaW5nIGxpYnJhcnkgZmlsZXMgaW4gd29ya3NwYWNlCi1jYW5ub3RfY3JlYXRlX2Rpcl9tc2c9Q2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJyd7MH0nJy4KLXVucmVzb2x2ZWRQcm94eUxvZ2dlckpvYl9uYW1lPVVucmVzb2x2ZWQgUHJveHkgTG9nZ2VyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmZDViMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLlJlc29sdmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogQmFja2dyb3VuZCBqb2IgdGhhdCBtYW5hZ2UgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBwcm94aWVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGV4dGVuZHMgV29ya3NwYWNlSm9iIGltcGxlbWVudHMgSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMQVkgPSAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpICsgIi51bnJlc29sdmVkUHJveHlNYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfVVJJID0gInByb3h5VVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTkVSX0dVSUQgPSAib3duZXJHVUlEIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZhbGlkT2JqZWN0IHsKLQkJYm9vbGVhbiB2YWxpZDsKLQkJT2JqZWN0IG9iamVjdDsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gdmFsaWQKLQkJICogQHBhcmFtIG9iamVjdAotCQkgKi8KLQkJcHVibGljIFZhbGlkT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXZhbGlkID0gdHJ1ZTsJCQkKLQkJfQotCQkJCQotCX0KLQkKLQlwcml2YXRlIE1hcCB1cmlUb0V4Y2VwdGlvbnNNYXA7Ci0JcHJpdmF0ZSBMaXN0IGV4Y2VwdGlvbnM7Ci0JcHJpdmF0ZSBNYXAgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXA7Ci0JcHJpdmF0ZSBNYXAgZWxlbWVudEdVSVRvTWFya2Vyc01hcDsKLQlwcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnM7Ci0JcHJpdmF0ZSBib29sZWFuIGF1dG9TY2hlZHVsZWQgPSB0cnVlOwotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoUGVyc2lzdGVuY2VSZXNvdXJjZXMudW5yZXNvbHZlZFByb3h5TG9nZ2VySm9iX25hbWUpOwkJCi0JCXRoaXMucmVzb3VyY2VTZXQgPSByZXNvdXJjZVNldDsKLS8vCQl1bnJlc29sdmVkUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdXJpVG9FeGNlcHRpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JfQotCi0JcHVibGljIElNYXJrZXIgZmluZE1hcmtlcihJRmlsZSBmaWxlLCBTdHJpbmcgcHJveHlVUkksIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQlyZXR1cm4gZmluZE1hcmtlcihtYXJrZXJzLCBwcm94eVVSSSwgc3RhcnQsIGVuZCk7Ci0JfQotCQotCXByaXZhdGUgSU1hcmtlciBmaW5kTWFya2VyKElNYXJrZXJbXSBtYXJrZXJzLCBTdHJpbmcgcHJveHlVUkksIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCWlmKHByb3h5VVJJLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSkpCi0JCQkJCSYmIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCAtMSkgPT0gc3RhcnQKLQkJCQkJJiYgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCAtMSkgPT0gZW5kKSAKLQkJCXsKLQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElNYXJrZXIgZmluZE1hcmtlcihDb2xsZWN0aW9uPElNYXJrZXI+IG1hcmtlcnMsIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2VycykgewotCQkJaWYobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKSA9PSBzdGFydAotCQkJCQkmJiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIC0xKSA9PSBlbmQpIAotCQkJewotCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gYWRkRXhjZXB0aW9uKFJlc29sdmVFeGNlcHRpb24gcmUpIHsKLQkJc3luY2hyb25pemVkKGV4Y2VwdGlvbnMpIHsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClyZS5nZXRQcm94eSgpKS5lUHJveHlVUkkoKTsKLQkJCVNldCBleGNlcHRpb25zID0gKFNldCkgdXJpVG9FeGNlcHRpb25zTWFwLmdldCh1cmkpOwkJCi0JCQlpZihleGNlcHRpb25zID09IG51bGwpIHsKLQkJCQlleGNlcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCQl1cmlUb0V4Y2VwdGlvbnNNYXAucHV0KHVyaSwgZXhjZXB0aW9ucyk7Ci0JCQl9Ci0JCQlpZihleGNlcHRpb25zLmFkZChyZSkpIHsKLQkJCQl0aGlzLmV4Y2VwdGlvbnMuYWRkKHJlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEb2N1bWVudCBiYXNlZCBjaGFyYWN0ZXIgc2VxdWVuY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRG9jdW1lbnRDaGFyU2VxdWVuY2UgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UgewotCi0JCS8qKiBEb2N1bWVudCAqLwotCQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEluaXRpYWxpemUgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4KLQkJICogZG9jdW1lbnQuCi0JCSAqCi0JCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQKLQkJICovCi0JCXB1YmxpYyBEb2N1bWVudENoYXJTZXF1ZW5jZShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCWZEb2N1bWVudD0gZG9jdW1lbnQ7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjbGVuZ3RoKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNjaGFyQXQoaW50KQotCQkgKi8KLQkJcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZkRvY3VtZW50LmdldENoYXIoaW5kZXgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKHguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkJICovCi0JCXB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oeC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlcnNBbmRMb2NhdGlvbnMgewotCQlDb2xsZWN0aW9uPElNYXJrZXI+IG1hcmtlcnM7Ci0JCUNvbGxlY3Rpb248aW50W10+IGxvY2F0aW9uczsJCQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVNYXJrZXIoSU1hcmtlcltdIG1hcmtlcnMsIFJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gY29udGFpbmVyVVJJICE9IG51bGwgPyBjb250YWluZXJVUkkKLQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCi0JCQkJTWFwPFN0cmluZywgTWFya2Vyc0FuZExvY2F0aW9ucz4gcHJveHlVUklUb01hcmtlcnNBbmRMb2NhdGlvbnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcmtlcnNBbmRMb2NhdGlvbnM+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJT2JqZWN0IHByb3h5VVJJID0gbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQlpZihwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgcHJveHlVUklTdHIgPSBwcm94eVVSSS50b1N0cmluZygpOwotCQkJCQkJTWFya2Vyc0FuZExvY2F0aW9ucyBtYXJrZXJzQW5kTG9jYXRpb25zID0gcHJveHlVUklUb01hcmtlcnNBbmRMb2NhdGlvbnNNYXAuZ2V0KHByb3h5VVJJU3RyKTsKLQkJCQkJCWlmKG1hcmtlcnNBbmRMb2NhdGlvbnMgPT0gbnVsbCkgewotCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMgPSBuZXcgTWFya2Vyc0FuZExvY2F0aW9ucygpOwotCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2VycyA9IG5ldyBIYXNoU2V0PElNYXJrZXI+KCk7Ci0JCQkJCQkJbWFya2Vyc0FuZExvY2F0aW9ucy5sb2NhdGlvbnMgPSBuZXcgSGFzaFNldDxpbnRbXT4oKTsKLQkJCQkJCQlwcm94eVVSSVRvTWFya2Vyc0FuZExvY2F0aW9uc01hcC5wdXQocHJveHlVUklTdHIsIG1hcmtlcnNBbmRMb2NhdGlvbnMpOwotCQkJCQkJfQotCQkJCQkJbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmFkZChtYXJrZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIGxvY2F0ZSB0aGUgdGV4dCBvZiB1bnJlc29sdmVkIFVSSSBpbiBmaWxlCi0JCQkJLy8KLQkJCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIG1hbmFnZXI9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQkJCXRyeSB7Ci0JCQkJCW1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04sIG1vbml0b3IpOwotCQkJCQlJVGV4dEZpbGVCdWZmZXIgZmlsZUJ1ZmZlcj0gbWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04pOwotCQkJCQlmaWxlQnVmZmVyLnJlcXVlc3RTeW5jaHJvbml6YXRpb25Db250ZXh0KCk7Ci0JCQkJCWZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IGZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYoZG9jICE9IG51bGwpIHsKLQkJCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFya2Vyc0FuZExvY2F0aW9ucz4gZW50cnkgOiBwcm94eVVSSVRvTWFya2Vyc0FuZExvY2F0aW9uc01hcC5lbnRyeVNldCgpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybkNvbnN0cnVjdG9yLmNyZWF0ZVBhdHRlcm4ocHJveHlVUkksIHRydWUsIGZhbHNlKTsKLQkJCQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmV3IERvY3VtZW50Q2hhclNlcXVlbmNlKGRvYykpOwotCQkJCQkJCXdoaWxlKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCQkJCWludCBzdGFydCA9IG1hdGNoZXIuc3RhcnQoKTsKLQkJCQkJCQkJaW50IGVuZCA9IG1hdGNoZXIuZW5kKCk7Ci0JCQkJCQkJCWlmKHN0YXJ0ICE9IGVuZCkgewotCQkJCQkJCQkJZW50cnkuZ2V0VmFsdWUoKS5sb2NhdGlvbnMuYWRkKG5ldyBpbnRbXSB7IHN0YXJ0LCBlbmQgfSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmlsZUJ1ZmZlci5yZWxlYXNlU3luY2hyb25pemF0aW9uQ29udGV4dCgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTiwgbW9uaXRvcik7Ci0JCQkJfQotCQkJCQotCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlc29sdmVyIGlzIHN0aWxsIGluIHRoZSBvcGVuIGxpYnJhcnkgYnkgY2hlY2tpbmcgd2hldGhlciBpdHMgcmVzb3VyY2UKLQkJCQkvLyBzdGlsbCBiZWxvbmdzIHRvIGEgcmVzb3VyY2Ugc2V0Ci0JCQkJLy8KLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCQlmb3IgKE1hcmtlcnNBbmRMb2NhdGlvbnMgbWFya2Vyc0FuZExvY2F0aW9ucyA6IHByb3h5VVJJVG9NYXJrZXJzQW5kTG9jYXRpb25zTWFwLnZhbHVlcygpKSB7Ci0JCQkJCQlwcm9jZXNzX2VudHJ5OgotCQkJCQkJZm9yIChJdGVyYXRvcjxpbnRbXT4gaXRlcmF0b3IgPSBtYXJrZXJzQW5kTG9jYXRpb25zLmxvY2F0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaWYobWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQkJCQlicmVhayBwcm9jZXNzX2VudHJ5OwotCQkJCQkJCX0KLQkJCQkJCQlpbnRbXSBsb2MgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gbG9jWzBdOwotCQkJCQkJCWludCBlbmQgPSBsb2NbMV07Ci0JCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBmaW5kTWFya2VyKG1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycywgc3RhcnQsIGVuZCk7Ci0JCQkJCQkJaWYobWFya2VyID09IG51bGwpIHsKLQkJCQkJCQkJSXRlcmF0b3I8SU1hcmtlcj4gaXRlciA9IG1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5pdGVyYXRvcigpOwotCQkJCQkJCQltYXJrZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIHN0YXJ0KTsJCi0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgZW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5yZW1vdmUobWFya2VyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZighbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQkJCS8vIGludmFsaWQgbWFya2VycywgbXVzdCBiZSBkZWxldGVkCi0JCQkJCQkJLy8KLQkJCQkJCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzKSB7Ci0JCQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBSZXNvdXJjZSByZXNvdXJjZSwgVVJJIHByb3h5VVJJLCBTdHJpbmcgZXJyTXNnLCBTdHJpbmcgb3duZXJHVUlELCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gY29udGFpbmVyVVJJICE9IG51bGwgPyBjb250YWluZXJVUkkKLQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCi0JCQl0cnkgewotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsJCQkJCi0JCQkJCUlNYXJrZXIgbWFya2VyID0gZmluZE1hcmtlcihmaWxlLCBwcm94eVVSSS50b1N0cmluZygpLCAwLCAwKTsKLQkJCQkJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE9XTkVSX0dVSUQsIG93bmVyR1VJRCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJY3JlYXRlTWFya2VyKHJlLCBwcm94eVVSSSwKLQkJCQkJCQllcnJNc2csIG93bmVyR1VJRCwgZmlsZSwKLQkJCQkJCQlsb2NhdGlvbiwgcHJveHlVUkkudG9TdHJpbmcoKSwgMCwKLQkJCQkJCQkwKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTWFya2VyIGNyZWF0ZU1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBVUkkgcHJveHlVUkksCi0JCQlTdHJpbmcgZXJyTXNnLCBTdHJpbmcgb3duZXJHVUlELCBJRmlsZSBmaWxlLCBTdHJpbmcgbG9jYXRpb24sCi0JCQlTdHJpbmcgcHJveHlVUklTdHIsIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyIG1hcmtlcjsKLQkJbWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIoTUFSS0VSX0lEKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLAotCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgZXJyTXNnKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBsb2NhdGlvbik7Ci0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5UUkFOU0lFTlQsIHRydWUpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgc3RhcnQpOwkKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBlbmQpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKFBST1hZX1VSSSwgcHJveHlVUklTdHIpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKE9XTkVSX0dVSUQsIG93bmVyR1VJRCk7Ci0JCQotCQlJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIgYXR0QWRkZXIgPSBFeHRlbnNpb25IZWxwZXIuZ2V0TWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIoKTsKLQkJaWYgKGF0dEFkZGVyICE9IG51bGwpIHsKLQkJCWF0dEFkZGVyLmFkZEFkZHRpb25hbEF0dHJpYnV0ZXMobWFya2VyLCByZSk7Ci0JCX0KLQotCQkvLyBjYWNoZSBtYXJrZXIgdG8gaXQgY2FuIGJlIGZvdW5kIGVhc2lseSBhbmQgZGVsZXRlZAotCQkvLwotCQljYWNoZU1hcmtlcihtYXJrZXIsIHByb3h5VVJJKTsKLQkJcmV0dXJuIG1hcmtlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSW50ZXJuYWxFT2JqZWN0IHByb3h5ID0gKEludGVybmFsRU9iamVjdCkgcmUuZ2V0UHJveHkoKTsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IG51bGw7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYocmUuZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IHJlLmdldFJlc29sdmVyKCkuZVJlc291cmNlKCk7Ci0JCQkKLQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlc29sdmVyIGlzIHN0aWxsIGluIHRoZSBvcGVuIGxpYnJhcnkgYnkgY2hlY2tpbmcgd2hldGhlciBpdHMgcmVzb3VyY2UKLQkJCS8vIHN0aWxsIGJlbG9uZ3MgdG8gYSByZXNvdXJjZSBzZXQKLQkJCS8vCi0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5hZGRNYXJrZXIoKTogcmVzb3VyY2VTZXQ9IiArIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkuaGFzaENvZGUoKSk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewkJCQkKLQkJCQljb250YWluZXJVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCX0KLQkJfQkJCQkKLQkJaWYgKGNvbnRhaW5lclVSSSAhPSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBlcnJNc2c7Ci0JCQkJaWYgKHJlLmV4Y2VwdGlvbigpICE9IG51bGwgJiYgcmUuZXhjZXB0aW9uKCkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICE9IG51bGwgJiYgCi0JCQkJCQlyZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJNc2cgPSByZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllcnJNc2cgPSByZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHksIHByb3h5LmVQcm94eVVSSSgpKSA6IHJlCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWFkZE1hcmtlcihyZSwgcmVzb3VyY2UsIHByb3h5LmVQcm94eVVSSSgpLCBlcnJNc2csIE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQocmUuZ2V0UmVzb2x2ZXIoKSksIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEBwYXJhbSB1cmkgcHJveHkgdXJpIAotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZU1hcmtlcihJTWFya2VyIG1hcmtlciwgVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQoZWxlbWVudEdVSVRvTWFya2Vyc01hcCkgewotCQkJU3RyaW5nIHJlc291cmNlR1VJRCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJCWlmKHJlc291cmNlR1VJRCAhPSBudWxsKSB7Ci0JCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIHJlc291cmNlR1VJVG9NYXJrZXJzTWFwLmdldChyZXNvdXJjZUdVSUQpOwotCQkJCWlmKHZvID09IG51bGwpIHsKLQkJCQkJdm8gPSBuZXcgVmFsaWRPYmplY3QobmV3IEhhc2hTZXQoKSk7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLnB1dChyZXNvdXJjZUdVSUQsIHZvKTsKLQkJCQl9Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIHZvLm9iamVjdDsKLQkJCQltYXJrZXJzLmFkZChtYXJrZXIpOwotCQkJfQotCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7Ci0JCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgZWxlbWVudEdVSVRvTWFya2Vyc01hcC5nZXQoZWxlbWVudEdVSUQpOwotCQkJaWYobWFya2VycyA9PSBudWxsKSB7Ci0JCQkJbWFya2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcC5wdXQoZWxlbWVudEdVSUQsIG1hcmtlcnMpOwotCQkJfQotCQkJbWFya2Vycy5hZGQobmV3IFZhbGlkT2JqZWN0KG1hcmtlcikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJBbGwoKSB7Ci0JCWJvb2xlYW4gb2xkRW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQllbmFibGVkID0gZmFsc2U7Ci0JCQljYW5jZWwoKTsKLQotCQkJc3luY2hyb25pemVkIChleGNlcHRpb25zKSB7Ci0JCQkJdXJpVG9FeGNlcHRpb25zTWFwLmNsZWFyKCk7Ci0JCQkJZXhjZXB0aW9ucy5jbGVhcigpOwotCQkJfQotCQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCQlpZighZWxlbWVudEdVSVRvTWFya2Vyc01hcC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudEdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIHZvLm9iamVjdDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZihtYXJrZXIuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW1hcmtlcnMuY2xlYXIoKTsKLQkJCQkJfQotCQkJCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwLmNsZWFyKCk7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLmNsZWFyKCk7Ci0JCQkJfQkKLQkJCX0KLQkJCXN5bmNocm9uaXplZChyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycykgewotCQkJCXJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmFibGVkID0gb2xkRW5hYmxlZDsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmNsZWFyQWxsKCk6IGVuZCIpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVW5yZXNvbHZlZFByb3h5KCkgewotCQlyZXR1cm4gIWVsZW1lbnRHVUlUb01hcmtlcnNNYXAuaXNFbXB0eSgpOwotCX0KLQkKLQlwcml2YXRlIFJlc29sdmVFeGNlcHRpb24gbmV4dEV4Y2VwdGlvbigpIHsKLQkJc3luY2hyb25pemVkKGV4Y2VwdGlvbnMpIHsJCQkKLQkJCS8vIHN5bmNocm9uaXplZDogaW4gb3JkZXIgdG8gYXRvbWljYWxseSBvYnRhaW4gYW5kIGNsZWFyIHJlcXVlc3RzCi0JCQlpZihleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUmVzb2x2ZUV4Y2VwdGlvbiBlID0gKFJlc29sdmVFeGNlcHRpb24pIHRoaXMuZXhjZXB0aW9ucy5yZW1vdmUoMCk7Ci0JCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KWUuZ2V0UHJveHkoKSkuZVByb3h5VVJJKCk7Ci0JCQkJQ29sbGVjdGlvbiBleGNlcHRpb25zID0gKENvbGxlY3Rpb24pIHVyaVRvRXhjZXB0aW9uc01hcC5nZXQodXJpKTsKLQkJCQlpZihleGNlcHRpb25zICE9IG51bGwpIHsKLQkJCQkJZXhjZXB0aW9ucy5yZW1vdmUoZSk7Ci0JCQkJCWlmKGV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQl1cmlUb0V4Y2VwdGlvbnNNYXAucmVtb3ZlKHVyaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZSBuZXh0UmVzb3VyY2VUb1ZhbGlkYXRlTWFya2VycygpIHsKLQkJc3luY2hyb25pemVkKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzKSB7Ci0JCQlpZihyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiAoUmVzb3VyY2UpIHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLnJlbW92ZSgwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgeWllbGQoKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoMTApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYiNydW5JbldvcmtzcGFjZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIucnVuSW5Xb3Jrc3BhY2UoKTogYmVnaW4iKTsKLQkJdHJ5IHsKLQkJaWYoIWVuYWJsZWQpIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCXRyeSB7Ci0JCQkvLyBhZGQgbWFya2VycwotCQkJLy8KLQkJCVJlc29sdmVFeGNlcHRpb24gcmU7Ci0JCQl3aGlsZSghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgKHJlID0gbmV4dEV4Y2VwdGlvbigpKSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYWRkTWFya2VyKHJlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0JCi0JCQkJeWllbGQoKTsKLQkJCX0KLQkJCQotCQkJaWYobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCQkJLy8gcmVtb3ZlIGludmFsaWQgbWFya2VycwotCQkJLy8KLQkJCXJlbW92ZU1hcmtlcnMobW9uaXRvcik7Ci0JCQl5aWVsZCgpOwotCQkJCi0JCQkvLyB2YWxpZGF0ZSByZXNvdXJjZSBtYXJrZXJzCi0JCQkvLwotCQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCQl3aGlsZSghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgKHJlc291cmNlID0gbmV4dFJlc291cmNlVG9WYWxpZGF0ZU1hcmtlcnMoKSkgIT0gbnVsbCkgewotCQkJCWRvVmFsaWRhdGVNYXJrZXJzKHJlc291cmNlKTsKLQkJCQl5aWVsZCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24pIGU7Ci0JCQl9Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWZpbmFsbHkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIucnVuSW5Xb3Jrc3BhY2UoKTogZW5kIik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAoU3RyaW5nIHByb3h5VVJJLCBJTWFya2VyIG1hcmtlcikgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShwcm94eVVSSSk7Ci0JCVN0cmluZyByZXNvdXJjZUdVSUQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCWlmKHJlc291cmNlR1VJRCAhPSBudWxsKSB7Ci0JCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQlpZih2byAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKChDb2xsZWN0aW9uKXZvLm9iamVjdCk7Ci0JCQkJYm9vbGVhbiByZXQgPSBtYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotCQkJCWlmKG1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLnJlbW92ZShyZXNvdXJjZUdVSUQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21FbGVtZW50R1VJRFRvTWFya2Vyc01hcChTdHJpbmcgcHJveHlVUkksIElNYXJrZXIgbWFya2VyKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7Ci0JCWlmKGVsZW1lbnRHVUlEICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gdmFsaWRPYmplY3RzID0gKENvbGxlY3Rpb24pIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCWlmKHZhbGlkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSB2YWxpZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVmFsaWRPYmplY3Qgdm8xID0gKFZhbGlkT2JqZWN0KSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQlpZih2bzEub2JqZWN0ID09IG1hcmtlcikgewotCQkJCQkJaXRlcmF0b3IxLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKHZhbGlkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcC5yZW1vdmUoZWxlbWVudEdVSUQpOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1hcmtlcnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFya2Vycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZighdm8udmFsaWQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIHZvLm9iamVjdDsKLQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCVN0cmluZyBwcm94eVVSSSA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKTsKLQotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQotCQkJCQkJCS8vIHJlbW92ZSB0aGlzIG1hcmtlciBmcm9tIHJlc291cmNlR1VJVG9NYXJrZXJzTWFwCi0JCQkJCQkJLy8KLQkJCQkJCQlyZW1vdmVGcm9tUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJfQotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZighdm8udmFsaWQpIHsKLQkJCQl2by52YWxpZCA9IHRydWU7Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIHZvLm9iamVjdDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFya2Vycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyOwotCQkJCQl0cnkgewotCQkJCQkJbWFya2VyID0gKElNYXJrZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCVN0cmluZyBwcm94eVVSSVN0ciA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKTsKLQkJCQkJCQlVUkkgcHJveHlVUkkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJU3RyKTsKLQotCQkJCQkJCS8vIHByb3h5IGlzIGluIHRoZSBzYW1lIHJlc291cmNlIHRoYXQgaXMganVzdCBsb2FkZWQgCi0JCQkJCQkJLy8gdHJ5IHRvIGdldCB0aGUgb2JqZWN0IHdpdGggdGhpcyBwcm94eSBVUkkgd2l0aG91dCBsb2FkaW5nIG5ldyByZXNvdXJjZQotCQkJCQkJCS8vCi0vLwkJCQkJCQlFT2JqZWN0IG8gPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHByb3h5VVJJLCBmYWxzZSk7Ci0JCQkJCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gcHJveHlVUkkuZnJhZ21lbnQoKTsJCQkJCQkJCi0JCQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCQkJCQlpZihvICE9IG51bGwgJiYgIW8uZUlzUHJveHkoKSkgewotCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwkKLQotCQkJCQkJCQkvLyByZW1vdmUgdGhpcyBtYXJrZXIgZnJvbSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwCi0JCQkJCQkJCS8vCi0JCQkJCQkJCXJlbW92ZUZyb21FbGVtZW50R1VJRFRvTWFya2Vyc01hcChwcm94eVVSSVN0ciwgbWFya2VyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIjbm90aWZ5RXhjZXB0aW9uKGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmKCFlbmFibGVkKSByZXR1cm47Ci0JCQotCQlpZihlIGluc3RhbmNlb2YgUmVzb2x2ZUV4Y2VwdGlvbikgewotCQkJUmVzb2x2ZUV4Y2VwdGlvbiByZSA9IChSZXNvbHZlRXhjZXB0aW9uKSBlOwotCQkJCi0vLwkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClyZS5nZXRQcm94eSgpKS5lUHJveHlVUkkoKTsKLS8vCQkJaWYoIl8ySjRZb1BUREVkbWtwWUFSTk40NjhBIi5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkJfQotCQkJCi0JCQlpZihhZGRFeGNlcHRpb24ocmUpICYmIGF1dG9TY2hlZHVsZWQpIHsJCQkKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXV0b1NjaGVkdWxlZChib29sZWFuIGIpIHsKLQkJYXV0b1NjaGVkdWxlZCA9IGI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQXV0b1NjaGVkdWxlZCgpIHsKLQkJcmV0dXJuIGF1dG9TY2hlZHVsZWQ7Ci0JfQotCQotCS8qKgotCSAqIFNjaGVkdWxlcyB0aGlzIGpvYiBpZiBleGNlcHRpb25zIGFyZSBhdmFpbGFibGUgdG8gbG9nCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7Ci0JCWlmKCFlbmFibGVkKSByZXR1cm4gZmFsc2U7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCWlmKCFleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCXNjaGVkdWxlKERFTEFZKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNwcm94eVJlc29sdmVkKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCkgewotCQlpZighZW5hYmxlZCkgcmV0dXJuOwotCQkKLQkJaWYocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQkKLS8vCQkJaWYoIl8ySjRZb1BUREVkbWtwWUFSTk40NjhBIi5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkJfQotCQkJCi0JCQkvLyByZW1vdmUgYWxsIGV4Y2VwdGlvbnMgZm9yIHRoaXMgVVJJCi0JCQkvLwotCQkJcmVtb3ZlRXhjZXB0aW9ucyh1cmkpOwotCQkJCi0JCQkvLyBpbnZhbGlkYXRlIGFsbCBtYXJrZXJzIGZvciB0aGlzIFVSSQotCQkJLy8KLQkJCWlmKGludmFsaWRhdGVNYXJrZXJzKHVyaSkpIHsKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9CQkJCQkJCi0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGludmFsaWRhdGVNYXJrZXJzKFVSSSB1cmkpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgcmVzb3VyY2VHVUlEID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQkJaWYodm8gIT0gbnVsbCkgewotCQkJCQl2by52YWxpZCA9IGZhbHNlOwotCQkJCQlyZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50R1VJRCA9IHVyaS5mcmFnbWVudCgpOwotCQkJaWYoZWxlbWVudEdVSUQgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmdldChlbGVtZW50R1VJRCk7Ci0JCQkJaWYobWFya2VycyAhPSBudWxsICYmICFtYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQlyZXQgPSB0cnVlOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJdm8udmFsaWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4Y2VwdGlvbnMoVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb24gZXhjZXB0aW9ucyA9IChDb2xsZWN0aW9uKSB1cmlUb0V4Y2VwdGlvbnNNYXAuZ2V0KHVyaSk7Ci0JCQlpZihleGNlcHRpb25zID09IG51bGwgfHwgZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHJldHVybjsKLQkJCXRoaXMuZXhjZXB0aW9ucy5yZW1vdmVBbGwoZXhjZXB0aW9ucyk7Ci0JCQl1cmlUb0V4Y2VwdGlvbnNNYXAucmVtb3ZlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBwcm94aWVzIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqICAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhck1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBmaWxlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZihmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCXJlbW92ZU1hcmtlcihtYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU1hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgcHJveHlVUkkgPSBudWxsOwotCQl0cnkgewotCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSk7Ci0JCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWlmKHByb3h5VVJJICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlckluZm8gewotCQlTdHJpbmcgcHJveHlVUkk7Ci0JCVN0cmluZyBvd25lckdVSUQ7Ci0JCVN0cmluZyBtZXNzYWdlOwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYob2JqIGluc3RhbmNlb2YgTWFya2VySW5mbykgewotCQkJCU1hcmtlckluZm8gaW5mbyA9IChNYXJrZXJJbmZvKSBvYmo7Ci0JCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCAmJiBwcm94eVVSSS5lcXVhbHMoaW5mby5wcm94eVVSSSkgJiYgb3duZXJHVUlELmVxdWFscyhpbmZvLm93bmVyR1VJRCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWludCByZXN1bHQgPSBwcm94eVVSSS5oYXNoQ29kZSgpOwotCQkJcmVzdWx0IF49IG93bmVyR1VJRC5oYXNoQ29kZSgpOwotCQkJcmVzdWx0IF49IG1lc3NhZ2UuaGFzaENvZGUoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIG1hcmtlcnMgZm9yIHVucmVzb2x2ZWQgcHJveGllcyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJYm9vbGVhbiBuZXdseUFkZGVkID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZChyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycykgewotCQkJbmV3bHlBZGRlZCA9IHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQkJaWYobmV3bHlBZGRlZCkgewotCQkJc2NoZWR1bGUoREVMQVkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVBbGxNYXJrZXJzKCkgewotCQlib29sZWFuIG5ld2x5QWRkZWQgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzKSB7Ci0JCQlpZighZWxlbWVudEdVSVRvTWFya2Vyc01hcC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSB2by5vYmplY3Q7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OKTsKLQkJCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkobG9jYXRpb24pOwotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQkJCQluZXdseUFkZGVkID0gcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMuYWRkKHJlc291cmNlKSB8IG5ld2x5QWRkZWQ7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYobmV3bHlBZGRlZCkgewotCQkJc2NoZWR1bGUoREVMQVkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvVmFsaWRhdGVNYXJrZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgZmlsZSA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJaWYoZmlsZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBmaWxlLmZpbmRNYXJrZXJzKE1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlIYXNoU2V0PElNYXJrZXI+IG1hcmtlcnNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0PElNYXJrZXI+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQlpZihwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShwcm94eVVSSSk7Ci0JCQkJCQkvLyB0cnkgdG8gZ2V0IHRoZSBvYmplY3Qgd2l0aCB0aGlzIHByb3h5IFVSSSB3aXRob3V0IGxvYWRpbmcgbmV3IHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7CQkJCQkJCQotCQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCQkJCWlmKG8gPT0gbnVsbCB8fCBvLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkvLyBtYXJrZXIgc3RpbGwgY2FuIGV4aXN0LCBuZWVkIHRvIHVwZGF0ZSBpdAotCQkJCQkJCS8vCi0JCQkJCQkJbWFya2Vyc1RvVXBkYXRlLmFkZChtYXJrZXIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gb2JqZWN0IGlzIHJlc29sdmVkLCBtdXN0IGRlbGV0ZSBtYXJrZXIKLQkJCQkJCQkvLwotCQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCQkJCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJCQlyZW1vdmVGcm9tUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZighbWFya2Vyc1RvVXBkYXRlLmlzRW1wdHkoKSkgewotCQkJCQlJTWFya2VyW10gbWFya2VyQXJyYXkgPSBuZXcgSU1hcmtlclttYXJrZXJzVG9VcGRhdGUuc2l6ZSgpXTsKLQkJCQkJbWFya2Vyc1RvVXBkYXRlLnRvQXJyYXkobWFya2VyQXJyYXkpOwotCQkJCQl1cGRhdGVNYXJrZXIobWFya2VyQXJyYXksIHJlc291cmNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzZmEwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgcGVyc2lzdGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGMyMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRGVzY3JpcHRvciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcmkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICB2b2lkIHNldFVyaShTdHJpbmcgdmFsdWUpOwotCi0gICAgVVJJIGdldFJlc29sdmVkVVJJKCk7Ci0gICAgCi0gICAgdm9pZCBzZXRSZXNvbHZlZFVSSShVUkkgdXJpKTsKLQkKLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJlc29sdmVkIFVSSSB0aGF0IGhhcyBiZWVuIGNhY2hlZCBpbiBwcmV2aW91cyBjYWxsZWQgb2YgZ2V0UmVzb2x2ZWRVUkkoKQotCSAqIHNvIHRoZSBuZXh0IGNhbGwgdG8gZ2V0UmVzb2x2ZWRVUkkoKSB3aWxsIHVwZGF0ZSB0aGUgcmVzb2x2ZWRVUkkuCi0JICoKLQkgKi8KLQl2b2lkIGNsZWFyUmVzb2x2ZWRVUkkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkZjUzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIE1hbmFnZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHdWlkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHdWlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHdWlkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaUJhc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVyaUJhc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcmkgQmFzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXJpQmFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXJpQmFzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIE1hbmFnZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UmVzb3VyY2VNYW5hZ2VyPiBnZXRTdWJNYW5hZ2VycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTGlzdDxSZXNvdXJjZURlc2NyaXB0b3I+IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2V0cyBkaXJlY3QgUmVzb3VyY2VEZXNjcmlwdG9yIHdob3NlIGlkIGlzIHRoZSBnaXZlbiBndWlkCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZURlc2NyaXB0b3IgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKFN0cmluZyBndWlkKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIFJlc291cmNlRGVzY3JpcHRvciBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB1cmkuIElmIGNsZWFyRm9sZGVyIGlzIHRydWUsIHRoaXMgY2FsbCB3aWxsIHJlbW92ZQotICAgICAqIGFsbCBvdGhlciBSZXNvdXJjZURlc2NyaXB0b3JzIHdob3NlIFVSSSBzaGFyZXMgdGhlIHNhbWUgZm9sZGVyIG9mIHRoZSBnaXZlbiB1cmkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEBwYXJhbSBjbGVhckZvbGRlcgotICAgICAqIEByZXR1cm4gbGlzdCBvZiBSZXNvdXJjZURlc2NyaXB0b3JzIHRoYXQgaGFkIGJlZW4gcmVtb3ZlZAotICAgICAqLwotICAgIExpc3Q8UmVzb3VyY2VEZXNjcmlwdG9yPiByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoVVJJIHVyaSwgYm9vbGVhbiBjbGVhckZvbGRlcik7Ci0KLQl2b2lkIGRpc3Bvc2UoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4NmNhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlbWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlRGVzY3JpcHRvciBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VNYW5hZ2VyIGNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFJlc291cmNlbWFuYWdlclBhY2thZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UxOWFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlclBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOQU1FID0gInJlc291cmNlbWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9ERVNDUklQVE9SX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsIDxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX01BTkFHRVJfX0dVSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaSBCYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0UgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBNYW5hZ2VyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IgPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpIDxlbT5Vcmk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vcmk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX1VyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkd1aWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9HdWlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpIEJhc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRVcmlCYXNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0U3ViTWFuYWdlcnMgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0U3ViTWFuYWdlcnMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlTWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycyA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBnZXRSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJlc291cmNlRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9ERVNDUklQVE9SX19JRCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZURlc2NyaXB0b3JfVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCA8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsI2dldFJlc291cmNlTWFuYWdlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9NQU5BR0VSID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX01BTkFHRVJfX0dVSUQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaSBCYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0UgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBNYW5hZ2VyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2I4OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgTXVsdGlSZXNvdXJjZUVPYmplY3QgaW1wbGVtZW50cyBSZXNvdXJjZURlc2NyaXB0b3IgewotCQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NjcyNTA4MjY2MjM4NTQ2Mkw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCi0JcHJvdGVjdGVkIFVSSSByZXNvbHZlZFVSSTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotICAKLSAvL1VNQS0tPgotIAkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0gLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFJlc291cmNlbWFuYWdlclBhY2thZ2UuTGl0ZXJhbHMuUkVTT1VSQ0VfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlpZihyZXNvbHZlZFVSSSAhPSBudWxsICYmICh1cmkgPT0gbnVsbCB8fCB1cmkuc3RhcnRzV2l0aCgiLi4vIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXVyaSA9IHJlc29sdmVkVVJJLmRlcmVzb2x2ZShNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSkpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIG5ld1VyaSkgewotCQlTdHJpbmcgb2xkVXJpID0gdXJpOwotCQl1cmkgPSBuZXdVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJLCBvbGRVcmksIHVyaSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlzZXRVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXJpOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVUkkoKQotCSAqLwotCXB1YmxpYyBVUkkgZ2V0UmVzb2x2ZWRVUkkoKSB7Ci0JCWlmKHJlc29sdmVkVVJJID09IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJVVJJIGJhc2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSk7Ci0JCQkJcmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGdldFVyaSgpKS5yZXNvbHZlKGJhc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGdldFVyaSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRVUkk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI3NldFVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc29sdmVkVVJJKFVSSSB1cmkpIHsJCQotCQlyZXNvbHZlZFVSSSA9IHVyaTsKLQkJU3RyaW5nIG5ld1VyaSA9IG51bGw7Ci0JCWlmKHJlc29sdmVkVVJJICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7CQotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVVSSSBiYXNlVVJJID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzb3VyY2UpOwotCQkJCW5ld1VyaSA9IHJlc29sdmVkVVJJLmRlcmVzb2x2ZShiYXNlVVJJKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXNldFVyaShuZXdVcmkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNjbGVhclJlc29sdmVkVVJJKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJlc29sdmVkVVJJKCkgewotCQlyZXNvbHZlZFVSSSA9IG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZU1hbmFnZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwNjJmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBNYW5hZ2VyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCNnZXRVcmlCYXNlIDxlbT5VcmkgQmFzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0U3ViTWFuYWdlcnMgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycyA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXJJbXBsIGV4dGVuZHMgTXVsdGlSZXNvdXJjZUVPYmplY3QgaW1wbGVtZW50cyBSZXNvdXJjZU1hbmFnZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MTY0NDcxNDc1NTA5MTY5MjA0TDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkKCkgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGd1aWQgPSBHVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaUJhc2UoKSA8ZW0+VXJpIEJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaUJhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9CQVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaUJhc2UoKSA8ZW0+VXJpIEJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaUJhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpQmFzZSA9IFVSSV9CQVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViTWFuYWdlcnMoKSA8ZW0+U3ViIE1hbmFnZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1Yk1hbmFnZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc3ViTWFuYWdlcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VEZXNjcmlwdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXJJbXBsKCkgewotCQlzdXBlcigpOwotCQkKLQkJZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX01BTkFHRVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHdWlkKFN0cmluZyBuZXdHdWlkKSB7Ci0JCVN0cmluZyBvbGRHdWlkID0gZ3VpZDsKLQkJZ3VpZCA9IG5ld0d1aWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRCwgb2xkR3VpZCwgZ3VpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpQmFzZSgpIHsKLQkJcmV0dXJuIHVyaUJhc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpQmFzZShTdHJpbmcgbmV3VXJpQmFzZSkgewotCQlTdHJpbmcgb2xkVXJpQmFzZSA9IHVyaUJhc2U7Ci0JCXVyaUJhc2UgPSBuZXdVcmlCYXNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFLCBvbGRVcmlCYXNlLCB1cmlCYXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3ViTWFuYWdlcnMoKSB7Ci0JCWlmIChzdWJNYW5hZ2VycyA9PSBudWxsKSB7Ci0JCQlzdWJNYW5hZ2VycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCB0aGlzLCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyk7Ci0JCX0KLQkJcmV0dXJuIHN1Yk1hbmFnZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBMaXN0IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChyZXNvdXJjZURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXJlc291cmNlRGVzY3JpcHRvcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgdGhpcywgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGd1aWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3VpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXJpQmFzZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmlCYXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZQotCS8vCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnVtYWYuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCNlUmVzb2x2ZVByb3h5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgZVJlc29sdmVQcm94eShJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKLQkJcmV0dXJuIHN1cGVyLmVSZXNvbHZlUHJveHkocHJveHkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjcmVzb2x2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZSgpIHsKLQkJVVJJIGJhc2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvckltcGwgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3JJbXBsKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGRlc2MucmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGRlc2MuZ2V0VXJpKCkpLnJlc29sdmUoYmFzZSk7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZGVyZXNvbHZlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXJlc29sdmUoKSB7Ci0JCVVSSSBiYXNlID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpOwotICAgICAgICAvLyBjb252ZXJ0IHBhdGggaW4gYWxsIGRlc2NyaXB0b3JzIHRvIHJlbGF0aXZlCi0gICAgICAgIC8vCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBkZXNjLnNldFVyaShkZXNjLmdldFJlc29sdmVkVVJJKCkuZGVyZXNvbHZlKGJhc2UpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNyZW1vdmVSZXNvdXJjZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgTGlzdCByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoVVJJIHVyaSwgYm9vbGVhbiBjbGVhckZvbGRlcikgewotCQlBcnJheUxpc3QgcmVtb3ZlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlbW92ZWREZXNjcmlwdG9yID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmKHVyaS5lcXVhbHMoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRyaW1GcmFnbWVudCgpKSkgewotICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0vLyAgICAgICAgICAgICAgICByZW1vdmVkRGVzY3JpcHRvciA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0vLyAgICAgICAgaWYocmVtb3ZlZERlc2NyaXB0b3IgIT0gbnVsbCkgeyAgICAgICAgCQotICAgICAgICAJaWYoY2xlYXJGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGNoaWxkIGRlc2NyaXB0b3JzIG9mIHRoZSByZW1vdmVkIGRlc2NyaXB0b3IKLSAgICAgICAgCQkvLwotICAgICAgICAJCVN0cmluZyBvbGREaXIgPSBuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgIAkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotICAgICAgICAJCQlpZihkZXNjLmdldFJlc29sdmVkVVJJKCkudG9GaWxlU3RyaW5nKCkuc3RhcnRzV2l0aChvbGREaXIpKSB7Ci0gICAgICAgIAkJCQlpdGVyLnJlbW92ZSgpOwotICAgICAgICAJCQkJcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotLy8gICAgICAgIAllbHNlIHsKLS8vICAgICAgICAJCS8vIHJlbW92ZSBhbGwgdGhlIGRlc2NyaXB0b3JzIG9mIHRoZSBzYW1lIHJlc291cmNlCi0vLyAgICAgICAgCQkvLwotLy8gICAgICAgIAkJVVJJIHJlc1VyaSA9IHJlbW92ZWREZXNjcmlwdG9yLmdldFJlc29sdmVkVVJJKCkudHJpbUZyYWdtZW50KCk7Ci0vLyAgICAgICAgCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLyAgICAgICAgCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLS8vICAgICAgICAJCQlpZihkZXNjLmdldFJlc29sdmVkVVJJKCkudHJpbUZyYWdtZW50KCkuZXF1YWxzKHJlc1VyaSkpIHsKLS8vICAgICAgICAJCQkJaXRlci5yZW1vdmUoKTsKLS8vICAgICAgICAJCQkJcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotLy8gICAgICAgIAkJCX0KLS8vICAgICAgICAJCX0gICAgICAgIAkJCi0vLyAgICAgICAgCX0KLS8vICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZW1vdmVkTGlzdDsKLQl9CQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VEZXNjcmlwdG9yIGdldFJlc291cmNlRGVzY3JpcHRvcihTdHJpbmcgZ3VpZCkgewotCQlpZihpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID09IG51bGwpIHsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCi0JCQllQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgewotCQkgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkgICAgICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYzsKLQkJICAgICAgICAgICAgc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoUmVzb3VyY2VNYW5hZ2VyLmNsYXNzKSkgewotCQkgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQkJCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCWRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnJlbW92ZSgoKFJlc291cmNlRGVzY3JpcHRvciltc2cuZ2V0T2xkVmFsdWUoKSkuZ2V0SWQoKSk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXRPbGRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5yZW1vdmUoKChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpKS5nZXRJZCgpKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICB9Ci0KLQkJCX0pOwotCQkJCi0JCQkvLyBwb3B1bGF0ZSB0aGUgbWFwCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciBlbGVtZW50ID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZWxlbWVudC5nZXRJZCgpLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIChSZXNvdXJjZURlc2NyaXB0b3IpIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAuZ2V0KGd1aWQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTdWJNYW5hZ2VycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJcmV0dXJuIGdldEd1aWQoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlyZXR1cm4gZ2V0VXJpQmFzZSgpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUzoKLQkJCQlyZXR1cm4gZ2V0U3ViTWFuYWdlcnMoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRDoKLQkJCQlzZXRHdWlkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlzZXRVcmlCYXNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJZ2V0U3ViTWFuYWdlcnMoKS5jbGVhcigpOwotCQkJCWdldFN1Yk1hbmFnZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlEOgotCQkJCXNldEd1aWQoR1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFOgotCQkJCXNldFVyaUJhc2UoVVJJX0JBU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJZ2V0U3ViTWFuYWdlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJcmV0dXJuIEdVSURfRURFRkFVTFQgPT0gbnVsbCA/IGd1aWQgIT0gbnVsbCA6ICFHVUlEX0VERUZBVUxULmVxdWFscyhndWlkKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlyZXR1cm4gVVJJX0JBU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVyaUJhc2UgIT0gbnVsbCA6ICFVUklfQkFTRV9FREVGQVVMVC5lcXVhbHModXJpQmFzZSk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCXJldHVybiBzdWJNYW5hZ2VycyAhPSBudWxsICYmICFzdWJNYW5hZ2Vycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VEZXNjcmlwdG9ycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAuY2xlYXIoKTsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBudWxsOwotCQl9Ci0JCQotCQllQWRhcHRlcnMoKS5jbGVhcigpOwkJCi0JCQotCQkvLyBkaXNwb3NlIHRoZSBzdWIgbWFuYWdlcnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJbnRlcm5hbEVMaXN0KWdldFN1Yk1hbmFnZXJzKCkpLmJhc2ljSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgc3ViTWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQlpZighKChJbnRlcm5hbEVPYmplY3Qpc3ViTWdyKS5lSXNQcm94eSgpKSB7Ci0JCQkJc3ViTWdyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTWFwIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXA7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmNWRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlbWFuYWdlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlbWFuYWdlckZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlbWFuYWdlckZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlbWFuYWdlckZhY3RvcnkgdGhlUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSA9IChSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVJlc291cmNlbWFuYWdlckZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlRGVzY3JpcHRvciBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKSB7Ci0JCVJlc291cmNlRGVzY3JpcHRvckltcGwgcmVzb3VyY2VEZXNjcmlwdG9yID0gbmV3IFJlc291cmNlRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyIGNyZWF0ZVJlc291cmNlTWFuYWdlcigpIHsKLQkJUmVzb3VyY2VNYW5hZ2VySW1wbCByZXNvdXJjZU1hbmFnZXIgPSBuZXcgUmVzb3VyY2VNYW5hZ2VySW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFJlc291cmNlbWFuYWdlclBhY2thZ2UoKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1YjcyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIHsKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIEVDbGFzcyByZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcmVzb3VyY2VNYW5hZ2VyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwgdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSA9IChSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlTWFuYWdlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBnZXRSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKFJlc291cmNlbWFuYWdlckZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRGVzY3JpcHRvckVDbGFzcywgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRGVzY3JpcHRvckVDbGFzcywgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJKTsKLQotCQlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfTUFOQUdFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19HVUlEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MsIFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgIlJlc291cmNlRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICJSZXNvdXJjZU1hbmFnZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImd1aWQiLCBudWxsLCAwLCAxLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaUJhc2UiLCBudWxsLCAwLCAxLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCksIHRoaXMuZ2V0UmVzb3VyY2VNYW5hZ2VyKCksIG51bGwsICJzdWJNYW5hZ2VycyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpLCB0aGlzLmdldFJlc291cmNlRGVzY3JpcHRvcigpLCBudWxsLCAicmVzb3VyY2VEZXNjcmlwdG9ycyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKHJlc291cmNlTWFuYWdlckVDbGFzcywgdGhpcy5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKSwgImdldFJlc291cmNlRGVzY3JpcHRvciIsIDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJndWlkIiwgMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGIwZDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBYTUkgcmVzb3VyY2VzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFmYzUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtYW5hZ2luZyBYTUkgcmVzb3VyY2VzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDFjOGI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InJlc291cmNlbWFuYWdlciIKLSAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZURlc2NyaXB0b3IiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VNYW5hZ2VyIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UmVzb3VyY2VEZXNjcmlwdG9yIiBlVHlwZT0iIy8vUmVzb3VyY2VEZXNjcmlwdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0cyBkaXJlY3QgUmVzb3VyY2VEZXNjcmlwdG9yIHdob3NlIGlkIGlzIHRoZSBnaXZlbiBndWlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJndWlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmlCYXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1Yk1hbmFnZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlTWFuYWdlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VEZXNjcmlwdG9ycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZURlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiNzljNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iUmVzb3VyY2VtYW5hZ2VyIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIucHJvdmlkZXIuUmVzb3VyY2VtYW5hZ2VyRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5wcmVzZW50YXRpb24uUmVzb3VyY2VtYW5hZ2VyRWRpdG9yUGx1Z2luIgotICAgIG5vbk5MU01hcmtlcnM9InRydWUiIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0IgotICAgIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIKLSAgICBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIiBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIiBjb250YWlubWVudFByb3hpZXM9InRydWUiPgotICA8Zm9yZWlnbk1vZGVsPkM6XENDX1ZpZXdzXHBsZV9UTkdfQXV0aG9yaW5nXHRuZ19hdXRob3JpbmdcVE5HIFVNTCBNb2RlbHNccmVzb3VyY2VtYW5hZ2VyLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJSZXNvdXJjZW1hbmFnZXIiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIGVjb3JlUGFja2FnZT0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VEZXNjcmlwdG9yL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VEZXNjcmlwdG9yL3VyaSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9ndWlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL3VyaUJhc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL3N1Yk1hbmFnZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9yZXNvdXJjZURlc2NyaXB0b3JzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL2dldFJlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvZ2V0UmVzb3VyY2VEZXNjcmlwdG9yL2d1aWQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzMwZDVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvUmVzb3VyY2VtYW5hZ2VyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZW1hbmFnZXJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VNYW5hZ2VyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VNYW5hZ2VyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvUmVzb3VyY2VtYW5hZ2VyU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYTQ3YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoIHsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SOiB7Ci0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc291cmNlRGVzY3JpcHRvciA9IChSZXNvdXJjZURlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlRGVzY3JpcHRvcihyZXNvdXJjZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSOiB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciA9IChSZXNvdXJjZU1hbmFnZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlTWFuYWdlcihyZXNvdXJjZU1hbmFnZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4N2Q2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIG1hbmFnaW5nIFhNSSByZXNvdXJjZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2NiM2RjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNWFhZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5YTUlMaWJyYXJ5VUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYudWksCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYWZkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyNmNhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFhNSSBMaWJyYXJ5IFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLW5ld1hNSUxpYnJhcnlXaXphcmRQYWdlVGl0bGU9Q3JlYXRlIGEgbmV3IFhNSSBtZXRob2QgbGlicmFyeS4KLW5ld1hNSUxpYnJhcnlXaXphcmRQYWdlRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgbG9jYXRpb24gZm9yIHRoZSBtZXRob2QgbGlicmFyeS4gVGhlIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgd2lsbCBiZSBzdG9yZWQgaW4gYSBmb2xkZXIsIG5hbWVkIGFmdGVyIHRoZSBsaWJyYXJ5LCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotb3BlblhNSUxpYnJhcnlXaXphcmRQYWdlVGl0bGU9T3BlbiBhIFhNSSBtZXRob2QgbGlicmFyeS4KLW9wZW5YTUlMaWJyYXJ5V2l6YXJkUGFnZURlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGxvY2F0aW9uIGZvciB0aGUgbWV0aG9kIGxpYnJhcnkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiZWU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmV3TGlicmFyeVdpemFyZFBhZ2VzIj4KLSAgICAgIDxuZXdMaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5OZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZSIKLSAgICAgICAgICAgIHR5cGU9InhtaSIKLSAgICAgICAgICAgIHRpdGxlPSIlbmV3WE1JTGlicmFyeVdpemFyZFBhZ2VUaXRsZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbmV3WE1JTGlicmFyeVdpemFyZFBhZ2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8L25ld0xpYnJhcnlXaXphcmRQYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIj4KLSAgICAgIDxvcGVuTGlicmFyeVdpemFyZFBhZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlIgotICAgICAgICAgICAgdHlwZT0ieG1pIgotICAgICAgICAgICAgdGl0bGU9IiVvcGVuWE1JTGlicmFyeVdpemFyZFBhZ2VUaXRsZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlb3BlblhNSUxpYnJhcnlXaXphcmRQYWdlRGVzY3JpcHRpb24iPgotICAgICAgPC9vcGVuTGlicmFyeVdpemFyZFBhZ2U+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyI+Ci0gICAgICA8bWlncmF0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uLk1pZ3JhdG9yMTAyXzEwMyIKLSAgICAgICAgICAgIGxpYk5zVVJJPSJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIvPgotICAgICAgPG1pZ3JhdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbi5NaWdyYXRvcjEwMyIKLSAgICAgICAgICAgIGxpYk5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvTmV3WE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL05ld1hNSUxpYnJhcnlXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjAwOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvTmV3WE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5wcmVmZXJlbmNlcy5YTUlMaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwYXRoIGZvciBhIFhNSSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIE5ld0xpYnJhcnlXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQotCXByaXZhdGUgQ29tYm8gbG9jYXRpb25Db21ibzsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1hNSUxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQkJc3VwZXIocGFnZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KFhNSUxpYnJhcnlVSVJlc291cmNlcy5uYW1lTGFiZWxfdGV4dCk7Ci0KLQkJbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCi0JCUxhYmVsIGxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMubG9jYXRpb25MYWJlbF90ZXh0KTsKLQotCQlsb2NhdGlvbkNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWxvY2F0aW9uQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlsb2NhdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWZpbmFsIEJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJCWxvY2F0aW9uQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJCWxvY2F0aW9uQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCWZpbmFsIEJ1dHRvbiBkZWZhdWx0UGF0aENoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWRlZmF1bHRQYXRoQ2hlY2tib3gKLQkJCQkuc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuZGVmYXVsdFBhdGhDaGVja2JveExhYmVsX3RleHQpOwotCQlkZWZhdWx0UGF0aENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZGVmYXVsdFBhdGhDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlsb2NhdGlvbkNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJbG9jYXRpb25Db21iby5zZXRUZXh0KFhNSUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JCQkJCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlsb2NhdGlvbkNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9jYXRpb25Db21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIGxpYnJhcnlOYW1lID0gKFN0cmluZykgb2JqOwotCQkJbmFtZVRleHQuc2V0VGV4dChsaWJyYXJ5TmFtZSk7Ci0JCX0KLQotCQlpZiAoZ2V0TGlicmFyeVBhdGgoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlsb2NhdGlvbkNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCWxvY2F0aW9uQ29tYm8KLQkJCQkJLnNldFRleHQoWE1JTGlicmFyeVByZWZlcmVuY2VzLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5UGF0aCgpLmxlbmd0aCgpID4gMCAmJiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNlbGVjdGlvbnMoKSB7Ci0JCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKGdldExpYnJhcnlQYXRoKCksIGdldExpYnJhcnlOYW1lKCkpOwotCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9PcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NmVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9PcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkucHJlZmVyZW5jZXMuWE1JTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwYXRoIGZvciBhIFhNSSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UgZXh0ZW5kcyBPcGVuTGlicmFyeVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBDb21ibyBsb2NhdGlvbkNvbWJvOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQkJc3VwZXIocGFnZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMubG9jYXRpb25MYWJlbF90ZXh0KTsKLQotCQlsb2NhdGlvbkNvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlKTsKLQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWxvY2F0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJWE1JTGlicmFyeVVJUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldExpYnJhcnlQYXRoKCkpOwotCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQkJbG9jYXRpb25Db21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQkJbG9jYXRpb25Db21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChnZXRMaWJyYXJ5UGF0aCgpLmxlbmd0aCgpID09IDApIHsKLQkJCWxvY2F0aW9uQ29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJbG9jYXRpb25Db21ibwotCQkJCQkuc2V0VGV4dChYTUlMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlQYXRoKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBsb2NhdGlvbkNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBzcGVjaWZpYyB1c2VyIHNlbGVjdGlvbnMuCi0JICovCi0JcHVibGljIE1hcCBnZXRTZWxlY3Rpb25zKCkgewotCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJb3B0aW9ucy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbGlicmFyeVBhdGgKLQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzM1YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikKLW5hbWVMYWJlbF90ZXh0PU5hbWU6Ci1sb2NhdGlvbkxhYmVsX3RleHQ9TG9jYXRpb246Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLWRlZmF1bHRQYXRoQ2hlY2tib3hMYWJlbF90ZXh0PVVzZSB0aGUgZGVmYXVsdCBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9YTUlMaWJyYXJ5VUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFlMzVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGZvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pPC9jb2RlPgotICogcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5VUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBYTUlMaWJyYXJ5VUlQbHVnaW4uY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFhNSUxpYnJhcnlVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgWE1JTGlicmFyeVVJUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1JTGlicmFyeVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9YTUlMaWJyYXJ5VUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJmMGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFBhdGhDaGVja2JveExhYmVsX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0aW9uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4NTMzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoZWxwIG1pZ3JhdGUgYW5kIGZvcm1hdCB0aGUgaHRtbCBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIEpJbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25VdGlsIHsKLQkKLQlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGNkYXRhRmVhdHVyZU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXN0YXRpYyB7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWx0ZXJuYXRpdmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJtYWluRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImhvd1RvU3RhZmYiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImtleUNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJwdXJwb3NlIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY29wZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInVzYWdlTm90ZXMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgic2tpbGxzIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYXNzaWdubWVudEFwcHJvYWNoZXMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzeW5vbnltcyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInNlY3Rpb25EZXNjcmlwdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImltcGFjdE9mTm90SGF2aW5nIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicmVhc29uc0Zvck5vdE5lZWRpbmciKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJicmllZk91dGxpbmUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJyZXByZXNlbnRhdGlvbk9wdGlvbnMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJ1c2FnZUd1aWRhbmNlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicmVmaW5lZERlc2NyaXB0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWN0aXZpdHlFbnRyeVN0YXRlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWN0aXZpdHlFeGl0U3RhdGUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJleHRlcm5hbERlc2NyaXB0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicGFja2FnaW5nR3VpZGFuY2UiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhZGRpdGlvbmFsSW5mbyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInByb2JsZW0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJiYWNrZ3JvdW5kIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiZ29hbHMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhcHBsaWNhdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImxldmVsc09mQWRvcHRpb24iKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY2FsZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJyaXNrTGV2ZWwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJlc3RpbWF0aW5nVGVjaG5pcXVlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHJvamVjdE1lbWJlckV4cGVydGlzZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInR5cGVPZkNvbnRyYWN0Iik7ICAvLyROT04tTkxTLTEkCi0JCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCXJldHVybiBjZGF0YUZlYXR1cmVOYW1lcy5jb250YWlucyhmLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdFZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCi0JCQlIVE1MRm9ybWF0dGVyIGZvcm1hdGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQkJCQotCQkJaWYgKFJlc291cmNlSGVscGVyLmdldERlZmF1bHRSZXNvdXJjZU1ncigpID09IG51bGwpIHsKLQkJCQlSZXNvdXJjZUhlbHBlci5zZXREZWZhdWx0UmVzb3VyY2VNZ3IobmV3IFhNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIoKSk7Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gc2VlbiA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVByb3BlcnR5IHByb3BlcnR5ID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBwcm9wZXJ0eQotCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJCQkKLS8vCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMKLS8vCQkJCQkJCS5nZXQoaSk7Ci0vLwkKLQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCQlPYmplY3QgbmV3VmFsdWUgPSB2YWx1ZTsKLQkJCQkJaWYgKGlzSHRtbEZlYXR1cmUoZmVhdHVyZSkgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJCWlmICghIHNlZW4gJiYgbG9jYWxEZWJ1ZykgewkJCQkJCQkKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbGVtZW50OiAiICsgZWxlbWVudC5lQ2xhc3MoKS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzZWVuID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJdHJ5IHsKLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgc3RyMCA9IHZhbGlkYXRlR3VpZEF0dHJpYnV0ZSgoU3RyaW5nKSB2YWx1ZSk7CQkJCQkJCQotCQkJCQkJCVN0cmluZyBzdHIxID0gUmVzb3VyY2VIZWxwZXIudmFsaWRhdGVDb250ZW50KGVsZW1lbnQsIHN0cjApOwotCQkJCQkJCQotCQkJCQkJCW5ld1ZhbHVlID0gZm9ybWF0ZXIuZm9ybWF0SFRNTCgoU3RyaW5nKSBzdHIxKTsKLQotCQkJCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzdHIwOiAiICsgdmFsdWUpOwkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmICghIHN0cjEuZXF1YWxzKHN0cjApKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzdHIxOiAiICsgc3RyMSk7CQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghIG5ld1ZhbHVlLmVxdWFscyhzdHIxKSkgewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3VmFsdWU6ICIgKyBuZXdWYWx1ZSk7CQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotLy8JCQkJCQkJbmV3VmFsdWUgPSBzdHIyOwotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gTm90IGNoYW5nZSB2YWx1ZSBpZiBpdCBjYW5ub3QgYmUgZm9ybWF0dGVkCi0JCQkJCQkJLy8gU2hvdWxkIGFsc28gd3JpdGUgdG8gbG9nIGZvciB1c2VyIGF0dGVudGlvbgotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUd1aWRBdHRyaWJ1dGUoU3RyaW5nIHNvdXJjZSkgewotCQlTdHJpbmcgc3RyID0gdmFsaWRhdGVHdWlkQXR0cmlidXRlKHNvdXJjZSwgIFJlc291cmNlSGVscGVyLnBfbGlua19yZWYpOwotCQlzdHIgPSB2YWxpZGF0ZUd1aWRBdHRyaWJ1dGUoc3RyLCBSZXNvdXJjZUhlbHBlci5wX2FyZWFfcmVmKTsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlR3VpZEF0dHJpYnV0ZShTdHJpbmcgc291cmNlLCBQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlNYXRjaGVyIG0gPSBwYXR0ZXJuLm1hdGNoZXIoc291cmNlKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdGV4dDsJCQkKLQkJCQotCQkJTWFwIGF0dHJpYnV0ZU1hcCA9IFJlc291cmNlSGVscGVyLmdldEF0dHJpYnV0ZXNGcm9tTGluayhwYXR0ZXJuLCB0ZXh0KTsKLQkJCQotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB0ZXh0OiAgICAgICIgKyB0ZXh0KTsJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhdHRyaWJ1dGVNYXA6ICIgKyBhdHRyaWJ1dGVNYXApOwkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlTdHJpbmcgZ3VpZCA9IGF0dHJpYnV0ZU1hcCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfR1VJRCk7Ci0JCQlTdHJpbmcgaHJlZiA9IGF0dHJpYnV0ZU1hcCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfSFJFRik7Ci0KLQkJCWludCBpeDAgPSAtMTsKLQkJCWludCBpeDEgPSAtMTsKLQkJCWlmIChndWlkID09IG51bGwgJiYgaHJlZiAhPSBudWxsKSB7Ci0JCQkJaXgwID0gaHJlZi5sYXN0SW5kZXhPZigiLCIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJCQlpeDEgPSBocmVmLmxhc3RJbmRleE9mKCIuaHRtbCIpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCWlmIChpeDAgPj0gMCAmJiBpeDEgPiBpeDApIHsKLQkJCQkKLQkJCQlndWlkID0gaHJlZi5zdWJzdHJpbmcoaXgwICsgMSwgaXgxKTsKLQkJCQkvL1RvIGRvOiB2YWxpZGF0ZSBpZiBndWlkIGlzIHZhbGlkIGhlcmUsIG90aGVyd2lzZSwgbm8gcmVwbGFjZW1lbnQKLQkJCQkKLQkJCQlTdHJpbmcgcmVwbGFjZWQgPSBocmVmICsgIlwiIjsgIC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcmVwbGFjaW5nID0gaHJlZiArICJcIiBndWlkPVwiIitndWlkICsgIlwiIjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy9yZXBsYWNlbWVudCA9IFRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwucmVwbGFjZUFsbCh0ZXh0LCByZXBsYWNlZCwgcmVwbGFjaW5nKTsKLQkJCQlyZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZShyZXBsYWNlZCwgcmVwbGFjaW5nKTsKLQotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICByZXBsYWNlZDogIiArIHJlcGxhY2VkKTsJLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZXBsYWNpbmc6ICIgKyByZXBsYWNpbmcpOwkvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQkJCQotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgTWF0Y2hlci5xdW90ZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KSk7CQkJCQotCQl9Ci0JCW0uYXBwZW5kVGFpbChzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlODVjZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MaW5rSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMTIsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9yMTAyIGV4dGVuZHMgTWlncmF0b3JJbXBsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHByb3hpZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWFwIHByb3h5VG9GaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgbm90Rm91bmRQcm94aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliOwotCi0JcHJpdmF0ZSBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyID0gbmV3IE1pZ3JhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVbmtub3duRmVhdHVyZShFT2JqZWN0IG93bmVyLAotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJCS8vIE9yZGVyIGdyYXBoIG5vZGVzIG9mIHRhc2sgZGVzY3JpcHRvcnMgaW4gQUREIGJhc2VkIG9uIHRoZWlyIG9yZGVyCi0JCQkvLyBpbiB0aGUgdGFzayBkZXNjcmlwdG9yIGxpc3Qgb2YgdGhlIHJvbGUgZGVzY3JpcHRvcgotCQkJLy8gb2xkIGZlYXR1cmU6IFJvbGVEZXNjcmlwdG9yLnBlcmZvcm1zQXNPd25lcgotCQkJLy8KLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQkJJiYgInBlcmZvcm1zQXNPd25lciIuZXF1YWxzKGZlYXR1cmUuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJCSYmIHZhbHVlICE9IG51bGwpCi0JCQl7Ci0JCQkJQXJyYXlMaXN0IEdVSURzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCUdVSURzLmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCQlpZihHVUlEcy5zaXplKCkgPiAxKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9ICgoUm9sZURlc2NyaXB0b3Ipb3duZXIpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGFkZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShhY3QsIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYoYWRkICE9IG51bGwpIHsKLQkJCQkJCU1hcCB0ZEd1aWRUb0dyYXBoTm9kZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlpbnQgc2l6ZSA9IGFkZC5nZXRDb250YWluZWQoKS5zaXplKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gYWRkLmdldENvbnRhaW5lZCgpLmdldChpKTsKLQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoKEdyYXBoTm9kZSllbGVtZW50KTsKLQkJCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBncmFwaE5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCk7CQkJCQkJCQkKLQkJCQkJCQkJCWlmKG1lIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJCQkJCQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQkJCQkJLy8gdGhpcyBpcyBub3QgYSBHcmFwaE5vZGUgZm9yIFdvcmtQcm9kdWN0Q29tcG9zaXRlCi0JCQkJCQkJCQkJCS8vIGl0IG11c3QgYmUgYSBHcmFwaE5vZGUgZm9yIGEgVGFza0Rlc2NyaXB0b3IKLQkJCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQkJdGRHdWlkVG9HcmFwaE5vZGVNYXAucHV0KG1lLmdldEd1aWQoKSwgZ3JhcGhOb2RlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIHJlb3JkZXIgdGhlIGdyYXBoIG5vZGVzIHRvIG1hdGNoIG9yZGVyIG9mIHRoZWlyIGxpbmtlZCB0YXNrIGRlc2NyaXB0b3JzCi0JCQkJCQkvLwotCQkJCQkJQXJyYXlMaXN0IGdyYXBoTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgR1VJRHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgZ3JhcGhOb2RlID0gdGRHdWlkVG9HcmFwaE5vZGVNYXAuZ2V0KEdVSURzLmdldChpKSk7Ci0JCQkJCQkJaWYoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJZ3JhcGhOb2Rlcy5hZGQoZ3JhcGhOb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlhZGQuZ2V0Q29udGFpbmVkKCkucmVtb3ZlQWxsKGdyYXBoTm9kZXMpOwotCQkJCQkJYWRkLmdldENvbnRhaW5lZCgpLmFkZEFsbChncmFwaE5vZGVzKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QQVRIID0gWE1JTGlicmFyeVJlc291cmNlcy5maWxlUGF0aDsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3IjbWlncmF0ZShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWlncmF0ZShsaWJQYXRoLCBtb25pdG9yLCBudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3IjbWlncmF0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbykKLQkgKi8KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdE1pZ3JhdGUoKTsKLQkJCi0JCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKGxpYlBhdGgpOwotCi0JCWJvb2xlYW4gdG9WZXJpZnkgPSB0cnVlOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQl0b1ZlcmlmeSA9IGZhbHNlOwotCQl9Ci0JCQotCQlSZXNvdXJjZVV0aWwub3BlbihsaWJGaWxlLmdldFBhcmVudCgpLCBtb25pdG9yKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0IDEuMC4yIGRlZmF1bHQgdmFsdWVzIHNvIGRhdGEgY2FuIGJlIGNvcnJlY3RseSBsb2FkZWQKLQkJCS8vCi0JCQlzZXRPbGREZWZhdWx0VmFsdWVzKCk7Ci0KLQkJCS8vIGxvYWQgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZVNldCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRJbXBvcnRQbHVnaW5SZXNvdXJjZVNldCgpOwotCQkJfQotCQkJCQkJCi0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFU09VUkNFX0hBTkRMRVIsIHJlc291cmNlSGFuZGxlcik7Ci0JCQlsaWIgPSByZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCQotCQkJcmVtb3ZlUHJvY2Vzc0NvbnRyaWJ1dGlvbnMobW9uaXRvcik7Ci0KLQkJCS8vIHZlcmlmeSB0aGUgbGlicmFyeQotCQkJLy8KLQkJCS8vIFRPRE86IHVuY29tbWVudCBhZnRlciBleHRlcm5hbGl6ZSB0aGUgdGV4dAotCQkJLy8gdXBkYXRlU3RhdHVzKG1vbml0b3IsICJWZXJpZnlpbmcuLi4iKTsKLQotCQkJaWYgKHRvVmVyaWZ5KSB7Ci0JCQkJRGlzcGxheSBkaXMgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCQlpZiAoZGlzID09IG51bGwgfHwgZGlzLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCQkJdmVyaWZ5KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGlzLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl2ZXJpZnkoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCXJlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2VzKG1vbml0b3IpOwotCQkJfQotCQkJCQkJCi0JCQlpZiAodGhpcyBpbnN0YW5jZW9mIE1pZ3JhdG9yMTAyXzEwMykgewotCQkJCUxpbmtJbmZvLnNldExpYnJhcnkobGliKTsKLQkJCX0KLQkJCS8vIGxvYWQgYWxsIGVsZW1lbnRzIGluIG1lbW9yeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJCS5wcmludGxuKCJFcnJvciBpdGVyYXRlIHRocnUgY3Jvc3MgcmVmZXJlbmNlcyBvZiBlbGVtZW50OiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl1cGRhdGUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQotCQkJCi0JCQkKLQkJCXJlbW92ZU9sZERlZmF1bHRWYWx1ZXMoKTsKLQotCQkJLy8gY2hlY2sgbW9kaWZpZWQgcmVzb3VyY2VzIGZvciB3cml0YWJsZSBiZWZvcmUgc2F2aW5nIHRoZW0KLQkJCS8vCi0JCQlEaXNwbGF5IGRpcyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaWYgKGRpcyA9PSBudWxsIHx8IGRpcy5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkJY2hlY2tNb2RpZmllZFJlc291cmNlcygpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXMuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljaGVja01vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBhbGwgZmlsZXMKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuc2F2ZUxpYnJhcnlUYXNrX25hbWUpOwotCQkJTWFwIHNhdmVPcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zLCB0cnVlKTsKLQotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsCi0JCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWUpOwotCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCW1pZ3JhdGVEaWFncmFtKG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBNaWdyYXRvcjEwMl8xMDMpIHsKLQkJCQlMaW5rSW5mby5zZXRMaWJyYXJ5KG51bGwpOwotCQkJfQotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQkJCXJlc291cmNlU2V0ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgcHJvY2VzcyBjb250cmlidXRpb25zIGZyb20gYWxsIHBsdWdpbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvY2Vzc0NvbnRyaWJ1dGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RQYWNrYWdlIGNoaWxkUGtnID0gKE1ldGhvZFBhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEludGVybmFsRU9iamVjdCkgY2hpbGRQa2cpCi0JCQkJCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmRlbGV0ZShwa2cpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWRvIHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlBcnJheUxpc3QgcmVhZE9ubHlSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmcgcGx1Z2luSWQgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpOwotCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLCAwLAotCQkJCQlYTUlMaWJyYXJ5UmVzb3VyY2VzLmNhbm5vdFdyaXRlVG9GaWxlcywgbnVsbCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJCXJlYWRPbmx5UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW5JZCwgMCwgZmlsZQotCQkJCQkJCS50b1N0cmluZygpLCBudWxsKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gWE1JTGlicmFyeVJlc291cmNlcy5yZWFkT25seUZpbGVzX3RpdGxlOwotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnJlYWRPbmx5RmlsZXNfbXNnOwotCQkJCUVycm9yRGlhbG9nIGVyckRsZyA9IG5ldyBFcnJvckRpYWxvZyhNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksCi0JCQkJCQl0aXRsZSwgbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8KLQkJCQkJCQkJfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJCQkJICovCi0JCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJLy8gY3JlYXRlIFJldHJ5LCBDYW5jZWwgYW5kIERldGFpbHMgYnV0dG9ucwotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5SRVRSWV9MQUJFTCwgdHJ1ZSk7Ci0KLQkJCQkJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCQkJCQljcmVhdGVEZXRhaWxzQnV0dG9uKHBhcmVudCk7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cjb3BlbigpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCQkJCQlzaG93RGV0YWlsc0FyZWEoKTsKLQkJCQkJCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJaWYgKGVyckRsZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gd2hpbGUgKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocHJveGllc1RvUmVtb3ZlLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJLy8gVE9ETzogdW5jb21tZW50IGFmdGVyIGV4dGVybmFsaXplIHRoZSB0ZXh0Ci0JCS8vIHVwZGF0ZVN0YXR1cyhtb25pdG9yLCAiUmVtb3ZpbmcgdW5yZXNvbHZlZCByZWZlcmVuY2VzIik7Ci0JCUhhc2hTZXQgR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm94aWVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUdVSURzLmFkZChwcm94eS5lUHJveHlVUkkoKS5mcmFnbWVudCgpKTsKLQkJCUVjb3JlVXRpbC5yZW1vdmUocHJveHkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBpdGVyYXRvciA9IChGZWF0dXJlSXRlcmF0b3IpIGVsZW1lbnQKLQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG9iaiA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqLmVJc1Byb3h5KCkKLQkJCQkJCSYmIEdVSURzLmNvbnRhaW5zKG9iai5lUHJveHlVUkkoKS5mcmFnbWVudCgpKSkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWZlYXR1cmUuaXNEZXJpdmVkKCkpIHsKLQkJCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChMaXN0KSBlbGVtZW50LmVHZXQoZmVhdHVyZSkpLnJlbW92ZShvYmopOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeSgpIHsKLQkJbm90Rm91bmRQcm94aWVzLmNsZWFyKCk7Ci0JCXByb3hpZXNUb1JlbW92ZS5jbGVhcigpOwotCQlwcm94eVRvRmlsZU1hcC5jbGVhcigpOwotCQlwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAuY2xlYXIoKTsKLQkJcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkuY2xlYXIoKTsKLQotCQlDb2xsZWN0aW9uPEVPYmplY3Q+IHByb3hpZXMgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0UHJveGllcyhsaWIpOwotCQlpZiAoIXByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJveGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlVUkkgdXJpID0gcHJveHkuZVByb3h5VVJJKCk7Ci0JCQkJVVJJIG5vcm1hbGl6ZWRVUkkgPSB1cmlDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JCQkJaWYgKG5vcm1hbGl6ZWRVUkkgPT0gbnVsbCkgewotCQkJCQlwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSS5hZGQocHJveHkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5vcm1hbGl6ZWRVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCXByb3h5VG9GaWxlTWFwLnB1dChwcm94eSwgZmlsZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoCi0JCQkJCQkJCQlub3JtYWxpemVkVVJJLnRyaW1GcmFnbWVudCgpLCB0cnVlKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0RU9iamVjdChub3JtYWxpemVkVVJJLmZyYWdtZW50KCkpID09IG51bGwpIHsKLQkJCQkJCQkJbm90Rm91bmRQcm94aWVzLmFkZChwcm94eSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgZXJyTXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUKLQkJCQkJCQkJCS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJcHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLnB1dChwcm94eSwKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGZpbGUsIGVyck1zZyB9KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJveHlUb0ZpbGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkvLyBwcm9tcCB1c2VyIHRvIHJlc29sdmUgbWlzc2luZyBmaWxlcwotCQkJLy8KLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocHJveHlUb0ZpbGVNYXAua2V5U2V0KCkpOwotCQkJZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFUSCA9IFhNSUxpYnJhcnlSZXNvdXJjZXMuZWxlbWVudFBhdGg7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgcHJveHlUb0ZpbGVNYXAuZ2V0KG9iamVjdCk7Ci0JCQkJCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpCi0JCQkJCQkJKyAiICgiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCQkJICogICAgICBpbnQpCi0JCQkJICovCi0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiBwcm94eVRvRmlsZU1hcC5nZXQob2JqZWN0KS50b1N0cmluZygpOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c7Ci0JCQkJU2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3Rpb25EaWFsb2coTXNnQm94Ci0JCQkJCQkuZ2V0RGVmYXVsdFNoZWxsKCksIGxpc3QsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0KLQkJCQlkbGcuc2V0VGl0bGUoWE1JTGlicmFyeVJlc291cmNlcy5taXNzaW5nRmlsZXNfdGl0bGUpOwotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcuc2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKGxpc3QpOwotCQkJCWRsZwotCQkJCQkJLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgRklMRV9QQVRILAotCQkJCQkJCQlFTEVNRU5UX1BBVEggfSk7Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJT2JqZWN0IG9ianNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwcm94aWVzVG9SZW1vdmUuYWRkKGl0ZXIubmV4dCgpKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHByb21wdCB1c2VyIHRvIHJlc29sdmUgZmlsZXMgdGhhdCBjYW4gbm90IGJlIGxvYWRlZAotCQkvLwotCQlpZiAoIXByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLmtleVNldCgpKTsKLQkJCWZpbmFsIFN0cmluZyBMT0FEX0VSUk9SID0gWE1JTGlicmFyeVJlc291cmNlcy5sb2FkRXJyb3I7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGludCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCU9iamVjdFtdIGFyciA9IChPYmplY3RbXSkgcHJveHlUb0ZpbGVNYXAuZ2V0KG9iamVjdCk7Ci0JCQkJCWlmIChjb2x1bW5JbmRleCA8IDIpIHsKLQkJCQkJCXJldHVybiBhcnJbY29sdW1uSW5kZXhdLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnOwotCQkJCVNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgU2VsZWN0aW9uRGlhbG9nKE1zZ0JveAotCQkJCQkJLmdldERlZmF1bHRTaGVsbCgpLCBsaXN0LCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCi0JCQkJZGxnLnNldFRpdGxlKFhNSUxpYnJhcnlSZXNvdXJjZXMuZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZSk7Ci0JCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRsZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMobGlzdCk7Ci0JCQkJZGxnLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgRklMRV9QQVRILCBMT0FEX0VSUk9SIH0pOwotCQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCU9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQkJaWYgKG9ianMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcHJveGllc1RvUmVtb3ZlLmFkZChpdGVyLm5leHQoKSk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlBcnJheUxpc3QgcHJveGllc1RvUmV0YWluID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm94aWVzLmFkZEFsbChwcm94eVRvRmlsZU1hcC5rZXlTZXQoKSk7Ci0JCXByb3hpZXMuYWRkQWxsKHByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5rZXlTZXQoKSk7Ci0JCXByb3hpZXMucmVtb3ZlQWxsKHByb3hpZXNUb1JlbW92ZSk7Ci0KLQkJaWYgKHByb3hpZXNUb1JldGFpbi5pc0VtcHR5KCkpIHsKLQkJCXByb3hpZXNUb1JlbW92ZS5hZGRBbGwobm90Rm91bmRQcm94aWVzKTsKLQkJCXByb3hpZXNUb1JlbW92ZS5hZGRBbGwocHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkpOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9ICJTdW1tYXJ5IG9mIHVucmVzb2x2ZWQgcHJveGllczoiOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSAiXG4gIE5vdCBmb3VuZCBwcm94aWVzOiAiICsgbm90Rm91bmRQcm94aWVzOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSAiXG4gIFByb3hpZXMgd2l0aCB1bm5vcm1hbGl6ZWQgVVJJOiAiICsgcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkk7IC8vJE5PTi1OTFMtMSQKLQkJWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtc2cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVPbGREZWZhdWx0VmFsdWVzKCkgewotCQlNdWx0aVJlc291cmNlRU9iamVjdC5yZW1vdmVEZWZhdWx0VmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFRvTmV3RGVmYXVsdFZhbHVlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJCS5yZW1vdmVGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0T2xkRGVmYXVsdFZhbHVlcygpIHsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3Quc2V0RGVmYXVsdFZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoTWV0aG9kRWxlbWVudCBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRqdXN0VG9OZXdEZWZhdWx0VmFsdWVzKGUpOwotCi0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJYWN0Ci0JCQkJCQkuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pOwotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCWFjdAotCQkJCQkJLnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpOwotCQkJfQotCQl9Ci0JCWlmICghICh0aGlzIGluc3RhbmNlb2YgTWlncmF0b3IxMDJfMTAzKSkgewotCQkJTWlncmF0aW9uVXRpbC5mb3JtYXRWYWx1ZShlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWlncmF0ZSgpIHsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlRGlhZ3JhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMl8xMDMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMl8xMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmNzk2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDJfMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDIwLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvcjEwMl8xMDMgZXh0ZW5kcyBNaWdyYXRvcjEwMiB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGRpYWdyYW1FbGVtTWFwOyAKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWlncmF0ZSgpIHsKLQkJZGlhZ3JhbUVsZW1NYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShNZXRob2RFbGVtZW50IGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnVwZGF0ZShlLCBtb25pdG9yKTsKLQkJTWlncmF0b3IxMDMudXBkYXRlRWxlbWVudChlLCBkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWlncmF0ZURpYWdyYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWlncmF0b3IxMDMuZGlhZ3JhbU1pZ3JhdGUoZGlhZ3JhbUVsZW1NYXAsIG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzY1YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gRmViIDEyLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvcjEwMyBleHRlbmRzIE1pZ3JhdG9yQmFzZSB7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcDsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHhtbE1pZ3JhdGUgPSBmYWxzZTsKLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQltaWdyYXRlKGxpYlBhdGgsIG1vbml0b3IsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShsaWJQYXRoKTsKLQkJCi0JCWJvb2xlYW4gdG9WZXJpZnkgPSB0cnVlOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQl0b1ZlcmlmeSA9IGZhbHNlOwotCQl9Ci0JCXhtbE1pZ3JhdGUgPSBmYWxzZTsKLQkJUmVzb3VyY2VVdGlsLm9wZW4obGliRmlsZS5nZXRQYXJlbnQoKSwgbW9uaXRvcik7Ci0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbnVsbDsKLQkJCi0JCWRpYWdyYW1FbGVtTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCQl0cnkgewotCQkJLy8gbG9hZCB0aGUgbGlicmFyeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCWlmICh0b1ZlcmlmeSkgewotCQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc291cmNlU2V0ID0gUGVyc2lzdGVuY2VVdGlsLmdldEltcG9ydFBsdWdpblJlc291cmNlU2V0KCk7Ci0JCQl9Ci0JCQkJCQkKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSByZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCQkJCQotCQkJTGlua0luZm8uc2V0TGlicmFyeShsaWIpOwotCQkJLy8gbG9hZCBhbGwgZWxlbWVudHMgaW4gbWVtb3J5Ci0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCQkJCi0JCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwkJCQkJCi0JCQkKLQkJCS8vIHNhdmUgYWxsIGZpbGVzCi0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgdHJ1ZSk7Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLAotCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lKTsKLQkJCQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCQlkaWFncmFtTWlncmF0ZShkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7CQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlMaW5rSW5mby5zZXRMaWJyYXJ5KG51bGwpOwotCQkJCi0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGlhZ3JhbU1pZ3JhdGUoTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXAsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBDb252ZXJ0IGRpYWdyYW1zIAotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubWlncmF0aW5nRGlhZ3JhbV9uYW1lKTsKLQkJCi0JCUlEaWFncmFtTWlncmF0aW9uIGlkbSA9IChJRGlhZ3JhbU1pZ3JhdGlvbikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSIsICJkaWFncmFtTWlncmF0aW9uIik7IAkJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoaWRtICE9IG51bGwgJiYgIWRpYWdyYW1FbGVtTWFwLmlzRW1wdHkoKSkgewotCQkJdHJ5IHsKLQkJCQlpZG0ubWlncmF0ZShkaWFncmFtRWxlbU1hcC52YWx1ZXMoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdXBkYXRlRWxlbWVudChlbGVtZW50LCBkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRpYWdyYW1FbGVtTWFwICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gfHwKLQkJCQllbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJaWYgKHByb2Nlc3MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlTdHJpbmcgZ3VpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCQlQcm9jZXNzIHByb2MgPSBkaWFncmFtRWxlbU1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChwcm9jID09IG51bGwpIHsKLQkJCQkJCWRpYWdyYW1FbGVtTWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgKFByb2Nlc3MpIGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXNzZXJ0KHByb2MgPT0gZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWlncmF0aW9uVXRpbC5mb3JtYXRWYWx1ZShlbGVtZW50KTsKLQkJaGFuZGxlVHlwZUNvbnZlcnQoZWxlbWVudCk7Ci0JCWlmICghIHhtbE1pZ3JhdGUpIHsKLQkJCWhhbmRsZVNoYXBlQW5kTm9kZUljb25zKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlVHlwZUNvbnZlcnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKAllbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSAJCQl8fAotCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0IAl8fAotCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKSB7CQkJCi0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBwcmVzID0gY29udmVydChndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQlpZiAocHJlcyAhPSBudWxsKSB7Ci0JCQkJZ3VpZGFuY2Uuc2V0UHJlc2VudGF0aW9uKHByZXMpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEd1aWRhbmNlRGVzY3JpcHRpb24gY29udmVydChDb250ZW50RGVzY3JpcHRpb24gb2xkT2JqKSB7Ci0JCWlmIChvbGRPYmogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBuZXdPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCk7CQkKLQkJUmVzb3VyY2UgcmVzID0gb2xkT2JqLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShvbGRPYmopOwotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG5ld09iaik7Ci0JCX0KLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsJCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG9sZE9iai5lR2V0KGZlYXR1cmUpOwotCQkJCW5ld09iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gbmV3T2JqOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVNoYXBlQW5kTm9kZUljb25zKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7CQkJCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudDsKLQkJCVVSSSBmaXhlZFVSSSA9IGZpeEljb25VUkkoZGVzY3JpYmFibGVFbGVtZW50LCBkZXNjcmliYWJsZUVsZW1lbnQuZ2V0U2hhcGVpY29uKCkpOwotCQkJaWYgKGZpeGVkVVJJICE9IG51bGwpIHsKLQkJCQlkZXNjcmliYWJsZUVsZW1lbnQuc2V0U2hhcGVpY29uKGZpeGVkVVJJKTsKLQkJCX0KLQkJCWZpeGVkVVJJID0gZml4SWNvblVSSShkZXNjcmliYWJsZUVsZW1lbnQsIGRlc2NyaWJhYmxlRWxlbWVudC5nZXROb2RlaWNvbigpKTsKLQkJCWlmIChmaXhlZFVSSSAhPSBudWxsKSB7Ci0JCQkJZGVzY3JpYmFibGVFbGVtZW50LnNldE5vZGVpY29uKGZpeGVkVVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFVSSSBmaXhJY29uVVJJKERlc2NyaWJhYmxlRWxlbWVudCBlLCBVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlGaWxlIHBhdGggPSBuZXcgRmlsZShOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSk7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU3RhY2s8U3RyaW5nPigpOwotCQlGaWxlIHRlbXAgPSBwYXRoOwotCQlTdHJpbmcgcmVzdWx0UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCXN0YWNrLnB1c2godGVtcC5nZXROYW1lKCkpOwotCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCWlmICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkvLyBub3cgc2tpcCBmaXJzdCBzdGFjayBlbnRyeSBhbmQgcmVjb25zdHJ1Y3QgcGF0aAotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBzdGFjay5wb3AoKTsKLQkJCXdoaWxlICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHJlc3VsdFBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJlc3VsdFBhdGggKz0gJy8nOwotCQkJCX0KLQkJCQlyZXN1bHRQYXRoID0gcmVzdWx0UGF0aCArIChTdHJpbmcpc3RhY2sucG9wKCk7Ci0JCQl9Ci0KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCXRyeSB7Ci0JCQkJVVJJIHJlc3VsdFVSSSA9IG5ldyBVUkkocmVzdWx0UGF0aCk7Ci0JCQkJaWYgKCFwbHVnaW5OYW1lLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQkvLyB1cmkgd2FzIHJlZmVyaW5nIGEgZmlsZSBpbiBhbm90aGVyIHBsdWdpbgotCQkJCQlGaWxlIGxpYlJvb3QgPSBUbmdVdGlsLmdldExpYnJhcnlSb290UGF0aChlKTsKLQkJCQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUobGliUm9vdCwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpOwotCQkJCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShsaWJSb290LCBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHJlc3VsdFVSSS50b1N0cmluZygpKSk7Ci0JCQkJCWlmICghbmV3RmlsZS5leGlzdHMoKSkgewotCSAgICAgIAkJCQkJRmlsZVV0aWwuY29weUZpbGUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdFVSSTsKLQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotCQkJCVhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgbWlncmF0ZVhtbEltcG9ydGVkTGliKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQl4bWxNaWdyYXRlID0gdHJ1ZTsKLQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFhNSUxpYnJhcnlSZXNvdXJjZXMubWlncmF0ZVhNTExpYnJhcnlfdGFza05hbWUpOwotCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwotCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShsaWIsIGZhbHNlLCBmYWxzZSk7Ci0JCXhtbE1pZ3JhdGUgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhMTZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3JCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIG1pZ3JhdG9ycwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBGZWIgMTIsIDIwMDcKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1pZ3JhdG9yQmFzZSBleHRlbmRzIE1pZ3JhdG9ySW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFsbENvbnRlbnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWV0aG9kTGlicmFyeSBsaWIpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IgaXRlcmF0ZSB0aHJ1IGNyb3NzIHJlZmVyZW5jZXMgb2YgZWxlbWVudDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJdXBkYXRlRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdXBkYXRlRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbjsJCi0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGI3OGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9TZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIGRpYWxvZyB0aGF0IGxpc3RzIG1pc3NpbmcgZmlsZXMgaW4gYSBtZXRob2QgbGlicmFyeSB0byBiZSB1cGdyYWRlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgaW5wdXQsCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IGlucHV0LAotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGlucHV0LCBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuY29sdW1uUHJvcGVydGllcyA9IGNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgY29sdW1ucwotCQkvLwotCQlUYWJsZSB0YWJsZSA9IGdldFZpZXdlcigpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCQljb2wuc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQljb2wuc2V0V2lkdGgoMjAwKTsKLQkJfQotCQlnZXRWaWV3ZXIoKS5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0KLQkJcmV0dXJuIGN0cmw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3YzNkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbWlncmF0aW9uIHN1cHBvcnQgZm9yIHVwZ3JhZGluZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxZGVlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgTGlicmFyeSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RlMWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiOTdiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWkuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMWVkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLSAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9PcGVuTGlicmFyeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9PcGVuTGlicmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvT3BlbkxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL3dpemJhbi9PcGVuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlZDllNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBBY3Rpb24gCi1hY3Rpb25TZXRMYWJlbD1NZXRob2QgQXV0aG9yaW5nCi1maWxlT3Blbk1lbnVMYWJlbD1PJnBlbgotb3BlbkxpYnJhcnlBY3Rpb25sYWJlbD1NZXRob2QgTGlicmFyeQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPU9wZW4gYSBtZXRob2QgbGlicmFyeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODYxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPiAgICAgICAgICAgCi0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiCi0gICAgICAgICBuYW1lPSJFUEYgTmV3IE1ldGhvZCBMaWJyYXJ5IFdpemFyZCBQYWdlcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIgotICAgICAgICAgbmFtZT0iRVBGIE9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIFBhZ2VzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvT3BlbkxpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJvcGVuTGlicmFyeVdpemFyZCIKLSAgICAgICAgIG5hbWU9Ik9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkLmV4c2QiIC8+Ci0gICAgICAgICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uU2V0TGFiZWwiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubWVudS5maWxlT3Blbk1lbnUiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWZpbGVPcGVuTWVudUxhYmVsIgotICAgICAgICAgICAgICAgcGF0aD0iZmlsZS9uZXcuZXh0Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMSIvPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJncm91cG0yIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5PcGVuTGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9ImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuT3BlbkxpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW9wZW5MaWJyYXJ5QWN0aW9ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5tZW51LmZpbGVPcGVuTWVudS9ncm91cG0xIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcCIvPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvTmV3TGlicmFyeVdpemFyZFBhZ2VzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvTmV3TGlicmFyeVdpemFyZFBhZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWM0NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSIgaWQ9Im5ld0xpYnJhcnlXaXphcmRQYWdlcyIgbmFtZT0iRVBGIE5ldyBNZXRob2QgTGlicmFyeSBXaXphcmQgUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhIG1ldGhvZCBsaWJyYXJ5IHR5cGUgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgdG8gdGhlIE5ldyBNZXRob2QgTGlicmFyeSB3aXphcmQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5ld0xpYnJhcnlXaXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibmV3TGlicmFyeVdpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5BZGRMaWJyYXJ5V2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5ld0xpYnJhcnlXaXphcmRQYWdlcyZxdW90OyZndDsKLSAgICAgICZsdDthZGRMaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLk5ld1hNSUxpYnJhcnlXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdGl0bGU9JnF1b3Q7Q3JlYXRlcyBhIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsKLSAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O1NwZWNpZnkgdGhlIGxvY2F0aW9uIGZvciB0aGUgWE1JIG1ldGhvZCBsaWJyYXJ5LiZxdW90OyZndDsKLSAgICAgICZsdDsvYWRkTGlicmFyeVdpemFyZFBhZ2UmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvT3BlbkxpYnJhcnlXaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ODFhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvT3BlbkxpYnJhcnlXaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkiIGlkPSJleHBvcnRNU1BXaXphcmQiIG5hbWU9IkV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgT3BlbiBNZXRob2QgTGlicmFyeSB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5NeU9wZW5MaWJyYXJ5V2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTXlPcGVuTGlicmFyeU1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5TWFpblBhZ2UmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTXlPcGVuTGlicmFyeU9wdGlvblBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7bmV3JnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5PcGVuTGlicmFyeU1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NjaGVtYS9PcGVuTGlicmFyeVdpemFyZFBhZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMGU0MTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBuYW1lPSJFUEYgT3BlbiBNZXRob2QgTGlicmFyeSBXaXphcmQgUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhIG1ldGhvZCBsaWJyYXJ5IHR5cGUgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgdG8gdGhlIE9wZW4gTWV0aG9kIExpYnJhcnkgd2l6YXJkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcGVuTGlicmFyeVdpemFyZFBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvcGVuTGlicmFyeVdpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5BZGRMaWJyYXJ5V2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJycmF5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7b3BlbkxpYnJhcnlXaXphcmRQYWdlCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdGl0bGU9JnF1b3Q7T3BlbnMgYSBYTUkgbWV0aG9kIGxpYnJhcnkuJnF1b3Q7Ci0gICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtTcGVjaWZ5IHRoZSBsb2NhdGlvbiBmb3IgdGhlIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L29wZW5MaWJyYXJ5V2l6YXJkUGFnZSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSU1ldGhvZEVsZW1lbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0lNZXRob2RFbGVtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiODQxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSU1ldGhvZEVsZW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBtZXRob2QgZWxlbWVudCBwcm92aWRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RFbGVtZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJSW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTExY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGNhY2hlZCBjb3B5IG9mIGNvbW1vbmx5IHJlZmVyZW5jZWQgaW1hZ2VzIGluIHRoZSBsaWJyYXJ5IFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSUltYWdlcyB7Ci0KLQkvKioKLQkgKiBUaGUgaW1hZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWV0aG9kIExpYnJhcnkgZWxlbWVudHMuCi0JICogPHA+Ci0JICogVGhlc2UgaW1hZ2VzIGFyZSBjYWNoZWQgYW5kIHNob3VsZCBub3QgYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIhCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUNUSVZJVFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQWN0aXZpdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQVJUSUZBQ1QgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ0FQQUJJTElUWV9QQVRURVJOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NIRUNLTElTVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DaGVja2xpc3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09NUE9TSVRFX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT05DRVBUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbmNlcHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09OVEVOVF9QQUNLQUdFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NVU1RPTV9DQVRFR09SWSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSQUJMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSWV9QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ESVNDSVBMSU5FID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0Rpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRElTQ0lQTElORV9HUk9VUElORyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRE9NQUlOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RvbWFpbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFUSU5HX01FVFJJQyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VYQU1QTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXhhbXBsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19HVUlERUxJTkUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvR3VpZGVsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0lURVJBVElPTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9JdGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9DT05GSUdVUkFUT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfTElCQVJBUlkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfUEFDS0FHRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9QTFVHSU4gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01JTEVTVE9ORSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NaWxlc3RvbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1VUQ09NRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9PdXRjb21lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BIQVNFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1BoYXNlIik7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUkFDVElDRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9QcmFjdGljZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJPQ0VTU19GQU1JTFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTX1BBQ0tBR0UgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUkVQT1JUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JlcG9ydCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0FETUFQID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvYWRtYXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUk9MRV9ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0xFX1NFVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlU2V0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEVfU0VUX0dST1VQSU5HID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVTZXRHcm91cGluZyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBQT1JUSU5HX01BVEVSSUFMID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19UQVNLID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2siKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVEFTS19ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RFQU1fUFJPRklMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZWFtUHJvZmlsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URU1QTEFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URVJNX0RFRklOSVRJT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVE9PTCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Ub29sIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RPT0xfTUVOVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rvb2xNZW50b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfV0hJVEVQQVBFUiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9XaGl0ZXBhcGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1dPUktfUFJPRFVDVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19XT1JLX1BST0RVQ1RfVFlQRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCByZWxhdGl2ZSB0byAiaWNvbnMiIGZvbGRlciBpbiB0aGUgdGhlIFVNQSBFZGl0IHBsdWctaW4KLQkgKiBAcmV0dXJuIGFuIDxjb2RlPkltYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGdldEVsZW1lbnRJbWFnZShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShwYXRoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiZDk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHMuQ29tbWFuZExpbmVSdW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JMThuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Db25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLkNvcHlMaWJyYXJ5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NYXBwaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgTGlicmFyeSBVSSBNYW5hZ2VyIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBBIExpYnJhcnkgTWFuYWdlciBwcm92aWRlcyB0aGUgdXNlciBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFuZCBvcGVuaW5nIGEKLSAqIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlNYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQgPSAidG9vbGJhci5jb25maWcuY29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9QRVJTX0lEID0gIm9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LmRlc2lnbmVyLnVpLlJlcG9ydFBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVVJTWFuYWdlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JLy8gVGhlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3aWxsIGJlIG9wZW5lZCByZWdhcmRsZXNzIG9mIHRoZQotCS8vIHNhdmVkIGxpYnJhcnkgcHJlZmVyZW5jZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkkgbGlicmFyeVVSSTsKLQotCS8vIFRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgb25seSBpZiB0aGVyZSBhcmUKLQkvLyBubyBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgVVJJIGRlZmF1bHRMaWJyYXJ5VVJJOwotCXByb3RlY3RlZCBzdGF0aWMgVVJJIGRlZmF1bHRMaWJyYXJ5VVJJX05MOwotCXByaXZhdGUgYm9vbGVhbiBsaWJyYXJ5SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gY29uZmlnQ29tYm8gPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVVJTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVVJTWFuYWdlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlVSU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZwotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlVSU1hbmFnZXIoKSB7Ci0JCS8vIE1vbml0b3IgcGVyc3BlY3RpdmUgY2hhbmdlcyB0byBkaXNwbGF5L2hpZGUgdGhlIGNvbmZpZ3VyYXRpb24gY29tYm8uCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQl3aW5kb3cuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcihuZXcgSVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYykgewotCQkJCQljaGVja0NvbmZpZ3VyYXRpb25Db250cmlidXRpb24oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYywgU3RyaW5nIGlkKSB7Ci0JCQkJCWNoZWNrQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIG9wZW5zIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIGNyZWF0ZWQgYW5kIG9wZW5lZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJaWYgKCFsaWJyYXJ5UGF0aC5leGlzdHMoKSkgewotCQkJCWxpYnJhcnlQYXRoLm1rZGlycygpOwotCQkJfQotCQkJWE1JTGlicmFyeVV0aWwuY3JlYXRlTWV0aG9kTGlicmFyeShsaWJyYXJ5UGF0aC5nZXROYW1lKCksIHBhdGgpOwotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChwYXRoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBkZWZhdWx0IG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBkZWZhdWx0IGxpYnJhcnkgcGF0aCBVUkkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFVSSSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkRlZmF1bHRMaWJyYXJ5KGZpbmFsIFVSSSB1cmkpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZGVmYXVsdExpYnJhcnlQYXRoRmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUoZGVmYXVsdExpYnJhcnlQYXRoRmlsZSwgWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUkpOwotCQkJaWYgKCFsaWJyYXJ5WE1JRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSSSBsaWJVcmkgPSB1cmk7Ci0JCQkJCQlTdHJpbmcgbmV3UGF0aCA9IGhhbmRsZUxpYnJhcnlPblJlYWRPbmx5SW5zdGFsbFBhdGgobGliVXJpKTsKLQkJCQkJCWlmIChuZXdQYXRoICE9IG51bGwpIHsKLQkJCQkJCQlsaWJVcmkgPSBTdHJVdGlsLnRvVVJJKG5ld1BhdGgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlTdHJpbmcgdGFza05hbWUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKHRhc2tOYW1lKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLm9wZW5NZXRob2RMaWJyYXJ5KCJ4bWkiLCBsaWJVcmkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQkJCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCQkJCXNoZWxsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQkJCQl9Ci0JCQl9OwotCQkJZGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKLQkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbDsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gZG9uJ3QgZG8gYW55dGhpbmcKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBVUkkgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MYXN0T3BlbmVkTGlicmFyeSgpIHsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gZmlyc3QgY2hlY2sgZm9yIHNhdmVkIGxpYiBpbiBwcmVmZXJlbmNlCi0JCQkvLyBzbyB0aGF0IHdlIGRvbid0IHNob3cgcHJvZ3Jlc3MgbW9uaXRvciBpZiB0aGVyZSdzIG5vIGxpYgotCQkJU3RyaW5nIHNhdmVkTWV0aG9kTGlicmFyeVVSSSA9IExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHNhdmVkTWV0aG9kTGlicmFyeVVSSSk7Ci0JCQlpZiAodXJpLmdldFBhdGgoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRhc2tOYW1lID0gTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5pbmdMaWJyYXJ5VGFza19uYW1lOwotCQkJCQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIDIpOwotCQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5vcGVuTGFzdE9wZW5lZE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwkJCQotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb24ndCBkbyBhbnl0aGluZwotCQl9CQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBsaWJyYXJ5IHBhdGggVVJJLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBVUkkgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MaWJyYXJ5KGZpbmFsIFVSSSB1cmkpIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIG5ldyBGaWxlKHVyaSkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gb3BlbkxpYnJhcnkoWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9UWVBFLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBsaWJyYXJ5IHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIG9wZW5lZCBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJYXJncy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgcGF0aCk7Ci0JCXJldHVybiBvcGVuTGlicmFyeShYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1RZUEUsIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MaWJyYXJ5KGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBhcmdzCi0JCQkJLmdldChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRIKTsKLQotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJZmluYWwgTGlzdDxFeGNlcHRpb24+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8RXhjZXB0aW9uPigpOwotCi0JCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCi0JCS8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtzcGFjZS4KLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCVN0cmluZyB0YXNrTmFtZSA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5vcGVuTWV0aG9kTGlicmFyeSh0eXBlLCBhcmdzKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kTGlicmFyeSgKLQkJCQkJCQlsaWJyYXJ5KTsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChwYXRoKTsKLQotCQkJCQkvLyBTaG93IFByb2JsZW1zIFZpZXcgaWYgbmVjZXNzYXJ5LgotCQkJCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKChJTGlicmFyeVJlc291cmNlU2V0KSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYgKHJlc291cmNlU2V0Lmhhc1VucmVzb2x2ZWRQcm94eSgpKSB7Ci0JCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCVBsYXRmb3JtVUkKLQkJCQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJCQkJCQkJCS5zaG93VmlldygKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCEoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICYmIGUuZ2V0TWVzc2FnZSgpCi0JCQkJCQkJLnN0YXJ0c1dpdGgoIiMjIyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCWVycm9ycy5hZGQoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJaWYgKGVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJSXRlcmF0b3I8RXhjZXB0aW9uPiBpdGVyID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUV4Y2VwdGlvbiBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCQlpZiAobWVzc2FnZS5zdGFydHNXaXRoKCIjIyMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHByb2plY3RGaWxlTmFtZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKDMpOwotCi0JCQkJCQkJU3RyaW5nIHByb21wdCA9IExpYnJhcnlVSVJlc291cmNlcwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5yZWFkT25seVByb2plY3RGaWxlX3RleHQsCi0JCQkJCQkJCQkJCXByb2plY3RGaWxlTmFtZSk7Ci0JCQkJCQkJU3RyaW5nW10gYnV0dG9uTGFiZWxzID0gewotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnJldHJ5QnV0dG9uX3RleHQsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY2FuY2VsQnV0dG9uX3RleHQgfTsKLQkJCQkJCQlNZXNzYWdlRGlhbG9nIG1zZ0JveCA9IG5ldyBNZXNzYWdlRGlhbG9nKERpc3BsYXkKLQkJCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCW51bGwsIHByb21wdCwgTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotCQkJCQkJCQkJYnV0dG9uTGFiZWxzLCAwKTsKLQkJCQkJCQlpZiAobXNnQm94Lm9wZW4oKSA9PSAwKSB7Ci0JCQkJCQkJCXJldHVybiBvcGVuTGlicmFyeShwYXRoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUaHJvd2FibGUgZXggPSBlOwotCQkJCQkJZm9yIChleCA9IGU7IGV4ICE9IG51bGwKLQkJCQkJCQkJJiYgIShleCBpbnN0YW5jZW9mIE1lc3NhZ2VFeGNlcHRpb24pOyBleCA9IGV4Ci0JCQkJCQkJCS5nZXRDYXVzZSgpKQotCQkJCQkJCTsKLQkJCQkJCVN0cmluZyBtc2cgPSBleCAhPSBudWxsICYmIGV4LmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZXgKLQkJCQkJCQkJLmdldE1lc3NhZ2UoKSA6IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQkJbXNnLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVXBncmFkZXMgYSBtZXRob2QgbGlicmFyeSB0byBhIG5ldyBtZXRhLW1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogICAgICAgICAgICBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgZm9sZGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGxpYnJhcnkgaXMgc3VjZXNzZnVsbHkKLQkgKiAgICAgICAgIHVwZ3JhZGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVwZ3JhZGVMaWJyYXJ5KGZpbmFsIFN0cmluZyBsaWJQYXRoLAotCQkJZmluYWwgVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCWlmICghQ29tbWFuZExpbmVSdW5VdGlsLmdldEluc3RhbmNlKCkuaXNOZWVkVG9SdW4oKSAmJiBVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBMaWJyYXJ5KHNoZWxsLCBuZXcgRmlsZShsaWJQYXRoKSk7Ci0JCX0KLQotCQlTdHJpbmcgbGliWG1pID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsICYmIGNhbGxlckluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQlsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5leHBvcnRGaWxlOwotCQl9Ci0JCXJldHVybiB1cGdyYWRlTGlicmFyeShuZXcgRmlsZShsaWJQYXRoLCBsaWJYbWkpLCBjYWxsZXJJbmZvKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXBncmFkZUxpYnJhcnkoZmluYWwgRmlsZSBsaWJGaWxlLAotCQkJZmluYWwgVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlmaW5hbCBTdHJpbmdCdWZmZXIgZXJyTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmaW5hbCBib29sZWFuW10gY2FuY2VsRmxhZ0hvbGRlciA9IHsgZmFsc2UgfTsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZSwKLQkJCQkJCTEwKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQlNYXBwaW5nVXRpbC5taWdyYXRlKGxpYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG1vbml0b3IsCi0JCQkJCQkJY2FsbGVySW5mbyk7Ci0JCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQljYW5jZWxGbGFnSG9sZGVyWzBdID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJCW1zZyA9IExpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeUVycm9yX21zZzsKLQkJCQkJfQotCQkJCQllcnJNc2cuYXBwZW5kKG1zZyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBSdW4gdGhlIG9wZXJhdGlvbiBhbmQgZGlzcGxheSB0aGUgcHJvZ3Jlc3MuCi0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgcG1EaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKERpc3BsYXkKLQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKSB7Ci0JCQkJcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgewotCQkJCQlQb2ludCBjYWxjdWxhdGVkU2l6ZSA9IHN1cGVyLmdldEluaXRpYWxTaXplKCk7Ci0JCQkJCWlmIChjYWxjdWxhdGVkU2l6ZS54IDwgNjc1KSB7Ci0JCQkJCQljYWxjdWxhdGVkU2l6ZS54ID0gNjc1OwotCQkJCQl9Ci0JCQkJCXJldHVybiBjYWxjdWxhdGVkU2l6ZTsKLQkJCQl9Ci0JCQl9OwotCQkJcG1EaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJaWYgKGNhbmNlbEZsYWdIb2xkZXJbMF0pIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKGVyck1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQlwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkgewotCQkJCQkJSVN0YXR1c1tdIHJldCA9IG5ldyBTdGF0dXNbMV07Ci0JCQkJCQlJU3RhdHVzIGNzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJCQllcnJNc2cudG9TdHJpbmcoKSwgbnVsbCk7Ci0JCQkJCQlyZXRbMF0gPSBjczsKLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc011bHRpU3RhdHVzKCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlFcnJvcl9tc2csIHN0YXR1cyk7Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgb25seSBpZiB0aGVyZSBhcmUKLQkgKiBubyBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbW1hbmRMaW5lRGVmYXVsdExpYnJhcnkoU3RyaW5nIGxpYnJhcnlQYXRoKSB7Ci0JCWlmIChsaWJyYXJ5UGF0aCAhPSBudWxsICYmIGxpYnJhcnlQYXRoLmxlbmd0aCgpID4gMCkgewotCQkJSVBhdGggcGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGxpYnJhcnlQYXRoKTsKLQkJCXRyeSB7Ci0JCQkJZGVmYXVsdExpYnJhcnlVUkkgPSBwYXRoLnRvRmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWRlZmF1bHRMaWJyYXJ5VVJJID0gbnVsbDsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgcmVnYXJkbGVzcyBvZiB0aGUKLQkgKiBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbW1hbmRMaW5lTGlicmFyeShTdHJpbmcgbGlicmFyeVBhdGgpIHsKLQkJaWYgKGxpYnJhcnlQYXRoICE9IG51bGwgJiYgbGlicmFyeVBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobGlicmFyeVBhdGgpOwotCQkJdHJ5IHsKLQkJCQlsaWJyYXJ5VVJJID0gcGF0aC50b0ZpbGUoKS50b1VSSSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsaWJyYXJ5VVJJID0gbnVsbDsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQotCSAqIHN5c3RlbSB0b29sYmFyLgotCSAqIDxwPgotCSAqIFRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveCBsaXN0cyBhbGwgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBpbgotCSAqIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKElXb3JrYmVuY2hXaW5kb3cpIHdvcmtiZW5jaAotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ICE9IG51bGwgJiYgd2luZG93IGluc3RhbmNlb2YgQXBwbGljYXRpb25XaW5kb3cpIHsKLQkJCQlJQ29vbEJhck1hbmFnZXIgY29vbEJhck1nciA9ICgoQXBwbGljYXRpb25XaW5kb3cpIHdpbmRvdykKLQkJCQkJCS5nZXRDb29sQmFyTWFuYWdlcigpOwotCQkJCXRyeSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZm91bmRDb25maWdWaWV3KGFjdGl2ZVBhZ2UpCi0JCQkJCQkJCXx8IGZvdW5kUHJvY2Vzc0VkaXRvcihhY3RpdmVQYWdlKQotCQkJCQkJCQl8fCBmb3VuZFBlcnNwZWN0aXZlKGFjdGl2ZVBhZ2UsIFJFUE9SVF9QRVJTX0lEKSkgewotCQkJCQkJCXNob3dDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKGNvb2xCYXJNZ3IpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQloaWRlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbihjb29sQmFyTWdyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSBDb25maWd1cmF0aW9uIHZpZXcgaW4gdGhlIGFjdGl2ZSB3b3JrYmVuY2gKLQkgKiBwYWdlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmb3VuZENvbmZpZ1ZpZXcoSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSkgewotCQlpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY3RpdmVQYWdlLmZpbmRWaWV3KENPTkZJR19WSUVXX0lEKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgUHJvY2VzcyBlZGl0b3IgaW4gdGhlIGFjdGl2ZSB3b3JrYmVuY2guCi0JICogcGFnZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZm91bmRQcm9jZXNzRWRpdG9yKElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UpIHsKLQkJaWYgKGFjdGl2ZVBhZ2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IGFjdGl2ZVBhZ2UuZmluZEVkaXRvcnMobnVsbCwKLQkJCQlQUk9DRVNTX0VESVRPUl9JRCwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSUQpOwotCQlyZXR1cm4gZWRpdG9yUmVmcyAhPSBudWxsICYmIGVkaXRvclJlZnMubGVuZ3RoID4gMDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgUmVwb3J0IFBlcnNwZWN0aXZlIGluIHRoZSBhY3RpdmUgd29ya2JlbmNoCi0JICogcGFnZS4gCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZvdW5kUGVyc3BlY3RpdmUoSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSwgU3RyaW5nIHBlcnNJZCkgewotCQlpZiAoYWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCkuZXF1YWxzKHBlcnNJZCkpIHsJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggaW4gdGhlIHN5c3RlbSB0b29sYmFyLgotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbihJQ29vbEJhck1hbmFnZXIgY29vbEJhck1ncikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyBDaGVjayBmb3IgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IHRvb2xiYXIuCi0JCUlDb250cmlidXRpb25JdGVtIGNvbmZpZ1Rvb2xCYXIgPSBjb29sQmFyTWdyCi0JCQkJLmZpbmQoVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQotCQlpZiAoY29uZmlnVG9vbEJhciAhPSBudWxsKSB7Ci0JCQkvLyBNYWtlIHN1cmUgdGhlIHRvb2xiYXIgaGFzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveAotCQkJLy8gY29udHJpYnV0aW9uLgotCQkJaWYgKGNvbmZpZ1Rvb2xCYXIgaW5zdGFuY2VvZiBUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gKChUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkgY29uZmlnVG9vbEJhcikKLQkJCQkJCS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJCWlmICh0b29sQmFyTWdyICE9IG51bGwpIHsKLQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSB0b29sQmFySXRlbXMgPSB0b29sQmFyTWdyLmdldEl0ZW1zKCk7Ci0JCQkJCWlmICh0b29sQmFySXRlbXMgIT0gbnVsbCAmJiB0b29sQmFySXRlbXMubGVuZ3RoID4gMCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29sQmFySXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQl0b29sQmFySXRlbXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWNvbmZpZ1Rvb2xCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCXVwZGF0ZVN5c3RlbVRvb2xCYXIoY29vbEJhck1ncik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggdG9vbGJhciBoYXMgYmVlbiByZXN0b3JlZAotCQkJCS8vIHZpYSBhIHNhdmVkIHBlcnNwZWN0aXZlLCBhZGQgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JCQkJLy8gY29tYm9ib3ggY29udHJpYnV0aW9uLgotCQkJCWNvbmZpZ0NvbWJvID0gbmV3IENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJbnVsbCk7Ci0JCQkJdG9vbEJhck1nci5hZGQoY29uZmlnQ29tYm8pOwotCQkJCWNvbmZpZ1Rvb2xCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl1cGRhdGVTeXN0ZW1Ub29sQmFyKGNvb2xCYXJNZ3IpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5GTEFUIHwgU1dULkxFRlQpOwotCQljb25maWdDb21ibyA9IG5ldyBDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQludWxsKTsKLQkJdG9vbEJhck1nci5hZGQoY29uZmlnQ29tYm8pOwotCQlUb29sQmFyQ29udHJpYnV0aW9uSXRlbSBjb25maWdDb21ib1Rvb2xCYXIgPSBuZXcgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJdG9vbEJhck1nciwgVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQkJY29vbEJhck1nci5hZGQoY29uZmlnQ29tYm9Ub29sQmFyKTsKLQl9Ci0KLQkvKioKLQkgKiBIaWRlcyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggZnJvbSB0aGUgc3lzdGVtIHRvb2xiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhpZGVDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKElDb29sQmFyTWFuYWdlciBjb29sQmFyTWdyKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIENoZWNrIGZvciB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggdG9vbGJhci4KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29uZmlnVG9vbEJhciA9IGNvb2xCYXJNZ3IKLQkJCQkuZmluZChUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQpOwotCi0JCWlmIChjb25maWdUb29sQmFyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEhpZGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSB0b29sYmFyLgotCQlpZiAoY29uZmlnVG9vbEJhciBpbnN0YW5jZW9mIFRvb2xCYXJDb250cmlidXRpb25JdGVtKSB7Ci0JCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1nciA9ICgoVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0pIGNvbmZpZ1Rvb2xCYXIpCi0JCQkJCS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSB0b29sQmFySXRlbXMgPSB0b29sQmFyTWdyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xCYXJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCXRvb2xCYXJJdGVtc1tpXS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCS8vIEhpZGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IHRvb2xiYXIgY29udHJpYnV0aW9uLgotCQljb25maWdUb29sQmFyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCS8vIFVwZGF0ZSB0aGUgdGhlIHN5c3RlbSB0b29sIGJhci4KLQkJdXBkYXRlU3lzdGVtVG9vbEJhcihjb29sQmFyTWdyKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzeXN0ZW0gdG9vbCBiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbVRvb2xCYXIoSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXJNZ3IpIHsKLQkJaWYgKGNvb2xCYXJNZ3IgaW5zdGFuY2VvZiBDb29sQmFyTWFuYWdlcikgewotCQkJKChDb29sQmFyTWFuYWdlcikgY29vbEJhck1ncikudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHBhcnQgbGlzdGVuZXIgc28gdGhlIGxpYnJhcnkgd2lsbCBvcGVuIHVwb24gInN0YXJ0dXAiCi0JICogInN0YXJ0dXAiIG1lYW5zIHdoZW4gdGhlIHZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIGlzIGZpcnN0Ci0JICogdmlzaWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFZpZXdQYXJ0TGlzdGVuZXIoZmluYWwgU3RyaW5nIGlkKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IChJV29ya2JlbmNoV2luZG93KSB3b3JrYmVuY2gKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdpbmRvdyAhPSBudWxsICYmIHdpbmRvdyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uV2luZG93KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWFjdGl2ZVBhZ2UuYWRkUGFydExpc3RlbmVyKG5ldyBJUGFydExpc3RlbmVyMigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZCgKLQkJCQkJCQkJSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKAotCQkJCQkJCQlJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoCi0JCQkJCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoCi0JCQkJCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRWaXNpYmxlKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCQlpZiAocGFydFJlZi5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLQkJCQkJCQkJYWN0aXZlUGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQkJCQkJCXN0YXJ0dXBPcGVuTGlicmFyeSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQkKLQkKLQkvKioKLQkgKiBPcGVucyB0aGUgbGlicmFyeSB1cG9uIHN0YXJ0dXAKLQkgKiAxLiAgRmlyc3QgdHJpZXMgdG8gb3BlbiB0aGUgbGlicmFyeSBzcGVjaWZpZWQgYnkgLWxpYnJhcnkKLQkgKiAyLiAgVGhlbiB0cmllcyB0byBvcGVuIHRoZSBsYXN0IG9wZW5lZCBsaWJyYXJ5Ci0JICogMy4gIEZpbmFsbHksIHRyaWVzIHRvIG9wZW4gdGhlIGxpYnJhcnkgc3BlY2lmaWVkIGJ5IC1kZWZhdWx0bGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXBPcGVuTGlicmFyeSgpIHsKLQkJaWYgKGxpYnJhcnlJbml0aWFsaXplZCA9PSB0cnVlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbGlicmFyeUluaXRpYWxpemVkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzYXZlZE1ldGhvZExpYnJhcnlVUkkgPSBMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCS5nZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJCWJvb2xlYW4gaGFzU2F2ZWRVcmkgPSBzYXZlZE1ldGhvZExpYnJhcnlVUkkgIT0gbnVsbCAmJiBzYXZlZE1ldGhvZExpYnJhcnlVUkkubGVuZ3RoKCkgPiAwOwotCQkJCi0JCQlTdHJpbmcgbGFzdFNhdmVkQ29uZmlnTmFtZSA9IFByZWZlcmVuY2VVdGlsLmdldFNhdmVkTGFzdENvbmZpZygpOwotCQkJaWYgKGxpYnJhcnlVUkkgIT0gbnVsbCAmJiBvcGVuTGlicmFyeShsaWJyYXJ5VVJJKSkgewotCQkJfSBlbHNlIGlmIChvcGVuTGFzdE9wZW5lZExpYnJhcnkoKSkgewotCQkJfSBlbHNlIGlmIChkZWZhdWx0TGlicmFyeVVSSSAhPSBudWxsICYmICFoYXNTYXZlZFVyaSkgewotCQkJCS8vIFRyeSBsb2FkaW5nIHRoZSBOTCBsaWJyYXJ5IGZpcnN0LgotCQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJCVN0cmluZyBkZWZhdWx0TGlicmFyeVN0ciA9IG5ldyBGaWxlKGRlZmF1bHRMaWJyYXJ5VVJJKQotCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCVN0cmluZyBsb2NhbGl6ZWRMaWJQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSgKLQkJCQkJCUZpbGVVdGlsLnJlbW92ZUFsbFNlcGFyYXRvcihkZWZhdWx0TGlicmFyeVN0ciksCi0JCQkJCQlsb2NhbGUpOwotCQkJCWlmIChsb2NhbGl6ZWRMaWJQYXRoICE9IG51bGwpIHsKLQkJCQkJZGVmYXVsdExpYnJhcnlVUklfTkwgPSBTdHJVdGlsLnRvVVJJKGxvY2FsaXplZExpYlBhdGgpOwotCQkJCX0KLQkJCQlpZiAoZGVmYXVsdExpYnJhcnlVUklfTkwgIT0gbnVsbCAmJiBvcGVuRGVmYXVsdExpYnJhcnkoZGVmYXVsdExpYnJhcnlVUklfTkwpKSB7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3BlbkRlZmF1bHRMaWJyYXJ5KGRlZmF1bHRMaWJyYXJ5VVJJKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIHNhdmVkQ29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgbGFzdFNhdmVkQ29uZmlnTmFtZSk7Ci0JCQkJaWYgKHNhdmVkQ29uZmlnICE9IG51bGwpIHsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihzYXZlZENvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4gbnVsbCBpZiBwYXRoIGlzIG5vdCBvbiBpbnN0YWxsIHBhdGggb3Igbm90IHJlYWQtb25seSBvciBpZiB1c2VyIAotCSAqIGRlY2xpbmVzIHRvIGNvcHkgdGhlIGxpYnJhcnkgdG8gYSB3cml0YWJsZSBsb2NhdGlvbi4gUmV0dXJucwotCSAqIGEgbmV3IHBhdGggaWYgdGhlIHVzZXIgd2lzaGVzIHRvIG9wZW4gdGhlIGxpYnJhcnkgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBoYW5kbGVMaWJyYXJ5T25SZWFkT25seUluc3RhbGxQYXRoKFVSSSBsaWJVUkkpIHsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKLQkJCQotCQkJLy8gZGV0ZXJtaW5lIGlmIHBhdGggaXMgaW4gSW5zdGFsbGF0aW9uIGRpcmVjdG9yeQotCQkJRmlsZSBsaWJQYXRoRmlsZSA9IG5ldyBGaWxlKGxpYlVSSSk7Ci0JCQlpZiAoIWxpYlBhdGhGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlMb2NhdGlvbiBpbnN0YWxsTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKTsKLQkJCVVSTCBpbnN0YWxsTG9jYXRpb25VUkwgPSBpbnN0YWxsTG9jYXRpb24uZ2V0VVJMKCk7Ci0JCQlVUkkgaW5zdGFsbExvY2F0aW9uVVJJID0gbmV3IFVSSShOZXRVdGlsLmVuY29kZUZpbGVVUkwoaW5zdGFsbExvY2F0aW9uVVJMLnRvRXh0ZXJuYWxGb3JtKCkpKTsKLQkJCUZpbGUgaW5zdGFsbExvY0ZpbGUgPSBuZXcgRmlsZShpbnN0YWxsTG9jYXRpb25VUkkpOwotCQkJU3RyaW5nIGNhbm9uaWNhbExpYlBhdGggPSBsaWJQYXRoRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQlTdHJpbmcgY2Fub25pY2FsSW5zdGFsbFBhdGggPSBpbnN0YWxsTG9jRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQlpZiAoIWNhbm9uaWNhbExpYlBhdGguc3RhcnRzV2l0aChjYW5vbmljYWxJbnN0YWxsUGF0aCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gZGV0ZXJtaW5lIGlmIE9TIGlzIG5vdCB2aXN0YSBvciBsaW51eAotCQkJU3RyaW5nIG9zTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGxhdGZvcm1PUyA9IFBsYXRmb3JtLmdldE9TKCk7Ci0JCQlpZiAoKG9zTmFtZS5pbmRleE9mKCJWaXN0YSIpID4gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgcGxhdGZvcm1PUy5lcXVhbHMoUGxhdGZvcm0uT1NfTElOVVgpKSB7Ci0JCQkJcmVhZE9ubHkgPSB0cnVlOwotCQkJfQotCQkJCi0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGliUGF0aEZpbGUsIFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JKTsKLQotCQkJLy8gZG8gbm90IGFsbG93IGEgcmVhZC1vbmx5IGRlZmF1bHQgbGlicmFyeQotCQkJaWYgKCFsaWJQYXRoRmlsZS5jYW5Xcml0ZSgpIHx8ICFsaWJyYXJ5WE1JRmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJcmVhZE9ubHkgPSB0cnVlOwotCQkJfQotCQkJCi0JCQlpZiAoIXJlYWRPbmx5KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIHNob3cgZGlhbG9nLCBhbGxvdyBjb3B5IHRvIG5ldyBwYXRoCi0KLQkJCWZpbmFsIFN0cmluZyBkZWZhdWx0Q29weVBhdGggPSBuZXcgRmlsZShuZXcgRmlsZShMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSkuZ2V0UGFyZW50KCksIGxpYlBhdGhGaWxlLmdldE5hbWUoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBuZXdQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCi0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvcHlMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlVSVJlc291cmNlcy5jb3B5TGlicmFyeURpYWxvZ190ZXh0X3JlYWRPbmx5TGliOwotCQkJCQlDb3B5TGlicmFyeURpYWxvZyBkbGcgPSBuZXcgQ29weUxpYnJhcnlEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsCi0JCQkJCQkJbWVzc2FnZSwgZGVmYXVsdENvcHlQYXRoKTsKLQotCQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCQkJCW5ld1BhdGguYXBwZW5kKGRsZy5nZXRQYXRoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSwgZmFsc2UpOwotCQkJaWYgKG5ld1BhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY29weUxpYnJhcnkobGliUGF0aEZpbGUsIG5ldyBGaWxlKG5ld1BhdGgudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBuZXdQYXRoLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlFeCkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcih1cmlFeCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9FeCkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihpb0V4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEJhY2sgdXAgbGlicmFyeSAKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGRlc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlMaWJyYXJ5KGZpbmFsIEZpbGUgc291cmNlLCBmaW5hbCBGaWxlIGRlc3QpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gZXhjdWRlIHRoZSBub24tbGlicmFyeSBmaWxlcyB0aGF0IG1pZ2h0IGJlIGxvY2tlZCBieSBybWMuCi0JCQkJCS8vIHRoZXNlIGZpbGVzIG1heSBjYXVzZSBiYWNrdXAgdG8gZmFpbCBkdWUgdG8gZmlsZSBsb2NrLgotCQkJCQlTdHJpbmcgZXhjbHVkZXMgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JCQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNvdXJjZSwgZGVzdCwgIioqIiwgZXhjbHVkZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJTGlicmFyeVVJUmVzb3VyY2VzLmNvcHlMaWJyYXJ5VGFza19uYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IE1ldGhvZENvbmZpZ3VyYXRpb24gZHJvcGRvd24gYm94Ci0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIGdldENvbmZpZ0NvbWJvKCkgewotCQlyZXR1cm4gY29uZmlnQ29tYm87Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjZmRiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJyb3dzaW5nTGF5b3V0U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBMaWJyYXJ5VUlQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIHVwZGF0ZSB0aGUgcHVibGlzaGluZy9icm93c2luZyBsYXlvdXQgc2V0dGluZ3MuCi0JICogQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIGV2ZXIgcHVibGlzaGluZy9icm93c2luZyByZWxhdGVkIHByZWZlcmVuY2VzIGFyZSBjaGFuZ2VkLgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTGF5b3V0U2V0dGluZ3MoKSAKLQl7Ci0JCS8vIGdldCB0aGUgc2tpbiBzZXR0aW5nIGZyb20gcHJlZmVyZW5jZQotCQlib29sZWFuIHB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKTsJCi0JCWJvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQlib29sZWFuIHVzZU5ld0V4dGVuZHMgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpOwotCQkKLQkJQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbik7Ci0JCUJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQocHVibGlzaFVub3BlbkFjdGl2aXR5ZGQpOwotCQlCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLnNldFVzZU5ld0V4dGVuZFNlbWFudGljcyh1c2VOZXdFeHRlbmRzKTsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNzQzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIHJlc291cmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3NTAwCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gTGlicmFyeVVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wb3NpdGVSb2xlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50UGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGluZ01ldHJpY190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpdGVyYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENvbnRlbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZExpYnJhcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlsZXN0b25lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVycmlkZUN1cnJlbnRMaWJyYXJ5RXJyb3JfbXNnMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBoYXNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0ZhbWlseV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc1BhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVBc3NldF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhbmRhcmRDYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrRGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVhbVByb2ZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtRGVmaW5pdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGFuY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpdGVyYXRpb25fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlsZXN0b25lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBoYXNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xNZW50b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBsaWNhdGlvbl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmlMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5VHlwZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlQYXRoX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkT25seVByb2plY3RGaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXRyeUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuY2VsQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzd2l0Y2hDb25maWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzd2l0Y2hDb25maWdEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1cnJlbnRDb25maWdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlUGF0aEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrdXBMaWJyYXJ5RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGF0aFNlbGVjdGlvbkVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9rQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBza2lwQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbHdheXNCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ldmVyQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpbmtUb1VSTF9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlua1RvRmlsZV9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudExpbmtfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3Nlc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicmllZkRlc2NyaXB0aW9uTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbl9kZWxldGVjb25maXJtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlFcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcmVhc29uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlMaWJyYXJ5RGlhbG9nX3RleHRfcmVhZE9ubHlMaWI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcnlUYXNrX25hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcnlEaWFsb2dfY29weUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFRDUHJvdmlkZXJfbWV0aG9kQ29udGVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX2NvbnRlbnRQYWNrYWdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX3N0YW5kYXJkQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX2Rpc2NpcGxpbmVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFRDUHJvdmlkZXJfZG9tYWluczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX3dvcmtQcm9kdWN0VHlwZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VENQcm92aWRlcl9yb2xlU2V0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX3Rvb2xzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFRDUHJvdmlkZXJfY3VzdG9tQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX3Byb2Nlc3NlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX2NhcGFiaWxpdHlQYXR0ZXJuczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX2RlbGl2ZXJ5UHJvY2Vzc2VzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTGlicmFyeVVJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NWQ4NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGVwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsOwotCi0vKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byBjYWNoZWQgY29weSBvZiBjb21tb25seSByZWZlcmVuY2VkIHRleHQgaW4gdGhlIGxpYnJhcnkgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJVGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FDVElWSVRZID0gTGlicmFyeVVJUmVzb3VyY2VzLmFjdGl2aXR5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FSVElGQUNUID0gTGlicmFyeVVJUmVzb3VyY2VzLmFydGlmYWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NBUEFCSUxJVFlfUEFUVEVSTiA9IExpYnJhcnlVSVJlc291cmNlcy5jYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS0xJU1QgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tsaXN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NIRUNLX0lURU0gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTVBPU0lURV9ST0xFID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbXBvc2l0ZVJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OQ0VQVCA9IExpYnJhcnlVSVJlc291cmNlcy5jb25jZXB0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTlRFTlRfUEFDS0FHRSA9IExpYnJhcnlVSVJlc291cmNlcy5jb250ZW50UGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVNUT01fQ0FURUdPUlkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUkFCTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUllfUFJPQ0VTUyA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVTQ1JJUFRPUiA9IExpYnJhcnlVSVJlc291cmNlcy5kZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ESVNDSVBMSU5FX0dST1VQSU5HID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ET01BSU4gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZG9tYWluX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRFID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVElOR19NRVRSSUMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGluZ01ldHJpY190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gTGlicmFyeVVJUmVzb3VyY2VzLmVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FWEFNUExFID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREFOQ0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREVMSU5FID0gTGlicmFyeVVJUmVzb3VyY2VzLmd1aWRlbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JVEVSQVRJT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuaXRlcmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9DT05GSUdVUkFUT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfQ09OVEVOVCA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RDb250ZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9MSUJBUkFSWSA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RMaWJyYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9QQUNLQUdFID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BMVUdJTiA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RQbHVnaW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUlMRVNUT05FID0gTGlicmFyeVVJUmVzb3VyY2VzLm1pbGVzdG9uZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9PVVRDT01FID0gTGlicmFyeVVJUmVzb3VyY2VzLm91dGNvbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUEhBU0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucGhhc2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJBQ1RJQ0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJhY3RpY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTUyA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NDb250cmlidXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19GQU1JTFkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0ZhbWlseV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX1BBQ0tBR0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc1BhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVQT1JUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJlcG9ydF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVVTQUJMRV9BU1NFVCA9IExpYnJhcnlVSVJlc291cmNlcy5yZXVzYWJsZUFzc2V0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPQURNQVAgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVEZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEVfU0VUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfR1JPVVBJTkcgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUQU5EQVJEX0NBVEVHT1JZID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0YW5kYXJkQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RFUCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGVwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0sgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UQVNLX0RFU0NSSVBUT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza0Rlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVBTV9QUk9GSUxFID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlYW1Qcm9maWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFTVBMQVRFID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlbXBsYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFUk1fREVGSU5JVElPTiA9IExpYnJhcnlVSVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MID0gTGlicmFyeVVJUmVzb3VyY2VzLnRvb2xfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9NRU5UT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbE1lbnRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XSElURVBBUEVSID0gTGlicmFyeVVJUmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XT1JLX1BST0RVQ1RfRUxFTUVOVCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdEVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX1RZUEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FDVElWSVRZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5hY3Rpdml0eV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQVJUSUZBQ1RfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmFydGlmYWN0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DQVBBQklMSVRZX1BBVFRFUk5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS0xJU1RfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNoZWNrbGlzdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hFQ0tfSVRFTV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tJdGVtX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT01QT1NJVEVfUk9MRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OQ0VQVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29uY2VwdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OVEVOVF9QQUNLQUdFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ1VTVE9NX0NBVEVHT1JZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUkFCTEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSWV9QUk9DRVNTX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RFU0NSSVBUT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfR1JPVVBJTkdfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRE9NQUlOX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5kb21haW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5leGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU5HX01FVFJJQ19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FWEFNUExFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5leGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9HVUlEQU5DRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGFuY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0dVSURFTElORV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGVsaW5lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JVEVSQVRJT05fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLml0ZXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTlRFTlRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9MSUJBUkFSWV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BBQ0tBR0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9QTFVHSU5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUlMRVNUT05FX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5taWxlc3RvbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX09VVENPTUVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm91dGNvbWVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BIQVNFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5waGFzZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJBQ1RJQ0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByYWN0aWNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX0NPTlRSSUJVVElPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19GQU1JTFlfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfUEFDS0FHRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFUE9SVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmVwb3J0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVVTQUJMRV9BU1NFVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9BRE1BUF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9hZG1hcF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEVfU0VUX0dST1VQSU5HX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUQU5EQVJEX0NBVEVHT1JZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVEVQX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGVwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRhc2tfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfREVTQ1JJUFRPUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFQU1fUFJPRklMRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFTVBMQVRFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZW1wbGF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVSTV9ERUZJTklUSU9OX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9NRU5UT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRvb2xNZW50b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dISVRFUEFQRVJfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9FTEVNRU5UX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9UWVBFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3MsIFN0cmluZz4gRUxFTUVOVF9URVhUID0gbmV3IEhhc2hNYXA8Q2xhc3MsIFN0cmluZz4oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzcywgU3RyaW5nPiBFTEVNRU5UX1RFWFRfUExVUkFMID0gbmV3IEhhc2hNYXA8Q2xhc3MsIFN0cmluZz4oKTsKLQotCXN0YXRpYyB7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBURVhUX0FDVElWSVRZKTsKLQkJRUxFTUVOVF9URVhULnB1dChBcnRpZmFjdEltcGwuY2xhc3MsIFRFWFRfQVJUSUZBQ1QpOwotCQlFTEVNRU5UX1RFWFQucHV0KENhcGFiaWxpdHlQYXR0ZXJuSW1wbC5jbGFzcywgVEVYVF9DQVBBQklMSVRZX1BBVFRFUk4pOwotCQlFTEVNRU5UX1RFWFQucHV0KENoZWNrbGlzdEltcGwuY2xhc3MsIFRFWFRfQ0hFQ0tMSVNUKTsKLQkJRUxFTUVOVF9URVhULnB1dChDb21wb3NpdGVSb2xlSW1wbC5jbGFzcywgVEVYVF9DT01QT1NJVEVfUk9MRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ29uY2VwdEltcGwuY2xhc3MsIFRFWFRfQ09OQ0VQVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ29udGVudFBhY2thZ2VJbXBsLmNsYXNzLCBURVhUX0NPTlRFTlRfUEFDS0FHRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ3VzdG9tQ2F0ZWdvcnlJbXBsLmNsYXNzLCBURVhUX0NVU1RPTV9DQVRFR09SWSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJBQkxFKTsKLQkJRUxFTUVOVF9URVhULnB1dChEZWxpdmVyeVByb2Nlc3NJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJZX1BST0NFU1MpOwotCQlFTEVNRU5UX1RFWFQucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBURVhUX0RJU0NJUExJTkUpOwotCQlFTEVNRU5UX1RFWFQKLQkJCQkucHV0KERpc2NpcGxpbmVHcm91cGluZ0ltcGwuY2xhc3MsIFRFWFRfRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRG9tYWluSW1wbC5jbGFzcywgVEVYVF9ET01BSU4pOwotCQlFTEVNRU5UX1RFWFQucHV0KEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJRUxFTUVOVF9URVhULnB1dChFeGFtcGxlSW1wbC5jbGFzcywgVEVYVF9FWEFNUExFKTsKLQkJRUxFTUVOVF9URVhULnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBURVhUX0dVSURFTElORSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoSXRlcmF0aW9uSW1wbC5jbGFzcywgVEVYVF9JVEVSQVRJT04pOwotCQlFTEVNRU5UX1RFWFQucHV0KE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kTGlicmFyeUltcGwuY2xhc3MsIFRFWFRfTUVUSE9EX0xJQkFSQVJZKTsKLQkJRUxFTUVOVF9URVhULnB1dChNZXRob2RQYWNrYWdlSW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfUEFDS0FHRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kUGx1Z2luSW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfUExVR0lOKTsKLQkJRUxFTUVOVF9URVhULnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBURVhUX01JTEVTVE9ORSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoT3V0Y29tZUltcGwuY2xhc3MsIFRFWFRfT1VUQ09NRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUGhhc2VJbXBsLmNsYXNzLCBURVhUX1BIQVNFKTsKLQkJRUxFTUVOVF9URVhULnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFRFWFRfUFJBQ1RJQ0UpOwotCQlFTEVNRU5UX1RFWFQucHV0KFByb2Nlc3NGYW1pbHlJbXBsLmNsYXNzLCBURVhUX1BST0NFU1NfRkFNSUxZKTsKLQkJRUxFTUVOVF9URVhULnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsIFRFWFRfUFJPQ0VTU19QQUNLQUdFKTsKLQkJRUxFTUVOVF9URVhULnB1dChSZXBvcnRJbXBsLmNsYXNzLCBURVhUX1JFUE9SVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsIFRFWFRfUkVVU0FCTEVfQVNTRVQpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvYWRtYXBJbXBsLmNsYXNzLCBURVhUX1JPQURNQVApOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVJbXBsLmNsYXNzLCBURVhUX1JPTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVEZXNjcmlwdG9ySW1wbC5jbGFzcywgVEVYVF9ST0xFX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUKTsKLQkJRUxFTUVOVF9URVhULnB1dChSb2xlU2V0R3JvdXBpbmdJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUX0dST1VQSU5HKTsKLQkJRUxFTUVOVF9URVhULnB1dChTdGVwSW1wbC5jbGFzcywgVEVYVF9TVEVQKTsKLQkJRUxFTUVOVF9URVhUCi0JCQkJLnB1dChTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmNsYXNzLCBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRhc2tJbXBsLmNsYXNzLCBURVhUX1RBU0spOwotCQlFTEVNRU5UX1RFWFQucHV0KFRhc2tEZXNjcmlwdG9ySW1wbC5jbGFzcywgVEVYVF9UQVNLX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRlYW1Qcm9maWxlSW1wbC5jbGFzcywgVEVYVF9URUFNX1BST0ZJTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRlbXBsYXRlSW1wbC5jbGFzcywgVEVYVF9URU1QTEFURSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVybURlZmluaXRpb25JbXBsLmNsYXNzLCBURVhUX1RFUk1fREVGSU5JVElPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFKTsKLQkJRUxFTUVOVF9URVhULnB1dChUb29sSW1wbC5jbGFzcywgVEVYVF9UT09MKTsKLQkJRUxFTUVOVF9URVhULnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVEVYVF9UT09MX01FTlRPUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV2hpdGVwYXBlckltcGwuY2xhc3MsIFRFWFRfV0hJVEVQQVBFUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV29ya1Byb2R1Y3RJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJRUxFTUVOVF9URVhULnB1dChXb3JrUHJvZHVjdFR5cGVJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVF9UWVBFKTsKLQotCQkvLyBwbHVyYWwKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBURVhUX0FDVElWSVRZX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEFydGlmYWN0SW1wbC5jbGFzcywgVEVYVF9BUlRJRkFDVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDYXBhYmlsaXR5UGF0dGVybkltcGwuY2xhc3MsCi0JCQkJVEVYVF9DQVBBQklMSVRZX1BBVFRFUk5fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ2hlY2tsaXN0SW1wbC5jbGFzcywgVEVYVF9DSEVDS0xJU1RfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ29tcG9zaXRlUm9sZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9DT01QT1NJVEVfUk9MRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDb25jZXB0SW1wbC5jbGFzcywgVEVYVF9DT05DRVBUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KENvbnRlbnRQYWNrYWdlSW1wbC5jbGFzcywKLQkJCQlURVhUX0NPTlRFTlRfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDdXN0b21DYXRlZ29yeUltcGwuY2xhc3MsCi0JCQkJVEVYVF9DVVNUT01fQ0FURUdPUllfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJBQkxFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KERlbGl2ZXJ5UHJvY2Vzc0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9ERUxJVkVSWV9QUk9DRVNTX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBURVhUX0RJU0NJUExJTkVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5jbGFzcywKLQkJCQlURVhUX0RJU0NJUExJTkVfR1JPVVBJTkdfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRG9tYWluSW1wbC5jbGFzcywgVEVYVF9ET01BSU5fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5jbGFzcywKLQkJCQlURVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlNfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRXhhbXBsZUltcGwuY2xhc3MsIFRFWFRfRVhBTVBMRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBURVhUX0dVSURFTElORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChJdGVyYXRpb25JbXBsLmNsYXNzLCBURVhUX0lURVJBVElPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RDb25maWd1cmF0aW9uSW1wbC5jbGFzcywKLQkJCQlURVhUX01FVEhPRF9DT05GSUdVUkFUT05fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoTWV0aG9kTGlicmFyeUltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfTElCQVJBUllfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoTWV0aG9kUGFja2FnZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RQbHVnaW5JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX1BMVUdJTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBURVhUX01JTEVTVE9ORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChPdXRjb21lSW1wbC5jbGFzcywgVEVYVF9PVVRDT01FX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFBoYXNlSW1wbC5jbGFzcywgVEVYVF9QSEFTRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFRFWFRfUFJBQ1RJQ0VfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUHJvY2Vzc0ZhbWlseUltcGwuY2xhc3MsCi0JCQkJVEVYVF9QUk9DRVNTX0ZBTUlMWV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9QUk9DRVNTX1BBQ0tBR0VfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUmVwb3J0SW1wbC5jbGFzcywgVEVYVF9SRVBPUlRfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsCi0JCQkJVEVYVF9SRVVTQUJMRV9BU1NFVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSb2FkbWFwSW1wbC5jbGFzcywgVEVYVF9ST0FETUFQX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVJbXBsLmNsYXNzLCBURVhUX1JPTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZURlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfUk9MRV9ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVTZXRHcm91cGluZ0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9ST0xFX1NFVF9HUk9VUElOR19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChTdGVwSW1wbC5jbGFzcywgVEVYVF9TVEVQX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFN1cHBvcnRpbmdNYXRlcmlhbEltcGwuY2xhc3MsCi0JCQkJVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRhc2tJbXBsLmNsYXNzLCBURVhUX1RBU0tfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGFza0Rlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfVEFTS19ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwKLQkJCQkucHV0KFRlYW1Qcm9maWxlSW1wbC5jbGFzcywgVEVYVF9URUFNX1BST0ZJTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRlcm1EZWZpbml0aW9uSW1wbC5jbGFzcywKLQkJCQlURVhUX1RFUk1fREVGSU5JVElPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFWFRfVEVNUExBVEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVG9vbEltcGwuY2xhc3MsIFRFWFRfVE9PTF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVEVYVF9UT09MX01FTlRPUl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChXaGl0ZXBhcGVySW1wbC5jbGFzcywgVEVYVF9XSElURVBBUEVSX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwKLQkJCQkucHV0KFdvcmtQcm9kdWN0SW1wbC5jbGFzcywgVEVYVF9XT1JLX1BST0RVQ1RfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFdvcmtQcm9kdWN0VHlwZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9XT1JLX1BST0RVQ1RfVFlQRV9QTFVSQUwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBwbHVyYWwKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZXR1cm4gdGhlIHBsdXJhbCBmb3JtIG9mIHRoZSBkaXNwbGF5Ci0JICogICAgICAgICAgICBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VUlUZXh0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBwbHVyYWwpIHsKLQkJaWYgKHBsdXJhbCkgewotCQkJU3RyaW5nIGxhYmVsID0gKFN0cmluZykgRUxFTUVOVF9URVhUX1BMVVJBTC5nZXQoZWxlbWVudC5nZXRDbGFzcygpKTsKLQkJCXJldHVybiAobGFiZWwgPT0gbnVsbCkgPyBlbGVtZW50LmdldE5hbWUoKSA6IGxhYmVsOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGxhYmVsID0gKFN0cmluZykgRUxFTUVOVF9URVhULmdldChlbGVtZW50LmdldENsYXNzKCkpOwotCQkJcmV0dXJuIChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVSVRleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRVSVRleHQoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudCBpbiBsb3dlciBjYXNlLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IGFwcGxpZXMgdG8gdGhlIEdlcm1hbiBsYW5ndWFnZSBzaW5jZSBpdCBoYXMgbm8KLQkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIGEgdXBwZXIgY2FzZSBhbmQgbG93ZXIgY2FzZSBub3VuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIHBsdXJhbAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJldHVybiB0aGUgcGx1cmFsIGZvcm0gb2YgdGhlIGRpc3BsYXkKLQkgKiAgICAgICAgICAgIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVSVRleHRMb3dlcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcGx1cmFsKSB7Ci0JCVN0cmluZyBsYWJlbDsKLQkJaWYgKHBsdXJhbCkgewotCQkJbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFRfUExVUkFMLmdldChlbGVtZW50LmdldENsYXNzKCkpOwotCQkJbGFiZWwgPSAobGFiZWwgPT0gbnVsbCkgPyBlbGVtZW50LmdldE5hbWUoKSA6IGxhYmVsOwotCQl9IGVsc2UgewotCQkJbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFQuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlsYWJlbCA9IChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0KLQotCQlyZXR1cm4gU3RyVXRpbC50b0xvd2VyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgbWV0aG9kIGVsZW1lbnQgaW4gbG93ZXIgY2FzZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhcHBsaWVzIHRvIHRoZSBHZXJtYW4gbGFuZ3VhZ2Ugc2luY2UgaXQgaGFzIG5vCi0JICogZGlzdGluY3Rpb24gYmV0d2VlbiBhIHVwcGVyIGNhc2UgYW5kIGxvd2VyIGNhc2Ugbm91bi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dExvd2VyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0VUlUZXh0TG93ZXIoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTRkNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLkVQRlVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5kaWFsb2dzLlJlbmFtZUZpbGVDb25mbGljdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSGVscGVyIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIG1ldGhvZCBsaWJyYXJ5IFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVV0aWwgewotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgYXBwbGljYXRpb24gc2hlbGwgdGl0bGUgdG8gZGlzcGxheSB0aGUgYXBwbGljYXRpb24gbmFtZSBhbmQKLQkgKiB0aGUgZGVmYXVsdCBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVTaGVsbFRpdGxlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJU2hlbGwgc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGxpYlBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJCQlsaWJQYXRoID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQkJCQlpZiAobGliUGF0aCA9PSBudWxsKSB7Ci0JCQkJCQlsaWJQYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJU3RyaW5nIGFwcE5hbWUgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBhcHBUaXRsZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmFwcGxpY2F0aW9uX3RpdGxlLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQlhcHBOYW1lLCBsaWJQYXRoIH0pOwotCQkJCXNoZWxsLnNldFRleHQoYXBwVGl0bGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgYSBkaWFsb2cgdG8gcHJvbXB0cyB0aGUgdXNlciB0byBzYXZlIHRoZSBvcGVuIGxpYnJhcnkgaWYgaXQgaGFzCi0JICogYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPlNXVC5ZRVM8L2NvZGU+LCA8Y29kZT5TV1QuTk88L2NvZGU+IG9yCi0JICogICAgICAgICA8Y29kZT5TV1QuQ0FOQ0VMPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpc3BsYXlTYXZlRGlydHlFZGl0b3JzRGlhbG9nKCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpKSB7Ci0JCQlpbnQgcmV0ID0gTXNnQm94LnByb21wdChMaWJyYXJ5VUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190ZXh0LCBTV1QuWUVTIHwgU1dULk5PCi0JCQkJCQkJfCBTV1QuQ0FOQ0VMKTsKLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIFNXVC5ZRVM6Ci0JCQkJdHJ5IHsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJZGlhbG9nLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RXJyb3JfbXNnLAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gU1dULllFUzsKLQkJCWNhc2UgU1dULk5POgotCQkJCS8vIERpc2NhcmQgYWxsIGNoYW5nZXMgYnkgcmVzZXR0aW5nIGFsbCByZXNvdXJjZXMgYXMgdW5jaGFuZ2VkLgotCQkJCW1hbmFnZXIuZGlzY2FyZE1ldGhvZExpYnJhcnlDaGFuZ2VzKCk7Ci0JCQkJcmV0dXJuIFNXVC5OTzsKLQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQlyZXR1cm4gU1dULkNBTkNFTDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBTV1QuQ0FOQ0VMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZmlsZSBVUkwgZm9yIGFuIGF0dGFjaG1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYXR0YWNobWVudAotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYXR0YWNoCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBNZXRob2RFbGVtZW50IHJlZmVyZW5jaW5nIHRoZSBmaWxlCi0JICogQHBhcmFtIGNvcHlGaWxlCi0JICogICAgICAgICAgICBpZiB0cnVlLCB3aWxsIGNvcHkgdGhlIGZpbGUgKGlmIGl0IGlzbid0IGFscmVhZHkgaW4gdGhlIHBsdWdpbgotCSAqICAgICAgICAgICAgcGF0aCkKLQkgKiBAcmV0dXJuIFVSTCBvZiB0aGUgZm9ybSAuLy4uLyZsdDtyb2xlcyZndDsvcmVzb3VyY2VzLyZsdDtmaWxlbmFtZSBvZgotCSAqICAgICAgICAgYXR0YWNobWVudCZndDsKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJMRm9yQXR0YWNobWVudChTaGVsbCBzaGVsbCwgRmlsZSBhdHRhY2htZW50LAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGNvcHlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcGx1Z2luRGlyID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKG5ldyBGaWxlKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpCi0JCQkJLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSk7Ci0JCUZpbGUgZm9ybWF0RmlsZSA9IG51bGw7Ci0JCVN0cmluZyByZXNvdXJjZUxvYyA9IFJlc291cmNlSGVscGVyLmdldEFic29sdXRlRWxlbWVudFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJLy8gRmlsZSByZXNvdXJjZURpciA9IG5ldyBGaWxlKHJlc291cmNlTG9jKTsKLQkJZm9ybWF0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIGF0dGFjaG1lbnQuZ2V0TmFtZSgpKTsKLQkJaWYgKGNvcHlGaWxlKSB7Ci0JCQlGaWxlIG5ld0ZpbGUgPSBjb3B5UmVzb3VyY2VUb0xpYihzaGVsbCwgYXR0YWNobWVudCwgZWxlbWVudCk7Ci0JCQlpZiAobmV3RmlsZSAhPSBudWxsKSB7Ci0JCQkJZm9ybWF0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgbmV3RmlsZS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB1c2VyIGhpdCBjYW5jZWwKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUlSZXNvdXJjZSB3c1Jlc291cmNlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmb3JtYXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWlmKHdzUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVNYW5hZ2VyLnJlZnJlc2god3NSZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5nZXRSZWxhdGl2ZVBhdGhUb0ZpbGVGcm9tRWxlbWVudChlbGVtZW50LAotCQkJCWZvcm1hdEZpbGUpOwotCi0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gZmlsZSBpbnRvIHRoZSBtZXRob2RFbGVtZW50J3MgcmVzb3VyY2UgZm9sZGVyLgotCSAqIFJlc29sdmVzIGZpbGVuYW1lIGNvbmZsaWN0IGJ5IHByb21wdGluZyB1c2VyIHRvIG92ZXJ3cml0ZSBvciByZW5hbWUKLQkgKiBAcGFyYW0gc2hlbGwgaWYgbnVsbCwgd2lsbCBvdmVyd3JpdGUgZmlsZSB3aXRob3V0IHByb21wdGluZwotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICogQHJldHVybiB0aGUgRmlsZSByZXByZXNlbnRpbmcgdGhlIHVzZXIncyBmaW5hbCBjaG9pY2Ugb2YgbGlicmFyeSByZXNvdXJjZSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvcHlSZXNvdXJjZVRvTGliKFNoZWxsIHNoZWxsLCBGaWxlIHJlc291cmNlLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJU3RyaW5nIHJlc291cmNlTG9jID0gUmVzb3VyY2VIZWxwZXIuZ2V0QWJzb2x1dGVFbGVtZW50UmVzb3VyY2VQYXRoKG1ldGhvZEVsZW1lbnQpOwotCi0JCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jLCByZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQlpZiAocmVzb3VyY2UuZXF1YWxzKGxpYkZpbGUpKSB7Ci0JCQkvLyBzb3VyY2UgZmlsZSBpcyBhbHJlYWR5IGluIHJlc291cmNlcyBkaXIKLQkJCXJldHVybiBsaWJGaWxlOwotCQl9Ci0JCQotCQkvLyBpZiBubyBzaGVsbCwgd2lsbCBqdXN0IG92ZXJ3cml0ZQotCQlpZiAobGliRmlsZS5leGlzdHMoKSAmJiBzaGVsbCAhPSBudWxsKSB7Ci0JCQlSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cgZGlhbG9nID0gbmV3IFJlbmFtZUZpbGVDb25mbGljdERpYWxvZyhzaGVsbCk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZVN0cihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJCUVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZUNvbmZsaWN0X21zZywgCi0JCQkJCQkJCQluZXcgT2JqZWN0W10geyByZXNvdXJjZS5nZXROYW1lKCksIHJlc291cmNlTG9jIH0pKTsKLQkJCWRpYWxvZy5zZXREZXN0aW5hdGlvbihyZXNvdXJjZUxvYyk7Ci0JCQlkaWFsb2cuc2V0RmlsZVBhdGgocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCWxpYkZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZUxvYywgZGlhbG9nLmdldEZpbGVQYXRoKCkpOwotCQkJfQotCQl9Ci0KLQkJRmlsZVV0aWwuY29weUZpbGUocmVzb3VyY2UsIGxpYkZpbGUpOwotCQkKLQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGxpYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlpZih3c1Jlc291cmNlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJRmlsZU1hbmFnZXIucmVmcmVzaCh3c1Jlc291cmNlKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQotCi0JCXJldHVybiBsaWJGaWxlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzOWMwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoU2luZ3VsYXIpCi1hY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1hcnRpZmFjdF90ZXh0PUFydGlmYWN0Ci1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotY2hlY2tsaXN0X3RleHQ9Q2hlY2tsaXN0Ci1jaGVja0l0ZW1fdGV4dD1DaGVjayBJdGVtCi1jb21wb3NpdGVSb2xlX3RleHQ9Q29tcG9zaXRlIFJvbGUKLWNvbmNlcHRfdGV4dD1Db25jZXB0Ci1jb250ZW50UGFja2FnZV90ZXh0PUNvbnRlbnQgUGFja2FnZQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1DdXN0b20gQ2F0ZWdvcnkKLWRlbGl2ZXJhYmxlX3RleHQ9RGVsaXZlcmFibGUKLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLWRlc2NyaXB0b3JfdGV4dD1EZXNjcmlwdG9yCi1kaXNjaXBsaW5lX3RleHQ9RGlzY2lwbGluZQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9RGlzY2lwbGluZSBHcm91cGluZwotZG9tYWluX3RleHQ9RG9tYWluCi1lc3RpbWF0ZV90ZXh0PUVzdGltYXRlCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9RXN0aW1hdGluZyBNZXRyaWMKLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLWV4YW1wbGVfdGV4dD1FeGFtcGxlCi1ndWlkYW5jZV90ZXh0PUd1aWRhbmNlCi1ndWlkZWxpbmVfdGV4dD1HdWlkZWxpbmUKLWl0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PU1ldGhvZCBDb25maWd1cmF0aW9uCi1tZXRob2RDb250ZW50X3RleHQ9TWV0aG9kIENvbnRlbnQKLW1ldGhvZExpYnJhcnlfdGV4dD1NZXRob2QgTGlicmFyeQotbWV0aG9kUGFja2FnZV90ZXh0PU1ldGhvZCBQYWNrYWdlCi1tZXRob2RQbHVnaW5fdGV4dD1NZXRob2QgUGx1Zy1pbgotbWlsZXN0b25lX3RleHQ9TWlsZXN0b25lCi1vdXRjb21lX3RleHQ9T3V0Y29tZQotcGhhc2VfdGV4dD1QaGFzZQotcHJhY3RpY2VfdGV4dD1QcmFjdGljZQotcHJvY2Vzc190ZXh0PVByb2Nlc3MKLXByb2Nlc3NDb250cmlidXRpb25fdGV4dD1EaWZmZXJlbnRpYWwgUHJvY2VzcwotcHJvY2Vzc0ZhbWlseV90ZXh0PVByb2Nlc3MgRmFtaWx5Ci1wcm9jZXNzUGFja2FnZV90ZXh0PVByb2Nlc3MgUGFja2FnZQotcmVwb3J0X3RleHQ9UmVwb3J0Ci1yZXVzYWJsZUFzc2V0X3RleHQ9UmV1c2FibGUgQXNzZXQKLXJvYWRtYXBfdGV4dD1Sb2FkbWFwCi1yb2xlRGVzY3JpcHRvcl90ZXh0PVJvbGUgRGVzY3JpcHRvcgotcm9sZV90ZXh0PVJvbGUKLXJvbGVTZXRfdGV4dD1Sb2xlIFNldAotcm9sZVNldEdyb3VwaW5nX3RleHQ9Um9sZSBTZXQgR3JvdXBpbmcKLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dD1TdGFuZGFyZCBDYXRlZ29yeQotc3RlcF90ZXh0PVN0ZXAKLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWwKLXRhc2tfdGV4dD1UYXNrCi10YXNrRGVzY3JpcHRvcl90ZXh0PVRhc2sgRGVzY3JpcHRvcgotdGVhbVByb2ZpbGVfdGV4dD1UZWFtIFByb2ZpbGUKLXRlbXBsYXRlX3RleHQ9VGVtcGxhdGUKLXRlcm1EZWZpbml0aW9uX3RleHQ9VGVybSBEZWZpbml0aW9uCi10b29sX3RleHQ9VG9vbAotdG9vbE1lbnRvcl90ZXh0PVRvb2wgTWVudG9yCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGVwYXBlcgotd29ya1Byb2R1Y3RfdGV4dD1Xb3JrIFByb2R1Y3QKLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1Xb3JrIFByb2R1Y3QgRWxlbWVudAotd29ya1Byb2R1Y3RUeXBlX3RleHQ9V29yayBQcm9kdWN0IEtpbmQKLQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQotYWN0aXZpdHlfdGV4dF9wbHVyYWw9QWN0aXZpdGllcwotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9QXJ0aWZhY3RzCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbD1DYXBhYmlsaXR5IFBhdHRlcm5zCi1jaGVja2xpc3RfdGV4dF9wbHVyYWw9Q2hlY2tsaXN0cwotY2hlY2tJdGVtX3RleHRfcGx1cmFsPUNoZWNrIEl0ZW1zCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPUNvbXBvc2l0ZSBSb2xlcwotY29uY2VwdF90ZXh0X3BsdXJhbD1Db25jZXB0cwotY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw9Q29udGVudCBQYWNrYWdlcwotY3VzdG9tQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9Q3VzdG9tIENhdGVnb3JpZXMKLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPURlbGl2ZXJhYmxlcwotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPURlbGl2ZXJ5IFByb2Nlc3NlcwotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcmlwdG9ycwotZGlzY2lwbGluZV90ZXh0X3BsdXJhbD1EaXNjaXBsaW5lcwotZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsPURpc2NpcGxpbmUgR3JvdXBpbmdzCi1kb21haW5fdGV4dF9wbHVyYWw9RG9tYWlucwotZXN0aW1hdGVfdGV4dF9wbHVyYWw9RXN0aW1hdGVzCi1lc3RpbWF0aW5nTWV0cmljX3RleHRfcGx1cmFsPUVzdGltYXRpbmcgTWV0cmljcwotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLWV4YW1wbGVfdGV4dF9wbHVyYWw9RXhhbXBsZXMKLWd1aWRhbmNlX3RleHRfcGx1cmFsPUd1aWRhbmNlcwotZ3VpZGVsaW5lX3RleHRfcGx1cmFsPUd1aWRlbGluZXMKLWl0ZXJhdGlvbl90ZXh0X3BsdXJhbD1JdGVyYXRpb25zCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPU1ldGhvZCBDb25maWd1cmF0aW9ucwotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1NZXRob2QgQ29udGVudHMKLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9TWV0aG9kIExpYnJhcmllcwotbWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbD1NZXRob2QgUGFja2FnZXMKLW1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbD1NZXRob2QgUGx1Zy1pbnMKLW1pbGVzdG9uZV90ZXh0X3BsdXJhbD1NaWxlc3RvbmVzCi1vdXRjb21lX3RleHRfcGx1cmFsPU91dGNvbWVzCi1waGFzZV90ZXh0X3BsdXJhbD1QaGFzZXMKLXByYWN0aWNlX3RleHRfcGx1cmFsPVByYWN0aWNlcwotcHJvY2Vzc190ZXh0X3BsdXJhbD1Qcm9jZXNzZXMKLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9RGlmZmVyZW50aWFsIFByb2Nlc3NlcwotcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbD1Qcm9jZXNzIEZhbWlsaWVzCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1Qcm9jZXNzIFBhY2thZ2VzCi1yZXBvcnRfdGV4dF9wbHVyYWw9UmVwb3J0cwotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1SZXVzYWJsZSBBc3NldHMKLXJvYWRtYXBfdGV4dF9wbHVyYWw9Um9hZG1hcHMKLXJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVJvbGUgRGVzY3JpcHRvcnMKLXJvbGVfdGV4dF9wbHVyYWw9Um9sZXMKLXJvbGVTZXRfdGV4dF9wbHVyYWw9Um9sZSBTZXRzCi1yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw9Um9sZSBTZXQgR3JvdXBpbmdzCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPVN0YW5kYXJkIENhdGVnb3JpZXMKLXN0ZXBfdGV4dF9wbHVyYWw9U3RlcHMKLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbD1TdXBwb3J0aW5nIE1hdGVyaWFscwotdGFza190ZXh0X3BsdXJhbD1UYXNrcwotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9VGFzayBEZXNjcmlwdG9ycwotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9VGVhbSBQcm9maWxlcwotdGVtcGxhdGVfdGV4dF9wbHVyYWw9VGVtcGxhdGVzCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1UZXJtIERlZmluaXRpb25zCi10b29sX3RleHRfcGx1cmFsPVRvb2xzCi10b29sTWVudG9yX3RleHRfcGx1cmFsPVRvb2wgTWVudG9ycwotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1XaGl0ZXBhcGVycwotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9V29yayBQcm9kdWN0cwotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycwotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPVdvcmsgUHJvZHVjdCBFbGVtZW50cwotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPVdvcmsgUHJvZHVjdCBLaW5kcwotCi0jIEFwcGxpY2F0aW9uIHRpdGxlLgotYXBwbGljYXRpb25fdGl0bGU9ezB9IC0gezF9Ci0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBXaXphcmQKLW9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlPU9wZW4gTWV0aG9kIExpYnJhcnkKLW9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGU9U3BlY2lmeSBhIHBhdGggY29udGFpbmluZyBhIG1ldGhvZCBsaWJyYXJ5Ci1vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlXzI9U2VsZWN0IGEgbWV0aG9kIGxpYnJhcnkKLW9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGV4dD17MH0gc3RvcmVzIG1ldGhvZHMgYW5kIHByb2Nlc3NlcyBpbiBhIGZvbGRlciBjYWxsZWQgXG5hIG1ldGhvZCBsaWJyYXJ5LiBTZWxlY3QgYSBtZXRob2QgbGlicmFyeSBmb2xkZXIgdG8gdXNlIGZvciB0aGlzIHNlc3Npb24uCi1wYXRoTGFiZWxfdGV4dD1QYXRoOgotbmFtZUxhYmVsX3RleHQ9TmFtZToKLXVyaUxhYmVsX3RleHQ9VVJJOgotb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94X3RleHQ9T3BlbiBhIG1ldGhvZCBsaWJyYXJ5IHRoYXQgaXMgbm90IGxpc3RlZCBhYm92ZQotbGlicmFyeVR5cGVMYWJlbF90ZXh0PVR5cGU6Ci1saWJyYXJ5TGFiZWxfdGV4dD1MaWJyYXJ5OgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1Vc2UgdGhpcyBhcyB0aGUgZGVmYXVsdCBhbmQgZG8gbm90IGFzayBhZ2Fpbi4KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1ObyBtZXRob2QgbGlicmFyeSBleGlzdHMgYXQgJyd7MH0nJy5cbkEgbmV3IG1ldGhvZCBsaWJyYXJ5IHdpbGwgYmUgY3JlYXRlZCBhbmQgb3BlbmVkIGZvciB5b3UgYXQgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuXG5cbkNsaWNrIE9LIHRvIHByb2NlZWQgb3IgQ2FuY2VsIHRvIHNwZWNpZnkgYW5vdGhlciBtZXRob2QgbGlicmFyeSBwYXRoLgotCi0jIFNlbGVjdCBNZXRob2QgTGlicmFyeSBGb2xkZXIgRGlhbG9nCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVNlbGVjdCBNZXRob2QgTGlicmFyeQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5IGZvbGRlci4KLQotIyBPcGVuIExpYnJhcnkgUHJvZ3Jlc3MgTWVzc2FnZQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9T3BlbmluZyBtZXRob2QgbGlicmFyeS4uLgotCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUU6IFVuYWJsZSB0byBjcmVhdGUgdGhlIG1ldGhvZCBsaWJyYXJ5Lgotb3BlbkxpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uPUFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC4KLW9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMT1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IHBhdGggJyd7MH0nJyBpcyBpbnZhbGlkLgotb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24yPUEgbWV0aG9kIGxpYnJhcnkgYWxyZWFkeSBleGlzdHMgaW4gJyd7MH0nJy4KLW9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMz1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciAnJ3swfScnIGNhbm5vdCBiZSBjcmVhdGVkLgotb3BlbkxpYnJhcnlFcnJvcl9yZWFzb240PVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgZm9sZGVyIGlzIGEgcGx1Zy1pbiBvciBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gZXhwb3J0IGZvbGRlci4KLW9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlPVNlbGVjdCBPSyB0byBzcGVjaWZ5IGFub3RoZXIgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAyRTogVW5hYmxlIHRvIG9wZW4gdGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeS4KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249VGhlIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciBpcyBpbnZhbGlkLCBkb2VzIG5vdCBleGlzdCwgb3IgeW91IGRvIG5vdCBoYXZlIHRoZSBwcm9wZXIgcGVybWlzc2lvbiB0byBhY2Nlc3MgaXQuXG5cbkNsaWNrIE9LIHRvIHNlbGVjdCBhbm90aGVyIGxpYnJhcnkgZm9sZGVyLgotCi0jIFJlYWQtb25seSBQcm9qZWN0IEZpbGUgRXJyb3IgRGlhbG9nCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDRFOiAnJ3swfScnIGlzIHJlYWQtb25seS4gTWFrZSBpdCB3cml0YWJsZSBiZWZvcmUgY29udGludWluZy4KLXJldHJ5QnV0dG9uX3RleHQ9UmV0cnkKLWNhbmNlbEJ1dHRvbl90ZXh0PUNhbmNlbAotCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dD1JVVBMMzA1RTogVGhlIHNlbGVjdGVkIGxpYnJhcnkgY2Fubm90IGJlIG9wZW5lZC4gWW91IG11c3QgdXBncmFkZSB7MH0gdG8gdmVyc2lvbiB7MX0gb3IgaGlnaGVyIGluIG9yZGVyIHRvIG9wZW4gdGhpcyBsaWJyYXJ5LgotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RTogVGhlIHNlbGVjdGVkIGxpYnJhcnkgY2Fubm90IGJlIG9wZW5lZC4gWW91IG11c3QgdXBncmFkZSB7MH0gdG8gYSBoaWdoZXIgdmVyc2lvbiBpbiBvcmRlciB0byBvcGVuIHRoaXMgbGlicmFyeS4KLQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZwotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9VXBncmFkZSBNZXRob2QgTGlicmFyeQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1UaGUgbGlicmFyeSB5b3UgaGF2ZSBzZWxlY3RlZCBuZWVkcyB0byBiZSB1cGdyYWRlZCB0byB0aGUgbmV3IGxpYnJhcnkgc3RydWN0dXJlLlxuXG5EbyB5b3Ugd2FudCB0byBwcm9jZWVkIHdpdGggdGhlIHVwZ3JhZGU/Ci11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVVwZ3JhZGluZyBtZXRob2QgbGlicmFyeS4uLgotCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cKLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzA2RTogRmFpbGVkIHRvIHVwZ3JhZGUgdGhlIG1ldGhvZCBsaWJyYXJ5LiBQbGVhc2Ugc2VlIHRoZSBsb2cgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZwotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPVN3aXRjaCBDb25maWd1cmF0aW9uCi1zd2l0Y2hDb25maWdEaWFsb2dfdGV4dD1EbyB5b3Ugd2FudCB0byBzd2l0Y2ggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCAnJ3swfScnLCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIHByb2Nlc3M/Ci0JCi0jIENvbmZpZ3VyYXRpb24gQ29tYm8KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PUN1cnJlbnQgY29uZmlndXJhdGlvbjoKLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9U2VsZWN0IGEgY29uZmlndXJhdGlvbgotCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQotZGVsZXRlRmlsZXNDb25maXJtYXRpb25fbXNnPVRoZSBzcGVjaWZpZWQgcGF0aCAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBBbGwgZmlsZXMgaW4gdGhlIGZvbGRlciB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci0KLSMgUGF0aHMvRmlsZXMgRXJyb3IgTWVzc2FnZXMKLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVRoZSBwYXRoICcnezB9JycgY29udGFpbnMgb25lIG9yIG1vcmUgZmlsZXMgdGhhdCBjYW5ub3QgYmUgZGVsZXRlZC5cblxuU2VsZWN0IGFub3RoZXIgcGF0aCBhbmQgdHJ5IGFnYWluLgotY3JlYXRlUGF0aEVycm9yX3JlYXNvbj1VbmFibGUgdG8gY3JlYXRlIHBhdGggJyd7MH0nJy5cblxuU2VsZWN0IGFub3RoZXIgcGF0aCBhbmQgdHJ5IGFnYWluLgotaW52YWxpZFBhdGhfbXNnPVRoZSBzcGVjaWZpZWQgcGF0aCBpcyBub3QgdmFsaWQuCi1vdmVycmlkZUN1cnJlbnRMaWJyYXJ5RXJyb3JfbXNnMD1Zb3UgY2Fubm90IGV4cG9ydCB0byBhIHBhdGggY29udGFpbmluZyBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgcGF0aCBhbmQgdHJ5IGFnYWluLgotCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZwotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1CYWNrdXAgTGlicmFyeQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PUl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91IGJhY2sgdXAgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgYmVmb3JlIHByb2NlZWRpbmcuXG5cbkNsaWNrIE9LIHRvIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIHRoZSBsaWJyYXJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiBDbGljayBTa2lwIHRvIGNvbnRpbnVlIHdpdGhvdXQgY3JlYXRpbmcgdGhlIGJhY2t1cC4KLWJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU9QmFja2luZyB1cCBsaWJyYXJ5IGZpbGVzIC4uLgotCi0jIENvcHkgTGlicmFyeSBEaWFsb2cKLWNvcHlMaWJyYXJ5RGlhbG9nX3RpdGxlPUNvcHkgTGlicmFyeQotY29weUxpYnJhcnlEaWFsb2dfdGV4dF9yZWFkT25seUxpYj1UaGUgbGlicmFyeSBpcyBub3Qgd3JpdGFibGUuIENsaWNrIENvcHkgdG8gY3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgbGlicmFyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4gQ2xpY2sgU2tpcCB0byBjb250aW51ZSB3aXRob3V0IGNyZWF0aW5nIHRoZSBjb3B5LgotY29weUxpYnJhcnlUYXNrX25hbWU9TWFraW5nIGEgY29weSBvZiB0aGUgbGlicmFyeSBmaWxlcyAuLi4KLWNvcHlMaWJyYXJ5RGlhbG9nX2NvcHlCdXR0b25fdGV4dD1Db3B5Ci0KLSMgUGF0aCBTZWxlY3Rpb24gRGlhbG9nCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPVVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5Ci1va0J1dHRvbl90ZXh0PU9LCi1za2lwQnV0dG9uX3RleHQ9U2tpcAotCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzCi1hbHdheXNCdXR0b25fdGV4dD1BbHdheXMKLW5ldmVyQnV0dG9uX3RleHQ9TmV2ZXIKLXByb21wdEJ1dHRvbl90ZXh0PVByb21wdAotCi0jIEFkZCBMaW5rIERpYWxvZwotbGlua1RvVVJMX25hbWU9VVJMCi1saW5rVG9GaWxlX25hbWU9RmlsZQotZWxlbWVudExpbmtfbmFtZT1NZXRob2QgZWxlbWVudAotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPU1ldGhvZCBlbGVtZW50IHdpdGggdHlwZSBwcmVmaXgKLWVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU9TWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dAotCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cKLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZT1Db252ZXJ0IEFjdGl2aXR5IFR5cGUKLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNlbGVjdCB0aGUgdGFyZ2V0IGFjdGl2aXR5IHR5cGUuCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDdFOiBUaGlzIGFjdGl2aXR5IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlciB0eXBlLgotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPVRoZXJlIGlzIG5vIGNvbXBhdGlibGUgYWN0aXZpdHkgdHlwZSBmb3IgezB9LgotCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgcHJvY2Vzcwotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyB0byBleHBvcnQuCi1wcm9jZXNzZXNMYWJlbF90ZXh0PVByb2Nlc3NlczoKLWJyaWVmRGVzY3JpcHRpb25MYWJlbF90ZXh0PUJyaWVmIGRlc2NyaXB0aW9uOgotCi0jIEV4cG9ydCBQcm9jZXNzIFdpemFyZCBFcnJvciBNZXNzYWdlLgotbm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnPUlVUEwwMzA4RTogTm8gbWV0aG9kIGxpYnJhcnkgaXMgY3VycmVudGx5IG9wZW5lZC4gQ2xpY2sgQ2FuY2VsLCBvcGVuIGEgbWV0aG9kIGxpYnJhcnkgb3IgY3JlYXRlIGEgbmV3IG9uZSwgYW5kIHJ1biB0aGlzIHdpemFyZCBhZ2Fpbi4gCi0KLSMgTW92ZWQgZnJvbSBBdXRob3JpbmcgVUkgcGx1Zy1pbiB0byBhdm9pZCBBdXRob3JpbmcgVUkgZGVwZW5kZW5jeQotZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybSBEZWxldGlvbgotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz9cblxuVGhlIGZvbGxvd2luZyBlbGVtZW50KHMpIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgaXRlbShzKSB0byBiZSBkZWxldGVkOiB7MX0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ9VGhpcyB3aWxsIHNhdmUgdGhlIGN1cnJlbnQgZWRpdG9yIGFuZCB0aGUgY2hhbmdlIHdpbGwgYmUgcGVybWFuZW50LiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci0KLSMgU2F2ZSBNZXRob2QgTGlicmFyeSBEaWFsb2cKLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVNhdmUgTWV0aG9kIExpYnJhcnkKLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9VGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gbW9kaWZpZWQuIERvIHlvdSB3YW50IHRvIHNhdmUgdGhlIGNoYW5nZXM/Ci0KLSMgU2F2ZSBNZXRob2QgTGlicmFyeSBFcnJvciBNZXNzYWdlcwotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDhFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIHNhdmVkLgotZXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotIyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlciBTdHJpbmdzCi1lbGVtZW50VENQcm92aWRlcl9tZXRob2RDb250ZW50PU1ldGhvZCBDb250ZW50Ci1lbGVtZW50VENQcm92aWRlcl9jb250ZW50UGFja2FnZXM9Q29udGVudCBQYWNrYWdlcwotZWxlbWVudFRDUHJvdmlkZXJfc3RhbmRhcmRDYXRlZ29yaWVzPVN0YW5kYXJkIENhdGVnb3JpZXMKLWVsZW1lbnRUQ1Byb3ZpZGVyX2Rpc2NpcGxpbmVzPURpc2NpcGxpbmVzCi1lbGVtZW50VENQcm92aWRlcl9kb21haW5zPURvbWFpbnMKLWVsZW1lbnRUQ1Byb3ZpZGVyX3dvcmtQcm9kdWN0VHlwZXM9V29yayBQcm9kdWN0IFR5cGVzCi1lbGVtZW50VENQcm92aWRlcl9yb2xlU2V0cz1Sb2xlIFNldHMKLWVsZW1lbnRUQ1Byb3ZpZGVyX3Rvb2xzPVRvb2xzCi1lbGVtZW50VENQcm92aWRlcl9jdXN0b21DYXRlZ29yaWVzPUN1c3RvbSBDYXRlZ29yaWVzCi1lbGVtZW50VENQcm92aWRlcl9wcm9jZXNzZXM9UHJvY2Vzc2VzCi1lbGVtZW50VENQcm92aWRlcl9jYXBhYmlsaXR5UGF0dGVybnM9Q2FwYWJpbGl0eSBQYXR0ZXJucwotZWxlbWVudFRDUHJvdmlkZXJfZGVsaXZlcnlQcm9jZXNzZXM9RGVsaXZlcnkgUHJvY2Vzc2VzCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFhZjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogQ29udHJpYnV0ZXMgYSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib3hib3ggdG8gdGhlIHN5c3RlbSB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBjb25maWdDb21ibzsKLQotCXByaXZhdGUgc3RhdGljIENvbWJvVmlld2VyIGNvbmZpZ0NvbWJvVmlld2VyOwotCi0JcHJvdGVjdGVkIFRvb2xJdGVtIGl0ZW07Ci0KLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0KLQlwcm90ZWN0ZWQgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXI7Ci0KLQkvLyBUaGUgY29udGVudCBwcm92aWRlci4KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JLy8gVGhlIGxhYmVsIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCXBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oSUFjdGlvbiBhY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlpdGVtLnNldENvbnRyb2woYm94KTsKLQkJaXRlbS5zZXRXaWR0aCgyNDApOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb29sQmFyIGNvb2xCYXIsIGludCBpbmRleCkgewotCQlDb250cm9sIGJveCA9IGNyZWF0ZUNvbnRyb2woY29vbEJhcik7Ci0KLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04sIGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBiYWNrIHJlZmVyZW5jZS4KLQkJY29vbEl0ZW0uc2V0RGF0YSh0aGlzKTsKLQotCQkvLyBBZGQgdGhlIHRvb2xiYXIgdG8gdGhlIENvb2xJdGVtIHdpZGdldC4KLQkJY29vbEl0ZW0uc2V0Q29udHJvbChib3gpOwotCi0JCS8vIElmIHRoZSB0b29sYmFyIGl0ZW0gZXhpc3RzIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb29sIGl0ZW0uCi0JCVBvaW50IHRvb2xCYXJTaXplID0gYm94LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJLy8gU2V0IHRoZSBwcmVmZXJyZWQgc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdG9vbGJhciBwbHVzIHRyaW0uCi0JCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFNpemUodG9vbEJhclNpemUpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb25maWdDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29uZmlnQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgxMCk7Ci0JCWNvbmZpZ0NvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbmZpZ0NvbWJvKTsKLQotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0PE9iamVjdD4gY29uZmlnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQljb25maWdzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSkpOwotCQkJCUNvbGxlY3Rpb25zLnNvcnQoY29uZmlnc0xpc3QsIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0JCQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpID09IG51bGwpIHsKLQkJCQkJY29uZmlnc0xpc3QuYWRkKDAsCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gY29uZmlnc0xpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlyZXR1cm4gKFN0cmluZykgb2JqZWN0OwotCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCQkJfQotCQl9OwotCi0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCVN0cmluZyBzYXZlZENvbmZpZ05hbWUgPSBQcmVmZXJlbmNlVXRpbC5nZXRTYXZlZExhc3RDb25maWcoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBzYXZlZENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBzYXZlZENvbmZpZ05hbWUpOwotCQkKLQkJaWYgKHNhdmVkQ29uZmlnICE9IG51bGwpIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyCi0JCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2F2ZWRDb25maWcpKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpKTsKLQkJfQotCi0JCWNvbmZpZ0NvbWJvVmlld2VyCi0JCQkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQotCQljb25maWdDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCQkJZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQotCQlsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJdHJ5IHsKLQkJCQkJc2VsZWN0Q29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJY29uZmlnQ29tYm9WaWV3ZXIKLQkJCQkJLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJfQotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KG51bGwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQlzZWxlY3RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KGxpYnJhcnkpOwotCQkJCXJlZnJlc2goKTsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsJCQkJCQotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCWNvbmZpZyAhPSBudWxsID8gY29uZmlnIDogTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpLCB0cnVlKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJaWYgKGxpYnJhcnkgIT0gY29uZmlnQ29tYm9WaWV3ZXIuZ2V0SW5wdXQoKSkgewotCQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQkJcmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlpZiAobGlicmFyeSAhPSBjb25maWdDb21ib1ZpZXdlci5nZXRJbnB1dCgpKSB7Ci0JCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KGxpYnJhcnkpOwotCQkJCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQkJCQlzZWxlY3RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCXJldHVybiBjb25maWdDb21ibzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jdm9pZCBzZXRWaXNpYmlsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJfSBlbHNlIHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRTZWxlY3RlZENvbmZpZygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdDb21ib1ZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50bHkgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDdXJyZW50U2VsZWN0ZWRDb25maWdOYW1lKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0NvbWJvVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuICgoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiAoU3RyaW5nKSBvYmplY3Q7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRTZWxlY3RlZENvbmZpZygpOwotCQkJaWYgKGNvbmZpZyAhPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJfQotCQkJUHJlZmVyZW5jZVV0aWwuc2F2ZVNlbGVjdGVkQ29uZmlnSW50b1BlcnNpc3RlbmNlKGdldEN1cnJlbnRTZWxlY3RlZENvbmZpZ05hbWUoKSk7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxpYlN2Y0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlpZiAoY29uZmlnQ29tYm9WaWV3ZXIgIT0gbnVsbCkgewotCQkJY29uZmlnQ29tYm9WaWV3ZXIKLQkJCS5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb25maWd1cmF0aW9uIGNvbWJvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKCkgewotCQljb25maWdDb21ib1ZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgY29uZmlndXJhdGlvbiBpbiBjb25maWd1cmF0aW9uIGNvbWJvIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZWxlY3RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vTmFtZUNhY2hlLmdldEluc3RhbmNlKCkuY2xlYXIoKTsKLQkJaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZyA9PSBnZXRTZWxlY3RlZENvbmZpZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29uZmlnKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBQZXJmb3JtIGEgcmVmcmVzaCB0byBhZGQgdGhlICJTZWxlY3QgYSBjb25maWd1cmF0aW9uIgotCQkJLy8gc3RyaW5nIHRvIHRoZSBjb21iby4KLQkJCXJlZnJlc2goKTsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWNvbmZpZ0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9JTGlicmFyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAzN2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBMaWJyYXJ5IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUFjdGlvbiBleHRlbmRzIElBY3Rpb24gewotLy8Jdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0vLwkJCU9iamVjdCBuZXdWYWx1ZSk7Ci0JCi0Jdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0xpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWY4ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBSdW5zIG9wZXJhdGlvbiB0aGF0IGxvY2tzIHRoZSBsaWJyYXJ5IGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4ZWN1dGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIGltcGxlbWVudHMgSVJ1bm5hYmxlQ29udGV4dCB7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCQotCXB1YmxpYyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpIHsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBkb1J1bihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIGJvb2xlYW4gd29ya1Vua25vd24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uW10gaXRlSG9sZGVyID0gbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb25bMV07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJV29ya3NwYWNlUnVubmFibGUgd29ya3NwYWNlUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih3b3JrVW5rbm93bikgewotICAgICAgICAJCQkJCXBtLmJlZ2luVGFzaygiIiwgMik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQkJCQlwbS53b3JrZWQoMSk7Ci0gICAgICAgIAkJCQkJdHJ5IHsKLSAgICAgICAgCQkJCQkJcnVubmFibGUucnVuKHBtKTsKLSAgICAgICAgCQkJCQkJcG0ud29ya2VkKDIpOwotICAgICAgICAJCQkJCX0KLSAgICAgICAgCQkJCQlmaW5hbGx5IHsKLSAgICAgICAgCQkJCQkJcG0uZG9uZSgpOwotICAgICAgICAJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgCXJ1bm5hYmxlLnJ1bihwbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpdCBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UgcnVubmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZUhvbGRlclswXSA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlLXRocm93IGFzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCB3aGljaCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXVnaHQgYW5kIHJlLXRocm93biBhcyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBiZWxvdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ29yZUV4Y2VwdGlvbiBhbmQgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gYXJlIHByb3BhZ2F0ZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwKLSAgICAgICAgICAgIAkJbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpLAotICAgICAgICAgICAgCQlJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlLXRocm93IHRoZSBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBpZiBhbnkgb2NjdXJyZWQKLSAgICAgICAgaWYgKGl0ZUhvbGRlclswXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBpdGVIb2xkZXJbMF07Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dCNydW4oYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlkb1J1bihydW5uYWJsZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHsKLQkJdHJ5IHsKLQkJCWRvUnVuKHJ1bm5hYmxlLCB0cnVlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0JCQlpZihjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbiljYXVzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKGNhdXNlID09IG51bGwpIHsKLQkJCQkJY2F1c2UgPSBlOwotCQkJCX0KLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNhdXNlKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbXNnID0gY2F1c2UuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBjYXVzZS5nZXRNZXNzYWdlKCkgOiBjYXVzZS50b1N0cmluZygpOyAKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoTGlicmFyeVVJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2csIGNhdXNlKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzTW9uaXRvciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg3ZjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL01ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKiBBY3Rpb24gdG8gZGVsZXRlIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIGV4dGVuZHMgRGVsZXRlQWN0aW9uIGltcGxlbWVudHMgSUxpYnJhcnlBY3Rpb24gewotCXByb3RlY3RlZCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtID0gdHJ1ZTsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0KLQkvKioKLQkgKiBEZWxldGVzIG1ldGhvZCBlbGVtZW50Ci0JICoKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlzdXBlcihkb21haW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBjb25maXJtCi0JICogICAgICAgICAgICBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHVzZXIgY29uZmlybWF0aW9uIGlzIHJlcXVpcmVkLiBJZgotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBleGVjdXRpbmcgdGhpcyBjb21tYW5kIHdpbGwgbm90Ci0JICogICAgICAgICAgICBpbnRlcmFjdCB3aXRoIHVzZXIgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgYXBwbHkuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oRWRpdGluZ0RvbWFpbiBkb21haW4sIGJvb2xlYW4gY29uZmlybSkgewotCQl0aGlzKGRvbWFpbik7Ci0JCXRoaXMuY29uZmlybSA9IGNvbmZpcm07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpOwotCQljbWQKLQkJCQkuYWRkQ29tbWFuZExpc3RlbmVyKG5ldyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5Db21tYW5kTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpIHsKLQkJCQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgZXZlbnRPYmplY3QKLQkJCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQkJZGlkRGVsZXRlKGNtZC5nZXRSZXN1bHQoKSk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBub3RpZnlGYWlsdXJlKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KSB7Ci0JCQkJCQlkZWxldGVGYWlsZWQoKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGNvbW1hbmQgdG8gZGVsZXRlIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBjb21tYW5kCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKSwKLQkJCQlzZWxlY3Rpb24sIGNvbmZpcm0pIHsKLQkJCXByb3RlY3RlZCB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywKLQkJCQkJU2V0IGRlbGV0ZWRHVUlEcykgewotCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCXJlc291cmNlU2V0Ci0JCQkJCQkubG9hZE9wcG9zaXRlRmVhdHVyZXMob3Bwb3NpdGVGZWF0dXJlcywgZGVsZXRlZEdVSURzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaWREZWxldGUoQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMpIHsKLQotCX0KLQotCS8qKgotCSAqIEdldCBjb25maXJtYXRpb24gbWVzc2FnZSB0byBkZWxldGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWxldGVDb25maXJtYXRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUmVzb3VyY2VzLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtRGVsZXRlKCkgewotCQlpZiAoIWNvbmZpcm0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGkgPSAwOwotCQlTdHJpbmdCdWZmZXIgZWxlbWVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdC5uZXh0KCkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJZWxlbWVudFN0ci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxlbWVudFN0ci5hcHBlbmQoZ2V0RGlzcGxheVN0cmluZygoTWV0aG9kRWxlbWVudClvYmopKTsKLQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnRTdHIudG9TdHJpbmcoKSB9OwotCQlTdHJpbmcgbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLmJpbmQoTGlicmFyeVVJUmVzb3VyY2VzLmNvbmZpcm1EZWxldGVEaWFsb2dfbXNnLCBhcmdzKTsgLy8gTk9OLU5MUy0xJAotCi0JCVN0cmluZyB0aXRsZSA9IExpYnJhcnlVSVJlc291cmNlcy5jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlOyAKLQkJYm9vbGVhbiBkZWxldGVPayA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbXNnKTsKLQkJcmV0dXJuIGRlbGV0ZU9rOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZyhNZXRob2RFbGVtZW50IGVsZW1lbnQpewotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5zZXRQcm9ncmVzc01vbml0b3IoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBkZWxldGUKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCXN1cGVyLnJ1bigpOwkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9PcGVuTGlicmFyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE3NTU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgT3BlbiBMaWJyYXJ5IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeUFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWludCBkaXJ0eUNvdW50ID0gMDsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGxpc3QgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uaXNEaXJ0eSgpKSB7Ci0JCQkJZGlydHlDb3VudCsrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRpcnR5Q291bnQgPT0gMSkgewotCQkJYm9vbGVhbiByYyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JCQlpZiAoIXJjKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgaWYgKGRpcnR5Q291bnQgPiAxKSB7Ci0JCQlzd2l0Y2ggKExpYnJhcnlVSVV0aWwuZGlzcGxheVNhdmVEaXJ0eUVkaXRvcnNEaWFsb2coKSkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuTk86Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCU9wZW5MaWJyYXJ5V2l6YXJkIHdpemFyZCA9IG5ldyBPcGVuTGlicmFyeVdpemFyZCgpOwotCQl3aXphcmQuaW5pdCh3aW5kb3cuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTcxODExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL1Byb2Nlc3NEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVSb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVUYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVUZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgZGVsZXRlIGFjdGlvbiBmb3IgdGhlIHByb2Nlc3MgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0RlbGV0ZUFjdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGRlbGV0aW9uQ29uZmlybWVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEhhc2hTZXQ8RGVzY3JpcHRvcj4gcmVtb3ZlZERlc2NyaXB0b3JzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0RlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlzdXBlcihkb21haW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gY29uZmlybQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRpc3BsYXlzIGEgcHJvbXB0IHRvIGFzayBmb3IgdXNlcgotCSAqICAgICAgICAgICAgY29uZmlybWF0aW9uCi0JICovCi0JcHVibGljIFByb2Nlc3NEZWxldGVBY3Rpb24oRWRpdGluZ0RvbWFpbiBkb21haW4sIGJvb2xlYW4gY29uZmlybSkgewotCQlzdXBlcihkb21haW4sIGNvbmZpcm0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChSZW1vdmVDb21tYW5kLmNyZWF0ZShkb21haW4sCi0JCQkJc2VsZWN0aW9uKSwgc2VsZWN0aW9uLCBjb25maXJtKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBkZWxldGUgYWN0aW9uIGdpdmVuIHRoZSBhY3Rpb24gbWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJaWYgKGNvbmZpcm1EZWxldGUoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIHJlbW92ZSByZWZlcmVuY2VzCi0JCQkJcmVtb3ZlUmVmZXJlbmNlcyhhY3Rpb25NZ3IsIGl0b3IubmV4dCgpKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIGVsZW1lbnQKLQkJCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUN1cnJlbnRFZGl0b3IoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2dldERlbGV0ZUNvbmZpcm1hdGlvbk1lc3NhZ2UoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVJlc291cmNlcy5Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycywgQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoCi0JCQkJZGVzY3JpcHRvcnMsIGZhbHNlLCBkZWxldGVkRWxlbWVudHMpIHsKLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpIHsKLQkJCQlyZXR1cm4gUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZWxlbWVudHMpOwotCQkJfQotCi0JCQkvLyBwcm90ZWN0ZWQgdm9pZCBzZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlKExpc3QKLQkJCS8vIGRlc2NyaXB0b3JzVG9EZWxldGUpIHsKLQkJCS8vIFN0cmluZyBtc2cgPQotCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlOwotCQkJLy8gT2JqZWN0W10gZGVzY3JpcHRvcnMgPQotCQkJLy8gUmVmZXJlbmNlU2VsZWN0aW9uLmdldFJlZmVyZW5jZXMoZGVzY3JpcHRvcnNUb0RlbGV0ZSwKLQkJCS8vIG1zZyk7Ci0JCQkvLyBkZXNjcmlwdG9yc1RvRGVsZXRlLnJldGFpbkFsbChBcnJheXMuYXNMaXN0KGRlc2NyaXB0b3JzKSk7Ci0JCQkvLyB9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbmZpcm1EZWxldGUoKSkgewotCQkJLy8gY29sbGVjdGlvbiB0aGUgcmVsYXRlZCBkZXNjcmlwdG9ycyBiZWZvcmUgdGhlIGVsZW1lbnRzIGdvdAotCQkJLy8gZGVsZXRlZAotCQkJLy8KLQkJCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldDxEZXNjcmlwdG9yPigpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJYWRkUmVsYXRlZERlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBlbGVtZW50KTsKLQkJCX0KLQotCQkJQ29tbWFuZCBjbWQgPSBjb21tYW5kOwotCi0JCQkvLyBkZWxldGUgZWxlbWVudHMKLQkJCS8vCi0JCQljbWQuZXhlY3V0ZSgpOwotCi0JCQkvLyBDaGVjayByZWZlcmVuY2UgY29uZmlybWF0aW9uIGFuZCBpZiBjb25maXJtZWQgc2V0Ci0JCQkvLyBkZWxldGlvbmNvbmZpcm1lZCB0byB0cnVlCi0JCQkvLyBJZiBhbnkgZGVsZXRpb24gaGFwcGVucyBpbiBzZXF1ZW5jZSwgd2lsbCBjaGVjayBmb3IKLQkJCS8vIGRlbGV0aW9uY29uZmlybWVkIHZhcmlhYmxlCi0JCQkvLyBhbmQgcHJvY2VlZHMgcmVtYWluaW5nIGRlbGV0aW9uIHNlcXVlbmNlLiAoZWc6Ci0JCQkvLyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgLSBEZWxldGVBY3Rpb24oKSkuCi0JCQlpZiAoKChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgY21kKS5leGVjdXRlZCkgewotCQkJCWRlbGV0aW9uQ29uZmlybWVkID0gdHJ1ZTsKLQotCQkJCUNvbGxlY3Rpb248Pz4gZGVsZXRlZEVsZW1lbnRzID0gY21kLmdldFJlc3VsdCgpOwotCQkJCUNvbW1hbmQgZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gY3JlYXRlRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKGRlc2NyaXB0b3JzLCBkZWxldGVkRWxlbWVudHMpOwotCQkJCXRyeSB7Ci0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzYXZlIHRoZSBjdXJyZW50IGVkaXRvcgotCQkJLy8KLQkJCXNhdmVDdXJyZW50RWRpdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlbGF0ZWREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldE91dHB1dCgpKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbChyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2VzKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgT2JqZWN0IG9iaikgewotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJYm9vbGVhbiBmb3JjZSA9ICFjb25maXJtOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVUYXNrRGVzY3JpcHRvcigoVGFza0Rlc2NyaXB0b3IpIG9iaiwgZm9yY2UpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQljbWQgPSBuZXcgRGVsZXRlUm9sZURlc2NyaXB0b3IoKFJvbGVEZXNjcmlwdG9yKSBvYmosIGZvcmNlKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqLAotCQkJCQlmb3JjZSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVUZWFtUHJvZmlsZSgoVGVhbVByb2ZpbGUpIG9iaik7Ci0JCX0KLQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQlpZiAoYWN0aW9uTWdyICE9IG51bGwpIHsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQl9IGVsc2UgewotCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQl9Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKSB7Ci0JCQkJcmVtb3ZlZERlc2NyaXB0b3JzCi0JCQkJCQkuYWRkQWxsKCgoUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKSBjbWQpCi0JCQkJCQkJCS5nZXRSZW1vdmVkRGVzY3JpcHRvcnMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKGZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXJzIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybiBOZXcgU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBmaWx0ZXJTZWxlY3Rpb24oCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotCQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSWYgZGVsZXRpb24gY29uZmlybWVkLCBzZXQgY29uZmlybWF0aW9uIGFuZCBjaGlsZCBwcm9jZXNzIGNhbiB1c2UgdGhlCi0JICogY29uZmlybWF0aW9uIHRvIHByb2NlZWQgZm9yIHRoZSBkZWxldGlvbiBvZiByZW1haW5pbmcuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGlvbkNvbmZpcm1lZCgpIHsKLQkJcmV0dXJuIGRlbGV0aW9uQ29uZmlybWVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBjb21tYW5kCi0JICogCi0JICogQHJldHVybiBjbWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIHByb2Nlc3MgZWxlbWVudHMgd2l0aG91dCBVSSBhY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcmV0dXJuIHRoZSBleGVjdXRlZCBkZWxldGUgY29tbWFuZCBpZiBzb21lIG9mIHRoZSBnaXZlbiBlbGVtZW50cyBoYXZlCi0JICogICAgICAgICBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdXNlciBjYW5jZWxlZCB0aGlzIGRlbGV0aW9uIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBkZWxldGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKG51bGwsIGZhbHNlKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0KLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChzZWxlY3Rpb24pOwotCQkJfQotCi0JCX07Ci0JCWlmIChkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBBcnJheUxpc3QoCi0JCQkJZWxlbWVudHMpKSkpIHsKLQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCWlmICghZGVsZXRlQWN0aW9uLmlzRGVsZXRpb25Db25maXJtZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGRlbGV0ZUFjdGlvbi5nZXRDb21tYW5kKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU0YzlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjdGlvbnMgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmRjZDc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0Jhc2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgTGlicmFyeSBVSSBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEJhc2VEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvbnZlcnRBY3Rpdml0eURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29udmVydEFjdGl2aXR5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzRmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29udmVydEFjdGl2aXR5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLlR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db252ZXJ0QWN0aXZpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotCi0vKioKLSAqIERpYWxvZyB0byBjb252ZXJ0IGFjdGl2aXR5IHR5cGUgCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydEFjdGl2aXR5RGlhbG9nIHsKLQotCS8qKgotCSAqIFF1ZXJ5IHVzZXIgYW5kIGNvbnZlcnQgdGhlIG9sZCBhY3Rpdml0eSBpbnRvIG5ldyBvbmUKLQkgKiAKLQkgKiBAcGFyYW0gb2xkQWN0aXZpdHkKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIAotCSAqIEByZXR1cm4gTmV3bHkgY29udmVydGVkIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBxdWVyeVVzZXJBbmRDb252ZXJ0KEFjdGl2aXR5IG9sZEFjdGl2aXR5LCBTaGVsbCBzaGVsbCwKLQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJCi0JCWlmIChzaGVsbCA9PSBudWxsKQotCQkJc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlMaXN0RGlhbG9nIGRsZyA9IG5ldyBMaXN0RGlhbG9nKHNoZWxsKTsKLQkJZGxnLnNldEhlaWdodEluQ2hhcnMoNSk7Ci0JCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlkbGcuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXN3aXRjaCAoKChJbnRlZ2VyKSBlbGVtZW50KS5pbnRWYWx1ZSgpKSB7Ci0JCQkJLy8gVE9ETzogcmVmYWN0b3IgdGhlc2Ugc3RyaW5ncyAoYW5kIHRoaXMgd2hvbGUgZGlhbG9nKSBpbnRvCi0JCQkJLy8gbGlicmFyeS51aQotCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWTsKLQkJCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotCQkJCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0lURVJBVElPTjsKLQkJCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0U7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudW5rbm93bkd1aWRhbmNlX3RleHQ7IAotCQkJCX0KLQotCQkJfQotCQl9KTsKLQkJTGlzdCBuZXdBY3Rpdml0eVR5cGVMaXN0ID0gZ2V0VmFsaWROZXdBY3Rpdml0eVR5cGVzKG9sZEFjdGl2aXR5KTsKLQkJaWYgKG5ld0FjdGl2aXR5VHlwZUxpc3QgPT0gbnVsbCkgewotCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwgCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZywKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMudW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uLCBTdHJVdGlsLnRvTG93ZXIoVG5nVXRpbC5nZXRUeXBlVGV4dChvbGRBY3Rpdml0eSkpKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlkbGcuc2V0SW5wdXQobmV3QWN0aXZpdHlUeXBlTGlzdCk7Ci0JCWRsZy5zZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlKTsKLQkJZGxnLnNldE1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0KTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdFtdIHNlbGVjdGlvblJlc3VsdCA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHNlbGVjdGlvblJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjaG9zZW5BY3Rpdml0eSA9ICgoSW50ZWdlcikgc2VsZWN0aW9uUmVzdWx0WzBdKS5pbnRWYWx1ZSgpOwotCQkKLS8vCQlyZXR1cm4gQ29udmVydEFjdGl2aXR5VHlwZS5jb252ZXJ0QWN0aXZpdHkob2xkQWN0aXZpdHksIGNob3NlbkFjdGl2aXR5LCBjb21tYW5kKTsKLQkJCi0JCXJldHVybiBUeXBlQ29udmVydGVyLmNvbnZlcnRBY3Rpdml0eShvbGRBY3Rpdml0eSwgVHlwZUNvbnZlcnRlci5nZXRBY3Rpdml0eVR5cGUoY2hvc2VuQWN0aXZpdHkpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIHZhbGlkIG5ldyBhY3Rpdml0eSB0eXBlcyBiYXNlZCBvbiBvbGQgYWN0aXZpdHkgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBvbGRBY3Rpdml0eQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiB2YWxpZCBhY3Rpdml0eSB0eXBlcwotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMoQWN0aXZpdHkgb2xkQWN0aXZpdHkpIHsKLQkJaWYgKG9sZEFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZWdlciBvbGRBY3Rpdml0eUNsYXNzSUQgPSBuZXcgSW50ZWdlcihvbGRBY3Rpdml0eS5lQ2xhc3MoKQotCQkJCS5nZXRDbGFzc2lmaWVySUQoKSk7Ci0JCWlmICghQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuY29udGFpbnMob2xkQWN0aXZpdHlDbGFzc0lEKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGFjdGl2aXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlZ2VyIGNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lEID0gKEludGVnZXIpaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9sZEFjdGl2aXR5Q2xhc3NJRC5lcXVhbHMoY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQpICYmCi0JCQkJCWNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lELmludFZhbHVlKCkgIT0gVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk4gJiYKLQkJCQkJY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQuaW50VmFsdWUoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1MpCi0JCQkJYWN0aXZpdHlMaXN0LmFkZChjb21wYXRpYmxlQWN0aXZpdHlUeXBlQ2xhc3NJRCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5TGlzdDsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvcHlMaWJyYXJ5RGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Db3B5TGlicmFyeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk0MThlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvcHlMaWJyYXJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIERpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgdG8gY29weSBhIGxpYnJhcnkgdG8gYW5vdGhlciBsb2NhdGlvbgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29weUxpYnJhcnlEaWFsb2cgZXh0ZW5kcyBQYXRoU2VsZWN0aW9uRGlhbG9nIHsKLQkKLQlwdWJsaWMgQ29weUxpYnJhcnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dNZXNzYWdlLCBkZWZhdWx0UGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBpZCwgU3RyaW5nIGxhYmVsLAotCQkJYm9vbGVhbiBkZWZhdWx0QnV0dG9uKSB7Ci0JCUJ1dHRvbiBiID0gc3VwZXIuY3JlYXRlQnV0dG9uKHBhcmVudCwgaWQsIGxhYmVsLCBkZWZhdWx0QnV0dG9uKTsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWIuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuY29weUxpYnJhcnlEaWFsb2dfY29weUJ1dHRvbl90ZXh0KTsKLQotCQl9IGVsc2UgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNraXBCdXR0b25fdGV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0xpYnJhcnlCYWNrdXBEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0xpYnJhcnlCYWNrdXBEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViNWJiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9MaWJyYXJ5QmFja3VwRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYmFjayB1cCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUJhY2t1cERpYWxvZyBleHRlbmRzIFBhdGhTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIExpYnJhcnlCYWNrdXBEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dNZXNzYWdlLCBkZWZhdWx0UGF0aCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsCi0JCQlib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJQnV0dG9uIGIgPSBzdXBlci5jcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsIGRlZmF1bHRCdXR0b24pOwotCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJYi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5va0J1dHRvbl90ZXh0KTsKLQotCQl9IGVsc2UgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNraXBCdXR0b25fdGV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2FlMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvUGF0aFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogCi0gKiBVdGlsaXR5IGNsYXNzIHRvIHNlbGVjdCBhIHBhdGgKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGF0aFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX3BhdGg7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfYnJvd3NlX2J1dHRvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0JcHVibGljIFBhdGhTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCi0JCXRpdGxlID0gZGlhbG9nVGl0bGU7Ci0JCW1lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCQl2YWx1ZSA9IGRlZmF1bHRQYXRoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXZhbHVlID0gY3RybF9wYXRoLmdldFRleHQoKTsKLQotCQkJLy8gbWFrZSBzdXJlIHRoZSBwYXRoIGlzIHZhbGlkCi0JCQlTdHJpbmcgbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLnBhdGhTZWxlY3Rpb25FcnJvcl9tc2c7Ci0JCQlpZiAoRGlyZWN0b3J5VmFsaWRhdG9yLmNoZWNrQW5kQ3JlYXRlRGlyKHZhbHVlLCB0aXRsZSwgbXNnKSA9PSBmYWxzZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAodGl0bGUgIT0gbnVsbCkKLQkJCXNoZWxsLnNldFRleHQodGl0bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYnkgZGVmYXVsdAotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gZG8gdGhpcyBoZXJlIGJlY2F1c2Ugc2V0dGluZyB0aGUgdGV4dCB3aWxsIHNldCBlbmFibGVtZW50IG9uIHRoZSBvawotCQkvLyBidXR0b24KLQkJY3RybF9wYXRoLnNldEZvY3VzKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQljdHJsX3BhdGguc2V0VGV4dCh2YWx1ZSk7Ci0JCQljdHJsX3BhdGguc2VsZWN0QWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCS8vIGNyZWF0ZSBtZXNzYWdlCi0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCX0KLQkJY3RybF9wYXRoID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWN0cmxfcGF0aC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCWN0cmxfYnJvd3NlX2J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWN0cmxfYnJvd3NlX2J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQljdHJsX2Jyb3dzZV9idXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQljdHJsX2Jyb3dzZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGRpcmVjdG9yeSBkaWFsb2cKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJLy8gVGV4dCBjdHJsX3BhdGggPSBzdXBlci5nZXRUZXh0KCk7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQkJZGQuc2V0RmlsdGVyUGF0aChjdHJsX3BhdGguZ2V0VGV4dCgpKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQljdHJsX3BhdGguc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoCi0JICogQHJldHVybiBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNhN2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1NlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUHJvbXBzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5IGZvbGRlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nIHsKLQotCXByaXZhdGUgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgZGlhbG9nIHN0eWxlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCWRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LCBzdHlsZSk7Ci0JCWRpYWxvZy5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGV4dCk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKExpYnJhcnlVSVByZWZlcmVuY2VzLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaWx0ZXIgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIGZpbHRlciBwYXRoLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlclBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgdGhlIGRpYWxvZyB2aXNpYmxlIGFuZCBicmluZ3MgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgb3BlbigpIHsKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjNhYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBleHRlbmRzIGpmYWNlIExpc3RTZWxlY3Rpb25EaWFsb2cgYW5kIHJlbW92ZXMgY2FuY2VsIGJ1dHRvbgotICAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgTGlzdFNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwdWJsaWMgVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGlucHV0LAotICAgICAgICAgICAgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwZjY1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Vc2VySW5wdXRzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkRlbGVnYXRlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBhY3RzIGFzIGEgaW5wdXQgZGlhbG9nIGR1cmluZyBjb21tYW5kIGV4ZWN1dGlvbiBiYXNlZCBvbiB1c2VyCi0gKiBpbnB1dCBhbmQgaW5wdXRUeXBlIGRpYWxvZyBiZWhhdmlvdXIgY2hhbmdlcy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW5wdXRzRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCXByaXZhdGUgU3RyaW5nIGdsb2JhbEVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBMaXN0IHVzZXJJbnB1dHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQlMYWJlbCBtZXNzYWdlQXJlYTsKLQotCUxhYmVsIGVycm9yQXJlYTsKLQotCUhhc2hNYXA8T2JqZWN0LE9iamVjdD4gb2xkSW5mb0ZvckNhbmNlbDsKLQkKLQlwcml2YXRlIENvbG9yIHJlZENvbG9yOwotCQotCXB1YmxpYyBVc2VySW5wdXRzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IHVzZXJJbnB1dHMsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnVzZXJJbnB1dHMgPSB1c2VySW5wdXRzOwotCQlvbGRJbmZvRm9yQ2FuY2VsID0gbmV3IEhhc2hNYXA8T2JqZWN0LE9iamVjdD4oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgVHJlZSBWaWV3ZXIuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBVc2VySW5wdXQgdXNlcklucHV0KSB7Ci0JCVRyZWVWaWV3ZXIgdmlld2VyOwotCQlpZiAoIXVzZXJJbnB1dC5pc011bHRpcGxlKCkpIHsKLQkJCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9IGVsc2UgewotCQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQotCQkJfQotCi0JCX0pOwotCi0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQkJfQotCQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJCXZpZXdlci5zZXRJbnB1dCh1c2VySW5wdXQuZ2V0Q2hvaWNlcygpKTsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCS8vIFRPRE86IHRyZWVWaWV3ZXIgU29ydGVyIGFuZCBFeHBhbmQvQ29sbGFwc2UKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUYWJsZVZpZXdlcgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUZXh0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgVXNlcklucHV0IHVzZXJJbnB1dCkgewotCQlmaW5hbCBVc2VySW5wdXQgbG9jYWxpbnB1dCA9IHVzZXJJbnB1dDsKLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB1c2VySW5wdXQuZ2V0VmFsaWRhdG9yKCk7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpZiAodXNlcklucHV0LmdldElucHV0KCkgIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIHVzZXJJbnB1dC5nZXRJbnB1dCgpKTsKLQkJfQotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgZXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQllcnJvclR4dCA9IHZhbGlkYXRvci5pc1ZhbGlkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwkJCQkJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlnbG9iYWxFcnJvclR4dCA9IGVycm9yVHh0OwotCQkJCX0KLQkJCQlpZiAoZXJyb3JUeHQgPT0gbnVsbCB8fCBlcnJvclR4dC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCWxvY2FsaW5wdXQuc2V0SW5wdXQodGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJZXJyb3JUeHQgPSB2YWxpZGF0b3IuaXNWYWxpZCh0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZXJyb3JUeHQpOwotCQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZ2xvYmFsRXJyb3JUeHQgPSBlcnJvclR4dDsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbGlucHV0LnNldElucHV0KHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBzZXRJbnB1dCwgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIGl0LgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KFVzZXJJbnB1dCBpbnB1dCwgT2JqZWN0IG9iaikgewotCQlpbnB1dC5zZXRJbnB1dChvYmopOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ib3ZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJZmluYWwgVXNlcklucHV0IGxvY2FsSW5wdXQgPSB1c2VySW5wdXQ7Ci0JCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gdXNlcklucHV0LmdldFZhbGlkYXRvcigpOwotCQlmaW5hbCBDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJdmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQluZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAodXNlcklucHV0LmdldExhYmVsUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVsZWdhdGVMYWJlbFByb3ZpZGVyKHVzZXJJbnB1dC5nZXRMYWJlbFByb3ZpZGVyKCkpKTsKLQkJfQotCQlMaXN0IGNob2ljZXMgPSB1c2VySW5wdXQuZ2V0Q2hvaWNlcygpOwotCQl2aWV3ZXIuc2V0SW5wdXQoY2hvaWNlcyk7Ci0JCWlmIChjaG9pY2VzICE9IG51bGwgJiYgY2hvaWNlcy5zaXplKCkgPiAwKSB7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNob2ljZXMuZ2V0KDApKSk7Ci0JCQlsb2NhbElucHV0LnNldElucHV0KGNob2ljZXMuZ2V0KDApKTsKLQkJfQotCQl2aWV3ZXIuZ2V0Q29tYm8oKS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHZhbGlkYXRvciA9PSBudWxsIHx8IHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5pc1ZhbGlkKHNlbGVjdGVkLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQllcnJvclR4dCA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBpZiAoZ2xvYmFsRXJyb3JUeHQgIT0gbnVsbCAmJiBnbG9iYWxFcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZ2xvYmFsRXJyb3JUeHQpOwotCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWVycm9yQXJlYS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgZXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5pc1ZhbGlkKG9iaik7Ci0JCQkJCWlmIChzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCWVycm9yVHh0ID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQkJfQotCQkJCQlpZiAoZXJyb3JUeHQgIT0gbnVsbCAmJiBlcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWVycm9yQXJlYS5zZXRUZXh0KGVycm9yVHh0KTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChnbG9iYWxFcnJvclR4dCAhPSBudWxsICYmIGdsb2JhbEVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZ2xvYmFsRXJyb3JUeHQpOwotCQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbElucHV0LnNldElucHV0KG9iaik7Ci0JCQkJfQotCQkJfQotCQl9KTsJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgTGFiZWwgYW5kIFRleHQgZm9yIG1lc3NhZ2UgYXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBtZXNzYWdlQXJlYUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQltZXNzYWdlQXJlYUNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQltZXNzYWdlQXJlYUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQltZXNzYWdlQXJlYSA9IG5ldyBMYWJlbChtZXNzYWdlQXJlYUNvbXAsIFNXVC5XUkFQKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbWVzc2FnZUFyZWEuc2V0VGV4dChtZXNzYWdlKTsKLQkJfQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5taW5pbXVtV2lkdGggPSA0MDA7Ci0JCW1lc3NhZ2VBcmVhLnNldExheW91dERhdGEoZ2QpOwotCQlhcHBseURpYWxvZ0ZvbnQobWVzc2FnZUFyZWEpOwotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwobWVzc2FnZUFyZWFDb21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlHcmlkRGF0YSBnZDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QxLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QxKTsKLQkJcmV0dXJuIG1lc3NhZ2VBcmVhOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkKLQkJLy8gY3JlYXRlIG1lc3NhZ2UgYXJlYQotCQljcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBkaWFsb2cgYXJlYQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZGlhbG9nTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlkaWFsb2dMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyBDcmVhdGUgY29udHJvbHMgYmFzZWQgb24gVXNlcklucHV0cwotCQlpZiAodXNlcklucHV0cyAhPSBudWxsICYmIHVzZXJJbnB1dHMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHVzZXJJbnB1dHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVzZXJJbnB1dCkgewotCQkJCQlVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgb2JqZWN0OwotCi0JCQkJCS8vIFN0b3JlIHRoZSB1c2VySW5wdXQgaW4gdGhlIGhhc2htYXAgZm9yIGNhbmNlbCBhY3Rpb24uCi0JCQkJCW9sZEluZm9Gb3JDYW5jZWwucHV0KHVzZXJJbnB1dCwgdXNlcklucHV0LmdldElucHV0KCkpOwotCi0JCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJCQkJbGFiZWwuc2V0VGV4dCh1c2VySW5wdXQuZ2V0TGFiZWwoKSk7Ci0JCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQkJCWlmICh1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5URVhUKSB7Ci0JCQkJCQljcmVhdGVUZXh0KGRpYWxvZ0FyZWEsIHVzZXJJbnB1dCk7Ci0JCQkJCX0gZWxzZSBpZiAodXNlcklucHV0LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuU0VMRUNUSU9OKSB7Ci0JCQkJCQljcmVhdGVDb21ib1ZpZXdlcihkaWFsb2dBcmVhLCB1c2VySW5wdXQpOwotCQkJCQl9Ci0JCQkJCS8vIGNyZWF0ZUVtcHR5TGFiZWwoZGlhbG9nQXJlYSwgMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNyZWF0ZUVycm9yQXJlYShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBFcnJvciBBcmVhLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRXJyb3JBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsJCi0JCUNvbXBvc2l0ZSBlcnJvckFyZWFDb21wID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWVycm9yQXJlYUNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWVycm9yQXJlYUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyBjcmVhdGUgYmxhbmsgbGFiZWwKLS8vCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0KLQkJZXJyb3JBcmVhID0gbmV3IExhYmVsKGVycm9yQXJlYUNvbXAsIFNXVC5XUkFQKTsKLQkJcmVkQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgbmV3IFJHQigyNTUsIDAsIDApKTsKLQkJaWYocmVkQ29sb3IgIT0gbnVsbCl7Ci0JCQllcnJvckFyZWEuc2V0Rm9yZWdyb3VuZChyZWRDb2xvcik7Ci0JCX0KLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gODA7Ci0JCWVycm9yQXJlYS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXBwbHlEaWFsb2dGb250KGVycm9yQXJlYSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJaWYgKHRoaXMudGl0bGUgIT0gbnVsbCkgewotCQkJbmV3U2hlbGwuc2V0VGV4dCh0aGlzLnRpdGxlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXJlc3VsdCA9IHRydWU7CQkKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjYW5jZWxQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAodXNlcklucHV0cyAhPSBudWxsICYmIHVzZXJJbnB1dHMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHVzZXJJbnB1dHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVzZXJJbnB1dCkgewotCQkJCQlVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgb2JqZWN0OwotCQkJCQl1c2VySW5wdXQuc2V0SW5wdXQob2xkSW5mb0ZvckNhbmNlbC5nZXQodXNlcklucHV0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHRzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmKHJlZENvbG9yICE9IG51bGwpewotCQkJcmVkQ29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkvKioKLQkgKiBDcmVhdGUgYSBlbXB0eSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHNwYW4KLQkgKi8KLQkvLyBwcml2YXRlIHZvaWQgY3JlYXRlRW1wdHlMYWJlbChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgc3Bhbil7Ci0JLy8gTGFiZWwgZW1wdHlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkvLyBlbXB0eUxhYmVsLnNldEJhY2tncm91bmQoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkvLyBHcmlkRGF0YSBlbXB0eURhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkvLyBlbXB0eUxhYmVsLnNldFRleHQoIiIpOwotCS8vIGVtcHR5RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCS8vIGVtcHR5RGF0YS5ob3Jpem9udGFsU3BhbiA9c3BhbjsKLQkvLyBlbXB0eURhdGEuaGVpZ2h0SGludCA9IDM7Ci0JLy8gZW1wdHlMYWJlbC5zZXRMYXlvdXREYXRhKGVtcHR5RGF0YSk7Ci0JLy8gfQotCS8qKgotCSAqIHZhbGlkYXRlcyB0aGUgaW5wdXQgd2l0aCBnaXZlbiBWYWxpZGF0b3IgaW4gVXNlcklucHV0LgotCSAqLwotCS8vIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VySW5wdXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIFVzZXJJbnB1dCBlbGVtZW50ID0gKFVzZXJJbnB1dCkgaXRlci5uZXh0KCk7Ci0JLy8gSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBlbGVtZW50LmdldFZhbGlkYXRvcigpOwotCS8vIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCS8vIGlmIChlbGVtZW50LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuVEVYVCkgewotCS8vIGVycm9yVHh0ICs9IHZhbGlkYXRvcgotCS8vIC5pc1ZhbGlkKGVsZW1lbnQuZ2V0SW5wdXQoKS50b1N0cmluZygpKTsKLQkvLyB9IGVsc2UgewotCS8vIGVycm9yVHh0ICs9IHZhbGlkYXRvci5pc1ZhbGlkKGVsZW1lbnQuZ2V0SW5wdXQoKSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gZXJyb3JUeHQgPSAiU3lzdGVtIG91dCB0ZXN0aW5nIjsKLQkvLyBpZiAoZXJyb3JUeHQgIT0gbnVsbCAmJiBlcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkvLyBlcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JLy8gZXJyb3JBcmVhLnNldEZvcmVncm91bmQoQ29sb3JDb25zdGFudHMucmVkKTsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwMDc2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDEzNmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNb2RlbHMgdGhlIDxuZXdMaWJyYXJ5V2l6YXJkUGFnZT4gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicnJheS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbi4KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMudHlwZUlkID0gdHlwZUlkOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTlmYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLlJlY2VudGx5T3BlbmVkTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSwgYnJpZWYgZGVzY3JpcHRpb24gYW5kCi0gKiB0eXBlIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlNYWluUGFnZTIgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBPcGVuTGlicmFyeU1haW5QYWdlMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgQ29tYm8gbmFtZUNvbWJvOwotCi0JcHJvdGVjdGVkIFRleHQgdXJpVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3BlblVubGlzdGVkTGlicmFyeSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uczsKLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZWNlbnRseU9wZW5lZExpYnJhcnk+IHJlY2VudGx5T3BlbmVkTGlicmFyaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZWNlbnRseU9wZW5lZExpYnJhcnk+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeU1haW5QYWdlMigpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vT3Blbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5uYW1lTGFiZWxfdGV4dCk7Ci0KLQkJbmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQluYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gU2V0IHRoZSBjb25maWd1cmF0aW9uIGxpc3QuCi0JCUxpc3QgbGlicmFyeUxpc3QgPSBnZXRSZWNlbnRseU9wZW5lZExpYnJhcmllcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUmVjZW50bHlPcGVuZWRMaWJyYXJ5IGxpYnJhcnkgPSAoUmVjZW50bHlPcGVuZWRMaWJyYXJ5KSBpdC5uZXh0KCk7Ci0JCQlyZWNlbnRseU9wZW5lZExpYnJhcmllcy5wdXQobGlicmFyeS5nZXROYW1lKCksIGxpYnJhcnkpOwotCQl9Ci0JCVN0cmluZ1tdIGxpYnJhcnlOYW1lcyA9IG5ldyBTdHJpbmdbcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMuc2l6ZSgpXTsKLQkJcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMua2V5U2V0KCkudG9BcnJheShsaWJyYXJ5TmFtZXMpOwotCQluYW1lQ29tYm8uc2V0SXRlbXMobGlicmFyeU5hbWVzKTsKLQotCQlMYWJlbCB1cmlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQl1cmlMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy51cmlMYWJlbF90ZXh0KTsKLQotCQl1cmlUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdXJpVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdXJpVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveAotCQkJCS5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5vcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3hfdGV4dCk7Ci0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCUxhYmVsIGxpYnJhcnlUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbGlicmFyeVR5cGVMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5saWJyYXJ5VHlwZUxhYmVsX3RleHQpOwotCi0JCUNvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCU1hcCB0eXBlcyA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlUeXBlcygpOwotCQlyYWRpb0J1dHRvbnMgPSBuZXcgQnV0dG9uW3R5cGVzLnNpemUoKV07Ci0JCWludCByYWRpb0J1dHRvbkluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSAoU3RyaW5nKSB0eXBlcy5nZXQodHlwZUlkKTsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24odHlwZUNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJCXJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCX0KLQkJCX0pOwotCQkJcmFkaW9CdXR0b24uc2V0VGV4dCh0eXBlTmFtZSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXREYXRhKFRZUEVfSUQsIHR5cGVJZCk7Ci0JCQlyYWRpb0J1dHRvbnNbcmFkaW9CdXR0b25JbmRleCsrXSA9IHJhZGlvQnV0dG9uOwotCQl9Ci0KLQkJaWYgKHJhZGlvQnV0dG9ucy5sZW5ndGggPiAwKSB7Ci0JCQlyYWRpb0J1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSB3aXphcmRQYWdlID0gT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFdpemFyZFBhZ2UoZ2V0TGlicmFyeVR5cGUoKSk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXdpemFyZFBhZ2Uub25FbnRlclBhZ2UoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCX0KLQkJaWYgKCFvcGVuVW5saXN0ZWRMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwIHx8IG9wZW5Vbmxpc3RlZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQotCQlvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3gKLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlvcGVuVW5saXN0ZWRMaWJyYXJ5ID0gb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbmFtZUNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgVVJJIG9mIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVVSSSgpIHsKLQkJUmVjZW50bHlPcGVuZWRMaWJyYXJ5IGxpYnJhcnkgPSAoUmVjZW50bHlPcGVuZWRMaWJyYXJ5KSByZWNlbnRseU9wZW5lZExpYnJhcmllcwotCQkJCS5nZXQoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCXJldHVybiBsaWJyYXJ5LmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGF0aCBvZiB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKCkgewotCQlSZWNlbnRseU9wZW5lZExpYnJhcnkgbGlicmFyeSA9IChSZWNlbnRseU9wZW5lZExpYnJhcnkpIHJlY2VudGx5T3BlbmVkTGlicmFyaWVzCi0JCQkJLmdldChnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJcmV0dXJuIGxpYnJhcnkuZ2V0UGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gdW5saXN0ZWQgbWV0aG9kIGxpYnJyYXkgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlblVubGlzdGVkTGlicmFyeSgpIHsKLQkJcmV0dXJuIG9wZW5Vbmxpc3RlZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlCdXR0b24gcmFkaW9CdXR0b24gPSByYWRpb0J1dHRvbnNbaV07Ci0JCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b24uZ2V0RGF0YShUWVBFX0lEKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b25zWzBdLmdldERhdGEoVFlQRV9JRCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGxpc3Qgb2YgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBsaWJyYXJpZXMuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UmVjZW50bHlPcGVuZWRMaWJyYXJ5PC9jb2RlPiBvYmplY3RzCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFJlY2VudGx5T3BlbmVkTGlicmFyaWVzKCkgewotCQlMaXN0IGxpYnJhcnlVUklzID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0T3BlbkxpYnJhcnlVUklzTGlzdCgpOwotCQlMaXN0PFJlY2VudGx5T3BlbmVkTGlicmFyeT4gbGlicmFyaWVzID0gbmV3IEFycmF5TGlzdDxSZWNlbnRseU9wZW5lZExpYnJhcnk+KCk7Ci0JCWlmIChsaWJyYXJ5VVJJcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeVVSSXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCWxpYnJhcmllcy5hZGQobmV3IFJlY2VudGx5T3BlbmVkTGlicmFyeShsaWJyYXJ5VVJJKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpYnJhcmllczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2UxZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIG9wZW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmQyIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE9wZW5MaWJyYXJ5V2l6YXJkMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE9wZW5MaWJyYXJ5TWFpblBhZ2UyIG1haW5QYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmQyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQltYWluUGFnZSA9IG5ldyBPcGVuTGlicmFyeU1haW5QYWdlMigpOwotCQlhZGRQYWdlKG1haW5QYWdlKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0TGlicmFyeVR5cGVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHBlcnNpc3RlbmNlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgcGFnZUlkID0gcGVyc2lzdGVuY2VJZCArICJQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlIHBhZ2UgPSBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVdpemFyZFBhZ2UocGFnZUlkLCBwZXJzaXN0ZW5jZUlkKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9PcGVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCi0JCQkJYWRkUGFnZShwYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmIChtYWluUGFnZS5pc1BhZ2VDb21wbGV0ZSgpICYmICFtYWluUGFnZS5pc09wZW5Vbmxpc3RlZExpYnJhcnkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcGFnZXNbaV0uaXNQYWdlQ29tcGxldGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBtYWluUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQlPcGVuTGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRXaXphcmRQYWdlKHR5cGUpOwotCQl0cnkgewotCQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQkJaWYgKG1haW5QYWdlLmlzT3BlblVubGlzdGVkTGlicmFyeSgpKSB7Ci0JCQkJTWFwIG9wdGlvbnMgPSBwYWdlLmdldFNlbGVjdGlvbnMoKTsKLQkJCQlwYXRoID0gKFN0cmluZykgb3B0aW9ucy5nZXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCk7Ci0JCQl9IGVsc2UgewotCQkJCXBhdGggPSBtYWluUGFnZS5nZXRMaWJyYXJ5UGF0aCgpOwotCQkJfQotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc1ZhbGlkTGlicmFyeShwYXRoLCB0cnVlKSA9PSBTdGF0dXMuT0tfU1RBVFVTKSB7Ci0JCQkJCWlmICghaGFuZGxlVG9vbFZlcnNpb24ocGF0aCwgbnVsbCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KHBhdGgpKSB7Ci0JCQkJCQlhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChYTUlMaWJyYXJ5VXRpbAotCQkJCQkJLmNvbnRhaW5zUGx1Z2luT3JDb25maWdTcGVjRXhwb3J0RmlsZShwYXRoKSkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1zZ0RpYWxvZyBtc2dEaWFsb2cgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQlib29sZWFuIHJjID0gbXNnRGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dCwKLQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBwYXRoIH0pKTsKLQkJCQkJaWYgKCFyYykKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKExpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVMaWJyYXJ5KHBhdGgpKSB7Ci0JCQkJCQlhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uOwotCQkJfQotCQkJcmVhc29uICs9ICJcblxuIiArIExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX2FkdmljZTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5ld2x5IG9wZW5lZCBvciBjcmVhdGVkIG1ldGhvZCBsaWJyYXJ5IHRvIHRoZSByZWNlbnRseSBvcGVuZWQKLQkgKiBtZXRob2QgbGlicmFyaWVzIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVjZW50bHlPcGVuZWRMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcigKLQkJCQkJbGlicmFyeSkuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVVSSShsaWJyYXJ5VVJJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGFuZCBoYW5kbGUgdG9vbCB2ZXJzaW9uIGRpZmZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhbmRsZVRvb2xWZXJzaW9uKFN0cmluZyBwYXRoLAotCQkJVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlTdHJpbmcgbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUk7Ci0JCWlmIChjYWxsZXJJbmZvICE9IG51bGwgJiYgY2FsbGVySW5mby5nZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkpIHsKLQkJCWxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLmV4cG9ydEZpbGU7Ci0JCX0KLQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwKLQkJCQkuY2hlY2tMaWJyYXJ5VmVyc2lvbihuZXcgRmlsZShwYXRoLCBsaWJYbWkpKTsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnJlc3VsdCA+IDApIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dCwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCksCi0JCQkJCQkJCWluZm8udG9vbFZlcnNpb24gfSk7Ci0JCQl9IGVsc2UgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSB9KTsKLQkJCX0KLQkJCWlmICghaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKSkgewotCQkJCWNhbGxlckluZm8uc2V0RXJyb3JNc2cobWVzc2FnZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwgbWVzc2FnZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChwYXRoLCBsaWJYbWksIGluZm8pKSB7Ci0JCQlpZiAoaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKQotCQkJCQkmJiAhTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5jb3B5TGlicmFyeSgpOwotCQkJCWlmIChjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCXBhdGggPSBjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFMaWJyYXJ5VUlNYW5hZ2VyLnVwZ3JhZGVMaWJyYXJ5KHBhdGgsIGNhbGxlckluZm8pKSB7Ci0JCQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCkgewotCQkJCQkvLyBjYWxsZXJJbmZvLnNldEVycm9yTXNnKCJ1cGdyYWRlTGlicmFyeSBGYWlsZWQhIik7IC8vbmVlZAotCQkJCQkvLyBuZXcgcmVzb3VyY2Ugc3RyaW5nCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeShVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCXJldHVybiBVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5ZmJjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1vZGVscyB0aGUgPG9wZW5MaWJyYXJ5V2l6YXJkUGFnZT4gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicnJheS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbi4KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLAotCQkJU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl0aGlzLnR5cGVJZCA9IHR5cGVJZDsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKSB7Ci0JCXJldHVybiB0eXBlSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGl0bGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0NDU0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgT3BlbiBMaWJyYXJ5IHdpemFyZCBwYWdlcyBkZWZpbmVkIHZpYSB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGluc3RhbmNlID0gbmV3IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKTsKLQotCS8vIEEgbWFwIG9mIHdpemFyZCBwYWdlIHByb3ZpZGVycy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gd2l6YXJkUGFnZVByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uPigpOwotCi0JLy8gQSBsaXN0IG9mIHdpemFyZCBwYWdlIGluc3RhbmNlcy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZT4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0eXBlSWQgIT0gbnVsbCAmJiB0eXBlSWQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0aXRsZSAhPSBudWxsICYmIHRpdGxlLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgZGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJaWYgKCF3aXphcmRQYWdlUHJvdmlkZXJzLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKLQkJCQkJCQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHByb3ZpZGVyID0gbmV3IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgdHlwZUlkLCB0aXRsZSwKLQkJCQkJCQkJCQlkZXNjcmlwdGlvbik7Ci0JCQkJCQkJCXdpemFyZFBhZ2VQcm92aWRlcnMucHV0KHR5cGVJZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk9wZW5MaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlIGNyZWF0ZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VJZCwgU3RyaW5nIHR5cGVJZCkgewotCQlPcGVuTGlicmFyeVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChPcGVuTGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQkJfQotCi0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBwcm92aWRlciA9IChPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24pIHdpemFyZFBhZ2VQcm92aWRlcnMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gcHJvdmlkZXIuZ2V0QnVuZGxlKCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gcHJvdmlkZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQlDbGFzcyB3aXphcmRQYWdlQ2xhc3M7Ci0JCQlDbGFzc1tdIGFyZ0NsYXNzID0gbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfTsKLQkJCU9iamVjdFtdIGFyZ1ZhbHVlID0gbmV3IE9iamVjdFtdIHsgcGFnZUlkIH07Ci0JCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKLQkJCXRyeSB7Ci0JCQkJd2l6YXJkUGFnZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCWNvbnN0cnVjdG9yID0gd2l6YXJkUGFnZUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzKTsKLQkJCQl3aXphcmRQYWdlID0gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSkgY29uc3RydWN0b3IKLQkJCQkJCS5uZXdJbnN0YW5jZShhcmdWYWx1ZSk7Ci0JCQkJd2l6YXJkUGFnZS5zZXRUaXRsZShwcm92aWRlci5nZXRUaXRsZSgpKTsKLQkJCQl3aXphcmRQYWdlLnNldERlc2NyaXB0aW9uKHByb3ZpZGVyLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCXdpemFyZFBhZ2VzLnB1dCh0eXBlSWQsIHdpemFyZFBhZ2UpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb3IgY2FjaGVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5OZXdMaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSBnZXRXaXphcmRQYWdlKFN0cmluZyB0eXBlSWQpIHsKLQkJcmV0dXJuIChPcGVuTGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzLmdldCh0eXBlSWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMzJkZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBVSSBzdXBwcG9ydCBmb3IgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVVJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5VUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk1ZTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5VUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5TdXBwb3J0aW5nRWxlbWVudERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkRlZmF1bHRWYWx1ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlQcmVmZXJlbmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX1BBVEggPSAiZGVmYXVsdExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0xJQlJBUllfUEFUSCA9ICJzYXZlZExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0REID0gInB1Ymxpc2hVbm9wZW5BY3Rpdml0eURldGFpbERpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TV0lUQ0hfQ09ORklHID0gInN3aXRjaENvbmZpZ3VyYXRpb25PblByb2Nlc3NBY3RpdmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04gPSAicHVibGlzaEFjdGl2aXR5RGlhZ3JhbWZvckFjdGl2aXR5RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX1NIT1JUX05BTUUgPSAiYXBwbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTElCUkFSWV9QQVRIUyA9ICJuZXdMaWJyYXJ5UGF0aHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9MSUJSQVJZX1BBVEhTID0gIm9wZW5MaWJyYXJ5UGF0aHMiOyAvLyROT04tTkxTLTEkCQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0xJQlJBUllfVVJJUyA9ICJvcGVuTGlicmFyeVVSSXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19CUkVBS0RPV05FTEVNRU5UX09QVElPTkFMID0gIndvcmtfYnJlYWtkb3duZWxlbWVudF9vcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0JSRUFLRE9XTkVMRU1FTlRfTVVMVElQTEVfT0NDVVJSQU5DRVMgPSAid29ya19icmVha2Rvd25lbGVtZW50X211bHRpcGxlX29jY3VycmFuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9QTEFOTkVEID0gIndvcmtfYnJlYWtkb3duZWxlbWVudF9wbGFubmVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4gPSAid29ya19icmVha2Rvd25lbGVtZW50X2V2ZW50X2RyaXZlbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT05HT0lORyA9ICJ3b3JrX2JyZWFrZG93bmVsZW1lbnRfbXVsdGlwbGVfb25nb2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUkVQRUFUQUJMRSA9ICJ3b3JrX2JyZWFrZG93bmVsZW1lbnRfcmVwZWF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX09QVElPTkFMID0gImRlc2NyaXB0b3Jfb3B0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9NVUxUSVBMRV9PQ0NVUlJBTkNFUyA9ICJkZXNjcmlwdG9yX211bHRpcGxlX29jY3VycmFuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfUExBTk5FRCA9ICJkZXNjcmlwdG9yX3BsYW5uZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9FVkVOVF9EUklWRU4gPSAiZGVzY3JpcHRvcl9ldmVudF9kcml2ZW4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9PTkdPSU5HID0gImRlc2NyaXB0b3JfbXVsdGlwbGVfb25nb2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0RFU0NSSVBUT1JTID0gImluY2x1ZGUgZGVzY3JpcHRvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9SRVBFQVRBQkxFID0gImRlc2NyaXB0b3JfcmVwZWF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfRk9MREVSX05BTUUgPSAiTWV0aG9kIExpYnJhcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0TGlicmFyeVBhdGggPSBudWxsOwotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFRkFVTFRfTElCUkFSWV9QQVRILAotCQkJCWdldEluaXRpYWxEZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoU0FWRURfTElCUkFSWV9QQVRILCAiIik7IC8vJE5PTi1OTFMtMSQJCi0JCXByZWZTdG9yZQotCQkJCS5zZXREZWZhdWx0KFBSRUZfU1dJVENIX0NPTkZJRywgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoTkVXX0xJQlJBUllfUEFUSFMsICIiKTsgLy8kTk9OLU5MUy0xJAkKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoT1BFTl9MSUJSQVJZX1BBVEhTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoT1BFTl9MSUJSQVJZX1VSSVMsICIiKTsgLy8kTk9OLU5MUy0xJAkKLQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT1BUSU9OQUwsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX01VTFRJUExFX09DQ1VSUkFOQ0VTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFdPUktfQlJFQUtET1dORUxFTUVOVF9QTEFOTkVELCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX0VWRU5UX0RSSVZFTiwgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT05HT0lORywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUkVQRUFUQUJMRSwgZmFsc2UpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFU0NSSVBUT1JfT1BUSU9OQUwsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVTQ1JJUFRPUl9NVUxUSVBMRV9PQ0NVUlJBTkNFUywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERVNDUklQVE9SX1BMQU5ORUQsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVTQ1JJUFRPUl9FVkVOVF9EUklWRU4sIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVTQ1JJUFRPUl9PTkdPSU5HLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElOQ0xVREVfREVTQ1JJUFRPUlMsICFTdXBwb3J0aW5nRWxlbWVudERhdGEuaXNEZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERVNDUklQVE9SX1JFUEVBVEFCTEUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbml0aWFsIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRpYWxEZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCWlmIChkZWZhdWx0TGlicmFyeVBhdGggPT0gbnVsbCkgewotCQkJZGVmYXVsdExpYnJhcnlQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aCA9IGRlZmF1bHRMaWJyYXJ5UGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0xJQlJBUllfRk9MREVSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aCA9IGRlZmF1bHRMaWJyYXJ5UGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfTElCUkFSWV9GT0xERVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdExpYnJhcnlQYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoREVGQVVMVF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0TGlicmFyeVBhdGgoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERUZBVUxUX0xJQlJBUllfUEFUSCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChib29sZWFuIGVuYWJsZWQpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCBlbmFibGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JfQotCi0JLyoqCi0JICogU2V0dGVyIG1ldGhvZCBmb3IgUHVibGlzaCBBY3Rpdml0eSBEaWFncmFtIGZvciBBY3Rpdml0eSBFeHRlbnNpb24sCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04sIGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIGdldHRlciBtZXRob2QgZm9yIFB1Ymxpc2ggQWN0aXZpdHkgRGlhZ3JhbSBmb3IgQWN0aXZpdHkgRXh0ZW5zaW9uIGZsYWcKLQkgKiBmcm9tIHByZWZlcmVuY2Ugc3RvcmUsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIHN0b3JlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gY291bGQgYmUgQUxXQVlTLCBORVZFUiwgUFJPTVBUCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3dpdGNoQ29uZmlnKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQUkVGX1NXSVRDSF9DT05GSUcpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIGNvdWxkIGJlIEFMV0FZUywgTkVWRVIsIFBST01QVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTd2l0Y2hDb25maWcoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQUkVGX1NXSVRDSF9DT05GSUcsIHZhbHVlKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHN3aXRjaCBjb25maWd1cmF0aW9uIHByZWZlcmVuY2Uga2V5Ci0JICogQHJldHVybiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTd2l0Y2hDb25maWdQcmVmZXJlbmNlS2V5KCkJewotCQlyZXR1cm4gUFJFRl9TV0lUQ0hfQ09ORklHOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIE1ldGhvZCBMaWJyYXJ5IHBhdGggdGhhdCB3YXMgc2F2ZWQgaW4gYSBwcmV2aW91cyBzZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNhdmVkIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTYXZlZExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhTQVZFRF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgTWV0aG9kIExpYnJhcnkgcGF0aCB0byB0aGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogICAgICAgICAgICBQYXRoIHRvIGEgTWV0aG9kIExpYnJhcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNhdmVkTGlicmFyeVBhdGgoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIHBhdGggPSBsaWJQYXRoOwotCQlpZiAocGF0aC5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUpKSB7Ci0JCQlwYXRoID0gRmlsZVV0aWwuZ2V0UGFyZW50RGlyZWN0b3J5KHBhdGgpOwotCQl9Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTQVZFRF9MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHNob3J0IG5hbWUgcGFzc2VkIGluIHRoZSBtYWluIGZlYXR1cmUncwotCSAqIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYXNzZWQtaW4gYXBwbGljYXRpb24gc2hvcnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQVBQTElDQVRJT05fU0hPUlRfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXROZXdMaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBORVdfTElCUkFSWV9QQVRIUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgbGlicmFyeSBwYXRocwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldE5ld0xpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgTkVXX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtZXRob2QgbGlicmFyeSBwYXRoIHRvIHRoZSBuZXcgbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmV3TGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgTkVXX0xJQlJBUllfUEFUSFMsIHBhdGgsCi0JCQkJZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGxpYnJhcnkgcGF0aHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wZW5MaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBPUEVOX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0T3BlbkxpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgT1BFTl9MSUJSQVJZX1BBVEhTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWV0aG9kIGxpYnJhcnkgcGF0aCB0byB0aGUgb3BlbiBsaWJyYXJ5IHBhdGhzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgT1BFTl9MSUJSQVJZX1BBVEhTLCBwYXRoLAotCQkJCWdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wZW5MaWJyYXJ5VVJJcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIE9QRU5fTElCUkFSWV9VUklTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3BlbkxpYnJhcnlVUklzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBPUEVOX0xJQlJBUllfVVJJUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBsaWJyYXJ5IFVSSSB0byB0aGUgb3BlbiBsaWJyYXJ5IFVSSXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVVSSShTdHJpbmcgdXJpKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIE9QRU5fTElCUkFSWV9VUklTLCB1cmkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgYWxsIHByZWZlcmVuY2VzCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudE9wdGlvbmFsKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oV09SS19CUkVBS0RPV05FTEVNRU5UX09QVElPTkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT3B0aW9uYWwgZmVhdHVyZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbChib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT1BUSU9OQUwsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG11bHRpcGxlIG9jY3VycmFuY2VzIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbgotCSAqIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihXT1JLX0JSRUFLRE9XTkVMRU1FTlRfTVVMVElQTEVfT0NDVVJSQU5DRVMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBNdWx0aXBsZSBPY2N1cnJhbmNlcyBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX01VTFRJUExFX09DQ1VSUkFOQ0VTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwbGFubmVkIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudFBsYW5uZWQoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUExBTk5FRCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdmFsdWUgZm9yIFBsYW5uZWQgZmVhdHVyZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFdPUktfQlJFQUtET1dORUxFTUVOVF9QTEFOTkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFdmVudERyaXZlbiBmZWF0dXJlIHZhbHVlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4pOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBFdmVudERyaXZlbiBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIE9uZ29pbmcgZmVhdHVyZSB2YWx1ZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdvcmtCcmVha0Rvd25FbGVtZW50T25nb2luZygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9PTkdPSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT25nb2luZyBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX09OR09JTkcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIFJlcGVhdGFibGUgZmVhdHVyZSB2YWx1ZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdvcmtCcmVha0Rvd25FbGVtZW50UmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9SRVBFQVRBQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgUmVwZWF0YWJsZSBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudFJlcGVhdGFibGUoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX1JFUEVBVEFCTEUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZXNjcmlwdG9yT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX09QVElPTkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT3B0aW9uYWwgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JPcHRpb25hbChib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX09QVElPTkFMLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtdWx0aXBsZSBvY2N1cnJhbmNlcyBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX01VTFRJUExFX09DQ1VSUkFOQ0VTKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgTXVsdGlwbGUgT2NjdXJyYW5jZXMgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9NVUxUSVBMRV9PQ0NVUlJBTkNFUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcGxhbm5lZCBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JQbGFubmVkKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oREVTQ1JJUFRPUl9QTEFOTkVEKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgUGxhbm5lZCBmZWF0dXJlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvclBsYW5uZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9QTEFOTkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFdmVudERyaXZlbiBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKERFU0NSSVBUT1JfRVZFTlRfRFJJVkVOKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgRXZlbnREcml2ZW4gZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JFdmVudERyaXZlbihib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX0VWRU5UX0RSSVZFTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgT25nb2luZyBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JPbmdvaW5nKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oREVTQ1JJUFRPUl9PTkdPSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT25nb2luZyBmZWF0dXJlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvck9uZ29pbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9PTkdPSU5HLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyAiaW5jbHVkZSBkZXNjcmlwdG9ycyIgZmVhdHVyZSB2YWx1ZSBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9ERVNDUklQVE9SUyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdmFsdWUgZm9yICJpbmNsdWRlIGRlc2NyaXB0b3JzIiAgZmVhdHVyZSBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbmNsdWRlRGVzY3JpcHRvcnMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoSU5DTFVERV9ERVNDUklQVE9SUywgdmFsdWUpOwotCQlTdXBwb3J0aW5nRWxlbWVudERhdGEuc2V0RGVzY3JpcHRvckV4Y2x1c2l2ZU9wdGlvbighdmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIFJlcGVhdGFibGUgZmVhdHVyZSB2YWx1ZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZXNjcmlwdG9yUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKERFU0NSSVBUT1JfUkVQRUFUQUJMRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdmFsdWUgZm9yIFJlcGVhdGFibGUgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JSZXBlYXRhYmxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKERFU0NSSVBUT1JfUkVQRUFUQUJMRSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseURlZmF1bHRWYWx1ZXNGb3JCcmVha2Rvd25FbGVtZW50QXR0cmlidXRlcygpIHsKLQkJT2JqZWN0W10gbm9uRGVzY3JpcHRvckRlZmF1bHRWYWx1ZURlZnMgPSB7Ci0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50RXZlbnREcml2ZW4oKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE9uZ29pbmcoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50T3B0aW9uYWwoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRQbGFubmVkKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRSZXBlYXRhYmxlKCkpIH0gfTsKLQkJRUNsYXNzW10gbm9uRGVzY3JpcHRvclR5cGVzID0geyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkgfTsKLQotCQlPYmplY3RbXSBkZXNjcmlwdG9yRGVmYXVsdFZhbHVlRGVmcyA9IHsKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvckV2ZW50RHJpdmVuKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yT25nb2luZygpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvck9wdGlvbmFsKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JQbGFubmVkKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvclJlcGVhdGFibGUoKSkgfSB9OwotCQlFQ2xhc3NbXSBkZXNjcmlwdG9yVHlwZXMgPSB7IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB9OwotCi0JCU9iamVjdFtdIGRlZmF1bHRWYWx1ZURlZnMgPSB7Ci0JCQkJbmV3IE9iamVjdFtdIHsgbm9uRGVzY3JpcHRvclR5cGVzLAotCQkJCQkJbm9uRGVzY3JpcHRvckRlZmF1bHRWYWx1ZURlZnMgfSwKLQkJCQluZXcgT2JqZWN0W10geyBkZXNjcmlwdG9yVHlwZXMsIGRlc2NyaXB0b3JEZWZhdWx0VmFsdWVEZWZzIH0gfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRWYWx1ZURlZnMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdFtdIGRlZmF1bHRWYWx1ZURlZiA9IChPYmplY3RbXSkgZGVmYXVsdFZhbHVlRGVmc1tpXTsKLQkJCUVDbGFzc1tdIHR5cGVzID0gKEVDbGFzc1tdKSBkZWZhdWx0VmFsdWVEZWZbMF07Ci0JCQlPYmplY3RbXSBmZWF0dXJlRGVmYXVsdFZhbHVlRGVmcyA9IChPYmplY3RbXSkgZGVmYXVsdFZhbHVlRGVmWzFdOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBmZWF0dXJlRGVmYXVsdFZhbHVlRGVmcy5sZW5ndGg7IGsrKykgewotCQkJCU9iamVjdFtdIGZlYXR1cmVEZWZhdWx0VmFsdWUgPSAoT2JqZWN0W10pIGZlYXR1cmVEZWZhdWx0VmFsdWVEZWZzW2tdOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZURlZmF1bHRWYWx1ZVswXTsKLQkJCQlPYmplY3QgZGVmYXVsdFZhbHVlID0gZmVhdHVyZURlZmF1bHRWYWx1ZVsxXTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUVDbGFzcyB0eXBlID0gdHlwZXNbal07Ci0JCQkJCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsCi0JCQkJCQkJZGVmYXVsdFZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvUmVjZW50bHlPcGVuZWRMaWJyYXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvUmVjZW50bHlPcGVuZWRMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZWEzMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL1JlY2VudGx5T3BlbmVkTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBNb2RlbHMgYSByZWNlbnRseSBvcGVuZWQgbWV0aG9kIGxpYnJhcnkgcHJlZmVyZW5jZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWNlbnRseU9wZW5lZExpYnJhcnkgewotCi0JcHJpdmF0ZSBVUkkgdXJpOwotCQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJlY2VudGx5T3BlbmVkTGlicmFyeShTdHJpbmcgdXJpKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnVyaSA9IG5ldyBVUkkodXJpKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMudXJpKTsKLQkJCXRoaXMubmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJdGhpcy5wYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBVUkkuCi0JICovCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTg1OGEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3Byb3ZpZGVycy9BYnN0cmFjdEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0Fic3RyYWN0RWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjNzNjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0Fic3RyYWN0RWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgdHJlZSBjb250ZW50IHByb3ZpZGVyIGFuIGVsZW1lbnQgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgUGllcnJlIFBhZG92YW5pCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0NPTlRFTlQgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DT1JFX0NPTlRFTlQgPSAiQ29yZUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ0FURUdPUklFUyA9ICJDYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RJU0NJUExJTkVTID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RPTUFJTlMgPSAiRG9tYWlucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9XT1JLX1BST0RVQ1RfVFlQRVMgPSAiV1AgVHlwZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfUk9MRVNFVFMgPSAiUm9sZVNldHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfVE9PTFMgPSAiVG9vbHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ1VTVE9NX0NBVEVHT1JJRVMgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DQVBBQklMSVRZX1BBVFRFUk5TID0gIkNhcGFiaWxpdHlQYXR0ZXJucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9ERUxJVkVSWV9QUk9DRVNTRVMgPSAiRGVsaXZlcnlQcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTlRFTlQgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfbWV0aG9kQ29udGVudDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BBQ0tBR0VTID0gTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRUQ1Byb3ZpZGVyX2NvbnRlbnRQYWNrYWdlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFOREFSRF9DQVRFR09SSUVTID0gTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRUQ1Byb3ZpZGVyX3N0YW5kYXJkQ2F0ZWdvcmllczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FUyA9IExpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50VENQcm92aWRlcl9kaXNjaXBsaW5lczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET01BSU5TID0gTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRUQ1Byb3ZpZGVyX2RvbWFpbnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX1RZUEVTID0gTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRUQ1Byb3ZpZGVyX3dvcmtQcm9kdWN0VHlwZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNFVFMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfcm9sZVNldHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfdG9vbHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JJRVMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfY3VzdG9tQ2F0ZWdvcmllczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTRVMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfcHJvY2Vzc2VzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTlMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfY2FwYWJpbGl0eVBhdHRlcm5zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1NFUyA9IExpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50VENQcm92aWRlcl9kZWxpdmVyeVByb2Nlc3NlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcml2YXRlIE1hcDxPYmplY3QsIFNldDxPYmplY3Q+PiBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBTZXQ8T2JqZWN0Pj4oKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50TWFwID09IG51bGwpIHsKLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0JCVNldDxPYmplY3Q+IGNoaWxkcmVuID0gZWxlbWVudE1hcC5nZXQocGFyZW50RWxlbWVudCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcikgewotCQkJcmV0dXJuICgoRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcikgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgZWxlbWVudDsKLQkJCU9iamVjdCBwYXJlbnQgPSBwcm9jZXNzUGFja2FnZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnQ7Ci0JCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSAoTWV0aG9kUGFja2FnZSkgZWxlbWVudDsKLQkJCU9iamVjdCBwYXJlbnQgPSBtZXRob2RQYWNrYWdlLmVDb250YWluZXIoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJTWV0aG9kUGFja2FnZSBwYXJlbnRQYWNrYWdlID0gbWV0aG9kUGFja2FnZS5nZXRQYXJlbnRQYWNrYWdlKCk7Ci0JCQlyZXR1cm4gcGFyZW50UGFja2FnZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBlbGVtZW50OwotCQkJQXJ0aWZhY3QgY29udGFpbmVyQXJ0aWZhY3QgPSBhcnRpZmFjdC5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJaWYgKGNvbnRhaW5lckFydGlmYWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY29udGFpbmVyQXJ0aWZhY3Q7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBVbWFVdGlsLmdldENvbnRlbnRQYWNrYWdlKGFydGlmYWN0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKSBlbGVtZW50OwotCQkJcmV0dXJuIHByYWN0aWNlLmdldENvbnRhaW5lcigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgZWxlbWVudDsKLQkJCXJldHVybiBkaXNjaXBsaW5lLmdldENvbnRhaW5lcigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBlbGVtZW50OwotCQkJcmV0dXJuIGRvbWFpbi5nZXRDb250YWluZXIoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBVbWFVdGlsLmdldENvbnRlbnRQYWNrYWdlKChDb250ZW50RWxlbWVudCkgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKSBlbGVtZW50OwotCQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50ID0gKFByb2Nlc3NQYWNrYWdlKSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSBVbWFVdGlsCi0JCQkJCS5nZXRQcm9jZXNzUGFja2FnZSgoUHJvY2Vzc0VsZW1lbnQpIGVsZW1lbnQpOwotCQkJaWYgKHByb2Nlc3NQYWNrYWdlICE9IG51bGwpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKSBwcm9jZXNzUGFja2FnZQotCQkJCQkJLmdldFBhcmVudFBhY2thZ2UoKTsKLQkJCQlpZiAocGFyZW50UGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwYXJlbnRQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHBhcmVudFBhY2thZ2U7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJCX0KLQkJCQkJTGlzdDxQcm9jZXNzRWxlbWVudD4gcHJvY2Vzc0VsZW1lbnRzID0gcGFyZW50UGFja2FnZQotCQkJCQkJCS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCQkJZm9yIChQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA6IHByb2Nlc3NFbGVtZW50cykgewotCQkJCQkJaWYgKHByb2Nlc3NFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJJiYgcHJvY2Vzc0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJCQlwYXJlbnRQYWNrYWdlLmdldE5hbWUoKSkpIHsKLQkJCQkJCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IFVtYVV0aWwKLQkJCQkJLmdldFByb2Nlc3NQYWNrYWdlKChQcm9jZXNzRWxlbWVudCkgZWxlbWVudCk7Ci0JCQlpZiAocHJvY2Vzc1BhY2thZ2UgIT0gbnVsbCkgewotCQkJCWlmIChwcm9jZXNzUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHByb2Nlc3NQYWNrYWdlOwotCQkJCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IHByb2Nlc3NFbGVtZW50cyA9IHByb2Nlc3NQYWNrYWdlCi0JCQkJCQkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQkJZm9yIChQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA6IHByb2Nlc3NFbGVtZW50cykgewotCQkJCQlpZiAocHJvY2Vzc0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCSYmIHByb2Nlc3NFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCQlwcm9jZXNzUGFja2FnZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSB0aGF0IGlzIHBvcHVsYXRlZCBpbgotCSAqIHRoaXMgdHJlZS4KLQkgKiAKLQkgKiBJbXBsZW1lbnRvcnMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0Q29udGVudFNvdXJjZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KE9iamVjdCBjaGlsZCwgYm9vbGVhbiByZWZyZXNoVmlld2VyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoY2hpbGQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChpbnNlcnRDaGlsZChwYXJlbnQsIGNoaWxkKSkgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCXRyZWVWaWV3ZXIuYWRkKHBhcmVudCwgY2hpbGQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKHBhcmVudCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoaWxkID0gcGFyZW50OwotCQkJcGFyZW50ID0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJfQotCQlpZiAoaW5zZXJ0Q2hpbGQoZ2V0Q29udGVudFNvdXJjZSgpLCBjaGlsZCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJdHJlZVZpZXdlci5hZGQoZ2V0Q29udGVudFNvdXJjZSgpLCBjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRDaGlsZChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJU2V0PE9iamVjdD4gY2hpbGRyZW4gPSBlbGVtZW50TWFwLmdldChwYXJlbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQllbGVtZW50TWFwLnB1dChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwgT2JqZWN0IG5ld0NoaWxkKSB7Ci0JCWluc2VydChuZXdDaGlsZCwgZmFsc2UpOwotCQllbGVtZW50TWFwLnB1dChuZXdDaGlsZCwgZWxlbWVudE1hcC5nZXQoY2hpbGQpKTsKLQkJZWxlbWVudE1hcC5yZW1vdmUoY2hpbGQpOwotCQlTZXQ8T2JqZWN0PiBjaGlsZHJlbiA9IGVsZW1lbnRNYXAuZ2V0KHBhcmVudCk7Ci0JCWNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIGNsYXNzZXMgbXVzdCBvdmVycmlkZSBhbmQgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZnJlc2hWaWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcik7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tU2libGluZ3MoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKLQkJU2V0PE9iamVjdD4gc2libGluZ3MgPSBlbGVtZW50TWFwLmdldChwYXJlbnQpOwotCQlpZiAoc2libGluZ3MgIT0gbnVsbCkgewotCQkJc2libGluZ3MucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VUlGb2xkZXJzKE1ldGhvZFBsdWdpbiBlbGVtZW50KSB7Ci0JCUVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIgbWV0aG9kQ29udGVudEZvbGRlciA9IG5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCU1FVEhPRF9DT05URU5ULCBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db250ZW50IikpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyIHByb2Nlc3Nlc0ZvbGRlciA9IG5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCVBST0NFU1NFUywgRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc2VzIikpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3RbXSBtZXRob2RQYWNrYWdlcyA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZFBhY2thZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQlPYmplY3QgbWV0aG9kUGFja2FnZSA9IG1ldGhvZFBhY2thZ2VzW2pdOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQkmJiAoKENvbnRlbnRQYWNrYWdlKSBtZXRob2RQYWNrYWdlKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCVBLR19OQU1FX0NPTlRFTlQpKSB7Ci0JCQkJT2JqZWN0W10gcGFja2FnZXMgPSBnZXRDaGlsZHJlbihtZXRob2RQYWNrYWdlKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IHBhY2thZ2VzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCU9iamVjdCBwa2cgPSBwYWNrYWdlc1trXTsKLQkJCQkJaWYgKHBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQlpZiAoKChDb250ZW50UGFja2FnZSkgcGtnKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQlQS0dfTkFNRV9DT1JFX0NPTlRFTlQpKSB7Ci0JCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlwa2csCi0JCQkJCQkJCQluZXcgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcigKLQkJCQkJCQkJCQkJQ09OVEVOVF9QQUNLQUdFUywKLQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKSksIG1ldGhvZENvbnRlbnRGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIGlmICgoKENvbnRlbnRQYWNrYWdlKSBwa2cpLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCVBLR19OQU1FX0NBVEVHT1JJRVMpKSB7Ci0JCQkJCQkJRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlciBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIgPSBuZXcgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcigKLQkJCQkJCQkJCVNUQU5EQVJEX0NBVEVHT1JJRVMsCi0JCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkKLQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzIikpLCBtZXRob2RDb250ZW50Rm9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIgY3VzdG9tQ2F0ZWdvcmllc0ZvbGRlciA9IG5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCQkJCQkJQ1VTVE9NX0NBVEVHT1JJRVMsCi0JCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkKLQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcyIpKSwgbWV0aG9kQ29udGVudEZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlPYmplY3RbXSBjb250ZW50UGFja2FnZXMgPSBnZXRDaGlsZHJlbihwa2cpOwotCQkJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgY29udGVudFBhY2thZ2VzLmxlbmd0aDsgbCsrKSB7Ci0JCQkJCQkJCU9iamVjdCBjb250ZW50UGFja2FnZSA9IGNvbnRlbnRQYWNrYWdlc1tsXTsKLQkJCQkJCQkJaWYgKGNvbnRlbnRQYWNrYWdlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCQkJCVN0cmluZyBwa2dOYW1lID0gKChDb250ZW50UGFja2FnZSkgY29udGVudFBhY2thZ2UpCi0JCQkJCQkJCQkJCS5nZXROYW1lKCk7Ci0JCQkJCQkJCQlpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0NVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJCQkJCQkJCWluc2VydChjdXN0b21DYXRlZ29yaWVzRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCQkJCQkJZWxlbWVudE1hcC5wdXQoY3VzdG9tQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCWVsZW1lbnRNYXAuZ2V0KGNvbnRlbnRQYWNrYWdlKSk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ESVNDSVBMSU5FUykpIHsKLQkJCQkJCQkJCQlpbnNlcnQoc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCW5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlESVNDSVBMSU5FUywKLQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUuZXF1YWxzKFBLR19OQU1FX0RPTUFJTlMpKSB7Ci0JCQkJCQkJCQkJaW5zZXJ0KHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwgZmFsc2UpOwotCQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCQkJCQluZXcgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQkJRE9NQUlOUywKLQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpKSwgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX1dPUktfUFJPRFVDVF9UWVBFUykpIHsKLQkJCQkJCQkJCQlpbnNlcnQoc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCW5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlXT1JLX1BST0RVQ1RfVFlQRVMsCi0JCQkJCQkJCQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeQotCQkJCQkJCQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ST0xFU0VUUykpIHsKLQkJCQkJCQkJCQlpbnNlcnQoc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCW5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlST0xFU0VUUywKLQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUuZXF1YWxzKFBLR19OQU1FX1RPT0xTKSkgewotCQkJCQkJCQkJCWluc2VydChzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIsIGZhbHNlKTsKLQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJbmV3IEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIoCi0JCQkJCQkJCQkJCQkJCVRPT0xTLAotCQkJCQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgKLQkJCQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpKSwgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbGVtZW50TWFwLnJlbW92ZShwa2cpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgcGtnKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQkJUEtHX05BTUVfQ0FQQUJJTElUWV9QQVRURVJOUykpIHsKLQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCXBrZywKLQkJCQkJCQkJbmV3IEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIoCi0JCQkJCQkJCQkJQ0FQQUJJTElUWV9QQVRURVJOUywKLQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkKLQkJCQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpKSwgcHJvY2Vzc2VzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQlTZXQ8T2JqZWN0PiBjaGlsZHJlbiA9IChTZXQ8T2JqZWN0PikgZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJY2hpbGRyZW4ucmVtb3ZlKG1ldGhvZFBhY2thZ2UpOwotCQkJfSBlbHNlIGlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSkuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQlQS0dfTkFNRV9ERUxJVkVSWV9QUk9DRVNTRVMpKSB7Ci0JCQkJcmVwbGFjZSgKLQkJCQkJCWVsZW1lbnQsCi0JCQkJCQltZXRob2RQYWNrYWdlLAotCQkJCQkJbmV3IEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIoCi0JCQkJCQkJCURFTElWRVJZX1BST0NFU1NFUywKLQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMiKSksIHByb2Nlc3Nlc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIHRoZSBVSSBmb2xkZXJzIGludG8gdGhlIHNlYXJjaCByZXN1bHQgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRVSUZvbGRlcnMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWluc2VydFVJRm9sZGVycygoTWV0aG9kUGx1Z2luKSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHRlciBmb3IgdGhlIHRyZWUgdmlld2VyCi0JICogQHJldHVybiBUcmVlVmlld2VyCi0JICovCi0JcHVibGljIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0dGVyIGZvciB0aGUgdHJlZSB2aWV3ZXIuIENsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhpcyBhYnN0cmFjdCBjbGFzcyBtdXN0IGNhbGwKLQkgKiB0aGlzIG1ldGhvZCBhbmQgc2V0IHRoZSB0cmVlIHZpZXdlciBmcm9tIHdpdGhpbiB0aGVpciBpbnB1dENoYW5nZWQgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJlZVZpZXdlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJdGhpcy50cmVlVmlld2VyID0gdHJlZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXR0ZXIgZm9yIHRoZSBlbGVtZW50TWFwCi0JICogCi0JICogQHJldHVybiBlbGVtZW50TWFwCi0JICovCi0JcHVibGljIE1hcDxPYmplY3QsIFNldDxPYmplY3Q+PiBnZXRFbGVtZW50TWFwKCkgewotCQlyZXR1cm4gZWxlbWVudE1hcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRGVsZWdhdGVMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0RlbGVnYXRlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBmYjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRGVsZWdhdGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIElJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlcjsKLQotCXB1YmxpYyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIoSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlbUxhYmVsUHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0VsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjI0MDFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBNb2RlbHMgYSBVSSBmb2xkZXIgaW4gdGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0IHRyZWUgdmlldy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfSU1BR0UgPSBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBmb3IgdGhlIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcihTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIERFRkFVTFRfSU1BR0UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gaW1hZ2UgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKFN0cmluZyBuYW1lLCBJbWFnZSBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9sZGVyIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciBhIFVJIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9iamVjdCBmb3IgdGhlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0VsZW1lbnRUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3Byb3ZpZGVycy9FbGVtZW50VHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhZmQzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0VsZW1lbnRUcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdHJlZSBhbmQgdGFibGUgdmlld2Vycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50VHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFRyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcikgewotCQkJcmV0dXJuICgoRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcikgb2JqKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmopOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIpIG9iaikuZ2V0SW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvQ29udmVydEd1aWRhbmNlVHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvQ29udmVydEd1aWRhbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODZlNjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS91dGlsL0NvbnZlcnRHdWlkYW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotCi0vKioKLSAqIGNsYXNzIHRvIGNvbnZlcnQgZ3VpZGFuY2UgdHlwZXMKLSAqIAotICogQGF1dGhvciA/Pz8KLSAqIEBzaWNuZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0R3VpZGFuY2VUeXBlIHsKLQotCXN0YXRpYyBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBjb21wYXRpYmxlR3VpZGFuY2VzID0geyBVbWFQYWNrYWdlLkNPTkNFUFQsCi0JLy8gVW1hUGFja2FnZS5DSEVDS0xJU1QsCi0JCQkvLyBVbWFQYWNrYWdlLkVYQU1QTEUsCi0JCQlVbWFQYWNrYWdlLkdVSURFTElORSwKLQkJCS8vIFVtYVBhY2thZ2UuRVNUSU1BVEUsCi0JCQkvLyBVbWFQYWNrYWdlLkVTVElNQVRJTkdfTUVUUklDLAotCQkJLy8gVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TLAotCQkJLy8gVW1hUGFja2FnZS5SRVBPUlQsCi0JCQkvLyBVbWFQYWNrYWdlLlRFTVBMQVRFLAotCQkJVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMLAotCS8vIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1IsCi0JLy8gVW1hUGFja2FnZS5XSElURVBBUEVSLAotCS8vIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OLAotCS8vIFVtYVBhY2thZ2UuUFJBQ1RJQ0UsCi0JLy8gVW1hUGFja2FnZS5SRVVTQUJMRV9BU1NFVAotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGNvbXBhdGlibGVHdWlkYW5jZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUd1aWRhbmNlcy5sZW5ndGg7IGkrKykKLQkJCWNvbXBhdGlibGVHdWlkYW5jZXNMaXN0LmFkZChuZXcgSW50ZWdlcihjb21wYXRpYmxlR3VpZGFuY2VzW2ldKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHdWlkYW5jZSBjb252ZXJ0R3VpZGFuY2UoR3VpZGFuY2Ugb2xkR3VpZGFuY2UsIFNoZWxsIHNoZWxsLAotCQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gY29udmVydEd1aWRhbmNlKG9sZEd1aWRhbmNlLCBzaGVsbCwgY29tbWFuZCwgbnVsbCk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIEd1aWRhbmNlIGNvbnZlcnRHdWlkYW5jZShHdWlkYW5jZSBvbGRHdWlkYW5jZSwgU2hlbGwgc2hlbGwsCi0JCQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCwgRUNsYXNzIG5ld1R5cGUpIHsKLQkJaWYgKG5ld1R5cGUgPT0gbnVsbCkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCXNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJTGlzdERpYWxvZyBkbGcgPSBuZXcgTGlzdERpYWxvZyhzaGVsbCk7Ci0JCWRsZy5zZXRIZWlnaHRJbkNoYXJzKDUpOwotCQlkbGcuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZGxnLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlzd2l0Y2ggKCgoSW50ZWdlcikgZWxlbWVudCkuaW50VmFsdWUoKSkgewotCQkJCS8vIFRPRE86IHJlZmFjdG9yIHRoZXNlIHN0cmluZ3MgKGFuZCB0aGlzIHdob2xlIGRpYWxvZykgaW50bwotCQkJCS8vIGxpYnJhcnkudWkKLQkJCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuY29uY2VwdF90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5jaGVja2xpc3RfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORToKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuZ3VpZGVsaW5lX3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5yZXBvcnRfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy50ZW1wbGF0ZV90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy50b29sTWVudG9yX3RleHQ7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0OwotCQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRToKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMucHJhY3RpY2VfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5yZXVzYWJsZUFzc2V0X3RleHQ7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudW5rbm93bkd1aWRhbmNlX3RleHQ7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCQlMaXN0IG5ld0d1aWRhbmNlVHlwZUxpc3QgPSBnZXRWYWxpZE5ld0d1aWRhbmNlVHlwZXMob2xkR3VpZGFuY2UpOwotCQlpZiAobmV3R3VpZGFuY2VUeXBlTGlzdCA9PSBudWxsKSB7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlLAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMudW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2csCi0JCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy51bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbiwgU3RyVXRpbC50b0xvd2VyKFRuZ1V0aWwuZ2V0VHlwZVRleHQob2xkR3VpZGFuY2UpKSkpOyAKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWRsZy5zZXRJbnB1dChuZXdHdWlkYW5jZVR5cGVMaXN0KTsKLQkJZGxnLnNldFRpdGxlKExpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlKTsKLQkJZGxnLnNldE1lc3NhZ2UoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dCk7Ci0JCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlPYmplY3RbXSBzZWxlY3Rpb25SZXN1bHQgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCWlmIChzZWxlY3Rpb25SZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgY2hvc2VuR3VpZGFuY2UgPSAoKEludGVnZXIpIHNlbGVjdGlvblJlc3VsdFswXSkuaW50VmFsdWUoKTsKLQkJCi0vLwkJR3VpZGFuY2UgbmV3R3VpZGFuY2UgPSBkb0NvbnZlcnQob2xkR3VpZGFuY2UsIGNob3Nlbkd1aWRhbmNlLCBjb21tYW5kKTsKLQkJCi0JCW5ld1R5cGUgPSBnZXRHdWlkYW5jZVR5cGUoY2hvc2VuR3VpZGFuY2UpOwotCQl9Ci0JCQotCQlpZihuZXdUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVR5cGVDb252ZXJ0ZXIuVHlwZUNvbnZlcnNpb25Db21tYW5kIGNtZCA9IFR5cGVDb252ZXJ0ZXIuY3JlYXRlVHlwZUNvbnZlcnNpb25Db21tYW5kKG9sZEd1aWRhbmNlLCBuZXdUeXBlLCBudWxsLCBudWxsLCB0cnVlLCB0cnVlKTsKLQkJdHJ5IHsKLQkJCWlmKCFjbWQuZ2V0SWxsZWdhbFJlZmVyZW5jZXJzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gdHlwZSBjb252ZXJzaW9uIHdpbGwgcmVtb3ZlIHNvbWUgaWxsZWdhbCByZWZlcmVuY2VzCi0JCQkJLy8gY29uZmlybSB3aXRoIHVzZXIgYmVmb3JlIGNvbnRpbnVlCi0JCQkJLy8KLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbWQuZ2V0SWxsZWdhbFJlZmVyZW5jZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJLy8gZG9uJ3Qgc2hvdyBwcmVkZWZpbmVkIGVsZW1lbnQKLQkJCQkJLy8KLQkJCQkJaWYoIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKGUpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZWxlbWVudFR5cGVfdGV4dCwgZS5lQ2xhc3MoKS5nZXROYW1lKCksIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlKSk7IAotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1zZywKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobXVsdGlTdGF0dXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwICYmCi0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQsCi0JCQkJCQkJCW11bHRpU3RhdHVzKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCksIHNoZWxsKTsKLQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KExpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlLCBzdGF0dXMpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY21kLmV4ZWN1dGUoKTsKLQkJCUd1aWRhbmNlIG5ld0d1aWRhbmNlID0gKEd1aWRhbmNlKSBjbWQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJCS8vIHNhdmUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkvLwotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCX0KLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCi0JCQkJaWYoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24obmV3R3VpZGFuY2UpKSB7Ci0JCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihuZXdHdWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCQkJfQkJCQkKLQotCQkJCWNtZC5jb3B5UmVzb3VyY2VzKCk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlLAotCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2csCi0JCQkJCQkJCW5ld0d1aWRhbmNlLmdldE5hbWUoKSksCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCBlKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ld0d1aWRhbmNlOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoY21kICE9IG51bGwpIHsKLQkJCQl0cnkgeyBjbWQuZGlzcG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZEd1aWRhbmNlCi0JICogQHBhcmFtIG5ld0d1aWRhbmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoR3VpZGFuY2Ugb2xkR3VpZGFuY2UsIEd1aWRhbmNlIG5ld0d1aWRhbmNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JCQotCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKG9sZEd1aWRhbmNlLmVDb250YWluZXIoKQotCQkJCSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCQkJKENvbnRlbnRFbGVtZW50KSBuZXdHdWlkYW5jZSwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihuZXdHdWlkYW5jZSkpOwotCQkKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5ld0d1aWRhbmNlLmdldE5hbWUoKSk7Ci0JCQotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCVN0cmluZyBmZWF0dXJlVHh0ID0gVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBkbGdNc2cgPSBOTFMuYmluZCgKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIG5ld0d1aWRhbmNlLmdldE5hbWUoKSk7Ci0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgbmV3R3VpZGFuY2UuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCXJldHVybiB2YWxpZGF0b3IuaXNWYWxpZChuZXdUZXh0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZygKLQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJCWlmIChpbnB1dERsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGlucHV0RGxnLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVDbGFzcyBnZXRHdWlkYW5jZVR5cGUoaW50IG5ld0d1aWRhbmNlVHlwZSkgewotCQlzd2l0Y2ggKG5ld0d1aWRhbmNlVHlwZSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTkNFUFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DSEVDS0xJU1Q7Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVhBTVBMRTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUOwotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URU1QTEFURTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVVBQT1JUSU5HX01BVEVSSUFMOwotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MX01FTlRPUjsKLQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVSTV9ERUZJTklUSU9OOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVVU0FCTEVfQVNTRVQ7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEd1aWRhbmNlIGNyZWF0ZU5ld0d1aWRhbmNlKGludCBuZXdHdWlkYW5jZVR5cGUpIHsKLQkJc3dpdGNoIChuZXdHdWlkYW5jZVR5cGUpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdoaXRlcGFwZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFZhbGlkTmV3R3VpZGFuY2VUeXBlcyhHdWlkYW5jZSBvbGRHdWlkYW5jZSkgewotCQlpZiAob2xkR3VpZGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlZ2VyIG9sZEd1aWRhbmNlQ2xhc3NJRCA9IG5ldyBJbnRlZ2VyKG9sZEd1aWRhbmNlLmVDbGFzcygpCi0JCQkJLmdldENsYXNzaWZpZXJJRCgpKTsKLQkJaWYgKCFjb21wYXRpYmxlR3VpZGFuY2VzTGlzdC5jb250YWlucyhvbGRHdWlkYW5jZUNsYXNzSUQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgZ3VpZGFuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhdGlibGVHdWlkYW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUludGVnZXIgY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQgPSBuZXcgSW50ZWdlcigKLQkJCQkJY29tcGF0aWJsZUd1aWRhbmNlc1tpXSk7Ci0JCQlpZiAoIW9sZEd1aWRhbmNlQ2xhc3NJRC5lcXVhbHMoY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQpKQotCQkJCWd1aWRhbmNlTGlzdC5hZGQoY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQpOwotCQl9Ci0JCXJldHVybiBndWlkYW5jZUxpc3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvVHlwZUNvbnZlcnRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvVHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU0YWJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS91dGlsL1R5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSU9wcG9zaXRlRmVhdHVyZUxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db250ZW50UmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlQ29udmVydGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGFjdGl2aXR5RmVhdHVyZUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQlpZihhcmcwID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkKLQl9OwotCQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGEgb2JqZWN0IG9mIG5ldyB0eXBlIHNwZWNpZmllZCBieSA8Y29kZT5uZXdUeXBlPC9jb2RlPiB3aGlsZSBzdGlsbAotCSAqIHByZXNlcnZpbmcgYXMgbWFueSBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzIGFzIHBvc3NpYmxlCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBuZXdUeXBlCi0JICogQHBhcmFtIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAgbWFwIG9mIGZlYXR1cmUgb2YgPGNvZGU+b2JqZWN0PC9jb2RlPiB0byBmZWF0dXJlIG9mIDxjb2RlPm5ld1R5cGU8L2NvZGU+Ci0JICogQHJldHVybiBuZXcgb2JqZWN0IG9mIHR5cGUgPGNvZGU+bmV3VHlwZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVPYmplY3QgY29udmVydChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsCi0JCQlNYXAgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwgQ29tcGFyYXRvciBmZWF0dXJlQ29tcGFyYXRvciwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSAKLQl7Ci0JCVR5cGVDb252ZXJzaW9uQ29tbWFuZCBjbWQgPSBjcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQob2JqZWN0LCBuZXdUeXBlLCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBmZWF0dXJlQ29tcGFyYXRvcik7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcyA9IGNtZC5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQlpZighcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gbmV3IFJlc291cmNlW3Jlc291cmNlcy5zaXplKCldOwotCQkJcmVzb3VyY2VzLnRvQXJyYXkocmVzb3VyY2VBcnJheSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKS5jaGVja01vZGlmeShyZXNvdXJjZUFycmF5LCBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkuZ2V0VUlDb250ZXh0KCkpOwotCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKExpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGUsIG51bGwsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWNtZC5leGVjdXRlKCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQkJcmV0dXJuIChFT2JqZWN0KSBjbWQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQljbWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlc291cmNlQ29weVRhc2sgewotCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXI7Ci0JCU1ldGhvZEVsZW1lbnQgb3duZXI7Ci0JCVN0cmluZyBjb250ZW50OwotCQlTdHJpbmcgY29udGVudFBhdGg7Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHNjYW5uZXIKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBjb250ZW50Ci0JCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlQ29weVRhc2soQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyLCBNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zY2FubmVyID0gc2Nhbm5lcjsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCQl0aGlzLmNvbnRlbnRQYXRoID0gY29udGVudFBhdGg7Ci0JCX0JCi0JCQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZUNvbnZlcnNpb25Db21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCQlwcml2YXRlIENvbGxlY3Rpb248Pz4gcmVzdWx0OwotCQlwcml2YXRlIEVPYmplY3Qgb2JqZWN0OwotCQlwcml2YXRlIEhhc2hTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCQlwcml2YXRlIGJvb2xlYW4gZ290TW9kaWZpZWRSZXNvdXJjZXM7Ci0JCXByaXZhdGUgTGlzdDxSZXNvdXJjZUNvcHlUYXNrPiByZXNvdXJjZUNvcHlUYXNrczsKLQkJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIGlsbGVnYWxSZWZlcmVuY2VyczsKLQkJcHJpdmF0ZSBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yIG5lc3RlZENvbW1hbmRFeGNlY3V0b3I7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBUeXBlQ29udmVyc2lvbkNvbW1hbmQoRU9iamVjdCBvYmplY3QpIHsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCXJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZUNvcHlUYXNrcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VDb3B5VGFzaz4oKTsKLQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IgPSBuZXcgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcih0aGlzKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaWYoaWxsZWdhbFJlZmVyZW5jZXJzICE9IG51bGwpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlcnMuY2xlYXIoKTsKLQkJCX0KLQkJCWlmKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQkJfQotCQkJaWYocmVzb3VyY2VDb3B5VGFza3MgIT0gbnVsbCkgewotCQkJCXJlc291cmNlQ29weVRhc2tzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlpZihuZXN0ZWRDb21tYW5kRXhjZWN1dG9yICE9IG51bGwpIHsKLQkJCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCQkJCQotCQkvKioKLQkJICogR2V0cyByZWZlcmVuY2VycyB0aGF0IGJlY29tZSBpbGxlZ2FsIGFmdGVyIHRoZSB0eXBlIGNvbnZlcnNpb24KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldElsbGVnYWxSZWZlcmVuY2VycygpIHsKLQkJCWlmKGlsbGVnYWxSZWZlcmVuY2VycyA9PSBudWxsKSB7Ci0JCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCX0KLQkJCXJldHVybiBpbGxlZ2FsUmVmZXJlbmNlcnM7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZXMoKSB7Ci0JCQlpZighcmVzb3VyY2VDb3B5VGFza3MuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChSZXNvdXJjZUNvcHlUYXNrIHQgOiByZXNvdXJjZUNvcHlUYXNrcykgewotCQkJCQlGaWxlIG5ld1Jlc291cmNlUGF0aCA9IG5ldyBGaWxlKFJlc291cmNlSGVscGVyLmdldEFic29sdXRlRWxlbWVudFJlc291cmNlUGF0aCh0Lm93bmVyKSk7Ci0JCQkJCXQuc2Nhbm5lci5zZXRUYXJnZXRSb290UGF0aChuZXdSZXNvdXJjZVBhdGgpOwotCQkJCQlpZih0LmNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQkJdC5zY2FubmVyLnJlc29sdmVSZXNvdXJjZXModC5vd25lciwgdC5jb250ZW50LCB0LmNvbnRlbnRQYXRoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZvciAoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiB0Lm93bmVyLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJCQlPYmplY3QgdmFsdWUgPSB0Lm93bmVyLmVHZXQoYXR0cmlidXRlKTsKLQkJCQkJCQlpZih2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQkJCQl0LnNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyh0Lm93bmVyLCAoU3RyaW5nKSB2YWx1ZSwgdC5jb250ZW50UGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZighZ290TW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYoY21kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJCQkJUmVtb3ZlQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKFJlbW92ZUNvbW1hbmQpIGNtZDsKLQkJCQkJCUVPYmplY3Qgb3duZXIgPSByZW1vdmVDb21tYW5kLmdldE93bmVyKCk7Ci0JCQkJCQlSZXNvdXJjZSBvd25lclJlc291cmNlID0gb3duZXIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihvd25lclJlc291cmNlICE9IG51bGwgJiYgb3duZXJSZXNvdXJjZSAhPSByZXNvdXJjZSkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvd25lclJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCWlmKG93bmVyUmVzb3VyY2UgIT0gbnVsbCAmJiBvd25lciAhPSBvYmplY3QgJiYgIVVtYVV0aWwuaXNDb250YWluZWRCeShvd25lciwgb2JqZWN0KSkgewotCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2Vycy5hZGQob3duZXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoY21kIGluc3RhbmNlb2YgU2V0Q29tbWFuZCkgewotCQkJCQkJU2V0Q29tbWFuZCBzZXRDb21tYW5kID0gKFNldENvbW1hbmQpIGNtZDsKLQkJCQkJCUVPYmplY3Qgb3duZXIgPSBzZXRDb21tYW5kLmdldE93bmVyKCk7Ci0JCQkJCQlSZXNvdXJjZSBvd25lclJlc291cmNlID0gb3duZXIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihvd25lclJlc291cmNlICE9IG51bGwgJiYgb3duZXJSZXNvdXJjZSAhPSByZXNvdXJjZSAmJiBzZXRDb21tYW5kLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJRU9iamVjdCB2YWx1ZSA9IChFT2JqZWN0KSBzZXRDb21tYW5kLmdldFZhbHVlKCk7Ci0JCQkJCQkJaWYodmFsdWUgIT0gb2JqZWN0IHx8ICFVbWFVdGlsLmlzQ29udGFpbmVkQnkodmFsdWUsIG9iamVjdCkpIHsKLQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG93bmVyUmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKG93bmVyUmVzb3VyY2UgIT0gbnVsbCAmJiBvd25lciAhPSBvYmplY3QgJiYgIVVtYVV0aWwuaXNDb250YWluZWRCeShvd25lciwgb2JqZWN0KQotCQkJCQkJCQkmJiBzZXRDb21tYW5kLmdldFZhbHVlKCkgPT0gc2V0Q29tbWFuZC5nZXRGZWF0dXJlKCkuZ2V0RGVmYXVsdFZhbHVlKCkpIHsKLQkJCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcnMuYWRkKG93bmVyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlnb3RNb2RpZmllZFJlc291cmNlcyA9IHRydWU7Ci0JCQl9Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwobmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5nZXRNb2RpZmllZFJlc291cmNlcygpKTsJCQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0UmVzdWx0KENvbGxlY3Rpb248Pz4gcmVzdWx0KSB7Ci0JCQl0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFJlc3VsdCgpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJc3VwZXIuZXhlY3V0ZSgpOwkJCQotCQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLnVuZG9OZXN0ZWRDb21tYW5kcygpOwotCQkJc3VwZXIudW5kbygpOwotCQl9Ci0JCQotCQlwcml2YXRlIExpc3Q8Q29tbWFuZD4gY29tbWFuZExpc3QoKSB7Ci0JCQlyZXR1cm4gY29tbWFuZExpc3Q7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9iamVjdCBFT2JqZWN0Ci0JICogQHBhcmFtIG5ld1R5cGUgRUNsYXNzCi0JICogQHBhcmFtIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAgTWFwCi0JICogQHBhcmFtIGZlYXR1cmVDb21wYXJhdG9yIENvbXBhcmF0b3IKLQkgKiBAcmV0dXJuIFR5cGVDb252ZXJzaW9uQ29tbWFuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUNvbnZlcnNpb25Db21tYW5kIGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsIAotCQkJTWFwIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIENvbXBhcmF0b3IgZmVhdHVyZUNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChvYmplY3QsIG5ld1R5cGUsIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIGZlYXR1cmVDb21wYXJhdG9yLCBmYWxzZSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IEVPYmplY3QKLQkgKiBAcGFyYW0gbmV3VHlwZSBFQ2xhc3MKLQkgKiBAcGFyYW0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCBNYXAKLQkgKiBAcGFyYW0gZmVhdHVyZUNvbXBhcmF0b3IgQ29tcGFyYXRvcgotCSAqIEBwYXJhbSByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMgYm9vbGVhbgotCSAqIEBwYXJhbSByZW1vdmVWYXJpYWJpbGl0eSBib29sZWFuCi0JICogQHJldHVybiBUeXBlQ29udmVyc2lvbkNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVDb252ZXJzaW9uQ29tbWFuZCBjcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQoRU9iamVjdCBvYmplY3QsIEVDbGFzcyBuZXdUeXBlLCAKLQkJCU1hcCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBDb21wYXJhdG9yIGZlYXR1cmVDb21wYXJhdG9yLCAKLQkJCWJvb2xlYW4gcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCBib29sZWFuIHJlbW92ZVZhcmlhYmlsaXR5KSB7Ci0JCVR5cGVDb252ZXJzaW9uQ29tbWFuZCBjbWQgPSBuZXcgVHlwZUNvbnZlcnNpb25Db21tYW5kKG9iamVjdCk7Ci0JCUVPYmplY3QgbmV3T2JqZWN0ID0gcHJlcGFyZUNvbnZlcnQob2JqZWN0LCBuZXdUeXBlLCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBmZWF0dXJlQ29tcGFyYXRvciwgcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCByZW1vdmVWYXJpYWJpbGl0eSwgY21kKTsKLQkJCi0JCS8vIHJlcGxhY2Ugb2JqZWN0IHdpdGggbmV3T2JqZWN0IGluIHRoZSBvYmplY3QncyBjb250YWluZXIKLQkJLy8KLQkJRU9iamVjdCBjb250YWluZXIgPSBvYmplY3QuZUNvbnRhaW5lcigpOwotCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJRVJlZmVyZW5jZSByZWYgPSBvYmplY3QuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJY21kLmNvbW1hbmRMaXN0KCkuYWRkKDAsIG5ldyBTZXRDb21tYW5kKG51bGwsIGNvbnRhaW5lciwgcmVmLCBuZXdPYmplY3QsIGluZGV4KSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljbWQuY29tbWFuZExpc3QoKS5hZGQoMCwgbmV3IFNldENvbW1hbmQobnVsbCwgY29udGFpbmVyLCByZWYsIG5ld09iamVjdCkpOwotCQkJfQotCQl9Ci0JCQotCQljbWQuc2V0UmVzdWx0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3T2JqZWN0KSk7Ci0JCQotCQlyZXR1cm4gY21kOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250ZW50UmVzb3VyY2VTY2FubmVyIGNyZWF0ZVNjYW5uZXIoRU9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uICYmICEob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSkgewkJCQotCQkJRmlsZSBvbGRSZXNvdXJjZVBhdGggPSBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkpOwotCQkJU3RyaW5nIHJvb3RDb250ZW50cGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKChNZXRob2RFbGVtZW50KW9iamVjdCk7Ci0JCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcihvbGRSZXNvdXJjZVBhdGgsIG51bGwsIHJvb3RDb250ZW50cGF0aCwgbnVsbCk7Ci0JCQlyZXR1cm4gc2Nhbm5lcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCS8qKgotCSAqIFByZXBhcmVzIGEgY29tcG91bmQgY29tbWFuZCB0byBkbyBhIHR5cGUgY29udmVyc2lvbgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gbmV3VHlwZQotCSAqIEBwYXJhbSBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwCi0JICogQHBhcmFtIGZlYXR1cmVDb21wYXJhdG9yIHVzZWQgdG8gc29ydCB0aGUgZmVhdHVyZSBsaXN0IG9mIG9iamVjdCB0byBjb252ZXJ0IGJlZm9yZSBjb3B5aW5nL21vdmluZwotCSAqICAgICAgICBmZWF0dXJlIHZhbHVlcyB0byBuZXcgb2JqZWN0LgotCSAqIEBwYXJhbSByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMgaWYgdHJ1ZSB3aWxsIHJlbW92ZSBhbGwgaW5jb21pbmcgcmVmZXJlbmNlcyAKLQkgKiBAcGFyYW0gY29tcG91bmRDb21tYW5kCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFT2JqZWN0IHByZXBhcmVDb252ZXJ0KEVPYmplY3Qgb2JqZWN0LCBFQ2xhc3MgbmV3VHlwZSwgTWFwIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsCi0JCQlDb21wYXJhdG9yIGZlYXR1cmVDb21wYXJhdG9yLCBib29sZWFuIHJlbW92ZUluY29taW5nUmVmZXJlbmNlcywgYm9vbGVhbiByZW1vdmVWYXJpYWJpbGl0eSwKLQkJCVR5cGVDb252ZXJzaW9uQ29tbWFuZCBjb21wb3VuZENvbW1hbmQpIHsKLQkJRU9iamVjdCBuZXdPYmplY3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUobmV3VHlwZSk7Ci0JCQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkvLyBIYW5kbGUgaW5jb21pbmcgcmVmZXJlbmNlcy4KLQkJCS8vIElmIHJlbW92ZUluY29tbWluZ1JlZmVyZW5jZXMgaXMgZmFsc2UsIHJlZGlyZWN0IGFsbCBpbmNvbWluZyByZWZlcmVuY2VzIG9mIG9iamVjdCB0byBuZXdPYmplY3QKLQkJCS8vIElmIHJlbW92ZUluY29tbWluZ1JlZmVyZW5jZXMgaXMgdHJ1ZSwgcmVtb3ZlIGFsbCBvZiB0aGVtLgotCQkJLy8JCQkKLQotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmplY3Q7Ci0JCQlDb2xsZWN0aW9uIG9wcG9zaXRlRmVhdHVyZXMgPSBtZS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCQlpZighb3Bwb3NpdGVGZWF0dXJlcy5pc0VtcHR5KCkpIHsJCQkJCi0JCQkJCi0JCQkJLy8gbG9hZCBvcHBvc2l0ZSBmZWF0dXJlcwotCQkJCS8vCi0JCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYmplY3QpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0T3Bwb3NpdGVGZWF0dXJlTG9hZGVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIgbG9hZGVyID0gKElPcHBvc2l0ZUZlYXR1cmVMb2FkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlsb2FkZXIubG9hZE9wcG9zaXRlRmVhdHVyZXMoY29sbGVjdGlvbik7Ci0JCQkJfQotCQkJCQotCQkJCU1hcCByZWZlcmVuY2VyVG9GZWF0dXJlTGlzdE1hcCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlZmVyZW5jZU1hcChtZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlclRvRmVhdHVyZUxpc3RNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJRU9iamVjdCByZWZlcmVuY2VyID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKWVudHJ5LmdldFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVSZWZlcmVuY2UgZmVhdHVyZSA9IChFUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZighcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzICYmIGZlYXR1cmUuZ2V0RVR5cGUoKS5pc0luc3RhbmNlKG5ld09iamVjdCkpIHsKLQkJCQkJCQkvLyBuZXcgdHlwZSBpcyBjb21wYXRpYmxlLCByZWZlcmVuY2UgY2FuIGJlIHByZXNlcnZlZAotCQkJCQkJCS8vCi0JCQkJCQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgcmVmZXJlbmNlci5lR2V0KGZlYXR1cmUpOwotCQkJCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCByZWZlcmVuY2VyLCBmZWF0dXJlLCBuZXdPYmplY3QsIGluZGV4KSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIHJlZmVyZW5jZXIsIGZlYXR1cmUsIG5ld09iamVjdCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG5ldyB0eXBlIGlzIG5vdCBjb21wYXRpYmxlLCByZWZlcmVuY2UgbXVzdCBiZSByZW1vdmVkCi0JCQkJCQkJLy8KLQkJCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFJlbW92ZUNvbW1hbmQobnVsbCwgcmVmZXJlbmNlciwgZmVhdHVyZSwgb2JqZWN0KSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIHJlZmVyZW5jZXIsIGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNvcHkgYWxsIHRoZSBmZWF0dXJlcwotCQkvLwotCQlMaXN0IG5ld09iamVjdEZlYXR1cmVzID0gbmV3VHlwZS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCUxpc3Qgb2JqZWN0RmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KG9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkpOwotCQlpZihyZW1vdmVWYXJpYWJpbGl0eSkgewotCQkJb2JqZWN0RmVhdHVyZXMucmVtb3ZlKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0JCQlvYmplY3RGZWF0dXJlcy5yZW1vdmUoVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQkJfQotCQlpZihmZWF0dXJlQ29tcGFyYXRvciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KG9iamVjdEZlYXR1cmVzLCBmZWF0dXJlQ29tcGFyYXRvcik7Ci0JCX0KLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZighbmV3T2JqZWN0RmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlpZihvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IGYgPSBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLmdldChmZWF0dXJlKTsKLQkJCQkJaWYoZiAhPSBudWxsICYmIG5ld09iamVjdEZlYXR1cmVzLmNvbnRhaW5zKGYpKSB7Ci0JCQkJCQlmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZlYXR1cmUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmZWF0dXJlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZS5pc0NoYW5nZWFibGUoKSkgewkJCQkKLQkJCQlib29sZWFuIGZlYXR1cmVIYW5kbGVkID0gZmFsc2U7Ci0JCQkJaWYoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCQkJaWYocmVmID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OKSB7Ci0JCQkJCQlpZihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbigoTWV0aG9kRWxlbWVudCkgb2JqZWN0KSkgewotCQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0LmVHZXQocmVmKTsKLQkJCQkJCQlFQ2xhc3MgY29udGVudERlc2NUeXBlID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5nZXRDb250ZW50RGVzY3JpcHRpb25UeXBlKG5ld1R5cGUpOwotCQkJCQkJCWlmKGNvbnRlbnREZXNjVHlwZSAhPSBudWxsICYmIGNvbnRlbnREZXNjVHlwZSAhPSBjb250ZW50LmVDbGFzcygpKSB7Ci0JCQkJCQkJCUVPYmplY3QgbmV3Q29udGVudCA9IHByZXBhcmVDb252ZXJ0KGNvbnRlbnQsIGNvbnRlbnREZXNjVHlwZSwgbnVsbCwgbnVsbCwgcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCByZW1vdmVWYXJpYWJpbGl0eSwgY29tcG91bmRDb21tYW5kKTsKLQkJCQkJCQkJCi0JCQkJCQkJCS8vIHJlbW92ZSBvbGQgY29udGVudAotCQkJCQkJCQkvLwotCQkJCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGNvbnRlbnQuZUNvbnRhaW5lcigpOwotCQkJCQkJCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBvYmplY3QsIHJlZiwgbnVsbCkpOwotCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250ZW50LmVSZXNvdXJjZSgpOwotCQkJCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5tb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCWNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBuZXdDb250ZW50OwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJY29tcG91bmRDb21tYW5kLnJlc291cmNlQ29weVRhc2tzLmFkZChuZXcgUmVzb3VyY2VDb3B5VGFzayhjcmVhdGVTY2FubmVyKGNvbnRlbnQpLCBjb250ZW50LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgbmV3T2JqZWN0LCByZWYsIGNvbnRlbnQpKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVIYW5kbGVkID0gdHJ1ZTsKLQkJCQkJfQkJCQkJCi0JCQkJCWVsc2UgaWYoIXJlZi5pc0NvbnRhaW5tZW50KCkgJiYgcmVmLmdldEVPcHBvc2l0ZSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIFJlZmVyZW5jZSBpcyBiaS1kaXJlY3Rpb25hbC4gSWYgb3Bwb3NpdGUgcmVmZXJlbmNlIGlzIGEgbGlzdCwgcmVwbGFjZSBvYmplY3QKLQkJCQkJCS8vIHdpdGggbmV3IG9iamVjdCBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgbGlzdC4KLQkJCQkJCS8vCi0JCQkJCQlFUmVmZXJlbmNlIG9wcG9zaXRlUmVmID0gcmVmLmdldEVPcHBvc2l0ZSgpOwkJCQkJCQotCQkJCQkJaWYob3Bwb3NpdGVSZWYuaXNNYW55KCkpIHsKLQkJCQkJCQlPYmplY3QgdmFsdWUgPSBvYmplY3QuZUdldChyZWYpOwotCQkJCQkJCWlmKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKXZhbHVlKQotCQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUVPYmplY3Qgb3RoZXJFbmQgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvdGhlckVuZC5lR2V0KG9wcG9zaXRlUmVmKTsKLQkJCQkJCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIG90aGVyRW5kLCBvcHBvc2l0ZVJlZiwgbmV3T2JqZWN0LCBpbmRleCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJRU9iamVjdCBvdGhlckVuZCA9IChFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvdGhlckVuZC5lR2V0KG9wcG9zaXRlUmVmKTsKLQkJCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBvdGhlckVuZCwgb3Bwb3NpdGVSZWYsIG5ld09iamVjdCwgaW5kZXgpKTsJCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZmVhdHVyZUhhbmRsZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFmZWF0dXJlSGFuZGxlZCkgewotCQkJCQlPYmplY3QgdmFsdWUgPSBvYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKSB7Ci0JCQkJCQkvLyB2YWxpZGF0ZSBuYW1lCi0JCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGNoZWNrTmFtZShvYmplY3QsIG5ld1R5cGUpOwotCQkJCQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCQkJCXZhbHVlID0gbmV3TmFtZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihzY2FubmVyICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQkJaWYoIVN0clV0aWwuaXNCbGFuayhzdHIpKSB7Ci0JCQkJCQkJY29tcG91bmRDb21tYW5kLnJlc291cmNlQ29weVRhc2tzLmFkZChuZXcgUmVzb3VyY2VDb3B5VGFzayhzY2FubmVyLCAoTWV0aG9kRWxlbWVudClvYmplY3QsIHN0ciwgIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgbmV3T2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQkJCi0JCXJldHVybiBuZXdPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYW4gYWN0aXZpdHkgdG8gbmV3IHR5cGUuCi0JICogCi0JICogQHBhcmFtIG9sZEFjdGl2aXR5IEFjdGl2aXR5Ci0JICogQHBhcmFtIG5ld1R5cGUgRUNsYXNzCi0JICogQHJldHVybiBBY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgY29udmVydEFjdGl2aXR5KEFjdGl2aXR5IG9sZEFjdGl2aXR5LCBFQ2xhc3MgbmV3VHlwZSkgewotCQkvLyBhY3Rpdml0eSBpcyBhbHJlYWR5IHRoaXMgdHlwZQotCQkvLwotCQlpZiAobmV3VHlwZSA9PSBvbGRBY3Rpdml0eS5lQ2xhc3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUhhc2hTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCUFjdGl2aXR5IG5ld0FjdGl2aXR5ID0gKEFjdGl2aXR5KSBUeXBlQ29udmVydGVyLmNvbnZlcnQob2xkQWN0aXZpdHksIG5ld1R5cGUsIG51bGwsIGFjdGl2aXR5RmVhdHVyZUNvbXBhcmF0b3IsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBtYWtlIG9sZEFjdGl2aXR5IGEgcHJveHkgc28gcmVmZXJlbmNlIHRvIGl0IGNhbiBiZSByZXNvbHZlZCB0byBuZXdBY3Rpdml0eQotCQkvLwotCQlVUkkgdXJpID0gUGVyc2lzdGVuY2VVdGlsLmdldFByb3h5VVJJKG5ld0FjdGl2aXR5KTsKLQkJKChJbnRlcm5hbEVPYmplY3Qpb2xkQWN0aXZpdHkpLmVTZXRQcm94eVVSSSh1cmkpOwotCQkJCQotCQkvLyBzYXZlIG1vZGlmaWVkIHJlc291cmNlcwotCQkvLwotCQlpZiAoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChSZXNvdXJjZSByZXMgOiBtb2RpZmllZFJlc291cmNlcykgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXMpOwotCQkJCX0KLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGUsCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2csCi0JCQkJCQkJCQkJCQluZXdBY3Rpdml0eS5nZXROYW1lKCkpLAotCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7Ci0KLQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ld0FjdGl2aXR5OwotCX0JCQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0eXBlSUQgaW50Ci0JICogQHJldHVybiBFQ2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVDbGFzcyBnZXRBY3Rpdml0eVR5cGUoaW50IHR5cGVJRCkgewotCQlzd2l0Y2ggKHR5cGVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWTsKLQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLklURVJBVElPTjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEhBU0U7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEBwYXJhbSBvbGRHdWlkYW5jZQotCSAqIEBwYXJhbSBuZXdHdWlkYW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEVPYmplY3Qgb2JqZWN0LCBFQ2xhc3MgbmV3VHlwZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudClvYmplY3Q7Ci0JCQlmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoZS5lQ29udGFpbmVyKCksIGUsIG5ld1R5cGUpOwotCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGUuZ2V0TmFtZSgpKTsKLQkJCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZlYXR1cmVUeHQgPSBUbmdVdGlsLmdldEZlYXR1cmVUZXh0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQkJU3RyVXRpbC50b0xvd2VyKGZlYXR1cmVUeHQpLCBlLmdldE5hbWUoKSk7Ci0JCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIGUuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQotCQkJCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCQl9Ci0JCQkJfTsKLQkKLQkJCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZygKLQkJCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgdGl0bGUsIGRsZ01zZywgY3VycmVudFZhbHVlLAotCQkJCQkJaW5wdXRWYWxpZGF0b3IpOwotCQkJCWlmIChpbnB1dERsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlucHV0RGxnLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhNzJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciBhIHByb2Nlc3MgdHJlZS4KLSAqIDxwPgotICogRGlzcGxheXMgdGhlIHRyZWUgaW4gdGhlIGZvbGxvd2luZyBoaWVyYXJjaHk6Ci0gKiA8dWw+Ci0gKiA8bGk+bWV0aG9kX3BsdWdpbl8xPC9saT4KLSAqIDx1bD4KLSAqIDxsaT4iQ2FwYWJpbGl0eSBQYXR0ZXJucyIgVUkgZm9sZGVyPC9saT4KLSAqIDx1bD4KLSAqIDxsaT5jYXBhYmlsaXR5X3BhdHRlcm5fMTwvbGk+Ci0gKiA8bGk+Y2FwYWJpbGl0eV9wYXR0ZXJuXzI8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8bGk+IkRlbGl2ZXJ5IFByb2Nlc3NlcyIgVUkgZm9sZGVyPC9saT4KLSAqIDx1bD4KLSAqIDxsaT5kZWxpdmVyeV9wcm9jZXNzXzE8L2xpPgotICogPGxpPmRlbGl2ZXJ5X3Byb2Nlc3NfMjwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiA8L2xpPgotICogPGxpPm1ldGhvZF9wbHVnaW5fMjwvbGk+Ci0gKiA8dWw+Ci0gKiA8bGk+IkNhcGFiaWxpdHkgUGF0dGVybnMiIFVJIGZvbGRlcjwvbGk+Ci0gKiA8L2xpPgotICogPGxpPiJEZWxpdmVyeSBQcm9jZXNzZXMiIFVJIGZvbGRlcjwvbGk+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOUyA9IExpYnJhcnlVSVJlc291cmNlcy5jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1NFUyA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJvdGVjdGVkIE1hcDxNZXRob2RQbHVnaW4sIFByb2Nlc3NUcmVlVUlGb2xkZXI+IGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzID0gbmV3IEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBQcm9jZXNzVHJlZVVJRm9sZGVyPigpOwotCi0JcHJvdGVjdGVkIE1hcDxNZXRob2RQbHVnaW4sIFByb2Nlc3NUcmVlVUlGb2xkZXI+IGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycyA9IG5ldyBIYXNoTWFwPE1ldGhvZFBsdWdpbiwgUHJvY2Vzc1RyZWVVSUZvbGRlcj4oKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucyA9ICgoTWV0aG9kTGlicmFyeSkgcGFyZW50RWxlbWVudCkKLQkJCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdC5uZXh0KCk7Ci0JCQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQkJCWlmIChwcm9jZXNzZXMuc2l6ZSgpID4gMCkgewotCQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBwYXJlbnRFbGVtZW50OwotCi0JCQlQcm9jZXNzVHJlZVVJRm9sZGVyIGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXIgPSBjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycwotCQkJCQkuZ2V0KHBsdWdpbik7Ci0JCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9PSBudWxsKSB7Ci0JCQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9IG5ldyBQcm9jZXNzVHJlZVVJRm9sZGVyKAotCQkJCQkJQ0FQQUJJTElUWV9QQVRURVJOUywKLQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMiKSksIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcnMucHV0KHBsdWdpbiwKLQkJCQkJCWNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXIpOwotCQkJfQotCi0JCQlQcm9jZXNzVHJlZVVJRm9sZGVyIGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVyID0gZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXJzCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWlmIChkZWxpdmVyeVByb2Nlc3NVSUZvbGRlciA9PSBudWxsKSB7Ci0JCQkJZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgPSBuZXcgUHJvY2Vzc1RyZWVVSUZvbGRlcigKLQkJCQkJCURFTElWRVJZX1BST0NFU1NFUywKLQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpKSwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMucHV0KHBsdWdpbiwgZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciwKLQkJCQkJZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgfTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJUHJvY2Vzc1RyZWVVSUZvbGRlciB1aUZvbGRlciA9IChQcm9jZXNzVHJlZVVJRm9sZGVyKSBwYXJlbnRFbGVtZW50OwotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHVpRm9sZGVyLmdldFBhcmVudCgpOwotCQkJaWYgKHVpRm9sZGVyLmdldE5hbWUoKSA9PSBDQVBBQklMSVRZX1BBVFRFUk5TKSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDYXBhYmlsaXR5UGF0dGVybnMocGx1Z2luKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXREZWxpdmVyeVByb2Nlc3NlcyhwbHVnaW4pCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc1RyZWVVSUZvbGRlcikgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChDYXBhYmlsaXR5UGF0dGVybikgZWxlbWVudCk7Ci0JCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcnMuZ2V0KHBsdWdpbik7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbigoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50KTsKLQkJCXJldHVybiBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMuZ2V0KHBsdWdpbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycy5jbGVhcigpOwotCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhMTY1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJbmV3IFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc1RyZWVVSUZvbGRlcikgb2JqKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmopOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NUcmVlVUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NUcmVlVUlGb2xkZXIpIG9iaikuZ2V0SW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVVJRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTJlNGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBNb2RlbHMgYSBVSSBmb2xkZXIgaW4gdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVVSUZvbGRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0lNQUdFID0gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoIAotCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Gb2xkZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgZm9sZGVyCi0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVUlGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVVJRm9sZGVyKFN0cmluZyBuYW1lLCBPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMobmFtZSwgREVGQVVMVF9JTUFHRSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIGFuIGltYWdlIGZvciB0aGUgZm9sZGVyCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVVSUZvbGRlcihTdHJpbmcgbmFtZSwgSW1hZ2UgaW1hZ2UsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgYSBVSSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvYmplY3QgZm9yIHRoZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwYXJlbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgZ2l2ZW4gcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb2xkZXIgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMDIzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERpc3BsYXlzIGEgdHJlZSB2aWV3IHRoYXQgYWxsb3dzIGEgdXNlciB0byBzZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IKLSAqIGRlbGl2ZXJ5IHByb2Nlc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVWaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IFByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1ZpZXcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTU0NjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1ZpZXcgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9EaXJlY3RvcnlWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0RpcmVjdG9yeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZjY2FlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0RpcmVjdG9yeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgdmFsaWRhdGluZyBhbmQgY3JlYXRpbmcgYSBkaXJlY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc1MDAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODIwNTYKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYW5kIGNyZWF0ZXMgYSBnaXZlbiBkaXJlY3RvcnkuCi0JICogPHA+Ci0JICogRGlzcGxheXMgYW4gZXJyb3IgZGlhbG9nIGlmIHRoZSBkaXJlY3RvcnkgcGF0aCBpcyBub3QgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgVGhlIHBhdGggdG8gYmUgdmFsaWRhdGVkIGFuZCBjcmVhdGVkLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIGRpYWxvZyB0aXRsZS4KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGF0aCBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpciwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIGVycm9yTXNnKSB7CQkKLQkJYm9vbGVhbiBhbnN3ZXIgPSBmYWxzZTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJYW5zd2VyID0gTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQl0aXRsZSwKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNDb25maXJtYXRpb25fbXNnLAotCQkJCQkJCQkJCQkJZGlyKSk7Ci0JCQkJaWYgKGFuc3dlciA9PSB0cnVlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhbnN3ZXIgPSBGaWxlVXRpbAotCQkJCQkJCQkuZGVsZXRlQWxsRmlsZXMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlpZiAoYW5zd2VyID09IGZhbHNlKSB7Ci0JCQkJCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCXRpdGxlLAotCQkJCQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJCQlkaXIpKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCXRpdGxlLAotCQkJCQkJCQkJCWVycm9yTXNnLAotCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJZGlyKSwgZSk7Ci0JCQkJCQlhbnN3ZXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYW5zd2VyID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLS8vCQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgewotLy8JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0vLwkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5pbnZhbGlkUGF0aF9tc2cpOwotLy8JCQkJYW5zd2VyID0gZmFsc2U7Ci0vLwkJCX0gZWxzZSB7Ci0KLQkJCQl0cnkgewotCQkJCQlpZiAoZmlsZS5ta2RpcnMoKSA9PSBmYWxzZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCQkJZXJyb3JNc2csCi0JCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmNyZWF0ZVBhdGhFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJYW5zd2VyID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhbnN3ZXIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsCi0JCQkJCQkJZXJyb3JNc2csCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY3JlYXRlUGF0aEVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCWRpciksIGUpOwotCQkJCQlhbnN3ZXIgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0vLwkJfQotCi0JCXJldHVybiBhbnN3ZXI7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlcyBhbmQgY3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiA8cD4KLQkgKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgaWYgdGhlIGRpcmVjdG9yeSBwYXRoIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBUaGUgcGF0aCB0byBiZSB2YWxpZGF0ZWQgYW5kIGNyZWF0ZWQuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgZGlhbG9nIHRpdGxlLgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIGFsbG93Q3VycmVudExpYlBhdGgKLQkgKiAJCQkgIEFsbG93IHBhdGhzIGNvbnRhaW5pbmcgY3VycmVudCBsaWJyYXJ5IG9yIG5vdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGF0aCBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpciwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIGVycm9yTXNnLCBib29sZWFuIGFsbG93Q3VycmVudExpYlBhdGgpIHsKLQkJaWYoIWFsbG93Q3VycmVudExpYlBhdGgpewotCQkJU3RyaW5nIGN1cnJlbnRMaWJQYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCQlpZiAoY3VycmVudExpYlBhdGggIT0gbnVsbCkgewotCQkJCVN0cmluZyB0YXJnZXRQYXRoRmlsZVN0ciA9IG5ldyBGaWxlKGRpcikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJU3RyaW5nIGxpYlBhdGhGaWxlU3RyID0gbmV3IEZpbGUoY3VycmVudExpYlBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJCWlmIChsaWJQYXRoRmlsZVN0ci5lcXVhbHModGFyZ2V0UGF0aEZpbGVTdHIpKSB7Ci0vLwkJCQlpZihkaXIuc3RhcnRzV2l0aChjdXJyZW50TGliUGF0aCkgfHwgY3VycmVudExpYlBhdGguc3RhcnRzV2l0aChkaXIpKXsKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS4KLQkJCQkJZGlzcGxheUVycm9yKHRpdGxlLCBMaWJyYXJ5VUlSZXNvdXJjZXMub3ZlcnJpZGVDdXJyZW50TGlicmFyeUVycm9yX21zZzApOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGVja0FuZENyZWF0ZURpcihkaXIsIHRpdGxlLCBlcnJvck1zZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTGlicmFyeUJhY2t1cFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0xpYnJhcnlCYWNrdXBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MTM1YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTGlicmFyeUJhY2t1cFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5MaWJyYXJ5QmFja3VwRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBiYWNrIHVwIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlCYWNrdXBVdGlsIHsKLQotCXByaXZhdGUgU3RyaW5nIHBhdGggPSBudWxsOwotCi0JLyoqCi0JICogUHJvbXB0cyB0byBiYWNrdXAgdGhlIGN1cnJlbnQgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9tcHRCYWNrdXBDdXJyZW50TGlicmFyeShTaGVsbCBzaGVsbCwgSUxpYnJhcnlTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJU3RyaW5nIGxpYlBhdGhTdHIgPSBzZXJ2aWNlLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJRmlsZSBsaWJQYXRoID0gbmV3IEZpbGUobGliUGF0aFN0cik7Ci0JCW5ldyBMaWJyYXJ5QmFja3VwVXRpbCgpLmRvQmFja3VwKHNoZWxsLCBsaWJQYXRoLCBzZXJ2aWNlKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJvbXB0cyB0byBiYWNrdXAgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb21wdEJhY2t1cExpYnJhcnkoU2hlbGwgc2hlbGwsIEZpbGUgbGliUGF0aCkgewotCQluZXcgTGlicmFyeUJhY2t1cFV0aWwoKS5kb0JhY2t1cChzaGVsbCwgbGliUGF0aCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvQmFja3VwKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBGaWxlIGxpYlBhdGgsIElMaWJyYXJ5U2VydmljZSBzZXJ2aWNlKSB7Ci0JCXBhdGggPSBudWxsOwotCQlmaW5hbCBJTGlicmFyeVNlcnZpY2UgZnNlcnZpY2UgPSBzZXJ2aWNlOwotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNoZWxsIHMgPSBzaGVsbDsKLQkJCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJCXMgPSBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHMgPT0gbnVsbCkgewotCQkJCQlzID0gbmV3IFNoZWxsKE1zZ0JveC5nZXREaXNwbGF5KCkpOwotCQkJCX0KLQotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlVSVJlc291cmNlcy5iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVVJUmVzb3VyY2VzLmJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dDsKLQkJCQlTdHJpbmcgYmFja3VwUGF0aCA9IGxpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLmJhY2t1cCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkJCQlMaWJyYXJ5QmFja3VwRGlhbG9nIGRsZyA9IG5ldyBMaWJyYXJ5QmFja3VwRGlhbG9nKHMsIHRpdGxlLAotCQkJCQkJbWVzc2FnZSwgYmFja3VwUGF0aCk7Ci0KLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCQkJcGF0aCA9IGRsZy5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJCQotCQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2cocyk7Ci0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWUsCi0JCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGZzZXJ2aWNlID09IG51bGwpIHsKLQkJCQkJCQkJYmFja3VwKGxpYlBhdGgsIG5ldyBGaWxlKHBhdGgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlmc2VydmljZS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5iYWNrdXBNZXRob2RMaWJyYXJ5KHBhdGgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJcG1EaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBCYWNrIHVwIGxpYnJhcnkgCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSBkZXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJhY2t1cChmaW5hbCBGaWxlIHNvdXJjZSwgZmluYWwgRmlsZSBkZXN0KSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGV4Y3VkZSB0aGUgbm9uLWxpYnJhcnkgZmlsZXMgdGhhdCBtaWdodCBiZSBsb2NrZWQgYnkgcm1jLgotCQkJCQkvLyB0aGVzZSBmaWxlcyBtYXkgY2F1c2UgYmFja3VwIHRvIGZhaWwgZHVlIHRvIGZpbGUgbG9jay4KLQkJCQkJU3RyaW5nIGV4Y2x1ZGVzID0gIi5sb2NrIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihzb3VyY2UsIGRlc3QsICIqKiIsIGV4Y2x1ZGVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCUxpYnJhcnlVSVJlc291cmNlcy5iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWEwNjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBOZXcgTWV0aG9kIExpYnJhcnkgd2l6YXJkIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3TGlicmFyeVdpemFyZFBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkUGFnZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTWFwIGdldFNlbGVjdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5MDk5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkRlYnVnVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBOZXcgTGlicmFyeSB3aXphcmQgcGFnZXMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmV3TGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAibmV3TGlicmFyeVdpemFyZFBhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSWYgdHJ1ZSwgZGVidWcgdHJhY2luZyBpcyBlbmFibGVkLgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiB3aXphcmQgcGFnZSBwcm92aWRlcnMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gd2l6YXJkUGFnZVByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24+KCk7Ci0KLQkvLyBBIGxpc3Qgb2Ygd2l6YXJkIHBhZ2UgaW5zdGFuY2VzLgotCXByaXZhdGUgTWFwPFN0cmluZywgTmV3TGlicmFyeVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBOZXdMaWJyYXJ5V2l6YXJkUGFnZT4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImluaXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0eXBlSWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJpbml0IiwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCSJjb25maWdFbGVtZW50LCBjbGFzcz0iICsgY2xhc3NOYW1lICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiLCB0eXBlPSIgKyB0eXBlSWQgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSIsIHRpdGxlPSIgKyB0aXRsZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0eXBlSWQgIT0gbnVsbCAmJiB0eXBlSWQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0aXRsZSAhPSBudWxsICYmIHRpdGxlLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgZGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJaWYgKCF3aXphcmRQYWdlUHJvdmlkZXJzLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKLQkJCQkJCQkJTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSBuZXcgTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIHR5cGVJZCwgdGl0bGUsCi0JCQkJCQkJCQkJZGVzY3JpcHRpb24pOwotCQkJCQkJCQl3aXphcmRQYWdlUHJvdmlkZXJzLnB1dCh0eXBlSWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5OZXdMaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZFBhZ2UgY3JlYXRlV2l6YXJkUGFnZShTdHJpbmcgcGFnZUlkLCBTdHJpbmcgdHlwZUlkKSB7Ci0JCU5ld0xpYnJhcnlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoTmV3TGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQkJfQotCi0JCU5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHByb3ZpZGVyID0gKE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKSB3aXphcmRQYWdlUHJvdmlkZXJzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IHByb3ZpZGVyLmdldEJ1bmRsZSgpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHByb3ZpZGVyLmdldENsYXNzTmFtZSgpOwotCQkJQ2xhc3Mgd2l6YXJkUGFnZUNsYXNzOwotCQkJQ2xhc3NbXSBhcmdDbGFzcyA9IG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH07Ci0JCQlPYmplY3RbXSBhcmdWYWx1ZSA9IG5ldyBPYmplY3RbXSB7IHBhZ2VJZCB9OwotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3I7Ci0JCQl0cnkgewotCQkJCXdpemFyZFBhZ2VDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQljb25zdHJ1Y3RvciA9IHdpemFyZFBhZ2VDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzcyk7Ci0JCQkJd2l6YXJkUGFnZSA9IChOZXdMaWJyYXJ5V2l6YXJkUGFnZSkgY29uc3RydWN0b3IKLQkJCQkJCS5uZXdJbnN0YW5jZShhcmdWYWx1ZSk7Ci0JCQkJd2l6YXJkUGFnZS5zZXRUaXRsZShwcm92aWRlci5nZXRUaXRsZSgpKTsKLQkJCQl3aXphcmRQYWdlLnNldERlc2NyaXB0aW9uKHByb3ZpZGVyLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCXdpemFyZFBhZ2VzLnB1dCh0eXBlSWQsIHdpemFyZFBhZ2UpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb3IgY2FjaGVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5OZXdMaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlIGdldFdpemFyZFBhZ2UoU3RyaW5nIHR5cGVJZCkgewotCQlyZXR1cm4gKE5ld0xpYnJhcnlXaXphcmRQYWdlKSB3aXphcmRQYWdlcy5nZXQodHlwZUlkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1YjMyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeU1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwYXRoIHRvIG9wZW4gYSBtZXRob2QKLSAqIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlNYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE9wZW5MaWJyYXJ5TWFpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJ0eXBlSWQiOyAvLyROT04tTkxTLTEkCQotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgcGF0aExhYmVsOwotCi0JcHJvdGVjdGVkIENvbWJvIGxpYnJhcnlQYXRoQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgbGlicmFyeVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHdpemFyZCBwYWdlIG5hbWUKLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlNYWluUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vT3Blbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeU1haW5QYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAzKTsKLQotCQlwYXRoTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5wYXRoTGFiZWxfdGV4dCk7Ci0KLQkJbGlicmFyeVBhdGhDb21ibyA9IGNyZWF0ZUNvbWJvYm94KGNvbXBvc2l0ZSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJTGlzdDxTdHJpbmc+IG9wZW5MaWJyYXJ5UGF0aHNMaXN0ID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0T3BlbkxpYnJhcnlQYXRoc0xpc3QoKTsJCQotCQlpZiAob3BlbkxpYnJhcnlQYXRoc0xpc3Quc2l6ZSgpID4gMCkgewotCQkJU3RyaW5nW10gb3BlbkxpYnJhcnlQYXRocyA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCS5nZXRPcGVuTGlicmFyeVBhdGhzKCk7Ci0JCQlsaWJyYXJ5UGF0aENvbWJvLnNldEl0ZW1zKG9wZW5MaWJyYXJ5UGF0aHMpOwotCQkJaWYgKG9wZW5MaWJyYXJ5UGF0aHMubGVuZ3RoID4gMCkgewotCQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0VGV4dChvcGVuTGlicmFyeVBhdGhzWzBdKTsKLQkJCX0JCQkKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsaWJyYXJ5UGF0aCA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSArIEZpbGVVdGlsLkZJTEVfU0VQICsgIkxpYnJhcnkxIjsgLy8kTk9OLU5MUy0xJAotCQkJb3BlbkxpYnJhcnlQYXRoc0xpc3QuYWRkKDAsIGxpYnJhcnlQYXRoKTsKLQkJCVN0cmluZ1tdIG9wZW5MaWJyYXJ5UGF0aHMgPSBuZXcgU3RyaW5nW29wZW5MaWJyYXJ5UGF0aHNMaXN0LnNpemUoKV07Ci0JCQlvcGVuTGlicmFyeVBhdGhzTGlzdC50b0FycmF5KG9wZW5MaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRJdGVtcyhvcGVuTGlicmFyeVBhdGhzKTsKLQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0VGV4dChvcGVuTGlicmFyeVBhdGhzWzBdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGlicmFyeVBhdGhDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldExpYnJhcnlQYXRoKCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQlsaWJyYXJ5UGF0aENvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIHsKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRMaWJyYXJ5UGF0aCgpOwotCQlTdHJpbmcgbGliTmFtZSA9IG5ldyBGaWxlKGxpYlBhdGgpLmdldE5hbWUoKTsKLQkJaWYgKCFsaWJQYXRoLmVxdWFscyhsaWJOYW1lKSkgewotCQkJcmV0dXJuIGxpYk5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gbGlicmFyeVBhdGhDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VHlwZSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTk0NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHMuQ29tbWFuZExpbmVSdW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBvcGVuIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBPcGVuTGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgT3BlbiBMaWJyYXJ5IHdpemFyZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgT3BlbkxpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKG1haW5QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShPcGVuTGlicmFyeU1haW5QYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKG1haW5QYWdlKTsKLQkJCX0KLQotCQkJc3VwZXIuZ2V0TmV3V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd2l6YXJkUGFnZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGl0Lm5leHQoKTsKLQkJCQlzdXBlci5hZGRQYWdlKHdpemFyZFBhZ2UpOwotCQkJfQotCi0JCQl3aXphcmRFeHRlbmRlci5pbml0V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYWluIHdpemFyZCBwYWdlCi0JICovCi0JcHJvdGVjdGVkIE9wZW5MaWJyYXJ5TWFpblBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgT3BlbkxpYnJhcnlNYWluUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRFeHRlbmRlci5kb0ZpbmlzaCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG9wZW5NZXRob2RMaWJyYXJ5KG1haW5QYWdlLmdldExpYnJhcnlQYXRoKCksICJ4bWkiKTsgLy8kTk9OLU5MUy0xJAkKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBtZXRob2QgbGlicmFyeSBhdCB0aGUgdXNlciBzcGVjaWZpZWQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCwgU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJb3B0aW9ucy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KHBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQlpZiAoIWhhbmRsZVRvb2xWZXJzaW9uKHBhdGgsIG51bGwpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKExpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShwYXRoKSkgewotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVBhdGgobGlicmFyeVBhdGgKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFhNSUxpYnJhcnlVdGlsCi0JCQkJCS5jb250YWluc1BsdWdpbk9yQ29uZmlnU3BlY0V4cG9ydEZpbGUocGF0aCkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfSBlbHNlIHsKLQkJCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWJvb2xlYW4gcmMgPSBtc2dEaWFsb2cKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dCwKLQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHBhdGggfSkpOwotCQkJCWlmICghcmMpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUxpYnJhcnkocGF0aCkpIHsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYWRkT3BlbkxpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgYW5kIGhhbmRsZSB0b29sIHZlcnNpb24gZGlmZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlVG9vbFZlcnNpb24oU3RyaW5nIHBhdGgsCi0JCQlVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCVN0cmluZyBsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSTsKLQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCAmJiBjYWxsZXJJbmZvLmdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSkgewotCQkJbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJfQotCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbAotCQkJCS5jaGVja0xpYnJhcnlWZXJzaW9uKG5ldyBGaWxlKHBhdGgsIGxpYlhtaSkpOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ucmVzdWx0ID4gMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0LAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSwKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiB9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd24sCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpIH0pOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5zZXRFcnJvck1zZyhtZXNzYWdlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKHBhdGgsIGxpYlhtaSwgaW5mbykpIHsKLQkJCWlmICghQ29tbWFuZExpbmVSdW5VdGlsLmdldEluc3RhbmNlKCkuaXNOZWVkVG9SdW4oKSAKLQkJCQkJJiYgaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKQotCQkJCQkmJiAhTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5jb3B5TGlicmFyeSgpOwotCQkJCWlmIChjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCXBhdGggPSBjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFMaWJyYXJ5VUlNYW5hZ2VyLnVwZ3JhZGVMaWJyYXJ5KHBhdGgsIGNhbGxlckluZm8pKSB7Ci0JCQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCkgewotCQkJCQkvLyBjYWxsZXJJbmZvLnNldEVycm9yTXNnKCJ1cGdyYWRlTGlicmFyeSBGYWlsZWQhIik7IC8vbmVlZAotCQkJCQkvLyBuZXcgcmVzb3VyY2Ugc3RyaW5nCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeShVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCXJldHVybiBVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhMjkwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhIE9wZW4gTWV0aG9kIExpYnJhcnkgd2l6YXJkIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgc3BlY2lmaWMgdXNlciBzZWxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNYXAgZ2V0U2VsZWN0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9TZWxlY3RQcm9jZXNzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvU2VsZWN0UHJvY2Vzc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2YWViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9TZWxlY3RQcm9jZXNzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcHJvY2VzcyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDcuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UHJvY2Vzc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQcm9jZXNzUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFByb2Nlc3NUcmVlVmlld2VyIHByb2Nlc3NUcmVlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFByb2Nlc3NQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzZXNMYWJlbF90ZXh0KTsKLQotCQlwcm9jZXNzVHJlZVZpZXdlciA9IG5ldyBQcm9jZXNzVHJlZVZpZXdlcihjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNTA7Ci0JCXByb2Nlc3NUcmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5icmllZkRlc2NyaXB0aW9uTGFiZWxfdGV4dCk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29tcG9zaXRlLCAiIiwgMTAwLCA3MCwgMSk7IC8vJE5PTi1OTFMtMSQJCi0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlwcm9jZXNzVHJlZVZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlwcm9jZXNzVHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXByb2Nlc3NUcmVlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCU9iamVjdCBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJCQkJcHJvY2VzcyA9IChQcm9jZXNzKSBlbGVtZW50OwotCQkJCQkJCQlicmllZkRlc2NUZXh0LnNldFRleHQocHJvY2VzcwotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXByb2Nlc3MgPSBudWxsOwotCQkJCQkJCQlicmllZkRlc2NUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBnZXRQcm9jZXNzKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBnZXRQcm9jZXNzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBwcm9jZXNzLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2NjAwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjc3OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBYTUkgTGlicmFyeSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjMyNTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmMDM5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIFNlcCAxMSAxMjozMTo1NyBQRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzPTg4NTlfMQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZmNWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLnByZWZlcmVuY2VzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjJmYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMmVjN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBYTUkgTGlicmFyeQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U2OTg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkaWFncmFtTWlncmF0aW9uIiBuYW1lPSJEaWFncmFtIE1pZ3JhdGlvbiIgc2NoZW1hPSJzY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIj4KLSAgICAgIDxsaWJyYXJ5TWFuYWdlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlciIgICAgICAgCQkKLSAgICAgICAgICAgIHR5cGU9InhtaSIKLSAgICAgICAgICAgIHR5cGVOYW1lPSJYTUkiPgotICAgICAgPC9saWJyYXJ5TWFuYWdlcj4gICAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIj4KLSAgICAgIDxvcHBvc2l0ZUZlYXR1cmVMb2FkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbC5YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1YmU1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc2NoZW1hL0lEaWFncmFtTWlncmF0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkiIGlkPSJJRGlhZ3JhbU1pZ3JhdGlvbiIgbmFtZT0iRGlhZ3JhbSBNaWdyYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUHJvdmlkZSBkaWFncmFtIG1pZ3JhdGlvbiBBUEkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkaWFncmFtTWlncmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGlhZ3JhbU1pZ3JhdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5JRGlhZ3JhbU1pZ3JhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9JRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvSURpYWdyYW1NaWdyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmYzcwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9JRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkaWdyYW0gbWlncmF0aW9uIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBNYXJjaCAxOSwgMjAwNwotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbU1pZ3JhdGlvbiB7Ci0KLQl2b2lkIG1pZ3JhdGUoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMpIHRocm93cyBFeGNlcHRpb247Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwY2Y2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZpbGVQYXRoPUZpbGUgcGF0aAotY2Fubm90V3JpdGVUb0ZpbGVzPUNhbm5vdCB3cml0ZSB0byBmaWxlKHMpCi1yZWFkT25seUZpbGVzX3RpdGxlPVJlYWQtb25seSBmaWxlKHMpCi1yZWFkT25seUZpbGVzX21zZz1UaGUgZmlsZXMgbGlzdGVkIGluIERldGFpbHMgYXJlIHJlYWQtb25seS4gTWFrZSB0aGVtIHdyaXRhYmxlIGFuZCBjbGljayBvbiBSZXRyeSB0byBjb250aW51ZS4KLWVsZW1lbnRQYXRoPUVsZW1lbnQgcGF0aAotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvTWlzc2luZ0ZpbGVzX21zZz1UaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBtaXNzaW5nLiBDbGljayBPSyBpZiB5b3Ugd2FudCB0byByZW1vdmUgZXZlcnkgcmVmZXJlbmNlIHRvIHRoZSBzZWxlY3RlZCBmaWxlcyBpbiB0aGUgbGlicmFyeQotbWlzc2luZ0ZpbGVzX3RpdGxlPU1pc3NpbmcgZmlsZShzKQotbG9hZEVycm9yPUxvYWQgZXJyb3IKLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPVRoZSBmb2xsb3dpbmcgZmlsZShzKSBjb3VsZCBub3QgYmUgbG9hZGVkLiBDbGljayBPSyBpZiB5b3Ugd2FudCB0byByZW1vdmUgZXZlcnkgcmVmZXJlbmNlIHRvIHRoZSBzZWxlY3RlZCBmaWxlcyBpbiB0aGUgbGlicmFyeQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1GaWxlKHMpIHdpdGggbG9hZCBlcnJvcgotbWlncmF0ZVhNTExpYnJhcnlfdGFza05hbWU9TWlncmF0aW5nIFhNTCBpbXBvcnRlZCBsaWJyYXJ5Ci0KLSMgRXJyb3IgTWVzc2FnZXMKLWxpYnJhcnlBbHJlYWR5RXhpc3RzRXJyb3JfbXNnPUEgbWV0aG9kIGxpYnJhcnkgYWxyZWFkeSBleGlzdHMgaW4gJyd7MH0nJy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwZmUwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1hcHBpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IFhNSSBMaWJyYXJ5IE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RMaWJyYXJ5TWFuYWdlciB7Ci0JLyoqCi0JICogVGhlIHN1cHBvcnRlZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9UWVBFID0gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbGlicmFyeSBYTUkgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfWE1JID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCi0JLyoqCi0JICogVGhlIHBsdWdpbiBhbmQgY29uZmlnIHNwZWMgZXhwb3J0IGZpbGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBvcnRGaWxlID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9QTFVHSU5fRVhQT1JUX0ZJTEVOQU1FOwotCi0JLyoqCi0JICogVGhlIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfTElCUkFSWV9QQVRIID0gImxpYnJhcnkucGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBTdHJpbmcgcGF0aDsKLQkKLQlwcml2YXRlIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWdyOwotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCQotCXByaXZhdGUgU3RyaW5nIHJlZ2lzdGVyVHlwZSA9ICJEZWZhdWx0IjsJCS8vJE5PTi1OTFMtMSQgCi0JCi0JcHVibGljIFhNSUxpYnJhcnlNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlyZXNvdXJjZU1nciA9IG5ldyBYTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnlbXSByZXN1bHRIb2xkZXIgPSBuZXcgTWV0aG9kTGlicmFyeVsxXTsKLQkJZmluYWwgTGlicmFyeVNlcnZpY2VFeGNlcHRpb25bXSBleGNlcHRpb25Ib2xkZXIgPSBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb25bMV07Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBhY3Rpb24gPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9DcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIGFyZ3MpOwotCQkJCX0KLQkJCQljYXRjaChMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4Y2VwdGlvbkhvbGRlclswXSA9IGU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCXdvcmtzcGFjZS5ydW4oYWN0aW9uLCB3b3Jrc3BhY2UuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKHdvcmtzcGFjZS5nZXRSb290KCkpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JCWlmKGV4Y2VwdGlvbkhvbGRlclswXSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBleGNlcHRpb25Ib2xkZXJbMF07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0JCQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBkb0NyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykKLQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImNyZWF0ZU1ldGhvZExpYnJhcnkiLCAibmFtZT0iICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDAgfHwgYXJncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVBhdGgsIExJQlJBUllfWE1JKTsKLQkJaWYgKGxpYnJhcnlYTUlGaWxlLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCVhNSUxpYnJhcnlSZXNvdXJjZXMubGlicmFyeUFscmVhZHlFeGlzdHNFcnJvcl9tc2csCi0JCQkJCWxpYnJhcnlQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXRocm93IG5ldyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihtc2cpOwotCQl9Ci0KLQkJaWYgKCFsaWJyYXJ5UGF0aC5leGlzdHMoKSkgewotCQkJbGlicmFyeVBhdGgubWtkaXJzKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IHRydWU7Ci0JCQlTdHJpbmcgcmVnVHlwZSA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1JFR0lTVEVSX1RZUEUpOwotCQkJaWYgKHJlZ1R5cGUgIT0gbnVsbCAmJiByZWdUeXBlLmVxdWFscygiQ29uZmlnRXhwb3J0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0aW1lID0gTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKTsKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgIkV4cG9ydExpYiIgKyB0aW1lLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsKTsJCQotCQkJfSBlbHNlIHsgCQkJCQotCQkJCS8vIE9wZW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgZmlsZS4KLQkJCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QobGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCQludWxsKTsKLQkJCX0KLQkJCS8vIENyZWF0ZSB0aGUgcmVzb3VyY2Ugc2V0LgotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCi0JCQkvLyBDcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JCQlNb2RlbFN0b3JhZ2UubmV3TGlicmFyeShyZXNvdXJjZVNldCwgbmFtZSwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKTsKLQkJCWxpYnJhcnkgPSByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JCQlhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkJImNyZWF0ZU1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlyZXR1cm4gbGlicmFyeTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQotCQkJLy8gLy8gZXZlbnQgcHJvY2Vzc2VkIGluIExpYnJhcnlTZXJ2aWNlCi0JCQkvLyBub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoamF2YS5uZXQuVVJJIHVyaSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAib3Blbk1ldGhvZExpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJCWxpYnJhcnkgPSBvcGVuTWV0aG9kTGlicmFyeShmaWxlKTsKLQkJfSAKLQkJY2F0Y2goTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxpYnJhcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIsICJsaWJyYXJ5PSIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIDxjb2RlPkZpbGU8L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZQotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkuCi0JICogQHJldHVybiBhIDxjb2RlPk1ldGhvZExpYnJhcnk8L2NvZGU+LgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KEZpbGUgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShwYXRoLCBMSUJSQVJZX1hNSSk7Ci0JCWlmICghbGlicmFyeVhNSUZpbGUuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oKTsKLQkJfQotCi0JCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24obGlicmFyeVhNSUZpbGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFhNSUxpYnJhcnlVdGlsLmNoZWNrVmVyc2lvbihsaWJyYXJ5WE1JRmlsZSwgaW5mbyk7Ci0JCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZWxzZSBpZihNYXBwaW5nVXRpbC5jb252ZXJzaW9uUmVxdWlyZWQobGlicmFyeVhNSUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGluZm8pKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oTGlicmFyeVJlc291cmNlcy5saWJVcGdyYWRlUmVxdWlyZWRfZXJyX21zZyk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gdHJ1ZTsKLQotCQkJLy8gT3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmaWxlLgotCQkJcHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0Lm9wZW5Qcm9qZWN0KHBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCi0JCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4KLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCi0JCQkvLyBMb2FkIHRoZSBtZXRob2QgbGlicmFyeS4KLQkJCXJlc291cmNlU2V0LmxvYWRNZXRob2RMaWJyYXJpZXMoVVJJLmNyZWF0ZUZpbGVVUkkobGlicmFyeVhNSUZpbGUKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCWxpYnJhcnkgPSByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JCQlhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkJU3lzdGVtLmdjKCk7Ci0JCQkKLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludChlKTsKLQkJCX0KLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShsaWJyYXJ5LCBQUk9QX0RJUlRZKTsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KE1hcCBhcmdzKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoYXJncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJbGlicmFyeSA9IG9wZW5NZXRob2RMaWJyYXJ5KG5ldyBGaWxlKHBhdGgpKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicmVvcGVuTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlsaWJyYXJ5ID0gb3Blbk1ldGhvZExpYnJhcnkobmV3IEZpbGUoZ2V0TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInJlb3Blbk1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyI2dldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyI2NyZWF0ZVJlc291cmNlU2V0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU2VydmljZS5JTlNUQU5DRQotCQkJCS5jcmVhdGVSZXNvdXJjZVNldChTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiBGb3IgZGlzdHJpYnV0ZWQgbGlicmFyeSwgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHdvcmtzcGFjZSBwYXRoLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRNZXRob2RMaWJyYXJ5UGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlqYXZhLm5ldC5VUkkgbGlicmFyeVVSSSA9IGdldE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJaWYgKGxpYnJhcnlVUkkgIT0gbnVsbCkgewotCQkJRmlsZSBsaWJyYXJ5WE1JRmlsZSA9IG5ldyBGaWxlKGxpYnJhcnlVUkkpOwotCQkJaWYgKGxpYnJhcnlYTUlGaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKExJQlJBUllfWE1JKSkgewotCQkJCWxpYnJhcnlYTUlGaWxlID0gbGlicmFyeVhNSUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQkJcmV0dXJuIGxpYnJhcnlYTUlGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwcm9qZWN0IG9mIHRoZSBtZXRob2QgbGlicmFyeSBtYW5hZ2VkIGJ5IHRoaXMgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0Ci0JICovCi0JcHVibGljIElQcm9qZWN0IGdldE1ldGhvZExpYnJhcnlQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlTGlicmFyeU1vdmVkKCkgewotCQlpZihsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbG9jYXRpb24gPSBnZXRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJaWYoIXByb2plY3QuaXNPcGVuKCkgfHwgcHJvamVjdC5nZXRMb2NhdGlvbigpLmVxdWFscyhuZXcgUGF0aChsb2NhdGlvbikpKSB7Ci0JCQkvLyBub3QgbW92ZWQKLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHVwZGF0ZSBVUkkgb2YgYWxsIGxpYnJhcnkgcmVzb3VyY2VzCi0JCS8vCi0JCVJlc291cmNlIGxpYlJlc291cmNlID0gbGlicmFyeS5lUmVzb3VyY2UoKTsKLQkJaWYobGliUmVzb3VyY2UgPT0gbnVsbCB8fCBsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbmV3TG9jYXRpb24gPSBwcm9qZWN0LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlpZihsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpIGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKS5oYW5kbGVMaWJyYXJ5TW92ZWQobmV3TG9jYXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJUGVyc2lzdGVuY2VVdGlsLnJlcGxhY2VVUklQcmVmaXgobmV3IEFycmF5TGlzdDxSZXNvdXJjZT4obGliUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSksIAotCQkJCQlsb2NhdGlvbiwgbmV3TG9jYXRpb24pOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgbGlicmFyeQotCSAqIEByZXR1cm4gSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gcmVzb3VyY2VNZ3I7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlciNiYWNrdXBNZXRob2RMaWJyYXJ5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYmFja3VwTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgbGliUGF0aFN0ciA9IGdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCQlGaWxlIGxpYlBhdGggPSBuZXcgRmlsZShsaWJQYXRoU3RyKTsKLQkJLy8gZXhjdWRlIHRoZSBub24tbGlicmFyeSBmaWxlcyB0aGF0IG1pZ2h0IGJlIGxvY2tlZCBieSBybWMuCi0JCS8vIHRoZXNlIGZpbGVzIG1heSBjYXVzZSBiYWNrdXAgdG8gZmFpbCBkdWUgdG8gZmlsZSBsb2NrLgotCQlTdHJpbmcgZXhjbHVkZXMgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGxpYlBhdGgsIG5ldyBGaWxlKHBhdGgpLCAiKioiLCBleGNsdWRlcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRSZWdpc3RlclR5cGUoKSB7Ci0JCXJldHVybiByZWdpc3RlclR5cGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlZ2lzdGVyVHlwZShTdHJpbmcgcmVnaXN0ZXJUeXBlKSB7Ci0JCXRoaXMucmVnaXN0ZXJUeXBlID0gcmVnaXN0ZXJUeXBlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXIjcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIsIAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZWdUeXBlID0gKFN0cmluZykgcGFyYW1zLmdldChBUkdfTElCUkFSWV9SRUdJU1RFUl9UWVBFKTsKLQkJaWYgKHJlZ1R5cGUgIT0gbnVsbCkgewotCQkJc2V0UmVnaXN0ZXJUeXBlKHJlZ1R5cGUpOwotCQl9Ci0JCXJlZ1R5cGUgPSBnZXRSZWdpc3RlclR5cGUoKTsKLQkJaWYgKHJlZ1R5cGUuZXF1YWxzKCJDb25maWdFeHBvcnQiKSkgey8vJE5PTi1OTFMtMSQgCi0JCQkvL0ZvciBub3csIHN0aWxsIHNpbXBseSB3cmFwaW5nIHVwIG9sZCBpbXBsZW1lbnRhdGlvbiAoY29waWVkIGZyb20gQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UpIGZvciBzbW9vdGhlciBjaGFuZ2U7IHdpbGwgZGVmaW5ldGx5IGNoYW5nZSBsYXRlcgotCQkJLy9zbyB0aGF0IGNyZWF0aW5nIGEgbmV3IGxpYiB3b3VsZCBub3QgYmUgbmVlZGVkCQkKLQkJCVN0cmluZyBuYW1lID0gImxpYnJhcnkueG1pIjsJLy8kTk9OLU5MUy0xJDsJCi0JCQljcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHBhcmFtcyk7Ci0JCQlzZXRNZXRob2RMaWJyYXJ5KGxpYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vTWluaW11bSBpbXBsZW1lbnRhdGlvbiBmb3IgZGVmYXVsIHJlZ2lzdGVyIHR5cGUsIHRvIG1pbmltaXplIGNhbGxlciBjb2RlIGNoYW5nZQotCQl0aGlzLmxpYnJhcnkgPSBsaWI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlciN1blJlZ2lzdGVyTWV0aG9kTGlicmFyeSgpCi0JICovCi0JcHVibGljIHZvaWQgdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZ2V0UmVnaXN0ZXJUeXBlKCkuZXF1YWxzKCJDb25maWdFeHBvcnQiKSkgey8vJE5PTi1OTFMtMSQgCi0JCQljbG9zZU1ldGhvZExpYnJhcnkoKTsKLQkJCXJldHVybjsKLQkJfQotCQkvL01pbmltdW0gaW1wbGVtZW50YXRpb24gZm9yIGRlZmF1bCByZWdpc3RlciB0eXBlLCB0byBtaW5pbWl6ZSBjYWxsZXIgY29kZSBjaGFuZ2UKLQkJdGhpcy5saWJyYXJ5ID0gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE2YjljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgWE1JIExpYnJhcnkgcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYTUlMaWJyYXJ5UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFhNSUxpYnJhcnlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNSUxpYnJhcnlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2NGUyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBYTUkgbGlicmFyeSByZXNvdXJjZSBtYW1hZ2VyCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVJlc291cmNlTWFuYWdlciBpbXBsZW1lbnRzIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHsKLQotCXB1YmxpYyBYTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyKCkgewotCX0KLQotCQotCS8qKgotCSAqIGdldCB0aGUgbG9naWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LAotCSAqIHRoZSBwYXRoIHNob3VsZCBzdGFydCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gCi0JICogaS5lLiA8cGx1Z2luIG5hbWU+L3BhdGgvdG8vZWxlbWVudAotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBzaG91bGQgZW5jYXBzdWxhdGUgdGhlIHBoeXNpY2FsIHN0b3JhZ2UgCi0JICogb2YgdGhlIHJlc291cmNlIGFuZCByZXR1cm4gdGhlIHBhdGggb2YgdGhlIGVsZW1lbnQgc3RhcnQgd2l0aCBpdCdzIHBsdWdpbiBuYW1lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRFbGVtZW50VmlydHVhbFBhdGgoZWxlbWVudCk7Ci0JCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJXYXJuaW5nISBObyBQYXRoIGZvciBFbGVtZW50IFsiICsgZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjogIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmaXhQYXRoKHBhdGgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgYmFjayBwYXRoIG9mIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBsb2dpY2FsIHBhdGgsIGZvciBleGFtcGxlLAotCSAqICJPcGVuVVBcZ3VpZGFuY2VcY29uY2VwdFxjMS54bWwiLCB0aGUgYmFjayBwYXRoIGlzICIuLy4uLy4uLy4uLyIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBMaW51eDogQnJvd3NpbmcgYW5kIHByZXZpZXcgc2hvd3Mgb25seSBwbGFpbiB0ZXh0LgotCQkvLyBUaGVyZSBhcmUgbm8gaW1hZ2VzL3NlY3Rpb25zCi0JCS8vIGVsZW1lbnQgcGF0aCBzaG91bGQgY2hlY2sgRmlsZS5zZXBhcmF0b3JDaGFyIGluc3RlYWQgb2YgIlwiCi0JCVN0cmluZyBiYWNrUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwYXRoID0gZ2V0TG9naWNhbFBhdGgoZWxlbWVudCk7Ci0JCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCWJhY2tQYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKS5yZXBsYWNlQWxsKAotCQkJCQkiLio/LyIsICJcXC5cXC4vIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAiLi8iICsgYmFja1BhdGg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZml4IHRoZSBwYXRoIGJ5IGFwcGVuZGluZyBhIEZpbGUuc2VwZXJhdG9yIHRvIHRoZSBlbmQgb2YgaXQKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZpeFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoIXBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlyZXR1cm4gcGF0aCArIEZpbGUuc2VwYXJhdG9yOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxvZ2ljYWwgcmVzb3VyY2UgcGF0aCBvZiB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiBsaWJyYXJ5LiB0aGUgcGF0aCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIAotCSAqIGkuZS4gPHBsdWdpbiBuYW1lPi9wYXRoL3RvL2VsZW1lbnQvcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcGF0aCA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2VSZXNvdXJjZVZpcnR1YWxQYXRoKGVsZW1lbnQpOwotCQlyZXR1cm4gZml4UGF0aChwYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgcGh5c2ljYWwgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldEZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIoZWxlbWVudCk7Ci0JCXJldHVybiBwZXJzaXN0ZXIgIT0gbnVsbCA/IGZpeFBhdGgocGVyc2lzdGVyLmdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KSkgOiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCByZXNvdXJjZSBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihlbGVtZW50KTsKLQkJcmV0dXJuIHBlcnNpc3RlciAhPSBudWxsID8gZml4UGF0aChwZXJzaXN0ZXIuZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKGVsZW1lbnQpKSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0UGVyc2lzdGVyRm9yKHJlc291cmNlKTsKLQkJCWlmKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0JCQkJcmV0dXJuICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpcGVyc2lzdGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBsb2dpY2FsIHBhdGggb2YgdGhlIHBsdWdpbiAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGx1Z2luUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCXJldHVybiBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCX0gCi0JCQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBwbHVnaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBoeXNpY2FsUGF0aChwbHVnaW4pOwotCQl9IAotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9naWNhbCBwYXRoCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCBhbiBlbGVtZW50IGluIHRoZSBsaWJyYXJ5IHRvIGFjY2VzcyB0aGUgbGlicmFyeSByZXNvdXJjZQotCSAqIHVzdWFsbHkgdGhpcyBpcyB0aGUgb3duZXIgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhlIGxvZ2ljYWxQYXRoCi0JICogQHBhcmFtIGxvZ2ljYWxQYXRoIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBwaHlzaWNhbCBwYXRoIHJlc29sdmVkIGZyb20gdGhlIGxvZ2ljYWwgcGF0aAotCSAqCi0JICogZm9yIGV4YW1wbGUsIGVsZW1lbnQgdGFzazEsIGxvZ2ljYWwgcGF0aCBpcyAicGx1Z2luIDEvdGFza3MvdGFzazEuaHRtbCIKLQkgKiB0aGUgcmV0dXJuZWQgcGh5c2ljYWwgcGF0aCBpcyA8cGx1Z2luIGxvY2F0aW9uPi9wYXRoL3RvL2VsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAKLQkgKiBAcGFyYW0gbG9naWNhbFBhdGggdGhlIGxvZ2ljYWwgcGF0aCBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvZ2ljYWxQYXRoKSB7Ci0KLQkJLy8gdXNlIHRoZSBwbHVnaW4gbmFtZSBpbiB0aGUgbG9naWNhbCBwYXRoCi0JCS8vIGZpbmQgdGhlIE1ldGhvZFBsdWdpbiBvYmplY3QKLQkJLy8gZmluZCB0aGUgcGx1Z2luUGF0aAotCQkJCQotCQkvLyBzdHJpcCBvZmYgdGhlIGZpcnN0IGZvbGRlciBpbiB0aGUgcmVscGF0aCBzaW5jZSB0aGlzIGlzIHRoZSBwbHVnaW4gbmFtZQotCQlsb2dpY2FsUGF0aCA9IGxvZ2ljYWxQYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlpbnQgaSA9IGxvZ2ljYWxQYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJaWYgKCBpID4gMCApIHsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gbG9naWNhbFBhdGguc3Vic3RyaW5nKDAsIGkpOwotCQkJU3RyaW5nIHBsdWdpblBhdGggPSBudWxsOyAKLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCk7Ci0JCQlMaXN0IHBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYik7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4paXQubmV4dCgpOwotCQkJCWlmICggcGx1Z2luLmdldE5hbWUoKS5lcXVhbHMocGx1Z2luTmFtZSkgKSB7Ci0JCQkJCXBsdWdpblBhdGggPSBnZXRQaHlzaWNhbFBsdWdpblBhdGgocGx1Z2luKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIHBsdWdpblBhdGggIT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gcGx1Z2luUGF0aCArIGxvZ2ljYWxQYXRoLnN1YnN0cmluZyhpKzEpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFkYjFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFhNSSBMaWJyYXJ5IHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdFdyaXRlVG9GaWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRQYXRoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVBhdGg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZEVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0ZpbGVzX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZE9ubHlGaWxlc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkT25seUZpbGVzX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlBbHJlYWR5RXhpc3RzRXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGVYTUxMaWJyYXJ5X3Rhc2tOYW1lOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1JTGlicmFyeVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUlMaWJyYXJ5UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE2OWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciBhY2Nlc3NpbmcgYSBYTUkgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX01TRyA9IExpYnJhcnlSZXNvdXJjZXMuZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX0xJQlJBUllfRklMRV9NU0cgPSBMaWJyYXJ5UmVzb3VyY2VzLm1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VMRF9OT1RfTE9DS19MSUJSQVJZX01TRyA9IExpYnJhcnlSZXNvdXJjZXMuY291bGROb3RMb2NrTGlicmFyeV9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9TVEFUVVMgPSBuZXcgU3RhdHVzKAotCQkJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAxLAotCQkJRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9NU0csIG51bGwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIE1JU1NJTkdfTElCUkFSWV9GSUxFX1NUQVRVUyA9IG5ldyBTdGF0dXMoCi0JCQlTdGF0dXMuRVJST1IsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsCi0JCQlNSVNTSU5HX0xJQlJBUllfRklMRV9NU0csIG51bGwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIENPVUxEX05PVF9MT0NLX0xJQlJBUllfU1RBVFVTID0gbmV3IFN0YXR1cygKLQkJCVN0YXR1cy5FUlJPUiwgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwKLQkJCUNPVUxEX05PVF9MT0NLX0xJQlJBUllfTVNHLCBudWxsKTsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPOiBUaGlzIGNhbGwgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHBlcnNpc3RlbmNlIGxheWVyCi0JCQkvLyB0byBhdm9pZCBhIG51bGwgcG9pbnRlciBleGNlcHRpb24gaW4KLQkJCS8vIFBlcnNpc3RlbmNlVXRpbC5jb252ZXJzaW9uUmVxdWlyZWQoKS4gQSBiZXR0ZXIgc29sdXRpb24gaXMKLQkJCS8vIG5lZWRlZC4KLQkJCW5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBsaWJyYXJ5IGV4aXN0cyBvbiBhIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdGggY29udGFpbnMgYSB2YWxpZCBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlGaWxlIGxpYnJhcnlEaXIgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKCFsaWJyYXJ5RGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlGaWxlIGxpYnJhcnlGaWxlID0gbmV3IEZpbGUobGlicmFyeURpciwgWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUkpOwotCQlpZiAoIWxpYnJhcnlGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgbW9kZWwgKGxpYnJhcnkueG1pKSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJudCBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgbW9kZWwgZmlsZSAoaWYgb25lIGV4aXN0cykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMaWJyYXJ5TW9kZWxGaWxlKFN0cmluZyBwYXRoKSB7Ci0JCWlmICghU3RyVXRpbC5pc0JsYW5rKHBhdGgpKSB7Ci0JCQlTdHJpbmcgbGliUGF0aCA9IG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJU3RyaW5nIHN1ZmZpeCA9IEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCQkJaWYgKGxpYlBhdGguZW5kc1dpdGgoc3VmZml4KSkgewotCQkJCXJldHVybiBsaWJQYXRoOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbGliUGF0aCArIHN1ZmZpeDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYSBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gdmFsaWRhdGVNb2RlbEZpbGUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB2YWxpZGF0ZSB0aGF0IHRoZSBsaWJyYXJ5LnhtaSBmaWxlCi0JICogICAgICAgICAgICBhbHNvIGV4aXN0cy4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXRoIGlzIGEgdmFsaWQgbWV0aG9kIGxpYnJhcnkKLQkgKiAgICAgICAgIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpc1ZhbGlkTGlicmFyeShTdHJpbmcgcGF0aCwgYm9vbGVhbiB2YWxpZGF0ZU1vZGVsRmlsZSkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUzsKLQkJfQotCi0JCWlmICh2YWxpZGF0ZU1vZGVsRmlsZSkgewotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUoZ2V0TGlicmFyeU1vZGVsRmlsZShwYXRoKSk7Ci0JCQlpZiAoIWxpYkZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gTUlTU0lOR19MSUJSQVJZX0ZJTEVfU1RBVFVTOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBsaWJQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCWlmIChwYXRoLmVuZHNXaXRoKE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRSkpIHsKLQkJCWxpYlBhdGggPSBsaWJQYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCi0JCVN0cmluZyBsaWJGdWxsUGF0aCA9IGxpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJaWYgKGxpYkZ1bGxQYXRoLnN0YXJ0c1dpdGgoIlxcIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGhlIGZpcnN0IHBhcnQgbXVzdCBiZSBhIG1hY2hpbmUgbmFtZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYQotCQkJLy8gZm9sZGVyCi0KLQkJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCQlTdHJpbmcgdW5jUGF0aDsKLQkJCWludCBpbmRleCA9IGxpYkZ1bGxQYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyLCAyKTsKLQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAodW5jUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCS8vIG11c3Qgc3BlY2lmeSBhIHZhbGlkIHBhdGgKLQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSB0b3AgbGV2ZWwgcGF0aCBtdXN0IGJlIHZhbGlkCi0JCQkJCWluZGV4ID0gbGliRnVsbFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIGluZGV4ICsgMSk7Ci0JCQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQl9Ci0KLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUodW5jUGF0aCk7Ci0JCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWlzVmFsaWQpIHsKLQkJCQkvLyBubyBuZXcgcmVzb3VyY2Ugc3RyaW5nLCB3YWl0IGxhdGVyCi0JCQkJLy8gcmV0dXJuIG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLAotCQkJCS8vIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsICJJbnZhbGlkIHBhdGgiLCBudWxsKTsKLQkJCQlyZXR1cm4gRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgYSAucHJvamVjdCBmaWxlLgotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luCi0JCQkJCS5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbigKLQkJCQkJCQluZXcgUGF0aChsaWJGdWxsUGF0aCArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJCQkrIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKSk7Ci0JCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCS8vIElmIGEgLnByb2plY3QgZmlsZSBkb2VzIG5vdCBleGlzdHMsIHVzZSBpdCB0byB2YWxpZGF0ZSB0aGUgcGF0aC4KLQkJLy8gb25seSBjYWxsIHZhbGlkYXRlUHJvamVjdExvY2F0aW9uIGlmIHBhdGggaXMgbm90IG9uIHdvcmtzcGFjZQotCQkvLyBmb3Igc29tZSByZWFzb24sIHZhbGlkYXRlUHJvamVjdExvY2F0aW9uIG9ubHkgd29ya3Mgb24gcGF0aHMgbm90IG9uCi0JCS8vIHRoZSB3b3Jrc3BhY2UKLQkJaWYgKFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihuZXcgUGF0aChsaWJGdWxsUGF0aCkpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlsLmZpbmRQcm9qZWN0KGxpYkZ1bGxQYXRoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJbGliUGF0aC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZVByb2plY3RMb2NhdGlvbihwcm9qZWN0LAotCQkJCW5ldyBQYXRoKGxpYkZ1bGxQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIGEgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBhIHZhbGlkIG1ldGhvZCBsaWJyYXJ5Ci0JICogICAgICAgICBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgaXNWYWxpZExpYnJhcnkoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGlzVmFsaWRMaWJyYXJ5KHBhdGgsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBsaWJyYXJ5IG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIGEgbmV3IGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgbmVlZHMgdG8gYmUgdXBncmFkZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKFN0cmluZyBwYXRoLAotCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCXJldHVybiBpc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQocGF0aCwKLQkJCQlYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSwgaW5mbyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChTdHJpbmcgcGF0aCwKLQkJCVN0cmluZyBsaWJYbWksIFZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbykgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NYXBwaW5nVXRpbAotCQkJCS5jb252ZXJzaW9uUmVxdWlyZWQocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgbGliWG1pLCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFhNSSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlhcmdzLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBwYXRoKTsKLQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLAotCQkJCVhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfVFlQRSwgYXJncyk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlhcmdzLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBwYXRoKTsKLQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkub3Blbk1ldGhvZExpYnJhcnkoCi0JCQkJWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9UWVBFLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3Blbk1ldGhvZExpYnJhcnlQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobGlicmFyeSAhPSBudWxsICYmIGxpYnJhcnkuZVJlc291cmNlKCkgIT0gbnVsbAotCQkJCSYmIGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWwuZmluZFByb2plY3QobGlicmFyeSk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmICFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvamVjdC5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5IHNwZWNpZmllZCBwYXRoIGNvbnRhaW5zIGEgcGx1Z2luIG9yCi0JICogY29uZmlnIHNwZWMgZXhwb3J0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc1BsdWdpbk9yQ29uZmlnU3BlY0V4cG9ydEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcGF0aCA9IG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJRmlsZSBleHBvcnRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCXJldHVybiBleHBvcnRGaWxlLmV4aXN0cygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja1ZlcnNpb24oRmlsZSBmaWxlLAotCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZTsKLQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLm9sZFRvb2xWZXJzaW9uX2Vycl9tc2csCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpLAotCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uLCBmaWxlIH0pOwotCQkJfSBlbHNlIHsKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnRvb2xWZXJzaW9uTWlzbWF0Y2hfZXJyX21zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCkgfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvTGlicmFyeVByb2Nlc3Nvci50eHQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9MaWJyYXJ5UHJvY2Vzc29yLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiNDFhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9MaWJyYXJ5UHJvY2Vzc29yLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5WZXJzaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgTWV0aG9kIExpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UHJvY2Vzc29yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BfRElSVFkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5UHJvY2Vzc29yIGluc3RhbmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCS8vIG1haW50YWluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbgotCS8vIHVzZXIgc2hvdWxkIGNhbGwgc2V0L2dldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgbWV0aG9kcwotCS8vIHByb3RlY3RlZCBTdHJpbmcgY3VycmVudENvbmZpZ05hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBNYXAgc2F2ZU9wdGlvbnM7Ci0KLQkvLyBwcml2YXRlIE1hcCBzYXZlQXNPcHRpb25zOwotCS8vIHByaXZhdGUgU2V0IGVDbGFzc2VzOwotCi0JcHJpdmF0ZSBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIGtlZXAgdGhlIGxpc3RlbmVycyB0byBiZSBkZWxldGVkLCBkbyB0aGUgZGVsZXRlIGJlZm9yZSBlYWNoIG5vdGlmaWNhdGlvbgotCS8vIGFuZCBlbXB0eSB0aGlzIGxpc3QuCi0JLy8gZG9uJ3QgZGVsZXRlIGluIHRoZSBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCi0JLy8gY2hhbmdlIHRoZSBsaXN0ZW5lciBsaXN0IGF0IHRoaXMgdGltZQotCXByaXZhdGUgTGlzdCB0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc011bHRpcGxlRmlsZXMgPSBmYWxzZTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbk9wZXJhdGlvbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBWZXJzaW9uTWFuYWdlciB2ZXJzaW9uTWdyID0gbnVsbDsKLQotCXByaXZhdGUgRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyID0gbnVsbDs7Ci0KLQkvLyBSQVRMQzAwMzg0NTk4IC0gRXhwb3J0OiBJbmZpbml0ZSBsb29wIE51bGxwb2ludGVyRXhjZXB0aW9uIGFmdGVyCi0JLy8gZXhwb3J0aW5nIGFuZCB1bmNoZWNraW5nIHJ1cCBwbHVnaW4gaW4gY29uZmlndXJhdGlvbgotCS8vIGFkZCB0aGlzIGZsYWcgdG8gdHJlYXQgdGhlIGluc3RhbmNlIGFzIHNpbmdsZXRvbiBpbnN0YWNuZSBvciBub3QKLQkvLyBvbmx5IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgY2FuIGRpc3Bvc2Ugc2hhcmVkIG9iamVjdHMuCi0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xldG9uSW5zdGFuY2UgPSBmYWxzZTsKLQotCS8vIHRoZSBsb2NrIG9uIHRoZSBsaWJyYXJ5J3MgLnByb2plY3QgZmlsZQotCXByaXZhdGUgRmlsZUxvY2sgbG9jazsKLQotCS8vVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gbm90aWZ5IHRoZSBjaGFuZ2UgaW4gbGlicmFyeSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlIGNvbW1hbmQgc3RhY2sgbGlzdGVuZXIKLQlwcml2YXRlIENvbW1hbmRTdGFja0xpc3RlbmVyIGNvbW1hbmRTdGFja0xpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlpZiAoIWluT3BlcmF0aW9uKSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCS8vCi0JCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gTGlicmFyeVV0aWwKLQkJCQkJCQkJLnVud3JhcCgoKENvbW1hbmRTdGFjaykgZXZlbnQuZ2V0U291cmNlKCkpCi0JCQkJCQkJCQkJLmdldE1vc3RSZWNlbnRDb21tYW5kKCkpOwotCi0JCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIEFkZENvbW1hbmQpIHsKLQkJCQkJCQkJQWRkQ29tbWFuZCBjbWQgPSAoQWRkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQ7Ci0JCQkJCQkJCUVPYmplY3Qgb3duZXIgPSBjbWQuZ2V0T3duZXIoKTsKLQkJCQkJCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJb2Jqcy5hZGQob3duZXIpOwotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQkJCQlvYmpzKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCUNvbGxlY3Rpb24gb2JqcyA9IG1vc3RSZWNlbnRDb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQkJb2Jqcyk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCQkvLyBvYmplY3QgaXMgYSBuZXdseSBhZGRlZCBtZXRob2QgcGFja2FnZQotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMob3duZXIsIG9ianMpOwotCQkJCQkJCQkJCWlmKCFvYmpzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0gCi0JCQkJCQkJZWxzZSBpZihtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbW9zdFJlY2VudENvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwgb2Jqcyk7CQotCQkJCQkJCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCltb3N0UmVjZW50Q29tbWFuZCk7Ci0JCQkJCQkJCQotCQkJCQkJCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGlmIHRoZQotCQkJCQkJCQkvLyBvYmplY3QgaXMgYSBuZXdseSBhZGRlZCBtZXRob2QgcGFja2FnZQotCQkJCQkJCQkvLwotCQkJCQkJCQlpZiAoY21kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMoY21kLmdldE93bmVyKCksIG9ianMpOwotCQkJCQkJCQkJaWYoIW9ianMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24ob2Jqcyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVDaGlsZENvbW1hbmQpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCQkJbW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIGFkZCB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlIGNvbmZpZ3VyYXRpb25zIGlmIHRoZSBwYXJlbnQgaXMgaW4gdGhlCi0JICogY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuZXdvYmpzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKENvbGxlY3Rpb24gbmV3b2JqcykgewotCQlpZiAobmV3b2JqcyA9PSBudWxsIHx8IG5ld29ianMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQotCQl0cnkgewotCQkJRU9iamVjdCBlLCBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3b2Jqcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLQkJCQkJCSYmICgocGFyZW50ID0gZS5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJCQkmJiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkpIHsKLQkJCQkJT2JqZWN0IGNvbmZpZ3MgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwYXJlbnQpCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQkJCQlpZiAoY29uZmlncyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRjb25maWcgPSAoKExpc3QpIGNvbmZpZ3MpLml0ZXJhdG9yKCk7IGl0Y29uZmlnCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJLy8gcGtncy5hZGQoZSk7Ci0JCQkJCQkJCWhlbHBlcgotCQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJCQkJCQkJCQllLCAtMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQloZWxwZXIuc2F2ZSgpOwotCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmICghaW5PcGVyYXRpb24pIHsKLQkJCQlpbnQgZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOiB7Ci0JCQkJCS8vIG9ubHkgZm9yIGFkZCBNZXRob2RQbHVnaW4sIG9yIG1heWJlIHNvbWUgb3RoZXIgbWlzc2luZwotCQkJCQkvLyBzdHVmZiAoaWYgYW55KSB0aGF0IGFyZSBub3QgY3JlYXRlZCBieSBhIGNvbW1hbmQuCi0JCQkJCS8vIGFueXRoaW5nIGNyZWF0ZWQgYnkgYSBjb21tYW5kIGFyZSBoYW5kbGVkIGJ5IHRoZQotCQkJCQkvLyBjb21tYW5kU3RhY2tMaXN0ZW5lcgotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJT2JqZWN0IHYgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKChub3RpZmllciBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpCi0JCQkJCQkJJiYgKHYgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQodik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOiB7Ci0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlpZiAobm90aWZpZXIgIT0gbnVsbCkgewotCQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKG5vdGlmaWVyKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vIG5vdGU6IHRoaXMgaXMgdGhlIHJlbW92ZSBvZiBlbGVtZW50cyBmcm9tIHRoZSBwYXJlbnQsCi0JCQkJLy8gaXQgbWlnaHQgYmUgYSBkZWxldGUgYWN0aW9uLCBvciBtaWdodCBiZSBqdXN0IGEgcmVtb3ZlIG9mCi0JCQkJLy8gcmVmZXJlbmNlcwotCQkJCS8vIGZvciBkZWxldGUgYWN0aW9uLCB0aGUgZGVsZXRlZCBlbGVtZW50IGhhcyBubyBjb250YWluZXIKLQkJCQkvLyBmb3IgcmVtb3ZlZCByZWZlcmVuY2UsIHRoZSByZW1vdmVkIGVsZW1lbnQgc3RpbGwgaGF2ZSBpdCdzCi0JCQkJLy8gcGFyZW50Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOiB7Ci0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJCQkmJiAoKEVPYmplY3QpIG9sZFZhbHVlKS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJLy8gdGhlIGVsZW1lbnQgaXMgZGVsZXRlZCwgc2VudCBhIGRlbGV0ZSBldmVudAotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChvbGRWYWx1ZSk7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG90aGVyd2lzZSwgaXQncyBqdXN0IGEgcmVtb3ZlIG9mIHJlZmVyZW5jZXMsIHRoZQotCQkJCQkJLy8gbm90aWZpZXIgaXMgdGhlIGNoYW5nZWQgZWxlbWVudAotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChub3RpZmllcik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6IHsKLQkJCQkJTGlzdCBvbGRWYWx1ZSA9IG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkJCS5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJQXJyYXlMaXN0IGRlbGV0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJQXJyYXlMaXN0IHJlbW92ZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoIW9sZFZhbHVlLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkVmFsdWUuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCWlmICgoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghZGVsZXRlZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gdGhlIGVsZW1lbnQgaXMgZGVsZXRlZCwgc2VudCBhIGRlbGV0ZSBldmVudAotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQsCi0JCQkJCQkJCWRlbGV0ZWRFbGVtZW50cyk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFyZW1vdmVkUmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIG90aGVyd2lzZSwgaXQncyBqdXN0IGEgcmVtb3ZlIG9mIHJlZmVyZW5jZXMsIHRoZQotCQkJCQkJLy8gbm90aWZpZXIgaXMgdGhlIGNoYW5nZWQgZWxlbWVudAotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lckFkZGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGliQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChNZXRob2RMaWJyYXJ5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZCgKLQkJCQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUoCi0JCQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUoCi0JCQkJCQkJCXJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyIHJlc291cmNlQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRAotCQkJCQkmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCS8vIGRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UobXNnLmdldE5vdGlmaWVyKCksIFBST1BfRElSVFkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IHByb3BDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIElSZWZyZXNoTGlzdGVuZXIgcmVmcmVzaExpc3RlbmVyID0gbmV3IElSZWZyZXNoTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaGVkKElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZVJlZnJlc2hFdmVudChldmVudCk7Ci0JCX0KLQkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVByb2Nlc3NvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVByb2Nlc3Nvci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlQcm9jZXNzb3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVmcmVzaEV2ZW50KElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJaWYoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpYnJhcnlQcm9jZXNzb3IuaGFuZGxlUmVmcmVzaEV2ZW50KCkiKTsgLy8kTk9OLU5MUy1OJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIHJlZnJlc2hlZCByZXNvdXJjZXM6ICIgKyBldmVudC5nZXRSZWZyZXNoZWRSZXNvdXJjZXMoKSk7Ci0JCX0KLQkJaWYoIWV2ZW50LmdldFVubG9hZGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuY2xlYW5VcCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaWJyYXJ5UHJvY2Vzc29yKCkgewotCQlpbml0KCk7Ci0KLQkJLy8gdGhpcyBpcyB0aGUgbWFpbiBpbnN0YW5jZSwgd2lsbCBiZSB0cmVhdGVkIGFzIHNpbmdsZXRvbgotCQlpc1NpbmdsZXRvbkluc3RhbmNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgTGlicmFyeVByb2Nlc3NvcihSZXNvdXJjZSByZXMpIHsKLQkJdGhpcygpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXNldFJlc291cmNlKHJlcyk7Ci0JCX0KLQotCQlpc1NpbmdsZXRvbkluc3RhbmNlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBjb25zdHJ1Y3Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHlvdSB3YW50IHRvIG1haW50YWluIHlvdXIgb3duCi0JICogTGlicmFyeVByb2Nlc3Nvciwgc3VjaCBhcyB3aGVuIGZvciBsaWJyYXJ5IGltcG9ydGluZyBvciBleHBvcnRpbmcuCi0JICogT3RoZXJ3aXNlLCBjYWxsIHRoZSBzdGF0aWMgZ2V0SW5zdGFuY2UoKSBtZXRob2QgdG8gcmV0cmlldmUgdGhlIHNpbmdsZXRvbgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UHJvY2Vzc29yKFN0cmluZyBsaWJyYXJ5UGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMoKTsKLQkJb3BlbkxpYnJhcnkobGlicmFyeVBhdGgpOwotCi0JCWlzU2luZ2xldG9uSW5zdGFuY2UgPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsKSB7Ci0JCXByb3BDaGFuZ2VMaXN0ZW5lcnMuYWRkKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbCkgewotCQlwcm9wQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZWQgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5SWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGZpbmFsIE9iamVjdCBzb3VyY2UsIGZpbmFsIGludCBwcm9wZXJ0eUlkKSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gcHJvcENoYW5nZUxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IGFycmF5Lmxlbmd0aDsgblgrKykgewotCQkJZmluYWwgSVByb3BlcnR5TGlzdGVuZXIgbCA9IChJUHJvcGVydHlMaXN0ZW5lcikgYXJyYXlbblhdOwotCi0JCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkJLy8gdGhyZWFkCi0JCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWwucHJvcGVydHlDaGFuZ2VkKHNvdXJjZSwgcHJvcGVydHlJZCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlicmFyeUxpc3RlbmVycygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCi0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBpZighbGlicmFyeS5lQWRhcHRlcnMoKS5jb250YWlucyhsaWJDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCS8vIGxpYnJhcnkuZUFkYXB0ZXJzKCkuYWRkKGxpYkNoYW5nZWRMaXN0ZW5lcik7Ci0JCS8vIH0KLQkJaWYgKCFsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuY29udGFpbnMoCi0JCQkJCXJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxpYnJhcnlMaXN0ZW5lcnMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQotCQlpZiAobGlicmFyeSA9PSBudWxsIHx8IGxpYnJhcnkuZVJlc291cmNlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gbGlicmFyeS5lQWRhcHRlcnMoKS5yZW1vdmUobGliQ2hhbmdlZExpc3RlbmVyKTsKLQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAodG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQpIHsKLQkJCS8vIGRlbGF5IHRoZSByZW1vdmUgdGlsbCBhIG5vdGlmaWNhdGlvbiBpcyByZXF1ZXN0ZWQKLQkJCWlmICghdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuYWRkKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIGludCBvcHRpb24sCi0JCQlmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJbG9hZGVkID0gdHJ1ZTsKLQotCQl0cnkgewotCQkJLy8gcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdG8gYmUgZGVsZXRlZAotCQkJaWYgKHRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBsID0gaXQubmV4dCgpOwotCQkJCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGwpKSB7Ci0JCQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMsCi0JCQkvLyBub3RlLCB0aGUgc2l6ZSBtYXkgY2hhbmdlIHNpbmNlIG5vdGlmeSBhIGxpc3RlbmVyIG1heSBjYXVzZWQgbmV3Ci0JCQkvLyBsaXN0ZW5lcnMgYmVpbmcgYWRkZWQKLQkJCS8vIHRob3NlIG5ldyBsaXN0ZW5lcnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHdlCi0JCQkvLyBhcmUgb2sKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgbGlzdGVuZXJzLnNpemUoKSkgewotCQkJCWZpbmFsIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXJzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQKLQkJCQkJLy8gaW4gdGhlIFVJIHRocmVhZAotCQkJCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCi0JCQkJCS8vIGV4ZWN1dGUgaXQgaW4gc3luYyBtb2RlLCBvdGhlcndpc2UgbWF5IGNhdXNlIHByb2JsZW0KLQkJCQkJLy8gc2luY2UgdGhlIG5vdGlmaWNhdGlvbiBtaWdodCBiZSBleGVjdXRlZCB0b28gbGF0ZS4KLQkJCQkJLy8gZm9yIGV4YW1wbGUsIGFmdGVyIHRoZSBsaXN0ZW5lciBvYmplY3QgaXMgZGlzcG9zZWQKLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlDaGFuZ2VkKG9wdGlvbiwgY29sbGVjdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCWkrKzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpbk9wZXJhdGlvbigpIHsKLQkJaW5PcGVyYXRpb24gPSB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRPcGVyYXRpb24oKSB7Ci0JCWluT3BlcmF0aW9uID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIHZhbGlkIGluIHRoZSBjdXJyZW50IHJlc291cmNlIHNldAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QuZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUob2JqZWN0KTsKLQkJCXJldHVybiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgIWUuZUlzUHJveHkoKQotCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSkgPT0gZ2V0TGlicmFyeSgpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGxpYnJhcnkncyBwcm9qZWN0IGlzIHN0aWxsIG9wZW4uIElmIG5vdCwgb3BlbiBpdAotCSAqLwotCS8qCi0JcHVibGljIGJvb2xlYW4gZW5zdXJlTGlicmFyeVByb2plY3RPcGVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldExpYnJhcnkoKTsKLQkJaWYobGliICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByaiA9IFJlc291cmNlVXRpbC5maW5kUHJvamVjdChsaWIpOwotCQkJaWYocHJqICE9IG51bGwgJiYgIXByai5pc09wZW4oKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByai5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JKi8KLQkKLQlwdWJsaWMgdm9pZCBvcGVuTGlicmFyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgb3BlbkxpYnJhcnkgPSBnZXRMaWJyYXJ5Um9vdFBhdGgoKS5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvcGVuTGlicmFyeSAhPSBudWxsICYmICFvcGVuTGlicmFyeS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9wZW5MaWJyYXJ5KG9wZW5MaWJyYXJ5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIG9wZW5MaWJyYXJ5KFN0cmluZyBsaWJyYXJ5UGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCQkJCi0JCQkvLyBvcGVuIHRoZSBtZXRob2QgbGlicmFyeSBhcyBhIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBzbyBpdCB3aWxsCi0JCQkvLyBzaG93IHVwIGluIHRoZSBSZXNvdXJjZSB2aWV3LgotCQkJLy8KLQkJCUZpbGUgbGliRGlyID0gbmV3IEZpbGUobGlicmFyeVBhdGgpLmdldFBhcmVudEZpbGUoKTsKLQkJCQotCQkJLy8gb25seSBjbG9zZSBwcmV2aW91cyBsaWJyYXJ5IGlmIHRoZSBuZXcgbGlicmFyeSdzIHByb2plY3Qgd2FzCi0JCQkvLyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JCQkvLyBjbG9zZSBwcmV2aW91cyBsaWJyYXJ5J3MgcHJvamVjdCBvbmx5IGlmIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZQotCQkJLy8gbmV3IG9uZQotCQkJY2xvc2VPcGVuZWRMaWJyYXJ5KCk7Ci0KLQkJCS8vIGxvY2sgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQlsb2NrTGlicmFyeShsaWJEaXIpOwotCi0JCQlSZXNvdXJjZVV0aWwub3BlbihsaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCi0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQlhc3NpZ25MaWJyYXJ5KHJlc291cmNlU2V0LmxvYWRMaWJyYXJ5KGxpYnJhcnlQYXRoKSk7Ci0KLQkJCUlTdGF0dXMgc3RhdHVzOwotCQkJaWYgKCFyZXNvdXJjZVNldC5oYXNVbnJlc29sdmVkUHJveHkoKSkgewotCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5UmVzb3VyY2VzCi0JCQkJCQkuZ2V0U3RyaW5nKCJMaWJyYXJ5LnVucmVzb2x2ZWRQcm94eUVycm9yLnJlYXNvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbXNnLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRCwgbnVsbCk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJZW5kT3BlcmF0aW9uKCk7Ci0KLQkJCS8vIGRpcnR5ID0gZmFsc2U7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2UoZ2V0TGlicmFyeSgpLCBQUk9QX0RJUlRZKTsKLQotCQkJLy8gc2V0Q3VycmVudENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFzc2lnbnMgbGlicmFyeSB0byBhIG5ldyB2YWx1ZSBhbmQgYXR0YWNoIHRoZSBjaGFuZ2UgbGlzdGVuZXJzIHRvIGl0LgotCSAqIAotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXNzaWduTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYikgewotCQlyZW1vdmVMaWJyYXJ5TGlzdGVuZXJzKCk7Ci0JCWFkZExpYnJhcnlMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TmFtZSwgU3RyaW5nIGxpYnJhcnlQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNsb3NlT3BlbmVkTGlicmFyeSgpOwotCi0JCQkvLyBpc011bHRpcGxlRmlsZXMgPSBiTXVsdGlwbGU7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCi0JCQlGaWxlIGxpYl9wYXRoID0gbmV3IEZpbGUobGlicmFyeVBhdGgpOwotCQkJbGlicmFyeVBhdGggPSBsaWJfcGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJLy8gb3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgYXMgYSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugc28gaXQgd2lsbAotCQkJLy8gc2hvdyB1cCBpbiB0aGUgUmVzb3VyY2Ugdmlldy4KLQkJCVJlc291cmNlVXRpbC5vcGVuKGxpYnJhcnlQYXRoLCBudWxsKTsKLQotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCU1vZGVsU3RvcmFnZS5uZXdMaWJyYXJ5KHJlc291cmNlU2V0LCBsaWJyYXJ5TmFtZSwgbGlicmFyeVBhdGgsIHRydWUpOwotCQkJYXNzaWduTGlicmFyeShyZXNvdXJjZVNldC5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCQkvLyBsb2NrIHRoZSBsaWJyYXJ5Ci0JCQlsb2NrTGlicmFyeShsaWJfcGF0aCk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbmRPcGVyYXRpb24oKTsKLQkJCS8vIHNldERpcnR5KHRydWUpOwotCQkJLy8gc2V0Q3VycmVudENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZ2l2ZW4gcmVzb3VyY2UgaWYgaXQgYmVsb25nIHRvIHRoZSBjdXJyZW50bHkgb3BlbiBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCXJlc291cmNlU2V0LnNhdmUocmVzb3VyY2UsIHNhdmVPcHRpb25zKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVMaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJZG9TYXZlKHNhdmVPcHRpb25zKTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShsaWJyYXJ5LCBQUk9QX0RJUlRZKTsKLQotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX1NBVkVELCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBvcGVuIGxpYnJhcnkgdW5kZXIgYSBuZXcgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGlyCi0JICogICAgICAgICAgICBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IHRvCi0JICogQHBhcmFtIHJlZ2VuZXJhdGVHVUlECi0JICogICAgICAgICAgICBpZiB0cnVlLCByZWdlbmVyYXRlIEdVSUQgZm9yIGFsbCBNZXRob2RFbGVtZW50cyBpbiB0aGUgb3BlbgotCSAqICAgICAgICAgICAgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVMaWJyYXJ5QXMoU3RyaW5nIG5ld0RpciwgYm9vbGVhbiByZWdlbmVyYXRlR1VJRCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBvbGRMaWJEaXIgPSBnZXRMaWJyYXJ5Um9vdFBhdGgoKQotCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkvLyBjcmVhdGUgbmV3IElQcm9qZWN0Ci0JCVJlc291cmNlVXRpbC5vcGVuKG5ld0RpciwgbW9uaXRvcik7Ci0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0TGlicmFyeSgpCi0JCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCXJlc291cmNlU2V0LnNhdmVBcyhuZXdEaXIsIHJlZ2VuZXJhdGVHVUlELCBtb25pdG9yKTsKLQotCQkvLyBoYW5kbGUgYXR0YWNobWVudHMgaGVyZQotCQlDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLmNvcHlBdHRhY2htZW50c0xpYnJhcnkob2xkTGliRGlyLCBuZXdEaXIsCi0JCQkJbnVsbCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlQYXRoCi0JICogQHBhcmFtIGJNdWx0aXBsZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTGlicmFyeUFzKFN0cmluZyBsaWJyYXJ5UGF0aCwgYm9vbGVhbiBiTXVsdGlwbGUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVzb3VyY2UgcmVzID0KLQkJLy8gKChSZXNvdXJjZSllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKTsKLQkJLy8gcmVzLnNldFVSSShVUkkuY3JlYXRlRmlsZVVSSShsaWJyYXJ5UGF0aCkpOwotCQkvLyByZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCS8vCi0JCS8vIHNldFNhdmVBc011bHRpcGxlRm9sZGVyKGJNdWx0aXBsZSk7Ci0JCS8vICAgICAgICAJCi0JCS8vIGRvU2F2ZShzYXZlQXNPcHRpb25zKTsKLQkJLy8gc2V0RGlydHkoZmFsc2UpOwotCQkvLyBpc011bHRpcGxlRmlsZXMgPSBiTXVsdGlwbGU7Ci0JCS8vICAgICAgICAKLQkJLy8gbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX1NBVkVELCBudWxsKTsKLQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVzb3VyY2UoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzKTsKLQkJCWFzc2lnbkxpYnJhcnkocmVzb3VyY2VTZXQuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0TGlicmFyeVJlc291cmNlKCkgewotCQlMaXN0IHJlcyA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzLnNpemUoKSA+IDApIHsKLQkJCXJldHVybiAoUmVzb3VyY2UpIHJlcy5nZXQoMCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0TGlicmFyeVVSSSgpIHsKLQkJUmVzb3VyY2Ugc2F2ZWRSZXNvdXJjZSA9IGdldExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAoc2F2ZWRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2F2ZWRSZXNvdXJjZS5nZXRVUkkoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0UmVsYXRpdmVVUkkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVVSSSBsaWJVUkkgPSBnZXRMaWJyYXJ5VVJJKCk7Ci0JCVVSSSBlbGVtZXRuVVJJID0gZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJVVJJIHJlbFVyaSA9IGVsZW1ldG5VUkkuZGVyZXNvbHZlKGxpYlVSSSk7Ci0KLQkJcmV0dXJuIHJlbFVyaTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKSB7Ci0JCS8vIG5vIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGlkIGxpYnJhcnkgaXMgbm90IGxvYWRlZAotCQlpZiAobGF5b3V0TWdyID09IG51bGwpIHsKLQkJCWlmIChnZXRMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJCWxheW91dE1nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxheW91dE1ncjsKLQl9Ci0KLQkvKgotCXB1YmxpYyBWZXJzaW9uTWFuYWdlciBnZXRWZXJzaW9uTWFuYWdlcigpIHsKLQkJaWYgKHZlcnNpb25NZ3IgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHZlcnNpb25NZ3IgPT0gbnVsbCkgewotCQkJCQl2ZXJzaW9uTWdyID0gbmV3IFZlcnNpb25NYW5hZ2VyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB2ZXJzaW9uTWdyOwotCX0KLQkqLwotCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeShNZXRob2RMaWJyYXJ5IG5ld0xpYikgewotCQlhc3NpZ25MaWJyYXJ5KG5ld0xpYik7Ci0JCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkKLQkJCQkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOwotCQlyZXMuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQobmV3TGliKTsKLQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSkpIHsKLQkJCQkJCQlzYXZlT3B0aW9ucy5wdXQoCi0JCQkJCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFLAotCQkJCQkJCQkJZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKGV2ZW50Ci0JCQkJCQkJCS5nZXRQcm9wZXJ0eSgpCi0JCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKSkgewotCQkJCQkJCXNhdmVPcHRpb25zCi0JCQkJCQkJCQkucHV0KAotCQkJCQkJCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQkJCQkJCQkJZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCS8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBlZGl0aW5nIGRvbWFpbiBmb3IgbGlicmFyeSBvcGVyYXRpb24KLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJZmFjdG9yaWVzKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpOwotCQkKLQkJcmVzb3VyY2VTZXQuYWRkUmVmcmVzaExpc3RlbmVyKHJlZnJlc2hMaXN0ZW5lcik7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZXNvdXJjZVNldChyZXNvdXJjZVNldCk7Ci0KLQkJc2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJYm9vbGVhbiBiID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSk7Ci0JCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFLCBCb29sZWFuCi0JCQkJLnZhbHVlT2YoYikpOwotCQliID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQljb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCQkvLyBDcmVhdGUgbmV3IElDb250ZW50RGVzY3JpcHRpb25QZXJzaXN0ZXIgYW5kIHNldCBpdCB0byB0aGUKLQkJLy8gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeSBmb3IgdXNlLgotCQkvLwotCQlJTWV0aG9kTGlicmFyeVBlcnNpc3RlciBjb250ZW50RGVzY1BlcnNpc3RlciA9IG5ldyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkuc2V0TWV0aG9kTGlicmFyeVBlcnNpc3Rlcihjb250ZW50RGVzY1BlcnNpc3Rlcik7Ci0KLQkJQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5zZXRGaWxlTWFuYWdlcihGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpKTsKLQotCQlyZWdpc3RlckVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9TYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKExvZy5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTYXZlIG9wdGlvbnM6ICIgKyBvcHRpb25zKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gTGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEZpbGUgbGliRGlyID0gbmV3Ci0JCS8vIEZpbGUoKChSZXNvdXJjZSllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCi0JCXRyeSB7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2UocykKLQkJCS8vCi0JCQlyZXNvdXJjZVNldC5zYXZlKG9wdGlvbnMpOwotCi0JCQkoKEJhc2ljQ29tbWFuZFN0YWNrKSBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuZE9wZXJhdGlvbigpOwotCi0JCX0KLQl9Ci0KLQkvKgotCXB1YmxpYyB2b2lkIGRpc2NhcmRDaGFuZ2VzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCX0KLQl9Ci0JKi8KLQotCXB1YmxpYyBib29sZWFuIGlzTGlicmFyeUxvYWRlZCgpIHsKLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TWV0aG9kTW9kZWxzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0JCXJldHVybiAobGlicmFyeSA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCX0KLQotCXB1YmxpYyBNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luKFN0cmluZyBndWlkKSB7Ci0JCWlmIChndWlkICE9IG51bGwpIHsJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0TWV0aG9kTW9kZWxzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBwID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJCWlmIChndWlkLmVxdWFscyhwLmdldEd1aWQoKSkpIHsKLQkJCQkJcmV0dXJuIHA7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHByb2Nlc3MgZmFtaWx5IGJ5IG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUHJvY2Vzc0ZhbWlseQotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWx5IGdldFByb2Nlc3NGYW1pbHkoU3RyaW5nIG5hbWUpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJCWlmICgoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkKLQkJCQkJCSYmIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiAoUHJvY2Vzc0ZhbWlseSkgY29uZmlnOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlZ2lzdGVyIGVkdGluZyBkb21haW4gd2l0aCB0aGlzIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFZGl0aW5nRG9tYWluKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJLyoqCi0JCSAqIHRoaXMgbm90aWZ5cyBhbGwgY2hhbmdlcywgbm90IGp1c3QgdGhlIGNvbnRlbnQgY2hhbmdlLCBvbmx5IHBpY2sgdGhlCi0JCSAqIG9uZXMgZm9yIGVsZW1lbnQgdXBkYXRlcy4gVGhlIG90aGVyIG9wZXJhdGlvbnMgYXJlIGNvbHZlcmVkIGJ5IHRoZQotCQkgKiBDb21tYW5kIGV2ZW50cwotCQkgKi8KLQkJKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBkb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKSkKLQkJCQkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvCi0JCS8vIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgotCQlkb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdGVuVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlhZGFwdGVyRmFjdG9yeS5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdGVuVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCWNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzYXZlT3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlyZXR1cm4gc2F2ZU9wdGlvbnM7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0TGlicmFyeVJvb3RQYXRoKCkgewotCQlVUkkgdXJpID0gdGhpcy5nZXRMaWJyYXJ5VVJJKCk7Ci0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXJldHVybiBmLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBsdWdpbihmaW5hbCBNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQotCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkvLyB0aHJlYWQKLQkJLy8gb3RoZXJ3aXNlLCB3aWxsIGNhdXNlIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24KLQkJZmluYWwgRXhjZXB0aW9uW10gZXhjZXB0aW9ucyA9IG5ldyBFeGNlcHRpb25bMV07Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldExpYnJhcnkoKS5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKG1vZGVsKTsKLQotCQkJCUlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkuZ2V0TWV0aG9kTGlicmFyeVBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUoZ2V0TGlicmFyeSgpLmVSZXNvdXJjZSgpKTsKLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQlleGNlcHRpb25zWzBdID0gZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCW1vZGVsLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChleGNlcHRpb25zWzBdICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbnNbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcy9kaXNhYmxlcyBub3RpZmljYXRpb24gZW50aXJlbHkuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikgewotCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZVNldERlbGl2ZXIoYik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVEZWxpdmVyKCk7Ci0JfQotCi0JLyoqCi0JICogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBjdXJyZW50IGxpYnJhcnkgaXMgdG8gYmUgY2xvc2VkLiBmb3IgZXhhbXBsZSwKLQkgKiB3aGVuIHlvdSB0cnkgdG8gb3BlbiBhIG5vdGhlciBsaWJyYXJ5IGZvciBjcmVhdGUgYSBuZXcgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlT3BlbmVkTGlicmFyeSgpIHsKLQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xJQlJBUllfQ0xPU0VELCBudWxsKTsKLQotCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJVc2VkIG1lbW9yeSBiZWZvcmUgY2xvc2luZyBsaWJyYXJ5OiAiICsgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIFJBVExDMDAzODQ1OTggLSBFeHBvcnQ6IEluZmluaXRlIGxvb3AgTnVsbHBvaW50ZXJFeGNlcHRpb24gYWZ0ZXIKLQkJLy8gZXhwb3J0aW5nIGFuZCB1bmNoZWNraW5nIHJ1cCBwbHVnaW4gaW4gY29uZmlndXJhdGlvbgotCQkvLyBzbyBkb24ndCBkaXNwb3NlIGl0IGlmIG5vdCB0aGUgbWFpbiBzaW5nbGV0b24gaW5zdGFuY2UKLQkJaWYgKGlzU2luZ2xldG9uSW5zdGFuY2UpIHsKLQkJCS8vIGRpc3Bvc2UgYWxsIGl0ZW0gcHJvdmlkZXJzCi0JCQkvLwotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UucmVzZXQoKTsKLQotCQkJLy8gY2xlYXIgZmlsdGVyIGNvbnN0YW50cyBoYXNoTWFwCi0JCQlpZiAoRmlsdGVyQ29uc3RhbnRzLmhhc2hNYXAgIT0gbnVsbCkgewotCQkJCUZpbHRlckNvbnN0YW50cy5oYXNoTWFwLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGhpcy5sYXlvdXRNZ3IgIT0gbnVsbCkgewotCQkJdGhpcy5sYXlvdXRNZ3IuY2xlYXIoKTsKLQkJfQotCi0KLQkJLy8gY2xlYXIgdGhlIHRlbXAgbGF5b3V0IAotCQlMYXlvdXRSZXNvdXJjZXMuY2xlYXIoKTsKLQotCQkvKgotCQkgKiBpZiAoIHRoaXMuZGVwTWdyICE9IG51bGwgKSB7IHRoaXMuZGVwTWdyLmNsZWFyKCk7IH0gdGhpcy5kZXBNZ3IgPQotCQkgKiBudWxsOwotCQkgKi8KLQotCQl0aGlzLmxheW91dE1nciA9IG51bGw7Ci0KLQkJLy8gdGhpcy5pbnZhbGlkR3VpZHMuY2xlYXIoKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0KLQkJcmVzb3VyY2VTZXQuY2xlYXJFcnJvcnMoKTsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCi0JCXVubG9ja0xpYnJhcnkoKTsKLQotCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzZXQoKTsKLQotCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOwotCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJVc2VkIG1lbW9yeSBhZnRlciBjbG9zaW5nIGxpYnJhcnk6ICIgKyAoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmxvY2tMaWJyYXJ5KCkgewotCQkvLyByZWxlYXNlIGxvY2sgb24gb2xkIGxpYidzIHByb2plY3QKLQkJdHJ5IHsKLQkJCWlmIChsb2NrICE9IG51bGwpIHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCQlsb2NrLmNoYW5uZWwoKS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2NrcyB0aGUgLmxvY2sgZmlsZSBpbiB0aGUgZ2l2ZW4gcGF0aC4gQ3JlYXRlcyBhIC5sb2NrIGZpbGUgaWYgb25lIGRvZXMKLQkgKiBub3QgZXhpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgcGF0aCB0byBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbG9ja0xpYnJhcnkoRmlsZSBsaWJEaXJGaWxlKSB7Ci0JCUZpbGUgbG9ja0ZpbGUgPSBuZXcgRmlsZShsaWJEaXJGaWxlLCBSZXNvdXJjZVV0aWwuTE9DS19GSUxFTkFNRSk7Ci0JCWxvY2sgPSBGaWxlVXRpbC5sb2NrRmlsZShsb2NrRmlsZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiN2I1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSU9wcG9zaXRlRmVhdHVyZUxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBsb2FkaW5nIG9mIG9wcG9zaXRlIGZlYXR1cmVzIGZvciBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIGltcGxlbWVudHMgSU9wcG9zaXRlRmVhdHVyZUxvYWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSU9wcG9zaXRlRmVhdHVyZUxvYWRlciNsb2FkT3Bwb3NpdGVGZWF0dXJlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUhhc2hTZXQgb3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgZGVsZXRlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgbzsKLQkJCQlpZihyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLQkJCQkJUmVzb3VyY2VTZXQgcnNldDsKLQkJCQkJaWYocmVzb3VyY2UgPT0gbnVsbCB8fCAhKChyc2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlyZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJzZXQ7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlLmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgIT0gbnVsbAotCQkJCQkJCQkmJiAhZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJb3Bwb3NpdGVGZWF0dXJlcwotCQkJCQkJCQkJLmFkZEFsbChmZWF0dXJlcyk7Ci0JCQkJCQkJZGVsZXRlZEdVSURzLmFkZCgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gZS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCQkJaWYgKGZlYXR1cmVzICE9IG51bGwgJiYgIWZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZEFsbChmZWF0dXJlcyk7Ci0JCQkJCWRlbGV0ZWRHVUlEcy5hZGQoZS5nZXRHdWlkKCkpOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCXJlc291cmNlU2V0LmxvYWRPcHBvc2l0ZUZlYXR1cmVzKG5ldyBBcnJheUxpc3Qob3Bwb3NpdGVGZWF0dXJlcyksIGRlbGV0ZWRHVUlEcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzc2OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgbWFuYWdpbmcgYSBYTUktYmFzZWQgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVkZTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbWFuYWdpbmcgYSBYTUktYmFzZWQgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcHJlZmVyZW5jZXMvWE1JTGlicmFyeVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wcmVmZXJlbmNlcy9YTUlMaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NjVkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wcmVmZXJlbmNlcy9YTUlMaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgWE1MIE1ldGhvZCBMaWJyYXJ5IHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX1BBVEggPSAiZGVmYXVsdExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJU3RyaW5nIGRlZmF1bHRMaWJyYXJ5UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgLy8kTk9OLU5MUy0xJAotCQkJCS8vIEZJWE1FISBBdm9pZCB1c2luZyBoYXJkIGNvZGVkIGNvbnN0YW50Ci0JCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArICJFUEYiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgIk1ldGhvZCBMaWJyYXJpZXMiOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9MSUJSQVJZX1BBVEgsIGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJREVGQVVMVF9MSUJSQVJZX1BBVEgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjlkM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIExpYnJhcnkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwMDM4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzNmMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogbGlicmFyeS5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZlNDI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UubGlicmFyeS5qYXIgPSBzcmMvCi1vdXRwdXQubGlicmFyeS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBsaWJyYXJ5LmphcixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGxheW91dC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9pY29ucy9Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2Nzcy9kZWZhdWx0LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9jc3MvZGVmYXVsdC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjhjMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2Nzcy9kZWZhdWx0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi1oMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IGxhcmdlOwotfQotCi1oMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDE1MCU7Ci19Ci0KLWgzIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotfQotCi1oNCwgaDUsIGg2IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotYTpsaW5rIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWE6YWN0aXZlIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYTp2aXNpdGVkIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWFbaHJlZl06aG92ZXIgewotCWNvbG9yOiAjZmYwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1vbCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotfQotCi1vbCBsaSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdWwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tbGVmdDogMzBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci19Ci0KLXVsIGxpIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10YWJsZSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwkKLX0KLQotdGJvZHkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXZhbGlnbjogYmFzZWxpbmU7Ci19Ci0KLXRoIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXRkIHVsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQltYXJnaW4tYm90dG9tOiAwcHg7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci19Ci0KLS5wYWdlVGl0bGUgewotCWJhY2tncm91bmQ6ICM5OTk5Y2M7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDVweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0ucGFnZVRpdGxlU2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLnRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzVjODFhNzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmFjdGl2ZVRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2M4ZDdlMzsKLQljb2xvcjogIzI5M2Q2YjsJCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmxpbmssIGEudGFiOmFjdGl2ZSwgYS50YWI6dmlzaXRlZCB7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsJCi19Ci0KLS5vdmVydmlldyB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDIwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotfQotCi0ub3ZlcnZpZXdUYWJsZSB7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQl3aWR0aDogMTAwJTsJCi19Ci0KLS5vdmVydmlld1RhYmxlIHRkIHsKLQlwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7Ci19Ci0KLS5vdmVydmlld1NlcGFyYXRvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZVRleHQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlwYWRkaW5nLWxlZnQ6IDVweDsKLQlwYWRkaW5nLXJpZ2h0OiA1cHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbmsgewotCWNvbG9yOiAjMzMzMzMzOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rOmhvdmVyIHsKLQljb2xvcjogIzAwMDBmZjsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluazp2aXNpdGVkIHsKLQljb2xvcjogIzMzMzMzMzsKLX0KLQotLnNlY3Rpb25IZWFkaW5nIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOThiMWM0OwotCWNvbG9yOiAjZmZmZmZmOwotCWN1cnNvcjogaGFuZDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc2VjdGlvbkNvbnRlbnQgewotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnNlY3Rpb25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcC1jb2xvcjogI2NjYzsKLQkKLQkvKmRvbid0IGRlZmluZSBwYWRkaW5nIGluIHRhYmxlLCB0aGUgYmVoYXZpb3IgaXMgZGlmZmVyZW50IGluIElFIGFuZCBmaXJlZm94LiAKLQkgSW4gSUUsIHRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBjb2xvciBpcyBlbmZvcmNlZC4KLQkgaW4gZmlyZWZveCwgdGhlIHBhZGRpbmcgaXMgYXBwbGllZCBmaXJzdCwgc28gbGVhdmUgdGhlIHRhYmxlJ3MgYmFja2dyb3VuZCBpbnRoZSBwYWRkaW5nIGFyZWEuCi0JIERlZmluZSB0aGUgcGFkZGluZyBpbiB0aGUgdGFibGUgY2VsbCBpbnN0ZWFkLCB0aGlzIHdvcmtzIGluIGJvdGggSUUgYW5kIG1vemlsbGEKLQkgKi8KLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7CQotCXdpZHRoOiAxMDAlOwotfQotCi0uc2VjdGlvblRhYmxlSGVhZGluZyB7Ci0JYmFja2dyb3VuZDogI2VlZTsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQljb2xvcjogIzMzMzMzMzsKLQloZWlnaHQ6IDIwOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0Jd2lkdGg6IDIwJTsKLQlwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAxMHB4OwkKLQotfQotCi0uc2VjdGlvblRhYmxlQ2VsbEhlYWRpbmcgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlmb250LWNvbG9yOiAjNjY2NjY2OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci0KLX0KLQotLnNlY3Rpb25UYWJsZUNlbGwgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci0KLX0KLQotLnNlY3Rpb25UYWJsZVNpbmdsZUNlbGwgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uYnJlYWtkb3duVGFibGUgdGggewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uYnJlYWtkb3duVGFibGUgdGQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uZGVmYXVsdFRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5kZWZhdWx0VGFibGUgdGQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5zdWJTZWN0aW9uSGVhZGluZyB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3ViU2VjdGlvbkNvbnRlbnQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5zdGVwSGVhZGluZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLQljb2xvcjogIzI5M2Q2YjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3RlcENvbnRlbnQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnN0ZXBUYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogIzk5OTk5OSBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICM5OTk5OTkgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDIwcHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5zdGVwVGFibGUgdGQgewotCWJvcmRlcjogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5zdGVwU2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLmJhY2tUb1RvcExpbmsgewotCWNvbG9yOiAjZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7CQotCW1hcmdpbjogMHB4OwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXRleHQtYWxpZ246IG1pZGRsZTsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmFja1RvVG9wTGluazpob3ZlciB7Ci0JY29sb3I6ICM5Njk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rOnZpc2l0ZWQgewotCWNvbG9yOiAjNWM4MWE3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjNzA4MGIwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDI1cHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnZlcnNpb25JbmZvIHsKLQljb2xvcjogIzcwODBiMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAyNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5xdW90ZSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uY29kZVNhbXBsZSB7Ci0JZm9udC1mYW1pbHk6IGNvdXJpZXI7Ci0JZm9udC1zaXplOiAxMHB0OwkJCi19Ci0KLS5lbGVtZW50TGluayB7Ci0JY29sb3I6ICMwMDAwZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLS5lbGVtZW50TGlua1dpdGhUeXBlIHsKLQljb2xvcjogIzAwMDBmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0IHsKLQljb2xvcjogIzAwMDBmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotI3Jlc3VsdHMgewotIAlib3JkZXItdG9wOiB0aGluIHNvbGlkIGJsYWNrOwotCW1hcmdpbjogMTBweCBhdXRvIDEwcHggYXV0bzsKLQltYXgtd2lkdGg6IDU5MHB4OwotCXBhZGRpbmc6IDEwcHg7Ci0gIAlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogZXhwcmVzc2lvbigoZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aC0zMCkrJ3B4Jyk7Ci19Ci0KLS8qCi0uY29udGVudFRvb2xiYXJJY29uIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JbWFyZ2luOiAwcHg7Ci0JcGFkZGluZzogMHB4OwkKLX0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBpbWcgewotCWN1cnNvcjogcG9pbnRlcjsKLQltYXJnaW46IDBweDsKLQlwYWRkaW5nOiAwcHg7Ci0JYm9yZGVyOiAwcHg7Ci19Ci0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhOmxpbmsgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0uY29udGVudFRvb2xiYXJJY29uIGE6YWN0aXZlIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhOnZpc2l0ZWQgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0uY29udGVudFRvb2xiYXJJY29uIGE6aG92ZXIgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhW2hyZWZdOmhvdmVyIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0qLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWU0ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvQXJ0aWZhY3QuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM5MTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmZTYyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvRGVsaXZlcmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjczODgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTgzYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1JvbGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM0NjEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhYzJjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvVGFzay5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWEwODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL3Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5X21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FjbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9hY2xzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYjU5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FjbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9hbmFtZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FuYW1kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2NjZlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FuYW1kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfY2xhc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9jbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODM1MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9jbGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rlc21kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZGVzbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBjYzkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZGVzbWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI5ZDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZG9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBrZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rwa2cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI2YWE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBrZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjU4ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kcGxtb2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kc3N1Yi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rzc3ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3YTZiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rzc3ViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZXZlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9ldmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWY2NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9ldmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ltcG1kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW1wbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQwNmFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW1wbWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9pbnRmYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ludGZjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMWJhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ludGZjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwN2ZkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX3BvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX3NpZ25hLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfc2lnbmEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGIwMzFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfc2lnbmEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0X21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjZGZhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9iYWNrX3RvX3RvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2tfdG9fdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2ZDk1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2tfdG9fdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYm9va21hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ib29rbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZDUzNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ib29rbWFyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NhcGFiaWxpdHlwYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBiMWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaGVja2xpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX2Nsb3NlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX2Nsb3NlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkZDk3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9jbG9zZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9vcGVuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX29wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjE4ZTI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX29wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb2xsYXBzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2NTQxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmNzAxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbXBvc2l0ZXJvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb21wb3NpdGVyb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbXBvc2l0ZXJvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb25jZXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTk1Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjMDgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZV9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2VfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjMDgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZV9tZWRpdW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jdXN0b21jYXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jdXN0b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIyZDhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY3VzdG9tY2F0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGVsaXZlcnlwcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGVsaXZlcnlwcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYTc4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc2NpcGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxNWE5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNjaXBsaW5lZ3JvdXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNjaXBsaW5lZ3JvdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQzMDY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzY2lwbGluZWdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjQwMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXZpZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGl2aWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOWU3ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXZpZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDIwMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZiODE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwNmM5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjkwNGVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2MzViMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjdkNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG93bl9hcnJvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhjNDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG93bl9hcnJvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2VzdGltYXRpb25jb25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2VzdGltYXRpb25jb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDRjM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leGFtcGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzEwYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwZmU4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leHBhbmRfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExOGEzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9mYWxzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZhbHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2NjVkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZhbHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZm9yd2FyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDVhMWFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRhbmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZV9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZV9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2VfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDAzYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM4YTE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvaXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbGVmdG5hdl9tb2NrdXAuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9sZWZ0bmF2X21vY2t1cC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTY1NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9sZWZ0bmF2X21vY2t1cC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YzI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW5fbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YzI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW5fbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25lZWRfaWNvbi5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25lZWRfaWNvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDExYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9uZWVkX2ljb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ub19ydXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ub19ydXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZjNDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbm9fcnVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9waGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2IzY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9waGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGM0MzZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcmludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMjA4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3NfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzc19tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzc19tZWRpdW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXBvcnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWEyMzEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmVwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmV1c2FibGVhc3NldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JldXNhYmxlYXNzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjk3ODhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmV1c2FibGVhc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvYWRtYXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2FkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjNTEzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmE0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZV9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlX21lZGl1bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmE0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVkZXNfbGdfZGdtMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmMjJlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVkZXNfbGdfZGdtMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZXNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjY3YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDFfYS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDFfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjQwMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ydXAxX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zYW1wbGVfc2VjdGlvbmhlYWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zYW1wbGVfc2VjdGlvbmhlYWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTJlODIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2FtcGxlX3NlY3Rpb25oZWFkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2hpbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NoaW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJhNzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2hpbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N0ZXBfc2FtcGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3RlcF9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y0MDk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3RlcF9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFlNGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3VwcG9ydGluZ21hdGVyaWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1hLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjYzVlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtaS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtaS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTQ0N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfZW5kLWkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWFfaS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtYV9pLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3OTU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtYV9pLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2EuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWlfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTg2N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWlfYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9pLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg3YjBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfc3BhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfc3BhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE5OGRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlX21pZGRsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZV9taWRkbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE5YmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlX21pZGRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNDYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNDYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVkNDcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlYW1wcm9maWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmJkN2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWNobmlxdWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWNobmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVjaG5pcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2E3ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVybWRlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGM5ZjI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVybWRlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlY2EwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiODljMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19yaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rvb2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sbWVudG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9vbG1lbnRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTVhMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sbWVudG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1YWNmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcF9zbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcF9zbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlN2ZiYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3Bfc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3BiYXJfbW9ja3VwLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wYmFyX21vY2t1cC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjY2NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3BiYXJfbW9ja3VwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdHJ1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RydWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRkYTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdHJ1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VfYm9sZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VfYm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmY2Q1YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91X2JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91cF9hcnJvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlNWNjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd2hpdGVwYXBlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3doaXRlcGFwZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU0OGVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd2hpdGVwYXBlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy93b3JrZGVzX2xnX2RnbTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0ZTVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5MDhjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDg2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb24gQWN0aXZpdHlUcmVlVGFibGUoLypQcm9jZXNzRWxlbWVudFBhZ2UqL3BhcmVudCkgewotdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci10aGlzLnRyZWVfbm9kZV9jbGFzcyAgPSAidHJlZU5vZGUiOwkvLyAhISEgZG9uJ3QgdHJhbnNsYXRlIHRoaXMgISEhCi10aGlzLmV4cGFuZEltYWdlID0gbnVsbDsKLXRoaXMuY29sbGFwc2VJbWFnZSA9IG51bGw7Ci10aGlzLnNoaW1JbWFnZSA9IG51bGw7Ci10aGlzLndic0l0ZW1IdG1sID0gbnVsbDsKLXRoaXMuaW1hZ2VQYXRoID0gbnVsbDsKLXRoaXMuTk9ERV9DT0xMQVBTRUQgPSAwOwotdGhpcy5OT0RFX0VYUEFOREVEID0gMTsKLXRoaXMuREVGQVVMVF9FWFBBTkRfTEVWRUwgPSAwOyAvLyAwIC0gY29sbGFwc2UgYWxsLCAxIC0gZXhwYW5kIHRoZSBmaXJzdCBsZXZlbCwgLi4uLCA5OTk5IC0gaWYgeW91IGhhdmUgdGhpcyBtYW55Ci0KLX07Ci0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHRyZWUgdGFibGUKLS8vIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIGh0bWwgc291cmNlIGFyZSBhcyBmb2xsb3dzOgotLy8gZWFjaCA8VFIgdGFnIGhhcyBhIHVpbnF1ZSBpZCBhbmQgYSBwYXJlbnRJZC4KLS8qCi08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2Nzcy9kZWZhdWx0LmNzcyIgcmVsPSJTdHlsZVNoZWV0Ij4KLTxzY3JpcHQgc3JjPSIuL3RyZWV0YWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBvbmxvYWQ9ImNyZWF0ZVRyZWUoJ3RkJywgJ3RyZWVOb2RlJywgJy4vaW1hZ2VzLycpOyIgPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHIgaWQ9IjEiIHBhcmVudElkPSIwIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAxLTE8L3RkPjx0ZD5jb2wgMS0yPC90ZD4KLTwvdHI+Ci0KLTx0ciBpZD0iMiIgcGFyZW50SWQ9IjEiPgotPHRkIGNsYXNzPSJ0cmVlTm9kZSI+Y29sIDEtMTwvdGQ+PHRkPmNvbCAyLTI8L3RkPgotPC90cj4KLQotPHRyIGlkPSIzIiBwYXJlbnRJZD0iMSI+Ci08dGQgY2xhc3M9InRyZWVOb2RlIj5jb2wgMS0xPC90ZD48dGQ+Y29sIDItMjwvdGQ+Ci08L3RyPgotCi08dHIgaWQ9IjQiIHBhcmVudElkPSIwIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAyLTE8L3RkPjx0ZD5jb2wgMi0yPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotKi8KLUFUVFJfUk9XX0RBVEFfSU5ERVggPSAiZGF0YUluZGV4IjsKLUFUVFJfQ0hJTERfTE9BREVEID0gImNoaWxkTG9hZGVkIjsKLUFUVFJfSU5ERU5UX1NJWkUgPSAiaW5kZW50U2l6ZSI7Ci1BVFRSX0VYUEFOREVEID0gImV4cGFuZGVkIjsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbihpbWdQYXRoKQotewotCXRoaXMuaW1hZ2VQYXRoID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoKTsKLQl0aGlzLmV4cGFuZEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnZXhwYW5kLmdpZic7CQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2NvbGxhcHNlLmdpZic7Ci0JLy9leHBhbmRBbGxJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJCi0JLy9jb2xsYXBzZUFsbEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnY29sbGFwc2VfYWxsLmdpZic7Ci0JLy9iYWNrVG9Ub3BJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7Ci0JdGhpcy5zaGltSW1hZ2UgPSB0aGlzLmltYWdlUGF0aCArICdpbmRlbnQuZ2lmJzsKLQl0aGlzLndic0l0ZW1IdG1sID0gbmV3IFdCU0l0ZW1IdG1sKHRoaXMsIHRoaXMuaW1hZ2VQYXRoKTsKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5jcmVhdGVUcmVlID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCi0JLy8gY3JlYXRlIHRoZSB0cmVlIHRhYmxlIGZpcnN0Ci0JdGhpcy5jcmVhdGVUYWJsZSgpOwotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuY3JlYXRlVGFibGUgPSBmdW5jdGlvbigpIHsKLQotCXZhciBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJlZUNvbnRlbnQiKTsKLQlpZiAoIGRpdiA9PSBudWxsICkgcmV0dXJuOwotCQotCS8vIGNyZWF0ZSB0YWJsZQotCXZhciB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRBQkxFIik7Ci0JdGFibGUuaWQgPSAiQWN0aXZpdHlUcmVlVGFibGUiOwotCXRhYmxlLnRpdGxlID0gdGhpcy5kYXRhLnRpdGxlOwotCXRhYmxlLnN1bW1hcnkgPSB0aGlzLmRhdGEuc3VtbWFyeTsKLQl0YWJsZS5jZWxsc3BhY2luZyA9ICIwcHgiOwotCXRhYmxlLmNlbGxwYWRkaW5nID0gIjBweCI7Ci0JdGFibGUuYm9yZGVyPSIwcHgiOwotCXRhYmxlLndpZHRoPSIxMDAlIjsKLQl0YWJsZS5ib3JkZXJjb2xvciA9ICIjOTk5OTk5IjsKLQl0YWJsZS5jbGFzc05hbWUgPSAiYnJlYWtkb3duVGFibGUiOwotCQotCS8vIGNyZWF0ZSB0YWJsZSBoZWFkCi0JLy92YXIgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUUiIpOwotCXZhciB0ciA9IHRhYmxlLmluc2VydFJvdyh0YWJsZS5yb3dzLmxlbmd0aCk7Ci0JCi0JdHIuc2V0QXR0cmlidXRlKCJ2YWxpZ24iLCAidG9wIik7Ci0JCi0JdmFyIGxlbiA9IHRoaXMuZGF0YS5jb2x1bW5zLmxlbmd0aDsKLQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQl2YXIgY29sID0gdGhpcy5kYXRhLmNvbHVtbnNbaV07Ci0JCXZhciBpZCA9IEJTX0lEX1BSRUZJWCArIGNvbFswXTsKLQkJdmFyIGFiYnIgPSBjb2xbMV07Ci0JCQotCQl2YXIgdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUSCIpOwkJCi0JCXRoLmlkID0gaWQ7Ci0JCXRoLmFiYnIgPSBhYmJyOwotCQl0aC5pbm5lckhUTUwgPSAiPHNwYW4gc3R5bGU9J3doaXRlLXNwYWNlOm5vd3JhcDsnPiIgKyBjb2xbMV0gKyAiPC9zcGFuPiI7Ci0JCXRyLmFwcGVuZENoaWxkKHRoKTsKLQl9CQkJCi0JCi0JCi0JLy90YWJsZS5hcHBlbmRDaGlsZCh0cik7Ci0JZGl2LmFwcGVuZENoaWxkKHRhYmxlKTsKLQkKLQkvLyBjcmVhdGUgdGhlIHRvcCByb3dzCi0JdGhpcy5jcmVhdGVUb3BsZXZlbFJvd3MoKTsKLQkJCi0JLy8gZm9yIElFIG5lZWQgdG8gcmVzZXQgdG8gZnJlc2ggdGhlIGxheW91dAotCS8vZGl2LmlubmVySFRNTCA9ICIiICsgZGl2LmlubmVySFRNTCArICIiOwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLnByb2Nlc3NUUiA9IGZ1bmN0aW9uKHRyRWxlbWVudCkgewotCi0JdmFyIGluZGVudFNpemUgPSAwOwotCXZhciBwYXJlbnRJZCA9IHRyRWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhcmVudElkIik7Ci0JdmFyIHBhcmVudFRSICA9IG51bGw7Ci0JaWYgKCBwYXJlbnRJZCAhPSAiIikKLQl7Ci0KLQkJLy8gY2FjaGUgaXQgdG8gYmUgZmFzdGVyCi0JCXBhcmVudFRSID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyZW50SWQpOwotCQkvL3BhcmVudFRSID0gY3JlYXRlZE5vZGVzW3BhcmVudElkXTsKLQkJaWYgKCBwYXJlbnRUUiAhPSBudWxsICYmIHBhcmVudFRSICE9IHVuZGVmaW5lZCApCi0JCXsKLQkJCWluZGVudFNpemUgPSBwYXJzZUludChwYXJlbnRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9JTkRFTlRfU0laRSkpICsgMTsKLQkJfQotCX0KLQotCXZhciBleHBhbmRlZCA9IHRoaXMuZ2V0RGVmYXVsdEV4cGFuZFN0YXRlKGluZGVudFNpemUpOwotCi0JdHJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0lOREVOVF9TSVpFLCBpbmRlbnRTaXplKTsKLQl0ckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfRVhQQU5ERUQsIGV4cGFuZGVkKTsKLQotCS8vYWxlcnQoImNyZWF0ZVRyZWVOb2RlIGZvciBpZCwgcGFyZW50SWQsIGluZGVudCA9IiArIHRyRWxlbWVudC5pZCArICIsICIgKyBwYXJlbnRJZCArICIsICBpbmRlbnRTaXplPSIgKyBpbmRlbnRTaXplKTsKLQkvL2NyZWF0ZVRyZWVOb2RlKGVsZW1lbnQsIGluZGVudFNpemUpOwotCi0JLy9zYXZlIHRoZSBjcmVhdGVkIG9uZXMgc28gd2UgY2FuIHJlZmVyZWNuZSBpdAotCS8vY3JlYXRlZE5vZGVzW3RyRWxlbWVudC5pZF0gPSB0ckVsZW1lbnQ7Ci0KLQotCWlmICggKHBhcmVudFRSICE9IG51bGwpICYmIHRoaXMuaXNOb2RlU3VwcHJlc3NlZChwYXJlbnRUUikgKQotCXsKLQkJdGhpcy5zZXROb2RlU3VwcHJlc3NlZCh0ckVsZW1lbnQsIHRydWUpOwotCQkvL2FsZXJ0KCJwYXJlbnQgc3VwcHJlc3NlZCIpOwotCX0KLQotCWlmICggdGhpcy5pc05vZGVTdXBwcmVzc2VkKHRyRWxlbWVudCkgPT0gdHJ1ZSB8fCAocGFyZW50VFIgIT0gbnVsbCAmJiBwYXJlbnRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9FWFBBTkRFRCkgPT0gdGhpcy5OT0RFX0NPTExBUFNFRCkgKQotCXsKLQkJdHJFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCS8vYWxlcnQoInN1cHByZXNzZWQiKTsKLQl9Ci0JCQkJCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VHJlZVRhYmxlID0gZnVuY3Rpb24oKSB7Ci0JcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJBY3Rpdml0eVRyZWVUYWJsZSIpOwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmNyZWF0ZVRvcGxldmVsUm93cyA9IGZ1bmN0aW9uKCkgewotCi0JdmFyIHRhYmxlID0gdGhpcy5nZXRUcmVlVGFibGUoKTsKLQlpZiAoIHRhYmxlID09IG51bGwgKSByZXR1cm47Ci0KLQl2YXIgcm93cyA9IHRoaXMuZGF0YS5yb3dzOwotCXZhciBsZW4gPSByb3dzLmxlbmd0aDsKLQl2YXIgc3VwcHJlc3NlZFJvd3MgPSBuZXcgQXJyYXkoKTsKLQkvL3ZhciBwYXJlbnRJZCA9ICIiOwotCQotCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQotCQl2YXIgcm93ID0gcm93c1tpXTsKLQkJaWYgKCByb3cgPT0gbnVsbCApIGNvbnRpbnVlOwotCQkKLQkJLy9wYXJlbnRJZCA9ICIiOwotCQkKLQkJLy8gZG9uJ3QgY3JlYXRlIHRoZSByb3cgaWYgdGhlIHJvdyBpcyBzdXBwcmVzc2VkIG9yIGlmIHRoZSBwYXJlbnQgaXMgc3VwcHJlc3NlZAotCQlpZiAoIHRoaXMuaXNSb3dTdXBwcmVzc2VkKHJvdykgKSB7Ci0JCQkvL3N1cHByZXNzZWRSb3dzLnB1c2gocm93LmlkKTsKLQkJCS8vcGFyZW50SWQgPSByb3cuaWQ7Ci0JCQkKLQkJCS8vIGNsZWFyIHRoZSBzdXBwcmVzc2VkIHJvd3MKLQkJCXJvd3NbaV0gPSBudWxsOwotCQkJCi0JCQkvL2FsZXJ0KCJzdXBwcmVzc2VkICIgKyBpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQotCQkvKgkJCi0JCXdoaWxlICggKHJvdy5wYXJlbnRJZCAhPSBwYXJlbnRJZCkgJiYgKHN1cHByZXNzZWRSb3dzLmxlbmd0aCA+IDApICkgewotCQkJcGFyZW50SWQgPSBzdXBwcmVzc2VkUm93cy5wb3AoKTsKLQkJfQotCQkKLQkJaWYgKCAocm93LnBhcmVudElkICE9ICIiKSAmJiAocm93LnBhcmVudElkID09IHBhcmVudElkKSApIHsKLQkJCXN1cHByZXNzZWRSb3dzLnB1c2gocm93LmlkKTsKLQkJCQotCQkJLy8gY2xlYXIgdGhlIHN1cHByZXNzZWQgcm93cwotCQkJcm93c1tpXSA9IG51bGw7Ci0KLQkJCS8vYWxlcnQoInN1cHByZXNzZWQgIiArIGkpOwotCQkJY29udGludWU7Ci0JCX0KLQkJKi8KLQkJCi0JCQotCQlpZiAoIHJvdy5wYXJlbnRJZCA9PSBudWxsIHx8IHJvdy5wYXJlbnRJZCA9PSAiIikgewotCQkJdGhpcy53YnNJdGVtSHRtbC5wYXJzZVJvdyhyb3cpOwotCQkJCi0JCQl2YXIgdHIgPSB0YWJsZS5pbnNlcnRSb3codGFibGUucm93cy5sZW5ndGgpOwotCQkJdHIuc2V0QXR0cmlidXRlKEFUVFJfUk9XX0RBVEFfSU5ERVgsIGkpOwotCQkJdGhpcy53YnNJdGVtSHRtbC5sb2FkUm93KHRyKTsKLQkJCQotCQkJLy90YWJsZS5hcHBlbmRDaGlsZCh0cik7Ci0JCQkKLQkJCXRoaXMucHJvY2Vzc1RSKHRyKTsKLQkJfQotCX0KLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmNyZWF0ZUNoaWxkUm93cyA9IGZ1bmN0aW9uKHRyRWxlbWVudCkgewotCi0JdmFyIGxvYWRlZCA9IHRyRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DSElMRF9MT0FERUQpOwotCWlmICggbG9hZGVkID09ICJ0cnVlIiApIHsKLQkJcmV0dXJuOwotCX0KLQotCi0JdmFyIHRhYmxlID0gdGhpcy5nZXRUcmVlVGFibGUoKTsKLQkvL3ZhciBpbnNlcnRCZWZvcmUgPSB0ckVsZW1lbnQuZ2V0TmV4dFNpYmxpbmc7Ci0JdmFyIHJvd0luZGV4ID0gIHBhcnNlSW50KHRyRWxlbWVudC5yb3dJbmRleCk7Ci0JCi0JLy8gbWFrZSBzdXJlIHRoZSB2YWx1ZSBpcyBhIG51bWJlciBvdGhlcndpc2UgRmlyZSBmb3ggd2lsbCB0cmVhdCBpdCBhcyBhIHN0cmluZwotCXZhciBkYXRhSW5kZXggPSAgcGFyc2VJbnQodHJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1JPV19EQVRBX0lOREVYKSk7Ci0JCi0JZm9yICggdmFyIGkgPSBkYXRhSW5kZXgrMTsgaSA8IHRoaXMuZGF0YS5yb3dzLmxlbmd0aDsgaSsrICkgewotCQl2YXIgcm93ID0gdGhpcy5kYXRhLnJvd3NbaV07Ci0JCWlmICggcm93ID09IG51bGwgKSBjb250aW51ZTsKLQkJaWYgKCByb3cucGFyZW50SWQgIT0gdHJFbGVtZW50LmlkICkgewotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCXRoaXMud2JzSXRlbUh0bWwucGFyc2VSb3cocm93KTsKLQotCQlyb3dJbmRleCsrOwotCQl2YXIgdHIgPSB0YWJsZS5pbnNlcnRSb3cocm93SW5kZXgpOwotCQl0ci5zZXRBdHRyaWJ1dGUoQVRUUl9ST1dfREFUQV9JTkRFWCwgaSk7Ci0JCXRoaXMud2JzSXRlbUh0bWwubG9hZFJvdyh0cik7Ci0KLQkJdGhpcy5wcm9jZXNzVFIodHIpOwotCQkKLQl9CQotCQotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9DSElMRF9MT0FERUQsICJ0cnVlIik7Ci0JCi19OwotCi0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldERlZmF1bHRFeHBhbmRTdGF0ZSA9IGZ1bmN0aW9uKGxldmVsKQotewotCi0JaWYgKGxldmVsID49IHRoaXMuREVGQVVMVF9FWFBBTkRfTEVWRUwgKSB7Ci0JCXJldHVybiB0aGlzLk5PREVfQ09MTEFQU0VEOwotCX0gZWxzZSB7Ci0JCXJldHVybiB0aGlzLk5PREVfRVhQQU5ERUQ7Ci0JfQotCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VHJlZU5vZGVTcmMgPSBmdW5jdGlvbihsZXZlbCkKLXsKLQlpZiAoIHRoaXMuZ2V0RGVmYXVsdEV4cGFuZFN0YXRlKGxldmVsKSA9PSB0aGlzLk5PREVfQ09MTEFQU0VEICkgewotCQlyZXR1cm4gdGhpcy5leHBhbmRJbWFnZTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JfQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VFIgPSBmdW5jdGlvbihlbGVtZW50KQotewotCS8vIHRoZSBoZW1sIHN0cnVjdHVyZSBpcwotCS8vIDx0ciBpZD0iMiIgcGFyZW50SWQ9IjEiPgotCS8vIDx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAxLTE8L3RkPjx0ZD5jb2wgMi0yPC90ZD4KLQkvLyA8L3RyPgotCXZhciBlID0gZWxlbWVudDsKLQl3aGlsZSAoIGUgIT0gbnVsbCAmJiBlLnRhZ05hbWUgIT0gIlRSIiB8fCBlLmNsYXNzTmFtZSAhPSB0aGlzLnRyZWVfbm9kZV9jbGFzcykKLQl7CQotCQllID0gZS5wYXJlbnROb2RlOwotCQkvL2FsZXJ0KGUudGFnTmFtZSk7Ci0JfQotCQotCXJldHVybiBlOwotfTsKLQotCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50LgotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmV4cGFuZENvbGxhcHNlVHJlZU5vZGUgPSBmdW5jdGlvbihldnRFbGVtZW50KSB7Ci0KLQkvL2FsZXJ0KGV2dEVsZW1lbnQudGFnTmFtZSk7Ci0KLQl2YXIgdHJFbGVtZW50ID0gdGhpcy5nZXRUUihldnRFbGVtZW50KTsKLQkKLQkvLyBtYWtlIHN1cmUgdGhlIGNoaWxkIHJvd3MgYXJlIGNyZWF0ZWQKLQl0aGlzLmNyZWF0ZUNoaWxkUm93cyh0ckVsZW1lbnQpOwotCQotCS8vIGlmIHRoZXJlIGlzIG5vIGNoaWxkLCByZW1vdmUgdGhlIHRyZWUgbm9kZSBpbWFnZQotCWlmICggIXRoaXMuX2hhc0NoaWxkcmVuKHRyRWxlbWVudCkgKQotCXsKLQkJZXZ0RWxlbWVudC5zcmMgPSB0aGlzLnNoaW1JbWFnZTsKLQkJZXZ0RWxlbWVudC5vbmNsaWNrID0gbnVsbDsKLQkJZXZ0RWxlbWVudC5zdHlsZS5jdXJzb3IgPSAiZGVmYXVsdCI7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JdmFyIGV4cGFuZGVkID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVEKTsKLQotCWlmIChleHBhbmRlZCA9PSB0aGlzLk5PREVfRVhQQU5ERUQpIHsKLQkJdGhpcy5oaWRlQ2hpbGRyZW4odHJFbGVtZW50KTsKLQkJZXZ0RWxlbWVudC5zcmMgPSB0aGlzLmV4cGFuZEltYWdlOwotCQlleHBhbmRlZCA9IHRoaXMuTk9ERV9DT0xMQVBTRUQ7Ci0JCWV2dEVsZW1lbnQuYWx0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCWV2dEVsZW1lbnQudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQl9Ci0JZWxzZSB7Ci0JCXRoaXMuc2hvd0hpZGVDaGlsZHJlbih0ckVsZW1lbnQsIHRydWUpOwotCQlldnRFbGVtZW50LnNyYyA9IHRoaXMuY29sbGFwc2VJbWFnZTsKLQkJZXhwYW5kZWQgPSB0aGlzLk5PREVfRVhQQU5ERUQ7Ci0JCWV2dEVsZW1lbnQuYWx0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsKLQkJZXZ0RWxlbWVudC50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7CQkKLQl9Ci0JCi0JdHJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVELCBleHBhbmRlZCk7Ci0JCi0JLyoKLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQlldnQucHJldmVudERlZmF1bHQoKTsKLQl9Ci0JKi8KLQkKLQlyZXR1cm4gZmFsc2U7Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5oaWRlQ2hpbGRyZW4gPSBmdW5jdGlvbihwYXJlbnQpCi17CQotCS8vIG1ha2Ugc3VyZSBpdCdzIHRoZSBUUiBlbGVtZW50Ci0JcGFyZW50ID0gdGhpcy5nZXRUUihwYXJlbnQpOwotCS8vdmFyIHBhcmVudElkID0gcGFyZW50LmlkOwotCXZhciBpbmRlbnRTaXplID0gcGFyc2VJbnQocGFyZW50LmdldEF0dHJpYnV0ZShBVFRSX0lOREVOVF9TSVpFKSk7Ci0JCi0JdmFyIG5leHRUUiA9IHBhcmVudDsKLQl3aGlsZSAoIChuZXh0VFI9dGhpcy5nZXROZXh0U2libGluZyhuZXh0VFIpKSAhPSBudWxsICYmIG5leHRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9JTkRFTlRfU0laRSkgPiBpbmRlbnRTaXplICkKLQl7CQkKLQkJbmV4dFRSLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CQkKLQl9Ci0JCQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuc2hvd0hpZGVDaGlsZHJlbiA9IGZ1bmN0aW9uKHBhcmVudCwgc2hvdykKLXsJCQotCS8vIG1ha2Ugc3VyZSBpdCdzIHRoZSBUUiBlbGVtZW50Ci0JcGFyZW50ID0gdGhpcy5nZXRUUihwYXJlbnQpOwotCQotCS8vdmFyIGluZGVudFNpemUgPSBwYXJlbnQuaW5kZW50U2l6ZTsKLQl2YXIgbmV4dFRSID0gdGhpcy5nZXROZXh0U2libGluZyhwYXJlbnQpOwotCXdoaWxlICggbmV4dFRSICE9IG51bGwgJiYgbmV4dFRSLmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKSA9PSBwYXJlbnQuaWQgKQotCXsKLQkJaWYgKCBzaG93ICYmICh0aGlzLmlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSA9PSBmYWxzZSkgKQotCQl7Ci0JCQluZXh0VFIuc3R5bGUuZGlzcGxheSA9ICcnOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJCi0JCQluZXh0VFIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJfQotCQkKLQkJbmV4dFRSID0gdGhpcy5zaG93SGlkZUNoaWxkcmVuKG5leHRUUiwgKHNob3c9PXRydWUpJiYobmV4dFRSLmdldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVEKT09dGhpcy5OT0RFX0VYUEFOREVEKSApOwotCX0KLQkKLQlyZXR1cm4gbmV4dFRSOwotCQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuX2hhc0NoaWxkcmVuID0gZnVuY3Rpb24ocGFyZW50KQotewotCi0JLy8gbWFrZSBzdXJlIGl0J3MgdGhlIFRSIGVsZW1lbnQKLQlwYXJlbnQgPSB0aGlzLmdldFRSKHBhcmVudCk7Ci0KLQl2YXIgbmV4dFRSID0gdGhpcy5nZXROZXh0U2libGluZyhwYXJlbnQpOwotCQotLy9hbGVydCgicGFyZW50LmlkPSIgKyBwYXJlbnQuaWQgKyAiLCBuZXh0VFIucGFyZW50SWQ9IiArIG5leHRUUi5nZXRBdHRyaWJ1dGUoInBhcmVudElkIikgKyAiLCBpc1N1cHByZXNzZWQ9IiArIGlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSk7Ci0KLQlpZiAoIG5leHRUUiAhPSBudWxsICYmIG5leHRUUi5nZXRBdHRyaWJ1dGUoInBhcmVudElkIikgPT0gcGFyZW50LmlkKSAKLQl7Ci0JCWlmICh0aGlzLmlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSA9PSBmYWxzZSkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQluZXh0VFIubmV4dFNpYmxpbmc7Ci0JCQl3aGlsZSAobmV4dFRSICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKHRoaXMuaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpID09IGZhbHNlKQotCQkJCXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCW5leHRUUiA9IG5leHRUUi5uZXh0U2libGluZzsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gZmFsc2U7Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXROZXh0U2libGluZyA9IGZ1bmN0aW9uKGVsZW1lbnQpCi17Ci0KLQl2YXIgbmV4dEVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotCXdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnRhZ05hbWUgIT0gZWxlbWVudC50YWdOYW1lICkKLQl7Ci0JCW5leHRFbGVtZW50ID0gbmV4dEVsZW1lbnQubmV4dFNpYmxpbmc7Ci0JfQotCQotCXJldHVybiBuZXh0RWxlbWVudDsKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXRGaXJzdENoaWxkID0gZnVuY3Rpb24odHJFbGVtZW50LCB0YWdOYW1lLCBjbGFzc05hbWUpCi17Ci0JdmFyIGUgPSB0ckVsZW1lbnQuZmlyc3RDaGlsZDsKLQl3aGlsZSAoZSAhPSBudWxsKQotCXsKLQkJLy9hbGVydChlLnRhZ05hbWUpOwotCQlpZiAoICh0YWdOYW1lID09IG51bGwgfHwgZS50YWdOYW1lID09IHRhZ05hbWUpICYmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBlLmNsYXNzTmFtZSA9PSBjbGFzc05hbWUpICkKLQkJewotCQkJcmV0dXJuIGU7Ci0JCX0KLQkJCi0JCWUgPSBlLm5leHRTaWJsaW5nOwotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLQkJCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaXNOb2RlU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKHRyRWxlbWVudCkKLXsKLQkvLyBpZiBpc1N1cHJlc3NlZCBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYWx3YXlzIHVzZSBpdAotCS8vIG9ubHkgYnJvd3NpZ24gbW9kZWwgc2V0IHRoaXMgYXR0cmlidXRlCi0JLy8gaWYgbm90IGRlZmluZWQsIGl0J3MgaW4gcHVibGlzaGVkIHNpdGUsIGxvb2sgdXAgdGhlIGZsYWcgZnJvbSB0aGUgZ2VuZXJhdGVkIG1hcAotCXZhciBhdHRyX3N1cHByZXNzZWQgPSB0ckVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpc1N1cHJlc3NlZCIpOwotCXZhciByZWxQYXRoID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiKTsKLQkKLQl2YXIgZmxhZyA9IHRoaXMuaXNTdXBwcmVzc2VkKGF0dHJfc3VwcHJlc3NlZCwgcmVsUGF0aCk7Ci0JCi0JaWYgKCBhdHRyX3N1cHByZXNzZWQgPT0gbnVsbCB8fCBhdHRyX3N1cHByZXNzZWQgPT0gIiIgfHwgYXR0cl9zdXBwcmVzc2VkID09IHVuZGVmaW5lZCApCi0JewkJCi0JCXRoaXMuc2V0Tm9kZVN1cHByZXNzZWQodHJFbGVtZW50LCBmbGFnKTsKLQl9Ci0JCi0JcmV0dXJuIGZsYWc7Ci19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaXNSb3dTdXBwcmVzc2VkID0gZnVuY3Rpb24ocm93KQotewotCWlmICggcm93ID09IG51bGwgKSByZXR1cm4gdHJ1ZTsKLQkKLQlyZXR1cm4gdGhpcy5pc1N1cHByZXNzZWQocm93LmlzU3VwcHJlc3NlZCwgcm93LnJlbFBhdGgpOwotCQotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmlzU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKGF0dHJfc3VwcHJlc3NlZCwgcmVsUGF0aCkKLXsJCi0JLy8gaWYgaXNTdXByZXNzZWQgYXR0cmlidXRlIGlzIGRlZmluZWQsIGFsd2F5cyB1c2UgaXQKLQkvLyBvbmx5IGJyb3dzaWduIG1vZGVsIHNldCB0aGlzIGF0dHJpYnV0ZQotCS8vIGlmIG5vdCBkZWZpbmVkLCBpdCdzIGluIHB1Ymxpc2hlZCBzaXRlLCBsb29rIHVwIHRoZSBmbGFnIGZyb20gdGhlIGdlbmVyYXRlZCBtYXAKLQkKLQkvL2FsZXJ0KGF0dHJfc3VwcHJlc3NlZCArICI9IiArIHJlbFBhdGgpOwotCXZhciBmbGFnID0gZmFsc2U7Ci0JCi0JaWYgKCBhdHRyX3N1cHByZXNzZWQgPT0gbnVsbCB8fCBhdHRyX3N1cHByZXNzZWQgPT0gIiIgfHwgYXR0cl9zdXBwcmVzc2VkID09ICJ1bmRlZmluZWQiICkKLQl7Ci0JCS8vIHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4gYWN0aXZpdHlsYXlvdXQuanMKLQkJaWYgKCByZWxQYXRoICE9IG51bGwgJiYgcmVsUGF0aCAhPSAiIiAmJiByZWxQYXRoICE9ICJ1bmRlZmluZWQiICkKLQkJewotCQkJZmxhZyA9IHRoaXMucGFyZW50LmlzU3VwcHJlc3NlZChjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcHJvYywgY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UucGFyX3BhdGggKyByZWxQYXRoKTsKLQkJfQotCQkvL2FsZXJ0KCJ4MSwgZmxhZz0iICsgZmxhZyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWZsYWcgPSAoYXR0cl9zdXBwcmVzc2VkID09ICJ0cnVlIik7Ci0JfQotCQotCS8vYWxlcnQoZmxhZyArICIgPSAiICsgYXR0cl9zdXBwcmVzc2VkICsgcmVsUGF0aCk7Ci0JcmV0dXJuIGZsYWc7Ci0KLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLnNldE5vZGVTdXBwcmVzc2VkID0gZnVuY3Rpb24odHJFbGVtZW50LCBmbGFnKQotewotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgZmxhZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkKLX07Ci0KLQotCi0KLS8vIGRlZmluZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgY29sdW1ucyBpZHMgaGVyZQotQlNfQ09MX0lOREVYID0gImlkIjsKLUJTX0NPTF9OQU1FID0gIm5hbWUiOwotQlNfQ09MX1BSRUZJWCA9ICJwcmVmaXgiOwotQlNfQ09MX1BSRURFQ0VTU09SUyA9ICJwcmVkZWNlc3NvcnMiOwotQlNfQ09MX0lTX1JFUEVBVEFCTEUgPSAiaXNfcmVwZWF0YWJsZSI7Ci1CU19DT0xfSVNfT05HT0lORyA9ICJpc19vbmdvaW5nIjsKLUJTX0NPTF9JU19FVkVOVF9EUklWRU4gPSAiaXNfZXZlbnRfZHJpdmVuIjsKLUJTX0NPTF9FTlRSWV9TVEFURSA9ICJlbnRyeV9zdGF0ZSI7Ci1CU19DT0xfRVhJVF9TVEFURSA9ICJleGl0X3N0YXRlIjsKLUJTX0NPTF9URUFNUyA9ICJ0ZWFtcyI7Ci1CU19DT0xfVFlQRSA9ICJ0eXBlIjsKLUJTX0NPTF9NT0RFTF9JTkZPID0gIm1vZGVsX2luZm8iOwotQlNfQ09MX1BSRVNFTlRBVElPTl9OQU1FID0gInByZXNlbnRhdGlvbl9uYW1lIjsgCi1CU19DT0xfU1RFUFMgPSAic3RlcHMiOwotQlNfQ09MX0RFTElWRVJBQkxFID0gImRlbGl2ZXJhYmxlIjsgCi1CU19DT0xfSVNfT1BUSU9OQUwgPSAiaXNfb3B0aW9uYWwiOyAKLUJTX0NPTF9JU19QTEFOTkVEID0gImlzX3BsYW5uZWQiOwotQlNfQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9ICJoYXNfbXVsdGlwbGVfb2NjdXJyZW5jZXMiOwotCi0vLyBpZCBwcmVmaXgKLUJTX0lEX1BSRUZJWCA9ICJCU19DT0xfIjsKLVNURVBfR1JPVVBfU0laRSA9IDU7Ci0KLWZ1bmN0aW9uIFdCU0l0ZW1IdG1sKC8qQWN0aXZpdHlUcmVlVGFibGUqL3BhcmVudCkKLXsKLXRoaXMucGFyZW50ID0gcGFyZW50OwotLy90aGlzLmltYWdlUGF0aCA9IGltZ1BhdGg7Ci0KLXRoaXMuZXh0ZW5kVmFyaWFiaWxpdHkgPSAiZXh0ZW5kIjsgLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotdGhpcy5sb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5ID0gImxvY2FsQ29udHJpYnV0aW9uIjsJLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotdGhpcy5sb2NhbFJlcGxhY2VtZW50VmFyaWFiaWxpdHkgPSAibG9jYWxSZXBsYWNlbWVudCI7CS8vICEhISBkb24ndCB0cmFuc2xhdGUgdGhpcyAhISEKLQotLy90aGlzLnNvdXJjZV9odG1sID0gbmV3IEFycmF5KCk7Ci0vL3RoaXMuY29sdW1ucyA9IFtdOwotdGhpcy5maWVsZHMgPSBbXTsKLXRoaXMuaW5kZW50U2l6ZSA9IDA7Ci10aGlzLmhhc0NoaWxkcmVuID0gZmFsc2U7Ci10aGlzLmlkID0gIiI7Ci10aGlzLnBhcmVudElkID0gIiI7Ci10aGlzLnJlbFBhdGggPSBudWxsOwotdGhpcy5pc1N1cHJlc3NlZCA9IGZhbHNlOwotdGhpcy51cmwgPSAiIjsKLQotCi19OwotCi0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLmdldFRyZWVOb2RlVGFibGVIdG1sID0gZnVuY3Rpb24oaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4sIHRpdGxlLCB1cmwsIHJlbFBhdGgpCi17Ci0KLS8vIHRlc3QKLS8vIHRoZSB1cmwgaXMgcGFzc2VkIGluIHRvIGEgc3RyaW5nIHRvIGNvbnN0cnVjdCBhIHN0cmluZyBsaXRlcmFsCi0vLyBuZWVkIHRvIGVzY2FwZSB0aGUgcXVvdGVzCi11cmwgPSB1cmwucmVwbGFjZSgvKFwnfFwiKS9nLCAiXFwkMSIpOwotCi11cmwgPSBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcHJvYywgY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UucGFyX3BhdGgsIHJlbFBhdGgpOwotCi12YXIgc3JjID0gWwotIjx0YWJsZSBiZ2NvbG9yPVwiIzAwMDAwMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIiBjbGFzcz1cImRlZmF1bHRUYWJsZVwiPjx0cj48dGQgbm93cmFwPVwibm93cmFwXCI+IiBdOwotc3JjID0gc3JjLmNvbmNhdCh0aGlzLmdldFRyZWVOb2RlSHRtbChpbmRlbnRTaXplLCBoYXNDaGlsZHJlbikpOyAKLXNyYyA9IHNyYy5jb25jYXQoWwotIjwvdGQ+PHRkIHdpZHRoPVwiMTAwJVwiIG5vd3JhcD1cIm5vd3JhcFwiPiIgLCAKLSI8YSBocmVmPVwiIiAsIHVybCAsICJcIj4iICwgdGl0bGUgLCAiPC9hPiIgLCAKLSI8L3RkPjwvdHI+PC90YWJsZT4iXSk7Ci0KLQlyZXR1cm4gc3JjOwotfTsKLQotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuZ2V0VHJlZU5vZGVIdG1sID0gZnVuY3Rpb24oaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4pCi17Ci0JdmFyIHdpZHRoID0gMTcqaW5kZW50U2l6ZTsKLQotCXZhciBzdHIgPSBbIjxkaXYgY2xhc3M9XCJ0cmVlTm9kZVwiPjxzcGFuPiJdOwotCXZhciBzbGVuID0gMTsKLQlpZiAoIGluZGVudFNpemUgPiAwICkKLQl7Ci0JCXN0cltzbGVuXSA9ICI8aW1nIGFsdD1cIlwiIHdpZHRoPVwiIiA7Ci0JCXN0cltzbGVuICsgMV0gPSB3aWR0aCA7Ci0JCXN0cltzbGVuICsgMl0gPSAiXCIgaGVpZ2h0PVwiMTVcIiBib3JkZXI9XCIwXCIgc3JjPVwiIiA7Ci0JCXN0cltzbGVuICsgM10gPSB0aGlzLnBhcmVudC5zaGltSW1hZ2UgOwotCQlzdHJbc2xlbiArIDRdID0gIlwiLz4iOwotCQlzbGVuICs9IDU7Ci0JfQotCi0KLQl2YXIgaW1nU3JjOwotCQotCWlmICggIWhhc0NoaWxkcmVuICkKLQl7Ci0JCXN0cltzbGVuXT0gIjxpbWcgYWx0PVwiXCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE1XCIgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgc3JjPVwiIiA7Ci0JCXN0cltzbGVuICsgMV0gPSB0aGlzLnBhcmVudC5zaGltSW1hZ2UgOwotCQlzdHJbc2xlbiArIDJdID0gIlwiPiI7Ci0JCXNsZW4gKz0gMzsKLQotCX0KLQllbHNlIAotCXsKLQkJdmFyIGltYWdlU3JjID0gdGhpcy5wYXJlbnQuZ2V0VHJlZU5vZGVTcmMoaW5kZW50U2l6ZSk7Ci0JCXN0cltzbGVuXSA9ICI8aW1nIGFsdD1cIiIgOwotCQlzdHJbc2xlbiArIDFdID0gIGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0IDsKLQkJc3RyW3NsZW4gKyAyXSA9ICAiXCIgdGl0bGU9XCIiIDsKLQkJc3RyW3NsZW4gKyAzXSA9ICBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dCA7Ci0JCXN0cltzbGVuICsgNF0gPSAgIlwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNVwiIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIHNyYz1cIiIgOwotCQlzdHJbc2xlbiArIDVdID0gIGltYWdlU3JjIDsKLQkJc3RyW3NsZW4gKyA2XSA9ICAiXCIiIDsKLQkJc3RyW3NsZW4gKyA3XSA9ICAiIHN0eWxlPVwiY3Vyc29yOmhhbmRcIiBvbmNsaWNrPVwiY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLmV4cGFuZENvbGxhcHNlVHJlZU5vZGUodGhpcyk7cmV0dXJuIGZhbHNlO1wiIC8+IjsKLQkJc2xlbiArPSA4OwotCX0KLQkKLQkKLQlzdHJbc2xlbl0gPSAiPC9zcGFuPiYjMTYwOyYjMTYwOzwvZGl2PiI7Ci0KLQlyZXR1cm4gc3RyOwkKLX07Ci0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLnBhcnNlUm93ID0gZnVuY3Rpb24ocm93KSB7Ci0JLyoKLQl2YXIgX2lkID0gcm93LmlkOwotCXZhciBfcGFyZW50SWQgPSByb3cucGFyZW50SWQ7Ci0JdmFyIF9yZWxQYXRoID0gcm93LnJlbFBhdGg7Ci0JdmFyIF9pc1N1cHJlc3NlZCA9IHJvdy5pc1N1cHByZXNzZWQ7Ci0JdmFyIF9pbmRlbnRTaXplID0gcm93LmluZGVudFNpemU7Ci0JdmFyIF9oYXNDaGlsZHJlbiA9IHJvdy5oYXNDaGlsZHJlbjsgCi0JdmFyIF9pbmRleCA9IHJvdy5pbmRleDsKLQl2YXIgX3ByZWZpeD0gcm93LnByZWZpeDsKLQluYW1lLCB0aXRsZSwgdXJsLCBzdGVwcywgcHJlZGVjZXNzb3JzLCBpbmZvLCB0eXBlLCAKLQlyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbiwgCi0JdGVhbSwgZW50cnlTdGF0ZSwgZXhpdFN0YXRlLCBkZWxpdmVyYWJsZSwgdmFyaWFiaWxpdHlUeXBlOwotCSovCi0JCi0JdGhpcy5pbml0Um93KHJvdy5pZCwgcm93LnBhcmVudElkLCByb3cucmVsUGF0aCwgcm93LmlzU3VwcmVzc2VkLCByb3cuaW5kZW50U2l6ZSwgcm93Lmhhc0NoaWxkcmVuLCAKLQkJcm93LmluZGV4LCByb3cucHJlZml4LCByb3cubmFtZSwgcm93LnRpdGxlLCByb3cudXJsLCAiIiwgcm93LnByZWRlY2Vzc29ycywgcm93LmluZm8sIHJvdy50eXBlLCAKLQkJcm93LnJlcGVhdGFibGUsIHJvdy5tdWx0aU9jY3VyZW5jZXMsIHJvdy5vcHRpb25hbCwgcm93LnBsYW5uZWQsIHJvdy5vbmdvaW5nLCByb3cuZXZlbnREcml2ZW4sIAotCQlyb3cudGVhbSwgcm93LmVudHJ5U3RhdGUsIHJvdy5leGl0U3RhdGUsIHJvdy5kZWxpdmVyYWJsZSwgcm93LnZhcmlhYmlsaXR5VHlwZSk7Ci0JCi0JaWYgKCByb3cuc3RlcHMgIT0gbnVsbCApIHsKLQkJdmFyIGxlbiA9IHJvdy5zdGVwcy5sZW5ndGg7Ci0JCXZhciBicmsgPSBmYWxzZTsKLQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0JCQlicmsgPSAoKGkrMSklU1RFUF9HUk9VUF9TSVpFID09IDAgKTsKLQkJCXRoaXMuYWRkU3RlcChyb3cuc3RlcHNbaV0sIGJyayk7Ci0JCX0KLQl9Ci19OwotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUubG9hZFJvdyA9IGZ1bmN0aW9uKC8qRE9NKi90cikKLXsKLQkvL3ZhciB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRSIik7Ci0JdHIuaWQgPSB0aGlzLmlkOwotCXRyLmNsYXNzTmFtZSA9ICJ0cmVlTm9kZSI7Ci0JdHIuc2V0QXR0cmlidXRlKCJwYXJlbnRJZCIsIHRoaXMucGFyZW50SWQpOwotCXRyLnNldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiLCB0aGlzLnJlbFBhdGgpOwotCi0JLy8gaXMgc3VwcHJlc3NlZCBmbGFnIGlzIHNldCBvbmx5IHdoZW4gaW4gYnJvd3NpbmcgbW9kZWwsIGl0J3Mgbm90IHNldCBpbiBwdWJsaXNoaW5nIG1vZGVsCi0JaWYgKCB0aGlzLmlzU3VwcmVzc2VkICE9IG51bGwgJiYgdGhpcy5pc1N1cHJlc3NlZCAhPSAiIiAmJiB0aGlzLmlzU3VwcmVzc2VkICE9IHVuZGVmaW5lZCkgewotCQl0ci5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgdGhpcy5pc1N1cHJlc3NlZCk7Ci0JfQotCQotCS8vIGdldCB0aGUgY2VsbCBzb3VyY2UKLQl2YXIgc3JjID0gW107Ci0JdmFyIGxlbiA9IHRoaXMucGFyZW50LmRhdGEuY29sdW1ucy5sZW5ndGg7Ci0JZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLQkJdmFyIHRkID0gdHIuaW5zZXJ0Q2VsbCh0ci5jZWxscy5sZW5ndGgpOwotCQl0aGlzLmxvYWRDZWxsKHRkLCBpKTsKLQkJLy90ci5hcHBlbmRDaGlsZCh0ZCk7Ci0JCQotCX0KLQkKLQlyZXR1cm4gdHI7CQkJCQotfTsKLQotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5pbml0Um93ID0gZnVuY3Rpb24oaWQsIHBhcmVudElkLCByZWxQYXRoLCBpc1N1cHJlc3NlZCwgaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4sIAotCWluZGV4LCBwcmVmaXgsIG5hbWUsIHRpdGxlLCB1cmwsIHN0ZXBzLCBwcmVkZWNlc3NvcnMsIGluZm8sIHR5cGUsIAotCXJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIG9uZ29pbmcsIGV2ZW50RHJpdmVuLCAKLQl0ZWFtLCBlbnRyeVN0YXRlLCBleGl0U3RhdGUsIGRlbGl2ZXJhYmxlLCB2YXJpYWJpbGl0eVR5cGUpCi17Ci0JdGhpcy5pbmRlbnRTaXplID0gaW5kZW50U2l6ZTsKLQl0aGlzLmhhc0NoaWxkcmVuID0gaGFzQ2hpbGRyZW47Ci0JdGhpcy5pZCA9IGlkOwotCXRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDsKLQl0aGlzLnJlbFBhdGggPSByZWxQYXRoOwotCXRoaXMuaXNTdXByZXNzZWQgPSBpc1N1cHJlc3NlZDsKLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfSU5ERVhdID0gaW5kZXg7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX1BSRUZJWF0gPSBwcmVmaXg7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX05BTUVdID0gbmFtZTsKLQl0aGlzLmZpZWxkc1tCU19DT0xfUFJFU0VOVEFUSU9OX05BTUVdID0gdGl0bGU7Ci0JdGhpcy51cmwgPSB1cmw7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX1NURVBTXSA9IHN0ZXBzOwotCXRoaXMuZmllbGRzW0JTX0NPTF9QUkVERUNFU1NPUlNdID0gcHJlZGVjZXNzb3JzOwotCWlmICh2YXJpYWJpbGl0eVR5cGUuaW5kZXhPZih0aGlzLmV4dGVuZFZhcmlhYmlsaXR5KSAhPSAtMSB8fCAKLQkJdmFyaWFiaWxpdHlUeXBlLmluZGV4T2YodGhpcy5sb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5KSAhPSAtMSB8fCAKLQkJdmFyaWFiaWxpdHlUeXBlLmluZGV4T2YodGhpcy5sb2NhbFJlcGxhY2VtZW50VmFyaWFiaWxpdHkpICE9IC0xICkKLQl7Ci0JCXRoaXMuZmllbGRzW0JTX0NPTF9NT0RFTF9JTkZPXSA9ICIiOwotCX0KLQllbHNlCi0JewotCQl0aGlzLmZpZWxkc1tCU19DT0xfTU9ERUxfSU5GT10gPSBpbmZvOwotCX0JCi0JdGhpcy5maWVsZHNbQlNfQ09MX1RZUEVdID0gdHlwZTsKLQotCXRoaXMuZmllbGRzW0JTX0NPTF9URUFNU10gPSB0ZWFtOwotCi0JdGhpcy5maWVsZHNbQlNfQ09MX0VOVFJZX1NUQVRFXSA9IGVudHJ5U3RhdGU7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0VYSVRfU1RBVEVdID0gZXhpdFN0YXRlOwotCXRoaXMuZmllbGRzW0JTX0NPTF9ERUxJVkVSQUJMRV0gPSBkZWxpdmVyYWJsZTsKLQkKLQl0aGlzLnNldFN0YXRlcyhyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbik7Ci0JCi0JCi19OwotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuYWRkU3RlcCA9IGZ1bmN0aW9uKHNlbGVjdGVkLCBsaW5lQnJlYWspCi17Ci0JdmFyIGltZ19zcmM7Ci0JaWYgKCBzZWxlY3RlZCApIHsKLQkJaW1nX3NyYyA9IHRoaXMucGFyZW50LmltYWdlUGF0aCArICJjaXJjbGVfY2xvc2UuZ2lmIjsKLQl9IGVsc2UgewotCQlpbWdfc3JjID0gdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgImNpcmNsZV9vcGVuLmdpZiI7CQotCX0KLQkKLQl2YXIgc3RlcHMgPSB0aGlzLmZpZWxkc1tCU19DT0xfU1RFUFNdOwotCXN0ZXBzICs9ICI8aW1nIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCI5XCIgYWx0PVwiXCIgc3JjPVwiIiArIGltZ19zcmMgKyAiXCIgLz4iOwotCWlmIChsaW5lQnJlYWspCi0JewotCQlzdGVwcyArPSAiPGJyLz4iOwotCX0KLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfU1RFUFNdID0gc3RlcHM7Ci19OwotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5zZXRTdGF0ZXMgPSBmdW5jdGlvbihyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbikKLXsKLQlpZiAoIHJlcGVhdGFibGUgPT0gInRydWUiKSB7Ci0JCXJlcGVhdGFibGUgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCXJlcGVhdGFibGUgPSAiJm5ic3A7IjsKLQl9Ci0JCi0JaWYgKCBtdWx0aU9jY3VyZW5jZXMgPT0gInRydWUiKSB7Ci0JCW11bHRpT2NjdXJlbmNlcyA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCW11bHRpT2NjdXJlbmNlcyA9ICImbmJzcDsiOwotCX0KLQkKLQlpZiAoIG9wdGlvbmFsID09ICJ0cnVlIikgewotCQlvcHRpb25hbCA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCW9wdGlvbmFsID0gIiZuYnNwOyI7Ci0JfQotCi0JaWYgKCBwbGFubmVkID09InRydWUiKSB7Ci0JCXBsYW5uZWQgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlwbGFubmVkID0gIiZuYnNwOyI7Ci0JfQotCi0JaWYgKCBvbmdvaW5nID09InRydWUiKSB7Ci0JCW9uZ29pbmcgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlvbmdvaW5nID0gIiZuYnNwOyI7Ci0JfQotCQotCWlmICggZXZlbnREcml2ZW4gPT0idHJ1ZSIpIHsKLQkJZXZlbnREcml2ZW4gPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlldmVudERyaXZlbiA9ICImbmJzcDsiOwotCX0KLQkKLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfSVNfUkVQRUFUQUJMRV0gPSByZXBlYXRhYmxlOwotCXRoaXMuZmllbGRzW0JTX0NPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNdID0gbXVsdGlPY2N1cmVuY2VzOwotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19PUFRJT05BTF0gPSBvcHRpb25hbDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfSVNfUExBTk5FRF0gPSBwbGFubmVkOwotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19PTkdPSU5HXSA9IG9uZ29pbmc7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0lTX0VWRU5UX0RSSVZFTl0gPSBldmVudERyaXZlbjsKLQotfTsKLQotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5sb2FkQ2VsbCA9IGZ1bmN0aW9uKC8qRE9NKi90ZEVsLCBjb2x1bW5Db3VudCkgewotCi0JdmFyIGNvbCA9IHRoaXMucGFyZW50LmRhdGEuY29sdW1uc1tjb2x1bW5Db3VudF07Ci0JdmFyIGNvbF9pZCA9IGNvbFswXTsKLQl2YXIgdGV4dCA9IHRoaXMuZmllbGRzW2NvbF9pZF07Ci0JaWYgKCB0ZXh0ID09ICIiICkgewotCQl0ZXh0ID0gIiZuYnNwOyI7Ci0JfQotCQotCXZhciBpZCA9IEJTX0lEX1BSRUZJWCArIGNvbF9pZDsKLQkKLQkvL3ZhciB0ZEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEQiKTsJCi0JdGRFbC5pZCA9IGlkOwotCXRkRWwuaGVhZGVycyA9ICIiOwotCQotCXZhciBzdHIgPSAiIjsKLQl2YXIgc2xlbiA9IDM7Ci0JaWYgKCBjb2x1bW5Db3VudCAlIDIgIT0gMCApIHsKLQkJdGRFbC5zdHlsZS5iYWNrZ3JvdW5kID0gIiNjY2NjY2MiOwotCX0KLQkKLQlpZiAoIGNvbF9pZC5pbmRleE9mKCJpc18iKSA+PTAgfHwgY29sX2lkLmluZGV4T2YoImhhc18iKSA+PTAgKSB7CQotCQl0ZEVsLmFsaWduID0gImNlbnRlciI7Ci0JfQotCQotCWlmICggY29sX2lkID09IEJTX0NPTF9UWVBFIHx8IGNvbF9pZCA9PSBCU19DT0xfU1RFUFMgKSB7Ci0JCS8vdGRFbC5ub3dyYXAgPSB0cnVlOwotCQl0ZXh0ID0gIjxzcGFuIHN0eWxlPSd3aGl0ZS1zcGFjZTpub3dyYXA7Jz4iICsgdGV4dCArICI8L3NwYW4+IjsKLQl9Ci0JCi0JaWYgKCBjb2xfaWQgPT0gQlNfQ09MX1BSRVNFTlRBVElPTl9OQU1FICkgewotCQl0ZEVsLndpZHRoPSIxMDAlIjsKLQkJdGV4dCA9IHRoaXMuZ2V0VHJlZU5vZGVUYWJsZUh0bWwoCi0JCQl0aGlzLmluZGVudFNpemUsIHRoaXMuaGFzQ2hpbGRyZW4sIAotCQkJdGV4dCwgdGhpcy51cmwsIHRoaXMucmVsUGF0aCkuam9pbigiIik7Ci0JCQotCX0gCi0JCi0KLQl0ZEVsLmlubmVySFRNTCA9IHRleHQ7Ci0JcmV0dXJuIHRkRWw7Ci0KLX07Ci0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMGFlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qIHJlc291cmNlIGZpbGVzIGZvciBjb250ZW50IHBhZ2UgamF2YXNjcmlwdCAKLSAqIHRoaXMgZmlsZSBzaG91bGQgYmUgbG9jYWxpemVkCi0qLwotQ29udGVudFBhZ2VSZXNvdXJjZSA9IGZ1bmN0aW9uKCkgewotCi0KLXRoaXMuZXhwYW5kQWxsVGV4dCA9ICJFeHBhbmQgQWxsIFNlY3Rpb25zIjsKLXRoaXMuY29sbGFwc2VBbGxUZXh0ID0gIkNvbGxhcHNlIEFsbCBTZWN0aW9ucyI7Ci10aGlzLmJhY2tUb1RvcFRleHQgPSAiQmFjayB0byB0b3AiOwotCi10aGlzLmV4cGFuZEFsbFN1YlNlY3Rpb25zVGV4dCA9ICJFeHBhbmQgQWxsIFN0ZXBzIjsKLXRoaXMuY29sbGFwc2VBbGxTdWJTZWN0aW9uc1RleHQgPSAiQ29sbGFwc2UgQWxsIFN0ZXBzIjsKLQotdGhpcy50b29sYmFyX2Jvb2ttYXJrID0gIkJvb2ttYXJrIHRoaXMgcGFnZSI7Ci10aGlzLnRvb2xiYXJfYmFjayA9ICJCYWNrIjsKLXRoaXMudG9vbGJhcl9mb3J3YXJkID0gIkZvcndhcmQiOwotdGhpcy50b29sYmFyX2V4cGFuZF9hbGwgPSAiRXhwYW5kIGFsbCI7Ci10aGlzLnRvb2xiYXJfY29sbGFwc2VfYWxsID0gIkNvbGxhcHNlIGFsbCI7Ci10aGlzLnRvb2xiYXJfcHJpbnQgPSAiUHJpbnQiOwotCi10aGlzLmV4cGFuZFRleHQgPSAiRXhwYW5kIgotdGhpcy5jb2xsYXBzZVRleHQgPSAiQ29sbGFwc2UiCi10aGlzLmNoZWNrZWRBbHRUZXh0ID0gIlllcyIJCi0KLX07CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NTU5MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db250ZW50UGFnZVNlY3Rpb24gPSBmdW5jdGlvbigpewotCi10aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQgPSBmYWxzZTsKLXRoaXMuZmlyc3RTZWN0aW9uID0gbnVsbDsKLXRoaXMuZXhwYW5kSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUltYWdlID0gbnVsbDsKLXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gbnVsbDsKLXRoaXMuYmFja1RvVG9wSW1hZ2UgPSBudWxsOwotdGhpcy5zaGltSW1hZ2UgPSBudWxsOwotdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzID0gbnVsbDsKLXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3MgPSBudWxsOwotCi0vLyB0ZXN0IG1lc3NhZ2UsIAotdGhpcy5iYWNrVG9Ub3BUZXh0ID0gbnVsbDsKLXRoaXMuZXhwYW5kQWxsVGV4dCA9IG51bGw7Ci10aGlzLmNvbGxhcHNlQWxsVGV4dCA9IG51bGw7Ci19OwotCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihpbWdQYXRoKSB7Ci0KLQl0aGlzLmJhY2tUb1RvcFRleHQgPSBjb250ZW50UGFnZS5yZXMuYmFja1RvVG9wVGV4dDsKLQl0aGlzLmV4cGFuZEFsbFRleHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kQWxsVGV4dDsKLQl0aGlzLmNvbGxhcHNlQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZUFsbFRleHQ7Ci0KLQl0aGlzLmV4cGFuZEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2V4cGFuZC5naWYnKTsJCQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdjb2xsYXBzZS5naWYnKTsKLQl0aGlzLmV4cGFuZEFsbEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJyk7CQotCXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJyk7Ci0JdGhpcy5iYWNrVG9Ub3BJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdiYWNrX3RvX3RvcC5naWYnKTsKLQl0aGlzLnNoaW1JbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdzaGltLmdpZicpOwotfTsKLQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc2VjdGlvbiBsaW5rcy4KLUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlU2VjdGlvbkxpbmtzID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7Ci0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwotCQl2YXIgc2VjdGlvbkVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCXZhciB0b3RhbExpbmtzID0gMDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQotCQkJLy8gc2F2ZSB0aGUgZWxlbWVudCBmb3IgYXV0byB3cmFwCi0JCQlpZiAoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJhdXRvV3JhcCIpID09ICJ0cnVlIiApIHsKLQkJCQljb250ZW50UGFnZS5hZGRBdXRvV3JhcEVsZW1lbnQoZWxlbWVudCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7Ci0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50OwkJCQkKLQkJCX0KLQkJfQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsKLQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOwotCQl0aGlzLnNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOwotCQl0aGlzLmZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXZhciBlbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2ldOwotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7Ci0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7Ci0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7Ci0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsKLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBuZXh0U2libGluZy5jbGFzc05hbWUgIT0gJ2NvcHlyaWdodCcpIHsKLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOwotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOwotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsKLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgIAkJCX0KLSAgICAJCQl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOwotICAgIAkJCXRoaXMuY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQl0aGlzLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyhzZWN0aW9uRWxlbWVudHNbMF0pOwotCX0KLX07Ci0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzZWN0aW9uLgotQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24gPSBmdW5jdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgewotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7Ci0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuCi0JCXZhciBzZWN0aW9uU2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gdGhpcy5zaGltSW1hZ2U7Ci0JCXNlY3Rpb25TZXBhcmF0b3IuYWx0ID0gJyc7Ci0JCXNlY3Rpb25TZXBhcmF0b3IudGl0bGUgPSAnJzsKLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7Ci0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOwotCQlzZWN0aW9uU2VwYXJhdG9yLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7Ci0JCQotCQkvLyBBZGQgYSBleHBhbmQvY29sbGFwc2UgbGluayB0byB0aGUgc2VjdGlvbiBoZWFkaW5nLgotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWlmICh0aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsKLQkJCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQkJCWltYWdlLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwotCQkJaW1hZ2UudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwkJCQotCQl9Ci0JCQkJCi0JCWltYWdlLndpZHRoID0gJzE3JzsKLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsKLQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJdmFyIHNlbGYgPSB0aGlzOwotCQlsaW5rLm9uY2xpY2sgPSBmdW5jdGlvbihldnQpIHsKLQkJCS8vIGhlcmUgInRoaXMiIGlzIHRoZSB0YXJoZXQgZWxlbWVudCwgaS5lLiB0aGUgSU1HCi0JCQkvLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50LgotCQkJaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgewotCQkJCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQkJdGhpcy5maXJzdENoaWxkLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJCXRoaXMuZmlyc3RDaGlsZC50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQkJdGhpcy5maXJzdENoaWxkLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsJCQkJCi0JCQl9Ci0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCi0JCXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsKLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLSAgICAJCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4KLQkJdGhpcy5jcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOwotCX0KLX07Ci0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLgotQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVCYWNrVG9Ub3BMaW5rID0gZnVuY3Rpb24oZWxlbWVudCkgewotCXZhciBkaXY7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOwotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2UuYWx0ID0gdGhpcy5iYWNrVG9Ub3BUZXh0OwotCQlpbWFnZS50aXRsZSA9IHRoaXMuYmFja1RvVG9wVGV4dDsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5iYWNrVG9Ub3BJbWFnZTsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOwotCQlsaW5rLmhyZWYgPSAnIyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5iYWNrVG9Ub3BUZXh0KSk7CQkKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7Ci0JfQotfTsKLQotCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyA9IGZ1bmN0aW9uKGZpcnN0RWxlbWVudCkgewotCi0JdmFyIGRpdjsKLQl2YXIgc2VsZiA9IHRoaXM7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWRpdi5hbGlnbiA9ICdyaWdodCc7Ci0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlpbWFnZS5zcmMgPSB0aGlzLmV4cGFuZEFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmV4cGFuZEFsbFRleHQ7Ci0JCWltYWdlLnRpdGxlID0gdGhpcy5leHBhbmRBbGxUZXh0OwotCQlpbWFnZS53aWR0aCA9ICcxNic7Ci0JCWltYWdlLmhlaWdodCA9ICcxNic7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJbGluay5ocmVmID0gJyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuZXhwYW5kQWxsOyovIGZ1bmN0aW9uKGV2dCkgewotCQkJLyoKLQkJCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJIAlzZWxmLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJIAlzZWxmLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5jb2xsYXBzZUltYWdlOwotCQkJIH0KLQkJCSAqLwotCQkJIHNlbGYuZXhwYW5kQWxsKCk7Ci0JCQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsKLQkJCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkgfQotCQkJIHJldHVybiBmYWxzZTsKLQkJfTsKLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5leHBhbmRBbGxUZXh0KSk7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7Ci0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQotCQkKLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5jb2xsYXBzZUFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dDsKLQkJaW1hZ2UudGl0bGUgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dDsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcjJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5jb2xsYXBzZUFsbDsqL2Z1bmN0aW9uKGV2dCkgewotCQkJLyoKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJc2VsZi5zZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JCQkqLwotCQkJc2VsZi5jb2xsYXBzZUFsbCgpOwotCQkJCi0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOwotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29sbGFwc2VBbGxUZXh0KSk7CQkJCQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOwotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7Ci0JCQotCQkvKgotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsKLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7Ci0JCSovCi0JCWlmICh0aGlzLmZpcnN0U2VjdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIHRoaXMuZmlyc3RTZWN0aW9uKTsKLQkJfQotCQkKLQkJaWYgKCBjb250ZW50UGFnZS5nZXRBcHAoKSAhPSBudWxsICkgewotCQkJZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0JCX0KLQl9OwotCQotCUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuZXhwYW5kQWxsID0gZnVuY3Rpb24oKSB7Ci0JCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJIAl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJIAl0aGlzLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gdGhpcy5jb2xsYXBzZUltYWdlOwotCQkJIH0KLQl9OwotCQotCUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY29sbGFwc2VBbGwgPSBmdW5jdGlvbigpIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JfTsKLX07Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2OTBlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vIENocmlzIEFsZGVydG9uLCBJQk0gU29mdHdhcmUgU2VydmljZXMgQXVzdHJhbGlhLCBNYXJjaCAyMDA4Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBkZWZpbmUgdGhlIGNsYXNzIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byBsb2FkIHRoZSBkZXRhaWwgaW1wbGVtZW50YXRpb25zIAotQ29udGVudFBhZ2VTdWJTZWN0aW9uID0gZnVuY3Rpb24oKSB7Ci0KLQl0aGlzLnBhcmVudCA9IGNvbnRlbnRQYWdlOwotCS8vIGJ5IGRlZmF1bHQsIHdlIHJldXNlIHRoZSBpbWFnZXMgZnJvbSBzZWN0aW9uCi0JdGhpcy5leHBhbmRJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uZXhwYW5kSW1hZ2U7CQkKLQl0aGlzLmNvbGxhcHNlSW1hZ2UgPSB0aGlzLnBhcmVudC5zZWN0aW9uLmNvbGxhcHNlSW1hZ2U7Ci0JdGhpcy5leHBhbmRBbGxJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uZXhwYW5kQWxsSW1hZ2U7CQotCXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uY29sbGFwc2VBbGxJbWFnZTsKLQotCXRoaXMuaW5kZW50SW1hZ2UgPSB0aGlzLnBhcmVudC5zZWN0aW9uLnNoaW1JbWFnZTsJCS8vIGFkZGVkIGJ5IENocmlzIEFsZGVydG9uCi0KLQkvLyBhbmQgdXNlIHRoZSBkZWZhdWx0IHRlc3QsIG92ZXJyaWRlIHRoaXMgYXMgbmVlZGVkCi0JdGhpcy5leHBhbmRBbGxUZXh0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZEFsbFN1YlNlY3Rpb25zVGV4dDsKLQl0aGlzLmNvbGxhcHNlQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZUFsbFN1YlNlY3Rpb25zVGV4dDsJCi0KLQkvLyBlbnN1cmVzIHRoYXQgc3RlcHMgYXJlIGV4cGFuZGVkIG9uIGRpc3BsYXkKLQl0aGlzLmNvbGxhcHNlU3RlcHNCeURlZmF1bHQgPSB0cnVlOwotCXRoaXMuZmlyc3RTdGVwU2VjdGlvbiA9IG51bGw7Ci0KLQl0aGlzLnN0ZXBDb2xsYXBzZURpdnMgPSBudWxsOwotCXRoaXMuc3RlcENvbGxhcHNlTGlua3MgPSBudWxsOwotCQkKLX07Ci0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbiBsaW5rcy4KLUNvbnRlbnRQYWdlU3ViU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlU3RlcExpbmtzID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgewotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsKLQotCQl2YXIgZXhpc3RTdGVwQ29udGVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsJLy8gYWRkZWQgYnkgQ2hyaXMgQWxkZXJ0b24KLQkJdmFyIHRvdGFsTGlua3MgPSAwOwotCQl2YXIgaywgbCwgbTsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7Ci0JCQkJCi0JCQkJaz10b3RhbExpbmtzOwkJCQkvLyBhZGRlZCBieSBDaHJpcyBBbGRlcnRvbgotCi0JCQkJc3RlcEVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50OwotCQkJfQotCQkJLy8gbG9va2luZyBmb3IgZW1wdHkgc3RlcHMKLQkJCWlmKGVsZW1lbnQuY2xhc3NOYW1lID09ICJzdGVwQ29udGVudCIpIHsKLQkJCQl2YXIgZXhpc3QgPSBmYWxzZTsKLQkJCQl2YXIgbmV4dEluZGV4OwotCQkJCWRvIHsKLQkJCQkJbCA9IGVsZW1lbnQuaW5uZXJIVE1MLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiPFREPiIpKzQ7Ci0JCQkJCW0gPSBlbGVtZW50LmlubmVySFRNTC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoIjwvVEQ+Iik7Ci0JCQkJCWlmIChlbGVtZW50LmlubmVySFRNTC5zdWJzdHIobCxtLWwpIT0nJz90cnVlOmZhbHNlKQotCQkJCQl7Ci0JCQkJCQlleGlzdCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQluZXh0SW5kZXggPSBlbGVtZW50LmlubmVySFRNTC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoIjxURD4iLGwpOwotCQkJCX13aGlsZSAobmV4dEluZGV4Pi0xKTsKLQkJCQlleGlzdFN0ZXBDb250ZW50c1trXSA9IGV4aXN0OwotCQkJfQotCQl9Ci0JCWlmICh0b3RhbExpbmtzID09IDApIHJldHVybjsKLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7Ci0JCXRoaXMuc3RlcENvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsKLQkJdGhpcy5zdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsKLQkJdGhpcy5maXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaV07Ci0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsKLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsKLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOwotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07Ci0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOwotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOwotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLmNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsKLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgIAkJCX0KLSAgICAJCQl0aGlzLnN0ZXBDb2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOwotCQkJCS8vIGV4dHJhIHBhcmFtZXRlciBhZGRlZCAtIGV4aXN0U3RlcENvbnRlbnRzW2ldCi0gICAgCQkJdGhpcy5jcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGksIGV4aXN0U3RlcENvbnRlbnRzW2ldKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXRoaXMuY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKHN0ZXBFbGVtZW50c1swXSk7Ci0JfQotfTsKLQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbi4KLS8vIGV4dHJhIHBhcmFtZXRlciBhZGRlZCAtIGNvbnRlbnQKLUNvbnRlbnRQYWdlU3ViU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4LCBleGlzdENvbnRlbnQpIHsKLQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7Ci0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlpZihleGlzdENvbnRlbnQpIHsKLQkJCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7Ci0JCQlsaW5rLmhyZWYgPSAnJzsKLQkJCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQkJaWYgKHRoaXMuY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgewotCQkJCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCQkJaW1hZ2UuYWx0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCQkJaW1hZ2UudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsJCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JCQkJaW1hZ2UuYWx0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsKLQkJCQlpbWFnZS50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7CQotCQkJfQotCQkJaW1hZ2Uud2lkdGggPSAnMTcnOwotCQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsKLQkJCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJCi0JCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsqL2Z1bmN0aW9uKGV2dCkgewotCQkJCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJCQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQkJCXRoaXMuZmlyc3RDaGlsZC5hbHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQkJCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7CQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5jb2xsYXBzZUltYWdlOwotCQkJCQl0aGlzLmZpcnN0Q2hpbGQuYWx0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsKLQkJCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsJCQkJCQotCQkJCX0KLQkJCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCQlldnQucHJldmVudERlZmF1bHQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfTsKLQkgICAgfQotCSAgICBlbHNlIHsvLyByZW1vdmVzIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gd2hlcmUgc3RlcCBoYXMgbm90IGNvbnRlbnQKLQkJCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCQlpbWFnZS5zcmMgPSB0aGlzLmluZGVudEltYWdlOwotCQkJaW1hZ2UuYWx0ID0gJyc7Ci0JCQlpbWFnZS50aXRsZSA9ICcnOwotCQkJaW1hZ2Uud2lkdGggPSAnMTcnOwotCQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsKLQkJCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkgICAgfQotCSAgICB0aGlzLnN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7Ci0JICAgIHNwYW4uYXBwZW5kQ2hpbGQobGluayk7Ci0JICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7Ci0JICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JfQotfTsKLQotCQkJCQkKLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTdGVwcyBsaW5rcy4KLUNvbnRlbnRQYWdlU3ViU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzID0gZnVuY3Rpb24oZmlyc3RFbGVtZW50KSB7Ci0JdmFyIGRpdjsKLQl2YXIgc2VsZiA9IHRoaXM7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWRpdi5hbGlnbiA9ICdyaWdodCc7CQkKLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kQWxsSW1hZ2U7Ci0JCWltYWdlLmFsdCA9IHRoaXMuZXhwYW5kQWxsVGV4dAotCQlpbWFnZS50aXRsZSA9IHRoaXMuZXhwYW5kQWxsVGV4dAotCQlpbWFnZS53aWR0aCA9ICcxNic7Ci0JCWltYWdlLmhlaWdodCA9ICcxNic7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJbGluay5vbmNsaWNrID0gLyp0aGlzLmV4cGFuZEFsbFN0ZXBzOyovZnVuY3Rpb24oZXZ0KSB7Ci0JCQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsKLQkJCSAJc2VsZi5zdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsKLQkJCQkJLy9zdG9wcyBjb2xsYXBzZSBidXR0b24gYmVpbmcgYWRkZWQgd2hlcmUgc3RlcCBoYXMgbm8gY29udGVudCBleHBhbmRBbGwgYnV0dG9uIGlzIGNsaWNrZWQKLQkJCSAgICAgCWlmIChzZWxmLnN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQudGl0bGUgIT0gJycpIHsKLQkJCQkJc2VsZi5zdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHNlbGYuY29sbGFwc2VJbWFnZTsKLQkJCSAgICAgCX0KLQkJCSB9Ci0JCQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsKLQkJCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkgfQotCQkJIHJldHVybiBmYWxzZTsKLQkJfTsKLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5leHBhbmRBbGxUZXh0KSk7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7Ci0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQkKLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5jb2xsYXBzZUFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dAotCQlpbWFnZS50aXRsZSA9IHRoaXMuY29sbGFwc2VBbGxUZXh0Ci0JCWltYWdlLndpZHRoID0gJzE2JzsKLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsKLQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5jb2xsYXBzZUFsbFN0ZXBzOyovZnVuY3Rpb24oZXZ0KSB7Ci0JCQlmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJCXNlbGYuc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotCQkJCS8vc3RvcHMgZXhwYW5kIGJ1dHRvbiBiZWluZyBhZGRlZCB3aGVyZSBzdGVwIGhhcyBubyBjb250ZW50IHdoZW4gY29sbGFwc2VBbGwgYnV0dG9uIGlzIGNsaWNrZWQKLQkJCQlpZiAoc2VsZi5zdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnRpdGxlICE9ICcnKSB7Ci0JCQkJCXNlbGYuc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmV4cGFuZEltYWdlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX07Ci0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jb2xsYXBzZUFsbFRleHQpKTsKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQkKLQkJaWYgKHRoaXMuZmlyc3RTdGVwU2VjdGlvbikgewotCQkJdGhpcy5maXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgdGhpcy5maXJzdFN0ZXBTZWN0aW9uKTsKLQkJfQotCX0KLX07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE0N2U3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi1Db250ZW50UGFnZVRvb2xiYXIgPSBmdW5jdGlvbigpewotCi10aGlzLmV4cGFuZEFsbEltYWdlID0gbnVsbDsKLXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IG51bGw7Ci10aGlzLmJvb2ttYXJrSW1hZ2UgPSBudWxsOwotdGhpcy5wcmludEltYWdlID0gbnVsbDsKLXRoaXMuYmFja0ltYWdlID0gbnVsbDsKLXRoaXMuZm9yd2FyZEltYWdlID0gbnVsbDsKLXRoaXMuZGl2aWRlckltYWdlID0gbnVsbDsKLQotLy8gaG9sZCB0aGUgdG9vbGJhciBpdGVtIGlkcwotdGhpcy50b29sYmFySXRlbXMgPSBbXTsKLQotdGhpcy5iYXJJdGVtSWRQcmVmaXggPSAiY29udGVudGJhcl8iOwotCi19Ci0KLUNvbnRlbnRQYWdlVG9vbGJhci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGltZ1BhdGgpIHsKLQotCXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnZXhwYW5kX2FsbC5naWYnKTsJCi0JdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnKTsKLQl0aGlzLmJvb2ttYXJrSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnYm9va21hcmsuZ2lmJyk7Ci0JdGhpcy5wcmludEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ3ByaW50LmdpZicpOwotCXRoaXMuYmFja0ltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2JhY2suZ2lmJyk7Ci0JdGhpcy5mb3J3YXJkSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnZm9yd2FyZC5naWYnKTsKLQl0aGlzLmRpdmlkZXJJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdkaXZpZGVyLmdpZicpOwotCS8vdGhpcy5zaGltSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnc2hpbS5naWYnKTsKLQkKLQl0aGlzLl9jcmVhdGVUb29sYmFyKCk7Ci19OwotCi1Db250ZW50UGFnZVRvb2xiYXIucHJvdG90eXBlLl9jcmVhdGVUb29sYmFyID0gZnVuY3Rpb24oKSB7Ci0JdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50UGFnZVRvb2xiYXIiKTsKLQkJCi0JaWYgKCBjb250YWluZXIgPT0gbnVsbCApIHsKLQkJcmV0dXJuOwotCX0KLQkKLQl2YXIgaHRtbCA9IFsiPHRhYmxlIGJvcmRlcj0nMCcgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyA+IiwgIjx0cj4iXTsKLQkJCi0JCS8vIGxvY2FsIGZpbGUgY2FuJ3QgYmUgYWRkZWQgYXMgYm9va21hcmsKLQkJaWYgKCAhY29udGVudFBhZ2UuaXNGaWxlVXJsKGxvY2F0aW9uLmhyZWYpICkgewotCQkJaHRtbCA9IGh0bWwuY29uY2F0KHRoaXMuX2dldFRvb2xiYXJJdGVtSHRtbCh0aGlzLmJvb2ttYXJrSW1hZ2UsIGNvbnRlbnRQYWdlLnJlcy50b29sYmFyX2Jvb2ttYXJrKSk7Ci0JCX0KLQkJCi0JCWh0bWwgPSBodG1sLmNvbmNhdCh0aGlzLl9nZXRUb29sYmFySXRlbUh0bWwodGhpcy5iYWNrSW1hZ2UsIGNvbnRlbnRQYWdlLnJlcy50b29sYmFyX2JhY2spKTsKLQkJaHRtbCA9IGh0bWwuY29uY2F0KHRoaXMuX2dldFRvb2xiYXJJdGVtSHRtbCh0aGlzLmZvcndhcmRJbWFnZSwgY29udGVudFBhZ2UucmVzLnRvb2xiYXJfZm9yd2FyZCkpOwotCQlodG1sID0gaHRtbC5jb25jYXQodGhpcy5fZ2V0VG9vbGJhckl0ZW1IdG1sKHRoaXMuZXhwYW5kQWxsSW1hZ2UgLCBjb250ZW50UGFnZS5yZXMudG9vbGJhcl9leHBhbmRfYWxsKSk7Ci0JCWh0bWwgPSBodG1sLmNvbmNhdCh0aGlzLl9nZXRUb29sYmFySXRlbUh0bWwodGhpcy5jb2xsYXBzZUFsbEltYWdlLCBjb250ZW50UGFnZS5yZXMudG9vbGJhcl9jb2xsYXBzZV9hbGwpKTsKLQkJaHRtbCA9IGh0bWwuY29uY2F0KFsiPHRkIHdpZHRoPScxMHB4Jz48aW1nIGFsdD0nJyBzcmM9JyIsIHRoaXMuZGl2aWRlckltYWdlLCAiJyB0aXRsZT0nJy8+PC90ZD4iXSk7Ci0JCWh0bWwgPSBodG1sLmNvbmNhdCh0aGlzLl9nZXRUb29sYmFySXRlbUh0bWwodGhpcy5wcmludEltYWdlLCBjb250ZW50UGFnZS5yZXMudG9vbGJhcl9wcmludCkpOwotCQlodG1sID0gaHRtbC5jb25jYXQoWyI8L3RyPiIsICI8L3RhYmxlPiJdKTsKLQkJCi0JY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwuam9pbigiIik7Ci0KLQkvLyBhdHRhY2ggZXZlbnRzCi0JZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRvb2xiYXJJdGVtcy5sZW5ndGg7IGkrKyApIHsKLQkJdmFyIGlkID0gdGhpcy50b29sYmFySXRlbXNbaV07Ci0JCXZhciBiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7Ci0JCS8vYWxlcnQoYmFyLnRhZ05hbWUpOwotCQkKLQkJLy8gbm90ZTogYWxsIGhhbmRsZXIgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gZmFsc2UgdG8gYXZvaWQgdGhlIHVybCBhY3Rpb24KLQkJdmFyIGhhbmRsZXIgPSBudWxsOwotCQlpZiAoIGlkLmluZGV4T2YodGhpcy5ib29rbWFya0ltYWdlKSA+PSAwICkgewotCQkJaGFuZGxlciA9ICBmdW5jdGlvbigpIHsgCi0JCQkJY29udGVudFBhZ2Uuc2F2ZUFzQm9va21hcmsoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9OwotCQl9IGVsc2UgaWYgKCBpZC5pbmRleE9mKHRoaXMuYmFja0ltYWdlKSA+PSAwICkgewotCQkJaGFuZGxlciA9ICBmdW5jdGlvbigpIHsgCi0JCQkJLy9hbGVydCgiYmFjayIpOwotCQkJCXZhciBhcHAgPSBjb250ZW50UGFnZS5nZXRBcHAoKTsKLQkJCQlpZiAoIGFwcCAhPSBudWxsICkgewotCQkJCQlhcHAuYnJvd3Nlci5iYWNrKCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCX0gZWxzZSBpZiAoIGlkLmluZGV4T2YodGhpcy5mb3J3YXJkSW1hZ2UpID49IDAgKSB7Ci0JCQloYW5kbGVyID0gIGZ1bmN0aW9uKCkgeyAKLQkJCQl2YXIgYXBwID0gY29udGVudFBhZ2UuZ2V0QXBwKCk7Ci0JCQkJaWYgKCBhcHAgIT0gbnVsbCApIHsKLQkJCQkJYXBwLmJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9OwotCQl9IGVsc2UgaWYgKCBpZC5pbmRleE9mKHRoaXMuZXhwYW5kQWxsSW1hZ2UpID49IDAgKSB7Ci0JCQloYW5kbGVyID0gIGZ1bmN0aW9uKCkgeyAKLQkJCQljb250ZW50UGFnZS5zZWN0aW9uLmV4cGFuZEFsbCgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCX0gZWxzZSBpZiAoIGlkLmluZGV4T2YodGhpcy5jb2xsYXBzZUFsbEltYWdlKSA+PSAwICkgewotCQkJaGFuZGxlciA9ICBmdW5jdGlvbigpIHsgCi0JCQkJY29udGVudFBhZ2Uuc2VjdGlvbi5jb2xsYXBzZUFsbCgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCX0gZWxzZSBpZiAoIGlkLmluZGV4T2YodGhpcy5wcmludEltYWdlKSA+PSAwICkgewotCQkJaGFuZGxlciA9ICBmdW5jdGlvbigpIHsgCi0JCQkJd2luZG93LnByaW50KCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfTsKLQkJfSAKLQkJCi0JCWlmICggaGFuZGxlciAhPSBudWxsICkgewotCQkJYmFyLm9uY2xpY2sgPSBoYW5kbGVyOwkJCQotCQl9Ci0JCQotCQkvLyBoYW5kbGUgdGhlIGtleSBzdHJva2UKLQkJCi0JfQotCi0JCi0JLyoKLQl2YXIgdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOwotCXRhYmxlLmJvcmRlciA9ICIyIjsKLQl0YWJsZS5jZWxsc3BhY2luZyA9ICIwIjsKLQl0YWJsZS5jZWxscGFkZGluZyA9ICIwIjsKLQljb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGUpOwotCQotCXZhciB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0JdGFibGUuYXBwZW5kQ2hpbGQodHIpOwotCSovCi0JLy8gY3JlYXRlIHRoZSBiYXIgaXRlbXMKLQkvL3RyLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVRvb2xiYXJJdGVtKHRoaXMuYm9va21hcmtJbWFnZSwgIkJvb2ttYXJrIHRoaXMgcGFnZSIsICIyMHB4IikpOwotCS8qCi0JdHIuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUb29sYmFySXRlbSh0aGlzLmJhY2tJbWFnZSwgImJhY2siLCAiMjBweCIpKTsKLQl0ci5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKHRoaXMuZm9yd2FyZEltYWdlLCAiZm9yd2FyZCIsICIyMHB4IikpOwotCXRyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVG9vbGJhckl0ZW0odGhpcy5leHBhbmRBbGxJbWFnZSwgImV4cGFuZCBBbGwiLCAiMjBweCIpKTsKLQl0ci5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKHRoaXMuY29sbGFwc2VBbGxJbWFnZSwgImNvbGxhcHNlIEFsbCIsICIyMHB4IikpOwotCXRyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVG9vbGJhckl0ZW0odGhpcy5kaXZpZGVySW1hZ2UsICIiLCAiMTBweCIpKTsKLQl0ci5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKHRoaXMucHJpbnRJbWFnZSwgIlByaW50IiwgIjIwcHgiKSk7Ci0JKi8KLQkKLX07Ci0KLUNvbnRlbnRQYWdlVG9vbGJhci5wcm90b3R5cGUuX2dldFRvb2xiYXJJdGVtSHRtbCA9IGZ1bmN0aW9uKGltZ1NyYywgdGV4dCkgewotCQotCXZhciBpbmRleCA9IHRoaXMudG9vbGJhckl0ZW1zLmxlbmd0aDsKLQl2YXIgaWQgPSB0aGlzLmJhckl0ZW1JZFByZWZpeCArIGltZ1NyYzsKLQl0aGlzLnRvb2xiYXJJdGVtc1tpbmRleF0gPSBpZDsKLQkKLQl2YXIgaHRtbCA9IFsiPHRkIHdpZHRoPScyMHB4JyBjbGFzcz0nY29udGVudFRvb2xiYXJJY29uJz48YSBocmVmPScnIGlkPSciLCBpZCwgIic+IiwgIAotCQkiPGltZyBhbHQ9JyIsIHRleHQsICInIHNyYz0nIiwgaW1nU3JjLCAiJyB0aXRsZT0nIiwgdGV4dCwgIicvPjwvYT4iLCAiPC90ZD4iXTsKLQotCXJldHVybiBodG1sOwkKLX07Ci0KLUNvbnRlbnRQYWdlVG9vbGJhci5wcm90b3R5cGUuX2NyZWF0ZVRvb2xiYXJJdGVtID0gZnVuY3Rpb24oaW1nU3JjLCB0ZXh0LCB3aWR0aCkgewotCXZhciB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0JdGQud2lkdGggPSB3aWR0aDsKLQkKLQl2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7Ci0JaW1nLmlkID0gdGhpcy5iYXJJdGVtSWRQcmVmaXggKyBpbWdTcmM7Ci0JCi0JaW1nLnNyYyA9IGltZ1NyYzsKLQlpbWcudGl0bGUgPSB0ZXh0OwotCWltZy5hbHQgPSB0ZXh0OwotCWltZy53aWR0aCA9ICcxNic7Ci0JaW1nLmhlaWdodCA9ICcxNic7Ci0JaW1nLmJvcmRlciA9ICcwJzsKLQkvL2ltZy5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQotCXRkLmFwcGVuZENoaWxkKGltZyk7Ci0JCi0JLy9hbGVydCgidGQ6ICIgKyB0ZCk7Ci0JCi0JcmV0dXJuIHRkOwotfTsKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjhkYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLQotLy8gZGVmaW5lIHRoZSBjbGFzcyBoZXJlIHNvIHdlIGRvbid0IG5lZWQgdG8gbG9hZCB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9ucyAKLWZ1bmN0aW9uIFByb2Nlc3NFbGVtZW50UGFnZSgpIHsKLQotCXRoaXMucGFyX3Byb2MgPSBudWxsOwotCXRoaXMucGFyX3BhdGggPSBudWxsOwotCi0JLy8gaW1hZ2VzIGZvciB0aGUgYWN0aXZpdHksIGdlbmVyYXRlZCBkeW5hbWljYWxseSB3aGVuIHB1Ymxpc2hpbmcKLQl0aGlzLmltYWdlRmlsZXMgPSBbXTsKLQkKLQkvLyBzdXBwcmVzc2VkIGl0ZW1zIGZvciB0aGUgYWN0aXZpdHksIGdlbmVyYXRlZCBkeW5hbWljYWxseSB3aGVuIHB1Ymxpc2hpbmcKLQl0aGlzLnN1cHByZXNzZWRJdGVtcyA9IFtdOwotCQotCS8vIGVsZW1lbnQgdXJscyBmb3IgdGhlIGFjdGl2aXR5LCBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgd2hlbiBwdWJsaXNoaW5nCi0JdGhpcy5lbGVtZW50VXJscyA9IFtdOwotCQkKLQl0aGlzLnRyZWVUYWJsZSA9IG51bGw7Ci0JCi19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihoYXNUcmVlKSB7Ci0KLQl2YXIgcGFyYW1ldGVycyA9IGNvbnRlbnRQYWdlLmdldFVybFBhcmFtZXRlcnMoY29udGVudFBhZ2UucXVlcnlTdHIuc3Vic3RyaW5nKDEpKTsKLQl0aGlzLnBhcl9wcm9jID0gcGFyYW1ldGVyc1sicHJvYyJdOwotCXRoaXMucGFyX3BhdGggPSBwYXJhbWV0ZXJzWyJwYXRoIl07Ci0JCi0JaWYgKCB0aGlzLnBhcl9wcm9jID09IG51bGwgfHwgdGhpcy5wYXJfcGF0aCA9PSBudWxsICkgewotCQlwYXJhbWV0ZXJzID0gY29udGVudFBhZ2UuZ2V0VXJsUGFyYW1ldGVycyhjb250ZW50UGFnZS5kZWZhdWx0UXVlcnlTdHIuc3Vic3RyaW5nKDEpKTsKLQkJdGhpcy5wYXJfcHJvYyA9IHBhcmFtZXRlcnNbInByb2MiXTsKLQkJdGhpcy5wYXJfcGF0aCA9IHBhcmFtZXRlcnNbInBhdGgiXTsKLQl9CQotCQotCWlmICggaGFzVHJlZSkgewotCQl0aGlzLmNyZWF0ZVRyZWUoY29udGVudFBhZ2UuaW1nUGF0aCk7Ci0JfQotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbigpIHsKLQl0aGlzLmZpeE1hcFVybHMoKTsKLQl0aGlzLmZpeFRhYlVybHMoKTsKLQlpZiAoIHRoaXMudHJlZVRhYmxlICE9IG51bGwgJiYgdGhpcy50cmVlVGFibGUuY3JlYXRlVHJlZSkgewotCQl0aGlzLnRyZWVUYWJsZS5jcmVhdGVUcmVlKCdkaXYnLCAndHJlZU5vZGUnKTsKLQl9Ci0JCi19OwotCi0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuY3JlYXRlVHJlZSA9IGZ1bmN0aW9uKGltZ1BhdGgpIHsKLQl0aGlzLnRyZWVUYWJsZSA9IG5ldyBBY3Rpdml0eVRyZWVUYWJsZSh0aGlzKTsKLQl0aGlzLnRyZWVUYWJsZS5pbml0aWFsaXplKGltZ1BhdGgpOwotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5maXhUYWJVcmxzID0gZnVuY3Rpb24oKSB7Ci0KLQl2YXIgYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJUQUJfRGVzY3JpcHRpb24iKTsKLQlpZiAoIGEgIT0gbnVsbCApIHsKLQkJdGhpcy5maXhUYWJVcmwoYSk7Ci0JfQotCQotCWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiVEFCX1dCUyIpOwotCWlmICggYSAhPSBudWxsICkgewotCQl0aGlzLmZpeFRhYlVybChhKTsKLQl9Ci0KLQlhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIlRBQl9XUEJTIik7Ci0JaWYgKCBhICE9IG51bGwgKSB7Ci0JCXRoaXMuZml4VGFiVXJsKGEpOwotCX0KLQotCWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiVEFCX1RCUyIpOwotCWlmICggYSAhPSBudWxsICkgewotCQl0aGlzLmZpeFRhYlVybChhKTsKLQl9Ci19OwotCi0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZml4VGFiVXJsID0gZnVuY3Rpb24oYSkgewotCWlmIChhID09IG51bGwgfHwgIGNvbnRlbnRQYWdlLnF1ZXJ5U3RyID09IG51bGwgKSByZXR1cm47Ci0JdmFyIHVybCA9IGEuZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0JaWYgKCB1cmwgIT0gbnVsbCApIHsKLQkJYS5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwgKyBjb250ZW50UGFnZS5xdWVyeVN0cik7Ci0JfQotfQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmZpeE1hcFVybHMgPSBmdW5jdGlvbigpIHsKLQotCS8vIGZpeCB0aGUgbWFwIGFyZWEgdXJsCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7Ci0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBUkVBIik7Ci0JCWlmICggZWxlbWVudHMgIT0gbnVsbCApIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaHJlZiIpOwotCQkJCXZhciByZWxQYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJlbFBhdGgiKTsKLQkJCQlpZiAoIHVybCAhPSBudWxsICYmIHJlbFBhdGggIT0gbnVsbCApIHsKLQkJCQkJdXJsID0gdGhpcy5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCB0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoLCByZWxQYXRoKTsKLQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLy8gZml4IHRoZSBkaWFncmFtIGltZyB1cmxzCi0JdmFyIGRpYWdyYW1UeXBlID0gIkFjdGl2aXR5IjsgLy8gbm8gdHJhbnN0YXRpb24hCi0JdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGlhZ3JhbV8iICsgZGlhZ3JhbVR5cGUpOwotCWlmICggZSAhPSBudWxsICkgewotCQl2YXIgdXJsID0gdGhpcy5nZXREaWFncmFtSW1hZ2VVcmwodGhpcy5wYXJfcHJvYywgdGhpcy5wYXJfcGF0aCwgZGlhZ3JhbVR5cGUpOwotCQlpZiAoIHVybCAhPSBudWxsICkgewotCQkJZS5zcmMgPSB1cmw7Ci0JCX0KLQl9Ci0JCi0JZGlhZ3JhbVR5cGUgPSAiQWN0aXZpdHlEZXRhaWwiOyAvLyBubyB0cmFuc3RhdGlvbiEKLQllID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRpYWdyYW1fIiArIGRpYWdyYW1UeXBlKTsKLQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQl2YXIgdXJsID0gdGhpcy5nZXREaWFncmFtSW1hZ2VVcmwodGhpcy5wYXJfcHJvYywgdGhpcy5wYXJfcGF0aCwgZGlhZ3JhbVR5cGUpOwotCQkJaWYgKCB1cmwgIT0gbnVsbCApIHsKLQkJCQllLnNyYyA9IHVybDsKLQkJCX0KLQl9Ci19Ci0KLQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmdldEFjdGl2aXR5SXRlbVVybCA9IGZ1bmN0aW9uKHVybCwgcHJvY2VzcywgZWxlbWVudFByb2Nlc3NQYXRoLCByZWxQcm9jZXNzUGF0aCkKLXsKLQl2YXIgcXVlcnlTdHJpbmcgPSAiP3Byb2M9IiArIHByb2Nlc3MgKyAiJnBhdGg9IiArIGVsZW1lbnRQcm9jZXNzUGF0aCArIHJlbFByb2Nlc3NQYXRoOwotCXJldHVybiBjb250ZW50UGFnZS5yZXNvbHZlVXJsKHVybCkgKyBxdWVyeVN0cmluZzsKLQkKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZ2V0RGlhZ3JhbUltYWdlVXJsID0gZnVuY3Rpb24ocHJvY2VzcywgZWxlbWVudFByb2Nlc3NQYXRoLCBkaWFncmFtVHlwZSkKLXsKLQkvLyBnZXQgdGhlIGRpYWdyYW0gaW1hZ2UgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IHBhdGggYW5kIHByb2Nlc3MKLQkvLyByZXR1dG5zIG51bGwgaWYgbm90aW5nCi0JLy8gZGlhZ3JhbSB0eXBlIGlzIEFjdGl2aXR5LCBBY3Rpdml0eURldGFpbCwgCi0JdmFyIGltZ1VybCA9IHRoaXMuaW1hZ2VGaWxlc1tlbGVtZW50UHJvY2Vzc1BhdGgrZGlhZ3JhbVR5cGVdOwotCS8vYWxlcnQoImdldCAiICsgZGlhZ3JhbVR5cGUgKyAiIGRpYWdyYW0gZm9yICIgKyBlbGVtZW50UHJvY2Vzc1BhdGggKyAiID0gIiArIGltZ1VybCk7Ci0KLQlpZiAoIGltZ1VybCAhPSBudWxsICYmIGltZ1VybCAhPSAidW5kZWZpbmVkIiApIHsKLQkJcmV0dXJuIGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nVXJsKTsKLQl9IAotCQotCXJldHVybiBudWxsOwotfTsKLQotLyp0aGlzIG1ldGhvZCBmaXggdGhlIHVybCBmb3IgZGVzY3JpcHRvciBsaW5rcyB3aXRoaW4gZGVzY3JpcHRvciovCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmdldERlc2NyaXB0b3JJdGVtVXJsID0gZnVuY3Rpb24odXJsLCByZWxQcm9jZXNzUGF0aCkKLXsKLQl2YXIgcGF0aCA9ICIiOwotCXZhciBpID0gIHRoaXMucGFyX3BhdGguaW5kZXhPZihyZWxQcm9jZXNzUGF0aCk7Ci0JaWYgKCBpID4gMCApIHsKLQkJcGF0aCA9IHRoaXMucGFyX3BhdGguc3Vic3RyaW5nKDAsIGkgKyByZWxQcm9jZXNzUGF0aC5sZW5ndGgpOwotCX0gZWxzZSB7Ci0JCS8vIHJlbW92ZSB0aGUgbGFzdCBndWlkCi0JCWkgPSB0aGlzLnBhcl9wYXRoLmxhc3RJbmRleE9mKCIsIik7Ci0JCXBhdGggPSB0aGlzLnBhcl9wYXRoLnN1YnN0cmluZygwLCBpKzEpICsgcmVsUHJvY2Vzc1BhdGg7Ci0JfQotCQotCXZhciBxdWVyeVN0cmluZyA9ICI/cHJvYz0iICsgdGhpcy5wYXJfcHJvYyArICImcGF0aD0iICsgcGF0aDsKLQl1cmwgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKHVybCkgKyBxdWVyeVN0cmluZzsKLQkJCi0JcmV0dXJuIHVybDsKLQkKLX07Ci0KLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5maXhEZXNjcmlwdG9yTGlua3MgPSBmdW5jdGlvbigpCi17Ci0JdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkEiKTsKLQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJdmFyIGd1aWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZ3VpZCIpOwotCQl2YXIgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKLQotCQlpZiAoIGd1aWQgIT0gbnVsbCAmJiBndWlkICE9ICIiICkgewotCQkJdXJsID0gdGhpcy5nZXREZXNjcmlwdG9ySXRlbVVybCh1cmwsIGd1aWQpOwotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwpOwotCQl9Ci0JfQotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5pc1N1cHByZXNzZWQgPSBmdW5jdGlvbihwcm9jZXNzLCBlbGVtZW50UHJvY2Vzc1BhdGgpCi17Ci0JdmFyIGZsYWcgPSAodGhpcy5zdXBwcmVzc2VkSXRlbXNbZWxlbWVudFByb2Nlc3NQYXRoXSA9PSB0cnVlKTsKLQkvL2lmICggZmxhZyApIGFsZXJ0KCJnb3Qgb25lOiAiICsgZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJCi0JcmV0dXJuIGZsYWc7Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmJ1aWxkVGVhbVRyZWUgPSBmdW5jdGlvbih0ZWFtVHJlZSkgewkKLQkKLQl2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVhbVRyZWUiKTsKLQlpZiAoIGVsID09IG51bGwgKSByZXR1cm47Ci0JCi0JaWYgKCB0ZWFtVHJlZSA9PSBudWxsIHx8IHRlYW1UcmVlLmxlbmd0aCA9PSAwICkgewotCQlyZXR1cm47Ci0JfQotCQotCXRlYW1UcmVlWzBdWzBdID0gdGVhbVRyZWVbMF1bMF0ucmVwbGFjZSgvKFwnfFwiKS9nLCAiXFwkMSIpOwotCi0JdmFyIHRlYW1CdWZmZXIgPSBbXTsKLQl2YXIgbGVuID0gdGVhbVRyZWUubGVuZ3RoOwotCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCi0JCWlmICggIXRoaXMuaXNUZWFtU3VwcHJlc3NlZCh0ZWFtVHJlZVtpXSkgKSB7Ci0JCQl0ZWFtQnVmZmVyW3RlYW1CdWZmZXIubGVuZ3RoXSA9ICI8ZGl2IGNsYXNzPVwidGVhbVN0cnVjdHVyZVwiIGFsaWduPVwibGVmdFwiPiI7Ci0JCQl0ZWFtQnVmZmVyID0gdGVhbUJ1ZmZlci5jb25jYXQodGhpcy5nZXRUZWFtVHJlZUh0bWwodGVhbVRyZWVbaV0pKTsKLQkJCXRlYW1CdWZmZXJbdGVhbUJ1ZmZlci5sZW5ndGhdID0gIjwvZGl2Pjxici8+IjsKLQkJfQotCi0JfQotCQotCS8vYWxlcnQodGVhbUJ1ZmZlcik7Ci0JLy9kb2N1bWVudC53cml0ZSh0ZWFtQnVmZmVyKTsKLQllbC5pbm5lckhUTUwgPSB0ZWFtQnVmZmVyLmpvaW4oIiIpOwotfTsKLQotCi0vLyBmb3JtYXQgaXMgW3VybCwgdGl0bGUsIHJlbFBhdGgsIHN1cHByZXNzZWRdCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmdldFRlYW1UcmVlSHRtbCA9IGZ1bmN0aW9uKHRlYW1UcmVlKSB7Ci0KLQlpZiAoIHRlYW1UcmVlID09IG51bGwgfHwgdGVhbVRyZWUubGVuZ3RoIDwgNCkgewotCQlyZXR1cm4gW107Ci0JfQotCi0JdmFyIHVybCA9IHRlYW1UcmVlWzBdOwotCXZhciB0aXRsZSA9IHRlYW1UcmVlWzFdOwotCXZhciByZWxQYXRoID0gdGVhbVRyZWVbMl07Ci0JCi0JdXJsID0gdGhpcy5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCB0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoLCByZWxQYXRoKTsKLQkKLQl2YXIgdGVhbUJ1ZmZlciA9IFsiPGEgaHJlZj1cIiIsIHVybCwgIlwiPiIsIHRpdGxlLCAiPC9hPiJdOwotCXZhciBzbGVuID0gNTsKLQkKLQlpZiAoIHRlYW1UcmVlLmxlbmd0aCA+IDQgJiYgdGVhbVRyZWVbNF0gIT0gbnVsbCAmJiB0ZWFtVHJlZVs0XSAhPSAiIiAmJiB0ZWFtVHJlZVs0XSAhPSB1bmRlZmluZWQgKSB7Ci0JCXRlYW1CdWZmZXJbc2xlbisrXSA9ICI8dWw+IjsKLQkJZm9yICggdmFyIGkgPSA0OyBpIDwgdGVhbVRyZWUubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiAodHlwZW9mIHRlYW1UcmVlW2ldID09ICJvYmplY3QiICYmICF0aGlzLmlzVGVhbVN1cHByZXNzZWQodGVhbVRyZWVbaV0pICkgewotCi0JCQkJdGVhbUJ1ZmZlcltzbGVuKytdID0gIjxsaT4iOwotCQkJCXRlYW1CdWZmZXIgPSB0ZWFtQnVmZmVyLmNvbmNhdCh0aGlzLmdldFRlYW1UcmVlSHRtbCh0ZWFtVHJlZVtpXSkpOwotCQkJCXNsZW4gPSB0ZWFtQnVmZmVyLmxlbmd0aDsKLQkJCQl0ZWFtQnVmZmVyW3NsZW4rK10gPSAiPC9saT4iOwotCQkJfQotCQl9Ci0JCXRlYW1CdWZmZXJbc2xlbisrXSA9ICI8L3VsPiI7Ci0JfQotCi0JcmV0dXJuIHRlYW1CdWZmZXI7Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmlzVGVhbVN1cHByZXNzZWQgPSBmdW5jdGlvbih0ZWFtVHJlZSkgewotCi0JaWYgKCB0ZWFtVHJlZSA9PSBudWxsIHx8IHRlYW1UcmVlLmxlbmd0aCA8IDQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXZhciByZWxQYXRoID0gdGVhbVRyZWVbMl07Ci0JdmFyIHN1cCA9IHRlYW1UcmVlWzNdOwotCi0JaWYgKCBzdXAgPT0gIiIgKSB7Ci0JCXJldHVybiB0aGlzLmlzU3VwcHJlc3NlZCh0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoICsgcmVsUGF0aCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIChzdXAgPT0gInRydWUiKTsKLQl9Ci0JCi19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmJ1aWxkUHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iID0gZnVuY3Rpb24odXJsKSB7Ci0KLQl2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJyZWFkY3J1bWJzIik7Ci0JaWYgKCBkaXYgPT0gbnVsbCApIHJldHVybjsKLQotCXZhciB2aWV3RnJhbWUgPSBjb250ZW50UGFnZS5nZXRWaWV3RnJhbWUoKTsKLQlpZiAoIHZpZXdGcmFtZSA9PSBudWxsICkgewotCQlyZXR1cm47Ci0JfQotCQkKLQl2YXIgcGF0aHMgPSB0aGlzLnBhcl9wYXRoLnNwbGl0KCIsIik7Ci0JCi0JdmFyIGhhc0FwcCA9IChjb250ZW50UGFnZS5nZXRBcHAoKSAhPSBudWxsKTsJCi0JdmFyIG5vZGVJbmZvID0gbnVsbDsKLQkKLQlpZiAoIGhhc0FwcCApIHsKLQkJLy8gdGhlIGZpcnN0IHBhdGggaXMgdGhlIHByb2Nlc3MgZ3VpZAotCQkvLyBob3dldmVyLCB0aGUgdHJlZSBub2RlIG1pZ2h0IGJlIGFuIGFjdGl2aXR5IHdpdGhvdXQgaGF2aW5nIGEgcHJvY2VzcyBub2RlCi0JCS8vIGZvciBleGFtcGxlLCBhIGRpc2NpcGxpbmUgY2FuIGhhdmUgYW4gYWN0aXZpdHkgYXMgYSByZWZlcmVuY2VkIHdvcmsgZmxvdwotCQkvLyBzbyBjaGVjayBhbGwgCi0JCWZvciAodmFyIHggPSAwOyB4IDwgcGF0aHMubGVuZ3RoOyB4KysgKSB7Ci0JCQl2YXIgaWQgPSBwYXRoc1t4XTsKLQkJCW5vZGVJbmZvID0gdmlld0ZyYW1lLmdldE5vZGVJbmZvKGlkKTsKLQkJCWlmICggbm9kZUluZm8gIT0gbnVsbCApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgdGhlIHByb2Nlc3MgaXMgbm90IGluIHRoZSB0cmVlLCB0aGVyZSBpcyBubyBub2RlaW5mbwotCQkvLyBpbiBzdWNoIGNhc2UsIHVzZSB0aGUgbm9kZSBpbmZvIG9mIHRoZSBlbGVtZW50Ci0JCWlmICggbm9kZUluZm8gPT0gbnVsbCApIHsKLQkJCW5vZGVJbmZvID0gY29udGVudFBhZ2Uubm9kZUluZm87Ci0JCX0KLQkJCi0JCWlmICggbm9kZUluZm8gIT0gbnVsbCApIHsKLQkJCS8vIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBzaW5jZSBpdCdzIHRoZSB2aWV3IG5vZGUKLQkJCXBhdGhzLnNoaWZ0KCk7Ci0JCi0JCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCQl2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbihiY3MpIHsKLQkJCQlzZWxmLl9zaG93UHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iKGRpdiwgYmNzLCB1cmwpOwotCQkJfTsKLQkJCXZpZXdGcmFtZS5nZXRCcmVhZGNydW1ic0J5UGF0aChub2RlSW5mbywgcGF0aHMsIGNhbGxiYWNrKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIGNhbid0IGZpbmQgdGhlIHRyZWUgbm9kZSwganVzdCBzaG93IHRoZSBwcm9jZXNzIGJyZWFkY3J1bWJzCi0JCQl2YXIgYmNzID0gW107Ci0JCQl0aGlzLl9zaG93UHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iKGRpdiwgYmNzLCB1cmwpOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmFyIGJjcyA9IG51bGw7Ci0JCXdoaWxlIChwYXRocy5sZW5ndGggPiAwICkgewotCQkJYmNzID0gdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzQnlQYXRoKHBhdGhzKTsKLQkJCWlmICggYmNzICE9IG51bGwgJiYgYmNzLmxlbmd0aCA+IDAgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCXBhdGhzLnNoaWZ0KCk7Ci0JCX0KLQkJCi0JCWlmICggYmNzID09IG51bGwgfHwgYmNzLmxlbmd0aCA9PSAwICkgewotCQkJYmNzICA9IHZpZXdGcmFtZS5nZXRCcmVhZGNydW1icyh1cmwpOwotCQl9Ci0JCQotCQkvL2FsZXJ0KGJjcyk7Ci0JCXRoaXMuX3Nob3dQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIoZGl2LCBiY3MsIHVybCk7Ci0JfQotCQotCi19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLl9zaG93UHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iID0gZnVuY3Rpb24oZGl2LCBiY3MsIHVybCkgewotCXZhciB2aWV3RnJhbWUgPSBjb250ZW50UGFnZS5nZXRWaWV3RnJhbWUoKTsKLQlpZiAodmlld0ZyYW1lID09IG51bGwgfHwgIXZpZXdGcmFtZS5nZXRCcmVhZGNydW1icyApIHsKLQkJcmV0dXJuOwotCX0KLQkKLQl2YXIgbG9jYWxCY3MgPSBbXTsKLQl2YXIgY291bnQgPSAwOwotCXZhciBsaW5rc1RleHQgPSAiIjsKLQl2YXIgcGF0aHMgPSB0aGlzLnBhcl9wYXRoLnNwbGl0KCIsIik7Ci0JdmFyIHBhdGggPSB0aGlzLnBhcl9wYXRoOwotCQotCXZhciBoYXNBcHAgPSAoY29udGVudFBhZ2UuZ2V0QXBwKCkgIT0gbnVsbCk7Ci0JLy9hbGVydCgiYXBwOiIgKyBoYXNBcHApOwotCXZhciBiYXNlVXJsID0gbnVsbDsKLQlpZiAoIGhhc0FwcCApIHsKLQkJYmFzZVVybCA9IGNvbnRlbnRQYWdlLmdldEFwcCgpLmdldEJhc2VVcmwoKTsKLQl9IGVsc2UgewkKLQkJYmFzZVVybCA9IHZpZXdGcmFtZS5nZXRCYXNlVXJsKCk7Ci0JfQotCQotCXZhciBsYXN0QmNzSWQgPSBudWxsOwotCWlmICggYmNzID09IG51bGwgKSB7Ci0JCWJjcyA9IFtdOwotCX0gZWxzZSBpZiAoIGJjcy5sZW5ndGggPiAwICkgewotCQlsYXN0QmNzSWQgPSBiY3NbYmNzLmxlbmd0aC0xXS5pZDsKLQl9Ci0JCi0JCi0JZm9yICh2YXIgaSA9IHBhdGhzLmxlbmd0aC0xOyBpID49MDsgaS0tKSB7Ci0JCXZhciBndWlkID0gcGF0aHNbaV07Ci0KLQkJdmFyIGl0ZW1fdGV4dCA9ICIiOwotCQl2YXIgaXRlbV91cmwgPSAiIjsKLQkJCi0JCXZhciBpdGVtID0gdGhpcy5lbGVtZW50VXJsc1tndWlkXTsKLQkJaWYgKCBpdGVtICE9IG51bGwgKSB7Ci0JCQlpdGVtX3RleHQgPSBpdGVtWzBdOwotCQkJaXRlbV91cmwgPSBiYXNlVXJsICsgaXRlbVsxXTsKLQotCQkJLy8gZ2V0IHRoZSB1cmwgd2l0aCBubyBiYWNrIHBhdGgsIHRoZW4gY29udmVyIHRvIGEgZnVsbCB1cmwJCQkKLQkJCWl0ZW1fdXJsID0gdGhpcy5nZXRBY3Rpdml0eUl0ZW1VcmwoaXRlbV91cmwsIHRoaXMucGFyX3Byb2MsIHBhdGgsICcnKTsKLQkJCS8vIGdldCB0aGUgbGFzdCB0cmVlLW5vZGUgYnJlYWRjcnVtYnMKLQkJCS8vIHByb2Nlc3MgdGhpcyBiZWZvcmUgdGhlIGl0ZW1fdXJsIGlzIHNldAotCQkJLy9hbGVydCgidmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzOiAiICsgdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzKTsKLQkJCWlmICggZ3VpZCA9PSBsYXN0QmNzSWQgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCWxvY2FsQmNzW2NvdW50KytdID0ge2lkOiBndWlkLCB1cmw6IGl0ZW1fdXJsLCB0aXRsZTogaXRlbV90ZXh0fTsJCQkKLQkJfQotCQkKLQkJLy8gdHJpbSB0aGUgcGF0aAotCQl2YXIgeCA9IHBhdGguaW5kZXhPZigiLCIgKyBndWlkKTsKLQkJaWYgKCB4ID4gMCApIHsKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCB4KTsKLQkJfQotCX0KLQotCWlmICggbG9jYWxCY3MubGVuZ3RoID4gMCApIHsKLQkJLy8gb3JkZXIgaXQgcmlnaHQKLQkJbG9jYWxCY3MgPSBsb2NhbEJjcy5yZXZlcnNlKCk7Ci0JCWlmICggYmNzID09IG51bGwgKSAgYmNzID0gW107CQkKLQkJdmFyIGNvdW50ID0gYmNzLmxlbmd0aDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhbEJjcy5sZW5ndGg7IGkrKykgewotCQkJYmNzW2NvdW50K2ldID0gbG9jYWxCY3NbaV07Ci0JCX0KLQl9Ci0JCi0JaWYgKCBiY3MgIT0gbnVsbCAmJiBiY3MubGVuZ3RoID4gMCApIHsKLQkJY29udGVudFBhZ2Uuc2hvd0JyZWFkY3J1bW5zKGRpdiwgYmNzKTsKLQl9Ci0JCi19OwotCi0KLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5nZXRQcm9jZXNzRWxlbWVudExpbmtIdG1sRnJvbUlkID0gZnVuY3Rpb24oZ3VpZCwgZWxlbWVudFBhdGgsIGJhY2tQYXRoKSB7Ci0KLQl2YXIgc3RyID0gW107Ci0JdmFyIGl0ZW0gPSB0aGlzLmVsZW1lbnRVcmxzW2d1aWRdOwotCWlmICggaXRlbSAhPSBudWxsICkgewotCQl2YXIgdGV4dCA9IGl0ZW1bMF07Ci0JCXZhciB1cmwgPSBiYWNrUGF0aCArIGl0ZW1bMV07Ci0JCXVybCA9IHRoaXMuZ2V0QWN0aXZpdHlJdGVtVXJsKHVybCwgdGhpcy5wYXJfcHJvYywgZWxlbWVudFBhdGgsICcnKTsKLQkJCi0JCS8vIGVzY2FwZSB0aGUgcXVvdGVzCi0JCXVybCA9IHVybC5yZXBsYWNlKC8nL2csICJcXCciKTsKLQkJdXJsID0gdXJsLnJlcGxhY2UoL1wiL2csICJcXFwiIik7Ci0JCQkKLQkJCQotCQlzdHIgPSBbIjxhIGhyZWY9XCIiLCB1cmwsICJcIj4iLCB0ZXh0LCAiPC9hPiJdOwotCX0KLQotCQotCXJldHVybiBzdHIuam9pbigiIik7Ci19OwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9jb250ZW50UGFnZS5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL2NvbnRlbnRQYWdlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdkODYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL2NvbnRlbnRQYWdlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGlzIHRlbXBvcmFyeSBmdW5jdGlvbiBoZWxwcyB0byByZXNvbHZlIEphdmFzY3JpcHQgZXJyb3JzIGluIHRoZSBtaWdyYXRlZCBSVVAKLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcKLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLWZ1bmN0aW9uIFJlZmVyZW5jZUhlbHBUb3BpYyAodG9waWNOYW1lLCBib29rICwgZmlsZU5hbWUpIHsKLSAgIC8vZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOwotfTsKLQotCi12YXIgY29udGVudFBhZ2UgPSB7Ci0KLQliYWNrUGF0aDogbnVsbCwKLQlpbWdQYXRoOiBudWxsLAotCWRlZmF1bHRRdWVyeVN0cjogbnVsbCwKLQlxdWVyeVN0cjogbnVsbCwKLQlpc1Byb2Nlc3NQYWdlOiBmYWxzZSwKLQlub2RlSW5mbzogbnVsbCwKLQkKLQkvLyBkZWZpbmUgcmVzb3VyY2UgZmlsZQotCXJlcyA6IG5ldyBDb250ZW50UGFnZVJlc291cmNlKCksCi0JCi0JLy8gZGVmaW5lIGFjdGl2aXR5IGxheW91dCwgbmVlZCB0byBjcmVhdGUgdGhpcyBhcyBhIHBsYWNlIGhvbGRlciAKLQkvLyBzbyB0aGF0IHRoZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgZGF0YSBjYW4gYmUgbG9hZGVkCi0JcHJvY2Vzc1BhZ2U6ICggdHlwZW9mIFByb2Nlc3NFbGVtZW50UGFnZSA9PSAidW5kZWZpbmVkIiApID8gbnVsbCA6IG5ldyBQcm9jZXNzRWxlbWVudFBhZ2UoKSwKLQkKLQkvLyBkZWZpbmUgc2VjdGlvbgotCXNlY3Rpb246IG5ldyBDb250ZW50UGFnZVNlY3Rpb24oKSwKLQkKLQkvLyBkZWZpbmUgc3ViLXNlY3Rpb24KLQlzdWJTZWN0aW9uOiBudWxsLAotCQotCXRvb2xiYXI6IG51bGwsCi0JCi0JLy8gYXV0byB3cmFwIGVsZW1lbnRzCi0JYXV0b1dyYXBFbGVtZW50czogW10sCi0JCi0JLy8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdGhlIHBhZ2UgaXMgbG9hZGVkCi0JLy8gdGhpcyBpcyB1c2VkIHRvIGluaXRpYWxpemUgc29tZSBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgcGFnZSBjb250ZW50IGlzIHByb2Nlc3NlZAotCS8vIGZvciBleGFtcGxlLCBpZiB0aGUgY29udGVudCBuZWVkcyB0byB1c2Ugc29tZSBwYXJhbWV0ZXJzIGluc2lkZSB0aGUgY29udGVudAotCS8vIHRoaXMgYXBwcm9hY2ggaXMgbm90IHJlY29tbWVudGVkIGJ1dCBrZWVwIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQlwcmVsb2FkOiBmdW5jdGlvbihpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgaGFzU3ViU2VjdGlvbiwgaXNQcm9jZXNzUGFnZSwgaGFzVHJlZSkgewotCi0JCXRoaXMuaXNQcm9jZXNzUGFnZSA9IGlzUHJvY2Vzc1BhZ2UgfHwgaGFzVHJlZTsKLQkJdGhpcy5pbWdQYXRoID0gaW1nUGF0aDsKLQkJdGhpcy5iYWNrUGF0aCA9IGJhY2tQYXRoOwotCQl0aGlzLm5vZGVJbmZvID0gbm9kZUluZm87Ci0JCXRoaXMuZGVmYXVsdFF1ZXJ5U3RyID0gZGVmYXVsdFF1ZXJ5U3RyOwotCQl0aGlzLnF1ZXJ5U3RyID0gbG9jYXRpb24uc2VhcmNoOwotCQkKLQkJLy8gY29udmVydCB0aGUgaW1hZ2UgcGF0aCB0byBhYnNvbHV0ZSBwYXRoCi0JCS8vIG90aGVyd2lzZSB0aGUgcGFnZSB3aWxsIHJlc29sdmUgdG8gd3JvbmcgYWJzb2x1dGUgcGF0aCBpZiB0aGUgYnJvd3NlciBjYXNoZWQgdGhlIHBhZ2VzCi0JCXZhciBiYXNlID0gd2luZG93LmxvY2F0aW9uLmhyZWY7Ci0JCXZhciBpID0gYmFzZS5sYXN0SW5kZXhPZigiLyIpOwotCQl0aGlzLmltZ1BhdGggPSBiYXNlLnN1YnN0cmluZygwLCBpKzEpICsgdGhpcy5pbWdQYXRoOwotCQkvL2FsZXJ0KHRoaXMuaW1nUGF0aCk7Ci0KLQotCQlpZiAoIHRoaXMucXVlcnlTdHIgPT0gbnVsbCB8fCB0aGlzLnF1ZXJ5U3RyID09ICIiICkKLQkJewotCQkJdGhpcy5xdWVyeVN0ciA9IHRoaXMuZGVmYXVsdFF1ZXJ5U3RyOwotCQl9Ci0JCQkJCi0JCXRoaXMuc2VjdGlvbi5pbml0KHRoaXMuaW1nUGF0aCk7Ci0JCQkJCi0JCWlmICggaGFzU3ViU2VjdGlvbiApIHsKLQkJCXRoaXMuc3ViU2VjdGlvbiA9IG5ldyBDb250ZW50UGFnZVN1YlNlY3Rpb24oKTsKLQkJfQotCQkKLQkJaWYgKCB0aGlzLnByb2Nlc3NQYWdlICYmIChpc1Byb2Nlc3NQYWdlIHx8IGhhc1RyZWUpICkgewotCQkJdGhpcy5wcm9jZXNzUGFnZS5pbml0KGhhc1RyZWUpOwotCQl9Ci0JCQkJCi0JfSwKLQkKLQkKLQkvLyBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gcGFnZSBpcyBsb2FkZWQKLQlvbmxvYWQ6IGZ1bmN0aW9uKCkgewotCQl0aGlzLnNlY3Rpb24uY3JlYXRlU2VjdGlvbkxpbmtzKCdkaXYnLCAnc2VjdGlvbkhlYWRpbmcnLCB0aGlzLmltZ1BhdGgpOwotCQlpZiAoIHRoaXMuc3ViU2VjdGlvbiAhPSBudWxsICkgewotCQkJdGhpcy5zdWJTZWN0aW9uLmNyZWF0ZVN0ZXBMaW5rcygnZGl2JywgJ3N0ZXBIZWFkaW5nJyk7Ci0JCX0KLQkJCQotCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCXZhciBhcHAgPSB0aGlzLmdldEFwcCgpOwotCQkKLQkJaWYgKCBhcHAgIT0gbnVsbCApIHsKLQkJCXRoaXMudG9vbGJhciA9IG5ldyBDb250ZW50UGFnZVRvb2xiYXIoKTsKLQkJCXRoaXMudG9vbGJhci5pbml0KHRoaXMuaW1nUGF0aCk7Ci0JCX0JCQotCQkKLQkJLy8gcmVnaXN0ZXIgYXV0byB3cmFwIGVsZW1lbnQKLQkJaWYgKCB0aGlzLmF1dG9XcmFwRWxlbWVudHMubGVuZ3RoID4gMCApIHsKLQkJCXdpbmRvdy5vbnJlc2l6ZSA9IGZ1bmN0aW9uKGUpIHsKLQkJCQljb250ZW50UGFnZS5yZXNpemVCbG9ja1RleHQoKTsKLQkJCX0JCQotCQkJdGhpcy5yZXNpemVCbG9ja1RleHQoKTsKLQkJfQotCQkKLQkJLy9hbGVydCgiY29udGVudCBvbiBsb2FkOiAiICsgbG9jYXRpb24uaHJlZik7Ci0JCQotCQlpZiAoIHRoaXMucHJvY2Vzc1BhZ2UgKSB7Ci0JCQl0aGlzLnByb2Nlc3NQYWdlLm9ubG9hZCgpOwotCQl9IAotCQkKLQkJaWYgKCBhcHAgIT0gbnVsbCApIHsKLQkJCWlmICggIWFwcC5pc0luaXRpYWxpemVkKCkgKSB7Ci0JCQkJdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7Ci0JCQkJLy9hbGVydCgiY29udGVudCBvbiBsb2FkOiBpbiBjYWxsYmFjayIpOwotCQkJCQlhcHAub25Db250ZW50TG9hZGVkKGxvY2F0aW9uLmhyZWYpOwotCQkJCQlzZWxmLmJ1aWxkQnJlYWRjcnVtbnMoKTsKLQkJCQl9OwotCQkJCWFwcC5hZGRQb3N0SW5pdENhbGxiYWNrKGNhbGxiYWNrKTsKLQkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJLy9hbGVydCgiY29udGVudCBvbiBsb2FkOiBjYWxsaW5nIGJyZWFkQnJlYWRjcnVtYnMiKTsJCi0JCQkJYXBwLm9uQ29udGVudExvYWRlZChsb2NhdGlvbi5ocmVmKTsKLQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgc2VsZi5idWlsZEJyZWFkY3J1bW5zKCk7IH0sIDEwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuYnVpbGRCcmVhZGNydW1ucygpOwotCQl9Ci0JCQotCQkvL2FsZXJ0KCJjb250ZW50IHBhZ2UgbG9hZGVkIik7Ci0JCQotCQkvLyB1c2VyIGNhbiBhZGQgY3VzdG9taXphdGlvbiBjb2RlIGhlcmUKLQkJLy8gdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQKLQkJLy8gdGhpcyBpcyBlcXVpdmFsZW50IHRvIGluc2VydGluZyBqYXZhc2NyaXB0IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgPC9odG1sPiB0YWcKLQkJCi0JfSwKLQkKLQlidWlsZEJyZWFkY3J1bW5zIDogZnVuY3Rpb24oKSB7Ci0JCWlmICggdGhpcy5wcm9jZXNzUGFnZSApIHsKLQkJCXRoaXMucHJvY2Vzc1BhZ2UuYnVpbGRQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIobG9jYXRpb24uaHJlZik7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLl9idWlsZEJyZWFkY3J1bW5zKGxvY2F0aW9uLmhyZWYpOwotCQl9IAotCX0sCi0JCi0JcmVzaXplQmxvY2tUZXh0OiBmdW5jdGlvbigpIHsKLQkJdmFyIG5ld1dpZHRoID0gd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggLSAyMDsKLQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5hdXRvV3JhcEVsZW1lbnRzLmxlbmd0aDsgaSsrICkgewotCQkJdmFyIGVsZW0gPSB0aGlzLmF1dG9XcmFwRWxlbWVudHNbaV07Ci0JCQllbGVtLnN0eWxlLndpZHRoPW5ld1dpZHRoICsgInB4IjsgLy8gZmlyZWZveCBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgdW5pdAotCQl9Ci0JfSwKLQkKLQkKLQlhZGRBdXRvV3JhcEVsZW1lbnQ6IGZ1bmN0aW9uKGVsZW0pIHsKLQkJdGhpcy5hdXRvV3JhcEVsZW1lbnRzLnB1c2goZWxlbSk7Ci0JfSwKLQkKLQkvLyB1dGlsaXR5IG1ldGhvZHMKLQlnZXRVcmxQYXJhbWV0ZXJzOiBmdW5jdGlvbihxdWVyeVN0cikKLQl7Ci0JCXZhciBhcnIgPSBuZXcgQXJyYXkoKTsJCi0JCXZhciBwYWlycyA9IHF1ZXJ5U3RyLnNwbGl0KCImIik7Ci0JICAgCWZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHsKLQkgICAgIAkJdmFyIHBvcyA9IHBhaXJzW2ldLmluZGV4T2YoJz0nKTsKLQkgICAgIAkJaWYgKHBvcyA9PSAtMSkgY29udGludWU7Ci0JICAgICAJCXZhciBhcmduYW1lID0gcGFpcnNbaV0uc3Vic3RyaW5nKDAscG9zKTsKLQkgICAgIAkJdmFyIHZhbHVlID0gcGFpcnNbaV0uc3Vic3RyaW5nKHBvcysxKTsgICAgCQotCSAgICAgCQlhcnJbYXJnbmFtZV0gPSB2YWx1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGFycjsKLQl9LAotCi0JZ2V0QXBwIDogZnVuY3Rpb24oKSB7Ci0JCWlmKCB0eXBlb2YgdGhlQXBwICE9ICJ1bmRlZmluZWQiKSB7Ci0JCQlyZXR1cm4gdGhlQXBwOwotCQl9IGVsc2UgaWYgKCB3aW5kb3cucGFyZW50ICYmIHR5cGVvZiB3aW5kb3cucGFyZW50LnRoZUFwcCAhPSAidW5kZWZpbmVkIikgewotCQkJcmV0dXJuIHdpbmRvdy5wYXJlbnQudGhlQXBwOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0sCi0JCi0JZ2V0Vmlld0ZyYW1lOiBmdW5jdGlvbigpIHsKLQkKLQkJdmFyIGFwcCA9IHRoaXMuZ2V0QXBwKCk7Ci0JCWlmICggYXBwICE9IG51bGwgKSB7Ci0JCQotCQkJLy8gbWFrZSBzdXJlIHRoZSBhcHAgaXMgaW5pdGlhbGl6ZWQKLQkJCWlmICggYXBwLmlzSW5pdGlhbGl6ZWQoKSApIHsKLQkJCQlyZXR1cm4gYXBwLm5hdjsKLQkJCX0gZWxzZSB7IAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQkJCi0JCXZhciB2aWV3RnJhbWUgPSBudWxsOwotCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB3aW5kb3cucGFyZW50LmZyYW1lcy5sZW5ndGg7IGkrKyApIHsKLQkJCWlmICggd2luZG93LnBhcmVudC5mcmFtZXNbaV0ubmFtZSA9PSAnb3J5X3RvY19mcmFtZScgKSB7Ci0JCQkJdmFyIHRvY0ZyYW1lID0gd2luZG93LnBhcmVudC5mcmFtZXNbaV07Ci0JCQkJLy9hbGVydCh0b2NGcmFtZSk7Ci0JCQkJaWYgKHRvY0ZyYW1lLmZyYW1lcy5sZW5ndGggPiAwICkgewotCQkJCQlmb3IgKCB2YXIgeCA9IDA7IHggPCB0b2NGcmFtZS5mcmFtZXMubGVuZ3RoOyB4KysgKSB7Ci0JCQkJCQlpZiAodG9jRnJhbWUuZnJhbWVzW3hdLm5hbWUgPT0gJ29yeV90b2MnICkgewotCQkJCQkJCXZpZXdGcmFtZSA9IHRvY0ZyYW1lLmZyYW1lc1t4XTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gdmlld0ZyYW1lOwotCX0sCi0KLQlfYnVpbGRCcmVhZGNydW1uczogZnVuY3Rpb24odXJsKSB7Ci0JCXZhciB2aWV3RnJhbWUgPSB0aGlzLmdldFZpZXdGcmFtZSgpOwotCQlpZiAoIHZpZXdGcmFtZSA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJicmVhZGNydW1icyIpOwotCQlpZiAoZGl2ICE9IG51bGwgJiYgdmlld0ZyYW1lICE9IG51bGwgJiYgdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzICkgewotCQkJaWYgKCB0aGlzLmdldEFwcCgpID09IG51bGwgKSB7Ci0JCQkJLy8gZG9uJ3QgYnJlYWsgb2xkIGNvZGUKLQkJCQl2YXIgYmNzID0gdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzKHVybCk7Ci0JCQkJaWYgKCBiY3MgIT0gbnVsbCAmJiBiY3MubGVuZ3RoID4gMCApIHsKLQkJCQkJdGhpcy5zaG93QnJlYWRjcnVtbnMoZGl2LCBiY3MpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFyIHNlbGYgPSB0aGlzOwotCQkJCXZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGJjcykgewotCQkJCQlpZiAoIGJjcyAhPSBudWxsICYmIGJjcy5sZW5ndGggPiAwICkgewotCQkJCQkJc2VsZi5zaG93QnJlYWRjcnVtbnMoZGl2LCBiY3MpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQkJCi0JCQkJaWYgKGNvbnRlbnRQYWdlLm5vZGVJbmZvICE9IG51bGwgJiYgY29udGVudFBhZ2Uubm9kZUluZm8ubGVuZ3RoID4gMCApIHsKLQkJCQkJdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzQnlQYXRoKGNvbnRlbnRQYWdlLm5vZGVJbmZvLCBudWxsLCBjYWxsYmFjayk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkvL3ZpZXdGcmFtZS5nZXRCcmVhZGNydW1icyh1cmwsIGNhbGxiYWNrKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJfQotCQotCX0sCi0KLQotCXNob3dCcmVhZGNydW1uczogZnVuY3Rpb24oZGl2LCAvKmFycmF5Ki9iY3MpIHsKLQkJaWYgKGRpdiA9PSBudWxsIHx8IGJjcyA9PSBudWxsIHx8IGJjcy5sZW5ndGggPT0gMCAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXZhciBodG1sID0gW107Ci0JCXZhciBzbGVuID0gMDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBiY3MubGVuZ3RoOyBpKysgKSB7Ci0JCQl2YXIgYmMgPSBiY3NbaV07IC8vIHt1cmw6dXJsLCB0aXRsZTp0aXRsZX0KLQkJCWlmICggaSA+IDAgKSB7Ci0JCQkJaHRtbFtzbGVuKytdID0gIjxzcGFuPiZuYnNwOz4mbmJzcDs8L3NwYW4+IjsKLQkJCX0KLQotCQkJLy8gZXNjYXBlIHRoZSBxdW90ZXMKLQkJCXZhciB1cmwgPSBiYy51cmw7Ci0JCQl1cmwgPSB1cmwucmVwbGFjZSgvJy9nLCAiXFwnIik7Ci0JCQl1cmwgPSB1cmwucmVwbGFjZSgvXCIvZywgIlxcXCIiKTsKLQotCQkJaHRtbCA9IGh0bWwuY29uY2F0KFsiPGEgaHJlZj1cIiIsIHVybCwgIlwiPiIsIGJjLnRpdGxlLCAiPC9hPiJdKSA7Ci0JCQlzbGVuID0gaHRtbC5sZW5ndGg7Ci0JCX0KLQotCQl2YXIgc3RyID0gWyI8dGFibGUgYm9yZGVyPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGNlbGxzcGFjaW5nPVwiMFwiIHdpZHRoPVwiMTAwJVwiPiIsCi0JCQkiPHRyPjx0ZCBhbGlnbj1cImxlZnRcIj4iXTsKLQkJc3RyID0gc3RyLmNvbmNhdChodG1sKTsKLQkJc3RyID0gc3RyLmNvbmNhdChbIjwvdGQ+PHRyPiIsICI8L3RhYmxlPiJdKTsKLQkJZGl2LmlubmVySFRNTCA9IHN0ci5qb2luKCIiKTsKLQl9LAotCQotCQotCXJlc29sdmVVcmw6IGZ1bmN0aW9uKHVybCkgewotCi0JCS8vIG5vdGU6IGRvbid0IGNhbGwgdGhlIGFwcC5yZXNvbHZlQ29udGVudHVybCgpIHNpbmNlIHRoZSBjb250ZW50IHVybCBtaWdodCBub3QgYmUgc2V0IHlldAotCQkvLyB1c2UgdGhlIHdpbmRvdydzIHVybCBkaXJlY3RseQotCQlpZiAoIHVybC5pbmRleE9mKCIuLyIpID09IDAgKSB7CQkJCi0JCQkJdmFyIGJhc2UgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKLQkJCQkvL2FsZXJ0KCJiYXNlOiIgKyBiYXNlKTsKLQkJCQl2YXIgaSA9IGJhc2UubGFzdEluZGV4T2YoIi8iKTsKLQkJCQl1cmwgPSBiYXNlLnN1YnN0cmluZygwLCBpKSArIHVybC5zdWJzdHJpbmcoMSk7Ci0JCX0gCi0JCQotCQlyZXR1cm4gdXJsOwotCX0sCi0JCi0JLyogZ2V0IHRoZSBwYWdlIGd1aWQsIGl0J3MgdGhlIGd1aWQgb2YgdGhlIGVsZW1lbnQgb3IgcGFnZSovCi0JZ2V0UGFnZUlkIDogZnVuY3Rpb24oKSB7Ci0JCXZhciBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhZ2UtZ3VpZCIpOwotCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCXJldHVybiBlLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfSwKLQkKLQlzYXZlQXNCb29rbWFyazogZnVuY3Rpb24oKSB7Ci0JCi0gICAgICAgICAvLyBmb3IgSUUsIGRvZXMgbm90IHdvcmsgZm9yIGxvY2FsIGZpbGUgYnJvd3NpbmcKLSAgICAgICAgIC8vIG9ubHkgb24gc2VydmVyCi0KLQkJLy92YXIgYXBwID0gdGhpcy5nZXRBcHAoKTsKLQkJdmFyIHVybCA9IGxvY2F0aW9uLmhyZWY7Ci0JCXZhciB0aXRsZSA9IGRvY3VtZW50LnRpdGxlOwkJCQotIAkJaWYgKHdpbmRvdy5zaWRlYmFyKSB7IAotICAgICAgICAgICAgLy8gZm9yIE1vemlsbGEgRmlyZWZveAotICAgICAgICAgICAgd2luZG93LnNpZGViYXIuYWRkUGFuZWwodGl0bGUsIHVybCwgIiIpOwotICAgICAgICB9IGVsc2UgaWYoIHdpbmRvdy5leHRlcm5hbCApIHsgCi0gICAgICAgICAgICB3aW5kb3cuZXh0ZXJuYWwuQWRkRmF2b3JpdGUodXJsLCB0aXRsZSk7Ci0gICAgICAgIH0gZWxzZSBpZih3aW5kb3cub3BlcmEgJiYgd2luZG93LnByaW50KSB7IAotICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotIAl9LAotCQotCWlzRmlsZVVybDogZnVuY3Rpb24odXJsKSB7Ci0JCXJldHVybiAodXJsICE9IG51bGwpICYmICh1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJmaWxlOi8vIikgPT0gMCk7Ci0JfQotCS8vIGhlbHBlciBtZXRob2RzCi0KLX07CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZmZiNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBwcm9jZXNzIGxheW91dCByZWxhdGVkIGRhdGEgZnJvbSBSTUMgcHVibGlzaGluZyBzZXJ2aWNlIApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViNjZkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBxdWVyeVN0ciA9IGxvY2F0aW9uLnNlYXJjaDsKLQkJCQkJZG9jdW1lbnQud3JpdGUoIiZsdDttZXRhIGh0dHAtZXF1aXY9XCJyZWZyZXNoXCIgY29udGVudD1cIjA7dXJsPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGVmYXVsdFRhYlVybCIvPiIgKyBxdWVyeVN0ciArICJcIiZndDsiKTsKLQkJCQk8L3NjcmlwdD4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQk8L2hlYWQ+CQkJCi0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfZGVzYy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2Rlc2MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzU3YjFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfZGVzYy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJhY3Rpdml0eV9oZWxwZXIueHNsIi8+CQotCTx4c2w6aW5jbHVkZSBocmVmPSJwcm9wZXJ0eS54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiLz4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJnZW5lcmFsVGV4dEZpZWxkU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRzY29wZVRleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nc2NvcGUnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHB1cnBvc2VUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3B1cnBvc2UnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRGVsaXZlcnlQcm9jZXNzJyAiPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvamVjdFNwZWNpZmljc1NlY3Rpb24iPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkc3RhZmZpbmdUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2hvd3RvU3RhZmYnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGtleUNvbnNpZGVyYXRpb25zVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdrZXlDb25zaWRlcmF0aW9ucyddIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkYWx0ZXJuYXRpdmVzVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhbHRlcm5hdGl2ZXMnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIHdpZHRoPSIxMCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1hX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtaV9pLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9UQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nVEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YnNUZXh0Ii8+Ci0JCQkJCQk8L3NwYW4+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dQQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nV1BCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3Bic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfZW5kLWkuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjUwJSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2UuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjb2xzcGFuPSIyIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjEwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IklsbHVzdHJhdGlvbnNTZWN0aW9uIj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2FkbWFwcyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nZXhhbXBsZXMnXS9FbGVtZW50KSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWxsdXN0cmF0aW9uc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRyb2FkbWFwVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9hZG1hcHMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRleGFtcGxlc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2V4YW1wbGVzJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb2plY3RTcGVjaWZpY3NTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndHlwZU9mQ29udHJhY3QnXSAhPSAnJyBvciAkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncHJvamVjdENoYXJhY3RlcmlzdGljcyddICE9ICcnIG9yICRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlJ10gIT0gJycgb3IgJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Jpc2tMZXZlbCddICE9ICcnIG9yICRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdzY2FsZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb2plY3RTcGVjaWZpY3NUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHR5cGVvZkNvbnRyYWN0VGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndHlwZU9mQ29udHJhY3QnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncHJvamVjdE1lbWJlckV4cGVydGlzZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2VzdGltYXRpbmdUZWNobmlxdWUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHJpc2tMZXZlbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Jpc2tMZXZlbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkc2NhbGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdzY2FsZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIG9yICRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZU5vdGVzJ10gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiR1c2FnZU5vdGVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VOb3RlcyddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSd2YWxpZENvbnRleHQnXS9FbGVtZW50KSArIGNvdW50KHJlZmVyZW5jZVtAbmFtZT0nc3VwZXJBY3Rpdml0aWVzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdpbmNsdWRlc1BhdHRlcm5zJ10vRWxlbWVudCkgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J3ZhbGlkQ29udGV4dCddL0VsZW1lbnQpID4gMCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZGNvbnRleHRzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNvbnRleHRUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3ZhbGlkQ29udGV4dCddL0VsZW1lbnQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRjb250ZXh0cyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjb250ZXh0VGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J2RlZmF1bHRDb250ZXh0J10vRWxlbWVudCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHBhcmVudEFjdGl2aXRpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3N1cGVyQWN0aXZpdGllcyddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGluY2x1ZGVkUGF0dGVybnNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdpbmNsdWRlc1BhdHRlcm5zJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiA+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idGl0bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3VtbWFyeSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkZXZlbnREcml2ZW5UZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9uZ29pbmdUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ij4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHByZWRlY2Vzc29yVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcmVwZWF0YWJsZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJmaWVsZExhYmVsIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZmllbGRUZXh0Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJGZpZWxkVGV4dCAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWVsZExhYmVsIi8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGZpZWxkVGV4dCIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbmNlcHRzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdjaGVja2xpc3RzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb21tdW5pY2F0aW9uc01hdGVyaWFscyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nZ3VpZGVsaW5lcyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nc3VwcG9ydGluZ01hdGVyaWFscyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0ncmV1c2FibGVBc3NldHMnXS9FbGVtZW50KSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjaGVja2xpc3RzJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmlmIHRlc3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbW11bmljYXRpb25zTWF0ZXJpYWxzJ10iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjb21tdW5pY2F0aW9uc01hdGVyaWFsc1RleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb21tdW5pY2F0aW9uc01hdGVyaWFscyddL0VsZW1lbnQiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2VkdWNhdGlvbk1hdGVyaWFscyddIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2VkdWNhdGlvbk1hdGVyaWFscyddL0VsZW1lbnQiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdndWlkZWxpbmVzJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZXVzYWJsZUFzc2V0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmV1c2FibGVBc3NldHMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc3VwcG9ydGluZ01hdGVyaWFscyddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZGNvbnRleHRzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJyZWZOYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVmRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9IiRyZWZFbGVtZW50Ij4KLQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlZkVsZW1lbnQpPjAiPgotCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlZk5hbWUiLz4KLQkJCQkJPC90aD4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCTx1bD4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlZkVsZW1lbnQiPgotCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCTwvbGk+Ci0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3VsPgotCQkJCQk8L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3hzbDppZj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2hlbHBlci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2hlbHBlci54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTY5MDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV9oZWxwZXIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQk8eHNsOnBhcmFtIG5hbWU9InVybCIvPgotCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRpYWdyYW0iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaW5nbGUtcXVvdGUiPic8L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzcGVjaWFsLXF1b3RlIj5gPC94c2w6dmFyaWFibGU+Ci0JCTxwLz4KLQkJPGltZyBib3JkZXI9IjAiIGRpYWdyYW1UeXBlPSJ7JGRpYWdyYW0vQG5hbWV9Ij4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj5kaWFncmFtXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlhZ3JhbS9AbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaWFncmFtL21hcC9Ac3JjIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWx0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRkaWFncmFtL0BhbHQsJHNpbmdsZS1xdW90ZSwkc3BlY2lhbC1xdW90ZSkiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkZGlhZ3JhbS9AYWx0LCRzaW5nbGUtcXVvdGUsJHNwZWNpYWwtcXVvdGUpIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idXNlbWFwIj4jPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaWFncmFtL21hcC9AbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJPC9pbWc+Ci0JCTxtYXAgbmFtZT0ieyRkaWFncmFtL21hcC9AbmFtZX0iPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkaWFncmFtL21hcC9hcmVhIj4KLQkJCQk8YXJlYT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBocmVmIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWxQYXRoIj4sPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBndWlkIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYWx0Ii8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbHQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvb3JkcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb29yZHMiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InNoYXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNoYXBlIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvYXJlYT4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L21hcD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfdGJzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfdGJzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhZmEyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3Ricy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJhY3Rpdml0eV9oZWxwZXIueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImVzY2FwZS54c2wiLz4JCi0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGRpdiBhdXRvV3JhcD0idHJ1ZSI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC9kaXY+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGJzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIGNsYXNzPSJ0YWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfRGVzY3JpcHRpb24iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nRGVzY3JpcHRpb24nXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtaV9hLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YnNUZXh0Ii8+Ci0JCQkJCTwvc3Bhbj4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1hX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dQQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nV1BCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3Bic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfZW5kLWkuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjUwJSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZCBjb2xzcGFuPSI0Ij4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgaGVpZ2h0PSIyIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2VfbWlkZGxlLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2UuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjb2xzcGFuPSIzIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjEwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtmbG93U2VjdGlvbiI+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZSddKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVN0cnVjdHVyZVRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHAgYWxpZ249ImxlZnQiPgotCQkJPGRpdiBpZD0idGVhbVRyZWUiID48L2Rpdj4KLQkJCTwvcD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQl2YXIgdGVhbVRyZWUgPSBbCi0JCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlJ10vRWxlbWVudFtAVHlwZT0nVGVhbVByb2ZpbGUnIGFuZCBAaGFzU3VwZXJUZWFtID0gJ2ZhbHNlJyBdIj4KLQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZWFtU3RydWN0dXJlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQldOwotCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmJ1aWxkVGVhbVRyZWUodGVhbVRyZWUpOwotCQkJCQk8L3NjcmlwdD4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGVhbVN0cnVjdHVyZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCVsiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudFtAVHlwZT0nVGVhbVByb2ZpbGUnXSkgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZWxlbWVudC9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZSddIj4KLQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZWFtU3RydWN0dXJlIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JCV0sCi0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRic1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29sU2l6ZSIgc2VsZWN0PSJjb3VudChicmVha2Rvd25bQG5hbWU9J1RlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uKSIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQk8ZGl2IGlkPSJ0cmVlQ29udGVudCI+PC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS5kYXRhID0gewotdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dCIvPiIsIHN1bW1hcnk6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dCIvPiIsIAotY29sdW1uczogWzx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1RlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uIj4KLVsiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+Il08eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgIT0gJGNvbFNpemUiPiw8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+XSwKLXJvd3M6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50Ij4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IjAiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiAnJyAiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotXX07Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iaW5kZW50Ii8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGUiLz4JCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJoYXNDaGlsZHJlbiI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudCkgPiAwIj50cnVlPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT5mYWxzZTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idHlwZU5hbWUiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZSciPgotCQkJCQk8eHNsOmNob29zZT4JCQkJCQkJCQkJCi0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2tEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrVGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdERlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgkJCQkJCQkJCQotCQkJCTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4KLQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOnZhcmlhYmxlPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXNjYXBlZERpc3BsYXlOYW1lIj4KLSAgICAgICAgCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJlc2NhcGUiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNlYXJjaCIgc2VsZWN0PSInJnF1b3Q7JyIvPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXBsYWNlIiBzZWxlY3Q9IicmYW1wO3F1b3Q7JyIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAJPC94c2w6dmFyaWFibGU+Ci0KLXtpZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+IiwgcGFyZW50SWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudE5vZGVJZCIvPiIsIHJlbFBhdGg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+IiwgaXNTdXBwcmVzc2VkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bpc1N1cHJlc3NlZCIvPiIsIGluZGVudFNpemU6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+LCBoYXNDaGlsZHJlbjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhhc0NoaWxkcmVuIi8+LCAKLQlpbmRleDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ASW5kZXgiLz4iLCBwcmVmaXg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPiIsIG5hbWU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE5hbWUiLz4iLCB0aXRsZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4iLCB1cmw6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJGVsZW1lbnQvQFVybCkiLz4iLCAKLQlwcmVkZWNlc3NvcnM6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFByZWRlY2Vzc29ycyIvPiIsIGluZm86ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE1vZGVsSW5mbyIvPiIsIHR5cGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHR5cGVOYW1lIi8+IiwgCi0JcmVwZWF0YWJsZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+IiwgbXVsdGlPY2N1cmVuY2VzOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Iiwgb3B0aW9uYWw6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4iLCBwbGFubmVkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4iLCAgb25nb2luZzogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+IiwgZXZlbnREcml2ZW46ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4iLCAKLQl0ZWFtOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUZWFtIi8+IiwgZW50cnlTdGF0ZTogIiIsIGV4aXRTdGF0ZTogIiIsIGRlbGl2ZXJhYmxlOiAiIiwgdmFyaWFiaWxpdHlUeXBlOiAiIn0sCi0JCi08IS0tCi1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwuaW5pdFJvdygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnROb2RlSWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4sIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4sICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEluZGV4Ii8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ByZWZpeCddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVzY2FwZWREaXNwbGF5TmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJGVsZW1lbnQvQFVybCkiLz4iLCAiIiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVGVhbSIvPiIsICIiLCAiIiwgIiIsICIiLCAiIik7Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwud3JpdGVSb3coKTsJCi0tLT4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L0VsZW1lbnQiPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iJGluZGVudCsxIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93YnMueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93YnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM1NDdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd2JzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImFjdGl2aXR5X2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iQFNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxkaXYgYXV0b1dyYXA9InRydWUiPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvZGl2PgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhY3Rpdml0eVRhYnMiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya2Zsb3dTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQk8dHIgdmFsaWduPSJtaWRkbGUiPgotCQkJCTx0ZCB3aWR0aD0iMTAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfRGVzY3JpcHRpb24iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nRGVzY3JpcHRpb24nXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2EuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdic1RleHQiLz4KLQkJCQkJPC9zcGFuPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtYV9pLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9UQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nVEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YnNUZXh0Ii8+Ci0JCQkJCQk8L3NwYW4+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dQQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nV1BCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3Bic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfZW5kLWkuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjUwJSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZCBjb2xzcGFuPSIyIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2VfbWlkZGxlLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2UuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjb2xzcGFuPSI1Ij4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjEwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtmbG93U2VjdGlvbiI+Ci0JCTx4c2w6aWYgdGVzdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSBvciBkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIG9yIGRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdBY3Rpdml0eSddIG9yIGRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtmbG93VGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J0FjdGl2aXR5J10iPgotCQkJCQkJCTx0cj4KLQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J0FjdGl2aXR5J10iLz4KLQkJCQkJCQkJPC90ZD4KLQkJCQkJCQk8L3RyPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTx4c2w6aWYgdGVzdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSI+Ci0JCQkJCQkJCTx0cj4KLQkJCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCIgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPgotCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5RGlhZ3JhbSI+Ci0JCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkaWFncmFtIiBzZWxlY3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J0FjdGl2aXR5J10iLz4KLQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJPC90cj4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHlEZXRhaWwnXSI+Ci0JCQkJCQkJPHRyPgotCQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHlEZXRhaWwnXSIvPgotCQkJCQkJCQk8L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIj4KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXlEaWFncmFtIj4KLQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRpYWdyYW0iIHNlbGVjdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHlEZXRhaWwnXSIvPgotCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQk8L3RkPgotCQkJCQkJCQk8L3RyPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id2JzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb2xTaXplIiBzZWxlY3Q9ImNvdW50KGJyZWFrZG93bltAbmFtZT0nV29yayBCcmVha2Rvd24gU3RydWN0dXJlJ10vY29sdW1ucy9jb2x1bW4pIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya0JyZWFrZG93blRleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJPGRpdiBpZD0idHJlZUNvbnRlbnQiPjwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUuZGF0YSA9IHsKLXRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrQnJlYWtkb3duVGV4dCIvPiIsIHN1bW1hcnk6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtCcmVha2Rvd25UZXh0Ii8+IiwgCi1jb2x1bW5zOiBbPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nV29yayBCcmVha2Rvd24gU3RydWN0dXJlJ10vY29sdW1ucy9jb2x1bW4iPgotWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz4iXTx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSAkY29sU2l6ZSI+LDwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD5dLAotcm93czogWzx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1dvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnQiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iMCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iICcnICIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci1dfTsKLQkJCQk8L3NjcmlwdD4KLQkKLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8IS0tIHdyaXRlIHRoZSB3YnMgdHIgaHRtbCAtLT4KLQk8IS0tIGluaXQoaWQsIHBhcmVudElkLCByZWxQYXRoLCBpc1N1cHJlc3NlZCwgaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4sIGluZGV4LCBwcmVmaXgsIHRpdGxlLCB1cmwsIHN0ZXBzLCBwcmVkZWNlc3NvcnMsIGluZm8sIHJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIHR5cGUpIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImluZGVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imhhc0NoaWxkcmVuIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPnRydWU8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPmZhbHNlPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0eXBlTmFtZSI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICd0cnVlJyI+Ci0JCQkJCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVRleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+CQkJCQkJCQkJCi0JCQkJPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtb2RlbEluZm8iIHNlbGVjdD0iJGVsZW1lbnQvQE1vZGVsSW5mbyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1vZGVsSW5mb1Jlc3VsdCI+Ci0JCQk8eHNsOmNob29zZT4JCQotCQkJCTx4c2w6d2hlbiB0ZXN0PSJzdGFydHMtd2l0aCgkbW9kZWxJbmZvLCAncmVwbGFjZXMnKSI+CQkKLQkJCQk8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZGVsSW5mbyIvPgotCQkJCTwveHNsOm90aGVyd2lzZT4JCQkKLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+Ci0JCQote2lkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4iLCBwYXJlbnRJZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgcmVsUGF0aDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCBpc1N1cHByZXNzZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgaW5kZW50U2l6ZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4sIGhhc0NoaWxkcmVuOjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4sIAotCWluZGV4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsIHByZWZpeDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ByZWZpeCddIi8+IiwgbmFtZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATmFtZSIvPiIsIHRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsIHVybDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsIAotCXByZWRlY2Vzc29yczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgaW5mbzogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kZWxJbmZvUmVzdWx0Ii8+IiwgdHlwZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZU5hbWUiLz4iLCAKLQlyZXBlYXRhYmxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCBtdWx0aU9jY3VyZW5jZXM6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCBvcHRpb25hbDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsIHBsYW5uZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICBvbmdvaW5nOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCBldmVudERyaXZlbjogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPiIsIAotCXRlYW06ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFRlYW0iLz4iLCBlbnRyeVN0YXRlOiAiIiwgZXhpdFN0YXRlOiAiIiwgZGVsaXZlcmFibGU6ICIiLCB2YXJpYWJpbGl0eVR5cGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPiIsCi0Jc3RlcHM6IFs8eHNsOnZhcmlhYmxlIG5hbWU9InN0ZXBTaXplIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoJGVsZW1lbnQvU3RlcHMvU3RlcCkiLz48L3hzbDp2YXJpYWJsZT4KLQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVsZW1lbnQvU3RlcHMvU3RlcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZWxlY3RlZCIvPgotCTx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSAkc3RlcFNpemUiPiw8L3hzbDppZj48L3hzbDpmb3ItZWFjaD5dfSwKLQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L0VsZW1lbnQiPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iJGluZGVudCsxIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4JCQkJCQotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dwYnMueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93cGJzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNjZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dwYnMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iYWN0aXZpdHlfaGVscGVyLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iQFNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGRpdiBhdXRvV3JhcD0idHJ1ZSI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvZGl2PgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhY3Rpdml0eVRhYnMiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya2Zsb3dTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndwYnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhY3Rpdml0eVRhYnMiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJPHRyIHZhbGlnbj0ibWlkZGxlIj4KLQkJCQk8dGQgd2lkdGg9IjEwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX0Rlc2NyaXB0aW9uIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J0Rlc2NyaXB0aW9uJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtaV9pLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9XQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nV0JTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3YnNUZXh0Ii8+Ci0JCQkJCQk8L3NwYW4+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfVEJTIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1RCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGJzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtaV9hLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cGJzVGV4dCIvPgotCQkJCQk8L3NwYW4+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtYS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjYiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZV9taWRkbGUuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya2Zsb3dTZWN0aW9uIj4KLQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSBvciBkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10gIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPCEtLQotCQkJPHAgYWxpZ249ImNlbnRlciI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIi8+Ci0JCQk8L3A+Ci0KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ3JhbSIgc2VsZWN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJLS0+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4JCQkKLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIj4KLQkJCQkJCQk8dHI+Ci0JCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCIgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSIvPgotCQkJCQkJCQk8L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSI+Ci0JCQkJCQkJCTx0cj4KLQkJCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCIgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPgotCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5RGlhZ3JhbSI+Ci0JCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkaWFncmFtIiBzZWxlY3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIi8+Ci0JCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCTwvdHI+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQk8L3RhYmxlPgkKLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id3Bic1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29sU2l6ZSIgc2VsZWN0PSJjb3VudChicmVha2Rvd25bQG5hbWU9J1dvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlJ10vY29sdW1ucy9jb2x1bW4pIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0Ii8+Ci0JCTwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCTxkaXYgaWQ9InRyZWVDb250ZW50Ij48L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLmRhdGEgPSB7Ci10aXRsZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0Ii8+Iiwgc3VtbWFyeTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0Ii8+IiwgCi1jb2x1bW5zOiBbPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbiI+Ci1bIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYWJlbCIvPiJdPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9ICRjb2xTaXplIj4sPC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPl0sCi1yb3dzOiBbPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50Ij4KLQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iMCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iICcnICIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci1dfTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJpbmRlbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudC9AVHlwZSIvPgkJCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaGFzQ2hpbGRyZW4iPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+dHJ1ZTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+ZmFsc2U8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InR5cGVOYW1lIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ3RydWUnIj4KLQkJCQkJPHhzbDpjaG9vc2U+CQkJCQkJCQkJCQotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrRGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFza1RleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlVGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3REZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdFRleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGVOYW1lIi8+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4JCQkJCQkJCQkKLQkJCQk8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGVOYW1lIi8+Ci0JCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4JCQote2lkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4iLCBwYXJlbnRJZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgcmVsUGF0aDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCBpc1N1cHByZXNzZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgaW5kZW50U2l6ZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4sIGhhc0NoaWxkcmVuOjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4sIAotCWluZGV4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsIHByZWZpeDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ByZWZpeCddIi8+IiwgbmFtZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATmFtZSIvPiIsIHRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsIHVybDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsIAotCXByZWRlY2Vzc29yczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgaW5mbzogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+IiwgdHlwZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZU5hbWUiLz4iLCAKLQlyZXBlYXRhYmxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCBtdWx0aU9jY3VyZW5jZXM6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCBvcHRpb25hbDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsIHBsYW5uZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICBvbmdvaW5nOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCBldmVudERyaXZlbjogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPiIsIAotCXRlYW06ICIiLCBlbnRyeVN0YXRlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BFbnRyeVN0YXRlIi8+IiwgZXhpdFN0YXRlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BFeGl0U3RhdGUiLz4iLCBkZWxpdmVyYWJsZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGVsaXZlcmFibGUiLz4iLCB2YXJpYWJpbGl0eVR5cGU6ICIifSwKLTwhLS0KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC5pbml0Um93KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudE5vZGVJZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ASW5kZXgiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgIiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFByZWRlY2Vzc29ycyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE1vZGVsSW5mbyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHR5cGVOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4iLCAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPiIsICIiLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BFbnRyeVN0YXRlIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARXhpdFN0YXRlIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGVsaXZlcmFibGUiLz4iLCAiIiwgIiIpOwotY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLndyaXRlUm93KCk7CQotLS0+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudCkgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZWxlbWVudC9FbGVtZW50Ij4KLQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IiRpbmRlbnQrMSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIgc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYXJ0aWZhY3QueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWNhMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJ3b3JrcHJvZHVjdC54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFydGlmYWN0RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdBcnRpZmFjdERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGFydGlmYWN0RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGFydGlmYWN0RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhaWxvcmluZ1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGFydGlmYWN0RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmT3V0bGluZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdicmllZk91dGxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlcHJlc2VudGF0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3JlcHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJub3RhdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdub3RhdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGJyaWVmT3V0bGluZSAhPSAnJyBvciAkbWFpbkRlc2NyaXB0aW9uICE9ICcnIG9yICRyZXByZXNlbnRhdGlvbiAhPSAnJyBvciAkbm90YXRpb24gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+CQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGJyaWVmT3V0bGluZSAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRicmllZk91dGxpbmVUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGJyaWVmT3V0bGluZSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRub3RhdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub3RhdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbm90YXRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHJlcHJlc2VudGF0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcHJlc2VudGF0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRyZXByZXNlbnRhdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgkKLQkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0X2Rlc2NyaXB0b3IueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdF9kZXNjcmlwdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzOGQ3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0X2Rlc2NyaXB0b3IueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iZGVzY3JpcHRvci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHVycG9zZS54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0idGFpbG9yaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJ3b3JrcHJvZHVjdF9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nV29ya1Byb2R1Y3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0VHlwZSIgc2VsZWN0PSIkd29ya1Byb2R1Y3QvRWxlbWVudC9AVHlwZU5hbWUiLz4JCQkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4JCQkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3IiIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGUiIHNlbGVjdD0iJHdvcmtQcm9kdWN0VHlwZSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdG9yUmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVsaXZlcmFibGVTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCi0JCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYnJpZWZPdXRsaW5lJ10gIT0nJyAiPgotCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQotCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCi0JCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RJbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhaWxvcmluZ1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJCQljb250ZW50UGFnZS5wcm9jZXNzUGFnZS5maXhEZXNjcmlwdG9yTGlua3MoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgkKLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmT3V0bGluZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdicmllZk91dGxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im5vdGF0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J25vdGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXByZXNlbnRhdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdyZXByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3JlZmluZWREZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGJyaWVmT3V0bGluZSAhPSAnJyBvciAkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgkJCQotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCi0JCQkJCTx4c2w6aWYgdGVzdD0iJGJyaWVmT3V0bGluZSAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRicmllZk91dGxpbmVUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGJyaWVmT3V0bGluZSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbm90YXRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm90YXRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG5vdGF0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRyZXByZXNlbnRhdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXByZXNlbnRhdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVwcmVzZW50YXRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgkKLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJICAgIDx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdhY3Rpdml0eUVudHJ5U3RhdGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkYWN0aXZpdHlFbnRyeVN0YXRlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2FjdGl2aXR5RW50cnlTdGF0ZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2FjdGl2aXR5RXhpdFN0YXRlJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGFjdGl2aXR5RXhpdFN0YXRlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2FjdGl2aXR5RXhpdFN0YXRlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmVkVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHVzYWdlR3VpZGFuY2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZVRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2UiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRvclJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmdWxmaWxsaW5nV29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+PC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZnVsZmlsbGVkU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZnVsZmlsbHMnXS9FbGVtZW50Ij48L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1dvcmtQcm9kdWN0J10vRWxlbWVudFtAVHlwZT0nQXJ0aWZhY3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVsaXZlcmFibGVQYXJ0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbXBhY3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2ltcGFjdHMnXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltcGFjdGVkQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0naW1wYWN0ZWRCeSddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dFRvIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRGcm9tIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvcHRpb25hbElucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1cGVyQWN0aXZpdGllcyddL0VsZW1lbnRbQFR5cGU9J0FjdGl2aXR5J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtlZE9uQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya2VkT25CeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iQFNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nY29udGFpbmVyQXJ0aWZhY3QnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbnRhaW5lZEFydGlmYWN0cyddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvciddIi8+Ci0KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZnVsZmlsbGluZ1dvcmtQcm9kdWN0cykgKyBjb3VudCgkZnVsZmlsbGVkU2xvdHMpICsgY291bnQoJHJlc3BvbnNpYmxlUm9sZSkgKyBjb3VudCgkd29ya2VkT25CeSkgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUbykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvKSArIGNvdW50KCRleHRlcm5hbElucHV0VG8pICsgY291bnQoJG91dHB1dEZyb20pICsgY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzKSArIGNvdW50KCRvdXRwdXRGcm9tVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cykgKyBjb3VudCgkaW1wYWN0cykgKyBjb3VudCgkaW1wYWN0ZWRCeSk+IDAgb3IgKGNvdW50KCRjb250YWluZXJBcnRpZmFjdCkgKyBjb3VudCgkY29udGFpbmVkQXJ0aWZhY3RzKSA+IDAgYW5kICRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZScpIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZScgYW5kIGNvdW50KCRjb250YWluZXJBcnRpZmFjdCkgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRhaW5lckFydGlmYWN0VGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY29udGFpbmVyQXJ0aWZhY3QiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ3RydWUnIGFuZCBjb3VudCgkY29udGFpbmVkQXJ0aWZhY3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGFpbmVkQXJ0aWZhY3RzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY29udGFpbmVkQXJ0aWZhY3RzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+CQkJCQkJCQkJCQkKLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZnVsZmlsbGluZ1dvcmtQcm9kdWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGZpbGxpbmdXb3JrUHJvZHVjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCi0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsZWRTbG90cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGZpbGxlZFNsb3RzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZnVsZmlsbGVkU2xvdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGltcGFjdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXBlbmRlbnRUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRpbXBhY3RzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkaW1wYWN0ZWRCeSkgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltcGFjdGluZ1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGltcGFjdGVkQnkiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlc3BvbnNpYmxlUm9sZSkgKyBjb3VudCgkd29ya2VkT25CeSkgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlc3BvbnNpYmxlUm9sZSkgPiAwIj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJPC94c2w6aWY+CQkJCQkJCQkJCi0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2RpZmllZEJ5VGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrZWRPbkJ5KSA+IDAiPgkJCQkJCQkJCi0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrZWRPbkJ5Ij4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4JCQkJCQkJCQkJCi0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvKSArIGNvdW50KCRvcHRpb25hbElucHV0VG8pICsgY291bnQoJGV4dGVybmFsSW5wdXRUbykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dFRvVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFuZGF0b3J5VGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRUbykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpID4gMCI+Ci0JCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbWFuZGF0b3J5SW5wdXRUbyI+CQkKLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4JCQkJCQkJCQotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCi0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyI+CQkKLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4JCQkJCQkJCQotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4JCQkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjMwJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkb3B0aW9uYWxJbnB1dFRvKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dFRvIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlcm5hbFRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJGV4dGVybmFsSW5wdXRUbykgPiAwIj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGV4dGVybmFsSW5wdXRUbyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4JCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbSkgICsgY291bnQoJG91dHB1dEZyb21UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzKT4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRGcm9tVGV4dCIvPjwvdGg+CQkJCQkJCQotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbSkgPiAwIj4JCQkJCQkJCQkKLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvdXRwdXRGcm9tIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG91dHB1dEZyb21UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG91dHB1dEZyb21UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+CQkJCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVsaXZlcmFibGVTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nZXh0ZXJuYWxEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2RlbGl2ZXJhYmxlUGFydHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncGFja2FnaW5nR3VpZGFuY2UnXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSAnJyBvciBjb3VudCgkZGVsaXZlcmVkV29ya1Byb2R1Y3RzKSA+IDAgb3IgJHBhY2thZ2luZ0d1aWRhbmNlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGV4dGVybmFsRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRlbGl2ZXJlZFdvcmtQcm9kdWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlbGl2ZXJlZFBhcnRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGVsaXZlcmVkV29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRwYWNrYWdpbmdHdWlkYW5jZSAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdpbmdJbnN0cnVjdGlvbnNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHBhY2thZ2luZ0d1aWRhbmNlIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jaGVja2xpc3QueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jaGVja2xpc3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzFmNTg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY2hlY2tsaXN0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4JCQotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCi0gICAgCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQkKLQkJCQkJLy9vdmVycmlkZSB0aGUgc3Vic2VjdGlvbiB0ZXh0Ci0JCQkJCWNvbnRlbnRQYWdlLnN1YlNlY3Rpb24uZXhwYW5kQWxsVGV4dCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4cGFuZEFsbFRleHQiLz4nOwotCQkJCQljb250ZW50UGFnZS5zdWJTZWN0aW9uLmNvbGxhcHNlQWxsVGV4dCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbGxhcHNlQWxsVGV4dCIvPic7CQkJCQkKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2hlY2tJdGVtc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjaGVja0l0ZW1zU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzZWN0aW9ucyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vcmVmZXJlbmNlTGlzdFtAbmFtZT0nc2VjdGlvbnMnXS9FbGVtZW50W0BUeXBlPSdTZWN0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc2VjdGlvbnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaGVja0l0ZW1zVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzZWN0aW9ucyI+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBIZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSduYW1lJ10iLz48L2Rpdj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcENvbnRlbnQiPgotCQkJCQkJCQkJPHRhYmxlIGNsYXNzPSJzdGVwVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCQkJCQk8dGQ+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdzZWN0aW9uRGVzY3JpcHRpb24nXSIvPgotCQkJCQkJCQkJCQk8L3RkPgotCQkJCQkJCQkJCTwvdHI+Ci0JCQkJCQkJCQk8L3RhYmxlPgotCQkJCQkJCQk8L2Rpdj4JCQkJCQkKLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29tbW9uLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29tbW9uLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1ZWVjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbW1vbi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCTxtZXRhIG5hbWU9InVtYS50eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQk8bWV0YSBuYW1lPSJ1bWEubmFtZSIgY29udGVudD0ieyRlbGVtZW50TmFtZX0iLz4KLQkJPG1ldGEgbmFtZT0idW1hLnByZXNlbnRhdGlvbk5hbWUiIGNvbnRlbnQ9InskZWxlbWVudFByZXNlbnRhdGlvbk5hbWV9Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGUnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyb2xlTWV0YUluZm8iLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2snIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YXNrTWV0YUluZm8iLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0FydGlmYWN0JyBvciAkZWxlbWVudFR5cGUgPSAnRGVsaXZlcmFibGUnIG9yICRlbGVtZW50VHlwZSA9ICdPdXRjb21lJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RNZXRhSW5mbyIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbE1lbnRvciciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRvb2xNZW50b3JNZXRhSW5mbyIvPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RNZXRhSW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZG9tYWlucyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkb21haW5zJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0VHlwZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya1Byb2R1Y3RUeXBlcyddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0VHlwZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGRvbWFpbnMpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRvbWFpbnMiPgotCQkJCTxtZXRhIG5hbWU9InVtYS5jYXRlZ29yeSIgY29udGVudD0iQFR5cGU6QE5hbWU6QERpc3BsYXlOYW1lIi8+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0VHlwZXMpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0VHlwZXMiPgotCQkJCTxtZXRhIG5hbWU9InVtYS5jYXRlZ29yeSIgY29udGVudD0ieyR3b3JrUHJvZHVjdFR5cGVzL0BUeXBlfTp7JHdvcmtQcm9kdWN0VHlwZXMvQE5hbWV9Onskd29ya1Byb2R1Y3RUeXBlcy9ARGlzcGxheU5hbWV9Ii8+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhc2tNZXRhSW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGlzY2lwbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGlzY2lwbGluZXMnXS9FbGVtZW50W0BUeXBlPSdEaXNjaXBsaW5lJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGlzY2lwbGluZXMpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRpc2NpcGxpbmVzIj4KLQkJCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9InskZGlzY2lwbGluZXMvQFR5cGV9OnskZGlzY2lwbGluZXMvQE5hbWV9OnskZGlzY2lwbGluZXMvQERpc3BsYXlOYW1lfSIvPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyb2xlTWV0YUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVTZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvbGVTZXRzJ10vRWxlbWVudFtAVHlwZT0nUm9sZVNldCddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHJvbGVTZXRzL0BOYW1lICE9ICcnIj4KLQkJCTxtZXRhIG5hbWU9InVtYS5jYXRlZ29yeSIgY29udGVudD0ieyRyb2xlU2V0cy9AVHlwZX06eyRyb2xlU2V0cy9ATmFtZX06eyRyb2xlU2V0cy9ARGlzcGxheU5hbWV9Ii8+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0b29sTWVudG9yTWV0YUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2wiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd0b29sJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9IiR0b29sL0BOYW1lICE9ICcnIj4KLQkJCTxtZXRhIG5hbWU9InVtYS5jYXRlZ29yeSIgY29udGVudD0ieyR0b29sL0BUeXBlfTp7JHRvb2wvQE5hbWV9OnskdG9vbC9ARGlzcGxheU5hbWV9Ii8+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJyZWZOYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVmRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9IiRyZWZFbGVtZW50Ij4KLQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlZkVsZW1lbnQpPjAiPgotCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlZk5hbWUiLz4KLQkJCQkJPC90aD4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCTx1bD4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlZkVsZW1lbnQvLi4vKiI+Ci0JCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCTwvbGk+Ci0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3VsPgotCQkJCQk8L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3hzbDppZj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCQk8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudC9AVXJsICE9ICcnICI+Ci0JCQkJPGE+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPgotCQkJCTwvYT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29weXJpZ2h0Ii8+Ci0JCTx0YWJsZSBjbGFzcz0iY29weXJpZ2h0IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJjb3B5cmlnaHQiPgotCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29tcG9zaXRlcm9sZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbXBvc2l0ZXJvbGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTBkMWFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29tcG9zaXRlcm9sZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImNvbW1vbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ib3ZlcnZpZXcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1haW5fZGVzY3JpcHRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwcm9wZXJ0eS54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdEZXNjcmlwdG9yRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQotCQk8aHRtbD4JCi0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+CQotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2FnZ3JlZ2F0ZWRSb2xlcyddL0VsZW1lbnQiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Jlc3BvbnNpYmxlRm9yJ10vRWxlbWVudCIvPgkJCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhZ2dyZWdhdGVkUm9sZXMpICsgY291bnQoJHJlc3BvbnNpYmxlRm9yKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhZ2dyZWdhdGVkUm9sZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZ2dyZWdhdGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYWdncmVnYXRlZFJvbGVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXNwb25zaWJsZUZvcikgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlRm9yVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVzcG9uc2libGVGb3IiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSInVXNhZ2UgR3VpZGFuY2UnIi8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb250ZW50Y2F0ZWdvcnkueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb250ZW50Y2F0ZWdvcnkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2IwMWExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29udGVudGNhdGVnb3J5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaWxsdXN0cmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJOYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lX3RlbXAiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlc2VudGF0aW9uTmFtZSddIiAvPgotICAgIAk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IiRwcmVzZW50YXRpb25OYW1lX3RlbXAgIT0gJycgIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZXNlbnRhdGlvbk5hbWVfdGVtcCIvPjwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiROYW1lIi8+PC94c2w6b3RoZXJ3aXNlPgkJCQkKLQkJCTwveHNsOmNob29zZT4KLSAgICAJPC94c2w6dmFyaWFibGU+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYnJpZWZEZXNjcmlwdGlvbiddIi8+CSAgICAKLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIj4JCQkJCi0JCQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz48L3RpdGxlPgotCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPiAKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgIT0gJ0N1c3RvbUNhdGVnb3J5JyI+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJpZWZEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdjb25jZXB0c0FuZFBhcGVycyddIi8+Ci0KLQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyI+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz48L2Rpdj4KLQkJCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGFibGU+Ci0JCQkJCTwvZGl2PgotCQkJCTwveHNsOmlmPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEaXNjaXBsaW5lJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvd0Rpc2NpcGxlIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEaXNjaXBsaW5lR3JvdXBpbmcnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93RGlzY2lwbGVHcm91cGluZyIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRG9tYWluJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvd0RvbWFpbiIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3RUeXBlJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvd1dvcmtQcm9kdWN0VHlwZSIvPgotCQk8L3hzbDppZj4JCQotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlU2V0R3JvdXBpbmcnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93Um9sZVNldEdyb3VwaW5nIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlU2V0JyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvd1JvbGVTZXQiLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2wnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93VG9vbCIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93Q3VzdG9tQ2F0ZWdvcnkiLz4KLQkJPC94c2w6aWY+CQkKLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd0Rpc2NpcGxlIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVmZXJlbmNlV29ya2Zsb3dzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRhc2tzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Rhc2tzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1YmRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1YmRpc2NpcGxpbmUnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZWZlcmVuY2VXb3JrZmxvd3MpICsgY291bnQoJHRhc2tzKSArIGNvdW50KCRzdWJkaXNjaXBsaW5lcyk+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlZmVyZW5jZVdvcmtmbG93cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlZmVyZW5jZVdvcmtmbG93c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVmZXJlbmNlV29ya2Zsb3dzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0YXNrcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0YXNrcyI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3ViZGlzY2lwbGluZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdWJkaXNjaXBsaW5lc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc3ViZGlzY2lwbGluZXMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkJCQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93RGlzY2lwbGVHcm91cGluZyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGlzY2lwbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGlzY2lwbGluZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkaXNjaXBsaW5lcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpc2NpcGxpbmVzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkaXNjaXBsaW5lcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93RG9tYWluIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWJkb21haW5zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1YmRvbWFpbnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3dvcmtQcm9kdWN0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+CQkJCQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1YmRvbWFpbnMpICsgY291bnQoJHdvcmtQcm9kdWN0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJkb21haW5zKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3ViZG9tYWluc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc3ViZG9tYWlucyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkJCQkJCQkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd1dvcmtQcm9kdWN0VHlwZSI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3dvcmtQcm9kdWN0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd1JvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZVNldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZVNldHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyb2xlU2V0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldHNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJvbGVTZXRzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dSb2xlU2V0Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2xlcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJvbGVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcm9sZXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd1Rvb2wiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Rvb2xNZW50b3JzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbE1lbnRvcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xNZW50b3JzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0b29sTWVudG9ycyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93Q3VzdG9tQ2F0ZWdvcnkiPgotICAJCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjYXRlZ29yaXplZEVsZW1lbnRzJ10vRWxlbWVudCIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudCgkY2F0ZWdvcml6ZWRFbGVtZW50cykgPiAwIj4KLSAgICAgICAgCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0gICAgICAgICAgICAJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICAgICAgICAgCQk8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgICAgICAgIAkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRlbnRzVGV4dCIvPjwvdGg+Ci0gICAgICAgICAgICAgICAgICAgCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotICAgICAgICAgICAgICAgICAgICAgICAJCTx1bD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjYXRlZ29yaXplZEVsZW1lbnRzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8bGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJPGE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2xpPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L3VsPgotICAgICAgICAgICAgICAgICAgICAgCTwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgCTwvdHI+Ci0gICAgICAgICAgICAJPC90YWJsZT4KLSAgICAgICAgIAk8L2Rpdj4KLSAgICAJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2RlbGl2ZXJhYmxlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVsaXZlcmFibGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdmMGE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVsaXZlcmFibGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0id29ya3Byb2R1Y3QueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1haW5fZGVzY3JpcHRpb24ueHNsIi8+CQotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdEZWxpdmVyYWJsZURlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPiAKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8IS0tIDxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4gLS0+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RJbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWlsb3JpbmdTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVsaXZlcmFibGVTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nZXh0ZXJuYWxEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2RlbGl2ZXJlZFdvcmtQcm9kdWN0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwYWNrYWdpbmdHdWlkYW5jZSddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uICE9ICcnIG9yIGNvdW50KCRkZWxpdmVyZWRXb3JrUHJvZHVjdHMpID4gMCBvciAkcGFja2FnaW5nR3VpZGFuY2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGVsaXZlcmVkV29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmVkUGFydHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkZWxpdmVyZWRXb3JrUHJvZHVjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHBhY2thZ2luZ0d1aWRhbmNlICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcGFja2FnaW5nR3VpZGFuY2UiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWNkN2QwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwcm9wZXJ0eS54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVmaW5lZERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkcmVmaW5lZERlc2NyaXB0aW9uICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+CQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZXNjcmlwdG9yX2hlbHBlci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3JfaGVscGVyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzNTRiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3JfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRGVzY3JpcHRvcnMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0b3JzIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29sc3BhbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+CQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGVzY3JpcHRvcnMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvY2Vzc1VzYWdlVGV4dCIvPgkJCQotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29sc3BhbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xzcGFuIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRlc2NyaXB0b3JzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkVsZW1lbnRbMV0vQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8IS0tIGFkZCB0aGUgcGFyZW50IGxpbmsgLS0+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJFbGVtZW50Ij4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCSYjMTYwOyZndDsmIzE2MDsKLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9IkVudHJ5VmFsdWUiIHNlbGVjdD0iYXR0cmlidXRlL0BhY3Rpdml0eUVudHJ5U3RhdGUiLz4KLQkJCQkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJFeGl0VmFsdWUiIHNlbGVjdD0iYXR0cmlidXRlL0BhY3Rpdml0eUV4aXRTdGF0ZSIvPgkJCQkJCQkJCQkJCQkJCQkgCi0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iJEVudHJ5VmFsdWUgIT0gJyciPgotCQkJCQkJCQkJWzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkRW50cnlWYWx1ZSIvPl0JCi0JCQkJCQkJCTwveHNsOmlmPgkJCQkJCQkJCi0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iJEV4aXRWYWx1ZSAhPSAnJyI+Ci0JCQkJCQkJCQlbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRFeGl0VmFsdWUiLz5dCi0JCQkJCQkJCTwveHNsOmlmPgkJCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9lc2NhcGUueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9lc2NhcGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGNhMTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZXNjYXBlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZXNjYXBlIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzdHJpbmciLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2giLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJyZXBsYWNlIi8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCRzdHJpbmcsICRzZWFyY2gpIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KHN1YnN0cmluZy1iZWZvcmUoJHN0cmluZywgJHNlYXJjaCksICRyZXBsYWNlKSIvPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJlc2NhcGUiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nLCAkc2VhcmNoKSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2VhcmNoIiBzZWxlY3Q9IiRzZWFyY2giLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2UiIHNlbGVjdD0iJHJlcGxhY2UiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RyaW5nIi8+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZ3VpZGFuY2UueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4M2MwODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImNvbW1vbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFwcGluZy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ib3ZlcnZpZXcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1haW5fZGVzY3JpcHRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Rvb2wnXS9FbGVtZW50W0BUeXBlPSdUb29sJ10iLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJCTxtZXRhIG5hbWU9InRvb2wiIGNvbnRlbnQ9InskdG9vbC9ARGlzcGxheU5hbWV9Ii8+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZlcmVuY2VMaXN0IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RWxlbWVudHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nY29udGVudEVsZW1lbnRzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY29udGVudEVsZW1lbnRzKSArIGNvdW50KCRjYXRlZ29yaWVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHJlbGF0ZWRFbGVtZW50c1RleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNvbnRlbnRFbGVtZW50cyIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8IS0tIHVzZSB0aGUgc3BlY2lmaWMgbmFtZWQgbGlzdCwgIG90aGVyd2lzZSwgdGhlIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCB3aWxsIGJlIGluY2x1ZGVkLCBidWcgMTYzODg1IC0tPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2NoZWNrbGlzdHMnXS9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdjb25jZXB0c0FuZFBhcGVycyddL0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2d1aWRlbGluZXMnXS9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J3N1cHBvcnRpbmdNYXRlcmlhbHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSAhPSdjb250ZW50RWxlbWVudHMnXS9FbGVtZW50W0BUeXBlPSdUb29sTWVudG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nY29uY2VwdHNBbmRQYXBlcnMnXS9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nZXhhbXBsZXMnXS9FbGVtZW50W0BUeXBlPSdFeGFtcGxlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nYXNzZXRzJ10vRWxlbWVudFtAVHlwZT0nUmV1c2FibGVBc3NldCddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpICsgY291bnQoJHJldXNhYmxlQXNzZXRzKSArIGNvdW50KCRleGFtcGxlcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSIkZXhhbXBsZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSIkcmV1c2FibGVBc3NldHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV9oZWxwZXIueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV9oZWxwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDYzOTQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZ3VpZGFuY2VfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaGVja2xpc3RzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbmNlcHRzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbmNlcHRzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbmNlcHRzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb25jZXB0cyI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJleGFtcGxlcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRleGFtcGxlcykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleGFtcGxlc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXhhbXBsZXMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJndWlkZWxpbmVzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGd1aWRlbGluZXMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ3VpZGVsaW5lc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZ3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZFJlcG9ydHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlcG9ydHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVwb3J0cykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBvcnRzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXBvcnRzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJldXNhYmxlQXNzZXRzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkVGVjaG5pcXVlcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idGVjaG5pcXVlcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZWNobmlxdWVzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlY2huaXF1ZXNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRlY2huaXF1ZXMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUZW1wbGF0ZXMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InRlbXBsYXRlcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZW1wbGF0ZXMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcGxhdGVzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0ZW1wbGF0ZXMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2hpdGVwYXBlcnNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkVG9vbE1lbnRvcnMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InRvb2xNZW50b3JzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRvb2xNZW50b3JzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xNZW50b3JzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0b29sTWVudG9ycyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODA5OTc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZ3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgkKLQk8eHNsOmluY2x1ZGUgaHJlZj0ib3ZlcnZpZXcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZXNjYXBlLnhzbCIvPgkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Rvb2wnXS9FbGVtZW50W0BUeXBlPSdUb29sJ10iLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJCTxtZXRhIG5hbWU9InRvb2wiIGNvbnRlbnQ9InskdG9vbC9ARGlzcGxheU5hbWV9Ii8+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZmVyZW5jZUxpc3QiIHNlbGVjdD0icmVmZXJlbmNlTGlzdCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250ZW50RWxlbWVudHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250ZW50RWxlbWVudHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0ZWRFbGVtZW50c1RleHQiLz4KLQkJCQkJCTwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb250ZW50RWxlbWVudHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXR0YWNobWVudHMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYXR0YWNobWVudHMnXSIvPgkJCQkKLQotCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJycgb3IgJGF0dGFjaG1lbnRzICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgkJCQotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iJGF0dGFjaG1lbnRzICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF0dGFjaGVkRmlsZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTxVTD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYXR0YWNoZWRGaWxlJ10iPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJAZmlsZU5hbWUiLz4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPGEgaHJlZj0ie0B1cmx9IiB0YXJnZXQ9Il9ibGFuayI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmaWxlTmFtZSIvPjwvYT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC9VTD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTwhLS0gdXNlIHRoZSBzcGVjaWZpYyBuYW1lZCBsaXN0LCAgb3RoZXJ3aXNlLCB0aGUgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IHdpbGwgYmUgaW5jbHVkZWQsIGJ1ZyAxNjM4ODUgLS0+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nY2hlY2tsaXN0cyddL0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2NvbmNlcHRzQW5kUGFwZXJzJ10vRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nZ3VpZGVsaW5lcyddL0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nc3VwcG9ydGluZ01hdGVyaWFscyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lICE9J2NvbnRlbnRFbGVtZW50cyddL0VsZW1lbnRbQFR5cGU9J1Rvb2xNZW50b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdjb25jZXB0c0FuZFBhcGVycyddL0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdleGFtcGxlcyddL0VsZW1lbnRbQFR5cGU9J0V4YW1wbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdhc3NldHMnXS9FbGVtZW50W0BUeXBlPSdSZXVzYWJsZUFzc2V0J10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHRvb2xNZW50b3JzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgKyBjb3VudCgkcmV1c2FibGVBc3NldHMpICsgY291bnQoJGV4YW1wbGVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9IiRleGFtcGxlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkVG9vbE1lbnRvcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9IiR0b29sTWVudG9ycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2lsbHVzdHJhdGlvbi54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2lsbHVzdHJhdGlvbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDhmODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9pbGx1c3RyYXRpb24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXhhbXBsZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdFeGFtcGxlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1JldXNhYmxlQXNzZXQnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRleGFtcGxlcykgKyBjb3VudCgkcmV1c2FibGVBc3NldHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbGx1c3RyYXRpb25zVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSIkZXhhbXBsZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSIkcmV1c2FibGVBc3NldHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9rZXlfY29uc2lkZXJhdGlvbi54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2tleV9jb25zaWRlcmF0aW9uLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjMmYzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2tleV9jb25zaWRlcmF0aW9uLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2tleUNvbnNpZGVyYXRpb25zJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIka2V5Q29uc2lkZXJhdGlvbnMgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIka2V5Q29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGtleUNvbnNpZGVyYXRpb25zIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21haW5fZGVzY3JpcHRpb24ueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9tYWluX2Rlc2NyaXB0aW9uLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhMDc2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21haW5fZGVzY3JpcHRpb24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb24iLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWFwcGluZy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21hcHBpbmcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA2NDBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWFwcGluZy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidhY3Rpdml0eSciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iid0b29sX21lbnRvciciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdPdXRjb21lJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidhcnRpZmFjdCciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyYWJsZSciPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInYXJ0aWZhY3QnIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQWN0aXZpdHknIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3dvcmtmbG93X2RldGFpbCciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDb25jZXB0JyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iidjb25jZXB0JyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0V4YW1wbGUnIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ2V4YW1wbGUnIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInb3RoZXInIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21pbGVzdG9uZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21pbGVzdG9uZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YWFiZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9taWxlc3RvbmUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHJvcGVydHkueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaWxsdXN0cmF0aW9uLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J01pbGVzdG9uZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWlsZXN0b25lRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdNaWxlc3RvbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+CQkJCQotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJICAgIDx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ij4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHByZWRlY2Vzc29yVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmluZ0RhdGFUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkbXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGV2ZW50RHJpdmVuVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9uZ29pbmdUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRyZXBlYXRhYmxlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCQotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZVRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3V0Y29tZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL291dGNvbWUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNhMzBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3V0Y29tZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJ3b3JrcHJvZHVjdC54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFwcGluZy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4JCi0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0Y29tZURlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3REZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0KLQkJPGh0bWw+CQotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+IAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RJbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJG91dGNvbWVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhaWxvcmluZ1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJG91dGNvbWVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL292ZXJ2aWV3LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3ZlcnZpZXcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2VhNzg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3ZlcnZpZXcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImJhY2tQYXRoIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlZml4IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYnJpZWZEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3lub255bXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdzeW5vbnltcyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxJZCIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2V4dGVybmFsSWQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IkBTaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPGRpdiBpZD0icGFnZS1ndWlkIj4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdndWlkJ10iLz48L3hzbDphdHRyaWJ1dGU+Ci0JCTwvZGl2PgotCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZSIgbm93cmFwPSJ0cnVlIj4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyBvciAkZWxlbWVudFR5cGUgPSAnU3VwcG9ydGluZ01hdGVyaWFsJyBvciAkZWxlbWVudFR5cGUgPSAnU3VtbWFyeSciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ3RydWUnIj4KLQkJCQkJCQkJCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2tEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFza1RleHQiLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlVGV4dCIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdERlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJHdvcmtQcm9kdWN0VHlwZSAhPSAnJyI+Ci0JCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgkd29ya1Byb2R1Y3RUZXh0LCAnICgnLCAkd29ya1Byb2R1Y3RUeXBlLCAnKScpIi8+Ci0JCQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdFRleHQiLz4KLQkJCQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4JCi0JCQkJCQkJCQkJCTwveHNsOmNob29zZT4JCQkJCQkJCQkJCQotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQkJPCEtLQotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQkJCS0tPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZWxlbWVudFR5cGVUZXh0Ij4KLQkJCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8L3hzbDpjaG9vc2U+CQkJCQkJCQkJCi0JCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJCTwhLS0KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJCQktLT4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImVsZW1lbnRUeXBlVGV4dCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkcHJlZml4ICE9ICcnIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJlZml4Ii8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4JCQkJCQkKLQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbElkICE9ICcnIj4KLQkJCQkJCSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsSWQiLz4pCi0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIxMDAlIj4KLQkJCQkJPGRpdiBhbGlnbj0icmlnaHQiIGlkPSJjb250ZW50UGFnZVRvb2xiYXIiLz4KLQkJCQk8L3RkPgotCQkJCTx4c2w6aWYgdGVzdD0iJHNob3dUcmVlQnJvd3NlciI+Ci0JCQkJCTx0ZCB3aWR0aD0iMTAwJSIgY2xhc3M9ImV4cGFuZENvbGxhcHNlTGluayIgYWxpZ249InJpZ2h0Ij4KLQkJCQkJCTxhIG5hbWU9Im1haW5JbmRleCIgaHJlZj0ieyRiYWNrUGF0aH1pbmRleC5odG0iLz4KLQkJCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvdHJlZWJyb3dzZXIuanMiLz4KLQkJCQkJPC90ZD4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotCQkJPHRyPgotCQkJCTx0ZCBjbGFzcz0icGFnZVRpdGxlU2VwYXJhdG9yIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgaGVpZ2h0PSIxIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDdXN0b21DYXRlZ29yeScgYW5kICRicmllZkRlc2NyaXB0aW9uID0gJyciPgotCQkJCTxici8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPGRpdiBjbGFzcz0ib3ZlcnZpZXciPgotCQkJCQk8dGFibGUgd2lkdGg9Ijk3JSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQkJPHRyPgotCQkJCQkJCTx4c2w6aWYgdGVzdD0iJGJyaWVmRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJCQk8dGQgd2lkdGg9IjUwIj4KLQkJCQkJCQkJCTxpbWcgc3JjPSJ7JGVsZW1lbnRJY29ufSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQkJCQkJPC90ZD4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8dGQ+Ci0JCQkJCQkJCTx0YWJsZSBjbGFzcz0ib3ZlcnZpZXdUYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYnJpZWZEZXNjcmlwdGlvbiIvPgotCQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCQk8L3RyPgotCQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlJyI+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyb2xlS2V5SW5mbyIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrJyI+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YXNrS2V5SW5mbyIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdBcnRpZmFjdCcgb3IgJGVsZW1lbnRUeXBlID0gJ0RlbGl2ZXJhYmxlJyBvciAkZWxlbWVudFR5cGUgPSAnT3V0Y29tZSciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RLZXlJbmZvIi8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRvb2xNZW50b3JLZXlJbmZvIi8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2tEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YXNrRGVzY3JpcHRvcktleUluZm8iPgotCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyb2xlRGVzY3JpcHRvcktleUluZm8iPgotCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnQiLz4KLQkJCQkJCQkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPgotCQkJCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRiYXNlRWxlbWVudCkgPiAwIj4KLQkJCQkJCQkJCQkJCTx0cj4KLQkJCQkJCQkJCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAncmVwbGFjZXMnIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdjb250cmlidXRlcycgIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udHJpYnV0ZXNUZXh0Ii8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzUmVwbGFjZXMnICI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCQkJCQkJPCEtLSBkaXNwbGF5IGxvY2FsQ09udHJpYnV0aW9uIGFuZCBsb2NhbFJlcGxhY2VtZW50IGFzIGV4dGVuZHMgZm9yIG5vdyAtLT4KLQkJCQkJCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIG9yICR2YXJpYWJpbGl0eVR5cGUgPSAnbG9jYWxDb250cmlidXRpb24nIG9yICR2YXJpYWJpbGl0eVR5cGUgPSAnbG9jYWxSZXBsYWNlbWVudCcgIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlRWxlbWVudCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCQkJCTwvdHI+Ci0JCQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQkJPC90YWJsZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC90YWJsZT4KLQkJCQk8L2Rpdj4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJlbGVtZW50VHlwZVRleHQiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIi8+Ci0JCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQWN0aXZpdHknIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhY3Rpdml0eVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0FydGlmYWN0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXJ0aWZhY3RUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDYXBhYmlsaXR5UGF0dGVybiciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhcGFiaWxpdHlQYXR0ZXJuVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ2hlY2tsaXN0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2hlY2tsaXN0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ29tcG9zaXRlUm9sZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbXBvc2l0ZVJvbGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDb25jZXB0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29uY2VwdFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY3VzdG9tQ2F0ZWdvcnlUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyYWJsZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlbGl2ZXJhYmxlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRGVsaXZlcnlQcm9jZXNzJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcnlQcm9jZXNzVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRGlzY2lwbGluZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpc2NpcGxpbmVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEaXNjaXBsaW5lR3JvdXBpbmcnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaXNjaXBsaW5lR3JvdXBpbmdUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEb21haW4nIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb21haW5UZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJCi0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0V4YW1wbGUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleGFtcGxlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnR3VpZGVsaW5lJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ3VpZGVsaW5lVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnSXRlcmF0aW9uJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaXRlcmF0aW9uVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnTWlsZXN0b25lJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlsZXN0b25lVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnT3V0Y29tZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dGNvbWVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdQaGFzZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBoYXNlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUHJhY3RpY2UnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmFjdGljZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JlcG9ydCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcG9ydFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JldXNhYmxlQXNzZXQnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9hZG1hcCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvYWRtYXBUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVEZXNjcmlwdG9yJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZURlc2NyaXB0b3JUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlU2V0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVTZXRHcm91cGluZyciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVTZXRHcm91cGluZ1RleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1N1cHBvcnRpbmdNYXRlcmlhbCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2snIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRvclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1RlYW1Qcm9maWxlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVByb2ZpbGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUZW1wbGF0ZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlbXBsYXRlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGVybURlZmluaXRpb24nIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXJtRGVmaW5pdGlvblRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2wnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b29sVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbE1lbnRvciciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xNZW50b3JUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXaGl0ZXBhcGVyJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2hpdGVwYXBlclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0RGVzY3JpcHRvclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0VHlwZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VHlwZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0U2xvdCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0U2xvdFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJvbGVLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlU2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2xlU2V0cyddL0VsZW1lbnRbQFR5cGU9J1JvbGVTZXQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHN5bm9ueW1zICE9ICcnIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3lub255bXNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHN5bm9ueW1zIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRiYXNlUm9sZSkgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kc1JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgkJCQkJCQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlUm9sZSI+Ci0JCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyb2xlU2V0cykgPiAwIj4KLQkJCTx4c2w6dmFyaWFibGUgbmFtZT0ic2l6ZSIgc2VsZWN0PSJjb3VudCgkcm9sZVNldHMpIi8+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVTZXRzVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyb2xlU2V0cyI+Ci0JCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSAkc2l6ZSI+LCYjMTYwOzwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJvbGVEZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic291cmNlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1JvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ2ZhbHNlJyBhbmQgY291bnQoJHNvdXJjZVJvbGUpID4gMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VkT25NZXRob2RSb2xlVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzb3VyY2VSb2xlIj4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhc2tLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkaXNjaXBsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkaXNjaXBsaW5lcyddL0VsZW1lbnRbQFR5cGU9J0Rpc2NpcGxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VUYXNrIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkaXNjaXBsaW5lcykgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlzY2lwbGluZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRpc2NpcGxpbmVzIj4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGlzY2lwbGluZXMpID4gcG9zaXRpb24oKSI+LCYjMTYwOzwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYmFzZVRhc2spID4gMCI+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkaXNjaXBsaW5lcykgPiAwIj4KLQkJCQkJCQk8YnIvPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAncmVwbGFjZXMnIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2VzVGV4dCIvPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnY29udHJpYnV0ZXMnIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kc1JlcGxhY2VzJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzUmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzVGV4dCIvPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGJhc2VUYXNrIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhc2tEZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic291cmNlVGFzayIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1Rhc2snXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4JCQotCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAnZmFsc2UnIGFuZCBjb3VudCgkc291cmNlVGFzaykgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZWRPbk1ldGhvZFRhc2tUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNvdXJjZVRhc2siPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic291cmNlV29ya1Byb2R1Y3QiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdXb3JrUHJvZHVjdCddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ2ZhbHNlJyBhbmQgY291bnQoJHNvdXJjZVdvcmtQcm9kdWN0KSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlZE9uTWV0aG9kV29ya1Byb2R1Y3RUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNvdXJjZVdvcmtQcm9kdWN0Ij4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0S2V5SW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZG9tYWlucyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkb21haW5zJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VXb3JrUHJvZHVjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RUeXBlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd3b3JrUHJvZHVjdFR5cGVzJ10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RUeXBlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPgotCQk8dHI+Ci0JCQk8dGQ+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgPiAwIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb21haW5zVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkb21haW5zIj4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgPiBwb3NpdGlvbigpIj4sJiMxNjA7PC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0VHlwZXMpID4gMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRvbWFpbnMpID4gMCI+Ci0JCQkJCQk8YnIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdFR5cGVzVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdFR5cGVzIj4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RUeXBlcykgPiBwb3NpdGlvbigpIj4sJiMxNjA7PC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGJhc2VXb3JrUHJvZHVjdCkgPiAwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgKyBjb3VudCgkd29ya1Byb2R1Y3RUeXBlcykgPiAwIj4KLQkJCQkJCTxici8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAncmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdjb250cmlidXRlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250cmlidXRlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHNSZXBsYWNlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzUmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYmFzZVdvcmtQcm9kdWN0Ij4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRvb2xNZW50b3JLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndG9vbCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ndmFyaWFiaWxpdHlUeXBlJ10iLz4KLQkJPHRyPgotCQkJPHRkPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHRvb2wpID4gMCI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbFRleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdG9vbCI+Ci0JCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYmFzZUVsZW1lbnQpID4gMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHRvb2wpICA+IDAiPgotCQkJCQkJPGJyLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kc1JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlRWxlbWVudCI+Ci0JCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RkPgotCQk8L3RyPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJvdmVydmlld1NlcGFyYXRvciI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHRhYmxlIGlkPSJvdmVydmlld1NlcGFyYXRvciIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9Im92ZXJ2aWV3U2VwYXJhdG9yIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgaGVpZ2h0PSIxIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjUiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcGFnZV9ub3RfaW5zdGFsbGVkLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcGFnZV9ub3RfaW5zdGFsbGVkLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhOTM5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3BhZ2Vfbm90X2luc3RhbGxlZC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4JCQotCQk8aHRtbD4JCi0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFnZU5vdEluc3RhbGxlZFRleHQiLz48L3RpdGxlPgotCQkJPC9oZWFkPgkJCi0JCQk8Ym9keT4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJAaW52YWxpZExpbmsiPgotCQkJCQk8Yj48aDM+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50RG9lc05vdEV4aXN0VGV4dCIvPjwvaDM+PC9iPgotCQkJCQk8cC8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaXNOb3RWYWxpZFRleHQiLz4KLQkJCQkJPGJyLz4JCi0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dCIvPgotCQkJCQk8cC8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGxlYXNlRml4TGlua1RleHQiLz4JCQkJCQkJCQkJCi0JCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTxiPjxoMz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pc3NpbmdFbGVtZW50VGV4dCIvPjwvaDM+PC9iPgotCQkJCTxwLz4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vdEF2YWlsYWJsZVRleHQiLz4JCQkJCQkJCQotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQkJPC9ib2R5PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3ByYWN0aWNlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHJhY3RpY2UueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzY3OWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHJhY3RpY2UueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2UueHNsIi8+CQotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4JCQotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCi0gICAgCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbjIiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uMiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3ViUHJhY3RpY2VzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1YlByYWN0aWNlcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dFNsb3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0lucHV0IHdvcmsgcHJvZHVjdCBzbG90cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250ZW50UmVmZXJlbmNlcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWN0aXZpdHlSZWZlcmVuY2VzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmFjdGljZVRyZWUiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nUHJhY3RpY2UgZ3VpZGFuY2UgdHJlZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRlbnRSZWZlcmVuY2VzKSArIGNvdW50KCRzdWJQcmFjdGljZXMpICsgY291bnQoJGFjdGl2aXR5UmVmZXJlbmNlcykgKyBjb3VudCgkY2F0ZWdvcmllcykgKyBjb3VudCgkaW5wdXRTbG90cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JCQkJCQk8L3RoPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHByYWN0aWNlVHJlZS8qIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0ibmFtZSgpPSdFbGVtZW50JyI+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxpbWc+Ci0JCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj4uLy4uLy4uLy4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAU2hhcGVpY29uVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhlaWdodCI+MTY8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0id2lkdGgiPjE2PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkgIAk8L2ltZz4KLQkJCQkJCQkJICAJPGE+Ci0JCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJICAJPC9hPgotCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJuYW1lKCk9J3JlZmVyZW5jZUxpc3QnIj4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLyoiPgotCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJuYW1lKCk9J3JlZmVyZW5jZUxpc3QnIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCSAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLyoiPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8aW1nPgotCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InNyYyI+Li8uLi8uLi8uLi88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFNoYXBlaWNvblVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJoZWlnaHQiPjE2PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9IndpZHRoIj4xNjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJICAJPC9pbWc+Ci0JCQkJCQkJCQkJCSAgCTxhPgotCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCSAgCTwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0ibmFtZSgpPSdFbGVtZW50JyI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGltZz4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj4uLy4uLy4uLy4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAU2hhcGVpY29uVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJoZWlnaHQiPjE2PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCI+MTY8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkgIAk8L2ltZz4KLQkJCQkJCQkJCSAgCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCSAgCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCSAgPC91bD4gCQkKLQkJCQkJCSAgPC94c2w6Zm9yLWVhY2g+Ci0JCQkJICAJPC90ZD4KLQkJCQkJPC90cj4JCi0JCQkJCQotCQkJCQkKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGlucHV0c1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRpbnB1dFNsb3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJvYmxlbSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9ibGVtJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrZ3JvdW5kIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JhY2tncm91bmQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImdvYWxzIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2dvYWxzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhcHBsaWNhdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhcHBsaWNhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdsZXZlbHNPZkFkb3B0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhZGRpdGlvbmFsSW5mbyddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJycgb3IgJHByb2JsZW0gIT0gJycgb3IgJGJhY2tncm91bmQgIT0gJycgb3IgJGdvYWxzICE9ICcnIG9yICRhcHBsaWNhdGlvbiAhPSAnJyBvciAkbGV2ZWxzT2ZBZG9wdGlvbiAhPSAnJyBvciAkYWRkaXRpb25hbEluZm8gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+CQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkcHJvYmxlbSAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9ibGVtVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRwcm9ibGVtIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRnb2FscyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnb2Fsc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZ29hbHMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGJhY2tncm91bmQgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja2dyb3VuZFRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYmFja2dyb3VuZCIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRhcHBsaWNhdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcHBsaWNhdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYXBwbGljYXRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGxldmVsc09mQWRvcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGV2ZWxzT2ZBZG9wdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbGV2ZWxzT2ZBZG9wdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYWRkaXRpb25hbEluZm8gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbEluZm9UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFkZGl0aW9uYWxJbmZvIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+ICAgIAotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcm9wZXJ0eS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Byb3BlcnR5LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxNTVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Byb3BlcnR5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJmaWVsZFRleHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImlkIj5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpZWxkTGFiZWwiLz48L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDppZiB0ZXN0PSIkZmllbGRUZXh0ICE9ICcnICI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlkIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhYmJyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpZWxkTGFiZWwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmllbGRMYWJlbCIvPgotCQkJCTwvdGg+Ci0JCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZmllbGRUZXh0ID0gJ3RydWUnIG9yICRmaWVsZFRleHQgPSAnZmFsc2UnIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgYWxpZ249ImxlZnQiPgotCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhlYWRlcnMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZmllbGRUZXh0ID0gJ3RydWUnIj4KLQkJCQkJCQkJCTxpbWcgd2lkdGg9IjIwIiBoZWlnaHQ9IjE1IiBhbHQ9IlllcyIgdGl0bGU9IlllcyI+Ci0JCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPnRydWUuZ2lmPC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJPC9pbWc+Ci0JCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPGltZyB3aWR0aD0iMjAiIGhlaWdodD0iMTUiIGFsdD0iIiB0aXRsZT0iIj4KLQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+aW5kZW50LmdpZjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCTwvaW1nPgotCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwhLS0KLQkJCQkJCQk8bGFiZWwgZm9yPSJjYm94MSIvPgotCQkJCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWFkb25seSI+dHJ1ZTwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkZmllbGRUZXh0ID0gJ3RydWUnIj4KLQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNoZWNrZWQiPmNoZWNrZWQ8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+Y2JveDE8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj5jYm94MTwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25jbGljayI+PHhzbDpjaG9vc2U+PHhzbDp3aGVuIHRlc3Q9IiRmaWVsZFRleHQgPSAndHJ1ZSciPgotCSAJCQkJCQkJCXRoaXMuY2hlY2tlZD10cnVlOwotIAkJCQkJCQkJPC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT4KLSAJCQkJCQkJCQl0aGlzLmNoZWNrZWQ9ZmFsc2U7Ci0gCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQk8L2lucHV0PgotCQkJCQkJCS0tPgotCQkJCQkJPC90ZD4KLQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhlYWRlcnMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRmaWVsZFRleHQiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHVycG9zZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3B1cnBvc2UueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJhNmM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHVycG9zZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InB1cnBvc2UiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncHVycG9zZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHB1cnBvc2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHVycG9zZVRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcHVycG9zZSIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNzc1ODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLgotCi0jCi0jIGJlZ2luIGVsZW1lbnQgdHlwZSB0ZXh0IHNlY3Rpb24KLSMgdXNlciBjYW4gY3VzdG9taXplIHRoZSB0eXBlIHRleHQgYmVmb3JlIHB1Ymxpc2hpbmcKLSMKLWFjdGl2aXR5VGV4dD1BY3Rpdml0eQotYXJ0aWZhY3RUZXh0PUFydGlmYWN0Ci1jYXBhYmlsaXR5UGF0dGVyblRleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1jaGVja2xpc3RUZXh0PUNoZWNrbGlzdAotY29tcG9zaXRlUm9sZVRleHQ9Q29tcG9zaXRlIFJvbGUKLWNvbmNlcHRUZXh0PUNvbmNlcHQKLWN1c3RvbUNhdGVnb3J5VGV4dD1DdXN0b20gQ2F0ZWdvcnkKLWRlbGl2ZXJhYmxlVGV4dD1EZWxpdmVyYWJsZQotZGVsaXZlcnlQcm9jZXNzVGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1kaXNjaXBsaW5lVGV4dD1EaXNjaXBsaW5lCi1kaXNjaXBsaW5lR3JvdXBpbmdUZXh0PURpc2NpcGxpbmUgR3JvdXBpbmcKLWRvbWFpblRleHQ9RG9tYWluCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLWV4YW1wbGVUZXh0PUV4YW1wbGUKLWd1aWRlbGluZVRleHQ9R3VpZGVsaW5lCi1pdGVyYXRpb25UZXh0PUl0ZXJhdGlvbgotbWlsZXN0b25lVGV4dD1NaWxlc3RvbmUKLW91dGNvbWVUZXh0PU91dGNvbWUKLXBoYXNlVGV4dD1QaGFzZQotcHJhY3RpY2VUZXh0PVByYWN0aWNlCi1yZXBvcnRUZXh0PVJlcG9ydAotcmV1c2FibGVBc3NldFRleHQ9UmV1c2FibGUgQXNzZXQKLXJvYWRtYXBUZXh0PVJvYWRtYXAKLXJvbGVUZXh0PVJvbGUKLXJvbGVEZXNjcmlwdG9yVGV4dD1Sb2xlIERlc2NyaXB0b3IKLXJvbGVTZXRUZXh0PVJvbGUgU2V0Ci1yb2xlU2V0R3JvdXBpbmdUZXh0PVJvbGUgU2V0IEdyb3VwaW5nCi1zdXBwb3J0aW5nTWF0ZXJpYWxUZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWwKLXRhc2tUZXh0PVRhc2sKLXRhc2tEZXNjcmlwdG9yVGV4dD1UYXNrIERlc2NyaXB0b3IKLXRlYW1Qcm9maWxlVGV4dD1UZWFtIFByb2ZpbGUKLXRlbXBsYXRlVGV4dD1UZW1wbGF0ZQotdGVybURlZmluaXRpb25UZXh0PVRlcm0gRGVmaW5pdGlvbgotdG9vbFRleHQ9VG9vbAotdG9vbE1lbnRvclRleHQ9VG9vbCBNZW50b3IKLXdoaXRlcGFwZXJUZXh0PVdoaXRlcGFwZXIKLXdvcmtQcm9kdWN0RGVzY3JpcHRvclRleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLXdvcmtQcm9kdWN0VHlwZVRleHQ9V29yayBQcm9kdWN0IEtpbmQKLXdvcmtQcm9kdWN0U2xvdFRleHQ9V29yayBQcm9kdWN0IFNsb3QKLQotIwotIyBlbmQgZWxlbWVudCB0eXBlIHRleHQgc2VjdGlvbgotIwotCi0jCi0jIG90aGVyIGxheW91dCB0ZXh0IGJlbG93Ci0jCi1hZGRpdGlvbmFsSW5mb1RleHQ9QWRkaXRpb25hbCBJbmZvcm1hdGlvbgotYWRkaXRpb25hbFBlcmZvcm1lclRleHQ9QWRkaXRpb25hbCBQZXJmb3JtZXJzCi1hZ2dyZWdhdGVzVGV4dD1BZ2dyZWdhdGVzCi1hbHRlcm5hdGl2ZXNUZXh0PUFsdGVybmF0aXZlcwotYXBwbGljYXRpb25UZXh0PUFwcGxpY2F0aW9uCi0KLWFzc2V0c1RleHQ9QXNzZXRzCi1hc3NpZ25tZW50QXBwcm9hY2hlc1RleHQ9QXNzaWdubWVudCBBcHByb2FjaGVzCi1hc3Npc3RpbmdUZXh0PUFzc2lzdGluZwotYXR0YWNoZWRGaWxlc1RleHQ9QXR0YWNoZWQgRmlsZXMKLWJhY2tncm91bmRUZXh0PUJhY2tncm91bmQKLWJyaWVmT3V0bGluZVRleHQ9QnJpZWYgT3V0bGluZQotY2F0ZWdvcmllc1RleHQ9Q2F0ZWdvcmllcwotY2hlY2tJdGVtc1RleHQ9Q2hlY2sgSXRlbXMKLWNoZWNrbGlzdHNUZXh0PUNoZWNrbGlzdHMKLWNvbGxhcHNlQWxsVGV4dD1Db2xsYXBzZSBBbGwgQ2hlY2sgSXRlbXMKLQotY29uY2VwdHNUZXh0PUNvbmNlcHRzCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PUNvbnRhaW5lZCBBcnRpZmFjdHMKLWNvbnRhaW5lckFydGlmYWN0VGV4dD1Db250YWluZXIgQXJ0aWZhY3QKLWNvbnRlbnRFbGVtZW50c1RleHQ9Q2F0ZWdvcml6ZWQgRWxlbWVudHMKLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1Db250ZW50IFJlZmVyZW5jZXMKLQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1EZWxpdmVyYWJsZSBQcm9wZXJ0aWVzCi1kZWxpdmVyZWRQYXJ0c1RleHQ9RGVsaXZlcmFibGUgUGFydHMKLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHMKLWRlcGVuZGVudFRleHQ9RGVwZW5kZW50IFdvcmsgUHJvZHVjdHMKLWRlc2NyaXB0aW9uVGV4dD1EZXNjcmlwdGlvbgotZGVzY3JpcHRvcnNUZXh0PURlc2NyaXB0b3JzCi0KLWRpc2NpcGxpbmVzVGV4dD1EaXNjaXBsaW5lcwotc3ViZGlzY2lwbGluZXNUZXh0PVN1YmRpc2NpcGxpbmVzCi0KLWRvbWFpbnNUZXh0PURvbWFpbnMKLWV4YW1wbGVzVGV4dD1FeGFtcGxlcwotZXhwYW5kQWxsVGV4dD1FeHBhbmQgQWxsIENoZWNrIEl0ZW1zCi1leHRlbmRzVGV4dD1FeHRlbmRzCi1leHRlcm5hbFRleHQ9RXh0ZXJuYWwKLWV4dGVybmFsRGVzY3JpcHRpb25UZXh0PUV4dGVybmFsIERlc2NyaXB0aW9uCi1nb2Fsc1RleHQ9R29hbHMKLWd1aWRlbGluZXNUZXh0PUd1aWRlbGluZXMKLWlsbHVzdHJhdGlvbnNUZXh0PUlsbHVzdHJhdGlvbnMJCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9SW1wYWN0IG9mIG5vdCBoYXZpbmcKLWltcGFjdGluZ1RleHQ9SW1wYWN0aW5nIFdvcmsgUHJvZHVjdHMKLWlucHV0c1RleHQ9SW5wdXRzCi1pbnB1dFRvVGV4dD1JbnB1dCBUbwotaXRlbXNUZXh0PUl0ZW1zCi1rZXlDb25zaWRlcmF0aW9uc1RleHQ9S2V5IENvbnNpZGVyYXRpb25zCi1sZXZlbHNPZkFkb3B0aW9uVGV4dD1MZXZlbHMgb2YgQWRvcHRpb24KLW1hbmRhdG9yeVRleHQ9TWFuZGF0b3J5Ci1tYWluVGV4dD1NYWluCi1tYWluRGVzY3JpcHRpb25UZXh0PU1haW4gRGVzY3JpcHRpb24KLW1haW5SZXNwb25zaWJsZVRleHQ9TWFpbiBSZXNwb25zaWJsZQotbWV0aG9kVGV4dD1NZXRob2QgV29yayBQcm9kdWN0Ci1tb2RpZmllZEJ5VGV4dD1Nb2RpZmllZCBCeQotbW9yZUluZm9UZXh0PU1vcmUgSW5mb3JtYXRpb24KLW5vdGF0aW9uVGV4dD1Ob3RhdGlvbgotb3B0aW9uYWxUZXh0PU9wdGlvbmFsCi0KLW91dHB1dEZyb21UZXh0PU91dHB1dCBGcm9tCi1vdXRwdXRzVGV4dD1PdXRwdXRzCi1wYWNrYWdpbmdJbnN0cnVjdGlvbnNUZXh0PVBhY2thZ2luZyBJbnN0cnVjdGlvbnMKLXBhY2thZ2luZ0d1aWRhbmNlVGV4dD1QYWNrYWdpbmcgR3VpZGFuY2UKLXBlcmZvcm1pbmdSb2xlc1RleHQ9UGVyZm9ybWluZyBSb2xlcwotcHJpbWFyeVBlcmZvcm1lclRleHQ9UHJpbWFyeSBQZXJmb3JtZXIKLXByb2JsZW1UZXh0PVdoeSBhZG9wdCB0aGlzIHByYWN0aWNlCi1wcm9wZXJ0aWVzVGV4dD1Qcm9wZXJ0aWVzCi1wdXJwb3NlVGV4dD1QdXJwb3NlCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9UmVhc29ucyBmb3Igbm90IG5lZWRpbmcKLXJlZmVyZW5jZVdvcmtmbG93c1RleHQ9UmVmZXJlbmNlIFdvcmtmbG93cwotcmVsYXRlZEVsZW1lbnRzVGV4dD1SZWxhdGVkIEVsZW1lbnRzCi1yZWxhdGlvbnNoaXBzVGV4dD1SZWxhdGlvbnNoaXBzCi1yZXBvcnRzVGV4dD1SZXBvcnRzCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNUZXh0PVJlcHJlc2VudGF0aW9uIE9wdGlvbnMKLXJlc3BvbnNpYmxlVGV4dD1SZXNwb25zaWJsZQotcmVzcG9uc2libGVGb3JUZXh0PVJlc3BvbnNpYmxlIGZvcgotcmV1c2FibGVBc3NldHNUZXh0PVJldXNhYmxlIEFzc2V0cwotCi1yb2xlc1RleHQ9Um9sZXMKLXJvbGVTZXRzVGV4dD1Sb2xlIFNldHMKLXNraWxsc1RleHQ9U2tpbGxzCi1zdGFmZmluZ1RleHQ9U3RhZmZpbmcKLXN0ZXBzVGV4dD1TdGVwcwotc3ViY2F0ZWdvcmllc1RleHQ9U3ViLUNhdGVnb3JpZXMJCi1zdWJkb21haW5zVGV4dD1TdWJkb21haW5zCi1zdWJQcmFjdGljZXNUZXh0PVN1Yi1QcmFjdGljZXMKLXN1cGVyVGVhbVRleHQ9U3VwZXItVGVhbSBQcm9maWxlCi1zdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dD1TdXBwb3J0aW5nIE1hdGVyaWFscwotc3VidGVhbXNUZXh0PVN1Yi1UZWFtcyBQcm9maWxlcwotc3lub255bXNUZXh0PVN5bm9ueW1zCi10YWlsb3JpbmdUZXh0PVRhaWxvcmluZwotCi10YXNrc1RleHQ9VGFza3MKLXRic1RleHQ9VGVhbSBBbGxvY2F0aW9uCi0KLXRlYW1Sb2xlc1RleHQ9VGVhbSBQcm9maWxlIFJvbGVzCi10ZWNobmlxdWVzVGV4dD1HdWlkZWxpbmVzCi10ZW1wbGF0ZXNUZXh0PVRlbXBsYXRlcwotdG9vbE1lbnRvcnNUZXh0PVRvb2wgTWVudG9ycwotCi11c2FnZVRleHQ9VXNhZ2UKLXdic1RleHQ9V29yayBCcmVha2Rvd24gU3RydWN0dXJlCi13aGl0ZXBhcGVyc1RleHQ9V2hpdGVwYXBlcnMKLXdvcmtQcm9kdWN0c1RleHQ9V29yayBQcm9kdWN0cwotd29ya1Byb2R1Y3RUeXBlc1RleHQ9V29yayBQcm9kdWN0IEtpbmRzCi13cGJzVGV4dD1Xb3JrIFByb2R1Y3QgVXNhZ2UKLXdvcmtCcmVha2Rvd25UZXh0PVdvcmsgQnJlYWtkb3duCi13b3JrZmxvd1RleHQ9V29ya2Zsb3cKLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1Xb3JrIFByb2R1Y3QgQnJlYWtkb3duCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9V29yayBQcm9kdWN0IERlcGVuZGVuY2llcwotdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0PVRlYW0gQnJlYWtkb3duCi10ZWFtU3RydWN0dXJlVGV4dD1UZWFtIFN0cnVjdHVyZQotcGFnZU5vdEluc3RhbGxlZFRleHQ9UGFnZSBOb3QgSW5zdGFsbGVkCi1lbGVtZW50RG9lc05vdEV4aXN0VGV4dD1FbGVtZW50IERvZXMgTm90IEV4aXN0Ci1pc05vdFZhbGlkVGV4dD1UaGUgcmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCBhIHZhbGlkIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9VGhlIGVsZW1lbnQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIGZyb20gdGhlIGxpYnJhcnkuCi1wbGVhc2VGaXhMaW5rVGV4dD1QbGVhc2UgY2hlY2sgeW91ciBjb250ZW50IGxpYnJhcnkgYW5kIGZpeCB0aGUgbGluay4KLWluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dD1JbmZvcm1hdGlvbiBhYm91dCB0aGUgbWlzc2luZyBlbGVtZW50OgotZWxlbWVudE5hbWVUZXh0PUVsZW1lbnQgTmFtZToKLWd1aWRUZXh0PUdVSUQ6Ci1taXNzaW5nRWxlbWVudFRleHQ9UmVmZXJlbmNlZCBwYWdlIGlzIG5vdCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24KLW5vdEF2YWlsYWJsZVRleHQ9VGhlIHJlZmVyZW5jZWQgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIFRoaXMgcGFnZSBtYXkgYmUgYXZhaWxhYmxlIGluIGFub3RoZXIgcHJvY2VzcyBjb25maWd1cmF0aW9uLgotZWxlbWVudFR5cGVUZXh0PUVsZW1lbnQgVHlwZToKLXBsdWdpbk5hbWVUZXh0PVBsdWctaW4gTmFtZToKLXByZWRlY2Vzc29yVGV4dD1QcmVkZWNlc3NvcgotcGxhbm5pbmdEYXRhVGV4dD1QbGFubmluZyBEYXRhCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1NdWx0aXBsZSBPY2N1cnJlbmNlcwotZXZlbnREcml2ZW5UZXh0PUV2ZW50IERyaXZlbgotb25nb2luZ1RleHQ9T25nb2luZwotcGxhbm5lZFRleHQ9UGxhbm5lZAotcmVwZWF0YWJsZVRleHQ9UmVwZWF0YWJsZQotdXNhZ2VHdWlkYW5jZVRleHQ9VXNhZ2UgR3VpZGFuY2UKLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9QWN0aXZpdHkgRW50cnkgU3RhdGUKLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1BY3Rpdml0eSBFeGl0IFN0YXRlCi1wcmVmaXhUZXh0PVByZWZpeAotZXh0ZXJuYWxJZFRleHQ9RXh0ZXJuYWwgSWQKLXNjb3BlVGV4dD1TY29wZQotCi10eXBlb2ZDb250cmFjdFRleHQ9VHlwZSBvZiBDb250cmFjdAotcHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQ9UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3MKLXByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0PVByb2plY3QgTWVtYmVyIEV4cGVydGlzZQotcmlza0xldmVsVGV4dD1SaXNrIExldmVsCi1zY2FsZVRleHQ9U2NhbGUKLXVzYWdlTm90ZXNUZXh0PVVzYWdlIE5vdGVzCi1jb250ZXh0VGV4dD1Db250ZXh0Ci1wYXJlbnRBY3Rpdml0aWVzVGV4dD1QYXJlbnQgQWN0aXZpdGllcwotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9SW5jbHVkZWQgUGF0dGVybnMKLQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PUNvbW11bmljYXRpb25zIE1hdGVyaWFscwotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1FZHVjYXRpb24gTWF0ZXJpYWxzCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1Fc3RpbWF0aW5nIFRlY2huaXF1ZQotYWRkaXRpb25hbFRleHQ9QWRkaXRpb25hbAotbW9kaWZpZXNUZXh0PU1vZGlmaWVzCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9QWRkaXRpb25hbGx5IFBlcmZvcm1zCi1pbmRleFRleHQ9SW5kZXgKLWJyZWFrZG93bkVsZW1lbnRUZXh0PUJyZWFrZG93biBFbGVtZW50Ci1wcmVkZWNlc3NvcnNUZXh0PVByZWRlY2Vzc29ycwotdHlwZVRleHQ9VHlwZQotCi1tb2RlbEluZm9UZXh0PU1vZGVsIEluZm8KLWVudHJ5U3RhdGVUZXh0PUVudHJ5IFN0YXRlCi1leGl0U3RhdGVUZXh0PUV4aXQgU3RhdGUKLXRlYW1UZXh0PVRlYW0KLXBhcmVudFBhY2thZ2VUZXh0PVBhcmVudCBQYWNrYWdlCi1jb250YWluZWRQYWNrYWdlc1RleHQ9Q29udGFpbmVkIFBhY2thZ2VzCi1jb250ZW50c1RleHQ9Q29udGVudHMKLWJhc2VkT25NZXRob2RSb2xlVGV4dD1CYXNlZCBvbiBNZXRob2QgUm9sZQotYmFzZWRPbk1ldGhvZFRhc2tUZXh0PUJhc2VkIG9uIE1ldGhvZCBUYXNrCi1iYXNlZE9uTWV0aG9kV29ya1Byb2R1Y3RUZXh0PUJhc2VkIG9uIE1ldGhvZCBXb3JrIFByb2R1Y3QKLXN1bW1hcnlUZXh0PVN1bW1hcnkKLXBlcmZvcm1zVGV4dD1QZXJmb3JtcwotcmVwbGFjZXNUZXh0PVJlcGxhY2VzCi1jb250cmlidXRlc1RleHQ9Q29udHJpYnV0ZXMKLW5vbmVUZXh0PU5vbmUKLQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1BY3Rpdml0eSBSZWZlcmVuY2VzCi1uYW1lVGV4dD1OYW1lCi1wcmVzZW50YXRpb25OYW1lVGV4dD1QcmVzZW50YXRpb24gTmFtZQotcmVwcmVzZW50YXRpb25UZXh0PVNlbGVjdGVkIFJlcHJlc2VudGF0aW9uCi1wcm9qZWN0U3BlY2lmaWNzVGV4dD1Qcm9qZWN0IFNwZWNpZmljcwotZXh0ZW5kc1JlcGxhY2VzVGV4dD1FeHRlbmRzIGFuZCBSZXBsYWNlcwotd29ya1Byb2R1Y3RUZXh0PVdvcmsgUHJvZHVjdAotcHJvY2Vzc1VzYWdlVGV4dD1Qcm9jZXNzIFVzYWdlCi0KLWZ1bGZpbGxlZFNsb3RzVGV4dD1GdWxmaWxsZWQgU2xvdHMKLWZ1bGZpbGxpbmdXb3JrUHJvZHVjdHNUZXh0PUZ1bGZpbGxpbmcgV29yayBQcm9kdWN0cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4MjI4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Jlc291cmNlcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCQotCQotPCEtLSB0aGUgZWxlbWVudCB0eXBlIHRleHQgLS0+Ci08eHNsOnBhcmFtIG5hbWU9ImFjdGl2aXR5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJhcnRpZmFjdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY2FwYWJpbGl0eVBhdHRlcm5UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY29tcG9zaXRlUm9sZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY29uY2VwdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY3VzdG9tQ2F0ZWdvcnlUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJhYmxlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJkZWxpdmVyeVByb2Nlc3NUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRpc2NpcGxpbmVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRpc2NpcGxpbmVHcm91cGluZ1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZG9tYWluVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImV4YW1wbGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Imd1aWRlbGluZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iaXRlcmF0aW9uVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaWxlc3RvbmVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im91dGNvbWVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBoYXNlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwcmFjdGljZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icmVwb3J0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2FkbWFwVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2xlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2xlRGVzY3JpcHRvclRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icm9sZVNldFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icm9sZVNldEdyb3VwaW5nVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRhc2tUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRhc2tEZXNjcmlwdG9yVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtUHJvZmlsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0idGVtcGxhdGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRlcm1EZWZpbml0aW9uVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0b29sVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0b29sTWVudG9yVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ3aGl0ZXBhcGVyVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3JUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0VHlwZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RTbG90VGV4dCIvPgotCi08IS0tIG90aGVyIHRleHQgdmFyaWFibGVzIC0tPgotCTx4c2w6cGFyYW0gbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhZGRpdGlvbmFsSW5mb1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWRkaXRpb25hbFBlcmZvcm1lclRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFkZGl0aW9uYWxUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhZ2dyZWdhdGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWx0ZXJuYXRpdmVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXBwbGljYXRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhc3NldHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFzc2lzdGluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImF0dGFjaGVkRmlsZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJiYWNrZ3JvdW5kVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYmFzZWRPbk1ldGhvZFJvbGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJiYXNlZE9uTWV0aG9kVGFza1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJicmllZk91dGxpbmVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjYXRlZ29yaWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY2hlY2tJdGVtc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdHNUZXh0Ii8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbGxhcHNlQWxsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb25jZXB0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudEVsZW1lbnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudFJlZmVyZW5jZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRleHRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250cmlidXRlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJlZFBhcnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVwZW5kZW50VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdG9yc1RleHQiLz4JCi0JPHhzbDpwYXJhbSBuYW1lPSJkaXNjaXBsaW5lc1RleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0iZG9tYWluc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFsc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnREb2VzTm90RXhpc3RUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50TWlnaHRCZURlbGV0ZWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50TmFtZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZW50cnlTdGF0ZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJldmVudERyaXZlblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4YW1wbGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXhpdFN0YXRlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXhwYW5kQWxsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXh0ZW5kc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHRlcm5hbElkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXh0ZXJuYWxUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJnb2Fsc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Imd1aWRlbGluZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJndWlkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaWxsdXN0cmF0aW9uc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImltcGFjdGluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW5jbHVkZWRQYXR0ZXJuc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImluZGV4VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbnB1dHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbnB1dFRvVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaXNOb3RWYWxpZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1haW5EZXNjcmlwdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1haW5SZXNwb25zaWJsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1haW5UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtYW5kYXRvcnlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nRWxlbWVudFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1vZGVsSW5mb1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1vZGlmaWVkQnlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtb2RpZmllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1vcmVJbmZvVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im5vbmVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJub3RhdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im5vdEF2YWlsYWJsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im9uZ29pbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJvcHRpb25hbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im91dHB1dEZyb21UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGFja2FnaW5nR3VpZGFuY2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdpbmdJbnN0cnVjdGlvbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYWdlTm90SW5zdGFsbGVkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGFyZW50QWN0aXZpdGllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBlcmZvcm1pbmdSb2xlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBlcmZvcm1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGxhbm5lZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBsYW5uaW5nRGF0YVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBsZWFzZUZpeExpbmtUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwbHVnaW5OYW1lVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJlZGVjZXNzb3JzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJlZGVjZXNzb3JUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcmVmaXhUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcmltYXJ5UGVyZm9ybWVyVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvYmxlbVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvamVjdFNwZWNpZmljc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb3BlcnRpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwdXJwb3NlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3NUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZWxhdGVkRWxlbWVudHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZWxhdGlvbnNoaXBzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwZWF0YWJsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlcGxhY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwb3J0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlc3BvbnNpYmxlRm9yVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVzcG9uc2libGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJpc2tMZXZlbFRleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0icm9sZVNldHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyb2xlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InNjYWxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic2NvcGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJza2lsbHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdGFmZmluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN0ZXBzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViY2F0ZWdvcmllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1YmRvbWFpbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdWJQcmFjdGljZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdWJUZWFtc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1bW1hcnlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3lub255bXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0YWlsb3JpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0YXNrc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRic1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVhbVJvbGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVhbVN0cnVjdHVyZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlYW1UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZWNobmlxdWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVtcGxhdGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idG9vbE1lbnRvcnNUZXh0Ii8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9InR5cGVvZkNvbnRyYWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idHlwZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ1c2FnZU5vdGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idXNhZ2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3YnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3aGl0ZXBhcGVyc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtCcmVha2Rvd25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrZmxvd1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0QnJlYWtkb3duVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id3Bic1RleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29sb25fd2l0aF9zcGFjZSIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViZGlzY2lwbGluZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXByZXNlbnRhdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9jZXNzVXNhZ2VUZXh0Ii8+Ci0JCi0JPHhzbDpwYXJhbSBuYW1lPSJmdWxmaWxsZWRTbG90c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImZ1bGZpbGxpbmdXb3JrUHJvZHVjdHNUZXh0Ii8+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGUueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY4NzZlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImRlc2NyaXB0b3JfaGVscGVyLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZVNldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZVNldHMnXS9FbGVtZW50W0BUeXBlPSdSb2xlU2V0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQotCQk8aHRtbD4JCi0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiIGNvbnRlbnQ9InskZWxlbWVudFByZXNlbnRhdGlvbk5hbWV9Ii8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRyb2xlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGFmZmluZ1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRyb2xlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWRkaXRpb25hbGx5UGVyZm9ybXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RNb2RpZmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtb2RpZmllcyddL0VsZW1lbnRbQFR5cGUhPSdXb3JrUHJvZHVjdFNsb3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0U2xvdE1vZGlmaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21vZGlmaWVzJ10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RTbG90J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPgkKLQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtIi8+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtcyIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RNb2RpZmllcykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90TW9kaWZpZXMpID4gMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kaWZpZXNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RNb2RpZmllcyI+Ci0JCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPC9hPgotCQkJCQkJCQk8L2xpPgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RTbG90TW9kaWZpZXMiPgotCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyddL0VsZW1lbnQiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L2xpPgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGREZXNjcmlwdG9ycyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZXNjcmlwdG9ycyddL0VsZW1lbnQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbHNwYW4iIHNlbGVjdD0iJzEnIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3RhZmZpbmdTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJza2lsbHMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdza2lsbHMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nYXNzaWdubWVudEFwcHJvYWNoZXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSIkc2tpbGxzICE9ICcnIG9yICRhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSAnJyBvciAkc3lub255bXMgIT0gJycgIiA+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFmZmluZ1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2tpbGxzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRza2lsbHMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSIkc3lub255bXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3lub255bXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHN5bm9ueW1zIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZV9kZXNjcmlwdG9yLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZV9kZXNjcmlwdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmODhiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGVfZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3RhZmZpbmdTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmZpeERlc2NyaXB0b3JMaW5rcygpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+Ci0JCTwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ij4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHByZWRlY2Vzc29yVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkdXNhZ2VHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Jlc3BvbnNpYmxlRm9yJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1JvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibW9kaWZpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbW9kaWZpZXMnXS9FbGVtZW50Ii8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxiPjxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwZXJmb3Jtc1RleHQiLz46PC9zcGFuPjwvYj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1zKSA+IDAiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRwZXJmb3JtcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCTwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGI+PHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlRm9yVGV4dCIvPjo8L3NwYW4+PC9iPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVGb3IpID4gMCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlc3BvbnNpYmxlRm9yIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJCTx0cj4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB2YWxpZ249InRvcCI+Ci0JCQkJCQk8Yj48c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0Ii8+Ojwvc3Bhbj48L2I+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtcykgPiAwIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYWRkaXRpb25hbGx5UGVyZm9ybXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQk8L3RkPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxiPjxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2RpZmllc1RleHQiLz46PC9zcGFuPjwvYj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1vZGlmaWVzKSA+IDAiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtb2RpZmllcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InN0YWZmaW5nU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2tpbGxzIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc2tpbGxzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2Fzc2lnbm1lbnRBcHByb2FjaGVzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkc2tpbGxzICE9ICcnIG9yICRhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSAnJyBvciAkc3lub255bXMgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YWZmaW5nVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkc2tpbGxzICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2lsbHNUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHNraWxscyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkc3lub255bXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN5bm9ueW1zVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRzeW5vbnltcyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9zdW1tYXJ5LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvc3VtbWFyeS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjE3NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9zdW1tYXJ5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+PHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgkJCQkKLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1bW1hcnlPdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJlZmVyZW5jZUxpc3QiPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KEVsZW1lbnQpID4gMCI+Ci0JCQkJCQkJCQk8aDIgY2xhc3M9ImJhbm5lciI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iRWxlbWVudCI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBUeXBlTmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPHAvPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3VtbWFyeU92ZXJ2aWV3Ij4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudEljb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYnJpZWZEZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbElkIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nZXh0ZXJuYWxJZCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJCi0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJwYWdlVGl0bGUiPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1bW1hcnlUZXh0Ii8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbElkICE9ICcnIj4KLQkJCQkJCSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsSWQiLz4pCi0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZVNlcGFyYXRvciI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgYWx0PSIiIHRpdGxlPSIiIGhlaWdodD0iMSIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgkJCi0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YWlsb3JpbmcueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YWlsb3JpbmcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcxY2Y5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFpbG9yaW5nLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdpbXBhY3RPZk5vdEhhdmluZyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVhc29uc0Zvck5vdE5lZWRpbmcnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdyZXByZXNlbnRhdGlvbk9wdGlvbnMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRpbXBhY3RPZk5vdEhhdmluZyAhPSAnJyBvciAkcmVhc29uc0Zvck5vdE5lZWRpbmcgIT0gJycgb3IgJHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YWlsb3JpbmdUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRpbXBhY3RPZk5vdEhhdmluZyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1wYWN0T2ZOb3RIYXZpbmdUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGltcGFjdE9mTm90SGF2aW5nIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRyZWFzb25zRm9yTm90TmVlZGluZyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHJlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRyZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2sueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YXNrLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MjFlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2sueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkJCi0JCQkJCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHVycG9zZS54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaWxsdXN0cmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yX2hlbHBlci54c2wiLz4KLQkKLQkJCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRhc2tEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icGVyZm9ybWluZ1JvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwZXJmb3JtZWRCeSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQkJCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+IAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1pbmdSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkdGFza0Rlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkdGFza0Rlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3RlcHNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdwZXJmb3JtZWRCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdE1hbmRhdG9yeUlucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dCddL0VsZW1lbnRbQFR5cGUhPSdXb3JrUHJvZHVjdFNsb3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0U2xvdE1hbmRhdG9yeUlucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dCddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RPcHRpb25hbElucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvcHRpb25hbElucHV0J10vRWxlbWVudFtAVHlwZSE9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RTbG90T3B0aW9uYWxJbnB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dCddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RPdXRwdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J291dHB1dCddL0VsZW1lbnRbQFR5cGUhPSdXb3JrUHJvZHVjdFNsb3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0U2xvdE91dHB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0J10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RTbG90J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtZWRCeSkgKyBjb3VudCgkY2F0ZWdvcmllcykgKyBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpICsgY291bnQoJHdvcmtQcm9kdWN0TWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCR3b3JrUHJvZHVjdFNsb3RNYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0T3B0aW9uYWxJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE9wdGlvbmFsSW5wdXRzKSArIGNvdW50KCR3b3JrUHJvZHVjdE91dHB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE91dHB1dHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNhdGVnb3JpZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY2F0ZWdvcmllcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtZWRCeSkgKyBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjQyJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByaW1hcnlQZXJmb3JtZXJUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1lZEJ5KSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHBlcmZvcm1lZEJ5Ij4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ij4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0TWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCR3b3JrUHJvZHVjdFNsb3RNYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0T3B0aW9uYWxJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iNDIlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFuZGF0b3J5VGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RNYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE1hbmRhdG9yeUlucHV0cykgPiAwIj4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdE1hbmRhdG9yeUlucHV0cyI+CQkKLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4JCQkJCQkJCQotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdFNsb3RNYW5kYXRvcnlJbnB1dHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyddL0VsZW1lbnQiPgotCQkJCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0T3B0aW9uYWxJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0T3B0aW9uYWxJbnB1dHMiPgkJCQkKLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4JCQkJCQkKLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RTbG90T3B0aW9uYWxJbnB1dHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyddL0VsZW1lbnQiPgotCQkJCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4JCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0T3V0cHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90T3V0cHV0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RPdXRwdXRzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0U2xvdE91dHB1dHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCQotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRGVzY3JpcHRvcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rlc2NyaXB0b3JzJ10vRWxlbWVudCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbHNwYW4iIHNlbGVjdD0iJzInIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4JCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdUb29sTWVudG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnXSIvPgotCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpICsgY291bnQoJGVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0iJHRvb2xNZW50b3JzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3RlcHNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNlY3Rpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9yZWZlcmVuY2VMaXN0W0BuYW1lPSdzZWN0aW9ucyddL0VsZW1lbnRbQFR5cGU9J1NlY3Rpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzZWN0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0ZXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCI+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzZWN0aW9ucyI+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBIZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSduYW1lJ10iLz48L2Rpdj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcENvbnRlbnQiPgotCQkJCQkJCQkJPHRhYmxlIGNsYXNzPSJzdGVwVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCQkJCQk8dGQ+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdzZWN0aW9uRGVzY3JpcHRpb24nXSIvPgotCQkJCQkJCQkJCQk8L3RkPgotCQkJCQkJCQkJCTwvdHI+Ci0JCQkJCQkJCQk8L3RhYmxlPgotCQkJCQkJCQk8L2Rpdj4JCQkJCQkKLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRpdmVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhbHRlcm5hdGl2ZXMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYWx0ZXJuYXRpdmVzJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkYWx0ZXJuYXRpdmVzICE9ICcnICI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhbHRlcm5hdGl2ZXNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhbHRlcm5hdGl2ZXMiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFza19kZXNjcmlwdG9yLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFza19kZXNjcmlwdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1YjVlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2tfZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwdXJwb3NlLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudElkIiBzZWxlY3Q9IkBJZCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtaW5nUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3BlcmZvcm1lZFByaW1hcmlseUJ5J10vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgkJCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9InVtYS5ndWlkIiBjb250ZW50PSJ7JGVsZW1lbnRJZH0iLz4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIHRydWUsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+CQkJCQkJCQkKLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGVwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0aXZlc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJCQljb250ZW50UGFnZS5wcm9jZXNzUGFnZS5maXhEZXNjcmlwdG9yTGlua3MoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkZXZlbnREcml2ZW5UZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb25nb2luZ1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHJlcGVhdGFibGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkJCi0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHVzYWdlR3VpZGFuY2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZVRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2UiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdwZXJmb3JtZWRQcmltYXJpbHlCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhc3Npc3RlZEJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Fzc2lzdGVkQnknXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFuZGF0b3J5SW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21hbmRhdG9yeUlucHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9wdGlvbmFsSW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdleHRlcm5hbElucHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcGVyZm9ybWVkUHJpbWFyaWx5QnkpICsgY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSArIGNvdW50KCRhc3Npc3RlZEJ5KSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRzKSArIGNvdW50KCRleHRlcm5hbElucHV0KSsgY291bnQoJG91dHB1dHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcGVyZm9ybWVkUHJpbWFyaWx5QnkpICsgY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSArIGNvdW50KCRhc3Npc3RlZEJ5KSA+IDAiPgkJCQotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtZWRQcmltYXJpbHlCeSkgPiAwIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRwZXJmb3JtZWRQcmltYXJpbHlCeSI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIAlzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4JCi0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+CQkJCQkJCQotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZGRpdGlvbmFsVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSkgPiAwIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIAlzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzaXN0aW5nVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhc3Npc3RlZEJ5KSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGFzc2lzdGVkQnkiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiAJc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4JCQkKLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCRleHRlcm5hbElucHV0KSArIGNvdW50KCRvcHRpb25hbElucHV0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjMwJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1hbmRhdG9yeVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0cykgPiAwIj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC91bD4JCQkJCQkJCQkKLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4JCQkJCQkJCQkKLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRleHRlcm5hbElucHV0KSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXh0ZXJuYWxJbnB1dCI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4JCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG91dHB1dHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG91dHB1dHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdGVwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNlY3Rpb25zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3NlbGVjdGVkU3RlcHMnXS9FbGVtZW50W0BUeXBlPSdTZWN0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc2VjdGlvbnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGVwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc2VjdGlvbnMiPgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nbmFtZSddIi8+PC9kaXY+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBDb250ZW50Ij4KLQkJCQkJCQkJCTx0YWJsZSBjbGFzcz0ic3RlcFRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJCQkJPHRkPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nc2VjdGlvbkRlc2NyaXB0aW9uJ10iLz4KLQkJCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCQk8L3RyPgotCQkJCQkJCQkJPC90YWJsZT4KLQkJCQkJCQkJPC9kaXY+CQkJCQkJCi0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4JCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdUb29sTWVudG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkdG9vbE1lbnRvcnMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFsdGVybmF0aXZlcyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhbHRlcm5hdGl2ZXMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRhbHRlcm5hdGl2ZXMgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFsdGVybmF0aXZlc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFsdGVybmF0aXZlcyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90ZWFtcHJvZmlsZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RlYW1wcm9maWxlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3NTY2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RlYW1wcm9maWxlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InByb3BlcnR5LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImlsbHVzdHJhdGlvbi54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCi0JCTxodG1sPgkKLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+CQotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4JCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3ViVGVhbXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc3ViVGVhbSddL0VsZW1lbnQiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRlYW1Sb2xlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd0ZWFtUm9sZXMnXS9FbGVtZW50Ii8+Ci0JCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3ViVGVhbXMpICsgY291bnQoJHRlYW1Sb2xlcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3ViVGVhbXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdWJUZWFtc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1YlRlYW1zIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdGVhbVJvbGVzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVJvbGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGVhbVJvbGVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZVRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJ1VzYWdlIEd1aWRhbmNlJyIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3dvcmtwcm9kdWN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhMDUyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3dvcmtwcm9kdWN0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImNvbW1vbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ib3ZlcnZpZXcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InB1cnBvc2UueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJ0YWlsb3JpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0X2hlbHBlci54c2wiLz4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3RfaGVscGVyLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3RfaGVscGVyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4OGQyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3dvcmtwcm9kdWN0X2hlbHBlci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZGVzY3JpcHRvcl9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0SWxsdXN0cmF0aW9uc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRlbXBsYXRlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1RlbXBsYXRlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXBvcnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nUmVwb3J0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0V4YW1wbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nUmV1c2FibGVBc3NldCddIi8+CQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZW1wbGF0ZXMpICsgY291bnQoJHJlcG9ydHMpICsgY291bnQoJGV4YW1wbGVzKSArIGNvdW50KCRyZXVzYWJsZUFzc2V0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlsbHVzdHJhdGlvbnNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRlbXBsYXRlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idGVtcGxhdGVzIiBzZWxlY3Q9IiR0ZW1wbGF0ZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlcG9ydHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcG9ydHMiIHNlbGVjdD0iJHJlcG9ydHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSIkZXhhbXBsZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSIkcmV1c2FibGVBc3NldHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZnVsZmlsbGluZ1dvcmtQcm9kdWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyddL0VsZW1lbnQiPjwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImZ1bGZpbGxlZFNsb3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Z1bGZpbGxzJ10vRWxlbWVudCI+PC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdjb250YWluZXJBcnRpZmFjdCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nY29udGFpbmVkQXJ0aWZhY3RzJ10vRWxlbWVudFtAVHlwZT0nQXJ0aWZhY3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVzcG9uc2libGVSb2xlcyddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1vZGlmeVJvbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21vZGlmeVJvbGVzJ10vRWxlbWVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFuZGF0b3J5SW5wdXRUb1Rhc2tzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21hbmRhdG9yeUlucHV0VG9UYXNrcyddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9wdGlvbmFsSW5wdXRUb1Rhc2tzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXRUb1Rhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RnJvbVRhc2tzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J291dHB1dEZyb21UYXNrcyddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1hbmRhdG9yeUlucHV0VG9UYXNrc19mcm9tU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvcHRpb25hbElucHV0VG9UYXNrc19mcm9tU2xvdHMnXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J291dHB1dEZyb21UYXNrc19mcm9tU2xvdHMnXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzKSArIGNvdW50KCRmdWxmaWxsZWRTbG90cykgKyBjb3VudCgkY2F0ZWdvcmllcykgKyBjb3VudCgkcmVzcG9uc2libGVSb2xlcykgKyBjb3VudCgkY29udGFpbmVyQXJ0aWZhY3QpICsgY291bnQoJGNvbnRhaW5lZEFydGlmYWN0cykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrcykgKyBjb3VudCgkb3V0cHV0RnJvbVRhc2tzKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrc19mcm9tU2xvdHMpICsgY291bnQoJG91dHB1dEZyb21UYXNrc19mcm9tU2xvdHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZnVsZmlsbGluZ1dvcmtQcm9kdWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGZpbGxpbmdXb3JrUHJvZHVjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCi0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsZWRTbG90cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGZpbGxlZFNsb3RzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZnVsZmlsbGVkU2xvdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNhdGVnb3JpZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY2F0ZWdvcmllcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250YWluZXJBcnRpZmFjdCkgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRhaW5lckFydGlmYWN0VGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY29udGFpbmVyQXJ0aWZhY3QiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250YWluZWRBcnRpZmFjdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250YWluZWRBcnRpZmFjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb250YWluZWRBcnRpZmFjdHMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4JCQkJCQkJCQkJCQotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlc3BvbnNpYmxlUm9sZXMpICsgY291bnQoJG1vZGlmeVJvbGVzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSI0MiUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlcykgPiAwIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGVzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZGlmaWVkQnlUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1vZGlmeVJvbGVzKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1vZGlmeVJvbGVzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgkJCQkJCQkKLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvdXRwdXRGcm9tVGFza3MpICsgY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrc19mcm9tU2xvdHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgKyBjb3VudCgkb3V0cHV0RnJvbVRhc2tzX2Zyb21TbG90cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iNDIlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRUb1RleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrcykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3NfZnJvbVNsb3RzKSA+IDAiPgotCQkJCQkJCQkgICAgPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrcykgPiAwIj4KLQkJCQkJCQkJCSAgPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKSA+IDAiPjxici8+PC94c2w6aWY+Ci0JCQkJCQkJCQk8dWw+CQkKLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG9wdGlvbmFsSW5wdXRUb1Rhc2tzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgPiAwIj4KLQkJCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSA+IDAiPjxici8+PC94c2w6aWY+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrc19mcm9tU2xvdHMpID4gMCI+Ci0JCQkJCQkJCQkgIDx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrcykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3MpICsgY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrc19mcm9tU2xvdHMpPiAwIj48YnIvPjwveHNsOmlmPgotCQkJCQkJCQkJPHVsPgkJCi0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvcHRpb25hbElucHV0VG9UYXNrc19mcm9tU2xvdHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RnJvbVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbVRhc2tzKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3V0cHV0RnJvbVRhc2tzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbVRhc2tzX2Zyb21TbG90cykgPiAwIj4JCi0JCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tVGFza3MpID4gMCI+PGJyLz48L3hzbDppZj4JCQkJCQkJCQotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3V0cHV0RnJvbVRhc2tzX2Zyb21TbG90cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4JCQkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGREZXNjcmlwdG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVzY3JpcHRvcnMnXS9FbGVtZW50Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29sc3BhbiIgc2VsZWN0PSInMiciLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1Rvb2xNZW50b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJ10iLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpICsgY291bnQoJGVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0iJHRvb2xNZW50b3JzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmIwNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIHRvIGFuYWJsZSB0aGUgZXh0ZWQtcmVwbGFjZSBmZWF0dXJlCi0jRW5hYmxlRXh0ZW5kUmVwbGFjZT10cnVlCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWZjYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyIKLSAgICAgICAgIGlkPSJwcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlIgotICAgICAgICAgbmFtZT0iTWV0aG9kIExpYnJhcnkgUHJvamVjdCBOYXR1cmUiPgotICAgICAgPHJ1bnRpbWU+Ci0gICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9ydW50aW1lPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJsaWJyYXJ5TWFuYWdlcnMiCi0gICAgICAgICBuYW1lPSJNZXRob2QgTGlicmFyeSBNYW5hZ2VycyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0xpYnJhcnlNYW5hZ2Vycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlbGVtZW50TGF5b3V0RXh0ZW5zaW9ucyIgbmFtZT0iRWxlbWVudCBsYXlvdXQgRXh0ZW5zaW9ucyIgc2NoZW1hPSJzY2hlbWEvZWxlbWVudExheW91dEV4dGVuc2lvbnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWxlbWVudFJlYWxpemVyRmFjdG9yeSIgbmFtZT0iRWxlbWVudFJlYWxpemVyIEZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL2VsZW1lbnRSZWFsaXplckZhY3RvcnkuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29uZmlnSGVscGVyRGVsZWdhdGVFeHQiIG5hbWU9IkNvbmZpZ0hlbHBlckRlbGVnYXRlRXh0IiBzY2hlbWE9InNjaGVtYS9jb25maWdIZWxwZXJEZWxlZ2F0ZUV4dC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC50ZXh0UmVmZXJlbmNlUmVwbGFjZXIiPgotICAgICAgPHRleHRSZWZlcmVuY2VSZXBsYWNlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5UZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsIi8+Ci0gICA8L2V4dGVuc2lvbj4gICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvTGlicmFyeU1hbmFnZXJzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvTGlicmFyeU1hbmFnZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzBmYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL0xpYnJhcnlNYW5hZ2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSIgaWQ9ImxpYnJhcnlNYW5hZ2VycyIgbmFtZT0iTWV0aG9kIExpYnJhcnkgTWFuYWdlciBDb250cmlidXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gcmVnaXN0ZXIgYSBzcGVjaWZpYyBMaWJyYXJ5IE1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgTGlicmFyeSBTZXJ2aWNlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaWJyYXJ5TWFuYWdlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxpYnJhcnlNYW5hZ2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgTGlicmFyeSBNYW5hZ2VyLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyJmx0Oy9jb2RlJmd0OyB3aXRoIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdHJhbnNsYXRhYmxlIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGxpYnJhcnkgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgbGlicmFyeSBtYW5hZ2VyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyZxdW90OyZndDsKLSAgICAgICZsdDtsaWJyYXJ5TWFuYWdlcgotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdHlwZU5hbWU9JnF1b3Q7WE1JJnF1b3Q7Jmd0OwotICAgICAgJmx0Oy9saWJyYXJ5TWFuYWdlciZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9jb25maWdIZWxwZXJEZWxlZ2F0ZUV4dC5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2NvbmZpZ0hlbHBlckRlbGVnYXRlRXh0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Mzk4MDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2NvbmZpZ0hlbHBlckRlbGVnYXRlRXh0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IiBpZD0iY29uZmlnSGVscGVyRGVsZWdhdGVFeHQiIG5hbWU9IkNvbmZpZ0hlbHBlckRlbGVnYXRlRXh0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVudGlvbiBwb2ludCBmb3IgcHJvdmlkaW5nIGV4dGVuZGVkIGltcGxlbWVudGF0aW9uIGZvciBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5Db25maWdIZWxwZXJEZWxlZ2F0ZQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb25maWdIZWxwZXJEZWxlZ2F0ZUV4dCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb25maWdIZWxwZXJEZWxlZ2F0ZUV4dCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjUKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0hlbHBlckRlbGVnYXRlCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9lbGVtZW50TGF5b3V0RXh0ZW5zaW9ucy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRMYXlvdXRFeHRlbnNpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MWY4NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRMYXlvdXRFeHRlbnNpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IiBpZD0iZWxlbWVudExheW91dEV4dGVuc2lvbnMiIG5hbWU9IkVsZW1lbnQgbGF5b3V0IEV4dGVuc2lvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgYWxsb3cgbW9kaWZ5IHRoZSBlbGVtZW50IGxheW91dCBiZWhhdmlvciBieSBwcm92aWRpbmcgbGF5b3V0IGV4dGVuc2lvbnMuIAotCi1UaGUgbGF5b3V0IGV4dGVuc2lvbiBpcyBDb25maWd1cmF0aW9uIHNwZWNpZmljIGJ5IHNwZWNpZnlpbmcgYSBhbiBNZXRob2RFbGVtZW50UHJvcGVydHkga2V5IG9mIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2hlcyB3aXRoIHRoZSBpZCBhdHRyaWJ1dGUgb2YgZWFjaCBMYXlvdXRFeHRlbnNpb24uCi0KLWkuZS4sIGlmIHRoZSBjb25maWd1cmF0aW9uIGhhcyBhIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBrZXkgdGhhdCBtYXRjaGVzIHdpdGggYW4gTGF5b3V0RXh0ZW5zaW9uLCB0aGF0IGV4dGVuc2lvbiB3aWxsIGJlIHVzZWQuCi0KLUl0IGlzIHRoZSB1c2VyJmFwb3M7cyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIGtleSBpcyB1bmlxdWUuCi0KLXRoZSBleHRlbnNpb24gY2xhc3Mgc2hvdWxkIGV4dGVuZHMgdGhlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRFeHRlbnNpb24gY2xhc3MKLQotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkxheW91dEV4dGVuc2lvbiIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJMYXlvdXRFeHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRSZWFsaXplckZhY3RvcnkuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9lbGVtZW50UmVhbGl6ZXJGYWN0b3J5LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNzJjM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRSZWFsaXplckZhY3RvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiIGlkPSJlbGVtZW50UmVhbGl6ZXJGYWN0b3J5IiBuYW1lPSJFbGVtZW50UmVhbGl6ZXIgRmFjdG9yeSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uSUVsZW1lbnRSZWFsaXplckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9BYnN0cmFjdExpYnJhcnlNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQWJzdHJhY3RMaWJyYXJ5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWU3MjQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9BYnN0cmFjdExpYnJhcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkRlYnVnVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLkxpYnJhcnlTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgTGlicmFyeSBNYW5hZ2VyLiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZgotICogSUxpYnJhcnlNYW5hZ2VyIG11c3QgYmUgYSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpYnJhcnlNYW5hZ2VyIGltcGxlbWVudHMgSUxpYnJhcnlNYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BfRElSVFkgPSAxOwotCi0JLyoqCi0JICogVGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfTElCUkFSWV9OQU1FID0gImxpYnJhcnkubmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19MSUJSQVJZX1JFR0lTVEVSX1RZUEUgPSAibGlicmFyeVJlZ2lzdGVyVHlwZSI7IAkvLyROT04tTkxTLTEkCi0JCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgbWFuYWdlZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7CQotCi0JLy8gVGhlIGRlZmF1bHQgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JLy8gQSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IG1vbml0b3IgY2hhbmdlcyB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCXByaXZhdGUgTGlzdCBsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHJlbW92ZSB0aGlzIG9uZSBzaW5jZSB0aGlzIG1heSBjYXVzZSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsKLQkvLyBBIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGRldGFjaGVkIGZyb20gdGhlIG1hbmFnZWQgbGlicmFyeS4KLQkvL3ByaXZhdGUgTGlzdCBkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gQSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IG1vbml0b3IgcmVzb3VyY2UgY2hhbmdlcyBpbiB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCXByaXZhdGUgTGlzdGVuZXJMaXN0IHJlc291cmNlQ2hhbmdlTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0JLy8gVGhlIHNhdmUgbGlicmFyeSBvcHRpb25zLgotCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zOwotCi0JLy8gSWYgdHJ1ZSwgc2tpcCBhbGwgZXZlbnQgcHJvY2Vzc2luZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBza2lwRXZlbnRQcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQkvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBub3RpZnkgdGhlIGNoYW5nZSBpbiBsaWJyYXJ5IGluc3RlYWQgb2YKLQkvLyByZWx5aW5nIG9uIHRoZSBjb21tYW5kIHN0YWNrIGxpc3RlbmVyCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tMaXN0ZW5lciBjb21tYW5kU3RhY2tMaXN0ZW5lciA9IG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiY29tbWFuZFN0YWNrQ2hhbmdlZCIsICJldmVudD0iICsgZXZlbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWlmICghc2tpcEV2ZW50UHJvY2Vzc2luZykgewotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCi0JCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gTGlicmFyeVV0aWwKLQkJCQkJCQkJLnVud3JhcCgoKENvbW1hbmRTdGFjaykgZXZlbnQuZ2V0U291cmNlKCkpCi0JCQkJCQkJCQkJLmdldE1vc3RSZWNlbnRDb21tYW5kKCkpOwotCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQkJCQkJCUFkZENvbW1hbmQgY21kID0gKEFkZENvbW1hbmQpIG1vc3RSZWNlbnRDb21tYW5kOwotCQkJCQkJCQlFT2JqZWN0IG93bmVyID0gY21kLmdldE93bmVyKCk7Ci0KLQkJCQkJCQkJLy8gbmVlZCB0byBzZW5kIG93bmVyIGNoYW5nZWQgbm90aWZpY2F0aW9uIGZvcgotCQkJCQkJCQkvLyBhbGwgZWxlbWVudCB0eXBlcwotCQkJCQkJCQkvLyAKLQkJCQkJCQkJLy8gMTU2MDI4IC0gUmVmZXJlbmNlIGZyb20gV1AgYW5kIEd1aWRlbmNlIHdhcwotCQkJCQkJCQkvLyBub3QgZGV0ZWN0ZWQKLQkJCQkJCQkJLy8gd2hlbiBkZXNlbGVjdCB0aGUgcmVsYXRlZCBlbGVtZW50IGZyb20KLQkJCQkJCQkJLy8gY29uZmlndXJhdGlvbgotCi0JCQkJCQkJCUNvbGxlY3Rpb24gb2JqcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJb2Jqcy5hZGQob3duZXIpOwotCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJCQlvYmpzKTsKLQotCQkJCQkJCQlpZiAoIShvd25lciBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0KLQkJCQkJCQkJCW9ianMgPSBtb3N0UmVjZW50Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQotCQkJCQkJCQkJLy8gVXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBpZiB0aGUKLQkJCQkJCQkJCS8vIG9iamVjdCBpcyBhIG5ld2x5IGFkZGVkIG1ldGhvZCBwYWNrYWdlLgotCQkJCQkJCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQkJCQkJCW9ianMgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCQkJCQkJLmdldENvbnRhaW5lZEVsZW1lbnRzKG93bmVyLAotCQkJCQkJCQkJCQkJCQlvYmpzKTsKLQkJCQkJCQkJCQlpZiAoIW9ianMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJCWFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKG9ianMpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQsCi0JCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbW9zdFJlY2VudENvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQlvYmpzKTsKLQkJCQkJCQkJUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBjbWQgPSAoKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIG1vc3RSZWNlbnRDb21tYW5kKTsKLQotCQkJCQkJCQkvLyBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGlmIHRoZQotCQkJCQkJCQkvLyBvYmplY3QgaXMgYSBuZXdseSBhZGRlZCBtZXRob2QgcGFja2FnZS4KLQkJCQkJCQkJaWYgKGNtZC5nZXRPd25lcigpIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQkJCQkJb2JqcyA9IExpYnJhcnlVdGlsLmdldENvbnRhaW5lZEVsZW1lbnRzKGNtZAotCQkJCQkJCQkJCQkuZ2V0T3duZXIoKSwgb2Jqcyk7Ci0JCQkJCQkJCQlpZiAoIW9ianMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24ob2Jqcyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgQ3JlYXRlQ2hpbGRDb21tYW5kKSB7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQltb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQkJfSBlbHNlIGlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQkJCW1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvLyBMaXN0ZW4gdG8gY2hhbmdlcyB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQlwcml2YXRlIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyID0gbmV3IElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkJIm5vdGlmeUNoYW5nZWQiLCAibm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWlmICghc2tpcEV2ZW50UHJvY2Vzc2luZykgewotCQkJCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6IHsKLQkJCQkJLy8gQSBtZXRob2QgZWxlbWVudCwgdHlwaWNhbGx5IGEgbWV0aG9kIHBsdWctaW4sIGhhcyBiZWVuCi0JCQkJCS8vIGFkZGVkIHRvIHRoZSBtYW5hZ2VkIGxpYnJhcnkgd2l0aG91dCB1c2luZyBhbiBlZGl0aW5nCi0JCQkJCS8vIGNvbW1hbmQuCi0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3QgdmFsdWUgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKChub3RpZmllciBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpCi0JCQkJCQkJJiYgKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKHZhbHVlKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6IHsKLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCWlmIChub3RpZmllciAhPSBudWxsKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQobm90aWZpZXIpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOiB7Ci0JCQkJCS8vIEVpdGhlciBhIG1ldGhvZCBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUKLQkJCQkJLy8gY29udGFpbmluZyBlbGVtZW50LCBvciBhIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZSBoYXMKLQkJCQkJLy8gYmVlbiBkZWxldGVkLgotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJT2JqZWN0IG9sZFZhbHVlID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQkJCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCQkJJiYgKChFT2JqZWN0KSBvbGRWYWx1ZSkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCS8vIEEgbWV0aG9kIGVsZW1lbnQgaGFzIGJlZW4gZGVsZXRlZC4KLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQob2xkVmFsdWUpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBBIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZSBoYXMgYmVlbiBkZWxldGVkLCBub3RpZnkKLQkJCQkJCS8vIHRoZSBsaXN0ZW5lcnMgdGhhdCB0aGUgY29udGFpbmluZyBtZXRob2QgZWxlbWVudCBoYXMKLQkJCQkJCS8vIGNoYW5nZWQuCi0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKG5vdGlmaWVyKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOiB7Ci0JCQkJCS8vIFR3byBvciBtb3JlIG1ldGhvZCBlbGVtZW50cyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tCi0JCQkJCS8vIHRoZSBjb250YWluaW5nIGVsZW1lbnQsIG9yIHR3IG9yIG1vcmUgbWV0aG9kIGVsZW1lbnQKLQkJCQkJLy8gcmVmZXJlbmNlIGhhdmUgYmVlbiBkZWxldGVkLgotCQkJCQlMaXN0IG9sZFZhbHVlID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE9sZFZhbHVlKCkpOwotCQkJCQlBcnJheUxpc3QgZGVsZXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmICghb2xkVmFsdWUuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRWYWx1ZS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQkJaWYgKCgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFkZWxldGVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyBUd28gb3IgbW9yZSBtZXRob2QgZWxlbWVudHMgaGF2ZSBiZWVuIGRlbGV0ZWQuCi0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzKTsKLQkJCQkJfQotCQkJCQlpZiAoIXJlbW92ZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gVHdvIG9yIG1vcmUgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlIGhhcyBiZWVuCi0JCQkJCQkvLyBkZWxldGVkLgotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCS8vIExpc3RlbiB0byBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JcHJpdmF0ZSBBZGFwdGVyIHJlc291cmNlQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm5vdGlmeUNoYW5nZWQiLCAibXNnPSIgKyBtc2cpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWlmIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRAotCQkJCQkmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShtc2cuZ2V0Tm90aWZpZXIoKSwgUFJPUF9ESVJUWSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLy8gTGlzdGVuIHRvIHBlcnNpc3RlbmNlIHJlZnJlc2ggZXZlbnRzLgotCXByaXZhdGUgSVJlZnJlc2hMaXN0ZW5lciByZWZyZXNoTGlzdGVuZXIgPSBuZXcgSVJlZnJlc2hMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaGVkKElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm5vdGlmeVJlZnJlc2hlZCIsICJldmVudD0iICsgZXZlbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWhhbmRsZVJlZnJlc2hFdmVudChldmVudCk7Ci0JCX0KLQl9OwotCi0JLy8gTGlzdGVuIHRvIHByZWZlcmVuY2Ugc3RvcmUgY2hhbmdlcy4KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBwcmVmZXJlbmNlU3RvcmVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQlMaWJyYXJ5UHJlZmVyZW5jZXMuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpKSB7Ci0JCQkJc2F2ZU9wdGlvbnMucHV0KAotCQkJCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJCQlldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdExpYnJhcnlNYW5hZ2VyKCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImluaXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmZXJlbmNlU3RvcmVDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQlmYWN0b3JpZXMpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjay4KLQkJQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSByZXNvdXJjZSBzZXQuCi0JCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBjcmVhdGVSZXNvdXJjZVNldCgpOwotCQlyZXNvdXJjZVNldC5hZGRSZWZyZXNoTGlzdGVuZXIocmVmcmVzaExpc3RlbmVyKTsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldFJlc291cmNlU2V0KHJlc291cmNlU2V0KTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBsaWJyYXJ5IHNhdmUgb3B0aW9ucy4KLQkJc2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCUxpYnJhcnlQcmVmZXJlbmNlcy5nZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbi4KLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksCi0JCQkJY29tbWFuZFN0YWNrLCByZXNvdXJjZVNldCk7Ci0KLQkJLy8gUmVnaXN0ZXIgdGhlIGVkaXRpbmcgZG9tYWluLgotCQlyZWdpc3RlckVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInNhdmVNZXRob2RMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IHRydWU7Ci0KLQkJCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKChJTGlicmFyeVJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluCi0JCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucyk7Ci0KLQkJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKSBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKQotCQkJCQkJLnNhdmVJc0RvbmUoKTsKLQotCQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShsaWJyYXJ5LCBQUk9QX0RJUlRZKTsKLQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY2FyZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjYXJkTWV0aG9kTGlicmFyeUNoYW5nZXMoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZGlzY2FyZE1ldGhvZExpYnJhcnlDaGFuZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3RyaW5nIG1zZyA9ICJsaWJyYXJ5PSIgKyBsaWJyYXJ5ICsgIiwgbWVtb3J5IG9uIGVudHJ5PSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lCi0JCQkJCQkJLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpOwotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiY2xvc2VNZXRob2RMaWJyYXJ5IiwgbXNnKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gU3RyaW5nIGxpYlBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS8vIC5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKTsKLQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCVN0cmluZyBsaWJQYXRoID0gbGliRmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpYnJhcnkKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcnMobGlicmFyeSk7Ci0KLQkJcmVtb3ZlUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gQ2xlYXIgdGhlIHRlbXAgbGF5b3V0IHJlc291cmNlcy4KLQkJTGF5b3V0UmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQotCQlTdXBwcmVzc2lvbi5jbGVhckNhY2hlZFN1cHByZXNzaW9ucygpOwotCi0JCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCi0JCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgZWRpdGluZ0RvbWFpbgotCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQlyZXNvdXJjZVNldC51bmxvYWQoKTsKLQotCQl0cnkgewotCQkJLy8gQ2xvc2UgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgZmlsZS4KLQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChsaWJQYXRoLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSAKLQotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzZXQoKTsKLQotCQkvLyBBY3RpdmF0ZXMgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgotCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOwotCi0JCWlmIChkZWJ1ZykgewotCQkJU3RyaW5nIG1zZyA9ICJsaWJyYXJ5PSIgKyBsaWJyYXJ5ICsgIiwgbWVtb3J5IG9uIGV4aXQ9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUKLQkJCQkJCQkuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSk7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJjbG9zZU1ldGhvZExpYnJhcnkiLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZ2V0TWV0aG9kTGlicmFyeSIsICJsaWJyYXJ5PSIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJzZXRNZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmICh0aGlzLmxpYnJhcnkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRoaXMubGlicmFyeS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGxpYnJhcnkpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5saWJyYXJ5ID0gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZ2V0QWRhcHRlckZhY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhbiBlZGl0aW5nIGRvbWFpbgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJnZXRFZGl0aW5nRG9tYWluIiwgImVkaXRpbmdEb21haW49IiArIGVkaXRpbmdEb21haW4pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBlZGl0aW5nIGRvbWFpbiB3aXRoIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIGFuIGVkaXRpbmcgZG9tYWluCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFZGl0aW5nRG9tYWluKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJyZWdpc3RlckVkaXRpbmdEb21haW4iLCAiZG9tYWluPSIgKyBkb21haW4pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIG1vbml0b3IgbGlicmFyeSBjaGFuZ2VzIG1hZGUgaW4gdGhlIGdpdmVuIGVkaXRpbmcKLQkJLy8gZG9tYWluLgotCQkoKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGRvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpKQotCQkJCS5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIG1vbml0b3IgY2hhbmdlcyBtYWRlIHRvIHRoZSBjb21tYW5kIHN0YWNrLgotCQkvLyBUaGlzIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBtb3N0IHJlY2VudGx5IGFmZmVjdGVkIG9iamVjdHMgaW4gdGhlCi0JCS8vIHZpZXdlci4KLQkJZG9tYWluLmdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycykgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiYWRkTGlzdGVuZXIiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWlmICghbGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJbGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0aGF0IHdhcyBhZGRlZCB0byBtb25pdG9yIGNoYW5nZXMgdG8gdGhlIG1hbmFnZWQKLQkgKiBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UKLQkJCQkJLnByaW50KHRoaXMsICJyZW1vdmVMaXN0ZW5lciIsICJsaXN0ZW5lcj0iICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0vLwkJCS8vIENhY2hlIHRoZSBsaXN0ZW5lciBhbmQgcmVtb3ZlIGl0IGp1c3QgYmVmb3JlIGRpc3BhdGNoaW5nIHRoZQotLy8JCQkvLyBsaWJyYXJ5IGNoYW5nZWQgZXZlbnRzLgotLy8JCQlpZiAoIWRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0vLwkJCQlkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0vLwkJCX0KLQkJCi0JCWlmKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAobGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMpIHsKLQkJCQlsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgcmVzb3VyY2UgY2hhbmdlcyBpbiB0aGUgbWFuYWdlZCBtZXRob2QKLQkgKiBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkiYWRkUHJvcGVydHlMaXN0ZW5lciIsICJsaXN0ZW5lcj0iICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgcmVzb3VyY2UgY2hhbmdlcyBpbiB0aGUKLQkgKiBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkicmVtb3ZlUHJvcGVydHlMaXN0ZW5lciIsICJsaXN0ZW5lcj0iICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIGxpc3RlbmluZyB0byBjb21tYW5kIHByb2Nlc3Npbmcgb24gYSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJInN0YXJ0TGlzdGVuaW5nVG8iLCAiY29tbWFuZFN0YWNrPSIgKyBjb21tYW5kU3RhY2spOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgbGlzdGVuaW5nIHRvIGNvbW1hbmQgcHJvY2Vzc2luZyBvbiBhIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJzdG9wTGlzdGVuaW5nVG8iLCAiY29tbWFuZFN0YWNrPSIgKyBjb21tYW5kU3RhY2spOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIGxpc3RlbmluZyB0byBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBzZW50IGZyb20gYW4gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkic3RhcnRMaXN0ZW5pbmdUbyIsICJhZGFwdGVyRmFjdG9yeT0iICsgYWRhcHRlckZhY3RvcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWFkYXB0ZXJGYWN0b3J5LmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgbGlzdGVuaW5nIHRvIGNoYW5nZSBub3RpZmljYXRpb25zIHNlbnQgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJInN0b3BMaXN0ZW5pbmdUbyIsICJhZGFwdGVyRmFjdG9yeT0iICsgYWRhcHRlckZhY3RvcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIG1ldGhvZCBlbGVtZW50IGZyb20gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGd1aWQKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgZWxlbWVudCdzIEdVSUQuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBlbGVtZW50IG9mIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChTdHJpbmcgZ3VpZCkgewotLy8gdGhpcyBwcmludGVkIG91dCB0b28gbXVjaCB1c2VsZXNzIGluZm9ybWF0aW9uLCBjb21tZW50IG91dAotLy8JCWlmIChkZWJ1ZykgewotLy8JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRNZXRob2RFbGVtZW50IiwgImd1aWQ9IiArIGd1aWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCQl9Ci0KLQkJdHJ5IHsKLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgbGlicmFyeQotCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KGd1aWQpOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdGgpIHsKLQkJCS8vIExvZyBlcnJvciBoZXJlCi0JCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWxhdGl2ZSBVUkkgb2YgYSBtZXRob2QgZWxlbWVudCBpbiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSByZWxhdGl2ZSBVUkkKLQkgKi8KLQlwdWJsaWMgVVJJIGdldEVsZW1lbnRSZWxhdGl2ZVVSSShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJnZXRFbGVtZW50UmVsYXRpdmVVUkkiLCAiZWxlbWVudD0iICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsaWJyYXJ5LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlVUkkgbGlicmFyeVVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCVVSSSBlbGVtZW50VVJJID0gZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCQlyZXR1cm4gZWxlbWVudFVSSS5kZXJlc29sdmUobGlicmFyeVVSSSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaXMgcmVhZCBvbmx5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQgb25seQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImlzTWV0aG9kTGlicmFyeVJlYWRPbmx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVVSSSBsaWJyYXJ5VVJJID0gbGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJaWYgKGxpYnJhcnlVUkkuaXNGaWxlKCkpIHsKLQkJCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5VVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCXJldHVybiBsaWJyYXJ5WE1JRmlsZS5leGlzdHMoKSAmJiAhbGlicmFyeVhNSUZpbGUuY2FuV3JpdGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgaGFzCi0JICogICAgICAgICBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGhhcyBhbnkgdW5yZXNvbHZlZCBwcm94eS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGhhcyBhbgotCSAqICAgICAgICAgdW5yZXNvbHZlZCBwcm94eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNVbnJlc29sdmVkUHJveHkoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaGFzVW5yZXNvbHZlZFByb3h5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCXJldHVybiByZXNvdXJjZVNldC5oYXNVbnJlc29sdmVkUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcwotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyB0aGF0IGhhdmUgcmVsb2FkZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiByZWxvYWRSZXNvdXJjZXMoZmluYWwgQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJBYnN0cmFjdExpYnJhcnlNYW5hZ2VyLnJlbG9hZFJlc291cmNlcygpOiBTVEFSVCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWZpbmFsIEFycmF5TGlzdCByZWxvYWRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCXJlbG9hZGVkUmVzb3VyY2VzLmFkZEFsbChkb1JlbG9hZFJlc291cmNlcyhyZXNvdXJjZXMpKTsKLQotCQkJCX0KLQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwKLQkJCQkJCW5ldyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUobGlicmFyeSksCi0JCQkJCQlJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJcmV0dXJuIHJlbG9hZGVkUmVzb3VyY2VzOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkFic3RyYWN0TGlicmFyeU1hbmFnZXIuZG9SZWxvYWRSZXNvdXJjZXMoKTogRU5EIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBkb1JlbG9hZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInJlbG9hZFJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiByZXNvdXJjZXMgdG8gcmVsb2FkIGNvbnRhaW5zIGFueSBlbGVtZW50cyBjYWNoZWQgaW4KLQkJLy8gTGlicmFyeVNlcnZpY2UKLQkJLy8gdG8gdXBkYXRlIHRoZW0KLQkJLy8KLQkJTGlicmFyeVNlcnZpY2UgbGliU3ZjID0gKExpYnJhcnlTZXJ2aWNlKSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpOwotCQlSZXNvdXJjZSBjdXJyZW50TGliUmVzb3VyY2UgPSBudWxsOwotCQlJTGlicmFyeU1hbmFnZXIgY3VycmVudExpYk1nciA9IG51bGw7Ci0JCVJlc291cmNlIGN1cnJlbnRDb25maWdSZXNvdXJjZSA9IG51bGw7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IG51bGw7Ci0JCUxpc3QgY29uZmlnUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCWlmIChlID09IGxpYlN2Yy5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSB7Ci0JCQkJY3VycmVudExpYk1nciA9IGxpYlN2Yy5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQljdXJyZW50TGliUmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJCX0gZWxzZSBpZiAoZSA9PSBsaWJTdmMuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSkgewotCQkJCWN1cnJlbnRDb25maWdSZXNvdXJjZSA9IHJlc291cmNlOwotCQkJCWN1cnJlbnRDb25maWcgPSBsaWJTdmMuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQljb25maWdSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQljb25maWdzLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgbGlicmFyeQotCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlDb2xsZWN0aW9uIHJlbG9hZGVkUmVzb3VyY2VzID0gcmVzb3VyY2VTZXQucmVsb2FkUmVzb3VyY2VzKHJlc291cmNlcyk7Ci0JCWlmICghcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoY3VycmVudExpYlJlc291cmNlICE9IG51bGwgfHwgY3VycmVudENvbmZpZ1Jlc291cmNlICE9IG51bGwpIHsKLQkJCQkvLyB1cGRhdGUgY2FjaGVkIGVsZW1lbnRzIGluIExpYnJhcnlTZXJ2aWNlIGFuZCB0aGlzIGxpYnJhcnkKLQkJCQkvLyBtYW5hZ2VyCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWxvYWRlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChyZXNvdXJjZSA9PSBjdXJyZW50TGliUmVzb3VyY2UpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJCQlNZXRob2RMaWJyYXJ5IG5ld0xpYiA9IChNZXRob2RMaWJyYXJ5KSBlOwotCQkJCQkJCWxpYlN2Yy5zZXRDdXJyZW50TWV0aG9kTGlicmFyeShuZXdMaWIpOwotCQkJCQkJCWlmIChjdXJyZW50TGliTWdyIGluc3RhbmNlb2YgQWJzdHJhY3RMaWJyYXJ5TWFuYWdlcikgewotCQkJCQkJCQlsaWJTdmMucmVtb3ZlTGlicmFyeU1hbmFnZXIoY3VycmVudExpYk1ncik7Ci0JCQkJCQkJCSgoQWJzdHJhY3RMaWJyYXJ5TWFuYWdlcikgY3VycmVudExpYk1ncikKLQkJCQkJCQkJCQkudXBkYXRlTWV0aG9kTGlicmFyeShuZXdMaWIpOwotCQkJCQkJCQlsaWJTdmMuc2V0TGlicmFyeU1hbmFnZXIoY3VycmVudExpYk1ncik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZXNvdXJjZSA9PSBjdXJyZW50Q29uZmlnUmVzb3VyY2UpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJCQkvLyByZW1vdmUgY29uZmlnIG1hbmFnZXIgb2Ygb2xkIGN1cnJlbnQgY29uZmlnCi0JCQkJCQkJLy8KLQkJCQkJCQlsaWJTdmMucmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoY3VycmVudENvbmZpZyk7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZTsKLQkJCQkJCQlsaWJTdmMuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICghY29uZmlnUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJaW50IGlkID0gY29uZmlnUmVzb3VyY2VzLmluZGV4T2YocmVzb3VyY2UpOwotCQkJCQkJaWYgKGlkICE9IC0xKSB7Ci0JCQkJCQkJLy8gcmVtb3ZlIGNvbmZpZyBtYW5hZ2VyIG9mIG9sZCBjb25maWcKLQkJCQkJCQkvLwotCQkJCQkJCWxpYlN2YwotCQkJCQkJCQkJLnJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VyKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzCi0JCQkJCQkJCQkJCS5nZXQoaWQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkJU3VwcHJlc3Npb24uY2xlYW5VcCgpOwotCQl9Ci0JCXJldHVybiByZWxvYWRlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TGliCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBuZXdMaWIpIHsKLQkJbGlicmFyeSA9IG5ld0xpYjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb25zIHVzZWQgZm9yIHNhdmluZyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIHNhdmUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZ2V0U2F2ZU9wdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHNhdmVPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgbWV0aG9kIHBsdWctaW4gdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBsdWdpbihmaW5hbCBNZXRob2RQbHVnaW4gcGx1Z2luKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJhZGRNZXRob2RQbHVnaW4iLCAicGx1Z2luPSIgKyBwbHVnaW4pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCS8vIFRoaXMgb3BlcmF0aW9uIHdpbGwgY2F1c2UgYW4gVUkgdXBkYXRlLiBJdCBtdXN0IGJlIGV4ZWN1dGVkIGluCi0JCS8vIHRoZSBtYWluIFVJIHRvIGFvaWQgYW4gSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbi4KLQkJZmluYWwgRXhjZXB0aW9uW10gZXhjZXB0aW9ucyA9IG5ldyBFeGNlcHRpb25bMV07Ci0KLQkJdHJ5IHsKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4pOwotCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcwotCQkJCQkJCS5nZXRMaWJyYXJ5UGVyc2lzdGVyKGdldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkpCi0JCQkJCQkJLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShsaWJyYXJ5LmVSZXNvdXJjZSgpKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJZXhjZXB0aW9uc1swXSA9IGU7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCWlmIChleGNlcHRpb25zWzBdICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihleGNlcHRpb25zWzBdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgbGlicmFyeSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwcmVmZXJlbmNlU3RvcmVDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmU3RvcmVXcmFwcGVyID0gTGlicmFyeVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQotCQkJaWYocHJlZlN0b3JlV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJcHJlZlN0b3JlV3JhcHBlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VTdG9yZUNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCWlmIChsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0JCQlsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5jbGVhcigpOwotCQl9Ci0KLS8vCQlpZiAoZGV0YWNoZWRMaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0vLwkJCWRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuY2xlYXIoKTsKLS8vCQl9Ci0KLQkJaWYgKHJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLQkJCXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCX0KLQotCQllZGl0aW5nRG9tYWluID0gbnVsbDsKLQkJbGlicmFyeSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBhcmd1bWVudHMgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5pbmdFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50L2NvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBlbGVtZW50Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrRWxlbWVudENyZWF0aW9uQXJndW1lbnRzKAotCQkJTWV0aG9kRWxlbWVudCBjb250YWluaW5nRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoY29udGFpbmluZ0VsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gVE9ETzogQ2hlY2sgZm9yIGlsbGVnYWwgY2hhcmFjdGVycy4KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgcGVyc2lzdGVuY2UgcmVmcmVzaCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGEgcmVmcmVzaCBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlZnJlc2hFdmVudChJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaGFuZGxlUmVmcmVzaEV2ZW50IiwgInJlZnJlc2hlZFJlc291cmNlcz0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIGV2ZW50LmdldFJlZnJlc2hlZFJlc291cmNlcygpKTsKLQkJfQotCi0JCWlmICghZXZlbnQuZ2V0VW5sb2FkZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5jbGVhblVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhbGwgbGlicmFyeSBjaGFuZ2VkIGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBjaGFuZ2UgdGhhdCBoYXMgb2NjdXJyZWQKLQkgKiBAcGFyYW0gY2hhbmdlZEVsZW1lbnRzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGVsZW1lbnRzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhmaW5hbCBpbnQgb3B0aW9uLAotCQkJZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0KLQkJLy8gc2VuZCBub3RpZmljYXRpb24gbWlnaHQgYmUgY2F1c2luZyBsaXN0ZW5lcnMgYWRkZWQgb3IgcmVtb3ZlZAotCQkvLyB0byBhdm9pZCBjb25jdXJyZW50IHVwZGF0ZSBvZiB0aGUgbGlzdGVuZXIgbGlzdCwgCi0JCS8vIHdlIGtlZXAgdGhlIGxpc3Qgb2YgbGlzdGVuZXJzIHByb2Nlc3NlZAotCQkvLyBhbmQgY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgcmVwZWF0ZWRseQotCQlIYXNoU2V0IHByb2Nlc3NlZCA9IG5ldyBIYXNoU2V0KCk7CQotCQl3aGlsZSAoX2RvTm90aWZ5TGlzdGVuZXJzKG9wdGlvbiwgY29sbGVjdGlvbiwgcHJvY2Vzc2VkKSApIHsKLQkJCTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyBhbGwgbGlicmFyeSBjaGFuZ2VkIGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBjaGFuZ2UgdGhhdCBoYXMgb2NjdXJyZWQKLQkgKiBAcGFyYW0gY2hhbmdlZEVsZW1lbnRzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGVsZW1lbnRzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYW55IGxpc3RlbmVyIGlzIHByb2Nlc3NlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBfZG9Ob3RpZnlMaXN0ZW5lcnMoZmluYWwgaW50IG9wdGlvbiwKLQkJCWZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgZmluYWwgQ29sbGVjdGlvbiBwcm9jZXNzZWQpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJub3RpZnlMaXN0ZW5lcnMiLCAib3B0aW9uPSIgKyBvcHRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQkKLQkJdHJ5IHsKLS8vCQkJLy8gUmVtb3ZlIHRoZSBjaGFuZ2VkIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBkZXR0YWNoZWQuCi0vLwkJCWlmIChkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0Ci0vLwkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IGwgPSBpdC5uZXh0KCk7Ci0vLwkJCQkJaWYgKGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNvbnRhaW5zKGwpKSB7Ci0vLwkJCQkJCWxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQlkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNsZWFyKCk7Ci0vLwkJCX0KLQotCQkJLy8gTm90aWZ5IHRoZSBjaGFuZ2VkIGxpc3RlbmVycy4KLQkJCS8vIE5vdGU6IG1vcmUgY2hhbmdlZCBsaXN0ZW5lcnMgbWF5IGJlIGFkZGVkIHdoaWxlIGVhY2ggbGlzdGVuZXIgaXMKLQkJCS8vIGJlaW5nIG5vdGlmaWVkLiBIb3dldmVyLAotCQkJLy8gdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2hpY2ggZG9lcyBubyBoYXJtLgotCQkJCi0JCQkKLQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlmaW5hbCBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIpIGl0Lm5leHQoKTsKLQotCQkJCWlmICggKGxpc3RlbmVyICE9IG51bGwpICYmICFwcm9jZXNzZWQuY29udGFpbnMobGlzdGVuZXIpICkgewotCQotCQkJCQkvLyBrZWVwIHRoZSBwcm9jZXNzZWQgb25lcwotCQkJCQlwcm9jZXNzZWQuYWRkKGxpc3RlbmVyKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCQotCQkJCQkvLyBTaW5jZSB0aGlzIG1heSB0cmlnZ2VyIGFuIHVwZGF0ZSB0byB0aGUgVUksIHRoZQotCQkJCQkvLyBub3RpZmljYXRpb24gbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgVUkgdGhyZWFkIHRvIGF2b2lkCi0JCQkJCS8vIGdldHRpbmcgYW4gSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbi4gVGhlCi0JCQkJCS8vIG5vdGlmaWNhdGlvbiBtdXN0IGFsc28gYmUgZXhlY3V0ZWQgaW4gc3luYyBtb2RlIHRvCi0JCQkJCS8vIGd1cmFudGVlIGRlbGl2ZXJ5IG9mIHRoZSBldmVudCBiZWZvcmUgYSBsaXN0ZW5lciBpcwotCQkJCQkvLyBkaXNwb3NlZC4KLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlEZWJ1Z1RyYWNlCi0JCQkJCQkJCQkJLnByaW50KAotCQkJCQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJCQkJCSJub3RpZnlMaXN0ZW5lcnMiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlDaGFuZ2VkKG9wdGlvbiwgY29sbGVjdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5TGlzdGVuZXJzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JCQotCX0KLQotCS8qKgotCSAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlZCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlJZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGZpbmFsIE9iamVjdCBzb3VyY2UsIGZpbmFsIGludCBwcm9wZXJ0eUlkKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZmlyZVByb3BlcnR5Q2hhbmdlIiwgInNvdXJjZT0iICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlPYmplY3RbXSBhcnJheSA9IHJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lciA9IChJUHJvcGVydHlMaXN0ZW5lcikgYXJyYXlbaV07Ci0KLQkJCS8vIFRoaXMgb3BlcmF0aW9uIHdpbGwgY2F1c2UgYW4gVUkgdXBkYXRlLiBJdCBtdXN0IGJlIGV4ZWN1dGVkIGluCi0JCQkvLyB0aGUgbWFpbiBVSSB0byBhb2lkIGFuIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24uCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCQkJCSJmaXJlUHJvcGVydHlDaGFuZ2UiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKHNvdXJjZSwgcHJvcGVydHlJZCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVzb3VyY2UgY2hhbmdlZCBsaXN0ZW5lciB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZiAobGlicmFyeSA9PSBudWxsIHx8IGxpYnJhcnkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucygKLQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWNvbmZpZy5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucygKLQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQkJY29uZmlnLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSByZXNvdXJjZSBjaGFuZ2VkIGxpc3RlbmVyIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5Ci0JICogcmVzb3VyY2UgYW5kIG1ldGhvZCBwbHVnLWlucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWNvbmZpZy5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGxpYnJhcnkgIT0gbnVsbCA/IGxpYnJhcnkuZVJlc291cmNlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBvZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+amF2YS5uZXQuVVJJPC9jb2RlPgotCSAqLwotCXB1YmxpYyBqYXZhLm5ldC5VUkkgZ2V0TWV0aG9kTGlicmFyeVVSSSgpIHsKLQkJUmVzb3VyY2Ugc2F2ZWRSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAoc2F2ZWRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSBzYXZlZFJlc291cmNlLmdldFVSSSgpOwotCQkJdHJ5IHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0UGFyZW50RmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5ldyBwYWNrYWdlcyBpbnRvIHRoZSBjb25maWd1cmF0aW9ucyBpZiB0aGUgcGFyZW50IGlzIGluIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKENvbGxlY3Rpb24gbmV3b2JqcykgewotCQlpZiAobmV3b2JqcyA9PSBudWxsIHx8IG5ld29ianMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQotCQl0cnkgewotCQkJRU9iamVjdCBlLCBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3b2Jqcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLQkJCQkJCSYmICgocGFyZW50ID0gZS5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJCQkmJiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkpIHsKLQkJCQkJT2JqZWN0IGNvbmZpZ3MgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwYXJlbnQpCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQkJCQlpZiAoY29uZmlncyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRjb25maWcgPSAoKExpc3QpIGNvbmZpZ3MpLml0ZXJhdG9yKCk7IGl0Y29uZmlnCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJLy8gcGtncy5hZGQoZSk7Ci0JCQkJCQkJCWhlbHBlcgotCQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJCQkJCQkJCQllLCAtMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQloZWxwZXIuc2F2ZSgpOwotCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiBsaWJyYXJ5IHBlcnNpc3RlciB0byBiZSB1c2VkIGluIHRoaXMgbGlicmFyeSBtYW5hZ2VyCi0JICogCi0JICogQHJldHVybiB0aGUgbGlicmFyeSBwZXJzaXN0ZXIgdHlwZQotCSAqIEBzZWUgU2VydmljZXMjWE1JX1BFUlNJU1RFTkNFX1RZUEUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpOwkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWdIZWxwZXJEZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ0hlbHBlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWU5Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ0hlbHBlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5QcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0Lkh0bWxCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWJzdHJhY3RFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5FbGVtZW50TGF5b3V0RXh0ZW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLlN1bW1hcnlQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogRGVsZWdhdGUgY2xhc3MgdXNlZCBpbiBDb25maWd1cmF0aW9uSGVscGVyCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ0hlbHBlckRlbGVnYXRlIHsKLQotCQotCS8qKgotCSAqIFRlc3QgaWYgcGtnIGlzIGEgc3lzdGVtIHBhY2thZ2Ugb2YgcGx1Z2luCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBwa2cKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1QYWNrYWdlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbikuY29udGFpbnMocGtnKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdWNlU2V0LAotCQkJTGlzdDxPcHBvc2l0ZUZlYXR1cmU+IG9wcG9zaXRlRmVhdHVyZXMsICBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU2V0PFN0cmluZz4gR1VJRHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCUdVSURzLmFkZChlbGVtZW50LmdldEd1aWQoKSk7Ci0JCXJlc291Y2VTZXQubG9hZE9wcG9zaXRlRmVhdHVyZXMob3Bwb3NpdGVGZWF0dXJlcywgR1VJRHMpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGNvbmZpZyk7Ci0JCUlMaWJyYXJ5TWFuYWdlciBsaWJyYXJ5TWFuYWdlciA9IGxpYnJhcnkgPT0gbnVsbD8gbnVsbCA6IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmIChsaWJyYXJ5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZykKLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkRhdGEoKQotCQkJCQkJCQkuaXNPd25lclNlbGVjdGVkKGVsZW1lbnQsIGNoZWNrU3VidHJhY3RlZCk7Ci0JCX0KLQkJCQkKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGNvbmZpZyA9PSBudWxsIHx8IENvbmZpZ3VyYXRpb25IZWxwZXIuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gc2luY2UgVU1BIDEuMC40LCBjb25maWd1cmF0aW9uIGNhbiBoYXZlIGFkZGVkIGNhdGVnb3JpZXMgCi0JCS8vIGFuZCBzdWJ0cmFjdGVkIGNhdGVnb3JpZXMuIFRoZSBvcmRlciBvZiBmaWx0ZXJpbmcgaXM6Ci0JCS8vIDEuIGFueSBlbGVtZW50IGluIHRoZSBzdWJ0cmFjdGVkIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGV4Y2x1ZGVkCi0JCS8vIDIuIGFueSBlbGVtZW50IGluIHRoZSBhZGRlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBpbmNsdWRlZAotCQkvLyAzLiBhbnkgZWxlbWVudCBub3QgaW4gdGhlIHNlbGVjdGVkIHBhY2thZ2Ugb3IgcGx1Z2luIHNob3VsZCBiZSBleGNsdWRlZC4KLQkJCi0JCWlmICggY2hlY2tTdWJ0cmFjdGVkICkgewotCQkJLy8gZmlyc3QgY2hlY2sgc3VidHJhY3RlZCBlbGVtZW50cwotCQkJTGlzdCBzdWJ0cmFjdGVkQ2F0ZWdvcmllcyA9IGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJCWlmICggc3VidHJhY3RlZENhdGVnb3JpZXMuc2l6ZSgpID4gMCApIHsKLQkJCQlmb3IgKCBJdGVyYXRvciBpdCA9IHN1YnRyYWN0ZWRDYXRlZ29yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IChDb250ZW50Q2F0ZWdvcnkpaXQubmV4dCgpOwotCQkJCQlpZiAoIGNjID09IGVsZW1lbnQgKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIG5lZWQgdG8gY2hlY2sgYWxsIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMgYW5kIHN1Yi1jYXRlZ29yaWVzCi0JCQkJCS8vIHdlIG5lZWQgdG8gaGF2ZSBhbiBlZmZpY2llbnQgYWxnb3JpdGhtIGZvciB0aGlzIGNoZWNraW5nLgotCQkJCQkvLyBmb3Igbm93LCBvbmx5IGNoZWNrIHRoZSBjdXN0b20gY2F0ZWdvcnkncyBjYXRlZ29yaXNlZCBlbGVtZW50cwotCQkJCQkvLyBUT0RPLiBKaW5odWEgWGksIDExLzI3LzIwMDYKLQkJCQkJaWYgKCBjYyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICkgewotCQkJCQkJaWYgKCAoKEN1c3RvbUNhdGVnb3J5KWNjKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY29udGFpbnMoZWxlbWVudCkgKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gVE9ETywgbm90IGltcGxlbWVudGVkIHlldAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUT0RPLCBpc093bmVyU2VsZWN0ZWQ6IG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGVuIGNoZWNrIGFkZGVkIGNhdGVnb3JpZXMKLQkJLy8gVE9ETwotCQkKLQkJLy8gZWxlbWVudHMgYmV5b25kIGNvbmZpZ3VyYXRpb24gc2NvcGUgc2hvdWxkIGJlIGFsd2F5cyB2aXNpYmxlCi0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpCi0JCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJcmV0dXJuIChwbHVnaW5zICE9IG51bGwpICYmIHBsdWdpbnMuY29udGFpbnMoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB0aGUgb3duZXJwcm9jZXNzIGNhbid0IHNob3csIGNhbid0IGFjY2VwdAotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpICgoQWN0aXZpdHkpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwgJiYgYmFzZSAhPSBlbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgb3duaW5nUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKTsKLQkJCQkJaWYgKCBvd25pbmdQcm9jICE9IG51bGwgJiYgb3duaW5nUHJvYyAhPSBlbGVtZW50IAotCQkJCQkJCSYmICFDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKG93bmluZ1Byb2MsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlFT2JqZWN0IHBrZyA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0KLQkJCS8vIGFjY2VwdCBnbG9iYWwgcGFja2FnZSBpZiB0aGUgcGx1Z2luIGlzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQlpZiAocGtnIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGtnKSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhwbHVnaW4sIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKTsKLQkJCX0KLQotCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCWlmIChwa2dzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIHBlciBQaG9uZydzIHJlcXVlc3QsIGZvciBQcm9jZXNzUGFja2FnZSwgY2hlY2sgdGhlCi0JCQkvLyBQcm9jZXNzQ29tcG9uZW50IHBhcmVudCBpbnN0ZWFkCi0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQl3aGlsZSAoKHBrZyAhPSBudWxsKSAmJiAhKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQkJCQkmJiAhcGtncy5jb250YWlucyhwa2cpKSB7Ci0JCQkJCXBrZyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpZiBwYWNrYWdlIG5vdCBzZWxlY3RlZCwgcmV0dXJuIGZhbHNlCi0JCQlpZiAoKHBrZyA9PSBudWxsKSB8fCAhcGtncy5jb250YWlucyhwa2cpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhNYXAgbWFwLCBMaXN0IG9wcG9zaXRlRmVhdHVyZXMsIFNldCBkZWxldGVkR1VJRHMpIHsKLQkJaW50IG1heCA9IG9wcG9zaXRlRmVhdHVyZXMuc2l6ZSgpIC0gMTsKLQkJaWYgKG1heCA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEhhc2hTZXQobWFwLnZhbHVlcygpKTsKLQkJSGFzaFNldCBsb2FkZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqZWN0ID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCk7Ci0JCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSk7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJYm9vbGVhbiByZXNvbHZlID0gZmFsc2U7Ci0JCQkJCQkJCQljaGVja19yZXNvbHZlOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkuYmFzaWNJdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IKLQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYgKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkKLQkJCQkJCQkJCQkJCQkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQkJcmVzb2x2ZSA9IHRydWU7Ci0JCQkJCQkJCQkJCQlicmVhayBjaGVja19yZXNvbHZlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc29sdmUpIHsKLQkJCQkJCQkJCQlDb2xsZWN0aW9uPE9iamVjdD4gZGVsZXRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Ci0JCQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCQlPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgZGVsZXRlZEdVSURzLmNvbnRhaW5zKCgoTWV0aG9kRWxlbWVudCkgbykuZ2V0R3VpZCgpKSkgewotCQkJCQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlmb3IgKE9iamVjdCBlIDogZGVsZXRlZEVsZW1lbnRzKSB7Ci0JCQkJCQkJCQkJCWlmKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQkJCQkJbXJFT2JqZWN0Lm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgZSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgZSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9CQkJCQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGVGZWF0dXJlLCBmYWxzZSk7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGUgPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJCQkJCWlmIChlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQlpZiAoZGVsZXRlZEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJCQkJCU9iamVjdCBvID0gZWxlbWVudC5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3Qub3Bwb3NpdGVBZGQob3Bwb3NpdGVGZWF0dXJlLCBvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEhhc2hTZXQobWFwLnZhbHVlcygpKTsKLQkJCWVsZW1lbnRzLnJlbW92ZUFsbChsb2FkZWRFbGVtZW50cyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUh0bWwoT2JqZWN0IHJhd19lbGVtZW50LCBIdG1sQnVpbGRlciBodG1sQnVpbGRlcikgewotCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBudWxsOwotCQlTdHJpbmcgZmlsZV91cmwgPSAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKHJhd19lbGVtZW50KTsKLQkJaWYgKCByYXdfZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciApIHsKLQkJCUFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcilyYXdfZWxlbWVudDsKLQkJCU9iamVjdCBwcm9jID0gd3JhcHBlci5nZXRUb3BJdGVtKCk7Ci0JCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIHByb2MgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldFBhdGgod3JhcHBlcik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4odG9wSXRlbSk7Ci0JCQkJbGF5b3V0ID0gaHRtbEJ1aWxkZXIuZ2V0TGF5b3V0TWFuYWdlcigpCi0JCQkJCS5jcmVhdGVMYXlvdXQoKE1ldGhvZEVsZW1lbnQpZWxlbWVudCwgCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcylwcm9jLCBwYXRoKTsKLQkJCQlmaWxlX3VybCA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQkJfQotCQl9IGVsc2UgaWYgKHJhd19lbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgewotCQkJUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKSByYXdfZWxlbWVudDsKLQkJCWxheW91dCA9IG5ldyBTdW1tYXJ5UGFnZUxheW91dChodG1sQnVpbGRlci5nZXRMYXlvdXRNYW5hZ2VyKCksCi0JCQkJCXByb3ZpZGVyLmdldFByYWN0aWNlKCksIHByb3ZpZGVyLmdldFRleHQobnVsbCksCi0JCQkJCXByb3ZpZGVyLmdldFRleHQobnVsbCksIChMaXN0KSBwcm92aWRlci5nZXRDaGlsZHJlbihudWxsKSwKLQkJCQkJcHJvdmlkZXIuZ2V0VGV4dChudWxsKSk7Ci0JCQkoKFN1bW1hcnlQYWdlTGF5b3V0KSBsYXlvdXQpLnNldEh0bWxCdWlsZGVyKGh0bWxCdWlsZGVyKTsKLQkJCWZpbGVfdXJsID0gaHRtbEJ1aWxkZXIuZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlmaWxlX3VybCA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbCgoTWV0aG9kRWxlbWVudCllbGVtZW50KTsKLQkJfQotCQkKLQkJaWYgKCBmaWxlX3VybCA9PSBudWxsICkgewotCQkJZmlsZV91cmwgPSAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gb24gbGludXgsIHRoZSBmaWxlIHBhdGggbmVlZCB0byBiZSBzcGVjaWZpZWQgYXMgZmlsZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyB1cmwKLQkJLy8gYW5kIGNhc3VpZ24gZW5jb2RpbmcvZGVjb2RpbmcgaXNzdWUKLQkJLy8gTGludXg6IENvbmZpZ3VyYXRpb24gbmFtZXMgY29udGFpbmluZyBhY2NlbnRlZCBjaGFyYWN0ZXJzIGNhbm5vdCBiZSBicm93c2VkLgotCQllbHNlIHsJCQkKLQkJCWlmICghU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpICYmICFmaWxlX3VybC5zdGFydHNXaXRoKCJmaWxlOi8vIikgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJIWZpbGVfdXJsLmVxdWFscygiYWJvdXQ6YmxhbmsiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWZpbGVfdXJsID0gImZpbGU6Ly8iICsgZmlsZV91cmw7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJLy8gQnVnIDIwMTMzNSAtIFJlZnJlc2ggZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgZm9yIHByb2Nlc3MgcGFnZXMgaW4gYnJvd3NpbmcgbW9kZQotCQkJLy8gbmVlZCB0byBhcHBlbmQgdGhlIHF1ZXJ5IHN0cmluZwotCQkJaWYgKCBsYXlvdXQgaW5zdGFuY2VvZiBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0ICkgewotCQkJCWZpbGVfdXJsICs9ICgoQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dClsYXlvdXQpLmdldFF1ZXJ5U3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVfdXJsOwotCX0KLQkKLQkvL1Nob3VsZCBiZSBvdmVycmlkZW4gYnkgc3ViIGNsYXNzZXMKLQlwdWJsaWMgRWxlbWVudExheW91dEV4dGVuZGVyIG5ld0VsZW1lbnRMYXlvdXRFeHRlbmRlcihBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGF5b3V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWJ1Z0R1bXAoU3RyaW5nIG1zZykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiAiICsgZ2V0Q2xhc3MoKSArICIuZGVidWdEdW1wOiAiICsgbXNnKTsJLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2RiZDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gYWxyZWFkeSBleGlzdHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24gZXh0ZW5kcwotCQlMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLAotCQkJVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihlcnJvck1zZywgcm9vdENhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OWQ4ODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlN1cHBvcnRpbmdFbGVtZW50RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkRlcGVuZGVuY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogTWFuYWdlcyBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIHsKLQotCS8vIElmIHRydWUsIGdlbmVyYXRlIGRlYnVnIHRyYWNlcy4KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JLy8gVGhlIG1hbmFnZWQgbWV0aG9kIGNvbmZpZ3VyYWl0b24uCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQotCS8vIFRoZSBtYW5hZ2VkIGNvbmZpZ3VyYWl0b24gZGF0YS4KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25EYXRhIGNvbmZpZ0RhdGE7Ci0JCi0JcHJpdmF0ZSBTdXBwb3J0aW5nRWxlbWVudERhdGEgc3VwcG9ydGluZ0VsZW1lbnREYXRhOwotCQotCXByaXZhdGUgQ29uZmlndXJhdGlvblByb3BlcnRpZXMgY29uZmlnUHJvcHM7Ci0KLQkvLyBUaGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeSBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQotCS8vIFRoZSBsaWJyYXJ5IG1hbmFnZXIgZm9yIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBJTGlicmFyeU1hbmFnZXIgbGlicmFyeU1hbmFnZXI7Ci0KLQkvLyBUaGUgZGVwZW5kZW5jeSBtYW5hZ2VyLgotCXByb3RlY3RlZCBEZXBlbmRlbmN5TWFuYWdlciBkZXBlbmRlbmN5TWFuYWdlcjsKLQotCS8vIFRoZSBsYXlvdXQgbWFuYWdlci4KLQlwcm90ZWN0ZWQgRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlcjsKLQotCS8vIFRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmU7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWZjcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uTWFuYWdlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJCi0JCXN1cHBvcnRpbmdFbGVtZW50RGF0YSA9IG5ldyBTdXBwb3J0aW5nRWxlbWVudERhdGEoY29uZmlnKTsKLQkJY29uZmlnRGF0YSA9IENvbmZpZ3VyYXRpb25EYXRhLm5ld0NvbmZpZ3VyYXRpb25EYXRhKGNvbmZpZyk7Ci0JCQkJCi0JCWNvbmZpZ1Byb3BzID0gbmV3IENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKGNvbmZpZyk7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKGNvbmZpZywgY29uZmlnUHJvcHMpOwotCi0JCWxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kTGlicmFyeShjb25maWcpOwotCi0JCWxpYnJhcnlNYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJYWZjcCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihsaWJyYXJ5TWFuYWdlcgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlkZXBlbmRlbmN5TWFuYWdlciA9IG5ldyBEZXBlbmRlbmN5TWFuYWdlcihsaWJyYXJ5KTsKLQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCWxheW91dE1hbmFnZXIgPSBuZXcgRWxlbWVudExheW91dE1hbmFnZXIoKTsKLQkJfSBlbHNlIHsKLQkJCWxheW91dE1hbmFnZXIgPSBuZXcgRWxlbWVudExheW91dE1hbmFnZXIoY29uZmlnKTsKLQkJCS8vIGNsb3N1cmUgPSBuZXcgQ29uZmlndXJhdGlvbkNsb3N1cmUodGhpcywgY29uZmlnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG1hbmFnZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbk1hbmFnZXIjZ2V0Q29uZmlndXJhdGlvbkRhdGEoKQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRGF0YSBnZXRDb25maWd1cmF0aW9uRGF0YSgpIHsKLQkJcmV0dXJuIGNvbmZpZ0RhdGE7Ci0JfQotCQotCXB1YmxpYyBTdXBwb3J0aW5nRWxlbWVudERhdGEgZ2V0U3VwcG9ydGluZ0VsZW1lbnREYXRhKCkgewotCQlyZXR1cm4gc3VwcG9ydGluZ0VsZW1lbnREYXRhOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5IGZvciB0aGUgbWFuYWdlZCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5TWFuYWdlci5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBjb250ZW50IHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gYWZjcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBlbmRlbmN5IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIGRlcGVuZGVuY3kgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBEZXBlbmRlbmN5TWFuYWdlciBnZXREZXBlbmRlbmN5TWFuYWdlcigpIHsKLQkJcmV0dXJuIGRlcGVuZGVuY3lNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhbiBlbGVtZW50IGxheW91dCBtYW5hZ2VyCi0JICovCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbGF5b3V0TWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZSBnZXRDb25maWd1cmF0aW9uQ2xvc3VyZSgpIHsKLQkJcmV0dXJuIGNsb3N1cmU7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgYSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICovCi0JcHVibGljIHZvaWQgbWFrZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCkgewotCQlpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0JCQljbG9zdXJlLmZpeEVycm9ycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zIGluIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZFBsdWdpbnMoKSB7Ci0JCXJldHVybiBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljb25maWdEYXRhLmRpc3Bvc2UoKTsKLQkJY29uZmlnRGF0YSA9IG51bGw7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCWxpYnJhcnkgPSBudWxsOwotCQlsaWJyYXJ5TWFuYWdlciA9IG51bGw7Ci0JCWRlcGVuZGVuY3lNYW5hZ2VyID0gbnVsbDsKLQkJbGF5b3V0TWFuYWdlciA9IG51bGw7Ci0JCWNsb3N1cmUgPSBudWxsOwotCQlNZXRob2RFbGVtZW50UHJvcGVydHlNZ3IuZ2V0SW5zdGFuY2UoKS51bnJlZ2lzdGVyKGNvbmZpZyk7Ci0JCWNvbmZpZ1Byb3BzID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvblByb3BlcnRpZXMgZ2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBjb25maWdQcm9wczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9DcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTBkMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBMaWJyYXJ5IE1hbmFnZXIgaW5zdGFuY2UgY2Fubm90IGJlIGNyZWF0ZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24gZXh0ZW5kcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTczMWZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JQ29uZmlndXJhdGlvbkNsb3N1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkVsZW1lbnREZXBlbmRlbmN5RXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIE1ldGhvZCBDb25maWd1cmF0aW9uIENsb3N1cmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQ2xvc3VyZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250YWluaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzCi0JICovCi0JLy9wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25zKE9iamVjdFtdIGVsZW1lbnRzKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIHBsdWctaW4gb3IgcGFja2FnZSBpcyBzZWxlY3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIHNlbGVjdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChPYmplY3QgaW5wdXQpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZWxlbWVudCBkZXBlbmRlbmN5IGVycm9yIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBlbGVtZW50IEEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5FbGVtZW50RGVwZW5kZW5jeUVycm9yPC9jb2RlPgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVwZW5kZW5jeUVycm9yIGdldEVycm9yKE9iamVjdCBlbGVtZW50KTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjbG9zdXJlIGhhcyBhbnkgZXJyb3IuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2xvc3VyZSBoYXMgb25lIG9yIG1vcmUgZXJyb3JzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjbG9zdXJlIGhhcyBhbnkgcHJvYmxlbS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbG9zdXJlIGhhcyBvbmUgb3IgbW9yZSBwcm9ibGVtcy5cCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvYmxlbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5FcnJvckluZm88L2NvZGU+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QWxsRXJyb3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgZGVwZW5kZW5jeSBlcnJvcnMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5FbGVtZW50RGVwZW5kZW5jeUVycm9yPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXREZXBlbmRlbmN5RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgaW52YWxpZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBpbnZhbGlkIGVsZW1lbnRzCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW52YWxpZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgY2hhbmdlZCBlbGVtZW50cy4gVGhlc2UgYXJlIGVsZW1lbnRzIHdob3NlIGNoZWNrIHN0YXRlcwotCSAqIGhhdmUgY2hhbmdlZCBvciB3aG9zZSBpbWFnZSBoYXZlIGNoYW5nZWQgZHVlIHRvIGVycm9yLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGNoYW5nZWQgbWV0aG9kIGVsZW1lbnRzCi0JICovCi0JLy9wdWJsaWMgTGlzdCBnZXRDaGFuZ2VkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMgc2VsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIGZpeCB0aGUgZXJyb3JzIGluIHRoZSBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGZpeEVycm9ycygpOwotCi0JLyoqCi0JICogRml4ZXMgYWxsIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIGNsb3N1cmUuCi0JICovCi0JcHVibGljIHZvaWQgZml4UHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQkvL3B1YmxpYyB2b2lkIHNhdmVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBQYWNrYWdlcyB0aGUgbGlicmFyeSBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGN1cnJlbnQgbGlicmFyeS4gQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIGEKLQkgKiBjb3B5IG9mIHRoZSBjdXJyZW50IGxpYnJhcnkgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCSAqIDEuIENyZWF0ZSBhIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uTWFuYWdlcjwvY29kZT4gd2l0aCBhIGNvcHkgb2YgdGhlCi0JICogb3JpZ2luYWwgbGlicmFyeSwgMi4gUmVidWlsZCB0aGUgZGVwZW5kZW5jeSwgMy4gQ3JlYXRlIGEKLQkgKiA8Y29kZT5Db25maWd1cmF0aW9uQ2xvc3VyZTwvY29kZT4gd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVCcm9rZW5SZWZlcmVuY2VzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmVtb3ZlIGFsbCBicm9rZW4gcmVmZXJlbmNlcwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHBhY2thZ2VMaWJyYXJ5KGJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY2xvc3VyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MjE3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlN1cHBvcnRpbmdFbGVtZW50RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkRlcGVuZGVuY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG1hbmFnZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQotCS8qKgotCSAqIEdldHMgQ29uZmlndXJhdGlvbkRhdGEgb2JqZWN0IG1hbmFnZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIENvbmZpZ3VyYXRpb25EYXRhIG9iamVjdAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRGF0YSBnZXRDb25maWd1cmF0aW9uRGF0YSgpOwotCQotCS8qKgotCSAqIEdldHMgU3VwcG9ydGluZ0VsZW1lbnREYXRhIG9iamVjdCBtYW5hZ2VkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBTdXBwb3J0aW5nRWxlbWVudERhdGEgb2JqZWN0Ci0JICovCi0JcHVibGljIFN1cHBvcnRpbmdFbGVtZW50RGF0YSBnZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKTsKLQkKLQkvKioKLQkgKiBHZXRzIENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIG9iamVjdCBtYW5hZ2VkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBDb25maWd1cmF0aW9uUHJvcGVydGllcyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblByb3BlcnRpZXMgZ2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgY29udGVudCBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcGVuZGVuY3kgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGVwZW5kZW5jeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIERlcGVuZGVuY3lNYW5hZ2VyIGdldERlcGVuZGVuY3lNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGxheW91dCBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZWxlbWVudCBsYXlvdXQgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUgZ2V0Q29uZmlndXJhdGlvbkNsb3N1cmUoKTsKLQotCS8qKgotCSAqIE1ha2VzIGEgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zIGluIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZFBsdWdpbnMoKTsKLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwZGRkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBMaWJyYXJ5IE1hbmFnZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5TWFuYWdlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeShTdHJpbmcgbmFtZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KGphdmEubmV0LlVSSSB1cmkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW9wZW5zIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3Blbk1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIERpc2NhcmRzIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgZGlzY2FyZE1ldGhvZExpYnJhcnlDaGFuZ2VzKCk7Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgVVJJIG9mIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5vcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJPC9jb2RlPgotCSAqLwotCXB1YmxpYyBqYXZhLm5ldC5VUkkgZ2V0TWV0aG9kTGlicmFyeVVSSSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4gRm9yIGRpc3RyaWJ1dGVkCi0JICogbGlicmFyeSwgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHdvcmtzcGFjZSBwYXRoLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhbiBlZGl0aW5nIGRvbWFpbgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGVkaXRpbmcgZG9tYWluIHdpdGggdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgYW4gZWRpdGluZyBkb21haW4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgY2hhbmdlcyB0byB0aGUgbWFuYWdlZAotCSAqIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgcmVzb3VyY2UgY2hhbmdlcyBpbiB0aGUgbWFuYWdlZCBtZXRob2QKLQkgKiBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIHJlc291cmNlIGNoYW5nZXMgaW4gdGhlIG1hbmFnZWQgbWV0aG9kCi0JICogbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogU3RhcnRzIGxpc3RlbmluZyB0byBjb21tYW5kIHByb2Nlc3Npbmcgb24gYSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayk7Ci0KLQkvKioKLQkgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gY29tbWFuZCBwcm9jZXNzaW5nIG9uIGEgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayk7Ci0KLQkvKioKLQkgKiBTdGFydHMgbGlzdGVuaW5nIHRvIGNoYW5nZSBub3RpZmljYXRpb25zIHNlbnQgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydExpc3RlbmluZ1RvKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogU3RvcHMgbGlzdGVuaW5nIHRvIGNoYW5nZSBub3RpZmljYXRpb25zIHNlbnQgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBHZXRzIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBlbGVtZW50J3MgR1VJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGVsZW1lbnQgb2YgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFN0cmluZyBndWlkKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQgb25seS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyByZWFkIG9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlSZWFkT25seSgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgaGFzCi0JICogICAgICAgICBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGhhcyBhbnkgdW5yZXNvbHZlZCBwcm94eS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGhhcyBhbgotCSAqICAgICAgICAgdW5yZXNvbHZlZCBwcm94eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNVbnJlc29sdmVkUHJveHkoKTsKLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSByZWxvYWRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG9wdGlvbnMgdXNlZCBmb3Igc2F2aW5nIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgc2F2ZSBvcHRpb25zCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0U2F2ZU9wdGlvbnMoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgbWV0aG9kIHBsdWctaW4gdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gcGx1Z2luKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBsaWJyYXJ5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgbWFuYWdlciBmb3IgdGhlIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIG1hbmFnZXIgZm9yIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBJTGlicmFyeVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBCYWNrdXAgbWV0aG9kIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIAkJYmFja3VwIGZvbGVyIGZpbGUgcGF0aAkKLQkgKi8KLQlwdWJsaWMgdm9pZCBiYWNrdXBNZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoKTsKLQkKLQkvKioKLQkgKiBSZWdpc3RlciBhIGxvYWRlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIGxvYWRlZCBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYiwgCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFVucmVnaXN0ZXIgYSByZWdpc3RlcmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVJlc291cmNlTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTIyNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBpbnRlcmZhY2UgdG8gbWFuYWdlIGxpYnJhcnkgcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHsKLQotCS8qKgotCSAqIGdldCB0aGUgbG9naWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LAotCSAqIHRoZSBwYXRoIHNob3VsZCBzdGFydCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gCi0JICogaS5lLiA8cGx1Z2luIG5hbWU+L3BhdGgvdG8vZWxlbWVudAotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBzaG91bGQgZW5jYXBzdWxhdGUgdGhlIHBoeXNpY2FsIHN0b3JhZ2UgCi0JICogb2YgdGhlIHJlc291cmNlIGFuZCByZXR1cm4gdGhlIHBhdGggb2YgdGhlIGVsZW1lbnQgc3RhcnQgd2l0aCBpdCdzIHBsdWdpbiBuYW1lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgYmFjayBwYXRoIG9mIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBsb2dpY2FsIHBhdGgsIGZvciBleGFtcGxlLAotCSAqICJPcGVuVVBcZ3VpZGFuY2VcY29uY2VwdFxjMS54bWwiLCB0aGUgYmFjayBwYXRoIGlzICIuLy4uLy4uLy4uLyIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBsb2dpY2FsIHJlc291cmNlIHBhdGggb2YgdGhlIGVsZW1lbnQgaW4gdGhlCi0JICogbGlicmFyeS4gdGhlIHBhdGggc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHBsdWdpbiBuYW1lLiAKLQkgKiBpLmUuIDxwbHVnaW4gbmFtZT4vcGF0aC90by9lbGVtZW50L3Jlc291cmNlcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9naWNhbFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIHBoeXNpY2FsIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGh5c2ljYWwgcGF0aCBvZiB0aGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCByZXNvdXJjZSBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBwbHVnaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxvZ2ljYWwgcGF0aCBvZiB0aGUgcGx1Z2luIAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHBoeXNpY2FsIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBsb2dpY2FsIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50IGFuIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgdG8gYWNjZXNzIHRoZSBsaWJyYXJ5IHJlc291cmNlCi0JICogdXN1YWxseSB0aGlzIGlzIHRoZSBvd25lciBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGUgbG9naWNhbFBhdGgKLQkgKiBAcGFyYW0gbG9naWNhbFBhdGggU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHBoeXNpY2FsIHBhdGggcmVzb2x2ZWQgZnJvbSB0aGUgbG9naWNhbCBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvZ2ljYWxQYXRoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkyOTVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSBTZXJ2aWNlIEFQSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5U2VydmljZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyB0eXBlLAotCQkJVVJJIHVyaSkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5MYXN0T3BlbmVkTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmVvcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW9wZW5zIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmVzIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiA8cD4KLQkgKiBUaGlzIGF1dG9tYXRpY2FsbHkgZGlzcG9zZXMgaXRzIGxpYnJhcnkgbWFuYWdlciBhbmQgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBtYW5hZ2VycyB0aGF0IG1hbmFnZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlcGxhY2VzIGEgdGhlIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgb2xkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG5ld0xpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG9sZExpYnJhcnksCi0JCQlNZXRob2RMaWJyYXJ5IG5ld0xpYnJhcnkpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGxvY2F0aW9uIHBhdGguCi0JICogPHA+Ci0JICogTm90ZTogQSBmaWxlLWJhc2VkIG1ldGhvZCBsaWJyYXJ5IG1heSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG1hbmFnZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBnZXRMaWJyYXJ5TWFuYWdlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeU1hbmFnZXIoSUxpYnJhcnlNYW5hZ2VyIGxpYk1ncik7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaWJyYXJ5TWFuYWdlcihJTGlicmFyeU1hbmFnZXIgbGliTWdyKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lLAotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXJzKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTWFuYWdlcigpOwotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgbG9hZGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9hZGVkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgIHJlZ2lzdGVyTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFVucmVnaXN0ZXIgYSByZWdpc3RlcmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gcmVnaXN0ZXJlZCBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmZlYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIExpYnJhcnkgU2VydmljZSBsaXN0ZW5lci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIG9wZW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gcmVvcGVuZWQuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gY2xvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBzZXQgYXMgdGhlIGN1cnJlbnQKLQkgKiBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc2V0IGFzIHRoZQotCSAqIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3M2Y2YWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0ludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgbWV0aG9kIGVsZW1lbnQgbmFtZSBpcyBpbnZhbGlkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbiBleHRlbmRzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIEludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLAotCQkJVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihlcnJvck1zZywgcm9vdENhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzExNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBNZXRob2QgTGlicmFyeSBhbHJlYWR5IGV4aXN0cy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBleHRlbmRzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csIFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU1hbmFnZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZGUwNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuaW50ZXJuYWwuTGlicmFyeU1hbmFnZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGNyZWF0aW9uIG9mIExpYnJhcnkgTWFuYWdlciBpbnN0YW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU1hbmFnZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAibGlicmFyeU1hbmFnZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJjbGFzcyIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCX05BTUUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgInR5cGUiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQVRUUklCX05BTUUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAidHlwZU5hbWUiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRV9BVFRSSUJfTkFNRSA9ICJ0eXBlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0FUVFJJQl9OQU1FID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlNYW5hZ2VyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiBsaWJyYXJ5IG1hbmFnZXIgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIExpYnJhcnlNYW5hZ2VyRWxlbWVudD4gbGlicmFyeU1hbmFnZXJFbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlicmFyeU1hbmFnZXJFbGVtZW50PigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeU1hbmFnZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChMaWJyYXJ5TWFuYWdlckZhY3RvcnkuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5TWFuYWdlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludAotCQkvLyBjb250cmlidXRvcnMuCi0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFJJQl9OQU1FKTsKLQkJCQkJCVN0cmluZyB0eXBlSWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoVFlQRV9BVFRSSUJfTkFNRSk7Ci0JCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoVFlQRV9OQU1FX0FUVFJJQl9OQU1FKTsKLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0eXBlSWQgIT0gbnVsbCAmJiB0eXBlSWQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0eXBlTmFtZSAhPSBudWxsCi0JCQkJCQkJCSYmIHR5cGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsJCQkJCQkJCi0JCQkJCQkJaW50IHZlcnNpb24gPSBTZXJ2aWNlcy5wYXJzZVZlcnNpb24oY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoVkVSU0lPTl9BVFRSSUJfTkFNRSkpOwotCQkJCQkJCUxpYnJhcnlNYW5hZ2VyRWxlbWVudCBwcm92aWRlciA9IGxpYnJhcnlNYW5hZ2VyRWxlbWVudHMuZ2V0KHR5cGVJZCk7Ci0JCQkJCQkJaWYocHJvdmlkZXIgPT0gbnVsbCB8fCBwcm92aWRlci5nZXRWZXJzaW9uKCkgPCB2ZXJzaW9uKSB7Ci0JCQkJCQkJCXByb3ZpZGVyID0gbmV3IExpYnJhcnlNYW5hZ2VyRWxlbWVudCgKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgdHlwZUlkLCB0eXBlTmFtZSwgdmVyc2lvbik7Ci0JCQkJCQkJCWxpYnJhcnlNYW5hZ2VyRWxlbWVudHMucHV0KHR5cGVJZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaWJyYXJ5IG1hbmFnZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqIEB0aHJvdyA8Y29kZT5DcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzCi0JICogICAgICAgIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgY3JlYXRlTGlicmFyeU1hbmFnZXIoU3RyaW5nIHR5cGUpCi0JCQl0aHJvd3MgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24gewotCQlMaWJyYXJ5TWFuYWdlckVsZW1lbnQgcHJvdmlkZXIgPSAoTGlicmFyeU1hbmFnZXJFbGVtZW50KSBsaWJyYXJ5TWFuYWdlckVsZW1lbnRzCi0JCQkJLmdldCh0eXBlKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6eiA9IHByb3ZpZGVyLmdldEJ1bmRsZSgpLmxvYWRDbGFzcygKLQkJCQkJcHJvdmlkZXIuZ2V0Q2xhc3NOYW1lKCkpOwotCQkJcmV0dXJuIChJTGlicmFyeU1hbmFnZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IG5ldyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBsaWJyYXJ5IHR5cGVzIHJlZ2lzdGVyZWQgdmlhIHRoZQotCSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIGxpYnJhcnkgdHlwZXMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldExpYnJhcnlUeXBlcygpIHsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiB0eXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeU1hbmFnZXJFbGVtZW50cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdHlwZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0gKChMaWJyYXJ5TWFuYWdlckVsZW1lbnQpIGxpYnJhcnlNYW5hZ2VyRWxlbWVudHMKLQkJCQkJLmdldCh0eXBlSWQpKS5nZXRUeXBlTmFtZSgpOwotCQkJdHlwZXMucHV0KHR5cGVJZCwgdHlwZU5hbWUpOwotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4OWYyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBNZXRob2QgTGlicmFyeSBjYW5ub3QgYmUgbG9jYXRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZywgVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihlcnJvck1zZywgcm9vdENhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmFjZDBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1BBVEggPSAibGF5b3V0LyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfWFNMX1BBVEggPSAibGF5b3V0L3hzbC8iOyAvLyROT04tTkxTLTEkOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfQ1NTX1BBVEggPSAibGF5b3V0L2Nzcy8iOyAvLyROT04tTkxTLTEkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1NDUklQVFNfRk9MREVSID0gInNjcmlwdHMiOyAvLyROT04tTkxTLTEkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1NDUklQVFNfUEFUSCA9ICJsYXlvdXQvc2NyaXB0cy8iOyAvLyROT04tTkxTLTEkOwotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGF5b3V0UGF0aCwgbGF5b3V0WHNsUGF0aCwgbGF5b3V0Q3NzUGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChzdXBlci5nZXRJbnN0YWxsVVJMKCksIExBWU9VVF9QQVRIKTsKLQkJCWxheW91dFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQl1cmwgPSBuZXcgVVJMKHN1cGVyLmdldEluc3RhbGxVUkwoKSwgTEFZT1VUX1hTTF9QQVRIKTsKLQkJCWxheW91dFhzbFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQl1cmwgPSBuZXcgVVJMKHN1cGVyLmdldEluc3RhbGxVUkwoKSwgTEFZT1VUX0NTU19QQVRIKTsKLQkJCWxheW91dENzc1BhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0KLQkJTGF5b3V0UmVzb3VyY2VzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXlvdXRQYXRoKCkgewotCQlyZXR1cm4gbGF5b3V0UGF0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExheW91dFhzbFBhdGgoKSB7Ci0JCXJldHVybiBsYXlvdXRYc2xQYXRoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF5b3V0Q3NzUGF0aCgpIHsKLQkJcmV0dXJuIGxheW91dENzc1BhdGg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQ3ZDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIExpYnJhcnlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBMaWJyYXJ5UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJVcGdyYWRlUmVxdWlyZWRfZXJyX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvbGRUb29sVmVyc2lvbl9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xWZXJzaW9uTWlzbWF0Y2hfZXJyX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmtub3duX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdDbG9zdXJlV2FybmluZ19tc2czOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZXNFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUNvbnZlcnRlZEFjdGl2aXR5RXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY291bGROb3RMb2NrTGlicmFyeV9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGluZ01ldHJpY190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtRGVmaW5pdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVBc3NldF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5TGF5b3V0X3ByaW1hcnlUYXNrc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRFeHBvcnRVdGlsX01TRzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0RXhwb3J0VXRpbF9NU0c5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVua25vd25HdWlkYW5jZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcl9jYW5ub3RVcGRhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2FybmluZ0RsZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRsZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRsZ19zYXZlRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfamE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfamE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfa287Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfa287Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfemg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfemg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfemhfVFc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfemhfVFc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X3NpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1feE1hcmdpbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbV94U3BhY2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbV95U3BhY2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eURpYWdyYW1OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sb25fd2l0aF9zcGFjZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfbWlzc2luZ19lbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9jb250cmlidXRvcl9taXNzaW5nX2Jhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX2V4dGVuZGVyX21pc3NpbmdfYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfcmVwbGFjZXJfbWlzc2luZ19iYXNlOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfbWlzc2luZ19wcmltYXJ5X3BlcmZvcm1lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfbWlzc2luZ19tYW5kYXRvcnlfaW5wdXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX21pc3Npbmdfb3V0cHV0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9taXNzaW5nX3Jlc3BvbnNpYmxlX2Zvcl93b3JrUHJvZHVjdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdFNsb3RfdGV4dDsKLQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3OTdkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzLkNvbW1hbmRMaW5lUnVuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgTGlicmFyeSBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZSBpbXBsZW1lbnRzIElMaWJyYXJ5U2VydmljZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DUkVBVEVfTElCUkFSWSA9IDE7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9PUEVOX0xJQlJBUlkgPSAyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkVPUEVOX0xJQlJBUlkgPSAzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ0xPU0VfTElCUkFSWSA9IDQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQ1VSUkVOVF9MSUJSQVJZID0gNTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9DVVJSRU5UX0NPTkZJR1VSQVRJT04gPSA2OwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcm90ZWN0ZWQgc3RhdGljIElMaWJyYXJ5U2VydmljZSBpbnN0YW5jZTsKLQotCS8vIEEgbWFwIG9mIG1ldGhvZCBsaWJyYXJpZXMgdG8gbGlicmFyeSBtYW5hZ2Vycy4KLQlwcm90ZWN0ZWQgTWFwPE1ldGhvZExpYnJhcnksIElMaWJyYXJ5TWFuYWdlcj4gbGlicmFyeU1hbmFnZXJzID0gbmV3IEhhc2hNYXA8TWV0aG9kTGlicmFyeSwgSUxpYnJhcnlNYW5hZ2VyPigpOwotCi0JLy8gQSBtYXAgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHRvIGNvbmZpZ3VyYXRpb24gbWFuYWdlcnMuCi0JcHJvdGVjdGVkIE1hcDxNZXRob2RDb25maWd1cmF0aW9uLCBJQ29uZmlndXJhdGlvbk1hbmFnZXI+IGNvbmZpZ01hbmFnZXJzID0gbmV3IEhhc2hNYXA8TWV0aG9kQ29uZmlndXJhdGlvbiwgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyPigpOwotCi0JLy8gVGhlIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcnMuCi0JcHJvdGVjdGVkIExpc3Q8SUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI+IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI+KCk7Ci0KLQkvLyBUaGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBjdXJyZW50TGlicmFyeTsKLQotCS8vIFRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQkvLyBJZiB0cnVlLCB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBpcyBiZWluZyBjbG9zZWQuCi0JcHJpdmF0ZSBib29sZWFuIGNsb3NpbmdDdXJyZW50TGlicmFyeTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5U2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVNlcnZpY2UuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5U2VydmljZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlTZXJ2aWNlKCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBJbml0aWFsaXplIHRoZSBsaWJyYXJ5IG1hbmFnZXIgZmFjdG9yeSB0byBwcmUtcHJvY2VzcyB0aGUKLQkJLy8gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50LgotCQlMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQotCQlpZiAoQ29tbWFuZExpbmVSdW5VdGlsLmdldEluc3RhbmNlKCkuaXNOZWVkVG9SdW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgdHlwZSA9PSBudWxsIHx8IHBhcmFtcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlib29sZWFuIHJlb3BlbkxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbDsKLQotCQl0cnkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZUxpYnJhcnlNYW5hZ2VyKHR5cGUpOwotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbWFuYWdlci5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHBhcmFtcyk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJLy8gb3BlbiBuZXdseSBjcmVhdGVkIG1ldGhvZCBsaWJyYXJ5IHdpdGhvdXQgc2VuZGluZyBvdXQgbm90aWZpY2F0aW9uCi0JCQkJLy8KLQkJCQlsaWJyYXJ5ID0gbWFuYWdlci5vcGVuTWV0aG9kTGlicmFyeShtYW5hZ2VyLmdldE1ldGhvZExpYnJhcnlVUkkoKSk7Ci0KLQkJCQlzZXRMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQotCQkJCS8vIFNldCB0aGUgY3VycmVudCBsaWJyYXJ5LCBkbyB0aGlzIGJlZm9yZSBub3RpZnlpbmcgdGhlIGxpYnJhcnkKLQkJCQkvLyBsaXN0ZW5lcnMuCi0JCQkJc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0KLQkJCQkvLyBTYXZlIHRoZSBsaWJyYXJ5IFVSSSBhbmQgdHlwZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQkJCXNhdmVNZXRob2RMaWJyYXJ5UHJlZmVyZW5jZXMobWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5VVJJKCksCi0JCQkJCQl0eXBlKTsKLQotCQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9DUkVBVEVfTElCUkFSWSk7CQkJCQkJCQkKLQkJCX0KLQotCQkJcmVvcGVuTGlicmFyeSA9IGZhbHNlOwotCi0JCQlyZXR1cm4gbGlicmFyeTsKLQkJfSBjYXRjaCAoTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZW9wZW5MaWJyYXJ5KSB7Ci0JCQkJb3Blbkxhc3RPcGVuZWRNZXRob2RMaWJyYXJ5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoU3RyaW5nIHR5cGUsIFVSSSB1cmkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVMaWJyYXJ5TWFuYWdlcih0eXBlKTsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG1hbmFnZXIub3Blbk1ldGhvZExpYnJhcnkodXJpKTsKLQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQlzZXRMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQotCQkJCS8vIFNldCB0aGUgY3VycmVudCBsaWJyYXJ5LCBkbyB0aGlzIGJlZm9yZSBub3RpZnlpbmcgdGhlIGxpYnJhcnkKLQkJCQkvLyBsaXN0ZW5lcnMuCi0JCQkJc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0KLQkJCQkvLyBTYXZlIHRoZSBsaWJyYXJ5IFVSSSBhbmQgdHlwZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQkJCXNhdmVNZXRob2RMaWJyYXJ5UHJlZmVyZW5jZXMobWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5VVJJKCksCi0JCQkJCQl0eXBlKTsKLQotCQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9PUEVOX0xJQlJBUlkpOwotCQkJfQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgdHlwZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAocGFyYW1zID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVMaWJyYXJ5TWFuYWdlcih0eXBlKTsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG1hbmFnZXIub3Blbk1ldGhvZExpYnJhcnkocGFyYW1zKTsKLQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQlzZXRMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQotCQkJCS8vIFNldCB0aGUgY3VycmVudCBsaWJyYXJ5LCBkbyB0aGlzIGJlZm9yZSBub3RpZnlpbmcgdGhlIGxpYnJhcnkKLQkJCQkvLyBsaXN0ZW5lcnMuCi0JCQkJc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0KLQkJCQkvLyBTYXZlIHRoZSBsaWJyYXJ5IFVSSSBhbmQgdHlwZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQkJCXNhdmVNZXRob2RMaWJyYXJ5UHJlZmVyZW5jZXMobWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5VVJJKCksCi0JCQkJCQl0eXBlKTsKLQotCQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9PUEVOX0xJQlJBUlkpOwotCQkJfQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgbGFzdCBvcGVuZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbkxhc3RPcGVuZWRNZXRob2RMaWJyYXJ5KCkgewotCQlTdHJpbmcgc2F2ZWRNZXRob2RMaWJyYXJ5VVJJID0gTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgpOwotCQl0cnkgewotCQkJVVJJIHVyaSA9IG5ldyBVUkkoc2F2ZWRNZXRob2RMaWJyYXJ5VVJJKTsKLQkJCWlmICh1cmkuZ2V0UGF0aCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHR5cGUgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0U2F2ZWRNZXRob2RMaWJyYXJ5VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIG9wZW5NZXRob2RMaWJyYXJ5KHR5cGUsIHVyaSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKAotCQkJCQkiVW5hYmxlIHRvIG9wZW4gdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5ICciIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHNhdmVkTWV0aG9kTGlicmFyeVVSSSArICInLiIpOyAvLyROT04tTkxTLTEkCi0JCQlMaWJyYXJ5UHJlZmVyZW5jZXMuc2V0U2F2ZWRNZXRob2RMaWJyYXJ5VVJJKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlb3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3Blbk1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZW1vdmVMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQkJCQlsaWJyYXJ5ID0gbWFuYWdlci5yZW9wZW5NZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCQkvLyBSZS1yZWdpc3RlciB0aGUgbGlicmFyeSBtYW5hZ2VyIHNpbmNlIHRoZSBsaWJyYXJ5IGluc3RhbmNlCi0JCQkJLy8gd2lsbCBiZSBjaGFuZ2VkLgotCQkJCXNldExpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCi0JCQkJLy8gU2V0IHRoZSBjdXJyZW50IGxpYnJhcnksIGRvIHRoaXMgYmVmb3JlIG5vdGlmeWluZyB0aGUgbGlicmFyeQotCQkJCS8vIGxpc3RlbmVycy4KLQkJCQlzZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWJyYXJ5KTsKLQotCQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9SRU9QRU5fTElCUkFSWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5zIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiByZW9wZW5NZXRob2RMaWJyYXJ5KGN1cnJlbnRMaWJyYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5zYXZlTWV0aG9kTGlicmFyeSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJc2F2ZU1ldGhvZExpYnJhcnkoY3VycmVudExpYnJhcnkpOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIDxwPgotCSAqIFRoaXMgYXV0b21hdGljYWxseSBkaXNwb3NlcyBpdHMgbGlicmFyeSBtYW5hZ2VyIGFuZCB0aGUgY29uZmlndXJhdGlvbgotCSAqIG1hbmFnZXJzIHRoYXQgbWFuYWdlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9DTE9TRV9MSUJSQVJZKTsKLQkJCW1hbmFnZXIuY2xvc2VNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZiAoY3VycmVudExpYnJhcnkgPT0gbGlicmFyeSkgewotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KG51bGwpOwotCQkJCXNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJfQotCQkJcmVtb3ZlTGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0JCQltYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoY2xvc2luZ0N1cnJlbnRMaWJyYXJ5KQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJY2xvc2luZ0N1cnJlbnRMaWJyYXJ5ID0gdHJ1ZTsKLQkJCWlmIChjdXJyZW50TGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJY2xvc2VNZXRob2RMaWJyYXJ5KGN1cnJlbnRMaWJyYXJ5KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWNsb3NpbmdDdXJyZW50TGlicmFyeSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgYSB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG9sZExpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmV3TGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2xkTGlicmFyeSwKLQkJCU1ldGhvZExpYnJhcnkgbmV3TGlicmFyeSkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlNYW5hZ2VyKG9sZExpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZW1vdmVMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQotCQkJLy8gU2V0IHRoZSBuZXcgbGlicmFyeSBpbnN0YW5jZSB0byBwcmV2ZW50IHRoZSBsaWJyYXJ5IG1hbmFnZXIgZnJvbQotCQkJLy8gcmVmZXJlbmNpbmcgdGhlIG9sZCBsaWJyYXJ5IGluc3RhbmNlLgotCQkJbWFuYWdlci5zZXRNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCi0JCQlzZXRMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0aGF0IHdhcyBhZGRlZCB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBjdXJyZW50TGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWN1cnJlbnRMaWJyYXJ5ID0gbGlicmFyeTsKLQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX1NFVF9DVVJSRU5UX0xJQlJBUlkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgbG9jYXRpb24gcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBIGZpbGUtYmFzZWQgbWV0aG9kIGxpYnJhcnkgbWF5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIoY3VycmVudExpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBtYW5hZ2VyIGZvciBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgZ2V0TGlicmFyeU1hbmFnZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiAoSUxpYnJhcnlNYW5hZ2VyKSBsaWJyYXJ5TWFuYWdlcnMuZ2V0KGxpYnJhcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpYnJhcnlNYW5hZ2VyKElMaWJyYXJ5TWFuYWdlciBsaWJNZ3IpIHsKLQkJaWYgKGxpYk1nciAhPSBudWxsKSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGxpYk1nci5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQlyZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcnMobGliKTsKLQkJCQlsaWJyYXJ5TWFuYWdlcnMucmVtb3ZlKGxpYik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaWJyYXJ5TWFuYWdlcihJTGlicmFyeU1hbmFnZXIgbGliTWdyKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gbGliTWdyLmdldE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5TWFuYWdlcnMucHV0KGxpYiwgbGliTWdyKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBtYW5hZ2VyIGZvciB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBnZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5TWFuYWdlcihjdXJyZW50TGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSwKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQlMaXN0IGNvbmZpZ3MgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGNvbmZpZy5nZXROYW1lKCkpKSB7Ci0JCQkJdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQotCQljb25maWcgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZy5zZXROYW1lKG5hbWUpOwotCQljb25maWdzLmFkZChjb25maWcpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQljdXJyZW50Q29uZmlnID0gY29uZmlnOwotCQlub3RpZnlMaXN0ZW5lcnMoY29uZmlnLCBFVkVOVF9TRVRfQ1VSUkVOVF9DT05GSUdVUkFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSAoSUNvbmZpZ3VyYXRpb25NYW5hZ2VyKSBjb25maWdNYW5hZ2VycwotCQkJCS5nZXQoY29uZmlnKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJbWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpOwotCQkJY29uZmlnTWFuYWdlcnMucHV0KGNvbmZpZywgbWFuYWdlcik7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJQ29uZmlndXJhdGlvbk1hbmFnZXIgbWdyID0gKElDb25maWd1cmF0aW9uTWFuYWdlcikgY29uZmlnTWFuYWdlcnMKLQkJCQkucmVtb3ZlKGNvbmZpZyk7Ci0JCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJbWdyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VycyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMobGlicmFyeSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGN1cnJlbnRDb25maWcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGN1cnJlbnRDb25maWcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgbWV0aG9kIGxpYnJhcnkgcmVsYXRlZCBldmVudCB0byBhbGwgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5LCBpbnQgZXZlbnRJZCkgewotCQlmb3IgKEl0ZXJhdG9yPElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPiBpdCA9IG5ldyBBcnJheUxpc3Q8SUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI+KAotCQkJCWxpc3RlbmVycykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZmluYWwgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIgPSBpdC5uZXh0KCk7Ci0JCQlzd2l0Y2ggKGV2ZW50SWQpIHsKLQkJCWNhc2UgRVZFTlRfQ1JFQVRFX0xJQlJBUlk6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeUNyZWF0ZWQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRfT1BFTl9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlPcGVuZWQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRfUkVPUEVOX0xJQlJBUlk6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeVJlb3BlbmVkKGxpYnJhcnkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVWRU5UX0NMT1NFX0xJQlJBUlk6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeUNsb3NlZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9TRVRfQ1VSUkVOVF9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlTZXQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCBldmVudCB0byBhbGwgbGlicmFyeSBzZXJ2aWNlCi0JICogbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IGV2ZW50SWQpIHsKLQkJZm9yIChJdGVyYXRvcjxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4gaXQgPSBuZXcgQXJyYXlMaXN0PElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPigKLQkJCQlsaXN0ZW5lcnMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWZpbmFsIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyID0gaXQubmV4dCgpOwotCQkJc3dpdGNoIChldmVudElkKSB7Ci0JCQljYXNlIEVWRU5UX1NFVF9DVVJSRU5UX0NPTkZJR1VSQVRJT046Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsaXN0ZW5lci5jb25maWd1cmF0aW9uU2V0KGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZXRob2QgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZW50aG9kIGxpYnJhcnkgdHlwZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5UHJlZmVyZW5jZXMoVVJJIHVyaSwgU3RyaW5nIHR5cGUpIHsKLQkJTGlicmFyeVByZWZlcmVuY2VzLnNldFNhdmVkTWV0aG9kTGlicmFyeVVSSSh1cmkudG9TdHJpbmcoKSk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcy5zZXRTYXZlZE1ldGhvZExpYnJhcnlUeXBlKHR5cGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2UjcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCAgcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgdHlwZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQkvL0ZvciBub3csIHN0aWxsIHNpbXBseSB3cmFwaW5nIHVwIG9sZCBpbXBsZW1lbnRhdGlvbiAoY29waWVkIGZyb20gQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UpIGZvciBzbW9vdGhlciBjaGFuZ2U7IHdpbGwgZGVmaW5ldGx5IGNoYW5nZSBsYXRlcgotCQkvL3NvIHRoYXQgY3JlYXRpbmcgYSBuZXcgbGliIHdvdWxkIG5vdCBiZSBuZWVkZWQJCQotCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCS5jcmVhdGVMaWJyYXJ5TWFuYWdlcih0eXBlKTsKLQkJbGliTWdyLnJlZ2lzdGVyTWV0aG9kTGlicmFyeShsaWIsIHBhcmFtcyk7Ci0JCS8vbGliTWdyLmNyZWF0ZU1ldGhvZExpYnJhcnkobmFtZSwgcGFyYW1zKTsKLQkJLy9saWJNZ3Iuc2V0TWV0aG9kTGlicmFyeShsaWIpOwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldExpYnJhcnlNYW5hZ2VyKGxpYk1ncik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZSN1blJlZ2lzdGVyTWV0aG9kTGlicmFyeShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCS8vRm9yIG5vdywgc3RpbGwgc2ltcGx5IHdyYXBpbmcgdXAgb2xkIGltcGxlbWVudGF0aW9uIChjb3BpZWQgZnJvbSBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZSkgZm9yIHNtb290aGVyIGNoYW5nZQotCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gZ2V0TGlicmFyeU1hbmFnZXIobGliKTsKLQkJaWYgKGxpYk1nciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcmVtb3ZlTGlicmFyeU1hbmFnZXIobGliTWdyKTsKLQkJLy9saWJNZ3IuY2xvc2VNZXRob2RMaWJyYXJ5KCk7Ci0JCWxpYk1nci51blJlZ2lzdGVyTWV0aG9kTGlicmFyeSgpOwotCQlsaWJNZ3IuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5MzIzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIExpYnJhcnkgU2VydmljZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2QyMmJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQSBkZWZhdWx0IGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBpbXBsZW1lbnRzIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjY29uZmlndXJhdGlvblNldChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNsb3NlZChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlDcmVhdGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlPcGVuZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5UmVvcGVuZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlTZXQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNGNjNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogSGVscGVyIHV0aWxpdGllcyBmb3IgYWNjZXNzaW5nIGFuZCBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlVXRpbCB7Ci0KLQkvLyBBIGNoZWNrbGlzdCBmaWx0ZXIuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBDSEVDS0xJU1RfRklMVEVSID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0OwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRob2RMaWJyYXJ5UGF0aChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsaWJyYXJ5LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJVVJJIHJlc291cmNlVVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlpZiAocmVzb3VyY2VVUkkgIT0gbnVsbCAmJiByZXNvdXJjZVVSSS5pc0ZpbGUoKSkgewotCQkJCVN0cmluZyBwYXRoID0gcmVzb3VyY2VVUkkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnlQYXRoKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCBsaWJyYXJ5IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXJldHVybiAoTWV0aG9kTGlicmFyeSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzcGVjaWZpYyBtZXRob2QgY29uZmlndXJhdGlvbiBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnksIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzID0gbGlicmFyeQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIShjb25maWcgaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KQotCQkJCQkJJiYgY29uZmlnLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIGNvbmZpZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb25bXSBnZXRNZXRob2RDb25maWd1cmF0aW9ucygKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3M7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQkJY29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4obGlicmFyeQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQkJZm9yIChJdGVyYXRvcjxNZXRob2RDb25maWd1cmF0aW9uPiBpID0gY29uZmlncy5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJY29uZmlnID0gaS5uZXh0KCk7Ci0JCQkJaWYgKGNvbmZpZyA9PSBudWxsIHx8IGNvbmZpZyBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpIHsKLQkJCQkJaS5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljb25maWdzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gcmVzdWx0ID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25bY29uZmlncy5zaXplKCldOwotCQljb25maWdzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRNZXRob2RDb25maWd1cmF0aW9uTmFtZXMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb25maWdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlncyA9IGxpYnJhcnkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvcjxNZXRob2RDb25maWd1cmF0aW9uPiBpID0gY29uZmlncy5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGkubmV4dCgpOwotCQkJCWlmICghKGNvbmZpZyBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpKSB7Ci0JCQkJCWNvbmZpZ05hbWVzLmFkZChjb25maWcuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb25maWdOYW1lcy5zaXplKCldOwotCQljb25maWdOYW1lcy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUHJvY2Vzcz4gZ2V0UHJvY2Vzc2VzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwPFN0cmluZywgUHJvY2Vzcz4gcmVzdWx0ID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSBpLm5leHQoKTsKLQkJCVN0cmluZyBjYXBhYmlsaXR5UGF0dGVyblBhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCW1ldGhvZFBsdWdpbiwgY2FwYWJpbGl0eVBhdHRlcm5QYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlLAotCQkJCQkJCXJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0JCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCWRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUHJvY2Vzcz4gZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwPFN0cmluZywgUHJvY2Vzcz4gcmVzdWx0ID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSBpLm5leHQoKTsKLQkJCVN0cmluZyBjYXBhYmlsaXR5UGF0dGVyblBhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCW1ldGhvZFBsdWdpbiwgY2FwYWJpbGl0eVBhdHRlcm5QYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGluIGEgbWV0aG9kIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBnZXRDYXBhYmlsaXR5UGF0dGVybnMoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IGNhcGFiaWxpdHlQYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+KCk7Ci0JCUxpc3Q8UHJvY2Vzcz4gaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3M+IGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUHJvY2VzcyBwcm9jZXNzID0gaXQubmV4dCgpOwotCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCWNhcGFiaWxpdHlQYXR0ZXJucy5hZGQoKENhcGFiaWxpdHlQYXR0ZXJuKSBwcm9jZXNzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5zOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBkZWxpdmVyeSBwcm9jZXNzZXMgaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzPiBnZXREZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcDxTdHJpbmcsIFByb2Nlc3M+IHJlc3VsdCA9IG5ldyBUcmVlTWFwPFN0cmluZywgUHJvY2Vzcz4oKTsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gaS5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCW1ldGhvZFBsdWdpbiwgZGVsaXZlcnlQcm9jZXNzUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBkZWxpdmVyeSBwcm9jZXNzZXMgaW4gYSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4gZ2V0RGVsaXZlcnlQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4gZGVsaXZlcnlQcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4oKTsKLQkJTGlzdDxQcm9jZXNzPiBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3I8UHJvY2Vzcz4gaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCWRlbGl2ZXJ5UHJvY2Vzc2VzLmFkZCgoRGVsaXZlcnlQcm9jZXNzKSBwcm9jZXNzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgaW4gYSBwcm9jZXNzIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NQYWNrYWdlCi0JICogICAgICAgICAgICBhIHByb2Nlc3MgcGFja2FnZQotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiAgICAgICAgICAgIGEgbWFwCi0JICogQHJldHVybiBhbiB1cGRhdGVkIG1hcCBjb250YWluaW5nIGEgY29sbGVjdGlvbiBvZgotCSAqICAgICAgICAgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldENhcGFiaWxpdHlQYXR0ZXJucyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwKLQkJCU1hcDxTdHJpbmcsIFByb2Nlc3M+IHJlc3VsdCkgewotCQlMaXN0PE1ldGhvZFBhY2thZ2U+IGNoaWxkUGFja2FnZXMgPSBwcm9jZXNzUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGFja2FnZT4gaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IGkubmV4dCgpOwotCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcGtnOwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzID0gcHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpIHBrZywgcmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBkZWxpdmVyeSBwcm9jZXNzZXMgaW4gYSBwcm9jZXNzIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NQYWNrYWdlCi0JICogICAgICAgICAgICBhIHByb2Nlc3MgcGFja2FnZQotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiAgICAgICAgICAgIGEgbWFwCi0JICogQHJldHVybiBhbiB1cGRhdGVkIG1hcCBjb250YWluaW5nIGEgY29sbGVjdGlvbiBvZgotCSAqICAgICAgICAgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXREZWxpdmVyeVByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwKLQkJCU1hcDxTdHJpbmcsIFByb2Nlc3M+IHJlc3VsdCkgewotCQlMaXN0PE1ldGhvZFBhY2thZ2U+IGNoaWxkUGFja2FnZXMgPSBwcm9jZXNzUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGFja2FnZT4gaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IGkubmV4dCgpOwotCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcGtnOwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzID0gcHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2UpIHBrZywgcmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBwcm9jZXNzIGZhbWlsaWVzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHByb2Nlc3MgZmFtaWx5IG5hbWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9jZXNzRmFtaWx5TmFtZXMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3Q8U3RyaW5nPiBwcm9jZXNzRmFtaWx5TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvcjxNZXRob2RDb25maWd1cmF0aW9uPiBpID0gY29uZmlncy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGNvbmZpZyBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpIHsKLQkJCQkJcHJvY2Vzc0ZhbWlseU5hbWVzLmFkZChjb25maWcuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3Byb2Nlc3NGYW1pbHlOYW1lcy5zaXplKCldOwotCQlwcm9jZXNzRmFtaWx5TmFtZXMudG9BcnJheShyZXN1bHQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIGNvbnRleHRzIChtZXRob2QgY29uZmlndXJhdGlvbnMpIGFzc2lnbmVkIHRvIGEKLQkgKiBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb250ZXh0IChtZXRob2QgY29uZmlndXJhdGlvbikgbmFtZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbnRleHRzKFByb2Nlc3MgcHJvY2VzcykgewotCQlMaXN0PFN0cmluZz4gY29udGV4dE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29udGV4dHMgPSBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQkJZm9yIChJdGVyYXRvcjxNZXRob2RDb25maWd1cmF0aW9uPiBpdCA9IGNvbnRleHRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbnRleHQgPSBpdC5uZXh0KCk7Ci0JCQkJY29udGV4dE5hbWVzLmFkZChjb250ZXh0LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb250ZXh0TmFtZXMuc2l6ZSgpXTsKLQkJY29udGV4dE5hbWVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFzc2lnbmVkIHRvIGEgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPk1ldGhvZENvbmZpZ3VyYXRpb248L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBNZXRob2RDb25maWd1cmF0aW9uPiBnZXRNZXRob2RDb25maWd1cmF0aW9ucyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBNZXRob2RDb25maWd1cmF0aW9uPiByZXN1bHQgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIE1ldGhvZENvbmZpZ3VyYXRpb24+KCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbnRleHQgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmIChkZWZhdWx0Q29udGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQucHV0KGRlZmF1bHRDb250ZXh0LmdldE5hbWUoKSwgZGVmYXVsdENvbnRleHQpOwotCQl9Ci0KLQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb250ZXh0cyA9IHByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kQ29uZmlndXJhdGlvbj4gaSA9IGNvbnRleHRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gaS5uZXh0KCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnB1dChjb250ZXh0LmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBjaGVja2xpc3RzIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNoZWNrbGlzdDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIENoZWNrbGlzdD4gZ2V0Q2hlY2tsaXN0cygKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBDaGVja2xpc3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2hlY2tsaXN0PigpOwotCi0JCUFycmF5TGlzdDxJRmlsdGVyPiBmaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxJRmlsdGVyPigpOwotCQlmaWx0ZXJMaXN0LmFkZChDSEVDS0xJU1RfRklMVEVSKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCgKLQkJCQljb25maWcsIGZpbHRlckxpc3QpOwotCQlMaXN0IGVsZW1lbnRzID0gZWxlbWVudExpc3QuZ2V0TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQlDaGVja2xpc3QgY2hlY2tsaXN0ID0gKENoZWNrbGlzdCkgb2JqOwotCQkJCXJlc3VsdC5wdXQoY2hlY2tsaXN0LmdldE5hbWUoKSwgY2hlY2tsaXN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgR1VJRCBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdVSUQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBndWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCWlmIChndWlkID09IG51bGwgfHwgZ3VpZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlndWlkID0gRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBlbGVtZW50LmVEZWxpdmVyKCk7Ci0JCQl0cnkgewotCQkJCWVsZW1lbnQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCWVsZW1lbnQuc2V0R3VpZChndWlkKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZWxlbWVudC5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBjaGlsZHJlbiA9IGVsZW1lbnQuZUNvbnRlbnRzKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXQubmV4dCgpOwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJc2V0R1VJRCgoTWV0aG9kRWxlbWVudCkgY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlYnVnIHN0cmluZyBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbWV0aG9kIGVsZW1lbnQgY2xhc3MgbmFtZSwgbmFtZSBhbmQgR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlYnVnU3RyaW5nKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiW25hbWU6ICIgKyBlbGVtZW50LmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJKyAiLCBndWlkPSIgKyBlbGVtZW50LmdldEd1aWQoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5UGVyc2lzdGVyIGdldEN1cnJlbnRQZXJzaXN0ZXIoKSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldEVkaXRpbmdEb21haW4oKQotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCQlyZXR1cm4gKChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZXIgZm9yIGEgZ2l2ZW4gcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyRm9yKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJcmV0dXJuICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpLmdldFBlcnNpc3RlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBwbHVnLWluCi0JICogQHBhcmFtIGJyaWVmRGVzYwotCSAqICAgICAgICAgICAgYSBicmllZiBkZXNjcmlwdGlvbiBmb3IgdGhlIG5ldyBwbHVnLWluCi0JICogQHBhcmFtIGF1dGhvcnMKLQkgKiAgICAgICAgICAgIHRoZSBhdXRob3JzIG9mIHRoZSBuZXcgcGx1Zy1pbgotCSAqIEBwYXJhbSByZWZlcmVuY2VkUGx1Z2lucwotCSAqICAgICAgICAgICAgdGhlIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkgdGhlIG5ldyBwbHVnLWluCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIGJyaWVmRGVzYywgU3RyaW5nIGF1dGhvcnMsIE9iamVjdFtdIHJlZmVyZW5jZWRQbHVnaW5zKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0KLQkJcGx1Z2luLnNldE5hbWUoU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuYW1lKSk7Ci0JCWlmIChicmllZkRlc2MgIT0gbnVsbCkgewotCQkJcGx1Z2luLnNldEJyaWVmRGVzY3JpcHRpb24oYnJpZWZEZXNjKTsKLQkJfQotCQlpZiAoYXV0aG9ycyAhPSBudWxsKSB7Ci0JCQlwbHVnaW4uc2V0QXV0aG9ycyhhdXRob3JzKTsKLQkJfQotCQlpZiAocmVmZXJlbmNlZFBsdWdpbnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VkUGx1Z2lucy5sZW5ndGg7IGkrKykgewotCQkJCU1ldGhvZFBsdWdpbiByZWZlcmVuY2VkUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcmVmZXJlbmNlZFBsdWdpbnNbaV07Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCXBsdWdpbi5nZXRCYXNlcygpLmFkZChyZWZlcmVuY2VkUGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pOwotCi0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyY2FjZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJFR0lOIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0Ci0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZT1BcmlhbAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfamE9XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGVkXHUzMGIwCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV9rbz1cdWIzMDBcdWQ2NTQgXHVjMGMxXHVjNzkwCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV96aD1cdTViZjlcdThiZGRcdTY4NDYKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3poX1RXPURpYWxvZwotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX2phPU1TIEdvdGhpYwotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfa289XHVhZDc0XHViOWJjXHVjY2I0Ci0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aD1cdTllZDFcdTRmNTMKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX3poX1RXPVx1N2QzMFx1NjYwZVx1OWFkNAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X3NpemU9MTAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbV94TWFyZ2luPTIwMAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1feFNwYWNpbmc9NzAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdW5rbm93bl90ZXh0PVVua25vd24KLQotIyBFcnJvciBSZWFzb25zCi1lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uPVRoZSBtZXRob2QgbGlicmFyeSBwYXRoIGlzIGVtcHR5LgotbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uPVRoZSBtZXRob2QgbGlicmFyeSBtb2RlbCBmaWxlIGlzIG1pc3NpbmcuCi11bnJlc29sdmVkUHJveHlFcnJvcl9yZWFzb249VGhlIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IGNvbnRhaW5zIHVucmVzb2x2ZWQgZWxlbWVudCByZWZlcmVuY2VzLiBUaGlzIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IG1pc3Npbmcgb3IgZGlzcGxhY2VkIFhNSSBmaWxlcyBpbiB0aGUgbGlicmFyeSBmb2xkZXIuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBicmluZyB1cCB0aGUgUHJvYmxlbXMgdmlldyB0byBoZWxwIGlkZW50aWZ5IHRoZSB1bnJlc29sdmVkIHJlZmVyZW5jZXMuIFRvIGF2b2lkIGNvcnJ1cHRpbmcgdGhlIGxpYnJhcnksIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSByZXNvbHZlIHRoZXNlIHJlZmVyZW5jZXMgZmlyc3QgYmVmb3JlIGFkZGluZyBtb3JlIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkuCi0KLSMgV2FybmluZyBNZXNzYWdlcwotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMT1JVVBMMDAwN1c6IE9uZSBvciBtb3JlIGNoaWxkIGVsZW1lbnRzIGNvbnRhaW4gbWlzc2luZyByZWZlcmVuY2VzCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogVGhpcyBlbGVtZW50IHNob3VsZCBiZSBzZWxlY3RlZCB0byByZXNvbHZlIG9uZSBvciBtb3JlIG1pc3NpbmcgcmVmZXJlbmNlcwotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IFRoaXMgZWxlbWVudCByZWZlcmVuY2VzIG9uZSBvciBtb3JlIGVsZW1lbnRzIGluIGFuIHVuc2VsZWN0ZWQgcGFja2FnZQotCi1FbGVtZW50RXJyb3JfbWlzc2luZ19lbGVtZW50PScnezB9JycgcmVmZXJlbmNlcyBtaXNzaW5nIGVsZW1lbnQgJyd7MX0nJwotRWxlbWVudEVycm9yX2NvbnRyaWJ1dG9yX21pc3NpbmdfYmFzZT0nJ3swfScnIGNvbnRyaWJ1dGVzIHRvIG1pc3NpbmcgYmFzZSBlbGVtZW50ICcnezF9JycKLUVsZW1lbnRFcnJvcl9leHRlbmRlcl9taXNzaW5nX2Jhc2U9Jyd7MH0nJyBleHRlbmRzIG1pc3NpbmcgYmFzZSBlbGVtZW50ICcnezF9JycKLUVsZW1lbnRFcnJvcl9yZXBsYWNlcl9taXNzaW5nX2Jhc2U9Jyd7MH0nJyByZXBsYWNlcyBtaXNzaW5nIGJhc2UgZWxlbWVudCAnJ3sxfScnCi1FbGVtZW50RXJyb3JfbWlzc2luZ19wcmltYXJ5X3BlcmZvcm1lcj0nJ3swfScnIHJlZmVyZW5jZXMgbWlzc2luZyBwcmltYXJ5IHBlcmZvcm1lciAnJ3sxfScnCi1FbGVtZW50RXJyb3JfbWlzc2luZ19tYW5kYXRvcnlfaW5wdXQ9Jyd7MH0nJyByZWZlcmVuY2VzIG1pc3NpbmcgbWFuZGF0b3J5IGlucHV0ICcnezF9JycKLUVsZW1lbnRFcnJvcl9taXNzaW5nX291dHB1dD0nJ3swfScnIHJlZmVyZW5jZXMgbWlzc2luZyBvdXRwdXQgJyd7MX0nJwotRWxlbWVudEVycm9yX21pc3NpbmdfcmVzcG9uc2libGVfZm9yX3dvcmtQcm9kdWN0PScnezB9JycgcmVmZXJlbmNlcyBtaXNzaW5nIHJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3QgJyd7MX0nJwotCi0jIEVycm9yIE1lc3NhZ2VzCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIGxvYWRlZCBidXQgc29tZSBlcnJvcnMgaGF2ZSBiZWVuIGRldGVjdGVkLgotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBUaGlzIGd1aWRhbmNlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlciB0eXBlLgotY29udmVydEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAyRTogVGhpcyBndWlkYW5jZSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHRoZSB0YXJnZXQgdHlwZS4KLXNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwM0U6IFRoZSBjb252ZXJ0ZWQgZ3VpZGFuY2UgJyd7MH0nJyBjYW5ub3QgYmUgc2F2ZWQuCi0KLSMgQ29udmVydCBhY3Rpdml0eQotY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGU9Q29udmVydCBBY3Rpdml0eSBUeXBlIEVycm9yCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDZFOiBUaGlzIGFjdGl2aXR5IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCB0eXBlLgotc2F2ZUNvbnZlcnRlZEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA3RTogVGhlIGNvbnZlcnRlZCBhY3Rpdml0eSAnJ3swfScnIGNhbm5vdCBiZSBzYXZlZC4KLQotIyBFcnJvciBSZWFzb25zCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIENsaWNrIE9LIGZvciBtb3JlIGluZm9ybWF0aW9uLgotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249VGhlcmUgaXMgbm8gY29tcGF0aWJsZSBndWlkYW5jZSB0eXBlIGZvciB7MH0uCi1pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb249SW52YWxpZCBsaWJyYXJ5IHBhdGguIFRoZSAucHJvamVjdCBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotY291bGROb3RMb2NrTGlicmFyeV9yZWFzb249Q291bGQgbm90IGxvY2sgbGlicmFyeS4KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lPUNvcHlpbmcgYXR0YWNobWVudHMuLi4KLQotIyBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZwotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPUNvbnZlcnQgR3VpZGFuY2UgVHlwZQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9U2VsZWN0IHRoZSB0YXJnZXQgZ3VpZGFuY2UgdHlwZS4KLQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZwotY2hlY2tsaXN0X3RleHQ9Q2hlY2tsaXN0Ci1jb25jZXB0X3RleHQ9Q29uY2VwdAotZXhhbXBsZV90ZXh0PUV4YW1wbGUKLWd1aWRlbGluZV90ZXh0PUd1aWRlbGluZQotZXN0aW1hdGVfdGV4dD1Fc3RpbWF0ZQotZXN0aW1hdGluZ01ldHJpY190ZXh0PUVzdGltYXRpbmcgTWV0cmljCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1yZXBvcnRfdGV4dD1SZXBvcnQKLXRlbXBsYXRlX3RleHQ9VGVtcGxhdGUKLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWwKLXRvb2xNZW50b3JfdGV4dD1Ub29sIE1lbnRvcgotd2hpdGVwYXBlcl90ZXh0PVdoaXRlcGFwZXIKLXRlcm1EZWZpbml0aW9uX3RleHQ9VGVybSBEZWZpbml0aW9uCi1wcmFjdGljZV90ZXh0PVByYWN0aWNlCi1yZXVzYWJsZUFzc2V0X3RleHQ9UmV1c2FibGUgQXNzZXQKLQotI2FjdGl2aXR5IGJyZWFrZG93biBpbmZvIHN0cmluZ3MKLUFjdGl2aXR5TGF5b3V0X3ByaW1hcnlUYXNrc190ZXh0PVBlcmZvcm1zIGFzIE93bmVyCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1QZXJmb3JtcyBhcyBBZGRpdGlvbmFsCi0KLSMgQ29udmVydCBHdWlkYW5jZSBFcnJvciBNZXNzYWdlcwotY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU9Q29udmVydCBHdWlkYW5jZSBUeXBlIEVycm9yCi0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9T3BlbiBNZXRob2QgTGlicmFyeSBFcnJvcgotbG9hZFJlc291cmNlc0Vycm9yX3JlYXNvbj1Tb21lIGxpYnJhcnkgcmVzb3VyY2VzIGNvdWxkIG5vdCBiZSBsb2FkZWQuXG5cbkNsaWNrIERldGFpbHMgdG8gcmV2aWV3IHRoZSBlcnJvcnMgYW5kIHJlc29sdmUgdGhlbSBiZWZvcmUgYWRkaW5nIG1vcmUgY2hhbmdlcyB0byB0aGUgbGlicmFyeS4KLQotIyBSb2xlIERpYWdyYW1zCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9cGVyZm9ybXMKLXJvbGVEaWFncmFtUmVzcG9uc2libGVGb3JfdGV4dD1yZXNwb25zaWJsZSBmb3IKLQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1SZWZlcmVuY2VkIGVsZW1lbnQ6IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMT1JbmZvOiB7MH0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9V2FybmluZzogezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PUVycm9yOiB7MH0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwPU1pc3NpbmcgcmVmZXJlbmNlZCBlbGVtZW50IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9VW5hYmxlIHRvIGZpbmQgZWxlbWVudCBmb3IgZ3VpZCB7MH0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyPUZpbGUgJyd7MH0nJyByZWZlcmVuY2VzIG1pc3NpbmcgcmVzb3VyY2UgJyd7MX0nJwotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU9bWlzc2luZyByZXNvdXJjZSBmaWxlICcnezB9JycKLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PVVuYWJsZSB0byBjb25uZWN0IHRvIFVSTCAnJ3swfScnCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1VbmFibGUgdG8gY29ubmVjdCB0byBVUkwgJyd7MH0nJzogezF9Ci1JbXBvcnRFeHBvcnRVdGlsX01TRzg9Q291bGQgbm90IGZpbmQgZmlsZSAnJ3swfScnLgotSW1wb3J0RXhwb3J0VXRpbF9NU0c5PUNvdWxkIG5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSAnJ3swfScnLgotdW5rbm93bkd1aWRhbmNlX3RleHQ9VW5rbm93bgotCi1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uX2xvZ19ub0NvbnRlbnRQYXRoPUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uSGFuZGxlQXR0YWNobWVudHNQbHVnaW46IG5vIGNvbnRlbnRQYXRoIGZvciB7MH0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogQ2Fubm90IHVwZGF0ZSB7MH0gezF9Ci13YXJuaW5nRGxnX3RpdGxlPVdhcm5pbmcKLWVycm9yRGxnX3RpdGxlPUVycm9yCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBFcnJvciBzYXZpbmcgY2hhbmdlcyB0byBmaWxlICcnezB9JycKLQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzCi1hY3Rpdml0eURpYWdyYW1OYW1lPUFjdGl2aXR5IGRpYWdyYW06IHswfQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1BY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbTogezB9Ci13cERlcGVuZGVuY3lEaWFncmFtTmFtZT1Xb3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtOiB7MH0KLQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIAotIyBmb3IgRW5nbGlzaCwgdGhlIHZhbHVlIGlzICIuICIKLSNjb2xvbl93aXRoX3NwYWNlPTogCi0jIGZvciBGcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQotI2NvbG9uX3dpdGhfc3BhY2U9XCA6IAotIyBmb3IgQ2hpbmVzZSwgdGhlIGNvbG9uIHNob3VsZCBiZSBkb3VibGUgYnl0ZXMKLSMgRG9uJ3QgdHJpbSB0aGUgc3BhY2VzIGFmdGVyIHRoZSBjb2xvbi4KLWNvbG9uX3dpdGhfc3BhY2U9OiAKLQotb2xkVG9vbFZlcnNpb25fZXJyX21zZz1UaGlzIHZlcnNpb24gb2YgezB9IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggeW91ciBsaWJyYXJ5IGZpbGUgJyd7Mn0nJy4gWW91IG11c3QgdXBncmFkZSB7MH0gdG8gdmVyc2lvbiB7MX0gb3IgaGlnaGVyIGluIG9yZGVyIHRvIG9wZW4gaXQuCi10b29sVmVyc2lvbk1pc21hdGNoX2Vycl9tc2c9VGhpcyB2ZXJzaW9uIG9mIHswfSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHlvdXIgbGlicmFyeSBmaWxlICcnezJ9JycuIFlvdSBtdXN0IHVwZ3JhZGUgezB9IHRvIGEgaGlnaGVyIHZlcnNpb24gaW4gb3JkZXIgdG8gb3BlbiBpdC4KLWxpYlVwZ3JhZGVSZXF1aXJlZF9lcnJfbXNnPVRoZSBzcGVjaWZpZWQgbGlicmFyeSBuZWVkcyB0byBiZSB1cGdyYWRlZCB0byB0aGUgbmV3IGxpYnJhcnkgc3RydWN0dXJlLiBPcGVuIHRoZSBsaWJyYXJ5IHRvIHVwZ3JhZGUgaXQgYW5kIHRyeSBhZ2Fpbi4KLQotV29ya1Byb2R1Y3RTbG90X3RleHQ9V29yayBQcm9kdWN0IFNsb3QKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZkMGEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0FjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogQSBjb25maWd1cmF0b3IgdXNlZCBieSBhY3Rpdml0eSBkZWVwIGNvcHkgY29tbWFuZCB0byByZXNvdmxlIGFuZCBkZWVwIGNvcHkgY29udHJpYnV0b3JzIGFuZAotICogcmVwbGFjZXJzIG9mIGFjdGl2aXR5IGluIGEgbWV0b2hkIGNvbmZpZ3VyYXRpb24uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXJ7Ci0KLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcgYSA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPgotCSAqIEBwYXJhbSB2aWV3ZXIgYSA8Y29kZT5WaWV3ZXI8L2NvZGU+Ci0JICovCi0JcHVibGljIEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ29uc3RydWN0cyB3aXRoIG51bGwgbWV0aG9kQ29uZmlnIHdoaWNoIGNvdWxkIGJlIHNldCBsYXRlci4KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQotCQkvLyBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgZmlyc3QKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnLCBmYWxzZSwgdHJ1ZSl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNhblNob3coTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCX07Ci0JCXJldHVybiBnZXRWYXJpYWJpbGl0eUluZm8odmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRoZSBzdXBlciBtZXRob2QgZm9yIG5vdCByZXNvbHZpbmcgdGhlIGJhc2UgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvbnRyaWJ1dG9ycy4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUluZm8gaW5mbywgYm9vbGVhbiBpbmNsdWRlQmFzZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0KLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQkvL3Jlc29sdmUgdG8gaW5jbHVkZSBjb250cmlidXRvcnMKLQkJcmVzb2x2ZUVsZW1lbnRDb250cmlidXRvcnMoZWxlbWVudCxpbmZvLHJlYWxpemVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9BdHRyaWJ1dGVGZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBlZGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogZm9yIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBmZWF0dXJlLCAKLSAqIHJlYWxpemVkIHRoZSBmZWF0dXJlIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiByZWFsaXplci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBGZWF0dXJlVmFsdWUgewotCi0JLy8gbWFwIG9mIGVsZW1lbnQgYW5kIHRoZSB2YWx1ZQotCUxpbmtlZEhhc2hNYXAgdmFsdWVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JLyoqCi0JICogY29uc3RyY3RvcgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgd2hvc2UgZmVhdHVyZSB2YWx1ZSBpcyB0byBiZSByZWFsaXplZAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgZWxlbWVudCBvZiB0aGlzIGVsZW1lbnQsIHRoaXMgaXMgbmVlZGVkIGZvciBoYW5kbGUgdGhlIHNwYWNpYWwgY2FzZXMgCi0JICogd2hlcmUgdGhlIGVsZW1lbnQncyBlQ29udGFpbmVyIGlzIG5vdCBwcm9wZXJseSBzZXQgeWV0LiBGb3IgZXhhbXBsZSwgd2hlbiBhIG5ldyBDb250ZW50RGVzY3JpdGlvbiBvYmplY3QgaXMgY3JlYXRlZCwgCi0JICogaXQncyBvd25lciBpcyBub3Qgc2V0IHVudGlsIHRoZSBjb250ZW50IGlzIHNhdmVkLgotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdCBUaGUgZmVhdHVlIG9yIG9wcG9zaXRlIGZlYXR1cmUgd2hvc2UgdmFsdWUgaXMgdG8gYmUgcmVhbGl6ZWQKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyIHRoZSByZWFsaXplciB1c2VkIHRvIHJlYWxpemUgdGhlIGZlYXR1cmUgdmFsdWUuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBtZXRob2QgdG8gYWRkIGEgZmVhdHVyZSB2YWx1ZSB0byB0aGUgdmFsdWUgbGlzdC4gVGhpcyB2YWx1ZSBjb3VsZCBiZSB0aGUgZWxlbWVudCdzIG93biBmZWF0dXJlIHZhbHVlLCAKLQkgKiBvciB0aGUgZmVhdHVyZSB2YWx1ZSBvZiBhbm90aGVyIHZhcmlhYmlsaXR5IGVsZW1lbnQsIHN1Y2ggYXMgYSBjb250cmlidXRvci4gCi0JICogU28gdGhlIG93bmVyIGlzIHBhc3NlZCBpbiB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYXRpb24gb2YgdGhlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBWYXJpYWJpbGl0eUVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBwcm92aWRlIHRoZSB2YWx1ZSBkdWUgdG8gdmFyaWFiaWxpdHkgcmVhbGl6YXRpb24KLQkgKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRoZSBmZWF0dXJlIHZhbHVlIGZyb20gdGhlIG93bmVyIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCAodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCSYmIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbm90ZTogb3duZXIgY2FuIGJlIG51bGwsIHRoaXMgaXMgZmluZQotCQl2YWx1ZU1hcC5wdXQob3duZXIsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgdmFsdWUgbGlzdC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHZhbHVlTWFwLnNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlLgotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldEtleSgpOwotCQkJT2JqZWN0IHYgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlpZiAodiA9PSBudWxsIHx8IHYudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJCVN0cmluZyBzdHIgPSBTdHJVdGlsLmdldFBsYWluVGV4dCh2LnRvU3RyaW5nKCkpLnRyaW0oKTsKLQkJCQlpZiAoIGlzQmxhbmtJbmRpY2F0b3Ioc3RyKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCQlpZiAoc2l6ZSgpID4gMSkgewotCQkJCQkvLyBzb21ldGhpbmcgd3JvbmcgaGVyZSwgd2lsbCBub3QgaGFwcGVuIGJ1dCBwdXQgdGVzdAotCQkJCQkvLyBtZXNzYWdlIGhlcmUganVzdCBpbiBjYXNlCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQXR0cmlidXRlRmVhdHVyZVZhbHVlOiBQcmVzZW50YXRpb24gTmFtZSBnZXQgbW9yZSB0aGVuIG9uZSBlbnRyeTogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB2OwotCQkJfQotCi0JCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKTsgCi0JCQl9Ci0KLQkJCWlmICgoZSA9PSBlbGVtZW50KSAmJiAhKGUgaW5zdGFuY2VvZiBTZWN0aW9uKSB8fCBlID09IG51bGwgKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCS5nZXRFbGVtZW50UGF0aCgoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgCi0JCQkJCQkJCT8gKE1ldGhvZEVsZW1lbnQpIGUuZUNvbnRhaW5lcigpCi0JCQkJCQkJCTogZSk7Ci0KLQkJCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJLmdldEJhY2tQYXRoKChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAKLQkJCQkJCQkJPyAoKG93bmVyRWxlbWVudCAhPSBudWxsKSA/IG93bmVyRWxlbWVudAotCQkJCQkJCQk6IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSkKLQkJCQkJCQkJOiBlbGVtZW50KTsKLQotCQkJCWJ1ZmZlci5hcHBlbmQoUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgodi50b1N0cmluZygpLAotCQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ0RhdGFCYXNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWdEYXRhQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTg5NmJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ0RhdGFCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqICBCYXNlIGNsYXNzIG1hbmFnaW5nIGNvbmZpZ3VyYXRpb24gZGF0YQotICogIEN1cnJlbnQgc3ViIGNsYXNzOiBTdXBwcG9ydGluZ0VsZW1lbnREYXRhCi0gKiAgVG8gZG86IHJlZmFjdG9yIENvbmZpZ3VyYXRpb25EYXRhIHRvIGJlIGEgc3ViIGNsYXNzIG9mIGl0IHRvby4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDI0LCAyMDA4Ci0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25maWdEYXRhQmFzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFVwZGF0ZUNoYW5nZXMgPSB0cnVlOwotCXByaXZhdGUgSUxpYnJhcnlNYW5hZ2VyIGxpYnJhcnlNYW5hZ2VyOyAKLQlwcml2YXRlIEFkYXB0ZXIgY29uZmlnTGlzdGVuZXI7Ci0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYkxpc3RlbmVyOwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVVcGRhdGUgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZ0NoYW5nZXMgPSBmYWxzZTsJCQotCQotCXB1YmxpYyBDb25maWdEYXRhQmFzZShNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJCi0JCWNvbmZpZ0xpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJaWYgKGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQkJCWlmICgJCXR5cGUgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQkJfHwgCXR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZCi0JCQkJCQl8fCAJdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFCi0JCQkJCQl8fCAgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsJCQkJCQotCQkJCQlzZXROZWVkVXBkYXRlQ2hhbmdlcyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNvbmZpZy5lQWRhcHRlcnMoKS5hZGQoY29uZmlnTGlzdGVuZXIpOwotCQkJCQotCQlsaWJMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGxpYnJhcnlDaGFuZ2VkLCBvcHRpb246ICIgKyBvcHRpb24gKyAiLCAiICsgY2hhbmdlZEl0ZW1zKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCX0JCQkJCi0JCQkJaGFuZGxlTGlicmFyeUNoYW5nZShvcHRpb24sIGNoYW5nZWRJdGVtcyk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kTGlicmFyeShjb25maWcpOwotCQlsaWJyYXJ5TWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmKGxpYnJhcnlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWxpYnJhcnlNYW5hZ2VyLmFkZExpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMaWJyYXJ5Q2hhbmdlKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0JCWlmIChpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQlzZXROZWVkVXBkYXRlQ2hhbmdlcyh0cnVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29uZmlnLmVBZGFwdGVycygpLnJlbW92ZShjb25maWdMaXN0ZW5lcik7Ci0JCWxpYnJhcnlNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSB7Ci0JCXJldHVybiBuZWVkVXBkYXRlQ2hhbmdlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZWVkVXBkYXRlQ2hhbmdlcyhib29sZWFuIG5lZWRVcGRhdGVDaGFuZ2VzKSB7Ci0JCXRoaXMubmVlZFVwZGF0ZUNoYW5nZXMgPSBuZWVkVXBkYXRlQ2hhbmdlczsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNldE5lZWRVcGRhdGVDaGFuZ2VzOiAiICsgbmVlZFVwZGF0ZUNoYW5nZXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZVVwZGF0ZSgpIHsKLQkJcmV0dXJuIGVuYWJsZVVwZGF0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVVcGRhdGUoYm9vbGVhbiBlbmFibGVVcGRhdGUpIHsKLQkJdGhpcy5lbmFibGVVcGRhdGUgPSBlbmFibGVVcGRhdGU7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzZXRFbmFibGVVcGRhdGU6ICIgKyBlbmFibGVVcGRhdGUpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWcoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlnKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGFuZ2VzKCkgewotCQlpZiAoISBpc0VuYWJsZVVwZGF0ZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlpZiAoISBpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaXNVcGRhdGluZ0NoYW5nZXMoKSkgewotCQkJcmV0dXJuOwkJCQotCQl9Ci0JCQotCQlsb25nIHQgPSAwOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1cGRhdGVDaGFuZ2VzXygpIC0+ICIgKyBnZXRUeXBlKCkpOwkvLyROT04tTkxTLTEkCi0JCQl0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVwZGF0ZUNoYW5nZXMoKTogIiArIGdldFR5cGUoKSk7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQl1cGRhdGVDaGFuZ2VJbXBsKCk7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCXQgPSAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXBkYXRlQ2hhbmdlc18oKSA8LSB0aW1lOiAiICsgdCArICIsICIgKyBnZXRUeXBlKCkpOwkvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGVDaGFuZ2VJbXBsKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0aW5nQ2hhbmdlcygpIHsKLQkJcmV0dXJuIHVwZGF0aW5nQ2hhbmdlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcGRhdGluZ0NoYW5nZXMoYm9vbGVhbiB1cGRhdGluZ0NoYW5nZXMpIHsKLQkJdGhpcy51cGRhdGluZ0NoYW5nZXMgPSB1cGRhdGluZ0NoYW5nZXM7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzZXRVcGRhdGluZ0NoYW5nZXM6ICIgKyB1cGRhdGluZ0NoYW5nZXMgKyAiLCAiICsgZ2V0VHlwZSgpKTsvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQJCQkJCQkJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKCkgewotCQlpZiAodGhpcyBpbnN0YW5jZW9mIFN1cHBvcnRpbmdFbGVtZW50RGF0YSkgewotCQkJcmV0dXJuICJTdXBwb3J0aW5nRWxlbWVudERhdGEiOyAvLyROT04tTkxTLTEkCi0JCX0gCi0KLQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwYmE5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIElOU1RBTkNFID0gbmV3IENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgRUF0dHJpYnV0ZSBhdHRyaWJ1dGUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBwcmVzZW50YXRpb24gbmFtZSBvZiBicmVha2Rvd24gZWxlbWVudAotCQkvLwotCQlpZihhdHRyaWJ1dGUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UHJlc2VudGF0aW9uTmFtZShlLCBjb25maWcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZSwgYXR0cmlidXRlLAotCQkJCWNvbmZpZyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoVmFyaWFiaWxpdHlFbGVtZW50IGUsIEVSZWZlcmVuY2UgcmVmLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXMwbkZlYXR1cmUocmVmKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGUsIHJlZiwKLQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSk7Ci0JCX0gZWxzZSBpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pczAxRmVhdHVyZShyZWYpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZSwgcmVmLAotCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShDb250ZW50RGVzY3JpcHRpb24gZGVzYywKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBvd25lciwgRVJlZmVyZW5jZSByZWYsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLQkJTGlzdCB2YWx1ZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShkZXNjLCBvd25lciwgcmVmLAotCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZykpOwotCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCWlmICh2YWx1ZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgdmFsdWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpKTsKLQotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJT2JqZWN0IHJlc29sdmVkID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iamVjdCwgY29uZmlnKTsKLQkJCWlmIChyZXNvbHZlZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlc29sdmVkOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIG9iamVjdDsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLAotCQkJRGVzY3JpYmFibGVFbGVtZW50IG93bmVyLCBFQXR0cmlidXRlIGF0dHIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGRlc2MsIG93bmVyLCBhdHRyLAotCQkJCWNvbmZpZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0N2U4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkRlYnVnVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogIENsYXNzIG1hbmFnaW5nIGNvbmZpZ3VyYXRpb24gYWRkL3N1YnRyYWN0ZWQgZGF0YSBjYWxjdWxhdGlvbiBhbmQgY2FjaGUKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDIwLCAyMDA3Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkRhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBmYWxzZTsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQotCS8vIG1ha2Ugc3VyZSB0aGUgbWFwIGlzIGNyZWF0ZWQuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PiBzdWJzdHJhY3RlZEVsZW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PiBhZGRlZEVsZW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbmVlZFVwZGF0ZUNoYW5nZXMgPSB0cnVlOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBvcmlnaW5hbFN1YnN0cmFjdGVkOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBvcmlnbmFsQWRkZWQ7Ci0JcHJpdmF0ZSBJTGlicmFyeU1hbmFnZXIgbGlicmFyeU1hbmFnZXI7IAotCXByaXZhdGUgQWRhcHRlciBjb25maWdMaXN0ZW5lcjsKLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZVVwZGF0ZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdXBwb3J0aW5nRWxlbWVudERhdGEgc3VwcG9ydGluZ0VsZW1lbnREYXRhOwotCQotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkRhdGEgbmV3Q29uZmlndXJhdGlvbkRhdGEoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJT2JqZWN0IG9iaiA9IEV4dGVuc2lvbkhlbHBlci5jcmVhdGUoQ29uZmlndXJhdGlvbkRhdGEuY2xhc3MsIGNvbmZpZyk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRGF0YSkgewotCQkJcmV0dXJuIChDb25maWd1cmF0aW9uRGF0YSkgb2JqOwotCQl9CQkKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uRGF0YShjb25maWcpOwotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRhdGEoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCQotCQljb25maWdMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCWlmIChpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJCQlpZiAoCQl0eXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IAl0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWQotCQkJCQkJfHwgCXR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRQotCQkJCQkJfHwgIHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7CQkJCQkKLQkJCQkJc2V0TmVlZFVwZGF0ZUNoYW5nZXModHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljb25maWcuZUFkYXB0ZXJzKCkuYWRkKGNvbmZpZ0xpc3RlbmVyKTsKLQkJCQkKLQkJbGliTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBsaWJyYXJ5Q2hhbmdlZCwgb3B0aW9uOiAiICsgb3B0aW9uICsgIiwgIiArIGNoYW5nZWRJdGVtcyk7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQl9CQkJCQotCQkJCWhhbmRsZUxpYnJhcnlDaGFuZ2Uob3B0aW9uLCBjaGFuZ2VkSXRlbXMpOwotCQkJfQotCQl9OwotCQkKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZExpYnJhcnkoY29uZmlnKTsKLQkJbGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlpZihsaWJyYXJ5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5TWFuYWdlci5hZGRMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGlicmFyeUNoYW5nZShpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQlpZiAoaXNOZWVkVXBkYXRlQ2hhbmdlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJc2V0TmVlZFVwZGF0ZUNoYW5nZXModHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGdldFVwZGF0aW5nQ2hhbmdlcygpIHsKLQkJcmV0dXJuIG9yaWdpbmFsU3Vic3RyYWN0ZWQgIT0gbnVsbCAmJiBvcmlnbmFsQWRkZWQgIT0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoYW5nZXMoKSB7Ci0JCWlmICghIGlzRW5hYmxlVXBkYXRlKCkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCWlmICghIGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRVcGRhdGluZ0NoYW5nZXMoKSkgewotCQkJcmV0dXJuOwkJCQotCQl9Ci0JCQotCQlsb25nIHQgPSAwOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1cGRhdGVDaGFuZ2VzXygpIC0+ICIpOwkvLyROT04tTkxTLTEkCi0JCQl0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJdXBkYXRlQ2hhbmdlc18oKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJdCA9ICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1cGRhdGVDaGFuZ2VzXygpIDwtIHRpbWU6ICIgKyB0KTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hhbmdlc18oKSB7Ci0JCXN1YnN0cmFjdGVkRWxlbU1hcC5jbGVhcigpOwotCQlhZGRlZEVsZW1NYXAuY2xlYXIoKTsKLQkJCi0JCUxpc3Qgc3ViTGlzdCA9IGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJTGlzdCBhZGRMaXN0ID0gY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKTsKLQkJaWYgKHN1Ykxpc3QuaXNFbXB0eSgpICYmIGFkZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHN1Ykxpc3QvYWRkTGlzdCBhcmUgZW1wdHkuIik7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJb3JpZ2luYWxTdWJzdHJhY3RlZCA9IGNvbnZlcnRUb01hcChzdWJMaXN0KTsKLQkJb3JpZ25hbEFkZGVkID0gY29udmVydFRvTWFwKGFkZExpc3QpOwotCQkKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCURlYnVnVXRpbC5wcmludCgib3JpZ2luYWxTdWJzdHJhY3RlZDogIiwgbnVsbCwgb3JpZ2luYWxTdWJzdHJhY3RlZC52YWx1ZXMoKSwgMik7CS8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVXRpbC5wcmludCgib3JpZ25hbEFkZGVkOiAiLCBudWxsLCBvcmlnbmFsQWRkZWQudmFsdWVzKCksIDIpOwkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlib29sZWFuIGNoYW5nZWQgPSByZW1vdmUob3JpZ2luYWxTdWJzdHJhY3RlZCwgb3JpZ25hbEFkZGVkKTsKLQkJaWYgKGNoYW5nZWQgJiYgbG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJvcmlnbmFsQWRkZWQgYWZ0ZXIgcmVtb3ZlOiAiLCBudWxsLCBvcmlnbmFsQWRkZWQudmFsdWVzKCksIDIpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGNhbFN1YnN0cmFjdGVkID0gKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4pIAotCQkJCQkJCSgoSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4pb3JpZ2luYWxTdWJzdHJhY3RlZCkuY2xvbmUoKTsKLQkJTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBjYWxBZGRlZCA9IChNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+KSAKLQkJCQkJCQkoKEhhc2hNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+KW9yaWduYWxBZGRlZCkuY2xvbmUoKTsKLQkJCQkJCi0JCWNoYW5nZWQgPSBoYW5kbGVDb250cmlidXRvcnMoY2FsU3Vic3RyYWN0ZWQsIHRydWUpOwotCQlpZiAoY2hhbmdlZCAmJiBsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoImNhbFN1YnN0cmFjdGVkIGFmdGVyIGhhbmRsZUNvbnRyaWJ1dG9yczogIiwgbnVsbCwgY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIDIpOy8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCQotCQljYWxTdWJzdHJhY3RlZCA9IGhhbmRsZVJlcGxhY2VycyhjYWxTdWJzdHJhY3RlZCwgdHJ1ZSk7Ci0JCWNhbEFkZGVkID0gaGFuZGxlUmVwbGFjZXJzKGNhbEFkZGVkLCBmYWxzZSk7Ci0JCQotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJjYWxTdWJzdHJhY3RlZDogIiwgbnVsbCwgY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIDIpOy8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVXRpbC5wcmludCgiY2FsQWRkZWQ6ICIsIG51bGwsIGNhbEFkZGVkLnZhbHVlcygpLCAyKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWNoYW5nZWQgPSByZW1vdmUoY2FsU3Vic3RyYWN0ZWQsIGNhbEFkZGVkKTsKLQkJaWYgKGNoYW5nZWQgJiYgbG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJjYWxBZGRlZCBhZnRlciByZW1vdmU6ICIsIG51bGwsIG9yaWduYWxBZGRlZC52YWx1ZXMoKSwgMik7Ly8kTk9OLU5MUy0xJAotCQl9CQkJCQotCQkKLQkJaWYgKGNhbFN1YnN0cmFjdGVkICE9IG51bGwpIHsKLQkJCXVwZGF0ZUVsZW1lbnRNYXAoY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIHN1YnN0cmFjdGVkRWxlbU1hcCk7Ci0JCX0KLQkJaWYgKGNhbEFkZGVkICE9IG51bGwpIHsKLQkJCXVwZGF0ZUVsZW1lbnRNYXAoY2FsQWRkZWQudmFsdWVzKCksIGFkZGVkRWxlbU1hcCk7Ci0JCX0KLQkJCi0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoInN1YnN0cmFjdGVkRWxlbU1hcDogIiwgbnVsbCwgc3Vic3RyYWN0ZWRFbGVtTWFwLnZhbHVlcygpLCAyKTsJLy8kTk9OLU5MUy0xJAotCQkJRGVidWdVdGlsLnByaW50KCJhZGRlZEVsZW1NYXA6ICIsIG51bGwsIGFkZGVkRWxlbU1hcC52YWx1ZXMoKSwgMik7CQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXNldE5lZWRVcGRhdGVDaGFuZ2VzKGZhbHNlKTsJCQotCQkKLQkJb3JpZ2luYWxTdWJzdHJhY3RlZCA9IG51bGw7CQkvL25vdCBuZWVkZWQgYWZ0ZXIgdXBkYXRlCi0JCW9yaWduYWxBZGRlZCA9IG51bGw7CQkJLy9ub3QgbmVlZGVkIGFmdGVyIHVwZGF0ZQotCX0KLQkKLQkvL3JldHVybiB0cnVlIGlmIHNvbWV0aGluZyBnZXRzIHJlbW92ZWQsIG90aGVyd2lzZSBmYWxzZQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmUoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBzb3VyY2VNYXAsIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gdGFyZ2V0TWFwKSB7Ci0JCWlmIChzb3VyY2VNYXAgPT0gbnVsbCB8fCBzb3VyY2VNYXAuaXNFbXB0eSgpIHx8Ci0JCQl0YXJnZXRNYXAgPT0gbnVsbCB8fCB0YXJnZXRNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7CQkJCQotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBzb3VyY2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gdGFyZ2V0TWFwLnJlbW92ZShpdC5uZXh0KCkpOwotCQkJaWYgKGNjICE9IG51bGwpIHsKLQkJCQlyZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQkKLQkvL3JldHVybiB0cnVlIGlmIGFueSBjaGFuZ2UKLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ29udHJpYnV0b3JzKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gbWFwLCAgYm9vbGVhbiBzdWJzdHJhY3RlZCkgewotCQlpZiAobWFwID09IG51bGwgfHwgISBzdWJzdHJhY3RlZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUxpc3Q8Q29udGVudENhdGVnb3J5PiBhZGRlZExpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJCQkKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCUxpc3Q8Q29udGVudENhdGVnb3J5PiBjb250cmlidXRlcnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhjYywgY29uZmlnKTsKLQkJCWFkZGVkTGlzdC5hZGRBbGwoY29udHJpYnV0ZXJzKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPENvbnRlbnRDYXRlZ29yeT4gaXQgPSBhZGRlZExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gaXQubmV4dCgpOwotCQkJbWFwLnB1dChjYy5nZXRHdWlkKCksIGNjKTsKLQkJfQotCQkKLQkJcmV0dXJuICEgYWRkZWRMaXN0LmlzRW1wdHkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGhhbmRsZVJlcGxhY2VycyhNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IG9yaWdpbmFscywgYm9vbGVhbiBzdWJzdHJhY3RlZCkgewotCQlpZiAob3JpZ2luYWxzID09IG51bGwgfHwgb3JpZ2luYWxzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG9yaWdpbmFsczsKLQkJfQotCQkKLQkJTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IG9yaWdpbmFscy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgcmVwbGFjZXIgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKGNjLCBjb25maWcpOwotCQkJYm9vbGVhbiB0b0tlZXAgPSB0cnVlOwotCQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCQl0b0tlZXAgPSBmYWxzZTsKLQkJCQkKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgbmVzdGVkUmVwbGFjZXIgPSByZXBsYWNlcjsKLQkJCQl3aGlsZSAobmVzdGVkUmVwbGFjZXIgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlciA9IG5lc3RlZFJlcGxhY2VyOwotCQkJCQluZXN0ZWRSZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIobmVzdGVkUmVwbGFjZXIsIGNvbmZpZyk7Ci0JCQkJfQotCQkJCWlmIChzdWJzdHJhY3RlZCkgewotCQkJCQlpZiAob3JpZ2luYWxTdWJzdHJhY3RlZC5jb250YWluc0tleShyZXBsYWNlci5nZXRHdWlkKCkpKSB7Ci0JCQkJCQl0b0tlZXAgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRvS2VlcCkgewotCQkJCXJldC5wdXQoY2MuZ2V0R3VpZCgpLCBjYyk7Ci0JCQl9CQkJCi0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0JCQkKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gY29udmVydFRvTWFwKENvbGxlY3Rpb248Q29udGVudENhdGVnb3J5PiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwgfHwgY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJfQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PigpOwkJCi0JCWZpbGxNYXAoY29sbGVjdGlvbiwgbWFwKTsKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxNYXAoQ29sbGVjdGlvbjxDb250ZW50Q2F0ZWdvcnk+IGNvbGxlY3Rpb24sIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gbWFwKSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gaXQubmV4dCgpOwotCQkJaWYgKCEgbWFwLmNvbnRhaW5zS2V5KGNjLmdldEd1aWQoKSkpIHsKLQkJCQltYXAucHV0KGNjLmdldEd1aWQoKSwgY2MpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4gZ2V0Q2hpbGRDQyhDb250ZW50Q2F0ZWdvcnkgY2MpIHsKLQkJaWYgKGNjIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0U3ViQ2F0ZWdvcmllcygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXJldHVybiAoKERpc2NpcGxpbmUpIGNjKS5nZXRTdWJkaXNjaXBsaW5lKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlyZXR1cm4gKChEaXNjaXBsaW5lR3JvdXBpbmcpIGNjKS5nZXREaXNjaXBsaW5lcygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuICgoRG9tYWluKSBjYykuZ2V0U3ViZG9tYWlucygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJfQotCQlpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXJldHVybiAoKFJvbGVTZXRHcm91cGluZykgY2MpLmdldFJvbGVTZXRzKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRWxlbWVudE1hcCgJQ29sbGVjdGlvbjxDb250ZW50Q2F0ZWdvcnk+IGNjTGlzdCwKLQkJCQkJCQkJCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRNYXApIHsKLQkJaWYgKGNjTGlzdCA9PSBudWxsIHx8IGNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU2V0PFN0cmluZz4gc2VlbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNjTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoISBzZWVucy5jb250YWlucyhjYy5nZXRHdWlkKCkpKSB7Ci0JCQkJYWRkVG9FbGVtZW50TWFwKGNjLCBlbGVtZW50TWFwKTsKLQkJCQkvL2VsZW1lbnRNYXAucHV0KGNjLmdldEd1aWQoKSwgY2MpOwotCQkJfQotCQkJc2VlbnMuYWRkKGNjLmdldEd1aWQoKSk7Ci0JCX0KLQl9CQkJCi0KLQkvL05vIGR1cGxpY2F0ZXMgaW4gdGhlIHJldHVybmVkIGVsZW1lbnRzCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGdldEVsZW1lbnRzKENvbnRlbnRDYXRlZ29yeSBjYykgewotCQlDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0QXNzZXRzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0Q2hlY2tsaXN0cygpKTsKLQkJZWxlbWVudHMuYWRkQWxsKGNjLmdldENvbmNlcHRzQW5kUGFwZXJzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0RXhhbXBsZXMoKSk7Ci0JCWVsZW1lbnRzLmFkZEFsbChjYy5nZXRHdWlkZWxpbmVzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpKTsJCQotCQkKLQkJaWYgKGNjIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0U3ViQ2F0ZWdvcmllcygpKTsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERpc2NpcGxpbmUpIGNjKS5nZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSk7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEaXNjaXBsaW5lKSBjYykuZ2V0U3ViZGlzY2lwbGluZSgpKTsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERpc2NpcGxpbmUpIGNjKS5nZXRUYXNrcygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoRGlzY2lwbGluZUdyb3VwaW5nKSBjYykuZ2V0RGlzY2lwbGluZXMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERvbWFpbikgY2MpLmdldFN1YmRvbWFpbnMoKSk7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEb21haW4pIGNjKS5nZXRXb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChSb2xlU2V0KSBjYykuZ2V0Um9sZXMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKFJvbGVTZXRHcm91cGluZykgY2MpLmdldFJvbGVTZXRzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgVG9vbCkgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoVG9vbCkgY2MpLmdldFRvb2xNZW50b3JzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChXb3JrUHJvZHVjdFR5cGUpIGNjKS5nZXRXb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0VW5pcXVlQ29sbGVjdGlvbihlbGVtZW50cyk7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBnZXRVbmlxdWVDb2xsZWN0aW9uKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiByZXQgPSBuZXcgTGlua2VkSGFzaFNldDxNZXRob2RFbGVtZW50PigpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJaWYgKCEgcmV0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJcmV0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gaXNPd25lclNlbGVjdGVkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJYm9vbGVhbiByZXQgPSBpc093bmVyU2VsZWN0ZWRfKGVsZW1lbnQsIGNoZWNrU3VidHJhY3RlZCk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBpc093bmVyU2VsZWN0ZWQ6ICIgKyByZXQgKyAiLCAiICsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlEZWJ1Z1V0aWwudG9TdHJpbmcoZWxlbWVudCwgMikpOwkKLQkJfQkJCQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPd25lclNlbGVjdGVkXyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKGdldFVwZGF0aW5nQ2hhbmdlcygpKSB7Ci0JCQlpZiAob3JpZ2luYWxTdWJzdHJhY3RlZC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkgfHwgCi0JCQkJb3JpZ25hbEFkZGVkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJdXBkYXRlQ2hhbmdlcygpOwotCQkJCQkJCi0JCQkvLzE4MjgzMQotLyoJCQlpZiAoYWN0aXZlICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJaWYgKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0qLwotCQkJCi0JCQkvLyBzaW5jZSBVTUEgMS4wLjQsIGNvbmZpZ3VyYXRpb24gY2FuIGhhdmUgYWRkZWQgY2F0ZWdvcmllcyAKLQkJCS8vIGFuZCBzdWJ0cmFjdGVkIGNhdGVnb3JpZXMuIFRoZSBvcmRlciBvZiBmaWx0ZXJpbmcgaXM6Ci0JCQkvLyAxLiBhbnkgZWxlbWVudCBpbiB0aGUgc3VidHJhY3RlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBleGNsdWRlZAotCQkJLy8gMi4gYW55IGVsZW1lbnQgaW4gdGhlIGFkZGVkIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGluY2x1ZGVkCi0JCQkvLyAzLiBhbnkgZWxlbWVudCBub3QgaW4gdGhlIHNlbGVjdGVkIHBhY2thZ2Ugb3IgcGx1Z2luIHNob3VsZCBiZSBleGNsdWRlZC4JCQotCQkJaWYgKCBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KXsKLQkJCQkJaWYgKGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGFkZGVkRWxlbU1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbi5pc1N1cHBvcnRpbmcoKSkgewotCQkJCVN1cHBvcnRpbmdFbGVtZW50RGF0YSBzZURhdGEgPSBnZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKTsKLQkJCQlpZiAoc2VEYXRhLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWlmIChzZURhdGEuaXNVcGRhdGluZ0NoYW5nZXMoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzZURhdGEuaXNTdXBwb3J0aW5nRWxlbWVudChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCQotCQkvLyBlbGVtZW50cyBiZXlvbmQgY29uZmlndXJhdGlvbiBzY29wZSBzaG91bGQgYmUgYWx3YXlzIHZpc2libGUKLQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQlyZXR1cm4gKHBsdWdpbnMgIT0gbnVsbCkgJiYgcGx1Z2lucy5jb250YWlucyhlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHRoZSBvd25lcnByb2Nlc3MgY2FuJ3Qgc2hvdywgY2FuJ3QgYWNjZXB0Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgKChBY3Rpdml0eSkgZWxlbWVudCkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCAmJiBiYXNlICE9IGVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBvd25pbmdQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpOwotCQkJCQlpZiAoIG93bmluZ1Byb2MgIT0gbnVsbCAmJiBvd25pbmdQcm9jICE9IGVsZW1lbnQgCi0JCQkJCQkJJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcob3duaW5nUHJvYywgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUVPYmplY3QgcGtnID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQotCQkJLy8gYWNjZXB0IGdsb2JhbCBwYWNrYWdlIGlmIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNHbG9iYWxQYWNrYWdlKChNZXRob2RQYWNrYWdlKSBwa2cpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKHBsdWdpbiwgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpOwotCQkJfQotCi0JCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJaWYgKHBrZ3MgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gcGVyIFBob25nJ3MgcmVxdWVzdCwgZm9yIFByb2Nlc3NQYWNrYWdlLCBjaGVjayB0aGUKLQkJCS8vIFByb2Nlc3NDb21wb25lbnQgcGFyZW50IGluc3RlYWQKLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCUVPYmplY3QgcGtnX29sZCA9IHBrZzsKLQkJCQl3aGlsZSAoKHBrZyAhPSBudWxsKSAmJiAhKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQkJCQkmJiAhcGtncy5jb250YWlucyhwa2cpKSB7Ci0JCQkJCXBrZyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGlmIG5vIFByb2Nlc3NDb21wb25lbnQsIHRoaXMgaXMgYSByZWFsIHBhY2thZ2UsIHVzZSBpdAotCQkJCWlmICggcGtnID09IG51bGwgKSB7Ci0JCQkJCXBrZyA9IHBrZ19vbGQ7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpZiBwYWNrYWdlIG5vdCBzZWxlY3RlZCwgcmV0dXJuIGZhbHNlCi0JCQlpZiAoKHBrZyA9PSBudWxsKSB8fCAhcGtncy5jb250YWlucyhwa2cpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250cmlidXRlZEJhc2VJblN1YnN0cmFjdGVkKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgIT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChzdWJzdHJhY3RlZEVsZW1NYXAuY29udGFpbnNLZXkoYmFzZS5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcoYmFzZSwgY29uZmlnLCB0cnVlKSkgewotCQkJcmV0dXJuIGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoYmFzZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkVG9FbGVtZW50TWFwKENvbnRlbnRDYXRlZ29yeSBjYywgTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gZWxlbWVudE1hcCkgewotCQlDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRMaXN0ID0gZ2V0RWxlbWVudHMoY2MpOwkJCi0JCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQllbGVtZW50TWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgZWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29uZmlnLmVBZGFwdGVycygpLnJlbW92ZShjb25maWdMaXN0ZW5lcik7Ci0JCWxpYnJhcnlNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSB7Ci0JCXJldHVybiBuZWVkVXBkYXRlQ2hhbmdlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZWVkVXBkYXRlQ2hhbmdlcyhib29sZWFuIG5lZWRVcGRhdGVDaGFuZ2VzKSB7Ci0JCXRoaXMubmVlZFVwZGF0ZUNoYW5nZXMgPSBuZWVkVXBkYXRlQ2hhbmdlczsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNldE5lZWRVcGRhdGVDaGFuZ2VzOiAiICsgbmVlZFVwZGF0ZUNoYW5nZXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVVcGRhdGUoKSB7Ci0JCXJldHVybiBlbmFibGVVcGRhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlVXBkYXRlKGJvb2xlYW4gZW5hYmxlVXBkYXRlKSB7Ci0JCXRoaXMuZW5hYmxlVXBkYXRlID0gZW5hYmxlVXBkYXRlOwotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gc2V0RW5hYmxlVXBkYXRlOiAiICsgZW5hYmxlVXBkYXRlKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGdldEFkZGVkRWxlbWVudHMoKSB7Ci0JCXJldHVybiBhZGRlZEVsZW1NYXAudmFsdWVzKCk7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGdldFN1YnRyYWN0ZWRFbGVtZW50cygpIHsKLQkJcmV0dXJuIHN1YnN0cmFjdGVkRWxlbU1hcC52YWx1ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50SW5TdWJ0cmFjdGVkQ2F0ZWdvcnkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBzdWJzdHJhY3RlZEVsZW1NYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRJbkFkZGVkQ2F0ZWdvcnkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBhZGRlZEVsZW1NYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpOwotCX0KLQotCXByaXZhdGUgU3VwcG9ydGluZ0VsZW1lbnREYXRhIGdldFN1cHBvcnRpbmdFbGVtZW50RGF0YSgpIHsKLQkJaWYgKHN1cHBvcnRpbmdFbGVtZW50RGF0YSA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nRWxlbWVudERhdGEgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKS5nZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGluZ0VsZW1lbnREYXRhOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N1YnN0cmFjdGVkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZ2V0VXBkYXRpbmdDaGFuZ2VzKCkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXVwZGF0ZUNoYW5nZXMoKTsKLQotCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJaWYgKGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZhY3RvcnkudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZhY3RvcnkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdiOGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GYWN0b3J5LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5EZXBlbmRlbmN5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWZjcCA9IG51bGw7Ci0KLQkvLyBtYXAgb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBuYW1lIHRvIENvbmlndXJhdGlvbiBvYmplY3QKLQlwcml2YXRlIE1hcCBjb25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBMaWJyYXJ5UHJvY2Vzc29yIGxpYnJhcnlQcm9jID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQotCS8vIG1hcCBvZiBjb25maWcgbmFtZSB0byBsYXlvdXQgbWFuYWdlcgotCS8vIGVhY2ggY29uZmlnIGhhcyBpdCdzIG93biBsYXlvdXQgbWFuYWdlcgotCXByaXZhdGUgTWFwIGxheW91dE1nck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIERlcGVuZGVuY3lNYW5hZ2VyIGRlcE1nciA9IG51bGw7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkZhY3RvcnkoTGlicmFyeVByb2Nlc3NvciBsaWJyYXJ5UHJvYykgewotCi0JCXRoaXMubGlicmFyeVByb2MgPSBsaWJyYXJ5UHJvYzsKLQotCQlhZmNwID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGxpYnJhcnlQcm9jCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWxpYnJhcnlQcm9jLmFkZExpc3RlbmVyKG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVEKSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQkJaWYgKGNvbmZpZ01hcC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlnTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkoKENvbmZpZ3VyYXRpb25DbG9zdXJlKSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQljb25maWdNYXAuY2xlYXIoKTsKLQotCQlpZiAobGF5b3V0TWdyTWFwLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRNZ3JNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCSgoRWxlbWVudExheW91dE1hbmFnZXIpIGl0Lm5leHQoKSkuY2xlYXIoKTsKLQkJCX0KLQkJfQotCi0JCWxheW91dE1nck1hcC5jbGVhcigpOwotCi0JCWlmIChkZXBNZ3IgIT0gbnVsbCkgewotCQkJZGVwTWdyLmNsZWFyKCk7Ci0JCQlkZXBNZ3IgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQcm9jLmdldExpYnJhcnkoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldExpYnJhcnlVcmkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5UHJvYy5nZXRMaWJyYXJ5VVJJKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbGlicmFyeVByb2MuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gYWZjcDsKLQl9Ci0KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIgZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKSB7Ci0JCS8vIHJldHVybiBsaWJyYXJ5UHJvYy5nZXREZXBlbmRlbmN5TWFuYWdlcigpOwotCQlpZiAodGhpcy5kZXBNZ3IgPT0gbnVsbCkgewotCQkJZGVwTWdyID0gbmV3IERlcGVuZGVuY3lNYW5hZ2VyKGxpYnJhcnlQcm9jKTsKLQkJfQotCi0JCXJldHVybiBkZXBNZ3I7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5UHJvYy5nZXRMaWJyYXJ5KCkuZUNvbnRlbnRzKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaXRlbXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Q29uZmlndXJhdGlvbihTdHJpbmcgY29uZmlnTmFtZSkgewotCQl0aGlzLmN1cnJlbnRDb25maWdOYW1lID0gY29uZmlnTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZ05hbWU7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKSB7Ci0JCXJldHVybiBnZXRMYXlvdXRNYW5hZ2VyKHRoaXMuY3VycmVudENvbmZpZ05hbWUpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNYW5hZ2VyKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1nciA9IG51bGw7Ci0JCWlmIChjb25maWdOYW1lID09IG51bGwpIHsKLQkJCW1nciA9IGxpYnJhcnlQcm9jLmdldExheW91dE1hbmFnZXIoKTsKLQkJfSBlbHNlIHsKLQkJCW1nciA9IChFbGVtZW50TGF5b3V0TWFuYWdlcikgbGF5b3V0TWdyTWFwLmdldChjb25maWdOYW1lKTsKLQkJCWlmIChtZ3IgPT0gbnVsbCkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbGlicmFyeVByb2MKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJCW1nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcihjb25maWcpOwotCQkJCWxheW91dE1nck1hcC5wdXQoY29uZmlnTmFtZSwgbWdyKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtZ3I7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0JCXJldHVybiBnZXRDbG9zdXJlKGN1cnJlbnRDb25maWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUgZ2V0Q2xvc3VyZShTdHJpbmcgY29uZmlnTmFtZSkgewotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjb25maWcgPSBudWxsOwotCQlpZiAoY29uZmlnTmFtZSAhPSBudWxsKSB7Ci0JCQljb25maWcgPSAoQ29uZmlndXJhdGlvbkNsb3N1cmUpIGNvbmZpZ01hcC5nZXQoY29uZmlnTmFtZSk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIG1vZGVsQ29uZmlnID0gbGlicmFyeVByb2MKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJCWNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZSh0aGlzLCBtb2RlbENvbmZpZyk7Ci0JCQkJY29uZmlnTWFwLnB1dChjb25maWdOYW1lLCBjb25maWcpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlQ2xvc3VyZSgpIHsKLQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgYyA9IGdldENsb3N1cmUoY3VycmVudENvbmZpZ05hbWUpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljLm1ha2VDbG9zdXJlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmZjIwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZmlsdGVyIHRvIGFsbG93IGZpbHRlcmluZyBlbGVtZW50IAotICogYW5kIHJlYWxpemUgdGhlIGVsZW1lbnQgZmVhdHVyZSB2YWx1ZXMgd2l0aGluIGEgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmlsdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJQ29uZmlndXJhdG9yIHsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsJCi0JLy9wcml2YXRlIFZpZXdlciB2aWV3ZXI7Ci0JCi0JLy8gc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBjb25maWd1cmF0aW9uIHZpZXcgdG8gdHJ1ZSwgaS5lLiBjb250cmlidXRvcnMgYXJlIGRpc2NhcmRlZC4KLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9ycyA9IHRydWU7Ci0JCi0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcgYSA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPgotCSAqIEBwYXJhbSB2aWV3ZXIgYSA8Y29kZT5WaWV3ZXI8L2NvZGU+Ci0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25GaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCS8vdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25GaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9ycykgewotCQl0aGlzKG1ldGhvZENvbmZpZyk7Ci0JCXRoaXMuZGlzY2FyZENvbnRyaWJ1dG9ycyA9IGRpc2NhcmRDb250cmlidXRvcnM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChtZXRob2RDb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCi0JCWlmICggKEVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgfHwgIAotCQkJCShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikgKQotCQkJCSYmIEZlYXR1cmVWYWx1ZS5pc0JsYW5rSW5kaWNhdG9yKG9iaikgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhvYmopOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3coKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJbWV0aG9kQ29uZmlnKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChMb2cuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiT2JqZWN0IGZpbHRlcmVkOiAiICsgKG9iaiA9PSBudWxsID8gbnVsbCA6IG9iai50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWFsaXplZCBjaGlsZHJlbiBmb3IgdGhlIGdpdmVuIG9iamVjdCBhbmQgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBvYmogT2JqZWN0Ci0JICogQHBhcmFtIGNoaWxkRmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiAKLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCWlmIChtZXRob2RDb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZyk7Ci0JCS8vIGRpc2NhcmQgdGhlIGNvbnRyaWJ1dG9ycwotCQlyZWFsaXplci5zZXREaXNjYXJkQ29udHJpYnV0b3IodGhpcy5kaXNjYXJkQ29udHJpYnV0b3JzKTsKLQotCQlpZiAoY2hpbGRGZWF0dXJlICE9IG51bGwgJiYgY2hpbGRGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCUxpc3QgdmFsdWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCShNZXRob2RFbGVtZW50KSBvYmosIGNoaWxkRmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLS8vCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgewotLy8JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCi0vLwl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvciNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yI3NldE1ldGhvZENvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJbWV0aG9kQ29uZmlnID0gY29uZmlnOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlJbmZvIGluZm8sIGJvb2xlYW4gaW5jbHVkZUJhc2UsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCi0JCWlmIChtZXRob2RDb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL3Jlc29sdmUgdG8gaW5jbHVkZSBjb250cmlidXRvcnMKLQkJcmVzb2x2ZUVsZW1lbnRDb250cmlidXRvcnMoZWxlbWVudCxpbmZvLHJlYWxpemVyKTsKLQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHRlbmRlZCBlbGVtZW50LCBnZXQgdGhlIGJhc2UgZWxlbWVudCdzCi0JCS8vIGNvbnRyaWJ1dG9ycwotCQkvLyBOT1RFOiB0aGUgYmFzZSBlbGVtZW50IGl0c2VsZiBzaG91bGQgbm90IGJlIGluY2x1ZGVkIHNpbmNlIGl0J3MKLQkJLy8gYWxyZWFkeSBoYW5kbGVkCi0JCS8vIGluIHRoZSBhY3Rpdml0eSByZWFsaXp0aW9uIGluIEl0ZW1Qcm92aWRlcnMuCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kZXIoZWxlbWVudCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgYmFzZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudChiYXNlLCByZWFsaXplcik7Ci0KLQkJCS8vIGlmIGluY2x1ZGViYXNlIGlzIHRydWUsIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgaW5oZXJpdGFuY2UgbGlzdAotCQkJaWYgKGluY2x1ZGVCYXNlKSB7Ci0JCQkJTGlzdCB2YWx1ZXMgPSBpbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpOwotCQkJCWlmICghdmFsdWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZXNvbHZlIHRoZSBiYXNlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb250cmlidXRvcnMgYW5kL29yIGJhc2UKLQkJCXJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KGUsIGluZm8sIGluY2x1ZGVCYXNlLCByZWFsaXplcik7Ci0KLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc29sdmVFbGVtZW50Q29udHJpYnV0b3JzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlJbmZvIGluZm8sIEVsZW1lbnRSZWFsaXplciByZWFsaXplcil7Ci0JCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250cmlidXRvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGdldCB0aGUKLQkJLy8gcmVmZXJlbmNlIHByb3BlcnRpZXMKLQkJLy8gaWYgYSBjb250cmlidXRvciBoYXMgcmVwbGFjZXIsIGl0J3MgcmVwbGFjZXIgaXMgdXNlZAotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZWxlbWVudCwgbWV0aG9kQ29uZmlnKTsKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlMaXN0IHZhbHVlcyA9IGluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJaWYgKCF2YWx1ZXMuY29udGFpbnMoZSkpIHsKLQkJCQkJdmFsdWVzLmFkZChlKTsKLQkJCQl9Ci0JCQkJcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoZSwgaW5mbywgZmFsc2UsIHJlYWxpemVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogcmVzb2x2ZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGVsZW1lbnQgYW5kIGdldCBhIGxpc3Qgb2YgY29udHJpYnV0b3JzLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIHJlYWxpemluZyBhY3RpdGl2eSBicmVha2Rvd24gZWxlbWVudHMgaW4gdGhlCi0JICogaXRlbVByb3ZpZGVycy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvciNnZXRWYXJpYWJpbGl0eUluZm8ob3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQpCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5SW5mbyBnZXRWYXJpYWJpbGl0eUluZm8oVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0KLQkJLy8gY2FsY3VsYXRlIHRoZSBlbGVtZW50IGZpcnN0Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZywgdHJ1ZSwgdHJ1ZSk7Ci0JCXJldHVybiBnZXRWYXJpYWJpbGl0eUluZm8odmUsIHJlYWxpemVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCi0JCS8vIGNhbGN1bGF0ZSB0aGUgZWxlbWVudCBmaXJzdAotCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodmUsIHJlYWxpemVyKTsKLQotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVZhcmlhYmlsaXR5SW5mbyBpbmZvID0gbmV3IFZhcmlhYmlsaXR5SW5mbyh2ZSk7Ci0JCWluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuYWRkKGUpOwotCi0JCXJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KGUsIGluZm8sIHRydWUsIHJlYWxpemVyKTsKLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcsIHRydWUsIHRydWUpOwotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50LCByZWFsaXplcik7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgdGFza3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkVGFza0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIGRpc2NpcGxpbmUgY29udHJpYnV0b3JzIAotCQkJCS8vIGluc3RlYWQgc2hvdWxkIHJlYWxpemUgdG8gdGhlIGJhc2UgZGlzY2lwbGluZQotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFRhc2sgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFRhc2spb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5UYXNrX0Rpc2NpcGxpbmVzLCAKLQkJCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBkb21haW4KLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXREb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKXsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIGRvbWFpbiBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSBkb21haW4KLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoV29ya1Byb2R1Y3Qpb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Eb21haW5zLCAKLQkJCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBXUCBUeXBlCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0V3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCl7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gMTU4OTI0IC0gd3JvbmcgY2F0ZWdvcmllcyBpbiBjb25maWd1cmF0aW9uIHZpZXcKLQkJCQkvLyBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHJlYWxpemVyCi0JCQkJLy8gd2Ugc2hvdWxkIG5vdCBkaXNjYXJkIHRoZSBXUFR5cGUgY29udHJpYnV0b3JzIAotCQkJCS8vIGluc3RlYWQgc2hvdWxkIHJlYWxpemUgdG8gdGhlIGJhc2UgCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFdvcmtQcm9kdWN0KW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgcm9sZXMKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkUm9sZUZpbHRlcigpewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgcm9sZXNldCBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSAKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBSb2xlICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShSb2xlKW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0cywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCB0b29sIG1lbnRvcnMKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIHRvb2wgY29udHJpYnV0b3JzIAotCQkJCS8vIGluc3RlYWQgc2hvdWxkIHJlYWxpemUgdG8gdGhlIGJhc2UgCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoVG9vbE1lbnRvcilvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVG9vbHMsIAotCQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciBkaXNjaXBsaW5lcyBhbmQgZGlzcGxpbmUgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RGlzY2lwbGluZXNGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gW0J1ZyAxNjI2MDNdIE5ldzogUmVwbGFjaW5nIGRpc2NpcGxpbmVzIGRvIGFwcGVhciBpbnNpZGUgdGhlaXIgcmVwbGFjZWQgZWxlbWVudHMgZGlzY2lwbGluZSBncm91cGluZ3MgCi0JCQkJLy8gYXMgd2VsbCBhcyBvdXRzaWRlIG9mIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5nCi0JCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcgKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lICkgJiYgCi0JCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkoTWV0aG9kRWxlbWVudClvYmosIAotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzLCAKLQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciByb2xlc2V0cyBhbmQgcm9sZXNldCBncm91cGluZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRSb2xlU2V0c0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyBbQnVnIDE2MjYwM10gTmV3OiBSZXBsYWNpbmcgZGlzY2lwbGluZXMgZG8gYXBwZWFyIGluc2lkZSB0aGVpciByZXBsYWNlZCBlbGVtZW50cyBkaXNjaXBsaW5lIGdyb3VwaW5ncyAKLQkJCQkvLyBhcyB3ZWxsIGFzIG91dHNpZGUgb2YgdGhlIGRpc2NpcGxpbmUgZ3JvdXBpbmcKLQkJCQkvLyBzYW1lIGZvciByb2xlc2V0IGdyb3VwaW5nCi0JCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcgKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0ICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShNZXRob2RFbGVtZW50KW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1MWUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0hlbHBlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25IZWxwZXIgewotCQotCXByaXZhdGUgc3RhdGljIENvbmZpZ0hlbHBlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0Jc3RhdGljIHsKLQkJQ29uZmlnSGVscGVyRGVsZWdhdGUgZXh0ZW5kZWREZWxlZ2F0ZSA9IChDb25maWdIZWxwZXJEZWxlZ2F0ZSkgRXh0ZW5zaW9uSGVscGVyCi0JCQkJLmdldEV4dGVuc2lvbihMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJImNvbmZpZ0hlbHBlckRlbGVnYXRlRXh0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZXh0ZW5kZWREZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZSA9IG5ldyBDb25maWdIZWxwZXJEZWxlZ2F0ZSgpOwotCQl9IGVsc2UgewotCQkJZGVsZWdhdGUgPSBleHRlbmRlZERlbGVnYXRlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29uZmlnSGVscGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbmhlcml0aW5nU2xvdEZlYXR1cmVzID0gZmFsc2U7IAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IgPSAiPHAvPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBDb250ZW50RGVzY3JpcHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZXNjcmlwdGlvbkVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pOwotCi0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIG1ldGhvZCBwYWNqPWthZ2UgaXMgYSBnbG9iYWwgcGFja2FnZQotCSAqIAotCSAqIEBwYXJhbSBwa2cge0BsaW5rIE1ldGhvZFBhY2thZ2V9Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2xvYmFsUGFja2FnZShNZXRob2RQYWNrYWdlIHBrZykgewotCQlpZiAocGtnID09IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZTogbWV0aG9kIHBhY2thZ2UgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlNZXRob2RQbHVnaW4gcCA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQlpZiAocCA9PSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5pc0dsb2JhbFBhY2thZ2U6IFVuYWJsZSB0byBmaW5kIG1ldGhvZCBwbHVnLWluIGZvciAiICsgcGtnLmdldE5hbWUoKSArICI6ICIgKyBwa2cuZ2V0R3VpZCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5pc1N5c3RlbVBhY2thZ2UocCwgcGtnKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5Db25maWcoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGluQ29uZmlnKGVsZW1lbnQsIGNvbmZpZywgdHJ1ZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbkNvbmZpZyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJcmV0dXJuIGluQ29uZmlnKGVsZW1lbnQsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGNoZWNrU3VidHJhY3RlZCwgYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJaWYgKCFpc093bmVyU2VsZWN0ZWQoZWxlbWVudCwgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvL0J1ZyAyMDc0MjkgLSBDb25maWdyYXRpb246IFdhcnJpbmcgaW5mbyBzaG91bGQgc2hvd24gd2hlbiBkZXNlbGVjdCB0aGUgcmVwbGFjZWQgZWxlbWVudAotCQkvLyBmb3IgY29uZmlndXJhdGlvbiBjbG9zdXJlIGNoZWNraW5nLCB0aGUgbWlzc2luZyBiYXNlIHNob3VsZCBiZSByZXBvcnRlZCAKLQkJLy8gc28gdGhlIGVsZW1lbnQgYmVlbiBjaGVja2VkIHN0aWxsIHRyZWF0ZWQgYXMgaW4gY29uZmlnCi0JCS8vIGFkZGVkIHRoZSBjaGVja0Jhc2UgZmxhZyB0byBpZ25vcmUgdGhlIGJhc2UgY2hlY2tpbmcKLQkJLy8gZm9yIGNvbmZpZ3VyYXRpb24gcmVhbGl6YXRpb24sIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IHRvIHRydWUKLQkJLy8gc28gdGhlIHJlcGxhY2VyIG1pc3NpbmcgYmFzZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZy4KLQkJCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwYWxjZXIsIGFuZCBpdCdzIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZQotCQkvLyByZXBsYWNlcgotCQkvLyBub25lIG9mIHRoZSByZXBsYWNlcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkJaWYgKGNoZWNrQmFzZSAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJaWYgKGlzUmVwbGFjZXIodmUpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGluQ29uZmlnKGJhc2UsIGNvbmZpZykpIHsKLQkJCQkJCi0vLwkJCQkJLy8gSW52YWxpZCBob3RzcG90IGNyZWF0ZWQgZm9yIGxvY2FsbHkgcmVwbGFjZWQgYWN0aXZpdHkgaW4gYWN0aXZpdHkgZGlhZ3JhbQotLy8JCQkJCS8vIHRoaXMgaXMgYmVjYXVzZSB0aGUgYWN0aXZpdHkgaGFzIG1vcmUgdGhhbiBvbmUgbG9jYWwgcmVwbGFjZXJzCi0vLwkJCQkJLy8gaW4gdmVyc2lvbiA3LjAsIGxvY2FsIHJlcGxhY2VtZW50IGlzIG1vZGVsZWQgdGhlIHNhbWUgd2F5IGFzIG5vbWFsIHJlcGxhY2VtZW50Ci0vLwkJCQkJLy8gd2UgbmVlZCB0byBpZ25vcmUgdGhpcyBjaGVja2luZyBmb3IgYWN0aXZpdHkKLS8vCQkJCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSApIHsKLS8vCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcygKLQkJCQkJCQliYXNlKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJCWlmICgoZSAhPSBlbGVtZW50KQotCQkJCQkJCQkmJiAoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpCi0JCQkJCQkJCSYmIGlzT3duZXJTZWxlY3RlZChlLCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnOiBJZ25vcmluZyByZXBsYWNpbmcgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIicgc2luY2UgaXRzIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSByZXBsYWNlciBpbiB0aGUgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gYmFzZSBtdXN0IGJlIGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCXJldHVybiBnZXREZWxlZ2F0ZSgpLmlzT3duZXJTZWxlY3RlZChlbGVtZW50LCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYSBjb250cmlidXRvcj8KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVM7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYSByZXBsYWNlcj8KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcGxhY2VyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVM7Ci0JfQotCQotCS8qKgotCSAqIGlzICJiIiBhbiBhbmNlc3RvciBvZiAiYSIgdGhyb3VnaCBhICJjb250cmlidXRlIGNoYWluIiByZWxhdGlvbnNoaXAKLQkgKiBAcGFyYW0gYQotCSAqIEBwYXJhbSBiCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250cnVidXRlQ2hhaW4oVmFyaWFiaWxpdHlFbGVtZW50IGEsIFZhcmlhYmlsaXR5RWxlbWVudCBiKSB7CQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IGE7Ci0JCXdoaWxlIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpICE9IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsZW1lbnQgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCA9PSBiKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhIGV4dGVuZC1yZXBsYWNlcj8KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZFJlcGxhY2VyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUzsKLQl9Ci0JCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYW4gZXh0ZW5kZXI/Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXBsYWNlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbi4gT25seSBvbmUgcmVwbGFjZXIKLQkgKiBpcyBhbGxvd2VkLiBJZiBtb3JlIHRoYW4gb25lIHJlcGxhY2VyIGlzIGZvdW5kLCB0aGVuIG5vbmUgb2YgdGhlbSB3aWxsIGJlCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgcmVwbGFjZXIgaWYgdGhlcmUgaXMgb25lIGFuZCBPTkxZIG9uZSwKLQkgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0UmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBudWxsOwotCi0JCS8vIHRoaXMgd2lsbCBnZXQgYWxsIHJlcGxhY2VycyByZWN1cnNpdmVseS4gd2Ugb25seSBuZWVkIHRoZSBpbW1lZGlhdGUKLQkJLy8gb25lcwotCQkvLyBmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlbGVtZW50LAotCQkvLyBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZWxlbWVudCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIGUgPT0gbnVsbCB8fCAhaW5Db25maWcoZSwgY29uZmlnKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyAKLQkJCQkJfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUykgewotCQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcjogUmVwbGFjZXIgaWdub3JlZCBmb3IgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIicgc2luY2UgaXQgaGFzIG1vcmUgdGhhbiBvbmUgcmVwbGFjZXJpbiB0aGUgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gaWYgbW9yZSB0aGFuIG9uZSByZXBsYWNlciwgcmV0dXJuIG51bGwKLQkJCQl9Ci0KLQkJCQl2ZSA9IGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBpbW1lZGlhdGUgY29udHJpYnV0b3JzIG9mIHRoZSBlbGVtZW50IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKiBJZiBhIGNvbnRyaWJ1dG9yIGhhcyBpbW1lZGlhdGUgcmVwbGFjZXIsIGl0IGlzIHJlcGFsY2VkIHdpdGggdGhlIHJlcGxhY2VyCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb250cmlidXRvcnMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQkvLyBUaGlzIG1ldGhvZCBnZXQgYWxsIGNvbnRyaWJ1dG9ycyByZWN1cnNpdmVseSwKLQkJLy8gd2Ugb25seSBuZWVkIHRoZSBmaXJzdCBsZXZlbAotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoZWxlbWVudCk7IGl0Lmhhc05leHQoKTsgKQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykKLQkJCQkJJiYgaW5Db25maWcoZSwgY29uZmlnKSkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXBsYWNlciA9IGdldFJlcGxhY2VyKGUsIGNvbmZpZyk7Ci0JCQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCQkJaXRlbXMuYWRkKHJlcGxhY2VyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpdGVtcy5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFeHRlbmRlcnMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKQotCQkJCQkmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXQ8VmFyaWFiaWxpdHlFbGVtZW50PiBnZXRMb2NhbENvbnRyaWJ1dGVyc0FuZFJlcGxhY2VycyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVNldDxWYXJpYWJpbGl0eUVsZW1lbnQ+IGl0ZW1zID0gbmV3IEhhc2hTZXQ8VmFyaWFiaWxpdHlFbGVtZW50PigpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChpc0xvY2FsQ29udHJpYnV0ZXJPclJlcGxhY2VyKGUpKQotCQkJCQkmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsQ29udHJpYnV0ZXJPclJlcGxhY2VyKAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXJldHVybiB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04KLQkJCQl8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNob3coTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGNhblNob3coZWxlbWVudCxjb25maWcsIHRydWUpOwotCX0KLQkKLQotCS8qKgotCSAqIGVsZW1lbnQgY2FuJ3Qgc2hvdyBpbiB0aGUgY29uZmlndXJhdGlvbiB0cmVlIGlmIDEuIHRoZSBlbGVtZW50IGlzIG5vdCBpbgotCSAqIHRoZSBjb25maWd1cmF0aW9uIDIuIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0aW9uIHRvIGFub3RoZXIgZWxlbWVudCAzLgotCSAqIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwbGFjZXIgdG8gYSAzLiB0aGUgZWxlbWVudCBoYXMgYSByZXBsYWNlbWVudAotCSAqIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2hvdyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFpbkNvbmZpZyhlbGVtZW50LCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0vLwkJLy8gaWYgaXQ7cyBhbiBhY3Rpdml0eSwgcmV0dXJuIHNpbmNlIGNvbnRyaWJ1dG9ycyBhcmUgbG9jYWwgY29udHJpYnV0aW9uIGFuZCBuZWVkcyB0byBiZSBzaG93bgotLy8JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfQotCi0vLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8JCS8vIHRoaXMgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBzaW5jZSB0aGUgc3VwcHJlc3Npb24gc3RhdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0aXZpdHkgYWRhcHRvciBmYWN0b3J5Ci0vLwkJLy8ganVzdCBsZWF2ZSBpdCBoZXJlIGZvciBub3cgc2luY2UgaXQgZG9lcyBub3QgaHVydC4gdGFrZSBpdCBhd2F5IGluIG5leHQgcmVsZWFzZQotCQkvLyAKLQkJLy8gTk8sIHdlIHN0aWxsIG5lZWQgdG8ga2VlcCB0aGlzIHRvIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBvZiBkZXNjcmlwdG9ycyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgZGVzY3JpcHRvci4gCi0JCS8vIGZvciBleGFtcGxlLCB3aGVuIGRpc3BsYXlpbmcgYSBURCBwYWdlLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcHJlc3Npb24gb2YgdGhlIHJlZmVyZW5jZWQgV1BEcyBhbmQgUkRzLiAKLQkJLy8gMDAzOTUyNzggLSBCcm93c2luZyBURCB3aXRoIHN1cHByZXNzZWQgUkQvV1BEIHVuZGVyIGl0ICAtLSBzdXBwcmVzc2VkIG9uZXMgc3RpbGwgc2hvd2luZwotCQkvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBkZXNjcmlwdG9yIGlzIHdpdGggYW4gaW5oZXJpdGVkIGFjdGl2aXR5LiAKLQkJLy8gaW4gdGhhdCBjYXNlLCB0aGUgc3VwcHJlc3Npb24gbmVlZCB0byBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBhY3Rpdml0eSBwYXRoLiBUT0RPCi0JCUJvb2xlYW4gc3VwcmVzc2VkID0gZWxlbWVudC5nZXRTdXBwcmVzc2VkKCk7Ci0JCWlmIChzdXByZXNzZWQgIT0gbnVsbCAmJiBzdXByZXNzZWQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0vLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlpZiAoICFjYW5TaG93QnlDaGVja2luZ1ZFKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQsY29uZmlnKSApIHsKLQkJCQlyZXR1cm4gIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2hvd0J5Q2hlY2tpbmdWRShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpewkJCi0KLQkJLy8gaWYgdGhpcyBpcyBhbiBleHRlbmRlciwgYWx3YXlzIHNob3csIGV2ZW4gdGhvdWdoIGl0IGV4dGVuZHMgYQotCQkvLyBjb250cmlidXRvcgotCQlpZiAoaXNFeHRlbmRlcihlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBnZXRSZXBsYWNlcihlLCBjb25maWcpICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGZvciBhY3Rpdml0eSwgZG9uJ3Qgc2hvdyB0aGUgb25lcyB0aGF0IGNvbnRhaW5zIGNvbnRyaWJ1dG9ycyAKLQkJLy8gdGhlIHJlc2FvbiBmb3IgdGhpcyBpcyB0byBzaW1wbGlmeSB0aGUgbG9naWMuCi0JCS8vIGFzc3VtaW5nIHRoYXQgdXNlciB1c2VzIHRoaXMgYWN0aXZpdHkgdG8gY29udHJpYnV0ZSB0byBvdGhlciBhY3Rpdml0aWVzCi0JCS8vIHNvIHRoYXQgcGFydCBzaG91bGQgbm90IGJlIGludm9sdmVkIGluIHRoZSBuYXZpZ2F0aW9uCi0JCS8vIAotCQkvLyBKaW5odWEgWGksIDA3LzE0LzA2LCAKLQkJaWYgKCAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSAmJiBoYXNDb250cmlidXRvcigoQWN0aXZpdHkpZSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl3aGlsZSAoKGUgIT0gbnVsbCkgJiYgaXNSZXBsYWNlcihlKSkgewotCQkJZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbi4gMS4gaWYgaXQncyBhCi0JICogY29udHJpYnV0b3IsIHNob3cgdGhlIG5hbWUgb2YgdGhlIGJhc2UgZWxlbWVudCAyLiBpZiBpdCBoYXMgYQotCSAqIHJlcGxhY2VtZW5ldCwgc2hvdyB0aGUgbmFtZSBvZiB0aGUgcmVwbGFjZW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJaWYgKGlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQlyZXR1cm4gZ2V0TmFtZShlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgY29uZmlnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcCA9IGdldFJlcGxhY2VyKGUsIGNvbmZpZyk7Ci0JCQkJaWYgKHJlcCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXROYW1lKHJlcCwgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBwcmVzZW50YXRpb24gbmFtZSBmb3IgYW4gZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkKLQkJLy8gW0J1ZyAxOTYzOTldIFAtbmFtZSBpcyBub3QgaW5oZXJpdGVkIGZyb20gaXRzIGJhc2UgZWxlbWVudCBpbiBhbiBleHRlbmRpbmcgZWxlbWVudAotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkJbmFtZSA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlpZiAoIFN0clV0aWwuaXNCbGFuayhuYW1lKSAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlFbGVtZW50UmVhbGl6ZXIgciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7CQotCQkJTWV0aG9kRWxlbWVudCBtZSA9IGVsZW1lbnQ7Ci0KLQkJCVNldDxNZXRob2RFbGVtZW50PiBzZWVucyA9IG5ldyBIYXNoU2V0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCQlkbyB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZE1lID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbWU7Ci0JCQkJbWUgPSAoRGVzY3JpYmFibGVFbGVtZW50KUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKG1lLCBmLCByKTsKLQkJCQlpZiAoIG1lID09IG51bGwgKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAob2xkTWUgPT0gbWUpIHsKLQkJCQkJbWUgPSBvbGRNZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCWlmIChtZSA9PSBudWxsKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0JCQkJCQotCQkJCW5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCltZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCWlmIChzZWVucy5jb250YWlucyhtZSkpIHsJLy90byBwcmV2ZW50IGxvb3AgaW4gY2FzZSBzdWNoIGFzCQkJCQkJCQkJCQkKLQkJCQkJYnJlYWs7CQkJCQkvL2JvdGggZXh0ZW5kLXJlcGxhY2VyIGFuZCBiYXNlIGhhdmUgZW1wdHkgcHJlcyBuYW1lCi0JCQkJfQotCQkJCXNlZW5zLmFkZChtZSk7Ci0JCQl9IHdoaWxlICggU3RyVXRpbC5pc0JsYW5rKG5hbWUpICk7Ci0JCX0KLQkJCi0JCWlmICggU3RyVXRpbC5pc0JsYW5rKG5hbWUpICkgewotCQkJbmFtZSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmFyaWFiaWxpdHkgZWxlbWVudCBvd25lci4gSWYgdGhlIGVsZW1lbnQgaXMgYQotCSAqIFZhcmlhYmlsaXR5RWxlbWVudCwgcmV0dXJuIGl0c2VsZiBvdGhlcndpc2UsIGZpbmQgaXQncyBvd25lci4gRm9yCi0JICogZXhhbXBsZSwgYSBDb250ZW50RGVzY3Jpb3Rpb24gb2JqZWN0IGlzIG93bmVyZWQgYnkgYSBWYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gVmFyaWFiaWxpdHlFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFibGVPd25lcihNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCXJldHVybiAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCS8vIHJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRPd25lciggKENvbnRlbnREZXNjcmlwdGlvbillICk7Ci0JCQlFT2JqZWN0IGVPYmogPSBlLmVDb250YWluZXIoKTsKLQkJCWlmIChlT2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIChWYXJpYWJpbGl0eUVsZW1lbnQpIGVPYmo7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBtZXJnYWJsZSBvciBub3QKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01lcmdhYmxlQXR0cmlidXRlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghZmVhdHVyZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3NOYW1lKCkuZXF1YWxzKAotCQkJCSJqYXZhLmxhbmcuU3RyaW5nIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gZmVhdHVyZSBpZCBpcyBub3QgZ2xvYmFsbHkgdW5pcXVlLCBjYW4ndCBkbyBhIHN3aXRjaCBoZXJlCi0JCS8vIGNvbXBhcmUgdGhlIGFjdHVyZSBmZWF0cnVlIGluc3RlYWQKLQkJLyoKLQkJICogc3dpdGNoICggZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSApIHsgY2FzZQotCQkgKiBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOiBjYXNlCi0JCSAqIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCSAqIENvbnRyaWJ1dGluZyBhIFVuaXF1ZSBJRCBmb3Igd29yayBwcm9kdWN0IHJlbmRlcnMKLQkJICogYmFkIGh0bWwgLy8gZG9uJ3QgbWVyZ2UgVW5pcXVlIElEOiBjYXNlCi0JCSAqIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDogcmV0dXJuIGZhbHNlOyB9Ci0JCSAqLwotCi0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXMgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWU/Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSk7Ci0JfQotCQotCS8qKgotCSAqIGlzIHRoaXMgYSB0by1vbmUgZmVhdHVyZT8KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpczAxRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgJiYgIWZlYXR1cmUuaXNNYW55KCk7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhpcyBhIHRvLW1hbnkgZmVhdHVyZT8KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpczBuRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgJiYgZmVhdHVyZS5pc01hbnkoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgVGhlIExpc3Qgb2YgdmFsdWVzIG9mIHRoZSBmZWF0dXJlLiBpZiB0aGUgZmVhdHVyZSBpcyBhIDAuLjEKLQkgKiAgICAgICAgICAgIGFzc29jaWF0aW9uLCB0aGUgTGlzdCBob2xkcyBhIHNpbmdsZSB2YWx1ZSBpZiBhbnkgZm9yCi0JICogICAgICAgICAgICByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLCBpdCdzIGEgbGlzdCBvZiByZWZlcmVuY2VzIGZvcgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIGZlYXR1cmUsIGl0J3MgYSBsaXN0IG9mIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUKLQkgKiAgICAgICAgICAgIG1lcmdlcmVkIGZvciAwLi4xIGFzc29jaWF0aW9uLCB0aGUgbGlzdCBtYXkgY29udGFpbiAxIHZhbHVlLgotCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLS8vCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotLy8JCQlMaXN0IHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0vLwkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBudWxsLCBmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwotLy8JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgT3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgZmVhdHVyZSAKLQkJLy8gZm9yIGV4YW1wbGUsIGlmIGFuIGFjdGl2aXR5IGNvbnRyaWJ1dGVzIHRvIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLAotCQkvLyBzb21lIENhcGFiaWxpdHlQYXR0ZXJuIHNwZWNpZmljIGZlYXR1cmUgbWF5IG5vdCBiZSBhIHZhbGlkIGZlYXR1cmUgZm9yIHRoZSBBY3Rpdml0eQotLy8JCUxpc3QgZmVhdHVyZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotCQlpZiAoICFmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZ2V0VmFyaWFibGVPd25lcigoT3duZXJFbGVtZW50ID09IG51bGwpID8gZWxlbWVudAotCQkJCTogT3duZXJFbGVtZW50KTsKLQotCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0KLQkJdmFsdWVzLmFkZCh2ZSwgdmFsdWUpOwotCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gcmVhbGl6ZSB0aGUgdmFyaWFiaWxpdHkgcmVsYXRpb25zaGlwCi0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGFjY29yZGluZyB0byBQZXRlciwgdGhlIHJlYWxpemF0aW9uIHNob3VsZCBiZSBhbHdheXMgdG9wIGRvd24uCi0JCS8vIGkuZSByZWFsaXplIHRoZSBiYXNlIGZpcnN0LCB0aGVuIGluY2x1ZGUgdGhlIGNvbnRyaWJ1dGlvbnMKLQkJX19tZXJnZUJhc2UoZWxlbWVudCwgdmUsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZ1bGZpbGxhYmxlRWxlbWVudCkgewotCQkJaWYgKGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpKSB7Ci0JCQkJbWVyZ2VTbG90RmVhdHVyZVZhbHVlcygoRnVsZmlsbGFibGVFbGVtZW50KSBlbGVtZW50LCBmZWF0dXJlLAotCQkJCQkJY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChPd25lckVsZW1lbnQgaW5zdGFuY2VvZiBGdWxmaWxsYWJsZUVsZW1lbnQpIHsKLQkJCW1lcmdlU2xvdEZlYXR1cmVWYWx1ZXMoZWxlbWVudCwgKEZ1bGZpbGxhYmxlRWxlbWVudCkgT3duZXJFbGVtZW50LAotCQkJCQlmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwkKLQkJfQotCQkKLQkJaWYgKHJlYWxpemVyICE9IG51bGwpIHsKLQkJCXJlYWxpemVyLmFkZEV4dHJhRmVhdHVyZVZhbHVlcyhlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQl9Ci0JCQotCQlpZiAoIWlzMDFGZWF0dXJlKGZlYXR1cmUpIHx8ICh2YWx1ZXMuc2l6ZSgpID09IDApICkgewotCQkJX19tZXJnZUNvbnRyaWJ1dG9ycyhlbGVtZW50LCB2ZSwgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBjYWxjRnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKEZ1bGZpbGxhYmxlRWxlbWVudCBlbGVtZW50LAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gcmVzdWx0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigpOwotCQkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJT2JqZWN0IGZ1bGxmaWxsc09iaiA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLAotCQkJCXJlYWxpemVyKTsJCi0JCQotCQlpZiAoISAoZnVsbGZpbGxzT2JqIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCXJldHVybiByZXN1bHRMaXN0OwotCQl9Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKTsKLQkJZm9yIChGdWxmaWxsYWJsZUVsZW1lbnQgc2xvdCA6IChMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4pIGZ1bGxmaWxsc09iaikgewotCQkJc2xvdCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIGdldENhbGN1bGF0ZWRFbGVtZW50KHNsb3QsIGNvbmZpZyk7Ci0JCQlpZiAoc2xvdE1hdGNoaW5nKHNsb3QsIGVsZW1lbnQsIHJlYWxpemVyKSkgewotCQkJCXJlc3VsdExpc3QuYWRkKHNsb3QpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVzdWx0TGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPEZ1bGZpbGxhYmxlRWxlbWVudD5zb3J0KHJlc3VsdExpc3QsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZVNsb3RGZWF0dXJlVmFsdWVzKEZ1bGZpbGxhYmxlRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJRmVhdHVyZVZhbHVlIHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCWlmICghaW5oZXJpdGluZ1Nsb3RGZWF0dXJlcykgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSkgewkJCQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHNsb3RzID0gY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscyhlbGVtZW50LCBjb25maWcpOwotCi0JCWZvciAoRnVsZmlsbGFibGVFbGVtZW50IHNsb3QgOiBzbG90cykgewotCQkJaWYgKHNsb3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCXNsb3QgPSAoRnVsZmlsbGFibGVFbGVtZW50KSBnZXRDYWxjdWxhdGVkRWxlbWVudChzbG90LCBjb25maWcpOwotCQkJCWNhbGN1bGF0ZUZlYXR1cmUoc2xvdCwgbnVsbCwgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsCi0JCQkJCQlyZWFsaXplcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZVNsb3RGZWF0dXJlVmFsdWVzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50IE93bmVyRWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCUZlYXR1cmVWYWx1ZSB2YWx1ZXMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlpZiAoIWluaGVyaXRpbmdTbG90RmVhdHVyZXMpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghKE93bmVyRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh2YWx1ZXMuc2l6ZSgpID4gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gc2xvdHMgPSBjYWxjRnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKE93bmVyRWxlbWVudCwgY29uZmlnKTsKLQotCQlmb3IgKEZ1bGZpbGxhYmxlRWxlbWVudCBzbG90IDogc2xvdHMpIHsKLQkJCWlmIChzbG90IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlzbG90ID0gKEZ1bGZpbGxhYmxlRWxlbWVudCkgZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoc2xvdCwgY29uZmlnKTsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gc2xvdE93bmVkRWxlbWVudCA9IHNsb3QuZ2V0UHJlc2VudGF0aW9uKCk7CQkJCQotCQkJCWNhbGN1bGF0ZUZlYXR1cmUoc2xvdE93bmVkRWxlbWVudCwgc2xvdCwgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsCi0JCQkJCQlyZWFsaXplcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZVNsb3RPcHBvc2l0ZUZlYXR1cmVWYWx1ZXMoRnVsZmlsbGFibGVFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKCFpbmhlcml0aW5nU2xvdEZlYXR1cmVzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLkZ1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHNsb3RzID0gY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscyhlbGVtZW50LCBjb25maWcpOwotCi0JCWZvciAoRnVsZmlsbGFibGVFbGVtZW50IHNsb3QgOiBzbG90cykgewotCQkJc2xvdCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIGdldENhbGN1bGF0ZWRFbGVtZW50KHNsb3QsIGNvbmZpZyk7Ci0JCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoc2xvdCwgZmVhdHVyZSwgcmVhbGl6ZXIsIHZhbHVlcyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gY2FsY0Z1bGZpbGxzX0Z1bGZpbGxhYmxlRWxlbWVudCgKLQkJCUZ1bGZpbGxhYmxlRWxlbWVudCBzbG90LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gcmVzdWx0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigpOwotCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIKLQkJCQkubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0KLQkJTGlzdCBmdWxmaWxsaW5nTGlzdCA9IGNhbGMwbkZlYXR1cmVWYWx1ZShzbG90LCBBc3NvY2lhdGlvbkhlbHBlci5GdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cywgcmVhbGl6ZXIpOwotCi0JCWZvciAoRnVsZmlsbGFibGVFbGVtZW50IGVsZW1lbnQgOiAoTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KSBmdWxmaWxsaW5nTGlzdCkgewotCQkJZWxlbWVudCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIGdldENhbGN1bGF0ZWRFbGVtZW50KGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpZiAoc2xvdE1hdGNoaW5nKHNsb3QsIGVsZW1lbnQsIHJlYWxpemVyKSkgewotCQkJCXJlc3VsdExpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVzdWx0TGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPEZ1bGZpbGxhYmxlRWxlbWVudD5zb3J0KHJlc3VsdExpc3QsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0TGlzdDsKLQl9CQkKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNsb3RNYXRjaGluZyhGdWxmaWxsYWJsZUVsZW1lbnQgc2xvdCwKLQkJCUZ1bGZpbGxhYmxlRWxlbWVudCBlbGVtZW50LCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKHNsb3QgPT0gbnVsbCB8fCAhc2xvdC5nZXRJc0Fic3RyYWN0KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCi0KLQkJaWYgKHJlYWxpemVyICE9IG51bGwpIHsJCi0JCQlyZXR1cm4gcmVhbGl6ZXIuc2xvdE1hdGNoaW5nKHNsb3QsIGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgX19tZXJnZUJhc2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYW4gZXh0ZW5kZWQgZWxlbWVudCwgZ2V0IHRoZSBiYXNlIGVsZW1lbnQncwotCQkvLyBwcm9wZXJ0aWVzIGlmIG5lZWRlZAotCQlib29sZWFuIGV4dGVuZFJlcGxhY2UgPSBpc0V4dGVuZFJlcGxhY2VyKHZlKSB8fCAKLQkJCQlFbGVtZW50UmVhbGl6ZXIuaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICYmIGlzUmVwbGFjZXIodmUpOwotCQlib29sZWFuIGlzRXh0ZW5kZXIgPSBpc0V4dGVuZGVyKHZlKTsKLQkJCi0JCWlmIChpc0V4dGVuZGVyIHx8IGV4dGVuZFJlcGxhY2UpIHsKLQkJCWJvb2xlYW4gbWVyZ2ViYXNlID0gZmFsc2U7Ci0JCQlpZiAoaXMwbkZlYXR1cmUoZmVhdHVyZSkpIHsKLQkJCQltZXJnZWJhc2UgPSB0cnVlOwotCQkJCWlmICggZXh0ZW5kUmVwbGFjZSAKLQkJCQkJCXx8IGlzRXh0ZW5kZXIgJiYgRWxlbWVudFJlYWxpemVyLmlnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMoKSkgewotCQkJCQltZXJnZWJhc2UgPSAodmFsdWVzLnNpemUoKSA9PSAwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGlzMDFGZWF0dXJlKGZlYXR1cmUpKSB7Ci0JCQkJbWVyZ2ViYXNlID0gKHZhbHVlcy5zaXplKCkgPT0gMCk7Ci0JCQl9IGVsc2UgewotCQkJCW1lcmdlYmFzZSA9IChpc01lcmdhYmxlQXR0cmlidXRlKGZlYXR1cmUpICYmICh2YWx1ZXMuc2l6ZSgpID09IDApKTsKLQkJCX0KLQotCQkJaWYgKG1lcmdlYmFzZSkgewotCQkJCS8vIEF1dGhvcmluZzogRXh0ZW5kaW5nIGEgYmFzZSB0aGF0IGhhcyBiZWVuCi0JCQkJLy8gcmVwbGFjZWQsIGRvZXMgbm90IGV4dGVuZCB0aGUgcmVwbGFjZW1lbnQKLQkJCQkvLyBuZWVkIHRvIGdldCB0aGUgcmVhbGl6ZWQgZWxlbWVudCwKLQkJCQkvLyB0aGUgYmFzZSBlbGVtZW50IG1pZ2h0IGJlIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lLAotCQkJCS8vIG9yIG1pZ2h0IGJlIGEgY29udHJpYnV0b3IgdG8gYW5vdGhlciBiYXNlCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmICggIWV4dGVuZFJlcGxhY2UgKSB7Ci0JCQkJCWU9IGdldENhbGN1bGF0ZWRFbGVtZW50KGUsIGNvbmZpZyk7Ci0JCQkJfQkJCQkJCi0JCQkJTWV0aG9kRWxlbWVudCBvID0gZTsKLQotCQkJCS8vIGlmIGl0J3MgYSBjb250YWlubWVudCBmZWF0dXJlLCBzdWNoIGFzIHN1Yi1hcnRpZmFjdHMKLQkJCQkvLyB0aGUgYmFzZSBzaG91bGQgbm90IGJlIHRoZSBjb250YWluZXIKLQkJCQkvLyAxNjIxNTQgLSBDaGVjayBjaXJjdWxhciByZWZlcmVuY2VzIHdpdGggcGFyZW50LS9zdWItYXJ0aWZhY3RzIGFuZCBwcmFjdGljZXMvc3ViLXByYWN0aWNlcwkJCQkKLQkJCQlpZiAoIGlzQ29udGFpbm1lbnRGZWF0dXJlKGZlYXR1cmUpICkgewotCQkJCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRDb250YWluZXJzKHZlLCBjb25maWcpOwotCQkJCQlpZiAoY29udGFpbmVycy5jb250YWlucyhlKSApIHsKLQkJCQkJCW1lcmdlYmFzZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKG1lcmdlYmFzZSAmJiAodmUgIT0gZSkgJiYgaW5Db25maWcoZSwgY29uZmlnKSkgewotCQkJCQkvLyBpZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24sCi0JCQkJCS8vIGdldCB0aGUgdGhlIGRlc2NyaXB0aW9uIG9iamVjdCBvZiB0aGUgYmFzZQotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQllID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG8sIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0KLQkJCQkJLy8gZm9yIGV4dGVuZGVyLCB3ZSBuZWVkIHRvIHJlLXNvcnQgdGhlIHN0ZXBzIGJhc2VkIG9uIHRoZQotCQkJCQkvLyBleHRlbmRlciBkZWZpbmVkIG9yZGVyCi0JCQkJCWlmICgodmUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCQkJCQkmJiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpKSkgewotCQkJCQkJb3JkZXJTZWN0aW9ucygoQ29udGVudEVsZW1lbnQpIHZlLCAoTGlzdCl2YWx1ZXMuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIF9fbWVyZ2VDb250cmlidXRvcnMoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJYm9vbGVhbiBtZXJnZWFibGUgPSB0cnVlOwotCQlpZiAoIGlzQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlKSAmJiAhaXNNZXJnYWJsZUF0dHJpYnV0ZShmZWF0dXJlKSApIHsKLQkJCW1lcmdlYWJsZSA9IGZhbHNlOwotCQl9IAotCQkKLQkJaWYgKCBtZXJnZWFibGUgKSB7Ci0JCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgY29udHJpYnV0b3JzIGluIHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlCi0JCQkvLyByZWZlcmVuY2UgcHJvcGVydGllcwotCQkJLy8gaWYgYSBjb250cmlidXRvciBoYXMgcmVwbGFjZXIsIGl0J3MgcmVwbGFjZXIgaXMgdXNlZAotCQkJTGlzdCBpdGVtcyA9IGdldENvbnRyaWJ1dG9ycyh2ZSwgY29uZmlnKTsKLQkJCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQlNZXRob2RFbGVtZW50IG8gPSBlOyAgLy8gdGhlIG93bmVyCi0KLQkJCQkJLy8gaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIGRlc2NyaXB0aW9uLAotCQkJCQkvLyBnZXQgdGhlIHRoZSBkZXNjcmlwdGlvbiBvYmplY3Qgb2YgdGhlIGNvbnRyaWJ1dG9yCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQllID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJCQl9Ci0JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgbywgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgcmVmbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCBPcHBvc2l0ZUZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgVGhlIExpc3Qgb2YgdmFsdWVzIG9mIHRoZSBmZWF0dXJlLiBmb3IgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZSwKLQkgKiAgICAgICAgICAgIGl0J3MgYSBsaXN0IG9mIHJlZmVyZW5jZXMgZm9yIGF0dHJpYnV0ZSBmZWF0dXJlLCBpdCdzIGEgbGlzdAotCSAqICAgICAgICAgICAgb2YgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBtZXJnZXJlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMpIHsKLQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIGZlYXR1cmUsIHRydWUsIGZhbHNlLCByZWFsaXplciwgdmFsdWVzKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSByZWZsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIE9wcG9zaXRlRmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplciBFbGVtZW50UmVhbGl6ZXIKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBUaGUgTGlzdCBvZiB2YWx1ZXMgb2YgdGhlIGZlYXR1cmUuIGZvciByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLAotCSAqICAgICAgICAgICAgaXQncyBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBmb3IgYXR0cmlidXRlIGZlYXR1cmUsIGl0J3MgYSBsaXN0Ci0JICogICAgICAgICAgICBvZiBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIG1lcmdlcmVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gbWVyZ2VSZXBsYWNlckJhc2UsIGJvb2xlYW4gbWVyZ2VFeHRlbmRlckJhc2UsIAotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyLCBGZWF0dXJlVmFsdWUgdmFsdWVzKSB7Ci0JCS8vIG11c3QgYmUgYSBNdWx0aVJlc291cmNlRU9iamVjdAotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBnZXRWYXJpYWJsZU93bmVyKGVsZW1lbnQpOwotCi0JCU9iamVjdCB2YWx1ZSA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQl2YWx1ZXMuYWRkKHZlLCB2YWx1ZSk7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgY29uZmlnICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBjZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0KLQkJCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250cmlidXRvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGdldCB0aGUKLQkJCS8vIHJlZmVyZW5jZSBwcm9wZXJ0aWVzCi0JCQlMaXN0IGl0ZW1zID0gZ2V0Q29udHJpYnV0b3JzKGNlLCBjb25maWcpOwotCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlLCBmZWF0dXJlLCBtZXJnZVJlcGxhY2VyQmFzZSwgbWVyZ2VFeHRlbmRlckJhc2UsIHJlYWxpemVyLCB2YWx1ZXMpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSByZXBsYWNlciBvZiBhIGJhc2UgZWxlbWVudCwgCi0JCQkvLyBnZXQgdGhlIGJhc2UgZWxlbWVudCdzIHByb3BlcnRpZXMKLQkJCS8vIG9ubHkgY292ZXIgMDEgb3IgMG0gcmVmZXJlbmNlcwotCQkJLy8gYXR0cmlidXRlcyBjYW4ndCBiZSBvcHBvc2l0ZSBmZWF0dXJlCi0KLQkJCS8vIHJlcGxhY2VkIGVsZW1lbnQgZG9lcyBub3Qgc2hvdyBpbmNvbWluZwotCQkJLy8gcmVsYXRpb25zaGlwcwotCQkJLy8gaW1jb21pbmcgcmVsYXRpb25zaGlwcyBhcmUgcmVwcmVzZW50ZWQgYnkgb3Bwb3NpdGUgZmVhdHVyZQotCQkJLy8gc28ga2VlcCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgYmFzZSBlbGVtZW50Ci0JCQkKLQkJCS8vIEluY29uc2lzdGVuY3kgYmV0d2VlbiBQdWJsaXNoZWQgV29yayBQcm9kdWN0OiBXb3JrbG9hZCBBbmFseXNpcyBQYWdlIGFuZCBSZWZlcmVuY2VkIFBhZ2VzCi0JCQkvLyB0aGlzIGlzIGZyb20gdGhlIGJhc2Ugb2YgdGhlIGV4dGVuZGVyLiAKLQkJCS8vIGluY29taW5nIGFzc29jaWF0aW9ucyBmcm9tIHRoZSBiYXNlIHNob3VsZCBiZSBkaXNjYXJkZWQgZm9yIGV4dGVuZGVycwotCQkJYm9vbGVhbiBtZXJnZWJhc2UgPSBmYWxzZTsKLQkJCWJvb2xlYW4gaXNFeHRlbmRlciA9IGlzRXh0ZW5kZXIoY2UpOwotCQkJYm9vbGVhbiBpc1JlcGxhY2VyID0gaXNSZXBsYWNlcihjZSk7Ci0JCQlib29sZWFuIGlzRXh0ZW5kUmVwbGFjZXIgPSBpc0V4dGVuZFJlcGxhY2VyKGNlKSB8fCAKLQkJCQlFbGVtZW50UmVhbGl6ZXIuaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICYmIGlzUmVwbGFjZXI7Ci0JCQkKLS8vCQkJLy9UaGlzIGlzIGEgY29uc2VydmF0aXZlIGZpeCBmb3IgIkV4dGVuZHMtcmVwbGFjZSBkaXNwbGluZSByZW5kZXJlZCB3cm9uZyBpbiBjb25mIHRyZWUgdmlldyIKLS8vCQkJaWYgKGlzRXh0ZW5kUmVwbGFjZXIoY2UpICYmICByZWFsaXplci5nZXRDbGFzcygpID09IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIuY2xhc3MpIHsKLS8vCQkJCWlmIChmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLkRpc2NpcGxpbmVfRGlzY2lwbGluZUdyb3VwaW5ncykgewotLy8JCQkJCWlzUmVwbGFjZXIgPSB0cnVlOwotLy8JCQkJfQotLy8JCQkJaWYgKGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncykgewotLy8JCQkJCWlzUmVwbGFjZXIgPSB0cnVlOwotLy8JCQkJfQkJCQkKLS8vCQkJfQotCQkJCi0JCQkvLyBleHRlbmRlclJlcGxhY2VyIGJlaGF2ZXMgbGlrZSByZXBsYWNlciB3aGVuIHJlYWxpemluZyBpbmNvbWluZyBhc3NvY2lhdGlvbnMKLQkJCS8vIEJ1ZyAxOTk2OTQgLSBFeHRlbmRzLVJlcGxhY2UgaWdub3JlcyBpbmNvbWluZyByZWxhdGlvbnNoaXBzIG9mIGNvbnRyaWJ1dGVyCi0JCQlpZiAoIGlzRXh0ZW5kUmVwbGFjZXIgKSB7Ci0JCQkJaXNSZXBsYWNlciA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWlmIChpc1JlcGxhY2VyKSB7Ci0JCQkJbWVyZ2ViYXNlID0gbWVyZ2VSZXBsYWNlckJhc2UgJiYgKCh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHx8ICh2YWx1ZXMuc2l6ZSgpID09IDApKTsKLQkJCX0gZWxzZSBpZiAoaXNFeHRlbmRlcikgewotCQkJCW1lcmdlYmFzZSA9IG1lcmdlRXh0ZW5kZXJCYXNlOwotCQkJfQotCi0JCQlpZiAobWVyZ2ViYXNlKSB7Ci0JCQkJLy8gcmVzb2x2ZSB0aGUgYmFzZSBjb250cmlidXRvciB0byB0aGUgYmFzZSBpZiBpIGFtIG5vdCBhCi0JCQkJLy8gcmVwbGFjZXIKLQkJCQkvLyBkb24ndCByZXNvbHZlIHRoZSBjb250cmlidXRvcnMgdG8gdGhlIGJhc2UgaWYgaSBhbSBhCi0JCQkJLy8gcmVwbGFjZXIsCi0JCQkJLy8gdGhlIGNhbGwgaXMgY29taW5nIGZyb20gdGhlIGJhc2UuIFNvIGlmIHJlc29sdmUgdG8gYmFzZSBhZ2FpbgotCQkJCS8vIHdpbGwgY2F1c2UgZGVhZGxvY2suCi0JCQkJLy8gZG9uJ3QgcmVzb2x2ZSB0byB0aGUgcmVwbGFjZXIgc2luY2Ugd2UgbmVlZCB0byBjYXJyeSBkb3duIGFsbAotCQkJCS8vIHRoZSBpbmNvbWluZyAwbiBhc3NvY2lhdGlvbnMgZnJvbSBiYXNlCi0JCQkJLy8gYWN0dWFsbHkgc2hvdWxkIHJlc29sdmUgdG8gcmVwbGFjZXIgaWYgaSBhbSBub3QgYSByZXBsYWNlcgotCQkJCS8vIChpLmUuIGkgYW0gYW4gZW50ZW5kZXIpCi0JCQkJLy8gdGhpcyBoYW5kbGVzIHRoZSBzZW5hcmlvOiBHMiByZXBsYWNlcyBHMSBhbmQgRzMgZXh0ZW5kcyBHMQotCQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplcjIgPSAKLQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnLCAoIWlzUmVwbGFjZXIpLCAoIWlzUmVwbGFjZXIpKTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGdldENhbGN1bGF0ZWRFbGVtZW50KGNlCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCByZWFsaXplcjIpOwotCQkJCQotCQkJCS8vIGlmIHRoZSBiYXNlIGVsZW1lbnQgcmVzb2x2ZWQgdG8gbnVsbCwgCi0JCQkJLy8gdGhpcyBpcyBiZWNhdXNlIGNhblNob3coKSBkb24ndCBhbGxvdyByZXBsYWNlZCBlbGVtZW50IHRvIHNob3cuCi0JCQkJLy8gd2UgZG9uJ3Qgd2FudCB0byB0YWtlIHRoZSByaXNrIHRvIGZpeCBFbGVtZW50UmVhbGl6ZXIKLQkJCQkvLyBzbyBmaXggaGVyZSBzaW5jZSA3LjAuMV9pZml4MSwgCi0JCQkJLy8gSmluaHVhIFhpLCA0LzE3LzA2Ci0JCQkJaWYgKCBlID09IG51bGwgKSB7Ci0JCQkJCWUgPSBjZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmICgoZSAhPSBjZSkgJiYgaW5Db25maWcoZSwgY29uZmlnKSkgewotCQkJCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZSwgZmVhdHVyZSwgbWVyZ2VSZXBsYWNlckJhc2UsIG1lcmdlRXh0ZW5kZXJCYXNlLCByZWFsaXplciwgdmFsdWVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRnVsZmlsbGFibGVFbGVtZW50KSB7Ci0JCQkJbWVyZ2VTbG90T3Bwb3NpdGVGZWF0dXJlVmFsdWVzKChGdWxmaWxsYWJsZUVsZW1lbnQpIGVsZW1lbnQsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QsIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdW5pcXVlCi0JICogZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENhbGN1bGF0ZWRFbGVtZW50cyhMaXN0IGVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGdldENhbGN1bGF0ZWRFbGVtZW50cyhlbGVtZW50cywgRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSApOwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LCBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHVuaXF1ZQotCSAqIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIHJlYWxpemVyIEVsZW1lbnRSZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYWxjdWxhdGVkRWxlbWVudHMoTGlzdCBlbGVtZW50cywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyICkgewotCQkvLyBjYWxjdWxhdGUgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0IGFuZCByZXR1cm4gYSBuZXcgbGlzdCBvZiBlbGVtZW50cwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQlpZiAoKGUgIT0gbnVsbCkgJiYgKCF2YWx1ZXMuY29udGFpbnMoZSkpKSB7Ci0JCQkJdmFsdWVzLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRsZSBjb25maWd1cmF0aW9uLiBJZiBub3RoaW5nIGNhbiBiZQotCSAqIHNob3duLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldENhbGN1bGF0ZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZywgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJcmV0dXJuIGdldENhbGN1bGF0ZWRFbGVtZW50KGVsZW1lbnQsIHJlYWxpemVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldENhbGN1bGF0ZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCi0JCU1ldGhvZEVsZW1lbnQgZSA9IGVsZW1lbnQ7Ci0JCU1ldGhvZEVsZW1lbnQgZTI7Ci0JCXdoaWxlICgoZTIgPSByZWFsaXplci5yZWFsaXplKGUpKSAhPSBlKSB7Ci0JCQllID0gZTI7Ci0JCX0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLjEgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogZmVhdHVyZQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLjEgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogZmVhdHVyZQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCS8vIHByZXNlbnRhdGlvbiBvYmplY3QgZmVhdHVyZSBzaG91bGQgbmV2ZXIgYmUgcmVhbGl6ZWQuIGFsd2F5cyBrZWVwCi0JCS8vIGl0J3Mgb3duIHZhbHVlCi0JCU9iamVjdCB2ID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQlpZiAodiBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSB2OwotCQl9Ci0KLQkJVG9PbmVGZWF0dXJlVmFsdWUgdmFsdWVzID0gbmV3IFRvT25lRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQljYWxjdWxhdGVGZWF0dXJlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpLCB2YWx1ZXMsIHJlYWxpemVyKTsKLS8vCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLS8vCQkJdiA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KDApOwotLy8JCQlpZiAodiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLS8vCQkJCXJldHVybiBnZXRDYWxjdWxhdGVkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgdiwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLS8vCQkJfQotLy8JCX0KLQotCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpdmFsdWVzLmdldFZhbHVlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBpcyB0aGlzIGZlYXR1cmUgZm9yIGNvbnRhaW5kIGNoaWxkcmVuPyBzdWNoIGFzIGFydGlmYWN0J3MgY29udGFpbmVkIGFydGlmYWN0LgotCSAqIEBwYXJhbSBmZWF0dXJlIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5tZW50RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKQotCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgYWxsb3cgY29udGFpbmVkIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5tZW50RWxlbWVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldENvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlFT2JqZWN0IG8gPSBlbGVtZW50OwotCQl3aGlsZSAoKG8gIT0gbnVsbCkgJiYgKChvID0gby5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJJiYgby5nZXRDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJbyA9IGdldENhbGN1bGF0ZWRFbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG8sIGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCWlmICgobyAhPSBudWxsKSAmJiAhaXRlbXMuY29udGFpbnMobykpIHsKLQkJCQlpdGVtcy5hZGQobyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSAwMSBvcHBvc2l0ZSBmZWF0dXJlIChpZiBhbnkpIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZS4gcmV0dXJucyBudWxsCi0JICogaWYgbm8gc3VjaCBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEByZXR1cm4gT3Bwb3NpdGVGZWF0dXJlIHRoZSAwMSBvcHBvc2l0ZSBmZWF0dXJlIG9mIHRoZSBnaXZlbiBmZWF0dXJlLAotCSAqICAgICAgICAgbnVsbCBpZiBubyBzdWNoIHRoaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBPcHBvc2l0ZUZlYXR1cmUgZ2V0MDFPcHBvc2l0ZUZlYXR1cmUoCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkKLQkJLy8gc2luY2UgMS4wbTQsIHRoZXNlIGFyZSBub3QgMDEgZmVhdHVyZSBhbnkgbW9yZQotLy8JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSkgewotLy8JCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuVGFza19EaXNjaXBsaW5lOwotLy8JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpIHsKLS8vCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZTsKLS8vCQl9Ci0JCQotLy8JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkgKSB7Ci0vLwkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Eb21haW5zOwotLy8JCX0gCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIGdldCB0aGUgdGFyZ2V0IGZlYXR1cmUgZm9yIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGlmIHRoZSB0YXJnZXQgZmVhdHVyZSBpcyBhIHRvLU9uZSBmZWF0dXJlLCAKLQkgKiBvdGhlcndpc2UsIHJldHVybiBudWxsLgotCSAqIEBwYXJhbSBvRmVhdHVyZQotCSAqIEByZXR1cm4gRVN0cnVjdHVyYWxGZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0MDFGZWF0dXJlKE9wcG9zaXRlRmVhdHVyZSBvRmVhdHVyZSkgewkJCi0vKgkJaWYgKCBvRmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3MgCi0JCQkJfHwgb0ZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyApIHsKLQkJCXJldHVybiBvRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCX0qLwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50LCBpdCdzCi0JICogb3duZXIgZWxlbWVudCBhbmQgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9Ci0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIAotCXsKLQkJcmV0dXJuIGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUuIGlmIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG9uIHRoZSBvdGhlciBlbmQgaXMgYSB0by1vbmUgZmVhdHVyZSwKLQkgKiB0aGUgZmVhdHVyZSB2YWx1ZSBpdGVtIGNhbid0IGJlIGluIHRoZSB2YWx1ZSBsaXN0IHVubGVzcyBpdCdzIG9wcG9zaXRlCi0JICogZmVhdHVyZSB2YWx1ZSBpcyB0aGUgY3VycmVudCBlbGVtZW50LiBGb3IgZXhhbXBsZSwgZm9yIGRpc2NpcGxpbmVfdGFza3MsCi0JICogdGhlIHRhc2tzIGNhbiBiZSBzZWxlY3RlZCBpZiBhbmQgT05MWSBpZiB0aGUgdGFzaydzIHRhc2tfZGlzY2lwbGluZQotCSAqIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaXMgdGhlIGN1cnJlbnQgZGlzY2lwbGluZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9Ci0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQkJCQotCQlMaXN0IHYgPSBudWxsOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCS8vIFdyb25nICJtb2RpZmllcyIgaW5mb3JtYXRpb24gcHVibGlzaGVkIGluIHRlYW0gYWxsb2NhdGlvbiB2aWV3IGZvciBzbWFsbCBjb25maWd1cmF0aW9uCi0JCS8vIG5lZWQgdG8gbWFudWFsbHkgY2FsY3VsYXRlIHRoZSBtb2RpZnkgZmVhdHVyZXMKLQkJLy8gY2FuJ3QgcmVseSBvbiB0aGUgdW1hIG1vZGVsIHNpbmNlIHRoYXQgaXMgbm90IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMuCi0JCS8vIHJvbGUgbW9kaWZpZXMgcHJvZHVjdCBtZWFuczoKLQkJLy8gcm9sZSBwZXJmb3JtcyBvbiB0YXNrcywgYW5kIHRhc2tzIHByb2R1Y2Ugd29ya3Byb2R1Y3RzIGFzIG91dHB1dAotCQkvLyBzbyBoYW5kbGUgdGhlc2Ugc2NlbmFyaW9zIGFzIHNwZWNpYWwgY2FzZXMKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgUm9sZSAmJiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfTW9kaWZpZXMoKSApIHsKLS8vCQkJTGlzdCB2MiA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUHJpbWFyeV9UYXNrcywgcmVhbGl6ZXIsIHYyKTsKLS8vCQkJaWYgKCB2Mi5zaXplKCkgPiAwICkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCBjb25maWcsIHYsIHJlYWxpemVyKTsJCQkJCQotLy8JCQkJfQotLy8JCQl9CQotCQkJdiA9IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSllbGVtZW50LCBvd25lckVsZW1lbnQsIHJlYWxpemVyKTsKLQkJfWVsc2UgaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgJiYgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpICkgewotLy8JCQlMaXN0IHYyID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycywgcmVhbGl6ZXIsIHYyKTsKLS8vCQkJaWYgKCB2Mi5zaXplKCkgPiAwICkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgY29uZmlnLCB2LCByZWFsaXplcik7CQkJCQkKLS8vCQkJCX0KLS8vCQkJfQotCQkJdiA9IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKWVsZW1lbnQsIG93bmVyRWxlbWVudCwgcmVhbGl6ZXIpOwotCQl9IGVsc2UgewotCQkJVG9NYW55RmVhdHVyZVZhbHVlIGZ2ID0gbmV3IFRvTWFueUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCWNhbGN1bGF0ZUZlYXR1cmUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCBjb25maWcsIGZ2LCByZWFsaXplcik7Ci0JCQl2ID0gKExpc3QpZnYuZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJTGlzdCB2YWx1ZXMgPSBnZXRDYWxjdWxhdGVkRWxlbWVudHModiwgcmVhbGl6ZXIpOwotCQlpZiAodmFsdWVzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQl2YWx1ZXMucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gKiBpZiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBvbiB0aGUgb3RoZXIgZW5kIGlzIGEgdG8tb25lIGZlYXR1cmUsCi0JCS8vICogdGhlIGZlYXR1cmUgdmFsdWUgaXRlbSBjYW4ndCBiZSBpbiB0aGUgdmFsdWUgbGlzdCB1bmxlc3MgaXQncwotCQkvLyBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIGlzIHRoZSBjdXJyZW50IGVsZW1lbnQuCi0JCS8vICogRm9yIGV4YW1wbGUsIGZvciBkaXNjaXBsaW5lX3Rhc2tzLCB0aGUgdGFza3MgY2FuIGJlIHNlbGVjdGVkCi0JCS8vICogaWYgYW5kIE9OTFkgaWYgdGhlIHRhc2sncyB0YXNrX2Rpc2NpcGxpbmUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBpcwotCQkvLyB0aGUgY3VycmVudCBkaXNjaXBsaW5lCi0JCU9wcG9zaXRlRmVhdHVyZSBvZiA9IGdldDAxT3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlpZiAob2YgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoaSk7Ci0KLQkJCQkvLyBjYWxjdWxhdGUgaXQncyBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlLCB0aGUgdmFsdWUgbXVzdCBiZSB0aGUKLQkJCQkvLyBnaXZlbiBlbGVtZW50Ci0JCQkJLy8gb3RoZXJ3aXNlLCByZW1vdmUgaXQKLQkJCQkvLyBub3RlOiBkb24ndCB1c2UgdGhlIGN1cnJlbnQgcmVhbGl6ZXIKLQkJCQkvLyB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIgc2luY2Ugd2UgbmVlZCB0byByZWFsaXplIHRoZSBlbGVtZW50IGluIHRoZSBkZWZhdWx0IHdheQotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0KLQkJCQkKLQkJCQkvLyB3b3JrYXJvdW5kIHRvIGFsbG93IHNob3cvaGlkZSBzdWJ0cmFjdGVkIGVsZW1lbnRzCi0JCQkJRWxlbWVudFJlYWxpemVyIHIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJCXIuc2V0U2hvd1N1YnRyYWN0ZWQocmVhbGl6ZXIuc2hvd1N1YnRyYWN0ZWQoKSk7Ci0JCQkJCi0JCQkJTWV0aG9kRWxlbWVudCBvbyA9IGNhbGMwMUZlYXR1cmVWYWx1ZShvLCBvZiwgcik7Ci0JCQkJaWYgKG9vICE9IGVsZW1lbnQpIHsKLQkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIG93bmVyIGVsZW1lbnQgb3IgaXRzCi0JCS8vIHBhcmVudHMKLQkJLy8gZm9yIGV4YW1wbGUsIGFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0cyBzaG91bGQgbm90IGJlIHRoZSBhcnRpZmFjdAotCQkvLyBpdHNlbGYgb3IgaXRzIHBhcmVudHMKLQkJaWYgKGlzQ29udGFpbm1lbnRGZWF0dXJlKGZlYXR1cmUpKSB7Ci0JCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRDb250YWluZXJzKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQlPYmplY3QgbyA9IChPYmplY3QpIHZhbHVlcy5nZXQoaSk7Ci0JCQkJaWYgKG8gPT0gZWxlbWVudCB8fCBjb250YWluZXJzLmNvbnRhaW5zKG8pKSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTGlzdCByZXR1cm5MaXN0ID0gcmVhbGl6ZXIucmVhbGl6ZShlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQlpZiAoQ2F0ZWdvcnlTb3J0SGVscGVyLm5lZWRUb1NvcnQoZWxlbWVudCwgZmVhdHVyZSkpIHsKLQkJCXJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoZWxlbWVudCwgcmV0dXJuTGlzdC50b0FycmF5KCksIHRydWUpOwotCQl9Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyBwYXJ0IG1pZ2h0IG5vdCBiZSBnZW5lcmFsIHRvIGFsbCBjYXNlcwotCQkvLyBzbyBwdXQgaXQgaW50byB0aGUgcmVhbGl6ZXIKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCQotLy8JCS8vIGlmIHRoZSBmZWF0dXJlIHZhbHVlIGlzIGNvbnRhaW5tZW50IGVsZW1lbnQgc3VjaCBhcyBhcnRpZmFjdAotLy8JCS8vIHRoZSBjaGlsZCBlbGVtZW50IGNhbid0IHNob3cgaWYgYW55IG9mIHRoZSBwYXJlbnQocykgYXJlIGluIHRoZSBsaXN0Ci0vLwkJLy8gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLS8vCQlpZiAoZmVhdHVyZS5pc01hbnkoKSAmJiB2YWx1ZXMuc2l6ZSgpID4gMAotLy8JCQkJJiYgaXNDb250YWlubWVudEVsZW1lbnQodmFsdWVzLmdldCgwKSkpIHsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KGkpOwotLy8KLS8vCQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIHJlbW92ZSB0aGlzCi0vLwkJCQkvLyBlbGVtZW50IGZyb20gdGhlIGxpc3QKLS8vCQkJCWlmIChpc0NvbnRhaW5lckluTGlzdChvLCB2YWx1ZXMsIGNvbmZpZykpIHsKLS8vCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpKys7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIG5lZWQgdG8gc29ydCB0aGUgY29uY2VwdCBhbmQgcGFwZXJzIGJ5IHR5cGUKLS8vCQlpZiAoKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLS8vCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKQotLy8JCQkJJiYgKHZhbHVlcy5zaXplKCkgPiAwKSkgewotLy8JCQlMaXN0IHBhcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU9iamVjdCBvID0gdmFsdWVzLmdldChpKTsKLS8vCQkJCWlmIChvIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotLy8JCQkJCXBhcGVycy5hZGQobyk7Ci0vLwkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJaSsrOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlpZiAocGFwZXJzLnNpemUoKSA+IDApIHsKLS8vCQkJCXZhbHVlcy5hZGRBbGwocGFwZXJzKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0IG9yIG5vdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGl0ZW1zCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZXJJbkxpc3QoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMaXN0IGl0ZW1zLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJRU9iamVjdCBvID0gZWxlbWVudDsKLQkJd2hpbGUgKChvICE9IG51bGwpICYmICgobyA9IG8uZUNvbnRhaW5lcigpKSAhPSBudWxsKQotCQkJCSYmIG8uZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoaXRlbXMuY29udGFpbnMobykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlvID0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbywgY29uZmlnKTsKLQkJCX0KLQotCQkJaWYgKChvICE9IG51bGwpICYmIGl0ZW1zLmNvbnRhaW5zKG8pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gY29uZmlnIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfQotCSAqIEBwYXJhbSBjb25maWcge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChpc01lcmdhYmxlQXR0cmlidXRlKGZlYXR1cmUpKSB7Ci0JCQkvLyBtZXJnZSB0aGUgYXR0cmlidXRlIHZhbHVlcwotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCUF0dHJpYnV0ZUZlYXR1cmVWYWx1ZSB2YWx1ZXMgPSBuZXcgQXR0cmlidXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLAotCQkJCQkJcmVhbGl6ZXIpOwotCi0vLwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQkJRmVhdHVyZVZhbHVlIGF2ID0gKEZlYXR1cmVWYWx1ZSkgaXQubmV4dCgpOwotLy8JCQkJaWYgKGF2LnRleHQgPT0gbnVsbCB8fCBhdi50ZXh0LnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0vLwkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotLy8JCQkJCWlmICh2YWx1ZXMuc2l6ZSgpID4gMSkgewotLy8JCQkJCQkvLyBzb21ldGhpbmcgd3JvbmcgaGVyZSwgd2lsbCBub3QgaGFwcGVuIGJ1dCBwdXQgdGVzdAotLy8JCQkJCQkvLyBtZXNzYWdlIGhlcmUganVzdCBpbiBjYXNlCi0vLwkJCQkJCWlmIChkZWJ1ZykgewotLy8JCQkJCQkJU3lzdGVtLm91dAotLy8JCQkJCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlOiBQcmVzZW50YXRpb24gTmFtZSBnZXQgbW9yZSB0aGVuIG9uZSBlbnRyeTogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybiBhdi50ZXh0OwotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCQkJYnVmZmVyLmFwcGVuZChBVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKTsgCi0vLwkJCQl9Ci0vLwotLy8JCQkJaWYgKGF2LmVsZW1lbnQgPT0gZWxlbWVudCkgewotLy8JCQkJCWJ1ZmZlci5hcHBlbmQoYXYudGV4dCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0vLwkJCQkJCQkuZ2V0RWxlbWVudFBhdGgoKGF2LmVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pID8gKE1ldGhvZEVsZW1lbnQpIGF2LmVsZW1lbnQKLS8vCQkJCQkJCQkJLmVDb250YWluZXIoKQotLy8JCQkJCQkJCQk6IGF2LmVsZW1lbnQpOwotLy8KLS8vCQkJCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotLy8JCQkJCQkJLmdldEJhY2tQYXRoKChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSA/ICgob3duZXJFbGVtZW50ICE9IG51bGwpID8gb3duZXJFbGVtZW50Ci0vLwkJCQkJCQkJCTogKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQuZUNvbnRhaW5lcigpKQotLy8JCQkJCQkJCQk6IGVsZW1lbnQpOwotLy8KLS8vCQkJCQlidWZmZXIuYXBwZW5kKFJlc291cmNlSGVscGVyLmZpeENvbnRlbnRVcmxQYXRoKGF2LnRleHQsCi0vLwkJCQkJCQljb250ZW50UGF0aCwgYmFja1BhdGgpKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJCi0JCQlyZXR1cm4gdmFsdWVzLmdldFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50Ci0JICogYW5kIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gcmVhbGl6ZXIge0BsaW5rIEVsZW1lbnRSZWFsaXplcn0KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsIHRydWUsIGZhbHNlLCByZWFsaXplcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLm4gb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQKLQkgKiBhbmQgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBPcHBvc2l0ZUZlYXR1cmV9Ci0JICogQHBhcmFtIG1lcmdlUmVwbGFjZXJCYXNlIGJvb2xlYW4KLQkgKiBAcGFyYW0gbWVyZ2VFeHRlbmRlckJhc2UgYm9vbGVhbgotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2Yge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBtZXJnZVJlcGxhY2VyQmFzZSwgYm9vbGVhbiBtZXJnZUV4dGVuZGVyQmFzZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCVRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlIHZhbHVlcyA9IG5ldyBUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBmZWF0dXJlLCBtZXJnZVJlcGxhY2VyQmFzZSwgbWVyZ2VFeHRlbmRlckJhc2UsIHJlYWxpemVyLCB2YWx1ZXMpOwotCQlyZXR1cm4gKExpc3QpdmFsdWVzLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi4xIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgT3Bwb3NpdGVGZWF0dXJlfQotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlIHZhbHVlcyA9IG5ldyBUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyLCB2YWx1ZXMpOwotLy8JCWlmICh2YWx1ZXMuc2l6ZSgpID4gMCkgewotLy8JCQlyZXR1cm4gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoMCksIHJlYWxpemVyKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChNZXRob2RFbGVtZW50KXZhbHVlcy5nZXRWYWx1ZSgpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBvcmRlciB0aGUgc2VjdGlvbnMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgQ29udGVudEVsZW1lbnR9Ci0JICogQHBhcmFtIHZhbHVlcyB7QGxpbmsgTGlzdH0gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9yZGVyU2VjdGlvbnMoQ29udGVudEVsZW1lbnQgZWxlbWVudCwgTGlzdCB2YWx1ZXMpIHsKLQkJU3RyaW5nIG9yZGVyaW5nR3VpZGUgPSBlbGVtZW50LmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJaWYgKG9yZGVyaW5nR3VpZGUgPT0gbnVsbCB8fCBvcmRlcmluZ0d1aWRlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU2VjdGlvbkxpc3Qgc2xpc3QgPSBuZXcgU2VjdGlvbkxpc3QoZWxlbWVudCwKLQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyk7Ci0KLQkJaWYgKGlzU2FtZUxpc3QodmFsdWVzLCBzbGlzdCkpIHsKLQkJCXZhbHVlcy5jbGVhcigpOwotCQkJdmFsdWVzLmFkZEFsbChzbGlzdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBvdGhlcndpc2UsIG5lZWQgdG8gcmVvcmRlciB0aGUgbGlzdAotCQlPcmRlcmVkTGlzdENvbXBhcmF0b3IgY29tcCA9IG5ldyBPcmRlcmVkTGlzdENvbXBhcmF0b3IobmV3IEFycmF5TGlzdCgKLQkJCQl2YWx1ZXMpLCBzbGlzdCk7Ci0JCVRyZWVTZXQgcyA9IG5ldyBUcmVlU2V0KGNvbXApOwotCQlzLmFkZEFsbCh2YWx1ZXMpOwotCi0JCXZhbHVlcy5jbGVhcigpOwotCQl2YWx1ZXMuYWRkQWxsKHMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lTGlzdChMaXN0IGwxLCBMaXN0IGwyKSB7Ci0JCWlmIChsMS5zaXplKCkgIT0gbDIuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbDEuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWwyLmNvbnRhaW5zKG8pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSBjb3B5cmlnaHQgb2YgdGhlIGVsZW1lbnQgaW50IGhlIGNvbmZpZ3VyYXRpb24uIFJ1bGU6IDEuCi0JICogY29udHJpYnV0b3JzJyBjb3B5cmlnaHQgc3RhdG1lbnQgc2hvdWxkIGJlIG1lcmdlZCB0byB0aGUgYmFzZSAyLiBleHRlbmRlZAotCSAqIGVsZW1lbnQgaW5oZXJpdGVzIHRoZSBjb3B5cmlnaHRzIGZyb20gdGhlIGJhc2UgMy4gcmVwbGFjZXIgZG9uJ3QgaW5oZXJpdGUKLQkgKiB0aGUgY29weXJpZ2h0cyBmcm9tIHRoZSBiYXNlIDQuIGNvcHlyaWdodCBlbGVtZW50cyBzaG91bGQgYmUgdW5pcXVlLCBubwotCSAqIGR1cGxpY2F0ZSBlbnRyeQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZUNvcHlyaWdodChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdCB2YWx1ZXMpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCUxpYnJhcnlVdGlsLmdldENvcHlyaWdodChlbGVtZW50KSwgY29uZmlnKTsKLQkJaWYgKGNvcHlyaWdodCAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnMoY29weXJpZ2h0KSkgewotCQkJdmFsdWVzLmFkZChjb3B5cmlnaHQpOwotCQl9Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZ2V0VmFyaWFibGVPd25lcihlbGVtZW50KTsKLQkJaWYgKHZlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbWVyZ2UgY29weXJpZ2h0cyBvZiBjb250cmlidXRvcnMKLQkJTGlzdCBpdGVtcyA9IGdldENvbnRyaWJ1dG9ycyh2ZSwgY29uZmlnKTsKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWNhbGN1bGF0ZUNvcHlyaWdodChlLCBjb25maWcsIHZhbHVlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHRlbmRlZCBlbGVtZW50LCBnZXQgdGhlIGJhc2UgZWxlbWVudCdzCi0JCS8vIGNvcHlyaWdodAotCQkvLyB0aGUgYmFzZSBlbGVtZW50J3MgY29weXJpZ2h0IHNob3VsZCBhcHBlYXIgZmlyc3QKLQkJaWYgKGlzRXh0ZW5kZXIodmUpKSB7Ci0JCQkvLyByZWFsaXplIHRoZSBiYXNlIGVsZW1lbnQgZmlyc3QuCi0JCQlNZXRob2RFbGVtZW50IGUgPSBnZXRDYWxjdWxhdGVkRWxlbWVudCh2ZQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBjb25maWcpOwotCQkJaWYgKCh2ZSAhPSBlKSAmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJTGlzdCBiYXNlSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJY2FsY3VsYXRlQ29weXJpZ2h0KGUsIGNvbmZpZywgYmFzZUl0ZW1zKTsKLQotCQkJCS8vIGFkZCB0aGUgYmFzZSBpdGVtcyB0byB0aGUgYmVnaW5pbmcKLQkJCQlpZiAoYmFzZUl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gQXV0aG9yaW5nOiBEdXBsaWNhdGUgY29weXJpZ2h0cyB3aGVuIDIKLQkJCQkJLy8gZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBjb3lyaWdodCBhcmUgZXh0ZW5kaW5nIGVhY2ggb3RoZXIKLQkJCQkJLy8gcmVtb3ZlIHRoZSBkdXBsaWNhdGUgb25lcwotCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCXdoaWxlIChpIDwgdmFsdWVzLnNpemUoKSkgewotCQkJCQkJaWYgKGJhc2VJdGVtcy5jb250YWlucyh2YWx1ZXMuZ2V0KGkpKSkgewotCQkJCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWkrKzsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXZhbHVlcy5hZGRBbGwoMCwgYmFzZUl0ZW1zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY29weXJpZ2h0IHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gY29uZmlnIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0VGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmdCdWZmZXIgY29weXJpZ2h0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjdWxhdGVDb3B5cmlnaHQoZWxlbWVudCwgY29uZmlnLCBpdGVtcyk7Ci0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0OwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQljb3B5cmlnaHQgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBDb250cmlidXRpbmcgc3VwcG9ydCBtYXRlcmlhbCBkb2VzIG5vdCBzaG93Ci0JCQkJLy8gdXAgaW4gY29weSByaWdodAotCQkJCS8vIG5lZWQgdG8gcmVzb2x2ZSB0aGUgZmVhdHVyZSB2YWx1ZS4gY2FuJ3QganVzdCBnZXQgdGhlIHZhbHVlLAotCQkJCS8vIGl0IG1heSBoYXZlIGNvbnRyaWJ1dG9ycwotCQkJCS8vIFN0cmluZyBzdGF0ZW1lbnQgPQotCQkJCS8vIGNvcHlyaWdodC5nZXRQcmVzZW50YXRpb24oKS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQkvLwkJCQkJCQkJCQkJCi0JCQkJU3RyaW5nIHN0YXRlbWVudCA9IChTdHJpbmcpIGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoY29weXJpZ2h0Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIGNvcHlyaWdodCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIGNvbmZpZyk7Ci0JCQkJaWYgKHN0YXRlbWVudCAhPSBudWxsICYmIHN0YXRlbWVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJLy8gbmVlZCB0byBmaXggdGhlIGNvbnRlbnQgZm9yIHJlbGF0aXZlIGxpbmtzLgotCQkJCQkvLyBzaW5jZSB0aGUgbGluayBpcyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlCi0JCQkJCS8vIFN1cHBvcnRpbmdNYXRlcmlhbCBsb2NhdGlvbiwKLQkJCQkJLy8gbmVlZCB0byBjb252ZXJ0IHRvIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQKLQkJCQkJLy8gc28gcmUtY2FsY3VhdGUgdGhlIGJhY2sgcGF0aAotCQkJCQkvLyBqeGksIDA2LzI4LzA1Ci0JCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJLmdldEVsZW1lbnRQYXRoKGNvcHlyaWdodCk7Ci0JCQkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGVsZW1lbnQpOwotCQkJCQlzdGF0ZW1lbnQgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChzdGF0ZW1lbnQsCi0JCQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKTsKLQotCQkJCQlpZiAoY29weXJpZ2h0cy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWNvcHlyaWdodHMuYXBwZW5kKCI8cC8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb3B5cmlnaHRzLmFwcGVuZChzdGF0ZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb3B5cmlnaHRzLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBTdHJpbmcgYXR0cmlidXRlIHZhbHVlcyBvZiBhbiBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBlIEFjdGl2aXR5IG9yIGl0J3MgQ29udGVudERlc2NyaXB0aW9uCi0JICogQHBhcmFtIGF0dHJpYgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGl2aXR5U3RyaW5nQXR0cmlidXRlKE1ldGhvZEVsZW1lbnQgZSwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRUF0dHJpYnV0ZSBhdHRyaWIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmKCFTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWIuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyBub3Qgb2YgdHlwZSBTdHJpbmc6ICIgKyBhdHRyaWIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCU9iamVjdCBzdHIgPSBudWxsOwotCQlib29sZWFuIGlzRGVzYzsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlOwotCQlpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKQotCQl7Ci0JCQl2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZUNvbnRhaW5lcigpOwotCQkJaWYgKCB2ZSA9PSBudWxsICkgewotCQkJCXZlID0gKFZhcmlhYmlsaXR5RWxlbWVudClvd25lckVsZW1lbnQ7Ci0JCQl9Ci0JCQlpc0Rlc2MgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKCBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KQotCQl7Ci0JCQl2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpZTsKLQkJCWlzRGVzYyA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJc3RyID0gZS5lR2V0KGF0dHJpYik7Ci0JCQlyZXR1cm4gKHN0cj09bnVsbCkgPyAiIiA6IHN0ci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCQotCQlpZihhdHRyaWIgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgfHwgYXR0cmliID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKWUuZUdldChhdHRyaWIpOwotCQl9CQkKLQkJCQkJCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWlmKCBiYXNlICE9IG51bGwgJiYgdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCS8vIGZvciBsb2NhbCBjb250cmlidXRpb24sIGFwcGVuZCB0aGUgdGV4dCB0byB0aGUgYmFzZQotCQkJT2JqZWN0IHN0ckJhc2U7Ci0JCQlpZiAoIGlzRGVzYyApIHsKLQkJCQlzdHIgPSAoKERlc2NyaWJhYmxlRWxlbWVudCl2ZSkuZ2V0UHJlc2VudGF0aW9uKCkuZUdldChhdHRyaWIpOwotCQkJCXN0ckJhc2UgPSBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKCAoKERlc2NyaWJhYmxlRWxlbWVudCliYXNlKS5nZXRQcmVzZW50YXRpb24oKSwgYmFzZSwgYXR0cmliLCBjb25maWcpOwotCQkJfSBlbHNlIHsKLQkJCQlzdHIgPSB2ZS5lR2V0KGF0dHJpYik7Ci0JCQkJc3RyQmFzZSA9IGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoYmFzZSwgbnVsbCwgYXR0cmliLCBjb25maWcpOwkJCQkKLQkJCX0KLQkJCQotCQkJaWYgKCBzdHJCYXNlICE9IG51bGwgJiYgc3RyQmFzZS50b1N0cmluZygpLmxlbmd0aCgpID4gMCApIHsKLQkJCQlpZiAoIHN0ciAhPSBudWxsICYmIHN0ci50b1N0cmluZygpLmxlbmd0aCgpID4gMCApIHsKLQkJCQkJc3RyID0gc3RyQmFzZSArIEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IgKyBzdHI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyID0gc3RyQmFzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdHIgPSBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGUsIHZlLCBhdHRyaWIsIGNvbmZpZyk7Ci0JCX0KLQotCQlyZXR1cm4gKHN0cj09bnVsbCkgPyAiIiA6IHN0ci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQotLy8JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlOwotLy8JCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGU7CQotLy8JCWJvb2xlYW4gY29uY2F0ID0gYXR0cmliICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotLy8JCXdoaWxlKHRydWUpIHsKLS8vCQkJYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLS8vCQkJaWYoYmFzZSA9PSBudWxsKSB7Ci0vLwkJCQlPYmplY3Qgc3RyOwotLy8JCQkJaWYgKCBpc0Rlc2MgKSB7Ci0vLwkJCQkJc3RyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdmUpLmdldFByZXNlbnRhdGlvbigpLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXN0ciA9ICB2ZS5lR2V0KGF0dHJpYik7IAotLy8JCQkJfQotLy8JCQkJaWYoc3RyID09IG51bGwgfHwgc3RyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCWlmKHZhbHVlcy5pc0VtcHR5KCkpIHsKLS8vCQkJCQkJdmFsdWVzLmFkZChzdHIpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWVsc2UgewotLy8JCQkJCXZhbHVlcy5hZGQoMCwgc3RyKTsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCWVsc2UgaWYoYmFzZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlPYmplY3Qgc3RyOwotLy8JCQkJaWYgKCBpc0Rlc2MgKSB7Ci0vLwkJCQkJc3RyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdmUpLmdldFByZXNlbnRhdGlvbigpLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXN0ciA9IHZlLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9Ci0vLwotLy8JCQkJdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCQlpZih2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotLy8JCQkJCWlmKHN0ciA9PSBudWxsIHx8IHN0ci50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHsKLS8vCQkJCQkJLy8gdXNlIHRoZSB2YWx1ZSBvZiB0aGUgYmFzZQotLy8JCQkJCQkvLwotLy8JCQkJCQl2ZSA9IGJhc2U7Ci0vLwkJCQkJfQotLy8JCQkJCWVsc2UgewotLy8JCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWVsc2UgaWYodmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewkJCQkJCi0vLwkJCQkJaWYoc3RyICE9IG51bGwgJiYgc3RyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCQkJCS8vIGFkZCB0byB0aGUgbGlzdAotLy8JCQkJCQkvLwotLy8JCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJCWlmKCFjb25jYXQpIHsKLS8vCQkJCQkJCWJyZWFrOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCS8vIGdvIHRvIHRoZSBiYXNlCi0vLwkJCQkJdmUgPSBiYXNlOwotLy8JCQkJfQotLy8JCQkJZWxzZSBpZih2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwpIHsKLS8vCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCQkvL1RPRE86IGhhbmRsZSBDT05UUklCVVRFUyBBTkQgUkVQTEFDRVMKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlpZiAoIHZhbHVlcy5zaXplKCkgPT0gMCApIHsKLS8vCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JCWVsc2UgaWYgKCB2YWx1ZXMuc2l6ZSgpID09MSApIHsKLS8vCQkJcmV0dXJuIChTdHJpbmcpdmFsdWVzLmdldCgwKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJCWlmICggYnVmZmVyLmxlbmd0aCgpID4gMCApIHsKLS8vCQkJCQlidWZmZXIuYXBwZW5kKEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpOwotLy8JCQkJfQotLy8JCQkJYnVmZmVyLmFwcGVuZChpdC5uZXh0KCkpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsJCQkKLS8vCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUxpc3QgaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcygoTWV0aG9kUGx1Z2luKWl0Lm5leHQoKSk7Ci0JCQlmb3IgKCBJdGVyYXRvciBpdHAgPSBpdGVtcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpaXRwLm5leHQoKTsKLQkJCQlpZiAoIGNhblNob3cocCwgY29uZmlnKSAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApICkgewotCQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBwcm9jZXNzZXMgaW4gdGhlIHBsdWdpbiBhbmQgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKCBJdGVyYXRvciBpdHAgPSBpdGVtcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcylpdHAubmV4dCgpOwotCQkJaWYgKCBjYW5TaG93KHAsIGNvbmZpZykgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSApIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgZGVsaXZlcnkgcHJvY2Vzc2VzIGluIHRoZSBwbHVnaW4gYW5kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxEZWxpdmVyeVByb2Nlc3NlcyhNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0cCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0cC5uZXh0KCk7Ci0JCQlpZiAoIHAgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MgKSB7Ci0JCQkJaWYgKCBjYW5TaG93KHAsIGNvbmZpZykgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSApIHsKLQkJCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBDYXBhYmlsaXR5UGF0dGVybnMgaW4gdGhlIHBsdWdpbiBhbmQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbENhcGFiaWxpdHlQYXR0ZXJucyhNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0cCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0cC5uZXh0KCk7Ci0JCQlpZiAoIHAgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiApIHsKLQkJCQlpZiAoIGNhblNob3cocCwgY29uZmlnKSAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApICkgewotCQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHdvcmsgcHJvZHVjdHMgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZCByb2xlLCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IFJvbGUKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIHRvIGFjY2VwdCB0aGUgY2FsY3VsYXRlZCB2YWx1ZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIHJvbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3RzKFJvbGUgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUHJpbWFyeV9UYXNrczsKLQkJVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZnYyID0gbmV3IFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIsIGZ2Mik7Ci0JCWlmICggZnYyLnNpemUoKSA+IDAgKSB7Ci0JCQlMaXN0IHYyID0gKExpc3QpZnYyLmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdjIuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJVG9NYW55RmVhdHVyZVZhbHVlIGZ2ID0gbmV3IFRvTWFueUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCQkoKExpc3QpZnYuZ2V0VmFsdWUoKSkuYWRkQWxsKHYpOwotCQkJCQotCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCAKLQkJCQkJCWZlYXR1cmUsIAotCQkJCQkJcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpLCBmdiwgcmVhbGl6ZXIpOwkKLQkJCQl2ID0gKExpc3QpZnYuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiB2OwotCX0KLQkJCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZCByb2xlIGRlc2NyaXB0b3IsIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgUm9sZURlc2NyaXB0b3IKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIHRvIGFjY2VwdCB0aGUgY2FsY3VsYXRlZCB2YWx1ZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCBsaXN0IG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBiZWluZyBtb2RpZmllZCBieSB0aGUgcm9sZSBkZXNjcmlwdG9yCi0JICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBSb2xlRGVzY3JpcHRvckxheW91dCB0byBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3REZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9yczsKLQkJVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZnYyID0gbmV3IFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIsIGZ2Mik7Ci0JCWlmICggZnYyLnNpemUoKSA+IDAgKSB7Ci0JCQlMaXN0IHYyID0gKExpc3QpZnYyLmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCQotCQkJCVRvTWFueUZlYXR1cmVWYWx1ZSBmdiA9IG5ldyBUb01hbnlGZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCQkJKChMaXN0KWZ2LmdldFZhbHVlKCkpLmFkZEFsbCh2KTsKLQkJCQkKLQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG93bmVyRWxlbWVudCwgCi0JCQkJCQlmZWF0dXJlLCAKLQkJCQkJCXJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSwgZnYsIHJlYWxpemVyKTsJCi0JCQkJdiA9IChMaXN0KWZ2LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHJvbGVzIHRoYXQgbW9kaWZpZXMgdGhlIHNwZWNpZmllZCB3b3JrIHByb2R1Y3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBXb3JrUHJvZHVjdAotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCB0aGUgcm9sZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmeVJvbGVzKFdvcmtQcm9kdWN0IGVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywgCi0JCQkJcmVhbGl6ZXIpOwotCQlMaXN0IG1vZGlmeVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2sgdCA9IChUYXNrKWl0Lm5leHQoKTsKLQkJCUxpc3Q8Um9sZT4gckxpc3QgPSAoTGlzdDxSb2xlPilDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJdCwgCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgCi0JCQkJCXJlYWxpemVyKTsKLQkJCWZvciAoUm9sZSByOiByTGlzdCkgewotCQkJCWlmICggKHIgIT0gbnVsbCkgJiYgIW1vZGlmeVJvbGVzLmNvbnRhaW5zKHIpICkgewotCQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbW9kaWZ5Um9sZXM7Ci0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgcm9sZSBkZXNjcmlwdG9ycyB0aGF0IG1vZGlmaWVzIHRoZSBzcGVjaWZpZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKiBAcmV0dXJuIExpc3QgdGhlIHJvbGUgZGVzY3JpcHRvcnMKLQkgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcmxheW91dCB0byBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzLCAKLQkJCQlyZWFsaXplcik7Ci0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHQgPSAoVGFza0Rlc2NyaXB0b3IpaXQubmV4dCgpOwotCQkJUm9sZURlc2NyaXB0b3IgciA9IChSb2xlRGVzY3JpcHRvcilDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSgKLQkJCQkJdCwgCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIAotCQkJCQlyZWFsaXplcik7Ci0JCQlpZiAoIChyICE9IG51bGwpICYmICFtb2RpZnlSb2xlcy5jb250YWlucyhyKSApIHsKLQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtb2RpZnlSb2xlczsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGFjdGl2aXR5IGlzIGEgY29udHJpYnV0b3IgCi0JICogb3IgY29udGFpbnMgYW55IHN1Yi1hY3Rpdml0aWVzIHRoYXQgYXJlIGNvbnRyaWJ1dG9ycwotCSAqIEBwYXJhbSBlbGVtZW50IEFjdGl2aXR5Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yKEFjdGl2aXR5IGVsZW1lbnQpIHsKLQkJaWYgKCBpc0NvbnRyaWJ1dG9yKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICggIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAoIGhhc0NvbnRyaWJ1dG9yKCAoQWN0aXZpdHkpbyApICkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgYmFzZSBwcm9jZXNzZXMgZm9yIGFuIHtAbGluayBBY3Rpdml0eX0gaW4gdGhlIENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QmFzZVByb2Nlc3NlcyhBY3Rpdml0eSBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHZhbHVlID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRCYXNlUHJvY2Vzc2VzKGVsZW1lbnQsIGNvbmZpZywgdmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgYmFzZSBwcm9jZXNzZXMgZm9yIGFuIGFjdGl2aXR5IGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlIExpc3QgdGhlIGJhc2VzIHByb2Nlc3NlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRCYXNlUHJvY2Vzc2VzKEFjdGl2aXR5IGVsZW1lbnQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBMaXN0IHZhbHVlKSB7Ci0JCQotCQkvLyBnZXQgaXQncyBvd24gYmFzZQotCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRlcihlbGVtZW50KSApIHsKLQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoIGJhc2UgIT0gbnVsbCAKLQkJCQkJJiYgIXZhbHVlLmNvbnRhaW5zKGJhc2UpIAotCQkJCQkmJiAoYmFzZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgKSB7Ci0JCQkJaWYgKCBjYW5TaG93KGJhc2UsIGNvbmZpZykgKSB7Ci0JCQkJCXZhbHVlLmFkZChiYXNlKTsKLQkJCQl9Ci0JCQkJZ2V0QmFzZVByb2Nlc3NlcyhiYXNlLCBjb25maWcsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgdGhlIHN1Yi1hY3Rpdml0aWVzIGhhdmUgYmFzZSwgcHJvY2VzcyBpdAotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGVsZW1lbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIG8gaW5zdGFuY2VvZiBBY3Rpdml0eSApIHsKLQkJCQlnZXRCYXNlUHJvY2Vzc2VzKChBY3Rpdml0eSlvLCBjb25maWcsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRJbmhlcml0aW5nVXJpKERlc2NyaWJhYmxlRWxlbWVudCBvYmosIFVSSSB1cmksCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnRbXSB1cmlJbmhlcml0aW5nQmFzZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgdXJpVHlwZSkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSAhPSBudWxsCi0JCQkJJiYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTIHx8IHZlCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpKSB7Ci0JCQliYXNlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChiYXNlLCBjb25maWcpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCWlmICh1cmlUeXBlID09IDApIHsKLQkJCQkJdXJpID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGJhc2UpLmdldE5vZGVpY29uKCk7Ci0JCQkJfSBlbHNlIGlmICh1cmlUeXBlID09IDEpIHsKLQkJCQkJdXJpID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGJhc2UpLmdldFNoYXBlaWNvbigpOwotCQkJCX0KLQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJdXJpSW5oZXJpdGluZ0Jhc2VzWzBdID0gYmFzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblByb3BlcnRpZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZGYzZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDg3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLklDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqICBDbGFzcyBtYW5hZ2luZyBjYWNoZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIE1hciAxOSwgMjAwOAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblByb3BlcnRpZXMgZXh0ZW5kcyBNZXRob2RFbGVtZW50UHJvcGVydGllcyB7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGNvbmZpZywgZ2V0UHJvcFN0cmluZ3MoKSk7CQkKLQl9Ci0JCQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9wU3RyaW5ncygpIHsKLQkJU3RyaW5nW10gaGlkZVByb3BzID0geyBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ09ORklHX1BST1BCTEVNX0hJREVfRVJST1JTLAotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DT05GSUdfUFJPUEJMRU1fSElERV9XQVJOSU5HUywKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ09ORklHX1BST1BCTEVNX0hJREVfSU5GT1N9OwotCQlyZXR1cm4gaGlkZVByb3BzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB0b0hpZGUoSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotCQlpZiAoZXJyb3IuaXNFcnJvcigpKSB7Ci0JCQlyZXR1cm4gaXNIaWRlRXJyb3JzKCk7Ci0JCX0gZWxzZSBpZiAoZXJyb3IuaXNXYXJuaW5nKCkpIHsKLQkJCXJldHVybiBpc0hpZGVXYXJuaW5ncygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGlzSGlkZUluZm9zKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0hpZGVXYXJuaW5ncygpIHsKLQkJcmV0dXJuIGdldEJvb2xlYW5WYWx1ZShNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ09ORklHX1BST1BCTEVNX0hJREVfV0FSTklOR1MpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0hpZGVFcnJvcnMoKSB7Ci0JCXJldHVybiBnZXRCb29sZWFuVmFsdWUoTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0VSUk9SUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlSW5mb3MoKSB7Ci0JCXJldHVybiBnZXRCb29sZWFuVmFsdWUoTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0lORk9TKTsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRGVmYXVsdEVsZW1lbnRSZWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRGVmYXVsdEVsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU5MmI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0RlZmF1bHRFbGVtZW50UmVhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVhbGl6ZXIuCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVsZW1lbnRSZWFsaXplciBleHRlbmRzIEVsZW1lbnRSZWFsaXplciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcl9UeXBlID0gIkRlZmF1bHRFbGVtZW50UmVhbGl6ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcl9UeXBlID0gIlB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXJfVHlwZSA9ICJQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgY3JlYXRlRWxlbWVudFJlYWxpemVyRXh0ZW5zaW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdHlwZSkgewotCQlPYmplY3QgZXh0ID0gRXh0ZW5zaW9uTWFuYWdlci5jcmVhdGVFeHRlbnNpb24oTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgImVsZW1lbnRSZWFsaXplckZhY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZXh0IGluc3RhbmNlb2YgSUVsZW1lbnRSZWFsaXplckZhY3RvcnkgPwotCQkJKChJRWxlbWVudFJlYWxpemVyRmFjdG9yeSkgZXh0KS5jcmVhdGVSZWFsaXplcihjb25maWcsIHR5cGUpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgbmV3RWxlbWVudFJlYWxpemVyKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yLAotCQkJYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIpIHsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gY3JlYXRlRWxlbWVudFJlYWxpemVyRXh0ZW5zaW9uKGNvbmZpZywgRGVmYXVsdEVsZW1lbnRSZWFsaXplcl9UeXBlKTsKLQkJaWYgKHJlYWxpemVyID09IG51bGwpIHsKLQkJCXJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJfQotCQlyZWFsaXplci5zZXRSZXNvbHZlQ29udHJpYnV0b3IocmVzb2x2ZUNvbnRyaWJ1dG9yKTsKLQkJcmVhbGl6ZXIuc2V0UmVzb2x2ZVJlcGxhY2VyKHJlc29sdmVSZXBsYWNlcik7Ci0JCXJldHVybiByZWFsaXplcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgbmV3RWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBuZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogY29uc3RydWN0IGFuIGluc3RhbmNlIHdpdGggdGhlIGdpdmUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBEZWZhdWx0RWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0IGFuIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gYW5kIGFkZGl0aW9uYWwgcmVhbGl6YXRpb24gb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcmVzb2x2ZUNvbnRyaWJ1dG9yIGJvb2xlYW4gaWYgdHJ1ZSwgY29udHJ1YnV0b3JzIGZyb20gZmVhdHVyZSB2YWx1ZSBsaXN0IHdpbGwgYmUgcmVzb2x2ZWQuIGRlZmF1bHQgdG8gZmFsc2UuCi0JICogQHBhcmFtIHJlc29sdmVSZXBsYWNlciBib29sZWFuIGlmIHR1cmUsIGVsZW1lbnQgd2l0aCBhIHJlcGxhY2VyIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGhlIHJlcGxhY2VyLiBkZWZhdWx0IHRvIHRydWUuCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlib29sZWFuIHJlc29sdmVDb250cmlidXRvciwgYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIpIHsKLQkJc3VwZXIoY29uZmlnLCByZXNvbHZlQ29udHJpYnV0b3IsIHJlc29sdmVSZXBsYWNlcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgRWxlbWVudFJlYWxpemVyLnJlYWxpemUKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gc3VwZXIucmVhbGl6ZShlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCAKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IHZhbHVlcykKLQl7Ci0JCWlmICggdmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIHZhbHVlczsKLQkJfQotCQkKLQkJLy8gV3JvbmcgIm1vZGlmaWVzIiBpbmZvcm1hdGlvbiBwdWJsaXNoZWQgaW4gdGVhbSBhbGxvY2F0aW9uIHZpZXcgZm9yIHNtYWxsIGNvbmZpZ3VyYXRpb24KLQkJLy8gYWRkZWQgZmlsdGVyIHRvIGNsZWFuIHVwIHVuLXdhbnRlZCBpdGVtcwotCQlpZiAoIHN1cGVyLmZpbHRlciAhPSBudWxsICkgewotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoaSk7Ci0KLQkJCQlpZiAoICFmaWx0ZXIuYWNjZXB0KG8pICkgewotCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJLy8gaWYgdGhlIGZlYXR1cmUgdmFsdWUgaXMgY29udGFpbm1lbnQgZWxlbWVudCBzdWNoIGFzIGFydGlmYWN0Ci0JCS8vIHRoZSBjaGlsZCBlbGVtZW50IGNhbid0IHNob3cgaWYgYW55IG9mIHRoZSBwYXJlbnQocykgYXJlIGluIHRoZSBsaXN0Ci0JCS8vIDAwMzg0NjE5IC0gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLQkJCi0JCS8vIHRoaXMgaXMgbm90IGEgZ2VuZXJhbCBydWxlLiBvbmx5IGFwcGx5IHRvIHRoZSBwdWJsaXNoZWQgbmF2aWdhdGlvbiB0cmVlLgotCQkvLyBzbyBtb3ZlIHRoaXMgbG9naWMgdG8gdGhlIHRyZWUgZ2VuZXJhdGlvbiBjb2RlIGluIHB1Ymxpc2hpbmcKLQkJLy8gZ2VlbnJhbGx5LCBzaG93IGFsbCBlbGVtZW50cywgc2VlIGJ1ZwotCQkvLyAwMDM4Njc2NSAtIFJvbGUgcmVzcG9uc2liaWxpdGllcyBuZWVkIHRvIHNob3cgKGNvbnRyaWJ1dGVkKSBzdWItYXJ0aWZhY3RzCQotLy8JCWlmIChmZWF0dXJlLmlzTWFueSgpICYmIHZhbHVlcy5zaXplKCkgPiAwCi0vLwkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udGFpbm1lbnRFbGVtZW50KHZhbHVlcy5nZXQoMCkpKSB7Ci0vLwkJCWludCBpID0gMDsKLS8vCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0vLwkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldChpKTsKLS8vCi0vLwkJCQkvLyBpZiB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0LCByZW1vdmUgdGhpcwotLy8JCQkJLy8gZWxlbWVudCBmcm9tIHRoZSBsaXN0Ci0vLwkJCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRhaW5lckluTGlzdChvLCB2YWx1ZXMsIGNvbmZpZykpIHsKLS8vCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpKys7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJLy8gbmVlZCB0byBzb3J0IHRoZSBjb25jZXB0IGFuZCBwYXBlcnMgYnkgdHlwZQotCQlpZiAoKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkKLQkJCQkmJiAodmFsdWVzLnNpemUoKSA+IDApKSB7Ci0JCQlMaXN0IHBhcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdmFsdWVzLnNpemUoKSkgewotCQkJCU9iamVjdCBvID0gdmFsdWVzLmdldChpKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpIHsKLQkJCQkJcGFwZXJzLmFkZChvKTsKLQkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocGFwZXJzLnNpemUoKSA+IDApIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKHBhcGVycyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2YWx1ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRWxlbWVudFJlYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9FbGVtZW50UmVhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjMmY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9FbGVtZW50UmVhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50UmVhbGl6ZXIgewotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLy8gbm90ZTogZGlzY2FyZCBjb250cmlidXRvciB0YWtlcyBoaWdoZXIgcHJpb3JpdHksIGlmIHNldCB0byB0cnVlLAotCS8vIHJlc29sdmVDb250cmlidXRvciB3aWxsIGJlIGlnbm9yZWQKLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9yID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dTdWJ0cmFjdGVkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkKLQkvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcgYmFzZWQgb24gdGhlIHByZWZlcmVuY2Ugc2V0dGluZwotCS8vIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdGhlaXIgb3duIG1ldGhvZCB0aGUgZ2V0IHRoZSB2YWx1ZQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdEVuYWJsZUV4dGVuZFJlcGxhY2UgPSBmYWxzZTsKLQkKLQkKLQkvL3ByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMgPSBmYWxzZTsKLQotCXN0YXRpYyB7Ci0JCVN0cmluZyBzdHIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoIkVuYWJsZUV4dGVuZFJlcGxhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIHN0ciAhPSBudWxsICYmIHN0ci50cmltKCkuZXF1YWxzKCJ0cnVlIikgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHRFbmFibGVFeHRlbmRSZXBsYWNlID0gdHJ1ZTsKLQkJfQotCQkKLQkJLy8gMTcxODgyIC0gRXh0ZW5kcy1SZXBsYWNlIFZhcmlhYmlsaXR5Ci0JCS8vZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpOwkJCi0JfQotCQotCS8qKgotCSAqIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMoY29uZmlnLCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBhbmQgYWRkaXRpb25hbCByZWFsaXphdGlvbiBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSByZXNvbHZlQ29udHJpYnV0b3IgYm9vbGVhbiBpZiB0cnVlLCBjb250cnVidXRvcnMgZnJvbSBmZWF0dXJlIHZhbHVlIGxpc3Qgd2lsbCBiZSByZXNvbHZlZC4gZGVmYXVsdCB0byBmYWxzZS4KLQkgKiBAcGFyYW0gcmVzb2x2ZVJlcGxhY2VyIGJvb2xlYW4gaWYgdHVyZSwgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuIGRlZmF1bHQgdG8gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJYm9vbGVhbiByZXNvbHZlQ29udHJpYnV0b3IsIGJvb2xlYW4gcmVzb2x2ZVJlcGxhY2VyKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnJlc29sdmVDb250cmlidXRvciA9IHJlc29sdmVDb250cmlidXRvcjsKLQkJdGhpcy5yZXNvbHZlUmVwbGFjZXIgPSByZXNvbHZlUmVwbGFjZXI7Ci0JCQotCX0KLQotCS8qKgotCSAqIGlzIGV4dGVuZC1yZXBsYWNlIGVuYWJsZWQgZm9yIHJlcGxhY2VtZW50Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSB7Ci0JCXJldHVybiBkZWZhdWx0RW5hYmxlRXh0ZW5kUmVwbGFjZTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIGV4dGVuZCBzZW1hbnRpY3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiBCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLmlzVXNlTmV3RXh0ZW5kU2VtYW50aWNzKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSwgdGhlIGNvbnRyaWJ1dG9ycyBmcm9tIGEgcmVhbGl6ZWQgZmVhdHVyZSBsaXN0IHdpbGwgYmUgZGlzY2FyZGVkCi0JICogCi0JICogQHBhcmFtIGRpc2NhcmRDb250cmlidXRvciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY2FyZENvbnRyaWJ1dG9yKGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9yKSB7Ci0JCXRoaXMuZGlzY2FyZENvbnRyaWJ1dG9yID0gZGlzY2FyZENvbnRyaWJ1dG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSB0aGUgY29udHJpYnV0b3JzIHdpbGwgYmUgcmVzb2x2ZWQuCi0JICogQHBhcmFtIHJlc29sdmVDb250cmlidXRvciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZUNvbnRyaWJ1dG9yKGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yKSB7Ci0JCXRoaXMucmVzb2x2ZUNvbnRyaWJ1dG9yID0gcmVzb2x2ZUNvbnRyaWJ1dG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSB0aGUgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVSZXBsYWNlciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZVJlcGxhY2VyKGJvb2xlYW4gcmVzb2x2ZVJlcGxhY2VyKSB7Ci0JCXRoaXMucmVzb2x2ZVJlcGxhY2VyID0gcmVzb2x2ZVJlcGxhY2VyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3dTdWJ0cmFjdGVkKCkgewotCQlyZXR1cm4gc2hvd1N1YnRyYWN0ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dTdWJ0cmFjdGVkKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dTdWJ0cmFjdGVkID0gZmxhZzsKLQl9Ci0JCi0KLQkvKioKLQkgKiBzZXQgYSBmaWx0ZXIgZm9yIHRoaXMgcmVhbGl6ZXIKLQkgKiBAcGFyYW0gZmlsdGVyIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0eWhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhaW5Db25maWcoZWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gV29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHRoYXQgcG9pbnQgdG8gd29yayBwcm9kdWN0cwotCQkvLyBvdXRzaWRlIHRoZSBjb25maWd1cmF0aW9uIGFyZSBzdGlsbCBwdWJsaXNoZWQKLQkJLy8gbGlua2VkIGVsZW1lbnQgbXVzdCBiZSBpbiBjb25maWcgYXMgd2VsbAotCQlNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCX0KLQotCQlpZiAoKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCkKLQkJCQkmJiAhaW5Db25maWcobGlua2VkRWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaWYgbm8gY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQsIGRvbid0IGNhbGN1bGF0ZQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZTsKLQotCQkJLy8gaWYgZGlzY2FyZENvbnRyaWJ1dG9yIHNldCB0byB0cnVlLCBkaXNjYXJkIHRoZSBjb250cmlidXRvciBhbmQKLQkJCS8vIHJldHVybiBudWxsCi0JCQlpZiAoZGlzY2FyZENvbnRyaWJ1dG9yICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHJlc29sdmVDb250cmlidXRvcikgewotCQkJCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0b3IsIHJlc292bGUgdG8gaXQncyBiYXNlCi0JCQkJd2hpbGUgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkpIHsKLQkJCQkJZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJaWYgKGluQ29uZmlnKGUpKSB7Ci0JCQkJCQl2ZSA9IGU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBpZiB0aGUgYmFzZSBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGl0J3MgYW4KLQkJCQkJCS8vIGVycm9yCi0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uIGNsb3N1cmUgZXJyb3I6IEJhc2UgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHZlKSArICInIG5vdCBpbiBjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXNvbHZlUmVwbGFjZXIpIHsKLQkJCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwgY29uZmlnKTsKLQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIWluQ29uZmlnKHZlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhIHJlcGxhY2VyLCBhbmQgdGhlIGJhc2UgaXMgYSBjb250cmlidXRvciwgCi0JCQkvLyBuZWVkIHRvIHJlc29sdmUgdGhlIGVsZW1lbnQgdG8gdGhlIGJhc2UgaWYgcmVzb2x2ZUNvbnRyaWJ1dG9yIGlzIHRydWUKLQkJCS8vIDE1MjIzMCAtIEJyb3dzaW5nOiBSb2xlPC0tPldQIHJlbGF0aW9uc2hpcCBzaG93cyBpbmNvbnNpc3RhbmN5Ci0JCQllID0gdmU7Ci0JCQl3aGlsZSAoKGUgIT0gbnVsbCkgJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc1JlcGxhY2VyKGUpKSB7Ci0JCQkJZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQkJcmV0dXJuIHJlYWxpemUoZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBjYW4ndCByZXR1cm4gaGVyZSwgbmVlZCB0byBjaGVjayBjYW5TaG93Ci0JCQkvLyByZXR1cm4gdmU7Ci0JCQlpZiAoY2FuU2hvdyh2ZSkpIHsKLQkJCQlyZXR1cm4gdmU7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGNhblNob3coZWxlbWVudCkpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhlbGVtZW50LCBjb25maWcsICFzaG93U3VidHJhY3RlZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TaG93KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KGVsZW1lbnQsIGNvbmZpZywgIXNob3dTdWJ0cmFjdGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmZpbHRlciA9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEV4dHJhRmVhdHVyZVZhbHVlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJRmVhdHVyZVZhbHVlIHZhbHVlcykgewotCQlpZiAoIUVsZW1lbnRSZWFsaXplci50b0FkZEV4dHJhRmVhdHVyZVZhbHVlcyhlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMsCi0JCQkJZ2V0Q29uZmlndXJhdGlvbigpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgZWxlbWVudDsKLQotCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IExpYnJhcnlVdGlsLmdldEluY2x1ZGVkRWxlbWVudHMoY2MsIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRvTWFueUZlYXR1cmVWYWx1ZSBtYW55VmFsdWVzID0gdmFsdWVzIGluc3RhbmNlb2YgVG9NYW55RmVhdHVyZVZhbHVlID8KLQkJCQkoVG9NYW55RmVhdHVyZVZhbHVlKSB2YWx1ZXMgOiBudWxsOwotCQkJCQotCQlMaXN0IG9sZFZhbHVlcyA9IG1hbnlWYWx1ZXMgPT0gbnVsbCA/IG51bGwgOiAoTGlzdCkgbWFueVZhbHVlcy5nZXRWYWx1ZSgpOwotCi0JCUhhc2hTZXQ8RGVzY3JpYmFibGVFbGVtZW50PiBzZWVuU2V0ID0gbWFueVZhbHVlcyA9PSBudWxsID8KLQkJCQluZXcgSGFzaFNldDxEZXNjcmliYWJsZUVsZW1lbnQ+KCkgOiBuZXcgSGFzaFNldDxEZXNjcmliYWJsZUVsZW1lbnQ+KG9sZFZhbHVlcyk7CQotCQlzZWVuU2V0LmFkZChjYyk7Ci0JCUxpc3QgY2NMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYyk7Ci0JCXNlZW5TZXQuYWRkQWxsKGNjTGlzdCk7CQkJCQkKLQkJCQkKLQkJTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGxpc3QgPSBjYWxjdWxhdGVMaXN0KHJlc3VsdCwgc2VlblNldCk7Ci0JCXZhbHVlcy5hZGQoY2MsIGxpc3QpOwotCQkKLQl9Ci0KLQlwdWJsaWMgTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGNhbGN1bGF0ZUxpc3QoQ29sbGVjdGlvbjw/PiByZXN1bHQsCi0JCQlTZXQ8RGVzY3JpYmFibGVFbGVtZW50PiBzZWVuU2V0KSB7Ci0JCUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCURlc2NyaWJhYmxlRWxlbWVudCBjb250RWxlbSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIG87Ci0JCQkJY29udEVsZW0gPSAoRGVzY3JpYmFibGVFbGVtZW50KSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoY29udEVsZW0sIHRoaXMpOwotCQkJCWlmIChjb250RWxlbSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzZWVuU2V0LmFkZChjb250RWxlbSkpIHsKLQkJCQkJCWxpc3QuYWRkKGNvbnRFbGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGxpc3Quc2l6ZSgpID4gMSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxEZXNjcmliYWJsZUVsZW1lbnQ+c29ydChsaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNsb3RNYXRjaGluZyhGdWxmaWxsYWJsZUVsZW1lbnQgc2xvdCwgRnVsZmlsbGFibGVFbGVtZW50IGVsZW1lbnQpIHsJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gdG9BZGRFeHRyYUZlYXR1cmVWYWx1ZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghKHZhbHVlcyBpbnN0YW5jZW9mIFRvTWFueUZlYXR1cmVWYWx1ZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmZWF0dXJlICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRmVhdHVyZVZhbHVlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9GZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhMzZmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9GZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBpZGVudGlmeSB0aGUgZmVhdHVyZSB2YWx1ZSBhbmQgdGhlIG93bmluZyBlbGVtZW50LiAKLSAqIHRoaXMgaGVscHMgdG8gaWRlbnRpZnkgd2hlcmUgdGhlIHZhbHVlIGlzIGNvbWluZyBmcm9tLiAKLSAqIEZvciBleGFtcGxlLCB0aGUgcmVhbGl6ZWQgdmFsdWUgY2FuIGJlIGZyb20gdGhlIGJhc2UgZWxlbWVudCBhcyB3ZWxsIGFzIGNvbnRyaWJ1dG9ycwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVWYWx1ZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9OVUxMXyA9ICJfTlVMTF8iOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OyAgLy8gdGhlIGVsZW1lbnQKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQ7ICAvLyB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50Ci0JcHJvdGVjdGVkIE9iamVjdCBmZWF0dXJlOyAvLyBFU3RydWN0cnVhbEZlYXR1cmUgb3IgT3Bwb3NpdGVmZWF0dXJlCi0JcHJvdGVjdGVkIEVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHRoZSB2YWx1ZSBpcyBjYWxjdWF0ZWQgZm9yLiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSB2YWx1ZQotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdCBlaXRoZXIgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZS4KLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyCi0JICovCi0JcHVibGljIEZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnJlYWxpemVyID0gcmVhbGl6ZXI7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKTsKLQlhYnN0cmFjdCBwdWJsaWMgaW50IHNpemUoKTsKLQlhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE93bmVyRWxlbWVudCgpIHsKLQkJcmV0dXJuIG93bmVyRWxlbWVudDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBFU3RydWN0dXJhbEZlYXR1cmUuIHJldHVybiBudWxsIGlmIGl0J3Mgbm90IGEgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlpZiAoIGZlYXR1cmUgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUgKSB7Ci0JCQlyZXR1cm4gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBPcHBvc2l0ZUZlYXR1cmUsIHJldHVybiBudWxsIGlmIHRoaXMgaXMgbm90IGFuIE9wcG9zaXRlRmVhdHVyZQotCSAqIEByZXR1cm4gT3Bwb3NpdGVGZWF0dXJlCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZSBnZXRPcHBvc2l0ZUZlYXR1cmUoKSB7Ci0JCWlmICggZmVhdHVyZSBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZSApIHsKLQkJCXJldHVybiAoT3Bwb3NpdGVGZWF0dXJlKWZlYXR1cmU7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVyCi0JICogQHJldHVybiBFbGVtZW50UmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyIGdldFJlYWxpemVyKCkgewotCQlyZXR1cm4gcmVhbGl6ZXI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSB7Ci0JCWlmICggRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJTWV0aG9kRWxlbWVudCBlID0gZWxlbWVudDsKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQllID0gKE1ldGhvZEVsZW1lbnQpKChDb250ZW50RGVzY3JpcHRpb24pZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJaWYgKCBlID09IG51bGwgKSB7Ci0JCQkJZSA9IG93bmVyRWxlbWVudDsKLQkJCX0KLQkJfQotCi0JCWlmICggKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KWUpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JsYW5rSW5kaWNhdG9yKE9iamVjdCB2YWx1ZSkgewotCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlyZXR1cm4gX05VTExfLmVxdWFscyh2YWx1ZS50b1N0cmluZygpKTsKLQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gX05VTExfLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpdmFsdWUpLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9JRWxlbWVudFJlYWxpemVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vSUVsZW1lbnRSZWFsaXplckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4ZTBlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9JRWxlbWVudFJlYWxpemVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbGVtZW50UmVhbGl6ZXJGYWN0b3J5IHsKLQlFbGVtZW50UmVhbGl6ZXIgY3JlYXRlUmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL09yZGVyZWRMaXN0Q29tcGFyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vT3JkZXJlZExpc3RDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzlkNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vT3JkZXJlZExpc3RDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogYSBjb21wYXJhdG9yIHRvIHNvcnQgYW4gZWxlbWVudCBsaXN0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIE9yZGVyZWRMaXN0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0JLy8gc29ydCB0aGUgYmFzZWxpc3QgYWNjb3JkaW5nIHRvIHRoZSBzb3J0ZWQgbGlzdAotCS8vIGFueSBpdGVtIGluIHNvcnRlZCBsaXN0IGJ1dCBub3QgaW4gYmFzZSBsaXN0IGFyZSBpZ25vcmVkCi0JLy8gYW55IGl0ZW0gaW4gYmFzZSBsaXN0IGJ1dCBub3QgaW4gc29ydGVkIGxpc3Qga2VlcHMgdGhlIG9yaWdpbmFsIG9yZGVyCi0JTGlzdCBiYXNlTGlzdDsKLQotCUxpc3Qgc29ydGVkTGlzdDsKLQotCU9yZGVyZWRMaXN0Q29tcGFyYXRvcihMaXN0IGJhc2VMaXN0LCBMaXN0IHNvcnRlZExpc3QpIHsKLQkJdGhpcy5iYXNlTGlzdCA9IGJhc2VMaXN0OwotCQl0aGlzLnNvcnRlZExpc3QgPSBzb3J0ZWRMaXN0OwotCX0KLQotCS8qKgotCSAqIGNvbXBhcmUgdG8gb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaW50IGkxLCBpMjsKLQkJaWYgKHNvcnRlZExpc3QgIT0gbnVsbCkgewotCQkJaTEgPSBzb3J0ZWRMaXN0Lmxhc3RJbmRleE9mKGUxKTsKLQkJCWkyID0gc29ydGVkTGlzdC5sYXN0SW5kZXhPZihlMik7Ci0JCQlpZiAoaTEgPj0gMCB8fCBpMiA+PSAwKSB7Ci0JCQkJLy8gaWYgbm90IGluIHRoZSBzb3J0ZWQgbGlzdCwgZmluZCB0aGUgaW1tZWRpYXRlIHByZWRpY2Vzc29yCi0JCQkJLy8gdGhhdCBpcyBpbiB0aGUgbGlzdCBhbmQgY29tcGFyZSB0byBpdC4KLQkJCQkvLyBpZiBubyBzdWNoIGVsZW1lbnQsIGNvbXBhcmUgdG8gdGhlIG9yaWdpbmFsIGxpc3QKLQkJCQlpZiAoaTEgPCAwKSB7Ci0JCQkJCWkxID0gZmluZENvbXBhcmFibGVJbmRleChlMSk7Ci0JCQkJfQotCi0JCQkJaWYgKGkyIDwgMCkgewotCQkJCQlpMiA9IGZpbmRDb21wYXJhYmxlSW5kZXgoZTIpOwotCQkJCX0KLQotCQkJCWlmIChpMSA+PSAwICYmIGkyID49IDAgJiYgaTEgIT0gaTIpIHsKLQkJCQkJcmV0dXJuIGkxIC0gaTI7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9yaWdpbmFsT3JkZXIoZTEsIGUyKTsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kQ29tcGFyYWJsZUluZGV4KE9iamVjdCBlKSB7Ci0JCWludCBpMiA9IC0xOwotCQlmb3IgKGludCBpID0gYmFzZUxpc3QubGFzdEluZGV4T2YoZSk7IGkgPj0gMDsgaS0tKSB7Ci0JCQlPYmplY3QgbyA9IGJhc2VMaXN0LmdldChpKTsKLQkJCWkyID0gc29ydGVkTGlzdC5sYXN0SW5kZXhPZihvKTsKLQkJCWlmIChpMiA+PSAwKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaTI7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgb3JpZ2luYWxPcmRlcihPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpbnQgaTEsIGkyOwotCQlpZiAoYmFzZUxpc3QgIT0gbnVsbCkgewotCQkJaTEgPSBiYXNlTGlzdC5sYXN0SW5kZXhPZihlMSk7Ci0JCQlpMiA9IGJhc2VMaXN0Lmxhc3RJbmRleE9mKGUyKTsKLQotCQkJcmV0dXJuIGkxIC0gaTI7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhODg3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZmlsdGVyIHRoYXQgc3RpbGwgc2hvd3MgY2VydGFpbiBlbGVtZW50cyBkdXJpbmcgcHJvY2VzcyBhdXRob3JpbmcgdGhhdAotICogUHJvY2Vzc0NvbmZpZ3VyYXRvciBkb2VzIG5vdCBzaG93LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEphbiAxMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgZXh0ZW5kcyBQcm9jZXNzQ29uZmlndXJhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgSU5TVEFOQ0UgPSBuZXcgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcigpOwotCi0JcHJpdmF0ZSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKCkgewotCQlzdXBlcihudWxsKTsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKiBvdmVycmlkZSB0aGlzLCAgZm9yIHByb2Nlc3MgYXV0aG9yaW5nIGVkaXQsIHNob3VsZCBnZXQgZGlyZWN0IGNoaWxkcmVuIG5vIHJlYWxpemF0aW9uLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmo7Ci0JCXJldHVybiAoTGlzdCllT2JqZWN0LmVHZXQoY2hpbGRGZWF0dXJlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyI3Jlc29sdmUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJlc29sdmUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXIjZ2V0VmFyaWFiaWxpdHlJbmZvKG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50KQotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUluZm8gZ2V0VmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlyZXR1cm4gbmV3IFZhcmlhYmlsaXR5SW5mbyh2ZSkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbyNnZXRJbmhlcmlyYW5jZUxpc3QoKQotCQkJICovCi0JCQlwdWJsaWMgTGlzdCBnZXRJbmhlcml0YW5jZUxpc3QoKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZ2V0T3duZXIoKSk7Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm8jZ2V0Q29udHJpYnV0b3JzKCkKLQkJCSAqLwotCQkJcHVibGljIExpc3QgZ2V0Q29udHJpYnV0b3JzKCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTRjMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbmZpZ3VyYXRvciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT3duaW5nUHJvY2VzczsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFByb2Nlc3NDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gY2hlY2tPd25pbmdQcm9jZXNzIGlmIHRydWUgd2lsbCBjaGVjayBvbiBvd25pbmcgcHJvY2VzcyBvZiBhY3Rpdml0aWVzIHdoZXRoZXIgaXQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0JICogICAgICAgICAgVGhpcyBjaGVjayBpcyBub3QgcmVxdWlyZWQgaW4gcHJvY2VzcyBlZGl0b3IgYW5kIHNraXBwaW5nIGl0IGhlbHBzIHRoZSBwZXJmb3JtYW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgYm9vbGVhbiBjaGVja093bmluZ1Byb2Nlc3MpIHsKLQkJdGhpcyhtZXRob2RDb25maWcpOwotCQl0aGlzLmNoZWNrT3duaW5nUHJvY2VzcyA9IGNoZWNrT3duaW5nUHJvY2VzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0JCW1ldGhvZENvbmZpZyA9IG5ld0NvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoc3VwZXIubWV0aG9kQ29uZmlnKTsKLQkJCXJldHVybiBhY2NlcHQoKEJyZWFrZG93bkVsZW1lbnQpb2JqLCByZWFsaXplcik7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3IjYWNjZXB0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQnJlYWtkb3duRWxlbWVudCBlLCBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUgfHwgZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkvLyBhY2NlcHQgYWxsIHByb2Nlc3MgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgY29udGVudAotCQkJLy8gZWxlbWVudAotCQkJLy8KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmFjY2VwdCgoQWN0aXZpdHkpIGUsIG5ldyBJRmlsdGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgPyByZWFsaXplci5pbkNvbmZpZygoTWV0aG9kRWxlbWVudCkgb2JqKSA6IHRydWU7Ci0JCQkJfQotCQkJCQotCQkJfSwgY2hlY2tPd25pbmdQcm9jZXNzKTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkvLyBUT0RPOiBuZWVkIHRvIGNvbnNpZGVyIGNoZWNraW5nIG9uIG93bmluZyBwcm9jZXNzIG9mIHRoZSBkZXNjcmlwdG9yIHdoZXRoZXIgaXQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkvLyBDdXJyZW50bHksIHRoaXMgY2hlY2sgaXMgbm90IHJlcXVpcmVkIGFuZCBza2lwcGluZyBpdCBoZWxwcyB0aGUgcGVyZm9ybWFuY2UuCi0JCQkvLyBCdXQgdGhpcyBjaGVjayBtaWdodCBhZmZlY3QgdGhlIGN1cnJlbnQgY29kZSwgZS5nLjogcHJvY2VzcyBwcm9wZXJ0aWVzIHZpZXcuCi0JCQkvLwotCQkJTWV0aG9kRWxlbWVudCBsaW5rZWRfb2JqID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCQkJaWYgKGxpbmtlZF9vYmogPT0gbnVsbCB8fCBsaW5rZWRfb2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBwcm9jZXNzZXMgb3duIGRlc2NyaXB0b3IgKGluZGVwZW5kZW50IGZyb20gdGhlIGNvbnRlbnQpCi0JCQkJLy8gYWx3YXlzIGFjY2VwdCBpdAotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBlbGVtZW50IHdpdGggcmVwbGFjZXIgbWlnaHQgc3RpbGwgYmUgYWNjZXB0ZWQKLQkJCQkvLwotCQkJCWxpbmtlZF9vYmogPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGxpbmtlZF9vYmosIHJlYWxpemVyKTsKLQotCQkJCS8vIGlmIHRoZSBsaW5rZWQgZWxlbWVudCBpcyBub3QgaW4gY29uZmlnLCBkb24ndCBhY2NlcHQgaXQKLQkJCQlyZXR1cm4gcmVhbGl6ZXIuaW5Db25maWcobGlua2VkX29iaik7Ci0JCQl9CQkKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5Mzk1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IgZXh0ZW5kcyBQcm9jZXNzQ29uZmlndXJhdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLQkJbWV0aG9kQ29uZmlnID0gbmV3Q29uZmlnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yI2FjY2VwdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5KSBlKQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgPT0gbnVsbCkgewotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKAotCQkJCQkJVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpLCBtZXRob2RDb25maWcpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhUbmdVdGlsCi0JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKSwgbWV0aG9kQ29uZmlnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5hY2NlcHQoZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vU3VwcG9ydGluZ0VsZW1lbnREYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9TdXBwb3J0aW5nRWxlbWVudERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJhOGI1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9TdXBwb3J0aW5nRWxlbWVudERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRWxlbWVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqICBDbGFzcyBtYW5hZ2luZyBzdXBwb3J0aW5nIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIE1hciAyMiwgMjAwOAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ0VsZW1lbnREYXRhIGV4dGVuZHMgQ29uZmlnRGF0YUJhc2UgewotCQotCXByaXZhdGUgU2V0PE1ldGhvZEVsZW1lbnQ+IHN1cHBvcnRpbmdFbGVtZW50czsKLQlwcml2YXRlIGJvb2xlYW4gZHVyaW5nVXBkYXRlU3VwcG9yaXRuZ0VsZW1lbnRzID0gZmFsc2U7Ci0JcHJpdmF0ZSBTZXQ8TWV0aG9kUGx1Z2luPiBzdXBwb3J0aW5nUGx1Z2luczsKLQlwcml2YXRlIFNldDxNZXRob2RQYWNrYWdlPiBzZWxlY3RlZFBhY2thZ2VzOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZzEgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uID0gdHJ1ZTsJCi0JCi0JcHVibGljIFN1cHBvcnRpbmdFbGVtZW50RGF0YShNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihjb25maWcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBiZWdpblVwZGF0ZVN1cHBvcnRpbmdFbGVtZW50cygpIHsKLQkJc2V0VXBkYXRpbmdDaGFuZ2VzKHRydWUpOwotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYmVnaW5VcGRhdGVTdXBwb3J0aW5nRWxlbWVudHMgLT4gIik7IC8vJE5PTi1OTFMtMSQgCi0JCX0KLQkJCi0JCXN1cHBvcnRpbmdFbGVtZW50cyA9IG5ldyBIYXNoU2V0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCQotCQlzdXBwb3J0aW5nUGx1Z2lucyA9IG5ldyBIYXNoU2V0PE1ldGhvZFBsdWdpbj4oKTsKLQkJU2V0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucyA9IG5ldyBIYXNoU2V0PE1ldGhvZFBsdWdpbj4oZ2V0Q29uZmlnKCkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCQlmb3IgKE1ldGhvZFBsdWdpbiBwbHVnaW4gOiBwbHVnaW5zKSB7Ci0JCQlpZiAocGx1Z2luLmlzU3VwcG9ydGluZygpKSB7Ci0JCQkJc3VwcG9ydGluZ1BsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNldEVuYWJsZWQoc3VwcG9ydGluZ1BsdWdpbnMuc2l6ZSgpIDwgcGx1Z2lucy5zaXplKCkpOwotCi0JCXNlbGVjdGVkUGFja2FnZXMgPSBuZXcgSGFzaFNldDxNZXRob2RQYWNrYWdlPigpOwotCQkKLQkJaWYgKGlzRW5hYmxlZCgpICYmICEgc3VwcG9ydGluZ1BsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0PE1ldGhvZFBhY2thZ2U+IHBhY2thZ2VzID0gZ2V0Q29uZmlnKCkuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJZm9yIChNZXRob2RQYWNrYWdlIHBrZyA6IHBhY2thZ2VzKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCQkJaWYgKHN1cHBvcnRpbmdQbHVnaW5zLmNvbnRhaW5zKHBsdWdpbikpIHsKLQkJCQkJc2VsZWN0ZWRQYWNrYWdlcy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gaXNFbmFibGVkKCk6ICIgKyBpc0VuYWJsZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHN1cHBvcnRpbmdQbHVnaW5zOiAiICsgc3VwcG9ydGluZ1BsdWdpbnMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gc2VsZWN0ZWRQYWNrYWdlczogIiArIHNlbGVjdGVkUGFja2FnZXMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGJlZ2luVXBkYXRlU3VwcG9ydGluZ0VsZW1lbnRzIDwtICIpOyAvLyROT04tTkxTLTEkIAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJCAKLQkJfQkJCi0JfQotCQotCS8vIENvbGxlY3QgbWFwIG9mIHJlZmVycmVkIHJlZmVyZW5jZXMgb3V0c2lkZSB0aGUgY29uZmlnCi0JcHVibGljIHZvaWQgZW5kVXBkYXRlU3VwcG9ydGluZ0VsZW1lbnRzKAotCQkJTWFwPFN0cmluZywgRWxlbWVudFJlZmVyZW5jZT4gb3V0Q29uZmlnUmVmTWFwKSB7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbmRVcGRhdGVTdXBwb3J0aW5nRWxlbWVudHMgLT4gIik7IC8vJE5PTi1OTFMtMSQgCi0JCX0KLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlTZXQ8TWV0aG9kRWxlbWVudD4gc3VwcG9ydGluZ0VsZW1lbnRzVG9Db2xsZWN0ID0gbmV3IEhhc2hTZXQ8TWV0aG9kRWxlbWVudD4oc3VwcG9ydGluZ0VsZW1lbnRzKTsKLQkJCXdoaWxlICghc3VwcG9ydGluZ0VsZW1lbnRzVG9Db2xsZWN0LmlzRW1wdHkoKSkgewotCQkJCVNldDxNZXRob2RFbGVtZW50PiBuZXdTdXBwb3J0aW5nRWxlbWVudHMgPSBuZXcgSGFzaFNldDxNZXRob2RFbGVtZW50PigpOwkJCi0JCQkJcHJvY2Vzc1JlZmVyZW5jZXNPdXRzaWRlQ29uZmlnKHN1cHBvcnRpbmdFbGVtZW50c1RvQ29sbGVjdCwgb3V0Q29uZmlnUmVmTWFwLCBuZXdTdXBwb3J0aW5nRWxlbWVudHMpOwotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5ld1N1cHBvcnRpbmdFbGVtZW50czogIiArIG5ld1N1cHBvcnRpbmdFbGVtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQkKLQkJCQlzdXBwb3J0aW5nRWxlbWVudHNUb0NvbGxlY3QgPSBuZXdTdXBwb3J0aW5nRWxlbWVudHM7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNldFVwZGF0aW5nQ2hhbmdlcyhmYWxzZSk7Ci0JCXNldE5lZWRVcGRhdGVDaGFuZ2VzKGZhbHNlKTsKLQkJCi0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzdXBwb3J0aW5nRWxlbWVudHM6ICIgKyBzdXBwb3J0aW5nRWxlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb3V0Q29uZmlnUmVmTWFwOiAiICsgb3V0Q29uZmlnUmVmTWFwLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbmRVcGRhdGVTdXBwb3J0aW5nRWxlbWVudHMgPC0gIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkIAotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1JlZmVyZW5jZXNPdXRzaWRlQ29uZmlnKAotCQkJQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50cywKLQkJCU1hcDxTdHJpbmcsIEVsZW1lbnRSZWZlcmVuY2U+IG91dENvbmZpZ1JlZk1hcCwgU2V0PE1ldGhvZEVsZW1lbnQ+IG5ld1N1cHBvcnRpbmdFbGVtZW50cykgewotCQlmb3IgKE1ldGhvZEVsZW1lbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0JCQlwcm9jZXNzUmVmZXJlbmNlc091dHNpZGVDb25maWcoZWxlbWVudCwgb3V0Q29uZmlnUmVmTWFwLCBuZXdTdXBwb3J0aW5nRWxlbWVudHMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUmVmZXJlbmNlc091dHNpZGVDb25maWcoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWFwPFN0cmluZywgRWxlbWVudFJlZmVyZW5jZT4gb3V0Q29uZmlnUmVmTWFwLCBTZXQ8TWV0aG9kRWxlbWVudD4gbmV3U3VwcG9ydGluZ0VsZW1lbnRzKSB7Ci0JCQotCQlMaXN0IHByb3BlcnRpZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0JCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGY6IChMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4pIHByb3BlcnRpZXMpIHsJCQkKLQkJCWlmICghKGYgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSAoRVJlZmVyZW5jZSkgZjsKLQkJCWlmIChmZWF0dXJlLmlzQ29udGFpbmVyKCkgfHwgZmVhdHVyZS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJTGlzdCB2YWx1ZXMgPSBudWxsOwkJCQotCQkJaWYgKCBmZWF0dXJlLmlzTWFueSgpICkgewotCQkJCXZhbHVlcyA9IChMaXN0KSB2YWx1ZTsKLQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQlpZiAoZGVzY3JpcHRvckV4Y2x1c2l2ZUNoZWNrKChNZXRob2RFbGVtZW50KSB2YWx1ZSwgZWxlbWVudCwgZmVhdHVyZSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQkJCQkKLQkJCQl2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBndWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQlmb3IgKE9iamVjdCByZWZlcnJlZFZhbHVlOiB2YWx1ZXMpIHsKLQkJCQlpZiAoISAocmVmZXJyZWRWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlNZXRob2RFbGVtZW50IHJlZmVycmVkRWxlbWVudCA9IChNZXRob2RFbGVtZW50KQlyZWZlcnJlZFZhbHVlOwotCQkJCWJvb2xlYW4gaXNPdXRDb25maWcgPSBjaGVja091dENvbmZpZ0VsZW1lbnQocmVmZXJyZWRFbGVtZW50LCBlbGVtZW50LCBuZXdTdXBwb3J0aW5nRWxlbWVudHMpOwotCQkJCWlmIChpc091dENvbmZpZyAmJiBvdXRDb25maWdSZWZNYXAgIT0gbnVsbCl7CQkJCQotCQkJCQlTdHJpbmcga2V5ID0gZ3VpZCArIHJlZmVycmVkRWxlbWVudC5nZXRHdWlkKCk7Ci0JCQkJCUVsZW1lbnRSZWZlcmVuY2UgZWxlbWVudFJlZmVyZW5jZSA9IG91dENvbmZpZ1JlZk1hcC5nZXQoa2V5KTsKLQkJCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJCQkJZWxlbWVudFJlZmVyZW5jZSA9IG5ldyBFbGVtZW50UmVmZXJlbmNlKGVsZW1lbnQsIHJlZmVycmVkRWxlbWVudCk7Ci0JCQkJCQlvdXRDb25maWdSZWZNYXAucHV0KGtleSwgZWxlbWVudFJlZmVyZW5jZSk7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudFJlZmVyZW5jZS5hZGRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0b3JFeGNsdXNpdmVDaGVjayhNZXRob2RFbGVtZW50IHJlZmVycmVkRWxlbWVudCwgTWV0aG9kRWxlbWVudCByZWZlcnJpbmdFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoISBkZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICghIChyZWZlcnJpbmdFbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpKSB7Ci0JCQlyZXR1cm4gcmVmZXJyZWRFbGVtZW50IGluc3RhbmNlb2YgVGFzazsKLQkJfQotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkpIHsKLQkJCXJldHVybiByZWZlcnJlZEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlOwkJCi0JCX0KLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkpIHsKLQkJCXJldHVybiByZWZlcnJlZEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdDsJCQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT3V0Q29uZmlnRWxlbWVudChNZXRob2RFbGVtZW50IHJlZmVycmVkRWxlbWVudCwgTWV0aG9kRWxlbWVudCByZWZlcmluZ0VsZW1lbnQsIFNldDxNZXRob2RFbGVtZW50PiBuZXdTdXBwb3J0aW5nRWxlbWVudHMpIHsKLQkJaWYgKHJlZmVycmVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQl8fCByZWZlcnJlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAocmVmZXJyZWRFbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgcmVwbGFjZXIgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKAotCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSByZWZlcnJlZEVsZW1lbnQsIGdldENvbmZpZygpKTsKLQkJCWlmIChyZXBsYWNlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gdGhlIGVsZW1lbnQgbWlnaHQgYmUgc3VidHJhY3RlZCwgc28gaWdub3JlIGl0Ci0JCWlmICghc3VwcG9ydGluZ0VsZW1lbnRzLmNvbnRhaW5zKHJlZmVyaW5nRWxlbWVudCkgJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcocmVmZXJpbmdFbGVtZW50LCBnZXRDb25maWcoKSwgdHJ1ZSwgZmFsc2UpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIUNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcocmVmZXJyZWRFbGVtZW50LCBnZXRDb25maWcoKSkKLQkJCQkmJiAhaXNPd25lclNlbGVjdGVkKHJlZmVycmVkRWxlbWVudCwgbmV3U3VwcG9ydGluZ0VsZW1lbnRzKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0aW5nRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiByZXQgPSBpc1N1cHBvcnRpbmdFbGVtZW50XyhlbGVtZW50KTsKLQkJaWYgKGxvY2FsRGVidWcxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBpc1NFOiAiICsgcmV0ICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJIiwgZWxlbWVudDogIiArIERlYnVnVXRpbC50b1N0cmluZyhlbGVtZW50LCAyKSk7Ly8kTk9OLU5MUy0xJCAKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0aW5nRWxlbWVudF8oTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpc1VwZGF0aW5nQ2hhbmdlcygpKSB7CQkJCQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CQkKLQkJfSBlbHNlIGlmIChpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCXVwZGF0ZUNoYW5nZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGluZ0VsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGFuZ2VJbXBsKCkgewotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKG51bGwsIGdldENvbmZpZygpKTsKLQl9Ci0JCi0JLy9pc1N1cHBvcnRpbmdFbGVtZW50IGNoZWNrIGR1cmluZyB1cGRhdGluZyBtb2RlCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0aW5nRWxlbWVudENhbGxEdXJpbmdVcGRhdGluZyhFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlpZiAoISBpc0VuYWJsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgcmVmZXJyaW5nRWxlbWVudCA9IHJlZi5nZXRFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgcmVmZXJyZWRFbGVtZW50ID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0U2luZ2xlRmVhdHVyZSgpOwotCQlpZiAoZGVzY3JpcHRvckV4Y2x1c2l2ZUNoZWNrKHJlZmVycmVkRWxlbWVudCwgcmVmZXJyaW5nRWxlbWVudCwgZmVhdHVyZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNPd25lclNlbGVjdGVkKHJlZmVycmVkRWxlbWVudCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJU2V0PE1ldGhvZEVsZW1lbnQ+IG5ld1N1cHBvcnRpbmdFbGVtZW50cykgewotCQlpZiAoISBpc1VwZGF0aW5nQ2hhbmdlcygpKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsJCi0JCX0KLQkJCi0JCWlmIChzdXBwb3J0aW5nRWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJRU9iamVjdCBzZWxlY3RhYmxlID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQkJaWYgKHNlbGVjdGFibGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZXQgPSBzZWxlY3RlZFBhY2thZ2VzLmNvbnRhaW5zKHNlbGVjdGFibGUpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGFibGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldCA9IHN1cHBvcnRpbmdQbHVnaW5zLmNvbnRhaW5zKHNlbGVjdGFibGUpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGFibGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXQgPSB0cnVlOwotCQl9Ci0JCWlmIChyZXQpIHsKLQkJCXN1cHBvcnRpbmdFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQlpZiAobG9jYWxEZWJ1ZzEpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiTEQ+IHN1cHBvcnRpbmdFbGVtZW50cyBhZGRlZDogIiArIERlYnVnVXRpbC50b1N0cmluZyhlbGVtZW50LCAyKSk7Ly8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJCWlmIChuZXdTdXBwb3J0aW5nRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCW5ld1N1cHBvcnRpbmdFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGluZ1NlbGVjdGFibGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghIGlzRW5hYmxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkUGFja2FnZXMuY29udGFpbnMoZWxlbWVudCkgfHwgc3VwcG9ydGluZ1BsdWdpbnMuY29udGFpbnMoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRGVzY3JpcHRvckV4Y2x1c2l2ZU9wdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JFeGNsdXNpdmVPcHRpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uKAotCQkJYm9vbGVhbiBkZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uKSB7Ci0JCVN1cHBvcnRpbmdFbGVtZW50RGF0YS5kZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uID0gZGVzY3JpcHRvckV4Y2x1c2l2ZU9wdGlvbjsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvTWFueUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55RmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5N2E0OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55RmVhdHVyZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG9NYW55IGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb01hbnlGZWF0dXJlVmFsdWUgZXh0ZW5kcyBGZWF0dXJlVmFsdWUgewotCi0JTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkZlYXR1cmVWYWx1ZSNGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCwgTWV0aG9kRWxlbWVudCwgT2JqZWN0LCBFbGVtZW50UmVhbGl6ZXIpCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgVG9NYW55RmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIE9iamVjdCBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgZmVhdHVyZSB2YWx1ZSB0byB0aGUgdmFsdWUgbGlzdAotCSAqIEBwYXJhbSBvd25lciBWYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiBAcGFyYW0gdmFsdWUgT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICggISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpICkgewkKLQkJCXJldHVybjsKLQkJfQotCQkJCi0JCUhhc2hTZXQgc2VlblZhbHVlcyA9IG5ldyBIYXNoU2V0KHZhbHVlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJLy9NZXRob2RFbGVtZW50IGNlID0gcmVhbGl6ZXIucmVhbGl6ZShlKTsKLQkJCQlNZXRob2RFbGVtZW50IGNlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQkJCi0JCQkJLy8gY2FsY3VsYXRlZCBlbGVtZW50IGNhbiBiZSBudWxsIGlmIGl0IGNhbid0IHNob3cKLQkJCQlpZiAoY2UgIT0gbnVsbCAmJiAhc2VlblZhbHVlcy5jb250YWlucyhjZSkpIHsKLQkJCQkJdmFsdWVzLmFkZChjZSk7Ci0JCQkJCXNlZW5WYWx1ZXMuYWRkKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggKG93bmVyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCQkJJiYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSkpIHsKLQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIub3JkZXJTZWN0aW9ucygoQ29udGVudEVsZW1lbnQpIG93bmVyLCB2YWx1ZXMpOwotCQl9Ci0JCQkJCQkKLQl9Ci0JCi0KLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVkIHZhbHVlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewkJCi0JCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQotCQkJLy8gcmVtb3ZlIHRoZSBfTlVMTF8gaXRlbS4gdGhhdCBpcyB1c2VkIGFzIGFuIGluZGljYXRvciB0byBibGFuayBvdXQgdGhlIGJhc2UgCi0JCQkvLyBmb3IgdGhlIGV4dGVuZC1yZXBsYWNlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJT2JqZWN0IG8gPSAoT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCBpc0JsYW5rSW5kaWNhdG9yKG8pICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaXRlbXMuYWRkKG8pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gaXRlbXM7Ci0JCX0KLQkJCi0JCXJldHVybiB2YWx1ZXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdmFsdWVzLnNpemUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4NTIzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiByZWFsaXplZCBmZWF0dXJlIHZhbHVlIGZvciBhIHRvTWFueSBvcHBvc2l0ZSBmZWF0dXJlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBUb01hbnlGZWF0dXJlVmFsdWUgewotCQotCS8qKgotCSAqIEBzZWUgY29uc3RydWN0IGEgZmVhdHVyZSB2YWx1ZSBvYmplY3QgZm9yIHRvLW1hbnkgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Ub01hbnlGZWF0dXJlVmFsdWUjYWRkKFZhcmlhYmlsaXR5RWxlbWVudCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQkKLQkJLy8gd29yayBhcm91bmQgZm9yIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgdGhhdCBzdGlsbCByZXR1cm4gYSBzaW5nbGUgdmFsdWUgaW5zdGVhZCBvZiBhIGxpc3QKLQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQlBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXYuYWRkKHZhbHVlKTsKLQkJCXZhbHVlID0gdjsKLQkJfQotCQkKLQkJaWYgKCAhKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgKSB7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mID0gKE9wcG9zaXRlRmVhdHVyZSlmZWF0dXJlOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IG9mLmdldFRhcmdldEZlYXR1cmUoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQotCQkJLy9BIHJlcGxhY2VkIHByb2Nlc3Mgc2hvdWxkIG5vdCBiZSBzaG93biBhcyBhIHByb2Nlc3MgdXNhZ2UgCi0JCQlpZiAob2YgPT0gQXNzb2NpYXRpb25IZWxwZXIuVGFza19UYXNrRGVzY3JpcHRvcnMgJiYgZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGU7CQkJCQotCQkJCVByb2Nlc3MgcHJvYyA9IFByb2Nlc3NVdGlsLmdldFByb2Nlc3ModGQuZ2V0U3VwZXJBY3Rpdml0aWVzKCkpOwotCQkJCU1ldGhvZEVsZW1lbnQgcmVhbGl6ZWQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHByb2MsIGdldFJlYWxpemVyKCkpOwotCQkJCWlmIChyZWFsaXplZCAhPSBwcm9jKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVwbGFjZSBkb2VzIG5vdCBjb21wbGV0ZWx5IHJlbW92ZQotCQkJLy8gb3V0Z29pbmcgYXNzb2NpYXRpb25zCi0JCQkvLyBpZiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBoYXMgcmVwbGFjZXIgaW4gdGhlCi0JCQkvLyBjb25maWd1cmF0aW9uCi0JCQkvLyBpdCdzIG91dGdvaW5nIGFzc29jaWF0aW9ucyAoaS5lLiwgdGhpcyBlbGVtZW50KSB3aWxsIGJlCi0JCQkvLyByZXBsYWNlZCBieSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQKLQkJCS8vIGFzIGEgcmVzdWx0LCB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBzaG91bGQgZHJvcCB0aGUKLQkJCS8vIHJlcGxhY2VkIGVsZW1lbnQKLQkJCS8vCi0JCQkvLyBmb3IgZXhhbXBsZSwgUjEgLT4gcmVzcG9uc2libGUgZm9yIEExLCBSMiByZXNwb25zaWJsZSBmb3IKLQkJCS8vIEEyCi0JCQkvLyBpZiBSMiByZXBsYWNlcyBSMSwgdGhlbiBSMiBzdGlsbCByZXNwb25zaWJsZSBmb3IgQTIKLQkJCS8vIGJ1dCBBMSBkb2VzIG5vdCBoYXZlIGEgcmVzcG9uc2libGUgcm9sZSAobm90IFIyKQotCQkJLy8gc28gZm9yIEExJ3MgcmVzcG9uc2libGUgcm9sZSBvcHBvc2l0ZSBmZWF0dXJlLAotCQkJLy8gdGhlIHZhbHVlIFIxIHNob3VsZCBiZSBkcm9wcGVkIGluc3RlYWQgb2YgcmVhbGl6ZSB0byBSMgotCQkJLy8gSmluaHVhIFhpLCAxMC8yNy8yMDA1Ci0JCQkKLQkJCS8vIGNoZWNrIHRoZSByZXBsYWNlciBpcyBub3QgZW5vdWdoLiBJZiB0aGUgYmFzZSBlbGVtZW50IGlzIHJlcGxhY2VkLCAKLQkJCS8vIGFsbCB0aGUgY29udHJpYnV0b3JzIHRvIHRoZSBiYXNlIHNob3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQgYXMgcmVwbGFjZWQuCi0JCQkvLyBzbyByZWFsaXplIHRoZSBlbGVtZW50LCBzZWUgaWYgaXQgaXMgYSByZXBsYWNlcgotCQkJLy8gQnVnIDE5OTY4NiAtIFJlcGxhY2luZyByb2xlcyBkb2VzIG5vdCB1cGRhdGUgcmVzcG9uc2libGUgd29yayBwcm9kdWN0J3MgcGFnZXMKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXBsYWNlciA9IG51bGw7Ci0JCQlpZiAoIGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgKSB7Ci0JCQkJLy9yZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlyZXBsYWNlciA9IChWYXJpYWJpbGl0eUVsZW1lbnQpQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQkJaWYgKCAocmVwbGFjZXIgPT0gZSkgfHwgIUNvbmZpZ3VyYXRpb25IZWxwZXIuaXNSZXBsYWNlcihyZXBsYWNlcikgfHwgCi0JCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNvbnRydWJ1dGVDaGFpbigoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCAoVmFyaWFiaWxpdHlFbGVtZW50KXJlcGxhY2VyKSkgewkJCQkJCi0JCQkJCXJlcGxhY2VyID0gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQlib29sZWFuIGlzVmFsdWVSZXBsYWNlZCA9IChyZXBsYWNlciAhPSBudWxsKTsKLQotCQkJYm9vbGVhbiBrZWVwID0gIWlzVmFsdWVSZXBsYWNlZDsKLQkJCWlmICggaXNWYWx1ZVJlcGxhY2VkICYmIAotCQkJCQkoQ29uZmlndXJhdGlvbkhlbHBlci5pc0V4dGVuZFJlcGxhY2VyKHJlcGxhY2VyKSAKLQkJCQkJfHwgRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSkgKSB7Ci0JCQkJLy8gaWYgdGhlIHZhbHVlIGlzIHJlcGxhY2VkLCBidXQgdGhlIG91dCBnb2luZyBmZWF0dXJlIGlzIGluaGVyaXRlZCBieSB0aGUgcmVwbGFjZXIKLQkJCQkvLyB0aGVuIHdlIHNob3VsZCBrZWVwIHRoaXMgdmFsdWUsIHNvIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIHZhbHVlIAotCQkJCS8vIG9mIHRoZSByZXBsYWNlcgotCQkJCWlmICggZi5pc01hbnkoKSApIHsKLQkJCQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJlcGxhY2VyLCBmLCByZWFsaXplcik7Ci0JCQkJCWtlZXAgPSBpdGVtcy5jb250YWlucyhvd25lcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUocmVwbGFjZXIsIGYsIHJlYWxpemVyKTsKLQkJCQkJa2VlcCA9IChpdGVtID09IG93bmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGlmIHRoZSB2YWx1ZSdzIGZlYXR1cmUgdG8gdGhpcyBlbGVtZW50IGlzIHRvLW9uZSwgCi0JCQkvLyB0aGVuIHRoaXMgdmFsdWUncyBmZWF0dXJlIHZhbHVlIHNob3VsZCBiZSB0aGUgZWxlbWVudCwKLQkJCS8vIG90aGVyd2lzZSBkcm9wIHRoZSB2YWx1ZQotCQkJLy8gZm9yIGV4YW1wbGUsIAotCQkJLy8gVDEgLT4gUjEgKHByaW1hcnkgcGVyZm9ybWFlcikKLQkJCS8vIFQyIC0+IFIyCi0JCQkvLyBUMiBjb250cmlidXRlcyB0byBUMQotCQkJLy8gc2luY2UgVDEgYWxyZWFkeSBoYXMgUjEsIHNvIFIyIGlzIGRyb3BlZAotCQkJLy8gc28gd2hlbiBjYWxjdWxhdGluZyBSMidzIHBlcmZvcm1pbmcgdGFza3MsIFQxIHNob3VsZCBub3QgYmUgaW5jbHVkZWQKLQkJCWlmICgga2VlcCApIHsKLQkJCQlNZXRob2RFbGVtZW50IHZlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQkJaWYgKCB2ZSAhPSBudWxsICkgewotCQkJCQkKLQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhIHRvLW9uZSBmZWF0dXJlLCBjdXJyZW50bHkgb25seSBUYXNrLT5QcmltYXJ5IFJvbGUgYW5kIFREIC0+IFByaW1hcnkgUkQKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYxID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXQwMUZlYXR1cmUob2YpOwotCQkJCQlpZiAoIGYxICE9IG51bGwgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh2ZSwgZjEsIHJlYWxpemVyKTsKLQkJCQkJCQotCQkJCQkJLy8gaWYgdGhlIHZhbHVlIGVsZW1lbnQncyB0by1vbmUgZmVhdHVyZSB2YWx1ZSBpdGVtIGlzIG5vdCB0aGUgY3VycmVudCBlbGVtZW50LCAKLQkJCQkJCS8vIHRoZW4gdGhlIGVsZW1lbnQncyBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIHNob3VsZCBub3QgY29udGFpbiB0aGlzIHZhbHVlLgotCQkJCQkJLy8gc2F5LCB0aGUgdmFsdWUgZWxlbWVudCBpcyBhIHRhc2sgYW5kIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYSByb2xlLAotCQkJCQkJLy8gdGhlbiBpZiB0aGUgdGFzaydzIHByaW1hcnkgcGVyZm9ybWVyIChpdGVtIGFib3ZlKSBpcyBub3QgdGhpcyByb2xlICh0aGUgY3VycmVudCBlbGVtZW50KSwgCi0JCQkJCQkvLyB0aGVuIHRoZSByb2xlJ3MgcGVyZm9ybWluZyB0YXNrcyAodGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUpIAotCQkJCQkJLy8gc2hvdWxkIG5vdCBjb250YWluIHRoaXMgdGFzayAodGhlIHZhbHVlLCB2ZSBhYm92ZSkKLQkJCQkJCWlmICggaXRlbSAhPSBlbGVtZW50KSB7Ci0JCQkJCQkJa2VlcCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkKLQkJCWlmICgga2VlcCApIHsKLQkJCQkJCi0JCQkJTWV0aG9kRWxlbWVudCBjZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgcmVhbGl6ZXIpOwotCi0JCQkJLy8gY2FsY3VsYXRlZCBlbGVtZW50IGNhbiBiZSBudWxsIGlmIGl0IGNhbid0IHNob3cKLQkJCQlpZiAoY2UgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKGNlKSkgewotCQkJCQl2YWx1ZXMuYWRkKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCQotCQkJLy8gaWYgdGhlIGVsZW1lbnQgZSBoYXMgZXh0ZW5kZXJzIGFuZCB0aGUgZXh0ZW5kZXIncyBmZWF0dXJlIGlzIHRoZSBvd25lciBlbGVtZW50LCAKLQkJCS8vIHRoZW4gd2UgYWxzbyBuZWVkIHRvIGluY2x1ZGUgdGhlIGV4dGVuZGVyCi0JCQlwcm9jZXNzRXh0ZW5kZXJzKGUsIGYpOwotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dGVuZGVycyhNZXRob2RFbGVtZW50IGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCWlmICggIShlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCllOwotCQkKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0RXh0ZW5kZXJzKCB2ZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJaWYgKCBpdGVtcy5zaXplKCkgPiAwICkgewkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWJvb2xlYW4ga2VlcCA9IGZhbHNlOwotCQkJCWlmICggZi5pc01hbnkoKSApIHsKLQkJCQkJTGlzdCB2eCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKG1lLCBmLCByZWFsaXplcik7Ci0JCQkJCS8vIGlmIHRoZSB2YWx1ZSBjb250YWlucyB0aGUgb3duZXIgZWxlbWVudCwgdGhlbiBpbmNsdWRlIGl0Ci0JCQkJCWtlZXAgPSAodnggIT0gbnVsbCkgJiYgdnguY29udGFpbnMoc3VwZXIuZWxlbWVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWV0aG9kRWxlbWVudCB2ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUobWUsIGYsIHJlYWxpemVyKTsKLQkJCQkJCi0JCQkJCS8vIGlmIHRoZSBmZWF0dXJlIHZhbHVlIGlzIHRoZSBvd25lciBlbGVtZW50LCB0aGVuIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGluY2x1ZGVkCi0JCQkJCWtlZXAgPSAodiA9PSBzdXBlci5lbGVtZW50KTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGtlZXAgJiYgIXN1cGVyLnZhbHVlcy5jb250YWlucyhtZSkgKSB7Ci0JCQkJCXN1cGVyLnZhbHVlcy5hZGQobWUpOwotCQkJCQlwcm9jZXNzRXh0ZW5kZXJzKG1lLCBmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0b3Igb3IgcmVwbGFjZXIsIGFsc28gbmVlZCB0byBjaGVjayB0aGUgZXh0ZW5kZXJzIG9mIHRoZSBiYXNlIGVsZW1lbnQKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IodmUpIHx8IENvbmZpZ3VyYXRpb25IZWxwZXIuaXNSZXBsYWNlcih2ZSkgKSB7Ci0JCQlwcm9jZXNzRXh0ZW5kZXJzKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgZik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9PbmVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhY2YwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG8tb25lIGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb09uZUZlYXR1cmVWYWx1ZSBleHRlbmRzIEZlYXR1cmVWYWx1ZSB7Ci0KLQkvLyBtYXAgb2YgZWxlbWVudCBhbmQgdGhlIHZhbHVlCi0JTGlua2VkSGFzaE1hcCB2YWx1ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIG9iamVjdCBmb3IgYSB0by1vbmUgZmVhdHVyZSB2YWx1ZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICovCi0JcHVibGljIFRvT25lRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIE9iamVjdCBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5GZWF0dXJlVmFsdWUjYWRkKFZhcmlhYmlsaXR5RWxlbWVudCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoICh2YWx1ZSA9PSBudWxsKSB8fCAhKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKSB7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBzaW5jZSB0aGlzIGlzIGEgdG8gb25lIGFzc29jaWF0aW9uLCBpZiB0aGUgYmFzZSBvZiB0aGUgb3duZXIgYWxyZWFkeSBoYXMgb25lLCAKLQkJLy8gbm8gY29udHJpYnV0aW5nIHZhbHVlIHNob3VsZCBiZSBhZGRlZAotCQkvLyAxNzI2MDIgLSBWYXJpYWJpbGl0eTogUHJpbWFyeSByb2xlIG1pc3NpbmcgaW4gdGhlIHRyYW5zaXRpdmUgY2FzZSBvZiBjb250cmlidXRpbmcgdGFza3MKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3Iob3duZXIpICkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBvd25lci5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoIGJhc2UgIT0gbnVsbCAmJiB2YWx1ZU1hcC5jb250YWluc0tleShiYXNlKSApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vTWV0aG9kRWxlbWVudCBlID0gc3VwZXIucmVhbGl6ZXIucmVhbGl6ZSgoTWV0aG9kRWxlbWVudCl2YWx1ZSk7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpdmFsdWUsIHN1cGVyLnJlYWxpemVyKTsKLQkJCi0JCWlmICggZSAhPSBudWxsICkgewotCQkJT2JqZWN0IGtleSA9IChvd25lcj09bnVsbCkgPyBlbGVtZW50IDogb3duZXI7Ci0JCQlpZiAoICF2YWx1ZU1hcC5jb250YWluc0tleShrZXkpICkgewotCQkJCXZhbHVlTWFwLnB1dChrZXksIGUpOwotCQkJfQotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkZlYXR1cmVWYWx1ZSNnZXRWYWx1ZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJCi0JCU9iamVjdCB2ID0gbnVsbDsKLQkJaWYgKCBzaXplKCkgPT0gMCApIHsKLQkJCXJldHVybiB2OwotCQl9Ci0JCQotCQlPYmplY3RbXSBlbnRyaWVzID0gdmFsdWVNYXAuZW50cnlTZXQoKS50b0FycmF5KCk7Ci0JCWlmICggc2l6ZSgpID09IDEgKSB7Ci0JCQkvLyBpZiBqdXN0IG9uZSBlbnRyeSwgcmV0dXJuIGl0Ci0JCQl2ID0gKChNYXAuRW50cnkpZW50cmllc1swXSkuZ2V0VmFsdWUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIG1vcmUgdGhhbiBvbmUgZW50cnksIGlmIHRoZSBmaXJzdCBlbnRyeSBpcyBmcm9tIHRoZSBlbGVtZW50IGl0c2VsZiwgdGhlbiByZXR1cm4gdGhlIHZhbHVlCi0JCQkvLyBvdGhlcndpc2UsIHJldHVybiBudWxsCi0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXNbMF07Ci0JCQlpZiAoIGVudHJ5LmdldEtleSgpID09IHN1cGVyLmVsZW1lbnQgKSB7Ci0JCQkJdiA9ICBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSApIHsKLQkJCWlmICggaXNCbGFua0luZGljYXRvcih2KSApIHsKLQkJCQkvLyByZW1vdmUgdGhlIF9OVUxMXyBpdGVtLiB0aGF0IGlzIHVzZWQgYXMgYW4gaW5kaWNhdG9yIHRvIGJsYW5rIG91dCB0aGUgYmFzZSAKLQkJCQkvLyBmb3IgdGhlIGV4dGVuZC1yZXBsYWNlCi0JCQkJdiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHZhbHVlTWFwLnNpemUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5NjUzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiByZWFsaXplZCBmZWF0dXJlIHZhbHVlIGZvciBhIHRvLW9uZSBvcHBvc2l0ZSBmZWF0dXJlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9PbmVPcHBvc2l0ZUZlYXR1cmVWYWx1ZSBleHRlbmRzIFRvT25lRmVhdHVyZVZhbHVlIHsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqLwotCXB1YmxpYyBUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlzdXBlcihlbGVtZW50LCBudWxsLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Ub09uZUZlYXR1cmVWYWx1ZSNhZGQoVmFyaWFiaWxpdHlFbGVtZW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICggKHZhbHVlID09IG51bGwpIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSApIHsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIFJlcGxhY2UgZG9lcyBub3QgY29tcGxldGVseSByZW1vdmUgb3V0Z29pbmcKLQkJLy8gYXNzb2NpYXRpb25zCi0JCS8vIGlmIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIGhhcyByZXBsYWNlciBpbiB0aGUKLQkJLy8gY29uZmlndXJhdGlvbgotCQkvLyBpdCdzIG91dGdvaW5nIGFzc29jaWF0aW9ucyAoaS5lLiwgdGhpcyBlbGVtZW50KSB3aWxsIGJlCi0JCS8vIHJlcGxhY2VkIGJ5IHRoZSByZXBsYWNpbmcgZWxlbWVudAotCQkvLyBhcyBhIHJlc3VsdCwgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgc2hvdWxkIGRyb3AgdGhlCi0JCS8vIHJlcGxhY2VkIGVsZW1lbnQKLQkJLy8KLQkJLy8gZm9yIGV4YW1wbGUsIFIxIC0+IHJlc3BvbnNpYmxlIGZvciBBMSwgUjIgcmVzcG9uc2libGUgZm9yIEEyCi0JCS8vIGlmIFIyIHJlcGxhY2VzIFIxLCB0aGVuIFIyIHN0aWxsIHJlc3BvbnNpYmxlIGZvciBBMgotCQkvLyBidXQgQTEgZG9lcyBub3QgaGF2ZSBhIHJlc3BvbnNpYmxlIHJvbGUgKG5vdCBSMikKLQkJLy8gc28gZm9yIEExJ3MgcmVzcG9uc2libGUgcm9sZSBvcHBvc2l0ZSBmZWF0dXJlLAotCQkvLyB0aGUgdmFsdWUgUjEgc2hvdWxkIGJlIGRyb3BwZWQgaW5zdGVhZCBvZiByZWFsaXplIHRvIFIyCi0JCS8vIEppbmh1YSBYaSwgMTAvMjcvMjAwNQotCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgdmFsdWU7Ci0JCWJvb2xlYW4gaXNWYWx1ZVJlcGxhY2VkID0gKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpCi0JCQkJJiYgKENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKSAhPSBudWxsKTsKLQkJaWYgKCFpc1ZhbHVlUmVwbGFjZWQpIHsKLQkJCS8vIGNvbnRyaWJ1dG9yIGNhbid0IGNvbnRyaWJ1dGUgMC4uMSByZWZlcmVuY2UgaWYgYmFzZQotCQkJLy8gYWxyZWFkeSBoYXMgb25lLAotCQkJLy8gb3IgaWYgbW9yZSB0aGFuIG9uZSBjb250cmlidXRvciBoYXMgdGhlIHZhbHVlLgotCQkJLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBiYXNlIHRhc2sgaGFzIG5vIGRpc2NpcGxpbmUsIGFuZCBvbmx5Ci0JCQkvLyBvbmUgb2YgaXQncyBjb250cmlidXRvcnMgaGFzIGRpc2NpcGxpbmUsCi0JCQkvLyB0aGVuIHRoYXQgY29udHJpYnV0b3IncyBkaXNjaXBsaW5lIHdpbGwgYmUgdXNlZCwKLQkJCS8vIG90aGVyd2lzZSwgbm8gZGlzY2lwbGluZQotCi0JCQkvLyByaWdodCBub3csIHdlIGNhbid0IGRldGVybWluZSBpZiB0aGVyZSBpcyBtb3JlIHRoZW4gb25lCi0JCQkvLyBjb250cmlidXRvcnMgaGFzIHRoZSB2YWx1ZQotCQkJLy8gc28gd2UgaWdub3JlIGNvbnRyaWJ1dG9yJ3MgMDEgaW1jb21pbmcgdmFsdWUKLQkJCQotCQkJLy8gKFN1Ym1pdCk6IEluYWJpbGl0eSB0byBhZGQgcmVzcG9uc2libGUgZm9yIHJlbGF0aW9uc2hpcCB0byBhIHdvcmsgcHJvZHVjdAotCQkJLy8gbmVlZCB0byBmaXggdGhpcyBpc3N1ZS4gYWx3YXlzIHRha2UgdGhlIGZpcnN0IG9uZS4KLQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsIHJlYWxpemVyKTsKLQkJCWlmICggZSAhPSBudWxsICkgewotCQkJCU9iamVjdCBrZXkgPSAob3duZXI9PW51bGwpID8gZWxlbWVudCA6IG93bmVyOwotCQkJCWlmICggIXZhbHVlTWFwLmNvbnRhaW5zS2V5KGtleSkgKSB7Ci0JCQkJCXZhbHVlTWFwLnB1dChrZXksIGUpOwotCQkJCX0KLQkJCX0JCQotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5GZWF0dXJlVmFsdWUjZ2V0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCQotCQlPYmplY3QgdiA9IG51bGw7Ci0JCQotCQlpZiAoIHNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIHY7Ci0JCX0KLQkJCi0JCU9iamVjdFtdIGVudHJpZXMgPSB2YWx1ZU1hcC5lbnRyeVNldCgpLnRvQXJyYXkoKTsKLQkJaWYgKCBzaXplKCkgPT0gMSApIHsKLQkJCS8vIGlmIGp1c3Qgb25lIGVudHJ5LCByZXR1cm4gaXQKLQkJCXYgPSAoKE1hcC5FbnRyeSllbnRyaWVzWzBdKS5nZXRWYWx1ZSgpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgbW9yZSB0aGFuIG9uZSBlbnRyeSwgaWYgdGhlIGZpcnN0IGVudHJ5IGlzIGZyb20gdGhlIGVsZW1lbnQgaXRzZWxmLCB0aGVuIHJldHVybiB0aGUgdmFsdWUKLQkJCS8vIG90aGVyd2lzZSwgcmV0dXJuIG51bGwKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpZW50cmllc1swXTsKLQkJCWlmICggZW50cnkuZ2V0S2V5KCkgPT0gc3VwZXIuZWxlbWVudCApIHsKLQkJCQl2ID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBpc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQlpZiAoIGlzQmxhbmtJbmRpY2F0b3IodikgKSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSBfTlVMTF8gaXRlbS4gdGhhdCBpcyB1c2VkIGFzIGFuIGluZGljYXRvciB0byBibGFuayBvdXQgdGhlIGJhc2UgCi0JCQkJLy8gZm9yIHRoZSBleHRlbmQtcmVwbGFjZQotCQkJCXYgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0Nsb3N1cmVMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9DbG9zdXJlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NmFkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0Nsb3N1cmVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogIEJhc2UgY2xhc3MgZm9yIGxpc3RlbmVycyB0aGF0IGxpc3RlbiB0byBhIENvbmZpZ3VyYXRpb25DbG9zdXJlIGZvciBlcnJvcnMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsb3N1cmVMaXN0ZW5lciBpbXBsZW1lbnRzIEV2ZW50TGlzdGVuZXIgewotCi0JLy8gZXJyb3IgcmVtb3ZlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1JFTU9WRUQgPSAwOwotCQotCS8vIGVycm9yIGFkZGVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQURERUQgPSAxOwotCi0JLy8gZXJyb3IgY2hhbmdlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VQREFURUQgPSAyOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXJyb3JSZW1vdmVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yQWRkZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXJyb3JVcGRhdGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKTsKLQkKLQlwdWJsaWMgdm9pZCBmaXJlRXZlbnQoaW50IHR5cGUsIGZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBmaW5hbCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBFUlJPUl9SRU1PVkVEOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZXJyb3JSZW1vdmVkKGNvbmZpZywgZXJyb3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0FEREVEOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZXJyb3JBZGRlZChjb25maWcsIGVycm9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9VUERBVEVEOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZXJyb3JVcGRhdGVkKGNvbmZpZywgZXJyb3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNmI4ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9Db25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ0RhdGFCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5TdXBwb3J0aW5nRWxlbWVudERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci0KLS8qKgotICogQSBtZXRob2QgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQ2xvc3VyZSBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ2xvc3VyZSB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbnVsbDsKLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuYWdlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgRGVwZW5kZW5jeU1hbmFnZXIgZGVwZW5kZW5jeU1hbmFnZXIgPSBudWxsOwotCQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvLyBOb2RlIGNoYW5nZSBpbmZvcm1hdGlvbi4gVGhlIG9iamVjdCBhcmUgdGhlIG1vZGVsIG9iamVjdHMKLQkvLyBjaGVjayB0aGUgbGlua2VkIG9iamVjdHMgaW4gbmVlZGVkCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWROb3RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcml2YXRlIExpc3Q8RWxlbWVudEVycm9yPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnRFcnJvcj4oKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWJvcnRDaGVja0Vycm9yID0gZmFsc2U7Ci0JCi0JLy8gQSBtYXAgb2YgaW52YWxpZCBub2RlcyB0byBFbGVtZW50RGVwZW5kZW5jeUVycm9yIG9iamVjdHMuCi0JcHJvdGVjdGVkIE1hcDxPYmplY3QsIEVsZW1lbnREZXBlbmRlbmN5RXJyb3I+IGludmFsaWROb2Rlc01hcCA9Ci0JCW5ldyBIYXNoTWFwPE9iamVjdCwgRWxlbWVudERlcGVuZGVuY3lFcnJvcj4oKTsKLQotCS8vcHJvdGVjdGVkIExpc3QgY2hhbmdlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgTGlzdDxDbG9zdXJlTGlzdGVuZXI+IGxpc3RlbmVyczsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyLkNoYW5nZUV2ZW50TGlzdGVuZXIgY29uZmlnUHJvcExpc3RlbmVyOwotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIAkJCSAgVGhlIElBY3Rpb25NYW5hZ2VyIHRvIHVzZSB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24uICBJZiBudWxsLCBjb25maWcgd2lsbCBiZSBjaGFuZ2VkIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuYWN0aW9uTWdyID0gYWN0aW9uTWdyOwotCi0JCWNvbmZpZ01hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKAotCQkJCWNvbmZpZyk7Ci0JCWlmIChjb25maWdNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWxpYnJhcnkgPSBjb25maWdNYW5hZ2VyLmdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWRlcGVuZGVuY3lNYW5hZ2VyID0gY29uZmlnTWFuYWdlci5nZXREZXBlbmRlbmN5TWFuYWdlcigpOwotCQkJCi0JCQlDb25maWd1cmF0aW9uUHJvcGVydGllcyBwcm9wcyA9IGNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoKTsKLQkJCWNvbmZpZ1Byb3BMaXN0ZW5lciA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlNZ3IuQ2hhbmdlRXZlbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2UoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJcmVmcmVzaEVycm9ybWFya3MoKTsKLQkJCQl9Ci0JCQl9OwkJCQotCQkJcHJvcHMuYWRkTGlzdGVuZXIoY29uZmlnUHJvcExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlZCwgcmUtYnVpbGQgdGhlIGFuYWx5emUgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGVycm9ycwotCQljaGVja0Vycm9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+Q29uZmlndXJhdGlvbk1hbmFnZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBjb25maWdNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRhaW5pbmluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+TWV0aG9kQ29uZmlndXJhdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIFNldHMgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMgc2VsZWN0aW9uLgotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudHMKLS8vCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcwotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25zKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0vLwkJCi0vLwkJaWYgKCBlbGVtZW50cyA9PSBudWxsICkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8JCQotLy8JCS8vIGNsZWFyIHRoZSBvbGQgc2VsZWN0aW9ucwotLy8JCXNlbGVjdGVkTm90ZXMuY2xlYXIoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrICkgewotLy8JCQlzZWxlY3RlZE5vdGVzLmFkZChlbGVtZW50c1tpXSk7Ci0vLwkJfQotLy8JfQotCi0JCi0JLyoqCi0JICogQnVpbGRzIHRoZSBzZWxlY3Rpb24gbGlzdCBiYXNlZCBvbiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tFcnJvcigpIHsKLQkJaWYgKGlzUnVubmluZ0NoZWNrRXJyb3IoKSkgewotCQkJaWYgKENvbmZpZ0RhdGFCYXNlLmxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBjaGVja0Vycm9yIHNraXBwZWQiKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChDb25maWdEYXRhQmFzZS5sb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gY2hlY2tFcnJvcl8gLT4iKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljaGVja0Vycm9yXygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoQ29uZmlnRGF0YUJhc2UubG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGNoZWNrRXJyb3JfIDwtIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2V0UnVubmluZ0NoZWNrRXJyb3IoZmFsc2UpOwotCQl9CQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcnVubmluZ0NoZWNrRXJyb3IgPSBmYWxzZTsKLQkKLQkvL0JlIGF3YXJlIG9mIHNpZGUgZWZmZWN0IG9mIHRoZSBjYWxsCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1J1bm5pbmdDaGVja0Vycm9yKCkgIHsKLQkJYm9vbGVhbiByZXQgPSBydW5uaW5nQ2hlY2tFcnJvcjsKLQkJaWYgKCEgcmV0KSB7CS8vbWFrZSBzdXJlIG5vIDIgdGhyZWFkcyBjYW4gYmUgcnVubmluZ0NoZWNrRXJyb3IgYXQgdGhlIHNhbWUgdGltZQotCQkJcnVubmluZ0NoZWNrRXJyb3IgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0UnVubmluZ0NoZWNrRXJyb3IoYm9vbGVhbiBiKSAgewotCQlydW5uaW5nQ2hlY2tFcnJvciA9IGI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja0Vycm9yXygpIHsKLQkJCi0JCS8vIEJ1ZyAyMDY3MjQgLSBTQ006IEFsd2F5cyBwcm9tcHQgY2hlY2sgb3V0IGVsZW1lbnRzIGZvciBhIG9wZW5lZCBjb25maWd1cmF0aW9uIHdoZW4gcmVmcmVzaCBzb3VyY2UgY29udHJvbCBzdGF0dXMKLQkJLy8gZG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSB0aGUgY29uZmlndXJhdGlvbiwgcmVseSBvbiB0aGUgY2FsbGVyIHRvIHZhbGlkYXRlIGl0IGJlZm9yZSBjYWxsIHRoaXMgbWV0aG9kLgotCQkvLyBWYWxpZGF0ZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgYWN0aW9uIG1hbmFnZXIuCi0JCS8vTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGFjdGlvbk1nciwgY29uZmlnKTsKLQotCQkvLyBpbml0aWFsIGZpbGwgdGhlIHNlbGVjdGlvbnMKLQkJc2VsZWN0ZWROb3Rlcy5jbGVhcigpOwotCQlzZWxlY3RlZE5vdGVzLmFkZEFsbChjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCQlzZWxlY3RlZE5vdGVzLmFkZEFsbChjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQotCQkvLyBSZS1idWlsZCB0aGUgc2VsZWN0aW9ucyB0byBhdXRvIGFkZCB0aGUgcHJvY2VzcyBwYWNrYWdlcy4KLQkJY2xlYXJFcnJvck1hcmtzKCk7Ci0JCQotCQkvLyBDbGVhbnVwIHRoZSBvbGQgc3RhdHVzIGFuZCByZWJ1aWxkIHRoZSBsaXN0LgotCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQotCQlwcm9jZXNzQ2hhbmdlZE5vZGVzKGdldFNlbGVjdGlvbigpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckVycm9yTWFya3MoKSB7Ci0JCS8vIFJlLWJ1aWxkIHRoZSBzZWxlY3Rpb25zIHRvIGF1dG8gYWRkIHRoZSBwcm9jZXNzIHBhY2thZ2VzLgotCi0JCWZvciAoSXRlcmF0b3I8RWxlbWVudEVycm9yPiBpdCA9IGVycm9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRWxlbWVudEVycm9yIGVycm9yID0gaXQubmV4dCgpOwotCQkJbm90aWZ5RXJyb3IoZXJyb3IsIENsb3N1cmVMaXN0ZW5lci5FUlJPUl9SRU1PVkVEKTsKLQkJfQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaEVycm9ybWFya3MoKSB7Ci0JCWNsZWFyRXJyb3JNYXJrcygpOwotCQlmb3IgKEl0ZXJhdG9yPEVsZW1lbnRFcnJvcj4gaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVsZW1lbnRFcnJvciBlcnJvciA9IGl0Lm5leHQoKTsKLQkJCW5vdGlmeUVycm9yKGVycm9yLCBDbG9zdXJlTGlzdGVuZXIuRVJST1JfQURERUQpOwotCQl9CQotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBzZWxlY3RQcm9jZXNzUGFja2FnZXMoQWN0aXZpdHkgYSkgewotLy8JCWlmIChhID09IG51bGwpIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCi0vLwkJZm9yIChJdGVyYXRvciBpdCA9IGEuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0vLwkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdC5uZXh0KCk7Ci0vLwkJCU9iamVjdCBwa2cgPSBlLmVDb250YWluZXIoKTsKLS8vCQkJaWYgKCFzZWxlY3RlZE5vdGVzLmNvbnRhaW5zKHBrZykpIHsKLS8vCQkJCXNlbGVjdGVkTm90ZXMuYWRkKHBrZyk7Ci0vLwkJCQljaGFuZ2VkTm9kZXMuYWRkKHBrZyk7Ci0vLwkJCX0KLS8vCi0vLwkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCXNlbGVjdFByb2Nlc3NQYWNrYWdlcygoQWN0aXZpdHkpIGUpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCi0vLwkvKioKLS8vCSAqIEFkZHMgYSBtZXRob2QgcGx1Zy1pbiBvciBwYWNrYWdlIHRvIHRoZSBjbG9zdXJlLgotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotLy8JICogQHBhcmFtIGFkZENoaWxkcmVuCi0vLwkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBhZGQgYWxsIGNoaWxkIG1ldGhvZCBlbGVtZW50cy4KLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGFkZChFT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gYWRkQ2hpbGRyZW4pIHsKLS8vCQlpZiAoIUxpYnJhcnlVdGlsLnNlbGVjdGFibGUoZWxlbWVudCkpIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCi0vLwkJaWYgKCFzZWxlY3RlZE5vdGVzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0vLwkJCXNlbGVjdGVkTm90ZXMuYWRkKGVsZW1lbnQpOwotLy8KLS8vCQkJLy8gU2F2ZSB0aGUgY2hhbmdlZCBub2RlcyBzbyB0aGF0IHdlIGNhbiB1cGRhdGUgdGhlIHN0YXR1cyBsYXRlci4KLS8vCQkJYWRkQ2hhbmdlZChlbGVtZW50KTsKLS8vCi0vLwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0vLwkJCQlzZWxlY3RTeXN0ZW1QYWNrYWdlcygoTWV0aG9kUGx1Z2luKSBlbGVtZW50KTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gQWRkIHRoZSBwYXJlbnQgbWV0aG9kIGVsZW1lbnQgYXMgd2VsbC4KLS8vCQlFT2JqZWN0IHBhcmVudCA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOwotLy8JCWlmICgocGFyZW50ICE9IG51bGwpICYmICFzZWxlY3RlZE5vdGVzLmNvbnRhaW5zKHBhcmVudCkpIHsKLS8vCQkJYWRkKHBhcmVudCwgZmFsc2UpOwotLy8JCX0KLS8vCi0vLwkJLy8gQWRkIGNoaWxkcmVuIGFzIG5lZWRlZC4KLS8vCQlpZiAoYWRkQ2hpbGRyZW4pIHsKLS8vCQkJRUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmVDb250ZW50cygpOwotLy8JCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLS8vCQkJCQlhZGQoY2hpbGQsIHRydWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfQotLy8KLS8vCXByaXZhdGUgdm9pZCBhZGRDaGFuZ2VkKE9iamVjdCBlbGVtZW50KSB7Ci0vLwkJaWYgKCFjaGFuZ2VkTm9kZXMuY29udGFpbnMoZWxlbWVudCkpIHsKLS8vCQkJY2hhbmdlZE5vZGVzLmFkZChlbGVtZW50KTsKLS8vCQl9Ci0vLwl9Ci0KLS8vCXByaXZhdGUgdm9pZCBzZWxlY3RTeXN0ZW1QYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0vLwkJTGlzdCBwa2dzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pOwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJRU9iamVjdCBwa2cgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotLy8JCQlhZGQocGtnLCBmYWxzZSk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgcGx1Zy1pbiBvciBwYWNrYWdlIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChPYmplY3QgaW5wdXQpIHsKLQkJaWYgKChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHx8IGlucHV0ID09IGNvbmZpZwotCQkJCXx8IHNlbGVjdGVkTm90ZXMuY29udGFpbnMoaW5wdXQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZWxlbWVudCBkZXBlbmRlbmN5IGVycm9yIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBlbGVtZW50IEEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBBbiA8Y29kZT5FbGVtZW50RGVwZW5kZW5jeUVycm9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERlcGVuZGVuY3lFcnJvciBnZXRFcnJvcihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0RXJyb3IoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgRWxlbWVudERlcGVuZGVuY3lFcnJvciBnZXRFcnJvcihPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IChFbGVtZW50RGVwZW5kZW5jeUVycm9yKSBpbnZhbGlkTm9kZXNNYXAKLQkJCQkuZ2V0KGVsZW1lbnQpOwotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCWVycm9yID0gbmV3IEVsZW1lbnREZXBlbmRlbmN5RXJyb3IoZWxlbWVudCk7Ci0JCQlpbnZhbGlkTm9kZXNNYXAucHV0KGVsZW1lbnQsIGVycm9yKTsKLQkJfQotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlcmUgaXMgZXJyb3IgaW4gdGhpcyBjb25maWd1cmF0aW9uIGNsb3N1cmUKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcigpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGludmFsaWROb2Rlc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIGl0Lm5leHQoKTsKLQkJCWlmIChlcnJvci5pc0Vycm9yKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHByb2JsZW0gKGVycm9yL3dhcm5pbmcpIHdpdGggdGhpcyBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvYmxlbSgpIHsKLQkJcmV0dXJuIGludmFsaWROb2Rlc01hcC5zaXplKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBlcnJvcnMuCi0JICogCi0JICogQHJldHVybiBBIGEgbGlzdCBvZiA8Y29kZT5QYWNrYWdlRXJyb3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBMaXN0PFBhY2thZ2VFcnJvcj4gZ2V0QWxsRXJyb3JzKCkgewotCQlMaXN0PFBhY2thZ2VFcnJvcj4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDxQYWNrYWdlRXJyb3I+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbnZhbGlkTm9kZXNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IChFbGVtZW50RGVwZW5kZW5jeUVycm9yKSBpdC5uZXh0KCk7Ci0JCQllcnJvcnMuYWRkQWxsKGVycm9yLmdldEFsbCgpKTsKLQkJfQotCQlyZXR1cm4gZXJyb3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBkZXBlbmRlbmN5IGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZGVuY3lFcnJvcnMoKSB7Ci0JCXJldHVybiBpbnZhbGlkTm9kZXNNYXAudmFsdWVzKCkudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBpbnZhbGlkIGVsZW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gQSBsaXN0IG9mIGludmFsaWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIExpc3Q8T2JqZWN0PiBnZXRJbnZhbGlkRWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oaW52YWxpZE5vZGVzTWFwLmtleVNldCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRXJyb3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGludmFsaWROb2Rlc01hcC5jb250YWluc0tleShlbGVtZW50KSkgewotCQkJaW52YWxpZE5vZGVzTWFwLnJlbW92ZShlbGVtZW50KTsKLQotLy8JCQkvLyBFcnJvciBzdGF0dXMgY2hhbmdlZCwgYWRkIGl0IHRvIHRoZSBjaGFuZ2VkIGxpc3QuCi0vLwkJCWlmICghY2hhbmdlZE5vZGVzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0vLwkJCQljaGFuZ2VkTm9kZXMuYWRkKGVsZW1lbnQpOwotLy8JCQl9Ci0JCX0KLQl9Ci0KLS8vCS8qKgotLy8JICogUmV0dXJucyBhbGwgdGhlIGNoYW5nZWQgZWxlbWVudHMuIFRoZXNlIGFyZSBlbGVtZW50cyB3aG9zZSBjaGVjayBzdGF0ZXMKLS8vCSAqIGhhdmUgY2hhbmdlZCBvciB3aG9zZSBpbWFnZSBoYXZlIGNoYW5nZWQgZHVlIHRvIGVycm9yLgotLy8JICogCi0vLwkgKiBAcmV0dXJuIEEgbGlzdCBvZiBjaGFuZ2VkIG1ldGhvZCBlbGVtZW50cy4KLS8vCSAqLwotLy8JcHVibGljIExpc3QgZ2V0Q2hhbmdlZEVsZW1lbnRzKCkgewotLy8JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KGNoYW5nZWROb2Rlcyk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdCA9IGludmFsaWROb2Rlc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotLy8JCQlpZiAoIWl0ZW1zLmNvbnRhaW5zKGl0ZW0pKSB7Ci0vLwkJCQlpdGVtcy5hZGQoaXRlbSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIGl0ZW1zOwotLy8JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3RlZE5vdGVzLnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NoYW5nZWROb2RlcyhPYmplY3RbXSBjaGFuZ2VkTm9kZXMpIHsKLQkJZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKS5iZWdpblVwZGF0ZVN1cHBvcnRpbmdFbGVtZW50cygpOwotCQlwcm9jZXNzQ2hhbmdlZE5vZGVzXyhjaGFuZ2VkTm9kZXMpOwotLyoJCWlmIChpc0Fib3J0Q2hlY2tFcnJvcigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0qLwotCQlNYXA8U3RyaW5nLCBFbGVtZW50UmVmZXJlbmNlPiByZWZNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnRSZWZlcmVuY2U+KCk7CQkJCi0JCWdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0U3VwcG9ydGluZ0VsZW1lbnREYXRhKCkuZW5kVXBkYXRlU3VwcG9ydGluZ0VsZW1lbnRzKHJlZk1hcCk7Ci0JCWlmIChpc0Fib3J0Q2hlY2tFcnJvcigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChFbGVtZW50UmVmZXJlbmNlIHJlZiA6IHJlZk1hcC52YWx1ZXMoKSkgewotCQkJRWxlbWVudEVycm9yIGVycm9yID0gQ29uZmlndXJhdGlvbkVycm9yTWF0cml4LmdldEVycm9yKGNvbmZpZywgcmVmKTsKLQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJZXJyb3JzLmFkZChlcnJvcik7Ci0JCQkJbm90aWZ5RXJyb3IoZXJyb3IsIENsb3N1cmVMaXN0ZW5lci5FUlJPUl9BRERFRCk7Ci0JCQkJcHJvY2Vzc1BhY2thZ2VFcnJvcihMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKHJlZi5lbGVtZW50KSwKLQkJCQkJCUxpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUocmVmLnJlZkVsZW1lbnQpLCBlcnJvcgotCQkJCQkJCQkuZ2V0RXJyb3JMZXZlbCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NoYW5nZWROb2Rlc18oT2JqZWN0W10gY2hhbmdlZE5vZGVzKSB7CQotCQlTdXBwb3J0aW5nRWxlbWVudERhdGEgc2VEYXRhID0gZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKTsJCi0KLQkJLy8gZm9yIGFsbCB0aGUgY2hhbmdlZCBub3RlcywKLQkJLy8gYWxsIGFsbCBjb250YWluZWQgZWxlbWVudHMgYW5kIGNoZWNrIGlmIHRoZSBlbGVtZW50cyBhcmUgaW4gY29uZmlnIG9yIG5vdAotCQkvLyBpZiB0aGUgZWxlbWVudHMgYXJlIGluIGNvbmZpZywgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMgc2hvdWxkIGFsc28gYmUgaW4gY29uZmlnCi0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8Y2hhbmdlZE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNBYm9ydENoZWNrRXJyb3IoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gdGhlIGVsZW1lbnRzIGFyZSBlaXRoZXIgcGx1Z2luIG9yIHBhY2thZ2UKLQkJCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGNoYW5nZWROb2Rlc1tpXTsKLQkJCWlmIChzZURhdGEuaXNTdXBwb3J0aW5nU2VsZWN0YWJsZSgoTWV0aG9kRWxlbWVudCkgY2hhbmdlZEVsZW1lbnQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5TWFuYWdlcgotCQkJCQkuZ2V0RGVwZW5kZW5jeSgoTWV0aG9kRWxlbWVudCkgY2hhbmdlZEVsZW1lbnQpOwotCQkJaWYgKGRlcGVuZGVuY3kgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlMaXN0IHJlZnMgPSBkZXBlbmRlbmN5LmdldEFsbEVsZW1lbnRSZWZlcmVuY2VzKCk7Ci0JCQlpZiAoIHJlZnMgPT0gbnVsbCB8fCByZWZzLnNpemUoKSA9PSAwICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0JCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSlpdHIubmV4dCgpOwotCQkJCWNoZWNrUmVmZXJlbmNlKHJlZik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBhZGRlZCBjYXRlZ29yeSwgY2hlY2sgdGhlaXIgcmVmZXJlbmNlcyBhcyB3ZWxsCi0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRWxlbWVudD4oKTsKLQkJbGlzdC5hZGRBbGwoY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uRGF0YSgpLmdldEFkZGVkRWxlbWVudHMoKSk7Ci0JCWZvciAoIEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gaXQubmV4dCgpOwotCQkJCi0JCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gCi0JCQkJZGVwZW5kZW5jeU1hbmFnZXIuZ2V0RGVwZW5kZW5jeSgoTWV0aG9kRWxlbWVudCllLmVDb250YWluZXIoKSk7Ci0JCQlpZiAoZGVwZW5kZW5jeSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQotCQkJTGlzdCByZWZzID0gZGVwZW5kZW5jeS5nZXRBbGxFbGVtZW50UmVmZXJlbmNlcygpOwotCQkJaWYgKCByZWZzID09IG51bGwgfHwgcmVmcy5zaXplKCkgPT0gMCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgewotCQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpaXRyLm5leHQoKTsKLQkJCQlpZiAoIHJlZi5nZXRFbGVtZW50KCkgPT0gZSApIHsKLQkJCQkJY2hlY2tSZWZlcmVuY2UocmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCi0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja1JlZmVyZW5jZShFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlNZXRob2RFbGVtZW50IGUgPSByZWYuZ2V0RWxlbWVudCgpOwotCQlNZXRob2RFbGVtZW50IGVfcmVmID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLQkJU3VwcG9ydGluZ0VsZW1lbnREYXRhIHNlRGF0YSA9IGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0U3VwcG9ydGluZ0VsZW1lbnREYXRhKCk7Ci0JCUNvbmZpZ3VyYXRpb25EYXRhIGNvbmZpZ0RhdGEgPSBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb25EYXRhKCk7Ci0KLQkJCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZTogIiArIGUpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVfcmVmOiAiICsgZV9yZWYpOwotCQkJCQotCQlpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBCdWcgMjA3NjA5IC0gUmVwbGFjZWQgZWxlbWVudHMgYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb25maWd1cmF0aW9uIGVycm9yICJtaXNzaW5nIG1hbmRhdG9yeSBpbnB1dCIKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgcmVwbGFjZWQsIGlnbm9yZSB0aGUgcmVmZXJlbmNlCi0JCWlmICggZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCApIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCllLCBjb25maWcpOwotCQkJaWYgKCByZXBsYWNlciAhPSBudWxsICkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJLy8gdGhlIGVsZW1lbnQgbWlnaHQgYmUgc3VidHJhY3RlZCwgc28gaWdub3JlIGl0Ci0vKgkJaWYgKCAhQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhlLCBjb25maWcsIHRydWUsIGZhbHNlKSkgewotCQkJcmV0dXJuOwotCQl9Ki8KLQkJaWYgKCBjb25maWdEYXRhLmlzU3Vic3RyYWN0ZWQoZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkJCQotCQkvLyBpZiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCBpbiAgY29uZmlnLCBsb2cgZXJyb3IKLQkJaWYgKCAhQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhlX3JlZiwgY29uZmlnKQotCQkJCSYmICFzZURhdGEuaXNTdXBwb3J0aW5nRWxlbWVudENhbGxEdXJpbmdVcGRhdGluZyhyZWYpKSB7Ci0JCQkKLQkJCS8qCi0JCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQsIAotCQkJCQkobmV3IFN0cmluZ1tdIHtMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSwgCi0JCQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZV9yZWYpIH0pKTsKLQkJCQotCQkJRWxlbWVudEVycm9yIGVycm9yID0gbmV3IEVsZW1lbnRFcnJvcigKLQkJCQkJdGhpcywgRXJyb3JJbmZvLldBUk5JTkcsCi0JCQkJCW1lc3NhZ2UsIGUsIGVfcmVmLCBFcnJvckluZm8uUkVGRVJFTkNFX1RPKTsgLy8kTk9OLU5MUy0xJAotCQkJKi8KLQkJCUVsZW1lbnRFcnJvciBlcnJvciA9IENvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5nZXRFcnJvcihjb25maWcsIHJlZik7Ci0JCQlpZiAoIGVycm9yID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQllcnJvcnMuYWRkKGVycm9yKTsKLQkJCW5vdGlmeUVycm9yKGVycm9yLCBDbG9zdXJlTGlzdGVuZXIuRVJST1JfQURERUQpOwotCQkJCi0JCQkvLyBwcm9jZXNzIHBhY2thZ2UgZXJyb3IKLQkJCXByb2Nlc3NQYWNrYWdlRXJyb3IoTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlKSwgTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlX3JlZiksIGVycm9yLmdldEVycm9yTGV2ZWwoKSApOwotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BhY2thZ2VFcnJvcihPYmplY3QgcGtnLCBPYmplY3QgcGtnX3JlZiwgaW50IGVycm9yTGV2ZWwgKSB7Ci0JCWlmICggZXJyb3JMZXZlbCA+IDAgKSB7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IocGtnLCB0cnVlKTsKLQkJCQotCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IuZ2V0RXJyb3IocGtnX3JlZik7Ci0JCQlpZiAoIHBrZ2Vycm9yID09IG51bGwgKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5UmVzb3VyY2VzLmNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE7Ci0JCi0JCQkJcGtnZXJyb3IgPSAgbmV3IFBhY2thZ2VFcnJvcihlcnJvckxldmVsLCBtZXNzYWdlLCAKLQkJCQkJCXBrZywgcGtnX3JlZiwgRXJyb3JJbmZvLlJFRkVSRU5DRV9UTyk7CQkJCQotCQkJCWVycm9yLmFkZEVycm9yKHBrZ2Vycm9yKTsKLQkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcGtnZXJyb3Iuc2V0RXJyb3JMZXZlbChlcnJvckxldmVsKTsKLQkJCQkKLQkJCQkvLyBuZWVkIHRvIHJlY2FsYyB0aGUgZXJyb3IgYml0cwotCQkJCWVycm9yLmNhbGN1bGF0ZUVycm9yQml0cygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gcmVtb3ZlIHRoZSBlcnJvcgotCQkJcmVtb3ZlRXJyb3IocGtnKTsKLQkJfQotCQkKLQkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdClwa2cpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlFcnJvcihFbGVtZW50RXJyb3IgZXJyb3IsIGludCB0eXBlICkgewotCQkKLQkJaWYgKCBlcnJvciA9PSBudWxsIHx8IGxpc3RlbmVycyA9PSBudWxsIHx8IGxpc3RlbmVycy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCQkJCQkKLQkJCWZvciAoSXRlcmF0b3I8Q2xvc3VyZUxpc3RlbmVyPiBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCi0JCQkJbGlzdGVuZXIuZmlyZUV2ZW50KHR5cGUsIGNvbmZpZywgZXJyb3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCQotLy8JLyoqCi0vLwkgKiBWYWxpZGF0ZXMgdGhlIGVsZW1lbnQgZGVwZW5kZW5jeSB3aGVuIHRoZSBlbGVtZW50IGlzIHNlbGVjdGVkLiBXaGVuIHRoZQotLy8JICogZWxlbWVudCBpcyBzZWxlY3RlZCwgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOiAxLiBDaGVjayBlcnJvciBmb3IKLS8vCSAqIHJlZmVyZW5jZXMgMi4gUmVtb3ZlIGVycm9yIGZvciBkZXBlbmRlbnRzIGFzc29jaWF0ZWQgd2l0aCBlbGVtZW50IDMuCi0vLwkgKiBVcGRhdGUgcGFyZW50czogaWYgdGhlIHNlbGVjdGlvbiBpcyB2YWxpZCwgcmVtb3ZlIGFsbCBlcnJvcnMgZnJvbSBwYXJlbnRzCi0vLwkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50IGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCwgc2V0IGVycm9yIHRvCi0vLwkgKiBhbGwgcGFyZW50cy4KLS8vCSAqIAotLy8JICogQHBhcmFtIGRlcGVuZGVuY3kKLS8vCSAqICAgICAgICAgICAgRWxlbWVudERlcGVuZGVuY3kKLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2VsZWN0ZWQoUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSkgewotLy8JCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGRlcGVuZGVuY3kuZ2V0RWxlbWVudCgpOwotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHJlbW92ZSBhbGwgcHJldmlvdXMgZXJyb3JzLgotLy8JCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCi0vLwkJaWYgKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIGNoZWNrIGFsbCBkZXBlbmRlbmN5IGVycm9ycyBpbiB0aGUKLS8vCQkvLyBkZXBlbmRlbnQgZWxlbWVudHMuCi0vLwkJTGlzdCBkZXBlbmRlbnRzID0gZGVwZW5kZW5jeS5nZXREZXBlbmRlbnRzKCk7Ci0vLwkJaWYgKGRlcGVuZGVudHMgIT0gbnVsbCAmJiBkZXBlbmRlbnRzLnNpemUoKSA+IDApIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQ7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRyID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotLy8JCQkJZWxlbWVudCA9IGl0ci5uZXh0KCk7Ci0vLwotLy8JCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLS8vCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IucmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8JCQkJCWlmIChlcnJvci5zaXplKCkgPT0gMCkgewotLy8JCQkJCQlyZW1vdmVFcnJvcihlbGVtZW50KTsKLS8vCi0vLwkJCQkJCS8vIENsZWFyIHRoZSBwYXJlbnQgZXJyb3IgaW50cm9kdWNlZCBieSB0aGlzIGVsZW1lbnQuCi0vLwkJCQkJCXVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoKEVPYmplY3QpIGVsZW1lbnQpOwotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQkvLyBub3RpZnkgdGhlIGVycm9yIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvciByZW1vdmVkCi0vLwkJCQkJbm90aWZ5RXJyb3JSZW1vdmVkKHBrZ2Vycm9yKTsKLS8vCi0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIElmIGFuIGVsZW1lbnQgaXMgY2hlY2tlZCwgY2hlY2sgdGhlIGVsZW1lbnQgaXQgZGVwZW5kcyBvbiwKLS8vCQkvLyB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBhcyB3ZWxsLgotLy8JCUxpc3QgcmVmcyA9IGRlcGVuZGVuY3kuZ2V0UmVmZXJlbmNlcygpOwotLy8JCWlmIChyZWZzICE9IG51bGwgJiYgcmVmcy5zaXplKCkgPiAwKSB7Ci0vLwkJCVBhY2thZ2VSZWZlcmVuY2UgcmVmOwotLy8JCQlPYmplY3QgZWxlbWVudDsKLS8vCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlyZWYgPSAoUGFja2FnZVJlZmVyZW5jZSkgaXRyLm5leHQoKTsKLS8vCQkJCWVsZW1lbnQgPSByZWYuZ2V0UmVmRWxlbWVudCgpOwotLy8KLS8vCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCS8vIERvbid0IHdhcm4gb24gb3B0aW9uYWwgaW5wdXRzIG5vdCBiZWluZwotLy8JCQkJLy8gcHJlc2VudCwgc28gYWRkZWQgdGhlIGNhbklnbm9yZSgpIG1ldGhvZAotLy8JCQkJaWYgKCFpc1NlbGVjdGVkKGVsZW1lbnQpICYmICFjYW5JZ25vcmUocmVmKSkgewotLy8JCQkJCVN0cmluZyBtZXNzYWdlOwotLy8JCQkJCWludCBlcnJvclR5cGUgPSAwOwotLy8JCQkJCWlmIChyZWYuaGFzQmFzZVJlZmVyZW5jZSgpKSB7Ci0vLwkJCQkJCWVycm9yVHlwZSA9IEVycm9ySW5mby5FUlJPUjsKLS8vCQkJCQkJbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMjsKLS8vCQkJCQl9IGVsc2UgewotLy8JCQkJCQllcnJvclR5cGUgPSBFcnJvckluZm8uV0FSTklORzsKLS8vCQkJCQkJbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMzsKLS8vCQkJCQl9Ci0vLwotLy8JCQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBnZXRFcnJvcihjaGFuZ2VkRWxlbWVudCwKLS8vCQkJCQkJCXRydWUpOwotLy8JCQkJCQotLy8JCQkJCVBhY2thZ2VFcnJvciBwa2dlcnJvciA9ICBuZXcgUGFja2FnZUVycm9yKHRoaXMsIGVycm9yVHlwZSwgbWVzc2FnZSwKLS8vCQkJCQkJCWNoYW5nZWRFbGVtZW50LCBlbGVtZW50LCBFcnJvckluZm8uUkVGRVJFTkNFX1RPKTsJCQkJCi0vLwkJCQkJZXJyb3IuYWRkRXJyb3IocGtnZXJyb3IpOwotLy8KLS8vCQkJCQkvLyBub3RpZnkgdGhlIGVycm9yIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvciBhZGRlZAotLy8JCQkJCW5vdGlmeUVycm9yQWRkZWQocGtnZXJyb3IpOwotLy8KLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGNoYW5nZWRFbGVtZW50LAotLy8JCQkJCQkJZmFsc2UpOwotLy8JCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJCVBhY2thZ2VFcnJvciBwa2dlcnJvciA9IGVycm9yLnJlbW92ZUVycm9yKGVsZW1lbnQpOwotLy8JCQkJCQkKLS8vCQkJCQkJLy8gbm90aWZ5IHRoZSBlcnJvciBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3IgcmVtb3ZlZAotLy8JCQkJCQlub3RpZnlFcnJvclJlbW92ZWQocGtnZXJyb3IpOwotLy8KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIEZpbmFsbHksIHVwZGF0ZSB0aGUgcGFyZW50cy4KLS8vCQl1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKChFT2JqZWN0KSBjaGFuZ2VkRWxlbWVudCk7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBWYWxpZGF0ZXMgdGhlIEVsZW1lbnREZXBlbmRlbmN5IHdoZW4gdGhlIGVsZW1lbnQgaXMgdW5zZWxlY3RlZC4gV2hlbiB0aGUKLS8vCSAqIGVsZW1lbnQgaXMgdW5zZWxlY3RlZCwgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOiAxLiBjaGVjayBlcnJvciBmb3IKLS8vCSAqIGRlcGVuZGVuY3RzIDIuIHJlbW92ZSBlcnJvciBmb3IgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggZWxlbWVudCwgaW4KLS8vCSAqIGNhc2Ugb2YgYW55IGFkZGVkIHdoZW4gdGhlIGVsZW1lbnQgd2FzIGNoZWNrIDMuIHVwZGF0ZSBwYXJlbnRzOiBpZiB0aGUKLS8vCSAqIHNlbGVjdGlvbiBpcyB2YWxpZCwgcmVtb3ZlIGFsbCBlcnJvcnMgZnJvbSBwYXJlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0vLwkgKiBlbGVtZW50IGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCwgc2V0IGVycm9yIHRvIGFsbCBwYXJlbnRzLgotLy8JICogCi0vLwkgKiBAcGFyYW0gZGVwZW5kZW5jeQotLy8JICogICAgICAgICAgICBBIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5PC9jb2RlPiBvYmplY3QuCi0vLwkgKi8KLS8vCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVVuU2VsZWN0ZWQoUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSkgewotLy8JCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGRlcGVuZGVuY3kuZ2V0RWxlbWVudCgpOwotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgdW4tc2VsZWN0ZWQsIHJlbW92ZSBhbGwgcHJldmlvdXMgZXJyb3JzLgotLy8JCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCi0vLwkJaWYgKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgdW4tc2VsZWN0ZWQsIHJlbW92ZSBhbGwgZXJyb3JzIGluIHRoZQotLy8JCS8vIHJlZmVyZW5jZWQgZWxlbWVudHMuCi0vLwkJTGlzdCByZWZzID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2VzKCk7Ci0vLwkJaWYgKHJlZnMgIT0gbnVsbCAmJiByZWZzLnNpemUoKSA+IDApIHsKLS8vCQkJRWxlbWVudFJlZmVyZW5jZSByZWY7Ci0vLwkJCU9iamVjdCBlbGVtZW50OwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLS8vCQkJCXJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdHIubmV4dCgpOwotLy8JCQkJZWxlbWVudCA9IHJlZi5nZXRSZWZFbGVtZW50KCk7Ci0vLwotLy8JCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLS8vCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IucmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8JCQkJCWlmIChlcnJvci5zaXplKCkgPT0gMCkgewotLy8JCQkJCQlyZW1vdmVFcnJvcihlbGVtZW50KTsKLS8vCi0vLwkJCQkJCS8vIENsZWFyIHRoZSBwYXJlbnQgZXJyb3IgaW50cm9kdWNlZCBieSB0aGlzIGVsZW1lbnQuCi0vLwkJCQkJCXVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoKEVPYmplY3QpIGVsZW1lbnQpOwotLy8KLS8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJLy8gbm90aWZ5IHRoZSBlcnJvciBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3IgcmVtb3ZlZAotLy8JCQkJCW5vdGlmeUVycm9yUmVtb3ZlZChwa2dlcnJvcik7Ci0vLwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQkvLyBJZiBhbiBlbGVtZW50IGlzIHVuY2hlY2tlZCwgY2hlY2sgdGhlIGRlcGVuZGVudCBlbGVtZW50cy4KLS8vCQkvLyBJZiB0aGVyZSBhcmUgY2hlY2sgZWxlbWVudHMgZGVwZW5kaW5nIG9uIGl0LCB0aGUgZWxlbWVudCBjYW4ndCBiZQotLy8JCS8vIHVuY2hlY2tlZC4KLS8vCQlMaXN0IGRlcGVuZGVudHMgPSBkZXBlbmRlbmN5LmdldERlcGVuZGVudHMoKTsKLS8vCQlpZiAoZGVwZW5kZW50cyAhPSBudWxsICYmIGRlcGVuZGVudHMuc2l6ZSgpID4gMCkgewotLy8JCQlPYmplY3QgZWxlbWVudDsKLS8vCQkJZm9yIChJdGVyYXRvciBpdHIgPSBkZXBlbmRlbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQllbGVtZW50ID0gaXRyLm5leHQoKTsKLS8vCi0vLwkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCX0KLS8vCi0vLwkJCQlpZiAoaXNTZWxlY3RlZChlbGVtZW50KSkgewotLy8JCQkJCS8vIERldGVybWluZSB0aGUgdHlwZSBvZiBkZXBlbmRlbmN5LgotLy8JCQkJCVBhY2thZ2VEZXBlbmRlbmN5IGNoaWxkRGVwID0gZGVwZW5kZW5jeU1hbmFnZXIKLS8vCQkJCQkJCS5nZXREZXBlbmRlbmN5KChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLS8vCi0vLwkJCQkJdmFsaWRhdGVTZWxlY3RlZChjaGlsZERlcCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gZmluYWxseSwgdXBkYXRlIHRoZSBwYXJlbnRzCi0vLwkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdCkgY2hhbmdlZEVsZW1lbnQpOwotLy8JfQotLy8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUGFyZW50RXJyb3IoRU9iamVjdCBwYXJlbnQsIEVPYmplY3QgZWxlbWVudCwKLQkJCWludCBlcnJvclR5cGUpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLS8vCQlpZiAoKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpCi0vLwkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGFyZW50KSkgewotLy8JCQl1cGRhdGVQYXJlbnRFcnJvcihwYXJlbnQuZUNvbnRhaW5lcigpLCBlbGVtZW50LCBlcnJvclR5cGUpOwotLy8JCQlyZXR1cm47Ci0vLwkJfQotCi0JCS8vIFJlbW92ZSB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCBmcm9tIGFsbCBwYXJlbnRzLgotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IocGFyZW50LCBmYWxzZSk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLnNpemUoKSA+IDApIHsKLQkJCWVycm9yLnJlbW92ZUVycm9yKGVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKGVycm9yVHlwZSAhPSBFcnJvckluZm8uTk9ORSkgewotCQkJLy8gUHJvcGVnYXRlIHRoZSBlcnJvciB0byBhbGwgcGFyZW50cy4KLQkJCWVycm9yID0gZ2V0RXJyb3IocGFyZW50LCB0cnVlKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5jb25maWdDbG9zdXJlV2FybmluZ19tc2cxOwotCQkJUGFja2FnZUVycm9yIHBrZ2VyciA9IG5ldyBQYWNrYWdlRXJyb3IoZXJyb3JUeXBlLCBtZXNzYWdlLCBwYXJlbnQsIGVsZW1lbnQsCi0JCQkJCUVycm9ySW5mby5OT05FKTsKLQkJCWVycm9yLmFkZEVycm9yKHBrZ2Vycik7Ci0JCX0gZWxzZSBpZiAoKGVycm9yICE9IG51bGwpICYmIChlcnJvci5zaXplKCkgPT0gMCkpIHsKLQkJCXJlbW92ZUVycm9yKHBhcmVudCk7Ci0JCX0KLQotCQl1cGRhdGVQYXJlbnRFcnJvcihwYXJlbnQuZUNvbnRhaW5lcigpLCBlbGVtZW50LCBlcnJvclR5cGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKEVPYmplY3QgZWxlbWVudCkgewotCQlpbnQgZXJyb3JUeXBlID0gRXJyb3JJbmZvLk5PTkU7Ci0KLQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoZXJyb3IuaXNFcnJvcigpIHx8IGVycm9yLmlzQ2hpbGRFcnJvcigpKSB7Ci0JCQkJZXJyb3JUeXBlID0gUGFja2FnZUVycm9yLkNISUxEX0VSUk9SOwotCQkJfSBlbHNlIGlmIChlcnJvci5pc1dhcm5pbmcoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0JCQkJZXJyb3JUeXBlID0gUGFja2FnZUVycm9yLkNISUxEX1dBUk5JTkc7Ci0JCQl9Ci0JCX0KLQotCQl1cGRhdGVQYXJlbnRFcnJvcihlbGVtZW50LmVDb250YWluZXIoKSwgZWxlbWVudCwgZXJyb3JUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBhY2NlcHQgdGhlIGN1dHJyZW50IHNlbGVjdGlvbiwgZml4IHRoZSBlcnJvcnMgYW5kIGlnbm9yZSBhbnkgd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeEVycm9ycygpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQkJYm9vbGVhbiBmb3JjZUNoZWNrID0gdHJ1ZTsKLQkJd2hpbGUgKGNoYW5nZWQpIHsKLQkJCWNoYW5nZWQgPSBmaXhQcm9ibGVtcyh0cnVlLCBmb3JjZUNoZWNrKTsKLQkJCWZvcmNlQ2hlY2sgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpeCBhbGwgZXJyb3IocykgYW5kIHdhcm5pZ24ocykKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQcm9ibGVtcygpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQkJYm9vbGVhbiBmb3JjZUNoZWNrID0gdHJ1ZTsKLQkJd2hpbGUgKGNoYW5nZWQpIHsKLQkJCWNoYW5nZWQgPSBmaXhQcm9ibGVtcyhmYWxzZSwgZm9yY2VDaGVjayk7Ci0JCQlmb3JjZUNoZWNrID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZml4UHJvYmxlbXMoYm9vbGVhbiBlcnJvck9ubHksIGJvb2xlYW4gZm9yY2VDaGVjaykgewotCQkvLyBOb3RlOiBtYWtlIGNsb3N1cmUgd2lsbCBzZWxlY3QgZWxlbWVudHMgYXMgbmVlZGVkLgotCQkvLyBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHNlbGN0ZWQgb25lcwotCQkvLyBpbiBvcmRlciB0byB0cmFjZSB0aGUgc3RhdHVzCi0JCS8vTGlzdCBjdXJyZW50U2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGVkTm90ZXMpOwotCi0JCS8vIGlmIGZvcmNlIGNoZWNrIGlzIHNldCwgcnVuIGNoZWNrIGFueXdheQotCQlib29sZWFuIGNoYW5nZWQgPSBmb3JjZUNoZWNrOwotCi0JCS8vIGxpc3Qgb2YgZXJyb3JJbmZvIG9iamVjdHMKLQkJTGlzdCBlcnJvcnMgPSBnZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7CQkJCi0JCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQkJCVBhY2thZ2VFcnJvciBlcnJvcjsKLQkJCUVPYmplY3QgY2F1c2VFbGVtZW50OwotCQkJLy9ib29sZWFuIG93bmVyU2VsZWN0ZWQsIGNhdXNlU2VsZWN0ZWQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQllcnJvciA9IChQYWNrYWdlRXJyb3IpIGl0Lm5leHQoKTsKLQotCQkJCS8vb3duZXJFbGVtZW50ID0gKEVPYmplY3QpIGVycm9yLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWNhdXNlRWxlbWVudCA9IChFT2JqZWN0KSBlcnJvci5nZXRDYXVzZUVsZW1lbnQoKTsKLQkJCQkvL2FkZENoYW5nZWQob3duZXJFbGVtZW50KTsKLQkJCQkvL2FkZENoYW5nZWQoY2F1c2VFbGVtZW50KTsKLS8vCQkJCWlmIChlcnJvci5pc0NoaWxkRXJyb3IoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0KLQkJCQlib29sZWFuIGlzRXJyb3IgPSBlcnJvci5pc0Vycm9yKCk7Ci0JCQkJYm9vbGVhbiBpc1dhcm5pbmcgPSBlcnJvci5pc1dhcm5pbmcoKTsKLQkJCQlpZiAoIWlzRXJyb3IgJiYgIWlzV2FybmluZyB8fCAhaXNFcnJvciAmJiBlcnJvck9ubHkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCi0JCQkJaWYgKCAhaXNTZWxlY3RlZChjYXVzZUVsZW1lbnQpICYmIHNlbGVjdEVycm9yRWxlbWVudChjYXVzZUVsZW1lbnQpICkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIGNoYW5nZWQgKSB7Ci0JCQljaGVja0Vycm9yKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RFcnJvckVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0KLQkJYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIAotCQkJCSYmICFjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQoKE1ldGhvZFBsdWdpbikgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIAotCQkJCSYmICFjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKGVsZW1lbnQpKXsKLQkJCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChNZXRob2RQYWNrYWdlKSBlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGVkID0gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0KLS8vCS8qKgotLy8JICogdXBkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlicmFyeSB3aXRoIHRoZSBjdXJyZW50IHNlbGVjdGlvbnMKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2F2ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0vLwkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotLy8JCUxpc3QgcGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotLy8KLS8vCQlwbHVnaW5zLmNsZWFyKCk7Ci0vLwkJcGFja2FnZXMuY2xlYXIoKTsKLS8vCi0vLwkJRU9iamVjdCBlbGVtZW50OwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3RlZE5vdGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0vLwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0vLwkJCQlpZiAoIXBsdWdpbnMuY29udGFpbnMoZWxlbWVudCkpIHsKLS8vCQkJCQlwbHVnaW5zLmFkZChlbGVtZW50KTsKLS8vCQkJCX0KLS8vCQkJfSBlbHNlIGlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpCi0vLwkJCQkJJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIKLS8vCQkJCQkJCS5pc0dsb2JhbFBhY2thZ2UoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQpKSB7Ci0vLwkJCQlpZiAoIXBhY2thZ2VzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0vLwkJCQkJcGFja2FnZXMuYWRkKGVsZW1lbnQpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogUGFja2FnZXMgdGhlIGxpYnJhcnkgYmFzZWQgb24gdGhlIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBjdXJyZW50IGxpYnJhcnkuIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBhCi0JICogY29weSBvZiB0aGUgY3VycmVudCBsaWJyYXJ5IHNob3VsZCBiZSBjcmVhdGVkIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczoKLQkgKiAxLiBDcmVhdGUgYSBuZXcgPGNvZGU+Q29uZmlndXJhdGlvbk1hbmFnZXI8L2NvZGU+IHdpdGggYSBjb3B5IG9mIHRoZQotCSAqIG9yaWdpbmFsIGxpYnJhcnksIDIuIFJlYnVpbGQgdGhlIGRlcGVuZGVuY3ksIDMuIENyZWF0ZSBhCi0JICogPGNvZGU+Q29uZmlndXJhdGlvbkNsb3N1cmU8L2NvZGU+IHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+TWV0aG9kTGlicmFyeTwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcGFja2FnZUxpYnJhcnkoYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKSB7Ci0JCXByb2Nlc3NTZWxlY3Rpb24obGlicmFyeSwgcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBjb25maWd1cmF0aW9ucyBleGNlcHQgZm9yIHRoZSBjdXJyZW50IG9uZS4KLQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJY29uZmlncy5jbGVhcigpOwotCQljb25maWdzLmFkZChjb25maWcpOwotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIHByb2Nlc3MgdGhlIHNlbGVjdGVkIHBhY2thZ2UgYnkgcmVtb3ZlaW5nIGFsbCB1bnNlbGVjdGVkIGVsZW1lbnRzIGFuZCBhbnkKLQkgKiBtaXNzaW5nIHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzU2VsZWN0aW9uKEVPYmplY3QgZWxlbWVudCwKLQkJCWJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcykgewotCQlpZiAocmVtb3ZlQnJva2VuUmVmZXJlbmNlcykgewotCQkJLy8gSXRlcmF0b3IgdGhlIHJlZmVyZW5jZXMgYW5kIHJlbW92ZSBicm9rZW4gcmVmZXJlbmNlcy4KLQkJCUVMaXN0IHJlZmVyZW5jZXMgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKTsKLQkJCWlmIChyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChyZWZlcmVuY2VzKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCQlFT2JqZWN0IHBrZ1JlZiA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUocmVmKTsKLQkJCQkJaWYgKHBrZ1JlZiAhPSBudWxsICYmICFpc1NlbGVjdGVkKHBrZ1JlZikpIHsKLQkJCQkJCXJlbW92ZVJlZmVyZW5jZShlbGVtZW50LCByZWYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJRUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmVDb250ZW50cygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQotCQkJCS8vIElmIHRoZSBjaGlsZCBlbGVtZW50IGlzIHNlbGVjdGFibGUgYnV0IGl0IGlzIG5vdCBpbiB0aGUKLQkJCQkvLyBjb25maWd1cmF0aW9uLCByZW1vdmUgaXQuCi0JCQkJaWYgKExpYnJhcnlVdGlsLnNlbGVjdGFibGUoY2hpbGQpICYmICFpc1NlbGVjdGVkKGNoaWxkKSkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGNoaWxkKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9jZXNzU2VsZWN0aW9uKGNoaWxkLCByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKEVPYmplY3Qgb3duZXJFbGVtZW50LCBFT2JqZWN0IHJlZkVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBjb25maWdNYW5hZ2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlJUHJvcGVydHlTb3VyY2UgcHMgPSBwcm92aWRlci5nZXRQcm9wZXJ0eVNvdXJjZShvd25lckVsZW1lbnQpOwotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzID0gcHMuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQlpZiAocGRzICE9IG51bGwgJiYgcGRzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpIHBkc1tpXTsKLQkJCQlPYmplY3QgaWQgPSBkZXNjcmlwdG9yLmdldElkKCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gcHMuZ2V0UHJvcGVydHlWYWx1ZShpZCk7Ci0KLQkJCQkvLyBDaGVjayB3aGV0aGVyIHRoZSB2YWx1ZSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYW4gZWRpdGFibGUKLQkJCQkvLyB2YWx1ZS4KLQkJCQlJUHJvcGVydHlTb3VyY2Ugc291cmNlID0gcHJvdmlkZXIuZ2V0UHJvcGVydHlTb3VyY2UodmFsdWUpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IHNvdXJjZS5nZXRFZGl0YWJsZVZhbHVlKCk7Ci0JCQkJfQotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJCUVMaXN0IHJlZkxpc3QgPSAoRUxpc3QpIHZhbHVlOwotCQkJCQlpZiAocmVmTGlzdC5jb250YWlucyhyZWZFbGVtZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlJlZmVyZW5jZSBbIiArIExpYnJhcnlVdGlsLmdldE5hbWUocmVmRWxlbWVudCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICJdIHJlbW92ZWQgZnJvbSBbIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0TmFtZShvd25lckVsZW1lbnQpCi0JCQkJCQkJCQkJCSsgIl0ncyByZWZlcmVuY2UgbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZWZMaXN0LnJlbW92ZShyZWZFbGVtZW50KTsKLQkJCQkJCXBzLnNldFByb3BlcnR5VmFsdWUoaWQsIHJlZkxpc3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJSZWZlcmVuY2UgWyIgKyBMaWJyYXJ5VXRpbC5nZXROYW1lKHJlZkVsZW1lbnQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrICJdIHJlbW92ZWQgZnJvbSBbIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXROYW1lKG93bmVyRWxlbWVudCkKLQkJCQkJCQkJCQkrICJdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwcy5zZXRQcm9wZXJ0eVZhbHVlKGlkLCBudWxsKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQotCQljbGVhckVycm9yTWFya3MoKTsKLQkJCi0JCWlmIChjb25maWdNYW5hZ2VyICE9IG51bGwpIHsKLQkJCUNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIHByb3BzID0gY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpOwkJCQotCQkJcHJvcHMucmVtb3ZlTGlzdGVuZXIoY29uZmlnUHJvcExpc3RlbmVyKTsKLQkJfQotCQkJCQotCQljb25maWdNYW5hZ2VyID0gbnVsbDsKLQkJY29uZmlnID0gbnVsbDsKLQkJbGlicmFyeSA9IG51bGw7Ci0JCWRlcGVuZGVuY3lNYW5hZ2VyID0gbnVsbDsKLQkJYWN0aW9uTWdyID0gbnVsbDsKLQkJLy9zZWxlY3RlZE5vdGVzLmNsZWFyKCk7Ci0JCS8vY2hhbmdlZE5vZGVzLmNsZWFyKCk7Ci0JCWlmIChpbnZhbGlkTm9kZXNNYXAgIT0gbnVsbCkgewotCQkJaW52YWxpZE5vZGVzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMuY2xlYXIoKTsKLQkJfQotCX0KLQotLy8JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShQYWNrYWdlUmVmZXJlbmNlIHBrZ1JlZikgewotLy8JCXJldHVybiBwa2dSZWYuY2FuSWdub3JlKCk7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDbG9zdXJlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PENsb3N1cmVMaXN0ZW5lcj4oKTsKLQkJfQotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JCQotCQlub3RpZnlMaXN0ZW5lcihsaXN0ZW5lciwgdGhpcy5lcnJvcnMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihDbG9zdXJlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCQotLy8JcHJpdmF0ZSB2b2lkIG5vdGlmeUVycm9yQWRkZWQoUGFja2FnZUVycm9yIHBrZ2Vycm9yKSB7Ci0vLwkJCS8vbm90aWZ5TGlzdGVuZXJzKENsb3N1cmVMaXN0ZW5lci5FUlJPUl9BRERFRCwgcGtnZXJyb3IpOwotLy8JfQotLy8JCi0vLwlwcml2YXRlIHZvaWQgbm90aWZ5RXJyb3JSZW1vdmVkKFBhY2thZ2VFcnJvciBwa2dlcnJvcikgewotLy8JCS8vbm90aWZ5TGlzdGVuZXJzKENsb3N1cmVMaXN0ZW5lci5FUlJPUl9SRU1PVkVELCBwa2dlcnJvcik7CQotLy8JfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcihDbG9zdXJlTGlzdGVuZXIgbGlzdGVuZXIsIExpc3QgZXJyb3JzKSB7Ci0JCQkJCQkJCQkKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVsZW1lbnRFcnJvciBlcnJvciA9IChFbGVtZW50RXJyb3IpaXQubmV4dCgpOwotCQkJbGlzdGVuZXIuZmlyZUV2ZW50KENsb3N1cmVMaXN0ZW5lci5FUlJPUl9BRERFRCwgY29uZmlnLCBlcnJvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBYm9ydENoZWNrRXJyb3IoKSB7Ci0JCXJldHVybiBhYm9ydENoZWNrRXJyb3I7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEFib3J0Q2hlY2tFcnJvcihib29sZWFuIGFib3J0Q2hlY2tFcnJvcikgewotCQl0aGlzLmFib3J0Q2hlY2tFcnJvciA9IGFib3J0Q2hlY2tFcnJvcjsKLQkJaWYgKENvbmZpZ0RhdGFCYXNlLmxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNldEFib3J0Q2hlY2tFcnJvcjogIiArIGFib3J0Q2hlY2tFcnJvcik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBhZGQgdGhpcyBlbGVtZW50IGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLS8vCSAqIHRoaXMgaXMgZm9yIHF1aWNrIGZpeCBhY3Rpb24KLS8vCSAqIG91ciBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIHNlbGVjdCB0aGUgb3duaW5nIHBhY2thZ2UKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiBAcmV0dXJuIElTdGF0dXMKLS8vCSAqLwotLy8JcHVibGljIElTdGF0dXMgc2VsZWN0RWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQkKLS8vCQkvL2lmIHRoZSBlbGVtZW50IGlzIHN1YnRyYWN0ZWQsIHdlIGNhbid0IHNlbGVjdCB0aGUgZWxlbWVudAotLy8JCS8vIHJldHVybiBhbiBlcnJvcgotLy8JCWlmICggY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uRGF0YSgpLmlzRWxlbWVudEluU3VidHJhY3RlZENhdGVnb3J5KGVsZW1lbnQpKSB7Ci0vLwkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuUXVpY2tmaXhFcnJvcl9yZWFzb24xLCAKLS8vCQkJCQkobmV3IFN0cmluZ1tdIHtMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KX0pKTsKLS8vCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLS8vCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKLS8vCQl9Ci0vLwkJCi0vLwkJLy8gZm9yIHF1aWNrIGZpeCwgd2UganVzdCBzZWxlY3QgdGhlIHBhY2thZ2Ugb2YgdGhlIGVsZW1lbnQgCi0vLwkJLy8gYW5kIHRoZSBjaGlsZCBwYWNrYWdlcwotLy8JCU9iamVjdCBvd25lciA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0vLwkJaWYgKCBvd25lciAhPSBudWxsICYmIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotLy8JCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChvd25lcik7Ci0vLwkJfQkKLS8vCQkKLS8vCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ29uZmlndXJhdGlvbkVycm9yTWF0cml4LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWQzYzZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ29uZmlndXJhdGlvbkVycm9yTWF0cml4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBkZWZpbmUgdGhlIGNvbmZpZ3VyYXRpb24gZXJyb3IgbGV2ZWwgbWV0cml4Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3JNYXRyaXggewotCQotLy8JcHJpdmF0ZSBzdGF0aWMgTGlzdCBsZXZlbDFGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCXByaXZhdGUgc3RhdGljIExpc3QgbGV2ZWwyRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IGxldmVsM0ZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8Jc3RhdGljIHsKLS8vCQlsZXZlbDJGZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpKTsKLS8vCX0KLQkKLS8vCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotLy8JcHVibGljIENvbmZpZ3VyYXRpb25FcnJvck1hdHJpeChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotLy8JCXRoaXMuY29uZmlnID0gY29uZmlnOwotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudEVycm9yIGdldEVycm9yKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQkKLQkJaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSApIHsKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUVycm9yKGNvbmZpZywgcmVmKTsKLQkJfSAKLQkJCi0JCWludCBlcnJvckxldmVsID0gRXJyb3JJbmZvLklORk87Ci0JCVN0cmluZyBtZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQ7Ci0JCQotCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0RWxlbWVudCgpOwotCQlNZXRob2RFbGVtZW50IGVfcmVmID0gKE1ldGhvZEVsZW1lbnQpcmVmLmdldFJlZkVsZW1lbnQoKTsKLQotCQlpZiAoIHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSkgKSB7Ci0JCQllcnJvckxldmVsID0gRXJyb3JJbmZvLkVSUk9SOwotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfbWlzc2luZ19tYW5kYXRvcnlfaW5wdXQ7Ci0JCX0gZWxzZSBpZiAoIHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCkpICkgewotCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5FUlJPUjsKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3Npbmdfb3V0cHV0OwotCQl9IGVsc2UgaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCkpICkgewotCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5XQVJOSU5HOwotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfbWlzc2luZ19wcmltYXJ5X3BlcmZvcm1lcjsKLQkJfSBlbHNlIGlmICggcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSApIHsKLQkJCWVycm9yTGV2ZWwgPSBFcnJvckluZm8uV0FSTklORzsKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfcmVzcG9uc2libGVfZm9yX3dvcmtQcm9kdWN0OwotCQl9IGVsc2UgaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpIAotCQkJCXx8IHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKSAKLQkJCQl8fCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCkpCi0JCQkJICkgewotCQkJLy8gZGVmYXVsdAotCQl9IGVsc2UgaWYgKCBpc0JyZWFrZG93blJlZmVyZW5jZShlLCBlX3JlZikgKSB7Ci0JCQllcnJvckxldmVsID0gRXJyb3JJbmZvLklORk87Ci0JCX0gZWxzZSBpZiggaXNHdWlkYW5jZVJlZmVyZW5jZShlLCBlX3JlZikgKSB7Ci0JCQkvLyBkZWZhdWx0Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5iaW5kKG1lc3NhZ2VJZCwgCi0JCQkJKG5ldyBTdHJpbmdbXSB7TGlicmFyeVV0aWwuZ2V0VHlwZVBhdGgoZSksIAotCQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZVBhdGgoZV9yZWYpIH0pKTsKLQotCQlyZXR1cm4gbmV3IEVsZW1lbnRFcnJvcihjb25maWcsIGVycm9yTGV2ZWwsIG1lc3NhZ2UsIGUsIGVfcmVmLCBFcnJvckluZm8uUkVGRVJFTkNFX1RPLCBtZXNzYWdlSWQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQnJlYWtkb3duUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZSwgTWV0aG9kRWxlbWVudCBlX3JlZikgewotCQlyZXR1cm4gKGVfcmVmIGluc3RhbmNlb2YgVGFzayB8fCBlX3JlZiBpbnN0YW5jZW9mIFJvbGUgfHwgZV9yZWYgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgCi0JCQkmJiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzR3VpZGFuY2VSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlLCBNZXRob2RFbGVtZW50IGVfcmVmKSB7Ci0JCXJldHVybiAoZSBpbnN0YW5jZW9mIFRhc2sgfHwgZSBpbnN0YW5jZW9mIFJvbGUgfHwgZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSAKLQkJCSYmIChlX3JlZiBpbnN0YW5jZW9mIEd1aWRhbmNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudEVycm9yIGdldFZhcmlhYmlsaXR5RXJyb3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEVsZW1lbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudClyZWYuZ2V0RWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgZV9yZWYgPSAoVmFyaWFiaWxpdHlFbGVtZW50KXJlZi5nZXRSZWZFbGVtZW50KCk7Ci0JCQotCQlpZiAoIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IGVfcmVmICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCi0JCWludCBlcnJvckxldmVsID0gRXJyb3JJbmZvLldBUk5JTkc7Ci0JCVN0cmluZyBtZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQ7Ci0KLQkJaWYgKCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyApIHsKLQkJCWlmICggZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSB8fCBlIGluc3RhbmNlb2YgR3VpZGFuY2UgKSB7Ci0JCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5JTkZPOwotCQkJfQotCQkJCi0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9jb250cmlidXRvcl9taXNzaW5nX2Jhc2U7Ci0JCX0gZWxzZSBpZiAoIHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMgKSB7Ci0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9leHRlbmRlcl9taXNzaW5nX2Jhc2U7Ci0JCQkKLQkJfSBlbHNlIGlmICggdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMgCi0JCQkJfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUykgewotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfcmVwbGFjZXJfbWlzc2luZ19iYXNlOwotCQl9Ci0JCQotCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChtZXNzYWdlSWQsIAotCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVQYXRoKGUpLCAKLQkJCQkJCUxpYnJhcnlVdGlsLmdldFR5cGVQYXRoKGVfcmVmKSB9KSk7Ci0KLQkJcmV0dXJuIG5ldyBFbGVtZW50RXJyb3IoY29uZmlnLCBlcnJvckxldmVsLCBtZXNzYWdlLCBlLCBlX3JlZiwgRXJyb3JJbmZvLlJFRkVSRU5DRV9UTywgbWVzc2FnZUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0RlcGVuZGVuY3lNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0RlcGVuZGVuY3lNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1N2NlNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9EZXBlbmRlbmN5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBtZXRob2QgZWxlbWVudCBkZXBlbmRlbmNpZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeU1hbmFnZXIgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgbWV0aG9kIGxpYnJhcnkuCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQotCS8vIFRoZSBsaWJyYXJ5IG1hbmFnZXIuCi0JcHJvdGVjdGVkIElMaWJyYXJ5TWFuYWdlciBsaWJyYXJ5TWFuYWdlcjsKLQotCS8vIEEgbWFwIG9mIHBhY2thZ2UgZWxlbWVudHMgdG8gUGFja2FnZURlcGVuZGVuY3kgb2JqZWN0cy4KLQlwcm90ZWN0ZWQgTWFwIGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gQSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lci4KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXRoaXMubGlicmFyeSA9IGxpYnJhcnk7Ci0JCXRoaXMubGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKAotCQkJCWxpYnJhcnkpOwotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkKLQkJbGliTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0vLwkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRAotLy8JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCkgewotLy8JCQkJCS8vIFRPRE86IElzIHRoaXMgbmVjZXNzYXJ5PwotLy8JCQkJCS8vIHJlZnJlc2goKTsKLS8vCQkJCX0gZWxzZSAKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQpIHsKLQkJCQkJaGFuZGxlRGVsZXRlZEVsZW1lbnQoY2hhbmdlZEl0ZW1zKTsKLQkJCQl9IGVsc2UgaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQpIHsKLQkJCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsICYmIGNoYW5nZWRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQkJYnVpbGREZXBlbmRlbmN5Rm9yKChNZXRob2RFbGVtZW50KSBlKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlCi0JCQkJCQkJCQkJCQkrICIgaXMgbm90IGEgbWV0aG9kIGVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWxpYnJhcnlNYW5hZ2VyLmFkZExpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGRlcGVuZGVuY3kgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiBBIDxjb2RlPlBhY2thZ2VEZXBlbmRlbmN5PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGFja2FnZURlcGVuZGVuY3kgZ2V0RGVwZW5kZW5jeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFMaWJyYXJ5VXRpbC5zZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIEFsd2F5cyByZWJ1aWxkIHRoZSBkZXBlbmRlbmN5IGZvciB0aGUgZWxlbWVudCBzaW5jZSB0aGUKLQkJLy8gZGVwZW5kZW50cyBtYXkgbm90IGJlIGZ1bGx5IGVzdGFibGlzaGVkLgotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeShlbGVtZW50LCBmYWxzZSk7Ci0JCWlmIChkZXBlbmRlbmN5ID09IG51bGwgfHwgIWRlcGVuZGVuY3kuaXNMb2FkZWQoKSkgewotCQkJYnVpbGREZXBlbmRlbmN5KGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGdldERlcGVuZGVuY3koZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludERlcGVuZGVuY3koKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkZXBlbmRlbmN5TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCSgoUGFja2FnZURlcGVuZGVuY3kpIGl0Lm5leHQoKSkucHJpbnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgZGVwZW5kZW5jeSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGREZXBlbmRlbmN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IGJ1aWxkRGVwZW5kZW5jeUZvcihlbGVtZW50KTsKLQotCQkJRUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmVDb250ZW50cygpOwotCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCQlpZiAoISAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJCWlmIChtZXRob2RFbGVtZW50ICE9IG51bGwKLQkJCQkJCQkmJiAhTGlicmFyeVV0aWwuc2VsZWN0YWJsZShtZXRob2RFbGVtZW50KSkgewotCQkJCQkJYnVpbGREZXBlbmRlbmN5Rm9yKG1ldGhvZEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlkZXBlbmRlbmN5LnNldExvYWRlZCh0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgdGhlIGRlcGVuZGVuY3kgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogPHA+Ci0JICogVGhpcyBjcmVhdGVzIGFuIDxjb2RlPkVsZW1lbnRSZWZlcmVuY2U8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIHRoYXQgcG9pbnRzIHRvIGFsbCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cywgYW5kIGFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgYXMKLQkgKiBhIGRlcGVuZGVudCBlbGVtZW50IHRvIGFsbCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cy4gVGhpcyBzaG91bGQgb25seSBiZQotCSAqIGNhbGxlZCBvbmNlIGZvciBlYWNoIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqIEByZXR1cm4gQSA8Y29kZT5QYWNrYWdlRGVwZW5kZW5jeTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBQYWNrYWdlRGVwZW5kZW5jeSBidWlsZERlcGVuZGVuY3lGb3IoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQnVpbGQgdGhlIGRlcGVuZGVuY3kgb24gdGhlIHNlbGVjdGFibGUgZWxlbWVudC9wYXJlbnQgb25seQotCQlNZXRob2RFbGVtZW50IHNlbGVjdGFibGVFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQkJaWYgKHNlbGVjdGFibGVFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IGdldERlcGVuZGVuY3koc2VsZWN0YWJsZUVsZW1lbnQsIHRydWUpOwotCi0JCS8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgZWxlbWVudCByZWZlcmVuY2UgZm9yIHRoaXMgZWxlbWVudC4KLQkJZGVwZW5kZW5jeS5yZW1vdmVSZWZlcmVuY2UoZWxlbWVudCk7Ci0vKgotCQkvLyBHZXQgdGhlIFZhcmlhYmlsaXR5RWxlbWVudC4KLQkJQ29udGVudEVsZW1lbnQgYmFzZUVsZW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQliYXNlRWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgKChDb250ZW50RWxlbWVudCkgZWxlbWVudCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gRXN0YWJsaXNoIHRoZSBwYWNrYWdlIHJlZmVyZW5jZS4KLQkJCQlFT2JqZWN0IHNlbGVjdGFibGVCYXNlID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShiYXNlRWxlbWVudCk7Ci0JCQkJaWYgKHNlbGVjdGFibGVCYXNlICE9IG51bGwpIHsKLQkJCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZSgKLQkJCQkJCQlzZWxlY3RhYmxlQmFzZSwgdHJ1ZSk7Ci0KLQkJCQkJaWYgKCFwa2dSZWYuaGFzUmVmZXJlbmNlKGVsZW1lbnQsIGJhc2VFbGVtZW50KSkgewotCQkJCQkJLy8gQWRkIHRoZSBkZXRhaWwgZWxlbWVudCByZWZlcmVuY2UgdG8gdGhlIHBhY2thZ2UKLQkJCQkJCS8vIHJlZmVyZW5jZS4KLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZSByZWYgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50UmVmZXJlbmNlKAotCQkJCQkJCQllbGVtZW50LCBiYXNlRWxlbWVudCk7Ci0JCQkJCQlwa2dSZWYuYWRkUmVmZXJlbmNlKHJlZik7Ci0JCQkJCX0KLQotCQkJCQkvLyBTZXQgdGhlIGRlcGVuZGVudCBvZiB0aGUgcmVmZXJlbmNlZCBwYWNrYWdlLgotCQkJCQlnZXREZXBlbmRlbmN5KHNlbGVjdGFibGVCYXNlLCB0cnVlKS5hZGREZXBlbmRlbnQoCi0JCQkJCQkJc2VsZWN0YWJsZUVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxpc3QgcmVmZXJlbmNlcyA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpOwotCi0JCS8vIFVwZGF0ZSB0aGUgZGVwZW5kZW50cyBvZiB0aG9zZSBlbGVtZW50cyBpbiB0aGUgbGlzdC4KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiByZWZlcmVuY2VzLnNpemUoKSA+IDApIHsKLQkJCS8vIEdldCB0aGUgc2VsZWN0YWJsZSByZWZlcmVuY2VzCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWZFbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlFT2JqZWN0IHNlbGVjdGFibGVSZWYgPSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKHJlZkVsZW1lbnQpOwotCQkJCWlmIChzZWxlY3RhYmxlUmVmICE9IG51bGwpIHsKLQkJCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZSgKLQkJCQkJCQlzZWxlY3RhYmxlUmVmLCB0cnVlKTsKLQotCQkJCQlpZiAoZWxlbWVudCA9PSBzZWxlY3RhYmxlRWxlbWVudAotCQkJCQkJCSYmIHJlZkVsZW1lbnQgPT0gc2VsZWN0YWJsZVJlZikgewotCQkJCQkJLy8gTm8gbmVlZCB0byBhZGQgdGhpcy4KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFwa2dSZWYuaGFzUmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpKSB7Ci0JCQkJCQlHZW5lcmFsUmVmZXJlbmNlIHJlZiA9IG5ldyBHZW5lcmFsUmVmZXJlbmNlKGVsZW1lbnQsCi0JCQkJCQkJCXJlZkVsZW1lbnQpOwotCQkJCQkJcGtnUmVmLmFkZFJlZmVyZW5jZShyZWYpOwotCQkJCQl9Ci0KLQkJCQkJZ2V0RGVwZW5kZW5jeShzZWxlY3RhYmxlUmVmLCB0cnVlKS5hZGREZXBlbmRlbnQoCi0JCQkJCQkJc2VsZWN0YWJsZUVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotKi8KLQkJTGlzdCBwcm9wZXJ0aWVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQlpZiAoIShmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUVSZWZlcmVuY2UgZmVhdHVyZSA9IChFUmVmZXJlbmNlKWY7Ci0JCQlpZiAoIGZlYXR1cmUuaXNDb250YWluZXIoKSB8fCBmZWF0dXJlLmlzQ29udGFpbm1lbnQoKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQkJCQotCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKCB2YWx1ZSA9PSBudWxsICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQgPSBudWxsOwotCQkJTGlzdCB2YWx1ZXMgPSBudWxsOwotCQkJaW50IGNvdW50ID0gMDsKLQkJCQotCQkJaWYgKCBmZWF0dXJlLmlzTWFueSgpICkgewotCQkJCXZhbHVlcyA9IChMaXN0KXZhbHVlOwotCQkJCWlmICggdmFsdWVzLnNpemUoKSA+IDAgKSB7Ci0JCQkJCXJlZkVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl2YWx1ZXMuZ2V0KGNvdW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkJcmVmRWxlbWVudCA9IChNZXRob2RFbGVtZW50KXZhbHVlOwkJCQkKLQkJCX0KLQkJCSAKLQkJCXdoaWxlICggcmVmRWxlbWVudCAhPSBudWxsICkgewotCQkJCQotCQkJCWJvb2xlYW4gc2tpcCA9IGZhbHNlOwotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfTW9kaWZpZXMoKSkgewotCQkJCQlza2lwID0gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJCQotCQkJCU1ldGhvZEVsZW1lbnQgc2VsZWN0YWJsZVJlZiA9IHNraXAgPyBudWxsIDogKE1ldGhvZEVsZW1lbnQpTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShyZWZFbGVtZW50KTsKLQkJCQlpZiAoc2VsZWN0YWJsZVJlZiAhPSBudWxsKSB7Ci0JCQkJCVBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2UoCi0JCQkJCQkJc2VsZWN0YWJsZVJlZiwgdHJ1ZSk7Ci0JCi0JCQkJCWlmIChlbGVtZW50ID09IHNlbGVjdGFibGVFbGVtZW50Ci0JCQkJCQkJJiYgcmVmRWxlbWVudCA9PSBzZWxlY3RhYmxlUmVmKSB7Ci0JCQkJCQkvLyBObyBuZWVkIHRvIGFkZCB0aGlzLgotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkKLQkJCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSBwa2dSZWYuZ2V0UmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpOwotCQkJCQlpZiAocmVmID09IG51bGwpIHsKLQkJCQkJCXJlZiA9IG5ldyBFbGVtZW50UmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpOwotCQkJCQkJcGtnUmVmLmFkZFJlZmVyZW5jZShyZWYpOwotCQkJCQl9Ci0JCi0JCQkJCXJlZi5hZGRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCQkKLQkJCQkJZ2V0RGVwZW5kZW5jeShzZWxlY3RhYmxlUmVmLCB0cnVlKS5hZGREZXBlbmRlbnQoCi0JCQkJCQkJc2VsZWN0YWJsZUVsZW1lbnQpOwotCQkJCX0KLQkJCQkKLQkJCQlyZWZFbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoIHZhbHVlcyAhPSBudWxsICkgewotCQkJCQljb3VudCsrOwotCQkJCQlpZiAoIGNvdW50IDwgdmFsdWVzLnNpemUoKSApIHsKLQkJCQkJCXJlZkVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl2YWx1ZXMuZ2V0KGNvdW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJCi0JCXJldHVybiBkZXBlbmRlbmN5OwotCX0KLQotCXByaXZhdGUgUGFja2FnZURlcGVuZGVuY3kgZ2V0RGVwZW5kZW5jeShNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmICghTGlicmFyeVV0aWwuc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkVycm9yLCBTZWxlY3RhYmxlIGVsZW1lbnQgcmVxdWlyZWQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gKFBhY2thZ2VEZXBlbmRlbmN5KSBkZXBlbmRlbmN5TWFwCi0JCQkJLmdldChlbGVtZW50KTsKLQkJaWYgKGRlcGVuZGVuY3kgPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCWRlcGVuZGVuY3kgPSBuZXcgUGFja2FnZURlcGVuZGVuY3koZWxlbWVudCk7Ci0JCQlkZXBlbmRlbmN5TWFwLnB1dChlbGVtZW50LCBkZXBlbmRlbmN5KTsKLQkJfQotCi0JCXJldHVybiBkZXBlbmRlbmN5OwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZWRFbGVtZW50KENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjaGFuZ2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZW1vdmVSZWZlcmVuY2UoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZWxlbWVudCByZWZlcmVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgcmVidWlsZCBsYXRlcgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBudWxsOwotCi0JCU1ldGhvZEVsZW1lbnQgcGtnID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0JCWlmICgocGtnID09IG51bGwpIHx8ICgoZGVwZW5kZW5jeSA9IGdldERlcGVuZGVuY3kocGtnLCBmYWxzZSkpID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlkZXBlbmRlbmN5LnJlbW92ZVJlZmVyZW5jZShlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0MmFmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnREZXBlbmRlbmN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogSG9sZHMgdGhlIGEgbGlzdCBvZiBwYWNrYWdlIHJlZmVyZW5jZXMgb2Ygb25lIHBhY2thZ2UgZWxlbWVudCBpdCBhbHNvIGhvbGRzIGEKLSAqIGxpc3Qgb2YgZGVwZW5kYW50IHBhY2thZ2UgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREZXBlbmRlbmN5IHsKLQotCS8vIHRoZSBwYWNrYWdlIGVsZW1lbnQKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogbGlzdCBvZiBFbGVtZW50UmVmZXJlbmNlIG9iamVjdHMsIGVhY2ggRWxlbWVudFJlZmVyZW5jZSBvYmplY3QgaG9sZHMgYQotCSAqIGxpc3Qgb2YgcmVmZXJlbmNlcyBvZiB0aGUgc2FtZSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIExpc3QgcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIGRlcGVuZGVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBkZXBlbmRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIEVsZW1lbnREZXBlbmRlbmN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBlbGVtZW50cyB0aGlzIGVsZW1lbnQgZGVwZW5kcyBvbgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgRWxlbWVudFJlZmVyZW5jZSBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBFbGVtZW50UmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIHJlZkVsZW1lbnQgdGhhdCB0aGUgY3VycmVudAotCSAqIGVsZW1lbnQgcmVjZXJlbmNlcyB0by4KLQkgKiAKLQkgKiBAcGFyYW0gUmVmRWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIGN1cnJlbnQgZWxlbWVudCByZWZlcmVuY2VzCi0JICogQHJldHVybiBFbGVtZW50UmVmZXJlbmNlCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlFbGVtZW50UmVmZXJlbmNlIHJlZjsKLQkJT2JqZWN0IHJlZkVsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlyZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJcmVmRWwgPSByZWYuZ2V0UmVmRWxlbWVudCgpOwotCQkJaWYgKHJlZkVsICE9IG51bGwgJiYgcmVmRWwgPT0gcmVmRWxlbWVudCkgewotCQkJCXJldHVybiByZWY7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBkZXBlbmQgb24gdGhpcyBlbGVtZW50Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RGVwZW5kZW50cygpIHsKLQkJcmV0dXJuIGRlcGVuZGVudHM7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgZGVwZW5kZW50Ci0JICogQHBhcmFtIGVsIE9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERlcGVuZGVudChNZXRob2RFbGVtZW50IGVsKSB7Ci0JCWlmICghZGVwZW5kZW50cy5jb250YWlucyhlbCkpIHsKLQkJCWRlcGVuZGVudHMuYWRkKGVsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZCBhIHJlZmVyZW5jZQotCSAqIEBwYXJhbSByZWYgRWxlbWVudFJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlyZWZlcmVuY2VzLmFkZChyZWYpOwotCX0KLQotCS8qKgotCSAqIHByaW50IG91dCB0aGUgcmVmZXJlbmNlcy4gVGhpcyBpcyBhIGRlYnVnZ2luZyBtZXRob2QuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHJlZiA9IGl0Lm5leHQoKTsKLQkJCWlmIChyZWYgaW5zdGFuY2VvZiBQYWNrYWdlUmVmZXJlbmNlKSB7Ci0JCQkJKChQYWNrYWdlUmVmZXJlbmNlKSByZWYpLnByaW50KCk7Ci0JCQl9IGVsc2UgewotCQkJCSgoRWxlbWVudFJlZmVyZW5jZSkgcmVmKS5wcmludCgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnREZXBlbmRlbmN5RXJyb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3lFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU0ZmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3lFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyB0aGUgZWxlbWVudCBkZXBlbmRlbmN5IGVycm9yIGluIGEgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlcGVuZGVuY3lFcnJvciB7Ci0KLQkvLyB0aGUgZXJyb3IgZWxlbWVudCwgY291bGQgYmUgYSBNZXRob2RQYWNrYWdlIG9yIGEgVUkgcGFja2FnZQotCXByaXZhdGUgT2JqZWN0IGVycm9yRWxlbWVudDsKLQotCS8qKgotCSAqIG1hcCBvZiBjYXVzZWVsZW1lbnQgdG8gdGhlIEVycm9ySW5mbyBvYmplY3QKLQkgKi8KLQlwcml2YXRlIE1hcDxPYmplY3QsIFBhY2thZ2VFcnJvcj4gZXJyb3JJbmZvTWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBQYWNrYWdlRXJyb3I+KCk7Ci0KLQlwcml2YXRlIGludCBlcnJvckJpdHMgPSAwOwotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVwZW5kZW5jeUVycm9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRoaXMuZXJyb3JFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZXJyb3IKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RXJyb3JFbGVtZW50KCkgewotCQlyZXR1cm4gZXJyb3JFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudHMgdGhhdCBjYXVzZWQgdGhlIGVycm9yCi0JICogQHJldHVybiBPYmplY3RbXQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDYXVzZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gZXJyb3JJbmZvTWFwLmtleVNldCgpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNvdW50IG9mIHRoZSBlcnJvciBpbmZvIGVudHJ5Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBlcnJvckluZm9NYXAuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhbiBlcnJvciBlbnRyeQotCSAqIEBwYXJhbSBlcnJvckluZm8gUGFja2FnZUVycm9yCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoUGFja2FnZUVycm9yIGVycm9ySW5mbykgewotCQllcnJvckluZm9NYXAucHV0KGVycm9ySW5mby5nZXRDYXVzZUVsZW1lbnQoKSwgZXJyb3JJbmZvKTsKLQkJZXJyb3JCaXRzIHw9IGVycm9ySW5mby5nZXRFcnJvckxldmVsKCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIHRoZSBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIGNhdXNlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYXVzZUVsZW1lbnQKLQkgKiAgICAgICAgICAgIE9iamVjdCB0aGUgZWxlbWVudCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUVycm9yIHJlbW92ZUVycm9yKE9iamVjdCBjYXVzZUVsZW1lbnQpIHsKLQkJUGFja2FnZUVycm9yIGVycm9yID0gZXJyb3JJbmZvTWFwLnJlbW92ZShjYXVzZUVsZW1lbnQpOwotCi0JCS8vIHJlY2FsY3VsYXRlIHRoZSBlcnJvciBiaXRzCi0JCWNhbGN1bGF0ZUVycm9yQml0cygpOwotCQkKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZSB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYXVzZUVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY2F1c2VFbGVtZW50Ci0JICogICAgICAgICAgICBPYmplY3QgdGhlIGVsZW1lbnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yCi0JICovCi0JcHVibGljIFBhY2thZ2VFcnJvciBnZXRFcnJvcihPYmplY3QgY2F1c2VFbGVtZW50KSB7Ci0JCXJldHVybiBlcnJvckluZm9NYXAuZ2V0KGNhdXNlRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBhbGwgRXJySW5mbyBvYmplY3RzCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBFcnJvckluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0PFBhY2thZ2VFcnJvcj4gZ2V0QWxsKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxQYWNrYWdlRXJyb3I+KGVycm9ySW5mb01hcC52YWx1ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgdGhpcyBpcyBhbiBlcnJvciBvciBub3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBFcnJvckluZm8uRVJST1IpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGlzIGlzIGEgd2FybmluZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBFcnJvckluZm8uV0FSTklORykgPiAwOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgZHVlIHRvIGFuIGVycm9yIGluIGl0J3MgY2hpbGRyZW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkRXJyb3IoKSB7Ci0JCXJldHVybiAoZXJyb3JCaXRzICYgUGFja2FnZUVycm9yLkNISUxEX0VSUk9SKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhpcyBpcyBkdWUgdG8gYSB3YXJuaW5nIGluIGl0J3MgY2hpbGRyZW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBQYWNrYWdlRXJyb3IuQ0hJTERfV0FSTklORykgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGNhbGN1bGF0ZUVycm9yQml0cygpIHsKLQkJZXJyb3JCaXRzID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVycm9ySW5mb01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQllcnJvckJpdHMgfD0gKChFcnJvckluZm8pIGl0Lm5leHQoKSkuZ2V0RXJyb3JMZXZlbCgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RXJyb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudEVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzcxODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaWRlbnRpZmllcyBhIGNvbmZpZ3VyYXRpb24gZXJyb3IgYmV0d2VlbiB0d28gZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBqeGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RXJyb3IgIGV4dGVuZHMgRXJyb3JJbmZvIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25FcnJvciB7Ci0KLQkvLyBuZWVkIHRoZSBjb25maWcgaWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gZXJyb3IKLQlTdHJpbmcgY29uZmlnSWQ7Ci0JCi0JcHVibGljIEVsZW1lbnRFcnJvcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgIAotCQkJaW50IGVycm9yTGV2ZWwsIFN0cmluZyBtZXNzYWdlLCAKLQkJCU9iamVjdCBvd25lckVsZW1lbnQsIE9iamVjdCBjYXVzZUVsZW1lbnQsIAotCQkJaW50IHJlbGF0aW9uLCBTdHJpbmcgbWVzc2FnZUlkKSB7Ci0JCXN1cGVyKGVycm9yTGV2ZWwsIG1lc3NhZ2UsIG93bmVyRWxlbWVudCwgY2F1c2VFbGVtZW50LCByZWxhdGlvbiwgbWVzc2FnZUlkKTsKLQkJdGhpcy5jb25maWdJZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JfQotCi0JCi0JLy8gbWV0aG9kcyBmb3IgdGhlIElDb25maWd1cmF0aW9uRXJyb3IKLQkvLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldENhdXNlTWV0aG9kRWxlbWVudCgpIHsKLQkJaWYgKCB0aGlzLmNhdXNlRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCl0aGlzLmNhdXNlRWxlbWVudDsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgewotCQlpZiAoIHRoaXMub3duZXJFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCl0aGlzLm93bmVyRWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlNZXRob2RFbGVtZW50IG0xID0gZ2V0RXJyb3JNZXRob2RFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgbTIgPSBnZXRDYXVzZU1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKCBtMSAhPSBudWxsICYmIG0yICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gY29uZmlnSWQgKyAiLCIgKyBtMS5nZXRHdWlkKCkgKyAiLCIgKyBtMi5nZXRHdWlkKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCQotCQlyZXR1cm4gSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXN3aXRjaCAoZ2V0RXJyb3JMZXZlbCgpICkgewotCQljYXNlIEVycm9ySW5mby5FUlJPUjoKLQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOwotCQljYXNlIEVycm9ySW5mby5XQVJOSU5HOiAKLQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCX0KLQkJCi0JCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnRSZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjJlN2YyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhbiBFbGVtZW50IFJlZmVyZW5jZSBiZXR3ZWVuIHR3byBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2UgewotCi0JTWV0aG9kRWxlbWVudCBlbGVtZW50LCByZWZFbGVtZW50OwotCQotCS8vIHNhdmUgdGhlIGZlYXR1cmVzIHJlbGF0aW5nIHRvIHRoaXMgcmVmZXJlbmNlCi0JcHJpdmF0ZSBTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkKLQotCS8qKgotCSAqIGNvbnN0cnVjdCB0aGUgcmVmZXJlbmNlIGluc3RhbmNlCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIHJlZmVyZW5jZWQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucmVmRWxlbWVudCA9IHJlZkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlZmVyZW5jZWQgZWxlbWVudAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0UmVmRWxlbWVudCgpIHsKLQkJcmV0dXJuIHJlZkVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoICFmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSApIHsKLQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKTsKLQl9Ci0JCi0JLyoqCi0JICogZGVidWdnaW5nIG1ldGhvZCB0byBwcmludCBvdXQgdGhlIHJlbGF0aW9uc2hpcAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoKSB7Ci0JCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiICAgICIgKyBMaWJyYXJ5VXRpbC5nZXROYW1lKGVsZW1lbnQpICsgIiAtLT4gIiArIExpYnJhcnlVdGlsLmdldE5hbWUocmVmRWxlbWVudCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgcmVmZXJlbmNlIGNhbiBiZSBpZ25vcmVkCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSWdub3JlKCkgewotCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgbm8gY29udGFpbmVyLCBpdCdzIGEgZGVsZXRlZCBlbGVtZW50LCBpZ25vcmUgaXQKLQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkmJiAoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKSA9PSBudWxsCi0JCQkJfHwgKHJlZkVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCSYmICgoRU9iamVjdCkgcmVmRWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gRG9uJ3Qgd2FybiBvbiBvcHRpb25hbCBpbnB1dHMgbm90IGJlaW5nIHByZXNlbnQKLQkJLy8gc28gYWRkZWQgdGhlIGNhbklnbm9yZSgpIG1ldGhvZAotCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSAmJiAocmVmRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJLy8gaWYgaXQncyBhIG1hbmRhdG9yeSBpbnB1dCwgY2FuIGlnbm9yZQotCQkJaWYgKCgoVGFzaykgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKS5jb250YWlucyhyZWZFbGVtZW50KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gbm90IG1hbmRhdG9yeSwgYnV0IG9wdGlvbmFsLCBvaywgaWdub3JlIGl0Ci0JCQlpZiAoKChUYXNrKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkuY29udGFpbnMocmVmRWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJvbGUncyBtb2RpZmllcyBmZWF0dXJlIGlzIGFjdHVhbGx5IGEgZGVyZWl2ZWQgb3Bwb3NpdGUgZmVhdHVyZSwKLQkJLy8gaXQncyB2YWx1ZSBjYW4gYmUgYW4gZWxlbWVudCBub3QgdmlzaWJsZSB0byB0aGlzIHBsdWdpbgotCQkvLyBpZ25vcmUgaXQKLQkJLy8gSW52YWxpZCBjb25maWd1cmF0aW9uIGRlcGVuZGVuY3kgZXJyb3IgcmVwb3J0ZWQKLQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgUm9sZSkgJiYgKHJlZkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCVJvbGUgciA9IChSb2xlKSBlbGVtZW50OwotCQkJaWYgKHIuZ2V0TW9kaWZpZXMoKS5jb250YWlucyhyZWZFbGVtZW50KQotCQkJCQkmJiAhci5nZXRSZXNwb25zaWJsZUZvcigpLmNvbnRhaW5zKHJlZkVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRTaW5nbGVGZWF0dXJlKCkgewotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCAmJiBmZWF0dXJlcy5zaXplKCkgPT0gMSkgewotCQkJZm9yIChFU3RydWN0dXJhbEZlYXR1cmUgZjogZmVhdHVyZXMpIHsKLQkJCQlyZXR1cm4gZjsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRXJyb3JJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0Vycm9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjI5NjI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRXJyb3JJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi0KLS8qKgotICogQW4gRXJyb3JJbmZvIG9iamVjdCBob2xkcyB0aGUgZXJyb3IgbWVzc2FnZSBpbmZvIGNhdXNlZCBieSBhbiBlbGVtZW50LiBUaGUKLSAqIEVycm9ySW5mbyBvYmplY3QgaXMgb3duZWQgYnkgdGhlIG93bmVyIGVsZW1lbnQgd2hpY2ggaGFzIHRoaXMgZXJyb3IKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVycm9ySW5mbyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hJTERfRVJST1IgPSA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hJTERfV0FSTklORyA9IDE2OwotCi0JLyoqCi0JICogdGhpcyBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgb3duZXIgZWxlbWVudCBhbmQgdGhlIGNhdXNlIGVsZW1lbnQuIAotCSAqIFRoZSBvd25lciBlbGVtZW50IHJlZmVyZW5jZXMgdG8gdGhlIHRoZSBjYXVzZSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVGRVJFTkNFX1RPID0gMTY7Ci0KLQkvKioKLQkgKiB0aGlzIGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4gCi0JICogVGhlIG93bmVyIGVsZW1lbnQgaXMgcmVmZXJlbmNlZCBieSB0aGUgdGhlIGNhdXNlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZFUkVOQ0VEX0JZID0gMzI7Ci0KLQkvLyBlcnJvciBjYXRlZ29yeQotCXByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnk7Ci0JCi0JcHJvdGVjdGVkIGludCBlcnJvckxldmVsOwotCi0JcHJvdGVjdGVkIE9iamVjdCBvd25lckVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNhdXNlRWxlbWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0JcHJvdGVjdGVkIGludCByZWxhdGlvbiA9IDA7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUlkOwotCi0JLy9wcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JMZXZlbCBpbnQgdGhlIGVycm9yIGxldmVsCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIG93bmVyRWxlbWVudCBPYmplY3QsIHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGlzIGVycm9yCi0JICogQHBhcmFtIGNhdXNlRWxlbWVudCBPYmplY3QsIHRoZSBlbGVtZW50IHRoYXQgY2F1c2VkIHRoaXMgZXJyb3IKLQkgKiBAcGFyYW0gcmVsYXRpb24gaW50IHRoZSByZWxhdGhpb3NoaXAgYmV0d2VlbiB0aGUgb3duZXIgZWxlbWVudCBhbmQgdGhlIGNhdXNlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIEVycm9ySW5mbyhpbnQgZXJyb3JMZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvd25lckVsZW1lbnQsCi0JCQlPYmplY3QgY2F1c2VFbGVtZW50LCBpbnQgcmVsYXRpb24sIFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJLy90aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotCQl0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDsKLQkJdGhpcy5jYXVzZUVsZW1lbnQgPSBjYXVzZUVsZW1lbnQ7Ci0JCXRoaXMuZXJyb3JMZXZlbCA9IGVycm9yTGV2ZWw7Ci0JCXRoaXMuZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy5yZWxhdGlvbiA9IHJlbGF0aW9uOwotCQl0aGlzLm1lc3NhZ2VJZCA9IG1lc3NhZ2VJZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVsYXRpb24oKSB7Ci0JCXJldHVybiByZWxhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3duZXJFbGVtZW50KCkgewotCQlyZXR1cm4gb3duZXJFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRDYXVzZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBjYXVzZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JMZXZlbCgpIHsKLQkJcmV0dXJuIGVycm9yTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvckxldmVsICYgRVJST1IpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7Ci0JCXJldHVybiAoZXJyb3JMZXZlbCAmIFdBUk5JTkcpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVycm9yIGNhdGVnb3J5Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoKSB7Ci0JCXJldHVybiBtZXNzYWdlSWQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9JQ29uZmlndXJhdGlvbkVycm9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0lDb25maWd1cmF0aW9uRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1MDY2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0lDb25maWd1cmF0aW9uRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIENvbmZpZ3VyYXRpb24gZXJyb3JzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uRXJyb3IgewotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgZXJyb3IgaXMgYSB3YXJuaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmZiBlcnJvciBpcyBhbiBlcnJvcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXJyb3IoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBNZXRob2RFbGVtZW50IGNvbnRhaW5pbmcgdGhlIGVycm9yLCBpZSwgdGhlIGVsZW1lbnQgcmVmZXJyaW5nIHRvIHNvbWV0aGluZyB0aGF0IGlzIG1pc3NpbmcKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFcnJvck1ldGhvZEVsZW1lbnQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBNZXRob2RFbGVtZW50IGNhdXNpbmcgdGhlIGVycm9yLCBpZSwgdGhlIGVsZW1lbnQgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgdG8gZml4IHRoZSBlcnJvcgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldENhdXNlTWV0aG9kRWxlbWVudCgpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYSB1bmlxdWUgSUQgZm9yIHRoaXMgZXJyb3IKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvbmUgb2YgSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBtZXNzYWdlIHN0cmluZyBmb3IgdGhpcyBlcnJvcgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIGVycm9yIGNhdGVnb3J5Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlcnJvciBtZXNzYWdlIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VEZXBlbmRlbmN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VEZXBlbmRlbmN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzU3NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlRGVwZW5kZW5jeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIEhvbGRzIHRoZSBhIGxpc3Qgb2YgcGFja2FnZSByZWZlcmVuY2VzIG9mIG9uZSBwYWNrYWdlIGVsZW1lbnQgaXQgYWxzbyBob2xkcyBhCi0gKiBsaXN0IG9mIGRlcGVuZGFudCBwYWNrYWdlIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZURlcGVuZGVuY3kgZXh0ZW5kcyBFbGVtZW50RGVwZW5kZW5jeSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYSBwYWNrYWdlIGRlcGVuZGVuY3kgZm9yIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZURlcGVuZGVuY3koTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgbG9hZGVkIGZsYWcKLQkgKiBAcGFyYW0gbG9hZGVkIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkZWQoYm9vbGVhbiBsb2FkZWQpIHsKLQkJdGhpcy5sb2FkZWQgPSBsb2FkZWQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgaXMgbG9hZGVkIG9yIG5vdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9hZGVkKCkgewotCQlyZXR1cm4gdGhpcy5sb2FkZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWZlcmVuY2UgZm9yIGFuIGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBPYmplY3QKLQkgKiBAcGFyYW0gY3JlYXRlIGJvb2xlYW4gaWYgdHJ1ZSBjcmVhdGUgaWYgbm90IGV4aXN0LgotCSAqIEByZXR1cm4gUGFja2FnZVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBQYWNrYWdlUmVmZXJlbmNlIGdldFJlZmVyZW5jZShNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCVBhY2thZ2VSZWZlcmVuY2UgcmVmID0gKFBhY2thZ2VSZWZlcmVuY2UpIHN1cGVyCi0JCQkJLmdldFJlZmVyZW5jZShyZWZFbGVtZW50KTsKLQkJaWYgKHJlZiA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJcmVmID0gbmV3IFBhY2thZ2VSZWZlcmVuY2UoZWxlbWVudCwgcmVmRWxlbWVudCk7Ci0JCQlzdXBlci5hZGRSZWZlcmVuY2UocmVmKTsKLQkJfQotCi0JCXJldHVybiByZWY7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UGFja2FnZVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZWZlcmVuY2VzKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldEFsbEVsZW1lbnRSZWZlcmVuY2VzKCkgewotCQlMaXN0IGFsbFJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGdldFBhY2thZ2VSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmID0gKFBhY2thZ2VSZWZlcmVuY2UpaXQubmV4dCgpOwotCQkJYWxsUmVmcy5hZGRBbGwocGtnUmVmLmdldFJlZmVyZW5jZXMoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBhbGxSZWZzOwotCX0KLQkKLQkvKioKLQkgKiByZW1vdmUgYWxsIHJlZmVyZW5jZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQgT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50KSB7Ci0JCVBhY2thZ2VSZWZlcmVuY2UgcmVmOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3VwZXIuZ2V0UmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXJlZiA9IChQYWNrYWdlUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQlyZWYucmVtb3ZlUmVmZXJlbmNlKG93bmVyRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkZWJ1ZyBtZXRob2QgdG8gcHJpbnQgb3V0IHRoZSByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoKSB7Ci0JCXN1cGVyLnByaW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VFcnJvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhYjVjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpZGVudGlmaWVzIGEgY29uZmlndXJhdGlvbiBlcnJvciBiZXR3ZWVuIHR3byBwYWNrYWdlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VFcnJvciBleHRlbmRzIEVycm9ySW5mbyB7Ci0KLQlMaXN0PEVsZW1lbnRFcnJvcj4gZWxlbWVudEVycm9zID0gbnVsbDsKLQkKLQlwdWJsaWMgUGFja2FnZUVycm9yKGludCBlcnJvckxldmVsLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG93bmVyRWxlbWVudCwgCi0JCQlPYmplY3QgY2F1c2VFbGVtZW50LCBpbnQgcmVsYXRpb24pIHsKLQkJc3VwZXIoZXJyb3JMZXZlbCwgbWVzc2FnZSwgb3duZXJFbGVtZW50LCBjYXVzZUVsZW1lbnQsIHJlbGF0aW9uLCBudWxsKTsKLQkJCi0JCS8vY2hlY2tFbGVtZW50RXJyb3JzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVycm9yTGV2ZWwoaW50IGxldmVsKSB7Ci0JCWVycm9yTGV2ZWwgfD0gbGV2ZWw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0VsZW1lbnRFcnJvcigpIHsKLQkJcmV0dXJuIGVsZW1lbnRFcnJvcyAhPSBudWxsICYmIGVsZW1lbnRFcnJvcy5zaXplKCkgPiAwOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkRXJyb3IoKSB7Ci0JCXJldHVybiAoZXJyb3JMZXZlbCAmIENISUxEX0VSUk9SKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZFdhcm5pbmcoKSB7Ci0JCXJldHVybiAoZXJyb3JMZXZlbCAmIENISUxEX1dBUk5JTkcpID4gMDsKLQl9Ci0JCi0vLwkvKioKLS8vCSAqIGdldCBhIGxpc3QgZWxlbWVudCBlcnJvcnMgd2l0aGluIHRoaXMgUGFja2FnZUVycm9yCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBMaXN0PEVsZW1lbnRFcnJvcj4gZ2V0RWxlbWVudEVycm9yTGlzdCgpIHsKLS8vCQkKLS8vCQlyZXR1cm4gdGhpcy5lbGVtZW50RXJyb3M7Ci0vLwl9Ci0JCi0vLwotLy8JcHJpdmF0ZSB2b2lkIGNoZWNrRWxlbWVudEVycm9ycygpIHsKLS8vCQlpZiAoIGlzQ2hpbGRFcnJvcigpIHx8IGlzQ2hpbGRXYXJuaW5nKCkgKSB7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwkJCi0vLwkJdGhpcy5lbGVtZW50RXJyb3MgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnRFcnJvcj4oKTsKLS8vCi0vLwkJaW50IHJlbGF0aW9uID0gdGhpcy5nZXRSZWxhdGlvbigpOwotLy8JCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHRoaXMuZ2V0T3duZXJFbGVtZW50KCk7Ci0vLwkJTWV0aG9kRWxlbWVudCBjYXVzZUVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdGhpcy5nZXRDYXVzZUVsZW1lbnQoKTsKLS8vCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXA7Ci0vLwkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBudWxsOwotLy8KLS8vCQlpZiAocmVsYXRpb24gPT0gRXJyb3JJbmZvLlJFRkVSRU5DRV9UTykgewotLy8JCQlkZXAgPSBjbG9zdXJlLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKQotLy8JCQkJCS5nZXREZXBlbmRlbmN5KG93bmVyRWxlbWVudCk7Ci0vLwkJCXBrZ1JlZiA9IGRlcC5nZXRSZWZlcmVuY2UoY2F1c2VFbGVtZW50LCBmYWxzZSk7Ci0vLwkJfSBlbHNlIGlmIChyZWxhdGlvbiA9PSBFcnJvckluZm8uUkVGRVJFTkNFRF9CWSkgewotLy8JCQlkZXAgPSBjbG9zdXJlLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKQotLy8JCQkJCS5nZXREZXBlbmRlbmN5KGNhdXNlRWxlbWVudCk7Ci0vLwkJCXBrZ1JlZiA9IGRlcC5nZXRSZWZlcmVuY2Uob3duZXJFbGVtZW50LCBmYWxzZSk7Ci0vLwkJfQotLy8KLS8vCQlpZiAocGtnUmVmICE9IG51bGwpIHsKLS8vCQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ1JlZi5nZXRSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXQKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotLy8KLS8vCQkJCS8vIERvbid0IHNob3cgdGhlIGVudHJ5IGlmIHRoZSByZWZlcmVuY2UgY2FuIGJlIGlnbm9yZWQuCi0vLwkJCQlpZiAocmVmLmNhbklnbm9yZSgpKSB7Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0vLwkJCQlFbGVtZW50RXJyb3IgZWxlbWVudEVycm9yOwotLy8JCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgZTEsIGUyOwotLy8KLS8vCQkJCWlmIChyZWxhdGlvbiA9PSBFcnJvckluZm8uUkVGRVJFTkNFX1RPKSB7Ci0vLwkJCQkJZTEgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0RWxlbWVudCgpOwotLy8JCQkJCWUyID0gKE1ldGhvZEVsZW1lbnQpcmVmLmdldFJlZkVsZW1lbnQoKTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJZTIgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0RWxlbWVudCgpOwotLy8JCQkJCWUxID0gKE1ldGhvZEVsZW1lbnQpcmVmLmdldFJlZkVsZW1lbnQoKTsKLS8vCQkJCX0KLS8vCi0vLwkJCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBzdWJ0cmFjdGVkLCBkb24ndCBpbmNsdWRlIHRoZSByZWZlcmVuY2UKLS8vCQkJCWlmICggY2xvc3VyZS5pc0VsZW1lbnRTdWJ0cmFjdGVkKGUxKSApIHsKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCX0KLS8vCQkJCQotLy8JCQkJbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnRfbWVzc2FnZSwgCi0vLwkJCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGUxKSwgCi0vLwkJCQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZTIpIH0pKTsKLS8vCQkJCQotLy8JCQkJZWxlbWVudEVycm9yID0gbmV3IEVsZW1lbnRFcnJvcigKLS8vCQkJCQkJdGhpcy5jbG9zdXJlLCB0aGlzLmdldEVycm9yTGV2ZWwoKSwKLS8vCQkJCQkJbWVzc2FnZSwgZTEsIGUyLCByZWxhdGlvbik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQl0aGlzLmVsZW1lbnRFcnJvcy5hZGQoZWxlbWVudEVycm9yKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZVJlZmVyZW5jZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGVmMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEEgcGFja2FnZSByZWZlcmVuY2UgaG9sZHMgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY3VycmVudCBwYWNrYWdlIGVsZW1lbnQgdG8KLSAqIGFub3RoZXIgcGFja2FnZSBlbGVtZW50LiBJZiBvbmUgZWxlbWVudCBpbiB0aGUgcGFja2FnZSByZWZlcmVuY2VzIHRvIGFub3RoZXIKLSAqIGVsZW1lbnQgaW4gYW5vdGhlciBwYWNrYWdlLCB0aGUgdGhpcyBwYWNrYWdlIHJlZmVyZWNlcyB0byB0aGF0IHBhY2thZ2UuCi0gKiBVbmxpa2UgZWxlbWVudCByZWZlcmVuY2VzLCBQYWNrYWdlUmVmZXJlbmNlIGhvbGQgYSBvbmUgdG8gb25lIHJlbGF0aW9uc2hpcAotICogYmV0d2VlbiB0d28gcGFja2FnZXMgVGhlIFBhY2thZ2VyZWZlcmVuY2Ugb2JqZWN0IGFsc28gaG9sZCBhIGxpc3Qgb2YKLSAqIEVsZW1lbnRSZWZlcmVuY2VzIGZvciBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZXMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VSZWZlcmVuY2UgZXh0ZW5kcyBFbGVtZW50UmVmZXJlbmNlIHsKLQkKLQkvLyBsaXN0IG9mIGVsZW1lbnQgcmVmZXJlY2VzIGJldHdlZW4gdGhlIHR3byBwYWNrYWdlCi0JcHJpdmF0ZSBMaXN0IHJlZkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgUGFja2FnZVJlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50LCByZWZFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBuZXcgZWxlbWVudCByZWZlcmVuY2UgaWYgdGhlIHJlZmVyZW5jZSBpcyBub3Qgc2V0LiBjYWxsCi0JICogaGFzUmVmZXJlbmNlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgcmVmRWxlbWVudCkgYmVmb3JlIGNhbGxpbmcgdGhpcwotCSAqIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoRWxlbWVudFJlZmVyZW5jZSByZWYpIHsKLQkJcmVmTGlzdC5hZGQocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGVsZW1lbnQgcmVmZXJlbmNlcyBhbW9uZyB0aGlzIHBhY2thZ2UgcmVmZXJlbmNlCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBFbGVtZW50UmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gcmVmTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoaXMgcGFja2FnZSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50Ci0JICogQHJldHVybiBFbGVtZW50UmVmZXJlbmNlCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgcmVmRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQlpZiAocmVmLmdldEVsZW1lbnQoKSA9PSBlbGVtZW50Ci0JCQkJCSYmIHJlZi5nZXRSZWZFbGVtZW50KCkgPT0gcmVmRWxlbWVudCkgewotCQkJCXJldHVybiByZWY7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIGV4aXN0cyBpbiB0aGlzIHBhY2thZ2UgcmVmZXJlbmNlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpIHsKLQkJCi0JCXJldHVybiBnZXRSZWZlcmVuY2UoZWxlbWVudCwgcmVmRWxlbWVudCkgIT0gbnVsbDsKLQl9Ci0KLS8vCS8qKgotLy8JICogY2hlY2sgaWYgdGhlcmUgaXMgYSByZWZlcmVuY2Ugb2YgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50Ci0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBib29sZWFuIGhhc0Jhc2VSZWZlcmVuY2UoKSB7Ci0vLwkJZm9yIChJdGVyYXRvciBpdCA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0vLwkJCWlmIChyZWYgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnRSZWZlcmVuY2UpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0KLQkvKioKLQkgKiByZW1vdmUgdGhlIHJlZmVyZW5jZSBvd25lcmQgYnkgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIG93bmVyRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCkgewotCQlPYmplY3QgZTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IHJlZkxpc3Quc2l6ZSgpKSB7Ci0JCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSByZWZMaXN0LmdldChpKTsKLQkJCWUgPSByZWYuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgIT0gbnVsbCAmJiBlID09IG93bmVyRWxlbWVudCkgewotCQkJCXJlZkxpc3QucmVtb3ZlKGkpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmludCBvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKExpYnJhcnlVdGlsLmdldE5hbWUoZWxlbWVudCkKLQkJCQkrICIgLS0+ICIgKyBMaWJyYXJ5VXRpbC5nZXROYW1lKHJlZkVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCSgoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpKS5wcmludCgpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIHBhY2thZ2UgcmVmZXJlbmNlIGNhbiBiZSBpZ25vcmVkCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSWdub3JlKCkgewotCQkvLyBpZiB0aGUgcGFja2FnZSBoYXMgbm8gZWxlbWVudCByZWZlcmVuY2Ugb3IgYWxsIGVsZW1lbnQgcmVmZXJlbmNlcyBjYW4KLQkJLy8gYmUgaWdub3JlZCwgcmV0dXJuIHRydWUKLQkJLy8gb3RoZXJ3aXNlLCBmYWxzZQotCQlMaXN0IHJlZnMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKTsKLQotCQlpZiAocmVmcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXJlZi5jYW5JZ25vcmUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzM2ZlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBlbGVtZW50IHJlYWxpemF0aW9uIHN1cHBvcnQgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL0lMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWY3OWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIHsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0xPQURFRCA9IDB4MTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX1NBVkVEID0gMHgyOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fQ1JFQVRFRCA9IDB4NDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9DSEFOR0VEID0gMHg4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0RFTEVURUQgPSAweDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX05FV0NISUxEID0gMHgyMDsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0NPTkZJR1VSQVRJT05fU0VMRUNURUQgPSAweDQwOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fTElCUkFSWV9DTE9TRUQgPSAweDgwOwotCi0JLyoqCi0JICogbm90aWZ5IHRoZSBsaXN0ZW5lciBvZiB0aGUgbGlicmFyeSBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb24KLQkgKiAgICAgICAgICAgIGludCBvbmUgb2YgdGhlIGNoYW5nZSBvcHRpb25zCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VkIGVsZW1lbnRzIGluIHRoZSBsaWJyYXJ5LCBpZiB0aGUgb3B0aW9uIGlzCi0JICogICAgICAgICAgICBPUFRJT05fQ0hBTkdFRCwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmFjNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgbWV0aG9kIGxpYnJhcnkgZXZlbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9MaWJyYXJ5TWFuYWdlckVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9MaWJyYXJ5TWFuYWdlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhZGIyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvaW50ZXJuYWwvTGlicmFyeU1hbmFnZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTW9kZWxzIGEgImxpYnJhcnlNYW5hZ2VyIiBjb25maWd1cmF0aW9uIGVsZW1lbnQgaW4gdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlNYW5hZ2VyRWxlbWVudCB7Ci0KLQkvLyBUaGUgY29udHJpYnV0aW5nIHBsdWctaW4uCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIGxpYnJhcnkgbWFuYWdlciBjbGFzcyBuYW1lLgotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQotCS8vIFRoZSBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQlwcml2YXRlIFN0cmluZyB0eXBlSWQ7Ci0KLQkvLyBUaGUgbGlicmFyeSB0eXBlIGRpc3BsYXkgbmFtZS4KLQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQkKLQlwcml2YXRlIGludCB2ZXJzaW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogICAgICAgICAgICB0aGUgY29udHJpYnV0aW5nIHBsdWctaW4KLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogICAgICAgICAgICB0aGUgbGlicmFyeSBtYW5hZ2VyIGNsYXNzIG5hbWUKLQkgKiBAcGFyYW0gdHlwZUlkCi0JICogICAgICAgICAgICB0aGUgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHR5cGUgZGlzcGxheSBuYW1lCi0JICovCi0JcHVibGljIExpYnJhcnlNYW5hZ2VyRWxlbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLAotCQkJU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHR5cGVOYW1lLCBpbnQgdmVyc2lvbikgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMudHlwZUlkID0gdHlwZUlkOwotCQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoZSBleHRlbnNpb24gcG9pbnQKLQkgKiAKLQkgKiBAcmV0dXJuIGEgcGx1Zy1pbiBidW5kbGUKLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiY2xhc3MiIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IG1hbmFnZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAidHlwZSIgYXR0cmlidXRlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSB1bmlxdWUgc3RyaW5nIElEIGZvciB0aGUgbGlicmFyeSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKSB7Ci0JCXJldHVybiB0eXBlSWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgInR5cGVOYW1lIiBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGxpYnJhcnkgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFkMGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBleHRlbnNpb24gcG9pbnQgbWFuYWdlbWVudCBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWVmYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFyay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYm9va21hcmsgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBwdWJsaXNoZWQgYm9va21hcmsgZW50cmllcy4gCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29rbWFyayB7Ci0KLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM2NTI1ODI3OTEzMjYzMjM4NjNMOwotCi0JLy8gcG9pbnRzIHRvIHRoZSBkZXNjcmlwdGlvbiBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbQotCXByaXZhdGUgU3RyaW5nIF9maWxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyB1c2VkIGFzICJjbG9zZWQiIG9yICJkZWZhdWx0IiBpY29uCi0JcHJpdmF0ZSBTdHJpbmcgX2Nsb3NlZEljb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHVzZWQgYXMgIm9wZW4iIGljb24KLQlwcml2YXRlIFN0cmluZyBfb3Blbkljb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHByZXNlbnRhdGlvbiBuYW1lIG9mIHRoZSBlbnRyeQotCXByaXZhdGUgU3RyaW5nIF9wcmVzZW50YXRpb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHdoZXRoZXIgbW91c2UgaXMgb3ZlciB0aGUgYm9va21hcmsKLQkvLyB0aGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotCS8vIHByaXZhdGUgYm9vbGVhbiBfaXNNb3VzZU92ZXIgPSBmYWxzZTsKLQotCS8vIHdoZXRoZXIgdGhlIGZpbGUgZXhpc3RzIGluIHRoZSBmaWxlIHN5c3RlbQotCXByaXZhdGUgYm9vbGVhbiBfaXNFeGlzdCA9IHRydWU7Ci0KLQkvLyB3aGV0aGVyIHRoZSBmaWxlIGlzIGZyb20gY29udGVudCBsaWJyYXJ5Ci0JcHJpdmF0ZSBib29sZWFuIF9pc0Zyb21Db250ZW50TGlicmFyeSA9IHRydWU7Ci0KLQkvLyB1bmlxdWUgaWQuCi0JLy8gQSBib29rbWFyayBtYXkgbm90IGhhdmUgYSB1bmlxdWVJRCBpbiB3aGljaCBjYXNlIHRoZQotCS8vIGJvb2ttYXJrIGhhcyBubyByZWxhdGlvbiB0byBhbnkgbGF5b3V0IGVsZW1lbnRzLgotCXByaXZhdGUgU3RyaW5nIF91bmlxdWVJZCA9IG51bGw7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyB2aXNpYmxlCi0JcHJpdmF0ZSBib29sZWFuIF9pc1Zpc2libGUgPSB0cnVlOwotCi0JLy8gd2hldGhlciB0aGUgYm9va21hcmsgaXMgZW5hYmxlZAotCS8vIHRoaXMgaXMgdG8gc3VwcG9ydCBhIHNwZWNpYWwgY2FzZSB3aGVyZSBib29rbWFya3MKLQkvLyBhcmUgdG8gcmVtYWluIGhpZGRlbiBhbmQgY2Fubm90IGJlIHVuaGlkZGVuIGFzCi0JLy8gd2VsbCBhcyB0cmFuc3BhcmVuY3kKLQlwcml2YXRlIGJvb2xlYW4gX2lzRW5hYmxlZCA9IHRydWU7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyB0cmFuc3BhcmVudAotCXByaXZhdGUgYm9vbGVhbiBfaXNUcmFuc3BhcmVudCA9IGZhbHNlOwotCi0JLy8gd2hldGhlciB0aGUgYm9va21hcmsgaXMgYSBkZWZhdWx0IG9uZQotCS8vIGRlZmF1bHQgbWVhbnMgdGhhdCBpdCBpcyBwdWJsaXNoZWQgYW5kIGlzIHJlYWQtb25seQotCXByaXZhdGUgYm9vbGVhbiBfaXNEZWZhdWx0ID0gZmFsc2U7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyB0aGUgY3VycmVudCBvbmUKLQkvLyBjdXJyZW50IG1lYW5zIHRoZSBmaXJzdCBvbmUgdG8gYmUgZm9jdXNlZCBvbgotCXByaXZhdGUgYm9vbGVhbiBfaXNDdXJyZW50ID0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZyBxdWVyeVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBCb29rbWFyayBwYXJlbnQgPSBudWxsOwotCQotCS8vIHRoZSBvd25lciBlbGVtZW50IG9mIHRoZSBub2RlCi0JcHJpdmF0ZSBPYmplY3Qgb3duZXIgPSBudWxsOwotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuIFRha2VzIGluIHRoZSBwcmVzZW50YXRpb24gbmFtZSBvZiB0aGUgcHJvY2VzcyBsYXlvdXQKLQkgKiBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgQm9va21hcmsoU3RyaW5nIG5hbWUpIHsKLQkJX3VuaXF1ZUlkID0gbnVsbDsKLQkJX3ByZXNlbnRhdGlvbk5hbWUgPSBuYW1lOwotCQlpZiAoX3ByZXNlbnRhdGlvbk5hbWUgPT0gbnVsbCkgewotCQkJX3ByZXNlbnRhdGlvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTmFtZSBhbmQgdW5pcXVlSWQgZm9yIGEgbGF5b3V0IG5vZGUuCi0JICovCi0JcHVibGljIEJvb2ttYXJrKFN0cmluZyBwcmVzZW50YXRpb25OYW1lLCBTdHJpbmcgdW5pcXVlSWQpIHsKLQkJdGhpcyhwcmVzZW50YXRpb25OYW1lKTsKLQkJX3VuaXF1ZUlkID0gdW5pcXVlSWQ7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lcihPYmplY3QgZWxlbWVudCkgewotCQl0aGlzLm93bmVyID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHJldHVybiBwcmVzZW50YXRpb24gbmFtZSBhcyB0aGUgdXNlciBvYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyT2JqZWN0KCkgewotCQlyZXR1cm4gKF9wcmVzZW50YXRpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIHVzZXIgb2JqZWN0Ci0JICogQHBhcmFtIHVzZXJPYmplY3QgT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlck9iamVjdChPYmplY3QgdXNlck9iamVjdCkgewotCQlfcHJlc2VudGF0aW9uTmFtZSA9IChTdHJpbmcpIHVzZXJPYmplY3Q7Ci0JCWlmIChfcHJlc2VudGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQlfcHJlc2VudGF0aW9uTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIHByZXNlbnRhdGlvbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgbmFtZSkgewotCQlfcHJlc2VudGF0aW9uTmFtZSA9IG5hbWU7Ci0JCWlmIChfcHJlc2VudGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQlfcHJlc2VudGF0aW9uTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHByZXNlbnRhdGlvbiBuYW1lCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoX3ByZXNlbnRhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmlsZSBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJX2ZpbGVOYW1lID0gbmFtZTsKLQkJaWYgKF9maWxlTmFtZSA9PSBudWxsKSB7Ci0JCQlfZmlsZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiAoX2ZpbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGljb24gbmFtZSBmb3IgdGhlIGNsb3NlZCBpY29uCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvc2VkSWNvbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJX2Nsb3NlZEljb25OYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNsb3NlZCBpY29uIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xvc2VkSWNvbk5hbWUoKSB7Ci0JCXJldHVybiAoX2Nsb3NlZEljb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG9wZW4gaWNvbiBuYW1lCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIG9wZW4gaWNvbiBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcGVuSWNvbk5hbWUoKSB7Ci0JCXJldHVybiAoX29wZW5JY29uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBvcGVuIGljb24gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZW5JY29uTmFtZShTdHJpbmcgbmFtZSkgewotCQlfb3Blbkljb25OYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGV4aXN0IGZsYWcKLQkgKiAKLQkgKiBAcGFyYW0gaXNFeGlzdCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhpc3QoYm9vbGVhbiBpc0V4aXN0KSB7Ci0JCV9pc0V4aXN0ID0gaXNFeGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGV4aXN0IGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4aXN0KCkgewotCQlyZXR1cm4gKF9pc0V4aXN0KTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIGEgbGVnYWN5IG1ldGhvZCwgbm90IHVzZWQgYW55IG1vcmUKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBwYXJhbSBmbGFnIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tQ29udGVudExpYnJhcnkoYm9vbGVhbiBmbGFnKSB7Ci0JCV9pc0Zyb21Db250ZW50TGlicmFyeSA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBhIGxlZ2FjeSBtZXRob2QsIG5vdCB1c2VkIGFueSBtb3JlCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Zyb21Db250ZW50TGlicmFyeSgpIHsKLQkJcmV0dXJuIChfaXNGcm9tQ29udGVudExpYnJhcnkpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdW5pcXVlIGlkIG9mIHRoZSBib29rbWFyawotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKLQkJcmV0dXJuIChfdW5pcXVlSWQpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgdW5pcXVlIGlkIG9mIHRoZSBib29rbWFyawotCSAqIAotCSAqIEBwYXJhbSB1bmlxdWVJZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKLQkJX3VuaXF1ZUlkID0gdW5pcXVlSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB2aXNpYmxlIGZsYWcKLQkgKiAKLQkgKiBAcGFyYW0gaXNWaXNpYmxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0JCV9pc1Zpc2libGUgPSBpc1Zpc2libGU7Ci0JCS8vIHNwZWNpYWwgY2FzZSB3aGVyZSBhbGwgY2hpbGRyZW4gbmVlZCB0byBjaGFuZ2UgYXMgd2VsbAotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldENoaWxkQ291bnQoKTsgaSsrKSB7Ci0JCQlCb29rbWFyayBjaGlsZCA9IChCb29rbWFyaykgKChCb29rbWFyaykgZ2V0Q2hpbGRBdChpKSk7Ci0JCQljaGlsZC5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHZpc2libGUgZmxhZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIChfaXNWaXNpYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGVuYWJsZWQgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc0VuYWJsZWQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLQkJX2lzRW5hYmxlZCA9IGlzRW5hYmxlZDsKLQkJLy8gc3BlY2lhbCBjYXNlIHdoZXJlIGFsbCBjaGlsZHJlbiBuZWVkIHRvIGNoYW5nZSBhcyB3ZWxsCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKLQkJCUJvb2ttYXJrIGNoaWxkID0gKEJvb2ttYXJrKSAoKEJvb2ttYXJrKSBnZXRDaGlsZEF0KGkpKTsKLQkJCWNoaWxkLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZW5hYmxlZCBmbGFnCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gKF9pc0VuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgdHJhbnNwYXJhbnQgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc1RyYW5zcGFyZW50IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc3BhcmVuY3koYm9vbGVhbiBpc1RyYW5zcGFyZW50KSB7Ci0JCS8vIHNldCBhdCB0aGlzIGJvb2ttYXJrIG9ubHksIG5vdCBjaGlsZHJlbgotCQlfaXNUcmFuc3BhcmVudCA9IGlzVHJhbnNwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB0cmFuc3BhcmVudCBmbGFnCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc3BhcmVudCgpIHsKLQkJcmV0dXJuIChfaXNUcmFuc3BhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBib29rbWFyayBhcyBkZWZhdWx0Ci0JICogCi0JICogQHBhcmFtIGlzRGVmYXVsdCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChib29sZWFuIGlzRGVmYXVsdCkgewotCQlfaXNEZWZhdWx0ID0gaXNEZWZhdWx0OwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgYm9va21hcmsgaXMgc2V0IGFzIGRlZmF1bHQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiAoX2lzRGVmYXVsdCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBjdXJyZW50IGZsYWcKLQkgKiAKLQkgKiBAcGFyYW0gaXNDdXJyZW50IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50KGJvb2xlYW4gaXNDdXJyZW50KSB7Ci0JCV9pc0N1cnJlbnQgPSBpc0N1cnJlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjdXJyZW50IGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQoKSB7Ci0JCXJldHVybiAoX2lzQ3VycmVudCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgcmVhbCBjaGlsZCBjb3VudCByZWdhcmRsZXNzIG9mIHZpc2liaWxpdHkuCi0JICovCi0JcHVibGljIGludCBnZXRBY3R1YWxDaGlsZENvdW50KCkgewotCQlyZXR1cm4gKGdldENoaWxkQ291bnQoKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBzcGVjaWZpZWQgY2hpbGQKLQkgKiBAcGFyYW0gaSBpbnQgcG9zaXRpb24gb2YgdGhlIGNoaWxkCi0JICogQHJldHVybiBPYmplY3QgdGhlIGNoaWxkIGJvb2ttYXJrCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZEF0KGludCBpKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5nZXQoaSk7Ci0JfQotCi0JLyoqCi0JICogc2FtZSBhcyBnZXRDaGlsZEF0Ci0JICogCi0JICogQHBhcmFtIGkgaW50IHBvc2l0aW9uIG9mIHRoZSBjaGlsZAotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSBjaGlsZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsQ2hpbGRBdChpbnQgaSkgewotCQlyZXR1cm4gY2hpbGRyZW4uZ2V0KGkpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIG5ldyBjaGlsZCBib29rbWFyawotCSAqIAotCSAqIEBwYXJhbSBjaGlsZCBCb29rbWFyawotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKEJvb2ttYXJrIGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCWNoaWxkLnBhcmVudCA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEJvb2ttYXJrIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHF1ZXJ5IHN0cmluZyB0byB0aGlzIGJvb2ttYXJrLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpCi0JewotCQlyZXR1cm4gcXVlcnlTdHJpbmc7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgcXVlcnkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHF1ZXJ5U3RyIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeVN0cikKLQl7Ci0JCXRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cjsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZG9jdW1lbnQgZm9yIHRoaXMgYm9va21hcmsuCi0JICogCi0JICogQHJldHVybiBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGdldFVuaXF1ZUlkKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZ2V0UHJlc2VudGF0aW9uTmFtZSgpLnRyaW0oKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoImNsb3NlZEljb25OYW1lIiwgZ2V0Q2xvc2VkSWNvbk5hbWUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm9wZW5JY29uTmFtZSIsIGdldE9wZW5JY29uTmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiZXhpc3QiLCBpc0V4aXN0KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkiZnJvbUNvbnRlbnRMaWJyYXJ5IiwgaXNGcm9tQ29udGVudExpYnJhcnkoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgidmlzaWJsZSIsIGlzVmlzaWJsZSgpID8gInRydWUiIDogImZhbHNlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkuc2V0QXR0cmlidXRlKCJlbmFibGVkIiwgaXNFbmFibGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoInRyYW5zcGFyZW50IiwgaXNUcmFuc3BhcmVudCgpID8gInRydWUiIDogImZhbHNlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkuc2V0QXR0cmlidXRlKCJkZWZhdWx0IiwgaXNEZWZhdWx0KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoImN1cnJlbnQiLCBpc0N1cnJlbnQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJjbG9zZWRJY29uSWQiLCBnZXRJY29uSWQoZ2V0Q2xvc2VkSWNvbk5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQotCQlTdHJpbmcgcVN0ciA9IGdldFF1ZXJ5U3RyaW5nKCk7Ci0JCWlmICggcVN0ciA9PSBudWxsIHx8IHFTdHIubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXFTdHIgPSAiP25vZGVJZD0iICsgZWxlbWVudFhtbC5nZXRJZCgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlxU3RyICs9ICImbm9kZUlkPSIgKyBlbGVtZW50WG1sLmdldElkKCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJ1cmwiLCBnZXRGaWxlTmFtZSgpICsgcVN0cik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZENvdW50KCk7IGkrKykgewotCQkJQm9va21hcmsgY2hpbGQgPSAoQm9va21hcmspIGdldEFjdHVhbENoaWxkQXQoaSk7Ci0JCQllbGVtZW50WG1sLmFkZENoaWxkKGNoaWxkLmdldFhtbEVsZW1lbnQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKCkgKyBnZXRRdWVyeVN0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEljb25JZChTdHJpbmcgaWNvbkZpbGVOYW1lKSB7Ci0JCWlmICggaWNvbkZpbGVOYW1lID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBJbnRlZ2VyLnRvSGV4U3RyaW5nKGljb25GaWxlTmFtZS5oYXNoQ29kZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFya0xpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQm9va21hcmtMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTEwNmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFya0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgYSBsaXN0IG9mIGJvb2ttYXJrcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQm9va21hcmtMaXN0IHsKLQotCS8vIGEgbGlzdCBvZiBib29rbWFyayBpdGVtcwotCXByaXZhdGUgTGlzdCBib29rbWFya3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgQm9va21hcmtMaXN0KCkgewotCX0KLQotCS8qKgotCSAqIGFkZCBhIG5ldyBib29rbWFyayAgZW50cnkgdG8gdGhlIGxpc3QKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcgdGhlIEJvb2ttYXJrIG5hbWUKLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGJvb2ttYXJrCi0JICogQHBhcmFtIHNldEFzRGVmYXVsdCBib29sZWFuIHNldCB0aGUgYm9va21hcmsgYXMgZGVmYXVsdCBpZiB0cnVlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEJvb2ttYXJrKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gc2V0QXNEZWZhdWx0KSB7Ci0JCV9Cb29rbWFya0VudHJ5IGVudHJ5ID0gbmV3IF9Cb29rbWFya0VudHJ5KG5hbWUsIGZpbGVOYW1lLCBzZXRBc0RlZmF1bHQpOwotCQlib29rbWFya3MuYWRkKGVudHJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGJvb2ttYXJrIGVudHJpZXMKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRCb29rbWFya3MoKSB7Ci0JCXJldHVybiBib29rbWFya3M7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZG9jdW1lbnQgZm9yIHRoZSBib29rbWFyayBlbnRyaWVzLgotCSAqIAotCSAqIEByZXR1cm4gWG1sRWxlbWVudAotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IG5ldyBYbWxFbGVtZW50KCJCb29rbWFya3MiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBib29rbWFya3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJX0Jvb2ttYXJrRW50cnkgZW50cnkgPSAoX0Jvb2ttYXJrRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBib29rbWFyayA9IGVudHJ5LmZpbGVOYW1lOwotCi0JCQkvLyBTdHJpbmcgdGFiTmFtZT0iIjsKLQkJCVN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGluZHggPSBib29rbWFyay5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5keCA+IDApIHsKLQkJCQkvLyB0YWJOYW1lID0gYm9va21hcmsuc3Vic3RyaW5nKDAsIGluZHgpLnJlcGxhY2UoJ18nLCAnICcpOwotCQkJCXVybCA9IGJvb2ttYXJrLnN1YnN0cmluZygwLCBpbmR4KSArICIuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoIkJvb2ttYXJrIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgYm9va21hcmspIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgidGFiTmFtZSIsIGVudHJ5LnRhYk5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgidXJsIiwgdXJsKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJImRlZmF1bHQiLCAoZW50cnkuaXNEZWZhdWx0KSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBfQm9va21hcmtFbnRyeSB7Ci0JCXByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotCi0JCXByaXZhdGUgU3RyaW5nIHRhYk5hbWU7Ci0KLQkJYm9vbGVhbiBpc0RlZmF1bHQ7Ci0KLQkJX0Jvb2ttYXJrRW50cnkoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiBpc0RlZmF1bHQpIHsKLQkJCXRoaXMudGFiTmFtZSA9IG5hbWUudHJpbSgpOwotCQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQkJdGhpcy5pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Ccm93c2luZ0xheW91dFNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZWFlZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Ccm93c2luZ0xheW91dFNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmaW5lIHRoZSBicm93c2luZyBzZXR0aW5ncy4gVUkgcHJlZmVyZW5jZSBjYW4gc2V0IHRoZSBvcHRpb25zIHRvIGNoYW5nZSB0aGUgYnJvd3NpbmcgYmVoYXZpb3IKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NpbmdMYXlvdXRTZXR0aW5ncyB7Ci0KLQlwdWJsaWMgc3RhdGljIEJyb3dzaW5nTGF5b3V0U2V0dGluZ3MgSU5TVEFOQ0UgPSBuZXcgQnJvd3NpbmdMYXlvdXRTZXR0aW5ncygpOwotCQotCXByaXZhdGUgYm9vbGVhbiBzaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaFVub3BlbkFjdGl2aXR5ZGQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBmYWxzZTsKLQkKLQkvLyBpZiB0cnVlLCB0aGUgdG8tbWFueSBvdXRnb2luZyBhc3NvY2lhdGlvbiBmcm9tIGJhc2Ugd2lsbCBiZSBpZ25vcmVkIGlmIHRoZSBleHRlbmRlciBoYXMgaXRzIG93bgotCXByaXZhdGUgYm9vbGVhbiB1c2VOZXdFeHRlbmRTZW1hbnRpY3MgPSBmYWxzZTsKLQkKLQlwcml2YXRlICBGaWxlIHhzbFBhdGggPSBudWxsOwotCXByaXZhdGUgIEZpbGUgY3NzUGF0aCA9IG51bGw7Ci0JcHJpdmF0ZSBGaWxlIHNjcmlwdFBhdGggPSBudWxsOwotCQotCS8vIHJlY29yZCBhbGwgdGhlIHNpdGVzIHVwZGF0ZWQgc2luY2UgdGhlIGxhc3QgY2hhbmdlCi0JcHJpdmF0ZSAgTGlzdCB1cGRhdGVkU2l0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHVibGljIHZvaWQgc2V0VXNlTmV3RXh0ZW5kU2VtYW50aWNzKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnVzZU5ld0V4dGVuZFNlbWFudGljcyA9IGZsYWc7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXNlTmV3RXh0ZW5kU2VtYW50aWNzKCkgewotCQlyZXR1cm4gdGhpcy51c2VOZXdFeHRlbmRTZW1hbnRpY3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyhib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMgPSBmbGFnOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHRoaXMuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5wdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCA9IGZsYWc7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5wdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZsYWc7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uOwotCX0KLQkKLQlwdWJsaWMgIHZvaWQgc2V0WHNsUGF0aChGaWxlIHBhdGgpIHsKLQkJeHNsUGF0aCA9IHBhdGg7Ci0JfQotCQotCXB1YmxpYyAgdm9pZCBzZXRDc3NQYXRoKEZpbGUgcGF0aCkgewotCQljc3NQYXRoID0gcGF0aDsKLQl9Ci0JCi0JcHVibGljICB2b2lkIHNldFNjcmlwdFBhdGgoRmlsZSBwYXRoKSB7Ci0JCXNjcmlwdFBhdGggPSBwYXRoOwotCX0KLQkKLQlwdWJsaWMgIEZpbGUgZ2V0WHNsUGF0aCgpIHsKLQkJcmV0dXJuIHhzbFBhdGg7Ci0JfQotCQotCXB1YmxpYyAgRmlsZSBnZXRDc3NQYXRoKCkgewotCQlyZXR1cm4gY3NzUGF0aDsKLQl9Ci0JCi0JcHVibGljICBGaWxlIGdldFNjcmlwdFBhdGgoKSB7Ci0JCXJldHVybiBzY3JpcHRQYXRoOwotCX0KLQkKLQlwdWJsaWMgIHZvaWQgc2V0Q2hhbmdlZCgpIHsKLQkJdXBkYXRlZFNpdGVzLmNsZWFyKCk7Ci0JfQotCQotCQotCXB1YmxpYyAgYm9vbGVhbiBuZWVkVXBkYXRlKFN0cmluZyBwdWJEaXIpIHsKLQkJaWYgKCBwdWJEaXIgPT0gbnVsbCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gIXVwZGF0ZWRTaXRlcy5jb250YWlucyhwdWJEaXIpOwotCX0KLQkKLQlwdWJsaWMgIHZvaWQgdXBkYXRlKEh0bWxCdWlsZGVyIGJ1aWxkZXIpIHsKLQkJaWYgKCAoYnVpbGRlciA9PSBudWxsKSB8fCAhbmVlZFVwZGF0ZShidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSkgKSB7Ci0JCQlpZiAoKGJ1aWxkZXIgIT0gbnVsbCkmJih4c2xQYXRoICE9IG51bGwpKSB7Ci0JCQkJYnVpbGRlci5zZXRMYXlvdXRYc2xSb290UGF0aCh4c2xQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIHhzbFBhdGggPT0gbnVsbCB8fCBjc3NQYXRoID09IG51bGwgfHwgc2NyaXB0UGF0aCA9PSBudWxsKSB7Ci0JCQkvLyB1c2UgdGhlIGRlZmF1bHQKLQkJCUxheW91dFJlc291cmNlcy5jb3B5TGF5b3V0RmlsZXMoYnVpbGRlci5nZXRQdWJsaXNoRGlyKCkpOwotCQkJYnVpbGRlci5sb2FkRGVmYXVsdExheW91dFhzbCgpOwotCQl9IGVsc2UgewotCQkJCi0JCQkvLyBzZXQgdGhlIHhzbCBwYXRoCi0JCQlidWlsZGVyLnNldExheW91dFhzbFJvb3RQYXRoKHhzbFBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCi0JCQkvLyBjb3B5IHRoZSBmaWxzIHRvIHRoZSBwdWJsaXNoIGZvbGRlcgotCQkJU3RyaW5nIGluY2x1ZGUgPSAiKi4qLCoqLyouKiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBleGNsdWRlID0gbnVsbDsKLQkJCWJvb2xlYW4gb3ZlcnJpZGUgPSB0cnVlOwotCQkJCi0JCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpLCAiY3NzIik7CQkJIC8vJE5PTi1OTFMtMSQKLQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGNzc1BhdGgsIGZvbGRlciwgaW5jbHVkZSwgZXhjbHVkZSwgb3ZlcnJpZGUpOwotCQkJCi0JCQlmb2xkZXIgPSBuZXcgRmlsZShidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSwgInNjcmlwdHMiKTsJCQkgLy8kTk9OLU5MUy0xJAotCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc2NyaXB0UGF0aCwgZm9sZGVyLCBpbmNsdWRlLCBleGNsdWRlLCBvdmVycmlkZSk7Ci0JCX0KLQkJCi0JCXVwZGF0ZWRTaXRlcy5hZGQoYnVpbGRlci5nZXRQdWJsaXNoRGlyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0ODQ0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0RlZmF1bHRDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuQ29udGVudFJlc291cmNlU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElDb250ZW50VmFsaWRhdG9yLiBUaGlzIHZhbGlkYXRvciBpcyB1c2VkIGZvciBicm93c2luZyBhbmQgcHJldmlldwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICoKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDb250ZW50VmFsaWRhdG9yIGltcGxlbWVudHMgSUNvbnRlbnRWYWxpZGF0b3IgewotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGluZm87Ci0KLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gd2FybmluZzsKLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBlcnJvcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHViRGlyOwotCi0JLy9wcm90ZWN0ZWQgYm9vbGVhbiBzaG93QnJva2VuTGlua3MgPSB0cnVlOwotCQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIERlZmF1bHRDb250ZW50VmFsaWRhdG9yKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIHB1YkRpcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcihTdHJpbmcgcHViRGlyKSB7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCQlpbmZvID0gU3lzdGVtLm91dDsKLQkJd2FybmluZyA9IFN5c3RlbS5vdXQ7Ci0JCWVycm9yID0gU3lzdGVtLmVycjsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgcHVibGlzaCBkaXIKLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIHB1YkRpcikgewotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gdGhpcy5wdWJEaXI7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCBzZXRTaG93QnJva2VuTGlua3MoYm9vbGVhbiBmbGFnKSB7Ci0vLwkJc2hvd0Jyb2tlbkxpbmtzID0gZmxhZzsKLS8vCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG93QnJva2VuTGlua3MoKSB7Ci0JCXJldHVybiB0cnVlOyAvLyBkZWZhdWx0Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNjYW5Db250ZW50KElFbGVtZW50TGF5b3V0IGxheW91dCwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJTWV0aG9kRWxlbWVudCBvd25lciA9IGxheW91dC5nZXRFbGVtZW50KCk7Ci0JCVN0cmluZyBjb250ZW50UGF0aCA9IGxheW91dC5nZXRGaWxlUGF0aCgpOwotCi0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IGdldFNjYW5uZXIob3duZXIpOwotCQlpZiAoIHNjYW5uZXIgIT0gbnVsbCApIHsKLQkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhvd25lciwgY29udGVudCwgY29udGVudFBhdGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVzb3VyY2Ugc2Nhbm5lciBmb3IgdGhlIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIGdldFNjYW5uZXIoTWV0aG9kRWxlbWVudCBvd25lcikgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihvd25lcik7Ci0JCWlmICggcmVzTWdyID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIHJvb3RDb250ZW50UGF0aCA9IHJlc01nci5nZXRMb2dpY2FsUGx1Z2luUGF0aChvd25lcik7Ci0JCUZpbGUgc3JjX3Jvb3QgPSBuZXcgRmlsZShyZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKG93bmVyKSk7Ci0JCUZpbGUgdGd0X3Jvb3QgPSBuZXcgRmlsZShwdWJEaXIsIHJvb3RDb250ZW50UGF0aCk7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKHNyY19yb290LCB0Z3Rfcm9vdCwgcm9vdENvbnRlbnRQYXRoLCB0aGlzKTsKLQotCQlyZXR1cm4gc2Nhbm5lcjsKLQl9Ci0JCi0JcHVibGljIExpbmtJbmZvIHZhbGlkYXRlTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgYXR0cmlidXRlcywKLQkJCVN0cmluZyB0ZXh0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHRhZykgewotCi0JCUxpbmtJbmZvIGluZm8gPSBuZXcgTGlua0luZm8ob3duZXIsIHRoaXMsIHB1YkRpciwgdGFnKTsKLQkJaW5mby52YWxpZGF0ZUxpbmsoYXR0cmlidXRlcywgdGV4dCwgY29uZmlnKTsKLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWluZm8KLQkJCQkucHJpbnRsbihOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEsICgob3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSkgKyAiOiAiICsgbWVzc2FnZSkpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluZm8uZmx1c2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXdhcm5pbmcKLQkJCQkucHJpbnRsbihOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQsICgob3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSkgKyAiOiAiICsgbWVzc2FnZSkpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXdhcm5pbmcuZmx1c2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKSB7Ci0JCWVycm9yCi0JCQkJLnByaW50bG4oTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3LCAoKG93bmVyID09IG51bGwpID8gIiIgOiBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvd25lcikpICsgIjogIiArIG1lc3NhZ2UpKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAodGggIT0gbnVsbCkgewotCQkJdGgucHJpbnRTdGFja1RyYWNlKGVycm9yKTsKLQkJfQotCQllcnJvci5mbHVzaCgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2dJbmZvKG51bGwsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nV2FybmluZyhudWxsLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKSB7Ci0JCWxvZ0Vycm9yKG51bGwsIG1lc3NhZ2UsIHRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpIHsKLQkJbG9nV2FybmluZygKLQkJCQlvd25lciwKLQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwLCBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShyZWZFbGVtZW50KSkpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBndWlkLAotCQkJU3RyaW5nIGxpbmtlZFRleHQpIHsKLQkJbG9nV2FybmluZyhvd25lciwgTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMSwgZ3VpZCkpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVzb3VyY2UoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQlTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyBtc2c7Ci0JCWlmIChyZXNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMiwgcmVzb3VyY2VGaWxlLmdldFBhdGgoKSwgdXJsKTsgCi0JCX0gZWxzZSB7Ci0JCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1LCB1cmwpOyAKLQkJfQotCi0JCWxvZ1dhcm5pbmcob3duZXIsIG1zZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nSW52YWxpZEV4dGVybmFsTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsLAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nIHRleHQ7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRleHQgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5LCB1cmwsIG1lc3NhZ2UpOyAKLQkJfSBlbHNlIHsKLQkJCXRleHQgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3LCB1cmwpOyAKLQkJfQotCQlsb2dXYXJuaW5nKG93bmVyLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBkaXNjYXJkZWQgb3Igbm90Ci0JICogZGlzY2FyZGVkIGVsZW1lbnRzIHdpbGwgYmUgdHJlYXRlZCBhcyBvdXQgc2lkZSB0aGUgY29uZmlndXJzYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gT2JqZWN0IGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzY2FyZGVkKE1ldGhvZEVsZW1lbnQgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvd25lciwgTWV0aG9kRWxlbWVudCBlKQotCXsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0RGlzY2FyZGVkRWxlbWVudChNZXRob2RFbGVtZW50IGUpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIEJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0UuaXNTaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKTsKLQl9Ci0JCQotCS8qKgotCSAqIHNob3cgZGVzY3JpcHRvcnMgb24gbWV0aG9kIGVsZW1lbnQgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHRhYiBpZCBmb3IgdGhlIGFjdGl2aXR5IGxheW91dAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QWN0aXZpdHlUYWIoKSB7Ci0JCXJldHVybiBudWxsOyAgLy8gdXNlIHRoZSBkZWZhdWx0Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0RlZmF1bHRTaGFwZWljb25zLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0RlZmF1bHRTaGFwZWljb25zLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Nzk5N2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0U2hhcGVpY29ucy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIERlZmF1bHQgU2hhcGUgSWNvbiBNYXBwaW5nIGZvciB0aGUgTWV0aG9kIEVsZW1lbnRzLgotCi0jIENvcmUgTWV0aG9kIEVsZW1lbnRzCi1hcnRpZmFjdD1pbWFnZXMvYXJ0aWZhY3QuZ2lmCi1jb250ZW50ZWxlbWVudD1pbWFnZXMvZ3VpZGFuY2UuZ2lmCi1jb250ZW50cGFja2FnZT1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotZGVsaXZlcmFibGU9aW1hZ2VzL2FydGlmYWN0LmdpZgotbWV0aG9kcGx1Z2luPWltYWdlcy9tZXRob2RfcGx1Z2luLmdpZgotb3V0Y29tZT1pbWFnZXMvYXJ0aWZhY3QuZ2lmCi1yb2xlPWltYWdlcy9yb2xlLmdpZgotdGFzaz1pbWFnZXMvdGFzay5naWYKLQotIyBHdWlkYW5jZQotY2hlY2tsaXN0PWltYWdlcy9jaGVja2xpc3QuZ2lmCi1jb25jZXB0PWltYWdlcy9jb25jZXB0LmdpZgotZXhhbXBsZT1pbWFnZXMvZXhhbXBsZS5naWYKLWVzdGltYXRpb25jb25zaWRlcmF0aW9ucz1pbWFnZXMvZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zLmdpZgotZ3VpZGFuY2U9aW1hZ2VzL2d1aWRhbmNlLmdpZgotZ3VpZGxpbmU9aW1hZ2VzL2d1aWRsaW5lLmdpZgotcHJhY3RpY2U9aW1hZ2VzL3ByYWN0aWNlLmdpZgotcm9hZG1hcD1pbWFnZXMvcm9hZG1hcC5naWYKLXJlcG9ydD1pbWFnZXMvcmVwb3J0LmdpZgotcmV1c2FibGVhc3NldD1pbWFnZXMvcmV1c2FibGVhc3NldC5naWYKLXN1cHBvcnRpbmdtYXRlcmlhbD1pbWFnZXMvc3VwcG9ydGluZ21hdGVyaWFsLmdpZgotdGVjaG5pcXVlPWltYWdlcy90ZWNobmlxdWUuZ2lmCi10ZW1wbGF0ZT1pbWFnZXMvdGVtcGxhdGUuZ2lmCi10ZXJtZGVmaW5pdGlvbj1pbWFnZXMvdGVybWRlZmluaXRpb24uZ2lmCi10b29sbWVudG9yPWltYWdlcy90b29sbWVudG9yLmdpZgotd2hpdGVwYXBlcj1pbWFnZXMvd2hpdGVwYXBlci5naWYKLQotIyBDb250ZW50IENhdGVnb3JpZXMKLWN1c3RvbWNhdGVnb3J5PWltYWdlcy9jdXN0b21jYXQuZ2lmCi1kaXNjaXBsaW5lPWltYWdlcy9kaXNjaXBsaW5lLmdpZgotZGlzY2lwbGluZWdyb3VwaW5nPWltYWdlcy9kaXNjaXBsaW5lZ3JvdXAuZ2lmCi1kb21haW49aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLXJvbGVzZXQ9aW1hZ2VzL3JvbGVzZXQuZ2lmCi1yb2xlc2V0Z3JvdXBpbmc9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLXRvb2w9aW1hZ2VzL3Rvb2wuZ2lmCi13b3JrcHJvZHVjdHR5cGU9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLQotIyBQcm9jZXNzIEVsZW1lbnRzCi1hY3Rpdml0eT1pbWFnZXMvYWN0aXZpdHkuZ2lmCi1jYXBhYmlsaXR5cGF0dGVybj1pbWFnZXMvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCi1kZWxpdmVyeXByb2Nlc3M9aW1hZ2VzL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKLWl0ZXJhdGlvbj1pbWFnZXMvaXRlcmF0aW9uLmdpZgotcGhhc2U9aW1hZ2VzL3BoYXNlLmdpZgotcHJvY2Vzcz1pbWFnZXMvcHJvY2Vzcy5naWYKLQotIyBEZXNjcmlwdG9ycwotY29tcG9zaXRlcm9sZT1pbWFnZXMvY29tcG9zaXRlcm9sZS5naWYKLXJvbGVkZXNjcmlwdG9yPWltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZgotdGFza2Rlc2NyaXB0b3I9aW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmCi10ZWFtcHJvZmlsZT1pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCi13b3JrcHJvZHVjdGRlc2NyaXB0b3I9aW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmCi1taWxlc3RvbmU9aW1hZ2VzL21pbGVzdG9uZS5naWYKLQotIyBNaXNjCi1nZW5lcmFsPWltYWdlcy9ndWlkYW5jZS5naWYKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRWxlbWVudExheW91dE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRWxlbWVudExheW91dE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNGQwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRMYXlvdXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkdlbmVyYWxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSBFbGVtZW50TGF5b3V0TWFuYWdlci5jbGFzcwotCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdF9jb25maWdfcGF0aCA9ICJub2NvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBpc1B1Ymxpc2hpbmdNb2RlID0gZmFsc2U7IC8vIGRlZmF1bHQgdG8gYnJvd3NpbmcgbW9kZQotCQotCXByaXZhdGUgU3RyaW5nIHB1Ymxpc2hfZGlyID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHJpdmF0ZSBJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IG51bGw7Ci0KLQkvLyBuZWVkIHRvIHNlcGVyYXRlIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9ybSBjb250ZW50IGFuZCBkaWFncmFtCi0JLy8gZGlhZ3JhbSBhZGFwdG9yIGZhY3Rvcnkgc2hvdWxkIG5vdCBiZSByb2xsZWQgdXAKLQlwcml2YXRlIExheW91dEFkYXB0ZXJGYWN0b3J5IGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBMYXlvdXRBZGFwdGVyRmFjdG9yeSBkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQotCS8vIGNhY2hlIHRoZSBzdXBwcmVzc2lvbiBvYmplY3QgZm9yIHB1Ymxpc2hpbmcgbW9kZWwgb25seQotCS8vIG1hcCBvZiBwcm9jIGd1aWQgdG8gU3VwcHJlc2lpb24gb2JqZWN0CQotCXByaXZhdGUgTWFwIHN1cHJlc3Npb25NYXAgPSBudWxsOwotCQotCXByaXZhdGUgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkKLQlwcml2YXRlIEVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IG51bGw7Ci0JCi0JLy8gdGhlIGxheW91dCBleHRlbnNpb25zLiBlYWNoIGV4dGVuc2lvbiBpcyBpZGVudGlmaWVkIGJ5IHRoZSBwcm9wZXJ0eSBpZCBvZiB0aGUgY29uZmlndXJhdGlvbgotCXByaXZhdGUgTWFwPFN0cmluZywgTGF5b3V0RXh0ZW5zaW9uPiBsYXlvdXRFeHRlbnNpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMYXlvdXRFeHRlbnNpb24+KCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoaW5nTW9kZSgpCi0JewotCQlyZXR1cm4gdGhpcy5pc1B1Ymxpc2hpbmdNb2RlOwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIoKSB7Ci0JCXRoaXMobnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzKGNvbmZpZywgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHB1Ymxpc2hkaXIsIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciwgYm9vbGVhbiBpc1B1Ymxpc2hpbmdNb2RlKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0aGlzLmlzUHVibGlzaGluZ01vZGUgPSBpc1B1Ymxpc2hpbmdNb2RlOwotCQkKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJfQotCi0JCWlmIChwdWJsaXNoZGlyID09IG51bGwpIHsKLQkJCXB1Ymxpc2hkaXIgPSBMYXlvdXRSZXNvdXJjZXMuZ2V0RGVmYXVsdFB1Ymxpc2hEaXIoKTsKLQkJCWlmICghcHVibGlzaGRpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQlwdWJsaXNoZGlyICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJfQotCi0JCQkvLyBhbHNvIGFwcGVuZCB0aGUgY29uZmlndXJhdGlvbiBwYXRoCi0JCQlpZiAodGhpcy5jb25maWcgPT0gbnVsbCkgewotCQkJCXB1Ymxpc2hkaXIgKz0gZGVmYXVsdF9jb25maWdfcGF0aDsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHN0ciA9IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnModGhpcy5jb25maWcuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoIHN0ciA9PSAiIiApIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHIgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMuY29uZmlnLnRvU3RyaW5nKCkuaGFzaENvZGUoKSk7Ci0JCQkJfQotCQkJCXB1Ymxpc2hkaXIgKz0gc3RyOwotCQkJfQotCQl9Ci0KLQkJc2V0UHVibGlzaERpcihwdWJsaXNoZGlyKTsKLQotCQljb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkgPSBuZXcgTGF5b3V0QWRhcHRlckZhY3RvcnkodGhpcy5jb25maWcpOwotCQlkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkgPSBuZXcgTGF5b3V0QWRhcHRlckZhY3RvcnkodGhpcy5jb25maWcpOwotCQkKLQkJLy8JbG9hZCB0aGUgbGF5b3V0IGV4dGVuc2lvbnMgZm9yIHRoaXMgY29uZmlndXJhdGlvbgotCQlsb2FkTGF5b3V0RXh0ZW5zaW9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkTGF5b3V0RXh0ZW5zaW9ucygpIHsKLQkJaWYgKCBjb25maWcgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbG9hZCB0aGUgbGF5b3V0IGV4dGVuc2lvbnMgZm9yIHRoaXMgY29uZmlndXJhdGlvbgotCQlMaXN0IHByb3BzID0gY29uZmlnLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQlpZiAoIHByb3BzICE9IG51bGwgJiYgcHJvcHMuc2l6ZSgpID4gMCApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRwID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KWl0cC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGlkID0gcHJvcC5nZXROYW1lKCk7Ci0JCQkJTGF5b3V0RXh0ZW5zaW9uIGV4dD0gTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUV4dGVuc2lvbihpZCk7Ci0JCQkJaWYgKCBleHQgIT0gbnVsbCApIHsKLQkJCQkJZXh0LmluaXQodGhpcyk7Ci0JCQkJCWxheW91dEV4dGVuc2lvbnMucHV0KGlkLCBleHQpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBJQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJdmFsaWRhdG9yID0gbmV3IERlZmF1bHRDb250ZW50VmFsaWRhdG9yKGdldFB1Ymxpc2hEaXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0JCi0JcHVibGljIEVsZW1lbnRSZWFsaXplciBnZXRFbGVtZW50UmVhbGl6ZXIoKSB7Ci0JCWlmICggcmVhbGl6ZXIgPT0gbnVsbCApIHsKLQkJCXJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCXJlYWxpemVyLnNldEZpbHRlcihjb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVhbGl6ZXI7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudFJlYWxpemVyKEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQl0aGlzLnJlYWxpemVyID0gcmVhbGl6ZXI7CQkKLQl9Ci0JCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50TGF5b3V0QWRhcHRlckZhY3Rvcnkud2JzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkudGJzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5LndwYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS5jYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXREaWFncmFtQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBkaWFncmFtTGF5b3V0QWRhcHRlckZhY3Rvcnkud2JzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UpIHsKLQkJdGhpcy5kaWFncmFtU2VydmljZSA9IGRpYWdyYW1TZXJ2aWNlOwotCX0KLQotCXB1YmxpYyBJQWN0aXZpdHlEaWFncmFtU2VydmljZSBnZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCkgewotCQlyZXR1cm4gdGhpcy5kaWFncmFtU2VydmljZTsKLQl9Ci0KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKQotCXsKLQkJU3VwcHJlc3Npb24gc3VwID0gbnVsbDsKLQkJaWYgKCBpc1B1Ymxpc2hpbmdNb2RlKQotCQl7Ci0JCQlpZiAoIHN1cHJlc3Npb25NYXAgPT0gbnVsbCApCi0JCQl7Ci0JCQkJc3VwcmVzc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgZ3VpZCA9IHByb2MuZ2V0R3VpZCgpOwotCQkJc3VwID0gKFN1cHByZXNzaW9uKXN1cHJlc3Npb25NYXAuZ2V0KGd1aWQpOwotCQkJaWYgKCBzdXAgPT0gbnVsbCApCi0JCQl7Ci0JCQkJc3VwID0gY3JlYXRlU3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJc3VwcmVzc2lvbk1hcC5wdXQoZ3VpZCwgc3VwKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXN1cCA9IGNyZWF0ZVN1cHByZXNzaW9uKHByb2MpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmVwYXJlQWRhcHRvckZhY3Rvcmllc0ZvclByb2Nlc3MoUHJvY2VzcyBwcm9jKQotCXsKLQkJLy8gbmVlZCB0byBpdGVyYXRlIHRoZSBhZGFwdG9yIGZhY3RvcnkgdG8gZ2VuZXJhdGUgdGhlIGFkYXB0b3IgdHJlZQotCQlwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSwgcHJvYyk7Ci0JCXByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcihnZXRUQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGdldFdCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCQlwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKAotCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwgfHwgYWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIG9iajsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqLAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihvYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQkJCQlpZiAoKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGFkYXB0ZXJGYWN0b3J5LCByYXdpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRWxlbWVudExheW91dCBjcmVhdGVMYXlvdXQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBhY3Rpdml0eSwgd2UgbmVlZCB0byBmaW5lZCB0aGUgcGF0aCB0byB0aGUgcHJvY2VzcwotCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCVByb2Nlc3Mgb3duaW5nUHJvYyA9IG51bGw7Ci0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5ICkKLQkJewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KWVsZW1lbnQ7Ci0JCQlwYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRQYXRoKGFjdCk7Ci0JCQlvd25pbmdQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjcmVhdGVMYXlvdXQoZWxlbWVudCwgb3duaW5nUHJvYywgcGF0aCk7Ci0JfQotCi0JcHVibGljIElFbGVtZW50TGF5b3V0IGNyZWF0ZUxheW91dChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlQcm9jZXNzIG93bmluZ1Byb2MsIFN0cmluZyBwYXRoKSB7Ci0JCUFic3RyYWN0RWxlbWVudExheW91dCBsYXlvdXQgPSBudWxsOwotCi0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQljbGFzc05hbWUgPSAiQ29udGVudERlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJY2xhc3NOYW1lID0gIkFjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKChlbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpCi0JCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpKSB7Ci0JCQljbGFzc05hbWUgPSAiV29ya0JyZWFrZG93bkVsZW1lbnQiOyAvLyROT04tTkxTLTEkICAvLyB0YXNrZGVzY3JpcHRvciBoYXMgaXQncyBvd24gbGF5b3V0Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzcyBpW10gPSBlbGVtZW50LmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpOwotCQkJaWYgKGkgIT0gbnVsbCAmJiBpLmxlbmd0aCA9PSAxKSB7Ci0JCQkJY2xhc3NOYW1lID0gaVswXS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCWludCBpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCX0KLQkJfQotCi0JCWNsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuZWxlbWVudHMuIiArIGNsYXNzTmFtZSArICJMYXlvdXQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl0cnkgewotCQkJQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQlsYXlvdXQgPSAoQWJzdHJhY3RFbGVtZW50TGF5b3V0KSBjLm5ld0luc3RhbmNlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlpZiAobGF5b3V0ID09IG51bGwpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGF5b3V0IGNsYXNzICciICsgY2xhc3NOYW1lICsgIicgZm9yIGVsZW1lbnQKLQkJCS8vICciICsgZWxlbWVudC5nZXROYW1lKCkgKyAiJyBub3QgZGVmaW5lZC4gVXNlIEdlbmVyYWxMYXlvdXQiKTsKLQkJCWxheW91dCA9IG5ldyBHZW5lcmFsTGF5b3V0KCk7Ci0JCX0KLQotCQlpZiAobGF5b3V0IGluc3RhbmNlb2YgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCkgewotCQkJKChBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KSBsYXlvdXQpLmluaXQodGhpcywgZWxlbWVudCwKLQkJCQkJb3duaW5nUHJvYywgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlsYXlvdXQuaW5pdCh0aGlzLCBlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBsYXlvdXQ7Ci0JfQotCi0JcHVibGljIElFbGVtZW50TGF5b3V0IGdldExheW91dChNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCS8vIFN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBudWxsOyAvLyAoSUVsZW1lbnRMYXlvdXQpbGF5b3V0TWFwLmdldChpZCk7Ci0JCWlmICgobGF5b3V0ID09IG51bGwpICYmIGNyZWF0ZSkgewotCQkJbGF5b3V0ID0gY3JlYXRlTGF5b3V0KGVsZW1lbnQpOwotCQkJLy8gbGF5b3V0TWFwLnB1dChpZCwgbGF5b3V0KTsKLQkJfQotCi0JCXJldHVybiBsYXlvdXQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3BhcmFtZXRlcnMgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIlxcP3Byb2M9KC4qPykmcGF0aD0oLiopPyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElFbGVtZW50TGF5b3V0IGdldExheW91dChTdHJpbmcgdXJsKSB7Ci0KLQkJUHJvY2VzcyBvd25pbmdQcm9jID0gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCi0JCU1hdGNoZXIgbSA9IHBfcGFyYW1ldGVycy5tYXRjaGVyKHVybCk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIHByb2MgPSBtLmdyb3VwKDEpOwotCQkJcGF0aCA9IG0uZ3JvdXAoMik7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlvd25pbmdQcm9jID0gKFByb2Nlc3MpIG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudCgKLQkJCQkJCXByb2MpOwotCQkJfQotCQl9Ci0KLQkJLy8gTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpdXJsTWFwLmdldCh1cmwpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50RnJvbUZpbGVOYW1lKHVybCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVMYXlvdXQoZWxlbWVudCwgb3duaW5nUHJvYywgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IGZpbmQgZWxlbWVudCBmb3IgdXJsICciICsgdXJsICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKFN0cmluZyBwcm9jLCBTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gIj8iICsgUmVzb3VyY2VIZWxwZXIuVVJMX1BBUkFNRVRFUl9QUk9DRVNTICsgIj0iICsgcHJvYyArICImIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSsgUmVzb3VyY2VIZWxwZXIuVVJMX1BBUkFNRVRFUl9QQVRIICsgIj0iICsgcGF0aDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoRGlyKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMucHVibGlzaF9kaXIgPSBwYXRoOwotCQlpZiAoICF0aGlzLnB1Ymxpc2hfZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSApIHsKLQkJCXRoaXMucHVibGlzaF9kaXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQotCQkvLyBpbml0aWFsaXplIHB1Ymxpc2hpbmcgc2l0ZSBpZiBuZWVkZWQKLQkJaW5pdF9wdWJsaXNoaW5nU2l0ZSgpOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaXNoX2RpcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdF9wdWJsaXNoaW5nU2l0ZSgpIHsKLQkJaWYgKCBCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLm5lZWRVcGRhdGUocHVibGlzaF9kaXIpICkgewotCQkJaWYgKCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpICkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJCZWdpbiBpbml0aWFsaXppbmcgcHVibGlzaGluZyBzaXRlOiAiICsgcHVibGlzaF9kaXIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCS8vIGNvcHkgdGhlIGxheW91dCBmaWxlcyBmcm9tIHBsdWdpbiBsYXlvdXQgdG8gcHVibGlzaGlnbiBzaXRlCi0JCQlMYXlvdXRSZXNvdXJjZXMuY29weUxheW91dEZpbGVzKHB1Ymxpc2hfZGlyKTsKLQkKLQkJCWlmICggTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVuZCBpbml0aWFsaXppbmcgcHVibGlzaGluZyBzaXRlOiAiICsgcHVibGlzaF9kaXIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIGNvcHlMaWJyYXJ5UmVzb3VyY2VzKCkgewotLy8JCWlmICggTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSApIHsKLS8vCQkJU3lzdGVtLm91dAotLy8JCQkJCS5wcmludGxuKCJCZWdpbiBjb3B5aW5nIGxpYnJhcnkgcmVzb3VyY2VzIHRvIHB1Ymxpc2hpbmcgc2l0ZTogIiArIHB1Ymxpc2hfZGlyKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCQkKLS8vCQkvLyBjb3B5IGxpYnJhcnkgcmVzb3VyY2VzIGZyb20gbGlicmFyeSB0byBwdWJsaXNoaW5nIHNpdGUKLS8vCQlGaWxlIGxpYlJvb3QgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLS8vCQlpZiAobGliUm9vdCAhPSBudWxsKSB7Ci0vLwkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGxpYlJvb3QuZ2V0UGF0aCgpLCBwdWJsaXNoX2Rpcik7Ci0vLwkJfQotLy8KLS8vCQlpZiAoIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkgKSB7Ci0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbigiRW5kIGNvcHlpbmcgbGlicmFyeSByZXNvdXJjZXMgdG8gcHVibGlzaGluZyBzaXRlOiAiICsgcHVibGlzaF9kaXIpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIGxheW91dE1hcC5jbGVhcigpOwotCQkKLQkJZGlhZ3JhbVNlcnZpY2UgPSBudWxsOwotCQkKLQkJaWYgKCBzdXByZXNzaW9uTWFwICE9IG51bGwgKQotCQl7Ci0JCQlzdXByZXNzaW9uTWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCWxheW91dEV4dGVuc2lvbnMuY2xlYXIoKTsKLQkJbGF5b3V0RXh0ZW5zaW9ucyA9IG51bGw7Ci0JCQotCQljb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkuY2xlYXIoKTsKLQkJZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5LmNsZWFyKCk7Ci0JCQotCQlpZiAoIHZhbGlkYXRvciAhPSBudWxsICkKLQkJewotCQkJdmFsaWRhdG9yLmRpc3Bvc2UoKTsKLQkJCXZhbGlkYXRvciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmICggcmVhbGl6ZXIgIT0gbnVsbCApIHsKLQkJCXJlYWxpemVyLmRpc3Bvc2UoKTsKLQkJCXJlYWxpemVyID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKCBjb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkgIT0gbnVsbCApIHsKLQkJCWNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS5jbGVhcigpOwotCQkJY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsJCQkKLQkJfQotCQkKLQkJaWYgKCBkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkgIT0gbnVsbCApIHsKLQkJCWRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeS5jbGVhcigpOwotCQkJZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsJCQkKLQkJfQotCQkgCi0JfQotCi0JcHVibGljIGNsYXNzIExheW91dEFkYXB0ZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JCVByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlciBjb25maWd1cmF0b3IgPSBudWxsOwotCQkKLQkJcHVibGljIExheW91dEFkYXB0ZXJGYWN0b3J5KE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKQotCQl7Ci0JCQkvLyBjcmVhdGUgYWRhcHQgZmFjdG9yaWVzCi0JCQkvLwotCQkJaWYoaXNQdWJsaXNoaW5nTW9kZSgpKSB7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHVibGlzaGluZ1RCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVQdWJsaXNoaW5nQ0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCX0KLQotCQkJLy8gc2V0IGNvbmZpZ3VyYXRpb24gZmlsdGVyCi0JCQljb25maWd1cmF0b3IgPSBuZXcgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKG1ldGhvZENvbmZpZywgdGhpcyk7Ci0KLQkJCXdic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJdGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl3cGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQljYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsJCQotCQl9Ci0JCQotCQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCQlyZXR1cm4gY29uZmlndXJhdG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjbGVhcigpCi0JCXsKLQkJCQotCQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIobnVsbCk7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHRic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIobnVsbCk7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHdwYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihudWxsKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChjYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJY2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKG51bGwpOwotCQkJCWNic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWlmICggY29uZmlndXJhdG9yICE9IG51bGwgKSB7Ci0JCQkJY29uZmlndXJhdG9yLmRpc3Bvc2UoKTsKLQkJCQljb25maWd1cmF0b3IgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3VwcHJlc3Npb24gY3JlYXRlU3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZXJlIGFyZSBleHRlbnNpb25zCi0JCWlmICggbGF5b3V0RXh0ZW5zaW9ucyAhPSBudWxsICYmIGxheW91dEV4dGVuc2lvbnMuc2l6ZSgpID4gMCApIHsKLQkJCWZvciAoIEl0ZXJhdG9yPExheW91dEV4dGVuc2lvbj4gaXQgPSBsYXlvdXRFeHRlbnNpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTGF5b3V0RXh0ZW5zaW9uIGV4dCA9IGl0Lm5leHQoKTsKLQkJCQlTdXBwcmVzc2lvbiBzdXAgPSBleHQuZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJaWYgKCBzdXAgIT0gbnVsbCApIHsKLQkJCQkJcmV0dXJuIHN1cDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9FbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4MDhmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5JRWxlbWVudFByb3BlcnR5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbG9hZHMgYW5kIG1hbmFnZXMgYW55IGVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVzIHJlZ2lzdGVyZWQuIFRoaXMgY2xhc3MgcnVucyBhcyBhIHNpbmdsZXRvbi4KLSAqIAotICogQGF1dGhvciBQaWVycmUgUGFkb3ZhbmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIgewotCi0gIC8qKgotICAgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gImVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVycyI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogVGhlICJjbGFzcyIgYXR0cmlidXRlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJfTkFNRSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIHN0YXRpYyBFbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIgbXlzZWxmOwotICAKLSAgcHJpdmF0ZSBBcnJheUxpc3Q8SUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyPiBwcm92aWRlcnM7Ci0gIAotICBwcml2YXRlIEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlcigpIHsKLSAgICAvLyBwcml2YXRlIHRvIGF2b2lkIG91dHNpZGUgY2FsbHMKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgKiAKLSAgICogQHJldHVybiBFbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotICAgIGlmIChteXNlbGYgPT0gbnVsbCkgewotICAgICAgbXlzZWxmID0gbmV3IEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlcigpOwotICAgIH0KLSAgICByZXR1cm4gbXlzZWxmOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2lsbCBsZXZlcmFnZSB0aGUgZWxlbWVudFByb3BlcnR5UHJvdmlkZXJzIGV4dGVuc2lvbiBwb2ludCB0byBhZGQgYWRkaXRpb25hbCAKLSAgICogY3VzdG9tIHByb3BlcnRpZXMgdG8gdGhlIHhtbCBkb2N1bWVudCB1c2VkIHRvIHB1Ymxpc2ggYWdhaW5zdCB0aGUgWFNMVCB0ZW1wbGF0ZXMuIEEgbmV3IGNoaWxkCi0gICAqIGVsZW1lbnQgd2lsbCBiZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSBuYW1lIHByb3ZpZGUgYnkgdGhlIHByb3ZpZGVyLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogICAgICAgTWV0aG9kRWxlbWVudAotICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICogICAgICAgWG1sRWxlbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgbG9hZEFkZGl0aW9uYWxFbGVtZW50UHJvcGVydGllcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIFhtbEVsZW1lbnQgZG9jdW1lbnQpIHsKLSAgICAvLyBMb2FkIHRoZSBwcm92aWRlcnMgaWYgdGhleSBoYXZlbid0IGJlZW4gbG9hZGVkIGFscmVhZHkuCi0gICAgaWYgKHByb3ZpZGVycyA9PSBudWxsKSB7Ci0gICAgICBsb2FkUHJvdmlkZXJzKCk7Ci0gICAgfQotICAKLSAgICAvLyBOb3cgZm9yIGVhY2ggcHJvdmlkZXIgaGF2ZSB0aGVtIGxvYWQgcHJvcGVydGllcyBhcyBuZWVkZWQuIElmIGEgbnVsbCBpcyByZXR1cm5lZCBmb3IgdGhlIG5hbWUsIAotICAgIC8vIHNraXAgdGhlIHByb3ZpZGVyLgotICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHByb3ZpZGVycy5zaXplKCk7IGlkeCArKykgewotICAgICAgSUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHByb3ZpZGVyID0gcHJvdmlkZXJzLmdldChpZHgpOwotICAgICAgU3RyaW5nIGNoaWxkTmFtZSA9IHByb3ZpZGVyLmdldENoaWxkRWxlbWVudE5hbWUoZWxlbWVudCk7Ci0gICAgICBpZiAoY2hpbGROYW1lICE9IG51bGwgJiYgY2hpbGROYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICBYbWxFbGVtZW50IGNoaWxkRWxlbWVudCA9IGRvY3VtZW50Lm5ld0NoaWxkKGNoaWxkTmFtZSk7Ci0gICAgICAgIHByb3ZpZGVyLnB1Ymxpc2hNZXRob2RFbGVtZW50UHJvcGVydGllcyhlbGVtZW50LCBjaGlsZEVsZW1lbnQpOwotICAgICAgfQotICAgIH0gCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBsb2FkUHJvdmlkZXJzKCkgewotICAgIHByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyPigpOwotICAgIElFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLSAgICBpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvdmlkZXJzLmFkZCgoSUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyKSBjb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1NfQVRUUklCX05BTUUpKTsKLSAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9IdG1sQnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9IdG1sQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDM5ZGQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSHRtbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JMThuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlRpbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBIVE1MIHBhZ2UgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEh0bWxCdWlsZGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHhzbFBhcmFtcyA9IG51bGw7Ci0KLQlwcml2YXRlIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1nciA9IG51bGw7Ci0KLQlwcml2YXRlIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGludGVybmFsX21nciA9IG51bGw7Ci0KLQkvL3ByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBzY2FuQ29udGVudCA9IHRydWU7Ci0KLQkvLyBJZiB0cnVlLCBkaXNwbGF5IHRoZSAiU2hvdyB0cmVlIGJyb3dzZSIgaW1hZ2UvbGluayB0byB0aGUgcmlnaHQgb2YgYQotCS8vIHB1Ymxpc2hlZCBwYWdlLgotCXByaXZhdGUgYm9vbGVhbiBzaG93VHJlZUJyb3dzZXIgPSBmYWxzZTsKLQotCS8vcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0JLy8gb3ZlcnJpZGUgdGhpcyBwYXRoIHRvIHNwZWNpZnkgeHNsIHBhdGgKLQlwcml2YXRlIFN0cmluZyBsYXlvdXRYc2xSb290UGF0aCA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFhzbFBhdGgoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIdG1sQnVpbGRlcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIdG1sQnVpbGRlcihFbGVtZW50TGF5b3V0TWFuYWdlciBtZ3IpIHsKLQkJaW5pdCgpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKG1ncik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExheW91dFhzbFJvb3RQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoIHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCApIHsKLQkJCQl0aGlzLmxheW91dFhzbFJvb3RQYXRoID0gcGF0aDsKLQkJCQlpZiAoICF0aGlzLmxheW91dFhzbFJvb3RQYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSApIHsKLQkJCQkJdGhpcy5sYXlvdXRYc2xSb290UGF0aCArPSBGaWxlLnNlcGFyYXRvcjsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZ2V0IHRoZSBsb2NhbGl6ZWQgZmlsZQotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMubGF5b3V0WHNsUm9vdFBhdGgsICJyZXNvdXJjZXMucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQkJU3RyaW5nIGxvY2FsRmlsZU5hbWUgPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKCBsb2NhbEZpbGVOYW1lICE9IG51bGwgKSB7Ci0JCQkJCWZpbGUgPSBuZXcgRmlsZShsb2NhbEZpbGVOYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJeHNsUGFyYW1zLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQkJfQkKLQkJCQkKLQkJCQkvLyB0aGUgUHJlZmVyZW5jZVV0aWwgYWxzbyB1c2VzIHRoZSB4c2wgcHJvcGVydGllcyBmb3IgYWN0aXZpdHkgYnJlYWtkb3duIGxheW91dAotCQkJCS8vIHNvIHNldCBpdCBhcyB3ZWxsCi0JCQkJUHJlZmVyZW5jZVV0aWwuc2V0WHNsUHJvcGVydGllcyh4c2xQYXJhbXMpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCWxvYWREZWZhdWx0TGF5b3V0WHNsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlZmF1bHRMYXlvdXRYc2woKSB7Ci0JCWxheW91dFhzbFJvb3RQYXRoID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0WHNsUGF0aCgpOwotCQl0cnkgewotCQkJeHNsUGFyYW1zID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy8gYWRkIHRoZSBjb2xvbiBwcm9wZXJ0eSwgCi0JCQl4c2xQYXJhbXMucHV0KCJjb2xvbl93aXRoX3NwYWNlIiwgTGlicmFyeVJlc291cmNlcy5jb2xvbl93aXRoX3NwYWNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyB0aGUgUHJlZmVyZW5jZVV0aWwgYWxzbyB1c2VzIHRoZSB4c2wgcHJvcGVydGllcyBmb3IgYWN0aXZpdHkgYnJlYWtkb3duIGxheW91dAotCQkJLy8gc28gc2V0IGl0IGFzIHdlbGwKLQkJCVByZWZlcmVuY2VVdGlsLnNldFhzbFByb3BlcnRpZXMoeHNsUGFyYW1zKTsKLQotCQkJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXhzbFBhcmFtcyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gKG1nciA9PSBudWxsKSA/IG51bGwgOiBtZ3IuZ2V0UHVibGlzaERpcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIGRpcikgewotCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCW1nci5zZXRQdWJsaXNoRGlyKGRpcik7Ci0JCX0KLQotCQkvL2dldFNjYW5uZXIoKS5zZXRUYXJnZXRSb290UGF0aChuZXcgRmlsZShnZXRQdWJsaXNoRGlyKCkpKTsKLQotCQkvLyBSZXNldCB0aGUgdmFsaWRhdG9yJ3MgcHVibGlzaCBkaXIuCi0JCWdldFZhbGlkYXRvcigpLnNldFB1Ymxpc2hEaXIoZGlyKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogU2V0cyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLS8vCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLS8vCQlnZXRTY2FubmVyKCkuc2V0VmFsaWRhdG9yKHRoaXMudmFsaWRhdG9yKTsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBJQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0vLwkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0vLwkJCXZhbGlkYXRvciA9IG5ldyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcihnZXRQdWJsaXNoRGlyKCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gdmFsaWRhdG9yOwotCQkKLQkJcmV0dXJuIHRoaXMubWdyLmdldFZhbGlkYXRvcigpOwotCX0KLQotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlc291cmNlIHNjYW5uZXIgZm9yIHRoZSBlbGVtZW50LgotLy8JICovCi0vLwlwcml2YXRlIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgZ2V0U2Nhbm5lcihNZXRob2RFbGVtZW50IG93bmVyKSB7Ci0vLwkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotLy8JCWlmICggcmVzTWdyID09IG51bGwgKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQkKLS8vCQlTdHJpbmcgcm9vdENvbnRlbnRQYXRoID0gcmVzTWdyLmdldExvZ2ljYWxQbHVnaW5QYXRoKG93bmVyKTsKLS8vCQlGaWxlIHNyY19yb290ID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChvd25lcikpOwotLy8JCUZpbGUgdGd0X3Jvb3QgPSBuZXcgRmlsZShnZXRQdWJsaXNoRGlyKCksIHJvb3RDb250ZW50UGF0aCk7Ci0vLwkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoc3JjX3Jvb3QsIHRndF9yb290LCByb290Q29udGVudFBhdGgsIGdldFZhbGlkYXRvcigpKTsKLS8vCi0vLwkJcmV0dXJuIHNjYW5uZXI7Ci0vLwl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmbGFnIHRvIGRpc3BsYXkgdGhlICJTaG93IHRyZWUgYnJvd3NlciIgaW1hZ2UvbGluay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVUcmVlQnJvd3Nlcihib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5zaG93VHJlZUJyb3dzZXIgPSBmbGFnOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMgY29udGVudCBzY2FubmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVDb250ZW50U2Nhbihib29sZWFuIHNjYW4pIHsKLQkJdGhpcy5zY2FuQ29udGVudCA9IHNjYW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb250ZW50IHNjYW5uaW5nIGlzIGVuYWJsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGVudFNjYW5FbmFibGVkKCkgewotCQlyZXR1cm4gc2NhbkNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgRWxlbWVudCBMYXlvdXQgTWFuYWdlci4KLQkgKiA8cD4KLQkgKiBBIEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXRNYW5hZ2VyKEVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1ncikgewotCQl0aGlzLm1nciA9IG1ncjsKLQkJaWYgKHRoaXMubWdyID09IG51bGwpIHsKLQkJCXRoaXMubWdyID0gZ2V0RGVmYXVsdExheW91dE1hbmFnZXIoKTsgCi0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHNjYW5uZXIgdGFyZ2V0IHBhdGguCi0JCS8vZ2V0U2Nhbm5lcigpLnNldFRhcmdldFJvb3RQYXRoKG5ldyBGaWxlKGdldFB1Ymxpc2hEaXIoKSkpOwotCi0JCS8vIFJlc2V0IHRoZSB2YWxpZGF0b3IgcHViIGRpci4KLQkJZ2V0VmFsaWRhdG9yKCkuc2V0UHVibGlzaERpcihnZXRQdWJsaXNoRGlyKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgRWxlbWVudCBMYXlvdXQgTWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldERlZmF1bHRMYXlvdXRNYW5hZ2VyKCkgewotCQlpZiAoIHRoaXMuaW50ZXJuYWxfbWdyID09IG51bGwgKSB7Ci0JCQl0aGlzLmludGVybmFsX21nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCQl9Ci0JCQotCQlyZXR1cm4gdGhpcy5pbnRlcm5hbF9tZ3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRWxlbWVudCBMYXlvdXQgTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWFuYWdlcigpIHsKLQkJaWYgKHRoaXMubWdyID09IG51bGwpIHsKLQkJCXRoaXMubWdyID0gZ2V0RGVmYXVsdExheW91dE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbWdyOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBNZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIEEgdXJsIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudCBIVE1MIGZpbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUh0bWwoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB1cmwgPSBudWxsOwotCQlpZiAoZGVidWcpIHsKLQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0TGF5b3V0KGVsZW1lbnQsIHRydWUpOwotCQkJdXJsID0gZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCQlsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlRpbWUgdGFrZW4gdG8gcmVuZGVyIEhUTUwgcGFnZSBmb3IgIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSI6ICIgKyAoZW5kVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0TWFuYWdlcigpLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLQkJCXVybCA9IGdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgVGhlIFVSTCBvZiBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGdlbmVyYXRlSHRtbChTdHJpbmcgdXJsKSB7Ci0JCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IGdldExheW91dE1hbmFnZXIoKS5nZXRMYXlvdXQodXJsKTsKLQkJZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIEVsZW1lbnQuIExheW91dCBvYmplY3QuCi0JICogQHBhcmFtIGxpbmtlZEVsZW1lbnRzCi0JICogICAgICAgICAgICBJZiBub3QgbnVsbCwgdGhpcyBvYmplY3Qgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIGxpc3Qgb2YKLQkgKiAgICAgICAgICAgIGxpbmtlZCBlbGVtZW50cyBpbiB0aGUgcGFnZS4KLQkgKiBAcmV0dXJuIEEgdXJsIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudCBIVE1MIGZpbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUh0bWwoSUVsZW1lbnRMYXlvdXQgbGF5b3V0KSB7Ci0JCWlmIChsYXlvdXQgPT0gbnVsbCkgewotCQkJcmV0dXJuICJhYm91dDpibGFuayI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogZ2VuZXJhdGVIdG1sOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGF5b3V0LmdldEVsZW1lbnQoKSkgKTsKLQkJCi0JCS8vIGFkZCB0aW1lIGxvZ2dpbmcgd2hlbiBwdWJsaXNoaW5nIGVsZW1lbnQKLQkJbG9uZyB0aW1lX3N0YXJ0ID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gbGF5b3V0LmdldEZpbGVQYXRoKCkucmVwbGFjZSgnLycsCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJU3RyaW5nIGVsZW1lbnRQYXRoTmFtZSA9IGVsZW1lbnRQYXRoCi0JCQkJKyBsYXlvdXQuZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCVN0cmluZyBmaWxlUGF0aCA9IHRoaXMuZ2V0UHVibGlzaERpcigpICsgZWxlbWVudFBhdGg7Ci0JCVN0cmluZyBodG1sX2ZpbGUgPSB0aGlzLmdldFB1Ymxpc2hEaXIoKSArIGVsZW1lbnRQYXRoTmFtZTsKLQotCQl0cnkgewotCi0JCQlTdHJpbmdCdWZmZXIgeG1sID0gZ2V0WG1sKGxheW91dCk7Ci0KLQkJCVN0cmluZyB4c2xfdXJpOwotCi0JCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0JCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQlmLm1rZGlycygpOwotCQkJfQotCi0JCQkvLyBHZW5lcmF0ZSB0aGUgYWRkaXRvbmFsIG91dHB1dHMuCi0JCQlMaXN0IGxheW91dHMgPSBsYXlvdXQuZ2V0TGF5b3V0cygpOwotCQkJeHNsX3VyaSA9IGxheW91dFhzbFJvb3RQYXRoICsgbGF5b3V0LmdldFhzbFVybCgpOwotCQkJZ2VuZXJhdGVIdG1sKGxheW91dCwgeHNsX3VyaSwgaHRtbF9maWxlLCB4bWwpOwotCi0JCQkvLyBHZW5lcmF0ZSBvdGhlciBsYXlvdXQgZmlsZXMuCi0JCQlpZiAobGF5b3V0cyAhPSBudWxsICYmIGxheW91dHMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJTGF5b3V0SW5mbyBpbmZvID0gKExheW91dEluZm8pIGl0Lm5leHQoKTsKLQkJCQkJeHNsX3VyaSA9IGxheW91dFhzbFJvb3RQYXRoICsgaW5mby5sYXlvdXRfeHNsOwotCQkJCQlTdHJpbmcgZmlsZSA9IGZpbGVQYXRoICsgaW5mby5maWxlTmFtZTsKLQkJCQkJZ2VuZXJhdGVIdG1sKGxheW91dCwgeHNsX3VyaSwgZmlsZSwgeG1sKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJaHRtbF9maWxlID0gbnVsbDsKLQkJfQotCi0JCWxvbmcgdGltZV9lbmQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCQlsb25nIG1pbmlfc2Vjb25kcyA9IHRpbWVfZW5kIC0gdGltZV9zdGFydDsKLQkJaWYgKG1pbmlfc2Vjb25kcyA+IDEwMDApIHsKLQkJCVN0cmluZyBtc2cgPSBtaW5pX3NlY29uZHMKLQkJCQkJKyAiIG1pbmktc2Vjb25kKHMpIHB1Ymxpc2hpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGF5b3V0LmdldEVsZW1lbnQoKSkgKyAiWyIgKyBlbGVtZW50UGF0aE5hbWUgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoKTsKLQkJCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWxpZGF0b3IubG9nSW5mbyhtc2cpOwotCQkJfQotCQl9Ci0JCWlmIChodG1sX2ZpbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGh0bWxfZmlsZTsKLQkJfQotCi0JCXJldHVybiAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIEVsZW1lbnQuIExheW91dCBvYmplY3QuCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0LgotCSAqIEBwYXJhbSBodG1sRmlsZQotCSAqICAgICAgICAgICAgVGhlIEhUTUwgZmlsZSB0byBiZSBnZW5lcmF0ZWQuCi0JICogQHBhcmFtIHhtbAotCSAqICAgICAgICAgICAgVGhlIFhNTCBidWZmZXIuCi0JICogQHJldHVybiBBIHVybCBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQgSFRNTCBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUh0bWwoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LAotCQkJU3RyaW5nIHhzbF91cmksIFN0cmluZyBodG1sX2ZpbGUsIFN0cmluZ0J1ZmZlciB4bWwpIHsKLQkJVGhyb3dhYmxlIHRoID0gbnVsbDsKLQkJaWYgKGxheW91dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQl0aW1lciA9IG5ldyBUaW1lcigpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQkJCVN0cmluZyBjb250ZW50ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQotCQkJaWYgKCBkZWJ1ZykgewotCQkJCXRpbWVyLnN0b3AoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgZm9yIHhtbC94c2x0IHRyYW5zZm9ybWF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aW1lci5zdGFydCgpOwotCQkJfQotCQkJLy8gQWx3YXlzIHZhbGlkYXRlIGFuZCBmaXggdGhlIGNvbnRlbnQgYmVmb3JlIHB1Ymxpc2hpbmcuCi0JCQljb250ZW50ID0gUmVzb3VyY2VIZWxwZXIudmFsaWRhdGVDb250ZW50KGxheW91dC5nZXRFbGVtZW50KCksCi0JCQkJCWNvbnRlbnQsIGdldFZhbGlkYXRvcigpLCBsYXlvdXQuZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpLCB0aGlzLmxheW91dFhzbFJvb3RQYXRoKTsKLQkJCWlmIChjb250ZW50U2NhbkVuYWJsZWQoKSkgewotLy8JCQkJc2NhbkNvbnRlbnRGb3JSZXNvdXJjZXMobGF5b3V0LmdldEVsZW1lbnQoKSwgY29udGVudCwgbGF5b3V0Ci0vLwkJCQkJCS5nZXRGaWxlUGF0aCgpKTsKLQkJCQlnZXRWYWxpZGF0b3IoKS5zY2FuQ29udGVudChsYXlvdXQsIGNvbnRlbnQpOwotCQkJfQotCi0JCQlpZiAoIGRlYnVnKSB7Ci0JCQkJdGltZXIuc3RvcCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBzY2FubmluZyBjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aW1lci5zdGFydCgpOwotCQkJfQotCQkJCi0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oaHRtbF9maWxlKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dHB1dC53cml0ZShjb250ZW50KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRoID0gZTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aCA9IGU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aCA9IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGggPSBlOwotCQl9Ci0KLQkJaWYgKHRoICE9IG51bGwpIHsKLQkJCXRoaXMuZ2V0VmFsaWRhdG9yKCkubG9nRXJyb3IobGF5b3V0LmdldEVsZW1lbnQoKSwKLQkJCQkJIkVycm9yIGdlbmVyYXRpbmcgZWxlbWVudCBjb250ZW50IiwgdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxheW91dAotCSAqICAgICAgICAgICAgQSBNZXRob2QgRWxlbWVudC4gTGF5b3V0IG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgdXJsIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudCBIVE1MIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZ2V0WG1sKElFbGVtZW50TGF5b3V0IGxheW91dCkgewotCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlYbWxFbGVtZW50IHhtbEVsZW1lbnQgPSBsYXlvdXQuZ2V0WG1sRWxlbWVudCh0cnVlKTsKLQkJCi0JCS8vIHNldCB0aGUgbGFuZ3VhZ2UgYXR0cmlidXRlCi0JCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQlTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQl4bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgibGFuZyIsIGxhbmcpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHNob3dUcmVlQnJvd3NlcikgewotCQkJeG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoInNob3dUcmVlQnJvd3NlciIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHhtbF9maWxlID0gdGhpcy5nZXRQdWJsaXNoRGlyKCkgKyAieG1sIiArIEZpbGUuc2VwYXJhdG9yOyAvLyROT04tTkxTLTEkCi0JCQkJeG1sX2ZpbGUgKz0gbGF5b3V0LmdldFR5cGUoKSArICIuIiArIGxheW91dC5nZXRGaWxlTmFtZSgiLnhtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlGaWxlIHhmID0gbmV3IEZpbGUoeG1sX2ZpbGUpOwotCQkJCWlmICggIXhmLmV4aXN0cygpICkKLQkJCQl7Ci0JCQkJCXhmLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQkJeGYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCX0KLQkJCQkJCQkKLQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKHhmKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlvdXRwdXQud3JpdGUoeG1sLnRvU3RyaW5nKCkpOwotCQkJCW91dHB1dC5mbHVzaCgpOwotCQkJCW91dHB1dC5jbG9zZSgpOwotCQotCQkJCS8vIEZpbGVXcml0ZXIgeHcgPSBuZXcgRmlsZVdyaXRlcih4bWxfZmlsZSk7Ci0JCQkJLy8geHcud3JpdGUoeG1sLnRvU3RyaW5nKCkpOwotCQkJCS8vIHh3LmZsdXNoKCk7Ci0JCQkJLy8geHcuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4geG1sOwotCX0KLQotLy8JLyoqCi0vLwkgKiBTY2FucyB0aGUgY29udGVudCBmb3IgcmVzb3VyY2UgcmVmZXJlbmNlcy4KLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHNjYW5Db250ZW50Rm9yUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBjb250ZW50LAotLy8JCQlTdHJpbmcgY29udGVudFBhdGgpIHsKLS8vCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBnZXRTY2FubmVyKG93bmVyKTsKLS8vCQlpZiAoIHNjYW5uZXIgIT0gbnVsbCApIHsKLS8vCQkJc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBjb250ZW50LCBjb250ZW50UGF0aCk7Ci0vLwkJfQotLy8JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLS8vCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLS8vCQkJdmFsaWRhdG9yLmRpc3Bvc2UoKTsKLS8vCQl9Ci0KLQkJaWYgKCBpbnRlcm5hbF9tZ3IgIT0gbnVsbCApIHsKLQkJCWludGVybmFsX21nci5jbGVhcigpOwotCQkJaW50ZXJuYWxfbWdyID0gbnVsbDsKLQkJfQotCQkKLQkJbWdyID0gbnVsbDsKLS8vCQlzY2FubmVyID0gbnVsbDsKLS8vCQl2YWxpZGF0b3IgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUNvbnRlbnRWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUNvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0NThlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0lDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBpbnRlcmZhY2UgZm9yIGNvbnRlbnQgdmFsaWRhdG9yIGF0IGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50VmFsaWRhdG9yICB7Ci0KLQkvKioKLQkgKiBzZXQgcHVibGlzaCBkaXIKLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIHB1YkRpcik7Ci0JCi0JLyoqCi0JICogc2hvdyBicm9rZW4gbGlua3MgaWYgdHJ1ZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dCcm9rZW5MaW5rcygpOwotCQotCXB1YmxpYyB2b2lkIHNjYW5Db250ZW50KElFbGVtZW50TGF5b3V0IGxheW91dCwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb247Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgbGluayBhdHRyaWJ1dGUgYW5kIGxpbmtlZCB0ZXh0IGZvciB0aGUgb3duaW5nIGVsZW1lbnQgd2l0aGluIHRoZSBjb25maWd1cmF0aW9uLiAKLQkgKiBSZXR1cm5zIGEgTGlua0luZm8gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvd25lciB7QGxpbmsgTWV0aG9kRWxlbWVudH0gdGhlIG93bmVyIGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBTdHJpbmcgdGhlIHVybCBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIHRleHQgU3RyaW5nIHRoZSBsaW5rZWQgdGV4dAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB0YWcgdGhlIEhUTUwgdGFnIChhLCBhcmVhKQotCSAqIEByZXR1cm4gTGlua0luZm8KLQkgKi8KLQlwdWJsaWMgTGlua0luZm8gdmFsaWRhdGVMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBhdHRyaWJ1dGVzLAotCQkJU3RyaW5nIHRleHQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdGFnKTsKLQotCS8qKgotCSAqIGxvZyB0aGUgaW5mbyBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGEgbWlzc2luZyByZWZlcmVuY2UKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIHJlZmVybmVjZWQgZWxlbWVudCB0aGF0IGlzIG1pc3NpbmcgaW4gY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCk7Ci0KLQkvKioKLQkgKiBsb2cgYSBtaXNzaW5nIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIGd1aWQgU3RyaW5nIHRoZSByZWZlcmVuY2VkIGd1aWQgd2hpY2ggaXMgbm90IGEgdmFsaWQgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbnkgbW9yZQotCSAqIEBwYXJhbSBsaW5rZWRUZXh0IFN0cmluZyB0aGUgbGlua2VkIHRleHQgYWxvbmcgd2l0aCB0aGUgbGluay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBndWlkLAotCQkJU3RyaW5nIGxpbmtlZFRleHQpOwotCi0JLyoqCi0JICogbG9nIGEgbWlzc2luZyByZXNvdXJjZSAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIKLQkgKiBAcGFyYW0gcmVzb3VyY2VGaWxlIEZpbGUgdGhlIGZpbGUgdGhhdCBvd25lZCBieSB0aGUgZWxlbWVudCBhbmQgcmVmZXJlbmNlcyB0aGUgbWlzaW5nIHJlc291cmNlLCAKLQkgKiBudWxsIGlmIHRoZSBtaXNpbmcgcmVmZXJlbmNlIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGVsZW1lbnQgaXRzZWxmIAotCSAqIEBwYXJhbSB1cmwgU3RyaW5nIHRoZSB1cmwgdGhhdCBjYW4ndCBiZSByZXNvdmxlZCB0byBhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCVN0cmluZyB1cmwpOwotCi0JLyoqCi0JICogbG9nbiBhIHdhcm5pbmcgbWVzc2FnZQotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBsb2cgYW4gZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICogQHBhcmFtIHRoIFRocm93YWJsZSwgbnVsbCBpZiBub3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKTsKLQotCS8qKgotCSAqIGxvZyBhbiBpbnZhbGlkIGV4dGVybmFsIGxpbmsKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSB1cmwgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBsb2cgYSBtZXNzYWdlCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBsb2cgYSB3YXJuaW5nCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0gCSAqLwotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGFuIGVycm9yCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICogQHBhcmFtIHRoIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpOwotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgZGlzY2FyZGVkIG9yIG5vdAotCSAqIGRpc2NhcmRlZCBlbGVtZW50cyB3aWxsIGJlIHRyZWF0ZWQgYXMgb3V0IHNpZGUgdGhlIGNvbmZpZ3Vyc2F0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIG9mIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIE9iamVjdCBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvciBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NhcmRlZChNZXRob2RFbGVtZW50IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlKTsKLQotCS8qKgotCSAqIHNldCBhbiBkaXNjYXJkZWQgZWxlbWVudAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBvYmplY3QgYW5kIGZyZWUgcmVzb3VyY2VzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0JCQotCS8qKgotCSAqIGFkZCBhIHJlZmVybmVjZWQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5IHRoZSBvd25lciBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvd25lciwgTWV0aG9kRWxlbWVudCBlKTsKLQkJCi0JLyoqCi0JICogZ2V0IHRoZSBmbGFnIGFib3V0IHNob3dpbmcgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGlua2VkIGVsZW1lbnRzIGZvciBkZXNjcmlwdG9ycwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogc2hvdyBkZXNjcmlwdG9ycyBvbiBtZXRob2QgZWxlbWVudCBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycygpOwotCQotCS8qKgotCSAqIGdldCB0aGUgdGFiIGlkIGZvciB0aGUgYWN0aXZpdHkgbGF5b3V0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRBY3Rpdml0eVRhYigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JRWxlbWVudExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JRWxlbWVudExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjI5MjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUVsZW1lbnRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBlbGVtZW50IGxheW91dC4gYW55IGVsZW1lbnQgbGF5b3V0IHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiBBbiBlbGVtZW50IGxheW91dCBkZWZpbmVzIGhvdyB0aGUgZWxlbWVudCBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGlkLCB3aGljaCBpcyB0aGUgZWxlbWVudCdzIEdVSUQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogdGhlIHJlYWxpemVkIHByZXNlbnRhdGlvbiBuYW1lIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiB0aGUgdXJsIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpOwotCi0JLyoqCi0JICogdGhlIHVybCBmb3Igc2hhcGUgaWNvbiBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZWljb25VcmwoKTsKLQotCS8qKgotCSAqIHRoZSB1cmwgZm9yIG5vZGUgaWNvbiBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvblVybCgpOwotCi0JLyoqCi0JICogdGhlIHVybCBmb3IgZGlhZ3JhbSBpY29uIG9mIHRoZSBlbGVtZW50LCAKLQkgKiBmb3IgZXhhbXBsZSwgdGhlIGljb24gZm9yIGEgcm9sZSBpbiB0aGUgcm9sZS10YXNrLXdwIHJlbGF0aW9uc2hpcCBkaWFncmFtLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtaWNvblVybCgpOyAvLyBpY29uIGZvciBkaWFncmFtIHN1Y2ggYXMgUm9sZSBkaWFncmFtCi0KLQkvKioKLQkgKiB0aGUgbGF5b3V0IHhzbCB1cmwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WHNsVXJsKCk7Ci0KLQkvKioKLQkgKiB0aGUgYmFjayBwYXRoIG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIHJvb3QgZGlyLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrUGF0aCgpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgcm9vdAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gYW5vdGhlciBlbGVtZW50LiBUaGlzIGlzIHRoZQotCSAqIHJlbGF0aXZlVG8uYmFja3BhdGggKyB0aGlzLmVsZW1lbnRwYXRoCi0JICogCi0JICogQHBhcmFtIHJlbGF0aXZlVG8KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoSUVsZW1lbnRMYXlvdXQgcmVsYXRpdmVUbyk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZSBvZiB0aGUgZWxlbWVudCwgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGV4dGVuc2lvbiwgc3VjaCBhcyAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IG1hbmFnZXIgZm9yIHJhbmRlcmluZyB0aGUgbGF5b3V0IG9mIHRoZSBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gRWxlbWVudExheW91dE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFhtbEVsZW1lbnQgZm9yIHRoZSBlbGVtZW50IGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIHRydWUgdG8gaW5jbHVkZSB0aGUgeG1sIG9mIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuIGZhbHNlIHRvCi0JICogICAgICAgICAgICBpZ25vcmUgdGhlIHhtbCBvZiB0aGUgcmVmZXJlbmNlcy4KLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMYXlvdXRzKCk7Ci0KLQotCS8qKgotCSAqIGlmIHRoZSBlbGVtZW50J3MgY29udGVudCBpcyB0YXJnZXQgZm9yIGFub3RoZXIgZWxlbWVudCwgc2V0IGl0IGhlcmUuIGZvcgotCSAqIGV4YW1wbGUsIHN0ZXAgY29udGVudCBjYXQgdGFyZ2V0IGZvciBhIFRhc2sgb3IgYSB0YXNrIGRlc2NyaXB0b3IKLQkgKiBjb3B5cmlnaHQgY29udGVudCBjYW4gdGFyZ2V0IHRvIGRpZmZlcmVudCBlbGVtZW50cy4KLQkgKiAKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRoYXQgdGhlIHN5c3RlbSB3aWxsIGZpeCB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQKLQkgKiB0byByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFRhcmdldChNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQpOwotCi0JLyoqCi0JICogbmVlZCB0byBzZXQgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IGxheW91dCBlbGVtZW50LiBJbiBtb3N0IGNhc2VzIHRoaXMKLQkgKiBzaG91bGQgYmUgdGhlIGVDb250YWluZXIgb2YgdGhlIGVsZW1lbnQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gc29tZQotCSAqIHNpdHVhdGlvbiB0aGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIG93bmVyIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLgotCSAqIEZvciBleGFtcGxlLCB0aGUgQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCdzIGVDb250aW5lciBpcyBudWxsIGlmIHRoZQotCSAqIGNvbnRlbnQgZmlsZSBpcyBub3Qgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE93bmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpOwotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGh0bWwgY29udGVudCBnZW5lcmF0ZWQgZnJvbSB0aGlzIHhzbCBmaWxlIG5lZWRzIHRvIGJlIHNjYW5uZWQgb3Igbm90Ci0JICogc2NhbiB0aGUgY29udGVudCBpcyBmb3IgaWRlbnRpZnlpbmcgZWxlbWVudCByZWZlcmVuY2VzIGluIHRoZSBjb250ZW50IGFuZCBjb3B5IG92ZXIgcmVzb3VyY2UgZmlsZXMKLQkgKiBpbiBzb21lIGNhc2VzIHdlIGRvbid0IG5lZWQgdG8gc2NhbiB0aGUgY29udGVudCwgZm9yIGV4YW1wbGUsIHRoZSBhY3Rpdml0eSBicmVha2Rvd24gc3RydWN0dXJlCi0JICogCi0JICogQHBhcmFtIHhzbFVybCB0aGUgeHNsIHRoYXQgaHRtbCBpcyBnZW5lcmF0ZWQgZnJvbSwgbnVsbCBmb3IgdGhlIGRlZmF1bHQgeHNsIGxheW91dAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRDb250ZW50U2NhbihTdHJpbmcgeHNsVXJsKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2hvdwotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGlzIG5vdCBuZWVkZWQgYW55IG1vcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93RWxlbWVudExpbmsoYm9vbGVhbiBzaG93KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMmFjZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsYXlvdXQgZXh0ZW5kc2lvbgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXlvdXRFeHRlbnNpb24gewotCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1ncjsKLQkKLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgTGF5b3V0RXh0ZW5zaW9uKCkgewotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IpIHsKLQkJdGhpcy5sYXlvdXRNZ3IgPSBsYXlvdXRNZ3I7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBFbGVtZW50UmVhbGl6ZXIgZ2V0RWxlbWVudFJlYWxpemVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIGFic3RyYWN0IElDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpOwotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MTZiN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgTGF5b3V0RXh0ZW5zaW9uIGNvbnRyaWJ1dGlvbnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExheW91dEV4dGVuc2lvbkZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJlbGVtZW50TGF5b3V0RXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQl9OQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJpZCIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUklCX05BTUUgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExheW91dEV4dGVuc2lvbkZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8gQSBtYXAgb2YgbGlicmFyeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYXlvdXRFeHRlbnNpb25FbGVtZW50PiBsYXlvdXRFbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGF5b3V0RXh0ZW5zaW9uRWxlbWVudD4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBMYXlvdXRFeHRlbnNpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUklCX05BTUUpOwotCQkJCQkJU3RyaW5nIGlkID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKElEX0FUVFJJQl9OQU1FKTsKLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBpZCAhPSBudWxsICYmIGlkLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsJCQkJCQkJCi0JCQkJCQkJTGF5b3V0RXh0ZW5zaW9uRWxlbWVudCBwcm92aWRlciA9IGxheW91dEVsZW1lbnRzLmdldChpZCk7Ci0JCQkJCQkJaWYocHJvdmlkZXIgPT0gbnVsbCApIHsKLQkJCQkJCQkJcHJvdmlkZXIgPSBuZXcgTGF5b3V0RXh0ZW5zaW9uRWxlbWVudCgKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgaWQpOwotCQkJCQkJCQlsYXlvdXRFbGVtZW50cy5wdXQoaWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0V4dGVuc2lvbihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGxheW91dEVsZW1lbnRzLmNvbnRhaW5zS2V5KGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBsYXlvdXQgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgZXh0ZW5zaW9uIGlkCi0JICogQHJldHVybiBMYXlvdXRFeHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgTGF5b3V0RXh0ZW5zaW9uIGNyZWF0ZUV4dGVuc2lvbihTdHJpbmcgaWQpIHsKLQkJCi0JCWlmICggIWhhc0V4dGVuc2lvbihpZCkgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJTGF5b3V0RXh0ZW5zaW9uRWxlbWVudCBwcm92aWRlciA9IChMYXlvdXRFeHRlbnNpb25FbGVtZW50KSBsYXlvdXRFbGVtZW50cy5nZXQoaWQpOwotCQl0cnkgewotCQkJQ2xhc3MgY2xhenogPSBwcm92aWRlci5idW5kbGUubG9hZENsYXNzKHByb3ZpZGVyLmNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gKExheW91dEV4dGVuc2lvbikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIExheW91dEV4dGVuc2lvbkVsZW1lbnQgewotCQlCdW5kbGUgYnVuZGxlOwotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQlTdHJpbmcgaWQ7Ci0JCXByaXZhdGUgTGF5b3V0RXh0ZW5zaW9uRWxlbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaWQpIHsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg4NWE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi0vKioKLSAqIGxMeW91dCBpbmZvIGZvciBhbiBlbGVtZW50LgotICogPHA+Ci0gKiBUaGlzIGlzIHVzZWQgd2hlbiBhbiBlbGVtZW50IG91dHB1dCBtb3JlIHRoZW4gb25lIGxheW91dCwgc3VjaCBhcyBhY3Rpdml0eQotICogdGFicwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0SW5mbyB7Ci0KLQlwdWJsaWMgTGF5b3V0SW5mbyhTdHJpbmcgbmFtZSwgU3RyaW5nIHhzbCwgU3RyaW5nIGZpbGVOYW1lLAotCQkJYm9vbGVhbiBpc1ByaW1hcnkpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5sYXlvdXRfeHNsID0geHNsOwotCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCXRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotCX0KLQotCS8qKgotCSAqIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiB0aGUgbGF5b3V0IHhzbCBmaWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxheW91dF94c2w7Ci0KLQkvKioKLQkgKiB0aGUgb3V0b3V0IGZpbGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZmlsZU5hbWU7Ci0KLQkvKioKLQkgKiBpcyB0aGlzIHRoZSBwcmltYXJ5IGxheW91dD8gdGhpcyBhcHBseSB0byB0aGUgY2FzZSB3aGVuIG9uZSBlbGVtZW50IGhhcyBtb3JlIHRoYW4gb25lIGxheW91dC4KLQkgKiAgRm9yIGV4YW1wbGUsIGFuIGFjdGl2aXR5IGVsZW1lbnQgaGFzIDQgbGF5b3V0cy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQ1NTQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db3B5OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4cGFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBhIHV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIGxheW91dCByZWxhdGVkIHJlc291cmNlcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExheW91dFJlc291cmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHNoYXBlaWNvbkJ1bmRsZTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBURU1QX0xBWU9VVF9ESVIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGtnID0gTGF5b3V0UmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgcmVzb3VyY2UgPSBMYXlvdXRSZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2UpOwotCQkJc2hhcGVpY29uQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHBrZwotCQkJCQkrICIuRGVmYXVsdFNoYXBlaWNvbnMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvKgotCQkJICogVEVNUF9MQVlPVVRfRElSID0gZ2V0U3RyaW5nKCJ0ZW1wX2xheW91dF9kaXIiKTsgaWYgKAotCQkJICogVEVNUF9MQVlPVVRfRElSICE9IG51bGwgKSB7IFRFTVBfTEFZT1VUX0RJUiA9Ci0JCQkgKiBURU1QX0xBWU9VVF9ESVIucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7IH0KLQkJCSAqLwotCi0JCQkvLyBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgRVBGIHJ1bm5pbmcgZGlmZmVyZW50IGxpYnMgYXJlIHNoYXJpbmcgdGhlIHNhbWUgbGF5b3V0IGRpcmVjdG9yeQotCQkJLy8gdXNlIHRpbWVzdGFtcCB0byBpZGVudGlmeSBlYWNoIGluc3RhbmNlCi0JCQkvLyB3ZSBuZWVkIHRvIGNsZWFuIHRoZSBmaWxlcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBleGl0CQkJCi0JCQlTdHJpbmcgdXNlckhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlURU1QX0xBWU9VVF9ESVIgPSB1c2VySG9tZSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgIkVQRiIgKyBGaWxlLnNlcGFyYXRvciArICJsYXlvdXQiICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKSArIEZpbGUuc2VwYXJhdG9yOwotCQkJCi0JCQlGaWxlIHJ1cFRtcERpciA9IG5ldyBGaWxlKFRFTVBfTEFZT1VUX0RJUik7Ci0JCQlpZiAoIXJ1cFRtcERpci5leGlzdHMoKSkgewotCQkJCXJ1cFRtcERpci5ta2RpcnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMocnVwVG1wRGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJeC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNhbGwgdGhpcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBleGl0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkKLQl7Ci0JCXRyeSB7Ci0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhURU1QX0xBWU9VVF9ESVIpOwotCQkJCi0JCQkvLyBhbHNvIGRlbGV0ZSB0aGUgZm9sZGVyCi0JCQluZXcgRmlsZShURU1QX0xBWU9VVF9ESVIpLmRlbGV0ZSgpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQkvLyBhbHNvIHJlc2V0IHRoZSBicm93c2VyIHNldHRpbmdzIHNvIHRoYXQgdGhlIGxheW91dCBkYXRhIHdpbGwgYmUgY29waWVkCi0JCUJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0Q2hhbmdlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGRlZmF1bHQgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFB1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiBURU1QX0xBWU9VVF9ESVI7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4c2wgdXJpIGZvciB0aGUgZ2l2ZW4ga2V5cwotCSAqIEBwYXJhbSBrZXkgU3RyaW5nCi0JICogQHBhcmFtIHNlY29uZEtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRYc2xQYXRoKFN0cmluZyBrZXksIFN0cmluZyBzZWNvbmRLZXkpIHsKLQkJU3RyaW5nIHVybCA9IGdldFhzbFVyaShrZXksIHNlY29uZEtleSk7Ci0KLQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkvLyByZXNvbHZlIHRoZSBmaWxlCi0JCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0WHNsUGF0aCgpICsgdXJsOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4c2wgdXJpIGZvciB0aGUgZ2l2ZW4ga2V5cwotCSAqIEBwYXJhbSBrZXkgU3RyaW5nCi0JICogQHBhcmFtIHNlY29uZEtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhzbFVyaShTdHJpbmcga2V5LCBTdHJpbmcgc2Vjb25kS2V5KSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRTdHJpbmcocmVzb3VyY2VCdW5kbGUsIGtleS50b0xvd2VyQ2FzZSgpKTsKLQkJaWYgKCh1cmwgPT0gbnVsbCkgJiYgKHNlY29uZEtleSAhPSBudWxsKSkgewotCQkJdXJsID0gZ2V0U3RyaW5nKHJlc291cmNlQnVuZGxlLCBzZWNvbmRLZXkudG9Mb3dlckNhc2UoKSk7Ci0JCX0KLQotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXVybCA9IGdldFN0cmluZyhyZXNvdXJjZUJ1bmRsZSwgImRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQlyZXR1cm4gdXJsOyAKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBkZWZhdWx0IHNoYXBlIGljb24gdXJsCi0JICogQHBhcmFtIGtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRTaGFwZWljb25VcmwoU3RyaW5nIGtleSkgewotCQlTdHJpbmcgdXJsID0gZ2V0U3RyaW5nKHNoYXBlaWNvbkJ1bmRsZSwga2V5KTsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQl1cmwgPSBnZXRTdHJpbmcoc2hhcGVpY29uQnVuZGxlLCAiZ2VuZXJhbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IG51bGw7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCByZXNvdXJjZSBzdHJpbmcgZm9yIHRoZSBrZXkKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKHJlc291cmNlQnVuZGxlLCBrZXkpOwotCX0KLQotCS8qKgotCSAqIGNvcHkgZmlsZXMgZnJvbSBvbmUgZGlyIHRvIGFub3RoZXIKLQkgKiBAcGFyYW0gZnJvbURpciBTdHJpbmcKLQkgKiBAcGFyYW0gdG9EaXIgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoU3RyaW5nIGZyb21EaXIsIFN0cmluZyB0b0RpcikgewotCi0JCVN0cmluZyBpbmNsdWRlcyA9ICIqLiosICoqL2Nzcy8qLiosICoqL2ljb25zLyouKiwgKiovaW1hZ2VzLyouKiwgKiovcmVzb3VyY2VzLyouKiwgKiovc3R5bGVzaGVldHMvKi4qLCAqKi9zY3JpcHRzLyouKiI7IC8vJE5PTi1OTFMtMSQKLQkJY29weURpcihmcm9tRGlyLCB0b0RpciwgaW5jbHVkZXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNvcHkgZmlsZXMgZnJvbSBvbmUgZGlyIHRvIGFub3RoZXIsIHdpdGggZmlsdGVycwotCSAqIEBwYXJhbSBmcm9tRGlyIFN0cmluZwotCSAqIEBwYXJhbSB0b0RpciBTdHJpbmcKLQkgKiBAcGFyYW0gaW5jbHVkZXMgU3RyaW5nCi0JICogQHBhcmFtIGV4Y2x1ZGVzIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKFN0cmluZyBmcm9tRGlyLCBTdHJpbmcgdG9EaXIsIFN0cmluZyBpbmNsdWRlcywKLQkJCVN0cmluZyBleGNsdWRlcykgewotCQljb3B5RGlyKG5ldyBGaWxlKGZyb21EaXIpLCBuZXcgRmlsZSh0b0RpciksIGluY2x1ZGVzLCBleGNsdWRlcyk7Ci0JfQotCi0JLyoqCi0JICogY29weSBkaXIKLQkgKiAKLQkgKiBAcGFyYW0gZnJvbURpciBGaWxlCi0JICogQHBhcmFtIHRvRGlyIEZpbGUKLQkgKiBAcGFyYW0gaW5jbHVkZXMgU3RyaW5nCi0JICogQHBhcmFtIGV4Y2x1ZGVzIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpciwgU3RyaW5nIGluY2x1ZGVzLAotCQkJU3RyaW5nIGV4Y2x1ZGVzKQotCXsKLQkJY29weURpcihmcm9tRGlyLCB0b0RpciwgaW5jbHVkZXMsIGV4Y2x1ZGVzLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogY29weSBkaXIKLQkgKiBAcGFyYW0gZnJvbURpciBGaWxlCi0JICogQHBhcmFtIHRvRGlyIEZpbGUKLQkgKiBAcGFyYW0gaW5jbHVkZXMgU3RyaW5nCi0JICogQHBhcmFtIGV4Y2x1ZGVzIFN0cmluZwotCSAqIEBwYXJhbSBvdmVyd3JpdGUgYm9vbGVhbiB0cnVlIHRvIG92ZXJyaWRlIGV4aXN0aW5nIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoRmlsZSBmcm9tRGlyLCBGaWxlIHRvRGlyLCBTdHJpbmcgaW5jbHVkZXMsCi0JCQlTdHJpbmcgZXhjbHVkZXMsIGJvb2xlYW4gb3ZlcndyaXRlKSB7Ci0JCUNvcHkgY3AgPSBuZXcgQ29weSgpOwotCQljcC5zZXRPdmVyd3JpdGUob3ZlcndyaXRlKTsgLy8gb25seSBjcG95IG5ldyBmaWxlcyBvciBuZXdlciBmaWxlcwotCQlpZiAoaW5jbHVkZXMgIT0gbnVsbCB8fCBleGNsdWRlcyAhPSBudWxsKSB7Ci0JCQlGaWxlU2V0IHNldCA9IG5ldyBGaWxlU2V0KCk7Ci0JCQlpZiAoaW5jbHVkZXMgIT0gbnVsbCkgewotCQkJCXNldC5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7Ci0JCQl9Ci0KLQkJCWlmIChleGNsdWRlcyAhPSBudWxsKSB7Ci0JCQkJc2V0LnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKLQkJCX0KLQotCQkJc2V0LnNldERpcihmcm9tRGlyKTsKLQkJCWNwLmFkZEZpbGVzZXQoc2V0KTsKLQkJfQotCi0JCWNwLnNldFRvZGlyKHRvRGlyKTsKLQkJY3Auc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJY3AuZXhlY3V0ZSgpOwotCi0JfQotCi0JLyoqCi0JICogY29weSB0aGUgbGF5b3V0IGZpbGVzIGZyb20gdGhlIGxpYnJhcnkgbGF5b3V0IHBhdGggdG8gdGhlIHNwZWNpZmllZAotCSAqIHB1Ymxpc2ggZm9sZGVyCi0JICogCi0JICogQHBhcmFtIHRvRGlyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlMYXlvdXRGaWxlcyhTdHJpbmcgdG9EaXIpIHsKLQkJLy8gY29weSB0aGUgbGF5b3V0IGZpbGVzIHRvIHRoZSB0ZW1wIGZvbGRlcgotCQlTdHJpbmcgc291cmNlRGlyID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0UGF0aCgpOwotCQljb3B5RGlyKHNvdXJjZURpciwgdG9EaXIpOwotCi0JCXRyeSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5jb3B5TG9jYWxpemVkRmlsZXMoCi0JCQkJCUxpYnJhcnlQbHVnaW4uTEFZT1VUX1NDUklQVFNfUEFUSCwKLQkJCQkJbmV3IEZpbGUodG9EaXIsIExpYnJhcnlQbHVnaW4uTEFZT1VUX1NDUklQVFNfRk9MREVSKSwgdHJ1ZSwKLQkJCQkJZmFsc2UpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW56aXAoRmlsZSB6aXBGaWxlLCBGaWxlIHRvRGlyKSB7Ci0JCUV4cGFuZCBleHAgPSBuZXcgRXhwYW5kKCk7Ci0JCWV4cC5zZXRPdmVyd3JpdGUodHJ1ZSk7IAotCQlleHAuc2V0U3JjKHppcEZpbGUpOwotCQlleHAuc2V0RGVzdCh0b0Rpcik7Ci0JCWV4cC5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotCQlleHAuZXhlY3V0ZSgpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMTBmOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMKLSMgdXJscyBzdGFydCB3aXRoIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSB0cmVhdGVkIGFzIGV4dGVybmFsIHVybHMsIHVzZSB8IHRvIHNwZXJhdGUgCi0jCi0jZXh0ZXJuYWxVcmxfc3RhcnRXaXRoPWh0dHA6Ly98aHR0cHM6Ly98ZnRwOi8vCi0jIHNlZSBhbGwgdGhlIHBvc3NpYmxlIHByb3RvY2FscyBhdDoKLSMgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy91cmktc2NoZW1lcy5odG1sCi1leHRlcm5hbFVybF9zdGFydFdpdGg9W2EtekEtWjAtOVxcLl17MSwxNX06Ly8KLQotIyBYU0wgU3R5bGVzaGVldCBNYXBwaW5nIGZvciB0aGUgTWV0aG9kIEVsZW1lbnRzLgotCi0jIENvcmUgTWV0aG9kIEVsZW1lbnRzCi1hcnRpZmFjdD1hcnRpZmFjdC54c2wKLWRlbGl2ZXJhYmxlPWRlbGl2ZXJhYmxlLnhzbAotb3V0Y29tZT1vdXRjb21lLnhzbAotcm9sZT1yb2xlLnhzbAotdGFzaz10YXNrLnhzbAotCi0jIEd1aWRhbmNlCi1jaGVja2xpc3Q9Y2hlY2tsaXN0LnhzbAotY29uY2VwdD1ndWlkYW5jZS54c2wKLWV4YW1wbGU9Z3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAotZ3VpZGVsaW5lPWd1aWRhbmNlLnhzbAotcHJhY3RpY2U9cHJhY3RpY2UueHNsCi1yZXBvcnQ9Z3VpZGFuY2UueHNsCi1yb2FkbWFwPWd1aWRhbmNlLnhzbAotcmV1c2FibGVhc3NldD1ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCi1zdXBwb3J0aW5nbWF0ZXJpYWw9Z3VpZGFuY2UueHNsCi10ZW1wbGF0ZT1ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCi10ZXJtZGVmaW5pdGlvbj1ndWlkYW5jZS54c2wKLXRvb2xtZW50b3I9Z3VpZGFuY2UueHNsCi13aGl0ZXBhcGVyPWd1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKLWVzdGltYXRpb25jb25zaWRlcmF0aW9ucz1ndWlkYW5jZS54c2wKLQotIyBDb250ZW50IENhdGVnb3JpZXMKLWN1c3RvbWNhdGVnb3J5PWNvbnRlbnRjYXRlZ29yeS54c2wKLWRpc2NpcGxpbmU9Y29udGVudGNhdGVnb3J5LnhzbAotZGlzY2lwbGluZWdyb3VwaW5nPWNvbnRlbnRjYXRlZ29yeS54c2wKLWRvbWFpbj1jb250ZW50Y2F0ZWdvcnkueHNsCi1yb2xlc2V0PWNvbnRlbnRjYXRlZ29yeS54c2wKLXJvbGVzZXRncm91cGluZz1jb250ZW50Y2F0ZWdvcnkueHNsCi10b29sPWNvbnRlbnRjYXRlZ29yeS54c2wKLXdvcmtwcm9kdWN0dHlwZT1jb250ZW50Y2F0ZWdvcnkueHNsCi0KLSMgUHJvY2VzcyBFbGVtZW50cwotIyBhY3Rpdml0eSBsYXlvdXQgdXNlIHRoZSBkZWZhdWx0IHRhYiBsYXlvdXQgeHNsCi0jd2FzIHVzaW5nIGEgcmVmcmVzaCB0byBzaG93IHRoZSBkZWZhdWx0IHBhZ2UKLSNidXQgY2F1c2VkIHByb2JsZW0gaW4gdGhlIG5hdmlnYXRpb24gaGlzdG9yeSBiYWNrL2ZvcndhcmQgaW4gYnJvd3NpbmcKLSNzbyBzd2l0Y2ggdG8gdGhlIG9sZCB3YXkgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgbGF5b3V0IHVzaW5nIHRoZSBzZXQgZGVmYXVsdCB0YWIKLSMKLSNhY3Rpdml0eT1hY3Rpdml0eS54c2wKLSNjYXBhYmlsaXR5cGF0dGVybj1hY3Rpdml0eS54c2wKLSNkZWxpdmVyeXByb2Nlc3M9YWN0aXZpdHkueHNsCi0jaXRlcmF0aW9uPWFjdGl2aXR5LnhzbAotI3BoYXNlPWFjdGl2aXR5LnhzbAotI3Byb2Nlc3M9YWN0aXZpdHkueHNsCi0jcHJvY2Vzc2NvbnRyaWJ1dGlvbj1hY3Rpdml0eS54c2wKLQotIyBEZXNjcmlwdG9ycwotY29tcG9zaXRlcm9sZT1jb21wb3NpdGVyb2xlLnhzbAotbWlsZXN0b25lPW1pbGVzdG9uZS54c2wKLXJvbGVkZXNjcmlwdG9yPXJvbGVfZGVzY3JpcHRvci54c2wKLXRhc2tkZXNjcmlwdG9yPXRhc2tfZGVzY3JpcHRvci54c2wKLXRlYW1wcm9maWxlPXRlYW1wcm9maWxlLnhzbAotd29ya3Byb2R1Y3RkZXNjcmlwdG9yPWFydGlmYWN0X2Rlc2NyaXB0b3IueHNsCi0KLSMgTWlzYwotZGVmYXVsdD1kZWZhdWx0LnhzbAotZ2VuZXJhbD1nZW5lcmFsLnhzbAotcGFnZV9ub3RfaW5zdGFsbGVkPXBhZ2Vfbm90X2luc3RhbGxlZC54c2wKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGlua0luZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGlua0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0NTdhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xpbmtJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLQotLyoqCi0gKiBjbGFzcyB0byBwcm9jZXNzIGFuIGVsZW1lbnQgbGluayBpbiB0aGUgY29udGVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlua0luZm8gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX0dVSUQgPSAiZ3VpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9IUkVGID0gImhyZWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfS0VZID0gImtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbGlua2VkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbGlua0VsZW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNNaXNzaW5nUmVmZXJlbmNlID0gZmFsc2U7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCXByaXZhdGUgU3RyaW5nIHB1YkRpcjsKLQkKLQlwcml2YXRlIFN0cmluZyB0YWc7Ci0JCi0JLy9UZW1wIHNvbHV0aW9uIGZvciBnZXR0aW5nIGFyb3VuZCB3aXRob3V0IGhhdmluZyBhIGxpYk1nciBkdXJpbmcgbWlncmF0aW9uCi0JLy9TaG91bGQgYmUgcmVtb3ZlZCB3aGVuIGxpYiBsb2FkZWQgZHVyaW5nIG1pZ3JhdGlvbiBpcyByZWdpc3RlZCB3aXRoIExpYiBzZXJ2aWNlLgotCXByaXZhdGUgc3RhdGljIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBwdWJEaXIKLQkgKi8KLQlwdWJsaWMgTGlua0luZm8oTWV0aG9kRWxlbWVudCBvd25lciwgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yLAotCQkJU3RyaW5nIHB1YkRpciwgU3RyaW5nIHRhZykgewotCQl0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyOwotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JCXRoaXMudGFnID0gdGFnOwotCX0KLQotCS8qKgotCSAqIGlzIHRoaXMgYW4gZWxlbWVudCBsaW5rPwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudExpbmsoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5pc0VsZW1lbnRMaW5rKGdldEVsZW1lbnRMaW5rVHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgbGluayB0eXBlCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRMaW5rVHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShMSU5LX0FUVFJfQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZCBvZiB0aGUgZWxlbWVudCBsaW5rCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEd1aWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoTElOS19BVFRSX0dVSUQpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdXJsIG9mIHRoZSBsaW5rCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShMSU5LX0FUVFJfSFJFRik7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsaW5rZWQgdGV4dAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5rZWRUZXh0KCkgewotCQlyZXR1cm4gbGlua2VkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpbmtlZCBlbGVtZW50Ci0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TGlua2VkRWxlbWVudCgpIHsKLQkJcmV0dXJuIGxpbmtFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgaHRtbCBmb3IgdGhlIGxpbmsuCi0JICogCi0JICogQHBhcmFtIHNob3dCcm9rZW5MaW5rcyBib29sZWFuIHRydWUgdG8gc2hvdyB0aGUgYnJva2VuIGxpbmsgbWFyay4gZmFsc2UgdG8gc2hvdyB0ZXh0IG9ubHkKLQkgKiBAcmV0dXJuIFN0cmluZ0J1ZmZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0SHRtbChib29sZWFuIHNob3dCcm9rZW5MaW5rcykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChpc01pc3NpbmdSZWZlcmVuY2UgJiYgKHB1YkRpciAhPSBudWxsKSkgewotCQkJU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIXNob3dCcm9rZW5MaW5rcykgewotCQkJCWJ1ZmZlci5hcHBlbmQobGlua2VkVGV4dCk7Ci0JCQkJcmV0dXJuIGJ1ZmZlcjsKLQkJCX0KLQotCQkJdXJsID0gZ2V0TWlzc2luZ0VsZW1lbnRVcmwoKTsKLQkJCWJ1ZmZlcgotCQkJCQkuYXBwZW5kKCI8aW1nIGFsdD1cIlwiIHNyYz1cIiIgKyBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChvd25lckVsZW1lbnQpICsgImltYWdlcy9ub19ydXAuZ2lmXCI+JiMxNjA7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlzZXRVcmwodXJsKTsKLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQoIjwiICsgdGFnKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gaXQgPSBhdHRyaWJ1dGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gaXQubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotCQkJU3RyaW5nIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChMSU5LX0FUVFJfSFJFRi5lcXVhbHMoa2V5KQotCQkJCQkmJiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlidWZmZXIuYXBwZW5kKCIgIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKGVudHJ5LmdldEtleSgpKS5hcHBlbmQoIj0iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIlwiIikuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlidWZmZXIuYXBwZW5kKCI+IikuYXBwZW5kKGxpbmtlZFRleHQpLmFwcGVuZCgiPC8iICsgdGFnICsgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBsaW5rIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBTdHJpbmcgdGhlIGxpbmsgYXR0cmlidXRlcwotCSAqIEBwYXJhbSB0ZXh0IFN0cmluZyB0aGUgbGlua2VkIHRleHQKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUxpbmsoU3RyaW5nIGF0dHJpYnV0ZXMsIFN0cmluZyB0ZXh0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5saW5rZWRUZXh0ID0gdGV4dDsKLQotCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF90YWdfYXR0cmlidXRlcy5tYXRjaGVyKGF0dHJpYnV0ZXMpOwotCQl3aGlsZSAobTIuZmluZCgpKSB7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBtMi5ncm91cCgxKS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG0yLmdyb3VwKDMpICE9IG51bGwpIHsKLQkJCQlhdHRyVmFsdWUgPSBtMi5ncm91cCgzKS50cmltKCk7Ci0JCQl9IGVsc2UgaWYgKG0yLmdyb3VwKDIpICE9IG51bGwpIHsKLQkJCQlhdHRyVmFsdWUgPSBtMi5ncm91cCgyKS50cmltKCk7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiBpZiAoYXR0clZhbHVlLnN0YXJ0c1dpdGgoIlwiIikpIHsgYXR0clZhbHVlID0KLQkJCSAqIGF0dHJWYWx1ZS5zdWJzdHJpbmcoMSk7IH0gaWYgKGF0dHJWYWx1ZS5lbmRzV2l0aCgiXCIiKSkgewotCQkJICogYXR0clZhbHVlID0gYXR0clZhbHVlLnN1YnN0cmluZygwLCBhdHRyVmFsdWUubGVuZ3RoKCkgLSAxKTsgfQotCQkJICovCi0KLQkJCS8vIEdWVDogQ2Fubm90IFByZXZpZXcvQnJvd3NlIERlc2NyaXB0aW9uIFRhYiB3aGVuCi0JCQkvLyB0aGUgQ1AgY29udGFpbnMgY2hpbmVzZSBjaGFyYWN0ZXJzCi0JCQkvLyBnZW5lcmF0ZWQgaHRtbCBmcm9tIHhzbHQgZ290IHRoZSBocmVmIHVybHMgZW5jb2RlZC4gd2UgZG9uJ3Qgd2FudAotCQkJLy8gdGhhdCBtYWtlIHN1cmUgZGVjb2RlIHRoZSB1cmwgdXNpbmcgIlVURi04IiBlbmNvZGluZwotCQkJaWYgKGF0dHJOYW1lLmVxdWFscyhMSU5LX0FUVFJfSFJFRikpIHsKLQkJCQl0cnkgewotCQkJCQlhdHRyVmFsdWUgPSBkZWNvZGUoYXR0clZhbHVlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJpYnV0ZU1hcC5wdXQoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCX0KLQotCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQoKTsKLQkJaWYgKGd1aWQgPT0gbnVsbCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIGZpbGUgY29udGFpbnMgZ3VpZCwgaWYgeWVzLCBuZWVkIHRvIGdldCB0aGUgZWxlbWVudAotCQkJU3RyaW5nIHVybCA9IGdldFVybCgpOwotCQkJZ3VpZCA9IFJlc291cmNlSGVscGVyLmdldEd1aWRGcm9tRmlsZU5hbWUodXJsKTsKLQkJCWlmIChndWlkICE9IG51bGwpIHsKLQkJCQlzZXRHdWlkKGd1aWQpOwotCQkJfQotCQl9Ci0KLQkJdmFsaWRhdGVFbGVtZW50VXJsKGNvbmZpZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvZGUoU3RyaW5nIHN0cikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlyZXR1cm4gVVJMRGVjb2Rlci5kZWNvZGUoc3RyLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldCBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCBndWlkCi0JICogQHBhcmFtIGd1aWQgU3RyaW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEd1aWQoU3RyaW5nIGd1aWQpIHsKLQkJYXR0cmlidXRlTWFwLnB1dChMSU5LX0FUVFJfR1VJRCwgZ3VpZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKLQkJYXR0cmlidXRlTWFwLnB1dChMSU5LX0FUVFJfSFJFRiwgdXJsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVFbGVtZW50VXJsKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZyBndWlkID0gZ2V0R3VpZCgpOwotCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBudWxsOwotCQkJZSA9IGdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0KLQkJCS8vIGlmIHByb2Nlc3MgY29tcG9uZW50LCBnZXQgc2hvdyB0aGUgcHJvY2VzcwotCQkJaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJZSA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZSkuZ2V0UHJvY2VzcygpOwotCQkJfQotCi0JCQkvLyAxNTY0NzQgLSBQcm9jZXNzIFBhY2thZ2UgKGVpdGhlciBDUCBwYWNrYWdlIG9yIERQIHBhY2thZ2UpIGNhbgotCQkJLy8gbm90IGJlIGxpbmtlZCBpbiBSVEUKLQkJCS8vIGRvbid0IHNob3cgbGluayBmb3IgcGFja2FnZXMuCi0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCQkJfHwgZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQllID0gbnVsbDsKLQkJCQkvLyByZW1vdmUgdGhlIGxpbmsgYXR5dHJpYnV0ZQotCQkJCXNldFVybChudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlMSA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgY29uZmlnKTsKLQkJCQkJaWYgKGUxICE9IG51bGwpIHsKLQkJCQkJCWUgPSBlMTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlzTWlzc2luZ1JlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCQl2YWxpZGF0b3IubG9nTWlzc2luZ1JlZmVyZW5jZShvd25lckVsZW1lbnQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpc01pc3NpbmdSZWZlcmVuY2UgPSB0cnVlOwotCQkJCXZhbGlkYXRvci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyRWxlbWVudCwgZ3VpZCwgbGlua2VkVGV4dCk7Ci0JCQl9Ci0KLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQlndWlkID0gZS5nZXRHdWlkKCk7Ci0JCQkJc2V0R3VpZChndWlkKTsKLQkJCQlTdHJpbmcgdXJsID0gZ2V0VXJsKCk7Ci0KLQkJCQkvLyB1cmwgY2FuIGJlIG51bGwsIGZvciBleGFtcGxlLCBhbiBlbGVtZW50IGxpbmsgZm9yCi0JCQkJLy8gcHJlc2VudGF0aW9uIG5hbWUsIHN1Y2ggYXMKLQkJCQkvLyA8YSBjbGFzcz0iUHJlc2VudGF0aW9uTmFtZSIKLQkJCQkvLyBndWlkPSJ7RUU5N0E4Q0QtNjZDQS00QTlCLTk4NzEtRTNCOTRDQ0VENTI4fSI+UHJvamVjdAotCQkJCS8vIE1hbmFnZXI8L2E+Ci0JCQkJLy8gd2Ugb25seSBuZWVkIHRvIGdldCB0aGUgZWxlbWVudCBmcm9tIHRoZSBndWlkCi0JCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCXVybCA9IHVybC50cmltKCk7Ci0JCQkJCWlmICghdXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgKLQkJCQkJCQlSZXNvdXJjZUhlbHBlci5VUkxfU1RSX0pBVkFTQ1JJUFQpKSB7Ci0JCQkJCQl1cmwgPSBSZXNvdXJjZUhlbHBlci5nZXRVcmwoZSwgb3duZXJFbGVtZW50LAotCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MLCB1cmwpOwotCQkJCQkJc2V0VXJsKHVybCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaXNFbGVtZW50TGluaygpICYmICF0YWcuZXF1YWxzKCJhcmVhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgdGV4dCA9IFJlc291cmNlSGVscGVyLmdldExpbmtUZXh0KGUsCi0JCQkJCQkJZ2V0RWxlbWVudExpbmtUeXBlKCksIGNvbmZpZyk7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJCS8vIGlmIG51bGwsIGNhbiBiZSB1c2VkIHRleHQsIGRvbid0IHJlc2V0IGl0Ci0JCQkJCQl0aGlzLmxpbmtlZFRleHQgPSB0ZXh0OwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHZhbGlkYXRvci5pc0Rpc2NhcmRlZChvd25lckVsZW1lbnQsIG51bGwsIGUpKSB7Ci0JCQkJCWlzTWlzc2luZ1JlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCXZhbGlkYXRvci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyRWxlbWVudCwgZSk7Ci0JCQkJCWUgPSBudWxsOyAvLyBpZ25vcmUgdGhlIGVsZW1lbnQgc2luY2UgaXQncyBkaXNjYXJkZWQKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubGlua0VsZW1lbnQgPSBlOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlNZXRob2RFbGVtZW50IGU7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBnZXRMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJZSA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJfSBlbHNlIHsKLQkJCWUgPSBnZXRNZXRob2RFbGVtZW50XyhndWlkKTsKLQkJCWlmIChlID09IG51bGwgJiYgbWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJZSA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19QQUdFU19YU0wgPSAicGFnZXNfbm90X2luc3RhbGxlZC8iOwotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBnZXRNaXNzaW5nRWxlbWVudFVybCgpIHsKLQkJaWYgKCFpc01pc3NpbmdSZWZlcmVuY2UpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIHVybCA9IG51bGw7Ci0KLQkJLy8gaWYgKGxpbmtFbGVtZW50ID09IG51bGwpIHsKLQkJLy8gLy8gdGhpcyBpcyBhbiBpbnZhbGlkIGVsZW1lbnQsIG1heWJlIGRlbGV0ZWQgZnJvbSB0aGUgbGlicmFyeQotCQkvLyAvLyBhbHJlYWR5Ci0JCS8vIHVybCA9IFJlc291cmNlSGVscGVyLk1JU1NJTkdfUEFHRVNfRk9MREVSICsgZ2V0R3VpZCgpCi0JCS8vICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gdXJsID0gUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIKLQkJLy8gKyBSZXNvdXJjZUhlbHBlci5nZXRGaWxlTmFtZShsaW5rRWxlbWVudCwKLQkJLy8gUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCS8vIH0KLQotCQl1cmwgPSBSZXNvdXJjZUhlbHBlci5NSVNTSU5HX1BBR0VTX0ZPTERFUiArICJwYWdlc19ub3RfaW5zdGFsbGVkIiAvLyROT04tTkxTLTEkCi0JCQkJKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOwotCi0JCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgdXJsKTsKLQkJRmlsZSBkaXIgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKCFkaXIuZXhpc3RzKCkpIHsKLQkJCWRpci5ta2RpcnMoKTsKLQkJfQotCi0JCS8vIGlmICggIWYuZXhpc3RzKCkgKQotCQl7Ci0JCQkvLyBnZW5lcmF0ZSB0aGUgaHRtbCBmaWxlCi0JCQlYbWxFbGVtZW50IHhtbCA9IG5ldyBYbWxFbGVtZW50KCJFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJCi0JCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQkJCVN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0JCQl4bWwuc2V0QXR0cmlidXRlKCJsYW5nIiwgbGFuZyk7IC8vJE5PTi1OTFMtMSQKLQotCi0JCQlpZiAobGlua0VsZW1lbnQgPT0gbnVsbCkgewotCQkJCXhtbC5zZXRBdHRyaWJ1dGUoImludmFsaWRMaW5rIiwgInRydWUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBnZXRHdWlkKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBsaW5rZWRUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl4bWwKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBnZXRHdWlkKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInR5cGUiLCBsaW5rRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbGlua0VsZW1lbnQuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkicGx1Z2luTmFtZSIsIExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihsaW5rRWxlbWVudCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHhzbFBhdGggPSBMYXlvdXRSZXNvdXJjZXMuZ2V0RGVmYXVsdFhzbFBhdGgoCi0JCQkJCSJwYWdlX25vdF9pbnN0YWxsZWQiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJc2F2ZUh0bWwoeG1sLCB4c2xQYXRoLCBmKTsKLQkJfQotCi0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChvd25lckVsZW1lbnQpLnJlcGxhY2UoCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpCi0JCQkJKyB1cmw7Ci0JfQotCi0JLyoqCi0JICogc2F2ZSBhIGh0bWwgZmlsZSAKLQkgKiBAcGFyYW0geG1sRWxlbWVudAotCSAqIEBwYXJhbSB4c2xfdXJpCi0JICogQHBhcmFtIG91dHB1dEZpbGUKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBpZCBub3QgdXNlZCBhbnkgbW9yZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVIdG1sKFhtbEVsZW1lbnQgeG1sRWxlbWVudCwgU3RyaW5nIHhzbF91cmksIEZpbGUgb3V0cHV0RmlsZSkgewotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIHhtbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXhtbC5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh4bWxFbGVtZW50LnRvWG1sKCkpOwotCi0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSksICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlQcm9wZXJ0aWVzIHhzbFBhcmFtcyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb3BlcnRpZXMoCi0JCQkJCSIvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0KLQkJCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKHhzbF91cmksIHhtbC50b1N0cmluZygpLCB4c2xQYXJhbXMsIG91dHB1dCk7Ci0JCQlvdXRwdXQuZmx1c2goKTsKLQkJCW91dHB1dC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudF8oU3RyaW5nIGd1aWQpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoZ2V0TGlicmFyeSgpID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgZ2V0TGlicmFyeSgpCi0JCQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIHJlc291cmNlU2V0LmdldEVPYmplY3QoZ3VpZCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdGgpIHsKLQkJCQkJLy8gTG9nIGVycm9yIGhlcmUKLQkJCQkJdGgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGdldExpYnJhcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlMaW5rSW5mby5saWJyYXJ5ID0gbGlicmFyeTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1Byb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjhiN2I1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0KLQotLyoqCi0gKiBUaGUgcHJvY2VzcyBmaWx0ZXIgd2l0aCBhZGFwdG9yIGZhY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIgZXh0ZW5kcyBQcm9jZXNzQ29uZmlndXJhdG9yIGltcGxlbWVudHMKLQkJSUFkYXB0ZXJGYWN0b3J5RmlsdGVyIHsKLQotCXByaXZhdGUgRWxlbWVudExheW91dE1hbmFnZXIuTGF5b3V0QWRhcHRlckZhY3RvcnkgZmFjdG9yeTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIHRoZSBmaWx0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBFbGVtZW50TGF5b3V0TWFuYWdlci5MYXlvdXRBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZyk7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnkud2JzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3RvcnkudGJzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5LndwYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS5jYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBhY2NlcHQgdGhlIG9iamVjdCBvciBub3QuCi0JICogQHBhcmFtIG9iaiBPYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZmFjdG9yeSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvUmljaFRleHRDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDFmOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBTcGVjaWFsIGNvbnRlbnQgdmFsaWRhdG9yIGZvciB0aGUgUmljaCBUZXh0IEVkaXRvcgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IgewotCi0JLyoqCi0JICogdmFsaWRhdGVzIGEgVVJMIHdpdGhvdXQgZGVjb2RpbmcgaXQKLQkgKi8KLQlwdWJsaWMgTGlua0luZm8gdmFsaWRhdGVMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBhdHRyaWJ1dGVzLAotCQkJU3RyaW5nIHRleHQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdGFnKSB7Ci0KLQkJTGlua0luZm8gaW5mbyA9IG5ldyBMaW5rSW5mbyhvd25lciwgdGhpcywgcHViRGlyLCB0YWcpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVjb2RlKFN0cmluZyBzdHIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gc3RyOwotCQkJfQotCQl9OwotCQlpbmZvLnZhbGlkYXRlTGluayhhdHRyaWJ1dGVzLCB0ZXh0LCBjb25maWcpOwotCi0JCXJldHVybiBpbmZvOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0RpYWdyYW1JbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vRGlhZ3JhbUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjYjE2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vRGlhZ3JhbUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogY2xhc3MgZm9yIGRpYWdyYW0gbGF5b3V0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUluZm8gZXh0ZW5kcyBNZXRob2RFbGVtZW50RGlhZ3JhbSB7Ci0KLQlwcml2YXRlIGludCBzdXBwcmVzc2VkQ291bnQgPSAwOwotCXByaXZhdGUgaW50IG5vZGVDb3VudCA9IDA7Ci0JCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyhTdHJpbmcgZGlhZ3JhbVR5cGUsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50KTsKLQotCQlzdXBlci5zZXRIVE1MTWFwKG5ldyBIVE1MTWFwKGRpYWdyYW1UeXBlICsgIl8iICsgZWxlbWVudC5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGFkZCBhIGRpYWdyYW0gYXJlYQotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHgKLQkgKiBAcGFyYW0geQotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiBAcGFyYW0gYWx0VGFnCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBcmVhKE1ldGhvZEVsZW1lbnQgZSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0JCQlTdHJpbmcgYWx0VGFnLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJaWYgKCBzdXBwcmVzc2VkICkKLQkJewotCQkJc3VwcHJlc3NlZENvdW50Kys7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChhbHRUYWcgPT0gbnVsbCkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlhbHRUYWcgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCWlmIChhbHRUYWcubGVuZ3RoKCkgPCAxIHx8IGFsdFRhZyA9PSAiIikgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCU9iamVjdCBiYXNlID0gKChBY3Rpdml0eSkgZSkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJYWx0VGFnID0gKChBY3Rpdml0eSkgYmFzZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlICE9IG51bGwpIHsKLQkJCQlhbHRUYWcgPSBlLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWx0VGFnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCVJlY3RhbmdsZSBjb29yZGluYXRlcyA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0JCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGUsIHN1cGVyLmdldE1ldGhvZEVsZW1lbnQoKSwKLQkJCQlSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJSFRNTE1hcCBtYXAgPSBzdXBlci5nZXRIVE1MTWFwKCk7Ci0JCW1hcC5hZGRBcmVhKG5ldyBIVE1MQXJlYShlLmdldEd1aWQoKSwgaHJlZiwgInJlY3QiLCBjb29yZGluYXRlcywgYWx0VGFnKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGdyYXBoaWNhbCBub2RlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEdyYXBoaWNhbE5vZGVzKCkgewotCQlub2RlQ291bnQrKzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlRmlsZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJc3VwZXIuc2V0SW1hZ2VGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChzdXBlcgotCQkJCS5nZXRNZXRob2RFbGVtZW50KCkpCi0JCQkJKyBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG51bWJlciBvZiBhcmVhcwotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRBcmVhQ291bnQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRIVE1MTWFwKCkuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbnVtYmVyIG9mIHN1cHByZXNzZWQgYXJlYXMKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3VwcHJlc3NlZENvdW50KCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZENvdW50OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIG51bWJlciBvZiBncmFwaGljYWwgbm9kZXMgaW4gdGhlIGRpYWdyYW0KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0R3JhcGhpY2FsTm9kZUNvdW50KCkgewotCQlyZXR1cm4gbm9kZUNvdW50OwotCX0KLQkKLQkvKioKLQkgKiBpcyBlbXB0eT8KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkKLQkJcmV0dXJuIGdldEFyZWFDb3VudCgpICsgZ2V0U3VwcHJlc3NlZENvdW50KCkgKyBnZXRHcmFwaGljYWxOb2RlQ291bnQoKSA9PSAwOwotCQkJCQkKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MQXJlYS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxBcmVhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGI5ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxBcmVhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIEhUTUwgQVJFQSB0YWcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWEkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxBcmVhIHsKLQotCXByaXZhdGUgU3RyaW5nIGd1aWQgPSAgbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyBocmVmOwotCi0JcHJpdmF0ZSBTdHJpbmcgc2hhcGU7Ci0KLQlwcml2YXRlIFJlY3RhbmdsZSBjb29yZGluYXRlczsKLQotCXByaXZhdGUgU3RyaW5nIGFsdFRhZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SFRNTEFyZWE8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBIVE1MQXJlYShTdHJpbmcgZ3VpZCwgU3RyaW5nIGhyZWYsIFN0cmluZyBzaGFwZSwgUmVjdGFuZ2xlIGNvb3JkaW5hdGVzLAotCQkJU3RyaW5nIGFsdFRhZykgewotCQl0aGlzLmd1aWQgPSBndWlkOwotCQl0aGlzLmhyZWYgPSBocmVmOwotCQl0aGlzLnNoYXBlID0gc2hhcGU7Ci0JCXRoaXMuY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlczsKLQkJdGhpcy5hbHRUYWcgPSBhbHRUYWc7Ci0JCQotCQkvLyByZW1vdmUgbmV3IGxpbmUgY2hhcmFjdGVycywgb3RoZXJ3aXNlIGl0IHdpbGwgY2F1c2VkIGEgd2hpdGUgc3BhY2UgaW4gdGhlIHB1Ymxpc2hlZCBodG1sCi0JCS8vIG5vdCBhcyBleHBlY3RlZC4gCi0JCS8vIHNlZSBidWcgMDAzODg5NzggLSBFeHRyYSBzcGFjZSBpbiB0aGUgZmx5b3ZlciB0ZXh0IGluIHRoZSBDYXNwaWFuIEphcGFuZXNlIHNpdGUJCQotCQlpZiAoIHRoaXMuYWx0VGFnICE9IG51bGwgKSB7Ci0JCQl0aGlzLmFsdFRhZyA9IHRoaXMuYWx0VGFnLnJlcGxhY2VBbGwoIihccnxcbikrIiwgIiIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZCgpIHsKLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhSRUYuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlKCkgewotCQlyZXR1cm4gc2hhcGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29vcmRpbmF0ZXMuCi0JICovCi0JcHVibGljIFJlY3RhbmdsZSBnZXRDb29yZGluYXRlcygpIHsKLQkJcmV0dXJuIGNvb3JkaW5hdGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFsdCB0YWcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHRUYWcoKSB7Ci0JCXJldHVybiBhbHRUYWc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTE1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwYWJiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIEhUTUwgTUFQIHRhZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MTWFwIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBhcmVhcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SFRNTE1hcDwvY29kZT4uCi0JICovCi0JcHVibGljIEhUTUxNYXAoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBhcmVhIHRvIHRoZSBtYXAuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXJlYShIVE1MQXJlYSBhcmVhKSB7Ci0JCWlmIChhcmVhICE9IG51bGwpIHsKLQkJCWFyZWFzLmFkZChhcmVhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gaXRlcmF0ZSB0aGUgYXJlYXMuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEFyZWFzKCkgewotCQlyZXR1cm4gYXJlYXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBhcmVhcy5zaXplKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9JQWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjNhNTk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9JQWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgewotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCBkaWFncmFtIGltYWdlIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBmaWxlIHVybC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcGVyIE9iamVjdCB0aGUgaXRlbSBwcm92aWRlciB3cmFwcGVyIG9mIHRoZSBhY3Rpdml0eSBlbGVtZW50Ci0JICogQHBhcmFtIGltZ1BhdGggU3RyaW5nIHRoZSBnZW5lcmF0ZWQgaW1hZ2UgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIuCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgSUZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiAgICAgICAgICAgIFN1cHByZXNzaW9uCi0JICogQHJldHVybiBEaWFncmFtSW5mbyB0aGUgZGlhZ3JhbSBpbmZvCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIHNhdmVEaWFncmFtKE9iamVjdCB3cmFwZXIsIFN0cmluZyBpbWdQYXRoLCBTdHJpbmcgZGlhZ3JhbVR5cGUsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKTsKLQkKLQkKLQlwdWJsaWMgQWN0aXZpdHkgZ2V0UmVhbGl6ZWRGb3JVbm1vZGlmaWVkKE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlciwgCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbik7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9NZXRob2RFbGVtZW50RGlhZ3JhbS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL01ldGhvZEVsZW1lbnREaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOWQ1YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL01ldGhvZEVsZW1lbnREaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIGEgcHVibGlzaGVkIGRpYWdyYW0gZm9yIGEgPGNvZGU+TWV0aG9kRWxlbWVudDwvY29kZT4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnREaWFncmFtIHsKLQotCS8vIFRoZSBNZXRob2RFbGVtZW50LgotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JLy8gVGhlIGdlbmVyYXRlZCBKUEVHIGZpbGUgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBpbWFnZUZpbGVOYW1lOwotCi0JLy8gVGhlIEhUTUwgQXJlYSBNYXAuCi0JcHJpdmF0ZSBIVE1MTWFwIGh0bWxNYXA7Ci0KLQkvLyBUaGUgSFRNTCB0aGF0IHJlcHJlc2VudHMgdGhpcyBkaWFncmFtLgotCS8vIHByaXZhdGUgU3RyaW5nIGRpYWdyYW1IVE1MOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Sb2xlRGlhZ3JhbUluZm88L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgPGNvZGU+Q29udGVudEVsZW1lbnQ8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50RGlhZ3JhbShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5NZXRob2RFbGVtZW50PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIHB1Ymxpc2hlZAotCSAqIGRpYWdyYW0uCi0JICogCi0JICogQHJldHVybiBUaGUgPGNvZGU+TWV0aG9kRWxlbWVudDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwdWJsaXNoZWQKLQkgKiAgICAgICAgIGRpYWdyYW0uCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGltYWdlIGZpbGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltYWdlRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBpbWFnZUZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlTmFtZQotCSAqICAgICAgICAgICAgVGhlIGltYWdlIGZpbGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZUZpbGVOYW1lKFN0cmluZyBpbWFnZUZpbGVOYW1lKSB7Ci0JCXRoaXMuaW1hZ2VGaWxlTmFtZSA9IGltYWdlRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFRNTCBBcmVhIE1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBIVE1MIEFyZWEgTWFwLgotCSAqLwotCXB1YmxpYyBIVE1MTWFwIGdldEhUTUxNYXAoKSB7Ci0JCXJldHVybiBodG1sTWFwOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEhUTUwgQXJlYSBNYXAuCi0JICogCi0JICogQHBhcmFtIGh0bWxNYXAKLQkgKiAgICAgICAgICAgIFRoZSBIVE1MIEFyZWEgTWFwLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhUTUxNYXAoSFRNTE1hcCBodG1sTWFwKSB7Ci0JCXRoaXMuaHRtbE1hcCA9IGh0bWxNYXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGRpYWdyYW0uCi0JICogCi0JICogQHJldHVybiBUaGUgSFRNTCBzb3VyY2UgdGhhdCByZXByZXNlbnRzIHRoZSBkaWFncmFtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SFRNTCgpIHsKLQkJU3RyaW5nQnVmZmVyIGh0bWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWh0bWwuYXBwZW5kKCI8cD4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW1hZ2VGaWxlTmFtZSAhPSBudWxsICYmIGh0bWxNYXAgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1hcE5hbWUgPSBodG1sTWFwLmdldE5hbWUoKTsKLQkJCWh0bWwuYXBwZW5kKCI8bWFwIG5hbWU9XCIiKS5hcHBlbmQoaHRtbE1hcC5nZXROYW1lKCkpLmFwcGVuZCgiXCI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJSXRlcmF0b3IgYXJlYXMgPSBodG1sTWFwLmdldEFyZWFzKCk7Ci0JCQl3aGlsZSAoYXJlYXMuaGFzTmV4dCgpKSB7Ci0JCQkJSFRNTEFyZWEgaHRtbEFyZWEgPSAoSFRNTEFyZWEpIGFyZWFzLm5leHQoKTsKLQkJCQlSZWN0YW5nbGUgY29vcmRzID0gaHRtbEFyZWEuZ2V0Q29vcmRpbmF0ZXMoKTsKLQkJCQlodG1sCi0JCQkJCQkuYXBwZW5kKCI8YXJlYSBocmVmPVwiIikuYXBwZW5kKGh0bWxBcmVhLmdldEhyZWYoKSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgiIHNoYXBlPVwiIikuYXBwZW5kKGh0bWxBcmVhLmdldFNoYXBlKCkpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS5hcHBlbmQoIiBjb29yZHM9XCIiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKChpbnQpIGNvb3Jkcy5nZXRYKCkpCi0JCQkJCQkuYXBwZW5kKCIsICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoKGludCkgY29vcmRzLmdldFkoKSkKLQkJCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgoaW50KSAoY29vcmRzLmdldFgoKSArIGNvb3Jkcy5nZXRXaWR0aCgpKSkKLQkJCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgoaW50KSAoY29vcmRzLmdldFkoKSArIGNvb3Jkcy5nZXRIZWlnaHQoKSkpCi0JCQkJCQkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIiBhbHQ9XCIiKS5hcHBlbmQoaHRtbEFyZWEuZ2V0QWx0VGFnKCkpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS5hcHBlbmQoIiB0aXRsZT1cIiIpLmFwcGVuZChodG1sQXJlYS5nZXRBbHRUYWcoKSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgiLz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaHRtbC5hcHBlbmQoIjwvbWFwPiIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sCi0JCQkJCS5hcHBlbmQoIjxpbWcgYm9yZGVyPVwiMFwiIHNyYz1cIiIpLmFwcGVuZChpbWFnZUZpbGVOYW1lKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5hcHBlbmQoIiBhbHQ9XCIiKS5hcHBlbmQobWFwTmFtZSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkuYXBwZW5kKCIgdGl0bGU9XCIiKS5hcHBlbmQobWFwTmFtZSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkuYXBwZW5kKCIgdXNlbWFwPVwiIyIpLmFwcGVuZChtYXBOYW1lKS5hcHBlbmQoIlwiLz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaHRtbC5hcHBlbmQoIjwvcD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gaHRtbC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgeG1sIGVsZW1lbnQgZm9yIHRoZSBkaWFncmFtCi0JICogQHJldHVybiBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpCi0JewotCQlYbWxFbGVtZW50IHhtbEVsZW1lbnQgPSBudWxsOwotCi0JCWlmIChpbWFnZUZpbGVOYW1lICE9IG51bGwgJiYgaHRtbE1hcCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWFwTmFtZSA9IGh0bWxNYXAuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGVzY2FwZWROYW1lID0gU3RyVXRpbC50b0VzY2FwZWRVbmljb2RlKG1hcE5hbWUsIHRydWUpLnJlcGxhY2UoIlxcdSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl4bWxFbGVtZW50ID0gbmV3IFhtbEVsZW1lbnQoIm1hcCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZXNjYXBlZE5hbWUpICAvLyROT04tTkxTLTEkIAotCQkJCS5zZXRBdHRyaWJ1dGUoInNyYyIsIGltYWdlRmlsZU5hbWUpIC8vJE5PTi1OTFMtMSQgCi0JCQkJLnNldEF0dHJpYnV0ZSgiYWx0IiwgbWFwTmFtZSk7ICAvLyROT04tTkxTLTEkIAotCQkJCi0JCQlJdGVyYXRvciBhcmVhcyA9IGh0bWxNYXAuZ2V0QXJlYXMoKTsKLQkJCXdoaWxlIChhcmVhcy5oYXNOZXh0KCkpIHsKLQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IChIVE1MQXJlYSkgYXJlYXMubmV4dCgpOwotCQkJCVJlY3RhbmdsZSBjb29yZHMgPSBodG1sQXJlYS5nZXRDb29yZGluYXRlcygpOwotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgoaW50KSBjb29yZHMuZ2V0WCgpKQotCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoKGludCkgY29vcmRzLmdldFkoKSkKLQkJCQkuYXBwZW5kKCIsICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WCgpICsgY29vcmRzLmdldFdpZHRoKCkpKQotCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoKGludCkgKGNvb3Jkcy5nZXRZKCkgKyBjb29yZHMuZ2V0SGVpZ2h0KCkpKTsKLQkJCQkKLQkJCQkvLyBuZWVkIHRvIGVzY2FwZSB0aGUgdXJsIHNpbmNlIGl0IHdpbGwgYmUgcGFzc2VkIGFzIGEgbGl0ZXJhbCBzdHJpbmcgdG8gYSBqYXZhc2NyaXB0IHZhcmlhYmxlCi0JCQkJeG1sRWxlbWVudC5uZXdDaGlsZCgiYXJlYSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIChodG1sQXJlYS5nZXRHdWlkKCkgPT0gbnVsbCkgPyAiIiA6IGh0bWxBcmVhLmdldEd1aWQoKSApICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiaHJlZiIsIFN0clV0aWwuZXNjYXBlKGh0bWxBcmVhLmdldEhyZWYoKSkpCS8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgic2hhcGUiLCBodG1sQXJlYS5nZXRTaGFwZSgpKQkvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImNvb3JkcyIsIGJ1ZmZlci50b1N0cmluZygpKQkvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImFsdCIsIGh0bWxBcmVhLmdldEFsdFRhZygpKTsJLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4geG1sRWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vUm9sZURpYWdyYW1QdWJsaXNoZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9Sb2xlRGlhZ3JhbVB1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGU0MDU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9Sb2xlRGlhZ3JhbVB1Ymxpc2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgamF2YS5hd3QuQmFzaWNTdHJva2U7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKLWltcG9ydCBqYXZhLmF3dC5UZXh0dXJlUGFpbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZ2VvbS5MaW5lMkQ7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkkxOG5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLlJvbGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0vKioKLSAqIFJlbmRlcnMgdGhlIFJvbGUgZGlhZ3JhbSB1c2luZyBKYXZhMkQgYW5kIHNhdmVzIGl0IGFzIGEgSlBFRyBmaWxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGlhZ3JhbVB1Ymxpc2hlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GT05UX05BTUUgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9GT05UX1NJWkUgPSAxMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1hfTUFSR0lOID0gMjAwOwotCi0JLy8gVGhlIG1heGltdW0gd2lkdGggb2YgdGhlIGdlbmVyYXRlZCBpbWFnZS4KLQlwcml2YXRlIGludCBtYXhJbWFnZVdpZHRoID0gMTAyNDsKLQotCS8vIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLgotCXByaXZhdGUgaW50IG1heEltYWdlSGVpZ2h0ID0gMTAyNDsKLQotCS8vIFRoZSBib3JkZXIgd2lkdGguCi0JcHJpdmF0ZSBpbnQgYm9yZGVyV2lkdGggPSAxMDsKLQotCS8vIFRoZSBib3JkZXIgaGVpZ2h0LgotCXByaXZhdGUgaW50IGJvcmRlckhlaWdodCA9IDEwOwotCi0JLy8gVGhlIGFkZGl0aW9uYWwgc3BhY2luZyBiZWZvcmUgdGhlIGxlZnQtbW9zdCBUYXNrIGFuZC9vciBXb3JrIFByb2R1Y3QKLQkvLyBpbWFnZS4KLQlwcml2YXRlIGludCB4TWFyZ2luID0gMjQwOwotCi0JLy8gVGhlIGhvcml6b250YWwgc3BhY2luZyBiZXR3ZWVuIHRoZSBlbGVtZW50IGltYWdlcy4KLQlwcml2YXRlIGludCB4U3BhY2luZzsKLQotCS8vIFRoZSB2ZXJ0aWNhbCBzcGFjaW5nIGJldHdlZW4gdGhlIGVsZW1lbnQgaW1hZ2VzLgotCXByaXZhdGUgaW50IHlTcGFjaW5nOwotCi0JLy8gVGhlIG1heGltdW4gbnVtYmVyIG9mIHRleHQgbGluZXMgZm9yIHRoZSBlbGVtZW50IGxhYmVscy4KLQlwcml2YXRlIGludCBtYXhUZXh0TGluZXM7Ci0KLQlwcml2YXRlIGludCBsaW5lUGFkZGluZyA9IDEyOwotCi0JcHJpdmF0ZSBGb250IHRleHRGb250ID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW1hZ2VQdWJsaXNoZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBSb2xlRGlhZ3JhbVB1Ymxpc2hlcigpIHsKLQkJLy8gU2VsZWN0IHRoZSBmb250IGZvciByZW5kZXJpbmcgdGhlIGVsZW1lbnQgbmFtZXMuCi0JCVN0cmluZyBmb250TmFtZTsKLQkJaW50IGZvbnRTaXplOwotCQlmb250TmFtZSA9IGdldEZvbnROYW1lKCk7Ci0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQlmb250U2l6ZSA9IEkxOG5VdGlsLmdldEludCgKLQkJCQkJTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfc2l6ZV93aW4zMiwKLQkJCQkJREVGQVVMVF9GT05UX1NJWkUpOwotCQl9IGVsc2UgewotCQkJZm9udFNpemUgPSBJMThuVXRpbC5nZXRJbnQoTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfc2l6ZSwKLQkJCQkJREVGQVVMVF9GT05UX1NJWkUpOwotCQl9Ci0JCWlmIChmb250TmFtZS5zdGFydHNXaXRoKCJbIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZm9udE5hbWUgPSBERUZBVUxUX0ZPTlRfTkFNRTsKLQkJfQotCQl0ZXh0Rm9udCA9IG5ldyBGb250KGZvbnROYW1lLCBGb250LlBMQUlOLCBmb250U2l6ZSk7Ci0KLQkJeE1hcmdpbiA9IEkxOG5VdGlsLmdldEludChMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtX3hNYXJnaW4sCi0JCQkJREVGQVVMVF9YX01BUkdJTik7Ci0KLQkJeFNwYWNpbmcgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0Um9sZURpYWdyYW1Ib3Jpem9udGFsU3BhY2luZygpOwotCQl5U3BhY2luZyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRSb2xlRGlhZ3JhbVZlcnRpY2FsU3BhY2luZygpOwotCQltYXhUZXh0TGluZXMgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEZvbnROYW1lKCkgewotCQlTdHJpbmcgZm9udE5hbWU7Ci0JCWlmIChQbGF0Zm9ybS5nZXROTCgpLnN0YXJ0c1dpdGgoImphIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfamE7Ci0JCQl9IGVsc2UgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV9qYTsKLQkJCX0KLQkJfSBlbHNlIGlmIChQbGF0Zm9ybS5nZXROTCgpLnN0YXJ0c1dpdGgoImtvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfa287Ci0JCQl9IGVsc2UgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV9rbzsKLQkJCX0KLQkJfSBlbHNlIGlmIChQbGF0Zm9ybS5nZXROTCgpLnN0YXJ0c1dpdGgoInpoX1RXIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfemhfVFc7Ci0JCQl9IGVsc2UgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV96aF9UVzsKLQkJCX0KLQkJfSBlbHNlIGlmIChQbGF0Zm9ybS5nZXROTCgpLnN0YXJ0c1dpdGgoInpoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfemg7Ci0JCQl9IGVsc2UgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV96aDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyOwotCQkJfSBlbHNlIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvbnROYW1lOwotCi0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBSb2xlIERpYWdyYW0gSFRNTCBzb3VyY2UgZm9yIHRoZSBnaXZlbiByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBUaGUgUm9sZSBlbGVtZW50LgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHVibGlzaCBwYXRoLgotCSAqIEByZXR1cm4gQSA8Y29kZT5NZXRob2RFbGVtZW50RGlhZ3JhbTwvY29kZT4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZCBkaWFncmFtLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50RGlhZ3JhbSBwdWJsaXNoKFJvbGVMYXlvdXQgcm9sZUxheW91dCwgRmlsZSBwYXRoKSB7Ci0KLQkJUm9sZSByb2xlID0gKFJvbGUpIHJvbGVMYXlvdXQuZ2V0RWxlbWVudCgpOwotCi0JCWlmIChyb2xlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNZXRob2RFbGVtZW50RGlhZ3JhbSBlbGVtZW50RGlhZ3JhbSA9IG5ldyBNZXRob2RFbGVtZW50RGlhZ3JhbShyb2xlKTsKLQotCQkJU3RyaW5nIHB1Ymxpc2hEaXIgPSByb2xlTGF5b3V0LmdldExheW91dE1ncigpLmdldFB1Ymxpc2hEaXIoKTsKLQkJCVN0cmluZyBtYXBOYW1lID0gcm9sZUxheW91dC5nZXREaXNwbGF5TmFtZSgpOwotCQkJaWYgKG1hcE5hbWUgPT0gbnVsbCB8fCBtYXBOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQltYXBOYW1lID0gIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCW1hcE5hbWUgPSBtYXBOYW1lLnJlcGxhY2UoJyAnLCAnXycpOwotCQkJfQotCQkJSFRNTE1hcCBodG1sTWFwID0gbmV3IEhUTUxNYXAobWFwTmFtZSk7Ci0JCQllbGVtZW50RGlhZ3JhbS5zZXRIVE1MTWFwKGh0bWxNYXApOwotCi0JCQkvLyBDcmVhdGUgdGhlIEFXVCBKUGFuZWwgZm9yIHJlbmRlcmluZyB0aGUgZGlhZ3JhbS4KLQkJCUpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSBvdXRwdXQgQnVmZmVyZWRJbWFnZS4KLQkJCUJ1ZmZlcmVkSW1hZ2Ugb3V0cHV0SW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShtYXhJbWFnZVdpZHRoLAotCQkJCQltYXhJbWFnZUhlaWdodCwgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IpOwotCQkJR3JhcGhpY3MyRCBnMmQgPSAoR3JhcGhpY3MyRCkgb3V0cHV0SW1hZ2UuZ2V0R3JhcGhpY3MoKTsKLQotCQkJLy8gU3dpdGNoIG9uIGFudGktYWxpYXNpbmcuCi0JCQlnMmQuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfVEVYVF9BTlRJQUxJQVNJTkcsCi0JCQkJCVJlbmRlcmluZ0hpbnRzLlZBTFVFX1RFWFRfQU5USUFMSUFTX09OKTsKLQkJCWcyZC5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9BTlRJQUxJQVNJTkcsCi0JCQkJCVJlbmRlcmluZ0hpbnRzLlZBTFVFX0FOVElBTElBU19PTik7Ci0JCQlnMmQuZmlsbFJlY3QoMCwgMCwgbWF4SW1hZ2VXaWR0aCwgbWF4SW1hZ2VIZWlnaHQpOwotCi0JCQkvLyBTZXQgdGhlIHN0cm9rZSBmb3IgZHJhd2luZyB0aGUgYXNzb2NpYXRpb24gbGluZXMuCi0JCQlnMmQuc2V0U3Ryb2tlKG5ldyBCYXNpY1N0cm9rZSgxLjI1ZikpOwotCQkJZzJkLnNldENvbG9yKENvbG9yLkJMQUNLKTsKLQotCQkJaW50IHhPZmZzZXQgPSB4U3BhY2luZyAvIDI7Ci0KLQkJCS8vIFJlbmRlcnMgdGhlIFRhc2tzIHBlcmZvcm1lZCBieSB0aGUgUm9sZS4KLQkJCUxpc3QgdGFza3MgPSByb2xlTGF5b3V0LmdldFBlcmZvcm1zKCk7Ci0JCQlpbnQgdG90YWxUYXNrcyA9IHRhc2tzICE9IG51bGwgPyB0YXNrcy5zaXplKCkgOiAwOwotCQkJUG9pbnQgdGFza1N0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoYm9yZGVyV2lkdGggKyB4TWFyZ2luLAotCQkJCQlib3JkZXJIZWlnaHQpOwotCQkJUG9pbnQgdGFza0VuZFBvaW50ID0gbmV3IFBvaW50KGJvcmRlcldpZHRoICsgeE1hcmdpbiwgYm9yZGVySGVpZ2h0KTsKLQkJCWludCB4ID0gdGFza1N0YXJ0UG9pbnQueDsKLQkJCWludCB5ID0gdGFza1N0YXJ0UG9pbnQueTsKLQkJCWludCB0YXNrc0VuZFggPSAwOwotCQkJaWYgKHRvdGFsVGFza3MgPiAwKSB7Ci0JCQkJaW50IHRhc2tObyA9IDE7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gdGFza3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IHRhc2tObysrKSB7Ci0JCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpLm5leHQoKTsKLQotCQkJCQlJRWxlbWVudExheW91dCB0YXNrTGF5b3V0ID0gcm9sZUxheW91dC5nZXRMYXlvdXRNZ3IoKQotCQkJCQkJCS5nZXRMYXlvdXQodGFzaywgdHJ1ZSk7Ci0KLQkJCQkJU3RyaW5nIHRhc2tOYW1lID0gdGFza0xheW91dC5nZXREaXNwbGF5TmFtZSgpOwotCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gcHVibGlzaERpcgotCQkJCQkJCSsgdGFza0xheW91dC5nZXREaWFncmFtaWNvblVybCgpOwotCQkJCQl0cnkgewotCQkJCQkJQnVmZmVyZWRJbWFnZSB0YXNrSW1hZ2UgPSBJbWFnZVV0aWwuZ2V0QnVmZmVyZWRJbWFnZSgKLQkJCQkJCQkJaW1hZ2VGaWxlLCBwYW5lbCk7Ci0JCQkJCQlpbnQgdGFza1dpZHRoID0gdGFza0ltYWdlLmdldFdpZHRoKCk7Ci0JCQkJCQlpbnQgdGFza0hlaWdodCA9IHRhc2tJbWFnZS5nZXRIZWlnaHQoKTsKLQkJCQkJCWlmICh0YXNrTm8gPT0gMSkgewotCQkJCQkJCXRhc2tFbmRQb2ludC54ICs9IHRhc2tXaWR0aDsKLQkJCQkJCQl0YXNrRW5kUG9pbnQueSArPSB0YXNrSGVpZ2h0OwotCQkJCQkJCXRhc2tzRW5kWCA9IHRhc2tFbmRQb2ludC54OwotCQkJCQkJfQotCQkJCQkJUmVjdGFuZ2xlIHRhc2tJbWFnZVJlY3QgPSBuZXcgUmVjdGFuZ2xlKHgsIHksCi0JCQkJCQkJCXRhc2tXaWR0aCwgdGFza0hlaWdodCk7Ci0JCQkJCQlUZXh0dXJlUGFpbnQgdGFza1BhaW50ID0gbmV3IFRleHR1cmVQYWludCh0YXNrSW1hZ2UsCi0JCQkJCQkJCXRhc2tJbWFnZVJlY3QpOwotCQkJCQkJZzJkLnNldFBhaW50KHRhc2tQYWludCk7Ci0JCQkJCQlnMmQuZmlsbCh0YXNrSW1hZ2VSZWN0KTsKLQkJCQkJCWlmICh0YXNrTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJSW1hZ2VVdGlsLmRyYXdUZXh0KGcyZCwgdGFza05hbWUsIHRleHRGb250LAotCQkJCQkJCQkJQ29sb3IuQkxBQ0ssIHggLSB4T2Zmc2V0LCB0YXNrRW5kUG9pbnQueSwKLQkJCQkJCQkJCXRhc2tXaWR0aCArIHhTcGFjaW5nLCBtYXhUZXh0TGluZXMpOwotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgaHJlZiA9IHRhc2tMYXlvdXQuZ2V0RmlsZVBhdGgocm9sZUxheW91dCkKLQkJCQkJCQkJKyB0YXNrTGF5b3V0LmdldEZpbGVOYW1lKCIuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IG5ldyBIVE1MQXJlYSh0YXNrLmdldEd1aWQoKSwgaHJlZiwKLQkJCQkJCQkJInJlY3QiLCB0YXNrSW1hZ2VSZWN0LCB0YXNrTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWh0bWxNYXAuYWRkQXJlYShodG1sQXJlYSk7Ci0KLQkJCQkJCWlmICh4ICsgdGFza1dpZHRoID4gdGFza3NFbmRYKSB7Ci0JCQkJCQkJdGFza3NFbmRYID0geCArIHRhc2tXaWR0aDsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJaW50IHhJbmNyZW1lbnQgPSB0YXNrV2lkdGggKyB4U3BhY2luZzsKLQkJCQkJCQl4ICs9IHhJbmNyZW1lbnQ7Ci0JCQkJCQkJdGFza0VuZFBvaW50LnggKz0geEluY3JlbWVudDsKLQkJCQkJCQlpZiAoKHggKyB4SW5jcmVtZW50ICsgeE9mZnNldCArIGJvcmRlcldpZHRoKSA+IG1heEltYWdlV2lkdGgpIHsKLQkJCQkJCQkJeCA9IHRhc2tTdGFydFBvaW50Lng7Ci0JCQkJCQkJCWludCB5SW5jcmVtZW50ID0gdGFza0hlaWdodCArIHlTcGFjaW5nOwotCQkJCQkJCQl5ICs9IHlJbmNyZW1lbnQ7Ci0JCQkJCQkJCXRhc2tFbmRQb2ludC55ICs9IHlJbmNyZW1lbnQ7Ci0JCQkJCQkJCXRhc2tFbmRQb2ludC54ID0gdGFza1N0YXJ0UG9pbnQueCArIHRhc2tXaWR0aDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVuZGVycyB0aGUgV29yayBQcm9kdWN0cyB0aGF0IHRoZSBSb2xlIGlzIHJlc3BvbnNpYmxlIGZvci4KLQkJCUxpc3Qgd29ya1Byb2R1Y3RzID0gcm9sZUxheW91dC5nZXRSZXNwb25zaWJsZUZvcigpOwotCQkJaW50IHRvdGFsV29ya1Byb2R1Y3RzID0gd29ya1Byb2R1Y3RzICE9IG51bGwgPyB3b3JrUHJvZHVjdHMuc2l6ZSgpCi0JCQkJCTogMDsKLQkJCVBvaW50IHdvcmtQcm9kdWN0U3RhcnRQb2ludCA9IG5ldyBQb2ludCh0YXNrU3RhcnRQb2ludC54LAotCQkJCQlib3JkZXJIZWlnaHQpOwotCQkJUG9pbnQgd29ya1Byb2R1Y3RFbmRQb2ludCA9IG5ldyBQb2ludCh0YXNrU3RhcnRQb2ludC54LAotCQkJCQlib3JkZXJIZWlnaHQpOwotCQkJaWYgKHRvdGFsVGFza3MgPiAwICYmIHRvdGFsV29ya1Byb2R1Y3RzID4gMCkgewotCQkJCXdvcmtQcm9kdWN0U3RhcnRQb2ludC55ID0gdGFza0VuZFBvaW50LnkgKyB5U3BhY2luZyArIHlTcGFjaW5nCi0JCQkJCQkvIDI7Ci0JCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50Lnk7Ci0JCQl9IGVsc2UgaWYgKHRvdGFsVGFza3MgPiAwKSB7Ci0JCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55ID0gdGFza0VuZFBvaW50LnkgKyBib3JkZXJIZWlnaHQ7Ci0JCQl9Ci0JCQl4ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50Lng7Ci0JCQl5ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50Lnk7Ci0JCQlpbnQgd29ya1Byb2R1Y3RzRW5kWCA9IDA7Ci0JCQlpZiAodG90YWxXb3JrUHJvZHVjdHMgPiAwKSB7Ci0JCQkJaW50IHdvcmtQcm9kdWN0Tm8gPSAxOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHdvcmtQcm9kdWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgd29ya1Byb2R1Y3RObysrKSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBpLm5leHQoKTsKLQotCQkJCQlJRWxlbWVudExheW91dCB3cExheW91dCA9IHJvbGVMYXlvdXQuZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkuZ2V0TGF5b3V0KHdvcmtQcm9kdWN0LCB0cnVlKTsKLQotCQkJCQlTdHJpbmcgd29ya1Byb2R1Y3ROYW1lID0gd3BMYXlvdXQuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCQkJU3RyaW5nIGltYWdlRmlsZSA9IHB1Ymxpc2hEaXIKLQkJCQkJCQkrIHdwTGF5b3V0LmdldERpYWdyYW1pY29uVXJsKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlCdWZmZXJlZEltYWdlIHdvcmtQcm9kdWN0SW1hZ2UgPSBJbWFnZVV0aWwKLQkJCQkJCQkJLmdldEJ1ZmZlcmVkSW1hZ2UoaW1hZ2VGaWxlLCBwYW5lbCk7Ci0JCQkJCQlpbnQgd29ya1Byb2R1Y3RXaWR0aCA9IHdvcmtQcm9kdWN0SW1hZ2UuZ2V0V2lkdGgoKTsKLQkJCQkJCWludCB3b3JrUHJvZHVjdEhlaWdodCA9IHdvcmtQcm9kdWN0SW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0JCQkJCQlpZiAod29ya1Byb2R1Y3RObyA9PSAxKSB7Ci0JCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC54ICs9IHdvcmtQcm9kdWN0V2lkdGg7Ci0JCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55ICs9IHdvcmtQcm9kdWN0SGVpZ2h0OwotCQkJCQkJCXdvcmtQcm9kdWN0c0VuZFggPSB3b3JrUHJvZHVjdEVuZFBvaW50Lng7Ci0JCQkJCQl9Ci0JCQkJCQlSZWN0YW5nbGUgd29ya1Byb2R1Y3RJbWFnZVJlY3QgPSBuZXcgUmVjdGFuZ2xlKHgsIHksCi0JCQkJCQkJCXdvcmtQcm9kdWN0V2lkdGgsIHdvcmtQcm9kdWN0SGVpZ2h0KTsKLQkJCQkJCVRleHR1cmVQYWludCB3b3JrUHJvZHVjdFBhaW50ID0gbmV3IFRleHR1cmVQYWludCgKLQkJCQkJCQkJd29ya1Byb2R1Y3RJbWFnZSwgd29ya1Byb2R1Y3RJbWFnZVJlY3QpOwotCQkJCQkJZzJkLnNldFBhaW50KHdvcmtQcm9kdWN0UGFpbnQpOwotCQkJCQkJZzJkLmZpbGwod29ya1Byb2R1Y3RJbWFnZVJlY3QpOwotCQkJCQkJaWYgKHdvcmtQcm9kdWN0TmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJSW1hZ2VVdGlsLmRyYXdUZXh0KGcyZCwgd29ya1Byb2R1Y3ROYW1lLCB0ZXh0Rm9udCwKLQkJCQkJCQkJCUNvbG9yLkJMQUNLLCB4IC0geE9mZnNldCwKLQkJCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueSwgd29ya1Byb2R1Y3RXaWR0aAotCQkJCQkJCQkJCQkrIHhTcGFjaW5nLCBtYXhUZXh0TGluZXMpOwotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgaHJlZiA9IHdwTGF5b3V0LmdldEZpbGVQYXRoKHJvbGVMYXlvdXQpCi0JCQkJCQkJCSsgd3BMYXlvdXQuZ2V0RmlsZU5hbWUoIi5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJSFRNTEFyZWEgaHRtbEFyZWEgPSBuZXcgSFRNTEFyZWEod29ya1Byb2R1Y3QuZ2V0R3VpZCgpLAotCQkJCQkJCQlocmVmLAotCQkJCQkJCQkicmVjdCIsIHdvcmtQcm9kdWN0SW1hZ2VSZWN0LCB3b3JrUHJvZHVjdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlodG1sTWFwLmFkZEFyZWEoaHRtbEFyZWEpOwotCi0JCQkJCQlpZiAoeCArIHdvcmtQcm9kdWN0V2lkdGggPiB3b3JrUHJvZHVjdHNFbmRYKSB7Ci0JCQkJCQkJd29ya1Byb2R1Y3RzRW5kWCA9IHggKyB3b3JrUHJvZHVjdFdpZHRoOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKLQkJCQkJCQlpbnQgeEluY3JlbWVudCA9IHdvcmtQcm9kdWN0V2lkdGggKyB4U3BhY2luZzsKLQkJCQkJCQl4ICs9IHhJbmNyZW1lbnQ7Ci0JCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC54ICs9IHhJbmNyZW1lbnQ7Ci0JCQkJCQkJaWYgKCh4ICsgeEluY3JlbWVudCArIHhPZmZzZXQgKyBib3JkZXJXaWR0aCkgPiBtYXhJbWFnZVdpZHRoKSB7Ci0JCQkJCQkJCXggPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueDsKLQkJCQkJCQkJaW50IHlJbmNyZW1lbnQgPSB3b3JrUHJvZHVjdEhlaWdodCArIHlTcGFjaW5nOwotCQkJCQkJCQl5ICs9IHlJbmNyZW1lbnQ7Ci0JCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueSArPSB5SW5jcmVtZW50OwotCQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnggPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueAotCQkJCQkJCQkJCSsgd29ya1Byb2R1Y3RXaWR0aDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVuZGVyIHRoZSBSb2xlLgotCQkJUG9pbnQgcm9sZVN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoeE9mZnNldCAtIDUsIGJvcmRlckhlaWdodCk7Ci0JCQlQb2ludCByb2xlRW5kUG9pbnQgPSByb2xlU3RhcnRQb2ludDsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHJvbGVOYW1lID0gcm9sZUxheW91dC5nZXREaXNwbGF5TmFtZSgpOwotCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBwdWJsaXNoRGlyICsgcm9sZUxheW91dC5nZXREaWFncmFtaWNvblVybCgpOwotCQkJCUJ1ZmZlcmVkSW1hZ2Ugcm9sZUltYWdlID0gSW1hZ2VVdGlsLmdldEJ1ZmZlcmVkSW1hZ2UoaW1hZ2VGaWxlLAotCQkJCQkJcGFuZWwpOwotCQkJCWludCByb2xlV2lkdGggPSByb2xlSW1hZ2UuZ2V0V2lkdGgoKTsKLQkJCQlpbnQgcm9sZUhlaWdodCA9IHJvbGVJbWFnZS5nZXRIZWlnaHQoKTsKLQkJCQl4ID0geE9mZnNldCAtIDU7Ci0JCQkJeSA9IGJvcmRlckhlaWdodDsKLQkJCQlyb2xlRW5kUG9pbnQueCArPSByb2xlV2lkdGg7Ci0JCQkJcm9sZUVuZFBvaW50LnkgKz0gcm9sZUhlaWdodDsKLQkJCQlpZiAodG90YWxXb3JrUHJvZHVjdHMgPiAwKSB7Ci0JCQkJCXkgPSBib3JkZXJIZWlnaHQKLQkJCQkJCQkrICh3b3JrUHJvZHVjdEVuZFBvaW50LnkgLSB0YXNrU3RhcnRQb2ludC55IC0gcm9sZUhlaWdodCkKLQkJCQkJCQkvIDI7Ci0KLQkJCQkJLy8gUmVuZGVyIHRoZSAicmVzcG9uc2libGUgZm9yIiBhc3NvY2lhdGlvbiBsaW5lLgotCQkJCQlQb2ludCBzdGFydFBvaW50ID0gbmV3IFBvaW50KHggKyByb2xlV2lkdGggKyBsaW5lUGFkZGluZwotCQkJCQkJCS8gMiwgeSArIHJvbGVIZWlnaHQgLyAyKTsKLQkJCQkJaW50IGxpbmVFbmRQb2ludCA9IHdvcmtQcm9kdWN0U3RhcnRQb2ludC54IC0gbGluZVBhZGRpbmc7Ci0JCQkJCWlmIChsaW5lRW5kUG9pbnQgPiAoREVGQVVMVF9YX01BUkdJTiAtIHhTcGFjaW5nIC8gMikpIHsKLQkJCQkJCWxpbmVFbmRQb2ludCA9IChERUZBVUxUX1hfTUFSR0lOIC0geFNwYWNpbmcgLyAyKTsKLQkJCQkJfQotCQkJCQlQb2ludCBlbmRQb2ludCA9IG5ldyBQb2ludCh3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueAotCQkJCQkJCS0gbGluZVBhZGRpbmcsIHdvcmtQcm9kdWN0U3RhcnRQb2ludC55Ci0JCQkJCQkJKyAod29ya1Byb2R1Y3RFbmRQb2ludC55IC0gd29ya1Byb2R1Y3RTdGFydFBvaW50LnkpCi0JCQkJCQkJLyAyKTsKLQkJCQkJcmVuZGVyQXNzb2NpYXRpb24oZzJkLCBzdGFydFBvaW50LCBlbmRQb2ludCwKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtUmVzcG9uc2libGVGb3JfdGV4dCwKLQkJCQkJCQl0ZXh0Rm9udCwgQ29sb3IuQkxBQ0spOwotCQkJCX0gZWxzZSBpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQkJeSA9IGJvcmRlckhlaWdodAotCQkJCQkJCSsgKHRhc2tFbmRQb2ludC55IC0gdGFza1N0YXJ0UG9pbnQueSAtIHJvbGVIZWlnaHQpCi0JCQkJCQkJLyAyOwotCQkJCX0KLQkJCQlyb2xlU3RhcnRQb2ludC55ID0geTsKLQkJCQlyb2xlRW5kUG9pbnQueSA9IHkgKyByb2xlSGVpZ2h0OwotCi0JCQkJaWYgKHRvdGFsVGFza3MgPiAwKSB7Ci0JCQkJCS8vIFJlbmRlciB0aGUgInBlcmZvcm1zIiBhc3NvY2lhdGlvbiBsaW5lLgotCQkJCQlQb2ludCBzdGFydFBvaW50ID0gbmV3IFBvaW50KHggKyByb2xlV2lkdGggKyBsaW5lUGFkZGluZwotCQkJCQkJCS8gMiwgeSArIHJvbGVIZWlnaHQgLyAyKTsKLQkJCQkJaW50IGxpbmVFbmRQb2ludCA9IHRhc2tTdGFydFBvaW50LnggLSBsaW5lUGFkZGluZzsKLQkJCQkJaWYgKGxpbmVFbmRQb2ludCA+IChERUZBVUxUX1hfTUFSR0lOIC0geFNwYWNpbmcgLyAyKSkgewotCQkJCQkJbGluZUVuZFBvaW50ID0gKERFRkFVTFRfWF9NQVJHSU4gLSB4U3BhY2luZyAvIDIpOwotCQkJCQl9Ci0JCQkJCVBvaW50IGVuZFBvaW50ID0gbmV3IFBvaW50KGxpbmVFbmRQb2ludCwgYm9yZGVySGVpZ2h0Ci0JCQkJCQkJKyAodGFza0VuZFBvaW50LnkgLSB0YXNrU3RhcnRQb2ludC55KSAvIDIpOwotCQkJCQlyZW5kZXJBc3NvY2lhdGlvbihnMmQsIHN0YXJ0UG9pbnQsIGVuZFBvaW50LAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1QZXJmb3Jtc190ZXh0LAotCQkJCQkJCXRleHRGb250LCBDb2xvci5CTEFDSyk7Ci0JCQkJfQotCQkJCVJlY3RhbmdsZSByb2xlSW1hZ2VSZWN0ID0gbmV3IFJlY3RhbmdsZSh4LCB5LCByb2xlV2lkdGgsCi0JCQkJCQlyb2xlSGVpZ2h0KTsKLQkJCQlUZXh0dXJlUGFpbnQgcm9sZVBhaW50ID0gbmV3IFRleHR1cmVQYWludChyb2xlSW1hZ2UsCi0JCQkJCQlyb2xlSW1hZ2VSZWN0KTsKLQkJCQlnMmQuc2V0UGFpbnQocm9sZVBhaW50KTsKLQkJCQlnMmQuZmlsbChyb2xlSW1hZ2VSZWN0KTsKLQkJCQlpZiAocm9sZU5hbWUgIT0gbnVsbCkgewotCQkJCQlJbWFnZVV0aWwuZHJhd1RleHQoZzJkLCByb2xlTmFtZSwgdGV4dEZvbnQsIENvbG9yLkJMQUNLLCB4Ci0JCQkJCQkJLSB4T2Zmc2V0LCB5ICsgcm9sZUhlaWdodCwgcm9sZVdpZHRoICsgeFNwYWNpbmcsCi0JCQkJCQkJbWF4VGV4dExpbmVzKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCi0JCQkvLyBDYWxjdWxhdGUgdGhlIG9wdGltYWwgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIHJlbmRlcmVkIGltYWdlLgotCQkJaW50IG9wdGltYWxXaWR0aCA9IE1hdGgubWF4KHRhc2tzRW5kWCwgd29ya1Byb2R1Y3RzRW5kWCkKLQkJCQkJKyBib3JkZXJXaWR0aDsKLQkJCW9wdGltYWxXaWR0aCA9IE1hdGgubWF4KG9wdGltYWxXaWR0aCwgcm9sZUVuZFBvaW50LnggKyBib3JkZXJXaWR0aCk7Ci0KLQkJCW9wdGltYWxXaWR0aCA9IE1hdGgubWluKG9wdGltYWxXaWR0aCwgbWF4SW1hZ2VXaWR0aCk7Ci0KLQkJCWludCBvcHRpbWFsSGVpZ2h0ID0gd29ya1Byb2R1Y3RFbmRQb2ludC55ICsgYm9yZGVySGVpZ2h0OwotCQkJb3B0aW1hbEhlaWdodCA9IE1hdGgubWF4KG9wdGltYWxIZWlnaHQsIHJvbGVFbmRQb2ludC55Ci0JCQkJCSsgYm9yZGVySGVpZ2h0KTsKLQkJCW9wdGltYWxXaWR0aCArPSB4T2Zmc2V0OwotCQkJb3B0aW1hbEhlaWdodCArPSAobWF4VGV4dExpbmVzICogMTApOwotCi0JCQlvcHRpbWFsSGVpZ2h0ID0gTWF0aC5taW4ob3B0aW1hbEhlaWdodCwgbWF4SW1hZ2VIZWlnaHQpOwotCQkJQnVmZmVyZWRJbWFnZSBvcHRpbWFsSW1hZ2UgPSBvdXRwdXRJbWFnZS5nZXRTdWJpbWFnZSgwLCAwLAotCQkJCQlvcHRpbWFsV2lkdGgsIG9wdGltYWxIZWlnaHQpOwotCi0JCQkvLyBTYXZlIHRoZSBpbWFnZSBhcyBhIEpQRUcgZmlsZS4KLQkJCUZpbGUganBnRmlsZSA9IG5ldyBGaWxlKHBhdGgsIHJvbGVMYXlvdXQuZ2V0RmlsZVBhdGgoKQotCQkJCQkrIHJvbGVMYXlvdXQuZ2V0RmlsZU5hbWUoIi5qcGciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgcGFyZW50Rm9sZGVyID0ganBnRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAoIXBhcmVudEZvbGRlci5leGlzdHMoKSkgewotCQkJCXBhcmVudEZvbGRlci5ta2RpcnMoKTsKLQkJCX0KLQkJCUltYWdlSU8ud3JpdGUob3B0aW1hbEltYWdlLCAianBnIiwganBnRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsZW1lbnREaWFncmFtLnNldEltYWdlRmlsZU5hbWUoanBnRmlsZS5nZXROYW1lKCkpOwotCQkJcmV0dXJuIGVsZW1lbnREaWFncmFtOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbmRlcnMgdGhlIGFzc29jaWF0aW9uIGxpbmUuCi0JICogCi0JICogQHBhcmFtIGcyZAotCSAqICAgICAgICAgICAgVGhlIEdyYXBoaWNzMkQgY29udGV4dC4KLQkgKiBAcGFyYW0gc3RhcnRQb2ludAotCSAqICAgICAgICAgICAgVGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBsaW5lLgotCSAqIEBwYXJhbSBlbmRQb2ludAotCSAqICAgICAgICAgICAgVGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0aW9uIG5hbWUuCi0JICogQHBhcmFtIGZvbnQKLQkgKiAgICAgICAgICAgIFRoZSBmb250IGZvciByZW5kZXJpbmcgdGhlIGFzc29jaWF0aW9uIG5hbWUuCi0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICB0aGUgY29sb3IgZm9yIHJlbmRlcmluZyB0aGUgYXNzb2NpYXRpb24gbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW5kZXJBc3NvY2lhdGlvbihHcmFwaGljczJEIGcyZCwgUG9pbnQgc3RhcnRQb2ludCwKLQkJCVBvaW50IGVuZFBvaW50LCBTdHJpbmcgbmFtZSwgRm9udCBmb250LCBDb2xvciBjb2xvcikgewotCQlnMmQuZHJhdyhuZXcgTGluZTJELkRvdWJsZShzdGFydFBvaW50LngsIHN0YXJ0UG9pbnQueSwgZW5kUG9pbnQueCwKLQkJCQllbmRQb2ludC55KSk7Ci0JCWludCB0ZXh0WCA9IHN0YXJ0UG9pbnQueCArIChlbmRQb2ludC54IC0gc3RhcnRQb2ludC54KSAvIDIgLSA0MDsKLQkJaW50IHRleHRZID0gc3RhcnRQb2ludC55ICsgKGVuZFBvaW50LnkgLSBzdGFydFBvaW50LnkpIC8gMiAtIDU7Ci0JCWlmIChzdGFydFBvaW50LnkgIT0gZW5kUG9pbnQueSkgewotCQkJZzJkLnNldENvbG9yKENvbG9yLldISVRFKTsKLQkJCWcyZC5maWxsUmVjdCh0ZXh0WCwgdGV4dFksIDgwLCAxMCk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0WSAtPSAxMDsKLQkJfQotCQlJbWFnZVV0aWwuZHJhd1RleHQoZzJkLCBuYW1lLCBmb250LCBjb2xvciwgdGV4dFgsIHRleHRZLCA4MCwgMyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiZjMwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcm9sZSBhbmQgYWN0aXZpdHkgZGlhZ3JhbXMgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhaXRvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Fic3RyYWN0RWxlbWVudExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdEVsZW1lbnRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0OTFjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Fic3RyYWN0RWxlbWVudExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGxheW91dCBmb3IgYWxsIE1ldGhvZCBFbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2ljbmUgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgaW1wbGVtZW50cyBJRWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc0Rlc2NyaXRvcnNOZXdPcHRpb24gPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVGRVJFTkNFID0gInJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVGRVJFTkNFTElTVCA9ICJyZWZlcmVuY2VMaXN0IjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyOwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgdXJsID0gbnVsbDsKLQotCS8vIGVsZW1lbnQgZWxlbWVudCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRoZSBiYWNrIHVwIHBhdGggdG8gcmVhdGggdGhlIHB1Ymxpc2hpbmcgcm9vdAotCXByb3RlY3RlZCBTdHJpbmcgYmFja1BhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWFwIG9mIGxheW91dCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZSBleHRlbnRpb24sIGlmIHRoZSBlbGVtZW50IGhhcyBtb3JlCi0JLy8gdGhhbiBvbmUgbGF5b3V0IG91dHB1dAotCXByb3RlY3RlZCBMaXN0IGxheW91dHMgPSBudWxsOwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RWxlbWVudExpbmsgPSB0cnVlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgRWxlbWVudExheW91dEV4dGVuZGVyIGV4dGVuZGVyOwotCQotCXB1YmxpYyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQoKSB7Ci0JfQotCi0JLyoqCi0JICogaWYgdGhlIGVsZW1lbnQncyBjb250ZW50IGlzIHRhcmdldCBmb3IgYW5vdGhlciBlbGVtZW50LCBzZXQgaXQgaGVyZS4gZm9yCi0JICogZXhhbXBsZSwgc3RlcCBjb250ZW50IGNhdCB0YXJnZXQgZm9yIGEgVGFzayBvciBhIHRhc2sgZGVzY3JpcHRvcgotCSAqIGNvcHlyaWdodCBjb250ZW50IGNhbiB0YXJnZXQgdG8gZGlmZmVyZW50IGVsZW1lbnRzLgotCSAqIAotCSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdGhhdCB0aGUgc3lzdGVtIHdpbGwgZml4IHRoZSBsaW5rcyBpbiB0aGUgY29udGVudAotCSAqIHRvIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VGFyZ2V0KE1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkgewotCQl0aGlzLnRhcmdldEVsZW1lbnQgPSB0YXJnZXRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIG5lZWQgdG8gc2V0IHRoZSBvd25lciBvZiB0aGUgY3VycmVudCBsYXlvdXQgZWxlbWVudC4gSW4gbW9zdCBjYXNlcyB0aGlzCi0JICogc2hvdWxkIGJlIHRoZSBlQ29udGFpbmVyIG9mIHRoZSBlbGVtZW50LiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluIHNvbWUKLQkgKiBzaXR1YXRpb24gdGhlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBvd25lciB3aGVuIHRoZSBvYmplY3QgaXMgY3JlYXRlZC4KLQkgKiBGb3IgZXhhbXBsZSwgdGhlIENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QncyBlQ29udGluZXIgaXMgbnVsbCBpZiB0aGUKLQkgKiBjb250ZW50IGZpbGUgaXMgbm90IHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRPd25lcihNZXRob2RFbGVtZW50IG93bmVyKSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93RWxlbWVudExpbmsoYm9vbGVhbiBzaG93KSB7Ci0JCXRoaXMuc2hvd0VsZW1lbnRMaW5rID0gc2hvdzsKLQl9Ci0JCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGF5b3V0IHdpdGggdGhlIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIgYW5kIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBsYXlvdXRNYW5hZ2VyIEVsZW1lbnRMYXlvdXRNYW5hZ2VyCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBfX2luaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmxheW91dE1hbmFnZXIgPSBsYXlvdXRNYW5hZ2VyOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQlpZiAoIUNvbmZpZ3VyYXRpb25IZWxwZXIuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZWxlbWVudCkpIHsKLQkJCWlmICggIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgKSB7Ci0JCQkJLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGxvYWRlZCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRhaW5lcgotCQkJCS8vIG90aGVyd2lzZSB0aGUgIGVsZW1lbnQgbWF5IG5vdCBoYXZlIGEgdmFsaWQgY29udGFpbmVyCi0JCQkJLy8gYW5kIHRodXMgdGhlIGVsZW1lbnQgY29udGVudCBwYXRoIGNhbid0IGJlIGRldGVybWluZWQKLQkJCQkvLyB0aGlzIGlzIGp1c3QgYSB3b3JrYXJvdW5kLiBzaG91bGQgd2UgaGF2ZSBhIGJldHRlciB3YXkgdG8gbWFrZSBzdXJlIHRoZSBlbGVtZW50cyBhcmUgbG9hZGVkIGNvcnJlY3RseT8/Pz8/Pz8/Pz8/Ci0JCQkJLy8gMTYwNDQxIC0gTWlzc2luZyB0ZW1wbGF0ZSBmaWxlcyB3aGVuIHB1Ymxpc2ggY29uZmlndXJhdGlvbgotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJaWYgKCBwbHVnaW4gPT0gbnVsbCB8fCBwbHVnaW4uZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gcHVibGlzaGluZyBtb2RlIHNpbmNlIHRoZSB3aG9sZSBsaWJyYXJ5IGlzIGFscmVhZHkgbG9hZGVkCi0JCQkJCWlmICggZGVidWcgJiYgZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogRWxlbWVudCB3aXRob3V0IGEgdmFsaWQgY29udGFpbmVyOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJCi0JCQkJCUxpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCQl9IAotCQkJfQotCQkJYnVpbGRQYXRoKCk7Ci0JCQl0aGlzLnVybCA9IGVsZW1lbnRQYXRoICsgZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCX0KLQkJCi0JCS8vIHRoaXMgaXMgYSB3b3JrYXJvdW5kLiAKLQkJLy8gd2UgbmVlZCB0byBwYXNzIHBhcmFtZXRlcnMgaW4gdGhlIGZpbGUgdXJsLCAKLQkJLy8gaG93ZXZlciwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBwYXJhbWV0ZXJzIGlzIG5vdCBwYXNzZWQgb3ZlciBpbiBicm93c2luZwotCQkvLyBzbyBjcmVhdGUgYSBkdW1teSBmaWxlCi0JCWlmICghdGhpcy5sYXlvdXRNYW5hZ2VyLmlzUHVibGlzaGluZ01vZGUoKSAmJiAhKAotCQkJCQllbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIAotCQkJCXx8IGVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pICkKLQkJewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaHRtbF9maWxlID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmdldFB1Ymxpc2hEaXIoKSArIHRoaXMuZ2V0RmlsZVBhdGgoKSArIGdldEZpbGVOYW1lKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGh0bWxfZmlsZSk7Ci0JCQkJaWYgKCAhZi5leGlzdHMoKSApCi0JCQkJewotCQkJCQlmLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByZWxvYWRPcHBvc2l0ZWZlYXR1cmVzKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlbG9hZE9wcG9zaXRlZmVhdHVyZXMoKSB7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgcHJvY2Vzc2VzIGFyZSBsb2FkZWQgYmVmb3JlIGNhbGN1bGF0aW5nIHRoZSBmZWF0dXJlCi0JCS8vIG90aGVyd2lzZSB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBtYXAgaXMgbm90IHBvcHVsYXRlZAotCQkvLyBmaW5lIGZvciBwdWJsaXNoaW5nIHNpbmNlIHRoZSB3aG9sZSBsaWJyYXJ5IGlzIGxvYWRlZCBhbHJlYWR5Ci0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGJyb3dzaW5nCi0JCS8vIGxvYWQgdGhlIG9wcG9zaXRlIGZlYXR1cmUgc3BlY2lmaWNhbGx5Ci0JCWlmICggZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL09wcG9zaXRlRmVhdHVyZSBvZjsKLQkJUmVzb3VyY2UgcmVzID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLQkJaWYgKCByZXMgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gcmVzLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmICggIShyZXNTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdDxPcHBvc2l0ZUZlYXR1cmU+IG9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PE9wcG9zaXRlRmVhdHVyZT4oKTsKLQkJaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlRGVzY3JpcHRvcnMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuVGFza19UYXNrRGVzY3JpcHRvcnMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBDaGVja2xpc3QgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBDb25jZXB0IHx8IHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFdoaXRlcGFwZXIgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgQ2hlY2tsaXN0ICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLkV4YW1wbGVfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkZWxpbmUgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5HdWlkZWxpbmVfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0ICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuUmV1c2FibGVBc3NldF9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFJvYWRtYXAgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5Sb2FkbWFwX0FjdGl2aXRlcyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLlN1cHBvcnRpbmdNYXRlcmlhbF9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gCi0JCi0JCWlmICggb3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkgPiAwICkgewotCQkJQ29uZmlndXJhdGlvbkhlbHBlci5nZXREZWxlZ2F0ZSgpLmxvYWRPcHBvc2l0ZUZlYXR1cmVzKAotCQkJCQkoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzU2V0LCBvcHBvc2l0ZUZlYXR1cmVzLCBlbGVtZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExheW91dEluZm8oTGF5b3V0SW5mbyBpbmZvKSB7Ci0JCWlmIChsYXlvdXRzID09IG51bGwpIHsKLQkJCWxheW91dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJbGF5b3V0cy5hZGQoaW5mbyk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMYXlvdXRzKCkgewotCQlyZXR1cm4gbGF5b3V0czsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgbGF5b3V0IGJ5IG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gTGF5b3V0SW5mbwotCSAqLwotCXB1YmxpYyBMYXlvdXRJbmZvIGdldExheW91dEluZm8oU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCBsYXlvdXRzID09IG51bGwgfHwgbGF5b3V0cy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGF5b3V0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTGF5b3V0SW5mbyBpbmZvID0gKExheW91dEluZm8paXQubmV4dCgpOwotCQkJaWYgKCBpbmZvLm5hbWUuZXF1YWxzKG5hbWUpICkgewotCQkJCXJldHVybiBpbmZvOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0TGF5b3V0TWdyKCkKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCkgewotCQlyZXR1cm4gdGhpcy5sYXlvdXRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEVsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXREaXNwbGF5TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJCi0JCS8vIFtCdWcgMTk2Mzk5XSBQLW5hbWUgaXMgbm90IGluaGVyaXRlZCBmcm9tIGl0cyBiYXNlIGVsZW1lbnQgaW4gYW4gZXh0ZW5kaW5nIGVsZW1lbnQKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LCBnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRHdWlkKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0VXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRCYWNrUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrUGF0aCgpIHsKLQkJcmV0dXJuIGJhY2tQYXRoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEZpbGVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgewotCQlyZXR1cm4gZWxlbWVudFBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIGFub3RoZXIgZWxlbWVudC4gVGhpcyBpcyB0aGUKLQkgKiByZWxhdGl2ZVRvLmJhY2twYXRoICsgdGhpcy5lbGVtZW50cGF0aC4KLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEZpbGVQYXRoKElFbGVtZW50TGF5b3V0KQotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aChJRWxlbWVudExheW91dCByZWxhdGl2ZVRvKSB7Ci0JCXJldHVybiByZWxhdGl2ZVRvLmdldEJhY2tQYXRoKCkgKyB0aGlzLmdldEZpbGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRGaWxlTmFtZShTdHJpbmcpCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGVsZW1lbnQsIGV4dCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhzbFVybCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYc2xVcmwoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBMYXlvdXRSZXNvdXJjZXMuZ2V0WHNsVXJpKGdldFR5cGUoKS50b0xvd2VyQ2FzZSgpLAotCQkJCQkiY29udGVudGVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIExheW91dFJlc291cmNlcy5nZXRYc2xVcmkoZ2V0VHlwZSgpLnRvTG93ZXJDYXNlKCksIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUGF0aCgpIHsKLQkJLy8gdGhpcyBpcyA8cGx1Z2luPi88ZWxlbWVudCB0eXBlPi8KLQkJZWxlbWVudFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQliYWNrUGF0aCA9ICIuLyI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSApCi0JCXsKLQkJCVN0cmluZyBwYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCk7Ci0JCQlpZiAoIHBhdGggIT0gbnVsbCApIHsKLQkJCQllbGVtZW50UGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQkJYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChlbGVtZW50KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGh0bWwgY29udGVudCBnZW5lcmF0ZWQgZnJvbSB0aGlzIHhzbCBmaWxlIG5lZWRzIHRvIGJlIHNjYW5uZWQgb3Igbm90Ci0JICogc2NhbiB0aGUgY29udGVudCBpcyBmb3IgaWRlbnRpZnlpbmcgZWxlbWVudCByZWZlcmVuY2VzIGluIHRoZSBjb250ZW50IGFuZCBjb3B5IG92ZXIgcmVzb3VyY2UgZmlsZXMKLQkgKiBpbiBzb21lIGNhc2VzIHdlIGRvbid0IG5lZWQgdG8gc2NhbiB0aGUgY29udGVudCwgZm9yIGV4YW1wbGUsIHRoZSBhY3Rpdml0eSBicmVha2Rvd24gc3RydWN0dXJlCi0JICogCi0JICogQHBhcmFtIHhzbFVybCB0aGUgeHNsIHRoYXQgaHRtbCBpcyBnZW5lcmF0ZWQgZnJvbSwgbnVsbCBmb3IgdGhlIGRlZmF1bHQgeHNsIGxheW91dAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRDb250ZW50U2NhbihTdHJpbmcgeHNsVXJsKQotCXsKLQkJLy8gYnkgZGVmYXVsdCBhbGwgY29udGVudHMgYXJlIHNjYW5uZWQKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IGZvciBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBlbGVtZW50Ci0JICogQWN0aXZpdHlFbGVtZW50TGF5b3V0IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgbGF5b3V0IHdpdGggbm9kZSBwYXRoCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiBJRWxlbWVudExheW91dAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudExheW91dCBnZXRDaGlsZExheW91dChNZXRob2RFbGVtZW50IGNoaWxkKQotCXsKLQkJcmV0dXJuIGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KGNoaWxkLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoaWxkKE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IHBhcmVudCwgTWV0aG9kRWxlbWVudCBlLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlJRWxlbWVudExheW91dCBsID0gZ2V0Q2hpbGRMYXlvdXQoZSk7Ci0JCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJLy8gZG9uJ3QgaW5jbHVkZSB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVmZXJlY2VkIGVsZW1lbnRzLAotCQkJCS8vIG90aGVyd2lzZSwgbWF5IGNhdXNlIGRlYWRsb2NrCi0JCQkJYm9vbGVhbiBpc0NvbnRlbnQgPSAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZSk7Ci0JCQkJaWYgKGlzQ29udGVudCkgewotCQkJCQlpZiAodGFyZ2V0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlsLnNldENvbnRlbnRUYXJnZXQodGFyZ2V0RWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJbC5zZXRFbGVtZW50T3duZXIoZWxlbWVudCk7Ci0JCQkJfQotCQkJCVhtbEVsZW1lbnQgY2hpbGRYbWxFbGVtZW50ID0gbC5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGRYbWxFbGVtZW50KTsKLQkJCQlwcm9jZXNzR3JhbmRDaGlsZChmZWF0dXJlLCBlLCBsLCBjaGlsZFhtbEVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoaWxkKE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IHBhcmVudCwgTGlzdCBpdGVtcywKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChtZSwKLQkJCQkJCQlsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBnZXRDaGlsZExheW91dChtZSk7Ci0JCQkJCQlpZiAobCAhPSBudWxsKSB7CQkJCQkJCQotCQkJCQkJCS8vIGRvbid0IGluY2x1ZGUgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlZmVyZWNlZAotCQkJCQkJCS8vIGVsZW1lbnRzLCBvdGhlcndpc2UsIG1heSBjYXVzZSBkZWFkbG9jawotCQkJCQkJCVhtbEVsZW1lbnQgY2hpbGRYbWxFbGVtZW50ID0gbC5nZXRYbWxFbGVtZW50KENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChtZSkgPyB0cnVlCi0JCQkJCQkJCQk6IGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQkJCQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGRYbWxFbGVtZW50KTsKLQkJCQkJCQlwcm9jZXNzR3JhbmRDaGlsZChmZWF0dXJlLCBtZSwgbCwgY2hpbGRYbWxFbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NOb25NZXRob2RFbGVtZW50SW5Qcm9jZXNzQ2hpbGQoZSwgZmVhdHVyZSwgcGFyZW50LCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NOb25NZXRob2RFbGVtZW50SW5Qcm9jZXNzQ2hpbGQoCi0JCQlPYmplY3Qgbm9uTWV0aG9kRWxlbWVudENoaWxkLCBPYmplY3QgZmVhdHVyZSwgWG1sRWxlbWVudCBwYXJlbnQsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NHcmFuZENoaWxkKE9iamVjdCBmZWF0dXJlLAotCQkJTWV0aG9kRWxlbWVudCBjaGlsZEVsZW1lbXQsIElFbGVtZW50TGF5b3V0IGNoaWxkTGF5b3V0LAotCQkJWG1sRWxlbWVudCBjaGlsZFhtbEVsZW1lbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHRvLW1hbnkgcmVmZXJlbmNlcwotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGNhbGN1bGF0ZTBuUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCS8vIHJlZmVyZW5jZU1hcC5jbGVhcigpOwotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJJZCIsIGdldElkKCkpIC8vJE5PTi1OTFMtMSQJCi0JCQkJLnNldEF0dHJpYnV0ZSgiVHlwZSIsIGdldFR5cGUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIlR5cGVOYW1lIiwgVG5nVXRpbC5nZXRUeXBlVGV4dChlbGVtZW50KSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIk5hbWUiLCBnZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJCYWNrUGF0aCIsIGdldEJhY2tQYXRoKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJTaGFwZWljb25VcmwiLCBnZXRTaGFwZWljb25VcmwoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIHNob3dFbGVtZW50TGluayApIHsKLQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJVcmwiLCBnZXRVcmwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9hZEF0dHJpYnV0ZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0KLQkJYm9vbGVhbiBpc0FjdGl2aXR5QXR0cmlidXRlID0gKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgCi0JCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgCi0JCQkJJiYgKGVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb3duZXJFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpOwotCQkKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGFsbCBzdHJpbmcgdHlwZSBhdHRyaWJ1dGVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7CQkJCi0JCQkJaWYgKCEocCBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSlwOwotCQkJCVN0cmluZyBuYW1lID0gcC5nZXROYW1lKCk7Ci0JCQkJCQkJCQkKLQkJCQlPYmplY3QgdmFsdWU7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKCJwcmVzZW50YXRpb25OYW1lIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCS8vIHZhbHVlID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQkJCQl2YWx1ZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQl9IGVsc2UgaWYoIGlzQWN0aXZpdHlBdHRyaWJ1dGUgJiYgU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYXR0cmliLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpKSkgewotCQkJCQkKLQkJCQkJLy8gZm9yIGFjdGl2aXR5LCB0aGUgd2F5IHRvIG1lcmdlIGF0dHJpYnV0ZSBmcm9tIGJhc2UgaXMgZGlmZmVyZW50Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRBY3Rpdml0eVN0cmluZ0F0dHJpYnV0ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGF0dHJpYiwgZ2V0TGF5b3V0TWdyKCkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShwKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZXNjYXBlIEJyaWVmIERlc2NyaXB0aW9uIGludG8gSFRNTCBlbnRpdGllcwotCQkJCWlmIChuYW1lLmVxdWFscygiYnJpZWZEZXNjcmlwdGlvbiIpICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuTXlFc2NhcGUgbXlFc2NhcGUgPSBuZXcgTXVsdGlGaWxlWE1JU2F2ZUltcGwuTXlFc2NhcGUoKTsKLQkJCQkJdmFsdWUgPSBteUVzY2FwZS5jb252ZXJ0KChTdHJpbmcpdmFsdWUpOwotCQkJCQl2YWx1ZSA9IFN0clV0aWwuY29udmVydE5ld2xpbmVzVG9IVE1MKChTdHJpbmcpdmFsdWUpOwotCQkJCX0KLQotCQkJCWVsZW1lbnRYbWwKLQkJCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSkuc2V0VmFsdWUoKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCS8vIEdldCB0aGUgc2luZ2xldG9uIG9mIHRoZSBFbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIgYW5kIGhhdmUgaXQgYWRkIGFueSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYXMgbmVlZGVkCi0JCQlFbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkQWRkaXRpb25hbEVsZW1lbnRQcm9wZXJ0aWVzKGVsZW1lbnQsIGVsZW1lbnRYbWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZSBhbmQgbWVyZ2UgdGhlIHRleHQsIGZpeCB1cmwgcmVmZXJuZWNlcywgZXRjLgotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IHZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJb3duZXJFbGVtZW50LCBmZWF0dXJlLCBsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJLy8gbm93IGlmIHRoZSB0YXJnZXQgaXMgc2V0IGFuZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZWxlbWVudCBvciB0aGUKLQkJLy8gZWxlbWVudCdzIG93bmVyCi0JCS8vIHRoZW4gZml4IHRoZSBjb250ZW50Ci0JCWlmICgodGFyZ2V0RWxlbWVudCAhPSBudWxsKSAmJiAodmFsdWUgIT0gbnVsbCkKLQkJCQkmJiAodmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkuZ2V0RWxlbWVudFBhdGgoKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pID8gCi0JCQkJCQkJKChvd25lckVsZW1lbnQ9PW51bGwpID8gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQuZUNvbnRhaW5lcigpIDogb3duZXJFbGVtZW50KSAKLQkJCQkJCQk6IGVsZW1lbnQpOwotCi0JCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkuZ2V0QmFja1BhdGgoKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pID8gKE1ldGhvZEVsZW1lbnQpIHRhcmdldEVsZW1lbnQKLQkJCQkJCQkuZUNvbnRhaW5lcigpCi0JCQkJCQkJOiB0YXJnZXRFbGVtZW50KTsKLQotCQkJdmFsdWUgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aCh2YWx1ZS50b1N0cmluZygpLAotCQkJCQljb250ZW50UGF0aCwgYmFja1BhdGgpOwotCi0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgY29weXJpZ2h0IHRleHQKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9hZENvcHlyaWdodChYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQotCQkvLyBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBDb25maWd1cmF0aW9uSGVscGVyLmNhbGN1bGF0ZUNvcHlyaWdodChlbGVtZW50LAotCQkvLyBsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSwgaXRlbXMpOwotCQkvLyBpZiAoIGl0ZW1zLnNpemUoKSA+IDAgKQotCQkvLyB7Ci0JCS8vIFN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHQ7Ci0JCS8vIFN0cmluZ0J1ZmZlciBjb3B5cmlnaHRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBmb3IgKCBJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQkvLyB7Ci0JCS8vIGNvcHlyaWdodCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0Lm5leHQoKTsKLQkJLy8gU3RyaW5nIHN0YXRlbWVudCA9IGNvcHlyaWdodC5nZXRQcmVzZW50YXRpb24oKS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJLy8JCQkJCQkJCi0JCS8vIC8vIG5lZWQgdG8gZml4IHRoZSBjb250ZW50IGZvciByZWxhdGl2ZSBsaW5rcy4KLQkJLy8gLy8gc2luY2UgdGhlIGxpbmsgaXMgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBTdXBwb3J0aW5nTWF0ZXJpYWwKLQkJLy8gbG9jYXRpb24sCi0JCS8vIC8vIG5lZWQgdG8gY29udmVydCB0byByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBlbGVtZW50Ci0JCS8vIC8vIHNvIHJlLWNhbGN1YXRlIHRoZSBiYWNrIHBhdGgKLQkJLy8gLy8ganhpLCAwNi8yOC8wNQotCQkvLyBTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChjb3B5cmlnaHQpOwotCQkvLyBTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChlbGVtZW50KTsKLQkJLy8gc3RhdGVtZW50ID0gUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgoc3RhdGVtZW50LCBjb250ZW50UGF0aCwKLQkJLy8gYmFja1BhdGgpOwotCQkvLyBjb3B5cmlnaHRzLmFwcGVuZChzdGF0ZW1lbnQpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIGVsZW1lbnRYbWwubmV3Q2hpbGQoImNvcHlyaWdodCIpLnNldFZhbHVlKGNvcHlyaWdodHMudG9TdHJpbmcoKSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gfQotCi0JCVN0cmluZyBjb3B5cmlnaHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQoZWxlbWVudCwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCWlmIChjb3B5cmlnaHQgIT0gbnVsbCAmJiBjb3B5cmlnaHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQllbGVtZW50WG1sLm5ld0NoaWxkKCJjb3B5cmlnaHQiKS5zZXRWYWx1ZShjb3B5cmlnaHQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHRvLW9uZSByZWZlcmVuY2UKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWxjdWxhdGUwMVJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgZWxlbWVudCByZWZlcmVuY2VzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0KLQkJCQkvLyBPYmplY3QgdmFsdWUgPSBlbGVtZW50LmdldChpKTsKLQotCQkJCUVDbGFzc2lmaWVyIHR5cGUgPSBwLmdldEVUeXBlKCk7Ci0JCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIEVDbGFzcykgfHwgcC5pc01hbnkoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlsb2FkRmVhdHVyZShwLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBub24tYXR0cmlidXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJZ2V0RmVhdHVyZVZhbHVlKGZlYXR1cmUsICBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JfQotCQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQkKLQkJaWYgKCEoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkKLQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsCi0JCQkJCWZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJLy8gQnJvd3Npbmcgc3RvcHMgd29ya2luZyB3aGVuIGEgcm9sZSBpcyBzZXQgdG8KLQkJCS8vIHJlcGxhY2VkIGFub3RoZXIgcm9sZQotCQkJLy8gZm9yIHJlcGxhY2VyLCB0aGUgYmFzZSB3aWxsIGJlIGV2YWx1YXRlZCB0byB0aGUgcmVwbGFjZXIKLQkJCS8vIGFuZCBjYXVzaW5nIGRlYWRsb2NrCi0JCQlpZiAoZSAhPSBudWxsICYmIGUgIT0gZWxlbWVudCkgewotCQkJCWJvb2xlYW4gc2hvd0RldGFpbCA9IChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZSkKLQkJCQkvKgotCQkJCSAqIHx8IChwID09Ci0JCQkJICogVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSkKLQkJCQkgKi8pID8gdHJ1ZSA6IGluY2x1ZGVSZWZlcmVuY2VzOwotCQkJCQotCQkJCWlmICggYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIGUpICkgewotCQkJCQlpZiAoIGVsZW1lbnRYbWwgIT0gbnVsbCApIHsKLQkJCQkJCXByb2Nlc3NDaGlsZChmZWF0dXJlLCBlbGVtZW50WG1sCi0JCQkJCQkJCQkJLm5ld0NoaWxkKFRBR19SRUZFUkVOQ0UpLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpLCBlLCBzaG93RGV0YWlsKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJfQotCQkJCQkKLQkJCQkJcmV0dXJuIGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUxpc3QgcHYgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmICggYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIHB2KSApIHsKLQkJCQlpZiAoIGVsZW1lbnRYbWwgIT0gbnVsbCApIHsKLQkJCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLCBlbGVtZW50WG1sLCBuYW1lLCBwdik7Ci0JCQkJfQotCQkJCXJldHVybiBwdjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCAKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9CQotCQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRmVhdHVyZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCi0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkvLyBCcm93c2luZyBzdG9wcyB3b3JraW5nIHdoZW4gYSByb2xlIGlzIHNldCB0bwotCQkJLy8gcmVwbGFjZWQgYW5vdGhlciByb2xlCi0JCQkvLyBmb3IgcmVwbGFjZXIsIHRoZSBiYXNlIHdpbGwgYmUgZXZhbHVhdGVkIHRvIHRoZSByZXBsYWNlcgotCQkJLy8gYW5kIGNhdXNpbmcgZGVhZGxvY2sKLQkJCWlmIChlICE9IG51bGwgJiYgZSAhPSBlbGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBzaG93RGV0YWlsID0gKENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKQotCQkJCS8qCi0JCQkJICogfHwgKHAgPT0KLQkJCQkgKiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpKQotCQkJCSAqLykgPyB0cnVlIDogaW5jbHVkZVJlZmVyZW5jZXM7Ci0KLQkJCQlpZiAoIGFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCBlKSApCi0JCQkJewotCQkJCQlwcm9jZXNzQ2hpbGQoZmVhdHVyZSwgCi0JCQkJCQkJZWxlbWVudFhtbAotCQkJCQkJCQkJLm5ld0NoaWxkKFRBR19SRUZFUkVOQ0UpLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpLCBlLCBzaG93RGV0YWlsKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBwdiA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmICggYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIHB2KSAmJiBwdi5zaXplKCkgPiAwKSB7Ci0JCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLCBlbGVtZW50WG1sLCBuYW1lLCBwdik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIGxvYWQgcmVmZXJlbmNlcyBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCQlsb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9uIG9wcG9zaXRlUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoZWxlbWVudC5nZXRPcHBvc2l0ZUZlYXR1cmVzKCkpOwotCQlmb3IgKEl0ZXJhdG9yIHo9IG9wcG9zaXRlUHJvcGVydGllcy5pdGVyYXRvcigpOyB6Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSB6Lm5leHQoKTsKLQkJCWxvYWRGZWF0dXJlKG9mZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCX0KLQkJLy9lbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7Ci0JfQotCi0JLyoqCi0JICogYWRkIHRoZSByZWZlcmVuY2UgbGF5b3V0IHRvIHRoZSByZXN1bHQKLQkgKiBAcGFyYW0gZmVhdHVyZSBPYmplY3QKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICogQHBhcmFtIHJlZmVyZW5jZU5hbWUgU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShPYmplY3QgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLCBTdHJpbmcgcmVmZXJlbmNlTmFtZSwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlwcm9jZXNzQ2hpbGQoZmVhdHVyZSwgCi0JCQkJZWxlbWVudFhtbAotCQkJCQkJLm5ld0NoaWxkKFRBR19SRUZFUkVOQ0UpLnNldEF0dHJpYnV0ZSgibmFtZSIsIHJlZmVyZW5jZU5hbWUpLCBlbGVtZW50LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoqCi0JICogYWRkIHJlZmVyZW5jZXMgdG8gdGhlIGxheW91dAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gcmVmZXJlbmNlTmFtZQotCSAqIEBwYXJhbSBpdGVtcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoT2JqZWN0IGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgU3RyaW5nIHJlZmVyZW5jZU5hbWUsCi0JCQlMaXN0IGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUhhc2hTZXQ8T2JqZWN0PiBpdGVtU2V0ID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQlMaXN0IHVuaXF1ZUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKE9iamVjdCBpdGVtOiBpdGVtcykgewotCQkJaWYgKCEgaXRlbVNldC5jb250YWlucyhpdGVtKSkgewotCQkJCWl0ZW1TZXQuYWRkKGl0ZW0pOwotCQkJCXVuaXF1ZUl0ZW1zLmFkZChpdGVtKTsKLQkJCX0KLQkJfQotCQlwcm9jZXNzQ2hpbGQoZmVhdHVyZSwgCi0JCQkJZWxlbWVudFhtbAotCQkJCQkJLm5ld0NoaWxkKFRBR19SRUZFUkVOQ0VMSVNUKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCByZWZlcmVuY2VOYW1lKSwgdW5pcXVlSXRlbXMsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IGdldFhtbEVsZW1lbnQoKTsKLQotCQkvLyBsb2FkIHRoZSByZWZlcmVuY2VzCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCi0JCQkvLyBsb2FkIHRoZSBjb3B5cmlnaHQgaW5mbwotCQkJbG9hZENvcHlyaWdodChlbGVtZW50WG1sKTsKLQotCQkJLy8gbG9hZCB0aGUgYXR0cmlidXRlcwotCQkJbG9hZEF0dHJpYnV0ZXMoZWxlbWVudFhtbCk7Ci0KLQkJCWxvYWRSZWZlcmVuY2VzKGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCS8qKgotCSAqIHNvbWUgbGF5b3V0IG5lZWQgdG8gaGF2ZSB0aGUgZmVhdHVyZSB2YWx1ZXMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gU28KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgZmVhdHVyZSBpcyBjYWxjdWxhdGVkIGluIHRoaXMgYWJzdHJhY3QKLQkgKiBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLkRlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzKSB7Ci0JCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgKSB7Ci0JCQkJcmV0dXJuIGdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KChNZXRob2RFbGVtZW50KXZhbHVlKTsKLQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKCBpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdGVtcy5nZXQoaSk7Ci0JCQkJCWlmICggIWdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KGUpICkgewotCQkJCQkJaXRlbXMucmVtb3ZlKGkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaSsrOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBUbmdVdGlsLmdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KGUpOwotCQlpZiAoIHByb3AgPT0gbnVsbCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJU3RyaW5nIHYgPSBwcm9wLmdldFZhbHVlKCk7Ci0JCWlmICggdiA9PSBudWxsIHx8ICF2LnRvU3RyaW5nKCkuZXF1YWxzKCJ0cnVlIikgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0U2hhcGVpY29uVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlaWNvblVybCgpIHsKLQkJVVJJIHVyaSA9IG51bGw7Ci0JCVN0cmluZyBpbWFnZVVybDsKLQkJCi0JCS8vIFN0cmluZyBpbWFnZUZpbGU7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB1cmlJbmhlcml0aW5nQmFzZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQl1cmkgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0U2hhcGVpY29uKCk7Ci0KLQkJCWlmICh1cmkgPT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50W10gdXJpSW5oZXJpdGluZ0Jhc2VzID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudFsxXTsKLQkJCQl1cmkgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEluaGVyaXRpbmdVcmkoCi0JCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50LCB1cmksIHVyaUluaGVyaXRpbmdCYXNlcywKLQkJCQkJCWdldExheW91dE1ncigpLmdldENvbmZpZ3VyYXRpb24oKSwgMSk7Ci0JCQkJdXJpSW5oZXJpdGluZ0Jhc2UgPSB1cmlJbmhlcml0aW5nQmFzZXNbMF07Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50MSA9IHVyaUluaGVyaXRpbmdCYXNlID09IG51bGwgPyBlbGVtZW50IDogdXJpSW5oZXJpdGluZ0Jhc2U7Ci0KLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudDEpOwotCi0JCWlmICh1cmkgPT0gbnVsbCB8fCByZXNNZ3IgPT0gbnVsbCApIHsKLQkJCWltYWdlVXJsID0gZ2V0RGVmYXVsdFNoYXBlaWNvblVybCgpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VVcmwgPSBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKTsKLQkJfQotCi0JCS8vIG5lZWQgdG8gY29weSB0aGUgaW1hZ2UgZmlsZSBpZiBpdCdzIG5vdCBpbiB0aGUgZGVmYXVsdCBkaXJlY3RvcnkKLQkJaWYgKCFpbWFnZVVybC5zdGFydHNXaXRoKCJpbWFnZXMvIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkKLQkJCS8vIEZyb20gRVBGIDEuMiwgc2hhcGVJY29uL25vZGVJY29uIHN0b3JlcyB1cmkgcmVsYXRpdmUgdG8gcGx1Z2luIHBhdGguIAotCQkJLy8gQmVsb3cgc2VjdGlvbiBvZiBjb2RlIGlzIG5lY2Vzc2FyeSB0byBhcHBlbmQgcGx1Z2luIG5hbWUgdG8gc2hhcGVJY29uL25vZGVJY29uIHVyaS4KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50MSk7Ci0JCQlpZihwbHVnaW4gIT0gbnVsbCl7Ci0JCQkJaWYoIWltYWdlVXJsLnN0YXJ0c1dpdGgocGx1Z2luLmdldE5hbWUoKSkgKXsKLS8vCQkJCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFJlc291cmNlSGVscGVyLmdldFBsdWdpblBhdGgoZWxlbWVudCk7Ci0vLwkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGx1Z2luUGF0aCArIEZpbGUuc2VwYXJhdG9yKyBpbWFnZVVybCk7Ci0vLwkJCQkJaW1hZ2VVcmwgPSBOZXRVdGlsLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwuZ2V0UmVsYXRpdmVQYXRoKGZpbGUsIAotLy8JCQkJCQkJbmV3IEZpbGUobGliUm9vdCkpKTsKLQkJCQkJaW1hZ2VVcmwgPSBOZXRVdGlsLmVuY29kZUZpbGVVUkwocGx1Z2luLmdldE5hbWUoKSArICIvIiArIGltYWdlVXJsKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCQkvLyBuZWVkIGRlY29kZWQgVVJMIGZvciBmaWxlIG9wcwotCQkJCVN0cmluZyBkZWNvZGVkSW1hZ2VVcmwgPSBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKGltYWdlVXJsKTsKLQkJCQlGaWxlIHNvdXJjZSA9IG5ldyBGaWxlKHJlc01nci5yZXNvbHZlKGVsZW1lbnQxLCBkZWNvZGVkSW1hZ2VVcmwpKTsKLQkJCQlGaWxlIGRlc3QgPSBuZXcgRmlsZShnZXRMYXlvdXRNZ3IoKS5nZXRQdWJsaXNoRGlyKCksIGRlY29kZWRJbWFnZVVybCk7Ci0JCQkJRmlsZVV0aWwuY29weUZpbGUoc291cmNlLCBkZXN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbWFnZVVybDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXROb2RlaWNvblVybCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvblVybCgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2hhcGVpY29uVXJsKCkgewotCQlyZXR1cm4gTGF5b3V0UmVzb3VyY2VzLmdldERlZmF1bHRTaGFwZWljb25VcmwoZWxlbWVudC5nZXRUeXBlKCkKLQkJCQkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldERpYWdyYW1pY29uVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpYWdyYW1pY29uVXJsKCkgewotCQlyZXR1cm4gImljb25zLyIgKyBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiLmdpZiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgYSBzaGFyZWQgbWV0aG9kIHRvIGxvYWQgdGhlIHdvcmsgb3JkZXIgb2YgdGhlIHdvcmsgYnJlYWtkb3duCi0JICogZWxlbWVudC4gd2lsbCBiZSB1c2VkIGJ5IGFsbCB3b3JrIGJyZWFrZG93biBlbGVtbnQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogICAgICAgICAgICBYbWxFbGVtZW50IHRoZSBwYXJlbnQgeG1sIGVsZW1lbnQgdG8gbG9hZCB0aGUgd29yayBvcmRlcgotCSAqICAgICAgICAgICAgbGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFdvcmtPcmRlcihYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpOwotCi0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQlYbWxFbGVtZW50IHByZWRlY2Vzc29yWG1sID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZChUQUdfUkVGRVJFTkNFTElTVCkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZmVhdHVyZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtPcmRlciB3byA9IChXb3JrT3JkZXIpIGl0Lm5leHQoKTsKLQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5jYWxjMDFGZWF0dXJlVmFsdWUod28sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrT3JkZXJfUHJlZCgpLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGdldENoaWxkTGF5b3V0KG1lKTsKLQkJCQkJaWYgKGwgIT0gbnVsbCkgewotCQkJCQkJcHJlZGVjZXNzb3JYbWwuYWRkQ2hpbGQobC5nZXRYbWxFbGVtZW50KGZhbHNlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogc2hvdyB0aGUgZGVzY3JpcHRvcnMgb2YgdGhlIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGRlc2NyaXB0b3JzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Rlc2NyaXB0b3JzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCkgewotCQkKLQkJLy8gMTgwNTgzIC0gUHViIG9wdGlvbnMgdG8gYWxsb3cgYWRkaW5nICh3aGVuIHB1Ymxpc2hpbmcpIGFsbCBkZXNjcmlwdG9ycyB1bmRlciBhIG1ldGhvZCBlbGVtZW50IGluIGZvcm0gb2YgdGhlaXIgcGF0aAotCQkKLQkJaWYgKCAhZ2V0TGF5b3V0TWdyKCkuZ2V0VmFsaWRhdG9yKCkuc2hvd1JlbGF0ZWREZXNjcmlwdG9ycygpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBzaG93IHRoZSByb2xlIGRlc2NyaXB0b3JzIHJlZmVyZW5jaW5nIHRoaXMgcm9sZQotCQlPcHBvc2l0ZUZlYXR1cmUgb2YgPSBudWxsOwotCQkKLQkJaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlICkgewotCQkJb2YgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVEZXNjcmlwdG9yczsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgVGFzayApIHsKLQkJCW9mID0gQXNzb2NpYXRpb25IZWxwZXIuVGFza19UYXNrRGVzY3JpcHRvcnM7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0ICkgewotCQkJb2YgPSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdERlc2NyaXB0b3JzOwotCQl9Ci0JCQkKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCXRoaXMuZWxlbWVudCwgb2YsCi0JCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJLy8gY3JlYXRlIGEgZWxlbWVudCBub2RlcyBmb3IgY2VzY3JpcHRvciBsaXN0Ci0JCVhtbEVsZW1lbnQgZGVzY0xpc3RYbWwgPSBlbGVtZW50WG1sLm5ld0NoaWxkKFRBR19SRUZFUkVOQ0VMSVNUKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiZGVzY3JpcHRvcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlhZGREZXNjcmlwdG9ycyhkZXNjcmlwdG9ycywgZGVzY0xpc3RYbWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREZXNjcmlwdG9ycyhMaXN0IGRlc2NyaXB0b3JzLCBYbWxFbGVtZW50IGRlc2NMaXN0WG1sKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKysgKSB7Ci0JCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcilkZXNjcmlwdG9ycy5nZXQoaSk7Ci0JCQlMaXN0IHBhcmVudHMgPSBfX2dldFN1cGVyQWN0aXZpdGllcyhkZXNjKTsKLQkJCWFkZERlc2NyaXB0b3IoZGVzY0xpc3RYbWwsIGRlc2MsIHBhcmVudHMsIHRydWUpOwkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZERlc2NyaXB0b3IoWG1sRWxlbWVudCBkZXNjTGlzdFhtbCwgRGVzY3JpcHRvciBkZXNjLCBMaXN0IHBhcmVudHMsIGJvb2xlYW4gdG9wTGV2ZWxDYWxsKSB7Ci0JCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IGdldENoaWxkTGF5b3V0KGRlc2MpOwotCQlYbWxFbGVtZW50IGRlc2NYbWwgPSBsYXlvdXQuZ2V0WG1sRWxlbWVudChmYWxzZSk7Ci0JCWRlc2NMaXN0WG1sLmFkZENoaWxkKGRlc2NYbWwpOwotCQkKLQkJLy9TaG93IGVudHJ5L2V4aXN0IHN0YXRlIHZhbHVlcwotCQlpZiAoZGVzYyBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAmJiBsYXlvdXQgaW5zdGFuY2VvZiBBYnN0cmFjdEVsZW1lbnRMYXlvdXQpIHsKLQkJCUFic3RyYWN0RWxlbWVudExheW91dCBhTGF5b3V0ID0gKEFic3RyYWN0RWxlbWVudExheW91dCkgbGF5b3V0OwotCQkJCi0JCQlFQXR0cmlidXRlIGF0dDsKLQkJCVN0cmluZyB2YWx1ZTsKLQkJCWF0dCA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQkJCXZhbHVlID0gKFN0cmluZykgYUxheW91dC5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoYXR0KTsKLQkJCQotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY1htbAotCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKGF0dC5nZXROYW1lKCksIHZhbHVlKTsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJCWF0dCA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCQkJdmFsdWUgPSAoU3RyaW5nKSBhTGF5b3V0LmdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShhdHQpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY1htbAotCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKGF0dC5nZXROYW1lKCksIHZhbHVlKTsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJfQotCQkKLQkJYm9vbGVhbiB0b1Byb2Nlc3NFeHRlbmRlZEFjdHMgPSBwcm9jZXNzRGVzY3JpdG9yc05ld09wdGlvbgotCQkJCSYmIHRvcExldmVsQ2FsbDsKLQkJU2V0PEFjdGl2aXR5PiBwcm9jZXNzZWRFeHRlbmRlZEFjdFNldCA9IG51bGw7Ci0JCVNldDxBY3Rpdml0eT4gYWxsTG9jYWxBY3RTZXQgPSBudWxsOwotCQlpZiAodG9Qcm9jZXNzRXh0ZW5kZWRBY3RzKSB7Ci0JCQlwcm9jZXNzZWRFeHRlbmRlZEFjdFNldCA9IG5ldyBIYXNoU2V0PEFjdGl2aXR5PigpOwotCQkJYWxsTG9jYWxBY3RTZXQgPSBnZXRBbGxMb2NhbEFjdFNldChwYXJlbnRzKTsKLQkJfQotCQkKLQkJLy8gTGlzdCBwYXJlbnRzID0gX19nZXRTdXBlckFjdGl2aXRpZXMoZGVzYyk7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgcGFyZW50cy5zaXplKCk7IHArKykgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBwYXJlbnRzLmdldChwKTsKLQkJCWxheW91dCA9IGdldENoaWxkTGF5b3V0KGFjdCk7Ci0JCQlYbWxFbGVtZW50IGFjdFhtbCA9IGxheW91dC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQkJCWRlc2NYbWwuYWRkQ2hpbGQoYWN0WG1sKTsKLQkJCWlmICh0b1Byb2Nlc3NFeHRlbmRlZEFjdHMpIHsKLQkJCQlwcm9jZXNzRXh0ZW5kZWRBY3QoZGVzYywgZGVzY0xpc3RYbWwsIHBhcmVudHMsIHAsIGFjdCwKLQkJCQkJCXByb2Nlc3NlZEV4dGVuZGVkQWN0U2V0LCBhbGxMb2NhbEFjdFNldCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTZXQgZ2V0QWxsTG9jYWxBY3RTZXQoTGlzdDxBY3Rpdml0eT4gYmFzZXMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCVNldCByZXQgPSBuZXcgSGFzaFNldDxBY3Rpdml0eT4oKTsKLQkJZm9yIChBY3Rpdml0eSBhY3Q6IGJhc2VzKSB7Ci0JCQlyZXQuYWRkQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0TG9jYWxDb250cmlidXRlcnNBbmRSZXBsYWNlcnMoYWN0LCBjb25maWcpKTsKLQkJfQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXh0ZW5kZWRBY3QoRGVzY3JpcHRvciBkZXNjLCBYbWxFbGVtZW50IGRlc2NMaXN0WG1sLAotCQkJTGlzdCBwYXJlbnRzLCBpbnQgcCwgQWN0aXZpdHkgYWN0LAotCQkJU2V0PEFjdGl2aXR5PiBwcm9jZXNzZWRFeHRlbmRlZEFjdFNldCwKLQkJCVNldDxBY3Rpdml0eT4gYWxsTG9jYWxBY3RTZXQpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCk7Ci0KLQkJTGlzdCBhY3RFeHRlbmRlcnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEV4dGVuZGVycyhhY3QsIGNvbmZpZyk7Ci0JCWlmICghYWN0RXh0ZW5kZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChPYmplY3Qgb2JqIDogYWN0RXh0ZW5kZXJzKSB7Ci0JCQkJQWN0aXZpdHkgZXh0QWN0ID0gKEFjdGl2aXR5KSBvYmo7Ci0JCQkJaWYgKHByb2Nlc3NlZEV4dGVuZGVkQWN0U2V0LmNvbnRhaW5zKGV4dEFjdCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXByb2Nlc3NlZEV4dGVuZGVkQWN0U2V0LmFkZChleHRBY3QpOwotCi0JCQkJTGlzdDxBY3Rpdml0eT4gZXh0ZW5kZXJQYXJlbnRzID0gX19nZXRTdXBlckFjdGl2aXRpZXMoZXh0QWN0KTsKLQkJCQlleHRlbmRlclBhcmVudHMuYWRkKGV4dEFjdCk7Ci0JCQkJCi0JCQkJYm9vbGVhbiB0b0FkZCA9IHRydWU7Ci0JCQkJaWYgKHAgPCBwYXJlbnRzLnNpemUoKSAtIDEpIHsKLQkJCQkJQWN0aXZpdHkgc3VwZXJBY3QgPSBleHRBY3Q7Ci0JCQkJCWZvciAoaW50IHBwID0gcCArIDE7IHBwIDwgcGFyZW50cy5zaXplKCk7IHBwKyspIHsKLQkJCQkJCUFjdGl2aXR5IHBhcmVudCA9IChBY3Rpdml0eSkgcGFyZW50cy5nZXQocHApOwkJCQkJCQotCQkJCQkJcGFyZW50ID0gY2hlY2tMb2NhbEFjdChhbGxMb2NhbEFjdFNldCwgc3VwZXJBY3QsIHBhcmVudCk7Ci0JCQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJCQlleHRlbmRlclBhcmVudHMuYWRkKHBhcmVudCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRvQWRkID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHRvQWRkKSB7Ci0JCQkJCWFkZERlc2NyaXB0b3IoZGVzY0xpc3RYbWwsIGRlc2MsIGV4dGVuZGVyUGFyZW50cywgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLy8xLiByZXR1cm4gbG9jYWxseSBjb250cmlidXRpbmcgYWN0IGlmIHN1cGVyQWN0IGhhcyBhIEJFIGxvY2FsbHkgY29udHJpYnV0aW5nIHRvIHBhcmVudAotCS8vMi4gcmV0dXJuIG51bGwgaWYgaWYgc3VwZXJBY3QgaGFzIGEgQkUgbG9jYWxseSByZXBsYWNpbmcgcGFyZW50Ci0JLy8zLiByZXR1cm4gcGFyZW50IG90aGVyd2lzZQotCXByaXZhdGUgQWN0aXZpdHkgY2hlY2tMb2NhbEFjdChTZXQ8QWN0aXZpdHk+IGFsbExvY2FsQWN0U2V0LCBBY3Rpdml0eSBzdXBlckFjdCwKLQkJCUFjdGl2aXR5IHBhcmVudCkgewotCQlmb3IgKEJyZWFrZG93bkVsZW1lbnQgYmUgOiBzdXBlckFjdAotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpKSB7Ci0JCQlpZiAoYmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdEJlID0gKEFjdGl2aXR5KSBiZTsKLQkJCQlpZiAoYWxsTG9jYWxBY3RTZXQuY29udGFpbnMoYmUpICYmIAotCQkJCQkJcGFyZW50ID09IGFjdEJlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlpZiAoYWN0QmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlpZiAoYWN0QmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikgewotCQkJCQkJcmV0dXJuIGFjdEJlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQlwcml2YXRlIExpc3QgX19nZXRTdXBlckFjdGl2aXRpZXMoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBidWlsZCB0aGUgcGFyZW50IG5vZGVzCi0JCUJyZWFrZG93bkVsZW1lbnQgcGFyZW50ID0gZWxlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsgCi0JCXdoaWxlICggcGFyZW50ICE9IG51bGwgKSB7Ci0JCQkKLQkJCS8vIG5lZWQgdG8gcmVhbGl6ZSB0aGUgYWN0aXZpdHksIHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IGxpbmsgYW5kIHBhcmVudCBsaW5rcwotCQkJLy8gMjA0NzQ1IC0gd3JvbmcgcHJvY2VzcyB1c2FnZSBwYXRoIGZvciBjb250cmlidXRpbmcgYWN0aXZpdGllcwotCQkJcGFyZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChwYXJlbnQsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJaWYgKCBwYXJlbnQgPT0gbnVsbCApIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaXRlbXMuYWRkKDAsIHBhcmVudCk7Ci0JCQlpZiAoTGlicmFyeVV0aWwuaXNQcm9jZXNzKHBhcmVudCkgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzQnJlYWtkb3duRWxlbWVudF9HdWlkYW5jZXMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJVW1hUGFja2FnZSB1bWFQa2cgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJaWYgKGZlYXR1cmUgPT0gdW1hUGtnLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkKLQkJaWYgKGZlYXR1cmUgPT0gdW1hUGtnLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRFeHRlbmRlciBnZXRFeHRlbmRlcigpIHsKLQkJaWYgKGV4dGVuZGVyID09IG51bGwpIHsKLQkJCWV4dGVuZGVyID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXREZWxlZ2F0ZSgpLm5ld0VsZW1lbnRMYXlvdXRFeHRlbmRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZXI7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0PFdvcmtQcm9kdWN0PiBnZXRUYWdRdWFsaWZpZWRXcExpc3QoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIExpc3Q8V29ya1Byb2R1Y3Q+IGl0ZW1zKSB7Ci0JCUVsZW1lbnRMYXlvdXRFeHRlbmRlciBleHRlbmRlciA9IGdldEV4dGVuZGVyKCk7Ci0JCWlmIChleHRlbmRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gaXRlbXM7Ci0JCX0KLQkJCi0JCXJldHVybiBleHRlbmRlci5nZXRUYWdRdWFsaWZpZWRXcExpc3QoY29uZmlnLCBpdGVtcyk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDI1ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogYWJzdHJjdCBjbGFzcyBmb3IgcHJvY2VzcyBlbGVtZW50IGxheW91dCB0aGF0IGlzIHByb2Nlc3Mgc3BlY2lmaWMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgZXh0ZW5kcwotCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHJvdGVjdGVkIFByb2Nlc3Mgb3duaW5nUHJvY2VzcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRQcm9jZXNzUGF0aCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyByZWxQcm9jZXNzUGF0aCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHBhdGhzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlOYW1lID0gbnVsbDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3QgYSBsYXlvdXQgZm9yIHByb2Nlc3MgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXRNYW5hZ2VyCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duaW5nUHJvYwotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlQcm9jZXNzIG93bmluZ1Byb2MsIFN0cmluZyBwYXRoKSB7Ci0KLQkJaW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQotCQl0aGlzLm93bmluZ1Byb2Nlc3MgPSBvd25pbmdQcm9jOwotCQl0aGlzLmVsZW1lbnRQcm9jZXNzUGF0aCA9IHBhdGg7Ci0KLQkJaWYgKHRoaXMub3duaW5nUHJvY2VzcyA9PSBudWxsKSB7Ci0JCQl0aGlzLm93bmluZ1Byb2Nlc3MgPSBUbmdVdGlsCi0JCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBzdXBlci5lbGVtZW50KTsKLQkJfQotCi0JCWlmIChMaWJyYXJ5VXRpbC5pc1Byb2Nlc3MoZWxlbWVudCkpIHsKLQkJCW93bmluZ1Byb2Nlc3MgPSAoUHJvY2VzcykgZWxlbWVudDsKLQkJCWVsZW1lbnRQcm9jZXNzUGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQubWFrZVBhdGgobnVsbCwKLQkJCQkJZWxlbWVudCk7Ci0JCQlyZWxQcm9jZXNzUGF0aCA9IGVsZW1lbnRQcm9jZXNzUGF0aDsKLQkJfQotCQkKLQkJaWYgKCBlbGVtZW50UHJvY2Vzc1BhdGggPT0gbnVsbCAmJiB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotCQl7Ci0JCQllbGVtZW50UHJvY2Vzc1BhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldFBhdGgoKEJyZWFrZG93bkVsZW1lbnQpdGhpcy5lbGVtZW50KTsKLQkJfQotCQkKLQkJLy8gZ2V0IHRoZSBwYXRoIGFycmF5Ci0JCXBhdGhzID0gZ2V0UGF0aEFycmF5KGVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCQotCX0KLQotCi0JLyoqCi0JICogdGhlIHByb2Nlc3MgcGF0aCBvZiB0aGlzIGl0ZW0gcmVsYXRpdmUgdG8gdGhlIGNhbGxpbmcgaXRlbQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpdmVQcm9jZXNzUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCXRoaXMucmVsUHJvY2Vzc1BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHJlbGF0aXZlIHByb2Nlc3MgcGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVByb2Nlc3NQYXRoKCkKLQl7Ci0JCXJldHVybiB0aGlzLnJlbFByb2Nlc3NQYXRoOwotCX0KLQkKLS8vCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotLy8JCVN0cmluZyB1cmwgPSBzdXBlci5nZXRVcmwoKTsKLS8vCi0vLwkJcmV0dXJuIHVybCArIGdldFF1ZXJ5U3RyaW5nKCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBnZXQgcXVlcnkgc3RyaW5nIGZvciB0aGUgcHJvY2VzcyBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgewotLy8JCWlmIChvd25pbmdQcm9jZXNzID09IGVsZW1lbnQpIHsKLS8vCQkJcmV0dXJuICIiOwotLy8JCX0KLQkJLy8gcmV0dXJuICI/IiArIFJlc291cmNlSGVscGVyLlVSTF9QQVJBTUVURVJfUFJPQ0VTUyArICI9IiArCi0JCS8vIG93bmluZ1Byb2Nlc3MuZ2V0R3VpZCgpICsgIiYiICsgUmVzb3VyY2VIZWxwZXIuVVJMX1BBUkFNRVRFUl9QQVRIICsKLQkJLy8gIj0iICsgZWxlbWVudFByb2Nlc3NQYXRoOwotCi0JCXJldHVybiBFbGVtZW50TGF5b3V0TWFuYWdlci5nZXRRdWVyeVN0cmluZyhvd25pbmdQcm9jZXNzLmdldEd1aWQoKSwKLQkJCQllbGVtZW50UHJvY2Vzc1BhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldERpc3BsYXlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlpZiAoIHRoaXMuZGlzcGxheU5hbWUgPT0gbnVsbCApIHsKLQkJCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJCQotCQkJLy8gbmVlZCB0byBoYW5kbGUgdGhlIHN1cHJlc3NlZCBicmVha2Rvd24gZWxlbWVudHMKLQkJCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkKLQkJCS8vIGRpc3BsYXkgbmFtZSBuZWVkcyB0byBiZSBmaXhlZCwgZXh0ZW5kZWQgYWN0aXZpdHkgbWF5IG5lZWQgdG8gZ2V0IGRpc3BsYXkgbmFtZSBmcm9tIHRoZSBiYXNlCi0JCQkvLyBEVlQ6ICBQTnMgb2YgZXh0ZW5kZWQgcHJvY2Vzc2VzIG5vIHBpY2tlZCB1cCBmb3IgcHVibGlzaCAoVENUIDYzOCkKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgodGhpcy5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCQl9Ci0JCi0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQl3cmFwcGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQotCQkJdGhpcy5kaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShlbGVtZW50LAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBhZGFwdGVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKQotCXsKLQkJcmV0dXJuIGxheW91dE1hbmFnZXIuZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoKTsKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInF1ZXJ5U3RyaW5nIiwgZ2V0UXVlcnlTdHJpbmcoKSkgLy8kTk9OLU5MUy0xJAotCQkJLy8uc2V0QXR0cmlidXRlKCJvd25pbmdQcm9jZXNzR3VpZCIsIG93bmluZ1Byb2Nlc3MuZ2V0R3VpZCgpKSAvLyAvLyROT04tTkxTLTEkCi0JCQkvLy5zZXRBdHRyaWJ1dGUoImVsZW1lbnRQcm9jZXNzUGF0aCIsIGVsZW1lbnRQcm9jZXNzUGF0aCkgLy8kTk9OLU5MUy0xJAotCQkJLnNldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiLCByZWxQcm9jZXNzUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcygpIHsKLQkJcmV0dXJuIG93bmluZ1Byb2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIElFbGVtZW50TGF5b3V0IGdldExheW91dChQcm9jZXNzRWxlbWVudEl0ZW0gaXRlbSkgewotCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChpdGVtLmVsZW1lbnQsIG93bmluZ1Byb2Nlc3MsIGl0ZW0ucGF0aCk7Ci0JCQotCQlpZiAoIGxheW91dCBpbnN0YW5jZW9mIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgKQotCQl7CQkKLQkJCS8vIHNldCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIGxheW91dCBzaW5jZSB0aGlzIGlzIHRoZSBjYWxsZXIKLQkJCVN0cmluZyByZWxQYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRSZWxhdGl2ZVBhdGgoaXRlbS5wYXRoLCB0aGlzLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCQkoKEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQpbGF5b3V0KS5zZXRSZWxhdGl2ZVByb2Nlc3NQYXRoKHJlbFBhdGgpOwotCQl9Ci0JCXJldHVybiBsYXlvdXQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckFjdGl2aXR5UGF0aCgpIHsKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCApIHsKLQkJCUFjdGl2aXR5IGFjdCA9ICgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCVN0cmluZyBpZCA9IGFjdC5nZXRHdWlkKCk7Ci0JCQlpbnQgaSA9IGVsZW1lbnRQcm9jZXNzUGF0aC5pbmRleE9mKGlkKTsKLQkJCWlmICggaSA+PTAgKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnRQcm9jZXNzUGF0aC5zdWJzdHJpbmcoMCwgaSArIGlkLmxlbmd0aCgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIG1ha2UgYSBwYXRoIGZvciB0aGUgcHJvY2VzcyBlbGVubWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VQYXRoKFN0cmluZyBwYXJlbnRQYXRoLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudFBhdGggPT0gbnVsbCB8fCBwYXJlbnRQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBlbGVtZW50LmdldEd1aWQoKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnRQYXRoICsgIiwiICsgZWxlbWVudC5nZXRHdWlkKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBzdGF0aWMgbWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiBhIGJyZWFrIGRvd24gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJU3RyaW5nIHBhdGggPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJQnJlYWtkb3duRWxlbWVudCBhY3QgPSBlbGVtZW50OwotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0KLQkJLy8gQ2hlY2sgc3VwZXJhY3Rpdml0eSBpcyBwcm9jZXNzIGFuZCBzaG91bGQgb3duaW5nIHByb2Nlc3MgKHRoaXMgaXMgdXNlZnVsIGluIGRlZXBjb3B5Ci0JCXdoaWxlICggYWN0ICE9IHByb2MgKQotCQl7Ci0JCQlBY3Rpdml0eSBzdXBlckFjdHMgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZiAoIHN1cGVyQWN0cyAhPSBudWxsICkKLQkJCXsKLQkJCQlhY3QgPSBzdXBlckFjdHM7Ci0JCQkJcGF0aCA9IGFjdC5nZXRHdWlkKCkgKyAiLCIgKyBwYXRoOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXRoOwkJCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcGF0aCBmb3IgYSBnaXZlbiBicmVha2Rvd24gZWxlbWVudCBpdGVtIHByb3ZpZGVyCi0JICogQHBhcmFtIHdyYXBwZXIgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikKLQl7Ci0JCU9iamVjdCBlID0gTGlicmFyeVV0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoICEoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJT2JqZWN0IHRvcEl0ZW0gPSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXBhdGguYXBwZW5kKCgoTWV0aG9kRWxlbWVudCllKS5nZXRHdWlkKCkpOwotCQkKLQkJT2JqZWN0IHBhcmVudCA9IHdyYXBwZXI7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gdG9wSXRlbSkgewotCQkJaWYgKCBwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICkgewotCQkJCXBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudClwYXJlbnQpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCWUgPSBwYXJlbnQ7Ci0JCQl9IGVsc2UgaWYgKCBwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciApewotCQkJCXBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpcGFyZW50KS5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQllID0gTGlicmFyeVV0aWwudW53cmFwKHBhcmVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcGF0aC5pbnNlcnQoMCwgKChNZXRob2RFbGVtZW50KWUpLmdldEd1aWQoKSArICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogdXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBwYXJlbnQKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKiBAcGFyYW0gcGFyZW50UGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIHBhcmVudFBhdGgpIHsKLQkJCi0JCWlmICggcGF0aCA9PSBudWxsICkKLQkJewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQkJCi0JCWlmICggcGF0aC5zdGFydHNXaXRoKHBhcmVudFBhdGgpICkKLQkJewotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKHBhcmVudFBhdGgubGVuZ3RoKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHBhdGggYXJycmF5Ci0JICogQHBhcmFtIHBhdGggU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UGF0aEFycmF5KFN0cmluZyBwYXRoKQotCXsKLQkJaWYgKCBwYXRoID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde307CQkJCi0JCX0KLQkJCi0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aCwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoIHN0Lmhhc01vcmVUb2tlbnMoKSApCi0JCXsKLQkJCVN0cmluZyBzID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKCBzLmxlbmd0aCgpID4gMCApCi0JCQl7Ci0JCQkJaXRlbXMuYWRkKHMpOwotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmdbXSBhcnIgPSBuZXcgU3RyaW5nW2l0ZW1zLnNpemUoKV07Ci0JCWl0ZW1zLnRvQXJyYXkoYXJyKTsKLQkJCi0JCXJldHVybiBhcnI7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb3duaW5nIHByb2Nlc3MgZnJvbSBwYXRoLCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcGF0aCBpcyB0aGUgZ3VpZCBvZiB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPd25pbmdQcm9jZXNzR3VpZEZyb21QYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJaWYgKCBwYXRoID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaW50IGluZGV4ID0gcGF0aC5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGd1aWQ7Ci0JCWlmICggaW5kZXggPCAwICkKLQkJewotCQkJZ3VpZCA9IHBhdGg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlndWlkID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHBhcmVudCBwYXRoCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcmVudFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCBwYXRoID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaW5kZXggPiAwICkgewotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODVmNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5CU0NvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUm9sZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJfTkFNRV9BQ1RJVklUWV9ERVNDID0gIkRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQl9OQU1FX0FDVElWSVRZX1dCUyA9ICJXQlMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCX05BTUVfQUNUSVZJVFlfVEJTID0gIlRCUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJfTkFNRV9BQ1RJVklUWV9XUEJTID0gIldQQlMiOyAvLyROT04tTkxTLTEkCi0JCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFDRV9SRVBMQUNFTUVOVCA9ICJfQlJfIjsJIC8vJE5PTi1OTFMtMSQKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5CUkFDRV9TVFJJTkcgPSAiXFx7IjsJIC8vJE5PTi1OTFMtMSQKLQkKLQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIHVzZXJEaWFncmFtSW5mbyA9IG51bGw7Ci0JYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJpdmF0ZSBUQlNJdGVtRGV0YWlsIGl0ZW1EZXRhaWwgPSBuZXcgVEJTSXRlbURldGFpbCgpOwotCQotCXB1YmxpYyBBY3Rpdml0eUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzIGlzIGxvYWRlZAotCQkvLyBvdGhlcndpc2UgdGhlIHByb2Nlc3Mgb3IgcHJvY2VzcyBlbGVtZW50cyBtYXkgbm90IGhhdmUgYSB2YWxpZCBjb250YWluZXIKLQkJLy8gYW5kIHRodXMgdGhlIGVsZW1lbnQgY29udGVudCBwYXRoIGNhbid0IGJlIGRldGVybWluZWQKLQkJLy8gdGhpcyBpcyBqdXN0IGEgd29ya2Fyb3VuZC4gc2hvdWxkIHdlIGhhdmUgYSBiZXR0ZXIgd2F5IHRvIG1ha2Ugc3VyZSB0aGUgZWxlbWVudHMgYXJlIGxvYWRlZCBjb3JyZWN0bHk/Pz8/Pz8/Pz8/PwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlpZiAoIHBsdWdpbiA9PSBudWxsIHx8IHBsdWdpbi5lQ29udGFpbmVyKCkgPT0gbnVsbCApIHsKLQkJCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gcHVibGlzaGluZyBtb2RlIHNpbmNlIHRoZSB3aG9sZSBsaWJyYXJ5IGlzIGFscmVhZHkgbG9hZGVkCi0JCQlpZiAoIGRlYnVnICYmIGdldExheW91dE1ncigpLmlzUHVibGlzaGluZ01vZGUoKSApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBFbGVtZW50IHdpdGhvdXQgYSB2YWxpZCBjb250YWluZXI6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJTGlicmFyeVV0aWwubG9hZEFsbFByb2Nlc3NlcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQl9Ci0JCQotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0KLQkJdXNlckRpYWdyYW1JbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oKEFjdGl2aXR5KWVsZW1lbnQpOwotCQkKLQkKLQkJLy8gc2V0dXAgdGhlIG11bHRpIGxheW91dCBvdXRwdXQKLQkJLy8gU3RyaW5nIGZpbGVfZGVzYyA9IHN1cGVyLmdldEZpbGVOYW1lKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwkJCi0JCQotCQlTdHJpbmcgZmlsZTsKLQkJCi0vLwkJaWYgKHN1cGVyLmVsZW1lbnQuZ2V0R3VpZCgpLnN0YXJ0c1dpdGgoInsiKSkKLS8vCQl7Ci0vLwkJCVN0cmluZyBuZXdHdWlkID0gc3VwZXIuZWxlbWVudC5nZXRHdWlkKCkucmVwbGFjZUZpcnN0KCBPUEVOQlJBQ0VfU1RSSU5HLCBCUkFDRV9SRVBMQUNFTUVOVCApOwotLy8JCQlmaWxlID0gc3VwZXIuZWxlbWVudC5nZXROYW1lKCkgKyBuZXdHdWlkLnN1YnN0cmluZygwLCBuZXdHdWlkLmxlbmd0aCgpLTEpOwotLy8JCX0KLS8vCQllbHNlCi0JCQkvL2ZpbGUgPSBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHN1cGVyLmVsZW1lbnQuZ2V0TmFtZSgpKSArIHN1cGVyLmVsZW1lbnQuZ2V0R3VpZCgpOwotCQkKLQkJZmlsZSA9IGdldEZpbGVOYW1lKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQlpZiAoZmlsZSAhPSBudWxsICkgewotCQkJLy8gcmVwbGFjZSAnIGFuZCAiIHdpdGggc3BhY2UKLQkJCWZpbGUgPSBmaWxlLnJlcGxhY2UoJ1wnJywgJyAnKS5yZXBsYWNlKCdcIicsICcgJyk7Ci0JCQkKLQkJCXNldExheW91dEluZm8obmV3IExheW91dEluZm8oCi0JCQkJVEFCX05BTUVfQUNUSVZJVFlfREVTQywgImFjdGl2aXR5X2Rlc2MueHNsIiwgZmlsZSArIFRBQlVSTF9TVUZGSVhfREVTQywgdHJ1ZSkpOyAvLyROT04tTkxTLTEkIAotCQkJc2V0TGF5b3V0SW5mbyhuZXcgTGF5b3V0SW5mbygKLQkJCQlUQUJfTkFNRV9BQ1RJVklUWV9XUEJTLCAiYWN0aXZpdHlfd3Bicy54c2wiLCBmaWxlICsgVEFCVVJMX1NVRkZJWF9XUEJTLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIAotCQkJc2V0TGF5b3V0SW5mbyhuZXcgTGF5b3V0SW5mbygKLQkJCQlUQUJfTkFNRV9BQ1RJVklUWV9UQlMsICJhY3Rpdml0eV90YnMueHNsIiwgZmlsZSArIFRBQlVSTF9TVUZGSVhfVEJTLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIAotCQkJc2V0TGF5b3V0SW5mbyhuZXcgTGF5b3V0SW5mbygKLQkJCQlUQUJfTkFNRV9BQ1RJVklUWV9XQlMsICJhY3Rpdml0eV93YnMueHNsIiwgZmlsZSArIFRBQlVSTF9TVUZGSVhfV0JTLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIAotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBBY3Rpdml0eUxheW91dC5pbml0OiBubyBmaWxlIGZvciBlbGVtZW50ICIgKyBzdXBlci5lbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYc2xVcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WHNsVXJsKCkgewotCQkvLyBzZXQgdGhlIGRlZmF1bHQgdGFiIHVybCwgdGhlIGRlZmF1bHQgdGFiIHdpbGwgYmUgc2V0IGluIHB1Ymxpc2hpbmcuCi0JCS8vIGZvciBicm93c2luZywgdXNlIHRoZSBUQUJfTkFNRV9BQ1RJVklUWV9XQlMgdGFiCi0JCVN0cmluZyB0YWJOYW1lID0gZ2V0TGF5b3V0TWdyKCkuZ2V0VmFsaWRhdG9yKCkuZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCk7Ci0JCWlmICggdGFiTmFtZSA9PSBudWxsICkgewotCQkJdGFiTmFtZSA9IFRBQl9OQU1FX0FDVElWSVRZX1dCUzsKLQkJfQotCQlMYXlvdXRJbmZvIGluZm8gPSBnZXRMYXlvdXRJbmZvKHRhYk5hbWUpOwotCQlpZiAoIGluZm8gPT0gbnVsbCApIHsKLQkJCWluZm8gPSBnZXRMYXlvdXRJbmZvKFRBQl9OQU1FX0FDVElWSVRZX1dCUyk7Ci0JCX0JCi0JCQotCQlyZXR1cm4gaW5mby5sYXlvdXRfeHNsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCVVJMX1NVRkZJWF9ERVNDID0gIl9kZXNjIiArIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCVVJMX1NVRkZJWF9XUEJTID0gIl93cGJzIiArIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCVVJMX1NVRkZJWF9UQlMgPSAiX3RicyIgKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQlVSTF9TVUZGSVhfV0JTID0gIl93YnMiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2aXR5VGFiVXJsKFN0cmluZyB1cmwpIHsKLQkJCi0JCWlmICggdXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiAodXJsLmVuZHNXaXRoKFRBQlVSTF9TVUZGSVhfREVTQykgCi0JCQkJfHwgdXJsLmVuZHNXaXRoKFRBQlVSTF9TVUZGSVhfV1BCUykgCi0JCQkJfHwgdXJsLmVuZHNXaXRoKFRBQlVSTF9TVUZGSVhfVEJTKSAKLQkJCQl8fCB1cmwuZW5kc1dpdGgoVEFCVVJMX1NVRkZJWF9XQlMpICk7Ci0JCQotCX0KLQkvKioKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjb2xsZWN0IHRoZSBTdXBwb3J0aW5nTWF0ZXJpYWxzIHRoYXQgYXJlIGZvciB1c2VyIGRlZmluZWQgZGlhZ3JhbXMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQkKLQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCApIHsJCQkKLQkJCXJldHVybiAhdXNlckRpYWdyYW1JbmZvLmlzRGlhZ3JhbSggKFN1cHBvcnRpbmdNYXRlcmlhbCl2YWx1ZSApOwotCQl9Ci0JCWVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIExpc3QgKQotCQl7Ci0JCQlMaXN0IGl0ZW1zID0gKExpc3QpdmFsdWU7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoIGkgPCBpdGVtcy5zaXplKCkgKQotCQkJewotCQkJCU9iamVjdCBvID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmICggKG8gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpICYmIHVzZXJEaWFncmFtSW5mby5pc0RpYWdyYW0oKFN1cHBvcnRpbmdNYXRlcmlhbClvKSApIHsJCQkKLQkJCQkJaXRlbXMucmVtb3ZlKGkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQkKLQkJU3RyaW5nIG1zZzsKLQkJVGltZXIgdCA9IG51bGw7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQl0ID0gbmV3IFRpbWVyKCk7CQotCQkJbXNnID0gIkdlbmVyYXRpbmcgbGF5b3V0IHhtbCBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICAvLyROT04tTkxTLTEkIAotCQkJCSsgIiwgaW5jbHVkZVJlZmVyZW5jZXMgPSAiICsgaW5jbHVkZVJlZmVyZW5jZXM7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JCQotCi0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoKTsKLQkJCi0JCS8vIGxvYWQgdGhlIGF0dHJpYnV0ZXMKLQkJbG9hZEF0dHJpYnV0ZXMoZWxlbWVudFhtbCk7Ci0JCQotLy8JCS8vIHNldCB0aGUgZGVmYXVsdCB0YWIgdXJsLCB0aGUgZGVmYXVsdCB0YWIgd2lsbCBiZSBzZXQgaW4gcHVibGlzaGluZy4KLS8vCQkvLyBmb3IgYnJvd3NpbmcsIHVzZSB0aGUgVEFCX05BTUVfQUNUSVZJVFlfV0JTIHRhYgotLy8JCVN0cmluZyB0YWJOYW1lID0gZ2V0TGF5b3V0TWdyKCkuZ2V0VmFsaWRhdG9yKCkuZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCk7Ci0vLwkJaWYgKCB0YWJOYW1lID09IG51bGwgKSB7Ci0vLwkJCXRhYk5hbWUgPSBUQUJfTkFNRV9BQ1RJVklUWV9XQlM7Ci0vLwkJfQotLy8JCUxheW91dEluZm8gbGluZm8gPSBnZXRMYXlvdXRJbmZvKHRhYk5hbWUpOwotLy8JCWlmICggbGluZm8gPT0gbnVsbCApIHsKLS8vCQkJbGluZm8gPSBnZXRMYXlvdXRJbmZvKFRBQl9OQU1FX0FDVElWSVRZX1dCUyk7Ci0vLwkJfQkKLS8vCQkKLS8vCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiZGVmYXVsdFRhYlVybCIsIGxpbmZvLmZpbGVOYW1lKTsKLS8vCQkKLQkJUHJvY2VzcyBwcm9jID0gZ2V0T3duaW5nUHJvY2VzcygpOwotCQkKLQkJLy8gbmVlZCB0byBoYW5kbGUgdGhlIHN1cHJlc3NlZCBicmVha2Rvd24gZWxlbWVudHMKLQkJLy8gdXNlIHRoZSBTdXByZXNzIHV0aWxpdHkKLQkJU3VwcHJlc3Npb24gc3VwID0gZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0KLS8vCQkvLyBkaXNwbGF5IG5hbWUgbmVlZHMgdG8gYmUgZml4ZWQsIGV4dGVuZGVkIGFjdGl2aXR5IG1heSBuZWVkIHRvIGdldCBkaXNwbGF5IG5hbWUgZnJvbSB0aGUgYmFzZQotLy8JCS8vIERWVDogIFBOcyBvZiBleHRlbmRlZCBwcm9jZXNzZXMgbm8gcGlja2VkIHVwIGZvciBwdWJsaXNoIChUQ1QgNjM4KQotLy8JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0vLwkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0vLwkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotLy8JCX0KLS8vCi0vLwkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLS8vCQkJCXdyYXBwZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwotLy8JCVN0cmluZyBkaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShlbGVtZW50LAotLy8JCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgYWRhcHRlcik7Ci0vLwotLy8JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIGRpc3BsYXlOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKCFpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JCX0KLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkvLyBnZXQgdGhlIHRhYnMgeG1sIHNlY3Rpb24KLQkJWG1sRWxlbWVudCB0YWJzWG1sID0gZWxlbWVudFhtbC5uZXdDaGlsZCgidGFicyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUxheW91dEluZm8gaW5mbyA9IChMYXlvdXRJbmZvKSBpdC5uZXh0KCk7Ci0JCQl0YWJzWG1sLm5ld0NoaWxkKCJ0YWIiKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBpbmZvLm5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgidXJsIiwgc3VwZXIuZWxlbWVudFBhdGggKyBpbmZvLmZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gZG8gaXQgb25seSB3aGVuIGl0J3MgYSBwcm9jZXNzIG9yIGl0J3Mgbm90IGluIHB1Ymxpc2hpbmcgbW9kZWwKLQkJLy8gc2luY2UgaW4gcHVibGlzaGluZywgdGhlIGl0ZXJhdGlvbiBhbHdheXMgc3RhcnQgZnJvbSBwcm9jZXNzCi0JCS8vIGZvciBicm93c2luZywgaXQgY2FuIHN0YXJ0IGluIHRoZSBtaWRkbGUgCi0JCWlmICggIWdldExheW91dE1ncigpLmlzUHVibGlzaGluZ01vZGUoKSB8fCBzdXBlci5lbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzICkgewotCQkJZ2V0TGF5b3V0TWdyKCkucHJlcGFyZUFkYXB0b3JGYWN0b3JpZXNGb3JQcm9jZXNzKHByb2MpOwotCQl9Ci0KLQkJLy8gbG9hZCB0aGUgY29weXJpZ2h0IGluZm8KLQkJbG9hZENvcHlyaWdodChlbGVtZW50WG1sKTsKLQotCQkvLyBjYWxjdWxhdGUgb3RoZXIgc2VsZWN0ZWQgcmVmZXJlY25lcwotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgZWxlbWVudCByZWZlcmVuY2VzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkJLmdldChpKTsKLQotCQkJCS8vIHNraXAgdGhlIGJyZWFrZG93biBlbGVtZW50cyBzaW5jZSB3ZSB3aWxsIGJ1aWxkIHRoZSBicmVha2Rvd24KLQkJCQkvLyBzdHJ1Y3R1cmUgbGF0ZXIKLQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gT2JqZWN0IHZhbHVlID0gZWxlbWVudC5nZXQoaSk7Ci0JCQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgRUNsYXNzKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlsb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb24gb3Bwb3NpdGVQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmdldE9wcG9zaXRlRmVhdHVyZXMoKSk7Ci0JCWZvciAoSXRlcmF0b3Igej0gb3Bwb3NpdGVQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7IHouaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIHoubmV4dCgpOwotCQkJbG9hZEZlYXR1cmUob2ZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJfQotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQuc3RvcCgpOwotCQkJbXNnID0gdC5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBBY3Rpdml0eSBEZXNjcmlvdGlvbiB4bWwgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkKLQkJCXQuc3RhcnQoKTsKLQkJfQotCi0JCWJ1aWxkV0JTKGVsZW1lbnRYbWwsIHN1cCk7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQl0LnN0b3AoKTsKLQkJCW1zZyA9IHQuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgYnVpbGRpbmcgV0JTIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJCi0JCQl0LnN0YXJ0KCk7Ci0JCX0KLQkJCi0JCWJ1aWxkVEJTKGVsZW1lbnRYbWwsIHN1cCk7CQotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQuc3RvcCgpOwotCQkJbXNnID0gdC5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBUQlMgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCi0JCQl0LnN0YXJ0KCk7Ci0JCX0KLQkJCi0JCWJ1aWxkV1BCUyhlbGVtZW50WG1sLCBzdXApOwotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQuc3RvcCgpOwotCQkJbXNnID0gdC5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBXUEJTIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJCi0JCQltc2cgPSB0LmdldFRvdGFsVGltZSgpICsgIiBtaW5pIHNlY29uZHMgYnVpbGRpbmcgbGF5b3V0IHhtbCBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCQkKLQkJCi0vLwkJLy8gZm9yIHRlc3Qgb25seQotLy8JCVByb2Nlc3NMYXlvdXREYXRhIGRhdGEgPSBuZXcgUHJvY2Vzc0xheW91dERhdGEoZ2V0T3duaW5nUHJvY2VzcygpLmdldEd1aWQoKSk7Ci0vLwkJbG9hZExheW91dERhdGEoZGF0YSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVc2VyRGlhZ3JhbVRleHQoU3VwcG9ydGluZ01hdGVyaWFsIHVzZXJEaWFncmFtKQotCXsKLQkJLy8gdXNlciBkZWZpbmVkIGRpYWdyYW0KLQkJQWJzdHJhY3RFbGVtZW50TGF5b3V0IGwgPSBuZXcgR2VuZXJhbExheW91dCgpOwotCQlsLmluaXQoZ2V0TGF5b3V0TWdyKCksIHVzZXJEaWFncmFtLmdldFByZXNlbnRhdGlvbigpKTsKLQkJbC5zZXRDb250ZW50VGFyZ2V0KGVsZW1lbnQpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQkJcmV0dXJuIChTdHJpbmcpbC5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZmVhdHVyZSk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENvbHVtbnMoWG1sRWxlbWVudCBwYXJlbnRYbWwsIExpc3QgY29scykgewotCQlYbWxFbGVtZW50IGNvbHNYbWwgPSBwYXJlbnRYbWwubmV3Q2hpbGQoImNvbHVtbnMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29scy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJQlNDb2x1bW4gY29sID0gKEJTQ29sdW1uKWl0Lm5leHQoKTsKLQkJCWNvbHNYbWwubmV3Q2hpbGQoImNvbHVtbiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJpZCIsIGNvbC5pZCkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoImxhYmVsIiwgY29sLmxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFdCUyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCS8vIGJ1aWxkIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRyZWUKLQkJWG1sRWxlbWVudCBicyA9IGVsZW1lbnRYbWwKLQkJCQkubmV3Q2hpbGQoImJyZWFrZG93biIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIGNvbHVtbnMKLQkJc2V0Q29sdW1ucyhicywgUHJlZmVyZW5jZVV0aWwuZ2V0V0JTQ29sdW1ucygpKTsKLQkJCi0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCQkvLyBpZiAoIHN1cGVyLmVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzICkKLQkJewotCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzdXAuZ2V0UHJvY2VzcygpKTsKLQkJfQotCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCi0JCS8vIGVzY2FwZSB0aGUgcXVvdGVzIGluIHRoZSBzdHJpbmcgc2ljbmUgd2Ugc2V0IHRoZSBzdHJpbmcgaW50byBqYXZhc2NyaXB0IHZhcmlhYmxlcyBpbiB0aGUgbGF5b3V0Ci0JCXNldHRpbmcuZXNjYXBlU3RyaW5nID0gdHJ1ZTsKLQkJCi0JCS8vIHNldCB0byBvbmx5IHNob3cgdGFzayBkZXNjcmlwdG9ycyBmb3Igc3ViLWFjdGl2aXRpZXMKLQkJc2V0dGluZy5zaG93VGFza09ubHkgPSB0cnVlOwotCQkKLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfSAKLQkJCi0JCWlmICggc3VwLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQlpdGVyYXRlKGVsZW1lbnRJdGVtLCBicywgc2V0dGluZyk7Ci0JCQotCi0JCVhtbEVsZW1lbnQgZGlhZ3JhbXMgPSBlbGVtZW50WG1sLm5ld0NoaWxkKCJkaWFncmFtcyIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlTdHJpbmcgZGlhZ3JhbVR5cGU7Ci0JCVN0cmluZyBpbWdGaWxlOwotCQlkaWFncmFtVHlwZSA9IFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIHVzZXJEaWFncmFtID0gdXNlckRpYWdyYW1JbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpOwotCQlpZiAoIHVzZXJEaWFncmFtSW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICYmICh1c2VyRGlhZ3JhbSAhPSBudWxsKSApCi0JCXsJCQkJCi0JCQlkaWFncmFtcy5uZXdDaGlsZCgidXNlcmRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGRpYWdyYW1UeXBlKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldFZhbHVlKGdldFVzZXJEaWFncmFtVGV4dCh1c2VyRGlhZ3JhbSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyB1ZGRJbmZvID0gZ2V0UmVhbGl6ZWRVREQoc3VwLCBkaWFncmFtVHlwZSk7Ci0JCQlib29sZWFuIGdlbmVyYXRlZERpYWdyYW0gPSB0cnVlOwotCQkJaWYodWRkSW5mbyAhPSBudWxsKXsKLQkJCQl1c2VyRGlhZ3JhbSA9IHVkZEluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0JCQkJaWYodWRkSW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICYmIHVzZXJEaWFncmFtICE9IG51bGwpewotCQkJCQlkaWFncmFtcy5uZXdDaGlsZCgidXNlcmRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBkaWFncmFtVHlwZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0VmFsdWUoZ2V0VXNlckRpYWdyYW1UZXh0KHVzZXJEaWFncmFtKSk7Ci0JCQkJCWdlbmVyYXRlZERpYWdyYW0gPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGdlbmVyYXRlZERpYWdyYW0pewotCQkJCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIGRpYWdyYW1UeXBlKTsKLQkJCQlEaWFncmFtSW5mbyBkaWFncmFtX3dvcmtmbG93ID0gZ2VuZXJhdGVEaWFncmFtKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwkKLQkJCQlpZiAoZGlhZ3JhbV93b3JrZmxvdyAhPSBudWxsCi0JCQkJCSYmIGRpYWdyYW1fd29ya2Zsb3cuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCQlkaWFncmFtcy5uZXdDaGlsZCgiZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1cpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImFsdCIsIGdldERpYWdyYW1EaXNwbGF5TmFtZShSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1cpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLy5zZXRWYWx1ZShkaWFncmFtX3dvcmtmbG93LmdldEhUTUwoKSk7Ci0JCQkJCQkuYWRkQ2hpbGQoZGlhZ3JhbV93b3JrZmxvdy5nZXRYbWxFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQl1c2VyRGlhZ3JhbSA9IHVzZXJEaWFncmFtSW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQkJaWYgKCB1c2VyRGlhZ3JhbUluZm8uY2FuUHVibGlzaEFEREltYWdlKCkgJiYgKHVzZXJEaWFncmFtICE9IG51bGwpICkKLQkJewkJCQkKLQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJ1c2VyZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZGlhZ3JhbVR5cGUpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0VmFsdWUoZ2V0VXNlckRpYWdyYW1UZXh0KHVzZXJEaWFncmFtKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBkaWFncmFtVHlwZSk7Ci0JCQlEaWFncmFtSW5mbyBkaWFncmFtX2RldGFpbCA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCQlpZiAoZGlhZ3JhbV9kZXRhaWwgIT0gbnVsbCAmJiBkaWFncmFtX2RldGFpbC5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCWRpYWdyYW1zCi0JCQkJCQkubmV3Q2hpbGQoImRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJImFsdCIsIGdldERpYWdyYW1EaXNwbGF5TmFtZShSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8uc2V0VmFsdWUoZGlhZ3JhbV9kZXRhaWwuZ2V0SFRNTCgpKTsKLQkJCQkJCS5hZGRDaGlsZChkaWFncmFtX2RldGFpbC5nZXRYbWxFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCQotCQlkaWFncmFtVHlwZSA9IFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCQl1c2VyRGlhZ3JhbSA9IHVzZXJEaWFncmFtSW5mby5nZXRXUEREaWFncmFtKCk7Ci0JCWlmICggdXNlckRpYWdyYW1JbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpICYmICh1c2VyRGlhZ3JhbSAhPSBudWxsKSApCi0JCXsJCQkJCi0JCQlkaWFncmFtcy5uZXdDaGlsZCgidXNlcmRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGRpYWdyYW1UeXBlKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldFZhbHVlKGdldFVzZXJEaWFncmFtVGV4dCh1c2VyRGlhZ3JhbSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaW1nRmlsZSA9IFJlc291cmNlSGVscGVyLmdldERpYWdyYW1GaWxlUGF0aE5hbWUoZWxlbWVudCwgZGlhZ3JhbVR5cGUpOwotCQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93cCA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCQlpZiAoZGlhZ3JhbV93cCAhPSBudWxsICYmIGRpYWdyYW1fd3AuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCQlkaWFncmFtcy5uZXdDaGlsZCgiZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJImFsdCIsIGdldERpYWdyYW1EaXNwbGF5TmFtZShSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vLnNldFZhbHVlKGRpYWdyYW1fd3AuZ2V0SFRNTCgpKTsKLQkJCQkJCS5hZGRDaGlsZChkaWFncmFtX3dwLmdldFhtbEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGlhZ3JhbURpc3BsYXlOYW1lKFN0cmluZyB0eXBlKSB7Ci0JCi0JCVN0cmluZyBuYW1lID0gZ2V0RGlzcGxheU5hbWUoKTsKLQkJaWYgKCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1cuZXF1YWxzKHR5cGUpICkgewotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuYWN0aXZpdHlEaWFncmFtTmFtZSwgbmFtZSk7CQkKLQkJfSBlbHNlIGlmICggUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTC5lcXVhbHModHlwZSkgKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lLCBuYW1lKTsJCQotCQl9IGVsc2UgaWYgKCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWS5lcXVhbHModHlwZSkgKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy53cERlcGVuZGVuY3lEaWFncmFtTmFtZSwgbmFtZSk7CQkKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotLy8JcHJpdmF0ZSBEaWFncmFtSW5mbyBnZW5lcmF0ZURpYWdyYW0oU3VwcHJlc3Npb24gc3VwLCBTdHJpbmcgZGlhZ3JhbVR5cGUsIFN0cmluZyBpbWdGaWxlKSB7Ci0vLwkJCi0vLy8vCQlpZiAoICJfbzNuWm9TRnJFZHFyWDhZVnp2dGxJZyxfamluMm9DR0dFZHFNY292UnprQ1FvdyIuZXF1YWxzKHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCkgKSB7Ci0vLy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJ4eCIpOwotLy8vLwkJfQotLy8JCQotLy8JCURpYWdyYW1JbmZvIGluZm8gPSBudWxsOwotLy8JCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1nciA9IGdldExheW91dE1ncigpOwotLy8JCWlmIChtZ3IgIT0gbnVsbCkgewotLy8JCQlpbmZvID0gbWdyLmdldENhY2hlZERpYWdyYW1JbmZvKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwotLy8JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0vLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIioqKiBkaWFncmFtIGdlbmVyYXRlZDogIiArIGluZm8ucGF0aCArICIsICBmaWxlIG5hbWU6ICIgKyBpbWdGaWxlKTsKLS8vCi0vLwkJCQlyZXR1cm4gaW5mbzsKLS8vCQkJfQotLy8JCX0KLS8vCQlpbmZvID0gZ2VuZXJhdGVEaWFncmFtXyhzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsKLS8vCQlpZiAoIGluZm8gIT0gbnVsbCApIHsKLS8vCQkJaW5mby5wYXRoID0gc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoOwotLy8JCX0KLS8vCQkKLS8vCQlpZiAobWdyICE9IG51bGwpIHsKLS8vCQkJbWdyLmFkZENhY2hlZERpYWdyYW1JbmZvKGluZm8sIHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwotLy8JCX0KLS8vCQlyZXR1cm4gaW5mbzsKLS8vCX0KLQkKLQlwcml2YXRlIERpYWdyYW1JbmZvIGdlbmVyYXRlRGlhZ3JhbShTdXBwcmVzc2lvbiBzdXAsIFN0cmluZyBkaWFncmFtVHlwZSwgU3RyaW5nIGltZ0ZpbGUpCi0JewotCQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCWlmIChkZWJ1ZyApewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTVEFSVDogZ2VuZXJhdGluZyBkaWFncmFtICIgKyBpbWdGaWxlKTsvLyROT04tTkxTLTEkCi0JCQl0aW1lciA9IG5ldyBUaW1lcigpOwkJCQotCQl9Ci0JCS8vIGdlbmVyYXRlIGRpYWdyYW0KLQkJLy8gc2hvdyB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMKLQkJSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoKTsKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbSA9IG51bGw7Ci0JCWlmIChkaWFncmFtU2VydmljZSAhPSBudWxsKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGxheW91dE1hbmFnZXIuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkuZ2V0RmlsdGVyKCk7Ci0JCQkKLQkJCS8vIGdldCB0aGUgd3JhcHBlciBmcm9tIHRoZSBXQlMgYWRhcHRlciBmYWN0b3J5Ci0JCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGxheW91dE1hbmFnZXIuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCi0JCQkvLyBTZXQgdGhlIHB1Ymxpc2hpbmcgbW9kZQotCQkJYm9vbGVhbiBwdWJsaXNoaW5nbW9kZSA9IExpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERTsKLQkJCUxpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERSA9IHRydWU7Ci0KLQkJCWRpYWdyYW0gPSBkaWFncmFtU2VydmljZS5zYXZlRGlhZ3JhbSh3cmFwcGVyLAotCQkJCQlpbWdGaWxlLAotCQkJCQlkaWFncmFtVHlwZSwgZmlsdGVyLCBzdXApOwotCQkJCi0JCQkvLyBzZXQgYmFjayB0byAKLQkJCUxpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERSA9IHB1Ymxpc2hpbmdtb2RlOwotCQl9Ci0KLQkJaWYgKCB0aW1lciAhPSBudWxsICl7Ci0JCQl0aW1lci5zdG9wKCk7CQotCQkJU3RyaW5nIG1zZyA9IHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGdlbmVyYXRpbmcgIiArIGRpYWdyYW1UeXBlICsgIiBkaWFncmFtIiAgOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRU5EOiBnZW5lcmF0aW5nIGRpYWdyYW0gIiArIGltZ0ZpbGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIGRpYWdyYW07Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIGdldFJlYWxpemVkVUREKFN1cHByZXNzaW9uIHN1cCwgU3RyaW5nIGRpYWdyYW1UeXBlKQotCXsKLQkJLy8gZ2VuZXJhdGUgZGlhZ3JhbQotCQkvLyBzaG93IHRoZSBhY3Rpdml0eSBkaWFncmFtcwotCQlJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpOwotCQlpZiAoZGlhZ3JhbVNlcnZpY2UgIT0gbnVsbCkgewotCQkJSUZpbHRlciBmaWx0ZXIgPSBsYXlvdXRNYW5hZ2VyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpLmdldEZpbHRlcigpOwotCQkJCi0JCQkvLyBnZXQgdGhlIHdyYXBwZXIgZnJvbSB0aGUgV0JTIGFkYXB0ZXIgZmFjdG9yeQotCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBsYXlvdXRNYW5hZ2VyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpKTsKLQotCQkJT2JqZWN0IHJlYWxpemVkID0gZGlhZ3JhbVNlcnZpY2UuZ2V0UmVhbGl6ZWRGb3JVbm1vZGlmaWVkKHdyYXBwZXIsIGZpbHRlciwgc3VwKTsKLQkJCQotCQkJaWYocmVhbGl6ZWQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyB1ZGRJbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oCi0JCQkJCQkoQWN0aXZpdHkpcmVhbGl6ZWQpOwotCQkJCWlmKHVkZEluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSl7Ci0JCQkJCXJldHVybiB1ZGRJbmZvOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFRCUyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIGNvbHVtbnMKLQkJc2V0Q29sdW1ucyhicywgUHJlZmVyZW5jZVV0aWwuZ2V0VEJTQ29sdW1ucygpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRUQlNBZGFwdGVyRmFjdG9yeSgpOwotCQlDb21wb3NpdGVSb2xlcyBjcnMgPSBudWxsOyAvL25ldyBDb21wb3NpdGVSb2xlcyhhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBzdXBlci5lbGVtZW50KTsKLQkJCi0JCS8vIHJvb2x1cCB0aGUgbGF5b3V0Ci0JCUlCU0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCXN1cGVyLmVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCi0JCS8vIGNvbGxlY3QgYWxsIFJvbGVEZXNjcmlwdG9ycyBiZWZvcmUgcm9sbHVwCi0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJaXRlbURldGFpbC5pdGVyYXRlKGFkYXB0ZXJGYWN0b3J5LCB3cmFwcGVyKTsKLQotCQlwcm92aWRlci5zZXRSb2xsZWRVcCh0cnVlKTsJCQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQkJc2V0dGluZy5yb2xsdXBSb2xlcyA9IHRydWU7Ci0JCXNldHRpbmcuZXNjYXBlU3RyaW5nID0gdHJ1ZTsKLQotCQlpdGVyYXRlKGVsZW1lbnRJdGVtLCBicywgc2V0dGluZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFdQQlMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBTdXBwcmVzc2lvbiBzdXApCi0JewotCQlYbWxFbGVtZW50IGJzID0gZWxlbWVudFhtbAotCQkubmV3Q2hpbGQoImJyZWFrZG93biIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIGNvbHVtbnMKLQkJc2V0Q29sdW1ucyhicywgUHJlZmVyZW5jZVV0aWwuZ2V0V1BCU0NvbHVtbnMoKSk7Ci0KLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCQkKLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoc3VwZXIuZWxlbWVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlwcm92aWRlci5zZXRSb2xsZWRVcCh0cnVlKTsKLQkJCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZyhhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCQlzZXR0aW5nLmVzY2FwZVN0cmluZyA9IHRydWU7Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGUoZWxlbWVudEl0ZW0sIGJzLCBzZXR0aW5nKTsKLQotCX0KLQotCS8qKgotCSAqIGl0ZXJhdGUgdGhlIGJyZWFrIGRvd24gc3RydWN0dXJlIGFuZCBidWlsZCB0aGUgeG1sIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudEl0ZW0KLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gaXRlcmF0ZS4gSXQgY2FuIGJlIGEgYnJlYWtkb3duIGVsZW1lbnQsIG9yIGl0J3MKLQkgKiAgICAgICAgICAgIGFkYXB0b3IKLQkgKiBAcGFyYW0gcGFyZW50WG1sCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGUoUHJvY2Vzc0VsZW1lbnRJdGVtIHBhcmVudEl0ZW0sIFhtbEVsZW1lbnQgcGFyZW50WG1sLAotCQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcpIHsKLQkJaXRlcmF0ZShwYXJlbnRJdGVtLCBwYXJlbnRYbWwsIHNldHRpbmcsIDApOwotCX0KLQkKLQkvLyBsZXZlbCB0byBleHBhbmQgYWxsIEJXUyBhY3Rpdml0aWVzIHRvLCAwIGZvciB0aGUgZmlyc3QgbGV2ZWwKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfU0hPV19MRVZFTCA9IDE7Ci0JCi0JLyoqCi0JICogaXRlcmF0ZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgYW5kIGJ1aWxkIHRoZSB4bWwgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50SXRlbQotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBpdGVyYXRlLiBJdCBjYW4gYmUgYSBicmVha2Rvd24gZWxlbWVudCwgb3IgaXQncwotCSAqICAgICAgICAgICAgYWRhcHRvcgotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZywgaW50IGFjdExldmVsKSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCU9iamVjdCBwYXJlbnRPYmogPSBwYXJlbnRJdGVtLnJhd0l0ZW07Ci0JCQkKLQkJVGltZXIgdGltZXIgPSBudWxsOwotCQlpZiAoZGVidWcgKXsKLQkJCXRpbWVyID0gbmV3IFRpbWVyKCk7CQkJCi0JCX0KLQkJCi0JCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBzZXR0aW5nLmFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnRPYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0vLwkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShwYXJlbnRPYmosCi0vLwkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgcHJvdmlkZXIpOwotLy8JCQlwYXJlbnRYbWwuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIGRpc3BsYXlOYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvL0xpc3QgdW5pcXVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRPYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQotCQkJCWlmICggc2V0dGluZy5zaG93VGFza09ubHkgJiYgKGFjdExldmVsID4gQUNUSVZJVFlfU0hPV19MRVZFTCkKLQkJCQkJCSYmICEoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGl0ZW0gaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICggaXRlbSA9PSBudWxsICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gYWRkIHRoZSBlbGVtZW50IHRvIHRoZSByZWZlcmVuY2UgbGlzdCwgCi0JCQkJLy8gdGhpcyBpcyBmb3IgcHVibGlzaGluZyBvbmx5LCBmb3IgYnJvd3NpbmcsIHRoaXMgY2FsbCBkb2VzIG5vdGhpbmcKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudChzdXBlci5lbGVtZW50LCBpdGVtKTsKLQkJCQkKLQkJCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHJhd2l0ZW0sIGl0ZW0sIHBhcmVudEl0ZW0pOwotCi0JCQkJLy8gUHJvY2VzcyBQdWJsaXNoaW5nOiBSZXBsYWNlIHJvbGUgZGVzY3JpcHRvcgotCQkJCS8vIHdpdGggY29tcG9zaXRlIHJvbGUKLQkJCQkvLyBpZiBpdCBjb250YWlucyB0aGUgcm9sZSBkZXNjcmlwdG9yIGR1cmluZyBwcmV2aWV3L3B1Ymxpc2hpbmcKLQkJCQkvLyBzbyBpZiB0aGlzIGd1eSBpcyBhIFJvbGVEZXNjcnB0b3IsIGZpbmQgdGhlIGNvbXBvc2l0ZSByb2xlCi0JCQkJLy8gZGVzY3JpcHRvciB3aXRoaW4gdGhlIHNjb3BlCi0JCQkJLy8gCi0JCQkJaWYgKChwYXJlbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBzZXR0aW5nLmNycyAhPSBudWxsKQotCQkJCQkJJiYgKGl0ZW0gaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJQ29tcG9zaXRlUm9sZSBjciA9IHNldHRpbmcuY3JzLmdldENvbXBvc2l0ZVJvbGUoCi0JCQkJCQkJKEFjdGl2aXR5KSBwYXJlbnRPYmosIChSb2xlRGVzY3JpcHRvcikgaXRlbSk7Ci0JCQkJCWlmIChjciAhPSBudWxsKSB7Ci0JCQkJCQlpdGVtID0gY3I7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlYbWxFbGVtZW50IGNoaWxkID0gZ2VuZXJhdGVDaGlsZFhtbChlbGVtZW50SXRlbSwgcGFyZW50WG1sLCBzZXR0aW5nKTsKLQkJCQkJCi0JCQkJcGFyZW50WG1sLmFkZENoaWxkKGNoaWxkKTsKLQkJCQkJCQkJCQotCQkJCS8vIHNob3cgb25seSB0YXNrIHRhc2sgZGVzY3JpcHRvcnMgZm9yIHN1YiBhY3Rpdml0aWVzIGluIHRoZSB0YnMgbGF5b3V0Ci0JCQkJaWYgKCBzZXR0aW5nLnNob3dUYXNrT25seSAmJiAoYWN0TGV2ZWwgPiBBQ1RJVklUWV9TSE9XX0xFVkVMKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSApKSB7Ci0JCQkJCS8vIGlmIGFjdCBsZXZlbCA+IDAsIG9ubHkgaXRlcmF0ZSB0aGUgc3ViLWFjdGl2aXRpZXMKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGluZXRlcmF0ZSBjaGlsZHJlbiwgbm90IGp1c3QgYWN0aXZpdHksIGFueSBjaGlsZCBpbiB0aGUKLQkJCQkvLyByYXdpdGVtIHNob3VsZCBiZSBpdGVyYXRlZCwKLQkJCQkvLyBzdWNoIGFzIHRoZSBzdWItYXJ0aWZhY3RzCi0JCQkJaXRlcmF0ZShlbGVtZW50SXRlbSwgY2hpbGQsIHNldHRpbmcsIAotCQkJCQkJKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgPyBhY3RMZXZlbCsxIDogYWN0TGV2ZWwpOwkJCQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCB0aW1lciAhPSBudWxsICkgewotCQkJdGltZXIuc3RvcCgpOwkKLQkJCWlmICh0aW1lci5nZXRUaW1lKCkgPiAxMDApIHsKLQkJCQlTdHJpbmcgbXNnID0gdGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgaXRlcmF0aW5nIGJyZWFrZG93biBpdGVtICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShwYXJlbnRJdGVtLmVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgWG1sRWxlbWVudCBnZW5lcmF0ZUNoaWxkWG1sKFByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZykKLQl7Ci0JCVRpbWVyIHRpbWVyID0gbnVsbDsKLQkJaWYgKGRlYnVnICl7Ci0JCQl0aW1lciA9IG5ldyBUaW1lcigpOwkJCQotCQl9Ci0JCQotCQlNZXRob2RFbGVtZW50IGl0ZW0gPSBlbGVtZW50SXRlbS5lbGVtZW50OwotCQkKLQkJSUVsZW1lbnRMYXlvdXQgbCA9IGdldExheW91dChlbGVtZW50SXRlbSk7Ci0JCi0JCS8vIGxhdCB0aGUgcHJlc2VudGF0aW9uIHRvIGRldGVybWluZSB3aGVuIHRvIHNob3cKLQkJLy8gc2V0IGdlbmVyYXRlIHRoZSBmbGFnIGZvciBicm93c2luZwotCQlib29sZWFuIGlzU3VwcmVzc2VkID0gc2V0dGluZy5zdXAuaXNTdXBwcmVzc2VkKGVsZW1lbnRJdGVtLnJhd0l0ZW0pOwotCQlpZiAoIGlzU3VwcmVzc2VkICkgewotCQkJaXRlbURldGFpbC5hZGRTdXBwcmVzc2VkKGVsZW1lbnRJdGVtLmVsZW1lbnQpOwotCQl9Ci0JCQotCQlYbWxFbGVtZW50IGNoaWxkID0gbC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQotCQkvLyB3ZSBzdGlsbCBnZW5lcmF0ZSB0aGUgaXRlbSBldmVuIHRob3VnaCBpdCdzIHN1cHByZXNzZWQsIAotCQkvLyBsZXQgdGhlIGxheW91dCBqYXZhc2NyaXB0IHRvIGhhbmRsZSB0aGUgc2hvdyBvciBoaWRlCi0JCS8vIHNldCB0aGUgaXNTdXByZXNzZWQgZmxhZyBmb3IgYnJvd3NpbmcgbW9kZWwgb25seSwKLQkJLy8gZm9yIHB1Ymxpc2hpbmcsIHRoZSBmbGFnIHdpbGwgYmUgZ2VlbnJhdGVkIGFuZCBzYXZlZCBpbiBhIHNlcGVyYXRlZCBqcyBmaWxlCi0JCS8vIHB1Ymxpc2hlZCBodG1sIHBhZ2VzIHdpbGwgZ2V0IHRoZSBpc1N1cHJlc3NlZCBmbGFnIHZpYSBqYXZhc2NyaXB0IG1ldGhvZC4KLQkJaWYgKCAhZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpICkKLQkJewotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJpc1N1cHJlc3NlZCIsIChpc1N1cHJlc3NlZCA/ICJ0cnVlIiA6ICJmYWxzZSIpICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJCi0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRJdGVtLnJhd0l0ZW0gaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCWFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBlbGVtZW50SXRlbS5yYXdJdGVtOwotCQl9IGVsc2UgewotCQkJYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHNldHRpbmcuYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGVsZW1lbnRJdGVtLmVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQk7Ci0JCX0KLQotCQkvLyBnZXQgdGhlIGluZGV4IGFuZCBwcmVkZWNlc3NvciBpbmRlY2VzCi0JCWlmIChlbGVtZW50SXRlbS5lbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJU3RyaW5nIGluZGV4ID0gZ2V0SW5kZXgoYWRhcHRlcik7Ci0JCQkKLQkJCVN0cmluZyBtb2RlbEluZm8gPSBudWxsOwkJCQotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCW1vZGVsSW5mbyA9IHByb3ZpZGVyLmdldEF0dHJpYnV0ZShpdGVtLCBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8pOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbEluZm8gPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywgYWRhcHRlcik7Ci0JCQl9CQkJCi0JCQkKLQkJCVN0cmluZyB0ZWFtID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMsIGFkYXB0ZXIpOwotCQkJU3RyaW5nIHByZWZpeCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwgYWRhcHRlcik7CQkJCi0JCQlTdHJpbmcgaXNFdmVudERyaXZlbiA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwgYWRhcHRlcik7Ci0JCQlTdHJpbmcgaXNPbmdvaW5nID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORywgYWRhcHRlcik7Ci0JCQlTdHJpbmcgaXNPcHRpb25hbCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc1BsYW5uZWQgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc1JlcGVhdGFibGUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldEF0dHJpYnV0ZSgKLQkJCQkJCQlpdGVtLAotCQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJCQkJCWFkYXB0ZXIpOwotCQkJCi0JCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgYWRhcHRlcik7Ci0JCQkKLQkJCVN0cmluZyBtTmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIGFkYXB0ZXIpOwotCi0JCQkvLyBmb3IgV0JTIGxheW91dCB3ZSBwdXQgdGhlIHN0cmluZyBpbnRvIGphdmFzY3JpcHQgdmFyaWFibGVzCi0JCQkvLyBzbyBuZWVkIHRvIGVzY2FwZSB0aGUgcXVvdGVzICIgYW5kICcKLQkJCWlmICggc2V0dGluZy5lc2NhcGVTdHJpbmcgKQotCQkJewotCQkJCW1vZGVsSW5mbyA9IFN0clV0aWwuZXNjYXBlKG1vZGVsSW5mbyk7Ci0JCQkJZGlzcGxheU5hbWUgPSBYTUxVdGlsLmVzY2FwZShkaXNwbGF5TmFtZSk7Ci0JCQkJbU5hbWUgPSBYTUxVdGlsLmVzY2FwZShtTmFtZSk7Ci0JCQkJCi0JCQkJLy8gYW5kIHRoZSB1cmwKLQkJCQkvLyBuZWVkIGFuIGVzY2FwZWQgdXJsIGZvciBqYXZhc2NyaXB0Ci0JCQkJU3RyaW5nIGpzRXNjYXBlZFVybCA9IFN0clV0aWwuZXNjYXBlKGwuZ2V0VXJsKCkpOwotCQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiVXJsIiwganNFc2NhcGVkVXJsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0JCQkKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiSW5kZXgiLCBpbmRleCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJNb2RlbEluZm8iLCBtb2RlbEluZm8pIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiVGVhbSIsIHRlYW0pOyAvLyROT04tTkxTLTEkCi0KLQkJCWNoaWxkLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAicHJlZml4Iikuc2V0VmFsdWUocHJlZml4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNFdmVudERyaXZlbiIpLnNldFZhbHVlKGlzRXZlbnREcml2ZW4pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzT25nb2luZyIpLnNldFZhbHVlKGlzT25nb2luZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNPcHRpb25hbCIpLnNldFZhbHVlKGlzT3B0aW9uYWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzUGxhbm5lZCIpLnNldFZhbHVlKGlzUGxhbm5lZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNSZXBlYXRhYmxlIikuc2V0VmFsdWUoaXNSZXBlYXRhYmxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQljaGlsZAotCQkJCQkubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIikuc2V0VmFsdWUoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZGlzcGxheU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIk5hbWUiLCBtTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCVN0cmluZyBlbnRyeVN0YXRlID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoaXRlbSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSk7Ci0JCQlTdHJpbmcgZXhpdFN0YXRlID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoaXRlbSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKTsKLQkJCVN0cmluZyBkZWxpdmVyYWJsZSA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGl0ZW0sIElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpOwotCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIkVudHJ5U3RhdGUiLCBlbnRyeVN0YXRlKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIkV4aXRTdGF0ZSIsIGV4aXRTdGF0ZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJEZWxpdmVyYWJsZSIsIGRlbGl2ZXJhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJU3RyaW5nIHByZWRlY2Vzc29ycyA9IGdldFByZWRlY2Vzc29ycyhhZGFwdGVyLAotCQkJCQlzZXR0aW5nLnN1cCk7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIlByZWRlY2Vzc29ycyIsIHByZWRlY2Vzc29ycyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGlmIGl0J3MgYSB0YXNrIGRlc2NyaXB0b3IsIGdldCB0aGUgc3RlcHMKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCi0JCQlYbWxFbGVtZW50IHN0ZXBzWG1sID0gY2hpbGQubmV3Q2hpbGQoIlN0ZXBzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVtOwotCQkJTGlzdCBzZWxTdGVwcyA9IHRkLmdldFNlbGVjdGVkU3RlcHMoKTsKLQkJCVRhc2sgdCA9IChUYXNrKSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh0ZC5nZXRUYXNrKCksCi0JCQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQlMaXN0IHN0ZXBzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0VGFza19TdGVwcygpLCBnZXRMYXlvdXRNZ3IoKQotCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IHN0ZXAgPSBzdGVwcy5nZXQoaSk7Ci0JCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBzZWxTdGVwcy5jb250YWlucyhzdGVwKTsKLQkJCQkJc3RlcHNYbWwKLQkJCQkJCQkubmV3Q2hpbGQoIlN0ZXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJpbmRleCIsIEludGVnZXIudG9TdHJpbmcoaSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkJInNlbGVjdGVkIiwgc2VsZWN0ZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCS8vIGJ1aWxkIHRoZSB0ZWFtIHByb2ZpbGUgdHJlZS4KLQkJLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSByZXBsYWNlbWVudCBmb3IgdGhlIHRlYW0gYnJlYWtkb3duCi0JCS8vIHN0cnVjdHVyZSBkaWFncmFtCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCVRlYW1Qcm9maWxlIHN1cGVyVGVhbSA9ICgoVGVhbVByb2ZpbGUpaXRlbSkuZ2V0U3VwZXJUZWFtKCk7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoImhhc1N1cGVyVGVhbSIsIChzdXBlclRlYW0gIT0gbnVsbCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCS8vIGlmIHJvbGUgcm9sbHVwIGlzIHNldCwgYnVpbGQgdGhlIHJvbGUgc3ViIHRyZWUKLQkJaWYgKHNldHRpbmcucm9sbHVwUm9sZXMgJiYgaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlidWlsZFJvbGVSb2xsdXAoKFJvbGVEZXNjcmlwdG9yKSBpdGVtLCBjaGlsZCwgc2V0dGluZyk7Ci0JCX0KLQkJCi0JCWlmICggdGltZXIgIT0gbnVsbCApIHsKLQkJCXRpbWVyLnN0b3AoKTsJCi0JCQlpZiAodGltZXIuZ2V0VGltZSgpID4gMTAwKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGdlbmVyYXRpbmcgeG1sIGZvciBicmVha2Rvd24gaXRlbSAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudEl0ZW0uZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZFJvbGVSb2xsdXAoUm9sZURlc2NyaXB0b3Igcm9sZUl0ZW0sIFhtbEVsZW1lbnQgcGFyZW50WG1sLAotCQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcpIHsKLQkJUm9sZSByID0gcm9sZUl0ZW0uZ2V0Um9sZSgpOwotCQlMaXN0IGRlc2NyaXB0b3JzID0gaXRlbURldGFpbC5nZXREZXNjcmlwdG9ycyhyKTsKLQkJaWYgKCBkZXNjcmlwdG9ycyA9PSBudWxsICkgewotCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJaWYgKCAhZGVzY3JpcHRvcnMuY29udGFpbnMocm9sZUl0ZW0pICkgewotCQkJZGVzY3JpcHRvcnMuYWRkKHJvbGVJdGVtKTsKLQkJfQotCQkKLQkJTGlzdCByZXNwb25zaWJsZUZvciA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtb2RpZmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcmltYXJ5VGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWRkaXRpb25hbFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwkKLQkJTGlzdCBpdGVtczsKLQkJCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQotCQkJcm9sZUl0ZW0gPSAoUm9sZURlc2NyaXB0b3IpIGl0Lm5leHQoKTsKLQkJCQotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyb2xlSXRlbSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXJlc3BvbnNpYmxlRm9yLmFkZEFsbChpdGVtcyk7Ci0JCQkJCi0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJvbGVJdGVtLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpLCBnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQltb2RpZmllcy5hZGRBbGwoaXRlbXMpOwotCQkJCi0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJvbGVJdGVtLAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzLAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlwcmltYXJ5VGFza3MuYWRkQWxsKGl0ZW1zKTsKLQkJCQotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyb2xlSXRlbSwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycywgCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZGl0aW9uYWxUYXNrcy5hZGRBbGwoaXRlbXMpOwotCQl9Ci0JCQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3BvbnNpYmxlRm9yLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJY3JlYXRlUm9sZVJvbGx1cE5vZGVzKHBhcmVudFhtbCwgcmVzcG9uc2libGVGb3IsIFRuZ1V0aWwKLQkJCQkuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSkpOwotCi0JCUNvbGxlY3Rpb25zLnNvcnQobW9kaWZpZXMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQljcmVhdGVSb2xlUm9sbHVwTm9kZXMocGFyZW50WG1sLCBtb2RpZmllcywgVG5nVXRpbAotCQkJCS5nZXRGZWF0dXJlVGV4dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpKSk7Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChwcmltYXJ5VGFza3MsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQljcmVhdGVSb2xlUm9sbHVwTm9kZXMocGFyZW50WG1sLCBwcmltYXJ5VGFza3MsIAotCQkJCUxpYnJhcnlSZXNvdXJjZXMuQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQpOyAKLQotCQlDb2xsZWN0aW9ucy5zb3J0KGFkZGl0aW9uYWxUYXNrcywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCWNyZWF0ZVJvbGVSb2xsdXBOb2RlcyhwYXJlbnRYbWwsIGFkZGl0aW9uYWxUYXNrcywgCi0JCQkJTGlicmFyeVJlc291cmNlcy5BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dCk7IAotCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVSb2xlUm9sbHVwTm9kZXMoWG1sRWxlbWVudCBwYXJlbnRYbWwsIExpc3QgaXRlbXMsCi0JCQlTdHJpbmcgaW5mbykgewotCQkKLQkJLy8gMTYwMTg4IC0gUHVibGlzaGVkIFRlYW0gQWxsb2NhdGlvbiB0YWIgc2hvd3MgcmVkdW5kYW50IGluZm9ybWF0aW9uCi0JCS8vIG9ubHkgc2hvdyBvbmUgZGVzY3JpcHRvciBpZiBtb3JlIHRoYW4gb25lIGFyZSBsaW5rZWQgdG8gdGhlIHNhbWUgdGFzayBvciB3cC4KLQkJLy8gc28ga2VlcCB0aGUgcHJvY2Vzc2VkIHRhc2sgYW5kIHdwIGluc3RlYWQgb2YgdGhlIGRlc2NyaXB0b3JzCi0JCUxpc3QgcHJvY2Vzc2VkID0gbmV3IEFycmF5TGlzdCgpOwotCQlNZXRob2RFbGVtZW50IGxpbmtlZCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJbGlua2VkID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yICkgewotCQkJCWxpbmtlZCA9ICgoVGFza0Rlc2NyaXB0b3IpZSkuZ2V0VGFzaygpOwotCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciApIHsKLQkJCQlsaW5rZWQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJfQotCQkJaWYgKCBsaW5rZWQgPT0gbnVsbCApIHsKLQkJCQlsaW5rZWQgPSBlOwotCQkJfQotCQkJCi0JCQlpZiAoIHByb2Nlc3NlZC5jb250YWlucyhsaW5rZWQpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlwcm9jZXNzZWQuYWRkKGxpbmtlZCk7Ci0JCQkKLQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChlLCB0cnVlKTsKLQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJNb2RlbEluZm8iLCBpbmZvKTsgLy8kTk9OLU5MUy0xJAotCQkJcGFyZW50WG1sLmFkZENoaWxkKGNoaWxkKTsKLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRleChJQlNJdGVtUHJvdmlkZXIgYWRhcHRlcikgewotCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGZhY3RvcnkuYWRhcHQoZSwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTs7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGFkYXB0ZXIuZ2V0SWQoKTsKLQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gSW50ZWdlci50b1N0cmluZyhpbmRleCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVkZWNlc3NvcnMoSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGZhY3RvcnkuYWRhcHQoZSwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTs7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCVByZWRlY2Vzc29yTGlzdCBsaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbGlzdC50b1VuU3VwcHJlc3NlZFN0cmluZyhzdXAsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVzIHsKLQkJLy8gYSBtYXAgb2YgYWN0aXZpdHkgdG8gQ29tcG9zaXRlUm9sZUluZm8KLQkJTWFwIGl0ZW1NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXB1YmxpYyBDb21wb3NpdGVSb2xlcyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUFjdGl2aXR5IGFjdCkgewotCQkJc2NhbihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgYWN0KTsKLQkJfQotCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZUluZm8gZ2V0Q29tcG9zaXRlUm9sZUluZm8oQWN0aXZpdHkgcGFyZW50LAotCQkJCUFjdGl2aXR5IGFjdCkgewotCQkJQ29tcG9zaXRlUm9sZUluZm8gaW5mbyA9IChDb21wb3NpdGVSb2xlSW5mbykgaXRlbU1hcC5nZXQoYWN0KTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQlpbmZvID0gbmV3IENvbXBvc2l0ZVJvbGVJbmZvKHBhcmVudCwgYWN0KTsKLQkJCQlpdGVtTWFwLnB1dChhY3QsIGluZm8pOwotCQkJfQotCi0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzY2FuKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQkJQWN0aXZpdHkgcGFyZW50LCBBY3Rpdml0eSBhY3QpIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChhY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihhY3QpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAoaXQKLQkJCQkJCQkubmV4dCgpKTsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCQlnZXRDb21wb3NpdGVSb2xlSW5mbyhwYXJlbnQsIGFjdCkuYWRkQ29tcG9zaXRlUm9sZSgKLQkJCQkJCQkJKENvbXBvc2l0ZVJvbGUpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJc2NhbihhZGFwdGVyRmFjdG9yeSwgYWN0LCAoQWN0aXZpdHkpIGl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIGZpbmQgdGhlIGNvbXBvc2l0ZSByb2xlIGZvciB0aGUgcm9sZSBkZXNjcmlwdG9yIGZyb20gdGhlIGFjdGl2aXR5IGFuZAotCQkgKiBpdCdzIHBhcmVudHMsIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZAotCQkgKiAKLQkJICogQHBhcmFtIGFjdGl2aXR5Ci0JCSAqIEBwYXJhbSBpdGVtCi0JCSAqIEByZXR1cm4gUm9sZURlc2NyaXB0b3IKLQkJICovCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZSBnZXRDb21wb3NpdGVSb2xlKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJCVJvbGVEZXNjcmlwdG9yIGl0ZW0pIHsKLQkJCS8vIGl0ZXJhdGUgdGhlIGJyZWFrZG93biBlbGVtZW50cywKLQkJCS8vIGlmIHRoZXJlIGlzIGEgY29tcG9zaXRlIHJvbGUgdGhhdCBjb250YWlucyB0aGUgcm9sZSwgcmV0dXJuIHRoZQotCQkJLy8gY29tcG9zaXRlLAotCQkJLy8gaWYgbm90LCBmaW5kIGluIHRoZSBwYXJlbnQgYWN0aXZpdHkKLQotCQkJaWYgKGFjdGl2aXR5ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQ29tcG9zaXRlUm9sZSBkZXNjID0gbnVsbDsKLQkJCUNvbXBvc2l0ZVJvbGVJbmZvIGluZm8gPSAoQ29tcG9zaXRlUm9sZUluZm8pIGl0ZW1NYXAuZ2V0KGFjdGl2aXR5KTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlkZXNjID0gaW5mby5nZXRDb21wb3NpdGVSb2xlKGl0ZW0pOwotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGdldENvbXBvc2l0ZVJvbGUoaW5mby5nZXRQYXJlbnRBY3Rpdml0eSgpLCBpdGVtKTsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUluZm8gewotCQlBY3Rpdml0eSBwYXJlbnQ7Ci0KLQkJQWN0aXZpdHkgb3duZXI7Ci0KLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29tcG9zaXRlUm9sZUluZm8oQWN0aXZpdHkgcGFyZW50LCBBY3Rpdml0eSBvd25lcikgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIGUpIHsKLQkJCWlmICghaXRlbXMuY29udGFpbnMoZSkpIHsKLQkJCQlpdGVtcy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIEFjdGl2aXR5IGdldFBhcmVudEFjdGl2aXR5KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZSBnZXRDb21wb3NpdGVSb2xlKFJvbGVEZXNjcmlwdG9yIGl0ZW0pIHsKLQkJCWlmIChpdGVtcy5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlSb2xlIHIgPSBpdGVtLmdldFJvbGUoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29tcG9zaXRlUm9sZSBjciA9IChDb21wb3NpdGVSb2xlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGNyLmdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNvbnRhaW5zKHIpKSB7Ci0JCQkJCXJldHVybiBjcjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5TGF5b3V0U2V0dGluZyB7Ci0JCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCXB1YmxpYyBDb21wb3NpdGVSb2xlcyBjcnM7Ci0KLQkJcHVibGljIFN1cHByZXNzaW9uIHN1cDsKLQotCQlib29sZWFuIHJvbGx1cFJvbGVzID0gZmFsc2U7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXNjYXBlU3RyaW5nID0gZmFsc2U7Ci0JCQotCQkvLyBzZXQgdG8gc2hvdyB0YXNrIG9ubHkgZm9yIHN1YiBhY3Rpdml0aWVzCi0JCS8vIHRoaXMgb25seSBhcHBseSB0byBDQlMgbGF5b3V0Ci0JCXB1YmxpYyBib29sZWFuIHNob3dUYXNrT25seSA9IGZhbHNlOwotCQkKLQkJcHVibGljIEFjdGl2aXR5TGF5b3V0U2V0dGluZyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUNvbXBvc2l0ZVJvbGVzIGNycywgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCQl0aGlzLmNycyA9IGNyczsKLQkJCXRoaXMuc3VwID0gc3VwOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVEJTSXRlbURldGFpbCB7Ci0JCQotCQkvLyByZWNvcmQgdGhlIHN1cHByZXNzZWQgaXRlbXMKLQkJTGlzdCBzdXBwcmVzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBtYXAgb2Ygcm9sZSB0byByb2xlIGRlc2NyaXB0b3JzCi0JCU1hcCByb2xlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlwdWJsaWMgVEJTSXRlbURldGFpbCgpIHsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRTdXBwcmVzc2VkKE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAoICFzdXBwcmVzc2VkSXRlbXMuY29udGFpbnMoaXRlbSkgKSB7Ci0JCQkJc3VwcHJlc3NlZEl0ZW1zLmFkZChpdGVtKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaXRlcmF0ZShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgcGFyZW50T2JqKSB7Ci0JCQotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCX0KLQotCQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkJCi0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwudW53cmFwKHJhd2l0ZW0pOwotCQkJCWlmICggaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICkgewotCQkJCQlhZGRSb2xlRGVzY3JpcHRvciggKFJvbGVEZXNjcmlwdG9yKWl0ZW0gKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpdGVyYXRlKGFkYXB0ZXJGYWN0b3J5LCByYXdpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlwcml2YXRlIHZvaWQgYWRkUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3IgcmRlc2MpIHsKLQkJCVJvbGUgciA9IHJkZXNjLmdldFJvbGUoKTsKLQkJCWlmIChyICE9IG51bGwgKSB7Ci0JCQkJTGlzdCBpdGVtcyA9IChMaXN0KXJvbGVEZXNjcmlwdG9yTWFwLmdldChyKTsKLQkJCQlpZiAoIGl0ZW1zID09IG51bGwgKSB7Ci0JCQkJCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlyb2xlRGVzY3JpcHRvck1hcC5wdXQociwgaXRlbXMpOwotCQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGVkIFJvbGVEZXNjcmlwdG9yICIgKyByZGVzYy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCAhaXRlbXMuY29udGFpbnMocmRlc2MpICkgewotCQkJCQlpdGVtcy5hZGQocmRlc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIExpc3QgZ2V0RGVzY3JpcHRvcnMoUm9sZSByKSB7Ci0JCQlyZXR1cm4gKExpc3Qpcm9sZURlc2NyaXB0b3JNYXAuZ2V0KHIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGxvYWQgdGhlIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgZm9yIHB1Ymxpc2hpbmcuCi0JICogYnJvd3NpbmcgZG9lcyBub3QgbmVlZCB0aGlzIHNpbmNlIGl0J3MgZ2VuZXJhdGVkIG9uIHRoZSBmbHkKLQkgKiBAcGFyYW0gcHJvY19kYXRhCi0JICovCi0JcHVibGljIHZvaWQgbG9hZExheW91dERhdGEoUHJvY2Vzc0xheW91dERhdGEgcHJvY19kYXRhLCBib29sZWFuIGxvYWRXYnMsIGJvb2xlYW4gbG9hZFRicywgYm9vbGVhbiBsb2FkV3BicykKLQl7Ci0JCVRpbWVyIHQgPSBuZXcgVGltZXIoKTsJCQotCi0JCUFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSA9IHByb2NfZGF0YS5jcmVhdGVBY3Rpdml0eUxhdW91dERhdGEodGhpcy5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQkKLQkJLy8gaXRlcmF0ZSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgY29sbGVjdCB0aGUgaW5mby4KLQkJUHJvY2VzcyBwcm9jID0gZ2V0T3duaW5nUHJvY2VzcygpOwotCQlpZiAoIHByb2MgPT0gdGhpcy5lbGVtZW50ICkgewotCQkJc3VwQ291bnQgPSAwOwotCQl9Ci0JCQotCQkvLyBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50cwotCQkvLyB1c2UgdGhlIFN1cHJlc3MgdXRpbGl0eQotCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQotCQkvLyBuZWVkIHRvIGludGVyYXRlIHRoZSAzIGxheW91dCBzdHJ1Y3R1cmUgc2ljbmUgdGhlaXIgcGF0aCBpcyBkaWZmZXJlbnQKLQkJaWYgKCBsb2FkV2JzICkgewotCQkJbG9hZFdCU0xheW91dERhdGEoYWN0X2RhdGEsIHN1cCk7Ci0JCX0KLQkJCi0JCWlmICggbG9hZFRicyApIHsKLQkJCWxvYWRUQlNMYXlvdXREYXRhKGFjdF9kYXRhLCBzdXApOwotCQl9Ci0JCQotCQlpZiAoIGxvYWRXcGJzICkgewotCQkJbG9hZFdQQlNMYXlvdXREYXRhKGFjdF9kYXRhLCBzdXApOwotCQl9Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQlTdHJpbmcgbXNnID0gdC5nZXRUaW1lKCkKLQkJCQkJKyAiIG1pbmktc2Vjb25kKHMpIGxvYWRpbmcgbGF5b3V0IGRhdGEgZm9yIHByb2Nlc3MgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHByb2MpIC8vJE5PTi1OTFMtMSQgLwotCQkJCQkrICIsIGFjdGl2aXR5OiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoc3VwZXIuZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLwkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRXQlNMYXlvdXREYXRhKEFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJLy8gcHVibGlzaCB0aGUgY29uc29saWRhdGVkIHZpZXcKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcgPSBuZXcgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjcnMsIHN1cCk7Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0KLS8vCQkvLyBpZiB0aGVyZSBpcyBubyBwcm9jZXNzLWxvY2FsIHN1cHJlc3NlZCBpdGVtLCBkb24ndCBnZW5lcmF0ZSBkaWFncmFtcwotCQkvLyBubywgdGhpcyB3aWxsIG5vdCB3b3JrLCBzaW5jZSB0aGUgdGV4dCBjb2xvciBvZmQgdGhlIGRpYWdyYW0gaXMgZ3JlZW4sIGlmIHVzZSBiYXNlLCBpdCdzIGJsYWNrLgotCQkvLyBzbyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBkaWFncmFtIG5vIG1hdHRlciB3aGF0LgotLy8JCWlmICggIWFjdF9kYXRhLmhhc0xvY2FsU3VwcHJlc3NlZCgpICkKLS8vCQl7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0JCQotCQlTdHJpbmcgZGlhZ3JhbVR5cGUsIGltZ0ZpbGU7Ci0JCQotCQkvLyBtYWtlIGEgc2hvcnQgcHJlZml4IGZvciB0aGUgZmlsZSBuYW1lCi0JCVN0cmluZyBwcmVmaXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aC5oYXNoQ29kZSgpKTsKLQkJCi0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBwcmVmaXggKyAiXyIgKyBkaWFncmFtVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93b3JrZmxvdyA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCWlmIChkaWFncmFtX3dvcmtmbG93ICE9IG51bGwKLQkJCQkmJiBkaWFncmFtX3dvcmtmbG93LmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQlhY3RfZGF0YS5zZXRBY3Rpdml0eURpYWdyYW1QYXRoKGRpYWdyYW1fd29ya2Zsb3cuZ2V0SW1hZ2VGaWxlTmFtZSgpKTsKLQkJfQotCQkKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBwcmVmaXggKyAiXyIgKyBkaWFncmFtVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV9kZXRhaWwgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQlpZiAoZGlhZ3JhbV9kZXRhaWwgIT0gbnVsbCAmJiBkaWFncmFtX2RldGFpbC5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJYWN0X2RhdGEuc2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtUGF0aChkaWFncmFtX2RldGFpbC5nZXRJbWFnZUZpbGVOYW1lKCkpOwotCQl9Ci0KLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQkJaW1nRmlsZSA9IFJlc291cmNlSGVscGVyLmdldERpYWdyYW1GaWxlUGF0aE5hbWUoZWxlbWVudCwgcHJlZml4ICsgIl8iICsgZGlhZ3JhbVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCURpYWdyYW1JbmZvIGRpYWdyYW1fd3AgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQlpZiAoZGlhZ3JhbV93cCAhPSBudWxsICYmIGRpYWdyYW1fd3AuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCWFjdF9kYXRhLnNldFdQRGVwZW5kZW5jeURpYWdyYW1QYXRoKGRpYWdyYW1fd3AuZ2V0SW1hZ2VGaWxlTmFtZSgpKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkVEJTTGF5b3V0RGF0YShBY3Rpdml0eUxheW91dERhdGEgYWN0X2RhdGEsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCi0JCS8vIHJvb2x1cCB0aGUgbGF5b3V0Ci0JCUlCU0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCXN1cGVyLmVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKHRydWUpOwotCi0JCQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoCi0JCQkJYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQkJc2V0dGluZy5yb2xsdXBSb2xlcyA9IHRydWU7Ci0KLQkJCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQlpdGVyYXRlUHJvY2Vzc0l0ZW0oZWxlbWVudEl0ZW0sIGFjdF9kYXRhLCBzZXR0aW5nLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkV1BCU0xheW91dERhdGEoQWN0aXZpdHlMYXlvdXREYXRhIGFjdF9kYXRhLCBTdXBwcmVzc2lvbiBzdXApCi0JewotCQkvLyBwdWJsaXNoIHRoZSBjb25zb2xpZGF0ZWQgdmlldwotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJc3VwZXIuZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCi0JCQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZVByb2Nlc3NJdGVtKGVsZW1lbnRJdGVtLCBhY3RfZGF0YSwgc2V0dGluZywgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgc3VwQ291bnQgPSAwOwotCQotCXByaXZhdGUgdm9pZCBpdGVyYXRlUHJvY2Vzc0l0ZW0oUHJvY2Vzc0VsZW1lbnRJdGVtIHBhcmVudEl0ZW0sIEFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSwgCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZywgYm9vbGVhbiBsb2FkV2JzLCBib29sZWFuIGxvYWRUYnMsIGJvb2xlYW4gbG9hZFdwYnMpIHsKLQkJCi0JCS8vU3RyaW5nIG1zZyA9ICIgLS0tIGl0ZXJhdGUgcHJvY2VzcyBpdGVtICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShwYXJlbnRJdGVtLmVsZW1lbnQpICsgIlsiICsgcGFyZW50SXRlbS5wYXRoICsgIl0iIDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCQkJCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQkJCi0JCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBzZXR0aW5nLmFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnRPYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7CQkJCi0JCQkJCi0vLwkJCQkvLyBsYXQgdGhlIHByZXNlbnRhdGlvbiB0byBkZXRlcm1pbmUgd2hlbiB0byBzaG93Ci0vLwkJCQkvLyBzZXQgZ2VuZXJhdGUgdGhlIGZsYWcgZm9yIGJyb3dzaW5nCi0JCQkJYm9vbGVhbiBpc1N1cHJlc3NlZCA9IHNldHRpbmcuc3VwLmlzU3VwcHJlc3NlZChyYXdpdGVtKTsKLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJCS51bndyYXAocmF3aXRlbSk7Ci0JCQkJCQkJCQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ocmF3aXRlbSwgaXRlbSwgcGFyZW50SXRlbSk7Ci0KLQkJCQlpZiAoZGVidWcgJiYgaXNTdXByZXNzZWQgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3VwcHJlc3NlZDogIiArICsrc3VwQ291bnQgKyAiIDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShpdGVtKSAKLQkJCQkJCQkrICI6ICIgKyBlbGVtZW50SXRlbS5wYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQl9Ci0KLQkJCQlJRWxlbWVudExheW91dCBsID0gZ2V0TGF5b3V0KGVsZW1lbnRJdGVtKTsKLQkJCQlpZiAoIGwgaW5zdGFuY2VvZiBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0ICkKLQkJCQl7CQkKLQkJCQkJaWYgKCBpc1N1cHJlc3NlZCApCi0JCQkJCXsKLQkJCQkJCVN0cmluZyByZWxQYXRoID0gKChBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KWwpLmdldFJlbGF0aXZlUHJvY2Vzc1BhdGgoKTsKLQkJCQkJCWFjdF9kYXRhLnNldFN1cHByZXNzZWQocmVsUGF0aCk7Ci0JCQkJCX0gCi0JCQkJCWVsc2UgCi0JCQkJCXsJCQkJCi0JCQkJCQkvLyBvbmx5IGl0ZXJhdGUgdW4tc3VwcHJlc3NlZCBpdGVtCi0JCQkJCQkvLyBpZiB0aGUgbGF5b3V0IGlzIGFuIGFjdGl2aXR5IGxheW91dCwgY29sbGVjdCB0aGUgbGF5b3V0IGRhdGEgZm9yIGl0Ci0JCQkJCQlpZiAoIGwgaW5zdGFuY2VvZiBBY3Rpdml0eUxheW91dCApCi0JCQkJCQl7Ci0JCQkJCQkJKChBY3Rpdml0eUxheW91dClsKS5sb2FkTGF5b3V0RGF0YShhY3RfZGF0YS5nZXRQcm9jZXNzTGF5b3V0RGF0YSgpLCAKLQkJCQkJCQkJIGxvYWRXYnMsIGxvYWRUYnMsIGxvYWRXcGJzKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQkvLyBpbmV0ZXJhdGUgY2hpbGRyZW4sIG5vdCBqdXN0IGFjdGl2aXR5LCBhbnkgY2hpbGQgaW4gdGhlCi0JCQkJCQkJLy8gcmF3aXRlbSBzaG91bGQgYmUgaXRlcmF0ZWQsCi0JCQkJCQkJLy8gc3VjaCBhcyB0aGUgc3ViLWFydGlmYWN0cwotCQkJCQkJCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcsIGxvYWRXYnMsIGxvYWRUYnMsIGxvYWRXcGJzKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0JCi0JCi0JLyoqCi0JICogZ2V0IGFsbCB0aGUgbGlua2VkIHRhc2tzLCByb2xlcywgYW5kIHdvcmtwcm9kdWN0cyBmb3IgdGhpcyBhY3Rpdml0eSBhbmQgYWxsIGl0J3MgYnJlYWtkb3duIGVsZW1lbnRzLCByZWN1cnNpdmVseS4KLQkgKiB0aGUgZWxlbWVudCBmb3VuZCBhcmUgbm90aWZpZWQgdmlhIElDb250ZW50VmFsaWRhdG9yLmFkZFJlZmVyZW5jZWRFbGVtZW50KCkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5kQWxsTGlua2VkRWxlbWVudHMoKSB7Ci0JCS8vIGl0ZXJhdGUgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIGNvbGxlY3QgdGhlIGluZm8uCi0JCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJCi0JCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdXByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnRzCi0JCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCVN1cHByZXNzaW9uIHN1cCA9IGdldFN1cHByZXNzaW9uKHByb2MpOwotCi0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQkKLQkJZ2V0TGF5b3V0TWdyKCkuZ2V0VmFsaWRhdG9yKCkuYWRkUmVmZXJlbmNlZEVsZW1lbnQobnVsbCwgc3VwZXIuZWxlbWVudCk7Ci0KLQkJaXRlcmF0ZUl0ZW1Gb3JMaW5rZWRFbGVtZW50cyh3cmFwcGVyLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZUl0ZW1Gb3JMaW5rZWRFbGVtZW50cyhPYmplY3QgcGFyZW50T2JqLCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCQotCQlpZiAocGFyZW50T2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsJCQkKLQkJCQotCQkJaWYgKCBzdXAuaXNTdXBwcmVzc2VkKHJhd2l0ZW0pICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IG51bGw7Ci0JCQlpZiAoIGl0ZW0gaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciApIHsKLQkJCQllID0gKChUYXNrRGVzY3JpcHRvcilpdGVtKS5nZXRUYXNrKCk7Ci0JCQl9IGVsc2UgaWYgKCBpdGVtIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgKSB7Ci0JCQkJZSA9ICgoUm9sZURlc2NyaXB0b3IpaXRlbSkuZ2V0Um9sZSgpOwotCQkJfSBlbHNlIGlmICggaXRlbSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciApIHsKLQkJCQllID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpaXRlbSkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCX0gCi0JCQkKLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudChpdGVtLCBlKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCWZvciAoVHJlZUl0ZXJhdG9yPEVPYmplY3Q+IHRpID0gZS5lQWxsQ29udGVudHMoKTsgdGkuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBvYmogPSB0aS5uZXh0KCk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudCgKLQkJCQkJCQkJCWl0ZW0sIChBcnRpZmFjdCkgb2JqKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCQkJCi0JCQlNZXRob2RFbGVtZW50IHBhcmVudCA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAocmF3aXRlbSk7Ci0JCQlnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudChwYXJlbnQsIGl0ZW0pOwotCi0JCQlpdGVyYXRlSXRlbUZvckxpbmtlZEVsZW1lbnRzKHJhd2l0ZW0sIGFkYXB0ZXJGYWN0b3J5LCBzdXApOwotCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXREYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FjdGl2aXR5TGF5b3V0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzIxZTA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBjbGFzcyB0byBob2xkIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgZm9yIGVhY2ggYWN0aXZpdHkKLSAqIHRoZSBkYXRhIHdpbGwgYmUgd3JpdGUgb3V0IHRvIGEgamF2YXNjcmlwdCBtYXAgCi0gKiBzbyB0aGF0IGFjdGl2aXR5IGxheW91dCBpbiB0aGUgcHVibGlzaGVkIHNpdGUgY2FuIGdldCB0aGUgc3RhdHVzIGR5bmFtaWNhbGx5LgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUxheW91dERhdGEgewotCi0JcHJpdmF0ZSBQcm9jZXNzTGF5b3V0RGF0YSBwcm9jX2RhdGE7Ci0JCi0JcHVibGljIFN0cmluZyBhZF9pbWdfcGF0aCA9IG51bGw7Ci0JcHVibGljIFN0cmluZyBhZGRfaW1nX3BhdGggPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgd3BkX2ltZ19wYXRoID0gbnVsbDsKLQkKLQkvLyBtYXAgb2Ygc3VwcmVzc2VkIGl0ZW0ncyByZWxhdGl2ZSBwYXRoIHRvIHRoZSBjdXJyZW50IGFjdGl2aXR5Ci0JcHJpdmF0ZSBMaXN0IHN1cHJlc3NlZEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIGNvbnN0dWN0b3IKLQkgKiBAcGFyYW0gcHJvY19kYXRhCi0JICogQHBhcmFtIGFjdGl2aXR5X3BhdGgKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlMYXlvdXREYXRhKFByb2Nlc3NMYXlvdXREYXRhIHByb2NfZGF0YSwgU3RyaW5nIGFjdGl2aXR5X3BhdGgpCi0JewotCQl0aGlzLnByb2NfZGF0YSA9IHByb2NfZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFByb2Nlc3NMYXlvdXREYXRhCi0JICogQHJldHVybiBQcm9jZXNzTGF5b3V0RGF0YQotCSAqLwotCXB1YmxpYyBQcm9jZXNzTGF5b3V0RGF0YSBnZXRQcm9jZXNzTGF5b3V0RGF0YSgpCi0JewotCQlyZXR1cm4gcHJvY19kYXRhOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgYWN0aXZpdHkgZGlhZ3JhbSBwYXRoCi0JICogQHBhcmFtIHBhdGggU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEaWFncmFtUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCWFkX2ltZ19wYXRoID0gcGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IGFjdGl2aXR5IGRldGFpbCBkaWFncmFtIHBhdGgKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURldGFpbERpYWdyYW1QYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJYWRkX2ltZ19wYXRoID0gcGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhdGggU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0V1BEZXBlbmRlbmN5RGlhZ3JhbVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQl3cGRfaW1nX3BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgdGhlIGVsZW1lbnQncyByZWxhdGl2ZSBwYXRoIGZvciB0aGUgc3VwcHJlc3MgZWxlbWVudAotCSAqIEBwYXJhbSBpdGVtUmVsUGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoU3RyaW5nIGl0ZW1SZWxQYXRoKQotCXsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN1cHByZXNzZWQ6ICIgKyBhY3Rpdml0eV9wYXRoICsgIjogIiArIGl0ZW1SZWxQYXRoKTsKLQkJCi0JCWlmICggIXN1cHJlc3NlZEl0ZW1zLmNvbnRhaW5zKGl0ZW1SZWxQYXRoKSApCi0JCXsKLQkJCXN1cHJlc3NlZEl0ZW1zLmFkZChpdGVtUmVsUGF0aCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBTdHJpbmcgZm9yIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3VwcHJlc3NlZEl0ZW1zKCkKLQl7Ci0JCXJldHVybiBzdXByZXNzZWRJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHN1cHByZXNzZWQgaXRlbSBsb2NhbCB0byB0aGlzIHByb2Nlc3MKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNMb2NhbFN1cHByZXNzZWQoKQotCXsKLQkJcmV0dXJuIChzdXByZXNzZWRJdGVtcy5zaXplKCkgPiAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FydGlmYWN0TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FydGlmYWN0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjg2OTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BcnRpZmFjdExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYW4gQXJ0aWZhY3QuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RMYXlvdXQgZXh0ZW5kcyBXb3JrUHJvZHVjdExheW91dCB7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgQXJ0aWZhY3RMYXlvdXQKLQkgKgotCSAqLwotCXB1YmxpYyBBcnRpZmFjdExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ2hlY2tsaXN0TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0NoZWNrbGlzdExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzNjNzVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ2hlY2tsaXN0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIENoZWNrbGlzdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBjaGVjayBsaXN0IGxheW91dAotCSAqCi0JICovCi0JcHVibGljIENoZWNrbGlzdExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ2hlY2tsaXN0X0NvbnRlbnRFbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3QgYWN0aXZpdGllcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkNoZWNrbGlzdF9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuQ2hlY2tsaXN0X0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0NvbmNlcHRMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ29uY2VwdExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZjNjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ29uY2VwdExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBDb25jZXB0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhIGxheW91dCBmb3IgQ29uY2VwdAotCSAqCi0JICovCi0JcHVibGljIENvbmNlcHRMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0JCQkKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0RlbGl2ZXJhYmxlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0RlbGl2ZXJhYmxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTU1NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZWxpdmVyYWJsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBEZWxpdmVyYWJsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUxheW91dCBleHRlbmRzIFdvcmtQcm9kdWN0TGF5b3V0IHsKLQotCS8qKgotCSAqIGxheW91dCBmb3IgRGVsaXZlcmFibGUKLQkgKgotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjM1ZjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIGxheW91dCBjbGFzcyBmb3IgZGVzY3JpcHRvciBjb250ZW50cwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCU1ldGhvZEVsZW1lbnQgZGVzY3JpcHRvcjsKLQlNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQ7Ci0JQWJzdHJhY3RFbGVtZW50TGF5b3V0IGxpbmtlZERlc2NyaXB0aW9uTGF5b3V0ID0gbnVsbDsKLQotCS8qKgotCSAqIGxheW91dCBmb3IgZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQoTWV0aG9kRWxlbWVudCBkZXNjcmlwdG9yKSB7Ci0JCXRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JfQotCQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQkJCi0JCXN1cGVyLnRhcmdldEVsZW1lbnQgPSBkZXNjcmlwdG9yOwotCQlzdXBlci5vd25lckVsZW1lbnQgPSBkZXNjcmlwdG9yOwotCQkKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFRhc2soKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFJvbGVEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRSb2xlKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRXb3JrUHJvZHVjdCgpOwotCQl9Ci0JCQotCQkvLyBnZXQgdGhlIHJlYWxpemVkIG9uZQotCQkvLyAxOTYwOTQgLSBUYXNrIGRlc2NyaXB0b3IgcGFnZSBzaG91bGQgc2hvdyB0aGUgcmVhbGl6ZWQgY29udGVudCBvZiB0aGUgbGlua2VkIGVsZW1lbnQKLQkJbGlua2VkRWxlbWVudCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobGlua2VkRWxlbWVudCwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJaWYgKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJbGlua2VkRGVzY3JpcHRpb25MYXlvdXQgPSBuZXcgR2VuZXJhbExheW91dCgpOwotCQkJbGlua2VkRGVzY3JpcHRpb25MYXlvdXQuaW5pdChsYXlvdXRNYW5hZ2VyLCAoKERlc2NyaWJhYmxlRWxlbWVudClsaW5rZWRFbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dC5zZXRDb250ZW50VGFyZ2V0KGRlc2NyaXB0b3IpOwotCQkJbGlua2VkRGVzY3JpcHRpb25MYXlvdXQuc2V0RWxlbWVudE93bmVyKGxpbmtlZEVsZW1lbnQpOwkJCi0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWRBdHRyaWJ1dGVzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCkgewotCi0JCU1hcCBmZWF0dXJlVmFsdWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsJCQkKLQkJCQlpZiAoIShwIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvL0VBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpcDsKLQkJCQlTdHJpbmcgbmFtZSA9IHAuZ2V0TmFtZSgpOwotCQkJCQkJCQkKLQkJCQlPYmplY3QgdmFsdWU7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKCJwcmVzZW50YXRpb25OYW1lIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCS8vIHZhbHVlID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQkJCQl2YWx1ZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShwKTsKLQkJCQl9Ci0JCQkJCi0JCQkJZmVhdHVyZVZhbHVlTWFwLnB1dChuYW1lLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVN0cmluZyByZWZpbmVkRGVzY05hbWUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBtYWluRGVzY05hbWUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLmdldE5hbWUoKTsKLQkJCi0JCS8vIG5vdywgZ2V0IHRoZSBmZWF0dXJlIHZhbHVlIGZyb20gdGhlIGxpbmsgZWxlbWVudCdzIGRlY3JpcHRpb24KLQkJZmVhdHVyZXMgPSBudWxsOwotCQlpZiAoICggbGlua2VkRGVzY3JpcHRpb25MYXlvdXQhPW51bGwgKSAmJiAobGlua2VkRGVzY3JpcHRpb25MYXlvdXQuZ2V0RWxlbWVudCgpICE9IG51bGwpICkgewotLy8JCQlwcm9wZXJ0aWVzID0gbGlua2VkRGVzY3JpcHRpb25MYXlvdXQuZ2V0RWxlbWVudCgpLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkJZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMobGlua2VkRGVzY3JpcHRpb25MYXlvdXQuZ2V0RWxlbWVudCgpKTsKLQkJfQotCQkKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwkJCQotCQkJCWlmICghKHAgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSlwOwotCQkJCVN0cmluZyBuYW1lID0gcC5nZXROYW1lKCk7Ci0JCQkJaWYgKCBuYW1lLmVxdWFscyhtYWluRGVzY05hbWUpICkgewotCQkJCQluYW1lID0gcmVmaW5lZERlc2NOYW1lOwotCQkJCX0KLQkJCQkKLQkJCQlPYmplY3QgdmFsdWUgPSBmZWF0dXJlVmFsdWVNYXAuZ2V0KG5hbWUpOwotCQkJCWlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCgpID09IDAgKSB7Ci0JCQkJCXZhbHVlID0gbGlua2VkRGVzY3JpcHRpb25MYXlvdXQuZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKHApOwotCQkJCQlmZWF0dXJlVmFsdWVNYXAucHV0KG5hbWUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG5vdyBzZXQgdGhlIHZhbHVlcwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZVZhbHVlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotCQkJT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpCS8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSkJCS8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0VmFsdWUoKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZS50b1N0cmluZygpKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rlc2NyaXB0b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhMDJmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rlc2NyaXB0b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBiYXNlIGxheW91dCBjbGFzcyBmb3IgZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmlwdG9yTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBleHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50ID0gQXJyYXlzLmFzTGlzdChuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKQkKLQl9KTsKLQotCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCA9IG51bGw7Ci0KLQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgZWxlbWVudExheW91dCA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgX19pbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCi0JCS8vIDE5NjA5NCAtIFRhc2sgZGVzY3JpcHRvciBwYWdlIHNob3VsZCBzaG93IHRoZSByZWFsaXplZCBjb250ZW50IG9mIHRoZSBsaW5rZWQgZWxlbWVudAotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0VGFzaygpOwotCQkJbGlua2VkRWxlbWVudCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobGlua2VkRWxlbWVudCwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJZWxlbWVudExheW91dCA9IG5ldyBUYXNrTGF5b3V0KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0Um9sZSgpOwotCQkJbGlua2VkRWxlbWVudCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobGlua2VkRWxlbWVudCwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJZWxlbWVudExheW91dCA9IG5ldyBSb2xlTGF5b3V0KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJbGlua2VkRWxlbWVudCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobGlua2VkRWxlbWVudCwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJZWxlbWVudExheW91dCA9IG5ldyBXb3JrUHJvZHVjdExheW91dCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMYXlvdXQgIT0gbnVsbCkgewotCQkJZWxlbWVudExheW91dC5pbml0KGxheW91dE1hbmFnZXIsIGxpbmtlZEVsZW1lbnQpOwotCQkJZWxlbWVudExheW91dC5zZXRDb250ZW50VGFyZ2V0KGVsZW1lbnQpOwotCQl9CQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBsaW5rZWQgZWxlbWVudCBpcyBsb2FkZWQKLQkJaWYgKCBsaW5rZWRFbGVtZW50ICE9IG51bGwgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXIgPSBsaW5rZWRFbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlpdGVyLm5leHQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGZvciBkZXNjcmlwdG9ycywgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCwgZ2V0IGZyb20gdGhlIGxpYmVkCi0JICogZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IHZhbHVlID0gc3VwZXIuZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQlpZiAoKGVsZW1lbnRMYXlvdXQgPT0gbnVsbCkgfHwgKHZhbHVlICE9IG51bGwpCi0JCQkJJiYgKHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJLy8gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCwgZ3JhYiB0aGUgYXR0cmlidXRlIHZhbHVlIGZyb20gdGhlCi0JCS8vIGxpbmtlZCBlbGVtZW50Ci0JCS8vIHNwZWNpZmllZCBhdHRyaWJ1dGVzIG9ubHkuIEFkZCBtb3JlIGZlYXR1cmUgaGVyZSBpZiBuZWVkZWQKLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpIHsKLQkJCXJldHVybiBlbGVtZW50TGF5b3V0LmdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShmZWF0dXJlKTsKLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxheW91dCBmb3IgYSBjaGlsZCBlbGVtZW50IG9mIHRoaXMgZWxlbWVudAotCSAqIEFjdGl2aXR5RWxlbWVudExheW91dCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGxheW91dCB3aXRoIG5vZGUgcGF0aAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gSUVsZW1lbnRMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgSUVsZW1lbnRMYXlvdXQgZ2V0Q2hpbGRMYXlvdXQoTWV0aG9kRWxlbWVudCBjaGlsZCkKLQl7Ci0JCWlmICggbGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSAKLQkJCQkmJiAoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yRGVzY3JpcHRpb24pICkgewotCQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0IGwgPSBuZXcgRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0KHRoaXMuZWxlbWVudCk7Ci0JCQlsLmluaXQobGF5b3V0TWFuYWdlciwgY2hpbGQpOwotCQkJcmV0dXJuIGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoY2hpbGQsIHRydWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0RXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlTdXBwcmVzc2lvbiBzdXAgPSBzdXBlci5nZXRTdXBwcmVzc2lvbihzdXBlci5vd25pbmdQcm9jZXNzKTsKLQkJaWYgKCBzdXAgIT0gbnVsbCApIHsKLQkJCS8vIGNoZWNrIHN1cHByZXNzaW9uCi0JCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCApIHsKLQkJCQlMaXN0IGl0ZW1zID0gKExpc3QpdmFsdWU7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlICggaSA8IGl0ZW1zLnNpemUoKSApIHsKLQkJCQkJT2JqZWN0IHYgPSBpdGVtcy5nZXQoaSk7Ci0JCQkJCWlmICggaXNTdXBwcmVzc2VkKHN1cCwgZmVhdHVyZSwgdikgKSB7Ci0JCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCBpdGVtcy5zaXplKCkgPT0gMCApIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCBpc1N1cHByZXNzZWQoc3VwLCBmZWF0dXJlLCB2YWx1ZSkgKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHByZXNzZWQoU3VwcHJlc3Npb24gc3VwLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvciApIHsKLQkJCXJldHVybiBzdXAuaXNTdXBwcmVzc2VkKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFza09wcG9zaXRlRmVhdHVyZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMpCi0JCXx8ICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9Bc3Npc3RzSW5fVGFza0Rlc2NyaXB0b3JzKQotCQl8fCAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpCi0JCXx8ICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpCi0JCXx8ICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGlzY2lwbGluZUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EaXNjaXBsaW5lTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMmVlZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EaXNjaXBsaW5lTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIERpc2NpcGxpbmVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FbGVtZW50TGF5b3V0RXh0ZW5kZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRWxlbWVudExheW91dEV4dGVuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MWVlYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FbGVtZW50TGF5b3V0RXh0ZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLQotLyoqCi0gKiBUaGUgbGF5b3V0IGV4dGVuZGVyIGZvciBhbGwgTWV0aG9kIEVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaWNuZSAxLjUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVsZW1lbnRMYXlvdXRFeHRlbmRlciB7Ci0KLQlwcml2YXRlIEFic3RyYWN0RWxlbWVudExheW91dCBsYXlvdXQ7Ci0JcHVibGljIEVsZW1lbnRMYXlvdXRFeHRlbmRlcihBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGF5b3V0KSB7Ci0JCXRoaXMubGF5b3V0ID0gbGF5b3V0OwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0VGFnUXVhbGlmaWVkV3BMaXN0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBMaXN0PFdvcmtQcm9kdWN0PiBpdGVtcyk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IGdldExheW91dCgpIHsKLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzllZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0xheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewkJCQkJCQotCQkJTGlzdCB0YXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19UYXNrcywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19UYXNrcywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIHRhc2tzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlMaXN0IHdvcmtQcm9kdWN0cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19Xb3JrUHJvZHVjdHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfV29ya1Byb2R1Y3RzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgd29ya1Byb2R1Y3RzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRXhhbXBsZUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FeGFtcGxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMGViNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FeGFtcGxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGFuIEV4YW1wbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIEV4YW1wbGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkV4YW1wbGVfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0JCQkKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSBzdXBlci5lbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQXV0aG9yaW5nOiAgVGVtcGxhdGUgYXR0YWNobWVudHMgb2YgYSBjb250cmlidXRpbmcgdGVtcGxhdGUgZ3VpZGFuY2UgZWxlbWVudCBhcmUgbm90IGFwcGVuZGVkIHRvIHRoZSBiYXNlIGxpc3Qgb2YgYXR0YWNobWVudHMJCQkJCi0JCQkJLy9TdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKWNvbnRlbnQpLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0JCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb250ZW50LCBzdXBlci5lbGVtZW50LCBmZWF0dXJlLCBzdXBlci5sYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKCAoYXR0YWNobWVudFN0cmluZyAhPSBudWxsKSAmJiAoYXR0YWNobWVudFN0cmluZy5pbmRleE9mKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUikgPiAwKSApCi0JCQkJewotCQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5yZXBsYWNlQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiwgVG5nVXRpbC5HVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7IAotCQkJCX0KLQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudEZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGF0dGFjaG1lbnRGaWxlICE9IG51bGwpIHsKLQkJCQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwubWF0Y2hlcihhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQlpZiAoIW0uZmluZCgpKSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsICJmaWxlOi8vIiArIGF0dGFjaG1lbnRGaWxlKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBtLmdyb3VwKDIpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsIG0uZ3JvdXAoMSkpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvR2VuZXJhbExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HZW5lcmFsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjczZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HZW5lcmFsTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYWxMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIEdlbmVyYWxMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HdWlkZWxpbmVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvR3VpZGVsaW5lTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDdkMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HdWlkZWxpbmVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgR3VpZGVsaW5lLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkZWxpbmVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIEd1aWRlbGluZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuR3VpZGVsaW5lX0NvbnRlbnRFbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3QgYWN0aXZpdGllcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkd1aWRlbGluZV9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuR3VpZGVsaW5lX0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL091dGNvbWVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvT3V0Y29tZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ5OWEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvT3V0Y29tZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBPdXRjb21lLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVMYXlvdXQgZXh0ZW5kcyBXb3JrUHJvZHVjdExheW91dCB7Ci0KLQlwdWJsaWMgT3V0Y29tZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJhY3RpY2VMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJhY3RpY2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViYzBmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1ByYWN0aWNlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5QcmFjdGljZUl0ZW1Qcm92aWRlci5Hcm91cGluZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUHJhY3RpY2UKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUHJhY3RpY2VMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzsKLQkJCUxpc3Q8TWV0aG9kRWxlbWVudD4gY2hpbGRyZW4gPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3Q8V29ya1Byb2R1Y3Q+IHdwU2xvdElucHV0cyA9IGdldElucHV0V3BTbG90cyhjaGlsZHJlbik7Ci0JCQkKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM7Ci0JCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGNoaWxkcmVuMSA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLAotCQkJCQlmZWF0dXJlMSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMiA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM7Ci0JCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGNoaWxkcmVuMiA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLAotCQkJCQlmZWF0dXJlMiwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCWNoaWxkcmVuLmFkZEFsbChjaGlsZHJlbjEpOwotCQkJY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuMik7Ci0JCQkKLQkJCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlciA9IG5ldyBHcm91cGluZ0hlbHBlcih0aGlzKSB7CQkJCi0JCQkJcHJvdGVjdGVkIHZvaWQgZ3JvdXBpbmcoT2JqZWN0IHBhcmVudE9iamVjdCwgTGlzdCByZXQsCi0JCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuLCBHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlcikgewkJCQkJCi0JCQkJCWlmIChnZXRHcm91cGVyKCkgaW5zdGFuY2VvZiBQcmFjdGljZUxheW91dCkgewotCQkJCQkJKChQcmFjdGljZUxheW91dCkgZ2V0R3JvdXBlcigpKS5ncm91cGluZyhwYXJlbnRPYmplY3QsIHJldCwKLQkJCQkJCQkJY2hpbGRyZW4sIGdyb3VwaW5nSGVscGVyKTsKLQkJCQkJfQotCQkJCX0JCi0JCQl9OwotCQkJCi0JCQlncm91cGluZyh0aGlzLCByZXQsIGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQkJCQotCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLAotCQkJCQllbGVtZW50WG1sLCAiUHJhY3RpY2UgZ3VpZGFuY2UgdHJlZSIsIHJldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKHdwU2xvdElucHV0cyAhPSBudWxsKSB7Ci0JCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLAotCQkJCQllbGVtZW50WG1sLCAiSW5wdXQgd29yayBwcm9kdWN0IHNsb3RzIiwgd3BTbG90SW5wdXRzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8V29ya1Byb2R1Y3Q+IGdldElucHV0V3BTbG90cyhMaXN0PE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCVNldDxXb3JrUHJvZHVjdD4gc2xvdHMgPSBuZXcgSGFzaFNldDxXb3JrUHJvZHVjdD4oKTsKLQkJZm9yIChNZXRob2RFbGVtZW50IGVsZW06IGVsZW1lbnRzKSB7Ci0JCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgZWxlbTsKLQkJCQlmb3IgKFdvcmtQcm9kdWN0IHdwOiB0YXNrLmdldE1hbmRhdG9yeUlucHV0KCkpIHsKLQkJCQkJaWYgKHdwLmdldElzQWJzdHJhY3QoKSkgewotCQkJCQkJc2xvdHMuYWRkKHdwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKFdvcmtQcm9kdWN0IHdwOiB0YXNrLmdldE9wdGlvbmFsSW5wdXQoKSkgewotCQkJCQlpZiAod3AuZ2V0SXNBYnN0cmFjdCgpKSB7Ci0JCQkJCQlzbG90cy5hZGQod3ApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzbG90cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTGlzdDxXb3JrUHJvZHVjdD4gd3BTbG90SW5wdXRzID0gbmV3IEFycmF5TGlzdDxXb3JrUHJvZHVjdD4oKTsKLQkJd3BTbG90SW5wdXRzLmFkZEFsbChzbG90cyk7Ci0JCQotCQlpZiAod3BTbG90SW5wdXRzLnNpemUoKSA+IDEpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48V29ya1Byb2R1Y3Q+c29ydCh3cFNsb3RJbnB1dHMsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gd3BTbG90SW5wdXRzOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJLy9yZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIExpc3QgcmV0LCBDb2xsZWN0aW9uIGNoaWxkcmVuLCAKLQkJCVByYWN0aWNlSXRlbVByb3ZpZGVyLkdyb3VwaW5nSGVscGVyIGdyb3VwaW5nSGVscGVyKSB7Ci0JCU1hcDxTdHJpbmcsIExpc3Q+IG1hcCA9IFByYWN0aWNlSXRlbVByb3ZpZGVyLmdldFN1Ykdyb3VwTWFwKGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQotCQlib29sZWFuIHRvU29ydCA9IHRydWU7Ci0JCWlmIChwYXJlbnRPYmplY3QgaW5zdGFuY2VvZiBQcmFjdGljZUxheW91dCkgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKChQcmFjdGljZUxheW91dCkgcGFyZW50T2JqZWN0KS5lbGVtZW50OwotCQkJaWYgKGVsZW0gIT0gbnVsbCkgewotCQkJCXRvU29ydCA9ICEgQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGVsZW0pOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIGtleXMgPSBncm91cGluZ0hlbHBlci5nZXRLZXlzSW5PcmRlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBrZXkgPSBrZXlzW2ldOwotCQkJTGlzdCBzdWJncm91cENoaWxkcmVuID0gbWFwLmdldChrZXkpOwotCQkJaWYgKHN1Ymdyb3VwQ2hpbGRyZW4gPT0gbnVsbCB8fCBzdWJncm91cENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGdyb3VwaW5nSGVscGVyLnRvR3JvdXAoa2V5LCBzdWJncm91cENoaWxkcmVuKSkgewotCQkJCXN1Ymdyb3VwQ2hpbGRyZW4gPSBncm91cGluZ0hlbHBlci5uZXN0ZWRHcm91cGluZyhwYXJlbnRPYmplY3QsIGtleSwgc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQkJU3ViR3JvdXBWYWx1ZSBzdWJHcm91cFZhbHVlID0gbmV3IFN1Ykdyb3VwVmFsdWUoa2V5LCBzdWJncm91cENoaWxkcmVuKTsKLQkJCQlyZXQuYWRkKHN1Ykdyb3VwVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9Tb3J0KSB7Ci0JCQkJCVByYWN0aWNlSXRlbVByb3ZpZGVyLnNvcnQoc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQkJfQotCQkJCXJldC5hZGRBbGwoc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc05vbk1ldGhvZEVsZW1lbnRJblByb2Nlc3NDaGlsZCgKLQkJCU9iamVjdCBub25NZXRob2RFbGVtZW50Q2hpbGQsIE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IHBhcmVudCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCWlmIChub25NZXRob2RFbGVtZW50Q2hpbGQgaW5zdGFuY2VvZiBTdWJHcm91cFZhbHVlKSB7Ci0JCQlTdWJHcm91cFZhbHVlIHN1Ykdyb3VwVmFsdWUgPSAoU3ViR3JvdXBWYWx1ZSkgbm9uTWV0aG9kRWxlbWVudENoaWxkOwotCQkJU3RyaW5nIGtleSA9IHN1Ykdyb3VwVmFsdWUua2V5OwotCQkJTGlzdCBsaXN0VmFsdWUgPSBzdWJHcm91cFZhbHVlLmxpc3RWYWx1ZTsKLQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwKLQkJCQlwYXJlbnQsIGtleSwgbGlzdFZhbHVlKTsgCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLS8qCQlpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ki8JCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFN1Ykdyb3VwVmFsdWUgewotCQlwdWJsaWMgU3RyaW5nIGtleTsKLQkJcHVibGljIExpc3QgbGlzdFZhbHVlOwotCQkKLQkJcHVibGljIFN1Ykdyb3VwVmFsdWUoU3RyaW5nIGtleSwgTGlzdCBsaXN0VmFsdWUpIHsKLQkJCXRoaXMua2V5ID0ga2V5OwotCQkJdGhpcy5saXN0VmFsdWUgPSBsaXN0VmFsdWU7Ci0JCX0KLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0VsZW1lbnRJdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NFbGVtZW50SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI5OTM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0VsZW1lbnRJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogc2ltcGxlIGhvbGRlciBvZiBwcm9jZXNzIGVsZW1lbnQgaXRlbSBpbmZvCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudEl0ZW0gewotCQotCXB1YmxpYyBPYmplY3QgcmF3SXRlbSA9IG51bGw7Ci0JcHVibGljIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JcHVibGljIFN0cmluZyBwYXRoID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHByb2NfZ3VpZCA9IG51bGw7Ci0JCi0JcHVibGljIFByb2Nlc3NFbGVtZW50SXRlbShPYmplY3QgcmF3SXRlbSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcGF0aCkKLQl7Ci0JCXRoaXMucmF3SXRlbSA9IHJhd0l0ZW07Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCXRoaXMucHJvY19ndWlkID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRPd25pbmdQcm9jZXNzR3VpZEZyb21QYXRoKHBhdGgpOwotCX0KLQkKLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRJdGVtKE9iamVjdCByYXdJdGVtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsIFByb2Nlc3NFbGVtZW50SXRlbSBwYXJlbnQpCi0JewotCQl0aGlzLnJhd0l0ZW0gPSByYXdJdGVtOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnBhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0Lm1ha2VQYXRoKHBhcmVudC5wYXRoLCB0aGlzLmVsZW1lbnQpOyAvLyBtYWtlIHBhdGggaGVyZQotCQl0aGlzLnByb2NfZ3VpZCA9IHBhcmVudC5wcm9jX2d1aWQ7CQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkKLQl7Ci0JCXJldHVybiBFbGVtZW50TGF5b3V0TWFuYWdlci5nZXRRdWVyeVN0cmluZyhwcm9jX2d1aWQsIHBhdGgpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1ZDgwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJvbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFByb2Nlc3NMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudCgpOwotCi0JCWlmICghaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCXJldHVybiBlbGVtZW50WG1sOwotCQl9Ci0KLQkJLy8gYnVpbGQgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdHJlZQotCQlYbWxFbGVtZW50IGJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaXRlcmF0ZShzdXBlci5lbGVtZW50LCBicywgYWRhcHRlckZhY3RvcnkpOwotCi0JCWJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWl0ZXJhdGUoc3VwZXIuZWxlbWVudCwgYnMsIGFkYXB0ZXJGYWN0b3J5KTsKLQotCQlicyA9IGVsZW1lbnRYbWwKLQkJCQkubmV3Q2hpbGQoImJyZWFrZG93biIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWl0ZXJhdGUoc3VwZXIuZWxlbWVudCwgYnMsIGFkYXB0ZXJGYWN0b3J5KTsKLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIHhtbCBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRPYmoKLQkgKiBAcGFyYW0gcGFyZW50WG1sCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGUoT2JqZWN0IHBhcmVudE9iaiwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAoaXQKLQkJCQkJCS5uZXh0KCkpOwotCQkJCS8vIHN1cGVyLnByb2Nlc3NDaGlsZChwYXJlbnRYbWwsIGl0ZW0sIGZhbHNlKTsKLQkJCQlJRWxlbWVudExheW91dCBsID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoaXRlbSwgdHJ1ZSk7Ci0JCQkJaWYgKGwgIT0gbnVsbCkgewotCQkJCQlYbWxFbGVtZW50IGNoaWxkID0gbC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQkJCQkJcGFyZW50WG1sLmFkZENoaWxkKGNoaWxkKTsKLQotCQkJCQkvLyBpbmV0ZXJhdGUgY2hpbGRyZW4KLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaXRlcmF0ZShpdGVtLCBjaGlsZCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ODM1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogCi0gKiBjbGFzcyB0byBob2xkIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgZm9yIGVhY2ggYWN0aXZpdHkKLSAqIHRoZSBkYXRhIHdpbGwgYmUgd3JpdGUgb3V0IHRvIGEgamF2YXNjcmlwdCBtYXAgCi0gKiBzbyB0aGF0IGFjdGl2aXR5IGxheW91dCBpbiB0aGUgcHVibGlzaGVkIHNpdGUgY2FuIGdldCB0aGUgc3RhdHVzIGR5bmFtaWNhbGx5LgotICoKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzTGF5b3V0RGF0YSB7Ci0KLQlNYXAgYWN0aXZpdHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIHByb2NfZ3VpZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzTGF5b3V0RGF0YShTdHJpbmcgcHJvY19ndWlkKQotCXsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgaXQgY29udGFpbnMgdGhlIGFjdGl2aXR5IGxheW91dCBvZiB0aGUgc3BlY2lmaWVkIHBhdGgKLQkgKiBAcGFyYW0gYWN0aXZpdHlfcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBY3Rpdml0eUxheW91dChTdHJpbmcgYWN0aXZpdHlfcGF0aCkKLQl7Ci0JCXJldHVybiBhY3Rpdml0eU1hcC5jb250YWluc0tleShhY3Rpdml0eV9wYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogY3JlYXRlIGFuIEFjdGl2aXR5TGF5b3V0RGF0YSBmb3IgdGhlIGFjdGl2aXR5IHBhdGgKLQkgKiBAcGFyYW0gYWN0aXZpdHlfcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIEFjdGl2aXR5TGF5b3V0RGF0YQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUxheW91dERhdGEgY3JlYXRlQWN0aXZpdHlMYXVvdXREYXRhKFN0cmluZyBhY3Rpdml0eV9wYXRoKQotCXsKLQkJQWN0aXZpdHlMYXlvdXREYXRhIGRhdGEgPSAoQWN0aXZpdHlMYXlvdXREYXRhKWFjdGl2aXR5TWFwLmdldChhY3Rpdml0eV9wYXRoKTsKLQkJaWYgKCBkYXRhID09IG51bGwgKQotCQl7Ci0JCQlkYXRhID0gbmV3IEFjdGl2aXR5TGF5b3V0RGF0YSh0aGlzLCBhY3Rpdml0eV9wYXRoKTsKLQkJCWFjdGl2aXR5TWFwLnB1dChhY3Rpdml0eV9wYXRoLCBkYXRhKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhIG1hcCBvZiB0aGUgYWN0aXZpdHkgbGF5b3V0IGRhdGEKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0QWN0aXZpdHlMYXlvdXREYXRhTWFwKCkKLQl7Ci0JCXJldHVybiBhY3Rpdml0eU1hcDsKLQl9Ci0JCi0JLyoqCi0JICogcHJpbnQgdGhlIGluZm8gdG8gYSBqYXZhc2NyaXB0IGZpbGUgaW4gdGhlIHB1Ymxpc2hlZCBzaXRlLiAKLQkgKiBUaGVzZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgcHJvY2VzcyBlbGVtZW50cy4KLQkgKiBAcGFyYW0gcHMgUHJpbnRXcml0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludChQcmludFdyaXRlciBwcykKLQl7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gYWN0aXZpdHlNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgYWN0aXZpdHlfcGF0aCA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0JCQlBY3Rpdml0eUxheW91dERhdGEgZGF0YSA9IChBY3Rpdml0eUxheW91dERhdGEpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmICggZGF0YS5hZF9pbWdfcGF0aCAhPSBudWxsICkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQkJCQlwcmludEltZ0ZpbGUocHMsIGtleSwgZGF0YS5hZF9pbWdfcGF0aCk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggZGF0YS5hZGRfaW1nX3BhdGggIT0gbnVsbCApCi0JCQl7Ci0JCQkJU3RyaW5nIGtleSA9IGFjdGl2aXR5X3BhdGggKyBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQkJCXByaW50SW1nRmlsZShwcywga2V5LCBkYXRhLmFkZF9pbWdfcGF0aCk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggZGF0YS53cGRfaW1nX3BhdGggIT0gbnVsbCApCi0JCQl7Ci0JCQkJU3RyaW5nIGtleSA9IGFjdGl2aXR5X3BhdGggKyBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQkJCQlwcmludEltZ0ZpbGUocHMsIGtleSwgZGF0YS53cGRfaW1nX3BhdGgpOwotCQkJfQotCi0JCQlpZiAoIGRhdGEuZ2V0U3VwcHJlc3NlZEl0ZW1zKCkuc2l6ZSgpID4gMCApCi0JCQl7Ci0JCQkJZm9yICggSXRlcmF0b3IgaXQyID0gZGF0YS5nZXRTdXBwcmVzc2VkSXRlbXMoKS5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOyApCi0JCQkJewotCQkJCQlTdHJpbmcgcmVsUGF0aCA9IChTdHJpbmcpaXQyLm5leHQoKTsKLQkJCQkJU3RyaW5nIGtleSA9IGFjdGl2aXR5X3BhdGggKyByZWxQYXRoOwotCQkJCQlwcmludFN1cHByZXNzZWRJdGVtKHBzLCBrZXkpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJpbnRJbWdGaWxlKFByaW50V3JpdGVyIHBzLCBTdHJpbmcga2V5LCBTdHJpbmcgZmlsZU5hbWUpCi0JewotCQlTdHJpbmcgbGluZSA9ICJjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5pbWFnZUZpbGVzW1wiIiArIGtleSArICJcIl09XCIiICsgZmlsZU5hbWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlwcy5wcmludGxuKGxpbmUpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBwcmludFN1cHByZXNzZWRJdGVtKFByaW50V3JpdGVyIHBzLCBTdHJpbmcga2V5KQotCXsKLQkJU3RyaW5nIGxpbmUgPSAiY29udGVudFBhZ2UucHJvY2Vzc1BhZ2Uuc3VwcHJlc3NlZEl0ZW1zW1wiIiArIGtleSArICJcIl09dHJ1ZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcy5wcmludGxuKGxpbmUpOwkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlhY3Rpdml0eU1hcC5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmVwb3J0TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JlcG9ydExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk5ZTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmVwb3J0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJlcG9ydC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBSZXBvcnRMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJlcG9ydF9Xb3JrUHJvZHVjdHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5SZXBvcnRfV29ya1Byb2R1Y3RzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmV1c2FibGVBc3NldExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXVzYWJsZUFzc2V0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDdkZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXVzYWJsZUFzc2V0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUmV1c2FibGUgQXNzZXQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJldXNhYmxlQXNzZXRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFJldXNhYmxlQXNzZXRMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJldXNhYmxlQXNzZXRfQ29udGVudEVsZW1lbnRzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUmV1c2FibGVBc3NldF9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuUmV1c2FibGVBc3NldF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSBzdXBlci5lbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQXV0aG9yaW5nOiAgVGVtcGxhdGUgYXR0YWNobWVudHMgb2YgYSBjb250cmlidXRpbmcgdGVtcGxhdGUgZ3VpZGFuY2UgZWxlbWVudCBhcmUgbm90IGFwcGVuZGVkIHRvIHRoZSBiYXNlIGxpc3Qgb2YgYXR0YWNobWVudHMJCQkJCi0JCQkJLy9TdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKWNvbnRlbnQpLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0JCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb250ZW50LCBzdXBlci5lbGVtZW50LCBmZWF0dXJlLCBzdXBlci5sYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKCAoYXR0YWNobWVudFN0cmluZyAhPSBudWxsKSAmJiAoYXR0YWNobWVudFN0cmluZy5pbmRleE9mKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUikgPiAwKSApCi0JCQkJewotCQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5yZXBsYWNlQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiwgVG5nVXRpbC5HVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7IAotCQkJCX0KLQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudEZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGF0dGFjaG1lbnRGaWxlICE9IG51bGwpIHsKLQkJCQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwubWF0Y2hlcihhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQlpZiAoIW0uZmluZCgpKSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsICJmaWxlOi8vIiArIGF0dGFjaG1lbnRGaWxlKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBtLmdyb3VwKDIpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsIG0uZ3JvdXAoMSkpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvYWRtYXBMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9hZG1hcExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2EyZTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9hZG1hcExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBSb2FkbWFwLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2FkbWFwTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBSb2FkbWFwTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2FkbWFwX0FjdGl2aXRlcywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJvYWRtYXBfQWN0aXZpdGVzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZURlc2NyaXB0b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZURlc2NyaXB0b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmOTI4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvbGVEZXNjcmlwdG9yTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGxheW91dCBmb3IgYSBSb2xlRGVzY3JpcHRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckxheW91dCBleHRlbmRzIERlc2NyaXB0b3JMYXlvdXQgewotCQotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQkvLyB1c2UgdGhlIGRlZmF1bHQKLQkJLy8gaWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgZGlhZ3JhbSwgeW91IG1heSBuZWVkIHRvIGtlZXAgdGhlIGZlYXR1cmUKLQkJLy8gdmFsdWVzLgotCQkvLyBqdXN0IGRvIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBSb2xlTGF5b3V0Ci0JCS8vIE5PVEU6IGZvciByb2xlLXRhc2tzIHJlbGF0aW9uc2hpcCwgdGhlIGZlYXR1cmUgaXMKLQkJLy8gUm9sZURlc2NyaXB0b3IjZ2V0UGVyZm9ybXNBc093bmVyCi0JCS8vIGl0J3MgYSBiaWRpcmVjdGlvbmFsIGZlYXR1cmUsIGRvbid0IG5lZWQgb3Bwb3NpdGUgZmVhdHVyZQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0KLQkJc3VwZXIubG9hZFJlZmVyZW5jZXMoZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJaWYgKCAoc3VwZXIuZWxlbWVudExheW91dCAhPSBudWxsICkgJiYgbGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSApIHsKLQkJCS8vIGFsc28gbG9hZCB0aGUgbGlua2VkIGVsZW1lbnQgcmVmZXJlbmNlZCBpbmZvcm1hdGlvbgotCQkJZm9yIChJdGVyYXRvcjxFU3RydWN0dXJhbEZlYXR1cmU+IGl0ZXIgPSBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQlzdXBlci5lbGVtZW50TGF5b3V0LmxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSApIHsKLQkJCUxpc3QgdiA9IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMoKTsKLQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmVhdHVyZS5nZXROYW1lKCksIHYpOwotCQl9IGVsc2UgewotCQkJZ2V0RmVhdHVyZVZhbHVlKGZlYXR1cmUsICBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3REZXNjcmlwdG9ycygpIHsKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9yczsKLQkJTGlzdCB2MiA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWlmICggdjIuc2l6ZSgpID4gMCApIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdjIuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJCi0JCQkJU3RyaW5nIHBhdGggPSBzdXBlci5tYWtlUGF0aChnZXRTdXBlckFjdGl2aXR5UGF0aCgpLCBlKTsKLQkJCQlUYXNrRGVzY3JpcHRvckxheW91dCB0bCA9IChUYXNrRGVzY3JpcHRvckxheW91dClsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChlLCBvd25pbmdQcm9jZXNzLCBwYXRoKTsKLQkJCQkvL1JvbGVEZXNjcmlwdG9yIHIgPSAoUm9sZURlc2NyaXB0b3IpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIG51bGwsIGZhbHNlKTsKLQkJCQlMaXN0IHJMaXN0ID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIG51bGwsIGZhbHNlKTsKLQkJCQkvL2lmICggciA9PSB0aGlzLmVsZW1lbnQgKSB7Ci0JCQkJaWYgKCByTGlzdC5jb250YWlucyh0aGlzLmVsZW1lbnQpICkgewotCQkJCQlMaXN0IHZhbHVlID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIG51bGwsIGZhbHNlKTsKLQkJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnNpemUoKSA+IDAgKSB7Ci0JCQkJCQlmb3IgKCBJdGVyYXRvciBpdHIgPSB2YWx1ZS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApIHsKLQkJCQkJCQlPYmplY3QgbyA9IGl0ci5uZXh0KCk7Ci0JCQkJCQkJaWYgKCAhdi5jb250YWlucyhvKSApIHsKLQkJCQkJCQkJdi5hZGQobyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdjsKLQl9Ci0JCQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlpZiAoICFzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoICFpc1Rhc2tPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSkgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGl0ZW1zLnNpemUoKSApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW1zLmdldChpKTsKLQkJCVN0cmluZyBwYXRoID0gc3VwZXIubWFrZVBhdGgoZ2V0U3VwZXJBY3Rpdml0eVBhdGgoKSwgZSk7Ci0JCQlUYXNrRGVzY3JpcHRvckxheW91dCB0bCA9IChUYXNrRGVzY3JpcHRvckxheW91dClsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChlLCBvd25pbmdQcm9jZXNzLCBwYXRoKTsKLQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCWlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSB0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSB0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgbnVsbCwgZmFsc2UpOwkJCQkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9Bc3Npc3RzSW5fVGFza0Rlc2NyaXB0b3JzICkgewotCQkJIG8gPSB0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCBudWxsLCBmYWxzZSk7CQkJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICggKG8gPT0gdGhpcy5lbGVtZW50KSB8fCAobyBpbnN0YW5jZW9mIExpc3QpICYmICgoTGlzdClvKS5jb250YWlucyh0aGlzLmVsZW1lbnQpICkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlbXMucmVtb3ZlKGkpOwotCQkJfQotCQl9Ci0KLQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvbGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1YWJhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvbGVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5NZXRob2RFbGVtZW50RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5Sb2xlRGlhZ3JhbVB1Ymxpc2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUm9sZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXByb3RlY3RlZCBNYXAgcmVmZXJlbmNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBSb2xlTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgcGVyZm9ybXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXJlZmVyZW5jZU1hcC5wdXQoInBlcmZvcm1zIiwgcGVyZm9ybXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIE5PLCB0aGlzIGlzIHdyb25nISBzaG91bGQgY2FsY3VsYXRlIHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlIQotCQkJLy8gbW92ZWQgdG8gYWNjZXB0RmVhdHVyZVZhbHVlIHRvIGdldCB0aGUgcmVhbGl6ZWQgdmFsdWUgYW5kIHNhdmUgdG8KLQkJCS8vIHRoZSBtYXAKLQkJCS8vIGlmIChzdXBlci5lbGVtZW50IGluc3RhbmNlb2YgUm9sZUltcGwpCi0JCQkvLyB7Ci0JCQkvLyByZWZlcmVuY2VNYXAucHV0KCJyZXNwb25zaWJsZUZvciIsCi0JCQkvLyAoKFJvbGVJbXBsKXN1cGVyLmVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCQkJLy8gfQotCi0JCQlMaXN0IGFkZGl0aW9uYWxseVBlcmZvcm1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlJvbGVfU2Vjb25kYXJ5X1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCS8vIHJlZmVyZW5jZU1hcC5wdXQoImFkZGl0aW9uYWxseVBlcmZvcm1zIiwgYWRkaXRpb25hbGx5UGVyZm9ybXMpOwotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1NlY29uZGFyeV9UYXNrcywgZWxlbWVudFhtbCwKLQkJCQkJImFkZGl0aW9uYWxseVBlcmZvcm1zIiwgYWRkaXRpb25hbGx5UGVyZm9ybXMpOyAvLyROT04tTkxTLTEkCi0JCQlSb2xlRGlhZ3JhbVB1Ymxpc2hlciBkaWFncmFtUHVibGlzaGVyID0gbmV3IFJvbGVEaWFncmFtUHVibGlzaGVyKCk7Ci0JCQlNZXRob2RFbGVtZW50RGlhZ3JhbSBkaWFncmFtID0gZGlhZ3JhbVB1Ymxpc2hlci5wdWJsaXNoKHRoaXMsCi0JCQkJCW5ldyBGaWxlKGxheW91dE1hbmFnZXIuZ2V0UHVibGlzaERpcigpKSk7Ci0KLQkJCWlmIChkaWFncmFtICE9IG51bGwpCi0JCQkJZWxlbWVudFhtbC5zZXRDb250ZW50KCJkaWFncmFtIiwgZGlhZ3JhbS5nZXRIVE1MKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgcm9sZVNldHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0cywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHMsIGVsZW1lbnRYbWwsCi0JCQkJCSJyb2xlU2V0cyIsIHJvbGVTZXRzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBhZGQgdGhlIGRlc2NyaXB0b3JzIHJlZmVyZW5jaW5nIHRoaXMgZWxlbWVudAotCQkJc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3JzKGVsZW1lbnRYbWwpOwotCQkJCi0JCX0KLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRQZXJmb3JtcygpIHsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlZmVyZW5jZU1hcC5nZXQoInBlcmZvcm1zIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybXMoKSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSByZWZlcmVuY2VNYXAuZ2V0KCJhZGRpdGlvbmFsbHlQZXJmb3JtcyIpOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBsaXN0OwkJCi0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCUxpc3QgbGlzdCA9ICAoTGlzdCkgcmVmZXJlbmNlTWFwLmdldCgicmVzcG9uc2libGVGb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gbGlzdDsJCQotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVzKCkgewotCQlMaXN0IGxpc3QgPSAgKExpc3QpIHJlZmVyZW5jZU1hcC5nZXQoIm1vZGlmaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGxpc3Q7CQkKLQl9Ci0KLQkvKioKLQkgKiBzb21lIGxheW91dCBuZWVkIHRvIGhhdmUgdGhlIGZlYXR1cmUgdmFsdWVzIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFNvCi0JICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGZlYXR1cmUgaXMgY2FsY3VsYXRlZCBpbiB0aGlzIGFic3RyYWN0Ci0JICogY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUZlYXR1cmVWYWx1ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJlZmVyZW5jZU1hcC5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHNvbWUgbGF5b3V0IG5lZWQgdG8gaGF2ZSB0aGUgZmVhdHVyZSB2YWx1ZXMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gU28KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgZmVhdHVyZSBpcyBjYWxjdWxhdGVkIGluIHRoaXMgYWJzdHJhY3QKLQkgKiBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0KLQkJLy8gc2F2ZSB0aGUgZmVhdHVyZSB2YWx1ZSBmb3IgZGlhZ3JhbSBnZW5lcmF0aW9uCi0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkgewotCQkJcmVmZXJlbmNlTWFwLnB1dCgicmVzcG9uc2libGVGb3IiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzR3JhbmRDaGlsZChPYmplY3QgZmVhdHVyZSwKLQkJCU1ldGhvZEVsZW1lbnQgY2hpbGRFbGVtZW10LCBJRWxlbWVudExheW91dCBjaGlsZExheW91dCwKLQkJCVhtbEVsZW1lbnQgY2hpbGRYbWxFbGVtZW50KSB7Ci0JCWlmICghKGNoaWxkTGF5b3V0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RMYXlvdXQpCi0JCQkJfHwgY2hpbGRYbWxFbGVtZW50ID09IG51bGwKLQkJCQl8fCAhKGNoaWxkRWxlbWVtdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghICgoV29ya1Byb2R1Y3QpY2hpbGRFbGVtZW10KS5nZXRJc0Fic3RyYWN0KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJV29ya1Byb2R1Y3RMYXlvdXQgd3BDaGlsZExheW91dCA9IChXb3JrUHJvZHVjdExheW91dCkgY2hpbGRMYXlvdXQ7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IHdwQ2hpbGRMYXlvdXQubGF5b3V0TWFuYWdlcgotCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKTsKLQotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgfHwKLQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9Nb2RpZmllcygpKSB7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb0Z1bGZpbGxpbmdGZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHM7Ci0JCQlMaXN0IGl0ZW1zID0gd3BDaGlsZExheW91dC5jYWxjMG5GZWF0dXJlVmFsdWUoY2hpbGRFbGVtZW10LCBvRnVsZmlsbGluZ0ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCWl0ZW1zID0gZ2V0VGFnUXVhbGlmaWVkV3BMaXN0KHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSwgaXRlbXMpOwotCQkJd3BDaGlsZExheW91dC5hZGRSZWZlcmVuY2VzKG9GdWxmaWxsaW5nRmVhdHVyZSwgY2hpbGRYbWxFbGVtZW50LCBvRnVsZmlsbGluZ0ZlYXR1cmUKLQkJCQkJLmdldE5hbWUoKSwgaXRlbXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N0ZXBMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3RlcExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRjMThiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3RlcExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBTdGVwTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VtbWFyeVBhZ2VMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VtbWFyeVBhZ2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhZWUyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1bW1hcnlQYWdlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0Lkh0bWxCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhlIGxheW91dCBmb3IgYSBzdW1tYXJ5IHBhZ2Ugb2YgYW4gZWxlbWVudC4KLSAqIDxwPgotICogVGhlIHN1bW1hcnlwYWdlIGxheW91dCBhIGxpc3Qgb2YgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGUgb3duZXIgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdW1tYXJ5UGFnZUxheW91dCBpbXBsZW1lbnRzIElFbGVtZW50TGF5b3V0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVFlQRSA9ICJTdW1tYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9YU0wgPSAic3VtbWFyeS54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyOwotCi0JTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JTGlzdCByZWZMaXN0OwotCi0JU3RyaW5nIHRpdGxlOwotCQotCVN0cmluZyBwcmVmaXg7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0KLQlwcml2YXRlIEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyOwotCQotCS8vIFN0cmluZyBmaWxlTmFtZTsKLQlJRWxlbWVudExheW91dCBlbGVtZW50TGF5b3V0OwotCi0vLwlwdWJsaWMgU3VtbWFyeVBhZ2VMYXlvdXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLS8vCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGl0bGUsIExpc3QgcmVmTGlzdCkgewotLy8JCXRoaXMubGF5b3V0TWFuYWdlciA9IGxheW91dE1hbmFnZXI7Ci0vLwkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLS8vCQl0aGlzLnJlZkxpc3QgPSByZWZMaXN0OwotLy8JCXRoaXMudGl0bGUgPSB0aXRsZTsKLS8vCi0vLwkJdGhpcy5lbGVtZW50TGF5b3V0ID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoZWxlbWVudCwgdHJ1ZSk7Ci0vLwl9Ci0JcHVibGljIFN1bW1hcnlQYWdlTGF5b3V0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB0aXRsZSwgTGlzdCByZWZMaXN0KSB7Ci0JCXRoaXMobGF5b3V0TWFuYWdlciwgZWxlbWVudCwgcHJlZml4LCB0aXRsZSwgcmVmTGlzdCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBTdW1tYXJ5UGFnZUxheW91dChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdGl0bGUsIAotCQkJTGlzdCByZWZMaXN0LCBTdHJpbmcgdHlwZU5hbWUpIAotCXsKLQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotCQl0aGlzLmxheW91dE1hbmFnZXIgPSBsYXlvdXRNYW5hZ2VyOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnJlZkxpc3QgPSByZWZMaXN0OwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMucHJlZml4ID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgcHJlZml4LmluZGV4T2YoIm51bGwiKSA8IDApID8gcHJlZml4IDogIlN1bW1hcnkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl0aGlzLmVsZW1lbnRMYXlvdXQgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRHdWlkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gTEFZT1VUX1RZUEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gZWxlbWVudExheW91dC5nZXRGaWxlUGF0aCgpCi0JCQkJKyBnZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYc2xVcmwoKSB7Ci0JCXJldHVybiBMQVlPVVRfWFNMOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja1BhdGgoKSB7Ci0JCXJldHVybiBlbGVtZW50TGF5b3V0LmdldEJhY2tQYXRoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKElFbGVtZW50TGF5b3V0IHJlbGF0aXZlVG8pIHsKLQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZVBhdGgocmVsYXRpdmVUbyk7Ci0JfQotCi0vLwlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpIHsKLS8vCQlyZXR1cm4gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZSh0aXRsZSArICJfIikgKyBlbGVtZW50TGF5b3V0LmdldEZpbGVOYW1lKGV4dCk7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZXh0KSB7Ci0JCXJldHVybiBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHByZWZpeCArICJfIikgKyBlbGVtZW50TGF5b3V0LmdldEZpbGVOYW1lKGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKSB7Ci0JCXJldHVybiBsYXlvdXRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IG5ldyBYbWxFbGVtZW50KCJFbGVtZW50IikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIlR5cGUiLCBnZXRUeXBlKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJOYW1lIiwgZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiVXJsIiwgZ2V0VXJsKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJCYWNrUGF0aCIsIGdldEJhY2tQYXRoKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJJbWFnZVVybCIsIGdldFNoYXBlaWNvblVybCgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJUeXBlTmFtZSIsIHR5cGVOYW1lKTsvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCQotCQkJU3RyaW5nIGNvcHlyaWdodCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dChlbGVtZW50LAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlpZiAoY29weXJpZ2h0ICE9IG51bGwgJiYgY29weXJpZ2h0Lmxlbmd0aCgpID4gMCkgewotCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImNvcHlyaWdodCIpLnNldFZhbHVlKGNvcHlyaWdodCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJWG1sRWxlbWVudCByZWZYbWwgPSBlbGVtZW50WG1sCi0JCQkJCS5uZXdDaGlsZCgicmVmZXJlbmNlTGlzdCIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQkJCW1lID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChtZSwKLQkJCQkJCQlsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmIChtZSAhPSBudWxsKSB7Ci0JCQkJCQlJRWxlbWVudExheW91dCBsID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQobWUsIHRydWUpOwotCQkJCQkJaWYgKGwgIT0gbnVsbCkgewotCQkJCQkJCS8vIGRvbid0IGluY2x1ZGUgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlZmVyZWNlZAotCQkJCQkJCS8vIGVsZW1lbnRzLCBvdGhlcndpc2UsIG1heSBjYXVzZSBkZWFkbG9jawotCQkJCQkJCXJlZlhtbC5hZGRDaGlsZChsLmdldFhtbEVsZW1lbnQoZmFsc2UpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQkJUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKSBlOwotCQkJCQlJRWxlbWVudExheW91dCBsID0gbmV3IFN1bW1hcnlQYWdlTGF5b3V0KGdldExheW91dE1ncigpLAotCQkJCQkJCXByb3ZpZGVyLmdldFByYWN0aWNlKCksIHByb3ZpZGVyLmdldFRleHQobnVsbCksCi0JCQkJCQkJcHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgKExpc3QpIHByb3ZpZGVyCi0JCQkJCQkJCQkuZ2V0Q2hpbGRyZW4obnVsbCksIHByb3ZpZGVyLmdldFRleHQobnVsbCkpOwotCQkJCQlyZWZYbWwuYWRkQ2hpbGQobC5nZXRYbWxFbGVtZW50KGZhbHNlKSk7Ci0JCQkJCQotCQkJCQkvL1RoaXMgaXMgYSBzaG9ydCBjdXQgYXBwcm9hY2guCi0JCQkJCS8vVG8gZG86IGdlbmVyYWxpemUgbGF5b3V0TWFuYWdlciB0byBoYW5kbGUgbm9uIG1ldGhvZCBlbGVtZW50IGxheW91dHMKLQkJCQkJaWYgKCF0aGlzLmxheW91dE1hbmFnZXIuaXNQdWJsaXNoaW5nTW9kZSgpICYmIGh0bWxCdWlsZGVyICE9IG51bGwpIHsKLQkJCQkJCWh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbChsKTsJCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldExheW91dHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24gZm9yIHRoZSBnaXZlbiBsYXlvdXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShMYXlvdXRJbmZvIGluZm8sIFN0cmluZyBleHQpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGVsZW1lbnQsIG51bGwsIGluZm8ubmFtZSwgZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VGFyZ2V0KE1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRPd25lcihNZXRob2RFbGVtZW50IG93bmVyKSB7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGh0bWwgY29udGVudCBnZW5lcmF0ZWQgZnJvbSB0aGlzIHhzbCBmaWxlIG5lZWRzIHRvIGJlIHNjYW5uZWQgb3Igbm90Ci0JICogc2NhbiB0aGUgY29udGVudCBpcyBmb3IgaWRlbnRpZnlpbmcgZWxlbWVudCByZWZlcmVuY2VzIGluIHRoZSBjb250ZW50IGFuZCBjb3B5IG92ZXIgcmVzb3VyY2UgZmlsZXMKLQkgKiBpbiBzb21lIGNhc2VzIHdlIGRvbid0IG5lZWQgdG8gc2NhbiB0aGUgY29udGVudCwgZm9yIGV4YW1wbGUsIHRoZSBhY3Rpdml0eSBicmVha2Rvd24gc3RydWN0dXJlCi0JICogCi0JICogQHBhcmFtIHhzbFVybCB0aGUgeHNsIHRoYXQgaHRtbCBpcyBnZW5lcmF0ZWQgZnJvbSwgbnVsbCBmb3IgdGhlIGRlZmF1bHQgeHNsIGxheW91dAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRDb250ZW50U2NhbihTdHJpbmcgeHNsVXJsKQotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaG93RWxlbWVudExpbmsoYm9vbGVhbiBzaG93KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHRtbEJ1aWxkZXIoSHRtbEJ1aWxkZXIgaHRtbEJ1aWxkZXIpIHsKLQkJdGhpcy5odG1sQnVpbGRlciA9IGh0bWxCdWlsZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzA5ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgU3VwcG9ydGluZyBNYXRlcmlhbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlN1cHBvcnRpbmdNYXRlcmlhbF9Db250ZW50RWxlbWVudHMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5TdXBwb3J0aW5nTWF0ZXJpYWxfQnJlYWtkb3duRWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCi0JCQljb250ZW50RWxlbWVudHMuYWRkQWxsKGFjdGl2aXRpZXMpOwotCi0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlN1cHBvcnRpbmdNYXRlcmlhbF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrRGVzY3JpcHRvckxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzVmNmYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0Rlc2NyaXB0b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhlIGxheW91dCBmb3IgYSBUYXNrRGVzY3JpcHRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckxheW91dCBleHRlbmRzIERlc2NyaXB0b3JMYXlvdXQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGV4dHJhRmVhdHVyZXNGcm9tVGFzayA9IEFycmF5cy5hc0xpc3QobmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKQotCX0pOwotCQotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCXJldHVybiBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWJzdHJhY3RFbGVtZW50TGF5b3V0I2xvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpKSB7Ci0JCQkJCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdGVwIGNvbnRlbnRzIGJ5IGZpeGluZyB0aGUgbGlua3MKLQkJCQkJcHJvY2Vzc1N0ZXBzKGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkpIHsKLQkJCQkJc3VwZXIubG9hZFdvcmtPcmRlcihlbGVtZW50WG1sKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCQlsb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQotCQlpZiAoKHN1cGVyLmVsZW1lbnRMYXlvdXQgIT0gbnVsbCApICYmIGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgKSB7Ci0JCQkvLyBhbHNvIGxvYWQgdGhlIGxpbmtlZCBlbGVtZW50IHJlZmVyZW5jZWQgaW5mb3JtYXRpb24KLQkJCWZvciAoSXRlcmF0b3I8RVN0cnVjdHVyYWxGZWF0dXJlPiBpdGVyYXRvciA9IGdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0ZXBzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQkKLQkJLy8gMTk2MDk0IC0gVGFzayBkZXNjcmlwdG9yIHBhZ2Ugc2hvdWxkIHNob3cgdGhlIHJlYWxpemVkIGNvbnRlbnQgb2YgdGhlIGxpbmtlZCBlbGVtZW50Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKTsKLQkJU3RyaW5nIGZlYXR1cmVfbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCi0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBwZXIgUGV0ZXIsIHRoaXMgaXMgbm90IHRoZSByaWdodCBiZWhhdmlvcgotCQkvLyBkZXNjcmlwdG9ycyBzaG91bGQgYWx3YXlzIHNob3cgdGhlIHNlbGVjdGVkIHN0ZXBzIG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50Ci0JCS8vIGl0IHNob3VsZCBub3Qgc2hvdyB0aGUgcmVhbGl6ZWQgc3RlcHMKLQkJLy8gc28gcm9sbGJhY2sgdG8gdGhlIG9sZCBiZWhhdmlvcgotCQkvLyBKaW5odWEgWGkgMDgvMjgvMDcKLQkJLyoKLQkJaWYgKCBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSB7Ci0JCQlpZiAobGlua2VkRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJaXRlbXMgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKTsKLQkJCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGxpbmtlZEVsZW1lbnQsIGYsCi0JCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQl9Ci0KLQkJfSBlbHNlIAotCQkqLwotCQl7Ci0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJfQotCQkKLQkJWG1sRWxlbWVudCBzdGVwWG1sID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgicmVmZXJlbmNlTGlzdCIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZlYXR1cmVfbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQkJZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobWUsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQlJRWxlbWVudExheW91dCBsID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQobWUsIHRydWUpOwotCQkJCQkJaWYgKGwgIT0gbnVsbCkgewotCQkJCQkJCWwuc2V0Q29udGVudFRhcmdldChlbGVtZW50KTsKLQkJCQkJCQlzdGVwWG1sLmFkZENoaWxkKGwKLQkJCQkJCQkJCS5nZXRYbWxFbGVtZW50KENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkJCQkJLmlzRGVzY3JpcHRpb25FbGVtZW50KG1lKSA/IHRydWUKLQkJCQkJCQkJCQkJOiBpbmNsdWRlUmVmZXJlbmNlcykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkgewotCQlBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPihleHRyYUZlYXR1cmVzRnJvbVRhc2spOwotCQlmZWF0dXJlcy5hZGRBbGwoc3VwZXIuZ2V0RXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudCgpKTsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU3VwcHJlc3NlZChTdXBwcmVzc2lvbiBzdXAsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZWxlbWVudCkgewotCQkKLQkJLy8gbWFrZSBzdXJlIGFsbCBjYXNlcyBhcmUgY292ZXJlZAotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICkgewotCQkJU3RyaW5nIHBhdGggPSBzdXBlci5tYWtlUGF0aChzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgsIChNZXRob2RFbGVtZW50KWVsZW1lbnQpOwotCQkJU3RyaW5nW10gcGF0aHMgPSBzdXBlci5nZXRQYXRoQXJyYXkocGF0aCk7Ci0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCQl3cmFwcGVyID0gZWxlbWVudDsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHN1cC5pc1N1cHByZXNzZWQod3JhcHBlciwgZmVhdHVyZSk7Ci0JCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXNTdXBwcmVzc2VkKHN1cCwgZmVhdHVyZSwgZWxlbWVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDNmY2Y5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBUYXNrLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFRhc2tMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJVGFzayB0YXNrID0gKFRhc2spIHN1cGVyLmVsZW1lbnQ7Ci0JCQlMaXN0IHBlcmZvcm1pbmdSb2xlcyA9IHRhc2suZ2V0UGVyZm9ybWVkQnkoKTsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0b3IgPSBwZXJmb3JtaW5nUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZSBwZXJmb3JtaW5nUm9sZSA9IChSb2xlKSBpdG9yLm5leHQoKTsKLQkJCQlpZiAocGVyZm9ybWluZ1JvbGUgIT0gbnVsbCkgewotCQkJCQlNZXRob2RFbGVtZW50IHJvbGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBwZXJmb3JtaW5nUm9sZSwgbGF5b3V0TWFuYWdlcgotCQkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyByb2xlTmFtZSA9ICgoUm9sZSkgcm9sZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQkJaWYgKHJvbGVOYW1lID09IG51bGwgfHwgcm9sZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXJvbGVOYW1lID0gcm9sZS5nZXROYW1lKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgicGVyZm9ybWluZ1JvbGVOYW1lIiwgcm9sZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlhZGRSZWZlcmVuY2UoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCBlbGVtZW50WG1sLCAicGVyZm9ybWluZ1JvbGUiLCByb2xlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0KLQkJCS8vIGNhbGN1bGF0ZSB0aGUgY2F0ZWdvcmllcyBvcHBvc2l0ZSBmZWF0dXJlCi0JCQkvLyBtdWx0aXBsaWNpdHkgY2hhbmdlIGZvciBvcHBvc2l0ZSBmZWF0dXJlcwotCQkJTGlzdCBkaXNjaXBsaW5lcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQlzdXBlci5lbGVtZW50LCBBc3NvY2lhdGlvbkhlbHBlci5UYXNrX0Rpc2NpcGxpbmVzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuVGFza19EaXNjaXBsaW5lcywgZWxlbWVudFhtbCwgImRpc2NpcGxpbmVzIiwgZGlzY2lwbGluZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3QgdXNlcmNhdGVnb3JpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJcHJvY2Vzc0NoaWxkKEFzc29jaWF0aW9uSGVscGVyLkRlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzLCAKLQkJCQkJZWxlbWVudFhtbAotCQkJCQkJCS5uZXdDaGlsZCgicmVmZXJlbmNlTGlzdCIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJjdXN0b21DYXRlZ29yaWVzIiksIHVzZXJjYXRlZ29yaWVzLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCS8vIGFkZCB0aGUgZGVzY3JpcHRvcnMgcmVmZXJlbmNpbmcgdGhpcyBlbGVtZW50Ci0JCQlzdXBlci5wcm9jZXNzRGVzY3JpcHRvcnMoZWxlbWVudFhtbCk7Ci0KLQkJfQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0dyYW5kQ2hpbGQoT2JqZWN0IGZlYXR1cmUsCi0JCQlNZXRob2RFbGVtZW50IGNoaWxkRWxlbWVtdCwgSUVsZW1lbnRMYXlvdXQgY2hpbGRMYXlvdXQsCi0JCQlYbWxFbGVtZW50IGNoaWxkWG1sRWxlbWVudCkgewotCQlpZiAoIShjaGlsZExheW91dCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0TGF5b3V0KQotCQkJCXx8IGNoaWxkWG1sRWxlbWVudCA9PSBudWxsCi0JCQkJfHwgIShjaGlsZEVsZW1lbXQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoISAoKFdvcmtQcm9kdWN0KWNoaWxkRWxlbWVtdCkuZ2V0SXNBYnN0cmFjdCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVdvcmtQcm9kdWN0TGF5b3V0IHdwQ2hpbGRMYXlvdXQgPSAoV29ya1Byb2R1Y3RMYXlvdXQpIGNoaWxkTGF5b3V0OwotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSB3cENoaWxkTGF5b3V0LmxheW91dE1hbmFnZXIKLQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCk7Ci0KLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpIHx8Ci0JCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpIHx8Ci0JCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCkpIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvRnVsZmlsbGluZ0ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5GdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50czsKLQkJCUxpc3QgaXRlbXMgPSB3cENoaWxkTGF5b3V0LmNhbGMwbkZlYXR1cmVWYWx1ZShjaGlsZEVsZW1lbXQsIG9GdWxmaWxsaW5nRmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJaXRlbXMgPSBnZXRUYWdRdWFsaWZpZWRXcExpc3QocmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpLCBpdGVtcyk7Ci0JCQl3cENoaWxkTGF5b3V0LmFkZFJlZmVyZW5jZXMob0Z1bGZpbGxpbmdGZWF0dXJlLCBjaGlsZFhtbEVsZW1lbnQsIG9GdWxmaWxsaW5nRmVhdHVyZQotCQkJCQkuZ2V0TmFtZSgpLCBpdGVtcyk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlYW1Qcm9maWxlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlYW1Qcm9maWxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZWEzNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UZWFtUHJvZmlsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIFRlYW0gUHJvZmlsZSBsYXlvdXQgZm9yIGJyb3dzaW5nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVGVhbVByb2ZpbGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCX0KLQkvKioKLQkgKiBsb2FkIHRoZSBub24tYXR0cmlidXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJaWYgKCEoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJCWZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJLy8gQnJvd3Npbmcgc3RvcHMgd29ya2luZyB3aGVuIGEgcm9sZSBpcyBzZXQgdG8KLQkJCS8vIHJlcGxhY2VkIGFub3RoZXIgcm9sZQotCQkJLy8gZm9yIHJlcGxhY2VyLCB0aGUgYmFzZSB3aWxsIGJlIGV2YWx1YXRlZCB0byB0aGUgcmVwbGFjZXIKLQkJCS8vIGFuZCBjYXVzaW5nIGRlYWRsb2NrCi0JCQlpZiAoZSAhPSBudWxsICYmIGUgIT0gZWxlbWVudCkgewotCQkJCWJvb2xlYW4gc2hvd0RldGFpbCA9IChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZSkKLQkJCQkvKgotCQkJCSAqIHx8IChwID09Ci0JCQkJICogVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSkKLQkJCQkgKi8pID8gdHJ1ZSA6IGluY2x1ZGVSZWZlcmVuY2VzOwotCi0JCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgZSkgKSB7Ci0JCQkJCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQkJCQllbGVtZW50WG1sCi0JCQkJCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpLCBlLCBzaG93RGV0YWlsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCWlmIChpc0JyZWFrZG93bkVsZW1lbnRfR3VpZGFuY2VzKGZlYXR1cmUpKSB7Ci0JCQkJc3VwZXIubG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUxpc3QgcHYgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmICgocHYgIT0gbnVsbCkgJiYgKCFwdi5pc0VtcHR5KCkpKQotCQkJewotCQkJCWZvciAoSXRlcmF0b3IgaXRvcj1wdi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgCi0JCQkJCXsKLQkJCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQkJfHwgKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKQotCQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgcm9sZURlc2NMaXN0KSAmJiByb2xlRGVzY0xpc3Quc2l6ZSgpID4gMCApIHsKLQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIG5hbWUsIHJvbGVEZXNjTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlbXBsYXRlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlbXBsYXRlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2NkMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UZW1wbGF0ZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFRlbXBsYXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlRlbXBsYXRlX1dvcmtQcm9kdWN0cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlRlbXBsYXRlX1dvcmtQcm9kdWN0cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIHN1cGVyLmVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBBdXRob3Jpbmc6ICBUZW1wbGF0ZSBhdHRhY2htZW50cyBvZiBhIGNvbnRyaWJ1dGluZyB0ZW1wbGF0ZSBndWlkYW5jZSBlbGVtZW50IGFyZSBub3QgYXBwZW5kZWQgdG8gdGhlIGJhc2UgbGlzdCBvZiBhdHRhY2htZW50cwkJCQkKLQkJCQkvL1N0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24pY29udGVudCkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvbnRlbnQsIHN1cGVyLmVsZW1lbnQsIGZlYXR1cmUsIHN1cGVyLmxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoIChhdHRhY2htZW50U3RyaW5nICE9IG51bGwpICYmIChhdHRhY2htZW50U3RyaW5nLmluZGV4T2YoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKSA+IDApICkKLQkJCQl7Ci0JCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLnJlcGxhY2VBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SLCBUbmdVdGlsLkdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsgCi0JCQkJfQotCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50RmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoYXR0YWNobWVudEZpbGUgIT0gbnVsbCkgewotCQkJCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF90ZW1wbGF0ZV9hdHRhY2htZW50X3VybC5tYXRjaGVyKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCWlmICghbS5maW5kKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgImZpbGU6Ly8iICsgYXR0YWNobWVudEZpbGUpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IG0uZ3JvdXAoMik7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgbS5ncm91cCgxKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Ub29sTWVudG9yTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rvb2xNZW50b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1MTkxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rvb2xNZW50b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgVG9vbCBNZW50b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xNZW50b3JMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFRvb2xNZW50b3JMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVGFza3MsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Ub29sTWVudG9yX1Rhc2tzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IHRvb2xzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVG9vbHMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJaW50IHN6ID0gdG9vbHMgPT0gbnVsbCA/IDAgOiB0b29scy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN6OyBpKyspIHsKLQkJCQlNZXRob2RFbGVtZW50IHRvb2wgPSB0b29scy5nZXQoaSk7Ci0JCQkJYWRkUmVmZXJlbmNlKEFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVG9vbHMsIGVsZW1lbnRYbWwsICJ0b29sIiwgdG9vbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9XaGl0ZXBhcGVyTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1doaXRlcGFwZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmN2YzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1doaXRlcGFwZXJMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBXaGl0ZXBhcGVyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV2hpdGVwYXBlckxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0JCi0JcHVibGljIFdoaXRlcGFwZXJMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwgCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQ29udGVudEVsZW1lbnRzLCAKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3QgYWN0aXZpdGllcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQnJlYWtkb3duRWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCi0JCQljb250ZW50RWxlbWVudHMuYWRkQWxsKGFjdGl2aXRpZXMpOwotCi0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgc3VwZXIuZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQotCQkJCS8vIEF1dGhvcmluZzogIFRlbXBsYXRlIGF0dGFjaG1lbnRzIG9mIGEgY29udHJpYnV0aW5nIHRlbXBsYXRlIGd1aWRhbmNlIGVsZW1lbnQgYXJlIG5vdCBhcHBlbmRlZCB0byB0aGUgYmFzZSBsaXN0IG9mIGF0dGFjaG1lbnRzCQkJCQotCQkJCS8vU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiljb250ZW50KS5nZXRBdHRhY2htZW50cygpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpOwotCQkJCVN0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoY29udGVudCwgc3VwZXIuZWxlbWVudCwgZmVhdHVyZSwgc3VwZXIubGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWlmICggKGF0dGFjaG1lbnRTdHJpbmcgIT0gbnVsbCkgJiYgKGF0dGFjaG1lbnRTdHJpbmcuaW5kZXhPZihDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpID4gMCkgKQotCQkJCXsKLQkJCQkJYXR0YWNobWVudFN0cmluZyA9IGF0dGFjaG1lbnRTdHJpbmcucmVwbGFjZUFsbChDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IsIFRuZ1V0aWwuR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1IpOyAKLQkJCQl9Ci0JCQkJTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoYXR0YWNobWVudFN0cmluZyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnRGaWxlID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChhdHRhY2htZW50RmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX3RlbXBsYXRlX2F0dGFjaG1lbnRfdXJsLm1hdGNoZXIoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJaWYgKCFtLmZpbmQoKSkgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJ1cmwiLCAiZmlsZTovLyIgKyBhdHRhY2htZW50RmlsZSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQkJCQkJLnNldEF0dHJpYnV0ZSgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gbS5ncm91cCgyKTsKLQkJCQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJ1cmwiLCBtLmdyb3VwKDEpKSAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJLnNldEF0dHJpYnV0ZSgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLX0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTVkMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrQnJlYWtkb3duRWxlbWVudExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogVGhlIGxheW91dCBmb3Igd29yayBicmVha2Rvd24gRWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudExheW91dCBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSB0aGUgd29ya29yZGVyCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQkJaWYgKGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSkgewotCQkJCQkJbG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwZXIubG9hZFdvcmtPcmRlcihlbGVtZW50WG1sKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjkyODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQgZXh0ZW5kcyBEZXNjcmlwdG9yTGF5b3V0IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBleHRyYUZlYXR1cmVzRnJvbVdvcmtQcm9kdWN0ID0gQXJyYXlzLmFzTGlzdChuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkKLQl9KTsKLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQjbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQotCQlzdXBlci5sb2FkUmVmZXJlbmNlcyhlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQotCQkvLyAxNjEzMjUgLSBXUERlc2NyaXB0b3JzIGRpZCBub3Qgc2hvdyBtb2RpZnkgUm9sZURlc2NyaXB0b3JzCi0JCS8vIGdldCB0aGUgbW9kaWZpZXMgZmVhdHVyZQotCQkvLyB0aGlzIGd1eSBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlCi0JCS8vIHRoaXMgbWV0aG9kIGNhbGwgaXMgbm90IHNhZmUuIAotLy8JCUxpc3QgbW9kaWZ5Um9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNNb2RpZnlSb2xlRGVzY3JpcHRvcnMoCi0vLwkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXN1cGVyLmVsZW1lbnQsIAotLy8JCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQotCQlMaXN0IG1vZGlmeVJvbGVzID0gY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycygpOwotCQkKLQkJYWRkUmVmZXJlbmNlcyhudWxsLCBlbGVtZW50WG1sLCAid29ya2VkT25CeSIsIG1vZGlmeVJvbGVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJaWYgKChzdXBlci5lbGVtZW50TGF5b3V0ICE9IG51bGwgKSAmJiBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpICkgewotCQkJLy8gYWxzbyBsb2FkIHRoZSBsaW5rZWQgZWxlbWVudCByZWZlcmVuY2VkIGluZm9ybWF0aW9uCi0JCQlmb3IgKEl0ZXJhdG9yPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gaXRlcmF0b3IgPSBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJfQotCi0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkgewotCQlBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPihleHRyYUZlYXR1cmVzRnJvbVdvcmtQcm9kdWN0KTsKLQkJZmVhdHVyZXMuYWRkQWxsKHN1cGVyLmdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKSk7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0JCi0JcHVibGljIExpc3QgY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycygpIHsKLQkJCi0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCk7Ci0JCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzLCAKLQkJCQlyZWFsaXplcik7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ID0gKFRhc2tEZXNjcmlwdG9yKWl0Lm5leHQoKTsKLQkJCQotCQkJLy8gbWFrZSBzdXJlIHRoZSB0YXNrIGRlc2NyaXB0b3IgaGFzIHRoZSBjdXJyZW50IHdwIGRlc2NyaXB0b3IgYXMgb3V0cHV0Ci0JCQlTdHJpbmcgcGF0aCA9IHN1cGVyLm1ha2VQYXRoKGdldFN1cGVyQWN0aXZpdHlQYXRoKCksIHQpOwotCQkJVGFza0Rlc2NyaXB0b3JMYXlvdXQgdGwgPSAoVGFza0Rlc2NyaXB0b3JMYXlvdXQpbGF5b3V0TWFuYWdlci5jcmVhdGVMYXlvdXQodCwgb3duaW5nUHJvY2VzcywgcGF0aCk7Ci0JCQlMaXN0IG91dHB1dHMgPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgbnVsbCwgZmFsc2UpOwotCQkJCi0JCQlpZiAoIG91dHB1dHMgIT0gbnVsbCAmJiBvdXRwdXRzLmNvbnRhaW5zKGVsZW1lbnQpICkgewkKLQkJCQlMaXN0IHJvbGVEZXNjcmlwdG9ycyA9IChMaXN0KSB0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgbnVsbCwgZmFsc2UpOwotCQkJCWlmIChyb2xlRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHJvbGVEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlSb2xlRGVzY3JpcHRvciByID0gKFJvbGVEZXNjcmlwdG9yKSBpLm5leHQoKTsKLQkJCQkJaWYgKCAociAhPSBudWxsKSAmJiAhbW9kaWZ5Um9sZXMuY29udGFpbnMocikgKSB7Ci0JCQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbW9kaWZ5Um9sZXM7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlpZiAoICFzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoICFpc1Rhc2tPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSkgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGl0ZW1zLnNpemUoKSApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW1zLmdldChpKTsKLQkJCVN0cmluZyBwYXRoID0gc3VwZXIubWFrZVBhdGgoZ2V0U3VwZXJBY3Rpdml0eVBhdGgoKSwgZSk7Ci0JCQlUYXNrRGVzY3JpcHRvckxheW91dCB0bCA9IChUYXNrRGVzY3JpcHRvckxheW91dClsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChlLCBvd25pbmdQcm9jZXNzLCBwYXRoKTsKLQkJCUxpc3QgbyA9IG51bGw7Ci0JCQlpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IChMaXN0KXRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIG51bGwsIGZhbHNlKTsJCQkKLQkJCX0gZWxzZSBpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyApIHsKLQkJCQlvID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IChMaXN0KXRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSAKLQkJCQotCQkJaWYgKCAobyAhPSBudWxsKSAmJiBvLmNvbnRhaW5zKHRoaXMuZWxlbWVudCkgKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQl9Ci0JCX0KLQotCi0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJaW5jbHVkZUNvbnRhaW5lZFdwZFJlZmVyZW5jZXMoZWxlbWVudFhtbCk7Ci0JCX0KLQkJCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSBudWxsOwotCQlXb3JrUHJvZHVjdCB3cCA9IG51bGw7Ci0KLQkJYm9vbGVhbiBpc1Nsb3QgPSBmYWxzZTsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJaXNTbG90ID0gd3AuZ2V0SXNBYnN0cmFjdCgpOwotCQkJfQotCQl9Ci0JCWlmIChpc1Nsb3QpIHsKLQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKAotCQkJCQkiVHlwZSIsICJXb3JrUHJvZHVjdFNsb3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgKLQkJCQkJIlR5cGVOYW1lIiwgTGlicmFyeVJlc291cmNlcy5Xb3JrUHJvZHVjdFNsb3RfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUVPYmplY3QgY29udGFpbmluZ09iaiA9IHdwZC5lQ29udGFpbmVyKCk7Ci0JCVByb2Nlc3NQYWNrYWdlIGNvbnRhbmluZ1BrZyA9IGNvbnRhaW5pbmdPYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSA/IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmluZ09iagotCQkJCTogbnVsbDsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMgJiYgY29udGFuaW5nUGtnICE9IG51bGwpIHsKLQkJCUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IHByb2Nlc3NFbGVtZW50cyA9IGNvbnRhbmluZ1BrZwotCQkJCQkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQlNYXA8V29ya1Byb2R1Y3QsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BXcGRNYXAgPSBuZXcgSGFzaE1hcDxXb3JrUHJvZHVjdCwgV29ya1Byb2R1Y3REZXNjcmlwdG9yPigpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlmb3IgKFByb2Nlc3NFbGVtZW50IHByb2Nlc3NFbGVtZW50IDogcHJvY2Vzc0VsZW1lbnRzKSB7Ci0JCQkJaWYgKHByb2Nlc3NFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGRFbGVtID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcHJvY2Vzc0VsZW1lbnQ7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwRWxlbWVudCA9IHdwZEVsZW0uZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJaWYgKHdwRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQl3cEVsZW1lbnQgPSAoV29ya1Byb2R1Y3QpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh3cEVsZW1lbnQsIGNvbmZpZyk7Ci0JCQkJCQlpZiAod3BFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQl3cFdwZE1hcC5wdXQod3BFbGVtZW50LCB3cGRFbGVtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGlzU2xvdCkgewotCQkJCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLkZ1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzOwotCQkJCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5jYWxjRnVsZmlsbHNfRnVsZmlsbGFibGVFbGVtZW50KHdwLCBjb25maWcpOwotCQkJCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiB3cGRMaXN0ID0gZ2V0V3BkTGlzdCh3cFdwZE1hcCwgbGlzdCk7Ci0JCQkJYWRkUmVmZXJlbmNlcyhvZmVhdHVyZSwgZWxlbWVudFhtbCwgb2ZlYXR1cmUuZ2V0TmFtZSgpLCB3cGRMaXN0KTsKLQkJCX0gZWxzZSBpZiAod3AgIT0gbnVsbCkgewotCQkJCUVSZWZlcmVuY2UgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCk7Ci0JCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmNhbGNGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMod3AsIGNvbmZpZyk7Ci0JCQkJTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwZExpc3QgPSBnZXRXcGRMaXN0KHdwV3BkTWFwLCBsaXN0KTsKLQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGZlYXR1cmUuZ2V0TmFtZSgpLCB3cGRMaXN0KTsKLQkJCQkKLQkJCQlpbmNsdWRlU2xvdFJlZmVyZW5jZXMoZWxlbWVudFhtbCwgd3BkTGlzdCk7Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5jbHVkZVNsb3RSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwZHNXaXRoc2xvdHMpIHsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKTsJCQotCQkJCQotCQlhZGRTbG90UmVmZXJlbmNlcyhlbGVtZW50WG1sLAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycywKLQkJCQkibWFuZGF0b3J5SW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiLCB3cGRzV2l0aHNsb3RzLCByZWFsaXplcik7CS8vJE5PTi1OTFMtMSQKLQotCQlhZGRTbG90UmVmZXJlbmNlcyhlbGVtZW50WG1sLAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQkJCSJvcHRpb25hbElucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIiwgd3Bkc1dpdGhzbG90cywgcmVhbGl6ZXIpOwkvLyROT04tTkxTLTEkCi0KLQkJYWRkU2xvdFJlZmVyZW5jZXMoZWxlbWVudFhtbCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMsCi0JCQkJIm91dHB1dEZyb21UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIiwgd3Bkc1dpdGhzbG90cywgcmVhbGl6ZXIpOwkvLyROT04tTkxTLTEkCi0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkU2xvdFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUsIFN0cmluZyByZWZlcmVuY2VOYW1lLCBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3Bkc1dpdGhzbG90cywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWZvciAoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZDogd3Bkc1dpdGhzbG90cykgewotCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUod3BkLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJcmVmZXJlbmNlcy5hZGRBbGwobGlzdCk7Ci0JCX0KLQotCQlhZGRSZWZlcmVuY2VzKG9mZWF0dXJlLCBlbGVtZW50WG1sLCByZWZlcmVuY2VOYW1lLCByZWZlcmVuY2VzKTsgCi0JfQotCQotCXByaXZhdGUgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldFdwZExpc3QoTWFwPFdvcmtQcm9kdWN0LCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwV3BkTWFwLCBMaXN0PFdvcmtQcm9kdWN0PiB3cExpc3QpIHsKLQkJTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHJldCA9IG5ldyBBcnJheUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigpOwotCQlmb3IgKFdvcmtQcm9kdWN0IHdwOiB3cExpc3QpIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSB3cFdwZE1hcC5nZXQod3ApOwotCQkJaWYgKHdwZCAhPSBudWxsKSB7Ci0JCQkJcmV0LmFkZCh3cGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQkJCi0KLQlwcml2YXRlIHZvaWQgaW5jbHVkZUNvbnRhaW5lZFdwZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSBnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgPwotCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKSA6IG51bGw7Ci0JCWlmICh3cGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJaWYgKCEgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluZXJGZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJQXJ0aWZhY3QgY29udGFpbmVyQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHdwLCBudWxsLAotCQkJCWNvbnRhaW5lckZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpOwkJCQkJCQotCQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkTGlzdCA9IG5ldyBBcnJheUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigpOwotCQlBY3Rpdml0eSBzdXBlckFjdCA9IHdwZC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJZm9yIChCcmVha2Rvd25FbGVtZW50IGJlOiBzdXBlckFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpKSB7Ci0JCQlpZiAoYmUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cEJlID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGJlKS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cEJlIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJaWYgKCgoQXJ0aWZhY3QpIHdwQmUpLmdldENvbnRhaW5lckFydGlmYWN0KCkgPT0gd3ApIHsKLQkJCQkJCXdwZExpc3QuYWRkKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGJlKTsKLQkJCQkJfQotCQkJCQlpZiAoY29udGFpbmVyQXJ0aWZhY3QgIT0gbnVsbCAmJiBjb250YWluZXJBcnRpZmFjdCA9PSB3cEJlKSB7Ci0JCQkJCQljb250YWluZXJBcnRpZmFjdCA9IG51bGw7Ci0JCQkJCQlwcm9jZXNzQ2hpbGQoY29udGFpbmVyRmVhdHVyZSwgZWxlbWVudFhtbAotCQkJCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRSkuc2V0QXR0cmlidXRlKCJuYW1lIiwgY29udGFpbmVyRmVhdHVyZS5nZXROYW1lKCkpLCBiZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmVhdHVyZS5nZXROYW1lKCksIHdwZExpc3QpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya1Byb2R1Y3RMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya1Byb2R1Y3RMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjYjE5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhbiBBcnRpZmFjdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFdvcmtQcm9kdWN0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkKLQkJYm9vbGVhbiBpc1Nsb3QgPSBmYWxzZTsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgZ2V0RWxlbWVudCgpOwotCQkJaXNTbG90ID0gd3AuZ2V0SXNBYnN0cmFjdCgpOwotCQl9Ci0JCWlmIChpc1Nsb3QpIHsJCQkKLQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJUeXBlIiwgIldvcmtQcm9kdWN0U2xvdCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlR5cGVOYW1lIiwgTGlicmFyeVJlc291cmNlcy5Xb3JrUHJvZHVjdFNsb3RfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0KLQkJCS8vIG5vIHRoaXMgd2lsbCBsb3NlIHRoZSBjb250cmlidXRvcgotCQkJLy8gUm9sZSByZXNwb25zaWJsZVJvbGUgPQotCQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlKChXb3JrUHJvZHVjdClzdXBlci5lbGVtZW50KTsKLQkJCS8vbXVsdGlwbGljaXR5IGNoYW5nZSBmb3Igb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCUxpc3QgcmVzcG9uc2libGVSb2xlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXMsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0vLwkJCWlmIChyZXNwb25zaWJsZVJvbGUgIT0gbnVsbCkgewotLy8JCQkJTWV0aG9kRWxlbWVudCByb2xlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLS8vCQkJCQkJKE1ldGhvZEVsZW1lbnQpIHJlc3BvbnNpYmxlUm9sZSwgbGF5b3V0TWFuYWdlcgotLy8JCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCkpOwotLy8JCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotLy8JCQkJCVN0cmluZyByb2xlTmFtZSA9ICgoUm9sZSkgcm9sZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotLy8JCQkJCWlmIChyb2xlTmFtZSA9PSBudWxsIHx8IHJvbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLS8vCQkJCQkJcm9sZU5hbWUgPSByb2xlLmdldE5hbWUoKTsKLS8vCQkJCQl9Ci0vLwkJCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInJlc3BvbnNpYmxlUm9sZU5hbWUiLCByb2xlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlhZGRSZWZlcmVuY2UoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlLCBlbGVtZW50WG1sLCAicmVzcG9uc2libGVSb2xlIiwgcm9sZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0KLS8vCQkJfQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzLCBlbGVtZW50WG1sLCAicmVzcG9uc2libGVSb2xlcyIsIHJlc3BvbnNpYmxlUm9sZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIEJyb3dzaW5nIGEgQ29uZmlndXJhdGlvbiBJbmNsdWRlcyBhIFJlbGF0aW9uc2hpcCB0aGF0IGlzIG5vdCBQYXJ0IG9mIHRoZSBDb25maWd1cmF0aW9uCi0JCQkvLyBzaG91bGQgY2FsbCB0aGUgY29uZmlndXJhdGlvbiBoZWxwZXIgdG8gcmVhbGl6ZSB0aGUgdmFsdWUKLQkJCS8vIHRoZXJlIGlzIG5vIG9wcG9zaXRlIGZlYXR1cmUgZGVmaW5lZCBmb3IgdGhpcy4gCi0JCQkvLyB3ZSBnZXQgdGhlIHZhbHVlIGluIHR3byBzdGVwczoKLQkJCS8vIDEuIGdldCB0aGUgdGFza3MgdGhhdCBvdXRwdXQgdGhpcyBXUAotCQkJLy8gMi4gZ2V0IHRoZSByb2xlcyB0aGF0IGlzIHRoZSByZXNwb25zaWJsZSBmb3IgdGhlIHRhc2tzCi0vLwkJCUxpc3QgbW9kaWZ5Um9sZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotLy8JCQkJCS5nZXRNb2RpZmllZEJ5KChXb3JrUHJvZHVjdCkgc3VwZXIuZWxlbWVudCk7Ci0vLwkJCW1vZGlmeVJvbGVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudHMoCi0vLwkJCQkJbW9kaWZ5Um9sZXMsIGxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQotLy8JCQlMaXN0IHRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0vLwkJCQkJc3VwZXIuZWxlbWVudCwgCi0vLwkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywgCi0vLwkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0vLwkJCUxpc3QgbW9kaWZ5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJVGFzayB0ID0gKFRhc2spaXQubmV4dCgpOwotLy8JCQkJTGlzdCByb2xlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotLy8JCQkJCQl0LCAKLS8vCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCAKLS8vCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJvbGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgewotLy8JCQkJCU9iamVjdCByID0gaXRyLm5leHQoKTsKLS8vCQkJCQlpZiAoICFtb2RpZnlSb2xlcy5jb250YWlucyhyKSApIHsKLS8vCQkJCQkJbW9kaWZ5Um9sZXMuYWRkKHIpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQkJCi0JCQlMaXN0IG1vZGlmeVJvbGVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjTW9kaWZ5Um9sZXMoCi0JCQkJCShXb3JrUHJvZHVjdClzdXBlci5lbGVtZW50LCAKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCS8vIHRoaXMgZ3V5IGRvZXMgbm90IGhhdmUgYSBkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmUKLQkJCS8vIGp1c3QgcGFzcyBudWxsIGFzIGl0J3MgZmVhdHVyZSBvYmplY3QsIEppbmh1YSBYaSwgMDQvMTcvMjAwNgotCQkJYWRkUmVmZXJlbmNlcyhudWxsLCBlbGVtZW50WG1sLCAibW9kaWZ5Um9sZXMiLCBtb2RpZnlSb2xlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCBkb21haW5zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Eb21haW5zLCBlbGVtZW50WG1sLCAiZG9tYWlucyIsIGRvbWFpbnMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgd29ya1Byb2R1Y3RUeXBlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzLCBlbGVtZW50WG1sLCAid29ya1Byb2R1Y3RUeXBlcyIsIHdvcmtQcm9kdWN0VHlwZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3QgbWFuZGF0b3J5SW5wdXRUb1Rhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfTWFuZGF0b3J5SW5wdXRUb19UYXNrcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MsIGVsZW1lbnRYbWwsCi0JCQkJCSJtYW5kYXRvcnlJbnB1dFRvVGFza3MiLCBtYW5kYXRvcnlJbnB1dFRvVGFza3MpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgb3B0aW9uYWxJbnB1dFRvVGFza3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MsIGVsZW1lbnRYbWwsCi0JCQkJCSJvcHRpb25hbElucHV0VG9UYXNrcyIsIG9wdGlvbmFsSW5wdXRUb1Rhc2tzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IG91dHB1dEZyb21UYXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzLCAKLQkJCQkJZWxlbWVudFhtbCwgIm91dHB1dEZyb21UYXNrcyIsIG91dHB1dEZyb21UYXNrcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaW5jbHVkZVNsb3RSZWZlcmVuY2VzKGVsZW1lbnRYbWwpOwotCQkJCi0JCQkvLyBhZGQgdGhlIGRlc2NyaXB0b3JzIHJlZmVyZW5jaW5nIHRoaXMgZWxlbWVudAotCQkJc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3JzKGVsZW1lbnRYbWwpOwotCi0JCX0KLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbmNsdWRlU2xvdFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCk7CQkKLQkJRnVsZmlsbGFibGVFbGVtZW50IGZFbGVtZW50ID0gKEZ1bGZpbGxhYmxlRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQlpZiAoZkVsZW1lbnQuZ2V0SXNBYnN0cmFjdCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdCBzbG90cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygKLQkJCQlmRWxlbWVudCwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkKLQkJYWRkU2xvdFJlZmVyZW5jZXMoZWxlbWVudFhtbCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzLAotCQkJCSJtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzIiwgc2xvdHMsIHJlYWxpemVyKTsJLy8kTk9OLU5MUy0xJAotCi0JCWFkZFNsb3RSZWZlcmVuY2VzKGVsZW1lbnRYbWwsCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzLAotCQkJCSJvcHRpb25hbElucHV0VG9UYXNrc19mcm9tU2xvdHMiLCBzbG90cywgcmVhbGl6ZXIpOwkvLyROT04tTkxTLTEkCi0KLQkJYWRkU2xvdFJlZmVyZW5jZXMoZWxlbWVudFhtbCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzLAotCQkJCSJvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzIiwgc2xvdHMsIHJlYWxpemVyKTsJLy8kTk9OLU5MUy0xJAkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFNsb3RSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlLCBTdHJpbmcgcmVmZXJlbmNlTmFtZSwgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHNsb3RzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJZm9yIChGdWxmaWxsYWJsZUVsZW1lbnQgZkVsZW1lbnQ6IHNsb3RzKSB7Ci0JCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShmRWxlbWVudCwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCXJlZmVyZW5jZXMuYWRkQWxsKGxpc3QpOwotCQl9Ci0KLQkJYWRkUmVmZXJlbmNlcyhvZmVhdHVyZSwgZWxlbWVudFhtbCwgcmVmZXJlbmNlTmFtZSwgcmVmZXJlbmNlcyk7IAotCX0KLQkJCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygKLQkJCQkJKEZ1bGZpbGxhYmxlRWxlbWVudCkgZWxlbWVudCwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9CQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQoCi0JCQkJCShGdWxmaWxsYWJsZUVsZW1lbnQpIGVsZW1lbnQsIHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2M0ZjNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbGF5b3V0IG1hbmFnZW1lbnQgZm9yIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNWJlZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgbWFuYWdpbmcgdGhlIGxheW91dCBvZiBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvSVhtbEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9JWG1sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM4Nzg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9JWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWw7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYW4gWE1MIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhtbEVsZW1lbnQgewotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgc3RyaW5nIHRleHQKLQkgKiBAcmV0dXJuIFN0cmluZ0J1ZmZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgdG9YbWwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9YbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjk2MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLQotCi0vKioKLSAqIEltcGxlbWVudHMgYSBYTUwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudCBpbXBsZW1lbnRzIElYbWxFbGVtZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gRmlsZVV0aWwuTElORV9TRVA7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTk9ERV9JRCA9ICJub2RlSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUEFSRU5UX05PREVfSUQgPSAicGFyZW50Tm9kZUlkIjsKLQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRfbmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50X3ZhbHVlID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBNYXAgY29udGVudHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0JLyoqCi0JICogY3JlYXRlIGFuIFhtbEVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudChTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiBYbWxFbGVtZW50Ci0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHBhcmFtIGlkIFN0cmluZwotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpIHsKLQkJdGhpcy5lbGVtZW50X25hbWUgPSBuYW1lOwotCQkKLQkJaWYgKGlkID09IG51bGwgKSB7Ci0JCQlpZCA9IEludGVnZXIudG9IZXhTdHJpbmcodGhpcy50b1N0cmluZygpLmhhc2hDb2RlKCkpOwotCQl9Ci0JCQotCQl0aGlzLmlkID0gaWQ7Ci0JCXNldEF0dHJpYnV0ZShOT0RFX0lELCB0aGlzLmlkKTsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBlbGVtZW50IGl0c2VsZgotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5lbGVtZW50X3ZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBzZXRDb250ZW50KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJY29udGVudHMucHV0KG5hbWUsIHZhbHVlKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgY2hpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBhZGRDaGlsZChYbWxFbGVtZW50IGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBjaGlpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBjaGlsZCBlbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgbmV3Q2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ld0NoaWxkKG5hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgY2hpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBjaGlsZCBlbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgbmV3Q2hpbGQoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCkgewotCQlYbWxFbGVtZW50IGNoaWxkID0gbmV3IFhtbEVsZW1lbnQobmFtZSwgaWQpOwotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBpZAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgeG1sIHN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nQnVmZmVyCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciB0b1htbCgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA9PSAwICYmIGNoaWxkcmVuLnNpemUoKSA9PSAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKAotCQkJCQlYbWxIZWxwZXIuZ2V0RWxlbWVudChlbGVtZW50X25hbWUsIGVsZW1lbnRfdmFsdWUsCi0JCQkJCQkJYXR0cmlidXRlcykpLmFwcGVuZChCUik7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKFhtbEhlbHBlci5iZWdpbkVsZW1lbnQoZWxlbWVudF9uYW1lLCBhdHRyaWJ1dGVzKSkKLQkJCQkJLmFwcGVuZChCUik7Ci0KLQkJCS8vIHByb2Nlc3MgdGhlIGNvbnRlbnRzCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29udGVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdExpc3QgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdExpc3QKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJYnVmZmVyLmFwcGVuZCgKLQkJCQkJCQkJWG1sSGVscGVyLmdldEVsZW1lbnQoa2V5LCBpdExpc3QubmV4dCgpCi0JCQkJCQkJCQkJLnRvU3RyaW5nKCksIG51bGwpKS5hcHBlbmQoQlIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyCi0JCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJCVhtbEhlbHBlcgotCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgKLQkJCQkJCQkJCQkJCQlrZXksCi0JCQkJCQkJCQkJCQkJKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZS50b1N0cmluZygpLCBudWxsKSkuYXBwZW5kKEJSKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gcHJvY2VzcyB0aGUgY2hpbGRyZW4KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVhtbEVsZW1lbnQgY2hpbGQgPSAoSVhtbEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlidWZmZXIuYXBwZW5kKGNoaWxkLnRvWG1sKCkpOwotCQkJfQotCi0JCQlidWZmZXIuYXBwZW5kKFhtbEhlbHBlci5lbmRFbGVtZW50KGVsZW1lbnRfbmFtZSkpLmFwcGVuZChCUik7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCS8qKgotCSAqIHNhdmUgdGhlIGVsZW1lbnQncyB4bWwgdG8gYSBmaWxlCi0JICogQHBhcmFtIGZpbGVQYXRoTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVUbyhTdHJpbmcgZmlsZVBhdGhOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciB4bWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXhtbC5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh0aGlzLnRvWG1sKCkpOwotCi0JCXRyeSB7Ci0JCQkvLyBtYXkgbmVlZCB0byBjcmVhdGUgdGhlIGZvbGRlcnMsIFRPRE8KLQkJCS8qCi0JCQkgKiBGaWxlIHhmID0gbmV3IEZpbGUoIGZpbGVQYXRoKTsgaWYgKCAheGYuZXhpc3RzKCkgKSB7IHhmLm1rZGlycygpOyB9Ci0JCQkgKi8KLQotCQkJLy8gbmVlZCB0byBlbmZvcmUgdXRmLTggZW5jb2RpbmcsIGNhbid0IHVzZSBGaWxlV3JpdGVyLCBqeGkKLQkJCS8vIEZpbGVXcml0ZXIgeHcgPSBuZXcgRmlsZVdyaXRlcihmaWxlUGF0aE5hbWUpOwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHh3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZVBhdGhOYW1lKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJeHcud3JpdGUoeG1sLnRvU3RyaW5nKCkpOwotCQkJeHcuZmx1c2goKTsKLQkJCXh3LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmFkMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBwcm9jZXNzaW5nIHRoZSBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgRWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICovCi1wdWJsaWMgY2xhc3MgWG1sSGVscGVyIHsKLQotCS8qKgotCSAqIFhNTCBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfSEVBREVSID0gWE1MVXRpbC5YTUxfREVDTEFSQVRJT04KLQkJCSsgRmlsZVV0aWwuTElORV9TRVA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBYTUxVdGlsLmVzY2FwZShlbGVtZW50TmFtZS5yZXBsYWNlKCcgJywgJy0nKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gIlwiIiArIHN0ciArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBzID09IG51bGwgPyAiIiA6IHM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIHN0YXJ0IHRhZyBvZiBhbiB4bWwgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50TmFtZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiZWdpbkVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBNYXAgYXR0cmlidXRlcykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCI8IiArIHZhbGlkTmFtZShlbGVtZW50TmFtZSkpOyAvLyROT04tTkxTLTEkCi0JCWlmICgoYXR0cmlidXRlcyAhPSBudWxsKSAmJiAoYXR0cmlidXRlcy5zaXplKCkgPiAwKSkgewotCQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCVN0cmluZyBrZXksIHZhbHVlOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl2YWx1ZSA9IHF1b3RlKFhNTFV0aWwuZXNjYXBlKAotCQkJCQkJdmFsaWRhdGUoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSksIHRydWUpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCIgIiArIHZhbGlkTmFtZShrZXkpICsgIj0iICsgdmFsdWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiBlbmQgdGFnIG9mIGFuIHhtbCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnROYW1lCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gIjwvIiArIHZhbGlkTmFtZShlbGVtZW50TmFtZSkgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiB4bWwgZWxlbWVudCBzdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUKLQkgKiBAcGFyYW0gZWxlbWVudFZhbHVlCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgZWxlbWVudFZhbHVlLAotCQkJTWFwIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChiZWdpbkVsZW1lbnQoZWxlbWVudE5hbWUsIGF0dHJpYnV0ZXMpKS5hcHBlbmQoCi0JCQkJWE1MVXRpbC5lc2NhcGUodmFsaWRhdGUoZWxlbWVudFZhbHVlKSwgdHJ1ZSkpLmFwcGVuZCgKLQkJCQllbmRFbGVtZW50KGVsZW1lbnROYW1lKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBmMDM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBsYXlvdXQgbWFuYWdlbWVudCBzdXBwb3J0IGZvciBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTYxNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5YTliYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci0KLS8qKgotICogVGhlIExpYnJhcnkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciBzdG9yaW5nIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZAotCSAqIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUVUSE9EX0xJUkFSWV9VUkkgPSAic2F2ZWRNZXRob2RMaWJyYXJ5VVJJIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZAotCSAqIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFID0gInNhdmVkTWV0aG9kTGlicmFyeVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3Igc3RvcmluZyB0aGUgZGlzY2FyZCB1bnJlc29sdmVkIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSAiZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHVzZSBuZXcgZXh0ZW5kcyBzZW1hbnRpY3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUyA9ICJ1c2VOZXdFeHRlbmRzU2VtYW50aWNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgYmV0d2VlbiB0YXNrcyBhbmQgcm9sZXMgaW4gdGhlCi0JICogcm9sZSBkaWFncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcgPSAicm9sZURpYWdyYW1Ib3Jpem9udGFsU3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciB0aGUgdmVydGljYWwgc3BhY2luZyBiZXR3ZWVuIHRhc2tzIGFuZCByb2xlcyBpbiB0aGUKLQkgKiByb2xlIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ESUFHUkFNX1ZFUlRJQ0FMX1NQQUNJTkcgPSAicm9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3IgdGhlIG1heGltdW4gZWxlbWVudCBsYWJlbCB0ZXh0IGxpbmVzIGluIHRoZSByb2xlCi0JICogZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMgPSAicm9sZURpYWdyYW1FbGVtZW50TGFiZWxUZXh0TGluZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9VU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST0xFX0RJQUdSQU1fSE9SSVpPTlRBTF9TUEFDSU5HID0gNzA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORyA9IDMwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTID0gMzsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCURFRkFVTFRfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChVU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTLAotCQkJCURFRkFVTFRfVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUyk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUk9MRV9ESUFHUkFNX0hPUklaT05UQUxfU1BBQ0lORywKLQkJCQlERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORywKLQkJCQlERUZBVUxUX1JPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTLAotCQkJCURFRkFVTFRfUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoU0FWRURfTUVUSE9EX0xJUkFSWV9VUkkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTQVZFRF9NRVRIT0RfTElSQVJZX1VSSSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFNBVkVEX01FVEhPRF9MSVJBUllfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTYXZlZE1ldGhvZExpYnJhcnlUeXBlKFN0cmluZyB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpc2NhcmQgdW5yZXNvbHZlZCByZWZlcmVuY2VzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2UgbmV3IGV4dGVuZHMgc2VtYW50aWNzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihVU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFVTRV9ORVdfRVhURU5EU19TRU1BTlRJQ1MsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHJvbGUgZGlhZ3JhbSBob3Jpem9udGFsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkaWFncmFtIGhvcml6b250YWwgc3BhY2luZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCkgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KFJPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkc7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHJvbGUgZGlhZ3JhbSBob3Jpem9udGFsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShST0xFX0RJQUdSQU1fSE9SSVpPTlRBTF9TUEFDSU5HLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCByb2xlIGRpYWdyYW0gdmVydGljYWwgc3BhY2luZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgZGlhZ3JhbSB2ZXJ0aWNhbCBzcGFjaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKCkgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KFJPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HKTsKLQkJcmV0dXJuIHZhbHVlID4gMCA/IHZhbHVlIDogREVGQVVMVF9ST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcm9sZSBkaWFncmFtIHZlcnRpY2FsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKGludCB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoUk9MRV9ESUFHUkFNX1ZFUlRJQ0FMX1NQQUNJTkcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHJvbGUgZGlhZ3JhbSBlbGVtZW50IGxhYmVsIG1heGltdW0gdGV4dCBsaW5lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkaWFncmFtIGVsZW1lbnQgbGFiZWwgbWF4aW11bSB0ZXh0IGxpbmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFJvbGVEaWFncmFtTWF4aW11bVRleHRMaW5lcygpIHsKLQkJaW50IHZhbHVlID0gcHJlZlN0b3JlLmdldEludChST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX1JPTEVfRElBR1JBTV9NQVhfVEVYVF9MSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcm9sZSBkaWFncmFtIGVsZW1lbnQgbGFiZWwgbWF4aW11bSB0ZXh0IGxpbmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSb2xlRGlhZ3JhbU1heGltdW1UZXh0TGluZXMoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMsIHZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNjMDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBsaWJyYXJ5IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0JTQ29sdW1uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvQlNDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4MWJhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvQlNDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzOwotCi0vKioKLSAqIFNpbXBsZSBkYXRhIHN0cnVjdHVyZSB0byBpZGVudGlmeSBhIGJyZWFrZG93biBsYXlvdXQgY29sdW1uLgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCU0NvbHVtbiB7Ci0KLQlwdWJsaWMgU3RyaW5nIGlkOwotCXB1YmxpYyBTdHJpbmcgbGFiZWw7Ci0JCi0JcHVibGljIEJTQ29sdW1uKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDRmNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotLyoqCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cyBleHRlbmRzIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSA9IFBSRUZJWCArICJsYXN0X2xpYnJhcnlfX3BhcmVudF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQgPSBQUkVGSVggKyAibGFzdF9kZWZhdWx0X2RpcmVjdG9yeV9jaGVja2VkIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fU0FWRV9DSE9JQ0UgPSBQUkVGSVggKyAicmFkaW9fc2F2ZV9jaG9pY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1RSQU5TTEFUSU9OX0VYUE9SVF9ESVJFQ1RPUlkgPSBQUkVGSVggKyAibGFzdF90cmFuc2xhdGlvbl9leHBvcnRfZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1BVQkxJU0hfRk9MREVSID0gUFJFRklYICsgImxhc3RfcHVibGlzaF9mb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX1BVQkxJU0hfRElSRUNUT1JZID0gUFJFRklYICsgImRlZmF1bHRfcHVibGlzaF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0ZFRURCQUNLX1VSTCA9IFBSRUZJWCArICJkZWZhdWx0X2ZlZWRiYWNrX3VybCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQID0gUFJFRklYICsgInByb21wdF9mb3JfbGlicmFyeV9hdF9zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTiA9IFBSRUZJWCArICJzZWxlY3RlZF9jb25maWdfaW5fbGFzdF9zZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0hJU1RPUllfU0laRSA9IFBSRUZJWCArICJkZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsIjsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk0NjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotCi0vKioKLSAqIENvbnN0YW50cyB0byBiZSB1c2VkIGluIHByZWZlcmVuY2Ugc3RvcmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWYuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbW92ZWQgZnJvbSB0byBoZXJlIHRvIHNoYXJlIHRoZSBjb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dCU19DT0xVTU5TID0gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XUEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUzsKLQotCS8vIGRlZmluZSB0aGUgZGVmYXVsdCBjb2x1bW5zIGZvciB3YnMsIHRicywgYW5kIHdwYnMgbGF5b3V0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dCU19DT0xVTU5TID0gewotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLCBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4sCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfVEJTX0NPTFVNTlMgPSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9XUEJTX0NPTFVNTlMgPSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwgfTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL1ByZWZlcmVuY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyZWViNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSB0aGUgcHJvY2VzcyBlbGVtZW50IGxheW91dCBwcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VVdGlsIHsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyB4c2xQYXJhbXM7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNvbElkTGFiZWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8vIHF1aWNrIHNvbHV0aW9uLCB0aGUgdGVhbSBjb2x1bW4gZm9yIHRoZSBXQlMgdmlldy4KLQkvLyAxNjI3ODMgLSBQdWJsaXNoIHRlYW0gaW5mb3JtYXRpb24gaW4gV0JTIGZvciBURHMKLQlwcml2YXRlIHN0YXRpYyBCU0NvbHVtbiB0ZWFtQ29sID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TVEVQUyA9ICJzdGVwcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgewotCQl0cnkgewotCQkJUHJvcGVydGllcyBwYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlzZXRYc2xQcm9wZXJ0aWVzKHBhcmFtcyk7Ci0JCQkKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYc2xQcm9wZXJ0aWVzKFByb3BlcnRpZXMgbmV3WHNsUGFyYW1zKSB7Ci0JCXhzbFBhcmFtcyA9IG5ld1hzbFBhcmFtczsJCi0JCQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lELCBnZXRMYWJlbCgiaW5kZXhUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSwgZ2V0TGFiZWwoIm5hbWVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGdldExhYmVsKCJicmVha2Rvd25FbGVtZW50VGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJRF9TVEVQUywgZ2V0TGFiZWwoInN0ZXBzVGV4dCIpKTsJCSAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLCBnZXRMYWJlbCgicHJlZml4VGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIGdldExhYmVsKCJ0eXBlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sIGdldExhYmVsKCJtb2RlbEluZm9UZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLCBnZXRMYWJlbCgicHJlZGVjZXNzb3JzVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUsIGdldExhYmVsKCJyZXBlYXRhYmxlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsIGdldExhYmVsKCJvbmdvaW5nVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwgZ2V0TGFiZWwoImV2ZW50RHJpdmVuVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLCBnZXRMYWJlbCgib3B0aW9uYWxUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwgZ2V0TGFiZWwoInBsYW5uZWRUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBnZXRMYWJlbCgibXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLCBnZXRMYWJlbCgidGVhbVRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLCBnZXRMYWJlbCgiZGVsaXZlcmFibGVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUsIGdldExhYmVsKCJlbnRyeVN0YXRlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUsIGdldExhYmVsKCJleGl0U3RhdGVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhYmVsKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIGxhYmVsID0geHNsUGFyYW1zLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICggbGFiZWwgPT0gbnVsbCApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgZmluZCBwcm9wZXJ0eSBlbnRyeSBmb3IgIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxhYmVsID0ga2V5OwotCQl9Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBjb2x1bW5zIGZvciBXQlMgbGF5b3V0Ci0JICogQHJldHVybiBMaXN0IG9mIEJTQ29sdW1uIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V0JTQ29sdW1ucygpIHsKLQkJTGlzdCBjb2xzID0gZ2V0UHJlZmVyZW5jZUl0ZW1zKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUyk7Ci0JCQotCQkvLyBpZiB0aGUgVEJTIGNvbHVtbnMgaGFzIHRlYW0sIGFsc28gYWRkIHRvIHRoZSBXQlMKLQkJLy8gMTYyNzgzIC0gUHVibGlzaCB0ZWFtIGluZm9ybWF0aW9uIGluIFdCUyBmb3IgVERzCi0JCXRlYW1Db2wgPSBudWxsOwotCQlnZXRUQlNDb2x1bW5zKCk7Ci0JCWlmICggdGVhbUNvbCAhPSBudWxsICkgewotCQkJY29scy5hZGQoY29scy5zaXplKCksIHRlYW1Db2wpOwotCQl9Ci0JCXJldHVybiBjb2xzOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGNvbHVtbnMgZm9yIFRCUyBsYXlvdXQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgQlNDb2x1bW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUQlNDb2x1bW5zKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZUl0ZW1zKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUyk7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgV1BCUyBsYXlvdXQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgQlNDb2x1bW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXUEJTQ29sdW1ucygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VJdGVtcyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKTsKLQl9Ci0JCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbHVtbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVQcmVmZXJlbmNlcygpIHsKLQkJLy8gY2FsbCB0aGUgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGUgZGVmYXVsdCBpcyBsb2FkZWQKLQkJZ2V0V0JTQ29sdW1ucygpOwotCQlnZXRUQlNDb2x1bW5zKCk7Ci0JCWdldFdQQlNDb2x1bW5zKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0UHJlZmVyZW5jZUl0ZW1zKFN0cmluZyBrZXkpIHsKLQkJCi0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CQkKLQkJU3RyaW5nIHN0ciA9IHN0b3JlLmdldFN0cmluZyhrZXkpOwotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXN0ciA9IHN0b3JlLmdldERlZmF1bHRTdHJpbmcoa2V5KTsKLQkJfQotCQkKLQkJaWYgKCBzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXN0ciA9IGdldERlZmF1bHQoa2V5KTsKLQkJCXN0b3JlLnNldFZhbHVlKGtleSwgc3RyKTsKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgaWQgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwkJCi0JCQlpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSAhPSAwICkgewotCQkJCQotCQkJCUJTQ29sdW1uIGNvbCA9IG5ldyBCU0NvbHVtbihpZCwgZ2V0Q29sVGV4dChpZCkpOwotCQkJCWl0ZW1zLmFkZChjb2wpOwotCQkJCS8vIGFkZCBzdGVwcyBjb2x1bW4gZm9yIFdCUwotCQkJCWlmICgga2V5LmVxdWFscyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpIAotCQkJCQkJJiYgaWQuZXF1YWxzKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpICkgewotCQkJCQljb2wgPSBuZXcgQlNDb2x1bW4oSURfU1RFUFMsIGdldENvbFRleHQoSURfU1RFUFMpKTsKLQkJCQkJaXRlbXMuYWRkKGNvbCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHNhdmUgdGhlIHRlYW0gY29sdW1uIGZvciBXQlMKLQkJCQkvLyAxNjI3ODMgLSBQdWJsaXNoIHRlYW0gaW5mb3JtYXRpb24gaW4gV0JTIGZvciBURHMKLQkJCQlpZiAoIElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMuZXF1YWxzKGlkKSApIHsKLQkJCQkJdGVhbUNvbCA9IGNvbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbFRleHQoU3RyaW5nIGtleSkgewotCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpY29sSWRMYWJlbE1hcC5nZXQoa2V5KTsKLQkJaWYgKCB0ZXh0ID09IG51bGwgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGxhYmVsIGRlZmluZWQgZm9yIGNvbHVtbiAiICsga2V5KTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRleHQgPSBrZXk7Ci0JCX0KLQkJCi0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyAgU3RyaW5nIGdldERlZmF1bHQoU3RyaW5nIGtleSkgewotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUy5lcXVhbHMoa2V5KSApIHsKLQkJCXJldHVybiB0b1N0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfV0JTX0NPTFVNTlMpOwotCQl9Ci0JCQotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUy5lcXVhbHMoa2V5KSApIHsKLQkJCXJldHVybiB0b1N0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfVEJTX0NPTFVNTlMpOwotCQl9Ci0JCQotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMuZXF1YWxzKGtleSkgKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZBVUxUX1dQQlNfQ09MVU1OUyk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nW10gaWRzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBpZHMubGVuZ3RoIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc3RyQnVmLmFwcGVuZChpZHNbaV0pCi0JCQkJCS5hcHBlbmQoJywnKTsKLQkJfQotCQlzdHJCdWYuYXBwZW5kKGlkc1tpZHMubGVuZ3RoLTFdKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlU2VsZWN0ZWRDb25maWdJbnRvUGVyc2lzdGVuY2UoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUKLQkJCQkuc2V0VmFsdWUoCi0JCQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NFTEVDVEVEX0NPTkZJR19JTl9MQVNUX1NFU1NJT04sCi0JCQkJCQljb25maWdOYW1lKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2F2ZWRMYXN0Q29uZmlnKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Y2MwMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjNWVhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgdGhlIE1ldGhvZCBMaWJyYXJ5IFByb2plY3RzIGluIGEgd29ya3NwYWNlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlQcm9qZWN0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiAgICAgICAgICAgIEEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeSBwcm9qZWN0LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHJldHVybiBBIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCi0JCS8vIGZpbmQgdGhlIHByb2plY3QgYnkgcGF0aAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7CQkKLQkJaWYgKHByb2plY3QgIT0gbnVsbCApIHsKLQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCXwgSVByb2plY3QuTkVWRVJfREVMRVRFX1BST0pFQ1RfQ09OVEVOVCwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JCWlmICggcHJvamVjdE5hbWUgPT0gbnVsbCApIHsKLQkJCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJCXByb2plY3ROYW1lID0gbGlicmFyeVBhdGguZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQkvLyBpZiBhIHByb2plY3Qgb2YgdGhlIHNhbWUgbmFtZSBhbHNvIGV4aXN0cywgZGVsZXRlIGl0Ci0JCS8vIHRoaXMgaXMgbmVlZGVkIHRvIHRha2UgY2FyZSBvZiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgotCQkvLyBhIHByb2plY3QgaXMgb3BlbmVkIGJ1dCBub3QgY2xvc2VkIGZvciBzb21lIHJlYXNvbgotCQkvLyBub3cgY3JlYXRlIGEgbmV3IGxpYnJhcnkgd2l0aCB0aGUgc2FtZSBuYW1lIChzYW1lIGxpYnJhcnkgZm9sZGVyKQotCQkvLyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgcHJldmlvdXMgb25lCi0JCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJcHJvamVjdC5kZWxldGUoSVByb2plY3QuRk9SQ0UKLQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJfQotCQkKLQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlCi0JCQkJLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0TmFtZSk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSURTKTsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKCFQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YocHJvamVjdFBhdGgpKSB7Ci0JCQlkZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihwcm9qZWN0UGF0aCk7Ci0JCX0KLQkJcHJvamVjdC5jcmVhdGUoZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLS8vCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0vLwkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0vLwkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLS8vCQl9Ci0vLwkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotLy8JCVN0cmluZyBwcm9qZWN0UGF0aCA9IGxpYnJhcnlQYXRoLmdldEFic29sdXRlUGF0aCgpOwotLy8JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGxpYnJhcnlQYXRoLmdldE5hbWUoKTsKLS8vCQlyZXR1cm4gY3JlYXRlUHJvamVjdChwcm9qZWN0UGF0aCwgcHJvamVjdE5hbWUsIG1vbml0b3IpOwotCQkKLQkJcmV0dXJuIGNyZWF0ZVByb2plY3QocGF0aCwgbnVsbCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIHdvcmtzcGFjZSBwcm9qZWN0IGlzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgQSB3b3Jrc3BhY2UgcHJvamVjdC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB3b3Jrc3BhY2UgcHJvamVjdCBpcyBhIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeSBwcm9qZWN0LCA8Y29kZT5mYWxzZTwvY2xvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gY2xvc2VQcm9qZWN0T25FeGl0ID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJY2xvc2VQcm9qZWN0T25FeGl0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJCQkJaWYgKEFycmF5cy5hc0xpc3QobmF0dXJlSWRzKS5jb250YWlucygKLQkJCQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY2xvc2VQcm9qZWN0T25FeGl0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9qZWN0LmNsb3NlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKG5ldyBGaWxlKHBhdGgpLmNvbXBhcmVUbyhwcm9qZWN0LmdldExvY2F0aW9uKCkudG9GaWxlKCkpID09IDAKLQkJCQkJCSYmIGlzTWV0aG9kTGlicmFyeVByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJcmV0dXJuIHByb2plY3Q7Ci0JCQkJfQotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKSA9PSAwKSB7Ci0JCQkJCXJldHVybiBwcm9qZWN0OwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIGZpbmRQcm9qZWN0KGdldExpYnJhcnlQYXRoKGxpYnJhcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgbG9jYXRlZCwgY3JlYXRlIGEgbmV3IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqIEByZXR1cm4gQSA8Y29kZT5JUHJvamVjdDwvY29kZT4uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IG9wZW5Qcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gb3BlblByb2plY3QocGF0aCwgbnVsbCwgIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIDxwPgotCSAqIElmIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGNhbm5vdCBiZSBsb2NhdGVkLCBjcmVhdGUgYSBuZXcgb25lLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICogQHJldHVybiBBIDxjb2RlPklQcm9qZWN0PC9jb2RlPi4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3Qgb3BlblByb2plY3QoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9qZWN0TmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKHBhdGggKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpOwotCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0JCXRyeSB7Ci0JCQlkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbihwcm9qZWN0UGF0aCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJLy8gLnByb2plY3QgZmlsZSBpcyBtaXNzaW5nLCBjcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkJCS8vIHByb2plY3QuCi0JCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3QuY3JlYXRlUHJvamVjdChwYXRoLCBwcm9qZWN0TmFtZSwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyAucHJvamVjdCBmaWxlIGV4aXN0cywgcmV0cmlldmUgdGhlIHByb2plY3QgZnJvbSB0aGUKLQkJCS8vIHdvcmtzcGFjZS4KLQkJCWlmICggcHJvamVjdE5hbWUgIT0gbnVsbCApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXROYW1lKHByb2plY3ROYW1lKTsKLQkJCX0KLQkJCQotCQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCS8vIFRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuIENyZWF0ZSBhIG5ldwotCQkJCS8vIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgdXNpbmcgdGhlIHByb2plY3QgbmFtZSBmcm9tIHRoZQotCQkJCS8vIC5wcm9qZWN0IGZpbGUuCi0JCQkJcHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0LmNyZWF0ZVByb2plY3QocGF0aCwgcHJvamVjdAotCQkJCQkJLmdldE5hbWUoKSwgbW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSBwcm9qZWN0IGRvZXMgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkJCQkvLyBWZXJpZnkgdGhhdCB0aGUgbG9jYXRpb24gbWF0Y2hlcy4gSWYgbm90LCBjcmVhdGUgYSBuZXcgbWV0aG9kCi0JCQkJLy8gbGlicmFyeSBwcm9qZWN0LgotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKSAhPSAwKSB7Ci0JCQkJCXByb2plY3QgPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5jcmVhdGVQcm9qZWN0KHBhdGgsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJcHJvamVjdC5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwotCQl9Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBwcm9qZWN0IGhhcyB0aGUgTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuCi0JCVN0cmluZ1tdIG5hdHVyZUlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlpZiAoIUFycmF5cy5hc0xpc3QobmF0dXJlSWRzKS5jb250YWlucygKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEUyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUHJvamVjdC5GT1JDRQotCQkJCQl8IElQcm9qZWN0LktFRVBfSElTVE9SWSwgbW9uaXRvcik7Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0JCS8vIGNoZWNrIGlmIHdvcmtzcGFjZSBpcyBtb2RpZmlhYmxlCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCQkJcHJvamVjdC5jbG9zZShtb25pdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2xvc2VQcm9qZWN0KGdldExpYnJhcnlQYXRoKGxpYnJhcnkpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmcm9tIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpcyBzdWNjZXNzZnVsbHkKLQkgKiAgICAgICAgIGRlbGV0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCX0KLQkJCQlwcm9qZWN0LmRlbGV0ZShJUHJvamVjdC5GT1JDRQotCQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmcm9tIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaXMgc3VjY2Vzc2Z1bGx5Ci0JICogICAgICAgICBkZWxldGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gZGVsZXRlUHJvamVjdChnZXRMaWJyYXJ5UGF0aChsaWJyYXJ5KSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogQHJldHVybiBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkuZ2V0UGFyZW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzYzNjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgTWV0aG9kIExpYnJhcnkgUHJvamVjdCBuYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUgaW1wbGVtZW50cyBJUHJvamVjdE5hdHVyZSB7Ci0KLQkvKioKLQkgKiBUaGUgbmF0dXJlIElEIGZvciBhIE1ldGhvZCBMaWJyYXJ5IFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEID0gTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBNZXRob2QgTGlicmFyeSBQcm9qZWN0IG5hdHVyZSBJRHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBOQVRVUkVfSURTID0geyBOQVRVUkVfSUQgfTsKLQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmUjY29uZmlndXJlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNkZWNvbmZpZ3VyZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNnZXRQcm9qZWN0KCkKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNzZXRQcm9qZWN0KElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE4YjRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIG1hbmFnZW1lbnQgb2YgbWV0aG9kIGxpYnJhcnkgcHJvamVjdHMgaW4gYSB3b3Jrc3BhY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0VsZW1lbnRGaWxlLmphdmEudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0VsZW1lbnRGaWxlLmphdmEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYThlYzU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50RmlsZS5qYXZhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyBkZXByaWNhdGVkLiB1c2UgRmlsZU5hbWVHZW5lcmF0b3IgaW5zdGVhZAotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRGaWxlIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZ3VpZDsKLQlwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhDb3VudGVyID0gMDsKLQkKLQlwdWJsaWMgRWxlbWVudEZpbGUoU3RyaW5nIGd1aWQsIFN0cmluZyBmaWxlTmFtZSkgewotCQl0aGlzLmd1aWQgPSBndWlkOwotCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCWluZGV4Q291bnRlciA9IDA7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgZSkJewotCQlFbGVtZW50RmlsZSBlRmlsZSA9IChFbGVtZW50RmlsZSkgZTsKLQkJCi0JCWlmICghKGdldEd1aWQoKS5lcXVhbHMoZUZpbGUuZ2V0R3VpZCgpKSkgCi0JCQkJJiYgZ2V0RmlsZU5hbWUoKS5lcXVhbHMoZUZpbGUuZ2V0RmlsZU5hbWUoKSkpIHsJCQkKLQkJCXJldHVybiBhcHBlbmRJbmRleCgpOwotCQl9Ci0JCWluZGV4Q291bnRlcisrOwotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKS5lcXVhbHMoZUZpbGUuZ2V0RmlsZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmaWxlTmFtZS5oYXNoQ29kZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgZSkgewkJCi0JCWlmIChlIGluc3RhbmNlb2YgRWxlbWVudEZpbGUpCi0JCXsKLQkJCUVsZW1lbnRGaWxlIGFGaWxlID0gKEVsZW1lbnRGaWxlKSBlOwotCQkJcmV0dXJuIGZpbGVOYW1lLmNvbXBhcmVUbyhhRmlsZS5nZXRGaWxlTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZOYW1lKSB7Ci0JCWZpbGVOYW1lID0gZk5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKQl7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkJewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFwcGVuZEluZGV4KCkgewotCQlTdHJpbmdCdWZmZXIgdFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0RmlsZU5hbWUoKSk7Ci0JCWludCBiZWdpbmRJZHggPSBnZXRGaWxlTmFtZSgpLmxhc3RJbmRleE9mKCItIik7Ci0JCWludCBlbmRJZHggPSBnZXRGaWxlTmFtZSgpLmxhc3RJbmRleE9mKCIuaHRtIik7Ci0JCWlmIChiZWdpbmRJZHggPiAtMSAmJiBlbmRJZHggPiAtMSkgewotCQkJaWYgKGluZGV4Q291bnRlciA+IDApIHsKLQkJCQl0U3RyaW5nLnJlcGxhY2UoYmVnaW5kSWR4KzEsIGVuZElkeCwgSW50ZWdlci50b1N0cmluZygrK2luZGV4Q291bnRlcikpOwkKLQkJCQlzZXRGaWxlTmFtZSh0U3RyaW5nLnRvU3RyaW5nKCkpOwotCQkJCS8vaW5kZXhDb3VudGVyID0gMDsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbmRJZHggPiAtMSkgewkJCQotCQkJdFN0cmluZy5pbnNlcnQoZW5kSWR4LCAiLSIgKyBJbnRlZ2VyLnRvU3RyaW5nKCsraW5kZXhDb3VudGVyKSk7Ci0JCQlzZXRGaWxlTmFtZSh0U3RyaW5nLnRvU3RyaW5nKCkpOwotCQkJLy9pbmRleENvdW50ZXIgPSAwOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JmZGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBoZWxwZXIgaXMgdXNpbmcgYW4gaW5zdGFuY2Ugb2YgSUFjdGlvbk1hbmFnZXIgdG8ga2VlcCB0cmFjayBvZiBjaGFuZ2VzLgotICogQ2xpZW4gbXVzdCB7QGxpbmsgI2Rpc3Bvc2UoKSA8ZW0+ZGlzcG9zZTwvZW0+fSB0aGlzIGhlbHBlciBhZnRlciB1c2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyIHsKLQotCUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gbnVsbDsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGFjdGlvbiBtYW5hZ2VyCi0JICogQHJldHVybiBBY3Rpb25NYW5hZ2VyCi0JICovCi0JcHVibGljIEFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWN0aW9uTWdyOwotCQl9Ci0KLQkJYWN0aW9uTWdyID0gbmV3IEFjdGlvbk1hbmFnZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsCi0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCWlmIChjYW5VcGRhdGUob2JqZWN0KSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJfQotCQl9OwotCi0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi0JLyoqCi0JICogZGlzcG9zZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlhY3Rpb25NZ3IuZGlzcG9zZSgpOwotCQkJYWN0aW9uTWdyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHVwZGF0ZSBpcyBhbGxvd2VkCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5VcGRhdGUoRU9iamVjdCBvYmplY3QpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChvYmplY3QsIG51bGwpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZSwgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmplY3QpLCBvYmplY3QKLQkJCS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0NhbGxiYWNrKCkuZGlzcGxheVdhcm5pbmcoTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCksCi0JCQkJCUxpYnJhcnlSZXNvdXJjZXMud2FybmluZ0RsZ190aXRsZQotCQkJCQksIG1zZywgVG5nVXRpbC5nZXRNZXNzYWdlKHN0YXR1cykpOwotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiBzYXZlIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIChhY3Rpb25NZ3IgIT0gbnVsbCkgJiYgYWN0aW9uTWdyLmlzU2F2ZU5lZWRlZCgpOwotCX0KLQotCS8qKgotCSAqIGRvIHNhdmUKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB7Ci0JCWlmIChhY3Rpb25NZ3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsJCQkKLQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIobW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5lcnJvckRsZ19zYXZlRXJyb3IKLQkJCQkJCQksIHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgOiByZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsgCi0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0NhbGxiYWNrKCkuZGlzcGxheUVycm9yKExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JEbGdfdGl0bGUKLQkJCQkJCQksIG1zZywgZSk7Ci0JCQkJfQotCQkJfQotCi0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQlhY3Rpb25NZ3Iuc2F2ZUlzRG9uZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdGgpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIGlmIHJvbGxiYWNrIGZhaWxlZCwgcmVsb2FkIHRoZSBsaWJyYXJ5Ci0JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcihDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLmdldFBlcnNpc3RlcigpOwotCQkJCWlmKHBlcnNpc3RlciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBwZXJzaXN0ZXIuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTmFtZUNhY2hlLmphdmEudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL05hbWVDYWNoZS5qYXZhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmNmEyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTmFtZUNhY2hlLmphdmEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGRlcHJpY2F0ZWQuIHVzZSBGaWxlTmFtZUdlbmVyYXRvciBpbnN0ZWFkCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmFtZUNhY2hlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBOYW1lQ2FjaGUgaW5zdGFuY2UgPSBuZXcgTmFtZUNhY2hlKCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQlwcml2YXRlIFNldDxFbGVtZW50RmlsZT4gYVNldCA9IG5ldyBIYXNoU2V0PEVsZW1lbnRGaWxlPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogQGRlcGxpY2F0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBOYW1lQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIE5hbWVDYWNoZSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWFNYXAuY2xlYXIoKTsKLQkJYVNldC5jbGVhcigpOwotCQlnTWFwLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lUHJlZml4IFN0cmluZyBwcmVmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIG5hbWVTdWZmaXggU3RyaW5nIHN1ZmZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gZXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUsICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBkZXBsaWNhdGVkCi0JICovCSAKLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsKLQkJCi0JCVN0cmluZyBleGlzdGluZ0VsZW1lbnROYW1lID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVQcmVmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lUHJlZml4KTsKLQkJfQotCQkKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpID09ICIiKQotCQkJcmV0dXJuICIwIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCWlmICghZ01hcC5pc0VtcHR5KCkpIHsKLQkJCWV4aXN0aW5nRWxlbWVudE5hbWUgPSAgKFN0cmluZykgZ01hcC5nZXQoZWxlbWVudC5nZXRHdWlkKCkpOwotCQl9Ci0JCS8vIEJyb3dzaW5nOiBCcm93c2luZyBDUCB3aXRoIHNwZWNpYWwgY2hhcnMgZmFpbGVkIHdpdGgKLQkJLy8gYmxhbmsgcGFnZXMgYW5kIFNjcmlwdCBFcnJvciBuZWVkIHRvIG1ha2UgYSB2YWxpZCBmaWxlIG5hbWUKLQkJYnVmZmVyLmFwcGVuZCgoZXhpc3RpbmdFbGVtZW50TmFtZSAhPSBudWxsKSA/IGV4aXN0aW5nRWxlbWVudE5hbWUgOiBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKGVsZW1lbnQuZ2V0TmFtZSgpKSk7Ci0JCWlmIChuYW1lU3VmZml4ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZVN1ZmZpeCk7Ci0JCX0KLQotCQlpZiAoZXh0ICE9IG51bGwpIHsKLQkJCWlmIChleHQuaW5kZXhPZigiLiIpIDwgMCkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWV4dCA9ICIuIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChleHQpOwotCQl9Ci0JCQotCQlpZiAoZXhpc3RpbmdFbGVtZW50TmFtZSA9PSBudWxsKSB7Ci0JCQkKLQkJCUVsZW1lbnRGaWxlIGEgPSBuZXcgRWxlbWVudEZpbGUoZWxlbWVudC5nZXRHdWlkKCksIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQotCQkJaWYgKGEgIT0gbnVsbCAmJiBhU2V0LmFkZChhKSkgewotCQkJCWludCBleHREb3QgPSBhLmdldEZpbGVOYW1lKCkubGFzdEluZGV4T2YoIi4iKTsKLQkJCQlhTWFwLnB1dCgoZXh0RG90IDwgMCkgPyBhLmdldEZpbGVOYW1lKCkgOiBhLmdldEZpbGVOYW1lKCkuc3Vic3RyaW5nKDAsIGV4dERvdCksIGVsZW1lbnQuZ2V0R3VpZCgpKTsJCQkgCi0JCQkJZ01hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIChleHREb3QgPCAwKSA/IGEuZ2V0RmlsZU5hbWUoKSA6IGEuZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoMCwgZXh0RG90KSk7Ci0JCQl9Ci0JCQotCQkJcmV0dXJuIGEuZ2V0RmlsZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBndWlkKSB7Ci0JCi0JCWlmIChndWlkICE9IG51bGwgJiYgIWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZ01hcC5nZXQoZ3VpZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7IAotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZCBmcm9tIHRoZSBmaWxlIG5hbWUsIGFzc3VtaW5nIHRoZSBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkIGZyb20gYW4gZWxlbWVudCwgCi0JICogcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLgotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZEZyb21GaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgKGZpbGVOYW1lLmluZGV4T2YoInJlc291cmNlcy8iKSA+IC0xICYmIGZpbGVOYW1lLmluZGV4T2YoIi5odG0iKSA8IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCQkKLQkJU3RyaW5nIGd1aWQgPSBudWxsOwotCQkKLQkJaW50IGlkeCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIvIik7Ci0JCWludCBsYXN0SWR4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQotCQlpZiAoaWR4ID4gLTEpIHsKLQkJCWd1aWQgPSAoU3RyaW5nKSBhTWFwLmdldCgobGFzdElkeCA+IC0xICYmIGlkeCA8IGxhc3RJZHgpID8gCi0JCQkJCWZpbGVOYW1lLnN1YnN0cmluZyhpZHgrMSwgbGFzdElkeCkgOiAoaWR4IDwgZmlsZU5hbWUubGVuZ3RoKCkpID8gCi0JCQkJCQkJZmlsZU5hbWUuc3Vic3RyaW5nKGlkeCsxKSA6IG51bGwpOwotCQl9IGVsc2UgewotCQkJZ3VpZCA9IChTdHJpbmcpIGFNYXAuZ2V0KChsYXN0SWR4ID4gLTEpID8gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJZHgpIDogZmlsZU5hbWUpOwotCQl9Ci0JCWlmIChndWlkID09IG51bGwpCXJldHVybiBudWxsOwkJCi0JCi0JCS8vIHR1cm4gb2ZmIGVycm9yIHJlcG9ydGluZyBhbmQgc2VlIGlmIGd1aWQgZXhpc3RzIGluIGxpYnJhcnkKLQkJYm9vbGVhbiBvbGRSZXBvcnRfRXJyb3IgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SID0gZmFsc2U7Ci0vKgkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKQotCQkJCS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOyovCi0JCS8vcGFydCBvZiB0ZW1wIHNvbHV0aW9uIGR1ZSB0byBub3QgaGF2aW5nIGxpYiBtZ3IgZHVyaW5nIG1pZ3JhdGlvbgotCQlNZXRob2RFbGVtZW50IGUgPSBMaW5rSW5mby5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SID0gb2xkUmVwb3J0X0Vycm9yOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIHZpZXcgQm9va21hcmsKLQkgKiBAcGFyYW0gbmFtZVByZWZpeCBTdHJpbmcgcHJlZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBuYW1lU3VmZml4IFN0cmluZyBzdWZmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIGV4dCBTdHJpbmcgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlLCAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgbmVlZGVkIAotCSAqLwkgCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoQm9va21hcmsgdmlldywgU3RyaW5nIG5hbWVQcmVmaXgsCi0JCQlTdHJpbmcgbmFtZVN1ZmZpeCwgU3RyaW5nIGV4dCkgewotCQkKLQkJU3RyaW5nIGV4aXN0aW5nRWxlbWVudE5hbWUgPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobmFtZVByZWZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVQcmVmaXgpOwotCQl9Ci0JCQotCQlpZiAodmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gIiIpCi0JCQlyZXR1cm4gIjAiICsgZXh0OyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoIWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlleGlzdGluZ0VsZW1lbnROYW1lID0gIChTdHJpbmcpIGdNYXAuZ2V0KHZpZXcuZ2V0VW5pcXVlSWQoKSk7Ci0JCX0KLQkJLy8gQnJvd3Npbmc6IEJyb3dzaW5nIENQIHdpdGggc3BlY2lhbCBjaGFycyBmYWlsZWQgd2l0aAotCQkvLyBibGFuayBwYWdlcyBhbmQgU2NyaXB0IEVycm9yIG5lZWQgdG8gbWFrZSBhIHZhbGlkIGZpbGUgbmFtZQotCQlidWZmZXIuYXBwZW5kKChleGlzdGluZ0VsZW1lbnROYW1lICE9IG51bGwpID8gZXhpc3RpbmdFbGVtZW50TmFtZSA6IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnModmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkpKTsKLQkJaWYgKG5hbWVTdWZmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lU3VmZml4KTsKLQkJfQotCi0JCWlmIChleHQgIT0gbnVsbCkgewotCQkJaWYgKGV4dC5pbmRleE9mKCIuIikgPCAwKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZXh0ID0gIi4iICsgZXh0OyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKGV4dCk7Ci0JCX0KLQotCQlFbGVtZW50RmlsZSBhID0gbmV3IEVsZW1lbnRGaWxlKHZpZXcuZ2V0VW5pcXVlSWQoKSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkKLQkJaWYgKGEgIT0gbnVsbCAmJiBhU2V0LmFkZChhKSkgewotCQkJaW50IGV4dERvdCA9IGEuZ2V0RmlsZU5hbWUoKS5sYXN0SW5kZXhPZigiLiIpOwotCQkJYU1hcC5wdXQoKGV4dERvdCA8IDApID8gYS5nZXRGaWxlTmFtZSgpIDogYS5nZXRGaWxlTmFtZSgpLnN1YnN0cmluZygwLCBleHREb3QpLCB2aWV3LmdldFVuaXF1ZUlkKCkpOwkJCSAKLQkJCWdNYXAucHV0KHZpZXcuZ2V0VW5pcXVlSWQoKSwgKGV4dERvdCA8IDApID8gYS5nZXRGaWxlTmFtZSgpIDogYS5nZXRGaWxlTmFtZSgpLnN1YnN0cmluZygwLCBleHREb3QpKTsKLQkJfQotCi0JCXJldHVybiBhLmdldEZpbGVOYW1lKCk7IAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9TYWZlVXBkYXRlQ29udHJvbGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL1NhZmVVcGRhdGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTUwNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL1NhZmVVcGRhdGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBhIHV0aWxpdHkgY2xhc3MgdG8gYWxsb3cgVUkgdXBkYXRlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYWZlVXBkYXRlQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBzeW5jIGV4ZWN1dGUgdGhlIHJ1bm5hYmxlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLQkgKiBAcGFyYW0gcnVubmFibGUgUnVubmFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQkJdHJ5IHsKLQkJCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIFVJCi0JCQkvLyB0aHJlYWQKLQkJCS8vIG90aGVyd2lzZSwgd2lsbCBjYXVzZSBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCWlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkJCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkJcnVubmFibGUucnVuKCk7Ci0JCQl9IGVsc2UgewotCQkJCWRpc3BsYXkuc3luY0V4ZWMocnVubmFibGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFzeW5jIGV4ZWN1dGUgdGhlIHJ1bm5hYmxlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLQkgKiBAcGFyYW0gcnVubmFibGUgUnVubmFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkJLy8gdGhyZWFkCi0JCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5NGI2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db250ZW50UmVzb3VyY2VTY2FubmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db250ZW50UmVzb3VyY2VTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjI5MTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udGVudFJlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBzY2FuIGNvbnRlbnQgYW5kIGNvcHkgcmVzb3VyY2VzIHRvIHRoZSB0YXJnZXQgbG9jYXRpb24gZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFJlc291cmNlU2Nhbm5lciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9pbWFnZV9yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8KGltZ3xpZnJhbWUpLio/c3JjXFxzKj1cXHMqXCIpKC4qPykoXCIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEZpbGUgc291cmNlUm9vdFBhdGg7Ci0KLQlwcml2YXRlIEZpbGUgdGFyZ2V0Um9vdFBhdGg7Ci0KLQlwcml2YXRlIFN0cmluZyByb290Q29udGVudFBhdGg7Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlwcml2YXRlIExpc3QgcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIG9iamVjdCB3aXRoIHRoZSByb290IHBhdGggb2YgdGhlIHNvdXJjZSBjb250ZW50Ci0JICogQHBhcmFtIHNvdXJjZVJvb3RQYXRoIEZpbGUKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlc291cmNlU2Nhbm5lcihGaWxlIHNvdXJjZVJvb3RQYXRoLCBGaWxlIHRhcmdldFJvb3RQYXRoLCBTdHJpbmcgcm9vdENvbnRlbnRQYXRoKSB7Ci0JCXRoaXMoc291cmNlUm9vdFBhdGgsIHRhcmdldFJvb3RQYXRoLCByb290Q29udGVudFBhdGgsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdCB0aGUgb2JqZWN0IGluc3RhbmNlIHdpdGggdGhlIHJvb3QgcGF0aCBvZiB0aGUgc291cmNlIGNvbnRlbnQgYW5kIGEgY29udGVudCB2YWxpZGF0b3IKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlUm9vdFBhdGggRmlsZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlc291cmNlU2Nhbm5lcihGaWxlIHNvdXJjZVJvb3RQYXRoLCBGaWxlIHRhcmdldFJvb3RQYXRoLCBTdHJpbmcgcm9vdENvbnRlbnRQYXRoLCAKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnNvdXJjZVJvb3RQYXRoID0gc291cmNlUm9vdFBhdGg7Ci0JCXRoaXMudGFyZ2V0Um9vdFBhdGggPSB0YXJnZXRSb290UGF0aDsKLQkJdGhpcy5yb290Q29udGVudFBhdGggPSByb290Q29udGVudFBhdGg7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIHNldCBjb250ZW50IHZhbGlkYXRvcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgc291cmNlIHJvb3QgcGF0aAotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldFNvdXJjZVJvb3RQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2VSb290UGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSB0YXJnZXQgcm9vdCBwYXRoCi0JICogQHJldHVybiBGaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VGFyZ2V0Um9vdFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldFJvb3RQYXRoOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgdGhlIHRhcmdldCByb290IHBhdGgKLQkgKiBAcGFyYW0gdGFyZ2V0Um9vdFBhdGggRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldFJvb3RQYXRoKEZpbGUgdGFyZ2V0Um9vdFBhdGgpIHsKLQkJdGhpcy50YXJnZXRSb290UGF0aCA9IHRhcmdldFJvb3RQYXRoOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGltYWdlcyBpbiB0aGUgdGV4dC4gY29weSB0aGUgaW1hZ2UgdG8gZGVzdGluYXRpb24gaWYgbmVlZGVkCi0JICogVGhpcyBpcyB1c2VkIGZvciBjb3B5aW5nIHJlc291cmNlcyBmcm9tIGEgbGlicmFyeSB0byBhbm90aGVyIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmVSZXNvdXJjZXMoU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjb250ZW50UGF0aCkgewotCQlyZXNvbHZlUmVzb3VyY2VzKG51bGwsIGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBpbWFnZXMgaW4gdGhlIHRleHQuIGNvcHkgdGhlIGltYWdlIHRvIGRlc3RpbmF0aW9uIGlmIG5lZWRlZAotCSAqIFRoaXMgaXMgdXNlZCBmb3IgY29weWluZyByZXNvdXJjZXMgZnJvbSBhIGxpYnJhcnkgdG8gYW5vdGhlciBkZXN0aW5hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGNvbnRlbnQgU3RyaW5nCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoIFN0cmluZwotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlc291cmNlcyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgY29udGVudCwKLQkJCVN0cmluZyBjb250ZW50UGF0aCkgewotCQlwcm9jZXNzZWRJdGVtcy5jbGVhcigpOwotCQlSZXNvdXJjZUhlbHBlci5yZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBudWxsLCBjb250ZW50LCBjb250ZW50UGF0aCwKLQkJCQl0aGlzLnNvdXJjZVJvb3RQYXRoLCB0aGlzLnRhcmdldFJvb3RQYXRoLCB0aGlzLnJvb3RDb250ZW50UGF0aCwgcHJvY2Vzc2VkSXRlbXMsCi0JCQkJdmFsaWRhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBpbWFnZXMgaW4gdGhlIHRleHQuIGNvcHkgdGhlIGltYWdlIHRvIGRlc3RpbmF0aW9uIGlmIG5lZWRlZAotCSAqIFRoaXMgaXMgdXNlZCBmb3IgbW92aW5nIHJlc291cmNlcyB3aXRoaW4gYSBsaWJyYXJ5IGllLCB3aGVuCi0JICogc291cmNlUm9vdFBhdGguZXF1YWxzKHRhcmdldFJvb3RQYXRoKQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlUmVzb3VyY2VzUGx1Z2luKFN0cmluZyBjb250ZW50LCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlTdHJpbmcgb2xkQ29udGVudFBhdGgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4odXJsLCBjb250ZW50UGF0aCwgb2xkQ29udGVudFBhdGgpOwotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpKTsKLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCWNvbnRlbnQgPSBzYi50b1N0cmluZygpOwotCQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJCS8vIHByb2Nlc3MgYXR0YWNobWVudHMKLQkJCW0gPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfcmVmX2dlbi5tYXRjaGVyKGNvbnRlbnQpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHNiTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkvLyBTdHJpbmcgdGFnID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgdXJsdGV4dCA9ICIgIiArIG0uZ3JvdXAoMikgKyAiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChSZXNvdXJjZUhlbHBlci5nZXRHdWlkRnJvbVVybCh1cmx0ZXh0KSA9PSBudWxsKSB7Ci0JCQkJCU1hdGNoZXIgbTIgPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfaHJlZl9waWNrZXIKLQkJCQkJCQkubWF0Y2hlcih1cmx0ZXh0KTsKLQkJCQkJaWYgKG0yLmZpbmQoKSkgewotCQkJCQkJU3RyaW5nIHVybCA9IG0yLmdyb3VwKDEpLnRyaW0oKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4odXJsLCBjb250ZW50UGF0aCwKLQkJCQkJCQkJb2xkQ29udGVudFBhdGgpOwotCQkJCQkJbTIuYXBwZW5kUmVwbGFjZW1lbnQoc2JMaW5rLCB1cmx0ZXh0LnN1YnN0cmluZyhtMgotCQkJCQkJCQkuc3RhcnQoKSwgbTIuc3RhcnQoMSkpCi0JCQkJCQkJCSsgdXJsICsgdXJsdGV4dC5zdWJzdHJpbmcobTIuZW5kKDEpLCBtMi5lbmQoKSkpOwotCQkJCQkJbTIuYXBwZW5kVGFpbChzYkxpbmspOwotCQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgY29udGVudC5zdWJzdHJpbmcobS5zdGFydCgpLCBtCi0JCQkJCQkJCS5zdGFydCgyKSkKLQkJCQkJCQkJKyBzYkxpbmsudG9TdHJpbmcoKQotCQkJCQkJCQkrIGNvbnRlbnQuc3Vic3RyaW5nKG0uZW5kKDIpLCBtLmVuZCgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGEgcmVzb3VyY2UgdXJsIGZvciBtb3Zpbmcgd2l0aGluIGEgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIG5ldyBwbHVnaW4gcGF0aAotCSAqIEBwYXJhbSBvbGRDb250ZW50UGF0aAotCSAqICAgICAgICAgICAgb2xkIHBsdWdpbiBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4oU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJU3RyaW5nIG9sZENvbnRlbnRQYXRoKSB7Ci0JCVN0cmluZyBpbWFnZUZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXRGaWxlUGF0aEZyb21VcmwodXJsLAotCQkJCW9sZENvbnRlbnRQYXRoKTsKLQkJaWYgKGltYWdlRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCVN0cmluZyBuZXdVcmwgPSBudWxsOwotCQlGaWxlIHNvdXJjZTsKLQkJRmlsZSBkZXN0OwotCQkvLyB0YXJnZXRSb290UGF0aCBpcyBzZXQgdG8gdGhlIHRhcmdldCBwbHVnaW4gZGlyZWN0b3J5Ci0JCXNvdXJjZSA9IG5ldyBGaWxlKHRoaXMuc291cmNlUm9vdFBhdGguZ2V0UGFyZW50RmlsZSgpLCBpbWFnZUZpbGUpOwotCQlpZiAoaW1hZ2VGaWxlLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpICE9IC0xKSB7Ci0JCQlTdHJpbmcgb2xkUGx1Z2luID0gaW1hZ2VGaWxlLnN1YnN0cmluZygwLCBpbWFnZUZpbGUKLQkJCQkJLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQkJCVN0cmluZyBuZXdQbHVnaW4gPSB0aGlzLnRhcmdldFJvb3RQYXRoLmdldE5hbWUoKTsKLQkJCW5ld1VybCA9IHVybC5yZXBsYWNlRmlyc3Qob2xkUGx1Z2luLCBuZXdQbHVnaW4pOwotCQkJaW1hZ2VGaWxlID0gaW1hZ2VGaWxlLnN1YnN0cmluZyhpbWFnZUZpbGUuaW5kZXhPZihGaWxlLnNlcGFyYXRvcikpOwotCQl9Ci0JCWRlc3QgPSBuZXcgRmlsZSh0aGlzLnRhcmdldFJvb3RQYXRoLCBpbWFnZUZpbGUpOwotCi0JCUZpbGVVdGlsLmNvcHlGaWxlKHNvdXJjZSwgZGVzdCk7Ci0KLQkJcmV0dXJuIG5ld1VybDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBjb3B5IGFsbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgdGhlIGVsZW1lbnQgYW5kIGFsbCBpdHMgY29udGFpbmVkIGVsZW1lbnRzLCByZWN1cnNpdmVseQotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2VzKEVPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpZWxlbWVudDsKLQkJCVN0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGRlKTsKLQkJCQotCQkJLy8xLiBpY29ucwotCQkJamF2YS5uZXQuVVJJIGljb24gPSBkZS5nZXRTaGFwZWljb24oKTsKLQkJCWlmICggaWNvbiAhPSBudWxsICkgewotCQkJCVN0cmluZyBwYXRoID0gaWNvbi5nZXRQYXRoKCk7Ci0JCQkJRmlsZVV0aWwuY29weUZpbGUoCi0JCQkJCQluZXcgRmlsZShnZXRTb3VyY2VSb290UGF0aCgpLCBwYXRoKSwgCi0JCQkJCQluZXcgRmlsZShnZXRUYXJnZXRSb290UGF0aCgpLCBwYXRoKSk7Ci0JCQl9Ci0JCQkKLQkJCWljb24gPSBkZS5nZXROb2RlaWNvbigpOwotCQkJaWYgKCBpY29uICE9IG51bGwgKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBpY29uLmdldFBhdGgoKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZSgKLQkJCQkJCW5ldyBGaWxlKGdldFNvdXJjZVJvb3RQYXRoKCksIHBhdGgpLCAKLQkJCQkJCW5ldyBGaWxlKGdldFRhcmdldFJvb3RQYXRoKCksIHBhdGgpKTsKLQkJCX0KLQkJCQotCQkJLy8gMi4gYXR0YWNobWVudHMKLQkJCi0JCQkKLQkJCS8vIDMuIGNvbnRlbnRzCi0JCQlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IGRlLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKCBkZXNjLmVDb250YWluZXIoKSAhPSBudWxsICkgewotCQkJCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZGVzYyk7Ci0vLwkJCQlMaXN0IHByb3BlcnRpZXMgPSBkZXNjLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkJCQkJCQkKLQkJCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCQkuZ2V0KGkpOwotCQkJCQlpZiAoICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCU9iamVjdCB2YWx1ZSA9IGRlc2MuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKCB2YWx1ZSA9PSBudWxsICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCQotCQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSApIHsKLQkJCQkJCUxpc3Qgc2VjdGlvbnMgPSAoTGlzdCl2YWx1ZTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzZWN0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJCVN0cmluZyB0ZXh0ID0gKChTZWN0aW9uKWl0Lm5leHQoKSkuZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJcmVzb2x2ZVJlc291cmNlcyhkZSwgdGV4dCwgZWxlbWVudFBhdGgpOwotCQkJCQkJfQotCQkJCQl9ICBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSApIHsKLQkJCQkJCVN0cmluZyB1cmxzID0gdmFsdWUudG9TdHJpbmcoKS50cmltKCk7Ci0JCQkJCQlpZiAodXJscy5sZW5ndGgoKSAhPSAwICkgewotCQkJCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodXJscywgInwiKTsgLy8gdGhpcyBpcyBoYXJkY29kZWQgc29tZWhvdyAvLyROT04tTkxTLTEkCi0JCQkJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSApIHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQkJCQlGaWxlVXRpbC5jb3B5RmlsZSgKLQkJCQkJCQkJCQluZXcgRmlsZShnZXRTb3VyY2VSb290UGF0aCgpLCBlbGVtZW50UGF0aCArIHVybCksIAotCQkJCQkJCQkJCW5ldyBGaWxlKGdldFRhcmdldFJvb3RQYXRoKCksIGVsZW1lbnRQYXRoICsgdXJsKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotCQkJCQkJcmVzb2x2ZVJlc291cmNlcyhkZSwgdmFsdWUudG9TdHJpbmcoKSwgZWxlbWVudFBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEFjdGl2aXR5VHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEFjdGl2aXR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTAyNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnZlcnRBY3Rpdml0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIGNsYXNzIHRvIGNvbnZlcnQgYWN0aXZpdHkgdHlwZXMKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRBY3Rpdml0eVR5cGUgewotCi0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBvbGRBY3Rpdml0eSA9IG51bGw7Ci0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IG51bGw7Ci0vLwkKLS8vCS8vIG9yaWdpbmFsIGFjdGl2aXR5J3MgY29udGFpbmVyCi0vLwlwcml2YXRlIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBvbGRBY3Rpdml0eUNvbnRhaW5lciA9IG51bGw7Ci0vLwkKLS8vCS8vIHRoZSBvcmlnaW5hbCBhY3Rpdml0eSdzIGJyZWFrZG93biBsaXN0Ci0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IG9sZEFjdGl2aXR5QnJlYWtkb3duID0gbnVsbDsKLS8vCQotLy8JLy8gaW5kZXggb2YgdGhlIG9yaWdpbmFsIGFjdGl2aXR5IGluIGl0J3Mgc3VwZXJBY3Rpdml0eSdzIGJyZWFrZG93biBsaXN0Ci0vLwlwcml2YXRlIHN0YXRpYyBpbnQgb2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCA9IC0xOwotLy8JCi0vLwkvLyBvcmlnaW5hbCBBY3Rpdml0eSdzIHBhcmVudCBhY3Rpdml0eQotLy8JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgc3VwZXJBY3QgPSBudWxsOwotLy8JCi0vLwkvLyBwYXJlbnQgYWN0aXZpdHkncyBicmVha2Rvd24gbGlzdAotLy8JcHJpdmF0ZSBzdGF0aWMgRUxpc3Qgc3VwZXJBY3RicmVha2Rvd25MaXN0ID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyB2YXJpYWJpbGl0eVR5cGUKLS8vCXByaXZhdGUgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBvbGRBY3RWYXJUeXBlID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyB2YXJpYWJpbGl0eUVsZW1lbnQKLS8vCXByaXZhdGUgc3RhdGljIFZhcmlhYmlsaXR5RWxlbWVudCBvbGRBY3RWYXJFbGVtZW50ID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyBpbW1lZGl0YXRlVmFyaWV0aWVzCi0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IG9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBpbnRbXSBjb21wYXRpYmxlQWN0aXZpdGllcyA9IHsgVW1hUGFja2FnZS5BQ1RJVklUWSwKLQkJCVVtYVBhY2thZ2UuSVRFUkFUSU9OLAotCQkJVW1hUGFja2FnZS5QSEFTRSwKLQkJCVVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOLAotCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTLAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY29tcGF0aWJsZUFjdGl2aXRpZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUFjdGl2aXRpZXMubGVuZ3RoOyBpKyspCi0JCQljb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuYWRkKG5ldyBJbnRlZ2VyKGNvbXBhdGlibGVBY3Rpdml0aWVzW2ldKSk7Ci0JfQotCi0JLy8gVGhpcyBtZXRob2QgaXMgYnVnZ3kgYW5kIGlzIHJlcGxhY2VkIHdpdGggVHlwZUNvbnZlcnRlci5jb252ZXJ0QWN0aXZpdHkoKQotCS8vCi0vLwlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGNvbnZlcnRBY3Rpdml0eShBY3Rpdml0eSBvbGRBY3Rpdml0eSwgaW50IG5ld1R5cGUsCi0vLwkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLS8vCi0vLwkJCi0vLwkJQ29udmVydEFjdGl2aXR5VHlwZS5vbGRBY3Rpdml0eSA9IG9sZEFjdGl2aXR5OwotLy8JCQotLy8JCS8vIGFjdGl2aXR5IGlzIGFscmVhZHkgdGhpcyB0eXBlCi0vLwkJaWYgKG5ld1R5cGUgPT0gb2xkQWN0aXZpdHkuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCQotLy8JCS8vIG5ld1R5cGUgaXMgbm90IHZhbGlkCi0vLwkJaWYgKCFjb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuY29udGFpbnMobmV3IEludGVnZXIobmV3VHlwZSkpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQkKLS8vCQlBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IGRvQ29udmVydChuZXdUeXBlLCBjb21tYW5kKTsKLS8vCi0vLwkJcmV0dXJuIG5ld0FjdGl2aXR5OwotLy8JfQotLy8KLS8vCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGRvQ29udmVydChpbnQgbmV3VHlwZSwgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCkgewotLy8JCQotLy8JCXRyeSB7Ci0vLwkJCUZpbGUgb2xkQWN0aXZpdHlQYXRoRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLS8vCQkJCQkuZ2V0RWxlbWVudFBhdGgob2xkQWN0aXZpdHkpKTsKLS8vCi0vLwkJCS8vIGNyZWF0ZSBuZXcgYWN0aXZpdHkKLS8vCQkJbmV3QWN0aXZpdHkgPSBjcmVhdGVOZXdBY3Rpdml0eShuZXdUeXBlKTsKLS8vCi0vLwkJCS8vIFRPRE86IHN0b3JlIG9sZEFjdGl2aXR5J3MgZmVhdHVyZXMgaGVyZSwgYW5kIGRvbid0IHNldCB0aGVtIHVudGlsCi0vLwkJCS8vIGFmdGVyIG9sZGFjdGl2aXR5IGlzIGRlbGV0ZWQKLS8vCQkJCi0vLwkJCS8vIHN0b3JlIG9sZEFjdGl2aXR5J3MgYnJlYWtkb3duIGxpc3QKLS8vCQkJb2xkQWN0aXZpdHlCcmVha2Rvd24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCW9sZEFjdGl2aXR5QnJlYWtkb3duLmFkZChpdGVyLm5leHQoKSk7Ci0vLwkJCX0KLS8vCQkJb2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCA9IGdldEluZGV4SW5CcmVha2Rvd24ob2xkQWN0aXZpdHkpOwotLy8JCQkKLS8vCQkJLy8gY29weSBhbGwgZGF0YSBmcm9tIG9sZEFjdGl2aXR5IHRvIG5ld0FjdGl2aXR5Ci0vLwkJCUl0ZXJhdG9yIGl0ZXIgPSBvbGRBY3Rpdml0eS5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkKLS8vCQkJCQkuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotLy8JCQkJT2JqZWN0IG8gPSBvbGRBY3Rpdml0eS5lR2V0KGZlYXR1cmUpOwotLy8JCQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04KLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlECi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUyAKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUwotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUwotLy8JCQkJCQkpIHsKLS8vCQkJCQluZXdBY3Rpdml0eS5lU2V0KGZlYXR1cmUsIG8pOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQkvLyBzdG9yZSBHdWlkIGhlcmUKLS8vCQkJU3RyaW5nIG9sZEFjdGl2aXR5R3VpZCA9IG9sZEFjdGl2aXR5LmdldEd1aWQoKTsKLS8vCi0vLwkJCS8vIHN0b3JlIG9sZCBhY3Rpdml0eSdzIGVDb250YWluZXIKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIgPSAoUHJvY2Vzc1BhY2thZ2UpIG9sZEFjdGl2aXR5Ci0vLwkJCQkJLmVDb250YWluZXIoKTsKLS8vCi0vLwkJCS8vIHNldCBjb250YWluZXIKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlKG9sZEFjdGl2aXR5KTsKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG5ld0FjdGl2aXR5KTsKLS8vCi0vLwkJCS8vIGNyZWF0ZSBwcmVzZW50YXRpb24KLS8vCQkJQ29udGVudERlc2NyaXB0aW9uIG5ld0NvbnRlbnREZXNjID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotLy8JCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24obmV3QWN0aXZpdHkpOwotLy8JCQluZXdBY3Rpdml0eS5zZXRQcmVzZW50YXRpb24obmV3Q29udGVudERlc2MpOwotLy8KLS8vCQkJRmlsZSBuZXdBY3Rpdml0eVBhdGhGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSwgTWV0aG9kTGlicmFyeVBlcnNpc3RlcgotLy8JCQkJCS5nZXRFbGVtZW50UGF0aChuZXdBY3Rpdml0eSkpOwotLy8JCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcigKLS8vCQkJCQlvbGRBY3Rpdml0eVBhdGhGaWxlKTsKLS8vCQkJc2Nhbm5lci5zZXRUYXJnZXRSb290UGF0aChuZXdBY3Rpdml0eVBhdGhGaWxlKTsKLS8vCi0vLwkJCS8vIGNvcHkgYWxsIHByZXNlbnRhdGlvbiBkYXRhIGZyb20gb2xkQWN0aXZpdHkgdG8gbmV3QWN0aXZpdHkKLS8vCQkJQ29udGVudERlc2NyaXB0aW9uIG9sZENvbnRlbnREZXNjID0gb2xkQWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0vLwkJCWl0ZXIgPSBvbGRDb250ZW50RGVzYy5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0vLwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotLy8JCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0vLwkJCQlpZiAoYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVAotLy8JCQkJCQkpIHsKLS8vCQkJCQlPYmplY3QgbyA9IG9sZENvbnRlbnREZXNjLmVHZXQoYXR0cmliKTsKLS8vCQkJCQlpZiAobyBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZykgbykudHJpbSgpLmxlbmd0aCgpID4gMCkgewotLy8JCQkJCQkvLyBwcm9jZXNzIGxpbmtzCi0vLwkJCQkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhuZXdBY3Rpdml0eSwgKFN0cmluZykgbywgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCS8vIHNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhuZXdBY3Rpdml0eSwgKFN0cmluZykgbywKLS8vCQkJCQkJLy8gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aChuZXdBY3Rpdml0eSkpOwotLy8JCQkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQkJfQotLy8JCQkJCW5ld0NvbnRlbnREZXNjLmVTZXQoYXR0cmliLCBvKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkKLS8vCQkJLy8gbWFrZSBicmVha2Rvd24gbGlua3MKLS8vCQkJTGlzdCBvbGRBY3RCcmVha2Rvd25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlvbGRBY3RCcmVha2Rvd25MaXN0LmFkZEFsbChvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLS8vCQkJZm9yIChpdGVyID0gb2xkQWN0QnJlYWtkb3duTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KWl0ZXIubmV4dCgpOwotLy8JCQkJYmUuc2V0U3VwZXJBY3Rpdml0aWVzKG51bGwpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0vLwkJCW5ld0FjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG9sZEFjdGl2aXR5QnJlYWtkb3duKTsKLS8vCQkJLy8gbW92ZSBuZXcgYWN0aXZpdHkgdG8gcHJvcGVyIGluZGV4IGluIHRoZSBwYXJlbnQgYWN0J3MgYnJlYWtkb3duIGxpc3QKLS8vCQkJc3VwZXJBY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KG9sZEFjdGl2aXR5KTsKLS8vCQkJc3VwZXJBY3RicmVha2Rvd25MaXN0ID0gKEVMaXN0KXN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5hZGQob2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCwgbmV3QWN0aXZpdHkpOwotLy8JCQkKLS8vCQkJLy8gaGFuZGxlIHZhcmlhYmlsaXR5Ci0vLwkJCW9sZEFjdFZhckVsZW1lbnQgPSBvbGRBY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwkJCW9sZEFjdFZhclR5cGUgPSBvbGRBY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLS8vCQkJb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKG9sZEFjdGl2aXR5KSk7Ci0vLwkJCQotLy8JCQlpZiAob2xkQWN0VmFyRWxlbWVudCAhPSBudWxsICYmIG9sZEFjdFZhclR5cGUgIT0gbnVsbCkgewotLy8JCQkJbmV3QWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChvbGRBY3RWYXJFbGVtZW50KTsKLS8vCQkJCW5ld0FjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZShvbGRBY3RWYXJUeXBlKTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJZm9yIChpdGVyID0gb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQl2ZS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG5ld0FjdGl2aXR5KTsKLS8vCQkJfQotLy8KLS8vCQkJLy8gY3JlYXRlIHRlbXAgUHJvY2Vzc1BhY2thZ2UgYW5kIG1vdmUgb2xkQWN0aXZpdHkgdG8gaXQKLS8vCQkJUHJvY2Vzc1BhY2thZ2UgdGVtcFBhcmVudCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0vLwkJCXRlbXBQYXJlbnQuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG9sZEFjdGl2aXR5KTsKLS8vCQkJdGVtcFBhcmVudC5zZXROYW1lKCJ0ZW1wIFBQIGZvciBkZWxldGlvbiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkvLyBkZWxldGUgb2xkIEFjdGl2aXR5IGhlcmUgLSBpZiBmYWlscywgcm9sbCBiYWNrIGJ5IGRlbGV0aW5nIG5ldyBBY3Rpdml0eQotLy8JCQljb21tYW5kLmV4ZWN1dGUoKTsKLS8vCi0vLwkJCWlmICghY29tbWFuZC5leGVjdXRlZCB8fCBjb21tYW5kLmZhaWxlZCkgewotLy8JCQkJLy8gZGVsZXRlIGZhaWxlZCwgb3IgdXNlciBzZWxlY3RlZCBjYW5jZWwgb24gdGhlICJkZWxldGUKLS8vCQkJCS8vIHJlZmVyZW5jZXMiIGRpYWxvZwotLy8JCQkJLy8gY2xlYW4gdXAgbmV3IEFjdGl2aXR5Ci0vLwotLy8JCQkJdW5kbygpOwotLy8KLS8vCQkJCW5ld0FjdGl2aXR5ID0gbnVsbDsKLS8vCQkJCW5ld0NvbnRlbnREZXNjID0gbnVsbDsKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwotLy8JCQkvLyBzZXQgbmV3IGFjdGl2aXR5J3MgR1VJRAotLy8JCQluZXdBY3Rpdml0eS5zZXRHdWlkKG9sZEFjdGl2aXR5R3VpZCk7Ci0vLwkJCQotLy8JCQkvLyBUT0RPOiB1cGRhdGUgZWRpdG9yIGNvbnRlbnRzIAotLy8KLS8vCQkJLy8gVE9ETzogb24gcm9sbGJhY2ssIGxpYnJhcnkgbWF5IGJlIGRpcnR5IGJlY2F1c2Ugb2YgdGhlCi0vLwkJCS8vIGNvbnRhaW5lci9jb250ZW50ZGVzYyBjaGFuZ2VzIHdlJ3ZlIGRvbmUKLS8vCQkJLy8gZml4IHRoaXMgYnkgc3RvcmluZyBhbGwgdGhlIG9sZCBhY3Rpdml0eSdzIGluZm8sIHRoZW4gb25seSBjcmVhdGUKLS8vCQkJLy8gbmV3IGFjdGl2aXR5IGFmdGVyIG9sZCBvbmUgaGFzCi0vLwkJCS8vIGJlZW4gZGVsZXRlZC4KLS8vCi0vLwkJCVNldCBtb2RpZmllZFJlc291cmNlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLS8vCQkJCi0vLwkJCS8vIHNhdmUgbmV3IGFjdGl2aXR5IGFuZCBpdHMgcHJlc2VudGF0aW9uCi0vLwkJCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0vLwkJCQkJLmdldE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotLy8JCQl0cnkgewotLy8JCQkJaWYgKG5ld0FjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQobmV3QWN0aXZpdHkuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKG5ld0FjdGl2aXR5LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQobmV3QWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKG9sZEFjdGl2aXR5Q29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQob2xkQWN0aXZpdHlDb250YWluZXIuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKHN1cGVyQWN0LmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQoc3VwZXJBY3QuZVJlc291cmNlKCkpOwotLy8KLS8vCQkJCWZvciAoaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VTZXQuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotLy8JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0vLwkJCQl9Ci0vLwkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0vLwotLy8JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0vLwkJCQljb21tYW5kLnVuZG8oKTsKLS8vCQkJCQotLy8JCQkJdW5kbygpOwotLy8JCQkJTGlicmFyeVBsdWdpbgotLy8JCQkJCQkuZ2V0RGVmYXVsdCgpCi0vLwkJCQkJCS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkuZGlzcGxheUVycm9yKAotLy8JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGUsCi0vLwkJCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2csIG5ld0FjdGl2aXR5LmdldE5hbWUoKSksIAotLy8JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLAotLy8JCQkJCQkJCWUpOwotLy8JCQkJbmV3QWN0aXZpdHkgPSBudWxsOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQljb21tYW5kLnVuZG8oKTsKLS8vCQkJdW5kbygpOwotLy8JCQlMaWJyYXJ5UGx1Z2luCi0vLwkJCQkJLmdldERlZmF1bHQoKQotLy8JCQkJCS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCS5kaXNwbGF5RXJyb3IoCi0vLwkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlLAotLy8JCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2csIG5ld0FjdGl2aXR5LmdldE5hbWUoKSksIAotLy8JCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvcl9yZWFzb24sIAotLy8JCQkJCQkJZXgpOwotLy8JCQluZXdBY3Rpdml0eSA9IG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiBuZXdBY3Rpdml0eTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBjcmVhdGVOZXdBY3Rpdml0eShpbnQgbmV3VHlwZSkgewotLy8JCXN3aXRjaCAobmV3VHlwZSkgewotLy8JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6Ci0vLwkJCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLS8vCQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKTsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotLy8JCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCk7Ci0vLwkJCWRlZmF1bHQ6Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgc3RhdGljIGludCBnZXRJbmRleEluQnJlYWtkb3duKEFjdGl2aXR5IGFjdCkgewotLy8JCWludCBpbmRleCA9IC0xOwotLy8JCUFjdGl2aXR5IHN1cGVyQWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShhY3QpOwotLy8JCWlmIChzdXBlckFjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLS8vCQkJLy8gZ2V0IHByb2Nlc3MsIGZpbmQgYnJlYWtkb3duCi0vLwkJCWluZGV4ID0gKChQcm9jZXNzQ29tcG9uZW50KXN1cGVyQWN0KS5nZXRQcm9jZXNzKCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGFjdCk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlpbmRleCA9IHN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihhY3QpOwotLy8JCX0KLS8vCQlyZXR1cm4gaW5kZXg7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgdW5kbygpIHsKLS8vCQkvLyB1bmRvIG1vdmluZyBvZiBvbGRBY3Rpdml0eSB0byB0aGUgZmFrZSBQUAotLy8JCWlmIChvbGRBY3Rpdml0eUNvbnRhaW5lciAhPSBudWxsKSB7Ci0vLwkJCW9sZEFjdGl2aXR5Q29udGFpbmVyLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZShuZXdBY3Rpdml0eSk7Ci0vLwkJCWlmICghb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuY29udGFpbnMob2xkQWN0aXZpdHkpKQotLy8JCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG9sZEFjdGl2aXR5KTsKLS8vCQl9Ci0vLwkJLy8gdW5kbyB0aGUgYnJlYWtkb3duIGxpbmsgY2hhbmdlcwotLy8JCWlmIChuZXdBY3Rpdml0eSAhPSBudWxsKSB7Ci0vLwkJCW5ld0FjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLS8vCQl9Ci0vLwkJaWYgKG9sZEFjdGl2aXR5QnJlYWtkb3duICE9IG51bGwgJiYgb2xkQWN0aXZpdHkgIT0gbnVsbCkgewotLy8vLwkJCW9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLS8vCQkJb2xkQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwob2xkQWN0aXZpdHlCcmVha2Rvd24pOwotLy8JCX0KLS8vCQlpZiAoc3VwZXJBY3RicmVha2Rvd25MaXN0ICE9IG51bGwpIHsKLS8vCQkJaWYgKG5ld0FjdGl2aXR5ICE9IG51bGwpIHsKLS8vCQkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5yZW1vdmUobmV3QWN0aXZpdHkpOwotLy8JCQl9Ci0vLwkJCWlmIChvbGRBY3Rpdml0eUJyZWFrZG93bkluZGV4ICE9IC0xICYmIG9sZEFjdGl2aXR5ICE9IG51bGwgJiYKLS8vCQkJCQkhc3VwZXJBY3RicmVha2Rvd25MaXN0LmNvbnRhaW5zKG9sZEFjdGl2aXR5KSkKLS8vCQkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5hZGQob2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCwgb2xkQWN0aXZpdHkpOwotLy8JCX0KLS8vCQkKLS8vCQkvLyB2YXJpYWJpbGl0eQotLy8JCWlmIChvbGRBY3RWYXJFbGVtZW50ICE9IG51bGwgJiYgb2xkQWN0VmFyVHlwZSAhPSBudWxsKSB7Ci0vLwkJCW9sZEFjdGl2aXR5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQob2xkQWN0VmFyRWxlbWVudCk7Ci0vLwkJCW9sZEFjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZShvbGRBY3RWYXJUeXBlKTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYgKG9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QgIT0gbnVsbCkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRBY3RJbW1lZGlhdGVWYXJpZXRpZXNMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCXZlLnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQob2xkQWN0aXZpdHkpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCi0vLwl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzJjNzNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuQmFzaWNSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNvcHkgYXR0YWNobWVlbnRzIHRvIGFub3RoZXIgbG9jYXRpb24KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpY25lIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24gZXh0ZW5kcyBCYXNpY1Jlc291cmNlTWFuYWdlciB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZVNldDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZzsKLQotCXByaXZhdGUgTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcDsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIGxhc3RPbGRQbHVnaW4gPSBudWxsOwotCi0JcHVibGljIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24oKSB7Ci0JCWRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGF0dGFjaG1lbnRzIHdpdGhpbiBhIGxpYnJhcnksIGZyb20gb25lIHBsdWdpbiB0byBhbm90aGVyCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzLAotCQkJTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcCkgewotCQlsYXN0T2xkUGx1Z2luID0gbnVsbDsKLQkJbW9kaWZpZWRSZXNvdXJjZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChlbGVtZW50VG9PbGRQbHVnaW5NYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0JCX0KLQkJdGhpcy5lbGVtZW50VG9PbGRQbHVnaW5NYXAgPSBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQlSZXNvdXJjZSByID0gKFJlc291cmNlKSBvOwotCQkJCUl0ZXJhdG9yIHJlc291cmNlSXRlciA9IHIuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChyZXNvdXJjZUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSByZXNvdXJjZUl0ZXIubmV4dCgpOwotCQkJCQlIYW5kbGVBdHRhY2htZW50c1BsdWdpbihlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIG87Ci0JCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIEhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKEVPYmplY3QgZSkgewotCQkvLyBoYW5kbGUgc2VsZgotCQlNZXRob2RFbGVtZW50IGVsZW1lbnRUb1Byb2Nlc3MgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBvbGQgcGx1Z2luLCBpZiB0aGVyZSBpcyBvbmUKLQkJaWYgKGVsZW1lbnRUb09sZFBsdWdpbk1hcCAhPSBudWxsCi0JCQkJJiYgKE1ldGhvZFBsdWdpbikgZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlKSAhPSBudWxsKSB7Ci0JCQlsYXN0T2xkUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlKTsKLQkJfQotCi0JCWlmIChsYXN0T2xkUGx1Z2luICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZTsKLQotCQkJCS8vIEN1c3RvbSBpY29ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNoYXBlIGljb24KLQkJCQkJamF2YS5uZXQuVVJJIHNoYXBlSWNvblVyaSA9IGRlLmdldFNoYXBlaWNvbigpOwotCQkJCQlpZiAoc2hhcGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCS8vIFRvIGhhbmRsZSB0aGUgc2hhcGVJY29uL25vZGVJY29uIHVyaSBnb3QgY2hhbmdlZCwgaXRzIHJlbGF0aXZlIHRvIHBsdWdpblBhdGguCi0JCQkJCQlqYXZhLm5ldC5VUkkgbmV3U2hhcGVJY29uVXJpID0gaGFuZGxlSWNvblVSSShkZSwKLQkJCQkJCQkJc2hhcGVJY29uVXJpKTsKLQkJCQkJCWlmIChuZXdTaGFwZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJCWRlLnNldFNoYXBlaWNvbihuZXdTaGFwZUljb25VcmkpOwotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKGRlLmVSZXNvdXJjZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIG5vZGUgaWNvbgotCQkJCQlqYXZhLm5ldC5VUkkgbm9kZUljb25VcmkgPSBkZS5nZXROb2RlaWNvbigpOwotCQkJCQlpZiAobm9kZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJamF2YS5uZXQuVVJJIG5ld05vZGVJY29uVXJpID0gaGFuZGxlSWNvblVSSShkZSwKLQkJCQkJCQkJbm9kZUljb25VcmkpOwotCQkJCQkJaWYgKG5ld05vZGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCQlkZS5zZXROb2RlaWNvbihuZXdOb2RlSWNvblVyaSk7Ci0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQoZGUuZVJlc291cmNlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQl9Ci0JCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oZGUuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCWVsZW1lbnRUb1Byb2Nlc3MgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWVsZW1lbnRUb1Byb2Nlc3MgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogdW5rbm93biB0eXBlICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGVsZW1lbnRUb1Byb2Nlc3MgIT0gbnVsbAotCQkJCQkmJiBlbGVtZW50VG9Qcm9jZXNzLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkvLyBzZXQgdXAgQ29udGVudFJlc291cmNlU2Nhbm5lciBmb3IgdGhpcyBlbGVtZW50Ci0JCQkJLy8gZ2l2ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIHNhbWUgZGlyZWN0b3J5IGZvciBzb3VyY2VSb290UGF0aAotCQkJCS8vIGFuZCB0YXJnZXRSb290UGF0aAotLy8JCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotLy8JCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLS8vCQkJCQotLy8JCQkJVVJJIGVsZW1lbnRVUkkgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmdldEVsZW1lbnRSZWxhdGl2ZVVSSShlbGVtZW50VG9Qcm9jZXNzKSA6IG51bGw7Ci0vLwkJCQlpZiAoZWxlbWVudFVSSSA9PSBudWxsIHx8IGVsZW1lbnRVUkkuc2VnbWVudENvdW50KCkgPCAxKQotLy8JCQkJCXJldHVybjsKLQkJCQkKLQkJCQkKLQkJCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihlbGVtZW50VG9Qcm9jZXNzKTsKLQkJCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsYXN0T2xkUGx1Z2luUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IobGFzdE9sZFBsdWdpbik7Ci0JCQkJCi0JCQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gZ2V0U2Nhbm5lcihlbGVtZW50VG9Qcm9jZXNzKTsKLQotCQkJCS8vIGl0ZXJhdGUgdGhydSBlbGVtZW50J3MgY29udGVudAotCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkuZ2V0RWxlbWVudFBhdGgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRUb1Byb2Nlc3MpOwotCQkJCWlmIChjb250ZW50UGF0aCA9PSBudWxsIHx8IGNvbnRlbnRQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCQkJTGlicmFyeVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nV2FybmluZygKLQkJCQkJCQkJCU5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aCwgKG5ldyBPYmplY3RbXSB7ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudFRvUHJvY2VzcykuZ2V0TmFtZSgpIH0pKSk7IAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gRklYTUU6IHRoaXMgaXMgbm90IGFsd2F5cyBjb3JyZWN0IHRoaXMgcmVsYXRpdmUgb2YgdGhlIGVsZW1lbnQncyBmb2xkZXIgbWlnaHQgaGF2ZSBiZWVuIGNoYW5nZWQKLQkJCQkvLyBkdXJpbmcgbW92ZS9jb3B5Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnRQYXRoID0gY29udGVudFBhdGgucmVwbGFjZUZpcnN0KFVtYVV0aWwKLQkJCQkJCS5nZXRNZXRob2RQbHVnaW4oZWxlbWVudFRvUHJvY2VzcykuZ2V0TmFtZSgpLAotCQkJCQkJbGFzdE9sZFBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQotCQkJCS8vQ29tbWVudGVkIG91dCB0aGUgZm9sbG93aW5nIGFuZCByb2xsZWQgYmFjayB0byB0aGUgYWJvdmUgdG8gZml4IGEgYnVnCi0JCQkJLy93aXRoIGF0dGFjaGVkIGZpbGUgaW4gY29udGVudCBwYXN0ZS4gQnV0IHdoeSBpdCB3YXMgaW50cm9kdWNlZD8gV2l0aG91dCBpdAotCQkJCS8vdGhlIHNoYXBlIGFuZCBub2RlIGljb24gYXBwZWFyIHRvIGJlIHdvcmtpbmcgZmluZS4KLQkJCQkvL1N0cmluZyBvbGRDb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJLy8JLmdldEVsZW1lbnRQYXRoKGxhc3RPbGRQbHVnaW4pOwkJCQkKLQotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9Qcm9jZXNzLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkKLQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJCQkJT2JqZWN0IG8gPSBlbGVtZW50VG9Qcm9jZXNzLmVHZXQoYXR0cmliKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJCVN0cmluZyBjb250ZW50ID0gKFN0cmluZykgbzsKLQkJCQkJCWlmIChjb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJCVN0cmluZyBuZXdDb250ZW50ID0gc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzUGx1Z2luKAotCQkJCQkJCQkJY29udGVudCwgY29udGVudFBhdGgsIG9sZENvbnRlbnRQYXRoKTsKLQkJCQkJCQlpZiAobmV3Q29udGVudCAhPSBudWxsCi0JCQkJCQkJCQkmJiBuZXdDb250ZW50LnRyaW0oKS5sZW5ndGgoKSAhPSAwCi0JCQkJCQkJCQkmJiAhY29udGVudC5lcXVhbHMobmV3Q29udGVudCkpIHsKLQkJCQkJCQkJZWxlbWVudFRvUHJvY2Vzcy5lU2V0KGF0dHJpYiwgbmV3Q29udGVudCk7Ci0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKGVsZW1lbnRUb1Byb2Nlc3MKLQkJCQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRlbXBsYXRlIGF0dGFjaG1lbnRzCi0vLwkJCQlTdHJpbmcgbGliUm9vdCA9IFJlc291cmNlSGVscGVyLmdldFZpcnR1YWxMaWJyYXJ5Um9vdChlbGVtZW50VG9Qcm9jZXNzKTsKLQkJCQlpZiAoZWxlbWVudFRvUHJvY2VzcyBpbnN0YW5jZW9mIEd1aWRhbmNlRGVzY3JpcHRpb24pIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoKEd1aWRhbmNlRGVzY3JpcHRpb24pIGVsZW1lbnRUb1Byb2Nlc3MpCi0JCQkJCQkJLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsCi0JCQkJCQkJLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCQlmb3IgKGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVN0cmluZyBhdHRhY2htZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoYXR0YWNobWVudCAhPSBudWxsCi0JCQkJCQkJCSYmIGF0dGFjaG1lbnQudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwubWF0Y2hlcihhdHRhY2htZW50KTsKLQkJCQkJCQlpZiAoIW0uZmluZCgpKSB7Ci0JCQkJCQkJCUZpbGUgc3JjQ29udGVudFBhdGggPSBuZXcgRmlsZShsYXN0T2xkUGx1Z2luUmVzTWdyLnJlc29sdmUobGFzdE9sZFBsdWdpbiwgb2xkQ29udGVudFBhdGgpKTsKLQkJCQkJCQkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjQ29udGVudFBhdGgsCi0JCQkJCQkJCQkJYXR0YWNobWVudCk7Ci0JCQkJCQkJCUZpbGUgdGd0Q29udGVudFBhdGggPSBuZXcgRmlsZShyZXNNZ3IuZ2V0UGh5c2ljYWxQYXRoKGVsZW1lbnRUb1Byb2Nlc3MpKTsKLQkJCQkJCQkJRmlsZSB0Z3RGaWxlID0gbmV3IEZpbGUodGd0Q29udGVudFBhdGgsCi0JCQkJCQkJCQkJYXR0YWNobWVudCk7Ci0JCQkJCQkJCWlmICghdGd0RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGd0RmlsZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBoYW5kbGUgY2hpbGRyZW4KLQkJSXRlcmF0b3IgaXRlciA9IGUuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZQotCSAqIEBwYXJhbSBpY29uVXJpCi0JICogQHJldHVybiB0aGUgbmV3IEljb24gVVJJIChyZWxhdGl2ZSBwYXRoLCBzbyBpdHMgcmVhZHkgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBtb2RlbCkKLQkgKiBAdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgamF2YS5uZXQuVVJJIGhhbmRsZUljb25VUkkoRGVzY3JpYmFibGVFbGVtZW50IGRlLAotCQkJamF2YS5uZXQuVVJJIGljb25VcmkpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlqYXZhLm5ldC5VUkkgc3JjVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aFVSSShkZSwKLQkJCQlpY29uVXJpKTsKLQkJU3RyaW5nIGljb25QYXRoID0gaWNvblVyaS5nZXRQYXRoKCk7Ci0JCWlmKGljb25QYXRoLmluZGV4T2YobGFzdE9sZFBsdWdpbi5nZXROYW1lKCkpIDwgMCl7Ci0JCQlzcmNVcmkgPSBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5nZXRQbHVnaW5QYXRoKGxhc3RPbGRQbHVnaW4pICsgRmlsZS5zZXBhcmF0b3IgKyBpY29uUGF0aCkudG9VUkkoKTsKLQkJfQotCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNVcmkpOwotCQlqYXZhLm5ldC5VUkkgdGd0VXJpID0gbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChkZSkgKyBGaWxlLnNlcGFyYXRvciArIGljb25QYXRoKS50b1VSSSgpOwotCQlGaWxlIHRndEZpbGUgPSBuZXcgRmlsZSh0Z3RVcmkpOwotCQlpZiAoIXRndEZpbGUuZXhpc3RzKCkpIHsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRndEZpbGUpOwotCQl9Ci0JCWphdmEubmV0LlVSSSBuZXdJY29uVXJpID0gbmV3IGphdmEubmV0LlVSSShOZXRVdGlsCi0JCQkJLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwuZ2V0UmVsYXRpdmVQYXRoKAotCQkJCQkJdGd0RmlsZSwgbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChkZSkpKSkpOwotCQlyZXR1cm4gbmV3SWNvblVyaTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlc291cmNlIHNjYW5uZXIgZm9yIHRoZSBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBnZXRTY2FubmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotCQlpZiAoIHJlc01nciA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyByb290Q29udGVudFBhdGggPSByZXNNZ3IuZ2V0TG9naWNhbFBsdWdpblBhdGgob3duZXIpOwotCQlGaWxlIHNyY19yb290ID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChvd25lcikpOwotCQlGaWxlIHRndF9yb290ID0gc3JjX3Jvb3Q7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKHNyY19yb290LCB0Z3Rfcm9vdCwgcm9vdENvbnRlbnRQYXRoLCBnZXRWYWxpZGF0b3IoKSk7Ci0KLQkJcmV0dXJuIHNjYW5uZXI7Ci0JfQotCQotCXB1YmxpYyBJQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIENvcHkgYWxsIGF0dGFjaG1lbnRzIGZyb20gb25lIGxpYnJhcnkgdG8gYW5vdGhlcgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaWJEaXIKLQkgKiAgICAgICAgICAgIE9yaWdpbmFsIGxpYnJhcnkgcm9vdAotCSAqIEBwYXJhbSBuZXdMaWJEaXIKLQkgKiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IHJvb3QKLQkgKiBAcGFyYW0geG1pTGlzdAotCSAqICAgICAgICAgICAgbGlzdCBvZiB4bWkgRmlsZSdzIChwYXNzIG51bGwgdG8gcHJvY2VzcyBhbGwgZmlsZXMgaW4KLQkgKiAgICAgICAgICAgIG5ld0xpYkRpcikKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgb3B0aW9uYWwgKGNhbiBiZSBudWxsKSBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlBdHRhY2htZW50c0xpYnJhcnkoU3RyaW5nIG9sZExpYkRpciwKLQkJCVN0cmluZyBuZXdMaWJEaXIsIExpc3QgeG1pTGlzdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJLy8gZ2V0IGxpc3Qgb2YgLnhtaSBmaWxlcyBpbiBuZXdMaWJEaXIKLQkJaWYgKHhtaUxpc3QgPT0gbnVsbCkKLQkJCXhtaUxpc3QgPSBGaWxlVXRpbC5maWxlTGlzdChuZXcgRmlsZShuZXdMaWJEaXIpLCAieG1pIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zdWJUYXNrKExpYnJhcnlSZXNvdXJjZXMuY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lKTsKLQotCQlJdGVyYXRvciBpdGVyID0geG1pTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlGaWxlIHhtaUZpbGUgPSAoRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoeG1pRmlsZS5leGlzdHMoKSkgewotCQkJCS8vIHBhcnNlIHhtaSBmaWxlCi0JCQkJU0FYUGFyc2VyWE1JIHBhcnNlciA9IG5ldyBTQVhQYXJzZXJYTUkobnVsbCk7Ci0JCQkJcGFyc2VyLnBhcnNlKHhtaUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCS8vIGl0ZXJhdGUgdGhydSBpdCdzIGVsZW1lbnRzLCBjaGVja2luZyBjb250ZW50IGZvciBhdHRhY2htZW50cwotCQkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKAotCQkJCQkJbmV3IEZpbGUob2xkTGliRGlyKSwgbmV3IEZpbGUobmV3TGliRGlyKSwgbnVsbCk7Ci0JCQkJSGFuZGxlQXR0YWNobWVudHMocGFyc2VyLnhtaU1hcCwgc2Nhbm5lciwgeG1pRmlsZS5nZXRQYXJlbnQoKQotCQkJCQkJLnN1YnN0cmluZyhuZXdMaWJEaXIubGVuZ3RoKCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgSGFuZGxlQXR0YWNobWVudHMoSGFzaE1hcCBlTWFwLAotCQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyLCBTdHJpbmcgY29udGVudFBhdGgpIHsKLQkJLy8gaGFuZGxlIHNlbGYKLQkJU3RyaW5nIGNvbnRlbnQgPSBTQVhQYXJzZXJYTUkuZ2V0RWxlbWVudENvbnRlbnQoZU1hcCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCS8vIHNjYW4gY29udGVudCBmb3IgYXR0YWNobWVudHMKLQkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhjb250ZW50LCBjb250ZW50UGF0aCk7Ci0JCX0KLQotCQkvLyBoYW5kbGUgY2hpbGRyZW4KLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlIYW5kbGVBdHRhY2htZW50cyhjaGlsZE1hcCwgc2Nhbm5lciwgY29udGVudFBhdGgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9GaWxlTmFtZUdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvRmlsZU5hbWVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2ZWMyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9GaWxlTmFtZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBoZWxwZXIgY2xhc3MgdG8gcHJvZHVjZSBhIHVuaXF1ZSBuYW1lIGZvciBlYWNoIGd1aWQgb3IgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVOYW1lR2VuZXJhdG9yIHsKLQlwdWJsaWMgc3RhdGljIEZpbGVOYW1lR2VuZXJhdG9yIElOU1RBTkNFID0gbmV3IEZpbGVOYW1lR2VuZXJhdG9yKCk7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVUb0d1aWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gYmFzZU5hbWVJbmRleE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQkKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIHN2Y0xpc3RlbmVyOwotCQotCXByaXZhdGUgRmlsZU5hbWVHZW5lcmF0b3IoKSB7Ci0JCQotCQlzdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJRmlsZU5hbWVHZW5lcmF0b3IudGhpcy5jbGVhcigpOwotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJCi0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIoc3ZjTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsIAotCSAqIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRHdWlkRnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZiAoIGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUuZXF1YWxzKCIiKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRHdWlkRnJvbVVuaXF1ZU5hbWUoZ2V0VW5pcXVlTmFtZShmaWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lUHJlZml4IFN0cmluZyBwcmVmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIG5hbWVTdWZmaXggU3RyaW5nIHN1ZmZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gZXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUsICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwkgCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZVByZWZpeCwKLQkJCVN0cmluZyBuYW1lU3VmZml4LCBTdHJpbmcgZXh0KSB7Ci0KLQkJU3RyaW5nIHVuaXF1ZU5hbWUgPSBnZXRVbmlxdWVOYW1lRm9yR3VpZChlbGVtZW50LmdldEd1aWQoKSwgZWxlbWVudC5nZXROYW1lKCkpOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVQcmVmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lUHJlZml4KTsKLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQodW5pcXVlTmFtZSk7Ci0JCQotCQlpZiAobmFtZVN1ZmZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVTdWZmaXgpOwotCQl9Ci0KLQkJaWYgKGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoZXh0LmluZGV4T2YoIi4iKSA8IDApIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlleHQgPSAiLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoZXh0KTsKLQkJfQotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJbmFtZVRvR3VpZE1hcC5jbGVhcigpOwotCQlndWlkVG9OYW1lTWFwLmNsZWFyKCk7Ci0JCWJhc2VOYW1lSW5kZXhNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OQU1FX0xFTkdUSCA9IDY0OwotCQotCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZU5hbWVGb3JHdWlkKFN0cmluZyBndWlkLCBTdHJpbmcgZGVmYXVsdE5hbWUpIHsKLQkJaWYgKCBndWlkID09IG51bGwgfHwgZ3VpZC5lcXVhbHMoIiIpICkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBnZW5lbnJhdGVkLCByZXR1cm4gaXQKLQkJU3RyaW5nIHVuaXF1ZU5hbWUgPSBndWlkVG9OYW1lTWFwLmdldChndWlkKTsKLQkJaWYgKCB1bmlxdWVOYW1lICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gdW5pcXVlTmFtZTsKLQkJfQotCQkKLQkJLy8gY29uc3RydWN0IHRoZSBiYXNlIGZpbGUgbmFtZSBvZiB0aGUgZWxlbWVudAotCQkvLyBub3RlOiB0byBtYWtlIHRoZSBuYW1lIGNvbnNpc3RlbnQgZXZlcnl0aW1lIHRoZSBuYW1lIGlzIGdlbmVyYXRlZCwgCi0JCS8vIHdlIHN0aWxsIG5lZWQgdG8gbWFrZSB0aGUgbmFtZSBndWlkIHNwZWNpZmljLiAKLQkJLy8gYXBwZW5kaW5nIHRoZSBndWlkIG1ha2VzIHRoZSBzdHJpbmcgdG8gbG9uZywgc28gdXNlIHRoZSBoYXNoY29kZQotCQkvLyBob3dldmVyLCBoYXNoY29kZSBtYXkgaGF2ZSBjb2xsaXNpb24sIHNvIHN0aWxsIG5lZWQgdG8gYXBwZW5kIHRoZSBzdWZmaXggaW5kZXgsCi0JCS8vIGluIHN1Y2ggY2FzZSwgdGhlIGZpbGUgbmFtZSBtYXkgc3RpbGwgbm90IHVuaXF1ZWx5IGJpbmRpbmcgdG8gdGhlIHNhbWUgZWxlbWVudCBjb25zaXN0ZW50bHkuCi0JCS8vIGJ1dCB0aGUgY2hhbmNlIGlzIG11Y2ggc21hbGxlcgotCQlpZiAoIGRlZmF1bHROYW1lID09IG51bGwgKSB7Ci0JCQlkZWZhdWx0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGJhc2UgbmFtZSBzdHJpbmcgaXMgdmFsaWQgYW5kIG5vdCBleGNlZWQgdGhlIG1heGltdW0gbGVuZ3RoCi0JCVN0cmluZyBiYXNlTmFtZSA9IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMoZGVmYXVsdE5hbWUpOwkKLQkJaWYgKCBiYXNlTmFtZS5sZW5ndGgoKSA+IE1BWF9OQU1FX0xFTkdUSCApIHsKLQkJCWJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKDAsIE1BWF9OQU1FX0xFTkdUSCk7Ci0JCX0KLQkJCQotCQliYXNlTmFtZSArPSAiXyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGd1aWQuaGFzaENvZGUoKSkudG9VcHBlckNhc2UoKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVuaXF1ZU5hbWUgPSBiYXNlTmFtZTsKLQkJSW50ZWdlciBpbmRleCA9IGJhc2VOYW1lSW5kZXhNYXAuZ2V0KGJhc2VOYW1lKTsKLQkJaWYgKCBpbmRleCA9PSBudWxsICkgewotCQkJLy8gdGhpcyBpcyB0aGUgZmlyc3Qgd2l0aCB0aGlzIGJhc2UgbmFtZSwgdXNlIGl0Ci0JCQlpbmRleCA9IG5ldyBJbnRlZ2VyKDEpOwotCQl9IGVsc2UgewotCQkJLy8gaW5jcmVhc2UgdGhlIGluZGV4IGJ5IG9uZSBhbmQgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGJhc2UgbmFtZQotCQkJaW5kZXgrKzsKLQkJCXVuaXF1ZU5hbWUgPSBiYXNlTmFtZSArICItIiArIGluZGV4LnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJYmFzZU5hbWVJbmRleE1hcC5wdXQoYmFzZU5hbWUsIGluZGV4KTsKLQkJZ3VpZFRvTmFtZU1hcC5wdXQoZ3VpZCwgdW5pcXVlTmFtZSk7Ci0JCW5hbWVUb0d1aWRNYXAucHV0KHVuaXF1ZU5hbWUsIGd1aWQpOwotCQlyZXR1cm4gdW5pcXVlTmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0R3VpZEZyb21VbmlxdWVOYW1lKFN0cmluZyB1bmlxdWVOYW1lKSB7Ci0JCXJldHVybiBuYW1lVG9HdWlkTWFwLmdldCh1bmlxdWVOYW1lKTsKLQl9Ci0JCQotCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQotCQl0cnkgewotCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCWZpbGVOYW1lID0gZi5nZXROYW1lKCk7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA8IDAgKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JRWxlbWVudFByb3BlcnR5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0lFbGVtZW50UHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDc2ODM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0lFbGVtZW50UHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSwgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0gKiBlbGVtZW50UHJvcGVydHlQcm92aWRlcnMsIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBleHBvc3VyZSBvZiBjdXN0b20KLSAqIGF0dHJpYnV0ZXMgb2YgTWV0aG9kRWxlbWVudCB0byB0aGUgWFNMVCB0ZW1wbGF0ZXMgZHVyaW5nIGEgcHVibGlzaCBvZiB0aGUKLSAqIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFBpZXJyZSBQYWRvdmFuaQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIGV4dGVuZHMgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0gIAotICAvKioKLSAgICogSW1wbGVtZW50b3JzIG11c3QgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCBYbWxFbGVtZW50IHRoZXkgd2lzaCB0byBoYXZlIGNyZWF0ZWQKLSAgICogYWdhaW5zdCB0aGUgTWV0aG9kRWxlbWVudCBiZWluZyBwcm9jZXNzZWQuIFRoaXMgbmFtZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjaGlsZAotICAgKiBYbWxFbGVtZW50IGJlZm9yZSBhIHN1YnNlcXVlbnQgY2FsbCB0byBwdWJsaXNoTWV0aG9kRWxlbWVudFByb3BlcnRpZXMuIElmIG5vIHByb3BlcnRpZXMKLSAgICogZm9yIHRoZSBlbGVtZW50IGV4aXN0IG9yIGhhdmUgYmVlbiBkZWZpbmVkLCByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRFbGVtZW50TmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotICAKLSAgLyoqCi0gICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCB3aWxsIGJlIGdpdmVuIGEgY2hpbGQgWG1sRWxlbWVudCB0aGF0IGNhbiBiZSBmaWxsZWQgd2l0aAotICAgKiBhbnkgZGF0YSBkZXNpcmVkLiBBbGwgZGF0YSBjb250YWluZWQgaW4gdGhpcyBYbWxFbGVtZW50IHdpbGwgYmUgZXhwb3NlZCB0byB0aGUgWFNMVCAKLSAgICogZHVyaW5nIGEgcHVibGlzaC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLSAgICogQHBhcmFtIGRhdGEKLSAgICogICAgICAgICAgWG1sRWxlbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgcHVibGlzaE1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgWG1sRWxlbWVudCBkYXRhKTsKLSAgCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JY29uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSWNvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjZjZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JY29uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gbWFuYWdlIGljb24gdXJscwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEljb25VdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIFVSTCBub2RlSWNvblBsdWdpblJvb3QgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9BY3Rpdml0eSA9ICJmdWxsL29iajE2L0FjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9BcnRpZmFjdCA9ICJmdWxsL29iajE2L0FydGlmYWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DYXBhYmlsaXR5UGF0dGVybiA9ICJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DaGVja2xpc3QgPSAiZnVsbC9vYmoxNi9DaGVja2xpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NvbmNlcHQgPSAiZnVsbC9vYmoxNi9Db25jZXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Db250ZW50UGFja2FnZSA9ICJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DdXN0b21DYXRlZ29yeSA9ICJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EZWxpdmVyYWJsZSA9ICJmdWxsL29iajE2L0RlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EZWxpdmVyeVByb2Nlc3MgPSAiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0Rpc2NpcGxpbmUgPSAiZnVsbC9vYmoxNi9EaXNjaXBsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EaXNjaXBsaW5lR3JvdXBpbmcgPSAiZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RvbWFpbiA9ICJmdWxsL29iajE2L0RvbWFpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRXN0aW1hdGUgPSAiZnVsbC9vYmoxNi9Fc3RpbWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9FeGFtcGxlID0gImZ1bGwvb2JqMTYvRXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fR3VpZGVsaW5lID0gImZ1bGwvb2JqMTYvR3VpZGVsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9JdGVyYXRpb24gPSAiZnVsbC9vYmoxNi9JdGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01ldGhvZENvbmZpZ3VyYXRpb24gPSAiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NZXRob2RMaWJyYXJ5ID0gImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWV0aG9kUGFja2FnZSA9ICJmdWxsL29iajE2L01ldGhvZFBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01ldGhvZFBsdWdpbiA9ICJmdWxsL29iajE2L01ldGhvZFBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWlsZXN0b25lID0gImZ1bGwvb2JqMTYvTWlsZXN0b25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9PdXRjb21lID0gImZ1bGwvb2JqMTYvT3V0Y29tZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUGhhc2UgPSAiZnVsbC9vYmoxNi9QaGFzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUHJhY3RpY2UgPSAiZnVsbC9vYmoxNi9QcmFjdGljZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUHJvY2Vzc0NvbnRyaWJ1dGlvbiA9ICJmdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Byb2Nlc3NGYW1pbHkgPSAiZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Qcm9jZXNzUGFja2FnZSA9ICJmdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9SZXBvcnQgPSAiZnVsbC9vYmoxNi9SZXBvcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JldXNhYmxlQXNzZXQgPSAiZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Sb2FkbWFwID0gImZ1bGwvb2JqMTYvUm9hZG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUm9sZSA9ICJmdWxsL29iajE2L1JvbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JvbGVTZXQgPSAiZnVsbC9vYmoxNi9Sb2xlU2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Sb2xlU2V0R3JvdXBpbmcgPSAiZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1N1cHBvcnRpbmdNYXRlcmlhbCA9ICJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVGFzayA9ICJmdWxsL29iajE2L1Rhc2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1RlbXBsYXRlID0gImZ1bGwvb2JqMTYvVGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Rlcm1EZWZpbml0aW9uID0gImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Rvb2wgPSAiZnVsbC9vYmoxNi9Ub29sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Ub29sTWVudG9yID0gImZ1bGwvb2JqMTYvVG9vbE1lbnRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fV2hpdGVwYXBlciA9ICJmdWxsL29iajE2L1doaXRlcGFwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1dvcmtQcm9kdWN0ID0gImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1dvcmtQcm9kdWN0VHlwZSA9ICJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1hcCBvZiBpbWFnZSB0eXBlIHRvIGltYWdlCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG5vZGVJY29uVXJsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlub2RlSWNvblVybE1hcC5wdXQoImFjdGl2aXR5IiwgSUNPTl9BY3Rpdml0eSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJhcnRpZmFjdCIsIElDT05fQXJ0aWZhY3QpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY2FwYWJpbGl0eXBhdHRlcm4iLCBJQ09OX0NhcGFiaWxpdHlQYXR0ZXJuKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImNoZWNrbGlzdCIsIElDT05fQ2hlY2tsaXN0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImNvbmNlcHQiLCBJQ09OX0NvbmNlcHQpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY29udGVudHBhY2thZ2UiLCBJQ09OX0NvbnRlbnRQYWNrYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImN1c3RvbWNhdGVnb3J5IiwgSUNPTl9DdXN0b21DYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkZWxpdmVyYWJsZSIsIElDT05fRGVsaXZlcmFibGUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZGVsaXZlcnlwcm9jZXNzIiwgSUNPTl9EZWxpdmVyeVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZGlzY2lwbGluZSIsIElDT05fRGlzY2lwbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkaXNjaXBsaW5lZ3JvdXBpbmciLCBJQ09OX0Rpc2NpcGxpbmVHcm91cGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkb21haW4iLCBJQ09OX0RvbWFpbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJlc3RpbWF0ZSIsIElDT05fRXN0aW1hdGUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgKLQkJCQkiZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIiwgSUNPTl9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZXhhbXBsZSIsIElDT05fRXhhbXBsZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJndWlkZWxpbmUiLCBJQ09OX0d1aWRlbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJpdGVyYXRpb24iLCBJQ09OX0l0ZXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtZXRob2Rjb25maWd1cmF0aW9uIiwgSUNPTl9NZXRob2RDb25maWd1cmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1ldGhvZGxpYnJhcnkiLCBJQ09OX01ldGhvZExpYnJhcnkpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgibWV0aG9kcGFja2FnZSIsIElDT05fTWV0aG9kUGFja2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtZXRob2RwbHVnaW4iLCBJQ09OX01ldGhvZFBsdWdpbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtaWxlc3RvbmUiLCBJQ09OX01pbGVzdG9uZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJvdXRjb21lIiwgSUNPTl9PdXRjb21lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInBoYXNlIiwgSUNPTl9QaGFzZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJwcmFjdGljZSIsIElDT05fUHJhY3RpY2UpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicHJvY2Vzc2NvbnRyaWJ1dGlvbiIsIElDT05fUHJvY2Vzc0NvbnRyaWJ1dGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJwcm9jZXNzZmFtaWx5IiwgSUNPTl9Qcm9jZXNzRmFtaWx5KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInByb2Nlc3NwYWNrYWdlIiwgSUNPTl9Qcm9jZXNzUGFja2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyZXBvcnQiLCBJQ09OX1JlcG9ydCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyZXVzYWJsZWFzc2V0IiwgSUNPTl9SZXVzYWJsZUFzc2V0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJvYWRtYXAiLCBJQ09OX1JvYWRtYXApOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicm9sZSIsIElDT05fUm9sZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyb2xlc2V0IiwgSUNPTl9Sb2xlU2V0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJvbGVzZXRncm91cGluZyIsIElDT05fUm9sZVNldEdyb3VwaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInN1cHBvcnRpbmdtYXRlcmlhbCIsIElDT05fU3VwcG9ydGluZ01hdGVyaWFsKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRhc2siLCBJQ09OX1Rhc2spOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidGVtcGxhdGUiLCBJQ09OX1RlbXBsYXRlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRlcm1kZWZpbml0aW9uIiwgSUNPTl9UZXJtRGVmaW5pdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ0b29sIiwgSUNPTl9Ub29sKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRvb2xtZW50b3IiLCBJQ09OX1Rvb2xNZW50b3IpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgid2hpdGVwYXBlciIsIElDT05fV2hpdGVwYXBlcik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3b3JrcHJvZHVjdCIsIElDT05fV29ya1Byb2R1Y3QpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgid29ya3Byb2R1Y3R0eXBlIiwgSUNPTl9Xb3JrUHJvZHVjdFR5cGUpOyAvLyROT04tTkxTLTEkCi0KLQkJbm9kZUljb25VcmxNYXAucHV0KCJyb2xlZGVzY3JpcHRvciIsIElDT05fUm9sZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ0YXNrZGVzY3JpcHRvciIsIElDT05fVGFzayk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3b3JrcHJvZHVjdGRlc2NyaXB0b3IiLCBJQ09OX1dvcmtQcm9kdWN0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQlub2RlSWNvblBsdWdpblJvb3QgPSBGaWxlTG9jYXRvci5yZXNvbHZlKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEJhc2VVUkwoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbm9kZSBpY29uIHVybAotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFN0cmluZyB0aGUgZWxlbWVudCB0eXBlCi0JICogQHJldHVybiBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXROb2RlSWNvblVSTChTdHJpbmcgdHlwZSkgewotCQl0cnkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIG5vZGVJY29uVXJsTWFwLmdldCh0eXBlLnRvTG93ZXJDYXNlKCkpOwotCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwobm9kZUljb25QbHVnaW5Sb290LCAiaWNvbnMvIiArIGtleSArICIuZ2lmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbm9kZSBpY29uIGZpbGUgbG9jYXRpb24gZm9yIHRoZSBlbGVtZW50IHR5cGUKLQkgKiBAcGFyYW0gdHlwZSBTdHJpbmcgdGhlIGVsZW1lbnQgdHlwZQotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXROb2RlSWNvbkZpbGUoU3RyaW5nIHR5cGUpIHsKLQkJVVJMIHVybCA9IGdldE5vZGVJY29uVVJMKHR5cGUpOwotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzODlmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JbXBvcnRFeHBvcnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBlbGVtZW50IHJlcGxhY2Ugb3IgcmVuYW1pbmcgZm9yIGltcG9ydC9leHBvcnQKLSAqIAotICogQGF1dGhvciA/Pz8KLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRFeHBvcnRVdGlsIHsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvY0NvbXAKLQkgKiBAcGFyYW0gZGlyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2UoUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCwgU3RyaW5nIGRpcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLQkJCUZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsIFNBWEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbmV3UHJvY0NvbXBGaWxlID0gbmV3IEZpbGUoZGlyLAotCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTU9ERUxfRklMRU5BTUUpOwotCQlpZiAoIW5ld1Byb2NDb21wRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigKLQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLkltcG9ydEV4cG9ydFV0aWxfTVNHOCwgbmV3IE9iamVjdFtdIHsgbmV3UHJvY0NvbXBGaWxlIH0pKTsKLQkJfQotCi0JCVN0cmluZyBvbGRNb2RlbEZpbGVTdHIgPSBwcm9jQ29tcC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJU3RyaW5nIG9sZFByb2NDb21wRGlyID0gbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKS5nZXRQYXJlbnQoKTsKLQotCQlTdHJpbmcgc3VmZml4ID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0QmFja3VwRmlsZVN1ZmZpeCgpOwotCi0JCUZpbGUgdGVtcERpciA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCS8vIGNvcHkgZGlyIGEgdGVtcCBkaXIgaW5zaWRlIHRoZSB0YXJnZXQgZGlyCi0JCQkvLwotCQkJdGVtcERpciA9IG5ldyBGaWxlKG9sZFByb2NDb21wRGlyLCBzdWZmaXgpOwotCQkJaWYgKCF0ZW1wRGlyLm1rZGlyKCkpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5JbXBvcnRFeHBvcnRVdGlsX01TRzksIG5ldyBPYmplY3RbXSB7IHRlbXBEaXIgfSkpOwotCQkJfQotCQkJRmlsZVV0aWwuY29weURpcihuZXcgRmlsZShkaXIpLCB0ZW1wRGlyKTsKLQkJCW5ld1Byb2NDb21wRmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTU9ERUxfRklMRU5BTUUpOwotCi0JCQkvLyBsb2FkIHRoZSBuZXcgbW9kZWwueG1pCi0JCQkvLwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBwcm9jQ29tcAotCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVJlc291cmNlIG5ld1Jlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJCi0JCQkJCS5jcmVhdGVGaWxlVVJJKG5ld1Byb2NDb21wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIHRydWUpOwotCi0JCQkvLyBmaXggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzCi0JCQkvLwotCQkJUHJvY2Vzc0NvbXBvbmVudCBuZXdQcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJLmdldE1ldGhvZEVsZW1lbnQobmV3UmVzb3VyY2UpOwotCQkJUHJvY2VzcyBuZXdQcm9jID0gbmV3UHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJbmV3UHJvYwotCQkJCQkuc2V0RGVmYXVsdENvbnRleHQocHJvY0NvbXAuZ2V0UHJvY2VzcygpCi0JCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCkpOwotCQkJbmV3UHJvYy5nZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJbmV3UHJvYy5nZXRWYWxpZENvbnRleHQoKS5hZGRBbGwoCi0JCQkJCXByb2NDb21wLmdldFByb2Nlc3MoKS5nZXRWYWxpZENvbnRleHQoKSk7Ci0KLQkJCS8vIGZpeCBhbGwgc3RlcHMKLQkJCS8vCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld1Byb2NDb21wLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCVRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkJCQkJU3RyaW5nIHRhc2tOYW1lID0gdGFzayA9PSBudWxsID8gIk5PTkUiIDogIiciICsgdGFzay5nZXROYW1lKCkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFzazogIiArIHRhc2tOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY2xlYXIoKTsKLQkJCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGRBbGwodGFzay5nZXRTdGVwcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVwbGFjZSBHVUlEIG9mIG5ldyBQcm9jZXNzQ29tcG9uZW50IGFuZCBpdHMgUmVzb3VyY2VNYW5hZ2VyIHdpdGgKLQkJCS8vIG9sZCBvbmVzCi0JCQkvLwotCi0JCQkvLyAvLyByZWFkIHRoZSBtb2RlbC54bWkgZmlsZQotCQkJLy8gRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPQotCQkJLy8gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJLy8gRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShuZXdQcm9jQ29tcEZpbGUpOwotCi0JCQkvLyBzZXQgR1VJRCBvZiBuZXcgUmVzb3VyY2VNYW5hZ2VyIHRvIG9sZCBHVUlECi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihwcm9jQ29tcC5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIobmV3UmVzb3VyY2UpLnNldEd1aWQoCi0JCQkJCQlyZXNNZ3IuZ2V0R3VpZCgpKTsKLQkJCX0KLQotCQkJLy8gTm9kZUxpc3QgbGlzdCA9Ci0JCQkvLyBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciIpOwotCQkJLy8gRWxlbWVudCBlID0gKEVsZW1lbnQpIGxpc3QuaXRlbSgwKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJ4bWk6aWQiLCBndWlkKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJndWlkIiwgZ3VpZCk7Ci0KLQkJCS8vIHNldCBHVUlEIG9mIG5ldyBQcm9jZXNzQ29tcG9uZW50IHRvIG9sZCBHVUlECi0JCQluZXdQcm9jQ29tcC5zZXRHdWlkKHByb2NDb21wLmdldEd1aWQoKSk7Ci0KLQkJCS8vIGd1aWQgPSBwcm9jQ29tcC5nZXRHdWlkKCk7Ci0JCQkvLyBsaXN0ID0KLQkJCS8vIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50Iik7Ci0JCQkvLyBlID0gKEVsZW1lbnQpIGxpc3QuaXRlbSgwKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJ4bWk6aWQiLCBndWlkKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJndWlkIiwgZ3VpZCk7Ci0KLQkJCS8vIHNhdmUgdGhlIG5ldyBtb2RlbC54bWkKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlNYXAgc2F2ZU9wdGlvbnMgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmdldFNhdmVPcHRpb25zKCkgOiBuZXcgSGFzaE1hcCgpOwkJCQotCQkJbmV3UmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIG1vZGVsLnhtaQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKTsKLQkJCUZpbGVVdGlsLm1vdmVGaWxlKGZpbGUsIG5ldyBGaWxlKG9sZE1vZGVsRmlsZVN0ciArICIuYmFrIiArIHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ld1Byb2NDb21wRmlsZSwgbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKSk7Ci0KLQkJCS8vIFhNTFV0aWwuc2F2ZURvY3VtZW50KGRvYywgb2xkTW9kZWxGaWxlU3RyKTsKLQotCQkJRmlsZSBuZXdDb250ZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIGNvbnRlbnQueG1pCi0JCQlTdHJpbmcgY29udGVudEZpbGVTdHIgPSBvbGRQcm9jQ29tcERpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9DT05URU5UX0ZJTEVOQU1FOwotCQkJRmlsZSBvbGRDb250ZW50RmlsZSA9IG5ldyBGaWxlKGNvbnRlbnRGaWxlU3RyKTsKLQkJCUZpbGVVdGlsLm1vdmVGaWxlKG9sZENvbnRlbnRGaWxlLCBuZXcgRmlsZShjb250ZW50RmlsZVN0ciArICIuYmFrIiArIHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIGNvcHkgbmV3IGNvbnRlbnQueG1pCi0JCQlpZiAobmV3Q29udGVudEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShuZXdDb250ZW50RmlsZSwgb2xkQ29udGVudEZpbGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRlbXBEaXIgIT0gbnVsbCkgewotCQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCXRlbXBEaXIuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiYmE4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFkZFRvQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIHRoZSByb3V0aW5lcyB1c2VkIGJ5IHRoZSB0b29sIGVkaXRvciB0byBtYW5pcHVsYXRlCi0gKiB0aGUgYXNzb2NpYXRpb25zIG9mIGEgbWV0aG9kIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgd2l0aCBvdGhlciBjYXRlZ29yaWVzIG9yCi0gKiBtZXRob2QgZWxlbWVudHMKLSAqIAotICogVXNlIGdldEF2YWlsYWJsZVhYWCB0byByZXRyaWV2ZSBhIHBpY2sgbGlzdCBvZiBjYXRlZ29yaWVzLCBtZXRob2QgZWxlbWVudCBmb3IKLSAqIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuIFVzZSBhZGRUb1hYWCB0byBlc3RhYmxpc2ggYSBuZXcgYXNzb2NpYXRpb24uIFVzZQotICogcmVtb3ZlRnJvbVhYWCB0byByZW1vdmUgYW4gZXhpc2l0aW5nIGFzc29jaWF0aW9uLgotICogCi0gKiBDYWxsIHJlbGVhc2VDYXRlZ29yaWVzKCkgYmVmb3JlIHRoZSBlZGl0b3IgY2xvc2VzLCBwYXNzaW5nIGluIGFsbCB0aGUKLSAqIGNhdGVnb3JpZXMgdGhhdCB5b3UgaGF2ZSByZXRyaWV2ZWQgd2l0aCBnZXRBdmFpbGFibGVYWFgoKSBmb3IgdGhlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3IgbmFtZUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgbzEpLmdldE5hbWUoKS5jb21wYXJlVG8oCi0JCQkJCQkoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCkpOwotCQkJfQotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlicmFyeU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTGlicmFyeU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBMaWJyYXJ5TWFuYWdlcigpIHsKLQl9Ci0KLQkvLyAvLy8vLy8KLQkvLyBCZWdpbiBvZiBjb2RlIG1vdmVkIGZyb20gTWV0aG9kRWxlbWVudFV0aWwgYW5kIG1hZGUgcHJpdmF0ZQotCS8vIC8vLy8vLwotCS8qKgotCSAqIFJldHVybiBjYXRlZ29yaWVzIGluIHRoZSBtb2RlbCwgZ2l2ZW4gcGFydGljdWxhciBvYmplY3QgYW5kIGNsYXNzCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBjbGFzcwotCSAqIEBwYXJhbSBTdHJpbmdbXQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgb2JqZWN0LCBDbGFzcyBjbGFzc1R5cGUsCi0JCQlTdHJpbmdbXSBwYXRoKSB7Ci0JCUxpc3QgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBhZGQgYWxsIGNhdGVnb3JpZXMgZnJvbSB0aGUgY3VycmVudCBwbHVnaW4KLQkJCS8vCi0JCQlDb250ZW50UGFja2FnZSBkaXNjaXBsaW5lUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobW9kZWwsCi0JCQkJCXBhdGgpOwotCQkJaWYgKGRpc2NpcGxpbmVQa2cgIT0gbnVsbCkgewotCQkJCUVMaXN0IGNvbnRlbnRDYXRzID0gKEVMaXN0KSBkaXNjaXBsaW5lUGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudENhdHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBjb250ZW50Q2F0cy5nZXQoaSk7Ci0KLQkJCQkJaWYgKGNsYXNzVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpICYmIGVsZW1lbnQgIT0gb2JqZWN0KSB7Ci0JCQkJCQlpdGVtTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFkZCBhbGwgY2F0ZWdvcmllcyBmcm9tIGJhc2UgcGx1Z2lucyB0aGF0IGFyZSBub3QgZXh0ZW5kZWQKLQkJCS8vCi0JCQlMaXN0IGxpc3QgPSBNaXNjLmdldEFsbEJhc2UobW9kZWwpOwotCQkJLy8gbGlzdC5hZGQoMCwgbW9kZWwpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGFyZW50RGlzY2lwbGluZXMgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJCSgoTWV0aG9kUGx1Z2luKSBsaXN0LmdldChqKSksIHBhdGgpOwotCQkJCWlmIChwYXJlbnREaXNjaXBsaW5lcyAhPSBudWxsKSB7Ci0JCQkJCUVMaXN0IGNvbnRlbnRDYXRzID0gKEVMaXN0KSBwYXJlbnREaXNjaXBsaW5lcwotCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50Q2F0cy5zaXplKCk7IGkrKykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBjb250ZW50Q2F0cy5nZXQoaSk7Ci0KLQkJCQkJCWlmIChjbGFzc1R5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBpdGVtID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCQkJCQlpZiAoaXRlbS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGl0ZW1MaXN0IGRvZXNuJ3QgaGF2ZSBhCi0JCQkJCQkJCS8vIGNhdGVnb3J5IHRoYXQgZXh0ZW5kcyB0aGlzCi0JCQkJCQkJCWludCBrOwotCQkJCQkJCQlmb3IgKGsgPSAwOyBrIDwgaXRlbUxpc3Quc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJCWlmICgoKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlbUxpc3QuZ2V0KGspKQotCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGl0ZW0pCi0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGsgPT0gaXRlbUxpc3Quc2l6ZSgpKQotCQkJCQkJCQkJaXRlbUxpc3QuYWRkKGl0ZW0pOwotCi0JCQkJCQkJCS8vIGl0ZW1MaXN0LmFkZChpdGVtKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1MaXN0LCBuYW1lQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIGl0ZW1MaXN0OwotCX0KLQotCS8vIC8vLy8vLy8vCi0JLy8gRW5kIG9mIGNvZGUgbW92ZWQgZnJvbSBNZXRob2RFbGVtZW50VXRpbAotCS8vIC8vLy8vLy8vCi0KLQkvKioKLQkgKiBHZXRzIGFsbCBkaXNjaXBsaW5lcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQKLQkgKiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgRGlzY2lwbGluZSBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRGlzY2lwbGluZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIERpc2NpcGxpbmUuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVF9ESVNDSVBMSU5FX0RFRl9QQVRIKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBkb21haW5zIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgRG9tYWluIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVEb21haW5zKE1ldGhvZEVsZW1lbnQgZSkgewotCQlMaXN0IGRvbWFpbnMgPSBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIERvbWFpbi5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX0RPTUFJTl9QQVRIKTsKLQotCQkvLyBnZXQgYWxsIHRoZSBkb21haW5zIGluY2x1ZGluZyBzdWJkb21haW5zCi0JCS8vCi0JCUxpc3QgYWxsRG9tYWlucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZG9tYWlucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBpdGVyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGRvbWFpblRyZWUgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZG9tYWluLCB0cnVlKSB7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gKChEb21haW4pIG9iamVjdCkuZ2V0U3ViZG9tYWlucygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQkJd2hpbGUgKGRvbWFpblRyZWUuaGFzTmV4dCgpKSB7Ci0JCQkJYWxsRG9tYWlucy5hZGQoZG9tYWluVHJlZS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChhbGxEb21haW5zLCBuYW1lQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIGFsbERvbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgd29yayBwcm9kdWN0IHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBXb3JrUHJvZHVjdFR5cGUgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVdvcmtQcm9kdWN0VHlwZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHJvbGUgc2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFJvbGVTZXQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVTZXRzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyhlLCBSb2xlU2V0LmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGN1c3RvbSBjYXRlZ29yaWVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBSb2xlU2V0IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDdXN0b21DYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlMaXN0IGNhdGVnb3JpZXMgPSBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFRfQ1VTVE9NX0NBVEVHT1JZX1BBVEgpOwotCQkvLyBmaWx0ZXIgb3V0IHRoZSByb290IGN1c3RvbSBjYXRlZ29yaWVzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdG9vbHMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBUb29sIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUb29scyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgVG9vbC5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBkaXNjaXBsaW5lIGdyb3VwaW5ncyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuCi0JICogTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgUm9sZVNldCBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRGlzY2lwbGluZUdyb3VwaW5ncyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCByb2xlIHNldCBncm91cGluZ3MgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50Ci0JICogb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFJvbGVTZXQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVTZXRHcm91cGluZ3MoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIFJvbGVTZXRHcm91cGluZy5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSB0YXNrIHRvIGEgZGlzY2lwbGluZQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybiBEaXNjaXBsaW5lCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgYWRkVG9EaXNjaXBsaW5lKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSwgVGFzayB0YXNrLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCXJldHVybiAoRGlzY2lwbGluZSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIGRpc2NpcGxpbmUsIHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoLCB0cnVlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgd29ya3Byb2R1Y3QgdG8gYSBkb21haW4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4gRG9tYWluCi0JICovCi0JcHVibGljIERvbWFpbiBhZGRUb0RvbWFpbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIERvbWFpbiBkb21haW4sCi0JCQlXb3JrUHJvZHVjdCB3cCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlyZXR1cm4gKERvbWFpbikgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIGRvbWFpbiwgd3AsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwgdHJ1ZSwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgd29yayBwcm9kdWN0IHRvIGEgV29ya1Byb2R1Y3RUeXBlCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB3cFR5cGUKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIFdvcmtQcm9kdWN0VHlwZQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgYWRkVG9Xb3JrUHJvZHVjdFR5cGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJV29ya1Byb2R1Y3RUeXBlIHdwVHlwZSwgV29ya1Byb2R1Y3Qgd3AsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJcmV0dXJuIChXb3JrUHJvZHVjdFR5cGUpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB3cFR5cGUsIHdwLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsIHRydWUsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQotCi0JLyoqCi0JICogYWRkIGFuIGVsZW1lbnQgdG8gYSBDdXN0b21DYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gdXNlckRlZmluZWRDYXRlZ29yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBDdXN0b21DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBhZGRUb0N1c3RvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsCi0JCQkJCXVzZXJEZWZpbmVkQ2F0ZWdvcnksIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgsIHRydWUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJfQotCi0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkvLyByZXR1cm4gKEN1c3RvbUNhdGVnb3J5KSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgdXNlckRlZmluZWRDYXRlZ29yeSwKLQkJLy8gZWxlbWVudCwKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCS8vIHJldHVybiAoQ3VzdG9tQ2F0ZWdvcnkpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB1c2VyRGVmaW5lZENhdGVnb3J5LAotCQkvLyBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCksCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCB0cnVlKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKXsKLQkJLy8gcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIHVzZXJEZWZpbmVkQ2F0ZWdvcnksCi0JCS8vIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1Byb2Nlc3NFbGVtZW50cygpLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSk7Ci0JCS8vIH0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIGFkZCBhIHRvb2xtZW50b3IgdG8gYSBUb29sCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB0b29sCi0JICogQHBhcmFtIHRvb2xNZW50b3IKLQkgKiBAcmV0dXJuIFRvb2wKLQkgKi8KLQlwdWJsaWMgVG9vbCBhZGRUb1Rvb2woSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBUb29sIHRvb2wsCi0JCQlUb29sTWVudG9yIHRvb2xNZW50b3IsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJcmV0dXJuIChUb29sKSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgdG9vbCwgdG9vbE1lbnRvciwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCwgdHJ1ZSwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgcm9sZSB0byBhIFJvbGVTZXQKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIHJvbGVTZXQKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4gUm9sZVNldAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGFkZFRvUm9sZVNldChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFJvbGVTZXQgcm9sZVNldCwKLQkJCVJvbGUgcm9sZSwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlyZXR1cm4gKFJvbGVTZXQpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCByb2xlU2V0LCByb2xlLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLCB0cnVlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBlbGVtZW50IHRvIHRoZSBjYXRlZ29yeS4gVGhpcyBtZXRob2QgbWlnaHQgY3JlYXRlIGEgbmV3Ci0JICogY29udHJpYnV0b3IgdG8gdGhlIGdpdmVuIGNhdGVnb3J5IGluIHRoZSBtZXRob2QgZWxlbWVudCdzIHBsdWdpbiBpZiB0aGUKLQkgKiBnaXZlbiBjYXRlZ29yeSBiZWxvbmdzIHRvIHRoZSBiYXNlIHBsdWdpbiBvZiB0aGUgbWV0aG9kIGVsZW1lbnQncyBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gY2F0ZWdvcnlQa2dQYXRoCi0JICogQHBhcmFtIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcgotCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBjYXRlZ29yeSB0aGF0IHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBpcyBhZGRlZCB0bwotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnkgYWRkVG9DYXRlZ29yeShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgsCi0JCQlib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvciwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlBZGRUb0NhdGVnb3J5Q29tbWFuZCBjbWQgPSBuZXcgQWRkVG9DYXRlZ29yeUNvbW1hbmQoY2F0ZWdvcnksIGVsZW1lbnQsCi0JCQkJZmVhdHVyZSwgY2F0ZWdvcnlQa2dQYXRoLCBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IsIHVzZWRDYXRlZ29yaWVzKTsKLQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJcmV0dXJuIChDb250ZW50Q2F0ZWdvcnkpICgoTGlzdCkgY21kLmdldEFmZmVjdGVkT2JqZWN0cygpKS5nZXQoMCk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCBzZXRSZXNwb25zaWJsZVJvbGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBXb3JrUHJvZHVjdCB3cCwKLS8vCQkJUm9sZSByb2xlKSB7Ci0vLwkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG5ldyBTZXRPcHBvc2l0ZUZlYXR1cmVDb21tYW5kKHdwLAotLy8JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlLCByb2xlKTsKLS8vCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotLy8JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgY2F0ZWdvcnkuIFRoaXMgbWV0aG9kIG1pZ2h0IGRlbGV0ZQotCSAqIHRoZSBjYXRlZ29yeSBpZiBpdCBpcyBhIGNvbnRyaWJ1dG9yIGFuZCBiZWNhbWUgZW1wdHkgYWZ0ZXIgdGhlIHJlbW92YWwgb2YKLQkgKiB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZW50UGtnUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZ1tdIGNvbnRlbnRQa2dQYXRoLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZChjYXRlZ29yeSwKLQkJCQllbGVtZW50LCBmZWF0dXJlLCBjb250ZW50UGtnUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQlyZXR1cm4gIWNtZC5nZXRSZXN1bHQoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgY2F0ZWdvcnkuIFRoaXMgbWV0aG9kIG1pZ2h0IGRlbGV0ZQotCSAqIHRoZSBjYXRlZ29yeSBpZiBpdCBpcyBhIGNvbnRyaWJ1dG9yIGFuZCBiZWNhbWUgZW1wdHkgYWZ0ZXIgdGhlIHJlbW92YWwgb2YKLQkgKiB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50RmVhdHVyZXMKLQkgKiAgICAgICAgICAgIGZlYXR1cmVzIHRvIGNoZWNrIGZvciBlbXB0aW5lc3MgYmVmb3JlIGRlbGV0aW5nIHRoZSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjb250ZW50UGtnUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUNhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudAotCS8vIGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmVbXQotCS8vIGVsZW1lbnRGZWF0dXJlcywgU3RyaW5nW10gY29udGVudFBrZ1BhdGgpIHsKLQkvLyBib29sZWFuIHJldDsKLQkvLyBib29sZWFuIGVtcHR5ID0gZmFsc2U7Ci0JLy8gTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCS8vIE1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JLy8gQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeTsKLQkvLyBpZihjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luKSB7Ci0JLy8gdXNlZENhdGVnb3J5ID0KLQkvLyBUbmdVdGlsLmZpbmRDb250cmlidXRvcihVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbGVtZW50UGx1Z2luLAotCS8vIGNvbnRlbnRQa2dQYXRoKSwgY2F0ZWdvcnkpOwotCS8vIGlmKHVzZWRDYXRlZ29yeSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIHVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCS8vIH0KLQkvLyBpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JLy8gQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCS8vIHJldCA9IGNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCS8vIGVtcHR5ID0gdHJ1ZTsKLQkvLyAvL1RPRE86IG5lZWQgcmV2aXNpdCB0byBmaW5kIGJldHRlciB3YXkgdG8gcmVtb3ZlIHRoZSBlbXB0eSBjb250cmlidXRvcnMKLQkvLyB3aXRob3V0IGFkZGluZyB0byBtdWNoIHdvcmsgb24gaW4gdGhlIFVJIGNvZGUKLQkvLyAvLwotCS8vIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8gLy8gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBjYXRlZ29yeS5lR2V0KGVsZW1lbnRGZWF0dXJlc1tpXSk7Ci0JLy8gLy8gaWYoIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JLy8gLy8gZW1wdHkgPSBmYWxzZTsKLQkvLyAvLyBicmVhazsKLQkvLyAvLyB9Ci0JLy8gLy8gfQotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyB1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBudWxsKTsKLQkvLyByZXQgPSB0cnVlOwotCS8vIH0KLQkvLyAvLyBpZihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCAmJiBlbXB0eSkgewotCS8vIC8vIEVjb3JlVXRpbC5yZW1vdmUoY2F0ZWdvcnkpOwotCS8vIC8vIH0KLQkvLyByZXR1cm4gcmV0OwotCS8vIH0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRGlzY2lwbGluZShEaXNjaXBsaW5lIGRpc2NpcGxpbmUsIFRhc2sgdGFzaykgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoZGlzY2lwbGluZSwgdGFzaywgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sCi0JLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCS8vIH0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRGlzY2lwbGluZShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUsIFRhc2sgdGFzaywgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIGRpc2NpcGxpbmUsIHRhc2ssIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRG9tYWluKERvbWFpbiBkb21haW4sIFdvcmtQcm9kdWN0IHdwKSB7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPQotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGRvbWFpbiwgd3AsIGZlYXR1cmUsIG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JLy8gZmVhdHVyZSB9LCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Eb21haW4oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBEb21haW4gZG9tYWluLAotCQkJV29ya1Byb2R1Y3Qgd3AsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0JCXJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoYWN0aW9uTWdyLCBkb21haW4sIHdwLCBmZWF0dXJlLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Xb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIHdwVHlwZSwKLQkvLyBXb3JrUHJvZHVjdCB3cCkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0KLQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0JLy8gcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeSh3cFR5cGUsIHdwLCBmZWF0dXJlLCBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCS8vIGZlYXR1cmUgfSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tV29ya1Byb2R1Y3RUeXBlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCVdvcmtQcm9kdWN0VHlwZSB3cFR5cGUsIFdvcmtQcm9kdWN0IHdwLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgd3BUeXBlLCB3cCwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tUm9sZVNldChSb2xlU2V0IHJvbGVTZXQsIFJvbGUgcm9sZSkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkocm9sZVNldCwgcm9sZSwgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Sb2xlU2V0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgUm9sZVNldCByb2xlU2V0LAotCQkJUm9sZSByb2xlLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgcm9sZVNldCwgcm9sZSwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbVRvb2woVG9vbCB0b29sLCBUb29sTWVudG9yIHRvb2xNZW50b3IpIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KHRvb2wsIHRvb2xNZW50b3IsIGZlYXR1cmUsIG5ldwotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsgZmVhdHVyZSB9LCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tVG9vbChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFRvb2wgdG9vbCwKLQkJCVRvb2xNZW50b3IgdG9vbE1lbnRvciwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIHRvb2wsIHRvb2xNZW50b3IsIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21DdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeQotCS8vIHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZSkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250ZW50RWxlbWVudEZlYXR1cmUgPQotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgY29udGVudENhdGVnb3J5RmVhdHVyZSA9Ci0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpOwotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzID0geyBjb250ZW50RWxlbWVudEZlYXR1cmUsCi0JLy8gY29udGVudENhdGVnb3J5RmVhdHVyZSB9OwotCS8vIGlmKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkodXNlckRlZmluZWRDYXRlZ29yeSwgZSwgY29udGVudEVsZW1lbnRGZWF0dXJlLAotCS8vIGZlYXR1cmVzLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYoZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkodXNlckRlZmluZWRDYXRlZ29yeSwgZSwgY29udGVudENhdGVnb3J5RmVhdHVyZSwKLQkvLyBmZWF0dXJlcywgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZSwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIHVzZXJEZWZpbmVkQ2F0ZWdvcnksIGUsCi0JCQkJCWZlYXR1cmUsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBlZGl0b3IgY2xvc2VzLCBwYXNzaW5nIGluIGFsbCB0aGUgY2F0ZWdvcmllcwotCSAqIHRoYXQgeW91IGhhdmUgcmV0cmlldmVkIHdpdGggZ2V0QXZhaWxhYmxlWFhYKCkgZm9yIHRoZSBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gY29uc3VtZXIKLQkgKiBAcGFyYW0gY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgY29uc3VtZXIsIENvbGxlY3Rpb24gY2F0ZWdvcmllcykgewotCQlNZXRob2RQbHVnaW4gY29uc3VtZXJQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb25zdW1lcik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZFBsdWdpbiBjYXRlZ29yeVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5KTsKLQkJCWlmIChjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkmJiBjYXRlZ29yeVBsdWdpbiA9PSBjb25zdW1lclBsdWdpbgotCQkJCQkmJiBUbmdVdGlsLmlzRW1wdHkoY2F0ZWdvcnkpKSB7Ci0JCQkJRWNvcmVVdGlsLnJlbW92ZShjYXRlZ29yeSk7Ci0JCQkJaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoY2F0ZWdvcnlQbHVnaW4pCi0JCQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5yZW1vdmUoY2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IGdldENhdGVnb3J5UGFja2FnZVBhdGgoY2F0ZWdvcnkpOwotCQkJCS8vIHBhdGggY2FuIGJlIG51bGwgaWYgdGhlIGNhdGVnb3J5IGlzIGRlbGV0ZWQKLQkJCQkvLwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJCQljb25zdW1lclBsdWdpbiwgcGF0aCk7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmlidXRvciA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKAotCQkJCQkJCWNhdGVnb3J5UGtnLCBjYXRlZ29yeSk7Ci0JCQkJCWlmIChjb250cmlidXRvciAhPSBudWxsICYmIFRuZ1V0aWwuaXNFbXB0eShjb250cmlidXRvcikpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY29udHJpYnV0b3IpOwotCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShjb25zdW1lclBsdWdpbikKLQkJCQkJCQkJCS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkucmVtb3ZlKGNvbnRyaWJ1dG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVRhc2tzKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFRhc2suY2xhc3MsIGNhdGVnb3J5LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlV29ya1Byb2R1Y3RzKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQkvLyAvLyBzcGVjaWFsIGhhbmRsaW5nIHRvIGRpc2FsbG93IGFzc2lnbWVudCBvZiB3b3JrIHByb2R1Y3RzIHRvIGRvbWFpbgotCQkvLyB3aXRoIHN1YmRvbWFpbnMKLQkJLy8gLy8KLQkJLy8gaWYoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEb21haW4gJiYKLQkJLy8gISgoRG9tYWluKWNhdGVnb3J5KS5nZXRTdWJkb21haW5zKCkuaXNFbXB0eSgpKSB7Ci0JCS8vIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkvLyB9Ci0KLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhXb3JrUHJvZHVjdC5jbGFzcywgY2F0ZWdvcnksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVSb2xlcyhDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhSb2xlLmNsYXNzLCBjYXRlZ29yeSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBjb250ZW50IGVsZW1lbnQKLQkgKiB0byByZWZlcmVuY2UgdG8KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudFR5cGUKLQkgKiAgICAgICAgICAgIGNvbmNyZWN0IGNsYXNzIG9mIHRoZSB0aGUgZ2l2ZW4gY29udGVudCBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGxvY2FsT25seQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGVsZW1lbnQncyBwbHVnaW4gYXJlCi0JICogICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoQ2xhc3MgbWV0aG9kRWxlbWVudFR5cGUsCi0JCQlDb250ZW50RWxlbWVudCBlbGVtZW50LCBib29sZWFuIGxvY2FsT25seSkgewotCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1vZGVsTGlzdDsKLQkJaWYgKGxvY2FsT25seSkgewotCQkJbW9kZWxMaXN0ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkpOwotCQl9IGVsc2UgewotCQkJbW9kZWxMaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGVsZW1lbnQpOwotCQl9Ci0JCWludCBzaXplID0gbW9kZWxMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBtb2RlbCA9IChNZXRob2RQbHVnaW4pIG1vZGVsTGlzdC5nZXQoaSk7Ci0JCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKG1vZGVsLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCQlpZiAoY29yZUNvbnRlbnRQa2cgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVRyZWVJdGVyYXRvciBpdGVyYXRvciA9IGNvcmVDb250ZW50UGtnLmVBbGxDb250ZW50cygpOwotCi0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobWV0aG9kRWxlbWVudFR5cGUuaXNJbnN0YW5jZShvYmopICYmIG9iaiAhPSBlbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnRMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoZWxlbWVudExpc3QsIG5hbWVDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUYXNrcyhSb2xlIHJvbGUpIHsKLQkJLy8gV2hpbGUgZWRpdGluZyBhIHJvbGUsIHlvdSBvbmx5IGNhbiBhc3NpZ24gdGhpcyByb2xlIHRvIGEgdGFzayBpbiB0aGUKLQkJLy8gc2FtZSBwbHVnaW4uCi0JCS8vIE90aGV3aXNlIHlvdSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBwbHVnaW4uCi0JCS8vCi0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoVGFzay5jbGFzcywgcm9sZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJLy8gV2hpbGUgZWRpdGluZyBhIHdvcmsgcHJvZHVjdCwgeW91IG9ubHkgY2FuIGFzc2lnbiB0aGlzIHdvcmsgcHJvZHVjdAotCQkvLyB0byBhIHRhc2sgaW4gdGhlIHNhbWUgcGx1Z2luLgotCQkvLyBPdGhld2lzZSB5b3Ugd2lsbCBtb2RpZnkgdGhlIGJhc2UgcGx1Z2luLgotCQkvLwotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFRhc2suY2xhc3MsIHdwLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVSb2xlcyhXb3JrUHJvZHVjdCB3cCkgewotCQkvLyBXaGlsZSBlZGl0aW5nIGEgd29yayBwcm9kdWN0LCB5b3Ugb25seSBjYW4gYXNzaWduIHRoaXMgd29yayBwcm9kdWN0Ci0JCS8vIHRvIGEgcm9sZSBpbiB0aGUgc2FtZSBwbHVnaW4uCi0JCS8vIE90aGV3aXNlIHlvdSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBwbHVnaW4uCi0JCS8vCi0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoUm9sZS5jbGFzcywgd3AsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlV29ya1Byb2R1Y3RzKFJvbGUgcm9sZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFdvcmtQcm9kdWN0LmNsYXNzLCByb2xlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVXb3JrUHJvZHVjdHMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoV29ya1Byb2R1Y3QuY2xhc3MsIHRhc2ssIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVzKFRhc2sgdGFzaykgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFJvbGUuY2xhc3MsIHRhc2ssIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0ZXBMaXN0KFRhc2sgdGFzaykgewotCQlpZiAodGFzay5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUwotCQkJCXx8IHRhc2suZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJCWZpbmFsIExpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJc3luY2hyb25pemVkICh0eXBlcykgewotCQkJCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQl0eXBlcy5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQkJCQkJCXR5cGVzLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJdGVyYXRvciBleHRlbmRlZCA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlKSB7Ci0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCk7Ci0JCQkJCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpCi0JCQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJCUxpc3Qgb3V0cHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbGlzdC5nZXQoaSk7Ci0JCQkJCQlpZiAodHlwZXMuY29udGFpbnMoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQkJCQlvdXRwdXRMaXN0LmFkZChlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gb3V0cHV0TGlzdC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX07Ci0JCQlmb3IgKDsgZXh0ZW5kZWQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdCA9IChUYXNrKSBleHRlbmRlZC5uZXh0KCk7Ci0JCQkJdC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiYXNlCi0JICogQHBhcmFtIHZhcmlhYmlsaXR5VHlwZXMKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgQ29sbGVjdGlvbiB2YXJpYWJpbGl0eVR5cGVzKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0RXh0ZW5kZWQobGlzdCwgYmFzZSwgdmFyaWFiaWxpdHlUeXBlcyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RXh0ZW5kZWQoTGlzdCBvdXRwdXRMaXN0LCBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwKLQkJCUNvbGxlY3Rpb24gdmFyaWFiaWxpdHlUeXBlcykgewotCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoYmFzZSk7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKHZhcmlhYmlsaXR5VHlwZXMuY29udGFpbnMoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQlvdXRwdXRMaXN0LmFkZChlKTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBsaXN0LmdldChpKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGVzLmNvbnRhaW5zKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJZ2V0RXh0ZW5kZWQob3V0cHV0TGlzdCwgYmFzZSwgdmFyaWFiaWxpdHlUeXBlcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldENhdGVnb3J5UGFja2FnZVBhdGgoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCUVPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJZm9yIChwYXJlbnQgPSBjYXRlZ29yeS5lQ29udGFpbmVyKCk7IHBhcmVudCAhPSBudWxsCi0JCQkJJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSk7IHBhcmVudCA9IHBhcmVudAotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IChDb250ZW50UGFja2FnZSkgcGFyZW50OwotCQlyZXR1cm4gTWlzYy5nZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihjYXRlZ29yeVBrZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1M2E5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFBVQkxJU0hfTU9ERSA9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3I8RUNsYXNzPiB0eXBlQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPEVDbGFzcz4oKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKEVDbGFzcyBvMSwgRUNsYXNzIG8yKSB7Ci0JCQlyZXR1cm4gbzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXROYW1lKCkpOwotCQl9Ci0JCQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PEVDbGFzcz4gaW5jbHVkZWRFbGVtZW50VHlwZXM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFQ2xhc3M+IGV4Y2x1ZGVkVHlwZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBFQ2xhc3NbXSB7Ci0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3IoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0S2luZCgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQl9KTsKLQkKLQkvKioKLQkgKiBDaGVjayBpcyBnaXZlbiBwbHVnaW4gbmFtZSBpcyB2YWxpZCBuYW1lIGluIHRoZSBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUGx1Z2luTmFtZShNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmV3TmFtZSkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJcmV0dXJuIElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVZhbGlkYXRvcihsaWIsCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJKElGaWx0ZXIpIG51bGwsIG51bGwsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkKLQkJCQkuaXNWYWxpZChuZXdOYW1lKTsJCQotCX0KLQotCS8qKgotCSAqIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhIHBsdWdpbiBvciBwYWNrYWdlIHNvIHRoYXQgaXMgY2FuIGJlIHNlbGVjdGVkIGluIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiAKLQkgKiBNYXkgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGlzLgotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2VsZWN0YWJsZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgc2VsZWN0YWJsZS4KLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICogQHJldHVybiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldFNlbGVjdGFibGUoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJRU9iamVjdCBwa2cgPSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJCXdoaWxlIChwa2cgIT0gbnVsbCAmJiAhKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpICkgewotCQkJCXBrZyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGtnOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlFT2JqZWN0IHBhcmVudCA9IGVsZW1lbnQ7Ci0JCQl3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAhc2VsZWN0YWJsZShwYXJlbnQpKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsKLQkJCX0KLQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbWV0aG9kIHBsdWdpbiBmb3IgdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICogQHJldHVybiBNZXRob2RQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oRU9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIEVPYmplY3QgcGFyZW50ID0gZWxlbWVudDsKLQkJLy8gd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCS8vIHBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcmV0dXJuIChNZXRob2RQbHVnaW4pIHBhcmVudDsKLQotCQlyZXR1cm4gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgcHJpbnRhYmxlIG5hbWUgc3RyaW5nIGZvciB0aGUgZWxlbWVudC4gTm90ZSwgdGhpcyBpcyBub3QgdGhlIGVsZW1lbnQgbmFtZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gZWxlbWVudCBPYmplY3QKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnVua25vd25fdGV4dDsgCi0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0RnVsbE5hbWUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBwcmludGFibGUgbmFtZSBmb3IgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChzZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmZmVyLmFwcGVuZCgiWyIpLmFwcGVuZChlbGVtZW50LmdldE5hbWUoKSkuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50OwotCQkJd2hpbGUgKChwYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgcGFyZW50LmVDb250YWluZXIoKSkgIT0gbnVsbCkgewotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlidWZmZXIuaW5zZXJ0KDAsICJbIiArIHBhcmVudC5nZXROYW1lKCkgKyAiXS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQncyB0eXBlOm5hbWUgYXMgYSBsb2NhbGl6ZWQgc3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxpemVUeXBlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCVN0cmluZyBuYW1lU3RyID0gVG5nVXRpbC5nZXRUeXBlVGV4dChlbGVtZW50KSArIExpYnJhcnlSZXNvdXJjZXMuY29sb25fd2l0aF9zcGFjZSA7Ci0JCQkKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpICE9IG51bGwpIHsKLQkJCQluYW1lU3RyICs9ICIoIiArICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyAiKSAiICsgKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQluYW1lU3RyICs9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIG5hbWVTdHIgOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFR5cGVOYW1lKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCdzIHR5cGU6bmFtZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCA9PSBudWxsID8gIiIgOiBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBlbGVtZW50LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCdzIHR5cGU6bmFtZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCA9PSBudWxsID8gIiIgOiBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCQotCS8qKgotCSAqIGdldCB0aGUgbWV0aG9kIHBsdWdpbnMgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gbGlicmFyeSBNZXRob2RMaWJyYXJ5Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBNZXRob2RQbHVnaW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbnMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4obGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgZ3VpZCBzdHJpbmdzIG9mIHRoZSBtZXRob2QgcGx1Z2lucyBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWV0aG9kUGx1Z2luR3VpZHMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaXRlbXMuYWRkKGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIE1ldGhvZFBsdWdpbiBpbiB0aGUgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gZ3VpZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeSBNZXRob2RMaWJyYXJ5Ci0JICogQHBhcmFtIHBsdWdpbkd1aWQgU3RyaW5nCi0JICogQHJldHVybiBNZXRob2RQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oTWV0aG9kTGlicmFyeSBsaWJyYXJ5LAotCQkJU3RyaW5nIHBsdWdpbkd1aWQpIHsKLQkJaWYgKHBsdWdpbkd1aWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlMaXN0IGVsZW1lbnRzID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJCWlmIChwbHVnaW5HdWlkLmVxdWFscyhlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgTWV0aG9kUGx1Z2luIGluIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIHBsdWdpbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbkJ5TmFtZShNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIGdldCBhbGwgdGhlIGNvbnRhaW5lZCBNZXRob2RQYWNrYWdlcyBmb3IgdGhlIGVsZW1lbnQsIHJldHVybiBlbXB0eSBsaXN0IGlmIG5vdGhpbmcgZm91bmQuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNZXRob2RQYWNrYWdlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlpdGVtcy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogdXB3cmFwIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqIE9iamVjdAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgdW53cmFwKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JfQotCi0JLyoqCi0JICogdW53cmFwIHRoZSBjb21tYW5kCi0JICogQHBhcmFtIGNtZCBDb21tYW5kCi0JICogQHJldHVybiBDb21tYW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tYW5kIHVud3JhcChDb21tYW5kIGNtZCkgewotCQlyZXR1cm4gVG5nVXRpbC51bndyYXAoY21kKTsKLQl9Ci0KLQkvKioKLQkgKiBjbGVhciB0aGUgcmVzb3VyY2UgdGhlIGVsZW1lbnRzIGFzc29jaWF0ZWQgdG8uIFNvIHRoYXQgdGhlIGVsZW1lbnQgY2FuIGJlCi0JICogYWRkZWQgdG8gYW5vdGhlciBsaWJyYXJ5IGFuZCBnb3QgbmV3IHJlc291cmNlIGFzc2lnbmVkLgotCSAqIAotCSAqIEBwYXJhbSBpbXBvcnRMaWJyYXR5Ci0JICogICAgICAgICAgICBNZXRob2RMaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRldGFjaEZyb21SZXNvdXJjZShNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHkpIHsKLQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gaW1wb3J0TGlicmF0eS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlyZXNTZXQgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotCi0JCWlmIChyZXNTZXQgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlSXRlcmF0b3IgaXQgPSByZXNTZXQuZ2V0QWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG9iaikuZVNldFJlc291cmNlKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNsZWFyIGFsbCB0aGUgdW5yZXNvbHZlZCBwcm94aWVzCi0JCWNsZWFyUHJveGllcyhpbXBvcnRMaWJyYXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBjbGVhciBwcm94eSBmb3IgdGhlIGVsZW1lbnQuIFRoaXMgaXMgdXNlZCB0byBmaXggdGhlIGVsZW1lbnQgd2hlbiB0aGUgcHJveHkgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0JICogQHBhcmFtIGVsZW1lbnQgRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclByb3hpZXMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmVJc1Byb3h5KCkpIHsKLQkJCS8vIHJlc2V0IHRoZSBwcm94eSB0byBudWxsCi0JCQlzZXRQcm94eVVSSShlbGVtZW50LCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGl0ZXJhdGUgdGhlIGNoaWxkcmVuCi0JCQlmb3IgKFRyZWVJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWlmIChvLmVJc1Byb3h5KCkpIHsKLQkJCQkJc2V0UHJveHlVUkkobywgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBvYmplY3QncyBwcm94eSB1cmkKLQkgKiBAcGFyYW0gb2JqIEVPYmplY3QKLQkgKiBAcGFyYW0gdXJpIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJveHlVUkkoRU9iamVjdCBvYmosCi0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIHVyaSkgewotCQkoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpIG9iaikuZVNldFByb3h5VVJJKHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRMb2FkZWRSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIsIENvbGxlY3Rpb248UmVzb3VyY2U+IGV4Y2x1ZGVzKSB7Ci0KLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZGVkcmVzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKWl0Lm5leHQoKTsKLQkJCWlmICggcmVzLmlzTG9hZGVkKCkgKSB7Ci0JCQkJaWYgKCAoZXhjbHVkZXMgPT0gbnVsbCkgfHwgIWV4Y2x1ZGVzLmNvbnRhaW5zKHJlcykgKSB7Ci0JCQkJCWxvYWRlZHJlcy5hZGQocmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCQotCQlyZXR1cm4gbG9hZGVkcmVzOwotCX0KLQkKLQkvKioKLQkgKiBsb2FkIGFsbCBlbGVtZW50cyBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZEFsbChNZXRob2RMaWJyYXJ5IGxpYikgewotCi0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWRlZHJlcyA9IGdldExvYWRlZFJlc291cmNlcyhsaWIsIG51bGwpOwotCQkKLQkJbG9hZEFsbENvbnRhaW5lZChsaWIpOwotCQkKLQkJcmV0dXJuIGdldExvYWRlZFJlc291cmNlcyhsaWIsIGxvYWRlZHJlcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxDb250YWluZWQoTWV0aG9kRWxlbWVudCBtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXIgPSBtZS5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsUGx1Z2lucyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1aWducyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luOiBwbHVpZ25zKSB7Ci0JCQlsb2FkQWxsQ29udGFpbmVkKHBsdWdpbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogbG9hZCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxQcm9jZXNzZXMoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIHNhdmUgYWxsIGVsZW1lbnRzIGluIHRoZSBsaWJyYXJ5IG5vdCBtYXR0ZXIgdGhlIGVsZW1lbnQgaXMgY2hhbmdlZCBvciBub3QuIAotCSAqIERvbid0IHJlZnJlc2ggdGhlIHdvcmtzcGFjZS4KLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlQWxsKE1ldGhvZExpYnJhcnkgbGliKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2F2ZUxpYnJhcnkobGliLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBsaWJyYXJ5IHJlc291cmNlc2V0LiBZb3UKLQkgKiBuZWVkIHRvIHNldCB0aGUgcmVzb3VyY2Ugc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvIHNhdmUgdGhlCi0JICogbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBsaWIKLQkgKiAgICAgICAgICAgIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gc2F2ZUFsbAotCSAqICAgICAgICAgICAgYm9vbGVhbiBpZiB0cnVlLCBmb3JjZSBzYXZpbmcgYWxsIHRoZSByZXNvdXJjZXMgZXZlbiBpZiB0aGV5Ci0JICogICAgICAgICAgICBhcmUgbm90IG1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYiwgYm9vbGVhbiBzYXZlQWxsLAotCQkJYm9vbGVhbiByZWZyZXNoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlSZXNvdXJjZVNldCBsaWJSZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYobGliUmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGxpYlJlc291cmNlU2V0OwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuZ2V0U2F2ZU9wdGlvbnMoKQotCQkJCQk6IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCS8vIGJhY2sgdXAgY3VycmVudCBSRUZSRVNIX05FV19SRVNPVVJDRSBvcHRpb24KLQkJCU9iamVjdCBvbGQgPSBzYXZlT3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UpOwotCQkJT2JqZWN0IG9sZENoZWNrTW9kaWZ5ID0gc2F2ZU9wdGlvbnMKLQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZKTsKLQkJCXRyeSB7Ci0JCQkJLy8gZGlzYWJsZSB3b3Jrc3BhY2UgcmVmcmVzaCB3aGVuIG5ldyBmaWxlIGlzIGNyZWF0ZWQKLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UsCi0JCQkJCQlyZWZyZXNoID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBzYXZlIHJlc291cmNlIHNldCBoZXJlCi0JCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgc2F2ZUFsbCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vIHJlc3RvcmUgUkVGUkVTSF9ORVdfUkVTT1VSQ0Ugb3B0aW9uCi0JCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFLCBvbGQpOwotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksIG9sZENoZWNrTW9kaWZ5KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWxpYlJlc291cmNlU2V0LnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIGxpYnJhcnkgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiByZXR1cm4gdGhlIE1ldGhvZExpYnJhcnkuCi0JICogVGhpcyBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20gdGhlIHRoZSBvcGVuIGxpYnJhcnkgaW4gTGlicmFyeVNlcnZpY2UuIAotCSAqIEl0IG9ubHkgbG9hZCB0aGUgcm93IGxpYnJhcnkgb2JqZWN0IGJ1dCB3aWxsIG5vdCBpbXBhY3QgdGhlIGN1cnJlbnQgRVBGIGVudmlyb25tZW50LgotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZExpYnJhcnkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShTdHJpbmcgbGlicmFyeVBhdGgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IFBlcnNpc3RlbmNlU2VydmljZS5JTlNUQU5DRS5jcmVhdGVSZXNvdXJjZVNldChTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JCXJlc291cmNlU2V0LmxvYWRNZXRob2RMaWJyYXJpZXMoVVJJLmNyZWF0ZUZpbGVVUkkobGlicmFyeVBhdGgpLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQuZ2V0Rmlyc3RNZXRob2RMaWJyYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByb290IHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRMaWJyYXJ5Um9vdFBhdGgoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJUmVzb3VyY2UgcmVzID0gbGliLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVVJJIHVyaSA9IHJlcy5nZXRVUkkoKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCBwYWNrYWdlcyBpbiB0aGUgcGx1Z2luCi0JICogQHBhcmFtIHBsdWdpbiBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsUGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IGFsbFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTGlzdCBwa2dzID0gcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCk7Ci0JCWFsbFBrZ3MuYWRkQWxsKHBrZ3MpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgYWxsUGtncyk7Ci0JCX0KLQotCQlyZXR1cm4gYWxsUGtnczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYWxsIGNoaWxkIHBhY2thZ2VzIG9mIHRoZSBnaXZlbiBNZXRob2RQYWNrYWdlIGFuZCBhZGQgdG8gdGhlIGxpc3QKLQkgKiBAcGFyYW0gcGtnIE1ldGhvZFBhY2thZ2UKLQkgKiBAcGFyYW0gcmVzdWx0IExpc3QgdGhlIHBhY2thZ2VzIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbENoaWxkUGFja2FnZXMoTWV0aG9kUGFja2FnZSBwa2csIExpc3QgcmVzdWx0KSB7Ci0JCUxpc3QgcGtncyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCXJlc3VsdC5hZGRBbGwocGtncyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCByZXN1bHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCBjb25maWd1cmF0aW9ucyByZWZlcmVuY2VkIGJ5IHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldEFzc29jaWF0ZWRDb25maWd1cmF0aW9ucyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCS8vIGdldCB0aGUgY29uZmlncyB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXRob2QgcGx1Z2luCi0JCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gYWxsQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLS8qCQlMaXN0IGNvbmZpZ3MgPSAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGx1Z2luKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShBc3NvY2lhdGlvbkhlbHBlci5NZXRob2RQbHVnaW5fTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQlhZGRVbmlxdWVJdGVtcyhjb25maWdzLCBhbGxDb25maWdzKTsKLQotCQkvLyBnZXQgdGhlIGNvbmZpZ3MgdGhhdCByZWZlcmVuY2VzIHRoZSBwYWNrYWdlcyBpbiB0aGlzIHBsdWdpbgotCQlMaXN0IHBrZ3MgPSBnZXRBbGxQYWNrYWdlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBvID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpdC5uZXh0KCk7Ci0KLQkJCWNvbmZpZ3MgPSAoTGlzdCkgbwotCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCQlhZGRVbmlxdWVJdGVtcyhjb25maWdzLCBhbGxDb25maWdzKTsKLQkJfQotKi8KLQkJLy8gZ2V0IHRoZSBjb25naWd1cmF0aW9ucyB0aGF0IHJlZmVyZW5jZWQgYnkgdGhlIHByb2Nlc3NlcyBpbiB0aGlzCi0JCS8vIHBsdWdpbgotCQlMaXN0IHByb2NzID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2NzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgaXQKLQkJCQkJLm5leHQoKTsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gYyA9IHAuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCWlmICgoYyAhPSBudWxsKSAmJiAhYWxsQ29uZmlncy5jb250YWlucyhjKSkgewotCQkJCWFsbENvbmZpZ3MuYWRkKGMpOwotCQkJfQotCQkJYWRkVW5pcXVlSXRlbXMocC5nZXRWYWxpZENvbnRleHQoKSwgYWxsQ29uZmlncyk7Ci0JCX0KLQotCQlyZXR1cm4gYWxsQ29uZmlnczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFVuaXF1ZUl0ZW1zKExpc3QgZnJvbSwgTGlzdCB0bykgewotCQlpZiAoZnJvbSA9PSBudWxsIHx8IHRvID09IG51bGwgfHwgZnJvbS5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGZyb20uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXRvLmNvbnRhaW5zKG8pKSB7Ci0JCQkJdG8uYWRkKG8pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgZm9yY2luZyB0byBzZWxlY3QgdGhlIGdsb2JhbCBwYWNrYWdlcyBvZgotCSAqIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Z2lucywgdGhpcyBpcyBuZWVkZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXhwb3J0aW5nLgotCSAqIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1nciBpZiBub3QgbnVsbCwgd2lsbCB1c2UgdGhlIGdpdmVuIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBjaGFuZ2VkIGRpcmVjdGx5Ci0JICogQHBhcmFtIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotLy8JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLS8vCQlMaXN0IHBrZ1NlbHMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLS8vCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0cC5uZXh0KCk7Ci0vLwkJCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLS8vCQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQkJT2JqZWN0IHBrZyA9IGl0Lm5leHQoKTsKLS8vCQkJCWlmICghcGtnU2Vscy5jb250YWlucyhwa2cpKSB7Ci0vLwkJCQkJcGtnU2Vscy5hZGQocGtnKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQkJCi0JCS8vIG1vdmVkIHRvIFRuZ1V0aWwKLQkJVG5nVXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oYWN0aW9uTWdyLCBjb25maWcpOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGZvcmNpbmcgdG8gc2VsZWN0IHRoZSBnbG9iYWwgcGFja2FnZXMgb2YKLQkgKiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWdpbnMsIHRoaXMgaXMgbmVlZGVkIGZvciBjb25maWd1cmF0aW9uIGV4cG9ydGluZy4KLQkgKiBJZiBnbG9iYWwgcGFja2FnZXMgYXJlIG1pc3NpbmcsIHRoZSBleHBvcnRlZCBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGNvcHlyaWdodCBvYmplY3QgZm9yIGFuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRDb3B5cmlnaHQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBzbSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVW5pdCkgewotCQkJc20gPSAoKE1ldGhvZFVuaXQpIGVsZW1lbnQpLmdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCXNtID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpCi0JCQkJCS5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJfQotCi0JCS8vIGlmIG5vIGNvcHlyaWdodCBvZiBpdCdzIG93biwgZ2V0IHRoZSBjb3B5cmlnaHQgZnJvbSB0aGUgcGx1Z2luCi0JCWlmIChzbSA9PSBudWxsKSB7Ci0JCQlNZXRob2RQbHVnaW4gcCA9IGdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQlzbSA9IHAuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc207Ci0JfQotCi0JLyoqCi0JICogZm9yIHRoZSBnaXZlbiBjb250YWluZXIgYW5kIGVsZW1lbnRzIGxpc3QsIGNoZWNrIGlmIHRoZSBlbGVtZW50IGluIHRoZSBsaXN0IGlzIGNvbnRhaW5lZCBieSB0aGUgY29udGFpbmVyIG9yIG5vdC4gCi0JICogcmV0dXJuIGFsbCB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGZvciBhIGdpdmVuIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBjb250YWluZXIgT2JqZWN0Ci0JICogQHBhcmFtIGVsZW1lbnRzIENvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0Q29udGFpbmVkRWxlbWVudHMoT2JqZWN0IGNvbnRhaW5lciwKLQkJCUNvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQljb250YWluZXIgPSAoKFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSBjb250YWluZXIpLmdldFRhcmdldCgpOwotCQl9Ci0JCUFycmF5TGlzdCBjb250YWluZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkoKEVPYmplY3QpIGVsZW1lbnQsIGNvbnRhaW5lcikpIHsKLQkJCQljb250YWluZWQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZWQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdHdvIG1ldGhvZCBlbGVtZW50IGFyZSBpZGVudGljYWwgb3Igbm90LiBUd28gZWxlbWVudHMgYXJlCi0JICogaWRlbnRpY2FsIGlmIGFuZCBvbmx5IGlmOiBhbGwgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGVxdWFsIGFsbCB0aGUKLQkgKiByZWZlcmVuY2VkIGVsZW1lbnRzIGFyZSBlcXVhbCBhbGwgdGhlIGNvbnRhaW5lZCBlbGVtZW50cyBhcmUgaWRlbnRpY2FsCi0JICogCi0JICogQHBhcmFtIG9sZE9iagotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJZGVudGljYWwoTWV0aG9kRWxlbWVudCBvbGRPYmosIE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0KLQkJaWYgKChvbGRPYmogPT0gbnVsbCkgJiYgKG5ld09iaiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoKG9sZE9iaiA9PSBudWxsKSB8fCAobmV3T2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyB0aGlzIGRvZXMgbm90IHdvcmssIHRoZSB0b1N0cmluZyBjb250YWlucyB0aGUgb2JqZWN0IGluc3RhbmNlIGluZm8KLQkJLy8gcmV0dXJuIG9sZE9iai50b1N0cmluZygpLmVxdWFscyhuZXdPYmoudG9TdHJpbmcoKSk7Ci0KLQkJTGlzdCBmZWF0dXJlcyA9IGdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IG9sZE9iai5lR2V0KGZlYXR1cmUpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChvbGRWYWx1ZSA9PSBudWxsICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKG9sZFZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCi0JCQkJCS8vIGlmIGl0J2MgY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSwgaXRlcmF0ZSBpdAotCQkJCQlNZXRob2RFbGVtZW50IG9sZGUgPSAoTWV0aG9kRWxlbWVudCkgb2xkVmFsdWU7Ci0JCQkJCWlmIChvbGRlLmVDb250YWluZXIoKSA9PSBvbGRPYmopIHsKLQkJCQkJCWlmICghaXNJZGVudGljYWwob2xkZSwgKE1ldGhvZEVsZW1lbnQpIG5ld1ZhbHVlKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJTGlzdCBvbGRsID0gKExpc3QpIG9sZFZhbHVlOwotCQkJCQlMaXN0IG5ld2wgPSAoTGlzdCkgbmV3VmFsdWU7Ci0JCQkJCWlmIChvbGRsLnNpemUoKSAhPSBuZXdsLnNpemUoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJZm9yIChpbnQgeCA9IDA7IHggPCBvbGRsLnNpemUoKTsgeCsrKSB7Ci0JCQkJCQlPYmplY3QgbyA9IG9sZGwuZ2V0KHgpOwotCQkJCQkJT2JqZWN0IG4gPSBuZXdsLmdldCh4KTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCS8vIGlmIGl0J2MgY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSwgaXRlcmF0ZSBpdAotCQkJCQkJCU1ldGhvZEVsZW1lbnQgb2xkZSA9IChNZXRob2RFbGVtZW50KSBvOwotCQkJCQkJCWlmIChvbGRlLmVDb250YWluZXIoKSA9PSBvbGRPYmopIHsKLQkJCQkJCQkJaWYgKCFpc0lkZW50aWNhbChvbGRlLCAoTWV0aG9kRWxlbWVudCkgbikpIHsKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKCFvLmVxdWFscyhuKSkgewotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBwcm9jZXNzIG9yIG5vdC4gCi0JICogQSBQcm9jZXNzIGlzIGEgQ2FwYWJpbGl0eVBhdHRlcm4gb3IgRGVsaXZlcnlQcm9jZXNzIG9iamVjdCAKLQkgKiB0aGF0IGlzIGNvbnRhaW5lZCBieSBhIFByb2Nlc3NDb21wb25lbnQuCi0JICogQHBhcmFtIGUgRU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2Nlc3MoRU9iamVjdCBlKSB7Ci0JCXJldHVybiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgJiYgCi0JCQkoZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFZhbGlkVmlld3MoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCi0JCUxpc3Qgdmlld3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpaXQubmV4dCgpOwotCQkJaWYgKCAhQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRyaWJ1dG9yKHZpZXcpICkgewotCQkJCXZpZXcgPSAoQ29udGVudENhdGVnb3J5KUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodmlldywgY29uZmlnKTsKLQkJCQlpZiAoIHZpZXcgIT0gbnVsbCAmJiAhdmlld3MuY29udGFpbnModmlldykgKSB7Ci0JCQkJCXZpZXdzLmFkZCh2aWV3KTsKLQkJCQl9IAotCQkJfQkKLQkJfQotCQkJCQotCQlyZXR1cm4gdmlld3M7Ci0JfQotCQotLy8JcHVibGljIHN0YXRpYyBMaXN0IGdldFN1cGVyQWN0aXZpdGllcyhCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotLy8KLS8vCQkvLyBidWlsZCB0aGUgcGFyZW50IG5vZGVzCi0vLwkJQnJlYWtkb3duRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50LmdldFN1cGVyQWN0aXZpdGllcygpOyAKLS8vCQl3aGlsZSAoIHBhcmVudCAhPSBudWxsICkgewotLy8JCQlpdGVtcy5hZGQoMCwgcGFyZW50KTsKLS8vCQkJaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhwYXJlbnQpICkgewotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQkJcGFyZW50ID0gcGFyZW50LmdldFN1cGVyQWN0aXZpdGllcygpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGl0ZW1zOwotLy8JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHN0cnVjdHVyYWwgZmVhdHVyZXMgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0KLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJTGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCQkvLyBnZXQgYWxsIGZlYXR1cmVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFUHJvcGVydHkgcHJvcGVydHkgPSAoRVByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHByb3BlcnR5Ci0JCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZlYXR1cmVzOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8RUNsYXNzPiBnZXRJbmNsdWRlZEVsZW1lbnRUeXBlcygpIHsKLQkJaWYgKGluY2x1ZGVkRWxlbWVudFR5cGVzID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVV0aWwuY2xhc3MpIHsKLQkJCQlpZiAoaW5jbHVkZWRFbGVtZW50VHlwZXMgPT0gbnVsbCkgewotCQkJCQlpbmNsdWRlZEVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8RUNsYXNzPigpOwotCQkJCQlmb3IgKEVDbGFzc2lmaWVyIGNscyA6IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEVDbGFzc2lmaWVycygpKSB7Ci0JCQkJCQlpZiAoY2xzIGluc3RhbmNlb2YgRUNsYXNzCi0JCQkJCQkJCSYmIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JCQkJCQkJCQkJLmlzU3VwZXJUeXBlT2YoKEVDbGFzcykgY2xzKSkgewotCQkJCQkJCWluY2x1ZGVkRWxlbWVudFR5cGVzLmFkZCgoRUNsYXNzKSBjbHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWluY2x1ZGVkRWxlbWVudFR5cGVzLnJlbW92ZUFsbChleGNsdWRlZFR5cGVzKTsKLQkJCQkJQ29sbGVjdGlvbnMuc29ydChpbmNsdWRlZEVsZW1lbnRUeXBlcywgdHlwZUNvbXBhcmF0b3IpOwotCQkJCQlpbmNsdWRlZEVsZW1lbnRUeXBlcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoaW5jbHVkZWRFbGVtZW50VHlwZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5jbHVkZWRFbGVtZW50VHlwZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGdldEluY2x1ZGVkRWxlbWVudHMoQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBpbmNsdWRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+KCk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGluY2x1ZGVkRWxlbWVudHM7Ci0JCX0KLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoY2F0ZWdvcnksIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DVVNUT01fQ0FURUdPUllfX0lOQ0xVREVEX0VMRU1FTlRTKTsKLQkJRUNsYXNzaWZpZXIgY2xzID0gcHJvcCA9PSBudWxsID8gbnVsbCA6IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVyKHByb3AuZ2V0VmFsdWUoKSk7Ci0JCWlmKGNscyBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGNsczsKLQkJCWlmIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKS5pc1N1cGVyVHlwZU9mKGVDbGFzcykpIHsKLQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KSBjb25maWcKLQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlQ2xhc3MuaXNJbnN0YW5jZShlT2JqZWN0KSkgewotCQkJCQkJaW5jbHVkZWRFbGVtZW50cy5hZGQoKERlc2NyaWJhYmxlRWxlbWVudCkgZU9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVkRWxlbWVudHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNmY2OTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMb2cgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgSU5TVEFOQ0UgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldExvZ2dlcigpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9NaWdyYXRpb25VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9NaWdyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjA5MzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciB0aGUgTWlncmF0aW9uIFNlcnZpY2UuCi0gKgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGFuZCA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICogaW4gdGhlIGN1cnJlbnQgTWV0aG9kIExpYnJhcnkuCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbilpLm5leHQoKTsKLQkJCVN0cmluZyBjYXBhYmlsaXR5UGF0dGVyblBhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwgY2FwYWJpbGl0eVBhdHRlcm5QYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0JCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSltZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlICA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4paS5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgY29udGV4dHMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzcy4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24paS5uZXh0KCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnB1dChjb250ZXh0LmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1hcCBvZiBhbGwgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGluIGEgZ2l2ZW4gPGNvZGU+UHJvY2Vzc1BhY2thZ2U8L2NvZGU+LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLCBNYXAgcmVzdWx0KSB7Ci0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KW9iajsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgID0gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSlvYmosIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBtYXAgb2YgYWxsIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4gaW4gYSBnaXZlbiA8Y29kZT5Qcm9jZXNzUGFja2FnZTwvY29kZT4uCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXREZWxpdmVyeVByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwgTWFwIHJlc3VsdCkgewotCQlMaXN0IGNoaWxkUGFja2FnZXMgPSBwcm9jZXNzUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudClvYmo7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzICA9IHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2Upb2JqLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEFjdGl2aXRpZXMoUHJvY2VzcyBwcm9jZXNzKXsKLQkJcmV0dXJuIGdldEFjdGl2aXRpZXMocHJvY2VzcywgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRBY3Rpdml0aWVzKFByb2Nlc3MgcHJvY2VzcywgYm9vbGVhbiBsaW5rZWRIYXNoTWFwKXsKLQkJTWFwIHJlc3VsdCA9IGxpbmtlZEhhc2hNYXAgPyBuZXcgTGlua2VkSGFzaE1hcCgpIDogbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihkZWZhdWx0Q29udGV4dCk7Ci0JCWdldEFjdGl2aXRpZXMocHJvY2VzcywgcmVzdWx0LCBmaWx0ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmV0dXJucyBMaXN0IG9mIGFjdGl2aXRpZXMgKHJlY3Vyc2l2ZWx5KSBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9uIAotCSAqIHVuZGVyIGEgUHJvY2VzcyAoPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBvciA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4pLiAgCi0JICogIEBwYXJhbSBBY3Rpdml0eQotCSAqICBAcGFyYW0gTWFwCi0JICogIEBwYXJhbSBQcm9jZXNzQ29uZmlndXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldEFjdGl2aXRpZXMoQWN0aXZpdHkgcHJvY2VzcywgTWFwIHJlc3VsdCwgUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIpewotCQlyZXN1bHQucHV0KHByb2Nlc3MuZ2V0TmFtZSgpLCBwcm9jZXNzKTsKLQkJTGlzdCBsaXN0ID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlpZihsaXN0LnNpemUoKSA+IDApewotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJaWYoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChvYmplY3QpKXsKLQkJCQkJCXJlc3VsdC5wdXQoKChBY3Rpdml0eSlvYmplY3QpLmdldE5hbWUoKSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlnZXRBY3Rpdml0aWVzKChBY3Rpdml0eSlvYmplY3QsIHJlc3VsdCwgZmlsdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTW9kZWxTdG9yYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Nb2RlbFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhZjg3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Nb2RlbFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1vZGVsU3RvcmFnZSB7Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRoZSBNZXRob2RQbHVnaW5zIGluIHRoZSBjdXJyZW50IE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRCYXNlTW9kZWxzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPihsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBNZXRob2RMaWJyYXJ5IGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgUmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHBhcmFtIGRpciBTdHJpbmcKLQkgKiBAcGFyYW0gYk11bHRpcGxlIGJvb2xlYW4KLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIG5ld0xpYnJhcnkoSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCVN0cmluZyBuYW1lLCBTdHJpbmcgZGlyLCBib29sZWFuIGJNdWx0aXBsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsaWJfZmlsZW5hbWUgPSBudWxsOwotCQkvLyBNYXAgb3B0aW9ucyA9IG5ldwotCQkvLyBIYXNoTWFwKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCWlmIChiTXVsdGlwbGUpIHsKLQkJCWxpYl9maWxlbmFtZSA9IE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRTsKLQkJCS8vIG9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1VTFRJX0ZJTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJfZmlsZW5hbWUgPSBuYW1lOwotCQl9Ci0JCXJlc291cmNlU2V0LnVubG9hZCgpOwotCQlSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlRmlsZVVSSShkaXIKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgbGliX2ZpbGVuYW1lKSk7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlsaWIuc2V0TmFtZShuYW1lKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKGxpYik7Ci0JCXJlc291cmNlU2V0LnNhdmUobnVsbCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCS8qKgotCSAqIGluaXRpYWxpemUgYSBuZXcgbWV0aG9kIHBsdWdpbgotCSAqIEBwYXJhbSBlbXB0eU1vZGVsIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gaW5pdGlhbGl6ZShNZXRob2RQbHVnaW4gZW1wdHlNb2RlbCkgewotCQllbXB0eU1vZGVsLnNldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpOwotCi0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBjcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCVRuZ1V0aWwuY3JlYXRlUm9vdEN1c3RvbUNhdGVnb3J5KGNvbnRlbnRQa2cpOwotCi0JCS8vIGNyZWF0ZSBEZWxpdmVyeVByb2Nlc3NlcyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoWzBdKTsKLQkJZW1wdHlNb2RlbC5nZXRNZXRob2RQYWNrYWdlcygpLmFkZChwa2cpOwotCi0JCS8vIGNyZWF0ZSBQcm9jZXNzQ29udHJpYnV0aW9ucyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJTW9kZWxTdHJ1Y3R1cmUuY3JlYXRlUHJvY2Vzc0NvbnRyaWJ1dGlvblBhY2thZ2UoZW1wdHlNb2RlbCk7Ci0KLQkJLy8gY3JlYXRlIENhcGFiaWxpdHlQYXR0ZXJucyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJaW50IGxlbiA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLmxlbmd0aCAtIDE7Ci0JCXBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoW2xlbl0pOwotCQlTdHJpbmdbXSBwYXRoID0gbmV3IFN0cmluZ1tsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLCAwLCBwYXRoLAotCQkJCTAsIGxlbik7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbXB0eU1vZGVsLCBwYXRoKTsKLQkJY29udFBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0KLQkJLy8gLy8gY3JlYXRlIGluaGVyaXRlZCBkb21haW5zCi0JCS8vIC8vCi0JCS8vIExpc3QgYWxsQmFzZSA9IE1pc2MuZ2V0QWxsQmFzZShlbXB0eU1vZGVsKTsKLQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZSgpOiBhbGxCYXNlPSIrYWxsQmFzZSk7Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gYWxsQmFzZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgYmFzZURvbWFpblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGJhc2VQbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCQkvLyBJbmhlcml0ZWRDYXRlZ29yeVBhY2thZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldwotCQkvLyBJbmhlcml0ZWREb21haW5QYWNrYWdlTGlzdGVuZXIoZG9tYWluUGtnKTsKLQkJLy8gYmFzZURvbWFpblBrZy5lQWRhcHRlcnMoKS5hZGQobGlzdGVuZXIpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0KLQkJLy8gYmFzZURvbWFpblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCS8vIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGVsZW1lbnQ7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCS8vIC8vIHRoaXMgY2F0ZWdvcnkgaXMgbm90IGEgaW5oZXJpdGVkIG9uZSwgY2FuIGJlIGFkZGVkLgotCQkvLyAvLwotCQkvLyBkb21haW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGxpc3RlbmVyLmNyZWF0ZUluaGVyaXRlZCgoQ29udGVudENhdGVnb3J5KQotCQkvLyBlbGVtZW50KSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQkvLyBUT0RPOiB0ZXN0IG9uLWZseSBjcmVhdGlvbiBvZiBjYXRlZ29yeSBjb250cmlidXRvcgotCQkvLyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZW1wdHlNb2RlbCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaXRlbVByb3ZpZGVyLmFkZEluaGVyaXRlZENhdGVnb3JpZXMoKTsKLQotCQlyZXR1cm4gZW1wdHlNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBlbXB0eU1vZGVsCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2VzKE1ldGhvZFBsdWdpbiBtb2RlbCwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTGlzdCBsaXN0ID0gbW9kZWwuZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFswXSk7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJCXBrZy5zZXROYW1lKHBhdGhbMF0pOwotCQkJbGlzdC5hZGQocGtnKTsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3QgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFtpXSk7Ci0JCQlpZiAocGtnID09IG51bGwpIHsKLQkJCQlwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJCXBrZy5zZXROYW1lKHBhdGhbaV0pOwotCQkJCWxpc3QuYWRkKHBrZyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBjb250YWlubWVudCBwcm94aWVzIGZvciB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIG9iaiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRDb250YWlubWVudFByb3hpZXMoRU9iamVjdCBvYmopIHsKLQkJLy8gZm9yKFRyZWVJdGVyYXRvciBpdGVyID0gb2JqLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJTGlzdCBsaXN0ID0gb2JqLmVDb250ZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQkvLyBJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpaXRlci5uZXh0KCk7Ci0JCQlpZiAoby5lUHJveHlVUkkoKSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcm94eSBVUkkgPSAiICsgby5lUHJveHlVUkkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG8uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShvLmVQcm94eVVSSSgpLCB0cnVlKTsKLQkJCQlJbnRlcm5hbEVPYmplY3QgcmVzb2x2ZWRPYmogPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXJlc29sdmVkT2JqID0gKEludGVybmFsRU9iamVjdCkgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzb2x2ZWRPYmogPSAiICsgcmVzb2x2ZWRPYmopOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlc29sdmVkT2JqICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UobywgcmVzb2x2ZWRPYmopOwotCQkJCQkoKEJhc2ljRUxpc3QpIHJlcy5nZXRDb250ZW50cygpKS5zZXREYXRhKDEsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVzb2x2ZWRPYmogfSk7ICAgICAgICAgCi0JCQkJCW8gPSByZXNvbHZlZE9iajsKLQkJCQl9Ci0JCQl9Ci0JCQlsb2FkQ29udGFpbm1lbnRQcm94aWVzKG8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbGwgcHJveGllcyBmb3IgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmogRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsUHJveGllcyhFT2JqZWN0IG9iaikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmouZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gbG9hZENvbnRhaW5tZW50UHJveGllcyhvYmopOwotCQkvLyBsb2FkQ3Jvc3NSZWZlcmVuY2VQcm94aWVzKG9iaik7Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbGwgY3Jvc3MgcmVmZXJlbmNlIHByb3hpZXMgZm9yIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZENyb3NzUmVmZXJlbmNlUHJveGllcyhFT2JqZWN0IG9iaikgewotCQlMaXN0IGxpc3QgPSBvYmouZUNyb3NzUmVmZXJlbmNlcygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJbG9hZENyb3NzUmVmZXJlbmNlUHJveGllcyhvKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgYSBNZXRob2RFbGVtZW50IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQgbmFtZSBpbiB0aGUgZWxlbWVudCBsaXN0Ci0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRzIFRoZSBlbGVtZW50IGxpc3QKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZmluZE1ldGhvZEVsZW1lbnQoTGlzdCBtZXRob2RFbGVtZW50cywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWludCBzaXplID0gbWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IG9mIGluZGV4IGludCBoZSBsaXN0IGxvY2F0aW9uIGZvciB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50cyBMaXN0Ci0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKExpc3QgbWV0aG9kRWxlbWVudHMsIFN0cmluZyBuYW1lKSB7Ci0JCWludCBzaXplID0gbWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA3NWVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1BsdWdpblJlZmVyZW5jZUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNoZWNrIHBsdWdpbiByZWZlcmVuY2VzCi0gKiBAYXV0aG9yID8/PwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVmZXJlbmNlQ2hlY2tlciB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdCBjaGVja0NpcmN1bGFyRGVwZW5kZW50UGx1Z2luc0luTGlicmFyeSgpIHsKLS8vCQlMaXN0IGNkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCi0vLwkJTGlzdCBhbGxQbHVnaW5MaXN0ID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQbHVnaW5MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotLy8JCQlpZiAoaGFzQ2lyY3VsYXJDb25mbGljdFdpdGhQbHVnaW4oZWxlbWVudCkpCi0vLwkJCQljZExpc3QuYWRkKGVsZW1lbnQpOwotLy8JCX0KLS8vCQlyZXR1cm4gY2RMaXN0OwotLy8JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQbHVnaW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJDb25mbGljdFdpdGhQbHVnaW4oTWV0aG9kUGx1Z2luIGFQbHVnaW4pIHsJCQotLy8JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0vLwotLy8JCUxpc3QgYWxsb3dhYmxlQmFzZUxpc3QgPSBnZXRBcHBsaWNhYmxlQmFzZVBsdWdpbnMoYVBsdWdpbik7Ci0vLwkJTGlzdCBleHRlbmRlZEJhc2VMaXN0ID0gYVBsdWdpbi5nZXRCYXNlcygpOwotLy8KLS8vCQlpZiAoIWFsbG93YWJsZUJhc2VMaXN0LmNvbnRhaW5zQWxsKGV4dGVuZGVkQmFzZUxpc3QpKSB7Ci0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbigiJCQkOiBjaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIGZvciAiICsgYVBsdWdpbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCXByaW50UGx1Z2luTGlzdCgiYWxsb3dhYmxlIHBsdWdpbiBsaXN0IiwgYWxsb3dhYmxlQmFzZUxpc3QpOyAvLyROT04tTkxTLTEkCi0vLwkJCXByaW50UGx1Z2luTGlzdCgiY3VycmVudCBiYXNlIGxpc3QiLCBleHRlbmRlZEJhc2VMaXN0KTsgLy8kTk9OLU5MUy0xJAotLy8JCQlhbnN3ZXIgPSB0cnVlOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGFuc3dlcjsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFQbHVnaW4uZ2V0QmFzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBiYXNlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZighRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYVBsdWdpbiwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgYmFzZSkuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhUGx1Z2luCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0QXBwbGljYWJsZUJhc2VQbHVnaW5zKE1ldGhvZFBsdWdpbiBhUGx1Z2luKSB7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBtb2RlbHMgPSBNb2RlbFN0b3JhZ2UuZ2V0QmFzZU1vZGVscygpOwotCi0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBkZXNjZW5kYW50TGlzdCA9IGdldERlc2NlbmRhbnRzKGFQbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IGRlc2NlbmRhbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCWlmIChhUGx1Z2luLmdldEJhc2VzKCkuY29udGFpbnMoZWxlbWVudCkpIHsJCS8vcGFydCBvZiAxNzAzNjc6IGFsbG93IGl0IHRvIHNob3cgZm9yIHVuc2VsZWN0Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQltb2RlbHMucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsczsKLQl9Ci0KLQkvLyB0aG9zZSB0d28gZ2V0RGVzY2VuZGFudHMoKSBtZXRob2RzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGxvd2VyIGxheWVyCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldERlc2NlbmRhbnRzKE1ldGhvZFBsdWdpbiBtZXRob2RPYmplY3QpIHsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGRlc2NlbmRhbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQkJTGlzdDxNZXRob2RQbHVnaW4+IG9iakxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQotCQlnZXREZXNjZW5kYW50cyhkZXNjZW5kYW50TGlzdCwgb2JqTGlzdCk7Ci0KLQkJcmV0dXJuIGRlc2NlbmRhbnRMaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXREZXNjZW5kYW50cyhMaXN0PE1ldGhvZFBsdWdpbj4gYWxsRGVzY2VuZGFudExpc3QsCi0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYWxsRGVzY2VuZGFudExpc3Q7Ci0KLQkJTGlzdDxNZXRob2RQbHVnaW4+IGNvbWJEZXNjZW5kYW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gZGVzY2VuZGFudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkuZ2V0UGx1Z2luRGlyZWN0RXh0ZW5zaW9ucyhlbGVtZW50KTsKLQkJCWNvbWJEZXNjZW5kYW50TGlzdC5hZGRBbGwoZGVzY2VuZGFudExpc3QpOwotCi0JCX0KLQotCQlhbGxEZXNjZW5kYW50TGlzdC5hZGRBbGwobWV0aG9kT2JqZWN0TGlzdCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gY29tYkRlc2NlbmRhbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYWxsRGVzY2VuZGFudExpc3QuY29udGFpbnMoZWxlbWVudCkpCi0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudHMoYWxsRGVzY2VuZGFudExpc3QsIG5leHRDaGVja0xpc3QpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjCi0JICogQHBhcmFtIHBsdWdpbkxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRQbHVnaW5MaXN0KFN0cmluZyBkZXNjLCBMaXN0IHBsdWdpbkxpc3QpIHsKLQkJU3lzdGVtLm91dC5wcmludCgiJCQkICIgKyBkZXNjICsgIjogWyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBsdWdpbkxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQocGx1Z2luLmdldE5hbWUoKSArICIsICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJdIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmIyOTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxpbmtJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BY3Rpdml0eUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VIZWxwZXIgewotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBQ0VfUkVQTEFDRU1FTlQgPSAiX0JSXyI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOQlJBQ0VfU1RSSU5HID0gIlxceyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9CT09LTUFSS19JTkRJQ0FUT1IgPSAiIyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVJBTUVURVJfSU5ESUNBVE9SID0gIj8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFSQU1FVEVSX1BST0NFU1MgPSAicHJvYyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9TVFJfSkFWQVNDUklQVCA9ICJqYXZhc2NyaXB0OiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9TVFJfTUFJTFRPID0gIm1haWx0bzoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFSQU1FVEVSX1BBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX0tFWSA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX0dVSUQgPSAiZ3VpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX0hSRUYgPSAiaHJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX1ZBTFVFX0lOREVYID0gImluZGV4IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFRfSFRNTCA9ICIuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRVhUX0hUTSA9ICIuaHRtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFRfSlBFRyA9ICIuanBlZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUEFHRVNfRk9MREVSID0gInBhZ2VzX25vdF9pbnN0YWxsZWQvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rID0gImVsZW1lbnRMaW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGUgPSAiZWxlbWVudExpbmtXaXRoVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dCA9ICJlbGVtZW50TGlua1dpdGhVc2VyVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0ZPTERFUiA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuUkVTT1VSQ0VfRk9MREVSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaHRtbF9maWxlX25hbWUgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgiKC4qKSwoLiopXFwuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyB0aGlzIG9uZSBkb2VzIG5vdCB3b3JrIHdoZW4gY29udGFpbmluZyBub24tZW5nbGlzaCBjaGFyYWN0ZXJzLCB1c2UgdGhlCi0JLy8gbW9yZSBnZW5lcmFsIG9uZQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfcmVmID0KLQkvLyBQYXR0ZXJuLmNvbXBpbGUoIjxhXFxzKz8oW14+XSopPiguKj8pPC9hPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8Ci0JLy8gUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIjxhXFxzKz8oLio/KT4oLio/KTwvYT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3RlbXBsYXRlX2F0dGFjaG1lbnRfdXJsID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSI8YVxccys/aHJlZlxccyo/PVxccyo/XCIoLio/KVwiXFxzKj8+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2FyZWFfcmVmID0gUGF0dGVybgotLy8JCQkuY29tcGlsZSgKLS8vCQkJCQkiPGFyZWEuKj8oaHJlZlxccyo9XFxzKlwiKC4qPylcIikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9hcmVhX3JlZiA9IFBhdHRlcm4KLQkuY29tcGlsZSgKLQkJCSI8YXJlYVxccys/KC4qPykvPz4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfcmVmX2dlbiA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiPChhfGFyZWEpXFxzKz8oW14+XSopPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua190eXBlX3BpY2tlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiXFxzKmNsYXNzXFxzKj89XFxzKj8oLio/KVxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfZ3VpZF9waWNrZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIlxccypndWlkXFxzKj89XFxzKj8oLio/KVxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfaHJlZl9waWNrZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIlxccypocmVmXFxzKj89XFxzKj9cIiguKj8pXCJcXHMrIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF90YWdfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSI8KFtePiFdKikoXFxufFxccikoW14+XSopPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW1hZ2VfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoPChpbWd8aWZyYW1lKS4qP3NyY1xccyo9XFxzKlwiKSguKj8pKFwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfdXJsX2RlY29kZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8W14+XSo/KHNyY3xocmVmKVxccyo9XFxzKlwiKSguKj8pKFwiW14+XSo/PikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3RhZ19hdHRyaWJ1dGVzID0gUGF0dGVybgotCS5jb21waWxlKAotCQkJIihbXFxTJiZbXj1dXSspXFxzKj1cXHMqKFtcXFMmJlteXCJdXSt8XCIoW1xcUyAmJlteXCJdXSspXCIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9jc3NfcmVmID0gUGF0dGVybi5jb21waWxlKAotCQkJIiB1cmxcXCgoLio/KVxcKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZGVmaW5lIGNvbnN0YW50cyBmb3IgZGlhZ3JhbSB0eXBlLgotCS8vIFRoaXMgd2lsbCBiZSB1c2VkIHdoZW4gbGlua2luZyBkaWFncmFtcyBpbnRvIHB1Ymxpc2hlZCBjb250ZW50cwotCS8vIEFjdGl2aXR5IGRpYWdyYW0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1RZUEVfV09SS0ZMT1cgPSAiQWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwgPSAiQWN0aXZpdHlEZXRhaWwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBXUERlcGVuZGVuY3kgZGlhZ3JhbQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZID0gIldQRGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGRlZmF1bHRSZXNvdXJjZU1ncjsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG93U2tpblJlc291cmNlID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFZT1VUX1hTTF9ST09UX1BBVEggPSBudWxsOwotCQotCXB1YmxpYyBSZXNvdXJjZUhlbHBlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldERlZmF1bHRSZXNvdXJjZU1ncihJTGlicmFyeVJlc291cmNlTWFuYWdlciBtZ3IpIHsKLQkJZGVmYXVsdFJlc291cmNlTWdyID0gbWdyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBJTGlicmFyeVJlc291cmNlTWFuYWdlciBnZXREZWZhdWx0UmVzb3VyY2VNZ3IoKSB7Ci0JCXJldHVybiBkZWZhdWx0UmVzb3VyY2VNZ3I7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNZ3IoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGVsZW1lbnQpOwotCQlpZiAoIGxpYiAhPSBudWxsICkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIobGliKTsKLQkJCWlmIChsaWJNZ3IgPT0gbnVsbCkgewotCQkJCWxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlsaWJNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKGxpYik7Ci0JCQl9Ci0JCQlpZiAobGliTWdyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFJlc291cmNlTWdyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGliTWdyLmdldFJlc291cmNlTWFuYWdlcigpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgcGx1Z2luIGluIHRoZSBsaWJyYXJ5LAotCSAqIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luUmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJCXJldHVybiByZXNNZ3IuZ2V0TG9naWNhbFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlc01nci5nZXRMb2dpY2FsUmVzb3VyY2VQYXRoKHBsdWdpbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgZm9sZGVyIG9mIHRoZSBlbGVtZW50IGluIHRoZQotCSAqIGxpYnJhcnksIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50UmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiByZXNNZ3IuZ2V0TG9naWNhbFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gYWJzb2x1dGUgcGF0aCBvZiB0aGUgZWxlbWVudCdzIHJlc291cmNlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlRWxlbWVudFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudCk7Ci0JCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gcmVzTWdyLmdldFBoeXNpY2FsUmVzb3VyY2VQYXRoKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeSwKLQkgKiByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJdHJ5IHsKLS8vCQkJU3RyaW5nIHBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldFJlbGF0aXZlRWxlbWVudFBhdGgoZWxlbWVudCk7Ci0vLwkJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0vLwkJCXsKLS8vCQkJCVN5c3RlbS5vdXQKLS8vCQkJCQkJLnByaW50bG4oIldhcm5pbmchIE5vIFBhdGggZm9yIEVsZW1lbnQgWyIgKyBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiAiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotLy8JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0vLwkJCX0KLS8vCQkJcmV0dXJuIGZpeFBhdGgocGF0aCk7Ci0vLwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudCk7Ci0JCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gcmVzTWdyLmdldExvZ2ljYWxQYXRoKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwlwcml2YXRlIHN0YXRpYyBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBnZXRGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotLy8JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLS8vCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0vLwkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRQZXJzaXN0ZXJGb3IocmVzb3VyY2UpOwotLy8JCQlpZihwZXJzaXN0ZXIgaW5zdGFuY2VvZiBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgewotLy8JCQkJcmV0dXJuICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpcGVyc2lzdGVyKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLS8vCQotLy8JLyoqCi0vLwkgKiBHZXRzIHRoZSBwYXRoIG9mIGEgbWV0aG9kIGVsZW1lbnQncyBmb2xkZXIgcmVsYXRpdmUgdG8gaXRzIHBsdWctaW4uCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiBAcmV0dXJuCi0vLwkgKiBAZGVwbGljYXRlZCAKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKGVsZW1lbnQpOwotLy8JCXJldHVybiBwZXJzaXN0ZXIgIT0gbnVsbCA/IHBlcnNpc3Rlci5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoZWxlbWVudCkgOiBudWxsOwotLy8JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudCdzIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQkKLS8vCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKGVsZW1lbnQpOwotLy8JCXJldHVybiBwZXJzaXN0ZXIgIT0gbnVsbCA/IHBlcnNpc3Rlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZWxlbWVudCkgOiBudWxsOwotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiByZXNNZ3IuZ2V0UGh5c2ljYWxQYXRoKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLS8vCS8qKgotLy8JICogcmV0dXJuIHRoZSBwYXJlbnQgZm9sZGVyIG9mIHRoZSBwbHVnaW4gb3IgY29uZmlndXJhdGlvbiBvZiB0aGUgZWxlbWVudC4KLS8vCSAqIG9yIHRoZSBsaWJyYXJ5IHJvb3QgaWYgdGhlIGVsZW1lbnQgaXMgdGhlIE1ldGhvZExpYnJhcnkuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLS8vCSAqIEByZXR1cm4gU3RyaW5nCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZpcnR1YWxMaWJyYXJ5Um9vdChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICkgewotLy8JCQkvLyBkZWZhdWx0LCByZXR1cm4gdGhlIGN1cnJlbnQgbGlicmFyeSBwYXRoCi0vLwkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsJCQkJCQotLy8JCX0gCi0vLwkJCi0vLwkJU3RyaW5nIHBhdGggPSBudWxsOwotLy8JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApIHsKLS8vCQkJcGF0aCA9IGdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KTsKLS8vCQl9IGVsc2UgewotLy8JCQlwYXRoID0gZ2V0UGx1Z2luUGF0aChlbGVtZW50KTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYgKCBwYXRoICE9IG51bGwgKSB7Ci0vLwkJCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotLy8JCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0vLwkJfQotLy8JCQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotLy8JLyoqCi0vLwkgKiBmaXggdGhlIHBhdGggYnkgYXBwZW5kaW5nIGEgRmlsZS5zZXBlcmF0b3IgdG8gdGhlIGVuZCBvZiBpdAotLy8JICogQHBhcmFtIHBhdGggU3RyaW5nCi0vLwkgKiBAcmV0dXJuIFN0cmluZwotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhQYXRoKFN0cmluZyBwYXRoKSB7Ci0vLwkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLS8vCQl7Ci0vLwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCX0gZWxzZSBpZiAoIXBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0vLwkJCXJldHVybiBwYXRoICsgRmlsZS5zZXBhcmF0b3I7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJcmV0dXJuIHBhdGg7Ci0vLwkJfQotLy8JfQotCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgYmFjayBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QuIEZvciBleGFtcGxlLAotCSAqICJPcGVuVVBcZ3VpZGFuY2VcY29uY2VwdFxjMS54bWwiLCB0aGUgYmFjayBwYXRoIGlzICIuLy4uLy4uLy4uLyIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYWNrUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQkvLyBMaW51eDogQnJvd3NpbmcgYW5kIHByZXZpZXcgc2hvd3Mgb25seSBwbGFpbiB0ZXh0LgotLy8JCS8vIFRoZXJlIGFyZSBubyBpbWFnZXMvc2VjdGlvbnMKLS8vCQkvLyBlbGVtZW50IHBhdGggc2hvdWxkIGNoZWNrIEZpbGUuc2VwYXJhdG9yQ2hhciBpbnN0ZWFkIG9mICJcIgotLy8JCVN0cmluZyBiYWNrUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0vLwkJU3RyaW5nIHBhdGggPSBnZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLS8vCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCWJhY2tQYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKS5yZXBsYWNlQWxsKAotLy8JCQkJCSIuKj8vIiwgIlxcLlxcLi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwkJfQotLy8JCXJldHVybiAiLi8iICsgYmFja1BhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWdyKGVsZW1lbnQpOwotCQlpZiAoIHJlc01nciAhPSBudWxsICkgewotCQkJcmV0dXJuIHJlc01nci5nZXRCYWNrUGF0aChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBleHQgU3RyaW5nIHRoZSBmaWxlIGV4dGVuYXNpb24sIGZvciBleGFtcGxlLCAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBleHQpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKGVsZW1lbnQsIG51bGwsIG51bGwsIGV4dCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4IGFuZCBleHRlbnNpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG5hbWVQcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZVN1ZmZpeCBTdHJpbmcgc3VmZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSwgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCSAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsJCQotCQlyZXR1cm4gRmlsZU5hbWVHZW5lcmF0b3IuSU5TVEFOQ0UuZ2V0RmlsZU5hbWUoZWxlbWVudCwgbmFtZVByZWZpeCwgbmFtZVN1ZmZpeCwgZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsIAotCSAqIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkRnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlyZXR1cm4gRmlsZU5hbWVHZW5lcmF0b3IuSU5TVEFOQ0UuZ2V0R3VpZEZyb21GaWxlTmFtZShmaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGZyb20gdGhlIGZpbGUgbmFtZSwgYXNzdW1pbmcgdGhlIGZpbGUgbmFtZSBpcyBnZW5lcmF0ZWQgZnJvbSBhbiBlbGVtZW50LAotCSAqIHJldHVybiBudWxsIGlmIG5vdC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnRGcm9tRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21GaWxlTmFtZShmaWxlTmFtZSk7Ci0JCWlmIChndWlkICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCB1cmwgcmVsYXRpdmUgdG8gdGhlIHJlZkVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmaWxlRXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBvbGRfdXJsIFN0cmluZyB0aGUgb2xkIHVybCBvZiB0aGUgZWxlbWVudC4gSWYgdGhlIG9sZCB1cmwgaXMgbm90IG51bGwsIAotCSAqIGFueSBib29rbWFyayBvciB1cmwgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSBuZXcgdXJsCi0JICogQHJldHVybiBTdHJpbmcgU3RyaW5nIHRoZSBuZXcgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVybChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQsIFN0cmluZyBmaWxlRXh0LCBTdHJpbmcgb2xkX3VybCkgewotCQlTdHJpbmcgdXJsID0gZ2V0VXJsKGVsZW1lbnQsIHJlZkVsZW1lbnQsIGZpbGVFeHQpOwotCi0JCS8vIGlmIHRoZSBvbGQgdXJsIGhhcyBib29rbWFyayBpbiBpdCwga2VlcCBpdAotCQlpZiAob2xkX3VybCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5keCA9IG9sZF91cmwuaW5kZXhPZihVUkxfQk9PS01BUktfSU5ESUNBVE9SKTsKLQkJCWlmIChpbmR4IDwgMCkgewotCQkJCS8vIGtlZXAgdXJsIHF1ZXJ5IHN0cmluZyBhcyB3ZWxsCi0JCQkJaW5keCA9IG9sZF91cmwuaW5kZXhPZihVUkxfUEFSQU1FVEVSX0lORElDQVRPUik7Ci0JCQl9Ci0KLQkJCWlmIChpbmR4ID49IDApIHsKLQkJCQl1cmwgPSB1cmwgKyBvbGRfdXJsLnN1YnN0cmluZyhpbmR4KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IHVybCByZWxhdGl2ZSB0byB0aGUgcmVmRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZpbGVFeHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVybAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVybChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQsIFN0cmluZyBmaWxlRXh0KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHJlZkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnRQYXRoKGVsZW1lbnQpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpCi0JCQkJCSsgZ2V0RmlsZU5hbWUoZWxlbWVudCwgZmlsZUV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKGdldEJhY2tQYXRoKHJlZkVsZW1lbnQpICsgZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkpLnJlcGxhY2UoCi0JCQkJCUZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKQotCQkJCQkrIGdldEZpbGVOYW1lKGVsZW1lbnQsIGZpbGVFeHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsaW5rIHRleHQgZm9yIGFuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGxpbmtUeXBlIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGlua1RleHQoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgbGlua1R5cGUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZyBsaW5rZWRUZXh0ID0gbnVsbDsKLQotCQkvLyBSVEUgbWF5IGNoYW5nZSB0aGUgY2FzZSBvZiBhdHRyaWJ1dGVzLgotCQlpZiAoKGxpbmtUeXBlICE9IG51bGwpCi0JCQkJJiYgIUVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dC5lcXVhbHNJZ25vcmVDYXNlKGxpbmtUeXBlKSkgewotCQkJaWYgKEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhUeXBlLmVxdWFsc0lnbm9yZUNhc2UobGlua1R5cGUpKSB7Ci0JCQkJbGlua2VkVGV4dCA9IGdldEVsZW1lbnRMaW5rVGV4dChlLCB0cnVlLCBjb25maWcpOwotCQkJfSBlbHNlIGlmIChFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmsuZXF1YWxzSWdub3JlQ2FzZShsaW5rVHlwZSkpIHsKLQkJCQlsaW5rZWRUZXh0ID0gZ2V0RWxlbWVudExpbmtUZXh0KGUsIGZhbHNlLCBjb25maWcpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpbmtlZFRleHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpbmtUZXh0KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIGxpbmtUeXBlKSB7Ci0JCXJldHVybiBnZXRMaW5rVGV4dChlLCBsaW5rVHlwZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGxpbmsgdGV4dCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHdpdGhUeXBlIGJvb2xlYW4gaWYgdHJ1ZSB0aGUgZWxlbWVudCB0eXBlIHN0cmluZyB3aWxsIGJlIGluY2x1ZGVkCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGlua1RleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJYm9vbGVhbiB3aXRoVHlwZSkgewotCQlyZXR1cm4gZ2V0RWxlbWVudExpbmtUZXh0KGVsZW1lbnQsIHdpdGhUeXBlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmtUZXh0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gd2l0aFR5cGUsIGZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQotCQlUbmdVdGlsLlByZXNlbnRhdGlvbk5hbWVIZWxwZXIgcEhlbHBlciA9IGNvbmZpZyA9PSBudWxsID8gbnVsbCA6IAotCQkJCQkJCQluZXcgVG5nVXRpbC5QcmVzZW50YXRpb25OYW1lSGVscGVyKCkgewotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJU3RyaW5nIHN0ciA9IHN1cGVyLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJaWYgKFN0clV0aWwuaXNCbGFuayhzdHIpICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTKSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCVN0cmluZyBiYXNlU3RyID0gYmFzZSA9PSBudWxsID8gbnVsbCA6IGJhc2UuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQkJaWYgKCEgU3RyVXRpbC5pc0JsYW5rKGJhc2VTdHIpKSB7Ci0JCQkJCQkJcmV0dXJuIGJhc2VTdHI7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCX0KLQkJCQlyZXR1cm4gc3RyOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlTdHJpbmcgdGV4dCA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LCBwSGVscGVyKTsKLS8vCQlpZiAod2l0aFR5cGUpIHsKLQkJCi0vLwkJCXJldHVybiBnZXRFbGVtZW50VHlwZVRleHQoZWxlbWVudCkgKyBMaWJyYXJ5UmVzb3VyY2VzLmNvbG9uX3dpdGhfc3BhY2UgKyB0ZXh0OyAKLS8vCQl9Ci0vLwotLy8JCXJldHVybiB0ZXh0OwotCQlpZiAod2l0aFR5cGUpIHsKLQkJCWlmIChzaG93U2tpblJlc291cmNlKSB7Ci0JCQkJU3RyaW5nIHhzbFBhdGggPSBudWxsOwotCi0JCQkJaWYgKChMQVlPVVRfWFNMX1JPT1RfUEFUSCA9PSBudWxsKQotCQkJCQkJfHwgKExBWU9VVF9YU0xfUk9PVF9QQVRILmVxdWFscygiIikpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQlMQVlPVVRfWFNMX1JPT1RfUEFUSCA9IEJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0UuZ2V0WHNsUGF0aCgpCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0KLQkJCQlQcm9wZXJ0aWVzIGJyb3dzaW5nUmVzb3VyY2UgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKExBWU9VVF9YU0xfUk9PVF9QQVRILCAicmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJCVN0cmluZyBsb2NhbEZpbGVOYW1lID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZShmaWxlCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKGxvY2FsRmlsZU5hbWUgIT0gbnVsbCkgewotCQkJCQlmaWxlID0gbmV3IEZpbGUobG9jYWxGaWxlTmFtZSk7Ci0JCQkJfQotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlicm93c2luZ1Jlc291cmNlLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHR5cGUgPSBnZXRFbGVtZW50VHlwZVRleHQoZWxlbWVudCk7Ci0JCQkJU3RyaW5nIGtleSA9IHR5cGUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkKLQkJCQkJCSsgdHlwZS5zdWJzdHJpbmcoMSkgKyAiVGV4dCI7Ly8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB2YWx1ZSA9IGJyb3dzaW5nUmVzb3VyY2UuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmFsdWUgKyBMaWJyYXJ5UmVzb3VyY2VzLmNvbG9uX3dpdGhfc3BhY2UgKyB0ZXh0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0eXBlICsgTGlicmFyeVJlc291cmNlcy5jb2xvbl93aXRoX3NwYWNlICsgdGV4dDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlVGV4dChlbGVtZW50KSArIExpYnJhcnlSZXNvdXJjZXMuY29sb25fd2l0aF9zcGFjZSArIHRleHQ7Ci0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogZ3RlIHRoZSBlbGVtZW50IHR5cGUgc3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVUZXh0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBUbmdVdGlsLmdldFR5cGVUZXh0KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGF1dG8gZ2VuZXJhdGVkIGVsZW1lbnQgbGluayA8YSBjbGFzcz0iZWxlbWVudExpbmsiIGhyZWY9ImVsZW1lbnRfdXJsIgotCSAqIGd1aWQ9ImVsZW1lbnRfZ3VpZCI+ZWxlbWVudF90eXBlOiBlbGVtZW50X3ByZXNlbnRhdGlvbl9uYW1lPC9hPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHdpdGhUeXBlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGluayhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlib29sZWFuIHdpdGhUeXBlLCBTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0RWxlbWVudExpbmtUZXh0KGVsZW1lbnQsIHdpdGhUeXBlKTsKLQkJU3RyaW5nIGxpbmtDbGFzcyA9IEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGluazsKLQkJaWYgKHdpdGhUeXBlKQotCQkJbGlua0NsYXNzID0gRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGU7Ci0JCXJldHVybiBnZXRFbGVtZW50TGluayhlbGVtZW50LCB0ZXh0LCB1cmwsIGxpbmtDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogZWxlbWVudCBsaW5rIHdpdGggdXNlciBzcGVjaWZpZWQgbGluayB0ZXh0Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRMaW5rKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQsCi0JCQlTdHJpbmcgdXJsKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50TGluayhlbGVtZW50LCB0ZXh0LCB1cmwsCi0JCQkJRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFVzZXJUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBlbGVtZW50IGxpbmsgd2l0aCB1c2VyIHNwZWNpZmllZCBsaW5rIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmsoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCwKLQkJCVN0cmluZyB1cmwsIFN0cmluZyBsaW5rQ2xhc3MpIHsKLQkJcmV0dXJuICI8YSBjbGFzcz1cIiIgKyBsaW5rQ2xhc3MgKyAiXCIgIiArIGdldFVybFRleHQodXJsKSArICIgZ3VpZD1cIiIgKyBlbGVtZW50LmdldEd1aWQoKSArICJcIiA+IiArIHRleHQgKyAiPC9hPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCX0KLQotCS8qKgotCSAqIHRoZSBwYXNzZWQgaW4gdXJsIG1pZ2h0IGNvbnRhaW4gdGhlIGhyZWYgYXR0cmlidXRlIHdpdGggaXQsIG9yIGV2ZW4gb3RoZXIKLQkgKiBhdHRyaWJ1dGVzLCBzbyBjaGVjayBpZiB0aGlzIGlzIGEgcHVyZSB1cmwgb3Igbm90LiByZXR1cm4gdGhlIHVybCBocmVmCi0JICogdGVybSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRVcmxUZXh0KFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQl1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJdXJsID0gdXJsLnRyaW0oKTsKLQkJfQotCi0JCS8vIHN0YXJ0cyB3aXRoIGhyZWYsIG9yIGNvbnRhaW5zIGFuIGhyZWYgdGVybSBpbiBpdAotCQlpZiAodXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiaHJlZiIpIHx8IHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIiBocmVmIikgPiAwKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCXJldHVybiAiaHJlZj1cIiIgKyB1cmwgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgY29udGVudCBieSBjaGVja2luZyBlbGVtZW50IGxpbmtzIGFuZCBpbWFnZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlQ29udGVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzb3VyY2UpIHsKLQkJcmV0dXJuIHZhbGlkYXRlQ29udGVudChlbGVtZW50LCBzb3VyY2UsIG5ldyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcigpLAotCQkJCW51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBsaW5rIHR5cGUgaXMgZWxlbWVudCBsaW5rIG9yIG5vdAotCSAqIEBwYXJhbSBsaW5rVHlwZSBTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbGVtZW50TGluayhTdHJpbmcgbGlua1R5cGUpIHsKLQkJaWYgKGxpbmtUeXBlID09IG51bGwgfHwgbGlua1R5cGUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gUlRFIG1heSBjaGFuZ2UgdGhlIGNhc2Ugb2YgYXR0cmlidXRlcy4KLQkJcmV0dXJuIGxpbmtUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rKQotCQkJCXx8IGxpbmtUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGUpCi0JCQkJfHwgbGlua1R5cGUuZXF1YWxzSWdub3JlQ2FzZShFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHQpOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb250ZW50IGJ5IGNoZWNraW5nIGVsZW1lbnQgbGlua3MgYW5kIGltYWdlcywgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IG93bmVyCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQsIHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGUgY29udGVudAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB0aGUgY29udGVudCBpcwotCSAqICAgICAgICAgICAgdmFsaWRhdGVkCi0JICogQHBhcmFtIGxpbmtlZEVsZW1lbnRzCi0JICogICAgICAgICAgICBMaXN0IGEgcGFzc2VkIGluIGxpc3QgdG8gY29sbGVjdCB0aGUgbGlua2VkIGVsZW1lbnRzIGluIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRlbnQsIGlmIG51bGwsIG5vIGxpbmtlZCBlbGVtZW50cyBhcmUgY29sbGVjdGVkLgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB2YWxpZGF0ZWQgY29udGVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlQ29udGVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzb3VyY2UsCi0JCQlJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgbGF5b3V0WHNsUm9vdFBhdGgpIHsKLQkJCQotCQl0cnkgewotCQkJUmVzb3VyY2VIZWxwZXIuTEFZT1VUX1hTTF9ST09UX1BBVEggPSBsYXlvdXRYc2xSb290UGF0aDsKLQkJCXNob3dTa2luUmVzb3VyY2UgPSB0cnVlOwotCQkJLy8gZmlyc3QgdmFsaWRhdGUgdGhlIHRhZ3MsIHJlbW92ZSBhbnkgQ0YvTEYgZnJvbSB0aGUgdGFnIHRleHQKLQkJCXNvdXJjZSA9IHZhbGlkYXRlVGFnKHNvdXJjZSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU1hdGNoZXIgbSA9IHBfbGlua19yZWYubWF0Y2hlcihzb3VyY2UpOwotCi0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCS8vIFByb2JsZW1zIHBhcnNpbmcgPGEgaHJlZj4gdGFncwotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIGFsbCBMRiwgQ1Igd2l0aGluIHRoZSA8YSAuLj4gdGFnCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBsaW5rZWRUZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlMaW5rSW5mbyBpbmZvID0gdmFsaWRhdG9yLnZhbGlkYXRlTGluayhlbGVtZW50LCB1cmx0ZXh0LAotCQkJCQkJbGlua2VkVGV4dCwgY29uZmlnLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gaW5mby5nZXRIdG1sKHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSkudG9TdHJpbmcoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaW5mby5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbCgiZmlsZTovLy8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUFsbCgiZmlsZTovLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQkJfQotCi0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGFsc28gZml4IHRoZSBhcmVhIG1hcAotCQkJc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJCW0gPSBwX2FyZWFfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXNiLnNldExlbmd0aCgwKTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCUxpbmtJbmZvIGluZm8gPSB2YWxpZGF0b3IudmFsaWRhdGVMaW5rKGVsZW1lbnQsIHVybHRleHQsCi0JCQkJCQkiIiwgY29uZmlnLCAiYXJlYSIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkKLQkJCQkJLy8gZG9uJ3Qgc2hvdyBicm9rZW4gbGlua3MgaW4gYXJlYSBtYXAuIFNob3cgcGxhbiB0ZXh0IGluc3RlYWQKLQkJCQkJdGV4dCA9IGluZm8uZ2V0SHRtbChmYWxzZS8qdmFsaWRhdG9yLnNob3dCcm9rZW5MaW5rcygpKi8pLnRvU3RyaW5nKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGluZm8uZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWxpZGF0b3IuYWRkUmVmZXJlbmNlZEVsZW1lbnQoZWxlbWVudCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0LnJlcGxhY2VBbGwoImZpbGU6Ly8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnJlcGxhY2VBbGwoImZpbGU6Ly8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCX0KLQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJLy8gU2hhcGUgaWNvbiBicm9rZW4gaW4gcHJldmlldyBhbmQgYnJvd3NpbmcKLQkJCS8vIC8vIG5lZWQgdG8gZGVjb2RlIHRoZSBpbWFnZSBwYXRoIHVubGVzcyB3ZSBjYW4gZGlzYWJsZSB0aGUgdXJsCi0JCQkvLyBlbmNvZGluZyBpbiB4c2x0Ci0JCQkvLyBzb3VyY2UgPSBzYi50b1N0cmluZygpOwotCQkJLy8gc2Iuc2V0TGVuZ3RoKDApOwotCQkJLy8gbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCS8vIHdoaWxlICggbS5maW5kKCkgKQotCQkJLy8gewotCQkJLy8gU3RyaW5nIHVybCA9IG0uZ3JvdXAoMyk7Ci0JCQkvLyB1cmwgPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwsICJVVEYtOCIpOwotCQkJLy8gbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgbS5ncm91cCgxKSArIHVybCArIG0uZ3JvdXAoNCkpOwotCQkJLy8gfQotCQkJLy8gbS5hcHBlbmRUYWlsKHNiKTsKLQkJCS8vIHJldHVybiBzYi50b1N0cmluZygpOwotCi0JCQkvLyBkZWNvZGUgdGhlIHVybHMKLQkJCXJldHVybiBkZWNvZGVVcmxzSW5Db250ZW50KHNiLnRvU3RyaW5nKCkpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlSZXNvdXJjZUhlbHBlci5MQVlPVVRfWFNMX1JPT1RfUEFUSCA9IG51bGw7Ci0JCQlzaG93U2tpblJlc291cmNlID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIGRlY29kZSB0aGUgdXJscyBpbiB0aGUgY29udGVudC4gQ29udGVudCBmcm9tIHhzbHQgb3V0cHV0IGFyZSBlbmNvZGVkLiBXZQotCSAqIGRvbid0IHdhbnQgdGhpcyB0byBiZSBlbmNvZGVkIHNpbmNlIHRoZSBicm93c2VyIG1heSBkZWNvZGUgaXQgaW4gYSB3cm9uZwotCSAqIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVVcmxzSW5Db250ZW50KFN0cmluZyBjb250ZW50KSB7Ci0JCXRyeSB7Ci0JCQkvLyBTaGFwZSBpY29uIGJyb2tlbiBpbiBwcmV2aWV3IGFuZCBicm93c2luZwotCQkJLy8gbmVlZCB0byBkZWNvZGUgdGhlIGltYWdlIHBhdGggdW5sZXNzIHdlIGNhbiBkaXNhYmxlIHRoZSB1cmwKLQkJCS8vIGVuY29kaW5nIGluIHhzbHQKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdXJsX2RlY29kZXIubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDMpOwotCQkJCXVybCA9IFVSTERlY29kZXIuZGVjb2RlKHVybCwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpOwotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlZ0V4cEVzY2FwZSh0ZXh0KSk7IAkKLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIGVzY2FwZSB0aGUgcmVnZXhwIHJlc2VydmVkIHdvcmRzLCBzdWNoIGFzICQKLQkgKiBAcGFyYW0gdGV4dCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZ0V4cEVzY2FwZShTdHJpbmcgdGV4dCkgewotCQkvLyBlc2NhcGUgdGhlIHJlZ0V4cCByZXNlcnZlZCB3b3JkcywKLQkJLy8gdGhlICQgc2lnbiBpcyByZXNlcnZlZCBmb3IgZ3JvdXAgbWF0Y2hpbmcgCi0JCVN0cmluZyBuZXd0ZXh0ID0gU3RyVXRpbC5lc2NhcGVDaGFyKHRleHQsICckJyk7Ci0JCW5ld3RleHQgPSBTdHJVdGlsLmVzY2FwZUNoYXIodGV4dCwgJ1xcJyk7Ci0JCXJldHVybiBuZXd0ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBmaXggdGhlIGVsZW1lbnQgdXJsIGluIHRoZSB1cmx0ZXh0LiB0aGUgdGV4dCBpcyB0aGUgcGFydCBmcm9tIHRoZQotCSAqIHBfbGlua19yZWYgcGF0dGVybiBtYXRjaAotCSAqIAotCSAqIEBwYXJhbSB1cmx0ZXh0Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB0aGUgY29udGVudCBpcwotCSAqICAgICAgICAgICAgdmFsaWRhdGVkCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhFbGVtZW50VXJsKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVybHRleHQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfaHJlZl9waWNrZXIubWF0Y2hlcigiICIgKyB1cmx0ZXh0ICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCVN0cmluZyBuZXd1cmwgPSBudWxsOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21VcmwodXJsdGV4dCk7Ci0JCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKSA6IG51bGw7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsCi0JCQkJCQkJCQljb25maWcpOwotCQkJCQkJfQotCQkJCQkJbmV3dXJsID0gZ2V0VXJsKGUsIGVsZW1lbnQsIEZJTEVfRVhUX0hUTUwsIHVybCk7Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBudWxsLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB1cmwgbGluayBhbmQKLQkJCQkJLy8gbG9nIGFuIGVycm9yCi0JCQkJCS8vIFRPRE8KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXd1cmwgIT0gbnVsbCAmJiAhbmV3dXJsLmVxdWFscyh1cmwpKSB7Ci0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gIiBocmVmPVwiIiArIG5ld3VybCArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdXJsdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgbGluayB0eXBlIGZvciB0aGUgdXJsCi0JICogQHBhcmFtIHNvdXJjZSBTdHJpbmcgdGhlIGxpbmsKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdHlwZSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGlua1R5cGUoU3RyaW5nIHNvdXJjZSkgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfdHlwZV9waWNrZXIubWF0Y2hlcigiICIgKyBzb3VyY2UgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlyZXR1cm4gbS5ncm91cCgxKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBndWlkIGZyb20gdGhlIHVybAotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcmV0dXJuIFN0cmlnbiB0aGUgZ3VpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEd1aWRGcm9tVXJsKFN0cmluZyBzb3VyY2UpIHsKLQkJTWF0Y2hlciBtID0gcF9saW5rX2d1aWRfcGlja2VyLm1hdGNoZXIoIiAiICsgc291cmNlICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCW0gPSBwX2xpbmtfaHJlZl9waWNrZXIubWF0Y2hlcigiICIgKyBzb3VyY2UgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgaHJlZiA9IG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBnZXRHdWlkRnJvbUZpbGVOYW1lKGhyZWYpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogaGFuZGxlIGEgYnVnIGluIElFLiBhbmNob3IgdGFnIGNhbid0IGhhdmUgQ1IgTEYsIGxpa2UgPEEgXHJcbgotCSAqIGhyZWY9Ind3dy55YWhvby5jb20iIFxyXG4+IHNjYW4gdGhlIHN0cmluZyBzb3VyY2UsIGZpbmQgYWxsIGFuY2hvciB0YWdzCi0JICogYW5kIHJlcGxhY2Ugd2l0aCBzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHNvdXJjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlVGFnKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gUGF0dGVybiBwX2FuY2hvcl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIigqKz8pPSgqLj8pIiwKLQkJLy8gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gcF90YWdfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJLy8gU3RyaW5nQnVmZmVyIHRlbXBTYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZml4VGFnQXR0cmlidXRlKHRleHQpOwotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCX0KLQotCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGZpeCB0YWcgYXR0cmlidXRlCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4VGFnQXR0cmlidXRlKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gc2ltcGx5IHJlcGxhY2UgYWxsIENSIExGIHdpdGggJyAnLCBmaW5lIHR1bmUgbGF0ZXIKLQkJcmV0dXJuIHNvdXJjZQotCQkJCS5yZXBsYWNlQWxsKCJcXFxyXFxcbiIsICIgIikucmVwbGFjZUFsbCgiXFxcciIsICIgIikucmVwbGFjZUFsbCgiXFxcbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JfQotCi0vLwkvKioKLS8vCSAqIGdldCB0aGUgcmVzb3VyY2UgZmlsZSB1cmwgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotLy8JICogCi0vLwkgKiBAcGFyYW0gZQotLy8JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGlzIHJlc291cmNlCi0vLwkgKiBAcGFyYW0gZmlsZQotLy8JICogICAgICAgICAgICBGaWxlIHRoZSByZXNvdXJjZSdzIHBoeXNpY2FsIHBhdGgKLS8vCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB1cmwgdG8gdGhpcyByZXNvdXJjZSBmcm9tIHRoZSBlbGVtZW50Ci0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlRmlsZVVybChNZXRob2RFbGVtZW50IGUsIEZpbGUgZmlsZSkgewotLy8JCVN0cmluZyBmaWxlVXJsID0gZ2V0RmlsZVVybChmaWxlKTsKLS8vCQkvLyBTdHJpbmcgZWxlbWVudFBhdGggPQotLy8JCS8vIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRSZXNvdXJjZVBhdGgoZSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsCi0vLwkJLy8gJy8nKTsKLS8vCi0vLwkJZmlsZVVybCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGUpICsgZmlsZVVybDsKLS8vCi0vLwkJcmV0dXJuIGZpbGVVcmw7Ci0vLwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogcmV0dXJuIHRoZSBmaWxlJ3MgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luIHJvb3QKLS8vCSAqIAotLy8JICogQHBhcmFtIGYKLS8vCSAqIEByZXR1cm4gU3RyaW5nCi0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZpbGVVcmwoRmlsZSBmKSB7Ci0vLwkJU3RyaW5nIHBhdGggPSBnZXRGaWxlUmVsUGF0aChmKTsKLS8vCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLS8vCQlyZXR1cm4gcGF0aDsKLS8vCX0KLQotLy8JLyoqCi0vLwkgKiBnZXQgdGhlIFVSSSByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGJhc2UKLS8vCSAqIAotLy8JICogQHBhcmFtIHVyaQotLy8JICogQHJldHVybiBqYXZhLm5ldC5VUkkKLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBVUkkgZ2V0UmVsYXRpdmVVUkkoVVJJIHVyaSwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0vLwkJcmV0dXJuIGdldFJlbGF0aXZlVVJJKHVyaSwgbmV3IEZpbGUocm9vdFBhdGgpLnRvVVJJKCkpOwotLy8JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBVUkkgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBiYXNlCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJJCi0JICogQGRlcGxpY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRSZWxhdGl2ZVVSSShVUkkgdXJpLCBVUkkgcmVsYXRpdmVUbykgewotCQlVUkkgcmVsVXJpID0gcmVsYXRpdmVUby5yZWxhdGl2aXplKHVyaSk7Ci0JCXJldHVybiByZWxVcmk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIHJlc29sdmUgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGxpYnJhcnkgcm9vdAotLy8JICogCi0vLwkgKiBAcGFyYW0gZgotLy8JICogQHJldHVybiBTdHJpbmcgdGhlIHJhbHRpdmUgcGF0aAotLy8JICogQGRlcGxpY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm90IHZhbGlkIGZvciBkaXN0cmlidXRlZCBsaWJyYXJ5Ci0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGaWxlUmVsUGF0aChGaWxlIGYpIHsKLS8vCQlGaWxlIGxpYnJhcnlSb290UGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotLy8JCVN0cmluZyByb290ID0gbGlicmFyeVJvb3RQYXRoLmdldEFic29sdXRlUGF0aCgpOwotLy8JCVN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLS8vCQlpZiAocGF0aC5zdGFydHNXaXRoKHJvb3QpKSB7Ci0vLwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhyb290Lmxlbmd0aCgpKTsKLS8vCQl9Ci0vLwotLy8JCWlmIChwYXRoLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0vLwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBwYXRoOwotLy8JfQotCi0vLwkvKioKLS8vCSAqIGdldCB0aGUgVVJJIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLS8vCSAqIAotLy8JICogQHBhcmFtIGYKLS8vCSAqIEByZXR1cm4gamF2YS5uZXQuVVJJCi0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgamF2YS5uZXQuVVJJIGdldEZpbGVSZWxhdGl2ZVVSSShGaWxlIGYpIHsKLS8vCQlGaWxlIGxpYnJhcnlSb290UGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotLy8JCWphdmEubmV0LlVSSSBsaWJVUkkgPSBsaWJyYXJ5Um9vdFBhdGgudG9VUkkoKTsKLS8vCQlqYXZhLm5ldC5VUkkgZmlsZVVSSSA9IGYudG9VUkkoKTsKLS8vCQlqYXZhLm5ldC5VUkkgcmVsVXJpID0gbGliVVJJLnJlbGF0aXZpemUoZmlsZVVSSSk7Ci0vLwotLy8JCXJldHVybiByZWxVcmk7Ci0vLwl9Ci0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0YWNobWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoVG9GaWxlRnJvbUVsZW1lbnQoCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEZpbGUgYXR0YWNobWVudCkgewotCQlTdHJpbmcgZWxlbWVudExvYyA9IGdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KTsJCi0JCXJldHVybiBGaWxlVXRpbC5nZXRSZWxhdGl2ZVBhdGgoYXR0YWNobWVudCwgbmV3IEZpbGUoZWxlbWVudExvYykpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIHR5cGUgb2YgZGlhZ3JhbSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiAgICAgICAgICAgIFN0cmluZyBkaWFncmFtIHR5cGUgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGRpYWdyYW0gdHlwZQotCSAqICAgICAgICAgICAgY29uc3RhbnRzCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gSW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjdGl2aXR5L0NQIHNoYXJlIHRoZQotCQkvLyBzYW1lIGRpYWdyYW0gaW4gYSBEZWxpdmVyeSBQcm9jZXNzCi0JCS8vIG5lZWQgdG8gbWFrZSB0aGUgbmFtZSB1bmlxdWUKLS8vCQlyZXR1cm4gZ2V0RWxlbWVudFJlc291cmNlUGF0aChlKQotLy8JCQkJKyBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKGUuZ2V0TmFtZSgpKQotLy8JCQkJKyAiXyIgKyBlLmdldEd1aWQoKSArICJfIiArIGRpYWdyYW1UeXBlICsgRklMRV9FWFRfSlBFRzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlyZXR1cm4gZ2V0RWxlbWVudFJlc291cmNlUGF0aChlKQotCQkrIEZpbGVOYW1lR2VuZXJhdG9yLklOU1RBTkNFLmdldEZpbGVOYW1lKGUsICIiLCAiXyIgKyBkaWFncmFtVHlwZSwgRklMRV9FWFRfSlBFRyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhtbEV4cG9ydGVkRGlhZ3JhbUltYWdlRmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgZGlhZ3JhbVR5cGUsIFN0cmluZyBmb3JtYXQpIHsKLQkJU3RyaW5nIHN0ciA9IGUuZ2V0TmFtZSgpICsgIiAiICsgZS5nZXRHdWlkKCkgKyAiXyIgKyBkaWFncmFtVHlwZSArIGZvcm1hdDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBzdHI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic29sdXRlcGF0aChTdHJpbmcgcGF0aCkgewotCQkKLQkJaWYgKCBwYXRoID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggCXBhdGguc3RhcnRzV2l0aCgiLyIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgcGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSAKLQkJCQl8fCBwYXRoLmluZGV4T2YoIjoiKSA+IDAgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSBiYXNlZCBvbiB0aGUgdXJsCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgcGF0aCBvZiB0aGUgY29udGVudCB0aGF0IGNvbnRhaW5zIHRoaXMgdXJsCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29udGVudCBwdWJsaXNoaW5nIHJvb3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlUGF0aEZyb21VcmwoU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0KLQkJU3RyaW5nIGZpbGVQYXRoID0gdXJsOwotCQlpZiAoaXNFeHRlcm5hbExpbmsoZmlsZVBhdGgpCi0JCQkJfHwgZmlsZVBhdGguc3RhcnRzV2l0aCgibWFpbHRvOiIpIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoVVJMX0JPT0tNQVJLX0lORElDQVRPUikpIC8vJE5PTi1OTFMtMSQgCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihOZXRVdGlsLkZJTEVfUFJFRklYXzMpOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoTmV0VXRpbC5GSUxFX1BSRUZJWF8zLmxlbmd0aCgpKTsKLQkJfQotCi0JCWluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihOZXRVdGlsLkZJTEVfUFJFRklYXzIpOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoTmV0VXRpbC5GSUxFX1BSRUZJWF8yLmxlbmd0aCgpKTsKLQkJfQotCQkKLQkJaWYgKCBpc0Fic29sdXRlcGF0aChmaWxlUGF0aCkgKSB7Ci0JCQkvLyBhc3N1bWUgdGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoCi0JCQlyZXR1cm4gWE1MVXRpbC51bmVzY2FwZShOZXRVdGlsLmRlY29kZWRGaWxlVXJsKGZpbGVQYXRoKSk7Ci0vLwkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlGaWxlIGYgPSBuZXcgRmlsZShjb250ZW50UGF0aCk7Ci0JCQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbmRleCA9IDA7Ci0JCXdoaWxlICgoZiAhPSBudWxsKSAmJiAoaW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKCIuLi8iLCBzdGFydCkpID49IDApIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJZiA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJc3RhcnQgPSBpbmRleCArIDM7Ci0JCX0KLQkJCi0JCVN0cmluZyByb290Rm9sZGVyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGYgIT0gbnVsbCkgewotCQkJcm9vdEZvbGRlciA9IGYuZ2V0UGF0aCgpOwotCQl9Ci0KLQkJaWYgKHJvb3RGb2xkZXIubGVuZ3RoKCkgPiAwICYmICFyb290Rm9sZGVyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcm9vdEZvbGRlciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCi0JCS8vIHRoZSBmaWxlIHBhdGggaXMKLQkJU3RyaW5nIHBhdGggPSByb290Rm9sZGVyCi0JCQkJKyBmaWxlUGF0aC5zdWJzdHJpbmcoc3RhcnQpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCXJldHVybiBYTUxVdGlsLnVuZXNjYXBlKE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwocGF0aCkpOwotCX0KLQotCS8qKgotCSAqIGZvciB0aGUgZ2l2ZW4gY29udGVudCB3aXRoIHVybCBiYXNlZCBvbiB0aGUgb2xkQ29udGVudFBhdGgsIHJlc29sdmUgdG8KLQkgKiB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgY29udGVudFBhdGguIElmIGJhY2twYXRoIGlzCi0JICogc3BlY2lmaWVkLCBhZGQgdGhlIGJhY2tQYXRoLiByZXR1cm4gdGhlIHVwZGF0ZWQgY29udGVudC4gQSB0eXBpY2FsCi0JICogc2NlbmFyaW8gaXMgdGhlIGNvbnRlbnQgaXMgZnJvbSBhIGNvbnRyaWJ1dGluZyBlbGVtZW50LCB3aGljaCBoYXMgdXJscwotCSAqIHJlbGF0aXZlIHRvIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCdzIGNvbnRlbnRQYXRoLiBUaGlzIG1ldGhvZCB3aWxsIGZpeAotCSAqIHRoZSB1cmwgdG8gYmFzZWQgb24gdGhlIGJhc2UgZWxlbWVudCdzIGNvbnRlbnRQYXRoLgotCSAqIAotCSAqIFNvIGNhbGwgZml4Q29udGVudFVybFBhdGgoY29udHJpYnV0b3JfdGV4dCwgY29udHJpYnV0b3JfZWxlbWVudFBhdGgsCi0JICogYmFzZUVsZW1lbnRfYmFja1BhdGgpCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiBAcGFyYW0gb2xkQ29udGVudFBhdGgKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXBkYXRlZCBjb250ZW50IHdpdGggZml4ZWQgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhDb250ZW50VXJsUGF0aChTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJU3RyaW5nIGJhY2tQYXRoKSB7Ci0JCQotCQlpZiAoIGNvbnRlbnRQYXRoID09IG51bGwgfHwgYmFja1BhdGggPT0gbnVsbCApIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBwcm9jZXNzIGltYWdlcwotCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF9pbWFnZV9yZWYubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDMpOwotCQkJCXVybCA9IHJlc29sdmVVcmwodXJsLCBjb250ZW50UGF0aCwgYmFja1BhdGgpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUobS5ncm91cCgxKSArIHVybCArIG0uZ3JvdXAoNCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQljb250ZW50ID0gc2IudG9TdHJpbmcoKTsKLQkJCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCi0JCQkvLyBwcm9jZXNzIGF0dGFjaG1lbnRzCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZl9nZW4ubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZ0J1ZmZlciBzYkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJLy8gU3RyaW5nIHRhZyA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIHVybHRleHQgPSAiICIgKyBtLmdyb3VwKDIpICsgIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkKLQkJCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCkgPT0gbnVsbCkgewotCQkJCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX2hyZWZfcGlja2VyCi0JCQkJCQkJLm1hdGNoZXIodXJsdGV4dCk7Ci0JCQkJCWlmIChtMi5maW5kKCkpIHsKLQkJCQkJCVN0cmluZyB1cmwgPSBtMi5ncm91cCgxKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQlpZiAoIGlzRXh0ZXJuYWxMaW5rKHVybCkgKSB7Ci0JCQkJCQkJLy8gZGVjb2RlIGZvciBleHRlcm5hbCBsaW5rIAotCQkJCQkJCXVybCA9IFhNTFV0aWwudW5lc2NhcGUoTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmwpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdXJsID0gcmVzb2x2ZVVybCh1cmwsIGNvbnRlbnRQYXRoLCBiYWNrUGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSB1cmx0ZXh0LnN1YnN0cmluZyhtMi5zdGFydCgpLCBtMi5zdGFydCgxKSkKLQkJCQkJCQkJCSsgdXJsCi0JCQkJCQkJCQkrIHVybHRleHQuc3Vic3RyaW5nKG0yLmVuZCgxKSwgbTIuZW5kKCkpOwotCQkJCQkJCQotCQkJCQkJCW0yLmFwcGVuZFJlcGxhY2VtZW50KHNiTGluaywgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQkJCQkJbTIuYXBwZW5kVGFpbChzYkxpbmspOwotCQkJCQkJCQotCQkJCQkJCXJlcGxhY2VtZW50ID0gY29udGVudC5zdWJzdHJpbmcobS5zdGFydCgpLCBtLnN0YXJ0KDIpKQotCQkJCQkJCQkJKyBzYkxpbmsudG9TdHJpbmcoKSArIGNvbnRlbnQuc3Vic3RyaW5nKG0uZW5kKDIpLCBtLmVuZCgpKTsKLQkJCQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogQHBhcmFtIGJhY2tQYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVXJsKFN0cmluZyB1cmwsIFN0cmluZyBjb250ZW50UGF0aCwKLQkJCVN0cmluZyBiYWNrUGF0aCkgewotCQlTdHJpbmcgbmV3X3VybCA9IGdldEZpbGVQYXRoRnJvbVVybCh1cmwsIGNvbnRlbnRQYXRoKTsKLQkJaWYgKGlzQWJzb2x1dGVwYXRoKG5ld191cmwpKQotCQkJcmV0dXJuIG5ld191cmw7Ci0JCWlmIChuZXdfdXJsICE9IG51bGwgJiYgIW5ld191cmwuZXF1YWxzKHVybCkgKSB7Ci0JCQlpZiAoYmFja1BhdGggIT0gbnVsbCkgewotCQkJCW5ld191cmwgPSBiYWNrUGF0aCArIG5ld191cmw7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXdfdXJsLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX1VSTF9TVEFSVF9XSVRIID0gTGF5b3V0UmVzb3VyY2VzCi0JCQkuZ2V0U3RyaW5nKCJleHRlcm5hbFVybF9zdGFydFdpdGgiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfZXh0ZXJuYWxfdXJsX3N0YXJ0V2l0aCA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiKCIgKyBFWFRFUk5BTF9VUkxfU1RBUlRfV0lUSCArICIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdXJsIG9yIG5vdAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlcm5hbExpbmsoU3RyaW5nIHVybCkgewotCQkvLyAxNjI5NjkgLSBSZWZpbmUgZXh0ZXJuYWwgbGluaydzIHJlZ3VsYXIgZXhwIGluIGVwZi5saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcwotCQkvLyBmaWxlOi8vIHNob3VsZCBiZSBleGNsdWRlZAotCQlpZiAoIHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl1cmwgPSB1cmwudG9Mb3dlckNhc2UoKTsKLQkJaWYgKCB1cmwuc3RhcnRzV2l0aCgiZmlsZTovLyIpICkgeyAgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoIHVybC5zdGFydHNXaXRoKCJodHRwOi8vIikgCS8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoImZ0cDovLyIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCU1hdGNoZXIgbSA9IHBfZXh0ZXJuYWxfdXJsX3N0YXJ0V2l0aC5tYXRjaGVyKHVybCk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIChtLnN0YXJ0KDEpID09IDApOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhc2NyaXB0VXJsKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB1cmwuc3RhcnRzV2l0aChVUkxfU1RSX01BSUxUTykKLQkJCQl8fCB1cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9TVFJfSkFWQVNDUklQVCk7Ci0JfQotCQotCS8qKgotCSAqIGZpbmQgdGhlIHJlc291cmNlIGZpbGUgYmFzZWQgb24gdGhlIHVybCwgY29weSB0aGUgZmlsZSB0byB0aGUgZGVzdGluYXRpb24KLQkgKiBmb2xkZXIuIGlmIHRoZSBmaWxlIGlzIGFuIGh0bWwgYXR0YWNobWVudCwgc2NhbiB0aGUgZmlsZSByZWN1cnNpdmVseSBhbmQKLQkgKiBjb3B5IGNvbnRhaW5lZCBpbWFnZXMsIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQsIHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIHJlc291cmNlRmlsZQotCSAqICAgICAgICAgICAgRmlsZSwgdGhlIHJlc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHVybCB0byBiZSBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSB1cmwgb3duZXIsIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIHJvb3QgcGF0aAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgc291cmNlIHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBsaWJyYXJ5IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgdGFyZ2V0IHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAgICAgICAgICAgIHBhdGgKLQkgKiBAcGFyYW0gcm9vdENvbnRlbnRQYXRoIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSByb290Ci0JICogQHBhcmFtIHByb2Nlc3NlZEl0ZW1zCi0JICogICAgICAgICAgICBMaXN0LCBhIGxpc3QgdG8gaG9sZCBhbGwgcHJvY2Vzc2VkIHVybHMsIHRvIGF2b2lkIGR1cGxpY2F0ZQotCSAqICAgICAgICAgICAgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIElDb250ZW50VmFsaWRhdG9yCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHVybCwgbm90IHVzZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc1Jlc291cmNlVXJsKE1ldGhvZEVsZW1lbnQgb3duZXIsCi0JCQlGaWxlIHJlc291cmNlRmlsZSwgU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJRmlsZSBzb3VyY2VSb290UGF0aCwgRmlsZSB0YXJnZXRSb290UGF0aCwgU3RyaW5nIHJvb3RDb250ZW50UGF0aCwgTGlzdCBwcm9jZXNzZWRJdGVtcywKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodXJsID09IG51bGwgfHwgaXNFeHRlcm5hbExpbmsodXJsKSB8fCBpc0phdmFzY3JpcHRVcmwodXJsKQotCQkJCXx8IHVybC5zdGFydHNXaXRoKFVSTF9CT09LTUFSS19JTkRJQ0FUT1IpKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCQotCQkvLyBpZiB0aGUgdXJsIGNvbnRhaW5zIHRoZSBndWlkLCBpdCBtaWdodCBiZSBzb21lIGtpbmQgb2YgZWxlbWVudCBsaW5rLAotCQkvLyBmb3IgZXhhbXBsZSwgYWN0aXZpdHkgY2FuIGhhdmUgbW9kZWwgdGhhbiBvbmUgZWxlbWVudCBsaW5rCi0JCVN0cmluZyBndWlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWd1aWQgPSBvd25lci5nZXRHdWlkKCk7Ci0JCQlpZiAodXJsLmluZGV4T2YoZ3VpZCkgPj0gMCB8fCBpc0FjdGl2aXR5VGFiVXJsKHVybCkgKSB7CQkJCQotCQkJCXJldHVybiB1cmw7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIFB1Ymxpc2hpbmcgcmVwb3J0IGxpc3RzIG1pc3NpbmcgcmVzb3VyY2UgZmlsZXMgdGhhdAotCQkvLyBhcmUgcHJlc2VudAotCQkvLyBib29rbWFya3Mgc2hvdWxkIGJlIHN0cmlwcGVkIG91dCB3aGVuIGNoZWNraW5nIHJlc291cmNlCi0JCWludCBpbmRleCA9IHVybC5pbmRleE9mKFVSTF9CT09LTUFSS19JTkRJQ0FUT1IpOwotCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQlpbmRleCA9IHVybC5pbmRleE9mKFVSTF9QQVJBTUVURVJfSU5ESUNBVE9SKTsKLQkJfQotCi0JCVN0cmluZyB1cmxfdGFpbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA+IDApIHsKLQkJCXVybF90YWlsID0gdXJsLnN1YnN0cmluZyhpbmRleCk7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCi0JCVN0cmluZyBpbWFnZUZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXRGaWxlUGF0aEZyb21VcmwodXJsLCBjb250ZW50UGF0aCk7Ci0JCWlmIChpbWFnZUZpbGUgPT0gbnVsbCkgewotCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZXNvdXJjZShvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCQotCQkvLyBpbmRleC5odG0gaXMgdGhlIGRlZmF1bHQgaW5kZXggZmlsZSwgYWx3YXlzIGlnbm9yZSBpdAotCQlpZiAoaW1hZ2VGaWxlLmVxdWFsc0lnbm9yZUNhc2UoImluZGV4Lmh0bSIpIHx8IGltYWdlRmlsZS5lcXVhbHNJZ25vcmVDYXNlKCJpbmRleC5odG1sIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl7Ci0JCQlyZXR1cm4gdXJsICsgdXJsX3RhaWw7Ci0JCX0KLQotCQlTdHJpbmcgbmV3VXJsID0gdXJsOwotCi0JCUZpbGUgc291cmNlOwotCQlGaWxlIGRlc3Q7Ci0JCQotCQkvLyBpZiB0aGUgdXJsIGlzIGEgbG9jYWwgZmlsZSBpbiBhbiBhYnNvbHV0ZSBwYXRoLCB3ZSBkb24ndCBjb3B5IHRoZSBmaWxlLCBsZWF2ZSBhcyBpcwotCQlzb3VyY2UgPSBuZXcgRmlsZShpbWFnZUZpbGUpOwotCQlpZiAoIHNvdXJjZS5leGlzdHMoKSApIHsKLQkJCXJldHVybiB1cmwgKyB1cmxfdGFpbDsKLQkJfQotCi0JCS8vIGlmIHJvb3QgQ29udGVudCBwYXRoIGlzIHNldCwgcmVtb3ZlIGZyb20gdGhlIGZpbGUgcGF0aAotCQlib29sZWFuIHVzZVB1YlJvb3QgPSB0cnVlOwotCQlTdHJpbmcgZmlsZVBhdGggPSBpbWFnZUZpbGU7Ci0JCWlmICggcm9vdENvbnRlbnRQYXRoICE9IG51bGwgJiYgcm9vdENvbnRlbnRQYXRoLmxlbmd0aCgpID4gMCApIHsKLQkJCWlmICggZmlsZVBhdGguc3RhcnRzV2l0aChyb290Q29udGVudFBhdGgpICkgewotCQkJCWZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKHJvb3RDb250ZW50UGF0aC5sZW5ndGgoKSk7Ci0JCQkJdXNlUHViUm9vdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSByZWFsIGZpbGUsIGlmIG5vdCwgaXQgaXMgYSByZWZlcmVuY2UgdG8gYSBiYXNlCi0JCS8vIHBsdWdpbgotCQlzb3VyY2UgPSBuZXcgRmlsZShzb3VyY2VSb290UGF0aCwgZmlsZVBhdGgpOwotCQkKLQkJLy8gaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBleGlzdCwgbWlnaHQgYmUgYSByZWZlcmVuY2UgdG8gYSByZXNvdXJjZSBpbiBhbm90aGVyIHBsdWdpbj8KLQkJLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBjb250ZW50IGlzIGNvbnRyaWJ1dGVkIGZyb20gYW5vdGhlciBlbGVtZW50IGluIGFub3RoZXIgcGx1Z2luLCB0aGlzIHdpbGwgaGFwcGVuCi0JCWlmICghc291cmNlLmV4aXN0cygpKSB7Ci0JCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBtZ3IgPSBnZXRSZXNvdXJjZU1ncihvd25lcik7Ci0JCQlpZiAoIG1nciAhPSBudWxsICkgewotCQkJCVN0cmluZyB0bXBQYXRoID0gbWdyLnJlc29sdmUob3duZXIsIGZpbGVQYXRoKTsKLQkJCQlpZiAoIHRtcFBhdGggIT0gbnVsbCApIHsKLQkJCQkJc291cmNlID0gbmV3IEZpbGUodG1wUGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB0aGUgZmlsZSBpcyBub3QgaW4gdGhlIGxpYnJhcnksIGNoZWNrIHRoZSBwbHVnaW4gbGF5b3V0IGZvbGRlcgotCQlpZiAoIXNvdXJjZS5leGlzdHMoKSkgewotCQkJc291cmNlID0gbmV3IEZpbGUoTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0UGF0aCgpLAotCQkJCQlmaWxlUGF0aCk7Ci0JCX0KLQotCQkvLyBpZiB0aGUgZmlsZVBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIHB1YiByb290LCBmaXggdGhlIHRhcmdldCBwYXRoCi0JCWlmICggdXNlUHViUm9vdCAmJiByb290Q29udGVudFBhdGggIT0gbnVsbCAmJiByb290Q29udGVudFBhdGgubGVuZ3RoKCkgPiAwICkgewotCQkJRmlsZSB0bXBmID0gIG5ldyBGaWxlKHJvb3RDb250ZW50UGF0aCk7Ci0JCQl3aGlsZSAoIHRtcGYgIT0gbnVsbCApIHsKLQkJCQl0bXBmID0gdG1wZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJdGFyZ2V0Um9vdFBhdGggPSB0YXJnZXRSb290UGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWRlc3QgPSBuZXcgRmlsZSh0YXJnZXRSb290UGF0aCwgZmlsZVBhdGgpOwotCi0JCWlmIChzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNvdXJjZSwgZGVzdCk7Ci0KLQkJCS8vIGlmIHRoZSBmaWxlIGlzIGFuIGh0bWwgYXR0YWNobWVudCwgbmVlZCB0byBzY2FuIHRoZSBmaWxlIGFuZCBjb3B5Ci0JCQkvLyB0aGUgcmVmZXJlbmNlZCBmaWxlIGluIGl0LCByZWN1cnNpdmVseQotCQkJaWYgKGltYWdlRmlsZS5lbmRzV2l0aChSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE0pCi0JCQkJCXx8IGltYWdlRmlsZS5lbmRzV2l0aChSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKSkgewotCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb2x2ZVJlc291cmNlcyhvd25lciwgZiwgRmlsZVV0aWwucmVhZEZpbGUoc291cmNlLAotCQkJCQkJCUZpbGVVdGlsLkVOQ09ESU5HX1VURl84KS50b1N0cmluZygpLCBmLmdldFBhcmVudCgpLAotCQkJCQkJCXNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCBwcm9jZXNzZWRJdGVtcywKLQkJCQkJCQl2YWxpZGF0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgdGhlcmUsIG1pZ2h0IGJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSwgc28KLQkJLy8gZG9uJ3QgbG9nIGl0Ci0JCWVsc2UgaWYgKCFkZXN0LmV4aXN0cygpICYmIGlzVmFsaWRGaWxlVXJsKHVybCkgJiYgKHZhbGlkYXRvciAhPSBudWxsKSkgewotCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZXNvdXJjZShvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1VybCArIHVybF90YWlsOwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2aXR5VGFiVXJsKFN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIEFjdGl2aXR5TGF5b3V0LmlzQWN0aXZpdHlUYWJVcmwodXJsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZVVybChTdHJpbmcgdXJsKSB7Ci0JCS8vIGp1c3QgYSB0ZW1wIHNvbHV0aW9uIGhlcmUgdG8gZ2V0IHJpZCBvZiB0aGUgd3JvbmcgcmVwb3J0aW5nIG9mIG1zc2luZwotCQkvLyByZXNvdXJjZQotCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmVxdWFscygiJyArIGRpYWdyYW1faW1nICsgJyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGltYWdlcyBpbiB0aGUgdGV4dC4gY29weSB0aGUgaW1hZ2UgdG8gZGVzdGluYXRpb24gaWYgbmVlZGVkCi0JICogVGhpcyBpcyB1c2VkIGZvciBjb3B5aW5nIHJlc291cmNlcyBmcm9tIGEgbGlicmFyeSB0byBhbm90aGVyIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50LCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSByZXNvdXJjZUZpbGUKLQkgKiAgICAgICAgICAgIEZpbGUsIHRoZSByZXNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgY29udGVudCBzdHJpbmcgdG8gYmUgcHJvY2Vzc2VkCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgc291cmNlIHRleHQsIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIHJvb3QgcGF0aAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgc291cmNlIHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBsaWJyYXJ5IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgdGFyZ2V0IHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAgICAgICAgICAgIHBhdGgKLQkgKiBAcGFyYW0gcm9vdENvbnRlbnRQYXRoIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSByb290Ci0JICogQHBhcmFtIHByb2Nlc3NlZEl0ZW1zCi0JICogICAgICAgICAgICBMaXN0LCBhIGxpc3QgdG8gaG9sZCBhbGwgcHJvY2Vzc2VkIHVybHMsIHRvIGF2b2lkIGR1cGxpY2F0ZQotCSAqICAgICAgICAgICAgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIElDb250ZW50VmFsaWRhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVSZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQlTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoLCBGaWxlIHNvdXJjZVJvb3RQYXRoLAotCQkJRmlsZSB0YXJnZXRSb290UGF0aCwgU3RyaW5nIHJvb3RDb250ZW50UGF0aCwgTGlzdCBwcm9jZXNzZWRJdGVtcywKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQlpZiAoIXByb2Nlc3NlZEl0ZW1zLmNvbnRhaW5zKHVybCkpIHsKLQkJCQkJLy8gbm90ZTogYWRkIHRoZSB1cmwgaW50byB0aGUgcHJvY2Vzc2VkSXRlbXMgbGlzdCBmaXJzdCwKLQkJCQkJLy8gb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybCBjb250ZW50IGhhcwotCQkJCQkvLyByZWZlcmVuY2UgYmFjayB0byB0aGUgb3duZXIKLQkJCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKHVybCk7Ci0JCQkJCVJlc291cmNlSGVscGVyLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwsCi0JCQkJCQkJY29udGVudFBhdGgsIHNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCAKLQkJCQkJCQlwcm9jZXNzZWRJdGVtcywgdmFsaWRhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW0gPSBSZXNvdXJjZUhlbHBlci5wX2Nzc19yZWYubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyBjc3NVUkwgPSBtLmdyb3VwKDEpOwotCi0JCQkJLy8gaXQncyBoYXJkIHRvIHRlbGwgaWYgdGhpcyBpcyBhIHJpZ2h0IG1hdGNoIG9yIG5vdAotCQkJCS8vIHNpbmNlIHdlIGNhbid0IHRlbGwgaWYgdGhlIG1hdGNoZWQgb25lIGlzIGFjdHVhbGx5IGZyb20gYSBjc3MKLQkJCQkvLyBvciBqdXN0IGEgaHRtbCB0ZXh0Ci0JCQkJLy8gZm9yIGV4YW1wbGUsIHRleHQgY2FuIGhhdmUgc29tZXRoaW5nIGxpa2UgdXJsKHh4eCkgd2hpY2ggaXMKLQkJCQkvLyBtYXRjaGVkIGhlcmUKLQkJCQkvLyB3ZSBkb24ndCB3YW50IHRvIHJlcG9ydCBtaXNzaW5nIHJlc291cmNlIGZvciB0aGlzCi0JCQkJLy8gc28gZG9uJ3Qgc2V0IHRoZSB2YWxpZGF0b3IKLQkJCQkvLyBQdWJsaXNoaW5nIHdhcm5pbmdzOiBpbmFwcHJvcHJpYXRlIHdhcm5pbmdzCi0JCQkJLy8gY29taW5nIGZyb20gcmVxdWlyZWQgY29weXJpdGUuaHRtCi0KLQkJCQlpZiAoIXByb2Nlc3NlZEl0ZW1zLmNvbnRhaW5zKGNzc1VSTCkpIHsKLQkJCQkJLy8gbm90ZTogYWRkIHRoZSB1cmwgaW50byB0aGUgcHJvY2Vzc2VkSXRlbXMgbGlzdCBmaXJzdCwKLQkJCQkJLy8gb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybCBjb250ZW50IGhhcwotCQkJCQkvLyByZWZlcmVuY2UgYmFjayB0byB0aGUgb3duZXIKLQkJCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKGNzc1VSTCk7Ci0JCQkJCVJlc291cmNlSGVscGVyCi0JCQkJCQkJLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgcmVzb3VyY2VGaWxlLCBjc3NVUkwsCi0JCQkJCQkJCQljb250ZW50UGF0aCwgc291cmNlUm9vdFBhdGgsCi0JCQkJCQkJCQl0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCBwcm9jZXNzZWRJdGVtcywgbnVsbC8qIHZhbGlkYXRvciAqLyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBwcm9jZXNzIGF0dGFjaG1lbnRzCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZl9nZW4ubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCS8vIFN0cmluZyB0YWcgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCkgPT0gbnVsbCkgewotCQkJCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX2hyZWZfcGlja2VyCi0JCQkJCQkJLm1hdGNoZXIoIiAiICsgdXJsdGV4dCArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAobTIuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbTIuZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWlmICghcHJvY2Vzc2VkSXRlbXMuY29udGFpbnModXJsKSkgewotCQkJCQkJCS8vIG5vdGU6IGFkZCB0aGUgdXJsIGludG8gdGhlIHByb2Nlc3NlZEl0ZW1zIGxpc3QKLQkJCQkJCQkvLyBmaXJzdCwgb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybAotCQkJCQkJCS8vIGNvbnRlbnQgaGFzIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBvd25lcgotCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZCh1cmwpOwotCQkJCQkJCVJlc291cmNlSGVscGVyLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwKLQkJCQkJCQkJCXJlc291cmNlRmlsZSwgdXJsLCBjb250ZW50UGF0aCwKLQkJCQkJCQkJCXNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCAKLQkJCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLCB2YWxpZGF0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGFrZSB0aGUgdGFnIGF0dHJpYnV0ZXMgc3RyaW5nIGFzIGlucHV0IGFuZCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUKLQkgKiBuYW1lLXZhbHVlIG1hcAotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzU3RyCi0JICogQHJldHVybiBNYXAgdGhlIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIG1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFRhZ0F0dHJpYnV0ZXMoU3RyaW5nIGF0dHJpYnV0ZXNTdHIpIHsKLQkJdHJ5IHsKLQkJCS8vIHVzZSBMaW5rZWRIYXNoTWFwIHRvIHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBhdHRyaWJ1dGVzCi0JCQlNYXAgYXR0cmlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoMyk7Ci0JCQlNYXRjaGVyIG0yID0gcF90YWdfYXR0cmlidXRlcy5tYXRjaGVyKGF0dHJpYnV0ZXNTdHIpOwotCi0JCQl3aGlsZSAobTIuZmluZCgpKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gbTIuZ3JvdXAoMSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG0yLmdyb3VwKDMpICE9IG51bGwpIHsKLQkJCQkJYXR0clZhbHVlID0gbTIuZ3JvdXAoMykudHJpbSgpOwotCQkJCX0gZWxzZSBpZiAobTIuZ3JvdXAoMikgIT0gbnVsbCkgewotCQkJCQlhdHRyVmFsdWUgPSBtMi5ncm91cCgyKS50cmltKCk7Ci0JCQkJfQkJCQkKLQkJCi0JCQkJLy8gQ2Fubm90IFByZXZpZXcvQnJvd3NlIERlc2NyaXB0aW9uIFRhYiB3aGVuCi0JCQkJLy8gdGhlIENQIGNvbnRhaW5zIGNoaW5lc2UgY2hhcmFjdGVycwotCQkJCS8vIGdlbmVyYXRlZCBodG1sIGZyb20geHNsdCBnb3QgdGhlIGhyZWYgdXJscyBlbmNvZGVkLiB3ZSBkb24ndCB3YW50Ci0JCQkJLy8gdGhhdCBtYWtlIHN1cmUgZGVjb2RlIHRoZSB1cmwgdXNpbmcgIlVURi04IiBlbmNvZGluZwotCQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoVEFHX0FUVFJfSFJFRikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWF0dHJWYWx1ZSA9IFVSTERlY29kZXIuZGVjb2RlKGF0dHJWYWx1ZSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJYXR0cmlidXRlTWFwLnB1dChhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkJCX0KLQkJCXJldHVybiBhdHRyaWJ1dGVNYXA7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIG1hcCBmb3IgYW4gSFRNTCBsaW5rCi0JICogCi0JICogQHBhcmFtIGxpbmsKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEF0dHJpYnV0ZXNGcm9tTGluayhTdHJpbmcgbGluaykgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfcmVmLm1hdGNoZXIobGluayk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIGF0dHJpYnV0ZXMgPSBtLmdyb3VwKDEpOwotCQkJcmV0dXJuIGdldFRhZ0F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgYXR0cmlidXRlIG5hbWUtdmFsdWUgbWFwIGZvciBhbiBIVE1MIGxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0QXR0cmlidXRlc0Zyb21MaW5rKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIGxpbmspIHsKLQkJTWF0Y2hlciBtID0gcGF0dGVybi5tYXRjaGVyKGxpbmspOwotCQlpZiAobS5maW5kKCkpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVzID0gbS5ncm91cCgxKTsKLQkJCXJldHVybiBnZXRUYWdBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiB0YWtlcyBhbiBhdHRyaWJ1dGVNYXAgKGllLCBmcm9tICNnZXRUYWdBdHRyaWJ1dGVzKSBhbmQgcmV0dXJucyB0aGUgU3RyaW5nCi0JICogcmVwcmVzZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVzQXNTdHJpbmcoTWFwIGF0dHJpYnV0ZU1hcCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KGtleSk7Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkKLQkJCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1Zi5hcHBlbmQoa2V5ICsgIj1cIiIgKyB2YWx1ZSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQmFkIGxpbmsgZnJvbSBXZWxjb21lIHBhZ2UgaHVtcCBjaGFydAotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREaXNjYXJkZWRFbGVtZW50VVJMKE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudCBsaW5rRWxlbWVudCwgU3RyaW5nIGd1aWQsIFN0cmluZyBwdWJEaXIpIHsKLQkJU3RyaW5nQnVmZmVyIGRpc2NhcmRlZEVsZW1lbnRVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZGlzY2FyZGVkRWxlbWVudFVSTC5hcHBlbmQoTUlTU0lOR19QQUdFU19GT0xERVIpLmFwcGVuZCgKLQkJCQkicGFnZXNfbm90X2luc3RhbGxlZCIpLmFwcGVuZChGSUxFX0VYVF9IVE1MKTsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKHB1YkRpciwgZGlzY2FyZGVkRWxlbWVudFVSTC50b1N0cmluZygpKTsKLQkJRmlsZSBkaXIgPSBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKCFkaXIuZXhpc3RzKCkpIHsKLQkJCWRpci5ta2RpcnMoKTsKLQkJfQotCi0JCS8vIGdlbmVyYXRlIHRoZSBodG1sIGZpbGUKLQkJWG1sRWxlbWVudCB4bWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkJeG1sCi0JCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGd1aWQpLnNldEF0dHJpYnV0ZSgidHlwZSIsIGxpbmtFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBsaW5rRWxlbWVudC5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJInBsdWdpbk5hbWUiLCBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4obGlua0VsZW1lbnQpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCQotCQlTdHJpbmcgeHNsUGF0aCA9IExheW91dFJlc291cmNlcy5nZXREZWZhdWx0WHNsUGF0aCgicGFnZV9ub3RfaW5zdGFsbGVkIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIHhtbDIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl4bWwyLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbC50b1htbCgpKTsKLQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJvcGVydGllcyB4c2xQYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlYU0xUUHJvY2Vzc29yCi0JCQkJCS50cmFuc2Zvcm0oeHNsUGF0aCwgeG1sMi50b1N0cmluZygpLCB4c2xQYXJhbXMsIG91dHB1dCk7Ci0JCQlvdXRwdXQuZmx1c2goKTsKLQkJCW91dHB1dC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEJhY2tQYXRoKG93bmVyRWxlbWVudCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkrIGRpc2NhcmRlZEVsZW1lbnRVUkwudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogRk9SIFVTRSBXSVRIIFJJQ0ggVEVYVCBFRElUT1IKLQkgKiB2YWxpZGF0ZSB0aGUgY29udGVudCBieSBjaGVja2luZyBlbGVtZW50IGxpbmtzIGFuZCBpbWFnZXMsIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBvd25lcgotCSAqIAotCSAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSB2YWxpZGF0ZUNvbnRlbnQgbWV0aG9kLCBleGNlcHQgaXQgZG9lcyBub3QgZGVjb2RlIHRoZSByZXN1bHRzCi0JICogdmlhIFVSTERlY29kZXIuZGVjb2RlKCkKLQkgKiAKLQkgKiAgdGhpcyB3aWxsIGRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIEhUTUw6Ci0JICogIDEuICB1cGRhdGUgRWxlbWVudCBMaW5rcwotCSAqICAyLiAgY2hhbmdlIDxBIC4uPiB0byA8YSAuLj4KLQkgKiAgMy4gIGNoYW5nZSA8L0E+IHRvIDwvYT4KLQkgKiAgNC4gIGFkZCBkb3VibGUtcXVvdGVzICgiKSBhcm91bmQgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50LCB0aGUgZWxlbWVudCB0aGF0IG93bnMgdGhlIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gd2hpY2ggdGhlIGNvbnRlbnQgaXMKLQkgKiAgICAgICAgICAgIHZhbGlkYXRlZAotCSAqIEBwYXJhbSBsaW5rZWRFbGVtZW50cwotCSAqICAgICAgICAgICAgTGlzdCBhIHBhc3NlZCBpbiBsaXN0IHRvIGNvbGxlY3QgdGhlIGxpbmtlZCBlbGVtZW50cyBpbiB0aGlzCi0JICogICAgICAgICAgICBjb250ZW50LCBpZiBudWxsLCBubyBsaW5rZWQgZWxlbWVudHMgYXJlIGNvbGxlY3RlZC4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdmFsaWRhdGVkIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZVJpY2hUZXh0Q29udGVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzb3VyY2UsIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotIAkJdHJ5IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCQotCQkJLy8gZmlyc3QgdmFsaWRhdGUgdGhlIHRhZ3MsIHJlbW92ZSBhbnkgQ0YvTEYgZnJvbSB0aGUgdGFnIHRleHQKLQkJCXNvdXJjZSA9IHZhbGlkYXRlVGFnKHNvdXJjZSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU1hdGNoZXIgbSA9IHBfbGlua19yZWYubWF0Y2hlcihzb3VyY2UpOwotCi0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCS8vIFByb2JsZW1zIHBhcnNpbmcgPGEgaHJlZj4gdGFncwotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIGFsbCBMRiwgQ1Igd2l0aGluIHRoZSA8YSAuLj4gdGFnCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBsaW5rZWRUZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlMaW5rSW5mbyBpbmZvID0gdmFsaWRhdG9yLnZhbGlkYXRlTGluayhlbGVtZW50LCB1cmx0ZXh0LAotCQkJCQkJbGlua2VkVGV4dCwgY29uZmlnLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gaW5mby5nZXRIdG1sKHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSkudG9TdHJpbmcoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaW5mby5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbCgiZmlsZTovLy8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUFsbCgiZmlsZTovLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0KLQotCQkJLy8gYWxzbyBmaXggdGhlIGFyZWEgbWFwCi0JCQlzb3VyY2UgPSBzYi50b1N0cmluZygpOwotCQkJbSA9IHBfYXJlYV9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJc2Iuc2V0TGVuZ3RoKDApOwotCi0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCS8vIFByb2JsZW1zIHBhcnNpbmcgPGEgaHJlZj4gdGFncwotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIGFsbCBMRiwgQ1Igd2l0aGluIHRoZSA8YSAuLj4gdGFnCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCUxpbmtJbmZvIGluZm8gPSB2YWxpZGF0b3IudmFsaWRhdGVMaW5rKGVsZW1lbnQsIHVybHRleHQsCi0JCQkJCQkiIiwgY29uZmlnLCAiYXJlYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCXRleHQgPSBpbmZvLmdldEh0bWwodmFsaWRhdG9yLnNob3dCcm9rZW5MaW5rcygpKS50b1N0cmluZygpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBpbmZvLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yLmFkZFJlZmVyZW5jZWRFbGVtZW50KGVsZW1lbnQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdGV4dC5yZXBsYWNlQWxsKCJmaWxlOi8vLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC5yZXBsYWNlQWxsKCJmaWxlOi8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCX0KLQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotLy8JLyoqCi0vLwkgKiBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBsb2NhdGlvbi4KLS8vCSAqIHJlY3Vyc2l2ZSBhbGwgaXQncyBjb250YWluZWQgZWxlbWVudHMgaWYgcmVjdXJzaXZlIGlzIHRydWUuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiBAcGFyYW0gZnJvbQotLy8JICogQHBhcmFtIHRvCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5QWxsUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRmlsZSBmcm9tLCBGaWxlIHRvLCBib29sZWFuIHJlY3Vyc2l2ZSkgewotLy8JCQotLy8JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKGZyb20sIHRvLCApOwotLy8JCXNjYW5uZXIuc2V0VGFyZ2V0Um9vdFBhdGgodG8pOwotLy8JCXNjYW5uZXIuY29weVJlc291cmNlcyhlbGVtZW50KTsKLS8vCQkKLS8vCQlpZiAoIHJlY3Vyc2l2ZSApIHsKLS8vCQkJZm9yICggSXRlcmF0b3IgaXQgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLS8vCQkJCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLS8vCQkJCQlzY2FubmVyLmNvcHlSZXNvdXJjZXMoKE1ldGhvZEVsZW1lbnQpb2JqKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZSkgewkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJcmV0dXJuIGdldEZvbGRlckFic29sdXRlUGF0aChwbHVnaW4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpblBhdGgoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKHBsdWdpbik7Ci0JfQotCQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVNjYW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMwZTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc2NhbiBhbmQgY29weSByZXNvdXJjZXMgZnJvbSBhIHBsdWdpbiB0byBhbm90aGVyIHBsdWdpbi4KLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlU2Nhbm5lciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9zcmNfcmVmID0gUGF0dGVybi5jb21waWxlKAotCQkJInNyY1xccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2hyZWZfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSJocmVmXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBzcmNQbHVnaW47Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gdGd0UGx1Z2luOwotCQotCXByaXZhdGUgRmlsZSBzcmNQbHVnaW5Sb290OwotCXByaXZhdGUgRmlsZSB0Z3RQbHVnaW5Sb290OwotCQotCXByaXZhdGUgRmlsZSBzcmNQbHVnaW5Sb290UGFyZW50OwotCXByaXZhdGUgRmlsZSB0Z3RQbHVnaW5Sb290UGFyZW50OwotCQotCXByaXZhdGUgTWFwPEZpbGUsIEZpbGU+IGZpbGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxGaWxlLCBGaWxlPigpOwotCXByaXZhdGUgU2V0PEZpbGU+IHRndEZpbGVTZXQgPSBuZXcgSGFzaFNldDxGaWxlPigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTY2FubmVyKE1ldGhvZFBsdWdpbiBzcmNQbHVnaW4sIE1ldGhvZFBsdWdpbiB0Z3RQbHVnaW4pIHsKLQkJdGhpcy5zcmNQbHVnaW4gPSBzcmNQbHVnaW47Ci0JCXRoaXMudGd0UGx1Z2luID0gdGd0UGx1Z2luOwotCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNQbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlGaWxlIHRndEZpbGUgPSBuZXcgRmlsZSh0Z3RQbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlzcmNQbHVnaW5Sb290ID0gc3JjRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCXRndFBsdWdpblJvb3QgPSB0Z3RGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJc3JjUGx1Z2luUm9vdFBhcmVudCA9IHNyY1BsdWdpblJvb3QuZ2V0UGFyZW50RmlsZSgpOwotCQl0Z3RQbHVnaW5Sb290UGFyZW50ID0gdGd0UGx1Z2luUm9vdC5nZXRQYXJlbnRGaWxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBzY2FuKE1ldGhvZEVsZW1lbnQgc3JjRWxlbWVudCwgTWV0aG9kRWxlbWVudCB0Z3RFbGVtZW50LCBTdHJpbmcgc291cmNlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLyoJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm1haW5EZXNjcmlwdGlvbiIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzcmNFbGVtZW50OiAiICsgc3JjRWxlbWVudC5nZXROYW1lKCkgKyAiLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkpOwotCQl9Ki8KLQkJU3RyaW5nIHNyY1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChzcmNFbGVtZW50KTsKLQkJaWYgKHNyY1BhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCQlTdHJpbmcgdGd0UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKHRndEVsZW1lbnQpOwotCQlpZiAodGd0UGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAoc3JjUGF0aC5pbmRleE9mKHNyY1BsdWdpbi5nZXROYW1lKCkpID09IDApIHsKLQkJCQl0Z3RQYXRoID0gdGd0UGx1Z2luLmdldE5hbWUoKSArIHNyY1BhdGguc3Vic3RyaW5nKHNyY1BsdWdpbi5nZXROYW1lKCkubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gc291cmNlOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBzcmNGb2xkZXIgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290UGFyZW50LCBzcmNQYXRoKTsKLQkJRmlsZSB0Z3RGb2xkZXIgPSBuZXcgRmlsZSh0Z3RQbHVnaW5Sb290UGFyZW50LCB0Z3RQYXRoKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzIGFuZCBvdGhlciBzcmMgcmVzb3VyY2VzCi0JCQlNYXRjaGVyIG0gPSBwX3NyY19yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIHRndFVybCA9IHJlZ2lzdGVyRmlsZUNvcHkoc3JjRm9sZGVyLCB0Z3RGb2xkZXIsIHVybCk7Ci0JCQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gdGV4dC5yZXBsYWNlKHVybCwgdGd0VXJsKTsKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQocmVwbGFjZVRleHQpKTsJCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQkvLyBwcm9jZXNzIGhyZWZzCi0JCQltID0gcF9ocmVmX3JlZi5tYXRjaGVyKHNiLnRvU3RyaW5nKCkpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIHRndFVybCA9IHJlZ2lzdGVyRmlsZUNvcHkoc3JjRm9sZGVyLCB0Z3RGb2xkZXIsIHVybCk7Ci0JCQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gdGV4dC5yZXBsYWNlKHVybCwgdGd0VXJsKTsKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQocmVwbGFjZVRleHQpKTsJCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyByZWdpc3RlckZpbGVDb3B5KFN0cmluZyBzcmNVcmwpIHsKLQkJcmV0dXJuIHJlZ2lzdGVyRmlsZUNvcHkoc3JjUGx1Z2luUm9vdCwgdGd0UGx1Z2luUm9vdCwgc3JjVXJsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNyY0ZvbGRlcgotCSAqIEBwYXJhbSB0Z3RGb2xkZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybiB0Z3RVcmwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZWdpc3RlckZpbGVDb3B5KEZpbGUgc3JjRm9sZGVyLCBGaWxlIHRndEZvbGRlciwgU3RyaW5nIHNyY1VybCkgewotCQlpZiAoc3JjVXJsID09IG51bGwpIHsKLQkJCXJldHVybiBzcmNVcmw7Ci0JCX0KLQotCQlTdHJpbmcgdGd0VXJsID0gc3JjVXJsOwotCQlpbnQgaW5kZXggPSB0Z3RVcmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQl0Z3RVcmwgPSB0Z3RVcmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCi0JCWluZGV4ID0gdGd0VXJsLmluZGV4T2YoIj8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJdGd0VXJsID0gdGd0VXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQotCQlpZiAodGd0VXJsLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gc3JjVXJsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0ZvbGRlciwgc3JjVXJsKTsKLQkJCUZpbGUgdGd0RmlsZSA9IG5ldyBGaWxlKHRndEZvbGRlciwgdGd0VXJsKTsKLQkJCQotCQkJaWYgKHNyY0ZpbGUuaXNGaWxlKCkgJiYgc3JjRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0Z3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWlmICh0Z3RGaWxlLmxhc3RNb2RpZmllZCgpID09IHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkKLQkJCQkJCQkmJiB0Z3RGaWxlLmxlbmd0aCgpID09IHNyY0ZpbGUubGVuZ3RoKCkpIHsKLQkJCQkJCXJldHVybiB0Z3RVcmw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGd0VXJsID0gdGhpcy5nZXRUYXJnZXRVcmwoc3JjRmlsZSwgdGd0Rm9sZGVyLCB0Z3RVcmwpOwotCQkJCXRndEZpbGUgPSBuZXcgRmlsZSh0Z3RGb2xkZXIsIHRndFVybCk7OwotCQkJCQotCQkJCXNyY0ZpbGUgPSBzcmNGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCQl0Z3RGaWxlID0gdGd0RmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CQkJCQotCQkJCWZpbGVNYXAucHV0KHNyY0ZpbGUsIHRndEZpbGUpOwkJCQkKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiB0Z3RVcmw7Ci0JfQotCi0KLQkvKioKLQkgKiBjb3B5IGFsbCB0aGUgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29weUZpbGVzKCkgewotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gY29weUZpbGVzOiAiKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmaWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJRmlsZSBzcmNGaWxlID0gKEZpbGUpIGVudHJ5LmdldEtleSgpOwotCQkJRmlsZSB0Z3RGaWxlID0gKEZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0Z3RGaWxlKTsJCQkKLQkJCXRndEZpbGUuc2V0TGFzdE1vZGlmaWVkKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkpOwkJCQotCQkJCi0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNyY0ZpbGU6ICIgKyBzcmNGaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHRndEZpbGU6ICIgKyB0Z3RGaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFRhcmdldFVybChGaWxlIHNyY0ZpbGUsIEZpbGUgdGd0Rm9sZGVyLCBTdHJpbmcgdGd0VXJsMCkgewotCQlTdHJpbmcgZG90ID0gIi4iOwkvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1cmwxID0gdGd0VXJsMDsKLQkJU3RyaW5nIHVybDIgPSAiIjsJLy8kTk9OLU5MUy0xJAotCQkKLQkJaW50IGl4ID0gdGd0VXJsMC5sYXN0SW5kZXhPZihkb3QpOwotCQlpbnQgbGVuID0gdGd0VXJsMC5sZW5ndGgoKTsKLQotCQlib29sZWFuIGFkZERvdCA9IGZhbHNlOwotCQlpZiAoaXggPiAwICYmIGl4IDwgbGVuKSB7Ci0JCQl1cmwxID0gdGd0VXJsMC5zdWJzdHJpbmcoMCwgaXgpOwotCQkJdXJsMiA9IHRndFVybDAuc3Vic3RyaW5nKGl4ICsgMSwgbGVuKTsKLQkJCWFkZERvdCA9IHRydWU7Ci0JCX0KLQkJCi0JCVN0cmluZyB0Z3RVcmwgPSB0Z3RVcmwwOwotCQlGaWxlIHRndEZpbGUgPSBuZXcgRmlsZSh0Z3RGb2xkZXIsIHRndFVybCk7Ci0JCVN0cmluZyB1ID0gIl8iOwkvLyROT04tTkxTLTEkCi0JCWludCBpID0gMTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWJvb2xlYW4gZXhpc3RzID0gdGd0RmlsZS5leGlzdHMoKTsKLQkJCWlmIChleGlzdHMpIHsKLQkJCQlpZiAodGd0RmlsZS5sYXN0TW9kaWZpZWQoKSA9PSBzcmNGaWxlLmxhc3RNb2RpZmllZCgpCi0JCQkJCQkmJiB0Z3RGaWxlLmxlbmd0aCgpID09IHNyY0ZpbGUubGVuZ3RoKCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQkJCQotCQkJCi0JCQlib29sZWFuIGluVGd0U2V0ID0gdGd0RmlsZVNldC5jb250YWlucyh0Z3RGaWxlKTsKLQkJCWlmICghIGV4aXN0cyAmJiAhaW5UZ3RTZXQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQkJCQotCQkJaWYgKGluVGd0U2V0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZSBmaWxlID0gZmlsZU1hcC5nZXQoc3JjRmlsZS5nZXRDYW5vbmljYWxGaWxlKCkpOwotCQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXF1YWxzKHRndEZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpKSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCQkJCQotCQkJdGd0VXJsID0gdXJsMSArIHUgKyBpOwotCQkJaWYgKGFkZERvdCkgewotCQkJCXRndFVybCArPSBkb3QgKyB1cmwyOwotCQkJfQotCQkJdGd0RmlsZSA9IG5ldyBGaWxlKHRndEZvbGRlciwgdGd0VXJsKTsJCQkKLQkJCWkrKzsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXRndEZpbGUgPSB0Z3RGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCQl0Z3RGaWxlU2V0LmFkZCh0Z3RGaWxlKTsJCQotCQlyZXR1cm4gdGd0VXJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUmVzb3VyY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlMzNhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgTWV0aG9kIExpYnJhcnkgYXMgYSBwcm9qZWN0IGluIHRoZSBFY2xpcHNlCi0gKiB3b3Jrc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWV0aG9kTGlicmFyeU5hdHVyZSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbWV0aG9kTGlicmFyeU5hdHVyZXMgPSB7IG1ldGhvZExpYnJhcnlOYXR1cmUgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19GSUxFTkFNRSA9ICIubG9jayI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG9wZW4oTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCW9wZW4oZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliRGlyIFN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG9wZW4oU3RyaW5nIGxpYkRpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxpYkRpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyBJUHJvamVjdERlc2NyaXB0aW9uLkRFU0NSSVBUSU9OX0ZJTEVfTkFNRSk7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbihwYXRoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIG1pc3NpbmcgLnByb2plY3QgZmlsZQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIjIyMgLSBleGNlcHRpb24gaW4gbG9hZFByb2plY3REZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJLy8gLnByb2plY3QgZmlsZSBpcyBtaXNzaW5nIC0gY3JlYXRlIGEgbmV3IHByb2plY3QKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXByb2plY3QgPSBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChsaWJEaXIsIG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyAucHJvamVjdCBmaWxlIGV4aXN0cwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIG9wZW5pbmcgZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCAiICsgZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCS8vIGNoZWNrIGlmIHByb2plY3Qgb2YgdGhpcyBuYW1lIGV4aXN0cyBpbiB3b3Jrc3BhY2UKLQkJCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCQkJZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLQotCQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkvLyBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QgaW4gd29ya3NwYWNlLCBzbyBtYWtlIG9uZSB3aXRoIHRoZQotCQkJCQkvLyBwcm9qZWN0IG5hbWUgaW4gLnByb2plY3QKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBleGlzdGluZyAucHJvamVjdCAiICsgZGVzY3JpcHRpb24uZ2V0TmFtZSgpICsgIiBpbiB3b3Jrc3BhY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3QuZ2V0TmFtZSgpLAotCQkJCQkJCQltb25pdG9yKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gZmFpbGVkIHRvIG1ha2UgdGhpcyBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UgLQotCQkJCQkJLy8gYW5vdGhlciBwcm9qZWN0IG1heSBleGlzdCBpbiB0aGUgd29ya3NwYWNlIGF0IHRoaXMKLQkJCQkJCS8vIGxvY2F0aW9uCi0JCQkJCQkvLyBzbyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGF0IGNvbmZsaWN0aW5nIHByb2plY3QgYW5kIHRyeQotCQkJCQkJLy8gYWdhaW4KLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBleGlzdGluZyAucHJvamVjdCBmYWlsZWQgLSBkZWxldGluZyB3b3Jrc3BhY2UtcHJvamVjdCBpbiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQlsaWJEaXIKLQkJCQkJCQkJCQkJKyAiIGFuZCBjcmVhdGluZyB3b3Jrc3BhY2UtcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlkZWxldGVQcm9qZWN0KGxpYkRpciwgbW9uaXRvcik7Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3QuZ2V0TmFtZSgpLAotCQkJCQkJCQltb25pdG9yKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHByb2plY3QgZG9lcyBleGlzdCBpbiB3b3Jrc3BhY2UgLSBtYWtlIHN1cmUgbG9jYXRpb24KLQkJCQkJLy8gbWF0Y2hlcywgaWYgbm90LCBtYWtlIGEgbmV3IHByb2plY3QKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCIjIyMgLSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgZXhpc3RzIGluIHdvcmtzcGFjZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlpZiAobmV3IEZpbGUobGliRGlyKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpCi0JCQkJCQkJLnRvRmlsZSgpKSAhPSAwKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGV4aXN0cyBpbiB3b3Jrc3BhY2UsIGJ1dCBsb2NhdGlvbiBkaWZmZXJzIC0gY3JlYXRlIGEgbmV3IHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlGaWxlIHByb2plY3RGaWxlID0gcGF0aC50b0ZpbGUoKTsKLQkJCQkJCWlmIChwcm9qZWN0RmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJCQkJcHJvamVjdEZpbGUuZGVsZXRlKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHRoaXMgd2lsbCBjYXVzZSB0aGUgY2FsbGVyIHRvIGRpc3BsYXkgYQotCQkJCQkJCS8vIG1lc3NhZ2Vib3ggYXNraW5nIHRoZSB1c2VyIHRvIG1ha2UgLnByb2plY3QKLQkJCQkJCQkvLyB3cml0YWJsZQotCQkJCQkJCS8vIFRPRE86IHVzZSBvdXIgb3duIHR5cGUgb2YgRXhjZXB0aW9uPwotCQkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKLQkJCQkJCQkJCSIjIyMiICsgcHJvamVjdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlVmFsaWRQcm9qZWN0RnJvbVBhdGgobGliRGlyLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCQkvLyBsaWJEaXIgbXVzdCBiZSBhbiBpbnZhbGlkIHBhdGggKG92ZXJsYXBzIHdvcmtzcGFjZT8pCi0JCQkJLy8gVE9ETzogdGhpcyBleGNlcHRpb24gaXNuJ3QgaGFuZGxlZCB3ZWxsIC0gaXQgc2hvdWxkbid0IGhhcHBlbgotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihMaWJyYXJ5UmVzb3VyY2VzLmludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbik7Ci0JCQl9Ci0JCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7CQkJCQkJCi0JCQkKLQkJCS8vIFNldCBsb2NrIGZpbGUgYXMgdGVhbSBwcml2YXRlIG1lbWJlciBzbyBpdCB3aWxsIG5vdCBiZSBzaGFyZWQgKGFkZGVkIHRvIHNvdXJjZSBjb250cm9sKS4KLQkJCS8vIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgcHJvamVjdCBmb2xkZXIgZ290IHJlZnJlc2hlZC4gU28gdGhpcyBwb3J0aW9uIG9mIGNvZGUgbXVzdCBiZQotCQkJLy8gZXhlY3V0ZWQgcmlnaHQgYWZ0ZXIgSVByb2plY3Qub3BlbigpIHJldHVybmVkLiBQcm9qZWN0IG11c3QgYmUgb3BlbmVkIHdpdGggSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSAotCQkJLy8gdG8gcHJldmVudCBsb2NrIGZpbGUgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgcHJvamVjdCBiZWZvcmUgaXQgaXMgc2V0IGFzIHRlYW0gcHJpdmF0ZSBtZW1iZXIKLQkJCS8vCi0JCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUobGliRGlyLCBSZXNvdXJjZVV0aWwuTE9DS19GSUxFTkFNRSk7Ci0JCQlpZihsb2NrRmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCUlSZXNvdXJjZSB3c1JlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGxvY2tGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJCWlmKHdzUmVzICE9IG51bGwpIHsKLQkJCQkJCXdzUmVzLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCQl3c1Jlcy5zZXRUZWFtUHJpdmF0ZU1lbWJlcih0cnVlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gbW9uaXRvciBmb3IgY2hhbmdlIGluIHRoZSByZXNvdXJjZQotLy8JCQlSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLm1vbml0b3IocHJvamVjdCk7Ci0KLQkJCWRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCi0JCQkvLyBtYWtlIHN1cmUgcHJvamVjdCBoYXMgdGhlIE1ldGhvZExpYnJhcnlOYXR1cmUKLQkJCVN0cmluZ1tdIGV4aXN0aW5nTmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJaWYgKCEoQXJyYXlzLmFzTGlzdChleGlzdGluZ05hdHVyZXMpLmNvbnRhaW5zKG1ldGhvZExpYnJhcnlOYXR1cmUpKSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIGFkZGluZyBtZXRob2RsaWJyYXJ5bmF0dXJlIHRvICIgKyBkZXNjcmlwdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhtZXRob2RMaWJyYXJ5TmF0dXJlcyk7Ci0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgSVByb2plY3QuRk9SQ0UKLQkJCQkJCXwgSVByb2plY3QuS0VFUF9ISVNUT1JZLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJdGhyb3cgZXg7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBsaWJyYXJ5J3MgcHJvamVjdC4gSXQgZmluZHMgdGhlIHByb2plY3QgYnkgbG9jYXRpbmcgYSBwcm9qZWN0Ci0JICogd2l0aCB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xvc2UoTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QobGliKTsKLS8vCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLS8vCQkJaWYgKGRlYnVnKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCS5wcmludGxuKCIjIyMgLSBjbG9zaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJaWYgKGRlYnVnKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCS5wcmludGxuKCIjIyMgLSBFUlJPUiBjbG9zaW5nIHByb2plY3QgZm9yIGxpYnJhcnkgaW4gXCIiICsgZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpICsgIlwiOiBwcm9qZWN0IGNvdWxkIG5vdCBiZSBmb3VuZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwkJCX0KLS8vCQl9Ci0JCQotCQljbG9zZShnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYiksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkaXIgU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbG9zZShTdHJpbmcgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QoZGlyKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiIyMjIC0gY2xvc2luZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkKLQkJCS8vIHN0b3AgbW9uaXRvcmluZyBjaGFuZ2Ugb24gdGhlIHByb2plY3QKLQkJCS8vCi0vLwkJCVJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkudW5tb25pdG9yKHByb2plY3QpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiIyMjIC0gRVJST1IgY2xvc2luZyBwcm9qZWN0IGZvciBsaWJyYXJ5IGluIFwiIiArIGRpciArICJcIjogcHJvamVjdCBjb3VsZCBub3QgYmUgZm91bmQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCi0JCQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgbGlicmFyeSdzIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYikgewotCQlyZXR1cm4gZmluZFByb2plY3QoZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGVzdCB0aGUgcHJvamVjdCB3aG9zZSBsb2NhdGlvbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBkaXIgU3RyaW5nCi0JICogQHJldHVybiBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZmluZFByb2plY3QoU3RyaW5nIGRpcikgewotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKG5ldyBGaWxlKGRpcikuY29tcGFyZVRvKHByb2plY3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSkgPT0gMCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIiMjIyAtIGZvdW5kIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiB3aXRoIGxvY2F0aW9uICIgKyBkaXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcHJvamVjdCB3aG9zZSBsb2NhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlbGV0ZVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWIsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRlbGV0ZVByb2plY3QoZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBwcm9qZWN0IHdob3NlIGxvY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWxldGVQcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRlbGV0ZSBhbnkgd29ya3NwYWNlIHByb2plY3QgdGhhdCBleGlzdHMgZm9yIHRoaXMgcGF0aAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiIyMjIC0gZGVsZXRpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJfQotCQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvamVjdCBmb3IgdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBudWxsIGlmIHRoZSBsaWJyYXJ5IGlzIG5vdCBpbiBhIHZhbGlkIHByb2plY3QgbG9jYXRpb24gKGllLAotCSAqICAgICAgICAgb3ZlcmxhcHMgdGhlIHdvcmtzcGFjZSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGliLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYiksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwcm9qZWN0IGZvciB0aGUgcGF0aCBzcGVjaWZpZWQsIHVzaW5nIHRoZSBsYXN0IHBhdGggZnJhZ21lbnQgYXMKLQkgKiB0aGUgcHJvamVjdCBuYW1lLiBXaWxsIGFwcGVuZCBpbmNyZWFzaW5nIGludGVnZXJzIHRvIHRoZSBwcm9qZWN0IG5hbWUgaW4KLQkgKiBvcmRlciB0byBjcmVhdGUgYSB2YWxpZCBwcm9qZWN0LiBGaXJzdCBkZWxldGVzIGFueSB3b3Jrc3BhY2UgcHJvamVjdAotCSAqIHdob3NlIGxvY2F0aW9uIGlzIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChTdHJpbmcgcGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkZWxldGUgYW55IHdvcmtzcGFjZSBwcm9qZWN0IHRoYXQgZXhpc3RzIGZvciB0aGlzIHBhdGgKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KHBhdGgpOwotCQl0cnkgewotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBsaWJOYW1lID0gbmV3IEZpbGUocGF0aCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgbGliRGlyID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbGliTmFtZTsKLQkJaW50IGkgPSAyOwotCQl3aGlsZSAoaSA8IDEwMCkgewotCQkJdHJ5IHsKLQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3ROYW1lLCBtb25pdG9yKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCAiICsgcHJvamVjdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBwcm9qZWN0OwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCXByb2plY3ROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihsaWJOYW1lKS5hcHBlbmQoJyAnKS5hcHBlbmQoaSsrKQotCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgcHJvamVjdCBuYW1lZCBwcm9qZWN0TmFtZSBpbiB0aGUgZGlyZWN0b3J5IGRpci4KLQkgKiBUaHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIGZhaWxzIGZvciBhbnkgcmVhc29uLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBkaXIsIFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQotCQkvLyBnZXQgYSBwcm9qZWN0IGhhbmRsZQotCQlJUHJvamVjdCBuZXdQcm9qZWN0SGFuZGxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZQotCQkJCS5uZXdQcm9qZWN0RGVzY3JpcHRpb24obmV3UHJvamVjdEhhbmRsZS5nZXROYW1lKCkpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobWV0aG9kTGlicmFyeU5hdHVyZXMpOwotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKGRpcik7Ci0JCWlmICghUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKHByb2plY3RQYXRoKSkgewotCQkJZGVzY3JpcHRpb24uc2V0TG9jYXRpb24ocHJvamVjdFBhdGgpOwotCQl9Ci0KLQkJbmV3UHJvamVjdEhhbmRsZS5jcmVhdGUoZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQlyZXR1cm4gbmV3UHJvamVjdEhhbmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYWxsIChvcGVuKSBwcm9qZWN0cyB0aGF0IGhhdmUgdGhlIE1ldGhvZExpYnJhcnkgbmF0dXJlCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUFsbE1ldGhvZExpYnJhcnlQcm9qZWN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpCi0JCQkJCQkmJiBwcm9qZWN0LmdldE5hdHVyZShtZXRob2RMaWJyYXJ5TmF0dXJlKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gY2xvc2luZyBtZXRob2QgbGlicmFyeSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlEaXJlY3RvcnkoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVzZWRSZXNvdXJjZXMKLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE91dE9mU3luY1Jlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiB1c2VkUmVzb3VyY2VzKSB7Ci0JCQlTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJaWYod3NSZXMgIT0gbnVsbCAmJiAhd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIENvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT3V0T2ZTeW5jaChDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgewotCQkJaWYocmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQlTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCQlpZih3c1JlcyAhPSBudWxsICYmICF3c1Jlcy5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXNUb0NoZWNrIENvbGxlY3Rpb24KLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcyBDb2xsZWN0aW9uCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMgQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja091dE9mU3luY2hSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXNUb0NoZWNrLCAKLQkJCUNvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywgQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzKQotCXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9DaGVjay5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlUGF0aCk7Ci0JCQlpZih3c1JlcyA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSBpZighd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZihsaWIgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCWlmKHByaiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJqLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvU0FYUGFyc2VyWE1JLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5MzNkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5BYnN0cmFjdFNBWFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGwuTXlFc2NhcGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGFyc2VzIGFuIFhNSSBmaWxlLCBhbmQgc3RvcmVzIHRoZSBkYXRhIGluIGEgSGFzaE1hcCBjYWxsZWQgYW4KLSAqICJlTWFwIi4KLSAqIDxwPgotICogQW4gZU1hcCBoYXMgNCBlbnRyaWVzOgotICogPGxpPiJ0YWciIC0gdGhlIGVsZW1lbnQncyB0YWc8L2xpPgotICogPGxpPiJhdHRyaWJ1dGVzIiAtIGFuIEFycmF5TGlzdCBvZiB0aGUgWE1MIGF0dHJpYnV0ZXMuIEVhY2ggYXR0cmlidXRlIGlzIG9mCi0gKiB0aGUgZm9ybSAoYXR0cmlidXRlIG5hbWUpLChhdHRyaWJ1dGUgdmFsdWUpPC9saT4KLSAqIDxsaT4iY29udGVudCIgLSB0aGUgZWxlbWVudCdzIGNvbnRlbnQ8L2xpPgotICogPGxpPiJjaGlsZHJlbiIgLSBhbiBBcnJheUxpc3Qgb2YgdGhlIGVsZW1lbnQncyBzdWItZWxlbWVudHMuIEVhY2ggY2hpbGQgaXMKLSAqIGFuIGVNYXAuPC9saT4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHJvb3QgZWxlbWVudCdzIGVNYXAgaXMgcmVmZXJlbmNlZCBieSBUTkdTQVhQYXJzZXJYTUkueG1pTWFwCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU0FYUGFyc2VyWE1JIGV4dGVuZHMgQWJzdHJhY3RTQVhQYXJzZXIgewotCi0JcHVibGljIEhhc2hNYXAgeG1pTWFwOwotCi0JLy8gcHJpdmF0ZSBpbnQgZWxlbWVudENvdW50ID0gMDsKLQlwcml2YXRlIFN0YWNrIHN0YWNrOwotCi0JcHJpdmF0ZSBNeUVzY2FwZSBlc2NhcGUgPSBuZXcgTXlFc2NhcGUoKTsKLQotCXB1YmxpYyBTQVhQYXJzZXJYTUkoTG9nZ2VyIGxvZ2dlcikgewotCQkvLyB2YWxpZGF0aW5nIGlzIGZhbHNlIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBEVEQKLQkJc3VwZXIobG9nZ2VyLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgc3RhcnRzIHRvIHBhcnNlIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgewotCQlzdXBlci5zdGFydERvY3VtZW50KCk7Ci0JCXN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JCXN1cGVyLmVuZERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlIYXNoTWFwIGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl0cnkgewotCQkJSGFzaE1hcCBwYXJlbnQgPSAoSGFzaE1hcCkgc3RhY2sucGVlaygpOwotCQkJKChBcnJheUxpc3QpIHBhcmVudC5nZXQoImNoaWxkcmVuIikpLmFkZChlTWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGUpIHsKLQkJCXhtaU1hcCA9IGVNYXA7Ci0JCX0KLQotCQkvLyBwdXQgdGFnCi0JCWVNYXAucHV0KCJ0YWciLCBxbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBwdXQgYXR0cmlidXRlTWFwCi0JCUxpc3QgYXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJpYnV0ZUxpc3QuYWRkKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkKLQkJCQkJCSsgIiwiICsgYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQllTWFwLnB1dCgiYXR0cmlidXRlcyIsIGF0dHJpYnV0ZUxpc3QpOyAvLyROT04tTkxTLTEkCi0KLQkJZU1hcC5wdXQoImNoaWxkcmVuIiwgbmV3IEFycmF5TGlzdCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFjay5wdXNoKGVNYXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlIYXNoTWFwIGVNYXAgPSAoSGFzaE1hcCkgc3RhY2sucGVlaygpOwotCQkJTGlzdCBhdHRyaWJ1dGVMaXN0ID0gKEFycmF5TGlzdCkgZU1hcC5nZXQoImF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dHJpYnV0ZUxpc3Quc2l6ZSgpID09IDApCi0JCQkJaWYgKHN0ckJ1Zi50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJZU1hcC5wdXQoImNvbnRlbnQiLCBlc2NhcGUuY29udmVydExpbmVzKHN0ckJ1Zi50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlzdGFjay5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBGaW5kIGEgZ3VpZCdzIGVsZW1lbnQgdGFnIHdpdGhpbiB0aGUgWE1JCi0JICogZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFRhZwotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIHhtaU1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZmluZEVsZW1lbnRUYWdvZkd1aWQoU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBndWlkLAotCQkJSGFzaE1hcCB4bWlNYXApIHsKLQkJSGFzaE1hcCBlTWFwID0gU0FYUGFyc2VyWE1JLmZpbmRHdWlkKGd1aWQsIHhtaU1hcCk7Ci0KLQkJLy8gd2UgaGF2ZSBoYXNobWFwIG9mIHRoZSBndWlkJ3MgZWxlbWVudCAtIHNlYXJjaCBjaGlsZHJlbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnRUYWcKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCkuZXF1YWxzKGVsZW1lbnRUYWcpKQotCQkJCXJldHVybiBjaGlsZE1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBzZWFyY2hlcyBlTWFwJ3MgY2hpbGRyZW4gZm9yIGVsZW1lbnRUYWcKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFRhZwotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGdldENoaWxkRWxlbWVudFRhZyhTdHJpbmcgZWxlbWVudFRhZywgSGFzaE1hcCBlTWFwKSB7Ci0JCS8vIHNlYXJjaCBjaGlsZHJlbiBmb3IgdGhlIGVsZW1lbnRUYWcKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCkuZXF1YWxzKGVsZW1lbnRUYWcpKQotCQkJCXJldHVybiBjaGlsZE1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiByZXR1cm5zIFRhZyBvZiBlbGVtZW50LiBEb2VzIG5vdCByZXR1cm4KLQkgKiBudWxsLCByZXR1cm5zICIiIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhZyhIYXNoTWFwIGVNYXApIHsKLQkJU3RyaW5nIHRhZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChlTWFwICE9IG51bGwpCi0JCQl0YWcgPSAoU3RyaW5nKSBlTWFwLmdldCgidGFnIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhZyAhPSBudWxsKQotCQkJcmV0dXJuIHRhZzsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yIHVzZSB3aXRoIFROR1NBWFBhcnNlclhNSS4gZ2V0cyBjb250ZW50IG9mIGVsZW1lbnQgLSBjYW4gYmUgbnVsbAotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50Q29udGVudChIYXNoTWFwIGVNYXApIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBudWxsOwotCQlpZiAoZU1hcCAhPSBudWxsKQotCQkJY29udGVudCA9IChTdHJpbmcpIGVNYXAuZ2V0KCJjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBndWlkIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGdpdmVuIGVNYXAgLSBjYW4gcmV0dXJuIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqICAgICAgICAgICAgZ3VpZCB0byBmaW5kCi0JICogQHBhcmFtIGVNYXAKLQkgKiAgICAgICAgICAgIHVzZSBUTkdTQVhQYXJzZXJYTUkueG1pTWFwLCBvciBhIHN1Yi1lTWFwCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGZpbmRHdWlkKFN0cmluZyBndWlkLCBIYXNoTWFwIGVNYXApIHsKLQkJQXJyYXlMaXN0IGF0dExpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChndWlkLmVxdWFscyhTQVhQYXJzZXJYTUkuZ2V0R3VpZE9mTGlzdChhdHRMaXN0KSkpCi0JCQlyZXR1cm4gZU1hcDsKLQotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCUhhc2hNYXAgcmVzdWx0ID0gZmluZEd1aWQoZ3VpZCwgY2hpbGRNYXApOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRm9yIHVzZSB3aXRoIFROR1NBWFBhcnNlclhNSS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0TGlzdAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZE9mTGlzdChBcnJheUxpc3QgYXR0TGlzdCkgewotCQlJdGVyYXRvciBpdGVyID0gYXR0TGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRwYWlyID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgYXR0bmFtZSA9IGF0dHBhaXIuc3Vic3RyaW5nKDAsIGF0dHBhaXIuaW5kZXhPZigiLCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRuYW1lLmVxdWFscygiZ3VpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JIHdoZW4gcGFyc2luZyByZXNtZ3IueG1pCi0JICogCi0JICogQHBhcmFtIGF0dExpc3QKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElkT2ZMaXN0KEFycmF5TGlzdCBhdHRMaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKCJpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU1hcAotCSAqIEByZXR1cm4gVVJJCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0UHJlc2VudGF0aW9uVXJpT2ZFbGVtZW50KEhhc2hNYXAgZU1hcCkgewotCQlpZiAoZU1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB0YWcgPSBTQVhQYXJzZXJYTUkuZ2V0VGFnKGVNYXApOwotCi0JCS8vIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGJyZWFrZG93bkVsZW1lbnQgLSBpZiBzbywgcmV0dXJuIG51bGwKLQkJLy8gLy8gYmVjYXVzZSB3aGlsZSBicmVha2Rvd25FbGVtZW50cyBoYXZlIHByZXNlbnRhdGlvbnMsIHRoZXkgYXJlIG5vdAotCQkvLyB1c2VkLgotCQkvLyBpZiAodGFnLmVxdWFscygiYnJlYWtkb3duRWxlbWVudHMiKSkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyAvLyBwcm9jZXNzZXMgZG9uJ3QgdXNlIHRoZWlyIHByZXNlbnRhdGlvbiBlaXRoZXIKLQkJLy8gaWYgKHRhZy5lcXVhbHMoInByb2Nlc3MiKSkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCi0JCS8vIGxvb2sgZm9yIGNoaWxkUGFja2FnZSBwcmVzZW50YXRpb25zLCB3aGljaCBhcmUgYW4gaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKHRhZy5lcXVhbHMoImNoaWxkUGFja2FnZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlBcnJheUxpc3QgYXR0TGlzdCA9IChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXR0bmFtZS5lcXVhbHMoImhyZWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhdHR2YWwpOwotCQkJCQkJcmV0dXJuIHVyaTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQkvLyBpZiAoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpICE9IC0xKSB7Ci0JCQkJCS8vIFN0cmluZyBwcmVzSWQgPQotCQkJCQkvLyBhdHR2YWwuc3Vic3RyaW5nKGF0dHZhbC5pbmRleE9mKCJ1bWE6Ly8iKSs2KTsKLQkJCQkJLy8gcmV0dXJuIHByZXNJZDsKLQkJCQkJLy8gfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCBjaGlsZExpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKTsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdGVyID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCXRhZyA9IFNBWFBhcnNlclhNSS5nZXRUYWcoY2hpbGRNYXApOwotCQkJaWYgKHRhZy5lcXVhbHMoInByZXNlbnRhdGlvbiIpKSB7IC8vIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyB0YWcuZXF1YWxzKCJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IikpCi0JCQkJLy8geyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlBcnJheUxpc3QgYXR0TGlzdCA9IChBcnJheUxpc3QpIGNoaWxkTWFwLmdldCgiYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJSXRlcmF0b3IgYXR0SXRlciA9IGF0dExpc3QuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoYXR0SXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBhdHRJdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGF0dG5hbWUuZXF1YWxzKCJocmVmIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhdHR2YWwpOwotCQkJCQkJCXJldHVybiB1cmk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGlmIChhdHR2YWwuaW5kZXhPZigidW1hOi8vIikgIT0gLTEpIHsKLQkJCQkJCS8vIFN0cmluZyBwcmVzSWQgPQotCQkJCQkJLy8gYXR0dmFsLnN1YnN0cmluZyhhdHR2YWwuaW5kZXhPZigidW1hOi8vIikrNik7Ci0JCQkJCQkvLyByZXR1cm4gcHJlc0lkOwotCQkJCQkJLy8gfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gaWYgKGF0dExpc3Quc2l6ZSgpID09IDApCi0JCQkJLy8gY29udGludWU7Ci0JCQkJLy8gU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKWF0dExpc3QuZ2V0KDApOwotCQkJCS8vIC8vIFN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwKLQkJCQkvLyBhdHRwYWlyLmluZGV4T2YoIiwiKSk7Ci0JCQkJLy8gU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpKzEpOwotCQkJCS8vIGlmIChhdHR2YWwuaW5kZXhPZigidW1hOi8vIikgIT0gLTEpIHsKLQkJCQkvLyBTdHJpbmcgcHJlc0lkID0gYXR0dmFsLnN1YnN0cmluZyhhdHR2YWwuaW5kZXhPZigidW1hOi8vIikrNik7Ci0JCQkJLy8gcmV0dXJuIHByZXNJZDsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVWYWx1ZQotCSAqIEByZXR1cm4gSGFzaE1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcCBmaW5kRWxlbWVudEJ5QXR0cmlidXRlKEhhc2hNYXAgZU1hcCwKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHsKLQkJLy8gc2VhcmNoIHRoaXMgZU1hcCdzIGNoaWxkcmVuCi0JCUl0ZXJhdG9yIGl0ZXIgPSAoKEFycmF5TGlzdCkgZU1hcC5nZXQoImNoaWxkcmVuIikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlIYXNoTWFwIGNoaWxkTWFwID0gKEhhc2hNYXApIGl0ZXIubmV4dCgpOwotCQkJSGFzaE1hcCByZXN1bHQgPSBmaW5kRWxlbWVudEJ5QXR0cmlidXRlKGNoaWxkTWFwLCBhdHRyaWJ1dGVOYW1lLAotCQkJCQlhdHRyaWJ1dGVWYWx1ZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8vIHNlYXJjaCB0aGlzIGVNYXAKLQkJaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpICYmIGF0dHZhbC5lcXVhbHMoYXR0cmlidXRlVmFsdWUpKQotCQkJCXJldHVybiBlTWFwOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZU9mRWxlbWVudChIYXNoTWFwIGVNYXAsCi0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhdHR2YWwgPSBhdHRwYWlyLnN1YnN0cmluZyhhdHRwYWlyLmluZGV4T2YoIiwiKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0bmFtZS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1RleHRSZWZlcmVuY2VSZXBsYWNlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1RleHRSZWZlcmVuY2VSZXBsYWNlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiYzA0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9UZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogSW1wbGVtZW50YXRpb24gZm9yIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIuIFVzZWQgaW4gZGVlcCBjb3B5Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwgaW1wbGVtZW50cyBJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FQQUJJTElUWV9QQVRIID0gTXVsdGlGaWxlU2F2ZVV0aWwuQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVMSVZFUllfUEFUSCA9IE11bHRpRmlsZVNhdmVVdGlsLkRFTElWRVJZX1BST0NFU1NfUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyAgPSBmYWxzZTsJCi0JCi0JcHJpdmF0ZSBNYXAgY29udmVydE1hcChNYXAgb2xkVG9OZXdPYmplY3RNYXApIHsKLQkJaWYgKG9sZFRvTmV3T2JqZWN0TWFwID09IG51bGwpIHsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkVG9OZXdPYmplY3RNYXAgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTWFwIG0gPSBudWxsOwotCQlJdGVyYXRvciBpdCA9IG9sZFRvTmV3T2JqZWN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOwotCQkJT2JqZWN0IHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZCBrZXkgPSAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZCB2YWwgPSAiICsgdmFsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCBrZXkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIHZhbCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmV3S2V5ID0gKChNZXRob2RFbGVtZW50KWtleSkuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyBuZXdWYWwgPSAoKE1ldGhvZEVsZW1lbnQpdmFsKS5nZXRHdWlkKCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIHZhbCAhPSBudWxsKSB7Ci0JCQkJCWlmIChtID09IG51bGwpIHsKLQkJCQkJCW0gPSBuZXcgSGFzaE1hcCgpOwotCQkJCQl9Ci0JCQkJCW0ucHV0KG5ld0tleSwgbmV3VmFsKTsKLQkJCQl9Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3IGtleSA9ICIgKyBuZXdLZXkgKyAiLCBuZXdWYWwgPSAiICsgbmV3VmFsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nCi0JICogQHBhcmFtIG93bmVyIEVPYmplY3QKLQkgKiBAb2xkVG9OZXdPYmplY3RNYXAgTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHNvdXJjZSwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKSB7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRlcmluZyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLnJlcGxhY2U6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBvd25lcjogIiArIG93bmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyByZXQgPSByZXBsYWNlXyhzb3VyY2UsIG93bmVyLCBvbGRUb05ld09iamVjdE1hcCk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlib29sZWFuIG5vQ2hhbmdlID0gISBzb3VyY2UuZXF1YWxzKHJldCk7Ci0JCQlTdHJpbmcgc3RyID0gc291cmNlLmVxdWFscyhyZXQpID8gIk5vIGNobmFuZ2UhIiA6IHJldDsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRXhpdGluZyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLnJlcGxhY2U6ICIgKyBzdHIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZV8oU3RyaW5nIHNvdXJjZSwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKSB7CQotCQlNYXAgbG9jYWxNYXAgPSBjb252ZXJ0TWFwKG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJaWYgKGxvY2FsTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBzb3VyY2U7Ci0JCX0KLQkJCi0JCVN0cmluZyByZXBsYWNpbmdQYXRoID0gbnVsbDsKLQkJU3RyaW5nIHJlcGxhY2VkUGF0aCA9IG51bGw7CQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmVwbGFjaW5nUGF0aCA9IERFTElWRVJZX1BBVEg7Ci0JCQlyZXBsYWNlZFBhdGggPSBDQVBBQklMSVRZX1BBVEg7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcmVwbGFjaW5nUGF0aCA9IENBUEFCSUxJVFlfUEFUSDsKLQkJCXJlcGxhY2VkUGF0aCA9IERFTElWRVJZX1BBVEg7Ci0JCX0gZWxzZSB7Ci0JCQlyZXBsYWNpbmdQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcGxhY2VkUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0KLQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsJCQkJCQkKLQkJCU1hcCBhdHRyaWJ1dGVNYXAgPSBSZXNvdXJjZUhlbHBlci5nZXRBdHRyaWJ1dGVzRnJvbUxpbmsodGV4dCk7Ci0JCQlTdHJpbmcgb2xkR3VpZCA9IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfR1VJRCk7CQotCQkJU3RyaW5nIG5ld0d1aWQgPSBvbGRHdWlkID09IG51bGwgPyBudWxsIDogKFN0cmluZykgbG9jYWxNYXAuZ2V0KG9sZEd1aWQpOwotCQkJCi0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHRleHQ6ICAgICAgIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYXR0cmlidXRlTWFwOiAiICsgYXR0cmlidXRlTWFwKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZEd1aWQ6ICIgKyBvbGRHdWlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5ld0d1aWQ6ICIgKyBuZXdHdWlkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQkJCQotCQkJaWYgKG5ld0d1aWQgIT0gbnVsbCAmJiAhbmV3R3VpZC5lcXVhbHMob2xkR3VpZCkpIHsKLQkJCQkJCQkJCi0JCQkJLy9TdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0LnJlcGxhY2VBbGwob2xkR3VpZCwgbmV3R3VpZCk7Ci0JCQkJLy9DYW4ndCB1c2UgdGhlIGFib3ZlIGNvbW1lbnRlZCBvdXQgbGluZSwgYmVjYXVzZSBzb21lIGd1aWQgc3RyaW5ncyBhcmUgbm90IHZhbGlkIHJlZ2V4IHBhdHRlcm5zCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gcmVwbGFjZUFsbCh0ZXh0LCBvbGRHdWlkLCBuZXdHdWlkKTsJCQotCQkJCWlmIChyZXBsYWNlbWVudC5pbmRleE9mKHJlcGxhY2VkUGF0aCkgPiAwKSB7Ci0JCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUZpcnN0KHJlcGxhY2VkUGF0aCwgcmVwbGFjaW5nUGF0aCk7Ci0JCQkJfQotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlcGxhY2VtZW50OiAiICsgcmVwbGFjZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlcGxhY2VtZW50KTsJCi0JCQl9Ci0JCQkKLQkJfQotCQltLmFwcGVuZFRhaWwoc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRleHQgU3RyaW5nCi0JICogQHBhcmFtIHJlcGxhY2VkIFN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNpbmcgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyB0ZXh0LCBTdHJpbmcgcmVwbGFjZWQsIFN0cmluZyByZXBsYWNpbmcpIHsKLQkJaW50IGZyb21JbmRleCA9IDA7Ci0JCWludCBpeCA9IHRleHQuaW5kZXhPZihyZXBsYWNlZCwgZnJvbUluZGV4KTsKLQkJaWYgKGl4IDwgMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0JCQkKLQkJaW50IHJlcGxhY2VkTGVuID0gcmVwbGFjZWQubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoaXggPj0gZnJvbUluZGV4KSB7Ci0JCQlpZiAoaXggPiBmcm9tSW5kZXgpIHsKLQkJCQluZXdUZXh0LmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhmcm9tSW5kZXgsIGl4KSk7Ci0JCQl9Ci0JCQluZXdUZXh0LmFwcGVuZChyZXBsYWNpbmcpOwotCQkJZnJvbUluZGV4ID0gaXggKyByZXBsYWNlZExlbjsKLQkJCWl4ID0gdGV4dC5pbmRleE9mKHJlcGxhY2VkLCBmcm9tSW5kZXgpOwotCQl9Ci0JCWlmIChmcm9tSW5kZXggPCB0ZXh0Lmxlbmd0aCgpICkgewotCQkJbmV3VGV4dC5hcHBlbmQodGV4dC5zdWJzdHJpbmcoZnJvbUluZGV4LCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld1RleHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwZTBlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY2Nlc3MgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5jdnNpZ25vcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjMzU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIGRpYWdyYW0gbWlncmF0aW9uIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MWUxNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMDUwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLnV0aWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjhlNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNiNDRiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzgxYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBNaWdyYXRpb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFdpemFyZHMKLWV4cG9ydFdvcmtmbG93VGVtcGxhdGVXaXphcmROYW1lPVdvcmtmbG93IFRlbXBsYXRlCi1leHBvcnRXb3JrZmxvd1RlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgZGlhZ3JhbSB0ZW1wbGF0ZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzOTc4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAJICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkcy5NaWdyYXRpb25FeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC53aXphcmRzLk1pZ3JhdGlvbkV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRXb3JrZmxvd1RlbXBsYXRlV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0JICAgICAgICAgJWV4cG9ydFdvcmtmbG93VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkcy5NaWdyYXRpb25FeHBvcnRXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmRpYWdyYW1NaWdyYXRpb24iPgotICAgICAgPGRpYWdyYW1NaWdyYXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5EaWFncmFtTWlncmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UyMzg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLnNlcnZpY2VzLldvcmtmbG93RXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0udXRpbC5NaWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGRpZ3JhbSBtaWdyYXRpb24gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEFwcmlsIDA0LCAyMDA3Ci0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1pZ3JhdGlvbiBpbXBsZW1lbnRzIElEaWFncmFtTWlncmF0aW9uIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMpIHRocm93cyBFeGNlcHRpb24gewkKLQkJLy8gZGVidWcKLQkJZGVidWcgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQkKLQkJV29ya2Zsb3dFeHBvcnRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgV29ya2Zsb3dFeHBvcnRTZXJ2aWNlKCk7Ci0JCQotCQlpbnQgIGVycm9yQ291bnQgPSAwOwotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IG51bGw7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3M+IGl0ID0gcHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvYyA9IGl0Lm5leHQoKTsKLQkJCWlmIChsaWIgPT0gbnVsbCkgewotCQkJCWxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShwcm9jKTsKLQkJCX0KLQkJCQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcHJvYzogIiArIHByb2MpOwkvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIHByb2MuZVJlc291cmNlKCk6ICIgKyAgcHJvYy5lUmVzb3VyY2UoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCWlmIChwcm9jLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIHByb2MuZVJlc291cmNlKCkuZ2V0VVJJKCk6ICIgKyAgcHJvYy5lUmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBtb2RlbEZpbGVQYXRoID0gcHJvYy5lUmVzb3VyY2UoKSA9PSBudWxsID8gbnVsbCA6IAotCQkJCQkJCQkJCXByb2MuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQlpZiAobW9kZWxGaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkJCQkKLQkJCUZpbGUgY3BGb2xkZXJQYXRoID0gbmV3IEZpbGUobW9kZWxGaWxlUGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJU3RyaW5nIGRpYWdyYW1GaWxlUGF0aCA9IGNwRm9sZGVyUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsKLQkJCQkJCQkJCQkiZGlhZ3JhbS54bWkiOwkJCQkvLyROT04tTkxTLTEkCi0JCQlGaWxlIGRpYWdyYW1GaWxlID0gbmV3IEZpbGUoZGlhZ3JhbUZpbGVQYXRoKTsKLQkJCWlmIChkaWFncmFtRmlsZS5leGlzdHMoKSkgewotCQkJCWRpYWdyYW1GaWxlLmRlbGV0ZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IERlbGV0ZWQgZGlhZ3JhbUZpbGU6ICIgKyBkaWFncmFtRmlsZSk7Ly8kTk9OLU5MUy0xJAotCQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbnVsbCk7Ci0JCQl9Ci0JCQkvL2RpYWdyYW1GaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGRpYWdyYW1GaWxlOiAiICsgZGlhZ3JhbUZpbGUpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJc2VydmljZS5leHBvcnQocHJvYywgcHJvYywgImRpYWdyYW0ueG1pIiwgY3BGb2xkZXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllcnJvckNvdW50Kys7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZhaWxlZDogIiArIGRpYWdyYW1GaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHByb2Nlc3Nlcy5zaXplKCk6ICIgKyBwcm9jZXNzZXMuc2l6ZSgpKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZXJyb3JDb3VudDogIiArIGVycm9yQ291bnQpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJlbW92ZU9sZERpYWdyYW1zKHByb2Nlc3NlcywgbGliKTsJCQkJCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlT2xkRGlhZ3JhbXMoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMsIE1ldGhvZExpYnJhcnkgbGliKSB7CQkKLQkJaWYgKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBuZWVkU2F2ZSA9IGZhbHNlOwotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlbW92ZU9sZERpYWdyYW1zIC4uLiIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChJdGVyYXRvcjxQcm9jZXNzPiBpdCA9IHByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBpdC5uZXh0KCk7Ci0JCQlib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCU1hcCBhY3Rpdml0aWVzID0gTWlncmF0aW9uVXRpbC5nZXRBY3Rpdml0aWVzKHByb2MsIHRydWUpOwotCQkJCWZvciAoSXRlcmF0b3IgaWl0ID0gYWN0aXZpdGllcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpaXQuaGFzTmV4dCgpOykgewkJCQkKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaWl0Lm5leHQoKTsJCQkJCQkKLQkJCQkJCUVPYmplY3QgY29udGFpbmVyID0gYWN0LmVDb250YWluZXIoKTsKLQkJCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJCQkJCWlmICghIHBrZy5nZXREaWFncmFtcygpLmlzRW1wdHkoKSkgewotCQkJCQkJCQlBcnJheUxpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QocGtnLmdldERpYWdyYW1zKCkpOwotCQkJCQkJCQlwa2cuZ2V0RGlhZ3JhbXMoKS5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCQkJCQkJCWRpcnR5ID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwcm9jOiAiICsgcHJvYyk7CS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICBwa2c6ICIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRpcnR5KSB7Ci0JCQkJCXByb2MuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJCW5lZWRTYXZlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlpZiAobmVlZFNhdmUpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQkKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb25QbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNmY5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9EaWFncmFtTWlncmF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtTWlncmF0aW9uUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1NaWdyYXRpb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvbkV4cG9ydENvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTRhOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBUaGUgcHJvY2VzcyB0eXBlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfVFlQRSA9ICJwcm9jZXNzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwcm9jZXNzIG5hbWUgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19OQU1FID0gInByb2Nlc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHByb2Nlc3MgY29udGV4dCBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRFWFQgPSAiY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB0YXJnZXQgZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RJUkVDVE9SSUVTID0gInRhcmdldERpcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgbmFtZXMgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfTkFNRVMgPSAidGVtcGxhdGVOYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgcHJvY2VzcyBjb250ZXh0IHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0NPTlRFWFQgPSAiYWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnID0gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjExMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwNDk0MDAzNTA1Mjc3MTA2MTRMOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9NaWdyYXRpb25SZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvblJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UzYjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBNaWdyYXRpb24gcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWlncmF0aW9uUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBNaWdyYXRpb25SZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc0dyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc05hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfY29udGV4dE5hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVHcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVOYW1lTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19leHBvcnRfd2l6YXJkX2RpckxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9icm93c2VCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19vdmVyd3JpdGVUZXh0RGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X292ZXJ3cml0ZVRleHRfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfYWN0aXZpdGllc05hbWVMYWJlbF90ZXh0OwotCi0JCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5fbWV0aG9kX2xpYnJhcnlfZXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfRk9SSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUkFQSF9OT0RFX0lOSVRJQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9GSU5BTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUkFQSF9OT0RFX0RFQ0lTSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfRlJFRV9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfTUVSR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9KT0lOOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfTElOSzsKLQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNaWdyYXRpb25SZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFmMzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90aXRsZT1FeHBvcnQgV29ya2Zsb3cgV2l6YXJkCi13b3JrZmxvd19leHBvcnRfd2l6YXJkX3RleHQ9V2l6YXJkIHRvIGV4cG9ydCB3b3JrZmxvdyAoYWN0aXZpdHkgZGlhZ3JhbXMpCi13b3JrZmxvd19leHBvcnRfd2l6YXJkX3Byb2Nlc3NHcm91cF90ZXh0PVByb2Nlc3MKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc05hbWVMYWJlbF90ZXh0PVByb2Nlc3M6Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2NvbnRleHROYW1lTGFiZWxfdGV4dD1Db25maWd1cmF0aW9uOgotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZUdyb3VwX3RleHQ9VGVtcGxhdGUKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVOYW1lTGFiZWxfdGV4dD1GaWxlIE5hbWU6Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2RpckxhYmVsX3RleHQ9RGlyZWN0b3J5Ogotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLXdvcmtmbG93X292ZXJ3cml0ZVRleHREaWFsb2dfdGl0bGU9T3ZlcndyaXRlCi13b3JrZmxvd19vdmVyd3JpdGVUZXh0X21zZz1EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGU/Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2FjdGl2aXRpZXNOYW1lTGFiZWxfdGV4dD1BY3Rpdml0eToKLQotb3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yCi1vcGVuX21ldGhvZF9saWJyYXJ5X2Vycm9yX3RleHQ9WW91IG5lZWQgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5IGJlZm9yZSBwZXJmb3JtaW5nIGFuIGV4cG9ydC4KLQotIyBHcmFwaCBOb2RlIG5hbWVzCi0KLUdSQVBIX05PREVfRk9SSz1Gb3JrIE5vZGUKLUdSQVBIX05PREVfSU5JVElBTD1TdGFydCBOb2RlCi1HUkFQSF9OT0RFX0ZJTkFMPUVuZCBOb2RlCi1HUkFQSF9OT0RFX0RFQ0lTSU9OPURlY2lzaW9uIG5vZGUKLUdSQVBIX05PREVfRlJFRV9URVhUPUZyZWUgVGV4dAotR1JBUEhfTk9ERV9NRVJHRT1NZXJnZSBOb2RlCi1HUkFQSF9OT0RFX0pPSU49Sm9pbiBOb2RlCi1HUkFQSF9OT0RFX0xJTks9TGluawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eU1hcE5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eU1hcE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwZjliNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvQWN0aXZpdHlNYXBOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlNYXBOb2RlIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlNYXBOb2RlKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0vKgkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbih1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIG9iaikpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZSh1bWxOb2RlLCAKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9QSEFTRSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHVtbE5vZGUsIAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTik7Ci0JCX0gZWxzZSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHVtbE5vZGUsIAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX0FDVElWSVRZKTsKLQkJfSovCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgb2JqKSk7Ci0JCX0KLQotCQlpZiAodW1sTm9kZSAhPSBudWxsKSB7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNGIyMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJNYXBlTm9kZShOb2RlIG5vZGUpIHsKLQkJc3VwZXIobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHVtbCBub2RlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTm9kZSgpIHsKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCQl1bWxOb2RlID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpOwotCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgbm9kZS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbih1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIG9iaikpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwgCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZSh1bWxOb2RlLCAKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpOwotCQl9Ci0KLQkJaWYgKHVtbE5vZGUgIT0gbnVsbCkgewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9EZWNpc2lvbk5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9EZWNpc2lvbk5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4NThhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRGVjaXNpb25Ob2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5EZWNpc2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlTWFwKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogVXBkYXRlIHVtbCBub2RlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTm9kZSgpIHsKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCi0JCXVtbE5vZGUgPSAoRGVjaXNpb25Ob2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiAiICIsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWNpc2lvbk5vZGUoKSk7Ci0JCQotCQlpZih1bWxOb2RlICE9IG51bGwpewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9GaW5hbE5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9GaW5hbE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyNzk2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRmluYWxOb2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZpbmFsTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyBGaW5hbE5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQkKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCQl1bWxOb2RlID0gKEFjdGl2aXR5RmluYWxOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiBHUkFQSF9OT0RFX0ZJTkFMLCAKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0ZvcmtOb2RlTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRm9ya05vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhOWYyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRm9ya05vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIEZvcmtOb2RlTWFwKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogIFVwZGF0ZSB1bWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZU5vZGUoKTsKLQotCQl1bWxOb2RlID0gKEZvcmtOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiBHUkFQSF9OT0RFX0ZPUktfTk9ERSwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpKTsKLQkKLQkJaWYodW1sTm9kZSAhPSBudWxsKXsKLQkJCWdyYXBoVU1MTm9kZU1hcC5wdXQobm9kZSwgdW1sTm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9JTWFwQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSU1hcENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDE1Zjg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9JTWFwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5NaWdyYXRpb25SZXNvdXJjZXM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcENvbnN0YW50cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnICA9IHRydWU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9GT1JLX05PREUgPSAiIjsgLy9NaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9GT1JLOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0lOSVRJQUwgPSAiIjsgLy9NaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9JTklUSUFMOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0ZJTkFMID0gIiI7IC8vIE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0ZJTkFMOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0RFQ0lTSU9OID0gIE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0RFQ0lTSU9OOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9GUkVFX1RFWFQgPSBNaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9GUkVFX1RFWFQ7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9NRVJHRSA9IE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX01FUkdFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfSk9JTiA9ICIiOyAvL01pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0pPSU47IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgTWFwIGdyYXBoVU1MTm9kZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSW5pdGlhbE5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Jbml0aWFsTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY1YTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Jbml0aWFsTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0JCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoSW5pdGlhbE5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6IEdSQVBIX05PREVfSU5JVElBTCwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0aWFsTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0pvaW5Ob2RlTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSm9pbk5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5MmE1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSm9pbk5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlTWFwIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgSm9pbk5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoSm9pbk5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6IEdSQVBIX05PREVfSk9JTiwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjUzNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi0KLQotcHVibGljIGNsYXNzIE1hcEZhY3RvcnkgewotCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0Jc3RhdGljIE1hcEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgTWFwRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZXRlIG1hcCBub2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcE5vZGUgY3JlYXRlKE5vZGUgbm9kZSkgewotCQlpbnQgY2xhc3NpZmllciA9IG5vZGUuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcikgewotCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREU6Ci0JCQlyZXR1cm4gY3JlYXRlV29ya0JyZWFrRG93bkVsZW1lbnROb2RlKG5vZGUpOwotCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFOgotCQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpIG5vZGU7Ci0JCQlpZiAodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pIHsKLQkJCQlMaXN0IGluY29taW5nQ29ubmVjdGlvbnMgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJCQotCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpCi0JCQkJCXJldHVybiBjcmVhdGVNZXJnZU5vZGUobm9kZSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gY3JlYXRlRGVjaXNpb25Ob2RlKG5vZGUpOwotCQkJCQotLy8JCQkJTGlzdCBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLS8vCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSkKLS8vCQkJCQlyZXR1cm4gY3JlYXRlTWVyZ2VOb2RlKG5vZGUpOwotLy8JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID09IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxKQotLy8JCQkJCXJldHVybiBjcmVhdGVEZWNpc2lvbk5vZGUobm9kZSk7Ci0vLwkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxCi0vLwkJCQkJCSYmIG91dGdvaW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkgewotLy8JCQkJCWNyZWF0ZU1lcmdlTm9kZShub2RlKTsKLS8vCQkJCQlyZXR1cm4gY3JlYXRlRGVjaXNpb25Ob2RlKG5vZGUpOwotLy8JCQkJfQotCQkJfSBlbHNlIGlmICh0eXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TVEFSVCkKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbE5vZGUobm9kZSk7Ci0JCQllbHNlIGlmICh0eXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5FTkQpCi0JCQkJcmV0dXJuIGNyZWF0ZUZpbmFsTm9kZShub2RlKTsKLQkJCWVsc2UgaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCUxpc3QgaW5jb21pbmdDb25uZWN0aW9ucyA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuIGNyZWF0ZUpvaW5Ob2RlKG5vZGUpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGNyZWF0ZUZvcmtOb2RlKG5vZGUpOwotLy8JCQkJTGlzdCBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLS8vCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSkKLS8vCQkJCQlyZXR1cm4gY3JlYXRlSm9pbk5vZGUobm9kZSk7Ci0vLwkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSAmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpCi0vLwkJCQkJcmV0dXJuIGNyZWF0ZUZvcmtOb2RlKG5vZGUpOwotLy8JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMQotLy8JCQkJCQkmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpIHsKLS8vCQkJCQljcmVhdGVKb2luTm9kZShub2RlKTsKLS8vCQkJCQlyZXR1cm4gY3JlYXRlRm9ya05vZGUobm9kZSk7Ci0vLwkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCXJldHVybiBjcmVhdGVGcmVlVGV4dE5vZGUobm9kZSk7Ci0JCQl9Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLkxJTks6Ci0JCQlyZXR1cm4gY3JlYXRlQ29udHJvbEZsb3cobm9kZSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIG5vZGUuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIE1hcE5vZGUgY3JlYXRlV29ya0JyZWFrRG93bkVsZW1lbnROb2RlKE5vZGUgbm9kZSkgewotCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSAKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlNYXBOb2RlKG5vZGUpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciB8fCBvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIAotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlKG5vZGUpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUZyZWVUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUZpbmFsTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBGaW5hbE5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUluaXRpYWxOb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IEluaXRpYWxOb2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVDb250cm9sRmxvdyhOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZU1lcmdlTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBNZXJnZU5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUpvaW5Ob2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IEpvaW5Ob2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVEZWNpc2lvbk5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVGb3JrTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBGb3JrTm9kZU1hcChub2RlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4N2E0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUHJlY2lzaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQm91bmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5JZGVudGl0eUFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uUmVsYXRpdmVCZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uZGF0YXR5cGUuUmVsYXRpdmVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBOb2RlIGltcGxlbWVudHMgSU1hcENvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCi0JLy9wcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm90YXRpb25Ob2RlOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQkKLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgdW1sTm9kZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTUFHRV9IRUlHSFQgPSAzMjsKLQkKLQlwdWJsaWMgTWFwTm9kZShOb2RlIG5vZGUpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgTWFwTm9kZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdXBkYXRlUmVzb3VyY2UoKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQotCQkvLyBDaGVjayBpZiBub3RhdGlvbiBlbGVtZW50IGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGdyYXBoVU1MTm9kZU1hcC5nZXQobm9kZSkgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlIHRlbXBVTUxOb2RlID0gKEFjdGl2aXR5Tm9kZSkgZ3JhcGhVTUxOb2RlTWFwCi0JCQkJCS5nZXQobm9kZSk7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRlbXBOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQlkaWFncmFtLCB0ZW1wVU1MTm9kZSk7Ci0JCQlpZiAodGVtcE5vdGF0aW9uTm9kZSAhPSBudWxsKQotCQkJCXJldHVybiB0ZW1wTm90YXRpb25Ob2RlOwotCi0JCX0KLQotCQkvLyBDcmVhdGUgQWN0aXZpdHkgTm9kZQotCQl1cGRhdGVOb2RlKCk7Ci0KLQkJLy8gQ3JlYXRlIE5vdGF0aW9uIG5ub2RlCi0JCW5vdGF0aW9uTm9kZSA9IE1hcFV0aWwuY3JlYXRlTm90YXRpb25Ob2RlX0FEKGRpYWdyYW0sIHVtbE5vZGUpOwotCQlkaWFncmFtLmluc2VydENoaWxkKG5vdGF0aW9uTm9kZSk7Ci0KLQkJLy8gc2V0IHNpemUKLQkJc2V0TGF5b3V0Q29uc3RyYWludChub2RlLCBub3RhdGlvbk5vZGUpOwotCi0JCS8vIHNldCBlbGVtZW50Ci0JCW5vdGF0aW9uTm9kZS5zZXRFbGVtZW50KHVtbE5vZGUpOwotCi0JCS8vIG1hcmsgaW5oZXJpdGVkCi0JCXNldEluaGVyaXRlZEF0dHJpYnV0ZShub2RlLCBub3RhdGlvbk5vZGUpOwotCQkKLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBub3RhdGlvbk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TGF5b3V0Q29uc3RyYWludChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUsCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSkgewotCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLQkJCi0JCWludCB0eXBlID0gbmV3IEludGVnZXIobm90YXRpb25Ob2RlLmdldFR5cGUoKSkuaW50VmFsdWUoKTsKLQkJaWYgKG5vZGUuZ2V0SGVpZ2h0KCkgPT0gLTEpIHsKLQkJCSBpZiAodHlwZSA9PSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwgdHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCXsKLQkJCQkgYm91bmRzLnNldEhlaWdodCgyNCk7Ci0JCQkgfQotCQkJIGVsc2UgaWYgKHR5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwgdHlwZSA9PSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkJewotCQkJCSBib3VuZHMuc2V0SGVpZ2h0KDUpOwotCQkJIH0KLQkJCSBlbHNlIGlmICh0eXBlID09IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKXsKLQkJCQkgYm91bmRzLnNldEhlaWdodCgyNCk7Ci0JCQkgfQotCQl9IGVsc2UgewotCQkJYm91bmRzLnNldEhlaWdodChub2RlLmdldEhlaWdodCgpKTsKLQkJfQotCQkKLQkJLy8gRHVlIHRvIGJ1ZyBpbiBvbGQgZGlhZ3JhbSwgc29tZSBvZiB0aGUgZGVjaXNpb25Ob2RlIHdpZHRoIGlzIC0xCi0JCWlmICgobm9kZS5nZXRXaWR0aCgpID09IC0xKSAmJiAodHlwZSA9PSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJfHwgdHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpKSB7Ci0JCQkJYm91bmRzLnNldFdpZHRoKDQ4KTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcy5zZXRXaWR0aChub2RlLmdldFdpZHRoKCkpOwotCQl9Ci0JCQotCQlpbnQgdyA9IGJvdW5kcy5nZXRXaWR0aCgpOwotCQlpbnQgaCA9IGJvdW5kcy5nZXRIZWlnaHQoKTsKLQkJRGltZW5zaW9uIGRpbSA9IERpYWdyYW1Db3JlVXRpbC5nZXRUZXh0U2l6ZUluV3JhcExhYmVsKG5hbWUsIG51bGwsIHcsIGgsIG51bGwpOwotCQlpbnQgZGltdyA9IGRpbS53aWR0aDsKLQkJaWYgKHcgPCBkaW13ICYmIGRpbXcgIT0gMCkgewotCQkJYm91bmRzLnNldFdpZHRoKGRpbXcpOwotCQl9Ci0JCQotLy8JCWJvdW5kcy5zZXRIZWlnaHQobm9kZS5nZXRIZWlnaHQoKSk7Ci0vLwkJYm91bmRzLnNldFdpZHRoKG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCWJvdW5kcy5zZXRYKG5vZGUuZ2V0TG9jYXRpb24oKS54KTsKLQkJYm91bmRzLnNldFkobm9kZS5nZXRMb2NhdGlvbigpLnkpOwotCQlub3RhdGlvbk5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChib3VuZHMpOwotCX0KLQotCS8qKgotCSAqIFNldCBpbmhlcml0ZWQgYXR0cmlidXRlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbm90YXRpb25Ob2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEluaGVyaXRlZEF0dHJpYnV0ZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUsCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSkgewotCQlpZiAobm9kZS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0R3JhcGhOb2RlKCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpICE9IG51bGwKLQkJCQkJJiYgIShub2RlLmdldEdyYXBoTm9kZSgpLmdldEJyaWVmRGVzY3JpcHRpb24oKS50cmltKCkKLQkJCQkJCQkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZChub3RhdGlvbk5vZGUpOwotCQl9IAotCX0KLQkKLQkKLQkvKioKLQkgKiBGaW5kIGNvcnJlc3BvbmRpbmcgbm90YXRpb24gbm9kZSBmb3IgdGhlIHVtbCBub2RlIGluIHRoZSBkaWFncmFtCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gdW1sTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgZmluZE5vdGF0aW9uTm9kZSgKLQkJCURpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHlOb2RlIHVtbE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBpdGVyYXRvcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAodW1sTm9kZS5lcXVhbHMobm9kZS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgVW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJbmFtZSA9ICgoTmFtZWROb2RlKSBub2RlKS5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgb3V0Z29pbmcgY29ubmVjdGlvbnMKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIG91dGdvaW5nQ29ubmVjdGlvbnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgY29ubmVjdGlvbnMgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCQlpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiBjb25uZWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8gY3JlYXRlIGNvbm5lY3Rpb24KLQkJCQlFZGdlIGVkZ2UgPSBjcmVhdGVDb25uZWN0aW9uKGxpbmspOwotCi0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZU5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkJCS5nZXQobm9kZSk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQkJZ2V0RGlhZ3JhbSgpLCBzb3VyY2VOb2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyBzb3VyY2UgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRTb3VyY2VFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBVTUwgY29udHJvbCBmbG93Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29udHJvbEZsb3cgY3JlYXRlQ29udHJvbEZsb3coKSB7Ci0JCUNvbnRyb2xGbG93IGNvbnRyb2xGbG93ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93KSBnZXRBY3Rpdml0eSgpCi0JCQkJLmNyZWF0ZUVkZ2UoIiIsIC8qTWlncmF0aW9uUmVzb3VyY2VzLkdSQVBIX05PREVfTElOSywqLyAvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250cm9sRmxvdygpKTsKLQotCQlyZXR1cm4gY29udHJvbEZsb3c7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgc291cmNlIGFuZCB0YXJnZXQgZW5kIHBvaW50cyBmb3Igc3luY2hyb25pemF0aW9uIGJhciBhbmQgZGVjaXNpb24gbm9kZQotCSAqIEBwYXJhbSBlZGdlCi0JICogQHBhcmFtIGZsb3cKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFNvdXJjZUFuZFRhcmdldEVuZFBvaW50KEVkZ2UgZWRnZSwgTGluayBmbG93KSB7Ci0JCVBvaW50IHNyY1BvaW50ID0gZmxvdy5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQotCQlWaWV3IHNyY1ZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQlWaWV3IHRhcmdldFZpZXcgPSBlZGdlLmdldFRhcmdldCgpOwotCQlpbnQgc3JjVHlwZSA9IG5ldyBJbnRlZ2VyKHNyY1ZpZXcuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCQlpbnQgdGFyZ2V0VHlwZSA9IG5ldyBJbnRlZ2VyKHRhcmdldFZpZXcuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCi0JCWlmIChzcmNUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEIHx8IHNyY1R5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwKLQkJCQlzcmNUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fCBzcmNUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJaWYgKHNyY1BvaW50ICE9IG51bGwKLQkJCQkJJiYgc3JjVmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgKSB7Ci0JCQkJQm91bmRzIGJvdW5kcyA9IChCb3VuZHMpICgob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgc3JjVmlldykKLQkJCQkJCS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJSWRlbnRpdHlBbmNob3IgYW5jaG9yID0gY3JlYXRlSWRlbnRpdHlBbmNob3Ioc3JjUG9pbnQsIGJvdW5kcyk7Ci0JCQkJaWYgKGFuY2hvciAhPSBudWxsKQotCQkJCQllZGdlLnNldFNvdXJjZUFuY2hvcihhbmNob3IpOwotCQkJfQotCQl9Ci0JCWlmICh0YXJnZXRUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEIHx8IHRhcmdldFR5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwKLQkJCQl0YXJnZXRUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fCB0YXJnZXRUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJaWYgKHRhcmdldFBvaW50ICE9IG51bGwKLQkJCQkJJiYgdGFyZ2V0VmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHsKLQkJCQlCb3VuZHMgYm91bmRzID0gKEJvdW5kcykgKChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSB0YXJnZXRWaWV3KQotCQkJCQkJLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQlJZGVudGl0eUFuY2hvciBhbmNob3IgPSBjcmVhdGVJZGVudGl0eUFuY2hvcih0YXJnZXRQb2ludCwgYm91bmRzKTsKLQkJCQlpZiAoYW5jaG9yICE9IG51bGwpCi0JCQkJCWVkZ2Uuc2V0VGFyZ2V0QW5jaG9yKGFuY2hvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlIGlkZW50aXR5IGFuY2hvcgotCSAqIEBwYXJhbSBwb2ludAotCSAqIEBwYXJhbSBib3VuZHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJZGVudGl0eUFuY2hvciBjcmVhdGVJZGVudGl0eUFuY2hvcihQb2ludCBwb2ludCwgQm91bmRzIGJvdW5kcykgewotCQlQb2ludCB0ZW1wUG9pbnQgPSBuZXcgUG9pbnQoYm91bmRzLmdldFgoKSArIHBvaW50LngsIGJvdW5kcy5nZXRZKCkKLQkJCQkrIHBvaW50LnkpOwotCi0JCVByZWNpc2lvblBvaW50IHByZVBvaW50ID0gTWFwVXRpbC5nZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKHRlbXBQb2ludCwgYm91bmRzKTsKLQkJU3RyaW5nIGlkID0gTWFwVXRpbC5jb21wb3NlVGVybWluYWxTdHJpbmcocHJlUG9pbnQpOwotCi0JCUlkZW50aXR5QW5jaG9yIHZhbHVlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJZGVudGl0eUFuY2hvcigpOwotCQl2YWx1ZS5zZXRJZChpZCk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiBMb2FkIHJlbGF0aXZlIGJlbmQgcG9pbnRzCi0JICogQHBhcmFtIGVkZ2UKLQkgKiBAcGFyYW0gZmxvdwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQmVuZFBvaW50cyhFZGdlIGVkZ2UsIExpbmsgZmxvdykgewotCQlMaXN0IGxpc3QgPSBmbG93LmdldEJlbmRwb2ludHMoKTsKLQkJTGlzdDxSZWxhdGl2ZUJlbmRwb2ludD4gcmVsYXRpdmVQb2ludHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0aXZlQmVuZHBvaW50PigpOwotCi0JCVJlbGF0aXZlQmVuZHBvaW50IHJicCA9IG5ldyBSZWxhdGl2ZUJlbmRwb2ludCgwLCAwLCAwLCAwKTsKLQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBhYnAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHNyY05vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgZWRnZS5nZXRTb3VyY2UoKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgZWRnZS5nZXRUYXJnZXQoKTsKLQkJCQlpbnQgc3JjVHlwZSA9IG5ldyBJbnRlZ2VyKHNyY05vZGUuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCQkJCWludCB0YXJnZXRUeXBlID0gbmV3IEludGVnZXIodGFyZ2V0Tm9kZS5nZXRUeXBlKCkpLmludFZhbHVlKCk7Ci0JCQkJCi0JCQkJQm91bmRzIHNvdXJjZUJvdW5kcyA9IChCb3VuZHMpIHNyY05vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwkJCQkKLQkJCQlCb3VuZHMgdGFyZ2V0Qm91bmRzID0gKEJvdW5kcykgdGFyZ2V0Tm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJCQkKLQkJCQlpbnQgc3JjTGluZSA9IE1hcFV0aWwuZ2V0Tm9PZkxpbmVzKHNyY05vZGUpOwotCQkJCWludCB0YXJnZXRMaW5lID0gTWFwVXRpbC5nZXROb09mTGluZXModGFyZ2V0Tm9kZSk7Ci0JCQkJaW50IHNyY0hlaWdodCA9IE1hcFV0aWwuZ2V0VGV4dEhlaWdodChzcmNOb2RlKTsKLQkJCQlpbnQgdGFyZ2V0SGVpZ2h0ID0gTWFwVXRpbC5nZXRUZXh0SGVpZ2h0KHRhcmdldE5vZGUpOwotCQkJCQotCQkJCWludCBzcmNYID0gc291cmNlQm91bmRzLmdldFgoKSArIHNvdXJjZUJvdW5kcy5nZXRXaWR0aCgpIC8gMjsKLQkJCQlpbnQgc3JjWSA9IHNvdXJjZUJvdW5kcy5nZXRZKCkgKyAoSU1BR0VfSEVJR0hUICsgKHNyY0xpbmUgKiBzcmNIZWlnaHQpKSAvIDI7Ci0JCQkJaW50IHRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCB0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKSArIChJTUFHRV9IRUlHSFQgKyAodGFyZ2V0TGluZSAqIHRhcmdldEhlaWdodCkpIC8gMjsKLQotCQkJCWlmIChzcmNUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCBzcmNUeXBlID09IEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCBzcmNUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRAotCQkJCQkJfHwgc3JjVHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpIHsKLQkJCQkJUG9pbnQgc3JjUG9pbnQgPSBmbG93LmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCWlmIChzcmNQb2ludCAhPSBudWxsKSB7Ci0JCQkJCQlzcmNYID0gc291cmNlQm91bmRzLmdldFgoKSArIHNyY1BvaW50Lng7Ci0JCQkJCQlzcmNZID0gc291cmNlQm91bmRzLmdldFkoKSArIHNyY1BvaW50Lnk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHRhcmdldFR5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHRhcmdldFR5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHRhcmdldFR5cGUgPT0gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCB0YXJnZXRUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsJCQotCQkJCQlpZiAodGFyZ2V0UG9pbnQgIT0gbnVsbCkgewotCQkJCQkJdGFyWCA9IHRhcmdldEJvdW5kcy5nZXRYKCkgKyB0YXJnZXRQb2ludC54OwotCQkJCQkJdGFyWSA9IHRhcmdldEJvdW5kcy5nZXRZKCkgKyB0YXJnZXRQb2ludC55OwotCQkJCQl9CQkJCi0JCQkJfQkJCQotCQkJCWlmICh0YXJnZXRUeXBlID09IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKXsJCi0JCQkJCXRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCQl0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKSArIHRhcmdldEJvdW5kcy5nZXRIZWlnaHQoKSAvIDI7CQkKLQkJCQl9Ci0KLQkJCQlpbnQgcmVsMSA9IGFicC54IC0gc3JjWDsKLQkJCQlpbnQgcmVsMiA9IGFicC55IC0gc3JjWTsKLQkJCQlpbnQgcmVsMyA9IGFicC54IC0gdGFyWDsKLQkJCQlpbnQgcmVsNCA9IGFicC55IC0gdGFyWTsKLQotCQkJCVJlbGF0aXZlQmVuZHBvaW50IHJicDEgPSBuZXcgUmVsYXRpdmVCZW5kcG9pbnQocmVsMSwgcmVsMiwKLQkJCQkJCXJlbDMsIHJlbDQpOwotCQkJCXJlbGF0aXZlUG9pbnRzLmFkZChyYnAxKTsKLQkJCX0KLQkJfQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQotCQlpZiAocmVsYXRpdmVQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJUmVsYXRpdmVCZW5kcG9pbnRzIGJlbmRwb2ludHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVSZWxhdGl2ZUJlbmRwb2ludHMoKTsKLQkJCWJlbmRwb2ludHMuc2V0UG9pbnRzKHJlbGF0aXZlUG9pbnRzKTsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kcG9pbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgZWRnZSBpbiBkaWFncmFtIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzCi0JICogQHBhcmFtIHNvdXJjZU5vZGUKLQkgKiBAcGFyYW0gdGFyZ2V0Tm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgZmluZEVkZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb2RlLAotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IG5vdGF0aW9uTm9kZS5nZXREaWFncmFtKCkuZ2V0RWRnZXMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICgoZWRnZS5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJCQkJJiYgdGFyZ2V0Tm9kZS5lcXVhbHMoZWRnZS5nZXRUYXJnZXQoKSkKLQkJCQkJCSYmIChlZGdlLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQkJCQkmJiBzb3VyY2VOb2RlLmVxdWFscyhlZGdlLmdldFNvdXJjZSgpKSkgewotCQkJCQlyZXR1cm4gZWRnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGUgaW5jb21pbmcgY29ubmVjdGlvbnMKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIGluY29taW5nQ29ubmVjdGlvbnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgY29ubmVjdGlvbnMgPSBub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCQlpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiBjb25uZWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8gY3JlYXRlIGVkZ2UKLQkJCQlFZGdlIGVkZ2UgPSBjcmVhdGVDb25uZWN0aW9uKGxpbmspOwotCi0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZU5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkJCS5nZXQobm9kZSk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQkJZ2V0RGlhZ3JhbSgpLCBzb3VyY2VOb2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyB0YXJnZXQgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRUYXJnZXRFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gZWRnZSBmb3IgdGhlIGdpdmVuIGxpbmsKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgY3JlYXRlQ29ubmVjdGlvbihMaW5rIGxpbmspIHsKLQkJLy8gZ2V0IHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMgb2YgdGhlIGxpbmsKLQkJTm9kZSBzb3VyY2VPYmogPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldE9iaiA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gZ2V0IHVtbCBub2RlcwotCQlBY3Rpdml0eU5vZGUgc291cmNlVU1MTm9kZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGUpIGdyYXBoVU1MTm9kZU1hcAotCQkJCS5nZXQoc291cmNlT2JqKTsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldFVNTE5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkuZ2V0KHRhcmdldE9iaik7Ci0KLQkJLy8gZ2V0IG5vdGF0aW9uIG5vZGVzCi0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gZmluZE5vdGF0aW9uTm9kZSgKLQkJCQlnZXREaWFncmFtKCksIHNvdXJjZVVNTE5vZGUpOwotCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vdGF0aW9uTm9kZSA9IGZpbmROb3RhdGlvbk5vZGUoCi0JCQkJZ2V0RGlhZ3JhbSgpLCB0YXJnZXRVTUxOb2RlKTsKLQotCQlFZGdlIGVkZ2UgPSBmaW5kRWRnZShzb3VyY2VOb3RhdGlvbk5vZGUsIHRhcmdldE5vdGF0aW9uTm9kZSk7Ci0JCWlmIChlZGdlID09IG51bGwgJiYgdGFyZ2V0Tm90YXRpb25Ob2RlICE9IG51bGwpIHsKLQkJCUNvbnRyb2xGbG93IGNvbnRyb2xGbG93ID0gY3JlYXRlQ29udHJvbEZsb3coKTsKLQotCQkJaWYgKHRhcmdldFVNTE5vZGUgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCQljb250cm9sRmxvdy5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgc291cmNlVU1MTm9kZSk7Ci0JCQkJY29udHJvbEZsb3cuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIHRhcmdldFVNTE5vZGUpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgbm90YXRpb24gZWRnZQotCQkJZWRnZSA9IE1hcFV0aWwuY3JlYXRlRWRnZV9BRChzb3VyY2VOb3RhdGlvbk5vZGUsIHRhcmdldE5vdGF0aW9uTm9kZSwKLQkJCQkJY29udHJvbEZsb3cpOwotCQkJZWRnZS5zZXRFbGVtZW50KGNvbnRyb2xGbG93KTsKLQkJCWxvYWRTb3VyY2VBbmRUYXJnZXRFbmRQb2ludChlZGdlLCBsaW5rKTsKLQkJCWxvYWRCZW5kUG9pbnRzKGVkZ2UsIGxpbmspOwotCQl9Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCS8vIHByaXZhdGUgRWRnZSBmaW5kRWRnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdyBmbG93LCBEaWFncmFtCi0JLy8gZGlhZ3JhbSkgewotCS8vIExpc3QgbGlzdCA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkvLyBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRnZSkgewotCS8vIE9iamVjdCBlbGVtZW50ID0gKChFZGdlKSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLQkvLyBpZiAoZmxvdy5lcXVhbHMoZWxlbWVudCkpIHsKLQkvLyByZXR1cm4gKEVkZ2UpIG9iamVjdDsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLS8qCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOwotCQkJZGlhZ3JhbSA9IChEaWFncmFtKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgxKTsKLQkJfSovCi0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLS8qCQlpZiAoYWN0aXZpdHkgPT0gbnVsbCkgewotCQkJLy8gcmV0dXJuCi0JCQkvLyAoQWN0aXZpdHkpKChNb2RlbClnZXRVTUxPYmplY3QoKSkuYWxsT3duZWRFbGVtZW50cygpLmdldCgwKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7Ci0JCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCX0qLwotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCS8vIHB1YmxpYyBFT2JqZWN0IGdldFVNTE9iamVjdCgpewotCS8vIGlmKGVPYmplY3QgPT0gbnVsbCl7Ci0JLy8JCQkKLQkvLyBlT2JqZWN0ID0gKEFjdGl2aXR5KWdldFJlc291cmNlKDApLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCS8vIH0KLQkvLyByZXR1cm4gZU9iamVjdDsKLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0KLQkvLyBwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlKGludCBpKXsKLQkvLyByZXR1cm4gKFJlc291cmNlKXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmdldChpKTsKLQkvLyB9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGYwZTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5QcmVjaXNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLkNvbW1vblBhcnNlckhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJvdW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EZXNjcmlwdGlvblN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5GaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTWVyZ2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLQotcHVibGljIGNsYXNzIE1hcFV0aWwgewotCi0JLyoqCi0JICogQ3JlYXRlIG5vdGF0aW9uIG5vZGUgaW4gZGlhZ3JhbSBjb3JyZXNwb25kaW5nIHRvIGFjdGl2aXR5IG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSB1bWxOb2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBjcmVhdGVOb3RhdGlvbk5vZGVfQUQoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqKSB7Ci0JCU5vZGUgbm90YXRpb25Ob2RlID0gbnVsbDsKLQotCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSA/IChBY3Rpdml0eU5vZGUpIG9iagotCQkJCTogbnVsbDsKLQkJaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQnJpZGdlSGVscGVyLlVNQV9QSEFTRSkpIHsKLQkJCQkvLyBQaGFzZQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJCi0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTikpIHsKLQkJCQkvLyBJdGVyYXRpb24KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBBY3Rpdml0eQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfQotCQkJCi0JCQkvLyBzZXQgZGVmYXVsdCBmb250IHN0eWxlCi0JCQlzZXREZWZhdWx0Rm9udFN0eWxlKG5vdGF0aW9uTm9kZSk7Ci0JCQkKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgSW5pdGlhbE5vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQl9IGVsc2UgaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBEZWNpc2lvbk5vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIE1lcmdlTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgRm9ya05vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQl9IGVsc2UgaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBKb2luTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIEZpbmFsTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UKLQkJCQkJLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQkJQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCUFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgewotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHVtbE5vZGUsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKEJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FKSkgewotCQkJCS8vIE1pbGVzdG9uZQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpKSB7Ci0JCQkJLy8gVGFza0Rlc2NyaXB0b3IKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UKLQkJCQkJCS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0KLQotCQkJLy8Jc2V0IGRlZmF1bHQgZm9udCBzdHlsZQotCQkJc2V0RGVmYXVsdEZvbnRTdHlsZShub3RhdGlvbk5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gbm9kZSBmb3IgbW9kZWwgbm9kZSBpbiBBREQgYW5kIFdQRAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgY3JlYXRlTm90YXRpb25Ob2RlX0FERG9yV1BEKERpYWdyYW0gZGlhZ3JhbSwgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSBvYmopIHsKLQkJTm9kZSBub3RhdGlvbk5vZGUgPSBudWxsOwotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUgPSBvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlID8gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIG9iagotCQkJCTogbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCBub2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJLyoKLQkJCSAqIFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCBub2RlLCBuZXcgSW50ZWdlcigKLQkJCSAqIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCSAqIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJICovCi0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkvKgotCQkJICogVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJICogV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJICogQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkgKi8KLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfQotCQkKLQkJLy8gc2V0IGRlZmF1bHQgZm9udCBzdHlsZSBmb3Igbm90YXRpb24gbm9kZQotCQlzZXREZWZhdWx0Rm9udFN0eWxlKG5vdGF0aW9uTm9kZSk7Ci0JCXJldHVybiBub3RhdGlvbk5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQ3JlYXRlIHRleHQgZm9yIGZyZWUgZm9ybSB0ZXh0Ci0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgY3JlYXRlVGV4dChEaWFncmFtIGRpYWdyYW0sCi0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUpIHsKLQotCQkvLyBjcmVhdGUgdGV4dAotCQlOb2RlIHRleHQgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIFZpZXdUeXBlLlRFWFQsCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQotCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKHRleHQsIFZpZXdUeXBlLkRJQUdSQU1fTkFNRSwKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZSh0ZXh0LCBDb21tb25QYXJzZXJIaW50LkRFU0NSSVBUSU9OLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbgotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgbm9kZS5nZXRPYmplY3QoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydHkgcHJvcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShncmFwaE5vZGUKLQkJCQkuZ2V0UHJvcGVydHkoKSwgR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0KLQkJaWYgKHByb3AgIT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gcHJvcC5nZXRWYWx1ZSgpOwotCQlEZXNjcmlwdGlvblN0eWxlIGRlc2NTdHlsZSA9IChEZXNjcmlwdGlvblN0eWxlKSB0ZXh0Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVElPTl9TVFlMRSk7Ci0JCWRlc2NTdHlsZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQotCQkvLyAKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIGNyZWF0ZSBmaWxsIHN0eWxlCi0JCUZpbGxTdHlsZSBmaWxsU3R5bGUgPSAoRmlsbFN0eWxlKSB0ZXh0Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJaWYgKGZpbGxTdHlsZSAhPSBudWxsKSB7Ci0JCQkvLyBmaWxsIGNvbG9yCi0JCQlSR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsCi0JCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7Ci0JCQlmaWxsU3R5bGUuc2V0RmlsbENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikKLQkJCQkJLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGxpbmUgc3R5bGUKLQkJTGluZVN0eWxlIGxpbmVTdHlsZSA9IChMaW5lU3R5bGUpIHRleHQKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkxJTkVfU1RZTEUpOwotCQlpZiAobGluZVN0eWxlICE9IG51bGwpIHsKLQkJCS8vIGxpbmUgY29sb3IKLQkJCVJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwKLQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsKLQkJCWxpbmVTdHlsZS5zZXRMaW5lQ29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKQotCQkJCQkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgZm9udCBzdHlsZQotCQlGb250U3R5bGUgZm9udFN0eWxlID0gKEZvbnRTdHlsZSkgdGV4dAotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCUZvbnQgb2xkRm9udCA9IG51bGw7Ci0JCWlmIChmb250U3R5bGUgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGZvbnQgcHJvcGVydGllcwotCQkJU3RyaW5nIGZvbnROYW1lID0gZ2V0UHJvcGVydHlWYWx1ZShncmFwaE5vZGUsCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSk7Ci0JCQlpZiAoZm9udE5hbWUgPT0gbnVsbCkgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCVN0cmluZyBvbGRGb250U3R5bGVTdHIgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSk7CQotCQkJU3RyaW5nIGZvbnRIZWlnaHRTdHIgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpOwkJCQotCQkJU3RyaW5nIGZvbnRSZWQgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQpOwotCQkJU3RyaW5nIGZvbnRHcmVlbiA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKTsKLQkJCVN0cmluZyBmb250Qmx1ZSA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpOwotCQkJCi0JCQlpbnQgcmVkID0gMDsKLQkJCWludCBncmVlbiA9IDA7Ci0JCQlpbnQgYmx1ZSA9IDA7Ci0KLQkJCWlmIChmb250TmFtZSAhPSBudWxsKQotCQkJCWZvbnRTdHlsZS5zZXRGb250TmFtZShmb250TmFtZSk7Ci0JCQkKLQkJCWludCBvbGRGb250U3R5bGUgPSAwOwotCQkJaWYgKG9sZEZvbnRTdHlsZVN0ciAhPSBudWxsKSB7Ci0JCQkJb2xkRm9udFN0eWxlID0gbmV3IEludGVnZXIob2xkRm9udFN0eWxlU3RyKS5pbnRWYWx1ZSgpOwotCQkJCWlmIChvbGRGb250U3R5bGUgPT0gMSkKLQkJCQkJZm9udFN0eWxlLnNldEJvbGQodHJ1ZSk7Ci0JCQkJaWYgKG9sZEZvbnRTdHlsZSA9PSAyKQotCQkJCQlmb250U3R5bGUuc2V0SXRhbGljKHRydWUpOwotCQkJCWlmIChvbGRGb250U3R5bGUgPT0gMykgewotCQkJCQlmb250U3R5bGUuc2V0Qm9sZCh0cnVlKTsKLQkJCQkJZm9udFN0eWxlLnNldEl0YWxpYyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIHNldCBmb250IGhlaWdodAotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWlmIChmb250SGVpZ2h0U3RyICE9IG51bGwpCi0JCQkJZm9udEhlaWdodCA9IG5ldyBJbnRlZ2VyKGZvbnRIZWlnaHRTdHIpLmludFZhbHVlKCk7Ci0JCQlmb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250SGVpZ2h0KTsKLQkJCQotCQkJLy8gc2V0IGZvbnQgUkdCIGNvbG9yCi0JCQlpZiAoZm9udFJlZCAhPSBudWxsKQotCQkJCXJlZCA9IG5ldyBJbnRlZ2VyKGZvbnRSZWQpLmludFZhbHVlKCk7Ci0JCQlpZiAoZm9udEdyZWVuICE9IG51bGwpCi0JCQkJZ3JlZW4gPSBuZXcgSW50ZWdlcihmb250R3JlZW4pLmludFZhbHVlKCk7Ci0JCQlpZiAoZm9udEJsdWUgIT0gbnVsbCkKLQkJCQlibHVlID0gbmV3IEludGVnZXIoZm9udEJsdWUpLmludFZhbHVlKCk7Ci0KLQkJCVJHQiBmb250UkdCID0gbmV3IFJHQihyZWQsIGdyZWVuLCBibHVlKTsKLQkJCWZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQotCQkJCQkuaW50VmFsdWUoKSk7CQkJCi0JCQkKLQkJCS8vIG1ha2Ugb2xkIGZvbnQgYXMgd2VsbAotCQkJb2xkRm9udCA9IG5ldyBGb250KG51bGwsIGZvbnROYW1lLCBmb250SGVpZ2h0LCBvbGRGb250U3R5bGUpOwotCQl9Ci0JCi0JCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGRlc2NyaXB0aW9uLCBvbGRGb250KTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgewotCQkJb2xkRm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaW50IG5vT2ZMaW5lcyA9IDE7Ci0JCWlmIChkICE9IG51bGwgJiYgZC53aWR0aCA+IDApIHsKLQkJCWlmIChub2RlLmdldFdpZHRoKCkgPT0gLTEpCi0JCQkJbm9PZkxpbmVzID0gMTsKLQkJCWVsc2UgewotCQkJCWludCBkaXYgPSBkLndpZHRoIC8gbm9kZS5nZXRXaWR0aCgpOwkJCi0JCQkJaW50IG1vZCA9IGQud2lkdGggJSBub2RlLmdldFdpZHRoKCk7Ci0vLwkJCQlpZiAobW9kICE9IDApCi0JCQkJCWRpdisrOwotCQkJCW5vT2ZMaW5lcyA9IGRpdjsKLQkJCX0KLQkJfQotCi0JCWludCB0ZXh0SGVpZ2h0ID0gZC5oZWlnaHQ7CQkKLQotCQkvLyBjcmVhdGUgbGF5b3V0IGNvbnRyYWludAotCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLS8vCQlib3VuZHMuc2V0SGVpZ2h0KG5vT2ZMaW5lcyAqIHRleHRIZWlnaHQpOwotCQlpZiAobm9kZS5nZXRXaWR0aCgpID09IC0xKSB7Ci0JCQlpbnQgdGV4dFdpZHRoID0gZC53aWR0aDsKLQkJCWJvdW5kcy5zZXRXaWR0aCh0ZXh0V2lkdGgpOwotCQl9Ci0JCWVsc2UKLQkJCWJvdW5kcy5zZXRXaWR0aChub2RlLmdldFdpZHRoKCkpOwotCQlib3VuZHMuc2V0WChub2RlLmdldExvY2F0aW9uKCkueCk7Ci0JCWJvdW5kcy5zZXRZKG5vZGUuZ2V0TG9jYXRpb24oKS55KTsKLQotCQl0ZXh0LnNldExheW91dENvbnN0cmFpbnQoYm91bmRzKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVkZ2UgZm9yIEFEIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfQUQoTm9kZSBzb3VyY2VOb2RlLCBOb2RlIHRhcmdldE5vZGUsCi0JCQlBY3Rpdml0eUVkZ2UgYWN0RWRnZSkgewotCQlpZiAoYWN0RWRnZSBpbnN0YW5jZW9mIENvbnRyb2xGbG93KSB7Ci0JCQlFZGdlIGVkZ2UgPSBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUsIGFjdEVkZ2UsCi0JCQkJCW5ldyBJbnRlZ2VyKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgYWN0RWRnZSwgbmV3IEludGVnZXIoCi0JCQkJCUNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfQotCQkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGUgZWRnZSBmb3IgV1BEIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfV1BEKE5vZGUgc291cmNlTm9kZSwgTm9kZSB0YXJnZXROb2RlLAotCQkJRU9iamVjdCBhY3RFZGdlKSB7Ci0JCWlmIChhY3RFZGdlIGluc3RhbmNlb2YgTGluaykgewotCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlLCBhY3RFZGdlLAotCQkJCQluZXcgSW50ZWdlcihvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShlZGdlLCBhY3RFZGdlLCBuZXcgSW50ZWdlcigKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCXJldHVybiBlZGdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgZWRnZSBmb3IgQUREIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfQUREKE5vZGUgc291cmNlTm9kZSwgTm9kZSB0YXJnZXROb2RlLAotCQkJRU9iamVjdCBhY3RFZGdlKSB7Ci0JCWlmIChhY3RFZGdlIGluc3RhbmNlb2YgTGluaykgewotCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlLCBhY3RFZGdlLAotCQkJCQluZXcgSW50ZWdlcihvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgYWN0RWRnZSwgbmV3IEludGVnZXIoCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJcmV0dXJuIGVkZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKEdyYXBoTm9kZSBncmFwaE5vZGUsIFN0cmluZyBrZXkpIHsKLQkJUHJvcGVydHkgcHJvcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShncmFwaE5vZGUKLQkJCQkuZ2V0UHJvcGVydHkoKSwga2V5KTsKLQotCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcC5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBubyBvZiBsaW5lcyBpbiB0aGUgbm9kZSB0ZXh0IGJhc2VkIG9uIHRleHQgd2lkdGggYW5kIHdpZHRoIG9mCi0JICogZmlndXJlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9PZkxpbmVzKE5vZGUgbm9kZSkgewotCQlpbnQgbm9PZkxpbmVzID0gMTsKLQkJaWYgKG5vZGUuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJU3RyaW5nIHRleHQgPSAoKE5hbWVkRWxlbWVudCkgbm9kZS5nZXRFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCUZvbnQgZiA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQkJCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRleHQsIGYpOwotCi0JCQlCb3VuZHMgYm91bmRzID0gKEJvdW5kcykgbm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQlpZiAoZCAhPSBudWxsICYmIGQud2lkdGggPiAwKSB7Ci0JCQkJaW50IGRpdiA9IGQud2lkdGggLyBib3VuZHMuZ2V0V2lkdGgoKTsKLQkJCQlpbnQgbW9kID0gZC53aWR0aCAlIGJvdW5kcy5nZXRXaWR0aCgpOwotCQkJCWlmIChtb2QgIT0gMCkKLQkJCQkJZGl2Kys7Ci0JCQkJbm9PZkxpbmVzID0gZGl2OwotCQkJfQotCQl9Ci0JCXJldHVybiBub09mTGluZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGhlaWdodCBvZiB0ZXh0IG9mIHRoIGVub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dEhlaWdodChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJU3RyaW5nIHRleHQgPSAoKE5hbWVkRWxlbWVudCkgbm9kZS5nZXRFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCUZvbnQgZiA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQkJCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRleHQsIGYpOwotCi0JCQlpZiAoZCAhPSBudWxsKQotCQkJCXJldHVybiBkLmhlaWdodDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHBvaW50IHRvIHRlcm1pbmFsIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2VUZXJtaW5hbFN0cmluZyhQcmVjaXNpb25Qb2ludCBwKSB7Ci0JCWZpbmFsIGNoYXIgVEVSTUlOQUxfU1RBUlRfQ0hBUiA9ICcoJzsKLQkJZmluYWwgY2hhciBURVJNSU5BTF9ERUxJTUlURVJfQ0hBUiA9ICcsJzsKLQkJZmluYWwgY2hhciBURVJNSU5BTF9FTkRfQ0hBUiA9ICcpJzsKLQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoMjQpOwotCQlzLmFwcGVuZChURVJNSU5BTF9TVEFSVF9DSEFSKTsgLy8gMSBjaGFyCi0JCXMuYXBwZW5kKChmbG9hdCkgcC5wcmVjaXNlWCk7IC8vIDEwIGNoYXJzCi0JCXMuYXBwZW5kKFRFUk1JTkFMX0RFTElNSVRFUl9DSEFSKTsgLy8gMSBjaGFyCi0JCXMuYXBwZW5kKChmbG9hdCkgcC5wcmVjaXNlWSk7IC8vIDEwIGNoYXJzCi0JCXMuYXBwZW5kKFRFUk1JTkFMX0VORF9DSEFSKTsgLy8gMSBjaGFyCi0JCXJldHVybiBzLnRvU3RyaW5nKCk7IC8vIDI0IGNoYXJzIG1heCAoKzEgZm9yIHNhZmV0eSwgaS5lLiBmb3Igc3RyaW5nCi0JCQkJCQkJCS8vIHRlcm1pbmF0aW9uKQotCX0KLQotCS8qKgotCSAqIEdldCByZWxhdGl2ZSBhbmNob3IgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqIEBwYXJhbSBib3VuZHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVjaXNpb25Qb2ludCBnZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKFBvaW50IHAsCi0JCQlCb3VuZHMgYm91bmRzKSB7Ci0JCVByZWNpc2lvblBvaW50IHJlbExvY2F0aW9uOwotCQlQb2ludCB0ZW1wID0gbmV3IFBvaW50KHApOwotCQlpZiAocC54IDwgYm91bmRzLmdldFgoKSB8fCBwLnggPiBib3VuZHMuZ2V0WCgpICsgYm91bmRzLmdldFdpZHRoKCkKLQkJCQl8fCBwLnkgPCBib3VuZHMuZ2V0WSgpCi0JCQkJfHwgcC55ID4gYm91bmRzLmdldFkoKSArIGJvdW5kcy5nZXRIZWlnaHQoKSkgewotCQkJaWYgKHAueCA8IGJvdW5kcy5nZXRYKCkgfHwgcC54ID4gYm91bmRzLmdldFgoKSArIGJvdW5kcy5nZXRXaWR0aCgpKSB7Ci0JCQkJdGVtcC54ID0gcC54IDwgYm91bmRzLmdldFgoKSA/IGJvdW5kcy5nZXRYKCkgOiBib3VuZHMuZ2V0WCgpCi0JCQkJCQkrIGJvdW5kcy5nZXRXaWR0aCgpOwotCQkJfQotCQkJaWYgKHAueSA8IGJvdW5kcy5nZXRZKCkgfHwgcC55ID4gYm91bmRzLmdldFkoKSArIGJvdW5kcy5nZXRIZWlnaHQoKSkgewotCQkJCXRlbXAueSA9IHAueSA8IGJvdW5kcy5nZXRZKCkgPyBib3VuZHMuZ2V0WSgpIDogYm91bmRzLmdldFkoKQotCQkJCQkJKyBib3VuZHMuZ2V0SGVpZ2h0KCk7Ci0JCQl9Ci0JCQlyZWxMb2NhdGlvbiA9IG5ldyBQcmVjaXNpb25Qb2ludCgoZG91YmxlKSAodGVtcC54IC0gYm91bmRzLmdldFgoKSkKLQkJCQkJLyBib3VuZHMuZ2V0V2lkdGgoKSwgKGRvdWJsZSkgKHRlbXAueSAtIGJvdW5kcy5nZXRZKCkpCi0JCQkJCS8gYm91bmRzLmdldEhlaWdodCgpKTsKLQkJfSBlbHNlIHsKLQotCQkJcmVsTG9jYXRpb24gPSBuZXcgUHJlY2lzaW9uUG9pbnQoKGRvdWJsZSkgKHRlbXAueCAtIGJvdW5kcy5nZXRYKCkpCi0JCQkJCS8gYm91bmRzLmdldFdpZHRoKCksIChkb3VibGUpICh0ZW1wLnkgLSBib3VuZHMuZ2V0WSgpKQotCQkJCQkvIGJvdW5kcy5nZXRIZWlnaHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlbExvY2F0aW9uOwotCX0KLQotCQotCS8qKgotCSAqIFNldCBkZWZhdWx0IGZvbnQgc3R5bGUgZm9yIG5vdGF0aW9uIG5vZGUKLQkgKiBAcGFyYW0gbm90YXRpb25Ob2RlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZWZhdWx0Rm9udFN0eWxlKE5vZGUgbm90YXRpb25Ob2RlKSB7Ci0JCS8vCWNyZWF0ZSBmb250IHN0eWxlCi0JCUZvbnRTdHlsZSBmb250U3R5bGUgPSAoRm9udFN0eWxlKSBub3RhdGlvbk5vZGUKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCi0JCWlmIChmb250U3R5bGUgIT0gbnVsbCkgewotCi0JCQkvLyBzZXQgZm9udCBuYW1lCi0JCQlTdHJpbmcgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCWlmIChmb250TmFtZSAhPSBudWxsKQotCQkJCWZvbnRTdHlsZS5zZXRGb250TmFtZShmb250TmFtZSk7Ci0KLQkJCS8vIHNldCBmb250IGhlaWdodAotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnRIZWlnaHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01lcmdlTm9kZU1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01lcmdlTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjYyZWVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NZXJnZU5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCXB1YmxpYyBNZXJnZU5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoTWVyZ2VOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiAiICIsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKSk7Ci0JCQotCQlpZih1bWxOb2RlICE9IG51bGwpewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3NlcnZpY2VzL1dvcmtmbG93MlhNSVJlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDhkNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdvcmtmbG93MlhNSVJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHVibGljIFdvcmtmbG93MlhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0KLQkJZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsIERFRkFVTFRfRU5DT0RJTkcpOwotCQlnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCBERUZBVUxUX0VOQ09ESU5HKTsKLQkJCi0KLQkJZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUlSZXNvdXJjZS5PUFRJT05fVVNFX1hNSV9UWVBFLCBCb29sZWFuLlRSVUUpOwotCQlnZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX1VTRV9YTUlfVFlQRSwgQm9vbGVhbi5UUlVFKTsKLQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCS8vc2V0SW50cmluc2ljSURUb0VPYmplY3RNYXAobWFwKTsKLQkJaWRUb0VPYmplY3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljcmVhdGVYTUxIZWxwZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlVVVJRHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQlyZXR1cm4gbmV3IFhNSVNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3NlcnZpY2VzL1dvcmtmbG93RXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3dFeHBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTU0ODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3dFeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGlhZ3JhbU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwLklNYXBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcC5NYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXAuTWFwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwLk1hcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkZHdwZC5tYXAuQ29ubmVjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLnV0aWwuTWlncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Cb3VuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi0KLXB1YmxpYyBjbGFzcyBXb3JrZmxvd0V4cG9ydFNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9YTUlfRVhURU5TSU9OID0gIi54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQkKLQlwdWJsaWMgc3RhdGljIFdvcmtmbG93RXhwb3J0U2VydmljZSBzaW5nbGV0b24gPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBXb3JrZmxvd0V4cG9ydFNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkgewotCQkJc2luZ2xldG9uID0gbmV3IFdvcmtmbG93RXhwb3J0U2VydmljZSgpOwotCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGFjdGl2aXR5IGRpYWdyYW0gZGF0YQotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHBhcmFtIHRhcmdldERpcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydChQcm9jZXNzIHByb2MsIEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgZmlsZU5hbWUsCi0JCQlGaWxlIHRhcmdldERpcikgdGhyb3dzIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbiB7Ci0KLQkJZGVidWcgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQkKLQkJLy8gY29uc3RydWN0IHRoZSBleHBvcnQgdGFyZ2V0IHhtbCBmaWxlIHBhdGgKLQkJUGF0aCBleHBvcnRQYXRoID0gbmV3IFBhdGgodGFyZ2V0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYm9vbGVhbiBlbmRXaXRoWG1pRXh0ID0gZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgKLQkJCQlERUZBVUxUX1hNSV9FWFRFTlNJT04pOwotCi0JCVN0cmluZyBleHBvcnRYTUlQYXRoID0gKGV4cG9ydFBhdGguYXBwZW5kKGVuZFdpdGhYbWlFeHQgPyBmaWxlTmFtZQotCQkJCTogKGZpbGVOYW1lICsgREVGQVVMVF9YTUlfRVhURU5TSU9OKSkpLnRvT1NTdHJpbmcoKTsKLQotCi0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShleHBvcnRYTUlQYXRoKTsKLQkJCi0vKgkJLy8gQ3JlYXRlIHJlc291cmNlIHNldAotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQotCQkvL1hNTFJlc291cmNlSW1wbCB4bWlyZXMgPSBuZXcgV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCS8vUmVzb3VyY2UgeG1pcmVzID0gIG5ldyBHTUZSZXNvdXJjZUZhY3RvcnkoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlSZXNvdXJjZSB4bWlyZXMgPSAgRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYykKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQotCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQoeG1pcmVzKTsqLwotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jLCB0aGlzKTsKLQkJCi0JCXRyeSB7Ci0JCQlUcmFuc2FjdGlvbiB0eCA9ICBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsCi0JCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlSZXNvdXJjZSB4bWlyZXMgPSBtZ3IuZ2V0UmVzb3VyY2UoKTsKLQkJCXR4LmNvbW1pdCgpOwotCQkJCi0JCQkvLyBDcmVhdGUgdGVtcCBtYXAKLQkJCUlNYXBDb25zdGFudHMuZ3JhcGhVTUxOb2RlTWFwLmNsZWFyKCk7Ci0JCQkKLQkJCWlmIChwcm9jID09IGFjdGl2aXR5KSB7Ci0JCQkJTWFwIGFjdGl2aXRpZXMgPSBNaWdyYXRpb25VdGlsLmdldEFjdGl2aXRpZXMocHJvYywgdHJ1ZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGFjdGl2aXRpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0Lm5leHQoKTsKLQkJCQkJYWRkQUQoeG1pcmVzLCBwcm9jLCBhY3QsIG1ncik7Ci0JCQkJCWFkZEFERCh4bWlyZXMsIHByb2MsIGFjdCwgbWdyKTsKLQkJCQkJYWRkV1BEKHhtaXJlcywgcHJvYywgYWN0LCBtZ3IpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYWRkQUQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCQlhZGRBREQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCQlhZGRXUEQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCX0KLQotLyoJCQl0eC5jb21taXQoKTsqLwotCQkJCi0JCQlMaXN0IGNvbnRlbnRzID0geG1pcmVzLmdldENvbnRlbnRzKCk7Ci0JCQlpZiAoY29udGVudHMgIT0gbnVsbCAmJiAhIGNvbnRlbnRzLmlzRW1wdHkoKSkgewotCQkJCXhtaXJlcy5zYXZlKG51bGwpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgbmV3IE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9XUEQoUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFByb2Nlc3MgcHJvYywKLQkJCUFjdGl2aXR5IHVtYUFjdGl2aXR5KSB7CQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKHVtYUFjdGl2aXR5LCBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSwgZmFsc2UpOwotCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldQREQtPiIrcHJvYy5nZXROYW1lKCkrIjo6Iit1bWFBY3Rpdml0eS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gd3BkRGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJCWFkZERhdGFUb1Jlc291cmNlX0FERG9yV1BEKHByb2MsIHVtYUFjdGl2aXR5LCB4bWlSZXNvdXJjZSwKLQkJCQkJd3BkRGlhZ3JhbSk7Ci0JCX0KLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgYWRkRGF0YVRvUmVzb3VyY2VfQUREKFJlc291cmNlIHhtaVJlc291cmNlLAotCQkJUHJvY2VzcyBwcm9jLCBBY3Rpdml0eSB1bWFBY3Rpdml0eSkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0VU1BRGlhZ3JhbSh1bWFBY3Rpdml0eSwKLQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgZmFsc2UpOwotCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFERC0+Iitwcm9jLmdldE5hbWUoKSsiOiIrdW1hQWN0aXZpdHkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW0gYWRkRGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQkJYWRkRGF0YVRvUmVzb3VyY2VfQUREb3JXUEQocHJvYywgdW1hQWN0aXZpdHksIHhtaVJlc291cmNlLAotCQkJCQlhZGREaWFncmFtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9BRERvcldQRChQcm9jZXNzIHByb2MsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCAKLQkJCVJlc291cmNlIHhtaVJlc291cmNlLCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGFkZE9yV3BkRGlhZ3JhbSkgewotCQlTdXBwcmVzc2lvbiBzdXAgPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCWFkZE9yV3BkRGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQlTdHJpbmcga2luZCA9IG51bGw7Ci0JCVByZWZlcmVuY2VzSGludCBwcmVmSGludCA9IG51bGw7Ci0JCWlmIChhZGRPcldwZERpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWFkZE9yV3BkRGlhZ3JhbS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQlraW5kID0gRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQ7Ci0JCQlwcmVmSGludCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCX0gZWxzZSBpZiAoYWRkT3JXcGREaWFncmFtIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJa2luZCA9IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kOwotCQkJcHJlZkhpbnQgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWFkZE9yV3BkRGlhZ3JhbS5zZXRPYmplY3QodW1hQWN0aXZpdHkpOwotCQlhZGRPcldwZERpYWdyYW0uc2V0TGlua2VkRWxlbWVudCh1bWFBY3Rpdml0eSk7Ci0JCQotCQkvLwlzZXQgc3VwcHJlc3Npb24vcHVibGlzaGVkIGluZm8gZm9yIEFERC8gV1BERAotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gdW1hRGlhZ3JhbSA9IGFkZE9yV3BkRGlhZ3JhbS5nZXRVTUFEaWFncmFtKCk7Ci0JCWlmICh1bWFEaWFncmFtICE9IG51bGwpIHsKLQkJCWlmICh1bWFEaWFncmFtLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewkKLQkJCQlpZiAoYWRkT3JXcGREaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKXsKLQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFERCh1bWFBY3Rpdml0eSwgZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChhZGRPcldwZERpYWdyYW0gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSB7Ci0JCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hXUEREKHVtYUFjdGl2aXR5LCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdldCBhdXRvTGF5b3V0IGZsYWcgaWYgZGlhZ3JhbSBpcyBBREQKLQkJaWYgKGFkZE9yV3BkRGlhZ3JhbSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJYm9vbGVhbiB2YWx1ZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLmlzQXV0b0xheW91dCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBhZGRPcldwZERpYWdyYW0pOwotCQkJKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGFkZE9yV3BkRGlhZ3JhbSkuc2V0QXV0b0xheW91dCh2YWx1ZSk7Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBkaWFncmFtCi0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0oYWRkT3JXcGREaWFncmFtLCBraW5kLAotCQkJCXByZWZIaW50KTsKLQkJZGlhZ3JhbS5zZXRFbGVtZW50KGFkZE9yV3BkRGlhZ3JhbSk7Ci0JCWRpYWdyYW0uc2V0TmFtZSh1bWFBY3Rpdml0eS5nZXROYW1lKCkpOwotCQkKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoYWRkT3JXcGREaWFncmFtKTsKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkKLQkJTGlzdCBkaWFncmFtTm9kZXMgPSBhZGRPcldwZERpYWdyYW0uZ2V0Tm9kZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW1Ob2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUgKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgJiYKLQkJCQkJCSgoKFR5cGVkTm9kZSlvYmopLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSkJewkKLQkJCQkJLy8gZG8gc3BlY2lhbCBoYW5kaW5nIGZvciBmcmVlIHRleHQgbm9kZQkJCQkJCi0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdGV4dCA9IE1hcFV0aWwuY3JlYXRlVGV4dChkaWFncmFtLCAoTm9kZSkgb2JqKTsKLQkJCQkJZGlhZ3JhbS5pbnNlcnRDaGlsZCh0ZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENyZWF0ZSBOb3RhdGlvbiBubm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSA9IE1hcFV0aWwuY3JlYXRlTm90YXRpb25Ob2RlX0FERG9yV1BEKGRpYWdyYW0sIG5vZGUpOwotCQkJCQlpZiAobm90YXRpb25Ob2RlID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWRpYWdyYW0uaW5zZXJ0Q2hpbGQobm90YXRpb25Ob2RlKTsKLQotCQkJCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLQkJCQkJYm91bmRzLnNldEhlaWdodChub2RlLmdldEhlaWdodCgpKTsKLQkJCQkJYm91bmRzLnNldFdpZHRoKG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCQkJCWJvdW5kcy5zZXRYKG5vZGUuZ2V0TG9jYXRpb24oKS54KTsKLQkJCQkJYm91bmRzLnNldFkobm9kZS5nZXRMb2NhdGlvbigpLnkpOwotCQkJCQlub3RhdGlvbk5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChib3VuZHMpOwotCi0JCQkJCW5vdGF0aW9uTm9kZS5zZXRFbGVtZW50KG5vZGUpOwotCQkJCQotCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCW1hcC5wdXQobm9kZSwgbm90YXRpb25Ob2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlDb25uZWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbm5lY3Rpb25GYWN0b3J5KGRpYWdyYW0sIG1hcCwga2luZCk7Ci0JCS8vIENyZWF0ZSBPdXRnb2luZyBjb25uZWN0aW9ucwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJZmFjdG9yeS5vdXRnb2luZ0Nvbm5lY3Rpb25zKChOb2RlKSBvYmopOwotCQkJfQotCQl9Ci0KLQkJLy8gQ3JlYXRlIE91dGdvaW5nIGNvbm5lY3Rpb25zCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlmYWN0b3J5LmluY29taW5nQ29ubmVjdGlvbnMoKE5vZGUpIG9iaik7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9BRCggUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFByb2Nlc3MgcHJvYywKLQkJCUFjdGl2aXR5IHVtYUFjdGl2aXR5KSB7Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFVNQURpYWdyYW0odW1hQWN0aXZpdHksIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNLAotCQkJCQkJZmFsc2UpOwotCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFELT4iK3Byb2MuZ2V0TmFtZSgpKyI6Iit1bWFBY3Rpdml0eS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQkKLQkJLy8gQ3JlYXRlIHRvcCBsZXZlbCBVTUwgYWN0aXZpdHkKLQkJRU9iamVjdCBhY3Rpdml0eSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eSgpKTsKLQkJaWYgKGFjdGl2aXR5IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCSgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpYWN0aXZpdHkpLnNldE5hbWUodW1hQWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoYWN0aXZpdHkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQkvL0JyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCkgYWN0aXZpdHksICgoTWV0aG9kRWxlbWVudCkgdW1hQWN0aXZpdHkpKTsKLS8vCQkJVW1hVW1sVXRpbC5jcmVhdGVFQW5ub3RhdGlvbkZvclVtbCgoTmFtZWRFbGVtZW50KSBhY3Rpdml0eSwKLS8vCQkJCQl1bWFBY3Rpdml0eS5nZXRHdWlkKCkpOwotCQkJCi0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBhY3Rpdml0eSwgdW1hQWN0aXZpdHkpOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgZGlhZ3JhbQotCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKGFjdGl2aXR5LCBEaWFncmFtTWFuYWdlci5BRF9raW5kLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlkaWFncmFtLnNldEVsZW1lbnQoYWN0aXZpdHkpOwotCQlpZiAoYWN0aXZpdHkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJZGlhZ3JhbS5zZXROYW1lKHVtYUFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCX0KLQkKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCQotCQlBY3Rpdml0eURpYWdyYW0gYWQgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotCQlhZC5zZXRTdXBwcmVzc2lvbihzdXBwcmVzc2lvbik7Ci0JCWFkLnNldE9iamVjdCh1bWFBY3Rpdml0eSk7Ci0JCWlmIChhZC5pc05ldygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNldCBzdXBwcmVzc2lvbi9wdWJsaXNoZWQgaW5mbyBmb3IgQUQgCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSB1bWFEaWFncmFtID0gYWQuZ2V0VU1BRGlhZ3JhbSgpOwotCQlpZiAodW1hRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlpZiAodW1hRGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsJCi0JCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFEKHVtYUFjdGl2aXR5LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJcmV0dXJuIChMaXN0KSBhZC5nZXROb2RlcygpOwotCQkKLS8vCQlMaXN0IGRpYWdyYW1Ob2RlcyA9IGdldEFjdGl2aXR5RGlhZ3JhbURhdGEoc3VwcHJlc3Npb24sIHVtYUFjdGl2aXR5KTsKLQkJTGlzdCBkaWFncmFtTm9kZXMgPSBhZC5nZXROb2RlcygpOwotCQlpZiAoZGlhZ3JhbU5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQotCi0JCXhtaVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGFjdGl2aXR5KTsKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkKLQkJTGlzdCBtYXBOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSGFzaE1hcCBtYXBOb2Rlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkvLyBDcmVhdGUgVU1MIGFuZCBub3RhdGlvbiBub2RlcwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlhZ3JhbU5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSApIHsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgJiYKLQkJCQkJCSgoKFR5cGVkTm9kZSlvYmopLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSkJewkKLQkJCQkJLy8gZG8gc3BlY2lhbCBoYW5kaW5nIGZvciBmcmVlIHRleHQgbm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRleHQgPSBNYXBVdGlsLmNyZWF0ZVRleHQoZGlhZ3JhbSwgKE5vZGUpIG9iaik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlNYXBOb2RlIG1hcE5vZGUgPSBNYXBGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKChOb2RlKSBvYmopOwotCQkJCQltYXBOb2RlLnNldEFjdGl2aXR5KChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSlhY3Rpdml0eSk7Ci0JCQkJCW1hcE5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJCi0JCQkJCW1hcE5vZGUudXBkYXRlUmVzb3VyY2UoKTsKLQkJCQkJbWFwTm9kZXMuYWRkKG1hcE5vZGUpOwotCQkJCQltYXBOb2Rlc01hcC5wdXQobWFwTm9kZSwgKE5vZGUpIG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBDcmVhdGUgT3V0Z29pbmcgY29ubmVjdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWFwTm9kZSkgewotCQkJCSgoTWFwTm9kZSkgb2JqKS5vdXRnb2luZ0Nvbm5lY3Rpb25zKChOb2RlKSBtYXBOb2Rlc01hcC5nZXQoKE1hcE5vZGUpIG9iaikpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBDcmVhdGUgaW5jb21pbmcgY29ubmVjdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWFwTm9kZSkgewotCQkJCSgoTWFwTm9kZSkgb2JqKS5pbmNvbWluZ0Nvbm5lY3Rpb25zKChOb2RlKSBtYXBOb2Rlc01hcC5nZXQoKE1hcE5vZGUpIG9iaikpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybiBhY3Rpdml0eSBkaWFncmFtIGRhdGEKLQkgKiBAcGFyYW0gc3VwCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRBY3Rpdml0eURpYWdyYW1EYXRhKFN1cHByZXNzaW9uIHN1cCwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJQWN0aXZpdHlEaWFncmFtIGFkID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQkJYWQuc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJYWQuc2V0T2JqZWN0KGFjdGl2aXR5KTsKLQkJaWYgKGFkLmlzTmV3KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoTGlzdCkgYWQuZ2V0Tm9kZXMoKTsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQUQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBREQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRXUEQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMik7Ci0JfQotCQotCS8vdHlwZTogMD1BRCwgMT1BREQsIDI9V1BECi0JcHJpdmF0ZSB2b2lkIGFkZFRvUmVzb3VyY2UoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQlmaW5hbCBQcm9jZXNzIHByb2MsIGZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LAotCQkJZmluYWwgRGlhZ3JhbU1hbmFnZXIgbWdyLCBmaW5hbCBpbnQgdHlwZSkgewotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVHJhbnNhY3Rpb24gdHggPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oCi0JCQkJCQkJZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0KLQkJCQkJaWYgKHR5cGUgPT0gMCkgewotCQkJCQkJYWRkRGF0YVRvUmVzb3VyY2VfQUQocmVzb3VyY2UsIHByb2MsIHVtYUFjdGl2aXR5KTsKLQkJCQkJfSBlbHNlIGlmICh0eXBlID09IDEpIHsKLQkJCQkJCWFkZERhdGFUb1Jlc291cmNlX0FERChyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHkpOwotCQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gMikgewotCQkJCQkJYWRkRGF0YVRvUmVzb3VyY2VfV1BEKHJlc291cmNlLCBwcm9jLCB1bWFBY3Rpdml0eSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhc3NlcnQgKGZhbHNlKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJdHguY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3dpemFyZHMvTWlncmF0aW9uRXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjNiODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5EaWFncmFtTWlncmF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5NaWdyYXRpb25FeHBvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvblJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQuc2VydmljZXMuV29ya2Zsb3dFeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBFeHBvcnQgd2l6YXJkIGZvciBleHBvcnRpbmcgZGlhZ3JhbXMKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25FeHBvcnRXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8vIFRoZSB3b3JrYmVuY2ggaW5zdGFuY2UuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gVGhlIHdvcmtiZW5jaCBzZWxlY3Rpb24gd2hlbiB0aGUgd2l6YXJkIHdhcyBzdGFydGVkLgotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvLyBUaGUgZmlyc3Qgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIE1pZ3JhdGlvbkV4cG9ydFdpemFyZFBhZ2UgcGFnZTE7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgZGlhZ3JhbSBtaWdyYXRpb24gZXhwb3J0Ci0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHBhZ2UxICE9IG51bGwpIHsKLQotCQkJUHJvY2VzcyBwcm9jID0gcGFnZTEuZ2V0UHJvY2VzcygpOwotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBwYWdlMS5nZXRBY3Rpdml0eSgpOwotCQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtYyA9IHBhZ2UxLmdldENvbnRleHQoKTsKLQotCQkJU3RyaW5nIGZpbGVOYW1lID0gcGFnZTEuZ2V0VGVtcGxhdGVOYW1lKCk7Ci0JCQlTdHJpbmcgdGFyZ2V0RGlyID0gcGFnZTEuZ2V0VGFyZ2V0RGlyZWN0b3J5KCk7Ci0KLQkJCVN0cmluZyB0ZW1wbGF0ZUZpbGVOYW1lID0gZmlsZU5hbWUgKyAiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyLCB0ZW1wbGF0ZUZpbGVOYW1lKTsKLQkJCWlmICh0ZW1wbGF0ZUZpbGUuZXhpc3RzKCkpIHsKLQkJCQlib29sZWFuIG9rID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X292ZXJ3cml0ZVRleHREaWFsb2dfdGl0bGUsCi0JCQkJCQkJCU1pZ3JhdGlvblJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X292ZXJ3cml0ZVRleHRfbXNnLAotCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQkJdGVtcGxhdGVGaWxlTmFtZSwKLQkJCQkJCQkJCQkJCQkJdGFyZ2V0RGlyIH0pKTsKLQotCQkJCWlmICghb2spIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBXb3JrZmxvd0V4cG9ydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5leHBvcnQoCi0JCQkJCQlwcm9jLCBhY3Rpdml0eSwgZmlsZU5hbWUsIG5ldyBGaWxlKHRhcmdldERpcikpOwotCi0JCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChNaWdyYXRpb25FeHBvcnRFeGNlcHRpb24geGUpIHsKLQkJCQl4ZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gc3VwZXIuYWRkUGFnZXMoKTsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkgewotCQkJRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlNaWdyYXRpb25SZXNvdXJjZXMub3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90aXRsZSwKLQkJCQkJCQlNaWdyYXRpb25SZXNvdXJjZXMub3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90ZXh0KTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGFnZTEgPSBuZXcgTWlncmF0aW9uRXhwb3J0V2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCS8vIHJldHVybiBzdXBlci5jYW5GaW5pc2goKTsKLQkJcmV0dXJuIHBhZ2UxLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3dpemFyZHMvTWlncmF0aW9uRXhwb3J0V2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTAxOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvbkV4cG9ydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uTWlncmF0aW9uUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS51dGlsLk1pZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRXhwb3J0IHdpemFyZCBwYWdlIGZvciBleHBvcnRpbmcgZGlhZ3JhbXMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlXaXphcmRQYWdlLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOwotCi0JcHJpdmF0ZSBCdXR0b24gY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBDb21ibyBwcm9jZXNzQ29tYm87Ci0KLS8vCXByaXZhdGUgQ29tYm8gY29udGV4dENvbWJvOwotCi0JcHJpdmF0ZSBDb21ibyBhY3Rpdml0eUNvbWJvOwotCi0JcHJpdmF0ZSBDb21ibyB0ZW1wbGF0ZU5hbWVDb21ibzsKLQotCXByaXZhdGUgQ29tYm8gdGVtcGxhdGVEaXJDb21ibzsKLQotCXByaXZhdGUgTWFwIGNhcGFiaWxpdHlQYXR0ZXJuczsKLQotCXByaXZhdGUgTWFwIGRlbGl2ZXJ5UHJvY2Vzc2VzOwotCi0JcHJpdmF0ZSBNYXAgYWN0aXZpdGllczsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX3RleHQpOwotCQkKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBQcm9jZXNzIGdyb3VwLgotCQlHcm91cCBwcm9jZXNzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXByb2Nlc3NHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJcHJvY2Vzc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9jZXNzR3JvdXAKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzR3JvdXBfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocHJvY2Vzc0dyb3VwLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQljYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b24KLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQpOwotCQljYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhjYXBhYmlsaXR5UGF0dGVybnMpOwotCQkJCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2RlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQpOwotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQl1cGRhdGVQcm9jZXNzQ29tYm8oZGVsaXZlcnlQcm9jZXNzZXMpOwotCQkJCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlDb21wb3NpdGUgcHJvY2Vzc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocHJvY2Vzc0dyb3VwLCBTV1QuTlVMTCk7Ci0JCXByb2Nlc3NDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXByb2Nlc3NDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgcHJvY2Vzc05hbWVMYWJlbCA9IG5ldyBMYWJlbChwcm9jZXNzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXByb2Nlc3NOYW1lTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzTmFtZUxhYmVsX3RleHQpOwotCi0JCXByb2Nlc3NDb21ibyA9IG5ldyBDb21ibyhwcm9jZXNzQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXByb2Nlc3NDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvY2Vzc0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0vLwkJCQl1cGRhdGVDb250ZXh0Q29tYm8oZ2V0UHJvY2VzcygpKTsKLS8vCQkJCWlmIChnZXRQcm9jZXNzQ29udGV4dE5hbWUoKSAhPSBudWxsKSB7Ci0vLwkJCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCQkJTWFwIHJlc3VsdCA9IE1pZ3JhdGlvblV0aWwuZ2V0Q29udGV4dHMoZ2V0UHJvY2VzcygpKTsKLS8vCQkJCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSwKLS8vCQkJCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSByZXN1bHQuZ2V0KGNvbnRleHROYW1lKSk7Ci0vLwkJCQl9Ci0JCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0KLS8vCQlMYWJlbCBjb250ZXh0TmFtZUxhYmVsID0gbmV3IExhYmVsKHByb2Nlc3NDb21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQljb250ZXh0TmFtZUxhYmVsCi0vLwkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jb250ZXh0TmFtZUxhYmVsX3RleHQpOwotLy8KLS8vCQljb250ZXh0Q29tYm8gPSBuZXcgQ29tYm8ocHJvY2Vzc0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotLy8JCWNvbnRleHRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLS8vCQljb250ZXh0Q29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotLy8KLS8vCQljb250ZXh0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotLy8JCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCQlNYXAgcmVzdWx0ID0gTWlncmF0aW9uVXRpbC5nZXRDb250ZXh0cyhnZXRQcm9jZXNzKCkpOwotLy8JCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCksIChNZXRob2RDb25maWd1cmF0aW9uKSByZXN1bHQKLS8vCQkJCQkJLmdldChjb250ZXh0TmFtZSkpOwotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLS8vCQkJfQotLy8JCX0pOwotCi0JCUxhYmVsIGFjdGl2aXRpZXNOYW1lTGFiZWwgPSBuZXcgTGFiZWwocHJvY2Vzc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhY3Rpdml0aWVzTmFtZUxhYmVsCi0JCQkJLnNldFRleHQoTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X2V4cG9ydF93aXphcmRfYWN0aXZpdGllc05hbWVMYWJlbF90ZXh0KTsKLQotCQlhY3Rpdml0eUNvbWJvID0gbmV3IENvbWJvKHByb2Nlc3NDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJYWN0aXZpdHlDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYWN0aXZpdHlDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5zID0gTWlncmF0aW9uVXRpbC5nZXRDYXBhYmlsaXR5UGF0dGVybnMoKTsKLQkJZGVsaXZlcnlQcm9jZXNzZXMgPSBNaWdyYXRpb25VdGlsLmdldERlbGl2ZXJ5UHJvY2Vzc2VzKCk7Ci0JCVN0cmluZyBzYXZlZFByb2Nlc3NUeXBlID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfVFlQRSk7Ci0JCWlmIChzYXZlZFByb2Nlc3NUeXBlICE9IG51bGwKLQkJCQkmJiBzYXZlZFByb2Nlc3NUeXBlLmVxdWFscygiRGVsaXZlcnlQcm9jZXNzIikgJiYgZGVsaXZlcnlQcm9jZXNzZXMuc2l6ZSgpID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oZGVsaXZlcnlQcm9jZXNzZXMpOwotCQl9IGVsc2UgaWYgKHNhdmVkUHJvY2Vzc1R5cGUgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMuc2l6ZSgpID4gMCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oY2FwYWJpbGl0eVBhdHRlcm5zKTsKLQkJfSBlbHNlIGlmIChjYXBhYmlsaXR5UGF0dGVybnMgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMuc2l6ZSgpID4gMCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oY2FwYWJpbGl0eVBhdHRlcm5zKTsKLQkJfSBlbHNlIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhkZWxpdmVyeVByb2Nlc3Nlcyk7Ci0JCX0KLQotCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSk7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIFByb2plY3QgVGVtcGxhdGUgZ3JvdXAuCi0JCUdyb3VwIHRlbXBsYXRlR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXRlbXBsYXRlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXRlbXBsYXRlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRlbXBsYXRlR3JvdXAKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZUdyb3VwX3RleHQpOwotCi0JCUNvbXBvc2l0ZSB0ZW1wbGF0ZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGVtcGxhdGVHcm91cCwgU1dULk5VTEwpOwotCQl0ZW1wbGF0ZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJdGVtcGxhdGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgdGVtcGxhdGVOYW1lTGFiZWwgPSBuZXcgTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGVtcGxhdGVOYW1lTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZU5hbWVMYWJlbF90ZXh0KTsKLQotCQl0ZW1wbGF0ZU5hbWVDb21ibyA9IG5ldyBDb21ibyh0ZW1wbGF0ZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXRlbXBsYXRlTmFtZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgcHJldk5hbWUgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQlNaWdyYXRpb25FeHBvcnRDb25zdGFudHMuVEVNUExBVEVfTkFNRVMpOwotCQlpZiAocHJldk5hbWUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lQ29tYm8uYWRkKHByZXZOYW1lKTsKLQkJfQotCQl0ZW1wbGF0ZU5hbWVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJbmV3IExhYmVsKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJTGFiZWwgZGlyTGFiZWwgPSBuZXcgTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGlyTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kaXJMYWJlbF90ZXh0KTsKLQotCQl0ZW1wbGF0ZURpckNvbWJvID0gbmV3IENvbWJvKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGVtcGxhdGVEaXJDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJU3RyaW5nIHNhdmVkRGlyID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlRBUkdFVF9ESVJFQ1RPUklFUyk7Ci0JCWlmIChzYXZlZERpciAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZURpckNvbWJvLmFkZChzYXZlZERpcik7Ci0JCQl0ZW1wbGF0ZURpckNvbWJvLnNldFRleHQoc2F2ZWREaXIpOwotCQl9Ci0JCXRlbXBsYXRlRGlyQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbgotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2Jyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCQl0ZW1wbGF0ZURpckNvbWJvLmFkZChzZWxlY3RlZERpciwgMCk7Ci0JCQkJCQl0ZW1wbGF0ZURpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIFByb2Nlc3MgQ29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvY2Vzc0NvbWJvKE1hcCBwcm9jZXNzZXMpIHsKLQkJaWYgKHByb2Nlc3NlcyAhPSBudWxsICYmIHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbcHJvY2Vzc2VzLnNpemUoKV07Ci0JCQlwcm9jZXNzZXMua2V5U2V0KCkudG9BcnJheShuYW1lcyk7Ci0JCQlwcm9jZXNzQ29tYm8uc2V0SXRlbXMobmFtZXMpOwotCQkJU3RyaW5nIHNhdmVkUHJvY2VzcyA9IERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfTkFNRSk7Ci0JCQlpZiAoc2F2ZWRQcm9jZXNzICE9IG51bGwgJiYgcHJvY2Vzc2VzLmNvbnRhaW5zS2V5KHNhdmVkUHJvY2VzcykpIHsKLQkJCQlwcm9jZXNzQ29tYm8uc2V0VGV4dChzYXZlZFByb2Nlc3MpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9jZXNzQ29tYm8uc2V0VGV4dChwcm9jZXNzQ29tYm8uZ2V0SXRlbSgwKSk7Ci0JCQl9Ci0vLwkJCXVwZGF0ZUNvbnRleHRDb21ibyhnZXRQcm9jZXNzKCkpOwotCQl9IGVsc2UgewotCQkJcHJvY2Vzc0NvbWJvLnNldEl0ZW1zKEVNUFRZX0FSUkFZKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIENvbnRleHQgQ29tYm8uCi0JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZXh0Q29tYm8oUHJvY2VzcyBwcm9jZXNzKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJTWFwIGNvbnRleHRzID0gTWlncmF0aW9uVXRpbC5nZXRDb250ZXh0cyhwcm9jZXNzKTsKLS8vCQkJaWYgKGNvbnRleHRzICE9IG51bGwgJiYgY29udGV4dHMuc2l6ZSgpID4gMCkgewotLy8JCQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2NvbnRleHRzLnNpemUoKV07Ci0vLwkJCQljb250ZXh0cy5rZXlTZXQoKS50b0FycmF5KG5hbWVzKTsKLS8vCQkJCWNvbnRleHRDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0vLwkJCQlTdHJpbmcgc2F2ZWRDb250ZXh0ID0gRGlhZ3JhbW1pbmdNaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0vLwkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0vLwkJCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfQ09OVEVYVCk7Ci0vLwkJCQlpZiAoc2F2ZWRDb250ZXh0ICE9IG51bGwgJiYgY29udGV4dHMuY29udGFpbnNLZXkoc2F2ZWRDb250ZXh0KSkgewotLy8JCQkJCWNvbnRleHRDb21iby5zZXRUZXh0KHNhdmVkQ29udGV4dCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCVN0cmluZyBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKQotLy8JCQkJCQkJLmdldE5hbWUoKTsKLS8vCQkJCQljb250ZXh0Q29tYm8uc2V0VGV4dChkZWZhdWx0Q29udGV4dCk7Ci0vLwkJCQl9Ci0vLwkJCX0gZWxzZSB7Ci0vLwkJCQljb250ZXh0Q29tYm8uc2V0SXRlbXMoRU1QVFlfQVJSQVkpOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhY3Rpdml0aXR5IENvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGl2aXR5Q29tYm8oUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRyeSB7Ci0JCQlhY3Rpdml0aWVzID0gTWlncmF0aW9uVXRpbC5nZXRBY3Rpdml0aWVzKHByb2Nlc3MpOwotCQkJaWYgKGFjdGl2aXRpZXMgIT0gbnVsbCAmJiBhY3Rpdml0aWVzLnNpemUoKSA+IDApIHsKLQkJCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbYWN0aXZpdGllcy5zaXplKCldOwotCQkJCWFjdGl2aXRpZXMua2V5U2V0KCkudG9BcnJheShuYW1lcyk7Ci0JCQkJYWN0aXZpdHlDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0JCQkJLy8gU3RyaW5nIHNhdmVkQ29udGV4dCA9IFdvcmtmbG93RXhwUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS8vIC5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJLy8gV29ya2Zsb3dFeHBvcnRDb25zdGFudHMuQUNUSVZJVFlfQ09OVEVYVCk7Ci0JCQkJLy8gaWYgKHNhdmVkQ29udGV4dCAhPSBudWxsICYmCi0JCQkJLy8gY29udGV4dHMuY29udGFpbnNLZXkoc2F2ZWRDb250ZXh0KSkgewotCQkJCS8vIGFjdGl2aXR5Q29tYm8uc2V0VGV4dChzYXZlZENvbnRleHQpOwotCQkJCS8vIH0gZWxzZSB7Ci0JCQkJLy8gU3RyaW5nIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpCi0JCQkJLy8gLmdldE5hbWUoKTsKLQkJCQkvLyBhY3Rpdml0eUNvbWJvLnNldFRleHQoZGVmYXVsdENvbnRleHQpOwotCQkJCS8vIH0KLQkJCQlhY3Rpdml0eUNvbWJvLnNldFRleHQobmFtZXNbMF0pOwotCQkJfSBlbHNlIHsKLQkJCQlhY3Rpdml0eUNvbWJvLnNldEl0ZW1zKEVNUFRZX0FSUkFZKTsKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgUHJvY2Vzcy4KLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzQ29tYm8uZ2V0VGV4dCgpOwotCQkJcmV0dXJuIChQcm9jZXNzKSBjYXBhYmlsaXR5UGF0dGVybnMuZ2V0KG5hbWUpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzQ29tYm8uZ2V0VGV4dCgpOwotCQkJcmV0dXJuIChQcm9jZXNzKSBkZWxpdmVyeVByb2Nlc3Nlcy5nZXQobmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBQcm9jZXNzIGNvbnRleHQuCi0JICovCi0vLwlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NDb250ZXh0TmFtZSgpIHsKLS8vCQlyZXR1cm4gKFN0cmluZykgY29udGV4dENvbWJvLmdldFRleHQoKTsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZU5hbWUoKSB7Ci0JCXJldHVybiB0ZW1wbGF0ZU5hbWVDb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBsYXRlRGlyQ29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAocHJvY2Vzc0NvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwCi0vLwkJCQkmJiBjb250ZXh0Q29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiB0ZW1wbGF0ZU5hbWVDb21iby5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCSYmIHRlbXBsYXRlRGlyQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiBhY3Rpdml0eUNvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgewotCQlpZiAoYWN0aXZpdHlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKSB7Ci0JCQlTdHJpbmcgYWN0aXZpdHlOYW1lID0gYWN0aXZpdHlDb21iby5nZXRUZXh0KCk7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgYWN0aXZpdGllcy5nZXQoYWN0aXZpdHlOYW1lKTsKLQkJCXJldHVybiBhY3Rpdml0eTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLS8vCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbnRleHQoKSB7Ci0vLwkJaWYgKGdldFByb2Nlc3NDb250ZXh0TmFtZSgpICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCU1hcCByZXN1bHQgPSBNaWdyYXRpb25VdGlsLmdldENvbnRleHRzKGdldFByb2Nlc3MoKSk7Ci0vLwkJCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbikgcmVzdWx0LmdldChjb250ZXh0TmFtZSk7Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWRkd3BkL21hcC9Db25uZWN0aW9uRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWRkd3BkL21hcC9Db25uZWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdhMjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkZHdwZC9tYXAvQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWRkd3BkLm1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUHJlY2lzaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcC5NYXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJvdW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uSWRlbnRpdHlBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlJlbGF0aXZlQmVuZHBvaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLmRhdGF0eXBlLlJlbGF0aXZlQmVuZHBvaW50OwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBraW5kOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNQUdFX0hFSUdIVCA9IDMyOwotCi0JcHVibGljIENvbm5lY3Rpb25GYWN0b3J5KERpYWdyYW0gZGlhZ3JhbSwgSGFzaE1hcCBtYXAsIFN0cmluZyBraW5kKSB7Ci0JCXRoaXMubWFwID0gbWFwOwotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBvdXRnb2luZyBjb25uZWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgb3V0Z29pbmdDb25uZWN0aW9ucyhOb2RlIG5vZGUpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCi0JCWlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmIGNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCS8vIGNyZWF0ZSBjb25uZWN0aW9uCi0JCQkJRWRnZSBlZGdlID0gY3JlYXRlQ29ubmVjdGlvbihsaW5rKTsKLQotCQkJCS8vIGdldCBzb3VyY2Ugbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCQkJLmdldChub2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyBzb3VyY2UgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRTb3VyY2VFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBpbmNvbWluZyBjb25uZWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgaW5jb21pbmdDb25uZWN0aW9ucyhOb2RlIG5vZGUpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCi0JCWlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmIGNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCS8vIGNyZWF0ZSBlZGdlCi0JCQkJRWRnZSBlZGdlID0gY3JlYXRlQ29ubmVjdGlvbihsaW5rKTsKLQotCQkJCS8vIGdldCBzb3VyY2Ugbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCQkJLmdldChub2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyB0YXJnZXQgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRUYXJnZXRFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gZWRnZSBmb3IgdGhlIGdpdmVuIGxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgY3JlYXRlQ29ubmVjdGlvbihMaW5rIGxpbmspIHsKLQkJLy8gZ2V0IHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMgb2YgdGhlIGxpbmsKLQkJTm9kZSBzb3VyY2VPYmogPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldE9iaiA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gZ2V0IG5vdGF0aW9uIG5vZGVzCi0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCS5nZXQoc291cmNlT2JqKTsKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb3RhdGlvbk5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgbWFwCi0JCQkJLmdldCh0YXJnZXRPYmopOwotCi0JCUVkZ2UgZWRnZSA9IGZpbmRFZGdlKHNvdXJjZU5vdGF0aW9uTm9kZSwgdGFyZ2V0Tm90YXRpb25Ob2RlKTsKLQkJaWYgKGVkZ2UgPT0gbnVsbCAmJiB0YXJnZXROb3RhdGlvbk5vZGUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIG5vdGF0aW9uIGVkZ2UKLQkJCWlmIChraW5kID09IERpYWdyYW1NYW5hZ2VyLkFERF9raW5kKQotCQkJCWVkZ2UgPSBNYXBVdGlsLmNyZWF0ZUVkZ2VfV1BEKHNvdXJjZU5vdGF0aW9uTm9kZSwKLQkJCQkJCXRhcmdldE5vdGF0aW9uTm9kZSwgbGluayk7Ci0JCQllbHNlIGlmIChraW5kID09IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kKQotCQkJCWVkZ2UgPSBNYXBVdGlsLmNyZWF0ZUVkZ2VfV1BEKHNvdXJjZU5vdGF0aW9uTm9kZSwKLQkJCQkJCXRhcmdldE5vdGF0aW9uTm9kZSwgbGluayk7Ci0KLQkJCWlmIChlZGdlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCWVkZ2Uuc2V0RWxlbWVudChsaW5rKTsKLQkJCWxvYWRTb3VyY2VBbmRUYXJnZXRFbmRQb2ludChlZGdlLCBsaW5rKTsKLQkJCWxvYWRCZW5kUG9pbnRzKGVkZ2UsIGxpbmspOwotCQl9Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHNvdXJjZSBhbmQgdGFyZ2V0IGVuZCBwb2ludHMgZm9yIHN5bmNocm9uaXphdGlvbiBiYXIgYW5kIGRlY2lzaW9uCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBlZGdlCi0JICogQHBhcmFtIGZsb3cKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFNvdXJjZUFuZFRhcmdldEVuZFBvaW50KEVkZ2UgZWRnZSwgTGluayBmbG93KSB7Ci0JCVBvaW50IHNyY1BvaW50ID0gZmxvdy5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQotCQlWaWV3IHNyY1ZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQlWaWV3IHRhcmdldFZpZXcgPSBlZGdlLmdldFRhcmdldCgpOwotCi0JCWlmIChzcmNQb2ludCAhPSBudWxsCi0JCQkJJiYgc3JjVmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHsKLQkJCUJvdW5kcyBib3VuZHMgPSAoQm91bmRzKSAoKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHNyY1ZpZXcpCi0JCQkJCS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkvLyBmb3IgV1BELCBoZWlnaHQgaXMgbm90IHN0b3JlZCBhbmQgaXQncyBhbHdheXMgc2FtZS4KLQkJCS8vIFdlIGRvIG5lZWQgY29ycmVjdCBoZWlnaHQgdG8gY2FsY3VsYXRlIGlkZW50aXR5IGFuY2hvciBpbiBHTUYKLQkJCWlmIChib3VuZHMuZ2V0SGVpZ2h0KCkgPT0gLTEpCi0JCQkJYm91bmRzLnNldEhlaWdodCg0MCk7Ci0JCQlJZGVudGl0eUFuY2hvciBhbmNob3IgPSBjcmVhdGVJZGVudGl0eUFuY2hvcihzcmNQb2ludCwgYm91bmRzKTsKLQkJCWlmIChhbmNob3IgIT0gbnVsbCkKLQkJCQllZGdlLnNldFNvdXJjZUFuY2hvcihhbmNob3IpOwotCQl9Ci0KLQkJaWYgKHRhcmdldFBvaW50ICE9IG51bGwKLQkJCQkmJiB0YXJnZXRWaWV3IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgewotCQkJQm91bmRzIGJvdW5kcyA9IChCb3VuZHMpICgob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgdGFyZ2V0VmlldykKLQkJCQkJLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCS8vIEZvciBXUEQsIGhlaWdodCBpcyBub3Qgc3RvcmVkIGFuZCBpdCdzIGFsd2F5cyBzYW1lLgotCQkJLy8gV2UgZG8gbmVlZCBjb3JyZWN0IGhlaWdodCB0byBjYWxjdWxhdGUgaWRlbnRpdHkgYW5jaG9yIGluIEdNRgotCQkJaWYgKGJvdW5kcy5nZXRIZWlnaHQoKSA9PSAtMSkKLQkJCQlib3VuZHMuc2V0SGVpZ2h0KDQwKTsKLQkJCUlkZW50aXR5QW5jaG9yIGFuY2hvciA9IGNyZWF0ZUlkZW50aXR5QW5jaG9yKHRhcmdldFBvaW50LCBib3VuZHMpOwotCQkJaWYgKGFuY2hvciAhPSBudWxsKQotCQkJCWVkZ2Uuc2V0VGFyZ2V0QW5jaG9yKGFuY2hvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgaWRlbnRpdHkgYW5jaG9yCi0JICogCi0JICogQHBhcmFtIHBvaW50Ci0JICogQHBhcmFtIGJvdW5kcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElkZW50aXR5QW5jaG9yIGNyZWF0ZUlkZW50aXR5QW5jaG9yKFBvaW50IHBvaW50LCBCb3VuZHMgYm91bmRzKSB7Ci0JCVByZWNpc2lvblBvaW50IHByZVBvaW50ID0gTWFwVXRpbC5nZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKHBvaW50LAotCQkJCWJvdW5kcyk7Ci0JCVN0cmluZyBpZCA9IE1hcFV0aWwuY29tcG9zZVRlcm1pbmFsU3RyaW5nKHByZVBvaW50KTsKLQotCQlJZGVudGl0eUFuY2hvciB2YWx1ZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpdHlBbmNob3IoKTsKLQkJdmFsdWUuc2V0SWQoaWQpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHJlbGF0aXZlIGJlbmQgcG9pbnRzCi0JICogCi0JICogQHBhcmFtIGVkZ2UKLQkgKiBAcGFyYW0gZmxvdwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQmVuZFBvaW50cyhFZGdlIGVkZ2UsIExpbmsgZmxvdykgewotCQlMaXN0IGxpc3QgPSBmbG93LmdldEJlbmRwb2ludHMoKTsKLQkJTGlzdDxSZWxhdGl2ZUJlbmRwb2ludD4gcmVsYXRpdmVQb2ludHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0aXZlQmVuZHBvaW50PigpOwotCi0JCVJlbGF0aXZlQmVuZHBvaW50IHJicCA9IG5ldyBSZWxhdGl2ZUJlbmRwb2ludCgwLCAwLCAwLCAwKTsKLQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBhYnAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc3JjTm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBlZGdlCi0JCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGVkZ2UKLQkJCQkJCS5nZXRUYXJnZXQoKTsKLQotCQkJCUJvdW5kcyBzb3VyY2VCb3VuZHMgPSAoQm91bmRzKSBzcmNOb2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQlCb3VuZHMgdGFyZ2V0Qm91bmRzID0gKEJvdW5kcykgdGFyZ2V0Tm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0KLQkJCQlpbnQgc3JjTGluZSA9IE1hcFV0aWwuZ2V0Tm9PZkxpbmVzKHNyY05vZGUpOwotCQkJCWludCB0YXJnZXRMaW5lID0gTWFwVXRpbC5nZXROb09mTGluZXModGFyZ2V0Tm9kZSk7Ci0JCQkJaW50IHNyY0hlaWdodCA9IE1hcFV0aWwuZ2V0VGV4dEhlaWdodChzcmNOb2RlKTsKLQkJCQlpbnQgdGFyZ2V0SGVpZ2h0ID0gTWFwVXRpbC5nZXRUZXh0SGVpZ2h0KHRhcmdldE5vZGUpOwotCi0JCQkJaW50IHNyY1ggPSBzb3VyY2VCb3VuZHMuZ2V0WCgpICsgc291cmNlQm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCBzcmNZID0gc291cmNlQm91bmRzLmdldFkoKQotCQkJCQkJKyAoSU1BR0VfSEVJR0hUICsgKHNyY0xpbmUgKiBzcmNIZWlnaHQpKSAvIDI7Ci0JCQkJaW50IHRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCB0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKQotCQkJCQkJKyAoSU1BR0VfSEVJR0hUICsgKHRhcmdldExpbmUgKiB0YXJnZXRIZWlnaHQpKSAvIDI7Ci0KLQkJCQlpbnQgcmVsMSA9IGFicC54IC0gc3JjWDsKLQkJCQlpbnQgcmVsMiA9IGFicC55IC0gc3JjWTsKLQkJCQlpbnQgcmVsMyA9IGFicC54IC0gdGFyWDsKLQkJCQlpbnQgcmVsNCA9IGFicC55IC0gdGFyWTsKLQotCQkJCVJlbGF0aXZlQmVuZHBvaW50IHJicDEgPSBuZXcgUmVsYXRpdmVCZW5kcG9pbnQocmVsMSwgcmVsMiwKLQkJCQkJCXJlbDMsIHJlbDQpOwotCQkJCXJlbGF0aXZlUG9pbnRzLmFkZChyYnAxKTsKLQkJCX0KLQkJfQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQotCQlpZiAocmVsYXRpdmVQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJUmVsYXRpdmVCZW5kcG9pbnRzIGJlbmRwb2ludHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVSZWxhdGl2ZUJlbmRwb2ludHMoKTsKLQkJCWJlbmRwb2ludHMuc2V0UG9pbnRzKHJlbGF0aXZlUG9pbnRzKTsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kcG9pbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgZWRnZSBpbiBkaWFncmFtIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzCi0JICogCi0JICogQHBhcmFtIHNvdXJjZU5vZGUKLQkgKiBAcGFyYW0gdGFyZ2V0Tm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgZmluZEVkZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb2RlLAotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IGRpYWdyYW0uZ2V0RWRnZXMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICgoZWRnZS5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJCQkJJiYgdGFyZ2V0Tm9kZS5lcXVhbHMoZWRnZS5nZXRUYXJnZXQoKSkKLQkJCQkJCSYmIChlZGdlLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQkJCQkmJiBzb3VyY2VOb2RlLmVxdWFscyhlZGdlLmdldFNvdXJjZSgpKSkgewotCQkJCQlyZXR1cm4gZWRnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS91dGlsL01pZ3JhdGlvblV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGUyZDcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciB0aGUgTWlncmF0aW9uIFNlcnZpY2UuCi0gKgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGFuZCA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICogaW4gdGhlIGN1cnJlbnQgTWV0aG9kIExpYnJhcnkuCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbilpLm5leHQoKTsKLQkJCVN0cmluZyBjYXBhYmlsaXR5UGF0dGVyblBhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwgY2FwYWJpbGl0eVBhdHRlcm5QYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0JCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSltZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlICA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4paS5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgY29udGV4dHMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzcy4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24paS5uZXh0KCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnB1dChjb250ZXh0LmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1hcCBvZiBhbGwgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGluIGEgZ2l2ZW4gPGNvZGU+UHJvY2Vzc1BhY2thZ2U8L2NvZGU+LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLCBNYXAgcmVzdWx0KSB7Ci0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KW9iajsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgID0gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSlvYmosIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBtYXAgb2YgYWxsIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4gaW4gYSBnaXZlbiA8Y29kZT5Qcm9jZXNzUGFja2FnZTwvY29kZT4uCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXREZWxpdmVyeVByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwgTWFwIHJlc3VsdCkgewotCQlMaXN0IGNoaWxkUGFja2FnZXMgPSBwcm9jZXNzUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudClvYmo7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzICA9IHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2Upb2JqLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEFjdGl2aXRpZXMoUHJvY2VzcyBwcm9jZXNzKXsKLQkJcmV0dXJuIGdldEFjdGl2aXRpZXMocHJvY2VzcywgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRBY3Rpdml0aWVzKFByb2Nlc3MgcHJvY2VzcywgYm9vbGVhbiBsaW5rZWRIYXNoTWFwKXsKLQkJTWFwIHJlc3VsdCA9IGxpbmtlZEhhc2hNYXAgPyBuZXcgTGlua2VkSGFzaE1hcCgpIDogbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihkZWZhdWx0Q29udGV4dCk7Ci0JCWdldEFjdGl2aXRpZXMocHJvY2VzcywgcmVzdWx0LCBmaWx0ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmV0dXJucyBMaXN0IG9mIGFjdGl2aXRpZXMgKHJlY3Vyc2l2ZWx5KSBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9uIAotCSAqIHVuZGVyIGEgUHJvY2VzcyAoPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBvciA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4pLiAgCi0JICogIEBwYXJhbSBBY3Rpdml0eQotCSAqICBAcGFyYW0gTWFwCi0JICogIEBwYXJhbSBQcm9jZXNzQ29uZmlndXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldEFjdGl2aXRpZXMoQWN0aXZpdHkgcHJvY2VzcywgTWFwIHJlc3VsdCwgUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIpewotCQlyZXN1bHQucHV0KHByb2Nlc3MuZ2V0TmFtZSgpLCBwcm9jZXNzKTsKLQkJTGlzdCBsaXN0ID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlpZihsaXN0LnNpemUoKSA+IDApewotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJaWYoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChvYmplY3QpKXsKLQkJCQkJCXJlc3VsdC5wdXQoKChBY3Rpdml0eSlvYmplY3QpLmdldE5hbWUoKSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlnZXRBY3Rpdml0aWVzKChBY3Rpdml0eSlvYmplY3QsIHJlc3VsdCwgZmlsdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzlmNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFjYzAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LAotIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gY29tLmlibS5pY3UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NGVmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBtb2RlbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL01TX1Byb2plY3RfMjAwMy5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ2ZjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QiIG1vZGVsTmFtZT0iTVNfUHJvamVjdF8yMDAzIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS54c2QuZWNvcmUuaW1wb3J0ZXIiPgotICA8Zm9yZWlnbk1vZGVsPmZpbGU6L0M6L0VjbGlwc2UzMTEvTVNfUHJvamVjdF8yMDAzLnhzZDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNc3Byb2plY3QiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIHJlc291cmNlPSJYTUwiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBsb2FkSW5pdGlhbGl6YXRpb249InRydWUiIGVjb3JlUGFja2FnZT0ibXNwcm9qZWN0LmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQWNjcnVlQXQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0FjdGl2ZURpcmVjdG9yeUdVSURUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9BbGlhc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0F1dGhvclR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Cb29raW5nVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Jvb2tpbmdUeXBlVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NhbGN1bGF0aW9uVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NhdGVnb3J5VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29kZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvbXBhbnlUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db25zdHJhaW50VHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvbnRhY3RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db3N0UmF0ZVRhYmxlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0N1cnJlbmN5U3ltYm9sVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGF5VHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0RlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0RlZmF1bHRUYXNrVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0R1cmF0aW9uRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlNCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlNSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FbWFpbEFkZHJlc3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRml4ZWRDb3N0QWNjcnVhbFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0ZZU3RhcnREYXRlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vR3JvdXBUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1R5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Jbml0aWFsc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0xhZ0Zvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL01hbmFnZXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9NYXRlcmlhbExhYmVsVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05hbWVUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OYW1lVHlwZTMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05ld1Rhc2tTdGFydERhdGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OVEFjY291bnRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lTnVtYmVyVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1Bob25ldGljQWxpYXNUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9QaG9uZXRpY3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9QcmVmaXhUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9SYXRlVGFibGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Sb2xsdXBUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1N1YmplY3RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9TdWJwcm9qZWN0TmFtZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1RpdGxlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlNCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGU1Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9VSURUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Vbml0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVsaXN0U29ydE9yZGVyVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV2Vla1N0YXJ0RGF5VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya0NvbnRvdXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JrRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya0dyb3VwVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC90YXNrVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXNvdXJjZVVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbFdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2NvbmZpcm1lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdFJhdGVUYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jViIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZGVsYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZmluaXNoVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2h5cGVybGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29ya1ZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9oYXNGaXhlZFJhdGVVbml0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZml4ZWRNYXRlcmlhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGV2ZWxpbmdEZWxheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGlua2VkRmllbGRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9taWxlc3RvbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L25vdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9vdmVyYWxsb2NhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9vdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L292ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVndWxhcldvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ0Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZW1haW5pbmdXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXNwb25zZVBlbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9zdG9wIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXN1bWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3N0YXJ0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3VuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC91cGRhdGVOZWVkZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3ZBQyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29ya0NvbnRvdXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2JDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2Jvb2tpbmdUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2NyZWF0aW9uRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2V4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYmFzZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC90aW1lcGhhc2VkRGF0YSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50cyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnRzL2Fzc2lnbm1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2QvYXZhaWxhYmxlRnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZC9hdmFpbGFibGVUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZC9hdmFpbGFibGVVbml0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2RzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kcy9hdmFpbGFiaWxpdHlQZXJpb2QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS90aW1lcGhhc2VkRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL251bWJlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2ludGVyaW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2R1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9lc3RpbWF0ZWREdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2JDV1AiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvbnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL2JDV1AiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL251bWJlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvYkNXUCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL2lzQmFzZUNhbGVuZGFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvYmFzZUNhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL3dlZWtEYXlzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFycyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFycy9jYWxlbmRhciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWl4ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRG9jdW1lbnRSb290L3hNTE5TUHJlZml4TWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdC94U0lTY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QvcHJvamVjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2ZpZWxkTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvcGhvbmV0aWNBbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3JvbGx1cFR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9jYWxjdWxhdGlvblR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9mb3JtdWxhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvcmVzdHJpY3RWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS92YWx1ZWxpc3RTb3J0T3JkZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9hcHBlbmROZXdWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9kZWZhdWx0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3ZhbHVlTGlzdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi92YWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMy9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3ZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0L2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC9kdXJhdGlvbkZvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZXMvZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vTWFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay9sZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL01hc2svdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL01hc2svbGVuZ3RoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay9zZXBhcmF0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vTWFza3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrcy9tYXNrIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvZmllbGROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvYWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9waG9uZXRpY0FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL3ZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2VudGVycHJpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9lbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL3Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2xlYWZPbmx5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvYWxsTGV2ZWxzUmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9vbmx5VGFibGVWYWx1ZXNBbGxvd2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL21hc2tzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMi9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyL3ZhbHVlSUQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUzL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMvdmFsdWVJRCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZXMvb3V0bGluZUNvZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvcHJlZGVjZXNzb3JVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9jcm9zc1Byb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvY3Jvc3NQcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9saW5rTGFnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL2xhZ0Zvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvdGl0bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N1YmplY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jb21wYW55Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tYW5hZ2VyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRob3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NyZWF0aW9uRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcmV2aXNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2xhc3RTYXZlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc2NoZWR1bGVGcm9tU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZllTdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NyaXRpY2FsU2xhY2tMaW1pdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3VycmVuY3lEaWdpdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbmN5U3ltYm9sIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jdXJyZW5jeVN5bWJvbFBvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jYWxlbmRhclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFN0YXJ0VGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdEZpbmlzaFRpbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21pbnV0ZXNQZXJEYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21pbnV0ZXNQZXJXZWVrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kYXlzUGVyTW9udGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRUYXNrVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRTdGFuZGFyZFJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRPdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC93b3JrRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9lZGl0YWJsZUFjdHVhbENvc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9ob25vckNvbnN0cmFpbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9lYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tdWx0aXBsZUNyaXRpY2FsUGF0aHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L25ld1Rhc2tzRWZmb3J0RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9uZXdUYXNrc0VzdGltYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zcHJlYWRBY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zcHJlYWRQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Rhc2tVcGRhdGVzUmVzb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Zpc2NhbFllYXJTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvd2Vla1N0YXJ0RGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlQ29tcGxldGVkRW5kc0JhY2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21vdmVSZW1haW5pbmdTdGFydHNCYWNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9iYXNlbGluZUZvckVhcm5lZFZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N0YXR1c0RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9taWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmV3VGFza1N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFRhc2tFVk1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2V4dGVuZGVkQ3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hY3R1YWxzSW5TeW5jIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9yZW1vdmVGaWxlUHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYWRtaW5Qcm9qZWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvb3V0bGluZUNvZGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvd0JTTWFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9leHRlbmRlZEF0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jYWxlbmRhcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC90YXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Jlc291cmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Fzc2lnbm1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1JhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvcmF0ZXNGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9yYXRlc1RvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9yYXRlVGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3N0YW5kYXJkUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvc3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9vdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL292ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvY29zdFBlclVzZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9SYXRlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1JhdGVzL3JhdGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pc051bGwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pbml0aWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3Bob25ldGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL25UQWNjb3VudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL21hdGVyaWFsTGFiZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS93b3JrR3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9lbWFpbEFkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9oeXBlcmxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9oeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL21heFVuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcGVha1VuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3ZlckFsbG9jYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2F2YWlsYWJsZUZyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hdmFpbGFibGVUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY2FuTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY2NydWVBdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZWd1bGFyV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbFdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YW5kYXJkUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb3N0UGVyVXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlbWFpbmluZ0Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS93b3JrVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb3N0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9zViIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYUNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvbm90ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYkNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzR2VuZXJpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzSW5hY3RpdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pc0VudGVycHJpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9ib29raW5nVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3RpdmVEaXJlY3RvcnlHVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2V4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Jhc2VsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL291dGxpbmVDb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2F2YWlsYWJpbGl0eVBlcmlvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvdGltZXBoYXNlZERhdGEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2VzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2VzL3Jlc291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaXNOdWxsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jcmVhdGVEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jb250YWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay93QlMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dCU0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdXRsaW5lTnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdXRsaW5lTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByaW9yaXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9kdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N0b3AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3Jlc3VtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVzdW1lVmFsaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2VmZm9ydERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVjdXJyaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdmVyQWxsb2NhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lc3RpbWF0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL21pbGVzdG9uZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3VtbWFyeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY3JpdGljYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lzU3VicHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaXNTdWJwcm9qZWN0UmVhZE9ubHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N1YnByb2plY3ROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9leHRlcm5hbFRhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2V4dGVybmFsVGFza1Byb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Vhcmx5U3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Vhcmx5RmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sYXRlU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xhdGVGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N0YXJ0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay93b3JrVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZyZWVTbGFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdG90YWxTbGFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZml4ZWRDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9maXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wZXJjZW50Q29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3BlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL292ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxEdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlZ3VsYXJXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jb25zdHJhaW50VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY2FsZW5kYXJVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NvbnN0cmFpbnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9kZWFkbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxBc3NpZ25tZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdDYW5TcGxpdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdEZWxheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcHJlTGV2ZWxlZFN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wcmVMZXZlbGVkRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9oeXBlcmxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2h5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2h5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lnbm9yZVJlc291cmNlQ2FsZW5kYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL25vdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9oaWRlQmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yb2xsdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2JDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3BoeXNpY2FsUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByZWRlY2Vzc29yTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9iYXNlbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL291dGxpbmVDb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdGltZXBoYXNlZERhdGEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVGFza3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrcy90YXNrIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1RpbWVQZXJpb2QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVQZXJpb2QvZnJvbURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lUGVyaW9kL3RvRGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvdW5pdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL3BhcmVudFZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZS92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL2Rlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL2lEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL2Rlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlTGlzdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlTGlzdC92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZXMvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVzL3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dCU01hc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svbGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrL2xlbmd0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svc2VwYXJhdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy92ZXJpZnlVbmlxdWVDb2RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzL2dlbmVyYXRlQ29kZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3Mvd0JTTWFzayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L2RheVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L2RheVdvcmtpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheS90aW1lUGVyaW9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkvd29ya2luZ1RpbWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXlzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheXMvd2Vla0RheSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWUvZnJvbVRpbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZS90b1RpbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWVzL3dvcmtpbmdUaW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvbXNwcm9qZWN0LmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9tc3Byb2plY3QuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWJkMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9tc3Byb2plY3QuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1NTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1zcHJvamVjdCIKLSAgICBuc1VSST0iaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiIG5zUHJlZml4PSJtc3Byb2plY3QiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZ1bGwgcHJvamVjdCBzY2hlbWEgZGVmaW5pdGlvbiBmcm9tIHRoZSBwcm9qZWN0IGxldmVsIGRvd24sICYjeEQ7JiN4QTsmI3g5OyYjeDk7c3RhcnRpbmcgd2l0aCBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUFubm90YXRpb25zPgotICAgIDxkZXRhaWxzIGtleT0iYXBwaW5mbyIgdmFsdWU9IlRoZSBNaWNyb3NvZnQgUHJvamVjdCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSBmb3IgTWljcm9zb2Z0IFByb2plY3QgMTAuJiN4RDsmI3hBOyYjeDk7JiN4OTsiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWNjcnVlQXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY2NydWVBdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjdGl2ZURpcmVjdG9yeUdVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3RpdmVEaXJlY3RvcnlHVUlEXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMTYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFzc2lnbm1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHdvcmsgY29tcGxldGVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGFtb3VudCBvZiB3b3JrIGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmZpcm1lZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgUmVzb3VyY2UgaGFzIGFjY2VwdGVkIGFsbCBvZiBoaXMgb3IgaGVyIGFzc2lnbm1lbnRzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmZpcm1lZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RSYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db3N0UmF0ZVRhYmxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHJhdGUgdGFibGUgdXNlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvc3QgYW5kIGJhc2VsaW5lIGNvc3QgZm9yIGEgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGF5IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IHRoYXQgdGhlIGFzc2lnbm1lbnQgaXMgZGVsYXllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBmaW5pc2ggZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2hWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiBhc3NpZ25tZW50IHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNGaXhlZFJhdGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgVW5pdHMgYXJlIEZpeGVkIFJhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSGFzRml4ZWRSYXRlVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZE1hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjb25zdW1wdGlvbiBvZiB0aGUgYXNzaWduZWQgbWF0ZXJpYWwgcmVzb3VyY2Ugb2NjdXJzIGluIGEgc2luZ2xlLCBmaXhlZCBhbW91bnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIDIxPW51bGwsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rZWRGaWVsZHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFByb2plY3QgaXMgbGlua2VkIHRvIGFub3RoZXIgT0xFIG9iamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rZWRGaWVsZHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxlc3RvbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGFzc2lnbm1lbnQgaXMgYSBtaWxlc3RvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyYWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIG92ZXJhbGxvY2F0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcmFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2VQZW5kaW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIGEgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGZvciBhIFRlYW1Bc3NpZ24gbWVzc2FnZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzcG9uc2VQZW5kaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdG9wIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgc3RvcHBlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdG9wIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBzdGFydCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXRzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB1bml0cyBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cGRhdGVOZWVkZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRydWUgaWYgdGhlIHJlc291cmNlIGFzc2lnbmVkIHRvIGEgdGFzayBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVXBkYXRlTmVlZGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idkFDIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNsaW5lIGNvc3QgYW5kIHRvdGFsIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVkFDIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrQ29udG91ciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtDb250b3VyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGNvbnRvdXIgb2YgdGhlIGFzc2lnbm1lbnQuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GbGF0LCAxPUJhY2sgTG9hZGVkLCAyPUZyb250IExvYWRlZCwgMz1Eb3VibGUgUGVhaywgND1FYXJseSBQZWFrLCA1PUxhdGUgUGVhaywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICA2PUJlbGwsIDc9VHVydGxlLCA4PUNvbnRvdXJlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSBhc3NpZ25tZW50LiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFzc2lnbm1lbnRzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaWdubWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Bc3NpZ25tZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYXNzaWdubWVudCBpbiBlYWNoIEFzc2lnbm1lbnRzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkF1dGhvclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dGhvcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdmFpbGFiaWxpdHlQZXJpb2QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGJlY29tZXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVVuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGR1cmluZyB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdmFpbGFiaWxpdHlQZXJpb2RzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZHNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdmFpbGFiaWxpdHlQZXJpb2QiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXZhaWxhYmlsaXR5UGVyaW9kIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmlvZCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayBiYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50ZXJpbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhpcyBpcyBhbiBJbnRlcmltIEJhc2VsaW5lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnRlcmltIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrIGJhc2VsaW5lLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZWREdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYmFzZWxpbmUgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2FzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCB3b3JrIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBhc3NpZ25lZCB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgaXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBjb3N0IGZvciB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZTMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrIHNjaGVkdWxlZCBvbiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHByb2plY3RlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lRm9yRWFybmVkVmFsdWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2tpbmdUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2tpbmdUeXBlVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2FsY3VsYXRpb25UeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0Jhc2VDYWxlbmRhciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgYSBiYXNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0Jhc2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VDYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGNhbGVuZGFyICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHRoaXMgY2FsZW5kYXIgZGVwZW5kcy4gT25seSBhcHBsaWNhYmxlIGlmIHRoZSBjYWxlbmRhciBpcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBiYXNlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5cyIgZVR5cGU9IiMvL1dlZWtEYXlzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgV2Vla2RheXMgdGhhdCBkZWZpbmVzIHRoaXMgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FsZW5kYXJzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhbGVuZGFyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FsZW5kYXJzIGFyZSB1c2VkIHRvIGRlZmluZSBzdGFuZGFyZCB3b3JraW5nIGFuZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBub24td29ya2luZyB0aW1lcy4gUHJvamVjdHMgbXVzdCBoYXZlIG9uZSBiYXNlIGNhbGVuZGFyLiBUYXNrcyBhbmQgcmVzb3VyY2VzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIG1heSBoYXZlIHRoZWlyIG93biBub24tYmFzZSBjYWxlbmRhcnMgd2hpY2ggYXJlIGJhc2VkIG9uIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDYXRlZ29yeVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3J5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvZGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb2RlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbXBhbnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wYW55Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbnN0cmFpbnRUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnRUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbnRhY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvc3RSYXRlVGFibGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb25fLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkN1cnJlbmN5U3ltYm9sVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIyMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXlUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvY3VtZW50Um9vdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Im1peGVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1peGVkIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudFdpbGRjYXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjptaXhlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4TUxOU1ByZWZpeE1hcCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4bWxuczpwcmVmaXgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieFNJU2NoZW1hTG9jYXRpb24iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieHNpOnNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2plY3QiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vUHJvamVjdCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVhcm5lZFZhbHVlTWV0aG9kVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVhcm5lZFZhbHVlTWV0aG9kVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRW1haWxBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW1haWxBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGZpZWxkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGlhcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNBbGlhcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljQWxpYXNUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gZmllbGQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGx1cFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xsdXBUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyByb2xsdXBzIGFyZSBjYWxjdWxhdGVkLiBWYWx1ZXMgYXJlOiAwPU1heGltdW0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9SIGZvciBmbGFnIGZpZWxkcyksIDE9TWluaW11bSAoQU5EIGZvciBmbGFnIGZpZWxkcyksIDI9Q291bnQgYWxsLCAzPVN1bSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1BdmVyYWdlLCA1PUF2ZXJhZ2UgRmlyc3QgU3VibGV2ZWwsIDY9Q291bnQgRmlyc3QgU3VibGV2ZWwsIDc9Q291bnQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uc3VtbWFyaWVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cFR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxjdWxhdGlvblR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DYWxjdWxhdGlvblR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciByb2xsdXBzIGFyZSBjYWxjdWxhdGVkIGZvciB0YXNrIGFuZCBncm91cCBzdW1tYXJ5IHJvd3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Tm9uZSwgMT1Sb2xsdXAsIDI9Q2FsY3VsYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsY3VsYXRpb25UeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZm9ybXVsYSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybXVsYSB0aGF0IE1pY3Jvc29mdCBQcm9qZWN0IHVzZXMgdG8gcG9wdWxhdGUgdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSB0YXNrIGZpZWxkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGb3JtdWxhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdHJpY3RWYWx1ZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIFJlc3RyaWN0VmFsdWVzPVRydWUgdGhlbiBvbmx5IHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCBpbiB0aGUgZmlsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN0cmljdFZhbHVlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlbGlzdFNvcnRPcmRlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlbGlzdFNvcnRPcmRlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgdmFsdWUgbGlzdHMgYXJlIHNvcnRlZC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1EZXNjZW5kaW5nLCAxPUFzY2VuZGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZWxpc3RTb3J0T3JkZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBlbmROZXdWYWx1ZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIEFwcGVuZE5ld1ZhbHVlcz1UcnVlIHRoZW4gYW55IG5ldyB2YWx1ZXMgYWRkZWQgaW4gYSBwcm9qZWN0ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcHBlbmROZXdWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcG9pbnRzIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBsaXN0LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgcHJlc2VudCBpZiBubyBkZWZhdWx0IGlzIHNldC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlTGlzdCIgZVR5cGU9IiMvL1ZhbHVlTGlzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZW4gdmFsdWVzIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEsIHRoZXkgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgYnkgdmFsdWVzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGJ5IHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LiAgQXBwbGljYXRpb25zIG1heSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgb3JkZXJpbmcgb2YgdGhlIGxpc3QgYnkgb3JkZXJpbmcgc3BlY2lmaWVkIGhlcmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlTGlzdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGRlZmluaXRpb24gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4gIFRoZXJlIGFyZSBubyBsaW1pdHMgdG8gdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IG1heSBhcHBlYXIsIGJ1dCBwcm9qZWN0ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSB1bmRlcnN0YW5kIEZsYWcxLUZsYWcxMCwgZXRjLiAgVGhpcyBtdXN0IGFwcGVhciBvbmNlIGluIGVhY2ggRXh0ZW5kZWRBdHRyaWJ1dGVzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFza1Byb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRml4ZWRDb3N0QWNjcnVhbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdEFjY3J1YWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZZU3RhcnREYXRlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZZU3RhcnREYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iR3JvdXBUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua0FkZHJlc3NUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbml0aWFsc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluaXRpYWxzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxhZ0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hbmFnZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYW5hZ2VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlNSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIG1hc2suIFZhbHVlcyBhcmU6IDA9TnVtYmVycywgMT1VcHBlciBDYXNlIExldHRlcnMsIDI9TG93ZXIgQ2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZXMuICBJZiBsZW5ndGggaXMgYW55LCB0aGUgdmFsdWUgaXMgemVyby4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVuZ3RoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VwYXJhdG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXBhcmF0b3IgdmFsdWUgb2YgdGhlIGNvZGUgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZXBhcmF0b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hc2siIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWFzayIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3VyIGVsZW1lbnRzIG9mIHRoZSBtYXNrIGNvbnN0aXR1dGUgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgb3V0bGluZSBjb2RlIG11c3QgYXBwZWFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTWF0ZXJpYWxMYWJlbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hdGVyaWFsTGFiZWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIyNTUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmV3VGFza1N0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrU3RhcnREYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5UQWNjb3VudFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29yZXNwb25kcyB0byB0aGUgZmllbGQgbnVtYmVyIG9mIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWVzIiBlVHlwZT0iIy8vVmFsdWVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlcyBvZiB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRlcnByaXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBpcyBhbiBlbnRlcnByaXNlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW5vdGhlciBjdXN0b20gZmllbGQgZm9yIHdoaWNoIHRoaXMgaXMgYW4gYWxpYXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGNhbiBiZSB1c2VkIGJ5IHRoZSBSZXNvdXJjZSBTdWJzdGl0dXRpb24gV2l6YXJkIGluIE1pY3Jvc29mdCBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZWFmT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBvciBub3QgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGlzIG91dGxpbmUgY29kZSBmaWVsZCBtdXN0IGJlIGxlYWYgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZWFmT25seSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsbExldmVsc1JlcXVpcmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJOZXcgY29kZXMgbXVzdCBoYXZlIGFsbCBsZXZlbHMgcHJlc2VudC4gIE5vdCBhdmFpbGFibGUgZm9yIEVudGVycHJpc2UgQ29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsbExldmVsc1JlcXVpcmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib25seVRhYmxlVmFsdWVzQWxsb3dlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB2YWx1ZXMgc3BlY2lmaWVkIG11c3QgY29tZSBmcm9tIHZhbHVlcyB0YWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT25seVRhYmxlVmFsdWVzQWxsb3dlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hc2tzIiBlVHlwZT0iIy8vTWFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gaW4gdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2Rlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluZGl2aWR1YWwgb3V0bGluZSBjb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdXRsaW5lTnVtYmVyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdmVydGltZVJhdGVGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNBbGlhc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQaG9uZXRpY3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJlZGVjZXNzb3JMaW5rIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yTGlua18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWRlY2Vzc29yVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByZWRlY2Vzc29yIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaW5rIHR5cGUuICBWYWx1ZXMgYXJlIDA9RkYsIDE9RlMsIDI9U0YgYW5kIDM9U1MmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyb3NzUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJlZGVjZXNzb3IgaXMgcGFydCBvZiBhbm90aGVyIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyb3NzUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyb3NzUHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4dGVybmFsIHByZWRlY2Vzc29yIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyb3NzUHJvamVjdE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rTGFnIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGxhZyBpbiB0ZW50aHMgb2YgYSBtaW51dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxpbmtMYWciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYWdGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MYWdGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgbGFnIGZvcm1hdC4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhZ0Zvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlByZWZpeFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2plY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1VJRFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aXRsZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1RpdGxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJqZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3ViamVjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3ViamVjdCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGVnb3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2F0ZWdvcnlUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNhdGVnb3J5IG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbXBhbnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db21wYW55VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb21wYW55IHRoYXQgb3ducyB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmFnZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYW5hZ2VyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYW5hZ2VyIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYW5hZ2VyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQXV0aG9yVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhdXRob3Igb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dGhvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldmlzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvamVjdCBoYXMgYmVlbiBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV2aXNpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXN0U2F2ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBsYXN0IHNhdmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXN0U2F2ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlZHVsZUZyb21TdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBpcyBzY2hkdWxlZCBmcm9tIHRoZSBzdGFydCBkYXRlIG9yIGZpbmlzaCBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NoZWR1bGVGcm9tU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcHJvamVjdC4gUmVxdWlyZWQgaWYgU2NoZWR1bGVGcm9tU3RhcnQgaXMgdHJ1ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIGZhbHNlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZZU3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRllTdGFydERhdGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRmlzY2FsIFllYXIgc3RhcnRpbmcgbW9udGguIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPUphbnVhcnksIDI9RmVicnVhcnksIDM9TWFyY2gsIDQ9QXByaWwsIDU9TWF5LCA2PUp1bmUsIDc9SnVseSwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5Ozg9QXVndXN0LCA5PVNlcHRlbWJlciwgMTA9T2N0b2JlciwgMTE9Tm92ZW1iZXIsIDEyPURlY2VtYmVyICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyaXRpY2FsU2xhY2tMaW1pdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBhc3QgaXRzIGVuZCBkYXRlIHRoYXQgYSB0YXNrIGNhbiBnbyAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIE1pY3Jvc29mdCBQcm9qZWN0IG1hcmtzIHRoYXQgdGFzayBhcyBhIGNyaXRpY2FsIHRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyaXRpY2FsU2xhY2tMaW1pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5RGlnaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBzeW1ib2wuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5RGlnaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lTeW1ib2wiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY3VycmVuY3kgc3ltYm9sIHVzZWQgaW4gdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lTeW1ib2xQb3NpdGlvbiIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0N1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW5jeSBzeW1ib2wuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1CZWZvcmUsIDE9QWZ0ZXIsIDI9QmVmb3JlIFdpdGggU3BhY2UsIDM9QWZ0ZXIgd2l0aCBzcGFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBjYWxlbmRhci4gIFJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O0NhbGVuZGFycyBlbGVtZW50IG9mIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRTdGFydFRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IHRpbWUgb2YgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0U3RhcnRUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdEZpbmlzaFRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZpbmlzaCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpbmlzaFRpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyRGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIGRheS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWludXRlc1BlckRheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbnV0ZXNQZXJXZWVrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIHdlZWsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJXZWVrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5c1Blck1vbnRoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRheXMgcGVyIG1vbnRoLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlzUGVyTW9udGgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VGFza1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza1R5cGVUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgdHlwZSBvZiBuZXcgdGFza3MuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaXhlZENvc3RBY2NydWFsIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZnJvbSB3aGVyZSBmaXhlZCBjb3N0cyBhcmUgYWNjcnVlZC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPVN0YXJ0LCAyPVByb3JhdGVkLCAzPUVuZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRTdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFuZGFyZCByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0U3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdE92ZXJ0aW1lUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IG92ZXJ0aW1lIHJhdGUgZm9yIG5ldyByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7NTM9bnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0Zvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCB3b3JrIHVuaXQgZm9ybWF0LiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlZGl0YWJsZUFjdHVhbENvc3RzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBvciBub3QgYWN0dWFsIGNvc3RzIGFyZSBlZGl0YWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWRpdGFibGVBY3R1YWxDb3N0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvbm9yQ29uc3RyYWludHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGFza3MgaG9ub3VyIHRoZWlyIGNvbnN0cmFpbnQgZGF0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhvbm9yQ29uc3RyYWludHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGNhbGN1bGF0ZSBzdWJ0YXNrcyBhcyBzdW1tYXJ5IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtdWx0aXBsZUNyaXRpY2FsUGF0aHMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG11bHRpcGxlIGNyaXRpY2FsIHBhdGhzIGFyZSBjYWxjdWxhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNdWx0aXBsZUNyaXRpY2FsUGF0aHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXdUYXNrc0VmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBuZXcgdGFza3MgYXJlIGVmZm9ydCBkcml2ZW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tzRWZmb3J0RHJpdmVuIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFc3RpbWF0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gc2hvdyB0aGUgZXN0aW1hdGVkIGR1cmF0aW9uIGJ5IGRlZmF1bHQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tzRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGluLXByb2dyZXNzIHRhc2tzIGNhbiBiZSBzcGxpdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkQWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBhY3R1YWwgY29zdHMgYXJlIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZEFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcHJlYWRQZXJjZW50Q29tcGxldGUiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHBlcmNlbnQgY29tcGxldGUgaXMgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ByZWFkUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFza1VwZGF0ZXNSZXNvdXJjZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB1cGRhdGVzIHRvIHRhc2tzIHVwZGF0ZSByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tVcGRhdGVzUmVzb3VyY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXNjYWxZZWFyU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBmaXNjYWwgeWVhciBudW1iZXJpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmlzY2FsWWVhclN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2Vla1N0YXJ0RGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV2Vla1N0YXJ0RGF5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN0YXJ0IGRheSBvZiB0aGUgd2Vlay4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9U3VuZGF5LCAxPU1vbmRheSwgMj1UdWVzZGF5LCAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla1N0YXJ0RGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNCYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgYmVnaW5uaW5nIG9mIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O3N0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVndW4gbGF0ZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gaGF2ZSBiZWVuIGNvbXBsZXRlZCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtiZWZvcmUgdGhlIHN0YXR1cyBkYXRlIGJ1dCBiZWd1biBsYXRlIHNob3VsZCBiZSBtb3ZlZCB1cCB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlbGluZUZvckVhcm5lZFZhbHVlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3BlY2lmaWMgYmFzZWxpbmUgdXNlZCB0byBjYWxjdWxhdGUgVmFyaWFuY2UgdmFsdWVzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmFzZWxpbmUsIDE9QmFzZWxpbmUgMSwgMj1CYXNlbGluZSAyLCAzPUJhc2VsaW5lIDMsIDQ9QmFzZWxpbmUgNCwgNT1CYXNlbGluZSA1LCA2PUJhc2VsaW5lIDYsICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs3PUJhc2VsaW5lIDcsIDg9QmFzZWxpbmUgOCwgOT1CYXNlbGluZSA5LCAxMD1CYXNlbGluZSAxMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlIHBvb2wuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXR1c0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRlIHVzZWQgZm9yIGNhbGN1bGF0aW9uIGFuZCByZXBvcnRpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXR1c0RhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW50RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzeXN0ZW0gZGF0ZSB0aGF0IHRoZSBYTUwgd2FzIGdlbmVyYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVudERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIGJ5IGEgUHJvamVjdCBTZXJ2ZXIgdXNlciBhcyBvcHBvc2VkIHRvIGFuIE5UIHVzZXIuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b2xpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gYXV0b2xpbmsgaW5zZXJ0ZWQgb3IgbW92ZWQgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dG9saW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza1N0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL05ld1Rhc2tTdGFydERhdGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZGF0ZSBmb3IgbmV3IHRhc2tzIHN0YXJ0LiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UHJvamVjdCBTdGFydCBEYXRlLCAxPUN1cnJlbnQgRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrU3RhcnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tFVk1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RlZmF1bHRUYXNrRVZNZXRob2RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZWFybmVkIHZhbHVlIG1ldGhvZCBmb3IgdGFza3MuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tFVk1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RFeHRlcm5hbGx5RWRpdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IFhNTCB3YXMgZWRpdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVuZGVkQ3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZENyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbHNJblN5bmMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWxsIGFjdHVhbCB3b3JrIGhhcyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxzSW5TeW5jIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtb3ZlRmlsZVByb3BlcnRpZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gcmVtb3ZlIGFsbCBmaWxlIHByb3BlcnRpZXMgb24gc2F2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtb3ZlRmlsZVByb3BlcnRpZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZG1pblByb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gYWRtaW5pc3RyYXRpdmUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWRtaW5Qcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGVzIiBlVHlwZT0iIy8vT3V0bGluZUNvZGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2Ygb3V0bGluZSBjb2RlIGRlZmluaXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4gIFRoZXNlIGNvZGVzIG1heSBiZSBhc3NvY2lhdGVkIG9ubHkgd2l0aCB0aGlzIHByb2plY3QsIG9yIG1heSBiZSBjb21tb24gYW1vbmcgc2V2ZXJhbCBwcm9qZWN0cyAoZW50ZXJwcmlzZSBjb2RlcykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2tzIiBlVHlwZT0iIy8vV0JTTWFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGVzIiBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgZXh0ZW5kZWQgYXR0cmlidXRlIChjdXN0b20gZmllbGQpIGRlZmluaXRpb25zICYjeEQ7JiN4QTsgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FsZW5kYXJzIiBlVHlwZT0iIy8vQ2FsZW5kYXJzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgY2FsZW5kYXJzIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAmI3hEOyYjeEE7ICAgICAgICBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgZVR5cGU9IiMvL1Rhc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgdGFza3MgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlcyIgZVR5cGU9IiMvL1Jlc291cmNlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnRzIiBlVHlwZT0iIy8vQXNzaWdubWVudHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBhc3NpZ25tZW50cyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlc0Zyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByYXRlIGJlY29tZXMgZWZmZWN0aXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlc0Zyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlc1RvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByYXRlIGlzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhdGVUYWJsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1JhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJhdGUgdGFibGUgZm9yIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BLCAxPUIsIDI9QywgMz1ELCA0PUUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZVRhYmxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdmVydGltZSByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyYXRlIiB1cHBlckJvdW5kPSIyNSIgZVR5cGU9IiMvL1JhdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmaW5pdGlvbiBvZiBhIHRpbWUgcGVyaW9kLCBhbmQgdGhlIHJhdGVzIGFwcGxpY2FibGUgZm9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBkdXJpbmcgdGhhdCBwZXJpb2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSYXRlVGFibGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZVRhYmxlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgbGlzdCBvZiByZXNvdXJjZXMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiByZXNvdXJjZS4gVmFsdWVzIGFyZTogMD1NYXRlcmlhbCwgMT1Xb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc051bGwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBudWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc051bGwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0aWFscyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0luaXRpYWxzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbml0aWFscyBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluaXRpYWxzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUGhvbmV0aWNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBzcGVsbGluZyBvZiB0aGUgcmVzb3VyY2UgbmFtZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1c2Ugd2l0aCBKYXBhbmVzZSBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuVEFjY291bnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OVEFjY291bnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIE5UIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTlRBY2NvdW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF0ZXJpYWxMYWJlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL01hdGVyaWFsTGFiZWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIG1hdGVyaWFsIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29kZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0NvZGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvZGUgb3Igb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Hcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0dyb3VwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0dyb3VwVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHdvcmtncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1EZWZhdWx0LCAxPU5vbmUsIDI9RW1haWwsIDM9V2ViJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVtYWlsQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0VtYWlsQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXhVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMS4wIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXRzIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF4VW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZWFrVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pdHMgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGF0IGFueSB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZWFrVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyQWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaXJzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FuTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHJlc291cmNlIGNhbiBiZSBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYW5MZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY3J1ZUF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQWNjcnVlQXQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPUVuZCwgMz1Qcm9yYXRlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY2NydWVBdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZ3VsYXJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgYWN0dWFsIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHJlbWFpbmluZyB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgb3ZlcnRpbWUgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHdvcmsgY29tcGxldGVkIGFjcm9zcyBhbGwgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFuZGFyZCByYXRlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXksIDg9bWF0ZXJpYWwgcmVzb3VyY2UgcmF0ZSAob3IgYmxhbmsgc3ltYm9sIHNwZWNpZmllZCkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHByb2plY3QgY29zdCBmb3IgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdmVydGltZSByYXRlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBvdmVydGltZSByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgb3ZlcnRpbWUgY29zdCBmb3IgdGhlIHJlc291cmNlIGluY2x1ZGluZyBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFBlclVzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvc3QgcGVyIHVzZSBvZiB0aGUgcmVzb3VyY2UuIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RQZXJVc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBieSB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIHRoZSByZXNvdXJjZSB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2VsaW5lIHdvcmsgYW5kIHRoZSB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSBjb3N0IGFuZCB0aGUgY29zdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgc2NoZWR1bGUgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlc291cmNlIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNHZW5lcmljIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZ2VuZXJpYy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNHZW5lcmljIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmFjdGl2ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNldCB0byBpbmFjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNJbmFjdGl2ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGFuIEVudGVycHJpc2UgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzRW50ZXJwcmlzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvb2tpbmdUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQm9va2luZ1R5cGVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSByZXNvdXJjZS4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZlRGlyZWN0b3J5R1VJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjdGl2ZURpcmVjdG9yeUdVSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIEFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3RpdmVEaXJlY3RvcnlHVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYmFzZWxpbmUgdmFsdWVzIGZvciB0aGUgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIGEgcG9pbnRlciBiYWNrIHRvICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdmFpbGFiaWxpdHlQZXJpb2RzIiBlVHlwZT0iIy8vQXZhaWxhYmlsaXR5UGVyaW9kcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGR1cmluZyB3aGljaCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZXMiIGVUeXBlPSIjLy9SYXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGFuZCB0aGUgcmF0ZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgcmVzb3VyY2UgaW4gZWFjaCBSZXNvdXJjZXMgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSb2xsdXBUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cFR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3ViamVjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3VicHJvamVjdE5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgdGFzayB3aXRoaW4gdGhlIGxpc3Qgb2YgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgdGFzayBpcyBudWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc051bGwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGVEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgY3JlYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRlRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnRhY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db250YWN0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb250YWN0IHBlcnNvbiBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRhY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3QlMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBjb2RlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3QlNMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmlnaHRtb3N0IFdCUyBsZXZlbCBvZiB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU0xldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0bGluZU51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVOdW1iZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbnVtYmVyIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0bGluZUxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJpb3JpdHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBmcm9tIDAgdG8gMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJpb3JpdHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwbGFubmVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBzY2hlZHVsZWQgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdG9wIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgc3RvcHBlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lVmFsaWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgY2FuIGJlIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZVZhbGlkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWZmb3J0RHJpdmVuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVmZm9ydC1kcml2ZW4uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlY3VycmluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhIHJlY3VycmluZyB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWN1cnJpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyQWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIG92ZXJhbGxvY2F0ZWQuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJBbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgZXN0aW1hdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxlc3RvbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSBtaWxlc3RvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1bW1hcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSBzdW1tYXJ5IHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1bW1hcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBpbiB0aGUgY3JpdGljYWwgY2hhaW4uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyaXRpY2FsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTdWJwcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGFuIGluc2VydGVkIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdFJlYWRPbmx5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBpbnNlcnRlZCBwcm9qZWN0IGlzIHJlYWQtb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNTdWJwcm9qZWN0UmVhZE9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJwcm9qZWN0TmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YnByb2plY3ROYW1lVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGluc2VydGVkIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YnByb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGV4dGVybmFsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbFRhc2tQcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIGFuZCB0YXNrIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFza1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJseVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVhcmx5IHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5U3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJseUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybHlGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXRlU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGF0ZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXRlRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhdGVGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgc3RhcnQgZGF0ZSBmcm9tICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBmaW5pc2ggZGF0ZSBmcm9tICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGFzayB3b3JrIGZyb20gdGhlIGJhc2VsaW5lICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJlZVNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGZyZWUgc2xhY2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyZWVTbGFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvdGFsU2xhY2siIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdG90YWwgc2xhY2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvdGFsU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZml4ZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0QWNjcnVhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpeGVkQ29zdEFjY3J1YWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHRoZSBmaXhlZCBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1Qcm9yYXRlZCBhbmQgMz1FbmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50Q29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIGR1cmF0aW9uIGNvbXBsZXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgd29yayBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB3b3JrIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0R1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB0aW1lIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSB1bmZpbmlzaGVkIHBvcnRpb24gb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZUNvc3QiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBwcm9qZWN0ZWQgdG8gZmluaXNoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZVdvcmsiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJhaW50VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnRUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25zdHJhaW50IG9uIHRoZSBzdGFydCBvciBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BcyBTb29uIEFzIFBvc3NpYmxlLCAxPUFzIExhdGUgQXMgUG9zc2libGUsIDI9TXVzdCBTdGFydCBPbiwgMz1NdXN0IEZpbmlzaCBPbiwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1TdGFydCBObyBFYXJsaWVyIFRoYW4sIDU9U3RhcnQgTm8gTGF0ZXIgVGhhbiwgNj1GaW5pc2ggTm8gRWFybGllciBUaGFuIGFuZCA3PUZpbmlzaCBObyBMYXRlciBUaGFuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YXNrIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSBhcmd1bWVudCBmb3IgdGhlIHRhc2sgY29uc3RyYWludCB0eXBlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlYWRsaW5lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlYWRsaW5lIGZvciB0aGUgdGFzayB0byBiZSBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlYWRsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxBc3NpZ25tZW50cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBsZXZlbGluZyBjYW4gYWRqdXN0IGFzc2lnbm1lbnRzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbEFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdDYW5TcGxpdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBsZXZlbGluZyBjYW4gc3BsaXQgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nQ2FuU3BsaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZUxldmVsZWRTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZUxldmVsZWRGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZ25vcmVSZXNvdXJjZUNhbGVuZGFyIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlnbm9yZXMgdGhlIHJlc291cmNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGlkZUJhciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgR0FOVFQgYmFyIG9mIHRoZSB0YXNrIGlzIGhpZGRlbiB3aGVuIGRpc3BsYXllZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSGlkZUJhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGx1cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyByb2xsZWQgdXAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBoeXNpY2FsUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBjb21wbGV0ZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSBQcm9qZWN0IE1hbmFnZXIuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciBjYWxjdWxhdGluZyBCQ1dQLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcm5lZFZhbHVlTWV0aG9kIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yTGluayIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QcmVkZWNlc3NvckxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBwcmVkZWNlc3NvciB0YXNrIG9mIHRoZSB0YXNrIHRoYXQgY29udGFpbnMgaXQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yTGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSB0YXNrIGluIGVhY2ggVGFza3MgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVQZXJpb2QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyb21EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJlZ2lubmluZyBvZiB0aGUgZXhjZXB0aW9uIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGltZXBoYXNlZERhdGFUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdGltZSBwaGFzZWQgZGF0YSBibG9jay4mI3hEOyYjeEE7JiN4OTsmI3g5OyAgICAgICAgIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YVR5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRhc2sgdGltZXBoYXNlZCBkYXRhLiBWYWx1ZXMgYXJlOiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE9QXNzaWdubWVudCBSZW1haW5pbmcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI9QXNzaWdubWVudCBBY3R1YWwgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM9QXNzaWdubWVudCBBY3R1YWwgT3ZlcnRpbWUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ9QXNzaWdubWVudCBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNT1Bc3NpZ25tZW50IEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2PUFzc2lnbm1lbnQgQWN0dWFsIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3PVJlc291cmNlIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA4PVJlc291cmNlIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA5PVRhc2sgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDEwPVRhc2sgQmFzZWxpbmUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDExPVRhc2sgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE2PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTc9QXNzaWdubWVudCBCYXNlbGluZSAxIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOD1UYXNrIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE5PVRhc2sgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjA9UmVzb3VyY2UgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjE9UmVzb3VyY2UgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjI9QXNzaWdubWVudCBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMz1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI0PVRhc2sgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjU9VGFzayBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNj1SZXNvdXJjZSBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNz1SZXNvdXJjZSBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOD1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI5PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzA9VGFzayBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMT1UYXNrIEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMyPVJlc291cmNlIEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMzPVJlc291cmNlIEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM0PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzU9QXNzaWdubWVudCBCYXNlbGluZSA0IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNj1UYXNrIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM3PVRhc2sgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzg9UmVzb3VyY2UgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzk9UmVzb3VyY2UgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDA9QXNzaWdubWVudCBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQyPVRhc2sgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDM9VGFzayBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0ND1SZXNvdXJjZSBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0NT1SZXNvdXJjZSBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nj1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ3PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDg9VGFzayBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0OT1UYXNrIEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUwPVJlc291cmNlIEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUxPVJlc291cmNlIEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUyPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTM9QXNzaWdubWVudCBCYXNlbGluZSA3IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1ND1UYXNrIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU1PVRhc2sgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTY9UmVzb3VyY2UgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTc9UmVzb3VyY2UgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTg9QXNzaWdubWVudCBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1OT1Bc3NpZ25tZW50IEJhc2VsaW5lIDggQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYwPVRhc2sgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjE9VGFzayBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Mj1SZXNvdXJjZSBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Mz1SZXNvdXJjZSBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2ND1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY1PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjY9VGFzayBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Nz1UYXNrIEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY4PVJlc291cmNlIEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY5PVJlc291cmNlIEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcwPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcxPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcyPVRhc2sgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDczPVRhc2sgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc0PVJlc291cmNlIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3NT1SZXNvdXJjZSBCYXNlbGluZSAxMCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzY9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFydCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Vbml0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1tLCAxPWgsIDI9ZCwgMz13LCA1PW1vLCA4PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVbml0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIHBlciB1bml0IG9mIHRpbWUgZm9yIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVGl0bGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaXRsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVJRFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVuaXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNSA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlIGFjcm9zcyB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmVudFZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGFyZW50VmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGlzIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVW5pcXVlIElEIG9mIHZhbHVlIGFjcm9zcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFsdWUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGxpc3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWVMaXN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlTGlzdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlZhbHVlbGlzdFNvcnRPcmRlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZWxpc3RTb3J0T3JkZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWwiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsZXZlbCBvZiB0aGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVHlwZVR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGhlIG5vZGUgdmFsdWUuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXJjYXNlIExldHRlcnMsIDI9TG93ZXJjYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycy4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvbWl0dGVkIHdoZW4gbGVuZ3RoIGlzICZxdW90O2FueSZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVuZ3RoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VwYXJhdG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIG9mIHRoZSBub2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZXBhcmF0b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXQlNNYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcmlmeVVuaXF1ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIHVuaXF1ZSBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWZXJpZnlVbmlxdWVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlQ29kZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIFdCUyBjb2RlcyBhcmUgZ2VuZXJhdGVkIGZvciBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkdlbmVyYXRlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QcmVmaXhUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByZWZpeCBmb3IgYWxsIFdCUyBjb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZml4Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id0JTTWFzayIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9XQlNNYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFdCUyBNYXNrIHRoYXQgaXMgYXBwbGllZCB0byBhbGwgdGFza3MgaW4gdGhlIFByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWVrRGF5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRGF5VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBkYXkuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUV4Y2VwdGlvbiwgMT1Nb25kYXksIDI9VHVlc2RheSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc9U3VuZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlXb3JraW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0ZSBvciBkYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgd29ya2luZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5V29ya2luZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVQZXJpb2QiIGVUeXBlPSIjLy9UaW1lUGVyaW9kIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBhIGNvbnRpZ3VvdXMgc2V0IG9mIGV4Y2VwdGlvbiBkYXlzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZVBlcmlvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtpbmdUaW1lcyIgZVR5cGU9IiMvL1dvcmtpbmdUaW1lcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHdvcmtpbmcgdGltZXMgdGhhdCBkZWZpbmUgdGhlIHRpbWUgd29ya2VkICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgd2Vla2RheS4gIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGFuZCB0aGVyZSBtYXkgYmUgbm8gbW9yZSB0aGFuIGZpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWVrRGF5cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlZWtEYXkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV2Vla0RheSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgd2Vla2RheSBlaXRoZXIgZGVmaW5lcyByZWd1bGFyIGRheXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHdlZWsgb3IgZXhjZXB0aW9uIGRheXMgaW4gdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV2Vla1N0YXJ0RGF5VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0NvbnRvdXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0NvbnRvdXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDcgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0dyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtHcm91cF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2luZ1RpbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJlZ2lubmluZyBvZiB0aGUgd29ya2luZyB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyb21UaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9UaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSB3b3JraW5nICB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZSIgdXBwZXJCb3VuZD0iNSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtpbmdUaW1lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgd29ya2luZyB0aW1lIGR1cmluZyB0aGUgd2Vla2RheS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM0M2IxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IHBsdWdpbi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NTcganRoYW0gRXhwICQKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZSA9IEVQRiBNU1Byb2plY3QyMDAzIE1vZGVsCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjYxOTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSA8Y29weXJpZ2h0PgotIDwvY29weXJpZ2h0PgotCi0gJElkOiBwbHVnaW4ueG1sLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NTcganRoYW0gRXhwICQKLS0tPgotCi08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UiCi0gICAgICAgZ2VuTW9kZWwgPSAibW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsIiAvPiAKLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIDxwYXJzZXIgCi0gICAgICAgdHlwZT0ibXNwcm9qZWN0IiAKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4YmM0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMzQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBc3NpZ25tZW50LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzaWdubWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQyA8ZW0+VkFDPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXNzaWdubWVudF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NpZ25tZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2sgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFza1VJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVGFza1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VGFza1VJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRhc2tVSUQgPGVtPlRhc2sgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza1VJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNvdXJjZVVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmVzb3VyY2VVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXNvdXJjZVVJRCA8ZW0+UmVzb3VyY2UgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZVVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudFdvcmtDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbFN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgYW1vdW50IG9mIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpcm1lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgUmVzb3VyY2UgaGFzIGFjY2VwdGVkIGFsbCBvZiBoaXMgb3IgaGVyIGFzc2lnbm1lbnRzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29uZmlybWVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25maXJtZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI2lzQ29uZmlybWVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25maXJtZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maXJtZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHJhdGUgdGFibGUgdXNlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3RSYXRlVGFibGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Nvc3RSYXRlVGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db3N0UmF0ZVRhYmxlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFJhdGVUYWJsZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q29zdFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUgPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29zdCBhbmQgYmFzZWxpbmUgY29zdCBmb3IgYSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IHRoYXQgdGhlIGFzc2lnbm1lbnQgaXMgZGVsYXllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWxheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWxheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldERlbGF5IDxlbT5EZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWxheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9GaW5pc2hWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua0FkZHJlc3NUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1dvcmtWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXMgRml4ZWQgUmF0ZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgVW5pdHMgYXJlIEZpeGVkIFJhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIYXNGaXhlZFJhdGVVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRIYXNGaXhlZFJhdGVVbml0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpeGVkIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBjb25zdW1wdGlvbiBvZiB0aGUgYXNzaWduZWQgbWF0ZXJpYWwgcmVzb3VyY2Ugb2NjdXJzIGluIGEgc2luZ2xlLCBmaXhlZCBhbW91bnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICN1bnNldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpeGVkTWF0ZXJpYWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRml4ZWRNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rZWQgRmllbGRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjdW5zZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGlua2VkRmllbGRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMaW5rZWRGaWVsZHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmtlZCBGaWVsZHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICN1bnNldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtlZEZpZWxkcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlua2VkIEZpZWxkczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNpc0xpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjc2V0TGlua2VkRmllbGRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMaW5rZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBhIG1pbGVzdG9uZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWlsZXN0b25lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X05vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vdGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyYWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIG92ZXJhbGxvY2F0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcmFsbG9jYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNPdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T3ZlcmFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJhbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE92ZXJhbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWd1bGFyV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZWd1bGFyV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZ3VsYXJXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2UgUGVuZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc3BvbnNlUGVuZGluZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzcG9uc2VQZW5kaW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Jlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjdW5zZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZyA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3NldFJlc3BvbnNlUGVuZGluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdG9wKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0b3AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdG9wJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0b3AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdG9wKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc3VtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZXN1bWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBzdGFydCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfU3RhcnRWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnRWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0U3RhcnRWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVuaXRzKCkKLQkgKiBAc2VlICN1bnNldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1VuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbml0cyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVbml0cygpCi0JICogQHNlZSAjZ2V0VW5pdHMoKQotCSAqIEBzZWUgI3NldFVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0ZSBOZWVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRydWUgaWYgdGhlIHJlc291cmNlIGFzc2lnbmVkIHRvIGEgdGFzayBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjdW5zZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVXBkYXRlTmVlZGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVcGRhdGVOZWVkZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICN1bnNldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVwZGF0ZU5lZWRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVcGRhdGVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZBQzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNsaW5lIGNvc3QgYW5kIHRvdGFsIGNvc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WQUM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VkFDKCkKLQkgKiBAc2VlICN1bnNldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVkFDKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVkFDJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZBQzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI3Vuc2V0VkFDKCkKLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZBQyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VkFDPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgQ29udG91cjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdvcmsgY29udG91ciBvZiB0aGUgYXNzaWdubWVudC4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2PUJlbGwsIDc9VHVydGxlLCA4PUNvbnRvdXJlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBDb250b3VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrQ29udG91cihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrQ29udG91clR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtDb250b3VyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrQ29udG91cigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgQ29udG91cjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya0NvbnRvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtDb250b3VyKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSBhc3NpZ25tZW50LiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Cb29raW5nVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJvb2tpbmdUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQm9va2luZ1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEJvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIGNyZWF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9FeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Jhc2VsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotfSAvLyBBc3NpZ25tZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODBjZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBc3NpZ25tZW50cy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzI2dldEFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50cygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXNzaWdubWVudHNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzaWdubWVudHMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXNzaWdubWVudCgpOwotCi19IC8vIEFzc2lnbm1lbnRzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3ZDgwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF2YWlsYWJpbGl0eVBlcmlvZCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJsZUZyb20oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVG8oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVUbygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJsZVRvJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEF2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZHVyaW5nIHRoZSBzcGVjaWZpZWQgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVVuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICN1bnNldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdmFpbGFibGVVbml0cygpOwotCi19IC8vIEF2YWlsYWJpbGl0eVBlcmlvZApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2RzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkZTk2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBdmFpbGFiaWxpdHlQZXJpb2RzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHNfQXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJpbGl0eVBlcmlvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi19IC8vIEF2YWlsYWJpbGl0eVBlcmlvZHMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1YWRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VsaW5lIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bWJlcihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX051bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXROdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROdW1iZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmltPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmltPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0ludGVyaW0oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmltJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0ludGVyaW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmltPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjaXNJbnRlcmltKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmltKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbnRlcmltKCkKLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBzZWUgI3NldEludGVyaW0oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEludGVyaW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyaW08L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEludGVyaW0oKQotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SW50ZXJpbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbihPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2sgYmFzZWxpbmUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlZCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYmFzZWxpbmUgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2FzIGVzdGltYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRlZER1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0ZWREdXJhdGlvbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHdvcmsgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBjb3N0IG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLX0gLy8gQmFzZWxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE3NzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQmFzZWxpbmVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VsaW5lMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX051bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J051bWJlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB3b3JrIGFzc2lnbmVkIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSBpcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBjb3N0IGZvciB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdCgpCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdCgpCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi19IC8vIEJhc2VsaW5lMgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWE2YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lMy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fMl8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlbGluZTMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIEJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOdW1iZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotfSAvLyBCYXNlbGluZTMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5NWQwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYWxlbmRhci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGVuZGFyXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEJhc2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0Jhc2VDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0Jhc2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNCYXNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SXNCYXNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGNhbGVuZGFyIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gd2hpY2ggdGhpcyBjYWxlbmRhciBkZXBlbmRzLiBPbmx5IGFwcGxpY2FibGUgaWYgdGhlIGNhbGVuZGFyIGlzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhc2VDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX0Jhc2VDYWxlbmRhclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZUNhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCYXNlQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmFzZUNhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBEYXlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBXZWVrZGF5cyB0aGF0IGRlZmluZXMgdGhpcyBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdlZWtEYXlzKFdlZWtEYXlzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX1dlZWtEYXlzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla0RheXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWVrRGF5cyBnZXRXZWVrRGF5cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWVrRGF5cyhXZWVrRGF5cyB2YWx1ZSk7Ci0KLX0gLy8gQ2FsZW5kYXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGI2MmNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFycy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMjZ2V0Q2FsZW5kYXIgPGVtPkNhbGVuZGFyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYWxlbmRhcnNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENhbGVuZGFycyBhcmUgdXNlZCB0byBkZWZpbmUgc3RhbmRhcmQgd29ya2luZyBhbmQgCi0JICogICAgICAgICAgICAgICAgICAgICBub24td29ya2luZyB0aW1lcy4gUHJvamVjdHMgbXVzdCBoYXZlIG9uZSBiYXNlIGNhbGVuZGFyLiBUYXNrcyBhbmQgcmVzb3VyY2VzIAotCSAqICAgICAgICAgICAgICAgICAgICAgbWF5IGhhdmUgdGhlaXIgb3duIG5vbi1iYXNlIGNhbGVuZGFycyB3aGljaCBhcmUgYmFzZWQgb24gYSBiYXNlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyc19DYWxlbmRhcigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENhbGVuZGFyKCk7Ci0KLX0gLy8gQ2FsZW5kYXJzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Eb2N1bWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3NzU1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPScnIGtpbmQ9J21peGVkJyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFJvb3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWl4ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnRXaWxkY2FyZCcgbmFtZT0nOm1peGVkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd4bWxuczpwcmVmaXgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3hzaTpzY2hlbWFMb2NhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuCi0JICogCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2plY3QoUHJvamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfUHJvamVjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHZhbHVlKTsKLQotfSAvLyBEb2N1bWVudFJvb3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5Mzc4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRSb2xsdXBUeXBlIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0VmFsdWVsaXN0U29ydE9yZGVyIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZE5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGROYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gZmllbGQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFsaWFzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBmaWVsZAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUGhvbmV0aWNBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlBob25ldGljQWxpYXNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY0FsaWFzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xsdXAgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSG93IHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQuIFZhbHVlcyBhcmU6IDA9TWF4aW11bSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1BdmVyYWdlLCA1PUF2ZXJhZ2UgRmlyc3QgU3VibGV2ZWwsIDY9Q291bnQgRmlyc3QgU3VibGV2ZWwsIDc9Q291bnQgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25zdW1tYXJpZXMKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGx1cFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Sb2xsdXBUeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUm9sbHVwVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGx1cFR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJvbGx1cFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Um9sbHVwVHlwZSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xsdXBUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsY3VsYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciByb2xsdXBzIGFyZSBjYWxjdWxhdGVkIGZvciB0YXNrIGFuZCBncm91cCBzdW1tYXJ5IHJvd3MuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1Ob25lLCAxPVJvbGx1cCwgMj1DYWxjdWxhdGlvbgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxjdWxhdGlvblR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9DYWxjdWxhdGlvblR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxjdWxhdGlvblR5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxjdWxhdGlvblR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENhbGN1bGF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsY3VsYXRpb25UeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9ybXVsYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSB0YXNrIGZpZWxkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtdWxhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGb3JtdWxhKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Gb3JtdWxhKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zvcm11bGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Rm9ybXVsYSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtdWxhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGb3JtdWxhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGb3JtdWxhKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN0cmljdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIFJlc3RyaWN0VmFsdWVzPVRydWUgdGhlbiBvbmx5IHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGluIHRoZSBmaWxlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjdW5zZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9SZXN0cmljdFZhbHVlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzdHJpY3RWYWx1ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3RyaWN0VmFsdWVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3RyaWN0VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBIb3cgdmFsdWUgbGlzdHMgYXJlIHNvcnRlZC4gVmFsdWVzIGFyZTogCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPURlc2NlbmRpbmcsIDE9QXNjZW5kaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZWxpc3RTb3J0T3JkZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlbGlzdFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBlbmQgTmV3IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgQXBwZW5kTmV3VmFsdWVzPVRydWUgdGhlbiBhbnkgbmV3IHZhbHVlcyBhZGRlZCBpbiBhIHByb2plY3QgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBcHBlbmROZXdWYWx1ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXBwZW5kTmV3VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFwcGVuZE5ld1ZhbHVlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBcHBlbmROZXdWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIGxpc3QuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0RlZmF1bHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZW4gdmFsdWVzIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgdGhleSBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBieSB2YWx1ZXMgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgb3JkZXJpbmcgb2YgdGhlIGxpc3QgYnkgb3JkZXJpbmcgc3BlY2lmaWVkIGhlcmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlTGlzdChWYWx1ZUxpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVMaXN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVMaXN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVMaXN0IGdldFZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVhNzhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZV8uXzFfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGUyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGUyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4YjI4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlMwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDFlY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlNC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlNDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZTQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlNApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDhmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGRlZmluaXRpb24gCi0JICogICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgVGhlcmUgYXJlIG5vIGxpbWl0cyB0byB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgbWF5IGFwcGVhciwgYnV0IHByb2plY3QgCi0JICogICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgdW5kZXJzdGFuZCBGbGFnMS1GbGFnMTAsIGV0Yy4gIFRoaXMgbXVzdCBhcHBlYXIgb25jZSBpbiBlYWNoIEV4dGVuZGVkQXR0cmlidXRlcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Y5OWIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFzay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXNrXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hc2sgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxldmVsIG9mIHRoZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWwoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX0xldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlcy4gIElmIGxlbmd0aCBpcyBhbnksIHRoZSB2YWx1ZSBpcyB6ZXJvLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfTGVuZ3RoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZW5ndGgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXBhcmF0b3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfU2VwYXJhdG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NlcGFyYXRvcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1hc2sKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFza3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFza3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwNjRhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1hc2tzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MjZ2V0TWFzayA8ZW0+TWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXNrc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXNrcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvdXIgZWxlbWVudHMgb2YgdGhlIG1hc2sgY29uc3RpdHV0ZSB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBvdXRsaW5lIGNvZGUgbXVzdCBhcHBlYXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza3NfTWFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1hc2soKTsKLQotfSAvLyBNYXNrcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1ZTdmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEZhY3RvcnkuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNc3Byb2plY3RGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0RmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdEZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFzc2lnbm1lbnQgY3JlYXRlQXNzaWdubWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFzc2lnbm1lbnRzIGNyZWF0ZUFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZCBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBdmFpbGFiaWxpdHlQZXJpb2RzIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXNlbGluZSBjcmVhdGVCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmFzZWxpbmUyIGNyZWF0ZUJhc2VsaW5lMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmFzZWxpbmUzIGNyZWF0ZUJhc2VsaW5lMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhbGVuZGFyIGNyZWF0ZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWxlbmRhcnMgY3JlYXRlQ2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlMiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGUzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZTQgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlcyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFzayBjcmVhdGVNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFza3MgY3JlYXRlTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlIGNyZWF0ZU91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlMiBjcmVhdGVPdXRsaW5lQ29kZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGUzIGNyZWF0ZU91dGxpbmVDb2RlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRsaW5lQ29kZXMgY3JlYXRlT3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByZWRlY2Vzc29yTGluayBjcmVhdGVQcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvamVjdCBjcmVhdGVQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJhdGUgY3JlYXRlUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJhdGVzIGNyZWF0ZVJhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBjcmVhdGVUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza3MgY3JlYXRlVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lUGVyaW9kIGNyZWF0ZVRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lcGhhc2VkRGF0YVR5cGUgY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWUgY3JlYXRlVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlMiBjcmVhdGVWYWx1ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVMaXN0IGNyZWF0ZVZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVzIGNyZWF0ZVZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V0JTIE1hc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdCU01hc2sgY3JlYXRlV0JTTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV0JTTWFza3MgY3JlYXRlV0JTTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWVrRGF5IGNyZWF0ZVdlZWtEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlZWtEYXlzIGNyZWF0ZVdlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZSBjcmVhdGVXb3JraW5nVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZXMgY3JlYXRlV29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1zcHJvamVjdFBhY2thZ2UgZ2V0TXNwcm9qZWN0UGFja2FnZSgpOwotCi19IC8vTXNwcm9qZWN0RmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4N2M0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNTQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UGFja2FnZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZnVsbCBwcm9qZWN0IHNjaGVtYSBkZWZpbml0aW9uIGZyb20gdGhlIHByb2plY3QgbGV2ZWwgZG93biwgCi0gKiAJCXN0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1zcHJvamVjdFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAibXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFTU0lHTk1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzayBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19UQVNLX1VJRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1QgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX1dPUksgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1dQID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlybWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09ORklSTUVEID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NPU1QgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ1YgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0RFTEFZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklOSVNIID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fSFlQRVJMSU5LID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEZpZWxkczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFMgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19NSUxFU1RPTkUgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX05PVEVTID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcmFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVCA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19PVkVSVElNRV9XT1JLID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSyA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNlIFBlbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVEFSVCA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVE9QID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTVU1FID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRSA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVU5JVFMgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGUgTmVlZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRCA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZBQzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1ZBQyA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBDb250b3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fV09SS19DT05UT1VSID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JDV1MgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkNXUCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvb2tpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DUkVBVElPTl9EQVRFID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkFTRUxJTkUgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQSA9IDU2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Bc3NpZ25tZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfRkVBVFVSRV9DT1VOVCA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudHNJbXBsIDxlbT5Bc3NpZ25tZW50czwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50c0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBU1NJR05NRU5UUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE8gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwgPGVtPkJhc2VsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19OVU1CRVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyaW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fSU5URVJJTSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fU1RBUlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19GSU5JU0ggPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0RVUkFUSU9OID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRFVSQVRJT05fRk9STUFUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZWQgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX1dPUksgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fQ09TVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19CQ1dTID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19CQ1dQID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwgPGVtPkJhc2VsaW5lMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FMiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX19OVU1CRVIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX1dPUksgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0NPU1QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0JDV1MgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0JDV1AgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CYXNlbGluZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCA8ZW0+QmFzZWxpbmUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX05VTUJFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX1NUQVJUID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fV09SSyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQ09TVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQkNXUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQkNXUCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwgPGVtPkNhbGVuZGFyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTEVOREFSID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEJhc2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX19XRUVLX0RBWVMgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DYWxlbmRhcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFyc0ltcGwgPGVtPkNhbGVuZGFyczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTEVOREFSUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSU19fQ0FMRU5EQVIgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NSVhFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fUFJPSkVDVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGx1cCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsY3VsYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9ybXVsYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdHJpY3QgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUiA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwZW5kIE5ldyBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTQgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlc0ltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCA8ZW0+TWFzazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFTSyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19fTEVWRUwgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19MRU5HVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tfX1NFUEFSQVRPUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1hc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tzSW1wbCA8ZW0+TWFza3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFTS1MgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLU19fTUFTSyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1hc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0ZJRUxEX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19GSUVMRF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fQUxJQVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19WQUxVRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZWFmIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0xFQUZfT05MWSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIExldmVscyBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19NQVNLUyA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCA8ZW0+T3V0bGluZSBDb2RlMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTMgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUzX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fVkFMVUVfSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTNfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZXNJbXBsIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2Rlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTksgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIExhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWcgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsIDxlbT5Qcm9qZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9KRUNUID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGl0bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19USVRMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NVQkpFQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FURUdPUlkgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBhbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DT01QQU5ZID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5hZ2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUFOQUdFUiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUSE9SID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1JFQVRJT05fREFURSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV2aXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRVZJU0lPTiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFzdCBTYXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0xBU1RfU0FWRUQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TVEFSVF9EQVRFID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GSU5JU0hfREFURSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZZIFN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GWVNUQVJUX0RBVEUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcml0aWNhbCBTbGFjayBMaW1pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRGlnaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FMRU5EQVJfVUlEID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFydCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaW5pc2ggVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUUgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBEYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NSU5VVEVTX1BFUl9EQVkgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBXZWVrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRheXMgUGVyIE1vbnRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREFZU19QRVJfTU9OVEggPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURSA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVCA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fV09SS19GT1JNQVQgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFMgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib25vciBDb25zdHJhaW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybmVkIFZhbHVlIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0QgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlkgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTiA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ByZWFkIEFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRSA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpc2NhbCBZZWFyIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWVrIFN0YXJ0IERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1dFRUtfU1RBUlRfREFZID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSyA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1MgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGF0dXMgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NUQVRVU19EQVRFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOVF9EQVRFID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkwgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRvbGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FVVE9MSU5LID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRCA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEUgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWxzIEluIFN5bmM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkMgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUyA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkbWluIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BRE1JTl9QUk9KRUNUID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX09VVExJTkVfQ09ERVMgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19XQlNfTUFTS1MgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUyA9IDYzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NBTEVOREFSUyA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVEFTS1MgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRVNPVVJDRVMgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FTU0lHTk1FTlRTID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9GRUFUVVJFX0NPVU5UID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCA8ZW0+UmF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkFURSA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19SQVRFU19GUk9NID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlcyBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1JBVEVTX1RPID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlIFRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fUkFURV9UQUJMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1NUQU5EQVJEX1JBVEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19PVkVSVElNRV9SQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19DT1NUX1BFUl9VU0UgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlc0ltcGwgPGVtPlJhdGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEVTID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURVNfX1JBVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SYXRlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCA8ZW0+UmVzb3VyY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0UgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfTlVMTCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSU5JVElBTFMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QSE9ORVRJQ1MgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5UIEFjY291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTlRBQ0NPVU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXRlcmlhbCBMYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19NQVRFUklBTF9MQUJFTCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT0RFID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19HUk9VUCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgR3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SS19HUk9VUCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYWlsIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fRU1BSUxfQUREUkVTUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTksgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXggVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTUFYX1VOSVRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVhayBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QRUFLX1VOSVRTID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCTEVfRlJPTSA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCTEVfVE8gPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFSVCA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19GSU5JU0ggPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYW4gTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ0FOX0xFVkVMID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjcnVlIEF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDQ1JVRV9BVCA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SSyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRUdVTEFSX1dPUksgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1dPUksgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfV09SSyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUksgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSyA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEUgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFOREFSRF9SQVRFX0ZPUk1BVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ09TVCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUlRJTUVfUkFURSA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVkVSVElNRV9DT1NUID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9DT1NUID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1QgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfQ09TVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19XT1JLX1ZBUklBTkNFID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT1NUX1ZBUklBTkNFID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fU1YgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DViA9IDQ3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNXUCA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DQUxFTkRBUl9VSUQgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OT1RFUyA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkNXUyA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkNXUCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEdlbmVyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfR0VORVJJQyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEluYWN0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lTX0lOQUNUSVZFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW50ZXJwcmlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JU19FTlRFUlBSSVNFID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9va2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRSA9IDU2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRCA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ1JFQVRJT05fREFURSA9IDYwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURSA9IDYxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkFTRUxJTkUgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVVRMSU5FX0NPREUgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUyA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JBVEVTID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJlc291cmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0ZFQVRVUkVfQ09VTlQgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlc0ltcGwgPGVtPlJlc291cmNlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU09VUkNFUyA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRVNfX1JFU09VUkNFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVzb3VyY2VzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19OVUxMID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGUgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NSRUFURV9EQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OVEFDVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V0JTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV0JTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XQlNfTEVWRUwgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgTnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1VUTElORV9OVU1CRVIgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX0xFVkVMID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpb3JpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUklPUklUWSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RBUlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSU5JU0ggPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0RVUkFUSU9OID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRFVSQVRJT05fRk9STUFUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dPUksgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RPUCA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFU1VNRSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFU1VNRV9WQUxJRCA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FRkZPUlRfRFJJVkVOID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjdXJyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVDVVJSSU5HID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSX0FMTE9DQVRFRCA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRFRCA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01JTEVTVE9ORSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVU1NQVJZID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JpdGljYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DUklUSUNBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19TVUJQUk9KRUNUID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVQlBST0pFQ1RfTkFNRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIFRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FWFRFUk5BTF9UQVNLID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybHkgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJMWV9TVEFSVCA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcmx5IEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VBUkxZX0ZJTklTSCA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhdGUgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MQVRFX1NUQVJUID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGF0ZSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MQVRFX0ZJTklTSCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RBUlRfVkFSSUFOQ0UgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSU5JU0hfVkFSSUFOQ0UgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV09SS19WQVJJQU5DRSA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZWUgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GUkVFX1NMQUNLID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19UT1RBTF9TTEFDSyA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSVhFRF9DT1NUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rml4ZWQgQ29zdCBBY2NydWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkNFTlRfQ09NUExFVEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09TVCA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSVElNRV9DT1NUID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09WRVJUSU1FX1dPUksgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfU1RBUlQgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0ZJTklTSCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9EVVJBVElPTiA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0NPU1QgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfV09SSyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUksgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRUdVTEFSX1dPUksgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfRFVSQVRJT04gPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19DT1NUID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfV09SSyA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDV1AgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NWID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OU1RSQUlOVF9UWVBFID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ0FMRU5EQVJfVUlEID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OU1RSQUlOVF9EQVRFID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVhZGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ERUFETElORSA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsIEFzc2lnbm1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBDYW4gU3BsaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MRVZFTElOR19DQU5fU1BMSVQgPSA2ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xFVkVMSU5HX0RFTEFZID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVfTEVWRUxFRF9TVEFSVCA9IDcxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBMZXZlbGVkIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSCA9IDcyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0hZUEVSTElOSyA9IDczOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSFlQRVJMSU5LX0FERFJFU1MgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05PVEVTID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGlkZSBCYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ISURFX0JBUiA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGx1cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JPTExVUCA9IDc5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19CQ1dTID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JDV1AgPSA4MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURSA9IDgyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJORURfVkFMVUVfTUVUSE9EID0gODM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFREVDRVNTT1JfTElOSyA9IDg0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDg1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDg2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURU5ERURfQVRUUklCVVRFID0gODc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JBU0VMSU5FID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX0NPREUgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RJTUVQSEFTRURfREFUQSA9IDkwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfRkVBVFVSRV9DT1VOVCA9IDkxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza3NJbXBsIDxlbT5UYXNrczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLUyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tTX19UQVNLID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGFza3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS1NfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZVBlcmlvZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfX0ZST01fREFURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG8gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EX19UT19EQVRFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsIDxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsIDxlbT5WYWx1ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRSA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfX1ZBTFVFX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgVmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fUEFSRU5UX1ZBTFVFX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fREVTQ1JJUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwgPGVtPlZhbHVlMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFMiA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRTJfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFMl9fREVTQ1JJUFRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUxpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFX0xJU1QgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfTElTVF9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX0xJU1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsIDxlbT5WYWx1ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRVMgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFU19fVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwgPGVtPldCUyBNYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXQlNfTUFTSyA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX0xFVkVMID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19MRU5HVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19TRVBBUkFUT1IgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XQlMgTWFzazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCA8ZW0+V0JTIE1hc2tzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdCU19NQVNLUyA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENvZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19QUkVGSVggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1dCU19NQVNLID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLU19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsIDxlbT5XZWVrIERheTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VFS19EQVkgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZX19EQVlfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF5IFdvcmtpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9fREFZX1dPUktJTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX1RJTUVfUEVSSU9EID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX1dPUktJTkdfVElNRVMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWVrIERheTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbCA8ZW0+V2VlayBEYXlzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFRUtfREFZUyA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgRGF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWVNfX1dFRUtfREFZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V2VlayBEYXlzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCA8ZW0+V29ya2luZyBUaW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb20gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9fRlJPTV9USU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UbyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FX19UT19USU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lc0ltcGwgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtpbmdUaW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNDUlVFX0FUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWxpYXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFMSUFTX1RZUEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QXV0aG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVVRIT1JfVFlQRSA9IDQ0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRSA9IDQ1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Qm9va2luZ1R5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJPT0tJTkdfVFlQRV9UWVBFID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Qm9va2luZ1R5cGVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCT09LSU5HX1RZUEVfVFlQRTEgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDYWxjdWxhdGlvblR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTENVTEFUSU9OX1RZUEVfVFlQRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhdGVnb3J5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQVRFR09SWV9UWVBFID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvZGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb2RlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT0RFX1RZUEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvbXBhbnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTVBBTllfVFlQRSA9IDUxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q29uc3RyYWludFR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfVFlQRV9UWVBFID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb250YWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05UQUNUX1RZUEUgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvc3RSYXRlVGFibGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPU1RfUkFURV9UQUJMRV9UWVBFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRSA9IDU1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeVN5bWJvbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VSUkVOQ1lfU1lNQk9MX1RZUEUgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGF5IFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RGF5VHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREFZX1RZUEVfVFlQRSA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRSA9IDU4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRSA9IDU5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0VGFza1R5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfVEFTS19UWVBFX1RZUEUgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRSA9IDYxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEUxID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTIgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFMyA9IDY0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEU0ID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTUgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMSA9IDY4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RW1haWxBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTUFJTF9BRERSRVNTX1RZUEUgPSA2OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURVJOQUxfVEFTS19QUk9KRUNUX1RZUEUgPSA3MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRklYRURfQ09TVF9BQ0NSVUFMX1RZUEUgPSA3MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRGWVN0YXJ0RGF0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRllfU1RBUlRfREFURV9UWVBFID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkdyb3VwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0R3JvdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdST1VQX1RZUEUgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFID0gNzQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFMSA9IDc1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX0FERFJFU1NfVFlQRTIgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTEgPSA3ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTIgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRSA9IDgwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1RZUEUxID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRTIgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SW5pdGlhbHMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRJbml0aWFsc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5JVElBTFNfVFlQRSA9IDgzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MYWcgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExhZ0Zvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTEFHX0ZPUk1BVF9UWVBFID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRSA9IDg1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTEgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hbmFnZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BTkFHRVJfVFlQRSA9IDg3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hdGVyaWFsTGFiZWxUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BVEVSSUFMX0xBQkVMX1RZUEUgPSA4ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRSA9IDg5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OYW1lIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FX1RZUEUxID0gOTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TmFtZVR5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRTIgPSA5MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROYW1lVHlwZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRV9UWVBFMyA9IDkyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5ld1Rhc2tTdGFydERhdGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRSA9IDkzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TlRBY2NvdW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOVF9BQ0NPVU5UX1RZUEUgPSA5NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3V0bGluZSBOdW1iZXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lTnVtYmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX05VTUJFUl9UWVBFID0gOTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRSA9IDk2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTEgPSA5NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRQaG9uZXRpY0FsaWFzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSE9ORVRJQ19BTElBU19UWVBFID0gOTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFBob25ldGljc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEhPTkVUSUNTX1RZUEUgPSA5OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UHJlZml4IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJlZml4VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkVGSVhfVFlQRSA9IDEwMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSYXRlVGFibGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEVfVEFCTEVfVFlQRSA9IDEwMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Um9sbHVwIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Um9sbHVwVHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MTFVQX1RZUEVfVFlQRSA9IDEwMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFID0gMTAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTEgPSAxMDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN1YmplY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRTdWJqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVUJKRUNUX1RZUEUgPSAxMDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFN1YnByb2plY3ROYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVUJQUk9KRUNUX05BTUVfVFlQRSA9IDEwNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VGl0bGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaXRsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVElUTEVfVFlQRSA9IDEwNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUgPSAxMDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUxID0gMTA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFMiA9IDExMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRTMgPSAxMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEU0ID0gMTEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGU1PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFNSA9IDExMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VUlEIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VUlEVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVSURfVFlQRSA9IDExNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VW5pdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRVbml0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVTklUX1RZUEUgPSAxMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRSA9IDExNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V2Vla1N0YXJ0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUVLX1NUQVJUX0RBWV9UWVBFID0gMTE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V29ya0NvbnRvdXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQ09OVE9VUl9UWVBFID0gMTE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXb3JrRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0ZPUk1BVF9UWVBFID0gMTE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtHcm91cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19HUk9VUF9UWVBFID0gMTIwOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXNzaWdubWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGFza1VJRCA8ZW0+VGFzayBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVzb3VyY2VVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpcm1lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db25maXJtZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDVigpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9DVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaXhlZE1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9NaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZWd1bGFyV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXN1bWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Vbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VwZGF0ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WQUM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1ZBQygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrQ29udG91ciA8ZW0+V29yayBDb250b3VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBDb250b3VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmtDb250b3VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCb29raW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Cb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9FeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0Jhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRzX0Fzc2lnbm1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbygpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzX0F2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJhc2VsaW5lX1RpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldE51bWJlcigpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkludGVyaW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0ludGVyaW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb24oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Fc3RpbWF0ZWREdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIgPGVtPkJhc2VsaW5lMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QmFzZWxpbmUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0TnVtYmVyKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9OdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyA8ZW0+QmFzZWxpbmUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9CYXNlQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cygpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENhbGVuZGFyX1dlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyNnZXRDYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMjZ2V0Q2FsZW5kYXIoKQotCSAqIEBzZWUgI2dldENhbGVuZGFycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJzX0NhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERvY3VtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFByb2plY3QoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQWxpYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Sb2xsdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Q2FsY3VsYXRpb25UeXBlIDxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQ2FsY3VsYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZvcm11bGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZvcm11bGEoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Gb3JtdWxhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlbGlzdFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXREZWZhdWx0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRGVmYXVsdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayA8ZW0+TWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlbmd0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGgoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcGFyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfU2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzIDxlbT5NYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrIDxlbT5NYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrKCkKLQkgKiBAc2VlICNnZXRNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWFza3NfTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFZhbHVlcygpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudGVycHJpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlYWYgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0xlYWZPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9NYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRVSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMgPGVtPk91dGxpbmUgQ29kZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRVSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZXNfT3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJlZGVjZXNzb3JMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbmsgTGFnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZygpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYWcgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlIDxlbT5UaXRsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRpdGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1RpdGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3ViamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N1YmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55IDxlbT5Db21wYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tcGFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NvbXBhbnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYW5hZ2VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dGhvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXZpc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZXZpc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TGFzdFNhdmVkIDxlbT5MYXN0IFNhdmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFzdCBTYXZlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRMYXN0U2F2ZWQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTGFzdFNhdmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZZIFN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RllTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRllTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3JpdGljYWxTbGFja0xpbWl0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5RGlnaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhcnRUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpbmlzaFRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NaW51dGVzUGVyV2VlaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EYXlzUGVyTW9udGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1dvcmtGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FYXJuZWRWYWx1ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X011bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbiA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldlZWsgU3RhcnQgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdlZWtTdGFydERheSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXR1cyBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3RhdHVzRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVudERhdGUgPGVtPkN1cnJlbnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW50RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRvbGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUgPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0V4dGVuZGVkQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfT3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1dCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9FeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9DYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlIDxlbT5SYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGVzIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzRnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNUbyA8ZW0+UmF0ZXMgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYXRlcyBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGUgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfU3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfQ29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSgpCi0JICogQHNlZSAjZ2V0UmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJhdGVzX1JhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SUQgPGVtPklEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE51bGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SW5pdGlhbHMgPGVtPkluaXRpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TlQgQWNjb3VudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTlRBY2NvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX01hdGVyaWFsTGFiZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb2RlIDxlbT5Db2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0VtYWlsQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4IFVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX01heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVhayBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FuIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ2FuTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCA8ZW0+QWNjcnVlIEF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWNjcnVlIEF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RQZXJVc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0UGVyVXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDVigpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0lzR2VuZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNJbmFjdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0Jvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3RpdmVEaXJlY3RvcnlHVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJhdGVzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfUmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMjZ2V0UmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlc19SZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEIDxlbT5JRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBOdWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDcmVhdGVEYXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NyZWF0ZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db250YWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29udGFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTIDxlbT5XQlM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XQlM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dCUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldCUyBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlNMZXZlbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19XQlNMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdXRsaW5lIE51bWJlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVOdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJpb3JpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVjdXJyaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlY3VycmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19NaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1bW1hcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JpdGljYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Dcml0aWNhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N1YnByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2tQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybHlTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcmx5IEZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseUZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGF0ZSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGF0ZVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGF0ZUZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJlZSBTbGFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRnJlZVNsYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvdGFsIFNsYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRvdGFsU2xhY2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVG90YWxTbGFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbEZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QUNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWFkbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EZWFkbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGlkZSBCYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0hpZGVCYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb2xsdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUm9sbHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BoeXNpY2FsUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19QcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QmFzZWxpbmUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX091dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tzX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gcm9tIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUoKQotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVQZXJpb2RfRnJvbURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlKCkKLQkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX1RvRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUgPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRpbWVwaGFzZWREYXRhVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VW5pdCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZV9WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0UGFyZW50VmFsdWVJRCA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfUGFyZW50VmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyIDxlbT5WYWx1ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhbHVlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRJRCA8ZW0+SUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmFsdWVMaXN0X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVzX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhbHVlc19WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V0JTTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGV2ZWwoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZW5ndGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXBhcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1NlcGFyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19WZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRQcmVmaXgoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19QcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFdCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0V0JTTWFzaygpCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdCU01hc2tzX1dCU01hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdlZWtEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0RGF5VHlwZSgpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0VGltZVBlcmlvZCgpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRXb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFdvcmtpbmdUaW1lcygpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWVrRGF5cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cyNnZXRXZWVrRGF5KCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheXNfV2Vla0RheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtpbmdUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUgPGVtPkZyb20gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZyb20gVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUoKQotCSAqIEBzZWUgI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX1RvVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JraW5nVGltZXNfV29ya2luZ1RpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+QWNjcnVlIEF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BY2NydWUgQXQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQWNjcnVlQXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWNjcnVlQXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjdGl2ZURpcmVjdG9yeUdVSURfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScxNiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BbGlhcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBbGlhc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRBbGlhc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BdXRob3IgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0F1dGhvcl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QXV0aG9yVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiA3IDggOSAxMCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Qm9va2luZyBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jvb2tpbmdUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Qm9va2luZyBUeXBlIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQm9va2luZ1R5cGVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkNhbGN1bGF0aW9uIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGN1bGF0aW9uVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDYWxjdWxhdGlvblR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2F0ZWdvcnlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENhdGVnb3J5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvZGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29kZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb2RlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb2RlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbXBhbnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb21wYW55Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb21wYW55VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29uc3RyYWludCBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29uc3RyYWludFR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENvbnN0cmFpbnRUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbnRhY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29udGFjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250YWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb250YWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29zdFJhdGVUYWJsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0N1cnJlbmN5U3ltYm9sUG9zaXRpb25fLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkN1cnJlbmN5IFN5bWJvbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VycmVuY3lTeW1ib2xfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScyMCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkRheSBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGF5VHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGF5VHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVmYXVsdFRhc2tFVk1ldGhvZF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0VGFza1R5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU1KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Vhcm5lZFZhbHVlTWV0aG9kXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVtYWlsIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRW1haWxBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFbWFpbEFkZHJlc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBlbnVtZXJhdGlvbj0nMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0ZZU3RhcnREYXRlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZZU3RhcnREYXRlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkdyb3VwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkdyb3VwIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0dyb3VwXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRHcm91cFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Jbml0aWFscyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Jbml0aWFscyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdJbml0aWFsc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SW5pdGlhbHNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TGFnIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xhZ0Zvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExhZ0Zvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk1hbmFnZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYW5hZ2VyXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNYW5hZ2VyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01hdGVyaWFsTGFiZWxfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE1hdGVyaWFsTGFiZWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmFtZSBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZV8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk5hbWUgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5hbWUgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROYW1lVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OYW1lIFR5cGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lXy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzI1NSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TmFtZVR5cGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05ld1Rhc2tTdGFydERhdGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TlQgQWNjb3VudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05UQWNjb3VudF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TlRBY2NvdW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVOdW1iZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE91dGxpbmVOdW1iZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaG9uZXRpY0FsaWFzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTAnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBob25ldGljQWxpYXNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+UGhvbmV0aWNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaG9uZXRpY3NfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBob25ldGljc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QcmVmaXggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UHJlZml4IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ByZWZpeF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRQcmVmaXhUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlJhdGUgVGFibGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JhdGVUYWJsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UmF0ZVRhYmxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGx1cFR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFJvbGx1cFR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1N0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN1YmplY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3ViamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdWJqZWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdWJqZWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TdWJwcm9qZWN0IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3VicHJvamVjdE5hbWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN1YnByb2plY3ROYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlRpdGxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRpdGxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RpdGxlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUaXRsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlMzwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlNDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fNF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5VSUQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VUlEIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1VJRF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzE2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVSURUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlVuaXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VW5pdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1VuaXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDUgOCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VW5pdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZWxpc3RTb3J0T3JkZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXZWVrU3RhcnREYXlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXZWVrU3RhcnREYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPldvcmsgQ29udG91ciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrQ29udG91cl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrQ29udG91clR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrRm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldvcmsgR3JvdXAgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrR3JvdXBfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrR3JvdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNc3Byb2plY3RGYWN0b3J5IGdldE1zcHJvamVjdEZhY3RvcnkoKTsKLQotfSAvL01zcHJvamVjdFBhY2thZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxOWFmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRWYWx1ZXMgPGVtPlZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MgPGVtPk1hc2tzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVDb2RlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfQWxpYXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfUGhvbmV0aWNBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY0FsaWFzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZXMoVmFsdWVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX1ZhbHVlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlcyBnZXRWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZXMoVmFsdWVzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGlzIGFuIGVudGVycHJpc2UgY3VzdG9tIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICN1bnNldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldEVudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFbnRlcnByaXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldEVudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGNhbiBiZSB1c2VkIGJ5IHRoZSBSZXNvdXJjZSBTdWJzdGl0dXRpb24gV2l6YXJkIGluIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9SZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZWFmIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVhZiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICN1bnNldExlYWZPbmx5KCkKLQkgKiBAc2VlICNzZXRMZWFmT25seShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0xlYWZPbmx5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZWFmT25seScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMZWFmT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlYWYgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZWFmT25seSgpCi0JICogQHNlZSAjdW5zZXRMZWFmT25seSgpCi0JICogQHNlZSAjaXNMZWFmT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVhZk9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSA8ZW0+TGVhZiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAc2VlICNzZXRMZWFmT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGVhZk9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlYWYgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBzZWUgI3NldExlYWZPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZWFmT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxsIExldmVscyBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbGxMZXZlbHNSZXF1aXJlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0QWxsTGV2ZWxzUmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFsbExldmVsc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHZhbHVlcyBzcGVjaWZpZWQgbXVzdCBjb21lIGZyb20gdmFsdWVzIHRhYmxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09ubHlUYWJsZVZhbHVlc0FsbG93ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFza3MoTWFza3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfTWFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hc2tzIGdldE1hc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldE1hc2tzIDxlbT5NYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXNrcyhNYXNrcyB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDMwMWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBPdXRsaW5lQ29kZTIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjVlODMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUzX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlM19WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2ODYyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRsaW5lQ29kZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5kaXZpZHVhbCBvdXRsaW5lIGNvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVzX091dGxpbmVDb2RlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPdXRsaW5lQ29kZSgpOwotCi19IC8vIE91dGxpbmVDb2RlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9QcmVkZWNlc3NvckxpbmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJlZGVjZXNzb3JMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2FiN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9QcmVkZWNlc3NvckxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByZWRlY2Vzc29yTGluay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNpc0Nyb3NzUHJvamVjdCA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0IDxlbT5MYWcgRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcmVkZWNlc3NvckxpbmtfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJlZGVjZXNzb3JMaW5rIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByZWRlY2Vzc29yIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVkZWNlc3NvclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19QcmVkZWNlc3NvclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3JVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFByZWRlY2Vzc29yVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVkZWNlc3NvclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsaW5rIHR5cGUuICBWYWx1ZXMgYXJlIDA9RkYsIDE9RlMsIDI9U0YgYW5kIDM9U1MKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcmVkZWNlc3NvciBpcyBwYXJ0IG9mIGFub3RoZXIgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nyb3NzUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcm9zc1Byb2plY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q3Jvc3NQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRDcm9zc1Byb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENyb3NzUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXh0ZXJuYWwgcHJlZGVjZXNzb3IgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nyb3NzUHJvamVjdE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyb3NzUHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgTGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGxhZyBpbiB0ZW50aHMgb2YgYSBtaW51dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBMYWc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpbmtMYWcoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGlua0xhZycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGlua0xhZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgTGFnPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaW5rTGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rTGFnKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFnIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgbGFnIGZvcm1hdC4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFnIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFnRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX0xhZ0Zvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkxhZ0Zvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xhZ0Zvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGFnRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhZyBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhZ0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFnRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIFByZWRlY2Vzc29yTGluawpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Qcm9qZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Byb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4MDcwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9qZWN0LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUaXRsZSA8ZW0+VGl0bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q29tcGFueSA8ZW0+Q29tcGFueTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBdXRob3IgPGVtPkF1dGhvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJldmlzaW9uIDxlbT5SZXZpc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JpdGljYWxTbGFja0xpbWl0IDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlckRheSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlcldlZWsgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREYXlzUGVyTW9udGggPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0IDxlbT5Xb3JrIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza0VWTWV0aG9kIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2plY3RfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVUlEVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaXRsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaXRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGl0bGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGl0bGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaXRsZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpdGxlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaXRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGl0bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpdGxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3ViamVjdCBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3ViamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TdWJqZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3ViamVjdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YmplY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3ViamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN1YmplY3QgPGVtPlN1YmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YmplY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1YmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YmplY3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRlZ29yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYXRlZ29yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhdGVnb3J5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2F0ZWdvcnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBhbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb21wYW55IHRoYXQgb3ducyB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcGFueTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tcGFueShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Db21wYW55KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ29tcGFueVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbXBhbnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tcGFueSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBhbnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBhbnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmFnZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtYW5hZ2VyIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5hZ2VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYW5hZ2VyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01hbmFnZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYW5hZ2VyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuYWdlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWFuYWdlciA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFuYWdlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFuYWdlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9BdXRob3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdXRob3JUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRob3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRob3IoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV2aXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9qZWN0IGhhcyBiZWVuIHNhdmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXZpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV2aXNpb24oQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1JldmlzaW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXZpc2lvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmV2aXNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldmlzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXZpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV2aXNpb24oQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXN0IFNhdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBsYXN0IHNhdmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXN0IFNhdmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXN0U2F2ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTGFzdFNhdmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGFzdFNhdmVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhc3RTYXZlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFzdCBTYXZlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXN0U2F2ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcHJvamVjdCBpcyBzY2hkdWxlZCBmcm9tIHRoZSBzdGFydCBkYXRlIG9yIGZpbmlzaCBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NjaGVkdWxlRnJvbVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyB0cnVlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIGZhbHNlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GWSBTdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBGaXNjYWwgWWVhciBzdGFydGluZyBtb250aC4gVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksIAotCSAqIAkJCQkJCTg9QXVndXN0LCA5PVNlcHRlbWJlciwgMTA9T2N0b2JlciwgMTE9Tm92ZW1iZXIsIDEyPURlY2VtYmVyIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGWVN0YXJ0RGF0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRllTdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5GWVN0YXJ0RGF0ZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZZU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGWVN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RllTdGFydERhdGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcml0aWNhbCBTbGFjayBMaW1pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkYXlzIHBhc3QgaXRzIGVuZCBkYXRlIHRoYXQgYSB0YXNrIGNhbiBnbyAKLQkgKiAJCQkJCQliZWZvcmUgTWljcm9zb2Z0IFByb2plY3QgbWFya3MgdGhhdCB0YXNrIGFzIGEgY3JpdGljYWwgdGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcml0aWNhbFNsYWNrTGltaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENyaXRpY2FsU2xhY2tMaW1pdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1cnJlbmN5IERpZ2l0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEN1cnJlbmN5RGlnaXRzKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lEaWdpdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEN1cnJlbmN5RGlnaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lEaWdpdHMgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJyZW5jeSBTeW1ib2w8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjdXJyZW5jeSBzeW1ib2wgdXNlZCBpbiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkN1cnJlbmN5U3ltYm9sVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lTeW1ib2wnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2woKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbmN5IHN5bWJvbC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW5jeVN5bWJvbFBvc2l0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0IGNhbGVuZGFyLiAgUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSAKLQkgKiAJCQkJCQlDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFydCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRTdGFydFRpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRTdGFydFRpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RGVmYXVsdFN0YXJ0VGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpbmlzaCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRGaW5pc2hUaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5UaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0RmluaXNoVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREZWZhdWx0RmluaXNoVGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdEZpbmlzaFRpbWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbnV0ZXMgUGVyIERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWludXRlc1BlckRheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWludXRlc1BlckRheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TWludXRlc1BlckRheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaW51dGVzUGVyRGF5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWludXRlcyBQZXIgV2VlazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWludXRlc1BlcldlZWsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01pbnV0ZXNQZXJXZWVrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyV2VlaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWludXRlc1BlcldlZWsoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXlzIFBlciBNb250aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERheXNQZXJNb250aChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGF5c1Blck1vbnRoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlzUGVyTW9udGgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERheXNQZXJNb250aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCA8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheXNQZXJNb250aChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFzayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRGVmYXVsdFRhc2tUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFRhc2tUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0VGFza1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZnJvbSB3aGVyZSBmaXhlZCBjb3N0cyBhcmUgYWNjcnVlZC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9U3RhcnQsIDI9UHJvcmF0ZWQsIDM9RW5kCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRGaXhlZENvc3RBY2NydWFsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0U3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhbmRhcmRSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgCi0JICogCQkJCQkJMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCAKLQkgKiAJCQkJCQk1Mz1udWxsLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHdvcmsgdW5pdCBmb3JtYXQuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya0Zvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV29ya0Zvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIG9yIG5vdCBhY3R1YWwgY29zdHMgYXJlIGVkaXRhYmxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjdW5zZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9FZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWRpdGFibGVBY3R1YWxDb3N0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICN1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib25vciBDb25zdHJhaW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICN1bnNldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hvbm9yQ29uc3RyYWludHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSG9ub3JDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3Vuc2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gY2FsY3VsYXRlIHN1YnRhc2tzIGFzIHN1bW1hcnkgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbXVsdGlwbGUgY3JpdGljYWwgcGF0aHMgYXJlIGNhbGN1bGF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI3NldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTXVsdGlwbGVDcml0aWNhbFBhdGhzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc011bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICN1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrc0VmZm9ydERyaXZlbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byBzaG93IHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24gYnkgZGVmYXVsdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrc0VzdGltYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOZXdUYXNrc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ByZWFkIEFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcHJlYWRBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3NldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHBlcmNlbnQgY29tcGxldGUgaXMgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcHJlYWRQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzayBVcGRhdGVzIFJlc291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHVwZGF0ZXMgdG8gdGFza3MgdXBkYXRlIHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza1VwZGF0ZXNSZXNvdXJjZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICN1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXNjYWwgWWVhciBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGZpc2NhbCB5ZWFyIG51bWJlcmluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmlzY2FsWWVhclN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Zpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpc2NhbFllYXJTdGFydChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRGaXNjYWxZZWFyU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlZWsgU3RhcnQgRGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9U3VuZGF5LCAxPU1vbmRheSwgMj1UdWVzZGF5LCAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBTdGFydCBEYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdlZWtTdGFydERheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV2Vla1N0YXJ0RGF5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla1N0YXJ0RGF5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla1N0YXJ0RGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXZWVrU3RhcnREYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXZWVrU3RhcnREYXkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIFN0YXJ0IERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWVrU3RhcnREYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkJCQkJCQlTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlIAotCSAqIAkJCQkJCQlzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlQ29tcGxldGVkRW5kc0JhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2sgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCQkJCQkJCVNwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgCi0JICogCQkJCQkJCXN0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVndW4gbGF0ZSAKLQkgKiAJCQkJCQkJc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgCi0JICogCQkJCQkJCWJlZm9yZSB0aGUgc3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGxhdGUgc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9QmFzZWxpbmUsIDE9QmFzZWxpbmUgMSwgMj1CYXNlbGluZSAyLCAzPUJhc2VsaW5lIDMsIDQ9QmFzZWxpbmUgNCwgNT1CYXNlbGluZSA1LCA2PUJhc2VsaW5lIDYsIAotCSAqIAkJCQkJCTc9QmFzZWxpbmUgNywgOD1CYXNlbGluZSA4LCA5PUJhc2VsaW5lIDksIDEwPUJhc2VsaW5lIDEwCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlIHBvb2wuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNzZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhdHVzIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdHVzIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXR1c0RhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3RhdHVzRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXR1c0RhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhdHVzRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0dXMgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhdHVzRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdHVzRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVudCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVudERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVudERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW50RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDdXJyZW50RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3VycmVudERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbnREYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIGJ5IGEgUHJvamVjdCBTZXJ2ZXIgdXNlciBhcyBvcHBvc2VkIHRvIGFuIE5UIHVzZXIuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9NaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0b2xpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gYXV0b2xpbmsgaW5zZXJ0ZWQgb3IgbW92ZWQgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0b2xpbmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F1dG9saW5rJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRvbGluayhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0b2xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvbGluazwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI2lzQXV0b2xpbmsoKQotCSAqIEBzZWUgI3NldEF1dG9saW5rKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRvbGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZGF0ZSBmb3IgbmV3IHRhc2tzIHN0YXJ0LiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1Qcm9qZWN0IFN0YXJ0IERhdGUsIDE9Q3VycmVudCBEYXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5ld1Rhc2tTdGFydERhdGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OZXdUYXNrU3RhcnREYXRlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmV3VGFza1N0YXJ0RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tTdGFydERhdGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBlYXJuZWQgdmFsdWUgbWV0aG9kIGZvciB0YXNrcy4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFRhc2tFVk1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IFhNTCB3YXMgZWRpdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIDxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZENyZWF0aW9uRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbHMgSW4gU3luYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBhbGwgYWN0dWFsIHdvcmsgaGFzIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbHNJblN5bmMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjdW5zZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbHNJblN5bmMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFjdHVhbHNJblN5bmMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjc2V0QWN0dWFsc0luU3luYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byByZW1vdmUgYWxsIGZpbGUgcHJvcGVydGllcyBvbiBzYXZlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbW92ZUZpbGVQcm9wZXJ0aWVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkbWluIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gYWRtaW5pc3RyYXRpdmUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW4gUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRtaW5Qcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0FkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZG1pblByb2plY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIFByb2plY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3NldEFkbWluUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWRtaW5Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBvdXRsaW5lIGNvZGUgZGVmaW5pdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LiAgVGhlc2UgY29kZXMgbWF5IGJlIGFzc29jaWF0ZWQgb25seSB3aXRoIHRoaXMgcHJvamVjdCwgb3IgbWF5IGJlIGNvbW1vbiBhbW9uZyBzZXZlcmFsIHByb2plY3RzIChlbnRlcnByaXNlIGNvZGVzKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dGxpbmVDb2RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlcyBnZXRPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0YWJsZSBvZiBlbnRyaWVzIHRoYXQgZGVmaW5lIHRoZSBvdXRsaW5lIGNvZGUgbWFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXQlNNYXNrcyhXQlNNYXNrcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1dCU01hc2tzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV0JTTWFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXQlNNYXNrcyBnZXRXQlNNYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzIDxlbT5XQlMgTWFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldCUyBNYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCU01hc2tzKFdCU01hc2tzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAKLQkgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0V4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgCi0JICogICAgICAgICBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhbGVuZGFycyhDYWxlbmRhcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYWxlbmRhcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhcnMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWxlbmRhcnMgZ2V0Q2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhcnMoQ2FsZW5kYXJzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB0YXNrcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhc2tzKFRhc2tzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tzIGdldFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2tzKFRhc2tzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4KLQkgKiAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlc291cmNlcyhSZXNvdXJjZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9SZXNvdXJjZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNvdXJjZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZXMoUmVzb3VyY2VzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBhc3NpZ25tZW50cyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lnbm1lbnRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzaWdubWVudHMgZ2V0QXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMgdmFsdWUpOwotCi19IC8vIFByb2plY3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTQ4MDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSYXRlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvIDxlbT5SYXRlcyBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmF0ZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSYXRlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZXMgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYXRlc0Zyb20oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfUmF0ZXNGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSYXRlc0Zyb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXNGcm9tKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlcyBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByYXRlIGlzIGVmZmVjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmF0ZXNUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlc1RvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzVG8nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmF0ZXNUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZXNUbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXNUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZSBUYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BLCAxPUIsIDI9QywgMz1ELCA0PUUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmF0ZVRhYmxlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlVGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlVGFibGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSYXRlVGFibGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlVGFibGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhbmRhcmQgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX1N0YW5kYXJkUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfU3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX092ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfQ29zdFBlclVzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFBlclVzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi19IC8vIFJhdGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkN2VkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSYXRlc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSYXRlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmluaXRpb24gb2YgYSB0aW1lIHBlcmlvZCwgYW5kIHRoZSByYXRlcyBhcHBsaWNhYmxlIGZvciAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBkdXJpbmcgdGhhdCBwZXJpb2QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZXNfUmF0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdXBwZXI9IjI1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmF0ZSgpOwotCi19IC8vIFJhdGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjRmOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzIDxlbT5Jbml0aWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROVEFjY291bnQgPGVtPk5UIEFjY291bnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya0dyb3VwIDxlbT5Xb3JrIEdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWNjcnVlQXQgPGVtPkFjY3J1ZSBBdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVzb3VyY2VfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2UgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBsaXN0IG9mIHJlc291cmNlcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9JRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yawotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGU0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzTnVsbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNOdWxsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzTnVsbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGluaXRpYWxzIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdGlhbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0luaXRpYWxzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSW5pdGlhbHNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbml0aWFscycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbml0aWFscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0aWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbHMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBob25ldGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHNwZWxsaW5nIG9mIHRoZSByZXNvdXJjZSBuYW1lLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBob25ldGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUGhvbmV0aWNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGhvbmV0aWNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBob25ldGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TlQgQWNjb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIE5UIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROVEFjY291bnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX05UQWNjb3VudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5UQWNjb3VudFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05UQWNjb3VudCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROVEFjY291bnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROVEFjY291bnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5UQWNjb3VudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF0ZXJpYWwgTGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfTWF0ZXJpYWxMYWJlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hdGVyaWFsTGFiZWxUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXRlcmlhbExhYmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hdGVyaWFsTGFiZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hdGVyaWFsIExhYmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXRlcmlhbExhYmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29kZSBvciBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29kZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29kZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvZGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb2RlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R3JvdXAoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuR3JvdXBUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHcm91cCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JvdXAoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgR3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHdvcmtncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPURlZmF1bHQsIDE9Tm9uZSwgMj1FbWFpbCwgMz1XZWIKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrR3JvdXAoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrR3JvdXBUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrR3JvdXAnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFdvcmtHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrR3JvdXAgPGVtPldvcmsgR3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgR3JvdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya0dyb3VwKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW1haWwgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVtYWlsQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRW1haWxBZGRyZXNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRW1haWxBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVtYWlsQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW1haWxBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rQWRkcmVzc1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF4IFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEuMCI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXRzIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3NldE1heFVuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX01heFVuaXRzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMS4wIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXhVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNYXhVbml0cygpCi0JICogQHNlZSAjdW5zZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0TWF4VW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1heFVuaXRzKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1heFVuaXRzKCkKLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjc2V0TWF4VW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNYXhVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAc2VlICNzZXRNYXhVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZWFrIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pdHMgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGF0IGFueSB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1BlYWtVbml0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlYWtVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFBlYWtVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZWFrVW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cyA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZWFrIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVyQWxsb2NhdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVyQWxsb2NhdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpcnN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVGcm9tKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFibGVGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFzdCBkYXRlIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQXZhaWxhYmxlVG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVUbycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FuIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYW4gTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3Vuc2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ2FuTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbkxldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0NhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENhbkxldmVsKCkKLQkgKiBAc2VlICN1bnNldENhbkxldmVsKCkKLQkgKiBAc2VlICNpc0NhbkxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYW5MZXZlbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDYW5MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQHNlZSAjc2V0Q2FuTGV2ZWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2NydWUgQXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2NydWUgQXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjY3J1ZUF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BY2NydWVBdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWNjcnVlQXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEFjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjY3J1ZUF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVndWxhcldvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlZ3VsYXJXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVndWxhcldvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbFdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBhY3R1YWwgb3ZlcnRpbWUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiByZW1haW5pbmcgb3ZlcnRpbWUgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2Ugb2Ygd29yayBjb21wbGV0ZWQgYWNyb3NzIGFsbCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJjZW50V29ya0NvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YW5kYXJkIHJhdGUgb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgcHJvamVjdCBjb3N0IGZvciB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG92ZXJ0aW1lIHJhdGUgb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgb3ZlcnRpbWUgY29zdCBmb3IgdGhlIHJlc291cmNlIGluY2x1ZGluZyBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0cy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFBlclVzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgc2NoZWR1bGUgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U1YoKQotCSAqIEBzZWUgI3Vuc2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRTVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNWKCkKLQkgKiBAc2VlICN1bnNldFNWKCkKLQkgKiBAc2VlICNnZXRTVigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U1YoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ1YoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDVicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENWKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlc291cmNlIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Ob3RlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBHZW5lcmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZ2VuZXJpYy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjdW5zZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzR2VuZXJpYygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNHZW5lcmljJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzR2VuZXJpYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYyA8ZW0+SXMgR2VuZXJpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgR2VuZXJpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3Vuc2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNHZW5lcmljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEdlbmVyaWM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBJbmFjdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNldCB0byBpbmFjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICN1bnNldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0luYWN0aXZlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgSW5hY3RpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjdW5zZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzSW5hY3RpdmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNzZXRJc0luYWN0aXZlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFbnRlcnByaXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgYW4gRW50ZXJwcmlzZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjdW5zZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzRW50ZXJwcmlzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNFbnRlcnByaXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSByZXNvdXJjZS4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Cb29raW5nVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJvb2tpbmdUeXBlVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jvb2tpbmdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgQWN0aXZlIERpcmVjdG9yeSBHVUlEIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3RpdmVEaXJlY3RvcnlHVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdGl2ZURpcmVjdG9yeUdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZlRGlyZWN0b3J5R1VJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9CYXNlbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlbGluZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgZHVyaW5nIHdoaWNoIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZHMgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgYW5kIHRoZSByYXRlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBvbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJhdGVzKFJhdGVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JhdGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSYXRlcyBnZXRSYXRlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXMoUmF0ZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfVGltZXBoYXNlZERhdGEoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZXBoYXNlZERhdGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCi19IC8vIFJlc291cmNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiZjZmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2VzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVzb3VyY2VzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBpbiBlYWNoIFJlc291cmNlcyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlc19SZXNvdXJjZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2UoKTsKLQotfSAvLyBSZXNvdXJjZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGFzay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjQxMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFzay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENyZWF0ZURhdGUgPGVtPkNyZWF0ZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29udGFjdCA8ZW0+Q29udGFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCUyA8ZW0+V0JTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVOdW1iZXIgPGVtPk91dGxpbmUgTnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsIDxlbT5PdXRsaW5lIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVybmFsVGFza1Byb2plY3QgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQgPGVtPkVhcmx5IFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVTdGFydCA8ZW0+TGF0ZSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2ggPGVtPkxhdGUgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VG90YWxTbGFjayA8ZW0+VG90YWwgU2xhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbER1cmF0aW9uIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24gPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZWRlY2Vzc29yTGluayA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSB0YXNrIHdpdGhpbiB0aGUgbGlzdCBvZiB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0SUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRJRCA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgdGFzayBpcyBudWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Jc051bGwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzTnVsbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc051bGwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0ZURhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ3JlYXRlRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyZWF0ZURhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRlRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENyZWF0ZURhdGUgPGVtPkNyZWF0ZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRlRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbnRhY3QgcGVyc29uIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb250YWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NvbnRhY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db250YWN0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGFjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb250YWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29udGFjdCA8ZW0+Q29udGFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udGFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGFjdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGNvZGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXQlMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV0JTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dCUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXQlMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlMgPGVtPldCUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V0JTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCUyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmlnaHRtb3N0IFdCUyBsZXZlbCBvZiB0aGUgdGFzay4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXQlNMZXZlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19XQlNMZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXQlNMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXQlNMZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldCUyBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V0JTTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCU0xldmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIE51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG91dGxpbmUgbnVtYmVyIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdXRsaW5lTnVtYmVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX091dGxpbmVOdW1iZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lTnVtYmVyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZU51bWJlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPdXRsaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdXRsaW5lTnVtYmVyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdXRsaW5lTGV2ZWwoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX091dGxpbmVMZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUxldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRPdXRsaW5lTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTGV2ZWwgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE91dGxpbmVMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3V0bGluZUxldmVsKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpb3JpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBmcm9tIDAgdG8gMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcmlvcml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJpb3JpdHkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByaW9yaXR5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmlvcml0eScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmlvcml0eSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW9yaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmlvcml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpb3JpdHkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBsYW5uZWQgZHVyYXRpb24gb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0R1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2suICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlNCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHdhcyBzdG9wcGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0b3AoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3RvcCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0b3AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RvcCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0b3AgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0b3AoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgdGFzayByZXN1bWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1Jlc3VtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZXN1bWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdW1lIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGNhbiBiZSByZXN1bWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjdW5zZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjc2V0UmVzdW1lVmFsaWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1Jlc3VtZVZhbGlkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXN1bWVWYWxpZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXN1bWVWYWxpZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lIFZhbGlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICN1bnNldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXN1bWVWYWxpZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjaXNSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjc2V0UmVzdW1lVmFsaWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI3NldFJlc3VtZVZhbGlkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXN1bWVWYWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWZmb3J0IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBlZmZvcnQtZHJpdmVuLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FZmZvcnREcml2ZW4oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VmZm9ydERyaXZlbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVjdXJyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGEgcmVjdXJyaW5nIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVjdXJyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjdW5zZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVjdXJyaW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWN1cnJpbmcnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVjdXJyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjdW5zZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI2lzUmVjdXJyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWN1cnJpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWN1cnJpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlY3VycmluZygpCi0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBvdmVyYWxsb2NhdGVkLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdmVyQWxsb2NhdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVyQWxsb2NhdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlckFsbG9jYXRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgZXN0aW1hdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0VzdGltYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXN0aW1hdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGEgbWlsZXN0b25lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX01pbGVzdG9uZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWlsZXN0b25lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VtbWFyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBhIHN1bW1hcnkgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0U3VtbWFyeSgpCi0JICogQHNlZSAjc2V0U3VtbWFyeShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3VtbWFyeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VtbWFyeScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0U3VtbWFyeSgpCi0JICogQHNlZSAjaXNTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdW1tYXJ5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQHNlZSAjc2V0U3VtbWFyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBzZWUgI3NldFN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyaXRpY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGluIHRoZSBjcml0aWNhbCBjaGFpbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjdW5zZXRDcml0aWNhbCgpCi0JICogQHNlZSAjc2V0Q3JpdGljYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NyaXRpY2FsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcml0aWNhbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDcml0aWNhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjdW5zZXRDcml0aWNhbCgpCi0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JpdGljYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQHNlZSAjc2V0Q3JpdGljYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENyaXRpY2FsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENyaXRpY2FsKCkKLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAc2VlICNzZXRDcml0aWNhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q3JpdGljYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgYW4gaW5zZXJ0ZWQgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSXNTdWJwcm9qZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc1N1YnByb2plY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNTdWJwcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3VicHJvamVjdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNTdWJwcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1N1YnByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBpbnNlcnRlZCBwcm9qZWN0IGlzIHJlYWQtb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc1N1YnByb2plY3RSZWFkT25seScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1N1YnByb2plY3RSZWFkT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YnByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgaW5zZXJ0ZWQgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN1YnByb2plY3ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N1YnByb2plY3ROYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3VicHJvamVjdE5hbWVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJwcm9qZWN0TmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdWJwcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3VicHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YnByb2plY3ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBUYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGV4dGVybmFsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICN1bnNldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FeHRlcm5hbFRhc2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsVGFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFeHRlcm5hbFRhc2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3Vuc2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFeHRlcm5hbFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEV4dGVybmFsVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc291cmNlIGxvY2F0aW9uIGFuZCB0YXNrIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2tQcm9qZWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0V4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxUYXNrUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcmx5IFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWFybHkgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWFybHlTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FYXJseVN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybHlTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFYXJseVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlTdGFydCA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFYXJseVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJseVN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FYXJseSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlYXJseSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVhcmx5RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Vhcmx5RmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybHlGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RWFybHlGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCA8ZW0+RWFybHkgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJseUZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGF0ZSBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhdGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXRlU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGF0ZVN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGF0ZVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhdGVTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVTdGFydCA8ZW0+TGF0ZSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGF0ZSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGF0ZVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXRlU3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhdGUgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGF0ZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGF0ZUZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MYXRlRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGF0ZUZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRMYXRlRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZUZpbmlzaCA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXRlRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXRlRmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIHN0YXJ0IGRhdGUgZnJvbSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdGFydFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgZmluaXNoIGRhdGUgZnJvbSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19GaW5pc2hWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGFzayB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV29ya1ZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1ZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZyZWUgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgZnJlZSBzbGFjay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GcmVlIFNsYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcmVlU2xhY2soQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZyZWVTbGFjaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRnJlZVNsYWNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGcmVlU2xhY2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2sgPGVtPkZyZWUgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyZWUgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZyZWVTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJlZVNsYWNrKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG90YWwgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgdG90YWwgc2xhY2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG90YWwgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRvdGFsU2xhY2soQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1RvdGFsU2xhY2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RvdGFsU2xhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFRvdGFsU2xhY2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG90YWwgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvdGFsU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvdGFsU2xhY2soQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXhlZCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZml4ZWQgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjdW5zZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3NldEZpeGVkQ29zdChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpeGVkQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpeGVkQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEZpeGVkQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpeGVkQ29zdChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3NldEZpeGVkQ29zdChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpeGVkQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjc2V0Rml4ZWRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Rml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyB0aGUgZml4ZWQgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1Qcm9yYXRlZCBhbmQgMz1FbmQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaXhlZENvc3RBY2NydWFsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5GaXhlZENvc3RBY2NydWFsVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRml4ZWRDb3N0QWNjcnVhbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpeGVkQ29zdEFjY3J1YWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIGR1cmF0aW9uIGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1BlcmNlbnRDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudENvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayB3b3JrIGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlcmNlbnRXb3JrQ29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGR1cmF0aW9uIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxEdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbER1cmF0aW9uIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbER1cmF0aW9uKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgd29yayBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgd29yayBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZ3VsYXJXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlZ3VsYXJXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVndWxhcldvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlIHVuZmluaXNoZWQgcG9ydGlvbiBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ0R1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdEdXJhdGlvbiA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdEdXJhdGlvbihPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3QgcHJvamVjdGVkIHRvIGZpbmlzaCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gZmluaXNoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQUNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEFDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QUNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbnN0cmFpbnQgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QXMgU29vbiBBcyBQb3NzaWJsZSwgMT1BcyBMYXRlIEFzIFBvc3NpYmxlLCAyPU11c3QgU3RhcnQgT24sIDM9TXVzdCBGaW5pc2ggT24sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1TdGFydCBObyBFYXJsaWVyIFRoYW4sIDU9U3RhcnQgTm8gTGF0ZXIgVGhhbiwgNj1GaW5pc2ggTm8gRWFybGllciBUaGFuIGFuZCA3PUZpbmlzaCBObyBMYXRlciBUaGFuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb25zdHJhaW50VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29uc3RyYWludFR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db25zdHJhaW50VHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnN0cmFpbnRUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDb25zdHJhaW50VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cmFpbnRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGFzayBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSBhcmd1bWVudCBmb3IgdGhlIHRhc2sgY29uc3RyYWludCB0eXBlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29uc3RyYWludERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29uc3RyYWludERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25zdHJhaW50RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDb25zdHJhaW50RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cmFpbnREYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWFkbGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlYWRsaW5lIGZvciB0aGUgdGFzayB0byBiZSBjb21wbGV0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVhZGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlYWRsaW5lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0RlYWRsaW5lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVhZGxpbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RGVhZGxpbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlYWRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWFkbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVhZGxpbmUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsIEFzc2lnbm1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIGxldmVsaW5nIGNhbiBhZGp1c3QgYXNzaWdubWVudHMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbEFzc2lnbm1lbnRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0xldmVsQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICN1bnNldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxBc3NpZ25tZW50cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBDYW4gU3BsaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbGV2ZWxpbmcgY2FuIHNwbGl0IHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICN1bnNldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3NldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nQ2FuU3BsaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjdW5zZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3NldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExldmVsaW5nQ2FuU3BsaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsaW5nRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgTGV2ZWxlZCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVMZXZlbGVkU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlTGV2ZWxlZFN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFByZUxldmVsZWRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZUxldmVsZWRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlTGV2ZWxlZEZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRQcmVMZXZlbGVkRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZUxldmVsZWRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rQWRkcmVzc1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlnbm9yZXMgdGhlIHJlc291cmNlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lnbm9yZVJlc291cmNlQ2FsZW5kYXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjdW5zZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Ob3RlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGlkZSBCYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIEdBTlRUIGJhciBvZiB0aGUgdGFzayBpcyBoaWRkZW4gd2hlbiBkaXNwbGF5ZWQgaW4gTWljcm9zb2Z0IFByb2plY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGlkZSBCYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGlkZUJhcigpCi0JICogQHNlZSAjdW5zZXRIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IaWRlQmFyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIaWRlQmFyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hpZGVCYXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEJhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIaWRlQmFyKCkKLQkgKiBAc2VlICN1bnNldEhpZGVCYXIoKQotCSAqIEBzZWUgI2lzSGlkZUJhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGlkZUJhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SGlkZUJhcigpCi0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRIaWRlQmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEJhcjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SGlkZUJhcigpCi0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRIaWRlQmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xsdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgcm9sbGVkIHVwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI3Vuc2V0Um9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JvbGx1cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sbHVwJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JvbGx1cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI3Vuc2V0Um9sbHVwKCkKLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sbHVwKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJvbGx1cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSb2xsdXAoKQotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJvbGx1cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgUHJvamVjdCBNYW5hZ2VyLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciBjYWxjdWxhdGluZyBCQ1dQLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGh5c2ljYWxQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkVhcm5lZFZhbHVlTWV0aG9kVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybmVkVmFsdWVNZXRob2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGlua30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBwcmVkZWNlc3NvciB0YXNrIG9mIHRoZSB0YXNrIHRoYXQgY29udGFpbnMgaXQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByZWRlY2Vzc29yTGluaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVkZWNlc3NvckxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBiYXNlbGluZSB2YWx1ZXMgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19CYXNlbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIG91dGxpbmUgY29kZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3V0bGluZUNvZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotfSAvLyBUYXNrCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzQzYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza3NfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza3MgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHRhc2sgaW4gZWFjaCBUYXNrcyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza3NfVGFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRhc2soKTsKLQotfSAvLyBUYXNrcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lUGVyaW9kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4Y2JhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZVBlcmlvZC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRGcm9tRGF0ZSA8ZW0+RnJvbSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlIDxlbT5UbyBEYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGltZVBlcmlvZF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUaW1lUGVyaW9kIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJvbSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gdGltZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcm9tRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZF9Gcm9tRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zyb21EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZyb21EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGcm9tRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJvbURhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb0RhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVQZXJpb2RfVG9EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFRvRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG8gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VG9EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb0RhdGUoT2JqZWN0IHZhbHVlKTsKLQotfSAvLyBUaW1lUGVyaW9kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVwaGFzZWREYXRhVHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lcGhhc2VkRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkZDBmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVwaGFzZWREYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZXBoYXNlZERhdGFUeXBlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGEgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrLgotICogCQkgICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVbml0IDxlbT5Vbml0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RpbWVwaGFzZWREYXRhVHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRpbWVwaGFzZWREYXRhVHlwZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0YXNrIHRpbWVwaGFzZWQgZGF0YS4gVmFsdWVzIGFyZToKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE9QXNzaWdubWVudCBSZW1haW5pbmcgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMj1Bc3NpZ25tZW50IEFjdHVhbCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzPUFzc2lnbm1lbnQgQWN0dWFsIE92ZXJ0aW1lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ9QXNzaWdubWVudCBCYXNlbGluZSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1PUFzc2lnbm1lbnQgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNj1Bc3NpZ25tZW50IEFjdHVhbCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3PVJlc291cmNlIEJhc2VsaW5lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDg9UmVzb3VyY2UgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgOT1UYXNrIEJhc2VsaW5lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDEwPVRhc2sgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMTE9VGFzayBQZXJjZW50IENvbXBsZXRlCi0JICogICAgICAgICAgICAgICAgICAgICAxNj1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMTc9QXNzaWdubWVudCBCYXNlbGluZSAxIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE4PVRhc2sgQmFzZWxpbmUgMSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAxOT1UYXNrIEJhc2VsaW5lIDEgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjA9UmVzb3VyY2UgQmFzZWxpbmUgMSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyMT1SZXNvdXJjZSBCYXNlbGluZSAxIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDIyPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyMz1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjQ9VGFzayBCYXNlbGluZSAyIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI1PVRhc2sgQmFzZWxpbmUgMiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyNj1SZXNvdXJjZSBCYXNlbGluZSAyIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI3PVJlc291cmNlIEJhc2VsaW5lIDIgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjg9QXNzaWdubWVudCBCYXNlbGluZSAzIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI5PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzMD1UYXNrIEJhc2VsaW5lIDMgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzE9VGFzayBCYXNlbGluZSAzIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDMyPVJlc291cmNlIEJhc2VsaW5lIDMgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzM9UmVzb3VyY2UgQmFzZWxpbmUgMyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzND1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzU9QXNzaWdubWVudCBCYXNlbGluZSA0IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM2PVRhc2sgQmFzZWxpbmUgNCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzNz1UYXNrIEJhc2VsaW5lIDQgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzg9UmVzb3VyY2UgQmFzZWxpbmUgNCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzOT1SZXNvdXJjZSBCYXNlbGluZSA0IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQwPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDI9VGFzayBCYXNlbGluZSA1IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQzPVRhc2sgQmFzZWxpbmUgNSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0ND1SZXNvdXJjZSBCYXNlbGluZSA1IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ1PVJlc291cmNlIEJhc2VsaW5lIDUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDY9QXNzaWdubWVudCBCYXNlbGluZSA2IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ3PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0OD1UYXNrIEJhc2VsaW5lIDYgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDk9VGFzayBCYXNlbGluZSA2IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDUwPVJlc291cmNlIEJhc2VsaW5lIDYgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTE9UmVzb3VyY2UgQmFzZWxpbmUgNiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA1Mj1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTM9QXNzaWdubWVudCBCYXNlbGluZSA3IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU0PVRhc2sgQmFzZWxpbmUgNyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1NT1UYXNrIEJhc2VsaW5lIDcgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTY9UmVzb3VyY2UgQmFzZWxpbmUgNyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1Nz1SZXNvdXJjZSBCYXNlbGluZSA3IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU4PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1OT1Bc3NpZ25tZW50IEJhc2VsaW5lIDggQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjA9VGFzayBCYXNlbGluZSA4IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYxPVRhc2sgQmFzZWxpbmUgOCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2Mj1SZXNvdXJjZSBCYXNlbGluZSA4IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYzPVJlc291cmNlIEJhc2VsaW5lIDggQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjQ9QXNzaWdubWVudCBCYXNlbGluZSA5IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY1PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2Nj1UYXNrIEJhc2VsaW5lIDkgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjc9VGFzayBCYXNlbGluZSA5IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY4PVJlc291cmNlIEJhc2VsaW5lIDkgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjk9UmVzb3VyY2UgQmFzZWxpbmUgOSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDcxPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNzI9VGFzayBCYXNlbGluZSAxMCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA3Mz1UYXNrIEJhc2VsaW5lIDEwIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc0PVJlc291cmNlIEJhc2VsaW5lIDEwIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc1PVJlc291cmNlIEJhc2VsaW5lIDEwIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc2PVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUKLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlMyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuIAotCSAqICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPW0sIDE9aCwgMj1kLCAzPXcsIDU9bW8sIDg9eQotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VW5pdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9Vbml0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVW5pdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VuaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVuaXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVuaXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIHBlciB1bml0IG9mIHRpbWUgZm9yIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRpbWVwaGFzZWREYXRhVHlwZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTUzOGIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFBhcmVudFZhbHVlSUQgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQgVmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJlbnRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfUGFyZW50VmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGFyZW50VmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGFyZW50VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyZW50VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZV9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBWYWx1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTg5ZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlMi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZTIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlXy5fMV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZTIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVW5pcXVlIElEIG9mIHZhbHVlIGFjcm9zcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZTJfSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0SUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWx1ZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVmFsdWUyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5MDJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZUxpc3QuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZUxpc3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlTGlzdF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZUxpc3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlTGlzdF9WYWx1ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRWYWx1ZSgpOwotCi19IC8vIFZhbHVlTGlzdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZDFjZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlc19WYWx1ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRWYWx1ZSgpOwotCi19IC8vIFZhbHVlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2OWZiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2suamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2soKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dCU01hc2tfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0JTTWFzayBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGV2ZWwgb2YgdGhlIG1hc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgbm9kZSB2YWx1ZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvbWl0dGVkIHdoZW4gbGVuZ3RoIGlzICJhbnkiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza19MZW5ndGgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xlbmd0aCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExlbmd0aChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXBhcmF0b3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfU2VwYXJhdG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTZXBhcmF0b3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcGFyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXQlNNYXNrCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTY4ODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV0JTTWFza3MuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFdCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dCU01hc2tzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdCU01hc2tzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBXQlMgY29kZXMgYXJlIHVuaXF1ZSBmb3IgbmV3IHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmVyaWZ5VW5pcXVlQ29kZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3NldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgV0JTIGNvZGVzIGFyZSBnZW5lcmF0ZWQgZm9yIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjdW5zZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0dlbmVyYXRlQ29kZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzR2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0R2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3NldEdlbmVyYXRlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEdlbmVyYXRlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByZWZpeCBmb3IgYWxsIFdCUyBjb2Rlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX1ByZWZpeCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWZpeFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWZpeCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBXQlMgTWFzayB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIHRhc2tzIGluIHRoZSBQcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XQlMgTWFzazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrc19XQlNNYXNrKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXQlNNYXNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0V0JTTWFzaygpOwotCi19IC8vIFdCU01hc2tzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEzNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2Vla0RheS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2Vla0RheV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWVrRGF5IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIGRheS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNz1TdW5kYXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERheVR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5X0RheVR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EYXlUeXBlVHlwZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RheVR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERheVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXREYXlUeXBlIDxlbT5EYXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERheVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheVR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXkgV29ya2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5IAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgd29ya2luZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjdW5zZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9EYXlXb3JraW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlXb3JraW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0RheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICN1bnNldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI2lzRGF5V29ya2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGF5V29ya2luZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZyA8ZW0+RGF5IFdvcmtpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyBhIGNvbnRpZ3VvdXMgc2V0IG9mIGV4Y2VwdGlvbiBkYXlzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lIFBlcmlvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGltZVBlcmlvZChUaW1lUGVyaW9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdlZWtEYXlfVGltZVBlcmlvZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVQZXJpb2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lUGVyaW9kIGdldFRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVQZXJpb2QoVGltZVBlcmlvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgd2Vla2RheS4gIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGFuZCB0aGVyZSBtYXkgYmUgbm8gbW9yZSB0aGFuIGZpdmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JraW5nVGltZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZXMgZ2V0V29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgdmFsdWUpOwotCi19IC8vIFdlZWtEYXkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxY2FlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdlZWtEYXlzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzI2dldFdlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dlZWtEYXlzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlZWtEYXlzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSB3ZWVrZGF5IGVpdGhlciBkZWZpbmVzIHJlZ3VsYXIgZGF5cyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBEYXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheXNfV2Vla0RheSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla0RheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdlZWtEYXkoKTsKLQotfSAvLyBXZWVrRGF5cwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE1MjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya2luZ1RpbWUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JraW5nVGltZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JraW5nVGltZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZyb20gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJlZ2lubmluZyBvZiB0aGUgd29ya2luZyB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcm9tVGltZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVfRnJvbVRpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zyb21UaW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZyb21UaW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldEZyb21UaW1lIDxlbT5Gcm9tIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyb20gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RnJvbVRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZyb21UaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UbyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZW5kIG9mIHRoZSB3b3JraW5nICB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG8gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG9UaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXb3JraW5nVGltZV9Ub1RpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RvVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRUb1RpbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0VG9UaW1lIDxlbT5UbyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvVGltZShPYmplY3QgdmFsdWUpOwotCi19IC8vIFdvcmtpbmdUaW1lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4MDBhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2luZyBUaW1lczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JraW5nVGltZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2luZ1RpbWVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSB3b3JraW5nIHRpbWUgZHVyaW5nIHRoZSB3ZWVrZGF5LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lc19Xb3JraW5nVGltZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSI1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JraW5nVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdvcmtpbmdUaW1lKCk7Ci0KLX0gLy8gV29ya2luZ1RpbWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGNhZTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFZBQyA8ZW0+VkFDPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWdubWVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzc2lnbm1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza1VJRCgpIDxlbT5UYXNrIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRBU0tfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tVSUQoKSA8ZW0+VGFzayBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2tVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHRhc2tVSUQgPSBUQVNLX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVJRCgpIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUkVTT1VSQ0VfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVUlEKCkgPGVtPlJlc291cmNlIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJlc291cmNlVUlEID0gUkVTT1VSQ0VfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxDb3N0ID0gQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbEZpbmlzaCA9IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsT3ZlcnRpbWVDb3N0ID0gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbE92ZXJ0aW1lV29yayA9IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxTdGFydCgpIDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFN0YXJ0ID0gQUNUVUFMX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29yayA9IEFDVFVBTF9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlybWVkKCkgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT05GSVJNRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlybWVkKCkgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1lZCA9IENPTkZJUk1FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29uZmlybWVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RSYXRlVGFibGUoKSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RSYXRlVGFibGUoKSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjb3N0UmF0ZVRhYmxlID0gQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0VmFyaWFuY2UoKSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY29zdFZhcmlhbmNlID0gQ09TVF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29zdCBWYXJpYW5jZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29zdFZhcmlhbmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDVl9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjViA9IENWX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDViBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY1ZFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsYXkoKSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsYXkoKSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWxheSA9IERFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2ggPSBGSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmaW5pc2hWYXJpYW5jZSA9IEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKSA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZpeGVkUmF0ZVVuaXRzID0gSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEhhcyBGaXhlZCBSYXRlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGaXhlZFJhdGVVbml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpeGVkTWF0ZXJpYWwoKSA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJWEVEX01BVEVSSUFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpeGVkTWF0ZXJpYWwoKSA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRNYXRlcmlhbCA9IEZJWEVEX01BVEVSSUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXhlZCBNYXRlcmlhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRNYXRlcmlhbEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheSgpIDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheSA9IExFVkVMSU5HX0RFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGlua2VkRmllbGRzKCkgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGlua2VkRmllbGRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTElOS0VEX0ZJRUxEU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaW5rZWRGaWVsZHMoKSA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtlZEZpZWxkcyA9IExJTktFRF9GSUVMRFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIExpbmtlZCBGaWVsZHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtlZEZpZWxkc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlMRVNUT05FX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmUgPSBNSUxFU1RPTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pbGVzdG9uZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWlsZXN0b25lRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGVzID0gTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyYWxsb2NhdGVkKCkgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9WRVJBTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlcmFsbG9jYXRlZCgpIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJhbGxvY2F0ZWQgPSBPVkVSQUxMT0NBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPdmVyYWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyYWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lQ29zdCA9IE9WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG92ZXJ0aW1lV29yayA9IE9WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHVUxBUl9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVndWxhcldvcmsgPSBSRUdVTEFSX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdXb3JrID0gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNwb25zZVBlbmRpbmcoKSA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNQT05TRV9QRU5ESU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3BvbnNlUGVuZGluZygpIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzcG9uc2VQZW5kaW5nID0gUkVTUE9OU0VfUEVORElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzcG9uc2UgUGVuZGluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzcG9uc2VQZW5kaW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9QX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0b3AoKSA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzdG9wID0gU1RPUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFU1VNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzdW1lID0gUkVTVU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFydFZhcmlhbmNlID0gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdHMoKSA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFVOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXRzKCkgPGVtPlVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHVuaXRzID0gVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1bml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VwZGF0ZU5lZWRlZCgpIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVQREFURV9ORUVERURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXBkYXRlTmVlZGVkKCkgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOZWVkZWQgPSBVUERBVEVfTkVFREVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBVcGRhdGUgTmVlZGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOZWVkZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VkFDKCkgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VkFDKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFZBQ19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWQUMoKSA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB2QUMgPSBWQUNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZBQyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdkFDRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0NvbnRvdXIoKSA8ZW0+V29yayBDb250b3VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrQ29udG91cigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfQ09OVE9VUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrQ29udG91cigpIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtDb250b3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB3b3JrQ29udG91ciA9IFdPUktfQ09OVE9VUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb29raW5nVHlwZSgpIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQk9PS0lOR19UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlID0gQk9PS0lOR19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29ya1Byb3RlY3RlZCA9IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lcGhhc2VkRGF0YSgpIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0aW1lcGhhc2VkRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBc3NpZ25tZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUYXNrVUlEKCkgewotCQlyZXR1cm4gdGFza1VJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrVUlEKEJpZ0ludGVnZXIgbmV3VGFza1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFRhc2tVSUQgPSB0YXNrVUlEOwotCQl0YXNrVUlEID0gbmV3VGFza1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRCwgb2xkVGFza1VJRCwgdGFza1VJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFJlc291cmNlVUlEKCkgewotCQlyZXR1cm4gcmVzb3VyY2VVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlciBuZXdSZXNvdXJjZVVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFJlc291cmNlVUlEID0gcmVzb3VyY2VVSUQ7Ci0JCXJlc291cmNlVUlEID0gbmV3UmVzb3VyY2VVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlELCBvbGRSZXNvdXJjZVVJRCwgcmVzb3VyY2VVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEUsIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUsIHBlcmNlbnRXb3JrQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbENvc3QgPSBhY3R1YWxDb3N0OwotCQlhY3R1YWxDb3N0ID0gbmV3QWN0dWFsQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCkgewotCQlyZXR1cm4gYWN0dWFsRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgbmV3QWN0dWFsRmluaXNoKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxGaW5pc2ggPSBhY3R1YWxGaW5pc2g7Ci0JCWFjdHVhbEZpbmlzaCA9IG5ld0FjdHVhbEZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNILCBvbGRBY3R1YWxGaW5pc2gsIGFjdHVhbEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0LCBhY3R1YWxPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrID0gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlhY3R1YWxPdmVydGltZVdvcmsgPSBuZXdBY3R1YWxPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxTdGFydCgpIHsKLQkJcmV0dXJuIGFjdHVhbFN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCBuZXdBY3R1YWxTdGFydCkgewotCQlPYmplY3Qgb2xkQWN0dWFsU3RhcnQgPSBhY3R1YWxTdGFydDsKLQkJYWN0dWFsU3RhcnQgPSBuZXdBY3R1YWxTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQsIG9sZEFjdHVhbFN0YXJ0LCBhY3R1YWxTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLLCBvbGRBY3R1YWxXb3JrLCBhY3R1YWxXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEFDV1AoKSB7Ci0JCXJldHVybiBhQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFDV1AoZmxvYXQgbmV3QUNXUCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYUNXUCA9IG5ld0FDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1AsIG9sZEFDV1AsIGFDV1AsICFvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QUNXUCgpIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0JCWFDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlybWVkKCkgewotCQlyZXR1cm4gY29uZmlybWVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpcm1lZChib29sZWFuIG5ld0NvbmZpcm1lZCkgewotCQlib29sZWFuIG9sZENvbmZpcm1lZCA9IGNvbmZpcm1lZDsKLQkJY29uZmlybWVkID0gbmV3Q29uZmlybWVkOwotCQlib29sZWFuIG9sZENvbmZpcm1lZEVTZXQgPSBjb25maXJtZWRFU2V0OwotCQljb25maXJtZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQsIG9sZENvbmZpcm1lZCwgY29uZmlybWVkLCAhb2xkQ29uZmlybWVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29uZmlybWVkKCkgewotCQlib29sZWFuIG9sZENvbmZpcm1lZCA9IGNvbmZpcm1lZDsKLQkJYm9vbGVhbiBvbGRDb25maXJtZWRFU2V0ID0gY29uZmlybWVkRVNldDsKLQkJY29uZmlybWVkID0gQ09ORklSTUVEX0VERUZBVUxUOwotCQljb25maXJtZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQsIG9sZENvbmZpcm1lZCwgQ09ORklSTUVEX0VERUZBVUxULCBvbGRDb25maXJtZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb25maXJtZWQoKSB7Ci0JCXJldHVybiBjb25maXJtZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoQmlnRGVjaW1hbCBuZXdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDb3N0UmF0ZVRhYmxlKCkgewotCQlyZXR1cm4gY29zdFJhdGVUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgbmV3Q29zdFJhdGVUYWJsZSkgewotCQlCaWdJbnRlZ2VyIG9sZENvc3RSYXRlVGFibGUgPSBjb3N0UmF0ZVRhYmxlOwotCQljb3N0UmF0ZVRhYmxlID0gbmV3Q29zdFJhdGVUYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEUsIG9sZENvc3RSYXRlVGFibGUsIGNvc3RSYXRlVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCBuZXdDb3N0VmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkQ29zdFZhcmlhbmNlID0gY29zdFZhcmlhbmNlOwotCQljb3N0VmFyaWFuY2UgPSBuZXdDb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgY29zdFZhcmlhbmNlLCAhb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCwgb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DViwgb2xkQ1YsIGNWLCAhb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDVigpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWID0gQ1ZfRURFRkFVTFQ7Ci0JCWNWRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1YsIG9sZENWLCBDVl9FREVGQVVMVCwgb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDVigpIHsKLQkJcmV0dXJuIGNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREZWxheSgpIHsKLQkJcmV0dXJuIGRlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGF5KEJpZ0ludGVnZXIgbmV3RGVsYXkpIHsKLQkJQmlnSW50ZWdlciBvbGREZWxheSA9IGRlbGF5OwotCQlkZWxheSA9IG5ld0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZLCBvbGREZWxheSwgZGVsYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCkgewotCQlyZXR1cm4gZmluaXNoVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciBuZXdGaW5pc2hWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZEZpbmlzaFZhcmlhbmNlID0gZmluaXNoVmFyaWFuY2U7Ci0JCWZpbmlzaFZhcmlhbmNlID0gbmV3RmluaXNoVmFyaWFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFLCBvbGRGaW5pc2hWYXJpYW5jZSwgZmluaXNoVmFyaWFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGluaygpIHsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIG5ld0h5cGVybGluaykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rID0gaHlwZXJsaW5rOwotCQloeXBlcmxpbmsgPSBuZXdIeXBlcmxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LLCBvbGRIeXBlcmxpbmssIGh5cGVybGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpIHsKLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgbmV3SHlwZXJsaW5rQWRkcmVzcykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rQWRkcmVzcyA9IGh5cGVybGlua0FkZHJlc3M7Ci0JCWh5cGVybGlua0FkZHJlc3MgPSBuZXdIeXBlcmxpbmtBZGRyZXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTLCBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzLCBoeXBlcmxpbmtTdWJBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgbmV3V29ya1ZhcmlhbmNlKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJd29ya1ZhcmlhbmNlID0gbmV3V29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIFdPUktfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYXNGaXhlZFJhdGVVbml0cygpIHsKLQkJcmV0dXJuIGhhc0ZpeGVkUmF0ZVVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc0ZpeGVkUmF0ZVVuaXRzKGJvb2xlYW4gbmV3SGFzRml4ZWRSYXRlVW5pdHMpIHsKLQkJYm9vbGVhbiBvbGRIYXNGaXhlZFJhdGVVbml0cyA9IGhhc0ZpeGVkUmF0ZVVuaXRzOwotCQloYXNGaXhlZFJhdGVVbml0cyA9IG5ld0hhc0ZpeGVkUmF0ZVVuaXRzOwotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGhhc0ZpeGVkUmF0ZVVuaXRzRVNldDsKLQkJaGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUywgb2xkSGFzRml4ZWRSYXRlVW5pdHMsIGhhc0ZpeGVkUmF0ZVVuaXRzLCAhb2xkSGFzRml4ZWRSYXRlVW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpIHsKLQkJYm9vbGVhbiBvbGRIYXNGaXhlZFJhdGVVbml0cyA9IGhhc0ZpeGVkUmF0ZVVuaXRzOwotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGhhc0ZpeGVkUmF0ZVVuaXRzRVNldDsKLQkJaGFzRml4ZWRSYXRlVW5pdHMgPSBIQVNfRklYRURfUkFURV9VTklUU19FREVGQVVMVDsKLQkJaGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUywgb2xkSGFzRml4ZWRSYXRlVW5pdHMsIEhBU19GSVhFRF9SQVRFX1VOSVRTX0VERUZBVUxULCBvbGRIYXNGaXhlZFJhdGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhhc0ZpeGVkUmF0ZVVuaXRzKCkgewotCQlyZXR1cm4gaGFzRml4ZWRSYXRlVW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRml4ZWRNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGZpeGVkTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rml4ZWRNYXRlcmlhbChib29sZWFuIG5ld0ZpeGVkTWF0ZXJpYWwpIHsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsID0gZml4ZWRNYXRlcmlhbDsKLQkJZml4ZWRNYXRlcmlhbCA9IG5ld0ZpeGVkTWF0ZXJpYWw7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbEVTZXQgPSBmaXhlZE1hdGVyaWFsRVNldDsKLQkJZml4ZWRNYXRlcmlhbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMLCBvbGRGaXhlZE1hdGVyaWFsLCBmaXhlZE1hdGVyaWFsLCAhb2xkRml4ZWRNYXRlcmlhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpeGVkTWF0ZXJpYWwoKSB7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbCA9IGZpeGVkTWF0ZXJpYWw7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbEVTZXQgPSBmaXhlZE1hdGVyaWFsRVNldDsKLQkJZml4ZWRNYXRlcmlhbCA9IEZJWEVEX01BVEVSSUFMX0VERUZBVUxUOwotCQlmaXhlZE1hdGVyaWFsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwsIG9sZEZpeGVkTWF0ZXJpYWwsIEZJWEVEX01BVEVSSUFMX0VERUZBVUxULCBvbGRGaXhlZE1hdGVyaWFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Rml4ZWRNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGZpeGVkTWF0ZXJpYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheSA9IGxldmVsaW5nRGVsYXk7Ci0JCWxldmVsaW5nRGVsYXkgPSBuZXdMZXZlbGluZ0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZLCBvbGRMZXZlbGluZ0RlbGF5LCBsZXZlbGluZ0RlbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXlGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJbGV2ZWxpbmdEZWxheUZvcm1hdCA9IG5ld0xldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFULCBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0LCBsZXZlbGluZ0RlbGF5Rm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaW5rZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBsaW5rZWRGaWVsZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua2VkRmllbGRzKGJvb2xlYW4gbmV3TGlua2VkRmllbGRzKSB7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzID0gbGlua2VkRmllbGRzOwotCQlsaW5rZWRGaWVsZHMgPSBuZXdMaW5rZWRGaWVsZHM7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzRVNldCA9IGxpbmtlZEZpZWxkc0VTZXQ7Ci0JCWxpbmtlZEZpZWxkc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFMsIG9sZExpbmtlZEZpZWxkcywgbGlua2VkRmllbGRzLCAhb2xkTGlua2VkRmllbGRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGlua2VkRmllbGRzKCkgewotCQlib29sZWFuIG9sZExpbmtlZEZpZWxkcyA9IGxpbmtlZEZpZWxkczsKLQkJYm9vbGVhbiBvbGRMaW5rZWRGaWVsZHNFU2V0ID0gbGlua2VkRmllbGRzRVNldDsKLQkJbGlua2VkRmllbGRzID0gTElOS0VEX0ZJRUxEU19FREVGQVVMVDsKLQkJbGlua2VkRmllbGRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUywgb2xkTGlua2VkRmllbGRzLCBMSU5LRURfRklFTERTX0VERUZBVUxULCBvbGRMaW5rZWRGaWVsZHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5rZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBsaW5rZWRGaWVsZHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIG5ld01pbGVzdG9uZSkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJbWlsZXN0b25lID0gbmV3TWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgbWlsZXN0b25lLCAhb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWlsZXN0b25lKCkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCQltaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgTUlMRVNUT05FX0VERUZBVUxULCBvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90ZXMoKSB7Ci0JCXJldHVybiBub3RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RlcyhTdHJpbmcgbmV3Tm90ZXMpIHsKLQkJU3RyaW5nIG9sZE5vdGVzID0gbm90ZXM7Ci0JCW5vdGVzID0gbmV3Tm90ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3ZlcmFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJhbGxvY2F0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuIG5ld092ZXJhbGxvY2F0ZWQpIHsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkID0gb3ZlcmFsbG9jYXRlZDsKLQkJb3ZlcmFsbG9jYXRlZCA9IG5ld092ZXJhbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlcmFsbG9jYXRlZEVTZXQgPSBvdmVyYWxsb2NhdGVkRVNldDsKLQkJb3ZlcmFsbG9jYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQsIG9sZE92ZXJhbGxvY2F0ZWQsIG92ZXJhbGxvY2F0ZWQsICFvbGRPdmVyYWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T3ZlcmFsbG9jYXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkID0gb3ZlcmFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkRVNldCA9IG92ZXJhbGxvY2F0ZWRFU2V0OwotCQlvdmVyYWxsb2NhdGVkID0gT1ZFUkFMTE9DQVRFRF9FREVGQVVMVDsKLQkJb3ZlcmFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQsIG9sZE92ZXJhbGxvY2F0ZWQsIE9WRVJBTExPQ0FURURfRURFRkFVTFQsIG9sZE92ZXJhbGxvY2F0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPdmVyYWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlcmFsbG9jYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZE92ZXJ0aW1lQ29zdCA9IG92ZXJ0aW1lQ29zdDsKLQkJb3ZlcnRpbWVDb3N0ID0gbmV3T3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUkssIG9sZE92ZXJ0aW1lV29yaywgb3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUkssIG9sZFJlZ3VsYXJXb3JrLCByZWd1bGFyV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCBuZXdSZW1haW5pbmdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nQ29zdCA9IHJlbWFpbmluZ0Nvc3Q7Ci0JCXJlbWFpbmluZ0Nvc3QgPSBuZXdSZW1haW5pbmdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmsgPSByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lV29yayA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IG5ld1JlbWFpbmluZ1dvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ1dvcmsgPSByZW1haW5pbmdXb3JrOwotCQlyZW1haW5pbmdXb3JrID0gbmV3UmVtYWluaW5nV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzcG9uc2VQZW5kaW5nKCkgewotCQlyZXR1cm4gcmVzcG9uc2VQZW5kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlUGVuZGluZyhib29sZWFuIG5ld1Jlc3BvbnNlUGVuZGluZykgewotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZyA9IHJlc3BvbnNlUGVuZGluZzsKLQkJcmVzcG9uc2VQZW5kaW5nID0gbmV3UmVzcG9uc2VQZW5kaW5nOwotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZ0VTZXQgPSByZXNwb25zZVBlbmRpbmdFU2V0OwotCQlyZXNwb25zZVBlbmRpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HLCBvbGRSZXNwb25zZVBlbmRpbmcsIHJlc3BvbnNlUGVuZGluZywgIW9sZFJlc3BvbnNlUGVuZGluZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3BvbnNlUGVuZGluZygpIHsKLQkJYm9vbGVhbiBvbGRSZXNwb25zZVBlbmRpbmcgPSByZXNwb25zZVBlbmRpbmc7Ci0JCWJvb2xlYW4gb2xkUmVzcG9uc2VQZW5kaW5nRVNldCA9IHJlc3BvbnNlUGVuZGluZ0VTZXQ7Ci0JCXJlc3BvbnNlUGVuZGluZyA9IFJFU1BPTlNFX1BFTkRJTkdfRURFRkFVTFQ7Ci0JCXJlc3BvbnNlUGVuZGluZ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkcsIG9sZFJlc3BvbnNlUGVuZGluZywgUkVTUE9OU0VfUEVORElOR19FREVGQVVMVCwgb2xkUmVzcG9uc2VQZW5kaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzcG9uc2VQZW5kaW5nKCkgewotCQlyZXR1cm4gcmVzcG9uc2VQZW5kaW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0b3AoKSB7Ci0JCXJldHVybiBzdG9wOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0b3AoT2JqZWN0IG5ld1N0b3ApIHsKLQkJT2JqZWN0IG9sZFN0b3AgPSBzdG9wOwotCQlzdG9wID0gbmV3U3RvcDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QLCBvbGRTdG9wLCBzdG9wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZXN1bWUoKSB7Ci0JCXJldHVybiByZXN1bWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdW1lKE9iamVjdCBuZXdSZXN1bWUpIHsKLQkJT2JqZWN0IG9sZFJlc3VtZSA9IHJlc3VtZTsKLQkJcmVzdW1lID0gbmV3UmVzdW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRSwgb2xkUmVzdW1lLCByZXN1bWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCkgewotCQlyZXR1cm4gc3RhcnRWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgbmV3U3RhcnRWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YXJ0VmFyaWFuY2UgPSBzdGFydFZhcmlhbmNlOwotCQlzdGFydFZhcmlhbmNlID0gbmV3U3RhcnRWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRSwgb2xkU3RhcnRWYXJpYW5jZSwgc3RhcnRWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRVbml0cygpIHsKLQkJcmV0dXJuIHVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXRzKGZsb2F0IG5ld1VuaXRzKSB7Ci0JCWZsb2F0IG9sZFVuaXRzID0gdW5pdHM7Ci0JCXVuaXRzID0gbmV3VW5pdHM7Ci0JCWJvb2xlYW4gb2xkVW5pdHNFU2V0ID0gdW5pdHNFU2V0OwotCQl1bml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTLCBvbGRVbml0cywgdW5pdHMsICFvbGRVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVuaXRzKCkgewotCQlmbG9hdCBvbGRVbml0cyA9IHVuaXRzOwotCQlib29sZWFuIG9sZFVuaXRzRVNldCA9IHVuaXRzRVNldDsKLQkJdW5pdHMgPSBVTklUU19FREVGQVVMVDsKLQkJdW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUywgb2xkVW5pdHMsIFVOSVRTX0VERUZBVUxULCBvbGRVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVuaXRzKCkgewotCQlyZXR1cm4gdW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlTmVlZGVkKCkgewotCQlyZXR1cm4gdXBkYXRlTmVlZGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZU5lZWRlZChib29sZWFuIG5ld1VwZGF0ZU5lZWRlZCkgewotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZCA9IHVwZGF0ZU5lZWRlZDsKLQkJdXBkYXRlTmVlZGVkID0gbmV3VXBkYXRlTmVlZGVkOwotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZEVTZXQgPSB1cGRhdGVOZWVkZWRFU2V0OwotCQl1cGRhdGVOZWVkZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVELCBvbGRVcGRhdGVOZWVkZWQsIHVwZGF0ZU5lZWRlZCwgIW9sZFVwZGF0ZU5lZWRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVwZGF0ZU5lZWRlZCgpIHsKLQkJYm9vbGVhbiBvbGRVcGRhdGVOZWVkZWQgPSB1cGRhdGVOZWVkZWQ7Ci0JCWJvb2xlYW4gb2xkVXBkYXRlTmVlZGVkRVNldCA9IHVwZGF0ZU5lZWRlZEVTZXQ7Ci0JCXVwZGF0ZU5lZWRlZCA9IFVQREFURV9ORUVERURfRURFRkFVTFQ7Ci0JCXVwZGF0ZU5lZWRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQsIG9sZFVwZGF0ZU5lZWRlZCwgVVBEQVRFX05FRURFRF9FREVGQVVMVCwgb2xkVXBkYXRlTmVlZGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VXBkYXRlTmVlZGVkKCkgewotCQlyZXR1cm4gdXBkYXRlTmVlZGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0VkFDKCkgewotCQlyZXR1cm4gdkFDOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZBQyhmbG9hdCBuZXdWQUMpIHsKLQkJZmxvYXQgb2xkVkFDID0gdkFDOwotCQl2QUMgPSBuZXdWQUM7Ci0JCWJvb2xlYW4gb2xkVkFDRVNldCA9IHZBQ0VTZXQ7Ci0JCXZBQ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQywgb2xkVkFDLCB2QUMsICFvbGRWQUNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWQUMoKSB7Ci0JCWZsb2F0IG9sZFZBQyA9IHZBQzsKLQkJYm9vbGVhbiBvbGRWQUNFU2V0ID0gdkFDRVNldDsKLQkJdkFDID0gVkFDX0VERUZBVUxUOwotCQl2QUNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19WQUMsIG9sZFZBQywgVkFDX0VERUZBVUxULCBvbGRWQUNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWQUMoKSB7Ci0JCXJldHVybiB2QUNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRXb3JrQ29udG91cigpIHsKLQkJcmV0dXJuIHdvcmtDb250b3VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtDb250b3VyKEJpZ0ludGVnZXIgbmV3V29ya0NvbnRvdXIpIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrQ29udG91ciA9IHdvcmtDb250b3VyOwotCQl3b3JrQ29udG91ciA9IG5ld1dvcmtDb250b3VyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUiwgb2xkV29ya0NvbnRvdXIsIHdvcmtDb250b3VyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpIHsKLQkJcmV0dXJuIGJvb2tpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIgbmV3Qm9va2luZ1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRCb29raW5nVHlwZSA9IGJvb2tpbmdUeXBlOwotCQlib29raW5nVHlwZSA9IG5ld0Jvb2tpbmdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRSwgb2xkQm9va2luZ1R5cGUsIGJvb2tpbmdUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkID0gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0NyZWF0aW9uRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOwotCQljcmVhdGlvbkRhdGUgPSBuZXdDcmVhdGlvbkRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTQuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUzLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUaW1lcGhhc2VkRGF0YSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VGFza1VJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU09VUkNFX1VJRDoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUOgotCQkJCXJldHVybiBnZXRBY3R1YWxTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEFDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXJldHVybiBpc0NvbmZpcm1lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXJldHVybiBnZXRDb3N0UmF0ZVRhYmxlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENvc3RWYXJpYW5jZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXJldHVybiBnZXREZWxheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTOgotCQkJCXJldHVybiBpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMOgotCQkJCXJldHVybiBpc0ZpeGVkTWF0ZXJpYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXJldHVybiBpc0xpbmtlZEZpZWxkcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkU6Ci0JCQkJcmV0dXJuIGlzTWlsZXN0b25lKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXJldHVybiBnZXROb3RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlcmFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlZ3VsYXJXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlyZXR1cm4gaXNSZXNwb25zZVBlbmRpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RPUDoKLQkJCQlyZXR1cm4gZ2V0U3RvcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlyZXR1cm4gZ2V0UmVzdW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFVuaXRzKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJcmV0dXJuIGlzVXBkYXRlTmVlZGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFZBQygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXJldHVybiBnZXRXb3JrQ29udG91cigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Qm9va2luZ1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlzZXRUYXNrVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXNldFJlc291cmNlVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXNldENvbmZpcm1lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXNldENvc3RSYXRlVGFibGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFOgotCQkJCXNldENvc3RWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlzZXRDVigoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19ERUxBWToKLQkJCQlzZXREZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXNldEh5cGVybGlua0FkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFOgotCQkJCXNldFdvcmtWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUzoKLQkJCQlzZXRIYXNGaXhlZFJhdGVVbml0cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUw6Ci0JCQkJc2V0Rml4ZWRNYXRlcmlhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUzoKLQkJCQlzZXRMaW5rZWRGaWVsZHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlzZXRNaWxlc3RvbmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXNldE92ZXJhbGxvY2F0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlzZXRSZXNwb25zZVBlbmRpbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXNldFN0b3AoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlzZXRVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVEOgotCQkJCXNldFVwZGF0ZU5lZWRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXNldFZBQygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUjoKLQkJCQlzZXRXb3JrQ29udG91cigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEJhc2VsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXNldFRhc2tVSUQoVEFTS19VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQ6Ci0JCQkJc2V0UmVzb3VyY2VVSUQoUkVTT1VSQ0VfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsQ29zdChBQ1RVQUxfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJc2V0QWN0dWFsRmluaXNoKEFDVFVBTF9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZUNvc3QoQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoQUNUVUFMX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1A6Ci0JCQkJdW5zZXRBQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPTkZJUk1FRDoKLQkJCQl1bnNldENvbmZpcm1lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRToKLQkJCQlzZXRDb3N0UmF0ZVRhYmxlKENPU1RfUkFURV9UQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1Y6Ci0JCQkJdW5zZXRDVigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19ERUxBWToKLQkJCQlzZXREZWxheShERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXNldEZpbmlzaFZhcmlhbmNlKEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcyhIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQl1bnNldEZpeGVkTWF0ZXJpYWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheShMRVZFTElOR19ERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFM6Ci0JCQkJdW5zZXRMaW5rZWRGaWVsZHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTUlMRVNUT05FOgotCQkJCXVuc2V0TWlsZXN0b25lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXNldE5vdGVzKE5PVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRDoKLQkJCQl1bnNldE92ZXJhbGxvY2F0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoUkVHVUxBUl9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdChSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoUkVNQUlOSU5HX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXVuc2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RPUDoKLQkJCQlzZXRTdG9wKFNUT1BfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNVTUU6Ci0JCQkJc2V0UmVzdW1lKFJFU1VNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQl1bnNldFVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJdW5zZXRVcGRhdGVOZWVkZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXVuc2V0VkFDKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXNldFdvcmtDb250b3VyKFdPUktfQ09OVE9VUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRToKLQkJCQlzZXRCb29raW5nVHlwZShCT09LSU5HX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKENSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlyZXR1cm4gVEFTS19VSURfRURFRkFVTFQgPT0gbnVsbCA/IHRhc2tVSUQgIT0gbnVsbCA6ICFUQVNLX1VJRF9FREVGQVVMVC5lcXVhbHModGFza1VJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXJldHVybiBSRVNPVVJDRV9VSURfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVUlEICE9IG51bGwgOiAhUkVTT1VSQ0VfVUlEX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmNlbnRXb3JrQ29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIOgotCQkJCXJldHVybiBBQ1RVQUxfRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxGaW5pc2ggIT0gbnVsbCA6ICFBQ1RVQUxfRklOSVNIX0VERUZBVUxULmVxdWFscyhhY3R1YWxGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsU3RhcnQgIT0gbnVsbCA6ICFBQ1RVQUxfU1RBUlRfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQlyZXR1cm4gaXNTZXRBQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXJldHVybiBpc1NldENvbmZpcm1lZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1Q6Ci0JCQkJcmV0dXJuIENPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3QgIT0gbnVsbCA6ICFDT1NUX0VERUZBVUxULmVxdWFscyhjb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIENPU1RfUkFURV9UQUJMRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFJhdGVUYWJsZSAhPSBudWxsIDogIUNPU1RfUkFURV9UQUJMRV9FREVGQVVMVC5lcXVhbHMoY29zdFJhdGVUYWJsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXJldHVybiBERUxBWV9FREVGQVVMVCA9PSBudWxsID8gZGVsYXkgIT0gbnVsbCA6ICFERUxBWV9FREVGQVVMVC5lcXVhbHMoZGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaFZhcmlhbmNlICE9IG51bGwgOiAhRklOSVNIX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhmaW5pc2hWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXJldHVybiBIWVBFUkxJTktfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGluayAhPSBudWxsIDogIUhZUEVSTElOS19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua1N1YkFkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQlyZXR1cm4gaXNTZXRGaXhlZE1hdGVyaWFsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIExFVkVMSU5HX0RFTEFZX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5Rm9ybWF0ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxULmVxdWFscyhsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXJldHVybiBpc1NldExpbmtlZEZpZWxkcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNTZXRNaWxlc3RvbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19OT1RFUzoKLQkJCQlyZXR1cm4gTk9URVNfRURFRkFVTFQgPT0gbnVsbCA/IG5vdGVzICE9IG51bGwgOiAhTk9URVNfRURFRkFVTFQuZXF1YWxzKG5vdGVzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJhbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lV29yayAhPSBudWxsIDogIU9WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBSRUdVTEFSX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlZ3VsYXJXb3JrICE9IG51bGwgOiAhUkVHVUxBUl9XT1JLX0VERUZBVUxULmVxdWFscyhyZWd1bGFyV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlyZXR1cm4gaXNTZXRSZXNwb25zZVBlbmRpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXJldHVybiBTVE9QX0VERUZBVUxUID09IG51bGwgPyBzdG9wICE9IG51bGwgOiAhU1RPUF9FREVGQVVMVC5lcXVhbHMoc3RvcCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FOgotCQkJCXJldHVybiBSRVNVTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VtZSAhPSBudWxsIDogIVJFU1VNRV9FREVGQVVMVC5lcXVhbHMocmVzdW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0VmFyaWFuY2UgIT0gbnVsbCA6ICFTVEFSVF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0VW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVEOgotCQkJCXJldHVybiBpc1NldFVwZGF0ZU5lZWRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQzoKLQkJCQlyZXR1cm4gaXNTZXRWQUMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXJldHVybiBXT1JLX0NPTlRPVVJfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtDb250b3VyICE9IG51bGwgOiAhV09SS19DT05UT1VSX0VERUZBVUxULmVxdWFscyh3b3JrQ29udG91cik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBCT09LSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGJvb2tpbmdUeXBlICE9IG51bGwgOiAhQk9PS0lOR19UWVBFX0VERUZBVUxULmVxdWFscyhib29raW5nVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gQ1JFQVRJT05fREFURV9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25EYXRlICE9IG51bGwgOiAhQ1JFQVRJT05fREFURV9FREVGQVVMVC5lcXVhbHMoY3JlYXRpb25EYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlyZXR1cm4gYmFzZWxpbmUgIT0gbnVsbCAmJiAhYmFzZWxpbmUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gdGltZXBoYXNlZERhdGEgIT0gbnVsbCAmJiAhdGltZXBoYXNlZERhdGEuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhc2tVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhc2tVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25maXJtZWQ6ICIpOwotCQlpZiAoY29uZmlybWVkRVNldCkgcmVzdWx0LmFwcGVuZChjb25maXJtZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UmF0ZVRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UmF0ZVRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0VmFyaWFuY2U6ICIpOwotCQlpZiAoY29zdFZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZChjb3N0VmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWxheTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVsYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoVmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtTdWJBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYXNGaXhlZFJhdGVVbml0czogIik7Ci0JCWlmIChoYXNGaXhlZFJhdGVVbml0c0VTZXQpIHJlc3VsdC5hcHBlbmQoaGFzRml4ZWRSYXRlVW5pdHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZE1hdGVyaWFsOiAiKTsKLQkJaWYgKGZpeGVkTWF0ZXJpYWxFU2V0KSByZXN1bHQuYXBwZW5kKGZpeGVkTWF0ZXJpYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5Rm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rZWRGaWVsZHM6ICIpOwotCQlpZiAobGlua2VkRmllbGRzRVNldCkgcmVzdWx0LmFwcGVuZChsaW5rZWRGaWVsZHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWxlc3RvbmU6ICIpOwotCQlpZiAobWlsZXN0b25lRVNldCkgcmVzdWx0LmFwcGVuZChtaWxlc3RvbmUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJhbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlcmFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlcmFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVndWxhcldvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZ3VsYXJXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3BvbnNlUGVuZGluZzogIik7Ci0JCWlmIChyZXNwb25zZVBlbmRpbmdFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3BvbnNlUGVuZGluZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RvcDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RvcCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0VmFyaWFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0VmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXRzOiAiKTsKLQkJaWYgKHVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZCh1bml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVwZGF0ZU5lZWRlZDogIik7Ci0JCWlmICh1cGRhdGVOZWVkZWRFU2V0KSByZXN1bHQuYXBwZW5kKHVwZGF0ZU5lZWRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZBQzogIik7Ci0JCWlmICh2QUNFU2V0KSByZXN1bHQuYXBwZW5kKHZBQyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtDb250b3VyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrQ29udG91cik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYm9va2luZ1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJvb2tpbmdUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Bc3NpZ25tZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDI1NjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudHNJbXBsI2dldEFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25tZW50c0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzc2lnbm1lbnRzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50KCkgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFzc2lnbm1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFzc2lnbm1lbnRzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFzc2lnbm1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFzc2lnbm1lbnQoKSB7Ci0JCWlmIChhc3NpZ25tZW50ID09IG51bGwpIHsKLQkJCWFzc2lnbm1lbnQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQXNzaWdubWVudC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFzc2lnbm1lbnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCXJldHVybiBnZXRBc3NpZ25tZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCWdldEFzc2lnbm1lbnQoKS5jbGVhcigpOwotCQkJCWdldEFzc2lnbm1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJZ2V0QXNzaWdubWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJcmV0dXJuIGFzc2lnbm1lbnQgIT0gbnVsbCAmJiAhYXNzaWdubWVudC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0Fzc2lnbm1lbnRzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjBiYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEF2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJpbGl0eVBlcmlvZEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEF2YWlsYWJpbGl0eVBlcmlvZCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlRnJvbSA9IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZVRvID0gQVZBSUxBQkxFX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVVuaXRzKCkgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVVuaXRzKCkgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBhdmFpbGFibGVVbml0cyA9IEFWQUlMQUJMRV9VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXZhaWxhYmxlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdmFpbGFibGVVbml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlRnJvbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVGcm9tKE9iamVjdCBuZXdBdmFpbGFibGVGcm9tKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVGcm9tID0gYXZhaWxhYmxlRnJvbTsKLQkJYXZhaWxhYmxlRnJvbSA9IG5ld0F2YWlsYWJsZUZyb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST00sIG9sZEF2YWlsYWJsZUZyb20sIGF2YWlsYWJsZUZyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZVRvKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IG5ld0F2YWlsYWJsZVRvKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVUbyA9IGF2YWlsYWJsZVRvOwotCQlhdmFpbGFibGVUbyA9IG5ld0F2YWlsYWJsZVRvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTywgb2xkQXZhaWxhYmxlVG8sIGF2YWlsYWJsZVRvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEF2YWlsYWJsZVVuaXRzKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQgbmV3QXZhaWxhYmxlVW5pdHMpIHsKLQkJZmxvYXQgb2xkQXZhaWxhYmxlVW5pdHMgPSBhdmFpbGFibGVVbml0czsKLQkJYXZhaWxhYmxlVW5pdHMgPSBuZXdBdmFpbGFibGVVbml0czsKLQkJYm9vbGVhbiBvbGRBdmFpbGFibGVVbml0c0VTZXQgPSBhdmFpbGFibGVVbml0c0VTZXQ7Ci0JCWF2YWlsYWJsZVVuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTLCBvbGRBdmFpbGFibGVVbml0cywgYXZhaWxhYmxlVW5pdHMsICFvbGRBdmFpbGFibGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF2YWlsYWJsZVVuaXRzKCkgewotCQlmbG9hdCBvbGRBdmFpbGFibGVVbml0cyA9IGF2YWlsYWJsZVVuaXRzOwotCQlib29sZWFuIG9sZEF2YWlsYWJsZVVuaXRzRVNldCA9IGF2YWlsYWJsZVVuaXRzRVNldDsKLQkJYXZhaWxhYmxlVW5pdHMgPSBBVkFJTEFCTEVfVU5JVFNfRURFRkFVTFQ7Ci0JCWF2YWlsYWJsZVVuaXRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTLCBvbGRBdmFpbGFibGVVbml0cywgQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxULCBvbGRBdmFpbGFibGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF2YWlsYWJsZVVuaXRzKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlRnJvbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRBdmFpbGFibGVVbml0cygpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST006Ci0JCQkJc2V0QXZhaWxhYmxlRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXNldEF2YWlsYWJsZVRvKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJc2V0QXZhaWxhYmxlVW5pdHMoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oQVZBSUxBQkxFX0ZST01fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oQVZBSUxBQkxFX1RPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXVuc2V0QXZhaWxhYmxlVW5pdHMoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZUZyb20gIT0gbnVsbCA6ICFBVkFJTEFCTEVfRlJPTV9FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXJldHVybiBBVkFJTEFCTEVfVE9fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZVRvICE9IG51bGwgOiAhQVZBSUxBQkxFX1RPX0VERUZBVUxULmVxdWFscyhhdmFpbGFibGVUbyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXJldHVybiBpc1NldEF2YWlsYWJsZVVuaXRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdmFpbGFibGVGcm9tOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVGcm9tKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdmFpbGFibGVUbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXZhaWxhYmxlVG8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVVuaXRzOiAiKTsKLQkJaWYgKGF2YWlsYWJsZVVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChhdmFpbGFibGVVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY1NDgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXZhaWxhYmlsaXR5UGVyaW9kcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXZhaWxhYmlsaXR5UGVyaW9kID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kID09IG51bGwpIHsKLQkJCWF2YWlsYWJpbGl0eVBlcmlvZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBdmFpbGFiaWxpdHlQZXJpb2QuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0QpOwotCQl9Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5jbGVhcigpOwotCQkJCWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2QgIT0gbnVsbCAmJiAhYXZhaWxhYmlsaXR5UGVyaW9kLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRjM2QxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTJJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmFzZWxpbmUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzZWxpbmUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlcigpIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbnVtYmVyID0gTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENPU1RfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENvc3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvc3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1NfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzZWxpbmUySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lMigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE51bWJlcigpIHsKLQkJcmV0dXJuIG51bWJlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROdW1iZXIoQmlnSW50ZWdlciBuZXdOdW1iZXIpIHsKLQkJQmlnSW50ZWdlciBvbGROdW1iZXIgPSBudW1iZXI7Ci0JCW51bWJlciA9IG5ld051bWJlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChmbG9hdCBuZXdDb3N0KSB7Ci0JCWZsb2F0IG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJYm9vbGVhbiBvbGRDb3N0RVNldCA9IGNvc3RFU2V0OwotCQljb3N0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NULCBvbGRDb3N0LCBjb3N0LCAhb2xkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENvc3QoKSB7Ci0JCWZsb2F0IG9sZENvc3QgPSBjb3N0OwotCQlib29sZWFuIG9sZENvc3RFU2V0ID0gY29zdEVTZXQ7Ci0JCWNvc3QgPSBDT1NUX0VERUZBVUxUOwotCQljb3N0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NULCBvbGRDb3N0LCBDT1NUX0VERUZBVUxULCBvbGRDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSzoKLQkJCQlyZXR1cm4gZ2V0V29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQ09TVDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENvc3QoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJc2V0V29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXNldENvc3QoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTOgotCQkJCXNldEJDV1MoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSOgotCQkJCXNldE51bWJlcihOVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXVuc2V0Q29zdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlyZXR1cm4gTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBudW1iZXIgIT0gbnVsbCA6ICFOVU1CRVJfRURFRkFVTFQuZXF1YWxzKG51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXJldHVybiBpc1NldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChudW1iZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG51bWJlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCWlmIChjb3N0RVNldCkgcmVzdWx0LmFwcGVuZChjb3N0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Jhc2VsaW5lMkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVjZjQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlbGluZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNlbGluZTMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbnVtYmVyID0gTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1NfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzZWxpbmUzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lMygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihTdHJpbmcgbmV3TnVtYmVyKSB7Ci0JCVN0cmluZyBvbGROdW1iZXIgPSBudW1iZXI7Ci0JCW51bWJlciA9IG5ld051bWJlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoU3RyaW5nIG5ld1N0YXJ0KSB7Ci0JCVN0cmluZyBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChTdHJpbmcgbmV3RmluaXNoKSB7Ci0JCVN0cmluZyBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoU3RyaW5nIG5ld0Nvc3QpIHsKLQkJU3RyaW5nIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUyhmbG9hdCBuZXdCQ1dTKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQliQ1dTID0gbmV3QkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1AsIG9sZEJDV1AsIGJDV1AsICFvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUCgpIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0JCWJDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gZ2V0VGltZXBoYXNlZERhdGEoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0TnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlzZXRDb3N0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19OVU1CRVI6Ci0JCQkJcmV0dXJuIE5VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gbnVtYmVyICE9IG51bGwgOiAhTlVNQkVSX0VERUZBVUxULmVxdWFscyhudW1iZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19GSU5JU0g6Ci0JCQkJcmV0dXJuIEZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoICE9IG51bGwgOiAhRklOSVNIX0VERUZBVUxULmVxdWFscyhmaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQmFzZWxpbmUzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA3MDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJhc2VsaW5lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzZWxpbmUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBOVU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBudW1iZXIgPSBOVU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRlcmltKCkgPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVEVSSU1fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50ZXJpbSgpIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGludGVyaW0gPSBJTlRFUklNX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJbnRlcmltIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcmltRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFc3RpbWF0ZWREdXJhdGlvbigpIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXN0aW1hdGVkRHVyYXRpb24oKSA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWREdXJhdGlvbiA9IEVTVElNQVRFRF9EVVJBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRXN0aW1hdGVkIER1cmF0aW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0ID0gQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCYXNlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIG5ld051bWJlcikgewotCQlCaWdJbnRlZ2VyIG9sZE51bWJlciA9IG51bWJlcjsKLQkJbnVtYmVyID0gbmV3TnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19OVU1CRVIsIG9sZE51bWJlciwgbnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmltKCkgewotCQlyZXR1cm4gaW50ZXJpbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmltKGJvb2xlYW4gbmV3SW50ZXJpbSkgewotCQlib29sZWFuIG9sZEludGVyaW0gPSBpbnRlcmltOwotCQlpbnRlcmltID0gbmV3SW50ZXJpbTsKLQkJYm9vbGVhbiBvbGRJbnRlcmltRVNldCA9IGludGVyaW1FU2V0OwotCQlpbnRlcmltRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU0sIG9sZEludGVyaW0sIGludGVyaW0sICFvbGRJbnRlcmltRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SW50ZXJpbSgpIHsKLQkJYm9vbGVhbiBvbGRJbnRlcmltID0gaW50ZXJpbTsKLQkJYm9vbGVhbiBvbGRJbnRlcmltRVNldCA9IGludGVyaW1FU2V0OwotCQlpbnRlcmltID0gSU5URVJJTV9FREVGQVVMVDsKLQkJaW50ZXJpbUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNLCBvbGRJbnRlcmltLCBJTlRFUklNX0VERUZBVUxULCBvbGRJbnRlcmltRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW50ZXJpbSgpIHsKLQkJcmV0dXJuIGludGVyaW1FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldER1cmF0aW9uKCkgewotCQlyZXR1cm4gZHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IG5ld0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGREdXJhdGlvbiA9IGR1cmF0aW9uOwotCQlkdXJhdGlvbiA9IG5ld0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTiwgb2xkRHVyYXRpb24sIGR1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRlZER1cmF0aW9uKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbiBuZXdFc3RpbWF0ZWREdXJhdGlvbikgewotCQlib29sZWFuIG9sZEVzdGltYXRlZER1cmF0aW9uID0gZXN0aW1hdGVkRHVyYXRpb247Ci0JCWVzdGltYXRlZER1cmF0aW9uID0gbmV3RXN0aW1hdGVkRHVyYXRpb247Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb25FU2V0ID0gZXN0aW1hdGVkRHVyYXRpb25FU2V0OwotCQllc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04sIG9sZEVzdGltYXRlZER1cmF0aW9uLCBlc3RpbWF0ZWREdXJhdGlvbiwgIW9sZEVzdGltYXRlZER1cmF0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb24gPSBlc3RpbWF0ZWREdXJhdGlvbjsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JCWVzdGltYXRlZER1cmF0aW9uID0gRVNUSU1BVEVEX0RVUkFUSU9OX0VERUZBVUxUOwotCQllc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04sIG9sZEVzdGltYXRlZER1cmF0aW9uLCBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQsIG9sZEVzdGltYXRlZER1cmF0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgbmV3Q29zdCkgewotCQlCaWdEZWNpbWFsIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNOgotCQkJCXJldHVybiBpc0ludGVyaW0oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGlzRXN0aW1hdGVkRHVyYXRpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTToKLQkJCQlzZXRJbnRlcmltKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OOgotCQkJCXNldEVzdGltYXRlZER1cmF0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJdW5zZXRJbnRlcmltKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlzZXREdXJhdGlvbihEVVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTjoKLQkJCQl1bnNldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlyZXR1cm4gTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBudW1iZXIgIT0gbnVsbCA6ICFOVU1CRVJfRURFRkFVTFQuZXF1YWxzKG51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJcmV0dXJuIGlzU2V0SW50ZXJpbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT046Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbiAhPSBudWxsIDogIURVUkFUSU9OX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnRlcmltOiAiKTsKLQkJaWYgKGludGVyaW1FU2V0KSByZXN1bHQuYXBwZW5kKGludGVyaW0pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGVkRHVyYXRpb246ICIpOwotCQlpZiAoZXN0aW1hdGVkRHVyYXRpb25FU2V0KSByZXN1bHQuYXBwZW5kKGVzdGltYXRlZER1cmF0aW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Jhc2VsaW5lSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2QwOGQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsI2dldEJhc2VDYWxlbmRhclVJRCA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0V2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhbGVuZGFySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ2FsZW5kYXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQmFzZUNhbGVuZGFyKCkgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQmFzZUNhbGVuZGFyKCkgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQmFzZUNhbGVuZGFyID0gSVNfQkFTRV9DQUxFTkRBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgQmFzZSBDYWxlbmRhciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCYXNlQ2FsZW5kYXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlQ2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlQ2FsZW5kYXJVSUQoKSA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYmFzZUNhbGVuZGFyVUlEID0gQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWVrRGF5cygpIDxlbT5XZWVrIERheXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vla0RheXMgd2Vla0RheXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhbGVuZGFySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhbGVuZGFyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzQmFzZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaXNCYXNlQ2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNCYXNlQ2FsZW5kYXIoYm9vbGVhbiBuZXdJc0Jhc2VDYWxlbmRhcikgewotCQlib29sZWFuIG9sZElzQmFzZUNhbGVuZGFyID0gaXNCYXNlQ2FsZW5kYXI7Ci0JCWlzQmFzZUNhbGVuZGFyID0gbmV3SXNCYXNlQ2FsZW5kYXI7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXJFU2V0ID0gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCQlpc0Jhc2VDYWxlbmRhckVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSLCBvbGRJc0Jhc2VDYWxlbmRhciwgaXNCYXNlQ2FsZW5kYXIsICFvbGRJc0Jhc2VDYWxlbmRhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzQmFzZUNhbGVuZGFyKCkgewotCQlib29sZWFuIG9sZElzQmFzZUNhbGVuZGFyID0gaXNCYXNlQ2FsZW5kYXI7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXJFU2V0ID0gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCQlpc0Jhc2VDYWxlbmRhciA9IElTX0JBU0VfQ0FMRU5EQVJfRURFRkFVTFQ7Ci0JCWlzQmFzZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVIsIG9sZElzQmFzZUNhbGVuZGFyLCBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxULCBvbGRJc0Jhc2VDYWxlbmRhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzQmFzZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEJhc2VDYWxlbmRhclVJRCgpIHsKLQkJcmV0dXJuIGJhc2VDYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlQ2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdCYXNlQ2FsZW5kYXJVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRCYXNlQ2FsZW5kYXJVSUQgPSBiYXNlQ2FsZW5kYXJVSUQ7Ci0JCWJhc2VDYWxlbmRhclVJRCA9IG5ld0Jhc2VDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQsIG9sZEJhc2VDYWxlbmRhclVJRCwgYmFzZUNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlZWtEYXlzIGdldFdlZWtEYXlzKCkgewotCQlyZXR1cm4gd2Vla0RheXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2Vla0RheXMoV2Vla0RheXMgbmV3V2Vla0RheXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV2Vla0RheXMgb2xkV2Vla0RheXMgPSB3ZWVrRGF5czsKLQkJd2Vla0RheXMgPSBuZXdXZWVrRGF5czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBvbGRXZWVrRGF5cywgbmV3V2Vla0RheXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlZWtEYXlzKFdlZWtEYXlzIG5ld1dlZWtEYXlzKSB7Ci0JCWlmIChuZXdXZWVrRGF5cyAhPSB3ZWVrRGF5cykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod2Vla0RheXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd2Vla0RheXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dlZWtEYXlzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlZWtEYXlzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlZWtEYXlzKG5ld1dlZWtEYXlzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUywgbmV3V2Vla0RheXMsIG5ld1dlZWtEYXlzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdlZWtEYXlzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzSXNCYXNlQ2FsZW5kYXIoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRCYXNlQ2FsZW5kYXJVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCXJldHVybiBnZXRXZWVrRGF5cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSOgotCQkJCXNldElzQmFzZUNhbGVuZGFyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0QmFzZUNhbGVuZGFyVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlzZXRXZWVrRGF5cygoV2Vla0RheXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJdW5zZXRJc0Jhc2VDYWxlbmRhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0QmFzZUNhbGVuZGFyVUlEKEJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlzZXRXZWVrRGF5cygoV2Vla0RheXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUjoKLQkJCQlyZXR1cm4gaXNTZXRJc0Jhc2VDYWxlbmRhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGJhc2VDYWxlbmRhclVJRCAhPSBudWxsIDogIUJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhiYXNlQ2FsZW5kYXJVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJcmV0dXJuIHdlZWtEYXlzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNCYXNlQ2FsZW5kYXI6ICIpOwotCQlpZiAoaXNCYXNlQ2FsZW5kYXJFU2V0KSByZXN1bHQuYXBwZW5kKGlzQmFzZUNhbGVuZGFyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFzZUNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXNlQ2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DYWxlbmRhckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y1ZWU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYWxlbmRhcnNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsI2dldENhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhbGVuZGFyc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENhbGVuZGFycyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXIoKSA8ZW0+Q2FsZW5kYXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjYWxlbmRhciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FsZW5kYXJzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhbGVuZGFycygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDYWxlbmRhcigpIHsKLQkJaWYgKGNhbGVuZGFyID09IG51bGwpIHsKLQkJCWNhbGVuZGFyID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENhbGVuZGFyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVIpOwotCQl9Ci0JCXJldHVybiBjYWxlbmRhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDYWxlbmRhcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlyZXR1cm4gZ2V0Q2FsZW5kYXIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlnZXRDYWxlbmRhcigpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2FsZW5kYXIoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlnZXRDYWxlbmRhcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlyZXR1cm4gY2FsZW5kYXIgIT0gbnVsbCAmJiAhY2FsZW5kYXIuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9DYWxlbmRhcnNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxMzAxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290SW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50Um9vdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERvY3VtZW50Um9vdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeFNJU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50Um9vdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gKFByb2plY3QpZ2V0TWl4ZWQoKS5nZXQoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJvamVjdChQcm9qZWN0IG5ld1Byb2plY3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfUHJvamVjdCgpLCBuZXdQcm9qZWN0LCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgbmV3UHJvamVjdCkgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9Qcm9qZWN0KCksIG5ld1Byb2plY3QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UHJvamVjdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gZ2V0TWl4ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWl4ZWQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlzZXRQcm9qZWN0KChQcm9qZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGdldFByb2plY3QoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9jdW1lbnRSb290SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTRlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlMkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuZGVkQXR0cmlidXRlMiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbkZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb25Gb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhNmE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUzIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0ID0gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlM0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ4YjdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZTQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuZGVkQXR0cmlidXRlNCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCkgewotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciBuZXdEdXJhdGlvbkZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZER1cmF0aW9uRm9ybWF0ID0gZHVyYXRpb25Gb3JtYXQ7Ci0JCWR1cmF0aW9uRm9ybWF0ID0gbmV3RHVyYXRpb25Gb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYwZGMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldENhbGN1bGF0aW9uVHlwZSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lID0gRklFTERfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsaWFzKCkgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbGlhcyA9IEFMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX0FMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGhvbmV0aWNBbGlhcyA9IFBIT05FVElDX0FMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGx1cFR5cGUoKSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGx1cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBST0xMVVBfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xsdXBUeXBlKCkgPGVtPlJvbGx1cCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciByb2xsdXBUeXBlID0gUk9MTFVQX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsY3VsYXRpb25UeXBlID0gQ0FMQ1VMQVRJT05fVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtdWxhKCkgPGVtPkZvcm11bGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm11bGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1VTEFfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybXVsYSgpIDxlbT5Gb3JtdWxhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtdWxhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm11bGEgPSBGT1JNVUxBX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdHJpY3RWYWx1ZXMoKSA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVTVFJJQ1RfVkFMVUVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3RyaWN0VmFsdWVzKCkgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3RWYWx1ZXMgPSBSRVNUUklDVF9WQUxVRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc3RyaWN0IFZhbHVlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3RWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKSA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVsaXN0U29ydE9yZGVyID0gVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBcHBlbmROZXdWYWx1ZXMoKSA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVBQRU5EX05FV19WQUxVRVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXBwZW5kTmV3VmFsdWVzKCkgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXBwZW5kTmV3VmFsdWVzID0gQVBQRU5EX05FV19WQUxVRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFwcGVuZCBOZXcgVmFsdWVzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcHBlbmROZXdWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdCgpIDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHQoKSA8ZW0+RGVmYXVsdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0XyA9IERFRkFVTFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUxpc3QoKSA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVMaXN0IHZhbHVlTGlzdCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiBmaWVsZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBuZXdGaWVsZE5hbWUpIHsKLQkJU3RyaW5nIG9sZEZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJZmllbGROYW1lID0gbmV3RmllbGROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRSwgb2xkRmllbGROYW1lLCBmaWVsZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgewotCQlyZXR1cm4gYWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIG5ld0FsaWFzKSB7Ci0JCVN0cmluZyBvbGRBbGlhcyA9IGFsaWFzOwotCQlhbGlhcyA9IG5ld0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVMsIG9sZEFsaWFzLCBhbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpIHsKLQkJcmV0dXJuIHBob25ldGljQWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcgbmV3UGhvbmV0aWNBbGlhcykgewotCQlTdHJpbmcgb2xkUGhvbmV0aWNBbGlhcyA9IHBob25ldGljQWxpYXM7Ci0JCXBob25ldGljQWxpYXMgPSBuZXdQaG9uZXRpY0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVMsIG9sZFBob25ldGljQWxpYXMsIHBob25ldGljQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRSb2xsdXBUeXBlKCkgewotCQlyZXR1cm4gcm9sbHVwVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsdXBUeXBlKEJpZ0ludGVnZXIgbmV3Um9sbHVwVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFJvbGx1cFR5cGUgPSByb2xsdXBUeXBlOwotCQlyb2xsdXBUeXBlID0gbmV3Um9sbHVwVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFLCBvbGRSb2xsdXBUeXBlLCByb2xsdXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsY3VsYXRpb25UeXBlKCkgewotCQlyZXR1cm4gY2FsY3VsYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGN1bGF0aW9uVHlwZShCaWdJbnRlZ2VyIG5ld0NhbGN1bGF0aW9uVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGN1bGF0aW9uVHlwZSA9IGNhbGN1bGF0aW9uVHlwZTsKLQkJY2FsY3VsYXRpb25UeXBlID0gbmV3Q2FsY3VsYXRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRSwgb2xkQ2FsY3VsYXRpb25UeXBlLCBjYWxjdWxhdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm11bGEoKSB7Ci0JCXJldHVybiBmb3JtdWxhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm11bGEoU3RyaW5nIG5ld0Zvcm11bGEpIHsKLQkJU3RyaW5nIG9sZEZvcm11bGEgPSBmb3JtdWxhOwotCQlmb3JtdWxhID0gbmV3Rm9ybXVsYTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEEsIG9sZEZvcm11bGEsIGZvcm11bGEpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0VmFsdWVzKCkgewotCQlyZXR1cm4gcmVzdHJpY3RWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbiBuZXdSZXN0cmljdFZhbHVlcykgewotCQlib29sZWFuIG9sZFJlc3RyaWN0VmFsdWVzID0gcmVzdHJpY3RWYWx1ZXM7Ci0JCXJlc3RyaWN0VmFsdWVzID0gbmV3UmVzdHJpY3RWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXNFU2V0ID0gcmVzdHJpY3RWYWx1ZXNFU2V0OwotCQlyZXN0cmljdFZhbHVlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTLCBvbGRSZXN0cmljdFZhbHVlcywgcmVzdHJpY3RWYWx1ZXMsICFvbGRSZXN0cmljdFZhbHVlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3RyaWN0VmFsdWVzKCkgewotCQlib29sZWFuIG9sZFJlc3RyaWN0VmFsdWVzID0gcmVzdHJpY3RWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXNFU2V0ID0gcmVzdHJpY3RWYWx1ZXNFU2V0OwotCQlyZXN0cmljdFZhbHVlcyA9IFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVDsKLQkJcmVzdHJpY3RWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUywgb2xkUmVzdHJpY3RWYWx1ZXMsIFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVCwgb2xkUmVzdHJpY3RWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXN0cmljdFZhbHVlcygpIHsKLQkJcmV0dXJuIHJlc3RyaWN0VmFsdWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKSB7Ci0JCXJldHVybiB2YWx1ZWxpc3RTb3J0T3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVsaXN0U29ydE9yZGVyKEJpZ0ludGVnZXIgbmV3VmFsdWVsaXN0U29ydE9yZGVyKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVsaXN0U29ydE9yZGVyID0gdmFsdWVsaXN0U29ydE9yZGVyOwotCQl2YWx1ZWxpc3RTb3J0T3JkZXIgPSBuZXdWYWx1ZWxpc3RTb3J0T3JkZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUiwgb2xkVmFsdWVsaXN0U29ydE9yZGVyLCB2YWx1ZWxpc3RTb3J0T3JkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGVuZE5ld1ZhbHVlcygpIHsKLQkJcmV0dXJuIGFwcGVuZE5ld1ZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbiBuZXdBcHBlbmROZXdWYWx1ZXMpIHsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXMgPSBhcHBlbmROZXdWYWx1ZXM7Ci0JCWFwcGVuZE5ld1ZhbHVlcyA9IG5ld0FwcGVuZE5ld1ZhbHVlczsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXNFU2V0ID0gYXBwZW5kTmV3VmFsdWVzRVNldDsKLQkJYXBwZW5kTmV3VmFsdWVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUywgb2xkQXBwZW5kTmV3VmFsdWVzLCBhcHBlbmROZXdWYWx1ZXMsICFvbGRBcHBlbmROZXdWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBcHBlbmROZXdWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gb2xkQXBwZW5kTmV3VmFsdWVzID0gYXBwZW5kTmV3VmFsdWVzOwotCQlib29sZWFuIG9sZEFwcGVuZE5ld1ZhbHVlc0VTZXQgPSBhcHBlbmROZXdWYWx1ZXNFU2V0OwotCQlhcHBlbmROZXdWYWx1ZXMgPSBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVDsKLQkJYXBwZW5kTmV3VmFsdWVzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUywgb2xkQXBwZW5kTmV3VmFsdWVzLCBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVCwgb2xkQXBwZW5kTmV3VmFsdWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXBwZW5kTmV3VmFsdWVzKCkgewotCQlyZXR1cm4gYXBwZW5kTmV3VmFsdWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0XzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuZXdEZWZhdWx0KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0ID0gZGVmYXVsdF87Ci0JCWRlZmF1bHRfID0gbmV3RGVmYXVsdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQsIG9sZERlZmF1bHQsIGRlZmF1bHRfKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlTGlzdCBnZXRWYWx1ZUxpc3QoKSB7Ci0JCXJldHVybiB2YWx1ZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVMaXN0KFZhbHVlTGlzdCBuZXdWYWx1ZUxpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmFsdWVMaXN0IG9sZFZhbHVlTGlzdCA9IHZhbHVlTGlzdDsKLQkJdmFsdWVMaXN0ID0gbmV3VmFsdWVMaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgb2xkVmFsdWVMaXN0LCBuZXdWYWx1ZUxpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlTGlzdChWYWx1ZUxpc3QgbmV3VmFsdWVMaXN0KSB7Ci0JCWlmIChuZXdWYWx1ZUxpc3QgIT0gdmFsdWVMaXN0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh2YWx1ZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZhbHVlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZUxpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZUxpc3QobmV3VmFsdWVMaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNULCBuZXdWYWx1ZUxpc3QsIG5ld1ZhbHVlTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldFZhbHVlTGlzdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXJldHVybiBnZXRGaWVsZE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTOgotCQkJCXJldHVybiBnZXRBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJcmV0dXJuIGdldFBob25ldGljQWxpYXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXJldHVybiBnZXRSb2xsdXBUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRDYWxjdWxhdGlvblR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEE6Ci0JCQkJcmV0dXJuIGdldEZvcm11bGEoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUzoKLQkJCQlyZXR1cm4gaXNSZXN0cmljdFZhbHVlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXJldHVybiBnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXJldHVybiBpc0FwcGVuZE5ld1ZhbHVlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQ6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldFZhbHVlTGlzdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlzZXRSb2xsdXBUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXNldENhbGN1bGF0aW9uVHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlzZXRGb3JtdWxhKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUzoKLQkJCQlzZXRSZXN0cmljdFZhbHVlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXNldEFwcGVuZE5ld1ZhbHVlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXNldERlZmF1bHQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlzZXRWYWx1ZUxpc3QoKFZhbHVlTGlzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUU6Ci0JCQkJc2V0RmllbGROYW1lKEZJRUxEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTOgotCQkJCXNldEFsaWFzKEFMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKFBIT05FVElDX0FMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlzZXRSb2xsdXBUeXBlKFJPTExVUF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXNldENhbGN1bGF0aW9uVHlwZShDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBOgotCQkJCXNldEZvcm11bGEoRk9STVVMQV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXVuc2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXVuc2V0QXBwZW5kTmV3VmFsdWVzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVDoKLQkJCQlzZXREZWZhdWx0KERFRkFVTFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJc2V0VmFsdWVMaXN0KChWYWx1ZUxpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXJldHVybiBGSUVMRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWVsZE5hbWUgIT0gbnVsbCA6ICFGSUVMRF9OQU1FX0VERUZBVUxULmVxdWFscyhmaWVsZE5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJcmV0dXJuIEFMSUFTX0VERUZBVUxUID09IG51bGwgPyBhbGlhcyAhPSBudWxsIDogIUFMSUFTX0VERUZBVUxULmVxdWFscyhhbGlhcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IHBob25ldGljQWxpYXMgIT0gbnVsbCA6ICFQSE9ORVRJQ19BTElBU19FREVGQVVMVC5lcXVhbHMocGhvbmV0aWNBbGlhcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlyZXR1cm4gUk9MTFVQX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGx1cFR5cGUgIT0gbnVsbCA6ICFST0xMVVBfVFlQRV9FREVGQVVMVC5lcXVhbHMocm9sbHVwVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXJldHVybiBDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUID09IG51bGwgPyBjYWxjdWxhdGlvblR5cGUgIT0gbnVsbCA6ICFDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxULmVxdWFscyhjYWxjdWxhdGlvblR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlyZXR1cm4gRk9STVVMQV9FREVGQVVMVCA9PSBudWxsID8gZm9ybXVsYSAhPSBudWxsIDogIUZPUk1VTEFfRURFRkFVTFQuZXF1YWxzKGZvcm11bGEpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXJldHVybiBpc1NldFJlc3RyaWN0VmFsdWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlyZXR1cm4gVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlbGlzdFNvcnRPcmRlciAhPSBudWxsIDogIVZBTFVFTElTVF9TT1JUX09SREVSX0VERUZBVUxULmVxdWFscyh2YWx1ZWxpc3RTb3J0T3JkZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJcmV0dXJuIGlzU2V0QXBwZW5kTmV3VmFsdWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXJldHVybiBERUZBVUxUX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0XyAhPSBudWxsIDogIURFRkFVTFRfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRfKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJcmV0dXJuIHZhbHVlTGlzdCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbGlhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGhvbmV0aWNBbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGhvbmV0aWNBbGlhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sbHVwVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sbHVwVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FsY3VsYXRpb25UeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxjdWxhdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZvcm11bGE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZvcm11bGEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3RyaWN0VmFsdWVzOiAiKTsKLQkJaWYgKHJlc3RyaWN0VmFsdWVzRVNldCkgcmVzdWx0LmFwcGVuZChyZXN0cmljdFZhbHVlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlbGlzdFNvcnRPcmRlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVsaXN0U29ydE9yZGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhcHBlbmROZXdWYWx1ZXM6ICIpOwotCQlpZiAoYXBwZW5kTmV3VmFsdWVzRVNldCkgcmVzdWx0LmFwcGVuZChhcHBlbmROZXdWYWx1ZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Xyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZGUwOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4dGVuZGVkQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5kZWRBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZSAhPSBudWxsICYmICFleHRlbmRlZEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzM2MzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza0ltcGwjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1hc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbCA9IExFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRU5HVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcGFyYXRvciA9IFNFUEFSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsKEJpZ0ludGVnZXIgbmV3TGV2ZWwpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbCA9IGxldmVsOwotCQlsZXZlbCA9IG5ld0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMLCBvbGRMZXZlbCwgbGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChCaWdJbnRlZ2VyIG5ld0xlbmd0aCkgewotCQlCaWdJbnRlZ2VyIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSCwgb2xkTGVuZ3RoLCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIG5ld1NlcGFyYXRvcikgewotCQlTdHJpbmcgb2xkU2VwYXJhdG9yID0gc2VwYXJhdG9yOwotCQlzZXBhcmF0b3IgPSBuZXdTZXBhcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SLCBvbGRTZXBhcmF0b3IsIHNlcGFyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RIOgotCQkJCXJldHVybiBnZXRMZW5ndGgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SOgotCQkJCXNldFNlcGFyYXRvcihTRVBBUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMOgotCQkJCXJldHVybiBMRVZFTF9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWwgIT0gbnVsbCA6ICFMRVZFTF9FREVGQVVMVC5lcXVhbHMobGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIExFTkdUSF9FREVGQVVMVCA9PSBudWxsID8gbGVuZ3RoICE9IG51bGwgOiAhTEVOR1RIX0VERUZBVUxULmVxdWFscyhsZW5ndGgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gU0VQQVJBVE9SX0VERUZBVUxUID09IG51bGwgPyBzZXBhcmF0b3IgIT0gbnVsbCA6ICFTRVBBUkFUT1JfRURFRkFVTFQuZXF1YWxzKHNlcGFyYXRvcik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlbmd0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGVuZ3RoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXBhcmF0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01hc2tJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTdlZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFza3NJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrc0ltcGwjZ2V0TWFzayA8ZW0+TWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1hc2tzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTWFza3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hc2soKSA8ZW0+TWFzazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWFzayA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFza3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWFza3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWFzaygpIHsKLQkJaWYgKG1hc2sgPT0gbnVsbCkgewotCQkJbWFzayA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNYXNrLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLKTsKLQkJfQotCQlyZXR1cm4gbWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWFzaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJcmV0dXJuIGdldE1hc2soKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJZ2V0TWFzaygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFzaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlnZXRNYXNrKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlyZXR1cm4gbWFzayAhPSBudWxsICYmICFtYXNrLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vTWFza3NJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTXNwcm9qZWN0RmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTAyY2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEZhY3RvcnlJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1zcHJvamVjdEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVDogcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzogcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRDogcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTOiByZXR1cm4gY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOiByZXR1cm4gY3JlYXRlQmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTI6IHJldHVybiBjcmVhdGVCYXNlbGluZTIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTM6IHJldHVybiBjcmVhdGVCYXNlbGluZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUjogcmV0dXJuIGNyZWF0ZUNhbGVuZGFyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTOiByZXR1cm4gY3JlYXRlQ2FsZW5kYXJzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6IHJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OiByZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6IHJldHVybiBjcmVhdGVNYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1M6IHJldHVybiBjcmVhdGVNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMjogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTM6IHJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTOiByZXR1cm4gY3JlYXRlT3V0bGluZUNvZGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOSzogcmV0dXJuIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1Q6IHJldHVybiBjcmVhdGVQcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURTogcmV0dXJuIGNyZWF0ZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFUzogcmV0dXJuIGNyZWF0ZVJhdGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6IHJldHVybiBjcmVhdGVSZXNvdXJjZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFUzogcmV0dXJuIGNyZWF0ZVJlc291cmNlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0s6IHJldHVybiBjcmVhdGVUYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6IHJldHVybiBjcmVhdGVUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EOiByZXR1cm4gY3JlYXRlVGltZVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOiByZXR1cm4gY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6IHJldHVybiBjcmVhdGVWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMjogcmV0dXJuIGNyZWF0ZVZhbHVlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1Q6IHJldHVybiBjcmVhdGVWYWx1ZUxpc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVM6IHJldHVybiBjcmVhdGVWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTSzogcmV0dXJuIGNyZWF0ZVdCU01hc2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6IHJldHVybiBjcmVhdGVXQlNNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZOiByZXR1cm4gY3JlYXRlV2Vla0RheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzogcmV0dXJuIGNyZWF0ZVdlZWtEYXlzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FOiByZXR1cm4gY3JlYXRlV29ya2luZ1RpbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTOiByZXR1cm4gY3JlYXRlV29ya2luZ1RpbWVzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gY3JlYXRlQWNjcnVlQXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVBbGlhc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQXV0aG9yVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQm9va2luZ1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVCb29raW5nVHlwZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDYWxjdWxhdGlvblR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ2F0ZWdvcnlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb2RlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGFueVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludFR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb250YWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb3N0UmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeVN5bWJvbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEYXlUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEZWZhdWx0VGFza1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRW1haWxBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRllTdGFydERhdGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlR3JvdXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1R5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbHNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVMYWdGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hbmFnZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWF0ZXJpYWxMYWJlbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUzRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVOZXdUYXNrU3RhcnREYXRlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTlRBY2NvdW50VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVOdW1iZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBob25ldGljQWxpYXNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBob25ldGljc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUHJlZml4VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGx1cFR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3ViamVjdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3VicHJvamVjdE5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVGl0bGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlNEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlNUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVVSURUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVVbml0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXZWVrU3RhcnREYXlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtDb250b3VyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXb3JrR3JvdXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gY29udmVydEFjY3J1ZUF0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0QWxpYXNUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEF1dGhvclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJvb2tpbmdUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0Qm9va2luZ1R5cGVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q2FsY3VsYXRpb25UeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENhdGVnb3J5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29kZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbXBhbnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbnN0cmFpbnRUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29udGFjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29zdFJhdGVUYWJsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q3VycmVuY3lTeW1ib2xUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGF5VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERlZmF1bHRUYXNrRVZNZXRob2RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGVmYXVsdFRhc2tUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVtYWlsQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEZZU3RhcnREYXRlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEdyb3VwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEluaXRpYWxzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TGFnRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNYW5hZ2VyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1hdGVyaWFsTGFiZWxUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlM1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TmV3VGFza1N0YXJ0RGF0ZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE5UQWNjb3VudFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRPdXRsaW5lTnVtYmVyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQaG9uZXRpY0FsaWFzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQaG9uZXRpY3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFByZWZpeFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFJhdGVUYWJsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSb2xsdXBUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN1YmplY3RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN1YnByb2plY3ROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRpdGxlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VUlEVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VW5pdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V2Vla1N0YXJ0RGF5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrQ29udG91clR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V29ya0dyb3VwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXNzaWdubWVudCBjcmVhdGVBc3NpZ25tZW50KCkgewotCQlBc3NpZ25tZW50SW1wbCBhc3NpZ25tZW50ID0gbmV3IEFzc2lnbm1lbnRJbXBsKCk7Ci0JCXJldHVybiBhc3NpZ25tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBc3NpZ25tZW50cyBjcmVhdGVBc3NpZ25tZW50cygpIHsKLQkJQXNzaWdubWVudHNJbXBsIGFzc2lnbm1lbnRzID0gbmV3IEFzc2lnbm1lbnRzSW1wbCgpOwotCQlyZXR1cm4gYXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF2YWlsYWJpbGl0eVBlcmlvZCBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZEltcGwgYXZhaWxhYmlsaXR5UGVyaW9kID0gbmV3IEF2YWlsYWJpbGl0eVBlcmlvZEltcGwoKTsKLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXZhaWxhYmlsaXR5UGVyaW9kcyBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RzKCkgewotCQlBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCBhdmFpbGFiaWxpdHlQZXJpb2RzID0gbmV3IEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsKCk7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXNlbGluZSBjcmVhdGVCYXNlbGluZSgpIHsKLQkJQmFzZWxpbmVJbXBsIGJhc2VsaW5lID0gbmV3IEJhc2VsaW5lSW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJhc2VsaW5lMiBjcmVhdGVCYXNlbGluZTIoKSB7Ci0JCUJhc2VsaW5lMkltcGwgYmFzZWxpbmUyID0gbmV3IEJhc2VsaW5lMkltcGwoKTsKLQkJcmV0dXJuIGJhc2VsaW5lMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmFzZWxpbmUzIGNyZWF0ZUJhc2VsaW5lMygpIHsKLQkJQmFzZWxpbmUzSW1wbCBiYXNlbGluZTMgPSBuZXcgQmFzZWxpbmUzSW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWxlbmRhciBjcmVhdGVDYWxlbmRhcigpIHsKLQkJQ2FsZW5kYXJJbXBsIGNhbGVuZGFyID0gbmV3IENhbGVuZGFySW1wbCgpOwotCQlyZXR1cm4gY2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFycyBjcmVhdGVDYWxlbmRhcnMoKSB7Ci0JCUNhbGVuZGFyc0ltcGwgY2FsZW5kYXJzID0gbmV3IENhbGVuZGFyc0ltcGwoKTsKLQkJcmV0dXJuIGNhbGVuZGFyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpIHsKLQkJRG9jdW1lbnRSb290SW1wbCBkb2N1bWVudFJvb3QgPSBuZXcgRG9jdW1lbnRSb290SW1wbCgpOwotCQlyZXR1cm4gZG9jdW1lbnRSb290OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZSBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsIGV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlMiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlMkltcGwgZXh0ZW5kZWRBdHRyaWJ1dGUyID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlMkltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRBdHRyaWJ1dGUzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMygpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCBleHRlbmRlZEF0dHJpYnV0ZTMgPSBuZXcgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZTQgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCkgewotCQlFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIGV4dGVuZGVkQXR0cmlidXRlNCA9IG5ldyBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsKCk7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlcyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlc0ltcGwgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlc0ltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFzayBjcmVhdGVNYXNrKCkgewotCQlNYXNrSW1wbCBtYXNrID0gbmV3IE1hc2tJbXBsKCk7Ci0JCXJldHVybiBtYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXNrcyBjcmVhdGVNYXNrcygpIHsKLQkJTWFza3NJbXBsIG1hc2tzID0gbmV3IE1hc2tzSW1wbCgpOwotCQlyZXR1cm4gbWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlIGNyZWF0ZU91dGxpbmVDb2RlKCkgewotCQlPdXRsaW5lQ29kZUltcGwgb3V0bGluZUNvZGUgPSBuZXcgT3V0bGluZUNvZGVJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGUyIGNyZWF0ZU91dGxpbmVDb2RlMigpIHsKLQkJT3V0bGluZUNvZGUySW1wbCBvdXRsaW5lQ29kZTIgPSBuZXcgT3V0bGluZUNvZGUySW1wbCgpOwotCQlyZXR1cm4gb3V0bGluZUNvZGUyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRsaW5lQ29kZTMgY3JlYXRlT3V0bGluZUNvZGUzKCkgewotCQlPdXRsaW5lQ29kZTNJbXBsIG91dGxpbmVDb2RlMyA9IG5ldyBPdXRsaW5lQ29kZTNJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlcyBjcmVhdGVPdXRsaW5lQ29kZXMoKSB7Ci0JCU91dGxpbmVDb2Rlc0ltcGwgb3V0bGluZUNvZGVzID0gbmV3IE91dGxpbmVDb2Rlc0ltcGwoKTsKLQkJcmV0dXJuIG91dGxpbmVDb2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaW5rIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpIHsKLQkJUHJlZGVjZXNzb3JMaW5rSW1wbCBwcmVkZWNlc3NvckxpbmsgPSBuZXcgUHJlZGVjZXNzb3JMaW5rSW1wbCgpOwotCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoKSB7Ci0JCVByb2plY3RJbXBsIHByb2plY3QgPSBuZXcgUHJvamVjdEltcGwoKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJhdGUgY3JlYXRlUmF0ZSgpIHsKLQkJUmF0ZUltcGwgcmF0ZSA9IG5ldyBSYXRlSW1wbCgpOwotCQlyZXR1cm4gcmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmF0ZXMgY3JlYXRlUmF0ZXMoKSB7Ci0JCVJhdGVzSW1wbCByYXRlcyA9IG5ldyBSYXRlc0ltcGwoKTsKLQkJcmV0dXJuIHJhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsKLQkJUmVzb3VyY2VJbXBsIHJlc291cmNlID0gbmV3IFJlc291cmNlSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlc0ltcGwgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlc0ltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKCkgewotCQlUYXNrSW1wbCB0YXNrID0gbmV3IFRhc2tJbXBsKCk7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrcyBjcmVhdGVUYXNrcygpIHsKLQkJVGFza3NJbXBsIHRhc2tzID0gbmV3IFRhc2tzSW1wbCgpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRpbWVQZXJpb2QgY3JlYXRlVGltZVBlcmlvZCgpIHsKLQkJVGltZVBlcmlvZEltcGwgdGltZVBlcmlvZCA9IG5ldyBUaW1lUGVyaW9kSW1wbCgpOwotCQlyZXR1cm4gdGltZVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZXBoYXNlZERhdGFUeXBlIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZSgpIHsKLQkJVGltZXBoYXNlZERhdGFUeXBlSW1wbCB0aW1lcGhhc2VkRGF0YVR5cGUgPSBuZXcgVGltZXBoYXNlZERhdGFUeXBlSW1wbCgpOwotCQlyZXR1cm4gdGltZXBoYXNlZERhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZSBjcmVhdGVWYWx1ZSgpIHsKLQkJVmFsdWVJbXBsIHZhbHVlID0gbmV3IFZhbHVlSW1wbCgpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlMiBjcmVhdGVWYWx1ZTIoKSB7Ci0JCVZhbHVlMkltcGwgdmFsdWUyID0gbmV3IFZhbHVlMkltcGwoKTsKLQkJcmV0dXJuIHZhbHVlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVMaXN0IGNyZWF0ZVZhbHVlTGlzdCgpIHsKLQkJVmFsdWVMaXN0SW1wbCB2YWx1ZUxpc3QgPSBuZXcgVmFsdWVMaXN0SW1wbCgpOwotCQlyZXR1cm4gdmFsdWVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZXMgY3JlYXRlVmFsdWVzKCkgewotCQlWYWx1ZXNJbXBsIHZhbHVlcyA9IG5ldyBWYWx1ZXNJbXBsKCk7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdCU01hc2sgY3JlYXRlV0JTTWFzaygpIHsKLQkJV0JTTWFza0ltcGwgd2JzTWFzayA9IG5ldyBXQlNNYXNrSW1wbCgpOwotCQlyZXR1cm4gd2JzTWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFza3MgY3JlYXRlV0JTTWFza3MoKSB7Ci0JCVdCU01hc2tzSW1wbCB3YnNNYXNrcyA9IG5ldyBXQlNNYXNrc0ltcGwoKTsKLQkJcmV0dXJuIHdic01hc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWVrRGF5IGNyZWF0ZVdlZWtEYXkoKSB7Ci0JCVdlZWtEYXlJbXBsIHdlZWtEYXkgPSBuZXcgV2Vla0RheUltcGwoKTsKLQkJcmV0dXJuIHdlZWtEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlZWtEYXlzIGNyZWF0ZVdlZWtEYXlzKCkgewotCQlXZWVrRGF5c0ltcGwgd2Vla0RheXMgPSBuZXcgV2Vla0RheXNJbXBsKCk7Ci0JCXJldHVybiB3ZWVrRGF5czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWUgY3JlYXRlV29ya2luZ1RpbWUoKSB7Ci0JCVdvcmtpbmdUaW1lSW1wbCB3b3JraW5nVGltZSA9IG5ldyBXb3JraW5nVGltZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JraW5nVGltZXMgY3JlYXRlV29ya2luZ1RpbWVzKCkgewotCQlXb3JraW5nVGltZXNJbXBsIHdvcmtpbmdUaW1lcyA9IG5ldyBXb3JraW5nVGltZXNJbXBsKCk7Ci0JCXJldHVybiB3b3JraW5nVGltZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQWNjcnVlQXRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QWNjcnVlQXRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBbGlhc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBdXRob3JUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBdXRob3JUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUJvb2tpbmdUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb29raW5nVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCb29raW5nVHlwZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEJvb2tpbmdUeXBlVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDYWxjdWxhdGlvblR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhbGN1bGF0aW9uVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNhdGVnb3J5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q2F0ZWdvcnlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvZGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb2RlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVDb21wYW55VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29tcGFueVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUNvbnN0cmFpbnRUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25zdHJhaW50VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbnRhY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb250YWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQ29zdFJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29zdFJhdGVUYWJsZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ3VycmVuY3lTeW1ib2xUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURheVR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERheVR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRUYXNrRVZNZXRob2RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdFRhc2tUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREZWZhdWx0VGFza1R5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTNGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlM1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFYXJuZWRWYWx1ZU1ldGhvZFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVtYWlsQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVtYWlsQWRkcmVzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEV4dGVybmFsVGFza1Byb2plY3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRllTdGFydERhdGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZZU3RhcnREYXRlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRHcm91cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1R5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSW5pdGlhbHNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbml0aWFsc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxhZ0Zvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TGFnRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTWFuYWdlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1hbmFnZXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU1hdGVyaWFsTGFiZWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNYXRlcmlhbExhYmVsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUzRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5ld1Rhc2tTdGFydERhdGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOVEFjY291bnRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROVEFjY291bnRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU91dGxpbmVOdW1iZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdXRsaW5lTnVtYmVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdmVydGltZVJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVBob25ldGljQWxpYXNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQaG9uZXRpY0FsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVQaG9uZXRpY3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQaG9uZXRpY3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVByZWZpeFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFByZWZpeFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UmF0ZVRhYmxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVJvbGx1cFR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGx1cFR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN1YmplY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdWJqZWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTdWJwcm9qZWN0TmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN1YnByb2plY3ROYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVUaXRsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRpdGxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlM0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGU0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGU1RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlNVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlVUlEVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VUlEVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVW5pdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VW5pdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlbGlzdFNvcnRPcmRlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXZWVrU3RhcnREYXlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdlZWtTdGFydERheVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrQ29udG91clR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0NvbnRvdXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlV29ya0Zvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0Zvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrR3JvdXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtHcm91cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UGFja2FnZSBnZXRNc3Byb2plY3RQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1zcHJvamVjdFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vTXNwcm9qZWN0RmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjJhMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UGFja2FnZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuRWNvcmVSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RWYWxpZGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNc3Byb2plY3RQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VGaWxlbmFtZSA9ICJtc3Byb2plY3QuZWNvcmUiOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXNzaWdubWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NpZ25tZW50c0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdmFpbGFiaWxpdHlQZXJpb2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYmFzZWxpbmUzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhbGVuZGFyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhbGVuZGFyc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb2N1bWVudFJvb3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1hc2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWFza3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGUyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGxpbmVDb2RlM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRsaW5lQ29kZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJlZGVjZXNzb3JMaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2plY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByYXRlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0aW1lUGVyaW9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFsdWVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhbHVlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3YnNNYXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdic01hc2tzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlZWtEYXlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2Vla0RheXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2luZ1RpbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2luZ1RpbWVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFjY3J1ZUF0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBhdXRob3JUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBib29raW5nVHlwZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY2F0ZWdvcnlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvZGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbXBhbnlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjb250YWN0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjb3N0UmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGF5VHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBncm91cFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaW5pdGlhbHNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1hbmFnZXJUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBuYW1lVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmFtZVR5cGUzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5ld1Rhc2tTdGFydERhdGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG50QWNjb3VudFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgb3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwaG9uZXRpY3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHByZWZpeFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByb2xsdXBUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN1YmplY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0aXRsZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZTNFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGU0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlNUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB1aWRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVuaXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHZhbHVlbGlzdFNvcnRPcmRlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd2Vla1N0YXJ0RGF5VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya0dyb3VwVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1zcHJvamVjdFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNc3Byb2plY3RGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNc3Byb2plY3RQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChNc3Byb2plY3RQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlNc3Byb2plY3RQYWNrYWdlSW1wbCB0aGVNc3Byb2plY3RQYWNrYWdlID0gKE1zcHJvamVjdFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE1zcHJvamVjdFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgTXNwcm9qZWN0UGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIExvYWQgcGFja2FnZXMKLQkJdGhlTXNwcm9qZWN0UGFja2FnZS5sb2FkUGFja2FnZSgpOwotCi0JCS8vIEZpeCBsb2FkZWQgcGFja2FnZXMKLQkJdGhlTXNwcm9qZWN0UGFja2FnZS5maXhQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBSZWdpc3RlciBwYWNrYWdlIHZhbGlkYXRvcgotCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dAotCQkJKHRoZU1zcHJvamVjdFBhY2thZ2UsIAotCQkJIG5ldyBFVmFsaWRhdG9yLkRlc2NyaXB0b3IoKSB7Ci0JCQkJIHB1YmxpYyBFVmFsaWRhdG9yIGdldEVWYWxpZGF0b3IoKSB7Ci0JCQkJCSByZXR1cm4gTXNwcm9qZWN0VmFsaWRhdG9yLklOU1RBTkNFOwotCQkJCSB9Ci0JCQkgfSk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVNc3Byb2plY3RQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVNc3Byb2plY3RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzaWdubWVudCgpIHsKLQkJaWYgKGFzc2lnbm1lbnRFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMyk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9QZXJjZW50V29ya0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NvbmZpcm1lZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0UmF0ZVRhYmxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9EZWxheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlZ3VsYXJXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0b3AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXN1bWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VcGRhdGVOZWVkZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9WQUMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Jvb2tpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfQmFzZWxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFzc2lnbm1lbnRzKCkgewotCQlpZiAoYXNzaWdubWVudHNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudHNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQpOwotCQl9Ci0JCXJldHVybiBhc3NpZ25tZW50c0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudHMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kRUNsYXNzID09IG51bGwpIHsKLQkJCWF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNik7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVRvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLQkJaWYgKGF2YWlsYWJpbGl0eVBlcmlvZHNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNyk7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kc19BdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmVFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfSW50ZXJpbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmFzZWxpbmUyKCkgewotCQlpZiAoYmFzZWxpbmUyRUNsYXNzID09IG51bGwpIHsKLQkJCWJhc2VsaW5lMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOSk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCYXNlbGluZTMoKSB7Ci0JCWlmIChiYXNlbGluZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMCk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FsZW5kYXIoKSB7Ci0JCWlmIChjYWxlbmRhckVDbGFzcyA9PSBudWxsKSB7Ci0JCQljYWxlbmRhckVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTUpOwotCQl9Ci0JCXJldHVybiBjYWxlbmRhckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FsZW5kYXJfTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9Jc0Jhc2VDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9CYXNlQ2FsZW5kYXJVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJfV2Vla0RheXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYWxlbmRhcnMoKSB7Ci0JCWlmIChjYWxlbmRhcnNFQ2xhc3MgPT0gbnVsbCkgewotCQkJY2FsZW5kYXJzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxNik7Ci0JCX0KLQkJcmV0dXJuIGNhbGVuZGFyc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYWxlbmRhcnNfQ2FsZW5kYXIoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRDYWxlbmRhcnMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCkgewotCQlpZiAoZG9jdW1lbnRSb290RUNsYXNzID09IG51bGwpIHsKLQkJCWRvY3VtZW50Um9vdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjkpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFJvb3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RG9jdW1lbnRSb290KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldERvY3VtZW50Um9vdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzkpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9QaG9uZXRpY0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1JvbGx1cFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQ2FsY3VsYXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0Zvcm11bGEoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUmVzdHJpY3RWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVsaXN0U29ydE9yZGVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FwcGVuZE5ld1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9EZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDApOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9EdXJhdGlvbkZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0MSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlNCgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlNEVDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQyKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDMpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzX0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1hc2soKSB7Ci0JCWlmIChtYXNrRUNsYXNzID09IG51bGwpIHsKLQkJCW1hc2tFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYyKTsKLQkJfQotCQlyZXR1cm4gbWFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX0xldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFza19MZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX1NlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE1hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWFza3MoKSB7Ci0JCWlmIChtYXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQltYXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjMpOwotCQl9Ci0JCXJldHVybiBtYXNrc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNYXNrc19NYXNrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0TWFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzEpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9MZWFmT25seSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGxMZXZlbHNSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9Pbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9NYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRsaW5lQ29kZTIoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Mik7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGUzKCkgewotCQlpZiAob3V0bGluZUNvZGUzRUNsYXNzID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlM0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzMpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZTNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlM19WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGxpbmVDb2RlcygpIHsKLQkJaWYgKG91dGxpbmVDb2Rlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc0KTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGVzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2Rlc19PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmVkZWNlc3NvckxpbmsoKSB7Ci0JCWlmIChwcmVkZWNlc3NvckxpbmtFQ2xhc3MgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JMaW5rRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4MCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0xpbmtMYWcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKHByb2plY3RFQ2xhc3MgPT0gbnVsbCkgewotCQkJcHJvamVjdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODIpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9UaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ViamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ2F0ZWdvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NvbXBhbnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dGhvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZXZpc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTGFzdFNhdmVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRllTdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Dcml0aWNhbFNsYWNrTGltaXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YXJ0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWludXRlc1BlckRheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJXZWVrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGF5c1Blck1vbnRoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfV29ya0Zvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0VkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Ib25vckNvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OZXdUYXNrc0VmZm9ydERyaXZlbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ByZWFkQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaXNjYWxZZWFyU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N0YXR1c0RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BdXRvbGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0VGFza0VWTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FeHRlbmRlZENyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1dCU01hc2tzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfRXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfQ2FsZW5kYXJzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfVGFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9SZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJhdGUoKSB7Ci0JCWlmIChyYXRlRUNsYXNzID09IG51bGwpIHsKLQkJCXJhdGVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgzKTsKLQkJfQotCQlyZXR1cm4gcmF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZXNUbygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZVRhYmxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9TdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9PdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX0Nvc3RQZXJVc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJhdGVzKCkgewotCQlpZiAocmF0ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmF0ZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg0KTsKLQkJfQotCQlyZXR1cm4gcmF0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmF0ZXNfUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJhdGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlKCkgewotCQlpZiAocmVzb3VyY2VFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg2KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc051bGwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05UQWNjb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9NYXRlcmlhbExhYmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfR3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX01heFVuaXRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZWFrVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJBbGxvY2F0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZVRvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYW5MZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlZ3VsYXJXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbFdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TVigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Ob3RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNHZW5lcmljKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0Jvb2tpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdGl2ZURpcmVjdG9yeUdVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX0Jhc2VsaW5lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfUmF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg3KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlc19SZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrKCkgewotCQlpZiAodGFza0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl0YXNrRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5Myk7Ci0JCX0KLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc051bGwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NyZWF0ZURhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnRhY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1dCUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV0JTTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1ByaW9yaXR5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N0b3AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWVWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VmZm9ydERyaXZlbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlY3VycmluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX092ZXJBbGxvY2F0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19NaWxlc3RvbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdW1tYXJ5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ3JpdGljYWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3RSZWFkT25seSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N1YnByb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcmx5U3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdGFydFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GcmVlU2xhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Ub3RhbFNsYWNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0QWNjcnVhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbENvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVndWxhcldvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdEdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NWKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ29uc3RyYWludFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19DYWxlbmRhclVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRGVhZGxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZEZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDczKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGlua0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19IeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSGlkZUJhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JvbGx1cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FYXJuZWRWYWx1ZU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1ByZWRlY2Vzc29yTGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19FeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX0Jhc2VsaW5lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3V0bGluZUNvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tzKCkgewotCQlpZiAodGFza3NFQ2xhc3MgPT0gbnVsbCkgewotCQkJdGFza3NFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk0KTsKLQkJfQotCQlyZXR1cm4gdGFza3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza3NfVGFzaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRpbWVQZXJpb2QoKSB7Ci0JCWlmICh0aW1lUGVyaW9kRUNsYXNzID09IG51bGwpIHsKLQkJCXRpbWVQZXJpb2RFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk1KTsKLQkJfQotCQlyZXR1cm4gdGltZVBlcmlvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX0Zyb21EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZVBlcmlvZF9Ub0RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lUGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRpbWVwaGFzZWREYXRhVHlwZSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YVR5cGVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk2KTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGFUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9Vbml0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQl2YWx1ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA2KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZV9QYXJlbnRWYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX0Rlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWUyKCkgewotCQlpZiAodmFsdWUyRUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA3KTsKLQkJfQotCQlyZXR1cm4gdmFsdWUyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlMl9JRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWUyX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWVMaXN0KCkgewotCQlpZiAodmFsdWVMaXN0RUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlTGlzdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA4KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbHVlTGlzdF9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFZhbHVlTGlzdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZXMoKSB7Ci0JCWlmICh2YWx1ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJdmFsdWVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTApOwotCQl9Ci0JCXJldHVybiB2YWx1ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVzX0dyb3VwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWYWx1ZXNfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRWYWx1ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0JTTWFzaygpIHsKLQkJaWYgKHdic01hc2tFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2JzTWFza0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTExKTsKLQkJfQotCQlyZXR1cm4gd2JzTWFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza19MZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1NlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0JTTWFza3MoKSB7Ci0JCWlmICh3YnNNYXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3YnNNYXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTEyKTsKLQkJfQotCQlyZXR1cm4gd2JzTWFza3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfVmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19QcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V0JTTWFza3NfV0JTTWFzaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlZWtEYXkoKSB7Ci0JCWlmICh3ZWVrRGF5RUNsYXNzID09IG51bGwpIHsKLQkJCXdlZWtEYXlFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExMyk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlXb3JraW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlZWtEYXlzKCkgewotCQlpZiAod2Vla0RheXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2Vla0RheXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNCk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXlzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlZWtEYXlzX1dlZWtEYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5cygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JraW5nVGltZSgpIHsKLQkJaWYgKHdvcmtpbmdUaW1lRUNsYXNzID09IG51bGwpIHsKLQkJCXdvcmtpbmdUaW1lRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTkpOwotCQl9Ci0JCXJldHVybiB3b3JraW5nVGltZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdvcmtpbmdUaW1lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Ub1RpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXb3JraW5nVGltZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JraW5nVGltZXMoKSB7Ci0JCWlmICh3b3JraW5nVGltZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJd29ya2luZ1RpbWVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMjApOwotCQl9Ci0JCXJldHVybiB3b3JraW5nVGltZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya2luZ1RpbWVzX1dvcmtpbmdUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V29ya2luZ1RpbWVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFjY3J1ZUF0KCkgewotCQlpZiAoYWNjcnVlQXRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWNjcnVlQXRFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBhY2NydWVBdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCkgewotCQlpZiAoYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEpOwotCQl9Ci0JCXJldHVybiBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFsaWFzVHlwZSgpIHsKLQkJaWYgKGFsaWFzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhbGlhc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIpOwotCQl9Ci0JCXJldHVybiBhbGlhc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRBdXRob3JUeXBlKCkgewotCQlpZiAoYXV0aG9yVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhdXRob3JUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1KTsKLQkJfQotCQlyZXR1cm4gYXV0aG9yVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCkgewotCQlpZiAoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUoKSB7Ci0JCWlmIChib29raW5nVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYm9va2luZ1R5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMik7Ci0JCX0KLQkJcmV0dXJuIGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJvb2tpbmdUeXBlVHlwZTEoKSB7Ci0JCWlmIChib29raW5nVHlwZVR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWJvb2tpbmdUeXBlVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEzKTsKLQkJfQotCQlyZXR1cm4gYm9va2luZ1R5cGVUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENhbGN1bGF0aW9uVHlwZVR5cGUoKSB7Ci0JCWlmIChjYWxjdWxhdGlvblR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE0KTsKLQkJfQotCQlyZXR1cm4gY2FsY3VsYXRpb25UeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENhdGVnb3J5VHlwZSgpIHsKLQkJaWYgKGNhdGVnb3J5VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljYXRlZ29yeVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE3KTsKLQkJfQotCQlyZXR1cm4gY2F0ZWdvcnlUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q29kZVR5cGUoKSB7Ci0JCWlmIChjb2RlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb2RlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTgpOwotCQl9Ci0JCXJldHVybiBjb2RlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbXBhbnlUeXBlKCkgewotCQlpZiAoY29tcGFueVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29tcGFueVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE5KTsKLQkJfQotCQlyZXR1cm4gY29tcGFueVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb25zdHJhaW50VHlwZVR5cGUoKSB7Ci0JCWlmIChjb25zdHJhaW50VHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29uc3RyYWludFR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbnRhY3RUeXBlKCkgewotCQlpZiAoY29udGFjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29udGFjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIxKTsKLQkJfQotCQlyZXR1cm4gY29udGFjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb3N0UmF0ZVRhYmxlVHlwZSgpIHsKLQkJaWYgKGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMik7Ci0JCX0KLQkJcmV0dXJuIGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoKSB7Ci0JCWlmIChjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjMpOwotCQl9Ci0JCXJldHVybiBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEN1cnJlbmN5U3ltYm9sVHlwZSgpIHsKLQkJaWYgKGN1cnJlbmN5U3ltYm9sVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI0KTsKLQkJfQotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2xUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGF5VHlwZVR5cGUoKSB7Ci0JCWlmIChkYXlUeXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkYXlUeXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjUpOwotCQl9Ci0JCXJldHVybiBkYXlUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI2KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjcpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERlZmF1bHRUYXNrVHlwZVR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VGFza1R5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI4KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDMwKTsKLQkJfQotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzEpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzIpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMygpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlM0VEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzMpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlNEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzQpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGU0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzUpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGU1RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlKCkgewotCQlpZiAoZWFybmVkVmFsdWVNZXRob2RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWVhcm5lZFZhbHVlTWV0aG9kVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzYpOwotCQl9Ci0JCXJldHVybiBlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKCkgewotCQlpZiAoZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQllYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNyk7Ci0JCX0KLQkJcmV0dXJuIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFbWFpbEFkZHJlc3NUeXBlKCkgewotCQlpZiAoZW1haWxBZGRyZXNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQllbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzOCk7Ci0JCX0KLQkJcmV0dXJuIGVtYWlsQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpIHsKLQkJaWYgKGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0NCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSB7Ci0JCWlmIChmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDUpOwotCQl9Ci0JCXJldHVybiBmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEZZU3RhcnREYXRlVHlwZSgpIHsKLQkJaWYgKGZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlmeVN0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQ2KTsKLQkJfQotCQlyZXR1cm4gZnlTdGFydERhdGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0R3JvdXBUeXBlKCkgewotCQlpZiAoZ3JvdXBUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWdyb3VwVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDcpOwotCQl9Ci0JCXJldHVybiBncm91cFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpIHsKLQkJaWYgKGh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0OCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUxKCkgewotCQlpZiAoaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua0FkZHJlc3NUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDkpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtBZGRyZXNzVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKSB7Ci0JCWlmIChoeXBlcmxpbmtBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1MCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlKCkgewotCQlpZiAoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUxKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1Mik7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpIHsKLQkJaWYgKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUzKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZSgpIHsKLQkJaWYgKGh5cGVybGlua1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTQpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTUpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUyKCkgewotCQlpZiAoaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU2KTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRJbml0aWFsc1R5cGUoKSB7Ci0JCWlmIChpbml0aWFsc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaW5pdGlhbHNUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1Nyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExhZ0Zvcm1hdFR5cGUoKSB7Ci0JCWlmIChsYWdGb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU4KTsKLQkJfQotCQlyZXR1cm4gbGFnRm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlKCkgewotCQlpZiAobGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU5KTsKLQkJfQotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2MCk7Ci0JCX0KLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1hbmFnZXJUeXBlKCkgewotCQlpZiAobWFuYWdlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbWFuYWdlclR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYxKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlclR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNYXRlcmlhbExhYmVsVHlwZSgpIHsKLQkJaWYgKG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2NCk7Ci0JCX0KLQkJcmV0dXJuIG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUoKSB7Ci0JCWlmIChuYW1lVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjUpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5hbWVUeXBlMSgpIHsKLQkJaWYgKG5hbWVUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY2KTsKLQkJfQotCQlyZXR1cm4gbmFtZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUyKCkgewotCQlpZiAobmFtZVR5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW5hbWVUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjcpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROYW1lVHlwZTMoKSB7Ci0JCWlmIChuYW1lVHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmFtZVR5cGUzRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2OCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVUeXBlM0VEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCkgewotCQlpZiAobmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY5KTsKLQkJfQotCQlyZXR1cm4gbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROVEFjY291bnRUeXBlKCkgewotCQlpZiAobnRBY2NvdW50VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQludEFjY291bnRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3MCk7Ci0JCX0KLQkJcmV0dXJuIG50QWNjb3VudFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPdXRsaW5lTnVtYmVyVHlwZSgpIHsKLQkJaWYgKG91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3NSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSgpIHsKLQkJaWYgKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzYpOwotCQl9Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzcpOwotCQl9Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFBob25ldGljQWxpYXNUeXBlKCkgewotCQlpZiAocGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJcGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc4KTsKLQkJfQotCQlyZXR1cm4gcGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQaG9uZXRpY3NUeXBlKCkgewotCQlpZiAocGhvbmV0aWNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwaG9uZXRpY3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3OSk7Ci0JCX0KLQkJcmV0dXJuIHBob25ldGljc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQcmVmaXhUeXBlKCkgewotCQlpZiAocHJlZml4VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwcmVmaXhUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4MSk7Ci0JCX0KLQkJcmV0dXJuIHByZWZpeFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSYXRlVGFibGVUeXBlKCkgewotCQlpZiAocmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlyYXRlVGFibGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4NSk7Ci0JCX0KLQkJcmV0dXJuIHJhdGVUYWJsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSb2xsdXBUeXBlVHlwZSgpIHsKLQkJaWYgKHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4OCk7Ci0JCX0KLQkJcmV0dXJuIHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpIHsKLQkJaWYgKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3RhbmRhcmRSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODkpOwotCQl9Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTApOwotCQl9Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFN1YmplY3RUeXBlKCkgewotCQlpZiAoc3ViamVjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3ViamVjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDkxKTsKLQkJfQotCQlyZXR1cm4gc3ViamVjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdWJwcm9qZWN0TmFtZVR5cGUoKSB7Ci0JCWlmIChzdWJwcm9qZWN0TmFtZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3VicHJvamVjdE5hbWVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5Mik7Ci0JCX0KLQkJcmV0dXJuIHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFRpdGxlVHlwZSgpIHsKLQkJaWYgKHRpdGxlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0aXRsZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk3KTsKLQkJfQotCQlyZXR1cm4gdGl0bGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUoKSB7Ci0JCWlmICh0eXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTgpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFR5cGVUeXBlMSgpIHsKLQkJaWYgKHR5cGVUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk5KTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUyKCkgewotCQlpZiAodHlwZVR5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAwKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUzKCkgewotCQlpZiAodHlwZVR5cGUzRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlM0VEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAxKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGU0KCkgewotCQlpZiAodHlwZVR5cGU0RURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlNEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAyKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGU0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGU1KCkgewotCQlpZiAodHlwZVR5cGU1RURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlNUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAzKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGU1RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VUlEVHlwZSgpIHsKLQkJaWYgKHVpZFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdWlkVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA0KTsKLQkJfQotCQlyZXR1cm4gdWlkVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFVuaXRUeXBlKCkgewotCQlpZiAodW5pdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdW5pdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEwNSk7Ci0JCX0KLQkJcmV0dXJuIHVuaXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VmFsdWVsaXN0U29ydE9yZGVyVHlwZSgpIHsKLQkJaWYgKHZhbHVlbGlzdFNvcnRPcmRlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA5KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdlZWtTdGFydERheVR5cGUoKSB7Ci0JCWlmICh3ZWVrU3RhcnREYXlUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdlZWtTdGFydERheVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNSk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtTdGFydERheVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrQ29udG91clR5cGUoKSB7Ci0JCWlmICh3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd29ya0NvbnRvdXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTYpOwotCQl9Ci0JCXJldHVybiB3b3JrQ29udG91clR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrRm9ybWF0VHlwZSgpIHsKLQkJaWYgKHdvcmtGb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdvcmtGb3JtYXRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTcpOwotCQl9Ci0JCXJldHVybiB3b3JrRm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdvcmtHcm91cFR5cGUoKSB7Ci0JCWlmICh3b3JrR3JvdXBUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdvcmtHcm91cFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExOCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtHcm91cFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEZhY3RvcnkgZ2V0TXNwcm9qZWN0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNc3Byb2plY3RGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMb2FkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIExhb2RzIHRoZSBwYWNrYWdlIGFuZCBhbnkgc3ViLXBhY2thZ2VzIGZyb20gdGhlaXIgc2VyaWFsaXplZCBmb3JtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRQYWNrYWdlKCkgewotCQlpZiAoaXNMb2FkZWQpIHJldHVybjsKLQkJaXNMb2FkZWQgPSB0cnVlOwotCi0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKHBhY2thZ2VGaWxlbmFtZSk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc3Npbmcgc2VyaWFsaXplZCBwYWNrYWdlOiAiICsgcGFja2FnZUZpbGVuYW1lKTsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBFY29yZVJlc291cmNlRmFjdG9yeUltcGwoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVybC50b1N0cmluZygpKSk7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5sb2FkKG51bGwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0KLQkJaW5pdGlhbGl6ZUZyb21Mb2FkZWRFUGFja2FnZSh0aGlzLCAoRVBhY2thZ2UpcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpeGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGaXhlcyB1cCB0aGUgbG9hZGVkIHBhY2thZ2UsIHRvIG1ha2UgaXQgYXBwZWFyIGFzIGlmIGl0IGhhZCBiZWVuIHByb2dyYW1tYXRpY2FsbHkgYnVpbHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZml4UGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNGaXhlZCkgcmV0dXJuOwotCQlpc0ZpeGVkID0gdHJ1ZTsKLQkJZml4RUNsYXNzaWZpZXJzKCk7Ci0JfQotfSAvL01zcHJvamVjdFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwNmIxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGUySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTJJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGxpbmVDb2RlMkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlMiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlMkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRsaW5lQ29kZTIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vT3V0bGluZUNvZGUySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZmRhNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlM0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlM0ltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPdXRsaW5lQ29kZTMgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZTNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGUzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL091dGxpbmVDb2RlM0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5YWZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldFZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9IEZJRUxEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxpYXMoKSA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWxpYXMgPSBBTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljQWxpYXMgPSBQSE9ORVRJQ19BTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlcygpIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlcyB2YWx1ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW50ZXJwcmlzZSgpIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTlRFUlBSSVNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VudGVycHJpc2UoKSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnRlcnByaXNlID0gRU5URVJQUklTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRW50ZXJwcmlzZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzID0gRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZWFmT25seSgpIDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRUFGX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGVhZk9ubHkoKSA8ZW0+TGVhZiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZWFmT25seSA9IExFQUZfT05MWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGVhZiBPbmx5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZWFmT25seUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FsbExldmVsc1JlcXVpcmVkKCkgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FsbExldmVsc1JlcXVpcmVkKCkgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFsbExldmVsc1JlcXVpcmVkID0gQUxMX0xFVkVMU19SRVFVSVJFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQWxsIExldmVscyBSZXF1aXJlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBPTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFza3MoKSA8ZW0+TWFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFza3MgbWFza3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgbmV3RmllbGROYW1lKSB7Ci0JCVN0cmluZyBvbGRGaWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0JCWZpZWxkTmFtZSA9IG5ld0ZpZWxkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUUsIG9sZEZpZWxkTmFtZSwgZmllbGROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKLQkJcmV0dXJuIGFsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsaWFzKFN0cmluZyBuZXdBbGlhcykgewotCQlTdHJpbmcgb2xkQWxpYXMgPSBhbGlhczsKLQkJYWxpYXMgPSBuZXdBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMSUFTLCBvbGRBbGlhcywgYWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBob25ldGljQWxpYXMoKSB7Ci0JCXJldHVybiBwaG9uZXRpY0FsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIG5ld1Bob25ldGljQWxpYXMpIHsKLQkJU3RyaW5nIG9sZFBob25ldGljQWxpYXMgPSBwaG9uZXRpY0FsaWFzOwotCQlwaG9uZXRpY0FsaWFzID0gbmV3UGhvbmV0aWNBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTLCBvbGRQaG9uZXRpY0FsaWFzLCBwaG9uZXRpY0FsaWFzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlcyBnZXRWYWx1ZXMoKSB7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVzKFZhbHVlcyBuZXdWYWx1ZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmFsdWVzIG9sZFZhbHVlcyA9IHZhbHVlczsKLQkJdmFsdWVzID0gbmV3VmFsdWVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBvbGRWYWx1ZXMsIG5ld1ZhbHVlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKFZhbHVlcyBuZXdWYWx1ZXMpIHsKLQkJaWYgKG5ld1ZhbHVlcyAhPSB2YWx1ZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZXMobmV3VmFsdWVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVMsIG5ld1ZhbHVlcywgbmV3VmFsdWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlKGJvb2xlYW4gbmV3RW50ZXJwcmlzZSkgewotCQlib29sZWFuIG9sZEVudGVycHJpc2UgPSBlbnRlcnByaXNlOwotCQllbnRlcnByaXNlID0gbmV3RW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRFbnRlcnByaXNlRVNldCA9IGVudGVycHJpc2VFU2V0OwotCQllbnRlcnByaXNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFLCBvbGRFbnRlcnByaXNlLCBlbnRlcnByaXNlLCAhb2xkRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGVycHJpc2UoKSB7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZSA9IGVudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZUVTZXQgPSBlbnRlcnByaXNlRVNldDsKLQkJZW50ZXJwcmlzZSA9IEVOVEVSUFJJU0VfRURFRkFVTFQ7Ci0JCWVudGVycHJpc2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UsIG9sZEVudGVycHJpc2UsIEVOVEVSUFJJU0VfRURFRkFVTFQsIG9sZEVudGVycHJpc2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKSB7Ci0JCXJldHVybiBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyIG5ld0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQkJZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBuZXdFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTLCBvbGRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcywgZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbiBuZXdSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQpIHsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQ7Ci0JCXJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA9IG5ld1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkLCByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQsICFvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOwotCQlib29sZWFuIG9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0OwotCQlyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkLCBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWZPbmx5KCkgewotCQlyZXR1cm4gbGVhZk9ubHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVhZk9ubHkoYm9vbGVhbiBuZXdMZWFmT25seSkgewotCQlib29sZWFuIG9sZExlYWZPbmx5ID0gbGVhZk9ubHk7Ci0JCWxlYWZPbmx5ID0gbmV3TGVhZk9ubHk7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHlFU2V0ID0gbGVhZk9ubHlFU2V0OwotCQlsZWFmT25seUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZLCBvbGRMZWFmT25seSwgbGVhZk9ubHksICFvbGRMZWFmT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExlYWZPbmx5KCkgewotCQlib29sZWFuIG9sZExlYWZPbmx5ID0gbGVhZk9ubHk7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHlFU2V0ID0gbGVhZk9ubHlFU2V0OwotCQlsZWFmT25seSA9IExFQUZfT05MWV9FREVGQVVMVDsKLQkJbGVhZk9ubHlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWSwgb2xkTGVhZk9ubHksIExFQUZfT05MWV9FREVGQVVMVCwgb2xkTGVhZk9ubHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZWFmT25seSgpIHsKLQkJcmV0dXJuIGxlYWZPbmx5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbExldmVsc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsTGV2ZWxzUmVxdWlyZWQoYm9vbGVhbiBuZXdBbGxMZXZlbHNSZXF1aXJlZCkgewotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkID0gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWFsbExldmVsc1JlcXVpcmVkID0gbmV3QWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0OwotCQlhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWQsIGFsbExldmVsc1JlcXVpcmVkLCAhb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpIHsKLQkJYm9vbGVhbiBvbGRBbGxMZXZlbHNSZXF1aXJlZCA9IGFsbExldmVsc1JlcXVpcmVkOwotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkRVNldCA9IGFsbExldmVsc1JlcXVpcmVkRVNldDsKLQkJYWxsTGV2ZWxzUmVxdWlyZWQgPSBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUOwotCQlhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWQsIEFMTF9MRVZFTFNfUkVRVUlSRURfRURFRkFVTFQsIG9sZEFsbExldmVsc1JlcXVpcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBhbGxMZXZlbHNSZXF1aXJlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotCQlyZXR1cm4gb25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4gbmV3T25seVRhYmxlVmFsdWVzQWxsb3dlZCkgewotCQlib29sZWFuIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkOwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkID0gbmV3T25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQkJYm9vbGVhbiBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0OwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VELCBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkLCBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkLCAhb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQgPSBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldDsKLQkJb25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQ7Ci0JCW9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQsIE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotCQlyZXR1cm4gb25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hc2tzIGdldE1hc2tzKCkgewotCQlyZXR1cm4gbWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFza3MoTWFza3MgbmV3TWFza3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTWFza3Mgb2xkTWFza3MgPSBtYXNrczsKLQkJbWFza3MgPSBuZXdNYXNrczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBvbGRNYXNrcywgbmV3TWFza3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hc2tzKE1hc2tzIG5ld01hc2tzKSB7Ci0JCWlmIChuZXdNYXNrcyAhPSBtYXNrcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFza3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hc2tzKG5ld01hc2tzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUywgbmV3TWFza3MsIG5ld01hc2tzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJCXJldHVybiBiYXNpY1NldE1hc2tzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpZWxkTmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVM6Ci0JCQkJcmV0dXJuIGdldEFsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0UGhvbmV0aWNBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXJldHVybiBnZXRWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJcmV0dXJuIGlzRW50ZXJwcmlzZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJcmV0dXJuIGlzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXJldHVybiBpc0xlYWZPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNBbGxMZXZlbHNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJcmV0dXJuIGlzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXJldHVybiBnZXRNYXNrcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJc2V0VmFsdWVzKChWYWx1ZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJc2V0RW50ZXJwcmlzZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUzoKLQkJCQlzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWToKLQkJCQlzZXRMZWFmT25seSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXNldEFsbExldmVsc1JlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUzoKLQkJCQlzZXRNYXNrcygoTWFza3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZShGSUVMRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlzZXRBbGlhcyhBTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcyhQSE9ORVRJQ19BTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXNldFZhbHVlcygoVmFsdWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJdW5zZXRFbnRlcnByaXNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVM6Ci0JCQkJc2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEOgotCQkJCXVuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXVuc2V0TGVhZk9ubHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXVuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEOgotCQkJCXVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXNldE1hc2tzKChNYXNrcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIEZJRUxEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkTmFtZSAhPSBudWxsIDogIUZJRUxEX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpZWxkTmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlyZXR1cm4gQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsaWFzICE9IG51bGwgOiAhQUxJQVNfRURFRkFVTFQuZXF1YWxzKGFsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9PSBudWxsID8gcGhvbmV0aWNBbGlhcyAhPSBudWxsIDogIVBIT05FVElDX0FMSUFTX0VERUZBVUxULmVxdWFscyhwaG9uZXRpY0FsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUzoKLQkJCQlyZXR1cm4gdmFsdWVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFOgotCQkJCXJldHVybiBpc1NldEVudGVycHJpc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXJldHVybiBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCA9PSBudWxsID8gZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgIT0gbnVsbCA6ICFFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVC5lcXVhbHMoZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFk6Ci0JCQkJcmV0dXJuIGlzU2V0TGVhZk9ubHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJcmV0dXJuIG1hc2tzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaG9uZXRpY0FsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY0FsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnRlcnByaXNlOiAiKTsKLQkJaWYgKGVudGVycHJpc2VFU2V0KSByZXN1bHQuYXBwZW5kKGVudGVycHJpc2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDogIik7Ci0JCWlmIChyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlYWZPbmx5OiAiKTsKLQkJaWYgKGxlYWZPbmx5RVNldCkgcmVzdWx0LmFwcGVuZChsZWFmT25seSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsbExldmVsc1JlcXVpcmVkOiAiKTsKLQkJaWYgKGFsbExldmVsc1JlcXVpcmVkRVNldCkgcmVzdWx0LmFwcGVuZChhbGxMZXZlbHNSZXF1aXJlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ6ICIpOwotCQlpZiAob25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpIHJlc3VsdC5hcHBlbmQob25seVRhYmxlVmFsdWVzQWxsb3dlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNkM2M3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVzSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0bGluZUNvZGVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0bGluZUNvZGVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lQ29kZSgpIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRsaW5lQ29kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0bGluZUNvZGVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPdXRsaW5lQ29kZSgpIHsKLQkJaWYgKG91dGxpbmVDb2RlID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE91dGxpbmVDb2RlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0bGluZUNvZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gb3V0bGluZUNvZGUgIT0gbnVsbCAmJiAhb3V0bGluZUNvZGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ByZWRlY2Vzc29yTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2YTM5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0UHJlZGVjZXNzb3JVSUQgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldENyb3NzUHJvamVjdE5hbWUgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldExhZ0Zvcm1hdCA8ZW0+TGFnIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTGlua0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByZWRlY2Vzc29yTGluayB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yVUlEKCkgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3JVSUQoKSA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcHJlZGVjZXNzb3JVSUQgPSBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3Jvc3NQcm9qZWN0KCkgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ1JPU1NfUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcm9zc1Byb2plY3QoKSA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUHJvamVjdCA9IENST1NTX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENyb3NzIFByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcm9zc1Byb2plY3ROYW1lKCkgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyb3NzUHJvamVjdE5hbWUoKSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyb3NzUHJvamVjdE5hbWUgPSBDUk9TU19QUk9KRUNUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua0xhZygpIDxlbT5MaW5rIExhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua0xhZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExJTktfTEFHX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtMYWcoKSA8ZW0+TGluayBMYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtMYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxpbmtMYWcgPSBMSU5LX0xBR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWdGb3JtYXQoKSA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEFHX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWdGb3JtYXQoKSA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsYWdGb3JtYXQgPSBMQUdfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZWRlY2Vzc29yTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmVkZWNlc3NvckxpbmsoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmVkZWNlc3NvclVJRCgpIHsKLQkJcmV0dXJuIHByZWRlY2Vzc29yVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWRlY2Vzc29yVUlEKEJpZ0ludGVnZXIgbmV3UHJlZGVjZXNzb3JVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRQcmVkZWNlc3NvclVJRCA9IHByZWRlY2Vzc29yVUlEOwotCQlwcmVkZWNlc3NvclVJRCA9IG5ld1ByZWRlY2Vzc29yVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRCwgb2xkUHJlZGVjZXNzb3JVSUQsIHByZWRlY2Vzc29yVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3Jvc3NQcm9qZWN0KCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyb3NzUHJvamVjdChib29sZWFuIG5ld0Nyb3NzUHJvamVjdCkgewotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdCA9IGNyb3NzUHJvamVjdDsKLQkJY3Jvc3NQcm9qZWN0ID0gbmV3Q3Jvc3NQcm9qZWN0OwotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdEVTZXQgPSBjcm9zc1Byb2plY3RFU2V0OwotCQljcm9zc1Byb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNULCBvbGRDcm9zc1Byb2plY3QsIGNyb3NzUHJvamVjdCwgIW9sZENyb3NzUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENyb3NzUHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRDcm9zc1Byb2plY3QgPSBjcm9zc1Byb2plY3Q7Ci0JCWJvb2xlYW4gb2xkQ3Jvc3NQcm9qZWN0RVNldCA9IGNyb3NzUHJvamVjdEVTZXQ7Ci0JCWNyb3NzUHJvamVjdCA9IENST1NTX1BST0pFQ1RfRURFRkFVTFQ7Ci0JCWNyb3NzUHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1QsIG9sZENyb3NzUHJvamVjdCwgQ1JPU1NfUFJPSkVDVF9FREVGQVVMVCwgb2xkQ3Jvc3NQcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q3Jvc3NQcm9qZWN0KCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyb3NzUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBjcm9zc1Byb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nIG5ld0Nyb3NzUHJvamVjdE5hbWUpIHsKLQkJU3RyaW5nIG9sZENyb3NzUHJvamVjdE5hbWUgPSBjcm9zc1Byb2plY3ROYW1lOwotCQljcm9zc1Byb2plY3ROYW1lID0gbmV3Q3Jvc3NQcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUUsIG9sZENyb3NzUHJvamVjdE5hbWUsIGNyb3NzUHJvamVjdE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMaW5rTGFnKCkgewotCQlyZXR1cm4gbGlua0xhZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rTGFnKEJpZ0ludGVnZXIgbmV3TGlua0xhZykgewotCQlCaWdJbnRlZ2VyIG9sZExpbmtMYWcgPSBsaW5rTGFnOwotCQlsaW5rTGFnID0gbmV3TGlua0xhZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRywgb2xkTGlua0xhZywgbGlua0xhZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExhZ0Zvcm1hdCgpIHsKLQkJcmV0dXJuIGxhZ0Zvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWdGb3JtYXQoQmlnSW50ZWdlciBuZXdMYWdGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMYWdGb3JtYXQgPSBsYWdGb3JtYXQ7Ci0JCWxhZ0Zvcm1hdCA9IG5ld0xhZ0Zvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFULCBvbGRMYWdGb3JtYXQsIGxhZ0Zvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzQ3Jvc3NQcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHOgotCQkJCXJldHVybiBnZXRMaW5rTGFnKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0TGFnRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlzZXRQcmVkZWNlc3NvclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUU6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJc2V0TGlua0xhZygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJc2V0TGFnRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlzZXRQcmVkZWNlc3NvclVJRChQUkVERUNFU1NPUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJdW5zZXRDcm9zc1Byb2plY3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FOgotCQkJCXNldENyb3NzUHJvamVjdE5hbWUoQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJc2V0TGlua0xhZyhMSU5LX0xBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJc2V0TGFnRm9ybWF0KExBR19GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlyZXR1cm4gUFJFREVDRVNTT1JfVUlEX0VERUZBVUxUID09IG51bGwgPyBwcmVkZWNlc3NvclVJRCAhPSBudWxsIDogIVBSRURFQ0VTU09SX1VJRF9FREVGQVVMVC5lcXVhbHMocHJlZGVjZXNzb3JVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUOgotCQkJCXJldHVybiBpc1NldENyb3NzUHJvamVjdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBjcm9zc1Byb2plY3ROYW1lICE9IG51bGwgOiAhQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxULmVxdWFscyhjcm9zc1Byb2plY3ROYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRzoKLQkJCQlyZXR1cm4gTElOS19MQUdfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmtMYWcgIT0gbnVsbCA6ICFMSU5LX0xBR19FREVGQVVMVC5lcXVhbHMobGlua0xhZyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEFHX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gbGFnRm9ybWF0ICE9IG51bGwgOiAhTEFHX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMobGFnRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWRlY2Vzc29yVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVkZWNlc3NvclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3Jvc3NQcm9qZWN0OiAiKTsKLQkJaWYgKGNyb3NzUHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoY3Jvc3NQcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3Jvc3NQcm9qZWN0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3Jvc3NQcm9qZWN0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGlua0xhZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGlua0xhZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFnRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYWdGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QcmVkZWNlc3NvckxpbmtJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJvamVjdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY0ZDA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2plY3RJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3ViamVjdCA8ZW0+U3ViamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRNYW5hZ2VyIDxlbT5NYW5hZ2VyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRMYXN0U2F2ZWQgPGVtPkxhc3QgU2F2ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q3VycmVuY3lTeW1ib2wgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldFdlZWtTdGFydERheSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3RhdHVzRGF0ZSA8ZW0+U3RhdHVzIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW50RGF0ZSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJvamVjdCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaXRsZSgpIDxlbT5UaXRsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGl0bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpdGxlKCkgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaXRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZSA9IFRJVExFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmplY3QoKSA8ZW0+U3ViamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJqZWN0KCkgPGVtPlN1YmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3ViamVjdCA9IFNVQkpFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcnkoKSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wYW55KCkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBTllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcGFueSgpIDxlbT5Db21wYW55PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBhbnkgPSBDT01QQU5ZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZXIoKSA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5hZ2VyKCkgPGVtPk1hbmFnZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFuYWdlciA9IE1BTkFHRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yKCkgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yKCkgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvciA9IEFVVEhPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvbkRhdGUoKSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDUkVBVElPTl9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRpb25EYXRlID0gQ1JFQVRJT05fREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXZpc2lvbigpIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSRVZJU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXZpc2lvbigpIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJldmlzaW9uID0gUkVWSVNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFzdFNhdmVkKCkgPGVtPkxhc3QgU2F2ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhc3RTYXZlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTEFTVF9TQVZFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXN0U2F2ZWQoKSA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGxhc3RTYXZlZCA9IExBU1RfU0FWRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTY2hlZHVsZUZyb21TdGFydCgpIDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNjaGVkdWxlRnJvbVN0YXJ0ID0gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2NoZWR1bGUgRnJvbSBTdGFydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2hEYXRlID0gRklOSVNIX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RllTdGFydERhdGUoKSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBGWVNUQVJUX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RllTdGFydERhdGUoKSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGZZU3RhcnREYXRlID0gRllTVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyaXRpY2FsU2xhY2tMaW1pdCgpIDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNyaXRpY2FsU2xhY2tMaW1pdCA9IENSSVRJQ0FMX1NMQUNLX0xJTUlUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbmN5RGlnaXRzKCkgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lEaWdpdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lEaWdpdHMoKSA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY3VycmVuY3lEaWdpdHMgPSBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2woKSA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeVN5bWJvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbmN5U3ltYm9sKCkgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVuY3lTeW1ib2wgPSBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPSBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxlbmRhclVJRCA9IENBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhcnRUaW1lKCkgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRTdGFydFRpbWUoKSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlZmF1bHRTdGFydFRpbWUgPSBERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVmYXVsdEZpbmlzaFRpbWUgPSBERUZBVUxUX0ZJTklTSF9USU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJEYXkoKSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVRFU19QRVJfREFZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJEYXkoKSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtaW51dGVzUGVyRGF5ID0gTUlOVVRFU19QRVJfREFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJXZWVrKCkgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGVzUGVyV2VlaygpIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbWludXRlc1BlcldlZWsgPSBNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERheXNQZXJNb250aCgpIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF5c1Blck1vbnRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREFZU19QRVJfTU9OVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5c1Blck1vbnRoKCkgPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRheXNQZXJNb250aCA9IERBWVNfUEVSX01PTlRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRUYXNrVHlwZSgpIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQgPSBuZXcgQmlnSW50ZWdlcigiMSIpOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZSA9IERFRkFVTFRfVEFTS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IFRhc2sgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFRhc2tUeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBkZWZhdWx0U3RhbmRhcmRSYXRlID0gREVGQVVMVF9TVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IFN0YW5kYXJkIFJhdGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgZGVmYXVsdE92ZXJ0aW1lUmF0ZSA9IERFRkFVTFRfT1ZFUlRJTUVfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGVmYXVsdCBPdmVydGltZSBSYXRlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0Zvcm1hdCgpIDxlbT5Xb3JrIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtGb3JtYXQoKSA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtGb3JtYXQgPSBXT1JLX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKSA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFRElUQUJMRV9BQ1RVQUxfQ09TVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGVBY3R1YWxDb3N0cyA9IEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRWRpdGFibGUgQWN0dWFsIENvc3RzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSG9ub3JDb25zdHJhaW50cygpIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSE9OT1JfQ09OU1RSQUlOVFNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIb25vckNvbnN0cmFpbnRzKCkgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhvbm9yQ29uc3RyYWludHMgPSBIT05PUl9DT05TVFJBSU5UU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSG9ub3IgQ29uc3RyYWludHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhvbm9yQ29uc3RyYWludHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZCA9IEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11bHRpcGxlQ3JpdGljYWxQYXRocyA9IE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNdWx0aXBsZSBDcml0aWNhbCBQYXRocyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBORVdfVEFTS1NfRUZGT1JUX0RSSVZFTl9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdUYXNrc0VmZm9ydERyaXZlbiA9IE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBOZXcgVGFza3MgRWZmb3J0IERyaXZlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOZXdUYXNrc0VzdGltYXRlZCgpIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5ld1Rhc2tzRXN0aW1hdGVkID0gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTmV3IFRhc2tzIEVzdGltYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxpdHNJblByb2dyZXNzVGFza3MgPSBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3ByZWFkQWN0dWFsQ29zdCgpIDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZEFjdHVhbENvc3QoKSA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZEFjdHVhbENvc3QgPSBTUFJFQURfQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNwcmVhZCBBY3R1YWwgQ29zdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3ByZWFkIFBlcmNlbnQgQ29tcGxldGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUQVNLX1VQREFURVNfUkVTT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFza1VwZGF0ZXNSZXNvdXJjZSA9IFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVGFzayBVcGRhdGVzIFJlc291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmlzY2FsWWVhclN0YXJ0KCkgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Zpc2NhbFllYXJTdGFydCgpIDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZpc2NhbFllYXJTdGFydCA9IEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXNjYWwgWWVhciBTdGFydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlzY2FsWWVhclN0YXJ0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlZWtTdGFydERheSgpIDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgV0VFS19TVEFSVF9EQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2Vla1N0YXJ0RGF5KCkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWVrU3RhcnREYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdlZWtTdGFydERheSA9IFdFRUtfU1RBUlRfREFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IE1PVkVfQ09NUExFVEVEX0VORFNfQkFDS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA9IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1NfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0dXNEYXRlKCkgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFUVVNfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0dXNEYXRlKCkgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXR1c0RhdGUgPSBTVEFUVVNfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW50RGF0ZSgpIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDVVJSRU5UX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVudERhdGUoKSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjdXJyZW50RGF0ZSA9IENVUlJFTlRfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IE1JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvbGluaygpIDxlbT5BdXRvbGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvbGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFVVE9MSU5LX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9saW5rKCkgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvbGluayA9IEFVVE9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRvbGluayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b2xpbmtFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTkVXX1RBU0tfU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXdUYXNrU3RhcnREYXRlKCkgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGUgPSBORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKSA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kID0gREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZXh0ZW5kZWRDcmVhdGlvbkRhdGUgPSBFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWN0dWFsc0luU3luYygpIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBY3R1YWxzSW5TeW5jKCkgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY3R1YWxzSW5TeW5jID0gQUNUVUFMU19JTl9TWU5DX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBY3R1YWxzIEluIFN5bmMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjdHVhbHNJblN5bmNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaWxlUHJvcGVydGllcyA9IFJFTU9WRV9GSUxFX1BST1BFUlRJRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlbW92ZSBGaWxlIFByb3BlcnRpZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWRtaW5Qcm9qZWN0KCkgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQURNSU5fUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBZG1pblByb2plY3QoKSA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkbWluUHJvamVjdCA9IEFETUlOX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFkbWluIFByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkbWluUHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlcygpIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU01hc2tzKCkgPGVtPldCUyBNYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXQlNNYXNrcyB3QlNNYXNrcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhcnMoKSA8ZW0+Q2FsZW5kYXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWxlbmRhcnMgY2FsZW5kYXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tzKCkgPGVtPlRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tzIHRhc2tzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlcygpIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudHMoKSA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudHMgYXNzaWdubWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChTdHJpbmcgbmV3VUlEKSB7Ci0JCVN0cmluZyBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgbmV3VGl0bGUpIHsKLQkJU3RyaW5nIG9sZFRpdGxlID0gdGl0bGU7Ci0JCXRpdGxlID0gbmV3VGl0bGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEUsIG9sZFRpdGxlLCB0aXRsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ViamVjdCgpIHsKLQkJcmV0dXJuIHN1YmplY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgbmV3U3ViamVjdCkgewotCQlTdHJpbmcgb2xkU3ViamVjdCA9IHN1YmplY3Q7Ci0JCXN1YmplY3QgPSBuZXdTdWJqZWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1QsIG9sZFN1YmplY3QsIHN1YmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIG5ld0NhdGVnb3J5KSB7Ci0JCVN0cmluZyBvbGRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQljYXRlZ29yeSA9IG5ld0NhdGVnb3J5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZLCBvbGRDYXRlZ29yeSwgY2F0ZWdvcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhbnkoKSB7Ci0JCXJldHVybiBjb21wYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBhbnkoU3RyaW5nIG5ld0NvbXBhbnkpIHsKLQkJU3RyaW5nIG9sZENvbXBhbnkgPSBjb21wYW55OwotCQljb21wYW55ID0gbmV3Q29tcGFueTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DT01QQU5ZLCBvbGRDb21wYW55LCBjb21wYW55KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBuZXdNYW5hZ2VyKSB7Ci0JCVN0cmluZyBvbGRNYW5hZ2VyID0gbWFuYWdlcjsKLQkJbWFuYWdlciA9IG5ld01hbmFnZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUiwgb2xkTWFuYWdlciwgbWFuYWdlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yKCkgewotCQlyZXR1cm4gYXV0aG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcihTdHJpbmcgbmV3QXV0aG9yKSB7Ci0JCVN0cmluZyBvbGRBdXRob3IgPSBhdXRob3I7Ci0JCWF1dGhvciA9IG5ld0F1dGhvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1IsIG9sZEF1dGhvciwgYXV0aG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBjcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCBuZXdDcmVhdGlvbkRhdGUpIHsKLQkJT2JqZWN0IG9sZENyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKLQkJY3JlYXRpb25EYXRlID0gbmV3Q3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEUsIG9sZENyZWF0aW9uRGF0ZSwgY3JlYXRpb25EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmV2aXNpb24oKSB7Ci0JCXJldHVybiByZXZpc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXZpc2lvbihCaWdJbnRlZ2VyIG5ld1JldmlzaW9uKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUmV2aXNpb24gPSByZXZpc2lvbjsKLQkJcmV2aXNpb24gPSBuZXdSZXZpc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVZJU0lPTiwgb2xkUmV2aXNpb24sIHJldmlzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXN0U2F2ZWQoKSB7Ci0JCXJldHVybiBsYXN0U2F2ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFzdFNhdmVkKE9iamVjdCBuZXdMYXN0U2F2ZWQpIHsKLQkJT2JqZWN0IG9sZExhc3RTYXZlZCA9IGxhc3RTYXZlZDsKLQkJbGFzdFNhdmVkID0gbmV3TGFzdFNhdmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQsIG9sZExhc3RTYXZlZCwgbGFzdFNhdmVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTY2hlZHVsZUZyb21TdGFydCgpIHsKLQkJcmV0dXJuIHNjaGVkdWxlRnJvbVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVkdWxlRnJvbVN0YXJ0KGJvb2xlYW4gbmV3U2NoZWR1bGVGcm9tU3RhcnQpIHsKLQkJYm9vbGVhbiBvbGRTY2hlZHVsZUZyb21TdGFydCA9IHNjaGVkdWxlRnJvbVN0YXJ0OwotCQlzY2hlZHVsZUZyb21TdGFydCA9IG5ld1NjaGVkdWxlRnJvbVN0YXJ0OwotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCA9IHNjaGVkdWxlRnJvbVN0YXJ0RVNldDsKLQkJc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJULCBvbGRTY2hlZHVsZUZyb21TdGFydCwgc2NoZWR1bGVGcm9tU3RhcnQsICFvbGRTY2hlZHVsZUZyb21TdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkgewotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0ID0gc2NoZWR1bGVGcm9tU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkU2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gc2NoZWR1bGVGcm9tU3RhcnRFU2V0OwotCQlzY2hlZHVsZUZyb21TdGFydCA9IFNDSEVEVUxFX0ZST01fU1RBUlRfRURFRkFVTFQ7Ci0JCXNjaGVkdWxlRnJvbVN0YXJ0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVCwgb2xkU2NoZWR1bGVGcm9tU3RhcnQsIFNDSEVEVUxFX0ZST01fU1RBUlRfRURFRkFVTFQsIG9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0JCXJldHVybiBzY2hlZHVsZUZyb21TdGFydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydERhdGUoKSB7Ci0JCXJldHVybiBzdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKE9iamVjdCBuZXdTdGFydERhdGUpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwgc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gZmluaXNoRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCBuZXdGaW5pc2hEYXRlKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsIGZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRGWVN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIGZZU3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZZU3RhcnREYXRlKEJpZ0ludGVnZXIgbmV3RllTdGFydERhdGUpIHsKLQkJQmlnSW50ZWdlciBvbGRGWVN0YXJ0RGF0ZSA9IGZZU3RhcnREYXRlOwotCQlmWVN0YXJ0RGF0ZSA9IG5ld0ZZU3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURSwgb2xkRllTdGFydERhdGUsIGZZU3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgewotCQlyZXR1cm4gY3JpdGljYWxTbGFja0xpbWl0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyIG5ld0NyaXRpY2FsU2xhY2tMaW1pdCkgewotCQlCaWdJbnRlZ2VyIG9sZENyaXRpY2FsU2xhY2tMaW1pdCA9IGNyaXRpY2FsU2xhY2tMaW1pdDsKLQkJY3JpdGljYWxTbGFja0xpbWl0ID0gbmV3Q3JpdGljYWxTbGFja0xpbWl0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlULCBvbGRDcml0aWNhbFNsYWNrTGltaXQsIGNyaXRpY2FsU2xhY2tMaW1pdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEN1cnJlbmN5RGlnaXRzKCkgewotCQlyZXR1cm4gY3VycmVuY3lEaWdpdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlciBuZXdDdXJyZW5jeURpZ2l0cykgewotCQlCaWdJbnRlZ2VyIG9sZEN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHM7Ci0JCWN1cnJlbmN5RGlnaXRzID0gbmV3Q3VycmVuY3lEaWdpdHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTLCBvbGRDdXJyZW5jeURpZ2l0cywgY3VycmVuY3lEaWdpdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbmN5U3ltYm9sKCkgewotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2woU3RyaW5nIG5ld0N1cnJlbmN5U3ltYm9sKSB7Ci0JCVN0cmluZyBvbGRDdXJyZW5jeVN5bWJvbCA9IGN1cnJlbmN5U3ltYm9sOwotCQljdXJyZW5jeVN5bWJvbCA9IG5ld0N1cnJlbmN5U3ltYm9sOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTCwgb2xkQ3VycmVuY3lTeW1ib2wsIGN1cnJlbmN5U3ltYm9sKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbmN5U3ltYm9sUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyIG5ld0N1cnJlbmN5U3ltYm9sUG9zaXRpb24pIHsKLQkJQmlnSW50ZWdlciBvbGRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uID0gY3VycmVuY3lTeW1ib2xQb3NpdGlvbjsKLQkJY3VycmVuY3lTeW1ib2xQb3NpdGlvbiA9IG5ld0N1cnJlbmN5U3ltYm9sUG9zaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OLCBvbGRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uLCBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKSB7Ci0JCXJldHVybiBjYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0NhbGVuZGFyVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsZW5kYXJVSUQgPSBjYWxlbmRhclVJRDsKLQkJY2FsZW5kYXJVSUQgPSBuZXdDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQsIG9sZENhbGVuZGFyVUlELCBjYWxlbmRhclVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFN0YXJ0VGltZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTdGFydFRpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN0YXJ0VGltZShPYmplY3QgbmV3RGVmYXVsdFN0YXJ0VGltZSkgewotCQlPYmplY3Qgb2xkRGVmYXVsdFN0YXJ0VGltZSA9IGRlZmF1bHRTdGFydFRpbWU7Ci0JCWRlZmF1bHRTdGFydFRpbWUgPSBuZXdEZWZhdWx0U3RhcnRUaW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRSwgb2xkRGVmYXVsdFN0YXJ0VGltZSwgZGVmYXVsdFN0YXJ0VGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSB7Ci0JCXJldHVybiBkZWZhdWx0RmluaXNoVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmluaXNoVGltZShPYmplY3QgbmV3RGVmYXVsdEZpbmlzaFRpbWUpIHsKLQkJT2JqZWN0IG9sZERlZmF1bHRGaW5pc2hUaW1lID0gZGVmYXVsdEZpbmlzaFRpbWU7Ci0JCWRlZmF1bHRGaW5pc2hUaW1lID0gbmV3RGVmYXVsdEZpbmlzaFRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRSwgb2xkRGVmYXVsdEZpbmlzaFRpbWUsIGRlZmF1bHRGaW5pc2hUaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWludXRlc1BlckRheSgpIHsKLQkJcmV0dXJuIG1pbnV0ZXNQZXJEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyIG5ld01pbnV0ZXNQZXJEYXkpIHsKLQkJQmlnSW50ZWdlciBvbGRNaW51dGVzUGVyRGF5ID0gbWludXRlc1BlckRheTsKLQkJbWludXRlc1BlckRheSA9IG5ld01pbnV0ZXNQZXJEYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZLCBvbGRNaW51dGVzUGVyRGF5LCBtaW51dGVzUGVyRGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWludXRlc1BlcldlZWsoKSB7Ci0JCXJldHVybiBtaW51dGVzUGVyV2VlazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyIG5ld01pbnV0ZXNQZXJXZWVrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTWludXRlc1BlcldlZWsgPSBtaW51dGVzUGVyV2VlazsKLQkJbWludXRlc1BlcldlZWsgPSBuZXdNaW51dGVzUGVyV2VlazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLLCBvbGRNaW51dGVzUGVyV2VlaywgbWludXRlc1BlcldlZWspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREYXlzUGVyTW9udGgoKSB7Ci0JCXJldHVybiBkYXlzUGVyTW9udGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF5c1Blck1vbnRoKEJpZ0ludGVnZXIgbmV3RGF5c1Blck1vbnRoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGF5c1Blck1vbnRoID0gZGF5c1Blck1vbnRoOwotCQlkYXlzUGVyTW9udGggPSBuZXdEYXlzUGVyTW9udGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEgsIG9sZERheXNQZXJNb250aCwgZGF5c1Blck1vbnRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tUeXBlKCkgewotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyIG5ld0RlZmF1bHRUYXNrVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZERlZmF1bHRUYXNrVHlwZSA9IGRlZmF1bHRUYXNrVHlwZTsKLQkJZGVmYXVsdFRhc2tUeXBlID0gbmV3RGVmYXVsdFRhc2tUeXBlOwotCQlib29sZWFuIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQgPSBkZWZhdWx0VGFza1R5cGVFU2V0OwotCQlkZWZhdWx0VGFza1R5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRSwgb2xkRGVmYXVsdFRhc2tUeXBlLCBkZWZhdWx0VGFza1R5cGUsICFvbGREZWZhdWx0VGFza1R5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0VGFza1R5cGUoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tUeXBlID0gZGVmYXVsdFRhc2tUeXBlOwotCQlib29sZWFuIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQgPSBkZWZhdWx0VGFza1R5cGVFU2V0OwotCQlkZWZhdWx0VGFza1R5cGUgPSBERUZBVUxUX1RBU0tfVFlQRV9FREVGQVVMVDsKLQkJZGVmYXVsdFRhc2tUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEUsIG9sZERlZmF1bHRUYXNrVHlwZSwgREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQsIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmF1bHRUYXNrVHlwZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUYXNrVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0JCXJldHVybiBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyIG5ld0RlZmF1bHRGaXhlZENvc3RBY2NydWFsKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQkJZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBuZXdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTCwgb2xkRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwsIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0U3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTdGFuZGFyZFJhdGUoZmxvYXQgbmV3RGVmYXVsdFN0YW5kYXJkUmF0ZSkgewotCQlmbG9hdCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlID0gZGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJZGVmYXVsdFN0YW5kYXJkUmF0ZSA9IG5ld0RlZmF1bHRTdGFuZGFyZFJhdGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSBkZWZhdWx0U3RhbmRhcmRSYXRlRVNldDsKLQkJZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURSwgb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZSwgZGVmYXVsdFN0YW5kYXJkUmF0ZSwgIW9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotCQlmbG9hdCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlID0gZGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0OwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlID0gREVGQVVMVF9TVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFLCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlLCBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQsIG9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0T3ZlcnRpbWVSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQgbmV3RGVmYXVsdE92ZXJ0aW1lUmF0ZSkgewotCQlmbG9hdCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJZGVmYXVsdE92ZXJ0aW1lUmF0ZSA9IG5ld0RlZmF1bHRPdmVydGltZVJhdGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQgPSBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldDsKLQkJZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURSwgb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZSwgZGVmYXVsdE92ZXJ0aW1lUmF0ZSwgIW9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotCQlmbG9hdCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGRlZmF1bHRPdmVydGltZVJhdGVFU2V0OwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlID0gREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFLCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlLCBERUZBVUxUX09WRVJUSU1FX1JBVEVfRURFRkFVTFQsIG9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotCQlyZXR1cm4gZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtGb3JtYXQoKSB7Ci0JCXJldHVybiB3b3JrRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtGb3JtYXQoQmlnSW50ZWdlciBuZXdXb3JrRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkV29ya0Zvcm1hdCA9IHdvcmtGb3JtYXQ7Ci0JCXdvcmtGb3JtYXQgPSBuZXdXb3JrRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dPUktfRk9STUFULCBvbGRXb3JrRm9ybWF0LCB3b3JrRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkgewotCQlyZXR1cm4gZWRpdGFibGVBY3R1YWxDb3N0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4gbmV3RWRpdGFibGVBY3R1YWxDb3N0cykgewotCQlib29sZWFuIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHMgPSBlZGl0YWJsZUFjdHVhbENvc3RzOwotCQllZGl0YWJsZUFjdHVhbENvc3RzID0gbmV3RWRpdGFibGVBY3R1YWxDb3N0czsKLQkJYm9vbGVhbiBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCQllZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTLCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzLCBlZGl0YWJsZUFjdHVhbENvc3RzLCAhb2xkRWRpdGFibGVBY3R1YWxDb3N0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0cyA9IGVkaXRhYmxlQWN0dWFsQ29zdHM7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0c0VTZXQgPSBlZGl0YWJsZUFjdHVhbENvc3RzRVNldDsKLQkJZWRpdGFibGVBY3R1YWxDb3N0cyA9IEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVDsKLQkJZWRpdGFibGVBY3R1YWxDb3N0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUywgb2xkRWRpdGFibGVBY3R1YWxDb3N0cywgRURJVEFCTEVfQUNUVUFMX0NPU1RTX0VERUZBVUxULCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpIHsKLQkJcmV0dXJuIGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSG9ub3JDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGhvbm9yQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9ub3JDb25zdHJhaW50cyhib29sZWFuIG5ld0hvbm9yQ29uc3RyYWludHMpIHsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzID0gaG9ub3JDb25zdHJhaW50czsKLQkJaG9ub3JDb25zdHJhaW50cyA9IG5ld0hvbm9yQ29uc3RyYWludHM7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50c0VTZXQgPSBob25vckNvbnN0cmFpbnRzRVNldDsKLQkJaG9ub3JDb25zdHJhaW50c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTLCBvbGRIb25vckNvbnN0cmFpbnRzLCBob25vckNvbnN0cmFpbnRzLCAhb2xkSG9ub3JDb25zdHJhaW50c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhvbm9yQ29uc3RyYWludHMoKSB7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50cyA9IGhvbm9yQ29uc3RyYWludHM7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50c0VTZXQgPSBob25vckNvbnN0cmFpbnRzRVNldDsKLQkJaG9ub3JDb25zdHJhaW50cyA9IEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxUOwotCQlob25vckNvbnN0cmFpbnRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFMsIG9sZEhvbm9yQ29uc3RyYWludHMsIEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxULCBvbGRIb25vckNvbnN0cmFpbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGhvbm9yQ29uc3RyYWludHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCkgewotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciBuZXdFYXJuZWRWYWx1ZU1ldGhvZCkgewotCQlCaWdJbnRlZ2VyIG9sZEVhcm5lZFZhbHVlTWV0aG9kID0gZWFybmVkVmFsdWVNZXRob2Q7Ci0JCWVhcm5lZFZhbHVlTWV0aG9kID0gbmV3RWFybmVkVmFsdWVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRCwgb2xkRWFybmVkVmFsdWVNZXRob2QsIGVhcm5lZFZhbHVlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0JCXJldHVybiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4gbmV3SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KSB7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5OwotCQlpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBuZXdJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5LCBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnksICFvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5OwotCQlib29sZWFuIG9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0OwotCQlpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5LCBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQsIG9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLQkJcmV0dXJuIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0JCXJldHVybiBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4gbmV3TXVsdGlwbGVDcml0aWNhbFBhdGhzKSB7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzID0gbXVsdGlwbGVDcml0aWNhbFBhdGhzOwotCQltdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBuZXdNdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IG11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTLCBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMsIG11bHRpcGxlQ3JpdGljYWxQYXRocywgIW9sZE11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpIHsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IG11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRocyA9IE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUOwotCQltdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUywgb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzLCBNVUxUSVBMRV9DUklUSUNBTF9QQVRIU19FREVGQVVMVCwgb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgewotCQlyZXR1cm4gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotCQlyZXR1cm4gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbiBuZXdOZXdUYXNrc0VmZm9ydERyaXZlbikgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3TmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0OwotCQluZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOLCBvbGROZXdUYXNrc0VmZm9ydERyaXZlbiwgbmV3VGFza3NFZmZvcnREcml2ZW4sICFvbGROZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0OwotCQluZXdUYXNrc0VmZm9ydERyaXZlbiA9IE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCQluZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOLCBvbGROZXdUYXNrc0VmZm9ydERyaXZlbiwgTkVXX1RBU0tTX0VGRk9SVF9EUklWRU5fRURFRkFVTFQsIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdUYXNrc0VzdGltYXRlZCgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tzRXN0aW1hdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4gbmV3TmV3VGFza3NFc3RpbWF0ZWQpIHsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VzdGltYXRlZCA9IG5ld1Rhc2tzRXN0aW1hdGVkOwotCQluZXdUYXNrc0VzdGltYXRlZCA9IG5ld05ld1Rhc2tzRXN0aW1hdGVkOwotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCA9IG5ld1Rhc2tzRXN0aW1hdGVkRVNldDsKLQkJbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVELCBvbGROZXdUYXNrc0VzdGltYXRlZCwgbmV3VGFza3NFc3RpbWF0ZWQsICFvbGROZXdUYXNrc0VzdGltYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkID0gbmV3VGFza3NFc3RpbWF0ZWQ7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gbmV3VGFza3NFc3RpbWF0ZWRFU2V0OwotCQluZXdUYXNrc0VzdGltYXRlZCA9IE5FV19UQVNLU19FU1RJTUFURURfRURFRkFVTFQ7Ci0JCW5ld1Rhc2tzRXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRCwgb2xkTmV3VGFza3NFc3RpbWF0ZWQsIE5FV19UQVNLU19FU1RJTUFURURfRURFRkFVTFQsIG9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VzdGltYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0JCXJldHVybiBzcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4gbmV3U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKSB7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzOwotCQlzcGxpdHNJblByb2dyZXNzVGFza3MgPSBuZXdTcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUywgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzLCBzcGxpdHNJblByb2dyZXNzVGFza3MsICFvbGRTcGxpdHNJblByb2dyZXNzVGFza3NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzOwotCQlib29sZWFuIG9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSBzcGxpdHNJblByb2dyZXNzVGFza3NFU2V0OwotCQlzcGxpdHNJblByb2dyZXNzVGFza3MgPSBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUywgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzLCBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQsIG9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIHsKLQkJcmV0dXJuIHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcHJlYWRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gc3ByZWFkQWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4gbmV3U3ByZWFkQWN0dWFsQ29zdCkgewotCQlib29sZWFuIG9sZFNwcmVhZEFjdHVhbENvc3QgPSBzcHJlYWRBY3R1YWxDb3N0OwotCQlzcHJlYWRBY3R1YWxDb3N0ID0gbmV3U3ByZWFkQWN0dWFsQ29zdDsKLQkJYm9vbGVhbiBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCA9IHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCQlzcHJlYWRBY3R1YWxDb3N0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NULCBvbGRTcHJlYWRBY3R1YWxDb3N0LCBzcHJlYWRBY3R1YWxDb3N0LCAhb2xkU3ByZWFkQWN0dWFsQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNwcmVhZEFjdHVhbENvc3QoKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdCA9IHNwcmVhZEFjdHVhbENvc3Q7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBzcHJlYWRBY3R1YWxDb3N0RVNldDsKLQkJc3ByZWFkQWN0dWFsQ29zdCA9IFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQkJc3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVCwgb2xkU3ByZWFkQWN0dWFsQ29zdCwgU1BSRUFEX0FDVFVBTF9DT1NUX0VERUZBVUxULCBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3ByZWFkQWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuIG5ld1NwcmVhZFBlcmNlbnRDb21wbGV0ZSkgewotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZSA9IHNwcmVhZFBlcmNlbnRDb21wbGV0ZTsKLQkJc3ByZWFkUGVyY2VudENvbXBsZXRlID0gbmV3U3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0OwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSwgb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlLCBzcHJlYWRQZXJjZW50Q29tcGxldGUsICFvbGRTcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlID0gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0OwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQkJc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEUsIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZSwgU1BSRUFEX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQsIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkgewotCQlyZXR1cm4gdGFza1VwZGF0ZXNSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4gbmV3VGFza1VwZGF0ZXNSZXNvdXJjZSkgewotCQlib29sZWFuIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2UgPSB0YXNrVXBkYXRlc1Jlc291cmNlOwotCQl0YXNrVXBkYXRlc1Jlc291cmNlID0gbmV3VGFza1VwZGF0ZXNSZXNvdXJjZTsKLQkJYm9vbGVhbiBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCQl0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS19VUERBVEVTX1JFU09VUkNFLCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlLCB0YXNrVXBkYXRlc1Jlc291cmNlLCAhb2xkVGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSA9IHRhc2tVcGRhdGVzUmVzb3VyY2U7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQgPSB0YXNrVXBkYXRlc1Jlc291cmNlRVNldDsKLQkJdGFza1VwZGF0ZXNSZXNvdXJjZSA9IFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVDsKLQkJdGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRSwgb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSwgVEFTS19VUERBVEVTX1JFU09VUkNFX0VERUZBVUxULCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmlzY2FsWWVhclN0YXJ0KCkgewotCQlyZXR1cm4gZmlzY2FsWWVhclN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpc2NhbFllYXJTdGFydChib29sZWFuIG5ld0Zpc2NhbFllYXJTdGFydCkgewotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydCA9IGZpc2NhbFllYXJTdGFydDsKLQkJZmlzY2FsWWVhclN0YXJ0ID0gbmV3RmlzY2FsWWVhclN0YXJ0OwotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydEVTZXQgPSBmaXNjYWxZZWFyU3RhcnRFU2V0OwotCQlmaXNjYWxZZWFyU3RhcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVCwgb2xkRmlzY2FsWWVhclN0YXJ0LCBmaXNjYWxZZWFyU3RhcnQsICFvbGRGaXNjYWxZZWFyU3RhcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRGaXNjYWxZZWFyU3RhcnQoKSB7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0ID0gZmlzY2FsWWVhclN0YXJ0OwotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydEVTZXQgPSBmaXNjYWxZZWFyU3RhcnRFU2V0OwotCQlmaXNjYWxZZWFyU3RhcnQgPSBGSVNDQUxfWUVBUl9TVEFSVF9FREVGQVVMVDsKLQkJZmlzY2FsWWVhclN0YXJ0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQsIG9sZEZpc2NhbFllYXJTdGFydCwgRklTQ0FMX1lFQVJfU1RBUlRfRURFRkFVTFQsIG9sZEZpc2NhbFllYXJTdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpc2NhbFllYXJTdGFydCgpIHsKLQkJcmV0dXJuIGZpc2NhbFllYXJTdGFydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0V2Vla1N0YXJ0RGF5KCkgewotCQlyZXR1cm4gd2Vla1N0YXJ0RGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlZWtTdGFydERheShCaWdJbnRlZ2VyIG5ld1dlZWtTdGFydERheSkgewotCQlCaWdJbnRlZ2VyIG9sZFdlZWtTdGFydERheSA9IHdlZWtTdGFydERheTsKLQkJd2Vla1N0YXJ0RGF5ID0gbmV3V2Vla1N0YXJ0RGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZLCBvbGRXZWVrU3RhcnREYXksIHdlZWtTdGFydERheSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgewotCQlyZXR1cm4gbW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuIG5ld01vdmVDb21wbGV0ZWRFbmRzQmFjaykgewotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IG1vdmVDb21wbGV0ZWRFbmRzQmFjazsKLQkJbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gbmV3TW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0ssIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjaywgbW92ZUNvbXBsZXRlZEVuZHNCYWNrLCAhb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgewotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IG1vdmVDb21wbGV0ZWRFbmRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gbW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldDsKLQkJbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxUOwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0ssIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjaywgTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxULCBvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuIG5ld01vdmVSZW1haW5pbmdTdGFydHNCYWNrKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0ssIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjaywgIW9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0tfRURFRkFVTFQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0ssIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCBNT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDS19FREVGQVVMVCwgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLQkJcmV0dXJuIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotCQlyZXR1cm4gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoYm9vbGVhbiBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCkgewotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbmV3TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0OwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJELCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQsICFvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0OwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUOwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJELCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQsIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4gbmV3TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOwotCQltb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBuZXdNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkLCBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQsICFvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkLCBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQsIG9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIHsKLQkJcmV0dXJuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGJhc2VsaW5lRm9yRWFybmVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCaWdJbnRlZ2VyIG5ld0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUpIHsKLQkJQmlnSW50ZWdlciBvbGRCYXNlbGluZUZvckVhcm5lZFZhbHVlID0gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTsKLQkJYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA9IG5ld0Jhc2VsaW5lRm9yRWFybmVkVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRSwgb2xkQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgewotCQlyZXR1cm4gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuIG5ld0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcykgewotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA9IGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrczsKLQkJYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gbmV3QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0OwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUywgb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzLCBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MsICFvbGRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0OwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVDsKLQkJYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1MsIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcywgQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1NfRURFRkFVTFQsIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLQkJcmV0dXJuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGF0dXNEYXRlKCkgewotCQlyZXR1cm4gc3RhdHVzRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNEYXRlKE9iamVjdCBuZXdTdGF0dXNEYXRlKSB7Ci0JCU9iamVjdCBvbGRTdGF0dXNEYXRlID0gc3RhdHVzRGF0ZTsKLQkJc3RhdHVzRGF0ZSA9IG5ld1N0YXR1c0RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEUsIG9sZFN0YXR1c0RhdGUsIHN0YXR1c0RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnREYXRlKCkgewotCQlyZXR1cm4gY3VycmVudERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudERhdGUoT2JqZWN0IG5ld0N1cnJlbnREYXRlKSB7Ci0JCU9iamVjdCBvbGRDdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlOwotCQljdXJyZW50RGF0ZSA9IG5ld0N1cnJlbnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURSwgb2xkQ3VycmVudERhdGUsIGN1cnJlbnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgewotCQlyZXR1cm4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4gbmV3TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCkgewotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMID0gbmV3TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTDsKLQkJYm9vbGVhbiBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0OwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgIW9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgewotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQ7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBNSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMX0VERUZBVUxUOwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0JCXJldHVybiBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9saW5rKCkgewotCQlyZXR1cm4gYXV0b2xpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b2xpbmsoYm9vbGVhbiBuZXdBdXRvbGluaykgewotCQlib29sZWFuIG9sZEF1dG9saW5rID0gYXV0b2xpbms7Ci0JCWF1dG9saW5rID0gbmV3QXV0b2xpbms7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmtFU2V0ID0gYXV0b2xpbmtFU2V0OwotCQlhdXRvbGlua0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LLCBvbGRBdXRvbGluaywgYXV0b2xpbmssICFvbGRBdXRvbGlua0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dG9saW5rKCkgewotCQlib29sZWFuIG9sZEF1dG9saW5rID0gYXV0b2xpbms7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmtFU2V0ID0gYXV0b2xpbmtFU2V0OwotCQlhdXRvbGluayA9IEFVVE9MSU5LX0VERUZBVUxUOwotCQlhdXRvbGlua0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LLCBvbGRBdXRvbGluaywgQVVUT0xJTktfRURFRkFVTFQsIG9sZEF1dG9saW5rRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0b2xpbmsoKSB7Ci0JCXJldHVybiBhdXRvbGlua0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tTdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza1N0YXJ0RGF0ZShCaWdJbnRlZ2VyIG5ld05ld1Rhc2tTdGFydERhdGUpIHsKLQkJQmlnSW50ZWdlciBvbGROZXdUYXNrU3RhcnREYXRlID0gbmV3VGFza1N0YXJ0RGF0ZTsKLQkJbmV3VGFza1N0YXJ0RGF0ZSA9IG5ld05ld1Rhc2tTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURSwgb2xkTmV3VGFza1N0YXJ0RGF0ZSwgbmV3VGFza1N0YXJ0RGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldERlZmF1bHRUYXNrRVZNZXRob2QoKSB7Ci0JCXJldHVybiBkZWZhdWx0VGFza0VWTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlciBuZXdEZWZhdWx0VGFza0VWTWV0aG9kKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tFVk1ldGhvZCA9IGRlZmF1bHRUYXNrRVZNZXRob2Q7Ci0JCWRlZmF1bHRUYXNrRVZNZXRob2QgPSBuZXdEZWZhdWx0VGFza0VWTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0QsIG9sZERlZmF1bHRUYXNrRVZNZXRob2QsIGRlZmF1bHRUYXNrRVZNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgewotCQlyZXR1cm4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbiBuZXdQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCkgewotCQlib29sZWFuIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gbmV3UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0OwotCQlwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQsIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkLCBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCwgIW9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQkJYm9vbGVhbiBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVDsKLQkJcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVELCBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCwgUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVCwgb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpIHsKLQkJcmV0dXJuIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRDcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0V4dGVuZGVkQ3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRFeHRlbmRlZENyZWF0aW9uRGF0ZSA9IGV4dGVuZGVkQ3JlYXRpb25EYXRlOwotCQlleHRlbmRlZENyZWF0aW9uRGF0ZSA9IG5ld0V4dGVuZGVkQ3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEUsIG9sZEV4dGVuZGVkQ3JlYXRpb25EYXRlLCBleHRlbmRlZENyZWF0aW9uRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0dWFsc0luU3luYygpIHsKLQkJcmV0dXJuIGFjdHVhbHNJblN5bmM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsc0luU3luYyhib29sZWFuIG5ld0FjdHVhbHNJblN5bmMpIHsKLQkJYm9vbGVhbiBvbGRBY3R1YWxzSW5TeW5jID0gYWN0dWFsc0luU3luYzsKLQkJYWN0dWFsc0luU3luYyA9IG5ld0FjdHVhbHNJblN5bmM7Ci0JCWJvb2xlYW4gb2xkQWN0dWFsc0luU3luY0VTZXQgPSBhY3R1YWxzSW5TeW5jRVNldDsKLQkJYWN0dWFsc0luU3luY0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQywgb2xkQWN0dWFsc0luU3luYywgYWN0dWFsc0luU3luYywgIW9sZEFjdHVhbHNJblN5bmNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBY3R1YWxzSW5TeW5jKCkgewotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmMgPSBhY3R1YWxzSW5TeW5jOwotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmNFU2V0ID0gYWN0dWFsc0luU3luY0VTZXQ7Ci0JCWFjdHVhbHNJblN5bmMgPSBBQ1RVQUxTX0lOX1NZTkNfRURFRkFVTFQ7Ci0JCWFjdHVhbHNJblN5bmNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkMsIG9sZEFjdHVhbHNJblN5bmMsIEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVCwgb2xkQWN0dWFsc0luU3luY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFjdHVhbHNJblN5bmMoKSB7Ci0JCXJldHVybiBhY3R1YWxzSW5TeW5jRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbiBuZXdSZW1vdmVGaWxlUHJvcGVydGllcykgewotCQlib29sZWFuIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gcmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gbmV3UmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0OwotCQlyZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVMsIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzLCByZW1vdmVGaWxlUHJvcGVydGllcywgIW9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKSB7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXMgPSByZW1vdmVGaWxlUHJvcGVydGllczsKLQkJYm9vbGVhbiBvbGRSZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSByZW1vdmVGaWxlUHJvcGVydGllc0VTZXQ7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVDsKLQkJcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTLCBvbGRSZW1vdmVGaWxlUHJvcGVydGllcywgUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVCwgb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkbWluUHJvamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG1pblByb2plY3QoYm9vbGVhbiBuZXdBZG1pblByb2plY3QpIHsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3QgPSBhZG1pblByb2plY3Q7Ci0JCWFkbWluUHJvamVjdCA9IG5ld0FkbWluUHJvamVjdDsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3RFU2V0ID0gYWRtaW5Qcm9qZWN0RVNldDsKLQkJYWRtaW5Qcm9qZWN0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVCwgb2xkQWRtaW5Qcm9qZWN0LCBhZG1pblByb2plY3QsICFvbGRBZG1pblByb2plY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBZG1pblByb2plY3QoKSB7Ci0JCWJvb2xlYW4gb2xkQWRtaW5Qcm9qZWN0ID0gYWRtaW5Qcm9qZWN0OwotCQlib29sZWFuIG9sZEFkbWluUHJvamVjdEVTZXQgPSBhZG1pblByb2plY3RFU2V0OwotCQlhZG1pblByb2plY3QgPSBBRE1JTl9QUk9KRUNUX0VERUZBVUxUOwotCQlhZG1pblByb2plY3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNULCBvbGRBZG1pblByb2plY3QsIEFETUlOX1BST0pFQ1RfRURFRkFVTFQsIG9sZEFkbWluUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFkbWluUHJvamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluUHJvamVjdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlcyBnZXRPdXRsaW5lQ29kZXMoKSB7Ci0JCXJldHVybiBvdXRsaW5lQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyBuZXdPdXRsaW5lQ29kZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJT3V0bGluZUNvZGVzIG9sZE91dGxpbmVDb2RlcyA9IG91dGxpbmVDb2RlczsKLQkJb3V0bGluZUNvZGVzID0gbmV3T3V0bGluZUNvZGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVMsIG9sZE91dGxpbmVDb2RlcywgbmV3T3V0bGluZUNvZGVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG5ld091dGxpbmVDb2RlcykgewotCQlpZiAobmV3T3V0bGluZUNvZGVzICE9IG91dGxpbmVDb2RlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob3V0bGluZUNvZGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dGxpbmVDb2RlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3V0bGluZUNvZGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld091dGxpbmVDb2RlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPdXRsaW5lQ29kZXMobmV3T3V0bGluZUNvZGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbmV3T3V0bGluZUNvZGVzLCBuZXdPdXRsaW5lQ29kZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFza3MgZ2V0V0JTTWFza3MoKSB7Ci0JCXJldHVybiB3QlNNYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXQlNNYXNrcyhXQlNNYXNrcyBuZXdXQlNNYXNrcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXQlNNYXNrcyBvbGRXQlNNYXNrcyA9IHdCU01hc2tzOwotCQl3QlNNYXNrcyA9IG5ld1dCU01hc2tzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgb2xkV0JTTWFza3MsIG5ld1dCU01hc2tzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXQlNNYXNrcyhXQlNNYXNrcyBuZXdXQlNNYXNrcykgewotCQlpZiAobmV3V0JTTWFza3MgIT0gd0JTTWFza3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdCU01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdCU01hc2tzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dCU01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dCU01hc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V0JTTWFza3MobmV3V0JTTWFza3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG5ld1dCU01hc2tzLCBuZXdXQlNNYXNrcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZXMgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlcyBvbGRFeHRlbmRlZEF0dHJpYnV0ZXMgPSBleHRlbmRlZEF0dHJpYnV0ZXM7Ci0JCWV4dGVuZGVkQXR0cmlidXRlcyA9IG5ld0V4dGVuZGVkQXR0cmlidXRlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTLCBvbGRFeHRlbmRlZEF0dHJpYnV0ZXMsIG5ld0V4dGVuZGVkQXR0cmlidXRlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBuZXdFeHRlbmRlZEF0dHJpYnV0ZXMpIHsKLQkJaWYgKG5ld0V4dGVuZGVkQXR0cmlidXRlcyAhPSBleHRlbmRlZEF0dHJpYnV0ZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHRlbmRlZEF0dHJpYnV0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHRlbmRlZEF0dHJpYnV0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKG5ld0V4dGVuZGVkQXR0cmlidXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG5ld0V4dGVuZGVkQXR0cmlidXRlcywgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFycyBnZXRDYWxlbmRhcnMoKSB7Ci0JCXJldHVybiBjYWxlbmRhcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FsZW5kYXJzKENhbGVuZGFycyBuZXdDYWxlbmRhcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ2FsZW5kYXJzIG9sZENhbGVuZGFycyA9IGNhbGVuZGFyczsKLQkJY2FsZW5kYXJzID0gbmV3Q2FsZW5kYXJzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgb2xkQ2FsZW5kYXJzLCBuZXdDYWxlbmRhcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGVuZGFycyhDYWxlbmRhcnMgbmV3Q2FsZW5kYXJzKSB7Ci0JCWlmIChuZXdDYWxlbmRhcnMgIT0gY2FsZW5kYXJzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWxlbmRhcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FsZW5kYXJzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhbGVuZGFycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWxlbmRhcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYWxlbmRhcnMobmV3Q2FsZW5kYXJzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTLCBuZXdDYWxlbmRhcnMsIG5ld0NhbGVuZGFycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrcyBnZXRUYXNrcygpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhc2tzKFRhc2tzIG5ld1Rhc2tzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVRhc2tzIG9sZFRhc2tzID0gdGFza3M7Ci0JCXRhc2tzID0gbmV3VGFza3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG9sZFRhc2tzLCBuZXdUYXNrcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza3MoVGFza3MgbmV3VGFza3MpIHsKLQkJaWYgKG5ld1Rhc2tzICE9IHRhc2tzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YXNrcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXNrcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Rhc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Rhc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUYXNrcyhuZXdUYXNrcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTLCBuZXdUYXNrcywgbmV3VGFza3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXNvdXJjZXMoUmVzb3VyY2VzIG5ld1Jlc291cmNlcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZXNvdXJjZXMgb2xkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXNvdXJjZXMgPSBuZXdSZXNvdXJjZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBvbGRSZXNvdXJjZXMsIG5ld1Jlc291cmNlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKFJlc291cmNlcyBuZXdSZXNvdXJjZXMpIHsKLQkJaWYgKG5ld1Jlc291cmNlcyAhPSByZXNvdXJjZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlc291cmNlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXNvdXJjZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVzb3VyY2VzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Jlc291cmNlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlc291cmNlcyhuZXdSZXNvdXJjZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVMsIG5ld1Jlc291cmNlcywgbmV3UmVzb3VyY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFzc2lnbm1lbnRzIGdldEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMgbmV3QXNzaWdubWVudHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQXNzaWdubWVudHMgb2xkQXNzaWdubWVudHMgPSBhc3NpZ25tZW50czsKLQkJYXNzaWdubWVudHMgPSBuZXdBc3NpZ25tZW50czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgb2xkQXNzaWdubWVudHMsIG5ld0Fzc2lnbm1lbnRzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBuZXdBc3NpZ25tZW50cykgewotCQlpZiAobmV3QXNzaWdubWVudHMgIT0gYXNzaWdubWVudHMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFzc2lnbm1lbnRzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFzc2lnbm1lbnRzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXNzaWdubWVudHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzaWdubWVudHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFzc2lnbm1lbnRzKG5ld0Fzc2lnbm1lbnRzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFMsIG5ld0Fzc2lnbm1lbnRzLCBuZXdBc3NpZ25tZW50cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRPdXRsaW5lQ29kZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V0JTTWFza3MobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4dGVuZGVkQXR0cmlidXRlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDYWxlbmRhcnMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUYXNrcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZXNvdXJjZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRBc3NpZ25tZW50cyhudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlyZXR1cm4gZ2V0VGl0bGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXJldHVybiBnZXRTdWJqZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlyZXR1cm4gZ2V0Q29tcGFueSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01BTkFHRVI6Ci0JCQkJcmV0dXJuIGdldE1hbmFnZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJcmV0dXJuIGdldEF1dGhvcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXJldHVybiBnZXRSZXZpc2lvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJcmV0dXJuIGdldExhc3RTYXZlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQ6Ci0JCQkJcmV0dXJuIGlzU2NoZWR1bGVGcm9tU3RhcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0U3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GWVNUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZZU3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQ6Ci0JCQkJcmV0dXJuIGdldENyaXRpY2FsU2xhY2tMaW1pdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlyZXR1cm4gZ2V0Q3VycmVuY3lEaWdpdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0w6Ci0JCQkJcmV0dXJuIGdldEN1cnJlbmN5U3ltYm9sKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXJldHVybiBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFN0YXJ0VGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRGaW5pc2hUaW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZOgotCQkJCXJldHVybiBnZXRNaW51dGVzUGVyRGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSzoKLQkJCQlyZXR1cm4gZ2V0TWludXRlc1BlcldlZWsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlyZXR1cm4gZ2V0RGF5c1Blck1vbnRoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXJldHVybiBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldFdvcmtGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFM6Ci0JCQkJcmV0dXJuIGlzRWRpdGFibGVBY3R1YWxDb3N0cygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gaXNIb25vckNvbnN0cmFpbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZOgotCQkJCXJldHVybiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlyZXR1cm4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRDoKLQkJCQlyZXR1cm4gaXNOZXdUYXNrc0VzdGltYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gaXNTcHJlYWRBY3R1YWxDb3N0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzVGFza1VwZGF0ZXNSZXNvdXJjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVDoKLQkJCQlyZXR1cm4gaXNGaXNjYWxZZWFyU3RhcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVk6Ci0JCQkJcmV0dXJuIGdldFdlZWtTdGFydERheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQlyZXR1cm4gaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0s6Ci0JCQkJcmV0dXJuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXJldHVybiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVRVU19EQVRFOgotCQkJCXJldHVybiBnZXRTdGF0dXNEYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXJldHVybiBnZXRDdXJyZW50RGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJcmV0dXJuIGlzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQlyZXR1cm4gaXNBdXRvbGluaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFOgotCQkJCXJldHVybiBnZXROZXdUYXNrU3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQ6Ci0JCQkJcmV0dXJuIGlzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJcmV0dXJuIGlzQWN0dWFsc0luU3luYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzQWRtaW5Qcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVDb2RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQlyZXR1cm4gZ2V0V0JTTWFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFycygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXJldHVybiBnZXRUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEFzc2lnbm1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRDoKLQkJCQlzZXRVSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJc2V0VGl0bGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1Q6Ci0JCQkJc2V0U3ViamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlk6Ci0JCQkJc2V0Q29tcGFueSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUjoKLQkJCQlzZXRNYW5hZ2VyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJc2V0QXV0aG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXNldENyZWF0aW9uRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJc2V0UmV2aXNpb24oKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19MQVNUX1NBVkVEOgotCQkJCXNldExhc3RTYXZlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlzZXRTY2hlZHVsZUZyb21TdGFydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlzZXRTdGFydERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJTklTSF9EQVRFOgotCQkJCXNldEZpbmlzaERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlzZXRGWVN0YXJ0RGF0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXNldENyaXRpY2FsU2xhY2tMaW1pdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlzZXRDdXJyZW5jeURpZ2l0cygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTDoKLQkJCQlzZXRDdXJyZW5jeVN5bWJvbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdFN0YXJ0VGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRToKLQkJCQlzZXREZWZhdWx0RmluaXNoVGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZOgotCQkJCXNldE1pbnV0ZXNQZXJEYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXNldE1pbnV0ZXNQZXJXZWVrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEg6Ci0JCQkJc2V0RGF5c1Blck1vbnRoKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEU6Ci0JCQkJc2V0RGVmYXVsdFRhc2tUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJc2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlzZXRXb3JrRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTOgotCQkJCXNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTOgotCQkJCXNldEhvbm9yQ29uc3RyYWludHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlk6Ci0JCQkJc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOOgotCQkJCXNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEOgotCQkJCXNldE5ld1Rhc2tzRXN0aW1hdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0U3ByZWFkQWN0dWFsQ29zdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQ6Ci0JCQkJc2V0RmlzY2FsWWVhclN0YXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XRUVLX1NUQVJUX0RBWToKLQkJCQlzZXRXZWVrU3RhcnREYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0s6Ci0JCQkJc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQlzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRDoKLQkJCQlzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTOgotCQkJCXNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJc2V0U3RhdHVzRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXNldEN1cnJlbnREYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXNldEF1dG9saW5rKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFOgotCQkJCXNldE5ld1Rhc2tTdGFydERhdGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXNldERlZmF1bHRUYXNrRVZNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFOgotCQkJCXNldEV4dGVuZGVkQ3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJc2V0QWN0dWFsc0luU3luYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUzoKLQkJCQlzZXRSZW1vdmVGaWxlUHJvcGVydGllcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQlzZXRBZG1pblByb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJc2V0T3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJc2V0V0JTTWFza3MoKFdCU01hc2tzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlzZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKEV4dGVuZGVkQXR0cmlidXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlzZXRDYWxlbmRhcnMoKENhbGVuZGFycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXNldFRhc2tzKChUYXNrcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUzoKLQkJCQlzZXRSZXNvdXJjZXMoKFJlc291cmNlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCXNldEFzc2lnbm1lbnRzKChBc3NpZ25tZW50cyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJc2V0VGl0bGUoVElUTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXNldFN1YmplY3QoU1VCSkVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlzZXRDb21wYW55KENPTVBBTllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXNldE1hbmFnZXIoTUFOQUdFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUjoKLQkJCQlzZXRBdXRob3IoQVVUSE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoQ1JFQVRJT05fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXNldFJldmlzaW9uKFJFVklTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRDoKLQkJCQlzZXRMYXN0U2F2ZWQoTEFTVF9TQVZFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQ6Ci0JCQkJdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZShTVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZShGSU5JU0hfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlzZXRGWVN0YXJ0RGF0ZShGWVNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUklUSUNBTF9TTEFDS19MSU1JVDoKLQkJCQlzZXRDcml0aWNhbFNsYWNrTGltaXQoQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9ESUdJVFM6Ci0JCQkJc2V0Q3VycmVuY3lEaWdpdHMoQ1VSUkVOQ1lfRElHSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sKENVUlJFTkNZX1NZTUJPTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTF9QT1NJVElPTjoKLQkJCQlzZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRChDQUxFTkRBUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdFN0YXJ0VGltZShERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXNldERlZmF1bHRGaW5pc2hUaW1lKERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJc2V0TWludXRlc1BlckRheShNSU5VVEVTX1BFUl9EQVlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXNldE1pbnV0ZXNQZXJXZWVrKE1JTlVURVNfUEVSX1dFRUtfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlzZXREYXlzUGVyTW9udGgoREFZU19QRVJfTU9OVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQl1bnNldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQl1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXVuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJc2V0V29ya0Zvcm1hdChXT1JLX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQl1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJdW5zZXRIb25vckNvbnN0cmFpbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQl1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQl1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQl1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXVuc2V0U3ByZWFkQWN0dWFsQ29zdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQl1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJdW5zZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXVuc2V0RmlzY2FsWWVhclN0YXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXNldFdlZWtTdGFydERheShXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQl1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQl1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEOgotCQkJCXVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXVuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJc2V0U3RhdHVzRGF0ZShTVEFUVVNfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURToKLQkJCQlzZXRDdXJyZW50RGF0ZShDVVJSRU5UX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXVuc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQl1bnNldEF1dG9saW5rKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJc2V0TmV3VGFza1N0YXJ0RGF0ZShORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRDoKLQkJCQlzZXREZWZhdWx0VGFza0VWTWV0aG9kKERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlzZXRFeHRlbmRlZENyZWF0aW9uRGF0ZShFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DOgotCQkJCXVuc2V0QWN0dWFsc0luU3luYygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQl1bnNldEFkbWluUHJvamVjdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCXNldE91dGxpbmVDb2RlcygoT3V0bGluZUNvZGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJc2V0V0JTTWFza3MoKFdCU01hc2tzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXNldEV4dGVuZGVkQXR0cmlidXRlcygoRXh0ZW5kZWRBdHRyaWJ1dGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJc2V0Q2FsZW5kYXJzKChDYWxlbmRhcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXNldFRhc2tzKChUYXNrcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXNldFJlc291cmNlcygoUmVzb3VyY2VzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlzZXRBc3NpZ25tZW50cygoQXNzaWdubWVudHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJcmV0dXJuIFRJVExFX0VERUZBVUxUID09IG51bGwgPyB0aXRsZSAhPSBudWxsIDogIVRJVExFX0VERUZBVUxULmVxdWFscyh0aXRsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1VCSkVDVDoKLQkJCQlyZXR1cm4gU1VCSkVDVF9FREVGQVVMVCA9PSBudWxsID8gc3ViamVjdCAhPSBudWxsIDogIVNVQkpFQ1RfRURFRkFVTFQuZXF1YWxzKHN1YmplY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlk6Ci0JCQkJcmV0dXJuIENPTVBBTllfRURFRkFVTFQgPT0gbnVsbCA/IGNvbXBhbnkgIT0gbnVsbCA6ICFDT01QQU5ZX0VERUZBVUxULmVxdWFscyhjb21wYW55KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXJldHVybiBNQU5BR0VSX0VERUZBVUxUID09IG51bGwgPyBtYW5hZ2VyICE9IG51bGwgOiAhTUFOQUdFUl9FREVGQVVMVC5lcXVhbHMobWFuYWdlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUSE9SOgotCQkJCXJldHVybiBBVVRIT1JfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvciAhPSBudWxsIDogIUFVVEhPUl9FREVGQVVMVC5lcXVhbHMoYXV0aG9yKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXJldHVybiBSRVZJU0lPTl9FREVGQVVMVCA9PSBudWxsID8gcmV2aXNpb24gIT0gbnVsbCA6ICFSRVZJU0lPTl9FREVGQVVMVC5lcXVhbHMocmV2aXNpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJcmV0dXJuIExBU1RfU0FWRURfRURFRkFVTFQgPT0gbnVsbCA/IGxhc3RTYXZlZCAhPSBudWxsIDogIUxBU1RfU0FWRURfRURFRkFVTFQuZXF1YWxzKGxhc3RTYXZlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlyZXR1cm4gaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsIDogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIEZJTklTSF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2hEYXRlICE9IG51bGwgOiAhRklOSVNIX0RBVEVfRURFRkFVTFQuZXF1YWxzKGZpbmlzaERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlyZXR1cm4gRllTVEFSVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmWVN0YXJ0RGF0ZSAhPSBudWxsIDogIUZZU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoZllTdGFydERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXJldHVybiBDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVCA9PSBudWxsID8gY3JpdGljYWxTbGFja0xpbWl0ICE9IG51bGwgOiAhQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQuZXF1YWxzKGNyaXRpY2FsU2xhY2tMaW1pdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTOgotCQkJCXJldHVybiBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5RGlnaXRzICE9IG51bGwgOiAhQ1VSUkVOQ1lfRElHSVRTX0VERUZBVUxULmVxdWFscyhjdXJyZW5jeURpZ2l0cyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXJldHVybiBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5U3ltYm9sICE9IG51bGwgOiAhQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxULmVxdWFscyhjdXJyZW5jeVN5bWJvbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXJldHVybiBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5U3ltYm9sUG9zaXRpb24gIT0gbnVsbCA6ICFDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQuZXF1YWxzKGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gQ0FMRU5EQVJfVUlEX0VERUZBVUxUID09IG51bGwgPyBjYWxlbmRhclVJRCAhPSBudWxsIDogIUNBTEVOREFSX1VJRF9FREVGQVVMVC5lcXVhbHMoY2FsZW5kYXJVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlyZXR1cm4gREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0U3RhcnRUaW1lICE9IG51bGwgOiAhREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxULmVxdWFscyhkZWZhdWx0U3RhcnRUaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXJldHVybiBERUZBVUxUX0ZJTklTSF9USU1FX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0RmluaXNoVGltZSAhPSBudWxsIDogIURFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRGaW5pc2hUaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJcmV0dXJuIE1JTlVURVNfUEVSX0RBWV9FREVGQVVMVCA9PSBudWxsID8gbWludXRlc1BlckRheSAhPSBudWxsIDogIU1JTlVURVNfUEVSX0RBWV9FREVGQVVMVC5lcXVhbHMobWludXRlc1BlckRheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSzoKLQkJCQlyZXR1cm4gTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCA9PSBudWxsID8gbWludXRlc1BlcldlZWsgIT0gbnVsbCA6ICFNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxULmVxdWFscyhtaW51dGVzUGVyV2Vlayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEg6Ci0JCQkJcmV0dXJuIERBWVNfUEVSX01PTlRIX0VERUZBVUxUID09IG51bGwgPyBkYXlzUGVyTW9udGggIT0gbnVsbCA6ICFEQVlTX1BFUl9NT05USF9FREVGQVVMVC5lcXVhbHMoZGF5c1Blck1vbnRoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0VGFza1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRGaXhlZENvc3RBY2NydWFsICE9IG51bGwgOiAhREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEU6Ci0JCQkJcmV0dXJuIGlzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJcmV0dXJuIFdPUktfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyB3b3JrRm9ybWF0ICE9IG51bGwgOiAhV09SS19GT1JNQVRfRURFRkFVTFQuZXF1YWxzKHdvcmtGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQlyZXR1cm4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGVhcm5lZFZhbHVlTWV0aG9kICE9IG51bGwgOiAhRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZWFybmVkVmFsdWVNZXRob2QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlyZXR1cm4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBpc1NldFNwcmVhZEFjdHVhbENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXJldHVybiBpc1NldEZpc2NhbFllYXJTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXJldHVybiBXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCA9PSBudWxsID8gd2Vla1N0YXJ0RGF5ICE9IG51bGwgOiAhV0VFS19TVEFSVF9EQVlfRURFRkFVTFQuZXF1YWxzKHdlZWtTdGFydERheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLOgotCQkJCXJldHVybiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLOgotCQkJCXJldHVybiBpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRToKLQkJCQlyZXR1cm4gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSAhPSBudWxsIDogIUJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGJhc2VsaW5lRm9yRWFybmVkVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTOgotCQkJCXJldHVybiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVRVU19EQVRFOgotCQkJCXJldHVybiBTVEFUVVNfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhdHVzRGF0ZSAhPSBudWxsIDogIVNUQVRVU19EQVRFX0VERUZBVUxULmVxdWFscyhzdGF0dXNEYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5UX0RBVEU6Ci0JCQkJcmV0dXJuIENVUlJFTlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gY3VycmVudERhdGUgIT0gbnVsbCA6ICFDVVJSRU5UX0RBVEVfRURFRkFVTFQuZXF1YWxzKGN1cnJlbnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXJldHVybiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQlyZXR1cm4gaXNTZXRBdXRvbGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIE5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG5ld1Rhc2tTdGFydERhdGUgIT0gbnVsbCA6ICFORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhuZXdUYXNrU3RhcnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXJldHVybiBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0VGFza0VWTWV0aG9kICE9IG51bGwgOiAhREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFRhc2tFVk1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVuZGVkQ3JlYXRpb25EYXRlICE9IG51bGwgOiAhRVhURU5ERURfQ1JFQVRJT05fREFURV9FREVGQVVMVC5lcXVhbHMoZXh0ZW5kZWRDcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQzoKLQkJCQlyZXR1cm4gaXNTZXRBY3R1YWxzSW5TeW5jKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzU2V0QWRtaW5Qcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUzoKLQkJCQlyZXR1cm4gb3V0bGluZUNvZGVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTOgotCQkJCXJldHVybiB3QlNNYXNrcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlyZXR1cm4gY2FsZW5kYXJzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJcmV0dXJuIHRhc2tzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXJldHVybiByZXNvdXJjZXMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gYXNzaWdubWVudHMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0aXRsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGl0bGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1YmplY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YmplY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGVnb3J5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXRlZ29yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29tcGFueTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29tcGFueSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFuYWdlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFuYWdlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRob3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWF0aW9uRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlYXRpb25EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXZpc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmV2aXNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhc3RTYXZlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFzdFNhdmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlZHVsZUZyb21TdGFydDogIik7Ci0JCWlmIChzY2hlZHVsZUZyb21TdGFydEVTZXQpIHJlc3VsdC5hcHBlbmQoc2NoZWR1bGVGcm9tU3RhcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZllTdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZZU3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcml0aWNhbFNsYWNrTGltaXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyaXRpY2FsU2xhY2tMaW1pdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVuY3lEaWdpdHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbmN5RGlnaXRzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW5jeVN5bWJvbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVuY3lTeW1ib2wpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGN1cnJlbmN5U3ltYm9sUG9zaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFN0YXJ0VGltZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdFN0YXJ0VGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdEZpbmlzaFRpbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRGaW5pc2hUaW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGVzUGVyRGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaW51dGVzUGVyRGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGVzUGVyV2VlazogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWludXRlc1BlcldlZWspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRheXNQZXJNb250aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF5c1Blck1vbnRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VGFza1R5cGU6ICIpOwotCQlpZiAoZGVmYXVsdFRhc2tUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChkZWZhdWx0VGFza1R5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRTdGFuZGFyZFJhdGU6ICIpOwotCQlpZiAoZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmYXVsdFN0YW5kYXJkUmF0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRPdmVydGltZVJhdGU6ICIpOwotCQlpZiAoZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmYXVsdE92ZXJ0aW1lUmF0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya0Zvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya0Zvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWRpdGFibGVBY3R1YWxDb3N0czogIik7Ci0JCWlmIChlZGl0YWJsZUFjdHVhbENvc3RzRVNldCkgcmVzdWx0LmFwcGVuZChlZGl0YWJsZUFjdHVhbENvc3RzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG9ub3JDb25zdHJhaW50czogIik7Ci0JCWlmIChob25vckNvbnN0cmFpbnRzRVNldCkgcmVzdWx0LmFwcGVuZChob25vckNvbnN0cmFpbnRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWFybmVkVmFsdWVNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVhcm5lZFZhbHVlTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk6ICIpOwotCQlpZiAoaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCkgcmVzdWx0LmFwcGVuZChpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtdWx0aXBsZUNyaXRpY2FsUGF0aHM6ICIpOwotCQlpZiAobXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkgcmVzdWx0LmFwcGVuZChtdWx0aXBsZUNyaXRpY2FsUGF0aHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrc0VmZm9ydERyaXZlbjogIik7Ci0JCWlmIChuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQobmV3VGFza3NFZmZvcnREcml2ZW4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrc0VzdGltYXRlZDogIik7Ci0JCWlmIChuZXdUYXNrc0VzdGltYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQobmV3VGFza3NFc3RpbWF0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcGxpdHNJblByb2dyZXNzVGFza3M6ICIpOwotCQlpZiAoc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCkgcmVzdWx0LmFwcGVuZChzcGxpdHNJblByb2dyZXNzVGFza3MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcHJlYWRBY3R1YWxDb3N0OiAiKTsKLQkJaWYgKHNwcmVhZEFjdHVhbENvc3RFU2V0KSByZXN1bHQuYXBwZW5kKHNwcmVhZEFjdHVhbENvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcHJlYWRQZXJjZW50Q29tcGxldGU6ICIpOwotCQlpZiAoc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCkgcmVzdWx0LmFwcGVuZChzcHJlYWRQZXJjZW50Q29tcGxldGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXNrVXBkYXRlc1Jlc291cmNlOiAiKTsKLQkJaWYgKHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0KSByZXN1bHQuYXBwZW5kKHRhc2tVcGRhdGVzUmVzb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXNjYWxZZWFyU3RhcnQ6ICIpOwotCQlpZiAoZmlzY2FsWWVhclN0YXJ0RVNldCkgcmVzdWx0LmFwcGVuZChmaXNjYWxZZWFyU3RhcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3ZWVrU3RhcnREYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdlZWtTdGFydERheSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZUNvbXBsZXRlZEVuZHNCYWNrOiAiKTsKLQkJaWYgKG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQpIHJlc3VsdC5hcHBlbmQobW92ZUNvbXBsZXRlZEVuZHNCYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2s6ICIpOwotCQlpZiAobW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSByZXN1bHQuYXBwZW5kKG1vdmVSZW1haW5pbmdTdGFydHNCYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ6ICIpOwotCQlpZiAobW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0KSByZXN1bHQuYXBwZW5kKG1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOiAiKTsKLQkJaWYgKG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpIHJlc3VsdC5hcHBlbmQobW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOiAiKTsKLQkJaWYgKGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpIHJlc3VsdC5hcHBlbmQoYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdHVzRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhdHVzRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVudERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOiAiKTsKLQkJaWYgKG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0KSByZXN1bHQuYXBwZW5kKG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRvbGluazogIik7Ci0JCWlmIChhdXRvbGlua0VTZXQpIHJlc3VsdC5hcHBlbmQoYXV0b2xpbmspOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrU3RhcnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuZXdUYXNrU3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VGFza0VWTWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0VGFza0VWTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDogIik7Ci0JCWlmIChwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQocHJvamVjdEV4dGVybmFsbHlFZGl0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlbmRlZENyZWF0aW9uRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZW5kZWRDcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbHNJblN5bmM6ICIpOwotCQlpZiAoYWN0dWFsc0luU3luY0VTZXQpIHJlc3VsdC5hcHBlbmQoYWN0dWFsc0luU3luYyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW92ZUZpbGVQcm9wZXJ0aWVzOiAiKTsKLQkJaWYgKHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCkgcmVzdWx0LmFwcGVuZChyZW1vdmVGaWxlUHJvcGVydGllcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFkbWluUHJvamVjdDogIik7Ci0JCWlmIChhZG1pblByb2plY3RFU2V0KSByZXN1bHQuYXBwZW5kKGFkbWluUHJvamVjdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9qZWN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1JhdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjZGFmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0UmF0ZVRhYmxlIDxlbT5SYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXRlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmF0ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzRnJvbSgpIDxlbT5SYXRlcyBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlc0Zyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJBVEVTX0ZST01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNGcm9tKCkgPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByYXRlc0Zyb20gPSBSQVRFU19GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzVG8oKSA8ZW0+UmF0ZXMgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJBVEVTX1RPX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzVG8oKSA8ZW0+UmF0ZXMgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmF0ZXNUbyA9IFJBVEVTX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVUYWJsZSgpIDxlbT5SYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSQVRFX1RBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVUYWJsZSgpIDxlbT5SYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJhdGVUYWJsZSA9IFJBVEVfVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFNUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgc3RhbmRhcmRSYXRlID0gU1RBTkRBUkRfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGUoKSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgT1ZFUlRJTUVfUkFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGUoKSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBvdmVydGltZVJhdGUgPSBPVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdCA9IE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9QRVJfVVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0UGVyVXNlID0gQ09TVF9QRVJfVVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmF0ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmF0ZXNGcm9tKCkgewotCQlyZXR1cm4gcmF0ZXNGcm9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVzRnJvbShPYmplY3QgbmV3UmF0ZXNGcm9tKSB7Ci0JCU9iamVjdCBvbGRSYXRlc0Zyb20gPSByYXRlc0Zyb207Ci0JCXJhdGVzRnJvbSA9IG5ld1JhdGVzRnJvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NLCBvbGRSYXRlc0Zyb20sIHJhdGVzRnJvbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmF0ZXNUbygpIHsKLQkJcmV0dXJuIHJhdGVzVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZXNUbyhPYmplY3QgbmV3UmF0ZXNUbykgewotCQlPYmplY3Qgb2xkUmF0ZXNUbyA9IHJhdGVzVG87Ci0JCXJhdGVzVG8gPSBuZXdSYXRlc1RvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPLCBvbGRSYXRlc1RvLCByYXRlc1RvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmF0ZVRhYmxlKCkgewotCQlyZXR1cm4gcmF0ZVRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVUYWJsZShCaWdJbnRlZ2VyIG5ld1JhdGVUYWJsZSkgewotCQlCaWdJbnRlZ2VyIG9sZFJhdGVUYWJsZSA9IHJhdGVUYWJsZTsKLQkJcmF0ZVRhYmxlID0gbmV3UmF0ZVRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEUsIG9sZFJhdGVUYWJsZSwgcmF0ZVRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsIG5ld1N0YW5kYXJkUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZFN0YW5kYXJkUmF0ZSA9IHN0YW5kYXJkUmF0ZTsKLQkJc3RhbmRhcmRSYXRlID0gbmV3U3RhbmRhcmRSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEUsIG9sZFN0YW5kYXJkUmF0ZSwgc3RhbmRhcmRSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld1N0YW5kYXJkUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCA9IHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJc3RhbmRhcmRSYXRlRm9ybWF0ID0gbmV3U3RhbmRhcmRSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFULCBvbGRTdGFuZGFyZFJhdGVGb3JtYXQsIHN0YW5kYXJkUmF0ZUZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCBuZXdPdmVydGltZVJhdGUpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZVJhdGUgPSBvdmVydGltZVJhdGU7Ci0JCW92ZXJ0aW1lUmF0ZSA9IG5ld092ZXJ0aW1lUmF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFLCBvbGRPdmVydGltZVJhdGUsIG92ZXJ0aW1lUmF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciBuZXdPdmVydGltZVJhdGVGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRPdmVydGltZVJhdGVGb3JtYXQgPSBvdmVydGltZVJhdGVGb3JtYXQ7Ci0JCW92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG5ld092ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCwgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0LCBvdmVydGltZVJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0UGVyVXNlKCkgewotCQlyZXR1cm4gY29zdFBlclVzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgbmV3Q29zdFBlclVzZSkgewotCQlCaWdEZWNpbWFsIG9sZENvc3RQZXJVc2UgPSBjb3N0UGVyVXNlOwotCQljb3N0UGVyVXNlID0gbmV3Q29zdFBlclVzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0UsIG9sZENvc3RQZXJVc2UsIGNvc3RQZXJVc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlyZXR1cm4gZ2V0UmF0ZXNGcm9tKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJcmV0dXJuIGdldFJhdGVzVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXJldHVybiBnZXRSYXRlVGFibGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRToKLQkJCQlyZXR1cm4gZ2V0Q29zdFBlclVzZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NOgotCQkJCXNldFJhdGVzRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJc2V0UmF0ZXNUbygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRToKLQkJCQlzZXRSYXRlVGFibGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZSgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fQ09TVF9QRVJfVVNFOgotCQkJCXNldENvc3RQZXJVc2UoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlzZXRSYXRlc0Zyb20oUkFURVNfRlJPTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPOgotCQkJCXNldFJhdGVzVG8oUkFURVNfVE9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXNldFJhdGVUYWJsZShSQVRFX1RBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURToKLQkJCQlzZXRTdGFuZGFyZFJhdGUoU1RBTkRBUkRfUkFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdChTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlKE9WRVJUSU1FX1JBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRPdmVydGltZVJhdGVGb3JtYXQoT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJc2V0Q29zdFBlclVzZShDT1NUX1BFUl9VU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST006Ci0JCQkJcmV0dXJuIFJBVEVTX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IHJhdGVzRnJvbSAhPSBudWxsIDogIVJBVEVTX0ZST01fRURFRkFVTFQuZXF1YWxzKHJhdGVzRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJcmV0dXJuIFJBVEVTX1RPX0VERUZBVUxUID09IG51bGwgPyByYXRlc1RvICE9IG51bGwgOiAhUkFURVNfVE9fRURFRkFVTFQuZXF1YWxzKHJhdGVzVG8pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIFJBVEVfVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHJhdGVUYWJsZSAhPSBudWxsIDogIVJBVEVfVEFCTEVfRURFRkFVTFQuZXF1YWxzKHJhdGVUYWJsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YW5kYXJkUmF0ZUZvcm1hdCAhPSBudWxsIDogIVNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1JBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZSAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lUmF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVJhdGVGb3JtYXQgIT0gbnVsbCA6ICFPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFBlclVzZSAhPSBudWxsIDogIUNPU1RfUEVSX1VTRV9FREVGQVVMVC5lcXVhbHMoY29zdFBlclVzZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyYXRlc0Zyb206ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhdGVzRnJvbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmF0ZXNUbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmF0ZXNUbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmF0ZVRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyYXRlVGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFuZGFyZFJhdGVGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UGVyVXNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UGVyVXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmF0ZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyYzA1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSYXRlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbCNnZXRSYXRlIDxlbT5SYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmF0ZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSYXRlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZSgpIDxlbT5SYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByYXRlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSYXRlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYXRlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSYXRlKCkgewotCQlpZiAocmF0ZSA9PSBudWxsKSB7Ci0JCQlyYXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJhdGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEUpOwotCQl9Ci0JCXJldHVybiByYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSYXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlyZXR1cm4gZ2V0UmF0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlnZXRSYXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRSYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCWdldFJhdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCXJldHVybiByYXRlICE9IG51bGwgJiYgIXJhdGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9SYXRlc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyN2Q3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjE1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGhvbmV0aWNzIDxlbT5QaG9uZXRpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE1hdGVyaWFsTGFiZWwgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvZGUgPGVtPkNvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTViA8ZW0+U1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJhdGVzIDxlbT5SYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGlEID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc051bGwoKSA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19OVUxMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgTnVsbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxzKCkgPGVtPkluaXRpYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbHMoKSA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxzID0gSU5JVElBTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNzKCkgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNzKCkgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljcyA9IFBIT05FVElDU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROVEFjY291bnQoKSA8ZW0+TlQgQWNjb3VudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TlRBY2NvdW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOVEFDQ09VTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TlRBY2NvdW50KCkgPGVtPk5UIEFjY291bnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5UQWNjb3VudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuVEFjY291bnQgPSBOVEFDQ09VTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF0ZXJpYWxMYWJlbCgpIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFURVJJQUxfTEFCRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF0ZXJpYWxMYWJlbCgpIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXRlcmlhbExhYmVsID0gTUFURVJJQUxfTEFCRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29kZSgpIDxlbT5Db2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvZGUoKSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb2RlID0gQ09ERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBncm91cCA9IEdST1VQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtHcm91cCgpIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBXT1JLX0dST1VQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtHcm91cCgpIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtHcm91cCA9IFdPUktfR1JPVVBfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW1haWxBZGRyZXNzKCkgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVtYWlsQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUxfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbWFpbEFkZHJlc3MoKSA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW1haWxBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IEVNQUlMX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGluayA9IEhZUEVSTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua0FkZHJlc3MgPSBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3MgPSBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VW5pdHMoKSA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfVU5JVFNfRURFRkFVTFQgPSAxLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VW5pdHMoKSA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IG1heFVuaXRzID0gTUFYX1VOSVRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNYXggVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1heFVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlYWtVbml0cygpIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgUEVBS19VTklUU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZWFrVW5pdHMoKSA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgcGVha1VuaXRzID0gUEVBS19VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUGVhayBVbml0cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVha1VuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkID0gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE92ZXIgQWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlRnJvbSA9IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZVRvID0gQVZBSUxBQkxFX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NhbkxldmVsKCkgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBTl9MRVZFTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYW5MZXZlbCgpIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkxldmVsID0gQ0FOX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDYW4gTGV2ZWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkxldmVsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY3J1ZUF0KCkgPGVtPkFjY3J1ZSBBdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBBQ0NSVUVfQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjcnVlQXQoKSA8ZW0+QWNjcnVlIEF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2NydWVBdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYWNjcnVlQXQgPSBBQ0NSVUVfQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdVTEFSX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWd1bGFyV29yayA9IFJFR1VMQVJfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBPVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgb3ZlcnRpbWVXb3JrID0gT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmsgPSBBQ1RVQUxfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ092ZXJ0aW1lV29yayA9IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBTVEFOREFSRF9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHN0YW5kYXJkUmF0ZSA9IFNUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0ID0gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lUmF0ZSA9IE9WRVJUSU1FX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVDb3N0ID0gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdFBlclVzZSA9IENPU1RfUEVSX1VTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsQ29zdCA9IEFDVFVBTF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbE92ZXJ0aW1lQ29zdCA9IEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdDb3N0KCkgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdDb3N0ID0gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBXT1JLX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtWYXJpYW5jZSgpIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBXb3JrIFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFZhcmlhbmNlKCkgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDT1NUX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjb3N0VmFyaWFuY2UgPSBDT1NUX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb3N0IFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb3N0VmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U1YoKSA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFNWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNWKCkgPGVtPlNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHNWID0gU1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ1ZfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY1YgPSBDVl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ1YgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNWRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsZW5kYXJVSUQgPSBDQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90ZXMgPSBOT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzR2VuZXJpYygpIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0dFTkVSSUNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNHZW5lcmljKCkgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyaWMgPSBJU19HRU5FUklDX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBHZW5lcmljIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyaWNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0luYWN0aXZlKCkgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19JTkFDVElWRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0luYWN0aXZlKCkgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5hY3RpdmUgPSBJU19JTkFDVElWRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgSW5hY3RpdmUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5hY3RpdmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VudGVycHJpc2UoKSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FTlRFUlBSSVNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW50ZXJwcmlzZSgpIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlID0gSVNfRU5URVJQUklTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRW50ZXJwcmlzZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCT09LSU5HX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9va2luZ1R5cGUoKSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYm9va2luZ1R5cGUgPSBCT09LSU5HX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWRV9ESVJFQ1RPUllfR1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3RpdmVEaXJlY3RvcnlHVUlEID0gQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lQ29kZSgpIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRsaW5lQ29kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXZhaWxhYmlsaXR5UGVyaW9kcyBhdmFpbGFiaWxpdHlQZXJpb2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzKCkgPGVtPlJhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJhdGVzIHJhdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gaUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoQmlnSW50ZWdlciBuZXdJRCkgewotCQlCaWdJbnRlZ2VyIG9sZElEID0gaUQ7Ci0JCWlEID0gbmV3SUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gbmV3SXNOdWxsKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlpc051bGwgPSBuZXdJc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMLCBvbGRJc051bGwsIGlzTnVsbCwgIW9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzTnVsbCgpIHsKLQkJYm9vbGVhbiBvbGRJc051bGwgPSBpc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbCA9IElTX05VTExfRURFRkFVTFQ7Ci0JCWlzTnVsbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMLCBvbGRJc051bGwsIElTX05VTExfRURFRkFVTFQsIG9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzTnVsbCgpIHsKLQkJcmV0dXJuIGlzTnVsbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFscygpIHsKLQkJcmV0dXJuIGluaXRpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxzKFN0cmluZyBuZXdJbml0aWFscykgewotCQlTdHJpbmcgb2xkSW5pdGlhbHMgPSBpbml0aWFsczsKLQkJaW5pdGlhbHMgPSBuZXdJbml0aWFsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSU5JVElBTFMsIG9sZEluaXRpYWxzLCBpbml0aWFscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNzKCkgewotCQlyZXR1cm4gcGhvbmV0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljcyhTdHJpbmcgbmV3UGhvbmV0aWNzKSB7Ci0JCVN0cmluZyBvbGRQaG9uZXRpY3MgPSBwaG9uZXRpY3M7Ci0JCXBob25ldGljcyA9IG5ld1Bob25ldGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTLCBvbGRQaG9uZXRpY3MsIHBob25ldGljcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TlRBY2NvdW50KCkgewotCQlyZXR1cm4gblRBY2NvdW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5UQWNjb3VudChTdHJpbmcgbmV3TlRBY2NvdW50KSB7Ci0JCVN0cmluZyBvbGROVEFjY291bnQgPSBuVEFjY291bnQ7Ci0JCW5UQWNjb3VudCA9IG5ld05UQWNjb3VudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5ULCBvbGROVEFjY291bnQsIG5UQWNjb3VudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0ZXJpYWxMYWJlbCgpIHsKLQkJcmV0dXJuIG1hdGVyaWFsTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcgbmV3TWF0ZXJpYWxMYWJlbCkgewotCQlTdHJpbmcgb2xkTWF0ZXJpYWxMYWJlbCA9IG1hdGVyaWFsTGFiZWw7Ci0JCW1hdGVyaWFsTGFiZWwgPSBuZXdNYXRlcmlhbExhYmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTCwgb2xkTWF0ZXJpYWxMYWJlbCwgbWF0ZXJpYWxMYWJlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29kZSgpIHsKLQkJcmV0dXJuIGNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgbmV3Q29kZSkgewotCQlTdHJpbmcgb2xkQ29kZSA9IGNvZGU7Ci0JCWNvZGUgPSBuZXdDb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFLCBvbGRDb2RlLCBjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHcm91cCgpIHsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyb3VwKFN0cmluZyBuZXdHcm91cCkgewotCQlTdHJpbmcgb2xkR3JvdXAgPSBncm91cDsKLQkJZ3JvdXAgPSBuZXdHcm91cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVAsIG9sZEdyb3VwLCBncm91cCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtHcm91cCgpIHsKLQkJcmV0dXJuIHdvcmtHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrR3JvdXAoQmlnSW50ZWdlciBuZXdXb3JrR3JvdXApIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrR3JvdXAgPSB3b3JrR3JvdXA7Ci0JCXdvcmtHcm91cCA9IG5ld1dvcmtHcm91cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUCwgb2xkV29ya0dyb3VwLCB3b3JrR3JvdXApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpIHsKLQkJcmV0dXJuIGVtYWlsQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbWFpbEFkZHJlc3MoU3RyaW5nIG5ld0VtYWlsQWRkcmVzcykgewotCQlTdHJpbmcgb2xkRW1haWxBZGRyZXNzID0gZW1haWxBZGRyZXNzOwotCQllbWFpbEFkZHJlc3MgPSBuZXdFbWFpbEFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1MsIG9sZEVtYWlsQWRkcmVzcywgZW1haWxBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmsoKSB7Ci0JCXJldHVybiBoeXBlcmxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyBuZXdIeXBlcmxpbmspIHsKLQkJU3RyaW5nIG9sZEh5cGVybGluayA9IGh5cGVybGluazsKLQkJaHlwZXJsaW5rID0gbmV3SHlwZXJsaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUywgb2xkSHlwZXJsaW5rU3ViQWRkcmVzcywgaHlwZXJsaW5rU3ViQWRkcmVzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRNYXhVbml0cygpIHsKLQkJcmV0dXJuIG1heFVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFVuaXRzKGZsb2F0IG5ld01heFVuaXRzKSB7Ci0JCWZsb2F0IG9sZE1heFVuaXRzID0gbWF4VW5pdHM7Ci0JCW1heFVuaXRzID0gbmV3TWF4VW5pdHM7Ci0JCWJvb2xlYW4gb2xkTWF4VW5pdHNFU2V0ID0gbWF4VW5pdHNFU2V0OwotCQltYXhVbml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFMsIG9sZE1heFVuaXRzLCBtYXhVbml0cywgIW9sZE1heFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWF4VW5pdHMoKSB7Ci0JCWZsb2F0IG9sZE1heFVuaXRzID0gbWF4VW5pdHM7Ci0JCWJvb2xlYW4gb2xkTWF4VW5pdHNFU2V0ID0gbWF4VW5pdHNFU2V0OwotCQltYXhVbml0cyA9IE1BWF9VTklUU19FREVGQVVMVDsKLQkJbWF4VW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTLCBvbGRNYXhVbml0cywgTUFYX1VOSVRTX0VERUZBVUxULCBvbGRNYXhVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1heFVuaXRzKCkgewotCQlyZXR1cm4gbWF4VW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRQZWFrVW5pdHMoKSB7Ci0JCXJldHVybiBwZWFrVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVha1VuaXRzKGZsb2F0IG5ld1BlYWtVbml0cykgewotCQlmbG9hdCBvbGRQZWFrVW5pdHMgPSBwZWFrVW5pdHM7Ci0JCXBlYWtVbml0cyA9IG5ld1BlYWtVbml0czsKLQkJYm9vbGVhbiBvbGRQZWFrVW5pdHNFU2V0ID0gcGVha1VuaXRzRVNldDsKLQkJcGVha1VuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFMsIG9sZFBlYWtVbml0cywgcGVha1VuaXRzLCAhb2xkUGVha1VuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UGVha1VuaXRzKCkgewotCQlmbG9hdCBvbGRQZWFrVW5pdHMgPSBwZWFrVW5pdHM7Ci0JCWJvb2xlYW4gb2xkUGVha1VuaXRzRVNldCA9IHBlYWtVbml0c0VTZXQ7Ci0JCXBlYWtVbml0cyA9IFBFQUtfVU5JVFNfRURFRkFVTFQ7Ci0JCXBlYWtVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTLCBvbGRQZWFrVW5pdHMsIFBFQUtfVU5JVFNfRURFRkFVTFQsIG9sZFBlYWtVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFBlYWtVbml0cygpIHsKLQkJcmV0dXJuIHBlYWtVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPdmVyQWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlckFsbG9jYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4gbmV3T3ZlckFsbG9jYXRlZCkgewotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWQgPSBvdmVyQWxsb2NhdGVkOwotCQlvdmVyQWxsb2NhdGVkID0gbmV3T3ZlckFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkRVNldCA9IG92ZXJBbGxvY2F0ZWRFU2V0OwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBvdmVyQWxsb2NhdGVkLCAhb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVCwgb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyQWxsb2NhdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZUZyb20oKSB7Ci0JCXJldHVybiBhdmFpbGFibGVGcm9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IG5ld0F2YWlsYWJsZUZyb20pIHsKLQkJT2JqZWN0IG9sZEF2YWlsYWJsZUZyb20gPSBhdmFpbGFibGVGcm9tOwotCQlhdmFpbGFibGVGcm9tID0gbmV3QXZhaWxhYmxlRnJvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST00sIG9sZEF2YWlsYWJsZUZyb20sIGF2YWlsYWJsZUZyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZVRvKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IG5ld0F2YWlsYWJsZVRvKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVUbyA9IGF2YWlsYWJsZVRvOwotCQlhdmFpbGFibGVUbyA9IG5ld0F2YWlsYWJsZVRvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE8sIG9sZEF2YWlsYWJsZVRvLCBhdmFpbGFibGVUbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbkxldmVsKCkgewotCQlyZXR1cm4gY2FuTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuTGV2ZWwoYm9vbGVhbiBuZXdDYW5MZXZlbCkgewotCQlib29sZWFuIG9sZENhbkxldmVsID0gY2FuTGV2ZWw7Ci0JCWNhbkxldmVsID0gbmV3Q2FuTGV2ZWw7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWxFU2V0ID0gY2FuTGV2ZWxFU2V0OwotCQljYW5MZXZlbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUwsIG9sZENhbkxldmVsLCBjYW5MZXZlbCwgIW9sZENhbkxldmVsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q2FuTGV2ZWwoKSB7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWwgPSBjYW5MZXZlbDsKLQkJYm9vbGVhbiBvbGRDYW5MZXZlbEVTZXQgPSBjYW5MZXZlbEVTZXQ7Ci0JCWNhbkxldmVsID0gQ0FOX0xFVkVMX0VERUZBVUxUOwotCQljYW5MZXZlbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUwsIG9sZENhbkxldmVsLCBDQU5fTEVWRUxfRURFRkFVTFQsIG9sZENhbkxldmVsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q2FuTGV2ZWwoKSB7Ci0JCXJldHVybiBjYW5MZXZlbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QWNjcnVlQXQoKSB7Ci0JCXJldHVybiBhY2NydWVBdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2NydWVBdChCaWdJbnRlZ2VyIG5ld0FjY3J1ZUF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkQWNjcnVlQXQgPSBhY2NydWVBdDsKLQkJYWNjcnVlQXQgPSBuZXdBY2NydWVBdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FULCBvbGRBY2NydWVBdCwgYWNjcnVlQXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVndWxhcldvcmsoKSB7Ci0JCXJldHVybiByZWd1bGFyV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgbmV3UmVndWxhcldvcmspIHsKLQkJT2JqZWN0IG9sZFJlZ3VsYXJXb3JrID0gcmVndWxhcldvcms7Ci0JCXJlZ3VsYXJXb3JrID0gbmV3UmVndWxhcldvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSywgb2xkUmVndWxhcldvcmssIHJlZ3VsYXJXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLLCBvbGRPdmVydGltZVdvcmssIG92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSywgb2xkQWN0dWFsV29yaywgYWN0dWFsV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgbmV3QWN0dWFsT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxPdmVydGltZVdvcmsgPSBhY3R1YWxPdmVydGltZVdvcms7Ci0JCWFjdHVhbE92ZXJ0aW1lV29yayA9IG5ld0FjdHVhbE92ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ092ZXJ0aW1lV29yayA9IHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFLCBvbGRQZXJjZW50V29ya0NvbXBsZXRlLCBwZXJjZW50V29ya0NvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsIG5ld1N0YW5kYXJkUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZFN0YW5kYXJkUmF0ZSA9IHN0YW5kYXJkUmF0ZTsKLQkJc3RhbmRhcmRSYXRlID0gbmV3U3RhbmRhcmRSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFLCBvbGRTdGFuZGFyZFJhdGUsIHN0YW5kYXJkUmF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciBuZXdTdGFuZGFyZFJhdGVGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRTdGFuZGFyZFJhdGVGb3JtYXQgPSBzdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JCXN0YW5kYXJkUmF0ZUZvcm1hdCA9IG5ld1N0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQsIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCwgc3RhbmRhcmRSYXRlRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBvdmVydGltZVJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVSYXRlID0gb3ZlcnRpbWVSYXRlOwotCQlvdmVydGltZVJhdGUgPSBuZXdPdmVydGltZVJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEUsIG9sZE92ZXJ0aW1lUmF0ZSwgb3ZlcnRpbWVSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld092ZXJ0aW1lUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZE92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJb3ZlcnRpbWVSYXRlRm9ybWF0ID0gbmV3T3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCwgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0LCBvdmVydGltZVJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBvdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVDb3N0ID0gb3ZlcnRpbWVDb3N0OwotCQlvdmVydGltZUNvc3QgPSBuZXdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpIHsKLQkJcmV0dXJuIGNvc3RQZXJVc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIG5ld0Nvc3RQZXJVc2UpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0UGVyVXNlID0gY29zdFBlclVzZTsKLQkJY29zdFBlclVzZSA9IG5ld0Nvc3RQZXJVc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRSwgb2xkQ29zdFBlclVzZSwgY29zdFBlclVzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsQ29zdCA9IGFjdHVhbENvc3Q7Ci0JCWFjdHVhbENvc3QgPSBuZXdBY3R1YWxDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1QsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCwgYWN0dWFsT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ0Nvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRSZW1haW5pbmdDb3N0ID0gcmVtYWluaW5nQ29zdDsKLQkJcmVtYWluaW5nQ29zdCA9IG5ld1JlbWFpbmluZ0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVCwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0LCByZW1haW5pbmdPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCBuZXdXb3JrVmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQl3b3JrVmFyaWFuY2UgPSBuZXdXb3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCBXT1JLX1ZBUklBTkNFX0VERUZBVUxULCBvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBjb3N0VmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IG5ld0Nvc3RWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWNvc3RWYXJpYW5jZSA9IG5ld0Nvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgY29zdFZhcmlhbmNlLCAhb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFLCBvbGRDb3N0VmFyaWFuY2UsIENPU1RfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZENvc3RWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvc3RWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIGNvc3RWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFNWKCkgewotCQlyZXR1cm4gc1Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U1YoZmxvYXQgbmV3U1YpIHsKLQkJZmxvYXQgb2xkU1YgPSBzVjsKLQkJc1YgPSBuZXdTVjsKLQkJYm9vbGVhbiBvbGRTVkVTZXQgPSBzVkVTZXQ7Ci0JCXNWRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWLCBvbGRTViwgc1YsICFvbGRTVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNWKCkgewotCQlmbG9hdCBvbGRTViA9IHNWOwotCQlib29sZWFuIG9sZFNWRVNldCA9IHNWRVNldDsKLQkJc1YgPSBTVl9FREVGQVVMVDsKLQkJc1ZFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1YsIG9sZFNWLCBTVl9FREVGQVVMVCwgb2xkU1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTVigpIHsKLQkJcmV0dXJuIHNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1YsIG9sZENWLCBjViwgIW9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q1YoKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljViA9IENWX0VERUZBVUxUOwotCQljVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DViwgb2xkQ1YsIENWX0VERUZBVUxULCBvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENWKCkgewotCQlyZXR1cm4gY1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBQ1dQKGZsb2F0IG5ld0FDV1ApIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWFDV1AgPSBuZXdBQ1dQOwotCQlib29sZWFuIG9sZEFDV1BFU2V0ID0gYUNXUEVTZXQ7Ci0JCWFDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gY2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGVuZGFyVUlEID0gY2FsZW5kYXJVSUQ7Ci0JCWNhbGVuZGFyVUlEID0gbmV3Q2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTEVOREFSX1VJRCwgb2xkQ2FsZW5kYXJVSUQsIGNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNHZW5lcmljKCkgewotCQlyZXR1cm4gaXNHZW5lcmljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzR2VuZXJpYyhib29sZWFuIG5ld0lzR2VuZXJpYykgewotCQlib29sZWFuIG9sZElzR2VuZXJpYyA9IGlzR2VuZXJpYzsKLQkJaXNHZW5lcmljID0gbmV3SXNHZW5lcmljOwotCQlib29sZWFuIG9sZElzR2VuZXJpY0VTZXQgPSBpc0dlbmVyaWNFU2V0OwotCQlpc0dlbmVyaWNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQywgb2xkSXNHZW5lcmljLCBpc0dlbmVyaWMsICFvbGRJc0dlbmVyaWNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0dlbmVyaWMoKSB7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljID0gaXNHZW5lcmljOwotCQlib29sZWFuIG9sZElzR2VuZXJpY0VTZXQgPSBpc0dlbmVyaWNFU2V0OwotCQlpc0dlbmVyaWMgPSBJU19HRU5FUklDX0VERUZBVUxUOwotCQlpc0dlbmVyaWNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQywgb2xkSXNHZW5lcmljLCBJU19HRU5FUklDX0VERUZBVUxULCBvbGRJc0dlbmVyaWNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0dlbmVyaWMoKSB7Ci0JCXJldHVybiBpc0dlbmVyaWNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNJbmFjdGl2ZSgpIHsKLQkJcmV0dXJuIGlzSW5hY3RpdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNJbmFjdGl2ZShib29sZWFuIG5ld0lzSW5hY3RpdmUpIHsKLQkJYm9vbGVhbiBvbGRJc0luYWN0aXZlID0gaXNJbmFjdGl2ZTsKLQkJaXNJbmFjdGl2ZSA9IG5ld0lzSW5hY3RpdmU7Ci0JCWJvb2xlYW4gb2xkSXNJbmFjdGl2ZUVTZXQgPSBpc0luYWN0aXZlRVNldDsKLQkJaXNJbmFjdGl2ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRSwgb2xkSXNJbmFjdGl2ZSwgaXNJbmFjdGl2ZSwgIW9sZElzSW5hY3RpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0luYWN0aXZlKCkgewotCQlib29sZWFuIG9sZElzSW5hY3RpdmUgPSBpc0luYWN0aXZlOwotCQlib29sZWFuIG9sZElzSW5hY3RpdmVFU2V0ID0gaXNJbmFjdGl2ZUVTZXQ7Ci0JCWlzSW5hY3RpdmUgPSBJU19JTkFDVElWRV9FREVGQVVMVDsKLQkJaXNJbmFjdGl2ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRSwgb2xkSXNJbmFjdGl2ZSwgSVNfSU5BQ1RJVkVfRURFRkFVTFQsIG9sZElzSW5hY3RpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0luYWN0aXZlKCkgewotCQlyZXR1cm4gaXNJbmFjdGl2ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0VudGVycHJpc2UoKSB7Ci0JCXJldHVybiBpc0VudGVycHJpc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4gbmV3SXNFbnRlcnByaXNlKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlID0gaXNFbnRlcnByaXNlOwotCQlpc0VudGVycHJpc2UgPSBuZXdJc0VudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlRVNldCA9IGlzRW50ZXJwcmlzZUVTZXQ7Ci0JCWlzRW50ZXJwcmlzZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFLCBvbGRJc0VudGVycHJpc2UsIGlzRW50ZXJwcmlzZSwgIW9sZElzRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzRW50ZXJwcmlzZSgpIHsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2UgPSBpc0VudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlRVNldCA9IGlzRW50ZXJwcmlzZUVTZXQ7Ci0JCWlzRW50ZXJwcmlzZSA9IElTX0VOVEVSUFJJU0VfRURFRkFVTFQ7Ci0JCWlzRW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFLCBvbGRJc0VudGVycHJpc2UsIElTX0VOVEVSUFJJU0VfRURFRkFVTFQsIG9sZElzRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzRW50ZXJwcmlzZSgpIHsKLQkJcmV0dXJuIGlzRW50ZXJwcmlzZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Qm9va2luZ1R5cGUoKSB7Ci0JCXJldHVybiBib29raW5nVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIG5ld0Jvb2tpbmdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQm9va2luZ1R5cGUgPSBib29raW5nVHlwZTsKLQkJYm9va2luZ1R5cGUgPSBuZXdCb29raW5nVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFLCBvbGRCb29raW5nVHlwZSwgYm9va2luZ1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCwgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgewotCQlyZXR1cm4gYWN0aXZlRGlyZWN0b3J5R1VJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZyBuZXdBY3RpdmVEaXJlY3RvcnlHVUlEKSB7Ci0JCVN0cmluZyBvbGRBY3RpdmVEaXJlY3RvcnlHVUlEID0gYWN0aXZlRGlyZWN0b3J5R1VJRDsKLQkJYWN0aXZlRGlyZWN0b3J5R1VJRCA9IG5ld0FjdGl2ZURpcmVjdG9yeUdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRCwgb2xkQWN0aXZlRGlyZWN0b3J5R1VJRCwgYWN0aXZlRGlyZWN0b3J5R1VJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gY3JlYXRpb25EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgbmV3Q3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRDcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7Ci0JCWNyZWF0aW9uRGF0ZSA9IG5ld0NyZWF0aW9uRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCYXNlbGluZSgpIHsKLQkJaWYgKGJhc2VsaW5lID09IG51bGwpIHsKLQkJCWJhc2VsaW5lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJhc2VsaW5lMi5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdmFpbGFiaWxpdHlQZXJpb2RzIGdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKSB7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZHMgb2xkQXZhaWxhYmlsaXR5UGVyaW9kcyA9IGF2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JCWF2YWlsYWJpbGl0eVBlcmlvZHMgPSBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgb2xkQXZhaWxhYmlsaXR5UGVyaW9kcywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMpIHsKLQkJaWYgKG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMgIT0gYXZhaWxhYmlsaXR5UGVyaW9kcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhdmFpbGFiaWxpdHlQZXJpb2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMobmV3QXZhaWxhYmlsaXR5UGVyaW9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSYXRlcyBnZXRSYXRlcygpIHsKLQkJcmV0dXJuIHJhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJhdGVzKFJhdGVzIG5ld1JhdGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJhdGVzIG9sZFJhdGVzID0gcmF0ZXM7Ci0JCXJhdGVzID0gbmV3UmF0ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBvbGRSYXRlcywgbmV3UmF0ZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVzKFJhdGVzIG5ld1JhdGVzKSB7Ci0JCWlmIChuZXdSYXRlcyAhPSByYXRlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmF0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmF0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmF0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmF0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYXRlcyhuZXdSYXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbmV3UmF0ZXMsIG5ld1JhdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEEpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0bGluZUNvZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmF0ZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGltZXBoYXNlZERhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzSXNOdWxsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXJldHVybiBnZXRQaG9uZXRpY3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5UOgotCQkJCXJldHVybiBnZXROVEFjY291bnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJcmV0dXJuIGdldE1hdGVyaWFsTGFiZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09ERToKLQkJCQlyZXR1cm4gZ2V0Q29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0V29ya0dyb3VwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEVtYWlsQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0TWF4VW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRQZWFrVW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc092ZXJBbGxvY2F0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXJldHVybiBnZXRBdmFpbGFibGVGcm9tKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlyZXR1cm4gaXNDYW5MZXZlbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FUOgotCQkJCXJldHVybiBnZXRBY2NydWVBdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gZ2V0U3RhbmRhcmRSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBnZXRPdmVydGltZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFOgotCQkJCXJldHVybiBnZXRDb3N0UGVyVXNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q29zdFZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFNWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QUNXUCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm90ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDOgotCQkJCXJldHVybiBpc0lzR2VuZXJpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJcmV0dXJuIGlzSXNJbmFjdGl2ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNJc0VudGVycHJpc2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Qm9va2luZ1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRDoKLQkJCQlyZXR1cm4gZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBnZXRDcmVhdGlvbkRhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBnZXRPdXRsaW5lQ29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQlyZXR1cm4gZ2V0UmF0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlzZXRJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfTlVMTDoKLQkJCQlzZXRJc051bGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlzZXRJbml0aWFscygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BIT05FVElDUzoKLQkJCQlzZXRQaG9uZXRpY3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJc2V0TlRBY2NvdW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJc2V0TWF0ZXJpYWxMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJc2V0Q29kZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXNldEdyb3VwKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlzZXRXb3JrR3JvdXAoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlzZXRFbWFpbEFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXNldE1heFVuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTOgotCQkJCXNldFBlYWtVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlckFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUw6Ci0JCQkJc2V0Q2FuTGV2ZWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJc2V0QWNjcnVlQXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURToKLQkJCQlzZXRPdmVydGltZVJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NUOgotCQkJCXNldFJlbWFpbmluZ0Nvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXNldENvc3RWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1Y6Ci0JCQkJc2V0U1YoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlzZXROb3RlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDOgotCQkJCXNldElzR2VuZXJpYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXNldElzSW5hY3RpdmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXNldElzRW50ZXJwcmlzZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRToKLQkJCQlzZXRCb29raW5nVHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQ6Ci0JCQkJc2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXNldFJhdGVzKChSYXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXVuc2V0SXNOdWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlzZXRJbml0aWFscyhJTklUSUFMU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1M6Ci0JCQkJc2V0UGhvbmV0aWNzKFBIT05FVElDU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJc2V0TlRBY2NvdW50KE5UQUNDT1VOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlzZXRNYXRlcmlhbExhYmVsKE1BVEVSSUFMX0xBQkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJc2V0Q29kZShDT0RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXNldEdyb3VwKEdST1VQX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfR1JPVVA6Ci0JCQkJc2V0V29ya0dyb3VwKFdPUktfR1JPVVBfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlzZXRFbWFpbEFkZHJlc3MoRU1BSUxfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKEhZUEVSTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJdW5zZXRNYXhVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUzoKLQkJCQl1bnNldFBlYWtVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfRlJPTToKLQkJCQlzZXRBdmFpbGFibGVGcm9tKEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlzZXRBdmFpbGFibGVUbyhBVkFJTEFCTEVfVE9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FOX0xFVkVMOgotCQkJCXVuc2V0Q2FuTGV2ZWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDQ1JVRV9BVDoKLQkJCQlzZXRBY2NydWVBdChBQ0NSVUVfQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKFJFR1VMQVJfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yayhPVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoQUNUVUFMX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yayhSRU1BSU5JTkdfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZShTVEFOREFSRF9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdChTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXNldE92ZXJ0aW1lUmF0ZShPVkVSVElNRV9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXNldE92ZXJ0aW1lUmF0ZUZvcm1hdChPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXNldE92ZXJ0aW1lQ29zdChPVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKENPU1RfUEVSX1VTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdChBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KFJFTUFJTklOR19DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQl1bnNldFNWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXVuc2V0QUNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKENBTEVOREFSX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlzZXROb3RlcyhOT1RFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJdW5zZXRJc0dlbmVyaWMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXVuc2V0SXNJbmFjdGl2ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQl1bnNldElzRW50ZXJwcmlzZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKEJPT0tJTkdfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXNldEFjdGl2ZURpcmVjdG9yeUdVSUQoQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKENSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVM6Ci0JCQkJc2V0UmF0ZXMoKFJhdGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpRCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXJldHVybiBpc1NldElzTnVsbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlyZXR1cm4gSU5JVElBTFNfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRpYWxzICE9IG51bGwgOiAhSU5JVElBTFNfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXJldHVybiBQSE9ORVRJQ1NfRURFRkFVTFQgPT0gbnVsbCA/IHBob25ldGljcyAhPSBudWxsIDogIVBIT05FVElDU19FREVGQVVMVC5lcXVhbHMocGhvbmV0aWNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5UOgotCQkJCXJldHVybiBOVEFDQ09VTlRfRURFRkFVTFQgPT0gbnVsbCA/IG5UQWNjb3VudCAhPSBudWxsIDogIU5UQUNDT1VOVF9FREVGQVVMVC5lcXVhbHMoblRBY2NvdW50KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJcmV0dXJuIE1BVEVSSUFMX0xBQkVMX0VERUZBVUxUID09IG51bGwgPyBtYXRlcmlhbExhYmVsICE9IG51bGwgOiAhTUFURVJJQUxfTEFCRUxfRURFRkFVTFQuZXF1YWxzKG1hdGVyaWFsTGFiZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFOgotCQkJCXJldHVybiBDT0RFX0VERUZBVUxUID09IG51bGwgPyBjb2RlICE9IG51bGwgOiAhQ09ERV9FREVGQVVMVC5lcXVhbHMoY29kZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXJldHVybiBHUk9VUF9FREVGQVVMVCA9PSBudWxsID8gZ3JvdXAgIT0gbnVsbCA6ICFHUk9VUF9FREVGQVVMVC5lcXVhbHMoZ3JvdXApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQOgotCQkJCXJldHVybiBXT1JLX0dST1VQX0VERUZBVUxUID09IG51bGwgPyB3b3JrR3JvdXAgIT0gbnVsbCA6ICFXT1JLX0dST1VQX0VERUZBVUxULmVxdWFscyh3b3JrR3JvdXApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FTUFJTF9BRERSRVNTOgotCQkJCXJldHVybiBFTUFJTF9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBlbWFpbEFkZHJlc3MgIT0gbnVsbCA6ICFFTUFJTF9BRERSRVNTX0VERUZBVUxULmVxdWFscyhlbWFpbEFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rICE9IG51bGwgOiAhSFlQRVJMSU5LX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtTdWJBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXJldHVybiBpc1NldE1heFVuaXRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0UGVha1VuaXRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST006Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID09IG51bGwgPyBhdmFpbGFibGVGcm9tICE9IG51bGwgOiAhQVZBSUxBQkxFX0ZST01fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZUZyb20pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE86Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9UT19FREVGQVVMVCA9PSBudWxsID8gYXZhaWxhYmxlVG8gIT0gbnVsbCA6ICFBVkFJTEFCTEVfVE9fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZVRvKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlyZXR1cm4gaXNTZXRDYW5MZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIEFDQ1JVRV9BVF9FREVGQVVMVCA9PSBudWxsID8gYWNjcnVlQXQgIT0gbnVsbCA6ICFBQ0NSVUVfQVRfRURFRkFVTFQuZXF1YWxzKGFjY3J1ZUF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIFJFR1VMQVJfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVndWxhcldvcmsgIT0gbnVsbCA6ICFSRUdVTEFSX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlZ3VsYXJXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrICE9IG51bGwgOiAhQUNUVUFMX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50V29ya0NvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGVGb3JtYXQgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBPVkVSVElNRV9SQVRFX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVJhdGUgIT0gbnVsbCA6ICFPVkVSVElNRV9SQVRFX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZUZvcm1hdCAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFBlclVzZSAhPSBudWxsIDogIUNPU1RfUEVSX1VTRV9FREVGQVVMVC5lcXVhbHMoY29zdFBlclVzZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldENvc3RWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlyZXR1cm4gaXNTZXRTVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXJldHVybiBpc1NldEFDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBDQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGVuZGFyVUlEICE9IG51bGwgOiAhQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhjYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJcmV0dXJuIGlzU2V0SXNHZW5lcmljKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXJldHVybiBpc1NldElzSW5hY3RpdmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNTZXRJc0VudGVycHJpc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBCT09LSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGJvb2tpbmdUeXBlICE9IG51bGwgOiAhQk9PS0lOR19UWVBFX0VERUZBVUxULmVxdWFscyhib29raW5nVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrUHJvdGVjdGVkICE9IG51bGwgOiAhQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxULmVxdWFscyhhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXJldHVybiBBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2ZURpcmVjdG9yeUdVSUQgIT0gbnVsbCA6ICFBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQuZXF1YWxzKGFjdGl2ZURpcmVjdG9yeUdVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGJhc2VsaW5lICE9IG51bGwgJiYgIWJhc2VsaW5lLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZSAhPSBudWxsICYmICFvdXRsaW5lQ29kZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXJldHVybiByYXRlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzTnVsbDogIik7Ci0JCWlmIChpc051bGxFU2V0KSByZXN1bHQuYXBwZW5kKGlzTnVsbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0aWFscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGhvbmV0aWNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5UQWNjb3VudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoblRBY2NvdW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXRlcmlhbExhYmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXRlcmlhbExhYmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb2RlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtHcm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya0dyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbWFpbEFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVtYWlsQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1heFVuaXRzOiAiKTsKLQkJaWYgKG1heFVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChtYXhVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlYWtVbml0czogIik7Ci0JCWlmIChwZWFrVW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKHBlYWtVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJBbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlckFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlckFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZUZyb206ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF2YWlsYWJsZUZyb20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVRvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVUbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FuTGV2ZWw6ICIpOwotCQlpZiAoY2FuTGV2ZWxFU2V0KSByZXN1bHQuYXBwZW5kKGNhbkxldmVsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWNjcnVlQXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjY3J1ZUF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWd1bGFyV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVndWxhcldvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmNlbnRXb3JrQ29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFuZGFyZFJhdGVGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdFBlclVzZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdFBlclVzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0VmFyaWFuY2U6ICIpOwotCQlpZiAoY29zdFZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZChjb3N0VmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzVjogIik7Ci0JCWlmIChzVkVTZXQpIHJlc3VsdC5hcHBlbmQoc1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNHZW5lcmljOiAiKTsKLQkJaWYgKGlzR2VuZXJpY0VTZXQpIHJlc3VsdC5hcHBlbmQoaXNHZW5lcmljKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNJbmFjdGl2ZTogIik7Ci0JCWlmIChpc0luYWN0aXZlRVNldCkgcmVzdWx0LmFwcGVuZChpc0luYWN0aXZlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFbnRlcnByaXNlOiAiKTsKLQkJaWYgKGlzRW50ZXJwcmlzZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNFbnRlcnByaXNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYm9va2luZ1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJvb2tpbmdUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZlRGlyZWN0b3J5R1VJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZlRGlyZWN0b3J5R1VJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZlNjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZXNJbXBsI2dldFJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2UoKSA8ZW0+UmVzb3VyY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZSgpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFU19fUkVTT1VSQ0UpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlnZXRSZXNvdXJjZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlnZXRSZXNvdXJjZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTg3ODQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDcmVhdGVEYXRlIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRXQlMgPGVtPldCUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lTnVtYmVyIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFByaW9yaXR5IDxlbT5Qcmlvcml0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEVhcmx5RmluaXNoIDxlbT5FYXJseSBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMYXRlU3RhcnQgPGVtPkxhdGUgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZyZWVTbGFjayA8ZW0+RnJlZSBTbGFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFRvdGFsU2xhY2sgPGVtPlRvdGFsIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGVyY2VudENvbXBsZXRlIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxEdXJhdGlvbiA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29uc3RyYWludFR5cGUgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RGVhZGxpbmUgPGVtPkRlYWRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVMZXZlbGVkU3RhcnQgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgaUQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX05VTExfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNOdWxsKCkgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGwgPSBJU19OVUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBOdWxsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlRGF0ZSgpIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ1JFQVRFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlRGF0ZSgpIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVEYXRlID0gQ1JFQVRFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFjdCgpIDxlbT5Db250YWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhY3QoKSA8ZW0+Q29udGFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250YWN0ID0gQ09OVEFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlMoKSA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlMoKSA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd0JTID0gV0JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU0xldmVsKCkgPGVtPldCUyBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19MRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlNMZXZlbCgpIDxlbT5XQlMgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdCU0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdCU0xldmVsID0gV0JTX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVOdW1iZXIoKSA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVExJTkVfTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVOdW1iZXIoKSA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3V0bGluZU51bWJlciA9IE9VVExJTkVfTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVMZXZlbCgpIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVVRMSU5FX0xFVkVMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVMZXZlbCgpIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG91dGxpbmVMZXZlbCA9IE9VVExJTkVfTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpb3JpdHkoKSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUFJJT1JJVFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpb3JpdHkoKSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwcmlvcml0eSA9IFBSSU9SSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1BfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0b3AgPSBTVE9QX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVTVU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZXN1bWUgPSBSRVNVTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXN1bWVWYWxpZCgpIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNVTUVfVkFMSURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdW1lVmFsaWQoKSA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVWYWxpZCA9IFJFU1VNRV9WQUxJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzdW1lIFZhbGlkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVWYWxpZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VmZm9ydERyaXZlbigpIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVGRk9SVF9EUklWRU5fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWZmb3J0RHJpdmVuKCkgPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZmZvcnREcml2ZW4gPSBFRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFZmZvcnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWN1cnJpbmcoKSA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFQ1VSUklOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWN1cnJpbmcoKSA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjdXJyaW5nID0gUkVDVVJSSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZWN1cnJpbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlY3VycmluZ0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJBbGxvY2F0ZWQoKSA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJBbGxvY2F0ZWQoKSA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPdmVyIEFsbG9jYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlckFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZCgpIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVNUSU1BVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZCgpIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWQgPSBFU1RJTUFURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVzdGltYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSUxFU1RPTkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pbGVzdG9uZSA9IE1JTEVTVE9ORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWlsZXN0b25lIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdW1tYXJ5KCkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNVTU1BUllfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VtbWFyeSgpIDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1bW1hcnkgPSBTVU1NQVJZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTdW1tYXJ5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdW1tYXJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3JpdGljYWwoKSA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDUklUSUNBTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcml0aWNhbCgpIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JpdGljYWwgPSBDUklUSUNBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ3JpdGljYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyaXRpY2FsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0KCkgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1VCUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N1YnByb2plY3QoKSA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdCA9IElTX1NVQlBST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN1YnByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdFJlYWRPbmx5ID0gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN1YnByb2plY3QgUmVhZCBPbmx5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJwcm9qZWN0TmFtZSgpIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJQUk9KRUNUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VicHJvamVjdE5hbWUoKSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJwcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWJwcm9qZWN0TmFtZSA9IFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dGVybmFsVGFzaygpIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYVEVSTkFMX1RBU0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXh0ZXJuYWxUYXNrKCkgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbFRhc2sgPSBFWFRFUk5BTF9UQVNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFeHRlcm5hbCBUYXNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbFRhc2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpIDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX1RBU0tfUFJPSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbFRhc2tQcm9qZWN0ID0gRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5U3RhcnQoKSA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVBUkxZX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5U3RhcnQoKSA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZWFybHlTdGFydCA9IEVBUkxZX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5RmluaXNoKCkgPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybHlGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVBUkxZX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJseUZpbmlzaCgpIDxlbT5FYXJseSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGVhcmx5RmluaXNoID0gRUFSTFlfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVTdGFydCgpIDxlbT5MYXRlIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXRlU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExBVEVfU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0ZVN0YXJ0KCkgPGVtPkxhdGUgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsYXRlU3RhcnQgPSBMQVRFX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVGaW5pc2goKSA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExBVEVfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVGaW5pc2goKSA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGF0ZUZpbmlzaCA9IExBVEVfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFydFZhcmlhbmNlID0gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmaW5pc2hWYXJpYW5jZSA9IEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcmVlU2xhY2soKSA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRlJFRV9TTEFDS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcmVlU2xhY2soKSA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmcmVlU2xhY2sgPSBGUkVFX1NMQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvdGFsU2xhY2soKSA8ZW0+VG90YWwgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvdGFsU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUT1RBTF9TTEFDS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3RhbFNsYWNrKCkgPGVtPlRvdGFsIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb3RhbFNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0b3RhbFNsYWNrID0gVE9UQUxfU0xBQ0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0KCkgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBGSVhFRF9DT1NUX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpeGVkQ29zdCgpIDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBmaXhlZENvc3QgPSBGSVhFRF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXhlZCBDb3N0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXhlZENvc3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaXhlZENvc3RBY2NydWFsID0gRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRDb21wbGV0ZSA9IFBFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRXb3JrQ29tcGxldGUgPSBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lQ29zdCA9IE9WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG92ZXJ0aW1lV29yayA9IE9WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsU3RhcnQoKSA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsU3RhcnQgPSBBQ1RVQUxfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbEZpbmlzaCA9IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRHVyYXRpb24oKSA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbER1cmF0aW9uKCkgPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsRHVyYXRpb24gPSBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbENvc3QgPSBBQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxPdmVydGltZUNvc3QgPSBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmsgPSBBQ1RVQUxfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHVUxBUl9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVndWxhcldvcmsgPSBSRUdVTEFSX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKSA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkgPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nRHVyYXRpb24gPSBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNWID0gQ1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJhaW50VHlwZSgpIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnRUeXBlKCkgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNvbnN0cmFpbnRUeXBlID0gQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsZW5kYXJVSUQgPSBDQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uc3RyYWludERhdGUoKSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ09OU1RSQUlOVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnREYXRlKCkgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29uc3RyYWludERhdGUgPSBDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVhZGxpbmUoKSA8ZW0+RGVhZGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlYWRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBERUFETElORV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWFkbGluZSgpIDxlbT5EZWFkbGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVhZGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVhZGxpbmUgPSBERUFETElORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsQXNzaWdubWVudHMoKSA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsQXNzaWdubWVudHMoKSA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxBc3NpZ25tZW50cyA9IExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMZXZlbCBBc3NpZ25tZW50cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxBc3NpZ25tZW50c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsaW5nQ2FuU3BsaXQoKSA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRVZFTElOR19DQU5fU1BMSVRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpIDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxpbmdDYW5TcGxpdCA9IExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGV2ZWxpbmcgQ2FuIFNwbGl0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZXZlbGluZ0NhblNwbGl0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXkoKSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5ID0gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXQgPSBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRTdGFydCgpIDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHByZUxldmVsZWRTdGFydCA9IFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRGaW5pc2goKSA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcHJlTGV2ZWxlZEZpbmlzaCA9IFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IElHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSWdub3JlIFJlc291cmNlIENhbGVuZGFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGVzID0gTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlQmFyKCkgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX0JBUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlQmFyKCkgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhpZGVCYXIgPSBISURFX0JBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSGlkZSBCYXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhpZGVCYXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsdXAoKSA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJPTExVUF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsdXAoKSA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sbHVwID0gUk9MTFVQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSb2xsdXAgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJvbGx1cEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlID0gUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kID0gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yTGluaygpIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZWRlY2Vzc29yTGluayA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZSgpIDxlbT5CYXNlbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VsaW5lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlKCkgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGxpbmVDb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gaUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoQmlnSW50ZWdlciBuZXdJRCkgewotCQlCaWdJbnRlZ2VyIG9sZElEID0gaUQ7Ci0JCWlEID0gbmV3SUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUQsIG9sZElELCBpRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gbmV3SXNOdWxsKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlpc051bGwgPSBuZXdJc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEwsIG9sZElzTnVsbCwgaXNOdWxsLCAhb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNOdWxsKCkgewotCQlib29sZWFuIG9sZElzTnVsbCA9IGlzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQkJaXNOdWxsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTCwgb2xkSXNOdWxsLCBJU19OVUxMX0VERUZBVUxULCBvbGRJc051bGxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0ZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlRGF0ZShPYmplY3QgbmV3Q3JlYXRlRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRlRGF0ZSA9IGNyZWF0ZURhdGU7Ci0JCWNyZWF0ZURhdGUgPSBuZXdDcmVhdGVEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFLCBvbGRDcmVhdGVEYXRlLCBjcmVhdGVEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250YWN0KCkgewotCQlyZXR1cm4gY29udGFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWN0KFN0cmluZyBuZXdDb250YWN0KSB7Ci0JCVN0cmluZyBvbGRDb250YWN0ID0gY29udGFjdDsKLQkJY29udGFjdCA9IG5ld0NvbnRhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OVEFDVCwgb2xkQ29udGFjdCwgY29udGFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V0JTKCkgewotCQlyZXR1cm4gd0JTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCUyhTdHJpbmcgbmV3V0JTKSB7Ci0JCVN0cmluZyBvbGRXQlMgPSB3QlM7Ci0JCXdCUyA9IG5ld1dCUzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlMsIG9sZFdCUywgd0JTKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXQlNMZXZlbCgpIHsKLQkJcmV0dXJuIHdCU0xldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCU0xldmVsKFN0cmluZyBuZXdXQlNMZXZlbCkgewotCQlTdHJpbmcgb2xkV0JTTGV2ZWwgPSB3QlNMZXZlbDsKLQkJd0JTTGV2ZWwgPSBuZXdXQlNMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUwsIG9sZFdCU0xldmVsLCB3QlNMZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZU51bWJlcigpIHsKLQkJcmV0dXJuIG91dGxpbmVOdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZU51bWJlcihTdHJpbmcgbmV3T3V0bGluZU51bWJlcikgewotCQlTdHJpbmcgb2xkT3V0bGluZU51bWJlciA9IG91dGxpbmVOdW1iZXI7Ci0JCW91dGxpbmVOdW1iZXIgPSBuZXdPdXRsaW5lTnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSLCBvbGRPdXRsaW5lTnVtYmVyLCBvdXRsaW5lTnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3V0bGluZUxldmVsKCkgewotCQlyZXR1cm4gb3V0bGluZUxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyIG5ld091dGxpbmVMZXZlbCkgewotCQlCaWdJbnRlZ2VyIG9sZE91dGxpbmVMZXZlbCA9IG91dGxpbmVMZXZlbDsKLQkJb3V0bGluZUxldmVsID0gbmV3T3V0bGluZUxldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTEVWRUwsIG9sZE91dGxpbmVMZXZlbCwgb3V0bGluZUxldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBwcmlvcml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eShCaWdJbnRlZ2VyIG5ld1ByaW9yaXR5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkUHJpb3JpdHkgPSBwcmlvcml0eTsKLQkJcHJpb3JpdHkgPSBuZXdQcmlvcml0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWSwgb2xkUHJpb3JpdHksIHByaW9yaXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKE9iamVjdCBuZXdGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldER1cmF0aW9uKCkgewotCQlyZXR1cm4gZHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IG5ld0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGREdXJhdGlvbiA9IGR1cmF0aW9uOwotCQlkdXJhdGlvbiA9IG5ld0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OLCBvbGREdXJhdGlvbiwgZHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RvcCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChPYmplY3QgbmV3U3RvcCkgewotCQlPYmplY3Qgb2xkU3RvcCA9IHN0b3A7Ci0JCXN0b3AgPSBuZXdTdG9wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1AsIG9sZFN0b3AsIHN0b3ApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlc3VtZSgpIHsKLQkJcmV0dXJuIHJlc3VtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWUoT2JqZWN0IG5ld1Jlc3VtZSkgewotCQlPYmplY3Qgb2xkUmVzdW1lID0gcmVzdW1lOwotCQlyZXN1bWUgPSBuZXdSZXN1bWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FLCBvbGRSZXN1bWUsIHJlc3VtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzdW1lVmFsaWQoKSB7Ci0JCXJldHVybiByZXN1bWVWYWxpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWVWYWxpZChib29sZWFuIG5ld1Jlc3VtZVZhbGlkKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWQgPSByZXN1bWVWYWxpZDsKLQkJcmVzdW1lVmFsaWQgPSBuZXdSZXN1bWVWYWxpZDsKLQkJYm9vbGVhbiBvbGRSZXN1bWVWYWxpZEVTZXQgPSByZXN1bWVWYWxpZEVTZXQ7Ci0JCXJlc3VtZVZhbGlkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElELCBvbGRSZXN1bWVWYWxpZCwgcmVzdW1lVmFsaWQsICFvbGRSZXN1bWVWYWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3VtZVZhbGlkKCkgewotCQlib29sZWFuIG9sZFJlc3VtZVZhbGlkID0gcmVzdW1lVmFsaWQ7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWRFU2V0ID0gcmVzdW1lVmFsaWRFU2V0OwotCQlyZXN1bWVWYWxpZCA9IFJFU1VNRV9WQUxJRF9FREVGQVVMVDsKLQkJcmVzdW1lVmFsaWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQsIG9sZFJlc3VtZVZhbGlkLCBSRVNVTUVfVkFMSURfRURFRkFVTFQsIG9sZFJlc3VtZVZhbGlkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzdW1lVmFsaWQoKSB7Ci0JCXJldHVybiByZXN1bWVWYWxpZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBlZmZvcnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4gbmV3RWZmb3J0RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuID0gZWZmb3J0RHJpdmVuOwotCQllZmZvcnREcml2ZW4gPSBuZXdFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuRVNldCA9IGVmZm9ydERyaXZlbkVTZXQ7Ci0JCWVmZm9ydERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU4sIG9sZEVmZm9ydERyaXZlbiwgZWZmb3J0RHJpdmVuLCAhb2xkRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWZmb3J0RHJpdmVuKCkgewotCQlib29sZWFuIG9sZEVmZm9ydERyaXZlbiA9IGVmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGRFZmZvcnREcml2ZW5FU2V0ID0gZWZmb3J0RHJpdmVuRVNldDsKLQkJZWZmb3J0RHJpdmVuID0gRUZGT1JUX0RSSVZFTl9FREVGQVVMVDsKLQkJZWZmb3J0RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTiwgb2xkRWZmb3J0RHJpdmVuLCBFRkZPUlRfRFJJVkVOX0VERUZBVUxULCBvbGRFZmZvcnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBlZmZvcnREcml2ZW5FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVjdXJyaW5nKCkgewotCQlyZXR1cm4gcmVjdXJyaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY3VycmluZyhib29sZWFuIG5ld1JlY3VycmluZykgewotCQlib29sZWFuIG9sZFJlY3VycmluZyA9IHJlY3VycmluZzsKLQkJcmVjdXJyaW5nID0gbmV3UmVjdXJyaW5nOwotCQlib29sZWFuIG9sZFJlY3VycmluZ0VTZXQgPSByZWN1cnJpbmdFU2V0OwotCQlyZWN1cnJpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkcsIG9sZFJlY3VycmluZywgcmVjdXJyaW5nLCAhb2xkUmVjdXJyaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVjdXJyaW5nKCkgewotCQlib29sZWFuIG9sZFJlY3VycmluZyA9IHJlY3VycmluZzsKLQkJYm9vbGVhbiBvbGRSZWN1cnJpbmdFU2V0ID0gcmVjdXJyaW5nRVNldDsKLQkJcmVjdXJyaW5nID0gUkVDVVJSSU5HX0VERUZBVUxUOwotCQlyZWN1cnJpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkcsIG9sZFJlY3VycmluZywgUkVDVVJSSU5HX0VERUZBVUxULCBvbGRSZWN1cnJpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZWN1cnJpbmcoKSB7Ci0JCXJldHVybiByZWN1cnJpbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlckFsbG9jYXRlZChib29sZWFuIG5ld092ZXJBbGxvY2F0ZWQpIHsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkID0gb3ZlckFsbG9jYXRlZDsKLQkJb3ZlckFsbG9jYXRlZCA9IG5ld092ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBvdmVyQWxsb2NhdGVkLCAhb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxULCBvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXN0aW1hdGVkKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRlZChib29sZWFuIG5ld0VzdGltYXRlZCkgewotCQlib29sZWFuIG9sZEVzdGltYXRlZCA9IGVzdGltYXRlZDsKLQkJZXN0aW1hdGVkID0gbmV3RXN0aW1hdGVkOwotCQlib29sZWFuIG9sZEVzdGltYXRlZEVTZXQgPSBlc3RpbWF0ZWRFU2V0OwotCQllc3RpbWF0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQsIG9sZEVzdGltYXRlZCwgZXN0aW1hdGVkLCAhb2xkRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXN0aW1hdGVkKCkgewotCQlib29sZWFuIG9sZEVzdGltYXRlZCA9IGVzdGltYXRlZDsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWRFU2V0ID0gZXN0aW1hdGVkRVNldDsKLQkJZXN0aW1hdGVkID0gRVNUSU1BVEVEX0VERUZBVUxUOwotCQllc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQsIG9sZEVzdGltYXRlZCwgRVNUSU1BVEVEX0VERUZBVUxULCBvbGRFc3RpbWF0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIG5ld01pbGVzdG9uZSkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJbWlsZXN0b25lID0gbmV3TWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgbWlsZXN0b25lLCAhb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWlsZXN0b25lKCkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCQltaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgTUlMRVNUT05FX0VERUZBVUxULCBvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VtbWFyeSgpIHsKLQkJcmV0dXJuIHN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VtbWFyeShib29sZWFuIG5ld1N1bW1hcnkpIHsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5ID0gc3VtbWFyeTsKLQkJc3VtbWFyeSA9IG5ld1N1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkU3VtbWFyeUVTZXQgPSBzdW1tYXJ5RVNldDsKLQkJc3VtbWFyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlksIG9sZFN1bW1hcnksIHN1bW1hcnksICFvbGRTdW1tYXJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U3VtbWFyeSgpIHsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5ID0gc3VtbWFyeTsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5RVNldCA9IHN1bW1hcnlFU2V0OwotCQlzdW1tYXJ5ID0gU1VNTUFSWV9FREVGQVVMVDsKLQkJc3VtbWFyeUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlksIG9sZFN1bW1hcnksIFNVTU1BUllfRURFRkFVTFQsIG9sZFN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdW1tYXJ5KCkgewotCQlyZXR1cm4gc3VtbWFyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDcml0aWNhbCgpIHsKLQkJcmV0dXJuIGNyaXRpY2FsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyaXRpY2FsKGJvb2xlYW4gbmV3Q3JpdGljYWwpIHsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbCA9IGNyaXRpY2FsOwotCQljcml0aWNhbCA9IG5ld0NyaXRpY2FsOwotCQlib29sZWFuIG9sZENyaXRpY2FsRVNldCA9IGNyaXRpY2FsRVNldDsKLQkJY3JpdGljYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTCwgb2xkQ3JpdGljYWwsIGNyaXRpY2FsLCAhb2xkQ3JpdGljYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDcml0aWNhbCgpIHsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbCA9IGNyaXRpY2FsOwotCQlib29sZWFuIG9sZENyaXRpY2FsRVNldCA9IGNyaXRpY2FsRVNldDsKLQkJY3JpdGljYWwgPSBDUklUSUNBTF9FREVGQVVMVDsKLQkJY3JpdGljYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTCwgb2xkQ3JpdGljYWwsIENSSVRJQ0FMX0VERUZBVUxULCBvbGRDcml0aWNhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENyaXRpY2FsKCkgewotCQlyZXR1cm4gY3JpdGljYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTdWJwcm9qZWN0KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3VicHJvamVjdChib29sZWFuIG5ld0lzU3VicHJvamVjdCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdCA9IGlzU3VicHJvamVjdDsKLQkJaXNTdWJwcm9qZWN0ID0gbmV3SXNTdWJwcm9qZWN0OwotCQlib29sZWFuIG9sZElzU3VicHJvamVjdEVTZXQgPSBpc1N1YnByb2plY3RFU2V0OwotCQlpc1N1YnByb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNULCBvbGRJc1N1YnByb2plY3QsIGlzU3VicHJvamVjdCwgIW9sZElzU3VicHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3VicHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3QgPSBpc1N1YnByb2plY3Q7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0RVNldCA9IGlzU3VicHJvamVjdEVTZXQ7Ci0JCWlzU3VicHJvamVjdCA9IElTX1NVQlBST0pFQ1RfRURFRkFVTFQ7Ci0JCWlzU3VicHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1QsIG9sZElzU3VicHJvamVjdCwgSVNfU1VCUFJPSkVDVF9FREVGQVVMVCwgb2xkSXNTdWJwcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbiBuZXdJc1N1YnByb2plY3RSZWFkT25seSkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWlzU3VicHJvamVjdFJlYWRPbmx5ID0gbmV3SXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCQlpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZLCBvbGRJc1N1YnByb2plY3RSZWFkT25seSwgaXNTdWJwcm9qZWN0UmVhZE9ubHksICFvbGRJc1N1YnByb2plY3RSZWFkT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCQlpc1N1YnByb2plY3RSZWFkT25seSA9IElTX1NVQlBST0pFQ1RfUkVBRF9PTkxZX0VERUZBVUxUOwotCQlpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZLCBvbGRJc1N1YnByb2plY3RSZWFkT25seSwgSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQsIG9sZElzU3VicHJvamVjdFJlYWRPbmx5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiBpc1N1YnByb2plY3RSZWFkT25seUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJwcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHN1YnByb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1YnByb2plY3ROYW1lKFN0cmluZyBuZXdTdWJwcm9qZWN0TmFtZSkgewotCQlTdHJpbmcgb2xkU3VicHJvamVjdE5hbWUgPSBzdWJwcm9qZWN0TmFtZTsKLQkJc3VicHJvamVjdE5hbWUgPSBuZXdTdWJwcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUUsIG9sZFN1YnByb2plY3ROYW1lLCBzdWJwcm9qZWN0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxUYXNrKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsVGFzayhib29sZWFuIG5ld0V4dGVybmFsVGFzaykgewotCQlib29sZWFuIG9sZEV4dGVybmFsVGFzayA9IGV4dGVybmFsVGFzazsKLQkJZXh0ZXJuYWxUYXNrID0gbmV3RXh0ZXJuYWxUYXNrOwotCQlib29sZWFuIG9sZEV4dGVybmFsVGFza0VTZXQgPSBleHRlcm5hbFRhc2tFU2V0OwotCQlleHRlcm5hbFRhc2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLLCBvbGRFeHRlcm5hbFRhc2ssIGV4dGVybmFsVGFzaywgIW9sZEV4dGVybmFsVGFza0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEV4dGVybmFsVGFzaygpIHsKLQkJYm9vbGVhbiBvbGRFeHRlcm5hbFRhc2sgPSBleHRlcm5hbFRhc2s7Ci0JCWJvb2xlYW4gb2xkRXh0ZXJuYWxUYXNrRVNldCA9IGV4dGVybmFsVGFza0VTZXQ7Ci0JCWV4dGVybmFsVGFzayA9IEVYVEVSTkFMX1RBU0tfRURFRkFVTFQ7Ci0JCWV4dGVybmFsVGFza0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0ssIG9sZEV4dGVybmFsVGFzaywgRVhURVJOQUxfVEFTS19FREVGQVVMVCwgb2xkRXh0ZXJuYWxUYXNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXh0ZXJuYWxUYXNrKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsVGFza1Byb2plY3QoKSB7Ci0JCXJldHVybiBleHRlcm5hbFRhc2tQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nIG5ld0V4dGVybmFsVGFza1Byb2plY3QpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsVGFza1Byb2plY3QgPSBleHRlcm5hbFRhc2tQcm9qZWN0OwotCQlleHRlcm5hbFRhc2tQcm9qZWN0ID0gbmV3RXh0ZXJuYWxUYXNrUHJvamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1QsIG9sZEV4dGVybmFsVGFza1Byb2plY3QsIGV4dGVybmFsVGFza1Byb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVhcmx5U3RhcnQoKSB7Ci0JCXJldHVybiBlYXJseVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhcmx5U3RhcnQoT2JqZWN0IG5ld0Vhcmx5U3RhcnQpIHsKLQkJT2JqZWN0IG9sZEVhcmx5U3RhcnQgPSBlYXJseVN0YXJ0OwotCQllYXJseVN0YXJ0ID0gbmV3RWFybHlTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVCwgb2xkRWFybHlTdGFydCwgZWFybHlTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWFybHlGaW5pc2goKSB7Ci0JCXJldHVybiBlYXJseUZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFYXJseUZpbmlzaChPYmplY3QgbmV3RWFybHlGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEVhcmx5RmluaXNoID0gZWFybHlGaW5pc2g7Ci0JCWVhcmx5RmluaXNoID0gbmV3RWFybHlGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNILCBvbGRFYXJseUZpbmlzaCwgZWFybHlGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdGVTdGFydCgpIHsKLQkJcmV0dXJuIGxhdGVTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXRlU3RhcnQoT2JqZWN0IG5ld0xhdGVTdGFydCkgewotCQlPYmplY3Qgb2xkTGF0ZVN0YXJ0ID0gbGF0ZVN0YXJ0OwotCQlsYXRlU3RhcnQgPSBuZXdMYXRlU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9TVEFSVCwgb2xkTGF0ZVN0YXJ0LCBsYXRlU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdGVGaW5pc2goKSB7Ci0JCXJldHVybiBsYXRlRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdGVGaW5pc2goT2JqZWN0IG5ld0xhdGVGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZExhdGVGaW5pc2ggPSBsYXRlRmluaXNoOwotCQlsYXRlRmluaXNoID0gbmV3TGF0ZUZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSCwgb2xkTGF0ZUZpbmlzaCwgbGF0ZUZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBzdGFydFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciBuZXdTdGFydFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkU3RhcnRWYXJpYW5jZSA9IHN0YXJ0VmFyaWFuY2U7Ci0JCXN0YXJ0VmFyaWFuY2UgPSBuZXdTdGFydFZhcmlhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFLCBvbGRTdGFydFZhcmlhbmNlLCBzdGFydFZhcmlhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKSB7Ci0JCXJldHVybiBmaW5pc2hWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIG5ld0ZpbmlzaFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRmluaXNoVmFyaWFuY2UgPSBmaW5pc2hWYXJpYW5jZTsKLQkJZmluaXNoVmFyaWFuY2UgPSBuZXdGaW5pc2hWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0UsIG9sZEZpbmlzaFZhcmlhbmNlLCBmaW5pc2hWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IG5ld1dvcmtWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCXdvcmtWYXJpYW5jZSA9IG5ld1dvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCB3b3JrVmFyaWFuY2UsICFvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlID0gV09SS19WQVJJQU5DRV9FREVGQVVMVDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCBXT1JLX1ZBUklBTkNFX0VERUZBVUxULCBvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZyZWVTbGFjaygpIHsKLQkJcmV0dXJuIGZyZWVTbGFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcmVlU2xhY2soQmlnSW50ZWdlciBuZXdGcmVlU2xhY2spIHsKLQkJQmlnSW50ZWdlciBvbGRGcmVlU2xhY2sgPSBmcmVlU2xhY2s7Ci0JCWZyZWVTbGFjayA9IG5ld0ZyZWVTbGFjazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLLCBvbGRGcmVlU2xhY2ssIGZyZWVTbGFjaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFRvdGFsU2xhY2soKSB7Ci0JCXJldHVybiB0b3RhbFNsYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvdGFsU2xhY2soQmlnSW50ZWdlciBuZXdUb3RhbFNsYWNrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVG90YWxTbGFjayA9IHRvdGFsU2xhY2s7Ci0JCXRvdGFsU2xhY2sgPSBuZXdUb3RhbFNsYWNrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLLCBvbGRUb3RhbFNsYWNrLCB0b3RhbFNsYWNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZpeGVkQ29zdCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZENvc3QoZmxvYXQgbmV3Rml4ZWRDb3N0KSB7Ci0JCWZsb2F0IG9sZEZpeGVkQ29zdCA9IGZpeGVkQ29zdDsKLQkJZml4ZWRDb3N0ID0gbmV3Rml4ZWRDb3N0OwotCQlib29sZWFuIG9sZEZpeGVkQ29zdEVTZXQgPSBmaXhlZENvc3RFU2V0OwotCQlmaXhlZENvc3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NULCBvbGRGaXhlZENvc3QsIGZpeGVkQ29zdCwgIW9sZEZpeGVkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpeGVkQ29zdCgpIHsKLQkJZmxvYXQgb2xkRml4ZWRDb3N0ID0gZml4ZWRDb3N0OwotCQlib29sZWFuIG9sZEZpeGVkQ29zdEVTZXQgPSBmaXhlZENvc3RFU2V0OwotCQlmaXhlZENvc3QgPSBGSVhFRF9DT1NUX0VERUZBVUxUOwotCQlmaXhlZENvc3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NULCBvbGRGaXhlZENvc3QsIEZJWEVEX0NPU1RfRURFRkFVTFQsIG9sZEZpeGVkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpeGVkQ29zdCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaXhlZENvc3RBY2NydWFsKCkgewotCQlyZXR1cm4gZml4ZWRDb3N0QWNjcnVhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZENvc3RBY2NydWFsKFN0cmluZyBuZXdGaXhlZENvc3RBY2NydWFsKSB7Ci0JCVN0cmluZyBvbGRGaXhlZENvc3RBY2NydWFsID0gZml4ZWRDb3N0QWNjcnVhbDsKLQkJZml4ZWRDb3N0QWNjcnVhbCA9IG5ld0ZpeGVkQ29zdEFjY3J1YWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMLCBvbGRGaXhlZENvc3RBY2NydWFsLCBmaXhlZENvc3RBY2NydWFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BlcmNlbnRDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRDb21wbGV0ZSA9IHBlcmNlbnRDb21wbGV0ZTsKLQkJcGVyY2VudENvbXBsZXRlID0gbmV3UGVyY2VudENvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEUsIG9sZFBlcmNlbnRDb21wbGV0ZSwgcGVyY2VudENvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BlcmNlbnRXb3JrQ29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQZXJjZW50V29ya0NvbXBsZXRlID0gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJcGVyY2VudFdvcmtDb21wbGV0ZSA9IG5ld1BlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFLCBvbGRQZXJjZW50V29ya0NvbXBsZXRlLCBwZXJjZW50V29ya0NvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZUNvc3QgPSBvdmVydGltZUNvc3Q7Ci0JCW92ZXJ0aW1lQ29zdCA9IG5ld092ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NULCBvbGRPdmVydGltZUNvc3QsIG92ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gb3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lV29yayhPYmplY3QgbmV3T3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRPdmVydGltZVdvcmsgPSBvdmVydGltZVdvcms7Ci0JCW92ZXJ0aW1lV29yayA9IG5ld092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLLCBvbGRPdmVydGltZVdvcmssIG92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKSB7Ci0JCXJldHVybiBhY3R1YWxTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgbmV3QWN0dWFsU3RhcnQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFN0YXJ0ID0gYWN0dWFsU3RhcnQ7Ci0JCWFjdHVhbFN0YXJ0ID0gbmV3QWN0dWFsU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJULCBvbGRBY3R1YWxTdGFydCwgYWN0dWFsU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbEZpbmlzaCgpIHsKLQkJcmV0dXJuIGFjdHVhbEZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxGaW5pc2goT2JqZWN0IG5ld0FjdHVhbEZpbmlzaCkgewotCQlPYmplY3Qgb2xkQWN0dWFsRmluaXNoID0gYWN0dWFsRmluaXNoOwotCQlhY3R1YWxGaW5pc2ggPSBuZXdBY3R1YWxGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSCwgb2xkQWN0dWFsRmluaXNoLCBhY3R1YWxGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbER1cmF0aW9uKCkgewotCQlyZXR1cm4gYWN0dWFsRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0IG5ld0FjdHVhbER1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uOwotCQlhY3R1YWxEdXJhdGlvbiA9IG5ld0FjdHVhbER1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTiwgb2xkQWN0dWFsRHVyYXRpb24sIGFjdHVhbER1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbENvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbENvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxDb3N0ID0gYWN0dWFsQ29zdDsKLQkJYWN0dWFsQ29zdCA9IG5ld0FjdHVhbENvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1QsIG9sZEFjdHVhbENvc3QsIGFjdHVhbENvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0ID0gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlhY3R1YWxPdmVydGltZUNvc3QgPSBuZXdBY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1QsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCwgYWN0dWFsT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCBuZXdBY3R1YWxXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrID0gYWN0dWFsV29yazsKLQkJYWN0dWFsV29yayA9IG5ld0FjdHVhbFdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUkssIG9sZEFjdHVhbFdvcmssIGFjdHVhbFdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrID0gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlhY3R1YWxPdmVydGltZVdvcmsgPSBuZXdBY3R1YWxPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUkssIG9sZFJlZ3VsYXJXb3JrLCByZWd1bGFyV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nRHVyYXRpb24oKSB7Ci0JCXJldHVybiByZW1haW5pbmdEdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdEdXJhdGlvbihPYmplY3QgbmV3UmVtYWluaW5nRHVyYXRpb24pIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ0R1cmF0aW9uID0gcmVtYWluaW5nRHVyYXRpb247Ci0JCXJlbWFpbmluZ0R1cmF0aW9uID0gbmV3UmVtYWluaW5nRHVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OLCBvbGRSZW1haW5pbmdEdXJhdGlvbiwgcmVtYWluaW5nRHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ0Nvc3QgPSByZW1haW5pbmdDb3N0OwotCQlyZW1haW5pbmdDb3N0ID0gbmV3UmVtYWluaW5nQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfQ09TVCwgb2xkUmVtYWluaW5nQ29zdCwgcmVtYWluaW5nQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLLCBvbGRSZW1haW5pbmdXb3JrLCByZW1haW5pbmdXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmsgPSByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lV29yayA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QUNXUChmbG9hdCBuZXdBQ1dQKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlhQ1dQID0gbmV3QUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1AsIG9sZEFDV1AsIEFDV1BfRURFRkFVTFQsIG9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldENWKCkgewotCQlyZXR1cm4gY1Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q1YoZmxvYXQgbmV3Q1YpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJY1YgPSBuZXdDVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1YsIG9sZENWLCBjViwgIW9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q1YoKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljViA9IENWX0VERUZBVUxUOwotCQljVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWLCBvbGRDViwgQ1ZfRURFRkFVTFQsIG9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q1YoKSB7Ci0JCXJldHVybiBjVkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q29uc3RyYWludFR5cGUoKSB7Ci0JCXJldHVybiBjb25zdHJhaW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50VHlwZShCaWdJbnRlZ2VyIG5ld0NvbnN0cmFpbnRUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ29uc3RyYWludFR5cGUgPSBjb25zdHJhaW50VHlwZTsKLQkJY29uc3RyYWludFR5cGUgPSBuZXdDb25zdHJhaW50VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEUsIG9sZENvbnN0cmFpbnRUeXBlLCBjb25zdHJhaW50VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gY2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGVuZGFyVUlEID0gY2FsZW5kYXJVSUQ7Ci0JCWNhbGVuZGFyVUlEID0gbmV3Q2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlELCBvbGRDYWxlbmRhclVJRCwgY2FsZW5kYXJVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnREYXRlKCkgewotCQlyZXR1cm4gY29uc3RyYWludERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uc3RyYWludERhdGUoT2JqZWN0IG5ld0NvbnN0cmFpbnREYXRlKSB7Ci0JCU9iamVjdCBvbGRDb25zdHJhaW50RGF0ZSA9IGNvbnN0cmFpbnREYXRlOwotCQljb25zdHJhaW50RGF0ZSA9IG5ld0NvbnN0cmFpbnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURSwgb2xkQ29uc3RyYWludERhdGUsIGNvbnN0cmFpbnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWFkbGluZSgpIHsKLQkJcmV0dXJuIGRlYWRsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlYWRsaW5lKE9iamVjdCBuZXdEZWFkbGluZSkgewotCQlPYmplY3Qgb2xkRGVhZGxpbmUgPSBkZWFkbGluZTsKLQkJZGVhZGxpbmUgPSBuZXdEZWFkbGluZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORSwgb2xkRGVhZGxpbmUsIGRlYWRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gbGV2ZWxBc3NpZ25tZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4gbmV3TGV2ZWxBc3NpZ25tZW50cykgewotCQlib29sZWFuIG9sZExldmVsQXNzaWdubWVudHMgPSBsZXZlbEFzc2lnbm1lbnRzOwotCQlsZXZlbEFzc2lnbm1lbnRzID0gbmV3TGV2ZWxBc3NpZ25tZW50czsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCA9IGxldmVsQXNzaWdubWVudHNFU2V0OwotCQlsZXZlbEFzc2lnbm1lbnRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMsIG9sZExldmVsQXNzaWdubWVudHMsIGxldmVsQXNzaWdubWVudHMsICFvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGV2ZWxBc3NpZ25tZW50cygpIHsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzID0gbGV2ZWxBc3NpZ25tZW50czsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCA9IGxldmVsQXNzaWdubWVudHNFU2V0OwotCQlsZXZlbEFzc2lnbm1lbnRzID0gTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQ7Ci0JCWxldmVsQXNzaWdubWVudHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUywgb2xkTGV2ZWxBc3NpZ25tZW50cywgTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQsIG9sZExldmVsQXNzaWdubWVudHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gbGV2ZWxBc3NpZ25tZW50c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZXZlbGluZ0NhblNwbGl0KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdDYW5TcGxpdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4gbmV3TGV2ZWxpbmdDYW5TcGxpdCkgewotCQlib29sZWFuIG9sZExldmVsaW5nQ2FuU3BsaXQgPSBsZXZlbGluZ0NhblNwbGl0OwotCQlsZXZlbGluZ0NhblNwbGl0ID0gbmV3TGV2ZWxpbmdDYW5TcGxpdDsKLQkJYm9vbGVhbiBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCA9IGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCQlsZXZlbGluZ0NhblNwbGl0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElULCBvbGRMZXZlbGluZ0NhblNwbGl0LCBsZXZlbGluZ0NhblNwbGl0LCAhb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExldmVsaW5nQ2FuU3BsaXQoKSB7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdCA9IGxldmVsaW5nQ2FuU3BsaXQ7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBsZXZlbGluZ0NhblNwbGl0RVNldDsKLQkJbGV2ZWxpbmdDYW5TcGxpdCA9IExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVDsKLQkJbGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVCwgb2xkTGV2ZWxpbmdDYW5TcGxpdCwgTEVWRUxJTkdfQ0FOX1NQTElUX0VERUZBVUxULCBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheSA9IGxldmVsaW5nRGVsYXk7Ci0JCWxldmVsaW5nRGVsYXkgPSBuZXdMZXZlbGluZ0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZLCBvbGRMZXZlbGluZ0RlbGF5LCBsZXZlbGluZ0RlbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXlGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJbGV2ZWxpbmdEZWxheUZvcm1hdCA9IG5ld0xldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFULCBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0LCBsZXZlbGluZ0RlbGF5Rm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcmVMZXZlbGVkU3RhcnQoKSB7Ci0JCXJldHVybiBwcmVMZXZlbGVkU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlTGV2ZWxlZFN0YXJ0KE9iamVjdCBuZXdQcmVMZXZlbGVkU3RhcnQpIHsKLQkJT2JqZWN0IG9sZFByZUxldmVsZWRTdGFydCA9IHByZUxldmVsZWRTdGFydDsKLQkJcHJlTGV2ZWxlZFN0YXJ0ID0gbmV3UHJlTGV2ZWxlZFN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJULCBvbGRQcmVMZXZlbGVkU3RhcnQsIHByZUxldmVsZWRTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIHsKLQkJcmV0dXJuIHByZUxldmVsZWRGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QgbmV3UHJlTGV2ZWxlZEZpbmlzaCkgewotCQlPYmplY3Qgb2xkUHJlTGV2ZWxlZEZpbmlzaCA9IHByZUxldmVsZWRGaW5pc2g7Ci0JCXByZUxldmVsZWRGaW5pc2ggPSBuZXdQcmVMZXZlbGVkRmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSCwgb2xkUHJlTGV2ZWxlZEZpbmlzaCwgcHJlTGV2ZWxlZEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGluayhTdHJpbmcgbmV3SHlwZXJsaW5rKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmsgPSBoeXBlcmxpbms7Ci0JCWh5cGVybGluayA9IG5ld0h5cGVybGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1MsIG9sZEh5cGVybGlua0FkZHJlc3MsIGh5cGVybGlua0FkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua1N1YkFkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua1N1YkFkZHJlc3MgPSBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCQloeXBlcmxpbmtTdWJBZGRyZXNzID0gbmV3SHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1MsIG9sZEh5cGVybGlua1N1YkFkZHJlc3MsIGh5cGVybGlua1N1YkFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbiBuZXdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKSB7Ci0JCWJvb2xlYW4gb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXI7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXIgPSBuZXdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCQlib29sZWFuIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXIsIGlnbm9yZVJlc291cmNlQ2FsZW5kYXIsICFvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0OwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSX0VERUZBVUxUOwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSLCBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyLCBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUywgb2xkTm90ZXMsIG5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlQmFyKCkgewotCQlyZXR1cm4gaGlkZUJhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIaWRlQmFyKGJvb2xlYW4gbmV3SGlkZUJhcikgewotCQlib29sZWFuIG9sZEhpZGVCYXIgPSBoaWRlQmFyOwotCQloaWRlQmFyID0gbmV3SGlkZUJhcjsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyRVNldCA9IGhpZGVCYXJFU2V0OwotCQloaWRlQmFyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVIsIG9sZEhpZGVCYXIsIGhpZGVCYXIsICFvbGRIaWRlQmFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SGlkZUJhcigpIHsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyID0gaGlkZUJhcjsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyRVNldCA9IGhpZGVCYXJFU2V0OwotCQloaWRlQmFyID0gSElERV9CQVJfRURFRkFVTFQ7Ci0JCWhpZGVCYXJFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUiwgb2xkSGlkZUJhciwgSElERV9CQVJfRURFRkFVTFQsIG9sZEhpZGVCYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRIaWRlQmFyKCkgewotCQlyZXR1cm4gaGlkZUJhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsdXAoKSB7Ci0JCXJldHVybiByb2xsdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbHVwKGJvb2xlYW4gbmV3Um9sbHVwKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwID0gcm9sbHVwOwotCQlyb2xsdXAgPSBuZXdSb2xsdXA7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwRVNldCA9IHJvbGx1cEVTZXQ7Ci0JCXJvbGx1cEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUCwgb2xkUm9sbHVwLCByb2xsdXAsICFvbGRSb2xsdXBFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSb2xsdXAoKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwID0gcm9sbHVwOwotCQlib29sZWFuIG9sZFJvbGx1cEVTZXQgPSByb2xsdXBFU2V0OwotCQlyb2xsdXAgPSBST0xMVVBfRURFRkFVTFQ7Ci0JCXJvbGx1cEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUCwgb2xkUm9sbHVwLCBST0xMVVBfRURFRkFVTFQsIG9sZFJvbGx1cEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJvbGx1cCgpIHsKLQkJcmV0dXJuIHJvbGx1cEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGh5c2ljYWxQZXJjZW50Q29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCQlwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IG5ld1BoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEUsIG9sZFBoeXNpY2FsUGVyY2VudENvbXBsZXRlLCBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCkgewotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciBuZXdFYXJuZWRWYWx1ZU1ldGhvZCkgewotCQlCaWdJbnRlZ2VyIG9sZEVhcm5lZFZhbHVlTWV0aG9kID0gZWFybmVkVmFsdWVNZXRob2Q7Ci0JCWVhcm5lZFZhbHVlTWV0aG9kID0gbmV3RWFybmVkVmFsdWVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRCwgb2xkRWFybmVkVmFsdWVNZXRob2QsIGVhcm5lZFZhbHVlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFByZWRlY2Vzc29yTGluaygpIHsKLQkJaWYgKHByZWRlY2Vzc29yTGluayA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvckxpbmsgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUHJlZGVjZXNzb3JMaW5rLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTkspOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3Nvckxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkID0gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZWRlY2Vzc29yTGluaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJhc2VsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE91dGxpbmVDb2RlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lEOgotCQkJCXJldHVybiBnZXRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlyZXR1cm4gaXNJc051bGwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0ZURhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXJldHVybiBnZXRDb250YWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXJldHVybiBnZXRXQlMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUw6Ci0JCQkJcmV0dXJuIGdldFdCU0xldmVsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVOdW1iZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXJldHVybiBnZXRPdXRsaW5lTGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWToKLQkJCQlyZXR1cm4gZ2V0UHJpb3JpdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXREdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RPUDoKLQkJCQlyZXR1cm4gZ2V0U3RvcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlyZXR1cm4gZ2V0UmVzdW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXJldHVybiBpc1Jlc3VtZVZhbGlkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzRWZmb3J0RHJpdmVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORzoKLQkJCQlyZXR1cm4gaXNSZWN1cnJpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlckFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzRXN0aW1hdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNNaWxlc3RvbmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTdW1tYXJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXJldHVybiBpc0NyaXRpY2FsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzSXNTdWJwcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXJldHVybiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U3VicHJvamVjdE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLOgotCQkJCXJldHVybiBpc0V4dGVybmFsVGFzaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsVGFza1Byb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0RWFybHlTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RWFybHlGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXJldHVybiBnZXRMYXRlU3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0TGF0ZUZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRTdGFydFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRXb3JrVmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRlJFRV9TTEFDSzoKLQkJCQlyZXR1cm4gZ2V0RnJlZVNsYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJcmV0dXJuIGdldFRvdGFsU2xhY2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Rml4ZWRDb3N0KCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsRmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXRBY3R1YWxEdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0R1cmF0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEFDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRDVigpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENvbnN0cmFpbnRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlyZXR1cm4gZ2V0Q29uc3RyYWludERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlyZXR1cm4gZ2V0RGVhZGxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gaXNMZXZlbEFzc2lnbm1lbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlyZXR1cm4gaXNMZXZlbGluZ0NhblNwbGl0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZOgotCQkJCXJldHVybiBnZXRMZXZlbGluZ0RlbGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFByZUxldmVsZWRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm90ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlyZXR1cm4gaXNIaWRlQmFyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUDoKLQkJCQlyZXR1cm4gaXNSb2xsdXAoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXJldHVybiBnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yTGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCXJldHVybiBnZXRCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlzZXRJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlzZXRJc051bGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXNldENyZWF0ZURhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJc2V0Q29udGFjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXNldFdCUygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXNldFdCU0xldmVsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX05VTUJFUjoKLQkJCQlzZXRPdXRsaW5lTnVtYmVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXNldE91dGxpbmVMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXNldFByaW9yaXR5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXNldER1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJc2V0U3RvcCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FOgotCQkJCXNldFJlc3VtZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXNldFJlc3VtZVZhbGlkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOOgotCQkJCXNldEVmZm9ydERyaXZlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXNldFJlY3VycmluZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlckFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVEOgotCQkJCXNldEVzdGltYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXNldE1pbGVzdG9uZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlzZXRTdW1tYXJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTDoKLQkJCQlzZXRDcml0aWNhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlzZXRJc1N1YnByb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXNldElzU3VicHJvamVjdFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUU6Ci0JCQkJc2V0U3VicHJvamVjdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJc2V0RWFybHlTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNIOgotCQkJCXNldEVhcmx5RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXNldExhdGVTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJc2V0TGF0ZUZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZSRUVfU0xBQ0s6Ci0JCQkJc2V0RnJlZVNsYWNrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJc2V0VG90YWxTbGFjaygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJc2V0Rml4ZWRDb3N0KCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXRGaXhlZENvc3RBY2NydWFsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRDb21wbGV0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRklOSVNIOgotCQkJCXNldEFjdHVhbEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXNldEFjdHVhbER1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19EVVJBVElPTjoKLQkJCQlzZXRSZW1haW5pbmdEdXJhdGlvbigoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlzZXRBQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlzZXRDb25zdHJhaW50VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlzZXRDb25zdHJhaW50RGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fREVBRExJTkU6Ci0JCQkJc2V0RGVhZGxpbmUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTOgotCQkJCXNldExldmVsQXNzaWdubWVudHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlzZXRMZXZlbGluZ0NhblNwbGl0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9TVEFSVDoKLQkJCQlzZXRQcmVMZXZlbGVkU3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlzZXRQcmVMZXZlbGVkRmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rU3ViQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSOgotCQkJCXNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlzZXRIaWRlQmFyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJc2V0Um9sbHVwKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTOgotCQkJCXNldEJDV1MoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXNldEVhcm5lZFZhbHVlTWV0aG9kKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlnZXRQcmVkZWNlc3NvckxpbmsoKS5jbGVhcigpOwotCQkJCWdldFByZWRlY2Vzc29yTGluaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEJhc2VsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMOgotCQkJCXVuc2V0SXNOdWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXNldENyZWF0ZURhdGUoQ1JFQVRFX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXNldENvbnRhY3QoQ09OVEFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCUzoKLQkJCQlzZXRXQlMoV0JTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXNldFdCU0xldmVsKFdCU19MRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXNldE91dGxpbmVOdW1iZXIoT1VUTElORV9OVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXNldE91dGxpbmVMZXZlbChPVVRMSU5FX0xFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJJT1JJVFk6Ci0JCQkJc2V0UHJpb3JpdHkoUFJJT1JJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVE9QOgotCQkJCXNldFN0b3AoU1RPUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoUkVTVU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXVuc2V0UmVzdW1lVmFsaWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTjoKLQkJCQl1bnNldEVmZm9ydERyaXZlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkc6Ci0JCQkJdW5zZXRSZWN1cnJpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRDoKLQkJCQl1bnNldEVzdGltYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkU6Ci0JCQkJdW5zZXRNaWxlc3RvbmUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQl1bnNldFN1bW1hcnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUw6Ci0JCQkJdW5zZXRDcml0aWNhbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUOgotCQkJCXVuc2V0SXNTdWJwcm9qZWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXVuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VCUFJPSkVDVF9OQU1FOgotCQkJCXNldFN1YnByb2plY3ROYW1lKFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJdW5zZXRFeHRlcm5hbFRhc2soKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXNldEV4dGVybmFsVGFza1Byb2plY3QoRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJc2V0RWFybHlTdGFydChFQVJMWV9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlzZXRFYXJseUZpbmlzaChFQVJMWV9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXNldExhdGVTdGFydChMQVRFX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJc2V0TGF0ZUZpbmlzaChMQVRFX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJc2V0RmluaXNoVmFyaWFuY2UoRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQl1bnNldFdvcmtWYXJpYW5jZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXNldEZyZWVTbGFjayhGUkVFX1NMQUNLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJc2V0VG90YWxTbGFjayhUT1RBTF9TTEFDS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJdW5zZXRGaXhlZENvc3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXNldEZpeGVkQ29zdEFjY3J1YWwoRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRQZXJjZW50Q29tcGxldGUoUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoQUNUVUFMX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goQUNUVUFMX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTjoKLQkJCQlzZXRBY3R1YWxEdXJhdGlvbihBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yayhBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yayhSRUdVTEFSX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJc2V0UmVtYWluaW5nRHVyYXRpb24oUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdChSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoUkVNQUlOSU5HX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQOgotCQkJCXVuc2V0QUNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlzZXRDb25zdHJhaW50VHlwZShDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9EQVRFOgotCQkJCXNldENvbnN0cmFpbnREYXRlKENPTlNUUkFJTlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RFQURMSU5FOgotCQkJCXNldERlYWRsaW5lKERFQURMSU5FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFM6Ci0JCQkJdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQl1bnNldExldmVsaW5nQ2FuU3BsaXQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheShMRVZFTElOR19ERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXNldFByZUxldmVsZWRTdGFydChQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlzZXRQcmVMZXZlbGVkRmluaXNoKFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcyhIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUjoKLQkJCQl1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoTk9URVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQl1bnNldEhpZGVCYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQOgotCQkJCXVuc2V0Um9sbHVwKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJZ2V0UHJlZGVjZXNzb3JMaW5rKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNOdWxsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJcmV0dXJuIENSRUFURV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGVEYXRlICE9IG51bGwgOiAhQ1JFQVRFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNyZWF0ZURhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJcmV0dXJuIENPTlRBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRhY3QgIT0gbnVsbCA6ICFDT05UQUNUX0VERUZBVUxULmVxdWFscyhjb250YWN0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlM6Ci0JCQkJcmV0dXJuIFdCU19FREVGQVVMVCA9PSBudWxsID8gd0JTICE9IG51bGwgOiAhV0JTX0VERUZBVUxULmVxdWFscyh3QlMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCU19MRVZFTDoKLQkJCQlyZXR1cm4gV0JTX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyB3QlNMZXZlbCAhPSBudWxsIDogIVdCU19MRVZFTF9FREVGQVVMVC5lcXVhbHMod0JTTGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXJldHVybiBPVVRMSU5FX05VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gb3V0bGluZU51bWJlciAhPSBudWxsIDogIU9VVExJTkVfTlVNQkVSX0VERUZBVUxULmVxdWFscyhvdXRsaW5lTnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXJldHVybiBPVVRMSU5FX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyBvdXRsaW5lTGV2ZWwgIT0gbnVsbCA6ICFPVVRMSU5FX0xFVkVMX0VERUZBVUxULmVxdWFscyhvdXRsaW5lTGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXJldHVybiBQUklPUklUWV9FREVGQVVMVCA9PSBudWxsID8gcHJpb3JpdHkgIT0gbnVsbCA6ICFQUklPUklUWV9FREVGQVVMVC5lcXVhbHMocHJpb3JpdHkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbiAhPSBudWxsIDogIURVUkFUSU9OX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJcmV0dXJuIFNUT1BfRURFRkFVTFQgPT0gbnVsbCA/IHN0b3AgIT0gbnVsbCA6ICFTVE9QX0VERUZBVUxULmVxdWFscyhzdG9wKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUU6Ci0JCQkJcmV0dXJuIFJFU1VNRV9FREVGQVVMVCA9PSBudWxsID8gcmVzdW1lICE9IG51bGwgOiAhUkVTVU1FX0VERUZBVUxULmVxdWFscyhyZXN1bWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRDoKLQkJCQlyZXR1cm4gaXNTZXRSZXN1bWVWYWxpZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzU2V0RWZmb3J0RHJpdmVuKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXJldHVybiBpc1NldFJlY3VycmluZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXN0aW1hdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXJldHVybiBpc1NldE1pbGVzdG9uZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlk6Ci0JCQkJcmV0dXJuIGlzU2V0U3VtbWFyeSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXJldHVybiBpc1NldENyaXRpY2FsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNTZXRJc1N1YnByb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWToKLQkJCQlyZXR1cm4gaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gU1VCUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzdWJwcm9qZWN0TmFtZSAhPSBudWxsIDogIVNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMoc3VicHJvamVjdE5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJcmV0dXJuIGlzU2V0RXh0ZXJuYWxUYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXJldHVybiBFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsVGFza1Byb2plY3QgIT0gbnVsbCA6ICFFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsVGFza1Byb2plY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX1NUQVJUOgotCQkJCXJldHVybiBFQVJMWV9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gZWFybHlTdGFydCAhPSBudWxsIDogIUVBUkxZX1NUQVJUX0VERUZBVUxULmVxdWFscyhlYXJseVN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9GSU5JU0g6Ci0JCQkJcmV0dXJuIEVBUkxZX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZWFybHlGaW5pc2ggIT0gbnVsbCA6ICFFQVJMWV9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGVhcmx5RmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXJldHVybiBMQVRFX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBsYXRlU3RhcnQgIT0gbnVsbCA6ICFMQVRFX1NUQVJUX0VERUZBVUxULmVxdWFscyhsYXRlU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfRklOSVNIOgotCQkJCXJldHVybiBMQVRFX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gbGF0ZUZpbmlzaCAhPSBudWxsIDogIUxBVEVfRklOSVNIX0VERUZBVUxULmVxdWFscyhsYXRlRmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0VmFyaWFuY2UgIT0gbnVsbCA6ICFTVEFSVF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaFZhcmlhbmNlICE9IG51bGwgOiAhRklOSVNIX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhmaW5pc2hWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXJldHVybiBGUkVFX1NMQUNLX0VERUZBVUxUID09IG51bGwgPyBmcmVlU2xhY2sgIT0gbnVsbCA6ICFGUkVFX1NMQUNLX0VERUZBVUxULmVxdWFscyhmcmVlU2xhY2spOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLOgotCQkJCXJldHVybiBUT1RBTF9TTEFDS19FREVGQVVMVCA9PSBudWxsID8gdG90YWxTbGFjayAhPSBudWxsIDogIVRPVEFMX1NMQUNLX0VERUZBVUxULmVxdWFscyh0b3RhbFNsYWNrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXJldHVybiBpc1NldEZpeGVkQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID09IG51bGwgPyBmaXhlZENvc3RBY2NydWFsICE9IG51bGwgOiAhRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxULmVxdWFscyhmaXhlZENvc3RBY2NydWFsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50Q29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50Q29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50V29ya0NvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBPVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVdvcmsgIT0gbnVsbCA6ICFPVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhvdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9TVEFSVDoKLQkJCQlyZXR1cm4gQUNUVUFMX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxTdGFydCAhPSBudWxsIDogIUFDVFVBTF9TVEFSVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIEFDVFVBTF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbEZpbmlzaCAhPSBudWxsIDogIUFDVFVBTF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGFjdHVhbEZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXJldHVybiBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbER1cmF0aW9uICE9IG51bGwgOiAhQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxULmVxdWFscyhhY3R1YWxEdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxDb3N0ICE9IG51bGwgOiAhQUNUVUFMX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbENvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrICE9IG51bGwgOiAhQUNUVUFMX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBSRUdVTEFSX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlZ3VsYXJXb3JrICE9IG51bGwgOiAhUkVHVUxBUl9XT1JLX0VERUZBVUxULmVxdWFscyhyZWd1bGFyV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OOgotCQkJCXJldHVybiBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0R1cmF0aW9uICE9IG51bGwgOiAhUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdEdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nV29yayAhPSBudWxsIDogIVJFTUFJTklOR19XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlyZXR1cm4gaXNTZXRBQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJcmV0dXJuIGlzU2V0Q1YoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJcmV0dXJuIENPTlNUUkFJTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gY29uc3RyYWludFR5cGUgIT0gbnVsbCA6ICFDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGNvbnN0cmFpbnRUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIENBTEVOREFSX1VJRF9FREVGQVVMVCA9PSBudWxsID8gY2FsZW5kYXJVSUQgIT0gbnVsbCA6ICFDQUxFTkRBUl9VSURfRURFRkFVTFQuZXF1YWxzKGNhbGVuZGFyVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX0RBVEU6Ci0JCQkJcmV0dXJuIENPTlNUUkFJTlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gY29uc3RyYWludERhdGUgIT0gbnVsbCA6ICFDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNvbnN0cmFpbnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlyZXR1cm4gREVBRExJTkVfRURFRkFVTFQgPT0gbnVsbCA/IGRlYWRsaW5lICE9IG51bGwgOiAhREVBRExJTkVfRURFRkFVTFQuZXF1YWxzKGRlYWRsaW5lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElUOgotCQkJCXJldHVybiBpc1NldExldmVsaW5nQ2FuU3BsaXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXkgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9FREVGQVVMVC5lcXVhbHMobGV2ZWxpbmdEZWxheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXlGb3JtYXQgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXJldHVybiBQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gcHJlTGV2ZWxlZFN0YXJ0ICE9IG51bGwgOiAhUFJFX0xFVkVMRURfU1RBUlRfRURFRkFVTFQuZXF1YWxzKHByZUxldmVsZWRTdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfRklOSVNIOgotCQkJCXJldHVybiBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IHByZUxldmVsZWRGaW5pc2ggIT0gbnVsbCA6ICFQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKHByZUxldmVsZWRGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmsgIT0gbnVsbCA6ICFIWVBFUkxJTktfRURFRkFVTFQuZXF1YWxzKGh5cGVybGluayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua0FkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtTdWJBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSOgotCQkJCXJldHVybiBpc1NldEhpZGVCYXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJcmV0dXJuIGlzU2V0Um9sbHVwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gcGh5c2ljYWxQZXJjZW50Q29tcGxldGUgIT0gbnVsbCA6ICFQSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gZWFybmVkVmFsdWVNZXRob2QgIT0gbnVsbCA6ICFFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxULmVxdWFscyhlYXJuZWRWYWx1ZU1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rICE9IG51bGwgJiYgIXByZWRlY2Vzc29yTGluay5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZSAhPSBudWxsICYmICFleHRlbmRlZEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGJhc2VsaW5lICE9IG51bGwgJiYgIWJhc2VsaW5lLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIG91dGxpbmVDb2RlICE9IG51bGwgJiYgIW91dGxpbmVDb2RlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzTnVsbDogIik7Ci0JCWlmIChpc051bGxFU2V0KSByZXN1bHQuYXBwZW5kKGlzTnVsbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWF0ZURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0ZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnRhY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnRhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdCUzogIik7Ci0JCXJlc3VsdC5hcHBlbmQod0JTKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3QlNMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod0JTTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG91dGxpbmVOdW1iZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG91dGxpbmVOdW1iZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG91dGxpbmVMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3V0bGluZUxldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmlvcml0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJpb3JpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdG9wOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdG9wKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3VtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lVmFsaWQ6ICIpOwotCQlpZiAocmVzdW1lVmFsaWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3VtZVZhbGlkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWZmb3J0RHJpdmVuOiAiKTsKLQkJaWYgKGVmZm9ydERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQoZWZmb3J0RHJpdmVuKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVjdXJyaW5nOiAiKTsKLQkJaWYgKHJlY3VycmluZ0VTZXQpIHJlc3VsdC5hcHBlbmQocmVjdXJyaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlckFsbG9jYXRlZDogIik7Ci0JCWlmIChvdmVyQWxsb2NhdGVkRVNldCkgcmVzdWx0LmFwcGVuZChvdmVyQWxsb2NhdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGVkOiAiKTsKLQkJaWYgKGVzdGltYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQoZXN0aW1hdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWlsZXN0b25lOiAiKTsKLQkJaWYgKG1pbGVzdG9uZUVTZXQpIHJlc3VsdC5hcHBlbmQobWlsZXN0b25lKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VtbWFyeTogIik7Ci0JCWlmIChzdW1tYXJ5RVNldCkgcmVzdWx0LmFwcGVuZChzdW1tYXJ5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JpdGljYWw6ICIpOwotCQlpZiAoY3JpdGljYWxFU2V0KSByZXN1bHQuYXBwZW5kKGNyaXRpY2FsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTdWJwcm9qZWN0OiAiKTsKLQkJaWYgKGlzU3VicHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTdWJwcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTdWJwcm9qZWN0UmVhZE9ubHk6ICIpOwotCQlpZiAoaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0KSByZXN1bHQuYXBwZW5kKGlzU3VicHJvamVjdFJlYWRPbmx5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VicHJvamVjdE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YnByb2plY3ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbFRhc2s6ICIpOwotCQlpZiAoZXh0ZXJuYWxUYXNrRVNldCkgcmVzdWx0LmFwcGVuZChleHRlcm5hbFRhc2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbFRhc2tQcm9qZWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbFRhc2tQcm9qZWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJseVN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlYXJseVN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJseUZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybHlGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhdGVTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGF0ZVN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXRlRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXRlRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydFZhcmlhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydFZhcmlhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoVmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtWYXJpYW5jZTogIik7Ci0JCWlmICh3b3JrVmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKHdvcmtWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZyZWVTbGFjazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJlZVNsYWNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0b3RhbFNsYWNrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b3RhbFNsYWNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZENvc3Q6ICIpOwotCQlpZiAoZml4ZWRDb3N0RVNldCkgcmVzdWx0LmFwcGVuZChmaXhlZENvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZENvc3RBY2NydWFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaXhlZENvc3RBY2NydWFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJjZW50Q29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsU3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbEZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxEdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsRHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbENvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbENvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVndWxhcldvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZ3VsYXJXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdEdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nRHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYUNXUDogIik7Ci0JCWlmIChhQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChhQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY1Y6ICIpOwotCQlpZiAoY1ZFU2V0KSByZXN1bHQuYXBwZW5kKGNWKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RyYWludFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnN0cmFpbnRUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnN0cmFpbnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb25zdHJhaW50RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVhZGxpbmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlYWRsaW5lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbEFzc2lnbm1lbnRzOiAiKTsKLQkJaWYgKGxldmVsQXNzaWdubWVudHNFU2V0KSByZXN1bHQuYXBwZW5kKGxldmVsQXNzaWdubWVudHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0NhblNwbGl0OiAiKTsKLQkJaWYgKGxldmVsaW5nQ2FuU3BsaXRFU2V0KSByZXN1bHQuYXBwZW5kKGxldmVsaW5nQ2FuU3BsaXQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5Rm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVMZXZlbGVkU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZUxldmVsZWRTdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlTGV2ZWxlZEZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlTGV2ZWxlZEZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlnbm9yZVJlc291cmNlQ2FsZW5kYXI6ICIpOwotCQlpZiAoaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQpIHJlc3VsdC5hcHBlbmQoaWdub3JlUmVzb3VyY2VDYWxlbmRhcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGlkZUJhcjogIik7Ci0JCWlmIChoaWRlQmFyRVNldCkgcmVzdWx0LmFwcGVuZChoaWRlQmFyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sbHVwOiAiKTsKLQkJaWYgKHJvbGx1cEVTZXQpIHJlc3VsdC5hcHBlbmQocm9sbHVwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGh5c2ljYWxQZXJjZW50Q29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBoeXNpY2FsUGVyY2VudENvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJuZWRWYWx1ZU1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybmVkVmFsdWVNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmNWVlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tzSW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza3NJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXNrcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YXNrID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYXNrKCkgewotCQlpZiAodGFzayA9PSBudWxsKSB7Ci0JCQl0YXNrID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRhc2suY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS1NfX1RBU0spOwotCQl9Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQlnZXRUYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRUYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCXJldHVybiB0YXNrICE9IG51bGwgJiYgIXRhc2suaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9UYXNrc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UaW1lUGVyaW9kSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTcxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lUGVyaW9kSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVQZXJpb2RJbXBsI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbCNnZXRUb0RhdGUgPGVtPlRvIERhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lUGVyaW9kSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVGltZVBlcmlvZCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb21EYXRlKCkgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJvbURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZST01fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tRGF0ZSgpIDxlbT5Gcm9tIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZyb21EYXRlID0gRlJPTV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvRGF0ZSgpIDxlbT5UbyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFRPX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9EYXRlKCkgPGVtPlRvIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB0b0RhdGUgPSBUT19EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRpbWVQZXJpb2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGltZVBlcmlvZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RnJvbURhdGUoKSB7Ci0JCXJldHVybiBmcm9tRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tRGF0ZShPYmplY3QgbmV3RnJvbURhdGUpIHsKLQkJT2JqZWN0IG9sZEZyb21EYXRlID0gZnJvbURhdGU7Ci0JCWZyb21EYXRlID0gbmV3RnJvbURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURSwgb2xkRnJvbURhdGUsIGZyb21EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb0RhdGUoKSB7Ci0JCXJldHVybiB0b0RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9EYXRlKE9iamVjdCBuZXdUb0RhdGUpIHsKLQkJT2JqZWN0IG9sZFRvRGF0ZSA9IHRvRGF0ZTsKLQkJdG9EYXRlID0gbmV3VG9EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFLCBvbGRUb0RhdGUsIHRvRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXJldHVybiBnZXRGcm9tRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXJldHVybiBnZXRUb0RhdGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlzZXRGcm9tRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEU6Ci0JCQkJc2V0VG9EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlzZXRGcm9tRGF0ZShGUk9NX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fVE9fREFURToKLQkJCQlzZXRUb0RhdGUoVE9fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlyZXR1cm4gRlJPTV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmcm9tRGF0ZSAhPSBudWxsIDogIUZST01fREFURV9FREVGQVVMVC5lcXVhbHMoZnJvbURhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXJldHVybiBUT19EQVRFX0VERUZBVUxUID09IG51bGwgPyB0b0RhdGUgIT0gbnVsbCA6ICFUT19EQVRFX0VERUZBVUxULmVxdWFscyh0b0RhdGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZnJvbURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZyb21EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0b0RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRvRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RpbWVQZXJpb2RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVwaGFzZWREYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyYTBjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRVbml0IDxlbT5Vbml0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUaW1lcGhhc2VkRGF0YVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0KCkgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVTklUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXQoKSA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdW5pdCA9IFVOSVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGltZXBoYXNlZERhdGFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKE9iamVjdCBuZXdGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0gsIG9sZEZpbmlzaCwgZmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VW5pdCgpIHsKLQkJcmV0dXJuIHVuaXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pdChCaWdJbnRlZ2VyIG5ld1VuaXQpIHsKLQkJQmlnSW50ZWdlciBvbGRVbml0ID0gdW5pdDsKLQkJdW5pdCA9IG5ld1VuaXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQsIG9sZFVuaXQsIHVuaXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUOgotCQkJCXJldHVybiBnZXRVbml0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlzZXRVbml0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQ6Ci0JCQkJc2V0VW5pdChVTklUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlyZXR1cm4gVU5JVF9FREVGQVVMVCA9PSBudWxsID8gdW5pdCAhPSBudWxsIDogIVVOSVRfRURFRkFVTFQuZXF1YWxzKHVuaXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1bml0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1bml0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UaW1lcGhhc2VkRGF0YVR5cGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5NDQ5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWUySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWUySW1wbCNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBpRCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBpRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChCaWdJbnRlZ2VyIG5ld0lEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkSUQgPSBpRDsKLQkJaUQgPSBuZXdJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lEOgotCQkJCXNldElEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJc2V0SUQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWUySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGUxZGVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudFZhbHVlSUQoKSA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudFZhbHVlSUQoKSA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwYXJlbnRWYWx1ZUlEID0gUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBhcmVudFZhbHVlSUQoKSB7Ci0JCXJldHVybiBwYXJlbnRWYWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudFZhbHVlSUQoQmlnSW50ZWdlciBuZXdQYXJlbnRWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGFyZW50VmFsdWVJRCA9IHBhcmVudFZhbHVlSUQ7Ci0JCXBhcmVudFZhbHVlSUQgPSBuZXdQYXJlbnRWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQsIG9sZFBhcmVudFZhbHVlSUQsIHBhcmVudFZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRQYXJlbnRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXNldFBhcmVudFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1BBUkVOVF9WQUxVRV9JRDoKLQkJCQlzZXRQYXJlbnRWYWx1ZUlEKFBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXJldHVybiBQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmVudFZhbHVlSUQgIT0gbnVsbCA6ICFQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHBhcmVudFZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJlbnRWYWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJlbnRWYWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTc3ZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlTGlzdEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWx1ZUxpc3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChWYWx1ZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUUpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VmFsdWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRToKLQkJCQlnZXRWYWx1ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsdWUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1ZhbHVlTGlzdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGU4NTI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFZhbHVlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVzX1ZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRWYWx1ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCWdldFZhbHVlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCWdldFZhbHVlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQlyZXR1cm4gIWdldFZhbHVlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWVzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dCU01hc2tJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1YWEwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2tJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdCU01hc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXQlNNYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbCA9IExFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFTkdUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGVuZ3RoID0gTEVOR1RIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcGFyYXRvcigpIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcGFyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcGFyYXRvcigpIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcGFyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXBhcmF0b3IgPSBTRVBBUkFUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV0JTTWFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXQlNNYXNrKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbChCaWdJbnRlZ2VyIG5ld0xldmVsKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWwgPSBsZXZlbDsKLQkJbGV2ZWwgPSBuZXdMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUwsIG9sZExldmVsLCBsZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKFN0cmluZyBuZXdMZW5ndGgpIHsKLQkJU3RyaW5nIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEgsIG9sZExlbmd0aCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiBzZXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyBuZXdTZXBhcmF0b3IpIHsKLQkJU3RyaW5nIG9sZFNlcGFyYXRvciA9IHNlcGFyYXRvcjsKLQkJc2VwYXJhdG9yID0gbmV3U2VwYXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1IsIG9sZFNlcGFyYXRvciwgc2VwYXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIGdldExlbmd0aCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFVkVMOgotCQkJCXNldExldmVsKExFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUjoKLQkJCQlzZXRTZXBhcmF0b3IoU0VQQVJBVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJcmV0dXJuIExFVkVMX0VERUZBVUxUID09IG51bGwgPyBsZXZlbCAhPSBudWxsIDogIUxFVkVMX0VERUZBVUxULmVxdWFscyhsZXZlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RIOgotCQkJCXJldHVybiBMRU5HVEhfRURFRkFVTFQgPT0gbnVsbCA/IGxlbmd0aCAhPSBudWxsIDogIUxFTkdUSF9FREVGQVVMVC5lcXVhbHMobGVuZ3RoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fU0VQQVJBVE9SOgotCQkJCXJldHVybiBTRVBBUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IHNlcGFyYXRvciAhPSBudWxsIDogIVNFUEFSQVRPUl9FREVGQVVMVC5lcXVhbHMoc2VwYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGVuZ3RoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZW5ndGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcGFyYXRvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV0JTTWFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmZDcxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXQlNNYXNrc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNnZXRXQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdCU01hc2tzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV0JTTWFza3MgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZlcmlmeVVuaXF1ZUNvZGVzID0gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyaWZ5IFVuaXF1ZSBDb2RlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNvZGVzKCkgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9DT0RFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNvZGVzKCkgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ29kZXMgPSBHRU5FUkFURV9DT0RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgR2VuZXJhdGUgQ29kZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ29kZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU01hc2soKSA8ZW0+V0JTIE1hc2s8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdCU01hc2sgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdCU01hc2tzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdCU01hc2tzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJpZnlVbmlxdWVDb2RlcygpIHsKLQkJcmV0dXJuIHZlcmlmeVVuaXF1ZUNvZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4gbmV3VmVyaWZ5VW5pcXVlQ29kZXMpIHsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2RlcyA9IHZlcmlmeVVuaXF1ZUNvZGVzOwotCQl2ZXJpZnlVbmlxdWVDb2RlcyA9IG5ld1ZlcmlmeVVuaXF1ZUNvZGVzOwotCQlib29sZWFuIG9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCA9IHZlcmlmeVVuaXF1ZUNvZGVzRVNldDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzLCB2ZXJpZnlVbmlxdWVDb2RlcywgIW9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0JCWJvb2xlYW4gb2xkVmVyaWZ5VW5pcXVlQ29kZXMgPSB2ZXJpZnlVbmlxdWVDb2RlczsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQgPSB2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQ7Ci0JCXZlcmlmeVVuaXF1ZUNvZGVzID0gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzLCBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxULCBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkgewotCQlyZXR1cm4gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVDb2RlcygpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuIG5ld0dlbmVyYXRlQ29kZXMpIHsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzID0gZ2VuZXJhdGVDb2RlczsKLQkJZ2VuZXJhdGVDb2RlcyA9IG5ld0dlbmVyYXRlQ29kZXM7Ci0JCWJvb2xlYW4gb2xkR2VuZXJhdGVDb2Rlc0VTZXQgPSBnZW5lcmF0ZUNvZGVzRVNldDsKLQkJZ2VuZXJhdGVDb2Rlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVMsIG9sZEdlbmVyYXRlQ29kZXMsIGdlbmVyYXRlQ29kZXMsICFvbGRHZW5lcmF0ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0R2VuZXJhdGVDb2RlcygpIHsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzID0gZ2VuZXJhdGVDb2RlczsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzRVNldCA9IGdlbmVyYXRlQ29kZXNFU2V0OwotCQlnZW5lcmF0ZUNvZGVzID0gR0VORVJBVEVfQ09ERVNfRURFRkFVTFQ7Ci0JCWdlbmVyYXRlQ29kZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTLCBvbGRHZW5lcmF0ZUNvZGVzLCBHRU5FUkFURV9DT0RFU19FREVGQVVMVCwgb2xkR2VuZXJhdGVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEdlbmVyYXRlQ29kZXMoKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUNvZGVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkgewotCQlTdHJpbmcgb2xkUHJlZml4ID0gcHJlZml4OwotCQlwcmVmaXggPSBuZXdQcmVmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19QUkVGSVgsIG9sZFByZWZpeCwgcHJlZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdCU01hc2soKSB7Ci0JCWlmICh3QlNNYXNrID09IG51bGwpIHsKLQkJCXdCU01hc2sgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV0JTTWFzay5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLKTsKLQkJfQotCQlyZXR1cm4gd0JTTWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXQlNNYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzVmVyaWZ5VW5pcXVlQ29kZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlyZXR1cm4gaXNHZW5lcmF0ZUNvZGVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fUFJFRklYOgotCQkJCXJldHVybiBnZXRQcmVmaXgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLOgotCQkJCXJldHVybiBnZXRXQlNNYXNrKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUzoKLQkJCQlzZXRWZXJpZnlVbmlxdWVDb2RlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlzZXRHZW5lcmF0ZUNvZGVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0s6Ci0JCQkJZ2V0V0JTTWFzaygpLmNsZWFyKCk7Ci0JCQkJZ2V0V0JTTWFzaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXVuc2V0R2VuZXJhdGVDb2RlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlnZXRXQlNNYXNrKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXJldHVybiBpc1NldEdlbmVyYXRlQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlyZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQuZXF1YWxzKHByZWZpeCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlyZXR1cm4gd0JTTWFzayAhPSBudWxsICYmICF3QlNNYXNrLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcmlmeVVuaXF1ZUNvZGVzOiAiKTsKLQkJaWYgKHZlcmlmeVVuaXF1ZUNvZGVzRVNldCkgcmVzdWx0LmFwcGVuZCh2ZXJpZnlVbmlxdWVDb2Rlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlQ29kZXM6ICIpOwotCQlpZiAoZ2VuZXJhdGVDb2Rlc0VTZXQpIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVDb2Rlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV0JTTWFza3NJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U0OWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2Vla0RheUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWVrIERheTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsI2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsI2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vla0RheUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlZWtEYXkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlUeXBlKCkgPGVtPkRheSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREFZX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5VHlwZSgpIDxlbT5EYXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGF5VHlwZSA9IERBWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF5V29ya2luZygpIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREFZX1dPUktJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF5V29ya2luZygpIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXlXb3JraW5nID0gREFZX1dPUktJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERheSBXb3JraW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXlXb3JraW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZVBlcmlvZCgpIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRpbWVQZXJpb2QgdGltZVBlcmlvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nVGltZXMoKSA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVzIHdvcmtpbmdUaW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vla0RheUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWVrRGF5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGF5VHlwZSgpIHsKLQkJcmV0dXJuIGRheVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF5VHlwZShCaWdJbnRlZ2VyIG5ld0RheVR5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGREYXlUeXBlID0gZGF5VHlwZTsKLQkJZGF5VHlwZSA9IG5ld0RheVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFLCBvbGREYXlUeXBlLCBkYXlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEYXlXb3JraW5nKCkgewotCQlyZXR1cm4gZGF5V29ya2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXlXb3JraW5nKGJvb2xlYW4gbmV3RGF5V29ya2luZykgewotCQlib29sZWFuIG9sZERheVdvcmtpbmcgPSBkYXlXb3JraW5nOwotCQlkYXlXb3JraW5nID0gbmV3RGF5V29ya2luZzsKLQkJYm9vbGVhbiBvbGREYXlXb3JraW5nRVNldCA9IGRheVdvcmtpbmdFU2V0OwotCQlkYXlXb3JraW5nRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HLCBvbGREYXlXb3JraW5nLCBkYXlXb3JraW5nLCAhb2xkRGF5V29ya2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERheVdvcmtpbmcoKSB7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZyA9IGRheVdvcmtpbmc7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZ0VTZXQgPSBkYXlXb3JraW5nRVNldDsKLQkJZGF5V29ya2luZyA9IERBWV9XT1JLSU5HX0VERUZBVUxUOwotCQlkYXlXb3JraW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HLCBvbGREYXlXb3JraW5nLCBEQVlfV09SS0lOR19FREVGQVVMVCwgb2xkRGF5V29ya2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERheVdvcmtpbmcoKSB7Ci0JCXJldHVybiBkYXlXb3JraW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZVBlcmlvZCBnZXRUaW1lUGVyaW9kKCkgewotCQlyZXR1cm4gdGltZVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUaW1lUGVyaW9kKFRpbWVQZXJpb2QgbmV3VGltZVBlcmlvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlUaW1lUGVyaW9kIG9sZFRpbWVQZXJpb2QgPSB0aW1lUGVyaW9kOwotCQl0aW1lUGVyaW9kID0gbmV3VGltZVBlcmlvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG9sZFRpbWVQZXJpb2QsIG5ld1RpbWVQZXJpb2QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVQZXJpb2QoVGltZVBlcmlvZCBuZXdUaW1lUGVyaW9kKSB7Ci0JCWlmIChuZXdUaW1lUGVyaW9kICE9IHRpbWVQZXJpb2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRpbWVQZXJpb2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGltZVBlcmlvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUaW1lUGVyaW9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RpbWVQZXJpb2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUaW1lUGVyaW9kKG5ld1RpbWVQZXJpb2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG5ld1RpbWVQZXJpb2QsIG5ld1RpbWVQZXJpb2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWVzIGdldFdvcmtpbmdUaW1lcygpIHsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG5ld1dvcmtpbmdUaW1lcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXb3JraW5nVGltZXMgb2xkV29ya2luZ1RpbWVzID0gd29ya2luZ1RpbWVzOwotCQl3b3JraW5nVGltZXMgPSBuZXdXb3JraW5nVGltZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG9sZFdvcmtpbmdUaW1lcywgbmV3V29ya2luZ1RpbWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG5ld1dvcmtpbmdUaW1lcykgewotCQlpZiAobmV3V29ya2luZ1RpbWVzICE9IHdvcmtpbmdUaW1lcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod29ya2luZ1RpbWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdvcmtpbmdUaW1lcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dvcmtpbmdUaW1lcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXb3JraW5nVGltZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdvcmtpbmdUaW1lcyhuZXdXb3JraW5nVGltZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUywgbmV3V29ya2luZ1RpbWVzLCBuZXdXb3JraW5nVGltZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUaW1lUGVyaW9kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V29ya2luZ1RpbWVzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGF5VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQlyZXR1cm4gaXNEYXlXb3JraW5nKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRDoKLQkJCQlyZXR1cm4gZ2V0VGltZVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXJldHVybiBnZXRXb3JraW5nVGltZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFOgotCQkJCXNldERheVR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkc6Ci0JCQkJc2V0RGF5V29ya2luZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXNldFRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQlzZXRXb3JraW5nVGltZXMoKFdvcmtpbmdUaW1lcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1RZUEU6Ci0JCQkJc2V0RGF5VHlwZShEQVlfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQl1bnNldERheVdvcmtpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXNldFRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXNldFdvcmtpbmdUaW1lcygoV29ya2luZ1RpbWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlyZXR1cm4gREFZX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRheVR5cGUgIT0gbnVsbCA6ICFEQVlfVFlQRV9FREVGQVVMVC5lcXVhbHMoZGF5VHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HOgotCQkJCXJldHVybiBpc1NldERheVdvcmtpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHRpbWVQZXJpb2QgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQlyZXR1cm4gd29ya2luZ1RpbWVzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXlUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkYXlXb3JraW5nOiAiKTsKLQkJaWYgKGRheVdvcmtpbmdFU2V0KSByZXN1bHQuYXBwZW5kKGRheVdvcmtpbmcpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV2Vla0RheUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwYmRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXZWVrRGF5c0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWVrIERheXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5c0ltcGwjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWVrRGF5c0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlZWtEYXlzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWVrRGF5KCkgPGVtPldlZWsgRGF5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3ZWVrRGF5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWVrRGF5c0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWVrRGF5cygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXZWVrRGF5KCkgewotCQlpZiAod2Vla0RheSA9PSBudWxsKSB7Ci0JCQl3ZWVrRGF5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdlZWtEYXkuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWSk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V2Vla0RheSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQlyZXR1cm4gZ2V0V2Vla0RheSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCWdldFdlZWtEYXkoKS5jbGVhcigpOwotCQkJCWdldFdlZWtEYXkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQlnZXRXZWVrRGF5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCXJldHVybiB3ZWVrRGF5ICE9IG51bGwgJiYgIXdlZWtEYXkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9XZWVrRGF5c0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhNTZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV29ya2luZ1RpbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVJbXBsI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdUaW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2luZ1RpbWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tVGltZSgpIDxlbT5Gcm9tIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGUk9NX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbVRpbWUoKSA8ZW0+RnJvbSBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcm9tVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmcm9tVGltZSA9IEZST01fVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb1RpbWUoKSA8ZW0+VG8gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBUT19USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvVGltZSgpIDxlbT5UbyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgdG9UaW1lID0gVE9fVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVGltZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JraW5nVGltZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RnJvbVRpbWUoKSB7Ci0JCXJldHVybiBmcm9tVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tVGltZShPYmplY3QgbmV3RnJvbVRpbWUpIHsKLQkJT2JqZWN0IG9sZEZyb21UaW1lID0gZnJvbVRpbWU7Ci0JCWZyb21UaW1lID0gbmV3RnJvbVRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUUsIG9sZEZyb21UaW1lLCBmcm9tVGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9UaW1lKCkgewotCQlyZXR1cm4gdG9UaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvVGltZShPYmplY3QgbmV3VG9UaW1lKSB7Ci0JCU9iamVjdCBvbGRUb1RpbWUgPSB0b1RpbWU7Ci0JCXRvVGltZSA9IG5ld1RvVGltZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUUsIG9sZFRvVGltZSwgdG9UaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXJldHVybiBnZXRGcm9tVGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlyZXR1cm4gZ2V0VG9UaW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXNldEZyb21UaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUU6Ci0JCQkJc2V0VG9UaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUU6Ci0JCQkJc2V0RnJvbVRpbWUoRlJPTV9USU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19UT19USU1FOgotCQkJCXNldFRvVGltZShUT19USU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX0ZST01fVElNRToKLQkJCQlyZXR1cm4gRlJPTV9USU1FX0VERUZBVUxUID09IG51bGwgPyBmcm9tVGltZSAhPSBudWxsIDogIUZST01fVElNRV9FREVGQVVMVC5lcXVhbHMoZnJvbVRpbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlyZXR1cm4gVE9fVElNRV9FREVGQVVMVCA9PSBudWxsID8gdG9UaW1lICE9IG51bGwgOiAhVE9fVElNRV9FREVGQVVMVC5lcXVhbHModG9UaW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZyb21UaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmcm9tVGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdG9UaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b1RpbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JraW5nVGltZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV29ya2luZ1RpbWVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmYyNGU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbCNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ1RpbWVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2luZ1RpbWVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nVGltZSgpIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3b3JraW5nVGltZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtpbmdUaW1lcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXb3JraW5nVGltZSgpIHsKLQkJaWYgKHdvcmtpbmdUaW1lID09IG51bGwpIHsKLQkJCXdvcmtpbmdUaW1lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdvcmtpbmdUaW1lLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRSk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V29ya2luZ1RpbWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gZ2V0V29ya2luZ1RpbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FOgotCQkJCWdldFdvcmtpbmdUaW1lKCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JraW5nVGltZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJZ2V0V29ya2luZ1RpbWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gd29ya2luZ1RpbWUgIT0gbnVsbCAmJiAhd29ya2luZ1RpbWUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9Xb3JraW5nVGltZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvbXNwcm9qZWN0LmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL21zcHJvamVjdC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlYmQyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvbXNwcm9qZWN0LmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNTUxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtc3Byb2plY3QiCi0gICAgbnNVUkk9Imh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IiBuc1ByZWZpeD0ibXNwcm9qZWN0Ij4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmdWxsIHByb2plY3Qgc2NoZW1hIGRlZmluaXRpb24gZnJvbSB0aGUgcHJvamVjdCBsZXZlbCBkb3duLCAmI3hEOyYjeEE7JiN4OTsmI3g5O3N0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucz4KLSAgICA8ZGV0YWlscyBrZXk9ImFwcGluZm8iIHZhbHVlPSJUaGUgTWljcm9zb2Z0IFByb2plY3QgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgZm9yIE1pY3Jvc29mdCBQcm9qZWN0IDEwLiYjeEQ7JiN4QTsmI3g5OyYjeDk7Ii8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjY3J1ZUF0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFsaWFzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25maXJtZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFJlc291cmNlIGhhcyBhY2NlcHRlZCBhbGwgb2YgaGlzIG9yIGhlciBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UmF0ZVRhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29zdFJhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCByYXRlIHRhYmxlIHVzZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb3N0IGFuZCBiYXNlbGluZSBjb3N0IGZvciBhIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxheSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCB0aGF0IHRoZSBhc3NpZ25tZW50IGlzIGRlbGF5ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzRml4ZWRSYXRlVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFVuaXRzIGFyZSBGaXhlZCBSYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhhc0ZpeGVkUmF0ZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY29uc3VtcHRpb24gb2YgdGhlIGFzc2lnbmVkIG1hdGVyaWFsIHJlc291cmNlIG9jY3VycyBpbiBhIHNpbmdsZSwgZml4ZWQgYW1vdW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5Rm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua2VkRmllbGRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGlua2VkRmllbGRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcmFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJhbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNlUGVuZGluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNlUGVuZGluZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgc3RhcnQgZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0cyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgdW5pdHMgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRlTmVlZGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIHRoZSByZXNvdXJjZSBhc3NpZ25lZCB0byBhIHRhc2sgbmVlZHMgdG8gYmUgdXBkYXRlZCBhcyB0byB0aGUgc3RhdHVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVwZGF0ZU5lZWRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZBQyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYmFzbGluZSBjb3N0IGFuZCB0b3RhbCBjb3N0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZBQyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0NvbnRvdXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrQ29udG91clR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBjb250b3VyIG9mIHRoZSBhc3NpZ25tZW50LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgNj1CZWxsLCA3PVR1cnRsZSwgOD1Db250b3VyZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrQ29udG91ciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9va2luZ1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Cb29raW5nVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgYXNzaWdubWVudC4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgY3JlYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXNzaWdubWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBdXRob3JUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3JfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImludGVyaW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJpbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzayBiYXNlbGluZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGJhc2VsaW5lIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdhcyBlc3RpbWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgd29yayBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYXNzaWduZWQgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIGlzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBmb3IgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDggOSAxMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNhbGN1bGF0aW9uVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxjdWxhdGlvblR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYWxlbmRhciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNCYXNlQ2FsZW5kYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNCYXNlQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlQ2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYmFzZSBjYWxlbmRhciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB3aGljaCB0aGlzIGNhbGVuZGFyIGRlcGVuZHMuIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgY2FsZW5kYXIgaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2Vla0RheXMiIGVUeXBlPSIjLy9XZWVrRGF5cyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIFdlZWtkYXlzIHRoYXQgZGVmaW5lcyB0aGlzIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFycyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWxlbmRhciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYWxlbmRhciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNhbGVuZGFycyBhcmUgdXNlZCB0byBkZWZpbmUgc3RhbmRhcmQgd29ya2luZyBhbmQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgbm9uLXdvcmtpbmcgdGltZXMuIFByb2plY3RzIG11c3QgaGF2ZSBvbmUgYmFzZSBjYWxlbmRhci4gVGFza3MgYW5kIHJlc291cmNlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBtYXkgaGF2ZSB0aGVpciBvd24gbm9uLWJhc2UgY2FsZW5kYXJzIHdoaWNoIGFyZSBiYXNlZCBvbiBhIGJhc2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2F0ZWdvcnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb2RlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb21wYW55VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb25zdHJhaW50VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb250YWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb3N0UmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF5VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza0VWTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRUYXNrVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9qZWN0IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2plY3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBpcyB0aGUgdG9wIGxldmVsIGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2RfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVtYWlsQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9BbGlhc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBmaWVsZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QaG9uZXRpY0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXBUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUm9sbHVwVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZC4gVmFsdWVzIGFyZTogMD1NYXhpbXVtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9QXZlcmFnZSwgNT1BdmVyYWdlIEZpcnN0IFN1YmxldmVsLCA2PUNvdW50IEZpcnN0IFN1YmxldmVsLCA3PUNvdW50ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbnN1bW1hcmllcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsY3VsYXRpb25UeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2FsY3VsYXRpb25UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZCBmb3IgdGFzayBhbmQgZ3JvdXAgc3VtbWFyeSByb3dzLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPU5vbmUsIDE9Um9sbHVwLCAyPUNhbGN1bGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZvcm11bGEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gdGFzayBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRm9ybXVsYSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3RyaWN0VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBSZXN0cmljdFZhbHVlcz1UcnVlIHRoZW4gb25seSB2YWx1ZXMgaW4gdGhlIGxpc3QgYXJlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIGZpbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdHJpY3RWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZWxpc3RTb3J0T3JkZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHZhbHVlIGxpc3RzIGFyZSBzb3J0ZWQuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9RGVzY2VuZGluZywgMT1Bc2NlbmRpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwZW5kTmV3VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBBcHBlbmROZXdWYWx1ZXM9VHJ1ZSB0aGVuIGFueSBuZXcgdmFsdWVzIGFkZGVkIGluIGEgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwZW5kTmV3VmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHBvaW50cyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgbGlzdC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZUxpc3QiIGVUeXBlPSIjLy9WYWx1ZUxpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGVuIHZhbHVlcyBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgYXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCB0aGV5IG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIGJ5IHZhbHVlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIG9yZGVyaW5nIG9mIHRoZSBsaXN0IGJ5IG9yZGVyaW5nIHNwZWNpZmllZCBoZXJlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGU0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhY2ggb2YgdGhlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcyBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICBUaGVyZSBhcmUgbm8gbGltaXRzIHRvIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBtYXkgYXBwZWFyLCBidXQgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgdW5kZXJzdGFuZCBGbGFnMS1GbGFnMTAsIGV0Yy4gIFRoaXMgbXVzdCBhcHBlYXIgb25jZSBpbiBlYWNoIEV4dGVuZGVkQXR0cmlidXRlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkV4dGVybmFsVGFza1Byb2plY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGWVN0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikdyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW5pdGlhbHNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFsc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMYWdGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFnRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJNYW5hZ2VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxldmVsIG9mIHRoZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWVzLiAgSWYgbGVuZ3RoIGlzIGFueSwgdGhlIHZhbHVlIGlzIHplcm8uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01hc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm91ciBlbGVtZW50cyBvZiB0aGUgbWFzayBjb25zdGl0dXRlIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIG91dGxpbmUgY29kZSBtdXN0IGFwcGVhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hdGVyaWFsTGFiZWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjU1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5ld1Rhc2tTdGFydERhdGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOVEFjY291bnRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOVEFjY291bnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsaWFzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY0FsaWFzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlcyIgZVR5cGU9IiMvL1ZhbHVlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgaXMgYW4gZW50ZXJwcmlzZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBjYW4gYmUgdXNlZCBieSB0aGUgUmVzb3VyY2UgU3Vic3RpdHV0aW9uIFdpemFyZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVhZk9ubHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVhZk9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxMZXZlbHNSZXF1aXJlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGxMZXZlbHNSZXF1aXJlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdmFsdWVzIHNwZWNpZmllZCBtdXN0IGNvbWUgZnJvbSB2YWx1ZXMgdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrcyIgZVR5cGU9IiMvL01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIG91dGxpbmUgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3V0bGluZU51bWJlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVOdW1iZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBob25ldGljQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZWRlY2Vzc29yTGluayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcmVkZWNlc3NvciB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGluayB0eXBlLiAgVmFsdWVzIGFyZSAwPUZGLCAxPUZTLCAyPVNGIGFuZCAzPVNTJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByZWRlY2Vzc29yIGlzIHBhcnQgb2YgYW5vdGhlciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3ROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHRlcm5hbCBwcmVkZWNlc3NvciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua0xhZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBsYWcgaW4gdGVudGhzIG9mIGEgbWludXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rTGFnIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFnRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGFnRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGxhZyBmb3JtYXQuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQcmVmaXhUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVmaXhfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9VSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGl0bGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UaXRsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpdGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ViamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YmplY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1YmplY3Qgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NhdGVnb3J5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjYXRlZ29yeSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wYW55IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29tcGFueVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29tcGFueSB0aGF0IG93bnMgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBhbnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5hZ2VyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTWFuYWdlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWFuYWdlciBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0F1dGhvclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXZpc2lvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2plY3QgaGFzIGJlZW4gc2F2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldmlzaW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFzdFNhdmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgbGFzdCBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFzdFNhdmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZWR1bGVGcm9tU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgc2NoZHVsZWQgZnJvbSB0aGUgc3RhcnQgZGF0ZSBvciBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjaGVkdWxlRnJvbVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIHRydWUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyBmYWxzZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmWVN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZZU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZpc2NhbCBZZWFyIHN0YXJ0aW5nIG1vbnRoLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs4PUF1Z3VzdCwgOT1TZXB0ZW1iZXIsIDEwPU9jdG9iZXIsIDExPU5vdmVtYmVyLCAxMj1EZWNlbWJlciAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRllTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbFNsYWNrTGltaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGF5cyBwYXN0IGl0cyBlbmQgZGF0ZSB0aGF0IGEgdGFzayBjYW4gZ28gJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O2JlZm9yZSBNaWNyb3NvZnQgUHJvamVjdCBtYXJrcyB0aGF0IHRhc2sgYXMgYSBjcml0aWNhbCB0YXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbFNsYWNrTGltaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeURpZ2l0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeURpZ2l0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ3VycmVuY3lTeW1ib2xUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGN1cnJlbmN5IHN5bWJvbCB1c2VkIGluIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sUG9zaXRpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVuY3kgc3ltYm9sLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3QgY2FsZW5kYXIuICBSZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhcnRUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YXJ0VGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaW5pc2hUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaW5pc2hUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWludXRlc1BlckRheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJEYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyV2VlayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaW51dGVzUGVyV2VlayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheXNQZXJNb250aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5c1Blck1vbnRoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGVmYXVsdFRhc2tUeXBlVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0RlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZyb20gd2hlcmUgZml4ZWQgY29zdHMgYXJlIGFjY3J1ZWQuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1TdGFydCwgMj1Qcm9yYXRlZCwgMz1FbmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRPdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0T3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGU1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTszPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzUzPW51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0Zvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgd29yayB1bml0IGZvcm1hdC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWRpdGFibGVBY3R1YWxDb3N0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IGFjdHVhbCBjb3N0cyBhcmUgZWRpdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVkaXRhYmxlQWN0dWFsQ29zdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob25vckNvbnN0cmFpbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb25vckNvbnN0cmFpbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybmVkVmFsdWVNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBjYWxjdWxhdGUgc3VidGFza3MgYXMgc3VtbWFyeSB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibXVsdGlwbGVDcml0aWNhbFBhdGhzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBtdWx0aXBsZSBjcml0aWNhbCBwYXRocyBhcmUgY2FsY3VsYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTXVsdGlwbGVDcml0aWNhbFBhdGhzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFZmZvcnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tzRXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHNob3cgdGhlIGVzdGltYXRlZCBkdXJhdGlvbiBieSBkZWZhdWx0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VzdGltYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwcmVhZEFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcHJlYWRBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBwZXJjZW50IGNvbXBsZXRlIGlzIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVcGRhdGVzUmVzb3VyY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdXBkYXRlcyB0byB0YXNrcyB1cGRhdGUgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVXBkYXRlc1Jlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmlzY2FsWWVhclN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgZmlzY2FsIHllYXIgbnVtYmVyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpc2NhbFllYXJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndlZWtTdGFydERheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtTdGFydERheVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVN1bmRheSwgMT1Nb25kYXksIDI9VHVlc2RheSwgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVDb21wbGV0ZWRFbmRzQmFjayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVDb21wbGV0ZWRFbmRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZ3VuIGxhdGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIHRoZSBzdGF0dXMgZGF0ZSBidXQgYmVndW4gbGF0ZSBzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUJhc2VsaW5lLCAxPUJhc2VsaW5lIDEsIDI9QmFzZWxpbmUgMiwgMz1CYXNlbGluZSAzLCA0PUJhc2VsaW5lIDQsIDU9QmFzZWxpbmUgNSwgNj1CYXNlbGluZSA2LCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Nz1CYXNlbGluZSA3LCA4PUJhc2VsaW5lIDgsIDk9QmFzZWxpbmUgOSwgMTA9QmFzZWxpbmUgMTAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSByZXNvdXJjZSBwb29sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGF0dXNEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGF0dXNEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVudERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZCBieSBhIFByb2plY3QgU2VydmVyIHVzZXIgYXMgb3Bwb3NlZCB0byBhbiBOVCB1c2VyLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9saW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9saW5rIGluc2VydGVkIG9yIG1vdmVkIHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvbGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tTdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OZXdUYXNrU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGRhdGUgZm9yIG5ldyB0YXNrcyBzdGFydC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVByb2plY3QgU3RhcnQgRGF0ZSwgMT1DdXJyZW50IERhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRUYXNrRVZNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGVhcm5lZCB2YWx1ZSBtZXRob2QgZm9yIHRhc2tzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBYTUwgd2FzIGVkaXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlbmRlZENyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxzSW5TeW5jIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGFsbCBhY3R1YWwgd29yayBoYXMgYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsc0luU3luYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbW92ZUZpbGVQcm9wZXJ0aWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHJlbW92ZSBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHNhdmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbW92ZUZpbGVQcm9wZXJ0aWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRtaW5Qcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIGFuIGFkbWluaXN0cmF0aXZlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkbWluUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlcyIgZVR5cGU9IiMvL091dGxpbmVDb2RlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIG91dGxpbmUgY29kZSBkZWZpbml0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuICBUaGVzZSBjb2RlcyBtYXkgYmUgYXNzb2NpYXRlZCBvbmx5IHdpdGggdGhpcyBwcm9qZWN0LCBvciBtYXkgYmUgY29tbW9uIGFtb25nIHNldmVyYWwgcHJvamVjdHMgKGVudGVycHJpc2UgY29kZXMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3QlNNYXNrcyIgZVR5cGU9IiMvL1dCU01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlcyIgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAmI3hEOyYjeEE7ICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFycyIgZVR5cGU9IiMvL0NhbGVuZGFycyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgJiN4RDsmI3hBOyAgICAgICAgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIGVUeXBlPSIjLy9UYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHRhc2tzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIGVUeXBlPSIjLy9SZXNvdXJjZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NpZ25tZW50cyIgZVR5cGU9IiMvL0Fzc2lnbm1lbnRzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYXNzaWdubWVudHMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmF0ZSBpcyBlZmZlY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9SYXRlVGFibGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QSwgMT1CLCAyPUMsIDM9RCwgND1FIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YW5kYXJkIHJhdGUgZm9yIHRoZSByZXNvdXJjZSBmb3IgdGhlIHBlcmlvZCBzcGVjaWZpZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UGVyVXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFBlclVzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJhdGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZSIgdXBwZXJCb3VuZD0iMjUiIGVUeXBlPSIjLy9SYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgYSB0aW1lIHBlcmlvZCwgYW5kIHRoZSByYXRlcyBhcHBsaWNhYmxlIGZvciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgZHVyaW5nIHRoYXQgcGVyaW9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGU0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0aWFsc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5pdGlhbHMgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFscyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgc3BlbGxpbmcgb2YgdGhlIHJlc291cmNlIG5hbWUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iblRBY2NvdW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTlRBY2NvdW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBOVCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hdGVyaWFsTGFiZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYXRlcmlhbExhYmVsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF0ZXJpYWxMYWJlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvZGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Db2RlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2RlIG9yIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vR3JvdXBUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGdyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtHcm91cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtHcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB3b3JrZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RGVmYXVsdCwgMT1Ob25lLCAyPUVtYWlsLCAzPVdlYiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbWFpbEFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FbWFpbEFkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbWFpbEFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF4VW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEuMCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1heFVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVha1VuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhcmdlc3QgbnVtYmVyIG9mIHVuaXRzIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhdCBhbnkgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVha1VuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlckFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmlyc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbkxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FuTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2NydWVBdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjY3J1ZUF0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCBvdmVydGltZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB3b3JrIGNvbXBsZXRlZCBhY3Jvc3MgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0IGNvc3QgZm9yIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIG92ZXJ0aW1lIGNvc3QgZm9yIHRoZSByZXNvdXJjZSBpbmNsdWRpbmcgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIHNjaGVkdWxlIHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZSBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzR2VuZXJpYyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGdlbmVyaWMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzR2VuZXJpYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5hY3RpdmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzZXQgdG8gaW5hY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzSW5hY3RpdmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VudGVycHJpc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBhbiBFbnRlcnByaXNlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0VudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgcmVzb3VyY2UuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2ZURpcmVjdG9yeUdVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBBY3RpdmUgRGlyZWN0b3J5IEdVSUQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kcyIgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBkdXJpbmcgd2hpY2ggdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJhdGVzIiBlVHlwZT0iIy8vUmF0ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBhbmQgdGhlIHJhdGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHJlc291cmNlIGluIGVhY2ggUmVzb3VyY2VzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sbHVwVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YmplY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJqZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YnByb2plY3ROYW1lVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VicHJvamVjdE5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHRhc2sgd2l0aGluIHRoZSBsaXN0IG9mIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzTnVsbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRhc2sgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRlRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0ZURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250YWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29udGFjdCBwZXJzb24gZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29kZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJpZ2h0bW9zdCBXQlMgbGV2ZWwgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVOdW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lTnVtYmVyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdXRsaW5lIG51bWJlciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbGV2ZWwgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByaW9yaXR5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgZnJvbSAwIHRvIDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByaW9yaXR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGxhbm5lZCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzay4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0b3AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZVZhbGlkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGNhbiBiZSByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWVWYWxpZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBlZmZvcnQtZHJpdmVuLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZmZvcnREcml2ZW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWN1cnJpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSByZWN1cnJpbmcgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVjdXJyaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBvdmVyYWxsb2NhdGVkLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdW1tYXJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgc3VtbWFyeSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JpdGljYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgaW4gdGhlIGNyaXRpY2FsIGNoYWluLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhbiBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc1N1YnByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N1YnByb2plY3RSZWFkT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgaW5zZXJ0ZWQgcHJvamVjdCBpcyByZWFkLW9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdFJlYWRPbmx5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VicHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdWJwcm9qZWN0TmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsVGFzayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBleHRlcm5hbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVybmFsVGFza1Byb2plY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNvdXJjZSBsb2NhdGlvbiBhbmQgdGFzayBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJseVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWFybHkgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5RmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXRlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIHN0YXJ0IGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgZmluaXNoIGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRhc2sgd29yayBmcm9tIHRoZSBiYXNlbGluZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyZWVTbGFjayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBmcmVlIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcmVlU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b3RhbFNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHRvdGFsIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb3RhbFNsYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpeGVkIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkQ29zdEFjY3J1YWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9GaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyB0aGUgZml4ZWQgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9UHJvcmF0ZWQgYW5kIDM9RW5kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudENvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayBkdXJhdGlvbiBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIHdvcmsgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbER1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdEdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdGltZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUgdW5maW5pc2hlZCBwb3J0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3QgcHJvamVjdGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBmaW5pc2ggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29uc3RyYWludCBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QXMgU29vbiBBcyBQb3NzaWJsZSwgMT1BcyBMYXRlIEFzIFBvc3NpYmxlLCAyPU11c3QgU3RhcnQgT24sIDM9TXVzdCBGaW5pc2ggT24sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9U3RhcnQgTm8gRWFybGllciBUaGFuLCA1PVN0YXJ0IE5vIExhdGVyIFRoYW4sIDY9RmluaXNoIE5vIEVhcmxpZXIgVGhhbiBhbmQgNz1GaW5pc2ggTm8gTGF0ZXIgVGhhbiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFzayBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnN0cmFpbnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgYXJndW1lbnQgZm9yIHRoZSB0YXNrIGNvbnN0cmFpbnQgdHlwZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWFkbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWFkbGluZSBmb3IgdGhlIHRhc2sgdG8gYmUgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWFkbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsQXNzaWdubWVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIGFkanVzdCBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxBc3NpZ25tZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nQ2FuU3BsaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIHNwbGl0IHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0NhblNwbGl0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlTGV2ZWxlZFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlTGV2ZWxlZEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWdub3JlUmVzb3VyY2VDYWxlbmRhciIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpZ25vcmVzIHRoZSByZXNvdXJjZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSWdub3JlUmVzb3VyY2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhpZGVCYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIEdBTlRUIGJhciBvZiB0aGUgdGFzayBpcyBoaWRkZW4gd2hlbiBkaXNwbGF5ZWQgaW4gTWljcm9zb2Z0IFByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkhpZGVCYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgcm9sbGVkIHVwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgUHJvamVjdCBNYW5hZ2VyLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmb3IgY2FsY3VsYXRpbmcgQkNXUC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGh5c2ljYWxQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvckxpbmsiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUHJlZGVjZXNzb3JMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgcHJlZGVjZXNzb3IgdGFzayBvZiB0aGUgdGFzayB0aGF0IGNvbnRhaW5zIGl0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFzayIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgdGFzayBpbiBlYWNoIFRhc2tzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaW1lUGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJvbURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSBleGNlcHRpb24gdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVwaGFzZWREYXRhVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgdGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2suJiN4RDsmI3hBOyYjeDk7JiN4OTsgICAgICAgICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGFUeXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0YXNrIHRpbWVwaGFzZWQgZGF0YS4gVmFsdWVzIGFyZTomI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxPUFzc2lnbm1lbnQgUmVtYWluaW5nIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyPUFzc2lnbm1lbnQgQWN0dWFsIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzPUFzc2lnbm1lbnQgQWN0dWFsIE92ZXJ0aW1lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0PUFzc2lnbm1lbnQgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU9QXNzaWdubWVudCBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNj1Bc3NpZ25tZW50IEFjdHVhbCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNz1SZXNvdXJjZSBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOD1SZXNvdXJjZSBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOT1UYXNrIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMD1UYXNrIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMT1UYXNrIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxNj1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE3PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTg9VGFzayBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOT1UYXNrIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIwPVJlc291cmNlIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIxPVJlc291cmNlIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIyPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjM9QXNzaWdubWVudCBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyND1UYXNrIEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI1PVRhc2sgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjY9UmVzb3VyY2UgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjc9UmVzb3VyY2UgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjg9QXNzaWdubWVudCBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOT1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMwPVRhc2sgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzE9VGFzayBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMj1SZXNvdXJjZSBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMz1SZXNvdXJjZSBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzND1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM1PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzY9VGFzayBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNz1UYXNrIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM4PVJlc291cmNlIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM5PVJlc291cmNlIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQwPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDE9QXNzaWdubWVudCBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Mj1UYXNrIEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQzPVRhc2sgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDQ9UmVzb3VyY2UgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDU9UmVzb3VyY2UgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDY9QXNzaWdubWVudCBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nz1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ4PVRhc2sgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDk9VGFzayBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MD1SZXNvdXJjZSBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MT1SZXNvdXJjZSBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Mj1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUzPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTQ9VGFzayBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1NT1UYXNrIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU2PVJlc291cmNlIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU3PVJlc291cmNlIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU4PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTk9QXNzaWdubWVudCBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2MD1UYXNrIEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYxPVRhc2sgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjI9UmVzb3VyY2UgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjM9UmVzb3VyY2UgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjQ9QXNzaWdubWVudCBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2NT1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY2PVRhc2sgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjc9VGFzayBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OD1SZXNvdXJjZSBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OT1SZXNvdXJjZSBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mj1UYXNrIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mz1UYXNrIEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3ND1SZXNvdXJjZSBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzU9UmVzb3VyY2UgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc2PVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVW5pdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSB1bml0IG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9bSwgMT1oLCAyPWQsIDM9dywgNT1tbywgOD15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBwZXIgdW5pdCBvZiB0aW1lIGZvciB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlRpdGxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSURfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIxNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbml0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDUgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJlbnRWYWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlIG9mIHRoZSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBhcmVudFZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVuaXF1ZSBJRCBvZiB2YWx1ZSBhY3Jvc3MgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhbHVlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlTGlzdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWVzIHRoYXQgbWFrZSB1cCB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldCU01hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1R5cGVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBub2RlIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgb21pdHRlZCB3aGVuIGxlbmd0aCBpcyAmcXVvdDthbnkmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJpZnlVbmlxdWVDb2RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgV0JTIGNvZGVzIGFyZSB1bmlxdWUgZm9yIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmVyaWZ5VW5pcXVlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIGdlbmVyYXRlZCBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHZW5lcmF0ZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUHJlZml4VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmVmaXggZm9yIGFsbCBXQlMgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2siIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV0JTTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBXQlMgTWFzayB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIHRhc2tzIGluIHRoZSBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RheVR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgZGF5LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3PVN1bmRheSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5V29ya2luZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHdvcmtpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVdvcmtpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lUGVyaW9kIiBlVHlwZT0iIy8vVGltZVBlcmlvZCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgYSBjb250aWd1b3VzIHNldCBvZiBleGNlcHRpb24gZGF5cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZXMiIGVUeXBlPSIjLy9Xb3JraW5nVGltZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHdlZWtkYXkuICBPbmUgb2YgdGhlc2UgbXVzdCBiZSBwcmVzZW50LCBhbmQgdGhlcmUgbWF5IGJlIG5vIG1vcmUgdGhhbiBmaXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtEYXkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHdlZWtkYXkgZWl0aGVyIGRlZmluZXMgcmVndWxhciBkYXlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldlZWtTdGFydERheVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrU3RhcnREYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtDb250b3VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtHcm91cFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbVRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIHdvcmtpbmcgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVuZCBvZiB0aGUgd29ya2luZyAgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JraW5nVGltZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2luZ1RpbWUiIHVwcGVyQm91bmQ9IjUiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JraW5nVGltZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHdvcmtpbmcgdGltZSBkdXJpbmcgdGhlIHdlZWtkYXkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2N2ZkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgTWljcm9zb2Z0IFByb2plY3QgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNiODBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMjUzZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1zcHJvamVjdFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBNc3Byb2plY3RTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50KEFzc2lnbm1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXNzaWdubWVudHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2QoQXZhaWxhYmlsaXR5UGVyaW9kIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZShCYXNlbGluZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTIoQmFzZWxpbmUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTMoQmFzZWxpbmUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcihDYWxlbmRhciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2FsZW5kYXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcnMoQ2FsZW5kYXJzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDYWxlbmRhcnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShFeHRlbmRlZEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTMoRXh0ZW5kZWRBdHRyaWJ1dGUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTQoRXh0ZW5kZWRBdHRyaWJ1dGU0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrKE1hc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrcyhNYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0bGluZUNvZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZTIoT3V0bGluZUNvZGUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZTMoT3V0bGluZUNvZGUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcmVkZWNlc3NvckxpbmsoUHJlZGVjZXNzb3JMaW5rIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcmVkZWNlc3NvckxpbmtBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0KFByb2plY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2plY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlKFJhdGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlcyhSYXRlcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZShSZXNvdXJjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZXMoUmVzb3VyY2VzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrcyhUYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lUGVyaW9kKFRpbWVQZXJpb2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRpbWVQZXJpb2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lcGhhc2VkRGF0YVR5cGUoVGltZXBoYXNlZERhdGFUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUaW1lcGhhc2VkRGF0YVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZShWYWx1ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFsdWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZTIoVmFsdWUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZUxpc3QoVmFsdWVMaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZUxpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZXMoVmFsdWVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrKFdCU01hc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdCU01hc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrcyhXQlNNYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV0JTTWFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5KFdlZWtEYXkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlZWtEYXlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5cyhXZWVrRGF5cyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2Vla0RheXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZShXb3JraW5nVGltZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya2luZ1RpbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JraW5nVGltZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50IDxlbT5Bc3NpZ25tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NpZ25tZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2lnbm1lbnRzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmFzZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyIDxlbT5CYXNlbGluZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmFzZWxpbmUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyA8ZW0+QmFzZWxpbmUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJhc2VsaW5lM0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYWxlbmRhckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMgPGVtPkNhbGVuZGFyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYWxlbmRhcnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrIDxlbT5NYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzIDxlbT5NYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1hc2tzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0bGluZUNvZGUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyA8ZW0+T3V0bGluZSBDb2RlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZTNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGxpbmVDb2Rlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJlZGVjZXNzb3JMaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2plY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSA8ZW0+UmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSYXRlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSA8ZW0+UmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGltZVBlcmlvZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUgPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIgPGVtPlZhbHVlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZTJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0IDxlbT5WYWx1ZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMgPGVtPlZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayA8ZW0+V0JTIE1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdCU01hc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdCU01hc2tzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWVrRGF5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWVrRGF5c0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya2luZ1RpbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtpbmdUaW1lc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nc3Byb2plY3RBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTdiOTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IE1zcHJvamVjdFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZTEwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0UmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwuTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpewotCSAgICByZXR1cm4gbmV3IE1zcHJvamVjdFhNTEhlbHBlckltcGwodGhpcyk7Ci0JfQotfSAvL01zcHJvamVjdFJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE5MGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RTd2l0Y2guamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQxIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0U3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1zcHJvamVjdFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UOiB7Ci0JCQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFzc2lnbm1lbnQoYXNzaWdubWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTOiB7Ci0JCQkJQXNzaWdubWVudHMgYXNzaWdubWVudHMgPSAoQXNzaWdubWVudHMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFzc2lnbm1lbnRzKGFzc2lnbm1lbnRzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRDogewotCQkJCUF2YWlsYWJpbGl0eVBlcmlvZCBhdmFpbGFiaWxpdHlQZXJpb2QgPSAoQXZhaWxhYmlsaXR5UGVyaW9kKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2QoYXZhaWxhYmlsaXR5UGVyaW9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFM6IHsKLQkJCQlBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMgPSAoQXZhaWxhYmlsaXR5UGVyaW9kcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kcyhhdmFpbGFiaWxpdHlQZXJpb2RzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkU6IHsKLQkJCQlCYXNlbGluZSBiYXNlbGluZSA9IChCYXNlbGluZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmFzZWxpbmUoYmFzZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTI6IHsKLQkJCQlCYXNlbGluZTIgYmFzZWxpbmUyID0gKEJhc2VsaW5lMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmFzZWxpbmUyKGJhc2VsaW5lMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMzogewotCQkJCUJhc2VsaW5lMyBiYXNlbGluZTMgPSAoQmFzZWxpbmUzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCYXNlbGluZTMoYmFzZWxpbmUzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVI6IHsKLQkJCQlDYWxlbmRhciBjYWxlbmRhciA9IChDYWxlbmRhcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2FsZW5kYXIoY2FsZW5kYXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlM6IHsKLQkJCQlDYWxlbmRhcnMgY2FsZW5kYXJzID0gKENhbGVuZGFycyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2FsZW5kYXJzKGNhbGVuZGFycyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6IHsKLQkJCQlEb2N1bWVudFJvb3QgZG9jdW1lbnRSb290ID0gKERvY3VtZW50Um9vdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRG9jdW1lbnRSb290KGRvY3VtZW50Um9vdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlIGV4dGVuZGVkQXR0cmlidXRlID0gKEV4dGVuZGVkQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShleHRlbmRlZEF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTI6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTIgZXh0ZW5kZWRBdHRyaWJ1dGUyID0gKEV4dGVuZGVkQXR0cmlidXRlMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUyKGV4dGVuZGVkQXR0cmlidXRlMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTMgZXh0ZW5kZWRBdHRyaWJ1dGUzID0gKEV4dGVuZGVkQXR0cmlidXRlMyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUzKGV4dGVuZGVkQXR0cmlidXRlMyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTQ6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTQgZXh0ZW5kZWRBdHRyaWJ1dGU0ID0gKEV4dGVuZGVkQXR0cmlidXRlNCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGU0KGV4dGVuZGVkQXR0cmlidXRlNCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVM6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZXMgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gKEV4dGVuZGVkQXR0cmlidXRlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGVzKGV4dGVuZGVkQXR0cmlidXRlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6IHsKLQkJCQlNYXNrIG1hc2sgPSAoTWFzayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWFzayhtYXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1M6IHsKLQkJCQlNYXNrcyBtYXNrcyA9IChNYXNrcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWFza3MobWFza3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREU6IHsKLQkJCQlPdXRsaW5lQ29kZSBvdXRsaW5lQ29kZSA9IChPdXRsaW5lQ29kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGUob3V0bGluZUNvZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyOiB7Ci0JCQkJT3V0bGluZUNvZGUyIG91dGxpbmVDb2RlMiA9IChPdXRsaW5lQ29kZTIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlMihvdXRsaW5lQ29kZTIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzOiB7Ci0JCQkJT3V0bGluZUNvZGUzIG91dGxpbmVDb2RlMyA9IChPdXRsaW5lQ29kZTMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlMyhvdXRsaW5lQ29kZTMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTOiB7Ci0JCQkJT3V0bGluZUNvZGVzIG91dGxpbmVDb2RlcyA9IChPdXRsaW5lQ29kZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlcyhvdXRsaW5lQ29kZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LOiB7Ci0JCQkJUHJlZGVjZXNzb3JMaW5rIHByZWRlY2Vzc29yTGluayA9IChQcmVkZWNlc3NvckxpbmspdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByZWRlY2Vzc29yTGluayhwcmVkZWNlc3NvckxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUOiB7Ci0JCQkJUHJvamVjdCBwcm9qZWN0ID0gKFByb2plY3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEU6IHsKLQkJCQlSYXRlIHJhdGUgPSAoUmF0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmF0ZShyYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVM6IHsKLQkJCQlSYXRlcyByYXRlcyA9IChSYXRlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmF0ZXMocmF0ZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRTogewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFUzogewotCQkJCVJlc291cmNlcyByZXNvdXJjZXMgPSAoUmVzb3VyY2VzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZXMocmVzb3VyY2VzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTSzogewotCQkJCVRhc2sgdGFzayA9IChUYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrKHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLUzogewotCQkJCVRhc2tzIHRhc2tzID0gKFRhc2tzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrcyh0YXNrcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EOiB7Ci0JCQkJVGltZVBlcmlvZCB0aW1lUGVyaW9kID0gKFRpbWVQZXJpb2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRpbWVQZXJpb2QodGltZVBlcmlvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOiB7Ci0JCQkJVGltZXBoYXNlZERhdGFUeXBlIHRpbWVwaGFzZWREYXRhVHlwZSA9IChUaW1lcGhhc2VkRGF0YVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRpbWVwaGFzZWREYXRhVHlwZSh0aW1lcGhhc2VkRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTogewotCQkJCVZhbHVlIHZhbHVlID0gKFZhbHVlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZSh2YWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMjogewotCQkJCVZhbHVlMiB2YWx1ZTIgPSAoVmFsdWUyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZTIodmFsdWUyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVDogewotCQkJCVZhbHVlTGlzdCB2YWx1ZUxpc3QgPSAoVmFsdWVMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZUxpc3QodmFsdWVMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTOiB7Ci0JCQkJVmFsdWVzIHZhbHVlcyA9IChWYWx1ZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlcyh2YWx1ZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTSzogewotCQkJCVdCU01hc2sgd2JzTWFzayA9IChXQlNNYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXQlNNYXNrKHdic01hc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6IHsKLQkJCQlXQlNNYXNrcyB3YnNNYXNrcyA9IChXQlNNYXNrcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV0JTTWFza3Mod2JzTWFza3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWTogewotCQkJCVdlZWtEYXkgd2Vla0RheSA9IChXZWVrRGF5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWVrRGF5KHdlZWtEYXkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVM6IHsKLQkJCQlXZWVrRGF5cyB3ZWVrRGF5cyA9IChXZWVrRGF5cyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2Vla0RheXMod2Vla0RheXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUU6IHsKLQkJCQlXb3JraW5nVGltZSB3b3JraW5nVGltZSA9IChXb3JraW5nVGltZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya2luZ1RpbWUod29ya2luZ1RpbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTOiB7Ci0JCQkJV29ya2luZ1RpbWVzIHdvcmtpbmdUaW1lcyA9IChXb3JraW5nVGltZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtpbmdUaW1lcyh3b3JraW5nVGltZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NpZ25tZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnQoQXNzaWdubWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kKEF2YWlsYWJpbGl0eVBlcmlvZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUoQmFzZWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTIoQmFzZWxpbmUyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUzKEJhc2VsaW5lMyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcihDYWxlbmRhciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFycyhDYWxlbmRhcnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShFeHRlbmRlZEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUyKEV4dGVuZGVkQXR0cmlidXRlMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUzKEV4dGVuZGVkQXR0cmlidXRlMyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGU0KEV4dGVuZGVkQXR0cmlidXRlNCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1hc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWFzayhNYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFza3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1hc2tzKE1hc2tzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUoT3V0bGluZUNvZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMihPdXRsaW5lQ29kZTIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMyhPdXRsaW5lQ29kZTMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByZWRlY2Vzc29yTGluayhQcmVkZWNlc3Nvckxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3QoUHJvamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmF0ZShSYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJhdGVzKFJhdGVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlKFJlc291cmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VzKFJlc291cmNlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tzKFRhc2tzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVQZXJpb2QoVGltZVBlcmlvZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lcGhhc2VkRGF0YVR5cGUoVGltZXBoYXNlZERhdGFUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlKFZhbHVlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWUyKFZhbHVlMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWVMaXN0KFZhbHVlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlcyhWYWx1ZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV0JTTWFzayhXQlNNYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV0JTTWFza3MoV0JTTWFza3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2Vla0RheShXZWVrRGF5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2Vla0RheXMoV2Vla0RheXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZShXb3JraW5nVGltZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya2luZ1RpbWVzKFdvcmtpbmdUaW1lcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTXNwcm9qZWN0U3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NGMwOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFZhbGlkYXRvci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWNDaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUudXRpbC5YTUxUeXBlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+VmFsaWRhdG9yPC9iPiBmb3IgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0VmFsaWRhdG9yIGV4dGVuZHMgRU9iamVjdFZhbGlkYXRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNc3Byb2plY3RWYWxpZGF0b3IgSU5TVEFOQ0UgPSBuZXcgTXNwcm9qZWN0VmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IGZvciB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldFNvdXJjZSgpIHNvdXJjZX0gb2YgZGlhZ25vc3RpYyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0Q29kZSgpIGNvZGVzfSBmcm9tIHRoaXMgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0U291cmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHTk9TVElDX1NPVVJDRSA9ICJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgd2l0aCBhIGZpeGVkIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB2YWx1ZSBmb3IgYWRkaXRpb25hbCBoYW5kIHdyaXR0ZW4gY29uc3RhbnRzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRU5FUkFURURfRElBR05PU1RJQ19DT0RFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgd2l0aCBhIGZpeGVkIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB2YWx1ZSBmb3IgYWRkaXRpb25hbCBoYW5kIHdyaXR0ZW4gY29uc3RhbnRzIGluIGEgZGVyaXZlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBESUFHTk9TVElDX0NPREVfQ09VTlQgPSBHRU5FUkFURURfRElBR05PU1RJQ19DT0RFX0NPVU5UOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCBiYXNlIHBhY2thZ2UgdmFsaWRhdG9yLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYTUxUeXBlVmFsaWRhdG9yIHhtbFR5cGVWYWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJeG1sVHlwZVZhbGlkYXRvciA9IFhNTFR5cGVWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBvZiB0aGlzIHZhbGlkYXRvciBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCSAgcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPnZhbGlkYXRlWFhYPC9jb2RlPiBmb3IgdGhlIGNvcnJlc29uZGluZyBjbGFzc2lmaWVyIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShpbnQgY2xhc3NpZmllcklELCBPYmplY3QgdmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UOgotCQkJCXJldHVybiB2YWxpZGF0ZUFzc2lnbm1lbnQoKEFzc2lnbm1lbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBc3NpZ25tZW50cygoQXNzaWdubWVudHMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCXJldHVybiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgoQXZhaWxhYmlsaXR5UGVyaW9kKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygoQXZhaWxhYmlsaXR5UGVyaW9kcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lKChCYXNlbGluZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZTIoKEJhc2VsaW5lMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZTMoKEJhc2VsaW5lMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSOgotCQkJCXJldHVybiB2YWxpZGF0ZUNhbGVuZGFyKChDYWxlbmRhcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVDYWxlbmRhcnMoKENhbGVuZGFycyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRG9jdW1lbnRSb290KChEb2N1bWVudFJvb3QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoKEV4dGVuZGVkQXR0cmlidXRlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKEV4dGVuZGVkQXR0cmlidXRlMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKChFeHRlbmRlZEF0dHJpYnV0ZTMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlNCgoRXh0ZW5kZWRBdHRyaWJ1dGU0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKEV4dGVuZGVkQXR0cmlidXRlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWFzaygoTWFzayl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hc2tzKChNYXNrcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZSgoT3V0bGluZUNvZGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVDb2RlMigoT3V0bGluZUNvZGUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZTMoKE91dGxpbmVDb2RlMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LOgotCQkJCXJldHVybiB2YWxpZGF0ZVByZWRlY2Vzc29yTGluaygoUHJlZGVjZXNzb3JMaW5rKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVQcm9qZWN0KChQcm9qZWN0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlKChSYXRlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmF0ZXMoKFJhdGVzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2UoKFJlc291cmNlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlcygoUmVzb3VyY2VzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUYXNrKChUYXNrKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGFza3MoKFRhc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGltZVBlcmlvZCgoVGltZVBlcmlvZCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVRpbWVwaGFzZWREYXRhVHlwZSgoVGltZXBoYXNlZERhdGFUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoKFZhbHVlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyOgotCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlMigoVmFsdWUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZUxpc3QoKFZhbHVlTGlzdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZXMoKFZhbHVlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLOgotCQkJCXJldHVybiB2YWxpZGF0ZVdCU01hc2soKFdCU01hc2spdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV0JTTWFza3MoKFdCU01hc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVk6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2Vla0RheSgoV2Vla0RheSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrRGF5cygoV2Vla0RheXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya2luZ1RpbWUoKFdvcmtpbmdUaW1lKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JraW5nVGltZXMoKFdvcmtpbmdUaW1lcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBY2NydWVBdCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUFsaWFzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVVUSE9SX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXV0aG9yVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxDVUxBVElPTl9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBVEVHT1JZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT0RFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29kZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb21wYW55VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OU1RSQUlOVF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNvbnRhY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT1NUX1JBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURheVR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRUYXNrVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUyKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUzOgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTMoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU1KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFbWFpbEFkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFUk5BTF9UQVNLX1BST0pFQ1RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVGWVN0YXJ0RGF0ZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5HUk9VUF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUdyb3VwVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTEoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVJbml0aWFsc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxBR19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFOQUdFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hbmFnZXJUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVRFUklBTF9MQUJFTF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZU5hbWVUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVOYW1lVHlwZTMoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOVEFjY291bnRUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX05VTUJFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVBob25ldGljc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRUZJWF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVByZWZpeFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlVGFibGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUk9MTFVQX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCSkVDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVN1YmplY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTdWJwcm9qZWN0TmFtZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJVExFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGl0bGVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUyKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZTMoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlNCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGU1KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVUlEVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVVuaXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19TVEFSVF9EQVlfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQlkZWZhdWx0OiAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXNzaWdubWVudChBc3NpZ25tZW50IGFzc2lnbm1lbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXNzaWdubWVudCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXNzaWdubWVudHMoQXNzaWdubWVudHMgYXNzaWdubWVudHMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXNzaWdubWVudHMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZChBdmFpbGFiaWxpdHlQZXJpb2QgYXZhaWxhYmlsaXR5UGVyaW9kLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGF2YWlsYWJpbGl0eVBlcmlvZCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXZhaWxhYmlsaXR5UGVyaW9kcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUoQmFzZWxpbmUgYmFzZWxpbmUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJhc2VsaW5lMihCYXNlbGluZTIgYmFzZWxpbmUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGJhc2VsaW5lMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUzKEJhc2VsaW5lMyBiYXNlbGluZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxlbmRhcihDYWxlbmRhciBjYWxlbmRhciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChjYWxlbmRhciwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsZW5kYXJzKENhbGVuZGFycyBjYWxlbmRhcnMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoY2FsZW5kYXJzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChkb2N1bWVudFJvb3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlKEV4dGVuZGVkQXR0cmlidXRlIGV4dGVuZGVkQXR0cmlidXRlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIGV4dGVuZGVkQXR0cmlidXRlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlMyhFeHRlbmRlZEF0dHJpYnV0ZTMgZXh0ZW5kZWRBdHRyaWJ1dGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KEV4dGVuZGVkQXR0cmlidXRlNCBleHRlbmRlZEF0dHJpYnV0ZTQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZXh0ZW5kZWRBdHRyaWJ1dGU0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hc2soTWFzayBtYXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG1hc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hc2tzKE1hc2tzIG1hc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG1hc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvdXRsaW5lQ29kZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZUNvZGUyKE91dGxpbmVDb2RlMiBvdXRsaW5lQ29kZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQob3V0bGluZUNvZGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZTMoT3V0bGluZUNvZGUzIG91dGxpbmVDb2RlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG91dGxpbmVDb2RlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZGVjZXNzb3JMaW5rKFByZWRlY2Vzc29yTGluayBwcmVkZWNlc3NvckxpbmssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocHJlZGVjZXNzb3JMaW5rLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcm9qZWN0KFByb2plY3QgcHJvamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChwcm9qZWN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlKFJhdGUgcmF0ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyYXRlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlcyhSYXRlcyByYXRlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyYXRlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocmVzb3VyY2UsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlcyhSZXNvdXJjZXMgcmVzb3VyY2VzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHJlc291cmNlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGFzayhUYXNrIHRhc2ssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGFzaywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGFza3MoVGFza3MgdGFza3MsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGFza3MsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpbWVQZXJpb2QoVGltZVBlcmlvZCB0aW1lUGVyaW9kLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRpbWVQZXJpb2QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpbWVwaGFzZWREYXRhVHlwZShUaW1lcGhhc2VkRGF0YVR5cGUgdGltZXBoYXNlZERhdGFUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRpbWVwaGFzZWREYXRhVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWUoVmFsdWUgdmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlMihWYWx1ZTIgdmFsdWUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHZhbHVlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZUxpc3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWVMaXN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZXMoVmFsdWVzIHZhbHVlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh2YWx1ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdCU01hc2soV0JTTWFzayB3YnNNYXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdic01hc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdCU01hc2tzKFdCU01hc2tzIHdic01hc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdic01hc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrRGF5KFdlZWtEYXkgd2Vla0RheSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3ZWVrRGF5LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrRGF5cyhXZWVrRGF5cyB3ZWVrRGF5cywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3ZWVrRGF5cywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya2luZ1RpbWUoV29ya2luZ1RpbWUgd29ya2luZ1RpbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod29ya2luZ1RpbWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgd29ya2luZ1RpbWVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdvcmtpbmdUaW1lcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWNjcnVlQXQoQmlnSW50ZWdlciBhY2NydWVBdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQWNjcnVlQXRfRW51bWVyYXRpb24oYWNjcnVlQXQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEFDQ1JVRV9BVF9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkFjY3J1ZSBBdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgYWNjcnVlQXQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoYWNjcnVlQXQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjY3J1ZUF0KCksIGFjY3J1ZUF0LCBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZShTdHJpbmcgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlX01heExlbmd0aChhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlX01heExlbmd0aChTdHJpbmcgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDE2OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSgpLCBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgbGVuZ3RoLCAxNiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxpYXNUeXBlKFN0cmluZyBhbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFsaWFzVHlwZV9NYXhMZW5ndGgoYWxpYXNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkFsaWFzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGlhc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBhbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGFsaWFzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MDsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWxpYXNUeXBlKCksIGFsaWFzVHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXV0aG9yVHlwZShTdHJpbmcgYXV0aG9yVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQXV0aG9yVHlwZV9NYXhMZW5ndGgoYXV0aG9yVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BdXRob3IgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhvclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBhdXRob3JUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBhdXRob3JUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aG9yVHlwZSgpLCBhdXRob3JUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoQmlnSW50ZWdlciBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVfRW51bWVyYXRpb24oYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSgpLCBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24oYm9va2luZ1R5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEJPT0tJTkdfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJvb2tpbmdUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Qm9va2luZ1R5cGVUeXBlKCksIGJvb2tpbmdUeXBlVHlwZSwgQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlMV9FbnVtZXJhdGlvbihib29raW5nVHlwZVR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJPT0tJTkdfVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBib29raW5nVHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJvb2tpbmdUeXBlVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJvb2tpbmdUeXBlVHlwZTEoKSwgYm9va2luZ1R5cGVUeXBlMSwgQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZShCaWdJbnRlZ2VyIGNhbGN1bGF0aW9uVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNhbGN1bGF0aW9uVHlwZVR5cGVfRW51bWVyYXRpb24oY2FsY3VsYXRpb25UeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDQUxDVUxBVElPTl9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5DYWxjdWxhdGlvbiBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxjdWxhdGlvblR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY2FsY3VsYXRpb25UeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjYWxjdWxhdGlvblR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYWxjdWxhdGlvblR5cGVUeXBlKCksIGNhbGN1bGF0aW9uVHlwZVR5cGUsIENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhdGVnb3J5VHlwZShTdHJpbmcgY2F0ZWdvcnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDYXRlZ29yeVR5cGVfTWF4TGVuZ3RoKGNhdGVnb3J5VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlX01heExlbmd0aChTdHJpbmcgY2F0ZWdvcnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBjYXRlZ29yeVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXRlZ29yeVR5cGUoKSwgY2F0ZWdvcnlUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29kZVR5cGUoU3RyaW5nIGNvZGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb2RlVHlwZV9NYXhMZW5ndGgoY29kZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+Q29kZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29kZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBjb2RlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY29kZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb2RlVHlwZSgpLCBjb2RlVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBhbnlUeXBlKFN0cmluZyBjb21wYW55VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29tcGFueVR5cGVfTWF4TGVuZ3RoKGNvbXBhbnlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvbXBhbnkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBhbnlUeXBlX01heExlbmd0aChTdHJpbmcgY29tcGFueVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvbXBhbnlUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcGFueVR5cGUoKSwgY29tcGFueVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb25zdHJhaW50VHlwZVR5cGUoQmlnSW50ZWdlciBjb25zdHJhaW50VHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbihjb25zdHJhaW50VHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkNvbnN0cmFpbnQgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY29uc3RyYWludFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ09OU1RSQUlOVF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY29uc3RyYWludFR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJhaW50VHlwZVR5cGUoKSwgY29uc3RyYWludFR5cGVUeXBlLCBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnRhY3RUeXBlKFN0cmluZyBjb250YWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29udGFjdFR5cGVfTWF4TGVuZ3RoKGNvbnRhY3RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnRhY3RUeXBlX01heExlbmd0aChTdHJpbmcgY29udGFjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvbnRhY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFjdFR5cGUoKSwgY29udGFjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZShCaWdJbnRlZ2VyIGNvc3RSYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihjb3N0UmF0ZVRhYmxlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ29zdFJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQ09TVF9SQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvc3RSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY29zdFJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBDT1NUX1JBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjb3N0UmF0ZVRhYmxlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKSwgY29zdFJhdGVUYWJsZVR5cGUsIENPU1RfUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoQmlnSW50ZWdlciBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVfRW51bWVyYXRpb24oY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKCksIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZShTdHJpbmcgY3VycmVuY3lTeW1ib2xUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFR5cGVfTWF4TGVuZ3RoKGN1cnJlbmN5U3ltYm9sVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGN1cnJlbmN5U3ltYm9sVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY3VycmVuY3lTeW1ib2xUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDIwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXJyZW5jeVN5bWJvbFR5cGUoKSwgY3VycmVuY3lTeW1ib2xUeXBlLCBsZW5ndGgsIDIwLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXlUeXBlVHlwZShCaWdJbnRlZ2VyIGRheVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbihkYXlUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRGF5VHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRheVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkYXlUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGF5VHlwZVR5cGUoKSwgZGF5VHlwZVR5cGUsIERBWV9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoQmlnSW50ZWdlciBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSwgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlLCBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVfRW51bWVyYXRpb24oZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCksIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlLCBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0VGFza1R5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfVEFTS19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX1RBU0tfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGRlZmF1bHRUYXNrVHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRUYXNrVHlwZVR5cGUoKSwgZGVmYXVsdFRhc2tUeXBlVHlwZSwgREVGQVVMVF9UQVNLX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUoKSwgZHVyYXRpb25Gb3JtYXRUeXBlLCBEVVJBVElPTl9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTEoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTEoKSwgZHVyYXRpb25Gb3JtYXRUeXBlMSwgRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlMik7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpLCBkdXJhdGlvbkZvcm1hdFR5cGUyLCBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlM19FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGUzKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUzKCksIGR1cmF0aW9uRm9ybWF0VHlwZTMsIERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTQoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU0X0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTQoKSwgZHVyYXRpb25Gb3JtYXRUeXBlNCwgRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlNSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU1PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlNSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpLCBkdXJhdGlvbkZvcm1hdFR5cGU1LCBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbihlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZWFybmVkVmFsdWVNZXRob2RUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKSwgZWFybmVkVmFsdWVNZXRob2RUeXBlLCBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKEJpZ0ludGVnZXIgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbihlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKSwgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGUoU3RyaW5nIGVtYWlsQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKGVtYWlsQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+RW1haWwgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW1haWxBZGRyZXNzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGVtYWlsQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGVtYWlsQWRkcmVzc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbWFpbEFkZHJlc3NUeXBlKCksIGVtYWlsQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZShTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlX01heExlbmd0aChleHRlcm5hbFRhc2tQcm9qZWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlX01heExlbmd0aChTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGV4dGVybmFsVGFza1Byb2plY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKSwgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZShTdHJpbmcgZml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uKGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJICIxIiwKLQkJCQkgIjIiLAotCQkJCSAiMyIKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24oU3RyaW5nIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZml4ZWRDb3N0QWNjcnVhbFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCksIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZShCaWdJbnRlZ2VyIGZ5U3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKGZ5U3RhcnREYXRlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGZ5U3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhmeVN0YXJ0RGF0ZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEZZU3RhcnREYXRlVHlwZSgpLCBmeVN0YXJ0RGF0ZVR5cGUsIEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUdyb3VwVHlwZShTdHJpbmcgZ3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVHcm91cFR5cGVfTWF4TGVuZ3RoKGdyb3VwVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Hcm91cCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlR3JvdXBUeXBlX01heExlbmd0aChTdHJpbmcgZ3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBncm91cFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRHcm91cFR5cGUoKSwgZ3JvdXBUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZV9NYXhMZW5ndGgoaHlwZXJsaW5rQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUoKSwgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTEoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTFfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlMS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTIoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZShTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1N1YkFkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMl9NYXhMZW5ndGgoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCksIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUoU3RyaW5nIGh5cGVybGlua1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGVfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUoKSwgaHlwZXJsaW5rVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxKFN0cmluZyBoeXBlcmxpbmtUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rVHlwZTFfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1R5cGUxLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rVHlwZTEoKSwgaHlwZXJsaW5rVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMihTdHJpbmcgaHlwZXJsaW5rVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUyKCksIGh5cGVybGlua1R5cGUyLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSW5pdGlhbHNUeXBlKFN0cmluZyBpbml0aWFsc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUluaXRpYWxzVHlwZV9NYXhMZW5ndGgoaW5pdGlhbHNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkluaXRpYWxzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVJbml0aWFsc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBpbml0aWFsc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGluaXRpYWxzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxzVHlwZSgpLCBpbml0aWFsc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlKEJpZ0ludGVnZXIgbGFnRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGFnRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihsYWdGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVMYWdGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExBR19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxhZ0Zvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsYWdGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxhZ0Zvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldExhZ0Zvcm1hdFR5cGUoKSwgbGFnRm9ybWF0VHlwZSwgTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24obGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpLCBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKCksIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSwgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFuYWdlclR5cGUoU3RyaW5nIG1hbmFnZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVNYW5hZ2VyVHlwZV9NYXhMZW5ndGgobWFuYWdlclR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFuYWdlclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBtYW5hZ2VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbWFuYWdlclR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRNYW5hZ2VyVHlwZSgpLCBtYW5hZ2VyVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlKFN0cmluZyBtYXRlcmlhbExhYmVsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTWF0ZXJpYWxMYWJlbFR5cGVfTWF4TGVuZ3RoKG1hdGVyaWFsTGFiZWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYXRlcmlhbExhYmVsVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG1hdGVyaWFsTGFiZWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBtYXRlcmlhbExhYmVsVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hdGVyaWFsTGFiZWxUeXBlKCksIG1hdGVyaWFsTGFiZWxUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUoU3RyaW5nIG5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZV9NYXhMZW5ndGgobmFtZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZSgpLCBuYW1lVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlMShTdHJpbmcgbmFtZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZTFfTWF4TGVuZ3RoKG5hbWVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OYW1lIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUxX01heExlbmd0aChTdHJpbmcgbmFtZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBuYW1lVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZTEoKSwgbmFtZVR5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUyKFN0cmluZyBuYW1lVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5hbWVUeXBlMl9NYXhMZW5ndGgobmFtZVR5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5hbWUgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG5hbWVUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVUeXBlMigpLCBuYW1lVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTMoU3RyaW5nIG5hbWVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTmFtZVR5cGUzX01heExlbmd0aChuYW1lVHlwZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlM19NYXhMZW5ndGgoU3RyaW5nIG5hbWVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUzLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDI1NTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZVR5cGUzKCksIG5hbWVUeXBlMywgbGVuZ3RoLCAyNTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlKEJpZ0ludGVnZXIgbmV3VGFza1N0YXJ0RGF0ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKG5ld1Rhc2tTdGFydERhdGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBORVdfVEFTS19TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKG5ld1Rhc2tTdGFydERhdGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROZXdUYXNrU3RhcnREYXRlVHlwZSgpLCBuZXdUYXNrU3RhcnREYXRlVHlwZSwgTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTlRBY2NvdW50VHlwZShTdHJpbmcgbnRBY2NvdW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTlRBY2NvdW50VHlwZV9NYXhMZW5ndGgobnRBY2NvdW50VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOVEFjY291bnRUeXBlX01heExlbmd0aChTdHJpbmcgbnRBY2NvdW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbnRBY2NvdW50VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5UQWNjb3VudFR5cGUoKSwgbnRBY2NvdW50VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlKFN0cmluZyBvdXRsaW5lTnVtYmVyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlT3V0bGluZU51bWJlclR5cGVfTWF4TGVuZ3RoKG91dGxpbmVOdW1iZXJUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lTnVtYmVyVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG91dGxpbmVOdW1iZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBvdXRsaW5lTnVtYmVyVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVOdW1iZXJUeXBlKCksIG91dGxpbmVOdW1iZXJUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZShCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24ob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhvdmVydGltZVJhdGVGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlKCksIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMShCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihvdmVydGltZVJhdGVGb3JtYXRUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhvdmVydGltZVJhdGVGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKSwgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGUoU3RyaW5nIHBob25ldGljQWxpYXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVQaG9uZXRpY0FsaWFzVHlwZV9NYXhMZW5ndGgocGhvbmV0aWNBbGlhc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljQWxpYXNUeXBlX01heExlbmd0aChTdHJpbmcgcGhvbmV0aWNBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHBob25ldGljQWxpYXNUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaG9uZXRpY0FsaWFzVHlwZSgpLCBwaG9uZXRpY0FsaWFzVHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNzVHlwZShTdHJpbmcgcGhvbmV0aWNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUGhvbmV0aWNzVHlwZV9NYXhMZW5ndGgocGhvbmV0aWNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QaG9uZXRpY3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBwaG9uZXRpY3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwaG9uZXRpY3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhvbmV0aWNzVHlwZSgpLCBwaG9uZXRpY3NUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZml4VHlwZShTdHJpbmcgcHJlZml4VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUHJlZml4VHlwZV9NYXhMZW5ndGgocHJlZml4VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QcmVmaXggVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBwcmVmaXhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwcmVmaXhUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmVmaXhUeXBlKCksIHByZWZpeFR5cGUsIGxlbmd0aCwgNTAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJhdGVUYWJsZVR5cGUoQmlnSW50ZWdlciByYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKHJhdGVUYWJsZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMocmF0ZVRhYmxlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmF0ZVRhYmxlVHlwZSgpLCByYXRlVGFibGVUeXBlLCBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZShCaWdJbnRlZ2VyIHJvbGx1cFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbihyb2xsdXBUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlUm9sbHVwVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlJvbGx1cCBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHJvbGx1cFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhyb2xsdXBUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sbHVwVHlwZVR5cGUoKSwgcm9sbHVwVHlwZVR5cGUsIFJPTExVUF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihzdGFuZGFyZFJhdGVGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKSwgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpLCBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJqZWN0VHlwZShTdHJpbmcgc3ViamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN1YmplY3RUeXBlX01heExlbmd0aChzdWJqZWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5TdWJqZWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJqZWN0VHlwZV9NYXhMZW5ndGgoU3RyaW5nIHN1YmplY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBzdWJqZWN0VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN1YmplY3RUeXBlKCksIHN1YmplY3RUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlKFN0cmluZyBzdWJwcm9qZWN0TmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN1YnByb2plY3ROYW1lVHlwZV9NYXhMZW5ndGgoc3VicHJvamVjdE5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlX01heExlbmd0aChTdHJpbmcgc3VicHJvamVjdE5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBzdWJwcm9qZWN0TmFtZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdWJwcm9qZWN0TmFtZVR5cGUoKSwgc3VicHJvamVjdE5hbWVUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGl0bGVUeXBlKFN0cmluZyB0aXRsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVRpdGxlVHlwZV9NYXhMZW5ndGgodGl0bGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlRpdGxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUaXRsZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyB0aXRsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHRpdGxlVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlVHlwZSgpLCB0aXRsZVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZShCaWdJbnRlZ2VyIHR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZV9FbnVtZXJhdGlvbih0eXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUoKSwgdHlwZVR5cGUsIFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMShCaWdJbnRlZ2VyIHR5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uKHR5cGVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlMSgpLCB0eXBlVHlwZTEsIFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTIoQmlnSW50ZWdlciB0eXBlVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbih0eXBlVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGUyKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTIoKSwgdHlwZVR5cGUyLCBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUzKEJpZ0ludGVnZXIgdHlwZVR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24odHlwZVR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1NiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1OSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2NSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2OCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjcwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjczIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjc2IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlMyk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUzKCksIHR5cGVUeXBlMywgVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNChCaWdJbnRlZ2VyIHR5cGVUeXBlNCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uKHR5cGVUeXBlNCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlNCgpLCB0eXBlVHlwZTQsIFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTUoQmlnSW50ZWdlciB0eXBlVHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbih0eXBlVHlwZTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlNTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlNSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGU1KTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTUoKSwgdHlwZVR5cGU1LCBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVUlEVHlwZShTdHJpbmcgdWlkVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVUlEVHlwZV9NYXhMZW5ndGgodWlkVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5VSUQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVJRFR5cGVfTWF4TGVuZ3RoKFN0cmluZyB1aWRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSB1aWRUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDE2OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRVSURUeXBlKCksIHVpZFR5cGUsIGxlbmd0aCwgMTYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVuaXRUeXBlKEJpZ0ludGVnZXIgdW5pdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVVuaXRUeXBlX0VudW1lcmF0aW9uKHVuaXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBVTklUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Vbml0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHVuaXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHVuaXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRVbml0VHlwZSgpLCB1bml0VHlwZSwgVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZShCaWdJbnRlZ2VyIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24odmFsdWVsaXN0U29ydE9yZGVyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBWQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKCksIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIFZBTFVFTElTVF9TT1JUX09SREVSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlKEJpZ0ludGVnZXIgd2Vla1N0YXJ0RGF5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbih3ZWVrU3RhcnREYXlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdFRUtfU1RBUlRfREFZX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5XZWVrIFN0YXJ0IERheSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHdlZWtTdGFydERheVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXRUVLX1NUQVJUX0RBWV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHdlZWtTdGFydERheVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlZWtTdGFydERheVR5cGUoKSwgd2Vla1N0YXJ0RGF5VHlwZSwgV0VFS19TVEFSVF9EQVlfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtDb250b3VyVHlwZShCaWdJbnRlZ2VyIHdvcmtDb250b3VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uKHdvcmtDb250b3VyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+V29yayBDb250b3VyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrQ29udG91clR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrQ29udG91clR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXT1JLX0NPTlRPVVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrQ29udG91clR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtDb250b3VyVHlwZSgpLCB3b3JrQ29udG91clR5cGUsIFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGUoQmlnSW50ZWdlciB3b3JrRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24od29ya0Zvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVdvcmtGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMod29ya0Zvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtGb3JtYXRUeXBlKCksIHdvcmtGb3JtYXRUeXBlLCBXT1JLX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0dyb3VwVHlwZShCaWdJbnRlZ2VyIHdvcmtHcm91cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVdvcmtHcm91cFR5cGVfRW51bWVyYXRpb24od29ya0dyb3VwVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0dyb3VwVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBXT1JLX0dST1VQX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgd29ya0dyb3VwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrR3JvdXBUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrR3JvdXBUeXBlKCksIHdvcmtHcm91cFR5cGUsIFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLX0gLy9Nc3Byb2plY3RWYWxpZGF0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0WE1MSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNkNzdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW50ZXJuYWwuWE1MQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIHNsaWdodGx5IGN1c3RvbWl6ZWQgWE1MSGVscGVySW1wbCBjbGFzcwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdFhNTEhlbHBlckltcGwgZXh0ZW5kcyBYTUxIZWxwZXJJbXBsIGltcGxlbWVudHMgWE1MSGVscGVyIHsKLQotCSBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgW10gRURBVEVfRk9STUFUUyA9Ci0JICB7Ci0JCW5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzIiksCi0JICAgIG5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWiIpLAotCSAgICBuZXcgU2FmZVNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGRaIikKLQkgIH07Ci0JIAotCSAvKioKLQkgICogQ29uc3RydWN0b3IKLQkgICogQHBhcmFtIHJlc291cmNlCi0JICAqLwotCXB1YmxpYyBNc3Byb2plY3RYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBib29sZWFuIHZhbHVlIHRvIGVpdGhlciAiMCIgb3IgIjEiCi0JICogQ29udmVydCBEYXRlVGltZSB2YWx1ZSB0byBiZSBjb21wYXRpYmxlIHdpdGggTVMgcHJvamVjdAotCSAqLwotCSBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRmFjdG9yeSBmYWN0b3J5LCBFRGF0YVR5cGUgZGF0YVR5cGUsIE9iamVjdCB2YWx1ZSkKLQkgIHsKLQkJIAotLy8JCSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW1wbC5YTUxUeXBlRmFjdG9yeUltcGwgYUZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZUZhY3RvcnlJbXBsKCk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkJCQgZGF0YVR5cGUgbmFtZSA9ICIgKyBkYXRhVHlwZS5nZXROYW1lKCkpOwotCQkgCi0JCSBpZiAoIkJvb2xlYW4iLmVxdWFsc0lnbm9yZUNhc2UoZGF0YVR5cGUuZ2V0TmFtZSgpKSkgewotLy8JCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgbmVlZCB0byBvdmVycmlkZSB0aGUgQm9vbGVhbjogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSBTdHJpbmcgcnMgPSAiMCI7Ci0JCQkJIHRyeSB7Ci0JCQkJCSBCb29sZWFuIGJPYmplY3QgPSAoQm9vbGVhbil2YWx1ZTsKLQkJCQkJIGlmIChiT2JqZWN0LmJvb2xlYW5WYWx1ZSgpKQotCQkJCQkJIHJzID0gIjEiOwotCQkJCSB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLS8vCQkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb252ZXJ0ZWQgc3RyaW5nID0gIiArIHJzKTsKLQkJCQkgcmV0dXJuIHJzOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9IGVsc2UgaWYgKCJEYXRlVGltZSIuZXF1YWxzSWdub3JlQ2FzZShkYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBEYXRlVGltZTogIiArIHZhbHVlLmdldENsYXNzKCkgKyAiLCIgKyB2YWx1ZSk7Ci0JCQkgaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkgICBTdHJpbmcgcnMgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJCSAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpCi0JCQkJICAgIHsKLQkJCQkgICAgICBycyA9IEVEQVRFX0ZPUk1BVFNbMF0uZm9ybWF0KChEYXRlKXZhbHVlKTsKLQkJCQkgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFhNTENhbGVuZGFyKXsKLQkJCQkJICBycyA9ICgoWE1MQ2FsZW5kYXIpdmFsdWUpLnRvU3RyaW5nKCk7Ci0JCQkJCSAgaW50IGlkeCA9IHJzLmluZGV4T2YoJy4nKTsKLQkJCQkJICBpZiAoaWR4ID4gMCkKLQkJCQkJCSAgcnMgPSBycy5zdWJzdHJpbmcoMCwgaWR4KTsKLQkJCQkJfQotLy8JCQkJICAgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIHN0cmluZyA9ICIgKyBycyk7Ci0JCQkJICAgcmV0dXJuIHJzOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9Ci0JCSAKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgRUZhY3RvcnksIEVEYXRhVHlwZSwgdmFsdWUgPSAiICsgZmFjdG9yeSArICIsIiArIGRhdGFUeXBlICsgIiwiICsgdmFsdWUpOwotCQkgU3RyaW5nIHJzID0gc3VwZXIuY29udmVydFRvU3RyaW5nKCBmYWN0b3J5LCAgZGF0YVR5cGUsICB2YWx1ZSk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbnZlcnRlZCBzdHJpbmcgKG91dCkgPSAiICsgcnMpOwotCQkgcmV0dXJuIHJzOwotCSAgfQotCSAKLQkgLyoqCi0JICAqIENvbnZlcnQgdGhlIDEgb3IgMCBib29sZWFuIHZhbHVlIHRvIGFuIEJvb2xlYW4gT2JqZWN0Ci0JICAqIGNvbnZlcnQgdGhlIGRhdGV0aW1lIHN0cmluZyBpbnRvIFhNTENhbGVuZGFyIG9iamVjdC4KLQkgICovCi0JIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRmFjdG9yeSBlRmFjdG9yeSwgRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIHZhbHVlKQotCSAgewotCQkgaWYgKCJCb29sZWFuIi5lcXVhbHNJZ25vcmVDYXNlKGVEYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBCb29sZWFuOiAiICsgdmFsdWUpOwotCQkJIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiMSIpKQotCQkJCQkgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCQkgZWxzZQotCQkJCQkgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkgfQotCQkJIHJldHVybiBudWxsOyAKLQkJIH0gZWxzZSBpZiAoIkRhdGVUaW1lIi5lcXVhbHNJZ25vcmVDYXNlKGVEYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBEYXRlVGltZTogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSAgIHJldHVybiBuZXcgWE1MQ2FsZW5kYXIoY29sbGFwc2VXaGl0ZVNwYWNlKHZhbHVlKSwgWE1MQ2FsZW5kYXIuREFURVRJTUUpOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9Ci0JCSAKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgRUZhY3RvcnksIEVEYXRhVHlwZSwgdmFsdWUgPSAiICsgZUZhY3RvcnkgKyAiLCIgKyBlRGF0YVR5cGUgKyAiLCIgKyB2YWx1ZSk7Ci0JCSBPYmplY3Qgcm8gPSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKCBlRmFjdG9yeSwgIGVEYXRhVHlwZSwgIHZhbHVlKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIG9iamVjdCAoaW4pID0gIiArIHJvKTsKLQkJIHJldHVybiBybzsKLQkgIH0KLQkgCi0JIHByb3RlY3RlZCBTdHJpbmcgY29sbGFwc2VXaGl0ZVNwYWNlKFN0cmluZyB2YWx1ZSkKLQkgewotCQkgcmV0dXJuIFhNTFR5cGVVdGlsLm5vcm1hbGl6ZSh2YWx1ZSwgdHJ1ZSk7Ci0JIH0KLQkgIAotCSBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCBleHRlbmRzIFNpbXBsZURhdGVGb3JtYXQKLQkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgU2FmZVNpbXBsZURhdGVGb3JtYXQoU3RyaW5nIHBhdHRlcm4pCi0JICAgIHsKLQkgICAgICBzdXBlcihwYXR0ZXJuKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0ZSBwYXJzZShTdHJpbmcgc291cmNlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgICAgewotCSAgICAgIHJldHVybiBzdXBlci5wYXJzZShzb3VyY2UpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQoRGF0ZSBkYXRlLCBTdHJpbmdCdWZmZXIgdG9BcHBlbmRUbywgRmllbGRQb3NpdGlvbiBwb3MpCi0JICAgIHsKLQkgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gc3VwZXIuZm9ybWF0KGRhdGUsIHRvQXBwZW5kVG8sIHBvcyk7Ci0vLwkgICAgICByZXN1bHQuaW5zZXJ0KHJlc3VsdC5sZW5ndGgoKSAtIDIsICI6Iik7Ci0JICAgICAgcmV0dXJuIHJlc3VsdDsKLQkgICAgfQotCSAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDNkODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTc0MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRmYjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZlYXR1cmVQbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm07IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNDk2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFhODhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4zLjAgd2l0aCBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb246IDMuMy4wXG5cCi1CdWlsZCBpZDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZVxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkOGIzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIG5sLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2VjbGlwc2UzMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2ZiZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCBtZWQgRU1GIEdFRiBHTUYKLQotYmx1cmI9RWNsaXBzZS1wbGF0Zm9ybVxuXAotXG5cCi1WZXJzaW9uOiAzLjMuMFxuXAotQnlnLWlkOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLUJlc1x1MDBmOGcgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1EZXR0ZSBwcm9kdWt0IGluZGVob2xkZXIgc29mdHdhcmUsIGRlciBlciB1ZHZpa2xldCBhZlxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3N2ZhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIG1pdCBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb246IDMuMy4wXG5cCi1CdWlsZC1JRDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotQmVzdWNoZW4gU2llIGRpZSBXZWJzZWl0ZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtLlxuXAotXG5cCi1EaWVzZXMgUHJvZHVrdCBlbnRoXHUwMGU0bHQgU29mdHdhcmUsIGRpZSB2b24gZGVyXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykgZW50d2lja2VsdCB3dXJkZS4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzM4YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCBjb24gRU1GIEdFRiBHTUYKLQotYmx1cmI9UGxhdGFmb3JtYSBFY2xpcHNlXG5cCi1cblwKLVZlcnNpXHUwMGYzbjogMy4zLjBcblwKLUlEIGRlIGJ1aWxkOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDAsIDIwMDcuICBSZXNlcnZhZG9zIHRvZG9zIGxvcyBkZXJlY2hvcy5cblwKLVZpc2l0ZSBsYSBwXHUwMGUxZ2luYSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLUVzdGUgcHJvZHVjdG8gaW5jbHV5ZSBzb2Z0d2FyZSBkZXNhcnJvbGxhZG8gcG9yIGxhXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZnIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTgyNDdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4zLjAgYXZlYyBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb24gOiAzLjMuMFxuXAotSUQgZGUgY29uc3RydWN0aW9uIDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXRleiBsYSBwYWdlIHN1aXZhbnRlIDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1DZSBwcm9kdWl0IGNvbnRpZW50IGRlcyBsb2dpY2llbHMgZFx1MDBlOXZlbG9wcFx1MDBlOXMgcGFyXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjU1YjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPVBpYXR0YWZvcm1hIEVjbGlwc2UgMy4zLjAgY29uIEVNRiBHRUYgR01GCi0KLWJsdXJiPVBpYXR0YWZvcm1hIEVjbGlwc2VcblwKLVxuXAotVmVyc2lvbmU6IDMuMy4wXG5cCi1JZCBidWlsZDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidXRvciBFY2xpcHNlIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1WaXNpdGFyZSBsJ2luZGlyaXp6byBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLVF1ZXN0byBwcm9kb3R0byBpbmNsdWRlIHNvZnR3YXJlIHN2aWx1cHBhdG8gZGFcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODM2OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2phL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCB3aXRoIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOiAzLjMuMFxuXAotXHUzMGQzXHUzMGViXHUzMGM5IElEOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtIFx1MzA5Mlx1NTNjMlx1NzE2N1x1MzAwMlxuXAotXG5cCi1cdTMwNTNcdTMwNmVcdTg4ZmRcdTU0YzFcdTMwNmJcdTMwNmZcdTMwMDFBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLylcblwKLVx1MzA2Ylx1MzA4OFx1MzA4YVx1OTU4Ylx1NzY3YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiZFx1MzBkNVx1MzBjOFx1MzBhNlx1MzBhN1x1MzBhMlx1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2tvL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwva28vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhZjlkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwva28vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFx1ZDUwY1x1YjdhYlx1ZDNmYyAzLjMuMChFTUYgR0VGIEdNRiBcdWQzZWNcdWQ1NjgpCi0KLWJsdXJiPUVjbGlwc2UgXHVkNTBjXHViN2FiXHVkM2ZjXG5cCi1cblwKLVx1YmM4NFx1YzgwNDogMy4zLjBcblwKLVx1YmU0Y1x1YjRkYyBJRDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybSBcdWM2ZjlcdWMwYWNcdWM3NzRcdWQyYjhcdWI5N2MgXHViYzI5XHViYjM4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LlxuXAotXG5cCi1cdWM3NzQgXHVjODFjXHVkNDg4XHVjNWQwXHViMjk0IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pXHVjNWQwXHVjMTFjIFxuXAotXHVhYzFjXHViYzFjXHVkNTVjIFx1YzE4Y1x1ZDUwNFx1ZDJiOFx1YzZlOFx1YzViNFx1YWMwMCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0YjMyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIGNvbSBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNcdTAwZTNvOiAzLjMuMFxuXAotSUQgZGEgQ29uc3RydVx1MDBlN1x1MDBlM286IEkyMDA3MDYyNS0xNTAwXG5cCi1cblwKLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA3LiBUb2RvcyBvcyBkaXJlaXRvcyByZXNlcnZhZG9zLlxuXAotVmlzaXRlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKLVxuXAotRXN0ZSBwcm9kdXRvIGluY2x1aSBzb2Z0d2FyZSBkZXNlbnZvbHZpZG8gcGVsYVxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3J1L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcnUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MWYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcnUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRWNsaXBzZSAzLjMuMCBcdTA0NDEgRU1GIEdFRiBHTUYKLQotYmx1cmI9XHUwNDFmXHUwNDNiXHUwNDMwXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwIEVjbGlwc2VcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiAzLjMuMFxuXAotXHUwNDE4XHUwNDE0IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzODogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBcdTA0MTJcdTA0NDFcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQ0Yi5cblwKLVx1MDQxZlx1MDQzZVx1MDQ0MVx1MDQzNVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTA0MTIgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQzYVx1MDQzZVx1MDQzNCwgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5XG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvemgvQ04vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDlhZTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPVx1NWUyNlx1NjcwOSBFTUYgR0VGIEdNRiBcdTc2ODQgRWNsaXBzZSBQbGF0Zm9ybSAzLjMuMAotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYTMuMy4wXG5cCi1cdTVkZTVcdTRmNWNcdTcyNDhcdTY3MmNcdTY4MDdcdThiYzZcdWZmMWFJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1cdThiZjdcdThiYmZcdTk1ZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTY3MmNcdTRlYTdcdTU0YzFcdTUzMDVcdTU0MmJcdTc1MzEgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25cdWZmMDhodHRwOi8vd3d3LmFwYWNoZS5vcmcvXHVmZjA5XHU1ZjAwXHU1M2QxXHU3Njg0XHU4ZjZmXHU0ZWY2XG4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzUxYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCB3aXRoIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgXHU1ZTczXHU1M2YwXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYTMuMy4wXG5cCi1cdTVlZmFcdTdmNmUgSURcdWZmMWFJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1cdThhY2JcdTkwMjBcdThhMmEgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTY3MmNcdTc1MjJcdTU0YzFcdTUzMDVcdTU0MmIgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnL1xuXAotXHU2MjQwXHU5NThiXHU3NjdjXHU3Njg0XHU4ZWRmXHU5YWQ0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTQ2NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgUGxhdGZvcm0gRmVhdHVyZQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgUGxhdGZvcm0gRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA5MjQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS93ZWxjb21lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTx3ZWxjb21lUGFnZSAKLQl0aXRsZT0iRWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKEVNRikiPgotCi08aW50cm8+RU1GIGlzIGEgSmF2YS9YTUwgZnJhbWV3b3JrIGZvciBnZW5lcmF0aW5nIHRvb2xzIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMKLWJhc2VkIG9uIHNpbXBsZSBjbGFzcyBtb2RlbHMuCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVNRj88L2I+Ci0JUmVhZCB0aGUgPHRvcGljIGhyZWY9Ii9vcmcuZWNsaXBzZS5lbWYuZG9jL3JlZmVyZW5jZXMvb3ZlcnZpZXcvRU1GLmh0bWwiPm92ZXJ2aWV3PC90b3BpYz4gYXJ0aWNsZSB0byBsZWFybiBhYm91dCBFTUYuCi0JVGhlbiwgZm9sbG93IHRoZSA8dG9waWMgaHJlZj0iL29yZy5lY2xpcHNlLmVtZi5kb2MvdHV0b3JpYWxzL2NsaWJtb2QvY2xpYm1vZC5odG1sIj50dXRvcmlhbDwvdG9waWM+IHRvIHNlZSBob3cgZWFzeSBpdCBpcyB0byBnZW5lcmF0ZSBhIG1vZGVsLgotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCVRoaXMgaXMgdGhlIG9mZmljaWFsIHNpdGUgb2YgRU1GOiA8dG9waWMgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mPC90b3BpYz4KLTwvaXRlbT4KLQotPC93ZWxjb21lUGFnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U2ZTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MTg3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UuaGVscC5iYXNlLAotIG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjgyNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1JlcG9ydGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9SZXBvcnRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzhjYzhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1JlcG9ydGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9XZWJQdWJsaXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmRjZjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZmU2ODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCRUdJTiBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIERlZmF1bHQgRmVlZGJhY2sgVVJMCi1mZWVkYmFja1VSTD1odHRwOi8vd3d3LnB1Ymxpc2hlZF93ZWJzaXRlLmNvbS9mZWVkYmFjawotCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24KLXB1Ymxpc2hDb25maWdBY3Rpb249JlB1Ymxpc2guLi4KLXB1Ymxpc2hDb25maWdBY3Rpb25Ub29sdGlwPVB1Ymxpc2ggYSB3ZWIgc2l0ZSBmb3IgYSBjb25maWd1cmF0aW9uCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1yb290UGFnZU5hbWU9UHVibGlzaGluZy9Ccm93c2luZwotcm9sZURpYWdyYW1QYWdlTmFtZT1Sb2xlIERpYWdyYW0KLWFjdGl2aXR5RGlhZ3JhbVBhZ2VOYW1lPUFjdGl2aXR5IERpYWdyYW1zCi1zdXBwb3J0aW5nUGx1Z2luUGFnZU5hbWU9U3VwcG9ydGluZyBQbHVnaW5zCi1wdWJsaXNoaW5nT3B0aW9ucz1QdWJsaXNoaW5nIE9wdGlvbnMKLQotIyBQdWJsaXNoaW5nIEFjdGlvbnMKLWNvbmZpZ0FjdGlvblNldD1Db25maWd1cmF0aW9uCi1jb25maWdNZW51PSZDb25maWd1cmF0aW9uCi0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24KLXByaW50Q29uZmlnQWN0aW9uPVByaW50Ci0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUKLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4KLSN0aXRsZT1PcGVuVVAvQmFzaWMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzQ2NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0icHVibGlzaENvbmZpZ1dpemFyZCIKLSAgICAgICAgIG5hbWU9IlB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYWl0b24gV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZCIgLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlY29uZmlnQWN0aW9uU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5tZW51LmNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJWNvbmZpZ01lbnUiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiLz4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnMuUHVibGlzaENvbmZpZ0FjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY29uZmlndXJhdGlvbl9wdWJsaXNoX2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9XZWJQdWJsaXNoLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5hY3Rpb25zLlB1Ymxpc2giCi0gICAgICAgICAgICAgICBsYWJlbD0iJXB1Ymxpc2hDb25maWdBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubWVudS5jb25maWd1cmF0aW9uL2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIi8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8L2FjdGlvblNldD4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8L2FjdGlvblNldD4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+ICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotICAgICAgPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8cGFydAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yIj4KLSAgICAgICAgIDwvcGFydD4KLSAgICAgIDwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVyb290UGFnZU5hbWUiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVyb2xlRGlhZ3JhbVBhZ2VOYW1lIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLkFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLkFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotCQkgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLQkJICAgIG5hbWU9IiVhY3Rpdml0eURpYWdyYW1QYWdlTmFtZSIvPgotCSAgPHBhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5TdXBwb3J0aW5nUGx1Z2luc1ByZWZlcmVuY2VQYWdlIgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlN1cHBvcnRpbmdQbHVnaW5QcmVmZXJlbmNlUGFnZSIKLQkJICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlc3VwcG9ydGluZ1BsdWdpblBhZ2VOYW1lIi8+ICAgIAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmRMaXN0ZW5lcnMiPgotICAgICAgPGNvbW1hbmRMaXN0ZW5lciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuRGVsZXRlQ29uZmlnQ29tbWFuZExpc3RlbmVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zY2hlbWEvUHVibGlzaENvbmZpZ1dpemFyZC5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1Yjg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zY2hlbWEvUHVibGlzaENvbmZpZ1dpemFyZC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSIgaWQ9InB1Ymxpc2hDb25maWdXaXphcmQiIG5hbWU9IlB1Ymxpc2ggTWV0aG9kIENvbmZndXJhdGlvbiBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwdWJsaXNoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBleHRlbmRlci4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5JUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBleHRlbnNpb24gLSAmcXVvdDtyZXBsYWNlJnF1b3Q7IG9yICZxdW90O25ldyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdG8gYmUgcmVwbGFjZWQgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW5nIGEgbmV3IHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW5zZXJ0aW9uIHR5cGUgZm9yIGEgbmV3IHdpemFyZCBwYWdlIC0gJnF1b3Q7YmVmb3JlJnF1b3Q7IG9yICZxdW90O2FmdGVyJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwdWJsaXNoZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVyLiBUaGlzIGNsYXNzIG11c3QgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZWZydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIHVzZWQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlnV2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZEV4dGVuZGVyCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLk15UHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuTXlTZWxlY3RQdWJsaXNoT3B0aW9uc1BhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuU2VsZWN0UHVibGlzaE9wdGlvbnNQYWdlJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLk15TmV3UHVibGlzaFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7bmV3JnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5TZWxlY3RQdWJsaXNoT3B0aW9uc1BhZ2UmcXVvdDsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIGluc2VydD0mcXVvdDthZnRlciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgCi0gICAgICAgICAmbHQ7cHVibGlzaGVyCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5NeUNvbmZpZ1B1Ymxpc2hlciZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7L3dpemFyZEV4dGVuZGVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI2ODdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYXR0cmlidXRlcyBmb3IgYSBwdWJsaXNoZXIgZXh0ZW5zaW9uIHBvaW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVyRWxlbWVudCB7Ci0JQnVuZGxlIGJ1bmRsZTsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFN0cmluZyBpY29uOwotCXByaXZhdGUgU3RyaW5nIHdpemFyZENsYXNzOwotCXByaXZhdGUgU3RyaW5nIG1hbmFnZXJDbGFzczsJCi0JCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIFB1Ymxpc2hlckVsZW1lbnQgZXh0ZW5zaW9uIHBvaW50Ci0JICogQHBhcmFtIGJ1bmRsZSBCdW5kbGUgdGhlIGJ1bmRsZSB0aGF0IGxhb2QgdGhlIGVsZW1lbnQgZGVmaW5pdGlvbiBmaWxlCi0JICogQHBhcmFtIGlkIFN0cmluZwotCSAqIEBwYXJhbSBsYWJlbCBTdHJpbmcKLQkgKiBAcGFyYW0gaWNvbiBTdHJpbmcgaWNvbiBwYXRoCi0JICogQHBhcmFtIHdpemFyZENsYXNzIFN0cmluZyB0aGUgcHVibGlzaGluZyB3aXphcmQgY2xhc3MuIAotCSAqIFRoaXMgY2xhc3MgbXVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGNsYXNzCi0JICogQHBhcmFtIG1hbmFnZXJDbGFzcyBTdHJpbmcgdGhlIHB1Ymxpc2ggbWFtYWdlciBjbGFzcy4gCi0JICogdGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgdGhlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXIgY2xhc3MuCi0JICovCi0JcHVibGljIFB1Ymxpc2hlckVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBpY29uLCBTdHJpbmcgd2l6YXJkQ2xhc3MsIFN0cmluZyBtYW5hZ2VyQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5pY29uID0gaWNvbjsKLQkJdGhpcy53aXphcmRDbGFzcyA9IHdpemFyZENsYXNzOwotCQl0aGlzLm1hbmFnZXJDbGFzcyA9IG1hbmFnZXJDbGFzczsJCQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2ggd2l6YXJkCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFB1Ymxpc2hXaXphcmQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQgZ2V0UHVibGlzaFdpemFyZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3Mod2l6YXJkQ2xhc3MpOwotCQlyZXR1cm4gKEFic3RyYWN0UHVibGlzaFdpemFyZCkgY2xhenoubmV3SW5zdGFuY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIG1hbmFnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0UHVibGlzaE1hbmFnZXIKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIGdldFB1Ymxpc2hNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNsYXNzIGNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhtYW5hZ2VyQ2xhc3MpOwotCQlyZXR1cm4gKEFic3RyYWN0UHVibGlzaE1hbmFnZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgaWQgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsgCi0JCXJldHVybiBpZDsgCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgbGFiZWwgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBwdWJsaXNoZXIgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoIGljb24gPT0gbnVsbCB8fCBpY29uLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCBpY29uVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpY29uVVJMKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjAzOTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIGZvciB0aGUgcHVibGlzaGluZyBVSSBwbHVnaW4uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFB1Ymxpc2hpbmdVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQl1cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoaW5nVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGUgdGhlIHB1Ymxpc2hpbmcvYnJvd3NpbmcgbGF5b3V0IHNldHRpbmdzLgotCSAqIENhbGwgdGhpcyBtZXRob2Qgd2hlbiBldmVyIHB1Ymxpc2hpbmcvYnJvd3NpbmcgcmVsYXRlZCBwcmVmZXJlbmNlcyBhcmUgY2hhbmdlZC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUxheW91dFNldHRpbmdzKCkgCi0JewotCQkvLyBjYWxsIHRoZSBsaWJyYXJ5IFVJIHRvIHVwZGF0ZSB0aGUgc2V0dGluZ3MgZmlyc3QKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS51cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCQkKLQkJLy8gZ2V0IHRoZSBza2luIHNldHRpbmcgZnJvbSBwcmVmZXJlbmNlCi0JCS8vYm9vbGVhbiBwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCk7CQotCQkvL2Jvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQlib29sZWFuIGV4dHJhRGVzY3JpcHRvckluZm8gPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKCk7Ci0JCS8vYm9vbGVhbiB1c2VuZXdFeHRlbmRzID0gTGlicmFyeVByZWZlcmVuY2VzLmdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKTsKLQkJCi0JCS8vQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbik7Ci0JCS8vQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCk7Ci0JCUJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGV4dHJhRGVzY3JpcHRvckluZm8pOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzJkOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgVUkgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoaW5nVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNsYXNzCi0JCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUHVibGlzaGluZ1VJUmVzb3VyY2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFdlYlNpdGVHcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzaW5nTGF5b3V0R3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpdGxlQW5kTGlua3NHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9va0FuZEZlZWxHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGl0bGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFubmVySW1hZ2VMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWJvdXRIVE1MTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZlZWRiYWNrVVJMTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hJbmRleExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0aW9uR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRXh0ZXJuYWxMaW5rc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QnJva2VuTGlua3NMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQWN0aXZpdHlEZXRhaWxEaWFncmFtc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxheW91dEdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFbXB0eUNhdGVnb3JpZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcGxpY2F0aW9uTmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXRoTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZURlZmF1bHRQYXRoQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZURlZmF1bHRGZWVkYmFja0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlU2VhcmNoZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xpZW50U2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJTaWRlU2VhcmNoUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlV0FSRmlsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VBcHBsZXRDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aGVtZUFuZFNraW5Hcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvd0Jhbm5lckNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RTa2luTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3c0luZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdDb250cmlidXRvckluZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdTYW1lVmlld0luZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRTcGFjaW5nR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tzSG9yaXpvbmFsU3BhY2luZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrc1ZlcnRpY2FsU3BhY2luZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VGV4dExhYmVsR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heExpbmVPZlRleHRMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEhvcml6b25hbFNwYWNpbmdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkVmVydGljYWxTcGFjaW5nRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFRleHRMaW5lc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtUGF0aERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5jZWxQdWJsaXNoQ29uZmlnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpZXdDb25maWdFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXBvcnRFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdWaWV3RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90UHVibGlzaEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aWV3Q29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1JlcG9ydEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVGaWxlc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURpckVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5Ccm93c2VyRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcE5hbWVDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dSZWxhdGVkRGVzY3JpcHRvcnNfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93UmVsYXRlZERlc2NyaXB0b3JzX29wdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEFib3V0UGF0aEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRBYm91dFBhdGhDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlZmF1bHRBY3Rpdml0eVRhYl90ZXh0OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NWVhZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQKLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU9UHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbgotCi0jIFNlbGVjdCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQgUGFnZQotc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLXNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIHB1Ymxpc2guCi1jb25maWdMYWJlbF90ZXh0PU1ldGhvZCBjb25maWd1cmF0aW9uOgotCi0jIFNlbGVjdCBNZXRob2QgQ29uZmlndXJhdGlvbiBDb250ZW50IFdpemFyZCBQYWdlCi1zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29udGVudAotc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbnRlbnQgdG8gcHVibGlzaC4gWW91IGNhbiBjaG9vc2UgdG8gcHVibGlzaCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24gb3Igb25seSBhIGZldyBzZWxlY3QgcHJvY2Vzc2VzIGluIHRoZSBjb25maWd1cmF0aW9uLgotcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uX3RleHQ9UHVibGlzaCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24KLXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbl90ZXh0PVB1Ymxpc2ggc2VsZWN0ZWQgcHJvY2Vzc2VzOgotaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveExhYmVsX3RleHQ9UHVibGlzaCByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzCi0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQotc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMKLXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgcHVibGlzaGluZyBvcHRpb25zLiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgdXNlZCB0byBjdXN0b21pemUgdGhlIGxvb2sgYW5kIGJlaGF2aW9yIG9mIHRoZSBwdWJsaXNoZWQgd2Vic2l0ZS4KLXRpdGxlQW5kTGlua3NHcm91cF90ZXh0PVRpdGxlIGFuZCBsaW5rcwotdGl0bGVMYWJlbF90ZXh0PVRpdGxlOgotYWJvdXRIVE1MTGFiZWxfdGV4dD1BYm91dCBjb250ZW50OgotZmVlZGJhY2tVUkxMYWJlbF90ZXh0PUZlZWRiYWNrIFVSTDoKLWdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0PUdsb3NzYXJ5IGFuZCBpbmRleAotcHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dD1QdWJsaXNoIGdsb3NzYXJ5Ci1wdWJsaXNoSW5kZXhMYWJlbF90ZXh0PVB1Ymxpc2ggaW5kZXgKLWxvb2tBbmRGZWVsR3JvdXBfdGV4dD1Mb29rIGFuZCBmZWVsCi1iYW5uZXJJbWFnZUxhYmVsX3RleHQ9QmFubmVyIGltYWdlOgotdmFsaWRhdGlvbkdyb3VwX3RleHQ9VmFsaWRhdGlvbgotY2hlY2tFeHRlcm5hbExpbmtzTGFiZWxfdGV4dD1DaGVjayBleHRlcm5hbCBoeXBlcmxpbmtzCi1jb252ZXJ0QnJva2VuTGlua3NMYWJlbF90ZXh0PUNvbnZlcnQgYnJva2VuIGh5cGVybGlua3MgdG8gcGxhaW4gdGV4dAotZGlhZ3JhbUdyb3VwX3RleHQ9RGlhZ3JhbXMKLXB1Ymxpc2hBY3Rpdml0eURldGFpbERpYWdyYW1zTGFiZWxfdGV4dD1QdWJsaXNoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB0aGF0IGhhdmUgbm90IGJlZW4gbWFudWFsbHkgY3JlYXRlZAotcHVibGlzaEV4dGVuZGVkQWN0aXZpdHlEaWFncmFtc0xhYmVsX3RleHQ9UHVibGlzaCBhY3Rpdml0eSBkaWFncmFtcyBmb3IgdW5tb2RpZmllZCBhY3Rpdml0eSBleHRlbnNpb25zCi1sYXlvdXRHcm91cF90ZXh0PUxheW91dAotcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUxhYmVsX3RleHQ9U2hvdyByZWxhdGlvbnNoaXAgc3ViLWZvbGRlcnMgaW4gbmF2aWdhdGlvbiB0cmVlcwotcHVibGlzaEV4dHJhRGVzY3JpcHRvckluZm9MYWJlbF90ZXh0PUluY2x1ZGUgbWV0aG9kIGNvbnRlbnQgaW4gZGVzY3JpcHRvciBwYWdlcwotcHVibGlzaEVtcHR5Q2F0ZWdvcmllc0xhYmVsX3RleHQ9UHVibGlzaCBjYXRlZ29yaWVzIHdpdGggbm8gY2F0ZWdvcml6ZWQgZWxlbWVudHMKLXB1Ymxpc2hXZWJTaXRlR3JvdXBfdGV4dD1QdWJsaXNoZWQgd2Vic2l0ZQotYnJvd3NpbmdMYXlvdXRHcm91cF90ZXh0PUJyb3dzaW5nIExheW91dAotc2hvd1JlbGF0ZWREZXNjcmlwdG9yc190ZXh0PVB1Ymxpc2ggcHJvY2VzcyB1c2FnZSBpbiByb2xlLCB0YXNrIGFuZCB3b3JrIHByb2R1Y3QgcGFnZXMgbGlua2luZyB0byByZWxhdGVkIGRlc2NyaXB0b3JzCi1zaG93UmVsYXRlZERlc2NyaXB0b3JzX29wdGlvbl90ZXh0PVNob3cgYWxsIGluZGlyZWN0IChncmVlbikgb2NjdXJyZW5jZXMgaW4gZXh0ZW5kZWQgcGF0dGVybnMKLXNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWVfdGV4dD1TaG93IHRhc2sgZGVzY3JpcHRvcnMgaW4gbmF2aWdhdGlvbiB0cmVlcwotc2VsZWN0RGVmYXVsdEFjdGl2aXR5VGFiX3RleHQ9RGVmYXVsdCB0YWIgZm9yIGFjdGl2aXR5IHBhZ2VzOgotCi0jIFNlbGVjdCBEZXN0aW5hdGlvbiBXaXphcmQgUGFnZQotc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kIHdlYnNpdGUgZm9ybWF0Ci1zZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgZm9ybWF0IGZvciB0aGUgcHVibGlzaGVkIHdlYnNpdGUuCi1kaXJMYWJlbF90ZXh0PURpcmVjdG9yeToKLXdlYkFwcEdyb3VwX3RleHQ9V2Vic2l0ZSBmb3JtYXQKLXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0PVN0YXRpYyB3ZWIgc2l0ZQotZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQ9SmF2YSBFRSB3ZWIgYXBwbGljYXRpb24gcGFja2FnZWQgaW4gYSBXQVIgZmlsZSAocmVxdWlyZXMgSmF2YSBTZXJ2bGV0IDIuMyBvciBhYm92ZSBjb21wbGlhbnQgc2VydmxldCBjb250YWluZXIpCi1pbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dD1JbmNsdWRlIHNlYXJjaCBjYXBhYmlsaXR5Ci13ZWJBcHBsaWNhdGlvbk5hbWVMYWJlbF90ZXh0PVdlYiBhcHBsaWNhdGlvbiBuYW1lOgotCi1kZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQ9RGVzdGluYXRpb24gZGlyZWN0b3J5Ci1wYXRoTGFiZWxfdGV4dD1QYXRoOgotdXNlRGVmYXVsdFBhdGhDaGVja2JveF90ZXh0PVVzZSBkZWZhdWx0IHBhdGgKLXVzZURlZmF1bHRGZWVkYmFja0xhYmVsX3RleHQ9VXNlIGRlZmF1bHQgZmVlZGJhY2sgVVJMCi0KLWluY2x1ZGVTZWFyY2hDaGVja2JveF90ZXh0PUluY2x1ZGUgc2VhcmNoIGNhcGFiaWxpdHkgKHJlcXVpcmVzIGNvbnRhaW5lciBmb3Igc2VydmxldCkKLWluY2x1ZGVTZWFyY2hlc0xhYmVsX3RleHQ9SW5jbHVkZSBzZWFyY2ggY2FwYWJpbGl0eQotY2xpZW50U2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ9IENsaWVudCBzaWRlIHNlYXJjaCAocmVxdWlyZXMgSmF2YSBhcHBsZXQgc3VwcG9ydCBpbiBicm93c2VyKQotc2VydmVyU2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ9IFNlcnZlciBzaWRlIHNlYXJjaCAocmVxdWlyZXMgQ29udGFpbmVyIGZvciBzZXJ2bGV0KQotZ2VuZXJhdGVXQVJGaWxlTGFiZWxfdGV4dD1HZW5lcmF0ZSBXQVIgKFdlYiBBUmNoaXZlKSBmaWxlCi0KLXVzZUFwcGxldENoZWNrYm94X3RleHQ9U3VwcG9ydCB2aWV3IGN1c3RvbWl6YXRpb24gKHJlcXVpcmVzIEphdmEgYXBwbGV0IHN1cHBvcnQgaW4gYnJvd3NlcikKLQotc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RpdGxlPUN1c3RvbWl6ZSBXZWJzaXRlCi1zaXRlQ3VzdG9taXphdGlvbldpemFyZFBhZ2VfdGV4dD1DdXN0b21pemUgV2Vic2l0ZSBsb29rIGFuZCBmZWVsCi10aGVtZUFuZFNraW5Hcm91cF90ZXh0PVRoZW1lIGFuZCBTa2luCi1zaG93QmFubmVyQ2hlY2tib3hfdGV4dD1TaG93IGJhbm5lcgotc2VsZWN0U2tpbkxhYmVsX3RleHQ9U2VsZWN0IHNraW46Ci0KLSMgRklYTUUhIFNob3VsZCB0aGVzZSBiZSB3YXJuaW5nIG1lc3NhZ2VzPwotIyBJbmZvcm1hdGlvbiBNZXNzYWdlCi1pbnZhbGlkVmlld3NJbmZvX21zZz1UaGUgZm9sbG93aW5nIHZpZXcocykgaW4gY29uZmlndXJhdGlvbiAnJ3swfScnIHdpbGwgbm90IGJlIHB1Ymxpc2hlZDoKLWludmFsaWRWaWV3Q29udHJpYnV0b3JJbmZvX21zZz17MH06IFRoZSB2aWV3IGlzIGEgY29udHJpYnV0b3IKLWludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZz17MH06IFRoaXMgdmlldyBpcyBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIHZpZXcKLQotY2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJucwotZGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1EZWxpdmVyeSBQcm9jZXNzZXMKLQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQotcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dD1EZWZhdWx0IHBhdGg6Ci0KLSMgUm9sZSBEaWFncmFtIFByZWZlcmVuY2UgUGFnZQotZWxlbWVudFNwYWNpbmdHcm91cF90ZXh0PVNwYWNpbmcgYmV0d2VlbiB0YXNrIGFuZCB3b3JrIHByb2R1Y3QgZWxlbWVudHMKLXRhc2tzSG9yaXpvbmFsU3BhY2luZ0xhYmVsX3RleHQ9SG9yaXpvbnRhbCBzcGFjaW5nOgotdGFza3NWZXJ0aWNhbFNwYWNpbmdMYWJlbF90ZXh0PVZlcnRpY2FsIHNwYWNpbmc6Ci1lbGVtZW50VGV4dExhYmVsR3JvdXBfdGV4dD1FbGVtZW50IGxhYmVscwotbWF4TGluZU9mVGV4dExhYmVsX3RleHQ9TWF4aW11bSBsaW5lIG9mIHRleHQ6Ci0KLSMgUm9sZSBEaWFncmFtIFByZWZlcmVuY2UgUGFnZSBFcnJvciBNZXNzYWdlcwotaW52YWxpZEhvcml6b25hbFNwYWNpbmdFcnJvcl9tc2c9SG9yaXpvbnRhbCBzcGFjaW5nIG11c3QgYmUgYW4gaW50ZWdlciB3aXRoIHZhbHVlIHJhbmdpbmcgZnJvbSB7MH0gdG8gezF9LgotaW52YWxpZFZlcnRpY2FsU3BhY2luZ0Vycm9yX21zZz1WZXJ0aWNhbCBzcGFjaW5nIG11c3QgYmUgYW4gaW50ZWdlciB3aXRoIHZhbHVlIHJhbmdpbmcgZnJvbSB7MH0gdG8gezF9LgotaW52YWxpZFRleHRMaW5lc0Vycm9yX21zZz1OdW1iZXIgb2YgdGV4dCBsaW5lcyBtdXN0IGJlIGFuIGludGVnZXIgd2l0aCB2YWx1ZSByYW5naW5nIGZyb20gezB9IHRvIHsxfS4KLQotIyBDb25maXJtYXRpb24gRGlhbG9ncwotcHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZT1QdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVRoZSBkZXN0aW5hdGlvbiBwYXRoIGhhcyBiZWVuIHJlc29sdmVkIHRvICcnezB9JycuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci1vdmVyd3JpdGVEaWFsb2dfdGV4dD1UaGUgZGVzdGluYXRpb24gcGF0aCAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBBbGwgZmlsZXMgaW4gdGhlIGZvbGRlciB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1UaGUgcHVibGlzaGluZyBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLgotCi0jIEVycm9yIERpYWxvZ3MKLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1QcmV2aWV3IFB1Ymxpc2hlZCBNZXRob2QgQ29uZmlndXJhdGlvbgotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpZXcgUHVibGlzaGluZyBSZXBvcnQKLQotIyBFcnJvciBNZXNzYWdlcwotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBFOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgdmlldy4gRWRpdCB0aGUgY29uZmlndXJhdGlvbiBhbmQgYWRkIGEgdmlldywgb3Igc2VsZWN0IGFub3RoZXIgY29uZmlndXJhdGlvbi4KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgcHVibGlzaGVkLgotaW52YWxpZFBhdGhFcnJvcl9tc2c9SVVQUDAxMDJFOiBUaGUgZGVzdGluYXRpb24gcGF0aCBpcyBibGFuayBvciBpbnZhbGlkLgotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IFRoZSBkZXN0aW5hdGlvbiBwYXRoIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiB3YXMgbm90IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkuCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogVW5hYmxlIHRvIG9wZW4gYW4gSFRNTCBicm93c2VyIHRvIHByZXZpZXcgdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkU6IFVuYWJsZSB0byBvcGVuIGFuIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSBwdWJsaXNoaW5nIHJlcG9ydC4KLXdlYkFwcE5hbWVFcnJvcl9tc2c9SVVQUDAxMDdFOiBUaGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCi13ZWJBcHBOYW1lQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMDhFOiBUaGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgY2Fubm90IGNvbnRhaW4gdGhlc2UgY2hhcmFjdGVyczogXFwgIyAqID8gIiA8ID4gfCAhICUgLwotaW52YWxpZEFib3V0UGF0aEVycm9yX21zZz1JVVBQMDEwOUU6IFRoZSBwYXRoIGlzIGludmFsaWQuCi1pbnZhbGlkQWJvdXRQYXRoQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMTBFOiBUaGUgcGF0aCBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiAjICogPyAiIDwgPiB8ICEgJSAvCi0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMKLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249Q2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVRoZSBkZXN0aW5hdGlvbiBwYXRoICcnezB9JycgY29udGFpbnMgZmlsZXMgdGhhdCBjYW5ub3QgYmUgZGVsZXRlZC5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIHNwZWNpZnkgYW5vdGhlciBwYXRoLgotY3JlYXRlRGlyRXJyb3JfcmVhc29uPVRoZSBkZXN0aW5hdGlvbiBwYXRoICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBzcGVjaWZ5IGFub3RoZXIgcGF0aC4KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPVRoZSBkZWZhdWx0IEhUTUwgYnJvd3NlciBvbiB0aGlzIHN5c3RlbSBjYW5ub3QgYmUgZGV0ZWN0ZWQgb3IgbG9jYXRlZC5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIG9wZW4gdGhlIGZpbGUgJyd7MH0nJyBtYW51YWxseSB3aXRoIGFuIEhUTUwgYnJvd3Nlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlnQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTk5MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaENvbmZpZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLlB1Ymxpc2hDb25maWdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEludm9rZXMgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQkvLyBJbnN0YW50aWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhaXRvbgotCQkJLy8gd2l6YXJkLgotCQkJUHVibGlzaENvbmZpZ1dpemFyZCB3aXphcmQgPSBuZXcgUHVibGlzaENvbmZpZ1dpemFyZCgpOwotCQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0KLQkJCS8vIEluc3RhbnRpYXRlIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbiBpdC4KLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBwdWJsaXNoaW5nIGNvbnRlbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4ZWUwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY3Rpb25zIGZvciB0aGUgcHVibGlzaGluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnT3BlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzczOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2ludGVybmFsL3dpemFyZHMvUHVibGlzaENvbmZpZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoSFRNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWdPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19DT05GSUdfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy52aWV3UmVwb3J0RXJyb3JfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUE9SVF9FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX21zZzsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLm9wZW5Ccm93c2VyRXJyb3JfcmVhc29uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfQ0FOQ0VMX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5jZWxQdWJsaXNoQ29uZmlnX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoZWRfdXJsOwotCi0JcHJpdmF0ZSBTdHJpbmcgcmVwb3J0X3VybDsKLQotCXByaXZhdGUgTXNnRGlhbG9nIG1zZ0RpYWxvZzsKLQotCXByaXZhdGUgRXhjZXB0aW9uIHJ1bkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hDb25maWdPcGVyYXRpb24oQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHVibGlzaE1nciA9IHB1Ymxpc2hNZ3I7Ci0JCXRoaXMubXNnRGlhbG9nID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHZpZXcgYnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0Vmlld0J1aWxkZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RWaWV3QnVpbGRlciBnZXRWaWV3QnVpbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdXJsIGZvciB0aGUgcHVibGlzaGVkIHNpdGUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaGVkVXJsKCkgewotCQlyZXR1cm4gcHVibGlzaGVkX3VybDsKLQl9Ci0KLQkvKioKLQkgKiBydW4gdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIHRoZSBwdWJsaXNoaW5nIHRhc2suCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcnVuRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vbml0b3IKLQkJCQkJLnNldFRhc2tOYW1lKFB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCQkJCi0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0KLQkJCXB1Ymxpc2hlZF91cmwgPSBwdWJsaXNoTWdyLmdldFB1Ymxpc2hlZFVybCgpOwotCQkJcmVwb3J0X3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaFJlcG9ydFVybCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcnVuRXhjZXB0aW9uID0gZTsKLQkJfQotCi0JCWZpbmFsIGJvb2xlYW4gY2FuY2VsZWQgPSBtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGNhbmNlbGVkKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5SW5mbyhQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChwdWJsaXNoZWRfdXJsID09IG51bGwgfHwgcmVwb3J0X3VybCA9PSBudWxsKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfTVNHLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0VSUk9SX1JFQVNPTiwgcnVuRXhjZXB0aW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVB1Ymxpc2hPcHRpb25zIG9wdGlvbnMgPSBwdWJsaXNoTWdyLmdldFZpZXdCdWlsZGVyKCkKLQkJCQkJCS5nZXRPcHRpb25zKCk7Ci0JCQkJaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQdWJsaXNoSFRNTE9wdGlvbnMpIHsKLQkJCQkJaWYgKCEoKFB1Ymxpc2hIVE1MT3B0aW9ucykgb3B0aW9ucykKLQkJCQkJCQkuaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpKSB7Ci0JCQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcHVibGlzaGVkIHNpdGUuCi0JCQkJCQlpZiAob3BlbkJyb3dzZXIocHVibGlzaGVkX3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJCQlPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OLAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcHVibGlzaGVkX3VybCB9KTsKLQkJCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCQkJUFJFVklFV19DT05GSUdfRVJST1JfTVNHLCByZWFzb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHJlcG9ydCBvbiB0aGUgcHVibGlzaGVkCi0JCQkJLy8gc2l0ZS4KLQkJCQlpZiAob3BlbkJyb3dzZXIocmVwb3J0X3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVwb3J0X3VybCB9KTsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSwKLQkJCQkJCQlWSUVXX1JFUE9SVF9FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIGEgYnJvd3NlciB0byBzaG93IHRoZSBwdWJsaXNoZWQgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHNpdGUgdXJsCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5Ccm93c2VyKGZpbmFsIFN0cmluZyB1cmwpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBMYXVuY2ggdGhlIGRlZmF1bHQgSFRNTCB2aWV3ZXIgdG8gZGlzcGxheSB0aGUgSFRNTCBwYWdlLgotCQkJLy8gT24gTGludXgsIHRoaXMgY2FuJ3QgbGF1bmNoIHVybHMsIG9ubHkgbG9jYWwgZmlsZXMgY2FuIGJlCi0JCQkvLyBsYXVuY2hlZC4KLQkJCS8vIFNvcnJ5IEkgaGF2ZSB1c2UgaW50ZXJuYWwgY2xhc3MgaGVyZS4KLQkJCS8vIGhvcGUgRWNsaXBzZS5vcmcgY2FuIGhhdmUgYSBwdWJsaWMgYXBpIHRvIGRvIHNvLgotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3VjY2VzcyA9IFByb2dyYW0ubGF1bmNoKHVybCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIElCcm93c2VyIGJyb3dzZXIgPQotCQkJCS8vIG9yZy5lY2xpcHNlLmhlbHAuaW50ZXJuYWwuYnJvd3Nlci5Ccm93c2VyTWFuYWdlcgotCQkJCS8vIC5nZXRJbnN0YW5jZSgpLmNyZWF0ZUJyb3dzZXIodHJ1ZSk7Ci0JCQkJLy8gaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gYnJvd3Nlci5kaXNwbGF5VVJMKHVybCk7Ci0JCQkJLy8gc3VjY2VzcyA9IHRydWU7Ci0JCQkJLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQkvLyAxNTU0OTAgLSBDYW5ub3QgZGV0ZWN0ZWQgZGVmYXVsdCBicm93c2VyIHdoZW4gcHJldmlldwotCQkJCS8vIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIG9uIExpbnV4Ci0JCQkJLy8gY2hhbmdlZCB0byB1c2Ugc3d0IGJyb3dzZXIKLQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyAvLyBvcGVuIGFub3RoZXIgc3d0IGJyb3dzZXIgc2luY2Ugd2UgaGF2ZSBubyAoc2ltcGxlKQotCQkJCQkJLy8gd2F5IG9mIGNyZWF0aW5nIGEgc3lzdGVtIGRlZmF1bHQgYnJvd3NlcgotCQkJCQkJLy8gLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzCi0JCQkJCQkvLyBpbnRlcm5hbAotCQkJCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCQkJCXNoZWxsLnNldFRleHQodXJsKTsKLQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCQkJCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJQnJvd3NlciBwb3B1cF9icm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJCQkJCUdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCQkJCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJcG9wdXBfYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCQkJCXNoZWxsLm9wZW4oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXN1Y2Nlc3MgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzM4ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbWFuYWdpbmcgdGhlIHB1Ymxpc2hpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0FjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvQWN0aXZpdHlEaWFncmFtUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5MzM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvQWN0aXZpdHlEaWFncmFtUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIGRpYWdyYW0gb3B0aW9ucwotICogCi0gKiBAYXV0aG9yIFBob25nIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JaW50IE5VTV9DT0xVTU4gPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9UQVNLU19QRVJfUk9XID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQVhfVEFTS1NfUEVSX1JPVyA9IDIwOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb247Ci0KLQlwcml2YXRlIFRleHQgdGFza3NQZXJSb3dUZXh0OwotCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIGFjdGl2aXR5IGRpYWdyYW0gZ3JvdXAuCi0JCUdyb3VwIGFjdGl2aXR5RGlhZ3JhbUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX0FjdGl2aXR5X0RpYWdyYW0sIDEpOwotCi0JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJYWN0aXZpdHlEaWFncmFtR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtKTsKLQotCQkvLyBDcmVhdGUgYWN0aXZpdHkgZGV0YXRpbCBkaWFncmFtIGdyb3VwLgotCi0JCUdyb3VwIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX0FjdGl2aXR5X0RldGFpbF9EaWFncmFtLCAyKTsKLQotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQgPSBjcmVhdGVDaGVja2JveCgKLQkJCQlhY3Rpdml0eURldGFpbERpYWdyYW1Hcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0LAotCQkJCTIpOwotCi0JCWNyZWF0ZUxhYmVsKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZF9UYXNrc3BlclJvdyk7Ci0JCXRhc2tzUGVyUm93VGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChhY3Rpdml0eURldGFpbERpYWdyYW1Hcm91cCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkvLyB1cGRhdGUgdGhlIHNldHRpbmdzIGZvciBicm93c2luZwotCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnVwZGF0ZUxheW91dFNldHRpbmdzKCk7Ci0KLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJLy8gc2V0IEFERCB0YXNrcyBwZXIgcm93Ci0JCUF1dGhvcmluZ1VJUHJlZmVyZW5jZXMuc2V0QUREVGFza3NQZXJSb3coZ2V0VGFza3NQZXJSb3coKSk7Ci0KLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihjdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQljdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQkJdGFza3NQZXJSb3dUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0QUREVGFza3NQZXJSb3coKSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpKTsKLQkJY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24KLQkJCQkuc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oKSk7Ci0KLQkJdGFza3NQZXJSb3dUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRBRERfVGFza3NQZXJSb3coKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Db21tb25QcmVmUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl0YXNrc1BlclJvd1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0KLQkJaW50IHZhbHVlID0gMDsKLQkJaWYgKGUud2lkZ2V0ID09IHRhc2tzUGVyUm93VGV4dCkgewotCQkJdmFsdWUgPSBnZXRUYXNrc1BlclJvdygpOwotCQkJaWYgKHZhbHVlIDwgTUlOX1RBU0tTX1BFUl9ST1cgfHwgdmFsdWUgPiBNQVhfVEFTS1NfUEVSX1JPVykgewotCQkJCXNldEVycm9yTWVzc2FnZShBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW52YWxpZFRhc2twZXJSb3dfbXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoTUlOX1RBU0tTX1BFUl9ST1cpLAotCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfVEFTS1NfUEVSX1JPVykgfSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXVwZGF0ZUFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgdGFza3MgcGVyIHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFRhc2tzUGVyUm93KCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZSh0YXNrc1BlclJvd1RleHQuZ2V0VGV4dCgpLnRyaW0oKSwgMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0RlbGV0ZUNvbmZpZ0NvbW1hbmRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0RlbGV0ZUNvbmZpZ0NvbW1hbmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZmOTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9EZWxldGVDb25maWdDb21tYW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBDb21tYW5kIGxpc3RlbmVyIGZvciBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZAotICogQ2xlYW4gYWxsIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHVibGlzaGluZyBwcmVmZXJlbmNlcyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIGRlbGV0ZWQKLSAqIEBhdXRob3IgWGlhbmcgRG9uZyBIdQotICogQHNpbmNlIDEuMgotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTQ4NwotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlQ29uZmlnQ29tbWFuZExpc3RlbmVyIGltcGxlbWVudHMKLQkJSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoQ29sbGVjdGlvbiBjb2xsZWN0ZWRPYmplY3RzLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKENvbGxlY3Rpb24gb2JqZWN0c1RvUmVtb3ZlLAotCQkJRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0JCXJldHVybiBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSAoKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKWNvbW1hbmQpLmdldFJlc3VsdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbil7Ci0JCQkJU3RyaW5nIGNvbmZpZ0lkID0gKChNZXRob2RDb25maWd1cmF0aW9uKWVsZW1lbnQpLmdldEd1aWQoKTsKLQkJCQlyZW1vdmVQdWJsaXNoUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJfQotCQl9Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNhdmVBbGxQcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVB1Ymxpc2hQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpewotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVBYm91dEhUTUwoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVCYW5uZXJJbWFnZShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUNoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUNvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUNvbnZlcnRCcm9rZW5MaW5rcyhjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUV4dHJhRGVzY3JpcHRvckluZm8oY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVGZWVkYmFja1VSTChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUluY2x1ZGVHbG9zc2FyeShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUluY2x1ZGVJbmRleChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUluY2x1ZGVTZWFyY2goY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVJbmNsdWRlU2VydmxldFNlYXJjaChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUxpZ2h0V2VpZ2h0VHJlZShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVB1Ymxpc2hFbnRpcmVDb25maWcoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVB1Ymxpc2hQYXRoKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlUHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVRpdGxlKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlV2ViQXBwTmFtZShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVNob3dSZWxhdGVkRGVzY3JpcHRvcnMoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKGNvbmZpZ0lkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwb3N0VW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU5Y2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgcHJlZmVyZW5jZSBwYWdlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogQnVncyBmaXhlZDoKLSAqIDx1bD4KLSAqIDxsaT5odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTU3PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBCYXNlUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJpdmF0ZSBUZXh0IGRlc3RpbmF0aW9uUGF0aFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgZmVlZGJhY2tVUkxUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZXh0cmFEZXNjcmlwdG9ySW5mb0NoZWNrYm94OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgb2YgdGhpcwotCSAqIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBEZXN0aW5hdGlvbiBwYXRoIGdyb3VwLgotCQkvKgotCQkgKiBHcm91cCBkZXN0aW5hdGlvbkdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJICogUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlc3RpbmF0aW9uRGlyZWN0b3J5R3JvdXBfdGV4dCwgMyk7Ci0JCSAqLwotCi0JCS8vIENyZWF0ZSB0aGUgUHVibGlzaGVkIFdlYnNpdGUgZ3JvdXAuCi0JCUdyb3VwIHdlYlNpdGVHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hXZWJTaXRlR3JvdXBfdGV4dCwgMyk7Ci0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dCk7Ci0JCWRlc3RpbmF0aW9uUGF0aFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQod2ViU2l0ZUdyb3VwKTsKLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKHdlYlNpdGVHcm91cCwKLQkJCQlBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQkJY3JlYXRlTGFiZWwod2ViU2l0ZUdyb3VwLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZmVlZGJhY2tVUkxMYWJlbF90ZXh0KTsKLQkJZmVlZGJhY2tVUkxUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHdlYlNpdGVHcm91cCwgMik7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBCcm93c2luZyBncm91cC4KLQkJR3JvdXAgYnJvd3NpbmdHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5icm93c2luZ0xheW91dEdyb3VwX3RleHQsIDEpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChicm93c2luZ0dyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoRXh0cmFEZXNjcmlwdG9ySW5mb0xhYmVsX3RleHQsIDEpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFBhdGgoKSk7Ci0JCWZlZWRiYWNrVVJMVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEZlZWRiYWNrVVJMKCkpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEV4dHJhRGVzY3JpcHRvckluZm8oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWRlc3RpbmF0aW9uUGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BhdGhWYWxpZChkZXN0aW5hdGlvblBhdGhUZXh0LmdldFRleHQoKSkpIHsKLQkJCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldFZhbGlkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5EaXJlY3RvcnlEaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZVZhbHVlcygpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zYXZlQWxsUHJlZmVyZW5jZXMoKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgc2V0dGluZ3MgZm9yIGJyb3dzaW5nCi0JCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkudXBkYXRlTGF5b3V0U2V0dGluZ3MoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hQYXRoKGRlc3RpbmF0aW9uUGF0aFRleHQuZ2V0VGV4dCgpCi0JCQkJLnRyaW0oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLnNldEZlZWRiYWNrVVJMKGZlZWRiYWNrVVJMVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuc2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3gKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0KLS8vCQkvLyBGSVhNRSEgUmV2aWV3IGltcGxlbWVudGF0aW9uLgotLy8JCS8vIGFsbG93IHRvIHBhc3MgdGhlIHZhbHVlIHRvIHRoZSBsaWJyYXJ5IGJyb3dzaW5nCi0vLwkJLy8gU3lzdGVtLnNldFByb3BlcnR5KEVYVFJBX0RFU0NSSVBUT1JfSU5GTywKLS8vCQkvLyBleHRyYURlc2NyaXB0b3JJbmZvQ3RyLmdldFNlbGVjdGlvbigpID8gInRydWUiIDogImZhbHNlIik7Ci0vLwkJRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IKLS8vCQkJCS5zZXREZWZhdWx0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGV4dHJhRGVzY3JpcHRvckluZm9DaGVja2JveAotLy8JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKSB7Ci0JCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0UHVibGlzaFBhdGgoKSk7Ci0JCWZlZWRiYWNrVVJMVGV4dAotCQkJCS5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldERlZmF1bHRGZWVkYmFja1VSTCgpKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0NoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIHBhdGguCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUGF0aFZhbGlkKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aCk7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKTsKLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFTdHJVdGlsLmlzVmFsaWRQdWJsaXNoUGF0aChwYXRoKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZGlyZWN0b3J5IGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQkJCVN0cmluZyBkZXN0aW5hdGlvbiA9IGRkLm9wZW4oKTsKLQkJCWlmIChkZXN0aW5hdGlvbiAhPSBudWxsKSB7Ci0JCQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWN0aXZpdHlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBQdWJsaXNoaW5nIFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9FTlRJUkVfQ09ORklHID0gInB1Ymxpc2hFbnRpcmVDb25maWciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFOTkVSX0lNQUdFID0gImJhbm5lckltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFCT1VUX0hUTUwgPSAiYWJvdXRIVE1MIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFRURCQUNLX1VSTCA9ICJmZWVkYmFja1VSTCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9HTE9TU0FSWSA9ICJpbmNsdWRlR2xvc3NhcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9JTkRFWCA9ICJpbmNsdWRlSW5kZXgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfRVhURVJOQUxfTElOS1MgPSAiY2hlY2tFeHRlcm5hbExpbmtzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfQlJPS0VOX0xJTktTID0gImNvbnZlcnRCcm9rZW5MaW5rcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUdIVF9XRUlHSFRfVFJFRSA9ICJsaWdodFdlaWdodFRyZWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfREVTQ1JJUFRPUl9JTkZPID0gImV4dHJhRGVzY3JpcHRvckluZm8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQgPSAicHVibGlzaFVub3BlbkFjdGl2aXR5REQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OID0gInB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfUEFUSCA9ICJwdWJsaXNoUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSA9ICJwdWJsaXNoU3RhdGljV2ViU2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1NFUlZMRVRfU0VBUkNIID0gImluY2x1ZGVTZXJ2bGV0U2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkFQUF9OQU1FID0gIndlYkFwcE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9TRUFSQ0ggPSAiaW5jbHVkZVNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMSVpFRCA9ICJpbml0aWFsaXplZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlMgPSAic2hvd1JlbGF0ZWREZXNjcmlwdG9ycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19SRUxBVEVEX0RFU0NSSVBUT1JTX09QVElPTiA9ICJzaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfREVTQ1JJUFRPUlNfSU5fTkFWSUdBVElPTlRSRUUgPSAic2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FDVElWSVRZX1RBQiA9ICJkZWZhdWx0QWN0aXZpdHlUYWIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QVUJMSVNIX0ZPTERFUl9OQU1FID0gIlB1Ymxpc2giOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFRpdGxlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0QmFubmVySW1hZ2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBYm91dEhUTUwgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRGZWVkYmFja1VSTCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gbnVsbDsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX0VOVElSRV9DT05GSUcsIHRydWUpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFRJVExFLCBnZXREZWZhdWx0VGl0bGUoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEJBTk5FUl9JTUFHRSwgZ2V0RGVmYXVsdEJhbm5lckltYWdlKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChBQk9VVF9IVE1MLCBnZXREZWZhdWx0QWJvdXRIVE1MKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChGRUVEQkFDS19VUkwsIGdldERlZmF1bHRGZWVkYmFja1VSTCgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU5DTFVERV9HTE9TU0FSWSwgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX0lOREVYLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENIRUNLX0VYVEVSTkFMX0xJTktTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENPTlZFUlRfQlJPS0VOX0xJTktTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiwgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChMSUdIVF9XRUlHSFRfVFJFRSwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVYVFJBX0RFU0NSSVBUT1JfSU5GTywKLQkJCQlnZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9BQ1RJVklUWV9UQUIsCi0JCQkJQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV0JTKTsKLQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX1BBVEgsIGdldERlZmF1bHRQdWJsaXNoUGF0aCgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX1NFUlZMRVRfU0VBUkNILCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV0VCQVBQX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAkJCQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX1NFQVJDSCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBlbnRpcmUgY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaEVudGlyZUNvbmZpZyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIFBVQkxJU0hfRU5USVJFX0NPTkZJRyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9FTlRJUkVfQ09ORklHKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZW50aXJlIGNvbmZpZ3VyYXRpb25wcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoRW50aXJlQ29uZmlnKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfRU5USVJFX0NPTkZJRywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZW50aXJlIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHVibGlzaEVudGlyZUNvbmZpZyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9FTlRJUkVfQ09ORklHKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHRpdGxlIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdGl0bGUgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VGl0bGUoKSB7Ci0JCWlmIChkZWZhdWx0VGl0bGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIHVybCA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDAgfHwgdXJsLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlZmF1bHRUaXRsZSA9IHVybDsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRpdGxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBzaXRlIHRpdGxlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSB3ZWIgc2l0ZSB0aXRsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpdGxlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBUSVRMRSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhUSVRMRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgc2l0ZSB0aXRsZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgd2ViIHNpdGUgdGl0bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgdGl0bGUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgVElUTEUsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgc2l0ZSB0aXRsZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVGl0bGUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBUSVRMRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBiYW5uZXIgaW1hZ2UgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBiYW5uZXIgaW1hZ2UgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0QmFubmVySW1hZ2UoKSB7Ci0JCWlmIChkZWZhdWx0QmFubmVySW1hZ2UgPT0gbnVsbCkgewotCQkJU3RyaW5nIGltYWdlID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoCi0JCQkJCSJiYW5uZXJJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCBpbWFnZS5sZW5ndGgoKSA9PSAwIHx8IGltYWdlLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVmYXVsdEJhbm5lckltYWdlID0gaW1hZ2U7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRCYW5uZXJJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBiYW5uZXIgaW1hZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIGJhbm5lciBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhbm5lckltYWdlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBCQU5ORVJfSU1BR0UpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQkFOTkVSX0lNQUdFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgYmFubmVyIGltYWdlIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCYW5uZXJJbWFnZShTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBpbWFnZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBCQU5ORVJfSU1BR0UsIGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYW5uZXIgaW1hZ2UgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUJhbm5lckltYWdlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQkFOTkVSX0lNQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGFib3V0IEhUTUwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBhYm91dCBIVE1MIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEFib3V0SFRNTCgpIHsKLQkJaWYgKGRlZmF1bHRBYm91dEhUTUwgPT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGUgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRTdHJpbmcoImFib3V0SFRNTCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmlsZSA9PSBudWxsIHx8IGZpbGUubGVuZ3RoKCkgPT0gMCB8fCBmaWxlLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZmlsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlkZWZhdWx0QWJvdXRIVE1MID0gZmlsZTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEFib3V0SFRNTDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYm91dCBIVE1MIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBhYm91dCBIVE1MIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFib3V0SFRNTChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgQUJPVVRfSFRNTCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhBQk9VVF9IVE1MKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFib3V0IEhUTUwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJvdXQgSFRNTCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWJvdXRIVE1MKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQUJPVVRfSFRNTCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWJvdXQgSFRNTCBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWJvdXRIVE1MKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQUJPVVRfSFRNTCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBmZWVkYmFjayBVUkwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBmZWVkYmFjayBVUkwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RmVlZGJhY2tVUkwoKSB7Ci0JCWlmIChkZWZhdWx0RmVlZGJhY2tVUkwgPT0gbnVsbCkgewotCQkJZGVmYXVsdEZlZWRiYWNrVVJMID0gImh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBkZWZhdWx0RmVlZGJhY2tVUkw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZmVlZGJhY2sgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKEZFRURCQUNLX1VSTCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGZWVkYmFja1VSTChTdHJpbmcgdXJsKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShGRUVEQkFDS19VUkwsIHVybCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGZWVkYmFja1VSTChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgRkVFREJBQ0tfVVJMKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKEZFRURCQUNLX1VSTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmVlZGJhY2tVUkwoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgdXJsKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIEZFRURCQUNLX1VSTCwgdXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZlZWRiYWNrVVJMKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgRkVFREJBQ0tfVVJMKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGdsb3NzYXJ5IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlR2xvc3NhcnkoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX0dMT1NTQVJZKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihJTkNMVURFX0dMT1NTQVJZKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgZ2xvc3NhcnkgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZUdsb3NzYXJ5KFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0dMT1NTQVJZLAotCQkJCXZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIGdsb3NzYXJ5IHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlR2xvc3NhcnkoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZQotCQkJCS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0dMT1NTQVJZKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGluZGV4IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlSW5kZXgoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX0lOREVYKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihJTkNMVURFX0lOREVYKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgaW5kZXggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUKLQkJCQkuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0lOREVYLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBpbmRleCBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9JTkRFWCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrRXh0ZXJuYWxMaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIENIRUNLX0VYVEVSTkFMX0xJTktTKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihDSEVDS19FWFRFUk5BTF9MSU5LUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBleHRlcm5hbCBsaW5rcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGVja0V4dGVybmFsTGlua3MoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZSgKLQkJCQlnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIENIRUNLX0VYVEVSTkFMX0xJTktTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3MgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNoZWNrRXh0ZXJuYWxMaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgQ0hFQ0tfRVhURVJOQUxfTElOS1MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDb252ZXJ0QnJva2VuTGlua3MoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBDT05WRVJUX0JST0tFTl9MSU5LUyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oQ09OVkVSVF9CUk9LRU5fTElOS1MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udmVydCBicm9rZW4gbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udmVydEJyb2tlbkxpbmtzKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoCi0JCQkJZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBDT05WRVJUX0JST0tFTl9MSU5LUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDb252ZXJ0QnJva2VuTGlua3MoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIENPTlZFUlRfQlJPS0VOX0xJTktTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHVub3BlbiBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eUREKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0REKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQKLQkgKiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGFjdGl2aXkgZGlhZ3JhbXMgZm9yIGJhc2UgYWN0aXZpdGllcyB3aXRoIHVubW9kaWZpZWQKLQkgKiBleHRlbnNpb24gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkLAotCQkJYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlnaHQgd2VpZ2h0IHRyZWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldExpZ2h0V2VpZ2h0VHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIExJR0hUX1dFSUdIVF9UUkVFKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMSUdIVF9XRUlHSFRfVFJFRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaWdodCB3ZWlnaHQgdHJlZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMaWdodFdlaWdodFRyZWUoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIExJR0hUX1dFSUdIVF9UUkVFLAotCQkJCXZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaWdodCB3ZWlnaHQgdHJlZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGlnaHRXZWlnaHRUcmVlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBMSUdIVF9XRUlHSFRfVFJFRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYVFJBX0RFU0NSSVBUT1JfSU5GTyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dHJhRGVzY3JpcHRvckluZm8oYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRVhUUkFfREVTQ1JJUFRPUl9JTkZPLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFeHRyYURlc2NyaXB0b3JJbmZvKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgRVhUUkFfREVTQ1JJUFRPUl9JTkZPKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dHJhRGVzY3JpcHRvckluZm8oU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgRVhUUkFfREVTQ1JJUFRPUl9JTkZPLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFeHRyYURlc2NyaXB0b3JJbmZvKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgcGF0aCBmb3IgYSBwdWJsaXNoZWQgd2ViIHNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBwYXRoIGZvciBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UHVibGlzaFBhdGgoKSB7Ci0JCWlmIChkZWZhdWx0UHVibGlzaFBhdGggPT0gbnVsbCkgewotCQkJZGVmYXVsdFB1Ymxpc2hQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRQdWJsaXNoUGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX1BVQkxJU0hfRk9MREVSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRQdWJsaXNoUGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfUFVCTElTSF9GT0xERVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdFB1Ymxpc2hQYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFB1Ymxpc2hQYXRoKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQVUJMSVNIX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX1BBVEgsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHVibGlzaFBhdGgoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIFBVQkxJU0hfUEFUSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQVUJMSVNIX1BBVEgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBwYXRoKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFBVQkxJU0hfUEFUSCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFBVQkxJU0hfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBzdGF0aWMgd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggc3RhdGljIHdlYiBzaXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBzdGF0aWMgd2ViIHNpdGUgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBhcHBsZXQgc2VhcmNoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlU2VydmxldFNlYXJjaChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIElOQ0xVREVfU0VSVkxFVF9TRUFSQ0gpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKElOQ0xVREVfU0VSVkxFVF9TRUFSQ0gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBwcmVmZXJlbmNlIHZhbHVlLi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZVNlcnZsZXRTZWFyY2goU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgc2VydmxldCBzZWFyY2ggcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlU2VydmxldFNlYXJjaChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVTZWFyY2goU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX1NFQVJDSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9TRUFSQ0gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZVNlYXJjaChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9TRUFSQ0gsCi0JCQkJdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgc2VhcmNoIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlU2VhcmNoKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9TRUFSQ0gpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgV0VCQVBQX05BTUUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoV0VCQVBQX05BTUUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBuYW1lKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFdFQkFQUF9OQU1FLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlV2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFdFQkFQUF9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHByZWZpeC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgcHJlZmVyZW5jZSBwcmVmaXggYXNzaWduZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25maWdQcmVmUHJlZml4KFN0cmluZyBjb25maWdJZCkgewotCQlyZXR1cm4gY29uZmlnSWQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmljIHByZWZlcmVuY2VzIGluaXRpYWxpemVkIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZQotCQkJCS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5JVElBTElaRUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTklUSUFMSVpFRCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB0byBiZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ29uZmlnUHJlZkluaXRpYWxpemVkKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5JVElBTElaRUQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlMsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IHJlbGF0ZWQgZGVzY3JpcHRvcnMgaW4gY29udGVudCBwYWdlIHByZWZlcmVuY2UgdG8gYmUKLQkgKiBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVNob3dSZWxhdGVkRGVzY3JpcHRvcnMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFNIT1dfUkVMQVRFRF9ERVNDUklQVE9SUyk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBvcHRpb24gaW4gY29udGVudCBwYWdlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgU0hPV19SRUxBVEVEX0RFU0NSSVBUT1JTX09QVElPTik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIG9wdGlvbiBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbihTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlNfT1BUSU9OLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIG9wdGlvbiBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB0byBiZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlU2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbihTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgU0hPV19SRUxBVEVEX0RFU0NSSVBUT1JTX09QVElPTik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvdyBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX0RFU0NSSVBUT1JTX0lOX05BVklHQVRJT05UUkVFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKFN0cmluZyBjb25maWdJZCwKLQkJCWJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX0RFU0NSSVBUT1JTX0lOX05BVklHQVRJT05UUkVFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0Ci0JICogdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlU2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgU0hPV19ERVNDUklQVE9SU19JTl9OQVZJR0FUSU9OVFJFRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0QWN0aXZpdHlUYWIoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIERFRkFVTFRfQUNUSVZJVFlfVEFCKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKERFRkFVTFRfQUNUSVZJVFlfVEFCKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdGFiTmFtZQotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEFjdGl2aXR5VGFiKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHRhYk5hbWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKAotCQkJCWdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgREVGQVVMVF9BQ1RJVklUWV9UQUIsIHRhYk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGFsbCB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhlNDQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIHByZWZlcmVuY2UgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIEJ1Z3MgZml4ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Njk1NzwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCU1vZGlmeUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGludCBNSU5fSE9SSVpPTlRBTF9TUEFDSU5HID0gNTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX0hPUklaT05UQUxfU1BBQ0lORyA9IDIwMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBNSU5fVkVSVElDQUxfU1BBQ0lORyA9IDI1OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9WRVJUSUNBTF9TUEFDSU5HID0gMTAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9URVhUX0xJTkVTID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQVhfVEVYVF9MSU5FUyA9IDU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcml2YXRlIFRleHQgaG9yaXpvbmFsU3BhY2luZ1RleHQ7Ci0KLQlwcml2YXRlIFRleHQgdmVydGljYWxTcGFjaW5nVGV4dDsKLQotCXByaXZhdGUgVGV4dCB0ZXh0TGluZXNUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgb2YgdGhpcwotCSAqIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIFNwYWNpbmcgYmV0d2VlbiB0YXNrIGFuZCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgZ3JvdXAuCi0JCUdyb3VwIGVsZW1lbnRTcGFjaW5nR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5lbGVtZW50U3BhY2luZ0dyb3VwX3RleHQsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKGVsZW1lbnRTcGFjaW5nR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnRhc2tzSG9yaXpvbmFsU3BhY2luZ0xhYmVsX3RleHQpOwotCQlob3Jpem9uYWxTcGFjaW5nVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChlbGVtZW50U3BhY2luZ0dyb3VwLCAiIiwgMjUpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoZWxlbWVudFNwYWNpbmdHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMudGFza3NWZXJ0aWNhbFNwYWNpbmdMYWJlbF90ZXh0KTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChlbGVtZW50U3BhY2luZ0dyb3VwLCAiIiwgMjUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIEVsZW1lbnQgdGV4dCBsYWJlbCBncm91cC4KLQkJR3JvdXAgZWxlbWVudFRleHRMYWJlbEdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZWxlbWVudFRleHRMYWJlbEdyb3VwX3RleHQsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKGVsZW1lbnRUZXh0TGFiZWxHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMubWF4TGluZU9mVGV4dExhYmVsX3RleHQpOwotCQl0ZXh0TGluZXNUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGVsZW1lbnRUZXh0TGFiZWxHcm91cCwgIiIsIDE1KTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlob3Jpem9uYWxTcGFjaW5nVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCkpKTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRSb2xlRGlhZ3JhbVZlcnRpY2FsU3BhY2luZygpKSk7Ci0JCXRleHRMaW5lc1RleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaG9yaXpvbmFsU3BhY2luZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCXZlcnRpY2FsU3BhY2luZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCXRleHRMaW5lc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0KLQkJaW50IHZhbHVlID0gMDsKLQkJaWYgKGUud2lkZ2V0ID09IGhvcml6b25hbFNwYWNpbmdUZXh0KSB7Ci0JCQl2YWx1ZSA9IGdldEhvcml6b250YWxTcGFjaW5nKCk7Ci0JCQlpZiAodmFsdWUgPCBNSU5fSE9SSVpPTlRBTF9TUEFDSU5HCi0JCQkJCXx8IHZhbHVlID4gTUFYX0hPUklaT05UQUxfU1BBQ0lORykgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkSG9yaXpvbmFsU3BhY2luZ0Vycm9yX21zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKE1JTl9IT1JJWk9OVEFMX1NQQUNJTkcpLAotCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfSE9SSVpPTlRBTF9TUEFDSU5HKSB9KSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHZlcnRpY2FsU3BhY2luZ1RleHQpIHsKLQkJCXZhbHVlID0gZ2V0VmVydGljYWxTcGFjaW5nKCk7Ci0JCQlpZiAodmFsdWUgPCBNSU5fVkVSVElDQUxfU1BBQ0lORyB8fCB2YWx1ZSA+IE1BWF9WRVJUSUNBTF9TUEFDSU5HKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWZXJ0aWNhbFNwYWNpbmdFcnJvcl9tc2csCi0JCQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihNSU5fVkVSVElDQUxfU1BBQ0lORyksCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKE1BWF9WRVJUSUNBTF9TUEFDSU5HKSB9KSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHRleHRMaW5lc1RleHQpIHsKLQkJCXZhbHVlID0gZ2V0TWF4aW11bVRleHRMaW5lcygpOwotCQkJaWYgKHZhbHVlIDwgTUlOX1RFWFRfTElORVMgfHwgdmFsdWUgPiBNQVhfVEVYVF9MSU5FUykgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVGV4dExpbmVzRXJyb3JfbXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoTUlOX1RFWFRfTElORVMpLAotCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfVEVYVF9MSU5FUykgfSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXVwZGF0ZUFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuCi0JICogcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlob3Jpem9uYWxTcGFjaW5nVGV4dC5zZXRUZXh0KCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIExpYnJhcnlQcmVmZXJlbmNlcy5nZXREZWZhdWx0Um9sZURpYWdyYW1Ib3Jpem9udGFsU3BhY2luZygpKTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dC5zZXRUZXh0KCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIExpYnJhcnlQcmVmZXJlbmNlcy5nZXREZWZhdWx0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoKSk7Ci0JCXRleHRMaW5lc1RleHQuc2V0VGV4dCgiIiAvLyROT04tTkxTLTEkCi0JCQkJKyBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0RGVmYXVsdFJvbGVEaWFncmFtTWF4aW11bVRleHRMaW5lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5zZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKGdldEhvcml6b250YWxTcGFjaW5nKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMuc2V0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoZ2V0VmVydGljYWxTcGFjaW5nKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuc2V0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKGdldE1heGltdW1UZXh0TGluZXMoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGhvcml6b250YWwgc3BhY2luZyBiZXR3ZWVuIHRhc2tzIGFuZCByb2xlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEhvcml6b250YWxTcGFjaW5nKCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZShob3Jpem9uYWxTcGFjaW5nVGV4dC5nZXRUZXh0KCkudHJpbSgpLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCB2ZXJ0aWNhbCBzcGFjaW5nIGJldHdlZW4gdGFza3MgYW5kIHJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmVydGljYWxTcGFjaW5nKCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZSh2ZXJ0aWNhbFNwYWNpbmdUZXh0LmdldFRleHQoKS50cmltKCksIDApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGVsZW1lbnQgbGFiZWwgdGV4dCBsaW5lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldE1heGltdW1UZXh0TGluZXMoKSB7Ci0JCXJldHVybiBTdHJVdGlsLmdldEludFZhbHVlKHRleHRMaW5lc1RleHQuZ2V0VGV4dCgpLnRyaW0oKSwgMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvU3VwcG9ydGluZ1BsdWdpblByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvU3VwcG9ydGluZ1BsdWdpblByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYTlhOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1N1cHBvcnRpbmdQbHVnaW5QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFRoZSBzdXBwb3JpdGluZyBwbHVnaW5zIFByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSA3LjUKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdQbHVnaW5QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZQotCQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBCdXR0b24gaW5jbHVkZURlc2NyaXB0b3JCdXR0b247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ1BsdWdpblByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJR3JvdXAgbGF5b3V0R3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByZWZlcmVuY2VfRGVzY3JpcHRvcnMsIDEpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWxheW91dEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWluY2x1ZGVEZXNjcmlwdG9yQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJbGF5b3V0R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9pbmNsdWRlRGVzY3JpcHRvckJ1dHRvbl90ZXh0LCAxKTsKLQotCQkvLyBJbml0aWFsaXplIHZhbHVlcwotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluY2x1ZGVEZXNjcmlwdG9yQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlRGVzY3JpcHRvcnMoZ2V0SW5jbHVkZURlc2NyaXB0b3JzKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gaW5jbHVkZURlc2NyaXB0b3JCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbmNsdWRlRGVzY3JpcHRvckJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0SW5jbHVkZURlc2NyaXB0b3JzKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgd3JhcHBlciA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKSB3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNThjMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIHB1Ymxpc2hpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvQWJzdHJhY3RQdWJsaXNoV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9BYnN0cmFjdFB1Ymxpc2hXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmNzljNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9BYnN0cmFjdFB1Ymxpc2hXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEFic3RyYWN0IHB1Ymxpc2hpbmcgd2l6YXJkIGNsYXNzLiAKLSAqIHVzZSB0aGUgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaGVycyBleHRlbnNpb24gcG9pbnQgdG8gZXh0ZW5kIHRoaXMgY2xhc3MgCi0gKiBpZiB5b3UgbmVlZCB0byBjdXN0b21pemUgdGhlIHB1Ymxpc2hpbmcgdWkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvLyBUaGUgcHVibGlzaGluZyBvcHRpb25zLgotCXByb3RlY3RlZCBQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIGZpbmlzaCB0aGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBib29sZWFuIHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIHdvcmtiZW5jaCBJV29ya2JlbmNoCi0JICogQHBhcmFtIHNlbGVjdGlvbiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIG9wdGlvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIFB1Ymxpc2hPcHRpb25zCi0JICovCi0JcHVibGljIGFic3RyYWN0IFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hPcHRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoQ29uZmlnV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoQ29uZmlnV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZGFkMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hIVE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBwdWJsaXNoIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSB3ZWIKLSAqIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ1dpemFyZCBleHRlbmRzIEJhc2VXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gUHVibGlzaENvbmZpZ1dpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgUHVibGlzaCBDb25maWd1cmF0aW9uIHdpemFyZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlnV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBzZWxlY3QgY29uZmlndXJhdGlvbiB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBjb25maWd1cmF0aW9uIGNvbnRlbnQgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdENvbnRlbnRQYWdlIHNlbGVjdENvbnRlbnRQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2U7Ci0KLQkvLyBUaGUgc2VsZWN0IGRlc3RpbmF0aW9uIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBTZWxlY3REZXN0aW5hdGlvblBhZ2Ugc2VsZWN0RGVzdGluYXRpb25QYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ1dpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotCQlzZXRXaW5kb3dUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1dpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoKTsKLQkJCXNlbGVjdENvbnRlbnRQYWdlID0gbmV3IFNlbGVjdENvbnRlbnRQYWdlKCk7Ci0JCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCk7Ci0JCQlzZWxlY3REZXN0aW5hdGlvblBhZ2UgPSBuZXcgU2VsZWN0RGVzdGluYXRpb25QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RDb250ZW50UGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdERlc3RpbmF0aW9uUGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBBcnJheUxpc3Q8SVdpemFyZFBhZ2U+KCk7Ci0KLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0Q29uZmlnUGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTZWxlY3RDb25maWdQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdENvbmZpZ1BhZ2UpOwotCQkJfQotCi0JCQlwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdENvbnRlbnRQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RDb250ZW50UGFnZSA9IG5ldyBTZWxlY3RDb250ZW50UGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RDb250ZW50UGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0RGVzdGluYXRpb25QYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3REZXN0aW5hdGlvblBhZ2UgPSBuZXcgU2VsZWN0RGVzdGluYXRpb25QYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdERlc3RpbmF0aW9uUGFnZSk7Ci0JCQl9Ci0KLQkJCXN1cGVyLmdldE5ld1dpemFyZFBhZ2VzKHdpemFyZFBhZ2VzKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHdpemFyZFBhZ2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJV2l6YXJkUGFnZSB3aXphcmRQYWdlID0gKElXaXphcmRQYWdlKSBpdC5uZXh0KCk7Ci0JCQkJc3VwZXIuYWRkUGFnZSh3aXphcmRQYWdlKTsKLQkJCX0KLQotCQkJd2l6YXJkRXh0ZW5kZXIuaW5pdFdpemFyZFBhZ2VzKHdpemFyZFBhZ2VzKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCS8vb3ZlcnJpZGUgdGhlIGJhc2Ugd2l6YXJkJ3MgbG9naWMsIAotCQkvL2xldCB0aGUgd2l6YXJkIGV4dGVuZGVyIGRyaXZlIHRoZSBwYWdlIGZsb3cgd2hlbiB0aGVyZSBpcyBhIHdpemFyZCBleHRlbmRlcgotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQluZXh0UGFnZSA9IHdpemFyZEV4dGVuZGVyLmdldE5leHRQYWdlKHBhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZShwYWdlKTsKLQkJfQotCQlyZXR1cm4gbmV4dFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkRXh0ZW5kZXIuZG9GaW5pc2goKTsKLQkJfSBlbHNlIHsKLQkJCVB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hlciA9IG5ldyBQdWJsaXNoTWFuYWdlcigpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gcHVibGlzaENvbmZpZyhzZWxlY3RDb25maWdQYWdlLmdldFNlbGVjdGVkQ29uZmlnKCksCi0JCQkJCWdldFB1Ymxpc2hpbmdPcHRpb25zKCksIHB1Ymxpc2hlcik7Ci0JCQlpZiAocHVibGlzaGVyICE9IG51bGwpIHsKLQkJCQlwdWJsaXNoZXIuZGlzcG9zZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoZXMgdGhlIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaGluZyBvcHRpb25zCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHVibGlzaENvbmZpZyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHVibGlzaE9wdGlvbnMgb3B0aW9ucywKLQkJCVB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hlcikgewotCQl0cnkgewotCQkJaWYgKGNoZWNrQW5kQ3JlYXRlRGlyKG9wdGlvbnMpKSB7Ci0JCQkJcHVibGlzaGVyLmluaXQob3B0aW9ucy5nZXRQdWJsaXNoRGlyKCksIGNvbmZpZywgb3B0aW9ucyk7Ci0JCQkJUHVibGlzaGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgUHVibGlzaGluZ09wZXJhdGlvbigKLQkJCQkJCXB1Ymxpc2hlcik7Ci0KLQkJCQlQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRsZyA9IG5ldyBQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgcHVibGlzaGVyCi0JCQkJCQkJCS5nZXRWaWV3QnVpbGRlcigpKTsKLQotCQkJCVVJSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sIGRsZywgdHJ1ZSwKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlKTsKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGUsCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfbXNnLAotCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlICE9IG51bGwpIHsKLQkJCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2Uuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0RGVzdGluYXRpb25QYWdlICE9IG51bGwpIHsKLQkJCQlzZWxlY3REZXN0aW5hdGlvblBhZ2Uuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgY29uZmlnSWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkLCB0cnVlKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNhdmVBbGxQcmVmZXJlbmNlcygpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaGluZ09wdGlvbnMoKSB7Ci0JCVB1Ymxpc2hPcHRpb25zIG9wdGlvbnM7Ci0JCQotCQlpZiAoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlICE9IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCW9wdGlvbnMgPSBuZXcgUHVibGlzaE9wdGlvbnMoKTsKLQkJfQotCi0JCWlmIChzZWxlY3RDb250ZW50UGFnZSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHB1Ymxpc2hDb25maWcgPSBzZWxlY3RDb250ZW50UGFnZS5nZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCk7Ci0JCQlvcHRpb25zLnNldFB1Ymxpc2hDb25maWd1cmF0aW9uKHB1Ymxpc2hDb25maWcpOwotCQkJb3B0aW9ucy5zZXRQdWJsaXNoUHJvY2VzcyghcHVibGlzaENvbmZpZyk7Ci0JCQlpZiAoIXB1Ymxpc2hDb25maWcpIHsKLQkJCQlvcHRpb25zLnNldFByb2Nlc3NlcyhzZWxlY3RDb250ZW50UGFnZS5nZXRTZWxlY3RlZFByb2Nlc3NlcygpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNlbGVjdERlc3RpbmF0aW9uUGFnZSAhPSBudWxsKSB7Ci0JCQlvcHRpb25zLnNldFB1Ymxpc2hEaXIoc2VsZWN0RGVzdGluYXRpb25QYWdlLmdldFB1Ymxpc2hEaXJlY3RvcnkoKSk7Ci0KLQkJCWlmICghc2VsZWN0RGVzdGluYXRpb25QYWdlLmdldFN0YXRpY1dlYlNpdGVTZWxlY3Rpb24oKQotCQkJCQkmJiBvcHRpb25zIGluc3RhbmNlb2YgUHVibGlzaEhUTUxPcHRpb25zKSB7Ci0JCQkJUHVibGlzaEhUTUxPcHRpb25zIGh0bWxPcHRpb25zID0gKFB1Ymxpc2hIVE1MT3B0aW9ucykgb3B0aW9uczsKLQkJCQlodG1sT3B0aW9ucy5zZXRQdWJsaXNoRHluYW1pY1dlYkFwcCh0cnVlKTsKLQkJCQlodG1sT3B0aW9ucy5zZXREeW5hbWljV2ViQXBwTmFtZShzZWxlY3REZXN0aW5hdGlvblBhZ2UKLQkJCQkJCS5nZXRXZWJBcHBOYW1lKCkpOwotCQkJCWh0bWxPcHRpb25zLnNldEluY2x1ZGVTZXJ2bGV0U2VhcmNoKHNlbGVjdERlc3RpbmF0aW9uUGFnZQotCQkJCQkJLmdldEluY2x1ZGVTZWFyY2hTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIHBhdGggd2hlcmUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogd2lsbCBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZXN0aW5hdGlvbiBwYXRoIGlzIHZhbGlkLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrQW5kQ3JlYXRlRGlyKFB1Ymxpc2hPcHRpb25zIG9wdGlvbnMpIHsKLQkJU3RyaW5nIGRpciA9IG9wdGlvbnMuZ2V0UHVibGlzaERpcigpOwotCQlTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCk7Ci0JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoZGlyKTsKLQkJaWYgKCFlY1BhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aAotCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGRpcjsgLy8kTk9OLU5MUy0xJAotCQkJYW5zd2VyID0gUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb25maXJtUGF0aERpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQlwYXRoKSk7Ci0KLQkJCWlmIChhbnN3ZXIpIHsKLQkJCQlvcHRpb25zLnNldFB1Ymxpc2hEaXIoZGlyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyKTsKLQotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQlhbnN3ZXIgPSBQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5vdmVyd3JpdGVEaWFsb2dfdGV4dCwKLQkJCQkJCQkJCQkJCWRpcikpOwotCi0JCQkJaWYgKGFuc3dlciA9PSB0cnVlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhbnN3ZXIgPSBGaWxlVXRpbAotCQkJCQkJCQkuZGVsZXRlQWxsRmlsZXMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlpZiAoYW5zd2VyID09IGZhbHNlKSB7Ci0JCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJCQlkaXIpKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLAotCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJZGlyKSwgZSk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlhbnN3ZXIgPSBmaWxlLm1rZGlycygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNyZWF0ZURpckVycm9yX3JlYXNvbiwKLQkJCQkJCQkJZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIGUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghYW5zd2VyKSB7Ci0JCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZSwKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jcmVhdGVEaXJFcnJvcl9yZWFzb24sCi0JCQkJCQkJCWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYW5zd2VyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4YjNiNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi0vKioKLSAqIE1vZGVscyBhICJwdWJsaXNoT3B0aW9uIiBjb25maWd1cmF0aW9uIGVsZW1lbnQgaW4gdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0U2VsZWN0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGV4cG9ydCBvcHRpb24gbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgdGhlIGV4cG9ydCBvcHRpb24gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFNlbGVjdGlvbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbkNvbnRyaWJ1dGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJYm9vbGVhbiBkZWZhdWx0U2VsZWN0aW9uKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5kZWZhdWx0U2VsZWN0aW9uID0gZGVmYXVsdFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZXhwb3J0IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnQgb3B0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXhwb3J0IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnQgb3B0aW9uIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2VsZWNpdG9uIG9mIHRoaXMgZXhwb3J0IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb3B0aW9uIHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGRlZmF1bHRTZWxlY3Rpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOGUwOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUltYWdlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogVGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcm9ncmVzcyBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ3JhbVZpZXdlckhvbGRlcjsKLQotCXByaXZhdGUgQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50LAotCQkJQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnZpZXdCdWlsZGVyID0gdmlld0J1aWxkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlpZiAodmlld0J1aWxkZXIgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBkaWFncmFtIHZpZXdlciBob2xkZXIgYW5kIHRoZSBkaWFncmFtIHNlcnZpY2UuCi0JCQlkaWFncmFtVmlld2VySG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSB2aWV3QnVpbGRlci5nZXRMYXlvdXRNZ3IoKTsKLQkJCVN0cmluZyBuZXdEaWFncmFtcyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoIlBVQkxJU0hfTkVXX0RJQUdSQU0iKTsgLy8kTk9OLU5MUy0xJAotCQkJQm9vbGVhbiBuZXdEaWFncmFtID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCQlpZihuZXdEaWFncmFtcyAhPSBudWxsICYmIG5ld0RpYWdyYW1zLmxlbmd0aCgpID4gMCl7Ci0JCQkJbmV3RGlhZ3JhbSA9IG5ldyBCb29sZWFuKG5ld0RpYWdyYW1zKTsKLQkJCX0KLQkJCWlmIChuZXdEaWFncmFtLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJRGlhZ3JhbUltYWdlU2VydmljZSBkaWFncmFtU2VydmljZSA9IG5ldyBEaWFncmFtSW1hZ2VTZXJ2aWNlKAotCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRDb25maWcobGF5b3V0TWdyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzUHVibGlzaFVub3BlbkFERCgpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbih2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc1B1Ymxpc2hCYXNlQUQoKSk7Ci0JCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbmV3IEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERCh2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc1B1Ymxpc2hVbm9wZW5BREQoKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24odmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNQdWJsaXNoQmFzZUFEKCkpOwotCQkJCWxheW91dE1nci5zZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKGRpYWdyYW1TZXJ2aWNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjdHJsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQkKLQkJdmlld0J1aWxkZXIgPSBudWxsOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MTA5NDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoSFRNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXZWJCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OwotCi0vKioKLSAqIFBlcmZvcm1zIHRoZSByZWFsIHdvcmsgb2YgcHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5vcGVuQnJvd3NlckVycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2FuY2VsUHVibGlzaENvbmZpZ19tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaGVkX3VybDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcG9ydF91cmw7Ci0KLQlwcml2YXRlIE1zZ0RpYWxvZyBtc2dEaWFsb2c7Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBydW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCQl0aGlzLm1zZ0RpYWxvZyA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB2aWV3IGJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlZF91cmw7Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQotCQl0cnkgewotCQkJX3J1bkl0KG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5wdWJsaXNoTWdyID0gbnVsbDsKLQkJCXRoaXMubXNnRGlhbG9nID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJ1biB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gdGhlIHB1Ymxpc2hpbmcgdGFzay4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBfcnVuSXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcnVuRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vbml0b3IKLQkJCQkJLnNldFRhc2tOYW1lKFB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCQkJCi0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0KLQkJCXB1Ymxpc2hlZF91cmwgPSBwdWJsaXNoTWdyLmdldFB1Ymxpc2hlZFVybCgpOwotCQkJcmVwb3J0X3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaFJlcG9ydFVybCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcnVuRXhjZXB0aW9uID0gZTsKLQkJfQotCi0JCWZpbmFsIGJvb2xlYW4gY2FuY2VsZWQgPSBtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGNhbmNlbGVkKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5SW5mbyhQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChyZXBvcnRfdXJsID09IG51bGwpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJUHVibGlzaE9wdGlvbnMgb3B0aW9ucyA9IHB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKQotCQkJCQkJLmdldE9wdGlvbnMoKTsKLQkJCQlib29sZWFuIHRvT3BlblB1Ymxpc2hlZFVyaSA9IGZhbHNlOwotCQkJCWlmIChvcHRpb25zIGluc3RhbmNlb2YgUHVibGlzaEhUTUxPcHRpb25zKSB7Ci0JCQkJCWlmICghKChQdWJsaXNoSFRNTE9wdGlvbnMpIG9wdGlvbnMpCi0JCQkJCQkJLmlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSkgewotCQkJCQkJdG9PcGVuUHVibGlzaGVkVXJpID0gdHJ1ZTsKLQkJCQkJCWlmIChwdWJsaXNoZWRfdXJsID09IG51bGwpIHsKLQkJCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfTVNHLAotCQkJCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIHJlbW92ZWQgbGF1bmNoIG9mIHB1Ymxpc2hlZF91cmwKLQkJCQkvLyBiZWNhdXNlIGxhdW5jaGluZyAyIFVSTFMgYXQgbmVhcmx5IHRoZSBzYW1lIHRpbWUgCi0JCQkJLy8gd2FzIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBJRTcgJiBGaXJlZm94Ci0JCQkJLy8gaW5zdGVhZCwgdGhlIHJlcG9ydCBIVE1MIGZpbGUgaGFzIGFuCi0JCQkJLy8gb25sb2FkIHNjcmlwdCBvZiB0aGUgYm9keSBlbGVtZW50IHRoYXQgd2lsbAotCQkJCS8vIGxvYWQgdGhlIHB1Ymxpc2hlZCB1cmwKLQkJCQkKLQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcHVibGlzaGVkIHNpdGUuCi0JCQkJaWYgKHRvT3BlblB1Ymxpc2hlZFVyaSAmJiBvcGVuQnJvd3NlcihwdWJsaXNoZWRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwdWJsaXNoZWRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBSRVZJRVdfQ09ORklHX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0KLQotCQkJCS8vIExhdW5jaCBhIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSByZXBvcnQgb24gdGhlIHB1Ymxpc2hlZAotCQkJCS8vIHNpdGUuCi0JCQkJaWYgKG9wZW5TV1RCcm93c2VyKHJlcG9ydF91cmwpID09IGZhbHNlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHJlcG9ydF91cmwgfSk7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoVklFV19SRVBPUlRfRVJST1JfVElUTEUsCi0JCQkJCQkJVklFV19SRVBPUlRfRVJST1JfTVNHLCByZWFzb24pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIG9wZW5TV1RCcm93c2VyKGZpbmFsIFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChEaXNwbGF5LmdldERlZmF1bHQoKSwgU1dULlNIRUxMX1RSSU0pOwotCQkJc2hlbGwuc2V0VGV4dCh1cmxTdHJpbmcpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlCcm93c2VyIHBvcHVwX2Jyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJcG9wdXBfYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKHVybFN0cmluZyk7Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIGEgYnJvd3NlciB0byBzaG93IHRoZSBwdWJsaXNoZWQgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsU3RyaW5nCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHNpdGUgdXJsCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5Ccm93c2VyKGZpbmFsIFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzID0gUHJvZ3JhbS5sYXVuY2godXJsU3RyaW5nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IG51bGw7Ci0JCQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQkJCXRyeSB7Ci0JCQkJCWJyb3dzZXIgPSBicm93c2VyU3VwcG9ydC5nZXRFeHRlcm5hbEJyb3dzZXIoKTsKLQkJCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQkJVVJMIHVybCA9IG5ldyBGaWxlKHVybFN0cmluZykudG9VUkwoKTsKLQkJCQkJCWJyb3dzZXIub3BlblVSTCh1cmwpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlzdWNjZXNzID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Yzg3NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0bwotICogcHVibGlzaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb25maWdQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29uZmlnUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY29uZmlnVmlld2VyOwotCi0JcHJvdGVjdGVkIFRleHQgYnJpZWZEZXNjVGV4dDsKLQotCXByb3RlY3RlZCBMaXN0IHByb2Nlc3NWaWV3czsKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRDb25maWdOYW1lOwotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZzsKLQotCS8qKgotCSAqIAotCSAqIEBhdXRob3Igc2thbm5vb3IKLQkgKiBAZGVwcmVjYXRlZCAoc2VlIGJlbG93IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci4pCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50OwotCQkJcmV0dXJuIGNvbmZpZy5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRDb2x1bW5UZXh0KG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RDb25maWdQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb25maWdXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb25maWdMYWJlbF90ZXh0KTsKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTIwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyODA7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbmZpZ1ZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29tcG9zaXRlLCAiIiwgMzYwLCA4MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkuc2V0SGVscCgKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fUFVCTElTSF9XSVpBUkRfQUxMX1BBR0VTX0NPTlRFWFQpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQkvLyBjb25maWdWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJY29uZmlnVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCUxpc3Q8T2JqZWN0PiBjb25maWdzTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljb25maWdzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb25maWdzKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoY29uZmlnc0xpc3QsIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChjb25maWdzTGlzdC50b0FycmF5KCkpOwotCQkvLyBjb25maWdWaWV3ZXIuc2V0SW5wdXQoY29uZmlncyk7Ci0KLQkJaWYgKGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJLy8gU2VsZWN0IHRoZSBmaXJzdCBjb25maWcgYW5kIGRpc3BsYXkgaXRzIGJyaWVmIGRlc2NyaXB0aW9uLgotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihjb25maWdzWzBdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY29uZmlnVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJCQkJCXNldEJyaWVmRGVzY3JpcHRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQkJCQkJfQotCQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWlmICh0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCXNlbGVjdGVkQ29uZmlnTmFtZSA9IGl0ZW1zWzBdLmdldFRleHQoKTsKLQkJCS8qTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBzZWxlY3RlZENvbmZpZ05hbWUpOyovCi0JCQkKLQkJCQotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAgaXRlbXNbMF0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiA/Ci0JCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSBpdGVtc1swXS5nZXREYXRhKCkgOiBudWxsOwotCQkJc2V0U2VsZWN0ZWRDb25maWcoY29uZmlnKTsKLQkJCQkJCi0JCQlwcm9jZXNzVmlld3MgPSBudWxsOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdzID0gZ2V0VmFsaWRDb25maWdWaWV3cyhjb25maWcpOwotCQkJfQotCi0JCQlpZiAocHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgcHJvY2Vzc1ZpZXdzLnNpemUoKSA+IDApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5taXNzaW5nVmlld0Vycm9yX21zZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNnZXROZXh0UGFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFBhZ2VEYXRhKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlnTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBsaXN0IG9mIHZhbGlkIGNvbmZpZ3VyYXRpb24gdmlld3MuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gdmlld3MKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFZhbGlkQ29uZmlnVmlld3MoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmcgbXNnOwotCQlTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IHZpZXdzID0gbmV3IEFycmF5TGlzdDxDb250ZW50Q2F0ZWdvcnk+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgdmlldyA9IGl0Lm5leHQoKTsKLQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IodmlldykpIHsKLQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld0NvbnRyaWJ1dG9ySW5mb19tc2csCi0JCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJbWVzc2FnZS5hcHBlbmQoU3RyVXRpbC5UQUIpLmFwcGVuZChtc2cpLmFwcGVuZCgKLQkJCQkJCVN0clV0aWwuTElORV9GRUVEKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh2aWV3LCBjb25maWcpOwotCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJaWYgKHZpZXdzLmNvbnRhaW5zKHZpZXcpKSB7Ci0JCQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZywKLQkJCQkJCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKAotCQkJCQkJCQlTdHJVdGlsLkxJTkVfRkVFRCk7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZpZXdzLmFkZCh2aWV3KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld3NJbmZvX21zZywgY29uZmlnCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQltZXNzYWdlLmluc2VydCgwLCBtc2cgKyBTdHJVdGlsLkxJTkVfRkVFRCArIFN0clV0aWwuTElORV9GRUVEKTsKLQotCQkJLy8gRklYTUUhIFNob3VsZCBub3QgZGlzcGxheSB3YXJuaW5nIG1lc3NhZ2VzIGluIHRoZSBicmllZgotCQkJLy8gZGVzY3JpcHRpb24gZmllbGQuCi0JCQlicmllZkRlc2NUZXh0LnNldFRleHQobWVzc2FnZS50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiB2aWV3czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkQ29uZmlnLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIEJyaWVmIERlc2NyaXB0aW9uIHRleHQgY29udHJvbCB3aXRoIHRoZSBnaXZlbgotCSAqIGNvbmZpZ3VyYXRpb24ncyBicmllZiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlicmllZkRlc2NUZXh0LnNldFRleHQoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0U2VsZWN0ZWRDb25maWcoKSB7Ci0JCXJldHVybiBzZWxlY3RlZENvbmZpZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZykgewotCQl0aGlzLnNlbGVjdGVkQ29uZmlnID0gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29udGVudFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkNGEyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MuUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MuUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlVUlGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcHVibGlzaCB0aGUgZW50aXJlIG1ldGhvZAotICogY29uZmlndXJhdGlvbiBvciBvbmx5IHNwZWNpZmljIHByb2Nlc3NlcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb250ZW50UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29udGVudFBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDaGVja2JveFRyZWVWaWV3ZXIgcHJvY2Vzc1ZpZXdlcjsKLQotCXByb3RlY3RlZCBCdXR0b24gaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveDsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBjbGFzcyBQcm9jZXNzVmlld2VyQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKLQkJCVByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwcml2YXRlIExpc3Q8TWV0aG9kUGFja2FnZT4gcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBhY2thZ2U+KCk7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLAotCQkgKiAgICAgIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHBhcmVudEVsZW1lbnQ7Ci0JCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJcGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdC5uZXh0KCk7Ci0JCQkJCUxpc3Q8UHJvY2Vzcz4gcHJvY2Vzc2VzID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJCQkJaWYgKHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgdWlGb2xkZXIgPSAoUHJvY2Vzc1RyZWVVSUZvbGRlcikgcGFyZW50RWxlbWVudDsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgdWlGb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHVpRm9sZGVyLmdldE5hbWUoKSA9PSBDQVBBQklMSVRZX1BBVFRFUk5TKSB7Ci0JCQkJCUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IHNlbGVjdGVkQ2FwYWJpbGl0eVBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDxDYXBhYmlsaXR5UGF0dGVybj4oKTsKLQkJCQkJTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gY2FwYWJpbGl0eVBhdHRlcm5zID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJucyhwbHVnaW4pOwotCQkJCQlmb3IgKEl0ZXJhdG9yPENhcGFiaWxpdHlQYXR0ZXJuPiBpdCA9IGNhcGFiaWxpdHlQYXR0ZXJucwotCQkJCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDYXBhYmlsaXR5UGF0dGVybiBjcCA9IGl0Lm5leHQoKTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZ2V0UHJvY2Vzc1BhY2thZ2UoY3ApOwotCQkJCQkJaWYgKHBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJCQlzZWxlY3RlZENhcGFiaWxpdHlQYXR0ZXJucy5hZGQoY3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBzZWxlY3RlZENhcGFiaWxpdHlQYXR0ZXJucy50b0FycmF5KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlzdDxEZWxpdmVyeVByb2Nlc3M+IHNlbGVjdGVkRGVsaXZlcnlQcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4oKTsKLQkJCQkJTGlzdDxEZWxpdmVyeVByb2Nlc3M+IGRlbGl2ZXJ5UHJvY2Vzc2VzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc2VzKHBsdWdpbik7Ci0JCQkJCWZvciAoSXRlcmF0b3I8RGVsaXZlcnlQcm9jZXNzPiBpdCA9IGRlbGl2ZXJ5UHJvY2Vzc2VzCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBkcCA9IGl0Lm5leHQoKTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZ2V0UHJvY2Vzc1BhY2thZ2UoZHApOwotCQkJCQkJaWYgKHBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJCQlzZWxlY3RlZERlbGl2ZXJ5UHJvY2Vzc2VzLmFkZChkcCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNlbGVjdGVkRGVsaXZlcnlQcm9jZXNzZXMudG9BcnJheSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29udGVudFBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnUmFkaW9CdXR0b25fdGV4dCwgMSwgdHJ1ZSk7Ci0KLQkJcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b25fdGV4dCwgMSwKLQkJCQlmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIHByb2Nlc3NDb21wb3NpdGUgPSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLAotCQkJCTEpOwotCi0JCXByb2Nlc3NWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHByb2Nlc3NDb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCXByb2Nlc3NWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChwcm9jZXNzQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlwcm9jZXNzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc1ZpZXdlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJcHJvY2Vzc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnICE9IG51bGwgPyBjb25maWcuZ2V0R3VpZCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaEVudGlyZUNvbmZpZyhjb25maWdJZCk7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24ocHVibGlzaENvbmZpZyk7Ci0JCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oIXB1Ymxpc2hDb25maWcpOwotCQlwcm9jZXNzVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKCFwdWJsaXNoQ29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCi0JCXByb2Nlc3NWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBjaGVja2VkRWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0KLQkJCQlwcm9jZXNzVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCXByb2Nlc3NWaWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoY2hlY2tlZEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCWlmIChpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNlbGVjdEJhc2VQcm9jZXNzZXMoKTsKLQkJCQl9Ci0JCQkJdXBkYXRlQ2hlY2tlZFN0YXRlcygpOwotCi0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjaGVjayBzdGF0ZXMgb2YgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlcygpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHByb2Nlc3NWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGx1Z2lucyA9IGNwLmdldENoaWxkcmVuKGNvbmZpZyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3RbXSB1aUZvbGRlcnMgPSBjcC5nZXRDaGlsZHJlbihwbHVnaW5zW2ldKTsKLQkJCQlpbnQgdG90YWxVSUZvbGRlcnMgPSB1aUZvbGRlcnMubGVuZ3RoOwotCQkJCWludCBjaGVja2VkVUlGb2xkZXJzID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVpRm9sZGVycy5sZW5ndGg7IGorKykgewotCQkJCQlPYmplY3RbXSBwcm9jZXNzZXMgPSBjcC5nZXRDaGlsZHJlbih1aUZvbGRlcnNbal0pOwotCQkJCQlpbnQgdG90YWxQcm9jZXNzZXMgPSBwcm9jZXNzZXMubGVuZ3RoOwotCQkJCQlpbnQgY2hlY2tlZFByb2Nlc3NlcyA9IDA7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcHJvY2Vzc2VzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQlpZiAocHJvY2Vzc1ZpZXdlci5nZXRDaGVja2VkKHByb2Nlc3Nlc1trXSkpIHsKLQkJCQkJCQljaGVja2VkUHJvY2Vzc2VzKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNoZWNrZWRQcm9jZXNzZXMgPT0gMCkgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZCh1aUZvbGRlcnNbal0sIGZhbHNlKTsKLQkJCQkJfSBlbHNlIGlmIChjaGVja2VkUHJvY2Vzc2VzID09IHRvdGFsUHJvY2Vzc2VzKSB7Ci0JCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXllZCh1aUZvbGRlcnNbal0sIGZhbHNlKTsKLQkJCQkJCXByb2Nlc3NWaWV3ZXIuc2V0Q2hlY2tlZCh1aUZvbGRlcnNbal0sIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZCh1aUZvbGRlcnNbal0sIHRydWUpOwotCQkJCQl9Ci0JCQkJCWlmIChwcm9jZXNzVmlld2VyLmdldENoZWNrZWQodWlGb2xkZXJzW2pdKSkgewotCQkJCQkJY2hlY2tlZFVJRm9sZGVycysrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjaGVja2VkVUlGb2xkZXJzID09IHRvdGFsVUlGb2xkZXJzKSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheWVkKHBsdWdpbnNbaV0sIGZhbHNlKTsKLQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKHBsdWdpbnNbaV0sIHRydWUpOwotCQkJCX0gZWxzZSBpZiAoY2hlY2tlZFVJRm9sZGVycyA9PSAwKSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQocGx1Z2luc1tpXSwgZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQocGx1Z2luc1tpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgcmVmZXJlbmNlZCBiYXNlIHByb2Nlc3NlcyBpbiB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0QmFzZVByb2Nlc3NlcygpIHsKLQkJLy8gR2V0IHRoZSByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzLgotCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCk7Ci0JCUxpc3Q8UHJvY2Vzcz4gYmFzZVByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzcz4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb25maWd1cmF0aW9uSGVscGVyLmdldEJhc2VQcm9jZXNzZXMoKEFjdGl2aXR5KSBpdC5uZXh0KCksIGNvbmZpZywKLQkJCQkJYmFzZVByb2Nlc3Nlcyk7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlUHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlwcm9jZXNzVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKAotCQkJCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCA9PSBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94KSB7Ci0JCQkvLyBJZiBzZWxlY3RlZCwgc2VsZWN0IGFsbCByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzLgotCQkJc2VsZWN0QmFzZVByb2Nlc3NlcygpOwotCQkJdXBkYXRlQ2hlY2tlZFN0YXRlcygpOwotCQl9Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgY29uZmlnTmFtZSA9IChTdHJpbmcpIG9iajsKLQkJCWNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGNvbmZpZ05hbWUpOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQkJCXByb2Nlc3NWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGdldFNlbGVjdGVkUHJvY2Vzc2VzKCkuc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc2VsZWN0ZWQgcHJvY2Vzc2VzIHRvIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Qcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIHVzZXIgc2VsZWN0ZWQgcHJvY2Vzc2VzIHRvIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Qcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMaXN0PFByb2Nlc3M+IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCkgewotCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzcz4oKTsKLQkJT2JqZWN0W10gc2VsZWN0ZWQgPSBwcm9jZXNzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkW2ldIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQlwcm9jZXNzZXMuYWRkKChQcm9jZXNzKSBzZWxlY3RlZFtpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3REZXN0aW5hdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDc3YjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuQ29tbW9uUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQKLSAqIGZvcm1hdCBmb3IgdGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3REZXN0aW5hdGlvblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3REZXN0aW5hdGlvblBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0RFTElNSVRFUiA9ICJ8IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMSVRfUFJFRkVSRU5DRV9ERUxJTUlURVIgPSAiXFwiICsgUFJFRkVSRU5DRV9ERUxJTUlURVI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFBhdGggPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJLmdldERlZmF1bHRQdWJsaXNoUGF0aCgpOwotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIENvbWJvIGRpckNvbWJvOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgR3JvdXAgd2ViQXBwR3JvdXA7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBCdXR0b24gamF2YVdlYkFwcFJhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBqYXZhV2ViQXBwQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIExhYmVsIHdlYkFwcE5hbWVMYWJlbDsKLQotCXByb3RlY3RlZCBDb21ibyB3ZWJBcHBOYW1lQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGluY2x1ZGVTZWFyY2hDaGVja2JveDsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IHNlbGVjdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdERlc3RpbmF0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90aXRsZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RleHQsCi0JCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RGVzdGluYXRpb25QYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQlDb21wb3NpdGUgZGlyQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGRpckNvbXBvc2l0ZSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRpckxhYmVsX3RleHQpOwotCi0JCWRpckNvbWJvID0gY3JlYXRlQ29tYm9ib3goZGlyQ29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oZGlyQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCi0JCXdlYkFwcEdyb3VwID0gc3VwZXIuY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwR3JvdXBfdGV4dCwgMSk7Ci0KLQkJc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24od2ViQXBwR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0KTsKLQotCQlzdGF0aWNXZWJTaXRlQ29tcG9zaXRlID0gY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKHdlYkFwcEdyb3VwLCAxKTsKLQotCQlqYXZhV2ViQXBwUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbih3ZWJBcHBHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQpOwotCi0JCWphdmFXZWJBcHBDb21wb3NpdGUgPSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUod2ViQXBwR3JvdXAsIDMpOwotCi0JCWluY2x1ZGVTZWFyY2hDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGphdmFXZWJBcHBDb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmluY2x1ZGVTZWFyY2hDaGVja2JveF90ZXh0LCAzKTsKLQotCQl3ZWJBcHBOYW1lTGFiZWwgPSBjcmVhdGVMYWJlbChqYXZhV2ViQXBwQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy53ZWJBcHBsaWNhdGlvbk5hbWVMYWJlbF90ZXh0KTsKLQotCQl3ZWJBcHBOYW1lQ29tYm8gPSBjcmVhdGVDb21ib2JveChqYXZhV2ViQXBwQ29tcG9zaXRlLCAyKTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZyAhPSBudWxsID8gY29uZmlnLmdldEd1aWQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGRpciA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hQYXRoKGNvbmZpZ0lkKTsKLQkJaWYgKGRpciAhPSBudWxsICYmIGRpci5sZW5ndGgoKSA+IDApIHsKLQkJCWRpckNvbWJvLnNldEl0ZW1zKHN1YkFycmF5KGNvdmVyU3RyaW5nVG9BcnJheShkaXIpKSk7Ci0JCQlkaXJDb21iby5zZWxlY3QoMCk7Ci0JCX0KLQotCQlib29sZWFuIHB1Ymxpc2hTdGF0aWNXZWJTaXRlID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnSWQpOwotCQlzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHB1Ymxpc2hTdGF0aWNXZWJTaXRlKTsKLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbighcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCi0JCWluY2x1ZGVTZWFyY2hDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5jbHVkZVNlYXJjaChjb25maWdJZCkpOwotCi0JCVN0cmluZyB3ZWJBcHBOYW1lID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0V2ViQXBwTmFtZShjb25maWdJZCk7Ci0JCWlmICh3ZWJBcHBOYW1lICE9IG51bGwgJiYgd2ViQXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXdlYkFwcE5hbWVDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyB3ZWJBcHBOYW1lIH0pOwotCQkJd2ViQXBwTmFtZUNvbWJvLnNldFRleHQod2ViQXBwTmFtZSk7Ci0JCX0KLQotCQl1cGRhdGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZGlyQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJCWRpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9KTsKLQotCQl3ZWJBcHBOYW1lQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gc3ViQXJyYXkoU3RyaW5nW10gYXJyKSB7Ci0JCWludCBsbCA9IENvbW1vblByZWZlcmVuY2VzLmdldFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpOwotCQlpZiAobGwgPCAxKQotCQkJbGwgPSBDb21tb25QcmVmZXJlbmNlcy5nZXREZWZhdWx0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCk7Ci0KLQkJaW50IGFyckxlbmd0aCA9IGFyci5sZW5ndGg7Ci0KLQkJaWYgKGFyckxlbmd0aCA8IGxsICYmIGFyclswXS5lcXVhbHMoZGVmYXVsdFBhdGgpKQotCQkJcmV0dXJuIGFycjsKLQotCQlsbCA9IGFyckxlbmd0aCA+PSBsbCA/IGxsIDogYXJyTGVuZ3RoICsgMTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tsbF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGwgLSAxOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycltpXTsKLQkJfQotCQlyZXN1bHRbbGwgLSAxXSA9IGFyclswXS5lcXVhbHMoZGVmYXVsdFBhdGgpID8gYXJyW2xsXSA6IGRlZmF1bHRQYXRoOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvdmVyU3RyaW5nVG9BcnJheShTdHJpbmcgcHJlZmVyZW5jZVN0cikgewotCQlyZXR1cm4gcHJlZmVyZW5jZVN0ci5zcGxpdChTUExJVF9QUkVGRVJFTkNFX0RFTElNSVRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0QXJyYXlUb1N0cmluZyhTdHJpbmdbXSBhcnIpIHsKLQkJU3RyaW5nQnVmZmVyIHNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChhcnIgPT0gbnVsbCB8fCBhcnIubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gc0J1ZmZlci50b1N0cmluZygpOwotCQlzQnVmZmVyLmFwcGVuZChhcnJbMF0pOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykgewotCQkJc0J1ZmZlci5hcHBlbmQoUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJc0J1ZmZlci5hcHBlbmQoYXJyW2ldKTsKLQkJfQotCQlyZXR1cm4gc0J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCWJvb2xlYW4gcHVibGlzaFN0YXRpY1dlYlNpdGUgPSBnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCk7Ci0JCXdlYkFwcE5hbWVMYWJlbC5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCXdlYkFwcE5hbWVDb21iby5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCWluY2x1ZGVTZWFyY2hDaGVja2JveC5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqOwotCQkJaWYgKCFzZWxlY3RlZENvbmZpZ3MuY29udGFpbnMoY29uZmlnKSkgewotCQkJCXNlbGVjdGVkQ29uZmlncy5hZGQoY29uZmlnKTsKLQkJCQlpbml0Q29udHJvbHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlTdHJpbmcgcGF0aCA9IGdldFB1Ymxpc2hEaXJlY3RvcnkoKTsKLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aCk7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKTsKLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkUHVibGlzaFBhdGgocGF0aCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQkJaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCkpIHsKLQkJCVN0cmluZyB3ZWJBcHBOYW1lID0gZ2V0V2ViQXBwTmFtZSgpOwotCQkJaWYgKHdlYkFwcE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwTmFtZUVycm9yX21zZyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkTmFtZSh3ZWJBcHBOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwTmFtZUNoYXJzRXJyb3JfbXNnKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcmVjdG9yeSgpIHsKLQkJU3RyaW5nIGRpclRleHQgPSBkaXJDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAoZGlyVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQlyZXR1cm4gZGlyLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBkaXJUZXh0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQdWJsaXNoRGlyZWN0b3J5QXJyYXkoKSB7Ci0JCVN0cmluZyBzZWxlY3RlZHRleHQgPSBkaXJDb21iby5nZXRUZXh0KCk7Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2Yoc2VsZWN0ZWR0ZXh0KSA+IDApIHsKLQkJCWRpckNvbWJvLnJlbW92ZShzZWxlY3RlZHRleHQpOwotCQl9Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2Yoc2VsZWN0ZWR0ZXh0KSA8IDApIHsKLQkJCWRpckNvbWJvLmFkZChzZWxlY3RlZHRleHQsIDApOwotCQl9Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2YoZGVmYXVsdFBhdGgpID4gMCkgewotCQkJZGlyQ29tYm8ucmVtb3ZlKGRlZmF1bHRQYXRoKTsKLQkJfQotCi0JCXJldHVybiBkaXJDb21iby5nZXRJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHN0YXRpYyB3ZWIgc2l0ZSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgamF2YSB3ZWIgYXBwbGljYXRpb24gc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEphdmFXZWJBcHBTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBqYXZhV2ViQXBwUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgaW5jbHVkZSBzZWFyY2ggc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVTZWFyY2hTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBpbmNsdWRlU2VhcmNoQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2ViIGFwbGljYXRpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkFwcE5hbWUoKSB7Ci0JCXJldHVybiB3ZWJBcHBOYW1lQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlciBzZWxlY3Rpb25zIGluIHRoaXMgd2l6YXJkIHBhZ2UgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnLmdldEd1aWQoKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hQYXRoKGNvbmZpZ0lkLAotCQkJCQljb252ZXJ0QXJyYXlUb1N0cmluZyhnZXRQdWJsaXNoRGlyZWN0b3J5QXJyYXkoKSkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnSWQsCi0JCQkJCWdldFN0YXRpY1dlYlNpdGVTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlU2VhcmNoKGNvbmZpZ0lkLAotCQkJCQlnZXRJbmNsdWRlU2VhcmNoU2VsZWN0aW9uKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0V2ViQXBwTmFtZShjb25maWdJZCwgZ2V0V2ViQXBwTmFtZSgpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZWU4NTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hIVE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyBmb3IgdGhlCi0gKiBnZW5lcmF0ZWQgd2ViIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2NTY3Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0JCi0JcHJvdGVjdGVkIEdyb3VwIGxheW91dEdyb3VwOwotCi0JcHJvdGVjdGVkIFRleHQgdGl0bGVUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgYWJvdXRIVE1MVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGZlZWRiYWNrVVJMVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gc2VsZWN0SFRNTEJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaEdsb3NzYXJ5Q2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hJbmRleENoZWNrYm94OwotCi0JcHJvdGVjdGVkIFRleHQgYmFubmVySW1hZ2VUZXh0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RJbWFnZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoVW5vcGVuQUREQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hCYXNlQURDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzaG93UmVsYXRlZERlc2NyaXB0b3JzOwotCQotCXByb3RlY3RlZCBCdXR0b24gc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZTsKLQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciBhY3Rpdml0eVRhYlZpZXdlcjsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IHNlbGVjdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhY3Rpdml0eVRhYk1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0Jc3RhdGljIHsKLQkJYWN0aXZpdHlUYWJNYXAucHV0KEFjdGl2aXR5TGF5b3V0LlRBQl9OQU1FX0FDVElWSVRZX0RFU0MsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsKLQkJYWN0aXZpdHlUYWJNYXAucHV0KEFjdGl2aXR5TGF5b3V0LlRBQl9OQU1FX0FDVElWSVRZX1dCUywKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmUpOwotCQlhY3Rpdml0eVRhYk1hcC5wdXQoQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfVEJTLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb24pOwotCQlhY3Rpdml0eVRhYk1hcC5wdXQoQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV1BCUywKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RleHQsCi0JCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJY3JlYXRlVGl0bGVBbmRMaW5rc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUdsb3NzYXJ5QW5kSW5kZXhHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVMb29rQW5kRmVlbEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVZhbGlkYXRpb24oY29tcG9zaXRlKTsKLQkJY3JlYXRlRGlhZ3JhbUdlbmVyYXRpb25Hcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVMYXlvdXRHcm91cChjb21wb3NpdGUpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCS5zZXRIZWxwKAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9QVUJMSVNIX1dJWkFSRF9BTExfUEFHRVNfQ09OVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGl0bGUgYW5kIGxpbmtzIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZVRpdGxlQW5kTGlua3NHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIHRpdGxlQW5kTGlua3NHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnRpdGxlQW5kTGlua3NHcm91cF90ZXh0LCAzKTsKLQotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy50aXRsZUxhYmVsX3RleHQpOwotCQl0aXRsZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYWJvdXRIVE1MTGFiZWxfdGV4dCk7Ci0JCWFib3V0SFRNTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RIVE1MQnV0dG9uID0gbmV3IEJ1dHRvbih0aXRsZUFuZExpbmtzR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0SFRNTEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZmVlZGJhY2tVUkxMYWJlbF90ZXh0KTsKLQkJZmVlZGJhY2tVUkxUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHRpdGxlQW5kTGlua3NHcm91cCwgIiIsIDM2MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gdGl0bGVBbmRMaW5rc0dyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExvb2sgYW5kIGZlZWwgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlTG9va0FuZEZlZWxHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGxvb2tBbmRGZWVsR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5sb29rQW5kRmVlbEdyb3VwX3RleHQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGxvb2tBbmRGZWVsR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJhbm5lckltYWdlTGFiZWxfdGV4dCk7Ci0JCWJhbm5lckltYWdlVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChsb29rQW5kRmVlbEdyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24obG9va0FuZEZlZWxHcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3RJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCXJldHVybiBsb29rQW5kRmVlbEdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdsb3NhcnkgYW5kIGluZGV4IGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZUdsb3NzYXJ5QW5kSW5kZXhHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdsb3NzYXJ5QW5kSW5kZXhHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0LCAyKTsKLQotCQlwdWJsaXNoR2xvc3NhcnlDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGdsb3NzYXJ5QW5kSW5kZXhHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dCk7Ci0JCXB1Ymxpc2hJbmRleENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZ2xvc3NhcnlBbmRJbmRleEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoSW5kZXhMYWJlbF90ZXh0KTsKLQotCQlyZXR1cm4gZ2xvc3NhcnlBbmRJbmRleEdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFZhbGlkYXRpb24gZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlVmFsaWRhdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIHZhbGlkYXRpb25Hcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZhbGlkYXRpb25Hcm91cF90ZXh0LCAyKTsKLQotCQljaGVja0V4dGVybmFsTGlua3NDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KHZhbGlkYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2hlY2tFeHRlcm5hbExpbmtzTGFiZWxfdGV4dCk7Ci0KLQkJY29udmVydEJyb2tlbkxpbmtzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveCh2YWxpZGF0aW9uR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbnZlcnRCcm9rZW5MaW5rc0xhYmVsX3RleHQpOwotCi0JCXJldHVybiB2YWxpZGF0aW9uR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRGlhZ3JhbSBHZW5lcmF0aW9uIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZURpYWdyYW1HZW5lcmF0aW9uR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBkaWFncmFtR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kaWFncmFtR3JvdXBfdGV4dCwgMSk7Ci0KLQkJcHVibGlzaFVub3BlbkFERENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZGlhZ3JhbUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQWN0aXZpdHlEZXRhaWxEaWFncmFtc0xhYmVsX3RleHQpOwotCi0JCXB1Ymxpc2hCYXNlQURDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGRpYWdyYW1Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEV4dGVuZGVkQWN0aXZpdHlEaWFncmFtc0xhYmVsX3RleHQpOwotCi0JCXJldHVybiBkaWFncmFtR3JvdXA7Ci0JfQotCi0JcHVibGljIEdyb3VwIGdldExheW91dEdyb3VwKCkgewotCQlyZXR1cm4gbGF5b3V0R3JvdXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0R3JvdXAoR3JvdXAgbGF5b3V0R3JvdXApIHsKLQkJdGhpcy5sYXlvdXRHcm91cCA9IGxheW91dEdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExheW91dCBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGdyb3VwIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVMYXlvdXRHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWxheW91dEdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMubGF5b3V0R3JvdXBfdGV4dCwgMSk7Ci0KLQkJcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hMaWdodFdlaWdodFRyZWVMYWJlbF90ZXh0KTsKLQotCQlzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWVfdGV4dCk7Ci0KLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ciA9IGNyZWF0ZUNoZWNrYm94KGxheW91dEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoRXh0cmFEZXNjcmlwdG9ySW5mb0xhYmVsX3RleHQpOwotCi0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnMgPSBjcmVhdGVDaGVja2JveChsYXlvdXRHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2hvd1JlbGF0ZWREZXNjcmlwdG9yc190ZXh0KTsJCQotCQlDb21wb3NpdGUgZGVzY3JpcHRvckNvbXBvc2l0ZSA9IGNyZWF0ZUNoaWxkR3JpZExheW91dENvbXBvc2l0ZShsYXlvdXRHcm91cCwgMSk7Ci0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5zaG93UmVsYXRlZERlc2NyaXB0b3JzX29wdGlvbl90ZXh0KTsKLQkJCi0JCUNvbXBvc2l0ZSBhY3Rpdml0eVRhYkNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUobGF5b3V0R3JvdXAsCi0JCQkJMik7Ci0JCSgoR3JpZExheW91dCkgYWN0aXZpdHlUYWJDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IC01OwotCQkoKEdyaWRMYXlvdXQpIGFjdGl2aXR5VGFiQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gLTU7Ci0KLQkJY3JlYXRlTGFiZWwoYWN0aXZpdHlUYWJDb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdERlZmF1bHRBY3Rpdml0eVRhYl90ZXh0KTsKLQotCQlhY3Rpdml0eVRhYlZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihhY3Rpdml0eVRhYkNvbXBvc2l0ZSwgU1dULkJPUkRFUgotCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWN0aXZpdHlUYWJWaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IHBhcmFtKSB7Ci0JCQkJaWYgKHBhcmFtIGluc3RhbmNlb2YgTWFwLkVudHJ5KSB7Ci0JCQkJCXJldHVybiAoU3RyaW5nKSAoKE1hcC5FbnRyeSkgcGFyYW0pLmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHBhcmFtLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhY3Rpdml0eVRhYlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCi0JCXJldHVybiBsYXlvdXRHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgbWVhbnMgdG8gYWRkIGFkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgcHVibGlzaGVkIHdlYiBzaXRlCi0JICogZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmNsdWRlQWRkaXRpb25hbFB1Ymxpc2hpbmdPcHRpb25zKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgZ3JvdXBzIHRvIHRoaXMgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdWJsaXNoaW5nT3B0aW9uc0dyb3VwcyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZyAhPSBudWxsID8gY29uZmlnLmdldEd1aWQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJdGl0bGVUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0VGl0bGUoY29uZmlnSWQpKTsKLQkJYmFubmVySW1hZ2VUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0QmFubmVySW1hZ2UoY29uZmlnSWQpKTsKLQkJYWJvdXRIVE1MVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEFib3V0SFRNTChjb25maWdJZCkpOwotCQlmZWVkYmFja1VSTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRGZWVkYmFja1VSTChjb25maWdJZCkpOwotCQlwdWJsaXNoR2xvc3NhcnlDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5jbHVkZUdsb3NzYXJ5KGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hJbmRleENoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlSW5kZXgoY29uZmlnSWQpKTsKLQkJY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldENoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdJZCkpOwotCQljb252ZXJ0QnJva2VuTGlua3NDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q29udmVydEJyb2tlbkxpbmtzKGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hVbm9wZW5BRERDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5REQoY29uZmlnSWQpKTsKLQkJcHVibGlzaEJhc2VBRENoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihjb25maWdJZCkpOwotCQlwdWJsaXNoTGlnaHRXZWlnaHRUcmVlQ2hlY2tib3guc2V0U2VsZWN0aW9uKCFQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRMaWdodFdlaWdodFRyZWUoY29uZmlnSWQpKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhjb25maWdJZCkpOwotCQlzaG93UmVsYXRlZERlc2NyaXB0b3JzLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKGNvbmZpZ0lkKSk7Ci0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24oY29uZmlnSWQpKTsKLQkJaWYgKHNob3dSZWxhdGVkRGVzY3JpcHRvcnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJaWYgKHNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCUFic3RyYWN0RWxlbWVudExheW91dC5wcm9jZXNzRGVzY3JpdG9yc05ld09wdGlvbiA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQucHJvY2Vzc0Rlc2NyaXRvcnNOZXdPcHRpb24gPSBmYWxzZTsKLQkJfQotCQlzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKGNvbmZpZ0lkKSk7Ci0KLQkJaWYgKGFjdGl2aXR5VGFiVmlld2VyLmdldENvbWJvKCkuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJYWN0aXZpdHlUYWJWaWV3ZXIuYWRkKGFjdGl2aXR5VGFiTWFwLmVudHJ5U2V0KCkudG9BcnJheSgpKTsKLQkJfQotCQlhY3Rpdml0eVRhYlZpZXdlci5nZXRDb21ibygpLnNldFRleHQoCi0JCQkJYWN0aXZpdHlUYWJNYXAuZ2V0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKGNvbmZpZ0lkKSkpOwotCi0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXJzIGZvciB0aGUgY29udHJvbHMgb24gdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc2VsZWN0SW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkiKi5naWYiLCAiKi5qcGciLCAiKi5ibXAiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQliYW5uZXJJbWFnZVRleHQuc2V0VGV4dChpbWFnZUZpbGUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNlbGVjdEhUTUxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCSIqLmh0bSIsICIqLmh0bWwiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3RyaW5nIGh0bWxGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGh0bWxGaWxlICE9IG51bGwpIHsKLQkJCQkJCWFib3V0SFRNTFRleHQuc2V0VGV4dChodG1sRmlsZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYWJvdXRIVE1MVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hvd1JlbGF0ZWREZXNjcmlwdG9ycy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHNob3dSZWxhdGVkRGVzY3JpcHRvcnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJQWJzdHJhY3RFbGVtZW50TGF5b3V0LnByb2Nlc3NEZXNjcml0b3JzTmV3T3B0aW9uID0gZmFsc2U7Ci0JCQkJCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChzaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUFic3RyYWN0RWxlbWVudExheW91dC5wcm9jZXNzRGVzY3JpdG9yc05ld09wdGlvbiA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQWJzdHJhY3RFbGVtZW50TGF5b3V0LnByb2Nlc3NEZXNjcml0b3JzTmV3T3B0aW9uID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIHNlbGVjdGVkQ29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iajsKLQkJCWlmICghc2VsZWN0ZWRDb25maWdzLmNvbnRhaW5zKHNlbGVjdGVkQ29uZmlnKSkgewotCQkJCXNlbGVjdGVkQ29uZmlncy5hZGQoc2VsZWN0ZWRDb25maWcpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkQ29uZmlnICE9IGNvbmZpZykgewotCQkJCWNvbmZpZyA9IHNlbGVjdGVkQ29uZmlnOwotCQkJCWluaXRDb250cm9scygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCVN0cmluZyBwYXRoID0gYWJvdXRIVE1MVGV4dC5nZXRUZXh0KCk7Ci0JCUlQYXRoIGVjUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHBhdGgpOwotCQlib29sZWFuIGlzVmFsaWQgPSBlY1BhdGguaXNWYWxpZFBhdGgocGF0aCk7Ci0JCWlmICghaXNWYWxpZCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkQWJvdXRQYXRoRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkUHVibGlzaFBhdGgocGF0aCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZEFib3V0UGF0aENoYXJzRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlB1Ymxpc2hPcHRpb25zPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaGluZ09wdGlvbnMoKSB7Ci0JCVB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zID0gbmV3IFB1Ymxpc2hIVE1MT3B0aW9ucygpOwotCi0JCW9wdGlvbnMuc2V0VGl0bGUoZ2V0V2ViU2l0ZVRpdGxlKCkpOwotCQlvcHRpb25zLnNldEJhbm5lckltYWdlKGdldEJhbm5lckltYWdlUGF0aCgpKTsKLQkJb3B0aW9ucy5zZXRBYm91dEhUTUwoZ2V0QWJvdXRIVE1MUGF0aCgpKTsKLQkJb3B0aW9ucy5zZXRGZWVkYmFja1VSTChnZXRGZWVkYmFja1VSTCgpKTsKLQkJb3B0aW9ucy5zZXRQdWJsaXNoR2xvc3NhcnkoZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hJbmRleChnZXRQdWJsaXNoSW5kZXhTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0Q2hlY2tFeHRlcm5hbExpbmtzKGdldENoZWNrRXh0ZXJuYWxMaW5rc1NlbGVjdGlvbigpKTsKLQkJb3B0aW9ucy5zZXRQdWJsaXNoVW5vcGVuQUREKGdldFB1Ymxpc2hVbm9wZW5BRERTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0UHVibGlzaEJhc2VBRChnZXRQdWJsaXNoQmFzZUFEU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldENvbnZlcnRCcm9rZW5MaW5rcyhnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0UHVibGlzaExpZ2h0V2VpZ2h0VHJlZShnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycyhnZXRTaG93RXh0cmFEZXNjcmlwdG9ySW5mb1NlbGVjdGlvbigpKTsKLQkJb3B0aW9ucy5zZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKHNob3dSZWxhdGVkRGVzY3JpcHRvcnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24oc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbi5nZXRTZWxlY3Rpb24oKSk7CQkKLQkJb3B0aW9ucy5zZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKHNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCVN0cmluZyBkZWZhdWx0QWN0aXZpdHlUYWIgPSBnZXREZWZhdWx0QWN0aXZpdHlUYWJTZWxlY3Rpb24oKTsKLQkJaWYgKGRlZmF1bHRBY3Rpdml0eVRhYiAhPSBudWxsKSB7Ci0JCQlvcHRpb25zLnNldERlZmF1bHRBY3Rpdml0eVRhYihkZWZhdWx0QWN0aXZpdHlUYWIpOwotCQl9Ci0KLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgd2ViIHNpdGUgdGl0bGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRXZWJTaXRlVGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBiYW5uZXIgaW1hZ2UgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJhbm5lckltYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGJhbm5lckltYWdlVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGFib3V0IEhUTUwgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFib3V0SFRNTFBhdGgoKSB7Ci0JCXJldHVybiBhYm91dEhUTUxUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZmVlZGJhY2sgVVJMLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoKSB7Ci0JCXJldHVybiBmZWVkYmFja1VSTFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoIGdsb3NzYXJ5IHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoR2xvc3NhcnlTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoR2xvc3NhcnlDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoIGluZGV4IHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoSW5kZXhTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoSW5kZXhDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBjaGVjayBleHRlcm5hbCBsaW5rcyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q2hlY2tFeHRlcm5hbExpbmtzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgY29udmVydCBicm9rZW4gbGlua3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldENvbnZlcnRCcm9rZW5MaW5rc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGF1dG8gZ2VuZXJhdGUgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoVW5vcGVuQUREU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaFVub3BlbkFERENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbSBmb3IgYmFzZSBhY3RpdnRpZXMgd2l0aAotCSAqIHVubW9kaWZpZWQgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoQmFzZUFEU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEJhc2VBRENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGdlbmVyYXRlIGxpZ2h0IHdlaWdodCB0cmVlIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gIXB1Ymxpc2hMaWdodFdlaWdodFRyZWVDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBzaG93IGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvd0V4dHJhRGVzY3JpcHRvckluZm9TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9yIGluIGNvbnRlbnQgcGFnZQotCSAqIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgU2hvdyBhbGwgaW5kaXJlY3QgKGdyZWVuKSBvY2N1cnJlbmNlcyAKLQkgKiBpbiBleHRlbmRlZCBwYXR0ZXJucwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb25TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uLmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBzaG93IGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZGVmYXVsdCBhY3Rpdml0eSB0YWIgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFjdGl2aXR5VGFiVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlNYXAuRW50cnkgaXRlbSA9IChNYXAuRW50cnkpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgaXRlbS5nZXRLZXkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB1c2VyIHNlbGVjdGlvbnMgaW4gdGhpcyB3aXphcmQgcGFnZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29uZmlnSWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJc2F2ZVRpdGxlQW5kTGlua3NQcmVmZXJlbmNlcyhjb25maWdJZCk7Ci0JCQlzYXZlR2xvc3NhcnlBbmRJbmRleFByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJCXNhdmVWYWxpZGF0aW9uUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJc2F2ZURpYWdyYW1HZW5lcmF0aW9uUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJc2F2ZUxheW91dFByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB0aXRsZSBhbmQgbGlua3MgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRpdGxlQW5kTGlua3NQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0VGl0bGUoY29uZmlnSWQsIGdldFdlYlNpdGVUaXRsZSgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QmFubmVySW1hZ2UoY29uZmlnSWQsIGdldEJhbm5lckltYWdlUGF0aCgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QWJvdXRIVE1MKGNvbmZpZ0lkLCBnZXRBYm91dEhUTUxQYXRoKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRGZWVkYmFja1VSTChjb25maWdJZCwgZ2V0RmVlZGJhY2tVUkwoKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdsb3NhYXJ5IGFuZCBpbmRleCBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlR2xvc3NhcnlBbmRJbmRleFByZWZlcmVuY2VzKFN0cmluZyBjb25maWdJZCkgewotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlR2xvc3NhcnkoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlSW5kZXgoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVWYWxpZGF0aW9uUHJlZmVyZW5jZXMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldENoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdJZCwKLQkJCQlnZXRDaGVja0V4dGVybmFsTGlua3NTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldENvbnZlcnRCcm9rZW5MaW5rcyhjb25maWdJZCwKLQkJCQlnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpYWdyYW0gZ2VuZXJhdGlvbiBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGlhZ3JhbUdlbmVyYXRpb25QcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5REQoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaFVub3BlbkFERFNlbGVjdGlvbigpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEJhc2VBRFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbGF5b3V0IHByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVMYXlvdXRQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0TGlnaHRXZWlnaHRUcmVlKGNvbmZpZ0lkLAotCQkJCWdldFB1Ymxpc2hMaWdodFdlaWdodFRyZWVTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEV4dHJhRGVzY3JpcHRvckluZm8oY29uZmlnSWQsCi0JCQkJZ2V0U2hvd0V4dHJhRGVzY3JpcHRvckluZm9TZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFNob3dSZWxhdGVkRGVzY3JpcHRvcnMoY29uZmlnSWQsCi0JCQkJZ2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc1NlbGVjdGlvbigpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbihjb25maWdJZCwKLQkJCQlnZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uU2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKGNvbmZpZ0lkLAotCQkJCWdldFNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWVTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldERlZmF1bHRBY3Rpdml0eVRhYihjb25maWdJZCwKLQkJCQlnZXREZWZhdWx0QWN0aXZpdHlUYWJTZWxlY3Rpb24oKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTk3NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFB1Ymxpc2hpbmcgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvcHJvZmlsaW5nPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWQ1NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmVkYzJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBwdWJsaXNoaW5nLmphciwgbGliL3Jwd2NvcmUuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUubmV0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MmZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotc291cmNlLnB1Ymxpc2hpbmcuamFyID0gc3JjLwotb3V0cHV0LnB1Ymxpc2hpbmcuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcHVibGlzaGluZy5qYXIsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGRvY3Jvb3QvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIGtleXdvcmRpbmRleGRlZi50eHQsXAotICAgICAgICAgICAgICAga2V5d29yZHBvc3RhbWJsZS50eHQsXAotICAgICAgICAgICAgICAga2V5d29yZHByZWFtYmxlLnR4dCxcCi0gICAgICAgICAgICAgICBrZXl3b3Jkcy50eHQsXAotICAgICAgICAgICAgICAgeHNsLwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2VwZi13ZWItc2VhcmNoLmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvZXBmLXdlYi1zZWFyY2guamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGVkMzE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvZXBmLXdlYi1zZWFyY2guamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL2xpYi9lcGYtd2ViLmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvZXBmLXdlYi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWEwNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL2xpYi9lcGYtd2ViLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvaWN1NGpfM180LmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvaWN1NGpfM180LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1ZTNjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2ljdTRqXzNfNC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2x1Y2VuZS1jb3JlLTEuOS4xLmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvbHVjZW5lLWNvcmUtMS45LjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQzZTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvbHVjZW5lLWNvcmUtMS45LjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL3dlYi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0YTJlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCFET0NUWVBFIHdlYi1hcHAKLSAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKLSAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KLQotPHdlYi1hcHA+Ci0gIDxzZXJ2bGV0PgotICAJPHNlcnZsZXQtbmFtZT5TZWFyY2hTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gIAk8c2VydmxldC1jbGFzcz5vcmcuZWNsaXBzZS5lcGYud2ViLnNlcnZsZXQuU2VhcmNoU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgCTxpbml0LXBhcmFtPgotICAJCTxwYXJhbS1uYW1lPnNlYXJjaEluZGV4PC9wYXJhbS1uYW1lPgotICAJCTxwYXJhbS12YWx1ZT5zZWFyY2gvaW5kZXg8L3BhcmFtLXZhbHVlPgotICAJPC9pbml0LXBhcmFtPgotICAJPGluaXQtcGFyYW0+Ci0gIAkJPHBhcmFtLW5hbWU+eHNsRmlsZTwvcGFyYW0tbmFtZT4KLSAgCQk8cGFyYW0tdmFsdWU+L3NlYXJjaC9zZWFyY2hfcmVzdWx0LnhzbDwvcGFyYW0tdmFsdWU+Ci0gIAk8L2luaXQtcGFyYW0+Ci0gIDwvc2VydmxldD4KLSAgPHNlcnZsZXQtbWFwcGluZz4KLSAgPCEtLSBub3RlOiBkb24ndCBjaGFuZ2UgdGhlIHNlcnZsZXQgbWFwcGluZyBoZXJlIHNpbmNlIHRoZSBzdHJpbmcgaXMgdXNlZCBpbiBvdGhlciBmaWxlcyBhcyB3ZWxsIC0tPgotICAJPHNlcnZsZXQtbmFtZT5TZWFyY2hTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gIAk8dXJsLXBhdHRlcm4+L1NlYXJjaFNlcnZsZXQ8L3VybC1wYXR0ZXJuPgotICA8L3NlcnZsZXQtbWFwcGluZz4KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvYWJvdXQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9hYm91dC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNmNkYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9hYm91dC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotCi08aHRtbCBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLTwhLS0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLQk8dGl0bGU+QWJvdXQ8L3RpdGxlPgotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotCQlib2R5IHsKLQkJCW1hcmdpbjogOHB4OwotCQl9Ci0JPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQk8aW1nIHNyYz0iLi9pbWFnZXMvaWNvbl9hYm91dC5naWYiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWx0PSJhYm91dCBpY29uIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4KLTxzcGFuIGNsYXNzPSJwb3AiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8YnIgLz4KLVZlcnNpb24gMS41PGJyIC8+Ci08YnIgLz4KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA4LjxiciAvPgotQWxsIFJpZ2h0cyBSZXNlcnZlZC48L3NwYW4+PGJyIC8+PGJyIC8+Ci0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCSAgPHRyPgotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A7Q2xvc2UmbmJzcDs8L3NwYW4+PC9hPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JPC90YWJsZT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9lcGYuaWNvIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9lcGYuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M4YmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvZXBmLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL0VQRkNfYmFubmVyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL0VQRkNfYmFubmVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlM2RkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9FUEZDX2Jhbm5lci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9iYW5uZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzMDBlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjcwMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkMjAyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmI4MTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGxfcmlnaHQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGxfcmlnaHQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA2YzkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTA0ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTYzNWIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViN2Q0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG93bl9hcnJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OGM0MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG93bl9hcnJvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9leHBhbmRfYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTE4YTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvaWNvbl9hYm91dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9pY29uX2Fib3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExM2U1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9pY29uX2Fib3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2Fib3V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2Fib3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhYTE0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9kaXNwbGF5VHJlZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9kaXNwbGF5VHJlZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YmNiYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZGlzcGxheVRyZWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZmVlZGJhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZmVlZGJhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ1MmY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2ZlZWRiYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dldFN0YXJ0ZWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZ2V0U3RhcnRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDhjYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZ2V0U3RhcnRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9nbG9zc2FyeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9nbG9zc2FyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMmEyM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZ2xvc3NhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaGFuZGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2hhbmRsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOGQwOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaGFuZGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2luZGV4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2luZGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2ZDMxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9pbmRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9wcmludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9wcmludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWExZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfcHJpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2VhcmNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NlYXJjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzcwZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2VhcmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NpdGVNYXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2l0ZU1hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjEyYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2l0ZU1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9zaGltLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NoaW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJhNzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NoaW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvc3BsYXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NwbGFzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzk1NmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvc3BsYXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlY2EwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiODljMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdG9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWFjZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcF9zbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90b3Bfc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTdmYmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcF9zbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy91cF9hcnJvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy91cF9hcnJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTVjY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdXBfYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2luZGV4LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiOGU1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2luZGV4LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotcC5pbmRleGhlYWRpbmcKLXsKLWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotIGZvbnQtd2VpZ2h0OiBib2xkOwotbWFyZ2luLXRvcDogKzJweDsgCi1tYXJnaW4tYm90dG9tOiAtMnB4OwotfQotCi1wLmluZGV4bGV2ZWwxCi17Ci1mb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSBmb250LXNpemU6IHNtYWxsZXI7Ci0gbWFyZ2luLXRvcDogLTBweDsgCi1tYXJnaW4tYm90dG9tOiAtMnB4OwotfQotCi1wLmluZGV4bGV2ZWwyCi17Ci1mb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSBmb250LXNpemU6IHNtYWxsZXI7Ci0gbWFyZ2luLWxlZnQ6ICsxNnB4OwotIG1hcmdpbi10b3A6IC0xcHg7IAotbWFyZ2luLWJvdHRvbTogLTJweDsKLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2luZGV4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhMmE5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2luZGV4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCQotPGh0bWwgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08dGl0bGU+SW5kZXggLSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4KLTxmcmFtZSBuYW1lPSJpbmRleF90IiB0aXRsZT0iTmF2aWdhdGlvbiBiYXIiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjIiIG1hcmdpbndpZHRoPSIyIi8+Ci08ZnJhbWUgbmFtZT0ia2V5d29yZF90IiB0aXRsZT0iQ29udGVudHMiIHNyYz0iY29udGVudHMuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iLz4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2xvYWRpbmcuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9sb2FkaW5nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiMTgzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2xvYWRpbmcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sIGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPgotCi08aGVhZD4KLTxtZXRhIEhUVFAtRVFVSVY9InJlZnJlc2giIENPTlRFTlQ9IjE7IHVybD1jb250ZW50cy5odG0iPgotPHRpdGxlPjwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci08L2hlYWQ+Ci0KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDQwODAiIHZsaW5rPSIjNjY2NjY2IiBhbGluaz0iIzAwMDBGRiI+Ci0KLQotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZCB2YWxpZ249InRvcCI+Ci0KLQotCi0KLQotCi08aDMgYWxpZ249ImNlbnRlciI+SW5kZXg8L2gzPgotCi08cD48YnI+Ci08L3A+Ci0KLTxoNCBhbGlnbj0iY2VudGVyIj5QbGVhc2Ugd2FpdCB3aGlsZSBpbmRleCBwYWdlIGlzIGxvYWRpbmcuLi48L2g0PgotPHByZSBtc25hdmlnYXRpb24+IDwvcHJlPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPgotCi0KLSAgICAgIDxwPiA8c21hbGw+PHNtYWxsPkNvcHlyaWdodCZuYnNwOwotICAgICAgICAmY29weTsgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVyczwvc21hbGw+PC9zbWFsbD48L3A+Ci0KLTwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgotPHA+Ci08YSBocmVmPSIuLi9pbmRleC5odG0iPjwvYT4KLTwvcD4KLQotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci12YXIgYWxyZWFkeV91c2luZ19mcmFtZXNfTVNHPSJUaGUgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBpcyBhbHJlYWR5IGRpc3BsYXllZCB1c2luZyBmcmFtZXMiOwotLy8gPCEtLQotZnVuY3Rpb24gbG9hZFRvcCgpCi17Ci0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiKQotICB7Ci0gICAgIGFsZXJ0KGFscmVhZHlfdXNpbmdfZnJhbWVzX01TRyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7Ci0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKwotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOwotCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7Ci0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpCi0gICAgewotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkKLQl7Ci0JCXdpbmRvdy5jbG9zZSgpOwotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7Ci0JfQotICAgIH0KLSAgIH0KLX0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLS8vIDwhLS0KLSAgZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpCi0gIHsKLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7Ci0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pCi0gICAgewotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQotICAgICAgIHsKLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuc3Vic3RyaW5nKDAsZG9jdW1lbnQubGlua3NbaV0uaHJlZi5sYXN0SW5kZXhPZigiLyIpKTsKLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7Ci0gICAgICAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOwotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLS8vIDwhLS0KLU1TRlBob3ZlciA9Ci0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwKLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsKLQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpCi0gIHsKLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7Ci0gICAgIGEuc3JjPWltZzsKLSAgICAgcmV0dXJuIGE7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLS8vIDwhLS0KLSAgICBpZihNU0ZQaG92ZXIpCi0gICAgewotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOwotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7Ci0gICAgfQotLy8gLS0+Ci08L3NjcmlwdD4KLQotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0gICB2YXIgZGlzcGxheUZyYW1lc01zZz0iRGlzcGxheSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIHVzaW5nIGZyYW1lcyI7Ci0vLyA8IS0tCi0gICBmdW5jdGlvbiBtb3VzZU92ZXIoKQotICAgewotICAgCQlpZihNU0ZQaG92ZXIpIAotICAgCQkJZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IAotICAgCQlzZWxmLnN0YXR1cz1kaXNwbGF5RnJhbWVzTXNnOyAKLSAgIAkJcmV0dXJuIHRydWU7Ci0gICB9Ci0vLyAtLT4KLTwvc2NyaXB0PgotCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLXZhciBjbGVhclN0YXR1c01zZz0iICI7Ci0vLyA8IS0tCi1mdW5jdGlvbiBtb3VzZU91dCgpCi17Ci1pZihNU0ZQaG92ZXIpIAotZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IAotc2VsZi5zdGF0dXM9Y2xlYXJTdGF0dXNNc2c7Ci1yZXR1cm4gdHJ1ZTsKLX0KLS8vIC0tPgotPC9zY3JpcHQ+Ci0KLTxhIGhyZWY9IkphdmFTY3JpcHQ6bG9hZFRvcCgpOyIgb25tb3VzZW92ZXI9IkphdmFTY3JpcHQ6bW91c2VPdmVyKCk7IiBvbm1vdXNlb3V0PSJKYXZhU2NyaXB0Om1vdXNlT3V0KCk7Ij4KLQotPHA+Ci08aW1nIHNyYz0iLi4vaW1hZ2VzL3J1cDEuZ2lmIiBib3JkZXI9IjAiIGFsdD0iRGlzcGxheSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIHVzaW5nIGZyYW1lcyIgbmFtZT0iSG9tZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjExMCI+PC9wPjwvYT4KLTwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQ+Ci08cCBhbGlnbj0icmlnaHQiPjxzbWFsbD48c21hbGw+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayZuYnNwOyZuYnNwOzwvc21hbGw+PC9zbWFsbD4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3cy5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3cy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0YmYxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3MuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkKLS8vIHRoaXMgZnJhbWUgY29udGFpbnMgYSBjaGlsZCBpZnJhbWUgKG9yeV90b2MpCi0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQKLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMKLXZhciBib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxID0gIlRoaXMgcGFnZSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIG5hdmlnYXRpb24gdHJlZSB2aWV3LiI7Ci0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikKLXsKLQl1cmwgPSB0YWIuZ2V0QXR0cmlidXRlKCd1cmwnKTsKLQotCWlmICggc2VsZWN0ZWRUYWIgIT0gbnVsbCApCi0JewotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIgotCX0KLQl0YWIuY2xhc3NOYW1lID0gInNlbGVjdGVkVGFiIgotCXNlbGVjdGVkVGFiID0gdGFiOwotCi0JbG9hZElmcmFtZSgib3J5X3RvYyIsIHVybCk7Ci19Ci0KLWZ1bmN0aW9uIGxvYWRJZnJhbWUoaWZyYW1lTmFtZSwgdXJsKQotewotCWlmICggd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXSApCi0JewotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsKLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS5sb2NhdGlvbiA9IHVybDsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCWVsc2UgcmV0dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBzaG93UGFnZSgpCi17Ci0KLQlwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IGRlY29kZVVSSSh0b3BpY1RvRGlzcGxheSk7Ci19Ci0KLQotLyoqCi0gKiBmaW5kIGEgdG9waWMgaW4gdGhlIHRyZWU6IHRoZSB0b3BpYyBpcyBzZXQgaW4gdG9waWNUb0Rpc3BsYXkKLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzCi0gKi8KLWZ1bmN0aW9uIGZpbmRUb2NUb3BpYygpCi17Ci0JdmFyIHRvY193aW5kb3cgPSB3aW5kb3cuZnJhbWVzWyJvcnlfdG9jIl07Ci0KLQkvLyBjaGVjayBmb3IgZmFsc2UgaXMgbm90IHNhZmUgc2luY2UgdGhlIHZhbHVlIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZnJhbWUgaXMgbm90IGxvYWRlZCB5ZXQKLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQotCWlmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkICE9IHRydWUgKQotCXsKLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQotCQkvL3sKLQkJLy8JYWxlcnQoImdvdCBpdCEiKTsKLQkJLy99Ci0JCXdpbmRvdy5zZXRUaW1lb3V0KCJmaW5kVG9jVG9waWMoKSIsIDIwMCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICggdG9waWNUb0Rpc3BsYXkgPT0gbnVsbCApCi0JCXsKLQkJCXRvcGljVG9EaXNwbGF5ID0gdG9jX3dpbmRvdy5nZXRGaXJzdFRvcGljVXJsKCk7Ci0JCX0KLQkKLQkJdmFyIHRvcGljID0gdG9waWNUb0Rpc3BsYXk7Ci0JCXZhciBmb3VuZCA9IHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpOwotCQlpZiAoIGZvdW5kID09IGZhbHNlICkKLQkJewotCQkJdmFyIGFuY2hvckluZGV4ID0gdG9waWMubGFzdEluZGV4T2YoIiMiKTsKLQkJCWlmIChhbmNob3JJbmRleCA+IDApCi0JCQl7Ci0JCQkJdG9waWMgPSB0b3BpYy5zdWJzdHJpbmcoMCwgYW5jaG9ySW5kZXgpOwotCQkJfQotCQkJZm91bmQgPSB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKTsKLQkJfQkJCQkJCQotCi0JCS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHZpZXcsIGlmIG5vdCwgbG9vayBmb3IgdGhlIG5leHQgdmlldwotCQlpZiAoIGZvdW5kID09IGZhbHNlICkKLQkJewotCQkJaWYgKCBsb2FkaW5nVGFiSW5kZXggPCB2aWV3VGFicy5sZW5ndGggKQotCQkJewotCQkJCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleCsrXSk7Ci0JCQkJZmluZFRvY1RvcGljKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nCi0JCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdAotCQkJCWFsZXJ0KGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEpOwotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7Ci0JCQkJc2hvd1BhZ2UoKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7Ci0JCQkvLyBmaW5kIHN1Y2Nlc3NmdWwsIGRpc3BsYXkgdGhlIHRvcGljIHBhZ2UKLQkJCXNob3dQYWdlKCk7Ci0JCX0KLQl9Ci19Ci0KLS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHRhYgotZnVuY3Rpb24gd2hlcmVBbUkoKQotewotCXZhciB1cmwgPSBwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0uZG9jdW1lbnQuVVJMOwotCQotCWlmICggdXJsICE9IG51bGwgKQotCXsKLQkJdG9waWNUb0Rpc3BsYXkgPSB1cmw7Ci0JCWZpbmRUb2NUb3BpYygpOwotCX0KLX0KLQotCi1mdW5jdGlvbiB0b2dWaWV3cygpCi17Ci0JLy8gaWYgY3VycmVudGx5IHZpc2libGUsIGhpZGUgYWxsIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JaXNWaWV3c1Zpc2libGUgPSAoIWlzVmlld3NWaXNpYmxlKTsKLQkKLQlmb3IgKCB2YXIgaSA9IDA7ICBpIDwgdmlld1RhYnMubGVuZ3RoOyBpKyspCi0JewotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7Ci0JCWlmICggc2hvdyApCi0JCXsJCQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7Ci0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotCQl9Ci0JfQotCQkKLQkJCi0KLX0KLQotCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlCi0vLyBpZiBubyBkZWZhdWx0IHBhZ2UgaXMgc2V0LCBkaXNwbGF5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmaXJzdCB2aWV3Ci1mdW5jdGlvbiBpbml0KCkKLXsKLQlsb2FkaW5nVGFiSW5kZXggPSAwOwotCXZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsKLQl2YXIgdGFiY291bnQgPSAwOwotCWZvciAodmFyIGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKQotCXsKLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApCi0JCXsJCQkKLQkJCXZhciBpc0RlZmF1bHRWaWV3ID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2lzRGVmYXVsdFZpZXcnKTsKLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQotCQkJewotCQkJCWxvYWRpbmdUYWJJbmRleCA9IHRhYmNvdW50OwotCQkJfQotCQkJCi0JCQl2aWV3VGFic1t0YWJjb3VudCsrXSA9IHRhYnNbaV07Ci0JCX0KLQl9Ci0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7Ci0JZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4XSk7Ci0JZmluZFRvY1RvcGljKCk7Ci19Ci0KLQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsKLXZhciB2aWV3VGFicyA9IG5ldyBBcnJheSgpOzsKLXZhciBsb2FkaW5nVGFiSW5kZXggPSAwOwotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsKLXZhciBpc1ZpZXdzVmlzaWJsZSA9IHRydWU7CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25faGlkZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25faGlkZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmNkZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvYWN0aW9uX2hpZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvYWN0aW9uX3VuaGlkZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25fdW5oaWRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhNGNmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25fdW5oaWRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTllNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9mb2xkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0MTlkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbWludXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbWludXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQxZDM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL21pbnVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25pX3doZXJlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25pX3doZXJlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhNGZkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9uaV93aGVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9ub3BsdXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbm9wbHVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5ZTExNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9ub3BsdXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvcGx1cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9wbHVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0NjcxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9wbHVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvdG9jLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90b2MuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWNhMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90b2MuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gCi0vLyBDb21tb24gc2NyaXB0cyBmb3IgSUUgYW5kIE1vemlsbGEuCi0KLXZhciBpc01vemlsbGEgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01vemlsbGEnKSAhPSAtMSAmJiBwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5zdWJzdHJpbmcoMCwxKSkgPj0gNTsKLXZhciBpc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgIT0gLTE7Ci0KLS8vIHRoaXMgaXMgdGhlIHNlbGVjdGVkIG5vZGUKLXZhciBvbGRBY3RpdmU7Ci12YXIgb2xkQWN0aXZlQ2xhc3MgPSAiIjsKLXZhciB0b2NfbG9hZGVkID0gZmFsc2U7Ci0KLWZ1bmN0aW9uIHNldExvYWRlZCgpCi17Ci0JdG9jX2xvYWRlZCA9IHRydWU7Ci0Jc2VsZWN0Rmlyc3RUb3BpYygpOwotfQotCi0vLyBQcmVsb2FkIGltYWdlcwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gTm90ZTogY29kZSBtb3ZlZCBpbnRvIHRoZSBqc3AsIGZvciBkeW5hbWljIGltYWdlIHByZWZlcmVuY2VzCi0KLS8qKgotICogUmV0dXJucyB0aGUgdGFyZ2V0IG5vZGUgb2YgYW4gZXZlbnQKLSAqLwotZnVuY3Rpb24gZ2V0VGFyZ2V0KGUpIHsKLQl2YXIgdGFyZ2V0OwotICAJaWYgKGlzTW96aWxsYSkKLSAgCQl0YXJnZXQgPSBlLnRhcmdldDsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gICAJCXRhcmdldCA9IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50OwotCi0JcmV0dXJuIHRhcmdldDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuZXh0IHRyZWUgbm9kZSAiZG93biIgZnJvbSBjdXJyZW50IG9uZQotICovCi1mdW5jdGlvbiBnZXROZXh0RG93bihub2RlKQotewotCXZhciBhID0gZ2V0QW5jaG9yTm9kZShub2RlKTsKLQlpZiAoIWEpIHJldHVybiBudWxsOwotCQkKLQkvLyBUcnkgdmlzaWJsZSBjaGlsZCBmaXJzdAotCXZhciBsaSA9IGEucGFyZW50Tm9kZTsKLQl2YXIgdWwgPSBnZXRDaGlsZE5vZGUobGksICJVTCIpOwotCWlmICh1bCAmJiB1bC5jbGFzc05hbWUgPT0gImV4cGFuZGVkIikKLQkJcmV0dXJuIGdldERlc2NlbmRhbnROb2RlKHVsLCAiQSIpOwotCQotCS8vIFRyeSBuZXh0IHNpYmxpbmcKLQl2YXIgbGlfc2liID0gZ2V0TmV4dFNpYmxpbmcobGkpOwotCWlmIChsaV9zaWIgIT0gbnVsbCkKLQkJcmV0dXJuIGdldERlc2NlbmRhbnROb2RlKGxpX3NpYiwgIkEiKTsKLQkJCi0JLy8gVHJ5IGxvb2tpbmcgdG8gcGFyZW50J3Mgc2libGluZwotCXdoaWxlKGxpX3NpYiA9PSBudWxsKSB7Ci0JCXZhciB1bCA9IGxpLnBhcmVudE5vZGU7Ci0JCWxpID0gdWwucGFyZW50Tm9kZTsKLQkJaWYgKGxpLnRhZ05hbWUgIT0gIkxJIikgLy8gcmVhY2hlZCB0aGUgdG9wLCBub3RoaW5nIGVsc2UgdG8gZG8KLQkJCXJldHVybiBudWxsOwotCQkJCi0JCWxpX3NpYiA9IGdldE5leHRTaWJsaW5nKGxpKTsJCQotCX0KLQkJCi0JLy8gZm91bmQgdGhlIG5leHQgZG93biBzaWJsaW5nCi0JcmV0dXJuIGdldERlc2NlbmRhbnROb2RlKGxpX3NpYiwgIkEiKTsJCQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5leHQgdHJlZSBub2RlICJkb3duIiBmcm9tIGN1cnJlbnQgb25lCi0gKi8KLWZ1bmN0aW9uIGdldE5leHRVcChub2RlKQotewotCXZhciBhID0gZ2V0QW5jaG9yTm9kZShub2RlKTsKLQlpZiAoIWEpIHJldHVybiBudWxsOwotCQkKLQkvLyBHZXQgcHJldmlvdXMgc2libGluZyBmaXJzdAotCXZhciBsaSA9IGEucGFyZW50Tm9kZTsKLQl2YXIgbGlfc2liID0gZ2V0UHJldlNpYmxpbmcobGkpOwotCWlmIChsaV9zaWIgIT0gbnVsbCkgewotCQkvLyB0cnkgdG8gZ2V0IHRoZSBkZWVwZXN0IG5vZGUgdGhhdCBwcmVjZWVkcyB0aGlzIGN1cnJlbnQgbm9kZQotCQl2YXIgY2FuZGlkYXRlID0gZ2V0RGVzY2VuZGFudE5vZGUobGlfc2liLCAiQSIpOwotCQl2YXIgbmV4dERvd24gPSBnZXROZXh0RG93bihjYW5kaWRhdGUpOwotCQl3aGlsZShuZXh0RG93biAhPSBudWxsICYmIG5leHREb3duICE9IG5vZGUpewotCQkJY2FuZGlkYXRlID0gbmV4dERvd247Ci0JCQluZXh0RG93biA9IGdldE5leHREb3duKG5leHREb3duKTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUoY2FuZGlkYXRlLCAiQSIpOwk7Ci0JfSBlbHNlIHsKLQkJLy8gZ2V0IHRoZSBwYXJlbnQKLQkJdmFyIGxpID0gbGkucGFyZW50Tm9kZS5wYXJlbnROb2RlOwotCQlpZiAobGkgJiYgbGkudGFnTmFtZSA9PSAiTEkiKQotCQkJcmV0dXJuIGdldERlc2NlbmRhbnROb2RlKGxpLCAiQSIpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQKLSAqLwotZnVuY3Rpb24gZ2V0TmV4dFNpYmxpbmcobm9kZSkgCi17Ci0JdmFyIHNpYiA9IG5vZGUubmV4dFNpYmxpbmc7Ci0Jd2hpbGUgKHNpYiAmJiAoc2liLm5vZGVUeXBlID09IDMgfHwgc2liLnRhZ05hbWU9PSJTQ1JJUFQiKSkgLy8gdGV4dCBvciBzY3JpcHQgbm9kZQotCQlzaWIgPSBzaWIubmV4dFNpYmxpbmc7Ci0JcmV0dXJuIHNpYjsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudAotICovCi1mdW5jdGlvbiBnZXRQcmV2U2libGluZyhub2RlKSAKLXsKLQl2YXIgc2liID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7Ci0Jd2hpbGUgKHNpYiAmJiAoc2liLm5vZGVUeXBlID09IDMgfHwgc2liLnRhZ05hbWU9PSJTQ1JJUFQiKSkgLy8gdGV4dCBvciBzY3JpcHQgbm9kZQotCQlzaWIgPSBzaWIucHJldmlvdXNTaWJsaW5nOwotCXJldHVybiBzaWI7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBjaGlsZCBub2RlIHdpdGggc3BlY2lmaWVkIHRhZwotICovCi1mdW5jdGlvbiBnZXRDaGlsZE5vZGUocGFyZW50LCBjaGlsZFRhZykKLXsKLQl2YXIgbGlzdCA9IHBhcmVudC5jaGlsZE5vZGVzOwotCWlmIChsaXN0ID09IG51bGwpIHJldHVybiBudWxsOwotCWZvciAodmFyIGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKQotCQlpZiAobGlzdC5pdGVtKGkpLnRhZ05hbWUgPT0gY2hpbGRUYWcpCi0JCQlyZXR1cm4gbGlzdC5pdGVtKGkpOwotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGRlc2NlbmRhdCBub2RlIHdpdGggc3BlY2lmaWVkIHRhZyAoZGVwdGgtZmlyc3Qgc2VhcmNoZXMpCi0gKi8KLWZ1bmN0aW9uIGdldERlc2NlbmRhbnROb2RlKHBhcmVudCwgY2hpbGRUYWcpCi17CQotCWlmIChwYXJlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCi0JaWYgKHBhcmVudC50YWdOYW1lID09IGNoaWxkVGFnKQotCQlyZXR1cm4gcGFyZW50OwotCQkKLQl2YXIgbGlzdCA9IHBhcmVudC5jaGlsZE5vZGVzOwotCWlmIChsaXN0ID09IG51bGwpIHJldHVybiBudWxsOwotCWZvciAodmFyIGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCXZhciBjaGlsZCA9IGxpc3QuaXRlbShpKTsKLQkJaWYoY2hpbGQudGFnTmFtZSA9PSBjaGlsZFRhZykKLQkJCXJldHVybiBjaGlsZDsKLQkJCi0JCWNoaWxkID0gZ2V0RGVzY2VuZGFudE5vZGUoY2hpbGQsIGNoaWxkVGFnKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCXJldHVybiBudWxsOwotfQotCi0KLS8qKgotICogUmV0dXJucyB0aGUgYW5jaG9yIG9mIHRoaXMgY2xpY2sKLSAqIE5PVEU6IE1PWklMTEEgQlVHIFdJVEggQTpmb2N1cyBhbmQgQTphY3RpdmUgc3R5bGVzCi0gKi8KLWZ1bmN0aW9uIGdldEFuY2hvck5vZGUobm9kZSkgewotICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgIAotICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSAgLy8iTm9kZS5URVhUX05PREUiKSAKLQlyZXR1cm4gbm9kZS5wYXJlbnROb2RlOwotICBlbHNlIGlmIChub2RlLnRhZ05hbWUgPT0gIkEiKSAKLSAgICByZXR1cm4gbm9kZTsKLSAgZWxzZSBpZiAobm9kZS50YWdOYW1lID09ICJJTUciKQotICAJcmV0dXJuIGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUsICJBIik7Ci0gIHJldHVybiBudWxsOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHBsdXMvbWludXMgaWNvbiBmb3IgdGhpcyB0cmVlIG5vZGUKLSAqLwotZnVuY3Rpb24gZ2V0UGx1c01pbnVzKG5vZGUpCi17Ci0JaWYgKGlzUGx1c01pbnVzKG5vZGUpKQotCQlyZXR1cm4gbm9kZTsKLSAgCWVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgIC8vIk5vZGUuVEVYVF9OT0RFIikgCi0JCXJldHVybiBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUsICJJTUciKTsKLQllbHNlIGlmIChub2RlLnRhZ05hbWUgPT0gIklNRyIpCi0gICAgCXJldHVybiBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUsICJJTUciKTsKLSAgCWVsc2UgaWYgKG5vZGUudGFnTmFtZSA9PSAiQSIpIAotICAgIAlyZXR1cm4gZ2V0Q2hpbGROb2RlKG5vZGUucGFyZW50Tm9kZSwgIklNRyIpOwotCi0gCXJldHVybiBudWxsOwotfQotCi0KLS8qKgotICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIG5vZGUgaXMgdGhlIHBsdXMgb3IgbWludXMgaWNvbgotICovCi1mdW5jdGlvbiBpc1BsdXNNaW51cyhub2RlKQotewotCXJldHVybiAobm9kZS5ub2RlVHlwZSAhPSAzICYmIG5vZGUudGFnTmFtZSA9PSAiSU1HIiAmJiAobm9kZS5jbGFzc05hbWUgPT0gImV4cGFuZGVkIiB8fCBub2RlLmNsYXNzTmFtZSA9PSAiY29sbGFwc2VkIikpOwotfQotCi0vKioKLSAqIENvbGxhcHNlcyBhIHRyZWUgcm9vdGVkIGF0IHRoZSBzcGVjaWZpZWQgZWxlbWVudAotICovCi1mdW5jdGlvbiBjb2xsYXBzZShub2RlKSB7Ci0gIG5vZGUuY2xhc3NOYW1lID0gImNvbGxhcHNlZCI7Ci0gIG5vZGUuc3JjID0gcGx1cy5zcmM7Ci0gIG5vZGUuYWx0ID0gYWx0VG9waWNDbG9zZWQ7Ci0gIC8vIHNldCB0aGUgVUwgYXMgd2VsbAotICB2YXIgdWwgPSBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLCAiVUwiKTsKLSAgaWYgKHVsICE9IG51bGwpIHVsLmNsYXNzTmFtZSA9ICJjb2xsYXBzZWQiOwotfQotCi0vKioKLSAqIEV4cGFuZHMgYSB0cmVlIHJvb3RlZCBhdCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAqLwotZnVuY3Rpb24gZXhwYW5kKG5vZGUpIHsKLSAgCW5vZGUuY2xhc3NOYW1lID0gImV4cGFuZGVkIjsKLSAgCW5vZGUuc3JjID0gbWludXMuc3JjOwotICAgIG5vZGUuYWx0ID0gYWx0VG9waWNPcGVuOwotICAJLy8gc2V0IHRoZSBVTCBhcyB3ZWxsCi0gIAl2YXIgdWwgPSBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLCAiVUwiKTsKLSAgCWlmICh1bCAhPSBudWxsKXsKLSAgCQl1bC5jbGFzc05hbWUgPSAiZXhwYW5kZWQiOwotICAJCWlmICh1bC5pZC5sZW5ndGggPiAwKXsKLSAgCQkJaWYgKCFmcmFtZXMuZHluTG9hZEZyYW1lKSB7Ci0gIAkJCQlyZXR1cm47Ci0gIAkJCX0KLSAgCQkJdmFyIGl4ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignPycpOwotICAJCQlpZiAoaXggPCAwKSB7Ci0gIAkJCQlyZXR1cm47Ci0gIAkJCX0KLSAgCQkJdmFyIHF1ZXJ5ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3Vic3RyKGl4KTsKLSAgCQkJZnJhbWVzLmR5bkxvYWRGcmFtZS5sb2NhdGlvbiA9ICJ0b2NGcmFnbWVudC5qc3AiICsgcXVlcnkgKyAiJnBhdGg9IiArIHVsLmlkOwotICAJCX0KLSAgCX0KLX0KLQotLyoqCi0gKiBFeHBhbmRzIHRoZSBub2RlcyBmcm9tIHJvb3QgdG8gdGhlIHNwZWNpZmllZCBub2RlCi0gKi8KLWZ1bmN0aW9uIGV4cGFuZFBhdGhUbyhub2RlLCBpbmNsdXNpdmUpCi17Ci0KLQkvLyB3aGVuIHRoZSBub2RlIGlzIGEgbGluaywgZ2V0IHRoZSBwbHVzL21pbnVzIGltYWdlCi0JaWYgKG5vZGUudGFnTmFtZSA9PSAiQSIpIAotCXsKLQkJdmFyIGltZyA9IGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUsICJJTUciKQotCQlpZiAoaW1nICE9IG51bGwpCi0JCXsJCQkKLQkJCWV4cGFuZFBhdGhUbyhpbWcsIGluY2x1c2l2ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JaWYgKGluY2x1c2l2ZSAmJiBpc0NvbGxhcHNlZChub2RlKSkKLQkJZXhwYW5kKG5vZGUpOwotCQkKLQl2YXIgbGkgPSBub2RlLnBhcmVudE5vZGU7Ci0JaWYgKGxpID09IG51bGwpIHJldHVybjsKLQl2YXIgdWwgPSBsaS5wYXJlbnROb2RlOwotCWlmICh1bCA9PSBudWxsKSByZXR1cm47Ci0JbGkgPSB1bC5wYXJlbnROb2RlOwotCWlmIChsaSA9PSBudWxsKSByZXR1cm47Ci0JdmFyIGltZyA9IGdldENoaWxkTm9kZShsaSwgIklNRyIpOwotCWlmIChpbWcgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQlleHBhbmRQYXRoVG8oaW1nLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIGlzIGFuIGV4cGFuZGVkIHRyZWUgbm9kZQotICovCi1mdW5jdGlvbiBpc0V4cGFuZGVkKG5vZGUpIHsKLSAgcmV0dXJuIG5vZGUuY2xhc3NOYW1lID09ICJleHBhbmRlZCI7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0cnVlIHdoZW4gdGhpcyBpcyBhIGNvbGxhcHNlZCB0cmVlIG5vZGUKLSAqLwotZnVuY3Rpb24gaXNDb2xsYXBzZWQobm9kZSkgewotICByZXR1cm4gIG5vZGUuY2xhc3NOYW1lID09ICJjb2xsYXBzZWQiOwotfQotCi0vKioKLSAqIEhpZ2hsaWdodHMgbGluawotICovCi1mdW5jdGlvbiBoaWdobGlnaHRUb3BpYyh0b3BpYykKLXsKLQlpZiAoaXNNb3ppbGxhKQotCQl3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7Ci0KLSAgCXZhciBhID0gZ2V0QW5jaG9yTm9kZSh0b3BpYyk7IAotICAJaWYgKGEgIT0gbnVsbCkKLSAgCXsKLSAgCSAvLyAJcGFyZW50LnBhcmVudC5wYXJlbnQuc2V0Q29udGVudFRvb2xiYXJUaXRsZSh0b2NUaXRsZSk7Ci0gIAkgIAlpZiAob2xkQWN0aXZlKSAKLSAgCSAgCQlvbGRBY3RpdmUuY2xhc3NOYW1lID0gb2xkQWN0aXZlQ2xhc3M7Ci0KLSAgCQlvbGRBY3RpdmUgPSBhOwotICAJCW9sZEFjdGl2ZUNsYXNzID0gYS5jbGFzc05hbWU7Ci0gIAkJYS5jbGFzc05hbWUgPSAiYWN0aXZlIjsKLSAgCQkvLyBpdCBsb29rcyBsaWtlIHRoZSBvbmNsaWNrIGV2ZW50IGlzIG5vdCBoYW5kbGVkIGluIG1vemlsbGEKLSAgCQkvLyAqKiogVE8gRE86IGhhbmRsZSBmYWlsZWQgc3luY2hyb25pemF0aW9uLCBkbyBub3Qgc2VsZWN0IGluIHRoYXQgY2FzZQotICAJCWlmIChpc01vemlsbGEgJiYgYS5vbmNsaWNrKSAKLSAgCQkJYS5vbmNsaWNrKCkKLSAgCQkvL2lmIChpc0lFKQotICAJCS8vCWEuaGlkZUZvY3VzID0gInRydWUiOwotICAJCQotICAJfQotfQotCi0KLWZ1bmN0aW9uIGdldEZpcnN0VG9waWNVcmwoKQotewotCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Ci0JaWYgKCBsaW5rcy5sZW5ndGggPiAwICkKLQl7Ci0JCXJldHVybiBsaW5rc1swXS5ocmVmOwotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLX0KLQotZnVuY3Rpb24gc2VsZWN0Rmlyc3RUb3BpYygpIHsKLQkvL3ZhciB1cmwgPSBnZXRGaXJzdFRvcGljVXJsKCk7Ci0JLy9zZWxlY3RUb3BpYyh1cmwpOwotCi0JdmFyIGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTsKLQlpZiAoIGxpbmtzLmxlbmd0aCA+IDAgKQotCXsKLQkJaGlnaGxpZ2h0VG9waWMobGlua3NbMF0pOwotCQlwYXJlbnQucGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSBsaW5rc1swXS5ocmVmOwotCX0KLQotCi19Ci0KLQotLyoqCi0gKiBTZWxlY3RzIGEgdG9waWMgaW4gdGhlIHRyZWU6IGV4cGFuZCB0cmVlIGFuZCBoaWdobGlnaHQgaXQKLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzCi0gKi8KLWZ1bmN0aW9uIHNlbGVjdFRvcGljKHRvcGljKQotewotCWlmICghdG9waWMpCi0JCXJldHVybiBmYWxzZTsKLQkJCi0JdG9waWMgPSBwYXJlbnQucGFyZW50LmZpeFVybCh0b3BpYyk7Ci0JCi0JLy8gcmVtb3ZlIHRoZSBxdWVyeSwgaWYgYW55Ci0JdmFyIGkgPSB0b3BpYy5pbmRleE9mKCc/Jyk7Ci0JaWYgKGkgIT0gLTEpCi0JCXRvcGljID0gdG9waWMuc3Vic3RyaW5nKDAsIGkpOwotCi0KLQl2YXIgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwotCi0JZm9yICh2YXIgaT0wOyBpPGxpbmtzLmxlbmd0aDsgaSsrKQotCXsJCQkKLQkJdmFyIGZpeGVkX2hyZWYgPSBwYXJlbnQucGFyZW50LmZpeFVybChsaW5rc1tpXS5ocmVmKTsKLQkJCi0JCS8vIHJlbW92ZSB0aGUgcXVlcnksIGlmIGFueQotCQl2YXIgaW5keCA9IGZpeGVkX2hyZWYuaW5kZXhPZignPycpOwotCQlpZiAoaW5keCAhPSAtMSkgewotCQkJZml4ZWRfaHJlZiA9IGZpeGVkX2hyZWYuc3Vic3RyaW5nKDAsIGluZHgpOwotCQl9Ci0KLQkJLy9hbGVydCgiZml4ZWQgaHJlZj0iICsgZml4ZWRfaHJlZik7Ci0JCWlmICh0b3BpYyA9PSBmaXhlZF9ocmVmKQotCQl7Ci0JCQlleHBhbmRQYXRoVG8obGlua3NbaV0sIGZhbHNlKTsKLQkJCWhpZ2hsaWdodFRvcGljKGxpbmtzW2ldKTsKLQkJCXNjcm9sbEludG9WaWV3KGxpbmtzW2ldKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBTZWxlY3RzIGEgdG9waWMgaW4gdGhlIHRyZWU6IGV4cGFuZCB0cmVlIGFuZCBoaWdobGlnaHQgaXQKLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzCi0gKi8KLWZ1bmN0aW9uIHNlbGVjdFRvcGljQnlJZChpZCkKLXsKLQl2YXIgdG9waWMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7Ci0JaWYgKHRvcGljKQotCXsKLQkJZXhwYW5kUGF0aFRvKHRvcGljLCBmYWxzZSk7Ci0JCWhpZ2hsaWdodFRvcGljKHRvcGljKTsKLQkJc2Nyb2xsSW50b1ZpZXcodG9waWMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIFNjcm9sbHMgdGhlIHBhZ2UgdG8gc2hvdyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAqLwotZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcobm9kZSkKLXsKLQl2YXIgc2Nyb2xsID0gZ2V0VmVydGljYWxTY3JvbGwobm9kZSk7Ci0JaWYgKHNjcm9sbCAhPSAwKQotCQl3aW5kb3cuc2Nyb2xsQnkoMCwgc2Nyb2xsKTsKLX0KLQotLyoqCi0gKiBTY3JvbGxzIHRoZSBwYWdlIHRvIHNob3cgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0gKi8KLWZ1bmN0aW9uIGdldFZlcnRpY2FsU2Nyb2xsKG5vZGUpCi17Ci0JdmFyIG5vZGVUb3AgPSBub2RlLm9mZnNldFRvcDsKLQl2YXIgbm9kZUJvdHRvbSA9IG5vZGVUb3AgKyBub2RlLm9mZnNldEhlaWdodDsKLQl2YXIgcGFnZVRvcCA9IDA7Ci0JdmFyIHBhZ2VCb3R0b20gPSAwOwotCQotCWlmIChpc0lFKQotCXsKLQkJcGFnZVRvcCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOyAKLQkJcGFnZUJvdHRvbSA9IHBhZ2VUb3AgKyBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsKLQkKLQl9IAotCWVsc2UgaWYgKGlzTW96aWxsYSkKLQl7Ci0JCXBhZ2VUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQ7Ci0JCXBhZ2VCb3R0b20gPSBwYWdlVG9wICsgd2luZG93LmlubmVySGVpZ2h0IC0gbm9kZS5vZmZzZXRIZWlnaHQ7Ci0JfQotCQotCXZhciBzY3JvbGwgPSAwOwotCWlmIChub2RlVG9wID49IHBhZ2VUb3AgKQotCXsKLQkJaWYgKG5vZGVCb3R0b20gPD0gcGFnZUJvdHRvbSkKLQkJCXNjcm9sbCA9IDA7IC8vIGFscmVhZHkgaW4gdmlldwotCQllbHNlCi0JCQlzY3JvbGwgPSBub2RlQm90dG9tIC0gcGFnZUJvdHRvbTsKLQl9Ci0JZWxzZQotCXsKLQkJc2Nyb2xsID0gbm9kZVRvcCAtIHBhZ2VUb3A7Ci0JfQotCQotCXJldHVybiBzY3JvbGw7Ci19Ci0KLS8qCi0gKiBDdXJyZW50bHkgY2FsbGVkIG9uIElFIG9ubHkKLSAqLwotZnVuY3Rpb24gZm9jdXNIYW5kbGVyKGUpCi17Ci0JLyppZiAoaXNNb3ppbGxhKQotCQlyZXR1cm47Ci0JKi8KLQkJCi0JdHJ5ewotCQlpZiAob2xkQWN0aXZlKXsKLQkJCS8vIG9ubHkgZm9jdXMgd2hlbiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlCi0JCQl2YXIgc2Nyb2xsID0gZ2V0VmVydGljYWxTY3JvbGwob2xkQWN0aXZlKTsKLQkJCWlmIChzY3JvbGwgPT0gMCkKLQkJCQlvbGRBY3RpdmUuZm9jdXMoKTsKLQkJfQkJCi0JfQotCWNhdGNoKGUpe30KLX0KLQotCi0vKioKLSAqIGRpc3BsYXkgdG9waWMgbGFiZWwgaW4gdGhlIHN0YXR1cyBsaW5lIG9uIG1vdXNlIG92ZXIgdG9waWMKLSAqLwotZnVuY3Rpb24gbW91c2VNb3ZlSGFuZGxlcihlKSB7Ci0JdmFyIG92ZXJOb2RlID0gZ2V0VGFyZ2V0KGUpOwotIAlpZiAoIW92ZXJOb2RlKSByZXR1cm47Ci0gIAkKLQlvdmVyTm9kZSA9IGdldEFuY2hvck5vZGUob3Zlck5vZGUpOwotCSAgaWYgKG92ZXJOb2RlID09IG51bGwpewotCSAgIHdpbmRvdy5zdGF0dXMgPSAiIjsKLQkgICByZXR1cm47Ci0JICB9Ci0gCi0JaWYgKGlzTW96aWxsYSkKLQkJZS5jYW5jZWxCdWJibGUgPSBmYWxzZTsKLSAgCSAKLQlpZiAob3Zlck5vZGUudGl0bGUgPT0gIiIpIHsKLQkJaWYgKG92ZXJOb2RlLmlubmVyVGV4dCkKLQkJCW92ZXJOb2RlLnRpdGxlID0gb3Zlck5vZGUuaW5uZXJUZXh0OwotCQllbHNlIGlmIChvdmVyTm9kZS50ZXh0KQotCQkJb3Zlck5vZGUudGl0bGUgPSBvdmVyTm9kZS50ZXh0OwotCX0KLQl3aW5kb3cuc3RhdHVzID0gb3Zlck5vZGUudGl0bGU7Ci19Ci0KLS8qKgotICogaGFuZGxlciBmb3IgZXhwYW5kaW5nIC8gY29sbGFwc2luZyB0b3BpYyB0cmVlCi0gKi8KLWZ1bmN0aW9uIG1vdXNlQ2xpY2tIYW5kbGVyKGUpIHsKLQotICAJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotCi0gIAlpZiAoaXNQbHVzTWludXMoY2xpY2tlZE5vZGUpICkKLSAgCXsJCi0gICAgCWlmIChpc0NvbGxhcHNlZChjbGlja2VkTm9kZSkpIAotICAgCQkJZXhwYW5kKGNsaWNrZWROb2RlKTsKLSAgCQllbHNlIGlmIChpc0V4cGFuZGVkKGNsaWNrZWROb2RlKSkgCi0gIAkgIAkJY29sbGFwc2UoY2xpY2tlZE5vZGUpOwotICAJfQotICAJZWxzZQotICAJewotICAJCXZhciBwbHVzX21pbnVzID0gZ2V0UGx1c01pbnVzKGNsaWNrZWROb2RlKTsKLSAgCQlpZiAocGx1c19taW51cyAhPSBudWxsKQotICAJCQloaWdobGlnaHRUb3BpYyhwbHVzX21pbnVzKTsKLSAgCX0KLSAgCQotICAJaWYgKGlzTW96aWxsYSkKLSAgCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci0gIAllbHNlIGlmIChpc0lFKQotICAJCXdpbmRvdy5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwotfQotCi0vKioKLSAqIGhhbmRsZXIgZm9yIGV4cGFuZGluZyAvIGNvbGxhcHNpbmcgdG9waWMgdHJlZQotICovCi1mdW5jdGlvbiBtb3VzZURibENsaWNrSGFuZGxlcihlKSB7Ci0KLSAgCXZhciBjbGlja2VkTm9kZSA9IGdldFRhcmdldChlKTsKLSAgCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLQotICAJdmFyIHBsdXNfbWludXMgPSBnZXRQbHVzTWludXMoY2xpY2tlZE5vZGUpOwotICAJaWYgKHBsdXNfbWludXMgIT0gbnVsbCkKLSAgCXsJCi0gICAgCWlmIChjbGlja2VkTm9kZS50YWdOYW1lID09ICJBIiAmJiBnZXRDaGlsZE5vZGUoY2xpY2tlZE5vZGUucGFyZW50Tm9kZSwgIlVMIikgPT0gbnVsbCkgCi0gIAkJewotICAJCQloaWdobGlnaHRUb3BpYyhwbHVzX21pbnVzKTsKLSAgCQl9Ci0gIAkJZWxzZQotICAJCXsgIAkJCi0gICAgCQlpZiAoaXNDb2xsYXBzZWQocGx1c19taW51cykpIAotICAgCQkJCWV4cGFuZChwbHVzX21pbnVzKTsKLSAgCQkJZWxzZSBpZiAoaXNFeHBhbmRlZChwbHVzX21pbnVzKSkgCi0gIAkgIAkJCWNvbGxhcHNlKHBsdXNfbWludXMpOyAgCSAgCQkgIAkJICAKLSAgCSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCX0KLSAgCX0KLSAgCi0gIAlpZiAoaXNNb3ppbGxhKQotICAJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gIAkJd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci19Ci0KLS8qKgotICogSGFuZGxlciBmb3Iga2V5IGRvd24gKGFycm93cykKLSAqLwotZnVuY3Rpb24ga2V5RG93bkhhbmRsZXIoZSkKLXsKLQl2YXIga2V5OwotCi0JaWYgKGlzSUUpIHsKLQkJa2V5ID0gd2luZG93LmV2ZW50LmtleUNvZGU7Ci0JfSBlbHNlIGlmIChpc01vemlsbGEpIHsKLQkJa2V5ID0gZS5rZXlDb2RlOwotCX0KLQkJCi0JaWYgKGtleSA8MzcgfHwga2V5ID4gNDApIAotCQlyZXR1cm4gdHJ1ZTsKLQkKLQlpZiAoaXNNb3ppbGxhKQotICAJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gIAkJd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci0gIAkJCi0gIAlpZiAoa2V5ID09IDM5KSB7IC8vIFJpZ2h0IGFycm93LCBleHBhbmQKLQkJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotICAJCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLSAgCQlpZiAoaXNJRSl7Ci0JCQlpZihjbGlja2VkTm9kZS5pZCE9bnVsbCl7Ci0JCQkJaWYoY2xpY2tlZE5vZGUuaWQuY2hhckF0KDApPT0nYicpewotCQkJCQlpZihjbGlja2VkTm9kZS5uYW1lIT0ib3BlbmVkIil7Ci0JCQkJCQlsb2FkVE9DKGNsaWNrZWROb2RlLm5hbWUpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotICAJCXZhciBwbHVzX21pbnVzID0gZ2V0UGx1c01pbnVzKGNsaWNrZWROb2RlKTsKLSAgCQlpZiAocGx1c19taW51cyAhPSBudWxsKQotICAJCXsJCi0gICAgCQlpZiAoaXNDb2xsYXBzZWQocGx1c19taW51cykpIAotICAgCQkJCWV4cGFuZChwbHVzX21pbnVzKTsKLSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCQlzY3JvbGxJbnRvVmlldyhjbGlja2VkTm9kZSk7Ci0gIAkJfQotICAJfSBlbHNlIGlmIChrZXkgPT0gMzcpIHsgLy8gTGVmdCBhcnJvdyxjb2xsYXBzZQotCQl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gIAkJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotICAJCQotICAJCWlmKGNsaWNrZWROb2RlLmlkIT1udWxsKXsKLSAgCQkJaWYoY2xpY2tlZE5vZGUuaWQuY2hhckF0KDApPT0nYicpewotCQkJCWlmKGNsaWNrZWROb2RlLm5hbWU9PSJvcGVuZWQiKXsKLQkJCQkJbG9hZFRPQygiICIpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZXsgCQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCi0gIAkJdmFyIHBsdXNfbWludXMgPSBnZXRQbHVzTWludXMoY2xpY2tlZE5vZGUpOwotICAJCWlmIChwbHVzX21pbnVzICE9IG51bGwpCi0gIAkJewkKLSAgICAJCWlmIChpc0V4cGFuZGVkKHBsdXNfbWludXMpKSAKLSAgIAkJCQljb2xsYXBzZShwbHVzX21pbnVzKTsKLSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCQlzY3JvbGxJbnRvVmlldyhjbGlja2VkTm9kZSk7Ci0gIAkJfQotICAJfSBlbHNlIGlmIChrZXkgPT0gNDAgKSB7IC8vIGRvd24gYXJyb3cKLSAgCQl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gIAkJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotCi0JCXZhciBuZXh0ID0gZ2V0TmV4dERvd24oY2xpY2tlZE5vZGUpOwotCQlpZiAobmV4dCkKLQkJCW5leHQuZm9jdXMoKTsKLQotICAJfSBlbHNlIGlmIChrZXkgPT0gMzggKSB7IC8vIHVwIGFycm93Ci0gIAkJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotICAJCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLQotCQl2YXIgbmV4dCA9IGdldE5leHRVcChjbGlja2VkTm9kZSk7Ci0JCWlmIChuZXh0KQotCQkJbmV4dC5mb2N1cygpOwotICAJfQotICAJCi0gIAkgCQkJCi0gIAlyZXR1cm4gdHJ1ZTsKLX0KLQotaWYgKGlzTW96aWxsYSkgewotICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1vdXNlQ2xpY2tIYW5kbGVyLCB0cnVlKTsKLSAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBtb3VzZURibENsaWNrSGFuZGxlciwgdHJ1ZSk7Ci0gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIsIHRydWUpOwotICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5RG93bkhhbmRsZXIsIHRydWUpOwotfQotZWxzZSBpZiAoaXNJRSl7Ci0gIGRvY3VtZW50Lm9uY2xpY2sgPSBtb3VzZUNsaWNrSGFuZGxlcjsKLSAgZG9jdW1lbnQub25kYmxjbGljayA9IG1vdXNlRGJsQ2xpY2tIYW5kbGVyOwotICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG1vdXNlTW92ZUhhbmRsZXI7Ci0gIGRvY3VtZW50Lm9ua2V5ZG93biA9IGtleURvd25IYW5kbGVyOwotICAvL3dpbmRvdy5vbmZvY3VzID0gZm9jdXNIYW5kbGVyOwotfQotCi1mdW5jdGlvbiBzZXRDb29raWUoIG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSApIAotewotCS8vIHNldCB0aW1lLCBpdCdzIGluIG1pbGxpc2Vjb25kcwotCXZhciB0b2RheSA9IG5ldyBEYXRlKCk7Ci0JdG9kYXkuc2V0VGltZSggdG9kYXkuZ2V0VGltZSgpICk7Ci0KLQkvKgotCWlmIHRoZSBleHBpcmVzIHZhcmlhYmxlIGlzIHNldCwgbWFrZSB0aGUgY29ycmVjdCAKLQlleHBpcmVzIHRpbWUsIHRoZSBjdXJyZW50IHNjcmlwdCBiZWxvdyB3aWxsIHNldCAKLQlpdCBmb3IgeCBudW1iZXIgb2YgZGF5cywgdG8gbWFrZSBpdCBmb3IgaG91cnMsIAotCWRlbGV0ZSAqIDI0LCBmb3IgbWludXRlcywgZGVsZXRlICogNjAgKiAyNAotCSovCi0JaWYgKCBleHBpcmVzICkKLQl7Ci0JZXhwaXJlcyA9IGV4cGlyZXMgKiAxMDAwICogNjAgKiA2MCAqIDI0OwotCX0KLQl2YXIgZXhwaXJlc19kYXRlID0gbmV3IERhdGUoIHRvZGF5LmdldFRpbWUoKSArIChleHBpcmVzKSApOwotCi0JZG9jdW1lbnQuY29va2llID0gbmFtZSArICI9IiArZXNjYXBlKCB2YWx1ZSApICsKLQkoICggZXhwaXJlcyApID8gIjtleHBpcmVzPSIgKyBleHBpcmVzX2RhdGUudG9HTVRTdHJpbmcoKSA6ICIiICkgKyAKLQkoICggcGF0aCApID8gIjtwYXRoPSIgKyBwYXRoIDogIiIgKSArIAotCSggKCBkb21haW4gKSA/ICI7ZG9tYWluPSIgKyBkb21haW4gOiAiIiApICsKLQkoICggc2VjdXJlICkgPyAiO3NlY3VyZSIgOiAiIiApOwotfQotCi0KLWZ1bmN0aW9uIGdldENvb2tpZSggbmFtZSApIHsJCi0JdmFyIHN0YXJ0ID0gZG9jdW1lbnQuY29va2llLmluZGV4T2YoIG5hbWUgKyAiPSIgKTsKLQl2YXIgbGVuID0gc3RhcnQgKyBuYW1lLmxlbmd0aCArIDE7Ci0JaWYgKCAoICFzdGFydCApICYmCi0JKCBuYW1lICE9IGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoIDAsIG5hbWUubGVuZ3RoICkgKSApCi0JewotCXJldHVybiBudWxsOwotCX0KLQlpZiAoIHN0YXJ0ID09IC0xICkgcmV0dXJuIG51bGw7Ci0JdmFyIGVuZCA9IGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCAiOyIsIGxlbiApOwotCWlmICggZW5kID09IC0xICkgZW5kID0gZG9jdW1lbnQuY29va2llLmxlbmd0aDsKLQlyZXR1cm4gdW5lc2NhcGUoIGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoIGxlbiwgZW5kICkgKTsKLX0KLQotCi1mdW5jdGlvbiBEZWxldGVfQ29va2llKCBuYW1lLCBwYXRoLCBkb21haW4gKSB7Ci0JaWYgKCBHZXRfQ29va2llKCBuYW1lICkgKSBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgIj0iICsKLQkoICggcGF0aCApID8gIjtwYXRoPSIgKyBwYXRoIDogIiIpICsKLQkoICggZG9tYWluICkgPyAiO2RvbWFpbj0iICsgZG9tYWluIDogIiIgKSArCi0JIjtleHBpcmVzPVRodSwgMDEtSmFuLTE5NzAgMDA6MDA6MDEgR01UIjsKLX0KLQotZnVuY3Rpb24gZml4VG9waWNVcmwodXJsKSB7Ci0KLQl2YXIgZml4ZWRfaHJlZiA9IHBhcmVudC5wYXJlbnQuZml4VXJsKHVybCk7Ci0JLy8gcmVtb3ZlIHRoZSBxdWVyeSwgaWYgYW55Ci0JdmFyIGluZHggPSBmaXhlZF9ocmVmLmluZGV4T2YoJz8nKTsKLQlpZiAoaW5keCAhPSAtMSkgewotCQlmaXhlZF9ocmVmID0gZml4ZWRfaHJlZi5zdWJzdHJpbmcoMCwgaW5keCk7Ci0JfQotCi0JcmV0dXJuIGZpeGVkX2hyZWY7Ci19Ci0KLS8qIGZpbmQgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gdXJsIGFuZCByZXR1cm4gdGhlIEEgZWxlbWVudCAqLwkKLWZ1bmN0aW9uIGZpbmROb2RlKHRvcGljKSB7Ci0JaWYgKCF0b3BpYykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JdG9waWMgPSBmaXhUb3BpY1VybCh0b3BpYyk7CQotCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Ci0JZm9yICh2YXIgaT0wOyBpPGxpbmtzLmxlbmd0aDsgaSsrKQotCXsJCQkKLQkJdmFyIGZpeGVkX2hyZWYgPSBmaXhUb3BpY1VybChsaW5rc1tpXS5ocmVmKTsJCQkKLQkJaWYgKHRvcGljID09IGZpeGVkX2hyZWYpCi0JCXsKLQkJCS8vYWxlcnQodG9waWMgKyAiXG4iICsgbGlua3NbaV0uaHJlZik7Ci0JCQlyZXR1cm4gbGlua3NbaV07Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7Ci19Ci0KLQotZnVuY3Rpb24gZ2V0Tm9kZUlkRnJvbVVybCh1cmwpIHsKLQotCXZhciBpbmR4ID0gdXJsLmluZGV4T2YoIj8iKTsKLQlpZiAoIGluZHggPCAwICkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcXVlcnlTdHIgPSB1cmwuc3Vic3RyaW5nKGluZHgrMSk7Ci0JdmFyIHBhaXJzID0gcXVlcnlTdHIuc3BsaXQoIiYiKTsKLSAgIAlmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgIAkJdmFyIHBvcyA9IHBhaXJzW2ldLmluZGV4T2YoJz0nKTsKLSAgICAgCQlpZiAocG9zID09IC0xKSBjb250aW51ZTsKLSAgICAgCQl2YXIgYXJnbmFtZSA9IHBhaXJzW2ldLnN1YnN0cmluZygwLHBvcyk7Ci0gICAgIAkJdmFyIHZhbHVlID0gcGFpcnNbaV0uc3Vic3RyaW5nKHBvcysxKTsgICAgCQotICAgICAJCWlmICggYXJnbmFtZSA9PSAibm9kZUlkIiApIHsKLSAgICAgCQkJcmV0dXJuIHZhbHVlOwotICAgICAJCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7Ci19Ci0KLWZ1bmN0aW9uIGdldEJyZWFkY3J1bWJzQnlHdWlkKGd1aWQpIHsKLQotCXZhciBub2RlID0gZ2V0Tm9kZUJ5R3VpZChndWlkKTsKLQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCXJldHVybiBnZXRCcmVhZGNydW1ic0J5Tm9kZUlkKGlkKTsKLQl9Ci0JCi0JcmV0dXJuICIiOwkKLX0KLQotZnVuY3Rpb24gZ2V0Tm9kZUJ5R3VpZChndWlkKSB7Ci0KLQl2YXIgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwotCWZvciAodmFyIGk9MDsgaTxsaW5rcy5sZW5ndGg7IGkrKykKLQl7CQotCQl2YXIgbm9kZSA9IGxpbmtzW2ldOwotCQlpZiAoZ3VpZCA9PSBub2RlLmdldEF0dHJpYnV0ZSgiZ3VpZCIpICkgewotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7CQotfQotCi1mdW5jdGlvbiBnZXRCcmVhZGNydW1icyh1cmwpIHsKLQotCXZhciBpZCA9IGdldE5vZGVJZEZyb21VcmwodXJsKTsKLQkvL2FsZXJ0KCJpZDogdXJsIDogIiArIGlkICsgIiwgIiArIHVybCk7Ci0KLQlpZiAoIGlkID09IG51bGwgfHwgaWQgPT0gIiIgKSB7Ci0JCS8qCi0JCS8vIGdldCB0aGUgcGFyZW50IG5vZGUsIGFzc3VtaW5nIHRoZSBjdXJyZW50IG5vZGUgaXMgbmF2aWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIG5vZGUKLQkJdmFyIHByZXZpb3VzQnJlYWRDcnVtYklkID0gZ2V0Q29va2llKCJwcmV2aW91c0JyZWFkQ3J1bWJJZCIpOwotCQkKLQkJLy9hbGVydCgicHJldmlvdXNCcmVhZENydW1iSWQ9IiArIHByZXZpb3VzQnJlYWRDcnVtYklkKTsKLQkJdmFyIHBOb2RlID0gbnVsbDsKLQkJaWYgKCBwcmV2aW91c0JyZWFkQ3J1bWJJZCAhPSBudWxsICkgewotCQkJcE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmV2aW91c0JyZWFkQ3J1bWJJZCk7Ci0JCQlpZiAoIHBOb2RlICE9IG51bGwgKSB7Ci0JCQkJLy8gZ2V0IHRoZSBwYXJlbnQgbm9kIG9mIHRoZSBsaW5rCi0JCQkJcE5vZGUgPSBwTm9kZS5wYXJlbnROb2RlOwotCQkJCS8vYWxlcnQocE5vZGUudGFnTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQkJCi0JCXZhciBub2RlID0gZmluZE5vZGUodXJsKTsJCQotCQlpZiAoIG5vZGUgIT0gbnVsbCApIHsKLQkJCWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCX0KLQkJCi0JCWlmICggaWQgPT0gbnVsbCApIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQkKLQkJLy8gc2F2ZSB0aGUgY3VycmVudCBpZAotCQkvLyBzZXRDb29raWUoInByZXZpb3VzQnJlYWRDcnVtYklkIiwgaWQpOwotCX0KLQkKLQlzZWxlY3RUb3BpY0J5SWQoaWQpOwotCi0JcmV0dXJuIGdldEJyZWFkY3J1bWJzQnlOb2RlSWQoaWQpOwotfQotCi0KLWZ1bmN0aW9uIGdldEJyZWFkY3J1bWJzQnlOb2RlSWQoaWQpIHsKLQotCXZhciBiY3MgPSBbXTsKLQl2YXIgY291bnQgPSAwOwotCXZhciBwSWQgPSBpZDsKLQl3aGlsZSAoIHBJZCAhPSAiIiApIHsKLQkJdmFyIHRvcGljID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocElkKTsKLQkJaWYgKCB0b3BpYyA9PSBudWxsICkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQliY3NbY291bnQrK10gPSBfY29uc3RydWN0QnJlYWRjcnVtYih0b3BpYyk7Ci0JCQotCQlwSWQgPSB0b3BpYy5nZXRBdHRyaWJ1dGUoInBhcmVudElkIik7Ci0JfQotCQotCXJldHVybiBiY3MucmV2ZXJzZSgpOwotCi19Ci0KLWZ1bmN0aW9uIF9jb25zdHJ1Y3RCcmVhZGNydW1iKG5vZGUpIHsKLQotCi0JdmFyIHN0ciA9IG5vZGUuaW5uZXJIVE1MOwotCXZhciB1cmwgPSBub2RlLmhyZWY7Ci0JdmFyIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZSgiZ3VpZCIpOwotCQotCXZhciBpID0gc3RyLmluZGV4T2YoIj4iKTsKLQlpZiAoIGkgPiAwICkgewotCQlzdHIgPSBzdHIuc3Vic3RyaW5nKGkrMSk7Ci0JfQotCi0JcmV0dXJuIHtpZDogZ3VpZCwgdXJsOiB1cmwsIHRpdGxlOiBzdHJ9OwotCi19Ci0KLQotCi1mdW5jdGlvbiBnZXRCYXNlVXJsKCkgewotCXZhciB1cmwgPSBwYXJlbnQucGFyZW50LmxvY2F0aW9uLmhyZWY7Ci0JdmFyIGkgPSB1cmwubGFzdEluZGV4T2YoIi8iKTsKLQlyZXR1cm4gdXJsLnN1YnN0cmluZygwLCBpKzEpOwotfQotCi1mdW5jdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCXJldHVybiBvbGRBY3RpdmU7Ci19Ci0KLS8qIGdpdmUgdGhlIExJIG5vZGUgYXMgcGFyZW50LCBmaW5kIHRoZSBjaGlsZCA8QSBub2RlIHdpdGggdGhlIGdpdmVuIGd1aWQqLwotZnVuY3Rpb24gZ2V0Q2hpbGROb2RlV2l0aEd1aWQoLypMSSovcE5vZGUsIGd1aWQpCi17Ci0JLy9hbGVydCgicGFyZW50IExpbms6ICIgKyBwTm9kZS50YWdOYW1lKTsKLQotCWlmICggcE5vZGUgPT0gbnVsbCApIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCWlmICggcE5vZGUudGFnTmFtZSA9PSAiQSIgKSB7Ci0JCXBOb2RlID0gcE5vZGUucGFyZW50Tm9kZTsKLQl9Ci0JCi0JdmFyIHVsID0gZ2V0Q2hpbGROb2RlKHBOb2RlLCAiVUwiKTsKLQkJCi0JaWYgKCB1bCA9PSBudWxsICkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCXZhciBsaXN0ID0gdWwuY2hpbGROb2RlczsKLQlpZiAobGlzdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlmb3IgKHZhciBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgewotCQl2YXIgdGFnID0gbGlzdC5pdGVtKGkpOwotCQlpZiAodGFnLnRhZ05hbWUgPT0gIkxJIiApIHsKLQkJCXZhciBhID0gZ2V0Q2hpbGROb2RlKHRhZywgIkEiKTsKLQkJCWlmICggYSAhPSBudWxsICYmIGEuZ2V0QXR0cmlidXRlKCJndWlkIikgPT0gZ3VpZCkgewkJCi0JCQkJcmV0dXJuIGE7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7Ci19Ci0KLQotLyogZ2l2ZSBhbiBhcnJheSBvZiBndWlkcywgcmV0dXJucyB0aGUgYnJlYWRjcnVtYnMqLwotZnVuY3Rpb24gZ2V0QnJlYWRjcnVtYnNCeVBhdGgoZ3VpZHMpIHsKLQotCWlmICggZ3VpZHMgPT0gbnVsbCB8fCBndWlkcy5sZW5ndGggPT0gMCApIHsKLQkJcmV0dXJuIFtdOwotCX0KLQkKLQkvLyBzdGFydCBmcm9tIHRoZSBmaXJzdCBndWlkLCBvciBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotCXZhciBzdGFydCA9IDA7Ci0JdmFyIHBOb2RlID0gbnVsbDsKLQl2YXIgY3VyTm9kZSA9IGdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQlpZiAoIGN1ck5vZGUgIT0gbnVsbCApIHsKLQkJdmFyIGN1ckd1aWQgPSBjdXJOb2RlLmdldEF0dHJpYnV0ZSgiZ3VpZCIpOwotCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBndWlkcy5sZW5ndGgtMTsgaSsrICkgewotCQkJdmFyIGd1aWQgPSBndWlkc1tpXTsKLQkJCWlmICggZ3VpZCA9PSBjdXJHdWlkICkgewotCQkJCXN0YXJ0ID0gaTsKLQkJCQlwTm9kZSA9IGN1ck5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0KLQlpZiAoIHBOb2RlID09IG51bGwgKSB7Ci0JCXBOb2RlID0gZ2V0Tm9kZUJ5R3VpZChndWlkc1swXSk7Ci0JfQotCQotCWlmICggcE5vZGUgPT0gbnVsbCApIHsKLQkJcmV0dXJuIFtdOwotCX0KLQkKLQl2YXIgYmNzID0gZ2V0QnJlYWRjcnVtYnNCeU5vZGVJZCggcE5vZGUuZ2V0QXR0cmlidXRlKCJpZCIpICk7Ci0JCQotCWZvciAoIHZhciBpID0gc3RhcnQrMTsgaSA8IGd1aWRzLmxlbmd0aDsgaSsrICkgewotCQl2YXIgbm9kZSA9IGdldENoaWxkTm9kZVdpdGhHdWlkKHBOb2RlLCBndWlkW2ldKTsKLQkJaWYgKCBub2RlID09IG51bGwgKSB7Ci0JCQlicmVhazsKLQkJfQotCQkKLQkJYmNzLnB1c2goX2NvbnN0cnVjdEJyZWFkY3J1bWIobm9kZSkpOwkJCi0JCXBOb2RlID0gbm9kZTsKLQl9Ci0KLQkvLyBzZWxlY3QgdGhlIG5vZGUKLQkvL3NlbGVjdFRvcGljQnlJZChwTm9kZS5nZXRBdHRyaWJ1dGUoImlkIikgKTsKLQotCXJldHVybiBiY3M7CQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90cmVlLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90cmVlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGYyZTNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvdHJlZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoqCi0gKiBMb2FkcyB0aGUgc3BlY2lmaWVkIHRhYmxlIG9mIGNvbnRlbnRzCi0gKi8KLWZ1bmN0aW9uIGxvYWRUT0ModG9jSHJlZikKLXsKLQkvLyBuYXZpZ2F0ZSB0byB0aGlzIHRvYywgaWYgbm90IGFscmVhZHkgbG9hZGVkCi0JaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInRvY1ZpZXcuanNwP3RvYz0iK3RvY0hyZWYpICE9IC0xKQotCQlyZXR1cm47Ci0Jd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoInRvY1ZpZXcuanNwP3RvYz0iK3RvY0hyZWYpOwotfQotCi12YXIgdG9jVGl0bGUgPSAiIjsKLXZhciB0b2NJZCA9ICIiOwotCi1mdW5jdGlvbiBvbmxvYWRIYW5kbGVyKCkKLXsKLQlyZXR1cm47Ci0JdG9jVGl0bGUgPSAnV29ya2JlbmNoXHUwMDIwVXNlclx1MDAyMEd1aWRlJzsKLQl2YXIgdG9jVG9waWMgPSAiYWJvdXQ6YmxhbmsiOwotCi0JLy8gc2V0IHRpdGxlIG9uIHRoZSBjb250ZW50IHRvb2xiYXIKLQlwYXJlbnQucGFyZW50LnBhcmVudC5zZXRDb250ZW50VG9vbGJhclRpdGxlKHRvY1RpdGxlKTsKLQotCXZhciB0b3BpY1NlbGVjdGVkPWZhbHNlOwotCS8vIHNlbGVjdCBzcGVjaWZpZWQgdG9waWMsIG9yIGVsc2UgdGhlIGJvb2sKLQl2YXIgdG9waWMgPSAiYWJvdXQ6YmxhbmsiOwotCWlmICh0b3BpYyAhPSAiYWJvdXQ6YmxhbmsiICYmIHRvcGljICE9IHRvY1RvcGljKSB7Ci0JCWlmICh0b3BpYy5pbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCkgIT0gMCAmJiB0b3BpYy5sZW5ndGggPiAyKSB7Ci0JCQkvLyByZW1vdmUgdGhlIC4uIGZyb20gdG9waWMKLQkJCXRvcGljID0gdG9waWMuc3Vic3RyaW5nKDIpOwotCQkJLy8gcmVtb3ZlIGFkdmFuY2VkL3RvY1ZpZXcuanNwIGZyb20gcGF0aCB0byBvYnRhaW4gY29udGV4dFBhdGgKLQkJCXZhciBjb250ZXh0UGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKLQkJCXZhciBzbGFzaCA9IGNvbnRleHRQYXRoLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZihzbGFzaCA+IDApIHsKLQkJCQlzbGFzaCA9IGNvbnRleHRQYXRoLmxhc3RJbmRleE9mKCcvJywgc2xhc2gtMSk7Ci0JCQkJaWYoc2xhc2ggPj0gMCkgewotCQkJCQljb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoLnN1YnN0cigwLCBzbGFzaCk7Ci0JCQkJCXRvcGljID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArd2luZG93LmxvY2F0aW9uLmhvc3QgKyBjb250ZXh0UGF0aCArIHRvcGljOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0b3BpY1NlbGVjdGVkID0gc2VsZWN0VG9waWModG9waWMpOwotCX0gZWxzZSB7Ci0JCXRvcGljU2VsZWN0ZWQgPSBzZWxlY3RUb3BpY0J5SWQodG9jSWQpOwotCX0KLQotCWlmKCF0b3BpY1NlbGVjdGVkKXsKLQkJaWYocGFyZW50LnBhcmVudC5hY3Rpdml0eUZpbHRlcmluZyl7Ci0JCQlhc2tTaG93QWxsKCk7Ci0JCX0KLQl9Ci0KLQotCWZvY3VzSGFuZGxlcigiZSIpOwotfQotCi12YXIgYXNrU2hvd0FsbERpYWxvZzsKLXZhciB3ID0gNDcwOwotdmFyIGggPSAyNzA7Ci0KLWZ1bmN0aW9uIGFza1Nob3dBbGwoKXsKLQotCXZhciBsID0gdG9wLnNjcmVlbkxlZnQgKyAodG9wLmRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggLSB3KSAvIDI7Ci0JdmFyIHQgPSB0b3Auc2NyZWVuVG9wICsgKHRvcC5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAtIGgpIC8gMjsKLQotCS8vIG1vdmUgdGhlIGRpYWxvZyBqdXN0IGEgYml0IGhpZ2hlciB0aGFuIHRoZSBtaWRkbGUKLQlpZiAodC01MCA+IDApIHQgPSB0LTUwOwotCi0Jd2luZG93LmxvY2F0aW9uPSJqYXZhc2NyaXB0Oi8vbmVlZE1vZGFsIjsKLQlhc2tTaG93QWxsRGlhbG9nID0gd2luZG93Lm9wZW4oImFza1Nob3dBbGwuanNwIiwgImFza1Nob3dBbGxEaWFsb2ciLCAicmVzaXplYWJsZT1ubyxoZWlnaHQ9IitoKyIsd2lkdGg9Iit3KyIsbGVmdD0iK2wrIix0b3A9Iit0ICk7Ci0JYXNrU2hvd0FsbERpYWxvZy5mb2N1cygpOwotfQotCi1mdW5jdGlvbiB5ZXNTaG93QWxsKCl7Ci0Jd2luZG93LnBhcmVudC5wYXJlbnQuc2hvd0FsbCgpOwotfQotCi1mdW5jdGlvbiBjbG9zZUFza1Nob3dBbGxEaWFsb2coKXsKLQl0cnkgewotCQlpZiAoYXNrU2hvd0FsbERpYWxvZyl7Ci0JCQlhc2tTaG93QWxsRGlhbG9nLmNsb3NlKCk7Ci0JCX0KLQl9Ci0JY2F0Y2goZSkge30KLX0KLQotZnVuY3Rpb24gb251bmxvYWRIYW5kbGVyKCkgewotCWNsb3NlQXNrU2hvd0FsbERpYWxvZygpOwotCi0JZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAiIjsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmJiZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sIGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIj4KLTx0aXRsZT5HbG9zc2FyeSAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjI1LCoiPgotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJOYXZpZ2F0aW9uIEFyZWEiPgotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X2RvYyIgc3JjPSIuLi9nbG9zc2FyeS5odG0iIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjIiIHNjcm9sbGluZz0iYXV0byIgdGl0bGU9IkNvbnRlbnQgQXJlYSI+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9yb3AuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9yb3AuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDIyMGU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvcm9wLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDE2ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5Ci17Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLSAJZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gCWZvbnQtc2l6ZTogMTBwdAotfQotCi1ib2R5Lm5hdmJ1dHRvbnMKLXsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQltYXJnaW4tcmlnaHQ6IDBweAotfQotCi0uYmd3aGl0ZQoteyAKLQkgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZgotfSAKLQotLmJ1dHRvbnMKLXsKLSAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lCQotfQotCi0uYnV0dG9ub24gCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlCi19IAotCi10ZC5idXR0b25zCi17Ci0JdmVydGljYWwtYWxpZ246IG1pZGRsZTsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0Ci19Ci0KLS5pY29uYm9yZGVyCi17IAotCSBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlCi19Ci0KLWEuYnV0dG9uczpsaW5rIAoteyAKLQljb2xvcjogIzAwMDAwMAotfQotCi1hLmJ1dHRvbnM6dmlzaXRlZCAKLXsgCi0JY29sb3I6ICMwMDAwMDAKLX0KLQotYS5idXR0b25zOmhvdmVyIAoteyAKLQljb2xvcjogI2NjMDAwMAotfQotCi1hLmJ1dHRvbnM6YWN0aXZlCi17IAotCWNvbG9yOiAjY2MwMDAwCi19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gIAotZGl2Lm1hcmdpbnMyMCAKLXsgCQotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjBweDsKLQltYXJnaW4tcmlnaHQ6IDdweAotfSAgIAotCi0KLWgxCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogbGFyZ2UKLX0KLSAgICAgICAgCi1oMS5iYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgCWZvbnQtc2l6ZTogbGFyZ2U7Ci0JICAJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotaDIKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDE1MCUJCi19Ci0gICAgICAgIAotaDIuYmFubmVyCi17Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxNTAlOwotICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi1oMwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWYKLX0KLQotaDQsIGg1LCBoNgotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLSAgCi0gICAgCi1hOmxpbmsKLXsKLSAgICBjb2xvcjogIzAwMzM5OQotfQotCi1hOmFjdGl2ZQotewotICAgIGNvbG9yOiAjMDAwMGZmCi19Ci0KLWE6dmlzaXRlZAotewotICAgIGNvbG9yOiAjNjYwMDY2Ci19Ci0KLWRsCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotZHQKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kZAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1wLm5vZGUKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLSAgICAgICAgCi19Ci0KLXAuZXhhbXBsZWhlYWRpbmcKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotfQotCi1wLmV4YW1wbGUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5waWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLmRlZmluaXRpb24KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmNjOwotCWJvcmRlcjogdGhpbiBkb3VibGUgYmxhY2sKLX0KLQotcC50YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC50YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5wYXJhbW5hbWUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotcC5wYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAucGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sIG9sIG9sCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5hbHBoYQotewotCWxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEKLX0KLQotdWwKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotdWwgbGkKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsyMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgbGkubm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmNrCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5jawotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkuY2sKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotICAgIAl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwucGx1cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwubWludXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLmNrCi17Ci0KLX0KLQotdGFibGUKLXsKLS8qCWJvcmRlcjogMTsqLwotLyoJd2lkdGg6IDg1JTsqLwotLyoJY2VsbHNwYWNpbmc6IDA7Ki8KLS8qCWNlbGxwYWRkaW5nOiA0OyovCi0vKglzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgcmdiKDEyOCwxMjgsMTI4KSI7Ki8KLS8qCWJvcmRlcmNvbG9yPSIjODA4MDgwIjsqLwotLyoJYm9yZGVyY29sb3JsaWdodDogIzgwODA4MDsqLwotLyoJYm9yZGVyY29sb3JkYXJrOiAjODA4MDgwKi8KLX0KLQotdGJvZHkKLXsKLQl2YWxpZ246IGJhc2VsaW5lOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmCi19Ci0KLXRoCi17Ci0JZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLXRkCi17Ci0JdmVydGljYWwtYWxpZ246IHRvcDsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0Ci19Ci0KLXRkIHVsCi17Ci0JbWFyZ2luLWxlZnQ6ICsyMHB4OwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQKLX0KLQotZm9udC5wYXJhbWV4YW1wbGUKLXsKLSAgIGNvbG9yOiByZWQKLX0KLQotZm9udC5pbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0vKiB1c2VkIGZvciBub3QtaW5jbHVkZWQgcGx1Z2lucyovCi1oMS5ub3RpbmNsdWRlZGJhbm5lcgotewotICAgICAgICBiYWNrZ3JvdW5kOiAjRkZGRkNDOwotICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgIGZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci0KLQotLyp0aGUgZm9sbG93aW5nIGlzIHVzZWQgZm9yIGlibSBjb250ZW50Ki8KLQotaDEuaWJtCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMS5pYm1iYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgZm9udC1zaXplOiBsYXJnZTsKLQkgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotCi0gICAgCi0KLWgyLmlibQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0gICAgICAgIAotaDIuaWJtYmFubmVyCi17Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1MCU7IAotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1oMy5pYm0KLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oNC5pYm0sIGg1LmlibSwgaDYuaWJtCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1kbC5pYm0KLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kdC5pYm0KLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kZC5pYm0KLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotICAgCi1wLmlibQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgCSBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLXAuaWJtbm9kZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICBsZWZ0TWFyZ2luOiAxNXB4Ci19Ci0KLXAuaWJtZXhhbXBsZWhlYWRpbmcKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotfQotCi1wLmlibWV4YW1wbGUKLXsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5pYm1waWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLmlibWRlZmluaXRpb24KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmNjOwotCWJvcmRlcjogdGhpbiBkb3VibGUgYmxhY2sKLX0KLQotcC5pYm10YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5pYm10YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5pYm1wYXJhbW5hbWUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotcC5pYm1wYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAuaWJtcGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbC5pYm0KLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICs0NXB4Ci19Ci0KLW9sIG9sLmlibQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wuaWJtCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5pYm1hbHBoYQotewotCWxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEKLX0KLQotCi0KLXVsIGxpLmlibQotewotICAgICAgICB0ZXh0LWluZGVudDogKzIwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkuaWJtCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmlibQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkuaWJtbm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmlibWNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5pYm1jawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkuaWJtY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5pYm1wbHVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5pYm1taW51cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotCi11bC5pYm1jawotewotCi19Ci0KLXRhYmxlLmlibQotewotfQotCi10ci5pYm0KLXsKLX0KLQotdGQuaWJtCi17Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3AKLX0KLQotdGQgdWwuaWJtCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjBweAotfQotCi1mb250LmlibXBhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250LmlibWltYWdlZXhhbXBsZQotewotICAgZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS8qdGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciByZWFsIHRpbWUgY29udGVudCovCi0KLWgxLnJlYWN0aXZlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMS5yZWFjdGl2ZWJhbm5lcgotewotICAgICAgICAKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogbGFyZ2U7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWgyLnJlYWN0aXZlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1MCU7Ci19Ci0gICAgICAgIAotaDIucmVhY3RpdmViYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDE1MCU7Ci0gICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1oMy5yZWFjdGl2ZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LnJlYWN0aXZlLCBoNS5yZWFjdGl2ZSwgaDYucmVhY3RpdmUKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLWRsLnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotZHQucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotICAgICAgCi1kZC5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLXAucmVhY3RpdmVub2RlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci0gICAgICAgIGxlZnRNYXJnaW46IDE1cHgKLX0KLQotcC5yZWFjdGl2ZWV4YW1wbGVoZWFkaW5nCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLX0KLQotcC5yZWFjdGl2ZWV4YW1wbGUKLXsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5yZWFjdGl2ZXBpY3R1cmV0ZXh0Ci17Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotICAgICAgICBtYXJnaW4tbGVmdDogNzBweDsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4Ci19Ci0KLXAucmVhY3RpdmVkZWZpbml0aW9uCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZjYzsKLQlib3JkZXI6IHRoaW4gZG91YmxlIGJsYWNrCi19Ci0KLXAucmVhY3RpdmV0YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5yZWFjdGl2ZXRhYmxldGV4dAotewotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLnJlYWN0aXZlcGFyYW1uYW1lCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXAucmVhY3RpdmVwYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAucmVhY3RpdmVwYXJhbWRlc2NyaXB0aW9uCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLW9sLnJlYWN0aXZlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArNDVweAotfQotCi1vbCBvbC5yZWFjdGl2ZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wucmVhY3RpdmUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sLnJlYWN0aXZlYWxwaGEKLXsKLQlsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhCi19Ci0KLQotCi11bCBsaS5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMjBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLnJlYWN0aXZlbm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLnJlYWN0aXZlY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLnJlYWN0aXZlY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLnJlYWN0aXZlY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5yZWFjdGl2ZXBsdXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLnJlYWN0aXZlbWludXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLQotdWwucmVhY3RpdmVjawotewotfQotCi10YWJsZS5yZWFjdGl2ZQotewotfQotCi10ci5yZWFjdGl2ZQotewotfQotCi10ZC5yZWFjdGl2ZQotewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCi19Ci0KLXRkIHVsLnJlYWN0aXZlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjBweAotfQotCi1mb250LnJlYWN0aXZlcGFyYW1leGFtcGxlCi17Ci0gICBjb2xvcjogcmVkCi19Ci0KLWZvbnQucmVhY3RpdmVpbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0vKnRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgTWljcm9zb2Z0IGNvbnRlbnQqLwotCi1oMS5tc2Z0Ci17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IGxhcmdlOwotfQotICAgICAgICAKLWgxLm1zZnRiYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgCSBmb250LXNpemU6IGxhcmdlOwotCSAgCSB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotaDIubXNmdAotewotICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxNTAlOwkKLX0KLSAgICAgICAgCi1oMi5tc2Z0YmFubmVyCi17Ci0gICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxNTAlOwotCSB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLQkgIAkKLX0KLQotaDMubXNmdAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0Lm1zZnQsIGg1Lm1zZnQsIGg2Lm1zZnQKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLWRsLm1zZnQKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kdC5tc2Z0Ci17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLSAgICAgIAotZGQubXNmdAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAubXNmdAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAubXNmdG5vZGUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLSAgICAgICAgbGVmdE1hcmdpbjogMTVweAotfQotCi1wLm1zZnRleGFtcGxlaGVhZGluZwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci19Ci0KLXAubXNmdGV4YW1wbGUKLXsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5tc2Z0cGljdHVyZXRleHQKLXsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0JZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4MCU7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiA3MHB4OwotICAgICAgICBtYXJnaW4tcmlnaHQ6IDUwcHgKLX0KLQotcC5tc2Z0ZGVmaW5pdGlvbgotewotCWJhY2tncm91bmQ6ICNmZmZmY2M7Ci0JYm9yZGVyOiB0aGluIGRvdWJsZSBibGFjawotfQotCi1wLm1zZnR0YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5tc2Z0dGFibGV0ZXh0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAubXNmdHBhcmFtbmFtZQotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1wLm1zZnRwYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAubXNmdHBhcmFtZGVzY3JpcHRpb24KLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotb2wubXNmdAotewotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wubXNmdAotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wubXNmdAotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wubXNmdGFscGhhCi17Ci0JbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYQotfQotCi0KLQotdWwgbGkubXNmdAotewotICAgICAgICB0ZXh0LWluZGVudDogKzIwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkubXNmdAotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5tc2Z0Ci17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5tc2Z0bm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLm1zZnRjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkubXNmdGNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5tc2Z0Y2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5tc2Z0cGx1cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwubXNmdG1pbnVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi0KLXVsLm1zZnRjawotewotfQotCi10YWJsZS5tc2Z0Ci17Ci19Ci0KLXRyLm1zZnQKLXsKLX0KLQotdGQubXNmdAotewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCi19Ci0KLXRkIHVsLm1zZnQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyMHB4Ci19Ci0KLWZvbnQubXNmdHBhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250Lm1zZnRpbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0vKnRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgZGF0YWJhc2UgY29udGVudCovCi0KLWgxLmRibXMKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgxLmRibXNiYW5uZXIKLXsKLSAgICAgICAgYmFja2dyb3VuZDogIzZhOGZiZDsKLSAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JICBmb250LXNpemU6IGxhcmdlOwotfQotCi1oMi5kYm1zCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMi5kYm1zYmFubmVyCi17Ci0gICAgICAgIGJhY2tncm91bmQ6ICM2YThmYmQ7Ci0gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oMy5kYm1zCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLQotaDQuZGJtcywgaDUuZGJtcywgaDYuZGJtcwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotZGwuZGJtcwotewotfQotCi1kdC5kYm1zCi17Ci19Ci0gICAgICAKLWRkLmRibXMKLXsKLX0KLQotcC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotcC5kYm1zbm9kZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICBsZWZ0TWFyZ2luOiAxNXB4Ci19Ci0KLXAuZGJtc2V4YW1wbGVoZWFkaW5nCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLX0KLQotcC5kYm1zZXhhbXBsZQotewotCW1hcmdpbi1sZWZ0OiA3MHB4OwotfQotCi1wLmRibXNwaWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLmRibXNkZWZpbml0aW9uCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZjYzsKLQlib3JkZXI6IHRoaW4gZG91YmxlIGJsYWNrCi19Ci0KLXAuZGJtc3RhYmxlaGVhZGluZwotewotCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLmRibXN0YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5kYm1zcGFyYW1uYW1lCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXAuZGJtc3BhcmFtZXhhbXBsZQotewotICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgIGNvbG9yOiByZWQKLX0KLQotcC5kYm1zcGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArNDVweAotfQotCi1vbCBvbC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbCBvbCBvbC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5kYm1zYWxwaGEKLXsKLQlsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhCi19Ci0KLQotCi11bCBsaS5kYm1zCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMjBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5kYm1zCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmRibXMKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmRibXNub2RlCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkuZGJtc2NrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5kYm1zY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmRibXNjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsLmRibXNwbHVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5kYm1zbWludXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLQotdWwuZGJtc2NrCi17Ci19Ci0KLXRhYmxlLmRibXMKLXsKLX0KLQotdHIuZGJtcwotewotfQotCi10ZC5kYm1zCi17Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3AKLX0KLQotdGQgdWwuZGJtcwotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIwcHgKLX0KLQotZm9udC5kYm1zcGFyYW1leGFtcGxlCi17Ci0gICBjb2xvcjogcmVkCi19Ci0KLWZvbnQuZGJtc2ltYWdlZXhhbXBsZQotewotICAgZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS8qdGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciBsYXJnZS1zY2FsZSBkZXZlbG9wbWVudCBjb250ZW50Ki8KLQotaDEubGFyZ2UKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgxLmxhcmdlYmFubmVyCi17Ci0gICAgICAgIGJhY2tncm91bmQ6ICM2YThmYmQ7Ci0gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgZm9udC1zaXplOiBsYXJnZTsKLX0KLQotaDIubGFyZ2UKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgyLmxhcmdlYmFubmVyCi17Ci0gICAgICAgIGJhY2tncm91bmQ6ICM2YThmYmQ7Ci0gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oMy5sYXJnZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LmxhcmdlLCBoNS5sYXJnZSwgaDYubGFyZ2UKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLWRsLmxhcmdlCi17Ci19Ci0KLWR0LmxhcmdlCi17Ci19Ci0gICAgICAKLWRkLmxhcmdlCi17Ci19Ci0KLXAubGFyZ2UKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1wLmxhcmdlbm9kZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICBsZWZ0TWFyZ2luOiAxNXB4Ci19Ci0KLXAubGFyZ2VleGFtcGxlaGVhZGluZwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci19Ci0KLXAubGFyZ2VleGFtcGxlCi17Ci0JbWFyZ2luLWxlZnQ6IDcwcHg7Ci19Ci0KLXAubGFyZ2VwaWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLmxhcmdlZGVmaW5pdGlvbgotewotCWJhY2tncm91bmQ6ICNmZmZmY2M7Ci0JYm9yZGVyOiB0aGluIGRvdWJsZSBibGFjawotfQotCi1wLmxhcmdldGFibGVoZWFkaW5nCi17Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAubGFyZ2V0YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5sYXJnZXBhcmFtbmFtZQotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1wLmxhcmdlcGFyYW1leGFtcGxlCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgY29sb3I6IHJlZAotfQotCi1wLmxhcmdlcGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbC5sYXJnZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wubGFyZ2UKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sIG9sIG9sLmxhcmdlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5sYXJnZWFscGhhCi17Ci0JbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYQotfQotCi0KLQotdWwgbGkubGFyZ2UKLXsKLSAgICB0ZXh0LWluZGVudDogKzIwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmxhcmdlCi17Ci0gICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5sYXJnZQotewotICAgIHRleHQtaW5kZW50OiArMTBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmxhcmdlbm9kZQotewotICAgIHRleHQtaW5kZW50OiArMTBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmxhcmdlY2sKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmxhcmdlY2sKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmxhcmdlY2sKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5sYXJnZXBsdXMKLXsKLSAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwubGFyZ2VtaW51cwotewotICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi0KLXVsLmxhcmdlY2sKLXsKLX0KLQotdGFibGUubGFyZ2UKLXsKLX0KLQotdHIubGFyZ2UKLXsKLX0KLQotdGQubGFyZ2UKLXsKLSAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcAotfQotCi10ZCB1bC5sYXJnZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIwcHgKLX0KLQotZm9udC5sYXJnZXBhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250LmxhcmdlaW1hZ2VleGFtcGxlCi17Ci0gICBmb250LXNpemU6IHNtYWxsZXIKLX0KLQotcnB3Ci17Ci0gIGNvbG9yOiAjMDAwMDY2Ci19Ci0KLXJwdy5wcm9jZXNzX2NvbXBvbmVudAotewotICBjb2xvcjogZ3JlZW4KLX0KLQotcnB3LnByb2Nlc3NfY29tcG9uZW50LnJlbW92ZV90ZXh0Ci17Ci0gIGNvbG9yOiBncmVlbjsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLSAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2gKLX0KLS8qd2FzIGNvbG9yOiAjRkZDQzk5Ki8gCi0KLXJwdy5yZW1vdmVfdGV4dAotewotICBjb2xvcjogZ3JlZW47Ci0gIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoCi19Ci0KLXJwdy5wbHVnaW5fcHJvY2Vzc19jb21wb25lbnQKLXsKLSAgY29sb3I6IHJlZAotfQotCi1ycHcucGx1Z2luX3JlbW92ZV90ZXh0Ci17Ci0gIGNvbG9yOiByZWQ7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoCi19Ci0KLXJwdy5ycHdfY29tbWVudAotewotICBjb2xvcjogZ3JheTsKLSAgZm9udC1zdHlsZTogb2JsaXF1ZQotfQotCi0KLXJwdy5tc2Z0Ci17Ci0gIGNvbG9yOiBibHVlCi19Ci0KLXJwdy5pYm0KLXsKLSAgY29sb3I6IGJsdWUKLX0KLQotcnB3LnJlYWN0aXZlCi17Ci0gIGNvbG9yOiByZWQKLX0KLQotcnB3LmJ1c21vZAotewotICBjb2xvcjogcmVkCi19Ci0KLXJwdy5ydXBfcnRfZGVzaWduCi17Ci0gIGNvbG9yOiBncmVlbgotfQotCi1ycHcucnVwX2RiX2Rlc2lnbgotewotICBjb2xvcjogZ3JlZW4KLX0KLQotcnB3LnJ1cF9ndWlfZGVzaWduCi17Ci0gIGNvbG9yOiBncmVlbgotfQotCi0uaG90dGV4dAotewkKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci19Ci1hLmhvdHRleHQ6bGluayAKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOm5vbmU7IAotfQotCi1hLmhvdHRleHQ6dmlzaXRlZCAKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOm5vbmU7IAotfQotCi1hLmhvdHRleHQ6aG92ZXIgCi17IAotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjpub25lOyAKLX0KLQotYS5ob3R0ZXh0OmFjdGl2ZQoteyAKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246bm9uZTsgCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvY29tbW9uLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL2NvbW1vbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjYWNiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvY29tbW9uLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12YXIgZ2xvYmFsTGF5ZXIgPSAiIjsKLQotLy9mb3IgcG9wdXAgc3VibWVudSB3aXRoIHJlZCBhcnJvd3MKLXZhciBjaGVja2VkID0gZmFsc2U7Ci0KLS8qIEJyb3dzZXIgc2Vuc2luZyAqLwotLyogU2V0IHVwIGJvb2xpYW4gdmFyaWFibGVzIHRvIHJlY29yZCB0aGUgYnJvd3NlciB0eXBlICovCi12YXIgaXNOUzQgPSAwOwotdmFyIGlzSUU0ID0gMDsKLXZhciBpc05ldyA9IDA7Ci12YXIgZG9jT2JqLCBzdHlsZU9iaiwgY3Vyck9iaiwgbGF5T24sIGxheU9mZiwgZG9tOwotLyogRGV0ZXJtaW5lcyB0aGUgYnJvd3NlciBuYW1lIGFuZCBicm93c2VyIHZlcnNpb24gKi8KLXZhciBicm93ID0gKChuYXZpZ2F0b3IuYXBwTmFtZSkgKyAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pKSk7Ci0vKiByZWFzc2lnbiB2YXJpYWJsZSBkZXBlbmRpbmcgb24gdGhlIGJyb3dzZXIgKi8KLQotCi0KLS8vY2FwdHVyZSBldmVudAotTlM0ID0gKGRvY3VtZW50LmNhcHR1cmVFdmVudHMpOwotaWYgKE5TNCkgeyBkb2N1bWVudC5jYXB0dXJlRXZlbnRzKEV2ZW50Lk1PVVNFRE9XTik7IH0KLWRvY3VtZW50Lm9ubW91c2Vkb3duID0gZG9BY2Nlc3NLZXlzOwkKLQotCi0KLWlmIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbiA+PSA1KSkge2lzTmV3ID0gMX0KLQllbHNlIGlmIChicm93ID09ICJOZXRzY2FwZTQiKSAKLQl7aXNOUzQgPSAxO30KLQkJZWxzZSBpZiAoYnJvdyA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyNCIpIAotCQl7aXNJRTQgPSAxO30KLQkJCQkKLWlmIChpc05TNHx8aXNJRTR8fGlzTmV3KSB7Ci0JZG9jT2JqID0gKGlzTlM0KSA/ICdkb2N1bWVudCcgOiAnZG9jdW1lbnQuYWxsJzsKLQlzdHlsZU9iaiA9IChpc05TNCkgPyAnJyA6ICcuc3R5bGUnOwotCX0KLQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vL1NOSUZGRVIgQkVHSU5TIEhFUkUvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZhciBjPScuY3NzIiAvPic7Ci12YXIgbD0nPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9zdHlsZXNoZWV0cy8nOwotCi0vL1NuaWZmZXIgdmFyaWFibGVzIGJlZ2lucwotLy9jb252ZXJ0aW5nIHRvIGxvd2VyY2FzZQotdmFyIHNubiA9IG5hdmlnYXRvcjsKLXZhciBzbnBsID0gc25uLnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7IC8vIG5vdCBzdXBwb3J0ZWQgaW4gTlMzLjAKLXZhciBzbnVhID0gJyAnICsgc25uLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwotdmFyIHNudW4gPSBzbm4uYXBwTmFtZS50b0xvd2VyQ2FzZSgpOwotCi0vLyBwbGF0Zm9ybQotdmFyIHNudnBsX21hYyA9IHNudWEuaW5kZXhPZignbWFjJykgPiAwOwotdmFyIHNudnBsX3VuaXggPSBzbnVhLmluZGV4T2YoIngxMSIpID4gMDsKLXZhciBzbnZwbF93aW4gPSBzbnVhLmluZGV4T2YoJ3dpbicpID4gMDsKLQotLy8gYnJvd3NlciB2ZXJzaW9uCi12YXIgc252dl9pZSA9IHNudWEuaW5kZXhPZignbXNpZScpID4gMDsKLXZhciBzbnZ2X25uID0gc251YS5pbmRleE9mKCdtb3ppbGxhJykgPiAwOwotdmFyIHNudnZlcnNpb24gPSBzbm4uYXBwVmVyc2lvbjsKLQotCi0vLyAnY29tcGF0aWJsZScgdmVyc2lvbnMgb2YgIm1vemlsbGEiIGFyZW4ndCBuYXZpZ2F0b3IKLWlmKHNudWEuaW5kZXhPZignY29tcGF0aWJsZScpID4gMCkgewotCXNubnZ2X25uID0gZmFsc2U7Ci19Ci0vL0VuZHMgc25pZmZlciB2YXJpYWJsZXMgCi0JCi0JCQotLyogVGhpcyBpcyBhIGJhc2ljIHNuaWZmZXIgKi8KLSAgCi1pZihzbnZwbF93aW4pLy93aW5kb3dzCi0KLXsgIAotICBpZihzbnZ2X2llKSAgICAKLSAgewotICAgIGlmIChzbnVhLmluZGV4T2YoJ2llIDUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgICAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0JICB9Ci0gIH0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgCi0gIGlmIChzbnVhLmluZGV4T2YoIi80IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9iYXNlJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi81IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzYiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0gIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLQkgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICB9Ci19Ci1lbHNlIGlmKHNudnBsX3VuaXgpLy91bml4Ci0gIHsgIAotICBpZihzbnZ2X2llKSAgICAKLSAgewotICAgIGlmIChzbnVhLmluZGV4T2YoJ2llIDUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2VVTlgnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2VVTlgnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHZVTlgnK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotCSAgfQotICB9Ci0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgaWYgKHNudWEuaW5kZXhPZigiLzQiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2VVTlgnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzUiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdlVOWCcrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNiIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2VU5YJytjKTsKLSAgZWxzZQotCSAgewotCSAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdlVOWCcrYyk7Ci0JICB9Ci0gIH0gCi0gIGVsc2UKLSAgewotICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2VU5YJytjKTsKLSAgfQotfQotCi1lbHNlIGlmKHNudnBsX21hYykvL21hYwotICB7ICAKLSAgaWYoc252dl9pZSkgICAgCi0gIHsKLSAgICBpZiAoc251YS5pbmRleE9mKCdpZSA1JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9iYXNlJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNS41JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9iYXNlJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNicpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLSAgICBlbHNlCi0JICB7Ci0JICAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0JICB9Ci0gIH0KLQotICBlbHNlIGlmIChzbnZ2X25uKSAKLSAgewotICBpZiAoc251YS5pbmRleE9mKCIvNCIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZScrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNiIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2TWFjJytjKTsKLSAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotCSAgfQotICB9IAotICBlbHNlCi0gIHsKLSBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLSAgfQotfQotCi1lbHNlLy9vdGhlcnMgCi17Ci0gIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotCi19Ci0KLS8vU05JRkZFUiBFTkRTIEhFUkUKLQotCi1mdW5jdGlvbiBuc19yZWxvYWQoaW5pdCkgeyAgLy9yZWxvYWRzIHRoZSB3aW5kb3cgaWYgTmF2NCByZXNpemVkCi0gIGlmIChpbml0PT10cnVlKSB3aXRoIChuYXZpZ2F0b3IpIHtpZiAoKGFwcE5hbWU9PSJOZXRzY2FwZSIpJiYocGFyc2VJbnQoYXBwVmVyc2lvbik9PTQpKSB7Ci0gICAgZG9jdW1lbnQuTlNXPWlubmVyV2lkdGg7IGRvY3VtZW50Lk5TSD1pbm5lckhlaWdodDsgb25yZXNpemU9bnNfcmVsb2FkOyB9fQotICBlbHNlIGlmIChpbm5lcldpZHRoIT1kb2N1bWVudC5OU1cgfHwgaW5uZXJIZWlnaHQhPWRvY3VtZW50Lk5TSCkgbG9jYXRpb24ucmVsb2FkKCk7Ci19Ci1uc19yZWxvYWQodHJ1ZSk7Ci0KLQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9TTklGRkVSIEVORFMgSEVSRS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLS8vbG9vcCB0byBjaGFuZ2UgYmFja2dyb3VuZCBjb2xvciBmb3IgaWUKLWZ1bmN0aW9uIGJjb2xvcihiY29sLGRfbmFtZSkKLXsKLWlmIChkb2N1bWVudC5hbGwpCi17Ci0gdmFyIHRoZXN0eWxlPSBldmFsICgnZG9jdW1lbnQuYWxsLicrZF9uYW1lKycuc3R5bGUnKTsKLSB0aGVzdHlsZS5iYWNrZ3JvdW5kQ29sb3I9YmNvbDsKLSB9Ci19Ci0KLS8vIG5ldyBwYWdlIHRvIGxvYWQgaW4gZnJhbWUKLWZ1bmN0aW9uIGNoYW5nZWZyYW1lKHVybCkgewotdG9wLmNoZWNraW5ib3R0b20ubG9jYXRpb24uaHJlZj0gdXJsIAotfQotCi0vLyBjaGVja2VkIGFsbCBjaGVja2JveGVzCi1mdW5jdGlvbiBjaGVja0FsbChmaWVsZCkgewotICAgICBpZiAoIWNoZWNrZWQpIHsgLy8gaWYgY2hlY2tib3hlcyBhcmUgbm90IGNoZWNrZWQgdGhlbiBjaGVjayB0aGVtCi0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpZWxkLmxlbmd0aDsgaSsrKSB7IC8vIGxvb3AgdGhyb3VnaCB0aGUgYXJyYXkgb2YgY2hlY2tib3hlcyAmIGNoZWNrIHRoZW0KLSAgICAgICAgICAgICAgIGZpZWxkW2ldLmNoZWNrZWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLSAgICAgfQotfSAKLQotZnVuY3Rpb24gY2hlY2tlZEluKGlkKSB7Ci0gIGlmIChkb2N1bWVudC5hbGwpIHsKLSAgICByZXR1cm4gZG9jdW1lbnQuYWxsW2lkXS5zdHlsZTsKLSAgfSBlbHNlIGlmKGRvY3VtZW50LmxheWVycykgewotICAgIHJldHVybiBkb2N1bWVudC5sYXllcnNbaWRdOwotICB9Ci19Ci0KLS8vIEZvciBJRSBPbmx5OiB0byBlbmFibGUgbGlua2luZyBiZWZvcmUgcG9wLXVwcyBkaXNzYXBwZWFyIHdoZW4gY2xpY2tlZC4KLWZ1bmN0aW9uIGRpc2FibGVjYXB0dXJlKCkgewotZG9jdW1lbnQub25tb3VzZWRvd24gPSBudWxsOwotfQotCi0KLS8vIGhpZGUgbGF5ZXJzIHdoZW4gY2xpY2tlZAotZnVuY3Rpb24gZG9BY2Nlc3NLZXlzKGV2KSB7Ci0JaWYoZ2xvYmFsTGF5ZXIgIT0gIiIpIHsKLQkJaWYoZG9jdW1lbnQubGF5ZXJzKSB7IGRvY3VtZW50LmxheWVyc1tnbG9iYWxMYXllcl0udmlzaWJpbGl0eSA9ICJoaWRkZW4iOyB9CQotCQllbHNlIHsgZG9jdW1lbnQuYWxsW2dsb2JhbExheWVyXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7IH0KLQl9Ci19Ci0KLQotCi0vL2FsbG93cyB0d28gYm90dG9tIGZyYW1lcyB0byBsaW5rIHRvIG5ldyBwYWdlcyBhdCB0aGUgc2FtZSB0aW1lCi1mdW5jdGlvbiBmcmFtZWRpcmVjdCgpIHsKLXBhZ2UgPSBkb2N1bWVudC5mb3JtVG9wZnJhbWUubmV3TG9jYXRpb24ub3B0aW9uc1tkb2N1bWVudC5mb3JtVG9wZnJhbWUubmV3TG9jYXRpb24uc2VsZWN0ZWRJbmRleF0udmFsdWU7Ci10ZW1wSW5kZXggPSBwYWdlLmluZGV4T2YoJz8nKTsKLWZpcnN0VVJMID0gcGFnZS5zdWJzdHJpbmcoMCx0ZW1wSW5kZXgpOwotc2Vjb25kVVJMID0gcGFnZS5zdWJzdHJpbmcodGVtcEluZGV4ICsgMSxwYWdlLmxlbmd0aCk7Ci0KLXRvcC50cmVlRnJhbWUubG9jYXRpb24uaHJlZiA9IGZpcnN0VVJMOwotdG9wLnZpZXdGcmFtZS5sb2NhdGlvbi5ocmVmID0gc2Vjb25kVVJMOwotfQotCi0KLWZ1bmN0aW9uIE1NX3JlbG9hZFBhZ2UoaW5pdCkgeyAgLy9yZWxvYWRzIHRoZSB3aW5kb3cgaWYgTmF2NCByZXNpemVkCi0gIGlmIChpbml0PT10cnVlKSB3aXRoIChuYXZpZ2F0b3IpIHtpZiAoKGFwcE5hbWU9PSJOZXRzY2FwZSIpJiYocGFyc2VJbnQoYXBwVmVyc2lvbik9PTQpKSB7Ci0gICAgZG9jdW1lbnQuTU1fcGdXPWlubmVyV2lkdGg7IGRvY3VtZW50Lk1NX3BnSD1pbm5lckhlaWdodDsgb25yZXNpemU9TU1fcmVsb2FkUGFnZTsgfX0KLSAgZWxzZSBpZiAoaW5uZXJXaWR0aCE9ZG9jdW1lbnQuTU1fcGdXIHx8IGlubmVySGVpZ2h0IT1kb2N1bWVudC5NTV9wZ0gpIGxvY2F0aW9uLnJlbG9hZCgpOwotfQotTU1fcmVsb2FkUGFnZSh0cnVlKTsKLQotCi1mdW5jdGlvbiBNTV9maW5kT2JqKG4sIGQpIHsgLy92NC4wMQotICB2YXIgcCxpLHg7ICBpZighZCkgZD1kb2N1bWVudDsgaWYoKHA9bi5pbmRleE9mKCI/IikpPjAmJnBhcmVudC5mcmFtZXMubGVuZ3RoKSB7Ci0gICAgZD1wYXJlbnQuZnJhbWVzW24uc3Vic3RyaW5nKHArMSldLmRvY3VtZW50OyBuPW4uc3Vic3RyaW5nKDAscCk7fQotICBpZighKHg9ZFtuXSkmJmQuYWxsKSB4PWQuYWxsW25dOyBmb3IgKGk9MDsheCYmaTxkLmZvcm1zLmxlbmd0aDtpKyspIHg9ZC5mb3Jtc1tpXVtuXTsKLSAgZm9yKGk9MDsheCYmZC5sYXllcnMmJmk8ZC5sYXllcnMubGVuZ3RoO2krKykgeD1NTV9maW5kT2JqKG4sZC5sYXllcnNbaV0uZG9jdW1lbnQpOwotICBpZigheCAmJiBkLmdldEVsZW1lbnRCeUlkKSB4PWQuZ2V0RWxlbWVudEJ5SWQobik7IHJldHVybiB4OwotfQotCi1mdW5jdGlvbiBNTV9nb1RvVVJMKCkgeyAvL3YzLjAKLSAgdmFyIGksIGFyZ3M9TU1fZ29Ub1VSTC5hcmd1bWVudHM7IGRvY3VtZW50Lk1NX3JldHVyblZhbHVlID0gZmFsc2U7Ci0gIGZvciAoaT0wOyBpPChhcmdzLmxlbmd0aC0xKTsgaSs9MikgZXZhbChhcmdzW2ldKyIubG9jYXRpb249JyIrYXJnc1tpKzFdKyInIik7Ci19Ci0KLQotZnVuY3Rpb24gTU1fcHJlbG9hZEltYWdlcygpIHsgLy92My4wCi0gIHZhciBkPWRvY3VtZW50OyBpZihkLmltYWdlcyl7IGlmKCFkLk1NX3ApIGQuTU1fcD1uZXcgQXJyYXkoKTsKLSAgICB2YXIgaSxqPWQuTU1fcC5sZW5ndGgsYT1NTV9wcmVsb2FkSW1hZ2VzLmFyZ3VtZW50czsgZm9yKGk9MDsgaTxhLmxlbmd0aDsgaSsrKQotICAgIGlmIChhW2ldLmluZGV4T2YoIiMiKSE9MCl7IGQuTU1fcFtqXT1uZXcgSW1hZ2U7IGQuTU1fcFtqKytdLnNyYz1hW2ldO319Ci19Ci0KLQotZnVuY3Rpb24gTU1fc3dhcEltYWdlKCkgeyAvL3YzLjAKLSAgdmFyIGksaj0wLHgsYT1NTV9zd2FwSW1hZ2UuYXJndW1lbnRzOyBkb2N1bWVudC5NTV9zcj1uZXcgQXJyYXk7IGZvcihpPTA7aTwoYS5sZW5ndGgtMik7aSs9MykKLSAgIGlmICgoeD1NTV9maW5kT2JqKGFbaV0pKSE9bnVsbCl7ZG9jdW1lbnQuTU1fc3JbaisrXT14OyBpZigheC5vU3JjKSB4Lm9TcmM9eC5zcmM7IHguc3JjPWFbaSsyXTt9Ci19Ci0KLQotZnVuY3Rpb24gTU1fb3BlbkJyV2luZG93KHRoZVVSTCx3aW5OYW1lLGZlYXR1cmVzKSB7IC8vdjIuMAotICB3aW5kb3cub3Blbih0aGVVUkwsd2luTmFtZSxmZWF0dXJlcyk7Ci19Ci0KLQotCi1mdW5jdGlvbiBNTV9zaG93SGlkZUxheWVycygpIHsgLy92My4wCi0gIHZhciBpLHAsdixvYmosYXJncz1NTV9zaG93SGlkZUxheWVycy5hcmd1bWVudHM7Ci0gIGZvciAoaT0wOyBpPChhcmdzLmxlbmd0aC0yKTsgaSs9MykgaWYgKChvYmo9TU1fZmluZE9iaihhcmdzW2ldKSkhPW51bGwpIHsgdj1hcmdzW2krMl07Ci0gICAgaWYgKG9iai5zdHlsZSkgeyBvYmo9b2JqLnN0eWxlOyB2PSh2PT0nc2hvdycpPyd2aXNpYmxlJzoodj0naGlkZScpPydoaWRkZW4nOnY7IH0KLSAgICBvYmoudmlzaWJpbGl0eT12OyB9Ci19Ci0KLQotZnVuY3Rpb24gbXNjaGFuZ2VmcmFtZSh1cmwpIHsKLXRvcC5jb250ZW50RnJhbWUubG9jYXRpb24uaHJlZj0gdXJsIAotfQotCi0vL2NoYW5nZXMgbWlkZGxlIG5hdiBhbmQgY29udGVudCBmcmFtZSwgY3VycmVudGx5IHVzZWQgaW4gbXVsdGlzaXRlCi1mdW5jdGlvbiBNU2ZyYW1lQ2hhbmdlKCkgewotcGFnZSA9IGRvY3VtZW50LmZvcm1CYW5uZXJGcmFtZS5uZXdMb2NhdGlvbi5vcHRpb25zW2RvY3VtZW50LmZvcm1CYW5uZXJGcmFtZS5uZXdMb2NhdGlvbi5zZWxlY3RlZEluZGV4XS52YWx1ZTsKLXRlbXBJbmRleCA9IHBhZ2UuaW5kZXhPZignPycpOwotZmlyc3RVUkwgPSBwYWdlLnN1YnN0cmluZygwLHRlbXBJbmRleCk7Ci1zZWNvbmRVUkwgPSBwYWdlLnN1YnN0cmluZyh0ZW1wSW5kZXggKyAxLHBhZ2UubGVuZ3RoKTsKLQotdG9wLm1pZGRsZU5hdi5sb2NhdGlvbi5ocmVmID0gZmlyc3RVUkw7Ci10b3AuY29udGVudEZyYW1lLmxvY2F0aW9uLmhyZWYgPSBzZWNvbmRVUkw7Ci19Ci0KLQotCi0vL29wZW5zIHVwIGEgZHluYW1pYyB3aW5kb3cKLWZ1bmN0aW9uIG9wZW5faGVscChoZWxwZmlsZSkgewotICAgIHZhciB3aW5sZWZ0LCB3aW50b3A7Ci0gICAgdmFyIGhlbHBsZWZ0LCBoZWxwdG9wOwotICAgIHZhciBoZWxwd2lkdGgsIGhlbHBoZWlnaHQ7Ci0gICAgaWYgKGRvY3VtZW50LmxheWVycykgewotICAgICAgICB3aW5sZWZ0ID0gdG9wLnNjcmVlblg7Ci0gICAgICAgIHdpbnRvcCA9IHRvcC5zY3JlZW5ZOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgd2lubGVmdCA9IHRvcC5zY3JlZW5MZWZ0OwotICAgICAgICB3aW50b3AgPSB0b3Auc2NyZWVuVG9wOwotICAgIH0KLSAgICBoZWxwd2lkdGggPSBNYXRoLm1pbihzY3JlZW4uYXZhaWxXaWR0aCk7Ci0gICAgaGVscGhlaWdodCA9IE1hdGgubWluKHNjcmVlbi5hdmFpbEhlaWdodCk7Ci0gCWhlbHB3aWR0aD1oZWxwd2lkdGggKi42OwotCWhlbHBoZWlnaHQ9aGVscGhlaWdodCAqLjg1OwkKLQloZWxwdG9wID0gMDsKLSAgICBpZiAod2lubGVmdCA+IDIwKQotICAgICAgICBoZWxwbGVmdCA9IDA7Ci0gICAgZWxzZQotICAgICAgICBoZWxwbGVmdCA9IHNjcmVlbi53aWR0aCAtIGhlbHB3aWR0aCAtIDEwOwotICAgIHRvcC5vcGVuKGhlbHBmaWxlLCAnY2N3ZWJfaGVscCcsCi0gICAgICAgICAgICAgJ2xlZnQ9JytoZWxwbGVmdCsnLHRvcD0nK2hlbHB0b3ArJyx3aWR0aD0nK2hlbHB3aWR0aCsnLGhlaWdodD0nK2hlbHBoZWlnaHQrJyxyZXNpemFibGU9MSxzY3JvbGxiYXJzPTEnKTsKLX0KLQotCi0KLS8vIHJlZ3VsYXIgcG9wdXAgdXAgbGF5ZXIgYWNjb3JkaW5nIHRvIGV2ZW50Ci1mdW5jdGlvbiBwb3BMZWZ0TWVudShldnQsY3VyckVsZW0sdXBDaGspewotCS8vIGNoZWNrcyB0byBzZWUgaWYgdGhpcyBpcyBhIERIVE1MIGJyb3dzZXIgCi0JLy8gYW5kIHRoYXQgY3VyckVsZW0gaXMgbm90IHNldCB0byAwIGluIHdoaWNoIGNhc2UgCi0JLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBIUkVGIGFuZCBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBldmVudAotCS8vdXBDaGsgc2hvdWxkIGJlIHNldCB0byAxIGZvciBOUyA0IGZvcm0gZml4IGlmIHlvdSB3YW50IHRoZSBwb3Bkb3duIHRvIHBvcCB1cCBpbnN0ZWFkLCBzbyB0aGF0IGl0IGRvZXNuJ3QgYXBwZWFyIG92ZXIgZm9ybXMuCQotCWdsb2JhbExheWVyID0gY3VyckVsZW07Ci0JCi0JaWYgKChpc05TNCAmJiBjdXJyRWxlbSAhPSAwKSB8fCAoaXNJRTQgJiYgY3VyckVsZW0gIT0gMCkpewotCQlkb20gPSBldmFsKGRvY09iaiArICAnLicgKyBjdXJyRWxlbSArIHN0eWxlT2JqKTsKLQkJc3RhdGUgPSBkb20udmlzaWJpbGl0eTsKLQkJaWYgKHN0YXRlID09ICJ2aXNpYmxlIiB8fCBzdGF0ZSA9PSAic2hvdyIpCi0JCQl7ZG9tLnZpc2liaWxpdHkgPSAiaGlkZGVuIjt9Ci0JCQllbHNlIAotCQkJLy8gZmluZHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSAKLQkJCS8vIGFuZCB0aGVuIG9mZnNldHMgdGhlIGNvb3JkaW5hdGVzIHNsaWdodGx5Ci0JCQkJewotCQlpZiAoaXNOUzQpewotCQkJCSBpZiAoKHVwQ2hrID09IDEpICYmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDY3MCkpIHsKLQkJCXRvcFZhbCA9IGV2YWwoZXZ0LnBhZ2VZIC0gNTApOwotCQkJbGVmdFZhbCA9IGV2YWwoZXZ0LnBhZ2VYIC0gOSk7Ci0JCQl9CQkJCSAgCi0JCQkJZWxzZSB7Ci0JCQkJdG9wVmFsID0gZXZhbChldnQucGFnZVkgLSAwKTsKLQkJCQlsZWZ0VmFsID0gZXZhbChldnQucGFnZVggLSAwKTsKLQkJCQl9Ci0JCX0JCQotCQkJZWxzZSBpZiAoaXNJRTQpIHsKLQkJCQl7Ci0JCQkJdG9wVmFsID0gZXZhbChldmVudC55K2RvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIC0gMCk7Ci0JCQkJbGVmdFZhbCA9IGV2YWwoZXZlbnQueCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgLSAwKTsKLQkJCQkvL2JvdHRvbVZhbCA9IGV2YWwoZXZlbnQueStkb2N1bWVudC5ib2R5LnNjcm9sbEJvdHRvbSArIDIpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkvLyBrZWVwcyB0aGUgZWxlbWVudCBmcm9tIGdvaW5nIG9mZiBzY3JlZW4gdG8gdGhlIGxlZnQKLQkJCWlmKGxlZnRWYWwgPCAyKSB7bGVmdFZhbCA9IDI7fQotCQkJaWYodG9wVmFsIDwgMikge3RvcFZhbCA9IC01O30JCQkJCi0JCQlkb20udG9wID0gdG9wVmFsOwotCQkJZG9tLmxlZnQgPSBsZWZ0VmFsOwotCQkJZG9tLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CQkJCQkKLQkJCQl9Ci0JfSAKLQotfQotCi0KLQotLy8gc3BlY2lhbCBwdXB1cCBsYXllciB0byBrZWVwIGl0IGZyb20gZ29pbmcgb2ZmIHRoZSBwYWdlCi0KLWZ1bmN0aW9uIHBvcExlZnRNZW51U3BlY2lhbChldnQsY3VyckVsZW0pewotCS8vIGNoZWNrcyB0byBzZWUgaWYgdGhpcyBpcyBhIERIVE1MIGJyb3dzZXIgCi0JLy8gYW5kIHRoYXQgY3VyckVsZW0gaXMgbm90IHNldCB0byAwIGluIHdoaWNoIGNhc2UgCi0JLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBIUkVGIGFuZCBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBldmVudAotCS8vdXBDaGsgc2hvdWxkIGJlIHNldCB0byAxIGZvciBOUyA0IGZvcm0gZml4IGlmIHlvdSB3YW50IHRoZSBwb3Bkb3duIHRvIHBvcCB1cCBpbnN0ZWFkLCBzbyB0aGF0IGl0IGRvZXNuJ3QgYXBwZWFyIG92ZXIgZm9ybXMuCQotCWdsb2JhbExheWVyID0gY3VyckVsZW07Ci0JCi0JaWYgKChpc05TNCAmJiBjdXJyRWxlbSAhPSAwKSB8fCAoaXNJRTQgJiYgY3VyckVsZW0gIT0gMCkpewotCQlkb20gPSBldmFsKGRvY09iaiArICAnLicgKyBjdXJyRWxlbSArIHN0eWxlT2JqKTsKLQkJc3RhdGUgPSBkb20udmlzaWJpbGl0eTsKLQkJaWYgKHN0YXRlID09ICJ2aXNpYmxlIiB8fCBzdGF0ZSA9PSAic2hvdyIpCi0JCQl7ZG9tLnZpc2liaWxpdHkgPSAiaGlkZGVuIjt9Ci0JCQllbHNlIAotCQkJLy8gZmluZHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSAKLQkJCS8vIGFuZCB0aGVuIG9mZnNldHMgdGhlIGNvb3JkaW5hdGVzIHNsaWdodGx5Ci0JCQkJewotCQlpZiAoaXNOUzQpewotCQkJIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDYwMCkgewotCQkJdG9wVmFsID0gZXZhbChldnQucGFnZVkgLSAwKTsKLQkJCWxlZnRWYWwgPSBldmFsKGV2dC5wYWdlWCAtIDExMCk7Ci0JCQl9CQkKLQkJCQkKLQkJCQllbHNlIHsKLQkJCQl0b3BWYWwgPSBldmFsKGV2dC5wYWdlWSAtIDApOwotCQkJCWxlZnRWYWwgPSBldmFsKGV2dC5wYWdlWCAtIDApOwotCQkJCX0KLQkJfQkJCi0JCQllbHNlIGlmIChpc0lFNCkgewotCQkJCWlmIChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgNjAwKSB7Ci0JCQkJICB0b3BWYWwgPSBldmFsKGV2ZW50LnkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgLSAwKTsKLQkJCQlsZWZ0VmFsID0gZXZhbChldmVudC54K2RvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCAtIDExMCk7Ci0JCQkJfQotCQkJCQotCQkJCWVsc2V7Ci0JCQkJdG9wVmFsID0gZXZhbChldmVudC55K2RvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIC0gMCk7Ci0JCQkJbGVmdFZhbCA9IGV2YWwoZXZlbnQueCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgLSAwKTsKLQkJCQkvL2JvdHRvbVZhbCA9IGV2YWwoZXZlbnQueStkb2N1bWVudC5ib2R5LnNjcm9sbEJvdHRvbSArIDIpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkvLyBrZWVwcyB0aGUgZWxlbWVudCBmcm9tIGdvaW5nIG9mZiBzY3JlZW4gdG8gdGhlIGxlZnQKLQkJCWlmKGxlZnRWYWwgPCAyKSB7bGVmdFZhbCA9IDI7fQotCQkJaWYodG9wVmFsIDwgMikge3RvcFZhbCA9IC01O30JCQkJCi0JCQlkb20udG9wID0gdG9wVmFsOwotCQkJZG9tLmxlZnQgPSBsZWZ0VmFsOwotCQkJZG9tLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CQkJCQkKLQkJCQl9Ci0JfSAKLQkJCi19Ci0KLQotCi0KLWZ1bmN0aW9uIHNlYXJjaE9wdGlvbnMobmV3TG9jKSB7IC8vT3BlbnMgbmV3IHBhZ2UgaW4gdGhlIHJpZ2h0IGZyYW1lIGRlcGVuZGluZyBvbiB0aGUgIkFkdmFuY2VkIFNlYXJjaCBmb3I6IiBzZWxlY3Rpb24KLQkJCW5ld1BhZ2UgPSBuZXdMb2Mub3B0aW9uc1tuZXdMb2Muc2VsZWN0ZWRJbmRleF0udmFsdWUKLQkKLQkJCWlmIChuZXdQYWdlICE9ICIiKSB7Ci0JCQkJcGFyZW50LnZpZXdGcmFtZS5sb2NhdGlvbi5ocmVmID0gbmV3UGFnZQotCQkJfQotCQl9Ci0KLQotLy91bmNoZWNrIGNoZWNrYm94ZXMKLWZ1bmN0aW9uIHVuY2hlY2tBbGwoZmllbGQpIHsKLSAgICAgaWYgKGNoZWNrZWQpIHsgLy8gaWYgY2hlY2tib3hlcyBhcmUgY2hlY2tlZCB0aGVuIGNoZWNrIHRoZW0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGQubGVuZ3RoOyBpKyspIHsgLy8gbG9vcCB0aHJvdWdoIHRoZSBhcnJheSBvZiBjaGVja2JveGVzICYgdW5jaGVjayB0aGVtCi0gICAgICAgICAgICAgICBmaWVsZFtpXS5jaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoZWNrZWQgPSBmYWxzZTsKLSAgICAgfQotfSAKLQotLy8gc2hvdyBoaWRlIGxheWVycyBmb3IgQ1EgZGVmbGVjdF9sb2dpbl9lcnIKLW5zNCA9IChkb2N1bWVudC5sYXllcnMpPyB0cnVlOmZhbHNlCi1pZTQgPSAoZG9jdW1lbnQuYWxsKT8gdHJ1ZTpmYWxzZQotCi1mdW5jdGlvbiBzaG93KGlkKSB7Ci1pZiAobnM0KSBkb2N1bWVudC5sYXllcnNbaWRdLnZpc2liaWxpdHkgPSAic2hvdyIKLWlmIChpZTQpIGRvY3VtZW50LmFsbFtpZF0uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIgotfQotCi1mdW5jdGlvbiBoaWRlKGlkKSB7Ci1pZiAobnM0KSBkb2N1bWVudC5sYXllcnNbaWRdLnZpc2liaWxpdHkgPSAiaGlkZSIKLWlmIChpZTQpIGRvY3VtZW50LmFsbFtpZF0uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iCi19Ci0KLS8vIHBvcCB1cCB3aW5kb3cgYWNjb3JkaW5nIHRvIG1vdXNlIGV2ZW50Ci1mdW5jdGlvbiBzaG93V2luZG93KGUsdXJsKSB7Ci0gICAgdmFyIHg9eT0wOwotCQotCWlmIChlICE9ICcnKSB7Ci0gICAgICAgIHggPSBlLnNjcmVlblg7Ci0gICAgICAgIHkgPSBlLnNjcmVlblk7Ci0gICAgfQotCi0gICAgbXlXaW5kb3c9d2luZG93Lm9wZW4odXJsLCd3aW5kb3dOYW1lJywnd2lkdGg9MjAwLGhlaWdodD0xNTAsc2NyZWVuWD0nICsgeCArICcsc2NyZWVuWT0nICsgeSArICcsbGVmdD0nICsgeCArICcsdG9wPScgKyB5KTsKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0cy5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9zY3JpcHRzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZlZDM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9zY3JpcHRzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12YXIgYz0nLmNzcyIgLz4nOwotdmFyIGw9JzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9XCIuL3N0eWxlc2hlZXRzLyc7Ci0KLS8vU25pZmZlciB2YXJpYWJsZXMgYmVnaW5zCi0vL2NvbnZlcnRpbmcgdG8gbG93ZXJjYXNlCi12YXIgc25uID0gbmF2aWdhdG9yOwotdmFyIHNucGwgPSBzbm4ucGxhdGZvcm0udG9Mb3dlckNhc2UoKTsgLy8gbm90IHN1cHBvcnRlZCBpbiBOUzMuMAotdmFyIHNudWEgPSAnICcgKyBzbm4udXNlckFnZW50LnRvTG93ZXJDYXNlKCk7Ci12YXIgc251biA9IHNubi5hcHBOYW1lLnRvTG93ZXJDYXNlKCk7Ci0KLS8vIHBsYXRmb3JtCi12YXIgc252cGxfbWFjID0gc251YS5pbmRleE9mKCdtYWMnKSA+IDA7Ci12YXIgc252cGxfdW5peCA9IHNudWEuaW5kZXhPZigieDExIikgPiAwOwotdmFyIHNudnBsX3dpbiA9IHNudWEuaW5kZXhPZignd2luJykgPiAwOwotCi0vLyBicm93c2VyIHZlcnNpb24KLXZhciBzbnZ2X2llID0gc251YS5pbmRleE9mKCdtc2llJykgPiAwOwotdmFyIHNudnZfbm4gPSBzbnVhLmluZGV4T2YoJ21vemlsbGEnKSA+IDA7Ci12YXIgc252dmVyc2lvbiA9IHNubi5hcHBWZXJzaW9uOwotCi0KLS8vICdjb21wYXRpYmxlJyB2ZXJzaW9ucyBvZiAibW96aWxsYSIgYXJlbid0IG5hdmlnYXRvcgotaWYoc251YS5pbmRleE9mKCdjb21wYXRpYmxlJykgPiAwKSB7Ci0Jc25udnZfbm4gPSBmYWxzZTsKLX0KLS8vRW5kcyBzbmlmZmVyIHZhcmlhYmxlcyAKLQkKLQkJCi0vKiBUaGlzIGlzIGEgYmFzaWMgc25pZmZlciAqLwotICAKLWlmKHNudnBsX3dpbikvL3dpbmRvd3MKLQoteyAgCi0gIGlmKHNudnZfaWUpICAgIAotICB7Ci0gICAgaWYgKHNudWEuaW5kZXhPZignaWUgNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNicpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotCSAgfQotICB9Ci0gIGVsc2UgaWYgKHNudnZfbm4pIAotICB7Ci0gIAotICBpZiAoc251YS5pbmRleE9mKCIvNCIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzUiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi82IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotCSAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgfQotfQotZWxzZSBpZihzbnZwbF91bml4KS8vdW5peAotICB7ICAKLSAgaWYoc252dl9pZSkgICAgCi0gIHsKLSAgICBpZiAoc251YS5pbmRleE9mKCdpZSA1JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLQkgIH0KLSAgfQotCi0gIGVsc2UgaWYgKHNudnZfbm4pIAotICB7Ci0gIGlmIChzbnVhLmluZGV4T2YoIi80IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNSIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzYiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZQotCSAgewotCSAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLQkgIH0KLSAgfSAKLSAgZWxzZQotICB7Ci0gIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIH0KLX0KLQotZWxzZSBpZihzbnZwbF9tYWMpLy9tYWMKLSAgeyAgCi0gIGlmKHNudnZfaWUpICAgIAotICB7Ci0gICAgaWYgKHNudWEuaW5kZXhPZignaWUgNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNicpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotCSAgfQotICB9Ci0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgaWYgKHNudWEuaW5kZXhPZigiLzQiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi82IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotCSAgfQotICB9IAotICBlbHNlCi0gIHsKLSBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICB9Ci19Ci0KLWVsc2UvL290aGVycyAKLXsKLSAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLQotfQotCi0vL1NOSUZGRVIgRU5EUyBIRVJFCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0c191bml4RnJhbWUuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0c191bml4RnJhbWUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDA3NjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3NjcmlwdHNfdW5peEZyYW1lLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlmKHNubnZ2X25uICYmIHNudnBsX3VuaXgpIHsJICB3aW5kb3cubG9jYXRpb24gPSAidW5peF9mcmFtZXMuaHRtbCIJfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdi5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXYuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTMyYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdi5qcworKysgL2Rldi9udWxsCkBAIC0xLDgwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZAotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cwotCi12YXIgdG9wbmF2X2pzX01FU1NBR0UxID0gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAiVGhlcmUgaXMgbm8gJ3swfScgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zLiI7Ci12YXIgdG9wbmF2X2pzX01FU1NBR0UzID0gIlRoZXJlIGlzIG5vIHswfSBwYWdlISI7Ci12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICJwcmV2aW91cyI7Ci12YXIgdG9wbmF2X2pzX01FU1NBR0VfbmV4dCA9ICJuZXh0IjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRV91cCA9ICJ1cCI7Ci12YXIgdG9wbmF2X2pzX01FU1NBR0U0ID0gIlRoZSBjdXJyZW50IGZpbGUgaXMgbm90IGluIHRoZSB0cmVlIGJyb3dzZXIuIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAiVGhlIHB1Ymxpc2hlZCBzaXRlIGlzIGFscmVhZHkgZGlzcGxheWVkIHVzaW5nIGZyYW1lcyI7Ci0KLWZ1bmN0aW9uIGZvcm1hdFN0cmluZyhtZXNzYWdlLCByZXBsYWNlMCkKLXsKLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsKLX0gCi0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwKLS8vIHRoaXMgaXMgTk9UIGZvciBnZW5lcmFsIHVzZQotTVNGUGhvdmVyID0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fAotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOwotCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykKLSAgewotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsKLSAgICAgYS5zcmM9aW1nOwotICAgICByZXR1cm4gYTsKLSAgfQotICAKLXZhciB0b3VyID0gMDsKLQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQKLXsKLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpCi0gICAgewotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7Ci0gICAgICB0b3VyLmZvY3VzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0b3VyLmZvY3VzKCk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBvcGVuVG91ciAoKQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQKLXsKLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpCi0gICAgewotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7Ci0gICAgICB0b3VyLmZvY3VzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0b3VyLmZvY3VzKCk7Ci0gICAgfQotfQotCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwCi0gZnVuY3Rpb24gZGlzcGxheUdldHRpbmdTdGFydGVkKCkKLSB7Ci0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87Ci0gCXZhciBtYWluUGFnZSA9IHdpbmRvdy5wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsKLQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7Ci0gICAgCWlmIChnZXRDb29raWUoIlJVUCIpICE9ICJjaGVja2VkIikgeyBvcGVuRmlyc3RUb3VyKCk7IH0KLQl9Ci0JZWxzZSB7Ci0JCXNldFRpbWVvdXQoICJkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKSIsIDEwMDAgKTsKLQl9Ci19Ci0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkKLXsKLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7Ci0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7Ci0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7Ci0gIHZhciBjYmVnaW4gPSAwOwotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikKLSAgewotICAgIHZhciB2YmVnaW4gPSBjYmVnaW4gKyBjbmFtZS5sZW5ndGg7Ci0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkKLSAgICB7Ci0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOwotICAgICAgaWYgKHZlbmQgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHZlbmQgPSBjbGVuOwotICAgICAgfQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOwotICAgIH0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsKLSAgICBpZiAoY2JlZ2luID09IDApCi0gICAgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxsOwotIH0KLQotCi0gIHZhciBpbmRleD1udWxsOwotICB2YXIgdG91cj1udWxsOwotICB2YXIgc2VhcmNoPW51bGw7Ci0gIHZhciBnbG9zc2FyeT1udWxsOwotICB2YXIgZmVlZGJhY2s9bnVsbDsKLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7Ci0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpCi0gIHsKLSAgICBpZih0cmVlTG9hZGVkKQotICAgIHsKLSAgICAgIHJldHVybiB0cmVlTG9hZGVkOwotICAgIH0KLQotICAgIC8qCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpCi0gICAgIHsKLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsKLSAgICAgfQotICAgICAqLwotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkKLSAgICAgewotICAgICAgCXZhciBtZXRob2QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHk7Ci0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsKLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpCi0JCXsKLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsKLQkJfQotCi0JICB9Ci0KLSAgICAgfQotCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOwotICAgfQotCi0KLSAgICBmdW5jdGlvbiBzaG93QWxlcnROb3RMb2FkZWQoKQotICAgIHsKLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7Ci0gICAgfQotCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkKLSAgewotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7Ci0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQotICB7Ci0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpCi0gICAgIHsKLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7Ci0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zIik7Ci0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7Ci0gICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkKLSAgewotCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICB2YXIgbXNnOwotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpCi0gICAgIHsKLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsKLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7Ci0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOwotICAgICB9Ci0KLSAgICAgcmV0dXJuIG1zZzsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dQYXJlbnRMYWJlbCgpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQotICAgICB7Ci0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7Ci0gICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpCi0gIHsKLSAgICBzZWxmLnN0YXR1cyA9ICJIb21lIjsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dQcmV2aW91c0xhYmVsKCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQotICAgICB7Ci0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOwotICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICAgdmFyIG5leHR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm90TG9hZGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQotICAgICB7Ci0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpCi0JewotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotCX0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpCi0JewotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsKLQl9Ci0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQotCXsKLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiUHJldmlvdXMiKTsKLQl9Ci0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfcHJldik7Ci0gICAgIH0KLSAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOwotICAgIH0KLSAgICAgcmV0dXJuOwotICB9Ci0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkKLSAgICAgewotCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQotCXsKLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLQl9Ci0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQotCXsKLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7Ci0JfQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkKLQl7Ci0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsKLQl9Ci0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOwotCi0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9uZXh0KTsKLSAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotCi0gICAgIHJldHVybjsKLSAgfQotCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkKLSAgICAgewotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7Ci0gICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0KLSAgICAgcmV0dXJuOwotICB9Ci0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAJaWYoIHN0YXR1cyA9PSBmYWxzZSApCi0JewotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotICBmdW5jdGlvbiB1cEFycm93KCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7Ci0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpCi0gICAgICB7Ci0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOwotICAgIH0KLSAgICAgcmV0dXJuOwotICB9Ci0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5kb3duQXJyb3coKTsKLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkKLSAgICAgIHsKLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0gICAgIHJldHVybjsKLSAgfQotCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmxlZnRBcnJvdygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotICAgIGZ1bmN0aW9uIHJpZ2h0QXJyb3coKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotCi1mdW5jdGlvbiBsb2FkVG9wKCkKLXsKLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpCi0gIHsKLSAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0U1KTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7Ci0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsKLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7Ci0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsKLQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQotICAgIHsKLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkKLSAgICAgICB7Ci0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkKLSAgICB7Ci0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQotCXsKLQkJd2luZG93LmNsb3NlKCk7Ci0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsKLQl9Ci0gICAgfQotICAgfQotfQotCi0KLWZ1bmN0aW9uIG9wZW5PcnkgKHBhZ2UsIHRhcmdldCkKLXsKLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQotICAgIHsKLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4LmZvY3VzKCk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBvcGVuU2VhcmNoKCkKLXsKLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpCi0gICAgewotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2VhcmNoLmZvY3VzKCk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBvcGVuUHJvY2Vzc1NlYXJjaCgpCi17Ci0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQotICAgIHsKLSAgICAgIHNlYXJjaCA9IG9wZW4oIi4vc2VhcmNoL3NlYXJjaC5odG1sIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2VhcmNoLmZvY3VzKCk7Ci0gICAgfQotICAgCi19Ci0KLWZ1bmN0aW9uIGdldEJhc2VVcmwoKSB7Ci0KLSAgICAvLyBnZXQgdGhlIHVybCBiYXNlIGZvciB0aGUgc2VhcmNoIHVybAotCXZhciB1cmwgPSBsb2NhdGlvbi5ocmVmOwotCXZhciBpID0gdXJsLmxhc3RJbmRleE9mKCIvIik7Ci0JdXJsID0gdXJsLnN1YnN0cmluZygwLCBpKTsKLQkKLQlyZXR1cm4gdXJsOwotfQotCi1mdW5jdGlvbiBvcGVuSW5kZXgoKQotewotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsKLX0KLQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkKLXsKLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQotICAgIHsKLSAgICAgIGdsb3NzYXJ5ID0gb3BlbigiLi9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSIsImdsb3NzYXJ5X3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zODUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBnbG9zc2FyeS5mb2N1cygpOwotICAgIH0KLX0KLQotZnVuY3Rpb24gcHJpbnRQYWdlKCkKLXsKLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOwotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7Ci19Ci0KLQotZnVuY3Rpb24gc2VuZEZlZWRiYWNrKHVybCkKLXsKLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApCi0JewotCQlyZXR1cm47Ci0JfQotCQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkKLQl7Ci0JCXNlbmRtYWlsKHVybCk7Ci0JfQotCWVsc2UKLQl7Ci0JCQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkKLQkgICAgewotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsKLQkgICAgfQotICAgIAl9Ci0gICAgCQotfQotCi0KLWZ1bmN0aW9uIHNlbmRtYWlsKHVybCkKLXsKLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkKLQl7Ci0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOwotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOwotCX0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7Ci19Ci0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMKLWZ1bmN0aW9uIGNhbGN1bGF0ZVJlbGF0aXZlUGF0aChzb3VyY2VQYXRoLCB0YXJnZXRQYXRoKQotewotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQotCXsKLQkJcmV0dXJuIHRhcmdldFBhdGg7Ci0JfQotCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycKLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOwotCXRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcL2csIi8iKTsKLQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOwotCS8vYWxlcnQoIlJlcGxhY2UodGFyZ2V0KT0+IiArIHRhcmdldFBhdGgpOwotCi0KLQlzb3VyY2VBcnJheSA9IHNvdXJjZVBhdGguc3BsaXQoIi8iKTsKLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsKLQotCXZhciB0aGVSZWxQYXRoID0gIiI7Ci0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UKLQl2YXIgaWR4ID0gMDsKLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykKLQl7Ci0JCWlmIChpZHggPiB0YXJnZXRQYXRoLmxlbmd0aCkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8KLQl2YXIgbWF4SWR4ID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMTsKLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspCi0JewotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArICIuLyI7Ci0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOwotCX0KLQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgKLQl3aGlsZShpZHggPCB0YXJnZXRBcnJheS5sZW5ndGgpCi0JewotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsKLQkJLy9hbGVydCgiUmVsUGF0aChmaW5hbCk9PiIgKyB0aGVSZWxQYXRoKTsKLQl9Ci0KLQkvL3JlbW92ZSB0aGUgbGFzdCBwYXRoIHNlcGFyYXRvcgotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApCi0JewotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOwotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOwotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOwotCX0KLQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsKLQotCXJldHVybiB0aGVSZWxQYXRoOwotfQotCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpCi17Ci0JcmV0dXJuIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpOwotfQotCi0vL1RoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSB3ZWJzaXRlIGJhc2UgZnJvbSB0aGUgdXJsCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsKLQotCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmOwotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7Ci0JY3VyclVSTCA9IGN1cnJVUkwucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsKLQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOwotCXZhciBjdXJyQXJyYXkgPSBjdXJyVVJMLnNwbGl0KCIvIik7Ci0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOwotCXZhciBpZHggPSAwOwotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7Ci0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsKLQkJaWYgKHRoZVJldHVyblBhdGggIT0gIiIpIHsKLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOwotCQl9Ci0JCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgY3VyckFycmF5W2lkeF07Ci0JfQotCi0JLy9hbGVydCgiQXJyYXlUZXN0PT4iICsgY3VyclVSTCArICIsIiArIHRoZVJldHVyblBhdGgpOwotCXJldHVybiB0aGVSZXR1cm5QYXRoOwotfQotCi0vL2J1aWxkcyB0cmVlIHBhdGgKLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpCi17Ci0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOwotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOwotCXZhciB0aGVMb2MgPSAiIjsKLQotCi0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkKLQl7Ci0JCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmOwotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsKLQotCQkvL2FsZXJ0KCJQYXRoTmFtZToiICsgdGhpc1BhZ2UpOwotCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOwotCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsKLQotCQkvL2FsZXJ0KCJUaGUgVHJlZSBQYXRoOiAiICsgdGhlUGF0aCk7Ci0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsKLSAgICAJCWFycmF5RnJvbVN0cmluZyA9IHRoZVBhdGhTdHJpbmcuc3BsaXQodGhlRGVsaW1pdGVyKTsKLQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5Ci0JCS8vcGFyYW0gMSA9IHBhdGggdG8gaWNvbiwgcGFyYW0gMiAtIGxhYmVsLCBwYXJhbSAzIC0gcGF0aCB0byBmaWxlCi0JCXZhciBjb3VudGVyID0gMDsKLQkJdmFyIHRoZUxhYmVsOwotCQl2YXIgdGhlUmVsUGF0aDsKLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQotCQl7Ci0JCSAgIHRoZUxvYyA9ICIiOwotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykKLQkJICAgewotCQkJLy9pdCdzIHRoZSBpY29uIHBhdGgKLQkJCWlmIChjb3VudGVyIDwgMikKLQkJCXsKLQkJCQlpZiAoY291bnRlciA+IDApCi0JCQkJewotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsKLQkJCQl9Ci0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsKLQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQotCQkJCXsKLQkJCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpCi0JCQkJCXsKLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOwotCQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgdGhlUmVsUGF0aCk7Ci0JCQkJCX0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpCi0JCQkJewotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKwotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKwotCQkJCQkJIHRoZVJlbFBhdGggICsKLQkJCQkJCSAiXCI+IjsKLQkJCQl9Ci0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsKLQkJCQljb3VudGVyID0gMjsKLQkJCX0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpCi0JCQl7Ci0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07Ci0JCQkJY291bnRlciA9IDM7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb3VudGVyID09IDMpCi0JCQl7Ci0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDMpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7Ci0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpCi0JCQkJewotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOwotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgewotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsKLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiIHRhcmdldD1cIm9yeV9kb2NcIiBocmVmPVwiIiArCi0JCQkJCQkJIHRoZVJlbFBhdGggKwotCQkJCQkgCQkiXCI+IiArCi0JCQkJCSAJCXRoZUxhYmVsICsKLQkJCQkJIAkJIjxcL2E+XG4iOwotCQkJCQkgfQotCQkJCQkgZWxzZSB7Ci0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsKLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsKLQkJCQkJIAkJdGhlTGFiZWwgKwotCQkJCQkgCQkiPFwvYT5cbiI7Ci0JCQkJCSB9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXRoZUxvYyA9IHRoZUxvYyArCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsKLQkJCQkJIAl0aGVMYWJlbCArCi0JCQkJCSAJIjxcL2E+XG4iOwotCQkJCX0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsKLQkJCQljb3VudGVyID0gMTsKLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOwotCQkJCXRoZUxhYmVsID0gIm51bGwiOwotCQkJfQotCQkgICB9Ci0KLQkJLy9hbGVydCgiRmluaXNoZWQgQnVpbGRpbmcgPT4gIiArIHRoZUxvYyk7Ci0JCX0KLQotCX0KLQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOwotCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7Ci0KLQkvL2RvY3VtZW50LndyaXRlKHRoZUxvYyk7Ci0JcmV0dXJuIHRoZUxvYzsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RyZWVicm93c2VyLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RyZWVicm93c2VyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjI0NmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy90cmVlYnJvd3Nlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTEgPSAiVGhlIGNvbmZpZ3VyYXRpb24gaXMgYWxyZWFkeSBkaXNwbGF5ZWQgdXNpbmcgdmlld3MiOwotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIkRpc3BsYXkgdmlld3MiOwotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UzID0gIkhvbWUiOwotCi1mdW5jdGlvbiBsb2FkVG9wKCkKLXsKLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgKHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiIHx8IHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2NfZnJhbWUiKSApCi0gIHsKLSAgICAgYWxlcnQodHJlZWJyb3dzZXJfanNfTUVTU0FHRTEpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsKLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOwotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsKLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsKLSAgICAJCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyAKLQl2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsgCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgCi0gICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZjsgCi0JfSAKLQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkKLSAgICB7Ci0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQotCXsKLQkJd2luZG93LmNsb3NlKCk7Ci0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQotCX0KLQllbHNlCi0JewotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOwotCX0KLSAgICB9Ci0gICB9Ci19Ci0KLQotICBmdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkKLSAgewotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyAKLSAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYuc3Vic3RyaW5nKDAsbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOwotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7Ci0gICAgcmV0dXJuIG5ld19vcnlfZG9jX2xvYzsgICAgCi0gIH0KLQotTVNGUGhvdmVyID0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fAotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOwotCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykKLSAgewotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsKLSAgICAgYS5zcmM9aW1nOwotICAgICByZXR1cm4gYTsKLSAgfQotCi0gICAgaWYoTVNGUGhvdmVyKQotICAgIHsKLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsKLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOwotICAgIH0KLQotCi0vL25ldyBjb2RlIHRvIGRpc3BsYXkgdGhlIGxvYWQgYnV0dG9uIG9yIG5vdAotdmFyIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2M7Ci1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgewotICAgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvY19mcmFtZTsKLX0KLQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsKLQlkb2N1bWVudC53cml0ZSgiPGEgY2xhc3M9XCJleHBhbmRDb2xsYXBzZUxpbmtcIiBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz10cmVlYnJvd3Nlcl9qc19NRVNTQUdFMjsgcmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZVwiPiA8YnI+IDxpbWcgc3JjPVwiIiArIGJhY2tQYXRoICsgImltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZiIpOwotLy9TVEFSVCBOT04tVFJBTlNMQVRBQkxFCi0JZG9jdW1lbnQud3JpdGUoIlwiICBib3JkZXI9XCIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBhbHQ9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiXCIgbmFtZT1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyArICJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj4iICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiPFwvYT4iKTsKLS8vRU5EIE5PTi1UUkFOU0xBVEFCTEUKLX0KLWVsc2UgewotCWRvY3VtZW50LndyaXRlKCImbmJzcDsiKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9BcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NoZWNrbGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9DaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY2ZDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NoZWNrbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Db25jZXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RlbGl2ZXJhYmxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlMjIyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0Rpc2NpcGxpbmVHcm91cGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWU4MDg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0Rpc2NpcGxpbmVHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Eb21haW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0V4YW1wbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9HdWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvR3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9HdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjVmZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhmNWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdGhlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdGhlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2Q4MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvT3RoZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvT3V0Y29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwM2RhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODA3NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmVwb3J0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JlcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMmM4NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmVwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JldXNhYmxlQXNzZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmV1c2FibGVBc3NldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjI3ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmV1c2FibGVBc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2FkbWFwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvYWRtYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWU5MTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1MjRhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlU2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZVNldEdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZVNldEdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1N1bW1hcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvU3VtbWFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTg4ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvU3VtbWFyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvU3VwcG9ydGluZ01hdGVyaWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UYXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZWZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNWY4MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGVybURlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGVybURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2IzZTc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rlcm1EZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Ub29sTWVudG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rvb2xNZW50b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rvb2xNZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvV2hpdGVwYXBlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9XaGl0ZXBhcGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNDgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9XaGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVhOGNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Xb3JrUHJvZHVjdFR5cGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvV29ya1Byb2R1Y3RUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlY2FjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV3X3RvcGljLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25ld190b3BpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzkyOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV3X3RvcGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25leHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjdmZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9ub19uZXh0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25vX25leHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc4OGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25vX25leHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbm9fcHJldmlvdXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbm9fcHJldmlvdXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA3ODJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25vX3ByZXZpb3VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3ByZXZpb3VzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3ByZXZpb3VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5OTkwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9wcmV2aW91cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9zZWFyY2hyZWNvcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvc2VhcmNocmVjb3JkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzZDgwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9zZWFyY2hyZWNvcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvdGFiX3BlbmNpbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy90YWJfcGVuY2lsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0ODRjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy90YWJfcGVuY2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvc2VhcmNoX3Jlc3VsdC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL3NlYXJjaF9yZXN1bHQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzdmNzRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvc2VhcmNoX3Jlc3VsdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCi0gUmVzdHJpY3RlZCBNYXRlcmlhbHMgb2YgSUJNICAtIE1vZGlmaWNhdGlvbiBpcyBwcm9oaWJpdGVkLgotCi0gKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0KLSBOb3RlIHRvIFUuUy4gR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0czogIFVzZSwgZHVwbGljYXRpb24gb3IKLSBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4YWxhbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuIgotCWV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4YWxhbiI+Ci0JCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHhhbGFuOm9taXQtbWV0YS10YWc9InllcyIgeGFsYW46dXNlLXVybC1lc2NhcGluZz0ibm8iLz4KLQkKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9TZWFyY2hSZXN1bHQiPgotCTx4c2w6dmFyaWFibGUgbmFtZT0iaW5pdFBhZ2VOdW0iIHNlbGVjdD0iQGluaXRQYWdlTnVtIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXhQYWdlTnVtIiBzZWxlY3Q9IkBtYXhQYWdlTnVtIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJuZXh0RW5hYmxlZCIgc2VsZWN0PSJAbmV4dEVuYWJsZWQiLz4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXZFbmFibGVkIiBzZWxlY3Q9IkBwcmV2RW5hYmxlZCIvPgotCTx4c2w6dmFyaWFibGUgbmFtZT0ibmV4dFRleHQiIHNlbGVjdD0iQG5leHRUZXh0Ii8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmV2VGV4dCIgc2VsZWN0PSJAcHJldlRleHQiLz4JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iQGltYWdlUGF0aCIvPgotCTx4c2w6dmFyaWFibGUgbmFtZT0ic2VhcmNoU3RyaW5nIiBzZWxlY3Q9IkBzZWFyY2hTdHJpbmciLz4JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJuZXh0SHJlZiIgc2VsZWN0PSJAbmV4dEhyZWYiLz4JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmV2SHJlZiIgc2VsZWN0PSJAcHJldkhyZWYiLz4JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJpY29uIiBzZWxlY3Q9IkBpY29uIi8+CQotCi0JPGRpdiBjbGFzcz0ic2VhcmNoUmVzdWx0UGFuZSI+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiID4KLQkJCTx0ciBhbGlnbj0idG9wIj4KLQkJCQk8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA9Im5vd3JhcCI+Ci0JCQkJCSg8Yj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGluaXRQYWdlTnVtIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhQYWdlTnVtIi8+PC9iPjx4c2w6dGV4dD4gLyA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdG90YWxIaXRzIi8+KQotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkcHJldkVuYWJsZWQgPSAndHJ1ZSciPgotCQkJCQkJCTxpbWcgb25jbGljaz0iamF2YXNjcmlwdDpnZXRQcmV2TmV4dFBhZ2UoJ3skcHJldkhyZWZ9Jyk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JHByZXZUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1wcmV2aW91cy5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPGltZyBvbmNsaWNrPSIiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JHByZXZUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1ub19wcmV2aW91cy5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJG5leHRFbmFibGVkID0gJ3RydWUnIj4KLQkJCQkJCQk8aW1nIG9uY2xpY2s9ImphdmFzY3JpcHQ6Z2V0UHJldk5leHRQYWdlKCd7JG5leHRIcmVmfScpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRuZXh0VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9bmV4dC5naWYiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8aW1nIG9uY2xpY2s9IiIgb25tb3VzZW92ZXI9InN0eWxlLmN1cnNvcj0ncG9pbnRlcic7IiBhbHQ9InskbmV4dFRleHR9IiBzcmM9InskaW1hZ2VQYXRofW5vX25leHQuZ2lmIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCSYjMTYwOwkmIzE2MDsKLQkJCQk8L3RkPgkJCQotCQkJPC90cj4KLQkJPC90YWJsZT4JCi0JPC9kaXY+PGJyIC8+Ci0JPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlNlYXJjaEhpdCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idXJsIiBzZWxlY3Q9IkB1cmwiLz4KLQkJPGRpdiBjbGFzcz0ic2VhcmNoSGl0Ij4KLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgPgotCQkJCTx0cj4KLQkJCQkJPHRkIGFsaWduPSJyaWdodCI+Ci0JCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iQGljb24gIT0gJyciPgotCQkJCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9e0BpY29ufSIgYWx0PSIiLz4KLQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2VhcmNocmVjb3JkLmdpZiIgYWx0PSIiLz4KLQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQk8L3hzbDpjaG9vc2U+CQkJCQkJCi0JCQkJCTwvdGQ+Ci0JCQkJCTx0ZCBhbGlnbj0ibGVmdCI+Ci0JCQkJCQk8YSBocmVmPSJ7JHVybH0iIHRhcmdldD0ib3J5X2RvYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwvYT4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJCTx0cj4KLQkJCQkJPHRkIGFsaWduPSJyaWdodCI+PC90ZD4KLQkJCQkJPHRkIGFsaWduPSJsZWZ0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN1bW1hcnkiLz48L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDpmb3ItZWFjaD4KLQk8YnIvPgotCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQk8dHIgdmFsaWduPSJtaWRkbGUiPgotCQkJPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPSJub3dyYXAiPgkJCQkKLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRwcmV2RW5hYmxlZCA9ICd0cnVlJyI+Ci0JCQkJCQk8aW1nIG9uY2xpY2s9ImphdmFzY3JpcHQ6Z2V0UHJldk5leHRQYWdlKCd7JHByZXZIcmVmfScpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRwcmV2VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9cHJldmlvdXMuZ2lmIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTxpbWcgb25jbGljaz0iIiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRwcmV2VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9bm9fcHJldmlvdXMuZ2lmIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iJG5leHRFbmFibGVkID0gJ3RydWUnIj4KLQkJCQkJCTxpbWcgb25jbGljaz0iamF2YXNjcmlwdDpnZXRQcmV2TmV4dFBhZ2UoJ3skbmV4dEhyZWZ9Jyk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JG5leHRUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1uZXh0LmdpZiIvPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTxpbWcgb25jbGljaz0iIiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRuZXh0VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9bm9fbmV4dC5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJJiMxNjA7CSYjMTYwOwotCQkJPC90ZD4JCi0JCTwvdHI+Ci0JPC90YWJsZT4gICAgCi08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zcHNjcmVlbi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Nwc2NyZWVuLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhZDZhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Nwc2NyZWVuLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotCi0KLS0tIFJQVyBNRVRBIERBVEEgRU5EIC0tPgotCi08aHRtbCBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLQotPGhlYWQ+Ci08bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InJvcC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIi8+Ci08dGl0bGU+U3BsYXNoIFNjcmVlbjwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLQotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPGgyIGFsaWduPSJjZW50ZXIiPlBsZWFzZSB3YWl0IHdoaWxlIHRoZSB0cmVlIGJyb3dzZXIgaXMgYmVpbmcgbG9hZGVkLi4uPGJyLz48L2gyPgotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPCEtLQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9IldlbGNvbWUgdG8gdGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0gLS0+Ci08YnIvPgotPGJyLz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwYTBhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1hCi17CQotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotYS5iYXNpYwoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci19Ci0JCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIGZvbnQgZm9yIGFjdGlvbiBvbiBjb250ZW50IHBhZ2UgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlIDtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb24KLXsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi19IAotCi1hLmNvcHlyaWdodAoteyAJCi0gICBjb2xvcjogIzMzNjY5OTsgICAgCi0JZm9udC1zaXplIDogMTBweDsKLSB9ICAKLSAKLWEubmF2dHJlZQoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8gCi1hLmFjdGl2ZXRhYgotIHsgCi0gCWNvbG9yOiAjMDAwMDAwOwotIAlmb250LXNpemU6IDEycHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIH0KLSAKLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLSBhLm5vbmFjdGl2ZXRhYgotIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXNpemU6IDEycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotIAotIGEucmVkCi17Ci0JY29sb3I6ICNjYzMzMDA7Ci19Ci0KLWEudG9wYmFyCi17Ci0gIGNvbG9yOiAjNjY2NjY2OwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAvKiBiZ2NvbG9yICBmb3IgYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi0uYWN0aW9uYmcKLXsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLS5iZ2JsYWNrCi17IAotIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotIAotLmJnd2hpdGUKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotICAKLWJvZHkgCi17Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNmZmZmZmY7ICAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi19Ci0KLS5ib2xkCi17IAotICAgZm9udC13ZWlnaHQgOiA2MDA7Ci0gfQotCi0gLmJvdHRvbWJhcmRyawoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAzMzY2OwotIH0KLQotCi0uYm90dG9tYmFybGlnaHQKLXsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3cKLXsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0gCi0uYnV0dG9ucwotIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLmNvZGUKLXsgCi0gICBmb250LWZhbWlseTogQ291cmllciBOZXcsIENvdXJpZXIsIG1vbm87ICAgCi0gICBmb250LXNpemU6IDEycHg7Ci0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMKLXsgCQotCWZvbnQtc2l6ZTogMTFweDsJCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmNvcHlyaWdodAoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1zaXplIDogMTBweDsKLSB9Ci0gCi0gLmRpYWxnYnhzaGFkb3cyIAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0gLmRpYWxvZ3VlYm94Ym9yZGVyCi17IAotIGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzMKLSB9Ci0gCi0gLmRpYWxvZ3VlYm94YmcgCi17ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyCi19Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLSAuZGlhbG9ndWVib3hNZWRpdW0KLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogIzhiOGI4YgotIH0KLSAKLSAuZGlhbG9ndWVib3hUaXRsZQotIHsJICAgCi0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLSAKLS5kaXZpZGVyCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0gCi1oMQoteyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluCi17ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE3cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qcmVwbGFjaW5nIHNpZGVtZW51X2JvbGRsZWZ0IG1vdmluZyBmb3J3YXJkKi8KLS5uYXZsZWZ0Ym9sZAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmxlZnQgbmF2IHN1Ym1lbnUqLwotLm5hdmxlZnRzdWIKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qLmxlZnRtZW51YWN0aXZlKi8KLS5zaWRlbWVudV9ib2xkbGVmdF9zZWxlY3RlZAotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKnVzZSBuYXZsZWZ0Ym9sZCBpbnN0ZWFkIHRvIHdvcmsgaW4gTlM2Ki8KLS5zaWRlbWVudV9ib2xkbGVmdAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotLmxlZnRtZW51Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5zaWRlbWVudV9idWxsZXRfZ3JleQotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uc2lkZW1lbnVfc3RhbmRhcmQKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zaWRlbWVudV9zdGFuZGFyZF9zZWxlY3RlZAotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnRleHRncmF5Ci17ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS5oMQoteyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMHB4OwkKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uaGVhZGVyYmx1ZQotewotCWNvbG9yOiAjMDA2Njk5OwkKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWkKLXsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlcgoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi1pbnB1dAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEycHg7Ci19IAotCi1pbnB1dC5weDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotaW5wdXQucHg0NQotewotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSwgYnV0IE5TCi0qLwotaW5wdXQubWF4NTAKLXsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLWlucHV0LnB4ODUKLXsKLSAgICB3aWR0aDogODVweAotfQotCi1pbnB1dC5weDEzNQotewotICAgIHdpZHRoOiAxMzVweAotfQotCi0KLWlucHV0LnB4MTU1Ci17Ci0gICAgd2lkdGg6IDE1NXB4Ci19Ci0KLWlucHV0LnB4MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotaW5wdXQucHgzMDUKLXsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLS5sZWZ0bmF2aGVhZCAKLSB7Ci0gICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodDogYm9sZDsJCi0JZm9udC1zaXplOiAxM3B4OwkKLX0gCi0KLS5sZWZ0bmF2bGFiZWwKLXsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC13ZWlnaHQgOiA2MDA7Ci1mb250LXNpemU6IDExcHg7Ci0gfQotIAotLyp0b3BuYXYqLyAKLS5taWRiYXJsaWdodAoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLyp0b3BuYXYqLyAKLSAubWlkYmFybWVkCi17IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQotICAKLS5wYWdlYm9sZAoteyAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsJCi0gfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzCi17IAotCWNvbG9yOiAjNjc2NzY3OwkKLQlmb250LXNpemU6IDExcHg7Ci0JIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLSAvKnVzZSBmb3IgcG9wdXBtZW51cyBidXQgbm90IGluY2x1ZGluZyB0b3AgbmF2Ki8KLS5wb3B1cHRleHQKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0gCi0gCi1zZWxlY3QKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMnB4OwotfQotCi1zZWxlY3Quc2VscHgxNDQKLXsKLSAgICB3aWR0aDogMTQ0cHg7Ci19Ci0KLS5zbWFsbHRleHQKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIKLXsgIAotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDEzcHg7CQotICAgIGZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZAotewotICBjb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotfQotCi10ZC5hY3RpdmV0YWIKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci0gIH0KLSAKLSB0ZC5ub25hY3RpdmV0YWIKLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLnRkTGlnaHQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLSAudGREYXJrQm9sZAotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0udG9wZnJhbWViZyAKLXsgIGJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLS50b3BmcmFtZWJnR3JleWVkCi17ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlZGVkOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjU7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodEdyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotfQotCi0udG9wZnJhbWVzaGFkb3cgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd0dyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyIAoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLSAudG9wZnJhbWVoaWdobGlnaHQyR3JleWVkCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Ci0gfSAKLSAKLSAudG9wZnJhbWVsb2dvYmcgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS50b3BmcmFtZWxvZ29iZ0dyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjOTljMmQ2OwotfQotCi0udG9wbGVmdG5hdgotewkKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udG9wbGVmdG5hdkdyZXllZAotewkKLSAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl9Ci0KLS50b3BsZWZ0bmF2Ym9sZCAKLXsgCi1mb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTBweDsgCi10ZXh0LWRlY29yYXRpb246IG5vbmU7IAotZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZEdyZXllZAoteyAKLWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLWZvbnQtc2l6ZTogMTBweDsgCi1jb2xvcjogIzk5OTk5OTsKLXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi1mb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvcHJpZ2h0bmF2Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BiYXJkaXZpZGVyCi0geyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjIAotIH0KLQotIC50b3BiYXJkaXZpZGVyR3JleWVkCi0geyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjYWRkNmViCi0gfSAgCi0KLSB0ci5iZ21pZGZyYW1lCi0gLyogdGhpcyB3YXMgaW5pdGlhbGx5IGRlY2xhcmVkIHRoZSBzYW1lIGNvbG91ciBhcyB0aGUgY2xhc3MgdG9wZnJhbWUgYmcgYnV0IGJlY2F1c2UgaXQgbGllcyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbmFsIGFyZWEsIGhhcyBiZWVuIHJlY3JlYXRlZCBoZXJlICAqLwotewotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0gCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHYuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYWR2LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1OTJhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHYuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBib3RoIGxpbmsgYW5kICBuby1saW5rIHRleHQqLwotCi1hIHsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotLyogYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbmxpbmsgewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKiBmb250IGZvciBhY3Rpb247aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uc2VsZWN0b3IgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsJCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogRGVzY29wZWQsIEl0J3Mgbm90IHVzZWQgaW4gY3VycmVudCBwcm9qZWN0cywgdG8gYmUgYXJjaGl2ZWQgYWZ0ZXIgNiBtb250aHMuIEFsaSBSb2tuaSwgMDkvMDkvMDIgKi8KLS8qIGZvciBjb250ZXh0IHRvb2xiYXIgYnV0dG9ucyBpbiBNdWx0aXNpdGUsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotfSAKLQotLyphY3Rpb25iYXIgb24gd2hpdGUgYmFja2dyb3VuZCovCi0uYWN0aW9uc2VsZWN0MiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmFjdGlvbmJhciBhcHBlYXJzIG9uIHRvcCBhbmQvb3IgYm90dG9tIG9mIHBhZ2UqLwotLmFjdGlvbnNlbGVjdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypjb2x1bW4gaGVhZGluZ3MqLwotYS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gCi0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLS8qc2l0ZW1hcCBoZWFkZXIqLwotYS5zaXRlbWFwaCB7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlZCBpbiBmb3Jnb3QgcGFzc3dvcmQsIGFueSBvdGhlciBzbWFsbCB0ZXh0IGxpbmtzKi8KLWEuc21hbGwgewotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotYiB7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovICAKLS5iYXNpYyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5iZ2Jhc2ljIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi0uYmd3aGl0ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAgCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8gCi0uYm9yZGVydGJsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovIAotLmJvcmRlcnRibDIgewotCWJhY2tncm91bmQtY29sb3I6ICNCREJEQkQ7Ci19Ci0KLS8qdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLmJvcmRlcnRibDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS5icmVhZGNydW1icyB7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKnVzZWQgaW4gdG9wbmF2ICwgc2ltaWxhciB0byBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypkZXNjb3BlZDsgdXNlIGJ1dHRvbiBpbnN0ZWFkOyB1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24zIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmFjdGl2ZSBuYXZpZ2F0aW9uIGJ1dHRvbiwgbm90IGZvcm0gYnV0dG9ucyovIAotLmJ1dHRvbm9uIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBhLmJ1dHRvbjsgdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGlzYWJsZWQgc3RhdGUgb2Ygbm9uLWltYWdlIGJ1dHRvbiovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvcHlyaWdodCB7IAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLQotLypkZWZlY3QgcGFnZSBzdWJoZWFkICwgdXNlZCBpbiBwcm9qZWN0IGNvbnNvbGUqLwotLmRlZmVjdHN1YmhkIHsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5kaWFsZ2J4c2hhZG93MiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uZGlhbG9ndWVib3hib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7Ci19Ci0KLS5kaWFsb2d1ZWJveGhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLmRpYWxvZ3VlYm94bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEI4QjhCOwotfQotCi1kaXYgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0gCi0KLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnQgewotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLX0KLQotZGl2Lm1hcmdpbnMgeyAKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gIAotZGl2Lm1hcmdpbnMyMCB7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDdweDsKLQltYXJnaW4tdG9wOiAyMHB4OwotCW1hcmdpbi1yaWdodDogN3B4OwotfQotCi0vKmFkZHMgMTAgcHggcGFkZGluZyBhcm91bmQgdGV4dCovCi1kaXYucGFkMTAgewotCXBhZGRpbmc6IDEwcHg7Ci19Ci0KLWRsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLS8qcmVtb3ZlcyBkZWZhdWx0IGJvdHRvbSBtYXJnaW4sIGRvZXNuJ3Qgd29yayBpbiBOUzQuN3ggKi8gIAotZGwuZGF0YSB7Ci0JbWFyZ2luLWJvdHRvbTogLTFweDsKLX0KLQotLyp0aXRsZSBmb3IgZXJyb3IgbWVzc2FnZXMqLwotLmVycm9yIHsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI3cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMSBhbmQgY29udGVudGhlYWRlciBsYXJnZSovCi0uaGVhZGVyMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXN1YWxseSB1c2VkIG5leHQgdG8gaGVhZGVyMSwgZm9yIGRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oZWFkZXIzIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotaSB7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vZmYgewotCWZsb2F0OiByaWdodDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOjFweDsKLQl2aXNpYmlsaXR5OmhpZGRlbjsKLQl3aWR0aDoxMDAlOwotfQotCi0vKnVzZWQgaW4gY29udHJvbHN0cmlwKi8KLS5pY29ub24gewotCWZsb2F0OiByaWdodDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOjFweDsKLQl2aXNpYmlsaXR5OnNob3c7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4Ci19Ci0KLWlucHV0LnJhZGlvIHsKLQotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMsIGxlZnRuYXYqLwotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0ubm90ZXMgewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotfQotCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0ucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypwb3B1cCBoZWFkZXIqLwotLnBvcGgxIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMqLwotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCAjQ0NDQ0NDOwotCWxlZnQ6IDIxMHB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOiAyNXB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLQl3aWR0aDogYXV0bzsKLQl6LWluZGV4OiAxMDsKLX0KLQotLypwcm9ncmVzc2JhciBib3JkZXJzIGluIE11bHRpc2l0ZSovCi0ucHJvZ3Jlc3NiYXJicmQgewotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci19Ci0KLXNlbGVjdCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBidXR0b25zMzsgdXNlZCBpbiB0b3BuYXYqLwotLnNtYWxsdGV4dCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLS8qIHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8gCi10ZC5idXR0b25ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDRENEQ0OwotfQotCi0vKiBkaXNhYmxlZCB2ZXJzaW9uICovIAotdGQuYnV0dG9uYm9keWRzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qbm9uLWltYWdlIGJ1dHRvbiovCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7Ci19Ci0KLS8qIG5vbi1pbWFnZSBidXR0b24tLWRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfSAgIAotCi0vKmdyYXkgZGF0YSBoaWdobGlnaHQgb3IgcGFnZSBiYWNrZ3JvdW5kKi8gCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLXRleHRhcmVhIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wYmFyZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTlDQzsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBib3JkZXJ0YmwzOyB1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0I2QjVCNTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodDIgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVsb2dvYmcgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVzaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS8qZ2xvYmFsIGljb24gb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2IHsJCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypnbG9iYWwgaW5wdXQgb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2Ym9sZCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRleHQgb24gdG9wbmF2LCB0b3AgcmlnaHQgc2VjdGlvbiovCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkgCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypsaXN0LXN0eWxlLWltYWdlOiB1cmwoaW1hZ2VzL2Rvd25idXR0b24uZ2lmKTsqLwotdWwgewotCWxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYWR2VU5YLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2FkdlVOWC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTUwYTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYWR2VU5YLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qbXVzdCBhZGQgZm9udCB0eXBlIGlmIGNsYXNzIGlzIGJlaW5nIHVzZWQgYXMgYSBsaW5rIGFzIHdlbGwgYXMgbm8tbGluayovCi0KLWEgewotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotLyogYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbmxpbmsgewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotIAotLyogZm9udCBmb3IgYWN0aW9uO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbnNlbGVjdG9yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBEZXNjb3BlZCwgSXQncyBub3QgdXNlZCBpbiBjdXJyZW50IHByb2plY3RzLCB0byBiZSBhcmNoaXZlZCBhZnRlciA2IG1vbnRocy4gQWxpIFJva25pLCAwOS8wOS8wMiAqLwotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKmFjdGlvbmJhciBvbiB3aGl0ZSBiYWNrZ3JvdW5kKi8KLS5hY3Rpb25zZWxlY3QyIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmNvbHVtbiBoZWFkaW5ncyovCi1hLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnNpdGVtYXAgaGVhZGVyKi8KLWEuc2l0ZW1hcGggewotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWIgewotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovCi0uYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0uYm9yZGVyZHJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0vKnVzZSBpbiBwb3B1cHMgYXMgYm9yZGVycyBpbiBNdWx0aXNpdGUqLyAKLS5ib3JkZXJwb3B1cCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLypib3JkZXJzIHVzZWQgYXJvdW5kIGRhdGEsIHNlZSBSVVAqLwotLmJvcmRlcnRibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLX0KLQotLypkZXNpZ24gZWxlbWVudCBzaW11bGF0aW5nIGEgZGltZW5zaW9uYWwgYm91bmRhcnkgdG8gYSB0YWJsZSAqLyAKLS5ib3JkZXJ0YmwyewotCWJhY2tncm91bmQtY29sb3I6ICNCREJEQkQ7Ci19Ci0KLS8qdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLmJvcmRlcnRibDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS5icmVhZGNydW1ic3sKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY3BlZDsgdXNlIGJ1dHRvbiBpbnN0ZWFkOyB1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24zIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmFjdGl2ZSBzdGF0ZSBvZiBuYXZpZ2F0aW9uIGJ1dHRvbiBpbiBjb250ZXh0IHRvb2xiYXIqLyAKLS5idXR0b25vbiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b25zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLyogZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGEuYnV0dG9uOyB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmFsaXphdGlvbiovCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotZGQgewotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCW1hcmdpbi1sZWZ0OiAtMXB4OwotfQotCi0vKmRlZmVjdCBwYWdlIHN1YmhlYWQgLCB1c2VkIGluIHByb2plY3QgY29uc29sZSovCi0uZGVmZWN0c3ViaGQgewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZGlhbGdieHNoYWRvdzIgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmJhY2tncm91bmQgZm9yIGxvZ2luIHBhZ2VzKi8KLS5kaWFsb2d1ZWJveGJnMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOwotfQotCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS5kaWFsb2d1ZWJveG1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhCOEI4QjsKLX0KLQotZGl2IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLwotZGl2Lm1hcmdpbnJ0IHsKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci19Ci0KLWRpdi5tYXJnaW5zIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gCi1kaXYubWFyZ2luczIwIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDIwcHg7Ci19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgewotCW1hcmdpbi1ib3R0b206IC0xcHg7Ci19Ci0KLS8qdGl0bGUgZm9yIGVycm9yIG1lc3NhZ2VzKi8KLS5lcnJvciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzMHB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMzcHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI4cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c3VhbGx5IHVzZWQgbmV4dCB0byBoZWFkZXIxOyBmb3IgZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLmhlYWRlcjMgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi1pIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0vKnVzZWQgaW4gY29udHJvbHN0cmlwKi8KLS5pY29ub2ZmIHsKLQlmbG9hdDogcmlnaHQ7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLQl3aWR0aDogMTAwJTsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9uIHsKLQlmbG9hdDogcmlnaHQ7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6c2hvdzsKLQl3aWR0aDogMTAwJTsKLX0KLQotCi0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgaW5wdXQgYm94IHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLWlucHV0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIDEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFICovCi1pbnB1dC5tYXg1MCB7Ci0Jd2lkdGg6IDM2MHB4OwotfQotCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUKLSovCi1pbnB1dC5weDg1IHsKLQl3aWR0aDogODVweDsKLX0KLQotaW5wdXQucmFkaW8geyAKLQotfQotCi0gLyp1c2VkIGluIHRyZWVzY3JpcHRzLCBsZWZ0bmF2Ki8KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLm5vdGVzIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypmb250IGZvciB0aGUgbnVtYmVycyBpbiBwYWdpbmF0aW9uIGxpYnJhcnkqLwotLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMjRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsKLQlsZWZ0OiAyMTBweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMjVweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsJCi19Ci0KLS8qcHJvZ3Jlc3NiYXIgYm9yZGVycyBpbiBNdWx0aXNpdGUqLwotLnByb2dyZXNzYmFyYnJkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OwotfQotCi1zZWxlY3QgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYnV0dG9uczM7IHVzZWQgaW4gdG9wbmF2Ki8KLS5zbWFsbHRleHQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotfQotCi0gLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbmJvZHlkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKm5vbi1pbWFnZSBidXR0b24qLwotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNkQ2RDZEOwotfQotCi0vKiBub24taW1hZ2UgYnV0dG9uLS1kaXNhYmxlZCB2ZXJzaW9uICovCi10ZC5idXR0b25zaGFkb3dkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQTJBMkEyOwotfQotCi0gLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLS8qZ3JheSBkYXRhIGhpZ2hsaWdodCBvciBwYWdlIGJhY2tncm91bmQqLyAKLS50ZGxpZ2h0MSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotdGV4dGFyZWEgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BiYXJkaXZpZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OUNDOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lYmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS11c2UgYm9yZGVydGJsMzsgdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNCNkI1QjU7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lbG9nb2JnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0vKmdsb2JhbCBpY29uIG9wZXJhdGlvbnMgdG9vbGJhciovCi0udG9wbGVmdG5hdiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypnbG9iYWwgaW5wdXQgb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2Ym9sZCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGJyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRleHQgb24gdG9wbmF2LCB0b3AgcmlnaHQgc2VjdGlvbiovCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyBkb2Vzbid0IHdvcmsgZm9yIG5zNCovCi11bCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9iYXNlLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2UuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWJiNTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2UuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBhIGxpbmsgYXMgd2VsbCBhcyBuby1saW5rKi8KLQotYSB7Ci0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIERlc2NvcGVkLCBJdCdzIG5vdCB1c2VkIGluIGN1cnJlbnQgcHJvamVjdHMsIHRvIGJlIGFyY2hpdmVkIGFmdGVyIDYgbW9udGhzLiBBbGkgUm9rbmksIDA5LzA5LzAyICovCi0vKiBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9ubGluayB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIGFjdGlvbjtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25zZWxlY3RvciB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi1hLmJhc2ljIHsKLQljb2xvcjogIzAwMDAwMDsKLX0KLQotYS5icmVhZGNydW1icyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6IDMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjpob3ZlciB7Ci0JY29sb3I6IDMzMzMzMzsKLX0KLQotYS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLyphY3Rpb25iYXIgb24gd2hpdGUgYmFja2dyb3VuZCovCi0uYWN0aW9uc2VsZWN0MiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmFjdGlvbmJhciBhcHBlYXJzIG9uIHRvcCBhbmQvb3IgYm90dG9tIG9mIHBhZ2UqLwotLmFjdGlvbnNlbGVjdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypjb2x1bW4gaGVhZGluZ3MqLwotYS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnNpdGVtYXAgaGVhZGVyKi8KLWEuc2l0ZW1hcGggewotCWZvbnQtc2l6ZTogMTdweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLWIgewotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKnN0YW5kYXJkIHRleHQqLwotLmJhc2ljIHsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDEycHg7Ci1mb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8gCi0uYm9yZGVydGJsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovIAotLmJvcmRlcnRibDJ7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0JEQkRCRDsKLX0KLQotLyp1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0uYm9yZGVydGJsMyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLmJyZWFkY3J1bWJzeyAKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY29wZWQ7IHVzZSBidXR0b24gaW5zdGVhZDsgdXNlZCBpbiB0b3BuYXYgLCBzaW1pbGFyIHRvIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9uMyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyphY3RpdmUgc3RhdGUgb2YgbmF2aWdhdGlvbiBidXR0b24gaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ub24gewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYS5idXR0b247IHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8gCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLSAKLS8qZGVmZWN0IHBhZ2Ugc3ViaGVhZCAsIHVzZWQgaW4gcHJvamVjdCBjb25zb2xlKi8KLS5kZWZlY3RzdWJoZCB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0gCi0uZGlhbGdieHNoYWRvdzIgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmJhY2tncm91bmQgZm9yIGxvZ2luIHBhZ2VzKi8KLS5kaWFsb2d1ZWJveGJnMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOwotfQotIAotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0gLmRpYWxvZ3VlYm94bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEI4QjhCOwotfQotCi1kaXYgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi0vKnVzZWQgdG8gYWZmZWN0IHJpZ2h0IG1hcmdpbiovIAotZGl2Lm1hcmdpbnJ0IHsKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci19Ci0KLWRpdi5tYXJnaW5zIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gCi1kaXYubWFyZ2luczIwIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDIwcHg7Ci19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLwotZGwuZGF0YSB7Ci0JbWFyZ2luLWJvdHRvbTogLTFweDsKLX0KLQotLyp0aXRsZSBmb3IgZXJyb3IgbWVzc2FnZXMqLwotLmVycm9yIHsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI3cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLSAKLS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c3VhbGx5IHVzZWQgbmV4dCB0byBoZWFkZXIxIGZvciBkb2N1bWVudCByb290IGZvbGRlciovCi0uaGVhZGVyMyB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLWkgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vZmYgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6IDFweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vbiB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IHNob3c7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5yYWRpb3sKLQltYXJnaW4tdG9wOiAtMnB4OwotfQotCi0gLyp1c2VkIGluIHRyZWVzY3JpcHRzLCBsZWZ0bmF2Ki8KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLyphZGRlZCBmb3IgeHNsX3Byb2Nlc3MtLXJlbW92ZSAxMi8wMiovCi0ubGVmdG5hdnRyZWUgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl3aWR0aDogMjAwcHg7Ci0JaGVpZ2h0OiAxMTVweDsKLQlsZWZ0OiA1OwotCXRvcDogMjU7Ci0JdmlzaWJpbGl0eTogdmlzaWJsZTsKLQl6LWluZGV4OiAwOwotfQotCi0ubm90ZXMgewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotfQotCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0ucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0gfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsKLQlsZWZ0OiAyMTBweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci0Jd2lkdGg6YXV0bzsKLQl6LWluZGV4OjEwOwkKLX0KLQotLypwcm9ncmVzc2JhciBib3JkZXJzIGluIE11bHRpc2l0ZSovCi0ucHJvZ3Jlc3NiYXJicmR7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLX0KLSAKLXNlbGVjdCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBidXR0b24zOyB1c2VkIGluIHRvcG5hdiovCi0uc21hbGx0ZXh0IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLX0KLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLSAvKiBkaXNhYmxlZCB2ZXJzaW9uICovIAotdGQuYnV0dG9uYm9keWRzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qbm9uLWltYWdlIGJ1dHRvbiovCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7Ci19Ci0KLS8qIG5vbi1pbWFnZSBidXR0b24tLWRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0gLypncmF5IGRhdGEgaGlnaGxpZ2h0IG9yIHBhZ2UgYmFja2dyb3VuZCovIAotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi10ZXh0YXJlYSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGJhcmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Q0M7Ci19Ci0gCi0gLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZWQgYm9yZGVydGJsMzsgdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNCNkI1QjU7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWxvZ29iZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZXNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLypnbG9iYWwgaWNvbiBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXYgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZ2xvYmFsIGlucHV0IG9wZXJhdGlvbnMgdG9vbGJhciovCi0udG9wbGVmdG5hdmJvbGQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBicmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdGV4dCBvbiB0b3BuYXYsIHRvcCByaWdodCBzZWN0aW9uKi8KLS50b3ByaWdodG5hdiB7Ci0JY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7IGRvZXNuJ3Qgd29yayBmb3IgbnM0Ki8KLXVsIHsKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2VVTlguY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZVVOWC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZWM5MWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZVVOWC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzIG5vLWxpbmsqLwotCi1hIHsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLS8qIGFjdGlvbiB0ZXh0IHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZTtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25saW5rIHsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi19Ci0gCi0vKiBmb250IGZvciBhY3Rpb247aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uc2VsZWN0b3IgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBEZXNjb3BlZCwgSXQncyBub3QgdXNlZCBpbiBjdXJyZW50IHByb2plY3RzLCB0byBiZSBhcmNoaXZlZCBhZnRlciA2IG1vbnRocy4gQWxpIFJva25pLCAwOS8wOS8wMiAqLwotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKmFjdGlvbmJhciBvbiB3aGl0ZSBiYWNrZ3JvdW5kKi8KLS5hY3Rpb25zZWxlY3QyIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmNvbHVtbiBoZWFkaW5ncyovCi1hLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSAvKm5hdnRyZWUgaXRlbSBvciBkb2MqLwotYS5uYXZ0cmVlaXRlbSB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypzaXRlbWFwIGhlYWRlciovCi1hLnNpdGVtYXBoewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWIgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovCi0uYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8KLS5ib3JkZXJ0YmwgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8gCi0uYm9yZGVydGJsMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0JEQkRCRDsKLX0KLQotLyp1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0uYm9yZGVydGJsMyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLmJyZWFkY3J1bWJzIHsKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY29wZWQ7IHVzZSBidXR0b24gaW5zdGVhZDsgdXNlZCBpbiB0b3BuYXYgLCBzaW1pbGFyIHRvIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9uMyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyphY3RpdmUgc3RhdGUgb2YgbmF2aWdhdGlvbiBidXR0b24gaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ub24gewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbmF2aWdhdGlvbiBidXR0b25zIGluIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGEuYnV0dG9uOyB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmFsaXphdGlvbiovCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLQotLypkZWZlY3QgcGFnZSBzdWJoZWFkICwgdXNlZCBpbiBwcm9qZWN0IGNvbnNvbGUqLwotLmRlZmVjdHN1YmhkIHsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmRpYWxnYnhzaGFkb3cyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0uZGlhbG9ndWVib3hiZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0QyRDJEMjsKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMzsKLX0KLQotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0uZGlhbG9ndWVib3htZWRpdW0gewotCWJhY2tncm91bmQtY29sb3I6ICM4QjhCOEI7Ci19Ci0KLWRpdiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnQgewotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLX0KLQotZGl2Lm1hcmdpbnMgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjVweDsKLX0KLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAKLWRpdi5tYXJnaW5zMjAgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjBweDsJCi19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgeyAKLQltYXJnaW4tYm90dG9tOiAtMXB4OwotfQotCi0vKnRpdGxlIGZvciBlcnJvciBtZXNzYWdlcyovCi0uZXJyb3IgewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzBweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0uZm9ybXRibGhlYWQgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qY3VycmVudCBzb3J0ZWQgY29sdW1uKi8KLS5mb3JtdGJsaGVhZGMgewotCWJhY2tncm91bmQtY29sb3I6ICNFNEU0RTQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMSBhbmQgY29udGVudGhlYWRlciBsYXJnZSovCi0uaGVhZGVyMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyOHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXN1YWxseSB1c2VkIG5leHQgdG8gaGVhZGVyMTsgZm9yIGRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oZWFkZXIzIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMzcHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotaSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9mZiB7Ci0JcG9zaXRpb246IGFic29sdXRlOyAKLQl0b3A6IDFweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vbiB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IHNob3c7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5yYWRpbyB7Ci0KLX0KLQotIC8qdXNlZCBpbiB0cmVlc2NyaXB0cywgbGVmdG5hdiovCi0ubGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5ub3RlcyB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypmb250IGZvciB0aGUgbnVtYmVycyBpbiBwYWdpbmF0aW9uIGxpYnJhcnkqLwotLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMjRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsgCi0JbGVmdDogMjEwcHg7CS8qIGl0J3Mgbm90IHdvcmtpbmcgb24gbnMgNi4yLCBpZSA1LjUsIGllIDYgYW5kIG5zIDcsIHBvc3NpYmx5IGNhbiBiZSByZW1vdmVkIHNhZmVseSwgQWxpIFJva25pLCAwOS8xOC8wMiovCi0JcGFkZGluZzogMnB4OwotCXBvc2l0aW9uOiBhYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwotfQotCi0vKnByb2dyZXNzYmFyIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8KLS5wcm9ncmVzc2JhcmJyZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLX0KLQotc2VsZWN0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGJ1dHRvbnMzOyB1c2VkIGluIHRvcG5hdiovCi0uc21hbGx0ZXh0IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbmJvZHlkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKm5vbi1pbWFnZSBidXR0b24qLwotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNkQ2RDZEOwotfQotCi0vKiBub24taW1hZ2UgYnV0dG9uLS1kaXNhYmxlZCB2ZXJzaW9uICovCi10ZC5idXR0b25zaGFkb3dkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQTJBMkEyOwotfQotCi0vKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGxpZ2h0IGdyYXkqLwotdGQudGJsaGlnaGx0MyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLX0KLQotLypncmF5IGRhdGEgaGlnaGxpZ2h0IG9yIHBhZ2UgYmFja2dyb3VuZCovIAotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi10ZXh0YXJlYSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGJhcmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Q0M7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0QyRDJEMjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLXVzZSBib3JkZXJ0YmwzOyB1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0I2QjVCNTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodDIgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVsb2dvYmcgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVzaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS8qZ2xvYmFsIGljb24gb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmdsb2JhbCBpbnB1dCBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXZib2xkIHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYnJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7IAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLX0KLQotLyp0ZXh0IG9uIHRvcG5hdiwgdG9wIHJpZ2h0IHNlY3Rpb24qLwotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7IGRvZXNuJ3Qgd29yayBmb3IgbnM0Ki8KLXVsIHsKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkOTI0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2Rlc2lnbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLSAvKiB0aGlzIGlzIGEgYm9yZGVyIHN0eWxlIGZvciB0aGUgdG9wIG1lbnUgYm94ICovCi0gLmJveHRoaW4gewotCWJvcmRlci1jb2xvcjogI0U5RTlFOTsKLQlib3JkZXItc3R5bGU6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JbWFyZ2luLXRvcDogMWVtOwotCXBhZGRpbmc6IDFlbTsKLQl3aWR0aDogMjc1cHg7Ci19Ci0KLSAvKiB0aGlzIGlzIGEgY29udGFpbmVyIHRvIGtlZXAgdGhlIHRvcCBtZW51IGlzb2xhdGVkIGZyb20gbWF0ZXJpYWwgYmVsb3cgaXQgKi8KLS5jb250YWluZXIgewotCWNsZWFyOiBib3RoOwotCXdpZHRoOiAxMDAlOwotfQotCi0gLyogYSBzaW1wbGUgaW5zZXQgZm9yIGJsb2NrZWQgZWxlbWVudHMgdG8gaW5kZW50ICovCi0uaW5zZXQgewotCWNsZWFyOiBib3RoOwotCW1hcmdpbi1sZWZ0OiAxM3B4OwotCW1hcmdpbi10b3A6IDRweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLm1pZGFsaWduIHsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi0gLyogYW4gZW1wdHkgZWxlbWVudCBmb3IgdGhlIGJlbmVmaXQgb2YgSS5FLiA1KyBzbyB0aGF0IHRoZSB0b3AgbWVudSBpcyBjb25zdHJhaW5lZCB0byBsZWZ0ICovCi0uc3BhY2luZyB7Ci0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogMTAwcHg7Ci19Ci0KLSAvKiBUaGUgY2xhc3NlcyBiZWxvdyBhbGwgcmVsYXRlIHRvIHRoZSB1cHBlciByaWdodCBidXR0b24gb24gdGhlIG5hdiBmcmFtZSovCi0KLS53aHJidG4gewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlyaWdodDogMDsKLQl0b3A6IDA7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS53aHJidXR0b25iZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZCRkJGQjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0ud2hyYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0JDQkNCOwotfQotCi0ud2hyYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjg2ODY4OwotfQotCi0ud2hybWFyZ2luewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS53aHJtYXJnaW5icmRyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0gLyogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgbmV0c2NhcGUgc28gdGhhdCB0aGUgc2Nyb2xsIGJhciBkb2Vzbid0IGNvdmVyIHRoZSBidXR0b24uIEFuIGltYWdlIGluc2lkZSBvZiBhIGRpdiBoZWxwcyBwdXNoIHRoZSBidXR0b24gdG8gdGhlIGxlZnQuIEhlcmUgdGhlIGRpdiBpcyBzaW1wbHkgdHVybmVkIG9mZiBzaW5jZSBpdCBpcyB1bm5lZWRlZCAqLwotLndocnNwYWNlciB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduX25zLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduX25zLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlNjBlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2Rlc2lnbl9ucy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi3vu78vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS5ib3h0aGluIHsKLQlib3JkZXItY29sb3I6ICNFOUU5RTk7Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0Jd2lkdGg6IDI3NXB4OwotfQotCi0uY29udGFpbmVyIHsKLQltYXJnaW4tbGVmdDogMTJweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmNvbnRlbnQgewotCW1hcmdpbi1sZWZ0OiAxMnB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0gLyogYSBzaW1wbGUgaW5zZXQgZm9yIGJsb2NrZWQgZWxlbWVudHMgdG8gaW5kZW50ICovCi0uaW5zZXQgewotCWNsZWFyOiBib3RoOwotCW1hcmdpbi1sZWZ0OiAxM3B4OwotCW1hcmdpbi10b3A6IDRweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLm1pZGFsaWduIHsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi0uc3BhY2luZyB7Ci19Ci0KLSAvKiBUaGUgY2xhc3NlcyBiZWxvdyBhbGwgcmVsYXRlIHRvIHRoZSB1cHBlciByaWdodCBidXR0b24gb24gdGhlIG5hdiBmcmFtZSovCi0KLS53aHJidG4gewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6IDA7Ci0Jd2lkdGg6IDkwJTsKLX0KLQotLndocmJ1dHRvbmJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkJGQkZCOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0ud2hyYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0JDQkNCOwotfQotCi0ud2hyYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjg2ODY4OwotfQotCi0ud2hybWFyZ2luewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS53aHJtYXJnaW5icmRyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0gLyogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgbmV0c2NhcGUgc28gdGhhdCB0aGUgc2Nyb2xsIGJhciBkb2Vzbid0IGNvdmVyIHRoZSBidXR0b24uIFRoZSBzcGFjaW5nIGlzIHByb3ZpZGVkIGJ5IGFuIGltYWdlIGluc2lkZSBhIGRpdi4gSW4gb3RoZXIgYnJvd3NlcnMsIGl0IGlzIHNpbXBseSB0dXJuZWQgb2ZmICovCi0ud2hyc3BhY2VyIHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2V4cGxvcmVyLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2V4cGxvcmVyLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkOWVhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19leHBsb3Jlci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYQotewotICAgIGNvbG9yOiAjMzM2Njk5OwotfQotLmFjY2VudGNvbG9yCi0vKnVzZWQgYXMgaGlnaGxpZ2h0ZWQgZGVzY3JpcHRpb24gYWJvdmUgdGFibGVzKi8KLXsKLQljb2xvciA6ICNjYzMzMDA7Ci0JZm9udC1zaXplIDogMWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSBhLmJyZWFkY3J1bWJzCi0vKmxpbmtlZCBicmVhZGNydW1icyovCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLQotYS5icmVhZGNydW1iczpob3ZlcgotewotICBjb2xvcjogI2ZmZmZmZgotfQotCi0KLWEubGlua19jb250YWluZXJfZWRpdG9yCi0vKkVESVQgbGluayB1bmRlciBjb250YWluZXIgYmFubmVyKi8KLXsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi1hLmxpbmtfYnlsaW5lCi0vKndyaXR0ZW4gYnkgWFggYXV0aG9yIGluIGNvbnRlbnQqLwotewotCWZvbnQtc2l6ZTogLjllbTsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotCi1hLmxpbmtfZnVuY19vcHRpb24KLS8qQWR2YW5jZWQgbGluayBpbiBzZWFyY2ggY29udGFpbmVyKi8KLXsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi1hLmxpbmt0eXBlZAotLyp2aWV3IGFsbCBsaW5rIHVuZGVyIGNvbnRhaW5lciovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0KLWEubWVudWJhcl9saW5rCi0vKgotd2hpdGUgZm9udCBmb3IgdGhlIHRleHQgaW4gdGhlIHRhYmxlIGhlYWRlciwgdXN1YWxseSBpbiB0aGUgMW5kIGxldmVsIG9mIHRoZSB0YWJsZSBoZWFkZXIgaWYgdGhlcmUgYXJlIDIKLTFzdCBsZXZlbDogcmVndWxhciAKLTJuZCBsZXZlbDogYm9sZAotKi8KLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi0KLWEubWVudWJhcl9saW5rOmhvdmVyCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci19Ci0KLWEubmF2dHJlZQoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLWEucHJvamVjdF9uYXYKLS8qcHJvamVjdCBleHBsb3JlciBtZW51YmFyIG9wdGlvbiBsaW5rcyBpbiBsZWZ0IG5hdiovCi17Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLWEucHJvamVjdF9uYXZ0cmVlCi0vKnRvcE5hdiB0cmVlIHN1Ym1lbnUqLwotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogLjllbTsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3BiYXIKLS8qdG9wTmF2Ki8KLXsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IC45ZW07Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi1ib2R5Ci0vKm9yaWdpbmFsIGJvZHkgYmFja2dyb3VuZCBzZXR1cCovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA5cHg7Ci0JYmFja2dyb3VuZC1jb2xvciA6IGZmZmZmZjsKLX0KLQotCi0uYm9yZGVyX2RlY29yYXRpb24KLS8qZG90dGVkIGxpbmUgYm9yZGVyIG9mIHRhYmxlcyBpbiBjb250ZW50Ki8KLXsKLQlib3JkZXIgOiB0aGluIGRvdHRlZCAjNjY2NjY2OwotCWZsb2F0IDogcmlnaHQ7Ci0JbWFyZ2luLWJvdHRvbSA6IDE1cHg7Ci0JbWFyZ2luLWxlZnQgOiAxNXB4OwotCXBhZGRpbmc6IDVweDsKLX0KLQotCi0uYm90dG9tYmFyX2RhcmsKLS8qYmFja2dyb3VuZCBjb2xvciBiZWhpbmQgYnJlYWRjcnVtYnMqLwotewotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci19Ci0KLQotLmJvdHRvbWJhcl9saWdodAotLyp0aGluIGxpbmUgYmV0d2VlbiBkcm9wZG93biBtZW51ICYgYnJlYWRjcnVtYiBiYXIqLyAKLXsKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotCi0gLmJvdHRvbWJhcl9tZWRpdW0KLSAvKnRoaW4gbGluZSBiZXR3ZWVuIGRyb3Bkb3duIG1lbnUgJiBzaGFkb3cgY29sb3IgKi8KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0KLQotIC5ib3R0b21iYXJfc2hhZG93Ci0gIC8qZGFyayBsaW5lcyB1bmRlciBicmVhZGNydW1iYmFyICYgIGRyb3Bkb3dubWVudSBiYXIgKi8KLXsKLQliYWNrZ3JvdW5kOiAjMDAwMDAwOwotfQotCi0KLWNvZGUKLS8qY29kZSBhc3NldCBpbiBjb250ZW50Ki8KLXsKLQljb2xvcjogIzY3Njc2NzsKLX0KLQotLmNvZGUyCi0vKmluZGVudCBjb2RlIGFzc2V0IGluIGNvbnRlbnQqLwotewotICAgCW1hcmdpbi1sZWZ0IDogMTVweDsKLQltYXJnaW4tcmlnaHQgOiAxNXB4OwotfQotCi0uY29weXJpZ2h0Ci0vKmNvcHlyaWdodCBsaW5lIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UqLwoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDg2JTsKLSB9Ci0gCi0uY29udGVudF9iYXNpYwotLyoKLWZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0cwotZm9udCBmb3IgcmVndWxhciBjb250YWluZXIgdGV4dHMKLWZvbnQgZm9yIHJlZ3VsYXIgZm9ybSB0ZXh0cwotKi8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9iYXNpY19lbXBoYXNpcwotLyoKLWJvbGQgZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHRzCi1ib2xkIGZvbnQgZm9yIHJlZ3VsYXIgY29udGFpbmVyIHRleHRzCi1ib2xkIGZvbnQgZm9yIHJlZ3VsYXIgZm9ybSB0ZXh0cwotKi8KLXsgCi0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotIH0KLQotCi0gLmNvbnRlbnRfY29sb3JlZAotIC8qY29udGVudCovCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDFlbTsKLX0KLQotCi0gLmNvbnRlbnRfY29udGFpbmVyCi0gLypib3R0b20gbWFyZ2luIHlpZWxkIHRoZSBzcGFjZSBiZXR3ZWVuIGJ5bGluZSAmIHBhcmFncmFwaCovCi0gewotCW1hcmdpbi1ib3R0b20gOiAxNXB4OwotfQotCi0gLmNvbnRlbnRfZGlhZ3JhbQotIC8qZGlhZ3JhbSBkZXNjcmlwdGlvbiwgZWcuIiBmaWd1cmUgMS4uLiIqLwotIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXN0eWxlIDogaXRhbGljOwkKLQl9Ci0KLS5oZWFkZXJfb2ZfYXJ0aWNsZV90YWJsZQotLypjb2xvcmVkIHRhYmxlIGhlYWRlciBpbiBjb250ZW50Ki8KLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotIC5jb250ZW50X2VtcGhhc2lzCi0gLypib2xkIGZvbnQgaW4gY29udGVudCovCi0gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0KLS5jb250ZW50X2dyZXlfbWlkCi0vKndlbGNvbWUgY29udGFpbmVyKi8KLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLmNvbnRlbnRfZ3JleV9taWQyCi0vKmZvbnQgaW4gZmxvYXRpbmcgYm94Ki8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwMCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLSAuY29udGVudF9oZWFkZXIKLSAvKmhlYWRlciBvZiBjb250ZW50IHBhcmFncmFwaCovCi0gewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAuY29udGVudF9oZWFkZXJfbGFyZ2UKLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxLjhlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotIC5jb250ZW50X2hlYWRlcl9jb2xvcmVkCi0gIC8qY29sb3JlZCB0aXRsZSBvZiB0aGUgcGFnZSB1c2VkIHdpdGggY29udGVudF9oZWFkZXJfbGFyZ2UqLwotIHsKLQljb2xvcjogIzY3Njc2Nzt6Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS5jb250ZW50X3JlZmVyZW5jZQotLypmb3JudCBmb3IgcmVmZXJlbmNlLCBlZy4gInNlZSAuLi4uIiovIAotewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci0JZm9udC1zaXplOiAxZW07Ci19Ci0KLSAuY29udGVudF9yaWdodAotICAvKmZsb2F0aW5nIHRhYmxlIG9uIHRoZSByaWdodCBvZiB0aGUgY29udGVudCovCi17Ci0JZmxvYXQgOiByaWdodDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiAxMHB4OwotCW1hcmdpbi10b3AgOiAxMHB4OwotCXdpZHRoOiAxNzI7Ci19Ci0KLSAuY29udGVudF9yaWdodF90YWJsZQotIC8qaW5uZXIgdGFibGUgb2YgY29udGVudF9yaWdodCovCi17Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsCi0gLypzbWFsbGVyIGZvbnQgdGhhbiBjb250ZW50X2Jhc2ljKi8KLXsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLSAuY29udGVudF9zbWFsbF9jb2xvcmVkCi0gLypzbWFsbCBibHVlIGZvbnQqLwotewotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLX0KLQotCi0gLmNvbnRlbnRfc21hbGxfY29sb3JlZF8yCi0gLypkYXRlIGluIHJhdGluZyBiYXIqLwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAuOWVtOwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9zbWFsbF9jb2xvcmVkXzMKLS8qYXZlcmFnZSBpbiByYXRpbmcgYmFyKi8KLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLX0KLQotCi0uY29udGVudF9lbXBoYXNpcwotLypib2xkIGZvbnQqLwotIHsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlmb250LXNpemUgOiAuOWVtOwotfQotCi0KLS5jb250ZW50X3N1YmhlYWRlcgotLypib2xkIGZvbnQgYmlnZ2VyIHRoYW4gY29udGVudF9iYXNpYyovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplIDogMWVtOwotfQotCi0KLS5jb250ZW50X3N1YmhlYWRlcl8yCi0vKmJsYWNrIGNvbnRlbnQgdGl0bGUgaW4gY29udGFpbmVycyovCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxZW07Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotCi0uZGlzY3Vzc2lvbl9jb250ZW50Ci0vKmJsYWNrIHRleHRzIGluIHRhYmxlcyovCi17Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LXNpemU6IC45ZW07Ci0JbWFyZ2luLWxlZnQ6IDVweDsKLX0KLQotCi0KLS5kaXNjdXNzaW9uX2NvbnRlbnRfZW1waGFzaXMKLS8qYm9sZCB0ZXh0cyBpbiB0YWJsZXMqLwotewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1zaXplOiAuOWVtOwotCW1hcmdpbi1sZWZ0OiA1cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLQotIC5kaXNjdXNzaW9uX2Rlc2NyaXB0aW9uCi0gLypibGFjayB0ZXh0cyBpbiB0YWJsZXMgZm9yIGRlc2NyaXB0aW9ucyovCi0geyAKLQljb2xvcjogNjY2NjY2OwotCWZvbnQtc2l6ZTogLjllbTsKLQltYXJnaW4tbGVmdDogNXB4OwotICB9Ci0KLQotLmVkaXRvcm5vdGUKLS8qbm90IHVzZWQqLwotIHsgCi0gIGZvbnQtc3R5bGU6IGl0YWxpYwotIH0KLSAKLSAvKnRoZSBmb2xsb3dpbmcgdHdvIGNsYXNzZXMgYXJlIHVzZWQgZXhwcmVzc2x5IGluIHRoZSBrbm93bGVkZ2VfYW5ub3VuY2VtZW50c192aWV3Ki8KLSAKLSAuZmxvYXRjbGVhcgotewotCXBhZGRpbmc6IDVweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDAgcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5mbG9hdGdyZXkKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDVweDsKLQl3aWR0aDogNjVweDsKLX0KLQotCi0uZm9vdG5vdGUKLS8qZm9vdCBub3RlIGF0IHRoZSBib3R0b20gb2YgY29udGVudCAqLwoteyAKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0gfQotCi0KLS5mb290X3N0YXJpbmRleAotLyp0aGUgKiBzeW1ib2wgaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZpZWxkICovCi17Ci0JY29sb3IgOiBjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfZGVzY3JpcHRpb24KLS8qCi1jb2xvcmVkIGZvbnQKLWRlc2NyaXB0aW9uIGFib3V0IHRoZSB1c2VyIHN0YXR1cy4gZXEuICJzdWJzY3JpcHRpb25zIGFyZSB1cGRhdGVkIgotaXQncyB1c3VhbGx5IG9uIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBwYWdlcwotKi8KLXsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGV4dAotLyp0aGUgZGVzY3JpcHRpb25zIGZvciAqIHN5bWJvbCAsIGVnLiByZXF1aXJlZCBmaWVsZCovCi17Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGl0bGUKLS8qZm9vdCBpbmRleCBhc2lkZSB0aGUgcGFnZSBoZWFkZXIsIGVnLiAqIHN5bWJvbCAqLwotewotCWNvbG9yIDogI2ZmNjUwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLX0KLS5mb3JtZmllbGRfZGVzYyAKLS8qZm9ybSBvYmplY3QgZGVzY3JpcHRpb24gb3IgaW5zdHJ1Y3Rpb24qLwotewotY29sb3I6ICMzMzMzMzM7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotZm9udC1zaXplOiAxZW07IAotZm9udC13ZWlnaHQgOiA0MDA7IAotIGZvbnQtc3R5bGU6IGl0YWxpYwotfQotLmZvcm1maWVsZF90aXRsZQotLypmb3JtIG9iamVjdCB0aXRsZSovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplIDogMWVtOwotfQotLmZsb3djaGFydAotLypub3QgdXNlZCovCi17ICAKLQlmb250LXNpemU6IDhwdDsgY29sb3I6ICM2NjY2NjYKLX0KLQotLmdyZXlfZGFyawotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLX0KLQotLmdyZXlfbWVkaXVtCi0vKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS5oZWFkZXJfZGlzY3Vzc2lvbl9saW5rCi0vKgotc2FtZSBhcyBtZW51YmFyX2xpbmsKLXdoaXRlIGZvbnQgZm9yIHRoZSB0ZXh0IGluIHRoZSB0YWJsZSBoZWFkZXIsIHVzdWFsbHkgaW4gdGhlIDFuZCBsZXZlbCBvZiB0aGUgdGFibGUgaGVhZGVyIGlmIHRoZXJlIGFyZSAyCi0xc3QgbGV2ZWw6IHJlZ3VsYXIgCi0ybmQgbGV2ZWw6IGJvbGQKLSovCi0gewotCWNvbG9yOiAJZmZmZmZmOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5oZWFkZXJfZGlzY3Vzc2lvbl9saW5rZGsKLXsKLQljb2xvcjogCTAwMDAwMDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fdGl0bGUKLS8qCi10YWJsZSB0aXRsZXMKLXdoaXRlIGJvbGQgZm9udCBmb3IgdGhlIHRleHQgaW4gdGhlIHRhYmxlIGhlYWRlciwgdXN1YWxseSBpbiB0aGUgMm5kIGxldmVsIG9mIHRoZSB0YWJsZSBoZWFkZXIgaWYgdGhlcmUgYXJlIDIKLTFzdCBsZXZlbDogcmVndWxhciAKLTJuZCBsZXZlbDogYm9sZAotKi8KLSB7Ci0JY29sb3I6IGZmZmZmZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLX0KLQotCi0uaGVhZGVyYgotLypub3QgdXNlZCovCi17Ci0gICAgY29sb3I6ICNmZjY2MDA7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLHZlcmRhbmEsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxMnB0OwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5oZWFkZXJfb2ZfY29udGFpbmVyCi0vKmNvbG9yZWQgZm9udCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBjb250YWluZXIgZWcuIEZlYXR1cmUqLwotewotCWNvbG9yOiAjY2QzMzAxOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9jb2xvcmVkCi0vKmNvbG9yZWQgaGVhZGVyIGluIGxvZ2luIHBhZ2UqLwotewotCWNvbG9yOiAjY2MzMzAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5oZWFkZXJfb2ZfYXJ0aWNsZQotLypjb2xvcmVkIGFydGljbGUgaGVhZGVyKi8KLXsKLQljb2xvcjogI2NkMzMwMTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEuMjNlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmhlYWRlcl9vZl9hcnRpY2xlMgotLyphcnRpY2xlIGhlYWRlciovCi17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCWZvbnQtd2VpZ2h0OiA1MDA7Ci19Ci0KLS5zdWJoZWFkMV9vZl9hcnRpY2xlMgotLyphcnRpY2xlIHNlY29uZCBsZXZlbCBoZWFkKi8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEzcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5zdWJoZWFkMl9vZl9hcnRpY2xlMgotLyphcnRpY2xlIHRoaXJkIGxldmVsIGhlYWQqLwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTMgcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogNXB4OwotfQotCi0uc3ViaGVhZDNfb2ZfYXJ0aWNsZTIKLS8qYXJ0aWNsZSA0dGggbGV2ZWwgaGVhZCovCi0gewotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLmhlYWRlcl9vZl9zdGVwcwotLypmb3JudCBmb3Igc3RlcHMgdGl0bGUgaW4gZm9ybXMqLwoteyAKLQljb2xvcjogI2E0YTRhNDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotCi0uaGVhZGVyX29mX3NpdGVtYXAKLS8qaGVhZGVyIG9mIHNpdGVtYXAgcGFnZSovCi17Ci0JY29sb3I6ICM2Njk5Y2M7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyX29mX3NpdGVtYXA6aG92ZXIKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5oZWFkZXJfb2ZfdGFibGUKLS8qaGVhZGVyIG9mIHRhYmxlcyBpbiBjb250ZW50IHVzdWFsbHkgaGFzIGEgYmFja2dyb3VuZCBjb2xvciBhc3NpZ25lZCB0byB0aGUgY2VsbCovCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyX3JpZ2h0Ci17Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmltYWdlY2FwdGlvbgotLyppbWFnZSBjYXB0aW9uIGluIGNvbnRlbnQgcGFnZSovCi17IAotIGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogIzAwMzM2NgotIH0KLQotCi0uc2lkZWJhciAKLS8qbm90IHVzZWQqLwoteyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDsKLX0KLQotCi1pbnB1dAotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5IDogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotCi1pbnB1dC5pbnB1dDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi1pbnB1dC5pbnB1dG1heDUwCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUsIGJ1dCBOUwotKi8KLXsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLQotaW5wdXQuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQxMzUKLXsKLSAgICB3aWR0aDogMTM1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDE1NQotewotICAgIHdpZHRoOiAxNTVweAotfQotCi0KLWlucHV0LmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotaW5wdXQuaW5wdXQzMDUKLXsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLQotLm1lbnViYXIKLS8qCi13aGl0ZSBmb250IGZvciB0aGUgdGV4dCBpbiB0aGUgdGFibGUgaGVhZGVyLCB1c3VhbGx5IGluIHRoZSAxbmQgbGV2ZWwgb2YgdGhlIHRhYmxlIGhlYWRlciBpZiBodGVyZSBhcmUgMgotMXN0IGxldmVsOiByZWd1bGFyIAotMm5kIGxldmVsOiBib2xkCi0qLwotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0ubWVudWJhcjpob3ZlcgotewotICBjb2xvcjogI2ZmZmZmZgotfQotCi0KLS5tZW51YmFyX2JnCi0vKmJhY2tncm91bmQgb2YgdGFibGUgaGVhZGVyKi8KLXsgICAKLWJhY2tncm91bmQtY29sb3I6IzAwMzM2NjsgCi19Ci0KLQotLm1lbnViYXJfZW1waGFzaXMKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYnJlYWRjcnVtYnMKLTIsYm9sZCBmb250IG9mIHRhYmxlIGhlYWRlciB3aXRoIG1lbnViYXJfYmcoYmx1ZSkgYXMgYmFja2dyb3VuZCBjb2xvciAKLTMsYm9sZCB0ZXh0IG9uIGNvbG9yZWQgYmFja2dyb3VuZCBlZy4gTG9nZ2VkIEluCi0qLwotewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyX2VtcGhhc2lzZGsKLQotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLQotLm1pZGJhcl9iZwotLyp0aGUgbGlnaHQgcG9pbnQgYWJvdmUgdGhlIHRhYnMgKi8KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotfQotCi0KLS5taWRiYXJfZGFyawotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi17IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotCi0KLS5taWRiYXJfbGlnaHQKLS8qCi0xLGxpZ2h0IGNvbG9yIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgdGFicwotMixsaWdodCBjb2xvciBhYm92ZSB0YWJzCi0qLwoteyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotIAotIC5taWRiYXJfbWVkaXVtCi0gLypiYWNrZ3JvdW5kICBvZiAgdGFicyovCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotCi0vKnNoYWRvdyBjb2xvciBiZXR3ZWVuIHRhYnMqLwotIC5taWRiYXJfc2hhZG93Ci17Ci0JYmFja2dyb3VuZDogIzY2NjY2NjsKLX0KLQotCi0ucGFnZV9udW1iZXIKLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotCi0ucGFnZV9zdGVwcwotLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi17IAotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotCi0gLnBhZ2VoZWFkZXIKLSAvKnNhbWUgYXMgY29udGVudF9oZWFkZXJfbGFyZ2UqLwotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExNSU7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAucGFnZWhlYWRlcl9jb2xvcmVkCi0gLypjb2xvcmVkIHRpdGxlIG9mIHRoZSBwYWdlIHVzZWQgd2l0aCBjb250ZW50X2hlYWRlcl9sYXJnZSovCi17Ci0gICAgY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5wb3B1cF9ib3JkZXIKLXsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlciA6IHRoaW4gc29saWQgY2NjY2NjOwotCXBhZGRpbmcgOiAycHg7Ci19Ci0KLS5wb3B1cF90ZXh0Ci17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udCA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnBvcHVwX3RleHQgOiBhY3RpdmUKLXsKLQljb2xvcjogI2NjMDAwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0ucHJvamVjdF9tZW51X2JvcmRlcjEKLS8qcHJvamVjdCBleHBsb3JlciBtZW51IG9wdGlvbnMgYmFja2dyb3VuZCBzdHlsZSBpbiBsZWZ0IG5hdiovCi0gewotCWJvcmRlci10b3AgOiAxcHggc29saWQgI2NjY2NjYzsKLQlib3JkZXItcmlnaHQgOiAxcHggc29saWQgI2NjY2NjYzsKLQliYWNrZ3JvdW5kIDogI2VmZWZlZjsKLX0KLS5wcm9qZWN0X21lbnVfdG9wYm9yZGVyCi0vKnByb2plY3QgZXhwbG9yZXIgbWVudSBvcHRpb25zIGJhY2tncm91bmQgc3R5bGUgaW4gbGVmdCBuYXYqLwotIHsKLQlib3JkZXItdG9wIDogMXB4IHNvbGlkICNjY2NjY2M7CQotCWJhY2tncm91bmQgOiAjZWZlZmVmOwotfQotLnByb2plY3RfbmF2Ci0vKmZpZWxkIHRpdGxlcyBmb3IgcHJvamVjdCBleHBsb3JlciBtZW51IGxvY2F0ZWQgaW4gbGVmdCBuYXYqLwotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLXNlbGVjdAotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIHNlbGVjdCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LWZhbWlseSA6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLQotc2VsZWN0LmlucHV0MjUKLXsKLSAgICB3aWR0aDogMjVweAotfQotCi0KLXNlbGVjdC5pbnB1dDQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MTU1Ci17Ci0gICAgd2lkdGg6IDE1NXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MzA1Ci17Ci0gICAgd2lkdGg6IDMwNXB4OwotfQotCi0vKiBBbGwgc2hpbSBjbGFzc2VzIGFyZSBmb3Igc3BhY2luZyBlbGVtZW50cyB1c2VkIHRvIGNvbnRyb2wgbGF5b3V0LCBlc3BlY2lhbGx5IGluIG9sZGVyIGJyb3dzZXJzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBtYXJnaW5zIGFuZCBwYWRkaW5nICovCi0KLS5zaGltM3gxcHgKLXsKLQlmb250LXNpemU6IDFweDsKLQloZWlnaHQgOiAxcHg7Ci19Ci0KLWEuc2lkZW1lbnVfaGVhZGVyCi0vKm5vdCB1c2VkPyovCi17Ci0gICAgY29sb3I6ICM2NjY2NjY7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLWEuc2lkZW1lbnVfaGVhZGVyOmhvdmVyCi0vKm5vdCB1c2VkPyovCi17Ci0gIGNvbG9yOiAjY2MwMDAwCi19Ci0KLQotLnNpZGVtZW51X2JvbGRsZWZ0Ci0vKgotMSxib2xkIGZvbnQgZm9yIHRoZSBpdGVtcyBpbiBzZWFyY2ggY29udGFpbmVyCi0yLGJvbGQgbGVmTmF2IHVuc2VsZWN0ZWQKLSovCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRsZWZ0X3NlbGVjdGVkCi0vKmJvbGQgZm9udCBsZWZOYXYgc2VsZWN0ZWQqLwotewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9ib2xkcmlnaHQKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGl0ZW1zIGluIHJpZ2h0IGhhbmQgc2lkZQotMixzYW1lIGFzIHNpZGVtZW51X2JvbGRyaWdodAotKi8KLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZHJpZ2h0OmhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRyaWdodF9jb3Vyc2VjYXRhbG9nCi0vKm5vdCB1c2VkKi8KLXsKLQljb2xvcjogIzYzOTYwMjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLQotLnNpZGVtZW51X3N0YW5kYXJkCi0vKmxlZnROYXYgc3RhZGFyZCovCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9zdGFuZGFyZF9zZWxlY3RlZAotLypsZWZ0TmF2IHNlbGVjdGVkKi8KLXsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotCi10ZAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogNzUlOwotfQotCi0KLQotIHRkLmJnX2Rpc2N1c3Npb25fMQotIC8qc2FtZSBhcyBncmV5X21lZGl1bSovCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotCi10ZC5iZ19kaXNjdXNzaW9uXzIKLSAvKnNhbWUgYXMgZ3JleV9saWdodCovCi17IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotdGQuY29udGVudF9jZWxsCi0vKmZvciBlbGltaW5hdGUgdGFibGUgc3RydWN0dXJlICYga2VlcCB0aGUgY2VsbHBhZGRpbmcgaW4gY29udGVudCovCi0gewotCXBhZGRpbmc6IDVweDsKLX0KLQotCi10ZC5kaXZpZGVyCi0vKnRoaW4gbGluZSBkaXZpZGUgdGhlIHBhZ2UgY29sdW1ucyovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0KLXRkLmRpdmlkZXIyCi0vKnRoaW4gbGluZSBkaXZpZGUgdGhlIHBhZ2UgY29sdW1ucyAtIHVzZWQgaW4gdGhlIHZpZXdmcmFtZSBmcmFtZSBwYWdlKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLX0KLQotCi0uZ3JleV9kYXJrCi0vKmRhcmsgZ3JleSBjZWxsIGJhY2tncm91bmQqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotfQotCi10ZC5ncmV5X21lZGl1bTIKLS8qbWVkaXVtIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIHcvIGNlbGwgcGFkZGluZyovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0JcGFkZGluZzogNSBweDsKLX0KLQotdGQuZ3JleV9saWdodDIKLS8qbGlnaHQgZ3JleSBjZWxsIGJhY2tncm91bmQgdy8gY2VsbCBwYWRkaW5nKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLQlwYWRkaW5nOiA1cHg7Ci19Ci0KLS5ncmV5X2xpZ2h0Ci0vKmxpZ2h0IGdyZXkgY2VsbCBiYWNrZ3JvdW5kKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotCi10ZC5jZWxsY29sb3JfbGlnaHQKLS8qbGlnaHQgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBzcGVjaWZpYyBjb2xvciBzY2hlbWUqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljYzAwOwotfQotCi0KLXRkLmNlbGxjb2xvcl9kYXJrCi0vKmRhcmsgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBzcGVjaWZpYyBjb2xvciBzY2hlbWUqLwotewotCWJhY2tncm91bmQtY29sb3I6ICM2MzljMDA7Ci19Ci0KLQotdGQuY2VsbGNvbG9yX3doaXRlCi0vKndoaXRlIGNlbGwgYmFja2dyb3VuZCBjb2xvciovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLS8qYnVsbGV0IGNvbG9yIGZvciB0aGUgbGVmdE5hdiovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNjZDMzMDE7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2dyZXkKLS8qZ3JleSBidWxsZXQgY29sb3IgZm9yIHRoZSBsZWZ0TmF2Ki8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotCi10ZXh0YXJlYQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIG11bHRpbGluZSB0ZXh0YXJlYSB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5IDogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotCi10ZXh0YXJlYS50ZXh0YXJlYTQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dG1heDUwCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUsIGJ1dCBOUwotKi8KLXsKLQl3aWR0aDogMzYwcHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDE5MAotewotICAgIHdpZHRoOiAxOTBweAotfQotCi0KLXRleHRhcmVhLmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQzNTAKLXsKLSAgICB3aWR0aDogMzUwcHgKLX0KLQotCi0udG9wYmFyX3NlcGFyYXRvcgotLypzZXBhcmF0b3Igb2YgdGhlIHRvcE5hdiovCi17Ci0gIGNvbG9yOiAjY2MzMzAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAuOWVtOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLnRvcGxpbmVfY29sb3IKLS8qdGhlIHRoaW4gY29sb3IgbGluZSBvbiB0aGUgdG9wIG9mIHRoZSBicm93c2VyIHdpbmRvdyovCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotIAotIC8qIGJvcnJvd2VkIHN0eWxlcyBmcm9tIGNvbW1vbi5jc3MgdG8gYmUgdHJpbW1lZCBsYXRlciAqLwotIAotIC50b3BmcmFtZWJnIAoteyAgYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMgotfQotCi0udG9wZnJhbWViZ2xpZ2h0IAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1Ci19Ci0KLS50b3BmcmFtZWJnZGFyayAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NAotfQotCi0udG9wZnJhbWViZ2xpZ2h0MiAKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZgotIH0KLSAgIAotIC50b3BmcmFtZWxvZ29iZyAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OQotfQotCi0udG9wbGVmdG5hdgotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCAKLXsgCi1mb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi1mb250LXNpemU6IDEwcHg7IAotdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udG9wcmlnaHRuYXYKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wcmlnaHRuYXZncmV5Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnZlcnRpY2FsYmx1ZQotIHsgCi0gYmFja2dyb3VuZDogIzMzOTljYyAKLSB9Ci0KLSAud2hpdGViZwoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2llNW5zNC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19pZTVuczQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM1MGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2llNW5zNC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBhIGxpbmsgYXMgd2VsbCBhcyBuby1saW5rKi8KLQotYSB7CQotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSAvKiBmb250IGZvciBhY3Rpb24gb24gY29udGVudCBwYWdlIHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZSA7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi19IAotCi1hLmFjdGlvbnNlbGVjdG9yIHsKLSAgIAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWIgeyAKLSAJY29sb3I6ICMwMDAwMDA7Ci0gCWZvbnQtc2l6ZTogMTJweDsKLSAgCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWJzZWxlY3RlZCB7IAotIAljb2xvcjogIzJjMmMyYzsKLSAJZm9udC1zaXplOiAxMnB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJhc2ljIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uOmhvdmVyIHsKLQljb2xvcjogMzMzMzMzOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0vKm1haW4gY29udGFpbmVyICBhY3Rpb25zL2xpbmtzIGZvciBlZGl0aW5nKi8KLWEuY29ubGlua2VkaXQgewotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotYS5jb3B5cmlnaHQgeyAJCi0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19IAotCi1hLmZvcm10YmxoZWFkIHsKLSAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiBsaWdodCBjb2xvdXJlZCBoZWFkaW5nIGxpbmsgZm9yIGRpc2N1c3Npb24gYW5kIHNpbWlsYXIgdXNlcyAtIHdhcyBoZWFkZXJfZGlzY3Vzc2lvbl9saW5rIGluIHByZXZpb3VzIHZlcnNpb25zICovCi0gYS5oZWFkZXJsaW5rbGlnaHQgewotCWNvbG9yOiAJZmZmZmZmOwotCWZvbnQtc2l6ZTogMC45ZW07Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQkKLQotLypib2xkIGxpbmssIGllLCBhZHZhbmNlZCBzZWFyY2ggbGluayBpbiBwZSovCi1hLmxpbmtmdW5jb3B0aW9uIHsgIAkKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotIGEubmF2dHJlZSB7IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLypuYXZ0cmVlIGl0ZW0gb3IgZG9jLCBub2RlcyB0aGF0IGRvbid0IGV4cGFuZCovCi1hLm5hdnRyZWVpdGVtIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLSAKLSAvKiBzaW1wbGUgbWVjaGFuaXNtIHRvIHR1cm4gdGV4dCBkZWNvcmF0aW9uIG9mZiAqLyAgCi1hLm5vbGluZSB7Ci0gCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLWEucG9wdXB0ZXh0IHsJCi0gICBjb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B0ZXh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250IDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucG9wdXB0ZXh0OiBhY3RpdmUgewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0KLWEuc21hbGwgewkKLQlmb250LXNpemU6IDExcHg7CQotfQotCi1hLnNtYWxsYiB7CQotICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwkKLX0KLQotYS50b3BiYXIgewotICBjb2xvcjogIzY2NjY2NjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlZCBhcyBoaWdobGlnaHRlZCBkZXNjcmlwdGlvbiBhYm92ZSB0YWJsZXMqLwotLmFjY2VudGNvbG9yIHsKLQljb2xvciA6ICNjYzMzMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLSAvKiBiZ2NvbG9yICBmb3IgYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi0uYWN0aW9uYmcgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0uYWN0aW9uc2VsZWN0b3IgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS5hY3Rpb25zZWxlY3RvcmRpcyB7Ci1iYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotCWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWIgeyAKLSAgIGZvbnQtd2VpZ2h0IDogYm9sZDsKLSB9Ci0gIAotLmJhc2VsaW5laXRhbGljcyB7Ci0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJnYmxhY2sgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotIH0KLSAKLSAvKiBiYXNpYyBjb2x1bW4gYmFja2dyb3VuZCBjb2xvdXIgZm9yIGRpc2N1c3Npb25zLCBmaWxlcywgb3RoZXIgc3VjaCB0YWJ1bGF0ZWQgZGF0YSAqLwotLmJnY29sdW1uYmFzaWMgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLS5iZ3doaXRlIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotIAotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjZmZmZmZmOyAgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwkJCi0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tcmlnaHQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7CQotfQotCi0uYm9sZCB7IAotICAgZm9udC13ZWlnaHQgOiA2MDA7Ci0gfQotCi0uYm9yZGVyZ3JheSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0gfQotCi0uYm90dG9tYmFyZGFyayB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDMzNjY7Ci0gfQotICAKLS5ib3R0b21iYXJsaWdodCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2M7Ci0gfQotCi0uYm90dG9tYmFyc2hhZG93IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0KLS5icmVhZGNydW1ic3sgCi1jb2xvcjogIzMzNjY5OTsKLWZvbnQtd2VpZ2h0OiA2MDA7Ci0gfQotCi0uYnJlYWRjcnVtYnMyeyAKLWNvbG9yOiAjZmZmZmZmOwotZm9udC1zaXplOiAxMXB4OwotIH0gCi0KLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfSAKLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMTJweDsKLSB9Ci0gCi0gIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMgeyAJCi0JZm9udC1zaXplOiAxMXB4OwkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKm1haW4gY29udGFpbmVyIGhlYWRlciovCi0uY29uaGVhZCB7IAotY29sb3I6ICNjYzMzMDA7Ci1mb250LXdlaWdodDogNjAwOwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLSB9Ci0gCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWwgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLSAKLS8qbWFpbiBjb250YWluZXIgZGF0YSBsYWJlbHMgaW4gYm9sZCovCi0uY29ubGFiZWxib2xkIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gfSAgCi0gCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkcmlnaHQgbW92aW5nIGZvcndhcmQqLwotLmNvbnJib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypoZWFkZXIgZm9yIHJpZ2h0IGhhbmQgY29udGFpbmVyKi8KLS5jb25yaGVhZCB7Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyptYWluIGNvbnRhaW5lciB0YWJsZSBoZWFkZXIqLwotLmNvbnRibGhlYWQgeyAgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDExcHg7CQotICAgIGZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5jb250ZW50eyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qIGFkZGVkIGZvciB0ZXh0IHJlcHJlc2VudGluZyBkaXNhYmxlZCBmdW5jdGlvbnMuICovCi0uY29udGVudGRpc2FibGVkIHsKLQljb2xvcjogI2NjY2NjYzsKLX0KLQotLyogZm9udCBmb3IgYm9sZCB0ZXh0ICovCi0uY29udGVudGVtcGhhc2lzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogdXNlZCB0ZXh0IHJlbWluZGluZyB1c2VyIHRoYXQgdGhlcmUgaXMgcmVxdWlyZWQgY29udGVudCAqLwotLmNvbnRlbnRyZXF1aXJlZCB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotLmNvcHlyaWdodCB7IAotY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19Ci0KLS8qYmxhY2sgY29weXJpZ2h0Ki8KLS5jb3B5cmlnaHRiIHsgCi1jb2xvciA6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTBweDsKLX0KLQotZGQgeyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi1tYXJnaW4tbGVmdDogLTFweDsKLSB9Ci0gCi0uZGlhbGdieHNoYWRvdzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMzsKLSB9Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLSAuZGlhbG9ndWVib3htZWRpdW0geyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOGI4YjhiOwotIH0KLSAKLSAuZGlhbG9ndWVib3h0aXRsZSB7CSAgIAotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXNpemU6IDExcHg7CQotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLyp0ZXh0IGZvciBkaXNhYmxlZCBidXR0b25zKi8KLS5kaXNhYmxleyAKLWNvbG9yOiAjOTk5OTk5OwotZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDExcHg7ICAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0gCi1kaXZ7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gfSAKLSAKLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnR7IAotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLSB9ICAKLSAKLWRpdi5tYXJnaW5zIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyNXB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAKLWRpdi5tYXJnaW5zMjAgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDIwcHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgICAKLSAKLSAvKmFkZHMgMTAgcHggcGFkZGluZyovCi0gZGl2LnBhZDEweyAKLSBwYWRkaW5nOiAxMHB4OyAKLSAgfQotCi0uZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjlmMDsKLX0KLQotZGx7ICAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxMnB4OyAgIAotCX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgeyAKLW1hcmdpbi1ib3R0b206IC0xcHg7Ci0gfSAgCi0KLS5kb2Nib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7ICAgICAgIAotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKmZvciBhcHBsZXQgZG93bmxvYWQgc3BsYXNoIHBhZ2UqLwotLmRvd25sb2FkeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVlZWU7Ci0gfQotCi0uZXJyb3Jtc2cgewotCWNvbG9yIDogI2NjMDAwMDsJCi19IAotIAotLyoKLWNvbG9yZWQgZm9udAotZGVzY3JpcHRpb24gYWJvdXQgdGhlIHVzZXIgc3RhdHVzLiBlcS4gInN1YnNjcmlwdGlvbnMgYXJlIHVwZGF0ZWQiCi1pdCdzIHVzdWFsbHkgb24gdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHBhZ2VzCi0qLwotLmZvb3RlcmJvbGQgewotCWNvbG9yIDogI2E0YTRhNDsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290ZXJib2xkY29sb3JlZCB7Ci0JY29sb3IgOiAjZmY2NTAwOwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5mb290aW5kaWNhdG9yIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7ICAgICAgIAotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp0aGUgKiBzeW1ib2wgaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZpZWxkICovCi0uZm9vdHN0YXJpbmRleCB7Ci0JY29sb3IgOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKm1vdmUgdG8gZGVzaWduX3BlKi8KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwkKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1ib3R0b206IDJweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMTdweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlIGhlYWRlcjEgaW5zdGVhZCovCi0uaDEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKmRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oMXJvb3R7ICAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLQotLyp1c2VkIGluIGNjLCBjcSwgc2wqLyAKLWgxIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLy8qdXNlIGhlYWRlcjIgaW5zdGVhZCovCi0uaDIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLWkgewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi1pbnB1dCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0gCi0KLWlucHV0LmlucHV0MTM1IHsKLQl3aWR0aDogMTM1cHgKLX0gCi0KLS8qIDEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFICovCi1pbnB1dC5tYXg1MCB7Ci0Jd2lkdGg6IDM2MHB4OwotfQotCi1pbnB1dC5weDI1IHsKLSAgICB3aWR0aDogMjVweDsKLX0KLQotaW5wdXQucHg0NSB7Ci0gICAgd2lkdGg6IDQ1cHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotICAgIHdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5weDEzNSB7Ci0gICAgd2lkdGg6IDEzNXB4OwotfQotCi1pbnB1dC5weDE1NSB7Ci0gICAgd2lkdGg6IDE1NXB4OwotfQotCi1pbnB1dC5weDIzMCB7Ci0gICAgd2lkdGg6IDIzMHB4OwotfQotCi1pbnB1dC5weDMwNSB7Ci0gICAgd2lkdGg6IDMwNXB4OwotfQotCi0ubGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5sZWZ0bWVudWJ1bGxldCB7IAotYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLSB9Ci0KLS5sZWZ0bWVudWJ1bGxldGFjdGl2ZSB7IAotYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLSB9Ci0JCi0KLS5sZWZ0bmF2aGVhZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxM3B4OwkKLQlmb250LXdlaWdodDogYm9sZDsJCi19IAotCi0ubGVmdG5hdmxhYmVsIHsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC13ZWlnaHQgOiA2MDA7Ci1mb250LXNpemU6IDExcHg7Ci0gfQotCi0ubGlnaHRncmF5IHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTRlNGU0OwotIH0KLSAKLS5tZW51YmFyIHsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0vKm1lbnViYXIgd2l0aGluIHRvcCBvZiBjb250ZW50IHBhZ2UgICovCi0ubWVudWJhcm1pZHsgCi1mb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotIH0KLQotLyoKLTEsYm9sZCBmb250IGZvciB0aGUgbGFzdCBpdGVtIG9mIHRoZSBicmVhZGNydW1icwotMixib2xkIGZvbnQgb2YgdGFibGUgaGVhZGVyIHdpdGggbWVudWJhcl9iZyhibHVlKSBhcyBiYWNrZ3JvdW5kIGNvbG9yIAotMyxib2xkIHRleHQgb24gY29sb3JlZCBiYWNrZ3JvdW5kIGVnLiBMb2dnZWQgSW4KLSovCi0ubWVudWJhcmVtcGhhc2lzIHsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0ubWVudWJhcjpob3ZlciB7Ci0gIGNvbG9yOiAjZmZmZmZmCi19IAotIAotLm1pZGJhcmJnIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotIAotLyp0b3BuYXYqLyAKLS5taWRiYXJsaWdodCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2M7Ci0gfQotIAotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi0gLm1pZGJhcmRhcmsgeyAKLQliYWNrZ3JvdW5kOiAjMDAzMzY2OwotIH0KLSAKLSAvKnRvcG5hdiovIAotIC5taWRiYXJtZWQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0KLSAKLSAvKmJhY2tncm91bmQgIG9mICB0YWJzKi8gCi0gLm1pZGJhcm1lZGl1bSB7IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotIAotIC5taWRiYXJzaGFkb3cgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OwotIH0gCi0gIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZGxlZnQgbW92aW5nIGZvcndhcmQqLwotLm5hdmxlZnRib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypsZWZ0IG5hdiBzdWJtZW51Ki8KLS5uYXZsZWZ0c3ViIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLS5ub25hY3RpdmV0YWIgewotCWNvbG9yOiAjYjRiNGI0OwotCWZvbnQtc2l6ZTogMTJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbm90ZXMvIGRlc2NyaXB0aW9uIG9mIGljb24gKi8KLS5ub3Rlc3sgIAotIGZvbnQtc2l6ZTogMTFweDsKLSBmb250LXdlaWdodCA6IDQwMDsJCi19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi19Ci0KLS5wYWdlYm9sZCB7IAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwkKLSB9Ci0gCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0gLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzIHsgCi0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi0ucG9wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplIDogMTJweDsKLQlmb250LXdlaWdodCA6IDIwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5wb3BiYWNrZ3JvdW5kIHsKLQotCWJhY2tncm91bmQ6ICNkNmQzY2U7Ci19Ci0KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCBjY2NjY2M7IAotCWxlZnQ6IDIxMHB4OyAKLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsJCi0gfQotCi0gLyogdXNlIHBvcGxlZnRtZW51IGluc3RlYWQgb2YgdGhpcyBvbmUqLwotLnBvcHVwYm9yZGVyIHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlciA6IHRoaW4gc29saWQgY2NjY2NjOwotCXBhZGRpbmcgOiAycHg7Ci19Ci0KLS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucHJvamVjdGF0dCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotCWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmRhdGUgYXNzb2NpYXRlZCB3aXRoIGFydGljbGUgcmF0aW5ncyovCi0ucmF0aW5nc2RhdGUKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXNlbGVjdCB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotc2VsZWN0LnNlbHB4MTQ0IHsKLSAgICB3aWR0aDogMTQ0cHg7Ci19Ci0KLS8qIC5zaWRlbWVudV9ib2xkbGVmdCByZXBsYWNlIHdpdGggLmxlZnRtZW51Ym9sZCovIAotCi0vKiAuc2lkZW1lbnVfYm9sZGxlZnRfc2VsZWN0ZWQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWFjdGl2ZSovCi0KLS8qIC5zaWRlbWVudV9idWxsZXRfY29sb3JlZCByZXBsYWNlIHdpdGggLmxlZnRtZW51YnVsbGV0YWN0aXZlKi8KLSAKLS8qLnNpZGVtZW51X2J1bGxldF9ncmV5IHJlcGxhY2Ugd2l0aCBsZWZ0bWVudWJ1bGxldCovCi0KLS5zaWRlbWVudWJvbGRsZWZ0IHsKLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19IAotCi0uc2lkZW1lbnVib2xkbGVmdHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmQgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmRzZWxlY3RlZCB7Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc21hbGx0ZXh0IHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIgeyAKLQotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDEzcHg7CQotICAgIGZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotfQotCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLXRkLmFjdGl2ZXRhYiB7IAotIAliYWNrZ3JvdW5kLWNvbG9yOiAjYzRjNGM0OwotICB9Ci0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLXRkLmFjdGl2ZXRhYnNlbGVjdGVkIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNkZGRkZGQ7Ci0gIH0KLSAgCi0gLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0KLXRkLmJ1dHRvbmhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLX0KLQotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNmQ2ZDZkOwotfQotIAotLyogZGVzaWduIGVsZW1lbnQgcmFyZWx5IHVzZWQgZm9yIGxpbmUgY29sb3VyIGluIGNlcnRhaW4gZGVjb3JhdGl2ZSB0YWJsZXMgKi8KLXRkLmRlc2lnbjEgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0gCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovCi10ZC5kaXZpZGVyZGltZW5zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYmRiZGJkOwotfQotIAotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQubm9uYWN0aXZldGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGdyYXkqLwotdGQudGJsaGlnaGx0IHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotICAgcGFkZGluZzogMnB4OwotIH0KLSAKLSB0ZC50YmxoaWdobHQxIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotIH0KLSAKLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQyIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0gCi0KLS8qZGFyayBncmV5IGNlbGwgYmFja2dyb3VuZCBhbmQgYm9sZCB0ZXh0ICovCi0udGRkYXJrYm9sZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsJCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS50ZGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDJweDsKLX0KLQotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotIAotIAotdGV4dGFyZWEgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXRleHRhcmVhLnB4MzgwewotIHdpZHRoOiAzODBweDsgCi0gfQotCi0udGV4dGVycm9ybXNnIHsKLQljb2xvciA6IGNjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExMCU7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50ZXh0Z3JheSB7ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS50b3BiYXJkaXZpZGVyIHsgCi0JYmFja2dyb3VuZDogIzMzOTljYyAKLX0KLQotLnRvcGJhcmRpdmlkZXJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kOiAjYWRkNmViCi0gfSAgCi0KLS50b3BiYXJzZXBhcmF0b3IgewotICBjb2xvcjogI2NjMzMwMDsgIAotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0gCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1OwotfQotCi0udG9wZnJhbWVoaWdobGlnaHRncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MiB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodDJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5OwotIH0gCi0gCi0udG9wZnJhbWVsb2dvYmcgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLnRvcGZyYW1lbG9nb2JnZ3JleWVkIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OWMyZDY7Ci19Ci0KLS50b3BmcmFtZXNoYWRvdyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0udG9wZnJhbWVzaGFkb3dncmV5ZWQgeyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wbGVmdG5hdiB7CQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBicmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmJvbGRncmV5ZWQgeyAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmdyZXllZCB7CQotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JfQotCi0udG9wbGluZWNvbG9yIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLSB9CQotCQotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gLyogdGhpcyB3YXMgaW5pdGlhbGx5IGRlY2xhcmVkIHRoZSBzYW1lIGNvbG91ciBhcyB0aGUgY2xhc3MgdG9wZnJhbWUgYmcgYnV0IGJlY2F1c2UgaXQgbGllcyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbmFsIGFyZWEsIGhhcyBiZWVuIHJlY3JlYXRlZCBoZXJlICAqLwotdHIuYmdtaWRmcmFtZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotdGQuc2lkZW1lbnVidWxsZXRncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0KLXRkLnNpZGVtZW51YnVsbGV0Y29sb3JlZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotLypsaXN0LXN0eWxlLWltYWdlOiB1cmwoaW1hZ2VzL2Rvd25idXR0b24uZ2lmKTsqLwotdWwgewkKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KLSAKLQotLnZvYiB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOwotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0udm9iYm90dG9tIHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU2bnM2LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2llNm5zNi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZGM0NmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU2bnM2LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDExODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzICBuby1saW5rICovCi0KLWEgewkKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gLyogZm9udCBmb3IgYWN0aW9uIG9uIGNvbnRlbnQgcGFnZSB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2UgO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbiB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotfSAKLQotYS5hY3Rpb25zZWxlY3RvciB7ICAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7CQotfQotCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLWEuYWN0aXZldGFiIHsgCi0gCWNvbG9yOiAjMDAwMDAwOwotIAlmb250LXNpemU6IDEycHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWJzZWxlY3RlZCB7IAotIAljb2xvcjogIzJjMmMyYzsKLSAJZm9udC1zaXplOiAxMnB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJhc2ljIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uOmhvdmVyIHsKLQljb2xvcjogMzMzMzMzOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0vKm1haW4gY29udGFpbmVyICBhY3Rpb25zL2xpbmtzIGZvciBlZGl0aW5nKi8KLWEuY29ubGlua2VkaXQKLXsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLWEuY29weXJpZ2h0IHsgCQotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LXNpemUgOiAxMHB4OwotfSAKLQotYS5mb3JtdGJsaGVhZCB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogbGlnaHQgY29sb3VyZWQgaGVhZGluZyBsaW5rIGZvciBkaXNjdXNzaW9uIGFuZCBzaW1pbGFyIHVzZXMgLSB3YXMgaGVhZGVyX2Rpc2N1c3Npb25fbGluayBpbiBwcmV2aW91cyB2ZXJzaW9ucyAqLwotIGEuaGVhZGVybGlua2xpZ2h0IHsKLQljb2xvcjogCWZmZmZmZjsKLQlmb250LXNpemU6IDAuOWVtOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0JCi0KLS8qYm9sZCBsaW5rLCBpZSwgYWR2YW5jZWQgc2VhcmNoIGxpbmsgaW4gcGUqLwotYS5saW5rZnVuY29wdGlvbiB7ICAJCQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCQotYS5uYXZ0cmVleyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYywgbm9kZXMgdGhhdCBkb24ndCBleHBhbmQqLwotYS5uYXZ0cmVlaXRlbXsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLyogc2ltcGxlIG1lY2hhbmlzbSB0byB0dXJuIHRleHQgZGVjb3JhdGlvbiBvZmYgKi8KLWEubm9saW5lIHsKLSAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotYS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHRleHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B1cHRleHQ6YWN0aXZlewkKLWNvbG9yOiAjY2MwMDAwOwotfQotCi1hLnNtYWxsIHsJCi0JZm9udC1zaXplOiAxMXB4OwkKLX0KLQotYS5zbWFsbGIgewkKLSAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsJCi19Ci0KLWEudG9wYmFyewotICBjb2xvcjogIzY2NjY2NjsKLSAgIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLyp1c2VkIGFzIGhpZ2hsaWdodGVkIGRlc2NyaXB0aW9uIGFib3ZlIHRhYmxlcyovCi0uYWNjZW50Y29sb3IgewotCWNvbG9yIDogI2NjMzMwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotIC8qIGJnY29sb3IgIGZvciBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLS5hY3Rpb25iZyB7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmFjdGlvbnNlbGVjdG9yIHsKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0uYWN0aW9uc2VsZWN0b3JkaXMgewotYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogI2NjY2NjYzsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1iIHsgCi0gICBmb250LXdlaWdodCA6IGJvbGQ7Ci0gfQotIAotLmJhc2VsaW5laXRhbGljcyB7Ci0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJnYmxhY2sgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0gLyogYmFzaWMgY29sdW1uIGJhY2tncm91bmQgY29sb3VyIGZvciBkaXNjdXNzaW9ucywgZmlsZXMsIG90aGVyIHN1Y2ggdGFidWxhdGVkIGRhdGEgKi8KLS5iZ2NvbHVtbmJhc2ljIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9Ci0gCi0uYmd3aGl0ZSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfSAKLSAKLSAvKiBzaXplIGlucHV0IGZvciBiYXNpYyB0YWdzIHN1Y2ggYXMgcCBhbmQgbGkgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIHRkICovICAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjZmZmZmZmOyAgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwkJCi0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLS5ib2xkIHsgCi0gICBmb250LXdlaWdodCA6IDYwMDsKLSB9Ci0KLSAuYm9yZGVyZ3JheSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0gfQotIAotIC5ib3R0b21iYXJkYXJreyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAzMzY2OwotIH0KLSAKLS5ib3R0b21iYXJsaWdodHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3d7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotCi0uYnJlYWRjcnVtYnN7IAotY29sb3I6ICMzMzY2OTk7Ci1mb250LXdlaWdodDogNjAwOwotIH0gCi0gCi0uYnJlYWRjcnVtYnMyeyAKLWNvbG9yOiAjZmZmZmZmOwotZm9udC1zaXplOiAxMXB4OwotIH0gCi0gIAotIC8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfSAKLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMTJweDsKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS5jb21tZW50cyB7IAkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCWZvbnQtc2l6ZTogMTFweDsJCi19Ci0KLS8qbWFpbiBjb250YWluZXIgaGVhZGVyKi8KLS5jb25oZWFkeyAKLWNvbG9yOiAjY2MzMzAwOwotZm9udC13ZWlnaHQ6IDYwMDsKLXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0gfQotCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWx7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9IAotCi0vKm1haW4gY29udGFpbmVyIGRhdGEgbGFiZWxzIGluIGJvbGQqLwotLmNvbmxhYmVsYm9sZCB7IAotYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLWZvbnQtd2VpZ2h0OiBib2xkOwotIH0gIAotIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZHJpZ2h0IG1vdmluZyBmb3J3YXJkLCB1c2UgZm9yIGxpbmtzIGFuZCBub24tbGlua3MqLwotLmNvbnJib2xkCi17Ci0JY29sb3I6ICMwMDAwMDA7CQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfSAKLSAKLSAKLS8qaGVhZGVyIGZvciByaWdodCBoYW5kIGNvbnRhaW5lciovCi0uY29ucmhlYWQgewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qbWFpbiBjb250YWluZXIgdGFibGUgaGVhZGVyKi8KLS5jb250YmxoZWFkIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDcwJTsJCi0gICAgZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmNvbnRlbnR7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLSB9Ci0KLSAvKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0uY29udGVudGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLyogYWRkZWQgZm9yIHRleHQgcmVwcmVzZW50aW5nIGRpc2FibGVkIGZ1bmN0aW9ucy4gKi8KLS5jb250ZW50ZGlzYWJsZWQgewotCWNvbG9yOiAjY2NjY2NjOwotfQotCi0vKiBmb250IGZvciBib2xkIHRleHQgKi8KLS5jb250ZW50ZW1waGFzaXMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiB1c2VkIHRleHQgcmVtaW5kaW5nIHVzZXIgdGhhdCB0aGVyZSBpcyByZXF1aXJlZCBjb250ZW50ICovCi0uY29udGVudHJlcXVpcmVkIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXdlaWdodDogNTAwOwotfQotCi0uY29weXJpZ2h0IHsgCi0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19Ci0KLS8qYmxhY2sgY29weXJpZ2h0Ki8KLS5jb3B5cmlnaHRiIHsgCi1jb2xvciA6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTBweDsKLX0KLQotZGQgeyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi1tYXJnaW4tbGVmdDogLTFweDsKLSB9Ci0gCi0uZGlhbGdieHNoYWRvdzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgewotIAliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyCi19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzMKLSB9Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS5kaWFsb2d1ZWJveG1lZGl1bSB7IAotCWJhY2tncm91bmQtY29sb3I6ICM4YjhiOGIKLSB9Ci0gCi0uZGlhbG9ndWVib3h0aXRsZSB7CSAgIAotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci19Ci0KLS8qdGV4dCBmb3IgZGlzYWJsZWQgYnV0dG9ucyovCi0uZGlzYWJsZXsgCi1jb2xvcjogIzk5OTk5OTsKLWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxMXB4OyAgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfSAKLQotIGRpdnsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSB9IAotCi0vKnVzZWQgdG8gYWZmZWN0IHJpZ2h0IG1hcmdpbiovIAotZGl2Lm1hcmdpbnJ0eyAKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci0gfSAKLSAKLWRpdi5tYXJnaW5zIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyNXB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAgCi1kaXYubWFyZ2luczIwIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyMHB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotIC8qYWRkcyAxMCBweCBwYWRkaW5nKi8KLSBkaXYucGFkMTB7IAotIHBhZGRpbmc6IDEwcHg7IAotICB9Ci0gIAotLmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0KLWRseyAgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTJweDsgICAKLQl9Ci0JCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovICAKLSBkbC5kYXRhIHsgCi1tYXJnaW4tYm90dG9tOiAtMXB4OwotIH0gCi0gCi0uZG9jYm9sZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OyAgICAgICAKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypmb3IgYXBwbGV0IGRvd25sb2FkIHNwbGFzaCBwYWdlKi8KLS5kb3dubG9hZHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZWVlOwotIH0KLSAKLS5lcnJvcm1zZyB7Ci0JY29sb3IgOiAjY2MwMDAwOwkKLX0gIAotCi0vKgotY29sb3JlZCBmb250Ci1kZXNjcmlwdGlvbiBhYm91dCB0aGUgdXNlciBzdGF0dXMuIGVxLiAic3Vic2NyaXB0aW9ucyBhcmUgdXBkYXRlZCIKLWl0J3MgdXN1YWxseSBvbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcGFnZXMKLSovCi0uZm9vdGVyYm9sZCB7Ci0JY29sb3IgOiAjYTRhNGE0OwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RlcmJvbGRjb2xvcmVkIHsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmZvb3RpbmRpY2F0b3IgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsgICAgICAgCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290c3RhcmluZGV4IHsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tYm90dG9tOiAycHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotfQotCi0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlIGhlYWRlcjEgaW5zdGVhZCovCi0uaDEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKmRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oMXJvb3R7ICAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXNlZCBpbiBjYywgY3EsIHNsKi8gIAotaDEgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZSBoZWFkZXIyIGluc3RlYWQqLwotLmgyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7IAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTlweDsKLQlmb250LXdlaWdodDogNDAwOwkgCQotfQotCi1pIHsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7IAotIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19IAotCi0vKiAxLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSAqLwotaW5wdXQubWF4NTAgewotCXdpZHRoOiAzNjBweDsKLX0KLQotaW5wdXQucHgyNSB7Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotaW5wdXQucHg0NSB7Ci0KLSAgICB3aWR0aDogNDVweAotfQotCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUKLSovCi1pbnB1dC5weDg1IHsKLSAgICB3aWR0aDogODVweAotfQotCi1pbnB1dC5pbnB1dDEzNSB7Ci0Jd2lkdGg6IDEzNXB4Ci19Ci0KLWlucHV0LnB4MTM1IHsKLSAgICB3aWR0aDogMTM1cHgKLX0KLQotaW5wdXQucHgxNTUgewotICAgIHdpZHRoOiAxNTVweAotfQotCi1pbnB1dC5weDIzMCB7Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLWlucHV0LnB4MzA1IHsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLQotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0ubGVmdG1lbnVidWxsZXQgeyAKLWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci0gfQotIAotLmxlZnRtZW51YnVsbGV0YWN0aXZlIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotIH0gCi0gCi0ubGVmdG5hdmhlYWQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLQlmb250LXNpemU6IDEzcHg7CQotfSAKLQotLmxlZnRuYXZsYWJlbCB7Ci1jb2xvcjogIzAwMDAwMDsKLWZvbnQtd2VpZ2h0IDogNjAwOwotZm9udC1zaXplOiAxMXB4OwotIH0KLQotIC5saWdodGdyYXkgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7Ci0gfQotCi0ubWVudWJhciB7Ci0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNDAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotCi0ubWVudWJhcjpob3ZlciB7Ci0gIGNvbG9yOiAjZmZmZmZmCi19IAotCi0vKm1lbnViYXIgd2l0aGluIHRvcCBvZiBjb250ZW50IHBhZ2UgICovCi0ubWVudWJhcm1pZHsgCi1mb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotIH0KLSAKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYnJlYWRjcnVtYnMKLTIsYm9sZCBmb250IG9mIHRhYmxlIGhlYWRlciB3aXRoIG1lbnViYXJfYmcoYmx1ZSkgYXMgYmFja2dyb3VuZCBjb2xvciAKLTMsYm9sZCB0ZXh0IG9uIGNvbG9yZWQgYmFja2dyb3VuZCBlZy4gTG9nZ2VkIEluCi0qLwotIC5tZW51YmFyZW1waGFzaXMgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyOmhvdmVyIHsKLSAgY29sb3I6ICNmZmZmZmYKLX0gCi0KLS5taWRiYXJiZyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfQotICAKLS8qdG9wbmF2Ki8gCi0ubWlkYmFybGlnaHQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi0ubWlkYmFyZGFyayB7IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotIAotLyp0b3BuYXYqLyAKLSAubWlkYmFybWVkIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLSB9Ci0gCi0gLypiYWNrZ3JvdW5kICBvZiAgdGFicyovCi0ubWlkYmFybWVkaXVtIHsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0gLm1pZGJhcnNoYWRvdyB7IAotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci0gfQotIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZGxlZnQgbW92aW5nIGZvcndhcmQqLwotLm5hdmxlZnRib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypsZWZ0IG5hdiBzdWJtZW51Ki8KLS5uYXZsZWZ0c3ViCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotICAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotLm5vbmFjdGl2ZXRhYiB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1zaXplOiAxMnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypub3Rlcy8gZGVzY3JpcHRpb24gb2YgaWNvbiAqLwotLm5vdGVzeyAgCi0gZm9udC1zaXplOiAxMXB4OwotIGZvbnQtd2VpZ2h0IDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLX0KLQotLnBhZ2Vib2xkIHsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7CQotIH0KLSAKLSAvKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0gLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzIHsgCi0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi0ucG9wIHsKLQlmb250LXNpemUgOiAxMnB4OwotCWZvbnQtd2VpZ2h0IDogMjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnBvcGJhY2tncm91bmQgewotCWJhY2tncm91bmQ6ICNkNmQzY2U7Ci19Ci0KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCBjY2NjY2M7IAotCWxlZnQ6IDIxMHB4OyAKLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsKLSB9Ci0KLSAvKiB1c2UgcG9wbGVmdG1lbnUgaW5zdGVhZCBvZiB0aGlzIG9uZSovCi0gLnBvcHVwYm9yZGVyIHsJCi0JYmFja2dyb3VuZDogI2YwZjBmMDsKLQlib3JkZXIgOiB0aGluIHNvbGlkIGNjY2NjYzsKLQlwYWRkaW5nIDogMnB4OwotfQotCi0ucG9wdXB0ZXh0IHsJCi0gICBjb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIAotLnByb2plY3RhdHQgeyAKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7IAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLQljb2xvcjogI2NkMzMwMTsKLX0KLQotLypkYXRlIGFzc29jaWF0ZWQgd2l0aCBhcnRpY2xlIHJhdGluZ3MqLwotLnJhdGluZ3NkYXRlCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1zZWxlY3QgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXNlbGVjdC5zZWxweDE0NCB7Ci0gICAgd2lkdGg6IDE0NHB4OwotfQotCi0vKiAuc2lkZW1lbnVfYm9sZGxlZnQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWJvbGQqLyAKLQotLyogLnNpZGVtZW51X2JvbGRsZWZ0X3NlbGVjdGVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVhY3RpdmUqLwotIAotLyogLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVidWxsZXRhY3RpdmUqLwotIAotLyouc2lkZW1lbnVfYnVsbGV0X2dyZXkgcmVwbGFjZSB3aXRoIGxlZnRtZW51YnVsbGV0Ki8KLSAKLS5zaWRlbWVudWJvbGRsZWZ0IHsKLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19IAotCi0uc2lkZW1lbnVib2xkbGVmdHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmQgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmRzZWxlY3RlZCB7Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc21hbGx0ZXh0IHsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIgeyAgCi0JY29sb3I6ICMwMDAwMDA7CQotCWZvbnQtc2l6ZTogMTNweDsJCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLX0JCi0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFiIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFic2VsZWN0ZWQgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKLSAgfQotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLQotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ZDZkNmQ7Ci19Ci0gIAotLyogZGVzaWduIGVsZW1lbnQgcmFyZWx5IHVzZWQgZm9yIGxpbmUgY29sb3VyIGluIGNlcnRhaW4gZGVjb3JhdGl2ZSB0YWJsZXMgKi8KLXRkLmRlc2lnbjEgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0KLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8KLXRkLmRpdmlkZXJkaW1lbnMgewotCWJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7Ci19Ci0KLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLSB0ZC5ub25hY3RpdmV0YWIgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gZ3JheSovCi10ZC50YmxoaWdobHQgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICBwYWRkaW5nOiAycHg7Ci0gfQotIAotIHRkLnRibGhpZ2hsdDEgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gfQotIAotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDIgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLQotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLS50ZGRhcmtib2xkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0udGRsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLQlwYWRkaW5nOiAycHg7Ci19Ci0KLS50ZGxpZ2h0MSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotdGV4dGFyZWEgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXRleHRhcmVhLnB4MzgwewotIHdpZHRoOiAzODBweDsgCi0gfQotCi0udGV4dGVycm9ybXNnIHsKLQljb2xvciA6IGNjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExMCU7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50ZXh0Z3JheSB7ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS50b3BiYXJkaXZpZGVyIHsgCi0JYmFja2dyb3VuZDogIzMzOTljYyAKLX0KLQotLnRvcGJhcmRpdmlkZXJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kOiAjYWRkNmViCi19ICAKLQotLnRvcGJhcnNlcGFyYXRvciB7Ci0gIGNvbG9yOiAjY2MzMzAwOyAgCi0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1OwotfQotCi0udG9wZnJhbWVoaWdobGlnaHRncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MiB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0gCi0udG9wZnJhbWVoaWdobGlnaHQyZ3JleWVkIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTsKLX0gCi0KLS50b3BmcmFtZWxvZ29iZyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0udG9wZnJhbWVsb2dvYmdncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5YzJkNjsKLX0KLQotLnRvcGZyYW1lc2hhZG93IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd2dyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wbGVmdG5hdiB7CQotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmJvbGRncmV5ZWQgeyAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmdyZXllZCB7CQotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsaW5lY29sb3IgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0KLQotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wcmlnaHRuYXZncmV5IAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIHRoaXMgd2FzIGluaXRpYWxseSBkZWNsYXJlZCB0aGUgc2FtZSBjb2xvdXIgYXMgdGhlIGNsYXNzIHRvcGZyYW1lIGJnIGJ1dCBiZWNhdXNlIGl0IGxpZXMgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb25hbCBhcmVhLCBoYXMgYmVlbiByZWNyZWF0ZWQgaGVyZSAgKi8KLXRyLmJnbWlkZnJhbWUgewotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLXRkLnNpZGVtZW51X2J1bGxldF9ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0KLXRkLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyovCi11bCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19Ci0KLS52b2IKLXsKLQlmb250LXNpemU6IDE1MCU7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS52b2Jib3R0b20KLXsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfbmV0c2NhcGU0LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX25ldHNjYXBlNC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzVkNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfbmV0c2NhcGU0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDExNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi10ZC5zcGFuLmNvbnRlbnRfYmFzaWMKLSB7Ci0JcGFkZGluZy1sZWZ0IDogNXB4OwotfQotCi1hCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLQotLmFjY2VudGNvbG9yCi17Ci0JY29sb3IgOiAjY2MzMzAwOwotCWZvbnQtc2l6ZSA6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IGEuYnJlYWRjcnVtYnMKLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi0KLWEuYnJlYWRjcnVtYnM6aG92ZXIKLXsKLSAgY29sb3I6ICNmZmZmZmYKLX0KLQotCi1hLmxpbmtfcmV2ZXJzZTpob3ZlcgotewotICAgIGJhY2tncm91bmQ6ICNkY2RjZGM7Ci19Ci0KLQotYS5saW5rX2NvbnRhaW5lcl9lZGl0b3IKLXsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLQotYS5saW5rX2J5bGluZQotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZSA6IC45ZW07Ci19Ci0KLQotYS5saW5rX2Z1bmNfb3B0aW9uCi17Ci0gIAlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotYS5saW5rdHlwZWQKLXsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLWEubWVudWJhcl9saW5rCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotYS5tZW51YmFyX2xpbms6aG92ZXIKLXsKLQljb2xvcjogI2ZmZmZmZjsKLX0KLQotYS5uYXZ0cmVlCi17IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotYS5wcm9qZWN0X25hdgotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci1hLnByb2plY3RfbmF2dHJlZQotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3BiYXIKLXsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYm9keSAKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlweDsKLQliYWNrZ3JvdW5kLWNvbG9yIDogV2hpdGU7Ci19Ci0KLQotLmJvcmRlcl9kZWNvcmF0aW9uCi17Ci0JYm9yZGVyIDogdGhpbiBkb3R0ZWQgIzY2NjY2NjsKLX0KLQotCi0uYm90dG9tYmFyX2RhcmsKLXsgCi0JYmFja2dyb3VuZDogIzAwMzM2NjsKLSB9Ci0KLQotLmJvdHRvbWJhcl9saWdodAoteyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotCi0gLmJvdHRvbV9tZWRpdW0KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0KLQotIC5ib3R0b21iYXJfc2hhZG93Ci17IAotCWJhY2tncm91bmQ6ICMwMDAwMDA7Ci0gfQotCi0KLWNvZGUgCi17Ci0JY29sb3I6ICM2NzY3Njc7CQotfQotCi0uY29kZTIKLXsKLSAgIAltYXJnaW4tbGVmdCA6IDE1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogMTVweDsKLX0KLQotLmNvcHlyaWdodAoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDYwJTsKLSB9Ci0KLQotLmNvbnRlbnRfYmFzaWMKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9iYXNpY19lbXBoYXNpcwotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9jb2xvcmVkCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDEycHg7Ci19Ci0KLQotLmNvbnRlbnRfY29udGFpbmVyCi0gewotCW1hcmdpbi1ib3R0b20gOiAxNXB4OwotfQotCi0gLmNvbnRlbnRfZGlhZ3JhbQotIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6NjAlOwotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci0JCi19Ci0KLS5jb250ZW50X2dyZXlfbWlkCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uY29udGVudF9ncmV5X21pZDIKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9lbXBoYXNpcwotIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlmb250LXNpemUgOiAxMXB4OwotfQotCi0uY29udGVudF9oZWFkZXIKLXsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMTAlOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvbnRlbnRfaGVhZGVyX2xhcmdlCi17Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMS4yZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAuY29udGVudF9oZWFkZXJfY29sb3JlZAotewotCWNvbG9yOiAjNjc2NzY3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0gLmNvbnRlbnRfcmVmZXJlbmNlCi0gewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci19Ci0KLSAuY29udGVudF9yaWdodAotewotCWZsb2F0OiByaWdodDsKLQltYXJnaW4tdG9wIDogNXB4OwotCXdpZHRoOiAxNjY7Ci19Ci0KLSAuY29udGVudF9yaWdodF90YWJsZQotewotCXdpZHRoOiAxMDAlOwotfQotCi0KLSAuY29udGVudF9zbWFsbAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsX2NvbG9yZWQKLXsKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsX2NvbG9yZWRfMgotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotICAuY29udGVudF9zbWFsbF9jb2xvcmVkXzMKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotCi0uY29udGVudF9zbWFsbF9lbXBoYXNpcwotIHsKLSAJZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotCi0uY29udGVudF9zdWJoZWFkZXIKLXsKLSAgICBmb250LXNpemUgOiAxMnB4OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXdlaWdodDogIGJvbGQ7Ci19Ci0KLQotLmNvbnRlbnRfc3ViaGVhZGVyXzIKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0gfQotCi0KLSAuZGlzY3Vzc2lvbl9jb250ZW50Ci17IAotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCW1hcmdpbi1sZWZ0OiA1cHg7Ci0gfQotCi0KLS5kaXNjdXNzaW9uX2NvbnRlbnRfZW1waGFzaXMKLXsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQltYXJnaW4tbGVmdDogNXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0KLSAuZGlzY3Vzc2lvbl9kZXNjcmlwdGlvbgotIHsgCi0JY29sb3I6IDY2NjY2NjsKLQlmb250LXNpemU6IDExcHg7Ci0JbWFyZ2luLWxlZnQ6IDVweDsKLSAgfQotCi0KLS5lZGl0b3Jub3RlIAoteyAgCi0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLSAvKnRoZSBmb2xsb3dpbmcgdHdvIGNsYXNzZXMgYXJlIHVzZWQgZXhwcmVzc2x5IGluIHRoZSBrbm93bGVkZ2VfYW5ub3VuY2VtZW50c192aWV3Ki8KLSAKLSAuZmxvYXRjbGVhcgotewotCXBhZGRpbmc6IDVweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDAgcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5mbG9hdGdyZXkKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDVweDsKLQl3aWR0aDogNjVweDsKLX0KLQotCi0uZm9vdG5vdGUKLXsgCi0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotIH0KLS5mb3JtZmllbGRfZGVzYyAKLXsKLWNvbG9yOiAjMzMzMzMzOyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLWZvbnQtc2l6ZTogMWVtOyAKLWZvbnQtd2VpZ2h0IDogNDAwOyAKLSBmb250LXN0eWxlOiBpdGFsaWMKLX0KLS5mb3JtZmllbGRfdGl0bGUKLXsKLSAgICBmb250LXNpemUgOiAxMnB4OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXdlaWdodDogIGJvbGQ7Ci19Ci0uZm9vdF9zdGFyaW5kZXgKLXsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfZGVzY3JpcHRpb24KLXsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGV4dAotewotCWNvbG9yOiAjYjRiNGI0OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5mb290X3RpdGxlCi17Ci0JY29sb3IgOiAjZmY2NTAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotfQotCi0KLS5mbG93Y2hhcnQgCi17ICAKLQlmb250LXNpemU6IDhwdDsgY29sb3I6ICM2NjY2NjYKLX0KLQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fbGluawotIHsKLQljb2xvcjogZmZmZmZmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLmhlYWRlcl9kaXNjdXNzaW9uX2xpbmtkawotIHsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fdGl0bGUKLSB7Ci0JY29sb3I6IGZmZmZmZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQ6IDVweDsKLX0KLQotCi0uaGVhZGVybGlua19vZl9jb250YWluZXIKLXsKLQljb2xvcjogIzY2OTljYzsKLQlmb250LWZhbWlseTogYXJpYWwsdmVyZGFuYSxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyYgotewotICAgIGNvbG9yOiAjZmY2NjAwOwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCx2ZXJkYW5hLGhlbHZldGljYSxzYW5zLXNlcmlmOwotICAgIGZvbnQtc2l6ZTogMTJwdDsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uaGVhZGVyX2NvbG9yZWQKLXsKLQljb2xvcjogI2NjMzMwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uaGVhZGVyX29mX2FydGljbGUKLXsKLQljb2xvcjogI2NkMzMwMTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JfQotCi0uaGVhZGVyX29mX2FydGljbGVfdGFibGUKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQkKLS5oZWFkZXJfb2ZfYXJ0aWNsZTIKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmhlYWRlcl9yaWdodAotewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS5zdWJoZWFkMV9vZl9hcnRpY2xlMgotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnN1YmhlYWQyX29mX2FydGljbGUyCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDVweDsKLX0KLQotLnN1YmhlYWQzX29mX2FydGljbGUyCi0gewotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotfQotCi0uaGVhZGVyX29mX3N0ZXBzCi17Ci0JY29sb3I6ICNBNEE0QTQ7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLQotLmhlYWRlcl9vZl9zaXRlbWFwCi17Ci0JY29sb3I6IyA2Njk5Y2M7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9vZl9zaXRlbWFwOmhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9vZl90YWJsZQotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0KLS5pbWFnZV9jYXB0aW9uIAoteyAgCi0JZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjMDAzMzY2Ci19Ci0KLQotLnNpZGViYXIKLXsgIAotCWJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7Ci19Ci0KLWlucHV0Ci17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotCi1pbnB1dC5pbnB1dDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDQ1Ci17IAotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXRtYXg1MAotewotCXdpZHRoOiAzNjBweAotfQotCi0KLWlucHV0LmlucHV0MTM1Ci17Ci0Jd2lkdGg6IDEzNXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQxNTUKLXsKLSAgCSB3aWR0aDogMTU1cHgKLX0KLQotaW5wdXQuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHg7Ci19Ci0KLQotaW5wdXQuaW5wdXQzMDUKLXsgCi0gICAgd2lkdGg6IDMwNXB4Ci19Ci0KLQotLm1lbnViYXIKLXsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0KLS5tZW51YmFyOmhvdmVyCi17Ci0gIGNvbG9yOiAjZmZmZmZmCi19Ci0KLQotLm1lbnViYXJfYmcKLXsgICAKLWJhY2tncm91bmQtY29sb3I6IzAwMzM2NjsgCi19Ci0KLQotLm1lbnViYXJfZW1waGFzaXMKLXsgCi0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNjAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLm1lbnViYXJfZW1waGFzaXNkawoteyAKLSAgY29sb3I6ICMwMDAwMDA7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0KLS5taWRiYXJfYmcKLXsgCi0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLSB9Ci0KLQotLm1pZGJhcl9kYXJrCi17IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotCi0KLS5taWRiYXJfbGlnaHQKLXsgCi0JYmFja2dyb3VuZDogIzMzOTljYzsKLSB9Ci0KLQotIC5taWRiYXJfbWVkaXVtCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotCi0KLSAubWlkYmFyX3NoYWRvdwoteyAKLQliYWNrZ3JvdW5kOiAjNjY2NjY2OwotIH0KLQotCi0ucGFnZV9udW1iZXIKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotCi0ucGFnZV9zdGVwcwoteyAKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0ucGFnZWhlYWRlcgotewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBmb250LXdlaWdodDogYm9sZAotfQotIC5wYWdlaGVhZGVyX2NvbG9yZWQKLXsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHQ7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBhY3RpdmUKLXsKLQljb2xvcjogI2NjMDAwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0ucHJvamVjdF9tZW51X2JvcmRlcjEKLSB7Ci0JYm9yZGVyLXRvcCA6IDFweCBzb2xpZCAjY2NjY2NjOwotCWJvcmRlci1yaWdodCA6IDFweCBzb2xpZCAjY2NjY2NjOwotCWJhY2tncm91bmQgOiAjZWZlZmVmOwotfQotLnByb2plY3RfbWVudV90b3Bib3JkZXIKLSB7Ci0JYm9yZGVyLXRvcCA6IDFweCBzb2xpZCAjY2NjY2NjOwkKLQliYWNrZ3JvdW5kIDogI2VmZWZlZjsKLX0KLS5wcm9qZWN0X25hdgotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci1zZWxlY3QKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMXB4OwotfQotCi0KLXNlbGVjdC5pbnB1dDI1Ci17IAotICAgIHdpZHRoOiAyNXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0NDUKLXsKLSAgICB3aWR0aDogNDVweAotfQotCi0KLXNlbGVjdC5pbnB1dDg1Ci17Ci0gICAgd2lkdGg6IDg1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQxNTUKLXsKLSAgIHdpZHRoOiAxNTVweAotfQotCi0KLXNlbGVjdC5pbnB1dDIzMAotewotICAgIHdpZHRoOiAyMzBweAotfQotCi0KLXNlbGVjdC5pbnB1dDMwNQotewotICAgIHdpZHRoOiAzMDVweDsKLX0KLQotLyogQWxsIHNoaW0gY2xhc3NlcyBhcmUgZm9yIHNwYWNpbmcgZWxlbWVudHMgdXNlZCB0byBjb250cm9sIGxheW91dCwgZXNwZWNpYWxseSBpbiBvbGRlciBicm93c2VycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgbWFyZ2lucyBhbmQgcGFkZGluZyAqLwotCi0uc2hpbTN4MXB4Ci17Ci0JaGVpZ2h0OiAxcHg7Ci0Jd2lkdGg6IDNweDsKLX0KLQotYS5zaWRlbWVudV9oZWFkZXIKLXsKLSAgICBjb2xvcjogIzY2NjY2NjsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotYS5zaWRlbWVudV9oZWFkZXI6aG92ZXIKLXsKLSAgY29sb3I6ICNjYzAwMDAKLX0KLQotCi0uc2lkZW1lbnVfYm9sZGxlZnQKLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZGxlZnRfc2VsZWN0ZWQKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZHJpZ2h0Ci17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRyaWdodDpob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9zdGFuZGFyZAotewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfc3RhbmRhcmRfc2VsZWN0ZWQKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLXRkCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogNzAlCi19Ci0KLXRkLnNlYXJjaGJveAotewotCWZvbnQtZmFtaWx5OiBjb3VyaWVyOwotfQotCi0KLSB0ZC5iZ19kaXNjdXNzaW9uXzEKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotCQotfQotCi0KLXRkLmJnX2Rpc2N1c3Npb25fMgoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLSB0ZC5jb250ZW50X2NlbGwKLSB7Ci0gCi19Ci0KLQotdGQuZGl2aWRlcgotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmOWYwOwotfQotCi0KLS5ncmV5X2RhcmsKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotfQotCi10ZC5ncmV5X21lZGl1bTIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotdGQuZ3JleV9saWdodDIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmdyZXlfbGlnaHQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmdyZXlfbWVkaXVtCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLQotdGQuY2VsbGNvbG9yX2xpZ2h0Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OWNjMDA7Ci19Ci0KLQotCi10ZC5jZWxsY29sb3JfZGFyawotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjM5YzAwOwotfQotCi0KLXRkLmNlbGxjb2xvcl93aGl0ZQotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi0KLXRkLnNpZGVtZW51X2J1bGxldF9ncmV5Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotCi10ZXh0YXJlYQotewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LWZhbWlseSA6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQ0NQotewotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXRtYXg1MAotewotCXdpZHRoOiAzNjBweAotfQotCi0KLXRleHRhcmVhLmlucHV0MTkwCi17Ci0gICAgd2lkdGg6IDE5MHB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDM1MAotewotICAgIHdpZHRoOiAzNTBweAotfQotCi0KLS50b3BiYXJfc2VwYXJhdG9yCi17Ci0gIGNvbG9yOiAjY2MzMzAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLnRvcGxpbmVfY29sb3IKLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0vKiBib3Jyb3dlZCBzdHlsZXMgZnJvbSBjb21tb24uY3NzIHRvIGJlIHRyaW1tZWQgbGF0ZXIgKi8KLSAKLSAudG9wZnJhbWViZyAKLXsgIGJhY2tncm91bmQtY29sb3I6ICNkMmQyZDIKLX0KLQotLnRvcGZyYW1lYmdsaWdodCAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogI2I2YjViNQotfQotCi0udG9wZnJhbWViZ2RhcmsgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQKLX0KLQotLnRvcGZyYW1lYmdsaWdodDIgCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWYKLSB9Ci0gICAKLSAudG9wZnJhbWVsb2dvYmcgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTkKLX0KLQotLnRvcGxlZnRuYXYKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wbGVmdG5hdmJvbGQgCi17IAotZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotZm9udC1zaXplOiAxMHB4OyAKLXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi1mb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvcHJpZ2h0bmF2Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udmVydGljYWxibHVlCi0geyAKLSBiYWNrZ3JvdW5kOiAjMzM5OWNjIAotIH0KLQotIC53aGl0ZWJnCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfdW5peC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc191bml4LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwMDA4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc191bml4LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzIG5vLWxpbmsqLwotCi1hIHsJCi0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi0vKiBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9ubGluawoteyAKLWNvbG9yOiAjMzM2Njk5OwotZm9udC1zaXplOiAxMXB4OwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi0gfQotIAotIGEuYWN0aW9ubGluazphY3RpdmUgeyAKLSBjb2xvcjogIzMzNjY5OTsKLSBmb250LXdlaWdodDogYm9sZDsKLSAgfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIGZvbnQgZm9yIGFjdGlvbiBvbiBjb250ZW50IHBhZ2UgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlIDtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb24geyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxNnB4OwkKLX0gCi0KLWEuYWN0aW9uc2VsZWN0b3IgewotICAgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYiB7IAotIAljb2xvcjogIzAwMDAwMDsKLSAJZm9udC1zaXplOiAxOHB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYnNlbGVjdGVkIHsgCi0gCWNvbG9yOiAjMmMyYzJjOwotIAlmb250LXNpemU6IDE4cHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYmFzaWMgeyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJ1dHRvbjphY3RpdmUgewotCWNvbG9yOiAzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAzMzMzMzM7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucyBpbiBNdWx0aXNpdGUsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qbWFpbiBjb250YWluZXIgIGFjdGlvbnMvbGlua3MgZm9yIGVkaXRpbmcqLwotYS5jb25saW5rZWRpdCB7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQlmb250LXNpemUgOiAxNnB4OwotfQotCi1hLmNvcHlyaWdodCB7IAkKLQljb2xvcjogIzMzNjY5OTsgICAgCi0JZm9udC1zaXplIDogMTVweDsKLX0gCi0KLWEuZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qIGxpZ2h0IGNvbG91cmVkIGhlYWRpbmcgbGluayBmb3IgZGlzY3Vzc2lvbiBhbmQgc2ltaWxhciB1c2VzIC0gd2FzIGhlYWRlcl9kaXNjdXNzaW9uX2xpbmsgaW4gcHJldmlvdXMgdmVyc2lvbnMgKi8KLSBhLmhlYWRlcmxpbmtsaWdodCB7Ci0JY29sb3I6IAlmZmZmZmY7Ci0JZm9udC1zaXplOiAwLjllbTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19CQotCi0vKmJvbGQgbGluaywgaWUsIGFkdmFuY2VkIHNlYXJjaCBsaW5rIGluIHBlKi8KLWEubGlua2Z1bmNvcHRpb24geyAgCQotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0gYS5uYXZ0cmVlIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotCi0vKm5hdnRyZWUgaXRlbSBvciBkb2MsIG5vZGVzIHRoYXQgZG9uJ3QgZXhwYW5kKi8KLWEubmF2dHJlZWl0ZW0geyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotIAotIC8qIHNpbXBsZSBtZWNoYW5pc20gdG8gdHVybiB0ZXh0IGRlY29yYXRpb24gb2ZmICovICAKLWEubm9saW5lIHsKLSAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotYS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTZweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHRleHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQgOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B1cHRleHQ6IGFjdGl2ZSB7Ci0JY29sb3I6ICNjYzAwMDA7Ci19Ci0KLQotYS5zbWFsbCB7CQotCWZvbnQtc2l6ZTogMTZweDsJCi19Ci0KLWEuc21hbGxiIHsJCi0gICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7CQotfQotCi1hLnRvcGJhciB7Ci0gIGNvbG9yOiAjNjY2NjY2OwotICBmb250LXNpemU6IDE2cHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGFzIGhpZ2hsaWdodGVkIGRlc2NyaXB0aW9uIGFib3ZlIHRhYmxlcyovCi0uYWNjZW50Y29sb3IgewotCWNvbG9yIDogI2NjMzMwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotIC8qIGJnY29sb3IgIGZvciBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLS5hY3Rpb25iZyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIG9uIHdoaXRlIGJhY2tncm91bmQqLwotLmFjdGlvbnNlbGVjdDIgeyAgIAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLmFjdGlvbnNlbGVjdG9yZGlzIHsKLWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0JY29sb3I6ICNjY2NjY2M7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYiB7IAotICAgZm9udC13ZWlnaHQgOiBib2xkOwotIH0KLSAgCi0uYmFzZWxpbmVpdGFsaWNzIHsKLQljb2xvcjogIzY2NjY2NjsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmdibGFjayB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotIAotIC8qIGJhc2ljIGNvbHVtbiBiYWNrZ3JvdW5kIGNvbG91ciBmb3IgZGlzY3Vzc2lvbnMsIGZpbGVzLCBvdGhlciBzdWNoIHRhYnVsYXRlZCBkYXRhICovCi0uYmdjb2x1bW5iYXNpYyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotLmJnd2hpdGUgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gCi0vKiBzaXplIGlucHV0IGZvciBiYXNpYyB0YWdzIHN1Y2ggYXMgcCBhbmQgbGkgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIHRkICovIAotYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNmZmZmZmY7ICAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7CQkKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsJCi0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci19Ci0KLS5ib2xkIHsgCi0gICBmb250LXdlaWdodCA6IDYwMDsKLSB9Ci0KLS5ib3JkZXJncmF5IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLSB9Ci0KLS5ib3R0b21iYXJkYXJrIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMzM2NjsKLSB9Ci0gIAotLmJvdHRvbWJhcmxpZ2h0IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3cgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotIH0KLQotLmJyZWFkY3J1bWJzeyAKLWNvbG9yOiAjMzM2Njk5OwotZm9udC13ZWlnaHQ6IDYwMDsKLSB9Ci0KLS5icmVhZGNydW1iczJ7IAotY29sb3I6ICNmZmZmZmY7Ci1mb250LXNpemU6IDE2cHg7Ci0gfSAKLSAKLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotICAKLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qIGRpc2FibGVkIHN0YXRlICovIAotLmJ1dHRvbnR4dCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIC0gdGhpcyBpcyBmb3IgdGhlIGRpc2FibGVkIHN0YXRlICovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMThweDsKLSB9Ci0gCi0gIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMgeyAJCi0JZm9udC1zaXplOiAxNnB4OwkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKm1haW4gY29udGFpbmVyIGhlYWRlciovCi0uY29uaGVhZCB7IAotY29sb3I6ICNjYzMzMDA7Ci1mb250LXdlaWdodDogNjAwOwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLSB9Ci0gCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWwgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLSAKLS8qbWFpbiBjb250YWluZXIgZGF0YSBsYWJlbHMgaW4gYm9sZCovCi0uY29ubGFiZWxib2xkIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gfSAgCi0gCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkcmlnaHQgbW92aW5nIGZvcndhcmQqLwotLmNvbnJib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypoZWFkZXIgZm9yIHJpZ2h0IGhhbmQgY29udGFpbmVyKi8KLS5jb25yaGVhZCB7Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyptYWluIGNvbnRhaW5lciB0YWJsZSBoZWFkZXIqLwotLmNvbnRibGhlYWQgeyAgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDE2cHg7CQotICAgIGZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5jb250ZW50eyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsJCi0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qIGFkZGVkIGZvciB0ZXh0IHJlcHJlc2VudGluZyBkaXNhYmxlZCBmdW5jdGlvbnMuICovCi0uY29udGVudGRpc2FibGVkIHsKLQljb2xvcjogI2NjY2NjYzsKLX0KLQotLyogZm9udCBmb3IgYm9sZCB0ZXh0ICovCi0uY29udGVudGVtcGhhc2lzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogdXNlZCB0ZXh0IHJlbWluZGluZyB1c2VyIHRoYXQgdGhlcmUgaXMgcmVxdWlyZWQgY29udGVudCAqLwotLmNvbnRlbnRyZXF1aXJlZCB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotLmNvcHlyaWdodCB7IAotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LXNpemUgOiAxNXB4OwotfQotCi0vKmJsYWNrIGNvcHlyaWdodCovCi0uY29weXJpZ2h0YiB7IAotY29sb3IgOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDE1cHg7Ci19Ci0KLWRkIHsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7CQotbWFyZ2luLWxlZnQ6IC0xcHg7Ci0gfQotIAotLmRpYWxnYnhzaGFkb3cyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7Ci0gfQotIAotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0gLmRpYWxvZ3VlYm94bWVkaXVtIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzhiOGI4YjsKLSB9Ci0gCi0gLmRpYWxvZ3VlYm94dGl0bGUgewkgICAKLQlmb250LXNpemU6IDIxcHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKnRleHQgZm9yIGRpc2FibGVkIGJ1dHRvbnMqLwotLmRpc2FibGV7IAotY29sb3I6ICM5OTk5OTk7Ci1mb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTZweDsgIAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLSAKLWRpdnsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSB9IAotIAotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLyAKLWRpdi5tYXJnaW5ydHsgCi0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogN3B4OwotIH0gIAotIAotZGl2Lm1hcmdpbnMgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDI1cHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgIAotCi0vKmZvciBwYWdlcyB3aXRoIGJ1dHRvbiBuYXZpZ2F0aW9uIG9uIHRvcCovIAotZGl2Lm1hcmdpbnMyMCB7IAotZmxvYXQ6IGxlZnQ7Ci1tYXJnaW4tbGVmdDogN3B4OwotbWFyZ2luLXRvcDogMjBweDsJCi1tYXJnaW4tcmlnaHQ6IDdweDsKLSB9ICAgIAotIAotIC8qYWRkcyAxMCBweCBwYWRkaW5nKi8KLSBkaXYucGFkMTB7IAotIHBhZGRpbmc6IDEwcHg7IAotICB9Ci0KLS5kaXZpZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmOWYwOwotfQotCi1kbHsgIAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDE4cHg7ICAgCi0JfQotCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovIAotZGwuZGF0YSB7IAotbWFyZ2luLWJvdHRvbTogLTFweDsKLSB9ICAKLQotLmRvY2JvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsgICAgICAgCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qZm9yIGFwcGxldCBkb3dubG9hZCBzcGxhc2ggcGFnZSovCi0uZG93bmxvYWR7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWVlZTsKLSB9Ci0KLSAuZXJyb3Jtc2cgewotCWNvbG9yIDogI2NjMDAwMDsJCi19IAotCi0vKgotY29sb3JlZCBmb250Ci1kZXNjcmlwdGlvbiBhYm91dCB0aGUgdXNlciBzdGF0dXMuIGVxLiAic3Vic2NyaXB0aW9ucyBhcmUgdXBkYXRlZCIKLWl0J3MgdXN1YWxseSBvbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcGFnZXMKLSovCi0uZm9vdGVyYm9sZCB7Ci0JY29sb3IgOiAjYTRhNGE0OwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RlcmJvbGRjb2xvcmVkIHsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmZvb3RpbmRpY2F0b3IgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsgICAgICAgCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290c3RhcmluZGV4IHsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKm1vdmUgdG8gZGVzaWduX3BlKi8KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAyMnB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwkKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1ib3R0b206IDJweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjVweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAyNXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLyp1c2UgaGVhZGVyMSBpbnN0ZWFkKi8KLS5oMSB7ICAKLQotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyp1c2Ugc3ViaGVhZDEgaW5zdGVhZCovCi0uaDFyb290eyAgCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwkKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0KLS8qdXNlZCBpbiBjYywgY3EsIHNsKi8gCi1oMSB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI1cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlIGhlYWRlcjIgaW5zdGVhZCovCi0uaDIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI4cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyOHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLQotaSB7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgaW5wdXQgYm94IHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLWlucHV0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNnB4OwotfSAKLQotaW5wdXQuaW5wdXQxMzUgewotCXdpZHRoOiAxMzVweAotfSAKLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLWlucHV0LnB4MjUgewotICAgIHdpZHRoOiAyNXB4OwotfQotCi1pbnB1dC5weDQ1IHsKLSAgICB3aWR0aDogNDVweDsKLX0KLQotLyoKLTEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFCi0qLwotaW5wdXQucHg4NSB7Ci0gICAgd2lkdGg6IDg1cHg7Ci19Ci0KLWlucHV0LnB4MTM1IHsKLSAgICB3aWR0aDogMTM1cHg7Ci19Ci0KLWlucHV0LnB4MTU1IHsKLSAgICB3aWR0aDogMTU1cHg7Ci19Ci0KLWlucHV0LnB4MjMwIHsKLSAgICB3aWR0aDogMjMwcHg7Ci19Ci0KLWlucHV0LnB4MzA1IHsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmxlZnRtZW51YnVsbGV0IHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotIH0KLQotLmxlZnRtZW51YnVsbGV0YWN0aXZlIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotIH0KLQkKLQotLmxlZnRuYXZoZWFkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE5cHg7CQotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLX0gCi0KLS5sZWZ0bmF2bGFiZWwgewotY29sb3I6ICMwMDAwMDA7Ci1mb250LXdlaWdodCA6IDYwMDsKLWZvbnQtc2l6ZTogMTZweDsKLSB9Ci0KLS5saWdodGdyYXkgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7Ci0gfQotIAotLm1lbnViYXIgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS8qbWVudWJhciB3aXRoaW4gdG9wIG9mIGNvbnRlbnQgcGFnZSAgKi8KLS5tZW51YmFybWlkeyAKLWZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi0gfQotCi0vKgotMSxib2xkIGZvbnQgZm9yIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJyZWFkY3J1bWJzCi0yLGJvbGQgZm9udCBvZiB0YWJsZSBoZWFkZXIgd2l0aCBtZW51YmFyX2JnKGJsdWUpIGFzIGJhY2tncm91bmQgY29sb3IgCi0zLGJvbGQgdGV4dCBvbiBjb2xvcmVkIGJhY2tncm91bmQgZWcuIExvZ2dlZCBJbgotKi8KLS5tZW51YmFyZW1waGFzaXMgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyOmhvdmVyIHsKLSAgY29sb3I6ICNmZmZmZmYKLX0gCi0gCi0ubWlkYmFyYmcgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gCi0vKnRvcG5hdiovIAotLm1pZGJhcmxpZ2h0IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0gCi0vKmRhcmsgY29sb3IgYmV0d2VlbiB0YWJzKi8KLSAubWlkYmFyZGFyayB7IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotIAotIC8qdG9wbmF2Ki8gCi0gLm1pZGJhcm1lZCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQotIAotIC8qYmFja2dyb3VuZCAgb2YgIHRhYnMqLyAKLSAubWlkYmFybWVkaXVtIHsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0gLm1pZGJhcnNoYWRvdyB7IAotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci0gfSAKLSAgCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkbGVmdCBtb3ZpbmcgZm9yd2FyZCovCi0ubmF2bGVmdGJvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmxlZnQgbmF2IHN1Ym1lbnUqLwotLm5hdmxlZnRzdWIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotLm5vbmFjdGl2ZXRhYiB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1zaXplOiAxOHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypub3Rlcy8gZGVzY3JpcHRpb24gb2YgaWNvbiAqLwotLm5vdGVzeyAgCi0gZm9udC1zaXplOiAxNnB4OwotIGZvbnQtd2VpZ2h0IDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwkKLX0KLQotLnBhZ2Vib2xkIHsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7CQotIH0KLSAKLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLSAucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci19Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgeyAKLQljb2xvcjogIzY3Njc2NzsJCi0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLS5wb3AgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemUgOiAxOHB4OwotCWZvbnQtd2VpZ2h0IDogMjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnBvcGJhY2tncm91bmQgewotCi0JYmFja2dyb3VuZDogI2Q2ZDNjZTsKLX0KLQotLnBvcGgxIHsKLQlmb250LXNpemU6IDI0cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0ucG9wbGVmdG1lbnUgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyOiB0aGluIHNvbGlkIGNjY2NjYzsgCi0JbGVmdDogMjEwcHg7IAotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjphYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwkKLSB9Ci0KLSAvKiB1c2UgcG9wbGVmdG1lbnUgaW5zdGVhZCBvZiB0aGlzIG9uZSovCi0ucG9wdXBib3JkZXIgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyIDogdGhpbiBzb2xpZCBjY2NjY2M7Ci0JcGFkZGluZyA6IDJweDsKLX0KLQotLnBvcHVwdGV4dCB7CQotICAgY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxNnB4OwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5wcm9qZWN0YXR0IHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi0JY29sb3I6ICNjZDMzMDE7Ci19Ci0KLS8qZGF0ZSBhc3NvY2lhdGVkIHdpdGggYXJ0aWNsZSByYXRpbmdzKi8KLS5yYXRpbmdzZGF0ZQotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZSA6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotc2VsZWN0IHsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNnB4OwotfQotCi1zZWxlY3Quc2VscHgxNDQgewotICAgIHdpZHRoOiAxNDRweDsKLX0KLQotLyogLnNpZGVtZW51X2JvbGRsZWZ0IHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVib2xkKi8gCi0KLS8qIC5zaWRlbWVudV9ib2xkbGVmdF9zZWxlY3RlZCByZXBsYWNlIHdpdGggLmxlZnRtZW51YWN0aXZlKi8KLQotLyogLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVidWxsZXRhY3RpdmUqLwotIAotLyouc2lkZW1lbnVfYnVsbGV0X2dyZXkgcmVwbGFjZSB3aXRoIGxlZnRtZW51YnVsbGV0Ki8KLQotLnNpZGVtZW51Ym9sZGxlZnQgewotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0gCi0KLS5zaWRlbWVudWJvbGRsZWZ0c2VsZWN0ZWQgewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZCB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zbWFsbHRleHQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMXJvb3QsICBmb3IgZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLnN1YmhlYWQxIHsgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLnRhYmxlaGVhZGVyIHsgCi0KLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxOXB4OwkKLSAgICBmb250LXdlaWdodDogYm9sZAotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsJCi19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFiIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci0gIH0KLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFic2VsZWN0ZWQgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKLSAgfQotICAKLSAvKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotIC8qIGRpc2FibGVkIHZlcnNpb24gKi8gCi10ZC5idXR0b25ib2R5ZHNibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLyogdGhpcyBzdHlsZSBpcyBkZXNjb3BlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ZDZkNmQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0gCi0vKiBkZXNpZ24gZWxlbWVudCByYXJlbHkgdXNlZCBmb3IgbGluZSBjb2xvdXIgaW4gY2VydGFpbiBkZWNvcmF0aXZlIHRhYmxlcyAqLwotdGQuZGVzaWduMSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLSAKLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8KLXRkLmRpdmlkZXJkaW1lbnMgewotCWJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7Ci19Ci0gCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi10ZC5ub25hY3RpdmV0YWIgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gZ3JheSovCi10ZC50YmxoaWdobHQgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICBwYWRkaW5nOiAycHg7Ci0gfQotIAotIHRkLnRibGhpZ2hsdDEgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gfQotIAotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDIgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLQotIC8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotIH0gIAotIAotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLS50ZGRhcmtib2xkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwkKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLnRkbGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0JcGFkZGluZzogMnB4OwotfQotCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0gCi0gCi10ZXh0YXJlYSB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotdGV4dGFyZWEucHgzODB7Ci0gd2lkdGg6IDM4MHB4OyAKLSB9Ci0KLS50ZXh0ZXJyb3Jtc2cgewotCWNvbG9yIDogY2MwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTEwJTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRleHRncmF5IHsgIAotCWNvbG9yOiAjOTk5OTk5OwkKLX0KLQotLnRvcGJhcmRpdmlkZXIgeyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjIAotfQotCi0udG9wYmFyZGl2aWRlcmdyZXllZCB7IAotCWJhY2tncm91bmQ6ICNhZGQ2ZWIKLSB9ICAKLQotLnRvcGJhcnNlcGFyYXRvciB7Ci0gIGNvbG9yOiAjY2MzMzAwOyAgCi0gIGZvbnQtc2l6ZTogMTZweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLSAKLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VkZWRlZDsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjU7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodGdyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MmdyZXllZCB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Ci0gfSAKLSAKLS50b3BmcmFtZWxvZ29iZyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0udG9wZnJhbWVsb2dvYmdncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5YzJkNjsKLX0KLQotLnRvcGZyYW1lc2hhZG93IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd2dyZXllZCB7ICAKLWJhY2tncm91bmQtY29sb3I6ICNjZWNlY2U7Ci19Ci0KLS50b3BsZWZ0bmF2IHsJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcGxlZnRuYXZib2xkIHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGJyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Ym9sZGdyZXllZCB7IAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDE1cHg7IAotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Z3JleWVkIHsJCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl9Ci0KLS50b3BsaW5lY29sb3IgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0JCi0JCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAvKiB0aGlzIHdhcyBpbml0aWFsbHkgZGVjbGFyZWQgdGhlIHNhbWUgY29sb3VyIGFzIHRoZSBjbGFzcyB0b3BmcmFtZSBiZyBidXQgYmVjYXVzZSBpdCBsaWVzIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uYWwgYXJlYSwgaGFzIGJlZW4gcmVjcmVhdGVkIGhlcmUgICovCi10ci5iZ21pZGZyYW1lIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi10ZC5zaWRlbWVudWJ1bGxldGdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLQotdGQuc2lkZW1lbnVidWxsZXRjb2xvcmVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyovCi11bCB7CQotCi0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19Ci0gCi0KLS52b2IgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTUwJTsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLnZvYmJvdHRvbSB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ljb25zL1B1Ymxpc2hpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaWNvbnMvUHVibGlzaGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWJhZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaWNvbnMvUHVibGlzaGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvQXJ0aWZhY3QuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL0FydGlmYWN0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczOTEyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvQXJ0aWZhY3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL1JvbGUuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL1JvbGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE4M2EyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9Sb2xlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9UYXNrLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9UYXNrLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhYzJjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvVGFzay5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvdG9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy90b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVhY2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy90b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZGluZGV4ZGVmLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRpbmRleGRlZi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTcxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZGluZGV4ZGVmLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXJlbGF0aXZlcGF0aAkuLgotd3d3cm9vdAkuLgotbWFpbnJlc3VsdGZpbGUJL2luZGV4L2luZGV4Lmh0bQotaW5kZXhyZXN1bHRmaWxlCS9pbmRleC9uYXZpZy5odG0KLWtleXdvcmRyZXN1bHRmaWxlCS9pbmRleC9jb250ZW50cy5odG0KLW1haW50aXRsZQlJbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzcwotdGFyZ2V0CW9yeV9kb2MKLWluZGV4dGFyZ2V0CWluZGV4X3QKLWtleXdvcmR0YXJnZXQJa2V5d29yZF90Ci1pbmRleGhlaWdodAkyNQotaGVhZGVyZmlsZQlrZXl3b3JkcHJlYW1ibGUudHh0Ci1mb290ZXJmaWxlCWtleXdvcmRwb3N0YW1ibGUudHh0Ci1rZXl3b3JkZmlsZQlrZXl3b3Jkcy50eHQKLWxlYXZlRGlyCV9ib3JkZXJzCi1tdWxpdGRvY3VtZW50a2V5d29yZAlmYWxzZQotc2hvd2RvY3VtZW50dGl0bGUJZmFsc2UKLXByZWZpeAlYRV8KLWxldmVsc2VwYXJhdG9yCV9fCi1zZWUJLCBTZWUKLXNlZWFsc28JLCBTZWUgYWxzbwotbGV2ZWxzdHlsZQlkZWZhdWx0c3R5bGUJaW5kZXhsZXZlbDIKLWxldmVsc3R5bGUJMQlpbmRleGxldmVsMQotbGV2ZWxzdHlsZQkyCWluZGV4bGV2ZWwyCi1sZXZlbHN0eWxlCWhlYWRsaW5lc3R5bGUJaW5kZXhoZWFkaW5nIApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZHBvc3RhbWJsZS50eHQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcG9zdGFtYmxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMDljYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcG9zdGFtYmxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcHJlYW1ibGUudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZHByZWFtYmxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyZTc1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcHJlYW1ibGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJpbmRleC5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5JbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzczwvdGl0bGU+Ci0KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDQwODAiIHZsaW5rPSIjODAwMEZGIiBhbGluaz0iIzAwMDBGRiI+Ci0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRzLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkMjU3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3Jkcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVhFX0tleVdvcmRJbmRleF9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfU2l0ZU1hcF9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfU2VhcmNoRW5naW5lX19Db3B5cmlnaHQJWEVfQ29weXJpZ2h0Ci1YRV9UcmVlQnJvd3Nlcl9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfVHJlZUJyb3dzZXJfX0V4YW1wbGUJWEVfU3lzdGVtX3JlcXVpcmVtZW50cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2xpYi9ycHdjb3JlLmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2xpYi9ycHdjb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5MTQ5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9saWIvcnB3Y29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzU5N2MwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoaW5nCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUHVibGlzaGluZ1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODM4ODU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBQdWJsaXNoaW5nUGx1Z2luLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQdWJsaXNoaW5nUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoaW5nUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUHVibGlzaGluZ1Jlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1B1Ymxpc2hpbmdSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhZmVjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUHVibGlzaGluZ1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgUHVibGlzaGluZyByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoaW5nUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQdWJsaXNoaW5nUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRpYWxpemluZ0RpclRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ0VsZW1lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nV0FSRmlsZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZGluZ0VsZW1lbnRDbG9zdXJlVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoRWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZE1ldGhvZEVsZW1lbnRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlGaWxlV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdJY29uTmFtZVdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZXJuYWxVcmxfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzcG9uc2libGVGb3JOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZmllc05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRhbmNlTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5wdXRUb05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dHB1dEZyb21Ob2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRleExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2c7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQdWJsaXNoaW5nUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTUyNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFCi0jCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLXB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lPVB1Ymxpc2hpbmcgY29uZmlndXJhdGlvbi4uLgotaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lPUluaXRpYWxpemluZyBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuLi4KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1Db3B5aW5nIGZpbGVzLi4uCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPUdlbmVyYXRpbmcgYm9va21hcmtzLi4uCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9R2VuZXJhdGluZyBib29rbWFyayAnJ3swfScnLi4uCi1nZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZT1HZW5lcmF0aW5nIGJvb2ttYXJrIGluZGV4Li4uCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1QdWJsaXNoaW5nIG1ldGhvZCBlbGVtZW50czogezB9IHB1Ymxpc2hlZCwgezF9IHJlbWFpbmluZwotcHVibGlzaGluZ0VsZW1lbnRUYXNrX25hbWU9UHVibGlzaGluZyBtZXRob2QgZWxlbWVudDogezB9OnsxfQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPUdlbmVyYXRpbmcgZ2xvc3NhcnkuLi4KLWdlbmVyYXRpbmdTZWFyY2hJbmRleFRhc2tfbmFtZT1HZW5lcmF0aW5nIHNlYXJjaCBpbmRleC4uLgotZ2VuZXJhdGluZ1dBUkZpbGVUYXNrX25hbWU9R2VuZXJhdGluZyBXQVIgZmlsZS4uLgotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1CdWlsZGluZyBwcm9jZXNzIGNsb3N1cmUuLi4KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9QnVpbGRpbmcgZWxlbWVudCBjbG9zdXJlIGZvciAnJ3swfScnLi4uCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1Mb2FkaW5nIGxpYnJhcnkgY29udGVudHMuLi4KLQotIyBFcnJvciBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0Ci1wdWJsaXNoRWxlbWVudEVycm9yX21zZz1JVVBQMDAwMEU6IEVycm9yIHB1Ymxpc2hpbmcgZWxlbWVudDogezB9Ci1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBObyBkYXRhIHJldHVybmVkIGZyb20gc2VydmVyLgotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkU6IEludmFsaWQgcmVzcG9uc2UgZnJvbSBodHRwOi8vezB9OnsxfTp7Mn0KLQotIyBXYXJuaW5nIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQKLWludmFsaWRFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDNXOiBFbGVtZW50IHdhcyBub3QgcHVibGlzaGVkIGJlY2F1c2UgaXQgaXMgbm90IGEgdmFsaWQgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbi4KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBFbGVtZW50IHdhcyBub3QgcHVibGlzaGVkIGJlY2F1c2UgaXQgaXMgbm90IGEgbWV0aG9kIGVsZW1lbnQ6IHswfQotY29weUZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNVc6IFVuYWJsZSB0byBjb3B5IGZpbGUgZnJvbSAnJ3swfScnIHRvICcnezF9JycuCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IE5vZGUgaWNvbiBmaWxlICcnezB9JycgZG9lcyBub3QgZXhpc3RzLgotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXOiBVbmFibGUgdG8gcmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIHRoZSBub2RlIGljb24uCi1leHRlcm5hbFVybF9tc2c9ezB9IG1pbmktc2Vjb25kcyByZWZlcmVuY2luZyBleHRlcm5hbCBVUkw6IHsxfQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPUVtcHR5IGNvbnRlbnQgY2F0ZWdvcnkgZWxlbWVudCBub3QgcHVibGlzaGVkLgotCi0jIEVycm9yIERldGFpbHMKLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnPUlVUFAwMDA4RTogVGhlIHNlYXJjaCBpbmRleCBmaWxlIHdhcyBub3QgY3JlYXRlZC4KLQotIyBQcm9jZXNzIFRyZWUgTm9kZXMKLXJlZmVyZW5jZVdvcmtmbG93c05vZGVfdGV4dD1SZWZlcmVuY2UgV29ya2Zsb3dzCi10YXNrTm9kZV90ZXh0PVRhc2tzCi1wcmltYXJpbHlQZXJmb3Jtc05vZGVfdGV4dD1QcmltYXJpbHkgUGVyZm9ybXMKLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PUFkZGl0aW9uYWxseSBQZXJmb3JtcwotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PVBlcmZvcm1pbmcgUm9sZXMKLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PUlucHV0IFdvcmsgUHJvZHVjdHMKLW91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1PdXRwdXQgV29yayBQcm9kdWN0cwotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9UmVzcG9uc2libGUgRm9yCi1tb2RpZmllc05vZGVfdGV4dD1Nb2RpZmllcwotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVJlc3BvbnNpYmxlIFJvbGUKLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1Db250YWluaW5nIFdvcmsgUHJvZHVjdAotY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0PUNvbnRhaW5lZCBXb3JrIFByb2R1Y3RzCi1ndWlkYW5jZU5vZGVfdGV4dD1HdWlkYW5jZQotaW5wdXRUb05vZGVfdGV4dD1JbnB1dCB0bwotb3V0cHV0RnJvbU5vZGVfdGV4dD1PdXRwdXQgZnJvbQotCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UKLWluZGV4TGFiZWxfdGV4dD1JbmRleApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzQyYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBQdWJsaXNoaW5nIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RQdWJsaXNoTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUzMzE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5EZWJ1Z1RyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuRmlsZU5hbWVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIFB1Ymxpc2ggTWFuYWdlcnMuCi0gKiA8cD4KLSAqIFVzZSB0aGUgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaGVycyBleHRlbnNpb24gcG9pbnQgdG8gZXh0ZW5kCi0gKiB0aGlzIGNsYXNzIGlmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSB0aGUgcHVibGlzaGluZy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHVibGlzaE1hbmFnZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHByb2ZpbGluZyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNQcm9maWxpbmcoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHViRGlyOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIFB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0Vmlld0J1aWxkZXIgdmlld0J1aWxkZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZXMgdGhlIHB1Ymxpc2hpbmcgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHViRGlyCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFN0cmluZyBwdWJEaXIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJUHVibGlzaE9wdGlvbnMgb3B0aW9ucykgewotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQotCQlpZiAoIXRoaXMucHViRGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJdGhpcy5wdWJEaXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQdWJsaXNoSFRNTE9wdGlvbnMpIHsKLQkJCXRoaXMub3B0aW9ucyA9IChQdWJsaXNoSFRNTE9wdGlvbnMpIG9wdGlvbnM7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52aWV3QnVpbGRlciA9IGNyZWF0ZVZpZXdCdWlsZGVyKCk7Ci0KLQkJLy8gY2xlYXIgdGhlIGZpbGUgbmFtZSBjYWNoZQotCQkvLyBOYW1lQ2FjaGUuZ2V0SW5zdGFuY2UoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcHVibGlzaGluZyB2aWV3IGJ1aWxkZXIuIFRoZSB2aWV3IGJ1aWxkZXIgaXMgcmVzcG9uc2libGUgdG8gYnVpbGQKLQkgKiB0aGUgcHVibGlzaGluZyB2aWV3cyBhbmQgY29udGVudHMuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnZpZXdCdWlsZGVyOwotCX0KLQotCXB1YmxpYyBJU2l0ZUdlbmVyYXRvciBnZXRTaXRlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdmlld0J1aWxkZXIuZ2V0U2l0ZUdlbmVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIGRvIHB1Ymxpc2hpbmcuIFRoZSBwdWJsaXNoaW5nIHByb2Nlc3MgaXMgZGVmaW5lZCBpbiB0aHJlZSBzdGVwcy4KLQkgKiBwcmVQdWJsaXNoIHRvIGRvIHNvbWUgcHJlcGFyYXRpb24gYmVmb3JlIHRoZSBhY3R1YWwgcHVibGlzaGluZyBkb1B1Ymxpc2gKLQkgKiB0byBwdWJsaXNoIHRoZSB2aWV3cyBhbmQgY29udGVudHMgcG9zdFB1Ymxpc2ggdG8gZG8gc29tZSBjbGVhbnVwIHdvcmsKLQkgKiBhZnRlciBwdWJsaXNoLiBFeHRlbmRlZCBjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGVzZSBtZXRob2RzIHRvIGFjaGlldmUKLQkgKiBhZGRpdGlvbmFsIHB1Ymxpc2hpbmcgcmVzdWx0cy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkgewotCQkJb3B0aW9ucy52YWxpZGF0ZSgpOwotCQl9Ci0KLQkJLy8gY2xlYXIgdGhlIGZpbGUgbmFtZSBjYWNoZSBzbyB0aGF0IHRoZSBmaWxlIG5hbWUgd2lsbCBiZSBiYXNlZCBvbiB0aGUgbGF0ZXN0IGxpYnJhcnkgZGF0YQotCQkvLyB0aGlzIGNhbiBhdm9pZCB0aGUgY2FzZXMgd2hlcmUgZWxlbWVudCBuYW1lIGNoYW5nZWQgYmVmb3JlIHB1Ymxpc2hpbmcKLQkJRmlsZU5hbWVHZW5lcmF0b3IuSU5TVEFOQ0UuY2xlYXIoKTsKLQkJCi0JCWxvbmcgYmVnaW5UaW1lID0gMEw7Ci0JCWxvbmcgc3RhcnRUaW1lID0gMEw7Ci0KLQkJLy8gZG8gYSBnYyBiZWZvcmUgZ2V0dGluZyBzdGFyZWQKLQkJUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKLQkJCi0JCXRyeSB7Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJYmVnaW5UaW1lID0gc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQkKLQkJCXByZVB1Ymxpc2gobW9uaXRvcik7Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicHJlUHVibGlzaCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKHByb2ZpbGluZykgewotCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJCQkJCi0JCQlkb1B1Ymxpc2gobW9uaXRvcik7Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZG9QdWJsaXNoIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlwb3N0UHVibGlzaChtb25pdG9yKTsKLQkJCWlmIChwcm9maWxpbmcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJwb3N0UHVibGlzaCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlRpbWUgdGFrZW4gdG8gcHVibGlzaCBjb25maWd1cmF0aW9uICciICsgY29uZmlnLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgIic6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpblRpbWUpICsgIiBtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkTGlicmFyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZmlyc3Qgb2YgYWxsLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGxpYnJhcnksCi0JCS8vIG90aGVyd2lzZSwgc29tZSByZWxhdGlvbnNoaXBzIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcyBhcmUgbm90Ci0JCS8vIGVzdGFibGlzaGVkCi0JCWxvbmcgc3RhcnRUaW1lID0gMEw7Ci0JCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmxvYWRMaWJyYXJ5VGFza19uYW1lKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBMaWJyYXJ5VXRpbC5sb2FkQWxsKChNZXRob2RMaWJyYXJ5KSBjb25maWcuZUNvbnRhaW5lcigpKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibG9hZExpYnJhcnkiLCAiTGlicmFyeVV0aWwubG9hZEFsbDogIiAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpCi0JCQkJCQkJKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotCX0KLQkKLS8vCXByb3RlY3RlZCB2b2lkIHVubG9hZFJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLS8vCQkKLS8vCQkvL1J1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0vLwkJLy9sb25nIG0xID0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpLzEwMDAwMDA7Ci0vLwkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZXNvdXJjZXMpOwotLy8JCS8vUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsJCQotLy8JCS8vbG9uZyBtMiA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKS8xMDAwMDAwOwotLy8JCS8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIExvbmcudG9TdHJpbmcobTItbTEpICsgIiBNQiBmcmVlZCBieSB1bmxvYWRpbmcgcmVzb3VyY2VzIik7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBtZ3JzLCBDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBrZWVwbGlzdCkgewotLy8JCWZvciAoIEl0ZXJhdG9yPERpYWdyYW1NYW5hZ2VyPiBpdCA9IG1ncnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gaXQubmV4dCgpOwotLy8JCQlpZiAoIGtlZXBsaXN0ID09IG51bGwgfHwgIWtlZXBsaXN0LmNvbnRhaW5zKG1ncikgKSB7Ci0vLwkJCQltZ3IuZGlzcG9zZSgpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvYmplY3QuIE9uY2UgZGlzcG9zZWQsIHRoZSBvYmplY3QgaXMgbm90IHZhbGlkIGFueSBtb3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh2aWV3QnVpbGRlciAhPSBudWxsKSB7Ci0JCQl2aWV3QnVpbGRlci5kaXNwb3NlKCk7Ci0JCQl2aWV3QnVpbGRlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhYnN0cmFjdCBtZXRob2QgdG8gZ2V0IHRoZSB1cmwgdG8gdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVybAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHVibGlzaGVkVXJsKCk7Ci0KLQkvKioKLQkgKiBhYnN0cmFjdCBtZXRob2QgdG8gZ2V0IHRoZSB1cmwgdG8gdGhlIHB1Ymxpc2ggcmVwb3J0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFB1Ymxpc2hSZXBvcnRVcmwoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdFZpZXdCdWlsZGVyIGNyZWF0ZVZpZXdCdWlsZGVyKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmVQdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1B1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIEV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBvc3RQdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFNpdGVHZW5lcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFNpdGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0ODA0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RTaXRlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgU2l0ZSBHZW5lcmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNpdGVHZW5lcmF0b3IgaW1wbGVtZW50cyBJU2l0ZUdlbmVyYXRvciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX1JPT1QgPSAiZG9jcm9vdC8iOyAvLyROT04tTkxTLTEkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkZfUEFUSCA9ICJkb2Nyb290L1dFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkZfRElSID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJEaXI7Ci0JcHJvdGVjdGVkIFB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zOwotCXByb3RlY3RlZCBIdG1sQnVpbGRlciBidWlsZGVyOwotCQotCXB1YmxpYyBBYnN0cmFjdFNpdGVHZW5lcmF0b3IoSHRtbEJ1aWxkZXIgYnVpbGRlciwgUHVibGlzaEhUTUxPcHRpb25zIG9wdGlvbnMpIHsKLQkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLQkJdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKLQkJdGhpcy5wdWJEaXIgPSBidWlsZGVyLmdldFB1Ymxpc2hEaXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SW5kZXhGaWxlUGF0aCgpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROb2RlSWNvblBhdGgoKTsgCi0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRCYW5uZXJJbWFnZUZpbGUoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaE9wdGlvbnMoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBvc3RQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByZVB1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlUHVibGlzaGVkQm9va21hcmtzKExpc3QgYm9va21hcmtzLCBCb29rbWFyayBkZWZhdWx0VmlldykKLQkJCXRocm93cyBFeGNlcHRpb247Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29weUN1c3RvbWl6ZWRGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucy5iYW5uZXJJbWFnZSAhPSBudWxsICYmIG9wdGlvbnMuYmFubmVySW1hZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShvcHRpb25zLmJhbm5lckltYWdlLCBwdWJEaXIgKyAiaW1hZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW9wdGlvbnMuYmFubmVySW1hZ2UgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShvcHRpb25zLmJhbm5lckltYWdlKTsKLQkJfSBlbHNlIHsKLQkJCW9wdGlvbnMuYmFubmVySW1hZ2UgPSBnZXREZWZhdWx0QmFubmVySW1hZ2VGaWxlKCk7Ci0JCX0KLQkJCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSkgewotCQkJVVJMIHBsdWdpbl91cmwgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUobmV3IFVSTChwbHVnaW5fdXJsLCBXRUJfSU5GX1BBVEgpKS5nZXRQYXRoKCk7Ci0JCQlTdHJpbmcgaW5jbHVkZXMgPSAiKi4qLCAqKi8iOyAvLyROT04tTkxTLTEkCi0JCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihwYXRoLCBwdWJEaXIgKyBXRUJfSU5GX0RJUiwgaW5jbHVkZXMsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUxvY2FsaXplZEZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gY29weSBzY3JpcHRzLCByZW5hbWUgdGhlIGxvY2Fsc2Ugc3BlY2lmaWMgbmFtZSB0byB0aGUgZGVmYXVsdAotCQkvLyBuYW1lCi0JCVB1Ymxpc2hpbmdQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJLmNvcHlMb2NhbGl6ZWRGaWxlcygKLQkJCQkJCURPQ19ST09UICsgInNjcmlwdHMvIiwgbmV3IEZpbGUocHViRGlyLCAic2NyaXB0cy8iKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5jb3B5TG9jYWxpemVkRmlsZXMoCi0JCQkJRE9DX1JPT1QgKyAiaW1hZ2VzLyIsIG5ldyBGaWxlKHB1YkRpciwgImltYWdlcy8iKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5jb3B5TG9jYWxpemVkRmlsZXMoRE9DX1JPT1QsCi0JCQkJbmV3IEZpbGUocHViRGlyLCAiLyIpLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdEYXRhRmlsZU5hbWUoQm9va21hcmsgYiwgU3RyaW5nIGV4dCkgewotCQlGaWxlIGYgPSBuZXcgRmlsZShiLmdldEZpbGVOYW1lKCkpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBmLmdldE5hbWUoKTsKLQkJaW50IGkgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpID49IDApIHsKLQkJCWZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGkpOwotCQl9Ci0KLQkJcmV0dXJuIGZpbGVOYW1lICsgZXh0OyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICggYnVpbGRlciAhPSBudWxsICkgewotCQkJYnVpbGRlci5nZXRMYXlvdXRNYW5hZ2VyKCkuY2xlYXIoKTsKLQkJCWJ1aWxkZXIuZGlzcG9zZSgpOwotCQkJYnVpbGRlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RWaWV3QnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0Vmlld0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmNjFjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RWaWV3QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5JY29uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBwdWJsaXNoaW5nIHZpZXcgYnVpbGRlcnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWaWV3QnVpbGRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX0lOVEVSVkFMID0gNjAwMDAwOyAvLyBpbiBtaWxsaXNlY29uZHMKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzUHJvZmlsaW5nKCk7Ci0KLQlwcm90ZWN0ZWQgSVNpdGVHZW5lcmF0b3Igc2l0ZUdlbmVyYXRvcjsKLQotCXByb3RlY3RlZCBQdWJsaXNoT3B0aW9ucyBvcHRpb25zOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIEJvb2ttYXJrIGRlZmF1bHRWaWV3OwotCi0JUHVibGlzaGluZ1J1bm5hYmxlIHJ1bm5hYmxlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGdlbmVyYXRvcgotCSAqICAgICAgICAgICAgYSBzaXRlIGdlbmVyYXRvcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFZpZXdCdWlsZGVyKElTaXRlR2VuZXJhdG9yIGdlbmVyYXRvcikgewotCQl0aGlzLnNpdGVHZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0JCXRoaXMub3B0aW9ucyA9IGdlbmVyYXRvci5nZXRQdWJsaXNoT3B0aW9ucygpOwotCQl0aGlzLmNvbmZpZyA9IGdlbmVyYXRvci5nZXRIdG1sQnVpbGRlcigpLmdldExheW91dE1hbmFnZXIoKQotCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCXRoaXMucnVubmFibGUgPSBuZXcgUHVibGlzaGluZ1J1bm5hYmxlKGdlbmVyYXRvci5nZXRIdG1sQnVpbGRlcigpLCBUSU1FT1VUX0lOVEVSVkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaXRlIGdlbmVyYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXRlIGdlbmVyYXRvciBhc3NpZ25lZCB0byB0aGlzIHZpZXcgYnVpbGRlcgotCSAqLwotCXB1YmxpYyBJU2l0ZUdlbmVyYXRvciBnZXRTaXRlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5zaXRlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgYnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIGJ1aWxkZXIgYXNzaWduZWQgdG8gdGhpcyB2aWV3IGJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnNpdGVHZW5lcmF0b3IuZ2V0SHRtbEJ1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaGluZyBvcHRpb25zIGFzc2lnbmVkIHRvIHRoaXMgdmlldyBidWlsZGVyCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNpdGVHZW5lcmF0b3IuZ2V0UHVibGlzaE9wdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXlvdXQgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIgYXNzaWduZWQgdG8gdGhpcyB2aWV3IGJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCkgewotCQlyZXR1cm4gZ2V0SHRtbEJ1aWxkZXIoKS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICogCi0JICogQHJldHVybiBhbiBlbGVtZW50IGxheW91dCBtYW5hZ2VyIGFzc2lnbmVkIHRvIHRoaXMgdmlldyBidWlsZGVyCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIChQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcikgZ2V0SHRtbEJ1aWxkZXIoKS5nZXRWYWxpZGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBlbGVtZW50IGNhbiBiZSBwdWJsaXNoZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgY2FuIGJlIHB1Ymxpc2hlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblB1Ymxpc2goTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBpc1Zpc2libGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCB3aWxsIGJlIHZpc2libGUgaW4gdGhlIHB1Ymxpc2hlZCB3ZWIKLQkgKiBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgd2lsbCBiZSB2aXNpYmxlIGluIHRoZQotCSAqICAgICAgICAgcHVibGlzaGVkIHdlYiBzaXRlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWaXNpYmxlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0VmFsaWRhdG9yKCkuaXNEaXNjYXJkZWQobnVsbCwgbnVsbCwgZWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KGVsZW1lbnQsIGNvbmZpZykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaFByb2Nlc3MoKSkgewotCQkJcmV0dXJuIGdldFZhbGlkYXRvcigpLmluQ2xvc3VyZShlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IGVsZW1lbnQsIGJvb2xlYW4gZGlzY2FyZCkgewotCQlpZiAoZGlzY2FyZCkgewotCQkJZ2V0VmFsaWRhdG9yKCkuc2V0RGlzY2FyZGVkRWxlbWVudChlbGVtZW50KTsKLQkJCWdldFZhbGlkYXRvcigpLmxvZ1dhcm5pbmcoZWxlbWVudCwKLQkJCQkJUHVibGlzaGluZ1Jlc291cmNlcy5kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2cpOwotCQl9IGVsc2UgewotCQkJZ2V0VmFsaWRhdG9yKCkuYWRkVmFsaWRDYXRlZ29yeSgoQ29udGVudENhdGVnb3J5KSBlbGVtZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGNhbGMwMUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHVibGlzaGVkRWxlbWVudHMoKSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3IoKS5nZXRQdWJsaXNoZWRFbGVtZW50cygpOwotCX0KLQotCQotCS8qKgotCSAqIFB1Ymxpc2hlcyB0aGUgZWxlbWVudCwgY29sbGVjdHMgdGhlIGxpbmtlZCBlbGVtZW50cyBpbiB0aGUgcHVibGlzaGVkCi0JICogY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCWZpbmFsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0gQmVnaW4gcHVibGlzaGluZyBlbGVtZW50ICIgKwotCQkvLyBlbGVtZW50LmdldEd1aWQoKSArICI6IiArIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArCi0JCS8vIGVsZW1lbnQuZ2V0TmFtZSgpICk7Ci0JCXRyeSB7Ci0JCQlMaXN0IGxpbmtlZEVsZW1lbnRzID0gZ2V0VmFsaWRhdG9yKCkKLQkJCQkJLmdldFJlZmVyZW5jZWRFbGVtZW50cygpOwotCQkJTGlzdCBwdWJsaXNoZWRFbGVtZW50cyA9IGdldFZhbGlkYXRvcigpCi0JCQkJCS5nZXRQdWJsaXNoZWRFbGVtZW50cygpOwkJCQkJCi0JCQlIdG1sQnVpbGRlciBodG1sQnVpbGRlciA9IGdldEh0bWxCdWlsZGVyKCk7Ci0JCQlpZiAoIWNhblB1Ymxpc2goZWxlbWVudCkpIHsKLQkJCQlodG1sQnVpbGRlci5nZXRWYWxpZGF0b3IoKS5sb2dXYXJuaW5nKGVsZW1lbnQsCi0JCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLmludmFsaWRFbGVtZW50V2FybmluZ19tc2cpOwotCQkJfSBlbHNlIGlmICghcHVibGlzaGVkRWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgc3RyOwotCQkJCQkJaWYgKGxpbmtlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCQlzdHIgPSBOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLnB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lLAotCQkJCQkJCQkJCQlJbnRlZ2VyCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKHB1Ymxpc2hlZEVsZW1lbnRzCi0JCQkJCQkJCQkJCQkJCQkuc2l6ZSgpKSwKLQkJCQkJCQkJCQkJSW50ZWdlcgotCQkJCQkJCQkJCQkJCS50b1N0cmluZyhsaW5rZWRFbGVtZW50cwotCQkJCQkJCQkJCQkJCQkJLnNpemUoKSkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdHIgPSBOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLnB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lLAotCQkJCQkJCQkJCQllbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCksCi0JCQkJCQkJCQkJCWVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhzdHIpOwotCi0JCQkJCX0KLQkJCQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gaHRtbEJ1aWxkZXIKLQkJCQkJCQkuZ2V0TGF5b3V0TWFuYWdlcigpCi0JCQkJCQkJLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLS8vCQkJCQlTdHJpbmcgaHRtbGZpbGUgPSBodG1sQnVpbGRlci5nZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQkJCQkJU3RyaW5nIGh0bWxmaWxlID0gcnVubmFibGUuZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCQkJCWVsZW1lbnRQdWJsaXNoZWQobGF5b3V0LCBodG1sZmlsZSk7Ci0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaHRtbEJ1aWxkZXIKLQkJCQkJCQkuZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaEVsZW1lbnRFcnJvcl9tc2csCi0JCQkJCQkJCQkJCQkJZXguZ2V0TWVzc2FnZSgpKSwKLQkJCQkJCQkJCWV4KTsKLQkJCQl9Ci0JCQkJcHVibGlzaGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFscmVhZHkgZ2VuZXJhdGVkOiAiICsKLQkJCQkvLyBnZXRVUkwoZWxlbWVudCkgKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlnZXRIdG1sQnVpbGRlcigpCi0JCQkJCS5nZXRWYWxpZGF0b3IoKQotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJZWxlbWVudCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLnB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnLAotCQkJCQkJCQkJCQllLmdldE1lc3NhZ2UoKSksIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudFB1Ymxpc2hlZChJRWxlbWVudExheW91dCBsYXlvdXQsIFN0cmluZyBodG1sZmlsZSkgewotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5Tm9kZUljb24oRmlsZSBzb3VyY2UpIHsKLQkJU3RyaW5nIG5hbWUgPSBzb3VyY2UuZ2V0TmFtZSgpOwotCi0JCUZpbGUgZGVzdCA9IG5ldyBGaWxlKHNpdGVHZW5lcmF0b3IuZ2V0Tm9kZUljb25QYXRoKCksIG5hbWUpOwotCQlpZiAoRmlsZVV0aWwuY29weUZpbGUoc291cmNlLCBkZXN0KSA9PSBmYWxzZSkgewotCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZXRWYWxpZGF0b3IoKS5sb2dXYXJuaW5nKAotCQkJCQlOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmNvcHlGaWxlV2FybmluZ19tc2csIHNvdXJjZQotCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROb2RlSWNvbk5hbWUoT2JqZWN0IG9iaikgewotCQlGaWxlIGljb25GaWxlID0gbnVsbDsKLQkJU3RyaW5nIGljb25OYW1lID0gbnVsbDsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlVUkkgdXJpID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iaikuZ2V0Tm9kZWljb24oKTsKLQkJCQotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHVyaUluaGVyaXRpbmdCYXNlID0gbnVsbDsKLQkJCWlmICh1cmkgPT0gbnVsbCAmJiBjb25maWcgIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnRbXSB1cmlJbmhlcml0aW5nQmFzZXMgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50WzFdOwotCQkJCXVyaSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0SW5oZXJpdGluZ1VyaSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmosIHVyaSwgdXJpSW5oZXJpdGluZ0Jhc2VzLCBjb25maWcsIDApOwotCQkJCXVyaUluaGVyaXRpbmdCYXNlID0gdXJpSW5oZXJpdGluZ0Jhc2VzWzBdOwotCQkJfQotCi0JCQlTdHJpbmcgZWxlbWVudE5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKS5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKERlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcy51c2VEZWZhdWx0SWNvbihlbGVtZW50TmFtZSkpCi0JCQkJdXJpID0gbnVsbDsKLQotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJLy8gdHJ5IGlmIHRoaXMgaXMgYSB2YWxpZCBVUkwgb3Igbm90Ci0JCQkJYm9vbGVhbiBpc0Z1bGxQYXRoID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJVVJMIHVybCA9IHVyaS50b1VSTCgpOwotCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCWljb25GaWxlID0gbmV3IEZpbGUoVVJMRGVjb2Rlci5kZWNvZGUodXJsLmdldEZpbGUoKSwKLQkJCQkJCQkJIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpc0Z1bGxQYXRoID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBub3QgYSB2YWxpZCB1cmwsIG1heWJlIGEgcmVsYXRpdmUgcGF0aAotCQkJCX0KLQotCQkJCWlmICghaXNGdWxsUGF0aCkgewotCQkJCQkvLyBpY29uRmlsZSA9IG5ldwotCQkJCQkvLyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksCi0JCQkJCS8vIFVSTERlY29kZXIuZGVjb2RlKHVyaS50b1N0cmluZygpKSk7Ci0JCQkJCS8vIFRvIGhhbmRsZSB0aGUgbm9kZUljb24gdXJpLCBFUEYgMS4yLCBpdHMgY2hhbmdlZCBub3cgaXQKLQkJCQkJLy8gaXMgcmVsYXRpdmUgdG8gcGx1Z2luIHBhdGguCi0JCQkJCWljb25GaWxlID0gbmV3IEZpbGUoCi0JCQkJCQkJVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJCQkJdXJpSW5oZXJpdGluZ0Jhc2UgPT0gbnVsbCA/IChFT2JqZWN0KSBvYmogOiB1cmlJbmhlcml0aW5nQmFzZSwgdXJpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKChpY29uRmlsZSAhPSBudWxsKSAmJiAhaWNvbkZpbGUuZXhpc3RzKCkpIHsKLQkJCWljb25GaWxlID0gbnVsbDsKLQkJfQotCi0JCWlmIChpY29uRmlsZSA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgdGhlIGRlZmF1bHQgaWNvbiBuYW1lCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCVN0cmluZyB0eXBlID0gKChNZXRob2RFbGVtZW50KSBvYmopLmdldFR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCS50b0xvd2VyQ2FzZSgpOwotCQkJCWljb25GaWxlID0gSWNvblV0aWwuZ2V0Tm9kZUljb25GaWxlKHR5cGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGljb25GaWxlICE9IG51bGwpIHsKLQkJCS8vIG5lZWQgdG8gY29weSB0aGUgZmlsZSB0b2dldGhlciBhbmQgemlwIGZvciB0aGUgYXBwbGV0Ci0JCQlpZiAoIWljb25GaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZ2V0SHRtbEJ1aWxkZXIoKQotCQkJCQkJCS5nZXRWYWxpZGF0b3IoKQotCQkJCQkJCS5sb2dXYXJuaW5nKAotCQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJCQkJCU5MUwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLm1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnLAotCQkJCQkJCQkJCQkJCWljb25GaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ2V0SHRtbEJ1aWxkZXIoKQotCQkJCQkJCS5nZXRWYWxpZGF0b3IoKQotCQkJCQkJCS5sb2dXYXJuaW5nKAotCQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMubWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2csCi0JCQkJCQkJCQkJCQkJaWNvbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNvcHlOb2RlSWNvbihpY29uRmlsZSk7Ci0JCQlpY29uTmFtZSA9IGljb25GaWxlLmdldE5hbWUoKTsKLQkJfQotCi0JCWlmIChpY29uTmFtZSA9PSBudWxsIHx8IGljb25OYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCVN0cmluZyBuYW1lOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQluYW1lID0gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZSA9IG9iai50b1N0cmluZygpOwotCQkJfQotCi0JCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpLmxvZ1dhcm5pbmcoCi0JCQkJCU5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMubWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2csCi0JCQkJCQkJbmFtZSkpOwotCQl9Ci0KLQkJcmV0dXJuIGljb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudCBvciBpdGVybSBwcm92aWRlciBhZGFwdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgb3IgaXRlcm0gcHJvdmlkZXIgYWRhcHRlcgotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCi0JCQkvLyBjYWxjdWxhdGUgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBmb3IgZXh0ZW5kZXJzLCBnZXQgZnJvbSBiYXNlIGlmCi0JCQkvLyBuZWVkZWQKLQkJCW5hbWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFByZXNlbnRhdGlvbk5hbWUoZSwgY29uZmlnKTsKLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lID0gZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQkJaWYgKG5hbWUuZW5kc1dpdGgoIkltcGwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgb2JqOwotCQkJbmFtZSA9IHByb3ZpZGVyLmdldFRleHQob2JqKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBHVUlEIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBHVUlEIGZvciBhIG1ldGhvZCBlbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0R1VJRChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldEd1aWQoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRociBVUkwgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgYSBtZXRob2QgZWxlbWVudCBvciBhIGJsYW5rIEhUTUwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVUkwoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIGdldExheW91dE1ncigpLmdldExheW91dCgoTWV0aG9kRWxlbWVudCkgb2JqLCB0cnVlKS5nZXRVcmwoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEZJWE1FOiBsYXlvdXQgbmVlZHMgdG8gYmUgcHJvdmlkZWQgZm9yIHVuY2F0ZWdvcml6ZWQgYW5kIGNhdGVnb3J5Ci0JCQkvLyBvYmplY3QKLQkJCXJldHVybiAiYXBwbGV0Ly9lbXB0eS5odG0iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYm9va21hcmsgZm9yIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSA8Y29kZT5Cb29rbWFyazwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9va21hcmsgY3JlYXRlQm9va21hcmsoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCkgewotCQkvLyBwdWJsaXNoIHRoaXMgZWxlbWVudAotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCS8vIGRlbGF5IHRoZSBwdWJsaXNoaW5nIHRpbGwgdGhlIGJvb2ttYXJrcyBhcmUgY3JlYXRlZC4KLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkuYWRkUmVmZXJlbmNlZEVsZW1lbnQobnVsbCwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgYm9va21hcmsgZm9yIHRoaXMgZWxlbWVudAotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoZWxlbWVudCk7Ci0JCVN0cmluZyBndWlkID0gZ2V0R1VJRChlbGVtZW50KTsKLQkJU3RyaW5nIHVybCA9IGdldFVSTChlbGVtZW50KTsKLQkJU3RyaW5nIG5vZGVJY29uID0gZ2V0Tm9kZUljb25OYW1lKGVsZW1lbnQpOwotCi0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZSwKLQkJCQluYW1lKTsKLQkJbW9uaXRvci5zdWJUYXNrKG1zZyk7Ci0JCXJldHVybiBjcmVhdGVCb29rbWFyayhuYW1lLCBndWlkLCB1cmwsIG5vZGVJY29uLCBub2RlSWNvbiwgZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2ttYXJrIGNyZWF0ZUJvb2ttYXJrKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCwgU3RyaW5nIHVybCwKLQkJCVN0cmluZyBjbG9zZUljb24sIFN0cmluZyBvcGVuSWNvbiwgT2JqZWN0IG93bmVyKSB7Ci0KLQkJQm9va21hcmsgYiA9IG5ldyBCb29rbWFyayhuYW1lKTsKLQkJYi5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQliLnNldFVuaXF1ZUlkKGd1aWQpOwotCQliLnNldENsb3NlZEljb25OYW1lKGNsb3NlSWNvbik7Ci0JCWIuc2V0T3Blbkljb25OYW1lKG9wZW5JY29uKTsKLQkJYi5zZXRGaWxlTmFtZSh1cmwpOwotCQliLnNldEZyb21Db250ZW50TGlicmFyeSh0cnVlKTsKLQkJYi5zZXRFbmFibGVkKHRydWUpOwotCQliLnNldEV4aXN0KHRydWUpOwotCQliLnNldFZpc2libGUodHJ1ZSk7Ci0JCWIuc2V0VHJhbnNwYXJlbmN5KGZhbHNlKTsKLQkJYi5zZXREZWZhdWx0KHRydWUpOwotCQliLnNldEN1cnJlbnQoZmFsc2UpOwotCQliLnNldE93bmVyKG93bmVyKTsKLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCB2aWV3LgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5Cb29rbWFyazwvY29kZT4gdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGRlZmF1bHQgdmlldwotCSAqLwotCXB1YmxpYyBCb29rbWFyayBnZXREZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIGRlZmF1bHRWaWV3OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgdmlld3MgYW5kIHJldHVybnMgYSBsaXN0IG9mIGJvb2ttYXJrIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkJvb2ttYXJrPC9jb2RlPgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0PEJvb2ttYXJrPiBidWlsZFZpZXdzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JCWNvbmZpZyA9IG51bGw7Ci0JCWlmICggcnVubmFibGUgIT0gbnVsbCApIHsKLQkJCXJ1bm5hYmxlLmRpc3Bvc2UoKTsKLQkJCXJ1bm5hYmxlID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKCBzaXRlR2VuZXJhdG9yICE9IG51bGwgKSB7Ci0JCQlzaXRlR2VuZXJhdG9yLmRpc3Bvc2UoKTsKLQkJCXNpdGVHZW5lcmF0b3IgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MGI4NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25WaWV3QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlRpbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5Qcm9jZXNzRWxlbWVudEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLlByb2Nlc3NMYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5TdW1tYXJ5UGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuUHVibGlzaGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIEJ1aWxkcyB0aGUgdmlld3MgZGVmaW5lZCBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3QnVpbGRlciBleHRlbmRzIEFic3RyYWN0Vmlld0J1aWxkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9SZWZlcmVuY2VfV29ya2Zsb3dzID0gIlJlZmVyZW5jZV9Xb3JrZmxvd3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1Rhc2tzID0gIlRhc2tzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9SZXNwb25zaWJsZUZvcl9UYXNrcyA9ICJQcmltYXJpbHlfUGVyZm9ybXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1BhcnRpY2lwYXRlc0luX1Rhc2tzID0gIkFkZGl0aW9uYWxseV9QZXJmb3JtcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfUGVyZm9ybWluZ19Sb2xlcyA9ICJQZXJmb3JtaW5nX1JvbGVzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfSW5wdXRfV29ya19Qcm9kdWN0cyA9ICJJbnB1dF9Xb3JrX1Byb2R1Y3RzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9PdXRwdXRfV29ya19Qcm9kdWN0cyA9ICJPdXRwdXRfV29ya19Qcm9kdWN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfV29ya19Qcm9kdWN0c19DcmVhdGVkID0gIlJlc3BvbnNpYmxlX0ZvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfV29ya19Qcm9kdWN0c19Nb2RpZmllZCA9ICJNb2RpZmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfUmVzcG9uc2libGVfUm9sZSA9ICJSZXNwb25zaWJsZV9Sb2xlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9Db250YWluaW5nX1dvcmtfUHJvZHVjdCA9ICJDb250YWluaW5nX1dvcmtfUHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMgPSAiQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0d1aWRhbmNlcyA9ICJHdWlkYW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfSW5wdXRUb19UYXNrID0gIklucHV0X3RvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9PdXRwdXRPZl9UYXNrID0gIk91dHB1dF9mcm9tIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRk9MREVSID0gRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzCi0JCQkuZ2V0SWNvbk5hbWUoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9SZWZlcmVuY2VfV29ya2Zsb3dzID0gUHVibGlzaGluZ1Jlc291cmNlcy5yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1Rhc2tzID0gUHVibGlzaGluZ1Jlc291cmNlcy50YXNrTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9SZXNwb25zaWJsZUZvcl9UYXNrcyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMucHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1BhcnRpY2lwYXRlc0luX1Rhc2tzID0gUHVibGlzaGluZ1Jlc291cmNlcy5hZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUGVyZm9ybWluZ19Sb2xlcyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMucGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9JbnB1dF9Xb3JrX1Byb2R1Y3RzID0gUHVibGlzaGluZ1Jlc291cmNlcy5pbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfT3V0cHV0X1dvcmtfUHJvZHVjdHMgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLm91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfV29ya19Qcm9kdWN0c19DcmVhdGVkID0gUHVibGlzaGluZ1Jlc291cmNlcy5yZXNwb25zaWJsZUZvck5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfV29ya19Qcm9kdWN0c19Nb2RpZmllZCA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMubW9kaWZpZXNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1Jlc3BvbnNpYmxlX1JvbGUgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLnJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfQ29udGFpbmluZ19Xb3JrX1Byb2R1Y3QgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLmNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLmNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfR3VpZGFuY2VzID0gUHVibGlzaGluZ1Jlc291cmNlcy5ndWlkYW5jZU5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfSW5wdXRUb19UYXNrID0gUHVibGlzaGluZ1Jlc291cmNlcy5pbnB1dFRvTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9PdXRwdXRPZl9UYXNrID0gUHVibGlzaGluZ1Jlc291cmNlcy5vdXRwdXRGcm9tTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19MQVlPVVRfREFUQV9GSUxFID0gIi9zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzID0gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJvdGVjdGVkIExpc3Q8Qm9va21hcms+IGJvb2ttYXJrcyA9IG5ldyBBcnJheUxpc3Q8Qm9va21hcms+KCk7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbnVsbDsKLQotCXByb3RlY3RlZCBFT2JqZWN0Q29tcGFyYXRvciBuYW1lQ29tcGFyYXRvciA9IG5ldyBFT2JqZWN0Q29tcGFyYXRvcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyKElTaXRlR2VuZXJhdG9yIHNpdGVHZW5lcmF0b3IpIHsKLQkJc3VwZXIoc2l0ZUdlbmVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIHZpZXdzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHB1Ymxpc2ggdGhlIHJlbGF0ZWQKLQkgKiBjb250ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgQm9va21hcmtzIGZvciB0aGUgdmlld3MKLQkgKi8KLQlwdWJsaWMgTGlzdDxCb29rbWFyaz4gYnVpbGRWaWV3cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkaW5nIHZpZXdzLi4uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlsb25nIHN0YXJ0VGltZSA9IDBMOwotCi0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCi0vLyBhbHJlYWR5IGRvbmUgaW4gUHVibGlzaE1hbmFnZXIKLS8vCQkJLy8gZmlyc3Qgb2YgYWxsLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGxpYnJhcnksCi0vLwkJCS8vIG90aGVyd2lzZSwgc29tZSByZWxhdGlvbnNoaXBzIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcyBhcmUgbm90Ci0vLwkJCS8vIGVzdGFibGlzaGVkCi0vLwkJCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmxvYWRMaWJyYXJ5VGFza19uYW1lKTsKLS8vCQkJaWYgKHByb2ZpbGluZykgewotLy8JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0vLwkJCX0KLS8vCQkJTGlicmFyeVV0aWwubG9hZEFsbCgoTWV0aG9kTGlicmFyeSkgY29uZmlnLmVDb250YWluZXIoKSk7Ci0vLwkJCWlmIChwcm9maWxpbmcpIHsKLS8vCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImJ1aWxkVmlld3MiLCAiTGlicmFyeVV0aWwubG9hZEFsbDogIiAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0vLwkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpCi0vLwkJCQkJCQkJKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotCi0JCQkvLyBjcmVhdGUgYSBmaWx0ZXIgdGhhdCBkb2VzIG5vdCBkaXNjYXJkIHRoZSBjb250cmlidXRvcnMuCi0JCQkvLyBzbyB3ZSBnZXQgdGhlIGNvbnRyaWJ1dG9ycyBpbiB0byBzaG93IGluIHRoZSBuYXZpZ2F0aW9uIHRyZWUKLQkJCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnLCBmYWxzZSk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCi0JCQlpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaXNQdWJsaXNoUHJvY2VzcygpKSB7Ci0JCQkJbWFrZVByb2Nlc3NDbG9zdXJlKCk7Ci0JCQl9Ci0KLQkJCS8vIHB1Ymxpc2ggYWxsIHRoZSB2aWV3cyBpbiB0aGUgY29uZmlndXJhdGlvbgotCQkJaWYgKHByb2ZpbGluZykgewotCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJTGlzdCB2aWV3cyA9IExpYnJhcnlVdGlsLmdldFZhbGlkVmlld3MoY29uZmlnKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCUNvbnRlbnRDYXRlZ29yeSB2ID0gKENvbnRlbnRDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCWlmICghQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KHYsIGNvbmZpZykpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAodik7Ci0JCQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKHRoaXMubW9uaXRvciwgZWxlbWVudCk7Ci0KLQkJCQlpZiAodiA9PSBjb25maWcuZ2V0RGVmYXVsdFZpZXcoKSkgewotCQkJCQlzdXBlci5kZWZhdWx0VmlldyA9IGI7Ci0JCQkJfQotCi0JCQkJLy8gaXRlcmF0ZSB0aHJ1IGNvbmZpZ3VyYXRpb24gdG8gYnVpbGQgdGhlIHZpZXcKLQkJCQlpdGVyYXRlKHYsIGIpOwotCQkJCWlmIChiLmdldENoaWxkQ291bnQoKSA+IDApIHsKLQkJCQkJYm9va21hcmtzLmFkZChiKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRha2VuIHRvIHB1Ymxpc2ggYm9va21hcmtzOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXB1Ymxpc2hSZWZlcmVuY2VFbGVtZW50cygpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJwdWJsaXNoUmVmZXJlbmNlRWxlbWVudHMiLCAvLyROT04tTkxTLTEkCi0JCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGNvcHlJY29uc0Zvck5vbkFwcGxldCgpOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBzYXZlIHB1Ymxpc2hlZCBlbGVtZW50IHVybHMKLQkJaWYgKHByb2ZpbGluZykgewotCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJc2F2ZUVsZW1lbnRVcmxzKCk7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInNhdmVFbGVtZW50VXJscyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGJvb2ttYXJrczsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJvY2VzcyBlbGVtZW50IGNsb3N1cmUgaXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6Ci0JICogPHA+Ci0JICogMS4gcHVibGlzaCB0aGUgc2VsZWN0ZWQgcHJvY2Vzc3Nlcywgd2hpY2ggYnJpbmdzIGluIGFsbCB0aGUgcmVsYXRlZAotCSAqIHByb2Nlc3MgZWxlbWVudHMKLQkgKiA8cD4KLQkgKiAyLiBwdWJsaXNoIGFsbCB0aGUgcmVmZXJlbmNlZCBwcm9jZXNzIGVsZW1lbnRzIGZyb20gc3RlcCAxLCB0aGlzIGJyaW5ncwotCSAqIGluIGFsbCB0aGUgZGlyZWN0bHkgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnRzLiBtYWtlIGEgZmlyc3QgbGV2ZWwKLQkgKiBjbG9zdXJlIHRvIGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cyBhbmQgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMuCi0JICogQW55IGRpcmVjdCByZWZlcmVuY2VzIHRvIGFueSB0eXBlIG9mIGd1aWRhbmNlcyBhcmUgYWxzbyBpbiB0aGlzIGNsb3N1cmUuCi0JICogPHA+Ci0JICogMy4gcHVibGlzaCBhbGwgdGhlIHJlZmVyZW5lZCBub24tQ29udGVudENhdGVnb3J5IGNvbnRlbnQgZWxlbWVudHMgZnJvbQotCSAqIHN0ZXAgMi4gYmFzZWQgb24gdGhlIGZpcnN0IGxldmVsIGNsb3N1cmUuIFRoZSBwdXJwb3NlIG9mIHRoZSBmaXJzdCBsZXZlbAotCSAqIGNsb3N1cmUgaXMgdG8gYWxsb3cgYnJpbmcgaW4gZ3VpZGFuY2VzIHdpdGggdmFsaWQgZWxlbWVudCBsaW5rIGFuZCBhbnkKLQkgKiBvdGhlciByZWZlcmVuY2VzIHN1Y2ggYXMgYSBUYXNrIG9yIFJvbGUsIGJlaW5nIGxpbmtlZCB3aXRoIGEgbWlzc2luZwotCSAqIGVsZW1lbnQgbGluay4gVGhpcyBhZ2FpbiBicmluZ3MgaW4gYWxsIHRoZSBkaXJlY3QgcmVmZXJlbmNlcwotCSAqIDxwPgotCSAqIDQuTWFrZSB0aGUgZmluYWwgY2xvc3VyZSBieSBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBlbGVtZW50czoKLQkgKiA8cD4KLQkgKiBhLiBhbGwgcHVibGlzaGVkIGVsZW1lbnRzIGZyb20gc3RlcCAxLDIsMy4KLQkgKiA8cD4KLQkgKiBiLiBhbGwgcmVmZXJlbmNlZCBHdWlkYW5jZXMgZnJvbSBzdGVwIDMKLQkgKiA8cD4KLQkgKiBjLiBhbGwgR3VpZGFuY2VzIG9mIHR5cGUgUHJhY3RpY2UsIFJvYWRNYXAsIFN1cG9ydGluZyBNYXRlcmlhbCwgYW5kIFRlcm0KLQkgKiBEZWZpbml0aW9uLCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIDxwPgotCSAqIGQuIGFsbCBDb250ZW50IENhdGVnb3JpZXMgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0eXBlIGEsCi0JICogYiwgb3IgYy4gYW5kIHRoZWlyIHBhcmVudCBjYXRlZ29yaWVzCi0JICogPHA+Ci0JICogVGhlIHNlbGVjdGVkIHZpZXcgaXMgcHVibGlzaGVkIGJhc2VkIG9uIHRoZSBlbGVtZW50IGNsb3N1cmUgZGVmaW5lZAotCSAqIGFib3ZlLgotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlUHJvY2Vzc0Nsb3N1cmUoKSB7Ci0JCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWUpOwotCi0JCS8vIHB1Ymxpc2ggdGhlIHNlbGVjdGVkIHByb2Nlc3NlcwotCQkvLyBuZWVkIHRvIGJ1aWxkIGEgY2xvc3VyZSBvZiBhbGwgdGhlIGVsZW1lbnRzIGludm9sdmVkIGluIHRoZQotCQkvLyBwcm9jZXNzZXMKLQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBvcHRpb25zLmdldFByb2Nlc3NlcygpOwotCQlpZiAocHJvY2Vzc2VzICE9IG51bGwgJiYgcHJvY2Vzc2VzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3I8UHJvY2Vzcz4gaXQgPSBwcm9jZXNzZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCW1ha2VQcm9jZXNzQ2xvc3VyZShpdC5uZXh0KCkpOwotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbWFrZSB0aGUgZmlyc3QgbGV2ZWwgY2xvc3VyZSB0byBpbmNsdWRlIGFsbCB0aGUgcHJvY2VzcyBlbGVtZW50cyBhbmQKLQkJLy8gaXQncyByZWZlcmVuY2VkIGVsZW1lbnRzCi0JCS8vIGFueSB0aGluZyBleGNlcHQgR3VpZGFuY2VzIGFuZCBDb250ZW50Q2F0ZWdvcmllcyBvdXRzaWRlIHRoZSBjbG9zdXJlCi0JCS8vIGlzIGZpbHRlcmVkCi0JCWdldFZhbGlkYXRvcigpCi0JCQkJLmFkZENsb3N1cmVFbGVtZW50cyhnZXRWYWxpZGF0b3IoKS5nZXRQdWJsaXNoZWRFbGVtZW50cygpKTsKLQkJZ2V0VmFsaWRhdG9yKCkuYWRkQ2xvc3VyZUVsZW1lbnRzKAotCQkJCWdldFZhbGlkYXRvcigpLmdldFJlZmVyZW5jZWRFbGVtZW50cygpKTsKLQotCQkvLyBub3cgcHVibGlzaCBhbGwgcmVmZXJlbmNlZCBlbGVtZW50cywgYW55IGRpcmVjdCByZWZlcmVuY2VzIGluIHRoZQotCQkvLyBwcm9jZXNzIGVsZW1lbnRzIGFyZQotCQkvLyBwYXJ0IG9mIHRoZSBjbG9zdXJlCi0JCS8vIGRvbid0IHB1Ymxpc2ggY29udGVudCBjYXRlZ29yaWVzIGZvciBub3cgc2luY2UgdGhleSBtaWdodCBiZSBlbXB0eQotCQkvLyBhbmQgZGlzY2FyZGVkIGxhdGVyCi0JCUxpc3QgcmVmcyA9IG5ldyBBcnJheUxpc3QoZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKCEoZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkpIHsKLQkJCQlzdXBlci5wdWJsaXNoKG1vbml0b3IsIGUpOwotCi0JCQkJLy8gY29sbGVjdCBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBpbmZvIHdpdGggc3VwcHJlc3Npb24gc3RhdHVzCi0JCQkJLy8gdGhpcyB3aWxsIGluY2xkdWUgdGhlIGRpYWdyYW1zIGFuZCB0aGUgc3VwcmVzc2lvbiBzdGF0ZXMgb2YKLQkJCQkvLyBlYWNoIGl0ZW0gdW5kZXIgdGhlIGN1cnJlbnQgcHJvY2VlCi0JCQkJaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhlKSkgewotCQkJCQlwdWJsaXNoUHJvY2Vzc0xheW91dCgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCS8vIG5vdywgYW55IHJlZmVyZW5jZWQgZ3VpZGFuY2Ugc2hvdWxkIGJlIGluIHRoZSBjbG9zdXJlLAotCQkvLyBzbyBpbmNsdWRlIHRoZW0gYW5kIG1ha2UgdGhlIGZpbmFsIGNsb3N1cmUKLQkJcmVmcy5jbGVhcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlyZWZzLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZWZzLnNpemUoKSA+IDApIHsKLQkJCWdldFZhbGlkYXRvcigpLmFkZENsb3N1cmVFbGVtZW50cyhyZWZzKTsKLQkJfQotCi0JCS8vIG5vdyBhbGwgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cyBhcmUgdGhlIGVsZW1lbnQgY2xvc3VyZSwgbWFrZSB0aGUKLQkJLy8gZmluYWwgY2xvc3VyZQotCQlnZXRWYWxpZGF0b3IoKS5tYWtlRWxlbWVudENsb3N1cmUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZVByb2Nlc3NDbG9zdXJlKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jKSB7Ci0KLQkJaWYgKHByb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuY2FuU2hvdyhwcm9jLCBjb25maWcpKSB7Ci0JCQlBY3Rpdml0eUxheW91dCBsID0gbmV3IEFjdGl2aXR5TGF5b3V0KCk7Ci0JCQlsLmluaXQoZ2V0TGF5b3V0TWdyKCksIHByb2MsIHByb2MsIG51bGwpOwotCQkJbC5maW5kQWxsTGlua2VkRWxlbWVudHMoKTsKLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRlcihwcm9jKSkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGJhc2VQcm9jID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcHJvYwotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcoYmFzZVByb2MsIGNvbmZpZykpIHsKLQkJCQltYWtlUHJvY2Vzc0Nsb3N1cmUoYmFzZVByb2MpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVibGlzaFJlZmVyZW5jZUVsZW1lbnRzKCkgewotCQkvLyBub3cgcHJvY2VzcyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cyBhbmQgcHVibGlzaCB0aGUgY29udGVudHMKLQkJd2hpbGUgKGdldFZhbGlkYXRvcigpLmdldFJlZmVyZW5jZWRFbGVtZW50cygpLnNpemUoKSA+IDApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBnZXRWYWxpZGF0b3IoKQotCQkJCQkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkucmVtb3ZlKDApOwotCi0JCQl0cnkgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gcmVmZXJlbmNlcyB0byBtZXRob2QgcGx1Z2lucyBhbmQgbWV0aG9kIHBhY2thZ2VzIGNhbiBiZQotCQkJCS8vIGlnbm9yZWQKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQkJc3VwZXIucHVibGlzaChtb25pdG9yLCBlKTsKLQotCQkJCS8vIGNvbGxlY3QgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgaW5mbyB3aXRoIHN1cHByZXNzaW9uIHN0YXR1cwotCQkJCS8vIHRoaXMgd2lsbCBpbmNsZHVlIHRoZSBkaWFncmFtcyBhbmQgdGhlIHN1cHJlc3Npb24gc3RhdGVzIG9mCi0JCQkJLy8gZWFjaCBpdGVtIHVuZGVyIHRoZSBjdXJyZW50IHByb2NlZQotCQkJCWlmIChMaWJyYXJ5VXRpbC5pc1Byb2Nlc3MoZSkpIHsKLQkJCQkJLy8gbG9uZyBzdGFydFRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCXB1Ymxpc2hQcm9jZXNzTGF5b3V0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGUpOwotCQkJCQkvLyBsb25nIGVuZFRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHVibGlzaGVkIHByb2Nlc3MgIiArIGUuZ2V0TmFtZSgpICsKLQkJCQkJLy8gIjogIiArIChlbmRUaW1lMSAtIHN0YXJ0VGltZTEpICsgIiBtcyIpOwotCQkJCX0KLQotCQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWxvbmcgdGltZVRha2VuID0gZW5kVGltZSAtIHN0YXJ0VGltZTsKLQkJCQlpZiAodGltZVRha2VuID49IDUwMDApIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQdWJsaXNoZWQgIiArIGUuZ2V0TmFtZSgpICsgIjogIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkrIHRpbWVUYWtlbiArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkubG9nRXJyb3IoZSwgIkVycm9yIHB1Ymxpc2hpbmcgZWxlbWVudCIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hQcm9jZXNzTGF5b3V0KGZpbmFsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBlKSB7Ci0KLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQWN0aXZpdHlMYXlvdXQgbGF5b3V0ID0gbmV3IEFjdGl2aXR5TGF5b3V0KCk7Ci0JCQkJCWxheW91dC5pbml0KGdldExheW91dE1ncigpLAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGUsIG51bGwsIG51bGwpOwotCQkJCQlQcm9jZXNzTGF5b3V0RGF0YSBwZCA9IG5ldyBQcm9jZXNzTGF5b3V0RGF0YShlLmdldEd1aWQoKSk7Ci0JCQkJCWxheW91dC5sb2FkTGF5b3V0RGF0YShwZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCXByaW50TGF5b3V0U2NyaXB0KHBkKTsKLQkJCQkJcGQuY2xlYXIoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQllLAotCQkJCQkJCQkJIkVycm9yIHB1Ymxpc2hpbmcgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSIsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJfQotCQl9OwotCi0JCVRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCXRyeSB7Ci0KLQkJCS8vIHJ1biB0aGUgcHVibGlzaGluZyBhbmQgY2hlY2sgdGhlIHRpbWUsIGlmIHRpbWVvdXQsIHRlcm1pbmF0ZSBpdAotCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlKTsKLQkJCXQuc3RhcnQoKTsKLQkJCXQuam9pbihUSU1FT1VUX0lOVEVSVkFMKTsKLQkJCWlmICh0LmlzQWxpdmUoKSkgewotCQkJCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZGllIGFuZCBsb2cgYW4gZXJyb3IKLQkJCQl0aW1lci5zdG9wKCk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCS5sb2dJbmZvKAotCQkJCQkJCQllLAotCQkJCQkJCQkicHVibGlzaGluZyBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBkYXRhIHRha2VzICIgKyB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBhbHJlYWR5IGFuZCBpcyBzdGlsbCBub3QgZG9uZSB5ZXQgLi4uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXRpbWVyLnN0YXJ0KCk7Ci0JCQkJdC5qb2luKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRpbWVyLnN0b3AoKTsKLQkJCWdldFZhbGlkYXRvcigpCi0JCQkJCS5sb2dJbmZvKAotCQkJCQkJCWUsCi0JCQkJCQkJdGltZXIuZ2V0VG90YWxUaW1lKCkKLQkJCQkJCQkJCSsgIiBtaW5pIHNlY29uZHMgcHVibGlzaGluZyBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBkYXRhIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TGF5b3V0U2NyaXB0KFByb2Nlc3NMYXlvdXREYXRhIGRhdGEpIHsKLQkJRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLAotCQkJCVBST0NFU1NfTEFZT1VUX0RBVEFfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJUHJpbnRXcml0ZXIgcHcgPSBudWxsOwotCQl0cnkgewotCQkJLy8gY3JlYXRlIGEgc3RyZWFtIHdpdGggYXBwZW5kIGVuYWJsZWQKLQkJCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlLCB0cnVlKTsKLQotCQkJLy8gY3JlYXRlIGEgd3JpdGUgd2l0aCB1dGYtOCBlbmNvZGluZwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIGNyZWF0ZSBhIHByaW50IHdyaXRlciB3aXRoIGF1dG8gZmx1c2gKLQkJCXB3ID0gbmV3IFByaW50V3JpdGVyKHdyaXRlciwgdHJ1ZSk7Ci0JCQlkYXRhLnByaW50KHB3KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWdldFZhbGlkYXRvcigpLmxvZ0Vycm9yKCJ1bmFibGUgdG8gc2F2ZSBwcm9jZXNzIGxheW91dCBkYXRhIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB3ICE9IG51bGwpIHsKLQkJCQlwdy5mbHVzaCgpOwotCQkJCXB3LmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgdGhydSB0dWVlCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3Qgb2JqLCBCb29rbWFyayBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgPSBudWxsOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCXRyZWVJdGVtQ29udGVudFByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgb2JqOwotCQkJfSBlbHNlIHsKLQkJCQl0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJfQotCQkKLQkJCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQkJT2JqZWN0IGl0b3JPYmogPSBpdC5uZXh0KCk7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKGl0b3JPYmopOwotCi0JCQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3cobWUsIGNvbmZpZykpIHsKLQkJCQkJCQkJbWUgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCQkJCQkJZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChtZSBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCQkJCQkJCQlidWlsZFRvb2xTdWJUcmVlKChUb29sKSBtZSwgcGFyZW50KTsKLQkJCQkJCQkJCX0gZWxzZSBpZiAobWUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCQkJCQkJYnVpbGREaXNjaXBsaW5lU3ViVHJlZSgoRGlzY2lwbGluZSkgbWUsCi0JCQkJCQkJCQkJCQlwYXJlbnQpOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkvLyBlbHNlIGlmIChtZSBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZwotCQkJCQkJCQkJLy8gfHwgbWUgaW5zdGFuY2VvZiBEb21haW4gfHwgbWUgaW5zdGFuY2VvZgotCQkJCQkJCQkJLy8gV29ya1Byb2R1Y3RUeXBlCi0JCQkJCQkJCQkvLyB8fCBtZSBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZyB8fCBtZQotCQkJCQkJCQkJLy8gaW5zdGFuY2VvZiBSb2xlU2V0ICkKLQkJCQkJCQkJCWVsc2UgaWYgKG1lIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0KLQkJCQkJCQkJCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSAoQ29udGVudENhdGVnb3J5KSBtZTsKLQotCQkJCQkJCQkJCS8vIGlmIHRoZSBjb250ZW50IGNhdGVnb3J5IGlzIGVtcHR5LAotCQkJCQkJCQkJCS8vIGRvbid0IGFkZCB0byB0aGUgcGFyZW50Ci0JCQkJCQkJCQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKAotCQkJCQkJCQkJCQkJdGhpcy5tb25pdG9yLCBjYyk7Ci0JCQkJCQkJCQkJaXRlcmF0ZShpdG9yT2JqLCBiKTsKLQkJCQkJCQkJCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hFbXB0eUNhdGVnb3JpZXMoKQotCQkJCQkJCQkJCQkJfHwgYi5nZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0JCQkJCQkJCQkJCXBhcmVudC5hZGRDaGlsZChiKTsKLQkJCQkJCQkJCQkJZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoY2MsIGZhbHNlKTsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShjYywgdHJ1ZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlpZiAoaXRvck9iaiBpbnN0YW5jZW9mIFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJCQkJYnVpbGRQcmFjdGljZVN1Ymdyb3VwVHJlZShvYmosIHBhcmVudCwKLQkJCQkJCQkJCQkJCQkoUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgaXRvck9iaik7Ci0JCQkJCQkJCQkJfSBlbHNlIHsJCQkJCQkJCQkJCi0JCQkJCQkJCQkJCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyayhtZSwgcGFyZW50KTsKLQkJCQkJCQkJCQkJaWYgKCFidWlsZFN1YlRyZWUoaXRvck9iaiwgbWUsIGIpKSB7Ci0JCQkJCQkJCQkJCQlpdGVyYXRlKGl0b3JPYmosIGIpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBidWlsZGluZyBuYXZpZ2F0aW9uIHRyZWUgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpCi0JCQkJCQkJCQkubG9nRXJyb3IobWVzc2FnZSwgZSk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgewotCQkJCQkJCWJ1aWxkUHJhY3RpY2VTdWJncm91cFRyZWUob2JqLCBwYXJlbnQsIChQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKSBpdG9yT2JqKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaXRlcmF0ZShpdG9yT2JqLCBwYXJlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBidWlsZGluZyBuYXZpZ2F0aW9uIHRyZWUiOyAvLyROT04tTkxTLTEkCi0JCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpLmxvZ0Vycm9yKG1lc3NhZ2UsIGUpOwotCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGEgYm9va21hcmsgdW5kZXIgdGhlIHNwZWNpZmllZCBwYXJlbnQuIElmIG5vIHBhcmVudCBpcyBzcGVjaWZpZWQsCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEJvb2ttYXJrIGNyZWF0ZUJvb2ttYXJrKE9iamVjdCBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQpIHsKLQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKHRoaXMubW9uaXRvciwgZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJYm9va21hcmtzLmFkZChiKTsKLQkJfSBlbHNlIHsKLQkJCXBhcmVudC5hZGRDaGlsZChiKTsKLQkJfQotCi0JCXJldHVybiBiOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHRoZSBzdWIgdHJlZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGlzCi0JICogaGFuZGxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gYm0KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRTdWJUcmVlKE9iamVjdCBvYmosIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgQm9va21hcmsgYm0pIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlidWlsZFRhc2tTdWJUcmVlKChUYXNrKSBlbGVtZW50LCBibSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWJ1aWxkUm9sZVN1YlRyZWUoKFJvbGUpIGVsZW1lbnQsIGJtKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCWJ1aWxkV29ya1Byb2R1Y3RTdWJUcmVlKChXb3JrUHJvZHVjdCkgZWxlbWVudCwgYm0pOwotCQl9IGVsc2UgaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhlbGVtZW50KSkgewotCQkJYnVpbGRQcm9jZXNzU3ViVHJlZShvYmosIChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGVsZW1lbnQsIGJtKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGhhbmRsZWQ6ICIgKyBlbGVtZW50KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEl0ZW1zKExpc3QgZWxlbWVudHMsIEJvb2ttYXJrIGJtKSB7Ci0JCWJ1aWxkSXRlbXMoZWxlbWVudHMsIGJtLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSXRlbXMoTGlzdCBlbGVtZW50cywgQm9va21hcmsgYm0sIGJvb2xlYW4gYnVpbGRTdWJUcmVlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0KLQkJCS8vIGZpbHRlciBhd2F5IHRoZSBjb250YWlubWVudCBjaGlsZC1lbGVtZW50IGlmIGFueSBvZiB0aGUgcGFyZW50KHMpCi0JCQkvLyBhcmUgaW4gdGhlIGxpc3QKLQkJCS8vIDAwMzg0NjE5IC0gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIGlnbm9yZSBpdAotCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250YWlubWVudEVsZW1lbnQoZWxlbWVudCkKLQkJCQkJJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRhaW5lckluTGlzdChlbGVtZW50LCBlbGVtZW50cywKLQkJCQkJCQljb25maWcpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWJ1aWxkSXRlbShlbGVtZW50LCBibSwgYnVpbGRTdWJUcmVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQm9va21hcmsgYnVpbGRJdGVtKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgQm9va21hcmsgcGFyZW50LAotCQkJYm9vbGVhbiBidWlsZFN1YlRyZWUpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUJvb2ttYXJrIGIgPSBudWxsOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBzaG93YWJsZQotCQlNZXRob2RFbGVtZW50IGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGVsZW1lbnQsCi0JCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQlpZiAoaXNWaXNpYmxlKGUpKSB7Ci0JCQliID0gY3JlYXRlQm9va21hcmsodGhpcy5tb25pdG9yLCBlKTsKLQkJCWlmIChiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gYjsKLQkJCX0KLQotCQkJcGFyZW50LmFkZENoaWxkKGIpOwotCi0JCQlpZiAoYnVpbGRTdWJUcmVlKSB7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlidWlsZENvbnRhaW5lZEFydGlmYWN0c1N1YlRyZWUoKEFydGlmYWN0KSBlLCBiLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0KLS8vCS8qKgotLy8JICogY3JlYXRlIHRoZSBmb2xkZXIgYm9va21hcmsgYW5kIGl0J3MgY2hpbGRyZW4uIGdlbmVyYXRlIHRoZSBmb2xkZXIgc3VtbWFyeQotLy8JICogcGFnZQotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogQHBhcmFtIGJtCi0vLwkgKiBAcGFyYW0gbm9kZU5hbWUKLS8vCSAqIEBwYXJhbSBpdGVtcwotLy8JICovCi0vLwotLy8JcHJpdmF0ZSBCb29rbWFyayBjcmVhdGVGb2xkZXJCb29rbWFyayhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEJvb2ttYXJrIGJtLAotLy8JCQlTdHJpbmcgbm9kZU5hbWUsIExpc3QgaXRlbXMsIGJvb2xlYW4gY3JlYXRlQ2hpbGRyZW4pIHsKLS8vCQlCb29rbWFyayBiID0gbnVsbDsKLS8vCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotLy8JCQlJRWxlbWVudExheW91dCBsID0gbmV3IFN1bW1hcnlQYWdlTGF5b3V0KGdldEh0bWxCdWlsZGVyKCkKLS8vCQkJCQkuZ2V0TGF5b3V0TWFuYWdlcigpLCBlbGVtZW50LCBub2RlTmFtZSwgaXRlbXMpOwotLy8JCQlTdHJpbmcgdXJsID0gbC5nZXRVcmwoKTsKLS8vCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZW5lcmF0ZUh0bWwobCk7Ci0vLwkJCWIgPSBjcmVhdGVCb29rbWFyayhub2RlTmFtZSwgRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpLCB1cmwsCi0vLwkJCQkJSUNPTl9GT0xERVIsIElDT05fRk9MREVSLCBudWxsKTsKLS8vCQkJYm0uYWRkQ2hpbGQoYik7Ci0vLwkJCWlmIChjcmVhdGVDaGlsZHJlbikgewotLy8JCQkJYnVpbGRJdGVtcyhpdGVtcywgYik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBiOwotLy8JfQotCi0JU2V0PFN0cmluZz4gc3VtbWFyeVBhZ2VzR2VuZXJhdGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQotCXByaXZhdGUgQm9va21hcmsgY3JlYXRlRm9sZGVyQm9va21hcmsoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBCb29rbWFyayBibSwKLQkJCVN0cmluZyBwcmVmaXhOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIExpc3QgaXRlbXMsCi0JCQlib29sZWFuIGNyZWF0ZUNoaWxkcmVuKSB7Ci0JCUJvb2ttYXJrIGIgPSBudWxsOwotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJSUVsZW1lbnRMYXlvdXQgbCA9IG5ldyBTdW1tYXJ5UGFnZUxheW91dChnZXRIdG1sQnVpbGRlcigpCi0JCQkJCS5nZXRMYXlvdXRNYW5hZ2VyKCksIGVsZW1lbnQsIHByZWZpeE5hbWUsIG5vZGVOYW1lLCBpdGVtcyk7Ci0JCQlTdHJpbmcgdXJsID0gbC5nZXRVcmwoKTsKLQkJCQotCQkJLy8gZG9uJ3QgcmVnZW5lcmF0ZSB0aGUgcGFnZQotCQkJLy8gMjAwNjE5IC0gU3VtbWFyeSBwYWdlIGh0bWwgd2FzIGdlbmVyYXRlZCBtdWx0aXBsZSB0aW1lcyB3aGVuIHB1Ymxpc2hpbmcKLQkJCWlmICggIXN1bW1hcnlQYWdlc0dlbmVyYXRlZC5jb250YWlucyh1cmwpICkgewotCQkJCWdldEh0bWxCdWlsZGVyKCkuZ2VuZXJhdGVIdG1sKGwpOwotCQkJCXN1bW1hcnlQYWdlc0dlbmVyYXRlZC5hZGQodXJsKTsKLQkJCX0KLQkJCQotCQkJYiA9IGNyZWF0ZUJvb2ttYXJrKG5vZGVOYW1lLCBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHVybCwKLQkJCQkJSUNPTl9GT0xERVIsIElDT05fRk9MREVSLCBudWxsKTsKLQkJCWJtLmFkZENoaWxkKGIpOwotCQkJaWYgKGNyZWF0ZUNoaWxkcmVuKSB7Ci0JCQkJYnVpbGRJdGVtcyhpdGVtcywgYik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJhY3RpY2VTdWJncm91cFRyZWUoT2JqZWN0IHByb3ZpZGVyUGFyZW50LAotCQkJQm9va21hcmsgcGFyZW50LCBQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihudWxsKTsKLQkJTGlzdCBpdGVtcyA9IGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCA/IChMaXN0KSBjaGlsZHJlbgotCQkJCTogbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0KLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJUHJhY3RpY2UgcHJhY3RpY2UgPSBwcm92aWRlci5nZXRQcmFjdGljZSgpOwotCQkJaWYgKHByYWN0aWNlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlFbGVtZW50TGF5b3V0IGwgPSBuZXcgU3VtbWFyeVBhZ2VMYXlvdXQoZ2V0SHRtbEJ1aWxkZXIoKQotCQkJCQkuZ2V0TGF5b3V0TWFuYWdlcigpLCBwcmFjdGljZSwgcHJvdmlkZXIuZ2V0VGV4dChudWxsKSwKLQkJCQkJcHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgaXRlbXMsIHByb3ZpZGVyLmdldFRleHQobnVsbCkpOwotCQkJU3RyaW5nIHVybCA9IGwuZ2V0VXJsKCk7Ci0KLQkJCWlmICghc3VtbWFyeVBhZ2VzR2VuZXJhdGVkLmNvbnRhaW5zKHVybCkpIHsKLQkJCQlnZXRIdG1sQnVpbGRlcigpLmdlbmVyYXRlSHRtbChsKTsKLQkJCQlzdW1tYXJ5UGFnZXNHZW5lcmF0ZWQuYWRkKHVybCk7Ci0JCQl9Ci0KLQkJCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyayhwcm92aWRlci5nZXRUZXh0KG51bGwpLCBFY29yZVV0aWwKLQkJCQkJLmdlbmVyYXRlVVVJRCgpLCB1cmwsIElDT05fRk9MREVSLCBJQ09OX0ZPTERFUiwgbnVsbCk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoYik7Ci0JCQl0aGlzLml0ZXJhdGUocHJvdmlkZXIsIGIpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIEJvb2ttYXJrIGJ1aWxkRGlzY2lwbGluZVN1YlRyZWUoRGlzY2lwbGluZSBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQpIHsKLQkJU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUJvb2ttYXJrIGI7Ci0KLQkJLy8gbmVlZCB0byBjYWxjdWxhdGUgdGhlIHJlYWxpemVkIHZhbHVlIG9mIHRoZSBmZWF0dXJlCi0JCUxpc3QgaXRlbXNfd29ya2Zsb3cgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSk7Ci0KLQkJLy8gVGFza3MgaW4gcHVibGlzaGVkIHNpdGUgdW5kZXIgRGlzY2lwbGluZXMgYXJlIGluCi0JCS8vIHJhbmRvbSBvcmRlcgotCQkvLyB1c2UgdGhlIGFkYXB0b3IgZmFjdG9yeSB0byBnZXQgdGhlIGNoaWxkcmVucwotCQkvLyBMaXN0IGl0ZW1zX3Rhc2sgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksIGNvbmZpZyk7Ci0JCUxpc3QgaXRlbXNfdGFzayA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtX3N1YkRpc2NpcGxpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQlPYmplY3QgaXRvck9iaiA9IGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZSA9IExpYnJhcnlVdGlsLnVud3JhcChpdG9yT2JqKTsKLQkJCQlpZiAoKGUgaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlLCBnZXRMYXlvdXRNZ3IoKQotCQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQkJaWYgKHQgIT0gbnVsbCkgewotCQkJCQkJaXRlbXNfdGFzay5hZGQodCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGUsIGdldExheW91dE1ncigpCi0JCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCQlpdGVtX3N1YkRpc2NpcGxpZXMuYWRkKGQpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gYWxsIGd1aWRhbmNlcwotCQlMaXN0IGl0ZW1zX2d1aWRhbmNlID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVtc19ndWlkYW5jZS5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpKSk7Ci0JCWl0ZW1zX2d1aWRhbmNlLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zX2d1aWRhbmNlLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkpOwotCQlpdGVtc19ndWlkYW5jZS5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXNfZ3VpZGFuY2UuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXNfZ3VpZGFuY2UuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpKTsKLQotCQlpZiAoIW9wdGlvbnMuaXNQdWJsaXNoRW1wdHlDYXRlZ29yaWVzKCkKLQkJCQkmJiBpdGVtc193b3JrZmxvdy5zaXplKCkgKyBpdGVtc190YXNrLnNpemUoKQotCQkJCQkJKyBpdGVtc19ndWlkYW5jZS5zaXplKCkgKyBpdGVtX3N1YkRpc2NpcGxpZXMuc2l6ZSgpID09IDApIHsKLQkJCS8vIGRvIG5vdGhpbmcsIGRvbid0IHNob3cgdGhlIGZvbGRlcgotCQkJZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoZWxlbWVudCwgdHJ1ZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIGl0ZW0gYm9va21hcmsKLQkJLy8gZG9uJ3Qgc2V0IHRvIHRoZSBwYXJlbnQgeWV0LiBtYWtlIHN1cmUgaXQncyBub3QgZW1wdHkKLQkJLy8gbmVlZCB0byBjaGVjayB0aGUgc3ViLWRpc2NpcGxpbmVzCi0JCS8vIDE1MDk4NCAtIFB1Ymxpc2hpbmc6IE5lc3RlZCBkaXNjaXBsaW5lIGlzIG5vdCBkaXNwbGF5IGluIHRoZSBwdWJsaXNoCi0JCS8vIHBhZ2UKLQkJLy8gQm9va21hcmsgYm0gPSBjcmVhdGVCb29rbWFyayhlbGVtZW50LCBwYXJlbnQpOwotCQlCb29rbWFyayBibSA9IGNyZWF0ZUJvb2ttYXJrKHRoaXMubW9uaXRvciwgZWxlbWVudCk7Ci0KLQkJLy8gc3ViLWRpc2NpcGxpbmVzIGNvbWUgZmlyc3QKLQkJaWYgKGl0ZW1fc3ViRGlzY2lwbGllcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbV9zdWJEaXNjaXBsaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEaXNjaXBsaW5lIGQgPSAoRGlzY2lwbGluZSkgaXQubmV4dCgpOwotCQkJCWJ1aWxkRGlzY2lwbGluZVN1YlRyZWUoZCwgYm0pOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQotCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtc193b3JrZmxvdywgbmFtZUNvbXBhcmF0b3IpOwotCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtc190YXNrLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zX2d1aWRhbmNlLCBuYW1lQ29tcGFyYXRvcik7Ci0KLQkJCWJ1aWxkSXRlbXMoaXRlbXNfd29ya2Zsb3csIGJtKTsKLQkJCWJ1aWxkSXRlbXMoaXRlbXNfdGFzaywgYm0pOwotCQkJYnVpbGRJdGVtcyhpdGVtc19ndWlkYW5jZSwgYm0pOwotCQl9IGVsc2UgewotCQkJaWYgKGl0ZW1zX3dvcmtmbG93LnNpemUoKSA+IDApIHsKLQkJCQlCb29rbWFyayB3ZkZvbGRlciA9IGNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJUFJFRklYX1JlZmVyZW5jZV9Xb3JrZmxvd3MsIE5PREVfUmVmZXJlbmNlX1dvcmtmbG93cywKLQkJCQkJCWl0ZW1zX3dvcmtmbG93LCBmYWxzZSk7Ci0KLQkJCQkvLyBDYXBhYmlsaXR5IFBhdHRlcm5zIGluIHRyZWVicm93c2VyIHVuZGVyCi0JCQkJLy8gZGlzY2lwbGluZXMtcmVmZXJlbmNlIHdvcmtmbG93cyBjYW5ub3QgYmUgZXhwYW5kZWQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXNfd29ya2Zsb3cuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJLy8gMTc5NjA5IC0gRXhjZXB0aW9uIHdoZW4gYXNzaWduIGFjdGl2aXR5IGFzIGRpc2NpcGxpbmUncwotCQkJCQkvLyByZWZlcmVuY2VkIHdvcmtmbG93Ci0JCQkJCS8vIHRoaXMgaXMgYSBtb2RlbCBjaGFuZ2UsIHJlZmVyZW5jZWQgd29ya2Zsb3cgY2FuIGJlCi0JCQkJCS8vIEFjdGl2aXR5LAotCQkJCQkvLyBvbGQgbW9kZWwgcmVmZXJlbmNlcyBQcm9jZXNzCi0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXQubmV4dCgpOwotCQkJCQlCb29rbWFyayBibVdvcmtmbG93ID0gYnVpbGRJdGVtKGFjdCwgd2ZGb2xkZXIsIGZhbHNlKTsKLQkJCQkJYnVpbGRBY3Rpdml0eVN1YlRyZWUoYWN0LCBhY3QsIGJtV29ya2Zsb3cpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChpdGVtc190YXNrLnNpemUoKSA+IDApIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX1Rhc2tzLCBOT0RFX1Rhc2tzLAotCQkJCQkJaXRlbXNfdGFzaywgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAoaXRlbXNfZ3VpZGFuY2Uuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfR3VpZGFuY2VzLAotCQkJCQkJTk9ERV9HdWlkYW5jZXMsIGl0ZW1zX2d1aWRhbmNlLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaEVtcHR5Q2F0ZWdvcmllcygpIHx8IGJtLmdldENoaWxkQ291bnQoKSA+IDApIHsKLQkJCXBhcmVudC5hZGRDaGlsZChibSk7Ci0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCBmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBibTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBY3Rpdml0eVN1YlRyZWUoT2JqZWN0IG9iaiwgQWN0aXZpdHkgZWxlbWVudCwgQm9va21hcmsgYm0pIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotCQlQcm9jZXNzRWxlbWVudEl0ZW0gcHJvY0l0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKG9iaiwgZWxlbWVudCwKLQkJCQllbGVtZW50LmdldEd1aWQoKSk7Ci0KLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IHN1cGVyLmdldExheW91dE1ncigpCi0JCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCVN1cHByZXNzaW9uIHN1cCA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJaXRlcmF0ZUFjdGl2aXR5KHByb2NJdGVtLCBibSwgYWRhcHRlckZhY3RvcnksIHN1cCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVG9vbFN1YlRyZWUoVG9vbCBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRvb2xfVG9vbE1lbnRvcnMoKSk7Ci0JCWlmIChvcHRpb25zLmlzUHVibGlzaEVtcHR5Q2F0ZWdvcmllcygpIHx8IGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyayhlbGVtZW50LCBwYXJlbnQpOwotCQkJYnVpbGRJdGVtcyhpdGVtcywgYik7Ci0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCBmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCB0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFRhc2tTdWJUcmVlKFRhc2sgZWxlbWVudCwgQm9va21hcmsgYm0pIHsKLQotCQlTdHJpbmcgdXJsOwotCQlCb29rbWFyayBiOwotCi0JCUxpc3QgYWxsSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gcGVyZm9ybWluZyByb2xlcwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJMaXN0ID0gKExpc3QpIGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCkpOwotCQlpZiAockxpc3QgIT0gbnVsbCkgewotCQkJaXRlbXMuYWRkQWxsKHJMaXN0KTsKLQkJfQotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX1BlcmZvcm1pbmdfUm9sZXMsCi0JCQkJCQlOT0RFX1BlcmZvcm1pbmdfUm9sZXMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkvLyBpbnB1dCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLAotCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkpKTsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKSk7Ci0KLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9JbnB1dF9Xb3JrX1Byb2R1Y3RzLAotCQkJCQkJTk9ERV9JbnB1dF9Xb3JrX1Byb2R1Y3RzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIG91dHB1dCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLCBUT0RPCi0JCWl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfT3V0cHV0KCkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX091dHB1dF9Xb3JrX1Byb2R1Y3RzLAotCQkJCQkJTk9ERV9PdXRwdXRfV29ya19Qcm9kdWN0cywgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zLmNsZWFyKCk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSkpOwotCQkvLyBPYmplY3QgZSA9IGNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0VGFza19Fc3RpbWF0ZSgpKTsKLQkJLy8gaWYgKGUgIT0gbnVsbCkgewotCQkvLyBpdGVtcy5hZGQoZSk7Ci0JCS8vIH0KLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX1Rvb2xNZW50b3JzKCkpKTsKLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9HdWlkYW5jZXMsCi0JCQkJCQlOT0RFX0d1aWRhbmNlcywgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCWJ1aWxkSXRlbXMoYWxsSXRlbXMsIGJtKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUm9sZVN1YlRyZWUoUm9sZSBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlTdHJpbmcgdXJsOwotCQlCb29rbWFyayBiOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBhbGxJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyB0YXNrcywgLy8gbmVlZCBhIGdlbmVyYWwgb3ZlcnZpZXcgcGFnZSwgVE9ETwotCQkvLyBMaXN0IGl0ZW1zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tzKGVsZW1lbnQpOwotCQlMaXN0IGl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzKTsKLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfUmVzcG9uc2libGVGb3JfVGFza3MsCi0JCQkJCQlOT0RFX1Jlc3BvbnNpYmxlRm9yX1Rhc2tzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghb3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJLy8gc2Vjb25kYXJ5IHRhc2tzCi0JCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1NlY29uZGFyeV9UYXNrcyk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfUGFydGljaXBhdGVzSW5fVGFza3MsCi0JCQkJCQlOT0RFX1BhcnRpY2lwYXRlc0luX1Rhc2tzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3RzLAotCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQliID0gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sCi0JCQkJCQlQUkVGSVhfV29ya19Qcm9kdWN0c19DcmVhdGVkLAotCQkJCQkJTk9ERV9Xb3JrX1Byb2R1Y3RzX0NyZWF0ZWQsIGl0ZW1zLCBmYWxzZSk7Ci0JCQkJYnVpbGRJdGVtcyhpdGVtcywgYiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghb3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJLy8gbW9kaWZpZXMgd29yayBwcm9kdWN0cywgbmVlZCBhIHN1bW1hcnkgcGFnZSwgVE9ETwotCQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVfTW9kaWZpZXMoKSk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWIgPSBjcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwKLQkJCQkJCVBSRUZJWF9Xb3JrX1Byb2R1Y3RzX01vZGlmaWVkLAotCQkJCQkJTk9ERV9Xb3JrX1Byb2R1Y3RzX01vZGlmaWVkLCBpdGVtcywgZmFsc2UpOwotCQkJCWJ1aWxkSXRlbXMoaXRlbXMsIGIsIHRydWUpOwotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zLmNsZWFyKCk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0d1aWRhbmNlcywgTk9ERV9HdWlkYW5jZXMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkvLyBsaWdodCB3ZWlnaHQgdHJlZSwgbm8gc3ViIGZvbGRlcnMKLQkJCWJ1aWxkSXRlbXMoYWxsSXRlbXMsIGJtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFdvcmtQcm9kdWN0U3ViVHJlZShXb3JrUHJvZHVjdCBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlMaXN0IGl0ZW1zOwotCQlTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQm9va21hcmsgYjsKLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgYWxsSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gcGVyZm9ybWluZyByb2xlcywgMC4xIHJlZmVyZW5jZSBlbGVtZW50IHdpbGwgYmUgcmVhbGl6ZWQgaW4gYnVpbGRJdGVtCi0JCS8vIG11bHRpcGxpY2l0eSBjaGFuZ2UgZm9yIG9wcG9zaXRlIGZlYXR1cmVzCi0JCS8vIFJvbGUgciA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZShlbGVtZW50KTsKLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzKTsKLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfUmVzcG9uc2libGVfUm9sZSwKLQkJCQkJCU5PREVfUmVzcG9uc2libGVfUm9sZSwgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjb250YWluaW5nIHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsIFRPRE8KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCi0JCQlpZiAoIW9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoQXJ0aWZhY3QpIGVsZW1lbnQpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCQkJLy8gY3JlYXRlQm9va21hcmsoTk9ERV9Db250YWluaW5nX1dvcmtfUHJvZHVjdCwKLQkJCQkvLyBOT0RFX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0LCB1cmwsICIiLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAvLyROT04tTkxTLTIkCi0JCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWl0ZW1zLmFkZCh3cCk7Ci0JCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJCVBSRUZJWF9Db250YWluaW5nX1dvcmtfUHJvZHVjdCwKLQkJCQkJCQlOT0RFX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0LCBpdGVtcywgdHJ1ZSk7Ci0JCQkJfQotCi0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLCBUT0RPCi0JCQkvLyBpdGVtcyA9ICgoQXJ0aWZhY3QpZWxlbWVudCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhlIGNvbnRhaW5lZCBlbGVtZW50cyBkb2VzIG5vdCBjb250YWluIHRoZSBjb250YWluZXIsCi0JCQkvLyB0aGlzIGlzIHBvc3NpYmxlIGR1ZSB0byByZWFsaXphdGlvbiwgc2F5LCB0aGUgY29udGFpbmluZyBlbGVtZW50Ci0JCQkvLyBjb250cmlidXRlIHRvIHRoZSBjb250YWluZXIKLQkJCWl0ZW1zLnJlbW92ZShlbGVtZW50KTsKLQotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQm9va21hcmsgYiA9IGNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJCVBSRUZJWF9Db250YWluZWRfV29ya19Qcm9kdWN0cywKLQkJCQkJCQlOT0RFX0NvbnRhaW5lZF9Xb3JrX1Byb2R1Y3RzLCBpdGVtcywgZmFsc2UpOwotCi0JCQkJCS8vIGZvciBlYWNoIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3QsIGNyZWF0ZSB0aGUgbmVzdGVkIHN1YgotCQkJCQkvLyB0cmVlCi0JCQkJCWJ1aWxkSXRlbXMoaXRlbXMsIGIsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkvLyBpbnB1dCB0byB0YXNrcwotCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MpKTsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzKSk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfSW5wdXRUb19UYXNrLAotCQkJCQkJTk9ERV9JbnB1dFRvX1Rhc2ssIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBvdXRwdXQgZnJvbSB0YXNrcwotCQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcyk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfT3V0cHV0T2ZfVGFzaywKLQkJCQkJCU5PREVfT3V0cHV0T2ZfVGFzaywgaXRlbXMsIHRydWUpOwotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpKTsKLQkJLy8gT2JqZWN0IGUgPSBjYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCkpOwotCQkvLyBpZiAoZSAhPSBudWxsKSB7Ci0JCS8vIGl0ZW1zLmFkZChlKTsKLQkJLy8gfQotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0d1aWRhbmNlcywKLQkJCQkJCU5PREVfR3VpZGFuY2VzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJYnVpbGRJdGVtcyhhbGxJdGVtcywgYm0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udGFpbmVkQXJ0aWZhY3RzU3ViVHJlZShBcnRpZmFjdCBlbGVtZW50LCBCb29rbWFyayBibSwKLQkJCWJvb2xlYW4gc2hvd0d1aWRhbmNlcykgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgaXRlbXM7Ci0JCVN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLCBUT0RPCi0JCS8vIGl0ZW1zID0gKChBcnRpZmFjdCllbGVtZW50KS5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvbnRhaW5lciwKLQkJLy8gdGhpcyBpcyBwb3NzaWJsZSBkdWUgdG8gcmVhbGl6YXRpb24sIHNheSwgdGhlIGNvbnRhaW5pbmcgZWxlbWVudAotCQkvLyBjb250cmlidXRlIHRvIHRoZSBjb250YWluZXIKLQkJaXRlbXMucmVtb3ZlKGVsZW1lbnQpOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCS8vIEJvb2ttYXJrIGIgPSBjcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwKLQkJCS8vIE5PREVfQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMsIGl0ZW1zLCBmYWxzZSk7Ci0KLQkJCS8vIGZvciBlYWNoIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3QsIGNyZWF0ZSB0aGUgbmVzdGVkIHN1YiB0cmVlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJQXJ0aWZhY3QgZSA9IChBcnRpZmFjdCkgaXQubmV4dCgpOwotCQkJCWJ1aWxkSXRlbShlLCBibSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXNob3dHdWlkYW5jZXMpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYWxsIGd1aWRhbmNlcwotCQlpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKSk7Ci0JCS8vIE9iamVjdCBlID0gY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpKTsKLQkJLy8gaWYgKGUgIT0gbnVsbCkgewotCQkvLyBpdGVtcy5hZGQoZSk7Ci0JCS8vIH0KLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkpKTsKLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJLy8gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIE5PREVfR3VpZGFuY2VzLCBpdGVtcywgdHJ1ZSk7Ci0JCQlidWlsZEl0ZW1zKGl0ZW1zLCBibSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIHhtbCBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRPYmoKLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gaXRlcmF0ZS4gSXQgY2FuIGJlIGEgYnJlYWtkb3duIGVsZW1lbnQsIG9yIGl0J3MKLQkgKiAgICAgICAgICAgIGFkYXB0b3IKLQkgKiBAcGFyYW0gcGFyZW50WG1sCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGVBY3Rpdml0eShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwKLQkJCUJvb2ttYXJrIHBhcmVudEJtLCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJU3VwcHJlc3Npb24gc3VwKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQotCQlpZiAocGFyZW50T2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkvLyBTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUocGFyZW50T2JqLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgcHJvdmlkZXIpOwotCQkJLy8gcGFyZW50WG1sLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBkaXNwbGF5TmFtZSk7Ci0KLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRPYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChzdXAuaXNTdXBwcmVzc2VkKHJhd2l0ZW0pKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQotCQkJCWlmICghb3B0aW9ucy5zaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlCi0JCQkJCQkmJiAoaXRlbSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0oCi0JCQkJCQlyYXdpdGVtLCBpdGVtLCBwYXJlbnRJdGVtKTsKLQotCQkJCUJvb2ttYXJrIGNoaWxkID0gYnVpbGRJdGVtKGVsZW1lbnRJdGVtLmVsZW1lbnQsIHBhcmVudEJtLCBmYWxzZSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJLy8gc2V0IHRoZSBxdWVyeSBzdHJpbmcKLQkJCQkJY2hpbGQuc2V0UXVlcnlTdHJpbmcoZWxlbWVudEl0ZW0uZ2V0UXVlcnlTdHJpbmcoKSk7Ci0KLQkJCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQkJCQlpZiAocmF3aXRlbSBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHJhd2l0ZW07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoaXRlbSwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCTsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGFkYXB0ZXIpOwotCQkJCQljaGlsZC5zZXRQcmVzZW50YXRpb25OYW1lKGRpc3BsYXlOYW1lKTsKLQotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpdGVyYXRlQWN0aXZpdHkoZWxlbWVudEl0ZW0sIGNoaWxkLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByb2Nlc3NTdWJUcmVlKE9iamVjdCBvYmosCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZWxlbWVudCwgQm9va21hcmsgYm0pIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVByb2Nlc3NFbGVtZW50SXRlbSBwcm9jSXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ob2JqLCBlbGVtZW50LAotCQkJCWVsZW1lbnQuZ2V0R3VpZCgpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gc3VwZXIuZ2V0TGF5b3V0TWdyKCkKLQkJCQkuZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJU3VwcHJlc3Npb24gc3VwID0gbmV3IFN1cHByZXNzaW9uKGVsZW1lbnQpOwotCQlpdGVyYXRlQWN0aXZpdHkocHJvY0l0ZW0sIGJtLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQotCQlTdHJpbmcgdXJsOwotCQlCb29rbWFyayBiOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYWxsIGd1aWRhbmNlcwotCQlpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKSkpOwotCi0JCS8vIG5lZWQgdG8gaW5jbHVkZSBzdXBwb3J0aW5nIG1hdGVyaWFscyBhcyB3ZWxsCi0JCS8vIGZpeCBidWc6IHN1cHBvcnRpbmcgbWF0ZXJpYWwgc2VydmVkIGFzIHVzZXIgZGVmaW5lZCBkaWFncmFtIHNob3VsZCBub3QgCi0JCS8vIHNob3cgdXAgaW4gdGhlIG5hdmlnYXRpb24gdHJlZSBvZiBhIHB1Ymxpc2hlZCBwcm9jZXNzLgkKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyB1c2VyRGlhZ3JhbUluZm8gPSAKLQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyhlbGVtZW50KTsKLQkJTGlzdCB2ID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSB2Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgcyA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpaXQubmV4dCgpOwotCQkJaWYgKCAhdXNlckRpYWdyYW1JbmZvLmlzRGlhZ3JhbSggKFN1cHBvcnRpbmdNYXRlcmlhbClzICkgKSB7Ci0JCQkJaXRlbXMuYWRkKHMpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCURlbGl2ZXJ5UHJvY2VzcyBkcCA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSkpOwotCQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpKSk7Ci0JCX0KLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9HdWlkYW5jZXMsIE5PREVfR3VpZGFuY2VzLAotCQkJCQlpdGVtcywgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQluYW1lQ29tcGFyYXRvciA9IG51bGw7Ci0JCWJvb2ttYXJrcy5jbGVhcigpOwotCQllbGVtZW50VXJscy5jbGVhcigpOwotCQlzdW1tYXJ5UGFnZXNHZW5lcmF0ZWQuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2V0IGVsZW1lbnRVcmxzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRQdWJsaXNoZWQoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LCBTdHJpbmcgaHRtbGZpbGUpIHsKLQkJLy8gb25seSBmb3IgcHJvY2VzcyBlbGVtZW50IGZvciBub3cKLQkJLy8gbWF5IGNvdmVyIGFsbCBtZXRob2QgZWxlbWVudHMgbGF0ZXIKLQkJaWYgKGxheW91dC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJRWxlbWVudFVybCB1cmwgPSBuZXcgRWxlbWVudFVybChsYXlvdXQuZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwKLQkJCQkJbGF5b3V0LmdldFVybCgpLCBsYXlvdXQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQllbGVtZW50VXJscy5hZGQodXJsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlRWxlbWVudFVybHMoKSB7Ci0JCS8vIHNhdmUgcHVibGlzaGVkIGVsZW1lbnQgdXJscwotCQkvLyBuZWVkIHRvIGVzY2FwZSB0aGUgdXJsIGFuZCB0ZXh0IHNpbmNlIGl0IHdpbGwgYmUgYXNzaWduZWQgdG8gYQotCQkvLyBqYXZhc2NyaXB0IHZhcmlhYmxlIGFzIGxpdGVyYWwKLQkJWG1sRWxlbWVudCB4bWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudFVybHMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudFVybHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudFVybCB1cmwgPSAoRWxlbWVudFVybCkgaXQubmV4dCgpOwotCQkJeG1sLm5ld0NoaWxkKCJlbGVtZW50VXJsIiwgdXJsLmd1aWQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgidGV4dCIsIFN0clV0aWwuZXNjYXBlKHVybC50ZXh0KSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBTdHJVdGlsLmVzY2FwZSh1cmwudXJsKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIGJ1ZmZlci5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh4bWwudG9YbWwoKSk7Ci0JCS8vIEZpbGUgZiA9IG5ldyBGaWxlKGdldExheW91dE1ncigpLmdldFB1Ymxpc2hEaXIoKSwgIkVsZW1lbnRVcmxzLnhtbCIpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIEZpbGVVdGlsLndyaXRlVVRGOEZpbGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCi0JCVN0cmluZyBodG1sID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbCh4bWwsICJ4c2wvZWxlbWVudFVybHMueHNsIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBmID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLAotCQkJCVBST0NFU1NfTEFZT1VUX0RBVEFfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmLmdldEFic29sdXRlUGF0aCgpLCBodG1sLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBkYXRhIHN0cnVjdHVyZSB0byBkZWZpbmUgdXJsIG9mIGFuIGVsZW1lbnQKLQkgKiAKLQkgKiBAYXV0aG9yIEppbmh1YSBYaQotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBFbGVtZW50VXJsIHsKLQotCQlTdHJpbmcgZ3VpZDsKLQkJU3RyaW5nIHVybDsKLQkJU3RyaW5nIHRleHQ7Ci0KLQkJLyoqCi0JCSAqIGNvbnN0cnVjdG9yCi0JCSAqIAotCQkgKiBAcGFyYW0gZ3VpZAotCQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgZ3VpZCBvZiB0aGUgZWxlbWVudAotCQkgKiBAcGFyYW0gdXJsCi0JCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSB1cmwgb2YgdGhlIGVsZW1lbnQKLQkJICogQHBhcmFtIHRleHQKLQkJICogICAgICAgICAgICBTdHJpbmcgdGhlIHRleHQgYWxvbmUgd2l0aCB0aGUgdXJsCi0JCSAqLwotCQlwdWJsaWMgRWxlbWVudFVybChTdHJpbmcgZ3VpZCwgU3RyaW5nIHVybCwgU3RyaW5nIHRleHQpIHsKLQkJCXRoaXMuZ3VpZCA9IGd1aWQ7Ci0JCQl0aGlzLnVybCA9IHVybDsKLQkJCXRoaXMudGV4dCA9IHRleHQ7Ci0JCX0KLQl9Ci0KLQljbGFzcyBFT2JqZWN0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCQlwdWJsaWMgRU9iamVjdENvbXBhcmF0b3IoKSB7Ci0KLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJaWYgKGUxIGluc3RhbmNlb2YgRU9iamVjdCAmJiBlMiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlPYmplY3QgdjEgPSBnZXRWYWx1ZShlMSk7Ci0JCQkJT2JqZWN0IHYyID0gZ2V0VmFsdWUoZTIpOwotCi0JCQkJaWYgKHYxID09IG51bGwgJiYgdjIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZTEudG9TdHJpbmcoKS5jb21wYXJlVG8oZTIudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmICh2MSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9IGVsc2UgaWYgKHYyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHYxLnRvU3RyaW5nKCkuY29tcGFyZVRvKHYyLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGUxLnRvU3RyaW5nKCkuY29tcGFyZVRvKGUyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGUpIHsKLQkJCU9iamVjdCB2ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdiA9ICgoRU9iamVjdCkgZSkuZUdldChwTmFtZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQotCQkJfQotCQkJOwotCi0JCQlpZiAodiA9PSBudWxsIHx8IHYudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdiA9ICgoRU9iamVjdCkgZSkuZUdldChuYW1lKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQotCQkJCX0KLQkJCQk7Ci0JCQl9Ci0KLQkJCXJldHVybiB2OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzcyODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIGRlZmluZXMgd2hpY2ggZWxlbWVudHMgd2lsbCB1c2UgdGhlIGRlZmF1bHQgaWNvbgotIwotZGlzY2lwbGluZT10cnVlCi1jYXBhYmlsaXR5UGF0dGVybj10cnVlCi1yb2xlPXRydWUKLXRhc2s9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjM2ZjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcyAKLXsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlzdGF0aWMKLQl7Ci0JCXRyeSAKLQkJewotCQkJU3RyaW5nIHJlc291cmNlID0gRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKTsKLQkJICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlKTsKLQkJCSAgICAJCSAgICAKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpCi0JewotCQl0cnkgCi0JCXsKLQkJCXJldHVybiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IG51bGw7Ci0JCX0gCi0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgYSBkZWZhdWx0IGljb24gaXMgaXNlZCBvciBub3QgZm9yIHRoZSBzcGVjaWZpZWQga2V5Ci0JICogCi0JICogQHBhcmFtIGtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlRGVmYXVsdEljb24oU3RyaW5nIGtleSkKLQl7Ci0JCVN0cmluZyBib29sZWFuUmVzdWx0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCWlmICggYm9vbGVhblJlc3VsdCA9PSBudWxsICkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gKGJvb2xlYW5SZXN1bHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ0cnVlIikgPiAtMSkgPyB0cnVlIDogZmFsc2U7IC8vJE5PTi1OTFMtMSQKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMmY4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwotIyBkZWZpbmVzIHdoaWNoIGVsZW1lbnRzIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGljb24KLSMKLWRpc2NpcGxpbmU9dHJ1ZQotY2FwYWJpbGl0eVBhdHRlcm49dHJ1ZQotcm9sZT10cnVlCi10YXNrPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2Q2OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHROb2RlSWNvblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JQ09OX05BTUUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2UgPSBEZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2UpOwotCQkJREVGQVVMVF9JQ09OX05BTUUgPSBnZXRTdHJpbmcoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KQotCQkJCQk6IG51bGw7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgaWNvbiBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGljb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJY29uTmFtZShTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyBpY29uTmFtZSA9IGdldFN0cmluZyhrZXkpOwotCQlpZiAoaWNvbk5hbWUgPT0gbnVsbCkgewotCQkJaWNvbk5hbWUgPSBERUZBVUxUX0lDT05fTkFNRTsKLQkJfQotCi0JCXJldHVybiBpY29uTmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmMWNlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwotIyBkZWZpbmVzIHRoZSBkZWZhdWx0IG5vZGUgaWNvbiBuYW1lcwotIwotYWN0aXZpdHk9YWN0aXZpdHkuZ2lmCi1hcnRpZmFjdD1hcnRpZmFjdC5naWYKLXJvbGU9d29ya2VyLmdpZgotdGFzaz1hY3Rpdml0eS5naWYKLWd1aWRlbGluZT1ndWlkZWxpbmUuZ2lmCi1jaGVja2xpc3Q9Y2hlY2tsaXN0LmdpZgotY29uY2VwdD1jb25jZXB0LmdpZgotZXhhbXBsZT1leGFtcGxlLmdpZgotcmVwb3J0PQotc3VwcG9ydGluZ21hdGVyaWFsPQotdGVjaG5pcXVlPQotdGVtcGxhdGU9Ci10ZXJtZGVmaW5pdGlvbj0KLXRvb2xtZW50b3I9Ci10cmFpbmluZ21vZHVsZT0KLXdoaXRlcGFwZXI9Ci13b3JrcHJvZHVjdGd1aWRlbGluZT0KLWdlbmVyYWw9Ci1wcm9jZXNzPQotY2FwYWJpbGl0eXBhdHRlcm49Ci1kZWxpdmVyeXByb2Nlc3M9Ci1mb2xkZXI9Zm9sZGVyLmdpZgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRTaXRlR2VuZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdFNpdGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyYTU3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdFNpdGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5QdWJsaXNoaW5nVXRpbDsKLQotCi0vKioKLSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNpdGUgZ2VuZXJhdG9yLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTaXRlR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RTaXRlR2VuZXJhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0FQUExFVF9ESVJFQ1RPUlkgPSAibm9hcHBsZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19TVUZGSVggPSAiLmJrbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19TVUZGSVhfWE1MID0gIi54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19TVUZGSVhfSFRNTCA9ICIuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX1JFUExBQ0VNRU5UID0gIl8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9TVFJJTkcgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQk9PS01BUktfQ0ZHX05BTUUgPQotCS8vICJEZWZhdWx0Qm9va21hcmsuY2ZnIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFRF9CT09LTUFSS1NfQ0ZHX05BTUUgPSAiUHVibGlzaGVkQm9va21hcmtzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFRF9CT09LTUFSS1NfREVMSU1JVEVSID0gIioiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19YU0xfRklMRSA9ICJ4c2wvYm9va21hcmsueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PS01BUktTX1hTTF9GSUxFID0gInhzbC9QdWJsaXNoZWRCb29rbWFya3MueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfWFNMX0ZJTEUgPSAieHNsL2luZGV4LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE5BVl9YU0xfRklMRSA9ICJ4c2wvdG9wbmF2LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfWFNMX0ZJTEUgPSAieHNsL3NlYXJjaC54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTEVUX1BBVEggPSAiYXBwbGV0IiArIEZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19BUFBMRVRfUEFUSCA9ICJub2FwcGxldCIgKyBGaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QQVRIID0gImltYWdlcyIgKyBGaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1NFQVJDSF9QQVRIID0gImRvY3Jvb3Qvc2VydmVyX3NlYXJjaCI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQkFOTkVSX0ZJTEUgPSAiRVBGQ19iYW5uZXIuanBnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEZpbGUgaWNvblBhdGg7Ci0KLQlwdWJsaWMgRGVmYXVsdFNpdGVHZW5lcmF0b3IoSHRtbEJ1aWxkZXIgYnVpbGRlciwgUHVibGlzaEhUTUxPcHRpb25zIG9wdGlvbnMpIHsKLQkJc3VwZXIoYnVpbGRlciwgb3B0aW9ucyk7Ci0KLQkJaWNvblBhdGggPSBuZXcgRmlsZShwdWJEaXIsIChvcHRpb25zLmlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSApID8gTk9fQVBQTEVUX1BBVEggICsgSUNPTl9QQVRIIAotCQkJCTogQVBQTEVUX1BBVEggKyBJQ09OX1BBVEgpOwotCX0KLQkKLQlwdWJsaWMgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKSB7Ci0JCXJldHVybiBidWlsZGVyOwotCX0KLQkKLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaE9wdGlvbnMoKSB7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUljb25QYXRoKCkgewotCQlyZXR1cm4gaWNvblBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEJhbm5lckltYWdlRmlsZSgpIHsKLQkJLy9yZXR1cm4gImJhbm5lci5naWYiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBERUZBVUxUX0JBTk5FUl9GSUxFOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmVQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvcHlGaWxlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3N0UHVibGlzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljb3B5SWNvbnNGb3JOb25BcHBsZXQoKTsKLQkJd3JpdGVJbmRleEFuZFRvcE5hdkh0bWwoKTsKLQkJd3JpdGVTZWFyY2hIdG1sKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvcHlGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWNvcHlEb2NSb290RmlsZXMoKTsKLQotCQkvLyBjb3B5IGxvY2FsaXplZCBmaWxlcwotCQljb3B5TG9jYWxpemVkRmlsZXMoKTsKLQotCQkvLyBjb3B5IHVzZXIgY3VzdG9taXplZCBmaWxlcyBsYXN0Ci0JCWNvcHlDdXN0b21pemVkRmlsZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RG9jUm9vdEZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHBsdWdpbl91cmwgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCk7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKHBsdWdpbl91cmwsIERPQ19ST09UKTsKLQkJU3RyaW5nIGZyb21QYXRoID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQotCQkvLyBmb2xkZXJzIHRoYXQgYXBwbHkgdG8gYWxsCi0JCS8vIE5PVEU6IGFwcGxldCBpbWFnZXMgc2hvdWxkIGFsd2F5cyBiZSBpbmNsdWRlZCBzaW5jZSBpdCdzIHVzZWQgaW4KLQkJLy8gQXRsYW50aWMgY29uZmlndXJhdGlvbgotCQkvLyBhcHBsZXQvaGVscC5odG0gaXMgdXNlZCBpbiBSU0EgdG8gY2hlY2sgY2hhcmFjdGVyIGVuY29kaW5nLCBzbwotCQkvLyBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlCi0JCS8vIFByb2Nlc3MgQWR2aXNvcjogRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGluIFJTQSBsb2cKLQkJLy8gd2hlbiBpbmRleGluZyBzdGFydCBvbiBhIG5vbi1hcHBsZXQgcHVibGlzaGVkIHNpdGUKLQkJU3RyaW5nIGluY2x1ZGVzID0gIiouKiwgcHJvY2Vzcy8qKiwgaW1hZ2VzLyoqLCBpbmRleC8qKiwgc2NyaXB0cy8qKiwgc3R5bGVzaGVldHMvKioiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGV4Y2x1ZGVzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uLCBjb3B5IHRoZSBvdGhlciBmb2xkZXJzCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaEphdmFTY3JpcHRUcmVlKCkpIHsKLQkJCWluY2x1ZGVzICs9ICIsIG5vYXBwbGV0LyoqIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gU3RyaW5nIHB1Ymxpc2hEaXIgPSB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmdldFB1Ymxpc2hEaXIoKTsKLQotCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihmcm9tUGF0aCwgcHViRGlyLCBpbmNsdWRlcywgZXhjbHVkZXMpOwkJCi0JCQotCQlTdHJpbmcgcGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUobmV3IFVSTChwbHVnaW5fdXJsLCBTRVJWRVJfU0VBUkNIX1BBVEgpKS5nZXRQYXRoKCk7Ci0JCWluY2x1ZGVzID0gIiouKiwgc2VhcmNoLyoqIjsgLy8kTk9OLU5MUy0xJAotCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihwYXRoLCBwdWJEaXIsIGluY2x1ZGVzLCBudWxsKTsJCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlDdXN0b21pemVkRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuY29weUN1c3RvbWl6ZWRGaWxlcygpOwotCi0JCWlmIChvcHRpb25zLmFib3V0SFRNTCAhPSBudWxsICYmIG9wdGlvbnMuYWJvdXRIVE1MLmxlbmd0aCgpID4gMCkgewotCQkJRmlsZVV0aWwuY29weUZpbGUob3B0aW9ucy5hYm91dEhUTUwsIHB1YkRpciArICJhYm91dC5odG0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIGNvcHlMb2NhbGl6ZWRGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1cGVyLmNvcHlMb2NhbGl6ZWRGaWxlcygpOwotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaEphdmFTY3JpcHRUcmVlKCkpIHsKLQkJCS8vIGNvcHkgdGhlIGFwcGxldCBodG1sIGZpbGVzLCByZW5hbWUgbG9jYWxlIHNwZWNpZmljIG5hbWVzCi0JCQlQdWJsaXNoaW5nUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmNvcHlMb2NhbGl6ZWRGaWxlcygKLQkJCQkJCQlET0NfUk9PVCArICJub2FwcGxldC8iLCBuZXcgRmlsZShwdWJEaXIsICJub2FwcGxldC8iKSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5SWNvbnNGb3JOb25BcHBsZXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCS8vIGRvbid0IGphciBpdC4gY29weSB0aGUgaWNvbnMgdG8gdGhlIGltYWdlcwotLy8JCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSwgQVBQTEVUX1BBVEggKyBJQ09OX1pJUF9GSUxFKTsKLS8vCQkJUHVibGlzaGluZ1V0aWwuamFyRmlsZXMoaWNvblBhdGgsIGphckZpbGUpOwotCi0JCQlpZiAoIG9wdGlvbnMuaXNQdWJsaXNoSmF2YVNjcmlwdFRyZWUoKSApCi0JCQl7Ci0JCQkJLy8gYWxzbyBjb3B5IHRoZSBpY29ucyB0byB0aGUgbm8tYXBwbGV0IGZvbGRlcgotCQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGljb25QYXRoLmdldEFic29sdXRlUGF0aCgpLCBwdWJEaXIgKyBOT19BUFBMRVRfUEFUSCArIElDT05fUEFUSCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkJewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB3cml0ZUJvb2ttYXJrKEJvb2ttYXJrIGIpIHsKLQotCQkvLyBnZXQgdGhlIGJvb2ttYXJrIG5hbWUgZnJvbSB0aGUgYm9va21hcmsgdXJsCi0JCVN0cmluZyBib29rbWFya0ZpbGVOYW1lID0gc3VwZXIuZ2V0Vmlld0RhdGFGaWxlTmFtZShiLCBCT09LTUFSS19TVUZGSVhfWE1MKTsKLQkJWG1sRWxlbWVudCB4bWwgPSBiLmdldFhtbEVsZW1lbnQoKTsKLQotCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbCh4bWwsIEJPT0tNQVJLX1hTTF9GSUxFKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaHRtbFBhdGggPSBnZXRCb29rbWFya0h0bWxQYXRoKGJvb2ttYXJrRmlsZU5hbWUpOwotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShodG1sUGF0aCwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGJvb2ttYXJrRmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdyaXRlUHVibGlzaGVkQm9va21hcmtzKExpc3QgYm9va21hcmtzLCBCb29rbWFyayBkZWZhdWx0VmlldykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBmaXJzdCB3cml0ZSB4bWwgZm9yIGVhY2ggaW5kaXZpZHVhbCB2aWV3IAotCQlCb29rbWFya0xpc3QgbGlzdCA9IG5ldyBCb29rbWFya0xpc3QoKTsKLQotCQlpZiAoKGRlZmF1bHRWaWV3ID09IG51bGwpICYmIChib29rbWFya3Muc2l6ZSgpID4gMCkpIHsKLQkJCWRlZmF1bHRWaWV3ID0gKEJvb2ttYXJrKSBib29rbWFya3MuZ2V0KDApOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGJvb2ttYXJrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlCb29rbWFyayBiID0gKEJvb2ttYXJrKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSB3cml0ZUJvb2ttYXJrKGIpOwotCQkJbGlzdC5hZGRCb29rbWFyayhiLmdldFByZXNlbnRhdGlvbk5hbWUoKSwgZmlsZU5hbWUsCi0JCQkJCShkZWZhdWx0VmlldyA9PSBiKSk7Ci0JCX0KLQkJCi0JCS8vIHRoZW4gd3JpdGUgdGhlIHRvcCBsZXZlbCBib29rbWFyayB4bWwKLQkJWG1sRWxlbWVudCB4bWwgPSBsaXN0LmdldFhtbEVsZW1lbnQoKTsKLQotCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbCh4bWwsIEJPT0tNQVJLU19YU0xfRklMRSk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGh0bWxQYXRoID0gZ2V0Qm9va21hcmtIdG1sUGF0aChQVUJMSVNIRURfQk9PS01BUktTX0NGR19OQU1FKTsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoaHRtbFBhdGgsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUluZGV4QW5kVG9wTmF2SHRtbCgpIHsKLQkJCQkKLQkJWG1sRWxlbWVudCBvcHRpb25YbWwgPSBnZXRPcHRpb25YbWwoKTsJCQotCQkJCQotCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbChvcHRpb25YbWwsIElOREVYX1hTTF9GSUxFKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaHRtbFBhdGggPSBnZXRJbmRleEZpbGVQYXRoKCk7Ci0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGh0bWxQYXRoLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKG9wdGlvblhtbCwgVE9QTkFWX1hTTF9GSUxFKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaHRtbFBhdGggPSBwdWJEaXIgKyAidG9wbmF2Lmh0bSI7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoaHRtbFBhdGgsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVNlYXJjaEh0bWwoKSB7Ci0KLQkJYm9vbGVhbiBzZXJ2ZXJTaWRlU2VhcmNoID0gKG9wdGlvbnMgPT0gbnVsbCkgfHwgb3B0aW9ucy5pc0luY2x1ZGVTZXJ2bGV0U2VhcmNoKCk7Ci0JCQotCQlTdHJpbmcgd2ViQXBwTmFtZSA9IG9wdGlvbnMuZ2V0RHluYW1pY1dlYkFwcE5hbWUoKTsKLQkJCi0JCWlmICh3ZWJBcHBOYW1lICE9IG51bGwgJiYgd2ViQXBwTmFtZS5sZW5ndGgoKSA+IDAgJiYgc2VydmVyU2lkZVNlYXJjaCkgewotCQkKLQkJCVhtbEVsZW1lbnQgc2VhcmNoWG1sID0gbmV3IFhtbEVsZW1lbnQoIlNlYXJjaCIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkid2ViQXBwTmFtZSIsIHdlYkFwcE5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCi0JCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbChzZWFyY2hYbWwsIFNFQVJDSF9YU0xfRklMRSk7Ci0JCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgaHRtbFBhdGggPSBnZXRTZWFyY2hGaWxlUGF0aCgpOwotCQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoaHRtbFBhdGggKyAic2VhcmNoLmh0bWwiLCBidWZmZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvb2ttYXJrSHRtbFBhdGgoU3RyaW5nIGJvb21rYXJrRmlsZSkgewotCQlpbnQgaW5keCA9IGJvb21rYXJrRmlsZS5sYXN0SW5kZXhPZihCT09LTUFSS19TVUZGSVhfWE1MKTsKLQkJcmV0dXJuIHB1YkRpcgotCQkJCSsgTk9fQVBQTEVUX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yQ2hhcgotCQkJCSsgYm9vbWthcmtGaWxlLnN1YnN0cmluZygwLCBpbmR4KSArIEJPT0tNQVJLX1NVRkZJWF9IVE1MOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEluZGV4RmlsZVBhdGgoKSB7Ci0JCXJldHVybiBwdWJEaXIgKyAiaW5kZXguaHRtIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTZWFyY2hGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIHB1YkRpciArIEZpbGUuc2VwYXJhdG9yQ2hhciArICJzZWFyY2giICsgRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnQgZ2V0T3B0aW9uWG1sKCkgewotCQlib29sZWFuIHNob3dHbG9zc2FyeSA9IChvcHRpb25zID09IG51bGwpIHx8IG9wdGlvbnMuaXNQdWJsaXNoR2xvc3NhcnkoKTsKLQkJYm9vbGVhbiBzaG93SW5kZXggPSAob3B0aW9ucyA9PSBudWxsKSB8fCBvcHRpb25zLmlzUHVibGlzaEluZGV4KCk7Ci0KLQkJWG1sRWxlbWVudCBvcHRpb25YbWwgPSBuZXcgWG1sRWxlbWVudCgiUHVibGlzaGluZ09wdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggb3B0aW9ucyAhPSBudWxsICkgewkJCi0JCQlvcHRpb25YbWwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIG9wdGlvbnMuZ2V0VGl0bGUoKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkuc2V0QXR0cmlidXRlKCJiYW5uZXJJbWFnZSIsIG9wdGlvbnMuYmFubmVySW1hZ2UpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLnNldEF0dHJpYnV0ZSgiYmFubmVySW1hZ2VIZWlnaHQiLCBJbnRlZ2VyLnRvU3RyaW5nKG9wdGlvbnMuZ2V0QmFubmVySW1hZ2VIZWlnaHQoKSkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJImZlZWRiYWNrVXJsIiwgb3B0aW9ucy5mZWVkYmFja1VSTCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkuc2V0QXR0cmlidXRlKCJzaG93R2xvc3NhcnkiLCAoc2hvd0dsb3NzYXJ5ID8gInRydWUiIDogImZhbHNlIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkuc2V0QXR0cmlidXRlKCJzaG93SW5kZXgiLCAoc2hvd0luZGV4ID8gInRydWUiIDogImZhbHNlIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkuc2V0QXR0cmlidXRlKCJzZXJ2ZXJTaWRlU2VhcmNoIiwgb3B0aW9ucy5pc0luY2x1ZGVTZXJ2bGV0U2VhcmNoKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQl9Ci0JCQotCQlyZXR1cm4gb3B0aW9uWG1sOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5QnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIxZTk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9HbG9zc2FyeUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotCi0vKioKLSAqIEJ1aWxkIHRoZSBnbG9zc2FyeSBmaWxlIGZvciB0aGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9zc2FyeUJ1aWxkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPU1NBUllfQkFDS1BBVEggPSAiLi8uLi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MgPSBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3M7Ci0KLQkvLyBnZW5lcmF0ZWQgZ2xvc3NhcnkgaHRtbCBmaWxlIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9IVE1MX0ZJTEUgPSAicHJvY2Vzcy9nbG9zc2FyeS5odG0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPU1NBUllfSU5ERVhfSFRNTF9GSUxFID0gInByb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9OQVZJR19IVE1MX0ZJTEUgPSAicHJvY2Vzcy9nbG9zc2FyeS9uYXZpZy5odG0iOyAvLyROT04tTkxTLTEkCi0KLQkvLyB4c2wgdGVtcGxhdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPU1NBUllfWFNMX0ZJTEUgPSAieHNsL2dsb3NzYXJ5LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9JTkRFWF9YU0xfRklMRSA9ICJ4c2wvZ2xvc3NhcnlfaW5kZXgueHNsIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9OQVZJR19YU0xfRklMRSA9ICJ4c2wvZ2xvc3NhcnlfbmF2aWcueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbGlzdCB0byBob2xkIGFsbCBnbG9zc2FyeSBpdGVtcy4KLQlwcml2YXRlIEdsb3NzYXJ5TGlzdCBnbG9zc2FyeUl0ZW1zOwotCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEdsb3NzYXJ5QnVpbGRlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHRoZSBnbG9zc2FyeSBhbmQgZ2VuZXJhdGUgdGhlIHJlbGF0ZWQgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKiBAcGFyYW0gdGl0bGUgU3RyaW5nIHRoZSB0aXRsZSBvZiB0aGUgZ2xvc3NhcnkgcGFnZQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgcHViRGlyLAotCQkJU3RyaW5nIHRpdGxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlnbG9zc2FyeUl0ZW1zID0gbmV3IEdsb3NzYXJ5TGlzdChwdWJEaXIpOwotCQkKLQkJZ2xvc3NhcnlJdGVtcy5jbGVhcigpOwotCQlJRmlsdGVyIGNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWd1cmF0aW9uRmlsdGVyKGNvbmZpZyk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoY29uZmlnRmlsdGVyKTsKLQkJLy8gaXRlcmF0ZSB0aHJ1IGNvbmZpZ3VyYXRpb24gdG8gZ2V0IGFsbCBnbG9zc2FyeSBpdGVtcwotCQlpdGVyYXRlKGNvbmZpZywgbW9uaXRvcik7Ci0KLQkJLy8gY3JlYXRlIHRoZSBnbG9zc2FyeSBmaWxlCi0JCWNyZWF0ZUdsb3NzYXJ5KHB1YkRpciwgdGl0bGUpOwotCi0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJ1IHRoZSBjb25maWd1cmF0aW9uIHRyZWUgYW5kIGZpbmQgYWxsIHRlcm0gZGVmaW5pdGlvbiBlbGVtZW50cwotCSAqIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3Qgb2JqLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBHZXQgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgZmFjdG9yeS4KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHRyZWVJdGVtQ29udGVudFByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJDbGFzcyk7Ci0KLQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQlpZiAodHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gY3JlYXRlIGJvb2ttYXJrCi0JCQkJT2JqZWN0IGl0b3JPYmogPSBMaWJyYXJ5VXRpbC51bndyYXAoaXQubmV4dCgpKTsKLQkJCQlpZiAoaXRvck9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaXRlcmF0ZShpdG9yT2JqLCBtb25pdG9yKTsKLQkJCQl9IGVsc2UgaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQlpdGVyYXRlKGl0b3JPYmosIG1vbml0b3IpOwotCQkJCX0gZWxzZSBpZiAoaXRvck9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSB7Ci0JCQkJCS8vIGNyZWF0ZSBhIGdsb3NzYXJ5IGVudHJ5IGZvciB0aGUgVGVybURlZmluaXRpb24KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGl0b3JPYmopOwotCQkJCQlnbG9zc2FyeUl0ZW1zLmFkZCgoVGVybURlZmluaXRpb24pIGl0b3JPYmopOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdsb3NzYXJ5KFN0cmluZyBwdWJEaXIsIFN0cmluZyB0aXRsZSkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlHTE9TU0FSWV9YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBnbG9zc2FyeSB4c2wgdGVtcGxhdGUgIiArIEdMT1NTQVJZX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIHhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJU3RyaW5nQnVmZmVyIHhtbCA9IGdsb3NzYXJ5SXRlbXMuZ2V0WG1sKCk7Ci0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgR0xPU1NBUllfSFRNTF9GSUxFKTsKLQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCX0KLQotCQkJLy8gZ2VlbnJhdGUgdGhlIGh0bWwKLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gUHJvcGVydGllcyB4c2xQYXJhbXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJeHNsUGFyYW1zLnNldFByb3BlcnR5KCJ0aXRsZSIsIHRpdGxlKTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQkJCS8vIFN0cmluZyBjb250ZW50ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQotCQkJLy8gbmVlZCB0byBkZWNvZGUgdGhlIHVybHMKLQkJCVN0cmluZyBjb250ZW50ID0gUmVzb3VyY2VIZWxwZXIuZGVjb2RlVXJsc0luQ29udGVudChzdy5nZXRCdWZmZXIoKQotCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIGZpeENvbnRlbnQoY29udGVudCkpOwotCi0JCQkvLyAvLyBmaXggdGhlIGVsZW1lbnQgbGlua3MKLQkJCS8vIEZpbGVXcml0ZXIgb3V0cHV0ID0gbmV3IEZpbGVXcml0ZXIoZik7Ci0JCQkvLyBvdXRwdXQud3JpdGUoZml4Q29udGVudChjb250ZW50KSk7Ci0JCQkvLyBvdXRwdXQuZmx1c2goKTsKLQkJCS8vIG91dHB1dC5jbG9zZSgpOwotCQkJc3cuY2xvc2UoKTsKLQotCQkJLy8gYWxzbyBzYXZlIHRoZSBnbG9zc2FyeSBuYXZpZ2F0aW9uIGhlYWRlciBodG1sIGZpbGUKLQkJCXVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlHTE9TU0FSWV9JTkRFWF9YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBnbG9zc2FyeSB4c2wgdGVtcGxhdGUgIiArIEdMT1NTQVJZX0lOREVYX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJeHNsX3VyaSA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0JCQlmID0gbmV3IEZpbGUocHViRGlyLCBHTE9TU0FSWV9JTkRFWF9IVE1MX0ZJTEUpOwotCQkJc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgY3JlYXRlZC4KLQkJCWlmICggIWYuZXhpc3RzKCkgKSB7Ci0JCQkJRmlsZSBwZiA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCWlmICghcGYuZXhpc3RzKCkpIHsKLQkJCQkJcGYubWtkaXJzKCk7Ci0JCQkJfQotCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJfQotCQkJCi0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIHN3LnRvU3RyaW5nKCkpOwotCi0JCQlzdy5jbG9zZSgpOwotCi0JCQkvLyBhbHNvIHNhdmUgdGhlIGdsb3NzYXJ5IG5hdmlnYXRpb24gaGVhZGVyIGh0bWwgZmlsZQotCQkJdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCUdMT1NTQVJZX05BVklHX1hTTF9GSUxFKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJVbmFibGUgdG8gZ2V0IGdsb3NzYXJ5IHhzbCB0ZW1wbGF0ZSAiICsgR0xPU1NBUllfTkFWSUdfWFNMX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQl4c2xfdXJpID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQkJCWYgPSBuZXcgRmlsZShwdWJEaXIsIEdMT1NTQVJZX05BVklHX0hUTUxfRklMRSk7Ci0JCQlzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKHhzbF91cmksIHhtbC50b1N0cmluZygpLCB4c2xQYXJhbXMsIHN3KTsKLQkJCXN3LmZsdXNoKCk7Ci0KLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSwgc3cudG9TdHJpbmcoKSk7Ci0KLQkJCXN3LmNsb3NlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZpeENvbnRlbnQoU3RyaW5nIHNvdXJjZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19yZWYubWF0Y2hlcihzb3VyY2UpOwotCi0JCXdoaWxlIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJU3RyaW5nIGxpbmtlZFRleHQgPSBtLmdyb3VwKDIpOwotCi0JCQl1cmx0ZXh0ID0gZml4VXJsVGV4dCh1cmx0ZXh0KTsKLQotCQkJLy8gdXBkYXRlIHRoZSB1cmwgdGV4dAotCQkJU3RyaW5nIHRleHQgPSAiPGEgIiArIHVybHRleHQgKyAiPiIgKyBsaW5rZWRUZXh0ICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBSZXNvdXJjZUhlbHBlci5yZWdFeHBFc2NhcGUodGV4dCkpOwotCQl9Ci0KLQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4VXJsVGV4dChTdHJpbmcgdXJsdGV4dCkgewotCQlTdHJpbmcgZ3VpZCA9IFJlc291cmNlSGVscGVyLmdldEd1aWRGcm9tVXJsKHVybHRleHQpOwotCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsdGV4dDsKLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpCi0JCQkJOiBudWxsOwotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsdGV4dDsKLQkJfQotCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgVGVybURlZmluaXRpb24sIHVzZSB0aGUgYm9va21hcmsgaW4gdGhlIGZpbGUKLQkJLy8gb3RoZXJ3aXNlLCBmaW5kIHRoZSBwYXRoIHRvIHRoZSBlbGVtZW50Ci0JCVN0cmluZyBocmVmID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGUgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgewotCQkJaHJlZiA9ICIjIiArIGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQkvLyBvbmUgbGV2ZWwgYmFjawotCQkJaHJlZiA9ICIuLi8iICsgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykgKyBSZXNvdXJjZUhlbHBlci5nZXRGaWxlTmFtZShlLCAiLmh0bWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfaHJlZl9waWNrZXIKLQkJCQkubWF0Y2hlcigiICIgKyB1cmx0ZXh0ICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChtLmZpbmQoKSkgewotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgIiBocmVmPVwiIiArIGhyZWYgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gdXJsdGV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTA3NTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db250ZW50UmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci0KLQotLyoqCi0gKiBIb2xkcyBhbGwgZ2xvc3NhcnkgaXRlbXMgYW5kIHNvcnQgdGhlbSBpbiBkZXNpcmVkIG9yZGVyIGdyb3VwZWQgYnkgZmlyc3QKLSAqIGxldHRlciBvZiB0aGUgZ2xvc3NhcnkgbmFtZSBUT0RPOiBBZGQgYSBicmllZiBkZXNjcmlwdGlvbiBmb3IgdGhpcyBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdsb3NzYXJ5TGlzdCB7Ci0KLQkvLyB1c2luZyB0aGUgZGVmYXVsdCBvcmRlciBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGV4cGxvcmVyLgotCS8vIG1heWJlIGEgc3BlY2lhbCBzb3J0ZWQgbGlzdCBsYXRlciwKLQkvLyBUcmVlTWFwIG9mIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIGdsb3NzYXJ5IG1hcCB0byBhIChTb3J0ZWQpIExpc3Qgb2YKLQkvLyBnbG9zc2FyeSBJdGVtcwotCXByaXZhdGUgVHJlZU1hcCBpdGVtTWFwID0gbmV3IFRyZWVNYXAoKTsKLQotCXByaXZhdGUgU3RyaW5nIHB1YkRpcjsKLQkKLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgR2xvc3NhcnlMaXN0KFN0cmluZyBwdWJEaXIpIHsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGlzdAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWl0ZW1NYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBUZXJtRGVmaW5pdGlvbiBpbnRvIHRoZSBnbG9zc2FyeSBsaXN0Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgVGVybURlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVGVybURlZmluaXRpb24gZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJU3RyaW5nIGdyb3VwID0gIiIgKyBuYW1lLmNoYXJBdCgwKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRJdGVtTGlzdChncm91cCkuYWRkKGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRJdGVtTGlzdChTdHJpbmcgZ3JvdXApIHsKLQkJZ3JvdXAgPSBncm91cC50b1VwcGVyQ2FzZSgpOwotCQlMaXN0IGwgPSAoTGlzdCkgaXRlbU1hcC5nZXQoZ3JvdXApOwotCQlpZiAobCA9PSBudWxsKSB7Ci0JCQlsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXRlbU1hcC5wdXQoZ3JvdXAsIGwpOwotCQl9Ci0KLQkJcmV0dXJuIGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZG9jdW1lbnQgZm9yIHRoZSBsaXN0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFhtbCgpIHsKLQkJWG1sRWxlbWVudCB4ZSA9IG5ldyBYbWxFbGVtZW50KCJHbG9zc2FyeSIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gc2V0IHRoZSBsYW5ndWFnZSBhdHRyaWJ1dGUKLQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCVN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0JCXhlLnNldEF0dHJpYnV0ZSgibGFuZyIsIGxhbmcpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1NYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3JvdXAgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUxpc3QgaXRlbXMgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQotCQkJLy8gY3JlYXRlIGEgYm9va21hcmsgZm9yIHRoZSBncm91cAotCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBncm91cCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwcmVzZW50YXRpb25OYW1lIiwgZ3JvdXApIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmF2aWdhdGlvbi1tYXJrIiwgInRydWUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiY29udGVudCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIHRoZW4gY3JlYXRlIGVudHJ5IGZvciBlYWNoIGl0ZW0KLQkJCWZvciAoSXRlcmF0b3IgaXRJdGVtID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRJdGVtLmhhc05leHQoKTspIHsKLQkJCQlUZXJtRGVmaW5pdGlvbiBlbGVtZW50ID0gKFRlcm1EZWZpbml0aW9uKSBpdEl0ZW0ubmV4dCgpOwotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJU3RyaW5nIGNvbnRlbnQgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JCQkJLy8gc2NhbiB0aGUgY29udGVudCBhbmQgY29weSBpbWFnZXMgaWYgYW55Ci0JCQkJc2NhbkNvbnRlbnRGb3JSZXNvdXJjZXMoZWxlbWVudCwgY29udGVudCwgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkpOwotCi0JCQkJLy8gZml4IHRoZSBsaW5rcyBpbiB0aGUgY29udGVudAotCQkJCWNvbnRlbnQgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChjb250ZW50LAotCQkJCQkJUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCksCi0JCQkJCQlHbG9zc2FyeUJ1aWxkZXIuR0xPU1NBUllfQkFDS1BBVEgpOwotCQkJCQotCQkJCXhlLm5ld0NoaWxkKCJpdGVtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInByZXNlbnRhdGlvbk5hbWUiLCBwcmVzZW50YXRpb25OYW1lKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJjb250ZW50IiwgY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiB4ZS50b1htbCgpOwotCX0KLQotCS8qKgotCSAqIFNjYW5zIHRoZSBjb250ZW50IGZvciByZXNvdXJjZSByZWZlcmVuY2VzLgotCSAqLwotCXByaXZhdGUgdm9pZCBzY2FuQ29udGVudEZvclJlc291cmNlcyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgY29udGVudCwKLQkJCVN0cmluZyBjb250ZW50UGF0aCkgewotCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBnZXRTY2FubmVyKG93bmVyKTsKLQkJaWYgKCBzY2FubmVyICE9IG51bGwgKSB7Ci0JCQlzY2FubmVyLnJlc29sdmVSZXNvdXJjZXMob3duZXIsIGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlc291cmNlIHNjYW5uZXIgZm9yIHRoZSBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBnZXRTY2FubmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotCQlpZiAoIHJlc01nciA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyByb290Q29udGVudFBhdGggPSByZXNNZ3IuZ2V0TG9naWNhbFBsdWdpblBhdGgob3duZXIpOwotCQlGaWxlIHNyY19yb290ID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChvd25lcikpOwotCQlGaWxlIHRndF9yb290ID0gbmV3IEZpbGUodGhpcy5wdWJEaXIsIHJvb3RDb250ZW50UGF0aCk7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKHNyY19yb290LCB0Z3Rfcm9vdCwgcm9vdENvbnRlbnRQYXRoLCBudWxsKTsKLQotCQlyZXR1cm4gc2Nhbm5lcjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvSVNpdGVHZW5lcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JU2l0ZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZkZTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JU2l0ZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci0KLS8qKgotICogZGVmaW5lIHRoZSBpbnRlcmZhY2UgZm9yIHNpdGUgZ2VuZXJhdG9yLiAKLSAqIEVhY2ggcHVibGlzaGVyIHNob3VsZCBpbXBsZW1lbnQgYSBzaXRlIGdlbmVyYXRvciB0byBoYW5kbGUgdGhlIHNpdGUgZ2VuZXJhdGlvbiBwcm9wZXJseS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVHZW5lcmF0b3IgewotCQkJCi0JcHVibGljIHZvaWQgcHJlUHVibGlzaCgpIHRocm93cyBFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgcG9zdFB1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgd3JpdGVQdWJsaXNoZWRCb29rbWFya3MoTGlzdCBib29rbWFya3MsIEJvb2ttYXJrIGRlZmF1bHRWaWV3KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIEh0bWxCdWlsZGVyIGdldEh0bWxCdWlsZGVyKCk7Ci0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hPcHRpb25zKCk7Ci0JcHVibGljIFN0cmluZyBnZXRJbmRleEZpbGVQYXRoKCk7Ci0JcHVibGljIFN0cmluZyBnZXROb2RlSWNvblBhdGgoKTsgCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4QnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmY5YjBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JbmRleEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLQotCi0vKioKLSAqIEJ1aWxkIHRoZSBnbG9zc2FyeSBmaWxlIGZvciB0aGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleEJ1aWxkZXIgewotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzID0gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzOwotCi0JLy8gZ2VuZXJhdGVkIGdsb3NzYXJ5IGh0bWwgZmlsZSByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfSFRNTF9GSUxFID0gImluZGV4L2NvbnRlbnRzLmh0bSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9OQVZJR19IVE1MX0ZJTEUgPSAiaW5kZXgvbmF2aWcuaHRtIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8geHNsIHRlbXBsYXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX1hTTF9GSUxFID0gInhzbC9pbmRleF9jb250ZW50cy54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfTkFWSUdfWFNMX0ZJTEUgPSAieHNsL2luZGV4X25hdmlnLnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxpc3QgdG8gaG9sZCBhbGwgZ2xvc3NhcnkgaXRlbXMuCi0JcHJpdmF0ZSBJbmRleExpc3QgaW5kZXhJdGVtcyA9IG5ldyBJbmRleExpc3QoKTsKLQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBJbmRleEJ1aWxkZXIoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBidWlsZCB0aGUgaW5kZXggZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqIEBwYXJhbSB0aXRsZSBTdHJpbmcgdGhlIHRpdGxlIGZvciB0aGUgZ2xvc3NhcnkgaW5kZXggcGFnZQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgcHViRGlyLAotCQkJU3RyaW5nIHRpdGxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaW5kZXhJdGVtcy5jbGVhcigpOwotCQlJRmlsdGVyIGNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWd1cmF0aW9uRmlsdGVyKGNvbmZpZyk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoY29uZmlnRmlsdGVyKTsKLQkJLy8gaXRlcmF0ZSB0aHJ1IGNvbmZpZ3VyYXRpb24gdG8gZ2V0IGFsbCBnbG9zc2FyeSBpdGVtcwotCQlpdGVyYXRlKGNvbmZpZyk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBnbG9zc2FyeSBmaWxlCi0JCWNyZWF0ZUluZGV4KHB1YkRpciwgdGl0bGUpOwotCi0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJ1IHRoZSBjb25maWd1cmF0aW9uIHRyZWUgYW5kIGZpbmQgYWxsIHRlcm0gZGVmaW5pdGlvbiBlbGVtZW50cwotCSAqIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3Qgb2JqKSB7Ci0JCS8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzKTsKLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gY3JlYXRlIGJvb2ttYXJrCi0JCQkJT2JqZWN0IGl0b3JPYmogPSBMaWJyYXJ5VXRpbC51bndyYXAoaXQubmV4dCgpKTsKLQkJCQlpZiAoaXRvck9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaXRlcmF0ZShpdG9yT2JqKTsKLQkJCQl9IGVsc2UgaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQlpdGVyYXRlKGl0b3JPYmopOwotCQkJCX0gZWxzZSBpZiAoaXRvck9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSB7Ci0JCQkJCS8vIGluZGV4IHRoZSB0ZXJtIGRlZmluaXRpb24gb2JqZWN0cwotCQkJCQlUZXJtRGVmaW5pdGlvbiB0ZXJtID0gKFRlcm1EZWZpbml0aW9uKSBpdG9yT2JqOwotCQkJCQlTdHJpbmcgbmFtZSA9IHRlcm0uZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgY29udGVudCA9ICJkZWZpbml0aW9uIGluIGdsb3NzYXJ5IjsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgdXJsID0gIi4uL2dsb3NzYXJ5L2dsb3NzYXJ5Lmh0bSMiICsgdGVybS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXhJdGVtcy5hZGQobmFtZSwgY29udGVudCwgdXJsKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmRleChTdHJpbmcgcHViRGlyLCBTdHJpbmcgdGl0bGUpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLQkJCQkJSU5ERVhfWFNMX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBnZXQgaW5kZXggeHNsIHRlbXBsYXRlICIgKyBJTkRFWF9YU0xfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyB4c2xfdXJpID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQkJCVN0cmluZ0J1ZmZlciB4bWwgPSBpbmRleEl0ZW1zLmdldFhtbCgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHhtbCk7Ci0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgSU5ERVhfSFRNTF9GSUxFKTsKLQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCX0KLQotCQkJLy8gZ2VlbnJhdGUgdGhlIGh0bWwKLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXhzbFBhcmFtcy5zZXRQcm9wZXJ0eSgidGl0bGUiLCB0aXRsZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKHhzbF91cmksIHhtbC50b1N0cmluZygpLCB4c2xQYXJhbXMsIHN3KTsKLQkJCXN3LmZsdXNoKCk7Ci0JCQlTdHJpbmcgY29udGVudCA9IHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0KLQkJCS8vIGZpeCB0aGUgZWxlbWVudCBsaW5rcwotCQkJRmlsZVdyaXRlciBvdXRwdXQgPSBuZXcgRmlsZVdyaXRlcihmKTsKLQkJCW91dHB1dC53cml0ZShjb250ZW50KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0KLQkJCS8vIGFsc28gc2F2ZSB0aGUgZ2xvc3NhcnkgbmF2aWdhdGlvbiBoZWFkZXIgaHRtbCBmaWxlCi0JCQl1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLQkJCQkJSU5ERVhfTkFWSUdfWFNMX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBnZXQgZ2xvc3NhcnkgeHNsIHRlbXBsYXRlICIgKyBJTkRFWF9OQVZJR19YU0xfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJZiA9IG5ldyBGaWxlKHB1YkRpciwgSU5ERVhfTkFWSUdfSFRNTF9GSUxFKTsKLQkJCW91dHB1dCA9IG5ldyBGaWxlV3JpdGVyKGYpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgb3V0cHV0KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4TGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdiMThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JbmRleExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotCi0vKioKLSAqIEhvbGRzIGFsbCBnbG9zc2FyeSBpdGVtcyBhbmQgc29ydCB0aGVtIGluIGRlc2lyZWQgb3JkZXIgZ3JvdXBlZCBieSBmaXJzdAotICogbGV0dGVyIG9mIHRoZSBnbG9zc2FyeSBuYW1lIFRPRE86IEFkZCBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhMaXN0IHsKLQotCS8vIHVzaW5nIHRoZSBkZWZhdWx0IG9yZGVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZXhwbG9yZXIuCi0JLy8gbWF5YmUgYSBzcGVjaWFsIHNvcnRlZCBsaXN0IGxhdGVyLAotCS8vIFRyZWVNYXAgb2YgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgZ2xvc3NhcnkgbWFwIHRvIGEgKFNvcnRlZCkgTGlzdCBvZgotCS8vIGdsb3NzYXJ5IEl0ZW1zCi0JcHJpdmF0ZSBUcmVlTWFwIGl0ZW1NYXAgPSBuZXcgVHJlZU1hcCgpOwotCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEluZGV4TGlzdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBpbmlzbGl6ZSB0aGUgbGlzdAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWl0ZW1NYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYW4gZW50cnkgdG8gdGhlIGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gdGVybSBTdHJpbmcKLQkgKiBAcGFyYW0gY29udGVudCBTdHJpbmcKLQkgKiBAcGFyYW0gdXJsIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgdGVybSwgU3RyaW5nIGNvbnRlbnQsIFN0cmluZyB1cmwpIHsKLQkJSW5kZXhJdGVtIGl0ZW0gPSBuZXcgSW5kZXhJdGVtKHRlcm0sIGNvbnRlbnQsIHVybCk7Ci0JCVN0cmluZyBncm91cCA9ICIiICsgaXRlbS50ZXJtTmFtZS5jaGFyQXQoMCk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0SXRlbUxpc3QoZ3JvdXApLmFkZChpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0SXRlbUxpc3QoU3RyaW5nIGdyb3VwKSB7Ci0JCWdyb3VwID0gZ3JvdXAudG9VcHBlckNhc2UoKTsKLQkJTGlzdCBsID0gKExpc3QpIGl0ZW1NYXAuZ2V0KGdyb3VwKTsKLQkJaWYgKGwgPT0gbnVsbCkgewotCQkJbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWl0ZW1NYXAucHV0KGdyb3VwLCBsKTsKLQkJfQotCi0JCXJldHVybiBsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgeG1sIGRvY3VtZW50IGZvciB0aGUgbGlzdAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nQnVmZmVyCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRYbWwoKSB7Ci0JCVhtbEVsZW1lbnQgeGUgPSBuZXcgWG1sRWxlbWVudCgiSW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGdyb3VwID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlMaXN0IGl0ZW1zID0gKExpc3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLQkJCS8vIGNyZWF0ZSBhIGJvb2ttYXJrIGZvciB0aGUgZ3JvdXAKLQkJCXhlLm5ld0NoaWxkKCJpdGVtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZ3JvdXApIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgicHJlc2VudGF0aW9uTmFtZSIsIGdyb3VwKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hdmlnYXRpb24tbWFyayIsICJ0cnVlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyB0aGVuIGNyZWF0ZSBlbnRyeSBmb3IgZWFjaCBpdGVtCi0JCQlmb3IgKEl0ZXJhdG9yIGl0SXRlbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0SXRlbS5oYXNOZXh0KCk7KSB7Ci0JCQkJSW5kZXhJdGVtIGl0ZW0gPSAoSW5kZXhJdGVtKSBpdEl0ZW0ubmV4dCgpOwotCQkJCXhlLm5ld0NoaWxkKCJpdGVtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGl0ZW0udGVybU5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInByZXNlbnRhdGlvbk5hbWUiLCBpdGVtLnRlcm1OYW1lKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJjb250ZW50IiwgaXRlbS5jb250ZW50KSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBpdGVtLnVybCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiB4ZS50b1htbCgpOwotCX0KLQotCWNsYXNzIEluZGV4SXRlbSB7Ci0JCXB1YmxpYyBTdHJpbmcgdGVybU5hbWU7Ci0KLQkJcHVibGljIFN0cmluZyBjb250ZW50OwotCi0JCXB1YmxpYyBTdHJpbmcgdXJsOwotCi0JCXB1YmxpYyBJbmRleEl0ZW0oU3RyaW5nIHRlcm1OYW1lLCBTdHJpbmcgY29udGVudCwgU3RyaW5nIHVybCkgewotCQkJdGhpcy50ZXJtTmFtZSA9IHRlcm1OYW1lOwotCQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKLQkJCXRoaXMudXJsID0gdXJsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWQ2Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1Byb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjb250ZW50IHZhbGlkYXRvciBmb3IgcHVibGlzaGluZyBhIHByb2Nlc3MgY2xvc3VyZS4gCi0gKiBUaGUgdmFsaWRhdG9yIHdpbGwgY2hlY2sgZWxlbWVudHMgYWdhaW5zdCB0aGUgcHJvY2VzcyBjbG9zdXJlIGFuZCBkZXRlcm1pbmUgaWYgCi0gKiBhbiBlbGVtZW50IHNob3VsZCBiZSBwdWJsaXNoZWQgb3Igbm90LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBleHRlbmRzIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NVUkVfTE9HX0ZJTEVOQU1FID0gInByb2Nlc3NDbG9zdXJlLmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBjbG9zdXJlIGVsZW1lbnRzIGZvciBwcm9jZXNzIHB1Ymxpc2hpbmcsIG51bGwgZm9yIGNvbmZpZyBwdWJsaXNoaW5nCi0JTGlzdCBjbG9zdXJlRWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpbmFsQ2xvc3VyZSA9IGZhbHNlOwotCQotLy8JLy8gbWFpbnRhaW4gdGhlIG9iamVjdCByZWZlcmVuY2VzIGdlbmVyYXRlZCBmcm9tIFRhc2tEZXNjcmlwdG9ycwotLy8JLy8gbWFwIG9mIG93bmVyIGVsZW1lbnQgdG8gYSBsaXN0IG9mIHJlZmVyZW5jZWQgZWxlbWVudHMKLS8vCU1hcCBvYmpSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBjbG9zdXJlTG9nID0gbnVsbDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBwdWJEaXIgU3RyaW5nCi0JICogQHBhcmFtIHZhbGlkYXRlRXh0ZXJuYWxMaW5rcyBib29sZWFuCi0JICovCi0JcHVibGljIFByb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcihTdHJpbmcgcHViRGlyLCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucykgewotCQlzdXBlcihwdWJEaXIsIG9wdGlvbnMpOwotCQkKLQkJY2xvc3VyZUxvZyA9IGdldFN0cmVhbShDTE9TVVJFX0xPR19GSUxFTkFNRSk7Ci0JCWJlZ2luQ2xvc3VyZUxvZygpOwotCi0JfQotCi0JLyoqCi0JICogYWRkIHRoZSBlbGVtZW50cyB0byB0aGUgcHJvY2VzcyBjbG9zdXJlLgotCSAqIEBwYXJhbSBpdGVtcyBMaXN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ2xvc3VyZUVsZW1lbnRzKExpc3QgaXRlbXMpIHsKLQkJLy8gZG8gbm90aGluZwotCQlpZiAoIGNsb3N1cmVFbGVtZW50cyA9PSBudWxsICkgewotCQkJY2xvc3VyZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCQotCQljbG9zdXJlRWxlbWVudHMuYWRkQWxsKGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiAJbWFrZSBlbGVtZW50IGNsb3N1cmUgCi0JICogIGFsbCB0aGUgcHVibGlzaGVkIGFuZCByZWZlcmVuY2VkIGVsZW1lbnRzIGFyZSB0aGUgZWxlbWVudCBjbG9zdXJlLiAKLQkgKiAgc2luY2UgdGhleSBhcmUgYWxsIHRoZSBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHRoZSBwcm9jZXNzZXMgYW5kIHRoZWlyIHJlbGF0ZWQgcHJvY2VzcyBlbGVtZW50cy4gCi0JICovCi0JcHVibGljIHZvaWQgbWFrZUVsZW1lbnRDbG9zdXJlKCkgewotCQl0aGlzLmlzRmluYWxDbG9zdXJlID0gdHJ1ZTsKLQkJCi0JCWVuZENsb3N1cmVMb2coKTsKLQkJCi0JCS8vIHRlc3QKLQkJaWYgKCBkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09IENsb3N1cmUgZWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNsb3N1cmVFbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudClpdC5uZXh0KCkpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PSBDbG9zdXJlIGVsZW1lbnRzIGVuZCA9PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgYSBjbG9zdXJlIGlzIGNyZWF0ZWQgb3Igbm90LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Nsb3N1cmUoKSB7Ci0JCXJldHVybiAoY2xvc3VyZUVsZW1lbnRzICE9IG51bGwpICYmIChjbG9zdXJlRWxlbWVudHMuc2l6ZSgpID4gMCk7Ci0JfQotCQotCS8qKgotCSAqIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgcHJvY2VzcyBlbGVtZW50IGNsb3N1cmUgb3Igbm90Ci0JICogVGhlIHByb2Nlc3MgZWxlbWVudCBjbG9zdXJlIGNvbnRhaW5zIGFsbCB0aGUgcHJvY2VzcyBlbGVtZW50cyBvZiB0aGUgc2VsZWN0ZWQgcHJvY2Vzc2VzLCAKLQkgKiBwbHVzIGFsbCB0aGUgY29udGVudCBlbGVtZW50cyB0aG9zZSBlbGVtZW50cyByZWZlcmVuY2VkLgotCSAqIAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbkNsb3N1cmUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQotCQlpZiAoIGUgPT0gbnVsbCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCAhaGFzQ2xvc3VyZSgpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvLyAxNjYwNDggLSBjaGVjay1pdGVtcywgdGFzay1zdGVwcyBkb24ndCBhcHBlYXIgd2hlbiB1c2luZyB0aGUgcHVibGlzaGluZyB0eXBlICJwdWJsaXNoIHRoZSBwcm9jZXNzZXMgc2VsZWN0ZWQgYmVsb3ciCi0JCWlmICggQ29uZmlndXJhdGlvbkhlbHBlci5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoIGNsb3N1cmVFbGVtZW50cy5jb250YWlucyhlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoICEoZSBpbnN0YW5jZW9mIEd1aWRhbmNlKSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCBlIGluc3RhbmNlb2YgUHJhY3RpY2UgCi0JCQkJfHwgZSBpbnN0YW5jZW9mIFJvYWRtYXAgCi0JCQkJfHwgZSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCAKLQkJCQl8fCBlIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24gKQotCQl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQkJCQotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBkaXNjYXJkZWQgb3Igbm90Ci0JICogZGlzY2FyZGVkIGVsZW1lbnRzIHdpbGwgYmUgdHJlYXRlZCBhcyBvdXQgc2lkZSB0aGUgY29uZmlndXJzYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZSBPYmplY3QgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZAotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0ucm1jLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yI2lzRGlzY2FyZGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzY2FyZGVkKE1ldGhvZEVsZW1lbnQgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBNZXRob2RFbGVtZW50IGUpIHsKLQkKLQkJaWYgKCBvd25lciA9PSBudWxsICkgewotCQkJb3duZXIgPSBkZWZhdWx0VGFyZ2V0OwotCQl9IGVsc2UgaWYgKCBkZWZhdWx0VGFyZ2V0ICE9IG51bGwgJiYgb3duZXIgIT0gZGVmYXVsdFRhcmdldCApIHsKLQkJCQotCQkJc3VwZXIubG9nV2FybmluZygiVGFyZ2V0IG1pc21hdGNoIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSArICI8LS0tPiIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShkZWZhdWx0VGFyZ2V0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCQotCQlpZiAoIHN1cGVyLmlzRGlzY2FyZGVkKG93bmVyLCBmZWF0dXJlLCBlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlib29sZWFuIGluQ2xzID0gaW5DbG9zdXJlKGUpOwotCQlpZiAoIWluQ2xzICYmICFpc0ZpbmFsQ2xvc3VyZSApIHsKLQkJCS8vIGlmIHRoZSBjbG9zdXJlIGlzIG5vdCBmaW5hbCwgdGhlbiBpZiB0aGUgb3duZXIgaXMgaW4gY2xvc3VyZSBhbmQgdGhlIGVsZW1lbnQgaXMgYSBHdWlkYW5jZSwgCi0JCQkvLyB0aGlzIGVsZW1lbnQgaXMgYWxzbyBpbiBjbG9zdXJlCi0JCQlpbkNscyA9IGluQ2xvc3VyZShvd25lcikgJiYgKGUgaW5zdGFuY2VvZiBHdWlkYW5jZSk7Ci0JCX0KLQkJCi0JCWlmICggIWluQ2xzICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0vLwkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgVGFza3MKLS8vCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgVGFzayApIHsKLS8vCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB8fCAKLS8vCQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSB8fAotLy8JCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCkgfHwgCi0vLwkJCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpICkgewotLy8JCQkJTGlzdCByZWZzID0gKExpc3Qpb2JqUmVmZXJlbmNlcy5nZXQob3duZXIpOwotLy8JCQkJaWYgKCByZWZzICE9IG51bGwgJiYgIXJlZnMuY29udGFpbnMoZSkgKSB7Ci0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQotCQlpZiAoIGNsb3N1cmVFbGVtZW50cyAhPSBudWxsICkgewotCQkJY2xvc3VyZUVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQkJCi0vLwkJaWYgKCBvYmpSZWZlcmVuY2VzICE9IG51bGwgKSB7Ci0vLwkJCW9ialJlZmVyZW5jZXMuY2xlYXIoKTsKLS8vCQl9Ci0JCQotCQlpZiAoIGNsb3N1cmVMb2cgIT0gbnVsbCApIHsKLQkJCWNsb3N1cmVMb2cuY2xvc2UoKTsKLQkJCWNsb3N1cmVMb2cgPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYmVnaW5DbG9zdXJlTG9nKCkgewotCQljbG9zdXJlTG9nLnByaW50bG4oIjx0YWJsZT4iKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRMb2dFbnRyeSgiPGI+RWxlbWVudDwvYj4iLCAiPGI+UmVmZXJlbmNlZCBCeTwvYj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXByaXZhdGUgdm9pZCBlbmRDbG9zdXJlTG9nKCkgewotCQljbG9zdXJlTG9nLnByaW50bG4oIjwvdGFibGU+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZExvZ0VudHJ5KFN0cmluZyBzdHIxLCBTdHJpbmcgc3RyMikgewotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYi5hcHBlbmQoIjx0cj48dGQ+IikuYXBwZW5kKHN0cjEpLmFwcGVuZCgiPC90ZD48dGQ+IikuYXBwZW5kKHN0cjIpLmFwcGVuZCgiPC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQljbG9zdXJlTG9nLnByaW50bG4oYik7Ci0JfQotCQotCS8qKgotCSAqIGxvZyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSByZWZlcmVuY2luZyBlbGVtZW50Ci0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgZSkKLQl7Ci0JCXN1cGVyLmxvZ1JlZmVyZW5jZShvd25lciwgZSk7Ci0JCWlmICggZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggIWlzRmluYWxDbG9zdXJlICYmIGNsb3N1cmVMb2cgIT0gbnVsbCkgewotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmICggb3duZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICkgewotCQkJCWIuYXBwZW5kKGdldEJyZWFrZG93bkVsZW1lbnRMYWJlbCgoQnJlYWtkb3duRWxlbWVudClvd25lcikpOwotCQkJfSBlbHNlIGlmICggb3duZXIgIT0gbnVsbCApIHsKLQkJCQliLmFwcGVuZChMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvd25lcikpOwotCQkJfQotCQkJCi0JCQlhZGRMb2dFbnRyeShMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSwgYi50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBnZXRCcmVha2Rvd25FbGVtZW50TGFiZWwoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQliLmFwcGVuZChMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSk7Ci0KLQkJd2hpbGUgKCAoZT1lLmdldFN1cGVyQWN0aXZpdGllcygpKSAhPSBudWxsICkgewotCQkJYi5pbnNlcnQoMCwgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZSkgKyAiLyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBiOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBjNDIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBFbGVtZW50UmVhbGl6ZXIgZm9yIHByb2Nlc3MgcHVibGlzaGluZy4KLSAqIFJlYWxpemVzIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uLCByZWFsaXplIG9wdGlvbnMsIGFuZCB0aGUgcHJvY2VzcyBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIgZXh0ZW5kcyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIHsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB2YWxpZGF0b3IgUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmFsaWRhdG9yKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWxlbWVudFJlYWxpemVyIG5ld1Byb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciByZWFsaXplciA9IChQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcikgY3JlYXRlRWxlbWVudFJlYWxpemVyRXh0ZW5zaW9uKGNvbmZpZywgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXJfVHlwZSk7Ci0JCWlmIChyZWFsaXplciA9PSBudWxsKSB7Ci0JCQlyZWFsaXplciA9IG5ldyBQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcihjb25maWcsIG51bGwpOwotCQl9Ci0JCXJlYWxpemVyLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJCi0JCXJldHVybiByZWFsaXplcjsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgZWxlbWVudC4gCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudCB0aGUgcmVhbGl6ZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJcmV0dXJuIHN1cGVyLnJlYWxpemUoZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqIHJlYWxpemUgdGhlIGxpc3Qgb2YgZmVhdHVyZSB2YWx1ZXMgYW5kIHJldHVybnMgYSBuZXcgbGlzdCBvZiB2YWx1ZXMKLQkgKiBUaGUgbmV3IG1pZ2h0IGJlIGEgcmUtc29ydGluZyBvZiB0aGUgb3JpZ2luYWwgbGlzdCAKLQkgKiBvciBzb21lIG9mIHRoZSB2YWx1ZXMgY2FuIGJlIGZpbHRlcmVkIG91dCwgZGVwZW5kaW5nIG9uIHRoZSBkZXRhaWwgaW1wbGVtZW50YXRpb24KLQkgKiBOb3RlOiB0aGUgbGlzdCB2YWx1ZSBwYXNzZWQgaW4gbWlnaHQgYmUgdXBkYXRlZCBhcyB3ZWxsLgotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsdWVzIExpc3QKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTGlzdCB2YWx1ZXMpCi0JewkJCi0JCUxpc3QgaXRlbXMgPSBzdXBlci5yZWFsaXplKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlcyk7Ci0JCi0vLwkJLy8gYWRkIHRoZSBmZWF0dXJlIHJlZmVyZW5jZXMgaW4gY2FzZSB0aGUgdmFsaWRhdG9yIG5lZWQgZmVhdHVyZS1iYXNlZCByZWZlcmVuY2UgaW5mb3JtYXRpb24sCi0vLwkJLy8gZm9yIGV4YW1wbGUsIHdoZW4gcHVibGlzaGluZyBwcm9jZXNzLCB0aGUgb3V0cHV0IFdQcyBpbiBhIFRhc2sgc2hvdWxkIG5vdCBiZSBwdWJsaXNoZWQgCi0vLwkJLy8gaXQgbm9uZSBvZiB0aGUgVGFza0Rlc2NyaXB0b3JzIGZvciB0aGlzIHRhc2sgaGFzIHJlZmVyZW5jZSB0byB0aGF0IFdQLgotLy8JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yICkgewotLy8JCQlUYXNrIHQgPSAoVGFzaylyZWFsaXplKCgoVGFza0Rlc2NyaXB0b3IpZWxlbWVudCkuZ2V0VGFzaygpKTsKLS8vCQkJCi0vLwkJCSgoUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKXZhbGlkYXRvcikuc2V0RWxlbWVudFJlZmVyZW5jZXModCwgaXRlbXMpOwotLy8JCQkKLS8vCQl9Ci0JCQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaEhUTUxPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaEhUTUxPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NzIzZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hIVE1MT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5hd3QuSW1hZ2U7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotCi0vKioKLSAqIEV4dGVuZHMgdGJlIGJhc2ljIHB1Ymxpc2ggb3B0aW9ucyB0byBpbmNsdWRlIEhUTUwgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoSFRNTE9wdGlvbnMgZXh0ZW5kcyBQdWJsaXNoT3B0aW9ucyB7Ci0KLQkvLyBUaGUgSFRNTCB0aXRsZS4KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JLy8gVGhlIGFib3V0IEhUTUwuCi0JcHJvdGVjdGVkIFN0cmluZyBhYm91dEhUTUw7Ci0KLQkvLyBUaGUgZmVlZGJhY2sgVVJMLgotCXByb3RlY3RlZCBTdHJpbmcgZmVlZGJhY2tVUkw7Ci0KLQkvLyBQdWJsaXNoIGdsb3NzYXJ5IG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoR2xvc3Nhcnk7Ci0KLQkvLyBQdWJsaXNoIGluZGV4IG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoSW5kZXg7Ci0KLQkvLyBUaGUgYmFubmVyIGltYWdlLgotCXByb3RlY3RlZCBTdHJpbmcgYmFubmVySW1hZ2U7Ci0JCi0JcHJvdGVjdGVkIGludCBiYW5uZXJJbWFnZUhlaWdodCA9IDY3OyAvLyBiYW5uZXIgaW1hZ2UgaGVpZ2h0LCBjYW4gd2UgYXV0byBjYWxjIGl0Pz8/Ci0KLQkvLyBDaGVjayBleHRlcm5hbCBsaW5rcyBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tFeHRlcm5hbExpbmtzOwotCi0JLy8gQ29udmVydCBicm9rZW4gbGlua3MgdG8gcGxhaW4gdGV4dCBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udmVydEJyb2tlbkxpbmtzOwotCi0JLy8gUHVibGlzaCBKYXZhU2NyaXB0IG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaEphdmFTY3JpcHRUcmVlID0gdHJ1ZTsKLQotCS8vIFB1Ymxpc2ggZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hEeW5hbWljV2ViQXBwOwotCi0JLy8gVGhlIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIG5hbWUuCi0JcHJvdGVjdGVkIFN0cmluZyBkeW5hbWljV2ViQXBwTmFtZTsKLQotCS8vIEluY2x1ZGUgc2VydmxldCBzZWFyY2ggb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVTZXJ2bGV0U2VhcmNoOwotCi0JLy8gZGVmaW5lIHRoZSBkZWZhdWx0IGFjdGl2aXR5IHRhYgotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEFjdGl2aXR5VGFiID0gQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV0JTOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hIVE1MT3B0aW9ucygpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoSFRNTE9wdGlvbnMoUHVibGlzaE9wdGlvbnMgb3B0aW9ucykgewotCQl0aGlzLnB1Ymxpc2hEaXIgPSBvcHRpb25zLmdldFB1Ymxpc2hEaXIoKTsKLQkJdGhpcy5wcm9jZXNzZXMgPSBvcHRpb25zLmdldFByb2Nlc3NlcygpOwotCQl0aGlzLnB1Ymxpc2hDb25maWd1cmF0aW9uID0gb3B0aW9ucy5pc1B1Ymxpc2hDb25maWd1cmF0aW9uKCk7Ci0JCXRoaXMucHVibGlzaFByb2Nlc3MgPSBvcHRpb25zLmlzUHVibGlzaFByb2Nlc3MoKTsKLQkJdGhpcy5wdWJsaXNoVW5vcGVuQUREID0gb3B0aW9ucy5pc1B1Ymxpc2hVbm9wZW5BREQoKTsKLQkJdGhpcy5wdWJsaXNoQmFzZUFEID0gb3B0aW9ucy5pc1B1Ymxpc2hCYXNlQUQoKTsKLQkJdGhpcy5wdWJsaXNoTGlnaHRXZWlnaHRUcmVlID0gb3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKTsKLQkJdGhpcy5zaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMgPSBvcHRpb25zCi0JCQkJLmlzU2hvd01ldGhvZENvbnRlbnRJbkRlc2NyaXB0b3JzKCk7Ci0JCXRoaXMuc2hvd1JlbGF0ZWREZXNjcmlwdG9ycyA9IG9wdGlvbnMuaXNTaG93UmVsYXRlZERlc2NyaXB0b3JzKCk7Ci0JCXRoaXMuc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbiA9IG9wdGlvbnMuaXNTaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uKCk7Ci0JCXRoaXMuc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSA9IG9wdGlvbnMKLQkJCQkuaXNTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKCk7Ci0JCXRoaXMucHVibGlzaEVtcHR5Q2F0ZWdvcmllcyA9IG9wdGlvbnMuaXNQdWJsaXNoRW1wdHlDYXRlZ29yaWVzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRNTCB0aXRsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIHRpdGxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEhUTUwgdGl0bGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgSFRNTCB0aXRsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgQWJvdXQgSFRNTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBBYm91dCBIVE1MCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYm91dEhUTUwoKSB7Ci0JCXJldHVybiBhYm91dEhUTUw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgQWJvdXQgSFRNTC4KLQkgKiAKLQkgKiBAcGFyYW0gYWJvdXRIVE1MCi0JICogICAgICAgICAgICB0aGUgQWJvdXQgSFRNTAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFib3V0SFRNTChTdHJpbmcgYWJvdXRIVE1MKSB7Ci0JCXRoaXMuYWJvdXRIVE1MID0gYWJvdXRIVE1MOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZlZWRiYWNrIFVSTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlZWRiYWNrVVJMKCkgewotCQlyZXR1cm4gZmVlZGJhY2tVUkw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVlZGJhY2sgVVJMLgotCSAqIAotCSAqIEBwYXJhbSBmZWVkYmFja1VSTAotCSAqICAgICAgICAgICAgdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlZWRiYWNrVVJMKFN0cmluZyBmZWVkYmFja1VSTCkgewotCQl0aGlzLmZlZWRiYWNrVVJMID0gZmVlZGJhY2tVUkw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBnbG9zc2FyeSBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2xvc3NhcnkgbmVlZHMgdG8gYmUgcHVibGlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoR2xvc3NhcnkoKSB7Ci0JCXJldHVybiBwdWJsaXNoR2xvc3Nhcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBnbG9zc2FyeSBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hHbG9zc2FyeQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggdGhlIGdsb3NzYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEdsb3NzYXJ5KGJvb2xlYW4gcHVibGlzaEdsb3NzYXJ5KSB7Ci0JCXRoaXMucHVibGlzaEdsb3NzYXJ5ID0gcHVibGlzaEdsb3NzYXJ5OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggaW5kZXggb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGluZGV4IG5lZWRzIHRvIGJlIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaEluZGV4KCkgewotCQlyZXR1cm4gcHVibGlzaEluZGV4OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggaW5kZXggb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoSW5kZXgKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHRoZSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hJbmRleChib29sZWFuIHB1Ymxpc2hJbmRleCkgewotCQl0aGlzLnB1Ymxpc2hJbmRleCA9IHB1Ymxpc2hJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBiYW5uZXIgaW1hZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFubmVyIGltYWdlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYW5uZXJJbWFnZSgpIHsKLQkJcmV0dXJuIGJhbm5lckltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFubmVySW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBiYW5uZXIgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYW5uZXJJbWFnZShTdHJpbmcgYmFubmVySW1hZ2UpIHsKLQkJdGhpcy5iYW5uZXJJbWFnZSA9IGJhbm5lckltYWdlOwotCQkKLQkJLy8gc2V0IHRoZSBoZWlnaHQgb2YgdGhlIGJhbm5lcgotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHRoaXMuYmFubmVySW1hZ2UpOwotCQlpZiAoIGYuZXhpc3RzKCkgKSB7Ci0JCQl0cnkgewotCQkJCWltYWdlID0gSW1hZ2VJTy5yZWFkKGYpOwotCQkJCWlmICggaW1hZ2UgIT0gbnVsbCApIHsKLQkJCQkJaW50IGhlaWdodCA9IGltYWdlLmdldEhlaWdodChudWxsKTsKLQkJCQkJaWYgKCBoZWlnaHQgPiAwICkgewotCQkJCQkJdGhpcy5iYW5uZXJJbWFnZUhlaWdodCA9IGhlaWdodDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCApIHsKLQkJCQkvLyBlcnJvciByZWFkIHRoZSBmaWxlLCBpZ25vcmUgZXJyb3IgYW5kIHVzZSB0aGUgZGVmYXVsdCBiYW5uZXIgaGVpZ2h0Ci0JCQkJOwotCQkJfSBmaW5hbGx5IHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJhbm5lciBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYW5uZXIgaW1hZ2UgaGVpZ2h0Ci0JICovCi0JcHVibGljIGludCBnZXRCYW5uZXJJbWFnZUhlaWdodCgpIHsKLQkJcmV0dXJuIGJhbm5lckltYWdlSGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFubmVySW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBiYW5uZXIgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhbm5lckltYWdlSGVpZ2h0KGludCBiYW5uZXJJbWFnZWhlaWdodCkgewotCQl0aGlzLmJhbm5lckltYWdlSGVpZ2h0ID0gYmFubmVySW1hZ2VoZWlnaHQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNoZWNrIGV4dGVybmFsIGxpbmtzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBleHRlcm5hbCBsaW5rcyBuZWVkIHRvIGJlIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrRXh0ZXJuYWxMaW5rcygpIHsKLQkJcmV0dXJuIGNoZWNrRXh0ZXJuYWxMaW5rczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBleHRlcm5hbCBsaW5rcyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIGNoZWNrRXh0ZXJuYWxMaW5rcwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGNoZWNrIHRoZSBleHRlcm5hbCBsaW5rcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrRXh0ZXJuYWxMaW5rcyhib29sZWFuIGNoZWNrRXh0ZXJuYWxMaW5rcykgewotCQl0aGlzLmNoZWNrRXh0ZXJuYWxMaW5rcyA9IGNoZWNrRXh0ZXJuYWxMaW5rczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb252ZXJ0IGJyb2tlbiBsaW5rcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udmVydCBicm9rZW4gbGlua3MgbmVlZCB0byBiZQotCSAqICAgICAgICAgY29udmVydGVkIHRvIHBsYWluIHRleHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnZlcnRCcm9rZW5MaW5rcygpIHsKLQkJcmV0dXJuIGNvbnZlcnRCcm9rZW5MaW5rczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb252ZXJ0IGJyb2tlbiBsaW5rcyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnZlcnRCcm9rZW5MaW5rcwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGNvbnZlcnQgYnJva2VuIGxpbmtzIHRvIHBsaWFuIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0QnJva2VuTGlua3MoYm9vbGVhbiBjb252ZXJ0QnJva2VuTGlua3MpIHsKLQkJdGhpcy5jb252ZXJ0QnJva2VuTGlua3MgPSBjb252ZXJ0QnJva2VuTGlua3M7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBKYXZhU2NyaXB0IG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIEphdmFTY3JpcHQgbmF2aWdhdGlvbiB0cmVlIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaEphdmFTY3JpcHRUcmVlKCkgewotCQlyZXR1cm4gcHVibGlzaEphdmFTY3JpcHRUcmVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggSmF2YVNjcmlwdCBuYXZpZ2F0aW9uIHRyZWUgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoSmF2YVNjcmlwdFRyZWUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIGEgSmF2YVNjcmlwdCBuYXZpZ2F0aW9uIHRyZWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoSmF2YVNjcmlwdFRyZWUoYm9vbGVhbiBwdWJsaXNoSmF2YVNjcmlwdFRyZWUpIHsKLQkJdGhpcy5wdWJsaXNoSmF2YVNjcmlwdFRyZWUgPSBwdWJsaXNoSmF2YVNjcmlwdFRyZWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbiBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hEeW5hbWljV2ViQXBwIAotCQkmJiAodGhpcy5keW5hbWljV2ViQXBwTmFtZSAhPSBudWxsKQotCQkmJiAodGhpcy5keW5hbWljV2ViQXBwTmFtZS5sZW5ndGgoKSA+IDApOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoRHluYW1pY1dlYkFwcAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYSBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEeW5hbWljV2ViQXBwKGJvb2xlYW4gcHVibGlzaER5bmFtaWNXZWJBcHApIHsKLQkJdGhpcy5wdWJsaXNoRHluYW1pY1dlYkFwcCA9IHB1Ymxpc2hEeW5hbWljV2ViQXBwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY1dlYkFwcE5hbWUoKSB7Ci0JCXJldHVybiBkeW5hbWljV2ViQXBwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBkeW5hbWljV2ViQXBwTmFtZQotCSAqICAgICAgICAgICAgdGhlIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHluYW1pY1dlYkFwcE5hbWUoU3RyaW5nIGR5bmFtaWNXZWJBcHBOYW1lKSB7Ci0JCXRoaXMuZHluYW1pY1dlYkFwcE5hbWUgPSBkeW5hbWljV2ViQXBwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIHNlcnZsZXQgc2VhcmNoIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGluY2x1ZGUgc2VydmxldCBzZWFyY2ggd2lsbCBiZSBhZGRlZCB0bwotCSAqICAgICAgICAgdGhlIHB1Ymxpc2hlZCBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVNlcnZsZXRTZWFyY2goKSB7Ci0JCXJldHVybiBpbmNsdWRlU2VydmxldFNlYXJjaCAmJiBpc1B1Ymxpc2hEeW5hbWljV2ViQXBwKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVTZXJ2bGV0U2VhcmNoCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBpbiB0aGUKLQkgKiAgICAgICAgICAgIHB1Ymxpc2hlZCBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVTZXJ2bGV0U2VhcmNoKGJvb2xlYW4gaW5jbHVkZVNlcnZsZXRTZWFyY2gpIHsKLQkJdGhpcy5pbmNsdWRlU2VydmxldFNlYXJjaCA9IGluY2x1ZGVTZXJ2bGV0U2VhcmNoOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWN0aXZpdHlUYWI7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIKLQkgKiBAcGFyYW0gdGFiTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRBY3Rpdml0eVRhYihTdHJpbmcgdGFiTmFtZSkgewotCQl0aGlzLmRlZmF1bHRBY3Rpdml0eVRhYiA9IHRhYk5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgcHVibGlzaCBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHB1Ymxpc2ggb3B0aW9ucyBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJc3VwZXIudmFsaWRhdGUoKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5MDE3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXguRGVmaW5pdGlvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleC5LZXlXb3JkSW5kZXhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5QdWJsaXNoaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFNlcnZpY2U7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgcHVibGlzaGluZyBvZiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVdPUkRfREVGX0ZJTEUgPSAia2V5d29yZGluZGV4ZGVmLnR4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hJTkdfUkVQT1JUX1hTTF9GSUxFID0gInhzbC9QdWJsaXNoaW5nUmVwb3J0LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hJTkdfUkVQT1JUX0hUTUxfRklMRSA9ICJQdWJsaXNoaW5nUmVwb3J0Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoTWFuYWdlcigpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RWaWV3QnVpbGRlciBjcmVhdGVWaWV3QnVpbGRlcigpIHsKLQkJLy8gYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsTGlua3MgPSAob3B0aW9ucyAhPSBudWxsKQotCQkvLyAmJiBvcHRpb25zLmlzQ2hlY2tFeHRlcm5hbExpbmtzKCk7Ci0KLQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbnVsbDsKLQkJaWYgKChvcHRpb25zICE9IG51bGwpICYmIG9wdGlvbnMucHVibGlzaFByb2Nlc3MpIHsKLQkJCXZhbGlkYXRvciA9IG5ldyBQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IocHViRGlyLCBvcHRpb25zKTsKLQkJCXJlYWxpemVyID0gUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIubmV3UHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIoY29uZmlnLAotCQkJCQkoUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKSB2YWxpZGF0b3IpOwotCQl9IGVsc2UgewotCQkJdmFsaWRhdG9yID0gbmV3IFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKHB1YkRpciwgb3B0aW9ucyk7Ci0JCQlyZWFsaXplciA9IFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIubmV3UHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcihjb25maWcsIHZhbGlkYXRvcik7Ci0JCX0KLQotCQkvLyB2YWxpZGF0b3Iuc2V0U2hvd0Jyb2tlbkxpbmtzKG9wdGlvbnMuY29udmVydEJyb2tlbkxpbmtzID09IGZhbHNlKTsKLQkJLy8gdmFsaWRhdG9yLnNldFNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyhvcHRpb25zCi0JCS8vIC5pc1Nob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycygpKTsKLQkJLy8gdmFsaWRhdG9yLnNldFNob3dSZWxhdGVkRGVzY3JpcHRvcnMob3B0aW9ucy5zaG93UmVsYXRlZERlc2NyaXB0b3JzKTsKLQotCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBuZXcgRWxlbWVudExheW91dE1hbmFnZXIoY29uZmlnLAotCQkJCXB1YkRpciwgdmFsaWRhdG9yLCB0cnVlKTsKLQkJbGF5b3V0TWdyLnNldEVsZW1lbnRSZWFsaXplcihyZWFsaXplcik7Ci0JCUh0bWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSHRtbEJ1aWxkZXIobGF5b3V0TWdyKTsKLQotCQlidWlsZGVyLmVuYWJsZUNvbnRlbnRTY2FuKHRydWUpOwotCQlidWlsZGVyLmVuYWJsZVRyZWVCcm93c2VyKHRydWUpOwotCi0JCUlTaXRlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBEZWZhdWx0U2l0ZUdlbmVyYXRvcihidWlsZGVyLCBvcHRpb25zKTsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uVmlld0J1aWxkZXIoZ2VuZXJhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVQdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gZml4T3B0aW9ucyhvcHRpb25zKTsKLQotCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5pbml0aWFsaXppbmdEaXJUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbWFrZSBzdXJlIHRoZSBwdWJsaXNoIGRpcmVjdG9yeSBpcyBjcmVhdGVkCi0JCUZpbGUgZiA9IG5ldyBGaWxlKHZpZXdCdWlsZGVyLmdldEh0bWxCdWlsZGVyKCkuZ2V0UHVibGlzaERpcigpKTsKLQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQlmLm1rZGlycygpOwotCQl9Ci0KLQkJLy8gY29weSB0aGUgY29uZmlndXJhdGlvbiBmaWxlcwotCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5jb3B5aW5nRmlsZXNUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIGNvcHlEb2NSb290RmlsZXMoKTsgLy8gY29weSBsb2NhbGl6ZWQgZmlsZXMgY29weUxvY2FsaXplZEZpbGVzKCk7IC8vCi0JCSAqIGNvcHkgdXNlciBjdXN0b21pemVkIGZpbGVzIGxhc3QgY29weUN1c3RvbWl6ZWRGaWxlcygpOwotCQkgKi8KLQkJZ2V0U2l0ZUdlbmVyYXRvcigpLnByZVB1Ymxpc2goKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gYmVmb3JlIGRvaW5nIHB1Ymxpc2hpbmcsIGxvYWQgdGhlIHdob2xlIGxpYnJhcnkgYW5kIHJlbWVtYmVyIHRoZSByZXNvdWNlcyBsb2FkZWQKLQkJLy8gc28gd2UgY2FuIHVubG9hZCB0aG9zZSByZXNvdXJjZXMgbGF0ZXIgdG8gZnJlZSBtZW1vcnkKLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IGxvYWRMaWJyYXJ5KG1vbml0b3IpOwotCQlDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBleGlzdGluZ01ncnMgPSBEaWFncmFtTWFuYWdlci5nZXREaWFncmFtTWFuYWdlcnMoKTsKLQotCQkvLyBkb24ndCBjb3B5IGFsbCB0aGUgY29udGVudCByZXNvdXJjZXMKLQkJLy8gbGV0IHRoZSBzeXN0ZW0gc2NhbiB0aGUgY29udGVudCBhbmQgY29weSBvbmx5IHRoZSByZXF1aXJlZAotCQkvLyByZXNvdXJjZQotCQkvLyB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmVuYWJsZUNvbnRlbnRTY2FuKHRydWUpOwotCQkvLyB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmVuYWJsZVRyZWVCcm93c2VyKHRydWUpOwotCi0JCS8vIGdlbmVyYXRlIGJvb2ttYXJrcyBhbmQgcHVibGlzaGVkIHRoZSBjb250ZW50cyBhcyBuZWVkZWQKLQkJbW9uaXRvci5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMuZ2VuZXJhdGluZ0Jvb2ttYXJrc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2VuZXJhdGVCb29rbWFya3MobW9uaXRvcik7Ci0KLQkJU3RyaW5nIHRpdGxlID0gb3B0aW9ucyA9PSBudWxsID8gIiIgOiBvcHRpb25zLmdldFRpdGxlKCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CQkJCi0JCQkvLyBjcmVhdGluZyBnbG9zc2FyeQotCQkJaWYgKG9wdGlvbnMgPT0gbnVsbCB8fCBvcHRpb25zLmlzUHVibGlzaEdsb3NzYXJ5KCkpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJbmV3IEdsb3NzYXJ5QnVpbGRlcigpLmV4ZWN1dGUoY29uZmlnLCBwdWJEaXIsIHRpdGxlLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSByZXNvdXJjZXMgYXJlIHVubG9hZGVkIGJlZm9yZSByZXR1cm4KLQkJLy8gbm93IGl0J3MgdGltZSB0byB1bmxvYWQgdGhlIHJlc29ydWNlcwotCQlDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBuZXdNZ3JzID0gRGlhZ3JhbU1hbmFnZXIuZ2V0RGlhZ3JhbU1hbmFnZXJzKCk7Ci0JCVB1Ymxpc2hpbmdVdGlsLmRpc3Bvc2VEaWFncmFtTWFuYWdlcnMobmV3TWdycywgZXhpc3RpbmdNZ3JzKTsKLQkJUHVibGlzaGluZ1V0aWwudW5sb2FkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWV4aXN0aW5nTWdycy5jbGVhcigpOwotCQluZXdNZ3JzLmNsZWFyKCk7Ci0JCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7CQotCQkKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjcmVhdGluZyBjb250ZW50IGluZGV4Ci0JCWlmIChvcHRpb25zID09IG51bGwgfHwgb3B0aW9ucy5pc1B1Ymxpc2hJbmRleCgpKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMuZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBuZXcgSW5kZXhCdWlsZGVyKCkuZXhlY3V0ZShjb25maWcsIHB1Ymxpc2hEaXIsIG1vbml0b3IpOwotCQkJZ2VuZXJhdGVCb29rbWFya0luZGV4KHB1YkRpciwgdGl0bGUsIG1vbml0b3IpOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBlbmFibGUgc2VhcmNoaW5nCi0JCWlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5pc1B1Ymxpc2hEeW5hbWljV2ViQXBwKCkKLQkJCQkmJiBvcHRpb25zLmlzSW5jbHVkZVNlcnZsZXRTZWFyY2goKSkgewotCQkJLy8gZ2VuZXJhdGluZyB0aGUgc2VhcmNoIGluZGV4Ci0JCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWUpOwotCQkJU2VhcmNoU2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUluZGV4KHB1YkRpciwgZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZmluYWxseSwgZ2VuZXJhdGUgYSByZXBvcnQKLQkJZ2V0U2l0ZUdlbmVyYXRvcigpLnBvc3RQdWJsaXNoKCk7Ci0KLQkJY3JlYXRlV0FSRmlsZSgpOwotCi0JCWdldFB1Ymxpc2hSZXBvcnRVcmwoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVCb29rbWFya3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9uZyBiZWdpblRpbWUgPSAwTDsKLQkJbG9uZyBzdGFydFRpbWUgPSAwTDsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJYmVnaW5UaW1lID0gc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJTGlzdDxCb29rbWFyaz4gYm9va21hcmtzID0gdmlld0J1aWxkZXIuYnVpbGRWaWV3cyhtb25pdG9yKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJRGVidWdUcmFjZS5wcmludCh2aWV3QnVpbGRlciwgImJ1aWxkVmlld3MiLCAvLyROT04tTkxTLTEkCi0JCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJQm9va21hcmsgZGVmYXVsdFZpZXcgPSB2aWV3QnVpbGRlci5nZXREZWZhdWx0VmlldygpOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gMy4gZmluYWxseSwgd3JpdGUgdGhlIHB1Ymxpc2hlZCBib29rbWFya3MgZmlsZQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlnZXRTaXRlR2VuZXJhdG9yKCkud3JpdGVQdWJsaXNoZWRCb29rbWFya3MoYm9va21hcmtzLCBkZWZhdWx0Vmlldyk7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQoZ2V0U2l0ZUdlbmVyYXRvcigpLCAid3JpdGVQdWJsaXNoZWRCb29rbWFya3MiLCAvLyROT04tTkxTLTEkCi0JCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdlbmVyYXRlQm9va21hcmtzIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpblRpbWUpICsgIiBtcyIpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCWlmIChzdWNjZXNzKSB7Ci0JCQlTdHJpbmcgdXJsID0gZ2V0U2l0ZUdlbmVyYXRvcigpLmdldEluZGV4RmlsZVBhdGgoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHVybCk7Ci0JCQlpZiAoZi5leGlzdHMoKSkgewotCQkJCXJldHVybiB1cmw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJvb2ttYXJrSW5kZXgoU3RyaW5nIHB1Ymxpc2hEaXIsIFN0cmluZyB0aXRsZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCi0JCQlVUkwgdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCUtFWVdPUkRfREVGX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZ2V0IGluZGV4IGRlZmluaXRpb24gZmlsZSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIGRlZmZpbGUgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJU3RyaW5nIGNoYXJTZXQgPSAidXRmLTgiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaGVscEZpbGUgPSBudWxsOwotCQkJS2V5V29yZEluZGV4SGVscGVyIGluZGV4SGVscGVyID0gbmV3IEtleVdvcmRJbmRleEhlbHBlcihkZWZmaWxlLAotCQkJCQljaGFyU2V0LCBoZWxwRmlsZSk7Ci0JCQlEZWZpbml0aW9uT2JqZWN0IGRlZk9iaiA9IGluZGV4SGVscGVyLmxvYWREZWZpbml0aW9uKHB1Ymxpc2hEaXIpOwotCQkJaWYgKGRlZk9iaiAhPSBudWxsKSB7Ci0JCQkJZGVmT2JqLnNldHd3d1Jvb3QocHVibGlzaERpcik7Ci0JCQkJZGVmT2JqLnNldEluZGV4VGl0bGUoUHVibGlzaGluZ1Jlc291cmNlcy5pbmRleExhYmVsX3RleHQKLQkJCQkJCSsgIiAtICIgKyB0aXRsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlpbmRleEhlbHBlci5leGVjdXRlKG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlIHRoZSBwdWJsaXNoaW5nIHJlcG9ydCBhbmQgcmV0dXJuIHRoZSB1cmwKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgcmVwb3J0IHVybAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFJlcG9ydFVybCgpIHsKLQkJU3RyaW5nIHB1Ymxpc2hEaXIgPSB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmdldFB1Ymxpc2hEaXIoKTsKLQkJU3RyaW5nIGZpbGVfcGF0aG5hbWUgPSBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5MT0dTX0ZPTERFUgotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBQVUJMSVNISU5HX1JFUE9SVF9IVE1MX0ZJTEU7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsIGZpbGVfcGF0aG5hbWUpOwotCQlTdHJpbmcgcmVwb3J0X2ZpbGUgPSBmLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCUZpbGUgZXJyb3JMb2cgPSBuZXcgRmlsZShwdWJsaXNoRGlyLAotCQkJCQlQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5MT0dTX0ZPTERFUiArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5FUlJPUl9MT0dfRklMRU5BTUUpOwotCQkJRmlsZSB3YXJuaW5nTG9nID0gbmV3IEZpbGUocHVibGlzaERpciwKLQkJCQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuTE9HU19GT0xERVIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuV0FSTklOR19MT0dfRklMRU5BTUUpOwotCQkJRmlsZSBpbmZvTG9nID0gbmV3IEZpbGUocHVibGlzaERpciwKLQkJCQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuTE9HU19GT0xERVIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuSU5GT19MT0dfRklMRU5BTUUpOwotCi0JCQkvLyBnZWVucmF0ZSB0aGUgaW5kZXguaHRtCi0JCQlYbWxFbGVtZW50IHJlcG9ydFhtbCA9IG5ldyBYbWxFbGVtZW50KCJQdWJsaXNoaW5nUmVwb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJcmVwb3J0WG1sLm5ld0NoaWxkKCJwdWJEaXIiKS5zZXRBdHRyaWJ1dGUoInBhdGgiLCBwdWJsaXNoRGlyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJlcnJvckxvZyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkibmFtZSIsIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLkVSUk9SX0xPR19GSUxFTkFNRSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwYXRoIiwgIi4vIiArIGVycm9yTG9nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlyZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJ3YXJuaW5nTG9nIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCSJuYW1lIiwgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuV0FSTklOR19MT0dfRklMRU5BTUUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgicGF0aCIsICIuLyIgKyB3YXJuaW5nTG9nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlyZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJpbmZvTG9nIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCSJuYW1lIiwgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuSU5GT19MT0dfRklMRU5BTUUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgicGF0aCIsICIuLyIgKyBpbmZvTG9nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBkZXRhaWwgaW5mb3JtYXRpb24KLQkJCVB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciA9IChQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcikgdmlld0J1aWxkZXIKLQkJCQkJLmdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCk7Ci0JCQlyZXBvcnRYbWwuYWRkQ2hpbGQodmFsaWRhdG9yLmdldFJlcG9ydCgpKTsKLQotCQkJU3RyaW5nIGJ1ZmZlciA9IFB1Ymxpc2hpbmdVdGlsLmdldEh0bWwocmVwb3J0WG1sLAotCQkJCQlQVUJMSVNISU5HX1JFUE9SVF9YU0xfRklMRSk7Ci0JCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKHJlcG9ydF9maWxlLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVwb3J0X2ZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlV0FSRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpCi0JCQkJJiYgb3B0aW9ucy5nZXREeW5hbWljV2ViQXBwTmFtZSgpLmxlbmd0aCgpID4gMCkgewotCQkJU2VhcmNoU2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVdBUihwdWJEaXIsCi0JCQkJCW9wdGlvbnMuZ2V0RHluYW1pY1dlYkFwcE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNDIxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIE9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hPcHRpb25zIHsKLQotCS8vIFRoZSBwdWJsaXNoIGRpcmVjdG9yeS4KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1Ymxpc2hEaXI7Ci0KLQkvLyBUaGUgbGlzdCBvZiBwcm9jZXNzZXMgdG8gYmUgcHVibGlzaGVkLgotCXByb3RlY3RlZCBMaXN0PFByb2Nlc3M+IHByb2Nlc3NlczsKLQotCS8vIFB1Ymxpc2ggZW50aXJlIG1ldGhvZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoQ29uZmlndXJhdGlvbjsKLQotCS8vIFB1Ymxpc2ggb25lIG9yIG1vcmUgcHJvY2Vzc2VzIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoUHJvY2VzczsKLQotCS8vIFB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaFVub3BlbkFERDsKLQotCS8vIFB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbSBmb3IgYmFzZSBhY3RpdnRpZXMgd2l0aCB1bm1vZGlmaWVkCi0JLy8gZXh0ZW5zaW9ucyBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaEJhc2VBRDsKLQotCS8vIFB1Ymxpc2ggbGlnaHQgd2VpZ2h0IG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZTsKLQotCS8vIFNob3cgbWV0aG9kIGNvbnRlbnQgaW4gdGhlIGRlc2NyaXB0b3IgcGFnZXMgb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9yczsKLQotCS8vIFNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiB0aGUgdGFzaywgcm9sZSwgYW5kIHdvcmsgcHJvZHVjdCBwYWdlcwotCS8vIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UmVsYXRlZERlc2NyaXB0b3JzOwotCQotCS8vU2hvdyBhbGwgaW5kaXJlY3QgKGdyZWVuKSBvY2N1cnJlbmNlcyBpbiBleHRlbmRlZCBwYXR0ZXJucwotCXByb3RlY3RlZCBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb247Ci0KLQkvLyBTaG93IHRhc2sgZGVzY3JpcHRvcnMgaW4gdGhlIG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZTsKLQotCS8vIFB1Ymxpc2ggZW1wdHkgY2F0ZWdvcmllcyBvcHRpb24gKGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGluIHRoZSBVSSkuCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaEVtcHR5Q2F0ZWdvcmllczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIHB1Ymxpc2hlZCBjb250ZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gcHVibGlzaERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaERpcgotCSAqICAgICAgICAgICAgYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIHB1Ymxpc2hlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgcHVibGlzaERpcikgewotCQl0aGlzLnB1Ymxpc2hEaXIgPSBwdWJsaXNoRGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgcHJvY2Vzc2VzIHRoYXQgd2lsbCBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzPiBnZXRQcm9jZXNzZXMoKSB7Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgdGhhdCB3aWxsIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc2VzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzZXMoTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJdGhpcy5wcm9jZXNzZXMgPSBwcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBtZXRob2QgY29uZmlndXJhdGlvbiBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW50aXJlIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIG1ldGhvZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaENvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHRoZSBlbnRpcmUgbWV0aG9kCi0JICogICAgICAgICAgICBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaENvbmZpZ3VyYXRpb24oYm9vbGVhbiBwdWJsaXNoQ29uZmlndXJhdGlvbikgewotCQl0aGlzLnB1Ymxpc2hDb25maWd1cmF0aW9uID0gcHVibGlzaENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvbmUgb3IgbW9yZSBwcm9jZXNzZXMgaW4gYSBtZXRob2QKLQkgKiAgICAgICAgIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBwdWJsaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hQcm9jZXNzKCkgewotCQlyZXR1cm4gcHVibGlzaFByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaFByb2Nlc3MKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIG9uZSBvciBtb3JlIHByb2Nlc3NlcyBpbiBhCi0JICogICAgICAgICAgICBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hQcm9jZXNzKGJvb2xlYW4gcHVibGlzaFByb2Nlc3MpIHsKLQkJdGhpcy5wdWJsaXNoUHJvY2VzcyA9IHB1Ymxpc2hQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB3aWxsCi0JICogICAgICAgICBiZSBwdWJsaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hVbm9wZW5BREQoKSB7Ci0JCXJldHVybiBwdWJsaXNoVW5vcGVuQUREOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hVbm9wZW5BREQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHVub3BlbiBhY3Rpdml0eSBkZXRhaWwKLQkgKiAgICAgICAgICAgIGRpYWdyYW1zCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaFVub3BlbkFERChib29sZWFuIHB1Ymxpc2hVbm9wZW5BREQpIHsKLQkJdGhpcy5wdWJsaXNoVW5vcGVuQUREID0gcHVibGlzaFVub3BlbkFERDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGFjdGl2aXR5IGRpYWdyYW0gZm9yIGJhc2UgYWN0aXZ0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbnMgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGl2aXR5IGRpYWdyYW0gZm9yIGJhc2UgYWN0aXZ0aWVzCi0JICogICAgICAgICB3aXRoIHVubW9kaWZpZWQgZXh0ZW5zaW9ucyB3aWxsIGJlIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaEJhc2VBRCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hCYXNlQUQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBhY3Rpdml0eSBkaWFncmFtIGZvciBiYXNlIGFjdGl2dGllcyB3aXRoIHVubW9kaWZpZWQKLQkgKiBleHRlbnNpb25zIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaEJhc2VBRAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbSBmb3IgYmFzZQotCSAqICAgICAgICAgICAgYWN0aXZ0aWVzIHdpdGggdW5tb2RpZmllZCBleHRlbnNpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEJhc2VBRChib29sZWFuIHB1Ymxpc2hCYXNlQUQpIHsKLQkJdGhpcy5wdWJsaXNoQmFzZUFEID0gcHVibGlzaEJhc2VBRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGxpZ2h0IHdlaWdodCBuYXZpZ2F0aW9uIHRyZWUgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbiB0cmVlIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hMaWdodFdlaWdodFRyZWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbiB0cmVlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYSBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbgotCSAqICAgICAgICAgICAgdHJlZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hMaWdodFdlaWdodFRyZWUoYm9vbGVhbiBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlKSB7Ci0JCXRoaXMucHVibGlzaExpZ2h0V2VpZ2h0VHJlZSA9IHB1Ymxpc2hMaWdodFdlaWdodFRyZWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvdyBtZXRob2QgY29udGVudCBpbiBkZXNjcmlwdG9yIHBhZ2VzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgY29udGVudCB3aWxsIGJlIGRpc3BsYXllZCBpbgotCSAqICAgICAgICAgdGhlIGRlc2NyaXB0b3IgcGFnZXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IG1ldGhvZCBjb250ZW50IGluIGRlc2NyaXB0b3IgcGFnZXMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkaXNwbGF5IHRoZSBtZXRob2QgY29udGVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgIGRlc2NyaXB0b3IgcGFnZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMoCi0JCQlib29sZWFuIHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycykgewotCQl0aGlzLnNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycyA9IHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG93IHJlbGF0ZWQgZGVzY3JpcHRvcnMgaW4gdGhlIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3QKLQkgKiBwYWdlcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWxhdGVkIGRlc2NyaXB0b3JzIHdpbGwgYmUgZGlzcGxheWVkIGluCi0JICogICAgICAgICB0aGUgdGFzaywgcm9sZSwgYW5kIHdvcmsgcHJvZHVjdCBwYWdlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd1JlbGF0ZWREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIGluIHRoZSB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0Ci0JICogcGFnZXMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaG93UmVsYXRlZERlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGlzcGxheSB0aGUgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbgotCSAqICAgICAgICAgICAgdGhlIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3QgcGFnZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKGJvb2xlYW4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycykgewotCQl0aGlzLnNob3dSZWxhdGVkRGVzY3JpcHRvcnMgPSBzaG93UmVsYXRlZERlc2NyaXB0b3JzOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHNob3cgYWxsIGluZGlyZWN0IChncmVlbikgb2NjdXJyZW5jZXMgaW4gZXh0ZW5kZWQgcGF0dGVybnMgb3B0aW9uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgaW5kaXJlY3QgZGVzY3JpcHRvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4KLQkgKiAgICAgICAgIHRoZSB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0IHBhZ2VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uKCkgewotCQlyZXR1cm4gc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IGFsbCBpbmRpcmVjdCAoZ3JlZW4pIG9jY3VycmVuY2VzIGluIGV4dGVuZGVkIHBhdHRlcm5zIG9wdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGlzcGxheSBhbGwgaW5kaXJlY3QgZGVzY3JpcHRvcnMgaW4KLQkgKiAgICAgICAgICAgIHRoZSB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0IHBhZ2VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbihib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24pIHsKLQkJdGhpcy5zaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uID0gc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG93IHRhc2sgZGVzY3JpcHRvcnMgaW4gbmF2aWdhdGlvbiB0cmVlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRhc2sgZGVzY3JpcHRvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlCi0JICogICAgICAgICBuYXZpZ2F0aW9uIHRyZWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUoKSB7Ci0JCXJldHVybiBzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3cgdGFzayBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaG93RGVzY3JpcHRvcnNJblRyZWUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkaXNwbGF5IHRoZSB0YXNrIGRlc2NyaXB0b3JzIGluIHRoZQotCSAqICAgICAgICAgICAgbmF2aWdhdGlvbiB0cmVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSgKLQkJCWJvb2xlYW4gc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSkgewotCQl0aGlzLnNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUgPSBzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggZW1wdHkgY2F0ZWdvcmllcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbXB0eSBjYXRlZ29yaWVzIHdpbGwgYmUgcHVibGlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoRW1wdHlDYXRlZ29yaWVzKCkgewotCQlyZXR1cm4gcHVibGlzaEVtcHR5Q2F0ZWdvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGVtcHR5IGNhdGVnb3JpZXMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoRW1wdHlDYXRlZ29yaWVzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaCB0aGUgZW1wdHkgY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hFbXB0eUNhdGVnb3JpZXMoYm9vbGVhbiBwdWJsaXNoRW1wdHlDYXRlZ29yaWVzKSB7Ci0JCXRoaXMucHVibGlzaEVtcHR5Q2F0ZWdvcmllcyA9IHB1Ymxpc2hFbXB0eUNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBwdWJsaXNoIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHVibGlzaCBvcHRpb25zIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODFhZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eS5JUHJveHlEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUubmV0LnByb3h5LklQcm94eVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkRlZmF1bHRDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MaW5rSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwLkh0dHBSZXNwb25zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHAuSHR0cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIGNvbnRlbnQgdmFsaWRhdG9yIHVzZWQgZm9yIHB1Ymxpc2hpbmcuIFRoaXMgY2xhc3Mgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IKLSAqIHZhbGlkYXRpbmcgdGhlIGNvbnRlbnQgdG8gYmUgcHVibGlzaGVkLCBmaXhpbmcgcHJvYmxlbXMgc3VjaCBhcyBsaW5rcyBpbiB0aGUKLSAqIGNvbnRlbnQsIGFuZCBsb2dnaW5nIGluZm9ybWF0aW9uIGFib3V0IG1pc3NpbmcgZWxlbWVudHMsIG1pc3NpbmcgcmVzb3VyY2VzLAotICogZXRjLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBleHRlbmRzIERlZmF1bHRDb250ZW50VmFsaWRhdG9yIHsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzID0gZmFsc2U7Ci0JLy8gcHJpdmF0ZSBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnMgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucyA9IG51bGw7Ci0KLQljbGFzcyBJbnZhbGlkRXh0ZXJuYWxMaW5rSW5mbyB7Ci0JCXB1YmxpYyBNZXRob2RFbGVtZW50IG93bmVyOwotCi0JCXB1YmxpYyBTdHJpbmcgdXJsOwotCi0JCXB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKLQotCQlwdWJsaWMgSW52YWxpZEV4dGVybmFsTGlua0luZm8oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCwKLQkJCQlTdHJpbmcgbWVzc2FnZSkgewotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy51cmwgPSB1cmw7Ci0JCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl9Ci0JfQotCi0JY2xhc3MgTWlzc2luZ1JlZmVyZW5jZSB7Ci0JCXB1YmxpYyBNZXRob2RFbGVtZW50IG93bmVyOwotCi0JCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQ7Ci0KLQkJcHVibGljIFN0cmluZyBndWlkOwotCi0JCXB1YmxpYyBTdHJpbmcgbGlua2VkVGV4dDsKLQotCQlwdWJsaWMgTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpIHsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVmRWxlbWVudCA9IHJlZkVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgZ3VpZCwKLQkJCQlTdHJpbmcgbGlua2VkVGV4dCkgewotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5ndWlkID0gZ3VpZDsKLQkJCXRoaXMubGlua2VkVGV4dCA9IGxpbmtlZFRleHQ7Ci0JCX0KLQl9Ci0KLQljbGFzcyBNaXNzaW5nUmVzb3VyY2UgewotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBvd25lcjsKLQotCQlwdWJsaWMgRmlsZSByZXNvdXJjZUZpbGU7Ci0KLQkJcHVibGljIFN0cmluZyB1cmw7Ci0KLQkJcHVibGljIE1pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCQlTdHJpbmcgdXJsKSB7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLnJlc291cmNlRmlsZSA9IHJlc291cmNlRmlsZTsKLQkJCXRoaXMudXJsID0gdXJsOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMT0dTX0ZPTERFUiA9ICJsb2dzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9MT0dfRklMRU5BTUUgPSAiZXJyb3IubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX0xPR19GSUxFTkFNRSA9ICJ3YXJuaW5nLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19MT0dfRklMRU5BTUUgPSAiaW5mby5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfTkVUX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5jb3JlLm5ldCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBGaWxlIGxvZ1BhdGg7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsTGlua3MgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IGludmFsaWRFeHRlcm5hbExpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gY2FjaGUgdGhlIHZhbGlkZWQgZXh0ZXJuYWwgbGlua3MgdG8gYXZvaWQgbXVsdGlwbGUgY2hlY2tpbmcKLQlwcm90ZWN0ZWQgTGlzdCB2YWxpZGF0ZWRFeHRlcm5hbExpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3QgbWlzc2luZ1JlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBtaXNzaW5nUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3QgZGlzY2FyZGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB2YWxpZENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgbG9uZyBwdWJsaXNoaW5nX3N0YXJ0ID0gMDsKLQotCXByb3RlY3RlZCBsb25nIHRpbWVfZm9yX2V4dGVybmFsX2xpbmtfY2hlY2tpbmcgPSAwOwotCi0JLy8gY29sbGVjdCB0aGUgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGUgcHVibGlzaGVkIGNvbnRlbnRzIHNvIHdlIGNhbgotCS8vIHB1Ymxpc2ggdGhlbQotCS8vIHRoaXMgd2lsbCBiZSB0aGUgZWxlbWVudHMgdG8gYmUgcHVibGlzaGVkCi0JcHJvdGVjdGVkIExpc3QgcmVmZXJlbmNlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHVibGlzaGVkIGVsZW1lbnRzCi0JcHJvdGVjdGVkIExpc3QgcHVibGlzaGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldCBlbGVtZW50IGZvciB0aGUgY29udGVudCB2YWxpZGF0b3IKLQkvLyBzZXQgdGhpcyBiZWZvcmUgcHVibGlzaGluZyB0aGUgZWxlbWVudCBhbmQgc2V0IHRvIG51bGwgYWZ0ZXIgdGhlCi0JLy8gcHVibGlzaGlnbiBpcyBkb25lCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZGVmYXVsdFRhcmdldCA9IG51bGw7Ci0KLQkvKioKLQkgKiBjb25zcnVjdG9yCi0JICogCi0JICogQHBhcmFtIHB1YkRpcgotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQHBhcmFtIHZhbGlkYXRlRXh0ZXJuYWxMaW5rcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcihTdHJpbmcgcHViRGlyLCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucykgewotCQlzdXBlcihwdWJEaXIpOwotCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotCi0JCXRoaXMudmFsaWRhdGVFeHRlcm5hbExpbmtzID0gb3B0aW9ucy5pc0NoZWNrRXh0ZXJuYWxMaW5rcygpOwotCi0JCXRoaXMubG9nUGF0aCA9IG5ldyBGaWxlKHB1YkRpciwgTE9HU19GT0xERVIpOwotCQlzdXBlci5pbmZvID0gZ2V0U3RyZWFtKElORk9fTE9HX0ZJTEVOQU1FKTsKLQkJc3VwZXIud2FybmluZyA9IGdldFN0cmVhbShXQVJOSU5HX0xPR19GSUxFTkFNRSk7Ci0JCXN1cGVyLmVycm9yID0gZ2V0U3RyZWFtKEVSUk9SX0xPR19GSUxFTkFNRSk7Ci0KLQkJLy8gc2V0IHRoZSBzdGFydCB0aW1lCi0JCXB1Ymxpc2hpbmdfc3RhcnQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWludmFsaWRFeHRlcm5hbExpbmtzLmNsZWFyKCk7Ci0JCXZhbGlkYXRlZEV4dGVybmFsTGlua3MuY2xlYXIoKTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuY2xlYXIoKTsKLQkJbWlzc2luZ1Jlc291cmNlcy5jbGVhcigpOwotCQlkaXNjYXJkZWRFbGVtZW50cy5jbGVhcigpOwotCQl2YWxpZENhdGVnb3JpZXMuY2xlYXIoKTsKLQotCQlyZWZlcmVuY2VkRWxlbWVudHMuY2xlYXIoKTsKLQkJcHVibGlzaGVkRWxlbWVudHMuY2xlYXIoKTsKLQotCQlpbmZvLmNsb3NlKCk7Ci0JCXdhcm5pbmcuY2xvc2UoKTsKLQkJZXJyb3IuY2xvc2UoKTsKLQotCX0KLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBnZXRTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShsb2dQYXRoLCBmaWxlTmFtZSk7Ci0JCQlGaWxlIGRpciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJZGlyLm1rZGlycygpOwotCi0JCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVByb3h5U2VydmljZSBnZXRQcm94eVNlcnZpY2UoKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoQ09SRV9ORVRfQlVORExFKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlCdW5kbGVDb250ZXh0IGN0eCA9IGJ1bmRsZS5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IElQcm94eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOwotCQkJU2VydmljZVJlZmVyZW5jZSByZWYgPSBjdHguZ2V0U2VydmljZVJlZmVyZW5jZShuYW1lKTsKLQkJCWlmIChyZWYgIT0gbnVsbCkKLQkJCQlyZXR1cm4gKElQcm94eVNlcnZpY2UpIGJ1bmRsZS5nZXRCdW5kbGVDb250ZXh0KCkKLQkJCQkJCS5nZXRTZXJ2aWNlKHJlZik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGxpbmsgYXR0cmlidXRlcyBmcm8gdGhlIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgYXR0cmlidXRlcyBpbiB0aGUgbGluawotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHRleHQgYWxsb3cgd2l0aCB0aGUgbGluawotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIExpbmtJbmZvCi0JICovCi0JcHVibGljIExpbmtJbmZvIHZhbGlkYXRlTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgYXR0cmlidXRlcywKLQkJCVN0cmluZyB0ZXh0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHRhZykgewotCQlMaW5rSW5mbyBpbmZvID0gc3VwZXIKLQkJCQkudmFsaWRhdGVMaW5rKG93bmVyLCBhdHRyaWJ1dGVzLCB0ZXh0LCBjb25maWcsIHRhZyk7Ci0KLQkJaWYgKHZhbGlkYXRlRXh0ZXJuYWxMaW5rcykgewotCi0JCQlTdHJpbmcgdXJsID0gaW5mby5nZXRVcmwoKTsKLQkJCWlmICgodXJsICE9IG51bGwpICYmIFJlc291cmNlSGVscGVyLmlzRXh0ZXJuYWxMaW5rKHVybCkKLQkJCQkJJiYgIXVybC5zdGFydHNXaXRoKCJmdHA6Ly8iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWlmICghdmFsaWRhdGVkRXh0ZXJuYWxMaW5rcy5jb250YWlucyh1cmwpKSB7Ci0JCQkJCVRpbWVyIHQgPSBuZXcgVGltZXIoKTsKLQkJCQkJSVByb3h5U2VydmljZSBwcm94eVNlcnZpY2UgPSBnZXRQcm94eVNlcnZpY2UoKTsKLQotCQkJCQlpZiAocHJveHlTZXJ2aWNlLmlzUHJveGllc0VuYWJsZWQoKSkgewotCQkJCQkJSVByb3h5RGF0YSBwcm94eSA9IG51bGw7Ci0JCQkJCQlib29sZWFuIGFjY2Vzc2libGUgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gdXNlUHJveHkgPSBmYWxzZTsKLQkJCQkJCVN0cmluZyBleGNlcHRpb25NZXNzYWdlID0gbnVsbDsKLQkJCQkJCVN0cmluZ1tdIHByb3h5VHlwZXMgPSB7IElQcm94eURhdGEuSFRUUF9QUk9YWV9UWVBFLAotCQkJCQkJCQlJUHJveHlEYXRhLkhUVFBTX1BST1hZX1RZUEUsCi0JCQkJCQkJCUlQcm94eURhdGEuU09DS1NfUFJPWFlfVFlQRSB9OwotCQkJCQkJZm9yIChTdHJpbmcgcHJveHlUeXBlIDogcHJveHlUeXBlcykgewotCQkJCQkJCS8vIGFjY2VzcyBleHRlcm5hbCBsaW5rIGJ5IHVzaW5nIGRpZmZlcmVudCBwcm94eXMKLQkJCQkJCQlwcm94eSA9IHByb3h5U2VydmljZS5nZXRQcm94eURhdGEocHJveHlUeXBlKTsKLQkJCQkJCQlpZiAoKHByb3h5LmdldEhvc3QoKT09bnVsbCl8fHByb3h5LmdldFBvcnQoKT09LTEpCi0JCQkJCQkJewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSHR0cFJlc3BvbnNlIHJlc3AgPSBIdHRwVXRpbC5kb0dldCh1cmwsIG51bGwsCi0JCQkJCQkJCQkJNjAwMCwgcHJveHkpOyAvLyB0aW1lb3V0Ci0JCQkJCQkJCXVzZVByb3h5ID0gdHJ1ZTsKLQkJCQkJCQkJYWNjZXNzaWJsZSA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAoZXhjZXB0aW9uTWVzc2FnZSA9PSBudWxsKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlleGNlcHRpb25NZXNzYWdlID0gcHJveHkuZ2V0SG9zdCgpICsgIjoiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBwcm94eS5nZXRQb3J0KCkgKyAiWyIgKyBwcm94eVR5cGUgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICJdOiIgKyBlLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJZXhjZXB0aW9uTWVzc2FnZSArPSAiOyIgKyBwcm94eS5nZXRIb3N0KCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHByb3h5LmdldFBvcnQoKSArICJbIgkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSsgcHJveHlUeXBlICsgIl06IiArIGUuZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodXNlUHJveHkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCFhY2Nlc3NpYmxlKSB7Ci0JCQkJCQkJCWlmIChleGNlcHRpb25NZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCQkJCWxvZ0ludmFsaWRFeHRlcm5hbExpbmsob3duZXIsIHVybCwKLQkJCQkJCQkJCQkJZXhjZXB0aW9uTWVzc2FnZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQkvLyBjb25uZWN0IGRpcmVjdGx5Ci0JCQkJCQl7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSHR0cFJlc3BvbnNlIHJlc3AgPSBIdHRwVXRpbC5kb0dldCh1cmwsIG51bGwsIDYwMDApOyAvLyB0aW1lb3V0Ci0JCQkJCQkJfSBjYXRjaCAoamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWxvZ0ludmFsaWRFeHRlcm5hbExpbmsob3duZXIsIHVybCwgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlIdHRwUmVzcG9uc2UgcmVzcCA9IEh0dHBVdGlsLmRvR2V0KHVybCwgbnVsbCwgNjAwMCk7IC8vIHRpbWVvdXQKLQkJCQkJCQkvLyBTeXN0ZW0ub3V0Ci0JCQkJCQkJLy8gLnByaW50bG4odGltZQotCQkJCQkJCS8vICsgIiBtaW5pLXNlY29uZHMgcXVlcnlpbmcgVXJsICciICsgdXJsICsgIicsCi0JCQkJCQkJLy8gcmV0dXJuCi0JCQkJCQkJLy8gc3RhdHVzPSIgKyByZXNwLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXQuc3RvcCgpOwotCQkJCQl0aW1lX2Zvcl9leHRlcm5hbF9saW5rX2NoZWNraW5nICs9IHQuZ2V0VGltZSgpOwotCi0JCQkJCS8vIGNhY2hlIGl0Ci0JCQkJCXZhbGlkYXRlZEV4dGVybmFsTGlua3MuYWRkKHVybCk7Ci0KLQkJCQkJLy8gZG8gd2UgbmVlZCB0byBsb2cgdGhlIGluZm8gc28gdGhhdCB1c2VyIGtub3cgd2hhdAotCQkJCQkvLyBleHRlcm5hbAotCQkJCQkvLyB1cmxzIGFyZSByZWZlcmVuY2VkIGluIHRoZSBjb250ZW50PwotCQkJCQlsb2dJbmZvKG93bmVyLCBOTFMuYmluZCgKLQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLmV4dGVybmFsVXJsX21zZywgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCW5ldyBJbnRlZ2VyKHQuZ2V0VGltZSgpKSwgdXJsIH0pKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBsb2cgbWlzc2luZyByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgdGhlIG1pc3NpbmcgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlzdXBlci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCByZWZFbGVtZW50KTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuYWRkKG5ldyBNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCByZWZFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIG1pc3NpbmcgcmVmZXJlbmNlCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNPGV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGd1aWQgb2YgdGhlIG1pc3NpbmcgZWxlbWVudAotCSAqIEBwYXJhbSBsaW5rZWRUZXh0Ci0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGd1aWQsCi0JCQlTdHJpbmcgbGlua2VkVGV4dCkgewotCQlzdXBlci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCBndWlkLCBsaW5rZWRUZXh0KTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuYWRkKG5ldyBNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCBndWlkLCBsaW5rZWRUZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIG1pc3NpbmcgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlc291cmNlRmlsZQotCSAqICAgICAgICAgICAgRmlsZQotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCVN0cmluZyB1cmwpIHsKLQkJc3VwZXIubG9nTWlzc2luZ1Jlc291cmNlKG93bmVyLCByZXNvdXJjZUZpbGUsIHVybCk7Ci0JCW1pc3NpbmdSZXNvdXJjZXMuYWRkKG5ldyBNaXNzaW5nUmVzb3VyY2Uob3duZXIsIHJlc291cmNlRmlsZSwgdXJsKSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIGludmFsaWQgZXh0ZXJuYWwgbGluawotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlci5sb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG1lc3NhZ2UpOwotCQlpbnZhbGlkRXh0ZXJuYWxMaW5rcy5hZGQobmV3IEludmFsaWRFeHRlcm5hbExpbmtJbmZvKG93bmVyLCB1cmwsCi0JCQkJbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIGdldCByZXBvcnQgYWJvdXQgdGhlIGNvbnRlbnQgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRSZXBvcnQoKSB7Ci0JCVhtbEVsZW1lbnQgcmVwb3J0WG1sID0gbmV3IFhtbEVsZW1lbnQoInZhbGlkYXRvckluZm8iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpbnZhbGlkRXh0ZXJuYWxMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gdGltZV9mb3JfZXh0ZXJuYWxfbGlua19jaGVja2luZyAvIDEwMDAKLQkJCQkJKyAiIHNlY29uZHMgdmFsaWRhdGluZyBleHRlcm5hbCBsaW5rcyI7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJbG9nSW5mbyhtc2cpOwotCi0JCQlYbWxFbGVtZW50IGludmFsaWRFeHRlcm5hbExpbmtzWG1sID0gcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgiaW52YWxpZEV4dGVybmFsTGlua3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IGludmFsaWRFeHRlcm5hbExpbmtzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJbnZhbGlkRXh0ZXJuYWxMaW5rSW5mbyBpbmZvID0gKEludmFsaWRFeHRlcm5hbExpbmtJbmZvKSBpdAotCQkJCQkJLm5leHQoKTsKLQkJCQlpbnZhbGlkRXh0ZXJuYWxMaW5rc1htbAotCQkJCQkJLm5ld0NoaWxkKCJlbnRyeSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIGluZm8udXJsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkib3duZXIiLCAoaW5mby5vd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLm93bmVyKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgaW5mby5tZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKG1pc3NpbmdSZWZlcmVuY2VzLnNpemUoKSA+IDApIHsKLQkJCVhtbEVsZW1lbnQgaW52YWxpZFJlZmVyZW5jZXNYbWwgPSByZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJpbnZhbGlkUmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlYbWxFbGVtZW50IG1pc3NpbmdSZWZlcmVuY2VzWG1sID0gcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgibWlzc2luZ1JlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IG1pc3NpbmdSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNaXNzaW5nUmVmZXJlbmNlIGluZm8gPSAoTWlzc2luZ1JlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJCWlmIChpbmZvLnJlZkVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlpbnZhbGlkUmVmZXJlbmNlc1htbAotCQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgiZWxlbWVudCIsIGluZm8ubGlua2VkVGV4dCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBpbmZvLmd1aWQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkJIm93bmVyIiwgKGluZm8ub3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5vd25lcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGVsc2UgewotCQkJCQltaXNzaW5nUmVmZXJlbmNlc1htbAotCQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJlbGVtZW50IiwgKGluZm8ucmVmRWxlbWVudCA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLnJlZkVsZW1lbnQpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKCJndWlkIiwgaW5mby5yZWZFbGVtZW50LmdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCQkib3duZXIiLCAoaW5mby5vd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLm93bmVyKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtaXNzaW5nUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLQkJCVhtbEVsZW1lbnQgbWlzc2luZ1Jlc291cmNlc1htbCA9IHJlcG9ydFhtbAotCQkJCQkubmV3Q2hpbGQoIm1pc3NpbmdSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IG1pc3NpbmdSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1pc3NpbmdSZXNvdXJjZSBpbmZvID0gKE1pc3NpbmdSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCW1pc3NpbmdSZXNvdXJjZXNYbWwKLQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBpbmZvLnVybCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJInJlc291cmNlIiwgKGluZm8ucmVzb3VyY2VGaWxlID09IG51bGwpID8gIiIgOiBpbmZvLnJlc291cmNlRmlsZS5nZXRQYXRoKCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJIm93bmVyIiwgKGluZm8ub3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5vd25lcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJfQotCQl9Ci0KLQkJbG9uZyBwdWJsaXNoaW5nX3RpbWUgPSAoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSAtIHB1Ymxpc2hpbmdfc3RhcnQpIC8gMTAwMDsKLQkJaW50IG1pbnV0ZXMgPSAoaW50KSBwdWJsaXNoaW5nX3RpbWUgLyA2MDsKLQkJaW50IHNlY29uZHMgPSAoaW50KSBwdWJsaXNoaW5nX3RpbWUgLSBtaW51dGVzICogNjA7Ci0KLQkJbG9nSW5mbygiUHVibGlzaGluZyB0aW1lOiAiICsgbWludXRlcyArICIgbWludXRlcyAiICsgc2Vjb25kcyArICIgc2Vjb25kcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCXJldHVybiByZXBvcnRYbWw7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgY2F0ZWdvcnkgdGhhdCBzaG91bGQgYmUgcHVibGlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBDb250ZW50Q2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZENhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBlKSB7Ci0JCWlmICghdmFsaWRDYXRlZ29yaWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQl2YWxpZENhdGVnb3JpZXMuYWRkKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgZGlzY2FyZGVkIG9yIG5vdCBkaXNjYXJkZWQgZWxlbWVudHMgd2lsbCBiZQotCSAqIHRyZWF0ZWQgYXMgb3V0IHNpZGUgdGhlIGNvbmZpZ3Vyc2F0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBvd25lciBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBPYmplY3QgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NhcmRlZChNZXRob2RFbGVtZW50IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZGlzY2FyZGVkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSBDb250ZW50Q2F0ZWdvcnkgYW5kIGlzIG5vdCBkaXNjYXJkZWQKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCWlmICh2YWxpZENhdGVnb3JpZXMuY29udGFpbnMoZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIG90aGVyd2lzZSwgY2hlY2sgaWYgaXQgc2hvdWxkIGJlIGRpc2NhcmRlZCBvciBub3QKLQkJCS8vIFRPRE8KLQkJCS8vIGZvciBub3csIGRpc2NhcmQgYWxsIHJlZmVyZW5jZWQgY29udGVudCBjYXRlZ29yaWVzIGlmIHRoZXkgYXJlCi0JCQkvLyBub3QgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hpbmcgdmlldy4KLQkJCS8vIE5PISEhISEhISEhISEhIFRoaXMgd2lsbCBsZWFkIHRvIGEgbG90IG9mIGJyb2tlbiBsaW5rcyBhbmQKLQkJCS8vIG1pc3NpbmcgZWxlbWVudAotCQkJLy8gVE9PIHN0cm9uZyBsaW1pdGF0aW9uLiBMZXQgb3BlbiBpdCBmb3Igbm93Ci0JCQkvLyBQdWJsaXNoaW5nOk92ZXJ2aWV3IHBhZ2UgaW4gcHVibGlzaGVkIHdlYnNpdGUKLQkJCS8vIGhhdmUgYnJva2VuIGxpbmtzIHRvIEJNCi0JCQkvLyByZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgcmVmZXJlbmNlZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZG9uJ3QgYWRkIGRpc2NhcmRlZCBlbGVtZW50cwotCQlpZiAoaXNEaXNjYXJkZWQob3duZXIsIG51bGwsIGUpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiRWxlbWVudCBpcyBkaXNjYXJkZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRMb2NhbGl6ZVR5cGVOYW1lKGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGUgIT0gbnVsbCAmJiAhcmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpCi0JCQkJJiYgIXB1Ymxpc2hlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudHMuYWRkKGUpOwotCQkJbG9nUmVmZXJlbmNlKG93bmVyLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvZyBhIHJlZmVybmVjZQotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIi0tLSBSZWZlcmVuZWNlIEVsZW1lbnQgQWRkZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRMb2NhbGl6ZVR5cGVOYW1lKGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIGVsZW1lbnQgZnJvbSByZWZlcmVuY2VkIGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAocmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudHMucmVtb3ZlKGUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIi0tLSBSZWZlcmVuY2UgRWxlbWVudCBSZW1vdmVkOiAiICsgTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCBhbGwgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VkRWxlbWVudHMoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogYWV0IHRoZSBkaXNjYXJkZWQgZWxlbWVudCBmb3IgdGhpcyBwdWJsaWNhdGlvbi4gSWYgYW4gZWxlbWVudCBpcwotCSAqIGRpc2NhcmRlZCwgaXQgc2hvdWxkIG5vdCBiZSBwdWJsaXNoZWQgYW5kIGxpbmsgdG8gaXQgc2hvdWxkIGJlIGxpbmsgdG8KLQkgKiBtaXNpbmcgZWxlbWVudCBwYWdlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCi0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghZGlzY2FyZGVkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCWRpc2NhcmRlZEVsZW1lbnRzLmFkZChlKTsKLQkJfQotCi0JCS8vIGlmIHRoIGZkaXNjYXJkZWQgZWxlbWVudCBpcyBpbiB0aGUgcmVmZXJlbmNlIGxpc3QsIHJlbW92ZSBpdCBhcyB3ZWxsCi0JCXJlbW92ZVJlZmVyZW5jZWRFbGVtZW50KGUpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIGFuIGVsZW5tZW50IGlzIHJlZmVyZW5jZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIChlICE9IG51bGwpICYmIHJlZmVyZW5jZWRFbGVtZW50cy5jb250YWlucyhlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cwotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1Ymxpc2hlZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gcHVibGlzaGVkRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBkZWZhdWx0IHRhcmdldCBmb3IgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RWxlbWVudChNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQl0aGlzLmRlZmF1bHRUYXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlcmUgaXMgYSBjbG9zdXJlIG9yIG5vdAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Nsb3N1cmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGNsb3N1cmUgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5DbG9zdXJlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgZWxlbWVudHMgdG8gY2xvc3VyZQotCSAqIAotCSAqIEBwYXJhbSBpdGVtcwotCSAqICAgICAgICAgICAgTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsb3N1cmVFbGVtZW50cyhMaXN0IGl0ZW1zKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBtYWtlIGEgY2xvc3VyZQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VFbGVtZW50Q2xvc3VyZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3dCcm9rZW5MaW5rcygpIHsKLQkJcmV0dXJuICFvcHRpb25zLmlzQ29udmVydEJyb2tlbkxpbmtzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmbGFnIG9uIHdoZXRoZXIgdG8gc2hvdyBleHRyYSBkZXNjcmlwdG9yIGluZm8uIElmIHRydWUsCi0JICogaW5mb3JtYXRpb24gZnJvbSBsaW5rZWQgZWxlbWVudCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkZXNjcmlwdG9yIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gb3B0aW9ucy5pc1Nob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycygpOwotCX0KLQotCS8qKgotCSAqIHNob3cgZGVzY3JpcHRvcnMgb24gbWV0aG9kIGVsZW1lbnQgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBvcHRpb25zLnNob3dSZWxhdGVkRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB0YWIgaWQgZm9yIHRoZSBhY3Rpdml0eSBsYXlvdXQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCkgewotCQlyZXR1cm4gb3B0aW9ucy5nZXREZWZhdWx0QWN0aXZpdHlUYWIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwZmNjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogUmVhbGl6ZXIgZm9yIHB1Ymxpc2hpbmcuCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciBleHRlbmRzIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIgewotCi0JUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHZhbGlkYXRvciBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcgotCSAqLwotCXByb3RlY3RlZCBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgbmV3UHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gKFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIpIGNyZWF0ZUVsZW1lbnRSZWFsaXplckV4dGVuc2lvbihjb25maWcsIFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXJfVHlwZSk7Ci0JCWlmIChyZWFsaXplciA9PSBudWxsKSB7Ci0JCQlyZWFsaXplciA9IG5ldyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKGNvbmZpZywgbnVsbCk7Ci0JCX0KLQkJcmVhbGl6ZXIudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQkKLQkJcmV0dXJuIHJlYWxpemVyOwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQllbGVtZW50ID0gc3VwZXIucmVhbGl6ZShlbGVtZW50KTsKLQkJCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vIFB1Ymxpc2hpbmcgc2hvdWxkIG5vdCBnZW5lcmF0ZSBsaW5rcyB0byB1bnB1Ymxpc2hlZCBjYXRlZ29yaWVzCi0JCWlmICggdmFsaWRhdG9yLmlzRGlzY2FyZGVkKG51bGwsIG51bGwsIGVsZW1lbnQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBsaXN0IG9mIGZlYXR1cmUgdmFsdWVzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdmFsdWVzCi0JICogVGhlIG5ldyBtaWdodCBiZSBhIHJlLXNvcnRpbmcgb2YgdGhlIG9yaWdpbmFsIGxpc3QgCi0JICogb3Igc29tZSBvZiB0aGUgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQsIGRlcGVuZGluZyBvbiB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9uCi0JICogTm90ZTogdGhlIGxpc3QgdmFsdWUgcGFzc2VkIGluIG1pZ2h0IGJlIHVwZGF0ZWQgYXMgd2VsbC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcyBMaXN0Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgcmVhbGl6ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKQotCXsKLQkJaWYgKCB2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCQotCQlMaXN0IGl0ZW1zID0gc3VwZXIucmVhbGl6ZShlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQlpZiAoIHZhbGlkYXRvci5oYXNDbG9zdXJlKCkgKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoIGkgPCBpdGVtcy5zaXplKCkgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbXMuZ2V0KGkpOwotCQkJCWlmICggdmFsaWRhdG9yLmlzRGlzY2FyZGVkKG51bGwsIGZlYXR1cmUsIGUpICkgewotCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdSdW5uYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdSdW5uYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjBlNzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nUnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5UaW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBydW5uYWJsZSBjbGFzcyB0byBtb25pdG9yIHRoZSBodG1sIGdlbmVyYXRpb24KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQlpbnQgdGltZW91dF9saW1pdCA9IDYwMDAwMDsgCi0JLy9QdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7IAotCUh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyOwotCVN0cmluZyBodG1sX2ZpbGU7Ci0JSUVsZW1lbnRMYXlvdXQgbGF5b3V0OwotCQotCXB1YmxpYyBQdWJsaXNoaW5nUnVubmFibGUoSHRtbEJ1aWxkZXIgaHRtbEJ1aWxkZXIsIGludCB0aW1lb3V0KSB7Ci0JCXRoaXMudGltZW91dF9saW1pdCA9IHRpbWVvdXQ7Ci0JCXRoaXMuaHRtbEJ1aWxkZXIgPSBodG1sQnVpbGRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiAoUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IpaHRtbEJ1aWxkZXIuZ2V0VmFsaWRhdG9yKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCBodG1sQnVpbGRlciAhPSBudWxsICYmIHRoaXMubGF5b3V0ICE9IG51bGwgKSB7Ci0JCQl0aGlzLmh0bWxfZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmh0bWxfZmlsZSA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVIdG1sKElFbGVtZW50TGF5b3V0IGxheW91dCkgewotCQkKLQkJdGhpcy5sYXlvdXQgPSBsYXlvdXQ7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IHRoaXMubGF5b3V0LmdldEVsZW1lbnQoKTsKLQkJCi0JCVRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgdGhlIHRhcmdldCBlbGVtZW50IGZvciB0aHJlIGNvbnRlbnQgdmFsaWRhdG9yCi0JCQlnZXRWYWxpZGF0b3IoKS5zZXRUYXJnZXRFbGVtZW50KGVsZW1lbnQpOwotCi0JCQkvLyBydW4gdGhlIHB1Ymxpc2hpbmcgYW5kIGNoZWNrIHRoZSB0aW1lLCBpZiB0aW1lb3V0LCB0ZXJtaW5hdGUgaXQKLQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZCh0aGlzKTsKLQkJCXQuc3RhcnQoKTsKLQkJCXQuam9pbih0aW1lb3V0X2xpbWl0KTsKLQkJCWlmICh0LmlzQWxpdmUoKSkgewotCQkJCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZGllIGFuZCBsb2cgYW4gZXJyb3IKLQkJCQl0aW1lci5zdG9wKCk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCS5sb2dJbmZvKAotCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkicHVibGlzaGluZyBlbGVtZW50IHRha2VzICIgKyB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBhbHJlYWR5IGFuZCBpcyBzdGlsbCBub3QgZG9uZSB5ZXQgLi4uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXRpbWVyLnN0YXJ0KCk7Ci0JCQkJdC5qb2luKCk7CQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFZhbGlkYXRvcigpLnNldFRhcmdldEVsZW1lbnQobnVsbCk7Ci0JCQlnZXRWYWxpZGF0b3IoKS5nZXRSZWZlcmVuY2VkRWxlbWVudHMoKS5yZW1vdmUoZWxlbWVudCk7Ci0KLQkJCXRpbWVyLnN0b3AoKTsKLQkJCWdldFZhbGlkYXRvcigpLmxvZ0luZm8oZWxlbWVudCwKLQkJCQkJdGltZXIuZ2V0VG90YWxUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBwdWJsaXNoaW5nIGVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gdGhpcy5odG1sX2ZpbGU7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMubGF5b3V0ID0gbnVsbDsKLQkJdGhpcy5odG1sX2ZpbGUgPSBudWxsOwotCQl0aGlzLmh0bWxCdWlsZGVyID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVjMGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgUHVibGlzaGluZyBTZXJ2aWNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYwNjkxNzUxODg1OTg2MTM1MTNMOwotCi0JLyoqCi0JICogVGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVGhyb3dhYmxlIHJvb3RDYXVzZTsKLQkKLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtCXJvb3RDYXVzZQlUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXRoaXMocm9vdENhdXNlLCByb290Q2F1c2UuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0JZXJyb3JNc2cJVGhlIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0Jcm9vdENhdXNlCVRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogQHBhcmFtCWVycm9yTXNnCVRoZSBlcnJvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCQl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLQkJdGhpcy5lcnJvck1zZyA9IGVycm9yTXNnOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybglUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkgewotCQlyZXR1cm4gcm9vdENhdXNlOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvQW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjY1OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0FuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLXB1YmxpYyBjbGFzcyBBbmNob3IKLXsKLSAgIHByaXZhdGUgU3RyaW5nIHRleHQ9bnVsbDsKLSAgIHByaXZhdGUgU3RyaW5nIGFuY2hvcj1udWxsOwotCi0gICBBbmNob3IoU3RyaW5nIHRleHQsIFN0cmluZyBhbmNob3IpCi0gICB7Ci0gICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgdGhpcy5hbmNob3IgPSBhbmNob3I7Ci0gICB9Ci0KLSAgIFN0cmluZyBnZXRBbmNob3IoKQotICAgewotICAgICAgcmV0dXJuIGFuY2hvcjsKLSAgIH0KLQotICAgU3RyaW5nIGdldFRleHQoKQotICAgewotICAgICAgcmV0dXJuIHRleHQ7Ci0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y0MjNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotCi1wdWJsaWMgY2xhc3MgRGVmCi17Ci0KLSAgICAvLyBBcmd1bWVudCBwYXJhbWV0ZXIKLSAgICBzdGF0aWMgU3RyaW5nIEFyZ3VtZW50UHJlZml4ID0gIi0iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBQcmludFRlbXBGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInRmIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUmVzcG9uc2VGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDaGFyYWN0ZXJTZXRBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAiYyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhbmd1YWdlRmlsZUFyZyA9IERlZi5Bcmd1bWVudFByZWZpeCArICJsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVHJpbUFyZyA9IERlZi5Bcmd1bWVudFByZWZpeCArICJ0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVG9wRGlyQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBSZXN1bHRGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInJmIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2hvd1VzYWdlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImYiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBQcmludERlYnVnQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImRlYnVnIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vS2V5d29yZGluZGV4ZXJQYXJhbQotICAgIHN0YXRpYyBTdHJpbmcgSW5kZXhUaXRsZSA9ICJtYWludGl0bGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWVBbHNvID0gInNlZWFsc28iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWUgPSAic2VlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVsaW1ldGVycyA9ICJkZWxpbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyU2V0ID0gImNoYXJhY3RlcnNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEtleVdvcmRQcmVmaXggPSAicHJlZml4IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgS2V5V29yZExldmVsU2VwYXJhdG9yID0gImxldmVsc2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEtleVdvcmRQcmVmaXggPSAiWEVfIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEtleVdvcmRMZXZlbFNlcGFyYXRvciA9ICJfXyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExlYXZlRGlyID0gImxlYXZlRGlyIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3RhcnREaXIgPSAic3RhcnREaXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBLZXlXb3JkRmlsZSA9ICJrZXl3b3JkZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1haW5SZXN1bHRGaWxlID0gIm1haW5yZXN1bHRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW5kZXhSZXN1bHRGaWxlID0gImluZGV4cmVzdWx0ZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEluZGV4SGVpZ2h0ID0gImluZGV4aGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgS2V5V29yZFJlc3VsdEZpbGUgPSAia2V5d29yZHJlc3VsdGZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBLZXlXb3JkVGFyZ2V0ID0gImtleXdvcmR0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJbmRleFRhcmdldCA9ICJpbmRleHRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE11bHRpRG9jS2V5V29yZCA9ICJtdWxpdGRvY3VtZW50a2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNob3dEb2NUaXRsZSA9ICJzaG93ZG9jdW1lbnR0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBTdHJpbmcgSGVhZGVyRmlsZSA9ICJoZWFkZXJmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRm9vdGVyRmlsZSA9ICJmb290ZXJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9TaXRtYXAgcGFyYW1ldGVyCi0gICAgc3RhdGljIFN0cmluZyBUcnVuY2F0ZUxhYmVsID0gInRydW5jYXRlbGFiZWwiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDb252ZXJ0QW1wZXJzYW5kID0gImNvbnZlcnRhbXBlcnNhbmQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUYWJsZVdpZHRoID0gInRhYmxld2lkdGgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIGludCBEZWZhdWx0Um93U3BhbiA9IDE7Ci0gICAgc3RhdGljIGludCBEZWZhdWx0Q29sU3BhbiA9IDE7Ci0gICAgc3RhdGljIFN0cmluZyBNb2RlID0gIm1vZGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBOb2RlU3RhcnQgPSAiPC0tIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTm9kZUVuZCA9ICItLT4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBOb2RlVGV4dCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE5vZGVMZXZlbCA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIENvbHVtbldpZHRoID0gImNvbHdpZHRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQ29sdW1uID0gImNvbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFJvdyA9ICJyb3ciOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDb2xTcGFuID0gImNvbHNwYW4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBSb3dTcGFuID0gInJvd3NwYW4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDZWxsQ29sb3IgPSAiY2VsbGNvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGlua3MgPSAibGlua3MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBWaXNpdE9uY2UgPSAidmlzaXRvbmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgT25seVRoaXMgPSAib25seXRoaXMiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUaXRsZUxlbmd0aCA9ICJ0aXRsZWxlbmd0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRUaXRsZUxlbmd0aCA9ICJkZWZhdWx0dGl0bGVsZW5ndGgiOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgU3RyaW5nIFJlbW92ZURhdEZpbGUgPSAicmVtb3ZlZGF0ZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFN5bm9ueW1GaWxlID0gInN5bm9ueW1maWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3ViVHJlZSA9ICJpbmNsdWRlc3VidHJlZSI7IC8vJE5PTi1OTFMtMSQKLSAvLyAgIHN0YXRpYyBTdHJpbmcgRGF0VG9wID0gImRhdGF0b3AiOwotICAgIHN0YXRpYyBTdHJpbmcgUmVzRmlsZSA9ICJyZXN1bHRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUmVsUGF0aCA9ICJyZWxhdGl2ZXBhdGgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBNYXhMZXZlbHMgPSAibWF4bGV2ZWxzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGV2ZWxTdHlsZSA9ICJsZXZlbHN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFN0eWxlID0gImRlZmF1bHRzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEhlYWRMaW5lU3R5bGUgPSAiaGVhZGxpbmVzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExldmVsRm9udCA9ICJsZXZlbGZvbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0Rm9udCA9ICJkZWZhdWx0Zm9udCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEhlYWRMaW5lRm9udCA9ICJoZWFkbGluZWZvbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBCb2xkID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJdGFsaWMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUGxhaW4gPSAicGxhaW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgU3RyaW5nIE1heE9wZW5Ob2Rlc1BhcmFtID0gIm1heHZpc2libGVub2RlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgaW50IERlZmF1bHRNYXhPcGVuTm9kZXMgPSAxMDA7Ci0gICAgc3RhdGljIFN0cmluZyBHYXJiYWdlQ29sbGVjdG9yUGFyYW0gPSAiZ2MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0R2FyYmFnZUNvbGxlY3RvciA9ICIxMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFZlcnRpY2FsSW5jcmVtZW50UGFyYW0gPSAidmVydGljYWxpbmNyZW1lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBIb3Jpem9udGFsSW5jcmVtZW50UGFyYW0gPSAiaG9yaXpvbnRhbGluY3JlbWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1haWx0byA9ICJtYWlsdG86IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVidWdQYXJhbSA9ICJkZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFdXV1Jvb3RQYXJhbSA9ICJ3d3dyb290IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW1hZ2VEaXIgPSAiaW1hZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW1hZ2VJY29uUGFyYW0gPSAiZnJhbWVpbWFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEJnSW1hZ2VQYXJhbSA9ICJiZ2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVmlzaXRPbmNlTWFya0FsbFBhcmFtID0idmlzaXRvbmNlbWFya2FsbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNoYWRvd1BhcmFtID0ibW91c2VvdmVyc2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIFN0cmluZyBMb2FkaW5nVHJlZVBhcmFtID0gImxvYWRpbmdsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExvYWRpbmdUcmVlQnJvd3NlciA9ICJUcmVlQnJvd3NlciBpcyBsb2FkaW5nOjoiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMb2FkaW5nVHJlZSA9ICJMb2FkaW5nIHRyZWUuIFBsZWFzZSB3YWl0Li4uIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTG9hZGluZ1N1YlRyZWUgPSAiTG9hZGluZyBzdWIgdHJlZS4gUGxlYXNlIHdhaXQuLi4iOyAvLyROT04tTkxTLTEkCi0KLQotICAgIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyc2V0UGFyYW0gPSAiY2hhcmFjdGVyc2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVsaW1QYXJhbSA9ICJkZWxpbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTE9BRF9QQUdFID0gImxvYWRwYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRklOSVNIX1BBR0UgPSAiZmluaXNocGFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERhdGFGaWxlUGFyYW0gPSAiZGF0YWZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEYXRhRmlsZSA9ICJ0cmVlLmRhdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE5vbmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSHR0cCA9ICJodHRwOi8vIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSHR0cHMgPSAiaHR0cHM6Ly8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGdHAgPSAiZnRwOi8vIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRmlsZSA9ICJmaWxlOi8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTbGFzaCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3BhY2UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFppcEZpbGUgPSAiLnppcCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvL0NvbG9yIHBhcmFtZXRlcnMKLSAgICBzdGF0aWMgU3RyaW5nIEJnQ29sb3JQYXJhbSA9ICJiZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQmdDb2xvciA9ICIyNTUsMjU1LDI1NSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZnQ29sb3JQYXJhbSA9ICJmZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRmdDb2xvciA9ICIwLDAsMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNlbEJnQ29sb3JQYXJhbSA9ICJzZWxiZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2VsQmdDb2xvciA9ICIwLDAsMjU1IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2VsRmdDb2xvclBhcmFtID0gInNlbGZnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWxGZ0NvbG9yID0gIjI1NSwyNTUsMjU1IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVmlzaXRDb2xvclBhcmFtID0gInZpc2l0Y29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBWaXNpdENvbG9yID0gIjI1NSw1MSw1MSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1vdXNlT3ZlckNvbG9yUGFyYW0gPSAibW91c2VvdmVyY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBNb3VzZU92ZXJDb2xvciA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCi0KLSAgICAvL0ZyYW1lIHBhcmFtZXRlcnMKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsUG9zUGFyYW0gPSAibGFiZWxwb3MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMYWJlbFBvcyA9ICJiZWxvdyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lVGl0bGVQYXJhbSA9ICJmcmFtZXRpdGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRnJhbWVUaXRsZSA9ICJUcmVlIEJyb3dzZXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGcmFtZVdpZHRoUGFyYW0gPSAiZnJhbWV3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lSGVpZ2h0UGFyYW0gPSAiZnJhbWVoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGcmFtZVdpZHRoID0gIjI1MCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lSGVpZ2h0ID0gIjQwMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lUGFyYW0gPSAiZnJhbWUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0RnJhbWUgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGYWxzZSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFRydWUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBTdHJpbmcgTGFiZWxQYXJhbSA9ICJmcmFtZWxhYmVsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdExhYmVsID0gIlRyZWUgQnJvd3NlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsQmdDb2xvclBhcmFtPSAiZnJhbWVsYWJlbGJnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0TGFiZWxCZ0NvbG9yPSAiMjU1LDI1NSwyNTUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBCb3JkZXJQYXJhbSA9ICJib3JkZXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0Qm9yZGVyID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9UcmVlIGNvbnN0YW50cwotICAgIHN0YXRpYyBTdHJpbmcgQ2VsbFNpemVQYXJhbSA9ICJjZWxsc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRDZWxsU2l6ZSA9ICIxNiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgaW50IEltYWdlSW5zZXQgPSAzOwotICAgIHN0YXRpYyBpbnQgVGV4dEluc2V0ID0gNjsKLSAgICBzdGF0aWMgaW50IFRleHRCYXNlTGluZSA9IDM7Ci0gICAgc3RhdGljIGludCBEb3VibGVDbGlja1Jlc29sdXRpb24gPSAzMzM7Ci0gICAgc3RhdGljIGludCBTY3JvbGxXaWR0aCA9IDE2OwotICAgIHN0YXRpYyBTdHJpbmcgU2Nyb2xsQmFyTGVmdFBhcmFtID0gInNjcm9sbGJhcnRvbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0VGFyZ2V0UGFyYW0gPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFRhcmdldCA9ICJfdG9wIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVHJlZUZvbnRQYXJhbSA9ICJ0cmVlZm9udCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRUcmVlRm9udCA9ICJBcmlhbCxQTEFJTiwxMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsRm9udFBhcmFtID0gImZyYW1lbGFiZWxmb250IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdExhYmVsRm9udCA9ICJBcmlhbCxCT0xELDEyIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWZpbml0aW9uT2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvRGVmaW5pdGlvbk9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODc2ODRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWZpbml0aW9uT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLy9PYmplY3QgaG9sZGluZyBkZWZpbml0aW9uZmlsZSBpbmZvcm1hdGlvbgotcHVibGljIGNsYXNzIERlZmluaXRpb25PYmplY3QKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgaW5kZXh0aXRsZSA9ICJJbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBTdHJpbmcgc2VlID0gIiwgU2VlICI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBTdHJpbmcgc2VlYWxzbyAgPSAiLCBTZWUgYWxzbyAiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgU3RyaW5nIGNoYXJhY3RlcnNldCA9ICJ1dGYtOCI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGtleVdvcmRTZXBhcmF0b3IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGxldmVsU2VwYXJhdG9yUmVwbGFjZSA9ICI6IjsgLy8kTk9OLU5MUy0xJAotICBTdHJpbmcgd3d3Um9vdCA9IG51bGw7Ci0gIGludCBzdGlwTGVuZ3RoPTA7Ci0gIFN0cmluZyByZWxhdGl2ZXBhdGggPSBudWxsOwotICBTdHJpbmcgdGFyZ2V0PW51bGw7Ci0gIFN0cmluZyBzcGVjS2V5V29yZEZpbGU9bnVsbDsKLSAgU3RyaW5nIG1haW5SZXN1bHRGaWxlPW51bGw7Ci0gIFN0cmluZyBpbmRleFJlc3VsdEZpbGU9bnVsbDsKLSAgU3RyaW5nIGluZGV4VGFyZ2V0PW51bGw7Ci0gIFN0cmluZyBpbmRleEhlaWdodD1udWxsOwotICBTdHJpbmcga2V5d29yZFRhcmdldD1udWxsOwotICBTdHJpbmcga2V5d29yZFJlc3VsdEZpbGU9bnVsbDsKLSAgU3RyaW5nIGhlYWRlckZpbGU9bnVsbDsKLSAgU3RyaW5nIGZvb3RlckZpbGU9bnVsbDsKLSAgU3RyaW5nIGtleVdvcmRQcmVmaXg9RGVmLkRlZmF1bHRLZXlXb3JkUHJlZml4OwotICBTdHJpbmcga2V5V29yZExldmVsU2VwYXJhdG9yPURlZi5EZWZhdWx0S2V5V29yZExldmVsU2VwYXJhdG9yOwotCi0gIGJvb2xlYW4gbXVsdGlkb2N1bWVudGtleXdvcmQ9ZmFsc2U7Ci0gIGJvb2xlYW4gc2hvd2RvY3VtZW50dGl0bGU9ZmFsc2U7Ci0gIFZlY3RvciBzdG9wRGlyc1Y9bnVsbDsKLSAgIEhhc2h0YWJsZSBmb250RGVmaW5pdGlvbnM9bnVsbDsKLSAgSGFzaHRhYmxlIHN0eWxlRGVmaW5pdGlvbnM9bnVsbDsKLQotICBwcml2YXRlIEZpbGUgZGVmRmlsZVJvb3Q7Ci0KLSAgLy9Db25zdHJ1Y3RvciB0aGF0IHBhcnNlcyB0aGUgZGVmaW5pdGlvbmZpbGUKLSAgRGVmaW5pdGlvbk9iamVjdChTdHJpbmcgcHViRGlyLCBTdHJpbmcgZGVmZmlsZSwgU3RyaW5nIGNoYXJTZXQpCi0gIHsKLQkgIHNldHd3d1Jvb3QocHViRGlyKTsKLQkgIGRlZkZpbGVSb290ID0gbmV3IEZpbGUoZGVmZmlsZSkuZ2V0UGFyZW50RmlsZSgpOwotCi0gICAgIC8vIFJlYWQgdGhlIGRlZmluaXRpb24gZmlsZSBhbmQgc3BsaXQgdGhlIGRlZmZpbGUgaW50byBpdCdzIGluZGl2aWR1YWwgbGluZXMuCi0JU3RyaW5nIGluZmlsZSA9IE1pc2NTdGF0aWMubG9hZEZpbGUoZGVmZmlsZSxjaGFyU2V0KTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmZpbGUsICJcdFxuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICBzdG9wRGlyc1YgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvbnREZWZpbml0aW9ucyA9IG5ldyBIYXNodGFibGUoMTApOwotICAgICBzdHlsZURlZmluaXRpb25zID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0gICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmFtID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLQotICAgICAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5MZXZlbEZvbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgIGFzaWduRm9udChwYXJzZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuTGV2ZWxTdHlsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgYXNpZ25TdHlsZShwYXJzZXIpOwotICAgICAgICB9ICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICBpZih2YWx1ZT09bnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGVmaW5pdGlvbk9iamVjdDphZGRWYWx1ZVxuIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICBIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUgKyBwYXJhbSk7Ci0gICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGFzaWduVmFsdWUocGFyYW0sIHZhbHVlKTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgfQotCi0gIC8vQ2hlY2sgaWYgZW5vdWdoIGlucHV0IGlzIHJlYWQKLSAgYm9vbGVhbiBlbm91Z2hJbnB1dCgpCi0gIHsKLSAgICAgYm9vbGVhbiBlbm91Z2g9dHJ1ZTsKLSAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgIGlmKHd3d1Jvb3Q9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLldXV1Jvb3RQYXJhbSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGtleXdvcmRSZXN1bHRGaWxlPT1udWxsKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyArIERlZi5LZXlXb3JkUmVzdWx0RmlsZSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGluZGV4UmVzdWx0RmlsZSE9bnVsbCAmJiBtYWluUmVzdWx0RmlsZT09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkcgKyBEZWYuTWFpblJlc3VsdEZpbGUpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBpZihpbmRleFJlc3VsdEZpbGUhPW51bGwgJiYgaW5kZXhUYXJnZXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkluZGV4VGFyZ2V0KTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYoaW5kZXhSZXN1bHRGaWxlIT1udWxsICYmIGtleXdvcmRUYXJnZXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLktleVdvcmRUYXJnZXQpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBpZihpbmRleFJlc3VsdEZpbGUhPW51bGwgJiYgaW5kZXhIZWlnaHQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkluZGV4SGVpZ2h0KTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYocmVsYXRpdmVwYXRoPT1udWxsKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyArIERlZi5SZWxQYXRoKTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYoaGVhZGVyRmlsZT09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkcgKyBEZWYuSGVhZGVyRmlsZSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGZvb3RlckZpbGU9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkZvb3RlckZpbGUpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBGb250T2JqZWN0IGYgPSAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KERlZi5EZWZhdWx0Rm9udCk7Ci0gICAgIEZvbnRPYmplY3QgZnMgPSAoRm9udE9iamVjdClzdHlsZURlZmluaXRpb25zLmdldChEZWYuRGVmYXVsdFN0eWxlKTsKLSAgICAgaWYoZj09bnVsbCAmJiBmcz09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuRk9OVF9BTkRfU1RZTEVfTUlTU0lORyArIERlZi5EZWZhdWx0Rm9udCArICIgIiArIERlZi5EZWZhdWx0U3R5bGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotICAgICBpZighZW5vdWdoKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihidWZmKTsKLSAgICAgfQotICAgICByZXR1cm4gZW5vdWdoOwotICB9Ci0KLQotICAvL0FzaWducyB2YWx1ZXMgdG8gdGhlIGRpZmZlcmVudCBhdHRyaWJ1dGVzCi0gIHByaXZhdGUgdm9pZCBhc2lnblZhbHVlKFN0cmluZyBwYXJhbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5NYWluUmVzdWx0RmlsZSkpCi0gICAgewotICAgICAgIG1haW5SZXN1bHRGaWxlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuQ2hhcmFjdGVyU2V0KSkKLSAgICB7Ci0gICAgICAgY2hhcmFjdGVyc2V0ID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuU2VlKSkKLSAgICB7Ci0gICAgICAgc2VlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuU2VlQWxzbykpCi0gICAgewotICAgICAgIHNlZWFsc28gPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JbmRleFJlc3VsdEZpbGUpKQotICAgIHsKLSAgICAgICBpbmRleFJlc3VsdEZpbGUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkUmVzdWx0RmlsZSkpCi0gICAgewotICAgICAgIGtleXdvcmRSZXN1bHRGaWxlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZGVyRmlsZSkpCi0gICAgewotICAgICAgIGhlYWRlckZpbGUgPSBuZXcgRmlsZShkZWZGaWxlUm9vdCwgdmFsdWUpLmdldEFic29sdXRlUGF0aCgpOzsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5Gb290ZXJGaWxlKSkKLSAgICB7Ci0gICAgICAgZm9vdGVyRmlsZSA9IG5ldyBGaWxlKGRlZkZpbGVSb290LCB2YWx1ZSkuZ2V0QWJzb2x1dGVQYXRoKCk7OwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLlJlbFBhdGgpKQotICAgIHsKLSAgICAgICByZWxhdGl2ZXBhdGggPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5EZWZhdWx0VGFyZ2V0UGFyYW0pKQotICAgIHsKLSAgICAgICB0YXJnZXQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkRmlsZSkpCi0gICAgewotICAgICAgIHNwZWNLZXlXb3JkRmlsZSA9IG5ldyBGaWxlKGRlZkZpbGVSb290LCB2YWx1ZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuSW5kZXhUaXRsZSkpCi0gICAgewotICAgICAgIGluZGV4dGl0bGUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkVGFyZ2V0KSkKLSAgICB7Ci0gICAgICAga2V5d29yZFRhcmdldCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkluZGV4VGFyZ2V0KSkKLSAgICB7Ci0gICAgICAgaW5kZXhUYXJnZXQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JbmRleEhlaWdodCkpCi0gICAgewotICAgICAgIGluZGV4SGVpZ2h0ID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuTXVsdGlEb2NLZXlXb3JkKSkKLSAgICB7Ci0gICAgICAgbXVsdGlkb2N1bWVudGtleXdvcmQgPSB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKERlZi5UcnVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5TaG93RG9jVGl0bGUpKQotICAgIHsKLSAgICAgICBzaG93ZG9jdW1lbnR0aXRsZSA9IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLlRydWUpOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkxlYXZlRGlyKSkKLSAgICB7Ci0gICAgICAgc3RvcERpcnNWLmFkZEVsZW1lbnQodmFsdWUpOwotICAgIH0KLSAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuS2V5V29yZFByZWZpeCkpCi0gICAgewotICAgICAgIGtleVdvcmRQcmVmaXggPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkTGV2ZWxTZXBhcmF0b3IpKQotICAgIHsKLSAgICAgICBrZXlXb3JkTGV2ZWxTZXBhcmF0b3IgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQotICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihIZWxwTWVzc2FnZXMuSU5WQUxJRF9QQVJBTUVURVJfTkFNRSArIHBhcmFtKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8vUGFyc2VzIGEgZm9udGRlZmluaXRpb24KLSAgcHJpdmF0ZSB2b2lkIGFzaWduRm9udChTdHJpbmdUb2tlbml6ZXIgcGFyc2VyKQotICB7Ci0gICAgU3RyaW5nIHN0cmluZ0xldmVsID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICBPYmplY3Qga2V5ID0gc3RyaW5nTGV2ZWw7Ci0gICAgaWYoIXN0cmluZ0xldmVsLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkRlZmF1bHRGb250KSAmJiAhc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZExpbmVGb250KSkKLSAgICB7Ci0gICAgICAga2V5ID0gIG5ldyBJbnRlZ2VyKHN0cmluZ0xldmVsKTsKLSAgICB9Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgIFN0cmluZyBzdHlsZSA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgU3RyaW5nIHNpemUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotCi0gICAgZm9udERlZmluaXRpb25zLnB1dChrZXksbmV3IEZvbnRPYmplY3QobmFtZSwgc3R5bGUsIHNpemUpKTsKLSAgfQotCi0gIC8vUGFyc2VzIGEgc3R5bGVkZWZpbml0aW9uCi0gIHByaXZhdGUgdm9pZCBhc2lnblN0eWxlKFN0cmluZ1Rva2VuaXplciBwYXJzZXIpCi0gIHsKLSAgICBTdHJpbmcgc3RyaW5nTGV2ZWwgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgIE9iamVjdCBrZXkgPSBzdHJpbmdMZXZlbDsKLSAgICBpZighc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuRGVmYXVsdFN0eWxlKSAmJiAhc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZExpbmVTdHlsZSkpCi0gICAgewotICAgICAgIGtleSA9ICBuZXcgSW50ZWdlcihzdHJpbmdMZXZlbCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHN0eWxlID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICBzdHlsZURlZmluaXRpb25zLnB1dChrZXksbmV3IEZvbnRPYmplY3Qoc3R5bGUpKTsKLSAgfQotICAKLSAgLy9DaGVjayBpZiB0aGUgcmVhY2hlZCBkaXJlY3RvcnkgaXMgd2hpdGhpbiB0aGUgc3RvcGRpcmxpc3QKLSAgICBib29sZWFuIGlzSW5TdG9wZGlyKFN0cmluZyBzdHIpCi0gICB7Ci0gICAgICBmb3IoaW50IGk9MDtpPHN0b3BEaXJzVi5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICAgU3RyaW5nIHRtcFN0ciA9IChTdHJpbmcpIHN0b3BEaXJzVi5lbGVtZW50QXQoaSk7Ci0gICAgICAgICBpZihzdHIuc3Vic3RyaW5nKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpLmxlbmd0aCgpKzEpLmNvbXBhcmVUbyh0bXBTdHIpPT0wKQotICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvL0FjY2Vzc21ldGhvZHMKLSAgU3RyaW5nIGdldEluZGV4VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIGluZGV4dGl0bGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0U2VlKCkKLSAgewotICAgIHJldHVybiBzZWU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0U2VlQWxzbygpCi0gIHsKLSAgICByZXR1cm4gc2VlYWxzbzsKLSAgfQotCi0gIFN0cmluZyBnZXRDaGFyYWN0ZXJTZXQoKQotICB7Ci0gICAgcmV0dXJuIGNoYXJhY3RlcnNldDsKLSAgfQotICBib29sZWFuIGdldE11bGl0RG9jdW1lbnRLZXl3b3JkKCkKLSAgewotICAgIHJldHVybiBtdWx0aWRvY3VtZW50a2V5d29yZDsKLSAgfQotCi0gIGJvb2xlYW4gZ2V0U2hvd0RvY3VtZW50VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIHNob3dkb2N1bWVudHRpdGxlOwotICB9Ci0KLSAgU3RyaW5nIGdldEtleVdvcmRUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGtleXdvcmRUYXJnZXQ7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SW5kZXhUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGluZGV4VGFyZ2V0OwotICB9Ci0KLSAgU3RyaW5nIGdldEluZGV4SGVpZ2h0KCkKLSAgewotICAgIHJldHVybiBpbmRleEhlaWdodDsKLSAgfQotCi0gIFN0cmluZyBnZXRXd3dSb290KCkKLSAgewotICAgIHJldHVybiB3d3dSb290OwotICB9Ci0KLSAgaW50IGdldFd3d1Jvb3RMZW5ndGgoKQotICB7Ci0gICAgcmV0dXJuIHN0aXBMZW5ndGg7Ci0gIH0KLQotICBTdHJpbmcgZ2V0VGFyZ2V0KCkKLSAgewotICAgIHJldHVybiB0YXJnZXQ7Ci0gIH0KLQotICBTdHJpbmcgZ2V0S2V5V29yZEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIHNwZWNLZXlXb3JkRmlsZTsKLSAgfQotCi0gIFN0cmluZyBnZXRNYWluUmVzdWx0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gbWFpblJlc3VsdEZpbGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SW5kZXhSZXN1bHRGaWxlKCkKLSAgewotICAgIHJldHVybiBpbmRleFJlc3VsdEZpbGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0S2V5d29yZFJlc3VsdEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGtleXdvcmRSZXN1bHRGaWxlOwotICB9Ci0KLQotICBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkKLSAgewotICAgIHJldHVybiByZWxhdGl2ZXBhdGg7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SGVhZGVyRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGVyRmlsZTsKLSAgfQotCi0gICBTdHJpbmcgZ2V0Rm9vdGVyRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZm9vdGVyRmlsZTsKLSAgfQotCi0gU3RyaW5nIGdldEtleVdvcmRQcmVmaXgoKQotIHsKLSAgIHJldHVybiBrZXlXb3JkUHJlZml4OwotIH0KLQotIFN0cmluZyBnZXRLZXlXb3JkTGV2ZWxTZXBhcmF0b3IoKQotIHsKLSAgIHJldHVybiBrZXlXb3JkTGV2ZWxTZXBhcmF0b3I7Ci0gfQotCi0gRm9udE9iamVjdCBnZXRGb250KGludCBsZXZlbCkKLSAgewotICAgICBGb250T2JqZWN0IGYgPSAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KG5ldyBJbnRlZ2VyKGxldmVsKSk7Ci0gICAgIGlmKGY9PW51bGwpCi0gICAgIHsKLSAgICAgICAgZiA9IChGb250T2JqZWN0KWZvbnREZWZpbml0aW9ucy5nZXQoRGVmLkRlZmF1bHRGb250KTsKLSAgICAgfQotICAgICByZXR1cm4gZjsKLSAgfQotCi0gIEZvbnRPYmplY3QgZ2V0Rm9udChPYmplY3Qga2V5KQotICB7Ci0gICAgIHJldHVybiAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KGtleSk7Ci0KLSAgfQotCi0gIEZvbnRPYmplY3QgZ2V0U3R5bGVTaGVldChpbnQgbGV2ZWwpCi0gIHsKLSAgICAgRm9udE9iamVjdCBmID0gKEZvbnRPYmplY3Qpc3R5bGVEZWZpbml0aW9ucy5nZXQobmV3IEludGVnZXIobGV2ZWwpKTsKLSAgICAgaWYoZj09bnVsbCkKLSAgICAgewotICAgICAgICBmID0gKEZvbnRPYmplY3Qpc3R5bGVEZWZpbml0aW9ucy5nZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIGY7Ci0gIH0KLQotICBGb250T2JqZWN0IGdldFN0eWxlU2hlZXQoT2JqZWN0IGtleSkKLSAgewotICAgIHJldHVybiAoRm9udE9iamVjdClzdHlsZURlZmluaXRpb25zLmdldChrZXkpOwotICB9Ci0KLSAgdm9pZCBwcmludFN0YXJ0KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLGludCBsZXZlbCkKLSAgewotICAgIGlmKGdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk9PW51bGwpCi0gICAgewotICAgICAgRm9udE9iamVjdCBmID0gZ2V0Rm9udChsZXZlbCk7Ci0gICAgICBpZihmPT1udWxsKQotICAgICAgewotICAgICAgICBmID0gZ2V0Rm9udChEZWYuRGVmYXVsdEZvbnQpOwotICAgICAgfQotICAgICAgcHJpbnRTdGFydChvdXRQLCBmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRm9udE9iamVjdCBmID0gZ2V0U3R5bGVTaGVldChsZXZlbCk7Ci0gICAgICAgIGlmKGY9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgZiA9IGdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRTdGFydChvdXRQLCBmKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBwcmludFN0YXJ0KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLEZvbnRPYmplY3QgZikKLSAgewotCi0gICAgaWYob3V0UD09bnVsbCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmaW5pdGlvbk9iamVjdDpwcmludFN0YXJ0XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBpZihmIT1udWxsICYmIGYuZ2V0U3R5bGVTaGVldCgpPT1udWxsKQotICAgIHsKLSAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPEZPTlQgRkFDRT1cIiIgKyBmLmdldE5hbWUoKSArICJcIiBTSVpFPVwiIiArIGYuZ2V0U2l6ZSgpICsgIlwiID5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgaWYoZi5pc0l0YWxpYygpKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIjxJPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmKGYuaXNCb2xkKCkpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPEI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPFAgQ0xBU1M9XCIiICsgZi5nZXRTdHlsZVNoZWV0KCkgKyAiXCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9Ci0KLSAgdm9pZCBwcmludEVuZChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IGxldmVsKQotICB7Ci0KLSAgICBpZihvdXRQPT1udWxsKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZpbml0aW9uT2JqZWN0OnByaW50RW5kXG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYoZ2V0U3R5bGVTaGVldChEZWYuRGVmYXVsdFN0eWxlKT09bnVsbCkKLSAgICB7Ci0gICAgICBGb250T2JqZWN0IGYgPSBnZXRGb250KGxldmVsKTsKLSAgICAgIGlmKGY9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIGYgPSBnZXRGb250KERlZi5EZWZhdWx0Rm9udCk7Ci0gICAgICB9Ci0gICAgICBwcmludEVuZChvdXRQLCBmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJpbnRFbmQob3V0UCwgbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBwcmludEVuZChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgRm9udE9iamVjdCBmKQotICB7Ci0gICAgICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmluaXRpb25PYmplY3Q6cHJpbnRFbmRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZihmIT1udWxsICYmIGYuZ2V0U3R5bGVTaGVldCgpPT1udWxsKQotICAgIHsKLSAgICAgIGlmKGYuaXNCb2xkKCkpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPC9CPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmKGYuaXNJdGFsaWMoKSkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCI8L0k+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPC9GT05UPlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCI8L1A+XG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLwotICAvLwlSUFcgMi4wIEludGVncmF0aW9uIC0tIERvIG5vdCBtb2RpZnkgdGhpcyBjb2RlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0gIC8vCSAgLy8JQmVjYXVzZSBSUFcgY2FsbHMgdGhlc2UgYXBwbGljYXRpb25zIGZyb20gYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhhbiB0aGUgYmF0Y2ggZmlsZQotICAvLwlpdCBpcyBuZWNjZXNzYXJ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBpbiB0aGUgY29uZmlnIGZpbGUuCi0gIC8vCi0gIC8vCVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBzaW1wbHkgYWxsb3cgdGhlIHZhbHVlcyB0byBiZSBvdmVyLXJpZGRlbi4KLSAgLy8KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHB1YmxpYyB2b2lkIHNldHd3d1Jvb3QoU3RyaW5nIG5ld1Jvb3QpCi0gIHsKLSAgICAgIHRyeSB7Ci0JCUZpbGUgd3d3RGlyID0gbmV3IEZpbGUobmV3Um9vdCk7Ci0JCXd3d1Jvb3QgPSB3d3dEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpICsgIi8iOyAvLyROT04tTkxTLTEkCi0JCXd3d1Jvb3QgPSB3d3dSb290LnJlcGxhY2UoJ1xcJyAsICcvJyk7Ci0JCXN0aXBMZW5ndGggPSB3d3dSb290Lmxlbmd0aCgpLTE7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLSAgfQotCi0gIHZvaWQgc2V0UmVsYXRpdmVQYXRoKFN0cmluZyBuZXdQYXRoKQotICB7Ci0JcmVsYXRpdmVwYXRoID0gbmV3UGF0aDsKLSAgfQotICAKLSAgLyoqCi0gICAqIHNldCB0aGUgaW5kZXggdGl0bGUKLSAgICogCi0gICAqIEBwYXJhbSB0aXRsZSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluZGV4VGl0bGUoU3RyaW5nIHRpdGxlKQotICB7Ci0JICBpbmRleHRpdGxlID0gdGl0bGU7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Eb2N1bWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjgzZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1jbGFzcyBEb2N1bWVudAotewotICAgIC8vVGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudAotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlPW51bGw7Ci0KLSAgICAvL1RoZSB1cmwgdG8gdGhlIGRvY3VtZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsPW51bGw7Ci0gICAvLyBwcml2YXRlIEFuY2hvciBhbmNob3I9bnVsbDsKLQotICAgIC8vVGhlIHBhcmVudCBLZXlXb3JkCi0gICAgcHJpdmF0ZSBLZXlXb3JkIHBhcmVudE09bnVsbDsKLQotICAgIERvY3VtZW50KFN0cmluZyB0aXRsZSwgU3RyaW5nIHVybCkKLSAgICB7Ci0gICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgICAgIHRoaXMudXJsID0gIHVybC5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEtleVdvcmQoS2V5V29yZCBrZXkpCi0gICAgewotICAgICAgIHBhcmVudE0gPSBrZXk7Ci0gICAgfQotICAgIFN0cmluZyBnZXRUaXRsZSgpCi0gICAgewotICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0VXJsKCkKLSAgICB7Ci0gICAgCWludCBmaXJzdCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZihwYXJlbnRNIT1udWxsICYmIGZpcnN0IDwgMCkKLSAgICAgICAgewotICAgICAgICAgICByZXR1cm4gdXJsICs9IiMiICsgcGFyZW50TS5nZXRBbmNob3IoKTsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgfQotCi0JCWlmIChmaXJzdCA+IDAgJiYgdXJsLmluZGV4T2YoIiMiLCBmaXJzdCkgPiAwKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJldHVybiB1cmwuc3Vic3RyaW5nKDAsIGZpcnN0ICsgdXJsLmluZGV4T2YoIiMiLCBmaXJzdCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCkKLSAgICB7Ci0gICAgICAgIGlmKG91dFA9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50LnByaW50XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG90YWxVcmwgPSB1cmw7Ci0gICAgICAgIFN0cmluZyB0bXBUaXRsZT1udWxsOwotCi0gICAgICAgICAgIHRtcFRpdGxlICA9IHRpdGxlOwotICAgICAgICAgICBpZihwYXJlbnRNIT1udWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdG90YWxVcmwrPSIjIiArIHBhcmVudE0uZ2V0QW5jaG9yKCk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgIH0KLQotCi0gICAgICAgIGlmKHRtcFRpdGxlPT1udWxsIHx8IHRtcFRpdGxlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHRtcFRpdGxlID0gIjxGT05UIENPTE9SPVwiIzAwOTkzM1wiPkhlbHBNZXNzYWdlcy5USVRMRV9BTkNIT1JfTUlTU0lORzwvRk9OVD4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGFyZ2V0PW51bGw7Ci0gICAgICAgIGlmKCFLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFRhcmdldCgpLmVxdWFscygiICIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgdGFyZ2V0ID0gIiBUQVJHRVQ9XCIiICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRUYXJnZXQoKSArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotCi0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxBIEhSRUY9XCIiICsgdG90YWxVcmwgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZih0YXJnZXQhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCB0YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPiIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgdG1wVGl0bGUgKyAiPC9BPiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Gb250T2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvRm9udE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzMwNGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Gb250T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotCi0KLWNsYXNzIEZvbnRPYmplY3QKLXsKLSAgU3RyaW5nIG5hbWUgPSBudWxsOwotICBTdHJpbmcgc3R5bGUgPSBudWxsOwotICBTdHJpbmcgc2l6ZSA9IG51bGw7Ci0gIFN0cmluZyBzdHlsZVNoZWV0ID0gbnVsbDsKLQotICBGb250T2JqZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgc3R5bGUsIFN0cmluZyBzaXplKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgdGhpcy5zaXplID0gc2l6ZTsKLSAgfQotCi0gIEZvbnRPYmplY3QoU3RyaW5nIHN0eWxlU2hlZXQpCi0gIHsKLSAgICB0aGlzLnN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0OwotICB9Ci0KLSAgU3RyaW5nIGdldFN0eWxlU2hlZXQoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlU2hlZXQ7Ci0gIH0KLQotICBib29sZWFuIGlzQm9sZCgpCi0gIHsKLSAgICByZXR1cm4gc3R5bGUuZXF1YWxzSWdub3JlQ2FzZShEZWYuQm9sZCk7Ci0gIH0KLQotICBib29sZWFuIGlzSXRhbGljKCkKLSAgewotICAgIHJldHVybiBzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JdGFsaWMpOwotICB9Ci0KLSAgU3RyaW5nIGdldFNpemUoKQotICB7Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHZvaWQgcHJpbnQoU3RyaW5nQnVmZmVyIG91dFApCi0gIHsKLSAgICBpZihzdHlsZVNoZWV0IT1udWxsKQotICAgIHsKLSAgICAgICAgb3V0UC5hcHBlbmQoc3R5bGVTaGVldCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgb3V0UC5hcHBlbmQobmFtZSArICJcdCIgKyBzdHlsZSArICJcdCIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIG91dFAuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSGVscE1lc3NhZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSGVscE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzFkNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0hlbHBNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotY2xhc3MgSGVscE1lc3NhZ2VzCi17Ci0KLSAgc3RhdGljIFN0cmluZyBFWENFUFRJT04gPSAiRXhjZXB0aW9uOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQkFEX09VVFBVVF9TVFJFQU0gPSAiQmFkIG91dHB1dCBzdHJlYW0hIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEJBRF9QQVJTRVIgPSAiQmFkIHBhcnNlciBvYmplY3QhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIElOUFVUX1BBUkFNRVRFUl9OVUxMID0gIklucHV0IHBhcmFtZXRlciBpcyBudWxsISI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTlZBTElEX1BBUkFNRVRFUl9OQU1FID0gIk5vIHZhbGlkIHBhcmFtZXRlciBuYW1lZCAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV1JJVEVfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGZpbGUgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfVVJMID0gIk1pc3NpbmcgdXJsICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBNSVNTSU5HX0xBQkVMID0gIk1pc3NpbmcgbGFiZWwgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfTk9ERSA9ICJNaXNzaW5nIG5vZGUgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRV9GQUlMRUQgPSAiRXJyb3IgcmVhZGluZyBmaWxlICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBXUklURV9GSUxFID0gIldyaXRlcyBmaWxlOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV1JJVEVfRVJST1IgPSAiRXJyb3Igd3JpdGluZyBmaWxlOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX01JU1NJTkcgPSAiUGFyYW1ldGVyIG1pc3Npbmc6ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBQQVJBTUVURVJfTk9UX05VTUJFUiA9ICIgaGF2ZSB0byBiZSBhIG51bWJlciwgdGhlIHZhbHVlIGlzIG5vdCBhIG51bWJlciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUgPSAiVmFsdWUgbWlzc2luZyBmb3IgcGFyYW1ldGVyICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBGT05UX0FORF9TVFlMRV9NSVNTSU5HID0gIkJvdGggb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBOT19ESVJFQ1RPUlkgPSAiIGlzIG5vdCBhIHJlYWRhYmxlIGRpcmVjdG9yeSEiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgRElSRUNUT1JZX05PVF9QQVJTRUQgPSAiRG9lcyBub3QgcGFyc2UgZGlyZWN0b3J5ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBOT1RfRU5PVUdIX0lOUFVUID0gIk5vdCBlbm91Z2ggaW5wdXQsIG9wZXJhdGlvbiBjYW5jZWxlZCEiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgSU5DT1JSRUNUX0hFQURFUkZJTEUgPSAiSGVhZGVyIGZpbGUgcHJvYmFibHkgaW5jb3JyZWN0ISI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTkNPUlJFQ1RfRk9PVEVSRklMRSA9ICJGb290ZXIgZmlsZSBwcm9iYWJseSBpbmNvcnJlY3QhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfU1lOVEFYX0VSUk9SID0gIiBpcyBub3QgYSB2YWxpZCBrZXkgd29yZCEgSGF2ZSB0byBiZWdpbiB3aXRoICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBLRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SID0gIiBjb250YWluaW5nIGtleXdvcmRzIGNvbnRhaW5zIHN5bnRheCBlcnJvcnMhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIFJFTEFURURfS0VZV09SRF9OT1RfRk9VTkQgPSAiIHJlZmZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcga2V5d29yZCBkb2VzIG5vdCBleGlzdCAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSU0VfRElSRUNUT1JZID0gIlBhcnNlcyBkaXJlY3Rvcnk6ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBUQUtFX0FfV0hJTEUgPSAiSXQgbWF5IHRha2UgYSB3aGlsZSAuLi4iOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgVElUTEVfQU5DSE9SX01JU1NJTkcgPSAiVGl0bGUgYW5kL29yIGFuY2hvciB0ZXh0IGlzIG1pc3NpbmchIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfUkVTUE9OU0VfRklMRSA9ICJFcnJvcjogTWlzc2luZyAtciByZXNwb25zZSBmaWxlIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE5PX09GX0NIQVJBQ1RFUlNfUkVBRCA9ICIgY2hhcnMgcmVhZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgTk9fT0ZfRklMRVNfQ0hFQ0tFRCA9ICIgZmlsZXMgY2hlY2tlZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgU0VDT05EID0gIiBzICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBXT1JEUyA9ICIgd29yZHMiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQ09NUElMRUQgPSAiQ29tcGlsZWQgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIERPQ1VNRU5UU19DT05BVElOSU5HID0gIiBkb2N1bWVudHMsIGNvbnRhaW5pbmcgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEJZVEVTX1NUT1JFRCA9ICIgYnl0ZXMsIHN0b3JlZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV0VCX0RBVEFCQVNFID0gIldlYiBkYXRhYmFzZSBvZiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQ0RST01fREFUQUJBU0UgPSAiQ0QtUk9NIGRhdGFiYXNlIG9mICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBCWVRFUyA9ICAiYnl0ZXMiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQllURVNfQU5EID0gICJieXRlcywgYW5kICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBGQVRBTF9FUlJPUiA9ICJGYXRhbCBFcnJvcjogIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEZJTEVfRE9FU19OT1RfRVhJU1QgPSAiRXJyb3I6IENvdWxkbid0IGZpbmQgZmlsZTogIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfRl9GSUxFID0gIkVycm9yOiBNaXNzaW5nIC1mIGZpbGVuYW1lIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIENBTk9OSUNBTF9GSUxFX1BBVEhfRkFJTEVEID0gIkVycm9yOiBjb3VsZG4ndCBjcmVhdGUgY2Fub25pY2FsIGZpbGVwYXRoIGZvciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUID0gICJEb2N1bWVudCBkZXBlbmRhbmN5IGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBEQVRBX0RFUEVOREVOQ1lfTElTVCA9ICAiRGF0YSBkZXBlbmRhbmN5IGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBFWFRFUk5BTF9MSU5LX0xJU1QgPSAgIkV4dGVybmFsIGxpbmtzIGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBNSVNTSU5HX0xJTktfTElTVCA9ICAiTWlzc2luZyBsaW5rcyBsaXN0IGZvciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgTk9USElOR19UT19ETyA9ICAiRXJyb3I6IG5vdGhpbmcgdG8gZG86IC1uYiAtbmggLW5sIC1udCI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTlRFUk1FRElBVEVfREFUQV9GSUxFID0gICJJbnRlcm1lZGlhdGUgZGF0YTogZmlsZTovLyI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBUT09fTUFOWV9GSUxFUyA9ICAiRXJyb3I6IFRvbyBtYW55IGZpbGVzIGZvciB0aGUgc2VhcmNoIGFwcGxldCBkYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTExFR0FMX05VTUVSSUNfVkFMVUUgPSAiRXJyb3I6IElsbGVnYWwgbnVtZXJpYyB2YWx1ZSAtaW0gIjsgLy8kTk9OLU5MUy0xJAotCi0gIHN0YXRpYyB2b2lkIGxvYWRIZWxwTWVzc2FnZXMoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY2hhcmFjdGVyc2V0KQotICB7Ci0gICAgICAgU3RyaW5nIGhlbHBUZXh0cyA9IE1pc2NTdGF0aWMubG9hZEZpbGUoZmlsZU5hbWUsY2hhcmFjdGVyc2V0KTsKLSAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscFRleHRzLCAiXG5cdCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICB3aGlsZShwYXJzZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgICAgSGVscE1lc3NhZ2VzLmFkZFZhbHVlKHBhcmFtLCAiICIgKyB2YWx1ZSArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgIH0KLSAgfQotCi0gIHN0YXRpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBwYXJhbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJJTlBVVF9QQVJBTUVURVJfTlVMTCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiSUxMRUdBTF9OVU1FUklDX1ZBTFVFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSUxMRUdBTF9OVU1FUklDX1ZBTFVFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRVhDRVBUSU9OIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiSU5URVJNRURJQVRFX0RBVEFfRklMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLklOVEVSTUVESUFURV9EQVRBX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJUT09fTUFOWV9GSUxFUyIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlRPT19NQU5ZX0ZJTEVTID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTk9fT0ZfRklMRVNfQ0hFQ0tFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk5PX09GX0ZJTEVTX0NIRUNLRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJOT1RISU5HX1RPX0RPIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9USElOR19UT19ETyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOVEVSTUVESUFURV9EQVRBX0ZJTEUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5JTlRFUk1FRElBVEVfREFUQV9GSUxFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiREFUQV9ERVBFTkRFTkNZX0xJU1QiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5EQVRBX0RFUEVOREVOQ1lfTElTVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkVYVEVSTkFMX0xJTktfTElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkVYVEVSTkFMX0xJTktfTElTVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk1JU1NJTkdfTElOS19MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MSU5LX0xJU1QgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXT1JEUyIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldPUkRTID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQ09NUElMRUQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5DT01QSUxFRCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkRPQ1VNRU5UU19DT05BVElOSU5HIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRE9DVU1FTlRTX0NPTkFUSU5JTkcgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJCWVRFU19TVE9SRUQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5CWVRFU19TVE9SRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXRUJfREFUQUJBU0UiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5XRUJfREFUQUJBU0UgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJDRFJPTV9EQVRBQkFTRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkNEUk9NX0RBVEFCQVNFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQllURVMiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5CWVRFUyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkJZVEVTX0FORCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJZVEVTX0FORCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk1JU1NJTkdfRl9GSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19GX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJDQU5PTklDQUxfRklMRV9QQVRIX0ZBSUxFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkNBTk9OSUNBTF9GSUxFX1BBVEhfRkFJTEVEID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTk9fT0ZfQ0hBUkFDVEVSU19SRUFEIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9fT0ZfQ0hBUkFDVEVSU19SRUFEID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRklMRV9ET0VTX05PVF9FWElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkZJTEVfRE9FU19OT1RfRVhJU1QgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJGQVRBTF9FUlJPUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkZBVEFMX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiU0VDT05EIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuU0VDT05EID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQkFEX1BBUlNFUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJBRF9QQVJTRVIgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTUlTU0lOR19SRVNQT05TRV9GSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19SRVNQT05TRV9GSUxFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiVElUTEVfQU5DSE9SX01JU1NJTkciKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5USVRMRV9BTkNIT1JfTUlTU0lORyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIktFWVdPUkRfRklMRV9TWU5UQVhfRVJST1IiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5LRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiS0VZV09SRF9TWU5UQVhfRVJST1IiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5LRVlXT1JEX1NZTlRBWF9FUlJPUiA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIlBBUlNFX0RJUkVDVE9SWSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlBBUlNFX0RJUkVDVE9SWSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIlRBS0VfQV9XSElMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlRBS0VfQV9XSElMRSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOQ09SUkVDVF9IRUFERVJGSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5DT1JSRUNUX0hFQURFUkZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJSRUxBVEVEX0tFWVdPUkRfTk9UX0ZPVU5EIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuUkVMQVRFRF9LRVlXT1JEX05PVF9GT1VORCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOQ09SUkVDVF9GT09URVJGSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5DT1JSRUNUX0ZPT1RFUkZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJOT1RfRU5PVUdIX0lOUFVUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9UX0VOT1VHSF9JTlBVVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk5PX0RJUkVDVE9SWSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk5PX0RJUkVDVE9SWSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkRJUkVDVE9SWV9OT1RfUEFSU0VEIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRElSRUNUT1JZX05PVF9QQVJTRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJCQURfT1VUUFVUX1NUUkVBTSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiV1JJVEVfRVhDRVBUSU9OIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuV1JJVEVfRVhDRVBUSU9OID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiT1BFTl9GSUxFX0ZBSUxFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk9QRU5fRklMRV9GQUlMRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXUklURV9FUlJPUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldSSVRFX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiV1JJVEVfRklMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldSSVRFX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX0xBQkVMIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MQUJFTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTUlTU0lOR19VUkwiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5NSVNTSU5HX1VSTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX0xBQkVMIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MQUJFTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX05PREUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5NSVNTSU5HX05PREUgID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX01JU1NJTkciKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lOR19WQUxVRSAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJGT05UX0FORF9TVFlMRV9NSVNTSU5HIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRk9OVF9BTkRfU1RZTEVfTUlTU0lORyAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX05PVF9OVU1CRVIiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTk9UX05VTUJFUiAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJJTlZBTElEX1BBUkFNRVRFUl9OQU1FIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5WQUxJRF9QQVJBTUVURVJfTkFNRSAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBwYXJhbWV0ZXIgIiArIHBhcmFtKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0lPLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSU8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlNzAyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSU8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgQ2xhc3Mgd2l0aCBvbmx5IGNsYXNzIG1ldGhvZHMgdGhhdCBzaW1wbGlmaWVzIHNvbWUgY29tbXVuaWNhdGlvbnMKLSogIHdpdGggYSB3d3ctc2VydmVyIGFuZCBhbHNvIG91dHB1dCB0byB0aGUgSmF2YSBDb25zb2xlIFdpbmRvdy4KLSoKLSogIER1ZSB0byBzZWN1cml0eSBsaW1pdGF0aW9ucywgdGhlIG9ubHkgd3d3LXNlcnZlciByZWFjaGFibGUsCi0qICBpcyB0aGUgc2VydmVyIGZyb20gd2hpY2ggdGhlIGN1cnJlbnQgYXBwbGV0IGlzIGxvYWRlZCBmcm9tLgotKgotKiAgVGhpcyBjbGFzcyB1c2VzIHRoZSBFcnJvcldpbmRvdyBjbGFzcyBmb3Igc2hvd2luZyBlcnJvciBtZXNzYWdlcy4KLSoKLSogQHNlZSBydXB0b29scy5pby5FcnJvcldpbmRvdwotKgotKiBAdmVyc2lvbiAxLjAKLSogQGF1dGhvciBSYXRpb25hbCBTb2Z0d2FyZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgSU8KLXsKLSAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWdPbj1mYWxzZTsKLQotICAgLyoqCi0gICAqICBDbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgc2V0IG9mIHN0cmluZyBkZWxpbWl0ZXJzIHRoYXQgY2FuIGJlCi0gICAqICB1c2VkIHdoZW4gdG9rZW5pemluZyBhIHRleHQgc3RyaW5nLgotICAgKgotICAgKi8KLSAgIHN0YXRpYyBTdHJpbmcgZ2V0RGVsaW0oKQotICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgfQotCi0gICAvKioKLSAgICogIENsYXNzIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGlmIGRlYnVnIGluZm8gc2hhbGwgYmUgc2hvd2VkIG9yIG5vdAotICAgKiAgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cuCi0gICAqCi0gICAqIEBwYXJhbSBpc09uIElmIDxiPnRydWU8L2I+IHRoZW4gZGVidWcgaW5mbyB3aWxsIGJlIHNob3dlZC4KLSAgICoKLSAgICovCi0gICBzdGF0aWMgdm9pZCBkZWJ1Zyhib29sZWFuIGlzT24pCi0gICB7Ci0gICAgICAgIGRlYnVnT24gPSBpc09uOwotICAgfQotCi0KLSAgIC8qKgotICAgKiAgUHJpbnQgRXJyb3IgbWVzc2FnZXMgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cKLSAgICoKLSAgICogQHBhcmFtIHN0ciBTdHJpbmcgdG8gcHJpbnQKLSAgICoKLSAgICovCi0gICBzdGF0aWMgdm9pZCBwcmludEVycm9yKCBTdHJpbmcgc3RyICkKLSAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXJyb3I6IiArIHN0ciApOyAvLyROT04tTkxTLTEkCi0gICB9Ci0KLSAgIC8qKgotICAgKiAgUHJpbnQgRGVidWcgbWVzc2FnZXMgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cgaWYgdGhlIGRlYnVnIGZsYWcKLSAgICogIGlzIHNldCAoc2V0RGVidWcgbWV0aG9kKQotICAgKgotICAgKiBAcGFyYW0gc3RyIFN0cmluZyB0byBwcmludAotICAgKgotICAgKi8KLSAgIHN0YXRpYyB2b2lkIHByaW50RGVidWcoIFN0cmluZyBzdHIgKQotICAgewotICAgICAgICBpZiAoZGVidWdPbikKLSAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJEZWJ1ZzoiICsgc3RyICk7IC8vJE5PTi1OTFMtMSQKLSAgIH0KLQotICAgc3RhdGljIENvbG9yIGdldENvbG9yKFN0cmluZyBzUEJHKQotICAgewotICAgICAgICAgLy8gQ2hlY2sgaWYgYSBwcmUtZGVmaW5lZCBjb2xvciBpcyBzcGVjaWZpZWQuCi0gICAgICBzUEJHID0gc1BCRy50cmltKCk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJibGFjayIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5ibGFjayk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJibHVlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLmJsdWUpOwotICAgICAgaWYgKHNQQkcuZXF1YWxzSWdub3JlQ2FzZSgiY3lhbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5jeWFuKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoImRhcmtHcmF5IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLmRhcmtHcmF5KTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoImdyYXkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IuZ3JheSk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJncmVlbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5ncmVlbik7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJsaWdodEdyYXkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IubGlnaHRHcmF5KTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoIm1hZ2VudGEiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IubWFnZW50YSk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJvcmFuZ2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3Iub3JhbmdlKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoInBpbmsiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IucGluayk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJyZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IucmVkKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoIndoaXRlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLndoaXRlKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoInllbGxvdyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci55ZWxsb3cpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgIC8vIElmIHRoZSBjb2xvciBpcyBzcGVjaWZpZWQgaW4gSFRNTCBmb3JtYXQsIGJ1aWxkIGl0IGZyb20gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzCi0gICAgICBpbnQgaVJlZCA9IDI1NTsKLSAgICAgIGludCBpQmx1ZSA9IDI1NTsKLSAgICAgIGludCBpR3JlZW4gPSAyNTU7Ci0gICAgICBpZiAoc1BCRy5sZW5ndGgoKSA9PSA3ICYmIHNQQkcuY2hhckF0KDApID09ICcjJykKLSAgICAgIHsKLSAgICAgICAgaVJlZCA9IEludGVnZXIucGFyc2VJbnQoc1BCRy5zdWJzdHJpbmcoMSwzKSwxNik7Ci0gICAgICAgIGlHcmVlbiA9IEludGVnZXIucGFyc2VJbnQoc1BCRy5zdWJzdHJpbmcoNSw3KSwxNik7Ci0gICAgICAgIGlCbHVlID0gSW50ZWdlci5wYXJzZUludChzUEJHLnN1YnN0cmluZygzLDUpLDE2KTsKLSAgICAgICAgcmV0dXJuKG5ldyBDb2xvcihpUmVkLCBpR3JlZW4sIGlCbHVlKSk7Ci0gICAgICB9Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcnNlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc1BCRywgIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNSZWQgPSBwYXJzZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc0dyZWVuID0gcGFyc2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgU3RyaW5nIHNCbHVlID0gcGFyc2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaVJlZCA9IEludGVnZXIucGFyc2VJbnQoc1JlZC50cmltKCkpOwotICAgICAgICAgICAgaUdyZWVuID0gSW50ZWdlci5wYXJzZUludChzR3JlZW4udHJpbSgpKTsKLSAgICAgICAgICAgIGlCbHVlID0gSW50ZWdlci5wYXJzZUludChzQmx1ZS50cmltKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihpUmVkLCBpR3JlZW4sIGlCbHVlKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPLmdldENvbG9yXG5FeGNlcHRpb24gMToiICsgZTEudG9TdHJpbmcoKSArIHNQQkcpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMikKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTy5nZXRDb2xvclxuRXhjZXB0aW9uIDI6IiArIGUyLnRvU3RyaW5nKCkgKyBzUEJHKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgcmV0dXJuIENvbG9yLmJsYWNrOwotICAgIH0KLQotICAgIHN0YXRpYyBGb250IGdldEZvbnQoU3RyaW5nIHNQQkcpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIGZvbnQgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBzdHlsZSA9ICJQTEFJTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IHNpemUgPSAxMjsKLSAgICAgICAgaW50IHJlYWxTdHlsZT1Gb250LlBMQUlOOwotICAgICAgICBzUEJHID0gc1BCRy50cmltKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNQQkcsICIsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgZm9udCA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgZm9udCA9IGZvbnQudHJpbSgpOwotICAgICAgICAgICBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJBcmlhbCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGZvbnQgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGVsc2UgaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZSgiQ291cmllciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGZvbnQgPSAiQ291cmllciI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZWxzZSBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJEaWFsb2ciKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIGZvbnQgPSAiRGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBlbHNlIGlmIChmb250LmVxdWFsc0lnbm9yZUNhc2UoIkhlbHZldGljYSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgZm9udCA9ICJIZWx2ZXRpY2EiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGVsc2UgaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZSgiU3ltYm9sIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBmb250ID0gIlN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZWxzZSBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJUaW1lc1JvbWFuIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBmb250ID0gIlRpbWVzUm9tYW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgc3R5bGUgPSBwYXJzZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgIHN0eWxlID0gc3R5bGUudHJpbSgpOwotICAgICAgICAgICBpZihzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKCJJVEFMSUMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcmVhbFN0eWxlPUZvbnQuSVRBTElDOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoc3R5bGUuZXF1YWxzSWdub3JlQ2FzZSgiQk9MRCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICByZWFsU3R5bGU9Rm9udC5CT0xEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoc3R5bGUuZXF1YWxzSWdub3JlQ2FzZSgiQk9MRElUQUxJQyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICByZWFsU3R5bGU9Rm9udC5CT0xEICsgRm9udC5CT0xEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNpemUgPSBuZXcgSW50ZWdlcihwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPLmdldEZvbnRcbkV4Y2VwdGlvbiAxOiIgKyBlMS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSU8uZ2V0Rm9udFxuRXhjZXB0aW9uIDI6IiArIGUyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICByZXR1cm4gbmV3IEZvbnQoZm9udCwgcmVhbFN0eWxlLCBzaXplKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSmFyUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSmFyUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWIyMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0phclJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLS8qKgotICogSmFyUmVzb3VyY2VzOiBKYXJSZXNvdXJjZXMgbWFwcyBhbGwgcmVzb3VyY2VzIGluY2x1ZGVkIGluIGEKLSAqIFppcCBvciBKYXIgZmlsZS4gQWRkaXRpb25hbHksIGl0IHByb3ZpZGVzIGEgbWV0aG9kIHRvIGV4dHJhY3Qgb25lCi0gKiBhcyBhIGJsb2IuCi0gKi8KLWZpbmFsIGNsYXNzIEphclJlc291cmNlcyB7Ci0KLSAgIC8vIGV4dGVybmFsIGRlYnVnIGZsYWcKLSAgIGJvb2xlYW4gZGVidWdPbj1mYWxzZTsKLQotICAgLy8gamFyIHJlc291cmNlIG1hcHBpbmcgdGFibGVzCi0gICBwcml2YXRlIEhhc2h0YWJsZSBodEphckNvbnRlbnRzPW5ldyBIYXNodGFibGUoKTsKLQotICAgLy8gYSBqYXIgZmlsZQotICAgcHJpdmF0ZSBTdHJpbmcgamFyRmlsZU5hbWU7Ci0KLSAgIC8qKgotICAgICogY3JlYXRlcyBhIEphclJlc291cmNlcy4gSXQgZXh0cmFjdHMgYWxsIHJlc291cmNlcyBmcm9tIGEgSmFyCi0gICAgKiBpbnRvIGFuIGludGVybmFsIGhhc2h0YWJsZSwga2V5ZWQgYnkgcmVzb3VyY2UgbmFtZXMuCi0gICAgKiBAcGFyYW0gamFyRmlsZU5hbWUgYSBqYXIgb3IgemlwIGZpbGUKLSAgICAqLwotICAgSmFyUmVzb3VyY2VzKFN0cmluZyBqYXJGaWxlTmFtZSkgewotICAgICAgdGhpcy5qYXJGaWxlTmFtZT1qYXJGaWxlTmFtZTsKLSAgICAgIGluaXQoKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBFeHRyYWN0cyBhIGphciByZXNvdXJjZSBhcyBhIGJsb2IuCi0gICAgKiBAcGFyYW0gbmFtZSBhIHJlc291cmNlIG5hbWUuCi0gICAgKi8KLSAgIGJ5dGVbXSBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotICAgICAgcmV0dXJuIChieXRlW10paHRKYXJDb250ZW50cy5nZXQobmFtZSk7Ci0gICB9Ci0KLSAgIGJ5dGVbXSBnZXRSZXNvdXJjZSgpCi0gICB7Ci0gICAgICBFbnVtZXJhdGlvbiBrZXlzID0gaHRKYXJDb250ZW50cy5rZXlzKCk7Ci0gICAgICByZXR1cm4gKGJ5dGVbXSlodEphckNvbnRlbnRzLmdldChrZXlzLm5leHRFbGVtZW50KCkpOwotICAgfQotCi0vKioKLSAgKiBpbml0aWFsaXplcyBpbnRlcm5hbCBoYXNoIHRhYmxlcyB3aXRoIEphciBmaWxlIHJlc291cmNlcy4KLSAgKi8KLXByaXZhdGUgdm9pZCBpbml0KCkgewotICB0cnkgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIEphciBBcmNoaXZlICIgKyBqYXJGaWxlTmFtZSk7Ci0JICBEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgaWYoamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuSHR0cCkgfHwgamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuSHR0cHMpfHwgamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuRmlsZSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbmluZyB0aGUgSmFyIEZpbGUgYXMgYSBVUkwgc3RyZWFtIik7Ci0JCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbSggbmV3IFVSTChqYXJGaWxlTmFtZSkub3BlblN0cmVhbSgpICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbmluZyB0aGUgSmFyIEZpbGUgYXMgYSBsb2NhbCBmaWxlIHN0cmVhbSIpOwotICAgICAgICBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oamFyRmlsZU5hbWUpKTsKLSAgICAgIH0KLSAgICAgIC8vIGV4dHJhY3QgcmVzb3VyY2VzIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSBoYXNodGFibGUuCi0gICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcz1uZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7Ci0gICAgICBaaXBJbnB1dFN0cmVhbSB6aXM9bmV3IFppcElucHV0U3RyZWFtKGJpcyk7Ci0gICAgICBaaXBFbnRyeSB6ZT1udWxsOwotICAgICAgd2hpbGUgKCh6ZT16aXMuZ2V0TmV4dEVudHJ5KCkpIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAoemUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVidWdPbikgewotICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICJ6ZS5nZXROYW1lKCk9Iit6ZS5nZXROYW1lKCkrIiwiKyJnZXRTaXplKCk9Iit6ZS5nZXRTaXplKCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZT0oaW50KXplLmdldFNpemUoKTsKLSAgICAgICAgLy8gLTEgbWVhbnMgdW5rbm93biBzaXplLgotCQlpZiAoIHNpemUgPT0gLTEgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBSZXR1cm5lZCBzaXplIG9mIHppcCBmaWxlIGlzIC0xLiBGaWxlbmFtZTogIiArIHplLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0gICAgICAgIGJ5dGVbXSBiPW5ldyBieXRlWyhpbnQpc2l6ZV07Ci0gICAgICAgIGludCByYj0wOwotICAgICAgICBpbnQgY2h1bms9MDsKLSAgICAgICAgd2hpbGUgKCgoaW50KXNpemUgLSByYikgPiAwKSB7Ci0gICAgICAgICAgIGNodW5rPXppcy5yZWFkKGIscmIsKGludClzaXplIC0gcmIpOwotICAgICAgICAgICBpZiAoY2h1bms9PS0xKSB7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICAgICByYis9Y2h1bms7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkIHRvIGludGVybmFsIHJlc291cmNlIGhhc2h0YWJsZQotICAgICAgICBodEphckNvbnRlbnRzLnB1dCh6ZS5nZXROYW1lKCksYik7Ci0gICAgICAgIGlmIChkZWJ1Z09uKSB7Ci0gICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgIHplLmdldE5hbWUoKSsiICByYj0iK3JiKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAiLHNpemU9IitzaXplKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAiLGNzaXplPSIremUuZ2V0Q29tcHJlc3NlZFNpemUoKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgIH0KLSAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUuIik7IC8vJE5PTi1OTFMtMSQKLSAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICB9Ci19Ci0KLSAgIC8qKgotICAgICogRHVtcHMgYSB6aXAgZW50cnkgaW50byBhIHN0cmluZy4KLSAgICAqIEBwYXJhbSB6ZSBhIFppcEVudHJ5Ci0gICAgKi8KLSAgIHByaXZhdGUgU3RyaW5nIGR1bXBaaXBFbnRyeShaaXBFbnRyeSB6ZSkgewotICAgICAgIFN0cmluZ0J1ZmZlciBzYj1uZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgaWYgKHplLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICBzYi5hcHBlbmQoImQgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNiLmFwcGVuZCgiZiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCk9PVppcEVudHJ5LlNUT1JFRCkgewotICAgICAgICAgIHNiLmFwcGVuZCgic3RvcmVkICAgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNiLmFwcGVuZCgiZGVmYWx0ZWQgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9Ci0gICAgICAgc2IuYXBwZW5kKHplLmdldE5hbWUoKSk7Ci0gICAgICAgc2IuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgc2IuYXBwZW5kKCIiK3plLmdldFNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCk9PVppcEVudHJ5LkRFRkxBVEVEKSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIvIit6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOwotICAgfQotCi19CS8vIEVuZCBvZiBKYXJSZXNvdXJjZXMgY2xhc3MuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZTAwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotY2xhc3MgS2V5V29yZAotewotICAgcHJpdmF0ZSBTdHJpbmcga2V5V29yZD1udWxsOwotICAgcHJpdmF0ZSBWZWN0b3IgbXlLZXlXb3Jkcz1udWxsOwotICAgcHJpdmF0ZSBWZWN0b3IgbXlEb2N1bWVudHM9bnVsbDsKLSAgIHByaXZhdGUgU3BlY0tleVdvcmQgbXlTcGVjS2V5V29yZD1udWxsOwotICAgcHJpdmF0ZSBLZXlXb3JkIHBhcmVudE09bnVsbDsKLSAgIEtleVdvcmREZWYgZGVmID0gbnVsbDsKLSAgIAotICAgS2V5V29yZChLZXlXb3JkRGVmIGRlZikKLSAgIHsKLQkgICB0aGlzLmRlZiA9IGRlZjsKLQkgICBrZXlXb3JkID0gZGVmLmdldEtleSgpOwotICAgfQotCi0gICBwcml2YXRlIEtleVdvcmQoS2V5V29yZERlZiBkZWYsIFN0cmluZyBrZXlXb3JkLCBLZXlXb3JkIGtleSkKLSAgIHsKLQkgICB0aGlzLmRlZiA9IGRlZjsKLQkgICB0aGlzLmtleVdvcmQgPSBrZXlXb3JkOwotCSAgIHRoaXMucGFyZW50TSA9IGtleTsKLQkgICAKLSAgIH0KLQotICAgU3RyaW5nIGdldEtleVdvcmQoKQotICAgewotICAgICByZXR1cm4ga2V5V29yZDsKLSAgIH0KLQotICAgdm9pZCBhZGRLZXlXb3JkKEtleVdvcmREZWYgZGVmLCBTdHJpbmcga2V5LCBEb2N1bWVudCBkb2MpCi0gICB7CSAgIAotICAgICBpbnQgaW5kZXggPSBNaXNjU3RhdGljLmdldEluZGV4KGtleSwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsIDApOwotICAgICAvL0lmIHRoZSBib3R0b20gb2YgdGhlIGtleXdvcmQgaXMgcmVhY2hlZAotICAgICBpZihpbmRleD09LTEpCi0gICAgIHsKLSAgICAgICAgYWRkRG9jdW1lbnQoZG9jKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgaW50IGluZGV4MiA9ICBNaXNjU3RhdGljLmdldEluZGV4KGtleSwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsIGluZGV4KzEpOwotICAgICAgICBTdHJpbmcgbmV4dEtleVdvcmQ9bnVsbDsKLSAgICAgICAgaWYoaW5kZXgyIT0tMSkKLSAgICAgICAgewotICAgICAgICAgICBuZXh0S2V5V29yZCA9IGtleS5zdWJzdHJpbmcoaW5kZXgrMSxpbmRleDIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5leHRLZXlXb3JkID0ga2V5LnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICAgICAgfQotCi0gICAgICAgIEtleVdvcmQgdG1wS2V5ID0gY3JlYXRlS2V5V29yZChkZWYsIG5leHRLZXlXb3JkKTsKLSAgICAgICAgaWYodG1wS2V5IT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdG1wS2V5LmFkZEtleVdvcmQoZGVmLCBrZXkuc3Vic3RyaW5nKGluZGV4KzEpLCBkb2MpOwotICAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgdm9pZCBzZXRTcGVjS2V5V29yZChTdHJpbmcgcmVsYXRlZEtleSwgYm9vbGVhbiBzZWUpCi0gICB7Ci0gICAgIElPLnByaW50RGVidWcoInNldFNwZWNLZXlXb3JkICIgKyByZWxhdGVkS2V5KTsgLy8kTk9OLU5MUy0xJAotICAgICBteVNwZWNLZXlXb3JkID0gbmV3IFNwZWNLZXlXb3JkKHJlbGF0ZWRLZXksIHNlZSk7Ci0gICB9Ci0KLSAgIHZvaWQgaW5zZXJ0U3BlY0tleVdvcmQoU3RyaW5nIHNwZWNLZXlXb3JkU3RyaW5nLCBTdHJpbmcgcmVsYXRlZEtleVdvcmQpCi0gICB7Ci0KLSAgICAgIGJvb2xlYW4gZm91bmQ9ZmFsc2U7Ci0gICAgICBpbnQgaT0wOwotICAgICAgU3RyaW5nIGZpcnN0S2V5V29yZCA9IHNwZWNLZXlXb3JkU3RyaW5nOwotICAgICAgaW50IHBvcyA9IHNwZWNLZXlXb3JkU3RyaW5nLmluZGV4T2YoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsMCk7Ci0gICAgICBpZihwb3MhPS0xKQotICAgICAgewotICAgICAgICBmaXJzdEtleVdvcmQgPSBzcGVjS2V5V29yZFN0cmluZy5zdWJzdHJpbmcoMCxwb3MpOwotICAgICAgfQotCi0gICAgICB3aGlsZSghZm91bmQgJiYgbXlLZXlXb3JkcyE9bnVsbCAmJiBpPG15S2V5V29yZHMuc2l6ZSgpKQotICAgICAgewotICAgICAgICAgS2V5V29yZCB0bXBLID0gIChLZXlXb3JkKW15S2V5V29yZHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgaWYoZmlyc3RLZXlXb3JkLmVxdWFscyh0bXBLLmdldEtleVdvcmQoKSkpCi0gICAgICAgICB7Ci0KLSAgICAgICAgIGZvdW5kPXRydWU7Ci0gICAgICAgICBpZihwb3MhPS0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcEsuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcuc3Vic3RyaW5nKHBvcysxKSwgcmVsYXRlZEtleVdvcmQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdG1wSy5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgICBpZighZm91bmQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpPTA7Ci0gICAgICAgICBLZXlXb3JkIG5ld0tleVdvcmQyID0gbmV3IEtleVdvcmQobnVsbCwgZmlyc3RLZXlXb3JkLCB0aGlzKTsKLSAgICAgICAgIElPLnByaW50RGVidWcoIm5ldyBrZXl3b3JkICIgKyBmaXJzdEtleVdvcmQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICBpZihwb3M9PS0xKQotICAgICAgICAgewotICAgICAgICAgICBuZXdLZXlXb3JkMi5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgbmV3S2V5V29yZDIuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcuc3Vic3RyaW5nKHBvcysxKSwgcmVsYXRlZEtleVdvcmQpOwotICAgICAgICAgfQotICAgICAgICAgaWYobXlLZXlXb3Jkcz09bnVsbCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIElPLnByaW50RGVidWcoIm15S2V5V29yZHMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbXlLZXlXb3JkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlKGluZGV4PT0tMSAmJiBpPG15S2V5V29yZHMuc2l6ZSgpKQotICAgICAgICAgewotICAgICAgICAgICAgS2V5V29yZCB0bXBLID0gIChLZXlXb3JkKW15S2V5V29yZHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkuCi0gICAgICAgICAgICAgICAgICBjb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpLgotICAgICAgICAgICAgICAgICAgY29tcGFyZVRvKHRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpPT0wKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKSkhPTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS5jb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkpPjApCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaS0xOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmKGluZGV4IT0tMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAgbXlLZXlXb3Jkcy5pbnNlcnRFbGVtZW50QXQobmV3S2V5V29yZDIsIGluZGV4KTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG15S2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBteUtleVdvcmRzLnNpemUoKSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHByaXZhdGUgS2V5V29yZCBjcmVhdGVLZXlXb3JkKEtleVdvcmREZWYgZGVmLCBTdHJpbmcga2V5KQotICAgewotCi0gICAgIGlmKG15S2V5V29yZHM9PW51bGwpCi0gICAgIHsKLSAgICAgICAgbXlLZXlXb3JkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgS2V5V29yZCBuZXdLZXlXb3JkID0gbmV3IEtleVdvcmQoZGVmLCBrZXksIHRoaXMpOwotICAgICAgICBteUtleVdvcmRzLmFkZEVsZW1lbnQobmV3S2V5V29yZCk7Ci0gICAgICAgIHJldHVybiBuZXdLZXlXb3JkOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpbnQgaT0wOwotICAgICAgICAgIEtleVdvcmQgbmV3S2V5V29yZDIgPSBuZXcgS2V5V29yZChkZWYsIGtleSwgdGhpcyk7Ci0gICAgICAgICB3aGlsZShpbmRleD09LTEgJiYgaTxteUtleVdvcmRzLnNpemUoKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIEtleVdvcmQgdG1wSyA9ICAoS2V5V29yZClteUtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQotCi0gICAgICAgICAgICBpZihuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS4KLSAgICAgICAgICAgICAgICBjb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkuCi0gICAgICAgICAgICAgICAgY29tcGFyZVRvKHRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpPT0wKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKSkhPTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS5jb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkpPDApCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaSsxOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0bXBLOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYoaW5kZXghPS0xKQotICAgICAgICAgewotICAgICAgICAgICAgICBteUtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgaW5kZXgpOwotICAgICAgICAgICAgICByZXR1cm4gbmV3S2V5V29yZDI7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBteUtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgbXlLZXlXb3Jkcy5zaXplKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ld0tleVdvcmQyOwotICAgICAgICAgfQotCi0gICAgIH0KLSAgIH0KLQotICAgcHJpdmF0ZSB2b2lkIGFkZERvY3VtZW50KERvY3VtZW50IGRvYykKLSAgIHsKLSAgICBkb2Muc2V0S2V5V29yZCh0aGlzKTsKLSAgICAgIGlmKG15RG9jdW1lbnRzPT1udWxsKQotICAgICAgewotICAgICAgICAgbXlEb2N1bWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICBteURvY3VtZW50cy5hZGRFbGVtZW50KGRvYyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpbnQgaT0wOwotICAgICAgICAgd2hpbGUoaW5kZXg9PS0xICYmIGk8bXlEb2N1bWVudHMuc2l6ZSgpKQotICAgICAgICAgewotICAgICAgICAgICAgRG9jdW1lbnQgdG1wRCA9ICAoRG9jdW1lbnQpbXlEb2N1bWVudHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYoZG9jLmdldFRpdGxlKCkuY29tcGFyZVRvKHRtcEQuZ2V0VGl0bGUoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmKGluZGV4IT0tMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAgbXlEb2N1bWVudHMuaW5zZXJ0RWxlbWVudEF0KGRvYywgaW5kZXgpOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgbXlEb2N1bWVudHMuaW5zZXJ0RWxlbWVudEF0KGRvYywgbXlEb2N1bWVudHMuc2l6ZSgpKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLQotICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IGxldmVsKQotICAgewotICAgICBpZihvdXRQPT1udWxsKQotICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJLZXlXb3JkOnByaW50XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5wcmludFN0YXJ0KG91dFAsbGV2ZWwrMSk7Ci0gICAgICBpZihsZXZlbD09MCkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEEgTkFNRT1cIiIgKyBrZXlXb3JkKyAiXCI+IDwvQT4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgICBNaXNjU3RhdGljLnByaW50U3BhY2Uob3V0UCwgbGV2ZWwqNCk7Ci0gICAgICBpZihsZXZlbCE9MCkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludFNwYWNlKG91dFAsMik7Ci0gICAgICB9Ci0gICAgICBpZihteURvY3VtZW50cyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYoIUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0U2hvd0RvY3VtZW50VGl0bGUoKSAmJiAhS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRNdWxpdERvY3VtZW50S2V5d29yZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRG9jdW1lbnQgdG1wRCA9IChEb2N1bWVudCkgIG15RG9jdW1lbnRzLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgICB0bXBELnNldEtleVdvcmQodGhpcyk7Ci0gICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEEgSFJFRj1cIiIgKyB0bXBELmdldFVybCgpICsgIlwiIFRBUkdFVD1cIiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFRhcmdldCgpICsiXCI+IiArIGtleVdvcmQgKyAiPC9BPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0TXVsaXREb2N1bWVudEtleXdvcmQoKSkKLSAgICAgICAgewotICAgICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgICAgICBEb2N1bWVudCB0bXBEID0gKERvY3VtZW50KSAgbXlEb2N1bWVudHMuZWxlbWVudEF0KDApOwotICAgICAgICAgICB0bXBELnNldEtleVdvcmQodGhpcyk7Ci0gICAgICAgICAgIHRtcEQucHJpbnQob3V0UCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgICAgTWlzY1N0YXRpYy5wcmludFNwYWNlKG91dFAsIDEpOwotCi0gICAgICAgICBmb3IoaW50IGk9MDtpPG15RG9jdW1lbnRzLnNpemUoKTtpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBEb2N1bWVudCB0bXBEID0gKERvY3VtZW50KSAgbXlEb2N1bWVudHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgIHRtcEQuc2V0S2V5V29yZCh0aGlzKTsKLSAgICAgICAgICAgIHRtcEQucHJpbnQob3V0UCk7Ci0gICAgICAgICAgICBpZihpIT1teURvY3VtZW50cy5zaXplKCktMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgfQotICAgICAgaWYobXlTcGVjS2V5V29yZCE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgbXlTcGVjS2V5V29yZC5wcmludChvdXRQKTsKLSAgICAgIH0KLQotICAgICAgaWYoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRTdHlsZVNoZWV0KERlZi5EZWZhdWx0U3R5bGUpPT1udWxsKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICI8QlI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoucHJpbnRFbmQob3V0UCxsZXZlbCsxKTsKLSAgICAgIGlmKG15S2V5V29yZHMhPW51bGwpCi0gICAgICB7Ci0KLSAgICAgICAgIGludCB0bXBMID0gbGV2ZWwrMTsKLSAgICAgICAgIGZvcihpbnQgaT0wO2k8bXlLZXlXb3Jkcy5zaXplKCk7aSsrKQotICAgICAgICAgewotICAgICAgICAgICAgS2V5V29yZCB0bXBLID0gKEtleVdvcmQpICBteUtleVdvcmRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIHRtcEsucHJpbnQob3V0UCwgdG1wTCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgIH0KLQotICAgU3RyaW5nIGdldEFuY2hvcigpCi0gICB7Ci0JICAgaWYgKCB0aGlzLmRlZiAhPSBudWxsKQotICAgICAgewotICAgICAgICAgcmV0dXJuIHRoaXMuZGVmLmdldEFuY2hvcigpOwotICAgICAgfQotCSAgIAotICAgICAgaWYocGFyZW50TSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBwYXJlbnRNLmdldEFuY2hvcigpOwotICAgICAgfQotICAgICAgIAotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICB9Ci0gICAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRGVmLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZERlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ1MGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRGVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGRlZmluZXMgYSBrZXkgd29yZAotICoKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgIDEuMAotICovCi1jbGFzcyBLZXlXb3JkRGVmIHsKLQotCXByaXZhdGUgU3RyaW5nIGFuY2hvcjsKLQlwcml2YXRlIFN0cmluZyBrZXk7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIGtleVdvcmRTdHJpbmc7Ci0KLQlLZXlXb3JkRGVmKFN0cmluZyBhbmNob3IpCi0JewotCQl0aGlzKGFuY2hvciwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JS2V5V29yZERlZihTdHJpbmcgYW5jaG9yLCBTdHJpbmcga2V5LCBTdHJpbmcgdGV4dCkKLQl7Ci0JCXRoaXMuYW5jaG9yID0gYW5jaG9yOwotCQl0aGlzLmtleSA9IGtleTsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJCi0JCWlmICggdGhpcy50ZXh0ID09IG51bGwgKQotCQl7Ci0JCQl0aGlzLnRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdGhpcy5rZXlXb3JkU3RyaW5nID0gS2V5V29yZFN0YXRpYy5jb252ZXJ0S2V5V29yZCh0aGlzLmFuY2hvciwgdGhpcy5rZXksIHRoaXMudGV4dCk7Ci0JCWlmICggdGhpcy5rZXkgPT0gbnVsbCB8fCB0aGlzLmtleS5lcXVhbHMoIiIpICkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLmtleVdvcmRTdHJpbmcuaW5kZXhPZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSk7Ci0JCQlpZiAoIGluZGV4IDwgMCApCi0JCQl7Ci0JCQkJdGhpcy5rZXkgPSB0aGlzLmtleVdvcmRTdHJpbmc7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdGhpcy5rZXkgPSB0aGlzLmtleVdvcmRTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlTdHJpbmcgZ2V0QW5jaG9yKCkKLQl7Ci0JCXJldHVybiBhbmNob3I7Ci0JfQotCQotCVN0cmluZyBnZXRLZXkoKQotCXsKLQkJcmV0dXJuIGtleTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4ga2V5V29yZFN0cmluZzsKLQl9Ci0KLQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRmlsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmFkNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vL1JlcHJlc2VudHMgYSBodG1sIGZpbGUgdGhhdCBjb250YWlucyBrZXl3b3JkcwotY2xhc3MgS2V5V29yZEZpbGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZT1udWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHVybD1udWxsOwotCi0gICAgcHJpdmF0ZSBpbnQgbmV4dEtleVdvcmQ9MDsKLSAgICBwcml2YXRlIExpc3Qga2V5V29yZFZlY3Rvcj1udWxsOwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIENvbnN0cnVjdG9yLgotICAgIEtleVdvcmRGaWxlKFN0cmluZyB0aXRsZSwgU3RyaW5nIHVybCwgTGlzdCBrZXlXb3JkcykgLy8gbGlzdCBvZiBLZXlXb3JkRGVmIG9iamVjdAotICAgIHsKLSAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgICAgdGhpcy51cmwgPSB1cmw7Ci0gICAgICAgdGhpcy5rZXlXb3JkVmVjdG9yID0gIGtleVdvcmRzOwotICAgIH0KLSAgICAJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBLZXlXb3JkRGVmIGdldE5leHRLZXlXb3JkKCkKLSAgICB7Ci0gICAgICAgaWYobmV4dEtleVdvcmQ8a2V5V29yZFZlY3Rvci5zaXplKCkpCi0gICAgICAgewotICAgIAkgICBLZXlXb3JkRGVmIG5leHQgPSAoS2V5V29yZERlZilrZXlXb3JkVmVjdG9yLmdldChuZXh0S2V5V29yZCk7Ci0gICAgICAgIG5leHRLZXlXb3JkKys7Ci0gICAgICAgIGlmKG5leHQhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBrZXlXb3JkLCBpbnQgbm9PZkRvYykKLSAgICB7Ci0KLSAgICAgICAgaWYobm9PZkRvYz4xKQotICAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudCh0aXRsZSwgdXJsKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRIb2xkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkM2MyNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIEtleVdvcmRIb2xkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsYW5nID0gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpOwotCi0JcHJpdmF0ZSBWZWN0b3Iga2V5V29yZEZpbGVzID0gbnVsbDsKLQotCXByaXZhdGUgVmVjdG9yIGtleVdvcmRzID0gbnVsbDsKLQotCUtleVdvcmRIb2xkZXIoKSB7Ci0JCWtleVdvcmRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0KLQl2b2lkIGFkZChLZXlXb3JkRmlsZSBrZXkpIHsKLQkJa2V5V29yZEZpbGVzLmFkZEVsZW1lbnQoa2V5KTsKLQl9Ci0KLQl2b2lkIGRpdmlkZSgpIHsKLQkJaWYgKGtleVdvcmRGaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVdvcmRGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBuZXh0S2V5V29yZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJS2V5V29yZEZpbGUgdG1wID0gKEtleVdvcmRGaWxlKSBrZXlXb3JkRmlsZXMuZWxlbWVudEF0KGkpOwotCQkJCXdoaWxlIChuZXh0S2V5V29yZCAhPSBudWxsKSB7Ci0JCQkJCW5leHRLZXlXb3JkID0gbnVsbDsKLQkJCQkJS2V5V29yZERlZiBkZWYgPSB0bXAuZ2V0TmV4dEtleVdvcmQoKTsKLQkJCQkJaWYgKGRlZiAhPSBudWxsKSB7Ci0JCQkJCQluZXh0S2V5V29yZCA9IGRlZi50b1N0cmluZygpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5leHRLZXlXb3JkICE9IG51bGwpIHsKLQotCQkJCQkJaW50IG5vT2ZEb2MgPSAxOwotCQkJCQkJRG9jdW1lbnQgdG1wRCA9IHRtcC5nZXREb2N1bWVudChuZXh0S2V5V29yZCwgbm9PZkRvYyk7Ci0KLQkJCQkJCXdoaWxlICh0bXBEICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgaW5kZXggPSBNaXNjU3RhdGljCi0JCQkJCQkJCQkuZ2V0SW5kZXgoCi0JCQkJCQkJCQkJCW5leHRLZXlXb3JkLAotCQkJCQkJCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSwKLQkJCQkJCQkJCQkJMCk7Ci0JCQkJCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJCQkJCWluZGV4ID0gbmV4dEtleVdvcmQubGVuZ3RoKCk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJS2V5V29yZCB0bXBLID0gY3JlYXRlS2V5V29yZChkZWYpOwotCQkJCQkJCWlmICh0bXBLICE9IG51bGwgJiYgdG1wRCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRtcEsuYWRkS2V5V29yZChkZWYsIG5leHRLZXlXb3JkLCB0bXBEKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlub09mRG9jKys7Ci0JCQkJCQkJdG1wRCA9IHRtcC5nZXREb2N1bWVudChuZXh0S2V5V29yZCwgbm9PZkRvYyk7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgS2V5V29yZCBjcmVhdGVLZXlXb3JkKEtleVdvcmREZWYgZGVmKSB7Ci0KLQkJaWYgKGtleVdvcmRzID09IG51bGwpIHsKLQkJCWtleVdvcmRzID0gbmV3IFZlY3RvcigpOwotCQkJS2V5V29yZCBuZXdLZXlXb3JkID0gbmV3IEtleVdvcmQoZGVmKTsKLQkJCWtleVdvcmRzLmFkZEVsZW1lbnQobmV3S2V5V29yZCk7Ci0JCQlyZXR1cm4gbmV3S2V5V29yZDsKLQkJfSBlbHNlIHsKLQkJCWludCBpbmRleCA9IC0xOwotCQkJaW50IGkgPSAwOwotCQkJS2V5V29yZCBuZXdLZXlXb3JkMiA9IG5ldyBLZXlXb3JkKGRlZik7Ci0JCQlTdHJpbmcgc3RyMiA9IG5ld0tleVdvcmQyLmdldEtleVdvcmQoKTsKLQotCQkJd2hpbGUgKGluZGV4ID09IC0xICYmIGkgPCBrZXlXb3Jkcy5zaXplKCkpIHsKLQkJCQlLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCVN0cmluZyBzdHIgPSB0bXBLLmdldEtleVdvcmQoKTsKLQkJCQlpbnQgY21wID0gc3RyMi50b1VwcGVyQ2FzZSgpLmNvbXBhcmVUbyhzdHIudG9VcHBlckNhc2UoKSk7Ci0JCQkJaWYgKGNtcCA8IDApIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCX0gZWxzZSBpZiAoY21wID09IDApIHsKLQkJCQkJaW50IGNtcDIgPSBzdHIyLmNvbXBhcmVUbyhzdHIpOwotCQkJCQlpZiAoY21wMiAhPSAwKSB7Ci0JCQkJCQkKLQkJCQkJCS8vIHRoaXMgaXMgd3JvbmcsIHdpbGwgcHV0IHRoZSBlbnRyeSB0byB0aGUgcHJldmlvdXMgaXRlbQotLy8JCQkJCQlpZiAoY21wMiA+IDApIHsKLS8vCQkJCQkJCWluZGV4ID0gaTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCWluZGV4ID0gaSAtIDE7Ci0vLwkJCQkJCX0KLQkJCQkJCWlmIChjbXAyIDwgMCkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0bXBLOwotCQkJCQl9Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJaW5kZXggPSBrZXlXb3Jkcy5zaXplKCk7Ci0JCQl9Ci0JCQlrZXlXb3Jkcy5pbnNlcnRFbGVtZW50QXQobmV3S2V5V29yZDIsIGluZGV4KTsKLQkJCQotCQkJcmV0dXJuIG5ld0tleVdvcmQyOwotCi0JCX0KLQl9Ci0KLQl2b2lkIHJlYWRTcGVjS2V5V29yZHMoU3RyaW5nVG9rZW5pemVyIHBhcnNlcikgewotCQl3aGlsZSAocGFyc2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHNwZWNLZXlXb3JkU3RyaW5nID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyByZWxhdGVkS2V5V29yZCA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlLZXlXb3JkRGVmIHNwZWNLZXlEZWYgPSBuZXcgS2V5V29yZERlZihzcGVjS2V5V29yZFN0cmluZyk7Ci0JCQlLZXlXb3JkRGVmIHJlbGF0ZWRLZXlEZWYgPSBuZXcgS2V5V29yZERlZihyZWxhdGVkS2V5V29yZCk7Ci0KLQkJCXNwZWNLZXlXb3JkU3RyaW5nID0gc3BlY0tleURlZi50b1N0cmluZygpOwotCQkJcmVsYXRlZEtleVdvcmQgPSByZWxhdGVkS2V5V29yZC50b1N0cmluZygpOwotCi0JCQlpZiAoc3BlY0tleVdvcmRTdHJpbmcgIT0gbnVsbCAmJiByZWxhdGVkS2V5V29yZCAhPSBudWxsCi0JCQkJCSYmIHJlbGF0ZWRLZXlXb3JkRXhpc3RzKHNwZWNLZXlXb3JkU3RyaW5nLCByZWxhdGVkS2V5V29yZCkpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJaW50IGkgPSAwOwotCQkJCVN0cmluZyBmaXJzdEtleVdvcmQgPSBzcGVjS2V5V29yZFN0cmluZzsKLQkJCQlpbnQgcG9zID0gc3BlY0tleVdvcmRTdHJpbmcuaW5kZXhPZigKLQkJCQkJCUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoubGV2ZWxTZXBhcmF0b3JSZXBsYWNlLCAwKTsKLQkJCQlpZiAocG9zICE9IC0xKSB7Ci0JCQkJCWZpcnN0S2V5V29yZCA9IHNwZWNLZXlXb3JkU3RyaW5nLnN1YnN0cmluZygwLCBwb3MpOwotCQkJCX0KLQkJCQlJTy5wcmludERlYnVnKCJmaXJzdEtleVdvcmQgIiArIGZpcnN0S2V5V29yZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAoIWZvdW5kICYmIGkgPCBrZXlXb3Jkcy5zaXplKCkpIHsKLQkJCQkJSU8ucHJpbnREZWJ1ZygiaG9sZGVyIGluIGZpcnN0IHdoaWxlICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCQlpZiAoZmlyc3RLZXlXb3JkLmVxdWFscyh0bXBLLmdldEtleVdvcmQoKSkpIHsKLQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJaWYgKHBvcyAhPSAtMSkgewotCQkJCQkJCXRtcEsuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcKLQkJCQkJCQkJCS5zdWJzdHJpbmcocG9zICsgMSksIHJlbGF0ZWRLZXlXb3JkKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdG1wSy5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlJTy5wcmludERlYnVnKCIhZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJaSA9IDA7Ci0JCQkJCUtleVdvcmQgbmV3S2V5V29yZDIgPSBuZXcgS2V5V29yZChzcGVjS2V5RGVmKTsKLQkJCQkJaWYgKHBvcyA9PSAtMSkgewotCQkJCQkJbmV3S2V5V29yZDIuc2V0U3BlY0tleVdvcmQocmVsYXRlZEtleVdvcmQsIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3S2V5V29yZDIuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcKLQkJCQkJCQkJLnN1YnN0cmluZyhwb3MgKyAxKSwgcmVsYXRlZEtleVdvcmQpOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpbmRleCA9PSAtMSAmJiBpIDwga2V5V29yZHMuc2l6ZSgpKSB7Ci0JCQkJCQlJTy5wcmludERlYnVnKCJob2xkZXIgaW4gc2Vjb25kIHdoaWxlICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJS2V5V29yZCB0bXBLID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJCWlmIChuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS5jb21wYXJlVG8oCi0JCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpIDwgMCkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCX0gZWxzZSBpZiAobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkKLQkJCQkJCQkJLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpKSA9PSAwKSB7Ci0KLQkJCQkJCQlpZiAobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbygKLQkJCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpKSAhPSAwKSB7Ci0JCQkJCQkJCWlmIChuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkuY29tcGFyZVRvKAotCQkJCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpKSA+IDApIHsKLQkJCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWluZGV4ID0gaSAtIDE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCWtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgaW5kZXgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJa2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBrZXlXb3Jkcy5zaXplKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlbGF0ZWRLZXlXb3JkRXhpc3RzKFN0cmluZyBzcGVjS2V5V29yZFN0cmluZywKLQkJCVN0cmluZyByZWxhdGVkS2V5V29yZCkgewotCQlpZiAoa2V5V29yZHMgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCi0JCQl3aGlsZSAoaSA8IGtleVdvcmRzLnNpemUoKSkgewotCQkJCUtleVdvcmQgdG1wSyA9IChLZXlXb3JkKSBrZXlXb3Jkcy5lbGVtZW50QXQoaSk7Ci0JCQkJaWYgKHRtcEsuZ2V0S2V5V29yZCgpLmVxdWFscyhyZWxhdGVkS2V5V29yZCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVsYXRlZEtleVdvcmQKLQkJCQkrIEhlbHBNZXNzYWdlcy5SRUxBVEVEX0tFWVdPUkRfTk9UX0ZPVU5EICsgc3BlY0tleVdvcmRTdHJpbmcpOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQl2b2lkIHByaW50KCkgewotCi0JCWlmIChLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4UmVzdWx0RmlsZSgpICE9IG51bGwpIHsKLQkJCXByaW50RnJhbWVzZXQoKTsKLQkJCXByaW50SW5kZXgoKTsKLQkJfQotCQlwcmludEtleVdvcmRzKCk7Ci0JfQotCi0JLy8gUHJpbnRzIHRoZSBodG1sZmlsZSBjb250YWluaW5nIHRoZSBmcmFtZXNldAotCXByaXZhdGUgdm9pZCBwcmludEZyYW1lc2V0KCkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE1haW5SZXN1bHRGaWxlKCkpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRQOwotCQkJaWYgKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0Q2hhcmFjdGVyU2V0KCkgIT0gbnVsbCkgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLAotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihIZWxwTWVzc2FnZXMuV1JJVEVfRklMRQotCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE1haW5SZXN1bHRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvL01pc2NTdGF0aWMucHJpbnQob3V0UCwgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkXCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPGh0bWwgbGFuZz1cIiIgKyBsYW5nICsgIlwiIHhtbDpsYW5nPVwiIiArIGxhbmcgKyAiXCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxoZWFkPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KG91dFAsCi0JCQkJCQkJIjxNRVRBIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KAotCQkJCQkJCW91dFAsCi0JCQkJCQkJIjx0aXRsZT4iICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFRpdGxlKCkgKyAiPC90aXRsZT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjwvaGVhZD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGtleVdvcmRzRmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBrZXlXb3JkUGF0aCA9IEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0UmVsYXRpdmVQYXRoKCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCk7Ci0KLQkJCUZpbGUgaW5keGVGaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4UmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBpbmRleFBhdGggPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFJlbGF0aXZlUGF0aCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFJlc3VsdEZpbGUoKTsKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KAotCQkJCQkJCW91dFAsCi0JCQkJCQkJIjxmcmFtZXNldCByb3dzPVwiIiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhIZWlnaHQoKSArICIsKlwiPlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludCgKLQkJCQkJCQlvdXRQLAotCQkJCQkJCSI8ZnJhbWUgbmFtZT1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4VGFyZ2V0KCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXCIgdGl0bGU9XCJOYXZpZ2F0aW9uIGJhclwiIHNyYz1cIiIgKyBpbmRleFBhdGggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXCIgbWFyZ2luaGVpZ2h0PVwiMlwiIG1hcmdpbndpZHRoPVwiMlwiIHNjcm9sbGluZz1cImF1dG9cIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludCgKLQkJCQkJCQlvdXRQLAotCQkJCQkJCSI8ZnJhbWUgbmFtZT1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleVdvcmRUYXJnZXQoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcIiB0aXRsZT1cIkNvbnRlbnRzXCIgc3JjPVwiIiArIGtleVdvcmRQYXRoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlwiIG1hcmdpbmhlaWdodD1cIjBcIiBtYXJnaW53aWR0aD1cIjJcIiBzY3JvbGxpbmc9XCJhdXRvXCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9mcmFtZXNldD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dFAuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oIktleVdvcmRIb2xkZXI6cHJpbnRGcmFtZXNldFxuIiArIEhlbHBNZXNzYWdlcy5FWENFUFRJT04gKyBlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyBQcmludHMgdGhlIGh0bWwgZmlsZSB3aXRoIHRoZSBzaG9ydGN1dHMgdG8gZWFjaCBhbmNob3IgaW4gdGhlIGtleXdvcmRmaWxlCi0JcHJpdmF0ZSB2b2lkIHByaW50SW5kZXgoKSB7Ci0JCXRyeSB7Ci0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFJlc3VsdEZpbGUoKSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQlmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCX0KLQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFA7Ci0JCQlpZiAoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSAhPSBudWxsKSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksCi0JCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldENoYXJhY3RlclNldCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5XUklURV9GSUxFCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyAiIiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhSZXN1bHRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGRcIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8aHRtbCBsYW5nPVwiIiArIGxhbmcgKyAiXCIgeG1sOmxhbmc9XCIiICsgbGFuZyArICJcIj5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPGhlYWQ+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYwotCQkJCQkucHJpbnQob3V0UCwKLQkJCQkJCQkiPE1FVEEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIj5cbiIpOyAvLyROT04tTkxTLTEkICAgICAgICAgIAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9oZWFkPjxCT0RZPlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJU3RyaW5nIGJlZ2luQ2hhciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5V29yZHMgIT0gbnVsbCkgewotCQkJCUZpbGUga2V5V29yZHNGaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJLmdldFd3d1Jvb3QoKQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCkpOwotCQkJCVN0cmluZyBwYXRoID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRSZWxhdGl2ZVBhdGgoKQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVdvcmRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUtleVdvcmQgdG1wID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJU3RyaW5nIGZpcnN0TCA9IHRtcC5nZXRLZXlXb3JkKCkuc3Vic3RyaW5nKDAsIDEpCi0JCQkJCQkJLnRvVXBwZXJDYXNlKCk7Ci0KLQkJCQkJaWYgKGZpcnN0TC5jb21wYXJlVG8oYmVnaW5DaGFyKSAhPSAwKSB7Ci0JCQkJCQliZWdpbkNoYXIgPSBmaXJzdEw7Ci0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8QSBIUkVGPVwiIiArIHBhdGggKyAiIyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgYmVnaW5DaGFyKTsKLQkJCQkJCU1pc2NTdGF0aWMKLQkJCQkJCQkJLnByaW50KAotCQkJCQkJCQkJCW91dFAsCi0JCQkJCQkJCQkJIlwiIFRBUkdFVD1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleVdvcmRUYXJnZXQoKSArICJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGJlZ2luQ2hhcik7Ci0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L0E+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9CT0RZPjwvaHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0UC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVycgotCQkJCQkucHJpbnRsbigiS2V5V29yZEhvbGRlcjpwcmludEluZGV4XG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vIFByaW50cyB0aGUga2V5d29yZGZpbGUKLQlwcml2YXRlIHZvaWQgcHJpbnRLZXlXb3JkcygpIHsKLQotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFA7Ci0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJfQotCi0JCQlpZiAoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSAhPSBudWxsKSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksCi0JCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldENoYXJhY3RlclNldCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5XUklURV9GSUxFCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkgKyAiIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBoZWFkZXJGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRIZWFkZXJGaWxlKCksIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJCWlmIChoZWFkZXJGaWxlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLk5vbmUpKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKEhlbHBNZXNzYWdlcy5JTkNPUlJFQ1RfSEVBREVSRklMRQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEhlYWRlckZpbGUoKSk7Ci0JCQl9Ci0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGhlYWRlckZpbGUpOwotCi0JCQlTdHJpbmcgYmVnaW5DaGFyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXlXb3JkcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlXb3Jkcy5zaXplKCk7IGkrKykgewotCi0JCQkJCUtleVdvcmQgdG1wID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJU3RyaW5nIGZpcnN0TCA9IHRtcC5nZXRLZXlXb3JkKCkuc3Vic3RyaW5nKDAsIDEpCi0JCQkJCQkJLnRvVXBwZXJDYXNlKCk7Ci0KLQkJCQkJaWYgKGZpcnN0TC5jb21wYXJlVG8oYmVnaW5DaGFyKSAhPSAwKSB7Ci0JCQkJCQliZWdpbkNoYXIgPSBmaXJzdEw7Ci0JCQkJCQlGb250T2JqZWN0IGZzID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkuZ2V0U3R5bGVTaGVldChEZWYuSGVhZExpbmVTdHlsZSk7Ci0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCWZzID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJLmdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCQlGb250T2JqZWN0IGYgPSBudWxsOwotCQkJCQkJRm9udE9iamVjdCBmciA9IGZzOwotCQkJCQkJaWYgKGZzID09IG51bGwpIHsKLQkJCQkJCQlmID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJLmdldEZvbnQoRGVmLkhlYWRMaW5lRm9udCk7Ci0JCQkJCQkJaWYgKGYgPT0gbnVsbCkgewotCQkJCQkJCQlmID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJCS5nZXRGb250KERlZi5EZWZhdWx0Rm9udCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZyID0gZjsKLQkJCQkJCX0KLQkJCQkJCUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoucHJpbnRTdGFydChvdXRQLCBmcik7Ci0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxCUj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJTWlzY1N0YXRpYwotCQkJCQkJCQkucHJpbnQoCi0JCQkJCQkJCQkJb3V0UCwKLQkJCQkJCQkJCQkiPEEgTkFNRT1cIiIgKyBiZWdpbkNoYXIgKyAiXCI+IiArIGJlZ2luQ2hhciArICI8L0E+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxCUj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5wcmludEVuZChvdXRQLCBmcik7Ci0JCQkJCX0KLQkJCQkJdG1wLnByaW50KG91dFAsIDApOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBmb290ZXJGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRGb290ZXJGaWxlKCksIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJCWlmIChmb290ZXJGaWxlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLk5vbmUpKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKEhlbHBNZXNzYWdlcy5JTkNPUlJFQ1RfRk9PVEVSRklMRQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEZvb3RlckZpbGUoKSk7Ci0JCQl9Ci0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGZvb3RlckZpbGUpOwotCQkJb3V0UC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVycgotCQkJCQkucHJpbnRsbigiS2V5V29yZEhvbGRlcjpwcmludEtleVdvcmRzXG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTYyMTkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0vLyBEZWJ1Zy4vLyBpbXBvcnQgamF2YXguc3dpbmcuKjsKLQotY2xhc3MgS2V5V29yZEluZGV4Ci17Ci0vLyBwcml2YXRlIHN0YXRpYyBLZXlXb3JkSG9sZGVyIGhvbGRlciA9IG5ldyBLZXlXb3JkSG9sZGVyKCk7Ci0KLQotLy8gIHByaXZhdGUgc3RhdGljIERlZmluaXRpb25PYmplY3QgZGVmT2JqPW51bGw7Ci0vLyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmZpbGUgPSBudWxsOwotLy8gIHByaXZhdGUgc3RhdGljIFN0cmluZyBjaGFyU2V0ID0gbnVsbDsgCi0vLyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhlbHBGaWxlID0gbnVsbDsKLS8vICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3dVc2FnZSA9IGZhbHNlOwotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4RXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjQzMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLS8qKgotICoKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHVzZWQgYnkgYWxsIGNsYXNzZXMgdGhhdCBhcmUgaW52b2x2ZWQgd2l0aCB0aGUga2V5d29yZGluZGV4Ci0gKgotICovCi0KLQotY2xhc3MgS2V5V29yZEluZGV4RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyByZWFzb247Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBDbGFzcyBDb25zdHJ1Y3Rvci4KLQlLZXlXb3JkSW5kZXhFeGNlcHRpb24oU3RyaW5nIGV4Y2VwdGlvbk5hbWUsIFN0cmluZyBleGNlcHRpb25SZWFzb24pCi0JewotCQlzdXBlciggZXhjZXB0aW9uUmVhc29uICk7Ci0JCW5hbWUJPSBleGNlcHRpb25OYW1lOwotCQlyZWFzb24JPSBleGNlcHRpb25SZWFzb247Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleGNlcHRpb24uCi0JU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmV0dXJuIHRoZSByZWFzb24gZm9yIHRoZSBleGNlcHRpb24uCi0JU3RyaW5nIGdldEV4Y2VwdGlvblJlYXNvbigpCi0JewotCQlyZXR1cm4gcmVhc29uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJcmV0dXJuIG5hbWUgKyAiOiIgKyByZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXhIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXhIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5YjU3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgS2V5V29yZEluZGV4SGVscGVyIHsKLQlLZXlXb3JkSG9sZGVyIGhvbGRlciA9IG5ldyBLZXlXb3JkSG9sZGVyKCk7Ci0KLQlzdGF0aWMgRGVmaW5pdGlvbk9iamVjdCBkZWZPYmogPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmZpbGUgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoYXJTZXQgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhlbHBGaWxlID0gbnVsbDsKLQotCS8vIENvbnN0cnVjdG9yCi0JS2V5V29yZEluZGV4SGVscGVyKCkgewotCi0JCWRlZmZpbGUgPSBudWxsOwotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwRGVmZmlsZQotCSAqIEBwYXJhbSBwQ2hhclNldAotCSAqIEBwYXJhbSBwSGVscEZpbGUKLQkgKi8KLQlwdWJsaWMgS2V5V29yZEluZGV4SGVscGVyKFN0cmluZyBwRGVmZmlsZSwgU3RyaW5nIHBDaGFyU2V0LCBTdHJpbmcgcEhlbHBGaWxlKSB7Ci0JCWRlZmZpbGUgPSBwRGVmZmlsZTsKLQkJY2hhclNldCA9IHBDaGFyU2V0OwotCQloZWxwRmlsZSA9IHBIZWxwRmlsZTsKLQl9Ci0KLQl2b2lkIHNldERlZmZpbGUoU3RyaW5nIHBGaWxlKSB7Ci0KLQkJZGVmZmlsZSA9IHBGaWxlOwotCi0JfQotCi0Jdm9pZCBzZXRDaGFyU2V0KFN0cmluZyBwQ2hhclNldCkgewotCi0JCWNoYXJTZXQgPSBwQ2hhclNldDsKLQotCX0KLQotCXZvaWQgc2V0SGVscEZpbGUoU3RyaW5nIHBIZWxwRmlsZSkgewotCi0JCWhlbHBGaWxlID0gcEhlbHBGaWxlOwotCi0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgZGVmaW5pdGlvbiBvYmplY3QgCi0JICogCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKiBAcmV0dXJuIERlZmluaXRpb25PYmplY3QKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBEZWZpbml0aW9uT2JqZWN0IGxvYWREZWZpbml0aW9uKFN0cmluZyBwdWJEaXIpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGVmZmlsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgS2V5V29yZEluZGV4RXhjZXB0aW9uKAotCQkJCQkiS2V5V29yZEluZGV4SGVscGVyOmV4ZWN1dGUoKSIsIFN0cmluZ0RlZmluaXRpb25zLkVSUk9SX0RFRklOSVRJT05fRklMRV9OT1RfRk9VTkQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoaGVscEZpbGUgIT0gbnVsbCkgewotCQkJSGVscE1lc3NhZ2VzLmxvYWRIZWxwTWVzc2FnZXMoaGVscEZpbGUsIGNoYXJTZXQpOwotCQl9Ci0KLQkJZGVmT2JqID0gbmV3IERlZmluaXRpb25PYmplY3QocHViRGlyLCBkZWZmaWxlLCBjaGFyU2V0KTsKLQotCQlyZXR1cm4gZGVmT2JqOwotCX0KLQotCS8qKgotCSAqIGV4ZWN1dGUgdGhlIGtleXdvcmQgaW5kZXggZ2VuZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBLZXlXb3JkSW5kZXhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEtleVdvcmRJbmRleEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDaGVjayBpZiBlbm91Z2ggaW5wdXQgaW4gZGVmaW5pdGlvbmZpbGUKLQkJaWYgKGRlZk9iai5lbm91Z2hJbnB1dCgpKSB7Ci0JCQlGaWxlIHRvcERpciA9IG5ldyBGaWxlKGRlZk9iai5nZXRXd3dSb290KCkpOwotCi0JCQkvLyBUaGUgd3d3Um9vdCBoYXZlIHRvIGJlIGEgZGlyZWN0b3J5Ci0JCQlpZiAodG9wRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLlBBUlNFX0RJUkVDVE9SWQotCQkJCQkJKyBkZWZPYmouZ2V0V3d3Um9vdCgpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLlRBS0VfQV9XSElMRSk7Ci0JCQkJcmVhZERpcih0b3BEaXIsIG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgS2V5V29yZEluZGV4RXhjZXB0aW9uKAotCQkJCQkJIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQlEZWYuU3RhcnREaXIKLQkJCQkJCQkJKyAiOiAiICsgZGVmT2JqLmdldFd3d1Jvb3QoKSArIEhlbHBNZXNzYWdlcy5OT19ESVJFQ1RPUlkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gU3BsaXRzIGFuZCBzb3J0cyB0aGUga2V5d29yZHMKLQkJCWhvbGRlci5kaXZpZGUoKTsKLQotCQkJU3RyaW5nIHNwZWNLZXlXb3Jkc0ZpbGUgPSBkZWZPYmouZ2V0S2V5V29yZEZpbGUoKTsKLQkJCWlmIChzcGVjS2V5V29yZHNGaWxlICE9IG51bGwpIHsKLQkJCQkvLyBSZWFkcyB0aGUgc3BlY2tleXdvcmRmaWxlCi0JCQkJU3RyaW5nIHNwZWNLZXlXb3JkcyA9IE1pc2NTdGF0aWMubG9hZEZpbGUoc3BlY0tleVdvcmRzRmlsZSwKLQkJCQkJCWRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSk7Ci0JCQkJaWYgKCFzcGVjS2V5V29yZHMuZXF1YWxzKERlZi5Ob25lKSkgewotCQkJCQlTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzcGVjS2V5V29yZHMsCi0JCQkJCQkJIlx0XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlob2xkZXIucmVhZFNwZWNLZXlXb3JkcyhwYXJzZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBLZXlXb3JkSW5kZXhFeGNlcHRpb24oCi0JCQkJCQkJIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJc3BlY0tleVdvcmRzRmlsZQotCQkJCQkJCQkJKyBIZWxwTWVzc2FnZXMuS0VZV09SRF9GSUxFX1NZTlRBWF9FUlJPUik7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBQcmludCB0aGUgS2V5V29yZEluZGV4SGVscGVyCi0JCQlob2xkZXIucHJpbnQoKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBLZXlXb3JkSW5kZXhFeGNlcHRpb24oIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCUhlbHBNZXNzYWdlcy5OT1RfRU5PVUdIX0lOUFVUKTsKLQkJfQotCi0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgZGlyZWN0b3J5IGhlaXJhcmNoeS4KLQlwcml2YXRlIHZvaWQgcmVhZERpcihGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdHJpbmcgZmlsZXNbXSA9IGZpbGUubGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIGZpbGVQYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJdHJ5IHsKLQkJCQlmaWxlUGF0aCA9IGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIktleVdvcmRJbmRleEhlbHBlcjpyZWFkRGlyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCUZpbGUgdG1wID0gbmV3IEZpbGUoZmlsZVBhdGggKyAiLyIgKyBmaWxlc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKHRtcC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJLy8gSWYgdGhlIGZpbGUgaXMgYSBkaXJlY3RvcnkKLQkJCQlTdHJpbmcgdG1wUGF0aCA9IHRtcC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl0cnkgewotCQkJCQl0bXBQYXRoID0gdG1wLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIktleVdvcmRJbmRleEhlbHBlcjpyZWFkRGlyXG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8gT24gcGMgdGhlIHNlcGFyYXRvciBtYXkgYmUgXCBhbmQgbm90IC8KLQkJCQl0bXBQYXRoID0gdG1wUGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQkJaWYgKCFkZWZPYmouaXNJblN0b3BkaXIodG1wUGF0aCkpIHsKLQkJCQkJLy8gSWYgbm90IGluIHN0b3BkaXIKLQkJCQkJcmVhZERpcih0bXAsIG1vbml0b3IpOwotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5ESVJFQ1RPUllfTk9UX1BBUlNFRAotCQkJCQkJCQkrIHRtcC5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiS2V5V29yZEluZGV4SGVscGVyOnJlYWREaXJcbiIgKyBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OICsgZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCQkvLyBQYXJzZSBhbGwgdGhlIGZpbGVzIHdoaWNoIGhhdmUgb25lIG9mIHRoZSBleHRlbnNpb25zIHdlIGFyZQotCQkJLy8gaW50ZXJlc3RlZCBpbi4KLQkJCWVsc2UgaWYgKGZpbGVzW2ldLmVuZHNXaXRoKCIuaHRtIikgfHwgZmlsZXNbaV0uZW5kc1dpdGgoIi5odG1sIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXx8IGZpbGVzW2ldLmVuZHNXaXRoKCIuc2h0bWwiKSB8fCBmaWxlc1tpXS5lbmRzV2l0aCgiLnNodG0iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl7Ci0JCQkJbG9hZEZpbGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArIGZpbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBQYXJzZSBlYWNoIG9mIHRoZSBmb3VuZCBmaWxlcyBhbmQgZXh0cmFjdCB0aGUga2V5d29yZHMgZnJvbSB0aGVtLgotCXByaXZhdGUgdm9pZCBsb2FkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGh0bWxGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShmaWxlTmFtZSwgZGVmT2JqCi0JCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJaWYgKGh0bWxGaWxlICE9IG51bGwgJiYgaHRtbEZpbGUubGVuZ3RoKCkgPiAwKSAKLQkJewotCQkJTGlzdCBrZXlXb3JkID0gS2V5V29yZFN0YXRpYy5nZXRLZXlXb3JkcyhodG1sRmlsZSk7Ci0JCQlpZiAoa2V5V29yZCAhPSBudWxsICYmIGtleVdvcmQuc2l6ZSgpID4gMCApIHsKLQkJCQlJTy5wcmludERlYnVnKCJrZXl3b3JkICIgKyBrZXlXb3JkKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0aXRsZSA9IE1pc2NTdGF0aWMuZ2V0VGl0bGUoaHRtbEZpbGUpOwotCi0JCQkJLy8gQWRkcyBhIGZpbGUgd2l0aCBrZXl3b3JkcyB0byB0aGUgaG9sZGVyIG9iamVjdAotCQkJCWhvbGRlci5hZGQobmV3IEtleVdvcmRGaWxlKHRpdGxlLCBkZWZPYmouZ2V0UmVsYXRpdmVQYXRoKCkKLQkJCQkJCSsgIiIgKyBmaWxlTmFtZS5zdWJzdHJpbmcoZGVmT2JqLmdldFd3d1Jvb3RMZW5ndGgoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWtleVdvcmQpKTsKLQkJCQkKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigia2V5d29yZHM9IiArIGtleVdvcmQuc2l6ZSgpICArICIgZmlsZTogIiArIGZpbGVOYW1lKTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRTdGF0aWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZjc4YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRTdGF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci0KLQotY2xhc3MgS2V5V29yZFN0YXRpYyB7Ci0KLQkvLyBub3RlOiBwYXR0ZXJuIHdpdGggW14+XSBkb2VzIG5vdCBtYXRjaCB3aGVuIHRoZXJlIGFyZSBub24tZW5nbGlzaAotCS8vIGNoYXJhY3RlcnMsIG1heWJlIGl0J3MgYSBqcmUgYnVnPwotCXN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW5kZXhfcmVmID0gUGF0dGVybi5jb21waWxlKAotCQkJIjxhXFxzKz8oLio/KT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQkvLyAiPGFcXHMrPyhbXj5dKj8obmFtZVxccyo9XFxzKlwiWEVffGNsYXNzXFxzKj1cXHMqXCJpbmRleCkuKj8pPiIsCi0JLy8gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBnZXQgdGhlIGtleSB3b3JkcyB3aXRoIGtleSBhbmQgdGV4dCBkZXNjcmlwdGlvbi4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZgotCSAqIGluZGV4IGZvcm1hdDogMS4gb2xkIGZvcm1hdDogPGEgbmFtZT0iS0VZX19URVhUIiAuLi4+IDIuIG5ldyBmb3JtYXQ6IDxhCi0JICogY2xhc3M9ImluZGV4IiBuYW1lPSJib29rbWFyayIga2V5PSJLRVkiIHRleHQ9IlRFWFQiIC4uLj4gVEVYVCBwYXJ0IGlzCi0JICogb3B0aW9uYWwKLQkgKi8KLQlzdGF0aWMgTGlzdCBnZXRLZXlXb3JkcyhTdHJpbmcgcmVhbFN0cmluZykgewotCQlpZiAocmVhbFN0cmluZyA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmdldEtleVdvcmRzXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlMaXN0IGFuY2hvcnMgPSBuZXcgQXJyYXlMaXN0KDIpOyAvLyROT04tTkxTLTEkCi0KLQkJTWF0Y2hlciBtID0gcF9pbmRleF9yZWYubWF0Y2hlcihyZWFsU3RyaW5nKTsKLQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlcyA9IG0uZ3JvdXAoMSk7Ci0JCQlpZiAoYXR0cmlidXRlcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCU1hcCBhdHRyTWFwID0gUmVzb3VyY2VIZWxwZXIuZ2V0VGFnQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCVN0cmluZyBrZXlXb3JkID0gKFN0cmluZykgYXR0ck1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfTkFNRSk7Ci0JCQlpZiAoa2V5V29yZCA9PSBudWxsIHx8IGtleVdvcmQubGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTdHJpbmcgY2xzID0gKFN0cmluZykgYXR0ck1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfQ0xBU1MpOwotCQkJU3RyaW5nIGtleSA9IG51bGw7Ci0JCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQlpZiAoKGNscyAhPSBudWxsKQotCQkJCQkmJiBjbHMuZXF1YWxzKFJlc291cmNlSGVscGVyLlRBR19BVFRSX1ZBTFVFX0lOREVYKSkgewotCQkJCWtleSA9IChTdHJpbmcpIGF0dHJNYXAuZ2V0KFJlc291cmNlSGVscGVyLlRBR19BVFRSX0tFWSk7Ci0JCQkJdGV4dCA9IChTdHJpbmcpIGF0dHJNYXAuZ2V0KFJlc291cmNlSGVscGVyLlRBR19BVFRSX1RFWFQpOwotCQkJfQotCQkJLy8gVGhlIGdldEtleVdvcmRQcmVmaXgoKSByZXR1cm5zIHRoZSB0YWcgd2hpY2ggaXMgdXNlZCB0byBkZWxpbWl0Ci0JCQkvLyBrZXl3b3Jkcy4KLQkJCS8vIEN1cnJlbnRseSB0aGlzIHRhZyBpcyBYRSBhbmQgaXMgZGVmaW5lZCBpbiBrZXl3b3JkY29uZmlnLnR4dAotCQkJaWYgKChrZXkgIT0gbnVsbCkKLQkJCQkJfHwga2V5V29yZC5zdGFydHNXaXRoKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJCQkuZ2V0S2V5V29yZFByZWZpeCgpKSkgewotCQkJCWFuY2hvcnMuYWRkKG5ldyBLZXlXb3JkRGVmKGtleVdvcmQsIGtleSwgdGV4dCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhbmNob3JzOwotCi0JfQotCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0S2V5V29yZChTdHJpbmcga2V5V29yZCkgewotCQlyZXR1cm4gY29udmVydEtleVdvcmQoa2V5V29yZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0S2V5V29yZChTdHJpbmcga2V5V29yZCwgU3RyaW5nIGtleSwgU3RyaW5nIHRleHQpIHsKLQotCQlpZiAoa2V5V29yZCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmNvbnZlcnRLZXlXb3JkXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSU8ucHJpbnREZWJ1ZygiY29udmVydEtleVdvcmQgIiArIGtleVdvcmQpOyAvLyBFcnJvciBpZiB3ZSBnZXQgYSBrZXl3b3JkIC8vJE5PTi1OTFMtMSQKLQkJLy8gdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZQotCQkvLyB0YWcuIC8vJE5PTi1OTFMtMSQKLQkJaWYgKChrZXkgIT0gbnVsbCkgJiYgKGtleS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBrZXk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBrZXkgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZQotCQkJCQkJKyB0ZXh0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFrZXlXb3JkLnN0YXJ0c1dpdGgoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXlXb3JkUHJlZml4KCkpKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmNvbnZlcnRLZXlXb3JkXG4iICsga2V5V29yZCArIEhlbHBNZXNzYWdlcy5LRVlXT1JEX1NZTlRBWF9FUlJPUiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0S2V5V29yZFByZWZpeCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBSZW1vdmUgdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5V29yZCAobmFtZWx5IFhFXykuCi0JCVN0cmluZyB0bXBLID0ga2V5V29yZC5zdWJzdHJpbmcoMyk7Ci0JCVN0cmluZyB0bXAgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaSA9IDA7Ci0JCWludCBwb3MgPSAwOwotCQl3aGlsZSAoaSAhPSAtMSkgewotCQkJLy8gZ2V0S2V5V29yZExldmVsU2VwYXJhdG9yKCkgaXMgaGFyZC1jb2RlZCBhcyBfXwotCQkJaSA9IHRtcEsuaW5kZXhPZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRLZXlXb3JkTGV2ZWxTZXBhcmF0b3IoKSwgcG9zKTsKLQkJCWlmIChpICE9IC0xKSB7Ci0JCQkJLy8gSW5zZXJ0IGEgc2VwYXJhdG9yIGJldHdlZW4ga2V5d29yZHMsIHdoaWNoIGluIHRoaXMgY2FzZSBpcwotCQkJCS8vIHRoZSAiOiIKLQkJCQl0bXAgKz0gdG1wSy5zdWJzdHJpbmcocG9zLCBpKTsKLQkJCQl0bXAgKz0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2U7Ci0JCQkJcG9zID0gaSArIDI7Ci0JCQl9IGVsc2UgewotCQkJCXRtcCArPSB0bXBLLnN1YnN0cmluZyhwb3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0bXAucmVwbGFjZSgnXycsICcgJyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L01pc2NTdGF0aWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9NaXNjU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTM3MmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L01pc2NTdGF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIE1pc2NTdGF0aWMKLXsKLSAgc3RhdGljIEhhc2h0YWJsZSB0d29WYWx1ZUZpbGU9bnVsbDsKLSAgc3RhdGljIFN0cmluZyB0b3BEaXI9bnVsbDsKLSAgc3RhdGljIGludCB0b3BEaXJMPTA7Ci0KLSAgc3RhdGljIGJvb2xlYW4gc3BlY2NoYXJmb3VuZD1mYWxzZTsKLSAgc3RhdGljIGJvb2xlYW4gdG1wc3BlY2NoYXJmb3VuZD1mYWxzZTsKLQotICBzdGF0aWMgbG9uZyBkaWZmOwotCi0gIC8vUmVhZHMgYSBmaWxlIHdoZXJlIGVhY2ggcm93IGNvbnRhaW5zIHR3byB2YWx1ZXMgc2VwYXJhdGVkIHdpdGggXHQgc2lnbgotICAvLyBUaGUgc3ludGF4IG9mIGVhY2ggbGluZSBjYW4gYmUgZWlnaHRlcgotICAvLyB2YWx1ZSAgdmFsdWUKLSAgLy8gb3IKLSAgLy8gInZhbHVlIiAgICAidmFsdWUiCi0gIC8vCi0gIC8vIFRoZSBzeW50YXggbXVzdCBiZSB0aGUgc2FtZSBmb3IgZWFjaCByb3cgaW4gdGhlIGZpbGUuCi0gIHN0YXRpYyBib29sZWFuIHJlYWRUd29WYWx1ZUZpbGUoU3RyaW5nIGZpbGUsIFN0cmluZyBjaGFyYWN0ZXJTZXQpCi0gIHsKLSAgICAgICBJTy5wcmludERlYnVnKCJyZWFkVHdvVmFsdWVGaWxlICIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBpZihmaWxlPT1udWxsKQotICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpyZWFkVHdvVmFsdWVGaWxlIiArIEhlbHBNZXNzYWdlcy5JTlBVVF9QQVJBTUVURVJfTlVMTCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICB9Ci0gICAgICAgSU8ucHJpbnREZWJ1ZygiYmVmb3JlIGxvYWRmaWxlICIgICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3RyaW5nIGluZmlsZSA9IGxvYWRGaWxlKGZpbGUsY2hhcmFjdGVyU2V0KTsKLSAgICBJTy5wcmludERlYnVnKCJhZnRlciBsb2FkZmlsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZighaW5maWxlLmVxdWFscyhEZWYuTm9uZSkpCi0gICAgICB7Ci0gICAgICAgaWYoaW5maWxlLmNoYXJBdCgwKT09JyInKQotICAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcnNlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgIGluZmlsZSwgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICB0d29WYWx1ZUZpbGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLQotICAgICAgICAgICBTdHJpbmcgbGluZSA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgaW50IGZpcnN0Rm51dHQgPSBnZXRJbmRleChsaW5lLCJcIiIsMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgaW50IHNlY29uZEZudXR0ID0gZ2V0SW5kZXgobGluZSwiXCIiLCBmaXJzdEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgaW50IHRoaXJkRm51dHQgPSBnZXRJbmRleChsaW5lLCJcIiIsIHNlY29uZEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGludCBmb3J0aEZudXR0ID0gZ2V0SW5kZXgobGluZSwiXCIiLCB0aGlyZEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgaWYoZmlyc3RGbnV0dD09LTEgfHwgc2Vjb25kRm51dHQ9PS0xIHx8Ci0gICAgICAgICAgICAgICB0aGlyZEZudXR0PT0tMSB8fCBmb3J0aEZudXR0PT0tMSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgU3RyaW5nIGRlZiA9IGxpbmUuc3Vic3RyaW5nKGZpcnN0Rm51dHQrMSwgc2Vjb25kRm51dHQpOwotICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGxpbmUuc3Vic3RyaW5nKHRoaXJkRm51dHQrMSwgZm9ydGhGbnV0dCk7Ci0gICAgICAgICAgIHR3b1ZhbHVlRmlsZS5wdXQoZGVmLHRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgaW5maWxlLCAiXHRcbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgIHR3b1ZhbHVlRmlsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB0d29WYWx1ZUZpbGUucHV0KHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCkscGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy9SZXR1cm5zIHRoZSB0ZXh0IHdpdGhpbiB0aGUgdGl0bGUgdGFncyBpbiB0aGUgaW5wdXQgc3RyaW5nCi0gIHN0YXRpYyBTdHJpbmcgZ2V0VGl0bGUoU3RyaW5nIHJlYWxTdHJpbmcpCi0gIHsKLSAgICAgIGlmKHJlYWxTdHJpbmc9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpnZXRUaXRsZSIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICBTdHJpbmcgdXBwZXJTdHJpbmcgPSByZWFsU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgIGludCB0aXRsZVN0YXJ0ID0gZ2V0SW5kZXgodXBwZXJTdHJpbmcsICJUSVRMRSIsMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgaWYodGl0bGVTdGFydCE9LTEpCi0gICAgIHsKLSAgICAgICAgaW50IHRpdGxlU3RhcnRFbmRUID0gZ2V0SW5kZXgodXBwZXJTdHJpbmcsICI+Iix0aXRsZVN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZih0aXRsZVN0YXJ0RW5kVCE9LTEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgdGl0bGVFbmQgPSBnZXRJbmRleCh1cHBlclN0cmluZywgIjwvVElUTEUiLHRpdGxlU3RhcnRFbmRUKzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYodGl0bGVFbmQhPS0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IHJlYWxTdHJpbmcuc3Vic3RyaW5nKHRpdGxlU3RhcnRFbmRUKzEsdGl0bGVFbmQpLnRyaW0oKTsKLSAgICAgICAgICAgIHJldHVybiB0aXRsZTsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy9SZXR1cm4gdGhlIGluZGV4IHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgdGhlIHN0aW5nIG1hdGNoCi0gIC8vIHN0YXJ0cy4gU2VhcmNoZXMgZnJvbSB0aGUgaW5kZXggZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIHN0YXJ0Ci0gIHN0YXRpYyBpbnQgZ2V0SW5kZXgoU3RyaW5nIHN0ciwgU3RyaW5nIG1hdGNoLCBpbnQgc3RhcnQpCi0gIHsKLSAgICAgaWYoc3RyPT1udWxsKQotICAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6Z2V0SW5kZXhcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgfQotCi0gICAgICBpZihtYXRjaD09bnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOmdldEluZGV4XG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgIH0KLSAgICAgaW50IGZvdW5kID0gc3RyLmluZGV4T2YobWF0Y2gudG9VcHBlckNhc2UoKSwgc3RhcnQpOwotICAgICBpZihmb3VuZD09LTEpCi0gICAgIHsKLSAgICAgICAgZm91bmQgPSBzdHIuaW5kZXhPZihtYXRjaC50b0xvd2VyQ2FzZSgpLCBzdGFydCk7Ci0gICAgIH0KLQotICAgICBpZihmb3VuZD09LTEpCi0gICAgIHsKLSAgICAgICAgZm91bmQgPSBzdHIuaW5kZXhPZihtYXRjaCwgc3RhcnQpOwotICAgICB9Ci0gICAgIHJldHVybiBmb3VuZDsKLSAgfQotICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLy8gUHJpbnRzIHRoZSBhIHN0cmluZyB0byBhIERhdGFPdXRwdXRTdHJlYW0KLSAgIHN0YXRpYyBib29sZWFuIHByaW50KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLCBTdHJpbmcgc3RyKQotICAgewotICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotICAgICBpZihzdHI9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50XG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgIH0KLSAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICBvdXRQLndyaXRlKHN0ciwwLHN0ci5sZW5ndGgoKSk7Ci0gICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnQiICsgSGVscE1lc3NhZ2VzLldSSVRFX0VYQ0VQVElPTiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotICAgLy8gUHJpbnRzIHRoZSBhIHN0cmluZyB0byBhIERhdGFPdXRwdXRTdHJlYW0gaW4gVVRGIGZvcm1hdAotICAgc3RhdGljIGJvb2xlYW4gcHJpbnRVVEYoRGF0YU91dHB1dFN0cmVhbSBvdXRQLCBTdHJpbmcgc3RyKQotICAgewotICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnRVVEZcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotICAgICBpZihzdHI9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50VVRGXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgIH0KLSAgICAgICB0cnkKLSAgICAgICAgewotCi0gICAgICAgICBvdXRQLndyaXRlVVRGKHN0cik7Ci0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50VVRGIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgfQotCi0KLSAgc3RhdGljIHZvaWQgcHJpbnRTcGFjZShPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IG5vT2ZTcGFjZSkKLSAgIHsKLSAgICAgIGZvcihpbnQgaT0wO2k8bm9PZlNwYWNlO2krKykKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgIG91dFAud3JpdGUoIiZuYnNwOyIsMCw2KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpwcmludFNwYWNlIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgfQotCi0gICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLy8gUmVhZCBhIGZpbGUgYW5kIHJldHVybiBpdCBhcyBhIGNvbmNhdGVuYXRlZCBzdHJpbmcuCi0gICBzdGF0aWMgU3RyaW5nIGxvYWRGaWxlKFN0cmluZyBmaWxlTmFtZSxTdHJpbmcgY2hhcmFjdGVyc2V0KQotICAgewkgIAotCSAgIHRyeQotCSAgIHsKLQkJICAgcmV0dXJuIEZpbGVVdGlsLnJlYWRGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSwgY2hhcmFjdGVyc2V0KS50b1N0cmluZygpOyAgIAotCSAgIH0KLQkgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotCSAgIHsKLQkJICAgOwotCSAgIH0KLQkgICAKLQkgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLSAgIC8vIENvbnZlcnRzIGFsbCBsZXR0ZXJzIGxpa2UgXHVmZmZkLFx1ZmZmZCxcdWZmZmQgdG8gc3BlY2lhbCBjb2RlcwotICAgc3RhdGljIHZvaWQgc3BlY0NoYXIoU3RyaW5nIGluLCBTdHJpbmcgb3V0LCBTdHJpbmcgY2hhcmFjdGVyc2V0KQotICAgewotICAgICBpZihpbj09bnVsbCkKLSAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXJcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICAgfQotCi0gICAgIGlmKG91dD09bnVsbCkKLSAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXJcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICAgICBTdHJpbmcgdG1wRmlsZSA9ICIxM2Q4NC5od3IiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBpbmZpbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgdG1wSW5maWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShpbixjaGFyYWN0ZXJzZXQpOwotICAgICAgICBib29sZWFuIHdyaXRlUmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLQotICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UDsKLSAgICAgICAgICAgaWYoY2hhcmFjdGVyc2V0IT1udWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSxjaGFyYWN0ZXJzZXQpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBvdXRQID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICB3cml0ZVJlc3VsdCAgPSBNaXNjU3RhdGljLnByaW50KG91dFAsdG1wSW5maWxlKTsKLSAgICAgICAgICAgaWYoIXdyaXRlUmVzdWx0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpzcGVjQ2hhciIgKyBIZWxwTWVzc2FnZXMuV1JJVEVfRVhDRVBUSU9OICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpbik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgb3V0UC5jbG9zZSgpOwotICAgICAgICAgfQotICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnNwZWNDaGFyIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUpOwotICAgICAgICAgfQotCi0gICAgICAgICAgIGlmKHdyaXRlUmVzdWx0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaW5maWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZSh0bXBGaWxlLGNoYXJhY3RlcnNldCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaW5maWxlPW51bGw7Ci0gICAgICAgICAgIH0KLQotCi0KLQotICAgICAgICBpZihpbmZpbGUhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdGZpbGU9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8aW5maWxlLmxlbmd0aCgpO2krKykKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wc3BlY2NoYXJmb3VuZD1mYWxzZTsKLSAgICAgICAgICAgICAgICBjaGFyIHQgPSBpbmZpbGUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmKHQhPScmJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCh0PidhJyAmJiB0PCd6JykgfHwgKHQ+J0EnICYmIHQ8J1onKSB8fCAodD4nMCcgJiYgdDwnOScpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHQ9PSc8JyB8fCB0PT0nPicgfHwgdD09Jy8nIHx8IHQ9PScuJyB8fCB0PT0nPScgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdD09Jy0nIHx8IHQ9PSclJyB8fCB0PT0nQCcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGZpbGUuYXBwZW5kKHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGZpbGUuYXBwZW5kKE1pc2NTdGF0aWMudG9TcGVjQ2hhcih0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBjaGFyIHQyID0gaW5maWxlLmNoYXJBdChpKzEpOwotICAgICAgICAgICAgICAgICAgIGlmKHQyPT0nICcgfHwgdDI9PSdcbicpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ZmlsZS5hcHBlbmQoIiZhbXA7Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgIHRtcHNwZWNjaGFyZm91bmQ9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHRmaWxlLmFwcGVuZChNaXNjU3RhdGljLnRvU3BlY0NoYXIodCkpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYodG1wc3BlY2NoYXJmb3VuZD09dHJ1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgc3BlY2NoYXJmb3VuZD10cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpZihzcGVjY2hhcmZvdW5kKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLldSSVRFX0ZJTEUgKyBvdXQpOwotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvdXRQOwotICAgICAgICAgICAgICAgIGlmKGNoYXJhY3RlcnNldCE9bnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvdXRQID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpLGNoYXJhY3RlcnNldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgcmVzdWx0ZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBvdXRQLmNsb3NlKCk7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgc3BlY2NoYXJmb3VuZD1mYWxzZTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXIiICsgSGVscE1lc3NhZ2VzLldSSVRFX0VYQ0VQVElPTiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgRmlsZSB0bXAgPSBuZXcgRmlsZSh0bXBGaWxlKTsKLSAgICAgICAgICAgICAgdG1wLmRlbGV0ZSgpOwotCi0gICAgIH0KLSAgIH0KLQotICAgLy9jb252ZXJ0cyBhIGNoYXJhY3RlciB0byBhIHNwZWNpYWwgY29kZSBpZiBuZWVkZWQKLSAgIHN0YXRpYyBTdHJpbmcgdG9TcGVjQ2hhcihjaGFyIHRva2VuKQotICAgewotICAgICAgICB0bXBzcGVjY2hhcmZvdW5kPXRydWU7Ci0gICAgICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICAgcmV0dXJuICImYXJpbmc7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCSAgICAgIHJldHVybiAiJkFyaW5nOyI7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImQXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCSAgICB7Ci0JCSByZXR1cm4gIiZhdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZPdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZvdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJkVhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZFZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgICByZXR1cm4gIiZVdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJmFhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZBYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImYWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmVhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZlZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWFjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmV1bWw7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImb2FjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZvZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZ1YWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImdWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJIHsKLQkJCXJldHVybiAiJnV1bWw7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkgaWYodG9rZW49PSdcdWZmZmQnKQotCQkgewotCQkJcmV0dXJuICImeXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCSB9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImYWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJkFjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmVjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJcmV0dXJuICImRWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgIHJldHVybiAiJnVjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImVWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImb2NpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCSBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJk9jaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZBRWxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZhZWxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImSWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZBZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLSAgICAgICAgewotCSAgICAgICByZXR1cm4gIiZBdGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJmF0aWxkZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZFVEg7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImZXRoOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJklncmF2ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgICByZXR1cm4gIiZOdGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZudGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImT3RpbGRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJm90aWxkZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZzemxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJlRIT1JOOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJnRob3JuOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0gICAgICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgIHJldHVybiAiJk9zbGFzaDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgcmV0dXJuICImb3NsYXNoOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZPZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJICByZXR1cm4gIiZVZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICByZXR1cm4gIiZpdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJICByZXR1cm4gIiZZYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICByZXR1cm4gIiZ5YWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJkNjZWRpbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmNjZWRpbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKmlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImZnJhYzEyOyI7Ci0JCX0qLwotCi0gICAgICAgIHRtcHNwZWNjaGFyZm91bmQgPSBmYWxzZTsKLQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIodG9rZW4pLnRvU3RyaW5nKCk7Ci0KLSAgICAgfQotCi0gICAgICAvKioKLSAgKiBUcmltcyBkb3VibGUgcXVvdGVzIGZyb20gYW4gYXJndW1lbnQuCi0gICogQHBhcmFtIHN0cgl0aGUgc3RyaW5nIHRvIHRyaW0uCi0gICogQHJldHVybiB0aGUgdHJpbW1lZCBzdHJpbmcuCi0gKiovCi0KLSBzdGF0aWMgU3RyaW5nIHRyaW1RdW90ZXMoU3RyaW5nIHN0cikgewotCi0gIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gIGlmKGxlbiA8PSAwKSByZXR1cm4gc3RyOwotCi0gIGlmKHN0ci5jaGFyQXQobGVuIC0gMSkgPT0gJyInKSBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICBpZihzdHIuY2hhckF0KDApID09ICciJykgc3RyID0gc3RyLnN1YnN0cmluZygxKTsKLQotICByZXR1cm4gc3RyOwotICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvT1MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9PUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTU1NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9PUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLQotZmluYWwgY2xhc3MgT1MKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luZG93czk4ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3M5NSA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzTlQgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWFjaW50b3NoID0gZmFsc2U7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzOwotCi0gICAgICAgIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGlmKHMuZXF1YWxzKCJXaW5kb3dzIE5UIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgICAgaXNXaW5kb3dzTlQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocy5lcXVhbHMoIldpbmRvd3MgOTUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBpc1dpbmRvd3M5NSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihzLmVxdWFscygiV2luZG93cyA5OCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzV2luZG93czk4ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzLmVxdWFscygiTWFjaW50b3NoIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCSBzLmVxdWFscygibWFjb3MiKSB8fAkJLy9BcHBsZXQgVmlld2VyIC8vJE5PTi1OTFMtMSQKLQkJCQkgcy5lcXVhbHMoIk1hYyBPUyIpIHx8CQkvL05ldHNjYXBlIC8vJE5PTi1OTFMtMSQKLQkJCQkgcy5lcXVhbHMoIk1hY09TIikpCQkJLy9JbnRlcm5ldCBFeHBsb2RlciAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzTWFjaW50b3NoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT1MoKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChpc1dpbmRvd3M5NSgpIHx8IGlzV2luZG93c05UKCkgfHwgaXNXaW5kb3dzOTgpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzV2luZG93czk1KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNXaW5kb3dzOTUpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzV2luZG93c05UKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNXaW5kb3dzTlQpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzTWFjaW50b3NoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNNYWNpbnRvc2gpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3BlY0tleVdvcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9TcGVjS2V5V29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQxZmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9TcGVjS2V5V29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotLy9BIGtleXdvcmQgZGVmaW5lZCBpbiBhIHNlcGFyYXRlIGZpbGUKLS8vVGhpcyBrZXl3b3JkIHJlZmZlcnMgdG8gYSBrZXl3b3JkIGRlZmluZWQgaW4gYSBodG1sIGZpbGUKLWNsYXNzIFNwZWNLZXlXb3JkCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVsYXRlZEtleVdvcmQ9bnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2VlPXRydWU7Ci0KLSAgICBTcGVjS2V5V29yZChTdHJpbmcgcmVsYXRlZEtleVdvcmQsIGJvb2xlYW4gbW9kZSkKLSAgICB7Ci0gICAgICAgIGlmKHJlbGF0ZWRLZXlXb3JkPT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3BlY0tleVdvcmQ6U3BlY0tleVdvcmRcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICB0aGlzLnJlbGF0ZWRLZXlXb3JkID0gcmVsYXRlZEtleVdvcmQ7Ci0gICAgICAgdGhpcy5zZWUgPSBtb2RlOwotICAgIH0KLQotICAgIC8vUHJpbnRzIHRoZSBrZXl3b3JkCi0gICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCkKLSAgICB7Ci0gICAgICBpZihvdXRQPT1udWxsKQotICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTcGVjS2V5V29yZDpwcmludFxuIiArIEhlbHBNZXNzYWdlcy5CQURfT1VUUFVUX1NUUkVBTSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmKHJlbGF0ZWRLZXlXb3JkIT1udWxsKQotICAgICAgewotICAgICAgIGlmKHNlZSkKLSAgICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0U2VlKCkpOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFNlZUFsc28oKSk7Ci0gICAgICAgfQotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICI8QSBIUkVGPVwiIyIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgcmVsYXRlZEtleVdvcmQgKyAiXCI+IiArIHJlbGF0ZWRLZXlXb3JkICsgIjwvQT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGlzU2VlKCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIHNlZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L1N0cmluZ0RlZmluaXRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3RyaW5nRGVmaW5pdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjNmQ4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3RyaW5nRGVmaW5pdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0vKipDbGFzc2VzIHVzZWQgZm9yIGFsbCBzdHJpbmcgbWVzc2FnZXMgdGhhdCBtYXkgbmVlZCB0byBiZSBsb2NhbGl6ZWQKLSAqLwotY2xhc3MgU3RyaW5nRGVmaW5pdGlvbnMKLXsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9ERUZJTklUSU9OX0ZJTEVfTk9UX0ZPVU5EID0gIlRoZSBjb25maWd1cmF0aW9uL2RlZmluaXRpb24gZmlsZXMgaGFzIG5vdCBiZWVuIGRlZmluZWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NzFkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyB0aGUgaW5kZXggYW5kIGdsb3NzYXJ5IHBhZ2VzIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWM2ZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHB1Ymxpc2hpbmcgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvc2VhcmNoL1N0b3BXb3JkUmVhZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvc2VhcmNoL1N0b3BXb3JkUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjRjNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9TdG9wV29yZFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGluIGEgY29uZmlndXJhdGlvbiBmaWxlIG9mIHN0b3Agd29yZHMKLSAqIGFuZCBwcm92aWRlcyB0aGUgc3RvcCB3b3JkcyBhcyBhIGxpc3QuIDxicj4KLSAqLwotY2xhc3MgU3RvcFdvcmRSZWFkZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgX3N0b3B3b3JkcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgU3RvcFdvcmRSZWFkZXIoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgc2V0IG9mIHN0b3B3b3JkcyBmcm9tIHRoZSBnaXZlbiBmaWxlLgotCSAqLwotCXN0YXRpYyBTdHJpbmdbXSBnZXRTdG9wd29yZHMoIFN0cmluZyBmaWxlcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lICkKLQl7Ci0JCWlmKCBudWxsID09IF9zdG9wd29yZHMgKQotCQl7Ci0JCQlfc3RvcHdvcmRzID0gbmV3IFZlY3RvcigpOwotCi0JICAgIAl0cnkKLSAJICAgCQl7Ci0JCQkJLy8gcmVhZCBpbiB0aGUgZmlsZQotCQkJCVN0cmluZyBmdWxsRmlsZW5hbWUgPSBmaWxlcGF0aCArCi0JCQkJCQkJCQkgIEZpbGUuc2VwYXJhdG9yICsKLQkJIAkJCQkJCQkgIGZpbGVuYW1lOwotCQkgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZ1bGxGaWxlbmFtZSApOwotCQkJCUlucHV0U3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggaW5TdHJlYW0gKTsKLQkJCQlCdWZmZXJlZFJlYWRlciByZWFkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHN0cmVhbVJlYWRlcik7Ci0vKgkgIAkgICAgCWNoYXJbXSBjaGFyUmVhZCA9IG5ldyBjaGFyWyBpblN0cmVhbS5hdmFpbGFibGUoKSBdOwotCSAgICAgICAgCXN0cmVhbVJlYWRlci5yZWFkKCBjaGFyUmVhZCApOwotCSAgICAgICAgCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyggY2hhclJlYWQgKTsKLSovCi0KLQkJCQlTdHJpbmcgd29yZCA9IHJlYWQucmVhZExpbmUoKTsKLQkJCQl3aGlsZSAod29yZCAhPSBudWxsKQotCQkJCXsKLQkJCQkJX3N0b3B3b3Jkcy5hZGQod29yZCk7Ci0JCQkJCXdvcmQgPSByZWFkLnJlYWRMaW5lKCk7Ci0JCQkJfQotCi0JICAgICAgICAJLy8gY2xvc2Ugc3RyZWFtCi0JICAgICAgICAJcmVhZC5jbG9zZSgpOwotCSAgICAgICAgCXN0cmVhbVJlYWRlci5jbG9zZSgpOwotCSAgICAgICAgCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkgICAgICAgIAkvLyBwYXJzZUNvbnRlbnQKLS8vCSAgICAgICAgCXBhcnNlQ29udGVudCggY29udGVudCwgX3N0b3B3b3JkcyApOwotCQkJfQotCQkJY2F0Y2goIEV4Y2VwdGlvbiBlICkKLQkJCXsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0W10gc3RvcE9iamVjdHMgPSBfc3RvcHdvcmRzLnRvQXJyYXkoKTsKLQkJU3RyaW5nW10gc3RvcFN0cmluZ3MgPSBuZXcgU3RyaW5nWyBzdG9wT2JqZWN0cy5sZW5ndGggXTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBzdG9wT2JqZWN0cy5sZW5ndGg7IGkrKyApCi0JCXsKLQkJCXN0b3BTdHJpbmdzWyBpIF0gPSAoU3RyaW5nKXN0b3BPYmplY3RzWyBpIF07Ci0JCX0KLQkJcmV0dXJuKCBzdG9wU3RyaW5ncyApOwotCi0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBjb250ZW50IGludG8gc3RvcHdvcmRzLgotCSAqLwotLyoKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlQ29udGVudCggU3RyaW5nIGNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBfc3RvcHdvcmRzICkKLQl7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBjb250ZW50LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCAibGluZS5zZXBhcmF0b3IiICkgKTsKLQkJd2hpbGUoIHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSApCi0JCXsKLQkJCV9zdG9wd29yZHMuYWRkRWxlbWVudCggdG9rZW5pemVyLm5leHRFbGVtZW50KCkgKTsKLQkJfQotCX0KLSovCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9zZWFyY2gvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmI2NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBpbmRleGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL1B1Ymxpc2hpbmdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9QdWJsaXNoaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMwMzU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL1B1Ymxpc2hpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIHB1Ymxpc2hpbmcuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdVdGlsIHsKLQotCS8qKgotCSAqIFppcHMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgaW50byBhIEpBUiBmaWxlLgotCSAqIDxwPgotCSAqIE5vbi1zdWItZm9sZGVycyBhcmUgaW5jbHVkZWQuCi0JICogCi0JICogQHBhcmFtIGphckRpcgotCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSB0byBiZSB6aXBwZWQKLQkgKiBAcGFyYW0gamFyRmlsZQotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBKQVIgZmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIEpBUiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGphckZpbGVzKEZpbGUgamFyRGlyLCBGaWxlIGphckZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGphckRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGphckZpbGUuZXhpc3RzKCkpIHsKLQkJCWphckZpbGUuZGVsZXRlKCk7Ci0JCX0KLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYlN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKLQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShqYXJGaWxlKSk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBwZXJTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKGJTdHJlYW0pOwotCi0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzQwOTZdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07Ci0JCQlpZiAoY3VycmVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJWmlwRW50cnkgY3VyckVudHJ5ID0gbmV3IFppcEVudHJ5KGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0JCQl6aXBwZXJTdHJlYW0ucHV0TmV4dEVudHJ5KGN1cnJFbnRyeSk7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oY3VycmVudEZpbGUpKTsKLQkJCXdoaWxlIChiaVN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQlpbnQgbnVtID0gYmlTdHJlYW0ucmVhZChieXRlcyk7Ci0JCQkJemlwcGVyU3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBudW0pOwotCQkJfQotCQkJYmlTdHJlYW0uY2xvc2UoKTsKLQkJCXppcHBlclN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JCX0KLQkJemlwcGVyU3RyZWFtLmNsb3NlKCk7Ci0JCWJTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgY29udGVudCBmb3IgYSBnaXZlbiBYTUwgZWxlbWVudCBhbmQgWFNMIGZpbGUgcGF0aAotCSAqIAotCSAqIEBwYXJhbSB4bWxFbGVtZW50Ci0JICogICAgICAgICAgICBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgWE1MIHJlcHJlc2VudGF0aW9uIGZvciBhIG1ldG9kCi0JICogICAgICAgICAgICBlbGVtZW50Ci0JICogQHBhcmFtIHhzbFBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gYSBYU0wgZmlsZQotCSAqIEByZXR1cm4gdGhlIG91dHB1dCBIVE1MCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHRtbChYbWxFbGVtZW50IHhtbEVsZW1lbnQsIFN0cmluZyB4c2xQYXRoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgdGhlIGxhbmd1YWdlIGF0dHJpYnV0ZQotCQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQlTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQkJeG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlVUkwgdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCXhzbFBhdGgpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiVW5hYmxlIHRvIGFjY2VzcyBYU0wgdGVtcGxhdGUgIiArIHhzbFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyB4c2xVUkkgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBnZW5lcmF0ZSB0aGUgSFRNTAotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsVVJJLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCi0JCQkvLyB1cmxzIGFyZSBlbmNvZGVkIGluIFhTTFQgb3V0cHV0LCBkZWNvZGUgaXQKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlcgotCQkJCQkuZGVjb2RlVXJsc0luQ29udGVudChzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGdlbmVyYXRlIEhUTUwiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGEgdmlldyB0aGF0IHJlZmVyZW5jZXMgYSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgYSB2aWV3IHRoYXQKLQkgKiAgICAgICAgIHJlZmVyZW5jZXMgYSBwcm9jZXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1ZhbGlkUHJvY2Vzc1ZpZXcoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlQcm9jZXNzIHByb2Nlc3MpIHsKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpCi0JCQkJLml0ZXJhdG9yKCk7IHZpZXdzLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gdmlld3MubmV4dCgpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSB2aWV3OwotCQkJCWZvciAoSXRlcmF0b3I8RGVzY3JpYmFibGVFbGVtZW50PiBpdCA9IGNjCi0JCQkJCQkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJaWYgKCgoUHJvY2VzcykgZWxlbWVudCkuZ2V0R3VpZCgpID09IHByb2Nlc3MuZ2V0R3VpZCgpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCQotCQkvL1J1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0JCS8vbG9uZyBtMSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKS8xMDAwMDAwOwotCQlQZXJzaXN0ZW5jZVV0aWwudW5sb2FkKHJlc291cmNlcyk7Ci0JCS8vUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsJCQotCQkvL2xvbmcgbTIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkvMTAwMDAwMDsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgTG9uZy50b1N0cmluZyhtMi1tMSkgKyAiIE1CIGZyZWVkIGJ5IHVubG9hZGluZyByZXNvdXJjZXMiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBtZ3JzLCBDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBrZWVwbGlzdCkgewotCQlmb3IgKCBJdGVyYXRvcjxEaWFncmFtTWFuYWdlcj4gaXQgPSBtZ3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIGtlZXBsaXN0ID09IG51bGwgfHwgIWtlZXBsaXN0LmNvbnRhaW5zKG1ncikgKSB7Ci0JCQkJbWdyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cENsaWVudFRpbWVvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cENsaWVudFRpbWVvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNDM2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBDbGllbnRUaW1lb3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgc3VuLm5ldC53d3cuaHR0cC5IdHRwQ2xpZW50OwotLy9pbXBvcnQgc3VuLm5ldC4qOwotLy9pbXBvcnQgc3VuLm5ldC53d3cuKjsKLWNsYXNzIEh0dHBDbGllbnRUaW1lb3V0IGV4dGVuZHMgSHR0cENsaWVudAotewotCXByaXZhdGUgaW50IHRpbWVvdXQgPSAwIDsKLQotICAgIEh0dHBDbGllbnRUaW1lb3V0KFVSTCB1cmwsIFN0cmluZyBwcm94eSwgaW50IHByb3h5UG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJc3VwZXIodXJsLCBwcm94eSwgcHJveHlQb3J0KTsKLQkJX3NldFRpbWVvdXQodGltZW91dCk7Ci0KLQl9Ci0KLSAgICBIdHRwQ2xpZW50VGltZW91dChVUkwgdXJsLCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlzdXBlcih1cmwsIChTdHJpbmcpbnVsbCwgLTEpOwotCQlzZXRUaW1lb3V0KHRpbWVvdXQpOwotICAgIH0KLQotCXByaXZhdGUgdm9pZCBfc2V0VGltZW91dChpbnQgaSkKLSAgICAJdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotCXsKLSAgICAJdGhpcy50aW1lb3V0ID0gaTsKLSAgICAJc2VydmVyU29ja2V0LnNldFNvVGltZW91dChpKSA7Ci0gCX0KLQotICAgIC8qIFRoaXMgY2xhc3MgaGFzIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgSFRUUC4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8KLSAgICAgKiBnZXQgYW4gSHR0cENsaWVudCB0byB0aGUgc3BlY2lmZWQgVVJMLiAgSWYgdGhlcmUncyBjdXJyZW50bHkgYW4KLSAgICAgKiBhY3RpdmUgSHR0cENsaWVudCB0byB0aGF0IHNlcnZlci9wb3J0LCB5b3UnbGwgZ2V0IHRoYXQgb25lLgotCSAqCi0JICogbm8gbG9uZ2VyIHN5bmNyaG9uaXplZCAtLSBpdCBzbG93cyB0aGluZ3MgZG93biB0b28gbXVjaAotCSAqIHN5bmNocm9uaXplIGF0IGEgaGlnaGVyIGxldmVsCi0gICAgICovCi0gICAgc3RhdGljIEh0dHBDbGllbnRUaW1lb3V0IEdldE5ldyhVUkwgdXJsLCBpbnQgdGltZW91dCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvKiBzZWUgaWYgb25lJ3MgYWxyZWFkeSBhcm91bmQgKi8KLQkJSHR0cENsaWVudFRpbWVvdXQgcmV0ID0gKEh0dHBDbGllbnRUaW1lb3V0KSBrYWMuZ2V0KHVybCk7Ci0JCWlmIChyZXQgPT0gbnVsbCkgewotCSAgICAJcmV0ID0gbmV3IEh0dHBDbGllbnRUaW1lb3V0ICh1cmwsIHRpbWVvdXQpOyAgLy8gQ1RPUiBjYWxsZWQgb3BlblNlcnZlcigpCi0JCX0gZWxzZSB7Ci0JICAgIAlyZXQudXJsID0gdXJsOwotCQl9Ci0JCS8vIGRvbid0IGtub3cgaWYgd2UncmUga2VlcGluZyBhbGl2ZSB1bnRpbCB3ZSBwYXJzZSB0aGUgaGVhZGVycwotCQkvLyBmb3Igbm93LCBrZWVwaW5nQWxpdmUgaXMgZmFsc2UKLQkJcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuU2VydmVyKFN0cmluZyBzLCBpbnQgaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBkb0Nvbm5lY3QocywgaSk7Ci0gICAgICAgIHNlcnZlck91dHB1dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc2VydmVyU29ja2V0LmdldE91dHB1dFN0cmVhbSgpKSk7Ci0gICAgICAgIHNlcnZlclNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgICBzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KHRpbWVvdXQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwUmVzcG9uc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTNmMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAwOS8yMS8yMDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwUmVzcG9uc2UgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DT09LSUVfTkFNRSA9ICJTTVNFU1NJT04iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgY2xhc3MgQ29va2llIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCXByaXZhdGUgU3RyaW5nIGRvbWFpbjsKLQkJcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCQlDb29raWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0KLQkJU3RyaW5nIGdldERvbWFpbigpIHsKLQkJCXJldHVybiBkb21haW47Ci0JCX0KLQotCQl2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7Ci0JCQl0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQkJfQotCi0JCVN0cmluZyBnZXRQYXRoKCkgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQotCQl2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCSAgICAJdHJ5IHsKLQkgICAgICAgIAlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkgICAgCX0KLQkgICAgCWNhdGNoKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIAlyZXR1cm4gbnVsbDsKLQkgICAgCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIihuYW1lPSIrbmFtZSsiLCB2YWx1ZT0iK3ZhbHVlKyIsIGRvbWFpbj0iK2RvbWFpbisiLCBwYXRoPSIrcGF0aCsiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci0JfQotCQlwcml2YXRlIGludCBzdGF0dXM7Ci0JCXByaXZhdGUgUHJvcGVydGllcyBoZWFkZXJzOwotCQlwcml2YXRlIFZlY3RvciBjb29raWVzOwotCi0JCXByaXZhdGUgU3RyaW5nIGRhdGE7Ci0KLQkJSHR0cFJlc3BvbnNlKGludCBzdGF0dXMsIFByb3BlcnRpZXMgaGVhZGVycywgVmVjdG9yIGNvb2tpZXMsIFN0cmluZyBkYXRhKSB7Ci0JCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJCXRoaXMuaGVhZGVycyA9IGhlYWRlcnM7Ci0JCQl0aGlzLmNvb2tpZXMgPSBjb29raWVzOwotCQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJfQotCi0JCWludCBnZXRTdGF0dXMoKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJUHJvcGVydGllcyBnZXRIZWFkZXJzKCkgewotCQkJcmV0dXJuIGhlYWRlcnM7Ci0JCX0KLQotCQlWZWN0b3IgZ2V0Q29va2llcygpIHsKLQkJCXJldHVybiBjb29raWVzOwotCQl9Ci0KLQkJU3RyaW5nIGdldERhdGEoKSB7Ci0JCQlyZXR1cm4gZGF0YTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKHN0YXR1cz0iK3N0YXR1cysiLCBoZWFkZXJzPSIraGVhZGVycysiLCBjb29raWVzPSIrY29va2llcysiLCBkYXRhPSIrZGF0YSsiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBUaW1lb3V0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyNDA5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBUaW1lb3V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlckZhY3Rvcnk7Ci0KLWNsYXNzIEh0dHBUaW1lb3V0RmFjdG9yeSBpbXBsZW1lbnRzIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBpbnQgdGltZW91dDsKLQlIdHRwVGltZW91dEZhY3RvcnkoaW50IHRpbWVvdXQpIHsgdGhpcy50aW1lb3V0ID0gdGltZW91dDsgfQotCXB1YmxpYyBVUkxTdHJlYW1IYW5kbGVyIGNyZWF0ZVVSTFN0cmVhbUhhbmRsZXIoU3RyaW5nIHN0cikKLQl7Ci0JCUh0dHBUaW1lb3V0SGFuZGxlciBoYW5kbGVyID0gbmV3IEh0dHBUaW1lb3V0SGFuZGxlcigpOwotCQloYW5kbGVyLnNldFRpbWVvdXQodGltZW91dCk7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFRpbWVvdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTNhMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1jbGFzcyBIdHRwVGltZW91dEhhbmRsZXIgZXh0ZW5kcyBzdW4ubmV0Lnd3dy5wcm90b2NvbC5odHRwLkhhbmRsZXIgaW1wbGVtZW50cyBUaW1lb3V0SGFuZGxlcgotewotCXByaXZhdGUgaW50IHRpbWVvdXQgPSAwOwotCi0JSHR0cFRpbWVvdXRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUh0dHBUaW1lb3V0SGFuZGxlcihpbnQgdGltZW91dCkgewotCQl0aGlzKCk7Ci0JCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7Ci0JfQotCi0gICAgcHJvdGVjdGVkIGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0KHUsIHRoaXMsIHRpbWVvdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICAJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0UHJveHkoKSB7IHJldHVybiBwcm94eTsgfQkJLy8gYnJlYWtpbmcgZW5jYXBzdWxhdGlvbgotICAgIGludCBnZXRQcm94eVBvcnQoKSB7IHJldHVybiBwcm94eVBvcnQ7IH0gICAgLy8gYnJlYWtpbmcgZW5jYXBzdWxhdGlvbgotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGltZW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVVJMQ29ubmVjdGlvblRpbWVvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4NjYxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGltZW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IHN1bi5uZXQud3d3Lmh0dHAuSHR0cENsaWVudDsKLQotY2xhc3MgSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0IGV4dGVuZHMgc3VuLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbgotewotCXByaXZhdGUgaW50IHRpbWVvdXQ7Ci0JcHJpdmF0ZSBIdHRwVGltZW91dEhhbmRsZXIgdGltZW91dEhhbmRsZXI7Ci0KLSAgCUh0dHBVUkxDb25uZWN0aW9uVGltZW91dChVUkwgdSwgSHR0cFRpbWVvdXRIYW5kbGVyIGhhbmRsZXIsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0gICAgCXN1cGVyKHUsIGhhbmRsZXIpOwotCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCQl0aW1lb3V0SGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0KFVSTCB1LCAgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotICAgIAlzdXBlcih1LCBob3N0LCBwb3J0KTsKLSAgICAJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGNvbm5lY3RlZCkgewotCSAgICAJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JICAgIAlpZiAoImh0dHAiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkgLyogJiYgIWZhaWxlZE9uY2UgPC0gUFJJVkFURSAqLyApIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGZvciBzYWZldHkncyBzYWtlLCBhcyByZXBvcnRlZCBieSBLTEdyb3VwCi0JCQkJc3luY2hyb25pemVkICh1cmwpIHsKLQkJCQkJaHR0cCA9IEh0dHBDbGllbnRUaW1lb3V0LkdldE5ldyh1cmwsIHRpbWVvdXQpOwotCQkJCX0KLQkgICAgCX0KLQkgICAgCWVsc2UgewotCQkJCS8vIG1ha2Ugc3VyZSB0byBjb25zdHJ1Y3QgbmV3IGNvbm5lY3Rpb24gaWYgZmlyc3QKLQkJCQkvLyBhdHRlbXB0IGZhaWxlZAotCQkJCWh0dHAgPSBuZXcgSHR0cENsaWVudFRpbWVvdXQodXJsLCB0aW1lb3V0SGFuZGxlci5nZXRQcm94eSgpLCB0aW1lb3V0SGFuZGxlci5nZXRQcm94eVBvcnQoKSwgdGltZW91dCk7Ci0JICAgIAl9Ci0JICAgIAlwcyA9IChQcmludFN0cmVhbSlodHRwLmdldE91dHB1dFN0cmVhbSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JICAgIAl0aHJvdyBlOwotCQl9Ci0JCS8vIHRoaXMgd2FzIG1pc3NpbmcgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbgotCQljb25uZWN0ZWQgPSB0cnVlOwotCX0KLQotICAgIHByb3RlY3RlZCBIdHRwQ2xpZW50IGdldFByb3hpZWRDbGllbnQoVVJMIHVybCwgU3RyaW5nIHMsIGludCBpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiAoSHR0cENsaWVudCluZXcgSHR0cENsaWVudFRpbWVvdXQodXJsLCBzLCBpLCB0aW1lb3V0KTsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEh0dHBDbGllbnQgb2JqZWN0LCBieXBhc3NpbmcgdGhlIGNhY2hlIG9mCi0gICAgICogSFRUUCBjbGllbnQgb2JqZWN0cy9jb25uZWN0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwJdGhlIFVSTCBiZWluZyBhY2Nlc3NlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBIdHRwQ2xpZW50IGdldE5ld0NsaWVudChVUkwgdXJsKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAoSHR0cENsaWVudCkobmV3IEh0dHBDbGllbnRUaW1lb3V0ICh1cmwsIChTdHJpbmcpbnVsbCwgLTEsIHRpbWVvdXQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzQ1NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuQXV0aGVudGljYXRvcjsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uOwotaW1wb3J0IGphdmEubmV0LlByb3h5OwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eS5JUHJveHlEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgMDkvMjEvMjAwMQotICovCi1wdWJsaWMgY2xhc3MgSHR0cFV0aWwgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkvKioKLQkgKiBEbyBhIEdFVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoU29ja2V0IHNvY2ssIFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycykgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaW50IHJlc3BTdGF0dXM7Ci0JCVByb3BlcnRpZXMgcmVzcEhlYWRlcnMgPSBuZXcgUHJvcGVydGllcygpOwotCQlWZWN0b3IgcmVzcENvb2tpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCVN0cmluZyByZXNwID0gbnVsbDsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGhvc3QgPSBzb2NrLmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdE5hbWUoKTsKLQkJCWludCBwb3J0ID0gc29jay5nZXRQb3J0KCk7Ci0JCQlvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShzb2NrLmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrLmdldElucHV0U3RyZWFtKCkpKTsKLQkJCW91dC53cml0ZUJ5dGVzKCJHRVQgIiArIHVybCArICIgSFRUUC8xLjFcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlQnl0ZXMoIkhvc3Q6ICIgKyBob3N0ICsgIjoiICsgcG9ydCArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlvdXQud3JpdGVCeXRlcygiVXNlci1BZ2VudDogTW96aWxsYS80LjBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC53cml0ZUJ5dGVzKCJDb250ZW50LUxlbmd0aDogMFxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc2VuZCBhZGRpb25hbCBoZWFkZXJzIGlmIGFueQotCQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJCUVudW1lcmF0aW9uIG5hbWVzID0gaGVhZGVycy5rZXlzKCk7Ci0JCQkJd2hpbGUobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiSG9zdCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVXNlci1BZ2VudCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1MZW5ndGgiKSkgY29udGludWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCW91dC53cml0ZUJ5dGVzKG5hbWUgKyAiOiAiICsgaGVhZGVycy5nZXRQcm9wZXJ0eShuYW1lKSArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCW91dC53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC5mbHVzaCgpOwotCQkJU3RyaW5nIGxpbmU7Ci0JCQlib29sZWFuIGVuZEZvdW5kID0gZmFsc2U7Ci0JCQlpbnQgY29udGVudExlbiA9IC0xOwotCQkJZmluYWwgU3RyaW5nIGNvbnRlbnRMZW5IZWFkZXIgPSAiY29udGVudC1sZW5ndGg6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBjb250ZW50TGVuSGVhZGVyTGVuID0gY29udGVudExlbkhlYWRlci5sZW5ndGgoKTsKLQkJCVN0cmluZyBodHRwUmVzcCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIHJlYWQgdGhlIGZpcnN0IGxpbmUKLQkJCWxpbmUgPSBpbi5yZWFkTGluZSgpOwotCQkJLy9sb2dnZXIuZGVidWcoImxpbmU9IitsaW5lKTsKLQkJCWlmKGxpbmUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUHVibGlzaGluZ1Jlc291cmNlcy5zZXJ2ZXJFcnJvcl9tc2cpOyAKLQkJCX0KLQkJCWh0dHBSZXNwICs9IGxpbmUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lKTsKLQkJCXRyeSB7Ci0JCQkJLy8gc2tpcCB0aGUgZmlyc3QgdG9rZW4gd2hpY2ggaXMgIkhUVFAvMS4xIiBvciAiSFRUUC8xLjAiCi0JCQkJdG9rZW5zLm5leHRUb2tlbigpOwotCQkJCXJlc3BTdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2csIChuZXcgT2JqZWN0W117aG9zdCwgSW50ZWdlci50b1N0cmluZyhwb3J0KSwgbGluZX0pKSk7IAotCQkJfQotCi0JCQkvLyByZWFkIHRoZSBoZWFkZXJzCi0JCQl3aGlsZSgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkvL2xvZ2dlci5kZWJ1ZygibGluZT0iK2xpbmUpOwotCQkJCWh0dHBSZXNwICs9IGxpbmUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJaWYobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuZEZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWludCBpZCA9IGxpbmUuaW5kZXhPZigiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGlkID4gMCkgewotCQkJCQlTdHJpbmcgaGVhZGVyID0gbGluZS5zdWJzdHJpbmcoMCwgaWQpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmKGxpbmUubGVuZ3RoKCkgPiBpZCArIDIpIHsKLQkJCQkJCXZhbHVlID0gbGluZS5zdWJzdHJpbmcoaWQgKyAyKTsKLQkJCQkJfQotCi0JCQkJCWlmKGhlYWRlci5lcXVhbHNJZ25vcmVDYXNlKCJzZXQtY29va2llIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBwYXJzZUNvb2tpZSh2YWx1ZSk7Ci0JCQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQkJCXJlc3BDb29raWVzLmFkZEVsZW1lbnQoY29va2llKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3BIZWFkZXJzLnB1dChoZWFkZXIsIHZhbHVlKTsKLQkJCQkJfQotCi0JCQkJCS8vcmVzcEhlYWRlcnMucHV0KGhlYWRlciwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBjb250ZW50TGVuU3RyID0gcmVzcEhlYWRlcnMuZ2V0UHJvcGVydHkoImNvbnRlbnQtbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnRMZW5TdHIgPT0gbnVsbCkgewotCQkJCWNvbnRlbnRMZW4gPSAtMTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRlbnRMZW4gPSBJbnRlZ2VyLnBhcnNlSW50KGNvbnRlbnRMZW5TdHIpOwotCQkJfQotCQkJaWYoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrK0JFR0lOIEhFQURFUlMrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihodHRwUmVzcCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKytFTkQgSEVBREVSUysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYoIWVuZEZvdW5kKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2csIChuZXcgT2JqZWN0W117aG9zdCwgSW50ZWdlci50b1N0cmluZyhwb3J0KSwgaHR0cFJlc3B9KSkpOyAKLQkJCX0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50TGVuPSIrY29udGVudExlbik7Ci0JCQlpZihjb250ZW50TGVuID4gMCkgewotCQkJCS8qCi0JCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCQlpbi5yZWFkRnVsbHkoYnVmZik7Ci0JCQkJcmVzcCA9IG5ldyBTdHJpbmcoYnVmZik7Ci0JCQkJKi8KLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbTWF0aC5taW4oMjA0OCwgY29udGVudExlbildOwotCQkJCWludCBudW07Ci0JCQkJd2hpbGUoKG51bSA9IGluLnJlYWQoYnVmZikpICE9IC0xKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCQlpZihuIDw9IG51bSkgewotCQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG4pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG51bSk7Ci0JCQkJfQotCQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJaW50IG51bTsKLQkJCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm51bT0iK251bSk7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJCX0KLQkJCQlyZXNwID0gYm9zLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7ICB9Ci0JCQl0cnkgeyBvdXQuY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkgeyAgfQotCQl9Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0KLQkvKioKLQkgKiBEbyBhIEdFVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvR2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHVybCwgaW50IHRpbWVvdXQsIFByb3BlcnRpZXMgaGVhZGVycykgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJU29ja2V0IHNvY2sgPSBudWxsOwotCQl0cnkgewotCQkJc29jayA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQlzb2NrLnNldFNvVGltZW91dCh0aW1lb3V0KTsKLQkJCXJldHVybiBkb0dldChzb2NrLCB1cmwsIGhlYWRlcnMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsgc29jay5jbG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGhhbmRsZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIFVSTFN0cmVhbUhhbmRsZXIgZ2V0SGFuZGxlcihpbnQgdGltZW91dCkgewotCQlJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKHRpbWVvdXQpOwotCQlVUkxTdHJlYW1IYW5kbGVyIGhhbmRsZXIgPSAoVVJMU3RyZWFtSGFuZGxlciloYW5kbGVyTWFwLmdldChrZXkpOwotCQlpZihoYW5kbGVyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZChoYW5kbGVyTWFwKSB7Ci0JCQkJaWYoKGhhbmRsZXIgPSAoVVJMU3RyZWFtSGFuZGxlciloYW5kbGVyTWFwLmdldChrZXkpKSA9PSBudWxsKSB7Ci0JCQkJCWhhbmRsZXIgPSBuZXcgSHR0cFRpbWVvdXRIYW5kbGVyKHRpbWVvdXQpOwotCQkJCQloYW5kbGVyTWFwLnB1dChrZXksIGhhbmRsZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhIEdFVAotCSAqCi0JICogQHJldHVybiByZXNwb25zZQotCSAqIEBleGNlcHRpb24gPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvR2V0KFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycywgaW50IHRpbWVvdXQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvR2V0KG5ldyBVUkwoKFVSTCkgbnVsbCwgdXJsLCBnZXRIYW5kbGVyKHRpbWVvdXQpKSwgaGVhZGVycyk7Ci0JfQotCQotCS8qKgotCSAqIERvIGEgR0VUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0JcHVibGljIHN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoU3RyaW5nIHVybCwgUHJvcGVydGllcyBoZWFkZXJzLAotCQkJaW50IHRpbWVvdXQsIElQcm94eURhdGEgcHJveHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gZG9HZXQobmV3IFVSTCgoVVJMKSBudWxsLCB1cmwsIGdldEhhbmRsZXIodGltZW91dCkpLCBoZWFkZXJzLAotCQkJCXByb3h5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3h5QXV0aGVudGljYXRvciBleHRlbmRzIEF1dGhlbnRpY2F0b3IgewotCQlwcml2YXRlIFN0cmluZyB1c2VybmFtZSwgcGFzc3dvcmQ7Ci0KLQkJcHVibGljIFByb3h5QXV0aGVudGljYXRvcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewotCQkJdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOwotCQkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBhc3N3b3JkQXV0aGVudGljYXRpb24gZ2V0UGFzc3dvcmRBdXRoZW50aWNhdGlvbigpIHsKLQkJCXJldHVybiBuZXcgUGFzc3dvcmRBdXRoZW50aWNhdGlvbih1c2VybmFtZSwgcGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRG8gYSBHRVQKLQkgKiAKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbgotCSAqICAgICAgICAgPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqLwotCXN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoVVJMIHVybCwgUHJvcGVydGllcyBoZWFkZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvR2V0KHVybCwgaGVhZGVycywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIERvIGEgR0VUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0KG9yIGEgcHJveHkpCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb0dldChVUkwgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIElQcm94eURhdGEgcHJveHkpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiBGb3IgVXNpbmcgUHJveHkKLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCWlmIChwcm94eSAhPSBudWxsKSB7Ci0JCQlQcm94eS5UeXBlIHByb3h5VHlwZSA9IG51bGw7Ci0JCQlpZiAocHJveHkuZ2V0VHlwZSgpLmVxdWFscyhJUHJveHlEYXRhLkhUVFBfUFJPWFlfVFlQRSkpIHsKLQkJCQlwcm94eVR5cGUgPSBQcm94eS5UeXBlLkhUVFA7Ci0JCQl9IGVsc2UgaWYgKHByb3h5LmdldFR5cGUoKS5lcXVhbHMoSVByb3h5RGF0YS5IVFRQU19QUk9YWV9UWVBFKSkgewotCQkJCXByb3h5VHlwZSA9IFByb3h5LlR5cGUuSFRUUDsKLQkJCX0gZWxzZSBpZiAocHJveHkuZ2V0VHlwZSgpLmVxdWFscyhJUHJveHlEYXRhLlNPQ0tTX1BST1hZX1RZUEUpKSB7Ci0JCQkJcHJveHlUeXBlID0gUHJveHkuVHlwZS5TT0NLUzsKLQkJCX0KLQotCQkJUHJveHkgcHJveHlTZXJ2ZXIgPSBuZXcgUHJveHkocHJveHlUeXBlLCBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCXByb3h5LmdldEhvc3QoKSwgcHJveHkuZ2V0UG9ydCgpKSk7Ci0JCQlpZiAocHJveHkuaXNSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKCkpIHsKLQkJCQlBdXRoZW50aWNhdG9yLnNldERlZmF1bHQobmV3IFByb3h5QXV0aGVudGljYXRvcihwcm94eQotCQkJCQkJLmdldFVzZXJJZCgpLCBwcm94eS5nZXRQYXNzd29yZCgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCUF1dGhlbnRpY2F0b3Iuc2V0RGVmYXVsdChudWxsKTsKLQkJCX0KLQkJCWNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbihwcm94eVNlcnZlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb25uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJfQotCQkKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKLQkJLy9jb25uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsgLy9KREsxLjMKLQkJY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsgLy8kTk9OLU5MUy0xJAotCQljb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0JCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJRW51bWVyYXRpb24gbmFtZXMgPSBoZWFkZXJzLmtleXMoKTsKLQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJIb3N0IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJVc2VyLUFnZW50IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LUxlbmd0aCIpKSBjb250aW51ZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShuYW1lLCBoZWFkZXJzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlpbnQgcmVzcFN0YXR1cyA9IGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCVN0cmluZyBuYW1lOwotCQlmb3IoaW50IGkgPSAxOyAobmFtZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGRLZXkoaSkpICE9IG51bGw7IGkrKykgewotCQkJU3RyaW5nIHZhbHVlID0gY29ubi5nZXRIZWFkZXJGaWVsZChuYW1lKTsKLQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2V0LWNvb2tpZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlIdHRwUmVzcG9uc2UuQ29va2llIGNvb2tpZSA9IHBhcnNlQ29va2llKHZhbHVlKTsKLQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQlyZXNwQ29va2llcy5hZGRFbGVtZW50KGNvb2tpZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzcEhlYWRlcnMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWludCBjb250ZW50TGVuID0gY29ubi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOwotCQlTdHJpbmcgcmVzcCA9IG51bGw7Ci0JCWlmKGNvbnRlbnRMZW4gPiAwKSB7Ci0JCQkvKgotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCWluLnJlYWRGdWxseShidWZmKTsKLQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJKi8KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW01hdGgubWluKDIwNDgsIGNvbnRlbnRMZW4pXTsKLQkJCWludCBudW07Ci0JCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCWlmKG4gPD0gbnVtKSB7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJaW50IG51bTsKLQkJCXdoaWxlKChudW0gPSBpbi5yZWFkKGJ1ZmYpKSAhPSAtMSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50ICA6IiArcmVzcCk7Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0JLyoqCi0JICogRG8gYSBQT1NUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb1Bvc3QoU3RyaW5nIHVybCwgUHJvcGVydGllcyBoZWFkZXJzLCBQcm9wZXJ0aWVzIGRhdGEsIGludCB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZG9Qb3N0KG5ldyBVUkwoKFVSTCludWxsLCB1cmwsIGdldEhhbmRsZXIodGltZW91dCkpLCBoZWFkZXJzLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhIFBPU1QKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKi8KLQlzdGF0aWMgSHR0cFJlc3BvbnNlIGRvUG9zdChVUkwgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIFByb3BlcnRpZXMgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IChIdHRwVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJLy9jb25uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsgLy9KREsxLjMKLQkJY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7IC8vJE5PTi1OTFMtMSQKLQkJY29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQljb25uLnNldERvT3V0cHV0KHRydWUpOwotCQljb25uLnNldERvSW5wdXQodHJ1ZSk7Ci0JCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJRW51bWVyYXRpb24gbmFtZXMgPSBoZWFkZXJzLmtleXMoKTsKLQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJIb3N0IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJVc2VyLUFnZW50IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LUxlbmd0aCIpKSBjb250aW51ZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShuYW1lLCBoZWFkZXJzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGNvbm4uZ2V0T3V0cHV0U3RyZWFtKCkpOwotCi0JCVN0cmluZyBjb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJRW51bWVyYXRpb24gZW51ID0gZGF0YS5wcm9wZXJ0eU5hbWVzKCk7Ci0JCXdoaWxlKGVudS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWVudS5uZXh0RWxlbWVudCgpOwotCQkJY29udGVudCArPSAobmFtZSArICI9IiArIFVSTEVuY29kZXIuZW5jb2RlKGRhdGEuZ2V0UHJvcGVydHkobmFtZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYoZW51Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJY29udGVudCArPSAiJiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZihjb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJb3V0LndyaXRlQnl0ZXMoY29udGVudCk7Ci0JCX0KLQotCQlpbnQgcmVzcFN0YXR1cyA9IGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCVN0cmluZyBuYW1lOwotCQlmb3IoaW50IGkgPSAxOyAobmFtZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGRLZXkoaSkpICE9IG51bGw7IGkrKykgewotCQkJU3RyaW5nIHZhbHVlID0gY29ubi5nZXRIZWFkZXJGaWVsZChuYW1lKTsKLQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2V0LWNvb2tpZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlIdHRwUmVzcG9uc2UuQ29va2llIGNvb2tpZSA9IHBhcnNlQ29va2llKHZhbHVlKTsKLQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQlyZXNwQ29va2llcy5hZGRFbGVtZW50KGNvb2tpZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzcEhlYWRlcnMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWludCBjb250ZW50TGVuID0gY29ubi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOwotCQlTdHJpbmcgcmVzcCA9IG51bGw7Ci0JCWlmKGNvbnRlbnRMZW4gPiAwKSB7Ci0JCQkvKgotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCWluLnJlYWRGdWxseShidWZmKTsKLQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJKi8KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW01hdGgubWluKDIwNDgsIGNvbnRlbnRMZW4pXTsKLQkJCWludCBudW07Ci0JCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCWlmKG4gPD0gbnVtKSB7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJaW50IG51bTsKLQkJCXdoaWxlKChudW0gPSBpbi5yZWFkKGJ1ZmYpKSAhPSAtMSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0JLyoqCi0JICogRG8gYSBQT1NUIHVzaW5nIGxvdyBsZXZlbCBzb2NrZXQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGltZW91dAotCSAqCi0JICogQHJldHVybiByZXNwb25zZQotCSAqIEBleGNlcHRpb24gPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqICAgICAgICAgICAgPGxpPiBDYXRhSHR0cEV4Y2VwdGlvbiBpbnZhbGlkIHJlc3BvbnNlIGZyb20gc2VydmVyCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb1Bvc3QoU29ja2V0IHNvY2ssIFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycywgUHJvcGVydGllcyBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlpbnQgcmVzcFN0YXR1czsKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJU3RyaW5nIHJlc3AgPSBudWxsOwotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCURhdGFJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaG9zdCA9IHNvY2suZ2V0SW5ldEFkZHJlc3MoKS5nZXRIb3N0TmFtZSgpOwotCQkJaW50IHBvcnQgPSBzb2NrLmdldFBvcnQoKTsKLQkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHNvY2suZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2suZ2V0SW5wdXRTdHJlYW0oKSkpOwotCQkJU3RyaW5nIGNvbnRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJRW51bWVyYXRpb24gZW51ID0gZGF0YS5wcm9wZXJ0eU5hbWVzKCk7Ci0JCQl3aGlsZShlbnUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZW51Lm5leHRFbGVtZW50KCk7Ci0JCQkJY29udGVudCArPSAobmFtZSArICI9IiArIFVSTEVuY29kZXIuZW5jb2RlKGRhdGEuZ2V0UHJvcGVydHkobmFtZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGVudS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQljb250ZW50ICs9ICImIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCS8vbG9nZ2VyLmRlYnVnKCJwb3N0ZGF0YT0iK2NvbnRlbnQpOwotCQkJb3V0LndyaXRlQnl0ZXMoIlBPU1QgIiArIHVybCArICIgSFRUUC8xLjFcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlQnl0ZXMoIkhvc3Q6ICIgKyBob3N0ICsgIjoiICsgcG9ydCArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlvdXQud3JpdGVCeXRlcygiVXNlci1BZ2VudDogTW96aWxsYS80LjBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vb3V0LndyaXRlQnl0ZXMoIkFjY2VwdDogdGV4dC9odG1sIik7Ci0JCQlvdXQud3JpdGVCeXRlcygiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC53cml0ZUJ5dGVzKCJDb250ZW50LUxlbmd0aDogIiArIGNvbnRlbnQubGVuZ3RoKCkgKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJCWlmKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLnNpemUoKSA+IDApIHsKLQkJCQlFbnVtZXJhdGlvbiBuYW1lcyA9IGhlYWRlcnMua2V5cygpOwotCQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZyluYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkhvc3QiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlVzZXItQWdlbnQiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtTGVuZ3RoIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1UeXBlIikpIGNvbnRpbnVlOyAvLyROT04tTkxTLTEkCi0JCQkJCW91dC53cml0ZUJ5dGVzKG5hbWUgKyAiOiAiICsgaGVhZGVycy5nZXRQcm9wZXJ0eShuYW1lKSArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCW91dC53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJb3V0LndyaXRlQnl0ZXMoY29udGVudCk7Ci0JCQl9Ci0JCQlvdXQuZmx1c2goKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJYm9vbGVhbiBlbmRGb3VuZCA9IGZhbHNlOwotCQkJaW50IGNvbnRlbnRMZW4gPSAtMTsKLQkJCWZpbmFsIFN0cmluZyBjb250ZW50TGVuSGVhZGVyID0gImNvbnRlbnQtbGVuZ3RoOiAiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgY29udGVudExlbkhlYWRlckxlbiA9IGNvbnRlbnRMZW5IZWFkZXIubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgaHR0cFJlc3AgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyByZWFkIHRoZSBmaXJzdCBsaW5lCi0JCQlsaW5lID0gaW4ucmVhZExpbmUoKTsKLQkJCS8vbG9nZ2VyLmRlYnVnKCJsaW5lPSIrbGluZSk7Ci0JCQlpZihsaW5lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFB1Ymxpc2hpbmdSZXNvdXJjZXMuc2VydmVyRXJyb3JfbXNnKTsgCi0JCQl9Ci0JCQlodHRwUmVzcCArPSBsaW5lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSk7Ci0JCQl0cnkgewotCQkJCS8vIHNraXAgdGhlIGZpcnN0IHRva2VuIHdoaWNoIGlzICJIVFRQLzEuMSIgb3IgIkhUVFAvMS4wIgotCQkJCXRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCQlyZXNwU3RhdHVzID0gSW50ZWdlci5wYXJzZUludCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnLCAobmV3IE9iamVjdFtde2hvc3QsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGxpbmV9KSkpOyAKLQkJCX0KLQotCQkJLy8gcmVhZCB0aGUgaGVhZGVycwotCQkJd2hpbGUoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJLy9sb2dnZXIuZGVidWcoImxpbmU9IitsaW5lKTsKLQkJCQlodHRwUmVzcCArPSBsaW5lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQllbmRGb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpbnQgaWQgPSBsaW5lLmluZGV4T2YoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihpZCA+IDApIHsKLQkJCQkJU3RyaW5nIGhlYWRlciA9IGxpbmUuc3Vic3RyaW5nKDAsIGlkKS50b0xvd2VyQ2FzZSgpOwotCQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZihsaW5lLmxlbmd0aCgpID4gaWQgKyAyKSB7Ci0JCQkJCQl2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGlkICsgMik7Ci0JCQkJCX0KLQotCQkJCQlpZihoZWFkZXIuZXF1YWxzKCJzZXQtY29va2llIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBwYXJzZUNvb2tpZSh2YWx1ZSk7Ci0JCQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQkJCXJlc3BDb29raWVzLmFkZEVsZW1lbnQoY29va2llKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3BIZWFkZXJzLnB1dChoZWFkZXIsIHZhbHVlKTsKLQkJCQkJfQotCi0JCQkJCS8vcmVzcEhlYWRlcnMucHV0KGhlYWRlciwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBjb250ZW50TGVuU3RyID0gcmVzcEhlYWRlcnMuZ2V0UHJvcGVydHkoImNvbnRlbnQtbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnRMZW5TdHIgPT0gbnVsbCkgewotCQkJCWNvbnRlbnRMZW4gPSAwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udGVudExlbiA9IEludGVnZXIucGFyc2VJbnQoY29udGVudExlblN0cik7Ci0JCQl9Ci0JCQlpZihERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIrKysrQkVHSU4gSEVBREVSUysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKGh0dHBSZXNwKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrK0VORCBIRUFERVJTKysrKyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZighZW5kRm91bmQgfHwgY29udGVudExlbiA9PSAtMSkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnLCAobmV3IE9iamVjdFtde2hvc3QsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGh0dHBSZXNwfSkpKTsgCi0JCQl9Ci0JCQlpZihjb250ZW50TGVuID4gMCkgewotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbY29udGVudExlbl07Ci0JCQkJaW4ucmVhZEZ1bGx5KGJ1ZmYpOwotCQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJfQotCQkJZWxzZSBpZihjb250ZW50TGVuU3RyID09IG51bGwpIHsKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJaW50IG51bTsKLQkJCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG51bSk7Ci0JCQkJfQotCQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7IGluLmNsb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQl0cnkgeyBvdXQuY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJfQotCQlyZXR1cm4gbmV3IEh0dHBSZXNwb25zZShyZXNwU3RhdHVzLCByZXNwSGVhZGVycywgcmVzcENvb2tpZXMsIHJlc3ApOwotCX0KLQotCS8qKgotCSAqIERvIGEgUE9TVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvUG9zdChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB1cmwsIGludCB0aW1lb3V0LAotCQlQcm9wZXJ0aWVzIGhlYWRlcnMsIFByb3BlcnRpZXMgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJU29ja2V0IHNvY2sgPSBudWxsOwotCQl0cnkgewotCQkJc29jayA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQlzb2NrLnNldFNvVGltZW91dCh0aW1lb3V0KTsKLQkJCXJldHVybiBkb1Bvc3Qoc29jaywgdXJsLCBoZWFkZXJzLCBkYXRhKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7IHNvY2suY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBhIHF1ZXJ5IHN0cmluZyBhbmQgVVJMLWRlY29kZXMgdGhlIHBhcmFtZXRlciB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBwYXJzZVF1ZXJ5U3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICImIik7IC8vJE5PTi1OTFMtMSQKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWludCBtYXhJZCA9IHN0ci5sZW5ndGgoKSAtIDE7Ci0JCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCWludCBpZCA9IHRva2VuLmluZGV4T2YoJz0nKTsKLQkJCWlmKGlkID09IC0xKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIGlmKGlkID09IDAgfHwgaWQgPT0gbWF4SWQpIHsKLQkJCQltYXAucHV0KHRva2VuLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1hcC5wdXQodG9rZW4uc3Vic3RyaW5nKDAsIGlkKSwgdXJsRGVjb2RlKHRva2VuLnN1YnN0cmluZyhpZCArIDEpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGNvb2tpZSBmcm9tIHRoZSB2YWx1ZSBvZiByZXNwb25zZSBoZWFkZXIgU2V0LUNvb2tpZQotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlLkNvb2tpZSBwYXJzZUNvb2tpZShTdHJpbmcgc3RyKSB7Ci0gICAgCS8vbG9nZ2VyLmRlYnVnKHN0cik7Ci0gICAgCWludCBpZCA9IHN0ci5pbmRleE9mKCc9Jyk7Ci0gICAgCWlmKGlkIDw9IDApIHJldHVybiBudWxsOwotICAgIAlTdHJpbmcgbmFtZSA9IHN0ci5zdWJzdHJpbmcoMCwgaWQpOwotICAgIAlpbnQgZnJvbUlkID1uYW1lLmxlbmd0aCgpICsgMTsKLSAgICAJaW50IHRvSWQgPSBzdHIuaW5kZXhPZigiOyIpOyAvLyROT04tTkxTLTEkCi0gICAgCVN0cmluZyB2YWx1ZTsKLSAgICAJU3RyaW5nIHRoZVJlc3QgPSBudWxsOwotICAgIAlpZih0b0lkID09IC0xKSB7Ci0gICAgCQl2YWx1ZSA9IHN0ci5zdWJzdHJpbmcoZnJvbUlkKTsKLSAgICAJfQotICAgIAllbHNlIHsKLSAgICAJCXZhbHVlID0gc3RyLnN1YnN0cmluZyhmcm9tSWQsIHRvSWQpOwotICAgIAkJaWYodG9JZCA8IHN0ci5sZW5ndGgoKSAtIDEpIHsKLSAgICAJCQl0aGVSZXN0ID0gc3RyLnN1YnN0cmluZyh0b0lkICsgMSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBuZXcgSHR0cFJlc3BvbnNlLkNvb2tpZShuYW1lLCB2YWx1ZSk7Ci0gICAgCWlmKHRoZVJlc3QgIT0gbnVsbCkgewotICAgIAkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGhlUmVzdCwgIjsiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJd2hpbGUodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgIAkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgCQkJaWQgPSB0b2tlbi5pbmRleE9mKCc9Jyk7Ci0gICAgCQkJaWYoaWQgPD0gMCkgY29udGludWU7Ci0gICAgCQkJbmFtZSA9IHRva2VuLnN1YnN0cmluZygwLCBpZCk7Ci0gICAgCQkJaWYoaWQgPT0gdG9rZW4ubGVuZ3RoKCkgLSAxKSB7Ci0gICAgCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQl9Ci0gICAgCQkJZWxzZSB7Ci0gICAgCQkJCXZhbHVlID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0gICAgCQkJfQotICAgIAkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZG9tYWluIikpIHsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQljb29raWUuc2V0RG9tYWluKHZhbHVlKTsKLSAgICAJCQl9Ci0gICAgCQkJZWxzZSBpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInBhdGgiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgCQkJCWNvb2tpZS5zZXRQYXRoKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0gICAgICAgIH0KLQotICAgIAlyZXR1cm4gY29va2llOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgY29va2llcyBmcm9tIHRoZSB2YWx1ZSBvZiByZXF1ZXN0IGhlYWRlciBDb29raWUKLSAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIEh0dHBSZXNwb25zZS5Db29raWUgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gcGFyc2VDb29raWVzKFN0cmluZyBzdHIpIHsKLSAgICAJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiOyIpOyAvLyROT04tTkxTLTEkCi0gICAgCVZlY3RvciBjb29raWVzID0gbmV3IFZlY3RvcigpOwotICAgIAl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotICAgIAkJaW50IGlkID0gdG9rZW4uaW5kZXhPZignPScpOwotICAgIAkJaWYoaWQgPT0gLTEpIGNvbnRpbnVlOwotICAgIAkJU3RyaW5nIG5hbWUgPSB0b2tlbi5zdWJzdHJpbmcoMCwgaWQpOwotICAgIAkJU3RyaW5nIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCWlmKGlkIDwgdG9rZW4ubGVuZ3RoKCkgLSAxKSB7Ci0gICAgCQkJdmFsdWUgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLSAgICAJCX0KLSAgICAJCWlmKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSsiPSIrdmFsdWUpOyAvLyROT04tTkxTLTEkCi0gICAgCQljb29raWVzLmFkZEVsZW1lbnQobmV3IEh0dHBSZXNwb25zZS5Db29raWUobmFtZSwgdmFsdWUpKTsKLSAgICAJfQotICAgIAlyZXR1cm4gY29va2llcy5lbGVtZW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQ29va2llU3RyaW5nKEVudW1lcmF0aW9uIGNvb2tpZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUoY29va2llcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSAoSHR0cFJlc3BvbnNlLkNvb2tpZSljb29raWVzLm5leHRFbGVtZW50KCk7Ci0JCQlzdHJCdWYuYXBwZW5kKGNvb2tpZS5nZXROYW1lKCkpLmFwcGVuZCgnPScpLmFwcGVuZChjb29raWUuZ2V0VmFsdWUoKSkuYXBwZW5kKCI7ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotCS8qKgotCSogVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyBmb3IgY29udmVydGluZyBmcm9tCi0JKiBhIE1JTUUgZm9ybWF0IGNhbGxlZCAiPGNvZGU+eC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPiIKLQkqIHRvIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotCSogPHA+Ci0JKiBUbyBjb252ZXJ0IHRvIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiwgZWFjaCBjaGFyYWN0ZXIgaXMgZXhhbWluZWQgaW4gdHVybjoKLQkqIDx1bD4KLQkqIDxsaT5UaGUgQVNDSUkgY2hhcmFjdGVycyAnPGNvZGU+YTwvY29kZT4nIHRocm91Z2ggJzxjb2RlPno8L2NvZGU+JywKLQkqICc8Y29kZT5BPC9jb2RlPicgdGhyb3VnaCAnPGNvZGU+WjwvY29kZT4nLCBhbmQgJzxjb2RlPjA8L2NvZGU+JwotCSogdGhyb3VnaCAnPGNvZGU+OTwvY29kZT4nIHJlbWFpbiB0aGUgc2FtZS4KLQkqIDxsaT5UaGUgcGx1cyBzaWduICc8Y29kZT4rPC9jb2RlPidpcyBjb252ZXJ0ZWQgaW50byBhCi0JKiBzcGFjZSBjaGFyYWN0ZXIgJzxjb2RlPiZuYnNwOzwvY29kZT4nLgotCSogPGxpPlRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgMy1jaGFyYWN0ZXIKLQkqIHN0cmluZ3Mgd2hpY2ggYmVnaW4gd2l0aCB0aGUgcGVyY2VudCBzaWduLAotCSogIjxjb2RlPiU8aT54eTwvaT48L2NvZGU+Iiwgd2hlcmUgPGk+eHk8L2k+IGlzIHRoZSB0d28tZGlnaXQKLQkqIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsb3dlciA4LWJpdHMgb2YgdGhlIGNoYXJhY3Rlci4KLQkqIDwvdWw+Ci0JKgotCSovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsRGVjb2RlKFN0cmluZyBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcilJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKGkrMSxpKzMpLDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFVuZG8gY29udmVyc2lvbiB0byBleHRlcm5hbCBlbmNvZGluZwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgYnl0ZVtdIGlucHV0Qnl0ZXMgPSByZXN1bHQuZ2V0Qnl0ZXMoIjg4NTlfMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGlucHV0Qnl0ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbihkb0dldChhcmdzWzBdLCBudWxsLCAwKSk7Ci0gICAgCVN0cmluZyB1cmwgPSBhcmdzWzBdOwotICAgIAlTdHJpbmcgdWlkID0gYXJnc1sxXTsKLSAgICAJU3RyaW5nIGVtYWlsID0gYXJnc1syXTsKLSAgICAJUHJvcGVydGllcyBkYXRhID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAJZGF0YS5wdXQoInVpZCIsIHVpZCk7IC8vJE5PTi1OTFMtMSQKLSAgICAJZGF0YS5wdXQoImVtYWlsIiwgZW1haWwpOyAvLyROT04tTkxTLTEkCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbihkb1Bvc3QodXJsLCBudWxsLCBkYXRhLCAwKSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL1RpbWVvdXRIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL1RpbWVvdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmY2RlYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9UaW1lb3V0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotCi1pbnRlcmZhY2UgVGltZW91dEhhbmRsZXIgewotICAgIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRjZjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgY2hlY2tpbmcgZXh0ZXJuYWwgbGlua3MgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTVlMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIHB1Ymxpc2hpbmcgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGVkQm9va21hcmtzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9QdWJsaXNoZWRCb29rbWFya3MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQzMTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9QdWJsaXNoZWRCb29rbWFya3MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JaW5kZW50PSJ5ZXMiLz4KLTwhLS0gdGhpcyBtZXNzIHVwIHRoZSBsYXlvdXQuIGRpc2FibGUgaXQgYmVmb3JlIHRoZSBsYXlvdXQgY3NzcyBpcyBmaXhlZC4KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0tLT4KLQotCTx4c2w6cGFyYW0gbmFtZT0id2hlcmVBbUlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0cmVlU2V0c1RleHQiLz4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJCb29rbWFya3MiPgotCQotPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotCTwhW0NEQVRBWwotPCEtLQotCTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotLS0+Ci1dXT4KLTwveHNsOnRleHQ+Ci0KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotYm9keSB7Ci0gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogMHB4OwotICAgICAgICBtYXJnaW4tdG9wOiAwcHg7Ci0gICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKLSAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi10ZC5tZW51IHsKLSAgICAgICAgYmFja2dyb3VuZDojMDA2Njk5OwotfQotCi1zcGFuLm1lbnUgewotICAgICAgICBjdXJzb3IgOiBoYW5kOwotICAgICAgICBmb250LXNpemU6IDhwdDsKLSAgICAgICAgY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDsKLSAgICAgICAgcGFkZGluZy1yaWdodDogMC41ZW07Ci0gICAgICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNmZmZmZmY7Ci19Ci0KLXNwYW4ubWVudSBpbWcgewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi10ZC50YWIgewotICAgICAgICBiYWNrZ3JvdW5kOiNmZmZmZmY7Ci0gICAgICAgIHBhZGRpbmctdG9wOiAxcHg7Ci0gICAgICAgIHBhZGRpbmctYm90dG9tOiAxcHg7Ci19Ci0KLXNwYW4udGFiLCBzcGFuLnNlbGVjdGVkVGFiIHsKLQljdXJzb3I6IHBvaW50ZXI7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgd2hpdGUtc3BhY2U6bm93cmFwOwotICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07Ci19Ci0KLXNwYW4udGFiIHsKLSAgICAgICAgYmFja2dyb3VuZDojYzBjMGMwOwotICAgICAgICBib3JkZXItdG9wOiAgIDFweCBzb2xpZCAjNjY2NjY2OwotICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNjY2NjY2OwotICAgICAgICBib3JkZXItbGVmdDogIDFweCBzb2xpZCAjNjY2NjY2OwotfQotCi1zcGFuLnNlbGVjdGVkVGFiIHsKLSAgICAgICAgYmFja2dyb3VuZDojZTBlMGUwOwotICAgICAgICBib3JkZXItdG9wOiAgIDFweCBzb2xpZCAjYTBhMGEwOwotICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYTBhMGEwOwotICAgICAgICBib3JkZXItbGVmdDogIDFweCBzb2xpZCAjYTBhMGEwOwotfQotCi10ZC50cmVlIHsKLSAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM5OTk5OTk7Ci19Ci08L3N0eWxlPgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJvb2ttYXJrdmlld3MuanMiPgotPC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdD4KLWZ1bmN0aW9uIGNoZWNrS2V5KGUsIGZ1bmMpIHsKLSAgICAgICAgaWYgKHdpbmRvdy5ldmVudCkgewotICAgICAgICAgICAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50OwotICAgICAgICB9IGVsc2UgaWYgKGUpIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBlLndoaWNoOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IGUudGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtleT09MTMgfHwga2V5PT0zMikgewotICAgICAgICAgICAgICAgIGZ1bmModGFyZ2V0KTsKLSAgICAgICAgfQotfQotPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keSBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIiBvbmxvYWQ9ImluaXQoKTsiPgotCQkJCTx0YWJsZSBjZWxsc3BhY2luZz0iMXB4IiBjZWxscGFkZGluZz0iMHB4IiBib3JkZXI9IjAiIGhlaWdodD0iMTAwJSIgd2lkdGg9IjEwMCUiPgotCQkJCQk8IS0tIGFkZCB0aGUgdGFiIG1lbnVzIC0tPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9Im1lbnUiPgotCQkJCQkJCTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci0JCQkJCQkJPHNwYW4gY2xhc3M9Im1lbnUiIHRhYmluZGV4PSIxIiBvbmNsaWNrPSJ3aGVyZUFtSSgpOyIgb25rZXlwcmVzcz0iY2hlY2tLZXkoZXZlbnQsIHdoZXJlQW1JKTsiPgotCQkJCQkJCQk8aW1nIGFsdD0iIiB0aXRsZT0iIiBzcmM9ImltYWdlcy9uaV93aGVyZS5naWYiLz4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3aGVyZUFtSVRleHQiLz4KLQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJPHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLQkJCQkJCQk8c3BhbiBjbGFzcz0ibWVudSIgdGFiaW5kZXg9IjEiIG9uY2xpY2s9InRvZ1ZpZXdzKCk7IiBvbmtleXByZXNzPSJjaGVja0tleShldmVudCwgdG9nVmlld3MpOyI+Ci0JCQkJCQkJCTxpbWcgYWx0PSIiIHRpdGxlPSIiIHNyYz0iaW1hZ2VzL2FjdGlvbl91bmhpZGUuZ2lmIi8+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHJlZVNldHNUZXh0Ii8+Ci0JCQkJCQkJPC9zcGFuPgotCQkJCQkJCTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCQk8IS0tIGxvYWQgdGhlIHRhYnMgLS0+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBjbGFzcz0idGFiIj4KLQkJCQkJCQk8eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJCb29rbWFyayI+Ci0JCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0icG9zIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpLTEiLz4KLQkJCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJ0YWIiIGlkPSJ0YWJ7JHBvc30iIHRhYmluZGV4PSIxIiBvbmtleXByZXNzPSJjaGVja0tleShldmVudCwgZGlzcGxheVRyZWUpOyIgb25jbGljaz0iZGlzcGxheVRyZWUodGhpcyk7Ij4KLQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InVybCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1cmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpc0RlZmF1bHRWaWV3Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRlZmF1bHQiLz48L3hzbDphdHRyaWJ1dGU+JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0YWJOYW1lIi8+JiMxNjA7PC9zcGFuPgotCQkJCQkJCQk8eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQkJPCEtLSBwbGFjZWhvbGRlciBmb3IgdGhlIGNvbnRlbnQgdHJlZSAtLT4KLQkJCQkJPHRyIGhlaWdodD0iMTAwJSI+Ci0JCQkJCQk8dGQgY2xhc3M9InRyZWUiPgotCQkJCQkJCTxpZnJhbWUgbmFtZT0ib3J5X3RvYyIgdGl0bGU9IiIgc3R5bGU9InZpc2liaWxpdHk6dmlzaWJsZSIgdGFiaW5kZXg9IjEiIGZyYW1lYm9yZGVyPSJubyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgc2Nyb2xsaW5nPSJhdXRvIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGluZ1JlcG9ydC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGluZ1JlcG9ydC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOTA5NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL1B1Ymxpc2hpbmdSZXBvcnQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJzZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRldGFpbEluZm9UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InNob3dFcnJvclRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibG9nc1dhcm5pbmdUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBhZ2VzTm90SW5zdGFsbGVkVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbnZhbGlkRXh0ZXJuYWxUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im5vbkV4aXN0aW5nVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nUmVmZXJlbmNlc1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im1pc3NpbmdSZXNvdXJjZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ib3duZXJSZXNvdXJjZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ib3duZXJFbGVtZW50VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nRWxlbWVudFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iaW52YWxpZEVsZW1lbnRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImludmFsaWRFbGVtZW50TGlua3NUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBsZWFzZUNoZWNrVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwbGVhc2VGaW5kVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwdWJsaXNoaW5nUmVwb3J0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzdW1tYXJ5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbmZvVGV4dCIvPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IlB1Ymxpc2hpbmdSZXBvcnQiPgotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi8uLi9jc3MvZGVmYXVsdC5jc3MiIHJlbD0iU3R5bGVTaGVldCIvPgotPHNjcmlwdCBzcmM9Ii4vLi4vc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSIuLy4uL3NjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSIuLy4uL3NjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJYmFja1BhdGggPSAnLi4vJzsKLQkJCQkJaW1nUGF0aCA9ICcuLi9pbWFnZXMvJzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1Ymxpc2hpbmdSZXBvcnRUZXh0Ii8+PC9oMj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VtbWFyeVRleHQiLz48L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHAvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dCIvPjo8cC8+Ci0KLTxiPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InB1YkRpci9AcGF0aCIvPgotPC9iPgotCi08cC8+Ci0KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGV0YWlsSW5mb1RleHQiLz46Ci08dWw+Ci08bGk+Ci08YT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImVycm9yTG9nL0BwYXRoIi8+Ci08L3hzbDphdHRyaWJ1dGU+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXJyb3JMb2cvQG5hbWUiLz4KLTwvYT4KLSAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvd0Vycm9yVGV4dCIvPiA8L2xpPgotPGxpPgotPGE+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ3YXJuaW5nTG9nL0BwYXRoIi8+Ci08L3hzbDphdHRyaWJ1dGU+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0id2FybmluZ0xvZy9AbmFtZSIvPgotPC9hPgotIC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb2dzV2FybmluZ1RleHQiLz4gPC9saT4KLTwvdWw+Ci0KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFnZXNOb3RJbnN0YWxsZWRUZXh0Ii8+Ci0KLTwvZGl2PgotCi0KLTx4c2w6aWYgdGVzdD0idmFsaWRhdG9ySW5mby9pbnZhbGlkRXh0ZXJuYWxMaW5rcyI+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnZhbGlkRXh0ZXJuYWxUZXh0Ii8+OjwvZGl2PgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08cC8+Ci08dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSI+Ci0JPHRib2R5PgotCQk8dHI+Ci0JCQk8dGg+VXJsPC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmZvVGV4dCIvPjwvdGg+Ci0JCTwvdHI+Ci0JCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ2YWxpZGF0b3JJbmZvL2ludmFsaWRFeHRlcm5hbExpbmtzL2VudHJ5Ij4KLQkJPHRyPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4mIzE2MDs8L3RkPgotCQk8L3RyPgotCTwveHNsOmZvci1lYWNoPgotCTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3hzbDppZj4KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL2ludmFsaWRSZWZlcmVuY2VzIGFuZCBjb3VudCh2YWxpZGF0b3JJbmZvL2ludmFsaWRSZWZlcmVuY2VzL2VudHJ5KSA+IDAiPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnZhbGlkRWxlbWVudExpbmtzVGV4dCIvPjo8L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHAvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25FeGlzdGluZ1RleHQiLz48YnIvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwbGVhc2VGaW5kVGV4dCIvPgotPHAvPgotPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiPgotCTx0Ym9keT4KLQkJPHRyPgotCQkJPHRoPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW52YWxpZEVsZW1lbnRUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD4KLQkJPC90cj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InZhbGlkYXRvckluZm8vaW52YWxpZFJlZmVyZW5jZXMvZW50cnkiPgotCQk8dHI+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlbGVtZW50Ii8+ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGd1aWQiLz4pPC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+PC90ZD4KLQkJPC90cj4KLQk8L3hzbDpmb3ItZWFjaD4KLQk8L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPC94c2w6aWY+Ci0KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL21pc3NpbmdSZWZlcmVuY2VzIGFuZCBjb3VudCh2YWxpZGF0b3JJbmZvL21pc3NpbmdSZWZlcmVuY2VzL2VudHJ5KSA+IDAiPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQiLz46PC9kaXY+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTxwLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1JlZmVyZW5jZXNUZXh0Ii8+PGJyLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGxlYXNlQ2hlY2tUZXh0Ii8+Ci08cC8+Ci08dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSI+Ci0JPHRib2R5PgotCQk8dHI+Ci0JCQk8dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nRWxlbWVudFRleHQiLz48L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyRWxlbWVudFRleHQiLz48L3RoPgotCQk8L3RyPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0idmFsaWRhdG9ySW5mby9taXNzaW5nUmVmZXJlbmNlcy9lbnRyeSI+Ci0JCTx0cj4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGVsZW1lbnQiLz48L3RkPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3duZXIiLz48L3RkPgotCQk8L3RyPgotCTwveHNsOmZvci1lYWNoPgotCTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3hzbDppZj4KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL21pc3NpbmdSZXNvdXJjZXMgYW5kIGNvdW50KHZhbGlkYXRvckluZm8vbWlzc2luZ1Jlc291cmNlcy9lbnRyeSkgPiAwIj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQiLz46PC9kaXY+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTxwLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0Ii8+PGJyLz4KLTxwLz4KLTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIj4KLQk8dGJvZHk+Ci0JCTx0cj4KLQkJCTx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pc3NpbmdSZXNvdXJjZVRleHQiLz48L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyUmVzb3VyY2VUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD4KLQkJPC90cj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InZhbGlkYXRvckluZm8vbWlzc2luZ1Jlc291cmNlcy9lbnRyeSI+Ci0JCTx0cj4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVybCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZXNvdXJjZSIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvd25lciIvPjwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6Zm9yLWVhY2g+Ci0JPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTwveHNsOmlmPgotCi0KLTwvYm9keT4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci08L3NjcmlwdD4KLTwvaHRtbD4KLQotCi08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvYm9va21hcmsueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2Jvb2ttYXJrLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlYzFmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvYm9va21hcmsueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0Ij4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci0JCQkJPHRpdGxlPkNvbnRlbnRzPC90aXRsZT4KLQkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0qIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlwdDsKLQltYXJnaW46IDA7Ci0JcGFkZGluZzogMDsKLX0KLQotQk9EWSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogV2luZG93OwotCWZvbnQ6IGljb247Ci0JbWFyZ2luOjA7Ci0JcGFkZGluZzowOwotCWJvcmRlcjowOwotfQotCi1VTCB7Ci0JYm9yZGVyLXdpZHRoOjA7Ci0JbWFyZ2luLWxlZnQ6MTVweDsKLX0KLQotI3Jvb3QgewotCW1hcmdpbi10b3A6NXB4OwotCW1hcmdpbi1sZWZ0OjVweDsKLX0KLQotVUwuZXhwYW5kZWQgewotCWRpc3BsYXk6YmxvY2s7Ci19Ci0KLVVMLmNvbGxhcHNlZCB7Ci0JZGlzcGxheTogbm9uZTsKLX0KLQotTEkgewotCW1hcmdpbi10b3A6M3B4OwotCWxpc3Qtc3R5bGUtaW1hZ2U6bm9uZTsKLQlsaXN0LXN0eWxlLXR5cGU6bm9uZTsKLQkJd2hpdGUtc3BhY2U6IG5vd3JhcDsKLX0KLQotSU1HIHsKLQl2ZXJ0aWNhbC1hbGlnbjogdG9wOwotCWJvcmRlcjowcHg7Ci0JbWFyZ2luOjBweDsKLQlwYWRkaW5nOjBweDsKLQltYXJnaW4tcmlnaHQ6NHB4OwotfQotCi0KLUEgewotCXRleHQtZGVjb3JhdGlvbjpub25lOwotCWNvbG9yOiMyNTgKLQlwYWRkaW5nLXJpZ2h0OjJweDsKLQkvKiB0aGlzIHdvcmtzIGluIGllNS41LCBidXQgbm90IGluIGllNS4wICAqLwotCXdoaXRlLXNwYWNlOiBub3dyYXA7Ci19Ci0KLUE6aG92ZXJ7Ci0JdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKLX0KLQotQS5hY3RpdmV7Ci0JYmFja2dyb3VuZDpIaWdobGlnaHQ7Ci0JY29sb3I6SGlnaGxpZ2h0VGV4dDsKLQl3aWR0aDoxMDAlOwotfQotCi1BLmFjdGl2ZTpob3ZlcnsKLQl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotCWJhY2tncm91bmQ6SGlnaGxpZ2h0OwotCWNvbG9yOkhpZ2hsaWdodFRleHQ7Ci0Jd2lkdGg6MTAwJTsKLX0KLQotCi0KLS5oIHsKLQl2aXNpYmlsaXR5OmhpZGRlbjsKLX0KLQotPC9zdHlsZT4KLQkJCQk8YmFzZSB0YXJnZXQ9Im9yeV9kb2MiLz4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotLy8gUHJlbG9hZCBpbWFnZXMKLW1pbnVzID0gbmV3IEltYWdlKCk7Ci1taW51cy5zcmMgPSAiaW1hZ2VzIisiL21pbnVzLmdpZiI7Ci1wbHVzID0gbmV3IEltYWdlKCk7Ci1wbHVzLnNyYyA9ICJpbWFnZXMiKyIvcGx1cy5naWYiOwotYWx0VG9waWNDbG9zZWQgPSAiVG9waWNcdTAwMjBjbG9zZWQiOwotYWx0VG9waWNPcGVuID0gIlRvcGljXHUwMDIwb3BlbiI7Ci08L3NjcmlwdD4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9InRvYy5qcyIvPgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0idHJlZS5qcyIvPgotCQkJPC9oZWFkPgotCQkJPGJvZHkgZGlyPSJsdHIiIG9ubG9hZD0ic2V0TG9hZGVkKCk7Ij4KLQkJCQk8dWwgZGlyPSJsdHIiIGNsYXNzPSJleHBhbmRlZCIgaWQ9InJvb3QiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iRWxlbWVudCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudElkIiBzZWxlY3Q9IicnIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC91bD4KLQkJCTwvYm9keT4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQk8eHNsOnBhcmFtIG5hbWU9Im5vZGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnRJZCIvPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGUiPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpZCI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBub2RlSWQiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGd1aWQiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpY29udXJsIj4uL2ltYWdlcy88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNsb3NlZEljb25OYW1lIi8+Ci0JCQk8L3hzbDp2YXJpYWJsZT4KLQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idXJsIj4uLy4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+Ci0JCQk8L3hzbDp2YXJpYWJsZT4KLQkJCTxsaT4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KEVsZW1lbnQpID4gMCAiPgotCQkJCQkJPGltZyBzcmM9ImltYWdlcy9wbHVzLmdpZiIgY2xhc3M9ImNvbGxhcHNlZCIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQk8IS0tIDxzcGFuIHN0eWxlPSJ3aWR0aDoxMiI+PC9zcGFuPiAtLT4KLQkJCQkJCTxpbWcgc3JjPSJpbWFnZXMvbm9wbHVzLmdpZiIgY2xhc3M9ImNvbGxhcHNlZCIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCQk8YSBpZD0ieyRpZH0iIHBhcmVudElkPSJ7JHBhcmVudElkfSIgZ3VpZD0ieyRndWlkfSIgaHJlZj0ieyR1cmx9Ij4KLQkJCQkJPGltZyBzcmM9InskaWNvbnVybH0iIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPgotCQkJCTwvYT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KEVsZW1lbnQpID4gMCAiPgotCQkJCQk8dWwgY2xhc3M9ImNvbGxhcHNlZCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IkVsZW1lbnQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50SWQiIHNlbGVjdD0iJGlkIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3VsPgotCQkJCTwveHNsOmlmPgotCQkJPC9saT4KLQkJPC94c2w6Zm9yLWVhY2g+Ci0JPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2VsZW1lbnRVcmxzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9lbGVtZW50VXJscy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDI4NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2VsZW1lbnRVcmxzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotPHhzbDpvdXRwdXQgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudFVybHMiPgotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVsZW1lbnRVcmwiPmNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmVsZW1lbnRVcmxzWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5vZGVJZCIvPiJdID0gWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRleHQiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVybCIvPiJdOwotPC94c2w6Zm9yLWVhY2g+CQkKLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvZ2xvc3NhcnkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmFkZDRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLTx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZ2xvc3NhcnlUZXh0Ii8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ikdsb3NzYXJ5Ij4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2xvc3NhcnlUZXh0Ii8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPgotPGRsPgotCi08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbSI+Ci08ZHQ+Ci08Yj4KLTxhPgotPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWQiPl9HTE9TU0FSWV9JVEVNXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz4KLTwvYT4KLTwvYj4KLTwvZHQ+Ci0KLTxkZD4KLTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJAY29udGVudCIvPgkKLTwvZGQ+Ci08L3hzbDpmb3ItZWFjaD4KLQotPC9kbD4KLTwvZm9udD4KLTwvYm9keT4KLTwvaHRtbD4KLQotPC94c2w6dGVtcGxhdGU+Ci0JCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X2luZGV4LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeV9pbmRleC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmVjODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X2luZGV4LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci08eHNsOnBhcmFtIG5hbWU9Imdsb3NzYXJ5VGV4dCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJHbG9zc2FyeSI+Ci0KLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIi8+Ci08dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9ImF1dG8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJOYXZpZ2F0aW9uIEFyZWEiLz4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSJDb250ZW50IEFyZWEiLz4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+Ci0KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X25hdmlnLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeV9uYXZpZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDc2YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X25hdmlnLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJnbG9zc2FyeVRleHQiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iR2xvc3NhcnkiPgotCi08aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNmZmZmZmYiPgotPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtW0BuYXZpZ2F0aW9uLW1hcms9J3RydWUnXSI+Ci08YSAgdGFyZ2V0PSJnbG9zc2FyeV9kb2MiPgotPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li4vZ2xvc3NhcnkuaHRtIzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTwveHNsOmZvci1lYWNoPgotPC9mb250PgotPC9ib2R5PgotPC9odG1sPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXgueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI5ZGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvUHVibGlzaGluZ09wdGlvbiI+Ci0KLTx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz48L3hzbDp2YXJpYWJsZT4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCi08aGVhZD4KLTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSIvPgotCi08IS0tIGluY2x1ZGUgYWRkaXRpb25hbCBtZXRhIHRhZ3MgaWYgYW55IC0tPgotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGFUYWdzL21ldGFUYWciPgotPG1ldGE+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbnRlbnQiLz48L3hzbDphdHRyaWJ1dGU+Ci08L21ldGE+Ci08L3hzbDpmb3ItZWFjaD4KLQotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IVtDREFUQVsKLTwhLS0KLXZhciB0b3VyID0gMDsKLQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKSAKLXsKLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7IAotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOwotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOwotICB2YXIgY2JlZ2luID0gMDsKLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pIAotICB7Ci0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsKLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKSAKLSAgICB7IAotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsKLSAgICAgIGlmICh2ZW5kID09IC0xKSAKLSAgICAgIHsKLSAgICAgICAgdmVuZCA9IGNsZW47Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7Ci0gICAgfQotCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7Ci0gICAgaWYgKGNiZWdpbiA9PSAwKSAKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGw7Ci0gfQotCi1mdW5jdGlvbiBmaXhVcmwodXJsKQotewotCWlmICggdXJsID09IG51bGwgKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JdmFyIGluZHggPSB1cmwuaW5kZXhPZigiZmlsZTovLy8iKTsKLQlpZiAoIGluZHggPj0wICkKLQl7Ci0JCXVybCA9IHVybC5zdWJzdHJpbmcoaW5keCs4LCB1cmwubGVuZ3RoKTsKLQl9Ci0JZWxzZQotCXsKLQkJaW5keCA9IHVybC5pbmRleE9mKCJmaWxlOi8vIik7Ci0JCWlmICggaW5keCA+PTAgKQotCQl7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKGluZHgrNywgdXJsLmxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQl1cmwgPSB1cmwucmVwbGFjZSgvXFwvZywgIi8iKTsKLQotICAgcmV0dXJuIHVuZXNjYXBlKHVybCk7Ci19Ci0KLS8vIC0tPgotXV0+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotdmFyIGJhbm5lcmhlaWdodCA9IDIxICsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZUhlaWdodCIvPjsKLTx4c2w6Y2hvb3NlPgotCTx4c2w6d2hlbiB0ZXN0PSJAdXNlQXBwbGV0PSd0cnVlJyI+Ci12YXIgdG9jX2ZyYW1lID0gIm9yeV90b2MiOwotdmFyIHRvY191cmwgPSAiYXBwbGV0L215cnVwdHJlZS5odG0iOwotdmFyIGRlZmF1bHRfcGFnZV91cmwgPSAic3BzY3JlZW4uaHRtIjsKLQk8L3hzbDp3aGVuPgotCTx4c2w6b3RoZXJ3aXNlPgotdmFyIHRvY19mcmFtZSA9ICJvcnlfdG9jX2ZyYW1lIjsKLXZhciB0b2NfdXJsID0gIm5vYXBwbGV0L1B1Ymxpc2hlZEJvb2ttYXJrcy5odG1sIjsKLXZhciBkZWZhdWx0X3BhZ2VfdXJsID0gZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOwotaWYgKCBkZWZhdWx0X3BhZ2VfdXJsID09IG51bGwgKQotewotCWRlZmF1bHRfcGFnZV91cmwgPSAiYWJvdXQ6YmxhbmsiOwotfQotCTwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwhW0NEQVRBWwotICBpZigobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIiAmJiBwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApIHx8IAotICAgICAgKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiICYmIHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpCi0gIHsKLSAgICBkb2N1bWVudC53cml0ZSgiICA8ZnJhbWVzZXQgIGZyYW1lYm9yZGVyPVwiMFwiIGZyYW1lc3BhY2luZz1cIjFcIiBib3JkZXI9XCIxXCIgcm93cz1cIiIgKyBiYW5uZXJoZWlnaHQgKyAiLCpcIj5cbiIpOwotICAgIGRvY3VtZW50LndyaXRlKCIgICAgPGZyYW1lIHNyYz1cInRvcG5hdi5odG1cIiBub3Jlc2l6ZSBuYW1lPVwib3J5X2J1dHRvblwiIGZyYW1lYm9yZGVyPVwiMFwiIHNjcm9sbGluZz1cIm5vXCIgbWFyZ2luaGVpZ2h0PVwiMFwiIG1hcmdpbndpZHRoPVwiMFwiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiPGZyYW1lc2V0IGNvbHM9XCIyMDUsKlwiIGZyYW1lYm9yZGVyPVwiMVwiIGZyYW1lc3BhY2luZz1cIjFcIiBib3JkZXI9XCIxXCIgPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUoIiAgICAgIDxmcmFtZSBzcmM9XCIiICsgdG9jX3VybCArICJcIiBuYW1lPVwiIiArIHRvY19mcmFtZSArICJcIiBmcmFtZWJvcmRlcj1cIjFcIiBzY3JvbGxpbmc9XCJub1wiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiPGZyYW1lIG5hbWU9XCJvcnlfZG9jXCIgc3JjPVwiIiArIGRlZmF1bHRfcGFnZV91cmwgKyAiXCIgIGZyYW1lYm9yZGVyPVwiMFwiIHNjcm9sbGluZz1cInllc1wiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiICAgPC9mcmFtZXNldD4iKTsKLSAgICBkb2N1bWVudC53cml0ZWxuKCIgICA8L2ZyYW1lc2V0PiIpOwotCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgcGFyZW50LmxvY2F0aW9uID0gImFwcGxldC9icm93c2VyLmh0bSI7Ci0gIH0KLV1dPgotCi0gIDwvc2NyaXB0PgotCi08Ym9keT4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIDxici8+Ci0gICAgICA8YnIvPgotCTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgotICAgICAgPHA+JiMxNjA7PC9wPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgotCi0KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleF9jb250ZW50cy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfY29udGVudHMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGRkMGE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleF9jb250ZW50cy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLTx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSW5kZXgiPgotCQkKLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0iaW5kZXguY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTx0aXRsZT5JbmRleCAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwNDA4MCIgdmxpbms9IiM4MDAwRkYiIGFsaW5rPSIjMDAwMEZGIj4KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtIj4KLTx4c2w6Y2hvb3NlPgotCTx4c2w6d2hlbiB0ZXN0PSJAbmF2aWdhdGlvbi1tYXJrPSd0cnVlJyAiPgotCTxQIENMQVNTPSJpbmRleGhlYWRpbmciPgotCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+Ci0gICA8L1A+Ci0JPC94c2w6d2hlbj4KLQk8eHNsOm90aGVyd2lzZT4KLQk8UCBDTEFTUz0iaW5kZXhsZXZlbDEiPgotCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+Ci0gICA8L1A+Ci0gICA8UCBDTEFTUz0iaW5kZXhsZXZlbDIiPiYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOwotICAgPGEgVEFSR0VUPSJvcnlfZG9jIj4KLSAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIiAvPjwveHNsOmF0dHJpYnV0ZT4KLQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iQGNvbnRlbnQiLz48L2E+PC9QPgotCTwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwveHNsOmZvci1lYWNoPgotPC9ib2R5PgotPC9odG1sPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfbmF2aWcueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2luZGV4X25hdmlnLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYTc0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfbmF2aWcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkluZGV4Ij4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPkdsb3NzYXJ5IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbVtAbmF2aWdhdGlvbi1tYXJrPSd0cnVlJ10iPgotPGEgIHRhcmdldD0ia2V5d29yZF90Ij4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmNvbnRlbnRzLmh0bSM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmVzZW50YXRpb25OYW1lIi8+PC9hPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDpmb3ItZWFjaD4KLTwvZm9udD4KLTwvYm9keT4KLTwvaHRtbD4KLQotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTE4YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4KLQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1UaGUgU2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpcyBwdWJsaXNoZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbgotZGV0YWlsSW5mb1RleHQ9RGV0YWlsIGluZm9ybWF0aW9uIGlzIGxvZ2dlZCBpbnRvIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gdGhlIGxvZ3MgZm9sZGVyCi1zaG93RXJyb3JUZXh0PXNob3cgYW55IGVycm9yIG9jY3VycmVkIGR1cmluZyBwdWJsaXNoaW5nLgotbG9nc1dhcm5pbmdUZXh0PWxvZ3MgYWxsIHdhcm5pbmcgbWVzc2FnZXMgc3VjaCBhcyBtaXNzaW5nIHJlZmVyZW5jZXMsIGJyb2tlbiBsaW5rcywgYW5kIHVucHVibGlzaGVkIGNhdGVnb3JpZXMgd2l0aCBubyBjYXRlZ29yaXplZCBlbGVtZW50cy4KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1JbiB0aGUgcGFnZXNfbm90X2luc3RhbGxlZCBmb2xkZXIsIHlvdSB3aWxsIGZpbmQgYWxsIG9mIHRoZSBtaXNzaW5nIHJlZmVyZW5jZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uLgotaW52YWxpZEV4dGVybmFsVGV4dD1JbnZhbGlkIGV4dGVybmFsIGxpbmtzIGlkZW50aWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLW93bmVyRWxlbWVudFRleHQ9T3duZXIgRWxlbWVudAotbm9uRXhpc3RpbmdUZXh0PVRoZSBvd25lciBlbGVtZW50cyByZWZlciB0byBub24tZXhpc3RpbmcgZWxlbWVudHMuIE1heWJlIHRoZSBlbGVtZW50cyB3ZXJlIGRlbGV0ZWQgZnJvbSB0aGUgbGlicmFyeSBhZnRlciB0aGUgZWxlbWVudCBsaW5rcyB3ZXJlIGNyZWF0ZWQuIFBsZWFzZSBmaW5kIHRoZSBvd25lciBlbGVtZW50cyBhbmQgZml4IHRoZXNlIGludmFsaWQgcmVmZXJlbmNlcy4KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PU1pc3NpbmcgUmVmZXJlbmNlcwotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PVRoZSBvd25lciBlbGVtZW50cyByZWZlciB0byAgbWlzc2luZyBlbGVtZW50cyAgaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIFBsZWFzZSBjaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIGFuZCBmaXggdGhlIG1pc3NpbmcgcmVmZXJlbmNlcy4gICAgICAgICAgICAgICAgICAgCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1NaXNzaW5nIFJlc291cmNlIEZpbGVzCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RleHQ9VGhlIG93bmVyIGVsZW1lbnRzIHJlZmVyIHRvIG1pc3NpbmcgcmVzb3VyY2UgZmlsZXMuIFRob3NlIHJlc291cmNlIGZpbGVzIGFyZSByZWZlcmVuY2VkIGluIHRoZSBlbGVtZW50cycgY29udGVudCBvciBpbiB0aGUgYXNzb2NpYXRlZCBhdHRhY2htZW50cy4KLW1pc3NpbmdSZXNvdXJjZVRleHQ9TWlzc2luZyBSZXNvdXJjZQotb3duZXJSZXNvdXJjZVRleHQ9T3duZXIgUmVzb3VyY2UKLW1pc3NpbmdFbGVtZW50VGV4dD1NaXNzaW5nIEVsZW1lbnQKLWludmFsaWRFbGVtZW50VGV4dD1JbnZhbGlkIEVsZW1lbnQKLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUludmFsaWQgRWxlbWVudCBMaW5rcwotcGxlYXNlQ2hlY2tUZXh0PVBsZWFzZSBjaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIGFuZCBmaXggdGhlIG1pc3NpbmcgcmVmZXJlbmNlcy4KLXBsZWFzZUZpbmRUZXh0PVBsZWFzZSBmaW5kIHRoZSBvd25lciBlbGVtZW50cyBhbmQgZml4IHRoZXNlIGludmFsaWQgcmVmZXJlbmNlcy4KLWdsb3NzYXJ5VGV4dD1HbG9zc2FyeQotaW5kZXhUZXh0PUluZGV4Ci1mZWVkYmFja1RleHQ9RmVlZGJhY2sKLWFib3V0VGV4dD1BYm91dAotc2VhcmNoVGV4dD1TZWFyY2gKLXByaW50VGV4dD1QcmludAotc3VtbWFyeVRleHQ9U3VtbWFyeQotcHVibGlzaGluZ1JlcG9ydFRleHQ9UHVibGlzaGluZyBSZXBvcnQ6Ci13aGVyZUFtSVRleHQ9V2hlcmUgYW0gSQotdHJlZVNldHNUZXh0PVRyZWUgU2V0cwotCi1zZWFyY2hUaXRsZVRleHQ9UHJvY2VzcyBTZWFyY2gKLWxhYmVsMVRleHQ9Ci1sYWJlbDJUZXh0PQotbGFiZWwzVGV4dD0KLWxhYmxlNFRleHQ9Ci1zZWFyY2hCdXR0b25UZXh0PVNlYXJjaAotc2VhcmNoRXhwcmVzc2lvblRleHQ9KiA9IGFueSBzdHJpbmcsID8gPSBhbnkgY2hhcmFjdGVyLCAiIiA9IHBocmFzZSwgQU5ELCBPUiwgTk9UID0gYm9vbGVhbiBvcGVyYXRvcnMKLQotZGV0YWlsc1RleHQ9RGV0YWlscwotaW5mb1RleHQ9SW5mbwotbWVzc2dlVGV4dD1NZXNzYWdlCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvc2VhcmNoLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9zZWFyY2gueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA2NTg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9zZWFyY2gueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hUaXRsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibGFiZWwxVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJsYWJlbDJUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImxhYmVsM1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibGFibGU0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hCdXR0b25UZXh0Ii8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9TZWFyY2giPgotCTx4c2w6dmFyaWFibGUgbmFtZT0id2ViQXBwTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB3ZWJBcHBOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0JPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQk8aGVhZD4KLQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VhcmNoVGl0bGVUZXh0Ii8+PC90aXRsZT4KLQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSIuLy4uL2Nzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJPCFbQ0RBVEFbCi0JCQotCQkJLy8gc2hvdWxkIG5vdCBoYXJkIGNvZGUgdGhlIHdlYiBhcHAgbmFtZSBoZXJlLCB1c2VyIGNhbiBjaGFuZ2UgdGhlIGFwcCBuYW1lCi0JCQkvL3ZhciB3ZWJBcHBOYW1lPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3ZWJBcHBOYW1lIi8+JzsKLQkJCQotCQkJLy8gdGhlIG9wZW5lbnIgaXMgdGhlIHRvcG5hdgotCQkJLy8gdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbiB0b3BuYXYuanMKLQkJCXZhciBiYXNlVXJsID0gd2luZG93Lm9wZW5lci5nZXRCYXNlVXJsKCk7Ci0KLQkJCWZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3QoKSB7Ci0gICAgIAkJCXRyeSB7Ci0gICAgICAgCQkJCXJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKLSAgICAJIAkJfSBjYXRjaCAodHJ5TXMpIHsKLQkgICAgICAgCQkJdHJ5IHsKLSAgICAgICAgIAkJCQlyZXF1ZXN0ID0gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7Ci0gICAgICAJCQkJfSBjYXRjaCAob3RoZXJNcykgewotICAgICAgICAJIAkJCXRyeSB7Ci0gICAgCSAgICAgICAJCQkJcmVxdWVzdCA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOwotCSAgICAgICAgIAkJCX0gY2F0Y2ggKGZhaWxlZCkgewotICAgICAgICAgICAJCQkJCXJlcXVlc3QgPSBudWxsOwotICAgICAgICAgCQkJCX0KLSAgICAgICAJCQkJfQotICAgICAJCQl9Ci0JCQl9Ci0KLQkJICAgCWZ1bmN0aW9uIGRvU2VhcmNoKCkgewotCQkgICAJCXZhciBzZWFyY2hTdHJpbmcgPSBkb2N1bWVudC5zZWFyY2hGb3JtLnNlYXJjaElucHV0LnZhbHVlOwotCQkgICAJCXZhciByZXN1bHRzUGVyUGFnZSA9IGRvY3VtZW50LnNlYXJjaEZvcm0uc2VhcmNoU2NvcGVTaXplUGVyUGFnZS52YWx1ZTsKLQkJICAgCQl2YXIgdXJsID0gYmFzZVVybCArICJcL1NlYXJjaFNlcnZsZXQ/c2VhcmNoU3RyaW5nPSIgKyBlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoU3RyaW5nKSArICImaGl0c1BlclBhZ2U9IiArIHJlc3VsdHNQZXJQYWdlOwotICAgICAJCQljcmVhdGVSZXF1ZXN0KCk7Ci0gICAgIAkJCXJlcXVlc3Qub3BlbigiR0VUIiwgbWFrZVVuaXF1ZSh1cmwpLCB0cnVlKTsKLSAgICAgCQkJcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB1cGRhdGVQYWdlOwotICAgICAJCQlyZXF1ZXN0LnNlbmQobnVsbCk7ICAgIAkJCSAgIAkJCSAgIAotICAJCQl9Ci0KLQkJCWZ1bmN0aW9uIHVwZGF0ZVBhZ2UoKSB7Ci0gICAgCQkJaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PSA0KSB7Ci0gICAgCQkJCXZhciByRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhaW5lciIpOwotCQkJCQlpZiAockRpdiAhPSBudWxsKSAKLQkJCQkJCXJEaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyRGl2KTsKLSAgICAgIAkJCQlyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gICAgICAJCQkJckRpdi5zZXRBdHRyaWJ1dGUoImlkIiwgImNvbnRhaW5lciIpOwotCQkJCQlyRGl2LmlubmVySFRNTCA9IHJlcXVlc3QucmVzcG9uc2VUZXh0OwotCQkJCQl2YXIgcmVzdWx0c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXN1bHRzIik7Ci0JCQkJCXJlc3VsdHNDb250YWluZXIuYXBwZW5kQ2hpbGQockRpdik7Ci0gICAgCQkJfSAgICAJCQkKLSAgCQkJfQotICAJCQkKLSAgCQkJZnVuY3Rpb24gZ2V0UHJldk5leHRQYWdlKHVybCkgewkJCQkKLQkJCQljcmVhdGVSZXF1ZXN0KCk7Ci0KLSAgICAgCQkJcmVxdWVzdC5vcGVuKCJHRVQiLCBtYWtlVW5pcXVlKHVybCksIHRydWUpOwotICAgICAJCQlyZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHVwZGF0ZVBhZ2U7Ci0gICAgIAkJCXJlcXVlc3Quc2VuZChudWxsKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCWZ1bmN0aW9uIG1ha2VVbmlxdWUodXJsKSB7Ci0JCQkJLy8gbm90ZSBzb21lIGJyb3dzZXIgc3VjaCBhcyBJRSB3aWxsIHRyeSB0byBkZXRlcm1pbmUgaWYgdGhlIGNhY2hlZCBwYWdlIGlzIHVwIHRvIGRhdGUgb3Igbm90LAotCQkJCS8vIGFuZCBtYXkgbm90IGlzc3VlIGEgcmVxdWVzdCBmb3IgdGhlIHNhbWUgdXJsCi0JCQkJLy8gZm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgdGhlIHNhbWUgdXJsIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIHBhZ2UsIAotCQkJCS8vIHRoZSBzdWJzZXF1ZW50IGNhbGxzIGZvciBuZXh0IG9yIHByZXZpb3VzIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgotCQkJCS8vIHlvdSBuZWVkIHRvIHNldCB0aGUgTGFzdCBNb2RpZmllZCBoZWFkZXIgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGxvYWRlZC4KLQkJCQkvLyB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGFsbHdheXMgaXNzdWUgYSBkaWZmZXJlbnQgdXJsIGJ5IGFwcGVuZGluZyB0aGUgcmVxdWVzdCB0aW1lCi0JCQkJCi0JCQkJdmFyIHQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLQkJCQl1cmwgPSB1cmwgKyAiJnRpbWVSZXF1ZXN0ZWQ9IiArIHQ7Ci0KLQkJCQlyZXR1cm4gdXJsOwotCQkJfQotCQkJCV1dPgotCQk8L3NjcmlwdD4KLQkJPC9oZWFkPgotCQk8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KLQkJCTxmb3JtIGlkPSJzZWFyY2hGb3JtIiBuYW1lPSJzZWFyY2hGb3JtIiBhY3Rpb249ImphdmFzY3JpcHQ6ZG9TZWFyY2goKTsiID4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJPHRyPgotCQkJCQkJPHRkPgotCQkJCQkJCTxpbnB1dCB1Y2ZpcnN0PSJmYWxzZSIgdHJpbT0idHJ1ZSIgdmFsdWU9IiIgbmFtZT0ic2VhcmNoU3RyaW5nIiB0eXBlPSJ0ZXh0IiBpZD0ic2VhcmNoSW5wdXQiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCQk8dGQ+Ci0JCQkJCQkJPGlucHV0IHZhbHVlPSJTZWFyY2giIGNhcHRpb249IiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgaWQ9InNlYXJjaEJ1dHRvbiIgdHlwZT0iYnV0dG9uIiAgb25DbGljaz0iZG9TZWFyY2goKTsgcmV0dXJuIGZhbHNlOyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJCTx0ZD4KLQkJCQkJCQk8c2VsZWN0IG5hbWU9InNlYXJjaFNjb3BlU2l6ZVBlclBhZ2UiIGlkPSJzZWFyY2hTY29wZVNpemVQZXJQYWdlIiBvbkNoYW5nZT0iZG9TZWFyY2goKTsgcmV0dXJuIGZhbHNlOyI+Ci0JCQkJCQkJCTxvcHRpb24gc2VsZWN0ZWQ9InNlbGVjdGVkIiB2YWx1ZT0iMTAiPjEwPC9vcHRpb24+Ci0JCQkJCQkJCTxvcHRpb24gdmFsdWU9IjIwIj4yMDwvb3B0aW9uPgotCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSI1MCI+NTA8L29wdGlvbj4KLQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMTAwIj4xMDA8L29wdGlvbj4KLQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMjAwIj4yMDA8L29wdGlvbj4KLQkJCQkJCQk8L3NlbGVjdD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZm9ybT4KLQkJCTxici8+PGJyLz4KLQkJCTxkaXYgaWQ9InJlc3VsdHMiPjwvZGl2PgkJCQotCQk8L2JvZHk+Ci0JPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC90b3BuYXYueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3RvcG5hdi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYzIxMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3RvcG5hdi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnBhcmFtIG5hbWU9Imdsb3NzYXJ5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbmRleFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZmVlZGJhY2tUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImFib3V0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InByaW50VGV4dCIvPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9QdWJsaXNoaW5nT3B0aW9uIj4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXJJbWFnZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZSIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXJJbWFnZUhlaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZUhlaWdodCIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJhbGxvd0FwcGxldFNlYXJjaCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbGxvd0FwcGxldFNlYXJjaCIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93R2xvc3NhcnkiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvd0dsb3NzYXJ5Ii8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9InNob3dJbmRleCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG93SW5kZXgiLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0iZmVlZGJhY2tVcmwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmVlZGJhY2tVcmwiLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0ic2VydmVyU2lkZVNlYXJjaCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2ZXJTaWRlU2VhcmNoIi8+PC94c2w6dmFyaWFibGU+Ci0KLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJzY3JpcHRzL3NjcmlwdHMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9InNjcmlwdHMvdG9wbmF2LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLXZhciBmZWVkYmFja191cmw9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZlZWRiYWNrVXJsIi8+JzsKLTwvc2NyaXB0PgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLQotLmJhbm5lciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2ltYWdlcy88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhbm5lckltYWdlIi8+Jyk7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQl3aWR0aDogMTAwJTsKLQloZWlnaHQ6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFubmVySW1hZ2VIZWlnaHQiLz5weDsKLX0KLS50b3BiYXJkaXZpZGVyIHsgCi0JIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDAgCi0gfQotPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIj4KLQotIDxmb3JtIGFjdGlvbj0iIyIgbmFtZT0iZm9ybVRvcGZyYW1lIj4KLSAgPHRhYmxlIGNsYXNzPSJiYW5uZXIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiA+Ci0gICAgPHRyPgotCSAgPHRkPgotICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYWxpZ249InJpZ2h0IiBzdW1tYXJ5PSIiPgotICAgICAgICAgIDx0cj4KLQkJCSAgPHhzbDppZiB0ZXN0PSIkc2hvd0dsb3NzYXJ5PSd0cnVlJyAiPgotICAgCQkJPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3Blbkdsb3NzYXJ5KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPjxpbWcgc3JjPSIuL2ltYWdlcy9uaV9nbG9zc2FyeS5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMCIgYm9yZGVyPSIwIiBhbHQ9InskZ2xvc3NhcnlUZXh0fSIgdGl0bGU9InskZ2xvc3NhcnlUZXh0fSIgLz48L2E+PC90ZD4KLQkJCTx0ZCBub3dyYXA9Im5vd3JhcCI+PGEgaHJlZj0iSmF2YVNjcmlwdDpvcGVuR2xvc3NhcnkoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIgLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BiYXJkaXZpZGVyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIgLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIiAvPjwvdGQ+ICAgICAgICAgICAgICAgICAgCi0JCQk8L3hzbDppZj4KLQkJCTx4c2w6aWYgdGVzdD0iJHNob3dJbmRleD0ndHJ1ZScgIj4KLSAgCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbkluZGV4KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPgotCQkJPGltZyBzcmM9Ii4vaW1hZ2VzL25pX2luZGV4LmdpZiIgd2lkdGg9IjE3IiBoZWlnaHQ9IjkiIGJvcmRlcj0iMCIgYWx0PSJ7JGluZGV4VGV4dH0iIHRpdGxlPSJ7JGluZGV4VGV4dH0iIC8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbkluZGV4KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZXhUZXh0Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BiYXJkaXZpZGVyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgIDwveHNsOmlmPgotCi0JCQk8dGQ+PGEgaHJlZj0iSmF2YVNjcmlwdDpzZW5kRmVlZGJhY2soZmVlZGJhY2tfdXJsKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+Ci0JCQk8aW1nIHNyYz0iLi9pbWFnZXMvbmlfZmVlZGJhY2suZ2lmIiB3aWR0aD0iMTgiIGhlaWdodD0iMTAiIGJvcmRlcj0iMCIgYWx0PSJ7JGZlZWRiYWNrVGV4dH0iIHRpdGxlPSJ7JGZlZWRiYWNrVGV4dH0iLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0JCQkJPGEgaHJlZj0iSmF2YVNjcmlwdDpzZW5kRmVlZGJhY2soZmVlZGJhY2tfdXJsKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmZWVkYmFja1RleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idG9wYmFyZGl2aWRlciI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLQkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQobnVsbCkiIGNsYXNzPSJ0b3ByaWdodG5hdiIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3BlbignYWJvdXQuaHRtJywnYWJvdXQnLCdoZWlnaHQ9MjUwLHdpZHRoPTI1MCxzdGF0dXM9bm8scmVzaXphYmxlPXllcycpOyI+Ci0gICAgICAgICAgICAgIDxpbWcgc3JjPSIuL2ltYWdlcy9uaV9hYm91dC5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgYm9yZGVyPSIwIiBhbHQ9InskYWJvdXRUZXh0fSIgdGl0bGU9InskYWJvdXRUZXh0fSIvPjwvYT48L3RkPgotICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQobnVsbCkiIGNsYXNzPSJ0b3ByaWdodG5hdiIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3BlbignYWJvdXQuaHRtJywnYWJvdXQnLCdoZWlnaHQ9MjUwLHdpZHRoPTI1MCxzdGF0dXM9bm8scmVzaXphYmxlPXllcycpOyI+JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhYm91dFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4gCi0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIAotICA8IS0tIHRvb2xiYXIgZ29lcyBoZXJlIC0tPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZWJnIiA+Ci0JICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGFsaWduPSJyaWdodCIgIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMjAiIGFsdD0iaW1hZ2UiIHRpdGxlPSJpbWFnZSIvPjwvdGQ+Ci0JCQk8dGQ+Ci0gICAgICAgICAgICA8Zm9udCBzaXplPSIxIj4KLQkJCTwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gPHhzbDppZiB0ZXN0PSIkYWxsb3dBcHBsZXRTZWFyY2g9J3RydWUnICI+Ci0JCQk8dGQ+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIyMCIgYWx0PSJpbWFnZSIgdGl0bGU9ImltYWdlIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iOCIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1laGlnaGxpZ2h0MiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotCQkgICAgPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblNlYXJjaCgpOyIgY2xhc3M9InRvcHJpZ2h0bmF2Ij48aW1nIHNyYz0iLi9pbWFnZXMvbmlfc2VhcmNoLmdpZiIgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBib3JkZXI9IjAiIGFsdD0ieyRzZWFyY2hUZXh0fSIgdGl0bGU9Inskc2VhcmNoVGV4dH0iLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+PGEgaHJlZj0iSmF2YVNjcmlwdDpvcGVuU2VhcmNoKCk7IiAgY2xhc3M9InRvcHJpZ2h0bmF2Z3JleSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZWFyY2hUZXh0Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iJHNlcnZlclNpZGVTZWFyY2g9J3RydWUnICI+Ci0JCQk8dGQ+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIyMCIgYWx0PSJpbWFnZSIgdGl0bGU9ImltYWdlIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iOCIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1laGlnaGxpZ2h0MiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotCQkgICAgPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblByb2Nlc3NTZWFyY2goKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PGltZyBzcmM9Ii4vaW1hZ2VzL25pX3NlYXJjaC5naWYiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgYm9yZGVyPSIwIiBhbHQ9Inskc2VhcmNoVGV4dH0iIHRpdGxlPSJ7JHNlYXJjaFRleHR9Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblByb2Nlc3NTZWFyY2goKTsiICBjbGFzcz0idG9wcmlnaHRuYXZncmV5Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlYXJjaFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1lc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idG9wZnJhbWVoaWdobGlnaHQyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iSmF2YVNjcmlwdDpwcmludFBhZ2UoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PGltZyBzcmM9Ii4vaW1hZ2VzL25pX3ByaW50LmdpZiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE3IiBib3JkZXI9IjAiIGFsdD0ieyRwcmludFRleHR9IiB0aXRsZT0ieyRwcmludFRleHR9Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9IkphdmFTY3JpcHQ6cHJpbnRQYWdlKCk7IiAgY2xhc3M9InRvcHJpZ2h0bmF2Z3JleSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmludFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQkgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9InRvcGZyYW1lc2hhZG93IiBjb2xzcGFuPSIzIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0iYmdibGFjayIgY29sc3Bhbj0iMyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSA8L2Zvcm0+Ci0KLTwvYm9keT4KLQotPC9odG1sPgotCi0KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhMTEwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJjcC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyM2Q5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yY3AudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IAotIG9yZy5lY2xpcHNlLmVwZi5yY3AudWksCi0gb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWksCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRybywKLSBvcmcuZWNsaXBzZS5oZWxwLnVpLAotIG9yZy5lY2xpcHNlLmhlbHAud2ViYXBwLAotIG9yZy5lY2xpcHNlLnRvbWNhdCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvYWJvdXQubWFwcGluZ3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRmZGRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuNS4wCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWRkYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pLFwKLSAgICAgICAgICAgICAgIHNwbGFzaC5ibXAsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi0gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZWQ2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbXBvc2VyLnByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4xIj8+Ci0KLTxwcm9kdWN0IG5hbWU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmNvbXBvc2VyIiBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5NYWluQXBwbGljYXRpb24iIHVzZUZlYXR1cmVzPSJ0cnVlIj4KLQotICAgPGFib3V0SW5mbz4KLSAgICAgIDxpbWFnZSBwYXRoPSJpY29ucy9hYm91dC5naWYiLz4KLSAgICAgIDx0ZXh0PgotICAgICAgICAgJWFib3V0VGV4dAotICAgICAgPC90ZXh0PgotICAgPC9hYm91dEluZm8+Ci0KLSAgIDxjb25maWdJbmkgdXNlPSJkZWZhdWx0Ii8+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8cHJvZ3JhbUFyZ3M+LWRhdGEgQHVzZXIuaG9tZS9FUEYvd29ya3NwYWNlLjE1ME0yIC1kZWZhdWx0bGlicmFyeSBPcGVuVVA8L3Byb2dyYW1BcmdzPgotICAgICAgPHZtQXJncz4tWG1zNjRtIC1YbXg1MTJtPC92bUFyZ3M+Ci0gICA8L2xhdW5jaGVyQXJncz4KLQotICAgPHdpbmRvd0ltYWdlcyBpMTY9Ii9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYiIGkzMj0iL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmIi8+Ci0KLSAgIDxzcGxhc2gKLSAgICAgIHN0YXJ0dXBQcm9ncmVzc1JlY3Q9IjAsMjgwLDQ1NSwxNSIKLSAgICAgIHN0YXJ0dXBNZXNzYWdlUmVjdD0iNywyMjAsNDQxLDIwIgotICAgICAgc3RhcnR1cEZvcmVncm91bmRDb2xvcj0iQzhENUVBIiAvPgotICAgPGxhdW5jaGVyIG5hbWU9ImVwZiI+Ci0gICAgICA8c29sYXJpcy8+Ci0gICAgICA8d2luIHVzZUljbz0iZmFsc2UiPgotICAgICAgICAgPGJtcC8+Ci0gICAgICA8L3dpbj4KLSAgIDwvbGF1bmNoZXI+Ci0KLSAgIDx2bT4KLSAgIDwvdm0+Ci0KLSAgIDxwbHVnaW5zPgotICAgPC9wbHVnaW5zPgotCi0gICA8ZmVhdHVyZXM+Ci0gICAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIi8+Ci0gICA8L2ZlYXR1cmVzPgotCi08L3Byb2R1Y3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbmZpZy9yY3BfcGFja2FnaW5nL2NvbmZpZy5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbmZpZy9yY3BfcGFja2FnaW5nL2NvbmZpZy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjI5MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9jb25maWcvcmNwX3BhY2thZ2luZy9jb25maWcuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyBFY2xpcHNlIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBmaWxlCi0jIFRoaXMgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgbWVyZ2VkIGludG8gdGhlIAotIyBTeXN0ZW0gcHJvcGVydGllcyBvbiBzeXN0ZW0gc3RhcnR1cC4gIFRoZSB2YWx1ZXMgY29udHJvbCB0aGUgd2F5IHRoZSAKLSMgcnVudGltZSBpcyBzdHJ1Y3R1cmVkIGFuZCBydW5zLgotCi0jIE5vdGU6ICBPbmx5IHBsYXRmb3JtOi9iYXNlLyBhbmQgZmlsZTogVVJMcyBhcmUgc3VwcG9ydGVkLiAgSW4gZ2VuZXJhbCB0aGUgCi0jIFVSTHMgZ2l2ZW4gbWF5IGluY2x1ZGUgYSB2ZXJzaW9uIG51bWJlciAoZS5nLiwgLi4uL2xvY2F0aW9uXzEuMi4zKS4gIAotIyBJZiBhIHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIHN5c3RlbSBiaW5kcwotIyB0byB0aGUgbG9jYXRpb24gd2hpY2ggbWF0Y2hlcyBleGFjdGx5IG9yIHRvIHRoZSB2ZXJzaW9uZWQgbG9jYXRpb24gd2l0aCB0aGUKLSMgbGF0ZXN0IHZlcnNpb24gbnVtYmVyLiAgSWYgYSB2ZXJzaW9uIG51bWJlciBpcyBnaXZlbiB0aGVuIG9ubHkgZXhhY3QgbWF0Y2hlcwotIyBhcmUgY29uc2lkZXJlZC4KLQotIyBUaGUgVVJMIGZvciB0aGUgcnVudGltZSBlbnRyeSBwb2ludC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0jIHBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaSAKLSNvc2dpLmZyYW1ld29yaz1wbGF0Zm9ybTovYmFzZS9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kKLQotIyBUaGUgY2xhc3NwYXRoIGZvciB0aGUgZnJhbWV3b3JrIGZvdW5kIGF0IHRoZSBvc2dpLmZyYW1ld29yayBsb2NhdGlvbi4gIFRoaXMgCi0jIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGNvbnRhaW5zIGVpdGhlciBVUkxzIG9yIHNpbXBsZSBlbGVtZW50IG5hbWVzLiAgU2ltcGxlCi0jIG5hbWVzIGFyZSBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBpbnN0YWxsIGRpcmVjdG9yeS4gIAotIyBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBuZWVkIG5vdCBiZSBzZXQgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgYnkgdGhlIGZyYW1ld29yayBpdHNlbGYuCi0jIFZlcnNpb24gbWF0Y2ggc2VhcmNoaW5nIGlzIG5vdCBkb25lIGZvciBVUkxzIGxpc3RlZCBoZXJlLgotI29zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYXRpb25zIHRvIHNlYXJjaCBmb3IgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZSAoc3BsYXNoLmJtcCkuCi0jIEZvciBlYWNoIGxpc3QgZWxlbWVudCBhIHN1YmRpcmVjdG9yeSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHBhdHRlcm4gbmwvPGxvY2FsZT4gaXMgc2VhcmNoZWQuCi0jIFRoZSBzeXN0ZW0gYmluZHMgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGZpbGUuICBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgotI29zZ2kuc3BsYXNoUGF0aD0KLQotIyBUaGUgbG9jYXRpb24gb2YgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZS4gIElmIHRoaXMgdmFsdWUgaXMgc2V0IGF0IHN5c3RlbSBzdGFydHVwIGl0IGlzIHVzZWQgCi0jIGluIGZhdm91ciBvZiB0aGUgb3NnaS5zcGxhc2hQYXRoIHNlYXJjaGluZyBvdXRsaW5lZCBhYm92ZS4gIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0IAotIyB0aGUgc2VhcmNoaW5nIGlzIGRvbmUgYW5kIHRoaXMga2V5IGlzIGJvdW5kIHRvIHRoZSByZXN1bHQgb2YgdGhlIHNlYXJjaC4KLSNvc2dpLnNwbGFzaExvY2F0aW9uID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYnVuZGxlcyB3aGljaCBhcmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgYW5kIG9wdGlvbmFsbHkgc3RhcnRlZAotIyBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAgYW5kIHJ1bm5pbmcuICBFYWNoIGVudHJ5IGlmIG9mIHRoZSBmb3JtCi0jICAgICA8VVJMIHwgc2ltcGxlIGJ1bmRsZSBsb2NhdGlvbj5bQCBbPHN0YXJ0bGV2ZWw+XSBbIjpzdGFydCJdXQotIyBJZiB0aGUgc3RhcnRsZXZlbCBpcyBvbWl0dGVkIHRoZW4gdGhlIGZyYW1ld29yayB3aWxsIHVzZSB0aGUgZGVmYXVsdCBzdGFydCBsZXZlbCBmb3IgdGhlIGJ1bmRsZS4KLSMgSWYgdGhlICJzdGFydCIgdGFnIGlzIGFkZGVkIHRoZW4gdGhlIGJ1bmRsZSB3aWxsIGJlIG1hcmtlZCBhcyBzdGFydGVkIGFmdGVyIGJlaW5nIGluc3RhbGxlZC4KLSMgU2ltcGxlIGJ1bmRsZSBsb2NhdGlvbnMgYXJlIGludGVyZXByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgZnJhbWV3b3JrJ3MgcGFyZW50IGRpcmVjdG9yeS4KLSMgVGhlIHN0YXJ0bGV2ZWwgaW5kaWNhdGVzIHRoZSBPU0dpIHN0YXJ0IGxldmVsIGF0IHdoaWNoIHRoZSBidW5kbGUgc2hvdWxkIHJ1bi4KLSMgSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCB0aGUgc3lzdGVtIGNvbXB1dGVzIGFuIGFwcHJvcHJpYXRlIGRlZmF1bHQuCi0jb3NnaS5idW5kbGVzPW9yZy5lY2xpcHNlLmNvcmUucnVudGltZUAyOnN0YXJ0LGNvbS5pYm0ucm1jLmxpYnJhcnksb3JnLmVjbGlwc2UudWkuaWRlLG9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyLG9yZy5lY2xpcHNlLmhlbHAuYmFzZSxvcmcuZWNsaXBzZS51cGRhdGUudWksY29tLmlibS51bWEsY29tLmlibS51bWEuY29yZSxjb20uaWJtLnVtYWYuZWNvcmUsY29tLmlibS50bmd1aS5lZGl0LG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLG9yZy5lY2xpcHNlLmVtZixvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLG9yZy5lY2xpcHNlLmVtZi5lZGl0LG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLG9yZy5lY2xpcHNlLnVpLG9yZy5lY2xpcHNlLnVpLmlkZQotCi0jIFRoZSBwcm9kdWN0IHRvIHJ1bi4gIEEgZ2l2ZW4gRWNsaXBzZSBjb25maWd1cmF0aW9uIG1heSBjb250YWluIG1hbnkgcHJvZHVjdHMuCi0jIFRoZSBwcm9kdWN0IGlkZW50aWZpZWQgd2lsbCBzdXBwbHkgdGhlIGJyYW5kaW5nICh3aW5kb3cgaWNvbnMsIHRpdGxlIGJhciB0ZXh0KSBldGMgCi0jIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4gIAotI2VjbGlwc2UucHJvZHVjdD1vcmcuZWNsaXBzZS5wbGF0Zm9ybQotCi0jIFRoZSBhcHBsaWNhdGlvbiB0byBydW4uICBUaGUgdmFsdWUgc3BlY2lmaWVkIGhlcmUgaXMgdGhlIGlkIG9mIHRoZSBhcHBsaWNhdGlvbiBleHRlbnNpb24KLSMgdGhlIHJ1bnRpbWUgd2lsbCBmaW5kLCBpbnN0YW50aWF0ZSBhbmQgZXhlY3V0ZSBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAuICBOb3RlIHRoYXQgdHlwaWNhbGx5IAotIyB0aGUgaWRlbnRpZmllZCBlY2xpcHNlLnByb2R1Y3QgZGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uCi1lY2xpcHNlLmFwcGxpY2F0aW9uPW9yZy5lY2xpcHNlLmVwZi5yY3AudWkuTWFpbkFwcGxpY2F0aW9uCi0KLSMgVGhlIGJ1aWxkIGlkZW50aWZpZXIKLWVjbGlwc2UuYnVpbGRJZD1NMjAwNDA5MTYxMTI1Ci0KLSMgRW5kIG9mIGZpbGUgbWFya2VyIC0gbXVzdCBiZSBoZXJlCi1lb2Y9ZW9mClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9lY2xpcHNlMzIucG5nIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYWJvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9hYm91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGI4NzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2FwcGxpY2F0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYXBwbGljYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMyOTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYXBwbGljYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9lY2xpcHNlLnBuZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZWNsaXBzZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTc1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9lY2xpcHNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZXRvb2wxNi9oZWxwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZXRvb2wxNi9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MDMwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9ldG9vbDE2L3NlYXJjaF9tZW51LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmNWQ4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMyOTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajMyL3Byb2R1Y3QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajMyL3Byb2R1Y3QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL25ld19jb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9uZXdfY29uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlYTg5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL25ld19jb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjExNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgQ29tcG9zZXIgUkNQIFVJCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXIKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEFib3V0IHRleHQKLWFib3V0VGV4dD1FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyXG5cCi1cblwKLVZlcnNpb246IHsxfVxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbgotCi0jIENhdGVnb3J5Ci1tZXRob2RDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgVmlld3MKLXdlbGNvbWVWaWV3TmFtZT1XZWxjb21lCi0KLSMgQWN0aW9ucwotZ2xvYmFsQWN0aW9uU2V0PUdsb2JhbCBBY3Rpb24gU2V0Ci1uZXdBY3Rpb249Jk5ldwotbmV3QWN0aW9uVG9vbHRpcD1OZXcKLW9wZW5BY3Rpb249Jk9wZW4uLi4KLW9wZW5BY3Rpb25Ub29sdGlwPU9wZW4KLXNlYXJjaEFjdGlvbj0mU2VhcmNoLi4uCi1zZWFyY2hBY3Rpb25Ub29sdGlwPVNlYXJjaAotd2VsY29tZUFjdGlvbj0mV2VsY29tZQotd2VsY29tZUFjdGlvblRvb2xUaXA9V2VsY29tZQotCi0jIFRvb2x0aXBzCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVJldHVybiB0byBPdmVydmlldyBwYWdlCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1SZXR1cm4gdG8gVHV0b3JpYWwgcGFnZQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVJldHVybiB0byBGaXJzdCBTdGVwcyBwYWdlCi1zaG9ydGN1dC53ZWJyZXNvdXJjZXMudG9vbHRpcD1SZXR1cm4gdG8gV2ViIFJlc291cmNlcyBwYWdlICAgICAgIAotCi0jQWN0aW9uIFNldAotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gSGVscCBTeXN0ZW0gVG9vbGJhciBBY3Rpb25zCi1hY3Rpb25TZXQubGFiZWwgPSBIZWxwIFN5c3RlbQotc2VhcmNoQWN0aW9uLmxhYmVsID0gUyZlYXJjaCBIZWxwCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IFNlYXJjaCBIZWxwCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9ICZEeW5hbWljIEhlbHAgCi1keW5hbWljSGVscEFjdGlvbi50b29sdGlwID0gRHluYW1pYyBIZWxwCi0KLSNBY3Rpdml0aWVzL0NhcGFiaWxpdGllcwotYWN0aXZpdHkuZ2VuZXJhbD1JbXBvcnQgYW5kIEV4cG9ydCBQcm9qZWN0cyBhbmQgUmVzb3VyY2VzCi1hY3Rpdml0eS5nZW5lcmFsLmRlc2M9VXNlIHRoZSBzdGFuZGFyZCBFY2xpcHNlIEltcG9ydC9FeHBvcnQgUHJvamVjdC9SZXNvdXJjZXMgY2FwYWJpbGl0aWVzLgotYWN0aXZpdHkudGVhbS5jdnM9Q1ZTIFN1cHBvcnQKLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9VXNlIHRoZSBDb25jdXJyZW50IFZlcnNpb25zIFN5c3RlbSAoQ1ZTKSB0byBtYW5hZ2UgcmVzb3VyY2VzLgotYWN0aXZpdHkudGVhbT1Db3JlIFRlYW0gU3VwcG9ydAotYWN0aXZpdHkudGVhbS5kZXNjPVNoYXJlIHByb2plY3RzIHVzaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBzeXN0ZW1zLgotCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmFsCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbC5kZXNjPVVzZSB0aGUgc3RhbmRhcmQgRWNsaXBzZSBjYXBhYmlsaXRpZXMuCi1hY3Rpdml0eS5jYXQudGVhbT1UZWFtCi1hY3Rpdml0eS5jYXQudGVhbS5kZXNjPVVzZSBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgc3lzdGVtcyB0byBtYW5hZ2UgcmVzb3VyY2VzLgotCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0aWVzCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9ICZDYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJkNhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZQcm9tcHQgd2hlbiBlbmFibGluZyBjYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gUHJvbXB0IHdoZW4gYSBmZWF0dXJlIGlzIGZpcnN0IHVzZWQgdGhhdCByZXF1aXJlcyBlbmFibGVtZW50IG9mIGNhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IENhcGFiaWxpdGllcyBhbGxvdyB5b3UgdG8gZW5hYmxlIG9yIGRpc2FibGUgdmFyaW91cyBwcm9kdWN0IGNvbXBvbmVudHMuICBUaGVzZSBjYXBhYmlsaXRpZXMgYXJlIGdyb3VwZWQgYWNjb3JkaW5nIHRvIGEgc2V0IG9mIHByZWRlZmluZWQgY2F0ZWdvcmllcy4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmN2JmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1haW5BcHBsaWNhdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLk1haW5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbXBvc2VyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcm9kdWN0cyI+Ci0gICAgICA8cHJvZHVjdAotICAgICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVwZi5yY3AudWkuTWFpbkFwcGxpY2F0aW9uIgotICAgICAgICAgICAgbmFtZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciI+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9InByZWZlcmVuY2VDdXN0b21pemF0aW9uIgotICAgICAgICAgICAgICAgdmFsdWU9InBsdWdpbl9jdXN0b21pemF0aW9uLmluaSIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwRm9yZWdyb3VuZENvbG9yIgotICAgICAgICAgICAgICAgdmFsdWU9IkM4RDVFQSIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwTWVzc2FnZVJlY3QiCi0gICAgICAgICAgICAgICB2YWx1ZT0iNywyMjAsNDQxLDIwIi8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9InN0YXJ0dXBQcm9ncmVzc1JlY3QiCi0gICAgICAgICAgICAgICB2YWx1ZT0iMCwyODAsNDU1LDE1Ii8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFib3V0SW1hZ2UiCi0gICAgICAgICAgICAgICB2YWx1ZT0iaWNvbnMvYWJvdXQuZ2lmIi8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFib3V0VGV4dCIKLSAgICAgICAgICAgICAgIHZhbHVlPSIlYWJvdXRUZXh0Ii8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9IndpbmRvd0ltYWdlcyIKLSAgICAgICAgICAgICAgIHZhbHVlPSJpY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmLGljb25zL2Z1bGwvb2JqMzIvcHJvZHVjdDMyLmdpZiIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJhcHBOYW1lIgotICAgICAgICAgICAgICAgdmFsdWU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiPgotICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgIDwvcHJvZHVjdD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9ImVkaXQiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iT3BlbiBhIG1ldGhvZCBlbGVtZW50IgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnMub3BlbkVsZW1lbnQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGlvblNldC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLmFjdGlvbnMiCi0gICAgICAgICAgICBsYWJlbD0iJWFjdGlvblNldC5sYWJlbCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuaGVscC51aS5pbnRlcm5hbC5TZWFyY2hBY3Rpb24iCi0gICAgICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkuc2VhcmNoIgotICAgICAgICAgICAgICAgbGFiZWw9IiVzZWFyY2hBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9ncm91cC5oZWxwIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmZpbGUvYnVpbGQuZ3JvdXAiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlc2VhcmNoQWN0aW9uLnRvb2x0aXAiLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5oZWxwLnVpLmludGVybmFsLkR5bmFtaWNIZWxwQWN0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iJG5sJC9pY29ucy9ldG9vbDE2L2hlbHAuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkuZHluYW1pY0hlbHAiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWR5bmFtaWNIZWxwQWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImhlbHAvZ3JvdXAuaGVscCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5maWxlL2J1aWxkLmdyb3VwIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAiLz4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4KLSAgICAJPGFjdGl2aXR5Ci0gCQkJaWQ9ImFjdGl2aXR5LmV4dGVybmFsdG9vbCIKLSAJCQluYW1lPSJoaWRlRXh0ZXJuYWx0b29sTWVudXMiPgotIAkJPC9hY3Rpdml0eT4KLSAJCTxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0JIAkJYWN0aXZpdHlJZD0iYWN0aXZpdHkuZXh0ZXJuYWx0b29sIgotCQkJcGF0dGVybj0ib3JnXC5lY2xpcHNlXC51aVwuZXh0ZXJuYWx0b29scy9vcmdcLmVjbGlwc2VcLnVpXC5leHRlcm5hbHRvb2xzXC5FeHRlcm5hbFRvb2xNZW51RGVsZWdhdGUuKiI+Ci0gCQk8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMjZkZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1vcmcuZWNsaXBzZS51aS9ET0NLX1BFUlNQRUNUSVZFX0JBUj1UT1BfUklHSFQKLW9yZy5lY2xpcHNlLnVpL2luaXRpYWxGYXN0Vmlld0JhckxvY2F0aW9uPXJpZ2h0Ci1vcmcuZWNsaXBzZS51aS9TSE9XX1RSQURJVElPTkFMX1NUWUxFX1RBQlM9ZmFsc2UKLW9yZy5lY2xpcHNlLnVpL09QRU5fTkVXX1BFUlNQRUNUSVZFPU9QRU5fUEVSU1BFQ1RJVkVfUkVQTEFDRQotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvYXBwbmFtZT1FUEYKLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fVEFTS1NfUEVSX1JPVz01Ci1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL0FERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0I9MjU1LDI1NSwxNTYKLW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvQUREX1dQX0JPWF9CR19DT0xPUl9SR0I9MjU1LDI1NSwyMDUKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS9pZ25vcmVfZmlsZXM9LmxvY2tcbnRydWVcbgotb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9QVUJMSVNIX05FV19ESUFHUkFNPXRydWUKLW9yZy5lY2xpcHNlLnVpL1NIT1dfUFJPR1JFU1NfT05fU1RBUlRVUD10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NwbGFzaC5ibXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NwbGFzaC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWVlNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcGxhc2guYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQWN0aW9uQmFyQWR2aXNvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQWN0aW9uQmFyQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWRlZDUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFjdGlvbkJhckFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLk5ld1dpemFyZE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLlVJQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnMuVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db250cmlidXRpb25JdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREVBY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JSURFQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyMjsKLQotLyoqCi0gKiBDcmVhdGVzLCBhZGRzIGFuZCBkaXNwb3NlcyB0aGUgYWN0aW9ucyBhZGRlZCB0byBhIHdvcmtiZW5jaCB3aW5kb3cuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1haW5BY3Rpb25CYXJBZHZpc29yIGV4dGVuZHMgQWN0aW9uQmFyQWR2aXNvciB7Ci0KLQkvLyBBbGwgYWN0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCBpbiBtYWtlQWN0aW9ucyBhbmQgcmVmZXJlbmNlZCBpbiB0aGUKLQkvLyBmaWxsIG1ldGhvZHMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhY3Rpb25zIGFyZW4ndCByZWNyZWF0ZWQKLQkvLyB3aGVuIGZpbGxBY3Rpb25CYXJzIGlzIGNhbGxlZCB3aXRoIEZJTExfUFJPWFkuCi0KLQkvLyBGaWxlIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV3QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBjbG9zZUFsbEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHNhdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlQXNBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlQWxsQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcmV2ZXJ0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbW92ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHJlbmFtZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBpbXBvcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBleHBvcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZXhpdEFjdGlvbjsKLQotCS8vIEVkaXQgYWN0aW9ucy4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBvcGVuRWxlbWVudEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHVuZG9BY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiByZWRvQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3V0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY29weUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHBhc3RlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZGVsZXRlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gc2VsZWN0QWxsQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZmluZEFjdGlvbjsKLQotCS8vIE5hdmlnYXRlIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZ29JbnRvQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHByZXZpb3VzQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gYmFja0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGZvcndhcmRBY3Rpb247Ci0KLQkvLyBXaW5kb3cgYWN0aW9ucy4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBvcGVuTmV3V2luZG93QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gb3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3VzdG9taXplUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiByZXNldFBlcnNwZWN0aXZlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VQZXJzcGVjdGl2ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGNsb3NlQWxsUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmVmZXJlbmNlc0FjdGlvbjsKLQotCS8vIFdpbmRvdyBuYXZpZ2F0aW9uIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dEVkaXRvckFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHByZXZpb3VzRWRpdG9yQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dFBhcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c1BhcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBuZXh0UGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c1BlcnNwZWN0aXZlQWN0aW9uOwotCi0JLy8gSGVscCBhY3Rpb25zLgotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHdlbGNvbWVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBoZWxwQ29udGVudHNBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBhYm91dEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG5ld1dpemFyZERyb3BEb3duQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbG9ja1Rvb2xCYXJBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBlZGl0QWN0aW9uU2V0QWN0aW9uOwotCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIG1haW5IZWxwTWVudTsKLQotCXByb3RlY3RlZCBNZW51TWFuYWdlciBtYWluRmlsZU1lbnU7Ci0KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgaW50ZXJuYWxNZW51OwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJlcgotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBiYXIgY29uZmlndXJlcgotCSAqLwotCXB1YmxpYyBNYWluQWN0aW9uQmFyQWR2aXNvcihJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyZXIpOwotCQl3aW5kb3cgPSBjb25maWd1cmVyLmdldFdpbmRvd0NvbmZpZ3VyZXIoKS5nZXRXaW5kb3coKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRkIHRoZSB3b3JrYmVuY2ggd2luZG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRXaW5kb3coKSB7Ci0JCXJldHVybiB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI21ha2VBY3Rpb25zKGZpbmFsCi0JICogICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucyhmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkKLQkJCXJldHVybjsKLQotCQkvLyBDcmVhdGVzIHRoZSBhY3Rpb25zIGFuZCByZWdpc3RlcnMgdGhlbS4gUmVnaXN0ZXJpbmcgaXMgbmVlZGVkIHRvCi0JCS8vIGVuc3VyZSB0aGF0IGtleSBiaW5kaW5ncyB3b3JrLiBUaGUgY29ycmVzcG9uZGluZyBjb21tYW5kcyBrZXkKLQkJLy8gYmluZGluZ3MgYXJlIGRlZmluZWQgaW4gdGhlIHBsdWdpbi54bWwgZmlsZS4gUmVnaXN0ZXJpbmcgYWxzbwotCQkvLyBwcm92aWRlcyBhdXRvbWF0aWMgZGlzcG9zYWwgb2YgdGhlIGFjdGlvbnMgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZC4KLQotCQluZXdBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FVy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV3QWN0aW9uKTsKLQotCQljbG9zZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ0xPU0UuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGNsb3NlQWN0aW9uKTsKLQotCQljbG9zZUFsbEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ0xPU0VfQUxMLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZUFsbEFjdGlvbik7Ci0KLQkJc2F2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuU0FWRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoc2F2ZUFjdGlvbik7Ci0KLQkJc2F2ZUFzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TQVZFX0FTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihzYXZlQXNBY3Rpb24pOwotCi0JCXNhdmVBbGxBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNBVkVfQUxMLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihzYXZlQWxsQWN0aW9uKTsKLQotCQlyZXZlcnRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFVkVSVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocmV2ZXJ0QWN0aW9uKTsKLQotCQltb3ZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5NT1ZFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihtb3ZlQWN0aW9uKTsKLQotCQlyZW5hbWVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFTkFNRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocmVuYW1lQWN0aW9uKTsKLQotCQlyZWZyZXNoQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRUZSRVNILmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihyZWZyZXNoQWN0aW9uKTsKLQotCQlpbXBvcnRBY3Rpb24gPSBVSUFjdGlvbkZhY3RvcnkuVUlfSU1QT1JULmNyZWF0ZSh3aW5kb3cpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGltcG9ydEFjdGlvbiwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GSUxFX0lNUE9SVF9DT05URVhUKTsKLQkJcmVnaXN0ZXIoaW1wb3J0QWN0aW9uKTsKLQotCQlleHBvcnRBY3Rpb24gPSBVSUFjdGlvbkZhY3RvcnkuVUlfRVhQT1JULmNyZWF0ZSh3aW5kb3cpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGV4cG9ydEFjdGlvbiwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GSUxFX0VYUE9SVF9DT05URVhUKTsKLQkJcmVnaXN0ZXIoZXhwb3J0QWN0aW9uKTsKLQotCQlwcm9wZXJ0aWVzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUk9QRVJUSUVTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihwcm9wZXJ0aWVzQWN0aW9uKTsKLQotCQlleGl0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihleGl0QWN0aW9uKTsKLQotCQlvcGVuRWxlbWVudEFjdGlvbiA9IFVJQWN0aW9uRmFjdG9yeS5PUEVOX0VMRU1FTlQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG9wZW5FbGVtZW50QWN0aW9uKTsKLQotCQl1bmRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5VTkRPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcih1bmRvQWN0aW9uKTsKLQotCQlyZWRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRURPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihyZWRvQWN0aW9uKTsKLQotCQljdXRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkNVVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoY3V0QWN0aW9uKTsKLQotCQljb3B5QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DT1BZLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihjb3B5QWN0aW9uKTsKLQotCQlwYXN0ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUEFTVEUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHBhc3RlQWN0aW9uKTsKLQotCQlkZWxldGVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkRFTEVURS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZGVsZXRlQWN0aW9uKTsKLQotCQlzZWxlY3RBbGxBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHNlbGVjdEFsbEFjdGlvbik7Ci0KLQkJZmluZEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuRklORC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZmluZEFjdGlvbik7Ci0KLQkJZ29JbnRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5HT19JTlRPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihnb0ludG9BY3Rpb24pOwotCi0JCW5leHRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FWFQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5leHRBY3Rpb24pOwotCi0JCXByZXZpb3VzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocHJldmlvdXNBY3Rpb24pOwotCi0JCWJhY2tBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkJBQ0suY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGJhY2tBY3Rpb24pOwotCi0JCWZvcndhcmRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkZPUldBUkQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGZvcndhcmRBY3Rpb24pOwotCi0JCW9wZW5OZXdXaW5kb3dBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk9QRU5fTkVXX1dJTkRPVy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIob3Blbk5ld1dpbmRvd0FjdGlvbik7Ci0KLQkJbmV4dEVkaXRvckFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9FRElUT1IuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5leHRFZGl0b3JBY3Rpb24pOwotCi0JCXByZXZpb3VzRWRpdG9yQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19FRElUT1IuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHByZXZpb3VzRWRpdG9yQWN0aW9uKTsKLQotCQluZXh0UGFydEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9QQVJULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihuZXh0UGFydEFjdGlvbik7Ci0KLQkJcHJldmlvdXNQYXJ0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19QQVJULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihwcmV2aW91c1BhcnRBY3Rpb24pOwotCi0JCW5leHRQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9QRVJTUEVDVElWRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV4dFBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlwcmV2aW91c1BlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19QRVJTUEVDVElWRQotCQkJCS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocHJldmlvdXNQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJb3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uID0gY3JlYXRlVE5HT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uKHdpbmRvdyk7Ci0JCW9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbi5zZXRUZXh0KFJDUFVJUmVzb3VyY2VzLm90aGVyTWVudUl0ZW1fdGV4dCk7Ci0JCXJlZ2lzdGVyKG9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbik7Ci0KLQkJY3VzdG9taXplUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkVESVRfQUNUSU9OX1NFVFMKLQkJCQkuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGN1c3RvbWl6ZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlzYXZlUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNBVkVfUEVSU1BFQ1RJVkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHNhdmVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJcmVzZXRQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUkVTRVRfUEVSU1BFQ1RJVkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHJlc2V0UGVyc3BlY3RpdmVBY3Rpb24pOwotCi0JCWNsb3NlUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkNMT1NFX1BFUlNQRUNUSVZFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQljbG9zZUFsbFBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRV9BTExfUEVSU1BFQ1RJVkVTCi0JCQkJLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZUFsbFBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlwcmVmZXJlbmNlc0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFRkVSRU5DRVMuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHByZWZlcmVuY2VzQWN0aW9uKTsKLQotCQl3ZWxjb21lQWN0aW9uID0gVUlBY3Rpb25GYWN0b3J5LlNIT1dfSU5UUk8uY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHdlbGNvbWVBY3Rpb24pOwotCQlJbWFnZURlc2NyaXB0b3IgaW1nRGVzID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCXdlbGNvbWVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGltZ0Rlcyk7Ci0KLQkJaGVscENvbnRlbnRzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5IRUxQX0NPTlRFTlRTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihoZWxwQ29udGVudHNBY3Rpb24pOwotCi0JCWFib3V0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5BQk9VVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoYWJvdXRBY3Rpb24pOwotCi0JCS8vIEZJWE1FISBGaWx0ZXIgb3V0IFByb2plY3QuLi4gZnJvbSB0aGUgZHJvcC1kb3duIG1lbnUuCi0JCW5ld1dpemFyZERyb3BEb3duQWN0aW9uID0gSURFQWN0aW9uRmFjdG9yeS5ORVdfV0laQVJEX0RST1BfRE9XTgotCQkJCS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV3V2l6YXJkRHJvcERvd25BY3Rpb24pOwotCi0JCWxvY2tUb29sQmFyQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5MT0NLX1RPT0xfQkFSLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihsb2NrVG9vbEJhckFjdGlvbik7Ci0KLQkJZWRpdEFjdGlvblNldEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuRURJVF9BQ1RJT05fU0VUUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZWRpdEFjdGlvblNldEFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI2ZpbGxNZW51QmFyKElNZW51TWFuYWdlcgotCSAqICAgICAgbWVudUJhcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudUJhcihJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkKLQkJCXJldHVybjsKLQkJbWFpbkZpbGVNZW51ID0gY3JlYXRlRmlsZU1lbnUobWVudUJhcik7Ci0JCW1lbnVCYXIuYWRkKG1haW5GaWxlTWVudSk7Ci0JCW1lbnVCYXIuYWRkKGNyZWF0ZUVkaXRNZW51KG1lbnVCYXIpKTsKLQotCQlJTWVudU1hbmFnZXIgbmF2TWFuYWdlciA9IGNyZWF0ZU5hdmlnYXRlTWVudShtZW51QmFyKTsKLQkJbWVudUJhci5hZGQobmF2TWFuYWdlcik7Ci0JCW5hdk1hbmFnZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJbWVudUJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCW1lbnVCYXIuYWRkKGNyZWF0ZVdpbmRvd01lbnUobWVudUJhcikpOwotCi0JCW1haW5IZWxwTWVudSA9IGNyZWF0ZUhlbHBNZW51KG1lbnVCYXIpOwotCQltZW51QmFyLmFkZChtYWluSGVscE1lbnUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEZpbGUgbWVudSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBNZW51TWFuYWdlciBnZXRGaWxlTWVudU1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYWluRmlsZU1lbnU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSGVscCBtZW51IG1hbmFnZXIuCi0JICovCi0JcHVibGljIE1lbnVNYW5hZ2VyIGdldEhlbHBNZW51TWFuYWdlcigpIHsKLQkJcmV0dXJuIG1haW5IZWxwTWVudTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLkFjdGlvbkJhckFkdmlzb3IjZmlsbENvb2xCYXIoSUNvb2xCYXJNYW5hZ2VyCi0JICogICAgICBjb29sQmFyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb29sQmFyKElDb29sQmFyTWFuYWdlciBjb29sQmFyKSB7Ci0JCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmlzQ2xvc2luZygpKQotCQkJcmV0dXJuOwotCQljb29sQmFyLmFkZChjcmVhdGVGaWxlVG9vbGJhcihjb29sQmFyKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRmlsZSBtZW51LgotCSAqLwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVGaWxlTWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBmaWxlTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5maWxlTWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRklMRSk7Ci0JCWZpbGVNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5GSUxFX1NUQVJUKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBOZXcgc3ViIG1lbnUsIHVzaW5nIHRoZSBzYW1lIGlkIGZvciBpdCBhcyB0aGUgTmV3IGFjdGlvbi4KLQkJU3RyaW5nIG5ld1RleHQgPSBSQ1BVSVJlc291cmNlcy5maWxlTmV3TWVudUl0ZW1fdGV4dDsKLQkJU3RyaW5nIG5ld0lkID0gQWN0aW9uRmFjdG9yeS5ORVcuZ2V0SWQoKTsKLQkJTWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihuZXdUZXh0LCBuZXdJZCkgewotCQkJcHVibGljIFN0cmluZyBnZXRNZW51VGV4dCgpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0TWVudVRleHQoKTsKLQkJCX0KLQkJfTsKLQkJbmV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihuZXdJZCkpOwotCQluZXdNZW51LmFkZChuZXcgTmV3V2l6YXJkTWVudShnZXRXaW5kb3coKSwgbnVsbCkpOwotCQluZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCWZpbGVNZW51LmFkZChuZXdNZW51KTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19FWFQpKTsKLQotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJTWVudU1hbmFnZXIgb3BlblN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMuZmlsZU9wZW5NZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQpOwotCQlvcGVuU3ViTWVudQotCQkJCS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCW9wZW5TdWJNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmaWxlTWVudS5hZGQob3BlblN1Yk1lbnUpOwotCi0JCWZpbGVNZW51LmFkZChjbG9zZUFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChjbG9zZUFsbEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmaWxlTWVudS5hZGQoc2F2ZUFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChzYXZlQXNBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQoc2F2ZUFsbEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChyZXZlcnRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKG1vdmVBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQocmVuYW1lQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKHJlZnJlc2hBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKGltcG9ydEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChleHBvcnRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKGV4aXRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRklMRV9FTkQpKTsKLQotCQlyZXR1cm4gZmlsZU1lbnU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRWRpdCBtZW51LgotCSAqLwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVFZGl0TWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBlZGl0TWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5lZGl0TWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5FRElUX1NUQVJUKSk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJZWRpdE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoIm9wZW5ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQllZGl0TWVudS5hZGQob3BlbkVsZW1lbnRBY3Rpb24pOwotCQllZGl0TWVudS5hZGQoY3V0QWN0aW9uKTsKLQkJZWRpdE1lbnUuYWRkKGNvcHlBY3Rpb24pOwotCQllZGl0TWVudS5hZGQocGFzdGVBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZWRpdE1lbnUuYWRkKGRlbGV0ZUFjdGlvbik7Ci0JCWVkaXRNZW51LmFkZChzZWxlY3RBbGxBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZWRpdE1lbnUuYWRkKGZpbmRBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRURJVF9FTkQpKTsKLQkJcmV0dXJuIGVkaXRNZW51OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5hdmlnYXRlIG1lbnUuCi0JICovCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZU5hdmlnYXRlTWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBuYXZNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLm5hdmlnYXRlTWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fTkFWSUdBVEUpOwotCQluYXZNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbmF2TWVudS5hZGQoZ29JbnRvQWN0aW9uKTsKLQkJbmF2TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbmF2TWVudS5hZGQobmV4dEFjdGlvbik7Ci0JCW5hdk1lbnUuYWRkKHByZXZpb3VzQWN0aW9uKTsKLQkJbmF2TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbmF2TWVudS5hZGQoYmFja0FjdGlvbik7Ci0JCW5hdk1lbnUuYWRkKGZvcndhcmRBY3Rpb24pOwotCQluYXZNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5XQl9FTkQpKTsKLQkJcmV0dXJuIG5hdk1lbnU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2luZG93IG1lbnUuCi0JICovCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZVdpbmRvd01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgd2luZG93TWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy53aW5kb3dNZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9XSU5ET1cpOwotCQl3aW5kb3dNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5XQl9TVEFSVCkpOwotCQl3aW5kb3dNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlNZW51TWFuYWdlciBjaGFuZ2VQZXJzcE1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMud2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dCwKLQkJCQkib3BlblBlcnNwZWN0aXZlIik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY2hhbmdlUGVyc3BNZW51SXRlbSA9IENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5LlBFUlNQRUNUSVZFU19TSE9SVExJU1QKLQkJCQkuY3JlYXRlKGdldFdpbmRvdygpKTsKLQkJY2hhbmdlUGVyc3BNZW51TWdyLmFkZChjaGFuZ2VQZXJzcE1lbnVJdGVtKTsKLQkJd2luZG93TWVudS5hZGQoY2hhbmdlUGVyc3BNZW51TWdyKTsKLQkJTWVudU1hbmFnZXIgc2hvd1ZpZXdNZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLndpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dCwgInNob3dWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2hvd1ZpZXdNZW51ID0gQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuVklFV1NfU0hPUlRMSVNUCi0JCQkJLmNyZWF0ZShnZXRXaW5kb3coKSk7Ci0JCXNob3dWaWV3TWVudU1nci5hZGQoc2hvd1ZpZXdNZW51KTsKLQkJd2luZG93TWVudS5hZGQoc2hvd1ZpZXdNZW51TWdyKTsKLQotCQl3aW5kb3dNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl3aW5kb3dNZW51LmFkZChjdXN0b21pemVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKHNhdmVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKHJlc2V0UGVyc3BlY3RpdmVBY3Rpb24pOwotCQl3aW5kb3dNZW51LmFkZChjbG9zZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQkJd2luZG93TWVudS5hZGQoY2xvc2VBbGxQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXdpbmRvd01lbnUuYWRkKHByZWZlcmVuY2VzQWN0aW9uKTsKLQkJd2luZG93TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuV0JfRU5EKSk7Ci0JCXJldHVybiB3aW5kb3dNZW51OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUludGVybmFsTWVudShmaW5hbCBJTWVudU1hbmFnZXIgaGVscE1tZW51KSB7Ci0JCWludGVybmFsTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXMsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWludGVybmFsTWVudS5hZGQobmV3IEFjdGlvbigKLQkJCQlSQ1BVSVJlc291cmNlcy5tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaykgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVZpZXdIZWxwZXIuY2hlY2tMaWJyYXJ5SGVhbHRoKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEhlbHAgbWVudS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlSGVscE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgaGVscE1tZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLmhlbHBNZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9IRUxQKTsKLQkJaGVscE1tZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5IRUxQX1NUQVJUKSk7Ci0JCWhlbHBNbWVudS5hZGQod2VsY29tZUFjdGlvbik7Ci0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKGhlbHBDb250ZW50c0FjdGlvbik7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC5oZWxwIikpOyAvLyROT04tTkxTLTEkCi0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAuYXNzaXN0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAudG9vbHMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC51cGRhdGVzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTWVudSBpdGVtcyBmb3IgaW50ZXJuYWwgdG9vbAotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC5pbnRlcm5hbCIpKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVJbnRlcm5hbE1lbnUoaGVscE1tZW51KTsKLQotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQoYWJvdXRBY3Rpb24pOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkhFTFBfRU5EKSk7Ci0KLQkJcmV0dXJuIGhlbHBNbWVudTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBGaWxlIHRvb2xiYXIuCi0JICovCi0JcHJvdGVjdGVkIElUb29sQmFyTWFuYWdlciBjcmVhdGVGaWxlVG9vbGJhcihJQ29vbEJhck1hbmFnZXIgY29vbEJhcikgewotCQlJQWN0aW9uQmFyQ29uZmlndXJlcjIgYWN0aW9uQmFyQ29uZmlndXJlciA9IChJQWN0aW9uQmFyQ29uZmlndXJlcjIpIGdldEFjdGlvbkJhckNvbmZpZ3VyZXIoKTsKLQkJSU1lbnVNYW5hZ2VyIHBvcFVwTWVudSA9IG5ldyBNZW51TWFuYWdlcigpOwotCQlwb3BVcE1lbnUuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGxvY2tUb29sQmFyQWN0aW9uKSk7Ci0JCXBvcFVwTWVudS5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZWRpdEFjdGlvblNldEFjdGlvbikpOwotCQljb29sQmFyLnNldENvbnRleHRNZW51TWFuYWdlcihwb3BVcE1lbnUpOwotCi0JCWNvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJSURFQWN0aW9uQ29uc3RhbnRzLkdST1VQX0ZJTEUpKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIGZpbGVUb29sQmFyID0gYWN0aW9uQmFyQ29uZmlndXJlcgotCQkJCS5jcmVhdGVUb29sQmFyTWFuYWdlcigpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19HUk9VUCkpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3V2l6YXJkRHJvcERvd25BY3Rpb24pOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTkVXX0VYVCkpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0FWRV9HUk9VUCkpOwotCQlmaWxlVG9vbEJhci5hZGQoc2F2ZUFjdGlvbik7Ci0JCWZpbGVUb29sQmFyLmFkZChzYXZlQWxsQWN0aW9uKTsKLQkJZmlsZVRvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlNBVkVfRVhUKSk7Ci0JCWZpbGVUb29sQmFyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJcmV0dXJuIGZpbGVUb29sQmFyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGN1c3RvbSBvcGVuIHBlcnNwZWN0aXZlIGRpYWxvZwotCSAqIAotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlVE5HT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uKAotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJSVdvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24od2luZG93KTsKLQkJYWN0aW9uLnNldElkKCJvcGVuUGVyc3BlY3RpdmVEaWFsb2ciKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQXBwbGljYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NThjOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzLkNvbW1hbmRMaW5lUnVuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRyb2xzIGFsbCBhc3BlY3RzIG9mIHRoZSBhcHBsaWNhdGlvbidzIGV4ZWN1dGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCQotCS8vIERhdGEgbW9kZSBjb25zdGFudHMgZm9yIHVzZXIsIGNvbmZpZ3VyYXRpb24gYW5kIGRhdGEgbG9jYXRpb25zLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIkBub25lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19ERUZBVUxUID0gIkBub0RlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfSE9NRSA9ICJAdXNlci5ob21lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RJUiA9ICJAdXNlci5kaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9VU0VSX0hPTUUgPSAidXNlci5ob21lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUl9ESVIgPSAidXNlci5kaXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0YXJ0KG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQpCi0JICovCi0JcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5PTl9UT1ApOwotCQl0cnkgewotCQkJYm9vbGVhbiBub0xvY2sgPSBmYWxzZTsKLQkJCVN0cmluZ1tdIGFwcEFyZ3MgPSBQbGF0Zm9ybS5nZXRBcHBsaWNhdGlvbkFyZ3MoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXBwQXJncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChhcHBBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1saWJyYXJ5IikgJiYgaSA8IChhcHBBcmdzLmxlbmd0aCAtIDEpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gYXBwQXJnc1tpICsgMV07Ci0JCQkJCWxvY2F0aW9uID0gYnVpbGRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLnNldENvbW1hbmRMaW5lTGlicmFyeShsb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGFwcEFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLWRlZmF1bHRsaWJyYXJ5IikgJiYgaSA8IChhcHBBcmdzLmxlbmd0aCAtIDEpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gYXBwQXJnc1tpICsgMV07Ci0JCQkJCWxvY2F0aW9uID0gYnVpbGRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLnNldENvbW1hbmRMaW5lRGVmYXVsdExpYnJhcnkobG9jYXRpb24pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChhcHBBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1ub2xvY2siKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCW5vTG9jayA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChhcHBBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1iYXRjaCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbWFuZExpbmVSdW5VdGlsLmdldEluc3RhbmNlKCkuc2V0TmVlZFRvUnVuKHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFub0xvY2sgJiYgIWNoZWNrV29ya3NwYWNlTG9jayhzaGVsbCkpIHsKLQkJCQlQbGF0Zm9ybS5lbmRTcGxhc2goKTsKLQkJCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7Ci0JCQl9Ci0KLQkJCWludCByZXR1cm5Db2RlID0gY3JlYXRlV29ya2JlbmNoQWR2aXNvcihkaXNwbGF5KTsKLQkJCWlmIChyZXR1cm5Db2RlID09IFBsYXRmb3JtVUkuUkVUVVJOX1JFU1RBUlQpIHsKLQkJCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfUkVTVEFSVDsKLQkJCX0KLQkJCXJldHVybiBJQXBwbGljYXRpb24uRVhJVF9PSzsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0b3AoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSB3b3JrYmVuY2guZ2V0RGlzcGxheSgpOwotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXdvcmtiZW5jaC5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd29ya2JlbmNoIGFkdmlzb3IuCi0JICovCi0JcHJvdGVjdGVkIGludCBjcmVhdGVXb3JrYmVuY2hBZHZpc29yKERpc3BsYXkgZGlzcGxheSkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwKLQkJCQluZXcgTWFpbldvcmtiZW5jaEFkdmlzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSB3b3Jrc3BhY2UgbG9jayB0aGF0IGlzIHVzZWQgdG8gcHJldmVudCBhIGxpYnJhcnkgYmVlbiBvcGVuZWQKLQkgKiBtdWx0aXBsZSB0aW1lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1dvcmtzcGFjZUxvY2soU2hlbGwgc2hlbGwpIHsKLQkJTG9jYXRpb24gd29ya3NwYWNlTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRJbnN0YW5jZUxvY2F0aW9uKCk7Ci0JCVN0cmluZyBhcHBOYW1lID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJdHJ5IHsKLQkJCWlmICh3b3Jrc3BhY2VMb2NhdGlvbi5sb2NrKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBOTFMuYmluZCgKLQkJCQkJUkNQVUlSZXNvdXJjZXMud29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlLCBhcHBOYW1lKSwgTkxTCi0JCQkJCS5iaW5kKFJDUFVJUmVzb3VyY2VzLndvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlLCBhcHBOYW1lKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVJDUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJTkxTCi0JCQkJCQkJLmJpbmQoUkNQVUlSZXNvdXJjZXMud29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2UsCi0JCQkJCQkJCQlhcHBOYW1lKSwgZSk7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgTkxTLmJpbmQoCi0JCQkJCVJDUFVJUmVzb3VyY2VzLndvcmtzcGFjZUNhbm5vdExvY2tUaXRsZSwgYXBwTmFtZSksIGUKLQkJCQkJLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5Mb2NhdGlvbk1hbmFnZXIuYnVpbGRMb2NhdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVN0cmluZyB0cmltbWVkTG9jYXRpb24gPSBsb2NhdGlvbi50cmltKCk7Ci0JCVN0cmluZyByZXN1bHQgPSB0cmltbWVkTG9jYXRpb247Ci0JCWlmICh0cmltbWVkTG9jYXRpb24uZXF1YWxzSWdub3JlQ2FzZShOT05FKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodHJpbW1lZExvY2F0aW9uLmVxdWFsc0lnbm9yZUNhc2UoTk9fREVGQVVMVCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRyaW1tZWRMb2NhdGlvbi5zdGFydHNXaXRoKFVTRVJfSE9NRSkpIHsKLQkJCVN0cmluZyBiYXNlID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVVNFUl9IT01FLCBQUk9QX1VTRVJfSE9NRSk7Ci0JCQlyZXN1bHQgPSBuZXcgRmlsZShiYXNlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfSBlbHNlIGlmICh0cmltbWVkTG9jYXRpb24uc3RhcnRzV2l0aChVU0VSX0RJUikpIHsKLQkJCVN0cmluZyBiYXNlID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVVNFUl9ESVIsIFBST1BfVVNFUl9ESVIpOwotCQkJcmVzdWx0ID0gbmV3IEZpbGUoYmFzZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN1YnN0aXR1dGVWYXIoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHZhciwgU3RyaW5nIHByb3ApIHsKLQkJU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3AsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdmFsdWUgKyBzb3VyY2Uuc3Vic3RyaW5nKHZhci5sZW5ndGgoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5Xb3JrYmVuY2hBZHZpc29yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5Xb3JrYmVuY2hBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZTMzMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoQWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS51dGlscy5Db21tYW5kTGluZVJ1blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERUludGVybmFsV29ya2JlbmNoSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyQnVpbGRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENyZWF0ZXMgdGhlIHdpbmRvdyBhZHZpc29yIGFuZCBzcGVjaWZpZXMgdGhlIHBlcnNwZWN0aXZlIGlkIGZvciB0aGUgaW5pdGlhbAotICogd2luZG93LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1haW5Xb3JrYmVuY2hBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvciB7Ci0KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCXByaXZhdGUgdm9pZCBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoQnVuZGxlIGlkZUJ1bmRsZSwgU3RyaW5nIHN5bWJvbGljTmFtZSwKLQkJCVN0cmluZyBwYXRoLCBib29sZWFuIHNoYXJlZCkgewotCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChpZGVCdW5kbGUsIG5ldyBQYXRoKHBhdGgpLCBudWxsKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQlnZXRXb3JrYmVuY2hDb25maWd1cmVyKCkuZGVjbGFyZUltYWdlKHN5bWJvbGljTmFtZSwgZGVzYywgc2hhcmVkKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWNsYXJlcyBhbGwgSURFLXNwZWNpZmljIHdvcmtiZW5jaCBpbWFnZXMgdGhhdCBhcmUgdXNlZCBieSBzb21lIGJ1bmRsZWQKLQkgKiBwbHVnaW5zCi0JICogCi0JICogQHNlZSBJV29ya2JlbmNoQ29uZmlndXJlciNkZWNsYXJlSW1hZ2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVjbGFyZVdvcmtiZW5jaEltYWdlcygpIHsKLQkJZmluYWwgU3RyaW5nIElDT05TX1BBVEggPSAiJG5sJC9pY29ucy9mdWxsLyI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgUEFUSF9PQkpFQ1QgPSBJQ09OU19QQVRIICsgIm9iajE2LyI7IC8vIE1vZGVsIG9iamVjdCAvLyBpY29ucy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFBBVEhfRVRPT0wgPSBJQ09OU19QQVRIICsgImV0b29sMTYvIjsgLy8gRW5hYmxlZCB0b29sYmFyIGljb25zLi8vJE5PTi1OTFMtMSQKLQotCQlCdW5kbGUgaWRlQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51aS5pZGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsIElERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNULAotCQkJCVBBVEhfT0JKRUNUICsgInByal9vYmouZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLQkJCQlJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVF9DTE9TRUQsIFBBVEhfT0JKRUNUCi0JCQkJCQkrICJjcHJqX29iai5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0JCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfRVJST1JfUEFUSCwgUEFUSF9PQkpFQ1QKLQkJCQkJCSsgImVycm9yX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX1dBUk5JTkdfUEFUSCwgUEFUSF9PQkpFQ1QKLQkJCQkJCSsgIndhcm5fdHNrLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0JCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfSU5GT19QQVRILCBQQVRIX09CSkVDVAotCQkJCQkJKyAiaW5mb190c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgIAkgIAkKLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLQkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfRVRPT0xfUFJPQkxFTV9DQVRFR09SWSwKLQkJCQlQQVRIX0VUT09MICsgInByb2JsZW1fY2F0ZWdvcnkuZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQlsb2dnZXIgPSBSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCXN1cGVyLmluaXRpYWxpemUoY29uZmlndXJlcik7Ci0JCWNvbmZpZ3VyZXIuc2V0U2F2ZUFuZFJlc3RvcmUodHJ1ZSk7Ci0KLQkJLy8gUmVtZW1iZXIgdGhlIGluc3RhbGwgZGlyIGFuZCBoYW5kbGUgdGhlIC1saWJyYXJ5IGNvbW1hbmQgbGluZQotCQkvLyBwYXJhbWV0ZXIuCi0JCVN0cmluZyBhcHBTdGFydERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCQlsb2dnZXIubG9nSW5mbyhSQ1BVSVJlc291cmNlcy5zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0ICsgYXBwU3RhcnREaXIpOyAKLQotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2VzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjY3JlYXRlV29ya2JlbmNoV2luZG93QWR2aXNvcihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlcikKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKAotCQkJSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQlyZXR1cm4gbmV3IE1haW5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yKGNvbmZpZ3VyZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2dldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcHJlU3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgcHJlU3RhcnR1cCgpIHsKLQkJc3VwZXIucHJlU3RhcnR1cCgpOwotCQlXb3JrYmVuY2hBZGFwdGVyQnVpbGRlci5yZWdpc3RlckFkYXB0ZXJzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcHJlU2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZVNodXRkb3duKCkgewotCQkvLyBSZW1lbWJlciB3aGV0aGVyIHRoZSB3ZWxjb21lIHZpZXcgZXhpc3RzIG9yIG5vdCBiZWZvcmUgZXhpdGluZy4KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAoYWN0aXZlV2luZG93ICE9IG51bGwpIHsKLQotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGFjdGl2ZVdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBXb3JrYmVuY2hQYWdlKSB7Ci0JCQkJCUlWaWV3UmVmZXJlbmNlW10gdndSZWZMaXN0ID0gcGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpOwotCi0JCQkJCWJvb2xlYW4gaW50cm9WaWV3RXhpc3RzID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdndSZWZMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAodndSZWZMaXN0W2ldLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaW50cm92aWV3IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWludHJvVmlld0V4aXN0cyA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCQlzdG9yZQotCQkJCQkJCS5zZXRWYWx1ZSgKLQkJCQkJCQkJCSJ3ZWxjb21lX2ludHJvX3ZpZXdfZXhpc3RzIiwgaW50cm9WaWV3RXhpc3RzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3Bvc3RTaHV0ZG93bigpCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFNodXRkb3duKCkgewotCQl0cnkgewotCQkJLy8gU2F2ZSB0aGUgd29ya3NwYWNlIGFuZCByZW1vdmUgLnNuYXAgZmlsZSBpbiB0aGUKLQkJCS8vIHdvcmtzcGFjZVwubWV0YWRhdGFcLnBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMgZm9sZGVyLgotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNhdmUodHJ1ZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcG9zdFN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RTdGFydHVwKCkgewotCQlDb21tYW5kTGluZVJ1blV0aWwgcnVuVXRpbCA9IENvbW1hbmRMaW5lUnVuVXRpbC5nZXRJbnN0YW5jZSgpOwotCQlpZiAocnVuVXRpbC5pc05lZWRUb1J1bigpKSB7Ci0JCQlydW5VdGlsLmV4ZWN1dGUoUGxhdGZvcm0uZ2V0QXBwbGljYXRpb25BcmdzKCkpOwotCi0JCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IGdldFdvcmtiZW5jaENvbmZpZ3VyZXIoKQotCQkJCQkuZ2V0V29ya2JlbmNoKCk7Ci0JCQl3b3JrYmVuY2guZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoISBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuY2FuY2VsKCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmpvaW4oKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc2V0KCk7Ci0JCQkJCXdvcmtiZW5jaC5jbG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJc3VwZXIucG9zdFN0YXJ0dXAoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNjYxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uQWN0aW9uQmFyQWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkFjdGlvblNldENvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuUGx1Z2luQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9QYXJ0OwotCi0vKioKLSAqIFRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB3b3JrYmVuY2ggd2luZG93IGFkdmlzb3IuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBmaXggdG8gaGlkZSB0aGUgd29ya2luZyBzZXQgYW5kIGV4dGVybmFsIHRvb2wgYmFyIGJ1dHRvbnMgQCAyMDA3LTA2LTE0Ci0gKi8KLXB1YmxpYyBjbGFzcyBNYWluV29ya2JlbmNoV2luZG93QWR2aXNvciBleHRlbmRzIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBmaWxlTWVudVJlbW92YWxMaXN0ID0gewotCQkJIm9yZy5lY2xpcHNlLnVpLm9wZW5Mb2NhbEZpbGUiLCAvLyROT04tTkxTLTEkCi0JCQkib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0Lm5ld1RleHRFZGl0b3IiLCAvLyROT04tTkxTLTEkCi0JCQkib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0Lm9wZW5FeHRlcm5hbEZpbGUiLCAvLyROT04tTkxTLTEkCi0JCQkiY29udmVyc3RMaW5lRGVsaW1pdGVyc1RvIiAvLyROT04tTkxTLTEkCi0JfTsKLQotCXByb3RlY3RlZCBNYWluQWN0aW9uQmFyQWR2aXNvciBtYWluQWN0aW9uQmFyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCUFOTk9UQVRJT05OQVZJR0FUSU9OX0lECQk9ICJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlXT1JLSU5HU0VUQUNUSU9OU0VUX0lECQk9ICJvcmcuZWNsaXBzZS51aS5Xb3JraW5nU2V0QWN0aW9uU2V0IjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCUVYVEVSTkFMVE9PTFNTRVRfSUQJCQk9ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbHNTZXQiOwkJCQkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJUGVyc3BlY3RpdmVMaXN0ZW5lciBwZXJzcGVjdGl2ZUxpc3RlbmVyID0gbmV3IElQZXJzcGVjdGl2ZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlLCBTdHJpbmcgY2hhbmdlSWQpIHsKLQkJCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0NvbmZpZ3VyYXRpb25Db250cmlidXRpb24oKTsKLQkJCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdGFydHVwT3BlbkxpYnJhcnkoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlKSB7Ci0JCQkvLyBkbyBub3Qgc2hvdyB0aGUgV29ya2luZ1NldHNhY3Rpb25TZXQgdG9vbGJhciBidXR0b25zCi0JCQlwYWdlLmhpZGVBY3Rpb25TZXQoV09SS0lOR1NFVEFDVElPTlNFVF9JRCk7IAotCQkJLy8gZG8gbm90IHNob3cgdGhlIEV4dGVybmFsIFRvb2xzIGJ1dHRvbiBvbiB0aGUgdG9vbGJhcgotLy8JCQlwYWdlLmhpZGVBY3Rpb25TZXQoRVhURVJOQUxUT09MU1NFVF9JRCk7Ci0JCQlwYWdlLmhpZGVBY3Rpb25TZXQoQU5OT1RBVElPTk5BVklHQVRJT05fSUQpOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmVyCi0JICogICAgICAgICAgICBBbiBvYmplY3QgZm9yIGNvbmZpZ3VyaW5nIHRoZSB3b3JrYmVuY2ggd2luZG93LgotCSAqLwotCXB1YmxpYyBNYWluV29ya2JlbmNoV2luZG93QWR2aXNvcihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvciNjcmVhdGVBY3Rpb25CYXJBZHZpc29yKElBY3Rpb25CYXJDb25maWd1cmVyKQotCSAqLwotCXB1YmxpYyBBY3Rpb25CYXJBZHZpc29yIGNyZWF0ZUFjdGlvbkJhckFkdmlzb3IoCi0JCQlJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCW1haW5BY3Rpb25CYXIgPSBuZXcgTWFpbkFjdGlvbkJhckFkdmlzb3IoY29uZmlndXJlcik7Ci0JCXJldHVybiBtYWluQWN0aW9uQmFyOwotCX0KLQotCS8qKgotCSAqIGFkZCBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBhdCBwb3N0V2luZG93Q3JlYXRlCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFdpbmRvd0NyZWF0ZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLQkJT2JqZWN0IGRhdGEgPSBjb25maWd1cmVyLmdldERhdGEoImlzUmVzdG9yZWRXb3JrYmVuY2giKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQljb25maWd1cmVyLmdldFdpbmRvdygpLmdldFNoZWxsKCkuc2V0TG9jYXRpb24oMzAsIDMwKTsKLQkJCWNvbmZpZ3VyZXIuZ2V0V2luZG93KCkuZ2V0U2hlbGwoKS5zZXRTaXplKDEwMjQsIDc2MCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IjcHJlV2luZG93T3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgcHJlV2luZG93T3BlbigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLQkJY29uZmlndXJlci5zZXRTaG93Q29vbEJhcih0cnVlKTsKLQkJY29uZmlndXJlci5zZXRTaG93UGVyc3BlY3RpdmVCYXIodHJ1ZSk7Ci0JCWNvbmZpZ3VyZXIuc2V0U2hvd1N0YXR1c0xpbmUodHJ1ZSk7Ci0JCWNvbmZpZ3VyZXIuc2V0U2hvd1Byb2dyZXNzSW5kaWNhdG9yKHRydWUpOwotCQljb25maWd1cmVyLnNldFRpdGxlKFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoInByb2R1Y3ROYW1lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3Bvc3RXaW5kb3dPcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0V2luZG93T3BlbigpIHsKLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCkpICAgICAKLQkJCXJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLQkJY29uZmlndXJlci5nZXRXaW5kb3coKS5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCVJDUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgiZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCU1lbnVNYW5hZ2VyIGZpbGVNbWVudSA9IG1haW5BY3Rpb25CYXIuZ2V0RmlsZU1lbnVNYW5hZ2VyKCk7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBmaWxlTW1lbnUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG5lZWRUb1JlbW92ZUZyb20oaXRlbXNbaV0uZ2V0SWQoKSwgZmlsZU1lbnVSZW1vdmFsTGlzdCkpCi0JCQkJZmlsZU1tZW51LnJlbW92ZShpdGVtc1tpXSk7Ci0JCX0KLQotCQkvLyB0aGlzIGlzIGEgaGFjayB0byBjaGFuZ2UgdGhlIEhlbHAgfCBTb2Z0d2FyZSBVcGRhdGVzIHwgTWFuYWdlCi0JCS8vIENvbmZpZ3VyYXRpb25zIHRvIE1hbmFnZSBTb2Z0d2FyZSBDb25maWd1cmF0aW9uLi4uCi0JCU1lbnVNYW5hZ2VyIGhlbHBNbWVudSA9IG1haW5BY3Rpb25CYXIuZ2V0SGVscE1lbnVNYW5hZ2VyKCk7Ci0JCWl0ZW1zID0gaGVscE1tZW51LmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpdGVtc1tpXSBpbnN0YW5jZW9mIEFjdGlvblNldENvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQlBY3Rpb25TZXRDb250cmlidXRpb25JdGVtIGVsZW1lbnQgPSAoQWN0aW9uU2V0Q29udHJpYnV0aW9uSXRlbSkgaXRlbXNbaV07Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0SWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS51cGRhdGVNZW51IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmliTWVudU1nciA9IGVsZW1lbnQuZ2V0SW5uZXJJdGVtKCk7Ci0JCQkJCUlDb250cmlidXRpb25JdGVtW10gc3ViTWVudUl0ZW1zID0gKChNZW51TWFuYWdlcikgY29udHJpYk1lbnVNZ3IpCi0JCQkJCQkJLmdldEl0ZW1zKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3ViTWVudUl0ZW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29udHJpYnV0aW9uSXRlbSBpbm5lckl0ZW0gPSAoKEFjdGlvblNldENvbnRyaWJ1dGlvbkl0ZW0pIHN1Yk1lbnVJdGVtc1tqXSkKLQkJCQkJCQkJLmdldElubmVySXRlbSgpOwotCQkJCQkJaWYgKGlubmVySXRlbSBpbnN0YW5jZW9mIFBsdWdpbkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0KLQkJCQkJCQkJJiYgaW5uZXJJdGVtLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuY29uZmlnTWFuYWdlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoUGx1Z2luQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaW5uZXJJdGVtKQotCQkJCQkJCQkJLmdldEFjdGlvbigpOwotCQkJCQkJCWFjdGlvbgotCQkJCQkJCQkJLnNldFRleHQoUkNQVUlSZXNvdXJjZXMubWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0KTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcihwZXJzcGVjdGl2ZUxpc3RlbmVyKTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkvLyBkbyBub3Qgc2hvdyB0aGUgV29ya2luZ1NldHNhY3Rpb25TZXQgdG9vbGJhciBidXR0b25zCi0JCXBhZ2UuaGlkZUFjdGlvblNldChXT1JLSU5HU0VUQUNUSU9OU0VUX0lEKTsgCi0JCS8vIGRvIG5vdCBzaG93IHRoZSBFeHRlcm5hbCBUb29scyBidXR0b24gb24gdGhlIHRvb2xiYXIKLS8vCQlwYWdlLmhpZGVBY3Rpb25TZXQoRVhURVJOQUxUT09MU1NFVF9JRCk7Ci0JCXBhZ2UuaGlkZUFjdGlvblNldChBTk5PVEFUSU9OTkFWSUdBVElPTl9JRCk7CQotCQkKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbmVlZFRvUmVtb3ZlRnJvbShTdHJpbmcgaWQsIFN0cmluZ1tdIGxpc3QpIHsKLQkJYm9vbGVhbiByYyA9IGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uZXF1YWxzKGlkKSkgewotCQkJCXJjID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyoqCi0JICogYWRkIGN1c3RvbSBvcGVyYXRpb25zIGF0IHBvc3RXaW5kb3dSZXN0b3JlCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFdpbmRvd1Jlc3RvcmUoKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQkJSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLQkJY29uZmlndXJlci5zZXREYXRhKCJpc1Jlc3RvcmVkV29ya2JlbmNoIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQkvKioKLQkqIEN1c3RvbWl6ZSBvcGVuSW50cm8gdG8gYXZvaWQgYW4gRWNsaXBzZSBidWcKLQkqIEN1c3RvbWl6ZXMgaXQgc28gaXQgd2lsbCBvcGVuIGluIHRoZSBzdGFuZGJ5IG1vZGUgaWYgdGhpcyBpcyBhIHJlc3RvcmVkCi0JKiBzZXNzaW9uIGFuZCB0aGUgbGFzdCBzZXNzaW9uIGhhZCB0aGUgSW50cm9WaWV3IG9wZW4sIG90aGVyd2lzZSBjbG9zZSBpdAotCSogCi0JKi8KLQlwdWJsaWMgdm9pZCBvcGVuSW50cm8oKSB7Ci0JCXN1cGVyLm9wZW5JbnRybygpOwotCi0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCU9iamVjdCBkYXRhID0gY29uZmlndXJlci5nZXREYXRhKCJpc1Jlc3RvcmVkV29ya2JlbmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJLy8gaWYgbm90IHJlc3RvcmVkIHdvcmtzcGFjZSwganVzdCBleGVjIHRoZSBkZWZhdWx0IGluIHN1cGVyLgotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYWx3YXlzIGFsbG93cyB0aGUgaW50cm8gdmlldyB0byBvcGVuIGZpcnN0LCBhbmQgdGhlbiBwdXQgaXQgaW50bwotCQkvLyBzdGFuZGJ5IG1vZGUKLQkJLy8gb3RoZXJ3aXNlIG90aGVyIGZhc3Qgdmlld3Mgc3VjaCBhcyBzZWFyY2ggaGVscCB3aWxsIGJlIG9wZW4tZWQgYXMKLQkJLy8gZnVsbCBtb2RlCi0JCS8vIGV2ZW4gdGhlIHdlbGNvbWUgcGFnZSBpcyBjbG9zZWQuCi0JCS8vIGlmIChpc0ludHJvVmlld0V4aXN0c0luTGFzdFNlc3Npb24oKSkgewotCQlJV29ya2JlbmNoQ29uZmlndXJlciB3YkNvbmZpZyA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKQotCQkJCS5nZXRXb3JrYmVuY2hDb25maWd1cmVyKCk7Ci0JCUlJbnRyb1BhcnQgaW50cm9QYXJ0ID0gd2JDb25maWcuZ2V0V29ya2JlbmNoKCkuZ2V0SW50cm9NYW5hZ2VyKCkKLQkJCQkuZ2V0SW50cm8oKTsKLQkJd2JDb25maWcuZ2V0V29ya2JlbmNoKCkuZ2V0SW50cm9NYW5hZ2VyKCkuc2V0SW50cm9TdGFuZGJ5KGludHJvUGFydCwKLQkJCQl0cnVlKTsKLQkJLy8gfSBlbHNlIHsKLQkJaWYgKCFpc0ludHJvVmlld0V4aXN0c0luTGFzdFNlc3Npb24oKSkgewotCQkJY2xvc2VJbnRyb1ZpZXcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0ludHJvVmlld0V4aXN0c0luTGFzdFNlc3Npb24oKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJldHVybiBzdG9yZS5nZXRCb29sZWFuKCJ3ZWxjb21lX2ludHJvX3ZpZXdfZXhpc3RzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvc2VJbnRyb1ZpZXcoKSB7Ci0JCXRyeSB7Ci0JCQlJVmlld1BhcnQgdnAgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuZmluZFZpZXcoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLmludHJvdmlldyIpOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuaGlkZVZpZXcodnApOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SQ1BVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SQ1BVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmFkM2ZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBSQ1AgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSQ1BVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBSQ1BVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSQ1BVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJDUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1JDUFVJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1JDUFVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDhhZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SQ1BVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUkNQVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gUkNQVUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSQ1BVSVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZU1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlTmV3TWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVPcGVuTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmF2aWdhdGVNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2luZG93TWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoZWxwTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG90aGVyTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFJDUFVJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzA2NzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRmlsZSBNZW51Ci1maWxlTWVudUl0ZW1fdGV4dD0mRmlsZQotZmlsZU5ld01lbnVJdGVtX3RleHQ9Jk5ldwotZmlsZU9wZW5NZW51SXRlbV90ZXh0PU8mcGVuCi0KLSMgRWRpdCBNZW51Ci1lZGl0TWVudUl0ZW1fdGV4dD0mRWRpdAotCi0jIE5hdmlnYXRlIE1lbnUKLW5hdmlnYXRlTWVudUl0ZW1fdGV4dD0mTmF2aWdhdGUKLQotIyBTZWFyY2ggTWVudQotc2VhcmNoTWVudUl0ZW1fdGV4dD0mU2VhcmNoCi0KLSMgQ29uZmlndXJhdGlvbiBNZW51Ci1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD0mQ29uZmlndXJhdGlvbgotCi0jIFdpbmRvdyBNZW51Ci13aW5kb3dNZW51SXRlbV90ZXh0PSZXaW5kb3cKLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9Jk9wZW4gUGVyc3BlY3RpdmUKLXdpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dD1TaG93ICZWaWV3Ci0KLSMgSGVscCBNZW51Ci1oZWxwTWVudUl0ZW1fdGV4dD0mSGVscAotCi0jIE5ldyBEcm9wIERvd24gTWVudQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PU5ldwotb3RoZXJNZW51SXRlbV90ZXh0PU90aGVyLi4uCi0KLSMgT3BlbiBQZXJzcGVjdGl2ZSBBY3Rpb25zCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1BdXRob3JpbmcKLW9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9QnJvd3NpbmcKLQotIyBNaXNjIEFjdGlvbnMKLWVkaXRBY3Rpb25fdGV4dD0mRWRpdAotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1VcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IGZyb20gSTEgdG8gSTIuLi4KLQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1JTkZPOiBBcHBsaWNhdGlvbiBzdGFydCBkaXJlY3RvcnkgPQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PSZNYW5hZ2UgU29mdHdhcmUgQ29uZmlndXJhdGlvbi4uLgotCi13b3Jrc3BhY2VDYW5ub3RMb2NrVGl0bGU9Q2Fubm90IHN0YXJ0IHswfQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9ezB9IGNhbm5vdCBiZSBzdGFydGVkIHdoaWxlIGFub3RoZXIgaW5zdGFuY2UgaXMgcnVubmluZy4gIFN3aXRjaCB0byB0aGUgcnVubmluZyBpbnN0YW5jZSBvciBjbG9zZSBpdCBhbmQgcmVzdGFydCB0aGUgYXBwbGljYXRpb24gYWdhaW4uCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9RGlhZ25vc2lzIGFuZCBSZXBhaXIgVG9vbHMKLW1haW5BY3Rpb25CYXJBZHZpc29yX0hlYWx0aENoZWNrPVBlcmZvcm0gSGVhbHRoIENoZWNrIG9uIExpYnJhcnkuLi4KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1SZW1vdmUgUmVmZXJlbmNlcyB0byBJbnZhbGlkIE9iamVjdHMuLi4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9BY3Rpb25Db25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9BY3Rpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmOTJkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgbWVudSBhbmQgdG9vbGJhciBwYXRocyBmb3IgYWRkaW5nIGFjdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29uc3RhbnRzIHsKLQotCS8qKgotCSAqIEZpbGUgPiBOZXcgbWVudSBncm91cCBuYW1lIGZvciBhZGRpbmcgTmV3IGFjdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAibmV3IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmlsZSA+IE9wZW4gbWVudSBncm91cCBuYW1lIGZvciBhZGRpbmcgT3BlbiBhY3Rpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTiA9ICJvcGVuIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2VhcmNoIG1lbnUgZ3JvdXAgbmFtZXMgZm9yIGFkZGluZyBTZWFyY2ggYWN0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSCA9ICJzZWFyY2giOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfU1RBUlQgPSAic2VhcmNoU3RhcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfRU5EID0gInNlYXJjaEVuZCI7IC8vJE5PTi1OTFMtMSQgCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9JbnRyb2R1Y3Rpb25BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9JbnRyb2R1Y3Rpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZjZlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvSW50cm9kdWN0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkludHJvQWN0aW9uOwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSB3ZWxjb21lIHNjcmVlbiBmb3IgdGhlIGFwcGxpY2F0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW50cm9kdWN0aW9uQWN0aW9uIGV4dGVuZHMgSW50cm9BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gd2luZG93Ci0JICogICAgICAgICAgICB0aGUgd29ya2JlbmNoIHdpbmRvdwotCSAqLwotCXB1YmxpYyBJbnRyb2R1Y3Rpb25BY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc3VwZXIod2luZG93KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGlzIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1nRGVzY3JpcHRvciA9IFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvcHJvZHVjdC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gaW1nRGVzY3JpcHRvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9OZXdCdXR0b25BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9OZXdCdXR0b25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2YTIzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvTmV3QnV0dG9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuUkNQVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIGRyb3AgZG93biBjb21ibyBmb3IgY3JlYXRpbmcgbmV3IG1ldGhvZCBsaWJyYXJ5LCBwbHVnLWluIGFuZAotICogY29uZmlndXJhdGlvbi4gVGhpcyBhY3Rpb24gaXMgaW52b2tlZCB2aWEgdGhlIE5ldyBidXR0b24gb24gdGhlIHN5c3RlbQotICogdG9vbGJhci4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0J1dHRvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElNZW51Q3JlYXRvciB7Ci0KLQlwcml2YXRlIE1lbnUgZmlsZU5ld0Ryb3Bkb3duID0gbnVsbDsKLQotCS8qIFNoZWxsLVNoYXJpbmcKLQlwcml2YXRlIE5ld0xpYnJhcnlBY3Rpb24gbmV3TGlicmFyeUFjdGlvbiA9IG51bGw7Ci0KLQlwcml2YXRlIE5ld1BsdWdpbkFjdGlvbiBuZXdQbHVnaW5BY3Rpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBOZXdDb25maWd1cmF0aW9uQWN0aW9uIG5ld0NvbmZpZ3VyYXRpb25BY3Rpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBOZXdXaXphcmRBY3Rpb24gbmV3V2l6YXJkQWN0aW9uID0gbnVsbDsKLQkqLwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3QnV0dG9uQWN0aW9uKCkgewotCQlzZXRJZCgiZmlsZU5ld0Ryb3Bkb3duIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VG9vbFRpcFRleHQoUkNQVUlSZXNvdXJjZXMubmV3RHJvcERvd25fdG9vbHRpcF90ZXh0KTsKLQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcigibmV3X2Nvbi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQotCQlzZXRNZW51Q3JlYXRvcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShDb250cm9sKQotCSAqLwotCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLQkJaWYgKGZpbGVOZXdEcm9wZG93biAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmlsZU5ld0Ryb3Bkb3duOwotCQl9Ci0KLQkJZmlsZU5ld0Ryb3Bkb3duID0gbmV3IE1lbnUocGFyZW50KTsKLQkJTWVudUl0ZW0gbmV3TGlicmFyeU1JdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVOZXdEcm9wZG93biwgU1dULlBVU0gpOwotCQluZXdMaWJyYXJ5TUl0ZW0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX0xJQkFSQVJZKTsKLQkJbmV3IE1lbnVJdGVtKGZpbGVOZXdEcm9wZG93biwgU1dULlNFUEFSQVRPUik7Ci0JCU1lbnVJdGVtIG5ld1BsdWdpbk1JdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVOZXdEcm9wZG93biwgU1dULlBVU0gpOwotCQluZXdQbHVnaW5NSXRlbS5zZXRUZXh0KExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfUExVR0lOKTsKLQkJTWVudUl0ZW0gbmV3Q29uZmlnTUl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU5ld0Ryb3Bkb3duLCBTV1QuUFVTSCk7Ci0JCW5ld0NvbmZpZ01JdGVtLnNldFRleHQoTGlicmFyeVVJVGV4dC5URVhUX01FVEhPRF9DT05GSUdVUkFUT04pOwotCQluZXcgTWVudUl0ZW0oZmlsZU5ld0Ryb3Bkb3duLCBTV1QuU0VQQVJBVE9SKTsKLQkJTWVudUl0ZW0gbmV3T3RoZXJNSXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5QVVNIKTsKLQkJbmV3T3RoZXJNSXRlbS5zZXRUZXh0KFJDUFVJUmVzb3VyY2VzLm90aGVyTWVudUl0ZW1fdGV4dCk7Ci0KLQkJLyogU2hlbGwtU2hhcmluZwkJCi0JCW5ld0xpYnJhcnlBY3Rpb24gPSBuZXcgTmV3TGlicmFyeUFjdGlvbigpOwotCQluZXdQbHVnaW5BY3Rpb24gPSBuZXcgTmV3UGx1Z2luQWN0aW9uKCk7Ci0JCW5ld0NvbmZpZ3VyYXRpb25BY3Rpb24gPSBuZXcgTmV3Q29uZmlndXJhdGlvbkFjdGlvbigpOwotCQlpZiAobmV3V2l6YXJkQWN0aW9uID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2JXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCW5ld1dpemFyZEFjdGlvbiA9IG5ldyBOZXdXaXphcmRBY3Rpb24od2JXaW5kb3cpOwotCQl9Ci0KLQkJbmV3TGlicmFyeU1JdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQluZXdMaWJyYXJ5QWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ld1BsdWdpbk1JdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQluZXdQbHVnaW5BY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQluZXdDb25maWdNSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbmV3Q29uZmlndXJhdGlvbkFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXdPdGhlck1JdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQluZXdXaXphcmRBY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQkqLwotCi0JCXJldHVybiBmaWxlTmV3RHJvcGRvd247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUoTWVudSkKLQkgKi8KLQlwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLyoKLQkJaWYgKG5ld1dpemFyZEFjdGlvbiA9PSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdiV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQluZXdXaXphcmRBY3Rpb24gPSBuZXcgTmV3V2l6YXJkQWN0aW9uKHdiV2luZG93KTsKLQkJfQotCQluZXdXaXphcmRBY3Rpb24ucnVuKCk7Ci0JCSovCi0JfQotCi0JLyoqCi0JICogZGlzcG9zZSB0aGUgZmlsZU5ld0Ryb3Bkb3duIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmaWxlTmV3RHJvcGRvd24gIT0gbnVsbCkgewotCQkJZmlsZU5ld0Ryb3Bkb3duLmRpc3Bvc2UoKTsKLQkJCWZpbGVOZXdEcm9wZG93biA9IG51bGw7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvTmV3V2l6YXJkTWVudS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld1dpemFyZE1lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwZDQ0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvTmV3V2l6YXJkTWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlTmV3V2l6YXJkTWVudTsKLQotLyoqCi0gKiBQb3B1bGF0ZXMgdGhlIEZpbGUgPiBOZXcgbWVudSB3aXRoIG5ldyB3aXphcmRzIGNhdGVnb3JpemVkIHVuZGVyCi0gKiAib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5ld1dpemFyZE1lbnUgZXh0ZW5kcyBCYXNlTmV3V2l6YXJkTWVudSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHdpemFyZCBzaG9ydGN1dCBtZW51IGZvciB0aGUgSURFLgotCSAqIAotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiAgICAgICAgICAgIHRoZSB3aW5kb3cgY29udGFpbmluZyB0aGUgbWVudQotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyaWJ1dGlvbiBpdGVtIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE5ld1dpemFyZE1lbnUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csIFN0cmluZyBpZCkgewotCQlzdXBlcih3aW5kb3csIGlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZU5ld1dpemFyZE1lbnUjYWRkSXRlbXMob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zKExpc3QgbGlzdCkgewotCQlpZiAoYWRkU2hvcnRjdXRzKGxpc3QpKSB7Ci0JCQkvLyBBZGQgYSBzZXBhcmF0b3IgYWZ0ZXIgdGhlIE1ldGhvZCBDT25maWd1cmF0aW9uIG1lbnUgaXRlbS4KLQkJCWlmIChsaXN0LnNpemUoKSA+IDMpIHsKLQkJCQlsaXN0LmFkZCgzLCBuZXcgU2VwYXJhdG9yKCkpOwotCQkJfQotCQkJbGlzdC5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCQlsaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShnZXRTaG93RGlhbG9nQWN0aW9uKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUFjdGlvbkZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUFjdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2MWU3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlBY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuUkNQVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJldGFyZ2V0QWN0aW9uOwotCi0vKioKLSAqIENyZWF0ZXMgYWN0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgRVBGIENvbXBvc2VyIHdvcmtiZW5jaC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVJQWN0aW9uRmFjdG9yeSBleHRlbmRzIEFjdGlvbkZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVUlBY3Rpb25GYWN0b3J5KFN0cmluZyBhY3Rpb25JZCkgewotCQlzdXBlcihhY3Rpb25JZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY3VzdG9taXplZCBTSE9XX0lOVFJPIGFjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBTSE9XX0lOVFJPID0gbmV3IEFjdGlvbkZhY3RvcnkoImludHJvIikgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJSVdvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgSW50cm9kdWN0aW9uQWN0aW9uKHdpbmRvdyk7Ci0JCQlhY3Rpb24uc2V0SWQoZ2V0SWQoKSk7Ci0JCQlyZXR1cm4gYWN0aW9uOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGN1c3RvbWl6ZWQgT1BFTl9FTEVNRU5UIGFjdGlvbiB0aGF0IGlzIGVxdWF2aWxlbnQgdG8gdGhlIEVESVQgbWVudQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBPUEVOX0VMRU1FTlQgPSBuZXcgQWN0aW9uRmFjdG9yeSgiZWRpdCIpIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCVJldGFyZ2V0QWN0aW9uIGFjdGlvbiA9IG5ldyBSZXRhcmdldEFjdGlvbigiT3BlbkVsZW1lbnQiLCAgLy8kTk9OLU5MUy0xJAotCQkJCQlSQ1BVSVJlc291cmNlcy5lZGl0TWVudUl0ZW1fdGV4dCk7Ci0JCQl3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIoYWN0aW9uKTsKLQkJCWFjdGlvbgotCQkJCQkuc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnMub3BlbkVsZW1lbnQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gd2luZG93LmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0JCQlhY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZX0RJU0FCTEVEKSk7Ci0KLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGN1c3RvbWl6ZWQgSU1QT1JUIGFjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBVSV9JTVBPUlQgPSBuZXcgQWN0aW9uRmFjdG9yeSgiaW1wb3J0IikgeyAvLyROT04tTkxTLTEkCi0JCQkJcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCUlXb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IFVJSW1wb3J0UmVzb3VyY2VzQWN0aW9uKHdpbmRvdyk7Ci0JCQkJCWFjdGlvbi5zZXRJZChnZXRJZCgpKTsKLQkJCQkJcmV0dXJuIGFjdGlvbjsKLQkJCQl9Ci0JfTsKLQkJCi0JLyoqCi0JICogV29ya2JlbmNoIGFjdGlvbiAoaWQgImV4cG9ydCIpOiBPcGVucyB0aGUgZXhwb3J0IHdpemFyZC4gVGhpcyBhY3Rpb24KLQkgKiBtYWludGFpbnMgaXRzIGVuYWJsZW1lbnQgc3RhdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpb25GYWN0b3J5IFVJX0VYUE9SVCA9IG5ldyBBY3Rpb25GYWN0b3J5KCJleHBvcnQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlJV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbih3aW5kb3cpOwotCQkJYWN0aW9uLnNldElkKGdldElkKCkpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUV4cG9ydFJlc291cmNlc0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJRXhwb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2I5NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJRXhwb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkcy5VSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkV4cG9ydFJlc291cmNlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIFVJRXhwb3J0UmVzb3VyY2VzQWN0aW9uIGV4dGVuZHMgRXhwb3J0UmVzb3VyY2VzQWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIID0gNDcwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUID0gNTUwOwotCi0JLyoqCi0JICogVGhlIHdvcmtiZW5jaCB3aW5kb3c7IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIGhhcyBiZWVuCi0JICogPGNvZGU+ZGlzcG9zZTwvY29kZT5kLgotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3c7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJdGhpcyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdvcmtiZW5jaAotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLCBsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd2luZG93Ci0JICovCi0JcHVibGljIFVJRXhwb3J0UmVzb3VyY2VzQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMod2luZG93LCBXb3JrYmVuY2hNZXNzYWdlcy5FeHBvcnRSZXNvdXJjZXNBY3Rpb25fdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd2luZG93Ci0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIFVJRXhwb3J0UmVzb3VyY2VzQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIod2luZG93LCBsYWJlbCk7Ci0JCXRoaXMud29ya2JlbmNoV2luZG93ID0gd2luZG93OwotCX0KLQotCXB1YmxpYyBVSUV4cG9ydFdpemFyZCBnZXRVSUV4cG9ydFdpemFyZCgpIHsKLQkJcmV0dXJuIG5ldyBVSUV4cG9ydFdpemFyZCgpOwotCX0KLQkKLQkvKioKLQkgKiBJbnZva2UgdGhlIEV4cG9ydCB3aXphcmRzIHNlbGVjdGlvbiBXaXphcmQuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAod29ya2JlbmNoV2luZG93ID09IG51bGwpIHsKLQkJCS8vIGFjdGlvbiBoYXMgYmVlbiBkaXNwb3NlZAotCQkJcmV0dXJuOwotCQl9Ci0JCVVJRXhwb3J0V2l6YXJkIHdpemFyZCA9IGdldFVJRXhwb3J0V2l6YXJkKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzczsKLQkJLy8gZ2V0IHRoZSBjdXJyZW50IHdvcmtiZW5jaCBzZWxlY3Rpb24KLQkJSVNlbGVjdGlvbiB3b3JrYmVuY2hTZWxlY3Rpb24gPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAod29ya2JlbmNoU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgd29ya2JlbmNoU2VsZWN0aW9uOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uVG9QYXNzID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCi0JCXdpemFyZC5pbml0KHdvcmtiZW5jaFdpbmRvdy5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uVG9QYXNzKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKCJFeHBvcnRSZXNvdXJjZXNBY3Rpb24iKTsgIC8vJE5PTi1OTFMtMSQKLQkJaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0JCQl3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0JCQkJCS5hZGROZXdTZWN0aW9uKCJFeHBvcnRSZXNvdXJjZXNBY3Rpb24iKTsgIC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLQkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotCQlTaGVsbCBwYXJlbnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cocGFyZW50LCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0JCQkJTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotCQkJCVNJWklOR19XSVpBUkRfSEVJR0hUKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLQkJCQlJV29ya2JlbmNoSGVscENvbnRleHRJZHMuRVhQT1JUX1dJWkFSRCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJSW1wb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlJbXBvcnRSZXNvdXJjZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExZWYwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlJbXBvcnRSZXNvdXJjZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGx2MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzLlVJSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuSW1wb3J0UmVzb3VyY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBVSUltcG9ydFJlc291cmNlc0FjdGlvbiBleHRlbmRzIEltcG9ydFJlc291cmNlc0FjdGlvbiB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEggPSA0NzA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9IRUlHSFQgPSA1NTA7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgVUlJbXBvcnRSZXNvdXJjZXNBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJdGhpcyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdpbmRvdwotCSAqLwotCXB1YmxpYyBVSUltcG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlzdXBlcih3aW5kb3cpOwotCQl0aGlzLndvcmtiZW5jaFdpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQlwdWJsaWMgVUlJbXBvcnRXaXphcmQgZ2V0VUlJbXBvcnRXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgVUlJbXBvcnRXaXphcmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogSW52b2tlIHRoZSBJbXBvcnQgd2l6YXJkcyBzZWxlY3Rpb24gV2l6YXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0JCQkvLyBhY3Rpb24gaGFzIGJlZW4gZGlzcG9zZWQKLQkJCXJldHVybjsKLQkJfQotCQlVSUltcG9ydFdpemFyZCB3aXphcmQgPSBnZXRVSUltcG9ydFdpemFyZCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25Ub1Bhc3M7Ci0JCS8vIGdldCB0aGUgY3VycmVudCB3b3JrYmVuY2ggc2VsZWN0aW9uCi0JCUlTZWxlY3Rpb24gd29ya2JlbmNoU2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHdvcmtiZW5jaFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHdvcmtiZW5jaFNlbGVjdGlvbjsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQotCQl3aXphcmQuaW5pdCh3b3JrYmVuY2hXaW5kb3cuZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvblRvUGFzcyk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbigiSW1wb3J0UmVzb3VyY2VzQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHdpemFyZFNldHRpbmdzID09IG51bGwpCi0JCQl3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0JCQkJCS5hZGROZXdTZWN0aW9uKCJJbXBvcnRSZXNvdXJjZXNBY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3Mod2l6YXJkU2V0dGluZ3MpOwotCQl3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCi0JCVNoZWxsIHBhcmVudCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhwYXJlbnQsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSgKLQkJCQlNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRILCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJU0laSU5HX1dJWkFSRF9IRUlHSFQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotCQkJCUlXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5JTVBPUlRfV0laQVJEKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxN2QzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbHYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uICBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0UGVyc3BlY3RpdmVEaWFsb2c7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBVSU9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbiBleHRlbmRzIE9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbiB7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdzsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdpbmRvdwotCSAqLwotCXB1YmxpYyBVSU9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlzdXBlcih3aW5kb3cpOwotCQl0aGlzLndvcmtiZW5jaFdpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkgLyoqCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotICAgICAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU2VsZWN0UGVyc3BlY3RpdmVEaWFsb2cgZGxnID0gbmV3IFNlbGVjdFBlcnNwZWN0aXZlRGlhbG9nKAotCQkJCXdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLCB3b3JrYmVuY2hXaW5kb3cuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCkpOwotCQlkbGcub3BlbigpOwotCQlpZiAoZGxnLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJcmV0dXJuOwotCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MgPSBkbGcuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCVBlcnNwZWN0aXZlVXRpbC5vcGVuUGVyc3BlY3RpdmUoZGVzYy5nZXRJZCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXdvcmtiZW5jaFdpbmRvdyA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4ZTc2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgYWN0aW9ucyBmb3IgdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3Nlci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmRjZWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJRXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkODc1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJRXhwb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLldpemFyZENhdGVnb3JpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuV2l6YXJkQ29sbGVjdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5Xb3JrYmVuY2hXaXphcmRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLkFkYXB0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkQ2F0ZWdvcnk7Ci0KLS8qKgotICogVUlFeHBvcnQgY2xhc3Mgd2lsbCBmaWx0ZXIgb3V0IHRoZSB3aXphcmQgY2F0ZWdvcmllcyB3aGljaCBhcmUgbm90IHJlbGF0ZWQgCi0gKiB0byBFUEYuIFVJRXhwb3J0IGFsbG93cyBvbmx5IFVuQ2F0ZWdvcml6ZWQgPGxpbms+V2l6YXJkc1JlZ2lzdHJ5UmVhZGVyLlVOQ0FURUdPUklaRURfV0laQVJEX0NBVEVHT1JZPC9saW5rPgotICogY2F0ZWdvcnkgICg8bGluaz5vcmcuZWNsaXBzZS51aS5PdGhlcnM8L2xpbms+KQotICogYW5kIGZpbHRlcnMgYXMgd2VsbCBpbiBPdGhlcnMgY2F0ZWdvcnkgd2l6YXJkcyBsaXN0LiAgCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJRXhwb3J0V2l6YXJkIGV4dGVuZHMgRXhwb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBBZGFwdGFibGVMaXN0IGdldEF2YWlsYWJsZUV4cG9ydFdpemFyZHMoKSB7Ci0JCS8vIFRPRE86IGV4cG9ydHMgYXJlIHN0aWxsIGZsYXQgLSB3ZSBuZWVkIHRvIGdldCBhdCB0aGUgZmxhdCBsaXN0LiBBbGwKLQkJLy8gd2l6YXJkcyB3aWxsIGJlIGluIHRoZSAib3RoZXIiIGNhdGVnb3J5LgotCQlJV2l6YXJkQ2F0ZWdvcnkgcm9vdCA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0RXhwb3J0V2l6YXJkUmVnaXN0cnkoKS5nZXRSb290Q2F0ZWdvcnkoKTsKLQkJV2l6YXJkQ29sbGVjdGlvbkVsZW1lbnQgY2F0ZWdvcnkgPSAoV2l6YXJkQ29sbGVjdGlvbkVsZW1lbnQpIHJvb3QKLQkJCQkuZmluZENhdGVnb3J5KG5ldyBQYXRoKFdpemFyZENhdGVnb3JpZXMuRVhQT1JUX1dJWkFSRFNfQ0FURUdPUlkpKTsKLQkJCi0JCUFkYXB0YWJsZUxpc3QgcmVzdWx0OwotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5ldyBBZGFwdGFibGVMaXN0KCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IGNhdGVnb3J5LmdldFdpemFyZEFkYXB0YWJsZUxpc3QoKTsKLQotCQlBZGFwdGFibGVMaXN0IGZpbHRlcmVkUmVzdWx0ID0gZG9GaWx0ZXIocmVzdWx0KTsKLQkJaWYoZmlsdGVyZWRSZXN1bHQuc2l6ZSgpID4gMCl7Ci0JCQlyZXR1cm4gZmlsdGVyZWRSZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogZmlsdGVyIG91dCBub24tYWxsb3dhYmxlIGV4cG9ydCB3aXphcmQgY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHJldHVybiBBZGFwdGFibGVMaXN0Ci0JICovCi0JcHVibGljIEFkYXB0YWJsZUxpc3QgZG9GaWx0ZXIoQWRhcHRhYmxlTGlzdCBsaXN0KXsKLQkJTGlzdCBleHRlbnNpb25zID0gVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5nZXRJbnN0YW5jZSgpLmdldFBhZ2VQcm92aWRlcnMoKTsKLQkJQWRhcHRhYmxlTGlzdCBmaWx0ZXJlZFJlc3VsdCA9IG5ldyBBZGFwdGFibGVMaXN0KCk7Ci0JCU9iamVjdFtdIG9ianMgPSBsaXN0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykgewotCQkJV29ya2JlbmNoV2l6YXJkRWxlbWVudCBvYmogPSAoV29ya2JlbmNoV2l6YXJkRWxlbWVudCkgb2Jqc1tpXTsKLQkJCVN0cmluZyBpZCA9IG9iai5nZXRJZCgpOwotCQkJaWYoIWV4dGVuc2lvbnMuaXNFbXB0eSgpICYmIGV4dGVuc2lvbnMuY29udGFpbnMoaWQpKXsKLQkJCQlmaWx0ZXJlZFJlc3VsdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsdGVyZWRSZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OTk3ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuUkNQVUlQbHVnaW47Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgJ29yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIiBleHRlbnNpb24gcG9pbnQuCi0gKiA8cD4KLSAqIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIGNvbnRyaWJ1dGluZyBwbHVnLWluIHRvIGFkZCBpdHMgZXhwb3J0IHdpemFyZHMKLSAqIHRvIHRoZSBzdGFuZGFsb25lIFJDUC1iYXNlZCBFUEYgQ29tcG9zZXIgRXhwb3J0IHdpemFyZCBwYWdlLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSA9ICJleHBvcnRXaXphcmRzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBBdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXJyYXlMaXN0IGV4dGVuc2lvbnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50IGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBVSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50KCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBwYWdlIHByb3ZpZGVycwotCSAqIAotCSAqIEByZXR1cm4gYWxsIHRoZSBwYWdlIHByb3ZpZGVycy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQYWdlUHJvdmlkZXJzKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvdmlkZXJzIHNwZWNpZmllZCB2aWEgdGhlCi0JICogIm9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEV4dGVuc2lvbigpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSwKLQkJCQlQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0lEKTsKLQkJCQkJCWV4dGVuc2lvbnNMaXN0LmFkZChpZCk7Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVJDUFVJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkiRmFpbGVkIHRvIGV4cG9ydCBpbXBvcnQgY29udHJpYnV0aW9uIGV4dGVuc2lvbiBwb2ludHMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUltcG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTNhMGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5XaXphcmRDYXRlZ29yaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldpemFyZENvbGxlY3Rpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuV29ya2JlbmNoV2l6YXJkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5BZGFwdGFibGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZENhdGVnb3J5OwotCi0vKioKLSAqIFVJSW1wb3J0IGNsYXNzIHdpbGwgZmlsdGVyIG91dCB0aGUgd2l6YXJkIGNhdGVnb3JpZXMgd2hpY2ggYXJlIG5vdCByZWxhdGVkIHRvCi0gKiBFUEYuIFVJSW1wb3J0IGFsbG93cyBvbmx5IFVuQ2F0ZWdvcml6ZWQKLSAqIDxsaW5rPldpemFyZHNSZWdpc3RyeVJlYWRlci5VTkNBVEVHT1JJWkVEX1dJWkFSRF9DQVRFR09SWTwvbGluaz4gY2F0ZWdvcnkgKDxsaW5rPm9yZy5lY2xpcHNlLnVpLk90aGVyczwvbGluaz4pCi0gKiBhbmQgZmlsdGVycyBhcyB3ZWxsIGluIE90aGVycyBjYXRlZ29yeSB3aXphcmRzIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0b3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBVSUltcG9ydFdpemFyZCBleHRlbmRzIEltcG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgd2l6YXJkcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIGludm9jYXRpb24uIEFsc28gZmlsdGVyCi0JICogaW1wb3J0IHdpemFyZCBsaXN0IG9mIHVuY2F0ZWdvcml6ZWQgKG9yZy5lY2xpcHNlLnVpLk90aGVycykKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRhYmxlTGlzdCBnZXRBdmFpbGFibGVJbXBvcnRXaXphcmRzKCkgewotCQkvLyBUT0RPOiBpbXBvcnRzIGFyZSBzdGlsbCBmbGF0IC0gd2UgbmVlZCB0byBnZXQgYXQgdGhlIGZsYXQgbGlzdC4gQWxsCi0JCS8vIHdpemFyZHMgd2lsbCBiZSBpbiB0aGUgIm90aGVyIiBjYXRlZ29yeS4KLQkJSVdpemFyZENhdGVnb3J5IHJvb3QgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEltcG9ydFdpemFyZFJlZ2lzdHJ5KCkuZ2V0Um9vdENhdGVnb3J5KCk7Ci0JCVdpemFyZENvbGxlY3Rpb25FbGVtZW50IGNhdGVnb3J5ID0gKFdpemFyZENvbGxlY3Rpb25FbGVtZW50KSByb290Ci0JCQkJLmZpbmRDYXRlZ29yeShuZXcgUGF0aChXaXphcmRDYXRlZ29yaWVzLklNUE9SVF9XSVpBUkRTX0NBVEVHT1JZKSk7Ci0JCUFkYXB0YWJsZUxpc3QgcmVzdWx0OwotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5ldyBBZGFwdGFibGVMaXN0KCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IGNhdGVnb3J5LmdldFdpemFyZEFkYXB0YWJsZUxpc3QoKTsKLQotCQlBZGFwdGFibGVMaXN0IGZpbHRlcmVkUmVzdWx0ID0gZG9GaWx0ZXIocmVzdWx0KTsKLQkJaWYgKGZpbHRlcmVkUmVzdWx0LnNpemUoKSA+IDApIHsKLQkJCXJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEZpbHRlciBvdXQgbm9uLWFsbG93YWJsZSBpbXBvcnQgd2l6YXJkIGNhdGVnb3JpZXMKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEByZXR1cm4gQWRhcHRhYmxlTGlzdAotCSAqLwotCXB1YmxpYyBBZGFwdGFibGVMaXN0IGRvRmlsdGVyKEFkYXB0YWJsZUxpc3QgbGlzdCkgewotCQlMaXN0IGV4dGVuc2lvbnMgPSBVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UGFnZVByb3ZpZGVycygpOwotCQlBZGFwdGFibGVMaXN0IGZpbHRlcmVkUmVzdWx0ID0gbmV3IEFkYXB0YWJsZUxpc3QoKTsKLQkJT2JqZWN0W10gb2JqcyA9IGxpc3QuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQlXb3JrYmVuY2hXaXphcmRFbGVtZW50IG9iaiA9IChXb3JrYmVuY2hXaXphcmRFbGVtZW50KSBvYmpzW2ldOwotCQkJU3RyaW5nIGlkID0gb2JqLmdldElkKCk7Ci0JCQlpZiAoIWV4dGVuc2lvbnMuaXNFbXB0eSgpICYmIGV4dGVuc2lvbnMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZmlsdGVyZWRSZXN1bHQuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkUmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTU1ZjUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuUkNQVUlQbHVnaW47Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgJ29yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzIiBleHRlbnNpb24gcG9pbnQuCi0gKiA8cD4KLSAqIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIGNvbnRyaWJ1dGluZyBwbHVnLWluIHRvIGFkZCBpdHMgaW1wb3J0IHdpemFyZHMKLSAqIHRvIHRoZSBzdGFuZGFsb25lIFJDUC1iYXNlZCBFUEYgQ29tcG9zZXIgSW1wb3J0IHdpemFyZCBwYWdlLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSA9ICJpbXBvcnRXaXphcmRzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBBdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXJyYXlMaXN0IGV4dGVuc2lvbnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50IGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50KCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBwYWdlIHByb3ZpZGVycwotCSAqIAotCSAqIEByZXR1cm4gYWxsIHRoZSBwYWdlIHByb3ZpZGVycy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQYWdlUHJvdmlkZXJzKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvdmlkZXJzIHNwZWNpZmllZCB2aWEgdGhlCi0JICogImNvbS5pYm0ucHJvY2Vzcy5wYWdlUHJvdmlkZXJzIiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEV4dGVuc2lvbigpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSwKLQkJCQlQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0lEKTsKLQkJCQkJCWV4dGVuc2lvbnNMaXN0LmFkZChpZCk7Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVJDUFVJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkiRmFpbGVkIHRvIGV4cG9ydCBpbXBvcnQgY29udHJpYnV0aW9uIGV4dGVuc2lvbiBwb2ludHMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkMGU3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZXhwb3J0IGFuZCBpbXBvcnQgd2l6YXJkcyBVSSBtYW5hZ2VtZW50IGluIHRoZSBzdGFuZGFsb25lIFJDUC1iYXNlZCBFUEYgQ29tcG9zZXIuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGYwZjQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDUxODNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucmNwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjQzZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZlYXR1cmVQbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucmNwOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0ZjRmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVmZWF0dXJlVGV4dAotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9YXBwbGljYXRpb25fMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotYXBwTmFtZT0lZmVhdHVyZU5hbWUKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi13ZWxjb21lUGFnZT0kbmwkL3dlbGNvbWUueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0Lm1hcHBpbmdzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkZmRkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0jIFVzdWFsbHkgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUuCi0KLTA9QGJ1aWxkLUlEQAotMT0xLjUuMApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2I2MjY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cblwKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYXBwbGljYXRpb25fMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYXBwbGljYXRpb25fMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTA1MjljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIG5sLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uXzMyLmdpZixcCi0gICAgICAgICAgICAgICB3ZWxjb21lLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQ3NTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnlnZ2VldGlrZXQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGUvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1MmEyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIC0gUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQtS2VubnNhdHo6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2VzL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWIwMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPVJDUCBkZSBFUEYKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1WZXJzaVx1MDBmM246IHsxfSBcblwKLUV0aXF1ZXRhIGRlIGJ1aWxkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBDb2xhYm9yYWRvcmVzIGRlIEVjbGlwc2UgeSBvdHJvcyAyMDAwLCAyMDA3LiAgUmVzZXJ2YWRvcyB0b2RvcyBsb3MgZGVyZWNob3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiODIwZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1WZXJzaW9uIDogezF9IFxuXAotTGliZWxsXHUwMGU5IGRlIHZlcnNpb24gOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2ZlMWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvaXQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1SQ1AgRVBGCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lvbmU6IHsxfSBcblwKLUV0aWNoZXR0YSBidWlsZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgZSBhbHRyaSAyMDAwLCAyMDA3LiAgVHV0dGkgaSBkaXJpdHRpIHJpc2VydmF0aS5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvamEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvamEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlODUyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2phL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMzogezF9IFxuXAotXHUzMGQzXHUzMGViXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGQ5XHUzMGViOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9rby9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9rby9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZkNTVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avbmwva28vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotXHViYzg0XHVjODA0OiB7MX0gXG5cCi1cdWJlNGNcdWI0ZGMgXHViODA4XHVjNzc0XHViZTE0OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDAwNmYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc1x1MDBlM286IHsxfSBcblwKLUNvbnN0cnVcdTAwZTdcdTAwZTNvOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBFY2xpcHNlIGUgb3V0cm9zIDIwMDAsIDIwMDcuIFRvZG9zIG9zIERpcmVpdG9zIFJlc2VydmFkb3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3J1L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3J1L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTQyYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGY6IHsxfSBcblwKLVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzMDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgXHUwNDEyXHUwNDQxXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0NDlcdTA0MzhcdTA0NDlcdTA0MzVcdTA0M2RcdTA0NGIuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MDUyOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX0gXG5cCi1cdTVkZTVcdTRmNWNcdTcyNDhcdTY3MmNcdTY4MDdcdTdiN2VcdWZmMWF7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIFxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwNzllMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYXsxfVxuXAotXHU1ZWZhXHU3ZjZlXHU2YTE5XHU3YzY0XHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjlmZTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBSQ1AgRmVhdHVyZQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgUkNQIEZlYXR1cmUgKE5MMSkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avd2VsY29tZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQwZDA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avd2VsY29tZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx3ZWxjb21lUGFnZSAKLQl0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayI+Ci0KLTxpbnRybz5XZWxjb21lIHRvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsKLTwvaW50cm8+Ci0KLTxpdGVtPjxiPldoYXQgaXMgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yaz88L2I+Ci0JCi08L2l0ZW0+Ci0KLTxpdGVtPjxiPkxlYXJuIE1vcmU8L2I+Ci0KLTwvaXRlbT4KLQotPC93ZWxjb21lUGFnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGYyMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGRkODk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgUmljaCBUZXh0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzlhNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4YmVhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ci1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiByaWNodGV4dC5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQsCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MsCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwsCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnByZWZlcmVuY2VzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTkwODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE1ZDU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lZmVhdHVyZVRleHQKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWFwcGxpY2F0aW9uXzMyLmdpZgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQubWFwcGluZ3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTkyN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0jIFVzdWFsbHkgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUuCi0KLTA9QGJ1aWxkLUlEQAotMT0xLjUuMC4wCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJkNWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSaWNodGV4dAotCi1mZWF0dXJlVGV4dD1FUEYgUmljaHRleHRcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cblwKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYXBwbGljYXRpb25fMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2FwcGxpY2F0aW9uXzMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYXBwbGljYXRpb25fMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3YjY2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXNvdXJjZS5yaWNodGV4dC5qYXIgPSBzcmMvCi1vdXRwdXQucmljaHRleHQuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcmljaHRleHQuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcnRlLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYXBwbGljYXRpb25fMzIuZ2lmCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkSW1hZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRJbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDhhOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRJbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZExpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxMTE5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhZTQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVGFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRUYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODg0NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRUYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRVbm9yZGVyZWRMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0NGVjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Cb2xkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzU5ODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Cb2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ2xlYXJDb250ZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ2xlYXJDb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmNjQxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NvcHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Db3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliYzY1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9DdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9DdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQzMTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvRmluZFJlcGxhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9GaW5kUmVwbGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Zjg4NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9GaW5kUmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNmUxNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JdGFsaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JdGFsaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI1YTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvT3V0ZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L091dGRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGNkYTNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvT3V0ZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzc2NjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlUGxhaW5UZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxYTIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlUGxhaW5UZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3Vic2NyaXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3Vic2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiMzFhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1YnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1cGVyc2NyaXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3VwZXJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGIyNjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3VwZXJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9UaWR5SFRNTC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1RpZHlIVE1MLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiYzlkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1RpZHlIVE1MLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvVW5kZXJsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvVW5kZXJsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhOTY0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1VuZGVybGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQ1MjEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDhkY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTkxOTRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkT3JkZXJlZExpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjgxNGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkT3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFRhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2ODg1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFRhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZkZmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0JvbGQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Cb2xkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkZjllNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU4MzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ2xlYXJDb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ29weS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NvcHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzJhY2VlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ29weS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0N1dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0N1dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODYzNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0ZpbmRSZXBsYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyNTdlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0ZpbmRSZXBsYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSW5kZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSW5kZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxOTVkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0luZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0l0YWxpYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0l0YWxpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMGNkMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JdGFsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5Q2VudGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUNlbnRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYWJmMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5Q2VudGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5RnVsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MGEzYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5RnVsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUxlZnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODU0NjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUxlZnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5UmlnaHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5UmlnaHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA1YWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeVJpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvT3V0ZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L091dGRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDZiOTRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvT3V0ZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvUGFzdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQzOWExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvUGFzdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlUGxhaW5UZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmOTg5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlUGxhaW5UZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3RyaWtlVGhyb3VnaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N0cmlrZVRocm91Z2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTAzNTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3RyaWtlVGhyb3VnaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1YnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1YnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGY3MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdXBlcnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1cGVyc2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4NjYzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1cGVyc2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvVGlkeUhUTUwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9UaWR5SFRNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjI0MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9UaWR5SFRNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1VuZGVybGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1VuZGVybGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDc2ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9VbmRlcmxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzczMjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgUmljaCBUZXh0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0OWI1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ibGFuay5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL2JsYW5rLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5NzI3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL2JsYW5rLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjNmM5ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotIAlmb250LXNpemU6IDEwcHQ7Ci0JbWFyZ2luOiAzcHg7Ci0JcGFkZGluZzogMHB4OyAJCi19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotaDEgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci0KLWgyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1MCU7Ci19Ci0KLWgzIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotaDQsIGg1LCBoNiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLWE6bGluayB7Ci0JY29sb3I6ICMwMDMzOTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYTphY3RpdmUgewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYTp2aXNpdGVkIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hOmhvdmVyIHsKLQljb2xvcjogI2ZmMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLW9sIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotfQotCi1vbCBsaSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtYWxpZ246IGxlZnQKLX0KLQotdWwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlsaXN0LXN0eWxlLXR5cGU6IGRpc2M7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotfQotCi11bCBsaSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLXRhYmxlIHsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQ6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwkKLX0KLQotdGJvZHkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl2YWxpZ246IGJhc2VsaW5lOwotfQotCi10aCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXRkIHVsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotfQotCi0ucGFnZVRpdGxlIHsKLQliYWNrZ3JvdW5kOiAjOTk5OWNjOwotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtc2l6ZTogMTJwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiA1cHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnBhZ2VUaXRsZVNlcGFyYXRvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS50YWIgewotCWJhY2tncm91bmQtY29sb3I6ICM1YzgxYTc7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5hY3RpdmVUYWIgewotCWJhY2tncm91bmQtY29sb3I6ICNjOGQ3ZTM7Ci0JY29sb3I6ICMyOTNkNmI7CQotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1hLnRhYjpsaW5rLCBhLnRhYjphY3RpdmUsIGEudGFiOnZpc2l0ZWQgewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1hLnRhYjpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CQotfQotCi0ub3ZlcnZpZXcgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXBhZGRpbmctbGVmdDogMjBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci19Ci0KLS5vdmVydmlld1RhYmxlIHsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCXdpZHRoOiAxMDAlOwkKLX0KLQotLm92ZXJ2aWV3VGFibGUgdGQgewotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiA1cHg7Ci0JcGFkZGluZy1yaWdodDogNXB4OwotCXBhZGRpbmctdG9wOiA1cHg7Ci19Ci0KLS5vdmVydmlld1NlcGFyYXRvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZVRleHQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlwYWRkaW5nLWxlZnQ6IDVweDsKLQlwYWRkaW5nLXJpZ2h0OiA1cHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbmsgewotCWNvbG9yOiAjMzMzMzMzOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rOmhvdmVyIHsKLQljb2xvcjogIzAwMDBmZjsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluazp2aXNpdGVkIHsKLQljb2xvcjogIzMzMzMzMzsKLX0KLQotLnNlY3Rpb25IZWFkaW5nIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOThiMWM0OwotCWNvbG9yOiAjZmZmZmZmOwotCWN1cnNvcjogaGFuZDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDJweDsKLQlwYWRkaW5nLWxlZnQ6IDJweDsKLQlwYWRkaW5nLXRvcDogMnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnNlY3Rpb25Db250ZW50IHsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMHB4OwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi0uc2VjdGlvblRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDFweDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMTBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnNlY3Rpb25UYWJsZUhlYWRpbmcgewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXdpZHRoOiAyMCU7Ci19Ci0KLS5zZWN0aW9uVGFibGVDZWxsIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLX0KLQotLmJyZWFrZG93blRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDFweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uYnJlYWtkb3duVGFibGUgdGggewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uYnJlYWtkb3duVGFibGUgdGQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uZGVmYXVsdFRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uZGVmYXVsdFRhYmxlIHRkIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uc3ViU2VjdGlvbkhlYWRpbmcgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zdWJTZWN0aW9uQ29udGVudCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5zdGVwSGVhZGluZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLQljb2xvcjogIzI5M2Q2YjsKLQljdXJzb3I6IGhhbmQ7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiAycHg7Ci0JcGFkZGluZy1sZWZ0OiAycHg7Ci0JcGFkZGluZy10b3A6IDJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zdGVwQ29udGVudCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLnN0ZXBUYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogIzk5OTk5OSBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICM5OTk5OTkgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDIwcHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5zdGVwVGFibGUgdGQgewotCWJvcmRlcjogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5zdGVwU2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLmJhY2tUb1RvcExpbmsgewotCWNvbG9yOiAjZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7CQotCW1hcmdpbjogMHB4OwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXRleHQtYWxpZ246IG1pZGRsZTsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmFja1RvVG9wTGluazpob3ZlciB7Ci0JY29sb3I6ICM5Njk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rOnZpc2l0ZWQgewotCWNvbG9yOiAjNWM4MWE3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjNzA4MGIwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDI1cHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnZlcnNpb25JbmZvIHsKLQljb2xvcjogIzcwODBiMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAyNXB4OwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi0ucXVvdGUgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5jb2RlU2FtcGxlIHsKLQlmb250LWZhbWlseTogY291cmllcjsKLQlmb250LXNpemU6IDEwcHQ7CQkKLX0KLQotLmVsZW1lbnRMaW5rIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7CQotCWNvbG9yOiAjMDAwMGZmOwotfQotCi0uZWxlbWVudExpbmtXaXRoVHlwZSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWNvbG9yOiAjMDAwMGZmOwotfQotCi0uZWxlbWVudExpbmtXaXRoVXNlclRleHQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQljb2xvcjogIzAwMDBmZjsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDUxY2I3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCTxoZWFkPgotCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icnRlLmpzIj48L3NjcmlwdD4JCQotCTwvaGVhZD4KLQk8Ym9keSBsZWZ0TWFyZ2luPSIwIiB0b3BNYXJnaW49IjAiIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjAiIHNjcm9sbD0ibm8iIHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuIj4KLQkJPGlmcmFtZSBpZD0icnRlIiBuYW1lPSJydGUiIHN0eWxlPSJib3JkZXI6IG5vbmU7IiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJhdXRvIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJaW5pdEVkaXRvcigncnRlJywgJ3J0ZS5jc3MnLCBudWxsKTsKLQkJPC9zY3JpcHQ+Ci0JPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlYWUyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDEzNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQGF1dGhvciBLZWx2aW4gTG93Ci0vLyBAc2luY2UgMS4wCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm90ZTogTW96aWxsYS9GaXJlZm94IGRvZXMgbm90IGFsbG93IHVucHJpdmlsZWdlZCBzY3JpcHRzIHRvIGludm9rZSB0aGUgY3V0LAotLy8gY29weSBhbmQgcGFzdGUgY29tbWFuZHMuIFRoZSBKYXZhc2NyaXB0IG11c3QgZWl0aGVyIGJlIHNpZ25lZAotLy8gKHNlZSBodHRwOi8vd3d3Lm1vemlsbGEub3JnL3Byb2plY3RzL3NlY3VyaXR5L2NvbXBvbmVudHMvc2lnbmVkLXNjcmlwdHMuaHRtbCksCi0vLyBvciB0aGUgdXNlcnMgbXVzdCBjaGFuZ2UgdGhlaXIgcHJlZmVyZW5jZXMKLS8vIChzZWUgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9lZGl0b3IvbWlkYXNkZW1vL3NlY3VyaXR5cHJlZnMuaHRtbCkuCi0vLyBBbHRlcm5hdGl2ZWx5LCB0aGUgdXNlcnMgY2FuIHVzZSB0aGUgY3RybC14LCBjdHJsLWMgYW5kIGN0cmwtdiBrZXlzLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdmFyIFNUQVRVU19OT1AgPSAwOwotdmFyIFNUQVRVU19JTklUSUFMSVpFRCA9IDE7Ci12YXIgU1RBVFVTX01PRElGSUVEID0gMjsKLXZhciBTVEFUVVNfR0VUX1RFWFQgPSAzOwotdmFyIFNUQVRVU19LRVlfRE9XTiA9IDQ7Ci12YXIgU1RBVFVTX0tFWV9VUCA9IDU7Ci12YXIgU1RBVFVTX1NFTEVDVF9URVhUID0gNjsKLXZhciBTVEFUVVNfU0VMRUNUX0NPTlRST0wgPSA3OwotdmFyIFNUQVRVU19TRUxFQ1RfTk9ORSA9IDg7Ci12YXIgU1RBVFVTX0VYRUNfQ01EID0gOTsKLXZhciBTVEFUVVNfUkVGT1JNQVRfTElOS1MgPSAxMDsKLQotdmFyIEtFWV9BUlJPV19ET1dOID0gNDA7Ci12YXIgS0VZX0FSUk9XX0xFRlQgPSAzNzsKLXZhciBLRVlfQVJST1dfUklHSFQgPSAzOTsKLXZhciBLRVlfQVJST1dfVVAgPSAzODsKLXZhciBLRVlfQkFDS1NQQUNFID0gODsKLXZhciBLRVlfRU5EID0gMzU7Ci12YXIgS0VZX0hPTUUgPSAzNjsKLXZhciBLRVlfUEFHRV9ET1dOID0gMzQ7Ci12YXIgS0VZX1BBR0VfVVAgPSAzMzsKLXZhciBLRVlfVEFCID0gOTsKLXZhciBLRVlfQyA9IDY3OwotdmFyIEtFWV9GID0gNzA7Ci12YXIgS0VZX1MgPSA4MzsKLXZhciBLRVlfViA9IDg2OwotdmFyIEtFWV9YID0gODg7Ci12YXIgS0VZX1ogPSA5MDsKLQotdmFyIENNRF9DT1BZID0gImNvcHkiOwotdmFyIENNRF9DVVQgPSAiY3V0IjsKLXZhciBDTURfRklORF9URVhUID0gImZpbmRUZXh0IjsKLXZhciBDTURfUEFTVEUgPSAicGFzdGUiOwotdmFyIENNRF9TQVZFID0gInNhdmUiOwotdmFyIENNRF9TQVZFX0FMTCA9ICJzYXZlQWxsIjsKLQotdmFyIFRBQkxFX0hFQURFUlNfTk9ORSA9IDA7Ci12YXIgVEFCTEVfSEVBREVSU19DT0xTID0gMTsKLXZhciBUQUJMRV9IRUFERVJTX1JPV1MgPSAyOwotdmFyIFRBQkxFX0hFQURFUlNfQk9USCA9IDM7Ci0KLXZhciBCT0xEID0gMTsKLXZhciBJVEFMSUMgPSBCT0xEIDw8IDE7Ci12YXIgVU5ERVJMSU5FID0gSVRBTElDIDw8IDE7Ci12YXIgU1VCU0NSSVBUID0gVU5ERVJMSU5FIDw8IDE7Ci12YXIgU1VQRVJTQ1JJUFQgPSBTVUJTQ1JJUFQgPDwgMTsKLQotCi12YXIgZWRpdG9ySWQ7Ci12YXIgZWRpdG9yQ1NTOwotdmFyIGJhc2VIUkVGOwotdmFyIHN1cHBvcnRSaWNoVGV4dEVkaXRpbmcgPSB0cnVlOwotdmFyIGVkaXRvckRvYzsKLXZhciBzZWxlY3Rpb247Ci12YXIgc2VsZWN0aW9uUmFuZ2U7Ci12YXIgcmVhZE9ubHkgPSBmYWxzZTsKLXZhciBpbml0aWFsaXplZCA9IGZhbHNlOwotdmFyIG1vZGlmaWVkID0gZmFsc2U7Ci12YXIgY2hlY2tSZXNpemVFbGVtZW50OwotdmFyIHNlbGVjdGlvbkluZm8gPSBudWxsOwotCi0vLyBJbml0aWFsaXplcyB0aGUgZWRpdG9yLgotZnVuY3Rpb24gaW5pdEVkaXRvcihpZCwgY3NzLCBiYXNlVVJMKSB7Ci0JZWRpdG9ySWQgPSBpZDsKLQllZGl0b3JDU1MgPSBjc3M7Ci0JYmFzZUhSRUYgPSBiYXNlVVJMOwotCXRyeSB7Ci0JCWVuYWJsZVJpY2hUZXh0RWRpdGluZygnJyk7Ci0JCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJc2V0U3RhdHVzKFNUQVRVU19JTklUSUFMSVpFRCwgbnVsbCk7Ci0JfQotCWNhdGNoIChlKSB7Ci0JCXN1cHBvcnRSaWNoVGV4dEVkaXRpbmcgPSBmYWxzZTsKLQl9Ci19Ci0KLS8vIEhhbmRsZXMgdGhlIGtleSBldmVudHMuCi1mdW5jdGlvbiBrZXlQcmVzc2VkKGV2ZW50KSB7Ci0JdmFyIGtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotCWlmIChrZXlDb2RlID09IDAgJiYgIWRvY3VtZW50LmFsbCkgewotCQlrZXlDb2RlID0gZXZlbnQuY2hhckNvZGU7Ci0JCXN3aXRjaCAoa2V5Q29kZSkgewotCQkJY2FzZSA5OToKLQkJCQlrZXlDb2RlID0gS0VZX0M7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEwMjoKLQkJCQlrZXlDb2RlID0gS0VZX0Y7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDExNToKLQkJCQlrZXlDb2RlID0gS0VZX1M7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDExODoKLQkJCQlrZXlDb2RlID0gS0VZX1Y7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEyMDoKLQkJCQlrZXlDb2RlID0gS0VZX1g7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEyMjoKLQkJCQlrZXlDb2RlID0gS0VZX1o7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JdmFyIGN0cmxLZXkgPSBldmVudC5jdHJsS2V5OwotCXZhciBzaGlmdEtleSA9IGV2ZW50LnNoaWZ0S2V5OwotCQotCXN3aXRjaChrZXlDb2RlKSB7Ci0JCWNhc2UgS0VZX0FSUk9XX0RPV046Ci0JCWNhc2UgS0VZX0FSUk9XX0xFRlQ6Ci0JCWNhc2UgS0VZX0FSUk9XX1JJR0hUOgotCQljYXNlIEtFWV9BUlJPV19VUDoKLQkJY2FzZSBLRVlfRU5EOgotCQljYXNlIEtFWV9IT01FOgotCQljYXNlIEtFWV9QQUdFX0RPV046Ci0JCWNhc2UgS0VZX1BBR0VfVVA6Ci0JCWNhc2UgS0VZX1RBQjoKLQkJCWJyZWFrOwotCQljYXNlIEtFWV9CQUNLU1BBQ0U6Ci0JCQlpZiAoIXJlYWRPbmx5KSB7Ci0JCQkJc2V0VGltZW91dCgic2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7IiwgMTApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX0M6Ci0JCQlpZiAoY3RybEtleSkgewotCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9DT1BZKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJYnJlYWs7CQkJCi0JCWNhc2UgS0VZX0Y6Ci0JCQlpZiAoY3RybEtleSkgewotCQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQkJZXZlbnQua2V5Q29kZSA9IC0xOwotCQkJCQlldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCQl9Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX0ZJTkRfVEVYVCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEtFWV9TOgotCQkJaWYgKCFyZWFkT25seSAmJiBjdHJsS2V5KSB7Ci0JCQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJCQlldmVudC5rZXlDb2RlID0gLTE7Ci0JCQkJCWV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJCX0KLQkJCQlpZiAoc2hpZnRLZXkpIHsKLQkJCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX1NBVkVfQUxMKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9TQVZFKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0JCQkKLQkJCWJyZWFrOwotCQljYXNlIEtFWV9WOgotCQkJaWYgKGN0cmxLZXkpIHsJCQotCQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQkJZXZlbnQua2V5Q29kZSA9IC0xOwotCQkJCQlldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQkJCQlpZiAoIXJlYWRPbmx5KSB7Ci0JCQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfUEFTVEUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoIXJlYWRPbmx5KSB7Ci0JCQkJCQkvLyBXb3JrYXJvdW5kIE1vemlsbGEvRmlyZWZveCBwYXN0ZSBpc3N1ZXMuCi0JCQkJCQlzZXRUaW1lb3V0KCJzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfUEFTVEUpOyIsIDEwKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEtFWV9YOgotCQkJaWYgKGN0cmxLZXkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfQ1VUKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX1o6Ci0JCQlpZiAoIXJlYWRPbmx5ICYmIGN0cmxLZXkpIHsKLQkJCQlzZXRUaW1lb3V0KCJzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsiLCAxMCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0JCQkKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKCFkb2N1bWVudC5hbGwgJiYgcmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCX0KLX0KLQotZnVuY3Rpb24gc2VsQ2hhbmdlZChldmVudCkgewotCXVwZGF0ZVNlbGVjdGlvbigpOwotfQotCi1mdW5jdGlvbiBlbmFibGVSaWNoVGV4dEVkaXRpbmcoaHRtbCkgewotCXZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudDsKLQlkb2MuZGVzaWduTW9kZSA9ICJvbiI7Ci0JCi0JdmFyIGh0bWxTcmMgPSAnPGh0bWw+PGhlYWQ+PHRpdGxlPjwvdGl0bGU+JzsKLQkKLQlpZiAoZWRpdG9yQ1NTICE9IG51bGwgJiYgZWRpdG9yQ1NTICE9ICcnKSB7Ci0JCWh0bWxTcmMgKz0gJzxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0iJyArIGVkaXRvckNTUyArICciIHR5cGU9InRleHQvY3NzIi8+JzsKLQl9Ci0JCi0JaWYgKGJhc2VIUkVGICE9IG51bGwgJiYgYmFzZUhSRUYgIT0gJycpIHsJCi0JCWh0bWxTcmMgKz0gJzxiYXNlIGhyZWY9IicgKyBiYXNlSFJFRiArICciLz4nOwotCX0KLQkKLQlpZiAoIWRvY3VtZW50LmFsbCAmJiBodG1sID09ICcnKSB7Ci0JCS8vIE1vemlsbGEvRmlyZWZveCB3aWxsIG9ubHkgZGlzcGxheSB0aGUgY2FyZXQgaWYgPGJyLz4gaXMgYWRkZWQgdG8gdGhlIEhUTUwgYm9keS4KLQkJLy8gQWRkaW5nIDxici8+IGFsc28gZW5hYmxlcyB0aGUgYmFja3NwYWNlIGFuZCBkZWxldGUga2V5IGJ5IGRlZmF1bHQuIE90aGVyd2lzZSwgdGhlCi0JCS8vIHVzZXIgbmVlZCB0byBlbnRlciBzb21lIHRleHQgYmVmb3JlIHRoZXNlIDIga2V5cyBzdGFydCB0byBmdW5jdGlvbi4KLQkJaHRtbCA9ICI8YnIgLz4iOwotCX0KLQkKLQlodG1sU3JjICs9ICc8L2hlYWQ+PGJvZHk+JyArIGh0bWwgKyAnPC9ib2R5PjwvaHRtbD4nOwotCQotCWRvYy5vcGVuKCk7Ci0JZG9jLndyaXRlKGh0bWxTcmMpOwotCWRvYy5jbG9zZSgpOwotCQotCW1vZGlmaWVkID0gZmFsc2U7Ci0KLQlpZiAoImF0dGFjaEV2ZW50IiBpbiBkb2MpIHsKLQkJZG9jLmF0dGFjaEV2ZW50KCJvbmtleWRvd24iLCBrZXlQcmVzc2VkKTsKLQkJZG9jLmF0dGFjaEV2ZW50KCJvbnNlbGVjdGlvbmNoYW5nZSIsIHNlbENoYW5nZWQpOwotCQkvLyBmb3IgRG5EIChpbnRlcm5hbCkKLQkJZG9jLmJvZHkuYXR0YWNoRXZlbnQoIm9uZHJvcCIsIGNoZWNrTW9kaWZpZWQpOwotCQkvLyBmb3IgaW1hZ2UvdGFibGUgcmVzaXppbmc6Ci0JCWRvYy5ib2R5LmF0dGFjaEV2ZW50KCJvbnJlc2l6ZWVuZCIsIGNoZWNrTW9kaWZpZWQpOwotCX0JCi0JaWYgKCJhZGRFdmVudExpc3RlbmVyIiBpbiBkb2MpIHsKLQkJZG9jLmFkZEV2ZW50TGlzdGVuZXIoImtleXByZXNzIiwga2V5UHJlc3NlZCwgdHJ1ZSk7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJrZXlwcmVzcyIsIHNlbENoYW5nZWQsIGZhbHNlKTsKLQkJZG9jLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCBzZWxDaGFuZ2VkLCBmYWxzZSk7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJkcmFnZHJvcCIsIGNoZWNrTW9kaWZpZWQsIGZhbHNlKTsKLQkJCi0JCS8vIGNoZWNrIG1vdXNldXAgZXZlbnQgZm9yIGltYWdlL3RhYmxlIHJlc2l6aW5nCi0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgY2hlY2tNb2RpZmllZCwgZmFsc2UpOwotCX0KLQotCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotfQotCi0vLyB0aGlzIG9uZSBpcyBmb3IgbW9kaWZpY2F0aW9uIGNoZWNrIG9uIGRyYWcgbiBkcm9wIHdpdGhpbiB0aGUgUlRFCi0vLyBjaGVja01vZGlmaWVkIGxpc3RlbmVyCi1mdW5jdGlvbiBjaGVja01vZGlmaWVkKGV2ZW50KSB7Ci0Jc2V0VGltZW91dCgic2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7IiwgMTApOwotfQotCi0vLyBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvci4KLWZ1bmN0aW9uIHNldEhlaWdodChoZWlnaHQpIHsKLQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmhlaWdodCA9IGhlaWdodCArICJweCI7Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBzdGF0dXMuCi0vLyBOb3RlOiBCeSBkZWZhdWx0LCBGaXJlZm94IGRpc2FibGVzIGNoYW5nZXMgdG8gdGhlIHN0YXR1cyBiYXIuIEZvciB0aGlzIHRvIHdvcmssIHRoZSB1c2VyCi0vLyBtdXN0IHNldCB0aGUgZ2xvYmFsIHByZWZlcmVuY2UgImRvbS5kaXNhYmxlX3dpbmRvd19zdGF0dXNfY2hhbmdlIiB0byBmYWxzZS4KLS8vIEZvciBGaXJlZm94IDEuMC54LCB0aGlzIHNldHRpbmcgY2FuIGJlIG1hZGUgaW4gL3Vzci9maXJlZm94LTEuMC43L2RlZmF1bHRzL3ByZWYvZmlyZWZveC5qcy4KLWZ1bmN0aW9uIHNldFN0YXR1cyh0eXBlLCB2YWx1ZSkgewotCXZhciBzdGF0dXMgPSAnJCQkJyArIHR5cGU7Ci0JaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT0gJycpIHsKLQkJc3RhdHVzICs9ICgnJCcgKyB2YWx1ZSk7CQkKLQl9Ci0Jd2luZG93LnN0YXR1cyA9IHN0YXR1czsKLQl3aW5kb3cuc3RhdHVzID0gJyQkJCcgKyBTVEFUVVNfTk9QOwotfQotCi0vLyBSZXR1cm5zIHRoZSBIVE1MIHNvdXJjZS4KLWZ1bmN0aW9uIGdldEhUTUwoKSB7Ci0JdmFyIGh0bWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmlubmVySFRNTDsKLQlpZiAoaHRtbCA9PSAiPFA+Jm5ic3A7PC9QPiIpIHsKLQkJaHRtbCA9ICIiOwotCX0KLQlpZiAoaHRtbCAhPSBudWxsICYmIGh0bWwgIT0gJycpIHsKLQkJdmFyIHJlZ0V4ID0gbmV3IFJlZ0V4cCgiXCJmaWxlXDooW149XSopKC9yZXNvdXJjZXMvKShbXlwiXSspXCIiLCAiZyIpOwotCQlodG1sID0gaHRtbC5yZXBsYWNlKHJlZ0V4LCAiXCIuL3Jlc291cmNlcy8kM1wiIik7Ci0JCXJlZ0V4ID0gbmV3IFJlZ0V4cCgiXCJmaWxlXDooW149XSopLyMoW15cIl0rKVwiIiwgImciKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeCwgIlwiIyQyXCIiKTsKLQl9Ci0JcmV0dXJuIGh0bWw7Ci19Ci0KLS8vUmV0dXJucyB0aGUgSFRNTCBzb3VyY2UgdG8gdGhlIEphdmEgbGF5ZXIKLWZ1bmN0aW9uIGdldFRleHQoKSB7Ci0JdmFyIGh0bWwgPSBnZXRIVE1MKCk7Ci0Jc2V0U3RhdHVzKFNUQVRVU19HRVRfVEVYVCwgaHRtbCk7Ci0JcmV0dXJuIGh0bWw7Ci19Ci0KLWZ1bmN0aW9uIHNldElubmVySFRNTChodG1sKSB7Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQkvLyBJRSBoYXMgcHJvYmxlbSBzZXR0aW5nIGNvbXBsZXggSFRNTCBzZXQgdmlhIGRvYy5ib2R5LmlubmVySFRNTC4KLQkJZW5hYmxlUmljaFRleHRFZGl0aW5nKGh0bWwpOwotCX0KLQllbHNlIHsKLQkJaWYgKGh0bWwgPT0gJycpIHsKLQkJCS8vIE1vemlsbGEvRmlyZWZveCB3aWxsIG9ubHkgZGlzcGxheSB0aGUgY2FyZXQgaWYgPGJyLz4gaXMgYWRkZWQgdG8gdGhlIEhUTUwgYm9keS4KLQkJCWh0bWwgPSAiPGJyLz4iOwotCQl9Ci0JCXZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudDsKLQkJaWYgKGRvYy5ib2R5ICE9IG51bGwpIHsKLQkJCWRvYy5ib2R5LmlubmVySFRNTCA9IGh0bWw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNb3ppbGxhL0ZpcmVmb3ggY2FuIHRha2UgYSB3aGlsZSB0byBpbml0aWFsaXplIGRvY3VtZW50LmJvZHkKLQkJCS8vIGFmdGVyIGRvY3VtZW50LndyaXRlKCkuCi0JCQl0cnkgewotCQkJCXNldFRpbWVvdXQoInNldElubmVySFRNTCgnIiArIGh0bWwgKyAiJyk7IiwgMTApOwotCQkJfQotCQkJY2F0Y2ggKGUpIHsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgSFRNTCBzb3VyY2UuCi1mdW5jdGlvbiBzZXRUZXh0KGh0bWwpIHsKLQlpZiAoc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlodG1sID0gZGVjb2RlU3RyaW5nKGh0bWwpOwotCQlzZWxlY3Rpb25JbmZvID0gZ2V0U2VsZWN0aW9uSW5mbygpOwotCQlzZXRJbm5lckhUTUwoaHRtbCk7Ci0JCWlmIChzZWxlY3Rpb25JbmZvICE9IG51bGwpIHsKLQkJCXNldFRpbWVvdXQoInNldFNlbGVjdGlvbihzZWxlY3Rpb25JbmZvKTsiLCAxMCk7Ci0JCX0KLQkJbW9kaWZpZWQgPSBmYWxzZTsKLQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JfQotfQotCi1mdW5jdGlvbiBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uSW5mbykgewotCWlmICghc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlyZXR1cm47Ci0JfQotCQotCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQllZGl0b3JEb2MgPSBjb250ZW50V2luZG93LmRvY3VtZW50OwotCQotCXRyeSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXZhciBzdGFydE9mZnNldCA9IHNlbGVjdGlvbkluZm8uc3RhcnQ7Ci0JCQl2YXIgbGVuID0gc2VsZWN0aW9uSW5mby5sZW47Ci0JCQlpZiAoc3RhcnRPZmZzZXQgPT0gMCAmJiBsZW4gPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXZhciB0ZW1wUmFuZ2UgPSBlZGl0b3JEb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKLQkJCXRlbXBSYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0T2Zmc2V0KTsKLQkJCXRlbXBSYW5nZS5jb2xsYXBzZSgpOwotCQkJdGVtcFJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGxlbik7Ci0JCQl0ZW1wUmFuZ2Uuc2VsZWN0KCk7Ci0JCQl0ZW1wUmFuZ2Uuc2Nyb2xsSW50b1ZpZXcoKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvbiA9IHRoaXMud2luZG93LmdldFNlbGVjdGlvbigpOwotCQkJdmFyIHN0YXJ0Q29udGFpbmVyID0gc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcjsKLQkJCXZhciBzdGFydCA9IHNlbGVjdGlvbkluZm8uc3RhcnQ7Ci0JCQl2YXIgZW5kQ29udGFpbmVyID0gc2VsZWN0aW9uSW5mby5lbmRDb250YWluZXI7Ci0JCQl2YXIgZW5kID0gc2VsZWN0aW9uSW5mby5lbmQ7Ci0JCQl2YXIgdGVtcFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKLQkJCXRlbXBSYW5nZS5zZXRTdGFydChzdGFydENvbnRhaW5lciwgc3RhcnQpOwotCQkJdGVtcFJhbmdlLnNldEVuZChlbmRDb250YWluZXIsIGVuZCk7Ci0JCQlzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7Ci0JCQlzZWxlY3Rpb24uYWRkUmFuZ2UodGVtcFJhbmdlKTsKLQkJCWNvbnRlbnRXaW5kb3cuZm9jdXMoKTsKLQkJfQotCX0gY2F0Y2ggKGUpIHsKLQl9Ci19Ci0KLWZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm8oKSB7Ci0JaWYgKCFzdXBwb3J0UmljaFRleHRFZGl0aW5nKSB7Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JY29udGVudFdpbmRvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93OwotCWVkaXRvckRvYyA9IGNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JCi0JdmFyIHRlbXBTZWxSYW5nZTsKLQl0cnkgewotCSAgICBpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSBlZGl0b3JEb2Muc2VsZWN0aW9uOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJdGVtcFNlbFJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7Ci0JCQl9Ci0JCQkvLyBsZW5ndGggb2Ygc2VsZWN0aW9uCi0JCQl2YXIgdGVtcFNlbExlbiA9IHRlbXBTZWxSYW5nZS50ZXh0Lmxlbmd0aDsKLQkJCS8vIGNyZWF0ZSBuZXcgcmFuZ2UKLQkJCXZhciB0ZW1wUmFuZ2UgPSBlZGl0b3JEb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKLQkJCS8vIHNldCBlbmQgb2YgbmV3IHJhbmdlIHRvIHN0YXJ0IG9mIHNlbGVjdGlvbgotCQkJLy8gdGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0ZW1wU2VsUmFuZ2UgaXMgbm90IGluIGVkaXRvci5kb2MuYm9keSAoaWUsIGF0IHRoZSBzdGFydCBvZiB0aGUgUlRFKS4KLQkJCXRlbXBSYW5nZS5zZXRFbmRQb2ludCgiRW5kVG9TdGFydCIsIHRlbXBTZWxSYW5nZSk7Ci0JCQkvLyBsZW5ndGggb2YgbmV3IHJhbmdlIGlzIHRoZSBzdGFydCBvZmZzZXQKLQkJCXZhciB0ZW1wVGV4dCA9IHRlbXBSYW5nZS50ZXh0OwotCQkJLy8gSUUgY291bnRzIG5ld2xpbmVzIGFzIDIgY2hhcmFjdGVycyBmb3IgbGVuZ3RoIHByb3BlcnR5LCBidXQgdGhleSBjb3VudCBhcyAxIHdoZW4gdXNpbmcgbW92ZVN0YXJ0IHNvIHJlbW92ZSB0aGUgXHIgdG8gbWFrZSB0aGUgY291bnQgdGhlIHNhbWUKLQkJCXRlbXBUZXh0ID0gdGVtcFRleHQucmVwbGFjZSgvXHIvZywgIiIpOwotCQkJdmFyIHN0YXJ0T2Zmc2V0ID0gdGVtcFRleHQubGVuZ3RoOwotCQkJCi0JCQlyZXR1cm4ge3N0YXJ0OnN0YXJ0T2Zmc2V0LCBsZW46dGVtcFNlbExlbn07Ci0JICAgIH0gZWxzZSB7Ci0JCQlzZWxlY3Rpb24gPSBjb250ZW50V2luZG93LmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJdGVtcFNlbFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoc2VsZWN0aW9uLnJhbmdlQ291bnQgLSAxKS5jbG9uZVJhbmdlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4ge3N0YXJ0Q29udGFpbmVyOiB0ZW1wU2VsUmFuZ2Uuc3RhcnRDb250YWluZXIsIHN0YXJ0OnRlbXBTZWxSYW5nZS5zdGFydE9mZnNldCwgCi0JCQkJZW5kQ29udGFpbmVyOiB0ZW1wU2VsUmFuZ2UuZW5kQ29udGFpbmVyLCBlbmQ6dGVtcFNlbFJhbmdlLmVuZE9mZnNldH07Ci0JICAgIH0KLQl9IGNhdGNoIChlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQotLy8gRGVjb2RlcyB0aGUgSFRNTCBwYXNzZWQgZnJvbSB0aGUgSmF2YSBsYXllci4KLWZ1bmN0aW9uIGRlY29kZVN0cmluZyhzdHIpIHsKLQlpZiAoc3RyICE9IG51bGwgJiYgc3RyICE9ICcnKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC8lc3ElL2csICInIik7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvJUVPTCUvZywgIlxuIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvJXNxJS9nLCAiJmFwb3M7Iik7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvJUVPTCUvZywgIiIpOwotCQkJc3RyID0gc3RyLnJlcGxhY2UoL1xuL2csICIiKTsKLQkJfQotCX0KLQlyZXR1cm4gc3RyOwotfQotCi0vLyB1cGRhdGVzIHNlbGVjdGlvbiB3aXRob3V0IG5vdGlmeWluZyB0aGUgSmF2YSBsYXllciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCi1mdW5jdGlvbiBpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpIHsKLQlpZiAoIXN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JY29udGVudFdpbmRvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93OwotCWVkaXRvckRvYyA9IGNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQlzZWxlY3Rpb24gPSBlZGl0b3JEb2Muc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7Ci0JCQlyZWZvcm1hdEVsZW1lbnRMaW5rcygpOwotCQl9Ci0JfQotCWVsc2UgewotCQlzZWxlY3Rpb24gPSBjb250ZW50V2luZG93LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoc2VsZWN0aW9uLnJhbmdlQ291bnQgLSAxKS5jbG9uZVJhbmdlKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUmFuZ2Uuc3RhcnRDb250YWluZXIubm9kZU5hbWUgPT0gIkhUTUwiICYmCi0JCQkJCXNlbGVjdGlvblJhbmdlLmVuZENvbnRhaW5lci5ub2RlTmFtZSA9PSAiSFRNTCIpIHsKLQkJCQkvLyBNb3ppbGxhIHNlbGVjdHMgdGhlIHdob2xlIGRvY3VtZW50IHdoZW4gdGhlcmUncyBubyBSVEUgY29udGVudCwgc28gc2VsZWN0IGp1c3QgdGhlIGJvZHkKLQkJCQlzZWxlY3Rpb25SYW5nZSA9IGVkaXRvckRvYy5jcmVhdGVSYW5nZSgpOwotCQkJCXNlbGVjdGlvblJhbmdlLnNldFN0YXJ0KGVkaXRvckRvYy5ib2R5LCAwKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5zZXRFbmQoZWRpdG9yRG9jLmJvZHksIDApOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi0vLyBVcGRhdGVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgc2VsZWN0aW9uIHJhbmdlLgotZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uKCkgewotCWlmICghc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQljb250ZW50V2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3c7Ci0JZWRpdG9yRG9jID0gY29udGVudFdpbmRvdy5kb2N1bWVudDsKLQkKLQl2YXIgdGVtcFNlbFJhbmdlOwotCXZhciBzZWxPZmZzZXRTdGFydCA9IDA7Ci0JdmFyIHNlbGVjdGVkVGV4dCA9ICIiOwotCXZhciBmb250TmFtZSA9ICIiOwotCXZhciBmb250U2l6ZSA9ICIiOwotCXZhciBibG9ja1N0eWxlID0gIiI7Ci0JdmFyIHRleHRGbGFncyA9IDA7Ci0JCi0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQlzZWxlY3Rpb24gPSBlZGl0b3JEb2Muc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUmFuZ2UgIT0gbnVsbCAmJiBzZWxlY3Rpb24udHlwZSAhPSAiQ29udHJvbCIpIHsKLQkJCQl0ZW1wU2VsUmFuZ2UgPSBzZWxlY3Rpb25SYW5nZS5kdXBsaWNhdGUoKTsKLQkJCX0KLQkJCXJlZm9ybWF0RWxlbWVudExpbmtzKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCXNlbGVjdGlvbiA9IGNvbnRlbnRXaW5kb3cuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdChzZWxlY3Rpb24ucmFuZ2VDb3VudCAtIDEpLmNsb25lUmFuZ2UoKTsKLQkJCXRlbXBTZWxSYW5nZSA9IHNlbGVjdGlvblJhbmdlLmNsb25lUmFuZ2UoKTsKLQkJfQotCX0KLQlpZiAodGVtcFNlbFJhbmdlICE9IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlpZiAoc2VsZWN0aW9uUmFuZ2UudGV4dCkgewotCQkJCQlzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb25SYW5nZS50ZXh0OwotCQkJCX0KLQkJCQkvKiBmb3IgZ2V0dGluZyBzZWxlY3Rpb24gb2Zmc2V0IC0gY29tbWVudGVkIGJlY2F1c2Ugd2UgY2FuJ3Qgc2VsZWN0IHRoZQotCQkJCSAqIHByb3BlciBsb2NhdGlvbiBpbiB0aGUgSFRNTCBzb3VyY2UgdGFiIGJlY2F1c2UgSlRpZHkncyByZWZvcm1hdHRpbmcgb2YgdGhlIEhUTUwKLQkJCQl2YXIgaHRtbCA9IGdldEhUTUwoKTsKLQkgICAgICAgICAgICB2YXIgdGVtcFNlbExlbiA9IHRlbXBTZWxSYW5nZS5odG1sVGV4dC5sZW5ndGg7CQkJCi0JICAgICAgICAgICAgdGVtcFNlbFJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgLWh0bWwubGVuZ3RoKTsKLQkgICAgICAgICAgICBzZWxPZmZzZXRTdGFydCA9IHRlbXBTZWxSYW5nZS5odG1sVGV4dC5sZW5ndGggLSB0ZW1wU2VsTGVuOwotCSAgICAgICAgICAgICovCi0JCQkJdmFyIHNlbFBhcmVudCA9IHRlbXBTZWxSYW5nZS5wYXJlbnRFbGVtZW50KCk7Ci0JCQkJZm9udE5hbWUgPSB0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnROYW1lJyk7Ci0JCQkJZm9udFNpemUgPSB0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnRTaXplJyk7Ci0JCQkJYmxvY2tTdHlsZSA9IHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnZm9ybWF0QmxvY2snKTsKLQkJCQlpZiAoYmxvY2tTdHlsZSA9PSAiTm9ybWFsIikgewotCQkJCQlpZiAoc2VsUGFyZW50LmNsYXNzTmFtZSA9PSAicXVvdGUiKSB7Ci0JCQkJCQlibG9ja1N0eWxlID0gIjxxdW90ZT4iOwotCQkJCQl9IGVsc2UgaWYgKHNlbFBhcmVudC5jbGFzc05hbWUgPT0gImNvZGVTYW1wbGUiKSB7Ci0JCQkJCQlibG9ja1N0eWxlID0gIjxjb2RlPiI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlibG9ja1N0eWxlID0gIjxwPiI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gIkhlYWRpbmcgMyIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDM+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gIkhlYWRpbmcgNCIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDQ+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gIkhlYWRpbmcgNSIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDU+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gIiIgfHwgYmxvY2tTdHlsZSA9PSBudWxsKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPHA+IjsKLQkJCQl9Ci0JCQkJaWYgKHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnYm9sZCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IEJPTEQ7Ci0JCQkJfQotCQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2l0YWxpYycpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IElUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgndW5kZXJsaW5lJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gVU5ERVJMSU5FOwotCQkJCX0KLQkJCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdzdWJzY3JpcHQnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBTVUJTQ1JJUFQ7Ci0JCQkJfQotCQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ3N1cGVyc2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gU1VQRVJTQ1JJUFQ7Ci0JCQkJfQotCQkJCXNldFN0YXR1cyhTVEFUVVNfU0VMRUNUX1RFWFQsIC8qIHNlbE9mZnNldFN0YXJ0ICsgIiQiICsgKi8KLQkJCQkJCWZvbnROYW1lICsgIiQiICsgZm9udFNpemUgKyAiJCIgKyBibG9ja1N0eWxlICsgIiQiICsgdGV4dEZsYWdzICsgIiQiICsgc2VsZWN0ZWRUZXh0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHNlbGVjdGlvblJhbmdlICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uUmFuZ2UudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJdmFyIHNlbFBhcmVudCA9IHNlbGVjdGlvbi5mb2N1c05vZGU7Ci0JCQkJZm9udE5hbWUgPSBlZGl0b3JEb2MucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnROYW1lJyk7Ci0JCQkJaWYgKGZvbnROYW1lID09ICIiKSB7Ci0JCQkJCWZvbnROYW1lID0gImRlZmF1bHQiOwotCQkJCX0KLQkJCQlmb250U2l6ZSA9IGVkaXRvckRvYy5xdWVyeUNvbW1hbmRWYWx1ZSgnZm9udFNpemUnKTsKLQkJCQlpZiAoZm9udFNpemUgPT0gIiIpIHsKLQkJCQkJZm9udFNpemUgPSAiZGVmYXVsdCI7Ci0JCQkJfQotCQkJCWJsb2NrU3R5bGUgPSBlZGl0b3JEb2MucXVlcnlDb21tYW5kVmFsdWUoJ2Zvcm1hdEJsb2NrJyk7Ci0JCQkJaWYgKGJsb2NrU3R5bGUgPT0gInAiKSB7Ci0JCQkJCWlmIChzZWxQYXJlbnQucGFyZW50Tm9kZS5jbGFzc05hbWUgPT0gInF1b3RlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cXVvdGU+IjsKLQkJCQkJfSBlbHNlIGlmIChzZWxQYXJlbnQucGFyZW50Tm9kZS5jbGFzc05hbWUgPT0gImNvZGVTYW1wbGUiKSB7Ci0JCQkJCQlibG9ja1N0eWxlID0gIjxjb2RlPiI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlibG9ja1N0eWxlID0gIjxwPiI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gImgzIikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoMz4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiaDQiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg0PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJoNSIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDU+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gIiIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCX0KLQkJCQlpZiAoZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCdib2xkJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnaXRhbGljJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCd1bmRlcmxpbmUnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBVTkRFUkxJTkU7Ci0JCQkJfQotCQkJCWlmIChlZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ3N1YnNjcmlwdCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IFNVQlNDUklQVDsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnc3VwZXJzY3JpcHQnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBTVVBFUlNDUklQVDsKLQkJCQl9Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19TRUxFQ1RfVEVYVCwgLyogc2VsT2Zmc2V0U3RhcnQgKyAiJCIgKyAqLwotCQkJCQkJZm9udE5hbWUgKyAiJCIgKyBmb250U2l6ZSArICIkIiArIGJsb2NrU3R5bGUgKyAiJCIgKyB0ZXh0RmxhZ3MgKyAiJCIgKyBzZWxlY3RlZFRleHQpOwotCQkJfQotCQl9IGNhdGNoIChlKSB7IH0KLQl9CQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNldHMgZm9jdXMgdG8gdGhpcyBlZGl0b3IuCi1mdW5jdGlvbiBzZXRGb2N1cygpIHsKLQlpZiAoIXN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJcmV0dXJuOwotCX0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQlpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCk7Ci0JCWlmcmFtZS5mb2N1cygpOwotCX0gZWxzZSB7Ci0JCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQkJY29udGVudFdpbmRvdy5mb2N1cygpOwotCX0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsJCi19Ci0KLS8vIFJlZm9ybWF0cyBlbGVtZW50IGxpbmtzIGNyZWF0ZWQgdmlhIGRyYWcgJiBkcm9wLgotZnVuY3Rpb24gcmVmb3JtYXRFbGVtZW50TGlua3MoKSB7Ci0JdmFyIGxpbmtzUmVmb3JtYXR0ZWQgPSAwOwotCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpOwotCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2VsZW1lbnRsaW5rJyB8fAotCQkJCWVsZW1lbnQuY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2VsZW1lbnRsaW5rd2l0aHR5cGUnIHx8Ci0JCQkJZWxlbWVudC5jbGFzc05hbWUudG9Mb3dlckNhc2UoKSA9PSAnZWxlbWVudGxpbmt3aXRodXNlcnRleHQnKSB7Ci0gCQkJaWYgKGVsZW1lbnQuZmlyc3RDaGlsZCAhPSBudWxsICYmIGVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkICE9IG51bGwgJiYKLSAJCQkJZWxlbWVudC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCAhPSBudWxsKSB7Ci0gCQkJCXZhciBsaW5rVGV4dCA9IGVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwotIAkJCQllbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7Ci0gCQkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKGxpbmtUZXh0KSk7Ci0gCQkJCWxpbmtzUmVmb3JtYXR0ZWQrKzsKLSAJCQl9Ci0JCX0KLQl9Ci0JaWYgKGxpbmtzUmVmb3JtYXR0ZWQgPiAwKSB7Ci0JCXNldFN0YXR1cyhTVEFUVVNfUkVGT1JNQVRfTElOS1MsIG51bGwpOwotCX0KLX0KLQotLy8gRm9ybWF0cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGZvcm1hdFRleHQoY29tbWFuZCwgb3B0aW9uKSB7Ci0JaWYgKCFyZWFkT25seSAmJiBpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChlZGl0b3JEb2MuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIG9wdGlvbikpIHsKLQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwkJCi0JCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJfQotCX0KLX0KLQotLy8gQWRkcyBIVE1MLgotZnVuY3Rpb24gYWRkSFRNTChodG1sKSB7Ci0JaWYgKCFyZWFkT25seSAmJiBodG1sICE9ICIiKSAgewotCQlodG1sID0gZGVjb2RlU3RyaW5nKGh0bWwpOwotCQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJCWlmIChzZWxlY3Rpb25SYW5nZS50ZXh0ICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uUmFuZ2UucGFzdGVIVE1MKGh0bWwpOwotCQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKLQkJCQl2YXIgZG9jdW1lbnRGcmFnbWVudCA9IHNlbGVjdGlvblJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50RnJhZ21lbnQpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBBZGRzIGFuIGltYWdlLgotZnVuY3Rpb24gYWRkSW1hZ2UodXJsLCBoZWlnaHQsIHdpZHRoLCBhbHQpIHsKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlpZiAodXJsICE9IG51bGwgJiYgdXJsICE9ICcnKSB7Ci0JCQkJZm9ybWF0VGV4dCgnaW5zZXJ0aW1hZ2UnLCB1cmwpOwotCQkJfQotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi50eXBlID09ICdDb250cm9sJyAmJiBzZWxlY3Rpb25SYW5nZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGhlaWdodCAhPSBudWxsICYmIGhlaWdodCAhPSAnJykgc2VsZWN0aW9uUmFuZ2UuaXRlbSgpLmhlaWdodCA9IGhlaWdodDsKLQkJCQlpZiAod2lkdGggIT0gbnVsbCAmJiB3aWR0aCAhPSAnJykgc2VsZWN0aW9uUmFuZ2UuaXRlbSgpLndpZHRoID0gd2lkdGg7Ci0JCQkJaWYgKGFsdCAhPSBudWxsKSBzZWxlY3Rpb25SYW5nZS5pdGVtKCkuYWx0ID0gYWx0OwkJCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl2YXIgU1RBUlRfTUFSS0VSID0gIkFfLV8tXyI7Ci0JCQl2YXIgRU5EX01BUktFUiA9ICI6LjouOiI7Ci0JCQkJLy8gbWFyayBpbWcgbGlua3Mgd2l0aCBTVEFSVF9NQVJLRVIgKyBpZCArIEVORF9NQVJLRVIgaW4gdGhlIGlkLCBmb3IgbGF0ZXIgcmVjb3ZlcnkKLQkJCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7Ci0JCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQllbGVtZW50LmlkID0gU1RBUlRfTUFSS0VSICsgZWxlbWVudC5pZCArIEVORF9NQVJLRVI7Ci0JCQl9Ci0JCQlpZiAodXJsICE9IG51bGwgJiYgdXJsICE9ICcnKSB7Ci0JCQkJZm9ybWF0VGV4dCgnaW5zZXJ0aW1hZ2UnLCB1cmwpOwotCQkJfQotCQkJaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJCQl2YXIgcmVnRXhJRCA9IG5ldyBSZWdFeHAoU1RBUlRfTUFSS0VSICsgIiguKj8pIiArIEVORF9NQVJLRVIpOwotCQkJCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7Ci0JCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCQl2YXIgaWQgPSBlbGVtZW50LmlkOwotCQkJCQlpZiAoaWQgIT0gbnVsbCAmJiBpZCAhPSAnJykgewotCQkJCQkJUmVnRXhwLmxhc3RJbmRleD0wOwotCQkJCQkJdmFyIG1hdGNoQXJyYXkgPSBpZC5tYXRjaChyZWdFeElEKTsKLQkJCQkJCWlmIChtYXRjaEFycmF5ICE9IG51bGwgJiYgbWF0Y2hBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJdmFyIG5ld0lkID0gbWF0Y2hBcnJheVsxXTsKLQkJCQkJCQlpZiAobmV3SWQubGVuZ3RoID4gMCkgewotCQkJCQkJCQllbGVtZW50LmlkID0gbmV3SWQ7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbm8gaWQsIG11c3QgYmUgdGhlIG5ldyBpbWcKLQkJCQkJCWlmIChoZWlnaHQgIT0gbnVsbCAmJiBoZWlnaHQgIT0gJycpIGVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0OwotCQkJCQkJaWYgKHdpZHRoICE9IG51bGwgJiYgd2lkdGggIT0gJycpIGVsZW1lbnQud2lkdGggPSB3aWR0aDsKLQkJCQkJCWlmIChhbHQgIT0gbnVsbCkgZWxlbWVudC5hbHQgPSBhbHQ7CQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQl9Ci19Ci0KLS8vIEFkZHMgYSBob3Jpem9udGFsIGxpbmUuCi1mdW5jdGlvbiBhZGRMaW5lKCkgewotCWZvcm1hdFRleHQoJ2luc2VydGhvcml6b250YWxydWxlJywgbnVsbCk7Ci19Ci0KLS8vIEFkZHMgYSBsaW5rLgotZnVuY3Rpb24gYWRkTGluayh1cmwpIHsKLQlpZiAoIXJlYWRPbmx5ICYmIHVybCAhPSBudWxsICYmIHVybCAhPSAnJyAmJiBpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCWlmIChzZWxlY3Rpb25SYW5nZS50ZXh0ID09IG51bGwgfHwgc2VsZWN0aW9uUmFuZ2UudGV4dCA9PSAnJykgewotCQkJCXNlbGVjdGlvblJhbmdlLnRleHQgPSB1cmw7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzZWxlY3Rpb25SYW5nZS5leGVjQ29tbWFuZCgnY3JlYXRlbGluaycsIGZhbHNlLCB1cmwpKSB7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uID09ICIiKSB7CQkKLQkJCQl2YXIgdXJsVGV4dE5vZGUgPSBlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUodXJsKTsKLQkJCQlpbnNlcnROb2RlQXRTZWxlY3Rpb24oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9yRnJhbWVJZCkuY29udGVudFdpbmRvdywgdXJsVGV4dE5vZGUpOwotCQkJfQkJCQotCQkJaWYgKGVkaXRvckRvYy5leGVjQ29tbWFuZCgnY3JlYXRlbGluaycsIGZhbHNlLCB1cmwpKSB7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIEFkZHMgYW4gb3JkZXJlZCBsaXN0LgotZnVuY3Rpb24gYWRkT3JkZXJlZExpc3QoKSB7Ci0JZm9ybWF0VGV4dCgnaW5zZXJ0b3JkZXJlZGxpc3QnLCBudWxsKTsKLX0KLQotLy8gQWRkcyBhIHRhYmxlLgotZnVuY3Rpb24gYWRkVGFibGUocm93cywgY29scywgd2lkdGgsIHN1bW1hcnksIGNhcHRpb24sIHRhYmxlaGVhZGVycykgewotCWlmIChyZWFkT25seSkgcmV0dXJuOwotCWlmIChyb3dzID09IDApIHJvd3MgPSAyOwotCWlmIChjb2xzID09IDApIGNvbHMgPSAyOwotCWlmICh3aWR0aCA9PSAwKSB3aWR0aCA9ICI4NSUiOwotCWlmIChpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXZhciB0YWJsZSA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOwotCQl0YWJsZS5jZWxsUGFkZGluZyA9ICIyIjsKLQkJdGFibGUuY2VsbFNwYWNpbmcgPSAiMCI7Ci0JCXRhYmxlLmJvcmRlciA9ICIxIjsKLQkJdGFibGUud2lkdGggPSB3aWR0aDsKLQkJdGFibGUudGl0bGUgPSAiIjsKLQkJaWYgKHN1bW1hcnkgIT0gbnVsbCAmJiBzdW1tYXJ5ICE9ICcnKSB7Ci0JCQl0YWJsZS5zdW1tYXJ5ID0gc3VtbWFyeTsKLQkJfQotCQlpZiAoY2FwdGlvbiAhPSBudWxsICYmIGNhcHRpb24gIT0gJycpIHsKLQkJCXRhYmxlLnRpdGxlID0gY2FwdGlvbjsKLQkJCXRhYmxlLmNyZWF0ZUNhcHRpb24oKTsKLQkJCXZhciBjYXB0aW9uTm9kZSA9IGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZShjYXB0aW9uKTsKLQkJCXRhYmxlLmNhcHRpb24uYXBwZW5kQ2hpbGQoY2FwdGlvbk5vZGUpOwotCQl9Ci0JCXRib2R5ID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRib2R5Iik7Ci0JCWZvciAodmFyIGkgPSAwOyBpIDwgcm93czsgaSsrKSB7Ci0JCQl0ciA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0ciIpOwotCQkJZm9yICh2YXIgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKLQkJCQlpZiAoaSA9PSAwICYmICh0YWJsZWhlYWRlcnMgPT0gVEFCTEVfSEVBREVSU19DT0xTIHx8IHRhYmxlaGVhZGVycyA9PSBUQUJMRV9IRUFERVJTX0JPVEgpKSB7Ci0JCQkJCXRoID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRoIik7Ci0JCQkJCXRoLnNjb3BlID0gImNvbCI7Ci0JCQkJCXRoLmlkID0gIiI7Ci0JCQkJCXRoLmFiYnIgPSB0aC5pZDsKLQkJCQkJdmFyIGhlYWRlck5vZGUgPSBlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUodGguaWQpOwotCQkJCQl0aC5hcHBlbmRDaGlsZChoZWFkZXJOb2RlKTsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoImJyIik7Ci0JCQkJCQl0aC5hcHBlbmRDaGlsZChicik7Ci0JCQkJCX0KLQkJCQkJdHIuYXBwZW5kQ2hpbGQodGgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChqID09IDAgJiYgKHRhYmxlaGVhZGVycyA9PSBUQUJMRV9IRUFERVJTX1JPV1MgfHwgdGFibGVoZWFkZXJzID09IFRBQkxFX0hFQURFUlNfQk9USCkpIHsKLQkJCQkJdGggPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGgiKTsKLQkJCQkJdGguc2NvcGUgPSAicm93IjsKLQkJCQkJdGguaWQgPSAiIjsKLQkJCQkJdGguYWJiciA9IHRoLmlkOwotCQkJCQl2YXIgaGVhZGVyTm9kZSA9IGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZSh0aC5pZCk7Ci0JCQkJCXRoLmFwcGVuZENoaWxkKGhlYWRlck5vZGUpOwotCQkJCQlpZiAoIWRvY3VtZW50LmFsbCkgewotCQkJCQkJYnIgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgiYnIiKTsKLQkJCQkJCXRoLmFwcGVuZENoaWxkKGJyKTsKLQkJCQkJfQotCQkJCQl0ci5hcHBlbmRDaGlsZCh0aCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0ZCA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCQkJCQlpZiAoIWRvY3VtZW50LmFsbCkgewotCQkJCQkJYnIgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgiYnIiKTsKLQkJCQkJCXRkLmFwcGVuZENoaWxkKGJyKTsKLQkJCQkJfQotCQkJCQl0ci5hcHBlbmRDaGlsZCh0ZCk7Ci0JCQkJfQotCQkJfQotCQkJdGJvZHkuYXBwZW5kQ2hpbGQodHIpOwotICAgIAl9Ci0JCXRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKHRhYmxlKTsKLQkJfQotCQllbHNlIHsKLQkJCXNlbGVjdGlvblJhbmdlLmluc2VydE5vZGUodGFibGUpOwotCQl9Ci0JCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsJCQkKLQl9Ci19Ci0KLS8vIEFkZHMgYW4gdW5vcmRlcmVkIGxpc3QuCi1mdW5jdGlvbiBhZGRVbm9yZGVyZWRMaXN0KCkgewotCWZvcm1hdFRleHQoJ2luc2VydHVub3JkZXJlZGxpc3QnLCBudWxsKTsKLX0KLQotLy8gU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGJhY2tDb2xvcihjb2xvcikgewotCWlmIChjb2xvciAhPSBudWxsICYmIGNvbG9yICE9ICcnKSB7Ci0JCWZvcm1hdFRleHQoJ2JhY2tjb2xvcicsIGNvbG9yKTsKLQl9Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdib2xkJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBib2xkKCkgewotCWZvcm1hdFRleHQoJ2JvbGQnLCBudWxsKTsKLX0KLQotLy8gQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi1mdW5jdGlvbiBjb3B5KCkgewotCWlmIChpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChlZGl0b3JEb2MuZXhlY0NvbW1hbmQoJ2NvcHknLCBmYWxzZSwgbnVsbCkpIHsKLQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQl9Ci0JfQotfQotCi0vLyBDdXRzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi1mdW5jdGlvbiBjdXQoKSB7Ci0JZm9ybWF0VGV4dCgnY3V0JywgbnVsbCk7Ci19Ci0KLS8vIERlbGV0ZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBkZWxldGVUZXh0KCkgewotCWZvcm1hdFRleHQoJ2RlbGV0ZScsIG51bGwpOwotfQotCi0vLyBGaW5kcyB0ZXh0LgotZnVuY3Rpb24gZmluZFRleHQodGV4dCwgZGlyLCBvcHRpb25zKSB7Ci0JaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09ICIiKSB7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSB7Ci0JCXRleHQgPSBkZWNvZGVTdHJpbmcodGV4dCk7Ci0JfQotCQotCWlmIChpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlLmNvbGxhcHNlKGRpciA8IDApOwotCQkJaWYgKHNlbGVjdGlvblJhbmdlLmZpbmRUZXh0KHRleHQsIGRpciwgb3B0aW9ucykpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5zY3JvbGxJbnRvVmlldygpOwotCQkJCXNlbGVjdGlvblJhbmdlLnNlbGVjdCgpOwotCQkJCXNlbGVjdGlvblJhbmdlLmNvbGxhcHNlKGRpciA8IDApOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJfQotCQl9Ci0JCWVsc2UgewkKLQkJCS8vIGZpbmQodGV4dCwgY2FzZVNlbnNpdGl2ZSwgYmFja3dhcmRzLCB3cmFwQXJvdW5kLCB3aG9sZVdvcmQsIHNlYXJjaEluRnJhbWVzLCBzaG93RGlhbG9nKQotCQkJdmFyIGNhc2VTZW5zaXRpdmUgPSB0cnVlOwotCQkJdmFyIGJhY2t3YXJkcyA9IGZhbHNlOwotCQkJdmFyIHdob2xlV29yZCA9IHRydWU7Ci0JCQlpZiAoKG9wdGlvbnMgJiA0KSA9PSAwKSBjYXNlU2Vuc2l0aXZlID0gZmFsc2U7Ci0JCQlpZiAoZGlyID09IC0xKSBiYWNrd2FyZHMgPSB0cnVlOwotCQkJaWYgKChvcHRpb25zICYgMikgPT0gMCkgd2hvbGVXb3JkID0gZmFsc2U7Ci0JCQlpZiAoY29udGVudFdpbmRvdy5maW5kKHRleHQsIGNhc2VTZW5zaXRpdmUsIGJhY2t3YXJkcywgZmFsc2UsIHdob2xlV29yZCwgZmFsc2UsIGZhbHNlKSkgewotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gZm9yZUNvbG9yKGNvbG9yKSB7Ci0JaWYgKGNvbG9yICE9IG51bGwgJiYgY29sb3IgIT0gJycpIHsKLQkJZm9ybWF0VGV4dCgnZm9yZWNvbG9yJywgY29sb3IpOwotCX0KLX0KLQotLy8gRm9ybWF0cyB0aGUgc2VsZWN0ZWQgdGV4dCB1c2luZyB0aGUgZ2l2ZW4gSFRNTCBoZWFkaW5nIHRhZy4KLWZ1bmN0aW9uIGZvcm1hdEJsb2NrKHRhZykgewotCWlmICh0YWcgIT0gbnVsbCAmJiB0YWcgIT0gJycpIHsKLQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCB0YWcpOwotCX0KLX0KLQotCi12YXIgSU5ERU5URURfTElTVF9CQURfSFRNTF9JRSA9ICI8L2xpPi4qPGxpIHN0eWxlPVwibGlzdC1zdHlsZTogbm9uZVwiPiI7Ci12YXIgSU5ERU5URURfTElTVF9CQURfSFRNTF9NT1ogPSAiPC9saT4uKjxsaSBzdHlsZT1cImxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgbGlzdC1zdHlsZS1pbWFnZTogbm9uZTsgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTtcIj4iOwotCi0vLyBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gaW5kZW50KCkgewotCWZvcm1hdFRleHQoJ2luZGVudCcsIG51bGwpOwotCS8vIGZpeCBmb3Igc3ViLWxpc3RzCi0JdmFyIGh0bWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmlubmVySFRNTDsKLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCWh0bWwgPSBodG1sLnJlcGxhY2UoSU5ERU5URURfTElTVF9CQURfSFRNTF9JRSwgIiIpOwotCX0gZWxzZSB7Ci0JCS8vIGZpcmVmb3ggc29tZXRpbWVzIHB1dHMgdGhlIHNhbWUgYXMgSUUsIHNvbWV0aW1lcyBtb3JlIGp1bmsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShJTkRFTlRFRF9MSVNUX0JBRF9IVE1MX0lFLCAiIik7Ci0JCWh0bWwgPSBodG1sLnJlcGxhY2UoSU5ERU5URURfTElTVF9CQURfSFRNTF9NT1osICIiKTsKLQl9Ci0Jc2V0VGV4dChodG1sKTsKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ2l0YWxpYycgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gaXRhbGljKCkgewotCWZvcm1hdFRleHQoJ2l0YWxpYycsIG51bGwpOwotfQotCi0vLyBDZW50ZXIganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24ganVzdGlmeUNlbnRlcigpIHsKLQlmb3JtYXRUZXh0KCdqdXN0aWZ5Y2VudGVyJywgbnVsbCk7Ci19Ci0KLS8vIEZ1bGx5IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlGdWxsKCkgewotCWZvcm1hdFRleHQoJ2p1c3RpZnlmdWxsJywgbnVsbCk7Ci19Ci0KLS8vIExlZnQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24ganVzdGlmeUxlZnQoKSB7Ci0JZm9ybWF0VGV4dCgnanVzdGlmeWxlZnQnLCBudWxsKTsKLX0KLQotLy8gUmlnaHQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24ganVzdGlmeVJpZ2h0KCkgewotCWZvcm1hdFRleHQoJ2p1c3RpZnlyaWdodCcsIG51bGwpOwotfQotCi0vLyBPdXRkZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIG91dGRlbnQoKSB7Ci0JZm9ybWF0VGV4dCgnb3V0ZGVudCcsIG51bGwpOwotfQotCi0vLyBQYXN0ZXMgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQuCi1mdW5jdGlvbiBwYXN0ZShzb3VyY2VVUkwpIHsKLQlpZiAoc291cmNlVVJMID09IG51bGwpIHsKLQkJc291cmNlVVJMID0gIiI7Ci0JfQotCWVsc2UgewotCQlzb3VyY2VVUkwgPSBkZWNvZGVTdHJpbmcoc291cmNlVVJMKTsKLQl9Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQl2YXIgU1RBUlRfTUFSS0VSID0gIkFfLV8tXyI7Ci0JCXZhciBFTkRfTUFSS0VSID0gIjouOi46IjsKLQkJLy8gbWFyayBpbWcgYW5kIDxhIC8+IGxpbmtzIHdpdGggU1RBUlRfTUFSS0VSICsgc3JjL2hyZWYgKyBFTkRfTUFSS0VSIGluIHRoZSBpZCwgZm9yIGxhdGVyIHJlY292ZXJ5Ci0JCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7Ci0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQl2YXIgaWQgPSBlbGVtZW50LmlkOwotCQkJZWxlbWVudC5pZCA9IFNUQVJUX01BUktFUiArIGVsZW1lbnQuc3JjICsgRU5EX01BUktFUiArIGlkOwotCQl9Ci0JCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCWVsZW1lbnQuaWQgPSBTVEFSVF9NQVJLRVIgKyBlbGVtZW50LmhyZWYgKyBFTkRfTUFSS0VSICsgaWQ7Ci0JCX0KLQotCQkvLyBjaGFuZ2UgdGhlIDxiYXNlPiBvZiB0aGUgZG9jdW1lbnQKLQkJdmFyIG9sZEJhc2VIUkVGID0gZWRpdG9yRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJylbMF0uaHJlZjsKLQkJZWRpdG9yRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJylbMF0uaHJlZiA9IHNvdXJjZVVSTDsKLQotCQlmb3JtYXRUZXh0KCdwYXN0ZScsIG51bGwpOwotCQkKLQkJLy8gcmVzdG9yZSA8YmFzZT4KLQkJZWRpdG9yRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJylbMF0uaHJlZiA9IG9sZEJhc2VIUkVGOwotCX0KLQllbHNlIHsKLQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCX0KLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQl0cnkgewotCQkJdmFyIHJlZ0V4UmVzID0gbmV3IFJlZ0V4cCgiZmlsZVw6KFtePV0rKSgvcmVzb3VyY2VzLykoLispIiwgImciKTsKLQkJCXZhciByZWdFeFJlZiA9IG5ldyBSZWdFeHAoIiguKykoIy4rKSIpOwotCQkJdmFyIHJlZ0V4ID0gbmV3IFJlZ0V4cCgiZmlsZVw6KFtePV0rKS8oW14vXSspIiwgImciKTsJCi0JCQl2YXIgcmVnRXhJRCA9IG5ldyBSZWdFeHAoU1RBUlRfTUFSS0VSICsgIiguKj8pIiArIEVORF9NQVJLRVIgKyAiKC4qPykiKTsKLQkJCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7Ci0JCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQl2YXIgaWQgPSBlbGVtZW50LmlkOwotCQkJCWlmIChpZCAhPSBudWxsICYmIGlkICE9ICcnKSB7Ci0JCQkJCVJlZ0V4cC5sYXN0SW5kZXg9MDsKLQkJCQkJdmFyIG1hdGNoQXJyYXkgPSBpZC5tYXRjaChyZWdFeElEKTsKLQkJCQkJaWYgKG1hdGNoQXJyYXkgIT0gbnVsbCAmJiBtYXRjaEFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCQkJCWVsZW1lbnQuc3JjID0gbWF0Y2hBcnJheVsxXTsKLQkJCQkJCWlmIChtYXRjaEFycmF5Lmxlbmd0aCA+IDIgJiYgbWF0Y2hBcnJheVsyXS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZWxlbWVudC5pZCA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXZhciBzcmMgPSBlbGVtZW50LnNyYzsKLQkJCQlpZiAoc3JjICE9IG51bGwgJiYgc3JjICE9ICcnKSB7Ci0JCQkJCWlmIChzcmMuaW5kZXhPZignYWJvdXQ6Li9yZXNvdXJjZXMnKSAhPSAtMSkgewotCQkJCQkJLy8gZml4IGZvciBJRSA3IHdoZW4gcGFzdGluZyBmcm9tIGFub3RoZXIgUlRFCi0JCQkJCQkvLyBJRTcgcmVzb2x2ZXMgdGhlc2UgYXMgImFib3V0Oi4vcmVzb3VyY2VzLzxmaWxlPiIKLQkJCQkJCS8vIHNvIHJlbW92ZSB0aGUgImFib3V0Oi4iCi0JCQkJCQlzcmMgPSBzcmMucmVwbGFjZSgiYWJvdXQ6IiwgIiIpOwotCQkJCQl9Ci0JCQkJCWlmIChzcmMuaW5kZXhPZignYWJvdXQ6cmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCS8vIGZpeCBmb3IgSUUgNyB3aGVuIHBhc3RpbmcgZnJvbSBhbm90aGVyIFJURQotCQkJCQkJLy8gSUU3IHNvbWV0aW1lcyByZXNvbHZlcyB0aGVzZSBhcyAiYWJvdXQ6cmVzb3VyY2VzLzxmaWxlPiIKLQkJCQkJCS8vIHNvIHJlbW92ZSB0aGUgImFib3V0OiIgYW5kIHB1dCBpbiAiLi8iCi0JCQkJCQlzcmMgPSBzcmMucmVwbGFjZSgiYWJvdXQ6IiwgIi4vIik7Ci0JCQkJCX0KLQkJCQkJaWYgKHNyYy5pbmRleE9mKCdyZXNvdXJjZXMnKSAhPSAtMSkgewotCQkJCQkJZWxlbWVudC5zcmMgPSBzcmMucmVwbGFjZShyZWdFeFJlcywgIi4vcmVzb3VyY2VzLyQzIik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllbGVtZW50LnNyYyA9IHNyYy5yZXBsYWNlKHJlZ0V4LCAiLi9yZXNvdXJjZXMvJDIiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpOwotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCQlpZiAoaWQgIT0gbnVsbCAmJiBpZCAhPSAnJykgewotCQkJCQlSZWdFeHAubGFzdEluZGV4PTA7Ci0JCQkJCXZhciBtYXRjaEFycmF5ID0gaWQubWF0Y2gocmVnRXhJRCk7Ci0JCQkJCWlmIChtYXRjaEFycmF5ICE9IG51bGwgJiYgbWF0Y2hBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCQllbGVtZW50LmhyZWYgPSBtYXRjaEFycmF5WzFdOwotCQkJCQkJaWYgKG1hdGNoQXJyYXkubGVuZ3RoID4gMiAmJiBtYXRjaEFycmF5WzJdLmxlbmd0aCA+IDApIHsKLQkJCQkJCQllbGVtZW50LmlkID0gbWF0Y2hBcnJheVsyXTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdmFyIGhyZWYgPSBlbGVtZW50LmhyZWY7Ci0JCQkJaWYgKGhyZWYgIT0gbnVsbCAmJiBocmVmICE9ICcnKSB7Ci0JCQkJCS8vIGZpeCBzZWxmLXJlZmVyZW5jaW5nIGhyZWZzCi0JCQkJCWlmIChocmVmLmluZGV4T2YoJyMnKSAhPSAtMSkgewotCQkJCQkJUmVnRXhwLmxhc3RJbmRleD0wOwotCQkJCQkJdmFyIG1hdGNoQXJyYXkgPSBocmVmLm1hdGNoKHJlZ0V4UmVmKTsKLQkJCQkJCWlmIChtYXRjaEFycmF5ICE9IG51bGwgJiYgbWF0Y2hBcnJheS5sZW5ndGggPiAyKSB7Ci0JCQkJCQkJdmFyIGhyZWZGaWxlID0gbWF0Y2hBcnJheVsxXTsKLQkJCQkJCQl2YXIgcmVmID0gbWF0Y2hBcnJheVsyXTsKLQkJCQkJCQlpZiAoaHJlZkZpbGUgPT0gc291cmNlVVJMKSB7Ci0JCQkJCQkJCWVsZW1lbnQuaHJlZiA9IHJlZjsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGZpeCBocmVmcyBhbHJlYWR5IGluIHJlc291cmNlcwotCQkJCQlpZiAoaHJlZi5pbmRleE9mKCdyZXNvdXJjZXMnKSAhPSAtMSkgewotCQkJCQkJZWxlbWVudC5ocmVmID0gaHJlZi5yZXBsYWNlKHJlZ0V4UmVzLCAiLi9yZXNvdXJjZXMvJDMiKTsKLQkJCQkJfQotCQkJCQkvLyBmaXggaHJlZnMgbm90IGluIHJlc291cmNlcwotCQkJCQllbHNlIHsKLQkJCQkJCWVsZW1lbnQuaHJlZiA9IGhyZWYucmVwbGFjZShyZWdFeCwgIi4vcmVzb3VyY2VzLyQyIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKGUpIHsKLQkJfQotCX0KLX0KLQotLy8gUmVkbyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLWZ1bmN0aW9uIHJlZG8oKSB7Ci0JZm9ybWF0VGV4dCgncmVkbycsIG51bGwpOwotfQotCi0vLyBSZWRvIHRoZSBwcmV2aW91cyBjb21tYW5kLgotZnVuY3Rpb24gcmVtb3ZlRm9ybWF0KCkgewotCWZvcm1hdFRleHQoJ3JlbW92ZWZvcm1hdCcsIG51bGwpOwotfQotCi0KLQotZnVuY3Rpb24gX3JlcGxhY2VBbGxUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgb3B0aW9ucykgewotCS8vIHRoaXMgaXMgSUUgb25seQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJdmFyIHRlbXBSYW5nZSA9ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwotCQl0ZW1wUmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtMTAwMDAwMDAwMDApOwotCQlkbyB7Ci0JCQl0ZW1wUmFuZ2UuY29sbGFwc2UoKTsKLQkJCWlmICh0ZW1wUmFuZ2UuZmluZFRleHQoZmluZFRleHQsIDEwMDAwMDAwMDAwLCBvcHRpb25zKSkgewotCQkJCXRlbXBSYW5nZS50ZXh0ID0gcmVwbGFjZVRleHQ7Ci0JCQkJdGVtcFJhbmdlLnNlbGVjdCgpOwotCQkJfSBlbHNlIHsJCQotCQkJCWJyZWFrOwotCQkJfQotCQl9IHdoaWxlICh0cnVlKTsKLQl9Ci19Ci0KLS8vIFJlcGxhY2VzIGFsbCB0ZXh0LgotZnVuY3Rpb24gcmVwbGFjZUFsbFRleHQoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBvcHRpb25zKSB7Ci0JaWYgKHJlYWRPbmx5IHx8IGZpbmRUZXh0ID09IG51bGwgfHwgZmluZFRleHQgPT0gIiIpIHsKLQkJcmV0dXJuOwotCX0KLQllbHNlIHsKLQkJZmluZFRleHQgPSBkZWNvZGVTdHJpbmcoZmluZFRleHQpOwotCX0KLQlpZiAocmVwbGFjZVRleHQgPT0gbnVsbCkgewotCQlyZXBsYWNlVGV4dCA9ICIiOwotCX0KLQllbHNlIHsKLQkJcmVwbGFjZVRleHQgPSBkZWNvZGVTdHJpbmcocmVwbGFjZVRleHQpOwotCX0KLQkKLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCS8vIFRPRE86IE1vdmUgdGhlIGluc2VydGlvbiBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIEhUTUwKLQkJLy8gYW5kIHBlcmZvcm0gYSBzZWFyY2ggYW5kIHJlcGxhY2UgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLiAKLQkJX3JlcGxhY2VBbGxUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgb3B0aW9ucyk7Ci0JfQotCWVsc2UgewotCQkvLyBUT0RPOiBFbXVsYXRlIHRoZSBJRSBpbXBsZW1lbnRhdGlvbi4KLQkJdmFyIGh0bWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmlubmVySFRNTDsKLQkJdmFyIG9wdGlvblN0ciA9ICIvZyI7Ci0JCWlmICgob3B0aW9ucyAmIDQpID09IDApIHsKLQkJCW9wdGlvblN0ciArPSAiaSI7Ci0JCX0KLQkJdmFyIHJlZ0V4cCA9IGV2YWwoIi8iICsgZmluZFRleHQgKyBvcHRpb25TdHIpOwotCQlodG1sID0gaHRtbC5yZXBsYWNlKHJlZ0V4cCwgcmVwbGFjZVRleHQpOwotCQlzZXRUZXh0KGh0bWwpOwotCX0KLQkKLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLX0KLQotLy8gUmVwbGFjZXMgdGV4dC4KLWZ1bmN0aW9uIHJlcGxhY2VUZXh0KHJlcGxhY2VUZXh0LCBkaXIsIG9wdGlvbnMpIHsKLQlpZiAocmVhZE9ubHkgfHwgIWludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAocmVwbGFjZVRleHQgPT0gbnVsbCkgewotCQlyZXBsYWNlVGV4dCA9ICIiOwotCX0KLQllbHNlIHsKLQkJcmVwbGFjZVRleHQgPSBkZWNvZGVTdHJpbmcocmVwbGFjZVRleHQpOwotCX0KLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCXNlbGVjdGlvblJhbmdlLnRleHQgPSByZXBsYWNlVGV4dDsKLQkJaWYgKHJlcGxhY2VUZXh0ICE9ICIiKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5tb3ZlU3RhcnQoIndvcmQiLCAtMSk7Ci0JCQlzZWxlY3Rpb25SYW5nZS5zZWxlY3QoKTsKLQkJCXNlbGVjdGlvblJhbmdlLmNvbGxhcHNlKGRpciA8IDApOwotCQl9Ci0JfQotCWVsc2UgewotCQlzZWxlY3Rpb25SYW5nZS5kZWxldGVDb250ZW50cygpOwotCQlzZWxlY3Rpb25SYW5nZS5pbnNlcnROb2RlKGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZShyZXBsYWNlVGV4dCkpOwotCX0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLX0KLQotLy8gU2VsZWN0cyBhbGwgdGV4dC4KLWZ1bmN0aW9uIHNlbGVjdEFsbCgpIHsKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZWRpdG9yRG9jLmV4ZWNDb21tYW5kKCdzZWxlY3RhbGwnLCBmYWxzZSwgbnVsbCkpIHsKLQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IG5hbWUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc2V0Rm9udE5hbWUobmFtZSkgewotCWlmIChpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWlmIChuYW1lID09ICcnKSB7Ci0JCQkJZm9ybWF0VGV4dCgncmVtb3ZlRm9ybWF0Jyk7Ci0JCQl9IGVsc2UgewotCQkJCWZvcm1hdFRleHQoJ2ZvbnRuYW1lJywgbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBzZXRGb250U2l6ZShzaXplKSB7Ci0JaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKHNpemUgIT0gbnVsbCkgewotCQkJaWYgKHNpemUgPT0gJycpIHsKLQkJCQlmb3JtYXRUZXh0KCdyZW1vdmVGb3JtYXQnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9ybWF0VGV4dCgnZm9udHNpemUnLCBzaXplKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9udCBzdHlsZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBzZXRGb250U3R5bGUoc3R5bGUpIHsgCi0JaWYgKCFyZWFkT25seSAmJiBzdHlsZSAhPSBudWxsICYmIHN0eWxlICE9ICcnICYmIGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJdHJ5IHsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5leGVjQ29tbWFuZCgicmVtb3ZlZm9ybWF0Iik7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKGUpIHsKLQkJfQotCQlpZiAoc3R5bGUgPT0gIjxxdW90ZT4iKSB7Ci0JCQlmb3JtYXRUZXh0KCdmb3JtYXRibG9jaycsICc8cD4nKTsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkuY2xhc3NOYW1lID0gInF1b3RlIjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvbi5mb2N1c05vZGUucGFyZW50Tm9kZS5jbGFzc05hbWUgPSAicXVvdGUiOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0eWxlID09ICI8Y29kZT4iKSB7Ci0JCQlmb3JtYXRUZXh0KCdmb3JtYXRibG9jaycsICc8cD4nKTsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkuY2xhc3NOYW1lID0gImNvZGVTYW1wbGUiOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2VsZWN0aW9uLmZvY3VzTm9kZS5wYXJlbnROb2RlLmNsYXNzTmFtZSA9ICJjb2RlU2FtcGxlIjsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICghZG9jdW1lbnQuYWxsICYmIHN0eWxlID09ICI8cD4iKSB7Ci0JCQkJLy8gQSBoYWNrIHRvIGdldCByaWQgb2YgdGhlICJjbGFzc05hbWUiIGF0dHJpYnV0ZSBpbiBNb3ppbGxhL0ZpcmVmb3guCi0JCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPGg0PicpOwotCQkJfQotCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCBzdHlsZSk7Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgd2hldGhlciB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLgotZnVuY3Rpb24gc2V0RWRpdGFibGUoZWRpdGFibGUpIHsKLQl2YXIgZG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0gICAgaWYgKGVkaXRhYmxlICE9IG51bGwgJiYgZWRpdGFibGUgPT0gJ3RydWUnKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCWRvYy5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9ICJ0cnVlIjsKLQkJfQotCQllbHNlIHsKLQkJCWRvYy5kZXNpZ25Nb2RlID0gIm9uIjsKLQkJfQotCQlyZWFkT25seSA9IGZhbHNlOwotCX0KLQllbHNlIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewkJCi0JCQlkb2MuYm9keS5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwotCQl9Ci0JCWVsc2UgewotCQkJZG9jLmRlc2lnbk1vZGUgPSAib2ZmIjsKLQkJfQotCQlyZWFkT25seSA9IHRydWU7Ci0JfQotCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwkKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ3N0cmlrZS10aHJvdWdoJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBzdHJpa2VUaHJvdWdoKCkgewotCWZvcm1hdFRleHQoJ3N0cmlrZXRocm91Z2gnLCBzaXplKTsKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ3N1YnNjcmlwdCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc3Vic2NyaXB0KCkgewotCWZvcm1hdFRleHQoJ3N1YnNjcmlwdCcsIG51bGwpOwotfQotCi0vLyBUb2dnbGVzIHRoZSAnc3VwZXJzY3JpcHQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHN1cGVyc2NyaXB0KCkgewotCWZvcm1hdFRleHQoJ3N1cGVyc2NyaXB0JywgbnVsbCk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICd1bmRlcmxpbmUnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHVuZGVybGluZSgpIHsKLQlmb3JtYXRUZXh0KCd1bmRlcmxpbmUnLCBudWxsKTsKLX0KLQotLy8gQ29udmVydHMgYSBsaW5rIHRvIG5vcm1hbCB0ZXh0LgotZnVuY3Rpb24gdW5saW5rKCkgewotCWZvcm1hdFRleHQoJ3VubGluaycsIG51bGwpOwotfQotCi1mdW5jdGlvbiBPYmpUb1N0cmluZyhvYmplY3QpIHsKLQl2YXIgcmV0ID0gIk9iamVjdCAiICsgb2JqZWN0Lm5hbWUgKyAiIGlzIFtcbiI7Ci0JZm9yICh2YXIgcHJvcCBpbiBvYmplY3QpIHsKLQkJcmV0ICs9ICIgICIgKyBwcm9wICsgIiBpcyAiICsgb2JqZWN0W3Byb3BdICsgIjtcbiI7Ci0JfQotCXJldHVybiByZXQgKyAiXSI7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTE0ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvcnRlIj4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InJ0ZV9pZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPjwveHNsOnZhcmlhYmxlPgotCTx4c2w6dmFyaWFibGUgbmFtZT0icnRlX2pzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGpzIi8+PC94c2w6dmFyaWFibGU+Ci0JPGh0bWw+Ci0JCTxoZWFkPgotCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InskcnRlX2pzfSI+PC9zY3JpcHQ+Ci0JCTwvaGVhZD4KLQkJPGJvZHkgbGVmdE1hcmdpbj0iMCIgdG9wTWFyZ2luPSIwIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIiBzY3JvbGw9Im5vIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbiI+Ci0JCQk8aWZyYW1lIGlkPSJ7JHJ0ZV9pZH0iIG5hbWU9InskcnRlX2lkfSIgc3R5bGU9ImJvcmRlcjogbm9uZTsiIGZyYW1lYm9yZGVyPSIwIiBzY3JvbGxpbmc9ImF1dG8iIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjwvaWZyYW1lPgotCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQlpbml0RWRpdG9yKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+JywgJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY3NzIi8+JywgJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYmFzZVVSTCIvPicpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvYm9keT4KLQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmY2NDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiA8cD4KLSAqIEEgcmljaCB0ZXh0IGNvbnRyb2wgaXMgYW4gZWRpdGFibGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0IHRoYXQgZGlzcGxheXMgcmljaAotICogdGV4dCBhbmQgaW1hZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSaWNoVGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gInJpY2hUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXREYXRhCi0JICogICAgICAgICAgICB0aGUgbGF5b3V0IGRhdGEgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShPYmplY3QgbGF5b3V0RGF0YSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgY29udHJvbCdzIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGZvY3VzIHRvIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpOwotCi0JLyoqCi0JICogVGVsbHMgdGhlIGNvbnRyb2wgaXQgZG9lcyBub3QgaGF2ZSBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCbHVyKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGZvY3VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250cm9sIGhhcyB0aGUgdXNlci1pbnRlcmZhY2UgZm9jdXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyB0ZXh0IGFuZCBpbWFnZSBsaW5rcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzIGluIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXRhYmxlIHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnQgaXMgZWRpYXRibGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFZGl0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICogICAgICAgICAgICB0aGUgZWRpdGFibGUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRNb2RpZmllZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kaWZpZWQgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZWQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZChib29sZWFuIG1vZGlmaWVkKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBhIG1hcmt1cCBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByaWNoIHRleHQgY29udGVudCBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVUZXh0KCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZWRpdG9yIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuIElmIGl0IGhhcyBiZWVuCi0JICogbW9kaWZpZWQsIG5vdGlmeSB0aGUgbW9kaWZ5IGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlJpY2hUZXh0U2VsZWN0aW9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcyBub3QKLQkgKiAgICAgICAgIGJlZW4gc2V0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhKFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogU2V0cyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZC4gVGhlIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlCi0JICogZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbQkJYSBwYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbXMJCWFuIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nW10gcGFyYW1zKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIG1vZGlmeSBsaXN0ZW5lcnMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8TW9kaWZ5TGlzdGVuZXI+IGdldE1vZGlmeUxpc3RlbmVycygpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICoga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50IG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQKLQkgKiB3aGVuIGFuIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlIG9jY3VycyB3aXRoaW4gdGhpcyBlY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gdG8KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50Ci0JICogICAgICAgICAgICBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcwotCSAqICAgICAgICAgY29udHJvbAotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxSaWNoVGV4dExpc3RlbmVyPiBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRyb2wncyBGaW5kUmVwbGFjZUFjdGlvbgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZUFjdGlvbiBnZXRGaW5kUmVwbGFjZUFjdGlvbigpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIEZpbmRSZXBsYWNlQWN0aW9uIHRvIHVzZQotCSAqIEBwYXJhbSBmaW5kUmVwbGFjZUFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbml0aWFsVGV4dCB2YXJpYWJsZSwgd2hpY2ggc3RvcmVzIHdoYXQgaXMgc2F2ZWQgb24gZGlzawotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWVhYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiA8cD4KLSAqIEEgcmljaCB0ZXh0IGVkaXRvciBpcyBhIGNvbXBvc2l0ZSB1c2VyIGludGVyZmFjZSBvYmplY3QgdGhhdCBpbmNsdWRlcyBhIHRvb2wKLSAqIGJhciwgYSB0YWIgZm9sZGVyIGZvciBlbnRlcmluZyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQsIGFuZCBhIHRhYiBmb2xkZXIgZm9yCi0gKiB2aWV3aW5nIGFuZCBtb2RpZnlpbmcgdGhlIHJpY2ggdGV4dCBjb250ZW50IGluIGEgbWFya3VwIGxhbmd1YWdlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHRFZGl0b3IgZXh0ZW5kcyBJUmljaFRleHQgewotCi0JLyoqCi0JICogRmlsbHMgdGhlIHRvb2wgYmFyIHdpdGggcmljaCB0ZXh0IGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgZWRpdG9yIHRvb2wgYmFyCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKTsKLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIHJpY2ggdGV4dCBvciB0aGUgbWFya3VwIGxhbmd1YWdlIHRhYi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPjA8L2NvZGU+IGZvciB0aGUgcmljaCB0ZXh0IHRhYiwgPGNvZGU+MTwvY29kZT4gZm9yCi0JICogICAgICAgICAgICB0aGUgbWFya3VwIGxhbmd1YWdlIHRhYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIEZpbmRSZXBsYWNlQWN0aW9uIHRvIHVzZQotCSAqIEBwYXJhbSBmaW5kUmVwbGFjZUFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0VG9vbEJhci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0VG9vbEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E1M2Q1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dFRvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlJpY2hUZXh0Q29tYm9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGVkaXRvciB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHRUb29sQmFyIHsKLQotCQotCS8qKgotCSAqIEFkZHMgYSBidXR0b24gYWN0aW9uIHRvIHRoZSB0b29sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYnV0dG9uIGFjdGlvbiB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pOwotCi0JLyoqCi0JICogQWRkcyBhIGNvbWJvIGFjdGlvbiB0byB0aGUgdG9vbCBiYXIuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGNvbWJvIGFjdGlvbiB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb24oUmljaFRleHRDb21ib0FjdGlvbiBpdGVtKTsKLQotCS8qKgotCSAqIEFkZHMgYSBzZXBhcmF0b3IgdG8gdGhlIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlcGFyYXRvcigpOwotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgdG9vbGJhciBzdGF0ZS4KLQkgKiA8cD4KLQkgKiBFbmFibGVzL2Rpc2FibGVzIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLQkgKiBSaWNoVGV4dEVkaXRvciB0YWIgKFJpY2hUZXh0IHZzLiBIVE1MKQotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZSBzcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgbm9uLVJlYWRPbmx5IGNvbW1hbmRzCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbEJhcihib29sZWFuIGVuYWJsZWQpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2xiYXIgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBUb29sQmFyTWFuYWdlciBnZXRUb29sYmFyTWdyKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZhYmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJFR0lOIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdD1hcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdF9Nb3ppbGxhPWFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotCi0jIEZvbnQgU3R5bGUgTmFtZXMKLWZvbnRTdHlsZV9ub3JtYWw9Tm9ybWFsCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9U2VjdGlvbiBIZWFkaW5nCi1mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc9U3Vic2VjdGlvbiBIZWFkaW5nCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9U3ViIFN1YnNlY3Rpb24gSGVhZGluZwotZm9udFN0eWxlX3F1b3RlPVF1b3RlCi1mb250U3R5bGVfY29kZVNhbXBsZT1Db2RlIFNhbXBsZQotCi0jIEhUTUwgQmxvY2sgVGFncwotYmxvY2tUYWdfcGFyYWdyYXBoPVBhcmFncmFwaAotYmxvY2tUYWdfaGVhZGluZzE9SGVhZGluZyAxCi1ibG9ja1RhZ19oZWFkaW5nMj1IZWFkaW5nIDIKLWJsb2NrVGFnX2hlYWRpbmczPUhlYWRpbmcgMwotYmxvY2tUYWdfaGVhZGluZzQ9SGVhZGluZyA0Ci1ibG9ja1RhZ19oZWFkaW5nNT1IZWFkaW5nIDUKLWJsb2NrVGFnX2hlYWRpbmc2PUhlYWRpbmcgNgotYmxvY2tUYWdfYWRkcmVzcz1BZGRyZXNzCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVByZWZvcm1hdHRlZCBUZXh0Ci0KLSMgSFRNTCBGb250IE5hbWVzCi1mb250TmFtZV9kZWZhdWx0PURlZmF1bHQKLWZvbnROYW1lX2FyaWFsPUFyaWFsCi1mb250TmFtZV9jb3VyaWVyTmV3PUNvdXJpZXIgTmV3Ci1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbgotZm9udE5hbWVfdmVyZGFuYT1WZXJkYW5hCi0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMKLWFkZEhvcml6b250YWxCYXJBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIEhvcml6b250YWwgQmFyCi1hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dD1BZGQgSW1hZ2UKLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIExpbmUKLWFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIExpbmsKLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBPcmRlcmVkIExpc3QKLWFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBUYWJsZQotYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1BZGQgVW5vcmRlcmVkIExpc3QKLWJvbGRBY3Rpb25fdG9vbFRpcFRleHQ9Qm9sZAotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUNsZWFyIENvbnRlbnQKLWNvcHlBY3Rpb25fdG9vbFRpcFRleHQ9Q29weQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PUN1dAotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9RmluZC9SZXBsYWNlCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9SW5kZW50Ci1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9SXRhbGljCi1qdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZnkgQ2VudGVyCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IEZ1bGwKLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZnkgTGVmdAotanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZnkgUmlnaHQKLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9T3V0ZGVudAotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9UGFzdGUKLXBhc3RlUGxhaW5UZXh0QWN0aW9uX3Rvb2xUaXBUZXh0PVBhc3RlIGFzIHBsYWluIHRleHQKLXN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1TdWJzY3JpcHQKLXN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVN1cGVyc2NyaXB0Ci11bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQ9VW5kZXJsaW5lCi10aWR5X2NsZWFuX3RleHQ9RGVmYXVsdCBDbGVhbgotdGlkeV9jbGVhbmVyX3RleHQ9Q2xlYW4gTVMgSFRNTAotdGlkeV9jbGVhbmVzdF90ZXh0PUNsZWFuIFdvcmQgMjAwMCBIVE1MCi10aWR5X2NsZWFuX3Rvb2xUaXBUZXh0PUNsZWFuIHdpdGggSlRpZHkgdXNpbmcgZGVmYXVsdCBvcHRpb25zCi10aWR5X2NsZWFuZXJfdG9vbFRpcFRleHQ9Q2xlYW4gSFRNTCBvZiBNUyBIVE1MCi10aWR5X2NsZWFuZXN0X3Rvb2xUaXBUZXh0PUNsZWFuIFdvcmQgMjAwMCBIVE1MCi0KLQotIyBSaWNoIFRleHQgRWRpdG9yIENvbWJvYm94ZXMKLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1TZXQgRm9udCBTdHlsZQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEJsb2NrIFRhZwotZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEZvbnQKLWZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZT1EZWZhdWx0IGZvbnQKLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVNldCBGb250IFNpemUKLQotIyBSaWNoIFRleHQgRWRpdG9yIENvbnRleHQgTWVudSBJdGVtcwotY3V0QWN0aW9uX3RleHQ9JkN1dAotY29weUFjdGlvbl90ZXh0PUMmb3B5Ci1wYXN0ZUFjdGlvbl90ZXh0PSZQYXN0ZQotcGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dD1QYXN0ZSAmYXMgcGxhaW4gdGV4dAotCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicwotcmljaFRleHRUYWJfdGV4dD1SaWNoIFRleHQKLXJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0PUVkaXQgY29udGVudCBpbiByaWNoIHRleHQKLWh0bWxUYWJfdGV4dD1IVE1MCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUVkaXQgY29udGVudCBpbiBIVE1MCi0KLSMgQWRkIERpYWxvZ3MKLWFkZEltYWdlRGlhbG9nX3RpdGxlPUFkZCBJbWFnZQotYWRkTGlua0RpYWxvZ190aXRsZT1BZGQgTGluawotYWRkVGFibGVEaWFsb2dfdGl0bGU9QWRkIFRhYmxlCi1maW5kUmVwbGFjZURpYWxvZ190aXRsZT1GaW5kL1JlcGxhY2UKLXVybExhYmVsX3RleHQ9VVJMOgotc3VtbWFyeUxhYmVsX3RleHQ9U3VtbWFyeToKLWNhcHRpb25MYWJlbF90ZXh0PUNhcHRpb246Ci1yb3dzTGFiZWxfdGV4dD1Sb3dzOgotY29sdW1uc0xhYmVsX3RleHQ9Q29sdW1uczoKLXdpZHRoTGFiZWxfdGV4dD1XaWR0aDoKLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVN0eWxlOgotdGFibGVIZWFkZXJOb25lX3RleHQ9VGFibGUgd2l0aCBubyBoZWFkZXJzCi10YWJsZUhlYWRlckNvbHNfdGV4dD1UYWJsZSB3aXRoIGNvbHVtbiBoZWFkZXJzCi10YWJsZUhlYWRlclJvd3NfdGV4dD1UYWJsZSB3aXRoIHJvdyBoZWFkZXJzCi10YWJsZUhlYWRlckJvdGhfdGV4dD1UYWJsZSB3aXRoIGNvbHVtbiBhbmQgcm93IGhlYWRlcnMKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZwotY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlPUNsZWFyIEVkaXRvciBDb250ZW50IENvbmZpcm1hdGlvbgotY2xlYXJDb250ZW50RGlhbG9nX3RleHQ9RG8geW91IHJlYWxseSB3YW50IHRvIGNsZWFyIHRoZSBjb250ZW50IG9mIHRoaXMgcmljaCB0ZXh0IGVkaXRvcj8KLQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nCi1maW5kTGFiZWxfdGV4dD1GaW5kOgotcmVwbGFjZUxhYmVsX3RleHQ9UmVwbGFjZSB3aXRoOgotb3B0aW9uc0dyb3VwX3RleHQ9T3B0aW9ucwotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9Q2FzZSBzZW5zaXRpdmUKLXdob2xlV29yZENoZWNrYm94X3RleHQ9V2hvbGUgd29yZAotZGlyZWN0aW9uR3JvdXBfdGV4dD1EaXJlY3Rpb24KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PUZvcndhcmQKLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1CYWNrd2FyZAotZmluZEJ1dHRvbl90ZXh0PUZpbmQKLXJlcGxhY2VCdXR0b25fdGV4dD1SZXBsYWNlCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVJlcGxhY2UvRmluZAotcmVwbGFjZWFsbEJ1dHRvbl90ZXh0PVJlcGxhY2UgQWxsCi0jIHRha2VuIGZyb20gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IKLUZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsPVN0cmluZyBOb3QgRm91bmQKLQotIyBQcmVmZXJlbmNlIFBhZ2UKLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9TWF4aW11bSBjaGFyYWN0ZXJzIHBlciBsaW5lOgotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9SW5kZW50IEhUTUwgdGFncwotaW5kZW50U2l6ZUxhYmVsX3RleHQ9SW5kZW50IFNpemU6Ci11cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ9VVJMIERpc3BsYXkgTmFtZToKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4NGYzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sLkhUTUxGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZVBsYWluVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgcmljaCB0ZXh0IGNvbnRyb2wgaW1wbGVtZW50YXRpb24uCi0gKiA8cD4KLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCBlZGl0b3IgdXNlcyBYSFRNTCBhcyB0aGUgdW5kZXJseWluZyBtYXJrdXAgbGFuZ3VhZ2UgZm9yCi0gKiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuIEl0IGlzIGltcGxlbWVudGVkIHVzaW5nIGEgU1dUIDxjb2RlPkJyb3dzZXI8L2NvZGU+Ci0gKiBjb250cm9sIGFuZCBESFRNTCAoSFRNTCwgQ1NTIGFuZCBKYXZhU2NyaXB0KS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0IGltcGxlbWVudHMgSVJpY2hUZXh0IHsKLQotCS8vIEVuY29kZWQgc2luZ2xlIHF1b3RlLiBBbGwgc2luZ2xlIHF1b3RlcyBuZWVkIHRvIGJlIHNwZWNpYWxseSBlbmNvZGVkIHRvCi0JLy8gYXZvaWQgSmF2YVNjcmlwdCBlcnJvciB3aGVuIGNhbGxpbmcgQnJvd3NlLmV4ZWN1dGVDb21tYW5kKCkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERURfU0lOR0xFX1FVT1RFID0gIiVzcSUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RFRF9ORVdMSU5FID0gIiVFT0wlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19QUkVGSVggPSAiJCQkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19QUkVGSVhfTEVOR1RIID0gU1RBVFVTX1BSRUZJWC5sZW5ndGgoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTk9QID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSU5JVElBTElaRUQgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19NT0RJRklFRCA9IDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0dFVF9URVhUID0gMzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfS0VZX0RPV04gPSA0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19LRVlfVVAgPSA1OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19TRUxFQ1RfVEVYVCA9IDY7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1NFTEVDVF9DT05UUk9MID0gNzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU0VMRUNUX05PTkUgPSA4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19FWEVDX0NNRCA9IDk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1JFRk9STUFUX0xJTktTID0gMTA7Ci0KLQkvLyBUaGUgZGVmYXVsdCBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzICg8aHJlZj4sIDxpbWc+LCBldGMuKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JBU0VfUEFUSCA9IFN5c3RlbQotCQkJLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSAvLyROT04tTkxTLTEkCi0JCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArICJydGUiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8vIElmIHRydWUsIGxvZyBkZWJ1Z2dpbmcgaW5mby4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQotCS8vIFRoZSBwbHVnLWluIGxvZ2dlci4KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCS8vIFRoZSB1bmRlcmx5aW5nIFNXVCBCcm93c2VyIHVzZWQgZm9yIGxvYWRpbmcgdGhlIEphdmFTY3JpcHQvREhUTUwgZWRpdG9yLgotCXByb3RlY3RlZCBCcm93c2VyIGVkaXRvcjsKLQotCS8vIFRoZSB1bmRlcmx5aW5nIE9sZUNvbnRyb2xTaXRlIGZvciB0aGUgU1dUIEJyb3dzZXIgKFdpbjMyIG9ubHkpLgotCXByb3RlY3RlZCBDb250cm9sIGVkaXRvckNvbnRyb2w7Ci0KLQkvLyBUaGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QKLQkvLyBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC4KLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBjb3B5VVJMOwotCi0JLy8gVGhlIGNvbnRleHQgbWVudSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250cm9sLgotCXByb3RlY3RlZCBNZW51IGNvbnRleHRNZW51OwotCi0JLy8gVGhlIGZvbGRlciB0aGF0IGNvbnRhaW5zIHRoZSBzdXBwb3J0aW5nIENTUyBhbmQgSmF2YVNjcmlwdCBmaWxlcwotCXByb3RlY3RlZCBTdHJpbmcgcnRlRm9sZGVyOwotCi0JLy8gVGhlIFVSTCB0aGF0IHBvaW50cyB0byB0aGUgc3VwcG9ydGluZyBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMuCi0JcHJvdGVjdGVkIFN0cmluZyBydGVVUkw7Ci0KLQkvLyBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyAoPGhyZWY+LCA8aW1nPiwgZXRjLikKLQlwcm90ZWN0ZWQgU3RyaW5nIGJhc2VQYXRoOwotCi0JLy8gVGhlIERIVE1MIGluaXRpYWxpemF0aW9uIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0KLQkvLyBUaGUgaW5pdGlhbCBmb2N1cy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplZFdpdGhGb2N1czsKLQotCS8vIFRoZSBjb250cm9sJ3MgaW5pdGlhbCB0ZXh0LiBUaGlzIGlzIHVzZWQgdG8gY2FjaGUgdGhlIEhUTUwgc291cmNlIHBhc3NlZAotCS8vIGluIHZpYSBzZXRUZXh0KCl3aGlsZSB0aGUgREhUTUwgaW5pdGlhbGl6YXRpb24gaXMgaGFwcGVuaW5nLgotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbFRleHQ7Ci0KLQkvLyBUaGUgY29udHJvbCdzIGN1cnJlbnQgdGV4dC4KLQlwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgZWRpdGFibGUgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZSA9IHRydWU7Ci0KLQkvLyBUaGUgY29udHJvbCdzIG1vZGlmaWNhdGlvbiBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIG1vZGlmaWVkOwotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IGFuZCBvYmplY3Qgc2VsZWN0aW9uIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzU2VsZWN0aW9uOwotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IHNlbGVjdGlvbgotCXByb3RlY3RlZCBSaWNoVGV4dFNlbGVjdGlvbiByaWNoVGV4dFNlbGVjdGlvbiA9IG5ldyBSaWNoVGV4dFNlbGVjdGlvbigpOwotCi0JLy8gSmF2YVNjcmlwdCBjb21tYW5kIGV4ZWN1dGlvbiBzdGF0dXMgY29kZS4KLQlwcm90ZWN0ZWQgaW50IHN0YXR1cyA9IDA7Ci0KLQkvLyBUaGUgSFRNTCBzb3VyY2UgZm9ybWF0dGVyLgotCXByb3RlY3RlZCBIVE1MRm9ybWF0dGVyIGh0bWxGb3JtYXR0ZXI7Ci0KLQkvLyBUaGUgU1dUIGV2ZW50IGxpc3RlbmVycy4KLQlwcm90ZWN0ZWQgTWFwPExpc3RlbmVyLCBSaWNoVGV4dExpc3RlbmVyPiBsaXN0ZW5lcnM7Ci0KLQkvLyBUaGUgbW9kaWZ5IGxpc3RlbmVycy4KLQlwcm90ZWN0ZWQgTGlzdDxNb2RpZnlMaXN0ZW5lcj4gbW9kaWZ5TGlzdGVuZXJzOwotCi0JLy8gVGhlIGNvbnRyb2wncyBlZGl0IGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90aWZ5aW5nTW9kaWZ5TGlzdGVuZXJzID0gZmFsc2U7Ci0KLQkvLyBUaGUgY29udHJvbHMncyBmb2N1cyBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZvY3VzID0gZmFsc2U7Ci0KLQkvLyBUaGUgY29udHJvbHMncyBwcm9jZXNzaW5nIEphdmFTY3JpcHQgZXZlbnQgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzaW5nSlNFdmVudCA9IGZhbHNlOwotCi0JLy8gVGhlIGNvbnRyb2xzJ3MgcHJvY2Vzc2luZyBNT0RJRklFRCBKYXZhU2NyaXB0IGV2ZW50IGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tpbmdNb2RpZnlFdmVudCA9IGZhbHNlOwotCi0JLy8gVGhlIGNvbnRyb2wncyBmaW5kL3JlcGxhY2UgdGV4dCBhY3Rpb24KLQlwcm90ZWN0ZWQgRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb247Ci0JCi0JLy8gVGhlIGNvbnRyb2wncyBJRSBmbGFnCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJRSA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcwotCSAqLwotCXB1YmxpYyBSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQlkZWJ1ZyA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCWZpbmRSZXBsYWNlQWN0aW9uID0gbmV3IEZpbmRSZXBsYWNlQWN0aW9uKHRoaXMpOwotCQlydGVGb2xkZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFBhdGgoKSArICJydGUvIjsgLy8kTk9OLU5MUy0xJAkJCi0JCXJ0ZVVSTCA9IFhNTFV0aWwuZXNjYXBlKCJmaWxlOi8vIiArIHJ0ZUZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0QmFzZVBhdGgoYmFzZVBhdGgpOwotCi0JCXRyeSB7Ci0JCQllZGl0b3IgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJSaWNoVGV4dCIsICJiYXNlUGF0aD0iICsgYmFzZVBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVkaXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCWVkaXRvci5zZXREYXRhKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQkJaW5pdChwYXJlbnQsIHN0eWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCQlTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBjcmVhdGUgUmljaFRleHQgd2l0aCBiYXNlUGF0aD0iICsgYmFzZVBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZ2dlci5sb2dFcnJvcihtc2csIGUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhpcyBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0aGlzKHBhcmVudCwgc3R5bGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgcGF0aCBmb3IgcmVzb2x2aW5nIGxpbmtzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJhc2VQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgoRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYKSkgewotCQkJCWJhc2VQYXRoID0gRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYCi0JCQkJCQkrIEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihwYXRoLnN1YnN0cmluZygKLQkJCQkJCQkJRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYX0xFTkdUSCkucmVwbGFjZSgnXFwnLAotCQkJCQkJCQknLycpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWJhc2VQYXRoID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKHBhdGgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJhc2VQYXRoID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKERFRkFVTFRfQkFTRV9QQVRIKS5yZXBsYWNlKAotCQkJCQknXFwnLCAnLycpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgaW5pdGlhbHppbmcgdGhpcyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJYWRkU3RhdHVzVGV4dExpc3RlbmVyKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJhZGRlZCBzdGF0dXMgdGV4dCBsaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJU3RyaW5nIGVkaXRvckhUTUwgPSBnZW5lcmF0ZUVkaXRvckhUTUwoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImdlbmVyYXRlZCBlZGl0b3IgSFRNTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJZWRpdG9yLnNldFRleHQoZWRpdG9ySFRNTCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJsb2FkZWQgZWRpdG9yIEhUTUwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWNvbnRleHRNZW51ID0gbmV3IE1lbnUocGFyZW50LmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotCQkJZWRpdG9yLnNldE1lbnUoY29udGV4dE1lbnUpOwotCQkJZmlsbENvbnRleHRNZW51KGNvbnRleHRNZW51KTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImFkZGVkIGNvbnRleHQgbWVudSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJYWRkTGlzdGVuZXJzKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJhZGRlZCBsaXN0ZW5lcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWh0bWxGb3JtYXR0ZXIgPSBuZXcgSFRNTEZvcm1hdHRlcigpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiaW5zdGFudGlhdGVkIEhUTUxGb3JtYXR0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQkJZGlzcG9zZSgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXREYXRhCi0JICogICAgICAgICAgICB0aGUgbGF5b3V0IGRhdGEgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShPYmplY3QgbGF5b3V0RGF0YSkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHJldHVybiB0aGlzIGNvbnRyb2wncyBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF5b3V0RGF0YSgpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZWRpdG9yLmdldExheW91dERhdGEoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGZvY3VzIHRvIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlwcmludERlYnVnTWVzc2FnZSgic2V0Rm9jdXMsIGVkaXRhYmxlPSIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChpbml0aWFsaXplZCkgewotCQkJCWlmICghZWRpdG9yLmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCQkJaWYgKCFQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBNb3ppbGxhIGFuZCBGaXJlZm94IHJpY2ggdGV4dCBlZGl0b3IgZm9jdXMKLQkJCQkJCS8vIGlzc3VlLgotCQkJCQkJZWRpdG9yLnNldEZvY3VzKCk7Ci0JCQkJCX0KLQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT0NVUyk7Ci0JCQkJfQotCQkJCWhhc0ZvY3VzID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5pdGlhbGl6ZWRXaXRoRm9jdXMgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgdGhlIGNvbnRyb2wgaXQgZG9lcyBub3QgaGF2ZSBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCbHVyKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCXByaW50RGVidWdNZXNzYWdlKCJzZXRCbHVyLCBlZGl0YWJsZT0iICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQloYXNGb2N1cyA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpbml0aWFsaXplZFdpdGhGb2N1cyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBmb2N1cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBoYXMgdGhlIHVzZXItaW50ZXJmYWNlIGZvY3VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGhhc0ZvY3VzOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIHRleHQgYW5kIGltYWdlIGxpbmtzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgaW4gdGhpcyBjb250cm9sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlUGF0aCgpIHsKLQkJcmV0dXJuIGJhc2VQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpIHsKLQkJcmV0dXJuIGNvcHlVUkw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCkgewotCQl0cnkgewotCQkJY29weVVSTCA9IG5ldyBGaWxlKGJhc2VQYXRoKS50b1VSTCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJY29weVVSTCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGlzIGVkaXRhYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBlZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0YWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRURJVEFCTEUsICIiICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RpZmllZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWQKLQkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gbW9kaWZpZWQpIHsKLQkJdGhpcy5tb2RpZmllZCA9IG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBhIG1hcmt1cCBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGluaXRpYWxpemVkKSB7Ci0JCQl0cnkgewotCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5HRVRfVEVYVCk7Ci0JCQkJaWYgKGN1cnJlbnRUZXh0ICE9IG51bGwgJiYgY3VycmVudFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWN1cnJlbnRUZXh0ID0gY3VycmVudFRleHQucmVwbGFjZUFsbCgKLQkJCQkJCQkiPFA+Jm5ic3A7PC9QPiIsICI8YnIvPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkKLQkJCQkJY3VycmVudFRleHQgPSB0aWR5VGV4dChjdXJyZW50VGV4dCk7Ci0JCQkJCWN1cnJlbnRUZXh0ID0gZm9ybWF0SFRNTChjdXJyZW50VGV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImdldFRleHQiLCAidGV4dD0iLCBjdXJyZW50VGV4dCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXR1cm4gY3VycmVudFRleHQ7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZFRleHQ7Ci0JCXRyeSB7Ci0JCQkvLyBDYWxsIEpUaWR5IHRvIGZvcm1hdCB0aGUgc291cmNlIHRvIFhIVE1MLgotCQkJZm9ybWF0dGVkVGV4dCA9IGh0bWxGb3JtYXR0ZXIuZm9ybWF0SFRNTCh0ZXh0KTsKLQkJCWlmIChodG1sRm9ybWF0dGVyLmdldExhc3RFcnJvclN0cigpICE9IG51bGwpIHsKLQkJCQlsb2dnZXIubG9nRXJyb3IoaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZm9ybWF0dGVkVGV4dDsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInNldFRleHQiLCAidGV4dD0iLCB0ZXh0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCVN0cmluZyBuZXdUZXh0ID0gdGV4dDsKLQkJCWlmIChuZXdUZXh0ICE9IG51bGwpIHsKLQkJCQluZXdUZXh0ID0gdGlkeVRleHQobmV3VGV4dCk7Ci0JCQkJLy8gQ2FsbCBKVGlkeSB0byBmb3JtYXQgdGhlIHNvdXJjZSB0byBYSFRNTC4KLQkJCQluZXdUZXh0ID0gZm9ybWF0SFRNTChuZXdUZXh0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChpbml0aWFsaXplZCkgewotCQkJCW1vZGlmaWVkID0gIW5ld1RleHQuZXF1YWxzKGN1cnJlbnRUZXh0KTsKLQkJCX0KLQkJCWluaXRpYWxUZXh0ID0gbmV3VGV4dDsKLQkJCWlmIChpbml0aWFsVGV4dC5lcXVhbHMoIiIpICYmICFpc0lFKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbml0aWFsVGV4dCA9ICI8YnIgLz4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJInNldFRleHQiLCAibW9kaWZpZWQ9IiArIG1vZGlmaWVkICsgIiwgbmV3VGV4dD0iLCBuZXdUZXh0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9URVhULCBuZXdUZXh0KTsKLQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9FRElUQUJMRSwgIiIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJY3VycmVudFRleHQgPSBuZXdUZXh0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJpY2ggdGV4dCBjb250ZW50IGJhY2sgdG8gdGhlIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVRleHQoKSB7Ci0JCXNldFRleHQoaW5pdGlhbFRleHQpOwotCQltb2RpZmllZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIHRleHQgb3IgPGNvZGU+IiI8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICBoYXNTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkVGV4dCgpIHsKLQkJLy8gZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkdFVF9TRUxFQ1RFRF9URVhUKTsKLQkJcmV0dXJuIHJpY2hUZXh0U2VsZWN0aW9uLmdldFRleHQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjZ2V0U2VsZWN0ZWQoKQotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHJpY2hUZXh0U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcyBub3QKLQkgKiAgICAgICAgIGJlZW4gc2V0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhKFN0cmluZyBrZXkpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuZ2V0RGF0YShrZXkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXREYXRhKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIEphdmFTY3JpcHQuCi0JICogCi0JICogQHBhcmFtIHNjcmlwdAotCSAqICAgICAgICAgICAgdGhlIEphdmFTY3JpcHQgdG8gZXhlY3V0ZQotCSAqIEByZXR1cm4gYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgc2NyaXB0Ci0JICovCi0JcHJvdGVjdGVkIGludCBleGVjdXRlKGZpbmFsIFN0cmluZyBzY3JpcHQpIHsKLQkJc3RhdHVzID0gMDsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIHNjcmlwdCAhPSBudWxsICYmIHNjcmlwdC5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFpc0lFICYmIHByb2Nlc3NpbmdKU0V2ZW50KSB7Ci0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJZWRpdG9yLmV4ZWN1dGUoc2NyaXB0KTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWRpdG9yLmV4ZWN1dGUoc2NyaXB0KTsKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCXByaW50RGVidWdNZXNzYWdlKCJleGVjdXRlIiwgc2NyaXB0KTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGV4ZWN1dGUgIiArIHNjcmlwdDsgLy8kTk9OLU5MUy0xJAotCQkJCWxvZ2dlci5sb2dFcnJvcihtc2csIGUpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZXhlY3V0ZSIsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQuIFRoZSBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZQotCSAqIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZy4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7Ci0JCXN0YXR1cyA9IDA7Ci0JCWlmIChjb21tYW5kICE9IG51bGwgJiYgY29tbWFuZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLkNMRUFSX0NPTlRFTlQpKSB7Ci0JCQlTdHJpbmcgb2xkSW5pdGlhbFRleHQgPSBpbml0aWFsVGV4dDsKLQkJCXNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpbml0aWFsVGV4dCA9IG9sZEluaXRpYWxUZXh0OwotCQkJc3RhdHVzID0gMTsKLQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gZXhlY3V0ZShjb21tYW5kICsgIigpOyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbQkJYSBwYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtKSB7Ci0JCWlmIChwYXJhbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0JCX0KLQkJcmV0dXJuIGV4ZWN1dGUoY29tbWFuZCArICIoJyIgKyBmb3JtYXRUZXh0KHBhcmFtKSArICInKTsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYW4gYXJyYXkgb2YgcGFyYW1ldGVycy4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtcwkJYW4gYXJyYXkgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmdbXSBwYXJhbXMpIHsKLQkJaWYgKHBhcmFtcyA9PSBudWxsIHx8IHBhcmFtcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHBhcmFtc0xlbmd0aCA9IHBhcmFtcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zTGVuZ3RoOyBpKyspIHsKLQkJCXNiLmFwcGVuZCgnXCcnKS5hcHBlbmQoZm9ybWF0VGV4dChwYXJhbXNbaV0pKS5hcHBlbmQoJ1wnJyk7Ci0JCQlpZiAoaSA8IHBhcmFtc0xlbmd0aCAtIDEpIHsKLQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgcGFyYW0gPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gZXhlY3V0ZShjb21tYW5kICsgIigiICsgcGFyYW0gKyAiKTsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY29udGV4dE1lbnUgIT0gbnVsbCAmJiAhY29udGV4dE1lbnUuaXNEaXNwb3NlZCgpKSB7Ci0JCQljb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCQljb250ZXh0TWVudSA9IG51bGw7Ci0JCX0KLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCWxpc3RlbmVycyA9IG51bGw7Ci0JCX0KLQkJaWYgKG1vZGlmeUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQltb2RpZnlMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCW1vZGlmeUxpc3RlbmVycyA9IG51bGw7Ci0JCX0KLQkJaWYgKGh0bWxGb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJaHRtbEZvcm1hdHRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKHRoaXMuZmluZFJlcGxhY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbi5kaXNwb3NlKCk7Ci0JCQl0aGlzLmZpbmRSZXBsYWNlQWN0aW9uID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udHJvbCBoYXMgYmVlbiBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZCBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gZWRpdG9yLmlzRGlzcG9zZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZnkgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE1vZGlmeUxpc3RlbmVyPiBnZXRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBtb2RpZnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4ga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogdGhlIGNvbnRlbnQgb2YgdGhpcyBjb250cm9sIGlzIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgIW1vZGlmeUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCW1vZGlmeUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgbW9kaWZ5TGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbW9kaWZ5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50IG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiAhbGlzdGVuZXJzLmNvbnRhaW5zS2V5KGxpc3RlbmVyKSkgewotCQkJaWYgKGV2ZW50VHlwZSAhPSBTV1QuU0VMRUNURUQpIHsKLQkJCQlpZiAoZWRpdG9yQ29udHJvbCA9PSBudWxsCi0JCQkJCQl8fCAoZXZlbnRUeXBlICE9IFNXVC5BY3RpdmF0ZQotCQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkRlYWN0aXZhdGUKLQkJCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c0luICYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNPdXQpKSB7Ci0JCQkJCWVkaXRvci5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsaXN0ZW5lcnMucHV0KGxpc3RlbmVyLCBuZXcgUmljaFRleHRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkCi0JICogd2hlbiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGxpc3RlbmVycy5jb250YWluc0tleShsaXN0ZW5lcikpIHsKLQkJCWlmIChlZGl0b3JDb250cm9sID09IG51bGwKLQkJCQkJfHwgKGV2ZW50VHlwZSAhPSBTV1QuQWN0aXZhdGUKLQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkRlYWN0aXZhdGUKLQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkZvY3VzSW4gJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c091dCkpIHsKLQkJCQllZGl0b3IucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCQl9Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8UmljaFRleHRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gbW9uaXRvciBldmVudHMgYW5kIHN0YXR1cyBzZW50IGJ5IHRoZSB1bmRlcmx5aW5nCi0JICogREhUTUwgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJZWRpdG9yLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgZXZlbnRUZXh0ID0gZXZlbnQudGV4dDsKLQkJCQlpbnQgZXZlbnRUZXh0TGVuZ3RoID0gZXZlbnRUZXh0Lmxlbmd0aCgpOwotCQkJCWlmIChldmVudFRleHQuc3RhcnRzV2l0aChTVEFUVVNfUFJFRklYKQotCQkJCQkJJiYgZXZlbnRUZXh0TGVuZ3RoID4gU1RBVFVTX1BSRUZJWF9MRU5HVEgpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXByb2Nlc3NpbmdKU0V2ZW50ID0gdHJ1ZTsKLQkJCQkJCWludCBlbmRTdGF0dXNJbmRleCA9IFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMTsKLQkJCQkJCWlmIChldmVudFRleHQubGVuZ3RoKCkgPiBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDEKLQkJCQkJCQkJJiYgQ2hhcmFjdGVyLmlzRGlnaXQoZXZlbnRUZXh0Ci0JCQkJCQkJCQkJLmNoYXJBdChlbmRTdGF0dXNJbmRleCkpKSB7Ci0JCQkJCQkJZW5kU3RhdHVzSW5kZXgrKzsKLQkJCQkJCX0KLQkJCQkJCWludCBzdGF0dXNUeXBlID0gSW50ZWdlci5wYXJzZUludChldmVudFRleHQuc3Vic3RyaW5nKAotCQkJCQkJCQlTVEFUVVNfUFJFRklYX0xFTkdUSCwgZW5kU3RhdHVzSW5kZXgpKTsKLQkJCQkJCXN3aXRjaCAoc3RhdHVzVHlwZSkgewotCQkJCQkJY2FzZSBTVEFUVVNfTk9QOgotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfSU5JVElBTElaRUQ6Ci0JCQkJCQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJCQkJCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAiU1RBVFVTX0lOSVRJQUxJWkVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJLy8gV29ya2Fyb3VuZCBNb3ppbGxhJ2EgSUZSQU1FCi0JCQkJCQkJCQkvLyBoZWlnaHQgaXNzdWUuCi0JCQkJCQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0hFSUdIVCwKLQkJCQkJCQkJCQkJIiIgKyBlZGl0b3IuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfVEVYVCwKLQkJCQkJCQkJCQljdXJyZW50VGV4dCk7Ci0JCQkJCQkJCWlmIChpbml0aWFsaXplZFdpdGhGb2N1cykgewotCQkJCQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoIWVkaXRhYmxlKSB7Ci0JCQkJCQkJCQlleGVjdXRlQ29tbWFuZCgKLQkJCQkJCQkJCQkJUmljaFRleHRDb21tYW5kLlNFVF9FRElUQUJMRSwKLQkJCQkJCQkJCQkJIiIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX01PRElGSUVEOgotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19NT0RJRklFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0dFVF9URVhUOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKSB7Ci0JCQkJCQkJCWN1cnJlbnRUZXh0ID0gZXZlbnRUZXh0Ci0JCQkJCQkJCQkJLnN1YnN0cmluZyhTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWN1cnJlbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19HRVRfVEVYVCwgY3VycmVudFRleHQ9IiwgY3VycmVudFRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfS0VZX0RPV046Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpIHsKLQkJCQkJCQkJU3RyaW5nIGNtZCA9IGV2ZW50VGV4dAotCQkJCQkJCQkJCS5zdWJzdHJpbmcoU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKTsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiU1RBVFVTX0tFWV9ET1dOLCBjbWQ9IiArIGNtZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuQ09QWSkpIHsKLQkJCQkJCQkJCXNldENvcHlVUkwoKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5DVVQpKSB7Ci0JCQkJCQkJCQlzZXRDb3B5VVJMKCk7Ci0JCQkJCQkJCQlDdXRBY3Rpb24gYWN0aW9uID0gbmV3IEN1dEFjdGlvbigKLQkJCQkJCQkJCQkJUmljaFRleHQudGhpcyk7Ci0JCQkJCQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQKLQkJCQkJCQkJCQkuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5GSU5EX1RFWFQpKSB7Ci0JCQkJCQkJCQlnZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUoCi0JCQkJCQkJCQkJCVJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlBBU1RFKSkgewotCQkJCQkJCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKAotCQkJCQkJCQkJCQlSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlNBVkUpKSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpCi0JCQkJCQkJCQkJCS5kb1NhdmUobnVsbCk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuU0FWRV9BTEwpKSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLnNhdmVBbGxFZGl0b3JzKAotCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0tFWV9VUDoKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX0tFWV9VUCwgbW9kaWZpZWQ9IiArIG1vZGlmaWVkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX1RFWFQ6Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpIHsKLQkJCQkJCQkJU3RyaW5nW10gc3RyaW5ncyA9IGV2ZW50VGV4dC5zdWJzdHJpbmcoCi0JCQkJCQkJCQkJU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKS5zcGxpdCgKLQkJCQkJCQkJCQkiXFwkIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZvbnROYW1lKHN0cmluZ3NbMF0pOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0Rm9udFNpemUoc3RyaW5nc1sxXSk7Ci0JCQkJCQkJCQlyaWNoVGV4dFNlbGVjdGlvbi5zZXRCbG9ja1N0eWxlKHN0cmluZ3NbMl0pOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0RmxhZ3MoSW50ZWdlcgotCQkJCQkJCQkJCQkucGFyc2VJbnQoc3RyaW5nc1szXSkpOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0VGV4dChzdHJpbmdzWzRdKTsKLQkJCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCQkic2VsZWN0aW9uU3RhdHVzTGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSJjdXJyZW50IHNlbGVjdGlvbiBpcz0iICsgcmljaFRleHRTZWxlY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQotCQkJCQkJCQloYXNTZWxlY3Rpb24gPSB0cnVlOwotCQkJCQkJCQlpZiAoaGFzRm9jdXMoKSkKLQkJCQkJCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuU0VMRUNURUQsIG5ldyBFdmVudCgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyaWNoVGV4dFNlbGVjdGlvbi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQloYXNTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19TRUxFQ1RfVEVYVCwgc2VsZWN0ZWRUZXh0PSIsIHJpY2hUZXh0U2VsZWN0aW9uLmdldFRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19TRUxFQ1RfQ09OVFJPTDoKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX1NFTEVDVF9DT05UUk9MLCBjb250cm9sIHNlbGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJaGFzU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX1NFTEVDVF9OT05FOgotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfU0VMRUNUX05PTkUsIG5vIHNlbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWhhc1NlbGVjdGlvbiA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfRVhFQ19DTUQ6Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDMpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXN0YXR1cyA9IEludGVnZXIucGFyc2VJbnQoZXZlbnRUZXh0Ci0JCQkJCQkJCQkJCS5zdWJzdHJpbmcoCi0JCQkJCQkJCQkJCQkJU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyLAotCQkJCQkJCQkJCQkJCVNUQVRVU19QUkVGSVhfTEVOR1RIICsgMykpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJc3RhdHVzID0gLTE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGRlYnVnICYmIHN0YXR1cyAhPSAxKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19FWEVDX0NNRCwgc3RhdHVzPSIgKyBzdGF0dXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfUkVGT1JNQVRfTElOS1M6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAiU1RBVFVTX1JFRk9STUFUX0xJTktTIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJLy8gV29ya2Fyb3VuZCB0aGUgZHJhZyBhbmQgZHJvcCBpc3N1ZSB3aXRoIERCQ1MKLQkJCQkJCQkJLy8gY2hhcmFjdGVycy4KLQkJCQkJCQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQkJCQkJCQlzZXRUZXh0KGdldFRleHQoKSk7Ci0JCQkJCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXByb2Nlc3NpbmdKU0V2ZW50ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBzb3VyY2UgZm9yIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgSFRNTCBzb3VyY2UgZm9yIHRoZSBlZGl0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlRWRpdG9ySFRNTCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgZXNjYXBlZEJhc2VQYXRoID0gYmFzZVBhdGg7Ci0JCWlmIChlc2NhcGVkQmFzZVBhdGguc3RhcnRzV2l0aChGaWxlVXRpbC5VTkNfUEFUSF9QUkVGSVgpKQotCQkJZXNjYXBlZEJhc2VQYXRoID0gZXNjYXBlZEJhc2VQYXRoLnJlcGxhY2VGaXJzdCgKLQkJCQkJIl5cXFxcXFxcXCIsICJcXFxcXFxcXFxcXFxcXFxcIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllc2NhcGVkQmFzZVBhdGggPSBYTUxVdGlsCi0JCQkJLmVzY2FwZSgiZmlsZTovLyIgKyBlc2NhcGVkQmFzZVBhdGgucmVwbGFjZUFsbCgiJyIsICJcXFxcJyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJU3RyaW5nIGVzY2FwZWRSdGVVVEwgPSBydGVVUkwucmVwbGFjZUFsbCgiJmFwb3M7IiwgIiUyNyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlTdHJpbmdCdWZmZXIgcnRlWE1MID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlydGVYTUwuYXBwZW5kKCI8cnRlIGlkPVwiIikuYXBwZW5kKCJydGUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkuYXBwZW5kKCJcIiBjc3M9XCIiKS5hcHBlbmQoZXNjYXBlZFJ0ZVVUTCArICJydGUuY3NzIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLmFwcGVuZCgiXCIganM9XCIiKS5hcHBlbmQoZXNjYXBlZFJ0ZVVUTCArICJydGUuanMiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkuYXBwZW5kKCJcIiBiYXNlVVJMPVwiIikuYXBwZW5kKGVzY2FwZWRCYXNlUGF0aCkgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoIlwiLz4iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdXcml0ZXIgcmVzdWx0ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSgKLQkJCQlydGVGb2xkZXIgKyAicnRlLnhzbCIsIHJ0ZVhNTC50b1N0cmluZygpLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgY29udGV4dCBtZW51IHdpdGggbWVudSBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dE1lbnUKLQkgKiAgICAgICAgICAgIGEgY29udGV4dCBtZW51IGNvbnRhaW5pbmcgcmljaCB0ZXh0IGFjdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoTWVudSBjb250ZXh0TWVudSkgewotCQlmaW5hbCBNZW51SXRlbSBjdXRJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWN1dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jdXRBY3Rpb25fdGV4dCk7Ci0JCWN1dEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUN1dEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3V0QWN0aW9uKFJpY2hUZXh0LnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJY29weUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jb3B5QWN0aW9uX3RleHQpOwotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29weUFjdGlvbiBhY3Rpb24gPSBuZXcgQ29weUFjdGlvbihSaWNoVGV4dC50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlSXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZUFjdGlvbl90ZXh0KTsKLQkJcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oUmljaFRleHQudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlUGxhaW5UZXh0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZVBsYWluVGV4dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZVBsYWluVGV4dEFjdGlvbl90ZXh0KTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLnNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19QQVNURV9QTEFJTl9URVhUKTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZVBsYWluVGV4dEFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVQbGFpblRleHRBY3Rpb24oCi0JCQkJCQlSaWNoVGV4dC50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51SGlkZGVuKE1lbnVFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJCWdldFNlbGVjdGVkVGV4dCgpOwotCQkJCWN1dEl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSAmJiBoYXNTZWxlY3Rpb24pOwotCQkJCWNvcHlJdGVtLnNldEVuYWJsZWQoaGFzU2VsZWN0aW9uKTsKLQkJCQlwYXN0ZUl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJcGFzdGVQbGFpblRleHRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpc3RlbmVycyB0byBtYW5hZ2UgdGhlIGFjdGl2YXRpb24gYW5kIGZvY3VzIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWVkaXRvckNvbnRyb2wgPSBnZXRDb250cm9sU2l0ZShlZGl0b3IpOwotCQlpZiAoZWRpdG9yQ29udHJvbCAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCSJpbml0IiwgImVkaXRvckNvbnRyb2w9IiArIGVkaXRvckNvbnRyb2wuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCQotCQkJLy8gb25seSBJRSAod2luMzIpIGhhcyB0aGUgZWRpdG9yQ29udHJvbCAhPSBudWxsCi0JCQlpc0lFID0gdHJ1ZTsKLQkJCQotCQkJZWRpdG9yQ29udHJvbC5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJhY3RpdmF0ZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzZXRGb2N1cygpOwotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkFjdGl2YXRlLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvckNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJkZWFjdGl2YXRlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNldEJsdXIoKTsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5EZWFjdGl2YXRlLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvckNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkZvY3VzSW4sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJmb2N1c0luTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKCJ1cGRhdGVTZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAkJCQkJCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNJbiwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5LZXlVcCwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWludCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQkJCQkJaW50IHN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJImtleVVwTGlzdGVuZXIiLCAia2V5Q29kZT0iICsga2V5Q29kZSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkrICIsIHN0YXRlTWFzaz0iICsgc3RhdGVNYXNrICsgIiwgZWRpdGFibGU9IiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgPiAwCi0JCQkJCQkJfHwgKHN0YXRlTWFzayAmIFNXVC5BTFQpID4gMAotCQkJCQkJCXx8ICgoc3RhdGVNYXNrICYgU1dULlNISUZUKSA+IDAgJiYga2V5Q29kZSA9PSBzdGF0ZU1hc2spKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJCQlzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHsKLQkJCQkJCWNhc2UgU1dULkFSUk9XX0RPV046Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19MRUZUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfUklHSFQ6Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19VUDoKLQkJCQkJCWNhc2UgU1dULkVORDoKLQkJCQkJCWNhc2UgU1dULkhPTUU6Ci0JCQkJCQljYXNlIFNXVC5QQUdFX0RPV046Ci0JCQkJCQljYXNlIFNXVC5QQUdFX1VQOgotCQkJCQkJY2FzZSBTV1QuVEFCOgotCQkJCQkJCXJldHVybjsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3IuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gRGVhY3RpdmF0ZSB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQgcGFnZSBpbiByZWFkb25seQotCQkJCQkvLyBtb2RlLgotCQkJCQlldmVudC5kb2l0ID0gZWRpdGFibGU7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gZWxzZSB7Ci0JCQllZGl0b3IuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiYWN0aXZhdGVMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuVEFCKSB7Ci0JCQkJCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKSB7Ci0JCQkJCQkJZWRpdG9yLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGl0b3IudHJhdmVyc2UoU1dULlRSQVZFUlNFX1RBQl9ORVhUKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoIWVkaXRhYmxlKSB7Ci0JCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5DVFJMKSA+IDAKLQkJCQkJCQl8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuQUxUKSA+IDApCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWlmIChlZGl0YWJsZSkgewotCQkJCQkJc3dpdGNoIChlLmtleUNvZGUpIHsKLQkJCQkJCWNhc2UgU1dULkFSUk9XX0RPV046Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19MRUZUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfUklHSFQ6Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19VUDoKLQkJCQkJCWNhc2UgU1dULkVORDoKLQkJCQkJCWNhc2UgU1dULkhPTUU6Ci0JCQkJCQljYXNlIFNXVC5QQUdFX0RPV046Ci0JCQkJCQljYXNlIFNXVC5QQUdFX1VQOgotCQkJCQkJY2FzZSBTV1QuU0hJRlQ6Ci0JCQkJCQljYXNlIFNXVC5UQUI6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWVkaXRvci5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCXByaW50RGVidWdNZXNzYWdlKCJkaXNwb3NlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQotCQkJCX0KLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpc3RlbmVycyA9IG5ldyBIYXNodGFibGU8TGlzdGVuZXIsIFJpY2hUZXh0TGlzdGVuZXI+KCk7Ci0JCW1vZGlmeUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8TW9kaWZ5TGlzdGVuZXI+KCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHJpY2ggdGV4dCBldmVudCBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHR5cGUKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBTV1QgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoaW50IGV2ZW50VHlwZSwgRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG5vdGlmeWluZ01vZGlmeUxpc3RlbmVycykgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlldmVudC5kaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlldmVudC53aWRnZXQgPSBlZGl0b3I7Ci0KLQkJCWZvciAoSXRlcmF0b3I8UmljaFRleHRMaXN0ZW5lcj4gaSA9IGxpc3RlbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IGkubmV4dCgpOwotCQkJCWlmIChsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSA9PSBldmVudFR5cGUpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJIm5vdGlmeUxpc3RlbmVycyIsICJub3RpZnlpbmcgbGlzdGVuZXIsICIgKyBsaXN0ZW5lciArICIsIGV2ZW50VHlwZT0iICsgZXZlbnRUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCS8vJE5PTi1OTFMtMyQJCi0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuZ2V0TGlzdGVuZXIoKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCSJub3RpZnlMaXN0ZW5lcnMiLCAibm90aWZpZWQgbGlzdGVuZXIsICIgKyBsaXN0ZW5lciArICIsIGV2ZW50VHlwZT0iICsgZXZlbnRUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCS8vJE5PTi1OTFMtMyQJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbW9kaWZ5IGxpc3RlbmVycyB0aGF0IHRoZSByaWNoIHRleHQgZWRpdG9yIGNvbnRlbnQgaGFzCi0JICogY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCW5vdGlmeWluZ01vZGlmeUxpc3RlbmVycyA9IHRydWU7Ci0KLQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQuZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlldmVudC53aWRnZXQgPSBlZGl0b3I7Ci0KLQkJZm9yIChJdGVyYXRvcjxNb2RpZnlMaXN0ZW5lcj4gaSA9IG1vZGlmeUxpc3RlbmVycy5pdGVyYXRvcigpOyBpCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gaS5uZXh0KCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCSJub3RpZnlNb2RpZnlMaXN0ZW5lcnMiLCAibm90aWZ5aW5nIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCQl9Ci0JCQlsaXN0ZW5lci5tb2RpZnlUZXh0KG5ldyBNb2RpZnlFdmVudChldmVudCkpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkibm90aWZ5TW9kaWZ5TGlzdGVuZXJzIiwgIm5vdGlmaWVkIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCQl9Ci0JCX0KLQotCQlub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjY2hlY2tNb2RpZnkoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kaWZ5KCkgewotCQl0cnkgewotCQkJaWYgKCFjaGVja2luZ01vZGlmeUV2ZW50KSB7Ci0JCQkJY2hlY2tpbmdNb2RpZnlFdmVudCA9IHRydWU7Ci0JCQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICghaXNJRSAmJiBwcm9jZXNzaW5nSlNFdmVudCkgewotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWlmICghZ2V0VGV4dCgpLmVxdWFscyhpbml0aWFsVGV4dCkpIHsKLQkJCQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJCQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIWdldFRleHQoKS5lcXVhbHMoaW5pdGlhbFRleHQpKSB7Ci0JCQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiY2hlY2tNb2RpZnkiLCAibW9kaWZpZWQ9IiArIG1vZGlmaWVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWNoZWNraW5nTW9kaWZ5RXZlbnQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgZm9yIGEgc3ViIGNsYXNzIHRvIHRpZHkgdXAgdGhlIHJpY2ggdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgcmljaCB0ZXh0IGVuY29kZWQgaW4gSFRNTCBmb3JtYXQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpZHlUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIHRleHQgZm9yIGNvbnN1bXB0aW9uIGJ5IHRoZSBKYXZhU2NyaXB0L0RIVE1MIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgcmljaCB0ZXh0IGVuY29kZWQgaW4gSFRNTCBmb3JtYXQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB0ZXh0U2l6ZSA9IHRleHQubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dFNpemU7IGkrKykgewotCQkJY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnXHInOgotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHQnOgotCQkJCXJlc3VsdC5hcHBlbmQoJyAnKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQlyZXN1bHQuYXBwZW5kKEVOQ09ERURfTkVXTElORSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcJyc6Ci0JCQkJcmVzdWx0LmFwcGVuZChFTkNPREVEX1NJTkdMRV9RVU9URSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcXCc6Ci0JCQkJcmVzdWx0LmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCA8Y29kZT5PbGVDb250cm9sU2l0ZTwvY29kZT4gY29udGFpbmVkIHdpdGhpbiB0aGUKLQkgKiBnaXZlbiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QsIHByZXN1bWFibHkgYQotCSAqICAgICAgICAgICAgPGNvZGU+QnJvd3NlcjwvY29kZT4KLQkgKiBAcmV0dXJuIGFuIDxjb2RlPk9sZUNvbnRyb2xTaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXRDb250cm9sU2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlDb250cm9sW10gY29udHJvbHMgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgY29udHJvbENsYXNzID0gY29udHJvbHNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKGNvbnRyb2xDbGFzcy5lcXVhbHMoIm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLldlYlNpdGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBjb250cm9sc1tpXTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRyb2xzW2ldIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQkJCXJldHVybiBnZXRDb250cm9sU2l0ZSgoQ29tcG9zaXRlKSBjb250cm9sc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2csIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN0ckJ1Zi5hcHBlbmQoIlJpY2hUZXh0WyIpLmFwcGVuZChlZGl0b3IuaGFuZGxlKS5hcHBlbmQoJ10nKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZCgnLicpLmFwcGVuZChtZXRob2QpOwotCQlpZiAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCkgewotCQkJc3RyQnVmLmFwcGVuZCgiOiAiKS5hcHBlbmQobXNnKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHRleHQpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzdHJCdWYpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSB7Ci0JCXJldHVybiBmaW5kUmVwbGFjZUFjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaW5kUmVwbGFjZUFjdGlvbihGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbikgewotCQlpZiAoZmluZFJlcGxhY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmluZFJlcGxhY2VBY3Rpb24gIT0gbnVsbAotCQkJCQkmJiB0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IGZpbmRSZXBsYWNlQWN0aW9uKSB7Ci0JCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbi5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQl0aGlzLmZpbmRSZXBsYWNlQWN0aW9uID0gZmluZFJlcGxhY2VBY3Rpb247Ci0JCQl0aGlzLmZpbmRSZXBsYWNlQWN0aW9uLnNldFJpY2hUZXh0KHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0VGV4dCh0ZXh0KTsKLQkJaW5pdGlhbFRleHQgPSB0ZXh0ID09IG51bGwgPyAiIiA6IHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJbW9kaWZpZWQgPSBmYWxzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjlmN2ZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBlZGl0aW5nIGNvbW1hbmRzIHN1cHBvcnRlZCBieSB0aGUgZGVmYXVsdCByaWNoIHRleHQgY29udHJvbCBhbmQKLSAqIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dENvbW1hbmQgewotCi0JLyoqCi0JICogQWRkcyBhIEhUTUwgZnJhZ21lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0hUTUwgPSAiYWRkSFRNTCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvKioKLQkgKiBBZGRzIGFuIGltYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9JTUFHRSA9ICJhZGRJbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYSBob3Jpem9udGFsIGxpbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0xJTkUgPSAiYWRkTGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYSBsaW5rLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9MSU5LID0gImFkZExpbmsiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbnNlcnRzIHRleHQgb3ZlciB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX1RFWFQgPSAiaW5zZXJ0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYW4gb3JkZXJlZCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9PUkRFUkVEX0xJU1QgPSAiYWRkT3JkZXJlZExpc3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgdGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1RBQkxFID0gImFkZFRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhbiB1bm9yZGVyZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVU5PUkRFUkVEX0xJU1QgPSAiYWRkVW5vcmRlcmVkTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9DT0xPUiA9ICJiYWNrQ29sb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSAnYm9sZCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPTEQgPSAiYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENsZWFycyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQ09OVEVOVCA9ICJjbGVhckNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZID0gImNvcHkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDdXRzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VUID0gImN1dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gImRlbGV0ZVRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGaW5kcyB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkRfVEVYVCA9ICJmaW5kVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9URVhUID0gImdldFRleHQiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JHUk9VTkRfQ09MT1IgPSAiZm9yZUNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfQkxPQ0sgPSAiZm9ybWF0QmxvY2siOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9TRUxFQ1RFRF9URVhUID0gImdldFNlbGVjdGVkVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGVudHMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UID0gImluZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlICdpdGFsaWMnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2VudGVyIGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX0NFTlRFUiA9ICJqdXN0aWZ5Q2VudGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRnVsbHkganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVU1RJRllfRlVMTCA9ICJqdXN0aWZ5RnVsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExlZnQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVU1RJRllfTEVGVCA9ICJqdXN0aWZ5TGVmdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJpZ2h0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX1JJR0hUID0gImp1c3RpZnlSaWdodCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE91dGRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVERFTlQgPSAib3V0ZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBhc3RlcyB0ZXh0IGZyb20gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNURSA9ICJwYXN0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlcGxhY2VzIGFsbCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfQUxMX1RFWFQgPSAicmVwbGFjZUFsbFRleHQiOyAvLyROT04tTkxTLTEkCQkKLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfVEVYVCA9ICJyZXBsYWNlVGV4dCI7IC8vJE5PTi1OTFMtMSQJCQotCi0JLyoqCi0JICogUmVkb2VzIHRoZSBwcmV2aW91cyBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE8gPSAicmVkbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfRk9STUFUID0gInJlbW92ZUZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFID0gInNhdmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlcyBhbGwgZWRpdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQUxMID0gInNhdmVBbGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZWxlY3RzIGFsbCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9BTEwgPSAic2VsZWN0QWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfRk9OVF9OQU1FID0gInNldEZvbnROYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBzaXplIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfRk9OVF9TSVpFID0gInNldEZvbnRTaXplIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBzdHlsZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPTlRfU1RZTEUgPSAic2V0Rm9udFN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoZSBjb250ZW50IGNhbiBiZSBlZGl0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0VESVRBQkxFID0gInNldEVkaXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPQ1VTID0gInNldEZvY3VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVpZ2h0IG9mIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfSEVJR0hUID0gInNldEhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIEhUTUwgc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9URVhUID0gInNldFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSAnc3RyaWtlLXRocm91Z2gnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJS0VfVEhST1VHSCA9ICJzdHJpa2VUaHJvdWdoIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgc3Vic2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJTQ1JJUFQgPSAic3Vic2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgc3VwZXJzY3JpcHQgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSU0NSSVBUID0gInN1cGVyc2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5kZXJsaW5lIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVW5kb2VzIHRoZSBwcmV2aW91cyBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE8gPSAidW5kbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnZlcnRzIGEgbGluayB0byBub3JtYWwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxJTksgPSAidW5saW5rIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkYWU0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuUGFyYW1ldGVyaXplZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZVBsYWluVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlNXVEtleVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb242OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXJVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZlcmlmeUtleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklLZXlCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5rZXlzLklCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuUmVkb0FjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucy5VbmRvQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklSZWFkT25seURlcGVuZGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCBlZGl0b3IgaW1wbGVtZW50YXRpb24uCi0gKiA8cD4KLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCBlZGl0b3IgdXNlcyBYSFRNTCBhcyB0aGUgdW5kZXJseWluZyBtYXJrdXAgbGFuZ3VhZ2UgZm9yCi0gKiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuIEl0IGlzIGltcGxlbWVudGVkIHVzaW5nIGEgPGNvZGU+Vmlld0Zvcm08L2NvZGU+Ci0gKiBjb250cm9sIHdpdGggYSB0b29sIGJhciBhdCB0aGUgdG9wLCBhIHRhYiBmb2xkZXIgdGhhdCBjb250YWlucyBhCi0gKiA8Y29kZT5SaWNoVGV4dDwvY29kZT4gY29udHJvbCBmb3IgZW50ZXJpbmcgdGhlIHJpY2ggdGV4dCBjb250ZW50LCBhbmQgYSB0YWIKLSAqIGZvbGVyIHRoYXQgY29udGFpbnMgYSA8Y29kZT5TdHlsZVRleHQ8L2NvZGU+IGNvbnRyb2wgZm9yIHZpZXdpbmcgYW5kCi0gKiBtb2RpZnlpbmcgdGhlIFhIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByaWNoIHRleHQgY29udGVudC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0RWRpdG9yIGltcGxlbWVudHMgSVJpY2hUZXh0RWRpdG9yIHsKLQotCS8vIFRoZSBIVE1MIHRhYiBuYW1lLgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfVEFCX05BTUUgPSBSaWNoVGV4dFJlc291cmNlcy5odG1sVGFiX3RleHQ7Ci0KLQkvLyBJZiB0cnVlLCBsb2cgZGVidWdnaW5nIGluZm8uCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBsb2dnZXIuCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvLyBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyAoPGhyZWY+LCA8aW1nPiwgZXRjLikuCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlUGF0aDsKLQotCS8vIFRoZSBlZGl0b3IgZm9ybS4KLQlwcm90ZWN0ZWQgVmlld0Zvcm0gZm9ybTsKLQotCS8vIFRoZSBlZGl0b3IgdG9vbCBiYXIuCi0JcHJvdGVjdGVkIElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcjsKLQotCS8vIFRoZSBlZGl0b3IgY29udGVudC4KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRlbnQ7Ci0KLQkvLyBUaGUgZWRpdG9yIHRhYiBmb2xkZXIuCi0JcHJvdGVjdGVkIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotCi0JLy8gVGhlIHJpY2ggdGV4dCB0YWIKLQlwcm90ZWN0ZWQgQ1RhYkl0ZW0gcmljaFRleHRUYWI7Ci0KLQkvLyBUaGUgSFRNTCBzb3VyY2UgdGFiCi0JcHJvdGVjdGVkIENUYWJJdGVtIGh0bWxUYWI7Ci0KLQkvLyBUaGUgZW1iZWRkZWQgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJvdGVjdGVkIElSaWNoVGV4dCByaWNoVGV4dDsKLQotCS8vIFRoZSB1bmRlcmx5aW5nIEhUTUwgdGV4dCBlZGl0b3IuCi0JcHJvdGVjdGVkIFRleHRWaWV3ZXIgc291cmNlVmlld2VyOwotCQotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3VycmVudERvYzsKLQkKLQkvLyBEcm9wIHN1cHBvcnQKLQlwcm90ZWN0ZWQgRHJvcFRhcmdldCBzb3VyY2VFZGl0RHJvcFRhcmdldDsKLQotCS8vIEhUTUwgZWRpdG9yJ3MgY29udGV4dCBtZW51Ci0JcHJvdGVjdGVkIE1lbnUgY29udGV4dE1lbnU7Ci0KLQkvLyBIYXMgdGhlIEhUTUwgc291cmNlIGJlZW4gbW9kaWZpZWQ/Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc291cmNlTW9kaWZpZWQgPSBmYWxzZTsKLQotCS8vIFRoZSBlZGl0b3IncyBlZGl0YWJsZSBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlID0gdHJ1ZTsKLQkKLQlwcml2YXRlIE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyIHVuZG9BY3Rpb247Ci0JCi0JcHJpdmF0ZSBPcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlciByZWRvQWN0aW9uOwotCQotCXByaXZhdGUgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZTsKLQotCS8qKiBUaGUgYWN0aW9ucyByZWdpc3RlcmVkIHdpdGggdGhlIGVkaXRvci4gKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsIElBY3Rpb24+IGZBY3Rpb25zPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElBY3Rpb24+KDEwKTsKLQkKLQkvKiogVGhlIHZlcmlmeSBrZXkgbGlzdGVuZXIgZm9yIGFjdGl2YXRpb24gY29kZSB0cmlnZ2VyaW5nLiAqLwotCXByaXZhdGUgQWN0aXZhdGlvbkNvZGVUcmlnZ2VyIGZBY3RpdmF0aW9uQ29kZVRyaWdnZXI9IG5ldyBBY3RpdmF0aW9uQ29kZVRyaWdnZXIoKTsKLQkKLQkvKiogVGhlIGVkaXRvcidzIGFjdGlvbiBhY3RpdmF0aW9uIGNvZGVzLiAqLwotCXByaXZhdGUgTGlzdCBmQWN0aXZhdGlvbkNvZGVzPSBuZXcgQXJyYXlMaXN0KDIpOwotCQotCWZpbmFsIElVbmRvTWFuYWdlciB1bmRvTWFuYWdlcj0gbmV3IFRleHRWaWV3ZXJVbmRvTWFuYWdlcigxMCk7Ci0JCi0JLyoqCi0JICogVGhlIGtleSBiaW5kaW5nIHNjb3BlcyBvZiB0aGlzIGVkaXRvci4KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmS2V5QmluZGluZ1Njb3BlczsKLQotCQotCXByb3RlY3RlZCBJRG9jdW1lbnRMaXN0ZW5lciBzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcj0gbmV3IElEb2N1bWVudExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlzb3VyY2VNb2RpZmllZCA9IHRydWU7Ci0JCQlpZiAocmljaFRleHQgIT0gbnVsbCAmJiByaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0KSB7Ci0JCQkJcmljaFRleHQubm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0KLQkvLyBUaGUgZGVhY3RpdmF0ZSBsaXN0ZW5lciBmb3IgdGhlIHNvdXJjZUVkaXQgY29udHJvbC4KLQlwcm90ZWN0ZWQgTGlzdGVuZXIgc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChzb3VyY2VNb2RpZmllZCkgewotCQkJCXVwZGF0ZVJpY2hUZXh0KHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpKTsKLQkJCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfTsKLQotCS8vIFRoZSBrZXkgbGlzdGVuZXIgZm9yIHRoZSBzb3VyY2VFZGl0IGNvbnRyb2wuCi0JcHJvdGVjdGVkIEtleUxpc3RlbmVyIHNvdXJjZUVkaXRLZXlMaXN0ZW5lciA9IG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWRhcHRlcigKLQkJCQkJSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElCaW5kaW5nU2VydmljZSkgewotCQkJCWludCBhY2NlbCA9IFNXVEtleVN1cHBvcnQKLQkJCQkJCS5jb252ZXJ0RXZlbnRUb1VubW9kaWZpZWRBY2NlbGVyYXRvcihlKTsKLQkJCQlLZXlTdHJva2Ugc3Ryb2tlID0gU1dUS2V5U3VwcG9ydAotCQkJCQkJLmNvbnZlcnRBY2NlbGVyYXRvclRvS2V5U3Ryb2tlKGFjY2VsKTsKLQkJCQlLZXlTZXF1ZW5jZSBzZXEgPSBLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZShzdHJva2UpOwotCQkJCUJpbmRpbmcgYmluZCA9ICgoSUJpbmRpbmdTZXJ2aWNlKSBhZGFwdGVyKS5nZXRQZXJmZWN0TWF0Y2goc2VxKTsKLQkJCQlpZiAoYmluZCAhPSBudWxsKSB7Ci0JCQkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQgPSBiaW5kCi0JCQkJCQkJLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7Ci0JCQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBjbWRJZCA9IGNvbW1hbmQuZ2V0SWQoKTsKLQkJCQkJCWlmIChjbWRJZCAhPSBudWxsCi0JCQkJCQkJCSYmIGNtZElkCi0JCQkJCQkJCQkJLmVxdWFscygib3JnLmVjbGlwc2UudWkuZWRpdC5maW5kUmVwbGFjZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRvciBzdHlsZQotCSAqLwotCXB1YmxpYyBSaWNoVGV4dEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElFZGl0b3JTaXRlIGVkaXRvclNpdGUpIHsKLQkJdGhpcyhwYXJlbnQsIHN0eWxlLCBlZGl0b3JTaXRlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgZWRpdG9yIHN0eWxlCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcwotCSAqLwotCXB1YmxpYyBSaWNoVGV4dEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElFZGl0b3JTaXRlIGVkaXRvclNpdGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQl0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7Ci0JCXRoaXMuZWRpdG9yU2l0ZSA9IGVkaXRvclNpdGU7Ci0JCWRlYnVnID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCWxvZ2dlciA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQkJaW5pdChwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRvciBzdHlsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXRyeSB7Ci0JCQlmb3JtID0gbmV3IFZpZXdGb3JtKHBhcmVudCwgc3R5bGUpOwotCQkJZm9ybS5tYXJnaW5IZWlnaHQgPSAwOwotCQkJZm9ybS5tYXJnaW5XaWR0aCA9IDA7Ci0KLQkJCXRvb2xCYXIgPSBuZXcgUmljaFRleHRUb29sQmFyKGZvcm0sIFNXVC5GTEFULCB0aGlzKTsKLQotCQkJY29udGVudCA9IG5ldyBDb21wb3NpdGUoZm9ybSwgU1dULkZMQVQpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJdGFiRm9sZGVyID0gY3JlYXRlRWRpdG9yVGFiRm9sZGVyKGNvbnRlbnQsIHN0eWxlKTsKLQotCQkJZm9ybS5zZXRUb3BDZW50ZXIoKChSaWNoVGV4dFRvb2xCYXIpdG9vbEJhcikuZ2V0VG9vbGJhck1ncigpLmdldENvbnRyb2woKSk7Ci0JCQlmb3JtLnNldFRvcExlZnQoKChSaWNoVGV4dFRvb2xCYXIpdG9vbEJhcikuZ2V0VG9vbGJhck1nckNvbWJvKCkuZ2V0Q29udHJvbCgpKTsKLQkJCWZvcm0uc2V0Q29udGVudChjb250ZW50KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm0gY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb3JtIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZm9ybTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWNoIHRleHQgY29udHJvbCBlbWJlZGRlZCB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIElSaWNoVGV4dCBnZXRSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiByaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0RGF0YQotCSAqICAgICAgICAgICAgdGhlIGxheW91dCBkYXRhIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpIHsKLQkJaWYgKGZvcm0gIT0gbnVsbCkgewotCQkJZm9ybS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHJldHVybiB0aGUgZWRpdG9yJ3MgbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExheW91dERhdGEoKSB7Ci0JCWlmIChmb3JtICE9IG51bGwpIHsKLQkJCXJldHVybiBmb3JtLmdldExheW91dERhdGEoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGZvY3VzIHRvIHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCQlzZXRTZWxlY3Rpb24oMCk7Ci0JCWlmICh0b29sQmFyICE9IG51bGwgJiYgdGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCXRvb2xCYXIudXBkYXRlVG9vbEJhcihlZGl0YWJsZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRlbGxzIHRoZSBjb250cm9sIGl0IGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qmx1cigpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEJsdXIoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGVkaXRvciBoYXMgZm9jdXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVkaXRvciBoYXMgdGhlIHVzZXItaW50ZXJmYWNlIGZvY3VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuaGFzRm9jdXMoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgUmljaCBUZXh0IG9yIEhUTUwgdGFiLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgPGNvZGU+MDwvY29kZT4gZm9yIHRoZSBSaWNoIFRleHQgdGFiLCA8Y29kZT4xPC9jb2RlPiBmb3IKLQkgKiAgICAgICAgICAgIHRoZSBIVE1MIHRhYi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IGluZGV4KSB7Ci0JCWlmICh0YWJGb2xkZXIgIT0gbnVsbCkgewotCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIHRleHQgYW5kIGltYWdlIGxpbmtzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3Mgc3BlY2lmaWVkIHdpdGggPGhyZWY+LAotCSAqICAgICAgICAgPGltZz4sIGV0Yy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VQYXRoKCkgewotCQlyZXR1cm4gYmFzZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QKLQkgKiBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIFVSTCBvZiBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFVSTCBnZXRDb3B5VVJMKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldENvcHlVUkwoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdCBjb3BpZWQKLQkgKiB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlVUkwoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRDb3B5VVJMKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGNhbiBiZSBlZGl0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGVkaXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRhYmxlIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQl0aGlzLmVkaXRhYmxlID0gZWRpdGFibGU7Ci0JCWlmICh0b29sQmFyICE9IG51bGwgJiYgdGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCXRvb2xCYXIudXBkYXRlVG9vbEJhcihlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCXNvdXJjZVZpZXdlci5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kaWZpZWQoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZ2V0TW9kaWZpZWQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kaWZpZWQgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZWQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZChib29sZWFuIG1vZGlmaWVkKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRNb2RpZmllZChtb2RpZmllZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gWEhUTUwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChzb3VyY2VNb2RpZmllZCkgewotCQkJc2V0VGV4dChnZXRTb3VyY2VFZGl0KCkuZ2V0VGV4dCgpKTsKLQkJCXNldE1vZGlmaWVkKHRydWUpOwotCQkJc291cmNlTW9kaWZpZWQgPSBmYWxzZTsKLQkJfQotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHJpY2ggdGV4dCBjb250ZW50IGluIFhIVE1MIGZvcm1hdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldFRleHQodGV4dCk7Ci0JCX0KLQkJc291cmNlTW9kaWZpZWQgPSBmYWxzZTsKLQkJaWYgKHRhYkZvbGRlciAhPSBudWxsKSB7Ci0JCQlpZiAodG9vbEJhciAhPSBudWxsKSB7Ci0JCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCX0KLQkJCWlmIChnZXRTb3VyY2VFZGl0KCkgIT0gbnVsbCkgewotCQkJCXJlbW92ZU1vZGlmeUxpc3RlbmVycygpOwotCQkJCWN1cnJlbnREb2Muc2V0KHRleHQpOwotCQkJCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1vZGlmeUxpc3RlbmVycygpIHsKLQkJaWYgKGN1cnJlbnREb2MgIT0gbnVsbCkgewotCQkJY3VycmVudERvYy5hZGREb2N1bWVudExpc3RlbmVyKHNvdXJjZUVkaXREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVycygpIHsKLQkJaWYgKGN1cnJlbnREb2MgIT0gbnVsbCkgewotCQkJY3VycmVudERvYy5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHNvdXJjZUVkaXREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dCNjaGVja01vZGlmeSgpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RpZnkoKSB7Ci0JCXJpY2hUZXh0LmNoZWNrTW9kaWZ5KCk7Ci0JCWlmIChzb3VyY2VNb2RpZmllZCkgewotCQkJbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlwcmludERlYnVnTWVzc2FnZSgiY2hlY2tNb2RpZnkiLCAibW9kaWZpZWQ9IiArIHNvdXJjZU1vZGlmaWVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJpY2ggdGV4dCBjb250ZW50IGJhY2sgdG8gdGhlIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVRleHQoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZXN0b3JlVGV4dCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0I2dldFNlbGVjdGVkKCkKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0ZWQoKSB7Ci0JCWlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gaHRtbFRhYikgewotCQkJU3RyaW5nIEhUTUxzb3VyY2UgPSBnZXRTb3VyY2VFZGl0KCkuZ2V0VGV4dCgpOwotCQkJUG9pbnQgc2VsID0gc291cmNlVmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCWludCBzZWxTdGFydEluZGV4ID0gc2VsLng7Ci0JCQlpbnQgc2VsRW5kSW5kZXggPSBzZWwueCArIHNlbC55IC0gMTsKLQkJCXJpY2hUZXh0LmdldFNlbGVjdGVkKCkuY2xlYXIoKTsKLQkJCXJpY2hUZXh0LmdldFNlbGVjdGVkKCkuc2V0VGV4dChIVE1Mc291cmNlLnN1YnN0cmluZyhzZWxTdGFydEluZGV4LCBzZWxFbmRJbmRleCArIDEpKTsKLQkJfQotCQlyZXR1cm4gcmljaFRleHQuZ2V0U2VsZWN0ZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMgbm90Ci0JICogICAgICAgICBiZWVuIHNldAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShTdHJpbmcga2V5KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5nZXREYXRhKGtleSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXREYXRhKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kLiBUaGUgc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUKLQkgKiBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW0JCWEgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIHBhcmFtKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW1zCQlhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIHBhcmFtcykgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIHBhcmFtcyk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY29udGV4dE1lbnUgIT0gbnVsbCAmJiAhY29udGV4dE1lbnUuaXNEaXNwb3NlZCgpKSB7Ci0JCQljb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCQljb250ZXh0TWVudSA9IG51bGw7Ci0JCX0KLQkJaWYgKHNvdXJjZUVkaXREcm9wVGFyZ2V0ICE9IG51bGwpIHsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0ID0gbnVsbDsKLQkJfQotCQlpZiAoZkFjdGl2YXRpb25Db2RlVHJpZ2dlciAhPSBudWxsKSB7Ci0JCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyLnVuaW5zdGFsbCgpOwotCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlcj0gbnVsbDsKLQkJfQotCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldFNvdXJjZUVkaXQoKSAhPSBudWxsKSB7Ci0JCQlnZXRTb3VyY2VFZGl0KCkucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCXNvdXJjZUVkaXREZWFjdGl2YXRlTGlzdGVuZXIpOwotCQkJZ2V0U291cmNlRWRpdCgpLnJlbW92ZUtleUxpc3RlbmVyKHNvdXJjZUVkaXRLZXlMaXN0ZW5lcik7Ci0JCQlzb3VyY2VFZGl0RGVhY3RpdmF0ZUxpc3RlbmVyID0gbnVsbDsKLQkJCXNvdXJjZUVkaXRLZXlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJc291cmNlVmlld2VyPSBudWxsOwotCQl9Ci0KLQkJaWYgKGZBY3Rpb25zICE9IG51bGwpIHsKLQkJCWZBY3Rpb25zLmNsZWFyKCk7Ci0JCQlmQWN0aW9ucz0gbnVsbDsKLQkJfQotCQlpZiAoZkFjdGl2YXRpb25Db2RlcyAhPSBudWxsKSB7Ci0JCQlmQWN0aXZhdGlvbkNvZGVzLmNsZWFyKCk7Ci0JCQlmQWN0aXZhdGlvbkNvZGVzPSBudWxsOwotCQl9Ci0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmRpc3Bvc2UoKTsKLQkJCXJpY2hUZXh0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udHJvbCBoYXMgYmVlbiBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZCBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmlzRGlzcG9zZWQoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZnkgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIG1vZGlmeSBsaXN0ZW5lcnMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8TW9kaWZ5TGlzdGVuZXI+IGdldE1vZGlmeUxpc3RlbmVycygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldE1vZGlmeUxpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiB0aGUgY29udGVudCBvZiB0aGlzIGVkaXRvciBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgY29udGVudCBvZiB0aGlzIGVkaXRvciBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiB0aGlzIGVkaXRvciBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5hZGREaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGlzIGVkaXRvciBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIGFuIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlIG9jY3VycyB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudCBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkCi0JICogd2hlbiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50Ci0JICogICAgICAgICAgICBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxSaWNoVGV4dExpc3RlbmVyPiBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmljaCB0ZXh0IGVkaXRvciBjb250ZW50IGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50LmRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCWV2ZW50LndpZGdldCA9IHJpY2hUZXh0LmdldENvbnRyb2woKTsKLQotCQkJZm9yIChJdGVyYXRvcjxNb2RpZnlMaXN0ZW5lcj4gaSA9IGdldE1vZGlmeUxpc3RlbmVycygpOyBpICE9IG51bGwgJiYgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBpLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5tb2RpZnlUZXh0KG5ldyBNb2RpZnlFdmVudChldmVudCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIHRvb2wgYmFyIHdpdGggYWN0aW9uIGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSB0b29sQmFyCi0JICogICAgICAgICAgICBhIHRvb2wgYmFyIGNvbnRhaW4gcmljaCB0ZXh0IGFjdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG9vbEJhcihJUmljaFRleHRUb29sQmFyIHRvb2xCYXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB1bmRlcmx5aW5nIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MKLQkgKi8KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsCi0JCQlTdHJpbmcgYmFzZVBhdGgpIHsKLQkJcmV0dXJuIG5ldyBSaWNoVGV4dChwYXJlbnQsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdG9yIHRhYiBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIG5ldyBlZGl0b3IgdG9vbGJhcgotCSAqLwotCXByb3RlY3RlZCBDVGFiRm9sZGVyIGNyZWF0ZUVkaXRvclRhYkZvbGRlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJQ1RhYkZvbGRlciBmb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihwYXJlbnQsIFNXVC5GTEFUIHwgU1dULkJPVFRPTSk7Ci0JCWZvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJQ29tcG9zaXRlIHJpY2hUZXh0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmb2xkZXIsIFNXVC5GTEFUKTsKLQkJR3JpZExheW91dCByaWNoVGV4dENvbXBvc2l0ZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJcmljaFRleHRDb21wb3NpdGVMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcmljaFRleHRDb21wb3NpdGVMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlyaWNoVGV4dENvbXBvc2l0ZS5zZXRMYXlvdXQocmljaFRleHRDb21wb3NpdGVMYXlvdXQpOwotCQlyaWNoVGV4dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlyaWNoVGV4dCA9IGNyZWF0ZVJpY2hUZXh0Q29udHJvbChyaWNoVGV4dENvbXBvc2l0ZSwgc3R5bGUsIGJhc2VQYXRoKTsKLQkJcmljaFRleHQuc2V0RGF0YShQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJcmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5zZXRSaWNoVGV4dCh0aGlzKTsKLQotCQlyaWNoVGV4dFRhYiA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5GTEFUKTsKLQkJcmljaFRleHRUYWIuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5yaWNoVGV4dFRhYl90ZXh0KTsKLQkJcmljaFRleHRUYWIuc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMucmljaFRleHRUYWJfdG9vbFRpcFRleHQpOwotCQlyaWNoVGV4dFRhYi5zZXRDb250cm9sKHJpY2hUZXh0Q29tcG9zaXRlKTsKLQotCQlDb21wb3NpdGUgaHRtbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZm9sZGVyLCBTV1QuRkxBVCk7Ci0JCWh0bWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JCXNvdXJjZVZpZXdlciA9IG5ldyBUZXh0Vmlld2VyKGh0bWxDb21wb3NpdGUsIFNXVC5GTEFUIHwgU1dULk1VTFRJCi0JCQkJfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNvdXJjZVZpZXdlci5zZXRVbmRvTWFuYWdlcih1bmRvTWFuYWdlcik7Ci0JCXNldERvY3VtZW50KG51bGwpOwotCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJZ2V0U291cmNlRWRpdCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBzb3VyY2VFZGl0RGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJZ2V0U291cmNlRWRpdCgpLmFkZEtleUxpc3RlbmVyKHNvdXJjZUVkaXRLZXlMaXN0ZW5lcik7Ci0JCWNvbnRleHRNZW51ID0gbmV3IE1lbnUocGFyZW50LmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotCQlnZXRTb3VyY2VFZGl0KCkuc2V0TWVudShjb250ZXh0TWVudSk7Ci0JCS8vIEZJWE1FISBUaGlzIG9wZW5zIHVwIGEgY2FuIG9mIHdvcm1zLCBlc3BlY2lhbGx5IHdpdGggREJDUyBjaGFyYWN0ZXJzLgotCQkvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTQzMi4gCi0JCS8vYWRkRHJvcFN1cHBvcnRUb1N0eWxlZFRleHQoKTsKLQkJZmlsbENvbnRleHRNZW51KGNvbnRleHRNZW51KTsKLQkJCi0JCQotCQlodG1sVGFiID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlodG1sVGFiLnNldFRleHQoSFRNTF9UQUJfTkFNRSk7Ci0JCWh0bWxUYWIuc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuaHRtbFRhYl90b29sVGlwVGV4dCk7IAotCQlodG1sVGFiLnNldENvbnRyb2woaHRtbENvbXBvc2l0ZSk7Ci0KLQkJZm9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDVGFiSXRlbSBpdGVtID0gKENUYWJJdGVtKSBldmVudC5pdGVtOwotCQkJCWlmIChpdGVtLmdldFRleHQoKS5lcXVhbHMoSFRNTF9UQUJfTkFNRSkpIHsKLQkJCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQkJCWN1cnJlbnREb2Muc2V0KGdldFRleHQoKSk7Ci0JCQkJCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCQkJCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQkJCQlpZiAodG9vbEJhciAhPSBudWxsKSB7Ci0JCQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXBkYXRlUmljaFRleHQoZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKSk7Ci0JCQkJCXNldE1vZGlmaWVkKHRydWUpOwotCQkJCQlpZiAodG9vbEJhciAhPSBudWxsKSB7Ci0JCQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZmlsbFRvb2xCYXIodG9vbEJhcik7Ci0JCQotCQlpbml0aWFsaXplQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKCk7Ci0JCWNyZWF0ZUFjdGlvbnMoKTsKLQkJCi0JCWZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0KLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCWRvYyA9IG5ldyBEb2N1bWVudCgpOwotCQl9Ci0JCS8vIGNsZWFuIHVwIG9sZCBkb2MKLQkJdW5kb01hbmFnZXIuZGlzY29ubmVjdCgpOwotCQlJRG9jdW1lbnQgb2xkRG9jID0gc291cmNlVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWlmIChvbGREb2MgIT0gbnVsbCkgewotCQkJb2xkRG9jLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoc291cmNlRWRpdERvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gaG9vayB1cCBuZXcgZG9jCi0JCWN1cnJlbnREb2MgPSBkb2M7Ci0JCXNvdXJjZVZpZXdlci5zZXREb2N1bWVudChjdXJyZW50RG9jKTsKLQkJY3VycmVudERvYy5hZGREb2N1bWVudExpc3RlbmVyKHNvdXJjZUVkaXREb2N1bWVudExpc3RlbmVyKTsKLQkJdW5kb01hbmFnZXIuY29ubmVjdChzb3VyY2VWaWV3ZXIpOwotCQlpZiAodW5kb0FjdGlvbiAhPSBudWxsKSB7Ci0JCQl1bmRvQWN0aW9uLnNldENvbnRleHQoZ2V0VW5kb0NvbnRleHQoKSk7Ci0JCX0KLQkJaWYgKHJlZG9BY3Rpb24gIT0gbnVsbCkgewotCQkJcmVkb0FjdGlvbi5zZXRDb250ZXh0KGdldFVuZG9Db250ZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgc291cmNlIGVkaXQgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+U3R5bGVUZXh0PC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIFN0eWxlZFRleHQgZ2V0U291cmNlRWRpdCgpIHsKLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIHRleHQgYXQgdGhlIHNlbGVjdGlvbiAob3ZlcndyaXRpbmcgdGhlIHNlbGVjdGlvbikuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSFRNTChTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgCi0JCQlyZXR1cm47Ci0JCWlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gcmljaFRleHRUYWIpIHsKLQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfSFRNTCwgdGV4dCk7Ci0JCX0gZWxzZSBpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IGh0bWxUYWIpIHsKLQkJCVN0cmluZyBvbGRIVE1MID0gZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKTsKLQkJCVBvaW50IHNlbCA9IHNvdXJjZVZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpbnQgc2VsU3RhcnRJbmRleCA9IHNlbC54OwotCQkJaW50IHNlbEVuZEluZGV4ID0gc2VsLnggKyBzZWwueSAtIDE7Ci0JCQlTdHJpbmcgbmV3SFRNTCA9IG9sZEhUTUwuc3Vic3RyaW5nKDAsIHNlbFN0YXJ0SW5kZXgpICsgdGV4dAotCQkJCQkrIG9sZEhUTUwuc3Vic3RyaW5nKHNlbEVuZEluZGV4ICsgMSk7Ci0JCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCWN1cnJlbnREb2Muc2V0KG5ld0hUTUwpOwotCQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQl1cGRhdGVSaWNoVGV4dChuZXdIVE1MKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEluc2VydHMgYW4gaW1hZ2UgYXQgdGhlIHNlbGVjdGlvbiAob3ZlcndyaXRpbmcgdGhlIHNlbGVjdGlvbikuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW1hZ2UoU3RyaW5nIGltYWdlVVJMLCBTdHJpbmcgaGVpZ2h0LCBTdHJpbmcgd2lkdGgsIFN0cmluZyBhbHRUYWcpIHsKLQkJaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSByaWNoVGV4dFRhYikgewotCQkJZXhlY3V0ZUNvbW1hbmQoCi0JCQkJCVJpY2hUZXh0Q29tbWFuZC5BRERfSU1BR0UsCi0JCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJaW1hZ2VVUkwsCi0JCQkJCQkJaGVpZ2h0LCB3aWR0aCwgYWx0VGFnIH0pOwotCQl9IGVsc2UgaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSBodG1sVGFiKSB7Ci0JCQlTdHJpbmdCdWZmZXIgaW1hZ2VMaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJLy8gb3JkZXIgb2YgdGhlc2UgYXR0cmlidXRlcyBpcyB0aGUgc2FtZSBhcyBKVGlkeSdlZCBIVE1MCi0JCQlpbWFnZUxpbmsuYXBwZW5kKCI8aW1nIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChoZWlnaHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIGhlaWdodD1cIiIgKyBoZWlnaHQgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlpZiAoYWx0VGFnLmxlbmd0aCgpID4gMCkgewotCQkJCWltYWdlTGluay5hcHBlbmQoIiBhbHQ9XCIiICsgYWx0VGFnICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIHNyYz1cIiIgKyBpbWFnZVVSTCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmICh3aWR0aC5sZW5ndGgoKSA+IDApIHsKLQkJCQlpbWFnZUxpbmsuYXBwZW5kKCIgd2lkdGg9XCIiICsgd2lkdGggKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlpbWFnZUxpbmsuYXBwZW5kKCIgLz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG9sZEhUTUwgPSBnZXRTb3VyY2VFZGl0KCkuZ2V0VGV4dCgpOwotCQkJUG9pbnQgc2VsID0gc291cmNlVmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCWludCBzZWxTdGFydEluZGV4ID0gc2VsLng7Ci0JCQlpbnQgc2VsRW5kSW5kZXggPSBzZWwueCArIHNlbC55IC0gMTsKLQkJCVN0cmluZyBuZXdIVE1MID0gb2xkSFRNTC5zdWJzdHJpbmcoMCwgc2VsU3RhcnRJbmRleCkgKyBpbWFnZUxpbmsudG9TdHJpbmcoKQotCQkJCQkrIG9sZEhUTUwuc3Vic3RyaW5nKHNlbEVuZEluZGV4ICsgMSk7Ci0JCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCWN1cnJlbnREb2Muc2V0KG5ld0hUTUwpOwotCQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQl1cGRhdGVSaWNoVGV4dChuZXdIVE1MKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBIVE1MIHRhYiBpcyBzZWxlY3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBIVE1MIHRhYiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hUTUxUYWJTZWxlY3RlZCgpIHsKLQkJcmV0dXJuICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gaHRtbFRhYik7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIGNvbnRleHQgbWVudSB3aXRoIG1lbnUgaXRlbXMuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRNZW51Ci0JICogICAgICAgICAgICBhIGNvbnRleHQgbWVudSBjb250YWluaW5nIHJpY2ggdGV4dCBhY3Rpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KE1lbnUgY29udGV4dE1lbnUpIHsKLQkJZmluYWwgTWVudUl0ZW0gY3V0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQljdXRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY3V0QWN0aW9uX3RleHQpOwotCQljdXRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDdXRBY3Rpb24gYWN0aW9uID0gbmV3IEN1dEFjdGlvbihSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWNvcHlJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29weUFjdGlvbl90ZXh0KTsgCi0JCWNvcHlJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb3B5QWN0aW9uIGFjdGlvbiA9IG5ldyBDb3B5QWN0aW9uKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudUl0ZW0gcGFzdGVJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCXBhc3RlSXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnBhc3RlQWN0aW9uX3RleHQpOyAKLQkJcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZmluYWwgTWVudUl0ZW0gcGFzdGVQbGFpblRleHRJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnBhc3RlUGxhaW5UZXh0QWN0aW9uX3RleHQpOwotCQlwYXN0ZVBsYWluVGV4dEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVBhc3RlUGxhaW5UZXh0QWN0aW9uIGFjdGlvbiA9IG5ldyBQYXN0ZVBsYWluVGV4dEFjdGlvbihSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51SGlkZGVuKE1lbnVFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJCVN0cmluZyBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZCgpLmdldFRleHQoKTsKLQkJCQlib29sZWFuIHNlbGVjdGlvbiA9IHNlbGVjdGVkVGV4dC5sZW5ndGgoKSA+IDA7Ci0JCQkJY3V0SXRlbS5zZXRFbmFibGVkKGVkaXRhYmxlICYmIHNlbGVjdGlvbik7Ci0JCQkJY29weUl0ZW0uc2V0RW5hYmxlZChzZWxlY3Rpb24pOwotCQkJCXBhc3RlSXRlbS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQlwYXN0ZVBsYWluVGV4dEl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdpdGhvdXQgdXBkYXRpbmcgdGhlIEhUTUwKLQkgKiBzb3VyY2UgZWRpdG9yLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIEhUTUwgc291cmNlIGVkaXRvciB0byBzeW5jIHVwIGl0cwotCSAqIGNvbnRlbnQgd2l0aCB0aGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgY29udGVudCBpbiBYSFRNTCBmb3JtYXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUmljaFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldFRleHQodGV4dCk7Ci0JCQlyaWNoVGV4dC5jaGVja01vZGlmeSgpOwotCQl9Ci0JCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCWlmICh0YWJGb2xkZXIgIT0gbnVsbCkgewotCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCXRvb2xCYXIudXBkYXRlVG9vbEJhcihlZGl0YWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZERyb3BTdXBwb3J0VG9TdHlsZWRUZXh0KCkgewotCQkvLyB0aGlzIGZ1bmN0aW9uIGJhc2VkIGhlYXZpbHkgb24gdGhlIGV4YW1wbGUgYXQ6Ci0JCS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1TV1QtRE5EL0RORC1pbi1TV1QuaHRtbAotCQkKLQkJIAkvLyBBbGxvdyBkYXRhIHRvIGJlIGNvcGllZCB0byB0aGUgZHJvcCB0YXJnZXQKLQkJCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8ICBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfREVGQVVMVDsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoZ2V0U291cmNlRWRpdCgpLCBvcGVyYXRpb25zKTsKLQkJIAotCQkJLy8gUmVjZWl2ZSBkYXRhIGluIFRleHQgb3IgSFRNTCBmb3JtYXQKLQkJCWZpbmFsIFRleHRUcmFuc2ZlciB0ZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWZpbmFsIEhUTUxUcmFuc2ZlciBodG1sVHJhbnNmZXIgPSBIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7aHRtbFRyYW5zZmVyLCB0ZXh0VHJhbnNmZXJ9OwotCQkJc291cmNlRWRpdERyb3BUYXJnZXQuc2V0VHJhbnNmZXIodHlwZXMpOwotCQkJIAotCQkJc291cmNlRWRpdERyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCQkgIHB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkgICAgICAgICBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkgICAgICAgICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCSAgICAgICAgIH0gZWxzZSB7Ci0JCQkgICAgICAgICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCSAgICAgICAgIH0KLQkJCSAgICAgfQotCQkJICAgICBpZiAoIWdldEVkaXRhYmxlKCkpIHsKLQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkgICAgIH0KLQkJCSAgICAgLy8gd2lsbCBhY2NlcHQgdGV4dCBidXQgcHJlZmVyIHRvIGhhdmUgSFRNTCBkcm9wcGVkCi0JCQkgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkgICAgICAgICBpZiAoaHRtbFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbaV0pKXsKLQkJCSAgICAgICAgICAgICBldmVudC5jdXJyZW50RGF0YVR5cGUgPSBldmVudC5kYXRhVHlwZXNbaV07Ci0JCQkgICAgICAgICAgICAgYnJlYWs7Ci0JCQkgICAgICAgICB9Ci0JCQkgICAgIH0KLQkJCSAgIH0KLQkJCSAgIHB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1QgfCBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkgICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJICAgICAgICAgICAgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkgICAgICAgICAgICB9IGVsc2UgewotCQkJICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkgICAgICAgICAgICB9Ci0JCQkgICAgICAgIH0KLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgIH0KLQkJCSAgICBwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgIH0KLQkJCSAgICBwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgICAgICBpZiAodGV4dFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpIHx8IAotCQkJICAgICAgICAJCWh0bWxUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJICAgICAgICAgICAgU3RyaW5nIHRleHQgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQkgICAgICAgICAgICBhZGRIVE1MKHRleHQpOwotCQkJICAgICAgICB9Ci0JCQkgICAgfQotCQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzdHJCdWYuYXBwZW5kKCJSaWNoVGV4dEVkaXRvclsiKS5hcHBlbmQocmljaFRleHQuZ2V0Q29udHJvbCgpLmhhbmRsZSkuYXBwZW5kKCddJykgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoJy4nKS5hcHBlbmQobWV0aG9kKTsKLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCdcbicpLmFwcGVuZCh0ZXh0KTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyQnVmKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnREZWJ1Z01lc3NhZ2UoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZykgewotCQlwcmludERlYnVnTWVzc2FnZShtZXRob2QsIG1zZywgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBGaW5kUmVwbGFjZUFjdGlvbiBnZXRGaW5kUmVwbGFjZUFjdGlvbigpIHsKLQkJcmV0dXJuIHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmluZFJlcGxhY2VBY3Rpb24oRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb24pIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEZpbmRSZXBsYWNlQWN0aW9uKGZpbmRSZXBsYWNlQWN0aW9uKTsKLQkJCXJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuc2V0UmljaFRleHQodGhpcyk7Ci0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0SW5pdGlhbFRleHQodGV4dCk7Ci0JCX0KLQkJaWYgKGdldFNvdXJjZUVkaXQoKSAhPSBudWxsKSB7Ci0JCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCXNldERvY3VtZW50KG5ldyBEb2N1bWVudCh0ZXh0KSk7Ci0JCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJfQotCi0JfQotCQotCQotCS8qKgotCSAqIGZyb20gb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZ2V0VW5kb0NvbnRleHQoKQotCSAqIFJldHVybnMgdGhpcyBlZGl0b3IncyB2aWV3ZXIncyB1bmRvIG1hbmFnZXIgdW5kbyBjb250ZXh0LgotCSAqCi0JICogQHJldHVybiB0aGUgdW5kbyBjb250ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhdmFpbGFibGUKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSBJVW5kb0NvbnRleHQgZ2V0VW5kb0NvbnRleHQoKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjYpIHsKLQkJCUlVbmRvTWFuYWdlciB1bmRvTWFuYWdlcj0gKChJVGV4dFZpZXdlckV4dGVuc2lvbjYpc291cmNlVmlld2VyKS5nZXRVbmRvTWFuYWdlcigpOwotCQkJaWYgKHVuZG9NYW5hZ2VyIGluc3RhbmNlb2YgSVVuZG9NYW5hZ2VyRXh0ZW5zaW9uKQotCQkJCXJldHVybiAoKElVbmRvTWFuYWdlckV4dGVuc2lvbil1bmRvTWFuYWdlcikuZ2V0VW5kb0NvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCk7Ci0JCS8vIHNlbGVjdCBhbGwKLQkJQWN0aW9uIHNlbGVjdEFsbEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRTb3VyY2VFZGl0KCkuc2VsZWN0QWxsKCk7Ci0JCQl9Ci0JCX07Ci0JCXNlbGVjdEFsbEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuU0VMRUNUX0FMTCk7Ci0JCXJlZ2lzdGVyQWN0aW9uKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLCBzZWxlY3RBbGxBY3Rpb24pOwotCX0KLQotCS8qCi0JICogZnJvbSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNjcmVhdGVVbmRvUmVkb0FjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpIHsKLQkJSVVuZG9Db250ZXh0IHVuZG9Db250ZXh0PSBnZXRVbmRvQ29udGV4dCgpOwotCQlpZiAodW5kb0NvbnRleHQgIT0gbnVsbCkgewotCQkJLy8gVXNlIGFjdGlvbnMgcHJvdmlkZWQgYnkgZ2xvYmFsIHVuZG8vcmVkbwotCQkJCi0JCQkvLyBDcmVhdGUgdGhlIHVuZG8gYWN0aW9uCi0JCQl1bmRvQWN0aW9uPSBuZXcgVW5kb0FjdGlvbkhhbmRsZXIoZ2V0RWRpdG9yU2l0ZSgpLCB1bmRvQ29udGV4dCk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVuZG9BY3Rpb24sIElBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5VTkRPX0FDVElPTik7Ci0JCQl1bmRvQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5VTkRPKTsKLQkJCXJlZ2lzdGVyQWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIHVuZG9BY3Rpb24pOwotCi0JCQkvLyBDcmVhdGUgdGhlIHJlZG8gYWN0aW9uLgotCQkJcmVkb0FjdGlvbj0gbmV3IFJlZG9BY3Rpb25IYW5kbGVyKGdldEVkaXRvclNpdGUoKSwgdW5kb0NvbnRleHQpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZWRvQWN0aW9uLCBJQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuUkVET19BQ1RJT04pOwotCQkJcmVkb0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUkVETyk7Ci0JCQlyZWdpc3RlckFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPLCByZWRvQWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElFZGl0b3JTaXRlIGdldEVkaXRvclNpdGUoKSB7Ci0JCXJldHVybiBlZGl0b3JTaXRlOwotCX0KLQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBnaXZlbiB1bmRvL3JlZG8gYWN0aW9uIHVuZGVyIHRoZSBnaXZlbiBJRCBhbmQKLQkgKiBlbnN1cmVzIHRoYXQgcHJldmlvdXNseSBpbnN0YWxsZWQgYWN0aW9ucyBnZXQgZGlzcG9zZWQuIEl0Ci0JICogYWxzbyB0YWtlcyBjYXJlIG9mIHJlLXJlZ2lzdGVyaW5nIHRoZSBuZXcgYWN0aW9uIHdpdGggdGhlCi0JICogZ2xvYmFsIGFjdGlvbiBoYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25JZAl0aGUgYWN0aW9uIGlkIHVuZGVyIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gYWN0aW9uCXRoZSBhY3Rpb24gdG8gcmVnaXN0ZXIKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwgSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUFjdGlvbiBvbGRBY3Rpb249IGdldEFjdGlvbihhY3Rpb25JZCk7Ci0JCWlmIChvbGRBY3Rpb24gaW5zdGFuY2VvZiBPcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlcikKLQkJCSgoT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIpb2xkQWN0aW9uKS5kaXNwb3NlKCk7Ci0KLQkJc2V0QWN0aW9uKGFjdGlvbklkLCBhY3Rpb24pOwotCQkKLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycz0gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihhY3Rpb25JZCwgYWN0aW9uKTsKLQl9Ci0KLQkKLQkvKgotCSAqIEBzZWUgSVRleHRFZGl0b3IjZ2V0QWN0aW9uKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBnZXRBY3Rpb24oU3RyaW5nIGFjdGlvbklEKSB7Ci0JCWFzc2VydCBhY3Rpb25JRCAhPSBudWxsOwotCQlJQWN0aW9uIGFjdGlvbj0gKElBY3Rpb24pIGZBY3Rpb25zLmdldChhY3Rpb25JRCk7Ci0KLS8vCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLS8vCQkJYWN0aW9uPSBmaW5kQ29udHJpYnV0ZWRBY3Rpb24oYWN0aW9uSUQpOwotLy8JCQlpZiAoYWN0aW9uICE9IG51bGwpCi0vLwkJCQlzZXRBY3Rpb24oYWN0aW9uSUQsIGFjdGlvbik7Ci0vLwkJfQotCi0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUZXh0RWRpdG9yI3NldEFjdGlvbihTdHJpbmcsIElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JRCwgSUFjdGlvbiBhY3Rpb24pIHsKLQkJYXNzZXJ0IGFjdGlvbklEICE9IG51bGw7Ci0JCWlmIChhY3Rpb24gPT0gbnVsbCkgewotCQkJYWN0aW9uPSAoSUFjdGlvbikgZkFjdGlvbnMucmVtb3ZlKGFjdGlvbklEKTsKLQkJCWlmIChhY3Rpb24gIT0gbnVsbCkKLQkJCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyLnVucmVnaXN0ZXJBY3Rpb25Gcm9tS2V5QWN0aXZhdGlvbihhY3Rpb24pOwotCQl9IGVsc2UgewotCQkJZkFjdGlvbnMucHV0KGFjdGlvbklELCBhY3Rpb24pOwotCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci5yZWdpc3RlckFjdGlvbkZvcktleUFjdGl2YXRpb24oYWN0aW9uKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYWN0aXZhdGlvbiBjb2RlIHRyaWdnZXIuCi0JICoKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBY3RpdmF0aW9uQ29kZVRyaWdnZXIoKSB7Ci0JCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXIuaW5zdGFsbCgpOwotCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyLnNldFNjb3BlcyhmS2V5QmluZGluZ1Njb3Blcyk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwga2V5IHZlcmlmeSBsaXN0ZW5lciBmb3IgdHJpZ2dlcmluZyBhY3Rpb24gYWN0aXZhdGlvbiBjb2Rlcy4KLQkgKi8KLQljbGFzcyBBY3RpdmF0aW9uQ29kZVRyaWdnZXIgaW1wbGVtZW50cyBWZXJpZnlLZXlMaXN0ZW5lciB7Ci0KLQkJLyoqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJpZ2dlciBoYXMgYmVlbiBpbnN0YWxsZWQuICovCi0JCXByaXZhdGUgYm9vbGVhbiBmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCQkvKioKLQkJICogVGhlIGtleSBiaW5kaW5nIHNlcnZpY2UgdG8gdXNlLgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwcml2YXRlIElLZXlCaW5kaW5nU2VydmljZSBmS2V5QmluZGluZ1NlcnZpY2U7Ci0JCQotCQkvKgotCQkgKiBAc2VlIFZlcmlmeUtleUxpc3RlbmVyI3ZlcmlmeUtleShvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmVyaWZ5S2V5KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0KLQkJCUFjdGlvbkFjdGl2YXRpb25Db2RlIGNvZGU9IG51bGw7Ci0JCQlpbnQgc2l6ZT0gZkFjdGl2YXRpb25Db2Rlcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJY29kZT0gKEFjdGlvbkFjdGl2YXRpb25Db2RlKSBmQWN0aXZhdGlvbkNvZGVzLmdldChpKTsKLQkJCQlpZiAoY29kZS5tYXRjaGVzKGV2ZW50KSkgewotCQkJCQlJQWN0aW9uIGFjdGlvbj0gZ2V0QWN0aW9uKGNvZGUuZkFjdGlvbklkKTsKLQkJCQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0KLQkJCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJVXBkYXRlKQotCQkJCQkJCSgoSVVwZGF0ZSkgYWN0aW9uKS51cGRhdGUoKTsKLQotCQkJCQkJaWYgKCFhY3Rpb24uaXNFbmFibGVkKCkgJiYgYWN0aW9uIGluc3RhbmNlb2YgSVJlYWRPbmx5RGVwZW5kZW50KSB7Ci0JCQkJCQkJSVJlYWRPbmx5RGVwZW5kZW50IGRlcGVuZGVudD0gKElSZWFkT25seURlcGVuZGVudCkgYWN0aW9uOwotCQkJCQkJCWJvb2xlYW4gd3JpdGFibGU9IGRlcGVuZGVudC5pc0VuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJaWYgKHdyaXRhYmxlKSB7Ci0JCQkJCQkJCWV2ZW50LmRvaXQ9IGZhbHNlOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQkJCQlldmVudC5kb2l0PSBmYWxzZTsKLQkJCQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEluc3RhbGxzIHRoaXMgdHJpZ2dlciBvbiB0aGUgZWRpdG9yJ3MgdGV4dCB3aWRnZXQuCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluc3RhbGwoKSB7Ci0JCQlpZiAoIWZJc0luc3RhbGxlZCkgewotCi0JCQkJaWYgKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uKSB7Ci0JCQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uIGU9IChJVGV4dFZpZXdlckV4dGVuc2lvbikgc291cmNlVmlld2VyOwotCQkJCQllLnByZXBlbmRWZXJpZnlLZXlMaXN0ZW5lcih0aGlzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHlsZWRUZXh0IHRleHQ9IHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJCXRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCi0JCQkJZktleUJpbmRpbmdTZXJ2aWNlPSBnZXRFZGl0b3JTaXRlKCkuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKTsKLQkJCQlmSXNJbnN0YWxsZWQ9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVW5pbnN0YWxscyB0aGlzIHRyaWdnZXIgZnJvbSB0aGUgZWRpdG9yJ3MgdGV4dCB3aWRnZXQuCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJCWlmIChmSXNJbnN0YWxsZWQpIHsKLQotCQkJCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbikgewotCQkJCQlJVGV4dFZpZXdlckV4dGVuc2lvbiBlPSAoSVRleHRWaWV3ZXJFeHRlbnNpb24pIHNvdXJjZVZpZXdlcjsKLQkJCQkJZS5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcih0aGlzKTsKLQkJCQl9IGVsc2UgaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCVN0eWxlZFRleHQgdGV4dD0gc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCQkJaWYgKHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQl0ZXh0LnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKGZBY3RpdmF0aW9uQ29kZVRyaWdnZXIpOwotCQkJCX0KLQotCQkJCWZJc0luc3RhbGxlZD0gZmFsc2U7Ci0JCQkJZktleUJpbmRpbmdTZXJ2aWNlPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gYWN0aW9uIGZvciBrZXkgYWN0aXZhdGlvbi4KLQkJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGJlIHJlZ2lzdGVyZWQKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaXN0ZXJBY3Rpb25Gb3JLZXlBY3RpdmF0aW9uKElBY3Rpb24gYWN0aW9uKSB7Ci0JCQlpZiAoYWN0aW9uLmdldEFjdGlvbkRlZmluaXRpb25JZCgpICE9IG51bGwpCi0JCQkJZktleUJpbmRpbmdTZXJ2aWNlLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIGdpdmVuIGFjdGlvbiBpcyBubyBsb25nZXIgYXZhaWxhYmxlIGZvciBrZXkgYWN0aXZhdGlvbgotCQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYmUgdW5yZWdpc3RlcmVkCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJBY3Rpb25Gcm9tS2V5QWN0aXZhdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQkJaWYgKGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSAhPSBudWxsKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS51bnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUga2V5IGJpbmRpbmcgc2NvcGVzIGZvciB0aGlzIGVkaXRvci4KLQkJICogQHBhcmFtIGtleUJpbmRpbmdTY29wZXMgdGhlIGtleSBiaW5kaW5nIHNjb3BlcwotCQkgKiBAc2luY2UgMi4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTY29wZXMoU3RyaW5nW10ga2V5QmluZGluZ1Njb3BlcykgewotCQkJaWYgKGtleUJpbmRpbmdTY29wZXMgIT0gbnVsbCAmJiBrZXlCaW5kaW5nU2NvcGVzLmxlbmd0aCA+IDApCi0JCQkJZktleUJpbmRpbmdTZXJ2aWNlLnNldFNjb3BlcyhrZXlCaW5kaW5nU2NvcGVzKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXByZXNlbnRhdGlvbiBvZiBhY3Rpb24gYWN0aXZhdGlvbiBjb2Rlcy4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgQWN0aW9uQWN0aXZhdGlvbkNvZGUgewotCi0JCS8qKiBUaGUgYWN0aW9uIGlkLiAqLwotCQlwdWJsaWMgU3RyaW5nIGZBY3Rpb25JZDsKLQkJLyoqIFRoZSBjaGFyYWN0ZXIuICovCi0JCXB1YmxpYyBjaGFyIGZDaGFyYWN0ZXI7Ci0JCS8qKiBUaGUga2V5IGNvZGUuICovCi0JCXB1YmxpYyBpbnQgZktleUNvZGU9IC0xOwotCQkvKiogVGhlIHN0YXRlIG1hc2suICovCi0JCXB1YmxpYyBpbnQgZlN0YXRlTWFzaz0gU1dULkRFRkFVTFQ7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGFjdGl2YXRpb24gY29kZSBmb3IgdGhlIGdpdmVuIGFjdGlvbiBpZC4KLQkJICogQHBhcmFtIGFjdGlvbklkIHRoZSBhY3Rpb24gaWQKLQkJICovCi0JCXB1YmxpYyBBY3Rpb25BY3RpdmF0aW9uQ29kZShTdHJpbmcgYWN0aW9uSWQpIHsKLQkJCWZBY3Rpb25JZD0gYWN0aW9uSWQ7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGl2YXRpb24gY29kZSBtYXRjaGVzIHRoZSBnaXZlbiB2ZXJpZnkgZXZlbnQuCi0JCSAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdG8gdGVzdCBmb3IgbWF0Y2hpbmcKLQkJICogQHJldHVybiB3aGV0aGVyIHRoaXMgYWN0aXZhdGlvbiBjb2RlIG1hdGNoZXMgPGNvZGU+ZXZlbnQ8L2NvZGU+Ci0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlyZXR1cm4gKGV2ZW50LmNoYXJhY3RlciA9PSBmQ2hhcmFjdGVyICYmCi0JCQkJCQkoZktleUNvZGUgPT0gLTEgfHwgZXZlbnQua2V5Q29kZSA9PSBmS2V5Q29kZSkgJiYKLQkJCQkJCShmU3RhdGVNYXNrID09IFNXVC5ERUZBVUxUIHx8IGV2ZW50LnN0YXRlTWFzayA9PSBmU3RhdGVNYXNrKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3JGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTFhMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3JGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0vKioKLSAqIEEgY29tcG9zaXRlIGZvciBsYXlpbmcgb3V0IHRoZSBkZWZhdWx0IHJpY2ggdGV4dCBlZGl0b3IgaW4gYW4gRWNsaXBzZSBmb3JtLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0RWRpdG9yRm9ybSBleHRlbmRzIFZpZXdGb3JtIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dEVkaXRvckZvcm0oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMjZ2V0RGF0YShTdHJpbmcga2V5KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkuZXF1YWxzKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUikpIHsKLQkJCS8vIFJldHVybiBhIHRleHQgYm9yZGVyIHRvIGdldCB0aGUgRm9ybVRvb2xraXQncyBCb3JkZXJQYWludGVyIHRvCi0JCQkvLyBwYWludCBhIGJvcmRlciBmb3IgdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0JCQlyZXR1cm4gRm9ybVRvb2xraXQuVEVYVF9CT1JERVI7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERhdGEoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Rm9ybVRvb2xraXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Rm9ybVRvb2xraXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZjAwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEZvcm1Ub29sa2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBBIGhlbHBlciB0b29sa2l0IGZvciBjcmVhdGluZyBhIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IgdGhhdCBjYW4gYmUKLSAqIGFkZGVkIHRvIGFuIEVjbGlwc2UgZm9ybS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEZvcm1Ub29sa2l0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgY29udHJvbCBhbmQgYWRhcHRzIGl0IHRvIGJlIHVzZWQgaW4gYSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICB0aGUgZm9ybSB0b29sa2l0Ci0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHRleHQgZm9yIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcwotCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+SVJpY2hUZXh0PC9jb2RlPiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0JCUlSaWNoVGV4dCByaWNoVGV4dCA9IG5ldyBSaWNoVGV4dChwYXJlbnQsIHRvb2xraXQuZ2V0Qm9yZGVyU3R5bGUoKQotCQkJCXwgc3R5bGUgfCB0b29sa2l0LmdldE9yaWVudGF0aW9uKCkpOwotCQlyaWNoVGV4dC5nZXRDb250cm9sKCkuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsCi0JCQkJRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQl9Ci0JCXJldHVybiByaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGVkaXRvciBhbmQgYWRhcHRzIGl0IHRvIGJlIHVzZWQgaW4gYSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICB0aGUgZm9ybSB0b29sa2l0Ci0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHRleHQgZm9yIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcwotCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+SVJpY2hUZXh0PC9jb2RlPiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJpY2hUZXh0RWRpdG9yIGNyZWF0ZVJpY2hUZXh0RWRpdG9yKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCUlSaWNoVGV4dEVkaXRvciByaWNoVGV4dEVkaXRvciA9IG5ldyBSaWNoVGV4dEVkaXRvcihwYXJlbnQsIHRvb2xraXQKLQkJCQkuZ2V0Qm9yZGVyU3R5bGUoKQotCQkJCXwgc3R5bGUgfCB0b29sa2l0LmdldE9yaWVudGF0aW9uKCksIGVkaXRvclNpdGUpOwotCQlyaWNoVGV4dEVkaXRvci5nZXRDb250cm9sKCkuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsCi0JCQkJRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dEVkaXRvci5zZXRJbml0aWFsVGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gcmljaFRleHRFZGl0b3I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEltYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0ZjljNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogU2hhcmVkIGltYWdlcyB1c2VkIGJ5IHRoZSBkZWZhdWx0IHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRJbWFnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVUT09MMTYgPSAiZnVsbC9ldG9vbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVE9PTDE2ID0gImZ1bGwvZHRvb2wxNi8iOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmljaFRleHRQbHVnaW4gcmljaFRleHRQbHVnaW4gPSBSaWNoVGV4dFBsdWdpbgotCQkJLmdldERlZmF1bHQoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9JTUFHRSA9IEVUT09MMTYgKyAiQWRkSW1hZ2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQUREX0xJTkUgPSBFVE9PTDE2ICsgIkFkZExpbmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQUREX0xJTksgPSBFVE9PTDE2ICsgIkFkZExpbmsuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQUREX09SREVSRURfTElTVCA9IEVUT09MMTYKLQkJCSsgIkFkZE9yZGVyZWRMaXN0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9UQUJMRSA9IEVUT09MMTYgKyAiQWRkVGFibGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUID0gRVRPT0wxNgotCQkJKyAiQWRkVW5vcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9CT0xEID0gRVRPT0wxNiArICJCb2xkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0NMRUFSX0NPTlRFTlQgPSBFVE9PTDE2Ci0JCQkrICJDbGVhckNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0NPUFkgPSBFVE9PTDE2ICsgIkNvcHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQ1VUID0gRVRPT0wxNiArICJDdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfRklORF9SRVBMQUNFID0gRVRPT0wxNgotCQkJKyAiRmluZFJlcGxhY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfSU5ERU5UID0gRVRPT0wxNiArICJJbmRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfSVRBTElDID0gRVRPT0wxNiArICJJdGFsaWMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfSlVTVElGWV9DRU5URVIgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5Q2VudGVyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0pVU1RJRllfRlVMTCA9IEVUT09MMTYKLQkJCSsgIkp1c3RpZnlGdWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0pVU1RJRllfTEVGVCA9IEVUT09MMTYKLQkJCSsgIkp1c3RpZnlMZWZ0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0pVU1RJRllfUklHSFQgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5UmlnaHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfT1VUREVOVCA9IEVUT09MMTYgKyAiT3V0ZGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9QQVNURSA9IEVUT09MMTYgKyAiUGFzdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQgPSBFVE9PTDE2ICsgIlBhc3RlUGxhaW5UZXh0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1NUUklLRV9USFJPVUdIID0gRVRPT0wxNgotCQkJKyAiU3RyaWtlVGhyb3VnaC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVUJTQ1JJUFQgPSBFVE9PTDE2ICsgIlN1YnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVVBFUlNDUklQVCA9IEVUT09MMTYKLQkJCSsgIlN1cGVyc2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1VOREVSTElORSA9IEVUT09MMTYgKyAiVW5kZXJsaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1RJRFkgPSBFVE9PTDE2ICsgIlRpZHlIVE1MLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX0lNQUdFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9MSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfTElOSyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX0xJTkspOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX09SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX09SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfVEFCTEUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9UQUJMRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfVU5PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19CT0xEID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9CT0xEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NMRUFSX0NPTlRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0NMRUFSX0NPTlRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09QWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQ09QWSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DVVQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0NVVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19GSU5EX1JFUExBQ0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0ZJTkRfUkVQTEFDRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19JTkRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0lOREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19JVEFMSUMgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0lUQUxJQyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19KVVNUSUZZX0NFTlRFUiA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9DRU5URVIpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9GVUxMID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9KVVNUSUZZX0xFRlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9SSUdIVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9SSUdIVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19PVVRERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9QQVNURSk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUEFTVEVfUExBSU5fVEVYVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfUEFTVEVfUExBSU5fVEVYVCk7CQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1NUUklLRV9USFJPVUdIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NVQlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1VOREVSTElORSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVElEWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfVElEWSk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX0lNQUdFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX0lNQUdFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9MSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9BRERfTElOSyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19BRERfT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX09SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19BRERfVEFCTEUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0JPTEQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9CT0xEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0NMRUFSX0NPTlRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9DT1BZKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0NVVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0NVVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19GSU5EX1JFUExBQ0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfSU5ERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0lUQUxJQyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0lUQUxJQyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19KVVNUSUZZX0NFTlRFUiA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0pVU1RJRllfRlVMTCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19KVVNUSUZZX0xFRlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0xFRlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9SSUdIVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX09VVERFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUEFTVEUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9QQVNURSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19QQVNURV9QTEFJTl9URVhUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfUEFTVEVfUExBSU5fVEVYVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVFJJS0VfVEhST1VHSCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1NUUklLRV9USFJPVUdIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1NVQlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1NVQlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVVBFUlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1NVUEVSU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1VOREVSTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1VOREVSTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19USURZID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfVElEWSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9BRERfSU1BR0UgPSBEVE9PTDE2Ci0JCQkrICJBZGRJbWFnZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5FID0gRFRPT0wxNgotLy8JCQkrICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LID0gRFRPT0wxNgotCQkJKyAiQWRkTGluay5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkT3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1RBQkxFID0gRFRPT0wxNgotCQkJKyAiQWRkVGFibGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkVW5vcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9CT0xEID0gRFRPT0wxNiArICJCb2xkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQgPSBEVE9PTDE2Ci0JCQkrICJDbGVhckNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NPUFkgPSBEVE9PTDE2ICsgIkNvcHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQ1VUID0gRFRPT0wxNiArICJDdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRklORF9SRVBMQUNFID0gRFRPT0wxNgotCQkJKyAiRmluZFJlcGxhY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSU5ERU5UID0gRFRPT0wxNgotCQkJKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0lUQUxJQyA9IERUT09MMTYKLQkJCSsgIkl0YWxpYy5naWYiOyAvLyROT04tTkxTLTEkCi0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfQ0VOVEVSID0gRFRPT0wxNgotLy8JCQkrICJKdXN0aWZ5Q2VudGVyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0ZVTEwgPSBEVE9PTDE2Ci0vLwkJCSsgIkp1c3RpZnlGdWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0xFRlQgPSBEVE9PTDE2Ci0vLwkJCSsgIkp1c3RpZnlMZWZ0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX1JJR0hUID0gRFRPT0wxNgotLy8JCQkrICJKdXN0aWZ5UmlnaHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCA9IERUT09MMTYKLQkJCSsgIk91dGRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfUEFTVEUgPSBEVE9PTDE2ICsgIlBhc3RlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQgPSBEVE9PTDE2ICsgIlBhc3RlUGxhaW5UZXh0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0ggPSBEVE9PTDE2Ci0vLwkJCSsgIlN0cmlrZVRocm91Z2guZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUID0gRFRPT0wxNgotCQkJKyAiU3Vic2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1NVUEVSU0NSSVBUID0gRFRPT0wxNgotCQkJKyAiU3VwZXJzY3JpcHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1RJRFkgPSBEVE9PTDE2ICsgIlRpZHlIVE1MLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfVU5ERVJMSU5FID0gRFRPT0wxNgotCQkJKyAiVW5kZXJsaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQUREX0lNQUdFKTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX0xJTkUgPSByaWNoVGV4dFBsdWdpbgotLy8JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JVEFMSUMpOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19KVVNUSUZZX0NFTlRFUiA9IHJpY2hUZXh0UGx1Z2luCi0vLwkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0NFTlRFUik7Ci0vLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSlVTVElGWV9GVUxMID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfRlVMTCk7Ci0vLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfTEVGVCk7Ci0vLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSlVTVElGWV9SSUdIVCA9IHJpY2hUZXh0UGx1Z2luCi0vLwkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX1JJR0hUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX09VVERFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX09VVERFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfUEFTVEUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1BBU1RFKTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotLy8JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfU1VCU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9TVUJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfU1VQRVJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1NVUEVSU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1VOREVSTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfVU5ERVJMSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9JTUFHRSk7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9MSU5FID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfTElOSyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9UQUJMRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9UQUJMRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfVU5PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0JPTEQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ09QWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfQ1VUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0ZJTkRfUkVQTEFDRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0ZJTkRfUkVQTEFDRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19JTkRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSVRBTElDKTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotLy8JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLS8vCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19KVVNUSUZZX0ZVTEwgPSByaWNoVGV4dFBsdWdpbgotLy8JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfRlVMTCk7Ci0vLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0xFRlQpOwotLy8KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotLy8JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX09VVERFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfUEFTVEUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9QQVNURSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19QQVNURV9QTEFJTl9URVhUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfUEFTVEVfUExBSU5fVEVYVCk7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9TVUJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfU1VQRVJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9VTkRFUkxJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfVElEWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX1RJRFkpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjIwNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogTGlzdGVucyB0byBhIHJpY2ggdGV4dCBlZGl0aW5nIGV2ZW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBpbnQgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHR5cGUKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dExpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBldmVudCB0eXBlCi0JICovCi0JcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0JCXJldHVybiBldmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIExpc3RlbmVyIGdldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbGlzdGVuZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhM2NhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBSaWNoIFRleHQgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBSaWNoVGV4dFBsdWdpbiBwbHVnaW47Ci0KLQkvLyBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgcGx1Zy1pbiB3YXMgc3RhcnRlZC4KLQlwcml2YXRlIERhdGUgc3RhcnRUaW1lOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUmljaFRleHRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlzdGFydFRpbWUgPSBuZXcgRGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJpY2hUZXh0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgcGx1Zy1pbiB3YXMgc3RhcnRlZC4KLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRTdGFydFRpbWUoKSB7Ci0JCXJldHVybiBzdGFydFRpbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmM2U1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFJpY2hUZXh0IHJlc291cmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJpY2hUZXh0UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFJpY2hUZXh0UmVzb3VyY2VzLmNsYXNzCi0JCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBSaWNoVGV4dFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlLgotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lQWN0aW9uX0NTU19EZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lQWN0aW9uX0NTU19EZWZhdWx0X01vemlsbGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVBY3Rpb25fRGVmYXVsdEZvbnROYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9ub3JtYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX3F1b3RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9jb2RlU2FtcGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX3BhcmFncmFwaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19oZWFkaW5nMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19oZWFkaW5nMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19oZWFkaW5nMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19oZWFkaW5nNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19oZWFkaW5nNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19oZWFkaW5nNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19hZGRyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV9hcmlhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV9jb3VyaWVyTmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX3RpbWVzTmV3Um9tYW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfdmVyZGFuYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJvbGRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3V0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZGVudEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZVBsYWluVGV4dEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5QWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZVBsYWluVGV4dEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJpY2hUZXh0VGFiX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmljaFRleHRUYWJfdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaHRtbFRhYl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0bWxUYWJfdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSW1hZ2VEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTGlua0RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRUYWJsZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kUmVwbGFjZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdW1tYXJ5TGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXB0aW9uTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb3dzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5zTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aWR0aExhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFibGVTdHlsZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFibGVIZWFkZXJOb25lX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFibGVIZWFkZXJDb2xzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFibGVIZWFkZXJSb3dzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFibGVIZWFkZXJCb3RoX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQ29udGVudERpYWxvZ190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wdGlvbnNHcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdob2xlV29yZENoZWNrYm94X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlyZWN0aW9uR3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3J3YXJkUmFkaW9CdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZEJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlRmluZEJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VhbGxCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZGVudEhUTUxDaGVja2JveF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZGVudFNpemVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aWR5X2NsZWFuZXJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aWR5X2NsZWFuZXN0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aWR5X2NsZWFuZXJfdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVzdF90b29sVGlwVGV4dDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFJpY2hUZXh0UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRTZWxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YjdmNGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRTZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLS8qKgotICogTW9kZWxzIGEgdGV4dCBzZWxlY3Rpb24gaW4gYSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0U2VsZWN0aW9uIHsKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBzZWxlY3Rpb24uCi0JcHJvdGVjdGVkIFN0cmluZyB0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBzZWxlY3Rpb24gb2Zmc2V0Ci0JcHJvdGVjdGVkIGludCBvZmZzZXRTdGFydCA9IDA7Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIGZvbnQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZvbnROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBzZWxlY3Rpb24gZm9udCBzaXplCi0JLy8gY291bGQgYmUgaW4gcG9pbnQgc2l6ZSAoMTJwdCksIG9yIEhUTUwgc2l6ZSAoMS03KQotCXByb3RlY3RlZCBTdHJpbmcgZm9udFNpemUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IGN1cnJlbnQgc3R5bGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJsb2NrU3R5bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IGN1cnJlbnQgZmxhZ3MKLQlwcm90ZWN0ZWQgaW50IGZsYWdzID0gMDsKLQotCS8vIFRleHQgc3RhdHVzIGZsYWdzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9MRCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEFMSUMgPSBCT0xEIDw8IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkUgPSBJVEFMSUMgPDwgMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQlNDUklQVCA9IFVOREVSTElORSA8PCAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQRVJTQ1JJUFQgPSBTVUJTQ1JJUFQgPDwgMTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tTdHlsZSgpIHsKLQkJcmV0dXJuIGJsb2NrU3R5bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmxvY2tTdHlsZShTdHJpbmcgYmxvY2tTdHlsZSkgewotCQl0aGlzLmJsb2NrU3R5bGUgPSBibG9ja1N0eWxlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB7Ci0JCXJldHVybiBmbGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpIHsKLQkJdGhpcy5mbGFncyA9IGZsYWdzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udE5hbWUoKSB7Ci0JCXJldHVybiBmb250TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250TmFtZShTdHJpbmcgZm9udE5hbWUpIHsKLQkJdGhpcy5mb250TmFtZSA9IGZvbnROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFNpemUoKSB7Ci0JCXJldHVybiBmb250U2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250U2l6ZShTdHJpbmcgZm9udFNpemUpIHsKLQkJdGhpcy5mb250U2l6ZSA9IGZvbnRTaXplOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0U3RhcnQoKSB7Ci0JCXJldHVybiBvZmZzZXRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXRTdGFydChpbnQgb2Zmc2V0U3RhcnQpIHsKLQkJdGhpcy5vZmZzZXRTdGFydCA9IG9mZnNldFN0YXJ0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQm9sZCgpIHsKLQkJcmV0dXJuIChmbGFncyAmIEJPTEQpICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJdGFsaWMoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBJVEFMSUMpICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbmRlckxpbmUoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBVTkRFUkxJTkUpICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdWJzY3JpcHQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBTVUJTQ1JJUFQpICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXBlcnNjcmlwdCgpIHsKLQkJcmV0dXJuIChmbGFncyAmIFNVUEVSU0NSSVBUKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgc2VsZWN0aW9uIGluZm8KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCW9mZnNldFN0YXJ0ID0gMDsKLQkJZm9udE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb250U2l6ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWJsb2NrU3R5bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmbGFncyA9IDA7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHN0ciA9ICJUZXh0OiAiICsgdGV4dCArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzdHIgKz0gImZvbnROYW1lOiAiICsgZm9udE5hbWUgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RyICs9ICJmb250U2l6ZTogIiArIGZvbnRTaXplICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiYmxvY2tTdHlsZTogIiArIGJsb2NrU3R5bGUgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RyICs9ICJmbGFnczogIiArIGZsYWdzICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBzdHI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0VG9vbEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTE2MmQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0VG9vbEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSVJpY2hUZXh0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlJpY2hUZXh0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlJpY2hUZXh0Q29tYm9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgcmljaCB0ZXh0IHRvb2wgYmFyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBTcGxpdCBpbnRvIDIgdG9vbGJhcnMgKG9uZSBmb3IgQ0NvbWJvcywgb25lIGZvciBidXR0b25zKSBmb3IgdGFiYmluZyBwdXJwb3Nlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0VG9vbEJhciBpbXBsZW1lbnRzIElSaWNoVGV4dFRvb2xCYXIgewotCi0JLy8gVGhlIHBhcmVudCByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dDsKLQotCS8vIElmIHRydWUsIGFkZCBhIG5ldyB0b29sIGJhci4KLQlwcml2YXRlIGJvb2xlYW4gYWRkVG9vbEJhciA9IHRydWU7Ci0KLQkvLyBUaGUgY3VycmVudCB0b29sIGJhciBtYW5hZ2VyIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHRvb2wgYWN0aW9ucy4KLQlwcml2YXRlIFRvb2xCYXJNYW5hZ2VyIHRvb2xiYXJNZ3I7Ci0JCi0JLy8gVGhlIGN1cnJlbnQgdG9vbCBiYXIgbWFuYWdlciB1c2VkIHRvIHBvcHVsYXRlIHRoZSB0b29sIGFjdGlvbnMuCi0JcHJpdmF0ZSBUb29sQmFyTWFuYWdlciB0b29sYmFyTWdyQ29tYm87Ci0KLQkvLyBUaGUgYWN0aW9uIGl0ZW1zIGluIHRoZSB0b29sIGJhcihzKS4KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBhY3Rpb25JdGVtcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxhc3RXaWR0aCA9IC0xOwotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHRvb2wgYmFyIHN0eWxlCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0VG9vbEJhcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCi0JCWFkZFRvb2xCYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb24oZmluYWwgSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlBY3Rpb25Db250cmlidXRpb25JdGVtIGl0ZW0gPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCQkJdG9vbGJhck1nci5hZGQoaXRlbSk7Ci0JCQl0b29sYmFyTWdyLnVwZGF0ZSh0cnVlKTsKLQkJCWFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBjb21ibyBhY3Rpb24gdG8gdGhlIHRvb2wgYmFyLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKGZpbmFsIFJpY2hUZXh0Q29tYm9BY3Rpb24gaXRlbSkgewotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlpdGVtLmluaXQoKTsKLQkJCXRvb2xiYXJNZ3JDb21iby5hZGQoaXRlbSk7ICAgICAgICAgICAgCi0JCQl0b29sYmFyTWdyQ29tYm8udXBkYXRlKHRydWUpOwotCQkJYWN0aW9uSXRlbXMuYWRkKGl0ZW0pOyAgICAgICAgICAgCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgc2VwYXJhdG9yIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXBhcmF0b3IoKSB7Ci0JCXRvb2xiYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgdG9vbGJhciBzdGF0ZS4KLQkgKiA8cD4KLQkgKiBFbmFibGVzL2Rpc2FibGVzIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLQkgKiBSaWNoVGV4dEVkaXRvciB0YWIgKFJpY2hUZXh0IHZzLiBIVE1MKQotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIG5vbi1SZWFkT25seSBjb21tYW5kcwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xCYXIoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlib29sZWFuIHJpY2hUZXh0TW9kZSA9IHRydWU7Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJJiYgKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCXJpY2hUZXh0TW9kZSA9IGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGFjdGlvbkl0ZW1zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpLm5leHQoKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVG9vbEl0ZW0pIHsKLQkJCQlib29sZWFuIGVuYWJsZWRUb29sSXRlbSA9IHRydWU7Ci0JCQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGl0ZW07Ci0JCQkJSVJpY2hUZXh0QWN0aW9uIGFjdGlvbiA9IChJUmljaFRleHRBY3Rpb24pIHRvb2xJdGVtLmdldERhdGEoKTsKLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIWVkaXRhYmxlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkpIHsKLQkJCQkJZW5hYmxlZFRvb2xJdGVtID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiAhcmljaFRleHRNb2RlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluU291cmNlTW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQl0b29sSXRlbS5zZXRFbmFibGVkKGVuYWJsZWRUb29sSXRlbSk7Ci0JCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb21ibykgewotCQkJCWlmIChyaWNoVGV4dE1vZGUgJiYgZWRpdGFibGUpIHsKLQkJCQkJKChDb21ibykgaXRlbSkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkoKENvbWJvKSBpdGVtKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkVG9vbEl0ZW0gPSB0cnVlOwotCQkJCVJpY2hUZXh0QWN0aW9uIGFjdGlvbiA9IChSaWNoVGV4dEFjdGlvbikgKChBY3Rpb25Db250cmlidXRpb25JdGVtKSBpdGVtKQotCQkJCQkJLmdldEFjdGlvbigpOwotCQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiAhZWRpdGFibGUKLQkJCQkJCSYmIGFjdGlvbi5kaXNhYmxlSW5SZWFkT25seU1vZGUoKSkgewotCQkJCQllbmFibGVkVG9vbEl0ZW0gPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsICYmICFyaWNoVGV4dE1vZGUKLQkJCQkJCSYmIGFjdGlvbi5kaXNhYmxlSW5Tb3VyY2VNb2RlKCkpIHsKLQkJCQkJZW5hYmxlZFRvb2xJdGVtID0gZmFsc2U7Ci0JCQkJfQotCQkJCWFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWRUb29sSXRlbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgdG9vbCBiYXIsIGlmIG5lY2Vzc2FyeSwgdG8gY29udGFpbiBhIGJ1dHRvbiBhY3Rpb24gb3Igc2VwYXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvb2xCYXIoKSB7Ci0JCWlmIChhZGRUb29sQmFyKSB7Ci0JCQl0b29sYmFyTWdyQ29tYm8gPSBuZXcgVG9vbEJhck1hbmFnZXIoU1dULldSQVAgfCBTV1QuRkxBVCB8IHBhcmVudC5nZXRTdHlsZSgpKTsKLQkJCXRvb2xiYXJNZ3JDb21iby5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQl0b29sYmFyTWdyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5XUkFQIHwgU1dULkZMQVQgfCBwYXJlbnQuZ2V0U3R5bGUoKSk7Ci0JCQl0b29sYmFyTWdyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCWFkZFRvb2xCYXIgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBUb29sQmFyTWFuYWdlciBnZXRUb29sYmFyTWdyKCkgewotCQlyZXR1cm4gdG9vbGJhck1ncjsKLQl9Ci0KLQlwdWJsaWMgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbGJhck1nckNvbWJvKCkgewotCQlyZXR1cm4gdG9vbGJhck1nckNvbWJvOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRJbWFnZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRJbWFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAyOTIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYW4gaW1hZ2UgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRJbWFnZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZEltYWdlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfSU1BR0UpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfSU1BR0UpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCUFkZEltYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRJbWFnZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGltYWdlVVJMID0gZGlhbG9nLmdldEltYWdlKCkuZ2V0VVJMKCk7Ci0JCQkJaWYgKGltYWdlVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dAotCQkJCQkJCS5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLCBpbWFnZVVSTCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Y2FkYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEFkZHMgYSBob3Jpem9udGFsIGJhciB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZExpbmVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBZGRMaW5lQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfTElORSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0xJTkUpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZExpbmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2OGViNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZExpbmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkTGlua0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQWRkcyBhIGxpbmsgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRMaW5rQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkTGlua0FjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0xJTkspOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfTElOSyk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlBZGRMaW5rRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRMaW5rRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCByaWNoVGV4dC5nZXRCYXNlUGF0aCgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlTdHJpbmcgbGlua1VSTCA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0VVJMKCk7Ci0JCQkJaWYgKGxpbmtVUkwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfTElOSywgbGlua1VSTCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZE9yZGVyZWRMaXN0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZE9yZGVyZWRMaXN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNDJhMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBBZGRzIGFuIG9yZGVyZWQgbGlzdCB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZE9yZGVyZWRMaXN0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkT3JkZXJlZExpc3RBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9PUkRFUkVEX0xJU1QpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfT1JERVJFRF9MSVNUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfT1JERVJFRF9MSVNUKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRUYWJsZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRUYWJsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTY3MTY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkVGFibGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYSB0YWJsZSB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFRhYmxlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkVGFibGVBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9UQUJMRSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0FERF9UQUJMRSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlBZGRUYWJsZURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkVGFibGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCVRhYmxlIHRhYmxlID0gZGlhbG9nLmdldFRhYmxlKCk7Ci0JCQkJaW50IHJvd3MgPSB0YWJsZS5nZXRSb3dzKCk7Ci0JCQkJaW50IGNvbHMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCQkJU3RyaW5nIHdpZHRoID0gdGFibGUuZ2V0V2lkdGgoKTsKLQkJCQlpbnQgdGFibGVoZWFkZXJzID0gdGFibGUuZ2V0VGFibGVIZWFkZXJzKCk7Ci0JCQkJU3RyaW5nIHN1bW1hcnkgPSB0YWJsZS5nZXRTdW1tYXJ5KCk7Ci0JCQkJU3RyaW5nIGNhcHRpb24gPSB0YWJsZS5nZXRDYXB0aW9uKCk7Ci0JCQkJaWYgKHJvd3MgPiAwICYmIGNvbHMgPiAwKSB7Ci0JCQkJCXJpY2hUZXh0Ci0JCQkJCQkJLmV4ZWN1dGVDb21tYW5kKAotCQkJCQkJCQkJUmljaFRleHRDb21tYW5kLkFERF9UQUJMRSwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJCSIiICsgcm93cywgIiIgKyBjb2xzLCAiIiArIHdpZHRoLCBzdW1tYXJ5LCBjYXB0aW9uLCAiIiArIHRhYmxlaGVhZGVycyB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVW5vcmRlcmVkTGlzdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRVbm9yZGVyZWRMaXN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjA1NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRVbm9yZGVyZWRMaXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEFkZHMgYW4gdW5vcmRlcmVkIGxpc3QgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRVbm9yZGVyZWRMaXN0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX1VOT1JERVJFRF9MSVNUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX1VOT1JERVJFRF9MSVNUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9VTk9SREVSRURfTElTVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jhc2VSaWNoVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ1NzM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIHJpY2ggdGV4dCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVJpY2hUZXh0QWN0aW9uIGltcGxlbWVudHMgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvb2xUaXBUZXh0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBCYXNlUmljaFRleHRBY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiB0b29sVGlwVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFRpcFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXBUZXh0KSB7Ci0JCXRoaXMudG9vbFRpcFRleHQgPSB0b29sVGlwVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmFibGVkIHN0YXR1cyBvZiB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuYWJsZSB0aGUgYWN0aW9uLiBpZgotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBkaXNhYmxlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jsb2NrVGFnQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jsb2NrVGFnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjhmYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5CbG9ja1RhZzsKLQotLyoqCi0gKiBTZXRzIHRoZSBmb250IG5hbWUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUYWdBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEJsb2NrVGFnQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldElucHV0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuUEFSQUdSQVBILmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkhFQURJTkdfMS5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5IRUFESU5HXzIuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuSEVBRElOR18zLmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkhFQURJTkdfNC5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5IRUFESU5HXzUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuSEVBRElOR182LmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkFERFJFU1MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuUFJFRk9STUFUVEVEX1RFWFQuZ2V0TmFtZSgpKTsKLQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0JCi0JCi0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBzZWxlY3RlZCA9IGdldENDb21ib1NlbGVjdGlvbigpOwotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkZPUk1BVF9CTE9DSywgc2VsZWN0ZWQpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiYzY0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAnYm9sZCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQm9sZEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEJvbGRBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19CT0xEKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQk9MRCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJvbGRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDaGVja2VkKHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuaXNCb2xkKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQk9MRCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0NsZWFyQ29udGVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DbGVhckNvbnRlbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4MzUwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0NsZWFyQ29udGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQ2xlYXJzIHRoZSBjb250ZW50IG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xlYXJDb250ZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2xlYXJDb250ZW50QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19DTEVBUl9DT05URU5UKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBzIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVByb21wdCgKLQkJCQkJUmljaFRleHRSZXNvdXJjZXMuY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlLAotCQkJCQlSaWNoVGV4dFJlc291cmNlcy5jbGVhckNvbnRlbnREaWFsb2dfdGV4dCkpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQ0xFQVJfQ09OVEVOVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Db3B5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjJmNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Db3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci0KLS8qKgotICogQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wgdG8gdGhlIGNsaXBib2FyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29weUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQ09QWSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0NPUFkpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gcmVhZG9ubHkgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5SZWFkT25seU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmdldFNvdXJjZUVkaXQoKTsKLQkJCQlzdHlsZWRUZXh0LmNvcHkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuc2V0Q29weVVSTCgpOwotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5DT1BZKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DdXRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Mjg4ODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DdXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLQotLyoqCi0gKiBDdXRzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIHRoZSByaWNoIHRleHQgY29udHJvbCB0byB0aGUgY2xpcGJvYXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1dEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1dEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQ1VUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQ1VUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuY3V0QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpCi0JCQkJCQkuZ2V0U291cmNlRWRpdCgpOwotCQkJCXN0eWxlZFRleHQuY3V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LnNldENvcHlVUkwoKTsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQ1VUKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRmluZFJlcGxhY2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRmluZFJlcGxhY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjMmMzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5GaW5kUmVwbGFjZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRmluZHMgYW5kIHJlcGxhY2VzIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaW5kUmVwbGFjZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIEZpbmRzIHRleHQgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5EX1RFWFQgPSAxOwotCi0JLyoqCi0JICogUmVwbGFjZXMgdGV4dCBzdWIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfVEVYVCA9IDI7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbmQgZmluZHMgdGV4dCBzdWIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfRklORF9URVhUID0gMzsKLQotCS8qKgotCSAqIFJlcGxhY2VzIGFsbCBzdWIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfQUxMX1RFWFQgPSA0OwotCi0JLyoqCi0JICogRmluZCBtYXRjaCBpbiBhIGZvcndhcmQgZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRfTUFUQ0ggPSAxOwotCi0JLyoqCi0JICogRmluZCBtYXRjaCBpbiBhIGJhY2t3YXJkIGRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQUNLV0FSRF9NQVRDSCA9IC0xOwotCi0JLyoqCi0JICogV2hvbGUgd29yZCBtYXRjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSE9MRV9XT1JEX01BVENIID0gMjsKLQotCS8qKgotCSAqIENhc2Ugc2Vuc2l0aXZlIG1hdGNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0VfU0VOU0lUSVZFX01BVENIID0gNDsKLQotCS8vIEVuY29kZWQgc2luZ2xlIHF1b3RlLgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERURfU0lOR0xFX1FVT1RFID0gIiVzcSUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IHJpY2hUZXh0OwotCi0JcHJvdGVjdGVkIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotCXByb3RlY3RlZCBib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLQkKLQkvLyB0aGUgZGlhbG9nIGluc3RhbmNlCi0JcHJvdGVjdGVkIEZpbmRSZXBsYWNlRGlhbG9nIGRpYWxvZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZpbmRSZXBsYWNlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19GSU5EX1JFUExBQ0UpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19GSU5EX1JFUExBQ0UpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHRoaXMucmljaFRleHQgPT0gbnVsbCkKLQkJCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQkJaWYgKHRoaXMucmljaFRleHQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCQkJZGlhbG9nLnNldEZpbmRPbmx5KCF0aGlzLnJpY2hUZXh0LmdldEVkaXRhYmxlKCkpOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpYWxvZyA9IG5ldyBGaW5kUmVwbGFjZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aGlzLCAhdGhpcy5yaWNoVGV4dAotCQkJCQkJCS5nZXRFZGl0YWJsZSgpKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBtYXRjaCBpcyBmb3VuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm91bmRNYXRjaCgpIHsKLQkJcmV0dXJuIGZvdW5kTWF0Y2g7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3ViQWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc3ViIGFjdGlvbiB0byBleGVjdXRlCi0JICogQHBhcmFtIGZpbmRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZmluZCB0ZXh0Ci0JICogQHBhcmFtIHJlcGxhY2VUZXh0Ci0JICogICAgICAgICAgICB0aGUgcmVwbGFjZSB0ZXh0Ci0JICogQHBhcmFtIG1hdGNoRGlyCi0JICogICAgICAgICAgICB0aGUgbWF0Y2ggZGlyZWN0aW9uOyB0aGUgdmFsdWUgY2FuIGVpdGhlciBiZQotCSAqICAgICAgICAgICAgPGNvZGU+RklORF9GT1JXQVJEPC9jb2RlPiBvciA8Y29kZT5GSU5EX0JBQ0tXQVJEPC9jb2RlPi4KLQkgKiBAcGFyYW0gbWF0Y2hPcHRpb25zCi0JICogICAgICAgICAgICB0aGUgbWF0Y2ggb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihpbnQgc3ViQWN0aW9uLCBTdHJpbmcgZmluZFRleHQsIFN0cmluZyByZXBsYWNlVGV4dCwKLQkJCWludCBtYXRjaERpciwgaW50IG1hdGNoT3B0aW9ucykgewotCQlzdHlsZWRUZXh0ID0gbnVsbDsKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IKLQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5nZXRTb3VyY2VFZGl0KCk7Ci0JCX0KLQkJaWYgKHN0eWxlZFRleHQgPT0gbnVsbCkgewotCQkJaWYgKGZpbmRUZXh0LmluZGV4T2YoIiciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZmluZFRleHQgPSBmaW5kVGV4dC5yZXBsYWNlQWxsKCInIiwgRU5DT0RFRF9TSU5HTEVfUVVPVEUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocmVwbGFjZVRleHQuaW5kZXhPZigiJyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXBsYWNlVGV4dCA9IHJlcGxhY2VUZXh0LnJlcGxhY2VBbGwoIiciLCBFTkNPREVEX1NJTkdMRV9RVU9URSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJaW50IHN0YXR1cyA9IDA7Ci0JCQlzd2l0Y2ggKHN1YkFjdGlvbikgewotCQkJY2FzZSBGSU5EX1RFWFQ6Ci0JCQkJc3RhdHVzID0gZmluZFRleHQoZmluZFRleHQsIG1hdGNoRGlyLCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX1RFWFQ6Ci0JCQkJc3RhdHVzID0gcmVwbGFjZVRleHQocmVwbGFjZVRleHQsIG1hdGNoRGlyLCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX0ZJTkRfVEVYVDoKLQkJCQlzdGF0dXMgPSByZXBsYWNlRmluZFRleHQoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBtYXRjaERpciwKLQkJCQkJCW1hdGNoT3B0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFUExBQ0VfQUxMX1RFWFQ6Ci0JCQkJcmVwbGFjZUFsbChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG1hdGNoT3B0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RhdHVzID4gMCkKLQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgdGhlIGdpdmVuIHRleHQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYmUgZXNjYXBlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB0ZXh0U2l6ZSA9IHRleHQubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dFNpemU7IGkrKykgewotCQkJY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTFV0aWwuWE1MX0xUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJz4nOgotCQkJCXNiLmFwcGVuZChYTUxVdGlsLlhNTF9HVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcmJzoKLQkJCQlzYi5hcHBlbmQoWE1MVXRpbC5YTUxfQU1QKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGZpbmRUZXh0KFN0cmluZyBmaW5kVGV4dCwgaW50IG1hdGNoRGlyLCBpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWludCBzdGF0dXMgPSAwOwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoZmluZFRleHQsIG1hdGNoRGlyLAotCQkJCQltYXRjaE9wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gcmljaFRleHQKLQkJCQkJLmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GSU5EX1RFWFQsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJZmluZFRleHQsICIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHJlcGxhY2VUZXh0KFN0cmluZyByZXBsYWNlVGV4dCwgaW50IG1hdGNoRGlyLCBpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWludCBzdGF0dXMgPSAwOwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QocmVwbGFjZVRleHQpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlJFUExBQ0VfVEVYVCwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgcmVwbGFjZVRleHQsCi0JCQkJCQkJIiIgKyBtYXRjaERpciwgIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkJCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHJlcGxhY2VGaW5kVGV4dChTdHJpbmcgZmluZFRleHQsIFN0cmluZyByZXBsYWNlVGV4dCwKLQkJCWludCBtYXRjaERpciwgaW50IG1hdGNoT3B0aW9ucykgewotCQlpbnQgc3RhdHVzID0gMDsKLQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJc3R5bGVkVGV4dFJlcGxhY2VUZXh0QW5kU2VsZWN0KHJlcGxhY2VUZXh0KTsKLQkJCXN0YXR1cyA9IHN0eWxlZFRleHRGaW5kVGV4dEFuZFNlbGVjdChmaW5kVGV4dCwgbWF0Y2hEaXIsCi0JCQkJCW1hdGNoT3B0aW9ucyk7Ci0JCX0gZWxzZSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuUkVQTEFDRV9URVhULCBuZXcgU3RyaW5nW10gewotCQkJCQlyZXBsYWNlVGV4dCwgIiIgKyBtYXRjaERpciwgIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc3RhdHVzID0gcmljaFRleHQKLQkJCQkJLmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GSU5EX1RFWFQsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJZmluZFRleHQsICIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VBbGwoU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlQWxsKGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgbWF0Y2hPcHRpb25zKTsKLQkJfSBlbHNlIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5SRVBMQUNFX0FMTF9URVhULAotCQkJCQluZXcgU3RyaW5nW10geyBlc2NhcGUoZmluZFRleHQpLCBlc2NhcGUocmVwbGFjZVRleHQpLAotCQkJCQkJCSIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHN0eWxlZFRleHRGaW5kVGV4dEFuZFNlbGVjdChTdHJpbmcgZmluZFRleHQsIGludCBtYXRjaERpciwKLQkJCWludCBtYXRjaE9wdGlvbnMpIHsKLQkJUG9pbnQgc2VsZWN0aW9uT2Zmc2V0ID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQlpbnQgZmlyc3RTZWxlY3RlZE9mZnNldCA9IHNlbGVjdGlvbk9mZnNldC54OwotCQlpbnQgbGFzdFNlbGVjdGVkT2Zmc2V0ID0gc2VsZWN0aW9uT2Zmc2V0LnggKyBzZWxlY3Rpb25PZmZzZXQueSAtIDE7Ci0JCVN0cmluZyBodG1sVGV4dCA9IHN0eWxlZFRleHQuZ2V0VGV4dCgpOwotCQlpbnQgaW5kZXhPZk1hdGNoID0gLTE7Ci0JCWlmICgobWF0Y2hPcHRpb25zICYgQ0FTRV9TRU5TSVRJVkVfTUFUQ0gpID09IDApIHsKLQkJCS8vIFRPRE86IHVzZSB0b1VwcGVyQ2FzZShMb2NhbGUpIG9uY2UgbGlicmFyeSBoYXMgbG9jYWxlIGF0dHJpYnV0ZQotCQkJaHRtbFRleHQgPSBodG1sVGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJZmluZFRleHQgPSBmaW5kVGV4dC50b1VwcGVyQ2FzZSgpOwotCQl9Ci0JCWRvIHsKLQkJCWlmIChpbmRleE9mTWF0Y2ggIT0gLTEpIHsKLQkJCQlsYXN0U2VsZWN0ZWRPZmZzZXQgPSBpbmRleE9mTWF0Y2ggKyAxOwotCQkJCWZpcnN0U2VsZWN0ZWRPZmZzZXQgPSBpbmRleE9mTWF0Y2ggLSAxOwotCQkJfQotCQkJaWYgKG1hdGNoRGlyID09IEZPUldBUkRfTUFUQ0gpIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBodG1sVGV4dC5pbmRleE9mKGZpbmRUZXh0LAotCQkJCQkJbGFzdFNlbGVjdGVkT2Zmc2V0ICsgMSk7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4T2ZNYXRjaCA9IGh0bWxUZXh0Lmxhc3RJbmRleE9mKGZpbmRUZXh0LAotCQkJCQkJZmlyc3RTZWxlY3RlZE9mZnNldCAtIDEpOwotCQkJfQotCQl9IHdoaWxlIChpbmRleE9mTWF0Y2ggIT0gLTEKLQkJCQkmJiAoKG1hdGNoT3B0aW9ucyAmIFdIT0xFX1dPUkRfTUFUQ0gpID09IFdIT0xFX1dPUkRfTUFUQ0gpCi0JCQkJJiYgaXNQYXJ0T2ZXb3JkKGh0bWxUZXh0LCBpbmRleE9mTWF0Y2gsIGZpbmRUZXh0Lmxlbmd0aCgpKSk7Ci0JCWlmIChpbmRleE9mTWF0Y2ggIT0gLTEpIHsKLQkJCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoaW5kZXhPZk1hdGNoLCBmaW5kVGV4dC5sZW5ndGgoKSk7Ci0JCQlzdHlsZWRUZXh0LnNob3dTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBzZWxlY3RlZFRleHQgPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWlmICgobWF0Y2hPcHRpb25zICYgQ0FTRV9TRU5TSVRJVkVfTUFUQ0gpID09IDApIHsKLQkJCQlzZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZFRleHQuZXF1YWxzKGZpbmRUZXh0KSkgewotCQkJCWluZGV4T2ZNYXRjaCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54OwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleE9mTWF0Y2g7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHN0eWxlZFRleHRSZXBsYWNlVGV4dEFuZFNlbGVjdChTdHJpbmcgcmVwbGFjZVRleHQpIHsKLQkJUG9pbnQgc2VsZWN0aW9uT2Zmc2V0ID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2Uoc2VsZWN0aW9uT2Zmc2V0LngsIHNlbGVjdGlvbk9mZnNldC55LAotCQkJCXJlcGxhY2VUZXh0KTsKLQkJc3R5bGVkVGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25PZmZzZXQueCwgcmVwbGFjZVRleHQubGVuZ3RoKCkpOwotCi0JCXJldHVybiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0eWxlZFRleHRSZXBsYWNlQWxsKFN0cmluZyBmaW5kVGV4dCwgU3RyaW5nIHJlcGxhY2VUZXh0LAotCQkJaW50IG1hdGNoT3B0aW9ucykgewotCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCQl3aGlsZSAoc3R5bGVkVGV4dEZpbmRUZXh0QW5kU2VsZWN0KGZpbmRUZXh0LCBGT1JXQVJEX01BVENILAotCQkJCW1hdGNoT3B0aW9ucykgIT0gLTEpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlVGV4dEFuZFNlbGVjdChyZXBsYWNlVGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dvcmRDaGFyKGNoYXIgYykgewotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0T2ZXb3JkKFN0cmluZyB0ZXh0LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKGluZGV4ID4gMCkKLQkJCWlmIChpc1dvcmRDaGFyKHRleHQuY2hhckF0KGluZGV4IC0gMSkpKQotCQkJCXJldHVybiB0cnVlOwotCQlpZiAodGV4dC5sZW5ndGgoKSA+PSBpbmRleCArIGxlbmd0aCkKLQkJCWlmIChpc1dvcmRDaGFyKHRleHQuY2hhckF0KGluZGV4ICsgbGVuZ3RoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVJpY2hUZXh0IGdldFJpY2hUZXh0KCkgewotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmljaFRleHQoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0JCQlkaWFsb2cuY2xvc2UoKTsKLQkJCWRpYWxvZyA9IG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udE5hbWVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udE5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxYzVhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnROYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFNldHMgdGhlIGZvbnQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnROYW1lQWN0aW9uIGV4dGVuZHMgUmljaFRleHRDb21ib0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBGb250TmFtZUFjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCS8vIGdldCBzeXN0ZW0gZm9udHMKLQkJU29ydGVkU2V0PFN0cmluZz4gZm9udFNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJRm9udERhdGFbXSBmb250cyA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEZvbnRMaXN0KG51bGwsIHRydWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZvbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb250U2V0LmFkZCgoKEZvbnREYXRhKSBmb250c1tpXSkuZ2V0TmFtZSgpKTsKLQkJfQotCQlpbnB1dCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpbnB1dC5hZGQoUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fRGVmYXVsdEZvbnROYW1lKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBmb250U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGZvbnROYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlpbnB1dC5hZGQoZm9udE5hbWUpOwotCQl9Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBmb250TmFtZSA9IHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0Rm9udE5hbWUoKTsKLQkJCQlpZiAoZm9udE5hbWUKLQkJCQkJCS5lcXVhbHMoUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHQpCi0JCQkJCQl8fCBmb250TmFtZQotCQkJCQkJCQkuZXF1YWxzKFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0NTU19EZWZhdWx0X01vemlsbGEpCi0JCQkJCQl8fCBmb250TmFtZS5lcXVhbHMoImRlZmF1bHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWZvbnROYW1lID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fRGVmYXVsdEZvbnROYW1lOwotCQkJCX0KLQkJCQlpbnQgaW5kZXggPSBmaW5kRm9udE5hbWVJbkl0ZW1zKGZvbnROYW1lKTsKLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnMoZmFsc2UpOwotCQkJCWdldENDb21ibygpLnNlbGVjdChpbmRleCk7Ci0JCQkJc2V0Tm90aWZ5TGlzdGVuZXJzKHRydWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kRm9udE5hbWVJbkl0ZW1zKFN0cmluZyBmb250TmFtZSkgewotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBpbnB1dC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBmb250ID0gaXRlci5uZXh0KCk7Ci0JCQlpbmRleCsrOwotCQkJaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZShmb250TmFtZSkpIHsKLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBzZWxlY3RlZCA9IGdldENDb21ib1NlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGVkLmVxdWFscyhSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWUpKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfTkFNRSwgc2VsZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFNpemVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFNpemVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4ZmNiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTaXplQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBzaXplIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udFNpemVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZvbnRTaXplQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJaW5wdXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCQlpbnB1dC5hZGQoIkRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnB1dC5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnB1dC5hZGQoIjIiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnB1dC5hZGQoIjMiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnB1dC5hZGQoIjQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnB1dC5hZGQoIjUiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnB1dC5hZGQoIjYiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnB1dC5hZGQoIjciKTsgLy8kTk9OLU5MUy0xJAkJCi0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gbW96aWxsYSByZXR1cm5zICJkZWZhdWx0IiBpZiBubyBzaXplIGlzIGFwcGxpZWQKLQkJCQkvLyBJRSByZXR1cm5zIDIgaWYgbm8gc2l6ZSBpcyBhcHBsaWVkCi0JCQkJU3RyaW5nIGZvbnRTaXplID0gcmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRGb250U2l6ZSgpOwotCQkJCWludCBpbmRleCA9IC0xOwotCQkJCWlmIChmb250U2l6ZS5lcXVhbHMoImRlZmF1bHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWluZGV4ID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KGZvbnRTaXplKTsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGxlYXZlIGluZGV4IGF0IC0xIHNvIG5vdGhpbmcgaXMgc2VsZWN0ZWQKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnMoZmFsc2UpOwotCQkJCWdldENDb21ibygpLnNlbGVjdChpbmRleCk7Ci0JCQkJc2V0Tm90aWZ5TGlzdGVuZXJzKHRydWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBzZWxlY3RlZCA9IGdldENDb21ib1NlbGVjdGlvbigpOwotCQkJaWYgKCJEZWZhdWx0Ii5lcXVhbHMoc2VsZWN0ZWQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfU0laRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9TSVpFLAotCQkJCQkJc2VsZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFN0eWxlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTdHlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI1YWQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFN0eWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFNldHMgdGhlIGZvbnQgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250U3R5bGVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBGb250U3R5bGVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0KTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJCi0JCWlucHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlucHV0LmFkZChGb250U3R5bGUuTk9STUFMLmdldE5hbWUoKSk7Ci0JCWlucHV0LmFkZChGb250U3R5bGUuU0VDVElPTl9IRUFESU5HLmdldE5hbWUoKSk7Ci0JCWlucHV0LmFkZChGb250U3R5bGUuU1VCU0VDVElPTl9IRUFESU5HLmdldE5hbWUoKSk7Ci0JCWlucHV0LmFkZChGb250U3R5bGUuU1VCX1NVQlNFQ1RJT05fSEVBRElORy5nZXROYW1lKCkpOwotCQlpbnB1dC5hZGQoRm9udFN0eWxlLlFVT1RFLmdldE5hbWUoKSk7Ci0JCWlucHV0LmFkZChGb250U3R5bGUuQ09ERV9TQU1QTEUuZ2V0TmFtZSgpKTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgYmxvY2tTdHlsZSA9IHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0QmxvY2tTdHlsZSgpOwotCQkJCVN0cmluZyBuYW1lID0gRm9udFN0eWxlLmdldEZvbnRTdHlsZU5hbWUoYmxvY2tTdHlsZSk7Ci0JCQkJCi0JCQkJaW50IGluZGV4ID0gKChMaXN0PFN0cmluZz4paW5wdXQpLmluZGV4T2YobmFtZSk7Ci0JCQkJc2V0Tm90aWZ5TGlzdGVuZXJzKGZhbHNlKTsKLQkJCQlnZXRDQ29tYm8oKS5zZWxlY3QoaW5kZXgpOwotCQkJCXNldE5vdGlmeUxpc3RlbmVycyh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWQgPSBnZXRDQ29tYm9TZWxlY3Rpb24oKTsKLQkJCVN0cmluZyB2YWx1ZSA9IEZvbnRTdHlsZS5nZXRGb250U3R5bGVWYWx1ZShzZWxlY3RlZCk7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfU1RZTEUsIHZhbHVlKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSUJhc2VSaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YmIwNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotLyoqCi0gKiBUaGUgYmFzZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHRvb2xUaXBUZXh0Ci0JICogICAgICAgICAgICB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwVGV4dCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmFibGVkIHN0YXR1cyBvZiB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKTsKLQotCS8qKgotCSAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuYWJsZSB0aGUgYWN0aW9uLiBpZgotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBkaXNhYmxlIGl0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwYTUxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBidXR0b24gYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSaWNoVGV4dEFjdGlvbiBleHRlbmRzIElCYXNlUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGZvciB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzYWJsZWQgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgZGlzYWJsZWQgaW1hZ2UgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGlzYWJsZWRJbWFnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzYWJsZWQgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgZGlzYWJsZWQgaW1hZ2UgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZEltYWdlKEltYWdlIGltYWdlKTsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiByZWFkb25seSBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblJlYWRPbmx5TW9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aW9uJ3MgVG9vbEl0ZW0KLQkgKiBAcGFyYW0gdG9vbEl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sSXRlbShUb29sSXRlbSB0b29sSXRlbSk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgU1dUIFRvb2xJdGVtIFN0eWxlIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWN0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRTdHlsZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dENvbWJvQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZThlYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRDb21ib0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLmFjdGlvbnMuQ0NvbWJvQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBjb21ibyBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVudXNlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSaWNoVGV4dENvbWJvQWN0aW9uIGV4dGVuZHMgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLS8vCS8qKgotLy8JICogQWRkcyBhbiBpdGVtLgotLy8JICogCi0vLwkgKiBAcGFyYW0gaXRlbQotLy8JICogICAgICAgICAgICB0aGUgaXRlbSB0byBiZSBhZGRlZAotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBhZGRJdGVtKFN0cmluZyBpdGVtKTsKLS8vCi0vLwkvKioKLS8vCSAqIFJldHVybnMgYWxsIGl0ZW1zLgotLy8JICogCi0vLwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGl0ZW1zCi0vLwkgKi8KLS8vCXB1YmxpYyBTdHJpbmdbXSBnZXRJdGVtcygpOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgaW5kZXgpOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpOwotCQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGlvbidzIENvbnRyaWJ1dGlvbkl0ZW0KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250cmlidXRpb25JdGVtKENDb21ib0NvbnRyaWJ1dGlvbkl0ZW0gaXRlbSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSW5kZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ2NGU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSW5kZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEluZGVudHMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRlbnRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbmRlbnRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lOREVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0lOREVOVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmluZGVudEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JTkRFTlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JdGFsaWNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU4N2M0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlICdpdGFsaWMnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRhbGljQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSXRhbGljQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSVRBTElDKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDaGVja2VkKHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuaXNJdGFsaWMoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JVEFMSUMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5Q2VudGVyQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlDZW50ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxYjk3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlDZW50ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQ2VudGVyIGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEp1c3RpZnlDZW50ZXJBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5Q2VudGVyQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19KVVNUSUZZX0NFTlRFUik7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9DRU5URVIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlGdWxsQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlGdWxsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMmIxMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5RnVsbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBGdWxseSBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5RnVsbEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEp1c3RpZnlGdWxsQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19KVVNUSUZZX0ZVTEwpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5KVVNUSUZZX0ZVTEwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlMZWZ0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlMZWZ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTE1OWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5TGVmdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBMZWZ0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEp1c3RpZnlMZWZ0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSnVzdGlmeUxlZnRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfTEVGVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfTEVGVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeVJpZ2h0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlSaWdodEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2UwODU2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlSaWdodEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBSaWdodCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5UmlnaHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5UmlnaHRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfUklHSFQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9SSUdIVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTk1NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEluZGVudHMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRkZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3V0ZGVudEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfT1VUREVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX09VVERFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLk9VVERFTlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1Bhc3RlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1Bhc3RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MThkZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuQ2xpcGJvYXJkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFBhc3RlcyB0ZXh0IGZyb20gdGhlIGNsaXBib2FyZCBvbnRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGFzdGVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1VSTCA9ICJTb3VyY2VVUkw6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTV9FWFQgPSAiLmh0bSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0VYVCA9ICIuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSFJFRl9SRUZFUkVOQ0VTID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSJocmVmXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9pbWFnZV9yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8KGltZ3xpZnJhbWUpLio/c3JjXFxzKj1cXHMqXCIpKC4qPykoXCIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBzb3VyY2VVUkxTdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBSRVNPVVJDRVMgPSAicmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGFzdGVBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1BBU1RFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfUEFTVEUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCWxvZ2dlciA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJY29weUxpbmtSZXNvdXJjZXMocmljaFRleHQpOwotCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IKLQkJCQkJJiYgKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkKLQkJCQkJCS5nZXRTb3VyY2VFZGl0KCk7Ci0JCQkJc3R5bGVkVGV4dC5wYXN0ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuUEFTVEUsIHNvdXJjZVVSTFN0cik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGxpbmsgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlMaW5rUmVzb3VyY2VzKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQl0cnkgewotCQkJc291cmNlVVJMU3RyID0gQ2xpcGJvYXJkVXRpbC5nZXRIVE1MU291cmNlVVJMKCk7Ci0JCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQlTdHJpbmcgaHRtbCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhIVE1MVHJhbnNmZXIKLQkJCQkJLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGh0bWwgIT0gbnVsbCAmJiBodG1sLmxlbmd0aCgpID4gMCkgewotCQkJCVN0cmluZyBiYXNlUGF0aCA9IHJpY2hUZXh0LmdldEJhc2VQYXRoKCk7Ci0JCQkJVVJMIHNvdXJjZVVSTCA9IG51bGw7Ci0JCQkJaWYgKHNvdXJjZVVSTFN0ciA9PSBudWxsIHx8IHNvdXJjZVVSTFN0ci5sZW5ndGgoKSA9PSAwCi0JCQkJCQl8fCBzb3VyY2VVUkxTdHIuZXF1YWxzKCJhYm91dDpibGFuayIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc291cmNlVVJMID0gcmljaFRleHQuZ2V0Q29weVVSTCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNvdXJjZVVSTCA9IG5ldyBVUkwoc291cmNlVVJMU3RyKTsKLQkJCQl9Ci0KLQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBIUkVGX1JFRkVSRU5DRVMubWF0Y2hlcihodG1sKTsKLQkJCQl3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLQkJCQkJU3RyaW5nIGhyZWYgPSBOZXRVdGlsLmRlY29kZVVSTChtYXRjaGVyLmdyb3VwKDEpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSTCBocmVmVVJMID0gbmV3IFVSTChzb3VyY2VVUkwsIGhyZWYpOwotCQkJCQkJU3RyaW5nIHNjaGVtZSA9IGhyZWZVUkwuZ2V0UHJvdG9jb2woKTsKLQkJCQkJCWlmIChzY2hlbWUgIT0gbnVsbAotCQkJCQkJCQkmJiBzY2hlbWUKLQkJCQkJCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShOZXRVdGlsLkZJTEVfU0NIRU1FKSkgewotCQkJCQkJCVN0cmluZyB1cmwgPSBocmVmVVJMLmdldFBhdGgoKTsKLQkJCQkJCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShOZXRVdGlsLmRlY29kZVVSTCh1cmwpKTsKLQkJCQkJCQlGaWxlIHRndEZpbGUgPSBudWxsOwotCQkJCQkJCUZpbGUgdGd0RGlyID0gbnVsbDsKLQkJCQkJCQlpZiAoaHJlZi5zdGFydHNXaXRoKCIjIikgfHwgc291cmNlVVJMLnNhbWVGaWxlKGhyZWZVUkwpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfSBlbHNlIGlmIChocmVmLnN0YXJ0c1dpdGgoUkVTT1VSQ0VTKSB8fCBocmVmLnN0YXJ0c1dpdGgoIi4vIiArIFJFU09VUkNFUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0Z3RGaWxlID0gbmV3IEZpbGUoYmFzZVBhdGgsIGhyZWYpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgcmVzUGF0aCA9IGdldFN1YmRpcmVjdG9yeU9mUmVzb3VyY2VzKGhyZWYpOwotCQkJCQkJCQl0Z3RGaWxlID0gbmV3IEZpbGUoYmFzZVBhdGggKyBSRVNPVVJDRVMsIHJlc1BhdGgpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlOwotCQkJCQkJCX0KLQkJCQkJCQl0Z3REaXIubWtkaXJzKCk7Ci0JCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGd0RGlyKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCW1hdGNoZXIgPSBwX2ltYWdlX3JlZi5tYXRjaGVyKGh0bWwpOwotCQkJCXdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewotCQkJCQlTdHJpbmcgc3JjID0gTmV0VXRpbC5kZWNvZGVVUkwobWF0Y2hlci5ncm91cCgzKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVUkwgc3JjVVJMID0gbmV3IFVSTChzb3VyY2VVUkwsIHNyYyk7Ci0JCQkJCQlTdHJpbmcgc2NoZW1lID0gc3JjVVJMLmdldFByb3RvY29sKCk7Ci0JCQkJCQlpZiAoc2NoZW1lICE9IG51bGwKLQkJCQkJCQkJJiYgc2NoZW1lLmVxdWFsc0lnbm9yZUNhc2UoTmV0VXRpbC5GSUxFX1NDSEVNRSkpIHsKLQkJCQkJCQlGaWxlIHNyY0ZpbGUgPSBudWxsOwotCQkJCQkJCVN0cmluZyBhdXRob3JpdHkgPSBzcmNVUkwuZ2V0QXV0aG9yaXR5KCk7Ci0JCQkJCQkJaWYgKGF1dGhvcml0eSAhPSBudWxsKSB7Ci0JCQkJCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShOZXRVdGlsLmRlY29kZVVSTChhdXRob3JpdHkgKyBzcmNVUkwuZ2V0UGF0aCgpKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc3JjRmlsZSA9IG5ldyBGaWxlKE5ldFV0aWwuZGVjb2RlVVJMKHNyY1VSTC5nZXRQYXRoKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJRmlsZSB0Z3RGaWxlID0gbnVsbDsKLQkJCQkJCQlGaWxlIHRndERpciA9IG51bGw7Ci0JCQkJCQkJaWYgKHNyYy5zdGFydHNXaXRoKFJFU09VUkNFUykgfHwgc3JjLnN0YXJ0c1dpdGgoIi4vIiArIFJFU09VUkNFUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0Z3RGaWxlID0gbmV3IEZpbGUoYmFzZVBhdGgsIHNyYyk7Ci0JCQkJCQkJCXRndERpciA9IHRndEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCVN0cmluZyByZXNQYXRoID0gZ2V0U3ViZGlyZWN0b3J5T2ZSZXNvdXJjZXMoc3JjKTsKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoICsgUkVTT1VSQ0VTLCByZXNQYXRoKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGd0RGlyLm1rZGlycygpOwotCQkJCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRndERpcik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIEhUTUwgY29udGVudCBmcm9tIHRoZSBjbGlwYm9hcmQgYW5kIHJldHVybnMgdGhlIHNvdXJjZQotCSAqIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbENvbnRlbnQKLQkgKiAgICAgICAgICAgIHRoZSBIVE1MIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkCi0JICogQHJldHVybiB0aGUgc291cmNlIFVSTCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlVVJMKFN0cmluZyBodG1sQ29udGVudCkgewotCQlTdHJpbmcgc291cmNlVVJMID0gbnVsbDsKLQkJaW50IHNvdXJjZVVSTEluZGV4ID0gaHRtbENvbnRlbnQuaW5kZXhPZihTT1VSQ0VfVVJMKTsKLQkJaWYgKHNvdXJjZVVSTEluZGV4ID4gMCkgewotCQkJc291cmNlVVJMID0gaHRtbENvbnRlbnQuc3Vic3RyaW5nKHNvdXJjZVVSTEluZGV4Ci0JCQkJCSsgU09VUkNFX1VSTC5sZW5ndGgoKSk7Ci0JCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwuc3Vic3RyaW5nKDAsIHNvdXJjZVVSTAotCQkJCQkuaW5kZXhPZihGaWxlVXRpbC5MSU5FX1NFUCkpOwotCQkJaWYgKHNvdXJjZVVSTC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEhUTV9FWFQpCi0JCQkJCXx8IHNvdXJjZVVSTC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEhUTUxfRVhUKSkgewotCQkJCXNvdXJjZVVSTCA9IHNvdXJjZVVSTC5zdWJzdHJpbmcoMCwgc291cmNlVVJMLmluZGV4T2YoRmlsZVV0aWwKLQkJCQkJCS5nZXRGaWxlTmFtZShzb3VyY2VVUkwpKSAtIDEpOwotCQkJCXNvdXJjZVVSTCA9IHNvdXJjZVVSTC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQl9Ci0JCQlzb3VyY2VVUkwgPSBGaWxlVXRpbC5hcHBlbmRTZXBhcmF0b3Ioc291cmNlVVJMLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHNvdXJjZVVSTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1YmRpcmVjdG9yeU9mUmVzb3VyY2VzKFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgcmVzX2lkeCA9IHBhdGguaW5kZXhPZihSRVNPVVJDRVMpOwotCQlpZiAocmVzX2lkeCAhPSAtMSkgewotCQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IG5ldyBTdGFjazxTdHJpbmc+KCk7Ci0JCQlGaWxlIHJlbGF0aXZlID0gbmV3IEZpbGUocGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJd2hpbGUgKCFyZWxhdGl2ZS5nZXROYW1lKCkuZXF1YWxzKFJFU09VUkNFUykpIHsKLQkJCQlzdGFjay5wdXNoKHJlbGF0aXZlLmdldE5hbWUoKSk7Ci0JCQkJcmVsYXRpdmUgPSByZWxhdGl2ZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCQl3aGlsZSAoIXN0YWNrLmlzRW1wdHkoKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdCArIChTdHJpbmcpc3RhY2sucG9wKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1Bhc3RlUGxhaW5UZXh0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1Bhc3RlUGxhaW5UZXh0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzcxY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZVBsYWluVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIFBhc3RlUGxhaW5UZXh0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBhc3RlUGxhaW5UZXh0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19QQVNURV9QTEFJTl9URVhUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfUEFTVEVfUExBSU5fVEVYVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnBhc3RlUGxhaW5UZXh0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJLy8gZ2V0IHRleHQgZnJvbSBjbGlwYm9hcmQKLQkJCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKFRleHRUcmFuc2ZlcgotCQkJCQkuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdGV4dCA9IFN0clV0aWwuY29udmVydE5ld2xpbmVzVG9IVE1MKHRleHQpOwotCQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCSgoUmljaFRleHRFZGl0b3IpcmljaFRleHQpLmFkZEhUTUwodGV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9IVE1MLCB0ZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1ZmJjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSByaWNoIHRleHQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmljaFRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJvdGVjdGVkIElSaWNoVGV4dCByaWNoVGV4dDsKLQkKLQlwcm90ZWN0ZWQgVG9vbEl0ZW0gdG9vbEl0ZW07Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZk1lbnVBY3Rpb25zID0gbmV3IExpbmtlZEhhc2hTZXQ8SUFjdGlvbj4oKTsKLQkKLSAgICBwcm90ZWN0ZWQgSU1lbnVDcmVhdG9yIG1lbnVDcmVhdG9yID0gbmV3IElNZW51Q3JlYXRvcigpIHsKLQotICAgIAlwcml2YXRlIE1lbnVNYW5hZ2VyIGRyb3BEb3duTWVudU1ncjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyB0aGUgbWVudSBtYW5hZ2VyIGZvciB0aGUgZHJvcC1kb3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BEb3duTWVudU1ncigpIHsKLSAgICAgICAgICAgIGlmIChkcm9wRG93bk1lbnVNZ3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRyb3BEb3duTWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8SUFjdGlvbj4gaXRlciA9IGdldE1lbnVBY3Rpb25zKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAJSUFjdGlvbiBpdGVtID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTWVudU1nci5hZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotICAgICAgICAgICAgY3JlYXRlRHJvcERvd25NZW51TWdyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZHJvcERvd25NZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnUpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0gICAgICAgICAgICBjcmVhdGVEcm9wRG93bk1lbnVNZ3IoKTsKLSAgICAgICAgICAgIE1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0gICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZHJvcERvd25NZW51TWdyLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIG5ld0l0ZW0gPSBpdGVtOwotICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotICAgICAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBY3Rpb25Db250cmlidXRpb25JdGVtKSBpdGVtKS5nZXRBY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld0l0ZW0uZmlsbChtZW51LCAtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWVudTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2Rpc3Bvc2UoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIGlmIChkcm9wRG93bk1lbnVNZ3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRyb3BEb3duTWVudU1nci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgZHJvcERvd25NZW51TWdyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dEFjdGlvbihJUmljaFRleHQgcmljaFRleHQsIGludCBzdHlsZSkgewotCQlzdXBlcihudWxsLCBzdHlsZSk7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gcmVhZG9ubHkgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5SZWFkT25seU1vZGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRvb2xJdGVtKFRvb2xJdGVtIHRvb2xJdGVtKSB7Ci0JCXRoaXMudG9vbEl0ZW0gPSB0b29sSXRlbTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlleGVjdXRlKHJpY2hUZXh0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZXRNZW51QWN0aW9ucygpIHsKLQkJcmV0dXJuIGZNZW51QWN0aW9uczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uVG9NZW51KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWZNZW51QWN0aW9ucy5hZGQoYWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dENvbWJvQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0Q29tYm9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyOTZkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0Q29tYm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5hY3Rpb25zLkNDb21ib0NvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHJpY2ggdGV4dCBjb21ibyBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSaWNoVGV4dENvbWJvQWN0aW9uIGV4dGVuZHMgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbSB7Ci0JCi0JcHJvdGVjdGVkIElSaWNoVGV4dCByaWNoVGV4dDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRvb2xUaXBUZXh0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90aWZ5TGlzdGVuZXJzID0gZmFsc2U7Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dENvbWJvQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0Q29tYm9BY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoU1dULlJFQURfT05MWSB8IFNXVC5GTEFUIHwgU1dULkJPUkRFUiB8IHN0eWxlKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbjxTdHJpbmc+IGdldElucHV0KCk7Ci0JCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc2V0SW5wdXQoZ2V0SW5wdXQoKSk7Ci0JCXNldE5vdGlmeUxpc3RlbmVycyh0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDQ29tYm9TZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRDQ29tYm8oKSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBnZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJcmV0dXJuIGdldENDb21ibygpLmdldEl0ZW0oaW5kZXgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIHRvb2xUaXBUZXh0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0b29sVGlwVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdG9vbFRpcFRleHQpIHsKLQkJdGhpcy50b29sVGlwVGV4dCA9IHRvb2xUaXBUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5hYmxlIHRoZSBhY3Rpb24uIGlmCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGRpc2FibGUgaXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWlmIChub3RpZnlMaXN0ZW5lcnMpIHsKLQkJCWV4ZWN1dGUocmljaFRleHQpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBub3RpZnlMaXN0ZW5lcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm90aWZ5TGlzdGVuZXJzKGJvb2xlYW4gbm90aWZ5TGlzdGVuZXJzKSB7Ci0JCXRoaXMubm90aWZ5TGlzdGVuZXJzID0gbm90aWZ5TGlzdGVuZXJzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3Vic2NyaXB0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjVjMGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3Vic2NyaXB0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgc3Vic2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3Vic2NyaXB0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3Vic2NyaXB0QWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfU1VCU0NSSVBUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfU1VCU0NSSVBUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDaGVja2VkKHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuaXNTdWJzY3JpcHQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TVUJTQ1JJUFQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdXBlcnNjcmlwdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdXBlcnNjcmlwdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Y0NGU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3VwZXJzY3JpcHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSBzdXBlcnNjcmlwdCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQKLSAqIGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBlcnNjcmlwdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN1cGVyc2NyaXB0QWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfU1VQRVJTQ1JJUFQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19TVVBFUlNDUklQVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDaGVja2VkKHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuaXNTdXBlcnNjcmlwdCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNVUEVSU0NSSVBUKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVGlkeUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZWNlMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogUnVucyBKVGlkeSBvbiB0aGUgSFRNTAotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFRpZHlBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0JCi0JYm9vbGVhbiBmb3JjZU91dHB1dCA9IGZhbHNlOwotCWJvb2xlYW4gbWFrZUJhcmUgPSBmYWxzZTsKLQlib29sZWFuIHdvcmQyMDAwID0gZmFsc2U7Ci0JCi0JLy8gVGhlIEhUTUwgc291cmNlIGZvcm1hdHRlci4KLQlwcm90ZWN0ZWQgSFRNTEZvcm1hdHRlciBodG1sRm9ybWF0dGVyOwotCi0JCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUaWR5QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCwgYm9vbGVhbiBmb3JjZU91dHB1dCwgYm9vbGVhbiBtYWtlQmFyZSwgYm9vbGVhbiB3b3JkMjAwMCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXRoaXMuZm9yY2VPdXRwdXQgPSBmb3JjZU91dHB1dDsKLQkJdGhpcy5tYWtlQmFyZSA9IG1ha2VCYXJlOwotCQl0aGlzLndvcmQyMDAwID0gd29yZDIwMDA7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19USURZKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfVElEWSk7Ci0JCWh0bWxGb3JtYXR0ZXIgPSBuZXcgSFRNTEZvcm1hdHRlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQkvLyBnZXQgY3VycmVudCB0ZXh0Ci0JCVN0cmluZyBodG1sOwotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcikgewotCQkJaHRtbCA9ICgoUmljaFRleHRFZGl0b3IpcmljaFRleHQpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCWh0bWwgPSByaWNoVGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQkJLy8gY2FsbCBKVGlkeSB3aXRoIHRoZSBvcHRpb25zCi0JCXRyeSB7Ci0JCQlodG1sID0gaHRtbEZvcm1hdHRlci5mb3JtYXRIVE1MKGh0bWwsIGZhbHNlLCBmb3JjZU91dHB1dCwgbWFrZUJhcmUsIHdvcmQyMDAwKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJLy8gc2V0IHRleHQKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCSgoUmljaFRleHRFZGl0b3IpcmljaFRleHQpLnNldFRleHQoaHRtbCk7Ci0JCX0gZWxzZSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KGh0bWwpOwotCQl9Ci0JCXJpY2hUZXh0LmNoZWNrTW9kaWZ5KCk7Ci0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uR3JvdXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVGlkeUFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OGNhYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIFJ1bnMgSlRpZHkgb24gdGhlIEhUTUwKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaWR5QWN0aW9uR3JvdXAgZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0JCi0JVGlkeUFjdGlvbiB0aWR5QWN0aW9uRGVmYXVsdDsKLQlUaWR5QWN0aW9uIHRpZHlBY3Rpb25DbGVhbk1TOwotCVRpZHlBY3Rpb24gdGlkeUFjdGlvbkNsZWFuV29yZDIwMDA7Ci0KLQlwdWJsaWMgVGlkeUFjdGlvbkdyb3VwKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19EUk9QX0RPV05fTUVOVSk7Ci0JCS8vIFRPRE8gbmVlZCBpbWFnZQotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfVElEWSk7Ci0JCS8vIFRPRE8gbmVlZCBpbWFnZQotLy8JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1BBU1RFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMudGlkeV9jbGVhbl90ZXh0KTsKLQkJCi0JCWNyZWF0ZUFjdGlvbnMoKTsKLQkJc2V0TWVudUNyZWF0b3IobWVudUNyZWF0b3IpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJdGlkeUFjdGlvbkRlZmF1bHQgPSBuZXcgVGlkeUFjdGlvbihyaWNoVGV4dCwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLQkJdGlkeUFjdGlvbkRlZmF1bHQuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuX3RleHQpOwotCQl0aWR5QWN0aW9uRGVmYXVsdC5zZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuX3Rvb2xUaXBUZXh0KTsKLQkJdGlkeUFjdGlvbkNsZWFuTVMgPSBuZXcgVGlkeUFjdGlvbihyaWNoVGV4dCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCQl0aWR5QWN0aW9uQ2xlYW5NUy5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5lcl90ZXh0KTsKLQkJdGlkeUFjdGlvbkNsZWFuTVMuc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMudGlkeV9jbGVhbmVyX3Rvb2xUaXBUZXh0KTsKLQkJdGlkeUFjdGlvbkNsZWFuV29yZDIwMDAgPSBuZXcgVGlkeUFjdGlvbihyaWNoVGV4dCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCXRpZHlBY3Rpb25DbGVhbldvcmQyMDAwLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudGlkeV9jbGVhbmVzdF90ZXh0KTsKLQkJdGlkeUFjdGlvbkNsZWFuV29yZDIwMDAuc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMudGlkeV9jbGVhbmVzdF90b29sVGlwVGV4dCk7Ci0JCWFkZEFjdGlvblRvTWVudSh0aWR5QWN0aW9uRGVmYXVsdCk7Ci0JCWFkZEFjdGlvblRvTWVudSh0aWR5QWN0aW9uQ2xlYW5NUyk7Ci0JCWFkZEFjdGlvblRvTWVudSh0aWR5QWN0aW9uQ2xlYW5Xb3JkMjAwMCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JCS8vIGNhbGwgbm9ybWFsIGNsZWFuCi0JCXRpZHlBY3Rpb25EZWZhdWx0LmV4ZWN1dGUocmljaFRleHQpOwotCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTdkYjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgdW5kZXJsaW5lIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5kZXJsaW5lQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVW5kZXJsaW5lQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfVU5ERVJMSU5FKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfVU5ERVJMSU5FKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMudW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDaGVja2VkKHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuaXNVbmRlckxpbmUoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5VTkRFUkxJTkUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkOWU2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVkaXRpbmcgYWN0aW9ucyBmb3IgdGhlIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRJbWFnZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRJbWFnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZhNjM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkSW1hZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBIVE1MCi0gKiAmbHQ7aW1hZ2UmZ3Q7IHRhZyBpbiB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRJbWFnZURpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgewotCi0JcHJvdGVjdGVkIEltYWdlIGltYWdlID0gbmV3IEltYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB1cmxUZXh0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uQWRhcHRlciBicm93c2VTZWxlY3Rpb25BZGFwdGVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQlkaWFsb2cKLQkJCQkJLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkiKi5naWYiLCAiKi5qcGciLCAiKi5ibXAiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3RyaW5nIGltYWdlRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwgJiYgaW1hZ2VGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHVybCA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCQl1cmxUZXh0LnNldFRleHQodXJsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciB1cmxUZXh0TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXB1YmxpYyBBZGRJbWFnZURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgdXJsTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXVybExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudXJsTGFiZWxfdGV4dCk7Ci0JCXVybFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCXVybFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXVybFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodXJsVGV4dExpc3RlbmVyKTsKLQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihicm93c2VTZWxlY3Rpb25BZGFwdGVyKTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkSW1hZ2VEaWFsb2dfdGl0bGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgdXJsID0gdXJsVGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbWFnZS5zZXRVUkwodXJsKTsKLQkJfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPkltYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZExpbmtEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkTGlua0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjc2ZjBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkTGlua0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBIVE1MCi0gKiAmbHQ7YSZndDsgdGFnIGluIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZExpbmtEaWFsb2cgZXh0ZW5kcyBCYXNlRGlhbG9nIHsKLQotCXByb3RlY3RlZCBMaW5rIGxpbmsgPSBuZXcgTGluaygpOwotCi0JcHJvdGVjdGVkIFRleHQgdXJsVGV4dDsKLQotCXByb3RlY3RlZCBTdHJpbmcgYmFzZVBhdGg7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCB1cmxMYWJlbDsKLQotCXByb3RlY3RlZCBUZXh0IHVybERpc3BsYXlOYW1lVGV4dDsKLQotCXByb3RlY3RlZCBMYWJlbCB1cmxEaXNwbGF5TmFtZUxhYmVsOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIHVybFRleHRNb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsCi0JICovCi0JcHVibGljIEFkZExpbmtEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJdXJsTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXVybExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudXJsTGFiZWxfdGV4dCk7Ci0JCXVybFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCXVybFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXVybFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodXJsVGV4dE1vZGlmeUxpc3RlbmVyKTsKLQotCQl1cmxEaXNwbGF5TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmxEaXNwbGF5TmFtZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0KTsKLQkJdXJsRGlzcGxheU5hbWVUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhMi53aWR0aEhpbnQgPSAzMDA7Ci0JCXVybERpc3BsYXlOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZExpbmtEaWFsb2dfdGl0bGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgdXJsID0gdXJsVGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsaW5rLnNldFVSTCh1cmwpOwotCQkJbGluay5zZXROYW1lKHVybERpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCkpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGxpbmsuCi0JICogCi0JICogQHJldHVybiBhbiA8Y29kZT5MaW5rPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgTGluayBnZXRMaW5rKCkgewotCQlyZXR1cm4gbGluazsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZFRhYmxlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZFRhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ODNkM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRUYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgSFRNTAotICogJmx0O3RhYmxlJmd0OyB0YWcgaW4gdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVGFibGVEaWFsb2cgZXh0ZW5kcyBCYXNlRGlhbG9nIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JPV1MgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09MVU1OUyA9IDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XSURUSCA9ICI4NSUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUQUJMRV9TVFlMRV9MQUJFTFMgPSB7Ci0JCQlSaWNoVGV4dFJlc291cmNlcy50YWJsZUhlYWRlck5vbmVfdGV4dCwKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyQ29sc190ZXh0LAotCQkJUmljaFRleHRSZXNvdXJjZXMudGFibGVIZWFkZXJSb3dzX3RleHQsCi0JCQlSaWNoVGV4dFJlc291cmNlcy50YWJsZUhlYWRlckJvdGhfdGV4dCwgfTsKLQotCXByaXZhdGUgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoKTsKLQotCXByaXZhdGUgVGV4dCByb3dzVGV4dDsKLQotCXByaXZhdGUgVGV4dCBjb2xzVGV4dDsKLQotCXByaXZhdGUgVGV4dCB3aWR0aFRleHQ7Ci0KLQlwcml2YXRlIENvbWJvIHRhYmxlVHlwZUNvbWJvOwotCi0JcHJpdmF0ZSBUZXh0IHN1bW1hcnlUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGNhcHRpb25UZXh0OwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgcm93cyA9IEludGVnZXIucGFyc2VJbnQocm93c1RleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCWludCBjb2xzID0gSW50ZWdlci5wYXJzZUludChjb2xzVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJU3RyaW5nIHdpZHRoID0gd2lkdGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQocm93cyA+IDAgJiYgY29scyA+IDAKLQkJCQkJCQkmJiB3aWR0aC5sZW5ndGgoKSA+IDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKi8KLQlwdWJsaWMgQWRkVGFibGVEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJTGFiZWwgcm93c0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyb3dzTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5yb3dzTGFiZWxfdGV4dCk7Ci0KLQkJcm93c1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlyb3dzVGV4dC5zZXRUZXh0TGltaXQoMik7Ci0JCXJvd3NUZXh0LnNldFRleHQoIiIgKyBERUZBVUxUX1JPV1MpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlyb3dzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlyb3dzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgY29sc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xzTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jb2x1bW5zTGFiZWxfdGV4dCk7Ci0KLQkJY29sc1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQljb2xzVGV4dC5zZXRUZXh0TGltaXQoMik7Ci0JCWNvbHNUZXh0LnNldFRleHQoIiIgKyBERUZBVUxUX0NPTFVNTlMpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQljb2xzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb2xzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgd2lkdGhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJd2lkdGhMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLndpZHRoTGFiZWxfdGV4dCk7Ci0KLQkJd2lkdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJd2lkdGhUZXh0LnNldFRleHQoIiIgKyBERUZBVUxUX1dJRFRIKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJd2lkdGhUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgaGVhZGVyVHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQloZWFkZXJUeXBlTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy50YWJsZVN0eWxlTGFiZWxfdGV4dCk7Ci0KLQkJdGFibGVUeXBlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXRhYmxlVHlwZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0YWJsZVR5cGVDb21iby5zZXRJdGVtcyhUQUJMRV9TVFlMRV9MQUJFTFMpOwotCQl0YWJsZVR5cGVDb21iby5zZXRUZXh0KFRBQkxFX1NUWUxFX0xBQkVMU1swXSk7Ci0KLQkJTGFiZWwgc3VtbWFyeUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzdW1tYXJ5TGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5zdW1tYXJ5TGFiZWxfdGV4dCk7Ci0JCXN1bW1hcnlUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCXN1bW1hcnlUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJTGFiZWwgY2FwdGlvbkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljYXB0aW9uTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jYXB0aW9uTGFiZWxfdGV4dCk7Ci0JCWNhcHRpb25UZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWNhcHRpb25UZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZFRhYmxlRGlhbG9nX3RpdGxlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgcm93c1ZhbHVlID0gcm93c1RleHQuZ2V0VGV4dCgpOwotCQlpZiAocm93c1ZhbHVlICE9IG51bGwgJiYgcm93c1ZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgcm93cyA9IEludGVnZXIucGFyc2VJbnQocm93c1ZhbHVlKTsKLQkJCQl0YWJsZS5zZXRSb3dzKHJvd3MpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0YWJsZS5zZXRSb3dzKERFRkFVTFRfUk9XUyk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgY29sc1ZhbHVlID0gY29sc1RleHQuZ2V0VGV4dCgpOwotCQlpZiAoY29sc1ZhbHVlICE9IG51bGwgJiYgY29sc1ZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgY29scyA9IEludGVnZXIucGFyc2VJbnQoY29sc1ZhbHVlKTsKLQkJCQl0YWJsZS5zZXRDb2x1bW5zKGNvbHMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0YWJsZS5zZXRDb2x1bW5zKERFRkFVTFRfQ09MVU1OUyk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgd2lkdGhWYWx1ZSA9IHdpZHRoVGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh3aWR0aFZhbHVlICE9IG51bGwgJiYgd2lkdGhWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRhYmxlLnNldFdpZHRoKHdpZHRoVmFsdWUpOwotCQl9IGVsc2UgewotCQkJdGFibGUuc2V0V2lkdGgoREVGQVVMVF9XSURUSCk7Ci0JCX0KLQotCQl0YWJsZS5zZXRTdW1tYXJ5KHN1bW1hcnlUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQl0YWJsZS5zZXRDYXB0aW9uKGNhcHRpb25UZXh0LmdldFRleHQoKS50cmltKCkpOwotCQl0YWJsZS5zZXRUYWJsZUhlYWRlcnModGFibGVUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgdGFibGUuCi0JICogCi0JICogQHJldHVybiBhbiA8Y29kZT5UYWJsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0Jhc2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjMzljOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0Jhc2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBkaWFsb2dzIHVzZWQgYnkgdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmFzZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQkvLyBBIGxvZ2dlciBmb3IgbG9nZ2luZyBydW50aW1lIHdhcm5pbmdzIGFuZCBlcnJvcnMuCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvLyBUaGUgT0sgYnV0dG9uLgotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQkvLyBUaGUgQ2FuY2VsIGJ1dHRvbi4KLQlwcm90ZWN0ZWQgQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXB1YmxpYyBCYXNlRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBPSyBidXR0b24uCi0JCW9rQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljYW5jZWxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9GaW5kUmVwbGFjZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9GaW5kUmVwbGFjZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTY0MDA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvRmluZFJlcGxhY2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgc2VhcmNoIGFuZCByZXBsYWNlIHN0cmluZ3MgYW5kIG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlcGxhY2VEaWFsb2cgZXh0ZW5kcyBCYXNlRGlhbG9nIHsKLQotCXByaXZhdGUgRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmluZE9ubHk7Ci0KLQlwcml2YXRlIFRleHQgZmluZFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgcmVwbGFjZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hCYWNrd2FyZFJhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY2FzZVNlbnNpdGl2ZUNoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gd2hvbGVXb3JkQ2hlY2tib3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmaW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVwbGFjZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlcGxhY2VGaW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVwbGFjZUFsbEJ1dHRvbjsKLQotCXByaXZhdGUgTGFiZWwgc3RhdHVzTGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBGaW5kIGFuZCBSZXBsYWNlIGFjdGlvbgotCSAqIEBwYXJhbSBmaW5kT25seQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRpc2FibGUgdGhlIHJlcGxhY2UgYW5kIHJlcGxhY2UgYWxsCi0JICogICAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMKLQkgKi8KLQlwdWJsaWMgRmluZFJlcGxhY2VEaWFsb2coU2hlbGwgcGFyZW50LCBGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbiwKLQkJCWJvb2xlYW4gZmluZE9ubHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuTU9ERUxFU1MgfCBnZXREZWZhdWx0T3JpZW50YXRpb24oKSk7Ci0JCXNldEJsb2NrT25PcGVuKGZhbHNlKTsKLQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IGZpbmRSZXBsYWNlQWN0aW9uOwotCQl0aGlzLmZpbmRPbmx5ID0gZmluZE9ubHk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCi0JCUNvbXBvc2l0ZSB0ZXh0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGV4dENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJdGV4dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBmaW5kTGFiZWwgPSBuZXcgTGFiZWwodGV4dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmaW5kTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5maW5kTGFiZWxfdGV4dCk7Ci0JCWZpbmRUZXh0ID0gbmV3IFRleHQodGV4dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQkJZmluZFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWZpbmRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChmaW5kQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJZmluZEJ1dHRvbgotCQkJCQkJCS5zZXRFbmFibGVkKGZpbmRUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCQl9Ci0JCQkJaWYgKHJlcGxhY2VBbGxCdXR0b24gIT0gbnVsbCAmJiAhZmluZE9ubHkpIHsKLQkJCQkJcmVwbGFjZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGZpbmRUZXh0LmdldFRleHQoKS50cmltKCkKLQkJCQkJCQkubGVuZ3RoKCkgPiAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUxhYmVsIHJlcGxhY2VMYWJlbCA9IG5ldyBMYWJlbCh0ZXh0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJlcGxhY2VMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJlcGxhY2VMYWJlbF90ZXh0KTsKLQkJcmVwbGFjZVRleHQgPSBuZXcgVGV4dCh0ZXh0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcmVwbGFjZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWlmIChmaW5kT25seSkgewotCQkJcmVwbGFjZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXBsYWNlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWlmIChyZXBsYWNlQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCQkuZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQkJfQotCQkJCQlpZiAocmVwbGFjZUZpbmRCdXR0b24gIT0gbnVsbCkgewotCQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCQkuZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJQ29tcG9zaXRlIG9wdGlvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25zQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCW9wdGlvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJR3JvdXAgZGlyZWN0aW9uR3JvdXAgPSBuZXcgR3JvdXAob3B0aW9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkaXJlY3Rpb25Hcm91cC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmRpcmVjdGlvbkdyb3VwX3RleHQpOwotCQlkaXJlY3Rpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJZGlyZWN0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oZGlyZWN0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvcndhcmRSYWRpb0J1dHRvbl90ZXh0KTsKLQkJc2VhcmNoRm9yd2FyZFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJc2VhcmNoQmFja3dhcmRSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oZGlyZWN0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNlYXJjaEJhY2t3YXJkUmFkaW9CdXR0b24KLQkJCQkuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQpOwotCi0JCUdyb3VwIG9wdGlvbnNHcm91cCA9IG5ldyBHcm91cChvcHRpb25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbnNHcm91cC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLm9wdGlvbnNHcm91cF90ZXh0KTsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNhc2VTZW5zaXRpdmVDaGVja2JveCA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3gKLQkJCQkuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dCk7Ci0JCXdob2xlV29yZENoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdob2xlV29yZENoZWNrYm94LnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMud2hvbGVXb3JkQ2hlY2tib3hfdGV4dCk7Ci0KLQkJc3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXN0YXR1c0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5maW5kUmVwbGFjZURpYWxvZ190aXRsZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAxLAotCQkJCVJpY2hUZXh0UmVzb3VyY2VzLmZpbmRCdXR0b25fdGV4dCwgdHJ1ZSk7Ci0JCWZpbmRCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAxKTsKLQkJZmluZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbmRSZXBsYWNlQWN0aW9uLnJ1bihGaW5kUmVwbGFjZUFjdGlvbi5GSU5EX1RFWFQsCi0JCQkJCQlnZXRGaW5kVGV4dCgpLCBnZXRSZXBsYWNlVGV4dCgpLCBnZXRNYXRjaERpcmVjdGlvbigpLAotCQkJCQkJZ2V0TWF0Y2hPcHRpb25zKCkpOwotCQkJCWlmICghZmluZE9ubHkpIHsKLQkJCQkJcmVwbGFjZUJ1dHRvbi5zZXRFbmFibGVkKGZpbmRSZXBsYWNlQWN0aW9uLmdldEZvdW5kTWF0Y2goKSk7Ci0JCQkJCXJlcGxhY2VGaW5kQnV0dG9uLnNldEVuYWJsZWQoZmluZFJlcGxhY2VBY3Rpb24KLQkJCQkJCQkuZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbmRSZXBsYWNlQWN0aW9uLmdldEZvdW5kTWF0Y2goKSkgewotCQkJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0YXR1c0xhYmVsCi0JCQkJCQkJLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWwpOwotCQkJCX0KLQkJCQlmaW5kQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMiwKLQkJCQlSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlQnV0dG9uX3RleHQsIGZhbHNlKTsKLQkJcmVwbGFjZUJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDIpOwotCQlpZiAoIWZpbmRPbmx5KSB7Ci0JCQlyZXBsYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlmaW5kUmVwbGFjZUFjdGlvbi5ydW4oRmluZFJlcGxhY2VBY3Rpb24uUkVQTEFDRV9URVhULAotCQkJCQkJCWdldEZpbmRUZXh0KCksIGdldFJlcGxhY2VUZXh0KCksCi0JCQkJCQkJZ2V0TWF0Y2hEaXJlY3Rpb24oKSwgZ2V0TWF0Y2hPcHRpb25zKCkpOwotCQkJCQlyZXBsYWNlQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMywKLQkJCQlSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlRmluZEJ1dHRvbl90ZXh0LCBmYWxzZSk7Ci0JCXJlcGxhY2VGaW5kQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMyk7Ci0JCWlmICghZmluZE9ubHkpIHsKLQkJCXJlcGxhY2VGaW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlmaW5kUmVwbGFjZUFjdGlvbi5ydW4oRmluZFJlcGxhY2VBY3Rpb24uUkVQTEFDRV9GSU5EX1RFWFQsCi0JCQkJCQkJZ2V0RmluZFRleHQoKSwgZ2V0UmVwbGFjZVRleHQoKSwKLQkJCQkJCQlnZXRNYXRjaERpcmVjdGlvbigpLCBnZXRNYXRjaE9wdGlvbnMoKSk7Ci0JCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbi5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRFbmFibGVkKGZpbmRSZXBsYWNlQWN0aW9uCi0JCQkJCQkJLmdldEZvdW5kTWF0Y2goKSk7Ci0JCQkJCXJlcGxhY2VGaW5kQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgNCwKLQkJCQlSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlYWxsQnV0dG9uX3RleHQsIGZhbHNlKTsKLQkJcmVwbGFjZUFsbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDQpOwotCQlpZiAoIWZpbmRPbmx5KSB7Ci0JCQlyZXBsYWNlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlmaW5kUmVwbGFjZUFjdGlvbi5ydW4oRmluZFJlcGxhY2VBY3Rpb24uUkVQTEFDRV9BTExfVEVYVCwKLQkJCQkJCQlnZXRGaW5kVGV4dCgpLCBnZXRSZXBsYWNlVGV4dCgpLAotCQkJCQkJCWdldE1hdGNoRGlyZWN0aW9uKCksIGdldE1hdGNoT3B0aW9ucygpKTsKLQkJCQkJcmVwbGFjZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlcGxhY2VBbGxCdXR0b24uc2V0Rm9jdXMoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQljYW5jZWxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpOwotCi0JCWZpbmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlcGxhY2VGaW5kQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXBsYWNlQWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGZpbmQgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaW5kIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbmRUZXh0KCkgewotCQlyZXR1cm4gZmluZFRleHQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHJlcGxhY2UgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZXBsYWNlIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VUZXh0KCkgewotCQlyZXR1cm4gcmVwbGFjZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgbWF0Y2ggZGlyZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+RklORF9GT1JXQVJEPC9jb2RlPiBvciA8Y29kZT5GSU5EX0JBQ0tXQVJEPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF0Y2hEaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBGaW5kUmVwbGFjZUFjdGlvbi5GT1JXQVJEX01BVENICi0JCQkJOiBGaW5kUmVwbGFjZUFjdGlvbi5CQUNLV0FSRF9NQVRDSDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IG1hdGNoIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBtYXRjaCBvcHRpb25zCi0JICovCi0JcHVibGljIGludCBnZXRNYXRjaE9wdGlvbnMoKSB7Ci0JCWludCBvcHRpb25zID0gMDsKLQkJaWYgKHdob2xlV29yZENoZWNrYm94LmdldFNlbGVjdGlvbigpID09IHRydWUpIHsKLQkJCW9wdGlvbnMgfD0gRmluZFJlcGxhY2VBY3Rpb24uV0hPTEVfV09SRF9NQVRDSDsKLQkJfQotCQlpZiAoY2FzZVNlbnNpdGl2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpID09IHRydWUpIHsKLQkJCW9wdGlvbnMgfD0gRmluZFJlcGxhY2VBY3Rpb24uQ0FTRV9TRU5TSVRJVkVfTUFUQ0g7Ci0JCX0KLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBmaW5kIG9ubHkgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmluZCBvbmx5IG9wdGlvbiBpcyBlbmFibGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5kT25seSgpIHsKLQkJcmV0dXJuIGZpbmRPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpbmQgb25seSBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbmRPbmx5LAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuYWJsZSB0aGUgZmluZCBvbmx5IG9wdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmRPbmx5KGJvb2xlYW4gZmluZE9ubHkpIHsKLQkJdGhpcy5maW5kT25seSA9IGZpbmRPbmx5OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNWRkMTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBlZGl0aW5nIGRpYWxvZ3MgZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvQmxvY2tUYWcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvQmxvY2tUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjNzkwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0Jsb2NrVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIE1vZGVscyBhIEhUTUwgYmxvY2sgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrVGFnIHsKLQotCS8vIFRoZSB1c2VyIGZyaWVuZGx5IG5hbWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BBUkFHUkFQSCA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX3BhcmFncmFwaDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMSA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmcxOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfSEVBRElOR18yID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfaGVhZGluZzI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9IRUFESU5HXzMgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19oZWFkaW5nMzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNCA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfSEVBRElOR181ID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfaGVhZGluZzU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9IRUFESU5HXzYgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19oZWFkaW5nNjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FERFJFU1MgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19hZGRyZXNzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJFRk9STUFUVEVEX1RFWFQgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0OwotCi0JLy8gVGhlIGludGVybmFsIHZhbHVlcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUEFSQUdSQVBIID0gIjxwPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9IRUFESU5HXzEgPSAiPGgxPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9IRUFESU5HXzIgPSAiPGgyPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9IRUFESU5HXzMgPSAiPGgzPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9IRUFESU5HXzQgPSAiPGg0PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9IRUFESU5HXzUgPSAiPGg1PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9IRUFESU5HXzYgPSAiPGg2PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9BRERSRVNTID0gIjxhZGRyZXNzPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUkVGT1JNQVRURURfVEVYVCA9ICI8cHJlPiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAmbHQ7cCZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgUEFSQUdSQVBIID0gbmV3IEJsb2NrVGFnKE5BTUVfUEFSQUdSQVBILAotCQkJVkFMVUVfUEFSQUdSQVBIKTsKLQotCS8qKgotCSAqICZsdDtoMSZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgSEVBRElOR18xID0gbmV3IEJsb2NrVGFnKE5BTUVfSEVBRElOR18xLAotCQkJVkFMVUVfSEVBRElOR18xKTsKLQotCS8qKgotCSAqICZsdDtoMiZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgSEVBRElOR18yID0gbmV3IEJsb2NrVGFnKE5BTUVfSEVBRElOR18yLAotCQkJVkFMVUVfSEVBRElOR18yKTsKLQotCS8qKgotCSAqICZsdDtoMyZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgSEVBRElOR18zID0gbmV3IEJsb2NrVGFnKE5BTUVfSEVBRElOR18zLAotCQkJVkFMVUVfSEVBRElOR18zKTsKLQotCS8qKgotCSAqICZsdDtoNCZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgSEVBRElOR180ID0gbmV3IEJsb2NrVGFnKE5BTUVfSEVBRElOR180LAotCQkJVkFMVUVfSEVBRElOR180KTsKLQotCS8qKgotCSAqICZsdDtoNSZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgSEVBRElOR181ID0gbmV3IEJsb2NrVGFnKE5BTUVfSEVBRElOR181LAotCQkJVkFMVUVfSEVBRElOR181KTsKLQotCS8qKgotCSAqICZsdDtoNiZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgSEVBRElOR182ID0gbmV3IEJsb2NrVGFnKE5BTUVfSEVBRElOR182LAotCQkJVkFMVUVfSEVBRElOR182KTsKLQotCS8qKgotCSAqICZsdDthZGRyZXNzJmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBBRERSRVNTID0gbmV3IEJsb2NrVGFnKE5BTUVfQUREUkVTUywKLQkJCVZBTFVFX0FERFJFU1MpOwotCi0JLyoqCi0JICogJmx0O3ByZSZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgUFJFRk9STUFUVEVEX1RFWFQgPSBuZXcgQmxvY2tUYWcoCi0JCQlOQU1FX1BSRUZPUk1BVFRFRF9URVhULCBWQUxVRV9QUkVGT1JNQVRURURfVEVYVCk7Ci0KLQkvLyBBIGxpc3Qgb2YgPGNvZGU+QmxvY2tUYWc8L2NvZGU+IG9iamVjdHMuCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgTGlzdDxCbG9ja1RhZz4gQkxPQ0tfVEFHUyA9IG5ldyBBcnJheUxpc3Q8QmxvY2tUYWc+KCk7Ci0Jc3RhdGljIHsKLQkJQkxPQ0tfVEFHUy5hZGQoUEFSQUdSQVBIKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18xKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18yKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18zKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR180KTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR181KTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR182KTsKLQkJQkxPQ0tfVEFHUy5hZGQoQUREUkVTUyk7Ci0JCUJMT0NLX1RBR1MuYWRkKFBSRUZPUk1BVFRFRF9URVhUKTsKLQl9Ci0KLQkvLyBUaGUgYmxvY2sgdGFnIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBibG9jayB0YWcgdmFsdWUuCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgYmxvY2sgdGFnIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBibG9jayB0YWcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQmxvY2tUYWcoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYmxvY2sgdGFnIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgYmxvY2sgdGFnIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJsb2NrIHRhZyB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBibG9jayB0YWcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgPGNvZGU+QmxvY2tUYWc8L2NvZGU+IG9iamVjdCB0aGF0IGlzIG1hcHBlZCB0byB0aGUgZ2l2ZW4KLQkgKiBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkJsb2NrVGFnPC9jb2RlPiBsaXN0Ci0JICogQHJldHVybiBhIDxjb2RlPkJsb2NrVGFnPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJsb2NrVGFnIGdldEJsb2NrVGFnKGludCBpbmRleCkgewotCQlCbG9ja1RhZyByZXN1bHQgPSAoQmxvY2tUYWcpIEJMT0NLX1RBR1MuZ2V0KGluZGV4KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBQQVJBR1JBUEg7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9Gb250TmFtZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9Gb250TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDdhM2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBmb250IG5hbWUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udE5hbWUgewotCi0JLy8gVGhlIHVzZXIgZnJpZW5kbHkgbmFtZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfREVGQVVMVCA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX2RlZmF1bHQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BUklBTCA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX2FyaWFsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQ09VUklFUl9ORVcgPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZV9jb3VyaWVyTmV3OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVElNRVNfTkVXX1JPTUFOID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfdGltZXNOZXdSb21hbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1ZFUkRBTkEgPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZV92ZXJkYW5hOwotCi0JLy8gVGhlIGludGVybmFsIHZhbHVlcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQVJJQUwgPSAiQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9DT1VSSUVSX05FVyA9ICJDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9USU1FU19ORVdfUk9NQU4gPSAiVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWYiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfVkVSREFOQSA9ICJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGVmYXVsdCBmb250LgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udE5hbWUgREVGQVVMVCA9IG5ldyBGb250TmFtZShOQU1FX0RFRkFVTFQsCi0JCQlWQUxVRV9ERUZBVUxUKTsKLQotCS8qKgotCSAqIEFyaWFsIGZvbnQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBBUklBTCA9IG5ldyBGb250TmFtZShOQU1FX0FSSUFMLCBWQUxVRV9BUklBTCk7Ci0KLQkvKioKLQkgKiBDb3VyaWVyIE5ldyBmb250LgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udE5hbWUgQ09VUklFUl9ORVcgPSBuZXcgRm9udE5hbWUoTkFNRV9DT1VSSUVSX05FVywKLQkJCVZBTFVFX0NPVVJJRVJfTkVXKTsKLQotCS8qKgotCSAqIFRpbWVzIE5ldyBSb21hbiBmb250LgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udE5hbWUgVElNRVNfTkVXX1JPTUFOID0gbmV3IEZvbnROYW1lKAotCQkJTkFNRV9USU1FU19ORVdfUk9NQU4sIFZBTFVFX1RJTUVTX05FV19ST01BTik7Ci0KLQkvKioKLQkgKiBWZXJkYW5hIGZvbnQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBWRVJEQU5BID0gbmV3IEZvbnROYW1lKE5BTUVfVkVSREFOQSwKLQkJCVZBTFVFX1ZFUkRBTkEpOwotCi0JLy8gQSBsaXN0IG9mIDxjb2RlPkZvbnROYW1lPC9jb2RlPiBvYmplY3RzLgotCXN0YXRpYyBwcml2YXRlIGZpbmFsIExpc3Q8Rm9udE5hbWU+IEZPTlRfTkFNRVMgPSBuZXcgQXJyYXlMaXN0PEZvbnROYW1lPigpOwotCXN0YXRpYyB7Ci0JCUZPTlRfTkFNRVMuYWRkKERFRkFVTFQpOwotCQlGT05UX05BTUVTLmFkZChBUklBTCk7Ci0JCUZPTlRfTkFNRVMuYWRkKENPVVJJRVJfTkVXKTsKLQkJRk9OVF9OQU1FUy5hZGQoVElNRVNfTkVXX1JPTUFOKTsKLQkJRk9OVF9OQU1FUy5hZGQoVkVSREFOQSk7Ci0JfQotCi0JLy8gVGhlIGZvbnQgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLy8gVGhlIGZvbnQgdmFsdWUuCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZm9udCBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgZm9udCB2YWx1ZQotCSAqLwotCXB1YmxpYyBGb250TmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmb250IG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9udCBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmb250IHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbnQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgPGNvZGU+Rm9udE5hbWU8L2NvZGU+IG9iamVjdCB0aGF0IGlzIG1hcHBlZCB0byB0aGUgZ2l2ZW4KLQkgKiBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkZvbnROYW1lPC9jb2RlPiBsaXN0Ci0JICogQHJldHVybiBhIDxjb2RlPkZvbnROYW1lPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZvbnROYW1lIGdldEZvbnROYW1lKGludCBpbmRleCkgewotCQlGb250TmFtZSByZXN1bHQgPSAoRm9udE5hbWUpIEZPTlRfTkFNRVMuZ2V0KGluZGV4KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBERUZBVUxUOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udFN0eWxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnRTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNhOGQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udFN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBNb2RlbHMgYSBIVE1MIGZvbnQgc3R5bGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udFN0eWxlIHsKLQotCS8vIFRoZSB1c2VyIGZyaWVuZGx5IG5hbWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX05PUk1BTCA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9ub3JtYWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TRUNUSU9OX0hFQURJTkcgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TVUJTRUNUSU9OX0hFQURJTkcgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TVUJfU1VCU0VDVElPTl9IRUFESU5HID0gUmljaFRleHRSZXNvdXJjZXMuZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUVVPVEUgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfcXVvdGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DT0RFX1NBTVBMRSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9jb2RlU2FtcGxlOwotCi0JLy8gVGhlIGludGVybmFsIHZhbHVlcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfTk9STUFMID0gIjxwPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9TRUNUSU9OX0hFQURJTkcgPSAiPGgzPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9TVUJTRUNUSU9OX0hFQURJTkcgPSAiPGg0PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9TVUJfU1VCU0VDVElPTl9IRUFESU5HID0gIjxoNT4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUVVPVEUgPSAiPHF1b3RlPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9DT0RFX1NBTVBMRSA9ICI8Y29kZT4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGb250IHN0eWxlIGZvciBub3JtYWwgdGV4dC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBOT1JNQUwgPSBuZXcgRm9udFN0eWxlKE5BTUVfTk9STUFMLAotCQkJVkFMVUVfTk9STUFMKTsKLQotCS8qKgotCSAqIEZvbnQgc3R5bGUgZm9yIHNlY3Rpb24gaGVhZGluZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBTRUNUSU9OX0hFQURJTkcgPSBuZXcgRm9udFN0eWxlKAotCQkJTkFNRV9TRUNUSU9OX0hFQURJTkcsIFZBTFVFX1NFQ1RJT05fSEVBRElORyk7Ci0KLQkvKioKLQkgKiBGb250IHN0eWxlIGZvciBzdWIgc2VjdGlvbiBoZWFkaW5nLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNVQlNFQ1RJT05fSEVBRElORyA9IG5ldyBGb250U3R5bGUoCi0JCQlOQU1FX1NVQlNFQ1RJT05fSEVBRElORywgVkFMVUVfU1VCU0VDVElPTl9IRUFESU5HKTsKLQkvKioKLQkgKiBGb250IHN0eWxlIGZvciBzdWIgc3ViIHNlY3Rpb24gaGVhZGluZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBTVUJfU1VCU0VDVElPTl9IRUFESU5HID0gbmV3IEZvbnRTdHlsZSgKLQkJCU5BTUVfU1VCX1NVQlNFQ1RJT05fSEVBRElORywgVkFMVUVfU1VCX1NVQlNFQ1RJT05fSEVBRElORyk7Ci0KLQkvKioKLQkgKiBGb250IHN0eWxlIGZvciBxdW90YXRpb25zLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFFVT1RFID0gbmV3IEZvbnRTdHlsZShOQU1FX1FVT1RFLCBWQUxVRV9RVU9URSk7Ci0KLQkvKioKLQkgKiBGb250IHN0eWxlIGZvciBkaXNwbGF5aW5nIHByb2dyYW0gY29kZXMuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250U3R5bGUgQ09ERV9TQU1QTEUgPSBuZXcgRm9udFN0eWxlKE5BTUVfQ09ERV9TQU1QTEUsCi0JCQlWQUxVRV9DT0RFX1NBTVBMRSk7Ci0KLQkvLyBBIGxpc3Qgb2YgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPiBvYmplY3RzLgotCXN0YXRpYyBwcml2YXRlIGZpbmFsIExpc3Q8Rm9udFN0eWxlPiBGT05UX1NUWUxFUyA9IG5ldyBBcnJheUxpc3Q8Rm9udFN0eWxlPigpOwotCXN0YXRpYyB7Ci0JCUZPTlRfU1RZTEVTLmFkZChOT1JNQUwpOwotCQlGT05UX1NUWUxFUy5hZGQoU0VDVElPTl9IRUFESU5HKTsKLQkJRk9OVF9TVFlMRVMuYWRkKFNVQlNFQ1RJT05fSEVBRElORyk7Ci0JCUZPTlRfU1RZTEVTLmFkZChTVUJfU1VCU0VDVElPTl9IRUFESU5HKTsKLQkJRk9OVF9TVFlMRVMuYWRkKFFVT1RFKTsKLQkJRk9OVF9TVFlMRVMuYWRkKENPREVfU0FNUExFKTsKLQl9Ci0KLQkvLyBUaGUgZm9udCBzdHlsZSBuYW1lLgotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvLyBUaGUgZm9udCBzdHlsZSB2YWx1ZS4KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBmb250IHN0eWxlIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBmb250IHN0eWxlIHZhbHVlCi0JICovCi0JcHVibGljIEZvbnRTdHlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmb250IHN0eWxlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9udCBzdHlsZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmb250IHN0eWxlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbnQgc3R5bGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPiBvYmplY3QgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIGdpdmVuCi0JICogaW5kZXguCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBhbiBpbmRleCBpbnRvIHRoZSA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IGxpc3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZvbnRTdHlsZSBnZXRGb250U3R5bGUoaW50IGluZGV4KSB7Ci0JCUZvbnRTdHlsZSByZXN1bHQgPSAoRm9udFN0eWxlKSBGT05UX1NUWUxFUy5nZXQoaW5kZXgpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIE5PUk1BTDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlCi0JICogZ2l2ZW4gdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIEZvbnRTdHlsZXMKLQkgKiBAcmV0dXJuIGEgZGlzcGxheSBuYW1lIG9mIGEgRm9udFN0eWxlLCBvciBudWxsIGlmIG5vbmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb250U3R5bGVOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlmb3IgKEl0ZXJhdG9yPEZvbnRTdHlsZT4gaXRlciA9IEZPTlRfU1RZTEVTLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRm9udFN0eWxlIHN0eWxlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoc3R5bGUuZ2V0VmFsdWUoKS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJcmV0dXJuIHN0eWxlLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUKLQkgKiBnaXZlbiBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgRm9udFN0eWxlcwotCSAqIEByZXR1cm4gYSB2YWx1ZSBvZiBhIEZvbnRTdHlsZSwgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9udFN0eWxlVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvcjxGb250U3R5bGU+IGl0ZXIgPSBGT05UX1NUWUxFUy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZvbnRTdHlsZSBzdHlsZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHN0eWxlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gc3R5bGUuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ltYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWIyYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWw7Ci0KLS8qKgotICogTW9kZWxzIGEgc2ltcGxpZmllZCBIVE1MICZsdDtpbWFnZSZndDsgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlIHsKLQotCS8vIFRoZSBpbWFnZSBVUkwuCi0JcHJpdmF0ZSBTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltYWdlKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltYWdlIFVSTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBVUkwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSBVUkwuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIGltYWdlIFVSTAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9MaW5rLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0xpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljMjEwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0xpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi0vKioKLSAqIE1vZGVscyBhIHNpbXBsaWZpZWQgSFRNTCAmbHQ7bGluayZndDsgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmsgewotCi0JLy8gVGhlIGxpbmsgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBsaW5rIFVSTC4KLQlwcml2YXRlIFN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGluaygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaW5rIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbGluayBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGluayBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbGluayBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpbmsgVVJMLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpbmsgVVJMCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGluayBVUkwuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIGxpbmsgVVJMCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi0JLyoqCi0JICogQEdldHMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBsaW5rLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBsaW5rCi0JICovCi0JcHVibGljIFN0cmluZyB0b0hUTUwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvVGFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmMGQ0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWw7Ci0KLS8qKgotICogTW9kZWxzIGEgc2ltcGxpZmllZCBIVE1MICZsdDt0YWJsZSZndDsgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlIHsKLQotCS8qKgotCSAqIEEgdGFibGUgd2l0aCBubyBoZWFkZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0hFQURFUlNfTk9ORSA9IDA7Ci0KLQkvKioKLQkgKiBBIHRhYmxlIHdpdGggY29sdW1uIGhlYWRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSEVBREVSU19DT0xTID0gMTsKLQotCS8qKgotCSAqIEEgdGFibGUgd2l0aCByb3cgaGVhZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9IRUFERVJTX1JPV1MgPSAyOwotCi0JLyoqCi0JICogQSB0YWJsZSB3aXRoIGJvdGggY29sdW1uIGFuZCByb3cgaGVhZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9IRUFERVJTX0JPVEggPSAzOwotCi0JLy8gVGhlIG51bWJlciBvZiByb3dzLgotCXByaXZhdGUgaW50IHJvd3MgPSAyOwotCi0JLy8gVGhlIG51bWJlciBvZiBjb2x1bW5zLgotCXByaXZhdGUgaW50IGNvbHMgPSAyOwotCi0JLy8gVGhlIHRhYmxlIHdpZHRoLgotCXByaXZhdGUgU3RyaW5nIHdpZHRoID0gIjg1JSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSB0eXBlIG9mIHRhYmxlaGVhZGVycyBmb3IgdGhpcyB0YWJsZS4KLQlwcml2YXRlIGludCB0YWJsZUhlYWRlcnMgPSAwOwotCi0JLy8gVGhlIHRhYmxlIHN1bW1hcnkuCi0JcHJpdmF0ZSBTdHJpbmcgc3VtbWFyeTsKLQotCS8vIFRoZSB0YWJsZSBjYXB0aW9uLgotCXByaXZhdGUgU3RyaW5nIGNhcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYWJsZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJvd3MoKSB7Ci0JCXJldHVybiByb3dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm93cwotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByb3dzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um93cyhpbnQgcm93cykgewotCQl0aGlzLnJvd3MgPSByb3dzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29sdW1ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1ucygpIHsKLQkJcmV0dXJuIGNvbHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBjb2xzCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5zKGludCBjb2xzKSB7Ci0JCXRoaXMuY29scyA9IGNvbHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFibGUgd2lkdGguCi0JICogCi0JICogQHJldHVybiB0aGUgd2lkdGggb2YgdGhlIHRhYmxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHdpZHRoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhYmxlIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSB0YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgewotCQl0aGlzLndpZHRoID0gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFibGUgY2FwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YWJsZSBjYXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXB0aW9uKCkgewotCQlyZXR1cm4gY2FwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0YWJsZSBjYXB0aW9uLgotCSAqIAotCSAqIEBwYXJhIGNhcHRpb24gdGhlIHRhYmxlIGNhcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXB0aW9uKFN0cmluZyBjYXB0aW9uKSB7Ci0JCXRoaXMuY2FwdGlvbiA9IGNhcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFibGUgc3VtbWFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YWJsZSBzdW1tYXJ5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkgewotCQlyZXR1cm4gc3VtbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0YWJsZSBzdW1tYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBzdW1tYXJ5Ci0JICogICAgICAgICAgICB0aGUgdGFibGUgc3VtbWFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1bW1hcnkoU3RyaW5nIHN1bW1hcnkpIHsKLQkJdGhpcy5zdW1tYXJ5ID0gc3VtbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YWJsZSBoZWFkZXJzIHN0eWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGludGVnZXIgd2l0aCB2YWx1ZSByZXByZXNlbnRpbmcKLQkgKiAgICAgICAgIDxjb2RlPlRBQkxFX0hFQURFUlNfTk9ORTwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5UQUJMRV9IRUFERVJTX0NPTFM8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+VEFCTEVfSEVBREVSU19ST1dTPC9jb2RlPiBvcgotCSAqICAgICAgICAgPGNvZGU+VEFCTEVfSEVBREVSU19CT1RIPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFibGVIZWFkZXJzKCkgewotCQlyZXR1cm4gdGFibGVIZWFkZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhYmxlIGhlYWRlcnMgc3R5bGUuCi0JICogCi0JICogQHBhcmFtIHRhYmxlSGVhZGVycwotCSAqICAgICAgICAgICAgYW4gaW50ZWdlciB3aXRoIHZhbHVlIHJlcHJlc2VudGluZwotCSAqICAgICAgICAgICAgPGNvZGU+VEFCTEVfSEVBREVSU19OT05FPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPlRBQkxFX0hFQURFUlNfQ09MUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5UQUJMRV9IRUFERVJTX1JPV1M8L2NvZGU+IG9yCi0JICogICAgICAgICAgICA8Y29kZT5UQUJMRV9IRUFERVJTX0JPVEg8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGVIZWFkZXJzKGludCB0YWJsZUhlYWRlcnMpIHsKLQkJdGhpcy50YWJsZUhlYWRlcnMgPSB0YWJsZUhlYWRlcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ3MDdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRkZGM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjkxYjA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBUaGUgUHJlZmVyZW5jZSBwYWdlIGZvciB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgc3RvcmU7Ci0KLQlwcml2YXRlIFRleHQgbGluZVdpZHRoVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIGluZGVudENoZWNrYm94OwotCi0JcHJpdmF0ZSBUZXh0IGluZGVudFNpemVUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJc3RvcmUgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21wb3NpdGUgd2lkdGhDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl3aWR0aENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJd2lkdGhDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGluZVdpZHRoTGFiZWwgPSBuZXcgTGFiZWwod2lkdGhDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGluZVdpZHRoTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0KTsgCi0KLQkJbGluZVdpZHRoVGV4dCA9IG5ldyBUZXh0KHdpZHRoQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJbGluZVdpZHRoVGV4dC5zZXRUZXh0KHN0b3JlLmdldFN0cmluZyhSaWNoVGV4dFByZWZlcmVuY2VzLkxJTkVfV0lEVEgpKTsKLQkJbGluZVdpZHRoVGV4dC5zZXRUZXh0TGltaXQoMyk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDI1OwotCQlsaW5lV2lkdGhUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlsaW5lV2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgaW5kZW50Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaW5kZW50Q29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlpbmRlbnRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJaW5kZW50Q2hlY2tib3ggPSBuZXcgQnV0dG9uKGluZGVudENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJaW5kZW50Q2hlY2tib3guc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5pbmRlbnRIVE1MQ2hlY2tib3hfdGV4dCk7IAotCQlpbmRlbnRDaGVja2JveC5zZXRTZWxlY3Rpb24oc3RvcmUKLQkJCQkuZ2V0Qm9vbGVhbihSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVCkpOwotCi0JCW5ldyBMYWJlbChpbmRlbnRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQlMYWJlbCBpbmRlbnRTaXplTGFiZWwgPSBuZXcgTGFiZWwoaW5kZW50Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJaW5kZW50U2l6ZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlpbmRlbnRTaXplTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5pbmRlbnRTaXplTGFiZWxfdGV4dCk7IAotCi0JCWluZGVudFNpemVUZXh0ID0gbmV3IFRleHQoaW5kZW50Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJaW5kZW50U2l6ZVRleHQKLQkJCQkuc2V0VGV4dChzdG9yZS5nZXRTdHJpbmcoUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlRfU0laRSkpOwotCQlpbmRlbnRTaXplVGV4dC5zZXRUZXh0TGltaXQoMSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwOwotCQlpbmRlbnRTaXplVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaW5kZW50U2l6ZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlLnBlcmZvcm1EZWZhdWx0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWxpbmVXaWR0aFRleHQuc2V0VGV4dChzdG9yZQotCQkJCS5nZXREZWZhdWx0U3RyaW5nKFJpY2hUZXh0UHJlZmVyZW5jZXMuTElORV9XSURUSCkpOwotCQlpbmRlbnRDaGVja2JveC5zZXRTZWxlY3Rpb24oc3RvcmUKLQkJCQkuZ2V0RGVmYXVsdEJvb2xlYW4oUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlQpKTsKLQkJaW5kZW50U2l6ZVRleHQuc2V0VGV4dChzdG9yZQotCQkJCS5nZXREZWZhdWx0U3RyaW5nKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UX1NJWkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UucGVyZm9ybU9rCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlTdHJpbmcgbGluZVdpZHRoVmFsdWUgPSBsaW5lV2lkdGhUZXh0LmdldFRleHQoKTsKLQkJaWYgKGxpbmVXaWR0aFZhbHVlICE9IG51bGwgJiYgbGluZVdpZHRoVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCWludCBsaW5lV2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmVXaWR0aFZhbHVlKTsKLQkJCQlzdG9yZS5zZXRWYWx1ZShSaWNoVGV4dFByZWZlcmVuY2VzLkxJTkVfV0lEVEgsIGxpbmVXaWR0aCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBpbmRlbnRWYWx1ZSA9IGluZGVudENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCQlzdG9yZS5zZXRWYWx1ZShSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVCwgaW5kZW50VmFsdWUpOwotCi0JCVN0cmluZyBpbmRlbnRTaXplVmFsdWUgPSBpbmRlbnRTaXplVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChpbmRlbnRTaXplVmFsdWUgIT0gbnVsbCAmJiBpbmRlbnRTaXplVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCWludCBpbmRlbnRTaXplID0gSW50ZWdlci5wYXJzZUludChpbmRlbnRTaXplVmFsdWUpOwotCQkJCXN0b3JlLnNldFZhbHVlKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UX1NJWkUsIGluZGVudFNpemUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KE1vZGlmeUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDJlYWU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlcyBmb3IgdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiByaWNoIHRleHQgRWRpdG9yIHByZWZlcmVuY2Uga2V5cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1dJRFRIID0gImh0bWxFZGl0b3IubGluZVdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UID0gImh0bWxFZGl0b3IuaW5kZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UX1NJWkUgPSAiaHRtbEVkaXRvci5pbmRlbnRTaXplIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlzdG9yZS5zZXREZWZhdWx0KExJTkVfV0lEVEgsIDEyMCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSU5ERU5ULCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJTkRFTlRfU0laRSwgNCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZXNJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTk1NmRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZXNJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogVGhlIHJpY2ggdGV4dCBwcmVmZXJlbmNlcyBpbml0aWFsaXplci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFByZWZlcmVuY2VzSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlSaWNoVGV4dFByZWZlcmVuY2VzLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoc3RvcmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWE3NWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWM5NmM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFNlYXJjaCBVSSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmE1NTI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTVkZDBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnNlYXJjaDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWksCi0gb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLnByZWZlcmVuY2VzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxZGM2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2MwZjQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjE5MzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgU2VhcmNoIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBNZXRob2QgU2VhcmNoIERpYWxvZwotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9TWV0aG9kIFNlYXJjaAotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjIwZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJvcGVyYXRpb24iIG5hbWU9Ik1ldGhvZCBTZWFyY2ggT3BlcmF0aW9uIiBzY2hlbWE9InNjaGVtYS9vcGVyYXRpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VhcmNoSW5wdXRGYWN0b3JpZXMiIG5hbWU9Ik1ldGhvZCBTZWFyY2ggSW5wdXQgRmFjdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9zZWFyY2hJbnB1dEZhY3Rvcmllcy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZWFyY2hTY29wZUdyb3VwRmFjdG9yeSIgbmFtZT0iU2VhcmNoIFNjb3BlIEdyb3VwIEZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL3NlYXJjaFNjb3BlR3JvdXBGYWN0b3J5LmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSIgbmFtZT0iU2VhcmNoIFJlc3VsdCBQcm92aWRlciBGYWN0b3J5IiBzY2hlbWE9InNjaGVtYS9zZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkuZXhzZCIvPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5zZWFyY2guc2VhcmNoUGFnZXMiPgotICAgICAgPHBhZ2UgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuTWV0aG9kU2VhcmNoUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFBhZ2UiICAgICAgCi0gICAgICAgICAgICBsYWJlbD0iJW1ldGhvZFNlYXJjaERpYWxvZ0xhYmVsIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmIgotICAgICAgICAgICAgc2l6ZUhpbnQ9IjI1MCwxNjAiCi0gICAgICAgICAgICB0YWJQb3NpdGlvbj0iMCIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Iio6MSIKLSAgICAgICAgICAgIHNob3dTY29wZVNlY3Rpb249ImZhbHNlIgkJCi0gICAgICAgICAgICBjYW5TZWFyY2hFbmNsb3NpbmdQcm9qZWN0cz0iZmFsc2UiPgotICAgICAgPC9wYWdlPiAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iTWV0aG9kU2VhcmNoUGFnZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zZWFyY2guc2VhcmNoUmVzdWx0Vmlld1BhZ2VzIj4KLSAgICAgIDx2aWV3UGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuTWV0aG9kU2VhcmNoUmVzdWx0UGFnZSIKLQkJCXNlYXJjaFJlc3VsdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaFJlc3VsdCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UiPgotICAgICAgPC92aWV3UGFnZT4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL29wZXJhdGlvbi5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvb3BlcmF0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NWMxOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvb3BlcmF0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSIgaWQ9Im9wZXJhdGlvbiIgbmFtZT0iTWV0aG9kIFNlYXJjaCBPcGVyYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcGVyYXRpb24iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im9wZXJhdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuSU1ldGhvZFNlYXJjaE9wZXJhdGlvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoSW5wdXRGYWN0b3JpZXMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaElucHV0RmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNDMzOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoSW5wdXRGYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIiBpZD0ic2VhcmNoSW5wdXRGYWN0b3JpZXMiIG5hbWU9Ik1ldGhvZCBTZWFyY2ggSW5wdXQgRmFjdG9yaWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhNGYyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIiBpZD0ic2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyRmFjdG9yeSIgbmFtZT0iU2VhcmNoIFJlc3VsdCBDb250ZW50IFByb3ZpZGVyIEZhY3RvcnkiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hTY29wZUdyb3VwRmFjdG9yeS5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoU2NvcGVHcm91cEZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3ZmMwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hTY29wZUdyb3VwRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiIGlkPSJzZWFyY2hTY29wZVZpZXdlckZhY3RvcnkiIG5hbWU9IlNlYXJjaFNjb3BlVmlld2VyIEZhY3RvcnkiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklNZXRob2RTZWFyY2hTY29wZUdyb3VwIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTEzZjgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklNZXRob2RTZWFyY2hJbnB1dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5JTWV0aG9kU2VhcmNoU2NvcGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklNZXRob2RTZWFyY2hTY29wZUdyb3VwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaElucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaFNjb3BlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkucHJlZmVyZW5jZXMuU2VhcmNoVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgTWV0aG9kIFNlYXJjaCBwYWdlIGluIHRoZSBTZWFyY2ggZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hQYWdlIGV4dGVuZHMgRGlhbG9nUGFnZSBpbXBsZW1lbnRzIElTZWFyY2hQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9QQUdFX0lEID0gTWV0aG9kU2VhcmNoUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIExpc3Q8SU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeT4gc2VhcmNoSW5wdXRGYWN0b3JpZXM7Ci0KLQlwcml2YXRlIENvbWJvIHNlYXJjaFN0cmluZ0NvbWJvOwotCi0JcHJpdmF0ZSBDb21ibyBuYW1lUGF0dGVybkNvbWJvOwotCi0JcHJpdmF0ZSBCdXR0b24gY2FzZVNlbnNpdGl2ZUNoZWNrYm94OwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hTY29wZVZpZXdlciBzZWFyY2hTY29wZVZpZXdlcjsKLQotCXByaXZhdGUgSVNlYXJjaFBhZ2VDb250YWluZXIgY29udGFpbmVyOwotCi0JcHJpdmF0ZSBMaXN0PElNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbj4gYWRkaXRpb25hbFNlYXJjaElucHV0cyA9IG5ldyBBcnJheUxpc3Q8SU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uPigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gNTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgc2VhcmNoU3RyaW5nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFN0cmluZ0xhYmVsLnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoU3RyaW5nTGFiZWxfdGV4dCk7IAotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQlzZWFyY2hTdHJpbmdDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc2VhcmNoU3RyaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCVN0cmluZyBzYXZlZFNlYXJjaFN0cmluZyA9IFNlYXJjaFVJUHJlZmVyZW5jZXMuZ2V0U2VhcmNoU3RyaW5nKCk7Ci0JCWlmIChzYXZlZFNlYXJjaFN0cmluZyAhPSBudWxsICYmIHNhdmVkU2VhcmNoU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJc2VhcmNoU3RyaW5nQ29tYm8uc2V0VGV4dChzYXZlZFNlYXJjaFN0cmluZyk7Ci0JCX0KLQotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94LnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQpOyAKLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94LnNldFNlbGVjdGlvbihTZWFyY2hVSVByZWZlcmVuY2VzCi0JCQkJLmdldENhc2VTZW5zaXRpdmUoKSk7Ci0KLQkJTGFiZWwgZWxlbWVudE5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWxlbWVudE5hbWVMYWJlbC5zZXRUZXh0KFNlYXJjaFVJUmVzb3VyY2VzLmVsZW1lbnROYW1lTGFiZWxfdGV4dCk7IAotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQluYW1lUGF0dGVybkNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQluYW1lUGF0dGVybkNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgc2F2ZWROYW1lUGF0dGVybiA9IFNlYXJjaFVJUHJlZmVyZW5jZXMuZ2V0TmFtZVBhdHRlcm4oKTsKLQkJaWYgKHNhdmVkTmFtZVBhdHRlcm4gIT0gbnVsbCAmJiBzYXZlZE5hbWVQYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotCQkJbmFtZVBhdHRlcm5Db21iby5zZXRUZXh0KHNhdmVkTmFtZVBhdHRlcm4pOwotCQl9IAotLy8JCWVsc2UgewotLy8JCQluYW1lUGF0dGVybkNvbWJvLnNldFRleHQoIioiKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLQotCQluYW1lUGF0dGVybkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNvbnRhaW5lci5zZXRQZXJmb3JtQWN0aW9uRW5hYmxlZChnZXRTZWFyY2hCdXR0b25FbmFibGVkKCkpOwotCQkJfQotCQl9KTsKLQkJbmFtZVBhdHRlcm5Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJY29udGFpbmVyLnNldFBlcmZvcm1BY3Rpb25FbmFibGVkKGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQljb2xsZWN0Q29udHJpYnV0ZWRTZWFyY2hJbnB1dHMoY29tcG9zaXRlKTsKLQkJCi0JCXNlYXJjaFNjb3BlVmlld2VyID0gY3JlYXRlU2VhcmNoU2NvcGVHcm91cChjb21wb3NpdGUpLmdldFNlYXJjaFNjb3BlVmlld2VyKCk7Ci0KLQkJY29udGFpbmVyLnNldFBlcmZvcm1BY3Rpb25FbmFibGVkKGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JfQotCQotCXByaXZhdGUgSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAgY3JlYXRlU2VhcmNoU2NvcGVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCU9iamVjdCBleHQgPSBFeHRlbnNpb25NYW5hZ2VyLmdldEV4dGVuc2lvbihTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYoZXh0IGluc3RhbmNlb2YgSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5KSB7Ci0JCQlJTWV0aG9kU2VhcmNoU2NvcGVHcm91cCBncm91cCA9ICgoSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5KSBleHQpLmNyZWF0ZVNlYXJjaFNjb3BlR3JvdXAocGFyZW50KTsKLQkJCWlmKGdyb3VwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ3JvdXA7Ci0JCQl9Ci0JCX0KLQkJR3JvdXAgc2VhcmNoU2NvcGVHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2VhcmNoU2NvcGVHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgc2VhcmNoU2NvcGVHcm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YS5oZWlnaHRIaW50ID0gMjAwOwotCQlzZWFyY2hTY29wZUdyb3VwLnNldExheW91dERhdGEoc2VhcmNoU2NvcGVHcm91cEdyaWREYXRhKTsKLQkJc2VhcmNoU2NvcGVHcm91cC5zZXRUZXh0KFNlYXJjaFVJUmVzb3VyY2VzLnNjb3BlR3JvdXBfdGV4dCk7IAotCQlmaW5hbCBNZXRob2RTZWFyY2hTY29wZVZpZXdlciB2aWV3ZXIgPSBuZXcgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIoc2VhcmNoU2NvcGVHcm91cCwgU1dULkJPUkRFUik7Ci0JCXJldHVybiBuZXcgSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAoKSB7Ci0KLQkJCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZVZpZXdlciBnZXRTZWFyY2hTY29wZVZpZXdlcigpIHsKLQkJCQlyZXR1cm4gdmlld2VyOwotCQkJfQotCQkJCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5PiBnZXRTZWFyY2hJbnB1dEZhY3RvcmllcygpIHsKLQkJaWYgKHNlYXJjaElucHV0RmFjdG9yaWVzID09IG51bGwpIHsKLQkJCXNlYXJjaElucHV0RmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5PigpOwotCQkJLy8gUHJvY2VzcyB0aGUgY29udHJpYnV0b3JzLgotCQkJLy8KLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCSJzZWFyY2hJbnB1dEZhY3RvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCU9iamVjdCBleHQgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCWlmIChleHQgaW5zdGFuY2VvZiBJTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5KSB7Ci0JCQkJCQkJCQlzZWFyY2hJbnB1dEZhY3RvcmllcwotCQkJCQkJCQkJCQkuYWRkKChJTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5KSBleHQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlYXJjaElucHV0RmFjdG9yaWVzOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBjb2xsZWN0Q29udHJpYnV0ZWRTZWFyY2hJbnB1dHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmb3IgKElNZXRob2RTZWFyY2hJbnB1dEZhY3RvcnkgZmFjdG9yeSA6IGdldFNlYXJjaElucHV0RmFjdG9yaWVzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uIHNlYXJjaElucHV0ID0gZmFjdG9yeS5jcmVhdGVTZWFyY2hJbnB1dChwYXJlbnQpOwotCQkJCWlmKHNlYXJjaElucHV0ICE9IG51bGwpIHsKLQkJCQkJYWRkaXRpb25hbFNlYXJjaElucHV0cyAuYWRkKHNlYXJjaElucHV0KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hQYWdlI3BlcmZvcm1BY3Rpb24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoRXJyb3JfdGl0bGUsIAotCQkJCQlTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hFcnJvcl9tc2csIAotCQkJCQlTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hFcnJvcl9yZWFzb24pOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgc2VhcmNoU3RyaW5nID0gc2VhcmNoU3RyaW5nQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQkJU3RyaW5nIG5hbWVQYXR0ZXJuID0gbmFtZVBhdHRlcm5Db21iby5nZXRUZXh0KCkudHJpbSgpOwotCQlpZihTdHJVdGlsLmlzQmxhbmsobmFtZVBhdHRlcm4pKSB7Ci0JCQluYW1lUGF0dGVybiA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCU1ldGhvZFNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlID0gc2VhcmNoU2NvcGVWaWV3ZXIuZ2V0U2VhcmNoU2NvcGUoKTsKLQkJTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQgPSBuZXcgTWV0aG9kU2VhcmNoSW5wdXQoc2VhcmNoU3RyaW5nLAotCQkJCW5hbWVQYXR0ZXJuLCBjYXNlU2Vuc2l0aXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIGZhbHNlLAotCQkJCWZhbHNlLCBzZWFyY2hTY29wZSk7Ci0JCWlmKCFhZGRpdGlvbmFsU2VhcmNoSW5wdXRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24gaW5wdXQgOiBhZGRpdGlvbmFsU2VhcmNoSW5wdXRzKSB7Ci0JCQkJc2VhcmNoSW5wdXQuZ2V0QWRkaXRpb25hbElucHV0KCkucHV0QWxsKGlucHV0LmdldElucHV0KCkpOwotCQkJfQotCQl9Ci0JCU1ldGhvZFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gbmV3IE1ldGhvZFNlYXJjaFF1ZXJ5KHNlYXJjaElucHV0KTsKLQkJTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0JCU5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5CYWNrZ3JvdW5kKHNlYXJjaFF1ZXJ5KTsKLQkJU2VhcmNoVUlQcmVmZXJlbmNlcy5zZXRTZWFyY2hTdHJpbmcoc2VhcmNoU3RyaW5nQ29tYm8uZ2V0VGV4dCgpKTsKLQkJU2VhcmNoVUlQcmVmZXJlbmNlcy5zZXROYW1lUGF0dGVybihuYW1lUGF0dGVybkNvbWJvLmdldFRleHQoKSk7Ci0JCVNlYXJjaFVJUHJlZmVyZW5jZXMuc2V0Q2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlQ2hlY2tib3gKLQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZSNzZXRDb250YWluZXIoSVNlYXJjaFBhZ2VDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElTZWFyY2hQYWdlQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JUmVwbGFjZVBhZ2UjcGVyZm9ybVJlcGxhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1SZXBsYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIFNlYXJjaCBidXR0b24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPGNvZGU+IGlmIHRoZSBTZWFyY2ggYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFJlc3VsdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0M2M2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFJlc3VsdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db250ZW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkVsZW1lbnRUcmVlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklTZWFyY2hSZXN1bHRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RFbGVtZW50Vmlld1NvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLlNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgTWV0aG9kIFNlYXJjaCByZXN1bHQgaW4gdGhlIFNlYXJjaCB2aWV3LiBUaGUgc2VhcmNoIHJlc3VsdAotICogY2FuIGJlIGRpc3BsYXllZCBpbiBhIGhpZXJhcmNoaWNhbCBvciBmbGF0IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZQotCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hSZXN1bHRQYWdlKCkgewotCQlzdXBlcigpOwotCQlsYWJlbFByb3ZpZGVyID0gY3JlYXRlTGFiZWxQcm92aWRlcigpOwotCQkKLQkJLy8gQ2xlYXIgdGhlIHNlYXJjaCByZXN1bHQgd2hlbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBpcyBjbG9zZWQgYnkgdGhlIHVzZXIuCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCU1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UudGhpcy5nZXRJbnB1dCgpLnJlbW92ZUFsbCgpOwotCQkJfQkJCQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2lzTGF5b3V0U3VwcG9ydGVkKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xheW91dFN1cHBvcnRlZChpbnQgbGF5b3V0KSB7Ci0JCXJldHVybiAoKGxheW91dCAmIEZMQUdfTEFZT1VUX0ZMQVQpICE9IDAgfHwgKGxheW91dCAmIEZMQUdfTEFZT1VUX1RSRUUpICE9IDApOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5IGdldFNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChJU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5KSBFeHRlbnNpb25NYW5hZ2VyLmdldEV4dGVuc2lvbigKLQkJCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkic2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm92aWRlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCUlTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldFNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSgpOwotCQlpZih2aWV3ZXIgaW5zdGFuY2VvZiBUcmVlVmlld2VyKSB7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjcCA9IG51bGw7Ci0JCQlpZihmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQljcCA9IGZhY3RvcnkuY3JlYXRlVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQkJfQotCQkJcmV0dXJuIGNwICE9IG51bGwgPyBjcCA6IG5ldyBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJZWxzZSBpZih2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikgewotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY3AgPSBudWxsOwotCQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJY3AgPSBmYWN0b3J5LmNyZWF0ZVRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY3AgIT0gbnVsbCA/IGNwIDogbmV3IFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkgewotCQlJTGFiZWxQcm92aWRlciBscCA9IG51bGw7Ci0JCUlTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldFNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSgpOwotCQlpZihmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWxwID0gZmFjdG9yeS5jcmVhdGVMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGxwICE9IG51bGwgPyBscCA6IG5ldyBFbGVtZW50VHJlZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRyZWVWaWV3ZXIoVHJlZVZpZXdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUcmVlVmlld2VyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IGNyZWF0ZUNvbnRlbnRQcm92aWRlcih2aWV3ZXIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0U29ydGVyKG5ldyBNZXRob2RFbGVtZW50Vmlld1NvcnRlcigpKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRhYmxlVmlld2VyKFRhYmxlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRhYmxlVmlld2VyKFRhYmxlVmlld2VyIHZpZXdlcikgewotCQljb250ZW50UHJvdmlkZXIgPSBjcmVhdGVDb250ZW50UHJvdmlkZXIodmlld2VyKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcikgewotCQkJCSgoU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKQotCQkJCQkJLmVsZW1lbnRzQ2hhbmdlZChvYmplY3RzKTsKLQkJCX0gZWxzZSBpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpCi0JCQkJCQkuZWxlbWVudHNDaGFuZ2VkKG9iamVjdHMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjY2xlYXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJKChTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpLmNsZWFyKCk7Ci0JCQl9IGVsc2UgaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJKChTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKS5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNzaG93TWF0Y2goTWF0Y2gsCi0JICogICAgICBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBjdXJyZW50T2Zmc2V0LCBpbnQgY3VycmVudExlbmd0aCwKLQkJCWJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChtYXRjaC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGFjdGl2YXRlKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbWF0Y2guZ2V0RWxlbWVudCgpOwotCQkJaWYgKFBlcnNwZWN0aXZlVXRpbAotCQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UKLQkJCQkJCQkuZmluZFZpZXcoTmV3U2VhcmNoVUkuU0VBUkNIX1ZJRVdfSUQpOwotCQkJCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJCQlhY3RpdmVQYWdlLnNob3dWaWV3KE5ld1NlYXJjaFVJLlNFQVJDSF9WSUVXX0lEKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRpc3BsYXlFZGl0b3IoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgTWV0aG9kIGVkaXRvciBmb3IgdGhlIHNlbGVjdGVkIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlFZGl0b3IoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKAotCQkJCQlVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoZWxlbWVudCkpOwotCQl9IGVsc2UgewotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoUGVyc3BlY3RpdmVVdGlsCi0JCQkJLmlzQWN0aXZlUGVyc3BlY3RpdmUoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsLnRvQXJyYXkoKTsKLQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cyAhPSBudWxsICYmIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50c1swXSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZGlzcGxheUhUTUxQYWdlKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnRzWzBdKTsKLQkJCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIGNvbnRlbnQgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBDb250ZW50IHZpZXcgY2Fubm90IGJlIGRpc3BsYXllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlIVE1MUGFnZShNZXRob2RFbGVtZW50IGVsZW1lbnQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KENvbnRlbnRWaWV3LlZJRVdfSUQpOwotCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCXZpZXcgPSBhY3RpdmVQYWdlLnNob3dWaWV3KENvbnRlbnRWaWV3LlZJRVdfSUQpOwotCQkJfQotCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCSgoQ29udGVudFZpZXcpIHZpZXcpLmRpc3BsYXlIVE1MQ29udGVudFBhZ2UoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTZmNDQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1UZXh0ICgqID0gYW55IHN0cmluZywgPyA9IGFueSBjaGFyYWN0ZXIpOgotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9Q2FzZSBzZW5zaXRpdmUKLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1NZXRob2QgZWxlbWVudCBuYW1lIG9yIHByZXNlbnRhdGlvbiBuYW1lIHBhdHRlcm46Ci1zY29wZUdyb3VwX3RleHQ9U2NvcGUKLXJvbGVDaGVja2JveF90ZXh0PVJvbGUKLXRhc2tDaGVja2JveF90ZXh0PVRhc2sKLXdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dD1Xb3JrIFByb2R1Y3QKLQotIyBNZXRob2QgU2VhcmNoIFF1ZXJ5Ci1zZWFyY2hRdWVyeV90ZXh0PU1ldGhvZCBTZWFyY2gKLQotIyBNZXRob2QgU2VhcmNoIFByb2dyZXNzIERpYWxvZwotc2NhbkxpYnJhcnlUYXNrX25hbWU9U2Nhbm5pbmcgbWV0aG9kIGxpYnJhcnkuLi4KLXNjYW5FbGVtZW50VGFza19uYW1lPVNjYW5uaW5nIG1ldGhvZCBlbGVtZW50ICcnezB9JycuLi4KLQotIyBNZXRob2QgU2VhcmNoIEVycm9yIERpYWxvZwotc2VhcmNoRXJyb3JfdGl0bGU9TWV0aG9kIFNlYXJjaAotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogU2VhcmNoIG9wZXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLXNlYXJjaEVycm9yX3JlYXNvbj1ObyBtZXRob2QgbGlicmFyeSBpcyBjdXJyZW50bHkgb3BlbmVkLlxuXG5PcGVuIGEgbWV0aG9kIGxpYnJhcnkgYW5kIHRyeSBhZ2Fpbi4KLQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdAotc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ9TWV0aG9kIENvbnRlbnQKLXNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM9Q29udGVudCBQYWNrYWdlcwotc2VhcmNoUmVzdWx0X3N0YW5kYXJkQ2F0ZWdvcmllcz1TdGFuZGFyZCBDYXRlZ29yaWVzCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9RGlzY2lwbGluZXMKLXNlYXJjaFJlc3VsdF9kb21haW5zPURvbWFpbnMKLXNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzPVdvcmsgUHJvZHVjdCBUeXBlcwotc2VhcmNoUmVzdWx0X3JvbGVTZXRzPVJvbGUgU2V0cwotc2VhcmNoUmVzdWx0X3Rvb2xzPVRvb2xzCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1DdXN0b20gQ2F0ZWdvcmllcwotc2VhcmNoUmVzdWx0X3Byb2Nlc3Nlcz1Qcm9jZXNzZXMKLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9Q2FwYWJpbGl0eSBQYXR0ZXJucwotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPURlbGl2ZXJ5IFByb2Nlc3Nlcwotc2VhcmNoUmVzdWx0X21hdGNoPScnezB9JycgLSAxIG1hdGNoCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IG1hdGNoZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzMzdmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIFVJIHBsdWctaW4gYWN0aXZhdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlYXJjaFVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlYXJjaFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VhcmNoVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwZDMyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIFVJIHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZWFyY2hVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBTZWFyY2hVSVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hTdHJpbmdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50TmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzY29wZUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUXVlcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjYW5MaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2NhbkVsZW1lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfZG9tYWluczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3JvbGVTZXRzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3Rvb2xzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2N1c3RvbUNhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfcHJvY2Vzc2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJuczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9kZWxpdmVyeVByb2Nlc3NlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9tYXRjaDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9tYXRjaGVzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgU2VhcmNoVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZS4KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkMmRmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uIHsKLQlNYXA8PywgPz4gZ2V0SW5wdXQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMGYwOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RTZWFyY2hJbnB1dEZhY3RvcnkgewotCUlNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbiBjcmVhdGVTZWFyY2hJbnB1dChDb21wb3NpdGUgY29tcG9zaXRlKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmZiZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RTZWFyY2hPcGVyYXRpb24gewotCXZvaWQgZXhlY3V0ZShNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dCwgSVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hRdWVyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4ZWRhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBtZXRob2Qgc2VhcmNoIHF1ZXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFNlYXJjaFF1ZXJ5IGV4dGVuZHMgSVNlYXJjaFF1ZXJ5IHsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YTU1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hTY29wZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RTZWFyY2hTY29wZUdyb3VwIHsKLQlNZXRob2RTZWFyY2hTY29wZVZpZXdlciBnZXRTZWFyY2hTY29wZVZpZXdlcigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoU2NvcGVHcm91cEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NzZlMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoU2NvcGVHcm91cEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDctMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogTm90ZSB0byBVLlMuIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHM6Ci0gKiBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlCi0gKiBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgNy41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RTZWFyY2hTY29wZUdyb3VwRmFjdG9yeSB7Ci0JCi0JSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAgY3JlYXRlU2VhcmNoU2NvcGVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwYjUwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBtZXRob2Qgc2VhcmNoIHJlc3VsdCBjb2xsZWN0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hSZXN1bHRDb2xsZWN0b3IgewotCi0JLyoqCi0JICogRXZhbHVhdGVzIHRoZSBnaXZlbiBvYmplY3QgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2ggaW4gdGhlIHNlYXJjaAotCSAqIGNyaXRlcmlhLgotCSAqIAotCSAqIEBwYXJhbSBtYXRjaAotCSAqICAgICAgICAgICAgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBlbGVtZW50IHRvIG1hdGNoCi0JICovCi0Jdm9pZCBhY2NlcHQoT2JqZWN0IG1hdGNoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViNjZjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5IHsKLQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcmVhdGVUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCi0JSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY3JlYXRlVGFibGVDb250ZW50UHJvdmlkZXIoKTsKLQkKLQlJTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRWaWV3U29ydGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRWaWV3U29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzQxY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50Vmlld1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0vKioKLSAqIFNvcnRzIHRoZSBtZXRob2QgZWxlbWVudHMgaW4gYSBzcGVjaWZpYyBvcmRlciBmb3IgZGlzcGxheSBpbiB0aGUgU2VhcmNoCi0gKiB2aWV3LgotICogPHA+Ci0gKiBUaGUgbWV0aG9kIGVsZW1lbnRzIGFyZSBzb3J0ZWQgYnkgdHlwZXMuIFdpdGhpbiBlYWNoIHR5cGUsIHRoZSBlbGVtZW50cyBhcmUKLSAqIHNvcnRlZCBhbHBoYWJldGljYWxseSBieSBuYW1lcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50Vmlld1NvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50Vmlld1NvcnRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyI2NvbXBhcmUoVmlld2VyLCBPYmplY3QsCi0JICogICAgICBPYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUm9sZSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFJvbGUpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgVGFzaykgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGUgfHwgZTIgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlIHx8IGUyIGluc3RhbmNlb2YgVGFzawotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUyIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlTdHJpbmcgbmFtZTEgPSBlMS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmFtZTIgPSBlMi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlpZiAoIW5hbWUxLmVxdWFscyhuYW1lMikpIHsKLQkJCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlIHx8IGUyIGluc3RhbmNlb2YgVGFzawotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0IHx8IGUyIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCQkmJiAhKGUyIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTEgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQkJJiYgZTIgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0gZWxzZSBpZiAoZTIgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQlTdHJpbmcgbmFtZTEgPSBlMS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmFtZTIgPSBlMi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlpZiAoIW5hbWUxLmVxdWFscyhuYW1lMikpIHsKLQkJCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSAmJiAhKGUyIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTIgaW5zdGFuY2VvZiBQcm9jZXNzICYmICEoZTEgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwgZTIgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIFBoYXNlKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIEl0ZXJhdGlvbikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIFBoYXNlIHx8IGUyIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGUyIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgZTIgaW5zdGFuY2VvZiBNaWxlc3RvbmUKLQkJCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgZTIgaW5zdGFuY2VvZiBNaWxlc3RvbmUKLQkJCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQkJCXx8IGUyIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjYyMzQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaEhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJTWV0aG9kU2VhcmNoT3BlcmF0aW9uIG5ld1NlYXJjaE9wZXJhdGlvbigpIHsKLQkJT2JqZWN0IGV4dCA9IEV4dGVuc2lvbk1hbmFnZXIuY3JlYXRlRXh0ZW5zaW9uKFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAib3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYoZXh0IGluc3RhbmNlb2YgSU1ldGhvZFNlYXJjaE9wZXJhdGlvbikgewotCQkJcmV0dXJuIChJTWV0aG9kU2VhcmNoT3BlcmF0aW9uKSBleHQ7Ci0JCX0KLQkJcmV0dXJuIG5ldyBNZXRob2RTZWFyY2hPcGVyYXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaElucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaElucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMDc2ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgc2VhcmNoIHN0cmluZ3MgYW5kIG9wdGlvbnMgdGhhdCBhcmUgdXNlZCBhcyBpbnB1dHMgdG8gYQotICogbWV0aG9kIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hJbnB1dCB7Ci0KLQlwcml2YXRlIFN0cmluZyBzZWFyY2hTdHJpbmc7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lUGF0dGVybjsKLQotCXByaXZhdGUgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlOwotCi0JcHJpdmF0ZSBib29sZWFuIHdob2xlV29yZDsKLQotCXByaXZhdGUgYm9vbGVhbiByZWdFeHA7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlOwotCi0JcHJpdmF0ZSBNYXA8T2JqZWN0LCBPYmplY3Q+IGFkZGl0aW9uYWxJbnB1dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNlYXJjaFN0cmluZwotCSAqICAgICAgICAgICAgYSBzZWFyY2ggc3RyaW5nCi0JICogQHBhcmFtIG5hbWVQYXR0ZXJuCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IG5hbWUgcGF0dGVybgotCSAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgbWFrZSB0aGUgc2VhcmNoIGNhc2Ugc2Vuc2l0aXZlCi0JICogQHBhcmFtIHdob2xlV29yZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlYXJjaCBmb3Igd2hvbGUgd29yZCBvbmx5Ci0JICogQHBhcmFtIHJlZ0V4cAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlYXJjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gc2VhcmNoU2NvcGUKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHNjb3BlCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaElucHV0KFN0cmluZyBzZWFyY2hTdHJpbmcsIFN0cmluZyBuYW1lUGF0dGVybiwKLQkJCWJvb2xlYW4gY2FzZVNlbnNpdGl2ZSwgYm9vbGVhbiB3aG9sZVdvcmQsIGJvb2xlYW4gcmVnRXhwLAotCQkJTWV0aG9kU2VhcmNoU2NvcGUgc2VhcmNoU2NvcGUpIHsKLQkJdGhpcy5zZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmc7Ci0JCXRoaXMubmFtZVBhdHRlcm4gPSBuYW1lUGF0dGVybjsKLQkJdGhpcy5jYXNlU2Vuc2l0aXZlID0gY2FzZVNlbnNpdGl2ZTsKLQkJdGhpcy53aG9sZVdvcmQgPSB3aG9sZVdvcmQ7Ci0JCXRoaXMucmVnRXhwID0gcmVnRXhwOwotCQl0aGlzLnNlYXJjaFNjb3BlID0gc2VhcmNoU2NvcGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VhcmNoIHN0cmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWFyY2ggc3RyaW5nIHRvIGxvb2sgZm9yIHRoZSBNZXRob2QgZWxlbWVudCBjb250ZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmcoKSB7Ci0JCXJldHVybiBzZWFyY2hTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBwYXR0ZXJuLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgcGF0dGVybiB1c2VkIHRvIG1hdGNoIHRoZSBNZXRob2QgZWxlbWVudCBuYW1lcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBuYW1lUGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYXNlIHNlbnNpdGl2aXR5IG9mIHRoZSBzZWFyY2guCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VhcmNoIGlzIGNhc2Ugc2Vuc2l0aXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGNhc2VTZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2hvbGUgd29yZCBvcHRpb24gb2YgdGhlIHNlYXJjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWFyY2ggaXMgYmFzZWQgb24gd2hvbGUgd29yZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFdob2xlV29yZCgpIHsKLQkJcmV0dXJuIHdob2xlV29yZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gb3B0aW9uIG9mIHRoZSBzZWFyY2guCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VhcmNoIGlzIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFJlZ3VsYXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcmVnRXhwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlYXJjaCBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWFyY2ggc2NvcGUKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGUgZ2V0U2VhcmNoU2NvcGUoKSB7Ci0JCXJldHVybiBzZWFyY2hTY29wZTsKLQl9Ci0KLQlwdWJsaWMgTWFwPE9iamVjdCwgT2JqZWN0PiBnZXRBZGRpdGlvbmFsSW5wdXQoKSB7Ci0JCWlmKGFkZGl0aW9uYWxJbnB1dCA9PSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsSW5wdXQgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbElucHV0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoT3BlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTM2YmU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuQWJzdHJhY3RTQVhQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIFBlcmZvcm1zIGEgbWV0aG9kIHNlYXJjaCBieSBpdGVyYXRpbmcgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgYW5kIHBhcnNpbmcKLSAqIHRoZSBjb250ZW50IGVsZW1lbnQgWE1JIGZpbGVzIHdoZXJlIG5lY2Vzc2FyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoT3BlcmF0aW9uIGltcGxlbWVudHMgSU1ldGhvZFNlYXJjaE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTl9MSUJSQVJZX1RFWFQgPSBTZWFyY2hVSVJlc291cmNlcy5zY2FuTGlicmFyeVRhc2tfbmFtZTsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTl9FTEVNRU5UX1RFWFQgPSBTZWFyY2hVSVJlc291cmNlcy5zY2FuRWxlbWVudFRhc2tfbmFtZTsgCi0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWc7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQ7Ci0KLQlwcml2YXRlIElTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0OwotCi0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoU3RyaW5nOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnRXhwOwotCi0JcHJpdmF0ZSBQYXR0ZXJuIHNlYXJjaFN0cmluZ1BhdHRlcm47Ci0KLQlwcml2YXRlIFBhdHRlcm4gZWxlbWVudE5hbWVQYXR0ZXJuOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50U2Nhbm5lciBlbGVtZW50U2Nhbm5lcjsKLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHBhcnNlZEZpbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCi0JLy8gU2NhbnMgdGhlIGNvbnRlbnQgZWxlbWVudCBYTUkgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBNZXRob2QgZWxlbWVudCB0bwotCS8vIGxvb2sgZm9yIHRoZSBzZWFyY2ggc3RyaW5nLgotCXByaXZhdGUgY2xhc3MgTWV0aG9kRWxlbWVudFNjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFNBWFBhcnNlciB7Ci0KLQkJcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqLwotCQlwdWJsaWMgTWV0aG9kRWxlbWVudFNjYW5uZXIoKSB7Ci0JCQlzdXBlcihudWxsLCBmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2VzIHRoZSBjb250ZW50IFhNSSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudAotCQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCVN0cmluZyBlbGVtZW50Q29udGVudFBhdGggPSBnZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLQkJCVN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoc2VhcmNoU3RyaW5nUGF0dGVybi5tYXRjaGVyKGJyaWVmRGVzY3JpcHRpb24pLmZpbmQoKSkgewotCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudENvbnRlbnRQYXRoICE9IG51bGwKLQkJCQkJJiYgIXBhcnNlZEZpbGVzLmNvbnRhaW5zKGVsZW1lbnRDb250ZW50UGF0aCkpIHsKLQkJCQlzdXBlci5wYXJzZShlbGVtZW50Q29udGVudFBhdGgpOwotCQkJCXBhcnNlZEZpbGVzLmFkZChlbGVtZW50Q29udGVudFBhdGgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQWJzdHJhY3RTQVhQYXJzZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsCi0JCSAqICAgICAgQXR0cmlidXRlcykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJMLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJCVN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKLQkJCQlpZiAoIW5hbWUuZXF1YWxzKCJicmllZkRlc2NyaXB0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlpZiAoc2VhcmNoU3RyaW5nUGF0dGVybi5tYXRjaGVyKHZhbHVlKS5maW5kKCkpIHsKLQkJCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBBYnN0cmFjdFNBWFBhcnNlciNlbmRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQkJU3RyaW5nIHFuYW1lKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCWlmIChzZWFyY2hTdHJpbmdQYXR0ZXJuLm1hdGNoZXIodmFsdWUpLmZpbmQoKSkgewotCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQl9Ci0JCQlzdHJCdWYuc2V0TGVuZ3RoKDApOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHN0cmluZwotCSAqIEBwYXJhbSBuYW1lUGF0dGVybgotCSAqICAgICAgICAgICAgYSBuYW1lIHBhdHRlcm4KLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogICAgICAgICAgICBhIHNlYXJjaCByZXN1bHQgY29sbGVjdG9yCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaE9wZXJhdGlvbihNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dCwKLQkJCUlTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0KSB7Ci0JCWluaXRpYWxpemUoc2VhcmNoSW5wdXQsIHJlc3VsdCk7Ci0JfQotCi0JcHVibGljIE1ldGhvZFNlYXJjaE9wZXJhdGlvbigpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dCwKLQkJCUlTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0KSB7Ci0JCXRoaXMuc2VhcmNoSW5wdXQgPSBzZWFyY2hJbnB1dDsKLQkJdGhpcy5yZXN1bHQgPSByZXN1bHQ7Ci0KLQkJY2FzZVNlbnNpdGl2ZSA9IHNlYXJjaElucHV0LmdldENhc2VTZW5zaXRpdmUoKTsKLQkJcmVnRXhwID0gc2VhcmNoSW5wdXQuZ2V0UmVndWxhckV4cHJlc3Npb24oKTsKLQkJZWxlbWVudE5hbWVQYXR0ZXJuID0gTWV0aG9kU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHNlYXJjaElucHV0Ci0JCQkJLmdldE5hbWVQYXR0ZXJuKCksIGZhbHNlLCBmYWxzZSk7Ci0KLQkJZGVidWcgPSBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCQlzZWFyY2hTdHJpbmcgPSBzZWFyY2hJbnB1dC5nZXRTZWFyY2hTdHJpbmcoKTsKLQkJaWYgKHNlYXJjaFN0cmluZyA9PSBudWxsKQotCQkJc2VhcmNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlYXJjaFN0cmluZy5sZW5ndGgoKSA+IDAgJiYgIXNlYXJjaFN0cmluZy5lcXVhbHMoIioiKSkgeyAvLyROT04tTkxTLTEkCi0JCQllbGVtZW50U2Nhbm5lciA9IG5ldyBNZXRob2RFbGVtZW50U2Nhbm5lcigpOwotCQkJc2VhcmNoU3RyaW5nUGF0dGVybiA9IE1ldGhvZFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybigKLQkJCQkJc2VhcmNoU3RyaW5nLCBjYXNlU2Vuc2l0aXZlLCByZWdFeHApOwotCQl9Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJNZXRob2RTZWFyY2hPcGVyYXRpb24gY29uc3RydWN0b3I6IHNlYXJjaFN0cmluZz0iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHNlYXJjaFN0cmluZwotCQkJCQkJCSsgIiwgZWxlbWVudE5hbWVQYXR0ZXJuPSIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgc2VhcmNoSW5wdXQuZ2V0TmFtZVBhdHRlcm4oKQotCQkJCQkJCSsgIiwgY2FzZVNlbnNpdGl2ZT0iICsgY2FzZVNlbnNpdGl2ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGdldFNlYXJjaGFibGVNZXRob2RQbHVnaW5zKCkgewotCQlyZXR1cm4gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgc2VhcmNoIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXRoaXMucHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOwotCQl0aGlzLnByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soU0NBTl9MSUJSQVJZX1RFWFQsIDc1MDApOwotCi0JCS8vIEl0ZXJhdGUgdGhlIE1ldGhvZCBQbHVnaW4gdG8gbG9vayBmb3IgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgbmFtZQotCQkvLyBwYXR0ZXJuLgotCQlDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gbWV0aG9kUGx1Z2lucyA9IGdldFNlYXJjaGFibGVNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKQotCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGkubmV4dCgpOwotCQkJbWF0Y2hQYXR0ZXJuKG1ldGhvZFBsdWdpbik7Ci0KLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZTsKLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGVDb3JlQ29udGVudCgpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5TVEFOREFSRF9DQVRFR09SWSkpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5DVVNUT01fQ0FURUdPUlkpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5DQVBBQklMSVRZX1BBVFRFUk4pKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5ERUxJVkVSWV9QUk9DRVNTKSkgewotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBhIE1ldGhvZCBQYWNrYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwYWNrYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoTWV0aG9kUGFja2FnZXMoTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlKSB7Ci0JCWlmIChtZXRob2RQYWNrYWdlID09IG51bGwKLQkJCQl8fCBtZXRob2RQYWNrYWdlLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gQWRkIHRoZSBhc3NvY2lhdGVkIENhcGFiaWxpdHlQYXR0ZXJuIG9yIERlbGl2ZXJ5UHJvY2VzcyB0byB0aGUKLQkJCS8vIHNlYXJjaCByZXN1bHQuCi0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbWV0aG9kUGFja2FnZTsKLQkJCW1hdGNoUGF0dGVybihwcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKSk7Ci0JCX0gZWxzZSBpZiAoIWlzSW50ZXJuYWxQcm9jZXNzUGFja2FnZShtZXRob2RQYWNrYWdlKSkgewotCQkJbWF0Y2hQYXR0ZXJuKG1ldGhvZFBhY2thZ2UpOwotCQl9Ci0KLQkJTGlzdCBjaGlsZFBhY2thZ2VzID0gbWV0aG9kUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkKLQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpLm5leHQoKSk7Ci0JCX0KLQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIG1ldGhvZFBhY2thZ2U7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IGNvbnRlbnRQYWNrYWdlLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBqID0gY29udGVudEVsZW1lbnRzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBqLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCXNlYXJjaENvbnRhaW5lZEFydGlmYWN0cygoQXJ0aWZhY3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlzZWFyY2hTdWJEaXNjaXBsaW5lcygoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQlzZWFyY2hTdWJQcmFjdGljZXMoKFByYWN0aWNlKSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCQlzZWFyY2hTdWJEb21haW5zKChEb21haW4pIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZTsKLQkJCUxpc3QgcHJvY2Vzc0VsZW1lbnRzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGogPSBwcm9jZXNzRWxlbWVudHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpIGoubmV4dCgpOwotLy8JCQkJaWYgKCEocHJvY2Vzc0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJbWF0Y2hQYXR0ZXJuKHByb2Nlc3NFbGVtZW50KTsKLS8vCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhY2thZ2UgaXMgYW4gaW50ZXJuYWwgUHJvY2VzcwotCSAqIFBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZFBhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIG9yIHByb2Nlc3MgcGFja2FnZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhY2thZ2UgaXMgYW4gaW50ZXJuYWwgcHJvY2VzcwotCSAqICAgICAgICAgcGFja2FnZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJuYWxQcm9jZXNzUGFja2FnZShNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKFVtYVV0aWwuZ2V0UHJvY2Vzc0NvbXBvbmVudChtZXRob2RQYWNrYWdlKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIHRoZSBjb250YWluZWQgYXJ0aWZhY3RzIG9mIGFuIGFydGlmYWN0LgotCSAqIAotCSAqIEBwYXJhbSBhcnRpZmFjdAotCSAqICAgICAgICAgICAgYW4gYXJ0aWZhY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hDb250YWluZWRBcnRpZmFjdHMoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLQkJaWYgKGFydGlmYWN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlBcnRpZmFjdCBjb250YWluZWRBcnRpZmFjdCA9IChBcnRpZmFjdCkgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKGNvbnRhaW5lZEFydGlmYWN0KTsKLQkJCQlzZWFyY2hDb250YWluZWRBcnRpZmFjdHMoY29udGFpbmVkQXJ0aWZhY3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIHN1YiBkaXNjaXBsaW5lcyBvZiBhIGRpc2NpcGxpbmUuCi0JICogCi0JICogQHBhcmFtIGRpc2NpcGxpbmUKLQkgKiAgICAgICAgICAgIGEgZGlzY2lwbGluZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlYXJjaFN1YkRpc2NpcGxpbmVzKERpc2NpcGxpbmUgZGlzY2lwbGluZSkgewotCQlpZiAoZGlzY2lwbGluZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBkaXNjaXBsaW5lLmdldFN1YmRpc2NpcGxpbmUoKS5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJRGlzY2lwbGluZSBzdWJEaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGkubmV4dCgpOwotCQkJCW1hdGNoUGF0dGVybihzdWJEaXNjaXBsaW5lKTsKLQkJCQlzZWFyY2hTdWJEaXNjaXBsaW5lcyhzdWJEaXNjaXBsaW5lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIHRoZSBzdWIgcHJhY3RpY2VzIG9mIGEgcHJhY3RpY2UuCi0JICogCi0JICogQHBhcmFtIHByYWN0aWNlCi0JICogICAgICAgICAgICBhIHByYWN0aWNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoU3ViUHJhY3RpY2VzKFByYWN0aWNlIHByYWN0aWNlKSB7Ci0JCWlmIChwcmFjdGljZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcmFjdGljZS5nZXRTdWJQcmFjdGljZXMoKS5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJUHJhY3RpY2Ugc3ViUHJhY3RpY2UgPSAoUHJhY3RpY2UpIGkubmV4dCgpOwotCQkJCW1hdGNoUGF0dGVybihzdWJQcmFjdGljZSk7Ci0JCQkJc2VhcmNoU3ViUHJhY3RpY2VzKHN1YlByYWN0aWNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIHRoZSBzdWIgZG9tYWlucyBvZiBhIGRvbWFpbi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICBhIGRvbWFpbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlYXJjaFN1YkRvbWFpbnMoRG9tYWluIGRvbWFpbikgewotCQlpZiAoZG9tYWluICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRvbWFpbi5nZXRTdWJkb21haW5zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJRG9tYWluIHN1YkRvbWFpbiA9IChEb21haW4pIGkubmV4dCgpOwotCQkJCW1hdGNoUGF0dGVybihzdWJEb21haW4pOwotCQkJCXNlYXJjaFN1YkRvbWFpbnMoc3ViRG9tYWluKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IHRvIHRoZSBzZWFyY2ggcmVzdWx0IGNvbGxlY3Rpb24gaWYgaXRzIG5hbWUKLQkgKiBvciBwcmVzZW50YXRpb24gbmFtZSBtYXRjaGVzIHRoZSBuYW1lIHBhdHRlcm4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYXRjaFBhdHRlcm4oTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKGVsZW1lbnQpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgdGFza05hbWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChTQ0FOX0VMRU1FTlRfVEVYVCwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5hbWUgfSk7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldFRhc2tOYW1lKHRhc2tOYW1lKTsKLQkJCQlib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCWZvdW5kTWF0Y2ggPSAobmFtZSAhPSBudWxsICYmIGVsZW1lbnROYW1lUGF0dGVybi5tYXRjaGVyKAotCQkJCQkJCW5hbWUpLm1hdGNoZXMoKSkKLQkJCQkJCQl8fCAocHJlc2VudGF0aW9uTmFtZSAhPSBudWxsICYmIGVsZW1lbnROYW1lUGF0dGVybgotCQkJCQkJCQkJLm1hdGNoZXIocHJlc2VudGF0aW9uTmFtZSkubWF0Y2hlcygpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3VuZE1hdGNoID0gKG5hbWUgIT0gbnVsbCAmJiBlbGVtZW50TmFtZVBhdHRlcm4ubWF0Y2hlcigKLQkJCQkJCQluYW1lKS5tYXRjaGVzKCkpOwotCQkJCX0KLQkJCQlpZiAoZm91bmRNYXRjaCkgewotCQkJCQlpZiAoc2VhcmNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgc2VhcmNoU3RyaW5nLmVxdWFscygiKiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWVsZW1lbnRTY2FubmVyLnBhcnNlKGVsZW1lbnQpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBjb250ZW50IFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZAotCSAqIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50UGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlc2NyaWJhYmxlRWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZGVzY3JpYmFibGVFbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmVzb3VyY2UgPSBjb250ZW50RGVzY3JpcHRpb24uZVJlc291cmNlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvdXJjZSA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCVVSSSByZXNvdXJjZVVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJaWYgKHJlc291cmNlVVJJICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VVUkkudG9GaWxlU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dCwKLQkJCUlTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaW5pdGlhbGl6ZShzZWFyY2hJbnB1dCwgcmVzdWx0KTsKLQkJZXhlY3V0ZShtb25pdG9yKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFBhdHRlcm4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTc2MTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQYXR0ZXJuIGNvbnRydWN0b3IgZm9yIGEgbWV0aG9kIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hQYXR0ZXJuIHsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFBhdHRlcm4oKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhCi0JICogPGNvZGU+UGF0dGVybjxjb2RlPiBvYmplY3QgZnJvbSB0aGUgcGF0dGVybiBzdHJpbmcgdXNlZCBpbiBNZXRob2QgU2VhcmNoLgotCSAqIAotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBhIHNlYXJjaCBwYXR0ZXJuIHN0cmluZwotCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBjcmVhdGUgYSBjYXNlIGluc2Vuc2l0dmUgcGF0dGVybgotCSAqIEBwYXJhbSBpc1JlZ2V4U2VhcmNoCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdHJlYXQgdGhlIHBhdHRlcm4gYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybgotCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+UGF0dGVybjxjb2RlPiBvYmplY3QKLQkgKiBAdGhyb3dzIDxjb2RlPlBhdHRlcm5TeW50YXhFeGNlcHRpb248L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBoYXMgYSBzeW50YXggZXJyb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmcgcGF0dGVybiwKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBib29sZWFuIGlzUmVnZXhTZWFyY2gpCi0JCQl0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNSZWdleFNlYXJjaCkgewotCQkJcGF0dGVybiA9IHRvUmVnZXhQYXR0ZXJuKHBhdHRlcm4pOwotCQl9Ci0KLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFCi0JCQkJCXwgUGF0dGVybi5VTklDT0RFX0NBU0UgfCBQYXR0ZXJuLk1VTFRJTElORSk7Ci0JCX0KLQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIFBhdHRlcm4uTVVMVElMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHBhdHRlcm4gc3RyaW5nIHdpdGggJyonIGFuZCAnPycgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqIHBhdHRlcm4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBhIHBhdHRlcm4gc3RyaW5nCi0JICogQHJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1JlZ2V4UGF0dGVybihTdHJpbmcgcGF0dGVybikgewotCQlpbnQgcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhdHRlcm5MZW5ndGgpOwotCi0JCWJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOwotCQlib29sZWFuIHF1b3RpbmcgPSBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5MZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHBhdHRlcm4uY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnKic6Ci0JCQkJaWYgKCFlc2NhcGVkKSB7Ci0JCQkJCWlmIChxdW90aW5nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcXVvdGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdC5hcHBlbmQoIi4qIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllc2NhcGVkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc/JzoKLQkJCQlpZiAoIWVzY2FwZWQpIHsKLQkJCQkJaWYgKHF1b3RpbmcpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlxdW90aW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZXNjYXBlZCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCWlmICghZXNjYXBlZCkgewotCQkJCQllc2NhcGVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQllc2NhcGVkID0gZmFsc2U7Ci0JCQkJCWlmIChxdW90aW5nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcXVvdGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJlc3VsdC5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKCFxdW90aW5nKSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoIlxcUSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXF1b3RpbmcgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoZXNjYXBlZCAmJiBjaCAhPSAnKicgJiYgY2ggIT0gJz8nICYmIGNoICE9ICdcXCcpIHsKLQkJCQkJcmVzdWx0LmFwcGVuZCgnXFwnKTsKLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQkJZXNjYXBlZCA9IChjaCA9PSAnXFwnKTsKLQkJCX0KLQkJfQotCi0JCWlmIChxdW90aW5nKSB7Ci0JCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hRdWVyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2E5YWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgc2VhcmNoIHN0cmluZ3MgYW5kIG9wdGlvbnMgZm9yIGEgbWV0aG9kIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hRdWVyeSBpbXBsZW1lbnRzIElTZWFyY2hRdWVyeSB7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0OwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoU3RyaW5nCi0JICogICAgICAgICAgICBhIHNlYXJjaCBzdHJpbmcKLQkgKiBAcGFyYW0gbmFtZVBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgbmFtZSBwYXR0ZXJuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFF1ZXJ5KE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0KSB7Ci0JCXRoaXMuc2VhcmNoSW5wdXQgPSBzZWFyY2hJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvY2Vzc01vbml0b3IpIHsKLQkJZmluYWwgTWV0aG9kU2VhcmNoUmVzdWx0IHNlYXJjaFJlc3VsdCA9IChNZXRob2RTZWFyY2hSZXN1bHQpIGdldFNlYXJjaFJlc3VsdCgpOwotCQlzZWFyY2hSZXN1bHQucmVtb3ZlQWxsKCk7Ci0JCUlTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IElTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY2NlcHQoT2JqZWN0IG1hdGNoKSB7Ci0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBtYXRjaCkpIHsKLQkJCQkJT2JqZWN0W10gbWF0Y2hlcyA9IHNlYXJjaFJlc3VsdC5nZXRNYXRjaGVzKG1hdGNoKTsKLQkJCQkJaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCBtYXRjaGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlzZWFyY2hSZXN1bHQuYWRkTWF0Y2gobmV3IE1hdGNoKG1hdGNoLCBNYXRjaC5VTklUX0xJTkUsCi0JCQkJCQkJCTEsIDEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLS8vCQlNZXRob2RTZWFyY2hPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE1ldGhvZFNlYXJjaE9wZXJhdGlvbigKLS8vCQkJCXNlYXJjaElucHV0LCByZXN1bHQpOwotLy8JCW9wZXJhdGlvbi5leGVjdXRlKHByb2Nlc3NNb25pdG9yKTsKLQkJSU1ldGhvZFNlYXJjaE9wZXJhdGlvbiBvcCA9IE1ldGhvZFNlYXJjaEhlbHBlci5uZXdTZWFyY2hPcGVyYXRpb24oKTsKLQkJb3AuZXhlY3V0ZShzZWFyY2hJbnB1dCwgcmVzdWx0LCBwcm9jZXNzTW9uaXRvcik7Ci0JCXByb2Nlc3NNb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUXVlcnlfdGV4dDsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJlcnVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0U2VhcmNoUmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgSVNlYXJjaFJlc3VsdCBnZXRTZWFyY2hSZXN1bHQoKSB7Ci0JCWlmIChzZWFyY2hSZXN1bHQgPT0gbnVsbCkgewotCQkJc2VhcmNoUmVzdWx0ID0gbmV3IE1ldGhvZFNlYXJjaFJlc3VsdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gc2VhcmNoUmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hJbnB1dCBnZXRTZWFyY2hJbnB1dCgpIHsKLQkJcmV0dXJuIHNlYXJjaElucHV0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hSZXN1bHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTYzMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUZpbGVNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogVGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFJlc3VsdCBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCBpbXBsZW1lbnRzCi0JCUlFZGl0b3JNYXRjaEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BVENIX0xBQkVMID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X21hdGNoOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRDSEVTX0xBQkVMID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X21hdGNoZXM7IAotCi0JLy8gVGhlIHNlYXJjaCBxdWVyeS4KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoUXVlcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHNlYXJjaCBxdWVyeQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hSZXN1bHQoTWV0aG9kU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkpIHsKLQkJdGhpcy5zZWFyY2hRdWVyeSA9IHNlYXJjaFF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQjZ2V0UXVlcnkoKQotCSAqLwotCXB1YmxpYyBJU2VhcmNoUXVlcnkgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiBzZWFyY2hRdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQjZ2V0TGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCS8vIFRPRE86IERpc3BsYXkgc2VhcmNoIHJlc3VsdCBpbiB0aGUgZm9ybToKLQkJLy8gICAgJ2NhbmRpZGF0ZScgLSA2IG1hdGNoZXMgaW4gNCBlbGVtZW50cy4KLQkJU3RyaW5nIHNlYXJjaFN0cmluZyA9IHNlYXJjaFF1ZXJ5LmdldFNlYXJjaElucHV0KCkuZ2V0U2VhcmNoU3RyaW5nKCk7Ci0JCWludCBtYXRjaENvdW50ID0gZ2V0TWF0Y2hDb3VudCgpOwotCQlpZiAobWF0Y2hDb3VudCA9PSAxKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTUFUQ0hfTEFCRUwsCi0JCQkJCW5ldyBPYmplY3RbXSB7IHNlYXJjaFN0cmluZyB9KTsJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1BVENIRVNfTEFCRUwsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCXNlYXJjaFN0cmluZywgIiIgKyBtYXRjaENvdW50IH0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0I2dldFRvb2x0aXAoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbHRpcCgpIHsKLQkJcmV0dXJuIGdldExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQjZ2V0RWRpdG9yTWF0Y2hBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgSUVkaXRvck1hdGNoQWRhcHRlciBnZXRFZGl0b3JNYXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0I2dldEZpbGVNYXRjaEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBJRmlsZU1hdGNoQWRhcHRlciBnZXRGaWxlTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXIjaXNTaG93bkluRWRpdG9yKE1hdGNoLAotCSAqICAgICAgSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG93bkluRWRpdG9yKE1hdGNoIG1hdGNoLCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlciNjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQsCi0JICogICAgICBJRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgTWF0Y2hbXSBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0LAotCQkJSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDFkYzM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgbWV0aG9kIHNlYXJjaCBzY29wZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoU2NvcGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9ICJSb290IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTlRFTlQgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX0NPTlRFTlQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFID0gTGlicmFyeVVJVGV4dC5URVhUX1JPTEU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLID0gTGlicmFyeVVJVGV4dC5URVhUX1RBU0s7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1QgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0UgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfR1VJREFOQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0xJU1QgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0hFQ0tMSVNUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OQ0VQVCA9IExpYnJhcnlVSVRleHQuVEVYVF9DT05DRVBUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IExpYnJhcnlVSVRleHQuVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhBTVBMRSA9IExpYnJhcnlVSVRleHQuVEVYVF9FWEFNUExFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREVMSU5FID0gTGlicmFyeVVJVGV4dC5URVhUX0dVSURFTElORTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSQUNUSUNFID0gTGlicmFyeVVJVGV4dC5URVhUX1BSQUNUSUNFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUID0gTGlicmFyeVVJVGV4dC5URVhUX1JFUE9SVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVVNBQkxFX0FTU0VUID0gTGlicmFyeVVJVGV4dC5URVhUX1JFVVNBQkxFX0FTU0VUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9BRE1BUCA9IExpYnJhcnlVSVRleHQuVEVYVF9ST0FETUFQOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVElOR19NQVRFUklBTCA9IExpYnJhcnlVSVRleHQuVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEUgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVNUExBVEU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0RFRklOSVRJT04gPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVSTV9ERUZJTklUSU9OOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9NRU5UT1IgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVE9PTF9NRU5UT1I7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVBBUEVSID0gTGlicmFyeVVJVGV4dC5URVhUX1dISVRFUEFQRVI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFOREFSRF9DQVRFR09SWSA9IExpYnJhcnlVSVRleHQuVEVYVF9TVEFOREFSRF9DQVRFR09SWTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWSA9IExpYnJhcnlVSVRleHQuVEVYVF9DVVNUT01fQ0FURUdPUlk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTID0gTGlicmFyeVVJVGV4dC5URVhUX1BST0NFU1M7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk4gPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTUyA9IExpYnJhcnlVSVRleHQuVEVYVF9ERUxJVkVSWV9QUk9DRVNTOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8RUNsYXNzLCBTdHJpbmc+IGVsZW1lbnRTZWFyY2hTY29wZSA9IG5ldyBIYXNoTWFwPEVDbGFzcywgU3RyaW5nPigpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248RUNsYXNzPj4gc2NvcGVUb0VDbGFzc2VzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPEVDbGFzcz4+KCk7Ci0KLQlzdGF0aWMgewotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbigpLCBST09UKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpLCBNRVRIT0RfQ09OVEVOVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZSgpLCBST0xFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCksIFRBU0spOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCksIFdPUktfUFJPRFVDVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKSwgV09SS19QUk9EVUNUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRjb21lKCksIFdPUktfUFJPRFVDVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSwgR1VJREFOQ0UpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpLCBDSEVDS0xJU1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmNlcHQoKSwgQ09OQ0VQVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhhbXBsZSgpLCBFWEFNUExFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKSwgR1VJREVMSU5FKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpLCBQUkFDVElDRSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVwb3J0KCksIFJFUE9SVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpLCBSRVVTQUJMRV9BU1NFVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9hZG1hcCgpLCBST0FETUFQKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQlTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpLCBURU1QTEFURSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKSwgVEVSTV9ERUZJTklUSU9OKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCksIFRPT0xfTUVOVE9SKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCksIFdISVRFUEFQRVIpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCksIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW4oKSwgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZSgpLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldCgpLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nKCksIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sKCksIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeSgpLCBDVVNUT01fQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnQoKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSwgQ0FQQUJJTElUWV9QQVRURVJOKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3MoKSwgREVMSVZFUllfUFJPQ0VTUyk7Ci0JCQotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFJPTEUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChUQVNLLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoV09SS19QUk9EVUNULCBBcnJheXMuYXNMaXN0KG5ldyBFQ2xhc3NbXSB7Ci0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3QoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGNvbWUoKQotCQl9KSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoQ0hFQ0tMSVNULCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2hlY2tsaXN0KCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChDT05DRVBULCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoRVhBTVBMRSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoR1VJREVMSU5FLCAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRlbGluZSgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoUFJBQ1RJQ0UsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoUkVQT1JULCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVwb3J0KCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChSRVVTQUJMRV9BU1NFVCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFJPQURNQVAsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2FkbWFwKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChTVVBQT1JUSU5HX01BVEVSSUFMLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChURU1QTEFURSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlbXBsYXRlKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChURVJNX0RFRklOSVRJT04sIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZXJtRGVmaW5pdGlvbigpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoVE9PTF9NRU5UT1IsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChXSElURVBBUEVSLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2hpdGVwYXBlcigpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoU1RBTkRBUkRfQ0FURUdPUlksIEFycmF5cy5hc0xpc3QobmV3IEVDbGFzc1tdIHsKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2woKQotCQl9KSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoQ1VTVE9NX0NBVEVHT1JZLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KENBUEFCSUxJVFlfUEFUVEVSTiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChERUxJVkVSWV9QUk9DRVNTLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZFNlYXJjaFNjb3BlIElOQ0xVREVfQUxMX1NFQVJDSF9TQ09QRSA9IG5ldyBNZXRob2RTZWFyY2hTY29wZShzY29wZVRvRUNsYXNzZXNNYXAua2V5U2V0KCkudG9BcnJheSgpKTsKLQotCXByaXZhdGUgTGlzdDxPYmplY3Q+IHNlYXJjaFNjb3BlID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0KLQlwcml2YXRlIEFycmF5TGlzdDxFQ2xhc3M+IHNlbGVjdGVkVHlwZXM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGUoT2JqZWN0W10gZWxlbWVudFR5cGVzKSB7Ci0JCXRoaXMoZWxlbWVudFR5cGVzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlKE9iamVjdFtdIGVsZW1lbnRUeXBlcywgYm9vbGVhbiBpbmNsdWRlUm9vdCkgewotCQlpZihpbmNsdWRlUm9vdCkgewotCQkJc2VhcmNoU2NvcGUuYWRkKFJPT1QpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZXNbaV07Ci0JCQlzZWFyY2hTY29wZS5hZGQoZWxlbWVudFR5cGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgY29yZSBtZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoIHNjb3BlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBjb3JlIG1ldGhvZCBlbGVtZW50IGlzIGluY2x1ZGVkIGluIHRoZQotCSAqICAgICAgICAgc2VhcmNoIHNjb3BlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZUNvcmVDb250ZW50KCkgewotCQlyZXR1cm4gc2VhcmNoU2NvcGUuY29udGFpbnMoUk9MRSkgfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoVEFTSykKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhXT1JLX1BST0RVQ1QpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoR1VJREFOQ0UpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoQ0hFQ0tMSVNUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKENPTkNFUFQpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUykKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhFWEFNUExFKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEdVSURFTElORSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhQUkFDVElDRSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhSRVBPUlQpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoUkVVU0FCTEVfQVNTRVQpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoUk9BRE1BUCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhTVVBQT1JUSU5HX01BVEVSSUFMKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFRFTVBMQVRFKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFRFUk1fREVGSU5JVElPTikKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhUT09MX01FTlRPUikKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhXSElURVBBUEVSKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaCBzY29wZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBlbGVtZW50IGlzIGluY2x1ZGVkIGluIHRoZQotCSAqICAgICAgICAgc2VhcmNoIHNjb3BlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHNlYXJjaFNjb3BlTmFtZSA9IChTdHJpbmcpIGVsZW1lbnRTZWFyY2hTY29wZS5nZXQoZWxlbWVudAotCQkJCS5lQ2xhc3MoKSk7Ci0JCXJldHVybiBzZWFyY2hTY29wZS5jb250YWlucyhzZWFyY2hTY29wZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCB0eXBlIGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2gKLQkgKiBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCB0eXBlIGlzIGluY2x1ZGVkCi0JICogICAgICAgICBpbiB0aGUgc2VhcmNoIHNjb3BlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShTdHJpbmcgc2VhcmNoU2NvcGVOYW1lKSB7Ci0JCXJldHVybiBzZWFyY2hTY29wZS5jb250YWlucyhzZWFyY2hTY29wZU5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPEVDbGFzcz4gZ2V0U2VsZWN0ZWRUeXBlcygpIHsKLQkJaWYgKHNlbGVjdGVkVHlwZXMgPT0gbnVsbCkgewotCQkJc2VsZWN0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8RUNsYXNzPigpOwotCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb2xsZWN0aW9uPEVDbGFzcz4+IGVudHJ5IDogc2NvcGVUb0VDbGFzc2VzTWFwCi0JCQkJCS5lbnRyeVNldCgpKSB7Ci0JCQkJaWYgKHNlYXJjaFNjb3BlLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgewotCQkJCQlzZWxlY3RlZFR5cGVzLmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkVHlwZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVUZXh0KFN0cmluZyB0eXBlTmFtZSkgewotCQlFQ2xhc3NpZmllciBjbHMgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NpZmllcih0eXBlTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50U2VhcmNoU2NvcGUuZ2V0KGNscyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmKHNlYXJjaFNjb3BlID09IG51bGwgJiYgc2VhcmNoU2NvcGUuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gU3RyVXRpbC5FTVBUWV9TVFJJTkc7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG1heCA9IHNlYXJjaFNjb3BlLnNpemUoKSAtIDE7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc3RyQnVmZmVyLmFwcGVuZChzZWFyY2hTY29wZS5nZXQoaSkpLmFwcGVuZCgnLCcpOwotCQl9Ci0JCXJldHVybiBzdHJCdWZmZXIuYXBwZW5kKHNlYXJjaFNjb3BlLmdldChtYXgpKS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3MTk0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIHNlYXJjaGFibGUgbWV0aG9kIGVsZW1lbnRzLCBvcmdhbml6ZWQgYnkgdHlwZXMsIGluIGEgdHJlZSB2aWV3LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hTY29wZVZpZXdlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9IE1ldGhvZFNlYXJjaFNjb3BlLlJPT1Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTlRFTlQgPSBNZXRob2RTZWFyY2hTY29wZS5NRVRIT0RfQ09OVEVOVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFID0gTWV0aG9kU2VhcmNoU2NvcGUuUk9MRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLID0gTWV0aG9kU2VhcmNoU2NvcGUuVEFTSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1QgPSBNZXRob2RTZWFyY2hTY29wZS5XT1JLX1BST0RVQ1Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0UgPSBNZXRob2RTZWFyY2hTY29wZS5HVUlEQU5DRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0xJU1QgPSBNZXRob2RTZWFyY2hTY29wZS5DSEVDS0xJU1Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OQ0VQVCA9IE1ldGhvZFNlYXJjaFNjb3BlLkNPTkNFUFQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IE1ldGhvZFNlYXJjaFNjb3BlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhBTVBMRSA9IE1ldGhvZFNlYXJjaFNjb3BlLkVYQU1QTEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREVMSU5FID0gTWV0aG9kU2VhcmNoU2NvcGUuR1VJREVMSU5FOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSQUNUSUNFID0gTWV0aG9kU2VhcmNoU2NvcGUuUFJBQ1RJQ0U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUID0gTWV0aG9kU2VhcmNoU2NvcGUuUkVQT1JUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVVNBQkxFX0FTU0VUID0gTWV0aG9kU2VhcmNoU2NvcGUuUkVVU0FCTEVfQVNTRVQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9BRE1BUCA9IE1ldGhvZFNlYXJjaFNjb3BlLlJPQURNQVA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVElOR19NQVRFUklBTCA9IE1ldGhvZFNlYXJjaFNjb3BlLlNVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEUgPSBNZXRob2RTZWFyY2hTY29wZS5URU1QTEFURTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0RFRklOSVRJT04gPSBNZXRob2RTZWFyY2hTY29wZS5URVJNX0RFRklOSVRJT047Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9NRU5UT1IgPSBNZXRob2RTZWFyY2hTY29wZS5UT09MX01FTlRPUjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVBBUEVSID0gTWV0aG9kU2VhcmNoU2NvcGUuV0hJVEVQQVBFUjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFOREFSRF9DQVRFR09SWSA9IE1ldGhvZFNlYXJjaFNjb3BlLlNUQU5EQVJEX0NBVEVHT1JZOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWSA9IE1ldGhvZFNlYXJjaFNjb3BlLkNVU1RPTV9DQVRFR09SWTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTID0gTWV0aG9kU2VhcmNoU2NvcGUuUFJPQ0VTUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk4gPSBNZXRob2RTZWFyY2hTY29wZS5DQVBBQklMSVRZX1BBVFRFUk47Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTUyA9IE1ldGhvZFNlYXJjaFNjb3BlLkRFTElWRVJZX1BST0NFU1M7Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gcm9vdExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQlzdGF0aWMgewotCQlyb290TGlzdC5hZGQoTUVUSE9EX0NPTlRFTlQpOwotCQlyb290TGlzdC5hZGQoUFJPQ0VTUyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IG1ldGhvZENvbnRlbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKFJPTEUpOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoVEFTSyk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChXT1JLX1BST0RVQ1QpOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoR1VJREFOQ0UpOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoU1RBTkRBUkRfQ0FURUdPUlkpOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoQ1VTVE9NX0NBVEVHT1JZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ3VpZGFuY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJZ3VpZGFuY2VMaXN0LmFkZChDSEVDS0xJU1QpOwotCQlndWlkYW5jZUxpc3QuYWRkKENPTkNFUFQpOwotCQlndWlkYW5jZUxpc3QuYWRkKEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQlndWlkYW5jZUxpc3QuYWRkKEVYQU1QTEUpOwotCQlndWlkYW5jZUxpc3QuYWRkKEdVSURFTElORSk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoUFJBQ1RJQ0UpOwotCQlndWlkYW5jZUxpc3QuYWRkKFJFUE9SVCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoUkVVU0FCTEVfQVNTRVQpOwotCQlndWlkYW5jZUxpc3QuYWRkKFJPQURNQVApOwotCQlndWlkYW5jZUxpc3QuYWRkKFNVUFBPUlRJTkdfTUFURVJJQUwpOwotCQlndWlkYW5jZUxpc3QuYWRkKFRFTVBMQVRFKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChURVJNX0RFRklOSVRJT04pOwotCQlndWlkYW5jZUxpc3QuYWRkKFRPT0xfTUVOVE9SKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChXSElURVBBUEVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gcHJvY2Vzc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQlzdGF0aWMgewotCQlwcm9jZXNzTGlzdC5hZGQoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQkJcHJvY2Vzc0xpc3QuYWRkKERFTElWRVJZX1BST0NFU1MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBoYXNDaGlsZHJlbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQlzdGF0aWMgewotCQloYXNDaGlsZHJlbkxpc3QuYWRkKFJPT1QpOwotCQloYXNDaGlsZHJlbkxpc3QuYWRkKE1FVEhPRF9DT05URU5UKTsKLQkJaGFzQ2hpbGRyZW5MaXN0LmFkZChHVUlEQU5DRSk7Ci0JCWhhc0NoaWxkcmVuTGlzdC5hZGQoUFJPQ0VTUyk7Ci0JfQotCi0JcHJvdGVjdGVkIENoZWNrYm94VHJlZVZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWaWV3ZXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBFTVBUWV9MSVNUID0gbmV3IE9iamVjdFswXTsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCA9PSBST09UKSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKFJPT1QpOwotCQkJfQotCQkJcmV0dXJuIGdldENoaWxkcmVuKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCA9PSBST09UKSB7Ci0JCQkJcmV0dXJuIHJvb3RMaXN0LnRvQXJyYXkoKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50ID09IE1FVEhPRF9DT05URU5UKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZENvbnRlbnRMaXN0LnRvQXJyYXkoKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50ID09IEdVSURBTkNFKSB7Ci0JCQkJcmV0dXJuIGd1aWRhbmNlTGlzdC50b0FycmF5KCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBQUk9DRVNTKSB7Ci0JCQkJcmV0dXJuIHByb2Nlc3NMaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlpZiAocm9vdExpc3QuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIFJPT1Q7Ci0JCQl9Ci0JCQlpZiAobWV0aG9kQ29udGVudExpc3QuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIE1FVEhPRF9DT05URU5UOwotCQkJfSBlbHNlIGlmIChndWlkYW5jZUxpc3QuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIEdVSURBTkNFOwotCQkJfSBlbHNlIGlmIChwcm9jZXNzTGlzdC5jb250YWlucyhjaGlsZCkpIHsKLQkJCQlyZXR1cm4gUFJPQ0VTUzsKLQkJCX0KLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIGhhc0NoaWxkcmVuTGlzdC5jb250YWlucyhwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWaWV3ZXJMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmoudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUGFyZW50R3JheWVkKE9iamVjdCBzZWxlY3RlZEVsZW1lbnQpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IGNwLmdldFBhcmVudChzZWxlY3RlZEVsZW1lbnQpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50ICE9IFJPT1QpIHsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gY3AuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCWJvb2xlYW4gZ3JheWVkID0gZmFsc2U7Ci0JCQlib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLQkJCWZvciAoT2JqZWN0IGNoaWxkIDogY2hpbGRyZW4pIHsKLQkJCQlpZighY2hlY2tlZCkgewotCQkJCQljaGVja2VkID0gdmlld2VyLmdldENoZWNrZWQoY2hpbGQpOwotCQkJCQlpZihjaGVja2VkICYmIGdyYXllZCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCF2aWV3ZXIuZ2V0Q2hlY2tlZChjaGlsZCkgfHwgdmlld2VyLmdldEdyYXllZChjaGlsZCkpIHsKLQkJCQkJaWYoY2hlY2tlZCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJZ3JheWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2hlY2tQYXJlbnQoT2JqZWN0IHNlbGVjdGVkRWxlbWVudCkgewotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gY3AuZ2V0UGFyZW50KHNlbGVjdGVkRWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gUk9PVCkgewotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBjcC5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJYm9vbGVhbiBncmF5ZWQgPSBmYWxzZTsKLQkJCWZvciAoT2JqZWN0IGNoaWxkIDogY2hpbGRyZW4pIHsKLQkJCQlpZiAoIXZpZXdlci5nZXRDaGVja2VkKGNoaWxkKSB8fCB2aWV3ZXIuZ2V0R3JheWVkKGNoaWxkKSkgewotCQkJCQlncmF5ZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZ3JheWVkKSB7Ci0JCQkJdmlld2VyLnNldEdyYXlDaGVja2VkKHBhcmVudCwgdHJ1ZSk7Ci0JCQkJCi0JCQkJLy8gY2hlY2sgYWxsIG90aGVyIHBhcmVudHMgZ3JheWVkIGFzIHdlbGwKLQkJCQkvLwotCQkJCWZvcihwYXJlbnQgPSBjcC5nZXRQYXJlbnQocGFyZW50KTsgcGFyZW50ICE9IG51bGwgJiYgcGFyZW50ICE9IFJPT1Q7IHBhcmVudCA9IGNwLmdldFBhcmVudChwYXJlbnQpKSB7Ci0JCQkJCXZpZXdlci5zZXRHcmF5Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmlld2VyLnNldENoZWNrZWQocGFyZW50LCB0cnVlKTsKLQkJCQl2aWV3ZXIuc2V0UGFyZW50c0dyYXllZChzZWxlY3RlZEVsZW1lbnQsIGZhbHNlKTsKLQkJCQljaGVja1BhcmVudChwYXJlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIocGFyZW50LCBzdHlsZSk7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFZpZXdlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFZpZXdlckxhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChST09UKTsKLQkJdmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7Ci0JCXZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChNRVRIT0RfQ09OVEVOVCwgdHJ1ZSk7Ci0JCXZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChQUk9DRVNTLCB0cnVlKTsKLQkJdmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChzZWxlY3RlZEVsZW1lbnQsIGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJaWYgKCFldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCQkJaWYoc2hvdWxkUGFyZW50R3JheWVkKHNlbGVjdGVkRWxlbWVudCkpIHsKLQkJCQkJCXZpZXdlci5zZXRQYXJlbnRzR3JheWVkKHNlbGVjdGVkRWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJCQkJT2JqZWN0IHBhcmVudCA9IGNwLmdldFBhcmVudChzZWxlY3RlZEVsZW1lbnQpOwotCQkJCQkJaWYocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJCQl2aWV3ZXIuc2V0R3JheUNoZWNrZWQocGFyZW50LCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdmlld2VyLnNldEdyYXlDaGVja2VkKHNlbGVjdGVkRWxlbWVudCwgZmFsc2UpOwotCQkJCQkvLyBzZXQgZ3JheSB0byBmYWxzZSBmb3IgaXRlbXMgdGhhdCBhcmUgdW5jaGVja2VkCi0JCQkJCS8vCi0JCQkJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiB2aWV3ZXIuZ2V0R3JheWVkRWxlbWVudHMoKSkgewotCQkJCQkJaWYoIXZpZXdlci5nZXRDaGVja2VkKGVsZW1lbnQpKSB7Ci0JCQkJCQkJdmlld2VyLnNldEdyYXllZChlbGVtZW50LCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewkJCi0JCQkJCWNoZWNrUGFyZW50KHNlbGVjdGVkRWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBtZXRob2QgZWxlbWVudCB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50IHR5cGVzCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlIGdldFNlYXJjaFNjb3BlKCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZFNlYXJjaFNjb3BlKHZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzEwMzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBtZXRob2Qgc2VhcmNoIHJlc3VsdCB0YWJsZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9MSVNUID0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQ7Ci0KLQkvKioKLQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kU2VhcmNoUmVzdWx0KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RTZWFyY2hSZXN1bHQpIGlucHV0RWxlbWVudCkuZ2V0RWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgaW5zdGFuY2VvZiBNZXRob2RTZWFyY2hSZXN1bHQpIHsKLQkJCXRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0JCQlzZWFyY2hSZXN1bHQgPSAoTWV0aG9kU2VhcmNoUmVzdWx0KSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cGRhdGVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzZWFyY2hSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkgewotCQkJCWlmICh0YWJsZVZpZXdlci50ZXN0RmluZEl0ZW0odXBkYXRlZEVsZW1lbnRzW2ldKSAhPSBudWxsKSB7Ci0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2godXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0YWJsZVZpZXdlci5hZGQodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRhYmxlVmlld2VyLnJlbW92ZSh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJfQotCQl9Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTUzZjdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnMuQWJzdHJhY3RFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBtZXRob2Qgc2VhcmNoIHJlc3VsdCB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBQaWVycmUgUGFkb3ZhbmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RTZWFyY2hSZXN1bHQpIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gKChNZXRob2RTZWFyY2hSZXN1bHQpIGlucHV0RWxlbWVudCkKLQkJCQkJLmdldEVsZW1lbnRzKCk7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJCX0KLQkJCWdldEVsZW1lbnRNYXAoKS5jbGVhcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWluc2VydChlbGVtZW50c1tpXSwgZmFsc2UpOwotCQkJfQotCi0JCQlpbnNlcnRVSUZvbGRlcnMoaW5wdXRFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZFNlYXJjaFJlc3VsdCkgewotCQkJc2V0VHJlZVZpZXdlcigoVHJlZVZpZXdlcikgdmlld2VyKTsKLQkJCXNlYXJjaFJlc3VsdCA9IChNZXRob2RTZWFyY2hSZXN1bHQpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVwZGF0ZWRFbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cGRhdGVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzZWFyY2hSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkgewotCQkJCWlmIChnZXRUcmVlVmlld2VyKCkudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkgewotCQkJCQlpbnNlcnQodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWdldFRyZWVWaWV3ZXIoKS5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQlnZXRUcmVlVmlld2VyKCkucmVmcmVzaCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByb3ZpZGVycy5BYnN0cmFjdEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0LCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgZWxlbWVudCwgYm9vbGVhbiByZWZyZXNoVmlld2VyKSB7Ci0JCWlmIChoYXNDaGlsZHJlbihlbGVtZW50KSkgewotCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQlnZXRUcmVlVmlld2VyKCkucmVmcmVzaChlbGVtZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChzZWFyY2hSZXN1bHQuZ2V0TWF0Y2hDb3VudChlbGVtZW50KSA9PSAwKSB7Ci0JCQkJZ2V0RWxlbWVudE1hcCgpLnJlbW92ZShlbGVtZW50KTsKLQkJCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVGcm9tU2libGluZ3MoZWxlbWVudCwgcGFyZW50KTsKLQkJCQkJcmVtb3ZlKHBhcmVudCwgcmVmcmVzaFZpZXdlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHNlYXJjaFJlc3VsdCk7Ci0JCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCQlnZXRUcmVlVmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQlnZXRUcmVlVmlld2VyKCkucmVmcmVzaChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnMuQWJzdHJhY3RFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlciNnZXRDb250ZW50U291cmNlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldENvbnRlbnRTb3VyY2UoKSB7Ci0JCXJldHVybiBzZWFyY2hSZXN1bHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjYmMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHNlYXJjaGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNTYxMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHNlYXJjaGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvU2VhcmNoVUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9TZWFyY2hVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWU1NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9TZWFyY2hVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBTZWFyY2ggVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFVJUHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogVGhlIFNlYXJjaCBVSSBwcmVmZXJlbmNlIGtleXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIX1NUUklORyA9ICJzZWFyY2hTdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BBVFRFUk4gPSAibmFtZVBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNFX1NFTlNJVElWRSA9ICJjYXNlU2Vuc2l0aXZlIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNhdmVkIHNlYXJjaCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VhcmNoU3RyaW5nKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlTRUFSQ0hfU1RSSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VycmVudCBzZWFyY2ggc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZWFyY2hTdHJpbmcoU3RyaW5nIHNlYXJjaFN0cmluZykgewotCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJU0VBUkNIX1NUUklORywgc2VhcmNoU3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzYXZlZCBuYW1lIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVQYXR0ZXJuKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlOQU1FX1BBVFRFUk4pOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IG5hbWUgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWVQYXR0ZXJuKFN0cmluZyBuYW1lUGF0dGVybikgewotCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoTkFNRV9QQVRURVJOLAotCQkJCW5hbWVQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzYXZlZCBhc2Ugc2Vuc2l0aXZlIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUNBU0VfU0VOU0lUSVZFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VycmVudCBjYXNlIHNlbnNpdGl2ZSBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlDQVNFX1NFTlNJVElWRSwgY2FzZVNlbnNpdGl2ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDM5ZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHNlYXJjaGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhNTNhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1NzllNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guU2VhcmNoUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBjb20uaWJtLmljdSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmFwYWNoZS5sdWNlbmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoLAotIG9yZy5lY2xpcHNlLmhlbHAuYmFzZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLAotIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXMsCi0gb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkNmY1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjNzAzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2gKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0dlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2ZTdjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0dlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgc2VhcmNoIGluZGV4IGdlbmVyYXRpb24gb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbiBleHRlbmRzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjUzNzQwNTIxMTQ1MTE3NzExMEw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUKLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSwgZXJyb3JNc2cpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSVNlYXJjaFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSVNlYXJjaFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5YTIxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0lTZWFyY2hTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IaXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5OwotCi0vKioKLSAqIFRoZSBTZWFyY2ggU2VydmljZSBBUEkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hTZXJ2aWNlIHsKLQotCS8qKgotCSAqIFNlYXJjaGVzIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBzZWFyY2hRdWVyeQotCSAqICAgICAgICAgICAgYSBjb25maWd1cmF0aW9uIHNlYXJjaCBxdWVyeQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+Q29uZmlndXJhdGlvbkhpdEVudHJ5PC9jb2RlPiBvYmplY3RzCi0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25IaXRFbnRyeVtdIHNlYXJjaENvbmZpZ3VyYXRpb24oU3RyaW5nIHBhdGgsCi0JCQlDb25maWd1cmF0aW9uU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0luZGV4QnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JbmRleEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3OTA1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0luZGV4QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuY2prLkNKS0FuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkZTRGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXMuVGV4dEFuYWx5emVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHMuSmFyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzLkxIVE1MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHMuVU5DVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBtYWluIGNsYXNzIHRoYXQgY3JlYXRlcyB0aGUgSW5kZXggZnJvbSB0aGUgZmlsZQotICogYXNzb2NpYXRpb25zIGluIHRoZSBwcm9jZXNzIGxheW91dC4KLSAqLwotcHVibGljIGNsYXNzIEluZGV4QnVpbGRlciB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRklMRV9OQU1FID0gInZlcnNpb24udHh0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9ERUxJTUlURVIgPSAiKiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERvY3VtZW50IGZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9GSUVMRCA9ICJicmllZkRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRklFTEQgPSAiY29udGVudHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRklFTEQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZJRURfRklFTEQgPSAibW9kaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9GSUVMRCA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRklFTEQgPSAicm9sZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVU1NQVJZX0ZJRUxEID0gInN1bW1hcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9GSUVMRCA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9GSUVMRCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEVfRklFTEQgPSAidGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX0VMRU1FTlRfVFlQRV9GSUVMRCA9ICJ1bWEudHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX0NPTlRFTlQgPSAiZ2VuZXJhbF9jb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gTGlzdCBvZiBVTUEgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaCBpbmRleC4KLQlwcml2YXRlIHN0YXRpYyBMaXN0IE5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUyA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMuYWRkKCJzdW1tYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgid29ya3Byb2R1Y3RkZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgidGFza2Rlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMuYWRkKCJyb2xlZGVzY3JpcHRvciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gQSBsaXN0IG9mIHRvcCBsZXZlbCBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBzZWFyY2gKLQkvLyBpbmRleC4KLQlwdWJsaWMgc3RhdGljIExpc3QgZGlyc1RvU2tpcCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwRGlyZWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBpbmRleEZvbGRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdE5hbWUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmaWxlc1RvU2tpcCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBJbmRleEJ1aWxkZXIoU3RyaW5nIHB1Ymxpc2hEaXIpIHsKLQkJaW50IGFwcGxldEluZGV4ID0gLTE7Ci0JCWlmIChwdWJsaXNoRGlyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJYXBwbGV0SW5kZXggPSBwdWJsaXNoRGlyLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyAiYXBwbGV0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlwRGlyZWN0b3J5ID0gVU5DVXRpbC5jb252ZXJ0RmlsZW5hbWUoKGFwcGxldEluZGV4ID4gLTEpID8gcHVibGlzaERpcgotCQkJCS5zdWJzdHJpbmcoMCwgYXBwbGV0SW5kZXggKyAxKSA6IHB1Ymxpc2hEaXIpOwotCQlTdHJpbmcgc2l0ZU5hbWUgPSBwRGlyZWN0b3J5LnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQlpbnQgaW5kZXggPSBzaXRlTmFtZS5sZW5ndGgoKTsKLQkJaWYgKHNpdGVOYW1lLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW5kZXggPSBpbmRleCAtIDE7Ci0JCX0KLQotCQlpbnQgaW5kZXgyID0gc2l0ZU5hbWUubGFzdEluZGV4T2YoIi8iLCBpbmRleCAtIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvZHVjdE5hbWUgPSBzaXRlTmFtZS5zdWJzdHJpbmcoaW5kZXgyICsgMSwgaW5kZXgpOwotCi0JCS8vIGNyZWF0ZSB0aGUgaW5kZXgKLQkJU3RyaW5nQnVmZmVyIHNlYXJjaEZvbGRlciA9IG5ldyBTdHJpbmdCdWZmZXIocERpcmVjdG9yeSk7Ci0JCWlmICghc2VhcmNoRm9sZGVyLnRvU3RyaW5nKCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlzZWFyY2hGb2xkZXIuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJfQotCQlzZWFyY2hGb2xkZXIuYXBwZW5kKCJzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluZGV4Rm9sZGVyID0gbmV3IFN0cmluZ0J1ZmZlcihzZWFyY2hGb2xkZXIudG9TdHJpbmcoKSk7Ci0JCWluZGV4Rm9sZGVyLmFwcGVuZChGaWxlLnNlcGFyYXRvcikuYXBwZW5kKCJpbmRleCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJhcHBsZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImNzcyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiZXh0X2hlbHAiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiaWNvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImltYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiaW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImxvZ3MiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgIm1hbnVhbHMiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAibm9hcHBsZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInBhZ2VzX25vdF9pbnN0YWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAic2NyaXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAic3R5bGVzaGVldHMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAic2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmaWxlc1RvU2tpcC5hZGQoIl9kZXNjLmh0bSIpOyAgLy8kTk9OLU5MUy0xJAotCQlmaWxlc1RvU2tpcC5hZGQoIl93YnMuaHRtIik7IC8vJE5PTi1OTFMtMSQKLQkJZmlsZXNUb1NraXAuYWRkKCJfdGJzLmh0bSIpOyAvLyROT04tTkxTLTEkCi0JCWZpbGVzVG9Ta2lwLmFkZCgiX3dwYnMuaHRtIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlSW5kZXgoYm9vbGVhbiBqYXJJdCkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKEluZGV4QnVpbGRlci5jbGFzcykgewotCQkJCi0JCQlpZiAoaW5kZXhGb2xkZXIgPT0gbnVsbCB8fCBwRGlyZWN0b3J5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotCQkJCQkJIkludmFsaWQgaW5kZXhGb2xkZXIgb3IgcERpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCQotCQkJYm9vbGVhbiBqYWtvID0gZmFsc2U7Ci0JCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQkJCVN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0JCQlpZiAobGFuZy5lcXVhbHMoTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCkpIHx8Ci0JCQkJbGFuZy5lcXVhbHMoTG9jYWxlLktPUkVBLmdldExhbmd1YWdlKCkpKSB7Ci0JCQkJamFrbyA9IHRydWU7Ci0JCQl9Ci0JCQlBbmFseXplciBhbmFseXplciA9IGpha28gPyBuZXcgQ0pLQW5hbHl6ZXIoKSA6IG5ldyBUZXh0QW5hbHl6ZXIoKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQkvLyBSQU1EaXJlY3RvcnkgcmFtRGlyID0gbmV3IFJBTURpcmVjdG9yeSgpOwotCQkJCUluZGV4V3JpdGVyIGZzV3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKEZTRGlyZWN0b3J5Ci0JCQkJCQkuZ2V0RGlyZWN0b3J5KGluZGV4Rm9sZGVyLnRvU3RyaW5nKCksIHRydWUpLAotCQkJCQkJYW5hbHl6ZXIsIHRydWUpOwotCi0JCQkJLy8gSW5kZXhXcml0ZXIgcmFtV3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKHJhbURpciwKLQkJCQkvLyBuZXcgVGV4dEFuYWx5emVyKCksIHRydWUpOwotCi0JCQkJaWYgKChmc1dyaXRlciAhPSBudWxsKSkgewotCQkJCQkvLyBmc1dyaXRlci5tZXJnZUZhY3RvciA9IDEwMDA7Ci0JCQkJCS8vIGZzV3JpdGVyLm1heE1lcmdlRG9jcyA9IDEwMDAwOwotCQkJCQlmc1dyaXRlci5zZXRNYXhGaWVsZExlbmd0aCgxMDAwMDAwKTsKLQotCQkJCQlpbmRleERvY3MobmV3IEZpbGUocERpcmVjdG9yeSksIGZzV3JpdGVyKTsKLQotCQkJCQkvLyBmc1dyaXRlci5hZGRJbmRleGVzKG5ldyBEaXJlY3RvcnlbXSB7IHJhbURpciB9KTsKLQkJCQkJZnNXcml0ZXIub3B0aW1pemUoKTsKLQkJCQkJLy8gcmFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCWZzV3JpdGVyLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgdGhlIHZlcnNpb24gZmlsZS4KLQkJCURhdGUgdG9kYXkgPSBuZXcgRGF0ZSgpOwotCQkJbG9uZyBtaWxsaXNlY29uZHMgPSB0b2RheS5nZXRUaW1lKCk7Ci0KLQkJCWlmICghamFySXQpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoaW5kZXhGb2xkZXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgVkVSU0lPTl9GSUxFX05BTUUpOwotCQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihmdyk7Ci0JCQkJCWJ3LndyaXRlKHByb2R1Y3ROYW1lICsgVkVSU0lPTl9ERUxJTUlURVIgKyBtaWxsaXNlY29uZHMKLQkJCQkJCQkrICJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChhbmFseXplciBpbnN0YW5jZW9mIENKS0FuYWx5emVyKSB7Ci0JCQkJCQlidy53cml0ZSgiQ0pLQW5hbHl6ZXIiICsgIlxuIik7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWJ3LmNsb3NlKCk7Ci0JCQkJCWZ3LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCXRocm93IG5ldyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKAotCQkJCQkJCVNlYXJjaFJlc291cmNlcy5jcmVhdGVTZWFyY2hJbmRleEVycm9yKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gamFyIHVwIHRoZSBjcmVhdGVkIGluZGV4LgotCQkJSmFyQ3JlYXRvci5qYXJGb2xkZXIoaW5kZXhGb2xkZXIudG9TdHJpbmcoKSk7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXggSmFycmVkIHN1Y2Nlc3NmdWxseSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXRyeSB7Ci0JCQkJLy8gZGVsZXRlIHRoZSBmaWxlcyBub3cgdGhhdCB0aGV5J3ZlIGJlZW4gamFycmVkLgotCQkJCUZpbGUgaW5kZXhEaXIgPSBuZXcgRmlsZShpbmRleEZvbGRlci50b1N0cmluZygpKTsKLQkJCQlGaWxlW10gZmlsZXMgPSBpbmRleERpci5saXN0RmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgdGVtcEZpbGUgPSBmaWxlc1tpXTsKLQkJCQkJaWYgKCF0ZW1wRmlsZS5nZXROYW1lKCkuZXF1YWxzKEphckNyZWF0b3IuSU5ERVhfSkFSKSkgewotCQkJCQkJdGVtcEZpbGUuZGVsZXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBTdHJpbmcgcnVwTmFtZSA9IHB1Ymxpc2hEaXIuc3Vic3RyaW5nKGluZGV4KTsKLQkJCQlGaWxlIG5ld0luZGV4SmFyID0gbmV3IEZpbGUoaW5kZXhGb2xkZXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJKyBKYXJDcmVhdG9yLklOREVYX0pBUik7Ci0JCQkJaWYgKG5ld0luZGV4SmFyLmV4aXN0cygpKSB7Ci0JCQkJCVN0cmluZyBmaWxlU2l6ZSA9ICIiICsgbmV3SW5kZXhKYXIubGVuZ3RoKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKGluZGV4Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkrIFZFUlNJT05fRklMRV9OQU1FKTsKLQkJCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIoZncpOwotCQkJCQlidy53cml0ZShwcm9kdWN0TmFtZSArIFZFUlNJT05fREVMSU1JVEVSICsgbWlsbGlzZWNvbmRzCi0JCQkJCQkJKyBWRVJTSU9OX0RFTElNSVRFUiArIGZpbGVTaXplICsgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGFuYWx5emVyIGluc3RhbmNlb2YgQ0pLQW5hbHl6ZXIpIHsKLQkJCQkJCWJ3LndyaXRlKCJDSktBbmFseXplciIgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJYncuY2xvc2UoKTsKLQkJCQkJZncuY2xvc2UoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgU2VhcmNoU2VydmljZUV4Y2VwdGlvbigKLQkJCQkJCQlTZWFyY2hSZXNvdXJjZXMuY3JlYXRlU2VhcmNoSW5kZXhFcnJvcik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJdGhyb3cgbmV3IFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oCi0JCQkJCQlTZWFyY2hSZXNvdXJjZXMuY3JlYXRlU2VhcmNoSW5kZXhFcnJvcik7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5kZXggdGhlIGFjdHVhbCBkb2N1bWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBmaWxlcyBhbmQgcmVjdXJzaXZlbHkgZ2V0IGFsbAotCSAqIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIgZmlsZQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleERvY3MoRmlsZSBmaWxlLCBJbmRleFdyaXRlciB3cml0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGlyc1RvU2tpcC5jb250YWlucyhmaWxlLmdldEFic29sdXRlUGF0aCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmaWxlc1RvU2tpcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZmlsZVRvU2tpcCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWxlLmdldE5hbWUoKS5pbmRleE9mKGZpbGVUb1NraXApID4gLTEpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGZpbGVzID0gZmlsZS5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5kZXhEb2NzKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSwgd3JpdGVyKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpc0h0bWxEb2MoZmlsZSkpIHsKLQkJCWlmIChzaG91bGRCZUV4Y2x1ZGVkKGZpbGUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkKLQkJCQlEb2N1bWVudCBkb2MgPSBnZXRIVE1MRG9jdW1lbnQoZmlsZSk7CQkKLQkJCQkKLQkJCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQkJd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CQkJCQotCQkJCX0KLQkJCQkKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlLmdldE5hbWUoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbmRleERvY3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNlYXJjaCBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgdG8gYmUgdmVyaWZpZWQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmlsZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKLQkgKiAgICAgICAgIHNlYXJjaCBpbmRleC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkQmVFeGNsdWRlZChGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaWYgKHBEaXJlY3Rvcnkuc3RhcnRzV2l0aChwYXRoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxEb2MoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXRoKCk7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHBhdGguZW5kc1dpdGgoIi5odG0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTm9TZWFyY2hhYmxlRG9jdW1lbnQoUHJvcGVydGllcyBtZXRhVGFncykgewotCQlTdHJpbmcgdmFsdWUgPSBtZXRhVGFncy5nZXRQcm9wZXJ0eShVTUFfRUxFTUVOVF9UWVBFX0ZJRUxEKTsKLQkJCi0JCS8vIHZhbHVlID09IG51bGwgaXMgdHJlYXRlZCBhcyBnZW5lcmFsIGRvY3VtZW50Ci0JCXJldHVybiAodmFsdWUgIT0gbnVsbCkgJiYgTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmNvbnRhaW5zKHZhbHVlKTsKLQl9Ci0JCi0JY2hhcltdIGNidWYgPSBuZXcgY2hhclsxMDI0XTsKLQlpbnQgc2tpcENvdW50ID0gMDsKLQkKLQlwcml2YXRlIERvY3VtZW50IGdldEhUTUxEb2N1bWVudChGaWxlIGZpbGUpIHsKLQkJRG9jdW1lbnQgbHVjZW5lRG9jdW1lbnQgPSBudWxsOwotCQlJbnB1dFN0cmVhbVJlYWRlciBpbnB1dCA9IG51bGw7Ci0JCVJlYWRlciByZWFkZXIgPSBudWxsOwotCQl0cnkgewotCQkJCi0JCQlpbnB1dCA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMSFRNTFBhcnNlciBwYXJzZXIgPSBuZXcgTEhUTUxQYXJzZXIoaW5wdXQpOwotCi0JCQlyZWFkZXIgPSBwYXJzZXIuZ2V0UmVhZGVyKCk7Ci0JCQlpZiAoIHJlYWRlciA9PSBudWxsICkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlQcm9wZXJ0aWVzIG1ldGFUYWdzID0gcGFyc2VyLmdldE1ldGFUYWdzKCk7Ci0JCQlpZiAoIGlzTm9TZWFyY2hhYmxlRG9jdW1lbnQobWV0YVRhZ3MpICkgewotCQkJCQotCQkJCS8vIHRoZSBMSFRNTFBhcnNlciB0aHJlYWQgd2lsbCBub3QgZW5kIGlmIHRoZSByZWFkZXIgaXMgbm90IHByb2Nlc3NlZAotCQkJCS8vIGNhdXNpbmcgbWFqb3IgcmVzb3VyY2UgbGVhawotCQkJCXdoaWxlICggcmVhZGVyLnJlYWQoY2J1ZikgPiAwICkgewotCQkJCQk7Ci0JCQkJfQkJCQotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCArK3NraXBDb3VudCArICIgZmlsZSBza2lwcGVkOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJcGFyc2VyID0gbnVsbDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJbHVjZW5lRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQotCQkJU3RyaW5nIHVybCA9IGZpbGUuZ2V0UGF0aCgpLnJlcGxhY2UoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5VbkluZGV4ZWQoVVJMX0ZJRUxELCB1cmwpKTsKLQkJCQotCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQoQ09OVEVOVF9GSUVMRCwgcmVhZGVyKSk7Ci0JCQkKLQkJCVN0cmluZyB0aXRsZSA9IHBhcnNlci5nZXRUaXRsZSgpOwotCQkJaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gV29ya2Fyb3VuZCBhIExpbnV4IHNwZWNpZmljIGlzc3VlLgotCQkJCXRpdGxlID0gdGl0bGUucmVwbGFjZUFsbCgiXFx4YTAiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuS2V5d29yZChUSVRMRV9GSUVMRCwgdGl0bGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyBzdW1tYXJ5ID0gcGFyc2VyLmdldFN1bW1hcnkoKTsKLQkJCWlmIChzdW1tYXJ5LnN0YXJ0c1dpdGgodGl0bGUpICYmIHN1bW1hcnkubGVuZ3RoKCkgPiB0aXRsZS5sZW5ndGgoKSkgewotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5LZXl3b3JkKFNVTU1BUllfRklFTEQsIHN1bW1hcnkKLQkJCQkJCS5zdWJzdHJpbmcodGl0bGUubGVuZ3RoKCkgKyAxKSkpOwotCQkJfSBlbHNlCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLktleXdvcmQoU1VNTUFSWV9GSUVMRCwgcGFyc2VyCi0JCQkJCQkuZ2V0U3VtbWFyeSgpKSk7Ci0KLQkJCWZvciAoRW51bWVyYXRpb24gbmFtZXMgPSBtZXRhVGFncy5wcm9wZXJ0eU5hbWVzKCk7IG5hbWVzCi0JCQkJCS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQlpZiAodGFnTmFtZS5lcXVhbHMoUk9MRV9GSUVMRCkpIHsKLQkJCQkJCVN0cmluZyByb2xlTmFtZSA9IG1ldGFUYWdzLmdldFByb3BlcnR5KHRhZ05hbWUpOwotCQkJCQkJaWYgKHJvbGVOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dCh0YWdOYW1lLCByb2xlTmFtZSkpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIHRhZ1ZhbHVlID0gbWV0YVRhZ3MuZ2V0UHJvcGVydHkodGFnTmFtZSk7Ci0JCQkJCQlpZiAodGFnVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KHRhZ05hbWUsIHRhZ1ZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsdWNlbmVEb2N1bWVudC5nZXRGaWVsZChST0xFX0ZJRUxEKSA9PSBudWxsKSB7Ci0JCQkJLy8gRGVmYXVsdCB0byAibmEiIHRvIHN1cHBvcnQgc2VhcmNoaW5nIGZvciBmaWxlcyB3aXRob3V0Ci0JCQkJLy8gcm9sZSBtZXRhIHRhZ3MuCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQoUk9MRV9GSUVMRCwgIk5PUlVQUk9MRSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlGaWVsZCB1bWFUeXBlRmllbGQgPSBsdWNlbmVEb2N1bWVudAotCQkJCQkuZ2V0RmllbGQoVU1BX0VMRU1FTlRfVFlQRV9GSUVMRCk7Ci0JCQlpZiAodW1hVHlwZUZpZWxkID09IG51bGwpIHsKLQkJCQkvLyBEZWZhdWx0IHRvIGdlbmVyYWwgY29udGVudC4KLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dChVTUFfRUxFTUVOVF9UWVBFX0ZJRUxELAotCQkJCQkJR0VORVJBTF9DT05URU5UKSk7Ci0JCQl9IAotCi0JCQlwYXJzZXIgPSBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbHVjZW5lRG9jdW1lbnQgPSBudWxsOwotCQkJU2VhcmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsdWNlbmVEb2N1bWVudDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyODgwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3IKLWluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWU9SW5kZXhpbmcgY29uZmlndXJhdGlvbiBmaWxlcy4uLgotCi0jIEVycm9yIERldGFpbHMKLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3I9VGhlIHNlYXJjaCBpbmRleCBmaWxlIHdhcyBub3QgY3JlYXRlZC4KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTJhOTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBzZWFyY2ggY29uZmlndXJhdGlvbiBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NTM3NDA1MjExNDUxMTc3MTEwTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIocm9vdENhdXNlLCBlcnJvck1zZyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWQ5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkFic3RyYWN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBTZWFyY2ggcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VhcmNoUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RBY3RpdmF0b3IgewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlYXJjaFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZWFyY2hQbHVnaW4gZ2V0RGVmYXVsdCgpIHsJCi0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiN2I3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFNlYXJjaCByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VhcmNoUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFNlYXJjaFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVNlYXJjaEluZGV4RXJyb3I7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTZWFyY2hSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgU2VhcmNoUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDZmY2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5XYXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGl0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2U7Ci0KLS8qKgotICogVGhlIFNlYXJjaCBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFNlcnZpY2UgaW1wbGVtZW50cyBJU2VhcmNoU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlYXJjaFNlcnZpY2UgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VhcmNoU2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoU2VhcmNoU2VydmljZS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IFNlYXJjaFNlcnZpY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgU2VhcmNoU2VydmljZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBhIHB1Ymxpc2hlZCBDb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gc2VhcmNoUXVlcnkKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIHNlYXJjaCBxdWVyeQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+Q29uZmlndXJhdGlvbkhpdEVudHJ5PC9jb2RlPiBvYmplY3RzCi0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25IaXRFbnRyeVtdIHNlYXJjaENvbmZpZ3VyYXRpb24oU3RyaW5nIHBhdGgsCi0JCQlDb25maWd1cmF0aW9uU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZSgKLQkJCQlwYXRoKTsKLQkJc2VydmljZS5pbmRleCgpOwotCQlyZXR1cm4gc2VydmljZS5zZWFyY2goc2VhcmNoUXVlcnkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZUluZGV4KFN0cmluZyBwdWJsaXNoRGlyKSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCUluZGV4QnVpbGRlciBzZXJ2aWNlID0gbmV3IEluZGV4QnVpbGRlcihwdWJsaXNoRGlyKTsKLQkJcmV0dXJuIHNlcnZpY2UuY3JlYXRlSW5kZXgodHJ1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlSW5kZXgoU3RyaW5nIHB1Ymxpc2hEaXIsIGJvb2xlYW4gamFySXQpCi0JCQl0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCUluZGV4QnVpbGRlciBzZXJ2aWNlID0gbmV3IEluZGV4QnVpbGRlcihwdWJsaXNoRGlyKTsKLQkJcmV0dXJuIHNlcnZpY2UuY3JlYXRlSW5kZXgoamFySXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVdBUihTdHJpbmcgcHVibGlzaERpciwgU3RyaW5nIHdlYkFwcE5hbWUpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgd2FyRmlsZSA9IG51bGw7Ci0JCQlpZiAod2ViQXBwTmFtZS5lbmRzV2l0aCgiLndhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl3YXJGaWxlID0gbmV3IEZpbGUocHVibGlzaERpciwgd2ViQXBwTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXdhckZpbGUgPSBuZXcgRmlsZShwdWJsaXNoRGlyLCB3ZWJBcHBOYW1lICsgIi53YXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJV2FyVXRpbC5idWlsZFdhckZpbGUod2FyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgcHVibGlzaERpciwgbnVsbCk7Ci0JCQlGaWxlIGxvZ3NEaXIgPSBuZXcgRmlsZShwdWJsaXNoRGlyLCAibG9ncyIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGNzc0RpciA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsICJjc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBzY3JpcHRzRGlyID0gbmV3IEZpbGUocHVibGlzaERpciwgInNjcmlwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBpbWFnZXNEaXIgPSBuZXcgRmlsZShwdWJsaXNoRGlyLCAiaW1hZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3Q8RmlsZT4gZmlsZXNOb3RUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLQkJCWZpbGVzTm90VG9EZWxldGUuYWRkKGxvZ3NEaXIpOwotCQkJZmlsZXNOb3RUb0RlbGV0ZS5hZGQoY3NzRGlyKTsKLQkJCWZpbGVzTm90VG9EZWxldGUuYWRkKHNjcmlwdHNEaXIpOwotCQkJZmlsZXNOb3RUb0RlbGV0ZS5hZGQoaW1hZ2VzRGlyKTsKLQkJCWZpbGVzTm90VG9EZWxldGUuYWRkKHdhckZpbGUpOwotCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMocHVibGlzaERpciwgZmlsZXNOb3RUb0RlbGV0ZSk7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmNsZWFyKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1YTJjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgU2VhcmNoIFNlcnZpY2Ugb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTA2MzMwMjE4MDg2OTE1NzMxNkw7Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUaHJvd2FibGUgcm9vdENhdXNlOwotCi0JLyoqCi0JICogVGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlcnJvck1zZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXRoaXMocm9vdENhdXNlLCByb290Q2F1c2UuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJdGhpcyhudWxsLCBlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUKLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdENhdXNlID0gcm9vdENhdXNlOwotCQl0aGlzLmVycm9yTXNnID0gZXJyb3JNc2c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkgewotCQlyZXR1cm4gcm9vdENhdXNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDMzNTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgU2VhcmNoIFN0b3AgV29yZHMKLVNlYXJjaC5zdG9wV29yZHM9XAotYSwgYWJvdXQsIGFuLCBhbmQsIGFyZSwgYXMsIGF0LCBiZSwgYnV0LCBieSwgZm9yLCBmcm9tLCBob3csIFwKLWksIGlmLCBpbiwgaW50bywgaXMsIGl0LCBubywgbm90LCBvZiwgb24sIG9yLCBzLCBzdWNoLCBcCi10LCB0aGF0LCB0aGUsIHRoZWlyLCB0aGVuLCB0aGVyZSwgdGhlc2UsIHRoZXksIHRoaXMsIHRvLCBcCi13YXMsIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdpbGwsIHdpdGgKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRBbmFseXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0QW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4MDNlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpczsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW07Ci0KLS8qKgotICogQSB0ZXh0IGFuYWx5emVyIHRoYXQgaGFuZGxlcyBVbmljb2RlIDQuMSBjaGFyYWN0ZXJzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRBbmFseXplciBleHRlbmRzIEFuYWx5emVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRleHRBbmFseXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyI3Rva2VuU3RyZWFtKFN0cmluZywgUmVhZGVyKQotCSAqLwotCXB1YmxpYyBmaW5hbCBUb2tlblN0cmVhbSB0b2tlblN0cmVhbShTdHJpbmcgZmllbGROYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCVRva2VuU3RyZWFtIHJlc3VsdCA9IG5ldyBUZXh0VG9rZW5pemVyKHJlYWRlcik7Ci0JCXJldHVybiBuZXcgVGV4dEZpbHRlcihyZXN1bHQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOWRkZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlN0b3BBbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5TdG9wRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBBIHRleHQgZmlsdGVyIHRoYXQgaGFuZGxlcyBVbmljb2RlIDQuMSBjaGFyYWN0ZXJzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRleHRGaWx0ZXIgZXh0ZW5kcyBUb2tlbkZpbHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXQgc3RvcFdvcmRzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRleHRGaWx0ZXIoVG9rZW5TdHJlYW0gaW4pIHsKLQkJc3VwZXIoaW4pOwotCQlpZiAoc3RvcFdvcmRzID09IG51bGwpIHsKLQkJCWxvYWRTdG9wV29yZHMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW0jbmV4dCgpCi0JICovCi0JcHVibGljIGZpbmFsIFRva2VuIG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKFRva2VuIHRva2VuID0gaW5wdXQubmV4dCgpOyB0b2tlbiAhPSBudWxsOyB0b2tlbiA9IGlucHV0Lm5leHQoKSkgewotCQkJU3RyaW5nIHRva2VuVGV4dCA9IHRva2VuLnRlcm1UZXh0KCk7Ci0JCQlpZiAoIXN0b3BXb3Jkcy5jb250YWlucyh0b2tlblRleHQpKSB7Ci0JCQkJcmV0dXJuIHRva2VuOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBzdG9wIHdvcmRzIGRlZmluZWQgaW4gdGhlIFN0b3BXb3Jkcy5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRTdG9wV29yZHMoKSB7Ci0JCVN0cmluZ1tdIHdvcmRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShUZXh0RmlsdGVyLmNsYXNzCi0JCQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIi5TdG9wV29yZHMiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCVN0cmluZyBwcm9wZXJ0eSA9IGJ1bmRsZS5nZXRTdHJpbmcoIlNlYXJjaC5zdG9wV29yZHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJd29yZHMgPSBTdHJVdGlsLnNwbGl0KHByb3BlcnR5LCAiICwiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl3b3JkcyA9IFN0b3BBbmFseXplci5FTkdMSVNIX1NUT1BfV09SRFM7Ci0JCX0KLQkJc3RvcFdvcmRzID0gU3RvcEZpbHRlci5tYWtlU3RvcFNldCh3b3Jkcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0VG9rZW5pemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmMzM1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5pemVyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotCi0vKioKLSAqIEEgdGV4dCB0b2tlbml6ZXIgdGhhdCB1c2VzIElDVTRKIHRvIHNlZ21lbnQgdGV4dCBpbnRvIHdvcmRzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRleHRUb2tlbml6ZXIgZXh0ZW5kcyBUb2tlbml6ZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKLQotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLQlwcml2YXRlIEJyZWFrSXRlcmF0b3IgaXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHNvdXJjZQotCSAqLwotCXB1YmxpYyBUZXh0VG9rZW5pemVyKFJlYWRlciByZWFkZXIpIHsKLQkJc3VwZXIocmVhZGVyKTsKLQkJU3RyaW5nQnVmZmVyIHRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKEJVRkZFUl9TSVpFKTsKLQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW0JVRkZFUl9TSVpFXTsKLQkJaW50IGNoYXJzUmVhZDsKLQkJdHJ5IHsKLQkJCXdoaWxlICgoY2hhcnNSZWFkID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCBCVUZGRVJfU0laRSkpID4gMCkgewotCQkJCXRleHRCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgMCwgY2hhcnNSZWFkKTsKLQkJCX0KLQkJCXRleHQgPSB0ZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQlpdGVyYXRvciA9IEJyZWFrSXRlcmF0b3IuZ2V0V29yZEluc3RhbmNlKCk7Ci0JCQlpdGVyYXRvci5zZXRUZXh0KHRleHQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpdGVyYXRvciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtI25leHQoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBUb2tlbiBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGl0ZXJhdG9yICE9IG51bGwpIHsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IHN0YXJ0ID0gaXRlcmF0b3IuY3VycmVudCgpOwotCQkJCWludCBlbmQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGVuZCAhPSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCQkJU3RyaW5nIHRva2VuVGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCWlmICghdG9rZW5UZXh0LmVxdWFscygiICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICh0b2tlblRleHQuZW5kc1dpdGgoIidzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXRva2VuVGV4dCA9IHRva2VuVGV4dC5zdWJzdHJpbmcoMCwgdG9rZW5UZXh0Ci0JCQkJCQkJCQkubGVuZ3RoKCkgLSAyKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuZXcgVG9rZW4odG9rZW5UZXh0LCAwLCB0b2tlblRleHQubGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjQyZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgdGV4dCBhbmFseXNlciwgdG9rZW5pemVyIGFuZCBmaWx0ZXIgZm9yIGluZGV4aW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IaXRFbnRyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IaXRFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzQ4MTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGl0RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBzZWFyY2ggaGl0IGVudHJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25IaXRFbnRyeSB7Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQuCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgSUQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgaWQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnJlaWYgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYnJpZWYgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmRGVzYygpIHsKLQkJcmV0dXJuIGJyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYnJpZWZEZXNjCi0JICogICAgICAgICAgICB0aGUgYnJpZWYgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjKFN0cmluZyBicmllZkRlc2MpIHsKLQkJdGhpcy5icmllZkRlc2MgPSBicmllZkRlc2M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSTAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICB0aGUgVVJMIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uU2VhcmNoUXVlcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmZjRkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKiBUaGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gc2VhcmNoIHF1ZXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0JSSUVGX0RFU0MgPSAiYnJpZWZEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9GVUxMX0RFU0MgPSAiZnVsbERlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSGFzaHRhYmxlIHF1ZXJ5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5KCkgewotCQlxdWVyeSA9IG5ldyBIYXNodGFibGUoKTsKLQkJcXVlcnkuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWFyY2ggcXVlcnkgc3RyaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlYXJjaCBxdWVyeSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBxdWVyeS5rZXlzKCk7Ci0KLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlzYi5hcHBlbmQoa2V5ICsgIjooIiArIHF1ZXJ5LmdldChrZXkpICsgIikgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlzYi5hcHBlbmQoIkFORCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRlcm0oU3RyaW5nIHRlcm0sIFN0cmluZyBjcml0KSB7Ci0JCXF1ZXJ5LnB1dChjcml0LCB0ZXJtKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXNldFRlcm0odHlwZSwgQ0FURUdPUllfVFlQRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRUZXJtKG5hbWUsIENBVEVHT1JZX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzYyhTdHJpbmcgZGVzYykgewotCQlzZXRUZXJtKGRlc2MsIENBVEVHT1JZX0JSSUVGX0RFU0MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZ1bGxEZXNjKFN0cmluZyBkZXNjKSB7Ci0JCXNldFRlcm0oZGVzYywgQ0FURUdPUllfRlVMTF9ERVNDKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uU2VhcmNoU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQxMWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uU2VhcmNoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRhdGVGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeVBhcnNlci5RdWVyeVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guSGl0czsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guSW5kZXhTZWFyY2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNlYXJjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5TZWFyY2hSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5TZWFyY2hTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXMuVGV4dEFuYWx5emVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGl0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igc2VhcmNoaW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UgewotCi0JLyoqCi0JICogRG9jdW1lbnQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX0RFU0NSSVBUSU9OX0ZJRUxEID0gImJyaWVmRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0ZJRUxEID0gImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GSUVMRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX0ZJRUxEID0gIm1vZGlmaWVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9GSUVMRCA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9GSUVMRCA9ICJyb2xlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNTUFSWV9GSUVMRCA9ICJzdW1tYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9GSUVMRCA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0ZJRUxEID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBIVE1MIHBhcnNlci4KLQlwcml2YXRlIEhUTUxQYXJzZXIgcGFyc2VyOwotCi0JLy8gVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBkb2N1bWVudHMgdG8gYmUgaW5kZXhlZC4KLQlwcml2YXRlIFN0cmluZyBkb2NEaXIgPSBudWxsOwotCi0JLy8gVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW5kZXggZmlsZXMgd2lsbCBiZSBnZW5lcmF0ZWQuCi0JcHJpdmF0ZSBTdHJpbmcgaW5kZXhEaXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jRGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlKFN0cmluZyBkb2NEaXIpIHsKLQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaGFzaENvZGUgPSBNYXRoLmFicyhkb2NEaXIuaGFzaENvZGUoKSk7Ci0JCVN0cmluZyBpbmRleFBhdGggPSB1c2VySG9tZSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyAicnVwIiArIEZpbGUuc2VwYXJhdG9yICsgaGFzaENvZGUgKyBGaWxlLnNlcGFyYXRvciArICJpbmRleCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXREaXJzKGRvY0RpciwgaW5kZXhQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2NEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaW5kZXhEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBpbmRleGVzCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlKFN0cmluZyBkb2NEaXIsIFN0cmluZyBpbmRleERpcikgewotCQlzZXREaXJzKGRvY0RpciwgaW5kZXhEaXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGluZGV4IGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jRGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGluZGV4RGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgaW5kZXhlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcnMoU3RyaW5nIGRvY0RpciwgU3RyaW5nIGluZGV4RGlyKSB7Ci0JCXRoaXMuZG9jRGlyID0gZG9jRGlyOwotCQl0aGlzLmluZGV4RGlyID0gaW5kZXhEaXI7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgYSBzZWFyY2ggYmFzZWQgb24gdGhlIGdpdmVuIHNlYXJjaCBxdWVyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcXVlcnkKLQkgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggcXVlcnkgc3RyaW5nCi0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5Db25maWd1cmF0aW9uSGl0RW50cnk8L2NvZGU+IG9iamVjdHMKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gc2VhcmNoKENvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSBxdWVyeSkKLQkJCXRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNlYXJjaChxdWVyeS5nZXRRdWVyeVN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHNlYXJjaCBvbiB0aGUgZ2l2ZW4gcXVlcnkgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBxc3RyCi0JICogICAgICAgICAgICBhIEx1Y2VuZSBjb21wYXRpYmxlIHF1ZXJ5IHN0cmluZwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+Q29uZmlndXJhdGlvbkhpdEVudHJ5PC9jb2RlPiBvYmplY3RzCi0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25IaXRFbnRyeVtdIHNlYXJjaChTdHJpbmcgcXN0cikKLQkJCXRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJU2VhcmNoZXIgc2VhcmNoZXIgPSBudWxsOwotCQl0cnkgewotCQkJc2VhcmNoZXIgPSBuZXcgSW5kZXhTZWFyY2hlcihpbmRleERpcik7Ci0JCQlRdWVyeSBxdWVyeSA9IFF1ZXJ5UGFyc2VyLnBhcnNlKHFzdHIsIENPTlRFTlRfRklFTEQsCi0JCQkJCW5ldyBUZXh0QW5hbHl6ZXIoKSk7Ci0KLQkJCUhpdHMgbGhpdHMgPSBzZWFyY2hlci5zZWFyY2gocXVlcnkpOwotCQkJQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gaGl0cyA9IG5ldyBDb25maWd1cmF0aW9uSGl0RW50cnlbbGhpdHMKLQkJCQkJLmxlbmd0aCgpXTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoaXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gbGhpdHMuZG9jKGkpOwotCQkJCWhpdHNbaV0gPSBuZXcgQ29uZmlndXJhdGlvbkhpdEVudHJ5KCk7Ci0JCQkJaGl0c1tpXS5zZXROYW1lKGRvYy5nZXQoTkFNRV9GSUVMRCkpOwotCQkJCWhpdHNbaV0uc2V0VXJsKGRvYy5nZXQoVVJMX0ZJRUxEKSk7Ci0JCQkJaGl0c1tpXS5zZXRCcmllZkRlc2MoZG9jLmdldChCUklFRl9ERVNDUklQVElPTl9GSUVMRCkpOwotCQkJCWhpdHNbaV0uc2V0SWQoZG9jLmdldChJRF9GSUVMRCkpOwotCQkJCWhpdHNbaV0uc2V0VHlwZShkb2MuZ2V0KFRZUEVfRklFTEQpKTsKLQkJCX0KLQkJCXJldHVybiBoaXRzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2VhcmNoZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXNlYXJjaGVyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgaW5kZXggZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW5kZXggZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmRleEV4aXN0cygpIHsKLQkJRmlsZVtdIGZpbGVzID0gbmV3IEZpbGUoaW5kZXhEaXIpLmxpc3RGaWxlcygpOwotCQlyZXR1cm4gKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoICE9IDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNlYXJjaCBpbmRleC4KLQkgKiAKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmRleCgpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaW5kZXgobnVsbCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNlYXJjaCBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVpbmRleAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHBlcmZvcm1zIGEgcmVpbmRleAotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGV4KGJvb2xlYW4gcmVpbmRleCkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlpbmRleChudWxsLCByZWluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBpbmRleCBkYXRhYmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcG0KLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBwYXJhbSByZWluZGV4Ci0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcGVyZm9ybXMgYSByZWluZGV4Ci0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5kZXgoSVByb2dyZXNzTW9uaXRvciBwbSwgYm9vbGVhbiByZWluZGV4KQotCQkJdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlLmNsYXNzKSB7Ci0JCQlpZiAoaW5kZXhEaXIgPT0gbnVsbCB8fCBkb2NEaXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgaW5kZXhEaXIgb3IgZG9jRGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKCFyZWluZGV4ICYmIGluZGV4RXhpc3RzKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChwbSAhPSBudWxsKSB7Ci0JCQkJcG0uYmVnaW5UYXNrKFNlYXJjaFJlc291cmNlcy5pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lLAotCQkJCQkJZ2V0VG90YWxEb2NzVG9JbmRleChkb2NEaXIpKTsgCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJZGVsZXRlQWxsSW5kZXhEaXJzKCk7Ci0JCQkJbmV3IEZpbGUoaW5kZXhEaXIpLm1rZGlycygpOwotCQkJCUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihpbmRleERpciwKLQkJCQkJCW5ldyBUZXh0QW5hbHl6ZXIoKSwgdHJ1ZSk7Ci0JCQkJd3JpdGVyLm1heEZpZWxkTGVuZ3RoID0gMTAwMDAwMDsKLQkJCQlwYXJzZXIgPSBuZXcgSFRNTFBhcnNlcigpOwotCQkJCWluZGV4RG9jcyhuZXcgRmlsZShkb2NEaXIpLCB3cml0ZXIsIHBtKTsKLQkJCQl3cml0ZXIub3B0aW1pemUoKTsKLQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24oZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChwbSAhPSBudWxsKSB7Ci0JCQkJCXBtLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGFsbCBleGlzdGluZyBpbmRleCBkYXRhYmFzZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQWxsSW5kZXhEaXJzKCkgewotCQlGaWxlIHBhcmVudCA9IG5ldyBGaWxlKGluZGV4RGlyKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCUZpbGVbXSBmaWxlcyA9IHBhcmVudC5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImluZGV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlGaWxlW10gZmlsZSA9IGZpbGVzW2ldLmxpc3RGaWxlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGUubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWZpbGVbal0uZGVsZXRlKCk7Ci0JCQkJCX0KLQkJCQkJZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGZpbGVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2VhcmNoIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgbmFtZQotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNlYXJjaCBpbmRleCwKLQkgKiAgICAgICAgIGluY2x1ZGluZyBhbGwgc3ViLWRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VG90YWxEb2NzVG9JbmRleChTdHJpbmcgZGlyKSB7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCUZpbGUgZGlyRmlsZSA9IG5ldyBGaWxlKGRpcik7Ci0JCUZpbGUgZmlsZXNbXSA9IGRpckZpbGUubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdG90YWw7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlzWE1JRG9jKGZpbGVzW2ldKSkgewotCQkJCXRvdGFsKys7Ci0JCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl0b3RhbCArPSBnZXRUb3RhbERvY3NUb0luZGV4KGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG90YWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluZGV4ZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHZlcmlmaWVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1hNSURvYyhGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZpbGUuZ2V0UGF0aCgpLmVuZHNXaXRoKCIueG1pIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgaW5kZXhlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYmUgdmVyaWZpZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluZGV4ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHRtbE9yVGV4dERvYyhGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldFBhdGgoKTsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoIi5odG1sIikgfHwgcGF0aC5lbmRzV2l0aCgiLmh0bSIpIHx8IHBhdGguZW5kc1dpdGgoIi50eHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKioKLQkgKiBBIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBpbmRleCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSBkaXJlY3Rvcnkgb3IgZmlsZSB0byBiZSBpbmRleGVkCi0JICogQHBhcmFtIHdyaXRlcgotCSAqICAgICAgICAgICAgdGhlIGluZGV4IHdyaXRlcgotCSAqIEBwYXJhbSBwbQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhEb2NzKEZpbGUgZmlsZSwgSW5kZXhXcml0ZXIgd3JpdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJhcHBsZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbmRleERvY3MobmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pLCB3cml0ZXIsIHBtKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpc0h0bWxPclRleHREb2MoZmlsZSkpIHsKLQkJCWlmIChwbSAhPSBudWxsKSB7Ci0JCQkJcG0uc3ViVGFzayhmaWxlLmdldE5hbWUoKSk7Ci0JCQkJcG0ud29ya2VkKDEpOwotCQkJfQotCQkJaWYgKHNob3VsZEJlRXhjbHVkZWQoZmlsZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEb2N1bWVudCBkb2MgPSBnZXRIVE1MRG9jdW1lbnQoZmlsZSk7Ci0JCQl3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPG9jZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gaW5kZXhpbmcuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gaW5kZXhpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRCZUV4Y2x1ZGVkKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgcCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlyZXR1cm4gZG9jRGlyLnN0YXJ0c1dpdGgocCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZG9jdW1lbnQgb2JqZWN0IG9mIGEgSFRNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgSFRNTCBmaWxlIHRvIGJlIGluZGV4ZWQKLQkgKiBAcmV0dXJuIGEgZG9jdW1lbnQgb2JqZWN0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcGFyc2luZyB0aGUgSFRNTCBmaWxlCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBvcGVyYXRpb24gaXMgaW50ZXJydXB0ZWQgYnkgYSB1c2VyCi0JICovCi0JcHVibGljIERvY3VtZW50IGdldEhUTUxEb2N1bWVudChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0JCWRvYy5hZGQoRmllbGQuVW5JbmRleGVkKFVSTF9GSUVMRCwgZmlsZS5nZXRQYXRoKCkucmVwbGFjZSgKLQkJCQlGaWxlLnBhdGhTZXBhcmF0b3JDaGFyLCAnLycpKSk7Ci0JCWRvYy5hZGQoRmllbGQuS2V5d29yZChNT0RJRklFRF9GSUVMRCwgRGF0ZUZpZWxkLnRpbWVUb1N0cmluZyhmaWxlCi0JCQkJLmxhc3RNb2RpZmllZCgpKSkpOwotCi0JCXRyeSB7Ci0JCQlwYXJzZXIucGFyc2UoZmlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlkb2MuYWRkKEZpZWxkLlRleHQoQ09OVEVOVF9GSUVMRCwgcGFyc2VyLmdldFRleHQoKSkpOwotCQlkb2MuYWRkKEZpZWxkLlVuSW5kZXhlZChTVU1NQVJZX0ZJRUxELCBwYXJzZXIuZ2V0U3VtbWFyeSgpKSk7Ci0KLQkJUHJvcGVydGllcyBtZXRhVGFncyA9IHBhcnNlci5nZXRNZXRhVGFncygpOwotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBtZXRhVGFncy5wcm9wZXJ0eU5hbWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWRvYy5hZGQoRmllbGQuVGV4dCh0YWdOYW1lLCBtZXRhVGFncy5nZXRQcm9wZXJ0eSh0YWdOYW1lKSkpOwotCQl9Ci0KLQkJaWYgKGRvYy5nZXRGaWVsZChST0xFX0ZJRUxEKSA9PSBudWxsKSB7Ci0JCQlkb2MuYWRkKEZpZWxkLlRleHQoUk9MRV9GSUVMRCwgIk5PUlVQUk9MRSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwN2FjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBzZWFyY2hpbmcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3YzRiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3Igc2VhcmNoaW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmY2E5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgc2VhcmNoIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9KYXJDcmVhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0phckNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxNTdkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0phckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgSmFyQ3JlYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9KQVIgPSAiaW5kZXguamFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlqYXJGb2xkZXIoYXJnc1swXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGphckZvbGRlcihTdHJpbmcgZm9sZGVybmFtZSkgewotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJhdHRlbXB0aW5nIHRvIGphciBzdHVmZiIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGphckRpciA9IG5ldyBGaWxlKGZvbGRlcm5hbWUpOwotCQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoZm9sZGVybmFtZSArIEZpbGUuc2VwYXJhdG9yICsgSU5ERVhfSkFSKTsKLQotCQkJamFyRmlsZXMoamFyRGlyLCBqYXJGaWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBpbiB0aGUgamFyIHRoaW5neSIpOyAvLyROT04tTkxTLTEkCi0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG1ldGhvZCB0byBqYXIgdGhlIHNwZWNpZmllZCBkaXIgaW50byBhIGphciBmaWxlLiBub24tc3ViLWZvbGRlcnMgd2lsbCBiZQotCSAqIGphcmVkLgotCSAqIAotCSAqIEBwYXJhbSBqYXJEaXIKLQkgKiBAcGFyYW0gamFyRmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgamFyRmlsZXMoRmlsZSBqYXJEaXIsIEZpbGUgamFyRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gamFyRGlyLmxpc3RGaWxlcygpOwotCQlpZiAoamFyRmlsZS5leGlzdHMoKSkgewotCQkJamFyRmlsZS5kZWxldGUoKTsKLQkJfQotCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBiU3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCWphckZpbGUpKTsKLQkJWmlwT3V0cHV0U3RyZWFtIHppcHBlclN0cmVhbSA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oYlN0cmVhbSk7Ci0KLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgY3VycmVudEZpbGUgPSBmaWxlc1tpXTsKLQkJCWlmIChjdXJyZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlaaXBFbnRyeSBjdXJyRW50cnkgPSBuZXcgWmlwRW50cnkoY3VycmVudEZpbGUuZ2V0TmFtZSgpKTsKLQkJCXppcHBlclN0cmVhbS5wdXROZXh0RW50cnkoY3VyckVudHJ5KTsKLQkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKAotCQkJCQljdXJyZW50RmlsZSkpOwotCQkJd2hpbGUgKGJpU3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewotCQkJCWludCBudW0gPSBiaVN0cmVhbS5yZWFkKGJ5dGVzKTsKLQkJCQl6aXBwZXJTdHJlYW0ud3JpdGUoYnl0ZXMsIDAsIG51bSk7Ci0JCQl9Ci0JCQliaVN0cmVhbS5jbG9zZSgpOwotCQkJemlwcGVyU3RyZWFtLmNsb3NlRW50cnkoKTsKLQkJfQotCQl6aXBwZXJTdHJlYW0uY2xvc2UoKTsKLQkJYlN0cmVhbS5jbG9zZSgpOwotCX0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0xIVE1MUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0xIVE1MUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjliMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9MSFRNTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBBIEhUTUwgcGFyc2VyIHVzZWQgZm9yIGV4dHJhY3RpbmcgdGhlIG1ldGEgdGFncyBhbmQgdGV4dCBmcm9tIGEgSFRNTAotICogZG9jdW1lbnQuCi0gKiAKLSAqIFRPRE86IEltcGxlbWVudCBvdXIgb3duIEhUTUwgcGFyc2VyLgotICovCi1wdWJsaWMgY2xhc3MgTEhUTUxQYXJzZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmx1Y2VuZS5kZW1vLmh0bWwuSFRNTFBhcnNlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMSFRNTFBhcnNlcihGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlzdXBlcihmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMSFRNTFBhcnNlcihJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlzdXBlcihzdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExIVE1MUGFyc2VyKFJlYWRlciBzdHJlYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlzdXBlcihzdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgbWV0YSB0YWdzLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFUYWdzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRNZXRhVGFncygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlYWRlciBmb3IgdGhlIEhUTUwgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRSZWFkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHRpdGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFRpdGxlKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYSBzdW1tYXJ5IG9mIHRoZSBIVEwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvVU5DVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9VTkNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDVjN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9VTkNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgVU5DVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DX0ZJTEVfUFJFRklYID0gImZpbGU6LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVEVfVU5DX0ZJTEVfUFJFRklYID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUU0NBUEVfVU5DX0ZJTEVfUFJFRklYID0gImZpbGU6Ly8vIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19GSUxFX09OTFkgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DX1NFUEFSQVRPUiA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBBY2NvdW50cyBmb3IgbmV0c2NhcGUgdW5jIGZpbGUgcHJlZml4LiBDb252ZXJ0cyB0byBzdGFuZGFyZCBvbmUuCi0JICogSWYgbm90IE5ldHNjYXBlLCBub3RoaW5nIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGFuZGxlTmV0c2NhcGVGaWxlUHJlZml4KFN0cmluZyBmaWxlbmFtZSkKLQl7Ci0JCVN0cmluZyBjb252ZXJ0ZWROYW1lID0gbnVsbDsKLQotCQlpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aChORVRTQ0FQRV9VTkNfRklMRV9QUkVGSVgpKQotCQl7Ci0JCQljb252ZXJ0ZWROYW1lID0KLQkJCQlBTFRFUk5BVEVfVU5DX0ZJTEVfUFJFRklYCi0JCQkJCSsgZmlsZW5hbWUuc3Vic3RyaW5nKAotCQkJCQkJTkVUU0NBUEVfVU5DX0ZJTEVfUFJFRklYLmxlbmd0aCgpLAotCQkJCQkJZmlsZW5hbWUubGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY29udmVydGVkTmFtZSA9IGZpbGVuYW1lOwotCQl9Ci0KLQkJcmV0dXJuIChjb252ZXJ0ZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIFVSTCBwYXRocyBmb3IgTW96aWxsYSAoYW5kIG90aGVyIGJyb3dzZXJzKSBvdmVyIFVOQy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBoYW5kbGVVUkxGb3JVTkMoVVJMIG9yaWdpbmFsVXJsKQotCXsKLQkJLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSBvdmVyIFVOQwotCQlVUkwgbmV3VXJsID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCWlmIChvcmlnaW5hbFVybC50b1N0cmluZygpLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCS8vIGNoYW5nZSAiZmlsZTovLyIgdG8gImZpbGU6Ly8vLy8iCi0JCQkJU3RyaW5nIGV4dHJhY3RlZFN0cmluZyA9IG9yaWdpbmFsVXJsLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDUpOwotCQkJCW5ld1VybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi8vLyIgKyBleHRyYWN0ZWRTdHJpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCW5ld1VybCA9IG9yaWdpbmFsVXJsOwotCQkJfQotCQl9Ci0JCWNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKQotCQl7Ci0JCQluZXdVcmwgPSBvcmlnaW5hbFVybDsKLQkJfQotCi0JCXJldHVybiAobmV3VXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgVU5DIGZpbGUgdG8gYSByZWd1bGFyLCBwbGF0Zm9ybS1kZXBlbmRlbnQgb25lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0JewotCQlTdHJpbmcgY29udmVydGVkTmFtZSA9IG51bGw7Ci0KLQkJLy8gcmVtb3ZlIGFueSBVUkwgcHJlZml4ZXMKLQkJU3RyaW5nIHRlbXBOYW1lID0gbnVsbDsKLQkJaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoVU5DX0ZJTEVfUFJFRklYKSkKLQkJewotCQkJdGVtcE5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoVU5DX0ZJTEVfUFJFRklYLmxlbmd0aCgpLCBmaWxlbmFtZS5sZW5ndGgoKSk7Ci0JCQlpbnQgaW5kZXggPSB0ZW1wTmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCXsKLQkJCQkvLyBvbiBVbml4LCBhZGQgc2VwYXJhdG9yIGJhY2sgdG8gZmlyc3QgY2hhcmFjdGVyCi0JCQkJdGVtcE5hbWUgPSBVTkNfU0VQQVJBVE9SICsgdGVtcE5hbWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl0ZW1wTmFtZSA9IGZpbGVuYW1lOwotCQl9Ci0KLQkJLy8gY29udmVydCBhbnkgVU5DIHNlcGFyYXRvcnMgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IG9uZQotCQljb252ZXJ0ZWROYW1lID0KLQkJCXRlbXBOYW1lLnJlcGxhY2UoVU5DX1NFUEFSQVRPUi5jaGFyQXQoMCksIEZpbGUuc2VwYXJhdG9yLmNoYXJBdCgwKSk7Ci0KLQkJcmV0dXJuIChjb252ZXJ0ZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgZmlsZW5hbWUgdG8gYSBVTkMgZmlsZW5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEZpbGVuYW1lVG9VTkMoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJLy8gY29udmVydCBhbnkgVU5DIHNlcGFyYXRvcnMgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IG9uZQotCQlTdHJpbmcgY29udmVydGVkTmFtZSA9Ci0JCQlmaWxlbmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yLmNoYXJBdCgwKSwgVU5DX1NFUEFSQVRPUi5jaGFyQXQoMCkpOwotCQlTdHJpbmcgZmluYWxOYW1lID0gY29udmVydEZpbGVTZXBhcmF0b3IoY29udmVydGVkTmFtZSk7Ci0JCXJldHVybiAoZmluYWxOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgVVJMIHRvIG9uZSB3aGljaCBjYW4gdGhhdCBtYXRjaGVzIGEgVU5DIGNvbnZlbnRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVU5DKFN0cmluZyB1cmwpCi0JewotCQlTdHJpbmcgY29udmVydGVkVXJsID0gbnVsbDsKLQkJaWYgKHVybC5zdGFydHNXaXRoKEFMVEVSTkFURV9VTkNfRklMRV9QUkVGSVgpKQotCQl7Ci0JCQljb252ZXJ0ZWRVcmwgPQotCQkJCVVOQ19GSUxFX1BSRUZJWAotCQkJCQkrIHVybC5zdWJzdHJpbmcoQUxURVJOQVRFX1VOQ19GSUxFX1BSRUZJWC5sZW5ndGgoKSwgdXJsLmxlbmd0aCgpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNvbnZlcnRlZFVybCA9IHVybDsKLQkJfQotCQlyZXR1cm4gKGNvbnZlcnRlZFVybCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSAiJTIwIiB0aGF0IGlzIHVzZWQgYnkgc29tZSBicm93c2VycyBmb3Igc3BhY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEZpbGVTcGFjaW5nKFN0cmluZyBmaWxlbmFtZSkKLQl7Ci0JCS8vIG5vdyByZW1vdmUgYW55ICIlMjAiCi0JCWludCBzdGFydCA9IDA7Ci0JCVN0cmluZyBuZXdGaWxlbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdGFydCA8IGZpbGVuYW1lLmxlbmd0aCgpKQotCQl7Ci0JCQlpbnQgaW5kZXggPSBmaWxlbmFtZS5pbmRleE9mKCIlMjAiLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCXsKLQkJCQlpbmRleCA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQkJfQotCQkJbmV3RmlsZW5hbWUgKz0gZmlsZW5hbWUuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0JCQluZXdGaWxlbmFtZSArPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXJ0ID0gaW5kZXggKyAzOwotCQl9Ci0KLQkJbmV3RmlsZW5hbWUgPSBuZXdGaWxlbmFtZS50cmltKCk7Ci0KLQkJcmV0dXJuIChuZXdGaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgIiU1QyIgdGhhdCBpcyB1c2VkIGJ5IHNvbWUgYnJvd3NlcnMgZm9yIGZpbGUgc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlU2VwYXJhdG9yKFN0cmluZyBmaWxlbmFtZSkKLQl7Ci0JCS8vIHJlbW92ZSBhbnkgIiU1QyIKLQkJaW50IHN0YXJ0ID0gMDsKLQkJU3RyaW5nIG5ld0ZpbGVuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0YXJ0IDwgZmlsZW5hbWUubGVuZ3RoKCkpCi0JCXsKLQkJCWludCBpbmRleCA9IGZpbGVuYW1lLmluZGV4T2YoIiU1QyIsIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJewotCQkJCS8vaW5kZXggPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQkJCQluZXdGaWxlbmFtZSA9IGZpbGVuYW1lLnRyaW0oKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW5ld0ZpbGVuYW1lICs9IGZpbGVuYW1lLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCQkJbmV3RmlsZW5hbWUgKz0gVU5DX1NFUEFSQVRPUjsKLQkJCXN0YXJ0ID0gaW5kZXggKyAzOwotCQl9Ci0KLQkJbmV3RmlsZW5hbWUgPSBuZXdGaWxlbmFtZS50cmltKCk7Ci0KLQkJLy8gYWxzbyBpZiBmaWxlIHNlcGFyYXRvciBlcXVhbHMgdW5jIHNlcGFyYXRvciwgcmVtb3ZlIGFueSBXaW5kb3dzCi0JCS8vIHNwZWNpZmljICJcIgotCQlTdHJpbmcgd2luZG93c0ZpbGVTZXBhcmF0b3IgPSAiXFwiOyAvLyROT04tTkxTLTEkCi0JCWlmICghRmlsZS5zZXBhcmF0b3IuZXF1YWxzKHdpbmRvd3NGaWxlU2VwYXJhdG9yKQotCQkJJiYgRmlsZS5zZXBhcmF0b3IuZXF1YWxzKFVOQ19TRVBBUkFUT1IpKQotCQl7Ci0JCQkvLyBvbiBVbml4Ci0JCQluZXdGaWxlbmFtZSA9Ci0JCQkJbmV3RmlsZW5hbWUucmVwbGFjZSgKLQkJCQkJd2luZG93c0ZpbGVTZXBhcmF0b3IuY2hhckF0KDApLAotCQkJCQlVTkNfU0VQQVJBVE9SLmNoYXJBdCgwKSk7Ci0JCX0KLQkJcmV0dXJuIChuZXdGaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBmaWxlIG5hbWVzIGZyb20gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLQkgKiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHN1ZmZpeC4gIEFuIGV4YW1wbGUgb2YgYSAKLQkgKiBzdWZmaXggaXMgIi5kYXQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldEZpbGVMaXN0KFN0cmluZyBkaXJlY3RvcnksIFN0cmluZyBzdWZmaXgpCi0JewotCQlpZiAoZGlyZWN0b3J5LnN0YXJ0c1dpdGgoImh0dHAiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQkvLyByZW1vdGUgZGlyZWN0b3J5LCB1c2UgdGhpcyBpbnN0ZWFkCi0JCQlyZXR1cm4gKGdldEZpbGVMaXN0RnJvbVJlbW90ZShkaXJlY3RvcnksIHN1ZmZpeCkpOwotCQl9Ci0KLQkJU3RyaW5nIHRlbXBEaXIgPSBVTkNVdGlsLmNvbnZlcnRGaWxlbmFtZShkaXJlY3RvcnkpOwotCQlGaWxlIGRvY3VtZW50RGlyZWN0b3J5ID0gbmV3IEZpbGUoVU5DVXRpbC5jb252ZXJ0RmlsZVNwYWNpbmcodGVtcERpcikpOwotCQlTdHJpbmdbXSBmaWxlTmFtZUxpc3QgPSBkb2N1bWVudERpcmVjdG9yeS5saXN0KCk7Ci0KLQkJLy8gbm93IHBhcnNlIGFuZCBvbmx5IHRha2UgdGhvc2UgdGhhdCBlbmQgd2l0aCB0aGUgcHJvcGVyIHN1ZmZpeAotCQlWZWN0b3IgZmluYWxMaXN0ID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVOYW1lTGlzdC5sZW5ndGg7IGkrKykKLQkJewotCQkJaWYgKGZpbGVOYW1lTGlzdFtpXS5lbmRzV2l0aChzdWZmaXgpKQotCQkJewotCQkJCWZpbmFsTGlzdC5hZGRFbGVtZW50KGZpbGVOYW1lTGlzdFtpXSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGZpbmFsTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBhcHBsaWNhYmxlIGRlZmF1bHQgcnVwIGZpbGVzIGZyb20gcmVtb3RlIGRpcmVjdG9yeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgZ2V0RmlsZUxpc3RGcm9tUmVtb3RlKFN0cmluZyBkaXJlY3RvcnksIFN0cmluZyBzdWZmaXgpCi0JewotCQlWZWN0b3IgZmlsZW5hbWVzID0gbmV3IFZlY3RvcigpOwotCQl0cnkKLQkJewotCQkJLy8gZ2V0IHRoZSBsaXN0aW5nIHVzaW5nIGEgVVJMCi0JCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChkaXJlY3RvcnkpOwotCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSByZW1vdGVVcmwub3BlblN0cmVhbSgpOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBjOwotCQkJd2hpbGUgKChjID0gaW5TdHJlYW0ucmVhZCgpKSAhPSAtMSkKLQkJCXsKLQkJCQlyZXN1bHQuYXBwZW5kKChjaGFyKSBjKTsKLQkJCX0KLQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJCS8vIGNvbnZlcnQgc3RyaW5nIHRvIHVwcGVyIGNhc2UgdG8gaGFuZGxlIG11bHRpcGxlIHNlcnZlciB0eXBlcyBzdWNoIGFzIEFwYWNoZQotCQkJU3RyaW5nIGRpcmVjdG9yeVJlc3VsdCA9IHJlc3VsdC50b1N0cmluZygpOwotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoImhyZWYiLCAiSFJFRiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8L2EiLCAiPC9BIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjx0dD4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjwvdHQ+IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8VFQ+IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8L1RUPiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIHBhcnNlIHRoZSBjb250ZW50Ci0JCQkvL1N0cmluZ1Rva2VuaXplciBsaW5lVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplciggcmVzdWx0LnRvU3RyaW5nKCkgKTsKLQkJCVN0cmluZ1Rva2VuaXplciBsaW5lVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkaXJlY3RvcnlSZXN1bHQpOwotCQkJVmVjdG9yIGxpbmVzID0gbmV3IFZlY3RvcigpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJd2hpbGUgKHRydWUpCi0JCQkJewotCQkJCQlsaW5lVG9rZW5pemVyLm5leHRUb2tlbigiUkVGIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbGluZVRva2VuaXplci5uZXh0VG9rZW4oIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGxpbmUgPSBsaW5lVG9rZW5pemVyLm5leHRUb2tlbigiXCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCS8vIHN0cmlwIG91dCAiPC9BIjsgbmVlZGVkIHRoaXMgYmVjYXVzZSBTdHJpbmdUb2tlbml6ZXIKLQkJCQkJLy8gaGFzIHByb2JsZW1zIHBhcnNpbmcgZmlsZW5hbWVzIHRoYXQgYmVpbmcgd2l0aCAiQSIKLQkJCQkJaW50IGluZGV4ID0gbGluZS5pbmRleE9mKCI8L0EiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggIT0gMCkKLQkJCQkJewotCQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQkJbGluZXMuYWRkRWxlbWVudChmaWxlbmFtZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlsaW5lcy5hZGRFbGVtZW50KGxpbmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbmUpCi0JCQl7Ci0JCQkJLy8gZG8gbm90aGluZywgZW5kIG9mIGNvbnRlbnQKLQkJCX0KLQotCQkJLy8gcGFyc2UgZWFjaCBsaW5lCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLnNpemUoKTsgaSsrKQotCQkJewotCQkJCVN0cmluZyBsaW5lID0gKFN0cmluZykgbGluZXMuZWxlbWVudEF0KGkpOwotCi0JCQkJaWYgKGxpbmUuZW5kc1dpdGgoc3VmZml4KSkKLQkJCQl7Ci0JCQkJCS8vIHdlIHdhbnQgdGhpcwotCQkJCQlmaWxlbmFtZXMuYWRkRWxlbWVudChsaW5lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAoZmlsZW5hbWVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1YjQxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuc2VydmljZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPmNvbS5pYm0uc3NlLm1vZGVsLnN0cnVjdHVyZWRidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBkODhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBTZXJ2aWNlcyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTk1NDExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjhiYzVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJzZXJ2aWNlUHJvdmlkZXJzIgotICAgICAgICAgbmFtZT0iRVBGIFNlcnZpY2VzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvc2VydmljZVByb3ZpZGVycy5leHNkIi8+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NjaGVtYS9zZXJ2aWNlUHJvdmlkZXJzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc2NoZW1hL3NlcnZpY2VQcm92aWRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4YjY5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc2NoZW1hL3NlcnZpY2VQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcyIgaWQ9InNlcnZpY2VQcm92aWRlcnMiIG5hbWU9IkVQRiBTZXJ2aWNlIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgZm9yIGNvbnRyaWJ1dGluZyBzZXJ2aWNlcyBsaWtlIGFjY2VzcyBjb250cm9sbGVyLCBmaWxlIG1hbmFnZXIsIGxpYnJhcnkgcGVyc2lzdGVyLi4uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFjY2Vzc0NvbnRyb2xsZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlQZXJzaXN0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsZU1hbmFnZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFjY2Vzc0NvbnRyb2xsZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImNsYXNzIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklBY2Nlc3NDb250cm9sbGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibGlicmFyeVBlcnNpc3RlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0idHlwZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZpbGVNYW5hZ2VyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JQWNjZXNzQ29udHJvbGxlcgotb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcgotb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9BY3RpdmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM5MjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUFjY2Vzc0NvbnRyb2xsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lBY2Nlc3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTU4MTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUFjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIENvbnRyb2xzIGFjY2VzcyB0byBsaWJyYXJ5IG9iamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDksIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWNjZXNzQ29udHJvbGxlciB7Ci0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBjYWxsZXIgY2FuIG1vZGlmeSB0aGUgZ2l2ZW4gRU9iamVjdHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVPYmplY3RzIGNvbGxlY3Rpb24gb2YgdGhlIEVPYmplY3RzIHRvIGNoZWNrCi0JICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIGNhbGxlciAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0YXR1cyBjaGVja01vZGlmeShDb2xsZWN0aW9uPEVPYmplY3Q+IGVPYmplY3RzLCBPYmplY3QgY29udGV4dCk7Ci0JCi0JSVN0YXR1cyBjaGVja01vZGlmeShSZXNvdXJjZVtdIHJlc291cmNlcywgT2JqZWN0IGNvbnRleHQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzYzNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgZmlsZS1iYXNlZCBNZXRob2QgTGlicmFyeSBQZXJzaXN0ZXIuCi0gKiA8cD4KLSAqIEEgTWV0aG9kIExpYnJhcnkgUGVyc2lzdGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZXJzaXN0aW5nIHRoZSBtZXRob2QgbGlicmFyeQotICogY29udGVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBleHRlbmRzIElMaWJyYXJ5UGVyc2lzdGVyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudCdzIGZvbGRlciByZWxhdGl2ZSB0byBpdHMgcGx1Zy1pbiBvcgotCSAqIGxpYnJhcnkgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIHJlbGF0aXZlIHBhdGggbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKE1ldGhvZEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGEgbWV0aG9kIGVsZW1lbnQncyBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIGUgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbGRlckFic29sdXRlUGF0aChNZXRob2RFbGVtZW50IGUpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIGZpbGUgZXh0ZW5zaW9uIG9mIGEgbWV0aG9kIGVsZW1lbnQncyByZXNvdXJjZSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIGZpbGUgZXh0ZW5zaW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oT2JqZWN0IGUpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCBzdG9yZXMgaXRzIGNvbnRlbnQgaW4gYSBmb2xkZXIgbmFtZWQKLQkgKiBhZnRlciBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBlbGVtZW50IHN0b3JlcyBpdHMgY29udGVudCBpbiBhCi0JICogICAgICAgICBmb2xkZXIgbmFtZWQgYWZ0ZXIgaXQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25Gb2xkZXIoT2JqZWN0IGUpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgZm9sZGVyIGZvciB0aGUgbWV0aG9kIHBsdWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgZ2l2ZW4gbWV0aG9kIGxpYnJhcnkuCi0JICogIAotCSAqIEBwYXJhbSBwbHVnaW5OYW1lIHRoZSBuYW1lIG9mIG1ldGhvZCBwbHVnaW4KLQkgKiBAcGFyYW0gbGlicmFyeSB0aGUgbGlicmFyeSB3aGVyZSB0aGUgbWV0aG9kIHBsdWdpbiBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkCi0JICogQHJldHVybiB0aGUgbWV0aG9kIHBsdWdpbiBmb2xkZXIKLQkgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFeGNlcHRpb24gaWYgZm9sZGVyIGNyZWF0aW9uIGZhaWxlZAotCSAqLwotCXB1YmxpYyBGaWxlIGNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihTdHJpbmcgcGx1Z2luTmFtZSwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGZvbGRlciB0byBzdG9yZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5IHRoZSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZm9sZGVyIHRvIHN0b3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIG9yIG51bGwKLQkgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFeGNlcHRpb24gaWYgZmFpbGVkCi0JICovCi0JcHVibGljIEZpbGUgZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQkKLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnksIGJvb2xlYW4gY3JlYXRlKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IGZvbGRlciB0byBzdG9yZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5IHRoZSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBmaWxlIHRoZSBkZWZhdWx0IGZvbGRlciB0byBzdG9yZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSwgRmlsZSBmaWxlKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGFic29sdXRlIHBhdGggb2YgdGhlIGVsZW1lbnQncyByZXNvdXJjZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlRm9sZGVyUGF0aChNZXRob2RFbGVtZW50IGUpOwotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMjU3M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUZpbGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIEZpbGUgTWFuYWdlci4KLSAqIDxwPgotICogQSBGaWxlIE1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBYTUkgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogbWV0aG9kIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgcGF0aCBjYW4gYmUgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHVzZWQgdG8gcGFyZW50IGFueSBkaWFsb2dzIHdpdGggdGhlIHVzZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICogICAgICAgICAgICB0byBhdm9pZCBhbnkgZGlyZWN0IHJlZmVyZW5jZXMgb24gdGhlIFNXVCBjb21wb25lbnQpCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmcgcGF0aCwgT2JqZWN0IGNvbnRleHQpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IHBhdGggY2FuIGJlIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRocwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgcGF0aCBmcmFnbWVudHMgdGhhdCBwb2ludCB0byBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDwvY29kZT4gdGhhdCBpcyB0byBiZQotCSAqICAgICAgICAgICAgdXNlZCB0byBwYXJlbnQgYW55IGRpYWxvZ3Mgd2l0aCB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIFVJIGNvbnRleHQgKGRlY2xhcmVkIGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRvIGF2b2lkIGFueSBkaXJlY3QgcmVmZXJlbmNlcyBvbiB0aGUgU1dUIGNvbXBvbmVudCkKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZ1tdIHBhdGhzLCBPYmplY3QgY29udGV4dCk7Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWxldGlvbiBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlKFN0cmluZyBwYXRoKTsKLQotCS8qKgotCSAqIFJlbmFtZXMgdGhlIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkRmlsZQotCSAqICAgICAgICAgICAgYSA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3QgdGhhdCBjb250YWlucyBhIG1ldGhvZCBlbGVtZW50J3MKLQkgKiAgICAgICAgICAgIG9sZCBwYXRoCi0JICogQHBhcmFtIG5ld0ZpbGUKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBtZXRob2QgZWxlbWVudCdzCi0JICogICAgICAgICAgICBuZXcgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlbmFtaW5nIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW5hbWUoRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpOwotCi0JLyoqCi0JICogTW92ZXMgYSBtZXRob2QgZWxlbWVudCB0byBhIG5ldyBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkUGF0aAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCdzIG9sZCBwYXRoCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQncyBuZXcgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vdmUgaXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lMaWJyYXJ5UGVyc2lzdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JTGlicmFyeVBlcnNpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmYyZTNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBNZXRob2QgTGlicmFyeSBQZXJzaXN0ZXIuCi0gKiA8cD4KLSAqIEEgTWV0aG9kIExpYnJhcnkgUGVyc2lzdGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZXJzaXN0aW5nIHRoZSBtZXRob2QgbGlicmFyeQotICogY29udGVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgOSwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UGVyc2lzdGVyIHsKLQkvKioKLQkgKiBTYXZlcyBhbiBleGlzdGluZyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IGluIGl0cyBvd24gcmVzb3VyY2UuIFRoZSBzcGVjaWZpZWQgTWV0aG9kRWxlbWVudCBtdXN0IGJlIHBhcnQgb2YgYSBsaWJyYXJ5Ci0JICogYW5kIGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBpdHMgb3duIHJlc291cmNlLCB0byB3aGljaCBubyBvdGhlciByZXNvdXJjZSByZWZlcnMuIEluIG90aGVyIHdvcmRzLCBjYWxsaW5nIAotCSAqIHtAbGluayAjaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0KX0gb24gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgbXVzdCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSk7Ci0JCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbXMpOwotCi0JLyoqCi0JICogQWRqdXN0cyB0aGUgbG9jYXRpb24gb2YgYSByZXNvdXJjZSBhbmQgc2F2ZXMgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBoYXZlCi0JICogYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgYSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIEdldHMgYSBsaXN0IG9mIHdhcm5pbmdzIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdhcm5pbmdzKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBlbGVtZW50IGNhbiBoYXZlIGl0cyBvd24gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBvd25lZCBieSBhIHJlc291cmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2UoT2JqZWN0IGUpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCBjYW4gaGF2ZSBpdHMgb3duIHJlc291cmNlLCB3aGljaCBubyBvdGhlciByZXNvdXJjZSByZWZlcnMgdG8uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpOwotCQotCS8qKgotCSAqIENoZWNrcyBpZiA8Y29kZT5jb250YWluZXJSZXNvdXJjZTwvY29kZT4gY29udGFpbnMgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBjb250YWluZXJSZXNvdXJjZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBpcyBjb250YWluZWQgYnkgPGNvZGU+Y29udGFpbmVyUmVzb3VyY2U8L2NvZGU+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZWRCeShSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgY29udGFpbmVyUmVzb3VyY2UpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmFpbCBzYWZlIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWJyYXJ5Ci0JICogcGVyc2lzdGVyLgotCSAqIAotCSAqIEByZXR1cm4gYSBmYWlsIHNhZmUgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyCi0JICovCi0JcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGV4dGVuZHMKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHsKLQkJLyoqCi0JCSAqIERpcmVjdCBwZXJzaXN0ZXIgdG8gb3ZlcndyaXRlIGR1cmluZyBzYXZlIHdpdGhvdXQgY2hlY2tpbmcgb24gY2hhbmdlIGNvbmZsaWN0cy4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTlNfT1ZFUldSSVRBQkxFX1JFU09VUkNFUyA9ICJPVkVSV1JJVEFCTEVfUkVTT1VSQ0VTIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIElELgotCQkgKiAKLQkJICogQHJldHVybiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBJRAotCQkgKi8KLQkJU3RyaW5nIGdldEN1cnJlbnRUeElEKCk7Ci0KLQkJLyoqCi0JCSAqIEFkanVzdHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgc2F2ZSBhbGwgdGhlIHJlc291cmNlcwotCQkgKiB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50LiBUaGlzIGNhbGwKLQkJICogbmVlZHMgYSBuZXcgdHJhbnNhY3Rpb24gYW5kIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIGNvbW1pdHRlZCBpbiB0aGlzCi0JCSAqIG1ldGhvZC4KLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkJICogICAgICAgICAgICB0aGUgcmVzb3VyY2VzIHdob3NlIGxvY2F0aW9ucyBuZWVkIHRvIGJlIGFkanVzdGVkCi0JCSAqLwotCQl2b2lkIGFkanVzdExvY2F0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VzKTsKLQotCQkvKioKLQkJICogQ29tbWl0cyB0aGUgdHJhbnNhY3Rpb24uCi0JCSAqLwotCQl2b2lkIGNvbW1pdCgpOwotCi0JCS8qKgotCQkgKiBSb2xsIGJhY2tzIHRoZSB0cmFuc2FjdGlvbi4KLQkJICovCi0JCXZvaWQgcm9sbGJhY2soKTsKLQkJCi0JCS8qKgotCQkgKiBHZXRzIHNhdmUgb3B0aW9ucy4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCU1hcCBnZXRTYXZlT3B0aW9ucygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvU2VydmljZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL1NlcnZpY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODQ0M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvU2VydmljZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gYWNjZXNzIHRoZSBleHRlbnNpb25zIGNvbnRyaWJ1dGVkIHRvIGV4dGVuc3Rpb24gcG9pbnQKLSAqICJvcmcuZWNsaXBzZS5lcGYudW1hLnNlcnZpY2VzIi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlcnZpY2VzIHsKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQZXJzaXN0ZXJEZXNjcmlwdG9yIHsKLQkJU3RyaW5nIHBsdWdpbklkOwotCQlTdHJpbmcgdHlwZTsKLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJYm9vbGVhbiBpc0RlZmF1bHQ7Ci0JCWludCB2ZXJzaW9uOwotCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXI7Ci0JfQotCQotCS8qKgotCSAqIFBlcnNpc3RlbmNlIHR5cGUgZm9yIFhNSS1maWxlLWJhc2VkIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUlfUEVSU0lTVEVOQ0VfVFlQRSA9ICJ4bWkiOyAvLyROT04tTkxTLTEkCi0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2UgPSBBY3RpdmF0b3IuUExVR0lOX0lEOyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lID0gInNlcnZpY2VQcm92aWRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBJQWNjZXNzQ29udHJvbGxlciBhY2Nlc3NDb250cm9sbGVyOwotCXByaXZhdGUgc3RhdGljIElGaWxlTWFuYWdlciBmaWxlTWFuYWdlcjsKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFBlcnNpc3RlckRlc2NyaXB0b3I+IHBlcnNpc3RlckRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxQZXJzaXN0ZXJEZXNjcmlwdG9yPigpOwkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQZXJzaXN0ZXJEZXNjcmlwdG9yPiB0eXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0UGVyc2lzdGVuY2VUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLQkJCWludCB2ZXJzaW9uID0gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJaWYoc2VydmljZU5hbWUuZXF1YWxzKGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQkJaW50IG90aGVyVmVyc2lvbiA9IHBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYob3RoZXJWZXJzaW9uID4gdmVyc2lvbikgewotCQkJCQkJCWNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJCQl2ZXJzaW9uID0gb3RoZXJWZXJzaW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IHBhcnNlVmVyc2lvbihTdHJpbmcgc3RyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHIpOwotCQl9Ci0JCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFBlcnNpc3RlckRlc2NyaXB0b3I+IGdldFR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwKCkgewotCQlNYXA8U3RyaW5nLCBQZXJzaXN0ZXJEZXNjcmlwdG9yPiB0eXBlVG9QZXJzaXN0ZXJEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQZXJzaXN0ZXJEZXNjcmlwdG9yPigpOwotCQlTdHJpbmcgc2VydmljZU5hbWUgPSAibGlicmFyeVBlcnNpc3RlciI7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJaWYoc2VydmljZU5hbWUuZXF1YWxzKGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlQZXJzaXN0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgUGVyc2lzdGVyRGVzY3JpcHRvcigpOwotCQkJCQkJCWRlc2NyaXB0b3IucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJCQkJCQlkZXNjcmlwdG9yLnR5cGUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJCWRlc2NyaXB0b3IuY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlkZXNjcmlwdG9yLmlzRGVmYXVsdCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJkZWZhdWx0IikpOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJCWRlc2NyaXB0b3IudmVyc2lvbiA9IHBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCQlwZXJzaXN0ZXJEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJCQkJaWYoZGVzY3JpcHRvci50eXBlICE9IG51bGwpIHsKLQkJCQkJCQkJUGVyc2lzdGVyRGVzY3JpcHRvciBkZXNjID0gdHlwZVRvUGVyc2lzdGVyRGVzY3JpcHRvck1hcC5nZXQoZGVzY3JpcHRvci50eXBlKTsKLQkJCQkJCQkJaWYoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZihkZXNjLnZlcnNpb24gPCBkZXNjcmlwdG9yLnZlcnNpb24pIHsKLQkJCQkJCQkJCQl0eXBlVG9QZXJzaXN0ZXJEZXNjcmlwdG9yTWFwLnB1dChkZXNjcmlwdG9yLnR5cGUsIGRlc2NyaXB0b3IpOwotCQkJCQkJCQkJCWlmKGRlc2NyaXB0b3IuaXNEZWZhdWx0KSB7Ci0JCQkJCQkJCQkJCWRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPSBkZXNjcmlwdG9yLnR5cGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgaWYoZGVzYy5pc0RlZmF1bHQpIHsKLQkJCQkJCQkJCQkJZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9IG51bGw7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJdHlwZVRvUGVyc2lzdGVyRGVzY3JpcHRvck1hcC5wdXQoZGVzY3JpcHRvci50eXBlLCBkZXNjcmlwdG9yKTsKLQkJCQkJCQkJCWlmKGRlc2NyaXB0b3IuaXNEZWZhdWx0KSB7Ci0JCQkJCQkJCQkJZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9IGRlc2NyaXB0b3IudHlwZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZVRvUGVyc2lzdGVyRGVzY3JpcHRvck1hcDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQWNjZXNzQ29udHJvbGxlciBnZXRBY2Nlc3NDb250cm9sbGVyKCkgewotCQlpZihhY2Nlc3NDb250cm9sbGVyID09IG51bGwpIHsKLQkJCWFjY2Vzc0NvbnRyb2xsZXIgPSAoSUFjY2Vzc0NvbnRyb2xsZXIpIGdldFNlcnZpY2UoImFjY2Vzc0NvbnRyb2xsZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBhY2Nlc3NDb250cm9sbGVyOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IHBlcnNpc3RlciBvZiB0aGUgZ2l2ZW4gdHlwZQotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0TGlicmFyeVBlcnNpc3RlcihTdHJpbmcgdHlwZSkgewotCQlpZih0eXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcCA9PSBudWxsKSB7Ci0JCQl0eXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcCA9IGdldFR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwKCk7Ci0JCX0KLQkJUGVyc2lzdGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gdHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXAuZ2V0KHR5cGUpOwotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWlmKGRlc2NyaXB0b3IucGVyc2lzdGVyID09IG51bGwpIHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGRlc2NyaXB0b3IucGx1Z2luSWQpOwotCQkJCXRyeSB7Ci0JCQkJCWRlc2NyaXB0b3IucGVyc2lzdGVyID0gKElMaWJyYXJ5UGVyc2lzdGVyKSBidW5kbGUubG9hZENsYXNzKGRlc2NyaXB0b3IuY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRlc2NyaXB0b3IucGVyc2lzdGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElMaWJyYXJ5UGVyc2lzdGVyIGdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeVBlcnNpc3RlcihnZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKSB7Ci0JCWlmKGRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPT0gbnVsbCkgewotCQkJZ2V0VHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXAoKTsKLQkJCWlmKGRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPT0gbnVsbCAmJiBnZXRMaWJyYXJ5UGVyc2lzdGVyKFhNSV9QRVJTSVNURU5DRV9UWVBFKSAhPSBudWxsKSB7Ci0JCQkJLy8gbm8gcGVyc2lzdGVyIGlzIHNldCBhcyBkZWZhdWx0LCBjaG9vc2UgWE1JIGFzIGRlZmF1bHQgcGVyc2lzdGVuY2UgdHlwZQotCQkJCS8vCi0JCQkJZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9IFhNSV9QRVJTSVNURU5DRV9UWVBFOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0UGVyc2lzdGVuY2VUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZpbGVNYW5hZ2VyIGdldEZpbGVNYW5hZ2VyKCkgewotCQlpZihmaWxlTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmaWxlTWFuYWdlciA9IChJRmlsZU1hbmFnZXIpIGdldFNlcnZpY2UoImZpbGVNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmlsZU1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTExZTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51aS5pbnRybzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY2ODc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgRGVjIDAxIDE2OjAyOjQxIFBTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGQzYjhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudWkuaW50cm87IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmludHJvCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWI4NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBjc3MvLFwKLSAgICAgICAgICAgICAgIGhlbHAvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBpbnRyb0NvbnRlbnQueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvY29uZi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjkyNWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNWI1YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKgotICogZmlyc3RzdGVwcy5jc3MgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhlIGdyb3VwIHNwZWNpZmljIGNzcyBzZXR0aW5ncwotICovCi0gCi0vKgotICogYmFja2dyb3VuZCB3YXRlcm1hcmsgLSBncm91cCBzcGVjaWZpYwotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvZmlyc3RlcHNfd3RyLmpwZyk7Ci19Ci0KLS8qCi0gKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgLSBUaGlzIGlzIGdyb3VwIHNwZWNpZmljCi0gKi8KLQotI25hdmlnYXRpb24tbGlua3MgYSNzdGVwcyBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjc3RlcHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4c2VsLmdpZik7IH0KLQotLyogCi0gKiBTZXQgdXAgdGhlIE92ZXJ2aWV3IGxpbmtzIHRvIGJlIGRpc3BsYXllZCBpbiB0d28gY29sdW1ucwotICogdGhhdCBhcmUgY2VudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGFnZS4KLSAqLwotCi0jc3RlcHMtbGlua3Mgewl0ZXh0LWFsaWduIDogbGVmdDsJd2lkdGggOiA3NjBweDsJLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCW1hcmdpbiA6IDBweCBhdXRvO30KLSNzdGVwcy1saW5rcyBhIHsgCXdpZHRoIDogMzcwcHg7CXRleHQtYWxpZ24gOiBsZWZ0OyAJbWFyZ2luLWxlZnQgOiA1cHg7CW1hcmdpbi1yaWdodCA6IDVweDsJbWFyZ2luLXRvcCA6IDVweDsJbWFyZ2luLWJvdHRvbSA6IC0yMHB4Owl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDt9Ci0jc3RlcHMtbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0KLSNzdGVwcy1saW5rcyBhIGltZyB7CWhlaWdodCA6IDU3cHg7CXdpZHRoIDogNTdweDsJdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7fQkKLSNzdGVwcy1saW5rcyBhIC5saW5rLWxhYmVsIHsJZGlzcGxheSA6IGJsb2NrOwl3aWR0aCA6IDMwMHB4Owlwb3NpdGlvbiA6IHJlbGF0aXZlOwl0b3AgOiAtNTBweDsJbGVmdCA6IDYwcHg7fQotI3N0ZXBzLWxpbmtzIGEgcCAudGV4dCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTQ1cHg7CWxlZnQgOiA1M3B4O30KLQotLyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLwotI3N0ZXBzLWxpbmtzID4gYSB7IAl3aWR0aCA6IDcwMHB4OyB9Ci0jc3RlcHMtbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfQotI3N0ZXBzLWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jc3RlcHMtbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQotCi1hI2Jhc2ljcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYpOyB9Ci1hI2Jhc2ljczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYpOyB9Ci0KLWEjdGVhbSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZik7IH0KLWEjdGVhbTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBob3Zfb2JqLmdpZik7IH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTdmZjMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGVwcy5sYXlvdXQubmNvbHVtbnMgPSAyCi1zdGVwcy5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAKLQotc3RlcHMucGFnZS1jb250ZW50LnN0ZXBzLWxpbmtzLmxheW91dC5uY29sdW1ucyA9IDIKLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAzNQotCi1zdGVwcy5zdWJ0aXRsZS1pZCA9IHN0ZXBzL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi1zdGVwcy5kZXNjcmlwdGlvbi1pZCA9IHN0ZXBzL3BhZ2UtY29udGVudC9wYWdlLWRlc2NyaXB0aW9uCi0KLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5lcGYtc3RlcHMtdHdvLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCi1zdGVwcy5wYWdlLWNvbnRlbnQuc3RlcHMtbGlua3MuZXBmLXN0ZXBzLWZvdXIubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYKLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5lcGYtc3RlcHMtb25lLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCi1zdGVwcy5wYWdlLWNvbnRlbnQuc3RlcHMtbGlua3MuZXBmLXN0ZXBzLXRocmVlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCi0jbmV3cy5uZXctYW5kLW5vdGV3b3J0aHkubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmCi0jbmV3cy5taWdyYXRpb24ubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZgotI25ld3MudXBkYXRlcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmCi0jbmV3cy5lY2xpcHNlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvMXgxdHJhbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS8xeDF0cmFucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWY0MzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS8xeDF0cmFucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxY2FkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kY3VydmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kY3VydmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY1N2Q0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmRjdXJ2ZTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMThiMGNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JyYW5kbWFyay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JyYW5kbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ5ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9icmFuZG1hcmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9jb250ZW50X2JhY2tncm91bmQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9jb250ZW50X2JhY2tncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDNjNmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvY29udGVudF9iYWNrZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvZmlyc3RlcHNfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvZmlyc3RlcHNfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkM2QyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2ZpcnN0ZXBzX3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2hhbmRsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2hhbmRsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTg4OTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9oYW5kbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9uZXdfYmFja2dyb3VuZGN1cnZlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2JhY2tncm91bmRjdXJ2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDQwYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9uZXdfYmFja2dyb3VuZGN1cnZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2NvbnRlbnRfYmFja2dyb3VuZC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL25ld19jb250ZW50X2JhY2tncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNlNTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2NvbnRlbnRfYmFja2dyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL292ZXJ2aWV3X3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL292ZXJ2aWV3X3d0ci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2U0OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9vdmVydmlld193dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9wYWdlX3dvcmRtYXJrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcGFnZV93b3JkbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGU1NDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9wYWdlX3dvcmRtYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmF0aW9uYWxhZHZhbnRhZ2UuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9yYXRpb25hbGFkdmFudGFnZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzI1ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9yYXRpb25hbGFkdmFudGFnZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3JldHVzZXJfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmV0dXNlcl93dHIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmE0MmRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmV0dXNlcl93dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zYW1wbGVzX3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NhbXBsZXNfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlNzAzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NhbXBsZXNfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDc1MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWUxNDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkMjRlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OGQ0YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3R1dG9yaWFsc193dHIuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS90dXRvcmlhbHNfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0YzdjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3R1dG9yaWFsc193dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93ZWJyc3JjX3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dlYnJzcmNfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMmYyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dlYnJzcmNfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2hhdHNuZXdfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2hhdHNuZXdfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhNDJkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3doYXRzbmV3X3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dvcmRtYXJrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd29yZG1hcmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhlNTQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd29yZG1hcmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9iYWNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODFjYjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2RiNjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlNThiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDUyOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZm9yd2FyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTRhNGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2hvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9ob21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2MGY4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2hvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZTVjMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU5Y2U4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzOWRmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9wc3BicndzZS5qYmYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3BzcGJyd3NlLmpiZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxNWE4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3BzcGJyd3NlLmpiZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0MzgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTJlN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNiMzFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlZDFkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTkxMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDk2YmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOGQ2MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjFhZDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxYzJkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDJjNmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Yzk0YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzg2ZWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjZmMyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmYjliZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTg0M2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJmNmZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL2JhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkMDkyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9mb3J3YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTU4YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9mb3J3YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvb3ZlcnZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9vdmVydmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzdiMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9vdmVydmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTdiMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9yZXN0b3JlX3dlbGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9zYW1wbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvc2FtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjNjYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9zYW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvdHV0b3JpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvdHV0b3JpYWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4MjZhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3R1dG9yaWFscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3doYXRzbmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvd2hhdHNuZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU2Yzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvd2hhdHNuZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9iYWNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDA5MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWExYWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyYjRlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOWE4MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZm9yd2FyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmU1OGIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2hvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9ob21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwMWQxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2hvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlNjI5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJlNzY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkMjFlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDliNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmVzdG9yZV93ZWxjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmVzdG9yZV93ZWxjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczNmJjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWUzNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDg1MTU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4YWJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5NTg4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWI1OTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3NWQ5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmYzNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMThkN2RkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZTZjMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzUzZTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5ZGI4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJjNDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmMxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmMxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODUwMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjcyYTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzY2M5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTk3ZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyMjMyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTAwZDdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5ZmEwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDA5M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvYWQtdC1wb3J0YWxhcHBsaWNhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGM5NGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvYWQtdC1wb3J0YWxhcHBsaWNhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb25ob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9hZC10LXBvcnRhbGFwcGxpY2F0aW9uaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwMmQyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb25ob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTMyYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eWhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2IyYTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E1NmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaGhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyODQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNkYTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2Rob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkNjkxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2Rob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNjk5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3Nob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGM5Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODUxZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3Zob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3Zob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDA4MWI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92aG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTVjN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXJob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzE5NzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtc3RlcHMtb25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmU4MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtc3RlcHMtb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZWhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1zdGVwcy1vbmVob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM0ZjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZWhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMGE4ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2Vob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2Vob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4YjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZmVhdHVyZXNfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZmVhdHVyZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0ZmQ0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZmRmMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mZWF0dXJlc2hvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RjMzI5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OWRlYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNTZjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjg0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTU2YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI4NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxYjg1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHBob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscGhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmEyOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscGhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNTQzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZGRjYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E1NmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWJob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyODQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkyZjhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3aG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3aG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwNmJkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlld2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmE1NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE1YWVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjAzY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTAzMGJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjdkNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFsc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU3MWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFsc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3ZWI5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODZkZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3YThlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ld2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ld2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDczMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXdob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y3NjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwOTdhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWYwNDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFsc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYTFlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDBkNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWU5ZjU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBsZXRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5YTk1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBsZXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGxldGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTNkYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWRldl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjUyNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWRldl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhZGV2aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiNDdkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMmZlODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZWhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTM0ZTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZWhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NmI4MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTNlNjNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzBiMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGMwNTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmYjQ2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscGhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscGhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjRmNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHBob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX21vdmllLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjk5OWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX21vdmllLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZWhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfbW92aWVob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU1N2VjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZWhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxYmIxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3aG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlld2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMjc4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3aG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTk4N2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWJob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTE5N2RiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYmFmYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ld2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXdob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjBlNTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ld2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BsdWdpbl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyZDJjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BsdWdpbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5ob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGx1Z2luaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZThjY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5ob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcmNwYXBwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzBhYjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcmNwYXBwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9yY3BhcHBob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkODBhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlNTZmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDgxZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkMTA0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4N2Q2YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2NyaXB0X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDhiN2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2NyaXB0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zY3JpcHRob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3MjAzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zd3RhcHBfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTlhMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zd3RhcHBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3N3dGFwcGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZiYjVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTlhOTAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRkMTIxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aV9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzlhYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aWhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjEwMWE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aWhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjJmZmM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxYjFhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3ZDI4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDU3ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjY3NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY2hvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTEwNzhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY2hvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiZDdkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGY4MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA4YjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhMGFjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4MjU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMGJlOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc2hvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OWZjZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9lY2xpcHNlLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9lY2xpcHNlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5ZmNmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmRfZWNsaXBzZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmRfb2xkLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9vbGQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBhY2VjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9vbGQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YyNWY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrX2VjbGlwc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmtfZWNsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZjI1ZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmtfZWNsaXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2RvdHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9kb3RzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliOTNlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2RvdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9zdGFuZGJ5X3dvcmRtYXJrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2Uvc3RhbmRieV93b3JkbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2IxNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9zdGFuZGJ5X3dvcmRtYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvc3d0L2Zvcm1fYmFubmVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvc3d0L2Zvcm1fYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzBiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3N3dC9mb3JtX2Jhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWYwNDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tY192c19wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWNfdnNfcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Y2YxYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tY192c19wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWV0aG9kYXV0aG9yaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21ldGhvZGF1dGhvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDA2MGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWV0aG9kYXV0aG9yaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGhlYWQ+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29udGVudCBkZXNjcmliZXMgcm9sZXMsIHRoZSB0YXNrcyB0aGF0IHRoZXkgcGVyZm9ybSwgdGhlIHdvcmsgcHJvZHVjdHMKLSAgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQgYnkgdGhvc2UgdGFza3MsIGFuZCBzdXBwb3J0aW5nIGd1aWRhbmNlLjwvcD4KLTxwPjxpbWcgc3JjPSJtYy5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgZGVwaWN0cyB0eXBpY2FsIHNvdXJjZXMgZm9yIG1ldGhvZCBjb250ZW50LCBhcyB3ZWxsIGFzIGhvdwotICB0aGUgbWV0aG9kIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQgaW4gUk1DLiBNYW55IGRldmVsb3BtZW50IG1ldGhvZHMgYXJlIGRlc2NyaWJlZAotICBpbiBwdWJsaWNhdGlvbnMgc3VjaCBhcyBib29rcywgYXJ0aWNsZXMsIHRyYWluaW5nIG1hdGVyaWFsLCBzdGFuZGFyZHMgYW5kIHJlZ3VsYXRpb25zLAotICBhbmQgb3RoZXIgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbi4gVGhlc2Ugc291cmNlcyB1c3VhbGx5IGRvY3VtZW50IG1ldGhvZHMgYnkKLSAgcHJvdmlkaW5nIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIGEgcGFydGljdWxhciB3YXkgb2YgYWNoaWV2aW5nIGEgc3BlY2lmaWMKLSAgZGV2ZWxvcG1lbnQgZ29hbCB1bmRlciBnZW5lcmFsIGNpcmN1bXN0YW5jZXMuIFNvbWUgZXhhbXBsZXMgYXJlOiB0cmFuc2Zvcm1pbmcKLSAgYSByZXF1aXJlbWVudHMgZG9jdW1lbnQgaW50byBhbiBhbmFseXNpcyBtb2RlbDsgZGVmaW5pbmcgYW4gYXJjaGl0ZWN0dXJhbCBtZWNoYW5pc20KLSAgYmFzZWQgb24gZnVuY3Rpb25hbCBhbmQgbm9uLWZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzOyBjcmVhdGluZyBhIHByb2plY3QgcGxhbgotICBmb3IgYSBkZXZlbG9wbWVudCBpdGVyYXRpb247IGRlZmluaW5nIGEgcXVhbGl0eSBhc3N1cmFuY2UgcGxhbiBmb3IgZnVuY3Rpb25hbAotICByZXF1aXJlbWVudHM7IHJlZGVzaWduaW5nIGEgYnVzaW5lc3Mgb3JnYW5pemF0aW9uIGJhc2VkIG9uIGEgbmV3IHN0cmF0ZWdpYyBkaXJlY3Rpb24sCi0gIGFuZCBzbyBvbi48L3A+Ci08cD5STUMgdGFrZXMgY29udGVudCBzdWNoIGFzIHRoYXQgZGVzY3JpYmVkIGFib3ZlLCBhbmQgc3RydWN0dXJlcyBpdCBpbiBhIHNwZWNpZmljCi0gIHNjaGVtYSBvZiByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZS4gVGhpcyBzY2hlbWEgc3VwcG9ydHMgdGhlCi0gIG9yZ2FuaXphdGlvbiBvZiBsYXJnZSBhbW91bnRzIG9mIGRlc2NyaXB0aW9ucyBmb3IgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLgotICBTdWNoIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgZG8gbm90IGhhdmUgdG8gYmUgbGltaXRlZCB0byBzb2Z0d2FyZSBlbmdpbmVlcmluZywKLSAgYnV0IGNhbiBhbHNvIGNvdmVyIG90aGVyIGRlc2lnbiBhbmQgZW5naW5lZXJpbmcgZGlzY2lwbGluZXMgc3VjaCBhcyBtZWNoYW5pY2FsCi0gIGVuZ2luZWVyaW5nLCBidXNpbmVzcyB0cmFuc2Zvcm1hdGlvbiwgc2FsZXMgY3ljbGVzLCBhbmQgc28gb24uPC9wPgotPHA+IFRoZSBSTUMgc2NyZWVuIGNhcHR1cmUgaW4gdGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgc3VjaCBtZXRob2QgY29udGVudCBlbGVtZW50cwotICBhcmUgb3JnYW5pemVkIGluIHRyZWUgYnJvd3NlcnMgb24gdGhlIGxlZnQuIFRoZXNlIHRyZWUgYnJvd3NlcnMsIHNpbWlsYXIgdG8KLSAgYSBsaWJyYXJ5LCBwcm92aWRlIGRpZmZlcmVudCBpbmRleGVzIG9mIHRoZSBhdmFpbGFibGUgZWxlbWVudHMgZm9yIHJhcGlkIGFjY2Vzcy4KLSAgVGhlIHNjcmVlbiBjYXB0dXJlIHNob3dzIG9uIHRoZSByaWdodCBhbiBleGFtcGxlIG9mIGEgdGFzayBwcmVzZW50YXRpb24uIFRoaXMKLSAgdGFzayBwcmVzZW50YXRpb24gZGVmaW5lcyB0aGUgdGFzayBpbiB0ZXJtcyBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkCi0gIHRvIGFjaGlldmUgdGhlIHRhc2sncyBwdXJwb3NlLiBZb3UgY2FuIHNlZSB0aGF0IHRoZSB0YXNrIGhhcyB2YXJpb3VzIHJlbGF0aW9uc2hpcHMsCi0gIHN1Y2ggYXMgcmVsYXRpb25zaGlwcyB0byBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgd29yayBwcm9kdWN0cyB0aGF0IHNlcnZlCi0gIGFzIGlucHV0cyBhbmQgb3V0cHV0cyB0byB0aGUgdGFzay4gRmluZCBvdXQgbW9yZSBkZXRhaWxzIG9uIHRhc2tzLCByb2xlLCBhbmQKLSAgd29yayBwcm9kdWN0cyBpbiB0aGUgb25saW5lIGhlbHAgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPmhlcmU8L2E+LgotICBJbiBhZGRpdGlvbiB0byByb2xlcywgdGFza3MsIGFuZCB3b3JrIHByb2R1Y3RzLCBSTUMgc3VwcG9ydHMgdGhlIGFkZGl0aW9uIG9mCi0gIGd1aWRhbmNlIGVsZW1lbnRzLiBHdWlkYW5jZSBhcmUgc3VwcGxlbWVudGFyeSBmcmVlLWZvcm0gZG9jdW1lbnRhdGlvbiBzdWNoIGFzCi0gIHdoaXRlcGFwZXJzLCBjb25jZXB0IGRlc2NyaXB0aW9ucywgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBleGFtcGxlcywgYW5kIHNvIG9uLjwvcD4KLTxwPlJNQyBwcm92aWRlcyB2YXJpb3VzIGZvcm0tYmFzZWQgZWRpdG9ycyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLgotICBEb2N1bWVudCB5b3VyIHRhc2ssIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudHMgdXNpbmcgaW50dWl0aXZlCi0gIHJpY2gtdGV4dCBlZGl0b3JzIHRoYXQgYWxsb3cgeW91IHRvIGNvcHkgYW5kIHBhc3RlIHRleHQgZnJvbSBvdGhlciBzb3VyY2VzIHN1Y2gKLSAgYXMgd2ViIHBhZ2VzIG9yIGRvY3VtZW50cy4gVXNlIHNpbXBsZSBkaWFsb2dzIHRvIGVzdGFibGlzaCByZWxhdGlvbnNoaXBzIGJldHdlZW4KLSAgY29udGVudCBlbGVtZW50cy48L3A+Ci08cD5STUMgb3JnYW5pemVzIGNvbnRlbnQgaW4gcGh5c2ljYWwgY29udGVudCBwYWNrYWdlcyB0aGF0IGFsbG93IHlvdSB0byBtYW5hZ2UKLSAgeW91ciBjb250ZW50IGluIGNvbmZpZ3VyYWJsZSB1bml0cy4gUk1DIGFsc28gYWxsb3dzIHlvdSB0byBjYXRlZ29yaXplIHlvdXIgY29udGVudAotICBiYXNlZCBvbiBhIHNldCBvZiBwcmVkZWZpbmVkIGNhdGVnb3JpZXMgKGZvciBleGFtcGxlLCBjYXRlZ29yaXplIHlvdXIgdGFza3MKLSAgaW50byBkZXZlbG9wbWVudCBkaXNjaXBsaW5lcywgb3IgeW91ciB3b3JrIHByb2R1Y3RzIGludG8gZG9tYWlucykgb3IgY3JlYXRlCi0gIHlvdXIgb3duIGNhdGVnb3JpemF0aW9uIHNjaGVtZXMgZm9yIHlvdXIgY29udGVudCB3aXRoIHlvdXIgb3duIHVzZXItZGVmaW5lZAotICBjYXRlZ29yaWVzIHRoYXQgYWxsb3cgeW91IHRvIGluZGV4IGNvbnRlbnQgaW4gYW55IHdheSB5b3Ugd2FudC48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIG1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPk1ldGhvZAotICAgICAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmRjOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTx0aXRsZT5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPkludHJvZHVjdGlvbiB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIChFUEYpIENvbXBvc2VyPC9oMz4KLTxwPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayAoRVBGKSBDb21wb3Nlci4gRVBGIENvbXBvc2VyIGlzIGEgdG9vbCBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMKLSAgcHJvY2VzcyBlbmdpbmVlcnMgYW5kIG1hbmFnZXJzIHRvIGltcGxlbWVudCwgZGVwbG95LCBhbmQgbWFpbnRhaW4gcHJvY2Vzc2VzCi0gIGZvciBvcmdhbml6YXRpb25zIG9yIGluZGl2aWR1YWwgcHJvamVjdHMuIFR5cGljYWxseSwgdHdvIGtleSBwcm9ibGVtcyBuZWVkIHRvCi0gIGJlIGFkZHJlc3NlZCB0byBzdWNjZXNzZnVsbHkgZGVwbG95IG5ldyBwcm9jZXNzZXMuPC9wPgotPHA+IEZpcnN0LCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIGJlIGVkdWNhdGVkIG9uIHRoZSBtZXRob2RzIGFwcGxpY2FibGUgdG8KLSAgdGhlIHJvbGVzIHRoYXQgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiBTb2Z0d2FyZSBkZXZlbG9wZXJzIHR5cGljYWxseSBuZWVkCi0gIHRvCi0gIGxlYXJuCi0gIGhvdwotICB0bwotICBkbyBhbmFseXNpcyBhbmQgZGVzaWduLCB0ZXN0ZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvIHRlc3QgaW1wbGVtZW50YXRpb25zIGFnYWluc3QKLSAgIHJlcXVpcmVtZW50cywgbWFuYWdlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gbWFuYWdlIHRoZSBwcm9qZWN0IHNjb3BlIGFuZCBjaGFuZ2UsCi0KLSAgYW5kIHNvIG9uLiBTb21lIG9yZ2FuaXphdGlvbnMgYXNzdW1lIHRoYXQgZGV2ZWxvcGVycyBpbXBsaWNpdGx5IGtub3cgaG93IHRvCi0gICBkbyBzdWNoIHdvcmsgd2l0aG91dCBkb2N1bWVudGluZyB0aGVpciBtZXRob2RzLCBidXQgbWFueSBvcmdhbml6YXRpb25zIHdhbnQKLQotICB0byBlc3RhYmxpc2ggY29tbW9uIGFuZCByZWd1bGF0ZWQgcHJhY3RpY2VzLCB0byBkcml2ZSBzcGVjaWZpYyBpbXByb3ZlbWVudAotICBvYmplY3RpdmVzLCAgYW5kIHRvIG1lZXQgY29tcGxpYW5jZSBzdGFuZGFyZHMuPC9wPgotPHA+IFNlY29uZCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0byBhcHBseSB0aGVzZSBtZXRob2RzIHRocm91Z2hvdXQKLSAgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFRoYXQgaXMsIHRoZXkgbmVlZCB0byBkZWZpbmUgb3Igc2VsZWN0IGEgZGV2ZWxvcG1lbnQKLSAgcHJvY2Vzcy4gRm9yCi0KLSAgZXhhbXBsZSwgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQgbWV0aG9kcyBoYXZlIHRvIGJlIGFwcGxpZWQgZGlmZmVyZW50bHkgaW4KLSAgZWFybHkgIHBoYXNlcyBvZiBhIHByb2plY3Qgd2hlcmUgdGhlIGZvY3VzIGlzIG9uIGVsaWNpdGF0aW9uIG9mIHN0YWtlaG9sZGVyCi0gIG5lZWRzIGFuZAotICByZXF1aXJlbWVudHMgYW5kIHNjb3BpbmcgYSB2aXNpb24sIHRoYW4gaW4gbGF0ZXIgcGhhc2VzIHdoZXJlIHRoZSBmb2N1cyBpcwotICBvbiAgbWFuYWdpbmcgcmVxdWlyZW1lbnRzIHVwZGF0ZXMgYW5kIGNoYW5nZXMgYW5kIHBlcmZvcm1pbmcgaW1wYWN0IGFuYWx5c2lzCi0gIG9mCi0gIHRoZXNlIHJlcXVpcmVtZW50cyBjaGFuZ2VzLiBUZWFtcyBhbHNvIG5lZWQgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlCi0gIGRpZmZlcmVudCAgdGFza3Mgb2YgdGhlIG1ldGhvZHMgcmVsYXRlIHRvIGVhY2ggb3RoZXIsIGZvciBleGFtcGxlLCBob3cgdGhlCi0gIGNoYW5nZSBtYW5hZ2VtZW50Ci0gIG1ldGhvZCBpbXBhY3RzIHRoZSByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2QgYXMgd2VsbCBhcyByZWdyZXNzaW9uIHRlc3RpbmcKLSAgIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIEV2ZW4gc2VsZi1vcmdhbml6aW5nIHRlYW1zIG5lZWQgdG8gZGVmaW5lCi0gIGEKLSAgcHJvY2VzcyB0aGF0IGdpdmVzIGF0IG1pbmltdW0gc29tZSBndWlkYW5jZSBvbiBob3cgdGhlIGRldmVsb3BtZW50IHdpbGwgYmUKLSAgc2NvcGVkICB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUsIHdoZW4gbWlsZXN0b25lcyB3aWxsIGJlIGFjaGlldmVkIGFuZCB2ZXJpZmllZCwKLSAgYW5kCi0gIHNvIG9uLiA8L3A+Ci08cD5UbyB0aGF0IGVuZCwgRVBGIENvbXBvc2VyIGhhcyB0d28gbWFpbiBwdXJwb3NlczogPC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+PHVsPgotICA8bGk+VG8gcHJvdmlkZSBhIGtub3dsZWRnZSBiYXNlIG9mIGludGVsbGVjdHVhbCBjYXBpdGFsIHdoaWNoIHlvdSBjYW4gYnJvd3NlLAotICAgIG1hbmFnZSBhbmQgZGVwbG95LiBUaGlzIGNvbnRlbnQgY2FuIGluY2x1ZGUgZXh0ZXJuYWxseSBkZXZlbG9wZWQgY29udGVudCwKLSAgICBhbmQsIG1vcmUgaW1wb3J0YW50bHksIGNhbiBpbmNsdWRlIHlvdXIgb3duIGNvbnRlbnQgaW5jbHVkaW5nIG9mIHdoaXRlcGFwZXJzLAotICAgIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgcHJpbmNpcGxlcywgYmVzdCBwcmFjdGljZXMsIGludGVybmFsIHByb2NlZHVyZXMgYW5kCi0gICAgcmVndWxhdGlvbnMsIHRyYWluaW5nIG1hdGVyaWFsLCBhbmQgYW55IG90aGVyIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHlvdXIKLSAgICBtZXRob2RzLiBUaGlzIGtub3dsZWRnZSBiYXNlIGNhbiB1c2VkIGZvciByZWZlcmVuY2UgYW5kIGVkdWNhdGlvbi4gSXQgYWxzbwotICAgIGZvcm1zIHRoZSBiYXNpcyBmb3IgZGV2ZWxvcGluZyBwcm9jZXNzZXMgKHRoZSBzZWNvbmQgcHVycG9zZSkuIEVQRiBDb21wb3NlciBpcyBkZXNpZ25lZAotICAgIHRvIGJlIGEgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0IHByb3ZpZGVzIGEgY29tbW9uIG1hbmFnZW1lbnQgc3RydWN0dXJlCi0gICAgYW5kIGxvb2sgYW5kIGZlZWwgZm9yIGFsbCBvZiB5b3VyIGNvbnRlbnQsIHJhdGhlciB0aGFuIGJlaW5nIGEgZG9jdW1lbnQgbWFuYWdlbWVudAotICAgIHN5c3RlbSBpbiB3aGljaCB5b3Ugd291bGQgc3RvcmUgYW5kIGFjY2VzcyBoYXJkIHRvIG1haW50YWluIGxlZ2FjeSBkb2N1bWVudHMKLSAgICBhbGwgaW4gdGhlaXIgb3duIHNoYXBlcyBhbmQgZm9ybWF0cy4gQWxsIGNvbnRlbnQgbWFuYWdlZCBpbiBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZAotICAgIHRvIGh0bWwgYW5kIGRlcGxveWVkIHRvIFdlYiBzZXJ2ZXJzIGZvciBkaXN0cmlidXRlZCB1c2FnZS48YnI+Ci0gIDwvbGk+Ci0gIDxsaT5UbyBwcm92aWRlIHByb2Nlc3MgZW5naW5lZXJpbmcgY2FwYWJpbGl0aWVzIGJ5IHN1cHBvcnRpbmcgcHJvY2VzcyBlbmdpbmVlcnMKLSAgICBhbmQgcHJvamVjdCBtYW5hZ2VycyBpbiBzZWxlY3RpbmcsIHRhaWxvcmluZywgYW5kIHJhcGlkbHkgYXNzZW1ibGluZyBwcm9jZXNzZXMKLSAgICBmb3IgdGhlaXIgY29uY3JldGUgZGV2ZWxvcG1lbnQgcHJvamVjdHMuIEVQRiBDb21wb3NlciBwcm92aWRlcyBjYXRhbG9ncyBvZiBwcmUtZGVmaW5lZAotICAgIHByb2Nlc3NlcyBmb3IgdHlwaWNhbCBwcm9qZWN0IHNpdHVhdGlvbnMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBpbmRpdmlkdWFsCi0gICAgbmVlZHMuIEl0IGFsc28gcHJvdmlkZXMgcHJvY2VzcyBidWlsZGluZyBibG9ja3MsIGNhbGxlZCBjYXBhYmlsaXR5IHBhdHRlcm5zLAotICAgIHRoYXQgcmVwcmVzZW50IGJlc3QgZGV2ZWxvcG1lbnQgcHJhY3RpY2VzIGZvciBzcGVjaWZpYyBkaXNjaXBsaW5lcywgdGVjaG5vbG9naWVzLAotICAgIG9yIG1hbmFnZW1lbnQgc3R5bGVzLiBUaGVzZSBidWlsZGluZyBibG9ja3MgZm9ybSBhIHRvb2xraXQgZm9yIHF1aWNrIGFzc2VtYmx5Ci0gICAgb2YgcHJvY2Vzc2VzIGJhc2VkIG9uIHByb2plY3Qtc3BlY2lmaWMgbmVlZHMuIEVQRiBDb21wb3NlciBhbHNvIGFsbG93cyB5b3UgdG8gc2V0IHVwCi0gICAgeW91ciBvd24gb3JnYW5pemF0aW9uLXNwZWNpZmljIGNhcGFiaWxpdHkgcGF0dGVybiBsaWJyYXJpZXMuIEZpbmFsbHksIHRoZQotICAgIHByb2Nlc3NlcyBjcmVhdGVkIHdpdGggRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQgYW5kIGRlcGxveWVkIGFzIFdlYiBzaXRlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGgzPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIncyBLZXkgQ2FwYWJpbGl0aWVzPC9oMz4KLTxwPklCTSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbmV3IGtleSBjYXBhYmlsaXRpZXM6PC9wPgotICA8ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPiBQcm92aWRlcyBjb21wbGV0ZWx5IHJlZGVzaWduZWQgdG9vbHMgZm9yIGF1dGhvcmluZywgY29uZmlndXJpbmcsIHZpZXdpbmcsCi0gICAgYW5kIHB1Ymxpc2hpbmcgZGV2ZWxvcG1lbnQgcHJvY2Vzc2VzLjwvbGk+Ci0gIDxsaT4gUHJvdmlkZXMganVzdC1pbi10aW1lIGdlbmVyYXRpb24gb2YgcHVibGljYXRpb24gcHJldmlld3MgaW4gZGVkaWNhdGVkIGJyb3dzaW5nCi0gICAgcGVyc3BlY3RpdmUgdGhhdCBhbGxvd3MgcmFwaWQgY29uZmlndXJhdGlvbiBzd2l0Y2hpbmcuPC9saT4KLSAgPGxpPiBNYW5hZ2VzIG1ldGhvZCBjb250ZW50IHVzaW5nIHNpbXBsZSBmb3JtLWJhc2VkIHVzZXIgaW50ZXJmYWNlcy4gVGhlcmVmb3JlLAotICAgIFVNTCBtb2RlbGluZyBza2lsbHMgYXJlIG5vIGxvbmdlciByZXF1aXJlZC48L2xpPgotICA8bGk+IFByb3ZpZGVzIGludHVpdGl2ZSByaWNoIHRleHQgZWRpdG9ycyBmb3IgY3JlYXRpbmcgaWxsdXN0cmF0aXZlIGNvbnRlbnQKLSAgICBkZXNjcmlwdGlvbnMuIEVkaXRvcnMgYWxsb3cgdXNlIG9mIHN0eWxlcywgaW1hZ2VzLCB0YWJsZXMsIGh5cGVybGlua3MsIGFuZAotICAgIGRpcmVjdCBodG1sIGVkaXRpbmcuPC9saT4KLSAgPGxpPkFsbG93cyBjcmVhdGluZyBwcm9jZXNzZXMgd2l0aCBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvcnMgYW5kIHdvcmtmbG93Ci0gICAgZGlhZ3JhbXMgdGhyb3VnaCB1c2Ugb2YgbXVsdGktcHJlc2VudGF0aW9uIHByb2Nlc3MgZWRpdG9ycy4gQnJlYWtkb3duIHN0cnVjdHVyZQotICAgIGVkaXRvciBzdXBwb3J0cyBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3czogd29yay1icmVha2Rvd24gdmlldywgd29yayBwcm9kdWN0Ci0gICAgdXNhZ2UgdmlldywgYW5kIHRlYW0gYWxsb2NhdGlvbiB2aWV3LiBFUEYgQ29tcG9zZXIgYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZXMgYWxsIHByZXNlbnRhdGlvbnMKLSAgICB3aXRoIHByb2Nlc3MgY2hhbmdlcy4gPC9saT4KLSAgPGxpPlByb3ZpZGVzIHN1cHBvcnQgZm9yIG1hbnkgYWx0ZXJuYXRpdmUgbGlmZWN5Y2xlCi0gICAgbW9kZWxzLiBGb3IgZXhhbXBsZSwgd2F0ZXJmYWxsLCBpbmNyZW1lbnRhbCwgb3IgaXRlcmF0aXZlIG1vZGVscyBjYW4gYmUgY3JlYXRlZAotICAgIHdpdGggdGhlIHNhbWUgb3ZlcmxhcHBpbmcgbWV0aG9kIGNvbnRlbnQuPC9saT4KLSAgPGxpPkltcHJvdmVkIHJldXNlIGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcy4gVGhlIHBsdWctaW4gbWVjaGFuaXNtcyBmcm9tCi0gICAgcGFzdCB2ZXJzaW9ucyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBleHRlbnNpb25zIGZvciBicmVha2Rvd24gc3RydWN0dXJlcy48L2xpPgotICA8bGk+U3VwcG9ydHMgcmV1c2FibGUgZHluYW1pY2FsbHktbGlua2VkIHByb2Nlc3MgcGF0dGVybnMgb2YgYmVzdCBwcmFjdGljZXMKLSAgICBmb3IgcmFwaWQgcHJvY2VzcyBhc3NlbWJseSB2aWEgZHJhZy1hbmQtZHJvcC48L2xpPgotPC91bD4KLTwvZGl2PgotPGgzPktleSBUZXJtaW5vbG9neSBhbmQgQ29uY2VwdHM8L2gzPgotPHA+VG8gZWZmZWN0aXZlbHkgd29yayB3aXRoIEVQRiBDb21wb3NlciwgeW91IG5lZWQgdG8gdW5kZXJzdGFuZCBhIGZldyBjb25jZXB0cwotICB0aGF0IGFyZSB1c2VkIHRvIG9yZ2FuaXplIHRoZSBjb250ZW50LiBUaGUgcGFnZXMgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPk1ldGhvZAotICBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+UHJvY2VzcwotICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+IGNvbnRhaW4gbW9yZSBkZXRhaWwgYW5kIGNvbmNyZXRlIGV4YW1wbGVzIG9mIGhvdyB0byB3b3JrCi0gIGluIHRoZSB0b29sLiBUaGlzIHBhZ2UgcHJvdmlkZXMgeW91IHdpdGggYSBnZW5lcmFsIG92ZXJ2aWV3IG9mIHRoZXNlIGNvbmNlcHRzLjwvcD4KLTxwPlRoZSBtb3N0IGZ1bmRhbWVudGFsIHByaW5jaXBsZSBpbiBFUEYgQ29tcG9zZXIgaXMgdGhlIHNlcGFyYXRpb24gb2YgcmV1c2FibGUgY29yZSBtZXRob2QKLSAgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuIFRoaXMgZGlyZWN0bHkgcmVsYXRlcyBiYWNrIHRvIHRoZQotICB0d28gcHVycG9zZXMgb2YgRVBGIENvbXBvc2VyIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3Qgc2VjdGlvbi4gQWxtb3N0IGFsbCBvZiBFUEYgQ29tcG9zZXIncyBjb25jZXB0cwotICBhcmUgY2F0ZWdvcml6ZWQgYWxvbmcgdGhpcyBzZXBhcmF0aW9uLiBNZXRob2QgY29udGVudCBkZXNjcmliZXMgd2hhdCBpcyB0byBiZQotICBwcm9kdWNlZCwgdGhlIG5lY2Vzc2FyeSBza2lsbHMgcmVxdWlyZWQgYW5kIHRoZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGRlc2NyaWJpbmcKLSAgaG93IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZC4gVGhlc2UgbWV0aG9kIGNvbnRlbnQgZGVzY3JpcHRpb25zCi0gIGFyZSBpbmRlcGVuZGVudCBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIGRlc2NyaWJlIHRoZSBkZXZlbG9wbWVudAotICBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZSBtZXRob2QgY29udGVudCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQKLSAgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuPC9wPgotPHA+PGltZyBzcmM9InVtYV9odW1wLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgdGhpcyBzZXBhcmF0aW9uIGlzIGRlcGljdGVkIGluIEJhc2ljIFVuaWZpZWQKLSAgUHJvY2Vzcy4gTWV0aG9kIGNvbnRlbnQsIGRlc2NyaWJpbmcgaG93IGRldmVsb3BtZW50IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkLAotICBpcyBjYXRlZ29yaXplZCBieSBkaXNjaXBsaW5lcyBhbG9uZyB0aGUgeS1heGlzIG9mIHRoZSBkaWFncmFtLiBUaGUgd29yayBkZXNjcmliZWQKLSAgaW4gYSBwcm9jZXNzIGlzIHNlZW4gYWxvbmcgdGhlIHgtYXhpcyByZXByZXNlbnRpbmcgdGhlIHRpbWVsaW5lLiBUaGlzIGlzIHRoZQotICBsaWZlY3ljbGUgb2YgYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBJdCBleHByZXNzZXMgd2hlbiB3aGF0IHdvcmsgd2lsbCBiZSBwZXJmb3JtZWQuCi0gIFRoZSBncmFwaCBpbiB0aGUgaWxsdXN0cmF0aW9uIHJlcHJlc2VudHMgYW4gZXN0aW1hdGVkIHdvcmtsb2FkIGZvciBlYWNoIGRpc2NpcGxpbmUuCi0gIEFzIHlvdSBzZWUsIGZvciBleGFtcGxlLCBvbmUgbmV2ZXIgc3RvcHMgd29ya2luZyBvbiByZXF1aXJlbWVudHMgaW4gUlVQLCBidXQKLSAgdGhlcmUgYXJlIGNlcnRhaW5seSBwZWFrIHRpbWVzIGluIHdoaWNoIG1vc3Qgb2YgdGhlIHJlcXVpcmVtZW50cyBlbGljaXRhdGlvbgotICBhbmQgZGVzY3JpcHRpb24gd29yayBpcyBwZXJmb3JtZWQuIFRoZXJlIGFyZSBhbHNvIHRpbWVzIGF0IHdoaWNoIGEgZG93bndhcmQKLSAgdHJlbmQgbmVlZHMgdG8gYmUgb2JzZXJ2ZWQgd2hlcmUgZmV3ZXIgYW5kIGZld2VyIHJlcXVpcmVtZW50cyBjaGFuZ2VzIGhhdmUgdG8KLSAgYmUgcHJvY2Vzc2VkIHRvIGJyaW5nIHRoZSBwcm9qZWN0IHRvIGEgY2xvc2UuIFRoaXMgYXZvaWRzIHdoYXQgaXMgcmVmZXJyZWQgdG8KLSAgYXMgZmVhdHVyZSBjcmVlcCBpbiB3aGljaCByZXF1aXJlbWVudHMgd29yayByZW1haW5zIGNvbnN0YW50IG9yIGV2ZW4gaW5jcmVhc2VzLgotICBIZW5jZSwgYSBsaWZlY3ljbGUgKHByb2Nlc3MpIGV4cHJlc3NlcyB0aGUgdmFyaWFuY2VzIG9mIHdvcmsgcGVyZm9ybWVkIGluIHRoZQotICB2YXJpb3VzIGRpc2NpcGxpbmVzIChtZXRob2QgY29udGVudCkuPC9wPgotPHA+PGltZyBzcmM9Im1jX3ZzX3AuZ2lmIj48L3A+Ci08cD5UaGUgcGljdHVyZSBhYm92ZSBwcm92aWRlcyBhIHN1bW1hcnkgb2YgdGhlIGtleSBlbGVtZW50cyB1c2VkIGluIEVQRiBDb21wb3NlciBhbmQgaG93Ci0gIHRoZXkgcmVsYXRlIHRvIG1ldGhvZCBjb250ZW50IG9yIHByb2Nlc3MuIEFzIHlvdSBzZWUsIG1ldGhvZCBjb250ZW50IGlzIHByaW1hcmlseQotICBleHByZXNzZWQgdXNpbmcgd29yayBwcm9kdWN0cywgcm9sZXMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIEd1aWRhbmNlLCBzdWNoIGFzCi0gIGNoZWNrbGlzdHMsIGV4YW1wbGVzLCBvciByb2FkbWFwcywgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBwcm92aWRlIGV4ZW1wbGFyeQotICB3YWxrdGhyb3VnaHMgb2YgYSBwcm9jZXNzLiBPbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBkaWFncmFtLCB5b3Ugc2VlIHRoZQotICBlbGVtZW50cyB1c2VkIHRvIHJlcHJlc2VudCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLiBUaGUgbWFpbiBlbGVtZW50IGlzIHRoZSBhY3Rpdml0eQotICB0aGF0IGNhbiBiZSBuZXN0ZWQgdG8gZGVmaW5lIGJyZWFrZG93biBzdHJ1Y3R1cmVzIGFzIHdlbGwgYXMgcmVsYXRlZCB0byBlYWNoCi0gIG90aGVyIHRvIGRlZmluZSBhIGZsb3cgb2Ygd29yay4gQWN0aXZpdGllcyBhbHNvIGNvbnRhaW4gZGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UKLSAgbWV0aG9kIGNvbnRlbnQuIEFjdGl2aXRpZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHByb2Nlc3NlcyBvZiB3aGljaCBFUEYgQ29tcG9zZXIgc3VwcG9ydAotICB0d28gbWFpbiBraW5kczogZGVsaXZlcnkgcHJvY2Vzc2VzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm5zLiBEZWxpdmVyeSBwcm9jZXNzZXMKLSAgcmVwcmVzZW50IGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgcHJvY2VzcyB0ZW1wbGF0ZSBmb3IgcGVyZm9ybWluZyBvbmUgc3BlY2lmaWMKLSAgdHlwZSBvZiBwcm9qZWN0LiBUaGV5IGRlc2NyaWJlIGEgY29tcGxldGUgZW5kLXRvLWVuZCBwcm9qZWN0IGxpZmVjeWNsZSBhbmQgYXJlCi0gIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcy4gQ2FwYWJpbGl0eQotICBwYXR0ZXJucyBhcmUgcHJvY2Vzc2VzIHRoYXQgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEKLSAga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgb3IgYSBiZXN0IHByYWN0aWNlLiBUaGV5IGFyZSBhbHNvCi0gIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIgY2FwYWJpbGl0eQotICBwYXR0ZXJucy4gVGhpcyBlbnN1cmVzIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZWlyIGtleSBiZXN0IHByYWN0aWNlcwotICBpbiBwcm9jZXNzIGF1dGhvcmluZyBhY3Rpdml0aWVzIGluIEVQRiBDb21wb3Nlci4gPC9wPgotCi08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIsIHNlZSB0aGUgb25saW5lIGhlbHA6PC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sIj5PdmVydmlldzwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwiPkdldHRpbmcKLSAgICAgIFN0YXJ0ZWQ8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvb3ZlcnZpZXcuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy9vdmVydmlldy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMTU1NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy9vdmVydmlldy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2NvbnRlbnRwYWdlL292ZXJ2aWV3X3d0ci5qcGcpOwotfQotCi0vKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXcgaW1nLCAjbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmhvdmVyIGltZyB7IAotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYpOyAKLQl9Ci0KLQotaWZyYW1lIHsKLQlwb3NpdGlvbjpyZWxhdGl2ZTsKLQl0b3A6MTZweDsKLQl3aWR0aDoxMDAlOwotCWhlaWdodDoxMDAlOwotCXBhZGRpbmctbGVmdDoxMHB4OwotCX0KLQkKLS8qIG1vemlsbGEgc2Nyb2xsYmFyIGFwcGVhcmluZyBvZmYgcGFnZSBmaXggKi8KLSNwYWdlLWNvbnRlbnQgPiBpZnJhbWUgewotCXdpZHRoOiA5OCU7Ci0JcGFkZGluZy1sZWZ0OiAyJTsKLX0JCi0KLQotLyogCi0gKiBTZXQgdXAgdGhlIE92ZXJ2aWV3IGxpbmtzIHRvIGJlIGRpc3BsYXllZCBpbiB0d28gY29sdW1ucwotICogdGhhdCBhcmUgY2VudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGFnZS4KLSAqLwotCi0jb3ZlcnZpZXctbGlua3MgewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCXdpZHRoIDogNzYwcHg7Ci0JLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCi0JbWFyZ2luIDogMHB4IGF1dG87Ci0KLX0KLQotI292ZXJ2aWV3LWxpbmtzIGEgeyAKLQl3aWR0aCA6IDM3MHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiA1cHg7Ci0JbWFyZ2luLXRvcCA6IDVweDsKLQltYXJnaW4tYm90dG9tIDogLTIwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0KLSNvdmVydmlldy1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotCi0jb3ZlcnZpZXctbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDU3cHg7Ci0Jd2lkdGggOiA1N3B4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotCQkKLX0JCi0KLSNvdmVydmlldy1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC01MHB4OwotCWxlZnQgOiA2MHB4OwotfQotCi0jb3ZlcnZpZXctbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgbGVmdDogNjVweDsgfQotCi0jb3ZlcnZpZXctbGlua3MgYSBwIC50ZXh0IHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC00NXB4OwotCWxlZnQgOiA1M3B4OwotfQotCi0jb3ZlcnZpZXctbGlua3MgYSBwID4gLnRleHQgeyBsZWZ0OiA1OHB4OyB9Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZAotICAgaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgKi8KLSNvdmVydmlldy1saW5rcyA+IGEgeyAJd2lkdGggOiA3MDBweDsgfQotI292ZXJ2aWV3LWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSNvdmVydmlldy1saW5rcyBhIHAgPiAudGV4dCB7IHdpZHRoIDogNzAwcHg7IH0KLQotI292ZXJ2aWV3LWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH0KLQotYSNiYXNpY3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc19vYmouZ2lmKTsgfQotYSNiYXNpY3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc2hvdl9vYmouZ2lmKTsgfQotCi1hI3RlYW0gaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYpOyB9Ci1hI3RlYW06aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYpOyB9Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3L3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTEzY2ViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW92ZXJ2aWV3LmxheW91dC5uY29sdW1ucyA9IDIKLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAzNQotb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmxheW91dC5uY29sdW1ucyA9IDIKLQotb3ZlcnZpZXcuc3VidGl0bGUtaWQgPSBvdmVydmlldy9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQotb3ZlcnZpZXcuZGVzY3JpcHRpb24taWQgPSBvdmVydmlldy9wYWdlLWNvbnRlbnQvcGFnZS1kZXNjcmlwdGlvbgotCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MuZXBmLW92LXJ1cG92LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3YuZ2lmCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MuZXBmLW92LW1ldGhvZC5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZC5naWYKLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5lcGYtb3YtcHJvY2Vzcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3MuZ2lmCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MuZXBmLW92LWNvbmZpZ3B1Ymxpc2gubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoLmdpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmYyYjdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Byb2Nlc3NhdXRob3JpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHJvY2Vzc2F1dGhvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjI0MmRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHJvY2Vzc2F1dGhvcmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxoZWFkPgotPHRpdGxlPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPkEgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZWZpbmVzIHNlcXVlbmNlcyBvZiB0YXNrcyBwZXJmb3JtZWQgYnkgcm9sZXMgYW5kIHdvcmsKLSAgcHJvZHVjdHMgcHJvZHVjZWQgb3ZlciB0aW1lLjwvcD4KLTxwPjxpbWcgc3JjPSJwLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyB0aGF0IHByb2Nlc3NlcyBhcmUgdHlwaWNhbGx5IGV4cHJlc3NlZCBhcyB3b3JrZmxvd3MKLSAgb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuIERlZmluaW5nIGEgc3RyaWN0IHNlcXVlbmNlIGFzIGluIGEgd2F0ZXJmYWxsIG1vZGVsCi0gIGlzIGFzIG11Y2ggYSBwcm9jZXNzIGFzIGRlZmluaW5nIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgaW4gaXRlcmF0aW9ucyBvZiBwYXJhbGxlbAotICB3b3JrLiBUaGV5IGp1c3QgcmVwcmVzZW50IGRpZmZlcmVudCBkZXZlbG9wbWVudCBhcHByb2FjaGVzLiBIZW5jZSwgZm9yIGRlZmluaW5nCi0gIGEgcHJvY2Vzcywgb25lIGNhbiB0YWtlIG1ldGhvZCBjb250ZW50IGFuZCBjb21iaW5lIGl0IGludG8gc3RydWN0dXJlcyB0aGF0IHNwZWNpZnkKLSAgaG93IHRoZSB3b3JrIHNoYWxsIGJlIG9yZ2FuaXplZCBvdmVyIHRpbWUsIHRvIG1lZXQgdGhlIG5lZWRzIG9mIGEgcGFydGljdWxhcgotICB0eXBlIG9mIGRldmVsb3BtZW50IHByb2plY3QgKHN1Y2ggYXMgc29mdHdhcmUgZm9yIGEgb25saW5lIHN5c3RlbSB2ZXJzdXMgc29mdHdhcmUKLSAgYW5kIGhhcmR3YXJlIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0pLiBSTUMgc3VwcG9ydHMgcHJvY2Vzc2VzIGJhc2VkIG9uIGRpZmZlcmVudAotICBkZXZlbG9wbWVudCBhcHByb2FjaGVzIGFjcm9zcyBtYW55IGRpZmZlcmVudCBsaWZlY3ljbGUgbW9kZWxzLCBpbmNsdWRpbmcgd2F0ZXJmYWxsLAotICBpbmNyZW1lbnRhbCwgYW5kIGl0ZXJhdGl2ZSBsaWZlY3ljbGVzLiBSTUMgYWxzbyBzdXBwb3J0cyBkaWZmZXJlbnQgcHJlc2VudGF0aW9ucwotICBmb3IgcHJvY2Vzcywgc3VjaCBhcyB3b3JrLWJyZWFrZG93biBzdHJ1Y3R1cmUgb3Igd29ya2Zsb3cgcHJlc2VudGF0aW9ucy4gWW91Ci0gIGNhbiBhbHNvIGRlZmluZSBwcm9jZXNzZXMgaW4gUk1DIHRoYXQgdXNlIGEgbWluaW1hbCBzZXQgb2YgbWV0aG9kIGNvbnRlbnQgdG8KLSAgZGVmaW5lIHByb2Nlc3NlcyBmb3IgYWdpbGUsIHNlbGYtb3JnYW5pemluZyB0ZWFtcy48L3A+Ci08cD4gVGhlIFJNQyBzY3JlZW4gY2FwdHVyZSBhYm92ZSBzaG93cyBhbiBleGFtcGxlIG9mIGEgcHJvY2VzcyBwcmVzZW50ZWQgYXMgYQotICBicmVha2Rvd24gc3RydWN0dXJlIG9mIG5lc3RlZCBhY3Rpdml0aWVzIGFzIHdlbGwgYXMgYSB3b3JrZmxvdyBvciBhY3Rpdml0eSBkaWFncmFtCi0gIGZvciBvbmUgcGFydGljdWxhciBhY3Rpdml0eSwgdGhlIGluY2VwdGlvbiBwaGFzZS4gSXQgYWxzbyBpbmRpY2F0ZXMgd2l0aCB0aGUKLSAgdHdvIGJsdWUgYXJyb3dzIHRoYXQgdGhlIHBhcnRpY3VsYXIgbWV0aG9kIGNvbnRlbnQgdGFzayAmcXVvdDtEZXRhaWwgYSBVc2UgQ2FzZSZxdW90OwotICBoYXMgYmVlbiBhcHBsaWVkIGluIHRoZSBwcm9jZXNzIHR3aWNlOyBmaXJzdGx5IGluIHRoZSBpbmNlcHRpb24gcGhhc2UgdW5kZXIKLSAgdGhlIGFjdGl2aXR5ICZxdW90O0RlZmluZSB0aGUgU3lzdGVtLCZxdW90OyBhbmQgc2Vjb25kbHksIGluIHRoZSBlbGFib3JhdGlvbgotICBwaGFzZSBpbiB0aGUgYWN0aXZpdHkgJnF1b3Q7UmVmaW5lIHRoZSBzeXN0ZW0gZGVmaW5pdGlvbiZxdW90Oy4gWW91IHNlZSBiZWxvdwotICBlYWNoIG9mIHRoZXNlIHRhc2sgYXBwbGljYXRpb25zLCByZWZlcnJlZCB0byBhcyBhIHRhc2sgZGVzY3JpcHRvcnMgaW4gUk1DLCBsaXN0cwotICBvZiB0aGUgcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIElmIHlvdQotICBsb29rIGNsb3NlbHksIHlvdSBzZWUgdGhhdCB0aGVzZSBsaXN0cyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIG9mIHRoZXNlIHR3byB0YXNrCi0gIGRlc2NyaXB0b3JzLCBleHByZXNzaW5nIGRpZmZlcmVuY2VzIGluIHBlcmZvcm1pbmcgdGhlICZxdW90O0RldGFpbCBhIFVzZSBDYXNlJnF1b3Q7Ci0gIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIFlvdSBzZWUgZGlmZmVyZW50IHJvbGVzIGludm9sdmVkIGFuZCBjaGFuZ2VzCi0gIGluIHRoZSBsaXN0IG9mIGlucHV0cyB0byBiZSBjb25zaWRlcmVkIGFuZCBvdXRwdXRzIHRvIGJlIHByb2R1Y2VkIG9yIHVwZGF0ZWQuCi0gIFRoZXNlIGNoYW5nZXMgd2VyZSBkZWZpbmVkIGJ5IHRoZSBhdXRob3IgdGhhdCBjcmVhdGVkIHRoaXMgcHJvY2VzcyB0byBleHByZXNzCi0gIHRoZSBleGFjdCBmb2N1cyBvZiB0aGUgdGFzayBwZXJmb3JtYW5jZSBmb3IgZWFjaCBvY2N1cnJlbmNlLiBJbiBhZGRpdGlvbiB0bwotICB1cGRhdGluZyB0aGUgcm9sZXMsIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgYSB0YXNrIGRlc2NyaXB0b3IsIHlvdQotICBjYW4gYWxzbyBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgdGhlIGV4YWN0Ci0gIHN0ZXBzIG9mIHRoZSB0YXNrIHRoYXQgc2hvdWxkIGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi0gIG9jY3VycmVuY2Ugb2YgdGhlIHRhc2suPC9wPgotPHA+Uk1DIHByb3ZpZGVzIHlvdSB3aXRoIGEgcHJvY2VzcyBlZGl0b3IgdGhhdCBzdXBwb3J0cyBkaWZmZXJlbnQgYnJlYWtkb3duIHN0cnVjdHVyZQotICB2aWV3cyBhcyB3ZWxsIGFzIGdyYXBoaWNhbCBwcm9jZXNzIHByZXNlbnRhdGlvbnMuIEFzIGEgcHJvY2VzcyBhdXRob3IsIHlvdSB0eXBpY2FsbHkKLSAgc3RhcnQgYnkgY3JlYXRpbmcgYW4gYWN0aXZpdHkgYnJlYWtkb3duLCBkaXZpZGluZyBhbmQgYnJlYWtpbmcgeW91ciBwcm9jZXNzCi0gIGRvd24gaW50byBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBoaWdoLWxldmVsIGFjdGl2aXRpZXMuIEluc3RlYWQgb2YgY3JlYXRpbmcKLSAgeW91ciBhY3Rpdml0aWVzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHdvcmsKLSAgaW4gYSBncmFwaGljYWwgYWN0aXZpdHkgZGlhZ3JhbSBlZGl0b3IgdGhhdCBhbGxvd3MgeW91IHRvIGdyYXBoaWNhbGx5IGNyZWF0ZQotICBhIHdvcmtmbG93IGZvciB5b3VyIGFjdGl2aXRpZXMuIFRvIGFzc2lnbiBtZXRob2QgY29udGVudCB0byB5b3VyIHByb2Nlc3MsIHlvdQotICB0aGVuIGhhdmUgdGhlIGNob2ljZSBvZiB3b3JraW5nIGluIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzICh3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUsCi0gIHdvcmsgcHJvZHVjdCB1c2FnZSwgb3IgdGVhbSBhbGxvY2F0aW9uIHZpZXcpLiBFYWNoIHZpZXcgc3VwcG9ydHMgYSBkaWZmZXJlbnQKLSAgYXBwcm9hY2ggZm9yIGNyZWF0aW5nIGEgcHJvY2Vzcy4gWW91IGNhbiBkZWZpbmUgdGhlIHdvcmsgdG8gYmUgZG9uZSwgZGVmaW5lCi0gIHRoZSByZXN1bHRzIHRvIGJlIHByb2R1Y2VkLCBvciBkZWZpbmUgcmVzcG9uc2liaWxpdGllcyBmb3IgeW91ciByb2xlcy4gSWYgcmVxdWVzdGVkLAotICB0aGUgZWRpdG9yIHVwZGF0ZXMgdGhlIG90aGVyIHByb2Nlc3Mgdmlld3Mgc2VtaS1hdXRvbWF0aWNhbGx5IHVzaW5nIHdpemFyZHMKLSAgdGhhdCBwcm9tcHQgeW91IGZvciBkZWNpc2lvbnMgb24gc2VsZWN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLjwvcD4KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gcHJvY2VzcyBhdXRob3Jpbmcgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+UHJvY2VzcwotICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzZThkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3B1Yi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3B1Ymxpc2hpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHVibGlzaGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMwODJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHVibGlzaGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxoZWFkPgotPHRpdGxlPkNvbmZpZ3VyYXRpb24gYW5kIFB1Ymxpc2hpbmc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+TWV0aG9kIENvbmZpZ3VyYXRpb25zIE92ZXJ2aWV3PC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgc2hpcHMgd2l0aCBhIGxvdCBvZiBjb250ZW50IG91dCBvZiB0aGUgYm94LiBJdCBpbmNsdWRlcwotICB0aGUgT3BlbiBVbmlmaWVkIFByb2Nlc3MgKE9wZW5VUCkgZnJhbWV3b3JrIGFuZCB2YXJpb3VzIHBsdWctaW5zIGV4dGVuZGluZwotICBPcGVuVVAvQmFzaWMuIE5vIG9yZ2FuaXphdGlvbiBvciBwcm9qZWN0IHJlcXVpcmVzIGFsbCBvZiB0aGlzCi0gIGRvY3VtZW50YXRpb24gYWxsIGF0IG9uY2UsIGJ1dCB3b3VsZCB3b3JrIHdpdGggYSBzZWxlY3Rpb24gb2Ygc3BlY2lmaWMgc3Vic2V0cy48L3A+Ci08cD4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayAoRVBGKSBDb21wb3NlciBtYW5hZ2VzIGZvciB0aGF0IHB1cnBvc2Ugc28tY2FsbGVkIG1ldGhvZAotICBjb25maWd1cmF0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIHNwZWNpZnkgd29ya2luZyBzZXRzIG9mIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotICBmb3IgYSBzcGVjaWZpYyBjb250ZXh0LCBzdWNoIGFzIGEgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgUlVQIGZyYW1ld29yayB0aGF0Ci0gIHlvdSB3YW50IHRvIHB1Ymxpc2ggYW5kIGRlcGxveSBmb3IgYSBnaXZlbiBzb2Z0d2FyZSBwcm9qZWN0IG9yIGFzIGEgZm91bmRhdGlvbgotICBmb3IgYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24uIEFsbCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIGFyZSBvcmdhbml6ZWQKLSAgaW4gbWV0aG9kIHBsdWctaW5zLCB3aGljaCBhcmUgb3JnYW5pemVkIGludG8gbWV0aG9kIHBhY2thZ2VzLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGlzIHNpbXBseSBhIHNlbGVjdGlvbiBvZiB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L3A+Ci08cD48aW1nIHNyYz0iY3NzL2NvbmYuZ2lmIj48L3A+Ci08cD5Zb3UgY3JlYXRlIGFuZCBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgZGVwaWN0ZWQKLSAgaW4gdGhlIGZpZ3VyZSBhYm92ZS4gWW91IGNvdWxkIHN0YXJ0IGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGJ5IGNvcHlpbmcgb25lIG9mIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHNoaXAgd2l0aCBFUEYgQ29tcG9zZXIgYW5kIG1vZGlmeSBpdCB0byBmaXQKLSAgeW91ciBzcGVjaWZpYyBuZWVkcy4gWW91IGNhbiBhZGQgb3IgcmVtb3ZlIHdob2xlIG1ldGhvZCBwbHVnLWlucyBhcyB3ZWxsIGFzCi0gIG1ha2Ugc2VsZWN0aW9uIHdpdGggZWFjaCBwbHVnLWluIGJ5IGNoZWNraW5nIG9yIHVuLWNoZWNraW5nIHBhY2thZ2VzLiA8L3A+Ci08cD4gWW91IGNhbiB1c2UgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGFzIHlvdXIgd29ya2luZyBzZXQgZm9yIHlvdXIgRVBGIENvbXBvc2VyCi0gIHdvcmsuIFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgY29uZmlndXJhdGlvbiwgaS5lLiB0aGUgaW5jbHVkZWQgbWV0aG9kIGNvbnRlbnQKLSAgYW5kIHByb2Nlc3MgZWxlbWVudHMgYXJlIGFsd2F5cyBhY2Nlc3NpYmxlIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuIFVzZSB0aGUKLSAgY29tYm8gYm94IGluIHRoZSB0b29sYmFyIHRvIHNlbGVjdCB0aGUgY3VycmVudGx5IHVzZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPGgzPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2gzPgotPHA+TWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB0aGUgYmFzaXMgZm9yIHB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4KLSAgQSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBhbiBodG1sIFdlYiBzaXRlIHRoYXQgcHJlc2VudHMgYWxsIHRoZSBtZXRob2QKLSAgY29udGVudCBhbmQgcHJvY2Vzc2VzIG9mIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiBhIG5hdmlnYWJsZSBhbmQgc2VhcmNoYWJsZQotICB3YXkuIEl0IHVzZXMgdGhlIHJlbGF0aW9uc2hpcHMgZXN0YWJsaXNoZWQgZHVyaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzCi0gIGF1dGhvcmluZyB0byBnZW5lcmF0ZSBoeXBlcmxpbmtzIGJldHdlZW4gZWxlbWVudHMgYXMgd2VsbCBhcyBwcm92aWRlcyB0cmVlCi0gIGJyb3dzZXJzIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIHVzZXItZGVmaW5lZCBjYXRlZ29yaXphdGlvbnMgb2YKLSAgdGhlIGNvbnRlbnQuIFRoZSBmaWd1cmUgYmVsb3cgc2hvd3MgYW4gZXhhbXBsZSBvZiB0aGUgcHVibGlzaGVkICdDbGFzc2ljIFJVUCcKLSAgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPHA+PGltZyBzcmM9ImNzcy9wdWIuZ2lmIj48L3A+Ci08cD5Gb3IgcHVibGlzaGluZyBzaW1wbHkgY3JlYXRlIGFuZCBzZWxlY3QgYSBjb25maWd1cmF0aW9uLiBUaGUgcHVibGljYXRpb24gd2l6YXJkCi0gIHdpbGwgZG8gdGhlIHJlc3QgZm9yIHlvdSBhbmQgb25seSBwdWJsaXNoIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtZXRob2QKLSAgY29uZmlndXJhdGlvbi4gSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgYWRvcHQgY29udGVudCB0byB0aGUgY29uZmlndXJhdGlvbgotICBzdWNoIGFzIHJlbW92aW5nCi0gIHJlZmVyZW5jZXMgb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgdG8gZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgY29uZmlndXJhdGlvbgotICBvciByZW1vdmluZyBhY3Rpdml0aWVzIGZyb20geW91ciBwcm9jZXNzZXMgdGhhdCBvbmx5IGNvbnRhaW4gd29yayBkZWZpbmVkIG91dHNpZGUKLSAgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc2V0LiBIZW5jZSwgcHVibGlzaGluZyB3aWxsIG9ubHkgaW5jbHVkZSB0aGUgY29udGVudCB0aGF0Ci0gIHlvdSByZWFsbHkgbmVlZC4gWW91IGNhbiBhbHdheXMgcHJldmlldyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHVzaW5nIEVQRiBDb21wb3NlcidzCi1icm93c2luZyBwZXJzcGVjdGl2ZS48L3A+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Jvb3QuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZDQ4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Jvb3QuY3NzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290X3N3dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290X3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGVkNjk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvcm9vdF9zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnR1dG9yaWFscy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy53ZWIubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnNhbXBsZXMubGluay1pY29uPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubmV3cy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc3Mi5naWYKLXJvb3QuYWN0aW9uLWxpbmtzLndvcmtiZW5jaC5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYKLQotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc3RlcHMuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MudHV0b3JpYWxzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy53ZWIuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zYW1wbGVzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubmV3cy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NzIuZ2lmCi1yb290LmFjdGlvbi1saW5rcy53b3JrYmVuY2guaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZgotCi0KLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm92ZXJ2aWV3LnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc3RlcHMuc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy50dXRvcmlhbHMuc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mud2ViLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zYW1wbGVzLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5uZXdzLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZgotcm9vdC5hY3Rpb24tbGlua3Mud29ya2JlbmNoLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZgotCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5vdmVydmlldy5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy50dXRvcmlhbHMuc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLndlYi5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnNhbXBsZXMuc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5uZXdzLnNtYWxsLWhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OC5naWYKLXJvb3QuYWN0aW9uLWxpbmtzLndvcmtiZW5jaC5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmCi0KLXJvb3QubGF5b3V0Lm5jb2x1bW5zID0gMQotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubGF5b3V0LmhzcGFjaW5nID0gNDAKLXJvb3QubGF5b3V0LnZzcGFjaW5nID0gMzUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2FtcGxlcy9zYW1wbGVzLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2FtcGxlcy9zYW1wbGVzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExMjY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc2FtcGxlcy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NhbXBsZXNfd3RyLmpwZyk7Ci19Ci0KLS5wYWdlIHsgbWluLWhlaWdodCA6IDcwMHB4OyB9Ci0KLS8qIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAqLwotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzIGltZywgI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4c2VsLmdpZik7IH0KLQotLyogTGF5IG91dCB0aGUgcmVhbCBjb250ZW50IG9mIHRoZSBzYW1wbGVzIHBhZ2U6ICovCi0KLS5zYW1wbGVzLWdyb3VwIHsKLQl3aWR0aCA6IDc1MHB4OwotCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwkKLQltYXJnaW4gOiAwcHggYXV0bzsKLQltYXJnaW4tYm90dG9tIDogMTBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0uc2FtcGxlcy1ncm91cCBINCB7IG1hcmdpbi10b3AgOiAxMHB4OyB9Ci0KLS5zYW1wbGUtbGluayB7IAotCXdpZHRoIDogMzYwcHg7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCW1hcmdpbi1sZWZ0IDogNXB4OwotCW1hcmdpbi1yaWdodCA6IDVweDsKLQltYXJnaW4tdG9wIDogMTBweDsKLQltYXJnaW4tYm90dG9tIDogLTMwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0KLS8qIHNwZWNpYWxpemUgdGhlIHN3dCBzYW1wbGVzIGdyb3VwIHRvIGJlIHNwcmVhZCBvdmVyIG9ubHkgMSBjb2x1bW4gKi8KLSNzd3QgLnNhbXBsZS1saW5rIHsgCi0Jd2lkdGggOiA3MjBweDsKLX0KLQotLnNhbXBsZXMtZ3JvdXAgPiAuc2FtcGxlLWxpbmsgewotCWZsb2F0IDogbGVmdDsKLQloZWlnaHQgOiAxNTBweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotCi0uc2FtcGxlLWxpbmsgLmxpbmstbGFiZWwgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTUwcHg7Ci0JbGVmdCA6IDYwcHg7Ci19Ci0KLSNzd3QgLnNhbXBsZS1saW5rIC5saW5rLWxhYmVsIHsKLQl3aWR0aCA6IDYwMHB4OwkKLX0gCi0KLS5zYW1wbGUtbGluayBwIC50ZXh0IHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC00NXB4OwotCWxlZnQgOiA1M3B4OwotfQotCi0jc3d0IC5zYW1wbGUtbGluayAudGV4dCB7Ci0Jd2lkdGggOiA2MjBweDsJCi19IAotCi0uc2FtcGxlLWxpbmsgaW1nIHsKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotLnNhbXBsZS1saW5rOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogMHB4OyB9Ci0KLQotI3N3dCAuc2FtcGxlLWxpbmsgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZF9vYmouZ2lmKTsKLX0KLQotI3N3dCAuc2FtcGxlLWxpbms6aG92ZXIgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZGhvdl9vYmouZ2lmKTsKLX0KLQotI3dvcmtiZW5jaCAuc2FtcGxlLWxpbmsgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZik7Ci19Ci0KLSN3b3JrYmVuY2ggLnNhbXBsZS1saW5rOmhvdmVyIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwaG92X29iai5naWYpOwotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDAwMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zYW1wbGVzL3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXNhbXBsZXMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZgotc2FtcGxlcy5wYWdlLWNvbnRlbnQuc3d0LnN3dC1leGFtcGxlcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkX29iai5naWYKLQotc2FtcGxlcy5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAKLXNhbXBsZXMucGFnZS1jb250ZW50LnN3dC5sYXlvdXQubmNvbHVtbnMgPSAyCi1zYW1wbGVzLnBhZ2UtY29udGVudC5zd3QubGF5b3V0LnZzcGFjaW5nID0gMzAKLXNhbXBsZXMucGFnZS1jb250ZW50LnN3dC5sYXlvdXQuaHNwYWNpbmcgPSAzMAotc2FtcGxlcy5wYWdlLWNvbnRlbnQud29ya2JlbmNoLmxheW91dC5uY29sdW1ucyA9IDIKLXNhbXBsZXMucGFnZS1jb250ZW50LndvcmtiZW5jaC5sYXlvdXQudnNwYWNpbmcgPSAzMAotc2FtcGxlcy5wYWdlLWNvbnRlbnQud29ya2JlbmNoLmxheW91dC5oc3BhY2luZyA9IDMwCi0KLWRlc2NyaXB0aW9uLXN0eWxlLWlkID0gZ3JvdXAtZGVzY3JpcHRpb24KLXNhbXBsZXMuc3VidGl0bGUtaWQgPSBzYW1wbGVzL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi1zYW1wbGVzLmRlc2NyaXB0aW9uLWlkID0gc2FtcGxlcy9wYWdlLWNvbnRlbnQvcGFnZS1kZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzYzZhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NoYXJlZC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKiAKLSAqIFNldCB1cCBnZW5lcmFsIGZvbnRzLCBzaXplcyBhbmQgY29sb3JzIAotICovCi1ib2R5IHsgZm9udC1mYW1pbHkgOiBBcmlhbCwgc2Fucy1zZXJpZjsgfQotCi1IMSwgSDIsIEgzLCBINCwgcCwgYSB7IGNvbG9yIDogIzRENEQ0RDsgfQotCi0uaW50cm8taGVhZGVyIEgxIHsKLQlmb250LXNpemUgOiAxNnB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogI0U1RTVFNTsKLX0KLQotaDIgewotCWZvbnQtc2l6ZSA6IDEzcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjN0I4Njk0OwotfQotCi0ucGFnZS10aXRsZSB7Ci0JZm9udC1zaXplIDogMTRwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICM4Qzk2QTI7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotLnBhZ2UtZGVzY3JpcHRpb24geyAKLQlmb250LXNpemUgOiAxMHB0OwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLUg0IC5kaXYtbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi1hIHsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQljb2xvciA6ICM0RDRENEQ7Ci19Ci0KLWEgLmxpbmstbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWZvbnQtc2l6ZSA6IDlwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICNFNUU1RTU7Ci19Ci0KLWEgLnRleHQgewotCWZvbnQtc2l6ZSA6IDhwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLX0KLQotcCAuZ3JvdXAtZGVzY3JpcHRpb24gewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLQotLyogCi0gKiBTZXQgdXAgb3RoZXIgZ2VuZXJhbCBwcm9wZXJ0aWVzIGxpa2UgcGFkZGluZy9tYXJnaW5zCi0gKi8KLWh0bWwsIGJvZHkgeyB3aWR0aCA6IDEwMCU7IGhlaWdodCA6IDEwMCU7IH0KLQotaHRtbCwgYm9keSwgZGl2LCBoMSwgaDQsIHAsIGEgeyBtYXJnaW4gOiAwcHg7IHBhZGRpbmcgOiAwcHg7IH0KLQotLmludHJvLWhlYWRlciBIMSB7IHBhZGRpbmctdG9wIDogMTBweDsgbWFyZ2luLWxlZnQgOiAxMHB4OyB9Ci0KLS8qIEZvciByZWd1bGFyIGRpdiBsYWJlbHMgKi8KLSNwYWdlLWNvbnRlbnQgZGl2IEg0IHsKLQlwYWRkaW5nIDogMTBweDsKLQltYXJnaW4tYm90dG9tIDogNXB4OwotfQotCi0vKiBGb3IgdGhlIG1haW4gcGFnZSBjb250ZW50J3MgZGl2IGxhYmVsICovCi0jcGFnZS1jb250ZW50ICNjb250ZW50LWhlYWRlciBINCB7Ci0JcGFkZGluZy1ib3R0b20gOiAxMHB4OwotCXBhZGRpbmctdG9wIDogMHB4OwotfQotCi0vKiBzcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEncyBtYWluIGNvbnRlbnQtaGVhZGVyIGxhYmVsLgotICAgTW96aWxsYSAxLjQgbmVlZHMgbW9yZSByb29tIGF0IHRoZSB0b3AgKi8KLSNwYWdlLWNvbnRlbnQgPiAjY29udGVudC1oZWFkZXIgSDQgeyBwYWRkaW5nLXRvcCA6IDEwcHg7IH0KLQotLyogTmVlZGVkIGluIElFIHRvIGdldCBzaGlmdCt0YWIgdG8gc2hvdyB0aGUgYWN0aXZlIGltYWdlIHByb3Blcmx5ICovCi1hOmFjdGl2ZSB7Ci0JYm9yZGVyIDogc29saWQgMHB4OwotfQotCi1hIGltZyB7Ci0JYm9yZGVyLXdpZHRoIDogMDsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLX0KLQotLyoKLSAqIHRvIGdldCBzY3JvbGxiYXJzIHdvcmtpbmcgaW4gYm90aCBJRSBhbmQgTW96aWxsYQotICovCi1odG1sLGJvZHkgeyBvdmVyZmxvdzogYXV0bzsgfQotaHRtbD5ib2R5IHsgb3ZlcmZsb3c6IHZpc2libGU7IH0KLQotLyoKLSAqIFNldCB1cCB0aGUgYm9keSwgZGVjb3JhdGl2ZSBiYWNrZ3JvdW5kLCBhbmQgbmF2aWdhdGlvbiBmb3IgdGhlIGNvbnRlbnQgCi0gKiBwYWdlcy4gCi0gKiBOb3RlOiB0aGUgcm9vdCBwYWdlIGhhbmRsZXMgaXRzIG93biBiYWNrZ3JvdW5kIGFuZCBuYXZpZ2F0aW9uOyB0aGVzZQotICogc2V0dGluZ3MgcHJpbWFyaWx5IGFwcGx5IHRvIHRoZSBjb250ZW50IHBhZ2VzCi0gKi8KLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjRkZGRkZGOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiBib3R0b20gcmlnaHQ7Ci0JYmFja2dyb3VuZC1hdHRhY2htZW50IDogZml4ZWQ7Ci19Ci0KLSNiYWNrZ3JvdW5kLWltYWdlIHsKLQl3aWR0aCA6IDEwMCU7Ci0JaGVpZ2h0IDogMTY0cHg7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmpwZyk7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBsZWZ0OwkKLQlwb3NpdGlvbiA6IGFic29sdXRlOwotCXRvcCA6IDBweDsKLQl6LWluZGV4IDogLTEwMDsKLX0KLQotI2N1cnZlLWltYWdlIHsgCi0Jd2lkdGggOiAxMDAlOwotCWhlaWdodCA6IDE2NHB4OwotCXBvc2l0aW9uIDogYWJzb2x1dGU7Ci0JdG9wIDogMHB4OwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5naWYpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgY2VudGVyOwotCW1hcmdpbiA6IDA7Ci0JcGFkZGluZyA6IDA7Ci19Ci0KLS5pbnRyby1oZWFkZXIgewliYWNrZ3JvdW5kLWNvbG9yIDogdHJhbnNwYXJlbnQ7IHotaW5kZXggOiAxMDA7fQotCi1ib2R5LCAucGFnZXsKLQltaW4td2lkdGggOiA3NzBweDsKLQkvKiBzaW5jZSBJRSBkb2Vzbid0IHN1cHBvcnQgbWluLXdpZHRoLCB0cnkgZXhwcmVzc2lvbiAqLwotCXdpZHRoOmV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IDc3MD8gIjc3MHB4IjogImF1dG8iICk7Ci0JbWluLWhlaWdodCA6IDQyNXB4OwotCWhlaWdodCA6IDEwMCU7Ci0JaGVpZ2h0IDogZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCA8IDQyNT8gIjQyNXB4IjogIjEwMCUiICk7Ci19Ci0KLS5wYWdlIHsgCi0JbWluLWhlaWdodCA6IDQ3NXB4OwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5qcGcpOwotCWJhY2tncm91bmQtcmVwZWF0IDogcmVwZWF0LXg7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBsZWZ0OwotfQotCi0jcGFnZS1jb250ZW50IHsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogYm90dG9tIHJpZ2h0OwotCWhlaWdodCA6IDcwJTsKLX0KLQotLyogCi0gKiBMYXkgb3V0IHRoZSBuYXZpZ2F0aW9uIGxpbmtzIAotICogKFJvb3QgcGFnZSBkb2VzIHNvbWV0aGluZyBzaW1pbGFyIGZvciBpdHMgbmF2aWdhdGlvbikKLSAqLwotI25hdmlnYXRpb24tbGlua3MgewotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JbGVmdCA6IDEwcHg7Ci0JdG9wIDogNXB4OwotCWhlaWdodCA6IDYwOwotCXdpZHRoIDogOTglOwotfQotCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgewotCXBhZGRpbmctbGVmdCA6IDVweDsKLQlwYWRkaW5nLXJpZ2h0IDogNXB4OwotCWZsb2F0IDogbGVmdDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTJweDsKLQl3aWR0aCA6IDUycHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLmxpbmstbGFiZWwgeyBkaXNwbGF5IDogYmxvY2s7IG1hcmdpbi10b3AgOiA1cHg7fQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIC50ZXh0IHsgZGlzcGxheSA6IG5vbmU7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYTpob3ZlciwgCi0jbmF2aWdhdGlvbi1saW5rcyBhOmZvY3VzIAotI25hdmlnYXRpb24tbGlua3MgYTphY3RpdmUgeyBib3JkZXItcmlnaHQgOiAwcHg7fQotCi0vKiBwcm9wZXJ0aWVzIGZvciBlYWNoIG9mIHRoZSBuYXZpZ2F0aW9uLWxpbmtzICAqLwotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmZvY3VzIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczphY3RpdmUgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6Zm9jdXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczphY3RpdmUgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmZvY3VzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4c2VsLmdpZik7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYSN3ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3ZWI6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4c2VsLmdpZik7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYSNzdGVwcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNzdGVwczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNzdGVwczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4c2VsLmdpZik7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggeyBwb3NpdGlvbiA6IGFic29sdXRlOyAgcmlnaHQgOiAwcHg7IHRvcCA6IC0zNXB4OyB0ZXh0LWFsaWduIDogcmlnaHQ7fQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggLmxpbmstbGFiZWwgeyB2aXNpYmlsaXR5IDogaGlkZGVuOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDpob3ZlciAubGluay1sYWJlbCB7IHZpc2liaWxpdHkgOiB2aXNpYmxlOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCAudGV4dCB7IGRpc3BsYXkgOiBub25lOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmKTsgd2lkdGggOiA1M3B4OyBoZWlnaHQgOiA1M3B4O30KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmZvY3VzIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmKTsgfQotCi0vKiAKLSAqIExheSBvdXQgdGhlIHBhZ2UgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIAotICovCi1oMSwgcCB7IG1hcmdpbi1sZWZ0IDogMTBweDsgfSAvKiByZXF1aXJlZCBpbiBtb3ppbGxhIHNvIHRoZSBwYWdlIGRlc2NyaXB0aW9uIGlzIHByb3Blcmx5IGluZGVudGVkICovCi0KLS8qIHBvc2l0aW9uIHRoZSBwYWdlIGNvbnRlbnQgc28gdGhhdCB0aGUgcGFnZSB0aXRsZSBvdmVybGF5cyB0aGUgYm90dG9tCi0gKiBvZiB0aGUgYmFja2dyb3VuZCBpbWFnZSwgYnV0IG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBhbHdheXMgb24gdG9wIAotICogKHVzaW5nIHotaW5kZXgpICovCi0jcGFnZS1jb250ZW50IHsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci0JbWFyZ2luLXRvcCA6IDM1cHg7Ci19Ci0KLS5wYWdlID4gI3BhZ2UtY29udGVudCB7IG1hcmdpbi10b3AgOiA1MHB4OyB9Ci0KLSNwYWdlLWNvbnRlbnQgcCB7IAotCXBhZGRpbmctYm90dG9tIDogMTVweDsgCi0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLSNwYWdlLWNvbnRlbnQgI2NvbnRlbnQtaGVhZGVyIEg0LCAucGFnZS1kZXNjcmlwdGlvbiB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0JbWFyZ2luLXJpZ2h0IDogMTBweDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0ucGFnZS1kZXNjcmlwdGlvbiB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0JbWFyZ2luLXJpZ2h0IDogMTBweDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0vKgotICogTmF2aWdhdGlvbiBMaW5rcyAoYmFjaywgZm9yd2FyZCBhbmQgaG9tZSkKLSAqLwotCi0jbmF2LWxpbmtzIHsKLQl3aWR0aCA6IDk4JTsKLQlwb3NpdGlvbiA6IGFic29sdXRlOwotCWxlZnQgOiAwcHg7Ci0JdG9wIDogNjVweDsKLX0KLQotYSNiYWNrIHsgCi0JcG9zaXRpb24gOiBhYnNvbHV0ZTsgCi0JdG9wIDogNjVweDsKLQlyaWdodCA6IDIwcHg7Ci0JdGV4dC1hbGlnbiA6IHJpZ2h0OyAgCi19Ci0KLWEjYmFjayBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvYmFjay5naWYpOyAKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotfQotCi1hI2JhY2s6aG92ZXIgaW1nLAotYSNiYWNrOmZvY3VzIGltZywKLWEjYmFjazphY3RpdmUgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL2JhY2suZ2lmKTsgCi0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci19Ci0KLWEjZm9yd2FyZCB7IAotCXBvc2l0aW9uIDogYWJzb2x1dGU7IAotCXRvcCA6IDY1cHg7Ci0JcmlnaHQgOiAtOHB4OwotCXRleHQtYWxpZ24gOiByaWdodDsgIAotfQotCi1hI2ZvcndhcmQgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL2ZvcndhcmQuZ2lmKTsgCi0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLX0KLQotYSNmb3J3YXJkOmhvdmVyIGltZywKLWEjZm9yd2FyZDpmb2N1cyBpbWcsCi1hI2ZvcndhcmQ6YWN0aXZlIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9mb3J3YXJkLmdpZik7IAotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotfQotCi1hI2hvbWUgeyAKLQlwb3NpdGlvbiA6IGFic29sdXRlOyAKLQl0b3AgOiA2NXB4OwotCXJpZ2h0IDogNjBweDsKLQl0ZXh0LWFsaWduIDogcmlnaHQ7ICAKLX0KLQotYSNob21lIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9ob21lLmdpZik7IAotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLWEjaG9tZTpob3ZlciBpbWcsCi1hI2hvbWU6Zm9jdXMgaW1nLAotYSNob21lOmFjdGl2ZSBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvaG9tZS5naWYpOyAKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLX0KLQotCi0vKiBoaWRlIHRoZSBsaW5rIGFuZCBkZXNjcmlwdGlvbiB1bnRpbCB1c2VycyBob3ZlciBvdmVyIHRoZSBsaW5rICovCi0jbmF2LWxpbmtzIGEgcCAudGV4dCwgI25hdi1saW5rcyBhIC5saW5rLWxhYmVsIHsgZGlzcGxheSA6IG5vbmU7IH0KLQotI25hdi1saW5rcyBhOmhvdmVyIC5saW5rLWxhYmVsLAotI25hdi1saW5rcyBhOmZvY3VzIC5saW5rLWxhYmVsLAotI25hdi1saW5rcyBhOmFjdGl2ZSAubGluay1sYWJlbCB7IGRpc3BsYXkgOiBibG9jazsgd2lkdGggOiAxNmVtOyB9Ci0KLSNuYXYtbGlua3MgYTpob3ZlciBwIC50ZXh0LAotI25hdi1saW5rcyBhOmZvY3VzIHAgLnRleHQsCi0jbmF2LWxpbmtzIGE6YWN0aXZlIHAgLnRleHQgewlkaXNwbGF5IDogYmxvY2s7IHdpZHRoIDogMTZlbTsgfQotCi0jbmF2LWxpbmtzIGE6aG92ZXIsCi0jbmF2LWxpbmtzIGE6Zm9jdXMsCi0jbmF2LWxpbmtzIGE6YWN0aXZlIHsgYm9yZGVyLXJpZ2h0IDogMHB4OyB9Ci0KLS8qCi0gKiBUcmFuc2l0aW9uIHBhZ2UgY3NzIHNldHRpbmdzCi0gKi8KLQotI3QtbGlua3MgewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCXdpZHRoIDogNzYwcHg7Ci0JLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCQotCW1hcmdpbjogMHB4IGF1dG87Ci19Ci0KLSN0LWxpbmtzIGEgeyAKLQl3aWR0aCA6IDM3MHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiA1cHg7Ci0JbWFyZ2luLXRvcCA6IDVweDsKLQltYXJnaW4tYm90dG9tIDogLTIwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0KLSN0LWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9Ci0KLSN0LWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1N3B4OwotCXdpZHRoIDogNTdweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotI3QtbGlua3MgYSAubGluay1sYWJlbCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNTBweDsKLQlsZWZ0IDogNjBweDsKLX0KLQotI3QtbGlua3MgYSBwIC50ZXh0IHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC00NXB4OwotCWxlZnQgOiA1M3B4OwotfQotCi0vKiAKLSAqIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZAotICogaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgCi0gKi8KLQotI3QtbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0KLSN0LWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSN0LWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jdC1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9Ci0KLQotLyoqKiBCYWNrdXAgTGluayBJbWFnZSAqKiovCi0KLWEjdC1saW5rcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmKTsgfQotYSN0LWxpbmtzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYpOyB9Ci0KLWEjZm9sZGVyX3N0ZXBzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHMuZ2lmKTsgfQotYSNmb2xkZXJfc3RlcHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX25ld3dlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWIuZ2lmKTsgfQotYSNmb2xkZXJfbmV3d2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYmhvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX2ltcG9ydHdlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWIuZ2lmKTsgfQotYSNmb2xkZXJfaW1wb3J0d2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYmhvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX2hlbHAgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscC5naWYpOyB9Ci1hI2ZvbGRlcl9oZWxwOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHBob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9vdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlldy5naWYpOyB9Ci1hI2ZvbGRlcl9vdmVydmlldzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlld2hvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX2FkdmFwcHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwcy5naWYpOyB9Ci1hI2ZvbGRlcl9hZHZhcHBzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHNob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9kZXZ3ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViLmdpZik7IH0KLWEjZm9sZGVyX2RldndlYjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWJob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9zYW1wbGVzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXMuZ2lmKTsgfQotYSNmb2xkZXJfc2FtcGxlczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzaG92LmdpZik7IH0KLQotYSNmb2xkZXJfdHV0b3JpYWxzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFscy5naWYpOyB9Ci1hI2ZvbGRlcl90dXRvcmlhbHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzaG92LmdpZik7IH0KLQotYSNmb2xkZXJfd2ViIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYi5naWYpOyB9Ci1hI2ZvbGRlcl93ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViaG92LmdpZik7IH0KLQotYSNmb2xkZXJfcmljaHJlcG9ydHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHMuZ2lmKTsgfQotYSNmb2xkZXJfcmljaHJlcG9ydHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHNob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl93aGF0c25ldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ldy5naWYpOyB9Ci1hI2ZvbGRlcl93aGF0c25ldzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ld2hvdi5naWYpOyB9Ci0KLWEjZ2FsbGVyeV9zYW1wbGVzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzLmdpZik7IH0KLWEjZ2FsbGVyeV9zYW1wbGVzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzaG92LmdpZik7IH0KLQotYSNnYWxsZXJ5X3R1dG9yaWFscyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzLmdpZik7IH0KLWEjZ2FsbGVyeV90dXRvcmlhbHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFsc2hvdi5naWYpOyB9Ci0KLWEjcGFnZV9zdGVwcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI3BhZ2Vfc3RlcHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmKTsgfQotCi1hI3BhZ2VfaGVscCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscC5naWYpOyB9Ci1hI3BhZ2VfaGVscDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscGhvdi5naWYpOyB9Ci0KLWEjcGFnZV9vdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXcuZ2lmKTsgfQotYSNwYWdlX292ZXJ2aWV3OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlld2hvdi5naWYpOyB9Ci0KLWEjcGFnZV93ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYi5naWYpOyB9Ci1hI3BhZ2Vfd2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWJob3YuZ2lmKTsgfQotCi1hI3BhZ2Vfd2hhdHNuZXcgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3LmdpZik7IH0KLWEjcGFnZV93aGF0c25ldzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXdob3YuZ2lmKTsgfQotCi1hI2VwZl9yZXNvdXJjZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZS5naWYpOyB9Ci1hI2VwZl9yZXNvdXJjZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZWhvdi5naWYpOyB9Ci0KLWEjZXBmLW92LXRvdXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91ci5naWYpOyB9Ci1hI2VwZi1vdi10b3VyOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXJob3YuZ2lmKTsgfQotCi1hI2VwZi1vdi1ydXBvdiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdi5naWYpOyB9Ci1hI2VwZi1vdi1ydXBvdjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdmhvdi5naWYpOyB9Ci0KLWEjZXBmLW92LW1ldGhvZCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2QuZ2lmKTsgfQotYSNlcGYtb3YtbWV0aG9kOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZGhvdi5naWYpOyB9Ci0KLWEjZXBmLW92LXByb2Nlc3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzcy5naWYpOyB9Ci1hI2VwZi1vdi1wcm9jZXNzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3Nob3YuZ2lmKTsgfQotCi1hI2VwZi1vdi1jb25maWdwdWJsaXNoIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2guZ2lmKTsgfQotYSNlcGYtb3YtY29uZmlncHVibGlzaDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoaG92LmdpZik7IH0KLQotYSNlcGYtc3RlcHMtb25lIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZik7IH0KLWEjZXBmLXN0ZXBzLW9uZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXN0ZXBzLXR3byBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI2VwZi1zdGVwcy10d286aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmKTsgfQotCi1hI2VwZi1zdGVwcy10aHJlZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI2VwZi1zdGVwcy10aHJlZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXN0ZXBzLWZvdXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmKTsgfQotYSNlcGYtc3RlcHMtZm91cjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXR1dC1nYWxsZXJ5IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHMuZ2lmKTsgfQotYSNlcGYtdHV0LWdhbGxlcnk6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFsc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXR1dC1lbGVtZW50IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udF9vYmouZ2lmKTsgfQotYSNlcGYtdHV0LWVsZW1lbnQ6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250aG92X29iai5naWYpOyB9Ci0KLWEjZXBmLXR1dC1uYXZpZ2F0ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlfb2JqLmdpZik7IH0KLWEjZXBmLXR1dC1uYXZpZ2F0ZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlob3Zfb2JqLmdpZik7IH0KLQotYSNlcGYtdHV0LWNvbnRlbnQgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRfb2JqLmdpZik7IH0KLWEjZXBmLXR1dC1jb250ZW50OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250aG92X29iai5naWYpOyB9Ci0KLWEjZXBmLXR1dC1wcm9jZXNzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY19vYmouZ2lmKTsgfQotYSNlcGYtdHV0LXByb2Nlc3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jaG92X29iai5naWYpOyB9Ci0KLWEjZXBmLXR1dC1wdWJleHAgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmKTsgfQotYSNlcGYtdHV0LXB1YmV4cDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwaG92X29iai5naWYpOyB9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NoYXJlZF9lY2xpcHNlLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkX2VjbGlwc2UuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ0NGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkX2VjbGlwc2UuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyogCi0gKiBTZXQgdXAgZ2VuZXJhbCBmb250cywgc2l6ZXMgYW5kIGNvbG9ycyAKLSAqLwotYm9keSB7IGZvbnQtZmFtaWx5IDogQXJpYWwsIHNhbnMtc2VyaWY7IH0KLQotSDEsIEgyLCBIMywgSDQsIHAsIGEgeyBjb2xvciA6ICM0RDRENEQ7IH0KLQotLmludHJvLWhlYWRlciBIMSB7Ci0JZm9udC1zaXplIDogMTZwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICNFNUU1RTU7Ci19Ci0KLWgyIHsKLQlmb250LXNpemUgOiAxM3B0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogIzdCODY5NDsKLX0KLS8qIEZvciByZWd1bGFyIGRpdiBsYWJlbHMgKi8KLUg0IC5kaXYtbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKiBGb3IgdGhlIG1haW4gcGFnZSBjb250ZW50J3MgdGl0bGUgKi8KLSNjb250ZW50LWhlYWRlciBINCAuZGl2LWxhYmVsIHsKLQlmb250LXNpemUgOiAxNHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogIzhDOTZBMjsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0ucGFnZS1kZXNjcmlwdGlvbiB7IAotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotYSB7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JY29sb3IgOiAjNEQ0RDREOwotfQotCi1hIC5saW5rLWxhYmVsIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlmb250LXNpemUgOiA5cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjRTVFNUU1OwotfQotCi1hIC50ZXh0IHsKLQlmb250LXNpemUgOiA4cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLXAgLmdyb3VwLWRlc2NyaXB0aW9uIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotfQotCi0KLS8qIAotICogU2V0IHVwIG90aGVyIGdlbmVyYWwgcHJvcGVydGllcyBsaWtlIHBhZGRpbmcvbWFyZ2lucwotICovCi1odG1sLCBib2R5IHsgd2lkdGggOiAxMDAlOyBoZWlnaHQgOiAxMDAlOyB9Ci0KLWh0bWwsIGJvZHksIGRpdiwgaDEsIGg0LCBwLCBhIHsgbWFyZ2luIDogMHB4OyBwYWRkaW5nIDogMHB4OyB9Ci0KLS5pbnRyby1oZWFkZXIgSDEgeyBwYWRkaW5nLXRvcCA6IDEwcHg7IG1hcmdpbi1sZWZ0IDogMTBweDsgfQotCi0vKiBGb3IgcmVndWxhciBkaXYgbGFiZWxzICovCi0jcGFnZS1jb250ZW50IGRpdiBINCB7Ci0JcGFkZGluZyA6IDEwcHg7Ci0JcGFkZGluZy1ib3R0b20gOiAwcHg7Ci19Ci0KLS8qIEZvciB0aGUgbWFpbiBwYWdlIGNvbnRlbnQncyBkaXYgbGFiZWwgKi8KLSNwYWdlLWNvbnRlbnQgI2NvbnRlbnQtaGVhZGVyIEg0IHsKLQlwYWRkaW5nLWJvdHRvbSA6IDEwcHg7Ci0JcGFkZGluZy10b3AgOiAwcHg7Ci19Ci0KLS8qIHNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSdzIG1haW4gY29udGVudC1oZWFkZXIgbGFiZWwuCi0gICBNb3ppbGxhIDEuNCBuZWVkcyBtb3JlIHJvb20gYXQgdGhlIHRvcCAqLwotI3BhZ2UtY29udGVudCA+ICNjb250ZW50LWhlYWRlciBINCB7IHBhZGRpbmctdG9wIDogMTBweDsgfQotCi0vKiBOZWVkZWQgaW4gSUUgdG8gZ2V0IHNoaWZ0K3RhYiB0byBzaG93IHRoZSBhY3RpdmUgaW1hZ2UgcHJvcGVybHkgKi8KLWE6YWN0aXZlIHsKLQlib3JkZXIgOiBzb2xpZCAwcHg7Ci19Ci0KLWEgaW1nIHsKLQlib3JkZXItd2lkdGggOiAwOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotfQotCi0vKgotICogdG8gZ2V0IHNjcm9sbGJhcnMgd29ya2luZyBpbiBib3RoIElFIGFuZCBNb3ppbGxhCi0gKi8KLWh0bWwsYm9keSB7IG92ZXJmbG93OiBhdXRvOyB9Ci1odG1sPmJvZHkgeyBvdmVyZmxvdzogdmlzaWJsZTsgfQotCi0vKgotICogU2V0IHVwIHRoZSBib2R5LCBkZWNvcmF0aXZlIGJhY2tncm91bmQsIGFuZCBuYXZpZ2F0aW9uIGZvciB0aGUgY29udGVudCAKLSAqIHBhZ2VzLiAKLSAqIE5vdGU6IHRoZSByb290IHBhZ2UgaGFuZGxlcyBpdHMgb3duIGJhY2tncm91bmQgYW5kIG5hdmlnYXRpb247IHRoZXNlCi0gKiBzZXR0aW5ncyBwcmltYXJpbHkgYXBwbHkgdG8gdGhlIGNvbnRlbnQgcGFnZXMKLSAqLwotYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNGRkZGRkY7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSByaWdodDsKLX0KLQotI2JhY2tncm91bmQtaW1hZ2UgewotCXdpZHRoIDogMTAwJTsKLQltaW4td2lkdGggOiA3NzBweDsKLQloZWlnaHQgOiAxNjRweDsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogdG9wIGxlZnQ7CQotCXBvc2l0aW9uIDogYWJzb2x1dGU7Ci0JdG9wIDogMHB4OwotCXotaW5kZXggOiAtMTAwOwotfQotCi0jY3VydmUtaW1hZ2UgeyAKLQl3aWR0aCA6IDEwMCU7Ci0JaGVpZ2h0IDogMTY0cHg7Ci0JcG9zaXRpb24gOiBhYnNvbHV0ZTsKLQl0b3AgOiAwcHg7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmdpZik7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBjZW50ZXI7Ci0JbWFyZ2luIDogMDsKLQlwYWRkaW5nIDogMDsKLX0KLQotLmludHJvLWhlYWRlciB7CWJhY2tncm91bmQtY29sb3IgOiB0cmFuc3BhcmVudDsgei1pbmRleCA6IDEwMDt9Ci0KLWJvZHksIC5wYWdlewotCW1pbi13aWR0aCA6IDc3MHB4OwotCS8qIHNpbmNlIElFIGRvZXNuJ3Qgc3VwcG9ydCBtaW4td2lkdGgsIHRyeSBleHByZXNzaW9uICovCi0Jd2lkdGg6ZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgNzcwPyAiNzcwcHgiOiAiYXV0byIgKTsKLQltaW4taGVpZ2h0IDogNDI1cHg7Ci0JaGVpZ2h0IDogMTAwJTsKLQloZWlnaHQgOiBleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IDwgNDI1PyAiNDI1cHgiOiAiMTAwJSIgKTsKLX0KLQotLnBhZ2UgeyAKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL3dvcmRtYXJrLmdpZik7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSBsZWZ0OwotCW1pbi1oZWlnaHQgOiA0NzVweDsKLX0KLQotI3BhZ2UtY29udGVudCB7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSByaWdodDsKLQloZWlnaHQgOiA3MCU7Ci19Ci0KLS8qIAotICogTGF5IG91dCB0aGUgbmF2aWdhdGlvbiBsaW5rcyAKLSAqIChSb290IHBhZ2UgZG9lcyBzb21ldGhpbmcgc2ltaWxhciBmb3IgaXRzIG5hdmlnYXRpb24pCi0gKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIHsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCWxlZnQgOiAxMHB4OwotCXRvcCA6IDVweDsKLQloZWlnaHQgOiA2MDsKLQl3aWR0aCA6IDk4JTsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSB7Ci0JcGFkZGluZy1sZWZ0IDogNXB4OwotCXBhZGRpbmctcmlnaHQgOiA1cHg7Ci0JZmxvYXQgOiBsZWZ0OwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1MnB4OwotCXdpZHRoIDogNTJweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSAubGluay1sYWJlbCB7IGRpc3BsYXkgOiBibG9jazsgbWFyZ2luLXRvcCA6IDVweDt9Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLnRleHQgeyBkaXNwbGF5IDogbm9uZTsgfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhOmhvdmVyLCAKLSNuYXZpZ2F0aW9uLWxpbmtzIGE6Zm9jdXMgCi0jbmF2aWdhdGlvbi1saW5rcyBhOmFjdGl2ZSB7IGJvcmRlci1yaWdodCA6IDBweDt9Ci0KLS8qIHByb3BlcnRpZXMgZm9yIGVhY2ggb2YgdGhlIG5hdmlnYXRpb24tbGlua3MgICovCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6Zm9jdXMgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFscyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmFjdGl2ZSBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczpmb2N1cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmKTsgfSovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmFjdGl2ZSBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6Zm9jdXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6Zm9jdXMgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggeyBwb3NpdGlvbiA6IGFic29sdXRlOyAgcmlnaHQgOiAwcHg7IHRvcCA6IC0zNXB4OyB0ZXh0LWFsaWduIDogcmlnaHQ7fQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggLnRleHQgeyBkaXNwbGF5IDogbm9uZTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZik7IHdpZHRoIDogNTNweDsgaGVpZ2h0IDogNTNweDt9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDpmb2N1cyBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZik7IH0KLQotLyogCi0gKiBMYXkgb3V0IHRoZSBwYWdlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiAKLSAqLwotaDEsIHAgeyBtYXJnaW4tbGVmdCA6IDEwcHg7IH0gLyogcmVxdWlyZWQgaW4gbW96aWxsYSBzbyB0aGUgcGFnZSBkZXNjcmlwdGlvbiBpcyBwcm9wZXJseSBpbmRlbnRlZCAqLwotCi0vKiBwb3NpdGlvbiB0aGUgcGFnZSBjb250ZW50IHNvIHRoYXQgdGhlIHBhZ2UgdGl0bGUgb3ZlcmxheXMgdGhlIGJvdHRvbQotICogb2YgdGhlIGJhY2tncm91bmQgaW1hZ2UsIGJ1dCBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgYWx3YXlzIG9uIHRvcCAKLSAqICh1c2luZyB6LWluZGV4KSAqLwotI3BhZ2UtY29udGVudCB7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotCW1hcmdpbi10b3AgOiAzNXB4OwotfQotCi0ucGFnZSA+ICNwYWdlLWNvbnRlbnQgeyBtYXJnaW4tdG9wIDogNTBweDsgfQotCi0jcGFnZS1jb250ZW50IHAgeyAKLQlwYWRkaW5nLWJvdHRvbSA6IDE1cHg7IAotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0jcGFnZS1jb250ZW50ICNjb250ZW50LWhlYWRlciBINCwgLnBhZ2UtZGVzY3JpcHRpb24gewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCW1hcmdpbi1yaWdodCA6IDEwcHg7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3Jvb3QuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3Jvb3QuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmQ1MjE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc3RhbmRieV9yb290LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qIAotICogU2V0IHVwIGdlbmVyYWwgZm9udCBjb2xvdXJzLCBzaXplcywgZXRjLiAgU29tZSBvZiB0aGVzZSB3aWxsIG92ZXJyaWRlCi0gKiBzZXR0aW5ncyBmcm9tIHRoZSBzaGFyZWQgQ1NTIAotICovCi0uaW50cm8taGVhZGVyIEgxIHsKLQlmb250LXNpemUgOiAxNXB0OwotfQotCi0jcGFnZS1saW5rcyBhIC5saW5rLWxhYmVsLCAjYWN0aW9uLWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JY29sb3IgOiAjRTVFNUU1OwotfQotCi0jcGFnZS1saW5rcyBhIHAgLnRleHQsICNhY3Rpb24tbGlua3MgYSBwIC50ZXh0IHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogNTAwOwotCWNvbG9yIDogI0U1RTVFNTsKLX0KLQotLyoKLSAqIFNldCB1cCB0aGUgY29udGVudCBmb3IgdGhlIHN0YW5kYnkgcGFnZS4KLSAqLwotYm9keSB7Ci0JbWluLXdpZHRoIDogMjMwcHg7Ci0JLyogc2luY2UgSUUgZG9lc24ndCBzdXBwb3J0IG1pbi13aWR0aCwgdXNlIGV4cHJlc3Npb24gKi8KLQl3aWR0aDpleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCAyMzA/ICIyMzBweCI6ICJhdXRvIiApOwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZC5qcGcpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgbGVmdDsKLQliYWNrZ3JvdW5kLWNvbG9yIDogIzcxNjlEMTsKLX0KLQotLnBhZ2UgeyAKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL3Jvb3RwYWdlL2JyYW5kbWFyay5naWYpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiBib3R0b20gbGVmdDsKLQltaW4td2lkdGggOiAyMzBweDsKLQkvKiBzaW5jZSBJRSBkb2Vzbid0IHN1cHBvcnQgbWluLXdpZHRoLCB1c2UgZXhwcmVzc2lvbiAqLwotCXdpZHRoOmV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IDIzMD8gIjIzMHB4IjogImF1dG8iICk7Ci0gCW1pbi1oZWlnaHQgOiA2MTBweDsKLQloZWlnaHQgOiAxMDAlOwotCWhlaWdodCA6IGV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgPCA0NTA/ICI0NTBweCI6ICIxMDAlIiApOwotfQotCi0vKiAKLSAqIFNldCB1cCB0aGUgbmF2aWdhdGlvbiBiYXIuICBJdCBzaG91bGQgYmUgY2VudGVyZWQgaW4gdGhlIG1pZGRsZQotICogb2YgdGhlIHBhZ2UKLSAqLwotCi0jbGlua3MtYmFja2dyb3VuZCB7IAotCXdpZHRoIDogMTAwJTsgCi0gCW1hcmdpbi10b3AgOiAxMCU7IAotCW1hcmdpbi1ib3R0b20gOiBhdXRvOwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLSNwYWdlLWxpbmtzIGEgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDIyMHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IGF1dG87Ci0JbWFyZ2luLXJpZ2h0IDogYXV0bzsKLQltYXJnaW4tdG9wIDogMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotI3BhZ2UtbGlua3MgYSBzcGFuLCAjcGFnZS1saW5rcyBhIHAgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDE2MHB4OwotCW1hcmdpbiA6IDBweDsKLQlwYWRkaW5nIDogMHB4OwotfQotCi0jcGFnZS1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCWxlZnQgOiA2MHB4OwotCXRvcCA6IC01MHB4OwotfQotCi0jcGFnZS1saW5rcyBhIHAgLnRleHQgewotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JbGVmdCA6IDYwcHg7Ci0JdG9wIDogLTUwcHg7Ci0KLX0KLQotI3BhZ2UtbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDUycHg7Ci0Jd2lkdGggOiA1MnB4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0jcGFnZS1saW5rcyBhOmhvdmVyLAotI3BhZ2UtbGlua3MgYTpmb2N1cywKLSNwYWdlLWxpbmtzIGE6YWN0aXZlICB7IGJvcmRlciA6IDBweDsgfQotCi0jcGFnZS1saW5rcyBhOmhvdmVyIHAsCi0jcGFnZS1saW5rcyBhOmZvY3VzIHAsCi0jcGFnZS1saW5rcyBhOmFjdGl2ZSBwICB7IG1hcmdpbiA6IDBweDsgcGFkZGluZyA6IDBweDsgfQotCi0vKiBwcm9wZXJ0aWVzIGZvciBlYWNoIG9mIHRoZSBwYWdlLWxpbmtzICAqLwotYSNvdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmKTsgfQotYSNvdmVydmlldzpob3ZlciBpbWcsCi1hI292ZXJ2aWV3OmZvY3VzIGltZywKLWEjb3ZlcnZpZXc6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci1hI3N0ZXBzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYpOyB9YSNzdGVwczpob3ZlciBpbWcsYSNzdGVwczpmb2N1cyBpbWcsYSNzdGVwczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4LmdpZik7IH0KLWEjdHV0b3JpYWxzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmKTsgfQotYSN0dXRvcmlhbHM6aG92ZXIgaW1nLAotYSN0dXRvcmlhbHM6Zm9jdXMgaW1nLAotYSN0dXRvcmlhbHM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmKTsgfQotYSN3ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmKTsgfWEjd2ViOmhvdmVyIGltZyxhI3dlYjpmb2N1cyBpbWcsYSN3ZWI6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4LmdpZik7IH0KLWEjc2FtcGxlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYpOyB9Ci1hI3NhbXBsZXM6aG92ZXIgaW1nLAotYSNzYW1wbGVzOmZvY3VzIGltZywKLWEjc2FtcGxlczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotCi1hI25ld3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZik7IH0KLWEjbmV3czpob3ZlciBpbWcsCi1hI25ld3M6Zm9jdXMgaW1nLAotYSNuZXdzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmKTsgfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3N0YW5kYnlfc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3N0YW5kYnlfc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzIzMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NzIuZ2lmCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5saW5rLWljb249IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczcyLmdpZgotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MudHV0b3JpYWxzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLndlYi5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzcyLmdpZgotCi0KLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm92ZXJ2aWV3LmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnN0ZXBzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnR1dG9yaWFscy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczcyLmdpZgotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mud2ViLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzcyLmdpZgotCi0KLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLmxheW91dC52c3BhY2luZyA9IDMwCi1zdGFuZGJ5LmxheW91dC52c3BhY2luZyA9IDM1Ci1zdGFuZGJ5LnNob3ctbGluay1kZXNjcmlwdGlvbiA9IGZhbHNlCi1zdGFuZGJ5LnNob3ctaG9tZS1wYWdlLW5hdmlnYXRpb24gPSBmYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1wbGFjZWhvbGRlci5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLXBsYWNlaG9sZGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDRiZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLXBsYWNlaG9sZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGhlYWQ+Ci08dGl0bGU+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBUb3VyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgVG91cjwvaDM+Ci08YnIvPgotPGg1PiBGbGFzaCBiYXNlZCBtdWx0aW1lZGlhIGNvbnRlbnQsIHRvIGJlIHByb2R1Y2VkPC9oNT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1zd3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjZmUzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXItc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5wZGUubGluay1pY29uID0gY3NzL25ld19ncmFwaGljcy9vYmpfNDgvcGx1Z2luX29iai5naWYKLQotdHV0b3JpYWxzLnBhZ2UtY29udGVudC5wZGUubGF5b3V0Lm5jb2x1bW5zID0gMgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC5wZGUucmNwLmxpbmstaWNvbiA9IGNzcy9uZXdfZ3JhcGhpY3Mvb2JqXzQ4L3JjcGFwcF9vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnBkZS5wZGUtaGVsbG8td29ybGQubGluay1pY29uID0gY3NzL25ld19ncmFwaGljcy9vYmpfNDgvcGx1Z2luX29iai5naWYKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQucGRlLmZlYXR1cmVzLmxpbmstaWNvbiA9IGNzcy9uZXdfZ3JhcGhpY3Mvb2JqXzQ4L2ZlYXR1cmVzX29iai5naWYKLQotbmV3cy5sYXlvdXQubmNvbHVtbnMgPSAyCi1vdmVydmlldy5sYXlvdXQubmNvbHVtbnMgPSAyCi1vdmVydmlldy5sYXlvdXQubGluay12c3BhY2luZyA9IDQwCi1maXJzdHN0ZXBzLmxheW91dC5uY29sdW1ucyA9IDEKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQubGF5b3V0Lm5jb2x1bW5zID0gMgotc2FtcGxlcy5wYWdlLWNvbnRlbnQubGF5b3V0Lm5jb2x1bW5zID0gMgotd2VicmVzLnBhZ2UtY29udGVudC5sYXlvdXQubmNvbHVtbnMgPSAxCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXIuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWVhNjVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2Uvb3ZlcnZpZXdfd3RyLmpwZyk7Ci19Ci0KLS5wYWdlIHsgbWluLWhlaWdodCA6IDcwMHB4OyB9Ci0KLS8qIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAqLwotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldyBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZik7IH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2FkYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxkaXYgaWQ9IndlbGNvbWUtYmFubmVyIj4KLSAJPE9CSkVDVCBjbGFzc2lkPSJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiIGNvZGViYXNlPSJodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2ZsYXNoL3N3Zmxhc2guY2FiI3ZlcnNpb249NiwwLDAsMCIgV0lEVEg9Ijc4MCIgSEVJR0hUPSI0MjUiIGlkPSJ0b3VyIiBBTElHTj0iIj4KLQk8UEFSQU0gTkFNRT1tb3ZpZSBWQUxVRT0iY3NzL3RvdXIvdG91ci5zd2YiPgotIAk8UEFSQU0gTkFNRT1xdWFsaXR5IFZBTFVFPWhpZ2g+Ci0gCTxQQVJBTSBOQU1FPWJnY29sb3IgVkFMVUU9I0ZGRkZGRj4KLSAJPFBBUkFNIE5BTUU9Rmxhc2hWYXJzIFZBTFVFPSJ0b3VycGF0aD1jc3MvdG91ciI+Ci0gCTxFTUJFRCBzcmM9ImNzcy90b3VyL3RvdXIuc3dmIiBmbGFzaHZhcnM9InRvdXJwYXRoPWNzcy90b3VyIiBxdWFsaXR5PWhpZ2ggYmdjb2xvcj0jRkZGRkZGICBXSURUSD0iNzgwIiBIRUlHSFQ9IjQyNSIgTkFNRT0idG91ciIgQUxJR049IiIgVFlQRT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIFBMVUdJTlNQQUdFPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIj48L0VNQkVEPgotCTwvT0JKRUNUPgotPC9kaXY+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3R1dG9yaWFscy9zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmI3ODc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdHV0b3JpYWxzLmxheW91dC5uY29sdW1ucyA9IDIKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAKLQotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MubGF5b3V0Lm5jb2x1bW5zID0gMgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzUKLQotdHV0b3JpYWxzLnN1YnRpdGxlLWlkID0gdHV0b3JpYWxzL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi10dXRvcmlhbHMuZGVzY3JpcHRpb24taWQgPSB0dXRvcmlhbHMvcGFnZS1jb250ZW50L3BhZ2UtZGVzY3JpcHRpb24KLQotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MuZXBmLXR1dC1uYXZpZ2F0ZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aV9vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5lcGYtdHV0LXByb2Nlc3MubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nfb2JqLmdpZgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MuZXBmLXR1dC1lbGVtZW50LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250X29iai5naWYKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQudHV0b3JpYWxzLWxpbmtzLmVwZi10dXQtcHViZXhwLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5lcGYtdHV0LWNvbnRlbnQubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udF9vYmouZ2lmCi0jb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmJhc2ljcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZgotI292ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy50ZWFtLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3R1dG9yaWFscy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3R1dG9yaWFscy90dXRvcmlhbHMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE5NGIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3R1dG9yaWFscy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvY29udGVudHBhZ2UvdHV0b3JpYWxzX3d0ci5qcGcpOwotfQotCi0ucGFnZSB7IG1pbi1oZWlnaHQgOiA3MDBweDsgfQotCi0vKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzIGltZywgI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OHNlbC5naWYpOyB9Ci0KLS8qIAotICogU2V0IHVwIHRoZSBjb250ZW50IG9mIHRoZSB0dXRvcmlhbHMgcGFnZSBpbnRvIHR3bwotICogY29sdW1ucyB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgcGFnZQotICovCi0KLQotI3R1dG9yaWFscy1saW5rcyB7CXRleHQtYWxpZ24gOiBsZWZ0Owl3aWR0aCA6IDc2MHB4OwkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8JbWFyZ2luIDogMHB4IGF1dG87fSN0dXRvcmlhbHMtbGlua3MgYSB7IAl3aWR0aCA6IDM3MHB4Owl0ZXh0LWFsaWduIDogbGVmdDsgCW1hcmdpbi1sZWZ0IDogNXB4OwltYXJnaW4tcmlnaHQgOiA1cHg7CW1hcmdpbi10b3AgOiA1cHg7CW1hcmdpbi1ib3R0b20gOiAtMjBweDsJdmVydGljYWwtYWxpZ24gOiB0b3A7fSN0dXRvcmlhbHMtbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0jdHV0b3JpYWxzLWxpbmtzIGEgaW1nIHsJaGVpZ2h0IDogNTdweDsJd2lkdGggOiA1N3B4Owl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTt9CSN0dXRvcmlhbHMtbGlua3MgYSAubGluay1sYWJlbCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTUwcHg7CWxlZnQgOiA2MHB4O30jdHV0b3JpYWxzLWxpbmtzIGEgcCAudGV4dCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTQ1cHg7CWxlZnQgOiA1M3B4O30vKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQgICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLyN0dXRvcmlhbHMtbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0jdHV0b3JpYWxzLWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0jdHV0b3JpYWxzLWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfSN0dXRvcmlhbHMtbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfWEjYmFzaWNzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZik7IH1hI2Jhc2ljczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYpOyB9YSN0ZWFtIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cF9vYmouZ2lmKTsgfWEjdGVhbTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBob3Zfb2JqLmdpZik7IH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdW1hX2h1bXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy91bWFfaHVtcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzBmYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy91bWFfaHVtcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzYTc5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKgotICogd2VicmVzb3VyY2VzLmNzcyBpcyBhIHRlbXBsYXRlIGZvciB0aGUgZ3JvdXAgc3BlY2lmaWMgY3NzIHNldHRpbmdzCi0gKi8KLSAKLS8qCi0gKiBiYWNrZ3JvdW5kIHdhdGVybWFyayAtIGdyb3VwIHNwZWNpZmljCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS93ZWJyc3JjX3d0ci5qcGcpOwotfQotCi0ucGFnZSB7IG1pbi1oZWlnaHQgOiA3MDBweDsgfQotCi0vKgotICogc2hvdyB0aGUgInNlbGVjdGVkIiBpbWFnZSBmb3IgdGhpcyBwYWdlIC0gVGhpcyBpcyBncm91cCBzcGVjaWZpYwotICovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd2ViIGltZywgI25hdmlnYXRpb24tbGlua3MgYSN3ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDhzZWwuZ2lmKTsgfQotCi0vKiAKLSAqIFNldCB1cCB0aGUgT3ZlcnZpZXcgbGlua3MgdG8gYmUgZGlzcGxheWVkIGluIHR3byBjb2x1bW5zCi0gKiB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYWdlLgotICovCi0KLSN3ZWItbGlua3Mgewl0ZXh0LWFsaWduIDogbGVmdDsJd2lkdGggOiA3NjBweDsJLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCW1hcmdpbiA6IDBweCBhdXRvO30KLSN3ZWItbGlua3MgYSB7IAl3aWR0aCA6IDM3MHB4Owl0ZXh0LWFsaWduIDogbGVmdDsgCW1hcmdpbi1sZWZ0IDogNXB4OwltYXJnaW4tcmlnaHQgOiA1cHg7CW1hcmdpbi10b3AgOiA1cHg7CW1hcmdpbi1ib3R0b20gOiAtMjBweDsJdmVydGljYWwtYWxpZ24gOiB0b3A7fQotI3dlYi1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotI3dlYi1saW5rcyBhIGltZyB7CWhlaWdodCA6IDU3cHg7CXdpZHRoIDogNTdweDsJdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7fQkKLSN3ZWItbGlua3MgYSAubGluay1sYWJlbCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTUwcHg7CWxlZnQgOiA2MHB4O30KLSN3ZWItbGlua3MgYSBwIC50ZXh0IHsJZGlzcGxheSA6IGJsb2NrOwl3aWR0aCA6IDMwMHB4Owlwb3NpdGlvbiA6IHJlbGF0aXZlOwl0b3AgOiAtNDVweDsJbGVmdCA6IDUzcHg7fQotCi0vKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQKLSAgIGluIDEgdmVydGljYWwgY29sdW1uIGluc3RlYWQgb2YgMiBjZW50ZXJlZCBjb2x1bW5zICovCi0jd2ViLWxpbmtzID4gYSB7IAl3aWR0aCA6IDcwMHB4OyB9Ci0jd2ViLWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSN3ZWItbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9Ci0KLSN3ZWItbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhYmI5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotd2ViLmxheW91dC5uY29sdW1ucyA9IDIKLXdlYi5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAKLQotd2ViLnBhZ2UtY29udGVudC53ZWItbGlua3MubGF5b3V0Lm5jb2x1bW5zID0gMgotd2ViLnBhZ2UtY29udGVudC53ZWItbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzUKLQotd2ViLnN1YnRpdGxlLWlkID0gd2ViL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi13ZWIuZGVzY3JpcHRpb24taWQgPSB3ZWIvcGFnZS1jb250ZW50L3BhZ2UtZGVzY3JpcHRpb24KLQotd2ViLnBhZ2UtY29udGVudC53ZWItbGlua3MuZXBmX3Jlc291cmNlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2UuZ2lmCi0KLSNuZXdzLm5ldy1hbmQtbm90ZXdvcnRoeS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYKLSNuZXdzLm1pZ3JhdGlvbi5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmCi0jbmV3cy51cGRhdGVzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYKLSNuZXdzLmVjbGlwc2UubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy9zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2hhdHNuZXcvc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmRkYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy9zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCi1uZXdzLnBhZ2UtY29udGVudC5uZXdzLWxpbmtzLmxheW91dC52c3BhY2luZyA9IDMwCi0KLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MubmV3LWFuZC1ub3Rld29ydGh5LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5taWdyYXRpb24ubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZgotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy51cGRhdGVzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYKLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MuZWNsaXBzZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYKLQotbmV3cy5wYWdlLWNvbnRlbnQubm90ZXdvcnRoeS1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCi1uZXdzLnBhZ2UtY29udGVudC5ub3Rld29ydGh5LWxpbmtzLmxheW91dC52c3BhY2luZyA9IDE1IAotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAxNSAKLW5ld3MucGFnZS1jb250ZW50LmxheW91dC52c3BhY2luZyA9IDQwIAotCi1uZXdzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgotCi1uZXdzLnN1YnRpdGxlLWlkID0gbmV3cy9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy93aGF0c25ldy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3doYXRzbmV3L3doYXRzbmV3LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MzYwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3doYXRzbmV3L3doYXRzbmV3LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2hhdHNuZXdfd3RyLmpwZyk7Ci19Ci0KLS5wYWdlIHsgbWluLWhlaWdodCA6IDUwMHB4OyB9Ci0KLS8qIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAqLwotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzIGltZywgI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OHNlbC5naWYpOyB9Ci0KLS8qIAotICogU2V0IHVwIHRoZSBjb250ZW50IG9mIHRoZSBXaGF0cyBOZXcgcGFnZSB0byBiZSBkaXNwbGF5ZWQgaW4gCi0gKiB0d28gY29sdW1ucyB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYWdlLgotICovCi0KLSNub3Rld29ydGh5LWxpbmtzIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQl3aWR0aCA6IDc2MHB4OwotCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwkKLQltYXJnaW46IDBweCBhdXRvOwotfQotCi0jbm90ZXdvcnRoeS1saW5rcyBhIHsgCi0Jd2lkdGggOiAzNzBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JbWFyZ2luLWxlZnQgOiA1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogNXB4OwotCW1hcmdpbi10b3AgOiA1cHg7Ci0JbWFyZ2luLWJvdHRvbSA6IC0yMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotCi0jbm90ZXdvcnRoeS1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotCi0jbm90ZXdvcnRoeS1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTdweDsKLQl3aWR0aCA6IDU3cHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSNub3Rld29ydGh5LWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTUwcHg7Ci0JbGVmdCA6IDYwcHg7Ci19Ci0KLSNub3Rld29ydGh5LWxpbmtzIGEgcCAudGV4dCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNDVweDsKLQlsZWZ0IDogNTNweDsKLX0KLQotLyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLwotI25vdGV3b3J0aHktbGlua3MgPiBhIHsgd2lkdGggOiA3MDBweDsgfQotI25vdGV3b3J0aHktbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfQotI25vdGV3b3J0aHktbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9Ci0KLSNub3Rld29ydGh5LWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH0KLQotI25vdGV3b3J0aHktbGlua3MgYSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmKTsgfQotI25vdGV3b3J0aHktbGlua3MgYTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmKTsgfQotCi0KLSNuZXdzLWxpbmtzIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQl3aWR0aCA6IDc2MHB4OwotCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwkKLQltYXJnaW46IDBweCBhdXRvOwotfQotCi0jbmV3cy1saW5rcyBhIHsgCi0Jd2lkdGggOiAzNzBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JbWFyZ2luLWxlZnQgOiA1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogNXB4OwotCW1hcmdpbi10b3AgOiA1cHg7Ci0JbWFyZ2luLWJvdHRvbSA6IC0yMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotCi0jbmV3cy1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotCi0jbmV3cy1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTdweDsKLQl3aWR0aCA6IDU3cHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSNuZXdzLWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTUwcHg7Ci0JbGVmdCA6IDYwcHg7Ci19Ci0KLSNuZXdzLWxpbmtzIGEgcCAudGV4dCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNDVweDsKLQlsZWZ0IDogNTNweDsKLX0KLQotLyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLwotI25ld3MtbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0KLSNuZXdzLWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSNuZXdzLWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jbmV3cy1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9Ci0KLWEjbmV3LWFuZC1ub3Rld29ydGh5IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYpOyB9Ci1hI25ldy1hbmQtbm90ZXdvcnRoeTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmKTsgfQotCi1hI21pZ3JhdGlvbiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZik7IH0KLWEjbWlncmF0aW9uOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZWhvdl9vYmouZ2lmKTsgfQotCi1hI3VwZGF0ZXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYpOyB9Ci1hI3VwZGF0ZXM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzaG92X29iai5naWYpOyB9Ci0KLWEjZWNsaXBzZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmKTsgfQotYSNlY2xpcHNlOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5aG92X29iai5naWYpOyB9Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2hlbHAvYm9vay54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaGVscC9ib29rLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhYTBhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaGVscC9ib29rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIEhlbHAgUGFnZSIgIHRvcGljPSJodG1sL2Jvb2suaHRtbCI+Ci0JPHRvcGljIGxhYmVsPSJFUEYgT3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iRVBGIFR1dG9yaWFsIiBocmVmPSJodG1sL3R1dG9yaWFsMy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzI5MTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaW50cm9Db250ZW50LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pbnRyb0NvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTYyOTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pbnRyb0NvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aW50cm9Db250ZW50PgotCi0gICAgPHBhZ2UgYWx0LXN0eWxlPSJjc3Mvcm9vdF9zd3QucHJvcGVydGllcyIgc3R5bGU9ImNzcy9yb290LmNzcyIgaWQ9InJvb3QiIHN0eWxlLWlkPSJwYWdlIj4KLSAgICAgICAgPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotICAgICAgICA8Z3JvdXAgaWQ9ImxpbmtzLWJhY2tncm91bmQiPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWxpbmtzIj4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iT3ZlcnZpZXciIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPW92ZXJ2aWV3IiBpZD0ib3ZlcnZpZXciIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+RmluZCBvdXQgd2hhdCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGFsbCBhYm91dDwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IlR1dG9yaWFscyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9dHV0b3JpYWxzIiBpZD0idHV0b3JpYWxzIiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxldCB1cyBndWlkZSB5b3UgdGhyb3VnaCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHR1dG9yaWFsczwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPCEtLSBGaXJzdCBTdGVwcyAtLT4KLQkJCQk8bGluayBsYWJlbD0iRmlyc3QgU3RlcHMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXN0ZXBzIiBpZD0ic3RlcHMiIHN0eWxlLWlkPSJsZWZ0Ij4KLQkJCQkJPHRleHQ+U3RhcnQgd29ya2luZyBvbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbi48L3RleHQ+Ci0JCQkJPC9saW5rPgotICAgICAgICAgICAgICAgIDwhLS0gV2ViIFJlc291cmNlcyAtLT4KLQkJCQk8bGluayBsYWJlbD0iV2ViIFJlc291cmNlcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9d2ViIiBpZD0id2ViIiBzdHlsZS1pZD0icmlnaHQiPgotCQkJCQk8dGV4dD5GaW5kIGluZm9ybWF0aW9uIG9uIHRoZSB3ZWI8L3RleHQ+Ci0JCQkJPC9saW5rPiAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICA8L2dyb3VwPgotICAgICAgICA8Z3JvdXAgaWQ9ImFjdGlvbi1saW5rcyI+Ci0gICAgICAgICAgICA8bGluayB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zd2l0Y2hUb0xhdW5jaEJhciIgbGFiZWw9IldvcmtiZW5jaCIgaWQ9IndvcmtiZW5jaCI+Ci0gICAgICAgICAgICAgICAgPHRleHQ+R28gdG8gdGhlIHdvcmtiZW5jaDwvdGV4dD4KLSAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgPC9ncm91cD4KLSAgICA8L3BhZ2U+Ci0KLSAgICA8cGFnZSBhbHQtc3R5bGU9ImNzcy9zdGFuZGJ5X3N3dC5wcm9wZXJ0aWVzIiBzdHlsZT0iY3NzL3N0YW5kYnlfcm9vdC5jc3MiIGlkPSJzdGFuZGJ5IiBzdHlsZS1pZD0icGFnZSI+Ci0gICAgICAgIDx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLSAgICAgICAgPGdyb3VwIGlkPSJsaW5rcy1iYWNrZ3JvdW5kIj4KLSAgICAgICAgICAgIDxncm91cCBpZD0icGFnZS1saW5rcyI+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9Ik92ZXJ2aWV3IiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1vdmVydmlldyZhbXA7c3RhbmRieT1mYWxzZSIgaWQ9Im92ZXJ2aWV3IiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkZpbmQgb3V0IHdoYXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBhbGwgYWJvdXQ8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJUdXRvcmlhbHMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXR1dG9yaWFscyZhbXA7c3RhbmRieT1mYWxzZSIgaWQ9InR1dG9yaWFscyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZXQgdXMgZ3VpZGUgeW91IHRocm91Z2ggRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciB0dXRvcmlhbHM8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotCQkJCTxsaW5rIGxhYmVsPSJGaXJzdCBTdGVwcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9c3RlcHMmYW1wO3N0YW5kYnk9ZmFsc2UiIGlkPSJzdGVwcyIgc3R5bGUtaWQ9ImxlZnQiPgotCQkJCQk8dGV4dD5TdGFydCB3b3JraW5nIG9uIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluPC90ZXh0PgotCQkJCTwvbGluaz4KLQkJCQk8bGluayBsYWJlbD0iV2ViIFJlc291cmNlcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9d2ViJmFtcDtzdGFuZGJ5PWZhbHNlIiBpZD0id2ViIiBzdHlsZS1pZD0icmlnaHQiPgotCQkJCQk8dGV4dD5GaW5kIGluZm9ybWF0aW9uIG9uIHRoZSB3ZWI8L3RleHQ+Ci0JCQkJPC9saW5rPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgPC9ncm91cD4KLSAgICA8L3BhZ2U+Ci0KLSAgICA8cGFnZSBzdHlsZT0iY3NzL292ZXJ2aWV3L292ZXJ2aWV3LmNzcyIgYWx0LXN0eWxlPSJjc3Mvb3ZlcnZpZXcvc3d0LnByb3BlcnRpZXMiIGlkPSJvdmVydmlldyIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJuYXZpZ2F0aW9uLWxpbmtzIiBmaWx0ZXJlZEZyb209InN3dCI+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtbGlua3MiPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJPdmVydmlldyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9b3ZlcnZpZXciIGlkPSJvdmVydmlldyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5GaW5kIG91dCB3aGF0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYWxsIGFib3V0PC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iVHV0b3JpYWxzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD10dXRvcmlhbHMiIGlkPSJ0dXRvcmlhbHMiIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGV0IHVzIGd1aWRlIHlvdSB0aHJvdWdoIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgZW5kLXRvLWVuZCB0dXRvcmlhbHM8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJGaXJzdCBTdGVwcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9c3RlcHMiIGlkPSJzdGVwcyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5TdGFydCB3b3JraW5nIG9uIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iV2ViIFJlc291cmNlcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9d2ViIiBpZD0id2ViIiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkZpbmQgb3V0IG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHdlYjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJhY3Rpb24tbGlua3MiPgotICAgICAgICAgICAgICAgIDxsaW5rIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3N3aXRjaFRvTGF1bmNoQmFyIiBsYWJlbD0iV29ya2JlbmNoIiBpZD0id29ya2JlbmNoIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+R28gdG8gdGhlIHdvcmtiZW5jaDwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICA8L2dyb3VwPgotICAgICAgICAKLSAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIiBmaWx0ZXJlZEZyb209InN3dCI+T1ZFUlZJRVc8L3RleHQ+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiIGZpbHRlcmVkRnJvbT0iaHRtbCI+T1ZFUlZJRVc8L3RleHQ+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS1kZXNjcmlwdGlvbiIgaWQ9InBhZ2UtZGVzY3JpcHRpb24iPldlbGNvbWUhIFRha2UgYSBmZXcgbWludXRlcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBFUEYgQ29tcG9zZXIuPC90ZXh0PgotICAgICAgICAgICAgPGdyb3VwIGlkPSJvdmVydmlldy1saW5rcyI+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4gICAgICAgCi0JCQkJPGxpbmsgCi0JCQkJCWxhYmVsPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIE92ZXJ2aWV3IiAKLQkJCQkJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3ZlcnZpZXcvYV9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwmYW1wO2VtYmVkVGFyZ2V0PXBhZ2UtY29udGVudCIgICAKLQkJCQkJaWQ9ImVwZi1vdi1ydXBvdiI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlJlYWQgYWJvdXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcidzIHB1cnBvc2UgYW5kIGl0cyBrZXkgY29uY2VwdHMuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9Ik1ldGhvZHM6IFRoZSByZXVzYWJsZSBidWlsZGluZyBibG9ja3MiIAotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdmVydmlldy9hX21ldGhvZF9jb250ZW50X2F1dGhvcmluZ19vdmVydmlldy5odG1sJmFtcDtlbWJlZFRhcmdldD1wYWdlLWNvbnRlbnQiICAgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtb3YtbWV0aG9kIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+UmVhZCBhYm91dCB0aGUgcm9sZSBhbmQgcmVwcmVzZW50YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgaW4gRVBGIENvbXBvc2VyLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPGxpbmsgCi0gICAgICAgICAgICAgICAgCWxhYmVsPSJBdXRob3JpbmcgUHJvY2Vzc2VzIgotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdmVydmlldy9hX3Byb2Nlc3NfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwmYW1wO2VtYmVkVGFyZ2V0PXBhZ2UtY29udGVudCIgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtb3YtcHJvY2VzcyI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlJlYWQgYWJvdXQgdGhlIHJvbGUgYW5kIHJlcHJlc2VudGF0aW9uIG9mIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9IkNvbmZpZ3VyYXRpb24gYW5kIFB1Ymxpc2hpbmciIAotICAgICAgICAgICAgICAJCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL292ZXJ2aWV3L2FfbWV0aG9kX2NvbmZpZ3VyYXRpb25zX292ZXJ2aWV3Lmh0bWwmYW1wO2VtYmVkVGFyZ2V0PXBhZ2UtY29udGVudCIgIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLW92LWNvbmZpZ3B1Ymxpc2giPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5SZWFkIGFib3V0IGNvbmZpZ3VyaW5nIGFuZCBwdWJsaXNoaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGdyb3VwIGlkPSJzdGVwLWxpbmtzIj4KLSAgICAgICAgICAgIAkJPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgICAgICAgIAkJPGFuY2hvciBpZD0iZW5kQW5jaG9yIi8+Ci0gICAgICAgICAgICAJPC9ncm91cD4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgPC9wYWdlPgotICAgIAotICAgIDxwYWdlIHN0eWxlPSJjc3MvdG91ci5jc3MiIGFsdC1zdHlsZT0iY3NzL3RvdXItc3d0LnByb3BlcnRpZXMiIGlkPSJlcGYtdG91ciIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgVE9VUjwvdGV4dD4KLQkJCTxodG1sIGlkPSJlcGYtdG91ciIgc3JjPSJjc3MvdG91ci1wbGFjZWhvbGRlci5odG1sIiB0eXBlPSJpbmxpbmUiPgotCQkJPC9odG1sPgkKLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0JPHBhZ2Ugc3R5bGU9ImNzcy90b3VyLmNzcyIgYWx0LXN0eWxlPSJjc3MvdG91ci1zd3QucHJvcGVydGllcyIgaWQ9ImVwZi1vdmVydmlldyIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgT3ZlcnZpZXc8L3RleHQ+Ci0JCQk8aHRtbCBpZD0iZXBmLW92ZXJ2aWV3IiBzcmM9ImNzcy9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwiIHR5cGU9ImlubGluZSI+Ci0JCQk8L2h0bWw+CQotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLQk8cGFnZSBzdHlsZT0iY3NzL3RvdXIuY3NzIiBhbHQtc3R5bGU9ImNzcy90b3VyLXN3dC5wcm9wZXJ0aWVzIiBpZD0iZXBmLW1ldGhvZHMiIHN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5NZXRob2RzOiBUaGUgcmV1c2FibGUgYnVpbGRpbmcgYmxvY2tzPC90ZXh0PgotCQkJPGh0bWwgaWQ9ImVwZi1tZXRob2RzIiBzcmM9ImNzcy9tZXRob2RfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiIHR5cGU9ImlubGluZSI+Ci0JCQk8L2h0bWw+CQotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLQk8cGFnZSBzdHlsZT0iY3NzL3RvdXIuY3NzIiBhbHQtc3R5bGU9ImNzcy90b3VyLXN3dC5wcm9wZXJ0aWVzIiBpZD0iZXBmLXByb2Nlc3NlcyIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkF1dGhvcmluZyBQcm9jZXNzZXM8L3RleHQ+Ci0JCQk8aHRtbCBpZD0iZXBmLXByb2Nlc3NlcyIgc3JjPSJjc3MvcHJvY2Vzc19hdXRob3Jpbmdfb3Zlcml2ZXcuaHRtbCIgdHlwZT0iaW5saW5lIj4KLQkJCTwvaHRtbD4JCi0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotCTxwYWdlIHN0eWxlPSJjc3MvdG91ci5jc3MiIGFsdC1zdHlsZT0iY3NzL3RvdXItc3d0LnByb3BlcnRpZXMiIGlkPSJlcGYtY29uZmlncHVibGlzaCIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkNvbmZpZ3VyYXRpb24gYW5kIFB1Ymxpc2hpbmc8L3RleHQ+Ci0JCQk8aHRtbCBpZD0iZXBmLXByb2Nlc3NlcyIgc3JjPSJjc3MvcHVibGlzaGluZy5odG1sIiB0eXBlPSJpbmxpbmUiPgotCQkJPC9odG1sPgkKLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0JPCEtLSBGSVJTVCBTVEVQUyBTQ0FGRk9MRElORyAtLT4KLQk8cGFnZSAKLQkJc3R5bGU9ImNzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMuY3NzIiAKLQkJYWx0LXN0eWxlPSJjc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLnByb3BlcnRpZXMiIAotCQlpZD0ic3RlcHMiIAotCQlzdHlsZS1pZD0icGFnZSI+Ci0JCTx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLQkJPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8Z3JvdXAgaWQ9ImN1cnZlLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0JCTxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+RklSU1QgU1RFUFM8L3RleHQ+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS1kZXNjcmlwdGlvbiIgaWQ9InBhZ2UtZGVzY3JpcHRpb24iPlN0YXJ0IHdvcmtpbmcgb24geW91ciBvd24gbWV0aG9kIHBsdWctaW4uPC90ZXh0PgotCQkJPGdyb3VwIGlkPSJzdGVwcy1saW5rcyI+ICAgICAgICAgICAgICAgCi0JCQkgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLQkJCSAgICA8bGluayBsYWJlbD0iQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9vcGVuQ2hlYXRzaGVldFZpZXc/aW5wdXQ9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5jcmVhdGVtZXRob2RwbHVnaW4mYW1wO3RvZ2dsZT10cnVlIiBpZD0iZXBmLXN0ZXBzLXR3byI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlN0YXJ0IGJ1aWxkaW5nIGEgbWV0aG9kIHBsdWctaW4gdXNpbmcgYSB3aXphcmQuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBDb25maWd1cmF0aW9uIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9vcGVuQ2hlYXRzaGVldFZpZXc/aW5wdXQ9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uJmFtcDt0b2dnbGU9dHJ1ZSIgaWQ9ImVwZi1zdGVwcy1mb3VyIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+VGhpcyBjaGVhdHNoZWV0IGd1aWRlcyB5b3UgdGhvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbi48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJBZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2siIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL29wZW5DaGVhdHNoZWV0Vmlldz9pbnB1dD1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFkZG5ld21ldGhvZGNvbnRlbnQmYW1wO3RvZ2dsZT10cnVlIiBpZD0iZXBmLXN0ZXBzLW9uZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlRoaXMgY2hlYXRzaGVldCBndWlkZXMgeW91IHRob3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbnRlbnQuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iQ3JlYXRlIGEgUHJvY2VzcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vb3BlbkNoZWF0c2hlZXRWaWV3P2lucHV0PW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuY3JlYXRlYXByb2Nlc3MmYW1wO3RvZ2dsZT10cnVlIiBpZD0iZXBmLXN0ZXBzLXRocmVlIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+VGhpcyBjaGVhdHNoZWV0IHRha2VzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgcHJvY2Vzcy48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPiAgCi0JCQkJPGdyb3VwIGlkPSJzdGVwLWxpbmtzIj4KLQkJCQkJPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgICAgICAgIAkJPGFuY2hvciBpZD0iZW5kQW5jaG9yIi8+Ci0JCQkJPC9ncm91cD4KLQkJICAgCTwvZ3JvdXA+Ci0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotICAgIDxwYWdlIHN0eWxlPSJjc3MvdHV0b3JpYWxzL3R1dG9yaWFscy5jc3MiIGFsdC1zdHlsZT0iY3NzL3R1dG9yaWFscy9zd3QucHJvcGVydGllcyIgaWQ9InR1dG9yaWFscyIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPlRVVE9SSUFMUzwvdGV4dD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLWRlc2NyaXB0aW9uIiBpZD0icGFnZS1kZXNjcmlwdGlvbiI+TGVhcm4gaG93IHlvdSBjYW4gdXNlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgdG8gZGVsaXZlciBwcmFjdGljYWwsIGN1c3RvbWl6ZWQsIGFuZCBjb25zaXN0ZW50IHByb2Nlc3MgZ3VpZGFuY2UgdG8geW91ciBwcm9qZWN0IHRlYW0uPC90ZXh0PgotCQkJPGdyb3VwIGlkPSJ0dXRvcmlhbHMtbGlua3MiPiAgICAgICAgICAgICAgIAotCQkJICAgIDxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0JCQkJPGxpbmsgCi0JCQkJCWxhYmVsPSJFeHBsb3JlIHRoZSB1c2VyIGludGVyZmFjZSIgCi0JCQkJCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXQxX2ludHJvLmh0bSZhbXA7IiAKLQkJCQkJaWQ9ImVwZi10dXQtbmF2aWdhdGUiCi0JCQkJCWNsYXNzLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGVhcm4gdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgdXNlciBpbnRlcmZhY2U6IHBlcnNwZWN0aXZlcywgdmlld3MsIGFuZCBzZWFyY2guPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzZXMiIAotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0NV9pbnRyby5odG0mYW1wOyIgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtdHV0LXByb2Nlc3MiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiBob3cgdG8gY3JlYXRlIGFuZCByZXVzZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCBkZWxpdmVyeSBwcm9jZXNzZXMuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9IkNyZWF0ZSBtZXRob2QgY29udGVudCAiIAotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0Ml9pbnRyby5odG0mYW1wOyIgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtdHV0LWVsZW1lbnQiCi0gICAgICAgICAgICAgICAgCWNsYXNzLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGVhcm4gaG93IHRvIHVzZSB0aGUgZWRpdG9ycyB0byBjcmVhdGUgcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZS48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIAotICAgICAgICAgICAgICAgIAlsYWJlbD0iUHVibGlzaGluZyBhbmQgRXhwb3J0aW5nIiAKLSAgICAgICAgICAgICAgICAJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dDRfaW50cm8uaHRtJmFtcDsiIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLXR1dC1wdWJleHAiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiBob3cgdG8gcHVibGlzaCBjb25maWd1cmF0aW9ucyB0byBhIHdlYiBzaXRlIGFuZCBob3cgdG8gZXhwb3J0IHByb2Nlc3NlcyB0byBhIHBsYW5uaW5nIHRvb2wuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9IlJldXNlIG1ldGhvZCBjb250ZW50IiAKLSAgICAgICAgICAgICAgICAJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dDNfaW50cm8uaHRtJmFtcDsiIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLXR1dC1jb250ZW50IgotICAgICAgICAgICAgICAgIAljbGFzcy1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxlYXJuIGhvdyB0byBleHRlbmQsIHJlcGxhY2UsIGFuZCBjb250cmlidXRlIHRvIGJhc2UgY29udGVudCBlbGVtZW50cy48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotCQkJCTxncm91cCBpZD0ic3RlcC1saW5rcyI+Ci0JCQkJCTxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0gICAgICAgICAgICAJCTxhbmNob3IgaWQ9ImVuZEFuY2hvciIvPgotCQkJCTwvZ3JvdXA+Ci0JCSAgIAk8L2dyb3VwPiAgIAkKLSAgICAgICAgPC9ncm91cD4KLSAgICAgICAgCi0gICAgPC9wYWdlPgotCi0gICAgPCEtLSBXRUIgUkVTT1VSQ0VTIFNDQUZGT0xESU5HIC0tPgotCTxwYWdlIAotCQlzdHlsZT0iY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMuY3NzIiBhbHQtc3R5bGU9ImNzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLnByb3BlcnRpZXMiIGlkPSJ3ZWIiIHN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxncm91cCBpZD0iY3VydmUtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5XRUIgUkVTT1VSQ0VTPC90ZXh0PgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtZGVzY3JpcHRpb24iIGlkPSJwYWdlLWRlc2NyaXB0aW9uIj5JbiBhZGRpdGlvbiB0byBpbmZvcm1hdGlvbiBpbiB0aGUgV2VsY29tZSBhbmQgdGhlIEhlbHAsIHRoZSBXZWIgcHJvdmlkZXMgeW91IHdpdGggdGlwcywgYXJ0aWNsZXMsIHVwZGF0ZXMsIGFuZCByZWZlcmVuY2VzIHRvIGluZHVzdHJ5IHN0YW5kYXJkcy4gPC90ZXh0PgotCQkJPGdyb3VwIGlkPSJ3ZWItbGlua3MiPgotCQkJCSAgIDxsaW5rCi0JICAgICAgICAgICAgICAgICAgICAgbGFiZWw9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiCi0JICAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vb3BlbkJyb3dzZXI/dXJsPWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIgotCSAgICAgICAgICAgICAgICAgICAgIGlkPSJlcGZfcmVzb3VyY2UiPgotCSAgICAgICAgICAgICAgICAgIDx0ZXh0PkNlbnRyYWwgbG9jYXRpb24gZm9yIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RleHQ+Ci0JICAgICAgICAgICAgICAgPC9saW5rPgotCQkJPC9ncm91cD4KLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0gICAgPHBhZ2Ugc3R5bGU9ImNzcy9zYW1wbGVzL3NhbXBsZXMuY3NzIiBhbHQtc3R5bGU9ImNzcy9zYW1wbGVzL3N3dC5wcm9wZXJ0aWVzIiBpZD0ic2FtcGxlcyIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9ImNvbnRlbnQtaGVhZGVyIiBsYWJlbD0iU0FNUExFUyIgZmlsdGVyZWRGcm9tPSJzd3QiPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSIgZmlsdGVyZWRGcm9tPSJodG1sIj5TQU1QTEVTPC90ZXh0PgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtZGVzY3JpcHRpb24iIGlkPSJwYWdlLWRlc2NyaXB0aW9uIj5FeHBsb3JlIEVjbGlwc2UgYnkgaW5zdGFsbGluZyBwcmVmYWJyaWNhdGVkIHNhbXBsZXMgKG1heSByZXF1aXJlIEludGVybmV0IGNvbm5lY3Rpb24pLjwvdGV4dD4KLSAgICAgICAgICAgIDxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0gICAgICAgICAgICA8Z3JvdXAgbGFiZWw9IlNXVCIgaWQ9InN3dCIgc3R5bGUtaWQ9InNhbXBsZXMtZ3JvdXAiPgotICAgICAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJncm91cC1kZXNjcmlwdGlvbiI+UnVuIFNXVCBzYW1wbGVzIHVzaW5nIGVpdGhlciB0aGUgc3RhbmRhbG9uZSBTV1QgbGF1bmNoZXIgb3IgYXMgYW4gaW50ZWdyYXRlZCB3b3JrYmVuY2ggdmlldy48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IldvcmtiZW5jaCB2aWV3cyBhbmQgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3J1bkFjdGlvbj9wbHVnaW5JZD1vcmcuZWNsaXBzZS5wZGUudWkmYW1wO2NsYXNzPW9yZy5lY2xpcHNlLnBkZS51aS5pbnRlcm5hbC5zYW1wbGVzLlNob3dTYW1wbGVBY3Rpb24mYW1wO2lkPW9yZy5lY2xpcHNlLnNkay5zYW1wbGVzLnN3dC5leGFtcGxlcyIgaWQ9InN3dC1leGFtcGxlcyIgc3R5bGUtaWQ9InNhbXBsZS1saW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+VGhlIFNXVCBFeGFtcGxlIGxhdW5jaGVyIHdpbGwgYWxsb3cgeW91IHRvIGxhdW5jaCBhIGNvbGxlY3Rpb24gb2YgU1dUIGV4YW1wbGVzLiAgU29tZSBvZiB0aGUgZXhhbXBsZXMgY2FuIGJlIHJ1biBpbmRlcGVuZGVudCBvZiB0aGUgZWNsaXBzZSBwbGF0Zm9ybSBhbmQgb3RoZXJzIHdpbGwgYmUgYXZhaWxhYmxlIGFzIHZpZXdzIGluc2lkZSB0aGUgd29ya2JlbmNoLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0ic3d0R3JvdXBBbmNob3IiLz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8Z3JvdXAgbGFiZWw9IldvcmtiZW5jaCIgaWQ9IndvcmtiZW5jaCIgc3R5bGUtaWQ9InNhbXBsZXMtZ3JvdXAiPgotICAgICAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJncm91cC1kZXNjcmlwdGlvbiI+VGhlIGZvbGxvd2luZyBzYW1wbGVzIGRlbW9uc3RyYXRlIGhvdyB0byB0aWdodGx5IGludGVncmF0ZSBpbnRvIHRoZSBFY2xpcHNlIHdvcmtiZW5jaC48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9Ik11bHRpLXBhZ2UgZWRpdG9yIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9ydW5BY3Rpb24/cGx1Z2luSWQ9b3JnLmVjbGlwc2UucGRlLnVpJmFtcDtjbGFzcz1vcmcuZWNsaXBzZS5wZGUudWkuaW50ZXJuYWwuc2FtcGxlcy5TaG93U2FtcGxlQWN0aW9uJmFtcDtpZD1vcmcuZWNsaXBzZS5zZGsuc2FtcGxlcy5tdWx0aXBhZ2VlZGl0b3IiIGlkPSJtdWx0aS1wYWdlLWVkaXRvciIgc3R5bGUtaWQ9InNhbXBsZS1saW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+U2hvd3MgaG93IHRvIGNyZWF0ZSBhbiBlZGl0b3Igd2l0aCBtdWx0aXBsZSBwYWdlczwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IlByb3BlcnR5IHNoZWV0IGFuZCBvdXRsaW5lIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9ydW5BY3Rpb24/cGx1Z2luSWQ9b3JnLmVjbGlwc2UucGRlLnVpJmFtcDtjbGFzcz1vcmcuZWNsaXBzZS5wZGUudWkuaW50ZXJuYWwuc2FtcGxlcy5TaG93U2FtcGxlQWN0aW9uJmFtcDtpZD1vcmcuZWNsaXBzZS5zZGsuc2FtcGxlcy5wcm9wZXJ0eXNoZWV0IiBpZD0icHJvcGVydHktc2hlZXQiIHN0eWxlLWlkPSJzYW1wbGUtbGluayI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHByb3BlcnR5IHNoZWV0IGFuZCBvdXRsaW5lIHZpZXdzPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iUmVhZG1lIHRvb2wiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3J1bkFjdGlvbj9wbHVnaW5JZD1vcmcuZWNsaXBzZS5wZGUudWkmYW1wO2NsYXNzPW9yZy5lY2xpcHNlLnBkZS51aS5pbnRlcm5hbC5zYW1wbGVzLlNob3dTYW1wbGVBY3Rpb24mYW1wO2lkPW9yZy5lY2xpcHNlLnNkay5zYW1wbGVzLnJlYWRtZXRvb2wiIGlkPSJyZWFkbWV0b29sIiBzdHlsZS1pZD0ic2FtcGxlLWxpbmsiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5TaG93cyBob3cgdG8gY3JlYXRlIHlvdXIgb3duIGV4dGVuc2lvbiBwb2ludHM8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9ImpkdEFuY2hvciIvPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9IndvcmtiZW5jaEdyb3VwQW5jaG9yIi8+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPGFuY2hvciBpZD0iZW5kQW5jaG9yIi8+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgPC9wYWdlPgotCi0gICAgPHBhZ2Ugc3R5bGU9ImNzcy93aGF0c25ldy93aGF0c25ldy5jc3MiIGFsdC1zdHlsZT0iY3NzL3doYXRzbmV3L3N3dC5wcm9wZXJ0aWVzIiBpZD0ibmV3cyIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9ImNvbnRlbnQtaGVhZGVyIiBsYWJlbD0iV0hBVCdTIE5FVyIgZmlsdGVyZWRGcm9tPSJzd3QiPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSIgZmlsdGVyZWRGcm9tPSJodG1sIj5XSEFUJ1MgTkVXPC90ZXh0PgotICAgICAgICAgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgICAgICAgIDxncm91cCBpZD0ibm90ZXdvcnRoeS1saW5rcyIgbGFiZWw9Ik5ldyBhbmQgTm90ZXdvcnRoeSI+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3doYXRzTmV3L3BsYXRmb3JtX3doYXRzbmV3Lmh0bWwiIGlkPSJwbGF0Zm9ybS1ub3Rld29ydGh5IiBzdHlsZS1pZD0ibm90ZXdvcnRoeS1saW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+RmluZCBvdXQgYWJvdXQgdGhlIG1ham9yIG5ldyBmZWF0dXJlcyBpbiB0aGlzIHJlbGVhc2U8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9ImpkdEFuY2hvciIvPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9InBkZUFuY2hvciIvPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9ImdlbmVyYWxBbmNob3IiLz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9Im5ld3MtbGlua3MiIGxhYmVsPSJHZW5lcmFsIj4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iTWlncmF0aW9uIGZyb20gdGhlIHByZXZpb3VzIHJlbGVhc2UiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3YvcG9ydGluZy9lY2xpcHNlXzNfMF9wb3J0aW5nX2d1aWRlLmh0bWwiIGlkPSJtaWdyYXRpb24iPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIG1ha2UgeW91ciBvbGQgY29kZSB3b3JrIGluIEVjbGlwc2UgMy4xPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iTmV3IFVwZGF0ZXMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3J1bkFjdGlvbj9wbHVnaW5JZD1vcmcuZWNsaXBzZS51aS5pZGUmYW1wO2NsYXNzPW9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS51cGRhdGUuSW5zdGFsbFdpemFyZEFjdGlvbiIgaWQ9InVwZGF0ZXMiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5HZXQgdGhlIGxhdGVzdCB1cGRhdGVzIGZyb20gRWNsaXBzZS5vcmc8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJFY2xpcHNlIGNvbW11bml0eSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIiBpZD0iZWNsaXBzZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkpvaW4gdGhlIGNvbW11bml0eSwgcmVhZCBhcnRpY2xlcyBhbmQgbmV3cyBvbiBFY2xpcHNlLm9yZzwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0ibGlua3NBbmNob3IiLz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8YW5jaG9yIGlkPSJlbmRBbmNob3IiLz4KLSAgICAgICAgPC9ncm91cD4KLSAgICA8L3BhZ2U+Ci0gICAgCi08L2ludHJvQ29udGVudD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0NWZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEludHJvZHVjdGlvbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDMyZmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRybyI+Ci0gICAgICA8aW50cm8KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWcuQ3VzdG9taXphYmxlSW50cm9QYXJ0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iLz4KLSAgICAgICAgIDxpbnRyb1Byb2R1Y3RCaW5kaW5nCi0gICAgICAgICAgICAgICBpbnRyb0lkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iCi0gICAgICAgICAgICAgICBwcm9kdWN0SWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AudWkuY29tcG9zZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnIj4KLSAgICAgIDxjb25maWcKLSAgICAgICAgICAgIGNvbnRlbnQ9IiRubCQvaW50cm9Db250ZW50LnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWciCi0gICAgICAgICAgICBpbnRyb0lkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iPgotICAgICAgICAgPHByZXNlbnRhdGlvbiBob21lLXBhZ2UtaWQ9InJvb3QiIHN0YW5kYnktcGFnZS1pZD0ic3RhbmRieSI+Ci0gICAgICAgICAgIAk8aW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgCSAgCSAgIHdzPSJ3aW4zMixndGsiCi0gICAgICAgICAgIAkgIAkgICBzdHlsZT0iY3NzL3NoYXJlZC5jc3MiCi0gICAgICAgICAgIAkgIAkgICBraW5kPSJodG1sIgotICAgICAgICAgICAJICAJICAgb3M9IndpbjMyLGxpbnV4Ij4KLSAgICAgICAgICAgCTwvaW1wbGVtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW1wbGVtZW50YXRpb24ga2luZD0ic3d0Ii8+Ci0gICAgICAgICAgICAgICA8bGF1bmNoQmFyCi0gICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0icmlnaHQiCi0gICAgICAgICAgICAgICAgICAgICBiZz0iI2RlZGNmNSI+Ci0gICAgICAgICAgICAgICA8aGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICBjbG9zZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgIGltYWdlPSJjc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvaGFuZGxlLmdpZiIvPgotICAgICAgICAgICAgICAgPHNob3J0Y3V0Ci0gICAgICAgICAgICAgICAgICAgICBpY29uPSJjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXcuZ2lmIgotICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJXNob3J0Y3V0Lm92ZXJ2aWV3LnRvb2x0aXAiCi0gICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1vdmVydmlldyIvPgotICAgICAgICAgICAgICAgPHNob3J0Y3V0Ci0gICAgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXAiCi0gICAgICAgICAgICAgICAgICAgICBpY29uPSJjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzLmdpZiIKLSAgICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXR1dG9yaWFscyIvPgotICAgICAgICAgICAgICAgPHNob3J0Y3V0Ci0gICAgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwIgotICAgICAgICAgICAgICAgICAgICAgaWNvbj0iY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmIgotICAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9c3RlcHMiLz4KLSAgICAgICAgICAgICAgIDxzaG9ydGN1dAotICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJXNob3J0Y3V0LndlYnJlc291cmNlcy50b29sdGlwIgotICAgICAgICAgICAgICAgICAgICAgaWNvbj0iY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmMxNi5naWYiCi0gICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD13ZWIiLz4KLSAgICAgICAgICAgIDwvbGF1bmNoQmFyPgotICAgICAgICAgPC9wcmVzZW50YXRpb24+Ci0gICAgICA8L2NvbmZpZz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnRXh0ZW5zaW9uIj4KLSAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgIG5hbWU9Im9wZW5DaGVhdHNoZWV0VmlldyIKLSAgICAgICAgICAgIHJlcGxhY2VzPSJydW5BY3Rpb24/Y2xhc3M9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk9wZW5DaGVhdHNoZWV0VmlldyZhbXA7cGx1Z2luSWQ9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby93ZWxjb21lLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzNjI4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vd2VsY29tZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHdlbGNvbWVQYWdlIAotCXRpdGxlPSJFY2xpcHNlIFBsYXRmb3JtIgotCWZvcm1hdD0ibm93cmFwIj4KLQk8aW50cm8+VGhpcyBwYWdlIHdpbGwgaGVscCBmYW1pbGlhcml6ZSB5b3Ugd2l0aCB0aGUgRWNsaXBzZSBXb3JrYmVuY2guCi1UbyBnZXQgc3RhcnRlZCwgcmVhZCB0aGUgc2VjdGlvbnMgYmVsb3cgYW5kIGNsaWNrIG9uIHRoZSByZWxhdGVkIGxpbmtzLiA8L2ludHJvPgotCi08aXRlbT48Yj5JbnN0YWxsZWQgRmVhdHVyZXMgPC9iPgotVG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGUgZmVhdHVyZXMgaW5zdGFsbGVkIGluIHlvdXIgd29ya2JlbmNoLCBjaG9vc2UgPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuaWRlIiAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUXVpY2tTdGFydEFjdGlvbiI+SGVscCA+IFdlbGNvbWUuLi48L2FjdGlvbj4KLWFuZCBzZWxlY3QgdGhlIGZlYXR1cmUgeW91IGFyZSBpbnRlcmVzdGVkIGluLjwvaXRlbT4KLQotPGl0ZW0+PGI+UGVyc3BlY3RpdmVzLCB2aWV3cyBhbmQgZWRpdG9ycyA8L2I+Ci1BIHdpbmRvdyBjb250YWlucyBvbmUgb3IgbW9yZSBwZXJzcGVjdGl2ZXMuIEEgcGVyc3BlY3RpdmUgY29uc2lzdHMgb2Ygdmlld3MgKGUuZy4gTmF2aWdhdG9yKSAKLWFuZCBlZGl0b3JzIGZvciB3b3JraW5nIHdpdGggeW91ciByZXNvdXJjZXMuCi0KLVRoZSBzaG9ydGN1dCBiYXIgYXQgdGhlIGZhciBsZWZ0IG9mIHRoZSB3aW5kb3cgYWxsb3dzIHlvdSB0byBvcGVuIG5ldyBwZXJzcGVjdGl2ZXMgYW5kIG1vdmUKLWJldHdlZW4gcGVyc3BlY3RpdmVzIHRoYXQgYXJlIGFscmVhZHkgb3Blbi4gVGhlIHBlcnNwZWN0aXZlIHlvdSBhcmUgY3VycmVudGx5IHdvcmtpbmcgd2l0aCAKLWlzIHNob3duIGluIHRoZSB0aXRsZSBvZiB0aGUgd2luZG93IGFuZCBpbiB0aGUgc2hvcnRjdXQgYmFyIGFzIGEgcHVzaGVkLWluIGljb24uPC9pdGVtPgotCi08aXRlbT48Yj5Db25maWd1cmluZyB5b3VyIHBlcnNwZWN0aXZlczwvYj4KLVlvdSBjYW4gbW92ZSB2aWV3cyBhbmQgZWRpdG9ycyBhcm91bmQgdGhlIHdvcmtiZW5jaCBieSBkcmFnZ2luZyB0aGVpciB0aXRsZWJhcnMuIFlvdSBjYW4KLWFsc28gYWRkIG1vcmUgdmlld3MgdG8geW91ciBjdXJyZW50IHBlcnNwZWN0aXZlIGJ5IHVzaW5nIFdpbmRvdyA+IFNob3cgVmlldy4gCi1UbyByZXNldCB0aGUgcGVyc3BlY3RpdmUgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLCBjaG9vc2UgPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkiICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuUmVzZXRQZXJzcGVjdGl2ZUFjdGlvbiI+V2luZG93ID4gUmVzZXQgUGVyc3BlY3RpdmU8L2FjdGlvbj4uIAotCi1PbmNlIHlvdSBoYXZlIGFycmFuZ2VkIHlvdXIgcGVyc3BlY3RpdmUsIHlvdSBjYW4gc2F2ZSBpdCB1c2luZyBXaW5kb3cgPiBTYXZlIFBlcnNwZWN0aXZlIEFzLi4uLiAKLVlvdSBjYW4gY3VzdG9taXplIHRoZSB2aWV3cywgcGVyc3BlY3RpdmVzIGFuZCBOZXcgbWVudSBvcGVyYXRpb25zIHRoYXQgc2hvdyB1cCBmb3IgCi15b3VyIHBlcnNwZWN0aXZlLiBUbyBkbyB0aGlzIGNob29zZSA8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aSIgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5FZGl0QWN0aW9uU2V0c0FjdGlvbiI+V2luZG93ID4gQ3VzdG9taXplIFBlcnNwZWN0aXZlLi4uPC9hY3Rpb24+IC4gIEEgdmlldyBjYW4KLWFkZGl0aW9uYWxseSBiZSBjb252ZXJ0ZWQgaW50byBhIEZhc3QgVmlldyBieSBkcmFnZ2luZyBpdCB0byB0aGUgc2hvcnRjdXQgYmFyIChhdCB0aGUgCi1mYXIgbGVmdCBvZiB0aGUgd2luZG93KS4gPC9pdGVtPiAKLQotPGl0ZW0+PGI+Sm9pbiBhIENWUyB0ZWFtPC9iPgotVG8gam9pbiBhIENWUyBkZXZlbG9wbWVudCB0ZWFtLCBvcGVuIHRoZSA8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSIgY2xhc3M9Im9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5hY3Rpb25zLlNob3dDVlNQZXJzcGVjdGl2ZUFjdGlvbiI+Q1ZTIFJlcG9zaXRvcnkgRXhwbG9yaW5nIHBlcnNwZWN0aXZlPC9hY3Rpb24+LiBOZXh0LCBzcGVjaWZ5Ci10aGUgbG9jYXRpb24gb2YgeW91ciBDVlMgcmVwb3NpdG9yeS4gVG8gZG8gdGhpcywgY2hvb3NlIDxhY3Rpb24gcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIiBjbGFzcz0ib3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLnJlcG8uTmV3Q1ZTUmVwb3NpdG9yeUFjdGlvbiI+TmV3ID4gUmVwb3NpdG9yeSBMb2NhdGlvbi4uLjwvYWN0aW9uPiBmcm9tIHRoZQotQ1ZTIFJlcG9zaXRvcmllcyB2aWV3IHBvcHVwIG1lbnUuIFdoZW4gdGhlIGxvY2F0aW9uIHdpemFyZCBvcGVucywgZmlsbCBpbiB0aGUgZGV0YWlscyBvZiB5b3VyCi1DVlMgcmVwb3NpdG9yeSBhbmQgY2xpY2sgRmluaXNoLiAKLQotQSByZXBvc2l0b3J5IGxvY2F0aW9uIHdpbGwgYXBwZWFyIGluIHRoZSBDVlMgUmVwb3NpdG9yaWVzIHZpZXcuIEV4cGFuZCB0aGUgbG9jYXRpb24sIHRoZW4gZXhwYW5kCi10aGUgSEVBRCBicmFuY2guIFlvdSB3aWxsIHNlZSBhIGxpc3Qgb2YgdGhlIG1vZHVsZXMgaW4gdGhhdCByZXBvc2l0b3J5LiBTZWxlY3QgYSBtb2R1bGUgYW5kIGNob29zZSAKLTxiPkNoZWNrb3V0IGFzIFByb2plY3Q8L2I+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhpcyB3aWxsIGNoZWNrb3V0IHRoZSBtb2R1bGUgZnJvbSB0aGUgQ1ZTIAotcmVwb3NpdG9yeSBhbmQgY3JlYXRlIGEgcHJvamVjdCBieSB0aGF0IG5hbWUgaW4geW91ciB3b3Jrc3BhY2UuPC9pdGVtPgotCi08aXRlbT48Yj5SdW5uaW5nIGFuIEFudCBCdWlsZGZpbGU8L2I+Ci1UbyBydW4gYW4gQW50IGJ1aWxkZmlsZSwgY2xpY2sgb24gUnVuID4gRXh0ZXJuYWwgVG9vbHMgPiBFeHRlcm5hbCBUb29scy4uLi4gU2VsZWN0IEFudCBCdWlsZCBhcyB0aGUgbGF1bmNoCi1jb25maWd1cmF0aW9uIHR5cGUgYW5kIGNsaWNrIE5ldy4gSWRlbnRpZnkgdGhlIGJ1aWxkZmlsZSBpbiB0aGUgTG9jYXRpb24gZmllbGQgYW5kIHRoZW4gY2xpY2sgUnVuLjwvaXRlbT4KLQotPGl0ZW0+PGI+TGVhcm4gbW9yZSA8L2I+Ci1UbyBsZWFybiBtb3JlIHlvdSBjYW4gYnJvd3NlIHRoZSA8dG9waWMgaWQ9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90b2MueG1sIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvdG9waWM+LiBCcm93c2UgdGhlIDx0b3BpYyBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1hbnRpY29ucy5odG0iPkV4dGVybmFsIFRvb2xzIGFuZCBBbnQgSWNvbnM8L3RvcGljPgotc2VjdGlvbiB0byByZWNvZ25pemUgdGhlIHZhcmlvdXMgRXh0ZXJuYWwgVG9vbHMgYW5kIEFudCBlbGVtZW50cy4gPC9pdGVtPgotCi08L3dlbGNvbWVQYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhMTEwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmYwNzA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnVpLkVQRlVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnVpLAotIG9yZy5lY2xpcHNlLmVwZi51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLAotIG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYudWkudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGZmZTEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODBlYTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgVmlld3MKLXZpZXdDYXRlZ29yeU5hbWU9TWV0aG9kIEF1dGhvcmluZwotCi0jIFdpemFyZHMKLXdpemFyZENhdGVnb3J5TmFtZT1NZXRob2QgQXV0aG9yaW5nCi0KLSMgQWN0aW9uIFNldAotYWN0aW9uU2V0TGFiZWw9TWV0aG9kIEF1dGhvcmluZwotCi0jIFByZWZlcmVuY2UgUGFnZXMKLXJvb3RQcmVmZXJlbmNlUGFnZU5hbWU9TWV0aG9kCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODBiYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51aS52aWV3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3Q2F0ZWdvcnlOYW1lIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLmVwZi51aS5uZXdXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJXdpemFyZENhdGVnb3J5TmFtZSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQgPSAib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSIld2l6YXJkQ2F0ZWdvcnlOYW1lIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IiV3aXphcmRDYXRlZ29yeU5hbWUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0iZXhwb3J0V2l6YXJkcyIKLSAgICAgICAgIG5hbWU9IkVQRiBFeHBvcnQgV2l6YXJkcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0V4cG9ydFdpemFyZHMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0iaW1wb3J0V2l6YXJkcyIKLSAgICAgICAgIG5hbWU9IkVQRiBJbXBvcnQgV2l6YXJkcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0ltcG9ydFdpemFyZHMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuUm9vdFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5Sb290UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlcm9vdFByZWZlcmVuY2VQYWdlTmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NjaGVtYS9FeHBvcnRXaXphcmRzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0V4cG9ydFdpemFyZHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5MzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0V4cG9ydFdpemFyZHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi51aSIgaWQ9ImV4cG9ydFdpemFyZHMiIG5hbWU9IkVQRiBFeHBvcnQgV2l6YXJkcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBjb250cmlidXRlIGFuIGV4cG9ydCB3aXphcmQgdG8gdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3NlciBVSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2l6YXJkIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuRXhwb3J0TVNQV2l6YXJkJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0ltcG9ydFdpemFyZHMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zY2hlbWEvSW1wb3J0V2l6YXJkcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA3ODM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zY2hlbWEvSW1wb3J0V2l6YXJkcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnVpIiBpZD0iaW1wb3J0V2l6YXJkcyIgbmFtZT0iRVBGIEltcG9ydCBXaXphcmRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGNvbnRyaWJ1dGUgYW4gaW1wb3J0IHdpemFyZCB0byB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyIFVJLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIHVzZWQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmQgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL0VQRlVJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UxODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL0VQRlVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBFUEYgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFUEZVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFUEZVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFUEZVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVBGVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvRVBGVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkODMxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRVBGIFVJIHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRVBGVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gRVBGVUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFUEZVSVJlc291cmNlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVDb25mbGljdF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZUNvbmZsaWN0X21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZV9zZWxlY3RBY3Rpb25fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVfZGVzdGluYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVDb25mbGljdF9ub3RlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lX3JlcGxhY2VfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lX3VuaXF1ZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcm5hbEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRpYWxpemVXaXphcmRFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbml0aWFsaXplV2l6YXJkUGFnZXNFcnJvcl9yZWFzb247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFUEZVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjkwMzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEZpbGUgTmFtZSBDb25mbGljdCBEaWFsb2cKLURpYWxvZ19maWxlTmFtZUNvbmZsaWN0X3RpdGxlPUZpbGUgTmFtZSBDb25mbGljdAotRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3RfbXNnPUlVUFUwMjAwVzogVGhlIGZpbGUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2UgZm9sZGVyICcnezF9JycuCi1EaWFsb2dfZmlsZU5hbWVDb25mbGljdF9ub3RlPU5vdGU6IEFub3RoZXIgbWV0aG9kIGVsZW1lbnQgbWlnaHQgcmVmZXJlbmNlIHRoaXMgZmlsZS4KLURpYWxvZ19maWxlTmFtZV9yZXBsYWNlX21zZz1SZXBsYWNlIGV4aXN0aW5nIGZpbGUgd2l0aCBuZXcgZmlsZQotRGlhbG9nX2ZpbGVOYW1lX3VuaXF1ZV9tc2c9U3BlY2lmeSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBuZXcgZmlsZQotRGlhbG9nX2ZpbGVOYW1lX3NlbGVjdEFjdGlvbl9sYWJlbD1TZWxlY3QgYWN0aW9uOgotCi0jIEVycm9yIE1lc3NhZ2VzCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1pbml0aWFsaXplV2l6YXJkRXJyb3JfcmVhc29uPVRoZSB3aXphcmQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIGNvcnJlY3RseS4KLWluaXRpYWxpemVXaXphcmRQYWdlc0Vycm9yX3JlYXNvbj1PbmUgb3IgbW9yZSB3aXphcmQgcGFnZXMgaGF2ZSBub3QgYmVlbiBpbml0aWFsaXplZCBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9hY3Rpb25zL0NDb21ib0NvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgxZjA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFdyYXBzIGEgQ0NvbWJvIGluIGEgQ29udHJpYnV0aW9uSXRlbSBmb3IgdXNlIGluIGEgdG9vbGJhcgotICogCi0gKiBEb2VzIG5vdCB1c2UgYSBDb21ib1ZpZXdlciBiZWNhdXNlIG9mIHRhYmJpbmcgaXNzdWVzIC0gc2VlIGJ1ZyA3ODg4NQotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotCi0JcHJvdGVjdGVkIENDb21ibyBDQ29tYm87Ci0KLQlwcm90ZWN0ZWQgVG9vbEl0ZW0gdG9vbEl0ZW07Ci0KLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0JCi0JcHJvdGVjdGVkIGludCBzdHlsZTsKLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGlucHV0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbShpbnQgc3R5bGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQl0b29sSXRlbS5zZXRDb250cm9sKGJveCk7Ci0JCVBvaW50IHByZWZlcnJlZFNpemUgPSBDQ29tYm8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQkJdG9vbEl0ZW0uc2V0V2lkdGgocHJlZmVycmVkU2l6ZS54KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoQ29vbEJhciBjb29sQmFyLCBpbnQgaW5kZXgpIHsKLQkJQ29udHJvbCBib3ggPSBjcmVhdGVDb250cm9sKGNvb2xCYXIpOwotCi0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOLCBpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJfQotCi0JCS8vIFNldCB0aGUgYmFjayByZWZlcmVuY2UuCi0JCWNvb2xJdGVtLnNldERhdGEodGhpcyk7Ci0KLQkJLy8gQWRkIHRoZSB0b29sYmFyIHRvIHRoZSBDb29sSXRlbSB3aWRnZXQuCi0JCWNvb2xJdGVtLnNldENvbnRyb2woYm94KTsKLQotCQkvLyBJZiB0aGUgdG9vbGJhciBpdGVtIGV4aXN0cyB0aGVuIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY29vbCBpdGVtLgotCQlQb2ludCB0b29sQmFyU2l6ZSA9IGJveC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCS8vIFNldCB0aGUgcHJlZmVycmVkIHNpemUgdG8gdGhlIHNpemUgb2YgdGhlIHRvb2xiYXIgcGx1cyB0cmltLgotCQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUodG9vbEJhclNpemUpOwotCQljb29sSXRlbS5zZXRTaXplKHRvb2xCYXJTaXplKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gPSBuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlDQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgxMCk7Ci0JCUNDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQlDQ29tYm8uc2V0SXRlbXMoaW5wdXQudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0JCUNDb21iby5hZGREaXNwb3NlTGlzdGVuZXIoCi0JCQkJbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlkaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlDQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCXJldHVybiBDQ29tYm87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIENDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChDb2xsZWN0aW9uPFN0cmluZz4gaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgQ0NvbWJvIGdldENDb21ibygpIHsKLQkJcmV0dXJuIENDb21ibzsKLQl9Ci0KLQlwdWJsaWMgVG9vbEl0ZW0gZ2V0VG9vbEl0ZW0oKSB7Ci0JCXJldHVybiB0b29sSXRlbTsKLQl9Ci0KLQlwdWJsaWMgQ29vbEl0ZW0gZ2V0Q29vbEl0ZW0oKSB7Ci0JCXJldHVybiBjb29sSXRlbTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9kaWFsb2dzL1JlbmFtZUZpbGVDb25mbGljdERpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvZGlhbG9ncy9SZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxMzY1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9kaWFsb2dzL1JlbmFtZUZpbGVDb25mbGljdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLkVQRlVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogRGlzcGxheXMgYSBkaWFsb2cgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJlbmFtZSBhIGZpbGUgcGF0aC4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgb3ZlcndyaXRlIGJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gb3ZlcldyaXRlQnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfZmlsZU5hbWU7Ci0JcHJpdmF0ZSBpbnQgT1ZFUl9XUklURV9JRCA9IDIyOwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2VTdHI7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uX3JlcGxhY2U7Ci0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uX3VuaXF1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGRlc3RpbmF0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgZGlhbG9nQXJlYS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0NTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQkvLyBDcmVhdGUgbWVzc2FnZSBhcmVhLgotCi0JCUltYWdlIGltYWdlID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBpbWFnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OVUxMKTsKLQkJCWltYWdlLnNldEJhY2tncm91bmQoaW1hZ2VMYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJaW1hZ2VMYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCQlpbWFnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCX0KLQotCQlMYWJlbCBtZXNzYWdlID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5XUkFQKTsKLQkJaWYgKG1lc3NhZ2VTdHIgIT0gbnVsbCkgewotCQkJbWVzc2FnZS5zZXRUZXh0KG1lc3NhZ2VTdHIpOwotCQl9Ci0JCUdyaWREYXRhIGRhdGExID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGExLmhvcml6b250YWxTcGFuID0gMjsKLQkJbWVzc2FnZS5zZXRMYXlvdXREYXRhKGRhdGExKTsKLQotCQlMYWJlbCBlbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCUxhYmVsIG5vdGUgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlub3RlLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3Rfbm90ZSk7Ci0JCUdyaWREYXRhIGRhdGEyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJbm90ZS5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGEzID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEzLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YTMuaGVpZ2h0SGludCA9IDEwOwotCQllbXB0eS5zZXRMYXlvdXREYXRhKGRhdGEzKTsKLQotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCUxhYmVsIHNlbGVjdEFjdGlvbiA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCXNlbGVjdEFjdGlvbi5zZXRUZXh0KEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZV9zZWxlY3RBY3Rpb25fbGFiZWwpOwotCQlHcmlkRGF0YSBkYXRhNCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhNC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlbGVjdEFjdGlvbi5zZXRMYXlvdXREYXRhKGRhdGE0KTsKLQotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnV0dG9uX3JlcGxhY2UgPSBuZXcgQnV0dG9uKGRpYWxvZ0FyZWEsIFNXVC5SQURJTyk7Ci0JCS8vIExhYmVsIHJlcGxhY2VfbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQkvLyByZXBsYWNlX2xhYmVsLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lX3JlcGxhY2VfbXNnKTsKLQkJYnV0dG9uX3JlcGxhY2Uuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfcmVwbGFjZV9tc2cpOwotCQlidXR0b25fcmVwbGFjZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1dHRvbl91bmlxdWUgPSBuZXcgQnV0dG9uKGRpYWxvZ0FyZWEsIFNXVC5SQURJTyk7Ci0JCS8vIExhYmVsIHVuaXF1ZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJLy8gdW5pcXVlTGFiZWwuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfdW5pcXVlX21zZyk7Ci0JCWJ1dHRvbl91bmlxdWUuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfdW5pcXVlX21zZyk7Ci0JCWJ1dHRvbl91bmlxdWUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgYXJlYS4gLS0gVE9ETzogZmluZCBkaWZmZXJlbnQgd2F5IGluc3RlYWQgb2YgZW1wdHkKLQkJLy8gbGFiZWxzLgotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9maWxlTmFtZSA9IG5ldyBUZXh0KGRpYWxvZ0FyZWEsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YTEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGExLndpZHRoSGludCA9IDIwMDsKLQkJZ3JpZERhdGExLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSOwotCQljdHJsX2ZpbGVOYW1lLnNldExheW91dERhdGEoZ3JpZERhdGExKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWN0cmxfZmlsZU5hbWUuc2V0VGV4dChmaWxlTmFtZSk7Ci0JCQljdHJsX2ZpbGVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCWN0cmxfZmlsZU5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJb2tCdXR0b24KLQkJCQkJCQkuc2V0RW5hYmxlZChjdHJsX2ZpbGVOYW1lLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCQl9Ci0JCQkJZmlsZU5hbWUgPSBjdHJsX2ZpbGVOYW1lLmdldFRleHQoKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlidXR0b25fcmVwbGFjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWN0cmxfZmlsZU5hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uX3VuaXF1ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWN0cmxfZmlsZU5hbWUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmaWxlTmFtZSA9IGN0cmxfZmlsZU5hbWUuZ2V0VGV4dCgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc3RpbmF0aW9uICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVDb25mbGljdF90aXRsZSk7IAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQkvLyBjcmVhdGVCdXR0b24ocGFyZW50LCBPVkVSX1dSSVRFX0lELAotCQkvLyBFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfb3ZlcldyaXRlLCB0cnVlKTsKLQotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgb3ZlcndyaXRlIGJ1dHRvbgotCQkvLyBvdmVyV3JpdGVCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oT1ZFUl9XUklURV9JRCk7Ci0KLQkJLy8gb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEZpbGUgTmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlUGF0aChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gT1ZFUl9XUklURV9JRCkgewotCQkJb3ZlcldyaXRlUHJlc3NlZCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdmVyV3JpdGVQcmVzc2VkKCkgewotCQlzZXRSZXR1cm5Db2RlKE9WRVJfV1JJVEVfSUQpOwotCQljbG9zZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWZpbGVOYW1lID0gbnVsbDsKLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVN0cigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VTdHI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVN0cihTdHJpbmcgbWVzc2FnZVN0cikgewotCQl0aGlzLm1lc3NhZ2VTdHIgPSBtZXNzYWdlU3RyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uKFN0cmluZyBkZXN0aW5hdGlvbikgewotCQl0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9lZGl0b3JzL0lNZXRob2RFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2VkaXRvcnMvSU1ldGhvZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDJmZTI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2VkaXRvcnMvSU1ldGhvZEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RFZGl0b3IgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9wcmVmZXJlbmNlcy9CYXNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3ByZWZlcmVuY2VzL0Jhc2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJmMjc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3ByZWZlcmVuY2VzL0Jhc2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEVQRiBwcmVmZXJlbmNlIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQoSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hpbGQgY29tcG9zaXRlIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiA8cD4KLQkgKiBUaGUgY2hpbGQgY29tcG9zaXRlIHdpbGwgYmUgaW5kZW50ZWQgZnJvbSB0aGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbXBvc2l0ZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZ3JvdXAgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgZ3JvdXAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBncm91cCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0R3JvdXAocGFyZW50LCB0ZXh0LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBlcXVhbENvbHVtbldpZHRoCi0JICogICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGNlbGxzIHNob3VsZCBiZSBzYW1lIHdpZHRoIG9yCi0JICogICAgICAgICAgICBub3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBlcXVhbENvbHVtbldpZHRoKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUdyaWRMYXlvdXRHcm91cChwYXJlbnQsIHRleHQsIGNvbHVtbiwKLQkJCQllcXVhbENvbHVtbldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxhYmVsIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwKLQkJCQloZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmVhZG9ubHkgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsCi0JCQkJY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4KLQkgKiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IG11bHRpLWxpbmUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZU11bHRpTGluZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LAotCQkJCWhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBjb21ib2JveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ29tYm9ib3gocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib2JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNvbWJvYm94KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KHBhcmVudCwgdGV4dCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHBhcmFtIHNlbGVjdGVkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VsZWN0IHRoZSByYWRpbyBidXR0b24gYnkgZGVmYXVsdAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIHRleHQsIGNvbHVtbiwgc2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dFZpZXdlcihwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHRWaWV3ZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRhYmxlVmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5DaGVja2JveFRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsCi0JCQkJY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hlY2tib3hUYWJsZVZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIocGFyZW50LCAzNjAsIDE3NSwgY29sdW1uKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3Qgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0Vmlld2VyIGNyZWF0ZUxpc3RWaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMaXN0Vmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxpbmUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMaW5lKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgdGV4dCBjb250cm9sCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdGV4dCBjb250cm9sIGhhcyBzb21lIHRleHQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTm9uRW1wdHlUZXh0KFRleHQgY29udHJvbCkgewotCQlyZXR1cm4gU1dUVXRpbC5pc05vbkVtcHR5VGV4dChjb250cm9sKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3ByZWZlcmVuY2VzL1Jvb3RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OTViM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGUgcm9vdCBwcmVmZXJlbmNlIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUm9vdFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3V0aWwvU1dUVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvdXRpbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTJkN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvdXRpbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gY3JlYXRlIFNXVCB3aWRnZXRzIGZvciB0aGUgRVBGIFVJLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGhlbHBzIHRvIHByb3ZpZGUgYSBjb21tb24gbG9vayBhbmQgZmVlbCBmb3IgYWxsIEVQRiBmb3JtcywKLSAqIGRpYWxvZ3MsIHdpemFyZHMgYW5kIHByZWZlcmVuY2UgcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0KLQkvKioKLQkgKiBQcmV2ZW50cyBleHRlcm5hbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgY2xhc3MuIEFsbCBtZXRob2RzIGluIHRoaXMgY2xhc3MKLQkgKiBzaG91bGQgYmUgZGVjbGFyZWQgc3RhdGljLgotCSAqLwotCXByaXZhdGUgU1dUVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbXBvc2l0ZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGNvbHVtbiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGlsZCBjb21wb3NpdGUgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIDxwPgotCSAqIFRoZSBjaGlsZCBjb21wb3NpdGUgd2lsbCBiZSBpbmRlbnRlZCBmcm9tIHRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29tcG9zaXRlIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNoaWxkR3JpZExheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGNvbHVtbikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW4sIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IC0zOwotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDEzOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBHcm91cCBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1uLCBmYWxzZSkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZ3JvdXAuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBlcXVhbENvbHVtbldpZHRoCi0JICogICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGNlbGxzIHNob3VsZCBiZSBzYW1lIHdpZHRoIG9yCi0JICogICAgICAgICAgICBub3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBlcXVhbENvbHVtbldpZHRoKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1uLCBlcXVhbENvbHVtbldpZHRoKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBsYWJlbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBjb2x1bW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHZlcnRpY2FsbHkgYWxpZ25lZCBsYWJlbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBjb2x1bW4pIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmVhZG9ubHkgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LAotCQkJaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsICIiLCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIGNvbHVtbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0LAotCQkJaW50IHdpZHRoSGludCwgaW50IGNvbHVtbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0LAotCQkJaW50IHdpZHRoSGludCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBjcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCAiIiwgU1dULkRFRkFVTFQsIGNvbHVtbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbgotCSAqIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBjb21ib2JveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3guCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVSZWFkT25seUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSfFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ29tYm9ib3gocGFyZW50LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNoZWNrYm94KHBhcmVudCwgdGV4dCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByYWRpbyBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcGFyYW0gc2VsZWN0ZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZWxlY3QgdGhlIHJhZGlvIGJ1dHRvbiBieSBkZWZhdWx0Ci0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0JCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJcmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3RlZCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJhZGlvIGJ1dHRvbiB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIHRleHQsIDEsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LAotCQkJaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJVGV4dFZpZXdlciB0ZXh0Vmlld2VyID0gbmV3IFRleHRWaWV3ZXIocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJU3R5bGVkVGV4dCB0ZXh0V2lkZ2V0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl0ZXh0V2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0Vmlld2VyKHBhcmVudCwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5DaGVja2JveFRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCUNoZWNrYm94VGFibGVWaWV3ZXIgY2hlY2tib3hUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIKLQkJCQkubmV3Q2hlY2tMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GSUxMIHwgU1dULkhPUklaT05UQUwpOwotCQlUYWJsZSB0YWJsZSA9IGNoZWNrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY2hlY2tib3hUYWJsZVZpZXdlcjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3Qgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Vmlld2VyIGNyZWF0ZUxpc3RWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCUxpc3RWaWV3ZXIgbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQlsaXN0Vmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxpc3RWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpbmUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBsaW5lIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSB0ZXh0IGNvbnRyb2wgaGFzIHNvbWUgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05vbkVtcHR5VGV4dChUZXh0IGNvbnRyb2wpIHsKLQkJU3RyaW5nIHRleHQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJcmV0dXJuIHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0Jhc2VXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRlM2MzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5FUEZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBleHRlbnNpYmxlIEVQRiB3aXphcmRzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0JLy8gVGhlIGN1cnJlbnQgd29ya2JlbmNoLgotCXByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCS8vIFRoZSBjdXJyZW50IG9iamVjdCBzZWxlY3Rpb24uCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8vIEFuIGV4dGVuZGVyIG9mIHRoaXMgd2l6YXJkLgotCXByb3RlY3RlZCBJV2l6YXJkRXh0ZW5kZXIgd2l6YXJkRXh0ZW5kZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCYXNlV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCXByb2Nlc3NXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50KCk7Ci0KLQkJaW5pdGlhbGl6ZUV4dGVuZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUV4dGVuZGVyKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJd2l6YXJkRXh0ZW5kZXIuaW5pdCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdpemFyZCBleHRlbmRlciBzcGVjaWZpYyBleHRlbnNpb24gcG9pbnQgSUQuCi0JICogCi0JICogQHJldHVybiB0aGUgd2l6YXJkIGV4dGVuZGVyIHNwZWNpZmljIGV4dGVuc2lvbiBwb2ludCBJRAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHRlbmRlciBvZiB0aGlzIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+SVdpemFyZEV4dGVuZGVyPC9jb2RlPiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZXJlIGlzIG5vIGV4dGVuZGVyCi0JICovCi0JcHVibGljIElXaXphcmRFeHRlbmRlciBnZXRXaXphcmRFeHRlbmRlcigpIHsKLQkJcmV0dXJuIHdpemFyZEV4dGVuZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNnZXROZXh0UGFnZShJV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQluZXh0UGFnZSA9IHdpemFyZEV4dGVuZGVyLmdldE5leHRQYWdlKHBhZ2UpOwotCQl9Ci0JCWlmIChuZXh0UGFnZSA9PSBudWxsKSB7Ci0JCQluZXh0UGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKHBhZ2UpOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHdpemFyZEV4dGVuZGVyLmNhbkZpbmlzaCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5GaW5pc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRFeHRlbmRlci5kb0ZpbmlzaCgpOwotCQl9Ci0JCXJldHVybiBkb0ZpbmlzaCgpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBmaW5pc2ggb3BlcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbmlzaCBvcGVyYXRpb24gaXMgZXhlY3V0ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBvdmVycmlkZSB0aGUgZXh0ZW5kZXIuIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIHJldHVybiB0aGUKLQkgKiBkZWZhdWx0RXh0ZW5kZXIKLQkgKiAKLQkgKiBAcGFyYW0gZGVmYXVsdEV4dGVuZGVyCi0JICogQHJldHVybiBJV2l6YXJkRXh0ZW5kZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSVdpemFyZEV4dGVuZGVyIGNyZWF0ZVdpemFyZEV4dGVuZGVyKAotCQkJSVdpemFyZEV4dGVuZGVyIGRlZmF1bHRFeHRlbmRlcikgewotCQlyZXR1cm4gZGVmYXVsdEV4dGVuZGVyOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgd2l6YXJkIGV4dGVuZGVyIHNwY2lmaWMgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0JCVN0cmluZyBleHRlbnNpb25Qb2ludElkID0gZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCk7Ci0JCWlmIChleHRlbnNpb25Qb2ludElkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJLmdldEV4dGVuc2lvblBvaW50KGV4dGVuc2lvblBvaW50SWQpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJdHJ5IHsKLQkJCQkJSVdpemFyZEV4dGVuZGVyIGV4dGVuZGVyID0gKElXaXphcmRFeHRlbmRlcikgY29uZmlnRWxlbWVudAotCQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQkJCQl3aXphcmRFeHRlbmRlciA9IGNyZWF0ZVdpemFyZEV4dGVuZGVyKGV4dGVuZGVyKTsKLQotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRDb25maWdFbGVtZW50cyA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldENoaWxkcmVuKCJ3aXphcmRQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2hpbGRDb25maWdFbGVtZW50cy5sZW5ndGg7IGsrKykgewotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZENvbmZpZ0VsZW1lbnQgPSBjaGlsZENvbmZpZ0VsZW1lbnRzW2tdOwotCQkJCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgdHlwZSA9IGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHRhcmdldCA9IGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgidGFyZ2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgaW5zZXJ0ID0gY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJpbnNlcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmICh3aXphcmRQYWdlICE9IG51bGwgJiYgdHlwZSAhPSBudWxsCi0JCQkJCQkJCQkmJiB0eXBlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlpZiAodHlwZS5lcXVhbHMoInJlcGxhY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl3aXphcmRFeHRlbmRlcgotCQkJCQkJCQkJCQkuYWRkUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24obmV3IFJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJCQkJCQkJCQkJCXdpemFyZFBhZ2UsIHRhcmdldCkpOwotCQkJCQkJCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJuZXciKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlib29sZWFuIGluc2VydEFmdGVyID0gdHJ1ZTsKLQkJCQkJCQkJCWlmIChpbnNlcnQgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBpbnNlcnQuZXF1YWxzKCJiZWZvcmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJaW5zZXJ0QWZ0ZXIgPSBmYWxzZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXdpemFyZEV4dGVuZGVyCi0JCQkJCQkJCQkJCS5hZGROZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKG5ldyBOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJCQkJCQkJCQkJCXdpemFyZFBhZ2UsIHRhcmdldCwKLQkJCQkJCQkJCQkJCQlpbnNlcnRBZnRlcikpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlFUEZVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIG5ldyB3aXphcmQgcGFnZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2V0TmV3V2l6YXJkUGFnZXMoTGlzdDxJV2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMpIHsKLQkJTGlzdDxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gY29udHJpYnV0aW9ucyA9IHdpemFyZEV4dGVuZGVyCi0JCQkJLmdldE5ld1dpemFyZFBhZ2VDb250cmlidXRpb25zKCk7Ci0JCWlmIChjb250cmlidXRpb25zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3I8SU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24+IGl0ID0gY29udHJpYnV0aW9ucwotCQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gY29udHJpYnV0aW9uID0gKE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24pIGl0Ci0JCQkJCQkubmV4dCgpOwotCQkJCUlXaXphcmRQYWdlIG5ld1dpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGNvbnRyaWJ1dGlvbgotCQkJCQkJLmdldFdpemFyZFBhZ2UoKTsKLQkJCQlTdHJpbmcgdGFyZ2V0V2l6YXJkUGFnZU5hbWUgPSBjb250cmlidXRpb24KLQkJCQkJCS5nZXRUYXJnZXRXaXphcmRQYWdlKCk7Ci0JCQkJaWYgKHRhcmdldFdpemFyZFBhZ2VOYW1lICE9IG51bGwpIHsKLQkJCQkJaW50IHRvdGFsUGFnZXMgPSB3aXphcmRQYWdlcy5zaXplKCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoSXRlcmF0b3I8SVdpemFyZFBhZ2U+IGl0ZXIgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyB3aXphcmRQYWdlcwotCQkJCQkJCS5zaXplKCkgPT0gdG90YWxQYWdlcwotCQkJCQkJCSYmIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJSVdpemFyZFBhZ2UgcGFnZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHBhZ2UuZ2V0TmFtZSgpLmVxdWFscyh0YXJnZXRXaXphcmRQYWdlTmFtZSkpIHsKLQkJCQkJCQlpZiAoY29udHJpYnV0aW9uLmdldEluc2VydEFmdGVyKCkpIHsKLQkJCQkJCQkJd2l6YXJkUGFnZXMuYWRkKGluZGV4ICsgMSwgbmV3V2l6YXJkUGFnZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJd2l6YXJkUGFnZXMuYWRkKGluZGV4LCBuZXdXaXphcmRQYWdlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpbmRleCsrOwotCQkJCQl9Ci0JCQkJCWlmICh3aXphcmRQYWdlcy5zaXplKCkgPT0gdG90YWxQYWdlcykgewotCQkJCQkJd2l6YXJkUGFnZXMuYWRkKG5ld1dpemFyZFBhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0Jhc2VXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0Jhc2VXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2U2MjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9CYXNlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBFUEYgd2l6YXJkIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgbmFtZQotCSAqLwotCXByb3RlY3RlZCBCYXNlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSBuYW1lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgdGl0bGUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSB0aXRsZUltYWdlCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgdGl0bGUgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgQmFzZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCUltYWdlRGVzY3JpcHRvciB0aXRsZUltYWdlKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCB0aXRsZSwgdGl0bGVJbWFnZSk7Ci0JCXNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlvbkVudGVyUGFnZShudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gZW50ZXJpbmcgdGhpcyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBhIGRhdGEgaW5pdGlhbGl6YXRpb24gb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJSVdpemFyZFBhZ2UgbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZSgpOwotCQlpZiAobmV4dFBhZ2UgIT0gbnVsbCAmJiBuZXh0UGFnZSBpbnN0YW5jZW9mIEJhc2VXaXphcmRQYWdlKSB7Ci0JCQl0cnkgewotCQkJCSgoQmFzZVdpemFyZFBhZ2UpIG5leHRQYWdlKS5vbkVudGVyUGFnZShnZXROZXh0UGFnZURhdGEoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkYXRhIGluaXRpYWxpemF0aW9uIG9iamVjdCBmb3IgdGhlIG5leHQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29tcG9zaXRlIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoaWxkIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogPHA+Ci0JICogVGhlIGNoaWxkIGNvbXBvc2l0ZSB3aWxsIGJlIGluZGVudGVkIGZyb20gdGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoaWxkR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgZ3JvdXAgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEdyb3VwIGNyZWF0ZUdyaWRMYXlvdXRHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlR3JpZExheW91dEdyb3VwKHBhcmVudCwgdGV4dCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZ3JvdXAgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgZ3JvdXAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBncm91cCB3aWxsIHRha2UgdXAKLQkgKiBAcGFyYW0gZXF1YWxDb2x1bW5XaWR0aAotCSAqICAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGNvbHVtbiBjZWxscyBzaG91bGQgYmUgc2FtZSB3aWR0aCBvcgotCSAqICAgICAgICAgICAgbm90Ci0JICogQHJldHVybiBhIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEdyb3VwIGNyZWF0ZUdyaWRMYXlvdXRHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4sIGJvb2xlYW4gZXF1YWxDb2x1bW5XaWR0aCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0R3JvdXAocGFyZW50LCB0ZXh0LCBjb2x1bW4sCi0JCQkJZXF1YWxDb2x1bW5XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBsYWJlbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdmVydGljYWxseSBhbGlnbmVkIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LAotCQkJCWhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsCi0JCQlpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbAotCQkJCS5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByZWFkb25seSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwKLQkJCQljb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbgotCSAqIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTXVsdGlMaW5lVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsCi0JCQkJaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDb21ib2JveChwYXJlbnQsIGNvbHVtbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3ggd2l0aCByZWFkb25seSBzdHlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbWJvIGNyZWF0ZVJlYWRPbmx5Q29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVSZWFkT25seUNvbWJvYm94KHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDb21ib2JveChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveChwYXJlbnQsIHRleHQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hlY2tib3gocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJhZGlvIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBzZWxlY3RlZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlbGVjdCB0aGUgcmFkaW8gYnV0dG9uIGJ5IGRlZmF1bHQKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4sIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCB0ZXh0LCBjb2x1bW4sIHNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJhZGlvIGJ1dHRvbiB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVJhZGlvQnV0dG9uKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dFZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0Vmlld2VyIGNyZWF0ZVRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHRWaWV3ZXIocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgdmlld2VyIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dFZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0Vmlld2VyIGNyZWF0ZVRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUZXh0Vmlld2VyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUYWJsZVZpZXdlcihwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hlY2tib3hUYWJsZVZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LAotCQkJCWNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNoZWNrYm94VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKHBhcmVudCwgMzYwLCAxNzUsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpbmUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBsaW5lIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTGluZShwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSB0ZXh0IGNvbnRyb2wgaGFzIHNvbWUgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc05vbkVtcHR5VGV4dChUZXh0IGNvbnRyb2wpIHsKLQkJcmV0dXJuIFNXVFV0aWwuaXNOb25FbXB0eVRleHQoY29udHJvbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZGY2ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9JTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBuZXcgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXcgd2l6YXJkIHBhZ2UgdGhhdCBpcyBiZWluZyBhZGRlZCB0byBhIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRXaXphcmRQYWdlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRoYXQgaXMgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IKLQkgKiBpbnNlcnRpbmcgdGhlIG5ldyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIGJhc2Ugd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFdpemFyZFBhZ2UoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc2VydGlvbiBvcHRpb24gZm9yIHRoZSBuZXcgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmV3IHdpemFyZCBwYWdlIHNob3VsZCBiZSBpbnNlcnRlZAotCSAqICAgICAgICAgYWZ0ZXIgdGhlIHRhcmdldCB3aXphcmQgcGFnZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHNob3VsZAotCSAqICAgICAgICAgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSB0YXJnZXQgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnNlcnRBZnRlcigpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9JUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3YmQxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByZXBsYWNlIHdpemFyZCBwYWdlIGNvbnRyaWJ1dGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcmVwbGFjZXMgYSBzcGVjaWZpYyB3aXphcmQgcGFnZSBpbiBhIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRXaXphcmRQYWdlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRoYXQgaXMgc2hvdWxkIGJlIHJlcGxhY2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgYmFzZSB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0V2l6YXJkUGFnZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lXaXphcmRFeHRlbmRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9JV2l6YXJkRXh0ZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmZTc5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lXaXphcmRFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIGdlbmVyaWMgd2l6YXJkIGV4dGVuZGVyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2l6YXJkRXh0ZW5kZXIgewotCi0JLyoqCi0JICogR2l2ZXMgdGhlIHdpemFyZCBleHRlbmRlciBhIGNoYW5jZSB0byBwZXJmb3JtIHNvbWUgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChXaXphcmQgd2l6YXJkKTsKLQotCS8qKgotCSAqIEdpdmVzIHRoZSB3aXphcmQgZXh0ZW5kZXIgYSBjaGFuY2UgdG8gc2F2ZSByZWZlcmVuY2VzIHRvIHdpemFyZCBwYWdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gd2l6YXJkUGFnZXMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gb3duZWQgYnkgdGhlIHdpemFyZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRXaXphcmRQYWdlcyhMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcyk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVwbGFjZSB3aXphcmQgcGFnZSBjb250cmliaXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRyaWJ1dGlvbgotCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2Ugd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQlJUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24gY29udHJpYnV0aW9uKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcmVwbGFjZXMgYSBiYXNlIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCB0byBiZSByZXBsYWNlZAotCSAqIEByZXR1cm4gYSA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgICAgICByZXBsYWNlbWVudCBwYWdlIGlzIGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRSZXBsYWNlV2l6YXJkUGFnZShTdHJpbmcgdGFyZ2V0KTsKLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250cmlidXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCUlOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbik7Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGFycmF5IG9mIG5ldyB3aXphcmQgcGFnZXMgdG8gYmUgYWRkZWQgdG8gYSBiYXNlIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGNvbGxlY3Rpb24gb2YgPGNvZGU+TmV3V2l6YXJkUGFnZUV4ZXRuc2lvbjwvY29kZT4gb2JqZWN0cyBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdDxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKTsKLQotCS8qKgotCSAqIEFsbG93cyBhIHdpemFyZCBleHRlbmRlciB0byBjb250cm9sIHRoZSBmbG93IG9mIHRoZSB3aXphcmQgcGFnZXMuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHdpemFyZCBwYWdlCi0JICogQHJldHVybiB0aGUgbmV4dCB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKTsKLQotCS8qKgotCSAqIEFsbG93cyBhIHdpemFyZCBleHRlbmRlciB0byBkZWNpZGUgd2hldGhlciB0aGUgd2l6YXJkIGNvdWxkIGJlIGZpbmlzaGVkCi0JICogd2l0aG91dCBmdXJ0aGVyIHVzZXIgaW50ZXJhY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgd2l6YXJkIGNvdWxkIGJlIGZpbmlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBBbGxvd3MgYSB3aXphcmQgZXh0ZW5kZXIgdG8gcGVyZm9ybSB0aGUgZmluaXNoIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaW5pc2ggb3BlcmF0aW9uIGlzIGV4ZWN1dGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkb0ZpbmlzaCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL05ld1dpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdiNTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgbmV3IHdpemFyZCBwYWdlIGNvbnRyaWJ1dGlvbiBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uIGltcGxlbWVudHMgSU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gewotCi0JcHJpdmF0ZSBJV2l6YXJkUGFnZSBwYWdlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0OwotCi0JcHJpdmF0ZSBib29sZWFuIGluc2VydEFmdGVyID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgd2l6YXJkIHBhZ2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0aGF0IGlzIHVzZWQgYXMgYSByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgIGZvciBpbnNlcmluZyB0aGUgbmV3IHdpemFyZCBwYWdlCi0JICogQHBhcmFtIGluc2VydEFmdGVyCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW5zZXJ0IHRoZSBuZXcgd2l6YXJkIHBhZ2UgYWZ0ZXIgdGhlCi0JICogICAgICAgICAgICB0YXJnZXQgd2l6YXJkIHBhZ2U7IGlmIDxjb2RlPmZhbHNlPC9jb2RlPiwgaW5zZXJ0IHRoZSBuZXcKLQkgKiAgICAgICAgICAgIHdpemFyZCBwYWdlIGJlZm9yZSB0aGUgdGFyZ2V0IHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24oSVdpemFyZFBhZ2UgcGFnZSwgU3RyaW5nIHRhcmdldCwKLQkJCWJvb2xlYW4gaW5zZXJ0QWZ0ZXIpIHsKLQkJdGhpcy5wYWdlID0gcGFnZTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuaW5zZXJ0QWZ0ZXIgPSBpbnNlcnRBZnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3aXphcmQgcGFnZS4KLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0V2l6YXJkUGFnZSgpIHsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0aGF0IGlzIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yCi0JICogaW5zZXJ0aW5nIHRoZSBuZXcgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFdpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zZXJ0aW9uIG9wdGlvbiBmb3IgdGhlIG5ldyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuZXcgd2l6YXJkIHBhZ2Ugc2hvdWxkIGJlIGluc2VydGVkCi0JICogICAgICAgICBhZnRlciB0aGUgdGFyZ2V0IHdpemFyZCBwYWdlOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgc2hvdWxkCi0JICogICAgICAgICBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHRhcmdldCB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEluc2VydEFmdGVyKCkgewotCQlyZXR1cm4gaW5zZXJ0QWZ0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1JlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1JlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OWIxZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9SZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgcmVwbGFjZW1lbnQgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uIGltcGxlbWVudHMKLQkJSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCXByaXZhdGUgSVdpemFyZFBhZ2UgcGFnZTsKLQotCXByaXZhdGUgU3RyaW5nIHRhcmdldDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSB0aGF0IHJlcGxhY2VzIGEgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgaW4gYQotCSAqICAgICAgICAgICAgd2l6YXJkCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdGhhdCBpcyBzaG91bGQgYmUgcmVwbGFjZWQKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oSVdpemFyZFBhZ2UgcGFnZSwgU3RyaW5nIHRhcmdldCkgewotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3aXphcmQgcGFnZSB0aGF0IHJlcGxhY2VzIGEgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgaW4gYSB3aXphcmQuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0V2l6YXJkUGFnZSgpIHsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0aGF0IGlzIHNob3VsZCBiZSByZXBsYWNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIGJhc2Ugd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFdpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1dpemFyZENhdGVnb3JpZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvV2l6YXJkQ2F0ZWdvcmllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDYwYWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvV2l6YXJkQ2F0ZWdvcmllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLS8qKgotICogVGhlIEVQRiB3aXphcmQgY2F0ZWdvcmllcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRDYXRlZ29yaWVzIHsKLQotCS8qKgotCSAqIFRoZSBOZXcgV2l6YXJkcyBDYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfV0laQVJEU19DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBFeHBvcnQgV2l6YXJkcyBDYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfV0laQVJEU19DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBJbXBvcnQgV2l6YXJkcyBDYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfV0laQVJEU19DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9XaXphcmRFeHRlbmRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9XaXphcmRFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM1MDg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvV2l6YXJkRXh0ZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHdpemFyZCBleHRlbmRlciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRFeHRlbmRlciBpbXBsZW1lbnRzIElXaXphcmRFeHRlbmRlciB7Ci0KLQlwcm90ZWN0ZWQgV2l6YXJkIHdpemFyZDsKLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJV2l6YXJkUGFnZT4gcmVwbGFjZVdpemFyZFBhZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJV2l6YXJkUGFnZT4oKTsKLQotCXByb3RlY3RlZCBMaXN0PElOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uPiBuZXdXaXphcmRQYWdlQ29udHJpYml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXaXphcmRFeHRlbmRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNpbml0KFdpemFyZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFdpemFyZCB3aXphcmQpIHsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjaW5pdChXaXphcmQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdFdpemFyZFBhZ2VzKExpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjYWRkUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbikgewotCQlyZXBsYWNlV2l6YXJkUGFnZXMucHV0KGNvbnRyaWJ1dGlvbi5nZXRUYXJnZXRXaXphcmRQYWdlKCksIGNvbnRyaWJ1dGlvbgotCQkJCS5nZXRXaXphcmRQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyI2dldFJlcGxhY2VXaXphcmRQYWdlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU3RyaW5nIHRhcmdldCkgewotCQlyZXR1cm4gKElXaXphcmRQYWdlKSByZXBsYWNlV2l6YXJkUGFnZXMuZ2V0KHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjYWRkTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJSU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gY29udHJpYnV0aW9uKSB7Ci0JCW5ld1dpemFyZFBhZ2VDb250cmliaXRpb25zLmFkZChjb250cmlidXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyI2dldE5ld1dpemFyZFBhZ2VDb250cmlidXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgTGlzdDxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKSB7Ci0JCXJldHVybiBuZXdXaXphcmRQYWdlQ29udHJpYml0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNnZXROZXh0UGFnZShJV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQkvLyBMZXQgdGhlIGJhc2Ugd2l6YXJkIGRyaXZlcyB0aGUgcGFnZSBmbG93LgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjZG9GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1OWE3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1NzY4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG87dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYWZkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0ZjRjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBVTUEgRWNvcmUgRXh0ZW5zaW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE0MDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJmZWF0dXJlRGVsZWdhdGUiIG5hbWU9IkZlYXR1cmUgRGVsZWdhdGUiIHNjaGVtYT0ic2NoZW1hL2ZlYXR1cmVEZWxlZ2F0ZS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtZXRob2RFbGVtZW50SUFkYXB0YWJsZSIgbmFtZT0iTWV0aG9kIEVsZW1lbnQgSUFkYXB0YWJsZSIgc2NoZW1hPSJzY2hlbWEvbWV0aG9kRWxlbWVudElBZGFwdGFibGUuZXhzZCIvPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc2NoZW1hL2ZlYXR1cmVEZWxlZ2F0ZS5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zY2hlbWEvZmVhdHVyZURlbGVnYXRlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGIyMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zY2hlbWEvZmVhdHVyZURlbGVnYXRlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSIgaWQ9ImZlYXR1cmVEZWxlZ2F0ZSIgbmFtZT0iRmVhdHVyZSBEZWxlZ2F0ZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVsZWdhdGUiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlbGVnYXRlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLklGZWF0dXJlRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc2NoZW1hL21ldGhvZEVsZW1lbnRJQWRhcHRhYmxlLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NjaGVtYS9tZXRob2RFbGVtZW50SUFkYXB0YWJsZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWUzOGQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc2NoZW1hL21ldGhvZEVsZW1lbnRJQWRhcHRhYmxlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSIgaWQ9Im1ldGhvZEVsZW1lbnRJQWRhcHRhYmxlIiBuYW1lPSJNZXRob2QgRWxlbWVudCBJQWRhcHRhYmxlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhbiBleHRlbnNpb24gdG8gcHJvdmlkZSBhZGFwdGVycyBmb3IgTWV0aG9kRWxlbWVudCAodmlhIHRoZSBJQWRhcHRhYmxlIGludGVyZmFjZSkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0ZXJGYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSU1vZGVsT2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lNb2RlbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM4MmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSU1vZGVsT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IGFsbCBVTUEgbW9kZWwgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgZHluYW1pYyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgc3VwcG9ydCBiZXR3ZWVuCi0gKiBtb2RlbCBvYmplY3RzIHRocm91Z2ggdGhlIHVzZSBvZiBvcHBvc2l0ZSBmZWF0dXJlcy4gSXQgYWxzbyBhbGxvd3MgdGhlCi0gKiBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZSwgYXMgZGVmaW5lZCBpbiBhIG1ldGFsIG1vZGVsLCB0byBiZSBvdmVyd3JpdHRlbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxPYmplY3QgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIHdheSB0byBxdWVyeSB0aGUgb3ZlcnJpZGVuIGRlZmF1bHQgdmFsdWUgZGVmaW5lZCBpbiB0aGUKLQkgKiBtZXRhLW1vZGVsIGZvciBhIFVNQSBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYSBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBmZWF0dXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIG9wcG9zaXRlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlKTsKLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBvcHBvc2l0ZSBmZWF0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtb2RlbCBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2Ygb3Bwb3NpdGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lQcm94eVJlc29sdXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGIwN2Y4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcHJveHkgcmVzb2x1dGlvbiBsaXN0ZW5lciBhdHRhY2hlZCB0byBhIFVNQSByZXNvdXJjZSBzZXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiBhbiBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQgd2hpbGUgcmVzb2x2aW5nIGEKLQkgKiBwcm94eSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQKLQkgKi8KLQl2b2lkIG5vdGlmeUV4Y2VwdGlvbihFeGNlcHRpb24gZSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gdGhhdCBhIHByb3h5IGhhcyBiZWVuIHJlc29sdmVkIHN1Y2Nlc3NmdWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAgICAgICAgICAgIGEgcHJveHkgb2JqZWN0Ci0JICogQHBhcmFtIHJlc29sdmVkCi0JICogICAgICAgICAgICB0aGUgcmVzb2x2ZWQgb2JqZWN0Ci0JICovCi0Jdm9pZCBwcm94eVJlc29sdmVkKE9iamVjdCBwcm94eSwgT2JqZWN0IHJlc29sdmVkKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JVW1hUmVzb3VyY2VTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVVtYVJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDc1YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JVW1hUmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIFVNQSByZXNvdXJjZSBzZXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVtYVJlc291cmNlU2V0IGV4dGVuZHMgUmVzb3VyY2VTZXQgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbW9kZWwgb2JqZWN0IHJlc29sdmVkIGJ5IGEgVVJJLgotCSAqIAotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqICAgICAgICAgICAgdGhlIHByb3h5IHJlc29sdmVyCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIFVSSSB1c2VkIHRvIHJlc29sdmUgdGhlIHByb3h5Ci0JICogQHBhcmFtIGxvYWRPbkRlbWFuZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGNyZWF0ZSBhbmQgbG9hZCB0aGUgcmVzb3VyY2UgaWYgaXQKLQkgKiAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0cwotCSAqIEByZXR1cm4gdGhlIG1vZGVsIG9iamVjdCByZXNvbHZlZCBieSB0aGUgVVJJCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChFT2JqZWN0LCBVUkksIGJvb2xlYW4pCi0JICovCi0JRU9iamVjdCBnZXRFT2JqZWN0KEVPYmplY3QgcmVzb2x2ZXIsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9SZXNvbHZlRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL1Jlc29sdmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwOWJlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL1Jlc29sdmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgcmVzb2x2aW5nIGEgcHJveHkgb2JqZWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb2x2ZUV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODQxMjgxNTgxNDYzNjA4MUw7Ci0KLQlwcml2YXRlIEVPYmplY3QgcHJveHk7Ci0KLQlwcml2YXRlIEVPYmplY3QgcmVzb2x2ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgYSBwcm94eSBvYmplY3QKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBhbiBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICogICAgICAgICAgICB0aGUgcHJveHkgcmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgUmVzb2x2ZUV4Y2VwdGlvbihFT2JqZWN0IHByb3h5LCBTdHJpbmcgbXNnLCBFT2JqZWN0IHJlc29sdmVyKSB7Ci0JCXN1cGVyKG1zZywgbnVsbCk7Ci0JCXRoaXMucHJveHkgPSBwcm94eTsKLQkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duCi0JICovCi0JcHVibGljIFJlc29sdmVFeGNlcHRpb24oRU9iamVjdCBwcm94eSwgRXhjZXB0aW9uIGV4Y2VwdGlvbiwgRU9iamVjdCByZXNvbHZlcikgewotCQlzdXBlcihleGNlcHRpb24pOwotCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm94eSBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJveHkgb2JqZWN0Ci0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0UHJveHkoKSB7Ci0JCXJldHVybiBwcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm94eSByZXNvbHZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm94eSByZXNvbHZlcgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFJlc29sdmVyKCkgewotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvbHZlRXhjZXB0aW9uKSB7Ci0JCQlSZXNvbHZlRXhjZXB0aW9uIHJlID0gKFJlc29sdmVFeGNlcHRpb24pIG9iajsKLQkJCWlmICgocmVzb2x2ZXIgPT0gcmUucmVzb2x2ZXIpIHx8IChyZXNvbHZlciA9PSBudWxsICYmIHJlLnJlc29sdmVyID09IG51bGwpKSB7Ci0JCQkJaWYgKHByb3h5ID09IHJlLnByb3h5KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCAmJiByZS5wcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQkJcmV0dXJuIHVyaS5lcXVhbHMoKChJbnRlcm5hbEVPYmplY3QpIHJlLnByb3h5KQotCQkJCQkJCQkuZVByb3h5VVJJKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKHByb3h5IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQlpbnQgaGMgPSByZXNvbHZlciA9PSBudWxsID8gMCA6IHJlc29sdmVyLmhhc2hDb2RlKCk7Ci0JCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByb3h5KS5lUHJveHlVUkkoKTsKLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCXJldHVybiAoSW50ZWdlci50b1N0cmluZyhoYykgKyB1cmkpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaGM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvTXVsdGlSZXNvdXJjZUVPYmplY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9NdWx0aVJlc291cmNlRU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGM5NjQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9NdWx0aVJlc291cmNlRU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuSW50ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLlJlc29sdmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkRlZmF1bHRWYWx1ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3Q7Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBVTUEgbW9kZWwgb2JqZWN0cy4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgRU1GIHN0b3JlcyBtb2RlbCBvYmplY3RzIHJlbGF0ZWQgdmlhIGEgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwCi0gKiBpbiBhIHNpbmdsZSBYTUkgZmlsZS4gVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBkZWZhdWx0IEVNRiBwZXJzaXN0ZW5jZSBiZWhhdmlvcgotICogYnkgcHJvdmlkaW5nIGEgbWVjaGFuaXNtIGZvciB0aGUgY29udGFpbmluZyBhbmQgY29udGFpbmVkIG9iamVjdHMgdG8gYmUKLSAqIHN0b3JlZCBpbiBzZXBhcmF0ZSBYTUkgZmlsZXMuIENvbnRhaW5lZCBvYmplY3RzIGFyZSBsYXp5IGxvYWRlZCwgd2hlbgotICogcmVxdWlyZWQsIHNpbWlsYXIgdG8gdGhlIHByb3h5IG9iamVjdCBiZWhhdmlvciBvZiBFTUYncyBzdGFuZGFyZCByZXNvdXJjZQotICogaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVJlc291cmNlRU9iamVjdCBleHRlbmRzIEVEYXRhT2JqZWN0SW1wbCBpbXBsZW1lbnRzCi0JCUlNb2RlbE9iamVjdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4MTI2OTQ3MTUzMDk3MjczTDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdFZhbHVlTWFuYWdlciBkZWZhdWx0VmFsdWVNYW5hZ2VyID0gRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGZlYXR1cmUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgZm9yIG1pZ3JhdGlvbiB1c2Ugb25seS4gRG8gbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGZlYXR1cmUgc2luY2UgaXQgd2lsbCBzbG93IGRvd24KLQkgKiB0aGUgbG9hZGluZyBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewkJCi0JCXNldERlZmF1bHRWYWx1ZShmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKSwgZmVhdHVyZSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZWZhdWx0VmFsdWUoRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCWRlZmF1bHRWYWx1ZU1hbmFnZXIuc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZmVhdHVyZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCBmb3IgbWlncmF0aW9uIHVzZSBvbmx5LiBEbyBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZSBzaW5jZSBpdCB3aWxsIHNsb3cgZG93bgotCSAqIHRoZSBsb2FkaW5nIG9mIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZW1vdmVEZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZGVmYXVsdFZhbHVlTWFuYWdlci5yZW1vdmVEZWZhdWx0VmFsdWUoZmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZW1vdmVEZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVDbGFzcyB0eXBlKSB7Ci0JCWRlZmF1bHRWYWx1ZU1hbmFnZXIucmVtb3ZlRGVmYXVsdFZhbHVlKGZlYXR1cmUsIHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBBIG1hcCBvZiBlbnRyaWVzIG9mIE9wcG9zaXRlRmVhdHVyZSAvIE9wcG9zaXRlRmVhdHVyZSdzIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc09wcG9zaXRlRmVhdHVyZSA9IHRydWU7Ci0KLQlwcml2YXRlIEJvb2xlYW4gbm90aWZ5T3Bwb3NpdGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQotCS8qKgotCSAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBpcyB2YWxpZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcHBvc2l0ZUFkZChPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCh0aGlzLCBvcHBvc2l0ZUZlYXR1cmUpOwotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQkJaWYgKCFsaXN0LmNvbnRhaW5zKG9iamVjdCkpIHsKLQkJCWxpc3QuYWRkKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcHBvc2l0ZVJlbW92ZShPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCh0aGlzLCBvcHBvc2l0ZUZlYXR1cmUpOwotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQkJbGlzdC5yZW1vdmUob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gcHJveHkgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIGEgcHJveHkgb2JqZWN0IHRvIHJlc29sdmUKLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJlc29sdmUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0Ci0JCQkJJiYgKChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCkuZUlzUHJveHkoKSkgewotCQkJcmV0dXJuIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCXByaXZhdGUgdm9pZCByZXBsYWNlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsCi0JCQlJbnRlcm5hbEVPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlICE9IG51bGwgJiYgIW5ld1ZhbHVlLmVJc1Byb3h5KCkgJiYgbmV3VmFsdWUgIT0gb2xkVmFsdWUpIHsKLQkJCWJvb2xlYW4gbm90aWZ5ID0gZURlbGl2ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCUVjb3JlVXRpbC5yZXBsYWNlKHRoaXMsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpUmVzb3VyY2VFT2JqZWN0LnJlcGxhY2UoKToiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgb2JqZWN0OiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGZlYXR1cmU6ICIgKyBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgcHJveHk6ICIgKyBvbGRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIHJlc29sdmVkOiAiICsgbmV3VmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQllU2V0RGVsaXZlcihub3RpZnkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwjZU5vdGlmeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8qCi0JCSAqIGlmKCFPcHBvc2l0ZUZlYXR1cmUuaXNEZWxpdmVyT25SZXNvbHZlKCkgJiYgbXNnLmdldEV2ZW50VHlwZSgpID09Ci0JCSAqIE5vdGlmaWNhdGlvbi5SRVNPTFZFKSB7IHJldHVybjsgfQotCQkgKi8KLQotCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRVNPTFZFKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU9iamVjdCBmID0gbXNnLmdldEZlYXR1cmUoKTsKLQkJaWYgKGYgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCkgewotCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG9sZE90aGVyRW5kOwotCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG90aGVyRW5kOwotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkJb2xkT3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW9sZE90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG9sZE90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvbGRPdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkT3RoZXJFbmQub3Bwb3NpdGVSZW1vdmUob3Bwb3NpdGVGZWF0dXJlLCBtc2cKLQkJCQkJCQkJCS5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG1zZy5nZXROZXdWYWx1ZSgpLCBvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvYmo7Ci0JCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgb2JqLCBvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKQotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlUmVtb3ZlKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZVJlbW92ZShvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG9iajsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBvYmosIG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQkJRU9iamVjdCBvbGRWYWx1ZSA9IChFT2JqZWN0KSBvdGhlckVuZAotCQkJCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQoCi0JCQkJCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkJLy8gcmVtb3ZlIG90aGVyRW5kIGZyb20gdGFyZ2V0IGZlYXR1cmUgb2YKLQkJCQkJCQkJCS8vIG9sZFZhbHVlCi0JCQkJCQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlCi0JCQkJCQkJCQkJCS5lR2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGYpKQotCQkJCQkJCQkJCQkucmVtb3ZlKG90aGVyRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgbXNnLmdldE5ld1ZhbHVlKCksIG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJRU9iamVjdCBvbGRWYWx1ZSA9IChFT2JqZWN0KSBvdGhlckVuZAotCQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyByZW1vdmUgb3RoZXJFbmQgZnJvbSB0YXJnZXQgZmVhdHVyZSBvZgotCQkJCQkJCQkvLyBvbGRWYWx1ZQotCQkJCQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlCi0JCQkJCQkJCQkJLmVHZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZikpCi0JCQkJCQkJCQkJLnJlbW92ZShvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBtc2cuZ2V0TmV3VmFsdWUoKSwgb3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQlFT2JqZWN0IG9sZFZhbHVlID0gKEVPYmplY3QpIG90aGVyRW5kCi0JCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KAotCQkJCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIHNldCB0aGUgdGFyZ2V0IGZlYXR1cmUgb2Ygb2xkVmFsdWUgdG8gbnVsbAotCQkJCQkJCQlvbGRWYWx1ZS5lU2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGYsIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLQkJCQkJCQlpZighdGFyZ2V0RmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlvbGRPdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQkJCWlmKG9sZE90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQkJCW9sZE90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCS8vIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQlicmVhazsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZU5vdGlmeShtc2cpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbCNlTm90aWZpY2F0aW9uUmVxdWlyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVOb3RpZmljYXRpb25SZXF1aXJlZCgpIHsKLQkJaWYgKCFlRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5lRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChub3RpZnlPcHBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlpZiAoT3Bwb3NpdGVGZWF0dXJlLmZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJbm90aWZ5T3Bwb3NpdGUgPSBCb29sZWFuLkZBTFNFOwotCQkJfSBlbHNlIHsKLQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gT3Bwb3NpdGVGZWF0dXJlLmZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAKLQkJCQkJCS5rZXlTZXQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWlmIChmZWF0dXJlcy5jb250YWlucyhpdGVyLm5leHQoKSkpIHsKLQkJCQkJCW5vdGlmeU9wcG9zaXRlID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG5vdGlmeU9wcG9zaXRlID09IG51bGwpIHsKLQkJCQkJbm90aWZ5T3Bwb3NpdGUgPSBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobm90aWZ5T3Bwb3NpdGUuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLmVOb3RpZmljYXRpb25SZXF1aXJlZCgpOwotCX0KLQotCS8qCi0JICogcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkUmVzb3VyY2VzKCkgeyBMaXN0IGNoaWxkcmVuID0gZUNvbnRlbnRzKCk7IGludAotCSAqIHNpemUgPSBjaGlsZHJlbi5zaXplKCk7IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JICogTXVsdGlSZXNvdXJjZUVPYmplY3QgY2hpbGQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGNoaWxkcmVuLmdldChpKTsKLQkgKiBSZXNvdXJjZSByZXNvdXJjZSA9IGNoaWxkLmVSZXNvdXJjZSgpOyBpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSAhPQotCSAqIGVSZXNvdXJjZSgpKSB7IGNoaWxkLnJlbW92ZUNoaWxkUmVzb3VyY2VzKCk7IH0gKChJbnRlcm5hbEVMaXN0KQotCSAqIHJlc291cmNlLmdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKHRoaXMsIG51bGwpOwotCSAqIGNoaWxkLmVQcm9wZXJ0aWVzKCkuc2V0RVJlc291cmNlKG51bGwpOyB9IH0KLQkqLwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VCYXNpY1NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbikKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljU2V0Q29udGFpbmVyKEludGVybmFsRU9iamVjdCBuZXdDb250YWluZXIsCi0JCQlpbnQgbmV3Q29udGFpbmVyRmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJlc291cmNlLkludGVybmFsIG9sZFJlc291cmNlID0gdGhpcy5lRGlyZWN0UmVzb3VyY2UoKTsKLQkJUmVzb3VyY2UuSW50ZXJuYWwgbmV3UmVzb3VyY2UgPSBuZXdDb250YWluZXIgPT0gbnVsbCA/IG51bGwKLQkJCQk6IG5ld0NvbnRhaW5lci5lSW50ZXJuYWxSZXNvdXJjZSgpOwotCQkvLyBpZiAob2xkUmVzb3VyY2UgIT0gbmV3UmVzb3VyY2UgJiYgb2xkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkvLyByZW1vdmVDaGlsZFJlc291cmNlcygpOwotCQkvLyB9Ci0KLQkJaW50IG9sZEluZGV4ID0gLTE7Ci0JCWludCBvbGRTaXplID0gLTE7Ci0JCWlmIChvbGRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlvbGRJbmRleCA9IG9sZFJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZih0aGlzKTsKLQkJCW9sZFNpemUgPSBvbGRSZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJfQotCi0JCU5vdGlmaWNhdGlvbkNoYWluIG1lc3NhZ2VzID0gc3VwZXIuZUJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwKLQkJCQluZXdDb250YWluZXJGZWF0dXJlSUQsIG1zZ3MpOwotCQlpZiAob2xkUmVzb3VyY2UgIT0gbmV3UmVzb3VyY2UgJiYgb2xkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGFueSBuZXdseSBhZGRlZCBNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXJzIGZyb20gdGhpcwotCQkJLy8gb2JqZWN0J3MgYWRhcHRlciBsaXN0Ci0JCQkvLwotCQkJaWYgKG5ld1Jlc291cmNlICE9IG51bGwpCi0JCQkJbmV3UmVzb3VyY2UuZGV0YWNoZWQodGhpcyk7Ci0KLQkJCS8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlbWFudGljOiBNdWx0aVJlc291cmNlRU9iamVjdCBpcyBhbGxvd2VkIHRvCi0JCQkvLyBiZSBvd25lZCBieSBib3RoIGNvbnRhaW5lciBhbmQgcmVzb3VyY2UuCi0JCQkvLyBBZGQgdGhpcyBvYmplY3QgYmFjayB0byB0aGUgb2xkIHJlc291cmNlLgotCQkJLy8KLQkJCUJhc2ljRUxpc3QgY29udGVudHMgPSAoKEJhc2ljRUxpc3QpIG9sZFJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQkJaWYgKG9sZFNpemUgIT0gY29udGVudHMuc2l6ZSgpKSB7Ci0JCQkJLy8gdGhpcyBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzCi0JCQkJLy8gYWRkIGl0IGJhY2sKLQkJCQkvLwotCQkJCWlmIChjb250ZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gdGhpcyB3aWxsIGZsYWcgcmVzb3VyY2UgYXMgbG9hZGVkCi0JCQkJCS8vCi0JCQkJCWNvbnRlbnRzLmNsZWFyKCk7Ci0JCQkJCWNvbnRlbnRzLnNldERhdGEoMSwgbmV3IE9iamVjdFtdIHsgdGhpcyB9KTsKLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3RbXSBkYXRhID0gY29udGVudHMudG9BcnJheSgpOwotCQkJCQlPYmplY3RbXSBuZXdEYXRhID0gbmV3IE9iamVjdFtkYXRhLmxlbmd0aCArIDFdOwotCQkJCQlpZiAob2xkSW5kZXggPiAwKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIG9sZEluZGV4KTsKLQkJCQkJfQotCQkJCQluZXdEYXRhW29sZEluZGV4XSA9IHRoaXM7Ci0JCQkJCWlmIChvbGRJbmRleCA8IGRhdGEubGVuZ3RoKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9sZEluZGV4LCBuZXdEYXRhLCBvbGRJbmRleCArIDEsCi0JCQkJCQkJCWRhdGEubGVuZ3RoIC0gb2xkSW5kZXgpOwotCQkJCQl9Ci0JCQkJCWNvbnRlbnRzLnNldERhdGEobmV3RGF0YS5sZW5ndGgsIG5ld0RhdGEpOwotCQkJCX0KLQkJCX0KLQkJCWVTZXRSZXNvdXJjZShvbGRSZXNvdXJjZSk7Ci0JCQkvLyBkb24ndCBoYXZlIHRvIHJlLWF0dGFjaCB0aGlzIG9iamVjdCB0byBvbGRSZXNvdXJjZSBzaW5jZSBpdCB3YXMKLQkJCS8vIG5vdCBkZXR0YWNoZWQgaW4gc3VwZXIgbWV0aG9kCi0JCQkvLwotCQkJLy8gb2xkUmVzb3VyY2UuYXR0YWNoZWQodGhpcyk7Ci0KLQkJCS8vIGlmKG5ld1Jlc291cmNlICE9IG51bGwpIG5ld1Jlc291cmNlLmF0dGFjaGVkKHRoaXMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250YWluZXIgYW5kIGNvbnRhaW5lciBmZWF0dXJlIElEIGZvciB0aGlzIG9iamVjdCBvbmx5IGlmIGl0IGlzCi0JICogbm90IGNvbnRhaW5lZCBieSBhbnkgY29udGFpbmVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuQmFzaWNFT2JqZWN0SW1wbCNlQmFzaWNTZXRDb250YWluZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0Q29udGFpbmVyKEludGVybmFsRU9iamVjdCBuZXdDb250YWluZXIsCi0JCQlpbnQgbmV3Q29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZUludGVybmFsQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiAhY29udGFpbmVyLmVJc1Byb3h5KCkpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLmVCYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsIG5ld0NvbnRhaW5lckZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VCYXNpY1NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVCYXNpY1NldENvbnRhaW5lcihJbnRlcm5hbEVPYmplY3QgbmV3Q29udGFpbmVyLAotCQkJaW50IG5ld0NvbnRhaW5lckZlYXR1cmVJRCkgewotCQlzdXBlci5lQmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBuZXdDb250YWluZXJGZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRhaW5pbmcgcmVzb3VyY2UgZm9yIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZXMKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0UmVzb3VyY2UoUmVzb3VyY2UuSW50ZXJuYWwgcmVzKSB7Ci0JCWVQcm9wZXJ0aWVzKCkuc2V0RVJlc291cmNlKHJlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VEaXJlY3RSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIEludGVybmFsIGVEaXJlY3RSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmVEaXJlY3RSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIG9iamVjdCByZXByZXNlbnRlZCBieSBwcm94eS4gUHJveHkgY2hhaW5zIGFyZQotCSAqIGZvbGxvd2VkLiBJZiByZXNvdXJjZVNldCBpcyBudWxsLCB0aGUgZ2xvYmFsIHBhY2thZ2UgcmVnaXN0cnkgaXMKLQkgKiBjb25zdWx0ZWQgdG8gb2J0YWluIGEgcGFja2FnZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIHByb3h5IFVSSSwgbGVzcyBpdHMKLQkgKiBmcmFnbWVudCwgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBkZWZhdWx0IHJlc291cmNlIHNldCBpbXBsZW1lbnRhdGlvbidzCi0JICogZmFsbGJhY2sgYmVoYXZpb3VyLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgdGhlIHByb3h5IHRvIGJlIHJlc29sdmVkLgotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHNldCBpbiB3aGljaCB0byByZXNvbHZlLgotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG9iamVjdCwgb3IgdGhlIHByb3h5IGlmIHVuYWJsZSB0byByZXNvbHZlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsI3Jlc29sdmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHJpdmF0ZSBFT2JqZWN0IHJlc29sdmVQcm94eShFT2JqZWN0IHByb3h5KSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZVJlc291cmNlKCkgIT0gbnVsbCA/IGVSZXNvdXJjZSgpCi0JCQkJLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCi0JCVVSSSBwcm94eVVSSSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm94eSkuZVByb3h5VVJJKCk7Ci0JCWlmIChwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUVPYmplY3QgcmVzb2x2ZWRPYmplY3QgPSBudWxsOwotCi0JCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSVVtYVJlc291cmNlU2V0KSB7Ci0JCQkJCQlyZXNvbHZlZE9iamVjdCA9ICgoSVVtYVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkKLQkJCQkJCQkJLmdldEVPYmplY3QodGhpcywgcHJveHlVUkksIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb2x2ZWRPYmplY3QgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHByb3h5VVJJLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUVQYWNrYWdlIGVQYWNrYWdlID0gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0RVBhY2thZ2UocHJveHlVUkkudHJpbUZyYWdtZW50KCkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChlUGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVQYWNrYWdlLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlyZXNvbHZlZE9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QocHJveHlVUkkKLQkJCQkJCQkJCS5mcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHJlc29sdmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJaWYocmVzb2x2ZWRPYmplY3QgIT0gcHJveHkpIHsKLS8vCQkJCQkJcmV0dXJuIHJlc29sdmVQcm94eShyZXNvbHZlZE9iamVjdCk7Ci0JCQkJCQlyZXR1cm4gcmVzb2x2ZWRPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCSgoSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSByZXNvdXJjZVNldCkKLQkJCQkJCQkJLm5vdGlmeUV4Y2VwdGlvbihuZXcgUmVzb2x2ZUV4Y2VwdGlvbihwcm94eSwKLQkJCQkJCQkJCQkoU3RyaW5nKSBudWxsLCB0aGlzKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgewotCQkJCQkoKElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgcmVzb3VyY2VTZXQpCi0JCQkJCQkJLm5vdGlmeUV4Y2VwdGlvbihuZXcgUmVzb2x2ZUV4Y2VwdGlvbihwcm94eSwKLQkJCQkJCQkJCWV4Y2VwdGlvbiwgdGhpcykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VSZXNvbHZlUHJveHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBlUmVzb2x2ZVByb3h5KEludGVybmFsRU9iamVjdCBwcm94eSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHByb3h5LmVDb250YWluZXIoKTsKLQkJaW50IGZlYXR1cmVJRCA9IHByb3h5LmVDb250YWluZXJGZWF0dXJlSUQoKTsKLQkJRU9iamVjdCByZXN1bHQgPSBudWxsOwotCi0JCXJlc3VsdCA9IHJlc29sdmVQcm94eShwcm94eSk7Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQlpZiAocHJveHkuZUlzUHJveHkoKSAmJiByZXN1bHQgPT0gcHJveHkpIHsKLQkJCQkvLyBwcm94eSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkJCQkvLwotCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkudmFsaWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KS52YWxpZCA9IHRydWU7Ci0KLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KS5lU2V0Q29udGFpbmVyKAotCQkJCQkJCShJbnRlcm5hbEVPYmplY3QpIGNvbnRhaW5lciwgZmVhdHVyZUlEKTsKLQkJCQl9Ci0KLQkJCQkvLyBtZXJnZSB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBtYXAKLQkJCQkvLwotCQkJCWlmIChyZXN1bHQgIT0gcHJveHkpIHsKLQkJCQkJaWYocHJveHkgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXlPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHByb3h5OwotCi0JCQkJCQlpZiAobXlPYmoub3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwKLQkJCQkJCQkJJiYgIW15T2JqLm9wcG9zaXRlRmVhdHVyZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlNYXAgbmV3TWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KQotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBteU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKQotCQkJCQkJCQkJLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBuZXdNYXAKLQkJCQkJCQkJCQkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCQkJCQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCW5ld01hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlbnRyeQotCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSBlbnRyeQotCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCW5ld01hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlbnRyeQotCQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCW15T2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZVJlc291cmNlKCkgIT0gbnVsbCA/IGVSZXNvdXJjZSgpCi0JCQkJCQkJLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCSgoSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSByZXNvdXJjZVNldCkucHJveHlSZXNvbHZlZCgKLQkJCQkJCQkJcHJveHksIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgY3JlYXRlT3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gT3Bwb3NpdGVGZWF0dXJlLmNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcAotCQkJCS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlDbGFzcyBjbHMgPSAoQ2xhc3MpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKHRoaXMpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCW1hcC5wdXQoaXRlcmF0b3IubmV4dCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1hcC5pc0VtcHR5KCkpIHsKLQkJCWhhc09wcG9zaXRlRmVhdHVyZSA9IGZhbHNlOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgbWFwcGVkIHRvIHRoZWlyIHZhbHVlcwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwID09IG51bGwgJiYgaGFzT3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVNYXAgPSBjcmVhdGVPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJfQotCQlpZihvcHBvc2l0ZUZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgbWFwcGVkIHRvIHRoZWlyIHZhbHVlcyBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgb3Bwb3NpdGUKLQkgKiAgICAgICAgIGZlYXR1cmUgb3IgdGhlIG1hcCBoYXMgbm90IGJlZW4gY3JlYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSB7Ci0JCXJldHVybiBvcHBvc2l0ZUZlYXR1cmVNYXA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KGZlYXR1cmUpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlSZXNvdXJjZUVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoKToiKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZmVhdHVyZTogIiArIGZlYXR1cmUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiB2YWx1ZTogIiArIHZhbHVlKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgdGhpczogIiArIHRoaXMpOwotCi0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCi0JCQlyZXR1cm4gKChPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCkgdmFsdWUpCi0JCQkJCS5nZXRVbm1vZGlmaWFibGVMaXN0KCk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KGZlYXR1cmUsIG51bGwpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QKLQkJCQkmJiAoKEludGVybmFsRU9iamVjdCkgdmFsdWUpLmVJc1Byb3h5KCkpIHsKLQkJCUVPYmplY3QgcmVzb2x2ZWQgPSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKTsKLQkJCWlmIChyZXNvbHZlZCAhPSB2YWx1ZSkgewotCQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChmZWF0dXJlLCByZXNvbHZlZCk7Ci0JCQkJdmFsdWUgPSByZXNvbHZlZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgYXQgYSBnaXZlbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBsb2NhdGlvbgotCSAqIEByZXR1cm4gYSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZTsKLQkJRmlsZSBmaWxlID0gIG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlCi0JCQkJCQkuZ2V0UGFyZW50KCkpOwotCQkJCWlmKHBhcmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBhcmVudFJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKHBhdGgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLS8vCS8qIChub24tSmF2YWRvYykKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0vLwkgKi8KLS8vCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0vLwkJaWYoYWRhcHRlciA9PSBJUmVzb3VyY2UuY2xhc3MpIHsKLS8vCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUmVzb3VyY2UoKTsKLS8vCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotLy8JCQkJcmV0dXJuIGdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIG9wcG9zaXRlIGZlYXR1cmVzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21BbGxPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQkvLyBmaW5kIGFsbCBmZWF0dXJlcyB0aGF0IGhhdmUgb3Bwb3NpdGUgZmVhdHVyZXMgYW5kIGNsZWFyIHRob3NlCi0JCS8vIGZlYXR1cmVzLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSByZWZlcmVuY2VzIHRvCi0JCS8vIHVubG9hZGVkIG9iamVjdCBieSB0aG9zZSBvcHBvc2l0ZSBmZWF0dXJlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlLmdldE9wcG9zaXRlRmVhdHVyZShyZWYpOwotCQkJaWYob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwpIHsKLQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVHZXQocmVmLCBmYWxzZSk7CQkJCQkKLQkJCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlpZighb3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJbGlzdC5jbGVhcigpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihsaXN0IGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCUxpc3QgYmFzaWNMaXN0ID0gKChJbnRlcm5hbEVMaXN0KWxpc3QpLmJhc2ljTGlzdCgpOwotCQkJCQkJCWZvcihpbnQgaSA9IGJhc2ljTGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgYmFzaWNMaXN0LmdldChpKTsKLQkJCQkJCQkJaWYoIWUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJbGlzdC5yZW1vdmUoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBlR2V0KHJlZiwgZmFsc2UpOwotCQkJCQlpZihlICE9IG51bGwgJiYgIWUuZUlzUHJveHkoKSkgewotCQkJCQkJZVNldChyZWYsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0I2dldE9wcG9zaXRlRmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5rZXlTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0I2dldERlZmF1bHRWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCgpLmdldChmZWF0dXJlKTsKLQkJaWYodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZU1hbmFnZXIuZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKGVDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgYSBmZWF0dXJlIHdob3NlIGRlZmF1bHQgdmFsdWUgaGFzIGJlZW4gb3ZlcnJpZGVuLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU1hcCBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAoKTsKLQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLnJlbW92ZShmZWF0dXJlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYXNzaWduIGRlZmF1bHQgdmFsdWVzIHRoYXQgYXJlIGRlZmluZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSBmb3IgdGhpcyBjbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYXNzaWduRGVmYXVsdFZhbHVlcygpIHsKLQkJZGVmYXVsdFZhbHVlTWFuYWdlci5hc3NpZ25EZWZhdWx0VmFsdWVzKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKAotCQkJaW50IGZlYXR1cmVJRCkgewotCQlNYXAgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKCk7Ci0JCWlmKCFmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJZmVhdHVyZUlEKTsKLQkJCWlmKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuY29udGFpbnNLZXkoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldCgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWUoZmVhdHVyZSk7Ci0JCU9iamVjdCB2YWx1ZSA9IGVHZXQoZmVhdHVyZSwgZmFsc2UpOwotCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAhKChDb2xsZWN0aW9uKSB2YWx1ZSkuaXNFbXB0eSgpCi0JCQkmJiB2YWx1ZSAhPSBkZWZhdWx0VmFsdWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFZhbHVlID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIWRlZmF1bHRWYWx1ZQotCQkJCQkuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQkKLS8vCQkvLyBBbHdheXMgcmV0dXJuIHRydWUgc28gdGhlIGZlYXR1cmUgKHdpdGggZGVmYXVsdCB2YWx1ZSBvdmVycmlkZW4pCi0vLwkJLy8gd2lsbCBiZSBzYXZlZCByZWdhcmRsZXNzIHRoYXQgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9yIG5vdC4KLS8vCQkvLwotLy8JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlNjIyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgVU1BIEVjb3JlIGV4dGVuc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWNhOTA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgRWNvcmUgZXh0ZW5zaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9EZWZhdWx0VmFsdWVNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRGVmYXVsdFZhbHVlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZmNjdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9EZWZhdWx0VmFsdWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZU1hbmFnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVmYXVsdFZhbHVlTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0VmFsdWVNYW5hZ2VyKCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAgPSAKLQkJbmV3IEhhc2hNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PigpOwotCQotCXByaXZhdGUgZmluYWwgTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0Pj4gdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcCA9Ci0JCW5ldyBIYXNoTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSxPYmplY3Q+PigpOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBmZWF0dXJlVG9UeXBlZFN0YXRpY0RlZmF1bHRWYWx1ZXNNYXAgPSAKLQkJbmV3IEhhc2hNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PigpOwotCQotCXByaXZhdGUgZmluYWwgTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0Pj4gdHlwZVRvRmVhdHVyZVN0YXRpY0RlZmF1bHRWYWx1ZU1hcCA9Ci0JCW5ldyBIYXNoTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSxPYmplY3Q+PigpOwotCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHVzZVN0YXRpYzsKLQkKLQlwcm90ZWN0ZWQgRGVmYXVsdFZhbHVlTWFuYWdlcigpIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZVN0YXRpYyhib29sZWFuIHVzZVN0YXRpYykgewotCQl0aGlzLnVzZVN0YXRpYyA9IHVzZVN0YXRpYzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVc2VTdGF0aWMoKSB7Ci0JCXJldHVybiB1c2VTdGF0aWM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKEVDbGFzcyB0eXBlLCAKLQkJCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE1hcDxFQ2xhc3MsIE9iamVjdD4+IGZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcCwKLQkJCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKSB7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwOwotCQlpZihmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBuZXcgSGFzaE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4oKTsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4+IGl0ZXIgPSAKLQkJCQlmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYodHlwZS5nZXRGZWF0dXJlSUQoZmVhdHVyZSkgIT0gLTEpIHsKLQkJCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JCQkJCUVDbGFzcyBzZWxlY3RlZFR5cGUgPSB0eXBlOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PEVDbGFzcywgT2JqZWN0Pj4gaXRlcmF0b3IgPSBlbnRyeS5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5PEVDbGFzcywgT2JqZWN0PiBlbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlFQ2xhc3MgY3VycmVudFR5cGUgPSBlbnQuZ2V0S2V5KCk7Ci0JCQkJCQlpZihjdXJyZW50VHlwZS5pc1N1cGVyVHlwZU9mKHR5cGUpICYmIAotCQkJCQkJCQkoc2VsZWN0ZWRUeXBlID09IG51bGwgfHwgc2VsZWN0ZWRUeXBlLmlzU3VwZXJUeXBlT2YoY3VycmVudFR5cGUpKSkgewotCQkJCQkJCXNlbGVjdGVkVHlwZSA9IGN1cnJlbnRUeXBlOwotCQkJCQkJCWRlZmF1bHRWYWx1ZSA9IGVudC5nZXRWYWx1ZSgpOwotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihmb3VuZCkgewotCQkJCQkJT2JqZWN0IHN0YXRpY0RlZmF1bHRWYWx1ZSA9IGZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcC5nZXQoZmVhdHVyZSk7Ci0JCQkJCQlpZihzdGF0aWNEZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotCQkJCQkJCXN0YXRpY0RlZmF1bHRWYWx1ZSA9IGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZigoZGVmYXVsdFZhbHVlID09IG51bGwgJiYgIHN0YXRpY0RlZmF1bHRWYWx1ZSAhPSBudWxsKQotCQkJCQkJCQl8fCAoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgIWRlZmF1bHRWYWx1ZS5lcXVhbHMoc3RhdGljRGVmYXVsdFZhbHVlKSkpIHsKLQkJCQkJCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAucHV0KGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQkJfQotCQl9Ci0JCXJldHVybiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXA7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAoRUNsYXNzIHR5cGUpIHsKLQkJaWYodXNlU3RhdGljKSB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKHR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGdldEZlYXR1cmVUb0R5bmFtaWNEZWZhdWx0VmFsdWVNYXAodHlwZSk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb0R5bmFtaWNEZWZhdWx0VmFsdWVNYXAoRUNsYXNzIHR5cGUpIHsKLQkJTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSB0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwLmdldCh0eXBlKTsKLQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCh0eXBlLCBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAsCi0JCQkJCWdldEZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCh0eXBlKSk7Ci0JCQl0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwLnB1dCh0eXBlLCBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXApOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXA7Ci0JfQkKLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcChFQ2xhc3MgdHlwZSkgewotCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IHR5cGVUb0ZlYXR1cmVTdGF0aWNEZWZhdWx0VmFsdWVNYXAuZ2V0KHR5cGUpOwotCQlpZihmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKHR5cGUsIGZlYXR1cmVUb1R5cGVkU3RhdGljRGVmYXVsdFZhbHVlc01hcCwKLQkJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCXR5cGVUb0ZlYXR1cmVTdGF0aWNEZWZhdWx0VmFsdWVNYXAucHV0KHR5cGUsIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcDsKLQl9Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZWZhdWx0VmFsdWUoRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZGVmYXVsdFZhbHVlLAotCQkJTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4gZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwICkgCi0JewotCQlpZighZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuaXNTdXBlclR5cGVPZih0eXBlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1hcDxFQ2xhc3MsIE9iamVjdD4gdHlwZVRvRGVmYXVsdFZhbHVlTWFwID0gZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLmdldChmZWF0dXJlKTsKLQkJaWYodHlwZVRvRGVmYXVsdFZhbHVlTWFwID09IG51bGwpIHsKLQkJCS8vIHRoaXMgbWFwIG11c3QgYmUgc29ydGVkIGZyb20gc3ViIHR5cGUgdG8gc3VwZXIgdHlwZQotCQkJLy8KLQkJCXR5cGVUb0RlZmF1bHRWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwPEVDbGFzcywgT2JqZWN0PigpOwotCQkJZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLnB1dChmZWF0dXJlLCB0eXBlVG9EZWZhdWx0VmFsdWVNYXApOwotCQl9Ci0JCXR5cGVUb0RlZmF1bHRWYWx1ZU1hcC5wdXQodHlwZSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldERlZmF1bHRWYWx1ZShFQ2xhc3MgdHlwZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQkJc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSwgZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwKTsKLQkJCi0JCS8vIGNsZWFyIHR5cGVUb0ZlYXR1cmVEZWZhdWx0VmFsdWVNYXAgc28gdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSByZWNhbGN1bGF0ZWQgZm9yIGVhY2ggY2xhc3MKLQkJLy8KLQkJdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcC5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgc2V0U3RhdGljRGVmYXVsdFZhbHVlKEVDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQlzZXREZWZhdWx0VmFsdWUodHlwZSwgZmVhdHVyZSwgZGVmYXVsdFZhbHVlKTsKLQkJc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSwgZmVhdHVyZVRvVHlwZWRTdGF0aWNEZWZhdWx0VmFsdWVzTWFwKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcC5yZW1vdmUoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFQ2xhc3MgdHlwZSkgewotCQlhc3NlcnQgZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuaXNTdXBlclR5cGVPZih0eXBlKTsKLQkJTWFwPEVDbGFzcywgT2JqZWN0PiB0eXBlVG9EZWZhdWx0VmFsdWVNYXAgPSBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuZ2V0KGZlYXR1cmUpOwotCQlpZih0eXBlVG9EZWZhdWx0VmFsdWVNYXAgIT0gbnVsbCkgewotCQkJdHlwZVRvRGVmYXVsdFZhbHVlTWFwLnJlbW92ZSh0eXBlKTsKLQkJfQotCQkKLQkJLy8gY2xlYXIgdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHJlY2FsY3VsYXRlZCBmb3IgZWFjaCBjbGFzcwotCQkvLwotCQl0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwLmNsZWFyKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzaWduRGVmYXVsdFZhbHVlcyhFT2JqZWN0IGVPYmplY3QsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKSB7Ci0JCWlmKGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+PiBpdGVyID0gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwCi0JCQkJLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQllT2JqZWN0LmVTZXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NpZ25EZWZhdWx0VmFsdWVzKEVPYmplY3QgZU9iamVjdCkgewotCQlFQ2xhc3MgdHlwZSA9IGVPYmplY3QuZUNsYXNzKCk7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKHR5cGUpOwotCQlhc3NpZ25EZWZhdWx0VmFsdWVzKGVPYmplY3QsIGZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCk7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKGVPYmplY3QuZUNsYXNzKCkpOwotCQlpZihmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgIT0gZmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKSB7Ci0JCQlhc3NpZ25EZWZhdWx0VmFsdWVzKGVPYmplY3QsIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRXZlbnRUeXBlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0V2ZW50VHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyMTUzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRXZlbnRUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi0vKioKLSAqIERlZmluZXMgYWRkaXRpb25hbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXZlbnRUeXBlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUtFX1BST1hZID0gTm90aWZpY2F0aW9uLkVWRU5UX1RZUEVfQ09VTlQgKyAxOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRmVhdHVyZURlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRmVhdHVyZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MGNjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0ZlYXR1cmVEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVEZWxlZ2F0ZSBpbXBsZW1lbnRzIElGZWF0dXJlRGVsZWdhdGUgewotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lKSB7Ci0JCS8vIFByb2Nlc3MgdGhlIGNvbnRyaWJ1dG9ycy4KLQkJLy8KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlPYmplY3QgZXh0ID0gbnVsbDsKLQkJCWV4dF93YWxrOgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJYnJlYWsgZXh0X3dhbGs7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGV4dDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGZWF0dXJlRGVsZWdhdGUgbmV3SW5zdGFuY2UoKSB7Ci0JCU9iamVjdCBleHQgPSBjcmVhdGVFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUiLCAiZmVhdHVyZURlbGVnYXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZihleHQgaW5zdGFuY2VvZiBJRmVhdHVyZURlbGVnYXRlKSB7Ci0JCQlyZXR1cm4gKElGZWF0dXJlRGVsZWdhdGUpIGV4dDsKLQkJfQotCQlyZXR1cm4gbmV3IEZlYXR1cmVEZWxlZ2F0ZSgpOwotCX0KLQkKLQlwcml2YXRlIEZlYXR1cmVEZWxlZ2F0ZSgpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuSUZlYXR1cmVEZWxlZ2F0ZSNkZWxlZ2F0ZUdldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlbGVnYXRlR2V0KEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuSUZlYXR1cmVEZWxlZ2F0ZSNkZWxlZ2F0ZVNldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxlZ2F0ZVNldChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuSUZlYXR1cmVEZWxlZ2F0ZSNpc0RlbGVnYXRlZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGVnYXRlZChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0lGZWF0dXJlRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9JRmVhdHVyZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODRjMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0lGZWF0dXJlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZlYXR1cmVEZWxlZ2F0ZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmVhdHVyZURlbGVnYXRlIElOU1RBTkNFID0gRmVhdHVyZURlbGVnYXRlLm5ld0luc3RhbmNlKCk7Ci0JCi0JYm9vbGVhbiBpc0RlbGVnYXRlZChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwotCQotCU9iamVjdCBkZWxlZ2F0ZUdldChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwotCQotCXZvaWQgZGVsZWdhdGVTZXQoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0NjJhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBTdXBwb3J0cyB0aGUgcmV2ZXJzZSB0cmF2ZXJzYWwgb2YgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gbW9kZWwgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3Bwb3NpdGVGZWF0dXJlIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTWFueTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlT3duZXIgPSB0cnVlOwotCi0JcHJpdmF0ZSBDbGFzcyBvd25lckNsYXNzOwotCi0JLy9wcml2YXRlIHN0YXRpYyBib29sZWFuIGRlbGl2ZXJPblJlc29sdmU7Ci0KLQkvKioKLQkgKiBNYXBzIHNvdXJjZSBtb2RlbCBvYmplY3RzIHRvIE9wcG9zaXRlRmVhdHVyZSBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIGNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBNYXBzIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzIHRvIE9wcG9zaXRlRmVhdHVyZSBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIGZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJDbGFzcwotCSAqICAgICAgICAgICAgdGhlIG1vZGVsIGNsYXNzIHRoYXQgb3ducyB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIHRhcmdldEZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHdoaWNoIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZSBpcyBiYXNlZCBvbgotCSAqIEBwYXJhbSBpc01hbnkKLQkgKiAgICAgICAgICAgIGlmIDx0cnVlPiwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgYXNzb2NpYXRpb24gaXMgdW5ib3VuZGVkCi0JICogQHBhcmFtIHJlc29sdmVPd25lcgotCSAqICAgICAgICAgICAgaWYgPHRydWU+LCByZXNvbHZlIHRoZSBvd25lciBjbGFzcyBpZiBpdCBpcyBhIHByb3h5Ci0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZShDbGFzcyBvd25lckNsYXNzLCBTdHJpbmcgbmFtZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlLCBib29sZWFuIGlzTWFueSwKLQkJCWJvb2xlYW4gcmVzb2x2ZU93bmVyKSB7Ci0JCXRoaXMub3duZXJDbGFzcyA9IG93bmVyQ2xhc3M7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudGFyZ2V0RmVhdHVyZSA9IHRhcmdldEZlYXR1cmU7Ci0JCXRoaXMuaXNNYW55ID0gaXNNYW55OwotCQl0aGlzLnJlc29sdmVPd25lciA9IHJlc29sdmVPd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lckNsYXNzCi0JICogICAgICAgICAgICB0aGUgbW9kZWwgY2xhc3MgdGhhdCBvd25zIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gdGFyZ2V0RmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgd2hpY2ggdGhpcyBvcHBvc2l0ZSBmZWF0dXJlIGlzIGJhc2VkIG9uCi0JICogQHBhcmFtIGlzTWFueQotCSAqICAgICAgICAgICAgaWYgPHRydWU+LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBhc3NvY2lhdGlvbiBpcyB1bmJvdW5kZWQKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlKENsYXNzIG93bmVyQ2xhc3MsIFN0cmluZyBuYW1lLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRhcmdldEZlYXR1cmUsIGJvb2xlYW4gaXNNYW55KSB7Ci0JCXRoaXMob3duZXJDbGFzcywgbmFtZSwgdGFyZ2V0RmVhdHVyZSwgaXNNYW55LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtb2RhbCBjbGFzcyB0aGF0IG93bnMgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZGFsIGNsYXNzIHRoYXQgb3ducyB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0T3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIG93bmVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIHVuYm91bmRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhc3NvY2lhdGlvbiBpcyB1bmJvdW5kZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbnkoKSB7Ci0JCXJldHVybiBpc01hbnk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmZWF0dXJlIHdoaWNoIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZSBpcyBiYXNlZCBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBmZWF0dXJlIGdlbmVyYXRlZCBieSBFTUYKLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFRhcmdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiB0YXJnZXRGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIElEIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIElECi0JICovCi0JcHVibGljIGludCBnZXRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiAtMSAtIHRhcmdldEZlYXR1cmUuZ2V0RmVhdHVyZUlEKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG93bmVyIGNsYXNzIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZSwgaWYgcHJveGllZCwKLQkgKiBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdGFyZ2V0IGZlYXR1cmUgaXMgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gPHRydWU+IGlmIHRoZSBvd25lciBjbGFzcywgaWYgcHJveGllZCwgc2hvdWxkIGJlIHJlc29sdmVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVzb2x2ZU93bmVyKCkgewotCQlyZXR1cm4gcmVzb2x2ZU93bmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGtleSBhdHRyaWJ1dGVzIG9mIHRoaXMKLQkgKiAgICAgICAgIG9wcG9zaXRlIGZlYXR1cmUuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWUgKyAiW3RhcmdldEZlYXR1cmU9IiArIHRhcmdldEZlYXR1cmUgLy8kTk9OLU5MUy0xJAotCQkJCSsgIiwgaXNNYW55PSIgKyBpc01hbnkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB0byByZWdpc3RlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZWdpc3Rlck9wcG9zaXRlRmVhdHVyZSgKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUpIHsKLQkJQ2xhc3MgY2xzID0gb3Bwb3NpdGVGZWF0dXJlLmdldE93bmVyQ2xhc3MoKTsKLQkJU2V0IGZlYXR1cmVzID0gKFNldCkgY2xhc3NPcHBvc2l0ZUZlYXR1cmVzTWFwLmdldChjbHMpOwotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJZmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJY2xhc3NPcHBvc2l0ZUZlYXR1cmVzTWFwLnB1dChjbHMsIGZlYXR1cmVzKTsKLQkJfQotCQlmZWF0dXJlcy5hZGQob3Bwb3NpdGVGZWF0dXJlKTsKLQotCQlmZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwLnB1dChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLAotCQkJCW9wcG9zaXRlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiBhIHByb3h5IG93bmVyIGNsYXNzIGlzIHJlc29sdmVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNlbnQgd2hlbiBhIHByb3h5Ci0JICogICAgICAgICBvd25lciBjbGFzcyBpcyByZXNvbHZlZAotCSAqLwotCS8qCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGVsaXZlck9uUmVzb2x2ZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJPblJlc29sdmU7Ci0JfQotCSovCi0KLQkvKioKLQkgKiBFbmFibGVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgcHJveHkgb3duZXIgY2xhc3MgaXMgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZU5vdGlmaWNhdGlvbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlbmQgbm90aWZpY2F0aW9uIHdoZW4gYSBwcm94eSBvd25lcgotCSAqICAgICAgICAgICAgY2xhc3MgaXMgcmVzb2x2ZWQKLQkgKi8KLQkvKgotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXREZWxpdmVyT25SZXNvbHZlKGJvb2xlYW4gZW5hYmxlTm90aWZpY2F0aW9uKSB7Ci0JCWRlbGl2ZXJPblJlc29sdmUgPSBlbmFibGVOb3RpZmljYXRpb247Ci0JfQotCSovCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gRU1GIDxjb2RlPkVTdHJ1Y3R1cmFsRmVhdHVyZTwvY29kZT4gZmVhdHVyZQotCSAqIEByZXR1cm4gYW4gb3Bwb3NpdGUgZmVhdHVyZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBnaXZlbiBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgZ2V0T3Bwb3NpdGVGZWF0dXJlKAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIChPcHBvc2l0ZUZlYXR1cmUpIGZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjIxYmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLQotLyoqCi0gKiBOb3RpZmljYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9wcG9zaXRlIGZlYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmljYXRpb25JbXBsIHsKLQotCXByaXZhdGUgT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZTsKLQotCXByaXZhdGUgT2JqZWN0IG5vdGlmaWVyOwotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgdmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGl0aW9uIGF0IHdoaWNoIHRoZSBjaGFuZ2Ugb2NjdXJyZWQKLQkgKiBAcGFyYW0gd2FzU2V0Ci0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbihPYmplY3Qgbm90aWZpZXIsIGludCBldmVudFR5cGUsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwKLQkJCWludCBwb3NpdGlvbiwgYm9vbGVhbiB3YXNTZXQpIHsKLQkJc3VwZXIoZXZlbnRUeXBlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvc2l0aW9uLCB3YXNTZXQpOwotCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JCXRoaXMub3Bwb3NpdGVGZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBub3RpZmljYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub3RpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlIGdldE9wcHNpdGVGZWF0dXJlKCkgewotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldE5vdGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkgewotCQlyZXR1cm4gbm90aWZpZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjUzNGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmeWluZ0xpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIEEgbGlzdCBmb3IgcmVzb2x2aW5nIG11bHRpLXZhbHVlZCBvcHBvc2l0ZSBmZWF0dXJlcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0IGV4dGVuZHMgTm90aWZ5aW5nTGlzdEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzY5MDE5ODc2MzAwMDA1MTc2OEw7Ci0KLQlwcml2YXRlIE11bHRpUmVzb3VyY2VFT2JqZWN0IG93bmVyOwotCi0JcHJpdmF0ZSBPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiBhbiBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdChNdWx0aVJlc291cmNlRU9iamVjdCBvd25lciwKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLm9wcG9zaXRlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZ5aW5nTGlzdEltcGwjZ2V0Tm90aWZpZXIoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCByZXNvbHZlUHJveHkoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXJldHVybiBlT2JqZWN0LmVJc1Byb3h5KCkgPyBvd25lcgotCQkJCS5lUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIGVPYmplY3QpIDogZU9iamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm90aWZpY2F0aW9uSW1wbCBjcmVhdGVOb3RpZmljYXRpb24oaW50IGV2ZW50VHlwZSwKLQkJCU9iamVjdCBvbGRPYmplY3QsIE9iamVjdCBuZXdPYmplY3QsIGludCBpbmRleCwgYm9vbGVhbiB3YXNTZXQpIHsKLQkJcmV0dXJuIG5ldyBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24ob3duZXIsIGV2ZW50VHlwZSwKLQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG9sZE9iamVjdCwgbmV3T2JqZWN0LCBpbmRleCwgd2FzU2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaWNhdGlvblJlcXVpcmVkKCkgewotCQlyZXR1cm4gb3duZXIuZU5vdGlmaWNhdGlvblJlcXVpcmVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCByZXNvbHZlKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSkKLQkJCXJldHVybiBvYmplY3Q7Ci0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCUVPYmplY3QgcmVzb2x2ZWQgPSByZXNvbHZlUHJveHkoZU9iamVjdCk7Ci0JCWlmIChyZXNvbHZlZCAhPSBlT2JqZWN0KSB7Ci0JCQlPYmplY3Qgb2xkT2JqZWN0ID0gZGF0YVtpbmRleF07Ci0JCQlhc3NpZ24oaW5kZXgsIHZhbGlkYXRlKGluZGV4LCByZXNvbHZlZCkpOwotCi0JCQlkaWRTZXQoaW5kZXgsIHJlc29sdmVkLCBvbGRPYmplY3QpOwotCi0JCQkvLyBpZiAoaXNOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJLy8gewotCQkJLy8gb3duZXIuZU5vdGlmeShjcmVhdGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uLlJFU09MVkUsIGVPYmplY3QsCi0JCQkvLyByZXNvbHZlZCwgaW5kZXgsIGZhbHNlKSk7Ci0JCQkvLyB9Ci0KLQkJCXJldHVybiByZXNvbHZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlT2JqZWN0OwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRGFuZ2xpbmdPYmplY3RzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iai5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgdGhhdCBzdG9yZXMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRVbm1vZGlmaWFibGVMaXN0KCkgewotCQlyZW1vdmVEYW5nbGluZ09iamVjdHMoKTsKLQkJcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVFTGlzdChzaXplLCBkYXRhKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWVmZTUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgVU1BIEVjb3JlIGV4dGVuc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9IZWFkZXIuamF2YWpldGluYyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL0hlYWRlci5qYXZhamV0aW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTA1NjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL0hlYWRlci5qYXZhamV0aW5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTFhYmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIwICswLDAgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUudGVtcGxhdGVzLm1vZGVsIiBpbXBvcnRzPSJqYXZhLnV0aWwuKiBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS5nZW5tb2RlbC4qIiBjbGFzcz0iQ2xhc3MiIHZlcnNpb249IiRJZDogQ2xhc3MuamF2YWpldCx2IDEuMyAyMDA4LzA1LzA3IDE5OjM4OjQ5IHBsZSBFeHAgJCIgJT4KLTwlCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqLwotJT4KLTwlZmluYWwgR2VuQ2xhc3MgZ2VuQ2xhc3MgPSAoR2VuQ2xhc3MpKChPYmplY3RbXSlhcmd1bWVudClbMF07IGZpbmFsIEdlblBhY2thZ2UgZ2VuUGFja2FnZSA9IGdlbkNsYXNzLmdldEdlblBhY2thZ2UoKTsgZmluYWwgR2VuTW9kZWwgZ2VuTW9kZWw9Z2VuUGFja2FnZS5nZXRHZW5Nb2RlbCgpOyU+Ci08JWZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UgPSBCb29sZWFuLlRSVUUuZXF1YWxzKCgoT2JqZWN0W10pYXJndW1lbnQpWzFdKTsgZmluYWwgYm9vbGVhbiBpc0ltcGxlbWVudGF0aW9uID0gQm9vbGVhbi5UUlVFLmVxdWFscygoKE9iamVjdFtdKWFyZ3VtZW50KVsyXSk7JT4KLTwlZmluYWwgU3RyaW5nIHB1YmxpY1N0YXRpY0ZpbmFsRmxhZyA9IGlzSW1wbGVtZW50YXRpb24gPyAicHVibGljIHN0YXRpYyBmaW5hbCAiIDogIiI7JT4KLTwlZmluYWwgU3RyaW5nIHNpbmdsZVdpbGRjYXJkID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/ICI8Pz4iIDogIiI7JT4KLTwlZmluYWwgU3RyaW5nIG5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiA9IGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgLSAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKG51bGwpIDogIiI7JT4KLTwlZmluYWwgU3RyaW5nIHBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiA9IGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKG51bGwpIDogIiI7JT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii4uL0hlYWRlci5qYXZhamV0aW5jIiU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci1wYWNrYWdlIDwlPWdlblBhY2thZ2UuZ2V0SW50ZXJmYWNlUGFja2FnZU5hbWUoKSU+OwotPCV9IGVsc2UgeyU+Ci1wYWNrYWdlIDwlPWdlblBhY2thZ2UuZ2V0Q2xhc3NQYWNrYWdlTmFtZSgpJT47Ci08JX0lPgotCi08JWdlbk1vZGVsLm1hcmtJbXBvcnRMb2NhdGlvbihzdHJpbmdCdWZmZXIsIGdlblBhY2thZ2UpOyU+Ci0KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPCVpZiAoZ2VuQ2xhc3MuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIDwlPWdlbkNsYXNzLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotPCV9JT4KLSAqCi08JWlmICghZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0gKiAgIDxsaT57QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn08L2xpPgotICA8JX0lPgotPCV9JT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci08JX0lPgotICoKLTwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSkgeyU+Ci0gKiBAc2VlIDwlPWdlblBhY2thZ2UuZ2V0UXVhbGlmaWVkUGFja2FnZUludGVyZmFjZU5hbWUoKSU+I2dldDwlPWdlbkNsYXNzLmdldENsYXNzaWZpZXJBY2Nlc3Nvck5hbWUoKSU+KCkKLTwlfSU+Ci08JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbkNsYXNzLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotPCV9IGVsc2UgeyU+Ci0gKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLTwlfX0gaWYgKGZpcnN0KSB7JT4KLSAqIEBtb2RlbAotPCV9fSU+Ci08JWlmIChnZW5DbGFzcy5uZWVkc1Jvb3RFeHRlbmRzSW50ZXJmYWNlRXh0ZW5kc1RhZygpKSB7JT4KLSAqIEBleHRlbmRzIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZShnZW5Nb2RlbC5nZXRSb290RXh0ZW5kc0ludGVyZmFjZSgpKSU+Ci08JX0lPgotICogQGdlbmVyYXRlZAotICovCi08JX0gZWxzZSB7JT4KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj48JT1nZW5DbGFzcy5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotPCVpZiAoIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpKSB7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59PC9saT4KLTwlfSU+Ci0gKiA8L3VsPgotPCV9JT4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uKSB7JT4KLXB1YmxpYzwlaWYgKGdlbkNsYXNzLmlzQWJzdHJhY3QoKSkgeyU+IGFic3RyYWN0PCV9JT4gY2xhc3MgPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPjwlPWdlbkNsYXNzLmdldFR5cGVQYXJhbWV0ZXJzKCkudHJpbSgpJT48JT1nZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHMoKSU+PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NJbXBsZW1lbnRzKCklPgotPCV9IGVsc2UgeyU+Ci1wdWJsaWMgaW50ZXJmYWNlIDwlPWdlbkNsYXNzLmdldEludGVyZmFjZU5hbWUoKSU+PCU9Z2VuQ2xhc3MuZ2V0VHlwZVBhcmFtZXRlcnMoKS50cmltKCklPjwlPWdlbkNsYXNzLmdldEludGVyZmFjZUV4dGVuZHMoKSU+Ci08JX0lPgotewotPCVpZiAoZ2VuTW9kZWwuaGFzQ29weXJpZ2h0RmllbGQoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JPCU9cHVibGljU3RhdGljRmluYWxGbGFnJT48JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5TdHJpbmciKSU+IGNvcHlyaWdodCA9IDwlPWdlbk1vZGVsLmdldENvcHlyaWdodEZpZWxkTGl0ZXJhbCgpJT47PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5nZXREcml2ZXJOdW1iZXIoKSAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLlN0cmluZyIpJT4gbW9mRHJpdmVyTnVtYmVyID0gIjwlPWdlbk1vZGVsLmdldERyaXZlck51bWJlcigpJT4iOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaXNKYXZhSU9TZXJpYWxpemFibGUoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyBTdHJpbmcgZVZpcnR1YWxWYWx1ZXNGaWVsZCA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsVmFsdWVzRmllbGQoKTslPgotICA8JWlmIChlVmlydHVhbFZhbHVlc0ZpZWxkICE9IG51bGwpIHslPgotCS8qKgotCSAqIEFuIGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2Ygbm9uLXByaW1pdGl2ZSBmZWF0dXJlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+OwotCi0gIDwlfSU+Ci0gIDwleyBMaXN0PFN0cmluZz4gZVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOyU+Ci0gICAgPCVpZiAoIWVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuaXNFbXB0eSgpKSB7JT4KLSAgICAgIDwlZm9yIChTdHJpbmcgZVZpcnR1YWxJbmRleEJpdEZpZWxkIDogZVZpcnR1YWxJbmRleEJpdEZpZWxkcykgeyU+Ci0JLyoqCi0JICogQSBiaXQgZmllbGQgcmVwcmVzZW50aW5nIHRoZSBpbmRpY2VzIG9mIG5vbi1wcmltaXRpdmUgZmVhdHVyZSB2YWx1ZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1lVmlydHVhbEluZGV4Qml0RmllbGQlPjsKLQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaXNNb2RlbFJvb3QoKSAmJiBnZW5Nb2RlbC5pc0Jvb2xlYW5GbGFnc0VuYWJsZWQoKSAmJiBnZW5Nb2RlbC5nZXRCb29sZWFuRmxhZ3NSZXNlcnZlZEJpdHMoKSA9PSAtMSkgeyU+Ci0JLyoqCi0JICogQSBzZXQgb2YgYml0IGZsYWdzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgd2hldGhlciB1bnNldHRhYmxlIGZlYXR1cmVzIGhhdmUgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWdlbk1vZGVsLmdldEJvb2xlYW5GbGFnc0ZpZWxkKCklPiA9IDA7Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZEdlbkZlYXR1cmVzKCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNBcnJheUFjY2Vzc29ycygpICYmIGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyBTdHJpbmcgcmF3TGlzdEl0ZW1UeXBlID0gZ2VuRmVhdHVyZS5nZXRSYXdMaXN0SXRlbVR5cGUoKTsgaW50IGluZGV4ID0gcmF3TGlzdEl0ZW1UeXBlLmluZGV4T2YoJ1snKTsgU3RyaW5nIGhlYWQgPSByYXdMaXN0SXRlbVR5cGU7IFN0cmluZyB0YWlsID0gIiI7IGlmIChpbmRleCAhPSAtMSkgeyBoZWFkID0gcmF3TGlzdEl0ZW1UeXBlLnN1YnN0cmluZygwLCBpbmRleCk7IHRhaWwgPSByYXdMaXN0SXRlbVR5cGUuc3Vic3RyaW5nKGluZGV4KTsgfSAlPgotCS8qKgotCSAqIFRoZSBlbXB0eSB2YWx1ZSBmb3IgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgYXJyYXkgYWNjZXNzb3IuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpLmNvbnRhaW5zKCI8IikpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICA8JX0lPgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgPCU9cmF3TGlzdEl0ZW1UeXBlJT5bXSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZID0gbmV3IDwlPWhlYWQlPiBbMF08JT10YWlsJT47Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkgJiYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSB8fCAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICghZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSB8fCAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkpKSB7IFN0cmluZyBzdGF0aWNEZWZhdWx0VmFsdWUgPSBnZW5GZWF0dXJlLmdldFN0YXRpY0RlZmF1bHRWYWx1ZSgpOyU+Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgICAgICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmIGdlbkZlYXR1cmUuaXNMaXN0RGF0YVR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzU2V0RGVmYXVsdFZhbHVlKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICA8JX0lPgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JWlmICgiIi5lcXVhbHMoc3RhdGljRGVmYXVsdFZhbHVlKSkgeyU+OyAvLyBUT0RPIFRoZSBkZWZhdWx0IHZhbHVlIGxpdGVyYWwgIjwlPWdlbkZlYXR1cmUuZ2V0RWNvcmVGZWF0dXJlKCkuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpJT4iIGlzIG5vdCB2YWxpZC48JX0gZWxzZSB7JT4gPSA8JT1zdGF0aWNEZWZhdWx0VmFsdWUlPjs8JT1nZW5Nb2RlbC5nZXROb25OTFMoc3RhdGljRGVmYXVsdFZhbHVlKSU+PCV9JT4KLQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyID09IDApIHslPgotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gPSAwOwotCi0gICAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgJT47Ci0KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4gPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSU+OwotCi0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgPiAzMSAmJiBnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgPT0gMCkgeyU+Ci0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBzZXQgb2YgYml0IGZsYWdzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgd2hldGhlciB1bnNldHRhYmxlIGZlYXR1cmVzIGhhdmUgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gPSAwOwotCi0gICAgICAgIDwlfSU+Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIDwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHID0gMSA8JT0iPDwgIiArIGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiAlPjsKLQotICAgICAgPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSA8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKG51bGwpJT4gPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc2lmaWVyQWNjZXNzb3IoKSU+LmdldEZlYXR1cmVJRCg8JT1nZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuZ2V0KDApLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5nZXQoMCkpJT47Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7JT4KLSAgICA8JWlmIChyZXZlcnNlRmVhdHVyZSAhPSBudWxsICYmIHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCkuaGFzT2Zmc2V0Q29ycmVjdGlvbigpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKGdlbkZlYXR1cmUpJT4gPSA8JT1yZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT4uZ2V0RmVhdHVyZUlEKDwlPXJldmVyc2VGZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pIC0gPCU9cmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT47Ci0KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCTwlaWYgKGdlbk1vZGVsLmlzUHVibGljQ29uc3RydWN0b3JzKCkpIHslPnB1YmxpYzwlfSBlbHNlIHslPnByb3RlY3RlZDwlfSU+IDwlPWdlbkNsYXNzLmdldENsYXNzTmFtZSgpJT4oKQotCXsKLQkJc3VwZXIoKTsKLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEZsYWdHZW5GZWF0dXJlcygidHJ1ZSIpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgPCV9JT4KLSAgCi0gLy9VTUEtLT4KLSAJCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotIC8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyIpJT4gZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc2lmaWVyQWNjZXNzb3IoKSU+OwotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3JlZmxlY3RpdmVEZWxlZ2F0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmdldEZlYXR1cmVEZWxlZ2F0aW9uKCkgPT0gR2VuRGVsZWdhdGlvbktpbmQuUkVGTEVDVElWRV9MSVRFUkFMICYmIChnZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpID09IG51bGwgfHwgZ2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKS5nZXRHZW5Nb2RlbCgpLmdldEZlYXR1cmVEZWxlZ2F0aW9uKCkgIT0gR2VuRGVsZWdhdGlvbktpbmQuUkVGTEVDVElWRV9MSVRFUkFMKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCBpbnQgZVN0YXRpY0ZlYXR1cmVDb3VudCgpCi0JewotCQlyZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKSA9PSBudWxsID8gMCA6IGdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkuZ2V0QWxsR2VuRmVhdHVyZXMoKS5zaXplKCklPjsKLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL3JlZmxlY3RpdmVEZWxlZ2F0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCVuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHslPgotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IChpc0ltcGxlbWVudGF0aW9uID8gZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpIDogZ2VuQ2xhc3MuZ2V0RGVjbGFyZWRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0gIDwlaWYgKGdlbk1vZGVsLmlzQXJyYXlBY2Nlc3NvcnMoKSAmJiBnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKTsKLQotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICA8JX0lPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKQotCXsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPiBsaXN0ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSByZXR1cm4gPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpLmNvbnRhaW5zKCI8IikgJiYgIWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKG51bGwpLmVxdWFscyhnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSk8JX0lPjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwgfHwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpKSByZXR1cm4gPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpLmNvbnRhaW5zKCI8IikgJiYgIWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKG51bGwpLmVxdWFscyhnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSk8JX0lPjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVk7Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4gbGlzdCA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9JT4KLQkJbGlzdC5zaHJpbmsoKTsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKWxpc3QuZGF0YSgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgpCi0JewotCQlyZXR1cm4gPCVpZiAoIWdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPik8JX0lPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuZ2V0KGluZGV4KTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgaW50IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPkxlbmd0aCgpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zaXplKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwgPyAwIDogPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uc2l6ZSgpOwotICAgICAgPCV9JT4KLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQl7Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXREYXRhKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4ubGVuZ3RoLCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+IGVsZW1lbnQpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCwgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZWxlbWVudCkKLQl7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzR2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7IEdlbkZlYXR1cmUga2V5RmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeUtleUZlYXR1cmUoKTsgR2VuRmVhdHVyZSB2YWx1ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldE1hcEVudHJ5VHlwZUdlbkNsYXNzKCkuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTsgJT4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPmxpc3Qgb2Yge0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+fTwlfSBlbHNlIHslPntAbGluayA8JT1rZXlGZWF0dXJlLmdldFR5cGUoZ2VuQ2xhc3MpJT59PCV9JT4sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIDwlaWYgKHZhbHVlRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPmxpc3Qgb2Yge0BsaW5rIDwlPXZhbHVlRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPXZhbHVlRmVhdHVyZS5nZXRUeXBlKGdlbkNsYXNzKSU+fTwlfSU+LAotICAgICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkgJiYgIShnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSAmJiAib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiLmVxdWFscyhnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcykpKSkgewotU3RyaW5nIHR5cGVOYW1lID0gZ2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpOyBTdHJpbmcgaGVhZCA9IHR5cGVOYW1lOyBTdHJpbmcgdGFpbCA9ICIiOyBpbnQgaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCc8Jyk7IGlmIChpbmRleCA9PSAtMSkgeyBpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoJ1snKTsgfSAKLWlmIChpbmRleCAhPSAtMSkgeyBoZWFkID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsgdGFpbCA9IHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCkucmVwbGFjZUFsbCgiPCIsICImbHQ7Iik7IH0KLSU+Ci0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIDwlPWhlYWQlPn08JT10YWlsJT4uCi0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzU2V0RGVmYXVsdFZhbHVlKCkpIHslPgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPjwlPWdlbkZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCklPjwvY29kZT4uCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkgIT0gbnVsbCkgeyU+Ci0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+fS4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgJiYgIWdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpLmdldEdlbkNsYXNzKCkuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUdlbkZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgJT4KLSAgICAgIDwlaWYgKCFyZXZlcnNlR2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIDwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScuCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotICAgIDwlfSU+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDwlPWdlbkZlYXR1cmUuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICAgIDwlfSU+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkgIT0gbnVsbCkgeyU+Ci0JICogQHNlZSA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRSYXdJbXBvcnRlZEJvdW5kVHlwZSgpJT4pCi0gICAgPCV9JT4KLSAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkpIHslPgotCSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlQWNjZXNzb3JOYW1lKCklPigpCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpICYmICFnZW5GZWF0dXJlLmdldFJldmVyc2UoKS5nZXRHZW5DbGFzcygpLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VHZW5GZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7ICU+Ci0gICAgICA8JWlmICghcmV2ZXJzZUdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlIDwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5GZWF0dXJlLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkgKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLSAgICA8JX0gZWxzZSB7JT4KLQkgKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLSAgICA8JX19IGlmIChmaXJzdCkgeyU+Ci0JICogQG1vZGVsCi0gICAgPCV9fSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9nZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICgoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpIHx8IGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzVW5jaGVja2VkQ2FzdCgpIHx8IGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgfHwgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB8fCBnZW5GZWF0dXJlLmlzTGlzdERhdGFUeXBlKCkgJiYgZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICA8JX0lPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPillR2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwpCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldyA8JT1nZW5DbGFzcy5nZXRMaXN0Q29uc3RydWN0b3IoZ2VuRmVhdHVyZSklPjsKLSAgICAgICAgPCV9JT4KLQkJfQotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JT1nZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkgPyAiLm1hcCgpIiA6ICIiJT47Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZUNvbnRhaW5lcigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+PCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pOwotICAgICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWVBc0VPYmplY3QoKSU+LmVJc1Byb3h5KCkpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldE5vbkVPYmplY3RJbnRlcm5hbFR5cGVDYXN0KGdlbkNsYXNzKSU+ZVJlc29sdmVQcm94eShvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCQkJewotICAgICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG51bGwpOwotICAgICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9ICBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG51bGwpOwotICAgICAgICAgIDwlfSU+Ci0JCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkKLQkJCQl7Ci0gICAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCQltc2dzID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQkJbXNncyA9ICBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICAgIDwlfSU+Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQllVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5SRVNPTFZFLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikpOwotICAgICAgICAgIDwlfSU+Ci0JCQl9Ci0JCX0KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7Ly92b2xhdGlsZSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWVBc0VPYmplY3QoKSU+LmVJc1Byb3h5KCkgPyA8JT1nZW5GZWF0dXJlLmdldE5vbkVPYmplY3RJbnRlcm5hbFR5cGVDYXN0KGdlbkNsYXNzKSU+ZVJlc29sdmVQcm94eSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlU3RyaW5nIGZlYXR1cmVNYXBFbnRyeVRlbXBsYXRlQXJndW1lbnQgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gIjwiICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIikgKyAiLkVudHJ5PiIgOiAiIjslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkRWZmZWN0aXZlRmVhdHVyZU1hcFdyYXBwZXJDbGFzcygpJT4oKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLjwlPWZlYXR1cmVNYXBFbnRyeVRlbXBsYXRlQXJndW1lbnQlPmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KSk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLjwlPWZlYXR1cmVNYXBFbnRyeVRlbXBsYXRlQXJndW1lbnQlPmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT48JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpID09IG51bGwgfHwgIWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkuaXNPYmplY3RUeXBlKCkpIHslPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT4oKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+PCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKSA9PSBudWxsIHx8ICFnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpLmlzT2JqZWN0VHlwZSgpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KTwlfSU+Z2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCS8vIFRoZSBsaXN0IGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IGFuZCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcKLQkJLy8gc28gaXQncyBsaWtlbHkgdGhhdCBhbiBhcHByb3ByaWF0ZSBzdWJjbGFzcyBvZiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC48JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT5FY29yZUVNYXA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPkJhc2ljRmVhdHVyZU1hcDwlfSBlbHNlIHslPkVjb3JlRUxpc3Q8JX0lPiBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgPCV9JT4KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNHZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pIHJldHVybiBudWxsOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVJbnRlcm5hbENvbnRhaW5lcigpOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBmYWxzZSk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIGZhbHNlKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEludGVybmFsVHlwZShnZW5DbGFzcyklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG51bGwgOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+IW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUUgPyBudWxsIDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICAgIDwlfSU+Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLSAgICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5iYXNpY0FkZCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGNvbnRhaW5lZCAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gdGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIHRvIGtlZXAgdGhlIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCBpbiBzeW5jaAotCQkvLyAtPiBkbyBub3QgbW9kaWZ5IG90aGVyIGZlYXR1cmVzCi0JCS8vIC0+IHJldHVybiBtc2dzLCBhZnRlciBhZGRpbmcgYW55IGdlbmVyYXRlZCBOb3RpZmljYXRpb24gdG8gaXQgKGlmIGl0IGlzIG51bGwsIGEgTm90aWZpY2F0aW9uQ2hhaW4gb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBmaXJzdCkKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1NldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHsgJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0JICogQHNlZSA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL3NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyAlPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IHZhbHVlKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQllU2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+ICYmIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkpCi0JCXsKLQkJCWlmICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCIpJT4uaXNBbmNlc3Rvcih0aGlzLCA8JT1nZW5GZWF0dXJlLmdldEVPYmplY3RDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKQotCQkJCXRocm93IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSU+KCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSB8fCBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0JCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQllbHNlCi0JCXsKLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgIW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgICAgPCV9JT4KLQkJfQotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsgZWxzZSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA6IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA6IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgICA8JX0lPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUUgPyA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNVbnNldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxVbnNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogbnVsbDwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbnVsbCwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotICAgICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gdW5zZXQgdGhlIGNvbnRhaW5lZCAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gdGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIHRvIGtlZXAgdGhlIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCBpbiBzeW5jaAotCQkvLyAtPiBkbyBub3QgbW9kaWZ5IG90aGVyIGZlYXR1cmVzCi0JCS8vIC0+IHJldHVybiBtc2dzLCBhZnRlciBhZGRpbmcgYW55IGdlbmVyYXRlZCBOb3RpZmljYXRpb24gdG8gaXQgKGlmIGl0IGlzIG51bGwsIGEgTm90aWZpY2F0aW9uQ2hhaW4gb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBmaXJzdCkKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MuYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRSYXdJbXBvcnRlZEJvdW5kVHlwZSgpJT4pCi0gIDwlfSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQllVW5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4uVW5zZXR0YWJsZTwlPXNpbmdsZVdpbGRjYXJkJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLnVuc2V0KCk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSB8fCBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICA8JX0lPgotCQkJbXNncyA9IGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBudWxsLCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCkpOwotICAgICAgICA8JX0lPgotCQl9Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxVbnNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBudWxsOwotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPikgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsgZWxzZSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuY2xlYXIoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuY2xlYXIoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gdW5zZXQgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0lzU2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQuCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldC4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmIGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRSYXdJbXBvcnRlZEJvdW5kVHlwZSgpJT4pCi0gICAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JYm9vbGVhbiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgYm9vbGVhbiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiBlSXNTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlPCU9c2luZ2xlV2lsZGNhcmQlPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuaXNTZXQoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmlzRW1wdHkoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHdoZXRoZXIgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5GZWF0dXJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0vL2ZvciU+Ci08JX19LnJ1bigpOyU+Ci08JWZvciAoR2VuT3BlcmF0aW9uIGdlbk9wZXJhdGlvbiA6IChpc0ltcGxlbWVudGF0aW9uID8gZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5PcGVyYXRpb25zKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbk9wZXJhdGlvbnMoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICA8JWlmIChnZW5PcGVyYXRpb24uaGFzRG9jdW1lbnRhdGlvbigpIHx8IGdlbk9wZXJhdGlvbi5oYXNQYXJhbWV0ZXJEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICAgIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwlPWdlbk9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgICA8JX0lPgotICAgIDwlZm9yIChHZW5QYXJhbWV0ZXIgZ2VuUGFyYW1ldGVyIDogZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5QYXJhbWV0ZXIuaGFzRG9jdW1lbnRhdGlvbigpKSB7IFN0cmluZyBkb2N1bWVudGF0aW9uID0gZ2VuUGFyYW1ldGVyLmdldERvY3VtZW50YXRpb24oIiIpOyU+Ci0gICAgICAgIDwlaWYgKGRvY3VtZW50YXRpb24uY29udGFpbnMoIlxuIikgfHwgZG9jdW1lbnRhdGlvbi5jb250YWlucygiXHIiKSkgeyU+Ci0JICogQHBhcmFtIDwlPWdlblBhcmFtZXRlci5nZXROYW1lKCklPgotCSAqICAgPCU9Z2VuUGFyYW1ldGVyLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgICAgICA8JX0gZWxzZSB7JT4KLQkgKiBAcGFyYW0gPCU9Z2VuUGFyYW1ldGVyLmdldE5hbWUoKSU+IDwlPWdlblBhcmFtZXRlci5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gIDwlfSU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuT3BlcmF0aW9uLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkgKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLSAgPCV9IGVsc2UgeyU+Ci0JICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci0gIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgPCV9fSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZW5PcGVyYXRpb24uamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2dlbk9wZXJhdGlvbi5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbk9wZXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycyhnZW5DbGFzcyklPjwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+KDwlPWdlbk9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoZ2VuQ2xhc3MpJT47Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5PcGVyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT48JT1nZW5PcGVyYXRpb24uZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPig8JT1nZW5PcGVyYXRpb24uZ2V0UGFyYW1ldGVycyhnZW5DbGFzcyklPik8JT1nZW5PcGVyYXRpb24uZ2V0VGhyb3dzKGdlbkNsYXNzKSU+Ci0JewotICA8JWlmIChnZW5PcGVyYXRpb24uaGFzQm9keSgpKSB7JT4KLQkJPCU9Z2VuT3BlcmF0aW9uLmdldEJvZHkoZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICA8JX0gZWxzZSBpZiAoZ2VuT3BlcmF0aW9uLmlzSW52YXJpYW50KCkpIHtHZW5DbGFzcyBvcENsYXNzID0gZ2VuT3BlcmF0aW9uLmdldEdlbkNsYXNzKCk7IFN0cmluZyBkaWFnbm9zdGljcyA9IGdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKTsgU3RyaW5nIGNvbnRleHQgPSBnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpLmdldCgxKS5nZXROYW1lKCk7JT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIC0+IHNwZWNpZnkgdGhlIGNvbmRpdGlvbiB0aGF0IHZpb2xhdGVzIHRoZSBpbnZhcmlhbnQKLQkJLy8gLT4gdmVyaWZ5IHRoZSBkZXRhaWxzIG9mIHRoZSBkaWFnbm9zdGljLCBpbmNsdWRpbmcgc2V2ZXJpdHkgYW5kIG1lc3NhZ2UKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJaWYgKGZhbHNlKQotCQl7Ci0JCQlpZiAoPCU9ZGlhZ25vc3RpY3MlPiAhPSBudWxsKQotCQkJewotCQkJCTwlPWRpYWdub3N0aWNzJT4uYWRkCi0JCQkJCShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljIiklPgotCQkJCQkJKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMiKSU+LkVSUk9SLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi5ESUFHTk9TVElDX1NPVVJDRSwKLQkJCQkJCSA8JT1vcENsYXNzLmdldEdlblBhY2thZ2UoKS5nZXRJbXBvcnRlZFZhbGlkYXRvckNsYXNzTmFtZSgpJT4uPCU9b3BDbGFzcy5nZXRPcGVyYXRpb25JRChnZW5PcGVyYXRpb24pJT4sCi0JCQkJCQkgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luIiklPi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HZW5lcmljSW52YXJpYW50X2RpYWdub3N0aWMiLCBuZXcgT2JqZWN0W10geyAiPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+IiwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0VmFsaWRhdG9yIiklPi5nZXRPYmplY3RMYWJlbCh0aGlzLCA8JT1jb250ZXh0JT4pIH0pLDwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT48JT1nZW5Nb2RlbC5nZXROb25OTFMoMiklPgotCQkJCQkJIG5ldyBPYmplY3QgW10geyB0aGlzIH0pKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLSAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24udG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0vL2ZvciU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSW52ZXJzZUFkZEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5jaGVja2VkQ2FzdCgpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlYnJlYWs7IH0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlSW52ZXJzZUFkZCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyBTdHJpbmcgY2FzdCA9ICIoIiAgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSArICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSA/ICIpIiA6ICI8IiArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpICsgIj4pKCIgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSArICI8Pz4pIik7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWNhc3QlPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICg8JT1jYXN0JT48JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KW90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+YmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPjwlfSU+KCk7Ci0gICAgPCV9JT4KLQkJCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICA8JX0lPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pb3RoZXJFbmQsIG1zZ3MpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVJbnZlcnNlUmVtb3ZlKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VSZW1vdmVHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT48JT1zaW5nbGVXaWxkY2FyZCU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3PCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZE1hcFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT48JT1zaW5nbGVXaWxkY2FyZCU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT48JT1zaW5nbGVXaWxkY2FyZCU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpICYmICFnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci0JCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBtc2dzKTsKLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXJldHVybiBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG1zZ3MpOwotICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obnVsbCwgbXNncyk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVCYXNpY1JlbW92ZUZyb21Db250YWluZXJHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyR2VuRmVhdHVyZXMoKSkgeyU+Ci0gIDwlR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFR2V0R2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVHZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCb29sZWFuVHlwZSgpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIG5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQllbHNlIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLm1hcCgpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZ2V0V3JhcHBlcigpOwotICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5jaGVja2VkQ2FzdCgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICA8JWJyZWFrOyB9JT4KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUiKSU+LlNldHRpbmcpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5jbGVhcigpOwotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuYWRkQWxsKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPjwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHslPjw/IGV4dGVuZHMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4+PCV9JT4pbmV3VmFsdWUpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCgoPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KW5ld1ZhbHVlKS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpID09IG51bGwgfHwgIWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkuaXNPYmplY3RUeXBlKCkgfHwgIWdlbkZlYXR1cmUuZ2V0UmF3VHlwZSgpLmVxdWFscyhnZW5GZWF0dXJlLmdldFR5cGUoZ2VuQ2xhc3MpKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KTwlfSU+bmV3VmFsdWUpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuOwotICA8JX0lPgotCQl9Ci0gIDwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICA8JX0gZWxzZSB7JT4KLQkJZUR5bmFtaWNTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gIDwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RVVuc2V0R2VuRmVhdHVyZXMoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZVVuc2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RVVuc2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpLmNsZWFyKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQl1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KW51bGwpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPik7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci0JCX0KLSAgPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICA8JX0gZWxzZSB7JT4KLQkJZUR5bmFtaWNVbnNldChmZWF0dXJlSUQpOwotICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9lVW5zZXQub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUlzU2V0R2VuRmVhdHVyZXMoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSXNTZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpICYmICFnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkgJiYgZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlYnJlYWs7IH0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLS8vVU1BLS0+Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4gZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJc1NldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuaXNFbXB0eSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmZlYXR1cmVNYXAoKS5pc0VtcHR5KCk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAhPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5pc0VtcHR5KCk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQlyZXR1cm4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pICE9IG51bGw7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSAhPSBudWxsOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGw7Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSAhPSBudWxsOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gbnVsbDsKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkgfHwgZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KSAhPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSB7Ly9kYXRhdHlwZSU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2VJc1NldC5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICghZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5GZWF0dXJlcygpLmlzRW1wdHkoKSB8fCBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSkgeyU+Ci0gIDwlaWYgKCFnZW5DbGFzcy5nZXRNaXhpbkdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgICA8JX0lPgotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczwlPXNpbmdsZVdpbGRjYXJkJT4gYmFzZUNsYXNzKQotCXsKLSAgICA8JWZvciAoR2VuQ2xhc3MgbWl4aW5HZW5DbGFzcyA6IGdlbkNsYXNzLmdldE1peGluR2VuQ2xhc3NlcygpKSB7JT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1taXhpbkdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQkJewotICAgICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IG1peGluR2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPW1peGluR2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT47Ci0gICAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICAgIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0gIDwlfSU+Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPCU9c2luZ2xlV2lsZGNhcmQlPiBiYXNlQ2xhc3MpCi0JewotICA8JWZvciAoR2VuQ2xhc3MgbWl4aW5HZW5DbGFzcyA6IGdlbkNsYXNzLmdldE1peGluR2VuQ2xhc3NlcygpKSB7JT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1taXhpbkdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogbWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCQljYXNlIDwlPW1peGluR2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPWdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQkJewotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjsKLSAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICA8JX0lPgotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHsgU3RyaW5nIGVWaXJ0dWFsVmFsdWVzRmllbGQgPSBnZW5DbGFzcy5nZXRFVmlydHVhbFZhbHVlc0ZpZWxkKCk7JT4KLSAgPCVpZiAoZVZpcnR1YWxWYWx1ZXNGaWVsZCAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIE9iamVjdFtdIGVWaXJ0dWFsVmFsdWVzKCkKLQl7Ci0JCXJldHVybiA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCB2b2lkIGVTZXRWaXJ0dWFsVmFsdWVzKE9iamVjdFtdIG5ld1ZhbHVlcykKLQl7Ci0JCTwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPiA9IG5ld1ZhbHVlczsKLQl9Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3Q8U3RyaW5nPiBlVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHsgTGlzdDxTdHJpbmc+IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRBbGxFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgaW50IGVWaXJ0dWFsSW5kZXhCaXRzKGludCBvZmZzZXQpCi0JewotCQlzd2l0Y2ggKG9mZnNldCkKLQkJewotICAgICAgPCVmb3IgKGludCBpID0gMDsgaSA8IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuc2l6ZSgpOyBpKyspIHslPgotCQkJY2FzZSA8JT1pJT4gOgotCQkJCXJldHVybiA8JT1hbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLmdldChpKSU+OwotICAgICAgPCV9JT4KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCwgaW50IG5ld0luZGV4Qml0cykKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJPCU9YWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5nZXQoaSklPiA9IG5ld0luZGV4Qml0czsKLQkJCQlicmVhazsKLSAgICAgIDwlfSU+Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgIWdlbkNsYXNzLmdldFRvU3RyaW5nR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgPCV7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldFRvU3RyaW5nR2VuRmVhdHVyZXMoKSkgeyU+Ci0gICAgICA8JWlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JCXJlc3VsdC5hcHBlbmQoIiAoPCU9Z2VuRmVhdHVyZS5nZXROYW1lKCklPjogIik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoIiwgPCU9Z2VuRmVhdHVyZS5nZXROYW1lKCklPjogIik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJaWYgKGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikpIHJlc3VsdC5hcHBlbmQoZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+KDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0PCV9JT4pIHJlc3VsdC5hcHBlbmQoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXN1bHQuYXBwZW5kKGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT48JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpeyU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSU+KSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUga2V5RmVhdHVyZSA9IGdlbkNsYXNzLmdldE1hcEVudHJ5S2V5RmVhdHVyZSgpOyBHZW5GZWF0dXJlIHZhbHVlRmVhdHVyZSA9IGdlbkNsYXNzLmdldE1hcEVudHJ5VmFsdWVGZWF0dXJlKCk7JT4KLTwlU3RyaW5nIG9iamVjdFR5cGUgPSBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5PYmplY3QiKTslPgotPCVTdHJpbmcga2V5VHlwZSA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyBrZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpIDogb2JqZWN0VHlwZTslPgotPCVTdHJpbmcgdmFsdWVUeXBlID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/IHZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSA6IG9iamVjdFR5cGU7JT4KLTwlU3RyaW5nIGVNYXBUeXBlID0gZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpICsgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyAiPCIgKyBrZXlUeXBlICsgIiwgIiArIHZhbHVlVHlwZSArICI+IiA6ICIiKTslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRIYXNoKCkKLQl7Ci0JCWlmIChoYXNoID09IC0xKQotCQl7Ci0JCQk8JT1vYmplY3RUeXBlJT4gdGhlS2V5ID0gZ2V0S2V5KCk7Ci0JCQloYXNoID0gKHRoZUtleSA9PSBudWxsID8gMCA6IHRoZUtleS5oYXNoQ29kZSgpKTsKLQkJfQotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNoKGludCBoYXNoKQotCXsKLQkJdGhpcy5oYXNoID0gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9a2V5VHlwZSU+IGdldEtleSgpCi0JewotICA8JWlmIChrZXlGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT1rZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oZ2V0VHlwZWRLZXkoKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoPCU9a2V5VHlwZSU+IGtleSkKLQl7Ci0gIDwlaWYgKGtleUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJZ2V0VHlwZWRLZXkoKS5hZGRBbGwoPCVpZiAoIWdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPik8JX0lPmtleSk7Ci0gIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7JT4KLQkJc2V0VHlwZWRLZXkoa2V5KTsKLSAgPCV9IGVsc2UgaWYgKGtleUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlzZXRUeXBlZEtleSgoKDwlPWtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPilrZXkpLjwlPWtleUZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlzZXRUeXBlZEtleSgoPCU9a2V5RmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pa2V5KTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9dmFsdWVUeXBlJT4gZ2V0VmFsdWUoKQotCXsKLSAgPCVpZiAodmFsdWVGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT12YWx1ZUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPihnZXRUeXBlZFZhbHVlKCkpOwotICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9dmFsdWVUeXBlJT4gc2V0VmFsdWUoPCU9dmFsdWVUeXBlJT4gdmFsdWUpCi0JewotCQk8JT12YWx1ZVR5cGUlPiBvbGRWYWx1ZSA9IGdldFZhbHVlKCk7Ci0gIDwlaWYgKHZhbHVlRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZFZhbHVlKCkuY2xlYXIoKTsKLQkJZ2V0VHlwZWRWYWx1ZSgpLmFkZEFsbCg8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KTwlfSU+dmFsdWUpOwotICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyU+Ci0JCXNldFR5cGVkVmFsdWUodmFsdWUpOwotICA8JX0gZWxzZSBpZiAodmFsdWVGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSgoKDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KXZhbHVlKS48JT12YWx1ZUZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlzZXRUeXBlZFZhbHVlKCg8JT12YWx1ZUZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KXZhbHVlKTsKLSAgPCV9JT4KLQkJcmV0dXJuIG9sZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgPCV9JT4KLQlwdWJsaWMgPCU9ZU1hcFR5cGUlPiBnZXRFTWFwKCkKLQl7Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiKSU+IGNvbnRhaW5lciA9IGVDb250YWluZXIoKTsKLQkJcmV0dXJuIGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6ICg8JT1lTWFwVHlwZSU+KWNvbnRhaW5lci5lR2V0KGVDb250YWlubWVudEZlYXR1cmUoKSk7Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLX0gLy88JT1pc0ludGVyZmFjZSA/ICIgIiArIGdlbkNsYXNzLmdldEludGVyZmFjZU5hbWUoKSA6IGdlbkNsYXNzLmdldENsYXNzTmFtZSgpJT4KLTwlLy8gVE9ETyBmaXggdGhlIHNwYWNlIGFib3ZlJT4KLTwlZ2VuTW9kZWwuZW1pdFNvcnRlZEltcG9ydHMoKTslPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldC5vcmcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0Lm9yZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyNmEyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0Lm9yZworKysgL2Rldi9udWxsCkBAIC0xLDIwMjAgKzAsMCBAQAotPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS50ZW1wbGF0ZXMubW9kZWwiIGltcG9ydHM9ImphdmEudXRpbC4qIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLmdlbm1vZGVsLioiIGNsYXNzPSJDbGFzcyIgdmVyc2lvbj0iJElkOiBDbGFzcy5qYXZhamV0LHYgMS43MCAyMDA3LzA2LzE4IDE5OjM1OjIxIGVtZXJrcyBFeHAgJCIgJT4KLTwlCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqLwotJT4KLTwlZmluYWwgR2VuQ2xhc3MgZ2VuQ2xhc3MgPSAoR2VuQ2xhc3MpKChPYmplY3RbXSlhcmd1bWVudClbMF07IGZpbmFsIEdlblBhY2thZ2UgZ2VuUGFja2FnZSA9IGdlbkNsYXNzLmdldEdlblBhY2thZ2UoKTsgZmluYWwgR2VuTW9kZWwgZ2VuTW9kZWw9Z2VuUGFja2FnZS5nZXRHZW5Nb2RlbCgpOyU+Ci08JWZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UgPSBCb29sZWFuLlRSVUUuZXF1YWxzKCgoT2JqZWN0W10pYXJndW1lbnQpWzFdKTsgZmluYWwgYm9vbGVhbiBpc0ltcGxlbWVudGF0aW9uID0gQm9vbGVhbi5UUlVFLmVxdWFscygoKE9iamVjdFtdKWFyZ3VtZW50KVsyXSk7JT4KLTwlZmluYWwgU3RyaW5nIHB1YmxpY1N0YXRpY0ZpbmFsRmxhZyA9IGlzSW1wbGVtZW50YXRpb24gPyAicHVibGljIHN0YXRpYyBmaW5hbCAiIDogIiI7JT4KLTwlZmluYWwgU3RyaW5nIHNpbmdsZVdpbGRjYXJkID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/ICI8Pz4iIDogIiI7JT4KLTwlZmluYWwgU3RyaW5nIG5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiA9IGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgLSAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKG51bGwpIDogIiI7JT4KLTwlZmluYWwgU3RyaW5nIHBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiA9IGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKG51bGwpIDogIiI7JT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii4uL0hlYWRlci5qYXZhamV0aW5jIiU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci1wYWNrYWdlIDwlPWdlblBhY2thZ2UuZ2V0SW50ZXJmYWNlUGFja2FnZU5hbWUoKSU+OwotPCV9IGVsc2UgeyU+Ci1wYWNrYWdlIDwlPWdlblBhY2thZ2UuZ2V0Q2xhc3NQYWNrYWdlTmFtZSgpJT47Ci08JX0lPgotCi08JWdlbk1vZGVsLm1hcmtJbXBvcnRMb2NhdGlvbihzdHJpbmdCdWZmZXIsIGdlblBhY2thZ2UpOyU+Ci0KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPCVpZiAoZ2VuQ2xhc3MuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIDwlPWdlbkNsYXNzLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotPCV9JT4KLSAqCi08JWlmICghZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0gKiAgIDxsaT57QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn08L2xpPgotICA8JX0lPgotPCV9JT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci08JX0lPgotICoKLTwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSkgeyU+Ci0gKiBAc2VlIDwlPWdlblBhY2thZ2UuZ2V0UXVhbGlmaWVkUGFja2FnZUludGVyZmFjZU5hbWUoKSU+I2dldDwlPWdlbkNsYXNzLmdldENsYXNzaWZpZXJBY2Nlc3Nvck5hbWUoKSU+KCkKLTwlfSU+Ci08JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbkNsYXNzLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotPCV9IGVsc2UgeyU+Ci0gKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLTwlfX0gaWYgKGZpcnN0KSB7JT4KLSAqIEBtb2RlbAotPCV9fSU+Ci08JWlmIChnZW5DbGFzcy5uZWVkc1Jvb3RFeHRlbmRzSW50ZXJmYWNlRXh0ZW5kc1RhZygpKSB7JT4KLSAqIEBleHRlbmRzIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZShnZW5Nb2RlbC5nZXRSb290RXh0ZW5kc0ludGVyZmFjZSgpKSU+Ci08JX0lPgotICogQGdlbmVyYXRlZAotICovCi08JX0gZWxzZSB7JT4KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj48JT1nZW5DbGFzcy5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotPCVpZiAoIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpKSB7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59PC9saT4KLTwlfSU+Ci0gKiA8L3VsPgotPCV9JT4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uKSB7JT4KLXB1YmxpYzwlaWYgKGdlbkNsYXNzLmlzQWJzdHJhY3QoKSkgeyU+IGFic3RyYWN0PCV9JT4gY2xhc3MgPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPjwlPWdlbkNsYXNzLmdldFR5cGVQYXJhbWV0ZXJzKCkudHJpbSgpJT48JT1nZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHMoKSU+PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NJbXBsZW1lbnRzKCklPgotPCV9IGVsc2UgeyU+Ci1wdWJsaWMgaW50ZXJmYWNlIDwlPWdlbkNsYXNzLmdldEludGVyZmFjZU5hbWUoKSU+PCU9Z2VuQ2xhc3MuZ2V0VHlwZVBhcmFtZXRlcnMoKS50cmltKCklPjwlPWdlbkNsYXNzLmdldEludGVyZmFjZUV4dGVuZHMoKSU+Ci08JX0lPgotewotPCVpZiAoZ2VuTW9kZWwuaGFzQ29weXJpZ2h0RmllbGQoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JPCU9cHVibGljU3RhdGljRmluYWxGbGFnJT48JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5TdHJpbmciKSU+IGNvcHlyaWdodCA9IDwlPWdlbk1vZGVsLmdldENvcHlyaWdodEZpZWxkTGl0ZXJhbCgpJT47PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5nZXREcml2ZXJOdW1iZXIoKSAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLlN0cmluZyIpJT4gbW9mRHJpdmVyTnVtYmVyID0gIjwlPWdlbk1vZGVsLmdldERyaXZlck51bWJlcigpJT4iOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaXNKYXZhSU9TZXJpYWxpemFibGUoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyBTdHJpbmcgZVZpcnR1YWxWYWx1ZXNGaWVsZCA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsVmFsdWVzRmllbGQoKTslPgotICA8JWlmIChlVmlydHVhbFZhbHVlc0ZpZWxkICE9IG51bGwpIHslPgotCS8qKgotCSAqIEFuIGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2Ygbm9uLXByaW1pdGl2ZSBmZWF0dXJlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+OwotCi0gIDwlfSU+Ci0gIDwleyBMaXN0PFN0cmluZz4gZVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOyU+Ci0gICAgPCVpZiAoIWVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuaXNFbXB0eSgpKSB7JT4KLSAgICAgIDwlZm9yIChTdHJpbmcgZVZpcnR1YWxJbmRleEJpdEZpZWxkIDogZVZpcnR1YWxJbmRleEJpdEZpZWxkcykgeyU+Ci0JLyoqCi0JICogQSBiaXQgZmllbGQgcmVwcmVzZW50aW5nIHRoZSBpbmRpY2VzIG9mIG5vbi1wcmltaXRpdmUgZmVhdHVyZSB2YWx1ZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1lVmlydHVhbEluZGV4Qml0RmllbGQlPjsKLQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaXNNb2RlbFJvb3QoKSAmJiBnZW5Nb2RlbC5pc0Jvb2xlYW5GbGFnc0VuYWJsZWQoKSAmJiBnZW5Nb2RlbC5nZXRCb29sZWFuRmxhZ3NSZXNlcnZlZEJpdHMoKSA9PSAtMSkgeyU+Ci0JLyoqCi0JICogQSBzZXQgb2YgYml0IGZsYWdzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgd2hldGhlciB1bnNldHRhYmxlIGZlYXR1cmVzIGhhdmUgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWdlbk1vZGVsLmdldEJvb2xlYW5GbGFnc0ZpZWxkKCklPiA9IDA7Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZEdlbkZlYXR1cmVzKCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNBcnJheUFjY2Vzc29ycygpICYmIGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyBTdHJpbmcgcmF3TGlzdEl0ZW1UeXBlID0gZ2VuRmVhdHVyZS5nZXRSYXdMaXN0SXRlbVR5cGUoKTsgaW50IGluZGV4ID0gcmF3TGlzdEl0ZW1UeXBlLmluZGV4T2YoJ1snKTsgU3RyaW5nIGhlYWQgPSByYXdMaXN0SXRlbVR5cGU7IFN0cmluZyB0YWlsID0gIiI7IGlmIChpbmRleCAhPSAtMSkgeyBoZWFkID0gcmF3TGlzdEl0ZW1UeXBlLnN1YnN0cmluZygwLCBpbmRleCk7IHRhaWwgPSByYXdMaXN0SXRlbVR5cGUuc3Vic3RyaW5nKGluZGV4KTsgfSAlPgotCS8qKgotCSAqIFRoZSBlbXB0eSB2YWx1ZSBmb3IgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgYXJyYXkgYWNjZXNzb3IuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpLmNvbnRhaW5zKCI8IikpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICA8JX0lPgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgPCU9cmF3TGlzdEl0ZW1UeXBlJT5bXSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZID0gbmV3IDwlPWhlYWQlPiBbMF08JT10YWlsJT47Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkgJiYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSB8fCAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICghZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSB8fCAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkpKSB7IFN0cmluZyBzdGF0aWNEZWZhdWx0VmFsdWUgPSBnZW5GZWF0dXJlLmdldFN0YXRpY0RlZmF1bHRWYWx1ZSgpOyU+Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgICAgICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmIGdlbkZlYXR1cmUuaXNMaXN0RGF0YVR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzU2V0RGVmYXVsdFZhbHVlKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICA8JX0lPgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JWlmICgiIi5lcXVhbHMoc3RhdGljRGVmYXVsdFZhbHVlKSkgeyU+OyAvLyBUT0RPIFRoZSBkZWZhdWx0IHZhbHVlIGxpdGVyYWwgIjwlPWdlbkZlYXR1cmUuZ2V0RWNvcmVGZWF0dXJlKCkuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpJT4iIGlzIG5vdCB2YWxpZC48JX0gZWxzZSB7JT4gPSA8JT1zdGF0aWNEZWZhdWx0VmFsdWUlPjs8JT1nZW5Nb2RlbC5nZXROb25OTFMoc3RhdGljRGVmYXVsdFZhbHVlKSU+PCV9JT4KLQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyID09IDApIHslPgotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gPSAwOwotCi0gICAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgJT47Ci0KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4gPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSU+OwotCi0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgPiAzMSAmJiBnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgPT0gMCkgeyU+Ci0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBzZXQgb2YgYml0IGZsYWdzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgd2hldGhlciB1bnNldHRhYmxlIGZlYXR1cmVzIGhhdmUgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gPSAwOwotCi0gICAgICAgIDwlfSU+Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIDwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHID0gMSA8JT0iPDwgIiArIGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiAlPjsKLQotICAgICAgPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSA8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKG51bGwpJT4gPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc2lmaWVyQWNjZXNzb3IoKSU+LmdldEZlYXR1cmVJRCg8JT1nZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuZ2V0KDApLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5nZXQoMCkpJT47Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7JT4KLSAgICA8JWlmIChyZXZlcnNlRmVhdHVyZSAhPSBudWxsICYmIHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCkuaGFzT2Zmc2V0Q29ycmVjdGlvbigpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKGdlbkZlYXR1cmUpJT4gPSA8JT1yZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT4uZ2V0RmVhdHVyZUlEKDwlPXJldmVyc2VGZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pIC0gPCU9cmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT47Ci0KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCTwlaWYgKGdlbk1vZGVsLmlzUHVibGljQ29uc3RydWN0b3JzKCkpIHslPnB1YmxpYzwlfSBlbHNlIHslPnByb3RlY3RlZDwlfSU+IDwlPWdlbkNsYXNzLmdldENsYXNzTmFtZSgpJT4oKQotCXsKLQkJc3VwZXIoKTsKLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEZsYWdHZW5GZWF0dXJlcygidHJ1ZSIpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgPCV9JT4KLSAgICAKLSAvL1VNQS0tPgotIAkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0gLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyIpJT4gZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRDbGFzc2lmaWVyQWNjZXNzb3IoKSU+OwotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3JlZmxlY3RpdmVEZWxlZ2F0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmdldEZlYXR1cmVEZWxlZ2F0aW9uKCkgPT0gR2VuRGVsZWdhdGlvbktpbmQuUkVGTEVDVElWRV9MSVRFUkFMICYmIChnZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpID09IG51bGwgfHwgZ2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKS5nZXRHZW5Nb2RlbCgpLmdldEZlYXR1cmVEZWxlZ2F0aW9uKCkgIT0gR2VuRGVsZWdhdGlvbktpbmQuUkVGTEVDVElWRV9MSVRFUkFMKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCBpbnQgZVN0YXRpY0ZlYXR1cmVDb3VudCgpCi0JewotCQlyZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKSA9PSBudWxsID8gMCA6IGdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkuZ2V0QWxsR2VuRmVhdHVyZXMoKS5zaXplKCklPjsKLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL3JlZmxlY3RpdmVEZWxlZ2F0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCVuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHslPgotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IChpc0ltcGxlbWVudGF0aW9uID8gZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpIDogZ2VuQ2xhc3MuZ2V0RGVjbGFyZWRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0gIDwlaWYgKGdlbk1vZGVsLmlzQXJyYXlBY2Nlc3NvcnMoKSAmJiBnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKTsKLQotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICA8JX0lPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKQotCXsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPiBsaXN0ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSByZXR1cm4gPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpLmNvbnRhaW5zKCI8IikgJiYgIWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKG51bGwpLmVxdWFscyhnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSk8JX0lPjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwgfHwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpKSByZXR1cm4gPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpLmNvbnRhaW5zKCI8IikgJiYgIWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKG51bGwpLmVxdWFscyhnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSk8JX0lPjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVk7Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4gbGlzdCA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9JT4KLQkJbGlzdC5zaHJpbmsoKTsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKWxpc3QuZGF0YSgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgpCi0JewotCQlyZXR1cm4gPCVpZiAoIWdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPik8JX0lPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuZ2V0KGluZGV4KTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgaW50IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPkxlbmd0aCgpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zaXplKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwgPyAwIDogPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uc2l6ZSgpOwotICAgICAgPCV9JT4KLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQl7Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXREYXRhKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4ubGVuZ3RoLCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+IGVsZW1lbnQpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCwgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZWxlbWVudCkKLQl7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzR2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7IEdlbkZlYXR1cmUga2V5RmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeUtleUZlYXR1cmUoKTsgR2VuRmVhdHVyZSB2YWx1ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldE1hcEVudHJ5VHlwZUdlbkNsYXNzKCkuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTsgJT4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPmxpc3Qgb2Yge0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+fTwlfSBlbHNlIHslPntAbGluayA8JT1rZXlGZWF0dXJlLmdldFR5cGUoZ2VuQ2xhc3MpJT59PCV9JT4sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIDwlaWYgKHZhbHVlRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPmxpc3Qgb2Yge0BsaW5rIDwlPXZhbHVlRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPXZhbHVlRmVhdHVyZS5nZXRUeXBlKGdlbkNsYXNzKSU+fTwlfSU+LAotICAgICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkgJiYgIShnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSAmJiAib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiLmVxdWFscyhnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcykpKSkgewotU3RyaW5nIHR5cGVOYW1lID0gZ2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpOyBTdHJpbmcgaGVhZCA9IHR5cGVOYW1lOyBTdHJpbmcgdGFpbCA9ICIiOyBpbnQgaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCc8Jyk7IGlmIChpbmRleCA9PSAtMSkgeyBpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoJ1snKTsgfSAKLWlmIChpbmRleCAhPSAtMSkgeyBoZWFkID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsgdGFpbCA9IHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCkucmVwbGFjZUFsbCgiPCIsICImbHQ7Iik7IH0KLSU+Ci0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIDwlPWhlYWQlPn08JT10YWlsJT4uCi0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzU2V0RGVmYXVsdFZhbHVlKCkpIHslPgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPjwlPWdlbkZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCklPjwvY29kZT4uCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkgIT0gbnVsbCkgeyU+Ci0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+fS4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgJiYgIWdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpLmdldEdlbkNsYXNzKCkuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUdlbkZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgJT4KLSAgICAgIDwlaWYgKCFyZXZlcnNlR2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIDwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScuCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotICAgIDwlfSU+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDwlPWdlbkZlYXR1cmUuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICAgIDwlfSU+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkgIT0gbnVsbCkgeyU+Ci0JICogQHNlZSA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRSYXdJbXBvcnRlZEJvdW5kVHlwZSgpJT4pCi0gICAgPCV9JT4KLSAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkpIHslPgotCSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlQWNjZXNzb3JOYW1lKCklPigpCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpICYmICFnZW5GZWF0dXJlLmdldFJldmVyc2UoKS5nZXRHZW5DbGFzcygpLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VHZW5GZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7ICU+Ci0gICAgICA8JWlmICghcmV2ZXJzZUdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlIDwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5GZWF0dXJlLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkgKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLSAgICA8JX0gZWxzZSB7JT4KLQkgKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLSAgICA8JX19IGlmIChmaXJzdCkgeyU+Ci0JICogQG1vZGVsCi0gICAgPCV9fSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9nZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICgoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpIHx8IGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzVW5jaGVja2VkQ2FzdCgpIHx8IGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgfHwgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB8fCBnZW5GZWF0dXJlLmlzTGlzdERhdGFUeXBlKCkgJiYgZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICA8JX0lPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPillR2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwpCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldyA8JT1nZW5DbGFzcy5nZXRMaXN0Q29uc3RydWN0b3IoZ2VuRmVhdHVyZSklPjsKLSAgICAgICAgPCV9JT4KLQkJfQotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JT1nZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkgPyAiLm1hcCgpIiA6ICIiJT47Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZUNvbnRhaW5lcigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+PCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pOwotICAgICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWVBc0VPYmplY3QoKSU+LmVJc1Byb3h5KCkpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldE5vbkVPYmplY3RJbnRlcm5hbFR5cGVDYXN0KGdlbkNsYXNzKSU+ZVJlc29sdmVQcm94eShvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCQkJewotICAgICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG51bGwpOwotICAgICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9ICBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG51bGwpOwotICAgICAgICAgIDwlfSU+Ci0JCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkKLQkJCQl7Ci0gICAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCQltc2dzID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQkJbXNncyA9ICBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICAgIDwlfSU+Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQllVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5SRVNPTFZFLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikpOwotICAgICAgICAgIDwlfSU+Ci0JCQl9Ci0JCX0KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7Ly92b2xhdGlsZSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWVBc0VPYmplY3QoKSU+LmVJc1Byb3h5KCkgPyA8JT1nZW5GZWF0dXJlLmdldE5vbkVPYmplY3RJbnRlcm5hbFR5cGVDYXN0KGdlbkNsYXNzKSU+ZVJlc29sdmVQcm94eSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlU3RyaW5nIGZlYXR1cmVNYXBFbnRyeVRlbXBsYXRlQXJndW1lbnQgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gIjwiICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIikgKyAiLkVudHJ5PiIgOiAiIjslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkRWZmZWN0aXZlRmVhdHVyZU1hcFdyYXBwZXJDbGFzcygpJT4oKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLjwlPWZlYXR1cmVNYXBFbnRyeVRlbXBsYXRlQXJndW1lbnQlPmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KSk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLjwlPWZlYXR1cmVNYXBFbnRyeVRlbXBsYXRlQXJndW1lbnQlPmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT48JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpID09IG51bGwgfHwgIWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkuaXNPYmplY3RUeXBlKCkpIHslPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT4oKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+PCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKSA9PSBudWxsIHx8ICFnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpLmlzT2JqZWN0VHlwZSgpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KTwlfSU+Z2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCS8vIFRoZSBsaXN0IGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IGFuZCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcKLQkJLy8gc28gaXQncyBsaWtlbHkgdGhhdCBhbiBhcHByb3ByaWF0ZSBzdWJjbGFzcyBvZiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC48JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT5FY29yZUVNYXA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPkJhc2ljRmVhdHVyZU1hcDwlfSBlbHNlIHslPkVjb3JlRUxpc3Q8JX0lPiBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgPCV9JT4KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNHZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pIHJldHVybiBudWxsOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVJbnRlcm5hbENvbnRhaW5lcigpOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBmYWxzZSk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIGZhbHNlKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEludGVybmFsVHlwZShnZW5DbGFzcyklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG51bGwgOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+IW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUUgPyBudWxsIDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICAgIDwlfSU+Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLSAgICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5iYXNpY0FkZCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGNvbnRhaW5lZCAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gdGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIHRvIGtlZXAgdGhlIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCBpbiBzeW5jaAotCQkvLyAtPiBkbyBub3QgbW9kaWZ5IG90aGVyIGZlYXR1cmVzCi0JCS8vIC0+IHJldHVybiBtc2dzLCBhZnRlciBhZGRpbmcgYW55IGdlbmVyYXRlZCBOb3RpZmljYXRpb24gdG8gaXQgKGlmIGl0IGlzIG51bGwsIGEgTm90aWZpY2F0aW9uQ2hhaW4gb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBmaXJzdCkKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1NldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHsgJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0JICogQHNlZSA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL3NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyAlPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IHZhbHVlKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQllU2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+ICYmIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkpCi0JCXsKLQkJCWlmICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCIpJT4uaXNBbmNlc3Rvcih0aGlzLCA8JT1nZW5GZWF0dXJlLmdldEVPYmplY3RDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKQotCQkJCXRocm93IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSU+KCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSB8fCBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0JCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQllbHNlCi0JCXsKLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgIW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgICAgPCV9JT4KLQkJfQotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsgZWxzZSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA6IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA6IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgICA8JX0lPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUUgPyA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNVbnNldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxVbnNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogbnVsbDwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbnVsbCwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotICAgICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gdW5zZXQgdGhlIGNvbnRhaW5lZCAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gdGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIHRvIGtlZXAgdGhlIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCBpbiBzeW5jaAotCQkvLyAtPiBkbyBub3QgbW9kaWZ5IG90aGVyIGZlYXR1cmVzCi0JCS8vIC0+IHJldHVybiBtc2dzLCBhZnRlciBhZGRpbmcgYW55IGdlbmVyYXRlZCBOb3RpZmljYXRpb24gdG8gaXQgKGlmIGl0IGlzIG51bGwsIGEgTm90aWZpY2F0aW9uQ2hhaW4gb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBmaXJzdCkKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MuYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRSYXdJbXBvcnRlZEJvdW5kVHlwZSgpJT4pCi0gIDwlfSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQllVW5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4uVW5zZXR0YWJsZTwlPXNpbmdsZVdpbGRjYXJkJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLnVuc2V0KCk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSB8fCBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICA8JX0lPgotCQkJbXNncyA9IGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBudWxsLCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCkpOwotICAgICAgICA8JX0lPgotCQl9Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxVbnNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBudWxsOwotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPikgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsgZWxzZSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuY2xlYXIoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuY2xlYXIoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gdW5zZXQgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0lzU2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQuCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldC4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmIGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRSYXdJbXBvcnRlZEJvdW5kVHlwZSgpJT4pCi0gICAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JYm9vbGVhbiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgYm9vbGVhbiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiBlSXNTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlPCU9c2luZ2xlV2lsZGNhcmQlPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuaXNTZXQoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmlzRW1wdHkoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHdoZXRoZXIgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5GZWF0dXJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0vL2ZvciU+Ci08JX19LnJ1bigpOyU+Ci08JWZvciAoR2VuT3BlcmF0aW9uIGdlbk9wZXJhdGlvbiA6IChpc0ltcGxlbWVudGF0aW9uID8gZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5PcGVyYXRpb25zKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbk9wZXJhdGlvbnMoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICA8JWlmIChnZW5PcGVyYXRpb24uaGFzRG9jdW1lbnRhdGlvbigpIHx8IGdlbk9wZXJhdGlvbi5oYXNQYXJhbWV0ZXJEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICAgIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwlPWdlbk9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgICA8JX0lPgotICAgIDwlZm9yIChHZW5QYXJhbWV0ZXIgZ2VuUGFyYW1ldGVyIDogZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5QYXJhbWV0ZXIuaGFzRG9jdW1lbnRhdGlvbigpKSB7IFN0cmluZyBkb2N1bWVudGF0aW9uID0gZ2VuUGFyYW1ldGVyLmdldERvY3VtZW50YXRpb24oIiIpOyU+Ci0gICAgICAgIDwlaWYgKGRvY3VtZW50YXRpb24uY29udGFpbnMoIlxuIikgfHwgZG9jdW1lbnRhdGlvbi5jb250YWlucygiXHIiKSkgeyU+Ci0JICogQHBhcmFtIDwlPWdlblBhcmFtZXRlci5nZXROYW1lKCklPgotCSAqICAgPCU9Z2VuUGFyYW1ldGVyLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgICAgICA8JX0gZWxzZSB7JT4KLQkgKiBAcGFyYW0gPCU9Z2VuUGFyYW1ldGVyLmdldE5hbWUoKSU+IDwlPWdlblBhcmFtZXRlci5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gIDwlfSU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuT3BlcmF0aW9uLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkgKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLSAgPCV9IGVsc2UgeyU+Ci0JICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci0gIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgPCV9fSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZW5PcGVyYXRpb24uamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2dlbk9wZXJhdGlvbi5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbk9wZXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycyhnZW5DbGFzcyklPjwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+KDwlPWdlbk9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoZ2VuQ2xhc3MpJT47Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5PcGVyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT48JT1nZW5PcGVyYXRpb24uZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPig8JT1nZW5PcGVyYXRpb24uZ2V0UGFyYW1ldGVycyhnZW5DbGFzcyklPik8JT1nZW5PcGVyYXRpb24uZ2V0VGhyb3dzKGdlbkNsYXNzKSU+Ci0JewotICA8JWlmIChnZW5PcGVyYXRpb24uaGFzQm9keSgpKSB7JT4KLQkJPCU9Z2VuT3BlcmF0aW9uLmdldEJvZHkoZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICA8JX0gZWxzZSBpZiAoZ2VuT3BlcmF0aW9uLmlzSW52YXJpYW50KCkpIHtHZW5DbGFzcyBvcENsYXNzID0gZ2VuT3BlcmF0aW9uLmdldEdlbkNsYXNzKCk7IFN0cmluZyBkaWFnbm9zdGljcyA9IGdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKTsgU3RyaW5nIGNvbnRleHQgPSBnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpLmdldCgxKS5nZXROYW1lKCk7JT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIC0+IHNwZWNpZnkgdGhlIGNvbmRpdGlvbiB0aGF0IHZpb2xhdGVzIHRoZSBpbnZhcmlhbnQKLQkJLy8gLT4gdmVyaWZ5IHRoZSBkZXRhaWxzIG9mIHRoZSBkaWFnbm9zdGljLCBpbmNsdWRpbmcgc2V2ZXJpdHkgYW5kIG1lc3NhZ2UKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJaWYgKGZhbHNlKQotCQl7Ci0JCQlpZiAoPCU9ZGlhZ25vc3RpY3MlPiAhPSBudWxsKQotCQkJewotCQkJCTwlPWRpYWdub3N0aWNzJT4uYWRkCi0JCQkJCShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljIiklPgotCQkJCQkJKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMiKSU+LkVSUk9SLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi5ESUFHTk9TVElDX1NPVVJDRSwKLQkJCQkJCSA8JT1vcENsYXNzLmdldEdlblBhY2thZ2UoKS5nZXRJbXBvcnRlZFZhbGlkYXRvckNsYXNzTmFtZSgpJT4uPCU9b3BDbGFzcy5nZXRPcGVyYXRpb25JRChnZW5PcGVyYXRpb24pJT4sCi0JCQkJCQkgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luIiklPi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HZW5lcmljSW52YXJpYW50X2RpYWdub3N0aWMiLCBuZXcgT2JqZWN0W10geyAiPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+IiwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0VmFsaWRhdG9yIiklPi5nZXRPYmplY3RMYWJlbCh0aGlzLCA8JT1jb250ZXh0JT4pIH0pLDwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT48JT1nZW5Nb2RlbC5nZXROb25OTFMoMiklPgotCQkJCQkJIG5ldyBPYmplY3QgW10geyB0aGlzIH0pKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLSAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24udG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0vL2ZvciU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSW52ZXJzZUFkZEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5jaGVja2VkQ2FzdCgpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlYnJlYWs7IH0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlSW52ZXJzZUFkZCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyBTdHJpbmcgY2FzdCA9ICIoIiAgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSArICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSA/ICIpIiA6ICI8IiArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpICsgIj4pKCIgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSArICI8Pz4pIik7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWNhc3QlPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICg8JT1jYXN0JT48JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KW90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+YmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPjwlfSU+KCk7Ci0gICAgPCV9JT4KLQkJCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICA8JX0lPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pb3RoZXJFbmQsIG1zZ3MpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVJbnZlcnNlUmVtb3ZlKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VSZW1vdmVHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT48JT1zaW5nbGVXaWxkY2FyZCU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3PCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZE1hcFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT48JT1zaW5nbGVXaWxkY2FyZCU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT48JT1zaW5nbGVXaWxkY2FyZCU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpICYmICFnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci0JCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBtc2dzKTsKLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXJldHVybiBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG1zZ3MpOwotICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obnVsbCwgbXNncyk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVCYXNpY1JlbW92ZUZyb21Db250YWluZXJHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyR2VuRmVhdHVyZXMoKSkgeyU+Ci0gIDwlR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFR2V0R2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVHZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCb29sZWFuVHlwZSgpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIG5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQllbHNlIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLm1hcCgpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZ2V0V3JhcHBlcigpOwotICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5jaGVja2VkQ2FzdCgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICA8JWJyZWFrOyB9JT4KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUiKSU+LlNldHRpbmcpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5jbGVhcigpOwotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuYWRkQWxsKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPjwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHslPjw/IGV4dGVuZHMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4+PCV9JT4pbmV3VmFsdWUpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCgoPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KW5ld1ZhbHVlKS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpID09IG51bGwgfHwgIWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkuaXNPYmplY3RUeXBlKCkgfHwgIWdlbkZlYXR1cmUuZ2V0UmF3VHlwZSgpLmVxdWFscyhnZW5GZWF0dXJlLmdldFR5cGUoZ2VuQ2xhc3MpKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KTwlfSU+bmV3VmFsdWUpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuOwotICA8JX0lPgotCQl9Ci0gIDwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICA8JX0gZWxzZSB7JT4KLQkJZUR5bmFtaWNTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gIDwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RVVuc2V0R2VuRmVhdHVyZXMoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZVVuc2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RVVuc2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpLmNsZWFyKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQl1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KW51bGwpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPik7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci0JCX0KLSAgPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICA8JX0gZWxzZSB7JT4KLQkJZUR5bmFtaWNVbnNldChmZWF0dXJlSUQpOwotICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9lVW5zZXQub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUlzU2V0R2VuRmVhdHVyZXMoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSXNTZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpICYmICFnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkgJiYgZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlYnJlYWs7IH0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLS8vVU1BLS0+Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4gZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJc1NldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuaXNFbXB0eSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmZlYXR1cmVNYXAoKS5pc0VtcHR5KCk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAhPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5pc0VtcHR5KCk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQlyZXR1cm4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pICE9IG51bGw7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSAhPSBudWxsOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGw7Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSAhPSBudWxsOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gbnVsbDsKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkgfHwgZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KSAhPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSB7Ly9kYXRhdHlwZSU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2VJc1NldC5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICghZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5GZWF0dXJlcygpLmlzRW1wdHkoKSB8fCBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSkgeyU+Ci0gIDwlaWYgKCFnZW5DbGFzcy5nZXRNaXhpbkdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgICA8JX0lPgotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczwlPXNpbmdsZVdpbGRjYXJkJT4gYmFzZUNsYXNzKQotCXsKLSAgICA8JWZvciAoR2VuQ2xhc3MgbWl4aW5HZW5DbGFzcyA6IGdlbkNsYXNzLmdldE1peGluR2VuQ2xhc3NlcygpKSB7JT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1taXhpbkdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQkJewotICAgICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IG1peGluR2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPW1peGluR2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT47Ci0gICAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICAgIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0gIDwlfSU+Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPCU9c2luZ2xlV2lsZGNhcmQlPiBiYXNlQ2xhc3MpCi0JewotICA8JWZvciAoR2VuQ2xhc3MgbWl4aW5HZW5DbGFzcyA6IGdlbkNsYXNzLmdldE1peGluR2VuQ2xhc3NlcygpKSB7JT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1taXhpbkdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogbWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCQljYXNlIDwlPW1peGluR2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPWdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQkJewotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjsKLSAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICA8JX0lPgotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHsgU3RyaW5nIGVWaXJ0dWFsVmFsdWVzRmllbGQgPSBnZW5DbGFzcy5nZXRFVmlydHVhbFZhbHVlc0ZpZWxkKCk7JT4KLSAgPCVpZiAoZVZpcnR1YWxWYWx1ZXNGaWVsZCAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIE9iamVjdFtdIGVWaXJ0dWFsVmFsdWVzKCkKLQl7Ci0JCXJldHVybiA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCB2b2lkIGVTZXRWaXJ0dWFsVmFsdWVzKE9iamVjdFtdIG5ld1ZhbHVlcykKLQl7Ci0JCTwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPiA9IG5ld1ZhbHVlczsKLQl9Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3Q8U3RyaW5nPiBlVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHsgTGlzdDxTdHJpbmc+IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRBbGxFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgaW50IGVWaXJ0dWFsSW5kZXhCaXRzKGludCBvZmZzZXQpCi0JewotCQlzd2l0Y2ggKG9mZnNldCkKLQkJewotICAgICAgPCVmb3IgKGludCBpID0gMDsgaSA8IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuc2l6ZSgpOyBpKyspIHslPgotCQkJY2FzZSA8JT1pJT4gOgotCQkJCXJldHVybiA8JT1hbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLmdldChpKSU+OwotICAgICAgPCV9JT4KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCwgaW50IG5ld0luZGV4Qml0cykKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJPCU9YWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5nZXQoaSklPiA9IG5ld0luZGV4Qml0czsKLQkJCQlicmVhazsKLSAgICAgIDwlfSU+Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgIWdlbkNsYXNzLmdldFRvU3RyaW5nR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgPCV7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldFRvU3RyaW5nR2VuRmVhdHVyZXMoKSkgeyU+Ci0gICAgICA8JWlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JCXJlc3VsdC5hcHBlbmQoIiAoPCU9Z2VuRmVhdHVyZS5nZXROYW1lKCklPjogIik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoIiwgPCU9Z2VuRmVhdHVyZS5nZXROYW1lKCklPjogIik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJaWYgKGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikpIHJlc3VsdC5hcHBlbmQoZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+KDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0PCV9JT4pIHJlc3VsdC5hcHBlbmQoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXN1bHQuYXBwZW5kKGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT48JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpeyU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSU+KSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUga2V5RmVhdHVyZSA9IGdlbkNsYXNzLmdldE1hcEVudHJ5S2V5RmVhdHVyZSgpOyBHZW5GZWF0dXJlIHZhbHVlRmVhdHVyZSA9IGdlbkNsYXNzLmdldE1hcEVudHJ5VmFsdWVGZWF0dXJlKCk7JT4KLTwlU3RyaW5nIG9iamVjdFR5cGUgPSBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5PYmplY3QiKTslPgotPCVTdHJpbmcga2V5VHlwZSA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyBrZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpIDogb2JqZWN0VHlwZTslPgotPCVTdHJpbmcgdmFsdWVUeXBlID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/IHZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSA6IG9iamVjdFR5cGU7JT4KLTwlU3RyaW5nIGVNYXBUeXBlID0gZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpICsgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyAiPCIgKyBrZXlUeXBlICsgIiwgIiArIHZhbHVlVHlwZSArICI+IiA6ICIiKTslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRIYXNoKCkKLQl7Ci0JCWlmIChoYXNoID09IC0xKQotCQl7Ci0JCQk8JT1vYmplY3RUeXBlJT4gdGhlS2V5ID0gZ2V0S2V5KCk7Ci0JCQloYXNoID0gKHRoZUtleSA9PSBudWxsID8gMCA6IHRoZUtleS5oYXNoQ29kZSgpKTsKLQkJfQotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNoKGludCBoYXNoKQotCXsKLQkJdGhpcy5oYXNoID0gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9a2V5VHlwZSU+IGdldEtleSgpCi0JewotICA8JWlmIChrZXlGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT1rZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oZ2V0VHlwZWRLZXkoKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoPCU9a2V5VHlwZSU+IGtleSkKLQl7Ci0gIDwlaWYgKGtleUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJZ2V0VHlwZWRLZXkoKS5hZGRBbGwoPCVpZiAoIWdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPik8JX0lPmtleSk7Ci0gIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7JT4KLQkJc2V0VHlwZWRLZXkoa2V5KTsKLSAgPCV9IGVsc2UgaWYgKGtleUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlzZXRUeXBlZEtleSgoKDwlPWtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPilrZXkpLjwlPWtleUZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlzZXRUeXBlZEtleSgoPCU9a2V5RmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pa2V5KTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9dmFsdWVUeXBlJT4gZ2V0VmFsdWUoKQotCXsKLSAgPCVpZiAodmFsdWVGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT12YWx1ZUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPihnZXRUeXBlZFZhbHVlKCkpOwotICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9dmFsdWVUeXBlJT4gc2V0VmFsdWUoPCU9dmFsdWVUeXBlJT4gdmFsdWUpCi0JewotCQk8JT12YWx1ZVR5cGUlPiBvbGRWYWx1ZSA9IGdldFZhbHVlKCk7Ci0gIDwlaWYgKHZhbHVlRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZFZhbHVlKCkuY2xlYXIoKTsKLQkJZ2V0VHlwZWRWYWx1ZSgpLmFkZEFsbCg8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KTwlfSU+dmFsdWUpOwotICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyU+Ci0JCXNldFR5cGVkVmFsdWUodmFsdWUpOwotICA8JX0gZWxzZSBpZiAodmFsdWVGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSgoKDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KXZhbHVlKS48JT12YWx1ZUZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlzZXRUeXBlZFZhbHVlKCg8JT12YWx1ZUZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KXZhbHVlKTsKLSAgPCV9JT4KLQkJcmV0dXJuIG9sZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgPCV9JT4KLQlwdWJsaWMgPCU9ZU1hcFR5cGUlPiBnZXRFTWFwKCkKLQl7Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiKSU+IGNvbnRhaW5lciA9IGVDb250YWluZXIoKTsKLQkJcmV0dXJuIGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6ICg8JT1lTWFwVHlwZSU+KWNvbnRhaW5lci5lR2V0KGVDb250YWlubWVudEZlYXR1cmUoKSk7Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLX0gLy88JT1pc0ludGVyZmFjZSA/ICIgIiArIGdlbkNsYXNzLmdldEludGVyZmFjZU5hbWUoKSA6IGdlbkNsYXNzLmdldENsYXNzTmFtZSgpJT4KLTwlLy8gVE9ETyBmaXggdGhlIHNwYWNlIGFib3ZlJT4KLTwlZ2VuTW9kZWwuZW1pdFNvcnRlZEltcG9ydHMoKTslPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1OWVmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODU1YjBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQ7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtQ2xhc3NQYXRoOiB1bWFlZGl0LmphcgotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWE7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbiwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW4kSW1wbGVtZW50YXRpb24KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4MmUwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLnVtYWVkaXQuamFyID0gc3JjLwotb3V0cHV0LnVtYWVkaXQuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gdW1hZWRpdC5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfQXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfUGxhbm5pbmdEYXRhLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfUGxhbm5pbmdEYXRhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyOWUyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUJyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX1BsYW5uaW5nRGF0YS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TZWN0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1NlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA2YzJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1NlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU3RlcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4Y2Q4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNmIwZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldENhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRHcm91cGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0R3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Ub29sLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Ub29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzllOWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1dvcmtQcm9kdWN0VHlwZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1dvcmtQcm9kdWN0VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWNhYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BdHRhY2htZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0F0dGFjaG1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzU2ODVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0F0dGFjaG1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NoZWNrbGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY1ZjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NoZWNrbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Db25jZXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJhYmxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Eb21haW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjU1NGMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWIzNGM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTWV0cmljLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNZXRyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzFmODNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNZXRyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01vZGVsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OGRhZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19FeGFtcGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjk0NGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfR3VpZGVsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0d1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfR3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0l0ZXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19LaW5kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0tpbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY3MTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0tpbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfT3V0Y29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXBvcnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmVwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmM2UwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmV1c2FibGVBc3NldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXVzYWJsZUFzc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyY2ZmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXVzYWJsZUFzc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvYWRtYXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9hZG1hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWJjNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9hZG1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXRHcm91cGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0R3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXRHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdGVwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQ3NjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3VwcG9ydGluZ01hdGVyaWFsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTIxZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3VwcG9ydGluZ01hdGVyaWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rhc2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGFzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGFzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZWNobmlxdWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVjaG5pcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzViOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZWNobmlxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rlcm1EZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rlcm1EZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxYmZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZXJtRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbE1lbnRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sTWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sTWVudG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nQ2xhc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdDbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzI5NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdDbGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ01vZHVsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ01vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjcxNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdNb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1doaXRlcGFwZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjQ4MDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV2hpdGVwYXBlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZjUyMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0VHlwZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2VjYWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDE4ZWMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2YjBmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllZDJjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfUHJvcGVydHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9Qcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmE3YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9Qcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1MaW5rX3ZpZXdwb3J0X1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUxpbmtfdmlld3BvcnRfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTczNGM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUxpbmtfdmlld3BvcnRfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1ZTlmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmYyMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5ZjNhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX3ZpZXdwb2ludF9Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fdmlld3BvaW50X1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkNThlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fdmlld3BvaW50X1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX0Rpc2NpcGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWIzMTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5fRG9tYWluLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbl9Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbl9Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluc19Eb21haW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluc19Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbnNfRG9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWxsaXBzZV9jZW50ZXJfUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFbGxpcHNlX2NlbnRlcl9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGU5YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFbGxpcHNlX2NlbnRlcl9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTUxNjg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbk1ldHJpY19Fc3RpbWF0aW5nTWV0cmljLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbk1ldHJpY19Fc3RpbWF0aW5nTWV0cmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkMzBiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25NZXRyaWNfRXN0aW1hdGluZ01ldHJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX3VzZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV91c2VkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxZDBiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX3VzZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZWRNZXRob2RFbGVtZW50X2VzdGltYXRlX0VzdGltYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVkTWV0aG9kRWxlbWVudF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDRiZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZWRNZXRob2RFbGVtZW50X2VzdGltYXRlX0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ01vZGVsX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ01vZGVsX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzYjk5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdNb2RlbF9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdQYXJhbWV0ZXJPd25lcl9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfRXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdQYXJhbWV0ZXJPd25lcl9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfRXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNzIyMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nUGFyYW1ldGVyT3duZXJfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaENvbm5lY3Rvcl9wb3NpdGlvbl9Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoQ29ubmVjdG9yX3Bvc2l0aW9uX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3MzYyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoQ29ubmVjdG9yX3Bvc2l0aW9uX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFZGdlX3dheXBvaW50c19Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWRnZV93YXlwb2ludHNfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTU0ZTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFZGdlX3dheXBvaW50c19Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9hbmNob3JhZ2VfR3JhcGhDb25uZWN0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfYW5jaG9yYWdlX0dyYXBoQ29ubmVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwMzc2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9hbmNob3JhZ2VfR3JhcGhDb25uZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZTQwYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljZDg3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbUxpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW1MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3ZWU1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbUxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0VsbGlwc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0VsbGlwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTZlNjI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9FbGxpcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaENvbm5lY3Rvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhDb25uZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzAzNzYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaENvbm5lY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhFZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaEVkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODkxODgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaEVkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2NTIwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9JbWFnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGY5OWU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9JbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUG9seWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1BvbHlsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmMTVjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUG9seWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1Byb3BlcnR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmE3YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9SZWZlcmVuY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDM3NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMDYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1RleHRFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9UZXh0RWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjUyMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1RleHRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmMjdiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9saW5rX0RpYWdyYW1MaW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2xpbmtfRGlhZ3JhbUxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjdlZTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2xpbmtfRGlhZ3JhbUxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfcG9zaXRpb25fUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfcG9zaXRpb25fUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ0MDdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3Bvc2l0aW9uX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZTQwYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIwNjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjI3YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhOb2RlX3NpemVfRGltZW5zaW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhOb2RlX3NpemVfRGltZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkOTI4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoTm9kZV9zaXplX0RpbWVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUtpbmRfYXBwbGljYWJsZU1ldGFDbGFzc0luZm9fQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVLaW5kX2FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiMWZiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUtpbmRfYXBwbGljYWJsZU1ldGFDbGFzc0luZm9fQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X21ldGhvZEVsZW1lbnRQcm9wZXJ0eV9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X21ldGhvZEVsZW1lbnRQcm9wZXJ0eV9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjJjM2ViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9tZXRob2RFbGVtZW50UHJvcGVydHlfTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX0NvbnN0cmFpbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X293bmVkUnVsZXNfQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDMyZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X293bmVkUnVsZXNfQ29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kTW9kZWxzX01ldGhvZE1vZGVsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RNb2RlbHNfTWV0aG9kTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RNb2RlbHNfTWV0aG9kTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfTWV0aG9kUGx1Z2luLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfTWV0aG9kQ29uZmlndXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX1Byb2Nlc3NGYW1pbHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19Qcm9jZXNzRmFtaWx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ2N2Q0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX1Byb2Nlc3NGYW1pbHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb2x5bGluZV93YXlwb2ludHNfUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb2x5bGluZV93YXlwb2ludHNfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzcwM2RiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9seWxpbmVfd2F5cG9pbnRzX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlc19QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlc19QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZXNfUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19UYXNrRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzFhMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmMjM0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfT0JTX09CUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX09CU19PQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2U4YTYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfT0JTX09CUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1BCU19QQlMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9QQlNfUEJTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzYWI0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1BCU19QQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9XQlNfV0JTLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV0JTX1dCUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMmNjNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9XQlNfV0JTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV29ya09yZGVyX1dvcmtPcmRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dvcmtPcmRlcl9Xb3JrT3JkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZhYzMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV29ya09yZGVyX1dvcmtPcmRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0l0ZXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5Yjc4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUmVzb3VyY2VEZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUmVzb3VyY2VEZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhODZkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Jlc291cmNlRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfRGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ4NTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NvbXBvc2l0ZVJvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ29tcG9zaXRlUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMDI5MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ29tcG9zaXRlUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QaGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QaGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjBiZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGxhbm5pbmdEYXRhLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BsYW5uaW5nRGF0YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2UyNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGxhbm5pbmdEYXRhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljMWEwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OGM3YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrT3JkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya09yZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0MWYzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrT3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmRhNTVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5Yjc4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVHJhbnNpdGlvbl9UcmFuc2l0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1RyYW5zaXRpb25fVHJhbnNpdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzFjNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVHJhbnNpdGlvbl9UcmFuc2l0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9Qc2V1ZG9TdGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfUHNldWRvU3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzY4ZTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9Qc2V1ZG9TdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfU3RhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1N0YXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmNTA2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfU3RhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1ZlcnRleC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfVmVydGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhMzc2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfVmVydGV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TZWN0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzY2U5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU3RlcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljN2VmYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZU1hY2hpbmVfUmVnaW9uX1JlZ2lvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlTWFjaGluZV9SZWdpb25fUmVnaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhYjdlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlTWFjaGluZV9SZWdpb25fUmVnaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVfUmVnaW9uX1JlZ2lvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlX1JlZ2lvbl9SZWdpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjc2ZGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVfUmVnaW9uX1JlZ2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX2VzdGltYXRlX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0NGJmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX3N0ZXBzX1N0ZXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX3N0ZXBzX1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGE0OWQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19zdGVwc19TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGVhbVByb2ZpbGVfc3ViVGVhbV9UZWFtUHJvZmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRlYW1Qcm9maWxlX3N1YlRlYW1fVGVhbVByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGVhbVByb2ZpbGVfc3ViVGVhbV9UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRyYWluaW5nQ2xhc3NfdHJhaW5pbmdNb2R1bGVzX1RyYWluaW5nTW9kdWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVHJhaW5pbmdDbGFzc190cmFpbmluZ01vZHVsZXNfVHJhaW5pbmdNb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWY1ZWZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVHJhaW5pbmdDbGFzc190cmFpbmluZ01vZHVsZXNfVHJhaW5pbmdNb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk0NGQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTQ0ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fQ29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtQcm9kdWN0X2VzdGltYXRlX0VzdGltYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZlYjFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BZ2dyZWdhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWdncmVnYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkYzVhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BZ2dyZWdhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDBhZWRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXR0YWNobWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BdHRhY2htZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOGFmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BdHRhY2htZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGFhYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZjg0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY2ZDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DbGFzc2lmaWVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NsYXNzaWZpZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTdkYzdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NsYXNzaWZpZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db21wb3NpdGVSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db21wb3NpdGVSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25zdHJhaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc0MTRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnN0cmFpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudENhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzMxZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTIyNDYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTU1OTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNzBjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmliYWJsZUVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpYmFibGVFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhZjhhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmliYWJsZUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2ZTNiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY5MjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGE4YWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTczMWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1MaW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3M2E1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaW1lbnNpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGltZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkM2I3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaW1lbnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwNDFkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsbGlwc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjg4MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxsaXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmQyMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGVkTWV0aG9kRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZWRNZXRob2RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhZjhhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZWRNZXRob2RFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNZXRyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQwOTc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNZXRyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01vZGVsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjI4MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Yzk1M2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyT3duZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyT3duZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9GdWxmaWxsYWJsZUVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRnVsZmlsbGFibGVFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZjg0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9GdWxmaWxsYWJsZUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhDb25uZWN0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhDb25uZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzllYmJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoQ29ubmVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTliYzc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4ZmI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDU1MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoaWNQcmltaXRpdmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhpY1ByaW1pdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDIyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhpY1ByaW1pdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRlbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JbWFnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTZjMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0tpbmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvS2luZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTZjMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvS2luZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9MZWFmRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9MZWFmRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjg4MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGVhZkVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNGZlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MmMzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luX2dyZXkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luX2dyZXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTYzYWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbl9ncmV5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFVuaXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kVW5pdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWJjNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kVW5pdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVkRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFmOGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVkRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lc3BhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZXNwYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4MzY0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lc3BhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT0JTLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L09CUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjgyZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT0JTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L091dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDM1MTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QQlMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUEJTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4MzY0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwYWVkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2VhYmxlRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlYWJsZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY4ODFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2VhYmxlRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjBiZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdEYXRhLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nRGF0YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Yzk1M2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdEYXRhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1MDBkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2x5bGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2x5bGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmFhYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9seWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRleHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0VsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjkyNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY4YWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2ZTNiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9wZXJ0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHNldWRvU3RhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHNldWRvU3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZiMzBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BzZXVkb1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZmVyZW5jZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzllYmJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWdpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVnaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2NTk2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWdpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMmM4NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlRGVmaW5pdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGIzNTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJjZmZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExYmM1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0Q2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0Q2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlY3Rpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzg1NGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE3NTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxNzU1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZU1hY2hpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGVNYWNoaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZU1hY2hpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RlcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZjg0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzMxZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW1Qcm9maWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW1Qcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4NjZkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWJmZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGV4dEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGV4dEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ1NTFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RleHRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdDbGFzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ0NsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkMTBmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ0NsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nTW9kdWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nTW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ01vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFuc2l0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYW5zaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFjNGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYW5zaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHlwZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmOGFmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YWQ1ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmFyaWFiaWxpdHlFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZhcmlhYmlsaXR5RWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzQxNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmFyaWFiaWxpdHlFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZlcnRleC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WZXJ0ZXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTVjNzBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZlcnRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XQlMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV0JTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNDgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtCcmVha2Rvd25FbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtCcmVha2Rvd25FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhYzRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrRGVmaW5pdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjRmM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0RlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya09yZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtPcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGFhYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya09yZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZmE2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFNoYXBlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0U2hhcGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0U2hhcGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWNhYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzMTVjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRU1GIFVNQSBFZGl0IFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9Ci1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9Ci1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gQ3JlYXRlIE5ldyB7MH0gVW5kZXIgezF9IEZlYXR1cmUKLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZSBzZWxlY3RlZCB7Mn0uCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50LgotCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gVGhlIHswfSBvZiB0aGUgezF9Ci0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBDbGFzc2lmaWVyCi1fVUlfVHlwZV90eXBlID0gVHlwZQotX1VJX0VsZW1lbnRfdHlwZSA9IEVsZW1lbnQKLV9VSV9OYW1lZEVsZW1lbnRfdHlwZSA9IE5hbWVkIEVsZW1lbnQKLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IFBhY2thZ2VhYmxlIEVsZW1lbnQKLV9VSV9QYWNrYWdlX3R5cGUgPSBQYWNrYWdlCi1fVUlfTmFtZXNwYWNlX3R5cGUgPSBOYW1lc3BhY2UKLV9VSV9NZXRob2RFbGVtZW50X3R5cGUgPSBNZXRob2QgRWxlbWVudAotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IENvbnN0cmFpbnQKLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gQ29udGVudCBFbGVtZW50Ci1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUgPSBEZXNjcmliYWJsZSBFbGVtZW50Ci1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBDb250ZW50IERlc2NyaXB0aW9uCi1fVUlfU2VjdGlvbl90eXBlID0gU2VjdGlvbgotX1VJX1JvbGVfdHlwZSA9IFJvbGUKLV9VSV9Xb3JrUHJvZHVjdF90eXBlID0gV29yayBQcm9kdWN0Ci1fVUlfVGFza190eXBlID0gVGFzawotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBXb3JrIERlZmluaXRpb24KLV9VSV9TdGVwX3R5cGUgPSBTdGVwCi1fVUlfR3VpZGFuY2VfdHlwZSA9IEd1aWRhbmNlCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IEFydGlmYWN0Ci1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IERlbGl2ZXJhYmxlCi1fVUlfT3V0Y29tZV90eXBlID0gT3V0Y29tZQotX1VJX01ldGhvZFBhY2thZ2VfdHlwZSA9IE1ldGhvZCBQYWNrYWdlCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IENvbnRlbnQgUGFja2FnZQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IEFydGlmYWN0IERlc2NyaXB0aW9uCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gV29yayBQcm9kdWN0IERlc2NyaXB0aW9uCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlID0gRGVsaXZlcmFibGUgRGVzY3JpcHRpb24KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFJvbGUgRGVzY3JpcHRpb24KLV9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSA9IFRhc2sgRGVzY3JpcHRpb24KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBHdWlkYW5jZSBEZXNjcmlwdGlvbgotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSA9IFByYWN0aWNlIERlc2NyaXB0aW9uCi1fVUlfUG9pbnRfdHlwZSA9IFBvaW50Ci1fVUlfR3JhcGhFbGVtZW50X3R5cGUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IERpYWdyYW0gRWxlbWVudAotX1VJX0RpYWdyYW1MaW5rX3R5cGUgPSBEaWFncmFtIExpbmsKLV9VSV9HcmFwaENvbm5lY3Rvcl90eXBlID0gR3JhcGggQ29ubmVjdG9yCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gU2VtYW50aWMgTW9kZWwgQnJpZGdlCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBEaW1lbnNpb24KLV9VSV9SZWZlcmVuY2VfdHlwZSA9IFJlZmVyZW5jZQotX1VJX1Byb3BlcnR5X3R5cGUgPSBQcm9wZXJ0eQotX1VJX0dyYXBoRWRnZV90eXBlID0gR3JhcGggRWRnZQotX1VJX0RpYWdyYW1fdHlwZSA9IERpYWdyYW0KLV9VSV9HcmFwaE5vZGVfdHlwZSA9IEdyYXBoIE5vZGUKLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlID0gU2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQKLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBVTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IENvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlCi1fVUlfTGVhZkVsZW1lbnRfdHlwZSA9IExlYWYgRWxlbWVudAotX1VJX1RleHRFbGVtZW50X3R5cGUgPSBUZXh0IEVsZW1lbnQKLV9VSV9JbWFnZV90eXBlID0gSW1hZ2UKLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBHcmFwaGljIFByaW1pdGl2ZQotX1VJX1BvbHlsaW5lX3R5cGUgPSBQb2x5bGluZQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsbGlwc2UKLV9VSV9BY3Rpdml0eV90eXBlID0gQWN0aXZpdHkKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlID0gV29yayBCcmVha2Rvd24gRWxlbWVudAotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEJyZWFrZG93biBFbGVtZW50Ci1fVUlfTWlsZXN0b25lX3R5cGUgPSBNaWxlc3RvbmUKLV9VSV9JdGVyYXRpb25fdHlwZSA9IEl0ZXJhdGlvbgotX1VJX1BoYXNlX3R5cGUgPSBQaGFzZQotX1VJX1RlYW1Qcm9maWxlX3R5cGUgPSBUZWFtIFByb2ZpbGUKLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gUm9sZSBEZXNjcmlwdG9yCi1fVUlfV29ya09yZGVyX3R5cGUgPSBXb3JrIE9yZGVyCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IFByb2Nlc3MgRWxlbWVudAotX1VJX1BsYW5uaW5nRGF0YV90eXBlID0gUGxhbm5pbmcgRGF0YQotX1VJX0Rlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0b3IKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1fVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSA9IFRhc2sgRGVzY3JpcHRvcgotX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSA9IENvbXBvc2l0ZSBSb2xlCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUgPSBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbgotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IEFjdGl2aXR5IERlc2NyaXB0aW9uCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSA9IERlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb24KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSA9IFByb2Nlc3MgRGVzY3JpcHRpb24KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0b3IgRGVzY3JpcHRpb24KLV9VSV9Db25jZXB0X3R5cGUgPSBDb25jZXB0Ci1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBDaGVja2xpc3QKLV9VSV9FeGFtcGxlX3R5cGUgPSBFeGFtcGxlCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBHdWlkZWxpbmUKLV9VSV9SZXBvcnRfdHlwZSA9IFJlcG9ydAotX1VJX1RlbXBsYXRlX3R5cGUgPSBUZW1wbGF0ZQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gU3VwcG9ydGluZyBNYXRlcmlhbAotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IFRvb2wgTWVudG9yCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gV2hpdGVwYXBlcgotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBUZXJtIERlZmluaXRpb24KLV9VSV9QcmFjdGljZV90eXBlID0gUHJhY3RpY2UKLV9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSA9IEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBSZXVzYWJsZSBBc3NldAotX1VJX1N0YXRlX3R5cGUgPSBTdGF0ZQotX1VJX1ZlcnRleF90eXBlID0gVmVydGV4Ci1fVUlfUmVnaW9uX3R5cGUgPSBSZWdpb24KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IFN0YXRlIE1hY2hpbmUKLV9VSV9UcmFuc2l0aW9uX3R5cGUgPSBUcmFuc2l0aW9uCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFBzZXVkbyBTdGF0ZQotX1VJX0Rpc2NpcGxpbmVfdHlwZSA9IERpc2NpcGxpbmUKLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IENvbnRlbnQgQ2F0ZWdvcnkKLV9VSV9Sb2xlU2V0X3R5cGUgPSBSb2xlIFNldAotX1VJX0RvbWFpbl90eXBlID0gRG9tYWluCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUgPSBXb3JrIFByb2R1Y3QgS2luZAotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gRGlzY2lwbGluZSBHcm91cGluZwotX1VJX1Rvb2xfdHlwZSA9IFRvb2wKLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFJvbGUgU2V0IEdyb3VwaW5nCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IEN1c3RvbSBDYXRlZ29yeQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gRGVsaXZlcnkgUHJvY2VzcwotX1VJX1Byb2Nlc3NfdHlwZSA9IFByb2Nlc3MKLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gQ2FwYWJpbGl0eSBQYXR0ZXJuCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSA9IFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUKLV9VSV9Sb2FkbWFwX3R5cGUgPSBSb2FkbWFwCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlID0gUHJvY2VzcyBDb21wb25lbnQKLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gUHJvY2VzcyBQYWNrYWdlCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSA9IFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IKLV9VSV9NZXRob2RQbHVnaW5fdHlwZSA9IE1ldGhvZCBQbHVnLWluCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBWYXJpYWJpbGl0eSBFbGVtZW50Ci1fVUlfTWV0aG9kVW5pdF90eXBlID0gTWV0aG9kIFVuaXQKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBNZXRob2QgQ29uZmlndXJhdGlvbgotX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSA9IFByb2Nlc3MgRmFtaWx5Ci1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gTWV0aG9kIExpYnJhcnkKLV9VSV9Vbmtub3duX3R5cGUgPSBPYmplY3QKLQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbHVlCi0KLV9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTmFtZQotX1VJX01ldGhvZEVsZW1lbnRfZ3VpZF9mZWF0dXJlID0gR1VJRAotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gQnJpZWYgRGVzY3JpcHRpb24KLV9VSV9NZXRob2RFbGVtZW50X293bmVkUnVsZXNfZmVhdHVyZSA9IE93bmVkIFJ1bGVzCi1fVUlfTWV0aG9kRWxlbWVudF9zdXBwcmVzc2VkX2ZlYXR1cmUgPSBTdXBwcmVzc2VkCi1fVUlfTWV0aG9kRWxlbWVudF9vcmRlcmluZ0d1aWRlX2ZlYXR1cmUgPSBPcmRlcmluZyBHdWlkZQotX1VJX0NvbnN0cmFpbnRfYm9keV9mZWF0dXJlID0gQm9keQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IENvbmNlcHRzIEFuZCBQYXBlcnMKLV9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBDaGVja2xpc3RzCi1fVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gR3VpZGVsaW5lcwotX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUgPSBFeGFtcGxlcwotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gQXNzZXRzCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSA9IFByZXNlbnRhdGlvbiBOYW1lCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gUHJlc2VudGF0aW9uCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3NoYXBlaWNvbl9mZWF0dXJlID0gU2hhcGVpY29uCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbgotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSA9IE1haW4gRGVzY3JpcHRpb24KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfZmVhdHVyZSA9IFNlY3Rpb25zCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBLZXkgQ29uc2lkZXJhdGlvbnMKLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBTZWN0aW9uIE5hbWUKLV9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlID0gU2VjdGlvbiBEZXNjcmlwdGlvbgotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFN1YiBTZWN0aW9ucwotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFByZWRlY2Vzc29yCi1fVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpZXMKLV9VSV9Sb2xlX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBSZXNwb25zaWJsZSBGb3IKLV9VSV9Xb3JrUHJvZHVjdF9yZXBvcnRzX2ZlYXR1cmUgPSBSZXBvcnRzCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBUZW1wbGF0ZXMKLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gVG9vbCBNZW50b3JzCi1fVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlID0gUGVyZm9ybWVkIEJ5Ci1fVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gTWFuZGF0b3J5IElucHV0Ci1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IE91dHB1dAotX1VJX1Rhc2tfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IEFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnkKLV9VSV9UYXNrX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IE9wdGlvbmFsIElucHV0Ci1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gU3RlcHMKLV9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sIE1lbnRvcnMKLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gUHJlY29uZGl0aW9uCi1fVUlfV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9mZWF0dXJlID0gUG9zdGNvbmRpdGlvbgotX1VJX0FydGlmYWN0X2NvbnRhaW5lckFydGlmYWN0X2ZlYXR1cmUgPSBDb250YWluZXIgQXJ0aWZhY3QKLV9VSV9BcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfZmVhdHVyZSA9IENvbnRhaW5lZCBBcnRpZmFjdHMKLV9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSA9IERlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IEdsb2JhbAotX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSA9IFJldXNlZCBQYWNrYWdlcwotX1VJX01ldGhvZFBhY2thZ2VfcGFyZW50UGFja2FnZV9mZWF0dXJlID0gUGFyZW50IFBhY2thZ2UKLV9VSV9NZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfZmVhdHVyZSA9IENoaWxkIFBhY2thZ2VzCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBDb250ZW50IEVsZW1lbnRzCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSA9IEJyaWVmIE91dGxpbmUKLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlID0gUmVwcmVzZW50YXRpb24gT3B0aW9ucwotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuYWwgSWQKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFB1cnBvc2UKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUgPSBJbXBhY3QgT2YgTm90IEhhdmluZwotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IFJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBFeHRlcm5hbCBEZXNjcmlwdGlvbgotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IFBhY2thZ2luZyBHdWlkYW5jZQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IFNraWxscwotX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlID0gQXNzaWdubWVudCBBcHByb2FjaGVzCi1fVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUgPSBTeW5vbnltcwotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBQdXJwb3NlCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVzCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlID0gQXR0YWNobWVudHMKLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBBZGRpdGlvbmFsIEluZm8KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSA9IFByb2JsZW0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IEJhY2tncm91bmQKLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUgPSBHb2FscwotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IEFwcGxpY2F0aW9uCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBMZXZlbHMgT2YgQWRvcHRpb24KLV9VSV9Qb2ludF94X2ZlYXR1cmUgPSBYCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQotX1VJX0dyYXBoRWxlbWVudF9wb3NpdGlvbl9mZWF0dXJlID0gUG9zaXRpb24KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBDb250YWluZWQKLV9VSV9HcmFwaEVsZW1lbnRfbGlua19mZWF0dXJlID0gTGluawotX1VJX0dyYXBoRWxlbWVudF9hbmNob3JhZ2VfZmVhdHVyZSA9IEFuY2hvcmFnZQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBTZW1hbnRpYyBNb2RlbAotX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlID0gSXMgVmlzaWJsZQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBSZWZlcmVuY2UKLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gUHJvcGVydHkKLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBab29tCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFZpZXdwb3J0Ci1fVUlfRGlhZ3JhbUxpbmtfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfRGlhZ3JhbUxpbmtfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhcGggRWxlbWVudAotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gR3JhcGggRWRnZQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YXRpb24KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhcGggRWxlbWVudAotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gV2lkdGgKLV9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUgPSBIZWlnaHQKLV9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSA9IElzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb24KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gUmVmZXJlbmNlZAotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gS2V5Ci1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gQW5jaG9yCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gV2F5cG9pbnRzCi1fVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUgPSBab29tCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFZpZXdwb2ludAotX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSA9IERpYWdyYW0gTGluawotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBOYW1lc3BhY2UKLV9VSV9HcmFwaE5vZGVfc2l6ZV9mZWF0dXJlID0gU2l6ZQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUgPSBUeXBlIEluZm8KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQKLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50Ci1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGV4dAotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVXJpCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IE1pbWUgVHlwZQotX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlID0gQ2xvc2VkCi1fVUlfUG9seWxpbmVfd2F5cG9pbnRzX2ZlYXR1cmUgPSBXYXlwb2ludHMKLV9VSV9FbGxpcHNlX3JhZGl1c1hfZmVhdHVyZSA9IFJhZGl1cyBYCi1fVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUgPSBSYWRpdXMgWQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFJvdGF0aW9uCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBTdGFydCBBbmdsZQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IEVuZCBBbmdsZQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBDZW50ZXIKLV9VSV9BY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19mZWF0dXJlID0gQnJlYWtkb3duIEVsZW1lbnRzCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IFJvYWRtYXBzCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydGluZyBNYXRlcmlhbHMKLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBDaGVja2xpc3RzCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IENvbmNlcHRzCi1fVUlfQWN0aXZpdHlfZXhhbXBsZXNfZmVhdHVyZSA9IEV4YW1wbGVzCi1fVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlID0gR3VpZGVsaW5lcwotX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBSZXVzYWJsZSBBc3NldHMKLV9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlID0gSXMgRW5hY3RhYmxlCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBJcyBSZXBlYXRhYmxlCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUgPSBJcyBPbmdvaW5nCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlID0gSXMgRXZlbnQgRHJpdmVuCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IExpbmsgVG8gUHJlZGVjZXNzb3IKLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gUHJlZml4Ci1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IElzIFBsYW5uZWQKLV9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSA9IEhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlcwotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gSXMgT3B0aW9uYWwKLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUgPSBQcmVzZW50ZWQgQWZ0ZXIKLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gUHJlc2VudGVkIEJlZm9yZQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBQbGFubmluZyBEYXRhCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFN1cGVyIEFjdGl2aXR5Ci1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBUZWFtIFJvbGVzCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBTdXBlciBUZWFtCi1fVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlID0gU3ViIFRlYW0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUgPSBSb2xlCi1fVUlfUm9sZURlc2NyaXB0b3JfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWVzCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNpYmxlIEZvcgotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gTGluayBUeXBlCi1fVUlfV29ya09yZGVyX3ByZWRfZmVhdHVyZSA9IFByZWQKLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBTdGFydCBEYXRlCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IEZpbmlzaCBEYXRlCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFJhbmsKLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlID0gQWN0aXZpdHkgRW50cnkgU3RhdGUKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSA9IEFjdGl2aXR5IEV4aXQgU3RhdGUKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdAotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBJbXBhY3RlZCBCeQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBJbXBhY3RzCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IERlbGl2ZXJhYmxlIFBhcnRzCi1fVUlfVGFza0Rlc2NyaXB0b3JfVGFza19mZWF0dXJlID0gVGFzawotX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBBZGRpdGlvbmFsIFBlcmZvcm1lcgotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IEFzc2lzdGVkIEJ5Ci1fVUlfVGFza0Rlc2NyaXB0b3JfZXh0ZXJuYWxJbnB1dF9mZWF0dXJlID0gRXh0ZXJuYWwgSW5wdXQKLV9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gTWFuZGF0b3J5IElucHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3Jfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gT3B0aW9uYWwgSW5wdXQKLV9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSA9IE91dHB1dAotX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUgPSBQcmltYXJ5IFBlcmZvcm1lcgotX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSA9IFNlbGVjdGVkIFN0ZXBzCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IEFnZ3JlZ2F0ZWQgUm9sZXMKLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gVXNhZ2UgR3VpZGFuY2UKLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFB1cnBvc2UKLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVzCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBIb3d0byBTdGFmZgotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3NjYWxlX2ZlYXR1cmUgPSBTY2FsZQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RDaGFyYWN0ZXJpc3RpY3NfZmVhdHVyZSA9IFByb2plY3QgQ2hhcmFjdGVyaXN0aWNzCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUgPSBSaXNrIExldmVsCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gRXN0aW1hdGluZyBUZWNobmlxdWUKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlX2ZlYXR1cmUgPSBQcm9qZWN0IE1lbWJlciBFeHBlcnRpc2UKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVHlwZSBPZiBDb250cmFjdAotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBFeHRlcm5hbCBJZAotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gU2NvcGUKLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdXNhZ2VOb3Rlc19mZWF0dXJlID0gVXNhZ2UgTm90ZXMKLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBSZWZpbmVkIERlc2NyaXB0aW9uCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBTdWIgUHJhY3RpY2VzCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IENvbnRlbnQgUmVmZXJlbmNlcwotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gQWN0aXZpdHkgUmVmZXJlbmNlcwotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBXb3JrIFByb2R1Y3QKLV9VSV9TdGF0ZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lvbgotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IFN1Ym1hY2hpbmUKLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBDb250YWluZXIKLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IE91dGdvaW5nCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBJbmNvbWluZwotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZlcnRleAotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBUcmFuc2l0aW9uCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBTdGF0ZQotX1VJX1JlZ2lvbl9TdGF0ZU1hY2hpbmVfZmVhdHVyZSA9IFN0YXRlIE1hY2hpbmUKLV9VSV9TdGF0ZU1hY2hpbmVfUmVnaW9uX2ZlYXR1cmUgPSBSZWdpb24KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBXb3JrIERlZmluaXRpb24KLV9VSV9UcmFuc2l0aW9uX2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IFNvdXJjZQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBUYXJnZXQKLV9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUgPSBUYXNrcwotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gU3ViZGlzY2lwbGluZQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBSZWZlcmVuY2UgV29ya2Zsb3dzCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gUm9sZXMKLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBXb3JrIFByb2R1Y3RzCi1fVUlfRG9tYWluX3N1YmRvbWFpbnNfZmVhdHVyZSA9IFN1YmRvbWFpbnMKLV9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBXb3JrIFByb2R1Y3RzCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX2ZlYXR1cmUgPSBEaXNjaXBsaW5lcwotX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFRvb2wgTWVudG9ycwotX1VJX1JvbGVTZXRHcm91cGluZ19yb2xlU2V0c19mZWF0dXJlID0gUm9sZSBTZXRzCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gQ2F0ZWdvcml6ZWQgRWxlbWVudHMKLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBTdWIgQ2F0ZWdvcmllcwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IEVkdWNhdGlvbiBNYXRlcmlhbHMKLV9VSV9EZWxpdmVyeVByb2Nlc3NfY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNfZmVhdHVyZSA9IENvbW11bmljYXRpb25zIE1hdGVyaWFscwotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gSW5jbHVkZXMgUGF0dGVybnMKLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBEZWZhdWx0IENvbnRleHQKLV9VSV9Qcm9jZXNzX3ZhbGlkQ29udGV4dF9mZWF0dXJlID0gVmFsaWQgQ29udGV4dAotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSA9IEJhc2VkIE9uIFByb2Nlc3NlcwotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gSW50ZXJmYWNlcwotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2VzcwotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gUHJvY2VzcyBFbGVtZW50cwotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBEaWFncmFtcwotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfZmVhdHVyZSA9IEludGVyZmFjZSBTcGVjaWZpY2F0aW9ucwotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IEludGVyZmFjZSBJTwotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX1Byb2Nlc3NDb21wb25lbnRfZmVhdHVyZSA9IFByb2Nlc3MgQ29tcG9uZW50Ci1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBVc2VyIENoYW5nZWFibGUKLV9VSV9NZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfZmVhdHVyZSA9IE1ldGhvZCBQYWNrYWdlcwotX1VJX01ldGhvZFBsdWdpbl9iYXNlc19mZWF0dXJlID0gQmFzZXMKLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBWYXJpYWJpbGl0eSBUeXBlCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSA9IFZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQKLV9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSA9IEF1dGhvcnMKLV9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSA9IENoYW5nZSBEYXRlCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gQ2hhbmdlIERlc2NyaXB0aW9uCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBWZXJzaW9uCi1fVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSA9IENvcHlyaWdodCBTdGF0ZW1lbnQKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gTWV0aG9kIFBsdWctaW4gU2VsZWN0aW9uCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBNZXRob2QgUGFja2FnZSBTZWxlY3Rpb24KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gUHJvY2VzcyBWaWV3cwotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IERlZmF1bHQgVmlldwotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBCYXNlIENvbmZpZ3VyYXRpb25zCi1fVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlID0gRGVsaXZlcnkgUHJvY2Vzc2VzCi1fVUlfTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX2ZlYXR1cmUgPSBNZXRob2QgUGx1Zy1pbnMKLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gUHJlZGVmaW5lZCBDb25maWd1cmF0aW9ucwotX1VJX1Vua25vd25fZmVhdHVyZSA9IFVuc3BlY2lmaWVkCi0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQKLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvRmluaXNoX2xpdGVyYWwgPSBmaW5pc2hUb0ZpbmlzaAotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb1N0YXJ0X2xpdGVyYWwgPSBzdGFydFRvU3RhcnQKLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gaW5pdGlhbAotX1VJX1BzZXVkb1N0YXRlS2luZF9qb2luX2xpdGVyYWwgPSBqb2luCi1fVUlfUHNldWRvU3RhdGVLaW5kX2ZvcmtfbGl0ZXJhbCA9IGZvcmsKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfanVuY3Rpb25fbGl0ZXJhbCA9IGp1bmN0aW9uCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gY2hvaWNlCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IGVudHJ5UG9pbnQKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBleGl0UG9pbnQKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfdGVybWluYXRlX2xpdGVyYWwgPSB0ZXJtaW5hdGUKLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IG5hCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidXRlcwotX1VJX1ZhcmlhYmlsaXR5VHlwZV9leHRlbmRzX2xpdGVyYWwgPSBleHRlbmRzCi1fVUlfVmFyaWFiaWxpdHlUeXBlX3JlcGxhY2VzX2xpdGVyYWwgPSByZXBsYWNlcwotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gbG9jYWxDb250cmlidXRpb24KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxSZXBsYWNlbWVudF9saXRlcmFsID0gbG9jYWxSZXBsYWNlbWVudAotX1VJX0FydGlmYWN0RGVzY3JpcHRvcl90eXBlID0gQXJ0aWZhY3QgRGVzY3JpcHRvcgotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRvcl90eXBlID0gRGVsaXZlcmFibGUgRGVzY3JpcHRvcgotX1VJX091dGNvbWVEZXNjcmlwdG9yX3R5cGUgPSBPdXRjb21lIERlc2NyaXB0b3IKLV9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSA9IE1ldGhvZCBFbGVtZW50IFByb3BlcnR5Ci1fVUlfTWV0aG9kRWxlbWVudF9tZXRob2RFbGVtZW50UHJvcGVydHlfZmVhdHVyZSA9IE1ldGhvZCBFbGVtZW50IFByb3BlcnR5Ci1fVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBWYWx1ZQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fc3VidHJhY3RlZENhdGVnb3J5X2ZlYXR1cmUgPSBTdWJ0cmFjdGVkIENhdGVnb3J5Ci1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9hZGRlZENhdGVnb3J5X2ZlYXR1cmUgPSBBZGRlZCBDYXRlZ29yeQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9leHRlbmRzUmVwbGFjZXNfbGl0ZXJhbCA9IGV4dGVuZHNSZXBsYWNlcwotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25fZmVhdHVyZSA9IFJlcHJlc2VudGF0aW9uCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9ub3RhdGlvbl9mZWF0dXJlID0gTm90YXRpb24KLV9VSV9Db250ZW50RWxlbWVudF90ZXJtRGVmaW5pdGlvbl9mZWF0dXJlID0gVGVybSBEZWZpbml0aW9uCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IEV4dGVybmFsIElkCi1fVUlfS2luZF90eXBlID0gS2luZAotX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlID0gRnVsZmlsbGFibGUgRWxlbWVudAotX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlID0gSXMgQWJzdHJhY3QKLV9VSV9NZXRob2RFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSA9IFByZXNlbnRhdGlvbiBOYW1lCi1fVUlfTWV0aG9kRWxlbWVudF9raW5kX2ZlYXR1cmUgPSBLaW5kCi1fVUlfS2luZF9hcHBsaWNhYmxlTWV0YUNsYXNzX2ZlYXR1cmUgPSBBcHBsaWNhYmxlIE1ldGEgQ2xhc3MKLV9VSV9LaW5kX2lzUHJpbWFyeUtpbmRfZmVhdHVyZSA9IElzIFByaW1hcnkgS2luZAotX1VJX0NvbnRlbnRFbGVtZW50X3Rlcm1kZWZpbml0aW9uX2ZlYXR1cmUgPSBUZXJtZGVmaW5pdGlvbgotX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF9mdWxmaWxsc19mZWF0dXJlID0gRnVsZmlsbHMKLV9VSV9CcmVha2Rvd25FbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IENoZWNrbGlzdHMKLV9VSV9CcmVha2Rvd25FbGVtZW50X2NvbmNlcHRzX2ZlYXR1cmUgPSBDb25jZXB0cwotX1VJX0JyZWFrZG93bkVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEV4YW1wbGVzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBHdWlkZWxpbmVzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gUmV1c2FibGUgQXNzZXRzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBTdXBwb3J0aW5nIE1hdGVyaWFscwotX1VJX01pbGVzdG9uZV9yZXF1aXJlZFJlc3VsdHNfZmVhdHVyZSA9IFJlcXVpcmVkIFJlc3VsdHMKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3Jfd29ya1Byb2R1Y3RfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdAotX1VJX1JvbGVEZXNjcmlwdG9yX3JvbGVfZmVhdHVyZSA9IFJvbGUKLV9VSV9UYXNrRGVzY3JpcHRvcl90YXNrX2ZlYXR1cmUgPSBUYXNrCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnRfZmVhdHVyZSA9IHByb2Nlc3MgQ29tcG9uZW50Ci1fVUlfQnJlYWtkb3duRWxlbWVudF90ZW1wbGF0ZXNfZmVhdHVyZSA9IFRlbXBsYXRlcwotX1VJX0JyZWFrZG93bkVsZW1lbnRfcmVwb3J0c19mZWF0dXJlID0gUmVwb3J0cwotX1VJX0JyZWFrZG93bkVsZW1lbnRfZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMKLV9VSV9CcmVha2Rvd25FbGVtZW50X3Rvb2xtZW50b3JfZmVhdHVyZSA9IFRvb2xtZW50b3IKLV9VSV9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb190eXBlID0gQXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm8KLV9VSV9LaW5kX2FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX2ZlYXR1cmUgPSBBcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbwotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9sb25nUHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gTG9uZyBQcmVzZW50YXRpb24gTmFtZQotX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX2lzUHJpbWFyeUV4dGVuc2lvbl9mZWF0dXJlID0gSXMgUHJpbWFyeSBFeHRlbnNpb24KLV9VSV9NZXRob2RQbHVnaW5fc3VwcG9ydGluZ19mZWF0dXJlID0gU3VwcG9ydGluZwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2MmYwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSA8Y29weXJpZ2h0PgotIDwvY29weXJpZ2h0PgotCi0gJElkOiBwbHVnaW4ueG1sLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NTQganRoYW0gRXhwICQKLS0tPgotCi08cGx1Z2luPgotICAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KLSAgICA8ZmFjdG9yeSAKLSAgICAgICB1cmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIgCi0gICAgICAgc3VwcG9ydGVkVHlwZXMgPSAKLSAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzllZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotCi0vKioKLSAqIEEgY29tbWFuZCB0aGF0IGNyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBjb3B5IG9mIGEgbWV0aG9kIGVsZW1lbnQuIFRoZQotICogbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgdXNpbmcKLSAqIHtAbGluayBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kfS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZCBleHRlbmRzIENyZWF0ZUNvcHlDb21tYW5kIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgdGhlIGVkaXRpbmcgZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IGJlaW5nIGNvcGllZAotCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JICogICAgICAgICAgICBhIGhlbHBlciBjbGFzcyB0aGF0IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBjb3BpZWQgb2JqZWN0cwotCSAqICAgICAgICAgICAgYW5kIHRoZWlyIGFzc29jaWF0ZWQgY29waWVzCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc3VsdCBvZiB0aGUgY29weSBvcGVyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgY29waWVkIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0UmVzdWx0KCkgewotCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBzdXBlci5kb0dldFJlc3VsdCgpOwotCi0JCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCSgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLmFkZENvcHlJbmZvKAotCQkJCQljb2xsZWN0aW9uLCBjb3B5SGVscGVyKTsKLQkJfQotCi0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5ZGFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQSBjb21tYW5kIHRoYXQgdGFrZXMgYW4gdW5pbml0aWFsaXplZCBjb3B5IG9mIGEgbWV0aG9kIGVsZW1lbnQgYW5kIHNldHMgYSBuZXcKLSAqIEdVSUQuIElmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIGEgPGNvZGU+Q29udGVudEVsZW1lbnQ8L2NvZGU+IHdpdGggYSB2YWxpZAotICogPGNvZGU+Q29udGVudERlc2NyaXB0aW9uPC9jb2RlPiwgYSBjb3B5IG9mIHRoZQotICogPGNvZGU+Q29udGVudERlc2NyaXB0aW9uPC9jb2RlPiBpcyBhbHNvIGNyZWF0ZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kIGV4dGVuZHMgSW5pdGlhbGl6ZUNvcHlDb21tYW5kIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgdGhlIGVkaXRpbmcgZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IGJlaW5nIGNvcGllZAotCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JICogICAgICAgICAgICBhIGhlbHBlciBjbGFzcyB0aGF0IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBjb3BpZWQgb2JqZWN0cwotCSAqICAgICAgICAgICAgYW5kIHRoZWlyIGFzc29jaWF0ZWQgY29waWVzCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuSW5pdGlhbGl6ZUNvcHlDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKCkgewotCQlzdXBlci5kb0V4ZWN1dGUoKTsKLQotCQkvLyBnZW5lcmF0ZSBuZXcgR1VJRCBmb3IgdGhlIGNvcHkKLQkJLy8KLQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnQpIGNvcHkpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQlFT2JqZWN0IGVDb250YWluZXIgPSBlLmVDb250YWluZXIoKTsKLQkJCQlpZiAoZUNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZS5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCgoTWV0aG9kRWxlbWVudCkgZUNvbnRhaW5lcikKLQkJCQkJCQkuZ2V0R3VpZCgpKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZS5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCkpOwotCQkJCQlVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmxvZygiTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDogZUNvbnRhaW5lciBub3QgaW5pdGlhbGl6ZWQgZm9yICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZS5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZXMgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgb3duZXIgb2JqZWN0IGFuZCBzZXRzIHRoZW0KLQkgKiBhY2NvcmRpbmdseSBpbiB0aGUgY29weS4gSW5jbHVkZXMgY29waW5nIG9mIG9wcG9zaXRlIGZlYXR1cmVzLgotCSAqLwotCXByaXZhdGUgdm9pZCBkb0NvcHlSZWZlcmVuY2VzKCkgewotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXN1cGVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciByZWZlcmVuY2VzID0gZ2V0UmVmZXJlbmNlc1RvQ29weSgpLml0ZXJhdG9yKCk7IHJlZmVyZW5jZXMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5uZXh0KCk7Ci0JCQlpZiAoIXJlZmVyZW5jZS5pc0NoYW5nZWFibGUoKSB8fCByZWZlcmVuY2UuaXNEZXJpdmVkKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJRVJlZmVyZW5jZSByZXZlcnNlUmVmZXJlbmNlID0gcmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpOwotCi0JCQlPYmplY3QgdmFsdWUgPSBvd25lci5lR2V0KHJlZmVyZW5jZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmUocmVmZXJlbmNlKTsKLQkJCWJvb2xlYW4gY29waWVkVGFyZ2V0UmVxdWlyZWQgPSByZXZlcnNlUmVmZXJlbmNlICE9IG51bGwKLQkJCQkJfHwgcmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKQotCQkJCQl8fCAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSk7Ci0JCQkvLyAibWFueSIgb3Bwb3NpdGUgZmVhdHVyZSBkb2VzIG5vdCByZXF1aXJlIGNvcGllZCB0YXJnZXQsIGl0IGlzCi0JCQkvLyB0cmVhdGVkIGFzIGEgcmVndWxhciBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JCQkvLyBUT0RPOiBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGNvcGllZCBpbgotCQkJLy8gRU1GIGltcGxlbWVudGF0aW9uCi0JCQlpZiAocmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgdmFsdWU7Ci0JCQkJaWYgKCF2YWx1ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCUVMaXN0IGNvcHlMaXN0ID0gKEVMaXN0KSBjb3B5LmVHZXQocmVmZXJlbmNlKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChJdGVyYXRvciB2YWx1ZUl0ZXIgPSB2YWx1ZUxpc3QuaXRlcmF0b3IoKTsgdmFsdWVJdGVyCi0JCQkJCQkJLmhhc05leHQoKTsgKytpbmRleCkgewotCQkJCQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlvYmplY3QgPSAoRU9iamVjdCkgdmFsdWVJdGVyLm5leHQoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCQlFT2JqZWN0IHRhcmdldCA9IGNvcHlIZWxwZXIuZ2V0Q29weVRhcmdldChvYmplY3QsCi0JCQkJCQkJCWNvcGllZFRhcmdldFJlcXVpcmVkKTsKLQkJCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWlmIChyZXZlcnNlUmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgcG9zaXRpb24gPSBjb3B5TGlzdC5pbmRleE9mKHRhcmdldCk7Ci0JCQkJCQkJaWYgKHBvc2l0aW9uID09IC0xKSB7Ci0JCQkJCQkJCWNvcHlMaXN0LmFkZChpbmRleCwgdGFyZ2V0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljb3B5TGlzdC5tb3ZlKGluZGV4LCB0YXJnZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29weUxpc3QuYWRkKHRhcmdldCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3QgdGFyZ2V0ID0gY29weUhlbHBlci5nZXRDb3B5VGFyZ2V0KChFT2JqZWN0KSB2YWx1ZSwKLQkJCQkJCWNvcGllZFRhcmdldFJlcXVpcmVkKTsKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJY29weS5lU2V0KHJlZmVyZW5jZSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlcygpIHsKLQkJZG9Db3B5UmVmZXJlbmNlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxZWI4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1hbmRzIGZvciBjb3B5aW5nIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9kb21haW4vVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9kb21haW4vVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDhkZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL1RyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIEEgdHJhY2VhYmxlIGFkYXB0ZXIgZmFjdG9yeSBlZGl0aW5nIGRvbWFpbiB1c2VkIGZvciBjb3B5aW5nIG1ldGhvZCBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBleHRlbmRzCi0JCUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiB7Ci0KLQkvLyBNYXBzIGNvcGllZCBtZXRob2QgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgY291bnRlcnBhcnRzLgotCS8vIE5vdGU6IENvcGllZCBlbGVtZW50cyBhcmUgY29waWVzIG9mIHRoZSBjbGlwYm9hcmQgY29waWVzLgotCXByaXZhdGUgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4gY29weVRvT3JpZ2luYWxNYXAgPSBudWxsOwotCi0JLy8gTWFwcyBvcmlnaW5hbCBlbGVtZW50cyB0byB0aGVpciBjbGlwYm9hcmQgY29waWVzLgotCXByaXZhdGUgTWFwPE9iamVjdCwgT2JqZWN0PiBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcDxFT2JqZWN0LCBFT2JqZWN0PiBjbGlwYm9hcmRUb09yaWdpbmFsTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciB0byB3aGljaCBjYWxscwotCSAqICAgICAgICAgICAgYXJlIGRlbGVnYXRlZAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2spOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgdG8gd2hpY2ggY2FsbHMKLQkgKiAgICAgICAgICAgIGFyZSBkZWxlZ2F0ZWQKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKiBAcGFyYW0gcmVzb3VyY2VUb1JlYWRPbmx5TWFwCi0JICogICAgICAgICAgICBjb250cm9scyB3aGV0aGVyIHRoZSBkb21haW4gaXMgcmVhZCBvbmx5Ci0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIE1hcCByZXNvdXJjZVRvUmVhZE9ubHlNYXApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgcmVzb3VyY2VUb1JlYWRPbmx5TWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIHRvIHdoaWNoIGNhbGxzCi0JICogICAgICAgICAgICBhcmUgZGVsZWdhdGVkCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICogQHBhcmFtIHJlc291cmNlU2V0Ci0JICogICAgICAgICAgICBhIHJlc291cmNlIHNldAotCSAqLwotCXB1YmxpYyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCByZXNvdXJjZVNldCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBjb250YWluaW5nIHRoZSBjb3BpZWQgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIG9yaWdpbmFsCi0JICogY291bnRlcnBhcnRzLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgY29waWVkIGVsZW1lbnRzIG1hcHBlZCB0byB0aGVpciBvcmlnaW5hbAotCSAqICAgICAgICAgY291bnRlcnBhcnRzCi0JICovCi0JcHVibGljIE1hcDw/LCA/PiBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwpIHsKLQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0JCX0KLQkJcmV0dXJuIGNvcHlUb09yaWdpbmFsTWFwOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnRzIG1hcHBlZCB0byB0aGVpciBjb3BpZWQgCi0JICogY291bnRlcnBhcnRzIG9uIGNsaXBib2FyZAotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIGNvcGllZCAKLQkgKiAgICAgICAgIGNvdW50ZXJwYXJ0cwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0T3JpZ2luYWxUb0NsaXBib2FyZE1hcCgpIHsKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkgewotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIG9yaWdpbmFsVG9DbGlwYm9hcmRNYXA7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBieSB0aGUgQ3JlYXRlQ29weUNvbW1hbmQuIEFkZHMgaW5mb21hdGlvbiB0byBjb25zdHJ1Y3QgbWFwcyB0aGF0Ci0JICoga2VlcCB0cmFjayBvZiB0aGUgb3JpZ2luYWwgbWV0aG9kIGVsZW1lbnRzIGFuZCB0aGVpciBjb3BpZXMuCi0JICogCi0JICogQHBhcmFtIGMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiB0byBzdG9yZSB0aGUgbWFwcGluZyBpbmZvCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKiAgICAgICAgICAgIGEgaGVscGVyIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvcGllZCBvYmplY3RzCi0JICogICAgICAgICAgICBhbmQgdGhlaXIgYXNzb2NpYXRlZCBjb3BpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb3B5SW5mbyhDb2xsZWN0aW9uIGMsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCWlmIChpc05ld0NvcHkoYywgY29weUhlbHBlcikpIHsKLQkJCWFkZE5ld0NvcHkoYywgY29weUhlbHBlcik7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQljaGFpbkNvcHkoYywgY29weUhlbHBlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGVsZW1lbnQgdGhhdCBpcyBiZWluZyBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmV3Q29weShDb2xsZWN0aW9uIGMsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCS8vIHRoaXMgbWVhbnMgd2UgYXJlIGNvcHlpbmcgdGhlIENvbGxlY3Rpb24gYyB0byB0aGUgY2xpcGJvYXJkCi0JCWlmIChvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID09IG51bGwpCi0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYoY2xpcGJvYXJkVG9PcmlnaW5hbE1hcCA9PSBudWxsKSB7Ci0JCQljbGlwYm9hcmRUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgRU9iamVjdD4oKTsKLQkJfQotCQlJdGVyYXRvciBpdGVyID0gY29weUhlbHBlci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3Qga2V5ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJRU9iamVjdCB2YWx1ZSA9IChFT2JqZWN0KSBjb3B5SGVscGVyLmdldChrZXkpOwotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0JCQljbGlwYm9hcmRUb09yaWdpbmFsTWFwLnB1dCh2YWx1ZSwga2V5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtYXAgZnJvbSB0aGUgY29waWVkIGVsZW1lbnRzIHRvIHRoZWlyIG9yaWdpbmFsIGNvdW50ZXJwYXJ0cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhaW5Db3B5KENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJLy8gY2hhaW4gdGhlIG1hcHMgLSBjaGFuZ2UgdGhlIGNvcHlUb09yaWdpbmFsTWFwCi0JCWlmIChvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwICE9IG51bGwpIHsKLQkJCWlmIChjb3B5VG9PcmlnaW5hbE1hcCA9PSBudWxsKQotCQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbzJDS2V5ID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IG8yQ1ZhbHVlID0gb3JpZ2luYWxUb0NsaXBib2FyZE1hcC5nZXQobzJDS2V5KTsKLQkJCQlPYmplY3QgY29weVZhbHVlID0gY29weUhlbHBlci5nZXQobzJDVmFsdWUpOwotCQkJCWlmIChjb3B5VmFsdWUgPT0gbnVsbCkgewotCQkJCQkvLyBlcnJvcgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKG8yQ0tleSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCWNvcHlUb09yaWdpbmFsTWFwLnB1dChjb3B5VmFsdWUsIG8yQ0tleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdDb3B5KENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJLy8gb3JpZ2luYWxUb0NsaXBib2FyZE1hcCB3YXMgc2V0IHRvIG51bGwgYXQgc3RhcnQgb2YgY29weSBjb21tYW5kCi0JCWlmIChvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBpdGVyYXRlIHRocm91Z2ggY29weUhlbHBlciBtYXAsIHNlZSBpZiBhbnkgY29weUhlbHBlciBrZXlzIGFyZSBvMkMKLQkJLy8gdmFsdWVzLCB3aGljaCBtZWFucyB3ZSBhcmUgY29weWluZyBjbGlwYm9hcmQKLQkJSXRlcmF0b3IgaXRlciA9IGNvcHlIZWxwZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2xpcEtleSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLmNvbnRhaW5zVmFsdWUoY2xpcEtleSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvcHkgbWFwcy4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoaW4gdGhlIGNvcHkgYWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0Q29weU1hcHMoKSB7Ci0JCWlmIChvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwICE9IG51bGwpIHsKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAuY2xlYXIoKTsKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBudWxsOwotCQl9Ci0JCWlmKGNsaXBib2FyZFRvT3JpZ2luYWxNYXAgIT0gbnVsbCkgewotCQkJY2xpcGJvYXJkVG9PcmlnaW5hbE1hcC5jbGVhcigpOwotCQkJY2xpcGJvYXJkVG9PcmlnaW5hbE1hcCA9IG51bGw7Ci0JCX0KLQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwICE9IG51bGwpIHsKLQkJCWNvcHlUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JCQljb3B5VG9PcmlnaW5hbE1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTWFwPEVPYmplY3QsIEVPYmplY3Q+IGdldENsaXBib2FyZFRvT3JpZ2luYWxNYXAoKSB7Ci0JCXJldHVybiBjbGlwYm9hcmRUb09yaWdpbmFsTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9kb21haW4vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjllYTczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgZGVmYXVsdCBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJhYTE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFsdGVybmF0aXZlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSG93dG9TdGFmZlByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHVycG9zZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbHRlcm5hdGl2ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbHRlcm5hdGl2ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIb3d0byBTdGFmZiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhvd3RvU3RhZmZQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQ3OTRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRGdWxmaWxsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCcmVha2Rvd25FbGVtZW50c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUm9hZG1hcHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZ1bGZpbGxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5VHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTik7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCcmVha2Rvd25FbGVtZW50c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJvYWRtYXBzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9hZG1hcHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19ST0FETUFQUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFjdGl2aXR5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FjdGl2aXR5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFjdGl2aXR5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FjdGl2aXR5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjMDAyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlciBleHRlbmRzIENsYXNzaWZpZXJJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1ByaW1hcnlFeHRlbnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIFByaW1hcnkgRXh0ZW5zaW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNQcmltYXJ5RXh0ZW5zaW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX2lzUHJpbWFyeUV4dGVuc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX2lzUHJpbWFyeUV4dGVuc2lvbl9mZWF0dXJlIiwgIl9VSV9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGY2M2I0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRCcmllZk91dGxpbmVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlcHJlc2VudGF0aW9uT3B0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVwcmVzZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE5vdGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCcmllZiBPdXRsaW5lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQnJpZWZPdXRsaW5lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcHJlc2VudGF0aW9uIE9wdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXByZXNlbnRhdGlvbk9wdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVwcmVzZW50YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbl9mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5vdGF0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9ub3RhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fbm90YXRpb25fZmVhdHVyZSIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBcnRpZmFjdERlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FydGlmYWN0RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXJ0aWZhY3RJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjZjZDgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFydGlmYWN0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FydGlmYWN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFydGlmYWN0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXJ0aWZhY3QuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYjUyZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFVzYWdlR3VpZGFuY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVzYWdlIEd1aWRhbmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNhZ2VHdWlkYW5jZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJjOTIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHJlZml4UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJc1BsYW5uZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEhhc011bHRpcGxlT2NjdXJyZW5jZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzT3B0aW9uYWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByZXNlbnRlZEFmdGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVzZW50ZWRCZWZvcmVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1cGVyQWN0aXZpdGllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29uY2VwdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXVzYWJsZUFzc2V0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwcG9ydGluZ01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVGVtcGxhdGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXBvcnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRvb2xtZW50b3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZWZpeCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZWZpeFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIFBsYW5uZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1BsYW5uZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGFzIE11bHRpcGxlIE9jY3VycmVuY2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgT3B0aW9uYWwgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc09wdGlvbmFsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZXNlbnRlZCBBZnRlciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZXNlbnRlZEFmdGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlc2VudGVkIEJlZm9yZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZXNlbnRlZEJlZm9yZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1cGVyIEFjdGl2aXRpZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBlckFjdGl2aXRpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGVja2xpc3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29uY2VwdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25jZXB0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2NvbmNlcHRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9jb25jZXB0c19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXhhbXBsZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGFtcGxlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9leGFtcGxlc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR3VpZGVsaW5lcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJldXNhYmxlIEFzc2V0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJldXNhYmxlQXNzZXRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmV1c2FibGVBc3NldHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwcG9ydGluZyBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGVtcGxhdGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGVtcGxhdGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdGVtcGxhdGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90ZW1wbGF0ZXNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXBvcnRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVwb3J0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3JlcG9ydHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3JlcG9ydHNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUb29sbWVudG9yIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9vbG1lbnRvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3Rvb2xtZW50b3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3Rvb2xtZW50b3JfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1ZjM1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ2FwYWJpbGl0eVBhdHRlcm4pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2hlY2tsaXN0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2hlY2tsaXN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOTJjYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NoZWNrbGlzdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDaGVja2xpc3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ2hlY2tsaXN0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NoZWNrbGlzdCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDaGVja2xpc3QpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ2hlY2tsaXN0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9DaGVja2xpc3RfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NsYXNzaWZpZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DbGFzc2lmaWVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzIxN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NsYXNzaWZpZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NpZmllckl0ZW1Qcm92aWRlciBleHRlbmRzIFR5cGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDbGFzc2lmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzQWJzdHJhY3RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIEFic3RyYWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNBYnN0cmFjdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX2lzQWJzdHJhY3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9DbGFzc2lmaWVyX2lzQWJzdHJhY3RfZmVhdHVyZSIsICJfVUlfQ2xhc3NpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNULCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENsYXNzaWZpZXIpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ2xhc3NpZmllcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ2xhc3NpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ2xhc3NpZmllci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWRlODYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQWdncmVnYXRlZFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBZ2dyZWdhdGVkIFJvbGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWdncmVnYXRlZFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSIsICJfVUlfQ29tcG9zaXRlUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29tcG9zaXRlUm9sZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db21wb3NpdGVSb2xlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbXBvc2l0ZVJvbGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29tcG9zaXRlUm9sZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29tcG9zaXRlUm9sZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uY2VwdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbmNlcHRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0MTgzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uY2VwdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25jZXB0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbmNlcHQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29uY2VwdCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25jZXB0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbmNlcHRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbmNlcHRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTBiMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEJvZHlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJvZHkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCb2R5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfYm9keV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnN0cmFpbnRfYm9keV9mZWF0dXJlIiwgIl9VSV9Db25zdHJhaW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OU1RSQUlOVF9fQk9EWSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb25zdHJhaW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbnN0cmFpbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29uc3RyYWludCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db25zdHJhaW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db25zdHJhaW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb25zdHJhaW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDBlZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29udGVudENhdGVnb3J5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudENhdGVnb3J5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwNTQ5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RVbml0SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE1haW5EZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXh0ZXJuYWxJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkS2V5Q29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExvbmdQcmVzZW50YXRpb25OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYWluIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFpbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXh0ZXJuYWwgSWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlcm5hbElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgS2V5IENvbnNpZGVyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkS2V5Q29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMb25nIFByZXNlbnRhdGlvbiBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9uZ1ByZXNlbnRhdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX2xvbmdQcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX2xvbmdQcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29udGVudERlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbnRlbnREZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb250ZW50RGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0ZXAoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MTA4NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbmNlcHRzQW5kUGFwZXJzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeGFtcGxlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXNzZXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUZXJtZGVmaW5pdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5VHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbmNlcHRzIEFuZCBQYXBlcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25jZXB0c0FuZFBhcGVyc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hlY2tsaXN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoZWNrbGlzdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkZWxpbmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZGVsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4YW1wbGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXhhbXBsZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBc3NldHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBc3NldHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZXJtZGVmaW5pdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRlcm1kZWZpbml0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X3Rlcm1kZWZpbml0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfdGVybWRlZmluaXRpb25fZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwcG9ydGluZyBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnRFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkYTNkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb250ZW50UGFja2FnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb250ZW50UGFja2FnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db250ZW50UGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudFBhY2thZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUtpbmQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2xNZW50b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGNvbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdoaXRlcGFwZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2soKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRtYXAoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2woKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBiMWUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVsZW1lbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiLCAiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0NDZmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZENhdGVnb3JpemVkRWxlbWVudHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1YkNhdGVnb3JpZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENhdGVnb3JpemVkIEVsZW1lbnRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2F0ZWdvcml6ZWRFbGVtZW50c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlIiwgIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdWIgQ2F0ZWdvcmllcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1YkNhdGVnb3JpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSIsICJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ3VzdG9tQ2F0ZWdvcnkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjI0YTBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRFeHRlcm5hbERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYWNrYWdpbmdHdWlkYW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXh0ZXJuYWwgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlcm5hbERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhY2thZ2luZyBHdWlkYW5jZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2luZ0d1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjE4ZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZERlbGl2ZXJlZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVsaXZlcmVkIFdvcmsgUHJvZHVjdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxpdmVyZWRXb3JrUHJvZHVjdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfZGVsaXZlcmVkV29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcmFibGVfZGVsaXZlcmVkV29ya1Byb2R1Y3RzX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJhYmxlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcmFibGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcmFibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVsaXZlcmFibGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzcwYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTY2FsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJvamVjdENoYXJhY3RlcmlzdGljc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmlza0xldmVsUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFc3RpbWF0aW5nVGVjaG5pcXVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUeXBlT2ZDb250cmFjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2NhbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTY2FsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3NjYWxlX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvamVjdCBDaGFyYWN0ZXJpc3RpY3MgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RDaGFyYWN0ZXJpc3RpY3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmlzayBMZXZlbCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJpc2tMZXZlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVzdGltYXRpbmcgVGVjaG5pcXVlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXN0aW1hdGluZ1RlY2huaXF1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByb2plY3QgTWVtYmVyIEV4cGVydGlzZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3RNZW1iZXJFeHBlcnRpc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHlwZSBPZiBDb250cmFjdCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVPZkNvbnRyYWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGVPZkNvbnRyYWN0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjg4ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRFZHVjYXRpb25NYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbW11bmljYXRpb25zTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFZHVjYXRpb24gTWF0ZXJpYWxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWR1Y2F0aW9uTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21tdW5pY2F0aW9uc01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NfY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcnlQcm9jZXNzLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyeVByb2Nlc3MpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ0MTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzQWJzdHJhY3RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNoYXBlaWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTm9kZWljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIEFic3RyYWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNBYnN0cmFjdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX2lzQWJzdHJhY3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9DbGFzc2lmaWVyX2lzQWJzdHJhY3RfZmVhdHVyZSIsICJfVUlfQ2xhc3NpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNULCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNoYXBlaWNvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNoYXBlaWNvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3NoYXBlaWNvbl9mZWF0dXJlIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTm9kZWljb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlaWNvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSIsICJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNDNmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUmVmaW5lZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZpbmVkIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmaW5lZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZXNjcmlwdG9yRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MWFhYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzU3luY2hyb25pemVkV2l0aFNvdXJjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIsICJfVUlfRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExZjIxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1Zpc2libGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlZmVyZW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgVmlzaWJsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzVmlzaWJsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSIsICJfVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVmZXJlbmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpYWdyYW1FbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlhZ3JhbUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmNkY2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaE5vZGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZERpYWdyYW1MaW5rUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRab29tUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWaWV3cG9pbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFpvb20gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRab29tUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fWk9PTSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZpZXdwb2ludCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZpZXdwb2ludFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19WSUVXUE9JTlQsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaWFncmFtIExpbmsgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaWFncmFtTGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlIiwgIl9VSV9EaWFncmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fRElBR1JBTV9MSU5LLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlhZ3JhbS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaWFncmFtIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpYWdyYW0pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlhZ3JhbS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1pPT006Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX05BTUVTUEFDRSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX05BTUVTUEFDRSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1MaW5rSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1NDY1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTGlua0l0ZW1Qcm92aWRlciBleHRlbmRzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkWm9vbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmlld3BvcnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERpYWdyYW1Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFpvb20gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRab29tUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19aT09NLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZpZXdwb3J0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlld3BvcnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlIiwgIl9VSV9EaWFncmFtTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fTElOS19fVklFV1BPUlQsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaWFncmFtIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGlhZ3JhbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbUxpbmtfZGlhZ3JhbV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fTElOS19fRElBR1JBTSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpYWdyYW1MaW5rLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RpYWdyYW1MaW5rIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpYWdyYW1MaW5rKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlhZ3JhbUxpbmsuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpbWVuc2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpbWVuc2lvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNmNDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaW1lbnNpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGltZW5zaW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRXaWR0aFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGVpZ2h0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXaWR0aCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdpZHRoUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlIiwgIl9VSV9EaW1lbnNpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESU1FTlNJT05fX1dJRFRILCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhlaWdodCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhlaWdodFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlIiwgIl9VSV9EaW1lbnNpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESU1FTlNJT05fX0hFSUdIVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaW1lbnNpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGltZW5zaW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlEb3VibGUgbGFiZWxWYWx1ZSA9ICgoRGltZW5zaW9uKSBvYmplY3QpLmdldFdpZHRoKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaW1lbnNpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpbWVuc2lvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGltZW5zaW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSDoKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2MTNiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGlzY2lwbGluZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpc2NpcGxpbmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGlzY2lwbGluZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX2ZlYXR1cmUiLCAiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlzY2lwbGluZUdyb3VwaW5nLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTIzYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFRhc2tzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZWZlcmVuY2VXb3JrZmxvd3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhc2tzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFza3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1RBU0tTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVmZXJlbmNlIFdvcmtmbG93cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlZmVyZW5jZVdvcmtmbG93c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lX3JlZmVyZW5jZVdvcmtmbG93c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUiLCAiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpc2NpcGxpbmUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlzY2lwbGluZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEaXNjaXBsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczODUxNDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW59IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvbWFpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRXb3JrUHJvZHVjdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdvcmsgUHJvZHVjdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXb3JrUHJvZHVjdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSIsICJfVUlfRG9tYWluX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19XT1JLX1BST0RVQ1RTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU5TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRG9tYWluLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RvbWFpbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEb21haW4pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRG9tYWluX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERvbWFpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fU1VCRE9NQUlOUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVEb21haW4oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDViNmY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9FbGVtZW50X3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsbGlwc2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGxpcHNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTY4NDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsbGlwc2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxsaXBzZUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGxpcHNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZENlbnRlclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmFkaXVzWFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmFkaXVzWVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUm90YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN0YXJ0QW5nbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVuZEFuZ2xlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDZW50ZXIgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDZW50ZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9jZW50ZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fQ0VOVEVSLCB0cnVlLCBmYWxzZSwgdHJ1ZSwKLQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmFkaXVzIFggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYWRpdXNYUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fUkFESVVTX1gsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmFkaXVzIFkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYWRpdXNZUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fUkFESVVTX1ksIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm90YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb3RhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fUk9UQVRJT04sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RhcnQgQW5nbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydEFuZ2xlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fU1RBUlRfQU5HTEUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRW5kIEFuZ2xlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kQW5nbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSIsICJfVUlfRWxsaXBzZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkVMTElQU0VfX0VORF9BTkdMRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFbGxpcHNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0VsbGlwc2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRWxsaXBzZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFbGxpcHNlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1g6Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWE1MGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXhhbXBsZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzQ4NTBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4YW1wbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRXhhbXBsZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9FeGFtcGxlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEV4YW1wbGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXhhbXBsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRXhhbXBsZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzgwOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Z1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBGdWxmaWxscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF9mdWxmaWxsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF9mdWxmaWxsc19mZWF0dXJlIiwgIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEZ1bGZpbGxhYmxlRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9GdWxmaWxsYWJsZUVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRnVsZmlsbGFibGVFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczODA0MTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRHcmFwaEVkZ2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEdyYXBoIEVkZ2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHcmFwaEVkZ2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUiLCAiX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3JhcGhDb25uZWN0b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvR3JhcGhDb25uZWN0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhDb25uZWN0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3JhcGhDb25uZWN0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVkZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVkZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4YTQ5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhFZGdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhFZGdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFZGdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEFuY2hvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQW5jaG9yIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5jaG9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUiLCAiX1VJX0dyYXBoRWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0VfX0FOQ0hPUiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0VfX1dBWVBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEdyYXBoRWRnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HcmFwaEVkZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhFZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoRWRnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChHcmFwaEVkZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FREdFX19XQVlQT0lOVFMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUG9pbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1OGE0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUG9zaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvc2l0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9zaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUiLCAiX1VJX0dyYXBoRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEdyYXBoRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0dyYXBoRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoR3JhcGhFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoTm9kZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVmZXJlbmNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbUxpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoQ29ubmVjdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaEVkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGV4dEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUltYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2x5bGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWxsaXBzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZURpYWdyYW1MaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaENvbm5lY3RvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhOb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhOb2RlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OTRhMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoTm9kZUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoTm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTaXplUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTaXplIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2l6ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaE5vZGVfc2l6ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUiLCAiX1VJX0dyYXBoTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX05PREVfX1NJWkUsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaE5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvR3JhcGhOb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEdyYXBoTm9kZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaE5vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0dyYXBoTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5NGNlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEdyYXBoaWNQcmltaXRpdmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3JhcGhpY1ByaW1pdGl2ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhpY1ByaW1pdGl2ZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZWZkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBdHRhY2htZW50c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXR0YWNobWVudHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRhY2htZW50c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlIiwgIl9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEd1aWRhbmNlRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvR3VpZGFuY2VEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHdWlkYW5jZURlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEd1aWRhbmNlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIwNThjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3VpZGFuY2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0d1aWRhbmNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkZWxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkZWxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjZWI2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGVsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkZWxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRlbGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHdWlkZWxpbmUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvR3VpZGVsaW5lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEd1aWRlbGluZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HdWlkZWxpbmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0d1aWRlbGluZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSW1hZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JbWFnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWEzYWQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JbWFnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEltYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRVcmlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE1pbWVUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVcmkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVcmlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfdXJpX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSW1hZ2VfdXJpX2ZlYXR1cmUiLCAiX1VJX0ltYWdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuSU1BR0VfX1VSSSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1pbWUgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1pbWVUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSIsICJfVUlfSW1hZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5JTUFHRV9fTUlNRV9UWVBFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEltYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0ltYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEltYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0ltYWdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9JbWFnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSW1hZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSXRlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSXRlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNzVhNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0l0ZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEl0ZXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSXRlcmF0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEl0ZXJhdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9JdGVyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSXRlcmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0l0ZXJhdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfSXRlcmF0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvS2luZEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0tpbmRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NmFkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvS2luZEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBLaW5kSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBLaW5kSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEtpbmQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvS2luZCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChLaW5kKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0tpbmRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0tpbmRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEtpbmQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9MZWFmRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWI0Y2UxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9MZWFmRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChMZWFmRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9MZWFmRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTGVhZkVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Yzc0MWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE1ldGhvZFBsdWdpblNlbGVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTWV0aG9kUGFja2FnZVNlbGVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJvY2Vzc1ZpZXdzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZWZhdWx0Vmlld1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQmFzZUNvbmZpZ3VyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdWJ0cmFjdGVkQ2F0ZWdvcnlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFkZGVkQ2F0ZWdvcnlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kUGx1Z2luU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGx1Z2luU2VsZWN0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZFBhY2thZ2VTZWxlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvY2VzcyBWaWV3cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NWaWV3c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlZmF1bHQgVmlldyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRWaWV3UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQmFzZSBDb25maWd1cmF0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJhc2VDb25maWd1cmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1YnRyYWN0ZWQgQ2F0ZWdvcnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdWJ0cmFjdGVkQ2F0ZWdvcnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9zdWJ0cmFjdGVkQ2F0ZWdvcnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3N1YnRyYWN0ZWRDYXRlZ29yeV9mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBZGRlZCBDYXRlZ29yeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkZGVkQ2F0ZWdvcnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9hZGRlZENhdGVnb3J5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9hZGRlZENhdGVnb3J5X2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RDb25maWd1cmF0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk0NmYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkR3VpZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlc2VudGF0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQnJpZWZEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkS2luZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwcHJlc3NlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3JkZXJpbmdHdWlkZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR3VpZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEd1aWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fR1VJRCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVzZW50YXRpb24gTmFtZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZXNlbnRhdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCcmllZkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEtpbmQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRLaW5kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRfa2luZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRfa2luZF9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX0tJTkQsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwcmVzc2VkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3VwcHJlc3NlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9yZGVyaW5nIEd1aWRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JkZXJpbmdHdWlkZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUgLy8KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MGY3YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWx1ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RFbGVtZW50UHJvcGVydHkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2ZmI2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RVbml0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kTGlicmFyeS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZExpYnJhcnkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kTGlicmFyeV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kTGlicmFyeV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kTGlicmFyeS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NGYW1pbHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmE2NmY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRHbG9iYWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJldXNlZFBhY2thZ2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHbG9iYWwgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlIiwgIl9VSV9NZXRob2RQYWNrYWdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXVzZWQgUGFja2FnZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXVzZWRQYWNrYWdlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlIiwgIl9VSV9NZXRob2RQYWNrYWdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RQYWNrYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFBhY2thZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkNjNkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RVbml0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFVzZXJDaGFuZ2VhYmxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCYXNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwcG9ydGluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXNlciBDaGFuZ2VhYmxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNlckNoYW5nZWFibGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBsdWdpbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJhc2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBsdWdpbl9iYXNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBsdWdpbl9iYXNlc19mZWF0dXJlIiwgIl9VSV9NZXRob2RQbHVnaW5fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1cHBvcnRpbmcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwb3J0aW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBsdWdpbl9zdXBwb3J0aW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGx1Z2luX3N1cHBvcnRpbmdfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fU1VQUE9SVElORywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kUGx1Z2luLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZFBsdWdpbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RQbHVnaW4pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFBsdWdpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1NVUFBPUlRJTkc6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RVbml0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmRkMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RVbml0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEF1dGhvcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoYW5nZURhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoYW5nZURlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb3B5cmlnaHRTdGF0ZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEF1dGhvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRob3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhbmdlIERhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VEYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoYW5nZSBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZURlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZlcnNpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX1ZFUlNJT04sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29weXJpZ2h0IFN0YXRlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvcHlyaWdodFN0YXRlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFVuaXQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kVW5pdC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViY2M4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSZXF1aXJlZFJlc3VsdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcXVpcmVkIFJlc3VsdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXF1aXJlZFJlc3VsdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWlsZXN0b25lX3JlcXVpcmVkUmVzdWx0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01pbGVzdG9uZV9yZXF1aXJlZFJlc3VsdHNfZmVhdHVyZSIsICJfVUlfTWlsZXN0b25lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWlsZXN0b25lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01pbGVzdG9uZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNaWxlc3RvbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWlsZXN0b25lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NaWxlc3RvbmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVkRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVkRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWFmNjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9OYW1lZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlIiwgIl9VSV9OYW1lZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE5hbWVkRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9OYW1lZEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTmFtZWRFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZXNwYWNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZXNwYWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZDc4M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVzcGFjZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZXNwYWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE5hbWVzcGFjZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9OYW1lc3BhY2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX05hbWVzcGFjZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvT3V0Y29tZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL091dGNvbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiOWU2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvT3V0Y29tZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRjb21lSXRlbVByb3ZpZGVyIGV4dGVuZHMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRjb21lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE91dGNvbWUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvT3V0Y29tZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChPdXRjb21lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX091dGNvbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX091dGNvbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmFlYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTmFtZXNwYWNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQYWNrYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BhY2thZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BhY2thZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1BhY2thZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQ4NWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE5hbWVkRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQYWNrYWdlYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BoYXNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGhhc2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMmNhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGhhc2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBoYXNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBoYXNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BoYXNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBoYXNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BoYXNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QaGFzZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmY2ZjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGF9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFN0YXJ0RGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRmluaXNoRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmFua1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RhcnQgRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlIiwgIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZpbmlzaCBEYXRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmluaXNoRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUiLCAiX1VJX1BsYW5uaW5nRGF0YV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJhbmsgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BsYW5uaW5nRGF0YV9yYW5rX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSIsICJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQV9fUkFOSywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGxhbm5pbmdEYXRhLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BsYW5uaW5nRGF0YSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQbGFubmluZ0RhdGEpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBsYW5uaW5nRGF0YS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvaW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9pbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3MzU3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9pbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BvaW50X3hfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb2ludF94X2ZlYXR1cmUiLCAiX1VJX1BvaW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9JTlRfX1gsIHRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBZIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2ludF95X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9pbnRfeV9mZWF0dXJlIiwgIl9VSV9Qb2ludF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBPSU5UX19ZLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9pbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUG9pbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvdWJsZSBsYWJlbFZhbHVlID0gKChQb2ludCkgb2JqZWN0KS5nZXRYKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qb2ludF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUG9pbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvaW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9seWxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2x5bGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmZkNzlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2x5bGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvbHlsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvbHlsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZENsb3NlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2xvc2VkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2xvc2VkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlIiwgIl9VSV9Qb2x5bGluZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBPTFlMSU5FX19DTE9TRUQsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkVfX1dBWVBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvbHlsaW5lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BvbHlsaW5lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvbHlsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BvbHlsaW5lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2x5bGluZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9seWxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QT0xZTElORV9fV0FZUE9JTlRTLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVBvaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxZWEzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZGRpdGlvbmFsSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJvYmxlbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQmFja2dyb3VuZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkR29hbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFwcGxpY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRMZXZlbHNPZkFkb3B0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBZGRpdGlvbmFsIEluZm8gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRpdGlvbmFsSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9ibGVtIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhY2tncm91bmQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCYWNrZ3JvdW5kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR29hbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHb2Fsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFwcGxpY2F0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXBwbGljYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMZXZlbHMgT2YgQWRvcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMZXZlbHNPZkFkb3B0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcmFjdGljZURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1ByYWN0aWNlRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJhY3RpY2VEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzVhMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRDb250ZW50UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWN0aXZpdHlSZWZlcmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb250ZW50IFJlZmVyZW5jZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV9jb250ZW50UmVmZXJlbmNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFjdGl2aXR5IFJlZmVyZW5jZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpdml0eVJlZmVyZW5jZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfYWN0aXZpdHlSZWZlcmVuY2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VfYWN0aXZpdHlSZWZlcmVuY2VzX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByYWN0aWNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1ByYWN0aWNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByYWN0aWNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ByYWN0aWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJhY3RpY2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJlYjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3J9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZF9wcm9jZXNzQ29tcG9uZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm9jZXNzIENvbXBvbmVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZF9wcm9jZXNzQ29tcG9uZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX19wcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnRfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyYzg4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMsCi0JCQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDc2MTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQXV0aG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvcHlyaWdodFN0YXRlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW50ZXJmYWNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQVVUSE9SUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGFuZ2UgRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZURhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhbmdlIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmVyc2lvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fVkVSU0lPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb3B5cmlnaHQgU3RhdGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29weXJpZ2h0U3RhdGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW50ZXJmYWNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEludGVyZmFjZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NDb21wb25lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwZmMxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRVc2FnZU5vdGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTY29wZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2FnZSBOb3RlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVzYWdlTm90ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdXNhZ2VOb3Rlc19mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWU4NDk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0VsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVlZTdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZWxpdmVyeVByb2Nlc3Nlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsaXZlcnlQcm9jZXNzZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc0ZhbWlseV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzRmFtaWx5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0ZhbWlseSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM2NTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJbmNsdWRlc1BhdHRlcm5zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZWZhdWx0Q29udGV4dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsaWRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmNsdWRlcyBQYXR0ZXJucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluY2x1ZGVzUGF0dGVybnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlZmF1bHQgQ29udGV4dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWxpZCBDb250ZXh0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNjg2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc1BhY2thZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc1BhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzUGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4N2Q4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRCYXNlZE9uUHJvY2Vzc2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlZCBPbiBQcm9jZXNzZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCYXNlZE9uUHJvY2Vzc2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTUyZDEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRLZXlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBLZXkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRLZXlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUiLCAiX1VJX1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFlfX0tFWSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiwgIl9VSV9Qcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST1BFUlRZX19WQUxVRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9wZXJ0eS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9wZXJ0eSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9wZXJ0eSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb3BlcnR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTNiMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlZmVyZW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlZmVyZW5jZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSIsICJfVUlfUmVmZXJlbmNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmVyZW5jZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSIsICJfVUlfUmVmZXJlbmNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVGRVJFTkNFX19SRUZFUkVOQ0VELCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmVmZXJlbmNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JlZmVyZW5jZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSZWZlcmVuY2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUmVmZXJlbmNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9SZWZlcmVuY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlZmVyZW5jZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVwb3J0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVwb3J0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZjc2OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlcG9ydEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmVwb3J0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JlcG9ydCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSZXBvcnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUmVwb3J0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9SZXBvcnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNWIzNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSZXVzYWJsZUFzc2V0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JldXNhYmxlQXNzZXQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUmV1c2FibGVBc3NldCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9SZXVzYWJsZUFzc2V0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9SZXVzYWJsZUFzc2V0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2FkbWFwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9hZG1hcEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTZiNWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2FkbWFwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXB9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9hZG1hcC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2FkbWFwIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvYWRtYXApIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9hZG1hcF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9hZG1hcF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NWNmYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNraWxsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXNzaWdubWVudEFwcHJvYWNoZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN5bm9ueW1zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTa2lsbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTa2lsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSIsICJfVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFzc2lnbm1lbnQgQXBwcm9hY2hlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc2lnbm1lbnRBcHByb2FjaGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3lub255bXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTeW5vbnltc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSIsICJfVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9sZURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzExNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUm9sZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlc3BvbnNpYmxlRm9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2xlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9sZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZGlmaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0b3JfbW9kaWZpZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXNwb25zaWJsZSBGb3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNwb25zaWJsZUZvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl9yZXNwb25zaWJsZUZvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlRGVzY3JpcHRvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlRGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2ZhZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRGdWxmaWxsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlc3BvbnNpYmxlRm9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBGdWxmaWxscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF9mdWxmaWxsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF9mdWxmaWxsc19mZWF0dXJlIiwgIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZGlmaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSIsICJfVUlfUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfX01PRElGSUVTLCB0cnVlLCBmYWxzZSwgdHJ1ZSwKLQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVzcG9uc2libGUgRm9yIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzcG9uc2libGVGb3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSIsICJfVUlfUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvbGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDExODdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmd9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb2xlU2V0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZSBTZXRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9sZVNldHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUiLCAiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlU2V0R3JvdXBpbmcuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVTZXRHcm91cGluZykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0OTY1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlIiwgIl9VSV9Sb2xlU2V0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfX1JPTEVTLCB0cnVlLCBmYWxzZSwgdHJ1ZSwKLQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9sZVNldC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlU2V0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVTZXQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9sZVNldF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjOTk5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTZWN0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VjdGlvbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVkZWNlc3NvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VjdGlvbiBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VjdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfU2VjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NFQ1RJT05fTkFNRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWN0aW9uIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VjdGlvbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfU2VjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04sIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlZGVjZXNzb3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVkZWNlc3NvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdGlvbl9wcmVkZWNlc3Nvcl9mZWF0dXJlIiwgIl9VSV9TZWN0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTl9fUFJFREVDRVNTT1IsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19TVUJfU0VDVElPTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZWN0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1NlY3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VjdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZWN0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19TVUJfU0VDVElPTlMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2VjdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19TVUJfU0VDVElPTlMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU3RlcCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MTkxMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBleHRlbmRzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQcmVzZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZXNlbnRhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3ByZXNlbnRhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUiLCAiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZW1hbnRpY01vZGVsQnJpZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjIzY2EzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFR5cGVJbmZvUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIEluZm8gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUiLCAiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RlcEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N0ZXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzYjIyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RlcEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXB9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0ZXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTZWN0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RlcEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU3RlcC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TdGVwIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFN0ZXApIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU3RlcF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU3RlcF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RlcC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzg4M2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFN1cHBvcnRpbmdNYXRlcmlhbC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU3VwcG9ydGluZ01hdGVyaWFsKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZjJjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQdXJwb3NlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWx0ZXJuYXRpdmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUYXNrRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRhc2tEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZhZjYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRhc2tQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBc3Npc3RlZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeHRlcm5hbElucHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQZXJmb3JtZWRQcmltYXJpbHlCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VsZWN0ZWRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIsICJfVUlfRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXNrIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFza1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfVGFza19mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fVEFTSywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXNzaXN0ZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBc3Npc3RlZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4dGVybmFsIElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZXJuYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfZXh0ZXJuYWxJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYW5kYXRvcnkgSW5wdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPcHRpb25hbCBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE9wdGlvbmFsSW5wdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3V0cHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVULCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGVyZm9ybWVkIFByaW1hcmlseSBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBlcmZvcm1lZFByaW1hcmlseUJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWxlY3RlZCBTdGVwcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbGVjdGVkU3RlcHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFza0Rlc2NyaXB0b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRmNzc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3RlcHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBlcmZvcm1lZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19QRVJGT1JNRURfQlksIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYW5kYXRvcnkgSW5wdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fTUFOREFUT1JZX0lOUFVULCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3V0cHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfb3V0cHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19vdXRwdXRfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09VVFBVVCwgdHJ1ZSwgZmFsc2UsIHRydWUsCi0JCQkJCQludWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9wdGlvbmFsIElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09QVElPTkFMX0lOUFVULCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RlcHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19zdGVwc19mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fU1RFUFMsIHRydWUsIGZhbHNlLCB0cnVlLAotCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUb29sIE1lbnRvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fVE9PTF9NRU5UT1JTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRhc2suZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGFzayIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUYXNrKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rhc2tfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhc2suY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mjc1MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGVhbVJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBlclRlYW1Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1YlRlYW1Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlYW0gUm9sZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZWFtUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUiLCAiX1VJX1RlYW1Qcm9maWxlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwZXIgVGVhbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cGVyVGVhbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSIsICJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdWIgVGVhbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1YlRlYW1Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSIsICJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGVhbVByb2ZpbGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGVhbVByb2ZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGVhbVByb2ZpbGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1RlYW1Qcm9maWxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZW1wbGF0ZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YTQ5YjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBsYXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRlbXBsYXRlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1RlbXBsYXRlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRlbXBsYXRlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1RlbXBsYXRlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UZW1wbGF0ZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYwYWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUZXJtRGVmaW5pdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUZXJtRGVmaW5pdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UZXJtRGVmaW5pdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGVybURlZmluaXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RleHRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxOGQxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGV4dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGV4dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSIsICJfVUlfVGV4dEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URVhUX0VMRU1FTlRfX1RFWFQsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGV4dEVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGV4dEVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGV4dEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGV4dEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1RleHRFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUZXh0RWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmODk2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVG9vbCBNZW50b3JzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9vbE1lbnRvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVG9vbF90b29sTWVudG9yc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSIsICJfVUlfVG9vbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfX1RPT0xfTUVOVE9SUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRvb2wuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVG9vbCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUb29sKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xNZW50b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Ub29sTWVudG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNjMyM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xNZW50b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUb29sTWVudG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Rvb2xNZW50b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVG9vbE1lbnRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Ub29sTWVudG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Ub29sTWVudG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UeXBlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmZhOTEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFR5cGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwMWRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiLCAiX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hRWRpdFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkMWNkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hRWRpdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBVbWEgZWRpdCBwbHVnaW4uCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbWFFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVbWFFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IFVtYUVkaXRQbHVnaW4oKTsKLQotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFFZGl0UGx1Z2luKCkgewotCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7Ci0JCS8qKgotCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotCQkJc3VwZXIoKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkJCS8vCi0JCQlwbHVnaW4gPSB0aGlzOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ4MzRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCi0gKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KLSAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFVtYUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKLQkJQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VJdGVtUHJvdmlkZXIgcGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VBZGFwdGVyKCkgewotCQlpZiAocGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IFBhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50SXRlbVByb3ZpZGVyIGNvbnN0cmFpbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJaWYgKGNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uc3RyYWludEl0ZW1Qcm92aWRlciA9IG5ldyBDb25zdHJhaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnN0cmFpbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgbWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBLaW5kSXRlbVByb3ZpZGVyIGtpbmRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVLaW5kQWRhcHRlcigpIHsKLQkJaWYgKGtpbmRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJa2luZEl0ZW1Qcm92aWRlciA9IG5ldyBLaW5kSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGtpbmRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZUl0ZW1Qcm92aWRlciByb2xlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tJdGVtUHJvdmlkZXIgdGFza0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlpZiAodGFza0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0YXNrSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFza0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdGVwSXRlbVByb3ZpZGVyIHN0ZXBJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGVwQWRhcHRlcigpIHsKLQkJaWYgKHN0ZXBJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc3RlcEl0ZW1Qcm92aWRlciA9IG5ldyBTdGVwSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHN0ZXBJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0SXRlbVByb3ZpZGVyIGFydGlmYWN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpIHsKLQkJaWYgKGFydGlmYWN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFydGlmYWN0SXRlbVByb3ZpZGVyID0gbmV3IEFydGlmYWN0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFydGlmYWN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZ1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBmdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZ1bGZpbGxhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCWlmIChmdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyID0gbmV3IEZ1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciBkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRjb21lSXRlbVByb3ZpZGVyIG91dGNvbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJaWYgKG91dGNvbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJb3V0Y29tZUl0ZW1Qcm92aWRlciA9IG5ldyBPdXRjb21lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG91dGNvbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50SXRlbVByb3ZpZGVyIHBvaW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvaW50QWRhcHRlcigpIHsKLQkJaWYgKHBvaW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvaW50SXRlbVByb3ZpZGVyID0gbmV3IFBvaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvaW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtTGlua0l0ZW1Qcm92aWRlciBkaWFncmFtTGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaWFncmFtTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChkaWFncmFtTGlua0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaWFncmFtTGlua0l0ZW1Qcm92aWRlciA9IG5ldyBEaWFncmFtTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtTGlua0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhDb25uZWN0b3JBZGFwdGVyKCkgewotCQlpZiAoZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgPSBuZXcgR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb25JdGVtUHJvdmlkZXIgZGltZW5zaW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaW1lbnNpb25BZGFwdGVyKCkgewotCQlpZiAoZGltZW5zaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpbWVuc2lvbkl0ZW1Qcm92aWRlciA9IG5ldyBEaW1lbnNpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGltZW5zaW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlSXRlbVByb3ZpZGVyIHJlZmVyZW5jZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJaWYgKHJlZmVyZW5jZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VJdGVtUHJvdmlkZXIgPSBuZXcgUmVmZXJlbmNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlZmVyZW5jZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlJdGVtUHJvdmlkZXIgcHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAocHJvcGVydHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvcGVydHlJdGVtUHJvdmlkZXIgPSBuZXcgUHJvcGVydHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIgZ3JhcGhFZGdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEVkZ2VBZGFwdGVyKCkgewotCQlpZiAoZ3JhcGhFZGdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWdyYXBoRWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhFZGdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1JdGVtUHJvdmlkZXIgZGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCkgewotCQlpZiAoZGlhZ3JhbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaWFncmFtSXRlbVByb3ZpZGVyID0gbmV3IERpYWdyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoTm9kZUl0ZW1Qcm92aWRlciBncmFwaE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoTm9kZUFkYXB0ZXIoKSB7Ci0JCWlmIChncmFwaE5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3JhcGhOb2RlSXRlbVByb3ZpZGVyID0gbmV3IEdyYXBoTm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBncmFwaE5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJaWYgKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyID0gbmV3IFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJaWYgKHVtYVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiB1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRleHRFbGVtZW50SXRlbVByb3ZpZGVyIHRleHRFbGVtZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRleHRFbGVtZW50QWRhcHRlcigpIHsKLQkJaWYgKHRleHRFbGVtZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRleHRFbGVtZW50SXRlbVByb3ZpZGVyID0gbmV3IFRleHRFbGVtZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHRFbGVtZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZUl0ZW1Qcm92aWRlciBpbWFnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbWFnZUFkYXB0ZXIoKSB7Ci0JCWlmIChpbWFnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbWFnZUl0ZW1Qcm92aWRlciA9IG5ldyBJbWFnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9seWxpbmVJdGVtUHJvdmlkZXIgcG9seWxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9seWxpbmVBZGFwdGVyKCkgewotCQlpZiAocG9seWxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9seWxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgUG9seWxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9seWxpbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxsaXBzZUl0ZW1Qcm92aWRlciBlbGxpcHNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKSB7Ci0JCWlmIChlbGxpcHNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVsbGlwc2VJdGVtUHJvdmlkZXIgPSBuZXcgRWxsaXBzZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlbGxpcHNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eUl0ZW1Qcm92aWRlciBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eUl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbGVzdG9uZUl0ZW1Qcm92aWRlciBtaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCWlmIChtaWxlc3RvbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWlsZXN0b25lSXRlbVByb3ZpZGVyID0gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRpb25JdGVtUHJvdmlkZXIgaXRlcmF0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlpZiAoaXRlcmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWl0ZXJhdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBJdGVyYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaXRlcmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUl0ZW1Qcm92aWRlciBwaGFzZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCWlmIChwaGFzZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwaGFzZUl0ZW1Qcm92aWRlciA9IG5ldyBQaGFzZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwaGFzZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlpZiAodGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgPSBuZXcgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID0gbmV3IFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJ9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVySXRlbVByb3ZpZGVyIHdvcmtPcmRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIgPSBuZXcgV29ya09yZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtPcmRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlciBwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKSB7Ci0JCWlmIChwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyID0gbmV3IFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID0gbmV3IFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25jZXB0SXRlbVByb3ZpZGVyIGNvbmNlcHRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJaWYgKGNvbmNlcHRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uY2VwdEl0ZW1Qcm92aWRlciA9IG5ldyBDb25jZXB0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbmNlcHRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDaGVja2xpc3RJdGVtUHJvdmlkZXIgY2hlY2tsaXN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlpZiAoY2hlY2tsaXN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNoZWNrbGlzdEl0ZW1Qcm92aWRlciA9IG5ldyBDaGVja2xpc3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tsaXN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4YW1wbGVJdGVtUHJvdmlkZXIgZXhhbXBsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCkgewotCQlpZiAoZXhhbXBsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlleGFtcGxlSXRlbVByb3ZpZGVyID0gbmV3IEV4YW1wbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZXhhbXBsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUl0ZW1Qcm92aWRlciBndWlkZWxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCWlmIChndWlkZWxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3VpZGVsaW5lSXRlbVByb3ZpZGVyID0gbmV3IEd1aWRlbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBndWlkZWxpbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciA9IG5ldyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcG9ydEl0ZW1Qcm92aWRlciByZXBvcnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7Ci0JCWlmIChyZXBvcnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVwb3J0SXRlbVByb3ZpZGVyID0gbmV3IFJlcG9ydEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByZXBvcnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlSXRlbVByb3ZpZGVyIHRlbXBsYXRlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJaWYgKHRlbXBsYXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRlbXBsYXRlSXRlbVByb3ZpZGVyID0gbmV3IFRlbXBsYXRlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyIHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIgPSBuZXcgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckl0ZW1Qcm92aWRlciB0b29sTWVudG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCWlmICh0b29sTWVudG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRvb2xNZW50b3JJdGVtUHJvdmlkZXIgPSBuZXcgVG9vbE1lbnRvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0b29sTWVudG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgd2hpdGVwYXBlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCkgewotCQlpZiAod2hpdGVwYXBlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID0gbmV3IFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2hpdGVwYXBlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkgewotCQlpZiAodGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvQWRhcHRlcigpIHsKLQkJaWYgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyID0gbmV3IEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJdGVtUHJvdmlkZXIgcHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlpZiAocHJhY3RpY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJhY3RpY2VJdGVtUHJvdmlkZXIgPSBuZXcgUHJhY3RpY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciByZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKSB7Ci0JCWlmIChyZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIgPSBuZXcgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQlpZiAoZGlzY2lwbGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0SXRlbVByb3ZpZGVyIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZVNldEl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JdGVtUHJvdmlkZXIgZG9tYWluSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlciA9IG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZG9tYWluSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xJdGVtUHJvdmlkZXIgdG9vbEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2x9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlpZiAodG9vbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0b29sSXRlbVByb3ZpZGVyID0gbmV3IFRvb2xJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdG9vbEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlpZiAoZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXB9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9hZG1hcEl0ZW1Qcm92aWRlciByb2FkbWFwSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCWlmIChyb2FkbWFwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvYWRtYXBJdGVtUHJvdmlkZXIgPSBuZXcgUm9hZG1hcEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2FkbWFwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbkl0ZW1Qcm92aWRlciBzZWN0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZWN0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3Rpb25JdGVtUHJvdmlkZXIgPSBuZXcgU2VjdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZWN0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciBwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0ZhbWlseUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkKLQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykKLQkJCQkJfHwgKCgoQ2xhc3M8Pz4pIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBhY2thZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29uc3RyYWludEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29uc3RyYWludEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChraW5kSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlraW5kSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHNlY3Rpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXNlY3Rpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29uY2VwdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29uY2VwdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjaGVja2xpc3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNoZWNrbGlzdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChndWlkZWxpbmVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWd1aWRlbGluZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChleGFtcGxlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlleGFtcGxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhcnRpZmFjdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYXJ0aWZhY3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGZ1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJlcG9ydEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcmVwb3J0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRlbXBsYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0ZW1wbGF0ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0b29sTWVudG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0b29sTWVudG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChvdXRjb21lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlvdXRjb21lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN0ZXBJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXN0ZXBJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod2hpdGVwYXBlckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJd2hpdGVwYXBlckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0YXNrSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0YXNrSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvbGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvbGVTZXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkb21haW5JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlzY2lwbGluZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGlzY2lwbGluZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYWN0aXZpdHlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya09yZGVySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9hZG1hcEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9hZG1hcEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0b29sSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0b29sSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWlsZXN0b25lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQltaWxlc3RvbmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoaXRlcmF0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlpdGVyYXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocGhhc2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBoYXNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQltZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByYWN0aWNlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcmFjdGljZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlhZ3JhbUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGlhZ3JhbUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChncmFwaE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWdyYXBoTm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyZWZlcmVuY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJlZmVyZW5jZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9wZXJ0eUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvcGVydHlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocG9pbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBvaW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaWFncmFtTGlua0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZ3JhcGhFZGdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlncmFwaEVkZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGltZW5zaW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaW1lbnNpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRleHRFbGVtZW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGltYWdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlpbWFnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwb2x5bGluZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcG9seWxpbmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZWxsaXBzZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZWxsaXBzZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTdkNTc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9WYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9XaGl0ZXBhcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV2hpdGVwYXBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBjOGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9XaGl0ZXBhcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXJ9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb25jZXB0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXaGl0ZXBhcGVyLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1doaXRlcGFwZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV2hpdGVwYXBlcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XaGl0ZXBhcGVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9XaGl0ZXBhcGVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDY2OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNSZXBlYXRhYmxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJc09uZ29pbmdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzRXZlbnREcml2ZW5Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExpbmtUb1ByZWRlY2Vzc29yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBSZXBlYXRhYmxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNSZXBlYXRhYmxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgT25nb2luZyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzT25nb2luZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIEV2ZW50IERyaXZlbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzRXZlbnREcml2ZW5Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGluayBUbyBQcmVkZWNlc3NvciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpbmtUb1ByZWRlY2Vzc29yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzA5ZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya0RlZmluaXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya0RlZmluaXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrRGVmaW5pdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4MDA3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya09yZGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRMaW5rVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGluayBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua1R5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUiLCAiX1VJX1dvcmtPcmRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfX0xJTktfVFlQRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUiLCAiX1VJX1dvcmtPcmRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfX1BSRUQsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrT3JkZXIuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya09yZGVyIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtPcmRlcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrT3JkZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtPcmRlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya09yZGVyLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTVkNjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEltcGFjdE9mTm90SGF2aW5nUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZWFzb25zRm9yTm90TmVlZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHVycG9zZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wYWN0IE9mIE5vdCBIYXZpbmcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBhY3RPZk5vdEhhdmluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWFzb25zIEZvciBOb3QgTmVlZGluZyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYXNvbnNGb3JOb3ROZWVkaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOWI5OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRvckl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBY3Rpdml0eUVudHJ5U3RhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFjdGl2aXR5RXhpdFN0YXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXb3JrUHJvZHVjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW1wYWN0ZWRCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW1wYWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVsaXZlcmFibGVQYXJ0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpdml0eUVudHJ5U3RhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUVudHJ5U3RhdGVfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFjdGl2aXR5IEV4aXQgU3RhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpdml0eUV4aXRTdGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV29ya1Byb2R1Y3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBhY3RlZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEltcGFjdGVkQnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBhY3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wYWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVsaXZlcmFibGUgUGFydHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxpdmVyYWJsZVBhcnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9kZWxpdmVyYWJsZVBhcnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzUwY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXBvcnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZ1bGZpbGxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVwb3J0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcG9ydHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1JFUE9SVFMsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZW1wbGF0ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19URU1QTEFURVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUb29sIE1lbnRvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDQ2NTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0VHlwZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya1Byb2R1Y3RUeXBlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Y4ZWJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmUyN2ZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjlmNWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnVtYSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYWZkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTU4MDk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ1bWEiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlIiBuc1ByZWZpeD0iY29tLmlibS51bWEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iMDMiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF0ZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVXJpIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVW5saW1pdGVkTmF0dXJhbCIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0cmluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2VxdWVuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkludGVnZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc2lmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1R5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZXNwYWNlICMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcHJlc3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uc3RyYWludCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib2R5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vQ2xhc3NpZmllciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuJiN4RDsmI3hBO1RoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vQ29udGVudERlc2NyaXB0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iS2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3IiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gICYjeEQ7JiN4QTtBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEQ7JiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGUiIGVUeXBlPSIjLy9Fc3RpbWF0ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwb3J0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVwb3J0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBsYXRlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVtcGxhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4mI3hEOyYjeEE7QSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gJiN4RDsmI3hBO0EgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uICYjeEQ7JiN4QTtGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZEJ5IiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3RlcCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCi0gICAgICAgIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGUiIGVUeXBlPSIjLy9Fc3RpbWF0ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0ZXAiIGVTdXBlclR5cGVzPSIjLy9TZWN0aW9uICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4mI3hEOyYjeEE7QSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4RDsmI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIGVUeXBlPSIjLy9BcnRpZmFjdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJlbnRQYWNrYWdlIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01ldGhvZFBhY2thZ2UvY2hpbGRQYWNrYWdlcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXRob2RQYWNrYWdlL3BhcmVudFBhY2thZ2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50RWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmT3V0bGluZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNraWxscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzeW5vbnltcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50cyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkaXRpb25hbEluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ibGVtIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhY2tncm91bmQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ29hbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvaW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc2l0aW9uIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rIiBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtTGluayIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFuY2hvcmFnZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZW1hbnRpY01vZGVsIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzVmlzaWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZmVyZW5jZSIgZU9wcG9zaXRlPSIjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0eSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1MaW5rIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb3J0IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhDb25uZWN0b3IiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvYW5jaG9yYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWRnZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3JhcGhFZGdlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBlVHlwZT0iIy8vRGlhZ3JhbSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpbWVuc2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndpZHRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWZlcmVuY2UiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb3BlcnR5IiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXkiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoRWRnZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFuY2hvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9IjIiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvaW50IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1MaW5rIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtTGluayIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaE5vZGUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzaXplIiBlVHlwZT0iIy8vRGltZW5zaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0VsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGVhZkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXh0RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGV4dCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkltYWdlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIGVUeXBlPSIjLy9VcmkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWltZVR5cGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9seWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xvc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGxpcHNlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1giIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb3RhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydEFuZ2xlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuZEFuZ2xlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNlbnRlciIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gQWN0aXZpdHkgaXMgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLiYjeEQ7JiN4QTtBY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9hZG1hcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvYWRtYXAiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2FibGVBc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtPcmRlciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxhbm5pbmdEYXRhIiBlVHlwZT0iIy8vUGxhbm5pbmdEYXRhIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5IiBlT3Bwb3NpdGU9IiMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1pbGVzdG9uZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikl0ZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7SXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO1BoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZWFtUHJvZmlsZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4mI3hEOyYjeEE7V29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLiYjeEQ7JiN4QTtIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlYW1Sb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJUZWFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJUZWFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJvbGUiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1zQWRkaXRpb25hbGx5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3Npc3RzSW4iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3dvcmtlZE9uQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybXNBc093bmVyIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9yZXNwb25zaWJsZVJvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9TdGFydCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9GaW5pc2giIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtPcmRlciIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAmI3hEOyYjeEE7KE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pJiN4RDsmI3hBO1RoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtUeXBlIiBlVHlwZT0iIy8vV29ya09yZGVyVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmluaXNoVG9TdGFydCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4mI3hEOyYjeEE7UHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQbGFubmluZ0RhdGEiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLiYjeEQ7JiN4QTtQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuJiN4RDsmI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYW5rIiBlVHlwZT0iIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3IiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4mI3hEOyYjeEE7RGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVGFzayIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL3BlcmZvcm1zQWRkaXRpb25hbGx5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lzdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL2Fzc2lzdHNJbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2V4dGVybmFsSW5wdXRUbyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dFRvIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvT3B0aW9uYWxJbnB1dFRvIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9vdXRwdXRGcm9tIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBc093bmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkU3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4mI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0VG8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtlZE9uQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJPcHRpb25hbElucHV0VG8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0RnJvbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9yZXNwb25zaWJsZUZvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuJiN4RDsmI3hBO0EgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd3RvU3RhZmYiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjb3BlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXN0aW1hdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uTWV0cmljIiBlVHlwZT0iIy8vRXN0aW1hdGluZ01ldHJpYyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbmRlcmF0aW9ucyIKLSAgICAgICAgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFc3RpbWF0aW9uIE1ldHJpYyBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXBvcnQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2hpdGVwYXBlciIgZVN1cGVyVHlwZXM9IiMvL0NvbmNlcHQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXJtRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICZxdW90O01hbmFnZSBSaXNrcyZxdW90OywgJnF1b3Q7Q29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5JnF1b3Q7LCAmcXVvdDtBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50JnF1b3Q7LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlByYWN0aWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJhY3RpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nJiN4RDsmI3hBO2hvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4mI3hEOyYjeEE7QSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuJiN4RDsmI3hBO0RvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWlucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzY2lwbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXRHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlU2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZVNldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkNhdGVnb3JpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hEOyYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEQ7JiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hEOyYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLiYjeEQ7JiN4QTtBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2FkbWFwIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLiYjeEQ7JiN4QTtBbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSAjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4mI3hEOyYjeEE7VU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEQ7JiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbnRyaWJ1dGlvbiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGV4dGVybmFsbHkgZGVmaW5lcyBhZGRpdGlvbnMgYW5kIGNoYW5nZXMgdG8gYW4gZXhpc3RpbmcgUHJvY2VzcyB3aXRob3V0IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgZXhpc3RpbmcgUHJvY2Vzcy4gIEl0IGFjaGlldmVzIHRoaXMgYnkgZGVzY3JpYmluZyB0aGVzZSBhZGRpdGlvbnMgYW5kIGNoYW5nZXMgaW4gYSBzZXBhcmF0ZSBQcm9jZXNzIHN0cnVjdHVyZS4gIFRoaXMgc3RydWN0dXJlJ3MgZWxlbWVudHMgcmVsYXRlIHRvIHRoZSBvdGhlciBQcm9jZXNzJyBlbGVtZW50cyB1c2luZyBDb250cmlidXRlcyBhbmQgUmVwbGFjZSBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbnMuICBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgYXJlIG5vcm1hbGx5IHBhY2thZ2VkIHdpdGggTWV0aG9kIFBsdWdpbnMgdGhhdCBleHRlbmQgZXhpc3RpbmcgTWV0aG9kIFBsdWdpbiB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuJiN4RDsmI3hBO0EgUHJvY2VzcyBDb250cmlidXRpb24gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBhcHBsaWVzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIENvbnRyaWJ1dGVzIGFuZCBSZXBsYWNlcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBvbiBQcm9jZXNzZXMuICBBIFByb2Nlc3MgQ29udHJpYnV0aW9uIGlzIGEga2luZCBvZiAncHJvY2VzcyBwbHVnLWluJyB0aGF0ICdwbHVncycgYWRkaXRpb25hbCBicmVha2Rvd24gc3RydWN0dXJlcyBpbnRvIGFuIGV4aXRpbmcgcHJvY2VzcyBhbmQgdGhlcmVmb3JlIHVwZGF0ZXMgaXQgYS1wb3N0ZXJpb3JpIHdpdGggbmV3IG9yIGNoYW5nZWQgY2FwYWJpbGl0aWVzLiAgVHlwaWNhbCBhcHBsaWNhdGlvbnMgb2YgUHJvY2VzcyBDb250cmlidXRpb25zIGFyZSBNZXRob2QgUGx1Z2lucyB0aGF0IGFkZCBjb250ZW50IGZyb20gc3BlY2lmaWMgYXJlYXMgdG8gYW4gZXhpc3RpbmcgZG9tYWluLiAgSW4gYWRkaXRpb24gdG8ganVzdCBjb250cmlidXRpbmcgbmV3IG1ldGhvZCBjb250ZW50IHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzLCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgY2FuIGFsc28gZGVmaW5lIHdoZXJlIGluIHRoZSBQcm9jZXNzZXMgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCB3aXRoIHRoaXMgbWV0aG9kIGNvbnRlbnQgdGhvc2UgbmV3IGFkZGl0aW9ucyBzaG91bGQgYmUgYXBwbGllZC4gIE1vcmVvdmVyLCBpdCBhbGxvd3MgZGVmaW5pbmcgd2hvbGUgbmV3IG9yIGNoYW5nZWQgQWN0aXZpdGllcyB3aXRoaW4gdGhlc2UgcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlUHJvY2VzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kVW5pdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc1ZpZXdzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdFZpZXciIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NGYW1pbHkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZWxpdmVyeVByb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTY5MDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBjb3B5cmlnaHRUZXh0PSJJQk0gUmF0aW9uYWwgU29mdHdhcmUiCi0gICAgbW9kZWxEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS9zcmMiIGVkaXREaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvY29tLmlibS51bWEuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLnVtYSIgdGVtcGxhdGVEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5lY29yZS90ZW1wbGF0ZXMiIHJ1bnRpbWVKYXI9InRydWUiCi0gICAgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJVbWEiIGVkaXRQbHVnaW5DbGFzcz0iY29tLmlibS51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iY29tLmlibS51bWEucHJlc2VudGF0aW9uLlVtYUVkaXRvclBsdWdpbiIgbm9uTkxTTWFya2Vycz0idHJ1ZSIKLSAgICByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdCIgcm9vdEV4dGVuZHNDbGFzcz0iY29tLmlibS51bWFmLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QiCi0gICAgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIj4KLSAgPGZvcmVpZ25Nb2RlbD5DOlxIb21lXHBoVE5HXFROR19kb2NzXE9PQURcQ29udGVudEFyY2hpdGVjdHVyZVxNb2RlbHNcVU1BMDJcVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPHN0YXRpY1BhY2thZ2VzPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvU0RPPC9zdGF0aWNQYWNrYWdlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9DT01NT05KX1NETz1vcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0VDT1JFX1NETz1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iVW1hIiBiYXNlUGFja2FnZT0iY29tLmlibSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0idW1hLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb0ZpbmlzaCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9GaW5pc2giLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9uYSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvY29udHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL3JlcGxhY2VzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0RhdGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VyaSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVW5saW1pdGVkTmF0dXJhbCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU3RyaW5nIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NlcXVlbmNlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9JbnRlZ2VyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2xhc3NpZmllciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1R5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZXNwYWNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9ndWlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9icmllZkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3duZWRSdWxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvc3VwcHJlc3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3JkZXJpbmdHdWlkZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db25zdHJhaW50L2JvZHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jb25jZXB0c0FuZFBhcGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9hc3NldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3NoYXBlaWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9ub2RlaWNvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9tYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL3NlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3N1YlNlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvZXN0aW1hdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svZXN0aW1hdGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2dsb2JhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcmV1c2VkUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9wYXJlbnRQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvY2hpbGRQYWNrYWdlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlL2NvbnRlbnRFbGVtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL2JyaWVmT3V0bGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9sZXZlbHNPZkFkb3B0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC94Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvcG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvYW5jaG9yYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9pc1Zpc2libGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3Byb3BlcnR5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1MaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3ZpZXdwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpbWVuc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL3dpZHRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL2hlaWdodCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS9rZXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS92aWV3cG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoTm9kZS9zaXplIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC90eXBlSW5mbyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTGVhZkVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXh0RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQvdGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JbWFnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vSW1hZ2UvdXJpIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vSW1hZ2UvbWltZVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhpY1ByaW1pdGl2ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvbHlsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS9jbG9zZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUG9seWxpbmUvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsbGlwc2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvcm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3N0YXJ0QW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2VuZEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VsbGlwc2UvY2VudGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JvYWRtYXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jb25jZXB0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JldXNhYmxlQXNzZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc1JlcGVhdGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc09uZ29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc0V2ZW50RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvbGlua1RvUHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQWZ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01pbGVzdG9uZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3RlYW1Sb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL1JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9wZXJmb3Jtc0FkZGl0aW9uYWxseSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL2Fzc2lzdHNJbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9wZXJmb3Jtc0FzT3duZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9wcmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL2ZpbmlzaERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvcmFuayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3NlbGVjdGVkU3RlcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RXhpdFN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2V4dGVybmFsSW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3dvcmtlZE9uQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvT3B0aW9uYWxJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL291dHB1dEZyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9yZXNwb25zaWJsZVJvbGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3VzYWdlTm90ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXN0aW1hdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Fc3RpbWF0ZS9lc3RpbWF0aW9uTWV0cmljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VzdGltYXRlL2VzdGltYXRpb25Db25kZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXN0aW1hdGluZ01ldHJpYyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlcG9ydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlbXBsYXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbE1lbnRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2Uvc3ViUHJhY3RpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9hY3Rpdml0eVJlZmVyZW5jZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3JlZmVyZW5jZVdvcmtmbG93cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0L3JvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RvbWFpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3dvcmtQcm9kdWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vc3ViZG9tYWlucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZS93b3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmcvZGlzY2lwbGluZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVG9vbC90b29sTWVudG9ycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9yb2xlU2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvY2F0ZWdvcml6ZWRFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L3N1YkNhdGVnb3JpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZWR1Y2F0aW9uTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2NvbW11bmljYXRpb25zTWF0ZXJpYWxzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvaW5jbHVkZXNQYXR0ZXJucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvZGVmYXVsdENvbnRleHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL3ZhbGlkQ29udGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlZE9uUHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2ludGVyZmFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9wcm9jZXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvcHJvY2Vzc0VsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL2RpYWdyYW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL2Jhc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb250cmlidXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb250cmlidXRpb24vYmFzZVByb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9wcm9jZXNzVmlld3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2RlZmF1bHRWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseS9kZWxpdmVyeVByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9tZXRob2RQbHVnaW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvcHJvcGVydGllcy50eHQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3Byb3BlcnRpZXMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmIzZjljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvcHJvcGVydGllcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU5vbi1OTFMgTWFya2VyczoJdHJ1ZQotQ29udGFpbm1lbnQgUHJveGllczoJdHJ1ZQotU3VwcHJlc3MgRU1GIE1ldGFkYXRhOglmYWxzZQotUm9vdCBFeHRlbmRzIENsYXNzOglvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QKLVJvb3QgRXh0ZW5kcyBJbnRlcmZhY2U6CW9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0Ci1Db2RlIEZvcm1hdHRpbmc6CXRydWUKLUR5bmFtaWMgVGVtcGxhdGVzOgl0cnVlCi1UZW1wbGF0ZSBEaXJlY3Rvcnk6CS9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNTc3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLnVtYSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIwMyIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXRlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVcmkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbmxpbWl0ZWROYXR1cmFsIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RyaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNldCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXF1ZW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW50ZWdlciIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZsb2F0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2xhc3NpZmllciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVzcGFjZSAjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im93bmVkUnVsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9keSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuJiN4RDsmI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL0NsYXNzaWZpZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEQ7JiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub2RlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAmI3hEOyYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0IiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3QiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4mI3hEOyYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2siIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uJiN4RDsmI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEQ7JiN4QTtBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAmI3hEOyYjeEE7Rm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRCeSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N0ZXAiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEQ7JiN4QTtXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGVwIiBlU3VwZXJUeXBlcz0iIy8vU2VjdGlvbiAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuJiN4RDsmI3hBO0EgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEQ7JiN4QTtBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiBlVHlwZT0iIy8vQXJ0aWZhY3QiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0Y29tZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdsb2JhbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50RWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmT3V0bGluZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNraWxscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzeW5vbnltcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50cyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkaXRpb25hbEluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ibGVtIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhY2tncm91bmQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ29hbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvaW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc2l0aW9uIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rIiBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtTGluayIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFuY2hvcmFnZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZW1hbnRpY01vZGVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzVmlzaWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZmVyZW5jZSIgZU9wcG9zaXRlPSIjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0eSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1MaW5rIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb3J0IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhDb25uZWN0b3IiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvYW5jaG9yYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWRnZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3JhcGhFZGdlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBlVHlwZT0iIy8vRGlhZ3JhbSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpbWVuc2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndpZHRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWZlcmVuY2UiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb3BlcnR5IiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXkiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoRWRnZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFuY2hvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9IjIiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvaW50IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1MaW5rIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtTGluayIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVzcGFjZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaE5vZGUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzaXplIiBlVHlwZT0iIy8vRGltZW5zaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudCIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0VsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGVhZkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXh0RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGV4dCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkltYWdlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIGVUeXBlPSIjLy9VcmkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWltZVR5cGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9seWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xvc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGxpcHNlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1giIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb3RhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydEFuZ2xlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuZEFuZ2xlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNlbnRlciIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gQWN0aXZpdHkgaXMgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLiYjeEQ7JiN4QTtBY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9hZG1hcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvYWRtYXAiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2FibGVBc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFbmFjdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUmVwZWF0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT25nb2luZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya09yZGVyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQbGFubmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPcHRpb25hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwbGFubmluZ0RhdGEiIGVUeXBlPSIjLy9QbGFubmluZ0RhdGEiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgZVR5cGU9IiMvL0FjdGl2aXR5IgotICAgICAgICBlT3Bwb3NpdGU9IiMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1pbGVzdG9uZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikl0ZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7SXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO1BoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZWFtUHJvZmlsZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4mI3hEOyYjeEE7V29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLiYjeEQ7JiN4QTtIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlYW1Sb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJUZWFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJUZWFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJvbGUiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9TdGFydCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9GaW5pc2giIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtPcmRlciIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAmI3hEOyYjeEE7KE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pJiN4RDsmI3hBO1RoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya09yZGVyVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmluaXNoVG9TdGFydCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4mI3hEOyYjeEE7UHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQbGFubmluZ0RhdGEiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLiYjeEQ7JiN4QTtQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuJiN4RDsmI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYW5rIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3IiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4mI3hEOyYjeEE7RGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAmI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiYjeEQ7JiN4QTtBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRhc2siIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3Npc3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvc2l0ZVJvbGUiIGVTdXBlclR5cGVzPSIjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb21wb3NpdGUgUm9sZSBpcyBhIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hEOyYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93dG9TdGFmZiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2FsZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJpc2tMZXZlbCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZGVsaXZlcnkgcGF0dGVybnMgYW5kIG1vZGVscy4gSXQgaXMgdXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NvcGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZU5vdGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbmNlcHQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2hlY2tsaXN0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGFtcGxlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRlbGluZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXBvcnQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2hpdGVwYXBlciIgZVN1cGVyVHlwZXM9IiMvL0NvbmNlcHQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXJtRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICZxdW90O01hbmFnZSBSaXNrcyZxdW90OywgJnF1b3Q7Q29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5JnF1b3Q7LCAmcXVvdDtBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50JnF1b3Q7LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlByYWN0aWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJhY3RpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmV1c2FibGVBc3NldCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hEOyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGUiIGVTdXBlclR5cGVzPSIjLy9WZXJ0ZXgiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrUHJvZHVjdCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUmVnaW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWdpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9TdGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJtYWNoaW5lIiBlVHlwZT0iIy8vU3RhdGVNYWNoaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZlcnRleCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL1JlZ2lvbiIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9WZXJ0ZXgiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0Z29pbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGVPcHBvc2l0ZT0iIy8vVHJhbnNpdGlvbi9zb3VyY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jb21pbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGVPcHBvc2l0ZT0iIy8vVHJhbnNpdGlvbi90YXJnZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVnaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVmVydGV4IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9WZXJ0ZXgiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVHJhbnNpdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVHJhbnNpdGlvbi9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iU3RhdGUiIGVUeXBlPSIjLy9TdGF0ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1N0YXRlL1JlZ2lvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJTdGF0ZU1hY2hpbmUiIGVUeXBlPSIjLy9TdGF0ZU1hY2hpbmUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TdGF0ZU1hY2hpbmUvUmVnaW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlTWFjaGluZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUmVnaW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWdpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9TdGF0ZU1hY2hpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHJhbnNpdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrRGVmaW5pdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9SZWdpb24iIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vVHJhbnNpdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9WZXJ0ZXgiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L291dGdvaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZlcnRleCIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvaW5jb21pbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHNldWRvU3RhdGUiIGVTdXBlclR5cGVzPSIjLy9WZXJ0ZXgiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlBzZXVkb1N0YXRlS2luZCI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJpbml0aWFsIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJqb2luIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZm9yayIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Imp1bmN0aW9uIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY2hvaWNlIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZW50cnlQb2ludCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4aXRQb2ludCIgdmFsdWU9IjYiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InRlcm1pbmF0ZSIgdmFsdWU9IjciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiYjeEQ7JiN4QTtBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2tzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRpc2NpcGxpbmUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4mI3hEOyYjeEE7RG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkb21haW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Eb21haW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNjaXBsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVTZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlU2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkN1c3RvbUNhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLiYjeEQ7JiN4QTtBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LiYjeEQ7JiN4QTtDb3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY2x1ZGVzUGF0dGVybnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWxpZENvbnRleHQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuJiN4RDsmI3hBO0EgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOiYjeEQ7JiN4QTstIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLiYjeEQ7JiN4QTstIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLiYjeEQ7JiN4QTstIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4RDsmI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4RDsmI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlICMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLiYjeEQ7JiN4QTtVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2VzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3MiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuJiN4RDsmI3hBO0Ega2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIgdmFsdWU9IjUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kVW5pdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc1ZpZXdzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdFZpZXciIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NGYW1pbHkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZWxpdmVyeVByb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTcwZTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnVtYSIgdGVtcGxhdGVEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcyIKLSAgICBydW50aW1lSmFyPSJ0cnVlIiBkeW5hbWljVGVtcGxhdGVzPSJ0cnVlIiBtb2RlbE5hbWU9IlVtYSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEucHJlc2VudGF0aW9uLlVtYUVkaXRvclBsdWdpbiIgbm9uTkxTTWFya2Vycz0idHJ1ZSIKLSAgICByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QiIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIKLSAgICByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IiBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiIGNvZGVGb3JtYXR0aW5nPSJ0cnVlIgotICAgIGNvbnRhaW5tZW50UHJveGllcz0idHJ1ZSI+Ci0gIDxmb3JlaWduTW9kZWw+QzpcSG9tZVxwaFROR1xUTkdfZG9jc1xPT0FEXENvbnRlbnRBcmNoaXRlY3R1cmVcTW9kZWxzXFVNQTAzXFVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0idW1hLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb0ZpbmlzaCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9GaW5pc2giLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9pbml0aWFsIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9qb2luIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9mb3JrIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9qdW5jdGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvY2hvaWNlIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9lbnRyeVBvaW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9leGl0UG9pbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL3Rlcm1pbmF0ZSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0RhdGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VyaSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVW5saW1pdGVkTmF0dXJhbCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU3RyaW5nIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NlcXVlbmNlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9JbnRlZ2VyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9GbG9hdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NsYXNzaWZpZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVzcGFjZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29uc3RyYWludC9ib2R5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdHNBbmRQYXBlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvYXNzZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9rZXlDb25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvcmVwb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3RlbXBsYXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svcGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3N0ZXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3Bvc3Rjb25kaXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RlcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9PdXRjb21lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9nbG9iYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3JldXNlZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcGFyZW50UGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9yZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL2V4dGVybmFsRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL3BhY2thZ2luZ0d1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3NraWxscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9hc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9zeW5vbnltcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uL2F0dGFjaG1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2JhY2tncm91bmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2dvYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vbGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2ludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3Bvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvaXNWaXNpYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9wcm9wZXJ0eSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay92aWV3cG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaW1lbnNpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi93aWR0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi9oZWlnaHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkva2V5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbS96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vdmlld3BvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaE5vZGUvc2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQvdHlwZUluZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0xlYWZFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1RleHRFbGVtZW50L3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSW1hZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL21pbWVUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoaWNQcmltaXRpdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2x5bGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9seWxpbmUvY2xvc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1BvbHlsaW5lL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGxpcHNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JvdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9zdGFydEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9lbmRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2NlbnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yb2FkbWFwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY29uY2VwdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yZXVzYWJsZUFzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2lzRW5hY3RhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc1JlcGVhdGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc09uZ29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc0V2ZW50RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvbGlua1RvUHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQWZ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01pbGVzdG9uZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3RlYW1Sb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL1JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvcHJlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RXhpdFN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9kZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9UYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc2VsZWN0ZWRTdGVwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi91c2FnZUd1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9ob3d0b1N0YWZmIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi9yZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uY2VwdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0V4YW1wbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkZWxpbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2NvbnRlbnRSZWZlcmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvUmVnaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvc3VibWFjaGluZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WZXJ0ZXgiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L291dGdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2luY29taW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZ2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9WZXJ0ZXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1RyYW5zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1N0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZU1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGVNYWNoaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGVNYWNoaW5lL1JlZ2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UcmFuc2l0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL1dvcmtEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL3RhcmdldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9zdWJkaXNjaXBsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldC9yb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2wiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rvb2wvdG9vbE1lbnRvcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2NhdGVnb3JpemVkRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yaWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZWRPblByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2FkbWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZUlPIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3VzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9tZXRob2RQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9iYXNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHRTdGF0ZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQbHVnaW5TZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBhY2thZ2VTZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3Byb2Nlc3NWaWV3cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vZGVmYXVsdFZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2Jhc2VDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5L2RlbGl2ZXJ5UHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC9VbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLmVteCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5lbXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NmU0ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC9VbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDI3MjE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0teHRvb2xzMl91bml2ZXJzYWxfdHlwZV9tYW5hZ2VyLS0+Ci08P2NvbS5pYm0ueHRvb2xzLmVtZi5jb3JlLnNpZ25hdHVyZSA8c2lnbmF0dXJlIGlkPSJjb20uaWJtLnh0b29scy5tbWkudWkuc2lnbmF0dXJlcy5kaWFncmFtIiB2ZXJzaW9uPSI3LjAuMCI+PGZlYXR1cmUgZGVzY3JpcHRpb249IiIgbmFtZT0iUmF0aW9uYWwgTW9kZWxpbmcgUGxhdGZvcm0gKGNvbS5pYm0ueHRvb2xzLnJtcCkiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+Ci08P2NvbS5pYm0ueHRvb2xzLmVtZi5jb3JlLnNpZ25hdHVyZSA8c2lnbmF0dXJlIGlkPSJjb20uaWJtLnh0b29scy51bWwubXNsLm1vZGVsIiB2ZXJzaW9uPSI3LjAuMCI+PGZlYXR1cmUgZGVzY3JpcHRpb249IiIgbmFtZT0iY29tLmlibS54dG9vbHMucnVtbC5mZWF0dXJlIiB1cmw9IiIgdmVyc2lvbj0iNy4wLjAiLz48L3NpZ25hdHVyZT4/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpEZWZhdWx0PSJodHRwOi8vL3NjaGVtYXMvRGVmYXVsdC8xIiB4bWxuczpFY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyL3NjaGVtYXMvRWNvcmUvMyIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4wL25vdGF0aW9uIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiIHhtbG5zOnVtbG5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4yL1VtbG5vdGF0aW9uIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEgcGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyL3NjaGVtYXMvRWNvcmUvMyBwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI192eS1IVVlpbkVkcXR2Ym5mQjJMXzV3Ij4KLSAgPHVtbDpNb2RlbCB4bWk6aWQ9IjNBREM3Qjc0MDIyRCIgbmFtZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9CVE5xQU94aEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiLz4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX1A0b3NZT29lRWR1VkE3dnQ1cWJJSlEiIGFubm90YXRlZEVsZW1lbnQ9IjNBREM3Qjc0MDIyRCI+Ci0gICAgICA8Ym9keT5PcGVuIElzc3VlIGFuZCBUb0RvczomI3hEOwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7Ci0tIElzc3VlOiBVTUwgMi4wIG5hbWluZyBjb252ZW50aW9ucyBkb2VzIG5vdCBhbGxvdyBwbHVyYWwgcm9sZSBuYW1lcyYjeEQ7Ci0tIHN5bmMgdXAgbmFtZXMgdG8gVUkgbmFtZXM7IGUuZy4gUGFja2FnaW5nIEluc3RydWN0aW9ucyYjeEQ7Ci0tIG1ha2UgQWN0aXZpdHkgdG8gQnJlYWtkb3duIEVsZW1lbnQgYWdncmVnYXRpb24gYSBjb21wb3NpdGlvbiYjeEQ7Ci0tIEFkZCBJbmRleCwgTGl0ZXJhdHVyZSBSZWZlcmVuY2VzIHRvIG1ldGEtbW9kZWwmI3hEOwotJiN4RDsKLVZlcnNpb24gMi4wIGNoYW5nZXM6JiN4RDsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsKLS0gbm90IHN0YXJ0ZWQsIHlldCYjeEQ7Ci0mI3hEOwotVmVyc2lvbiAxLjAuNCBjaGFuZ2VzOiYjeEQ7Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsKLS0gTW92ZWQgZXh0ZXJuYWxJZCB1cCBmcm9tIFdvcmsgUHJvZHVjdCBhbmQgUHJvY2VzcyBkZXNjcmlwdGlvbiAmI3hEOwotICB0byB0aGUgZ2VuZXJhbCBjb250ZW50IGRlc2NyaXB0aW9uJiN4RDsKLS0gQWRkZWQgYXNzb2NpYXRpb24gYmV0d2VlbiBjb250ZW50IGVsZW1lbnQgYW5kIHRlcm0gZGVmaW5pdGlvbiB0byBhbGxvdyBhc3NpZ25pbmcmI3hEOwotICBnbG9zc2F5IHRlcm1zIGFzIGd1aWRhbmNlJiN4RDsKLS0gQWRkZWQgdHdvIG5ldyBhdHRyaWJ1dGVzIGZvciBBcnRpZmFjdCBEZXNjcmlwdGlvbjogJiN4RDsKLSAgcmVwcmVzZW50YXRpb24gYW5kIG5vdGF0aW9uJiN4RDsKLS0gQWRkZWQgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQ29uZmlndXJhdGlvbiBhbmQgQ2F0ZWdvcmllcyB0byAmI3hEOwotICBtb2RlbCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIHdpdGggY2F0ZWdvcmllcyBhbmQgbmVnYXRpdmUgc2V0cyYjeEQ7Ci0tIE1hZGUgRG9tYWluIHRvIFdvcmsgUHJvZHVjdCBhc3NvY2lhdGlvbiBtYW55LXRvLW1hbnkmI3hEOwotLSBNYWRlIE1ldGhvZCBQYWNrYWdlIG5lc3RpbmcgYXNzb2NpYXRpb24gdW5pZGlyZWN0aW9uYWwmI3hEOwotLSBBZGRlZCBNZXRob2RFbGVtZW50UHJvcGVydHkgZm9yIGRlZmluaW5nIGFwcGxpY2F0aW9uIHNwZWNpZmljIGF0dHJpYnV0ZXMgJiN4RDsKLSAgc3VjaCBhcyBwdWJsaWNhdGlvbiBmbGFncyBhbmQgZmxhZ2dpbmcgdXNlciBwbHVnLWlucyYjeEQ7Ci0tIENoYW5nZWQgMS4uKiBtdWx0aXBsaWNpdGllcyBmb3Igc3RhbmRhcmQgY2F0ZWdvcmllcyB0byAqJiN4RDsKLSYjeEQ7Ci1WZXJzaW9uIDEuMC4zIGNoYW5nZXM6JiN4RDsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mI3hEOwotMDcvMjYvMDYmI3hEOwotLSBDb3JyZWN0ZWQgZGVmYXVsdCB2YWx1ZSBvZiBNZXRob2RQbHVnaW46OlVzZXJDaGFuZ2VhYmxlIHRvIHRydWUmI3hEOwotMDcvMDYvMDYmI3hEOwotLSBSZW1vdmVkIEVzdGltYXRlICAgYW5kIEVzdGltYXRpb24gTWV0cmljIEd1aWRhbmNlIGVsZW1lbnRzOyAmI3hEOwotICBvbmx5IGtlcHQgRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uJiN4RDsKLTA2LzIwLzA2JiN4RDsKLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgZnJvbSBkaXNjaXBsaW5lIHRvIGFjdGl2aXR5IHRvIG1hbnkgdG8gbWFueSYjeEQ7Ci0wNi8xNS8wNiYjeEQ7Ci0tIENoYW5nZWQgbXVsdGlwbGljaXR5IG9mIHJvbGUgZGVzY3JpcHRvciB0byB3b3JrIHByb2R1Y3RzIGRlc2NyaXB0b3IgdG8gJiN4RDsKLSAgbWFueSB0byBtYW55JiN4RDsKLTA2LzEzLzA2JiN4RDsKLS0gQWRkZWQgZGlyZWN0aW9ucyB0byBkZXNjcmlwdG9yIGFzc29jaWF0aW9ucyB0byBhdm9pZCB0aGF0IGRlc2NyaXB0b3JzJiN4RDsKLSAgYWRkZWQgdG8gYW4gYWN0aXZpdHkgdmlhIGxvY2FsIGNvbnRyaWJ1dGlvbiBtb2RpZnkgaW5oZXJpdGVkIGRlc2NyaXB0b3JzJiN4RDsKLTA1LzAxLzIwMDYmI3hEOwotLSBNb3ZlZCBVTUwyIERpYWdyYW0gSW50ZXJjaGFuZ2UgdG8gdG9wLWxldmVsIHBhY2thZ2UmI3hEOwotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBvZiBicmVha2Rvd24gZWxlbWVudHMgdG8gYWN0aXZpdGllcyB0byAxJiN4RDsKLS0gTWFkZSBNZXRob2QgQ29uZmlndXJhdGlvbiBhIE1ldGhvZCBVbml0JiN4RDsKLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgZm9yIFRhc2sgdG8gRGlzY2lwbGluZTogYSBUYXNrIGNhbiBub3cgYmUgY2F0ZWdvcml6ZWQmI3hEOwotICBieSBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgdG8gYWxsb3cgbW9kZWxpbmcgcmVwbGFjaW5nIGRpc2NpcGxpbmVzJiN4RDsKLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgZm9yIFJvbGUgdG8gV1A6IGEgV1AgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSAmI3hEOwotICByZXNwb25zaWJsZSBSb2xlIHRvIGFsbG93IG1vZGVsaW5nIHJlcGxhY2luZyByb2xlcyYjeEQ7Ci0tIE5lc3Rpbmcgb2YgZGlzY2lwbGluZXMmI3hEOwotLSBSZW1vdmVkICZxdW90O3dvcmtlZE9uQnkmcXVvdDsgZGVycml2ZWQgcHJvcGVydHkgZm9yIFJvbGVEZXNjcmlwdG9yIHRvIFdQOyYjeEQ7Ci0gIG1vZGlmaWVzIHByb3BlcnR5IGlzIHN1ZmZpY2llbnQmI3hEOwotLSBhZGRlZCB0d28gbW9yZSB2YXJpYWJpbGl0eSB0eXBlcyB1c2VkIGJ5IGFjdGl2aXRpZXM6IGxvY2FsQ29udHJpYnV0aW9uJiN4RDsKLSAgYW5kIGxvY2FsUmVwbGFjZW1lbnQ7IHRoaXMgY2hhbmdlIGlzIG9ubHkgdGVtcG9yYXJpbHkgdG8gbWluaW1pemUgbWlncmF0aW9ucyYjeEQ7Ci0gIGlzc3VlczogaW4gdGhlIGZ1dHVyZSB0aGVzZSBuZWVkIHRvIGJlIG1vZGVsZWQgYXMgaW4gU1BFTTIgYXMgYSBzZXBlcmF0ZSAmI3hEOwotICBBY3Rpdml0eVVzZSBjbGFzcyBhbmQgQWN0aXZpdHlVc2VUeXBlIGVudW1lcmF0aW9uJiN4RDsKLS0gQ3JlYXRlZCBBY3Rpdml0eSBzcGVjaWFsaXphdGlvbiB0aGF0IGFkZHMgaXNFbmFjdGFibGU9ZmFsc2UgYXR0cmlidXRlIGluJiN4RDsKLSAgdGhlIHBhY2thZ2UgUHJvY2VzcyAtLT4gV29ya2Zsb3cgcGFja2FnZSYjeEQ7Ci0tIEFkZGVkIGRpcmVjdCBhc3NvY2lhdGlvbnMgZnJvbSBXUCBhbmQgVGFzayB0byBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMmI3hEOwotICB1bnRpbCBFc3RpbWF0ZSBpcyB1c2VkOyBhbGxvd3MgbGlua2luZyBvZiBjb25zaWRlcmF0b25zIHRvIHRoZXNlIGVsZW1lbnRzJiN4RDsKLS0gUmVtb3ZlZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhcyBpdCBpcyByZWR1bmRhbnQgd2l0aCBjcmVhdGluZyBleHRlbmRzICYjeEQ7Ci0gIGJldHdlZW4gUHJvY2Vzc2VzIGRpcmVjdGx5PC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX0dpM2R4ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNfMCIvPgotICAgIDwvcGFja2FnZUltcG9ydD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MUY2NkIwMTU1IiBuYW1lPSJVTUwyRGlhZ3JhbUludGVyY2hhbmdlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3oyZ0h1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDE1MUY3MUUwM0U3Ij4KLSAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUxRjcxRTAzRTciIHR5cGU9IkNsYXNzIiBuYW1lPSJEaWFncmFtcyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEEzNzAxMUIiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5WWEZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYSC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5WWEVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOVlhFdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3Nzk2IiB5PSI5ODM4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWElPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITlZYSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWExPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYTC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5WWEllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOVlhJdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNjY1IiB5PSIxMjg2OSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhNT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkwRTAwQjAiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5WWE5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjYyMzEiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWE51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhPZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWE91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYUC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5WWE1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOVlhNdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMzM1IiB5PSIzMTMyIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTgyMDNCQSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITlZYUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU1NiIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITlZYUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5WWFF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjc0NyIgeT0iNDY0OCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEExMjAyNDUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5WWFZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIyMDEiIGhlaWdodD0iMTA2NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5WWFVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOVlhVdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjY2IiB5PSIxMDI4NyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5WWGgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzNjgiIGhlaWdodD0iMTE2OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklGLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJR2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5WWGhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOVlhoZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMTQxIiB5PSIyOTcxIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUZEMDE3QyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITmZJWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkxMiIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSWFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSWEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSWJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkliLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITmZJWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM4NSIgeT0iMTAyMzYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOZklsLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzYwIiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkltZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkluZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJbnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkluLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJb09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklvZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSW91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOZklsT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJbGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzE0OCIgeT0iNjk0MiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NMLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEEyNjAyRjgiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5vU00tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU05lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU09lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU08tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1BlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TUHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5vU01PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NNZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMjMzIiB5PSI2NjgwIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1l1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITm9TWnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzg0MyIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU2EtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU2JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU2ItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NjZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITm9TWS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU1pPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExMzMiIHk9IjE1NDI2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTM0MDE1NiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITm9TbWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzA4MSIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU25lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU251ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU29PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU291ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NwT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITm9TbHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU2wtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc3NjMiIHk9IjEyNDIwIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxRDY0MDM0MSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITnlETi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTIxNSIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlET2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURRdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITnlETk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RE5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzUzOSIgeT0iMTc4NjQiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEVE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOeURVT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODQ0IiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEVk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURXLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITnlEVGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURUdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NjI3IiB5PSIyMDgwMiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURYT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ3MTAwMEIiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE55RFlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iMTA2NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURaLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEYS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE55RFhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURYdWZYRWR1cUhvT0piVVJaUnciIHg9IjE2Nzg5IiB5PSIxODExMCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURtT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQyQTAxRkEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE55RG5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzODciIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RG51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RG91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEcC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE55RG1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURtdWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NDQxIiB5PSIxMDcwMSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQzNjAyM0QiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE55RHJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMzYiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TThPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON004ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TTh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdNOC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE55RHFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURxdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyNTA3IiB5PSIxMzk0OCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON005T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQzRjAwMTkiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON005LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE43TS1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzODYiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON00tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON01fT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON01fZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TV91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON01fLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05BZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOQS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE43TTllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON005dWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MzgzIiB5PSIxMzg0MyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05CT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQ0NjAwMzciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05CLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE43TkNPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5OTciIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05DLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05ET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05EZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05ELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05FZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdORS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE43TkJlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05CdWZYRWR1cUhvT0piVVJaUnciIHg9IjI4ODc5IiB5PSIxMzg1MSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05GT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUwOTAwMzgiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE43TkdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0NTQiIGhlaWdodD0iMzMwMiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tkd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05HLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05IT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05IZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tkh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05ILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05JZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tkl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOSS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE43TkZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05GdWZYRWR1cUhvT0piVVJaUnciIHg9IjMxMzk0IiB5PSIxNzQ0OSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05KT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE43TktPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tkt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05LLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05MT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05MdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05NT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOTWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05NdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tk0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON05KZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOSnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzUyMCIgeT0iMjAxMTgiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1MDEwMTgxIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05PT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDgwIiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05PdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05QdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOUC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05RT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05RdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TlEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON05OZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOTnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzA2NyIgeT0iMTc0NTgiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05tT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI1MDk2IiBoZWlnaHQ9IjE5ODEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdObmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05udWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdObi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05vT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05vdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tm8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON05sZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43Tmx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE4NTMiIHk9IjY2MCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05yZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE43TnNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIxNTAiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTk4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTk4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0U5OC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTk5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0U5OWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTk5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0U5OS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTktT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FOS1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON05ydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOci1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTgyNyIgeT0iMjA4NzAiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5LXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFEODIwMjlBIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hPRTlfdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTIxIiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1BT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1CT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtQmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1CdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1DT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUNlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hPRTktLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0U5X09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDY0MiIgeT0iMTgyMTEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3oyZ0lPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgYWxtb3N0IGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBVTUwgMi4wIERpYWdyYW0gSW50ZXJjaGFuZ2UgTWV0YS1Nb2RlbC4gIFNvbWUgZXh0ZW5zaW9ucyBoYWQgYmVlbiBhZGRlZCwgZS5nLiBkZXJyaXZpbmcgYWxsIG5vbi12YWx1ZSBjbGFzc2VzIGZyb20gTWV0aG9kRWxlbWVudC4gQW5vdGhlciBtaW5vciBkaWZmZXJlbmNlIHRvIHRoZSBzdGFuZGFyZCBpcyB0aGF0IFJvc2UvRU1GIGRvIG5vdCBzdXBwb3J0IGF0dHJpYnV0ZSBhcnJheXMsIHdoaWNoIGhhcyBiZWVuIG1vZGVsZWQgaGVyZSB3aXRoIGFzc29jaWF0aW9ucy4gIEZvciBkb2N1bWVudGF0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIGNsYXNzZXMgc2VlIHRoZSBzdGFuZGFyZCBkb2N1bWVudCBhdCB3d3cudW1sLm9yZy4iLz4KLSAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOVlhZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NTAzOTYiIHNvdXJjZT0iX0hOVlhVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhJT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNyIgeT0iLTIyOSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhidWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTAiIHk9Ii00NDkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2QiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNzgiIHk9IjEzMzciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2QiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWGZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhmT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2QiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWGd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhnT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5WWFllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOVlhZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTAsIDUyNCwgLTgsIC0xOTY0XSRbLTExMCwgMjA0OCwgLTgsIC00NDBdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5mSUd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM4MDM0NiIgc291cmNlPSJfSE5WWE1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZklIdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklJdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNDkiIHk9IjE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJSmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzgiIHk9Ii0yODAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjExIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJS09mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTAiIHk9IjE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjExIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSUstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3MyIgeT0iLTI0NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSU1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSU1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjExIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSU5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklNdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSU51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjExIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSU91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITmZJRy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5mSUhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMxMTUsIDI2MiwgODAwOSwgNDE0XSRbLTg5NDAsIDI2MiwgMjE4NCwgNDE0XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOZklQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCQzAyNDEiIHNvdXJjZT0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhRT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODIiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklTT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJUy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDcwIiB5PSIyMjEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklUdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNzciIHk9Ii0yMDMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSVctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSVgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklYZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5mSVB1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOZklQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMTg0LCA0MzEsIDQxMTQsIC0xNDQ3XSRbLTMxMTUsIDQzMSwgMzE4MywgLTE0NDddJFstMzExNSwgMjAzMiwgMzE4MywgMTUyXSRbLTUwMjAsIDIwMzIsIDEyNzgsIDE1Ml0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITmZJY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjIwMzYwIiBzb3VyY2U9Il9ITmZJWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYVU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTY0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkllZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQyMyIgeT0iLTIxOSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAiIHk9IjMzMSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklmdWZYRWR1cUhvT0piVVJaUnciIHg9IjUxIiB5PSItMjM2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDk5IiB5PSIyOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkloLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklpdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTY0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSWp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklqT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklrT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5mSWNlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOZkljdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0NTYsIDMzLCAtNjQ2OCwgLTE2XSRbNjgyNCwgMzMsIC0xMTAwLCAtMTZdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5mSW8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU4MDExRiIgc291cmNlPSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZklwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklxLWZYRWR1cUhvT0piVVJaUnciIHg9IjI5MiIgeT0iMzkwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDQ0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklydWZYRWR1cUhvT0piVVJaUnciIHg9IjM0MyIgeT0iLTk1NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwM0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklzZWZYRWR1cUhvT0piVVJaUnciIHg9IjkwIiB5PSItMzg5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwM0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzAzIiB5PSItMTE2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDQ0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkl0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDNBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkl1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwNDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDNBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJeGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITmZJcE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5mSXBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ3NCwgLTU4NCwgLTI3MCwgMzM3OF0kWy00NzQsIC0zMzc4LCAtMjcwLCA1ODRdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5mSXh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTI5MDE1MCIgc291cmNlPSJfSE5WWFVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZkl5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5mSXgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5mSXlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTEwLCAtNTQxLCAtNjUxLCAyNzYwXSRbNjA5LCAtMjcyNiwgLTE1MiwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOb1NBZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOb1NBdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOb1NBLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUyQjAyMUIiIHNvdXJjZT0iX0hOVlhFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOb1NCT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NCZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NDgsIC01ODQsIDM4MjYsIDIzMTFdJFstMzgxMCwgLTIzMTksIDk2NSwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOb1NDdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOb1NDLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOb1NET2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3QzAwRDciIHNvdXJjZT0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOZklZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TRU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxN0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzc5IiB5PSItMjcxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NGLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0OSIgeT0iLTMzOSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxNzAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NHdWZYRWR1cUhvT0piVVJaUnciIHg9IjkxNCIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg4IiB5PSIxMTk0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxN0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TSXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0lPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxNzAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NLdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TS09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxNzAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TTE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOb1NEZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITm9TRHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTM4MCwgMzEzLCA3MzA2LCAtMjkzN10kWy04MjI5LCAzMTMsIDQ1NywgLTI5MzddJFstODIyOSwgMjcxNywgNDU3LCAtNTMzXSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOb1NQLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NTAzOUYiIHNvdXJjZT0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NMLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzIyIiB5PSIyMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTk5IiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc1IiB5PSIzMTMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NVT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI5NyIgeT0iLTMzOSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NVLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NWLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1ctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITm9TUU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5vU1FlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM4MCwgLTExMCwgLTc3NjMsIC01OV0kWzc3MDQsIC0xMTAsIC0xNDM5LCAtNTldIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5vU2N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk3MDMwMiIgc291cmNlPSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU1l1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NkdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NldWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMTAzIiB5PSItMjYyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NmZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTgwIiB5PSIyMzgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TZ09mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTE4IiB5PSIyNDYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NnLWZYRWR1cUhvT0piVVJaUnciIHg9IjIwNjIiIHk9Ii0zNTUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TaHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NqT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU2tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NqdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU2xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NrdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU2MtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5vU2RPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzODAsIC00MDYsIDkzLCAtODg5MF0kWy0xMDg1NCwgLTQwNiwgLTkzODEsIC04ODkwXSRbLTEwODU0LCA4MDg1LCAtOTM4MSwgLTM5N10kWy0zMzk1LCA4MDg1LCAtMTkyMSwgLTM5N10iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TcGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFM0EwM0NCIiBzb3VyY2U9Il9ITm9TbGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYRU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU3FlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITm9TcHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITm9TcC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNzk1LCAwLCAxOTk4XSRbMCwgLTIyMTgsIDAsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9Tck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TcnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REIwMzAxIiBzb3VyY2U9Il9ITm9TbGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TTC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU3N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDQ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU3R1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgzMyIgeT0iMzM4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDQ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1N1ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTEiIHk9Ii0yOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDNEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9Tdk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjUiIHk9IjQ1NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDNEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU3YtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzY1IiB5PSItMTMxMyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDQ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDNEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURCZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwNDciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RENlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDNEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeUREdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlERC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RERlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITm9Tci1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5vU3NPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTU0MCwgMCwgLTI4MjcsIDU3NDBdJFs0Mjg0LCAwLCAtODQsIDU3NDBdJFs0Mjg0LCAtNDk1MywgLTg0LCA3ODddIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE55REVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE3MDE0RCIgc291cmNlPSJfSE5vU2xlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU1l1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDEwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlER2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURHT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjkiIHk9Ii00NDgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMiIgeT0iOTE2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDBGRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTY5IiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlESWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTQ5IiB5PSIyNzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDEwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlESk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDBGRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlES2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURLdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlES09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMTAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURMT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDBGRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlETWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RE11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURNT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE55REVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOeURFdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NCwgNzg3LCA2MTYzLCAtMjAwNl0kWy04NCwgMjQyOSwgNjE2MywgLTM2NF0kWy00MzI2LCAyNDI5LCAxOTIxLCAtMzY0XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOeURRLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMURBMDAxQjciIHNvdXJjZT0iX0hOeURNLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEUi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOeURST2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOeURSZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2MjUsIC01ODQsIC01MjgzLCAxODU0XSRbNTI1NywgLTE4NjIsIC0xNjUxLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE55RFN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE55RFMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE55RGJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxREEzMDE4OSIgc291cmNlPSJfSE55RFhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU1l1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE55RGJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE55RGJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyMTAsIC01NDEsIDQ3ODMsIDIwOTldJFstNDY5MCwgLTIwNjUsIDEzMDMsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITnlEYy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITnlEZE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITnlEZGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMTIzIiBzb3VyY2U9Il9ITnlEWE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITnlEVE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RGVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzQwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjEiIHk9IjMxNCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzNDAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzMkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURnLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTgiIHk9IjI4OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5OCIgeT0iLTExMDAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDM0MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEaWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDMyQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEamVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzQwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RGstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURrZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDMyQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RGwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURsZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE55RGR1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE55RGQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNTMzLCAwLCAtMjE1OV0kWzAsIDIxNTAsIDAsIC01NDFdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE43TlJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDE2MSIgc291cmNlPSJfSE43Tk5PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE43TkpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05TZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05TdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05TT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM3NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05UT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY1IiB5PSItMjYyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05UdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM3NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOVC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05VZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TlV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3NSIgeT0iLTQxNSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzZBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TlZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM3MCIgeT0iMTE1MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzc0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05XZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tld1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05XT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzZBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05YZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tlh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05YT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNzQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TllPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzZBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOWnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TlpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOUmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOUnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1NzUsIDAsIC0yMzcwXSRbMCwgMjQ0NiwgMCwgLTQ5OV0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOWi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1MUIwM0UxIiBzb3VyY2U9Il9ITjdORk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITjdOQk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TmEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOYU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOYWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTgyLCAtMTY1OSwgMTc2MSwgMzAxNF0kWy0yNDEzLCAtNDA5NywgMzMwLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TmJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TmItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE43TmNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNTE4MDMyOCIgc291cmNlPSJfSE43Tk5PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE43TkJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05kdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05kT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TmNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TmN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg2LCAtNTg0LCAtMTA4MywgMzAyMl0kWzEwNDksIC0zMDMxLCAtMjIwLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TmQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TmVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE43TmVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNjlGMDA4QyIgc291cmNlPSJfSE55RHFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE55RG1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05mdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05mLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05mZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TmV1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TmUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjI2LCAtNTg0LCAtMjg3OCwgMjU2NV0kWzI4NDQsIC0yNTczLCAtNjYwLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TmdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TmdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE43Tmd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNkExMDJEMyIgc291cmNlPSJfSE43TTlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE55RG1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05pT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05odWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TmctZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TmhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTI3LCAtNzk1LCAtNDMxLCAyNTU2XSRbNDQ4LCAtMjc3NywgLTExMCwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05pZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05pdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05pLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzZBNDAyOTIiIHNvdXJjZT0iX0hON05CT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOeURtT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOa2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOai1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05qT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05qZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MDgsIC01ODQsIDIyMzUsIDI1NjVdJFstMjI0MywgLTI1NzMsIDQ5OSwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05rdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05rLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05wT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUyMTI3QTAxOEQiIHNvdXJjZT0iX0hOZklZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOcXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05wZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05wdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0NTYsIC0zNzIsIC03MjMwLCAyODc4XSRbNTcwNiwgLTE0MDUsIC0yOTgwLCAxODQ1XSRbNzczMCwgLTI2NzUsIC05NTYsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOcS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtQ3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFEQTUwMjY4IiBzb3VyY2U9Il9IT0U5LXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtRGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLUR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtQy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLURPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY5LCAtNTQxLCAxNiwgMjIwMV0kWzE2OSwgLTIxNjcsIDE2LCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLUVlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLUV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLUUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM0MDMyNyIgc291cmNlPSJfSE9FOS11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE43TnJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1HT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1HZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1GLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDFBMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1HLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MyIgeT0iLTM4MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxQTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLUh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxOTgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1JZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NiIgeT0iLTM1NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLUpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM1NCIgeT0iOTgyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1KdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxQTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLUotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxOTgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLUstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDFBMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1NZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtTC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1NdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxOTgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1OZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1GT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1GZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDUzMywgMCwgLTIxMDhdJFswLCAyMTE2LCAwLCAtNTI0XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1OdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUU0OTRERDAyQzkiIHNvdXJjZT0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1OLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtT09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTkyMSwgMTk0LCAtMzE5MSwgMTI2NDBdJFstMTAwNDEsIDE5NCwgLTExMzExLCAxMjY0MF0kWy0xMDA0MSwgLTEyODg2LCAtMTEzMTEsIC00NDBdJFstOTE0LCAtMTI4ODYsIC0yMTg0LCAtNDQwXSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1QZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1QdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1QLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUyMTI0ODAwMUYiIHNvdXJjZT0iX0hOVlhRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1RdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1RT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtUWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1NzUsIC03ODcsIC01NzIzLCAxMDkyXSRbNTc1LCAtMjAzMiwgLTU3MjMsIC0xNTJdJFs0MTE0LCAtMjAzMiwgLTIxODQsIC0xNTJdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLVNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTIxMjM3MDE4RSIgc291cmNlPSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE43TmxPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1UZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1UdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1UT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLVNlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1TdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDEsIC01ODQsIC0xNTIsIDE5NTVdJFstMTAxLCAtMTU0OSwgLTE1MiwgOTkwXSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1ULWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1VT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1VZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzNTAwNDgiIHNvdXJjZT0iX0hOVlhNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1WT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1VdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtVS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzExNSwgLTQ2NSwgODAwOSwgLTMxM10kWy04OTQwLCAtNDY1LCAyMTg0LCAtMzEzXSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1XT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1XZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1XdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzNjhEQjAzRTQiIHNvdXJjZT0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1YZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtWHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1XLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtWE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMjEsIC01NzUsIDUyNCwgMzM4Nl0kWzMyMSwgLTMzNzgsIDUyNCwgNTg0XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1ZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1ZdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1ZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUyMkZFNjAxMTEiIHNvdXJjZT0iX0hOb1NMLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1adWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtYWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtWi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1aT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtWmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTMsIC03ODcsIDkyNTQsIDMxMjRdJFstOTMsIC0xNDEzLCA5MjU0LCAyNDk3XSRbLTgzNTYsIC0xNDEzLCA5OTAsIDI0OTddJFstODM1NiwgLTMzMjcsIDk5MCwgNTg0XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1hdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1hLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1iT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQ5QzAxNzEiIHNvdXJjZT0iX0hOeURtT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1iLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtY09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1iZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtYnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzk3LCAtNDc2LCAxMzU5OSwgNzIyM10kWy0zOTcsIC01NzE1LCAxMzU5OSwgMTk4NF0kWy0xMzUyMCwgLTU3MTUsIDQ3NiwgMTk4NF0kWy0xMzUyMCwgLTcxOTcsIDQ3NiwgNTAyXSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1jLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1kT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MjE2RTQwMUUzIiB0eXBlPSJDbGFzcyIgbmFtZT0iVHlwZXMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hPRS1lZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxOTY0IiBoZWlnaHQ9IjE5NjQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1mLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1nT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1ndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtaE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE9FLWR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1kLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc0NSIgeT0iNjQzIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTIwQjFDMDJFMSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IT0UtaWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc2MCIgaGVpZ2h0PSIxOTY0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1pdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0Utai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0Uta09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT091OE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPT3U4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9PdTh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hPRS1odWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtaC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjkzIiB5PSI1OTIiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3oyZ0l1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZXNlIHR3cCBkYXRhIHR5cGUgYXJlIGJlaW5nIHVzZWQgYnkgdGhlIGRpYW1ncmFtIGludGVyY2hhbmdlLiAgVGhleSBtaWdodCBiZSByZXBsYWNlZCB3aXRoIHR5cGVzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBwbGF0Zm9ybSBhcyBsb25nIGFzIHRoZSBhbGxvdyB0aGUgc2FtZSB0eXBlIG9mIHNlcmlhbGl6YXRpb24gZm9yIHBlcnNpc3RlbmN5LiIvPgotICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgPC9jb250ZW50cz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeDZtWU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUY2NkIwMTU1Ij4KLSAgICAgICAgPGJvZHk+MDE8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTU3NzQwMDIzRCIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HeDZtWnVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiLz4KLSAgICAgIDwvcGFja2FnZUltcG9ydD4KLSAgICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX3lrdzh3T3haRWR1T05yTVJnbXo0OEEiIGltcG9ydGVkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiIG5hbWU9IlBvaW50Ij4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTM3NUYzMDI1RSIgbmFtZT0ieCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1Mzc1RkMwMkQ5IiBuYW1lPSJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1IiBuYW1lPSJHcmFwaEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzY4REIwM0U0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUyMEI2QTAzQTMiIG5hbWU9InBvc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDAzQSIgbmFtZT0iY29udGFpbmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzA3NTgwMTFGIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HempsU3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6amxTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5QyIgbmFtZT0ibGluayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBBMjYwMkY4IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ1MDM5RiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2RXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxNzAiIG5hbWU9ImFuY2hvcmFnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzA5RkQwMTdDIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwRTdDMDBENyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkd1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2R2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEiIG5hbWU9InNlbWFudGljTW9kZWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMTY5NzAzMDIiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZOdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdk5lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUyMEIxQzAyRTEiIG5hbWU9IkRpbWVuc2lvbiI+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzNzYwNTAxNTUiIG5hbWU9IndpZHRoIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzNzYwRTAxNkMiIG5hbWU9ImhlaWdodCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMjEyMzcwMThFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDY5ODAxODciIG5hbWU9ImlzVmlzaWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0d6WjBMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwNDQiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwNzU4MDExRiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFRlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsVE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTMiIG5hbWU9InJlZmVyZW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzA5MEUwMEIwIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwOTM4MDM0NiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMiIG5hbWU9InByb3BlcnR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMDk4MjAzQkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzA5QkMwMjQxIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HempsV09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6amxWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkwRTAwQjAiIG5hbWU9IlJlZmVyZW5jZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzNTAwNDgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTE2MDAyNiIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfdEtVRmNPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSIgbmFtZT0icmVmZXJlbmNlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwOTM4MDM0NiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFVlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsVU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTgyMDNCQSIgbmFtZT0iUHJvcGVydHkiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMjEyNDgwMDFGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlBOTAwODEiIG5hbWU9ImtleSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il92c2xWUWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ZzbFZRT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdmtQUmtPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5QUQwMjM1IiBuYW1lPSJ2YWx1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9EZmxUd2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0RmbFR3T3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfRFdDOVFPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUZEMDE3QyIgbmFtZT0iR3JhcGhDb25uZWN0b3IiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMjEyN0EwMThEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1Ii8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxN0EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwRTdDMDBENyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkhlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2SE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTYyIiBuYW1lPSJncmFwaEVkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwQTEyMDI0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEZGMjAzNjAiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZJZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdklPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwQTEyMDI0NSIgbmFtZT0iR3JhcGhFZGdlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTI5MDE1MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTY0IiBuYW1lPSJhbmNob3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwOUZEMDE3QyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEZGMjAzNjAiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZKT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkktZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2QiIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzE0ODUwMzk2Ij4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2S09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZKLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIyIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBBMjYwMkY4IiBuYW1lPSJEaWFncmFtTGluayI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUyMkZFNjAxMTEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxQ0RCMDFGMCIgbmFtZT0iem9vbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFDRTQwMkQ5IiBuYW1lPSJ2aWV3cG9ydCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUUiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ1MDM5RiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2RmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDQ3IiBuYW1lPSJkaWFncmFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzE1REIwMzAxIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2TXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZNZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBBMzcwMTFCIiBuYW1lPSJHcmFwaE5vZGUiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFMkIwMjFCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1Ii8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVBQjAwQTkiIG5hbWU9InNpemUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTIwQjFDMDJFMSIvPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTM0MDE1NiIgbmFtZT0iRGlhZ3JhbSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUzQTAzQ0IiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMEEzNzAxMUIiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNUM1MDAxMCIgbmFtZT0iem9vbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZDRVSXdleU9FZHVGS0pvdkJMNjRYUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9kNFVJd095T0VkdUZLSm92Qkw2NFhRIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVDQzAyNjkiIG5hbWU9InZpZXdwb2ludCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwM0QiIG5hbWU9ImRpYWdyYW1MaW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEEyNjAyRjgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzE1REIwMzAxIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2TC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDBGRiIgbmFtZT0ibmFtZXNwYWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzFDMTcwMTREIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2UGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZQT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTQ5NEREMDJDOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFEM0EwMENBIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfUF8weklleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9QXzB6SU95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1JRdkJZT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMyIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzE2OTcwMzAyIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2T2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDEwMSIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBFMzQwMTU2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxQzE3MDE0RCI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdlFPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2UC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFENjQwMzQxIiBuYW1lPSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMURBMDAxQjciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxRDkzMDM1MyIgbmFtZT0idHlwZUluZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYmhiMUlleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9iaGIxSU95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2JSZlVvT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ3MTAwMEIiIG5hbWU9IlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFEQTMwMTg5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzMkMiIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAxMjMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6MmdFLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3oyZ0V1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ4MjAyOUEiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxREE1MDI2OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4IiBuYW1lPSJlbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzJGQzQwMzI3Ij4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2Uk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZRLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM0MkEwMUZBIiBuYW1lPSJMZWFmRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQ5QzAxNzEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQzNjAyM0QiIG5hbWU9IlRleHRFbGVtZW50Ij4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNjlGMDA4QyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMzNDJBMDFGQSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1Q0MwMzQ1IiBuYW1lPSJ0ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0hsbHh3ZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSGxseHdPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9IV3NhSU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM0M0YwMDE5IiBuYW1lPSJJbWFnZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzZBMTAyRDMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMzQyQTAxRkEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNUQzMDFFNyIgbmFtZT0idXJpIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lxUjcwZXlPRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXFSNzBPeU9FZHVGS0pvdkJMNjRYUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95Z1M1WU95T0VkdUZLSm92Qkw2NFhRIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzY4QTAxODYiIG5hbWU9Im1pbWVUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1ptVUJzZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWm1VQnNPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9aZWFwOE95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM0NDYwMDM3IiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNkE0MDI5MiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMzNDJBMDFGQSIvPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTAxMDE4MSIgbmFtZT0iUG9seWxpbmUiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1MTgwMzI4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzM0NDYwMDM3Ii8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzZFOTAzREIiIG5hbWU9ImNsb3NlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0d6amxQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNkEiIG5hbWU9IndheXBvaW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDE2MSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3oyZ0d1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HejJnR2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTA5MDAzOCIgbmFtZT0iRWxsaXBzZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUxQjAzRTEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMzQ0NjAwMzciLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTIzMDAyMSIgbmFtZT0iY2VudGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTI5MDA4NCIgbmFtZT0icmFkaXVzWCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1MzEwMzU2IiBuYW1lPSJyYWRpdXNZIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUzRDAzNzIiIG5hbWU9InJvdGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU0NzAzNEUiIG5hbWU9InN0YXJ0QW5nbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTU2MDJGNSIgbmFtZT0iZW5kQW5nbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1ODAxMUYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDAzQSBfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDQ0Ii8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM4MDM0NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjExIF8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTMiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5QkMwMjQxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMgXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1RSI+Ci0gICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUUiIG5hbWU9Il9kaWFncmFtRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzA5QkMwMjQxIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HempsVy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6amxXdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFNDUwMzlGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMgXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5RSIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3QzAwRDciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3MCBfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIi8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYyMDM2MCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTYyIF8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjQiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE0ODUwMzk2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIgXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2RCI+Ci0gICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkQiIG5hbWU9Il9ncmFwaEVkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwQTEyMDI0NSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNDg1MDM5NiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkstZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2S3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkRW5kPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNURCMDMwMSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDNEIF8zQURDN0I3NDAyMkQ0MTUzMTVERDAwNDciLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE2OTcwMzAyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEgXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMyIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxNzAxNEQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDBGRiBfM0FEQzdCNzQwMjJENDE1MzFDMTgwMTAxIi8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM0MDMyNyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4IF8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxQTMiPgotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIiBuYW1lPSJfY29yZVNlbWFudGljTW9kZWxCcmlkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMxRDgyMDI5QSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMyRkM0MDMyNyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdlItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2UnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMTIzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzMkMgXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDM0MCI+Ci0gICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzNDAiIG5hbWU9Il91TUFTZW1hbnRpY01vZGVsQnJpZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMUQ3MTAwMEIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAxMjMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6MmdGdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3oyZ0ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkRW5kPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDE2MSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzZBIF8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNzQiPgotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzc0IiBuYW1lPSJfcG9seWxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMzNTAxMDE4MSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDE2MSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3oyZ0hlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HejJnSE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkRW5kPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjIwMDFDRiIgbmFtZT0iVU1MMkluZnJhc3RydWN0dXJlTWluaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d4dzFhdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxREYyQzQzMDE1MSI+Ci0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjJDNDMwMTUxIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2N0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY3QtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1FdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1FLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOTG1GT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2N0T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjdGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTUiIHk9Ijg2MyIgd2lkdGg9IjI1NDAiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1GZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1HT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5MbUdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1IT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1IZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOTG1IdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOTG1GdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkxtRi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMDk4IiB5PSI4NjMiIHdpZHRoPSIzMjI3IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3h3MWJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgPC9jb250ZW50cz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd3VUb09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2MjAwMUNGIj4KLSAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiIG5hbWU9IlByaW1pdGl2ZVR5cGVzIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HeGQ2Y09mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiLz4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdzRFa3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIj4KLSAgICAgICAgICA8Ym9keT4wMDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiIG5hbWU9IkRhdGUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3c0RWxlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSI+Ci0gICAgICAgICAgICA8Ym9keT5EYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIiBuYW1lPSJVcmkiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hCT2dlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSI+Ci0gICAgICAgICAgICA8Ym9keT5EYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiBuYW1lPSJTdHJpbmciPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfaTdGVG9PaWZFZHVRYnVZNlV3TVNRZyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICA8Ym9keT5BIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4gc29tZSBzdWl0YWJsZSBjaGFyYWN0ZXIgc2V0IHVzZWQgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kZWwuIENoYXJhY3RlciBzZXRzIG1heSBpbmNsdWRlIG5vbi1Sb21hbiBhbHBoYWJldHMgYW5kIGNoYXJhY3RlcnMuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDNGMDk4OUI5MDI5MCIgbmFtZT0iU2V0Ii8+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQzRjA5ODk5QzAwRUEiIG5hbWU9IlNlcXVlbmNlIi8+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQzQ0EwMTBBNDAwN0IiIG5hbWU9IkludGVnZXIiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfZFVjNm9Pb0ZFZHVPQlBRQTJoS3FVUSIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDNDQTAxMEE0MDA3QiI+Ci0gICAgICAgICAgICA8Ym9keT5BbiBpbnRlZ2VyIGlzIGEgcHJpbWl0aXZlIHR5cGUgcmVwcmVzZW50aW5nIGludGVnZXIgdmFsdWVzLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIiBuYW1lPSJCb29sZWFuIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iXzVHY1lBZWllRWR1UWJ1WTZVd01TUWciIGFubm90YXRlZEVsZW1lbnQ9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgIDxib2R5PkEgQm9vbGVhbiB0eXBlIGlzIHVzZWQgZm9yIGxvZ2ljYWwgZXhwcmVzc2lvbiwgY29uc2lzdGluZyBvZiB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMgdHJ1ZSBhbmQgZmFsc2UuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiIG5hbWU9IkRvdWJsZSIvPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIiBuYW1lPSJDb25zdHJ1Y3RzIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HeHcxWi1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MURERTYzNjAwMDQiPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU2MzYwMDA0IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE00cmR1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2OTMiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmdlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITTRyYy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITTRyZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTM3IiB5PSI5OTYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE00cmh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRya09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmtlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITTRyZy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITTRyaE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NjUiIHk9IjY4MjQiIHdpZHRoPSIxNTI0IiBoZWlnaHQ9Ijc2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRya3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITTRybHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjS3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hNNHJrLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hNNHJsT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NSIgeT0iOTIyMCIgd2lkdGg9IjIzNjQiIGhlaWdodD0iOTA3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NOT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkE0NDAzQTgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY04tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2NPT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1BlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1B1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1AtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NRLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5DY05lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY051ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTIyMCIgeT0iNTMwMCIgd2lkdGg9IjMxMzIiIGhlaWdodD0iNzEyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2NTT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjVWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1UtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNjUmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjUnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjQ5IiB5PSIyNjY3IiB3aWR0aD0iMzI4NiIgaGVpZ2h0PSIxMTI0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2NjLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2QtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY2VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY2V1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY2ZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NmdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5DY2NPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2NlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDcxNSIgeT0iNTM1MCIgd2lkdGg9IjQxNDEiIGhlaWdodD0iNjU5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NrZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2NsZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY21lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY211ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY20tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY25PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY25lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY251ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY24tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NvT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5DY2t1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2stZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ5MSIgeT0iODY2MSIgd2lkdGg9IjIyMjAiIGhlaWdodD0iODI3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HeHcxYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY0stZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEJEMDI4RiIgc291cmNlPSJfSE00cmt1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE00cmd1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY0wtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY0xPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjTGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTQxLCAwLCAxODQ1XSRbMCwgLTE4NDUsIDAsIDU0MV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NNdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY00tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NWT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNBRjAyMDIiIHNvdXJjZT0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hNNHJjdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NXT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NWZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY1Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOCwgLTc5NSwgLTQyLCAxNDkwXSRbMzMsIC0xNzQ0LCAtMTYsIDU0MV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NXLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NYZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjkxMjAzQzAiIHNvdXJjZT0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NYdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY1gtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjY4LCAtNTUwLCAtNDI1OCwgMzM2MV0kWzM5MjAsIC0zMTI0LCAtMTAwNywgNzg3XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY1p1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQjQ1MDNENSIgc291cmNlPSJfSE5DY05PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY1otZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjYU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQ2LCAtNTUwLCAyODYxLCAxODM3XSRbLTI0NzIsIC0xNjAwLCAxMjM2LCA3ODddIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjYmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NidWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBzb3VyY2U9Il9ITkNjYi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2hlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjZ09mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NnZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NTAsIDAsIDE4ODhdJFswLCAtMTY1MSwgMCwgNzg3XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY2h1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjaC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY2lPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGNzFCMDNBOCIgc291cmNlPSJfSE00cmd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY2ItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY2llZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjaXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NjIsIC0yMzcsIC00MTY1LCAxMjM2XSRbMzA5MCwgLTkzMSwgLTE4MzcsIDU0MV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NqLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY2tPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NvZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkJDQTAwRTkiIHNvdXJjZT0iX0hOQ2NrZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NOT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NvdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY28tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU0MSwgMCwgMjgxMF0kWzAsIC0yODEwLCAwLCA1NDFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjcU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NxZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjcXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCQ0YwMkE5IiBzb3VyY2U9Il9ITkNja2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjYi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjcnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjcS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NyT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02MDEsIC01NDEsIDMxMDcsIDI3NjBdJFstMzA5OCwgLTI3NjAsIDYwOSwgNTQxXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY3NlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjc3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3IiBuYW1lPSJDbGFzc2lmaWVyIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4ZDZkdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciPgotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERjhCRDAyOEYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIiBuYW1lPSJFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4bnJjLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiPgotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiIG5hbWU9Ik5hbWVkRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yZHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ij4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFQ0FGMDIwMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSIvPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkM4RTAwQjYiIG5hbWU9Im5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9FZ3N5Z2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRWdzeWdPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0VZcHB3T3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yZS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ij4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERjhENDAyMTEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4IiBuYW1lPSJUeXBlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4bnJmLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiPgotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERjcxQjAzQTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY5MTIwM0MwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSIgbmFtZT0iUGFja2FnZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yaE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZCQ0EwMEU5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4Ii8+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQkNGMDJBOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkE0NDAzQTgiIG5hbWU9Ik5hbWVzcGFjZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeHcxWk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4Ij4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkI0NTAzRDUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZEMDQwMEYxIiBuYW1lPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3d1VG11ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNTY0RkEwMDk1Ij4KLSAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1NjRGQTAwOTUiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l0LWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgZGlhZ3JhbXMgZm9yIHByb2Nlc3MgdmlzdWFsaXphdGlvbiBiYXNlZCBvbiB0aGUgVU1MMiBkaWFncmFtIGludGVyY2hhbmdlIHN0YW5kYXJkLiAgQ29udGFpbnMgZGlhZ3JhbXMgZm9yIHdvcmtmbG93cywgd29yayBwcm9kdWN0IGRlcGVuZGVuY2llcywgYW5kIHRlYW0gYnJlYWtkb3ducy4iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaXVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI3MDciIHk9IjQ0NjEiIHdpZHRoPSI3NTI2IiBoZWlnaHQ9IjIwNDgiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaXZPZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0iRGVmaW5lcyBob3cgY29yZSBjb250ZW50IGVsZW1lbnRzIGNhbiBiZSBvcmdhbml6ZWQgZm9yIGluc3RhbnRpYXRpb24gaW4gcHJvY2Vzc2VzLiAgUHJvY2Vzc2VzIGhhdmUgbG9jYWwgc2NoZW1lcyBmYWNpbGl0YXRpbmcgcmVkZWZpbml0aW9uIG9mIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBSb2xlcywgVGFza3MsIGFuZCBXb3JrUHJvZHVjdHMuIFRoZXJlIGFyZSB0d28gbWFpbiB2YXJpYXRpb25zIG9mIHByb2Nlc3MgZGVmaW5lZDogRGVsaXZlcnkgUHJvY2Vzc2VzLCB3aGljaCBkZXNjcmliZXMgZW5kLXRvLWVuZCB3YXlzIG9mIGRvaW5nIGEgJnF1b3Q7cHJvamVjdCZxdW90OyBhcyB3ZWxsIGFzIENhcGFiaWxpdHkgUGF0dGVybnMsIHdoaWNoIHByb3ZpZGUgcmV1c3VhYmxlIHBhcnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcG9zZSBEZWxpdmVyeSBQcm9jZXNzZXMuJiN4QTsiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI3NDkiIHk9Ijc2ODciIHdpZHRoPSI3MDM1IiBoZWlnaHQ9IjQ1NDYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaXdlZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0iRGVmaW5lcyBhIHBsdWdpbiBtZWNoYW5pc20gd2hpY2ggcmVsaWVzIG9uIHBhY2thZ2luZyBhcyB3ZWxsIGFzIG5ldyByZWxhdGlvbnNoaXAgdHlwZXMgZm9yIGNvbnRlbnQgYW5kIHByb2Nlc3MgZWxlbWVudHMgdGhhdCBhbGxvdyBkZWNsYXJpbmcgY2hhbmdlIGRlbHRhcyB3aXRob3V0IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgc291cmNlLiIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTciIHk9IjI4NTMiIHdpZHRoPSI2NTQ0IiBoZWlnaHQ9IjIzMTEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaXh1ZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0iRGVmaW5lcyBrZXkgY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBXb3JrUHJvZHVjdHMsIFRhc2tzLCB0aGVpciBhdHRyaWJ1dGVzLCBhbmQgdGhlaXIgZGVmYXVsdCByZWxhdGlvbnNoaXBzLiBBbHNvIGRlZmluZXMgYSBiYXNpYyBtZWNoYW5pc21zIHRvIG9yZ2FuaXplIGNvcmUgY29udGVudCBpbiBwYWNrYWdlcy4iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaXgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjM0IiB5PSI5ODI3IiB3aWR0aD0iNjI4MiIgaGVpZ2h0PSIyODAyIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l5LWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgaG93IHBsdWdpbnMgYXJlIGZ1cnRoZXIgcGFja2FnZWQgaW4gbGlicmFyaWVzIGFzIHdlbGwgYXMgZGVmaW5lcyB0aGUgY29uY2VwdCBvZiBjb25maWd1cmF0aW9ucyBleHRlbmRpbmcgdGhlIHBsdWdpbiBtZWNoYW1pc20uIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l6T2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyNzA3IiB5PSIxNDkwIiB3aWR0aD0iNjI5OSIgaGVpZ2h0PSIxNjkzIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1llZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCRiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzWmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2FlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc2F1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSExQc1l1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNZLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0OTM1IiB5PSI4NzM3IiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzYi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc2RPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSExQc2JPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNiZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg0ODMiIHk9IjI3OTQiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUZXh0Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExQc2R1ZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSIxMiIgYm9sZD0idHJ1ZSIgZGVzY3JpcHRpb249IklCTSBVbmlmaWVkIE1ldGhvZHMgQXJjaGl0ZWN0dXJlIHYxLjAuNDogQ29uY2VwdHVhbCBNZXRhLU1vZGVsIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNkLWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NSIgeT0iNDU3IiB3aWR0aD0iMTM5MTkiIGhlaWdodD0iNTI0Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2YtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTk5NEJGMDI4MiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzZy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2gtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc2lPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSExQc2dPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNnZWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MTAxIiB5PSI0NTcyIiB3aWR0aD0iMzcyNSIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2stZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3QiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzbC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc20tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc25PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSExQc2xPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNsZWZYRWR1cUhvT0piVVJaUnciIHg9IjgxMDIiIHk9IjEwMzQ2IiB3aWR0aD0iMzYxNSIgaGVpZ2h0PSIxNzEwIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDAzQiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzci1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc3RPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSExQc3JPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNyZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MjgyIiB5PSIxNDEzIiB3aWR0aD0iMzQ3OSIgaGVpZ2h0PSIxNzAxIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3dVRuT2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgVU1BIE1ldGEtTW9kZWwgaXMgc3RydWN0dXJlZCBhcyBkZXBpY3RlZCBpbiB0aGUgZGlhZ3JhbS4gIFRoZSBzdHJ1Y3R1cmUgZGl2aWRlcyB0aGUgbW9kZWwgaW4gbG9naWNhbCB1bml0cy4gIEVhY2ggdW5pdCBleHRlbmRzIHRoZSB1bml0cyBpdCBkZXBlbmRzIHVwb24gcHJvdmlkaW5nIGFkZGl0aW9uYWwgc3RydWN0dXJlcyBhbmQgY2FwYWJpbGl0aWVzLiAgT3ZlcmFsbCB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbSBhcHBsaWVkIHRvIHRoZSBwYWNrYWdlcyByZWFsaXplcyBhIGdyYWR1YWwgZXh0ZW5zaW9uIG9mIHRoZSBjYXBhYmlsaXRpZXMgbW9kZWxlZCB1bml0IGJ5IHVuaXQuICBBcyBhIHJlc3VsdCwgdW5pdHMgZGVmaW5lZCBvbiBhIGxvd2VyIGxheWVyIGNhbiBiZSByZWFsaXplZCBieSBhIFVNQSBzdWJzZXQtaW1wbGVtZW50YXRpb24gd2l0aG91dCB0aGUgaGlnaGVyIGxldmVsIHVuaXRzLiAgRm9yIGV4YW1wbGUsIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBjb3VsZCBiZSBiYXNlZCBqdXN0IG9uIHRoZSBNZXRob2QgQ29yZSBhbmQgTWV0aG9kIFBsdWdpbiBwYWNrYWdlcyB3aXRob3V0IHVzaW5nIHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuICBIb3dldmVyLCBpZiB0aGUgUHJvY2VzcyBwYWNrYWdlIHdvdWxkIGJlIGluY2x1ZGVkIGFzIHdlbGwgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGVuIGFkZGl0aW9uYWwgY2FwYWJpbGl0aWVzIGZyb20gdGhlIFByb2Nlc3MgcGFja2FnZSB3b3VsZCBiZSBtZXJnZWQgaW50byB0aGUgTWV0aG9kIFBsdWdpbiBwYWNrYWdlLiIvPgotICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc2V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l1LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNZZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHNlLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHNmT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNTIyLCAtMzIxLCA1ODc1LCA1OV0kWy03NDY3LCAtMzIxLCAxOTMwLCA1OV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzZmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITFBzaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSExHaXR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSExQc2YtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc2l1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBzaS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzc2NywgMCwgMjczNCwgNzZdJFstNDYzOSwgMCwgMTg2MiwgNzZdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2plZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc2p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNhLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHNqLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHNrT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMyNjgsIC02MzUsIC0zNDM3LCAtNDU3XSRbNDc2NiwgLTYzNSwgLTE5MzgsIC00NTddIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2tlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2t1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjA4NDcxNTAyLDAuODEwODU5MikiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITFBzcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSExHaXhlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSExQc2stZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc3AtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBzcU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0Mzg1LCA2MzUsIC0xODExLCAtMjAzXSRbMzE0MSwgNDU3LCAtMzA1NiwgLTM4MV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzcWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzcXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITFBzeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSExHaXl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSExQc3EtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc3lPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc3llZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTcxMDMsIC05MywgMTczNSwgLTE2XSRbLTMxNTgsIC05MywgNTY4MSwgLTE2XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHN5dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHN5LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgIDwvY29udGVudHM+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2hFdUF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2RDA0MDBGMSI+Ci0gICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0JGIiBuYW1lPSJQcm9jZXNzIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hb09lNnVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEZEODU2QjAyNzYiPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDg1NkIwMjc2IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3B1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19Vd3F1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdyLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3cC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3cU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzYwIiB5PSIxMTQ1NiIgd2lkdGg9IjMzOTgiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3c09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX2VoUWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19laFJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdzdWZYRWR1cUhvT0piVVJaUnciIHg9IjM3ODkiIHk9IjgzMzQiIHdpZHRoPSIyNTQwIiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ4OTFGMDJDRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19laFMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoVC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfZWhVT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX2VoU09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX2VoU2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTExIiB5PSI1NTA1IiB3aWR0aD0iMzA5NiIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfbnJRdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfeGNNZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y05lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjTnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19uclEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19uclJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI5OSIgeT0iLTMxMSIgd2lkdGg9IjM1MjAiIGhlaWdodD0iMTY4NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjU2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjJBMUIwMkU3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX3hjVGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y1V1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfeGNTdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfeGNTLWZYRWR1cUhvT0piVVJaUnciIHg9IjI5NTQiIHk9IjI0NzAiIHdpZHRoPSI0MjA5IiBoZWlnaHQ9IjE2ODQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dvT2U3T2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8VU1BIHNlcGFyYXRlcyByZXVzYWJsZSBjb3JlIG1ldGhvZCBjb250ZW50IGZyb20gaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gIEEgRGV2ZWxvcG1lbnQgUHJvY2VzcyBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmVkIHdvcmsgZGVmaW5pdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZCB0byBkZXZlbG9wIGEgc3lzdGVtLCBlLmcuIGJ5IHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgZm9sbG93cyB0aGUgcHJvY2Vzcy4gIFN1Y2ggc3RydWN0dXJlZCB3b3JrIGRlZmluaXRpb25zIGRlbGluZWF0ZSB0aGUgd29yayB0byBiZSBwZXJmb3JtZWQgYWxvbmcgYSB0aW1lbGluZSBvciBsaWZlY3ljbGUgYW5kIG9yZ2FuaXplIGl0IGluIHNvIGNhbGxlZCBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRhc2tzIChhcyB0aGV5IGhhdmUgYmVlbiBpbnRyb2R1Y2VkIGFzIHBhcnQgb2YgdGhlIGNvcmUgbWV0aG9kIGNvbnRlbnQpIHByb3ZpZGUgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBmb3Igd29yayB0aGF0IG5lZWRzIHRvIGJlIHBlcmZvcm1lZCB0byBhY2hpZXZlIGEgcGFydGljdWxhciBkZXZlbG9wbWVudCBnb2FsLiAgQSBUYXNrIGRvZXMgbm90IGxvb2sgYXQgdGhlICdiaWcgcGljdHVyZScgb2YgaG93IHRoZSB3b3JrIGRlc2NyaWJlZCByZWxhdGVzIHRvIG90aGVyIFRhc2sncyB3b3JrLiAgVGhleSBoYXZlIGJlZW4gZGVmaW5lZCBhcyByZXVzYWJsZSBjb3JlIG1ldGhvZCBjb250ZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIHBsYWNlbWVudCB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBBbGwgdGhhdCBpcyBkZWZpbmVkIGZvciBhIFRhc2sgYXJlIHRoZSB0eXBlcyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLCB0aGUgY29uY3JldGUgc3RlcHMgdG8gcGVyZm9ybSwgYXMgd2VsbCBhcyB3aGF0IHNraWxscyBhcmUgcmVxdWlyZWQgdG8gcGVyZm9ybSB0aGUgd29yayAocm9sZXMpLiAgV2hpY2ggVGFza3MgaGF2ZSB0byBwcmVjZWRlIGFuZCBzdWNjZWVkIGEgVGFzayBhcyB3ZWxsIGFzIHdoYXQgc3RlcHMgdG8gZm9jdXMgb24gYXQgd2hhdCBwb2ludCBvZiB0aW1lIGluIHRoZSBsaWZlY3ljbGUgYXJlIGludGVudGlvbmFsbHkgbm90IGRlZmluZWQgZm9yIGNvcmUgbWV0aG9kIGNvbnRlbnQuICBUaGUgZ29hbCBpcyBwcm92aWRlIFRhc2tzIHRoYXQgY2FuIGJlIHJldXNlZCBmb3IgbWFueSBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgc2l0dWF0aW9ucy4mI3hBO3xUaGUgc2NvcGUgb2YgYSBwcm9jZXNzIGlzIHRvIHByb3ZpZGUgZXh0ZW5kZWQgYXMgd2VsbCBhcyBjb25jcmV0ZSB3b3JrIHN0cnVjdHVyZXMgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgc2l0dWF0aW9uLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgdGFrZXMgcmV1c2FibGUgY29yZSBtZXRob2QgZWxlbWVudHMgc3VjaCBhcyBUYXNrcyBhbmQgV29yayBQcm9kdWN0cyBhbmQgcmVsYXRlcyB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVG8gZG8gc28sIFVNQSdzIFByb2Nlc3MgUGFja2FnZSBwcm92aWRlcyBkYXRhIHN0cnVjdHVyZXMgdGhhdCByZWZsZWN0IHRoZSBpbmR1c3RyaWVzIGJlc3QgcHJhY3RpY2VzLiAgVGhpcyBzZWN0aW9uIGRlZmluZXMgQnJlYWtkb3duIHN0cnVjdHVyZSBtZXRhLW1vZGVscyB0aGF0IGNvbXByaXNlIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBicmVha2Rvd24gZWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCB3aGljaCBhcmUgaGlnaGVyIGxldmVsIGdyb3VwaW5ncyBvZiB3b3JrIGNvbXByaXNpbmcgb2YgVGFza3Mgb3Igb3RoZXIgQWN0aXZpdGllcyBkZWZpbmluZyBzZXF1ZW5jZXMgYW5kIGNvbmRpdGlvbnMgb24gVGFza3MuICBJbiBmYWN0LCBhIHByb2Nlc3MgaXMgZGVmaW5lZCBhcyBhIHNwZWNpYWwga2luZCBvZiBBY3Rpdml0eSBpdHNlbGYuICBUaGlzIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG1ldGEtbW9kZWwgaGFzIGJlZW4gZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUgY29uY3JldGUgbGlmZWN5Y2xlIG1vZGVscyB0aGUgcHJvY2VzcyBlbmdpbmVlciB3YW50cyB0byBleHByZXNzIHdpdGggdGhlbS4gIEluIG90aGVyIHdvcmRzIHRoZSBtZXRhLW1vZGVsIGlzIGFibGUgdG8gcmVwcmVzZW50ICdkaWZmZXJlbnQgdHlwZXMgb2YnIHdhdGVyZmFsbCBwcm9jZXNzZXMgYXMgd2VsbCBhcyBpdGVyYXRpdmUgb3IgaW5jcmVtZW50YWwgcHJvY2VzcyBtb2RlbHMuICBGaW5hbGx5LCBVTUEgZW5hYmxlcyBkaWZmZXJlbnQgdHlwZSBvZiBwcmVzZW50YXRpb25zIGZvciBicmVha2Rvd24gc3RydWN0dXJlcywgYXMgaWxsdXN0cmF0ZWQgd2l0aCBleGFtcGxlIGluIHRoZSBzZWN0aW9ucyBiZWxvdywgc3VjaCBhcyBwcm9qZWN0IHBsYW4tbGlrZSBzdHJ1Y3R1cmVkIGxpc3QsIHdvcmtmbG93IG9yIGFjdGl2aXR5IGRpYWdyYW1zLCBhbmQgc3RhdGljIHN0cnVjdHVyZSBkaWFncmFtcyBzaG93IGlucHV0cy9vdXRwdXRzIHRvIHdvcmsgYXMgd2VsbCBhcyBwZXJmb3JtaW5nIHJvbGVzLiAgVU1BJ3MgUHJvY2VzcyBwYWNrYWdlIGV4dGVuZHMgdGhlIGNvbmNlcHRzIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgdGhyb3VnaCBwYWNrYWdlIG1lcmdlIGFzIGRlcGljdGVkIGluIHRoZSBkaWFncmFtLiAgQnJlYWtkb3duIG1lcmdlcyB0aGUgd2hvbGUgb2YgTWV0aG9kIENvcmUgYnkgbWVyZ2luZyB0aGUgTWV0aG9kIFBhY2thZ2UgcGFja2FnZS4gIFByb2Nlc3MgaXMgc3BlY2lmaWVkIGluIFVNQSB3aXRoIHRoZSBmb2xsb3dpbmcgZml2ZSBwYWNrYWdlcy4gIFRoZSBCcmVha2Rvd24gcGFja2FnZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBicmVha2Rvd24gZWxlbWVudHMgdGhhdCBmb3JtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgUHJvY2VzcyBUeXBlcyBkZWZpbmUgUHJvY2Vzc2VzIGFzIHNwZWNpYWwgQWN0aXZpdGllcyAoZGVmaW5lZCBpbiBicmVha2Rvd24gZWxlbWVudHMpIGFuZCBpbnRyb2R1Y2UgZGlmZmVyZW50IHR5cGVzIG9mIFByb2Nlc3NlcyBzdWNoIGFzIERlbGl2ZXJ5IFByb2Nlc3Mgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIFByb2Nlc3MgUGFja2FnZSByZWZpbmVzIHRoZSBNZXRob2QgUGFja2FnZSBjb25jZXB0cyBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIHdpdGggbmV3IHBhY2thZ2VzIHRoYXQgb3JnYW5pemUgcHJvY2Vzc2VzIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4gIFByb2Nlc3MgRGVzY3JpcHRpb25zIHByb3ZpZGVzIHByb2Nlc3Mgc3BlY2lmaWMgY29udGVudCBkZXNjcmlwdGlvbnMgZXh0ZW5kaW5nIHRoZSB0YXhvbm9teSBiYXNlZCBvbiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBjbGFzcyBkZWZpbmVkIGluIE1ldGhvZCBDb3JlLiAgRmluYWxseSwgV29ya2Zsb3cgZGVmaW5lcyBob3cgcHJvY2VzcyBjYW4gYmUgZW5hY3RlZCBieSBwcm92aWRpbmcgZXh0ZW5kZWQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYWxsb3cgY3JlYXRpbmcgbW9kZWxzIGZpdCBmb3IgaW5zdGFudGlhdGlvbiBvbiB0aGUgTTAgbGV2ZWwuICBJbiBvdGhlciB3b3JkcywgaXQgcHJvdmlkZXMgYSBtZXRhLXNjaGVtYSBmb3Igd29ya2Zsb3cgbW9kZWxzIHRoYXQgY2FuIHJ1biBpbiBhIHdvcmtmbG93IHNpbXVsYXRvciBzdWNoIGFzIElCTSBXZWJzcGhlcmUgQnVzaW5lc3MgSW50ZWdyYXRpb24gTW9kZWxlci4mI3hBOyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0R4bnlzT3hNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9EeExHd094TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9HX1V3c09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX1V3cHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0R4bnlzLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0R4bnl0ZXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRHhueXQteE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55dHV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRHhueXRPeE1FZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRHhueXNleE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9EeG55c3V4TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlszLCAzMiwgLTYsIC04NV0kWzExLCAxNTAsIDIsIDMzXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9Gb1BXRWV4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfRm9QV0VPeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfR19laFItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19Vd3NPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Gb1BXRk94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Gb1BXRnV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdHT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRm9QV0YteE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ZvUFdGZXhNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ZvUFdFdXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRm9QV0UteE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMiwgMzIsIC04LCAtOTFdJFsxMSwgMTU1LCAxLCAzMl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSVp0X01leE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0ladF9NT3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0dfeGNTZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfZWhSLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X05PeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X051eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JWnRfT094TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9OLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JWnRfTmV4TUVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9JWnRfTXV4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ladF9NLXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzgxLCAxNywgLTEyNywgLTE0XSRbMTU3LCA2MywgLTUxLCAzMl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfcjBWUklleGhFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX3IwVlJJT3hoRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0dfbnJRdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfeGNTZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcjBWUkpPeGhFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcjBWUkp1eGhFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yMFZSS094aEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJKLXhoRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9yMFZSSmV4aEVkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9yMFZSSXV4aEVkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3IwVlJJLXhoRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy02OCwgMywgMzQwLCAtMjBdJFstMzI4LCAxOCwgODAsIC01XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNUY1MDkwMjA2IiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNaZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfeGNhZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y2J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y2NPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y2N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNkT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR194Y1p1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR194Y1otZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUyMTYiIHk9IjMxNyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05NLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOTk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05PT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05PZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05PdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05PLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05QT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05QZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05QdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOUC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05NZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05NdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4NzYiIHk9IjE4MDk1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05RT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05ST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05ULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TlFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TlF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIxMDciIHk9IjE4MDI1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05WT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TldPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TldlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tld1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tlh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05YLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TlVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TlV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4NTAiIHk9IjE4MDY5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05aT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05adWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05iLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TlllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tll1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM2MSIgeT0iODc3MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOZE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05lT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05lZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05lLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05mT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05mZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05mdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05jZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05jdWZYRWR1cUhvT0piVVJaUnciIHg9IjU5MDEiIHk9Ijg3NzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TmhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOaWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOZ2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzciIHk9IjExMDY1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05tZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05uZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05uLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183Tm91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05xT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183Tm11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tm0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzEzMiIgeT0iMTEwNTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TnR1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TndlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOcy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzA0IiB5PSIxMzQwMiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOd3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN054ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOeHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN055dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN055LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN056T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN056ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN056dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN056LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN04wT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOMGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN053LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN054T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwMzIwIiB5PSIxMTA2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYTC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhJZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhJdWZYRWR1cUhvT0piVVJaUnciIHg9IjExODQ0IiB5PSIxMzQwMiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYTk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhPT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhPZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYUC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhNZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhNdWZYRWR1cUhvT0piVVJaUnciIHg9IjczMTUiIHk9IjExMDY1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWFFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzNzYiIHk9IjE1NjgwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhiLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWGRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWGR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWGVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhldWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWGJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWGJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMwMTMiIHk9IjExMDY1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhqZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhrZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjQxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWGx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWG1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWG11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhuT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWGp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWGotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzNzYiIHk9IjEzNDAyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDU1IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh2dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWHNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWHNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1ODkiIHk9IjY0MzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWHctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSUplZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYd09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4OTIzIiB5PSI2NDM0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0lQT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTQ2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSVFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSVEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSVJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lSLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSU9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSU91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzNDQiIHk9IjQxNTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSVotZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JYS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JYk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JYnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JYi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JY09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JWk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JWmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjAzNSIgeT0iODc3OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JZ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0loT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0loZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0loLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lpT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lpZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0lmZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lmdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg0ODMiIHk9Ijg3NzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSWtPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JbC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSW0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JamVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JanVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTQwMCIgeT0iNjQzNCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JeWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JemVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0kwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0kwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0kwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0kxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0kxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0kxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0kxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JMk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0l5dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0l5LWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDIyIiB5PSIyMTc1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hb09lN3VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIHRoZSB0YXhvbm9teSBvZiBhbGwgdGhlIG1haW4gY2xhc3NlcyBvZiB0aGUgUHJvY2VzcyBwYWNrYWdlLiIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfN05rT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0dfN05nT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05sT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfN05rZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR183Tmt1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjYwLCAtNTI0LCAtMjI4NiwgMTc2MV0kWzIyNTIsIC0xNzYxLCAtNjk0LCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdObC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfN05tT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HXzdOcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HXzdObWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOcmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HXzdOcXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfN05xLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDMsIC01MzMsIDQ2NSwgMTc1Ml0kWy00NzQsIC0xNzYxLCAxMzUsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfN05zT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR183TnNlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIHNvdXJjZT0iX0dfN05NT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhVZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWFV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE0MywgLTUyNCwgLTQwODksIDE4MTFdJFs0MDM4LCAtMTgxMSwgLTExOTMsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhWLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWFdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhXZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEQiIHNvdXJjZT0iX0dfN05RT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhXdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWFctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDQ4LCAtNTI0LCAtMTU4MywgMTgxMV0kWzE1NjYsIC0xODExLCAtNDY1LCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYWU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYWXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhFIiBzb3VyY2U9Il9HXzdOVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYWnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYWS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhaT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00NTcsIC01MjQsIDE1NzQsIDE4MTFdJFstMTU3NCwgLTE4MTEsIDQ1NywgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYYXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWGUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfR183TnN1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWGEtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWGYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWGZPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYZmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4MTIsIC01MjQsIC0yODk1LCAxODExXSRbMjg3MCwgLTE4MjAsIC04MzgsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhndWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhoT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0hBRVhJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhpT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhoZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWGh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjQ1LCAtNTI0LCAtOTIyLCAxODExXSRbODk3LCAtMTgyMCwgLTI3MCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYak9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWG5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfSEFFWFFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWGplZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWG9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWG51ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYbi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTMzLCAwLCAxNzUyXSRbMCwgLTE3NjksIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWHBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lKdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lKLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSUtPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE1OSwgLTQ1NywgLTQ5MzYsIDE4NzldJFs0NzA3LCAtMTgxMSwgLTEzODgsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lMZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSUx1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lMLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0dfN05jT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lNLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lNT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSU1lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzc4LCAtNTI0LCAtMjc3NywgMTgxMV0kWzI3NDMsIC0xODExLCAtODEyLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lOLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JU09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBzb3VyY2U9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JU2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lTdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcyOCwgLTUzMywgLTI0NzIsIDE3NTJdJFsyNDQ2LCAtMTc2OSwgLTc1MywgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSVQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JVU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSVVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRUY5MDBFMiIgc291cmNlPSJfSEFFWHItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSU9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lWLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSVV1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JVS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTMzLCAwLCAxNzUyXSRbMCwgLTE3NjksIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSVdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lXdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0hBRVhNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lYdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lXLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSVhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkzOSwgLTUyNCwgMzIyNSwgMTc2MV0kWy0zMTkxLCAtMTc2MSwgOTczLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JWWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lZdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JYy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JWS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0llT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JZE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lkZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgyMSwgLTUyNCwgLTI4ODcsIDE3NjFdJFsyODM2LCAtMTc2OSwgLTg3MiwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSWV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JZS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSW5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDZEMDA4OCIgc291cmNlPSJfSEFPSWpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSU9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSW9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSW5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JbnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjM1LCAtNTMzLCAyMTA4LCAxNzUyXSRbLTIxMjUsIC0xNzY5LCA2MTgsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lvLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lwdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSXAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgwNCwgLTUyNCwgMjc1MSwgMTc2MV0kWy0yNzQzLCAtMTc2OSwgODEyLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9Jck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JcnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9IQUVYTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9Jc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9Jci1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQzMSwgLTUyNCwgLTE0OTgsIDE3NjFdJFsxNDgxLCAtMTc2OSwgLTQ0OCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JdHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSXQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWHYtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSXVPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JdWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxODExXSRbMCwgLTE4MTEsIDAsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0l3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0hBT0lZLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfeGNaZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0l4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0l3ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSXd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjEyLCAtMzE4LCAxODUzLCA4MTc1XSRbMjEyLCAtMzgzNywgMTg1MywgNDY1Nl0kWy0xNTA4LCAtODE3NiwgMTMzLCAzMTddIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JeC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuODcwMDMyNTUsMC40NjU0MDg4KSIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBWDVJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIHNvdXJjZT0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0l5ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBWDVKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBWDVJZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFYNUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTQ1Nl0kWzAsIC0xNDY0LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1Si1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVLT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQVg1S2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9IQU9JeWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX3hjWmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQVg1TGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQVg1S3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBWDVLLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUyNCwgLTUyNCwgLTE0MDUsIDEzNTRdJFsxMzgwLCAtMTM1NCwgLTU1MCwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNU1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1TWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFYNU11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfR183Tnd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVPT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFYNU51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFYNU0tZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQVg1Tk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzLCAtNTI0LCA2NjAsIDE3NjFdJFstNjc3LCAtMTc2OSwgMTg2LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1T2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVPdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaE9mQXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0JGIj4KLSAgICAgICAgICA8Ym9keT4wMjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZEODU0NjAwRDgiIG5hbWU9IkJyZWFrZG93biI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HazlJZ09mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUYwNUVDRDAzOTAiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNUVDRDAzOTAiIHR5cGU9IkNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMU1qNU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjA4MiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFNajZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFNajYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFNajdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxTWo3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cxTWo0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFNajR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTIyMCIgeT0iMTA4NzkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMU1qOU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQ3MCIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0MnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMU1qOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMU1qOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODIzIiB5PSIxNTc5OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxVnQzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0NU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0NXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0Nk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDZ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzFWdDNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMVZ0M2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MjkxIiB5PSIxMzMxNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxOEsxZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEszZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEszLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEs0T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cxOEswdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxOEswLWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NDciIHk9IjE1Nzk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzE4SzVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEs2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEs3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEs3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLOE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMThLNHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxOEs0LWZYRWR1cUhvT0piVVJaUnciIHg9IjM4MDQiIHk9IjEzMzE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJGVXRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIyNjkiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMkZVc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlVzdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNjk5IiB5PSIxMDg3OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyRlV4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjc1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJGVXdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjY4MCIgeT0iMTMzMTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlVfT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMkZWQU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMkZVX2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVX3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQyMCIgeT0iMTU3OTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMlBGdU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc0MyIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRnZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRnYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRndlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZ3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyUEZ0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQRnR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3NjQiIHk9IjE0MjkxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJQRjlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEYtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEYtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGXy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMlBGOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEY4dWZYRWR1cUhvT0piVVJaUnciIHg9IjYwNTUiIHk9IjEwOTg0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJQR0JPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBHQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBHQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBHRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0QtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJQR0FlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBHQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NzYyIiB5PSI3MjEzIiB3aWR0aD0iMzg1OSIgaGVpZ2h0PSIxMjE5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJZMjJlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0MzgiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTIzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTI0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTI0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyNU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMlkyMXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTIxLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MjU2IiB5PSI3NTI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJZM0ZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5NDYiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUFvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUFvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUFwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBcC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMlkzRXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTNFLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMDA3IiB5PSI1NTQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJpQXZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBeGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXllZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJpQXUtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJpQXZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjI1NiIgeT0iMTE1OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyaUF6dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBMWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTJlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJpQXktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMmlBek9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTgxIiB5PSI4Mjg4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJpQTN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIxNTAiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeG9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4b2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4by1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnhwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4cGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnhwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4cC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnhxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4cWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4cXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMmlBMi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyaUEzT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1NTMzIiB5PSI1NzA2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4eHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJyeHl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4emVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4ei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4MGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4MC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeDFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJyeHgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeHlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMCIgeT0iMjgzNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeC11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cycnhfdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlCT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlDZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cycngtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnhfT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk3ODciIHk9IjMwMzkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlIT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMnJ5SU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTg2MiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlLLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cycnlIZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxOCIgeT0iMTAyMTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HazlJZ3VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIEJyZWFrZG93biBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGJyZWFrZG93biBlbGVtZW50cyB0aGF0IGZvcm0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGUgZGlhZ3JhbSBzaG93cyB0aGUgdGF4b25vbXkgb2YgdGhlIG1haW4gY2xhc3Nlcy4gIEl0IHByZXNlbnQgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0eSBhbmQgRGVzY3JpcHRvciBhcyB3ZWxsIGFzIHRoZWlyIGtleSByZWxhdGlvbnNoaXBzIGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzFWdDYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzFWdDItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMVZ0Ny1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzFWdDdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMVZ0N2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTIsIC00NTcsIDAsIDIwODJdJFsxNTIsIC0yMDkxLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cxVnQ4dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMVZ0OC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cxeVp3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciIHNvdXJjZT0iX0cxTWo4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxVnQyLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlady1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzF5WnhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVp5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1MCIgeT0iNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5Wnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzF5WnktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcwIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVp6dWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NiIgeT0iMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WjBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVowZWZYRWR1cUhvT0piVVJaUnciIHg9IjY0IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4S3hPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4S3lPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLME9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLenVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzF5WndlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMXlad3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTU4LCAtNTAsIDE5MzBdJFswLCAtMjA0MCwgLTUwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMThLOGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HMThLMGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMThLNGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxOEs5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLLWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDgiIHk9IjQ1MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEstLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S19lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEtfT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03MiIgeT0iLTM0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEtfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzYiIHk9IjIwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OSIgeT0iLTM0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOExCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExCZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOExDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExDZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4TEQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TERlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4TEUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TEVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cxOEs4dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzE4SzgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzcyLCAtNTU4LCAtNjQzLCAxOTMwXSRbMzcyLCAtMjA0OCwgLTY0MywgNDQwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJGVTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzJGVXdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJGVTBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyRlUwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01ODQsIC00NTcsIDI3MTcsIDIwODJdJFstMjcxNywgLTIwOTEsIDU4NCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMkZVMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJGVTJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMkZVMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBzb3VyY2U9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMkZVc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlUzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVNGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NCIgeT0iLTEzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgzIiB5PSIxMTA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNjgiIHk9Ii0xMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzIiIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlU5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlUtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlUtZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMkZVMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyRlUyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzczNiwgLTQ0OCwgLTUzMywgMjA5MV0kWzczNiwgLTIwOTEsIC01MzMsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyRlZET2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIHNvdXJjZT0iX0cyRlVfT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVkVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2NCIgeT0iNDA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY0IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNyIgeT0iMTk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZIZWZYRWR1cUhvT0piVVJaUnciIHg9IjU5IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVklPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWS3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWS09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJGVkRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMkZWRHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjQ1LCAtNTY3LCA2MTgsIDE5MjFdJFstMjQ1LCAtMjA0OCwgNjE4LCA0NDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlBGeE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIiBzb3VyY2U9Il9HMlBGdE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMkZVX09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEZ5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGek9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTc5IiB5PSItMjMwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRnotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA5IiB5PSI2NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEYxZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTg3IiB5PSItMzU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRjN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJQRnhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlBGeHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDMsIDQ5MSwgMzg1MiwgLTEwODNdJFsxNDMsIDEyOTUsIDM4NTIsIC0yNzldJFstMTcwMSwgMTI5NSwgMjAwNiwgLTI3OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyUEY1LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUY5NEFCOTAwMTUiIHNvdXJjZT0iX0cyUEZ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQRjYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyUEY2T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlBGNmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTM4MCwgLTI4NywgMzE5MSwgNjI2XSRbLTMyMzQsIC02NjAsIDEzMzcsIDI1NF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJQRjd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyUEY3LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJQR0VPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQRjhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEdGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjMzOCIgeT0iLTc3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEdHT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01MzgiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEdHLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0MyIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEdIdWZYRWR1cUhvT0piVVJaUnciIHg9IjUzOSIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJzZWZYRWR1cUhvT0piVVJaUnciIHg9IjY1IiB5PSItMTI1MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJ0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJ1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMnZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMnZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMnd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMndPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyUEdFZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJQR0V1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MTgsIDM4MSwgMTkzOCwgLTMxMjRdJFstNDEwNiwgMzgxLCAtNDQ4LCAtMzEyNF0kWy00MTA2LCAzMDU2LCAtNDQ4LCAtNDQ4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJZMnctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkyeC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJZMnhPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyWTJ4ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1MiwgLTQ1NywgLTEwNjYsIDMwNDhdJFs5OTksIC0yODk1LCAtMjIwLCA2MDldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTJ5dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyeS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyWTJ6T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0cyRlVzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZMjBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyWTJ6ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlkyenVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDQwLCAtNDU3LCAyOTEyLCAzMDQ4XSRbLTI3NjgsIC0yODk1LCA1ODQsIDYwOV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZMjAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTIxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJZMjVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSIgc291cmNlPSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJZMjFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkyNmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTI3ZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTI4T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTEiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNjkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMjgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI4NyIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNjkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTI5dWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MzAiIHk9IjMxMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTItT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTItLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTItZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNjkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZM0EtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZM0FlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNjkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZM0ItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZM0JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyWTI1dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJZMjUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTcxOCwgMTUyLCAtNDI3NSwgMF0kWzQ3NzUsIDE1MiwgLTEyMTksIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlkzQ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HMThLNGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTNET2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlkzQ2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJZM0N1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjE4LCAtNDU3LCAtMjk4OCwgMjA4Ml0kWzI5NDYsIC0yMDkxLCAtNjYwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTNELWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkzRU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyaUFxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyWTNFZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJpQXJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyaUFxZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMmlBcXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNjE4LCAwLCAxMjEwXSRbMCwgLTEzODAsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJpQXItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyaUFzT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJpQXNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRUY5MDBFMiIgc291cmNlPSJfRzJZMjFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJZM0VlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMmlBdGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJpQXN1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyaUFzLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjI3LCAtNDIzLCA0NzY2LCAxNTU3XSRbLTQ2MjIsIC0xNTMyLCAxMzcxLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyaUF1T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMmlBdWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnhxLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ2RDAwODgiIHNvdXJjZT0iX0cyaUEydWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyWTNFZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4cnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4c2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeHItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnhyT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4cmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTA4MywgLTE1MiwgNDc1OCwgNjA5XSRbLTQzNjgsIC01NzUsIDE0NzMsIDE4Nl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnhzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeHRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4dU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeHRlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnh0dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzcsIC00NTcsIDIzMDIsIDQ2NzNdJFstMjMyOCwgLTQ2ODIsIDIxMSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4dS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4dmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnh3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4dnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnh2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkxNCwgLTQ0OCwgLTY0NTEsIDQ2NV0kWzkxNCwgLTEyNzgsIC02NDUxLCAtMzY0XSRbNTY0NywgLTEyNzgsIC0xNzE4LCAtMzY0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4eE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4MXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBzb3VyY2U9Il9HMnJ4eHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBdXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4Mi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycngydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4MS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycngyT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0MjIsIC01MjQsIC0zMzAyLCAxMTUxXSRbMzMwMiwgLTExODUsIC0xNDIyLCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycngzZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4M3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycngzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0cyUEY4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4NWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeDQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycng0T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4NGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjQzLCAtNDU3LCAzMDY0LCAyMTMzXSRbLTMwNzMsIC0yMTQyLCA2MzUsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycng1LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeDZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRzJQRjhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJyeHh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4N09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeDZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4NnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTUyLCAtMTMyLCA0MzkyLCA3OTExXSRbLTY1MzUsIC0xMzIsIC0xMTkxLCA3OTExXSRbLTY1MzUsIC03NzI1LCAtMTE5MSwgMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4Ny1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4OGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9HMThLMGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMnJ4eHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycng5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4OHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycng4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMTE3LCAtMjEyLCA5MjYsIDEyOTM4XSRbLTUyMTMsIC0yMTIsIC0yMTcwLCAxMjkzOF0kWy01MjEzLCAtMTMyNTYsIC0yMTcwLCAtMTA2XSRbLTQ1NzgsIC0xMzI1NiwgLTE1MzUsIC0xMDZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycngtT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4LWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnlDdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIHNvdXJjZT0iX0cyWTNFZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cycngtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5RU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeUR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnlDLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeURPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ0OCwgLTEwMSwgMTk4OV0kWzAsIC0xOTMwLCAtMTAxLCA1MDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnlFZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ5RXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnlFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0cycngtdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyaUF1dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeUYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnlGT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeUZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwNzUsIC01MjQsIDI4MzYsIDEzNTRdJFstMjgzNiwgLTEzNjMsIDEwNzUsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeUd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnlHLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeUxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzJyeUhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaW91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeUxlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnlMdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMCwgLTQ1NywgLTc0NSwgMTQ3M10kWzcyOCwgLTE0ODEsIC0yMzcsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzIxaXBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyMWlwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNUM1MTMwMjAzIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93blN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWlwLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ7SXRlcmF0aW9uLnByZWZpeCA9ICZxdW90O0l0ZXJhdGlvbiZxdW90O30mI3hBOyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwOTIxIiB5PSIxMzg1OSIgd2lkdGg9IjMxNzUiIGhlaWdodD0iMTI0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpck9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ie1BoYXNlLnByZWZpeCA9ICZxdW90O1BoYXNlJnF1b3Q7fSYjeEE7IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaXJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc3NTQiIHk9IjEzODU5IiB3aWR0aD0iMjgwMiIgaGVpZ2h0PSIxMjQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzIxaXRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMjFpdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMjFpdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMjFpdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzIxaXYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzIxaXNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTU4MSIgeT0iMTIwNTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMjFpeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1za09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1za3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zbWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWl3dWZYRWR1cUhvT0piVVJaUnciIHg9IjE5MTUxIiB5PSIxMjEwNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc211ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyLXNudWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc28tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3BlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3AtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNxZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXNtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc25PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM3NzUiIHk9IjgxNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zcnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zdWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zcS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXNyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0MTkwIiB5PSIxMzkzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyLXN2dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN5ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXN1LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc3ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzNTEiIHk9IjExNzAwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zN2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzItczhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItcy1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItcy0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc19PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItczd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zNy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTY1OCIgeT0iNzAyNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc19lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czSWRrZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lka3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRW51bWVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNJZGwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNJZG1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNJZG0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItc191ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NDU5IiB5PSIxMjM0NyIgd2lkdGg9IjMyMzQiIGhlaWdodD0iMjcxNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5pdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czUm5pLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5qLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbmtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbmt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5rLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbmxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5sZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5sdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czUm5pT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbmllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkxMjYiIHk9IjgxMzYiIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjIxMTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM1JucmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5zLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm50ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm50LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm51T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czUm5xdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBzaG93TGlzdFNpZ25hdHVyZT0idHJ1ZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5xLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2ODE0IiB5PSIxODg4IiB3aWR0aD0iNzUyNiIgaGVpZ2h0PSIyODI3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNiWXdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM2JZdnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYll2LWZYRWR1cUhvT0piVVJaUnciIHg9IjQzNjAiIHk9IjEwMzYzIiB3aWR0aD0iNzIzMCIgaGVpZ2h0PSIxNTI0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNiWTBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlkxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlkyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlkydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZM09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM2JZenVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2JZei1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NjY0IiB5PSIzNzUwIiB3aWR0aD0iNTk0MyIgaGVpZ2h0PSIyMzUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xHU1llZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdmlldyBvbiBCcmVha2Rvd24gRWxlbWVudHMgZnJvbSBhIHdvcmsgYnJlYWtkb3duIHBlcnNwZWN0aXZlIGNhbGxlZCBXQlMgKFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSkgdGhhdCBpbmNsdWRlcyBUYXNrcyBhbmQgQWN0aXZpdGllcyAoYnV0IGFsc28gdGhlIG5vdGlvbiBvZiBNaWxlc3RvbmVzIHRoYXQgZG8gbm90IHJlcHJlc2VudCB3b3JrKS4gIFVNQSBhbHNvIGRlZmluZXMgdHdvIG1vcmUgdmlld3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBhcyBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSBhbmQgVGVhbSBQcm9maWxlIEJyZWFrZG93biBTdHJ1Y3R1cmUuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyLXN5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiIHNvdXJjZT0iX0cyLXNxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyLXN1dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc3p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMwdWZYRWR1cUhvT0piVVJaUnciIHg9IjI0NCIgeT0iNDA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwMyIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1IiB5PSIyMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczItZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTgiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zM3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zNU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zNHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXM1dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXM2dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMi1zeS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyLXN6T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMywgLTU1OCwgMTYsIDI1OTBdJFstMzMsIC0yNjU4LCAxNiwgNDkxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNJZG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0cyMWlxLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyMWl3T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM0lkbmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNJZG51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTYyNiwgMCwgMTI1M10kWzAsIC0xMzg4LCAwLCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5nT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuZ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm5ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9HMjFpcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMjFpc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbmctZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm5oT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNSwgLTYyNiwgMjUsIDEzMDNdJFstNDIsIC0xNDM5LCA4LCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5oZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm5sLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0cyMWlzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JubXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JubmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm5tT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JubWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjg3LCAtNDk5LCAxNjQyLCAyODUzXSRbLTEzMjksIC0yMjk0LCA2MDEsIDEwNThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5udWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1Jubi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm5vT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0cyMWl3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbnBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm5vZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1Jub3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODYsIC00OTksIC0xMTg1LCAyOTA0XSRbOTM5LCAtMjM0NSwgLTQzMSwgMTA1OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbnAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5xT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbnVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgc291cmNlPSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm52T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm52LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm52ZWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0OCIgeT0iLTI3ODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jud09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jud3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1Jud2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjQiIHk9Ii01NzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Judy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm54ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JueE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQ5IiB5PSItNTA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm54LWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NTYiIHk9Ii0yNDEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JueXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ1IiB5PSIzMzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1Juei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JuMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm4xLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm4xZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm4yLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm4yZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1JudXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm51LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3NTcsIC02NjIsIDM3NTcsIC02NjJdJFs2MTM4LCAtNjYyLCA2MTM4LCAtNjYyXSRbNjEzOCwgLTIzMjksIDYxMzgsIC0yMzI5XSRbNTAyLCAtMjMyOSwgNTAyLCAtMjMyOV0kWzUwMiwgLTE0MjksIDUwMiwgLTE0MjldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1JuM09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HMi1zbXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm40T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1JuM2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbjN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTE2LCAtNDk5LCAtNTI3NCwgNDgzNF0kWzQyMzMsIC0zOTIwLCAtMTU1NywgMTQxM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbjQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm41T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbjVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm42T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm42LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm42ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NjMiIHk9IjkyMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm43T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm43ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjg0IiB5PSIzMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllndWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMjkiIHk9Ii0yNzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQxMCIgeT0iLTI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlloLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllpT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyMyIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWWplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWWtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbjV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JuNS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzU3LCA4MjAsIDM4MTAsIC01MDU0XSRbNjgyNiwgODIwLCA2ODc5LCAtNTA1NF0kWzY4MjYsIDU3OTQsIDY4NzksIC04MF0kWzEzNDksIDU3OTQsIDE0MDIsIC04MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czYlltdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiIHNvdXJjZT0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlluLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNiWW51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllvdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDkiIHk9IjU0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1MyIgeT0iNTMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDI4IiB5PSItMzI2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZdU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZdHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZdk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNiWW0tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2JZbk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzc1NywgLTc2NywgLTM3NTcsIC03NjddJFstNTEwNywgLTc2NywgLTUxMDcsIC03NjddJFstNTEwNywgLTIzMjksIC01MTA3LCAtMjMyOV0kWy04NDcsIC0yMzI5LCAtODQ3LCAtMjMyOV0kWy04NDcsIC0xNDI5LCAtODQ3LCAtMTQyOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czYlkzZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiIHNvdXJjZT0iX0czYll2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNiWTRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk1ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjYiIHk9IjE0NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1OCIgeT0iLTE2MjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcwIiB5PSIyNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZN3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTMiIHk9Ii01MDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZOS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlktdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlktLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlktZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllfZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2JZM3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czYlkzLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTg1LCAtNzYyLCAtMTg0NSwgNTQzNV0kWy0xMTg1LCAtNTAyMCwgLTE4NDUsIDExNzZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIiBzb3VyY2U9Il9HM2JZdmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSmhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUwIiB5PSIxMDI2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2OCIgeT0iLTE3NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEppdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIzNCIgeT0iMTc3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKanVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTQiIHk9Ii0xNTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjkiIHk9IjYzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEprLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEpsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEpsT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEptZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEptdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEptT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNsSm51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSm5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNsSm91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSm9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czbEpnZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSmd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzk3LCAtNzYyLCAtMjYyLCA1NDM1XSRbMzk3LCAtNTAyOSwgLTI2MiwgMTE2OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czbEpvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0cyLXN1dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyLXNtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czbEpwT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC00OTksIC0yNSwgMzA1Nl0kWzI1LCAtMzA3MywgLTI1LCA0ODJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEpxdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKcS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czbEpyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0cyLXN1dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czbEpyZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKcnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDE0LCAtNDk5LCA1NjgxLCA2NzY0XSRbLTUxMDUsIC02MDg3LCA5OTAsIDExNzZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEpzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czbEp0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czbEp0dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKdC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQwNSwgLTUxNiwgMTA0ODEsIDM3NTBdJFstODkxNSwgLTMyMDAsIDI5NzEsIDEwNjZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKdmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czbEp2dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czbEp2LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKd09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyOTcxLCAtNDA2LCAtODk2NiwgMTIxOV0kWzgxNzAsIC0xMTE3LCAtMzc2NywgNTA4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKeGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKeC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HMi1zN2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEp5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKeU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc1MywgLTQ5OSwgMzIwOCwgMjA5MV0kWy0yMTU5LCAtMTQxMywgMTgwMywgMTE3Nl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp6LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNUYxRTgwMjgzIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGVhbUJyZWFrZG93blN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0czdVRjZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ7Um9sZURlc2NyaXB0b3IubW9kaWZpZXMgPSBSb2xlLnBlcmZvcm1zQXNPd25lci5vdXRwdXQgdW5pb24gUm9sZS5wZXJmb3Jtc0FkZGl0aW9uYWxseS5vdXRwdXQgdW5pb24gUm9sZS5hc3Npc3RzSW4ub3V0cHV0fSIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVRjdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNzI2IiB5PSIxNzM3MCIgd2lkdGg9IjYxNDciIGhlaWdodD0iMTg1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czdVRlZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRmLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRoT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czdVRkdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VGQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ5NzciIHk9Ijg4OTAiIHdpZHRoPSIyODYxIiBoZWlnaHQ9IjE3MzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM3VUaWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNzU4NiIgaGVpZ2h0PSIyNjQxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRsT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czdVRodWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VGgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk5MiIgeT0iNDA2NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czNEVqZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RW1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzM0RWl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMzRFaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTcwNSIgeT0iMTI5NTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMzRFcHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFc2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMzRFby1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEVwT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY2OTciIHk9Ijg1NTkiIHdpZHRoPSIyNzMyIiBoZWlnaHQ9IjIxODQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNEIxZmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxaC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxaU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNEIxZXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjFlLWZYRWR1cUhvT0piVVJaUnciIHg9IjU3MjYiIHk9IjEzMjE2IiB3aWR0aD0iMzE0NiIgaGVpZ2h0PSIyNDI5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRCMkJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIyQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIyQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX1lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX1l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX1ktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRCMkFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIyQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAwIiB5PSIxNTYyOSIgd2lkdGg9IjM3OTMiIGhlaWdodD0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX1pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0S19hT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2ItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19jT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19jdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19jLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0S19aZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRLX1p1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDEzMSIgeT0iMTczMzEiIHdpZHRoPSI0MjMzIiBoZWlnaHQ9IjEzMDMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbEdTWS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSB2aWV3IG9uIGEgcHJvY2VzcyBmcm9tIGEgVGVhbSBhbmQgUm9sZSBwZXJzcGVjdGl2ZSBjYWxsZWQgVEJTIChUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUpLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM3VUbGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1IiBzb3VyY2U9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVRtZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUbmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzc4IiB5PSIzODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUb09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDk1IiB5PSIzOTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VG8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNTMiIHk9IjE5MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRwdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzUiIHk9Ii0yNzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUcmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVR0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVR0ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM3VUbHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czdVRsLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNzI1LCAtMjYsIC0yNzI1LCAtMjZdJFstNTY4OCwgLTI2LCAtNTY4OCwgLTI2XSRbLTU2ODgsIC0yOTM3LCAtNTY4OCwgLTI5MzddJFstMTU4NywgLTI5MzcsIC0xNTg3LCAtMjkzN10kWy0xNTg3LCAtMTA1OCwgLTE1ODcsIC0xMDU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzN1VHVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzN1VGRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUdk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzN1VHVlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czdVR1dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzEsIC04NzIsIDM2OTEsIDM0OTZdJFstMzIzNCwgLTMwNDgsIDEzODgsIDEzMjBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czdVR2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM3VUd09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czdVR3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiIHNvdXJjZT0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VHhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVR5ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NDUiIHk9Ii00MjciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTkwIiB5PSIyODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNTkiIHk9Ii0yMDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzUiIHk9IjIyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVmT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVmdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czdVR3dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzN1VHctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjY5OSwgLTI2LCAyNjk5LCAtMjZdJFs1ODc0LCAtMjYsIDU4NzQsIC0yNl0kWzU4NzQsIC0yOTYzLCA1ODc0LCAtMjk2M10kWzE0MDIsIC0yOTYzLCAxNDAyLCAtMjk2M10kWzE0MDIsIC0xMDU4LCAxNDAyLCAtMTA1OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czNEVtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzM0RW5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czNEVtdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzM0RW0tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMxMywgLTg3MiwgMTEwOSwgMzE5MV0kWy0xMTM0LCAtMzIwMCwgMjg3LCA4NjNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czNEVvT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMzRFb2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czNEVzdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIHNvdXJjZT0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzM0RXR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV1dWZYRWR1cUhvT0piVVJaUnciIHg9IjQzNiIgeT0iMjM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzE0IiB5PSItMzMzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV3T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNjAiIHk9IjI0MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV3LWZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFME9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFenVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RTBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFMU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFMHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzM0RXMtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMzRFdE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE3NiwgNDIsIC0xMTc2LCA0Ml0kWy0yNTczLCA0MiwgLTI1NzMsIDQyXSRbLTI1NzMsIC0xNzYxLCAtMjU3MywgLTE3NjFdJFstNTAsIC0xNzYxLCAtNTAsIC0xNzYxXSRbLTUwLCAtMTA5MiwgLTUwLCAtMTA5Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjFjT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjFjZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxY3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5OTksIC0xMTAwLCAtMjkxMiwgMzE2Nl0kWzI2ODMsIC0yOTQ2LCAtMTIyNywgMTMyMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMWQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjFlT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMWllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSIgc291cmNlPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzM0RWllZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjFqZWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3IiB5PSItMzIzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMWtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY3MiIgeT0iLTE5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMWxPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc3IiB5PSIyOTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMWwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODI0IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMW11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0NiIgeT0iMzM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMW4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMW5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMW8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMW9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMWl1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxaS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzk3LCAtOTU2LCAtODk2NiwgLTM0N10kWzgyMzgsIC05NTYsIC0yMTI1LCAtMzQ3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMXJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyIgc291cmNlPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzM0RWllZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjFzT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01MzciIHk9Ii0xOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODY4IiB5PSItMzc2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDUwIiB5PSItMzgxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF1dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzgiIHk9IjE1OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF2ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzciIHk9Ii05NzMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxd3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxd09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxeHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxeE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjF5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF5T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjF6dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF6T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxcmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjFydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzLCAxMjEwLCAtMTAyNzAsIDE4MjBdJFs5MywgMjA1NywgLTEwMjcwLCAyNjY3XSRbOTI3OSwgMjA1NywgLTEwODMsIDI2NjddJFs5Mjc5LCAyNTQsIC0xMDgzLCA4NjNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfRzN1VGNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRCMXJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjEwT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxMGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODcyLCAtMTE1OSwgMTAyNCwgMTM1NF0kWy0xODk2LCAtMjUxNCwgMCwgMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjEwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMTFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjExLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjEydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxMk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMTFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjExdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEwMzIsIC0xMjE5LCAtNzkwNywgMzQ1NF0kWzQwMjEsIC00NjU2LCAtNDkxOSwgMTZdJFs3NTAxLCAtNDY3MywgLTE0MzksIDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjEyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxM09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjEzZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMTRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE1ZWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NiIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODMiIHk9Ii0xMTA5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE2LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTAiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxN3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTYiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxOS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjEtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjEtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjEtZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFfZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxM3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjEzLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzLCAtMTIxMCwgLTMxMywgMzU2NF0kWzkzLCAtMzY4MywgLTMxMywgMTA5Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0S19kT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIHNvdXJjZT0iX0c0S19aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRLX2VPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19mT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIxMCIgeT0iLTM3NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19mdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19mLWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MCIgeT0iLTM0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUzIiB5PSItMzYxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19oZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg0IiB5PSItMzM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2l1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2lPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfa09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRLX2RlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEtfZHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjAsIC02NjAsIC05OTksIDI4OTVdJFs3ODcsIC0yMzQ1LCAtNDMxLCAxMjEwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRLX2wtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCIgc291cmNlPSJfRzRCMkFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRLX1pPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19uZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEtfbS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX24tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNCIgeT0iLTI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19vZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19vdWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19wZWZYRWR1cUhvT0piVVJaUnciIHg9IjIzNiIgeT0iLTI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19xT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDkzIiB5PSIzODEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfci1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S190T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S190ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19zLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S191ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S190LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEtfbU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0S19tZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MDgsIDUyNCwgLTM3NTksIC0xMzAzXSRbLTUwOCwgMTkxMywgLTM3NTksIDg0XSRbMTEzNCwgMTkxMywgLTIxMTYsIDg0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRLX3V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjk0QUI5MDAxNSIgc291cmNlPSJfRzRCMkFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S192ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S193T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEtfdnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRLX3UtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0S192T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNDYsIC01MzMsIC0zMTI0LCAxMTkzXSRbMzA2NCwgLTExOTMsIC0xNDA1LCA1MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0S193ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEtfd3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVDMzBGMDAyNiIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0QnJlYWtkb3duU3RydWN0dXJlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNFV3Wk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3YU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3YXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Yk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3YnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3Yi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNFV3WWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXdZdWZYRWR1cUhvT0piVVJaUnciIHg9IjYzNjYiIHk9IjU5MjMiIGhlaWdodD0iOTU0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Y09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRVd2RPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3ZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3ZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3ZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2YtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRVd2NlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNFV3Y3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MTg5IiB5PSIxMzY5OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0VXdoT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3aWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3aS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3amVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2otZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRVd2dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNFV3Z3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MTQzIiB5PSIxMDMyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0ZDZmZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZoZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZoLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZpT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0ZDZldWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNmUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUwODciIHk9IjEzMTgyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRkNnVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjczNjYiIGhlaWdodD0iMjQzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZ2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2di1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZ3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2d2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZ3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2eE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNGQ2dHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZ0LWZYRWR1cUhvT0piVVJaUnciIHg9IjM3MzMiIHk9IjIzODciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEWWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSB2aWV3IG9uIGEgcHJvY2VzcyBmcm9tIGEgV29yayBQcm9kdWN0IHBlcnNwZWN0aXZlIGNhbGxlZCBXUEJTIChXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSkuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0VXdrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNFV3bE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA4MiIgeT0iMjQyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd21lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd21PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5OCIgeT0iLTI5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd20tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzEiIHk9IjI4MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXduZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd24tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3bnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTYxIiB5PSItOTk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd291ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd29lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTk3IiB5PSItNzYxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3BPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3cnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3ck9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3c3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3c09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRVd2tlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNFV3a3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTgyMCwgLTg0NiwgLTE4MjAsIC04NDZdJFstMTgyMCwgLTE5NzIsIC0xODIwLCAtMTk3Ml0kWy02MTg5LCAtMTk3MiwgLTYxODksIC0xOTcyXSRbLTYxODksIDAsIC02MTg5LCAwXSRbLTIxOTIsIDAsIC0yMTkyLCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRVd3MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCIgc291cmNlPSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXd0LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTgiIHk9IjMwMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTEiIHk9Ii0zMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd2dWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MDUiIHk9IjI5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3d2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUyOCIgeT0iMjkxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3hPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc2MCIgeT0iLTI1MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXd5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd4LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXd6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3enVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVdzBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVdzBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3otZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXcwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXcxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVdzFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVdzAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0VXd0T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRVd3RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIyMiwgLTIxMSwgMjIyMiwgLTIxMV0kWzU5ODAsIC0yMTEsIDU5ODAsIC0yMTFdJFs1OTgwLCAtMjA4NywgNTk4MCwgLTIwODddJFs5NTIsIC0yMDg3LCA5NTIsIC0yMDg3XSRbOTUyLCAtNjg4LCA5NTIsIC02ODhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNFV3MXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3WU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNFV3MS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0VXcyT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02MDksIC02ODgsIC03NjgsIDM5NDJdJFstNjA5LCAtNDE1NCwgLTc2OCwgNDc2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNGQ2Vk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNlZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNGQ2VnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBzb3VyY2U9Il9HNFV3Y09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2WHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjkiIHk9Ii00ODIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2WWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUzIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZaT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDQiIHk9Ii0yODMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYxIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2ZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2Y3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2ZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2ZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNlYtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0ZDZXT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NzUsIDAsIDM5OTZdJFswLCAtMzcyNSwgMCwgODQ2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNmllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgc291cmNlPSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNmVlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZqZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NDgiIHk9Ii00NDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2a09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2a3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2a2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDMiIHk9Ii0yNzMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZsT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03NzEiIHk9IjU1MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2bC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTUiIHk9IjI5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MjciIHk9Ii0yOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2bi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2bmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2by1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2b2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2cU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2cXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNGQ2aXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRkNmktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTc5NCwgODQ2LCAtNzI0NywgLTE2NDJdJFs1MjgzLCAyNDgwLCAtMzc1OSwgLThdJFs3NjYyLCAyNDgwLCAtMTM4MCwgLThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNGQ2ck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HNGQ2ZWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3WU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNGQ2cmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0ZDZydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03OSwgLTMxNywgODk5NiwgNjQzMF0kWy03OSwgLTY3NzMsIDg5OTYsIC0yNl0kWy03OTM4LCAtNjc3MywgMTEzNywgLTI2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNGQ2cy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNnRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNGQ2eGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1IiBzb3VyY2U9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZ5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2enVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2emVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjgxIiB5PSI3NjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ei1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2ME9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjUwIiB5PSI1MDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ1OCIgeT0iMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg0IiB5PSItMzMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDY0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2NC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2NGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2NS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2NWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNnh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2eC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzY4MywgLTQ3NCwgLTM2ODMsIC00NzRdJFstNTExMywgLTQ3NCwgLTUxMTMsIC00NzRdJFstNTExMywgLTIxNDIsIC01MTEzLCAtMjE0Ml0kWy0xNzYxLCAtMjE0MiwgLTE3NjEsIC0yMTQyXSRbLTE3NjEsIC0xMjE5LCAtMTc2MSwgLTEyMTldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNG5yVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNFV3WU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNG5yVWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0bnJVdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00OTksIC01MCwgMzAwNV0kWzAsIC0yMjg2LCAtNTAsIDEyMTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0bnJWLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNG5yV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0bnJXZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiIHNvdXJjZT0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRuclhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJZZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05OSIgeT0iLTczNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJaT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5MTkiIHk9IjczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJaLWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MzUiIHk9Ii0yMzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yYXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDAiIHk9IjI4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJiLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJiZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJjLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJjZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0bnJXdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRuclctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzY4MywgLTMwNCwgMzY4MywgLTMwNF0kWzQ3MzIsIC0zMDQsIDQ3MzIsIC0zMDRdJFs0NzMyLCAtMjEwOCwgNDczMiwgLTIxMDhdJFsxMjcwLCAtMjEwOCwgMTI3MCwgLTIxMDhdJFsxMjcwLCAtMTIxOSwgMTI3MCwgLTEyMTldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDMUNFMzAzRDMiIHR5cGU9IkNsYXNzIiBuYW1lPSJUZWFtQnJlYWtkb3duU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRucmdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yaWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucml1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRucmZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTcwOSIgeT0iNjc3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yak9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRucmtPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIwODIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ya3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ybE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ybHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ybU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ybXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5ybS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNG5yamVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJqdWZYRWR1cUhvT0piVVJaUnciIHg9IjYxNzIiIHk9IjE3ODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNG5ycWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNWT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjV09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNG5ycHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJwLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMjY4IiB5PSIzNjY2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjaGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzR4Y2llZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhja09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhja3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2xPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzR4Y2h1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjaC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTI2IiB5PSIzNjY2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjd2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzR4Y3hlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NDMiIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN6dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjei1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjME9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNHhjd3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGN3LWZYRWR1cUhvT0piVVJaUnciIHg9IjU5NDMiIHk9IjY3MjIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNHhjM3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGM0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGM1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGM1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNHhjMi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGMzT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwOTIiIHk9IjUxMzAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEWS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGEgc2ltcGxpZmllZCB2aWV3IG9uIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgb25seSB0aGUga2V5IGNsYXNzZXMgYW5kIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0bnJuT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c0bnJqT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJmT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ybi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRucm9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0bnJuZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNG5ybnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDQxLCAtMTg2LCAtNTE1NiwgODgwXSRbNDQ4NywgLTc3OCwgLTE3MTAsIDI4N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRucm8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0bnJwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4Y1dlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiIgc291cmNlPSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y1llZlhFZHVxSG9PSmJVUlpSdyIgeD0iODA2IiB5PSIyODMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNaT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcxNCIgeT0iLTkzMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzg0IiB5PSIzMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjYXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTUiIHk9Ii0zMDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjYmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjY2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNkZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNlZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjV3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGNXLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNDMsIDAsIDExNDMsIDBdJFsyNjQxLCAwLCAyNjQxLCAwXSRbMjY0MSwgMTkxMywgMjY0MSwgMTkxM10kWzAsIDE5MTMsIDAsIDE5MTNdJFswLCA0NDgsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJmT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGNmZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNHhjZnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAyNDg5XSRbMCwgLTI0NTUsIDAsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y2ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGNoT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4Y2xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucmpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjbWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4Y2x1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNHhjbC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC00NDgsIDAsIDE0MzBdJFstNTAsIC0xNDMwLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGNuT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjbmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNudWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y291ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNwdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOSIgeT0iMjM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjcWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjIiIHk9Ii0yOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA0IiB5PSItMTg5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNyLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2OSIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGN0dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3ZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3V1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3dPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGNuLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNHhjb09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzM3LCAwLCAtNDgwOSwgMF0kWzQ5OTUsIDAsIC0xMTUxLCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4YzBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjk0QUI5MDAxNSIgc291cmNlPSJfRzR4Y3dlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4YzB1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNHhjMC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC00OTksIDAsIDI1OTldJFstNTAsIC0yNjUwLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGMyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjMmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGM2dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIHNvdXJjZT0iX0c0eGMydWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1RdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzQ2bVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1ST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1SZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzUiIHk9IjQwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1SLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1TT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDIiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1UT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzkxIiB5PSIyOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA0IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bVUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1WT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bVYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1XT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4YzYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNHhjN09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzMsIC0zMTcsIC01NTI5LCAxMTM4XSRbMTMzLCAtMTYxMywgLTU1MjksIC0xNThdJFs0MTI4LCAtMTYxMywgLTE1MzQsIC0xNThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNDZtWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIiBzb3VyY2U9Il9HNHhjd2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNHhjMnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0Nm1aT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDY4IiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNiIgeT0iMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1idWZYRWR1cUhvT0piVVJaUnciIHg9IjMiIHk9Ii0xNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MCIgeT0iMTQ3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1kdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1kT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1ldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1mLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0Nm1ZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzQ2bVl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE1MzUsIDAsIDQxNTQsIDE2MTRdJFstNTU1NiwgMCwgMTMzLCAxNjE0XSRbLTU1NTYsIC0xMjk2LCAxMzMsIDMxOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMUM0NjFDMDJGNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0QnJlYWtkb3duU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzQ2bWgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1pT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZta09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWt1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzQ2bWhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzA3IiB5PSI5NzMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1rLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNDZtbC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhRLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhSZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhSLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYU2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNDZtbE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0Nm1sZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTYiIHk9IjMxMTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNUVYVi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhYZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhZZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhZdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1RVhWT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWFZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDA5NyIgeT0iNTQ2OSIgd2lkdGg9IjQ5MTkiIGhlaWdodD0iMjE3NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1RVhyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVh1T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1RVhxdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWHEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTA3MSIgeT0iMTExNDIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEWmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGEgc2ltcGxpZmllZCB2aWV3IG9uIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSBvbmx5IHRoZSBrZXkgY2xhc3NlcyBhbmQgcmVsYXRpb25zaGlwcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVFWFN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzQ2bWstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzQ2bWctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYVHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVFWFMtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1RVhUT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00OTksIDAsIDE2MzRdJFswLCAtMTYzNCwgMCwgNDk5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNUVYVWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVFWFV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWFotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE3IiB5PSIxMDYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzA3IiB5PSI2ODMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhidWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjYxIiB5PSI3OTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkyNyIgeT0iMjkyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzOCIgeT0iLTI4MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhlLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWGdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWGhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVhaT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVFWFplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjQ2MCwgLTgwLCAyNDYwLCAtODBdJFs0OTc0LCAtODAsIDQ5NzQsIC04MF0kWzQ5NzQsIDI0MDcsIDQ5NzQsIDI0MDddJFsxNTg3LCAyNDA3LCAxNTg3LCAyNDA3XSRbMTU4NywgMTA4NSwgMTU4NywgMTA4NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1RVhodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIHNvdXJjZT0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYaXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMzOCIgeT0iLTMxMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhqdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2OSIgeT0iMjU5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjkiIHk9Ii0zMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGxPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgxMyIgeT0iMTY2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQzIiB5PSI3MzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYbXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYb09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYbnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhvdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhwdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNUVYaC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1RVhpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODM3LCAxMDgzLCAtMTgzNywgMTA4M10kWy0xODM3LCAyMzYyLCAtMTgzNywgMjM2Ml0kWy00MDIxLCAyMzYyLCAtNDAyMSwgMjM2Ml0kWy00MDIxLCAtMjM3LCAtNDAyMSwgLTIzN10kWy0yNDU1LCAtMjM3LCAtMjQ1NSwgLTIzN10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1RVh1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIHNvdXJjZT0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1RVhxZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMSIgeT0iLTY0MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVh3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSIxOTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVh4T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMyIgeT0iLTc0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYeC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDciIHk9Ii0yMDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYeXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTgiIHk9IjEyMDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVgxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lSZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1T0lRLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNUVYdXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1RVh1LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjIsIDEwNzUsIC0xNjAsIC00MDA0XSRbLTI2MiwgNDU4OCwgLTE2MCwgLTQ5MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1T0lSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0Nm1rLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSVN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1T0lSLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVPSVNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQyLCAtMTA5MiwgLTkzLCAxODU0XSRbLTQyLCAtMjQ1NSwgLTkzLCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1T0lUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1T0lULWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c1RVhxZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0Nm1rLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1T0lVT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVPSVVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM4MCwgLTE2LCAxMjI3LCA4MDA5XSRbNzEyOCwgLTE2LCA2OTc2LCA4MDA5XSRbNzEyOCwgLTgwODUsIDY5NzYsIC01OV0kWzExNTksIC04MDg1LCAxMDA3LCAtNTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1T0lWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMUM0OTQ2MDMxRSIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25TdHJ1Y3R1cmUgKHNpbXBsaWZpZWQpIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNU9JWE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0laZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JV2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lXdWZYRWR1cUhvT0piVVJaUnciIHg9IjU5OTQiIHk9IjY1NjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lhT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNU9JYk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0liLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0ljZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0ljLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JYWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lhdWZYRWR1cUhvT0piVVJaUnciIHg9IjU1NjIiIHk9IjQzMjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0llT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNU9JZk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lnLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0loZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JaC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JZWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lldWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MzAiIHk9IjY2MzgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lpT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNU9Jak9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY1OSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lsLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1T0lpZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSWl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzIwMCIgeT0iNjY5MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0luT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ludWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSW9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSW8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSXBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lwLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1T0ltZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSW11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM4NiIgeT0iMTUzMiIgd2lkdGg9IjU5MjYiIGhlaWdodD0iMTAwNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1WFNQZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjE4IiBoZWlnaHQ9Ijg0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1FlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1NPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVYU091ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDk3IiB5PSI0MzUxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTYk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVYU2NPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNVhTYmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNidWZYRWR1cUhvT0piVVJaUnciIHg9IjUyODMiIHk9Ijg2NTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNqdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNVhTa3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTg2MiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2wtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU21lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU20tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNuZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1WFNqLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2tPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTE2NSIgeT0iNjU2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsUURaLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGlzIGEgc2ltcGxpZmllZCByZXByZXNlbnRhdGlvbiBvZiBhIFdCUyBvbmx5IHNob3dpbmcga2V5IGVsZW1lbnRzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNU9JYU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNU9JbU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU051ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNOT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTTWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNNdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NDgsIDI1NCwgMjI5NF0kWzAsIC0yMjQzLCAyNTQsIDQ5OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU04tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNPT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU1NlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNUZWZYRWR1cUhvT0piVVJaUnciIHg9IjIzMCIgeT0iNzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1VlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI4NyIgeT0iLTI2MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1YtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc1IiB5PSItMTk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1dlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTWWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNaLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNaZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNhZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTU3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNTLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTYzLCAtMTAxLCAtMjIwLCAtMjg0NF0kWy0zNTk4LCAtMTAxLCAtODU1LCAtMjg0NF0kWy0zNTk4LCAyMzE5LCAtODU1LCAtNDIzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU2ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzVPSWlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU2ZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTZnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzgxLCAtNDQ4LCAyMjgsIDE4MzddJFstMzgxLCAtMTg2MiwgMjI4LCA0MjNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0c1T0llT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTaS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2llZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNodWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU2gtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTU2LCAtMzE4LCAtNjYxLCAxOTU4XSRbNTU2LCAtMTk1OCwgLTY2MSwgMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTak9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2plZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTbnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HNVhTanVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTYk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNvdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTbi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNvT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNjQsIDQ0OCwgMTk3MiwgLTE2ODRdJFstMzY0LCAxNjM0LCAxOTcyLCAtNDk5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3B1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTcC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HNVhTYk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNU9JbU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNxLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTcU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNxZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1MzQsIC0zMTgsIDI3NzgsIDY2NDFdJFsxNTM0LCAtNjQ4MiwgMjc3OCwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTcnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3ItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTYk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFN0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTc2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNzdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkyNiwgMzE4LCAtMzIwMiwgLTM5OTVdJFs5MjYsIDEzMjMsIC0zMjAyLCAtMjk5MF0kWzIzMjgsIDEzMjMsIC0xODAwLCAtMjk5MF0kWzIzMjgsIDM5OTUsIC0xODAwLCAtMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTdC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3VPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTdWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HNU9JV09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNU9JYU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3YtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFN2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTdXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFN1LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MDYsIC00NTcsIDM1NSwgMTc3OF0kWy00MDYsIC0xNzg2LCAzNTUsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3dPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN3ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3d1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzVPSVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3ctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTeE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzE3LCAzMTcsIC0zOTcsIC0xNzczXSRbLTMxNywgMTc3MiwgLTM5NywgLTMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3llZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN5dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMTU4MEYwMEM0IiB0eXBlPSJDbGFzcyIgbmFtZT0iRGVzY3JpcHRvclJlbGF0aW9uc2hpcHMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNWhETWVmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiIGRlc2NyaXB0aW9uPSJ7Um9sZURlc2NyaXB0b3IubW9kaWZpZXMgPSBSb2xlLnBlcmZvcm1zQXNPd25lci5vdXRwdXQgdW5pb24gUm9sZS5wZXJmb3Jtc0FkZGl0aW9uYWxseS5vdXRwdXQgdW5pb24gUm9sZS5hc3Npc3RzSW4ub3V0cHV0fSIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1aERNdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzcxIiB5PSIyMzc5IiB3aWR0aD0iNTUwMyIgaGVpZ2h0PSIxNzUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVoRE9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFJPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVoRE51ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNWhETi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzMyNCIgeT0iNTc0MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1aERTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5JT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5JZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1aERSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVoRFItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcxNzAiIHk9IjE1MTM4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVxTkp1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTk1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVxTkktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjk5MSIgeT0iNDYyMiIgd2lkdGg9IjQ0NDUiIGhlaWdodD0iMzg2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5XT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1cU5XZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5XLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5YZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5YLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTllPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ZZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTll1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5aT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1cU5WdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTlYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY4ODIiIHk9Ijg3MjAiIHdpZHRoPSI0NDQ1IiBoZWlnaHQ9IjQ4MTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1WT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNXotV09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzc1OSIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1XLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1YZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1YLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1ZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXotVmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1ei1WdWZYRWR1cUhvT0piVVJaUnciIHg9IjI2OTIiIHk9IjEwMjYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzV6LWFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1iZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1iLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1jZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotYy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXotWmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1ei1adWZYRWR1cUhvT0piVVJaUnciIHg9IjgxNzgiIHk9IjQyOTIiIHdpZHRoPSI2NTEwIiBoZWlnaHQ9IjM5MjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEYWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IHRvIGFsbCBEZXNjcmlwdG9yIHR5cGVzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZSwgdGhlaXIgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zLiAgV2Ugc2VlIHRoYXQgZWFjaCBEZXNjcmlwdG9yIHRyYWNlcyBiYWNrIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCB0aGV5IHJlZmVyIHRvLiAgRGVzY3JpcHRvcnMgYWxzbyBkZWZpbmUgYWRkaXRpb25hbCBhc3NvY2lhdGlvbnMgdGhhbiB0aGUgYXNzb2NpYXRpb25zIGRlZmluZWQgYW1vbmdzdCB0aGUgY29yZSBjb250ZW50IGVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIEV4dGVybmFsIElucHV0cyBiZXR3ZWVuIFRhc2tzIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXJlIG5vdCBkZWZpbmVkIGluIENvcmUgTWV0aG9kIENvbnRlbnQsIGJlY2F1c2UgaXQgZXhwcmVzc2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzIGFuZCBub3QgYXZhaWxhYmxlL2tub3duIGZvciBtZXRob2QgY29udGVudC4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVxTk11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgc291cmNlPSJfRzVoRE5lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5OZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5PT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTk91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNCIgeT0iMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5QdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjYiIHk9Ii0yODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5RZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAwIiB5PSIxMjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODMiIHk9IjM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5TT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5SdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5TLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5UT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5TdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5VZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1cU5NLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVxTk5PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NzksIC0yNSwgNDExNCwgLTI3OV0kWy0zNzc2LCAtMjUsIDIyMTgsIC0yNzldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXFOWmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTmFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1NyIgeT0iLTI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5idWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5iZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04OTUiIHk9Ii0xODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5jT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcyMiIgeT0iMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5jLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzNSIgeT0iMTk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODM1IiB5PSItMjMxMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5lT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5lLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5lZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5mdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5mLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5mZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTmctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5oT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTmgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1cU5adWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVxTlotZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIxOCwgLTE0MjIsIC03ODkwLCAzMTQ5XSRbODY1MiwgLTE0MjIsIC0xNDU2LCAzMTQ5XSRbODY1MiwgLTI2NDEsIC0xNDU2LCAxOTMwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVxTmlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5qT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjE1IiB5PSItMzIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE5MjAiIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5rLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTU4IiB5PSIyMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5sLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc4MyIgeT0iLTEzNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5tZWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MTciIHk9IjEyMDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFObnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFObk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOb09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5wdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5wT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5xdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5xT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOaWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1cU5pdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMTgsIDE4OTYsIC03ODkwLCA2NDY4XSRbMTE3MTcsIDE4OTYsIDE2MDgsIDY0NjhdJFsxMTcxNywgLTI2NDEsIDE2MDgsIDE5MzBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXFOcS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTnItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU50T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5zLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzYzIiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU50LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTIiIHk9IjI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU51T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOdWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM2IiB5PSI0MzMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOdk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjYiIHk9IjExMTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotSXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotSnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1LLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1MT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1LdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1NT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1MdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOck9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1cU5yZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMTgsIDU5LCAtNzg5MCwgNDYzMV0kWzk3ODcsIDU5LCAtMzIxLCA0NjMxXSRbOTc4NywgLTI2NDEsIC0zMjEsIDE5MzBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXotTWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HNWhEUmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1ei1OZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotT2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MiIgeT0iLTQwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYwIiB5PSI1NzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1RT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNyIgeT0iLTIzOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1RZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NiIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1ST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1SLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1SZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1TdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1TLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1TZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1ei1NdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzV6LU0tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM1LCAtNTU4LCA4NCwgNDAxM10kWzEzNSwgLTIxNjcsIDg0LCAyNDA0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzV6LWRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCIgc291cmNlPSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1ldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1ei1lT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDczIiB5PSIyNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotZk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTUiIHk9IjI3NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1mdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUwIiB5PSItODY1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1ndWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTU2IiB5PSItMzU5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY3MSIgeT0iLTExNTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotaXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotak9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1rZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1rdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1rT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1sdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1sT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXotZGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1ei1kdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1MTQsIC0xOTU1LCAyNTE0LCAtMTk1NV0kWzI1MTQsIC0zNTIyLCAyNTE0LCAtMzUyMl0kWy05MjIsIC0zNTIyLCAtOTIyLCAtMzUyMl0kWy05MjIsIC0xOTU1LCAtOTIyLCAtMTk1NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1ei1sLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIHNvdXJjZT0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotbS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzQ5IiB5PSItODMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LW4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgxOSIgeT0iLTQ0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1vZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LW91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODMiIHk9IjMwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotcGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTkiIHk9Ii0yMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTEiIHk9IjM0NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1yZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1xLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1zZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1yLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LXRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dkktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dkllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1ei1tT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzV6LW1lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3MDAsIC0xOTU1LCAtMjcwMCwgLTE5NTVdJFstMjcwMCwgLTI2NzUsIC0yNzAwLCAtMjY3NV0kWy03MzgyLCAtMjY3NSwgLTczODIsIC0yNjc1XSRbLTczODIsIC04NTUsIC03MzgyLCAtODU1XSRbLTMyNTEsIC04NTUsIC0zMjUxLCAtODU1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dkpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSIgc291cmNlPSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1OXZLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM2MiIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZMT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDgyIiB5PSItMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2TC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NDAiIHk9IjI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2TXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjQwIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dk5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDU1IiB5PSIyMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2T3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2T09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2UHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2UE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZRT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZST2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2SmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZKdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjE4LCA0NTcsIDE1NTYxLCA3NjJdJFstMTQ1MjgsIDQ1NywgMzI1MSwgNzYyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dlItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyIgc291cmNlPSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1OXZTLWZYRWR1cUhvT0piVVJaUnciIHg9Ijg3MCIgeT0iLTI3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZULWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDgyIiB5PSItMzI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4MiIgeT0iMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZWZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzIiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2V09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NzYiIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZXLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZYLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dmFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlotZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZTT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzU5dlNlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyMTgsIC0xMTAwLCAxNTU2MSwgLTc5NV0kWy0xNDUyOCwgLTExMDAsIDMyNTEsIC03OTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2YXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfRzVoRE1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzU5dlItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZhLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2Yk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTAsIDg3MiwgLTIwMywgLTEzMjldJFszMTMsIDIyMDEsIDAsIDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1OXZiZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNTl2YnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZiLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiIHNvdXJjZT0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Y3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2Yy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjkiIHk9Ii0zMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2ZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDc2IiB5PSIxOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZldWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NTkiIHk9Ii0xMTk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZmZWZYRWR1cUhvT0piVVJaUnciIHg9IjQxOCIgeT0iLTI5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZnT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02MDciIHk9IjI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZnLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZpZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZoLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dmplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dmtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmotZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZjT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzU5dmNlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIxOCwgMTk1NSwgLTU0NTIsIC0yOTIxXSRbMjIxOCwgMzY5OSwgLTU0NTIsIC0xMTc2XSRbNTQ1MiwgMzY5OSwgLTIyMTgsIC0xMTc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dmt1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgc291cmNlPSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1OXZsdWZYRWR1cUhvT0piVVJaUnciIHg9IjYyNyIgeT0iLTI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjk5IiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2bmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAxOSIgeT0iMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2b09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzkzIiB5PSItMTk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTA0IiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2cU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2cHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2ck9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2cXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZydWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZ0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZzdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2ay1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZsT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjQ2LCAxOTU4LCAtMTAzMTgsIC0yOTEwXSRbLTI2NDYsIDU4MjEsIC0xMDMxOCwgOTUzXSRbNTQ1MCwgNTgyMSwgLTIyMjIsIDk1M10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2RzVFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1RS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNkc1Rk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTEwIiB5PSIyNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Ri1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1R09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTgyMyIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Ry1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM2IiB5PSItMzE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVIdWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzciIHk9IjIwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVJZWZYRWR1cUhvT0piVVJaUnciIHg9IjkzIiB5PSI5NzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1SnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1S3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1S09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVMT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVNT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNkc1RWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2RzVFdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjIyLCAzMTgsIDU0NTAsIDUxODZdJFstOTA0OCwgMzE4LCAtMTM3NiwgNTE4Nl0kWy05MDQ4LCAtMjkxMCwgLTEzNzYsIDE5NThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNkc1TS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1T09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZHNU4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM0MyIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNU8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNjIiIHk9IjI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI3IiB5PSItMjIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVRZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMDMiIHk9IjE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVST2ZYRWR1cUhvT0piVVJaUnciIHg9IjY1NiIgeT0iMTAyNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVSLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1U3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVTLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNVVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNVZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2RzVOT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZHNU5lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyMTgsIDgsIDU0NTIsIDQ4ODVdJFstNzk5MiwgOCwgLTMyMSwgNDg4NV0kWy03OTkyLCAtMjkyMSwgLTMyMSwgMTk1NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2RzVWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciIHNvdXJjZT0iX0c1ei1WT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZHNVd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVYdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTciIHk9IjQyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2NiIgeT0iLTExNzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM2IiB5PSI0NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY0IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNWJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzViZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNWNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1ZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Y3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1ZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1ZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZHNVYtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2RzVXT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NjcsIC02ODU4LCA0MDA0XSRbMzMsIC0yMjk0LCAtNjgyNCwgMjI3N10kWzM1OTgsIC0zNDk2LCAtMzI1OSwgMTA3NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMUM0Q0M1MDI2MCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JSZWxhdGlvbnNoaXBzIChzaW1wbGlmaWVkKSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZRcUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZRcUVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTcwNSIgeT0iMjQ5NyIgd2lkdGg9IjMyMzQiIGhlaWdodD0iMTIwMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2UXFKT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFMLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2UXFJZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcUl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjAxIiB5PSIyMzcwIiB3aWR0aD0iNDc5MiIgaGVpZ2h0PSIxNzYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZRcWV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiRWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiRS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYkZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZRcWQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4Nzc5IiB5PSI2MzI0IiB3aWR0aD0iMzM2OSIgaGVpZ2h0PSIxNzc4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xaTlVlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhIHNpbXBsaWZpZWQgb3ZlcnZpZXcgb2YgdGhlIGRpZmZlcmVudCBEZXNjcmlwdG9yIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBQcm9jZXNzIHBhY2thZ2UgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgbm90IHNob3dpbmcgY2xhc3MgYXR0cmlidXRlcyBvciBhc3NvY2lhdGlvbiByb2xlcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZRcU1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSIgc291cmNlPSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNyIgeT0iMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcU9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMjQiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxTy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFQdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDkiIHk9Ii00NDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFTdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFTT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcVR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcVV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2UXFNZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZRcU11ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE2MTcsIDkzLCAxMjcwOCwgLTU5XSRbLTExOTI5LCA5MywgMjM5NiwgLTU5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZRcVUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyIgc291cmNlPSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFWLWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MiIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyNiIgeT0iLTUyNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFYZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFYdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OTUiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxWWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDUwIiB5PSItMTAwNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcWEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxYi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxYy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZRcVZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNlFxVmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDY1LCAtNjAxLCAxMzg1OSwgLTc1M10kWy00NjUsIC0xOTMwLCAxMzg1OSwgLTIwODJdJFstMTM5NjEsIC0xOTMwLCAzNjQsIC0yMDgyXSRbLTEzOTYxLCAtNzI4LCAzNjQsIC04ODBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFiRnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYkd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMjIiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJIdWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MjciIHk9IjkwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzA5IiB5PSIyMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYk0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYk5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYk11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYk9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYk51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJGLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYkdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY4NCwgLTgyMSwgLTUxNzMsIDMyOTNdJFs1NDY5LCAtODIxLCAtMTM4OCwgMzI5M10kWzU0NjksIC0zNTEzLCAtMTM4OCwgNjAxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYk9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJQZWZYRWR1cUhvT0piVVJaUnciIHg9IjQwMCIgeT0iMjk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0MjQiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxNCIgeT0iLTE2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJTZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZhYk91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmFiTy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjg0LCA2NjAsIC01MTczLCA0Nzc1XSRbODA4NSwgNjYwLCAxMjI3LCA0Nzc1XSRbODA4NSwgLTM1MTMsIDEyMjcsIDYwMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJYT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmFiWU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODk1IiB5PSIzODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTEzNyIgeT0iLTk0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJaLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTg1IiB5PSIzOTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYmV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYmZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJYZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYlh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY4NCwgLTExOCwgLTUxNzMsIDM5OTZdJFs1ODMzLCAtMTE4LCAtMTAyNCwgMzk5Nl0kWzY1NDQsIC01OSwgLTMxMywgNDA1NV0kWzY1NDQsIC0zNTEzLCAtMzEzLCA2MDFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFiZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5IiBzb3VyY2U9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYmctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5OCIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJoLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTYiIHk9Ii02NzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFianVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJqZWZYRWR1cUhvT0piVVJaUnciIHg9IjgxMyIgeT0iLTIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFia2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFia09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYmxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYm1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFibmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFibS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFib2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFibi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZhYmdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmFiZ2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjM0LCA4ODAsIC01ODMzLCAtMzA4MV0kWzE2MzQsIDE4NzEsIC01ODMzLCAtMjA5MV0kWzY3MjIsIDE4NzEsIC03NDUsIC0yMDkxXSRbNjcyMiwgMzA3MywgLTc0NSwgLTg4OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJvdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIHNvdXJjZT0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFicGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFicU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmFicHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE2IiB5PSItMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYnF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMTYiIHk9Ii0xMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxCZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MTkiIHk9Ii0zMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbENlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbENPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxDLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxFZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxELWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbEZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbEdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJvLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYnBPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE5NDcsIDg4MCwgLTk0MTQsIC0zMDgxXSRbLTE5NDcsIDQ0NjEsIC05NDE0LCA0OTldJFsxMzUsIDQ0MzYsIC03MzMyLCA0NzRdJFs1NzgyLCA0NDM2LCAtMTY4NCwgNDc0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZqbEd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2amxIdWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzMiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxJdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjAzIiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNTMiIHk9IjE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsSy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbExlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbE1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbE5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbE11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZqbEctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmpsSE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTY4NCwgLTMzOCwgNTc4MiwgMzYyM10kWy04MzgyLCAtMzM4LCAtOTE0LCAzNjIzXSRbLTgzODIsIC0zMDgxLCAtOTE0LCA4ODBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmpsUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZqbFFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwMyIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk3NSIgeT0iLTIxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxTT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODMwIiB5PSIyMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2amxQdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZqbFAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0NzMsIC04ODksIDU5OTQsIDMwNzNdJFstMTQ3MywgLTEyNjEsIDU5OTQsIDI3MDBdJFstNjk1OSwgLTEyNjEsIDUwOCwgMjcwMF0kWy02OTU5LCAtMzA4MSwgNTA4LCA4ODBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU3OTA1NDAyMjUiIHR5cGU9IkNsYXNzIiBuYW1lPSJBY3Rpdml0eSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZqbFpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjY4OTEiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXQWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNmpsWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2amxZdWZYRWR1cUhvT0piVVJaUnciIHg9IjY3MTQiIHk9IjE1ODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXQnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdFZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdBLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V0JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjYyOSIgeT0iNzI3MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V05lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdPZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjU5IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1BlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1FlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1JPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V051ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXTi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODA2IiB5PSI5MTAxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V1V1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1hlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V1QtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MTQ2IiB5PSI5MTAxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V2EtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNTAiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXZHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXYU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdhZWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MTkiIHk9IjUwMzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXa2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXbU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdpLWZYRWR1cUhvT0piVVJaUnciIHg9IjY2ODgiIHk9IjUwNzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFpOVS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGtleSBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIEFjdGl2aXR5IGluIHRoZSBQcm9jZXNzIEJyZWFrZG93biBwYWNrYWdlLiAgT25lIGNhbiBzZWUgdGhhdCB0aGUgY29uY2VwdHMgb2YgUGhhc2UgYW5kIEl0ZXJhdGlvbiBoYXZlIGJlZW4gZGVmaW5lZCBhcyBzcGVjaWFsIEFjdGl2aXRpZXMuICIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HNmpsWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V0Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OSIgeT0iMTU5MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzkiIHk9Ii0yNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdIZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MzkiIHk9IjE2OTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM2IiB5PSIxODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXSS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDE0IiB5PSItMzQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0t1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V0UtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXRk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODUyLCAxMDU4LCAzNzA0LCAtMzg5MF0kWzE4NTIsIDUwMDEsIDM3MDQsIDUzXSRbLTkyNiwgNTAwMSwgOTI2LCA1M10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0c2dFdOZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V1NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdSdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXUi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzA0LCAtNDU3LCA5MTQsIDEzNzFdJFstOTIyLCAtMTM4MCwgMjk2LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdUT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdYdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0c2dFdUdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V1l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdYLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXWU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMDQsIC00NTcsIC05NjUsIDEzNzFdJFs5NDgsIC0xMzgwLCAtMzIxLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdaZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXWnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdkLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdaLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V2UtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdlT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V2VlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk1MywgNTMsIDI1MTMsIDIyNzZdJFstNDQ0NSwgNTMsIC05NzksIDIyNzZdJFstNDQ0NSwgLTE5MDUsIC05NzksIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V2Z1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdmLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V2dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzZ0V1otZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZqbFlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V2dlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXZ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMjcsIC00NDgsIC01NjY0LCAyMjk0XSRbMTI3LCAtMjYyNCwgLTU2NjQsIDExOF0kWzIzNDUsIC0yNjI0LCAtMzQ0NSwgMTE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXaC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V2lPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXaWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V24tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFduZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXbXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdtLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1LCAtNDU3LCAtMTA5MiwgMTcyN10kWzI1LCAtMTY2NywgLTEwOTIsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzYyZjhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2MmY4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTkyRDQwMDdFIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb25BbmRCcmVha2Rvd24iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmY5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmY5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI1MTY0IiBoZWlnaHQ9IjIwNjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmYtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmYtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJmLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJmX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZl91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJmXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZjgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJmOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTgwNyIgeT0iMTE4NzAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnQnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNzM4MiIgaGVpZ2h0PSIxMTg1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdFZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmdBLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ0JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTE5OCIgeT0iMTE4NTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdFdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnRnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMTAwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdJZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmdFLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ0ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2MzAiIHk9IjE1MzI0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ0p1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzMTgiIGhlaWdodD0iMTYyNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnSS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ2OTkiIHk9IjE1MjkwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ05lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ051ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iMTEwMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ09PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnTS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjkzNjIiIHk9IjE1Mjk5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ1J1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIyMzUiIGhlaWdodD0iMTEwMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnVWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnUS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdST2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5NjgiIHk9IjE1Mjk5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUTgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUTlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1MjIiIGhlaWdodD0iMTUyNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVEtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FRLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVEtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FRX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVFfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FRX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRXy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FROGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FROHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzMzOSIgeT0iNTA4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVJCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODQ0IiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVJBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJBdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzYwIiB5PSI5MzkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJHZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSSGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk5NyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJLT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVJHdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkctZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzc0NyIgeT0iNTM4NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVJMZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI2ODc0IiBoZWlnaHQ9IjI1MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk9PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUkt1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSSy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzU3IiB5PSI3ODQwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FST2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUlBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NTciIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSU09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FST3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJPLWZYRWR1cUhvT0piVVJaUnciIHg9IjE4OTMxIiB5PSI4NTM0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdLQjl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ3MDciIGhlaWdodD0iMTU1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0I5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0ItLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0JfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0JfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDQWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0tCOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tCOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5Njg1IiB5PSIyOTI5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdLQ0dPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE5MzAiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0tDRmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NGdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MDI3IiB5PSIxNTM0MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsaS1VZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZSBhIGdlbmVyYWwgb3ZlcnZpZXcgdG8gdGhlIHRheG9ub215IGRlZmluZWQgaW4gUHJvY2VzcyBCcmVha2Rvd24gcHJlc2VudGluZyB0aGUgdHdvIGtleSBhYnN0cmFjdGlvbnMgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYW5kIEJyZWFrZG93biBFbGVtZW50IHdpdGggdGhlaXIgbW9zdCBpbXBvcnRhbnQgc3ViLWNsYXNzZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0c3QVE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJBT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJFZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUkV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc2MiwgLTc3MCwgMzU1NiwgMzU5OF0kWy0zNzkzLCAtMzgzNSwgNTI0LCA1MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJGLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSR09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJTZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjUiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJVZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NTgiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODc2IiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJWLWZYRWR1cUhvT0piVVJaUnciIHg9IjgyOSIgeT0iLTI2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJXdWZYRWR1cUhvT0piVVJaUnciIHg9Ii04OCIgeT0iMzU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSWi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSYWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUlN1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJTLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM0MzcsIDAsIC03MDc4LCAwXSRbOTcyOCwgMCwgLTc4NywgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c3QVJPZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJiZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExOCwgNTUwLCAxMjAyLCAtMzI1OV0kWy0xMTgsIDI3NjgsIDEyMDIsIC0xMDQxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSYy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSZGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9HN0FST2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FROE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJlZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSZHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJkLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgsIC01NTgsIDYxOCwgMjY5Ml0kWzgsIC0yNDg5LCA2MTgsIDc2Ml0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJmZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOTFGMDA2MSIgc291cmNlPSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUkdlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSZ3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSZ09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MCwgLTEyNTMsIDAsIDE4OTZdJFs1MCwgLTI1OTAsIDAsIDU1OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJodWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzYyZ0V1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmlPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJpZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkxNCwgLTU1OCwgLTQwNjQsIDIzODddJFszMjAwLCAtMTkxMywgLTE3NzgsIDEwMzJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJqdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSai1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c2MmdFdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJrZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmt1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExMDAsIC01NTAsIDM0MjAsIDI4NTNdJFstMTEwMCwgLTI4MTksIDM0MjAsIDU4NF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQjhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0I4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgc291cmNlPSJfRzdBUkdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdLQjh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDQnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0EtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NCT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY5NCwgLTU2NywgLTIwOTksIDE2NjddJFsxODAzLCAtMTQ1NiwgLTk5MCwgNzc4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDQ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0N1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDQy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9HN0tCOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NELWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDRE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NEZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzk1NiwgLTc4NywgLTE3ODYsIDE0NDddJFsyMDc0LCAtMTcwMSwgLTY2OCwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDRXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0UtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDSk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HN0tDRk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDSmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ0p1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU2NywgMCwgMjM3OV0kWzAsIC0xOTEzLCAwLCAxMDMyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDSy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0xPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDTGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ00tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NNZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDTHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ0wtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI0OTcsIC0xMDQxLCA2Njk3LCAyNzY4XSRbLTYxNDYsIC0yNTU2LCAzMDQ4LCAxMjUzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDTk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ05lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDTnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NPdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDTi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NPT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjcsIC01OTIsIC00MzEsIDI3NjBdJFstMTI3LCAtMjA5OSwgLTQzMSwgMTI1M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1BlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NQdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ1AtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzYyZ0l1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZ0F1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ1FPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDUWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzUsIC04MTIsIC0xODk2LCAyODQ0XSRbMTM1LCAtMzA2NCwgLTE4OTYsIDU5Ml0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1J1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NSLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ1NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzYyZ1F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ1NlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NTdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTQ3NywgLTUxMDYsIDY0MDJdJFstMjYsIC0zMzYxLCAtNTEwNiwgMzUxOF0kWzM1NDYsIC01ODIxLCAtMTUzNCwgMTA1OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1QtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NVT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ1VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzYyZ011ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZ0F1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NWLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ1V1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDVS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NywgLTU1MCwgMTY5MywgMjg1M10kWzY3LCAtMjgxOSwgMTY5MywgNTg0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1dlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRThDODAwNTYiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDV3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdLQ1h1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MDMiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NaLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMNGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0tDVy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NYT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg2NjEiIHk9IjcxNzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN1RMNXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMOE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMOGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RMNC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RMNU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODk4IiB5PSI0NDgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN1RMOXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzAxNCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEwtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEwtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTC0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VExfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTF9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VExfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTF8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1BT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1BZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3VEw4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTDlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODgwNSIgeT0iNTI0MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1EdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3VE1ELWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1FZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1FLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1GZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1GLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1HZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1HdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3VE1ET2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1EZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NSIgeT0iMjk4OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3VE1LT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNTWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTU0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdUTUplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTUp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODU2OCIgeT0iMjk2MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsaS1VLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIGdlbmVyYWwgZGVmaW5pdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQuICBQcm9jZXNzIEVsZW1lbnQgaXMgZGVycml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCBkZWZpbmUgaW4gQ29yZSBNZXRob2QgQ29udGVudC4gIEp1c3QgbGlrZSB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBmb3IgbWV0aG9kIGNvbnRlbnQgUHJvY2VzcyBFbGVtZW50IGNvbnRhaW5zIGEgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGNhbiBjb21wcm9zZSBvZiBhIG51bWJlciBvZiBhdHRyaWJ1dGVzIGNvbnRhaW5pbmcgdGV4dHVhbCBkZXNjcnB0aW9ucyBmb3IgdGhlIFByb2Nlc3MgRWxlbWVudC4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTUF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOTFGMDA2MSIgc291cmNlPSJfRzdLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTDh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1CZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1DT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNQnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdUTUEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNQk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC00NTcsIDAsIDE0NzNdJFstNTAsIC0xNDgxLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1DZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1HLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0c3VE1DLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VEw0dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTUgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1IT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTUhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgLTc4MjMsIDIwMTVdJFswLCAtMTQzOSwgLTc4MjMsIDExMDBdJFs2NDAwLCAtMjM0NSwgLTE0MjIsIDE5NF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTUl1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1JLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTU5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfRzdUTUMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTUpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1PdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNT09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzIiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1QLWZYRWR1cUhvT0piVVJaUnciIHg9IjcwNiIgeT0iLTI4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1RZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MCIgeT0iMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1SZWZYRWR1cUhvT0piVVJaUnciIHg9IjIwOSIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1TZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1TdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1TT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1UZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1UdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1UT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTVV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1OZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1OdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2OTMsIC0yNSwgLTYxODAsIDI1XSRbNjA3OSwgLTI1LCAtMTc5NCwgMjVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNVi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9HN1RNSk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RMNHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1XLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNV09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNV2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC00OTEsIDAsIDE5OThdJFstNTAsIC0xOTcyLCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1YdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNWC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIHNvdXJjZT0iX0c3VEw4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VE1KT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1ZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTVl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOCwgLTQ0OCwgLTQyLCAxNzg2XSRbOCwgLTE3NTIsIC00MiwgNDgyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNWi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTWFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM3NUVBMTAyODUiIHR5cGU9IkNsYXNzIiBuYW1lPSJTZWxlY3RlZFRhc2tTdGVwcyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUzNTEwMDEzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdjODVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5NzkiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4NmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4Ni1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4N2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjODctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdjODRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M4NHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSI1Mzg5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4OE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdjODlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5NzkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOC1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4LWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOC11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4LS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOF9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4X2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOF91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOF8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdjODhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M4OHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NTA5IiB5PSIzNjQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdjOURlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5RXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5Rk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5RnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdjOUN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M5Qy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTM2IiB5PSI3NjA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5R2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdjOUhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5SXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5Sk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5SnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUtPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdjOUd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M5Ry1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzU0NiIgeT0iNzU2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdC11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXRfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3bXRfdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVCT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVDZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3bXQtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdF9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQwNSIgeT0iMzk1MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3bXVGLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVHLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVIZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVILWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVJZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVJdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3bXVGT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdUZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAyODgiIHk9IjEyNjgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN211Si1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Sy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211TGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211TC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211TWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211TXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN211Sk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVKZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTQ0IiB5PSIxMzU0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211WC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdtdVktZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MDMiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211YU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211YXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211Yk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdtdVlPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211WWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3Nzk3IiB5PSIxMzU0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzd2MzNPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djM0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djM0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djM1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3YzMmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djMydWZYRWR1cUhvT0piVVJaUnciIHg9IjExMDAiIHk9IjEzODgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbiBkZXBpY3RlZCBpbiB0aGUgZGlhZ3JhbS4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8gKHNlZSBDb250cmlidXRpb24gaW4gcGFja2FnZSBQbHVnaW4gZm9yIGRldGFpbHMpLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN2M5QU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg0OUUwMDAxIiBzb3VyY2U9Il9HN2M4NE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN2M4OE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3YzlCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN2M5QWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdjOUF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUzMywgMCwgMTcwMV0kWzAsIC0xNzE4LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3YzlCLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN2M5Q09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3YzlLZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0c3YzlDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3YzlHZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5TC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjOUxlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN2M5TWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210NHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQ2IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ1ZWZYRWR1cUhvT0piVVJaUnciIHg9IjgxMyIgeT0iMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDIzIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdDdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdDhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210OU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN210OWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210OC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN210LWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210OS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdjOUt1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3YzlLLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NDUsIDAsIC0xMDcwMSwgMF0kWzEwNjkzLCAwLCAtMTg1NCwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVDdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIHNvdXJjZT0iX0c3YzlDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXQtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdUR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVDLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN211RE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAzMDgxXSRbMCwgLTMwOTAsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdtdUVlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdtdU0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4MzBFMDE1MCIgc291cmNlPSJfRzdjOUdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdtdUktZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211Ti1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdtdU5PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN211TmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC01MTYsIDAsIDU2ODFdJFstNTAsIC01NjcyLCAwLCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVPdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN211Ty1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVQT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiIHNvdXJjZT0iX0c3bXVFLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdVFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVST2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MyIgeT0iOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Ui1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVTdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yIiB5PSIxMzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211VGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzMyIiB5PSItMzAyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211V3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211V09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211WHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211WE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdtdVBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN211UHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTM2MywgLTc2LCA0ODg1LCAyNV0kWy00ODUxLCAtNzYsIDEzOTcsIDI1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdtdWVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgc291cmNlPSJfRzdtdVgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdtdUktZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211Zk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdWdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc5IiB5PSItMTc3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdWctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMSIgeT0iMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVodWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVpZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjEiIHk9IjI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVqT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211ai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVrT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2MzBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2MzFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVlZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdWV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTcwMSwgMjUsIC00MTQwLCAyNV0kWzQ0NDUsIDI1LCAtMTM5NywgMjVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN3YzNk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9HN210LXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3YzMk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2Mzd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djM3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN3YzNmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3djM2dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MTYsIC01MCwgMjA3NF0kWzAsIC0yMTA4LCAtNTAsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzd2MzctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djM4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzd2MzhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfRzdtdVgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2MzJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2Mzl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3YzOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2My1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2My11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2My1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUyIiB5PSIxNTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2M19lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djNfT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc4NyIgeT0iLTIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djNfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3YzXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTk5IiB5PSIyNDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0QWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NEF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzIiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Qk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0Qi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0QmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0Qy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0Q2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djREdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djREZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djRFZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN3YzOHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzd2MzgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MTAsIDAsIDQ4OTMsIDBdJFstNDgwOSwgMCwgMTc5NCwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRDMxMkYyMDM1OCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3IiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djRHT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDY1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Ry1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0SGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0SC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NElPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0SWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2NEZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0RnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MDI1IiB5PSI0ODg1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Sk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzd2NEtPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0TE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0THVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0TU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0TXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3Y0SmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djRKdWZYRWR1cUhvT0piVVJaUnciIHg9IjUzOTciIHk9IjczOTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0UU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3Y0UWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0UXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NFJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8wT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8wdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8xT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8xZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3djRQdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NFAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwMzUiIHk9IjczNDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8xdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNzVvMnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8zdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW80T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW80dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW81T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW81ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3NW8xLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzc1bzJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODcyMCIgeT0iNzM3NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4Q3l6ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDAzIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5ME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5MHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5MU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5MXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTJPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhDeXl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOEN5eS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzU2IiB5PSIxNDgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhDeTV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5Nk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3k2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5N09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3k3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5N3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3k3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5OE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5OGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOEN5NC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3k1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjYxMjEiIHk9IjQ1ODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWowT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOE1qMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNajJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNajItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWozT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNajNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWozdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWozLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4TWowZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNajB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ3MyIgeT0iMjQ0NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsaS1WLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzd2NE5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzd2NEpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2NEZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djROLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0T09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzd2NE5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3djROdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ5MSwgLTQ1NywgLTIzMDIsIDIwMzJdJFsyMjYwLCAtMjA0MCwgLTUzMywgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN3Y0Ty1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzd2NFBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNzVvNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HNzVvMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3NW82dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNzVvNS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzc1bzZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgMCwgMjAzMl0kWzAsIC0yMDQwLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3NW83ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNzVvN3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4Q3l3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c3djRQZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5dy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5eHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeXhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4Q3l3ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOEN5d3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjI2LCAtNDU3LCAyODI3LCAyMDMyXSRbLTI4MTksIC0yMDQwLCA2MzUsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhDeXgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3l5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhDeTJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzd2NEZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhDeXllZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOEN5M2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhDeTJ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4Q3kyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDI5NDZdJFswLCAtMjk1NCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOEN5NE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhDeTRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOEN5OHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HOEN5eWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOEN5NHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeTl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY3NyIgeT0iNzAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeS0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhDeS11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1MyIgeT0iLTE2OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3lfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3lfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3pBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhDekFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzE2IiB5PSIzMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN6QXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDekJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhDekEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4TWp3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4TWp4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNanktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhNanllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNanotZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOE1qemVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzciIHk9Ii0xMjQzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhDeTgtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOEN5OU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE2NCwgMzE3LCAxOTg0LCAtMjc3OF0kWy0xMTY0LCAzMTc1LCAxOTg0LCA4MF0kWy0yMjIyLCAzMTc1LCA5MjYsIDgwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhNajRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzhDeTR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhNajBPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhNajRlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4TWo0dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MDIsIC00NTcsIDI1OTksIDE2NzZdJFstMjYxNiwgLTE2ODQsIDY4NSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qNS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOE1qNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HN3Y0Sk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWo3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOE1qNnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhNajYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM0NywgLTQ1NywgMzMxMCwgNDQ3MF0kWy0zMzI3LCAtNDQ3OCwgMzMwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWo4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4TWo4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c4TWowT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4Q3l5ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNajl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4TWo4LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOE1qOU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTMzLCAtMzMwLCAtNDMxOCwgNjM1XSRbNDc0MSwgLTcyOCwgLTE3MTAsIDIzN10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNai1lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWotdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doaFo5T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZEODU0NjAwRDgiPgotICAgICAgICAgICAgPGJvZHk+MDE8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9EeExHd094TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiIG5hbWU9IkFjdGl2aXR5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2hySy11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgIDxib2R5PkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ii8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xQLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiIG5hbWU9Ik1pbGVzdG9uZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doMFU1T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doMFU2T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICA8Ym9keT5JdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKQotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiIG5hbWU9IlBoYXNlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2gtRjQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgIDxib2R5PlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIiBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doLUY1LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiIG5hbWU9InRlYW1Sb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dqNV9rdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dqNV9rZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIiBuYW1lPSJzdXBlclRlYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3ay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3a3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiIG5hbWU9InN1YlRlYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3bHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3bGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODAwNTcwMjc2IiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lIMjQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiI+Ci0gICAgICAgICAgICAgIDxib2R5PldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODE5RUQwMUVEIiBuYW1lPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaUgyNXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE5RUQwMUVEIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBhbmQgJnF1b3Q7UGFpbnQgZmVuY2UsJnF1b3Q7ICZxdW90O1BhaW50IGZlbmNlJnF1b3Q7IGNhbid0IHN0YXJ0IHVudGlsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBmaW5pc2hlcy4gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gdHlwZSBvZiBkZXBlbmRlbmN5IGFuZCB0aGUgZGVmYXVsdCBmb3IgYSBuZXcgV29yayBPcmRlciBpbnN0YW5jZS4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODFDNzIwM0M3IiBuYW1lPSJmaW5pc2hUb0ZpbmlzaCI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lSQTBlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxQzcyMDNDNyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBhbmQgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsLCZxdW90OyAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwmcXVvdDsgY2FuJ3QgZmluaXNoIHVudGlsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgZmluaXNoZXMuCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxQkU4MDI5NiIgbmFtZT0ic3RhcnRUb1N0YXJ0Ij4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaVJBMU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODFCRTgwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtQb3VyIGZvdW5kYXRpb24mcXVvdDsgYW5kICZxdW90O0xldmVsIGNvbmNyZXRlLCZxdW90OyAmcXVvdDtMZXZlbCBjb25jcmV0ZSZxdW90OyBjYW4ndCBiZWdpbiB1bnRpbCAmcXVvdDtQb3VyIGZvdW5kYXRpb24mcXVvdDsgYmVnaW5zLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM1MTAxM0MiIG5hbWU9InN0YXJ0VG9GaW5pc2giPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpUkExLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM1MTAxM0MiPgotICAgICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIFRoaXMgZGVwZW5kZW5jeSB0eXBlIGNhbiBiZSB1c2VkIGZvciBqdXN0LWluLXRpbWUgc2NoZWR1bGluZyB1cCB0byBhIG1pbGVzdG9uZSBvciB0aGUgcHJvamVjdCBmaW5pc2ggZGF0ZSB0byBtaW5pbWl6ZSB0aGUgcmlzayBvZiBhIEJyZWFrZG93biBFbGVtZW50IGZpbmlzaGluZyBsYXRlIGlmIGl0cyBkZXBlbmRlbnQgQnJlYWtkb3duIEVsZW1lbnRzIHNsaXAuIElmIGEgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoZSBtaWxlc3RvbmUgb3IgcHJvamVjdCBmaW5pc2ggZGF0ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGV4YWN0bHkgd2hlbiBhbmQgeW91IGRvbid0IHdhbnQgYSBsYXRlIGZpbmlzaCB0byBhZmZlY3QgdGhlIGp1c3QtaW4tdGltZSBCcmVha2Rvd24gRWxlbWVudCwgeW91IGNhbiBjcmVhdGUgYW4gU0YgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBCcmVha2Rvd24gRWxlbWVudCB5b3Ugd2FudCBzY2hlZHVsZWQganVzdCBpbiB0aW1lICh0aGUgcHJlZGVjZXNzb3IpIGFuZCBpdHMgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCAodGhlIHN1Y2Nlc3NvcikuIFRoZW4gaWYgeW91IHVwZGF0ZSBwcm9ncmVzcyBvbiB0aGUgc3VjY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LCBpdCB3b24ndCBhZmZlY3QgdGhlIHNjaGVkdWxlZCBkYXRlcyBvZiB0aGUgcHJlZGVjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4IiBuYW1lPSJXb3JrT3JkZXIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWF4MHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+V29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi0oTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ2RDAwODgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MThFRTAwOUYiIG5hbWU9ImxpbmtUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA4MDA1NzAyNzYiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpYXgxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MThFRTAwOUYiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HaWF4Mk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5maW5pc2hUb1N0YXJ0PC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIiBuYW1lPSJwcmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWMtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2s5SWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpYXgydWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiPgotICAgICAgICAgICAgICA8Ym9keT5QbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKQotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VFRjkwMEUyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE1OEQwMEQ5IiBuYW1lPSJzdGFydERhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lraTAtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNThEMDBEOSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU5QTAxMjkiIG5hbWU9ImZpbmlzaERhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lraTF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNTlBMDEyOSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE3NUMwM0RCIiBuYW1lPSJyYW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBBNDAwN0IiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpa2kyZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTc1QzAzREIiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaXRzd3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUMzOTgwMDMyNCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFOTFGMDA2MSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNCNiIgbmFtZT0icHJlZml4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpdHN4LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQjYiPgotICAgICAgICAgICAgICAgIDxib2R5PlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfcVdlOTBleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfcVdlOTBPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfckhFR01PeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQ0EiIG5hbWU9ImlzUGxhbm5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2kzZHd1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotCi0KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HaTNkeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENCIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2kzZHgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2kzZHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMDZBNkIwMUZCIiBuYW1lPSJpc09wdGlvbmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaTNkeS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMDZBNkIwMUZCIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dpM2R6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3bk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3bS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNjkiIG5hbWU9InBsYW5uaW5nRGF0YSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJRLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsUE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsTy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIgbmFtZT0iRGVzY3JpcHRvciIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqQW5zZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICA8Ym9keT5BIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIAotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MTQyQkIwM0I1IiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2pBbnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HakFudC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCIgbmFtZT0icm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZqLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2pPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGMtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HakFudS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLQotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ii8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIiBuYW1lPSJ0YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd3FPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd3AtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNmxlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiIG5hbWU9ImFzc2lzdGVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyZy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dyZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JqT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NnLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIiBuYW1lPSJvcHRpb25hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY21PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2wtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiIG5hbWU9Im91dHB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1kdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1kZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0IiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1oZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1oT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR29PZTQtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR29PZTR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbndPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMkE1Rjg2MDJGNiIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqS1lzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTJBNUY4NjAyRjYiPgotICAgICAgICAgICAgICAgIDxib2R5PkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0tjMVp3T3lKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0tjcm93T3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0tWWUc0T3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEzRUMwMTgwMzQwIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaktZdHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEzRUMwMTgwMzQwIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1l0c1hvZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1l0c1hvT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1loQjBvT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZodWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIiBuYW1lPSJpbXBhY3RlZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmxlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiIG5hbWU9ImltcGFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dybU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dybC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1mLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1mdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaktZdWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb21wb3NpdGUgUm9sZSBpcyBhIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGOTRBQjkwMDE1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYZXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3IiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqVUpzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICA8Ym9keT5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQzAiIG5hbWU9ImlzUmVwZWF0YWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pkVG8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNDMCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqZFRwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENSIgbmFtZT0iaXNPbmdvaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUcC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0Q1Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2pkVHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0RFIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUcS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0RFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi0KLQotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqZFRyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HazlJZi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HazlJZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqZFRyLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPgotICAgICAgICAgICAgICA8Ym9keT5Qcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAKLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqbkVvLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFnZ3JlZ2F0aW9uIGFzc29jaWF0aW9uIHNwZWNpZmllcyB0aGUgcm9sZXMgb2YgdGVhbSBtZW1iZXJzIHdpdGggUm9sZSBEZXNjcmlwdG9ycy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiIG5hbWU9Il90ZWFtUHJvZmlsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2puRXAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2puRXB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HajVfbE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWxhdGVzIGEgU3ViLVRlYW0gdG8gaXRzIFN1cGVyLVRlYW0sIGkuZS4gdGhlIFRlYW0gdGhhdCBpdCBpcyBwYXJ0IG9mLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drRHdtT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiPgotICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gc3RydWN0dXJlcyBhcmUgbmVzdGVkIHN0cnVjdHVyZXMgKHNlZSBzdXBlckFjdGl2aXRpZXMgYXNzb2NpYXRpb24pIHByZXNlbnRlZCBub3JtYWxseSBhcyBpbmRlbnRlZCBsaXN0cy4gIFdpdGhpbiB0aGlzIG5lc3RpbmcgY2hpbGRyZW4gb24gdGhlIHNhbWUgbGV2ZWwgYXJlIG5vdCBzcGVjaWZpY2FsbHkgb3JkZXJlZC4gIEhvd2V2ZXIsIGEgdXNlciBvZiB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgd291bGQgZXhwZWN0IHRvIG9yZGVyIGVsZW1lbnRzIHdpdGhpbiBhIGxpc3QuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHByZXNlbnRhdGlvbiBzZXF1ZW5jZSBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRBZnRlciBpcyByZWR1bmRhbnQgdG8gdGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEJlZm9yZS4gIFRoaXMgcmVkdW5kYW5jeSBpcyByZXF1aXJlZCB0byBzdXBwb3J0IFByb2Nlc3MgQ29udHJpYnV0aW9ucyAoc2VlIHBsdWdpbnMpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHduLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tEd29lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFRhc2sgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb24gVGFzay4gIEhvd2V2ZXIsIGEgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIiBuYW1lPSJ0YXNrRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHdwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCBfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tEd3F1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbmUgV29yayBQcm9kdWN0LiAgSG93ZXZlciwgYSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4IiBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002Zy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002Z3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drTTZpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBSb2xlIERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uZSBSb2xlLiAgSG93ZXZlciwgYSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiIG5hbWU9InJvbGVEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNmpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSIgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tNNmtlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIHRoZSByZWZlcnJlZCBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIHNob3cgdXAgYXMgc2NoZWR1bGVkIHJlc291cmNlcyBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiIgbmFtZT0icGVyZm9ybXNBZGRpdGlvbmFsbHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002bU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002bC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIiBuYW1lPSJBc3Npc3RzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drTTZtdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyBoYXZlIGJlZW4gZGVmaW5lZCBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgdGhhdCBtYXkgcHJvdmlkZSBpbmZvcm1hdGlvbiBvciBhc3Npc3RhbmNlIGhlbHBmdWwsIGJ1dCBub3QgbWFuZGF0b3J5IHRvIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIG5vdCBzaG93IHVwIGFzIHNjaGVkdWxlZCByZXNvdXJjZXMgb24gdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiIgbmFtZT0iYXNzaXN0c0luIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiIgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha1dyaU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MsIGkuZS4gbm8gZGVmYXVsdHMgd2lsbCBiZSBkZWZpbmVkIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB1c2VkIGFzIGlucHV0cyB0aGF0IGFyZSBub3QgcHJvZHVjZWQgYnkgVGFza3Mgd2l0aGluIHRoZSBzYW1lIFByb2Nlc3MsIGJ1dCBieSBhbm90aGVyIGV4dGVybmFsIHByb2Nlc3Mgb3IgYW4gdW5rbm93biBzb3VyY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIiBuYW1lPSJleHRlcm5hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyai1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dyanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBuYW1lPSJJbXBhY3RzRGVwZW5kZW5jeSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha1dya2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNlbWktZm9ybWFsbHkgc3BlY2lmeSB0cmFjZWFiaWxpdHkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgd2l0aGluIHRoZSBzY29wZSBvZiBhbiBBY3Rpdml0eS4gIEEgbGluayBmcm9tIG9uZSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciB0byBhbm90aGVyIGluZGljYXRlcyB0aGF0IG9uZSBXb3JrIFByb2R1Y3QgaXMgcmVxdWlyZWQgYXMgaW5wdXQgdG8gYSBUYXNrIHRoYXQgcHJvZHVjZXMgdGhlIHJlbGF0ZWQgV29yayBQcm9kdWN0ICgnaW1wYWN0cycgcm9sZSBlbmQpLiAgSXQgd291bGQgYWxzbyBtZWFuIHRoYXQgYSBjaGFuZ2Ugb24gb25lIFdvcmsgUHJvZHVjdCBpbnN0YW5jZSBtYXkgYWZmZWN0IGEgY2hhbmdlIG9uIHRoZSByZWxhdGVkIHByb2R1Y3QuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiIG5hbWU9Ik1hbmRhdG9yeUlucHV0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEgXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drV3JtdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG1hbmRhdG9yeSBmb3IgdGhlIFRhc2sgdG8gYmUgcGVyZm9ybWVkLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NodWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIG5hbWU9Ik1vZGlmaWVzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tnY2lPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgZGVyaXZlZCBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSBNb2RpZmllcyBhc3NvY2lhdGlvbiBkZWZpbmVkIGJldHdlZW4gV29yayBQcm9kdWN0cyBhbmQgVGFza3MgaW4gQ29yZSBNZXRob2QgQ29udGVudC4gIFRoZSBzYW1lIGRlcml2YXRpb24gcnVsZSBhcyBmb3IgdGhlIGNvcmUgY29udGVudCBlbGVtZW50cyBhcHBsaWVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiIgbmFtZT0iX3JvbGVEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djai1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5IiBuYW1lPSJPcHRpb25hbElucHV0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drZ2NrZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG9wdGlvbmFsIGZvciB0aGUgVGFzayB0byBiZSBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIiBuYW1lPSJPcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djbGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBuYW1lPSJPdXRwdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tnY211ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgb3V0cHV0cyBmb3IgcGVyZm9ybWluZyB0aGUgcmVmZXJyZWQgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiIG5hbWU9Im91dHB1dEZyb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtYy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBuYW1lPSJQYWNrYWdlZFdQIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drcG1lT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiPgotICAgICAgICAgICAgICA8Ym9keT5JZiBhIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlZmVycyBhdCB0aGUgJ2RlbGl2ZXJhYmxlJyByb2xlIGVuZCB0byBhIERlbGl2ZXJhYmxlIFdvcmsgUHJvZHVjdCB0aGVuIHRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBEZWxpdmVyYWJsZSdzIFdvcmsgUHJvZHVjdCBwYXJ0cy4gIEFzIGluZGljYXRlZCBmb3IgRGVsaXZlcmFibGUgaW4gdGhlIENvcmUgTWV0aG9kIENvbnRlbnQgcGFja2FnZSwgdGhpcyBhc3NvY2lhdGlvbiBvdmVycmlkZXMgdGhlICdkZWxpdmVyZWRXb3JrUHJvZHVjdHMnIGFzc29jaWF0aW9uIG9mIHRoZSBXb3JrIFByb2R1Y3QsIHdoaWNoIHN0b3JlcyB0aGUgcmVjb21tZW5kZWQgZGVsaXZlcmFibGUgcGFydHMsIGJ1dCBjYW4gYmUgY3VzdG9taXplZCBmb3IgZXZlcnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3IuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCIgbmFtZT0iZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtZk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIiBuYW1lPSJQcmltYXJ5UGVyZm9ybXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2twbWdlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gYSBkZXNjcmlwdG9yIGZvciB0aGUgb25lIHJvbGUgcmVzcG9uc2libGUgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB0YXNrLiAgQW4gaW5zdGFuY2Ugb2YgdGhpcyByb2xlIHdvdWxkIHNob3cgdXAgYXMgYSBzY2hlZHVsZWQgcmVzb3VyY2Ugb24gYSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiIG5hbWU9InBlcmZvcm1zQXNPd25lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1pT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1oLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIG5hbWU9IlJlc3BvbnNpYmxlIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drcG1pdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgcmVzcG9uc2liaWxpdHkgZm9yIFdvcmsgUHJvZHVjdCBpbnN0YW5jZXMuICBJdCBpbmRpY2F0ZXMgb3duZXJzaGlwIGFuZCBmb3IgZXhhbXBsZSB3b3VsZCBkZWZpbmUgdGhlIFJvbGUgdGhhdCBhbnN3ZXJzIHRvIG1hbmFnZW1lbnQgcXVlc3Rpb25zIGFib3V0IHRoZSBxdWFsaXR5IHdvcmsgcHJvZHVjdC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhkdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiBfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiIG5hbWU9Il9jb21wb3NpdGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYZmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQgXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drelhmLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiPgotICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gc3RydWN0dXJlcyBhcmUgbmVzdGVkIHN0cnVjdHVyZXMgKHNlZSBzdXBlckFjdGl2aXRpZXMgYXNzb2NpYXRpb24pIHByZXNlbnRlZCBub3JtYWxseSBhcyBpbmRlbnRlZCBsaXN0cy4gIFdpdGhpbiB0aGlzIG5lc3RpbmcgY2hpbGRyZW4gb24gdGhlIHNhbWUgbGV2ZWwgYXJlIG5vdCBzcGVjaWZpY2FsbHkgb3JkZXJlZC4gIEhvd2V2ZXIsIGEgdXNlciBvZiB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgd291bGQgZXhwZWN0IHRvIG9yZGVyIGVsZW1lbnRzIHdpdGhpbiBhIGxpc3QuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHByZXNlbnRhdGlvbiBzZXF1ZW5jZSBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRCZWZvcmUgaXMgcmVkdW5kYW50IHRvIHRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRBZnRlci4gIFRoaXMgcmVkdW5kYW5jeSBpcyByZXF1aXJlZCB0byBzdXBwb3J0IFByb2Nlc3MgQ29udHJpYnV0aW9ucyAoc2VlIHBsdWdpbnMpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhodWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSBfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2t6WGlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGFzc29jaWF0aW9uIGxpbmtzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCB0byBpdHMgc3VjY2Vzc29yIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIiBuYW1lPSJsaW5rVG9TdWNjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HazlJZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HazlJZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UgXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drOUllT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCB0byBpdHMgcHJlZGVjZXNzb3IuICBFdmVyeSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGNhbiBoYXZlIHByZWRlY2Vzc29yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgdG8gaXQuICBTcGVjaWZpYyBwcmVkZWNlc3NvciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBXb3JrIE9yZGVyLCB3aGljaCBkZWZpbmVzIHRoZSBraW5kIG9mIHByZWRlY2Vzc29yIGFub3RoZXIgV29yayBCcmVha2Rvd24gRWxlbWVudCByZXByZXNlbnRzIGZvciBhbm90aGVyLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSIgbmFtZT0ic3VjYyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drOUlmT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drOUllLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ4OTFGMDJDRCIgbmFtZT0iUHJvY2Vzc1R5cGVzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dtbGdOLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRTEwMDdDMDMxRiI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwMDdDMDMxRiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3MiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNai0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxOTI5RTk5MDI5QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWpfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qXy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhNal9PZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4IiB1bmRlcmxpbmU9InRydWUiIGRlc2NyaXB0aW9uPSJDbGFzcyBEaWFncmFtOiBQcm9jZXNzVHlwZXMgLyBQcm9jZXNzQnJlYWtkb3duIiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qX2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTc5IiB5PSI5NjI2IiB3aWR0aD0iNDQ0NSIgaGVpZ2h0PSIxMTA5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1V5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1V5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1V6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdVd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1V3dWZYRWR1cUhvT0piVVJaUnciIHg9IjY2OTAiIHk9IjEwMjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOFdVMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk5NyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVTJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVTItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVTNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1UwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVTB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQyMCIgeT0iNzc0NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVS1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1VfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1VfZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTIxIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1VfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVS11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdVLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjg5IiB5PSI3NzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVkRlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWRXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWRk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWRnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVkN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWQy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjU3IiB5PSIyODUzIiB3aWR0aD0iMjExNiIgaGVpZ2h0PSIzMjc2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWVi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVlctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZaT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdWV09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZXZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTE0IiB5PSI3Nzk3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR21sZ09lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBQcm9jZXNzIFR5cGVzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgUHJvY2Vzcy4gIEFzIGRlcGljdGVkIGluIHRoaXMgZGlhZ3JhbSwgaXQgZGlzdGluZ3Vpc2hlcyBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvY2Vzc2VzIG5lZWRlZCB0byByZXByZXNlbnQgYnVpbGRpbmcgYmxvY2tzIGZvciBvdGhlciBwcm9jZXNzZXMgKENhcGFiaWxpdHkgUGF0dGVybiksIGNvbXBsZXRlIGVuZC10by1lbmQgcHJvY2Vzc2VzIChEZWxpdmVyeSBQcm9jZXNzKSwgb3IgcHJvY2Vzc2VzIHRoYXQgaGF2ZSBiZWVuIHJlZHVjZWQgdG8gdGhlIGVzc2VudGlhbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGV4cG9ydGluZyBhbmQgcGxhbm5pbmcgYSBwcm9qZWN0IHdpdGggYSB0aGlyZC1wYXJ0eSBwbGFubmluZyB0b29sIChQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlKS4gIChOb3RlLCB0aGUgcGFja2FnZSBNZXRob2QgUGx1Zy1pbiB3aWxsIHByb3ZpZGUgYW5vdGhlciB0eXBlIG9mIFByb2Nlc3MgY2FsbGVkIFByb2Nlc3MgQ29udHJpYnV0aW9uLikgIFRoZSBQcm9jZXNzIFR5cGVzIHBhY2thZ2UgYWxzbyBkZWZpbmVzIHByb2Nlc3Mtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIEd1aWRhbmNlIFR5cGVzIGFzIHdlbGwgQ2F0ZWdvcmllcy4gIFdoZXJlYXMgdGhlIEJyZWFrZG93biBwYWNrYWdlIGRlZmluZWQgdGhlIGJhc2ljIHBpZWNlcyBmb3IgZGVzY3JpYmluZyBicmVha2Rvd24gc3RydWN0dXJlcywgdGhpcyBwYWNrYWdlIHRha2VzIHRoZXNlIHBpZWNlcyBhbmQgcGxhY2VzIHRoZW0gaW50byBoaWdoZXIgb3JnYW5pemF0aW9uIHN0cnVjdHVyZXMgZm9yIGJyZWFrZG93bjogUHJvY2Vzc2VzLiAgQSBwcm9jZXNzIGlzIGRlZmluZWQgYXMgYSBzcGVjaWFsIEFjdGl2aXR5IGFuZCB0aGVyZWZvcmUgY29uc3RpdHV0ZXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGEgYnJlYWtkb3duLiAgSG93ZXZlciwgUHJvY2VzcyBjb250YWlucyBzcGVjaWFsIHByb3BlcnRpZXMgYW5kIGV4dGVuZGVkIHNlbWFudGljcyB0aGFuIEFjdGl2aXR5LiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOFdWR2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2IiBzb3VyY2U9Il9HOFdVLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZIZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWSWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjIzIiB5PSIyMjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDg3IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZKLWZYRWR1cUhvT0piVVJaUnciIHg9IjgxMSIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3MTIiIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWTGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZOLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZOZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZPZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOFdWR3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZHLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NzIsIC00NTcsIC01MDM3LCAzMjUxXSRbLTg3MiwgLTQ1MjEsIC01MDM3LCAtODEyXSRbMzEwNywgLTQ1MjEsIC0xMDU4LCAtODEyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RSIgc291cmNlPSJfRzhXVS1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWUU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVlBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWUHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MzEsIC00NDgsIC0zMjM0LCAzMjU5XSRbOTMxLCAtMjY1MCwgLTMyMzQsIDEwNThdJFszMTA3LCAtMjY1MCwgLTEwNTgsIDEwNThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZRLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWUk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIHNvdXJjZT0iX0c4V1UwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVlNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZSdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVlItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE5NCwgLTQ1NywgOCwgMzI1MV0kWy0xOTQsIC0yMDc0LCA4LCAxNjM0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWVE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOFdWVHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdVd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZVdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOFdWVC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZVT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExOCwgLTE2NDIsIC0zMywgMjQyMV0kWzExOCwgLTM2MTUsIC0zMywgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWVmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOFdWWi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4IiBzb3VyY2U9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWVi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVmJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZhLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZlc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk5IiB5PSIzMjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZldE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzMxIiB5PSIzNjQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDkzIiB5PSItMTc3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyNSIgeT0iMzE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOGZleC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZleGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOGZleS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZleWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVmFPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWYWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDU4LCAxMTg1LCAtNTY5OCwgLTI1NzNdJFsyNzY4LCAxMTg1LCAtMzk4NywgLTI1NzNdJFsyNzY4LCAzNzE2LCAtMzk4NywgLTQyXSRbNTE5OCwgMzcxNiwgLTE1NTcsIC00Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4ZmV6T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEQiIHNvdXJjZT0iX0c4V1ZWLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmUwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhmZTBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4ZmV6ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhmZXp1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTQ0OCwgNjU1MywgMzMxMF0kWy0yMDMsIC0zMjQyLCA2NTUzLCA1MTZdJFstNTY5OCwgLTMyNDIsIDEwNTgsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhmZTAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ZmUxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE5MjlFOTkwMjlDIiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc0JyZWFrZG93biI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUHRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUHNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MjIwIiB5PSIxMTk2MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFB4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFB3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUHd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY0NTkiIHk9IjQ5NjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY3NiIgaGVpZ2h0PSI5MzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFAwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUDB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxMzEiIHk9IjYwMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFA1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFA0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzNDQiIHk9Ijg4MjIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQX2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUF91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRQ09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQLXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFAtLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTAzIiB5PSI1MDcxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6QXVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2MjUiIGhlaWdodD0iODk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekF2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekF2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekF3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBdy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpBdGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekF0dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzg5IiB5PSIyMTM2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6QTJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6QTEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NjUyIiB5PSIxNTIzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekE4LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QS1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QS11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QV9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekFfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekFfdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekE4T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QThlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU2NCIgeT0iMTUyMTQiIHdpZHRoPSI0NjMxIiBoZWlnaHQ9IjExNzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJJdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpCSnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpCSS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNDg4IiB5PSIxNTEyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekJOdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6Qk8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QlBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QlAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJRZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekJNLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6Qk5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzNTQiIHk9IjExOTk2IiB3aWR0aD0iMjcwOSIgaGVpZ2h0PSIyMjM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzg4Szd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNTAiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4Szh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLOWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4Szl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLOS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4Sy1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4Sy1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzg4SzYtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLN09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTk0NiIgeT0iNjg0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TERPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4OExFT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzUzIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExGT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TEZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TEYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TEdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExHLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4OExEZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TER1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc5NSIgeT0iMjkyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4OExLZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzUzIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExMZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TEx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TE1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TE11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExOT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4OExKdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TEotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4OTEiIHk9IjI4MjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbXZSSWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSBtYWluIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHByb2Nlc3MuICBBIHByb2Nlc3MgaXMgcmVwcmVzZW50ZWQgYnkgYSBicmVha2Rvd24gb2YgQWN0aXZpdGllcywgd2hpY2ggaGFzICIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHBQOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFA5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHBQOGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhwUDh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjA5LCAtNTQxLCAtMzA0OCwgMjYwN10kWzMwMjIsIC0yNjI0LCAtNjM1LCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4cFA5LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHBQLU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4cFFDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBRRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NCIgeT0iNjY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk4MSIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNjIiIHk9Ii0zMTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE4NSIgeT0iMjI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2NCIgeT0iLTI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFIZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekFzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekFzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QXNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4cFFDdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhwUUMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NzksIC0yMzgsIC0xNTA4LCAzNTE5XSRbLTQ0NDUsIC0yMzgsIC00MDc0LCAzNTE5XSRbLTQ0NDUsIC0zNjUyLCAtNDA3NCwgMTA1XSRbLTEzMjMsIC0zNjUyLCAtOTUyLCAxMDVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpBeE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOHBQME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpBdE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekF5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpBeGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzh6QXh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNDY1LCAwLCAtMTgyMF0kWzAsIDE4MjgsIDAsIC00NTddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ekF5LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBek9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4ekE1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c4ekExdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QTZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4ekE1LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzh6QTZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjk2LCAtNTI0LCAtOCwgMjcyNl0kWzI5NiwgLTI3MTcsIC04LCA1MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ekE3ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBN3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4ekFfLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIHNvdXJjZT0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpCQS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItODc2IiB5PSIzOTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCQi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIyIiB5PSI2MzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJDdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2MiIgeT0iLTM3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODY3IiB5PSIxNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODAyIiB5PSItMTExMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJFLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4ekJBT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzh6QkFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTc3LCA1ODQsIDE3NywgNTg0XSRbMTc3LCAyNDQ2LCAxNzcsIDI0NDZdJFstMzQ2MiwgMjQ0NiwgLTM0NjIsIDI0NDZdJFstMzQ2MiwgMzk3LCAtMzQ2MiwgMzk3XSRbLTE5OTgsIDM5NywgLTE5OTgsIDM5N10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4ekJRdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIHNvdXJjZT0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QlJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJTdWZYRWR1cUhvT0piVVJaUnciIHg9IjYyNyIgeT0iMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU0NyIgeT0iMjYwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJVT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04MDciIHk9Ii0yOTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCVS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUxIiB5PSIyNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCV09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCVnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEtwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEtwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEtxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEtxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpCUS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekJST2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNTQsIDAsIDEzNTQsIDBdJFszMzk1LCAwLCAzMzk1LCAwXSRbMzM5NSwgLTE5MjEsIDMzOTUsIC0xOTIxXSRbMTg2LCAtMTkyMSwgMTg2LCAtMTkyMV0kWzE4NiwgLTExMTcsIDE4NiwgLTExMTddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEtzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLcmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4S3J1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExMjYsIC0xMTI2LCAyNDI5LCAyNDI5XSRbLTMwMzEsIC0zMDMxLCA1MjQsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4S3MtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEt0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4S3RlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgc291cmNlPSJfRzh6Qkl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEt1ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzMiIHk9Ii00OTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMzIiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLd09mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjciIHk9IjMzOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLdy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMiIgeT0iMjEzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3hlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt4dWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NyIgeT0iLTM0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEt5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEt6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt6ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4SzAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4SzBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEsxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEsxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4SzEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4SzFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEt0dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4S3QtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUwOCwgLTI3LCAtMjE5NiwgMjMwMl0kWzM1NDUsIC0yNywgLTE1OSwgMjMwMl0kWzM1NDUsIC0xMjE3LCAtMTU5LCAxMTEyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4SzJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzh6Qkl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEsyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEszdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4SzJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEsydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01NjcsIC01MjQsIDI4ODcsIDI2MjRdJFstMjg3MCwgLTI2MTYsIDU4NCwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLMy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLNGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HOHpBNy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEs1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLNHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4SzQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzI4LCAtNTkyLCAtMzQzNywgMjcwOV0kWzM0NzEsIC0yNzY4LCAtNjk0LCA1MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEs2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLNmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEstdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4OEs2dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4S191ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEstLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4S19PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNTE2LCAtMTAxLCAtMTI2MV0kWzAsIDEyNTMsIC0xMDEsIC01MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExBZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OExBLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c4OEs2dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TEItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OExCT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4TEJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzOCwgMzE4LCAtMjEyLCAtMTY2N10kWy0yMzgsIDE2NjcsIC0yMTIsIC0zMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExDdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OExIT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0c4OExET2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TElPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OExIZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhMSHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MjgsIDUyNCwgLTIyNjksIC0xNjA4XSRbMjI2MCwgMTYwOCwgLTczNiwgLTUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExKT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4TE5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzg4TEplZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUC1lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TE91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMT2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4TE51ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExOLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NTMsIDUyNCwgMjM0NSwgLTE3MTBdJFstMjM4NywgMTcxMCwgNzExLCAtNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMUE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TFBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhMUHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HOHBQd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TFFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TFJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExRdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhMUC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4TFFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk2NSwgNTE2LCAyNDg5LCAtMTM2M10kWy0yNTA2LCAxMzQ2LCA5NDgsIC01MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExSZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMUnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVGNjc4MDA0NSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NHdWlkYW5jZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3b09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlGN3BPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NzYiIGhlaWdodD0iOTE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjdxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjdxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3ck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjdyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3ci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOUY3b2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5RjdvdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NDciIHk9IjEzMTU3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3ME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlGNzFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3MmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3Mi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3M2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlGNzBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOUY3MHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTIiIHk9IjE1MTEzIiBoZWlnaHQ9IjE2NjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5Rjc0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBGay1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBGa09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEZrZWZYRWR1cUhvT0piVVJaUnciIHg9IjExMzQ2IiB5PSIxMDE2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm4tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RTg2MDE3RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEZvLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjU5IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGcU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGcXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGck9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQRm9PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGb2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE1OSIgeT0iODY0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEZ2T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRndlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ4LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEZ1ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEZ1dWZYRWR1cUhvT0piVVJaUnciIHg9IjExMTkyIiB5PSIxMTQ4MCIgd2lkdGg9IjQzMzYiIGhlaWdodD0iNTM5MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0R1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEdFdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdIZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEdELWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEdFT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMTg0IiB5PSIyNTMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQR0l1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHSi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0xPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0xlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQR0gtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQR0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExODQiIHk9IjM3NTAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdMdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBHTXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdOLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdPZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkya09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkya3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyay1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBHTC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBHTU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE4NCIgeT0iNDk2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5WTJtT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMm4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5WTJsZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTJsdWZYRWR1cUhvT0piVVJaUnciIHg9IjExMTg0IiB5PSI2MTg5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlZMnFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkycmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlZMnBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMnB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExODQiIHk9Ijc0MDgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVkydU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJ2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJ2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJ3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkydy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVkydGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTJ0dWZYRWR1cUhvT0piVVJaUnciIHg9IjExMDAiIHk9IjI1MDYiIHdpZHRoPSIyMzc5IiBoZWlnaHQ9Ijk2MjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbXZSSS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IHRvIHRoZSBkaWZmZXJlbnQgUHJvY2Vzcy1zcGVjaWZpYyBHdWlkYW5jZSBUeXBlcyBhZGRlZCB0byB0aGUgR3VpZGFuY2UgVHlwZXMgYWxyZWFkeSBkZWZpbmVkIGluIENvcmUgTWV0aG9kIENvbnRlbnQgZm9yIFByb2Nlc3Nlcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlQRnlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSIgc291cmNlPSJfRzlQRnVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlGNzBPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGek9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTczMiIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc4IiB5PSIyODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQyIiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYyZWZYRWR1cUhvT0piVVJaUnciIHg9IjM2MSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlQRnllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVBGeXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTUwNywgMjQxMywgODkwNiwgNTg0XSRbLTg5NDAsIDI0MTMsIDE0NzMsIDU4NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5UEY2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiIHNvdXJjZT0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5RjcwT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRjctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY4LWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MzIiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY5dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDYiIHk9IjMzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGLWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDIiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRl9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYxIiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHQWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGXy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHQmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBHQS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEdCLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEdDLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVBGN09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5UEY3ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMTcwLCA5NzksIDg4MzcsIC0yOTFdJFstOTQ0NiwgOTc5LCAxNTYxLCAtMjkxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlZMnhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlGNzRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkyeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMnpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxOSIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyei1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDAzIiB5PSItMTk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTIwdWZYRWR1cUhvT0piVVJaUnciIHg9IjY2NCIgeT0iMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTUiIHk9Ii0yMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyMk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTI0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI0T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTI1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI1T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkyeGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTJ4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIDMzMzUsIC04NjE5LCA4NF0kWzg4MjIsIDMzMzUsIC05ODIsIDg0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlZMjUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSIgc291cmNlPSJfRzlQRm4tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkyNi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk0MiIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjllZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjg5IiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMi1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4MyIgeT0iMTk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMl9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMl9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMi0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMl8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzQmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzQS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlZMjZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVkyNmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODI5LCAwLCA4ODczLCAxNzc4XSRbLTg1MTcsIDAsIDExODUsIDE3NzhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVkzQ3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1IiBzb3VyY2U9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVBGdU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTNEdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzcwIiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzRmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNHT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcxOSIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY1MiIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNJT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNIdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNJdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0t1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5WTNDLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlZM0RPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgNDYzMSwgLTkyMjgsIC0yMjI2XSRbODkwNiwgNDYzMSwgLTE1MDcsIC0yMjI2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlZM0xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlQR0R1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkzTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM05lZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg1NCIgeT0iMjk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM04tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM09PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NTIiIHk9IjI5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNQdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OCIgeT0iLTE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5rZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlua3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5sZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5rLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbm1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbmwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5WTNMdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlZM0wtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTQyNzUsIC05MTc3LCAtOF0kWzg4OTgsIC00Mjc1LCAtMTQ2NCwgLThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlubnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIiBzb3VyY2U9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVBHSHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW5vdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlucHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTMwIiB5PSIyOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlucWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5yT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MCIgeT0iMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwIiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbnRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW50ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbnVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW51ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWludk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWludXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlud09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWludnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpbm4tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWlub09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAtMzA0OCwgLTkxNzcsIDBdJFs4ODk4LCAtMzA0OCwgLTE0NjQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlud2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3IiBzb3VyY2U9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVBHTHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbngtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW54ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlueWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTA1IiB5PSIzMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW56ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluek9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW56LWZYRWR1cUhvT0piVVJaUnciIHg9IjcwMSIgeT0iMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4IiB5PSItMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluNGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpbnd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWludy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAtMTgyOCwgLTkxNzcsIDBdJFs4ODk4LCAtMTgyOCwgLTE0NjQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWluNU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIiBzb3VyY2U9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVkybE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW42T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluN09mWEVkdXFIb09KYlVSWlJ3IiB4PSItODc5IiB5PSIzNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW44T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluNy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW44dWZYRWR1cUhvT0piVVJaUnciIHg9IjY3NSIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1IiB5PSItMzQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbi11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbi1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbl91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbl9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5fLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvQU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpbjVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWluNXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAtNjA5LCAtOTE3NywgMF0kWzg4OTgsIC02MDksIC0xNDY0LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpb0ItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlZMnBPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9DdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9EZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlvQy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9FT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9ELWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9FZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9FdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0ZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwIiB5PSIyNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvR09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkwIiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0ctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9IdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9JdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvSmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvSS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvSi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpb0NPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWlvQ2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCA2MDksIC05MTc3LCAwXSRbODg5OCwgNjA5LCAtMTQ2NCwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW9LdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c5RjdvT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9MLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpb0x1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW9LLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpb0xPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODQsIC00NjUsIDg0LCA1ODMzXSRbODQsIC0xNDk4LCA4NCwgNDgwMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlpb01lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5aW9NdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpb00tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgc291cmNlPSJfRzlGNzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlGN29PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb09PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9PZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlvTi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpb05PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWlvTmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTMsIC0zMTgsIC01MywgMTY0MF0kWy01MywgLTE2NDEsIC01MywgMzE3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvT3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlpb08tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEJDRDAzMUEiIHR5cGU9IkNsYXNzIiBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvd3MiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGtPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cnhsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNzI3IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4bWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4bS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4bmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeG4tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlyeGtlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4a3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSIzNDg3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4b09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeHBPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4ck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4ci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOXJ4b2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cnhvdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2ODQiIHk9IjE2NTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEJFRTAwREMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOXJ4dmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTg2MiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh5T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cnh1dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeHUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTM2IiB5PSIxNzYwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4OWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeC1lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeC11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4LS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4X2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhfdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWlnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWlnLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpaGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOXJ4OXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cng5LWZYRWR1cUhvT0piVVJaUnciIHg9IjY5MTMiIHk9IjU2MjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbXZSSmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGhvdyB0aGUgY2F0ZWdvcnkgZGlzY2lwbGluZSBoYXMgYmVlbiBleHRlbmRlZCBpbiB0aGlzIHBhY2thZ2Ugd2l0aCBhbiBhZGRpdG9uYWwgYXNzb2NhdGlvbiB0byBBY3Rpdml0eSBwcm92aWRpbmcgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgZGVzY3JpYmVkIGJ5IHRoZSBEaXNjaXBsaW5lLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOXJ4c09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOXJ4a09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOXJ4b09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cnh0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOXJ4c2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlyeHN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgMCwgMTM3MV0kWzAsIC0xMzgwLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5cnh0LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOXJ4dU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5cngwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiIHNvdXJjZT0iX0c5cnh1ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5cnhvT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Mk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeDF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cngydWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2IiB5PSIzMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4M09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4M2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng0T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzIiB5PSIyOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE1NSIgeT0iLTIyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cng2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cng3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng2dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4N2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeDhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeDlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5cngwLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlyeDFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMxLCAtMjUsIC01NjcyLCA3Nl0kWzU4MTYsIC0yNSwgLTc4NywgNzZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOTFpaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HOXJ4OWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOXJ4a09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5MWlpdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOTFpaC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzkxaWlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgMCwgMTY3Nl0kWzAsIC0xNjg0LCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5MWlqZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOTFpanVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNDRTlGMDI5MSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NXb3JrRGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzkxaXJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzkxaXFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpcXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MTMwIiB5PSIzMzQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzkxaXZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpeGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzkxaXVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyODUzIiB5PSI3NjA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpeU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzkxaXpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpMWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzkxaXllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpeXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTciIHk9Ijc2MDgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOTFpM09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWk0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWk0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWk1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOTFpMmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5MWkydWZYRWR1cUhvT0piVVJaUnciIHg9IjU5MDEiIHk9IjU2MzAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOV9UamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ua2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UbU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9UaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODUzIiB5PSIxMjY4IiBoZWlnaHQ9IjEzNzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOV9UbmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ubi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ub2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UcU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9UbXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UbS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDc3OCIgeT0iMTI2OCIgaGVpZ2h0PSIxMzIyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVDgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1OTEiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1QtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9ULWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1QtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9ULS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RfT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UX2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UX3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9UOE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1Q4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjUzODkiIHk9IjY5NzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RfLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOV9VQS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VDLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVURPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VEZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VEdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1VBT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVUFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzkyNSIgeT0iMTAxNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VELWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOV9VRS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTcyNyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VHLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VIZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VIdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1VFT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVUVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY1NyIgeT0iODU1OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUtPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctSWRjZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODQ0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVUtlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9VS3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDY0IiB5PSIxMDIxOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctSWRrLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZG1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZG11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZG5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRuZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRudWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctSWRrT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZGtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUzNiIgeT0iNDQzOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctSWRyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZHNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZHMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZHRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWR0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctSWRxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZHF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA2NTEiIHk9IjMzNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkNE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWQ1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWQ1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWQ2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLUlkM2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWQzdWZYRWR1cUhvT0piVVJaUnciIHg9IjkxOTMiIHk9IjU2MzAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbXZSSi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1RnT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0c5MWkyT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVGhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5X1RnZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOV9UZ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxNzYxXSRbMCwgLTE3NjksIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlfVGgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1RpT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlfVHFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIgc291cmNlPSJfRzlfVGllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVG1lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UcmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1RzZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDIiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4IiB5PSIyNTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTc4IiB5PSItMTc1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlfVHF1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVHEtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjA5MCwgNjA5LCAtNTM0NSwgNjM1XSRbNTgyMSwgNjA5LCAtMTYxNCwgNjM1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlfVHpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCIgc291cmNlPSJfRzlfVGllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVG1lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UME9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1QxT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1QxLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDIiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkwIiB5PSIxNTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UM2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzg4IiB5PSItMTcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVDR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVDV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UN3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UN09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlfVHplZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVHp1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg0NSwgLTM4OSwgLTU2MjEsIC0zODldJFs2MDcwLCAtMzg5LCAtMTM5NywgLTM4OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1VILWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c5X1VELWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1Q3LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVUktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5X1VJT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOV9VSWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTUwLCAtNDU3LCAyMTQyLCAxNzc4XSRbLTIxNTAsIC0xNzg2LCA1NDEsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlfVUp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1VKLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZGZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgc291cmNlPSJfRzlfVUtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVUQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkZ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZGZ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWRmLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMzMCwgLTQ1NywgLTEzOTcsIDE4MjhdJFsxMzcxLCAtMTgzNywgLTM1NSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HOV9UXy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRpdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkaC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZGlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI4NywgLTQ1NywgMTEzNCwgMTgyOF0kWy0xMTUxLCAtMTgzNywgMjcwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRqZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkanVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWRuLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0c5MWl5T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZG8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWRvT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkb2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1OTIsIC01MjQsIC0yMDk5LCAxODExXSRbMjA4MiwgLTE4MjAsIC02MDksIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZHVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1JZHFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkdk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZHVlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWR1dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMzMsIDAsIC0yOTQ2LCAwXSRbMzM3OCwgMCwgLTE3MDEsIDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkd09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWR3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0c5MWl1T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZHhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWR3dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZHctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzNSwgLTUxNiwgLTg0LCAxODIwXSRbLTEzNSwgLTE4MjAsIC04NCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkeU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkeXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWR6dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkeS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZHpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjYwLCAtNTI0LCAtMjIzNSwgMTcxMF0kWzIyMDksIC0xNzE4LCAtNjg1LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWQwLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZDEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWQxT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZDFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMyMSwgLTUxNiwgLTcyOCwgMzU0N10kWy0zMjEsIC0zNTQ3LCAtNzI4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWQ3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0ctSWQzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZDhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWQ3ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkN3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjQzLCAtNTI0LCAyMTUwLCAxNzYxXSRbLTIxNjcsIC0xNzY5LCA2MjYsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQ5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREU4RjIwMTI1IiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb25UYXhvbm9teSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TT2RPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2YtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1TT2NlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODIyIiB5PSIxMDA3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TT2hPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPaWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2otZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1TT2dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzUxIiB5PSIyODg3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TT25lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT24tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT29lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3BlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPcHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3FPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1TT211ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPbS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MDA2IiB5PSI0NzU1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPc3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TT3R1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU090LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3dlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1TT3MtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTQyOSIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU084ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU084dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU085T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU085dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08tT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTy1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08tdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTy0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09fT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09fZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU083LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TTzhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzMDIiIHk9IjcwNzkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllkLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZZS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllmLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlloZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllodWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYlllT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWWVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYzNCIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWtPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYllsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNzI3IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZbS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZbmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW4tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1iWWtlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZa3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTU2IiB5PSI2NjU3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1iWXJlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZc3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZdE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZdHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1iWXF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzUxIiB5PSI0NzU1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZd3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1iWXh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWTBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1iWXctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1Njk4IiB5PSI0NzU1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR201Q0llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9HLVNPZ09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPY09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU09sT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPa2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1TT2t1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE1OSwgLTMzOCwgLTU1OTYsIDE1NDBdJFs0OTAyLCAtMTM3MSwgLTE4NTQsIDUwOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT2wtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU09tT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT3FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgc291cmNlPSJfRy1TT21lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09yLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPcmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT3F1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU09xLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDMyMzRdJFswLCAtMzI0MiwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPc09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3NlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPd3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9HLVNPc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPY09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU094dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPdy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1TT3hPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc0NSwgLTUyNCwgNDc0MSwgMzI4NV0kWy00NzQxLCAtMzI5MywgNzQ1LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU095ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctU095LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0ctU09zdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09tZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3otZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08wdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPMXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODAiIHk9IjM0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPMmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjc2IiB5PSItMjk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUxNyIgeT0iMjM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU080dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU081dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPNS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPNi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT3pPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU096ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODU0LCAtMjUsIDM2MzIsIDI1XSRbLTM2NDAsIC00MiwgMTg0NSwgOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctU09fdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiIHNvdXJjZT0iX0ctU09zdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU083dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TUEF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU1BCdWZYRWR1cUhvT0piVVJaUnciIHg9IjI2OCIgeT0iMzk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUENPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TUENlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzIiB5PSItMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYllZdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMyIgeT0iMjIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlladWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYllaZWZYRWR1cUhvT0piVVJaUnciIHg9IjM4IiB5PSItMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlliLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZY09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT18tZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU1BBT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDUxNiwgMCwgLTE2NjddJFswLCAxNjU5LCAwLCAtNTI0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1iWW9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRy1iWWtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1iWWQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZcE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1iWW9lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctYllvdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDE0MjJdJFswLCAtMTQzMCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZcC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWJZdWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HLWJZcWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPZ09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYll2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWJZdXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1iWXUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTM1NF0kWzAsIC0xMzYzLCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYll3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZd2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctYlkwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0ctYll3dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09nT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlkxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWTF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctYlkwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWJZMU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODEyLCAtNTI0LCAyMTMzLCAxMzU0XSRbLTIxNDIsIC0xMzYzLCA4MDQsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWTJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYlkydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsaS1XZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiPgotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9Gb1BXRU94TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsc3ZWLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPgotICAgICAgICAgICAgICA8Ym9keT5BIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiVnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiVmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsTnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIiBuYW1lPSJQcm9jZXNzIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xzdlctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiIG5hbWU9ImluY2x1ZGVzUGF0dGVybnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTNGMjAyMzgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbF9xUi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1IiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsc3ZYLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FVT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dsX3FULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzIiIG5hbWU9IlJvYWRtYXAiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2WS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMyIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDU4MjAzN0MiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgbmFtZT0iQWN0aXZpdHkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbDE1US1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW50cm9kdWNlZCBpbiB0aGUgcGFja2FnZSBCcmVha2Rvd24gd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGFuZCBpcyB0aGUgYmFzaXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjbGFzcyBQcm9jZXNzLgotRXh0ZW5kcyBBY3Rpdml0eSB3aXRoIGFuIGFzc29jaWF0aW9uIHRvIFJvYWRtYXAuICBUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgYWxzbyBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGV4dGVuc2lvbiBvZiB0aGUgRGlzY2lwbGluZSBjYXRlZ29yeS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSIgbmFtZT0icm9hZG1hcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiU3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dNLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIiBuYW1lPSJjaGVja2xpc3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV1BPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV08tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiIG5hbWU9ImNvbmNlcHRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV1JlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV1JPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiIG5hbWU9ImV4YW1wbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ0ktZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ0l1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiIG5hbWU9Imd1aWRlbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWxnTE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSIgbmFtZT0icmV1c2FibGVBc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWxnTmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRCRUUwMERDIiBuYW1lPSJEaXNjaXBsaW5lIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2wxNVItZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyI+Ci0gICAgICAgICAgICAgIDxib2R5PkRpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiBUYXNrcyBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiAgVGhpcyBpcyB0aGUgZXh0ZW5zaW9ucyBvZiBEaXNjaXBsaW5lIGRlZmluZWQgaW4gdGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gdG8gQWN0aXZpdGllcywgd2hpY2ggcmVwcmVzZW50IHR5cGljYWwgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgbWVhbmluZ2Z1bCBncm91cGluZ3Mgb2YgdGhlIERpc2NpcGxpbmUncyBUYXNrcyBpbnRvIHdvcmtmbG93cy4KLVRhc2tzIHJlcHJlc2VudCBkZXNjcmlwdGlvbnMgb2Ygd29yaywgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGJ5IERpc2NpcGxpbmVzLiAgVGhlIHJlYXNvbiB0aGF0IHNldmVyYWwgVGFza3MgYXJlIGFsbCBjYXRlZ29yaXplZCBieSB0aGUgc2FtZSBEaXNjaXBsaW5lIGlzIHRoYXQgdGhleSBhbGwgcmVwcmVzZW50IGEgcGFydCBpbiBhY2hpZXZpbmcgYSBoaWdoZXIgZ29hbCBvciBwZXJmb3JtaW5nIHdvcmsgdGhhdCBpcyBhbGwgcmVsYXRlZCB0byBlYWNoIG90aGVyLiAgRXZlcnkgRGlzY2lwbGluZSBkZWZpbmVzIHN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgaXQgY2F0ZWdvcml6ZXMuICBTdWNoIHN0YW5kYXJkIHdheXMgYXJlIGV4cHJlc3MgYnkgQWN0aXZpdGllcyBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGRlZmluaW5nIGhvdyB0aGUgVGFza3MgY2F0ZWdvcml6ZWQgYnkgdGhlIERpc2NpcGxpbmUgJ3dvcmsgdG9nZXRoZXInIGluIHRoZSBtb3N0IGdlbmVyaWMgd2F5LiAgVGhlc2UgcmVmZXJlbmNlIHdvcmtmbG93cyBhcmUgb2Z0ZW4gdXNlZCBmb3IgZWR1Y2F0aW5nIGFuZCB0ZWFjaGluZyBwcmFjdGl0aW9uZXJzLiAKLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFJlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RTg2MDE3RSIgbmFtZT0iUHJhY3RpY2UiPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlFRkUwMUNBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFRPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbDE1VGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0tIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMjAyMzgiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiBfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xfcVEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgdHJhY2VhYmlsaXR5IGZvciBhIFByb2Nlc3MgZG9jdW1lbnRpbmcgd2hpY2ggQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIGJlZW4gdXNlZCBmb3IgZGVmaW5pbmcgdGhlIHByb2Nlc3MuICBJdCBkb2N1bWVudHMgYXBwbGljYXRpb25zIG9mIGEgcGF0dGVybiB0aHJvdWdoIGNvcHkgYXMgd2VsbCBhcyBwYXR0ZXJuIGJpbmRpbmcuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2xfcVN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2xfcVNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3IF8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbF9xVE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+SWYgdGhlIFBsYW4gaGFzIGJlZW4gY3JlYXRlZCBiYXNlZCBvbiBvbmUgb3IgbW9yZSBwcm9jZXNzZXMgKGkuZS4gb3RoZXIgUGxhbnMsIENhcGFiaWxpdHkgUGF0dGVybnMsIGEgRGVsaXZlcnkgUHJvY2Vzcywgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZXNlKSwgdGhlbiB0aGlzIGFzc29jaWF0aW9uIGNhcHR1cmVzIGEgdHJhY2UgYmFjayB0byB0aGVzZSBzb3VyY2VzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiIgbmFtZT0iX3Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbF9xVS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNjkgXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsX3FWZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGUgUGxhbm5pbmdEYXRhIGNsYXNzIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSBfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21KYlJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbGlua3MgYW4gQWN0aXZpdHkgdG8gemVybyBvciBtb3JlcyBpbnN0YW5jZXMgb2YgdGhlIFJvYWRtYXAgZ3VpZGFuY2UgdHlwZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiIG5hbWU9ImFjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlRlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlRPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21KYlQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgZ3VpZGFuY2UgZG9jdW1lbnRzIHRoYXQgcHJvdmlkZSBlZHVjYXRpb24gbWF0ZXJpYWwgZm9yIHRlYWNoaW5nIHN0YWtlaG9sZGVycyBzdWNoIGFzIHByb2plY3QgbWFuYWdlcnMgb24gaG93IHRvIHBlcmZvcm0gcHJvamVjdHMgdGhhdCBmb2xsb3cgdGhpcyBEZWxpdmVyeSBQcm9jZXNzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQiIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJVLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21KYldPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgZ3VpZGFuY2UgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlbGF0ZWQgdG8gYSBEZWxpdmVyeSBQcm9jZXNzIGluc3RhbmNlIHRvIGRlc2NyaWJlIGFuZCBjaGFyYWN0ZXJpemUgaXRzIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMuIFRoZXNlIGRvY3VtZW50cyBjYW4gYmUgdXNlZCBmb3Igc2V2ZXJhbCBwdXJwb3NlcyBzdWNoIGFzIGludGVybmFsIG1hcmtldGluZyBjb21tdW5pY2F0aW9ucywgc2FsZXMgdHJhaW5pbmcgYW5kIGdlbmVyYWwgbWV0aG9kIGVkdWNhdGlvbi4gIEV4YW1wbGVzIGZvciBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbCBhcmUgSGlnaGxpZ2h0IERvY3VtZW50LCBGYWN0IFNoZWV0LCBhbmQgRGVsaXZlcnkgUHJvY2VzcyBTcGVjaWZpY2F0aW9uIE92ZXJ2aWV3LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xNLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIG5hbWU9IkJyZWFrZG93bk5lc3RpbmciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCBfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21TbE9PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYmlkaXJlY3Rpb25hbCBhc3NvY2lhdGlvbiByZXByZXNlbnRzIGJyZWFrZG93biBzdHJ1Y3R1cmUgbmVzdGluZy4gIEl0IGRlZmluZXMgYW4gbi1sZXZlbCBoaWVyYXJjaHkgb2YgQWN0aXZpdGllcyBncm91cGluZyB0b2dldGhlciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBvdGhlciBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLgotVGhlIHN1cGVyQWN0aXZpdGllcyByb2xlIGFsbG93cyBuYXZpZ2F0aW9uIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXMgcGFyZW50IEFjdGl2aXR5LiBUaGUgYnJlYWtkb3duRWxlbWVudHMgcm9sZSBhbGxvd3MgbmF2aWdhdGlvbiBmcm9tIGFuIEFjdGl2aXR5IHRvIGl0cyBuZXN0ZWQgQnJlYWtkb3duIEVsZW1lbnRzLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiBfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21TbFFlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgb25lIG1vcmUgcmVmZXJlbmNlIHdvcmtmbG93cyBmb3IgYSBEaXNjaXBsaW5lLiAgVGhlIHJlZmVyZW5jZSB3b3JrZmxvd3MgZGVmaW5lIHRoZSBtb3N0IHR5cGljYWwgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiBhIERpc2NpcGxpbmUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3IiBuYW1lPSJfZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxMjRCRUUwMERDIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFNPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIF8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBOUU4NjAxN0UiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUVGRTAxQ0EiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsVC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMgXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtU2xVZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNhbiBiZSB1c2VkIHRvIGxpbmsgYWxsIGtpbmRzIG9mIGdlbmVyYWwgZ3VpZGFuY2UgdG8gdGhlIEFjdGl2aXR5IHRoYXQgaXMgYmVpbmcgbWFuYWdlZCBhcyBnZW5lcmFsIFN1cHBvcnRpbmcgTWF0ZXJpYWwuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1IiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dOdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dOZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyBfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21jV09PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktIChvciBQcm9jZXNzLSkgc3BlY2lmaWMgY2hlY2sgcG9pbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHRoZSB3b3JrIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV1AtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV1B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5IF8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWNXUWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWxhdGVzIGNvbmNlcHRzIG9yIHdoaXRlcGFwZXJzIHRvIHRoZSBBY3Rpdml0eSBwcm92aWRpbmcgaW1wb3J0YW50IGJhY2tncm91bmQgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBkb2luZyB0aGUgd29yayBkZXNjcmliZWQgYnkgdGhlIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5MDAyNTIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXU09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXUi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIgXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtY1dTdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NDAzQjciPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNhbiBwcm92aWRlIHJlZmVyZW5jZXMgdG8gZXhhbXBsZXMgcmVsZXZhbnQgdG8gdGhpcyBzcGVjaWZpYyBBY3Rpdml0eSAob3IgUHJvY2VzcykuICA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ0p1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ0plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIF8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWxnS09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBBY3Rpdml0eS1zcGVjaWZpYyBHdWlkZWxpbmVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWxnTC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnTHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkgXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtbGdNZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlZmVycyB0byBSZXVzYWJsZSBBc3NldHMgc3BlY2lmaWMgdG8gdGhpcyBBY3Rpdml0eSAob3IgUHJvY2VzcykuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0duVnVIdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjU3REM4MDE5NyI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjU3REM4MDE5NyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWxKWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEphdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpiLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctbEpZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEpZdWZYRWR1cUhvT0piVVJaUnciIHg9IjE5NzIiIHk9IjE5ODEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWxKdXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKeGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWxKdC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEp1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjcyNjYiIHk9IjU5MjgiIHdpZHRoPSI0MDQ3IiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWxKeXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzAzMSIgaGVpZ2h0PSIxMTM0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEowZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEowLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWxKeC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEp5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTEiIHk9IjkxMzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEoxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWxKMnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEozZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEozLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEo0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEo0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKNWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWxKMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEoyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI1MDYiIHk9IjYxMjkiIHdpZHRoPSIzMzE4IiBoZWlnaHQ9IjE3NjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HblZ1SU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSBkZWZpbml0aW9uIG9mIFByb2Nlc3MgUGFja2FnZSBhbmQgd2hhdCBlbGVtZW50cyBpdCBjYW4gc3RvcmUuICBUaGUgUHJvY2VzcyBQYWNrYWdlIHBhY2thZ2UgZXh0ZW5kcyBNZXRob2QgUGFja2FnZSB3aXRoIHRoZSBuZXcgY29uY2VwdCBvZiBQcm9jZXNzIFBhY2thZ2UuICBXaGVyZWFzIHRoZSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIENvbnRlbnQgUGFja2FnZXMgc3RvcmVzIGNvcmUgY29udGVudCBlbGVtZW50cywgdGhlIFByb2Nlc3MgcGFja2FnZSBpcyBzcGVjaWFsaXplZCBpbiBzdG9yaW5nIFByb2Nlc3MgRWxlbWVudHMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IHZlcnN1cyBQcm9jZXNzIFBhY2thZ2VzIGVuZm9yY2VzIHRoZSBzZXBhcmF0aW9uIG9mIG1ldGhvZCBjb250ZW50IHZlcnN1cyBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiAgTWV0aG9kIGNvbnRlbnQgaXMgaW50ZW5kZWQgYmUgcmV1c2VkIGluIG1hbnkgcHJvY2Vzc2VzLiAgVGhlcmVmb3JlLCBzdG9yaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBhY2thZ2Ugd291bGQgZWFzaWx5IHZpb2xhdGUgdGhpcyBwcmluY2lwbGUgYW5kIHByb2Nlc3MgbW9kZWxzIHdvdWxkIGJlIGJlY29tZSB1bm5lY2Vzc2FyaWx5IGNvaGVzaXZlLiAgVGhlcmVmb3JlLCBVTUEgZW5mb3JjZXMgdGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBhbmQgUHJvY2VzcyBieSBub3QgYWxsb3dpbmcgdG8gc3RvcmUgdGhlbSBpbiB0aGUgc2FtZSB0eXBlIG9mIHBhY2thZ2UuICIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWxKY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1IiBzb3VyY2U9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSmRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYxMCIgeT0iLTMxMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEplZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEplT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03MTciIHk9Ii0zOTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEplLWZYRWR1cUhvT0piVVJaUnciIHg9IjczOCIgeT0iLTM1MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzI4IiB5PSItMjk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpnZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMzciIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKaXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpqT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEprdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEprT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWxKY2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWxKY3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4NDcsIDUwMiwgODQ3LCA1MDJdJFs4NDcsIDE4MDIsIDg0NywgMTgwMl0kWzY4ODAsIDE4MDIsIDY4ODAsIDE4MDJdJFs2ODgwLCAyOTEsIDY4ODAsIDI5MV0kWzE2MTQsIDI5MSwgMTYxNCwgMjkxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1sSmstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSIgc291cmNlPSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEptZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEpsLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzNyIgeT0iLTUwOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEptdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEptLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNzMiIHk9Ii04NzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpudWZYRWR1cUhvT0piVVJaUnciIHg9Ii02ODYiIHk9Ii0yNzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSm9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzEzIiB5PSItMzA4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3NyIgeT0iLTMzMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpxLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctbEpsT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctbEpsZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2MTQsIDUzLCAxNjE0LCA1M10kWzY4NTMsIDUzLCA2ODUzLCA1M10kWzY4NTMsIC0xOTA1LCA2ODUzLCAtMTkwNV0kWzIzOSwgLTE5MDUsIDIzOSwgLTE5MDVdJFsyMzksIC01MzAsIDIzOSwgLTUzMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctbEo1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAyRTciIHNvdXJjZT0iX0ctbEoxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSjZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctbEo1LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1sSjZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjcsIC04ODAsIDE2LCAzMzM1XSRbNjcsIC0zNDAzLCAxNiwgODEyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2WU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NlllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLXU2WXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0I5IiBzb3VyY2U9Il9HLWxKdHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Wi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZadWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLXU2WS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctdTZaT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDM3LCA4MCwgMzI1NSwgLTc5XSRbLTM2MjUsIDgwLCAxNjY3LCAtNzldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZhZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2YXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctdTZhLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiIHNvdXJjZT0iX0ctbEoxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEp4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2YnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Y2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11NmItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2Yy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2ZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZlZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjgiIHk9Ii0xODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2Zk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA3IiB5PSIxNTMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2aWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2aC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2amVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2aS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy11NmJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLXU2YmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4NCwgODgwLCAtMTYsIC0xODExXSRbODQsIDIxMjUsIC0xNiwgLTU2N10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMEFCNjYwMDM5QiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctdTZrdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11Nm1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11Nm0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZuZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctdTZqLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11NmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDA4OSIgeT0iNzQ3NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctdTZvdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2by1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZyZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctdTZuLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11Nm9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzUxMyIgeT0iNDU4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctdTZ1LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NndPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11Nnd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ4dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctdTZ1T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11NnVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUzOTIiIHk9IjIzNTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVVdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc0NjciIHk9IjEwMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RWJlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RWF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDMxMiIgeT0iNzQ0MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEVodWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVrZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEVnLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RWhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk1NTgiIHk9IjczOTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODFFMzAzNDIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFNWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEU2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEU3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEU3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFOE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFNHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEU0LWZYRWR1cUhvT0piVVJaUnciIHg9IjExNTEiIHk9IjEwMzM3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFLXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RV9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RV91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iMTEwMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRGQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxVWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxVmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RS0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFX09mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDY1OCIgeT0iMTUzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfQjFYT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFaLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfQjFXZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMVd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAyMDkiIHk9IjQyOTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HblZ1SXVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IHRvIHRoZSBzcGVjaWZpY2F0aW9uIG9mIFByb2Nlc3MgQ29tcG9uZW50cy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy11NnJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nm51ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2c3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy11NnItZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctdTZzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NTgsIDAsIDIzMzZdJFswLCAtMjM0NSwgMCwgNTUwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2dGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NnR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HLTRFVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVaT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFWWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RVl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTcxMSwgLTU1OCwgMjg5NSwgMjI4Nl0kWy0yOTEyLCAtMjI5NCwgNjk0LCA1NTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEVaLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFYU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEVlZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0ctNEVhZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RWZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEVldWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RWUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMzIsIDgsIDUwODAsIC00Ml0kWy01OTY5LCA4LCAxMTQzLCAtNDJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEVnT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFZ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEVrdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiIHNvdXJjZT0iX0ctNEVVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RWx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjg0IiB5PSItMjk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFbmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDIiIHk9IjMxMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFb09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDU3IiB5PSIyMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RW8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjk1IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFc09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFcnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFdE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RWstZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFbE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzcxLCAtOTMsIC0xMTczNCwgMjkwNF0kWzEzMDY0LCAtOTMsIC00MiwgMjkwNF0kWzEzMDY0LCAtMjUxNCwgLTQyLCA0ODJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFdGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIiBzb3VyY2U9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLTRFYWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEV1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjUyIiB5PSItMjk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFdy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzUiIHk9IjE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV4dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02ODEiIHk9Ii0zMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEUwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEUwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEUxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEUxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFdHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEV0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzg3LCA1MCwgNzIxMywgLTUwXSRbLTc1NjksIDUwLCAyMDMyLCAtNTBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMUJENkEwMjNCIiBzb3VyY2U9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2bnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEUzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFMmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEUydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDkxLCAtNDgyLCAxNDYyMSwgMjI2MF0kWy0yMDkxLCAtMjQ5NywgMTQ2MjEsIDI0NV0kWy0xNDk5NCwgLTI0OTcsIDE3MTgsIDI0NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RTMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEU0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RThlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4MjFCMDA4NyIgc291cmNlPSJfRy00RTRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RTh1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEU4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI2MiwgLTQ5MSwgLTEzMTIsIDIzMDJdJFsxMjQ0LCAtMjI0MywgLTMzMCwgNTUwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFLU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RS1lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX0IxYU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0I5IiBzb3VyY2U9Il9HX0IxV09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2dC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFiT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX0IxYWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19CMWF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyNTMsIC00OTEsIDM3MjUsIDE0MzldJFstMzY5OSwgLTE0MzksIDEyNzgsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19CMWItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfQjFjT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMWNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSIgc291cmNlPSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxZGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk5IiB5PSItMjk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxZk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzciIHk9IjEwMjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjIiIHk9Ii0xNjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MCIgeT0iMTAxNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFoLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFoZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFpZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMWotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWplZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk0IiB5PSI5NzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFrZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX0IxY3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19CMWMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ5MSwgMCwgMjYwN10kWzAsIC0yNjE2LCAwLCA0ODJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX0IxbE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIiBzb3VyY2U9Il9HLTRFNGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX0IxV09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFtT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixbk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzg3MiIgeT0iLTc3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFuLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMW91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTczMyIgeT0iLTMwMDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMXN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMXR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfQjFsZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19CMWx1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzM4LCA0ODIsIC0xNzk0OSwgNjUyN10kWzMzOCwgMTY0MiwgLTE3OTQ5LCA3Njg3XSRbMjM1NTQsIDE2NDIsIDUyNjYsIDc2ODddJFsyMzU1NCwgLTYyNTYsIDUyNjYsIC0yMTFdJFsyMDAyMywgLTYyNTYsIDE3MzUsIC0yMTFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX0IxdC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIiBzb3VyY2U9Il9HX0IxV09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLTRFLXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjF1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixdi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTQiIHk9IjE5MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIzOCIgeT0iMTg1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwOSIgeT0iLTczNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjF6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjEwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjEwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF6LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMTFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMTAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjExdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjEyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMTJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMTEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfQjF1T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19CMXVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIC00ODIsIDAsIDIyMDldJFs1MCwgLTIxNDIsIDAsIDU1MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbTVDSS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ij4KLSAgICAgICAgICAgIDxib2R5PjAzPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfcjBWUklPeGhFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3IiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR201Q0xlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0I5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIj4KLSAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9vQ1FwY08tZEVkdTVPT2VqeTA2MjR3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iX29DUXBjZS1kRWR1NU9PZWp5MDYyNHciIGtleT0iZXh0ZW5kIi8+Ci0gICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgPC9nZW5lcmFsaXphdGlvbj4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiIG5hbWU9ImludGVyZmFjZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbkNNSXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbkNNSWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiIG5hbWU9InByb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HblZ1RS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HblZ1RXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4MUUzMDM0MiIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbTVDTWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4MjFCMDA4NyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlKZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlKT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25DTUUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMUJENkEwMjNCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlGdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIiBuYW1lPSJpbnRlcmZhY2VJTyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlIT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25DTUYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDJFNyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25WdUhPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25WdUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIF8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbkNNRy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgdGhlIHJlYWxpemF0aW9uIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhIFByb2Nlc3MgQ29tcG9uZW50IGFuZCBhIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIiIG5hbWU9InJlYWxpemVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbkNNSC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbkNNSHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UgXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01KT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiPgotICAgICAgICAgICAgICA8Ym9keT5JbnN0YW5jZXMgb2YgdGhpcyBhc3NvY2lhdGlvbiBjb250YWluIHRoZSBsaXN0IG9mIFRhc2sgRGVzY3JpcHRvcnMgdGhhdCByZXByZXNlbnQgYSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlFLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlFdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMgXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duTDlHT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNvbnRhaW5zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdCB0eXBlIGluc3RhbmNlcyB1c2VkIGZvciB0aGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24uPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5IiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUgtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCBfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25MOUllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIFByb2Nlc3MgQ29tcG9uZW50IGl0IHJlZmVycyB0by4gIEEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGV4YWN0bHkgb25lIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA1ODFFMzAzNDIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5S09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5Si1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYgXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duTDlLdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IGNvbnRhaW5zIG9ubHkgZXhhY3RseSBvbmUgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HblZ1RnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HblZ1RmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYzIF8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HblZ1R09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIFBhY2thZ2UgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cyB3aGljaCBhcmUgdXNlZCB0byBkZWZpbmUgQnJlYWtkb3duIGFuZCBQcm9jZXNzZXMuICBBIFByb2Nlc3MgRWxlbWVudCBpbnN0YW5jZSBjYW4gYmUgcGFydCBvZiBvbmx5IG9uZSBQcm9jZXNzIFBhY2thZ2UgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0IiBuYW1lPSJfcHJvY2Vzc1BhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9ucyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hb09lNS1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUVENjgyQjAxNzAiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVENjgyQjAxNzAiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1kdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQxMTAzODciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQzNyIgaGVpZ2h0PSIxOTk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1nT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1ndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1oT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1oZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfTG1kLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM5MyIgeT0iODgwNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMUI2MDBEOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1pdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI1MTQ3IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xta2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWxlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbWgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzUzIiB5PSI2MzgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMTA0NTUwMjA4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19MbW11ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjU0MzUiIGhlaWdodD0iMzI2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1uLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1vZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1vLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0xtbC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfTG1tT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ1NTAiIHk9IjE0NTQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMTA0NzQwMTFBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19MbXF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1MzkiIGhlaWdodD0iMTk5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1yLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1zZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1zLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0xtcC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfTG1xT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUzNDIiIHk9IjExOTU0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3UU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRDdCNDkwMDg2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19Vd1JPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0MzYiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Ui1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3U3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3VC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3UWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdRdWZYRWR1cUhvT0piVVJaUnciIHg9IjU3NSIgeT0iODgyMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1VPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdWT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjE1NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3V2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3WGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1gtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd1VlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3VXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzU1IiB5PSIxMzk1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19Vd2lPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MzgiIGhlaWdodD0iMTU0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3anVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3a09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3a3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3ay1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3aGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdodWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NTgiIHk9IjM1OTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hb09lNmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIGRlZmluaXRpb24gb2YgdGV4dHVhbCBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGZvciBQcm9jZXNzZXMgdGhhbiBmb3IgTWV0aG9kIENvcmUgQ29udGVudCBFbGVtZW50cy4gIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgY2FuIGJlIGZvdW5kIGluIHBhY2thZ2UgTWV0aG9kIFVuaXRzIGluIHdoaWNoIHRoZSBncmFudWxhcml0eSBvZiBNZXRob2QgVW5pdHMgZm9yIHRoZXNlIGVsZW1lbnRzIGhhcyBiZWVuIGRlZmluZWQgZGlmZmVyZW50bHkuICBXaGVyZWFzIGEgQ29udGVudCBEZXNjcmlwdGlvbiBNZXRob2QgVW5pdCBpcyBjcmVhdGVkIGZvciBldmVyeSBDb250ZW50IEVsZW1lbnQsIFByb2Nlc3MgaXMgbWFpbnRhaW5lZCBhcyBhIHdob2xlIGluIGEgUHJvY2VzcyBDb21wb25lbnQgTWV0aG9kIFVuaXQuICBUaGVyZWZvcmUgdGhlIHBhY2thZ2UgTWV0aG9kIENvcmUgRGVzY3JpcHRpb24gY29udGFpbnMgYSB0YXhvbm9teSBvZiBzcGVjaWFsIENvbnRlbnQgRGVzY3JpcHRpb24gc3BlY2lhbGl6YXRpb24gYW5kIHRoZSBQcm9jZXNzIERlc2NyaXB0aW9ucyBwYWNrYWdlIGNvbnRhaW5zIGV4dGVuZGVkIHZlcnNpb24gb2YgY2xhc3NlcyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2Ugd2hpY2ggbWVyZ2UgbmV3IGF0dHJpYnV0ZXMgZm9yIGRlc2NyaXB0aW9uIGludG8gdGhlc2UgY2xhc3NlcyB2aWEgcGFja2FnZSBtZXJnZS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd1lPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4QzgwMDNCQSIgc291cmNlPSJfR19MbXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbWR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3Wk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd1llZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfVXdZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC0xMDA3LCAwLCAyMTQyXSRbMCwgLTIxNTAsIDAsIDk5OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd1otZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdhT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd2FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0E0MDJEMSIgc291cmNlPSJfR19MbWx1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbXB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3YmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd2F1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3YS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC0xNjQyLCAwLCAyMTE2XSRbLTUwLCAtMjc2MCwgMCwgOTk5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Y09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2NlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX1V3Y3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OThDRTkwMkNBIiBzb3VyY2U9Il9HX1V3UU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX0xtaHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdkdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX1V3Yy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfVXdkT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg1NSwgLTU4NCwgLTEyNzgsIDE4NTRdJFs4NTUsIC0xODYyLCAtMTI3OCwgNTc1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3ZWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2V1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX1V3ZS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OThDNkYwMTk3IiBzb3VyY2U9Il9HX0xtZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX0xtaHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Z09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2dlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdmLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX1V3Zk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfVXdmZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MTQsIC0xMDA3LCAxNzY5LCAxODM3XSRbLTQxNCwgLTIyNzcsIDE3NjksIDU2N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2d1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd25lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0NDMDM2QSIgc291cmNlPSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19Vd2hPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd291ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3b2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd251ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3bi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOCwgLTU3NSwgLTgsIDIwMTVdJFstOCwgLTE4MjAsIC04LCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3cGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbmU0RHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjJBMUIwMkU3Ij4KLSAgICAgICAgICAgIDxib2R5PjA0PC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfSVp0X01PeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRkQ4OTFGMDJDRCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEQxQjYwMEQ4IiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0NDMDM2QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMzc2MjdEMDA4NCIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbmU0Ry1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEzNzYyN0QwMDg0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9GWWJyd2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9GWWJyd095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9GUVlqQU95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTA0MTEwMzg3IiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5OEM2RjAxOTciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUUwRDFCNjAwRDgiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyRTQiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25vcEJPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJFNCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il83SkVVd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il83SkVVd095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il82X1BEVU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM1MiIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dueHk4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNTIiPgotICAgICAgICAgICAgICAgIDxib2R5PkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWmJuWUlleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWmJuWUlPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWlMtWmdPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI4MzAxNUEiIG5hbWU9Imhvd3RvU3RhZmYiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR254eTllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMzc2MjgzMDE1QSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9YVHIzd2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9YVHIzd095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9YS0poUU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTA0NTUwMjA4IiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDQTQwMkQxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMTA0NzQwMTFBIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzcxIiBuYW1lPSJzY2FsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbnh5LXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzcxIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfY2xNMHNleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfY2xNMHNPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfY2FlTFlPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzN0EiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR254eV9lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3QSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzZMT3pnZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzZMT3pnT3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzZETHF3T3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzg0IiBuYW1lPSJyaXNrTGV2ZWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ajh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9nVnZSb2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9nVnZSb095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9nNlBzNE95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbjdqOWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzg1Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1lad1NnZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1lad1NnT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1lQVWtJT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzhFIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duN2otT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOEUiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXy1rN0NnZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1rN0NnT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hTVpNT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzk4IiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbjdqLS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzk4Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfSUwxbmdleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSUwxbmdPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfSUVpc3NPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNDc0MDExQSIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5OEM4MDAzQkEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUUxMDQxMTAzODciLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUMiIG5hbWU9InNjb3BlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlU4LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUMiPgotICAgICAgICAgICAgICAgIDxib2R5PkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2VFbVZjZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2VFbVZjT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2Q3TnY4T3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0FEIiBuYW1lPSJ1c2FnZU5vdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlU5dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUQiPgotICAgICAgICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdTFBTkFleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdTFBTkFPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdXJkMmdPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUQ3QjQ5MDA4NiIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENFOTAyQ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUUwRDFCNjAwRDgiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I2NTAzOTQiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb0ZVLS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRDdCNjUwMzk0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0hTZVdrZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0hTZVdrT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0hLYk4wT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyBfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29GVV91ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA0MDM5MCI+Ci0gICAgICAgICAgICAgIDxib2R5Pkxpc3QgdGhlIHN0ZXBzIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvIGJlIHBlcmZvcm1lZCBmb3IgdGhlIGluc3RhbmNlIG9mIHRoZSBUYXNrIERlc2NyaXB0b3IuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1IiBuYW1lPSJfdGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMzc1RTA0MDM5MCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvT2U1dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvT2U1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIiBuYW1lPSJNZXRob2RQbHVnaW4iPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dwSDJ3T2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjU3QUM4MDM1RSI+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1N0FDODAzNUUiIHR5cGU9IkNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBei1CT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1CZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1CdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1CLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQXotQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzQ5NSIgeT0iMzg0MyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQXotTi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUwNCIgaGVpZ2h0PSIxNjI1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1RdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEF6LU5PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LU5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDUwNCIgeT0iMzcwOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQXotamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXota09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1rdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1rLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1sT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1sZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1sdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1sLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotbU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBei1pdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1pLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMjE5IiB5PSI5OTkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEE5dkUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1MDYiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Ri1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2R09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2R3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Ry1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2SE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2SGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dkh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQTl2RU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2RWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDE3NiIgeT0iNjY0NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3BIMnd1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbXMgc2hvd3MgdGhlIGRlZmluaXRpb24gb2YgTWV0aG9kIFBsdWdpbnMuIE1ldGhvZCBQbHVnaW5zIGV4dGVuZCBlYWNoIG90aGVyIGFuZCBhcmUgdGhlIGNvbnRhaW5lciBvZiBhbGwgTWV0aG9kIFBhY2thZ2VzLiIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBei1FT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciIHNvdXJjZT0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LUZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTk4IiB5PSIzMTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDgyIiB5PSI3NjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzg3IiB5PSI3NzgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1IZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1IdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzgyIiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc5MiIgeT0iLTMwMyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1KT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotS3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1LT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1LLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1MdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1NZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1NdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LU1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEF6LUVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEF6LUV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjYwNywgLTI0NSwgMjYwNywgLTI0NV0kWzQ4MTcsIC0yNDUsIDQ4MTcsIC0yNDVdJFs0ODE3LCAxODM3LCA0ODE3LCAxODM3XSRbNTUwLCAxODM3LCA1NTAsIDE4MzddJFs1NTAsIDU3NSwgNTUwLCA1NzVdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBei1RLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiIHNvdXJjZT0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1SLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1TdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMyIgeT0iMzY0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEzOSIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM2IiB5PSI0NTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1VLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1WT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyNSIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1XT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1WLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1XLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1YdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1ZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1aT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1aZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEF6LVJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEF6LVJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjI1MiwgLTEyNywgLTcwOTUsIC0yNV0kWzY3MzksIC0xMjcsIC0yNjA3LCAtMjVdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBei1adWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIHNvdXJjZT0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1hdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1iZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDUyIiB5PSItODU1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMDAiIHk9Ii04ODciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1kT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjcxIiB5PSItMjMzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1kLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMjEiIHk9IjMyMyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1ldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1mLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1mdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1oT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1pT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEF6LVotZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEF6LWFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyNTIsIDUwLCAtMjI1MiwgNTBdJFstNDQ4NywgNTAsIC00NDg3LCA1MF0kWy00NDg3LCAxODYyLCAtNDQ4NywgMTg2Ml0kWy0xMjE5LCAxODYyLCAtMTIxOSwgMTg2Ml0kWy0xMjE5LCA4MTIsIC0xMjE5LCA4MTJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBei1tZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRDVGODAzOEUiIHNvdXJjZT0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1pZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2QS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1tdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEF6LW0tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTMxMiwgLTgyMSwgLTM1NjQsIDIxNzVdJFs0MDA0LCAtMjQ3MiwgLTg3MiwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2QmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEE5dkJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFEQzAxMDI4RCIgc291cmNlPSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEF6LWllZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Qy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEE5dkItZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQTl2Q09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODg5LCAtNTg0LCAzNTgxLCAyMzExXSRbLTM2NDksIC0yMzcwLCA4MjEsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZEZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBOXZILWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0MwQTAxRDciIHNvdXJjZT0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBOXZELWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2SmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZJLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBOXZJT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEE5dkllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQxMywgODEyLCAtMzI1OSwgLTE4NzldJFszNjkxLCAyMTE2LCAtOTgyLCAtNTc1XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2Si1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEE5dktPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNTE4QkQ3MDFFMyIgc291cmNlPSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEE5dkQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEE5dktlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQTl2S3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTkwLCA1NzUsIDM2ODMsIC0yMjE4XSRbLTM3NDIsIDIyMTgsIDkzMSwgLTU3NV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZMLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dk1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY5QzVGMDAyRTEiIHR5cGU9IkNsYXNzIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hBOXZNdWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIgZGVzY3JpcHRpb249Int2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50LnR5cGUoKSA9PSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LnR5cGUoKX0gOiB7dmFyYWJpbGl0eSBjYW4gb25seSBiZSBkZWZpbmVkIGJldHdlZW4gQ29udGVudEVsZW1lbnRzIG9mIHRoZSBzYW1lIHN1YnR5cGUsIGUuZy4gUm9sZXMgd2l0aCBSb2xlcywgYnV0IG5vdCBSb2xlcyBhbmQgVGFza3N9IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2TS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzIzIiB5PSI3Nzg4IiB3aWR0aD0iOTU5NiIgaGVpZ2h0PSIxNjI1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZOdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAwMjAyRUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBOXZPdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTEyIiBoZWlnaHQ9IjQxNjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRW51bWVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEE5dk4tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dk9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxOTUiIHk9IjIyMDUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEE5dlNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ5NjEiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2VGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdBZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnQS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBOXZSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBzaG93TGlzdFNpZ25hdHVyZT0idHJ1ZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2Ui1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzg5IiB5PSIxMTU5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDk2MjAyMEYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCSGdqZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhna2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhna3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ21PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQkhnaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQkhnaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDYzIiB5PSI5NzM4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCSGduZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGduLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhncE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhncGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhncHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhncC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ3FPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQkhnbXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJIZ20tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc2NiIgeT0iNDE5NCIgd2lkdGg9IjY5ODUiIGhlaWdodD0iMTU4MyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQlFxU2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcVR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcVVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcVV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFWT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJRcVJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcVItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzAzNSIgeT0iODI5NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQlFxYS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFkdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJRcWFPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcWFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDUxNyIgeT0iOTcxNCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3BIMnhPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgY29udGVudCBlbGVtZW50cyBjYW4gZGVmaW5lIHZhcmlhdGlvbnMgb2Ygb25lIGFuZCBhbm90aGVyLiAgIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJIZ3FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCIgc291cmNlPSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhncnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQkhncmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIwMyIgeT0iLTM0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFwOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjg3IiB5PSItMjY0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcDlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYwNCIgeT0iMjM2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFwOS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzA2IiB5PSItMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcC0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXAtdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0MiIgeT0iMjgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcF91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXBfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcF9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcUFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcUItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcUMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxQ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQkhncXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQkhncS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4NTUsIDc4NywgODU1LCA3ODddJFs4NTUsIDE2NTEsIDg1NSwgMTY1MV0kWzY2ODAsIDE2NTEsIDY2ODAsIDE2NTFdJFs2NjgwLCAtNTAsIDY2ODAsIC01MF0kWzM0ODgsIC01MCwgMzQ4OCwgLTUwXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQlFxRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSEE5dk1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJIZ3FlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxRGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQlFxRHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI3LCAtODIxLCAxODYsIDE0MzldJFstMzEzLCAtMjI2MCwgMCwgMF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFELWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcUVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCUXFJLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNThCNjAxOEIiIHNvdXJjZT0iX0hCSGdpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCUXFKT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCUXFKZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc5NSwgLTQ0OCwgLTE3NDQsIDQ3ODNdJFs3OTUsIC00NDUzLCAtMTc0NCwgNzc4XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcUt1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxSy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcVh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FBMEQzMDI0NSIgc291cmNlPSJfSEJRcVJlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcVl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJRcVgtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJRcVlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTU5LCAtMzE3LCAtMTQ1NSwgMzMwN10kWzE1OSwgLTI4MzEsIC0xNDU1LCA3OTNdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFadWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQlFxZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIiBzb3VyY2U9Il9IQlFxWi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQlFxWi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFmLWZYRWR1cUhvT0piVVJaUnciIHg9IjQzNSIgeT0iMTkzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFndWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMjAiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFoZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTQiIHk9IjQwNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzI1IiB5PSIzMzkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxai1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFrLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFsLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCUXFlT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCUXFlZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc4NywgMjAzLCA3ODcsIDIwM10kWzE5MTMsIDIwMywgMTkxMywgMjAzXSRbMTkxMywgMTM2MywgMTkxMywgMTM2M10kWzgsIDEzNjMsIDgsIDEzNjNdJFs4LCA0NDgsIDgsIDQ0OF0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJhYTlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NTYwMDE3MCIgc291cmNlPSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWEtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJhYS1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJhYTllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJhYTl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ0OCwgNTAsIDQ3MzJdJFswLCAtNDM5NCwgNTAsIDc4N10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCYWEtLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJhYV9PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0p4UGY0ZXhaRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9KeFBmNE94WkVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQTl2UmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0p4UGY1T3haRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0p4UGY1dXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSnhQZjUteFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0p4UGY1ZXhaRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0p4UGY0dXhaRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSnhQZjQteFpFZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbLTIzLCAtMzAsIDg4LCAxMDNdJFstMTE2LCAtMTYwLCAtNSwgLTI3XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNTdCMjAwMDg3IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYV9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJhYkFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCYWJCdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQmFhX3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQmFhXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMDEzIiB5PSI1MjMiIHdpZHRoPSIzMTQ4IiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnNPeG5FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rOU9ucy14bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfazlPbnRPeG5FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnRleG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnR1eG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnQteG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rOU9udU94bkVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2s5T251ZXhuRWR1d09ia0lBNngxZ0EiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rOU9uc2V4bkVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rOU9uc3V4bkVkdXdPYmtJQTZ4MWdBIiB4PSI2MzIiIHk9IjMyMjMiIHdpZHRoPSIzMTQ4IiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdlVPeG5FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2VS14bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfenpMdlZPeG5FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdlZleG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdlZ1eG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdlYteG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2V094bkVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3p6THZXZXhuRWR1d09ia0lBNngxZ0EiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il96ekx2VWV4bkVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96ekx2VXV4bkVkdXdPYmtJQTZ4MWdBIiB4PSI1Mzk2IiB5PSIzMjI1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcEgyeHVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifFRoZSBNZXRob2QtUGx1Z2luIHBhY2thZ2UgZGVmaW5lcyBleHRlbnNpYmlsaXR5IGFuZCB2YXJpYWJpbGl0eSBtZWNoYW5pc21zIGZvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgSXQgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eSBpbiBkZWZpbmluZyBkaWZmZXJlbnQgdmFyaWFudHMgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBieSBhbGxvd2luZyBjb250ZW50IGFuZCBwcm9jZXNzIGZyYWdtZW50cyB0byBiZSBwbHVnZ2VkLWluIG9uIGRlbWFuZCBjcmVhdGluZyB0YWlsb3JlZCBvciBzcGVjaWFsaXplZCBjb250ZW50IG9ubHkgd2hlbiBpdCBpcyByZXF1aXJlZCBhbmQgd2hpY2ggY2FuIGJlIG1haW50YWluZWQgYXMgc2VwYXJhdGUgdW5pdHMgd29ya2VkIG9uIGJ5IGRpc3RyaWJ1dGVkIHRlYW1zLiYjeEE7fE1ldGhvZHMgYW5kIFByb2Nlc3NlcyBhcmUgbmV2ZXIgZGV2ZWxvcGVkIGluIGlzb2xhdGlvbi4gIE1hbnkgY29uY3VycmVudCB0ZWFtcyBvZiBwcm9jZXNzIGVuZ2luZWVycyBtaWdodCB3b3JrIG9uIGRpZmZlcmVudCBvciB0aGUgc2FtZSBwYXJ0cyBvZiBhIE1ldGhvZCBDb250ZW50IG9yIHBhcnRpY3VsYXIgUHJvY2Vzc2VzLiAgVGhleSBoYXZlIHRvIGVpdGhlciBjb29yZGluYXRlIHRoZWlyIHdvcmsgb3IgcHJlZmVyYWJseSB0byBtb2R1bGFyaXplIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGRlZmluaXRpb25zIHRoYXQgdGhleSBjYW4gd29yayBvbiBpbiBpc29sYXRpb24gd2l0aG91dCBhbnkgc2hhcmVkIHJlc291cmNlIHByb2JsZW1zLiYjeEE7fE1vcmVvdmVyLCB3b3JrIG9uIGEgZGV2ZWxvcG1lbnQgUHJvY2VzcyBpcyBuZXZlciBmaW5hbCBiZWNhdXNlIHRoZXkgaGF2ZSB0byBiZSB0YWlsb3JlZCBmb3IgZXZlcnkgc3BlY2lmaWMgcHJvamVjdCBzaXR1YXRpb24uICBUbyBhdm9pZCBkZXZlbG9waW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBmcm9tIHNjcmF0Y2ggZm9yIGV2ZXJ5IHNwZWNpZmljIHByb2plY3Qgc2l0dWF0aW9uIGEgdHJ1bHkgcmV1c2FibGUgUHJvY2VzcyBhbGxvd3MgZGVmaW5pbmcgbWFueSBkaWZmZXJlbnQgdmFyaWF0aW9ucyBvbiBpdC4gIFRoZXJlZm9yZSwgdGFpbG9yaW5nIGFuZCBleHRlbnNpb24gb2YgcHJlLWRlZmluZWQgcHJvY2Vzc2VzIGlzIGEga2V5IHJlcXVpcmVtZW50IGZvciBvcmdhbml6YXRpb25zIGFkb3B0aW5nIGFuZCBpbXBsZW1lbnRpbmcgcHJvY2Vzc2VzLiAgIEZvciBleGFtcGxlLCBpbWFnZSBhIHNjZW5hcmlvIGluIHdoaWNoIGEgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHB1cmNoYXNlcyBhIHRoaXJkLXBhcnR5IERlbGl2ZXJ5IFByb2Nlc3MgZnJvbSBhIG1ldGhvZCB2ZW5kb3IgYW5kIGl0cyB1bmRlcmx5aW5nIG1ldGhvZCBjb250ZW50LiAgV2hpbGUgaW1wbGVtZW50aW5nIHRoZSBwcm9jZXNzIGluIHRoZWlyIG9yZ2FuaXphdGlvbiB0aGV5IG1pZ2h0IGRpc2NvdmVyIHRoYXQgdGhleSB3b3VsZCBsaWtlIHRvIHRhaWxvciB0aGUgcHJvY2VzcyB0byB0aGVpciBwYXJ0aWN1bGFyIG5lZWRzIGFuZCBvcmdhbml6YXRpb24gc3BlY2lmaWMgdmFyaWF0aW9ucy4gIElmIHRoZXkgd291bGQgZGlyZWN0bHkgbW9kaWZ5IHRoZSBwdXJjaGFzZWQgcHJvY2VzcyB0aGV5IHdvdWxkIG1pbmdsZSB0aGVpciBhZGRpdGlvbnMgYW5kIGNoYW5nZXMgd2l0aCB0aGUgb3JpZ2luYWwgcHJvY2Vzcy4gIElmIGEgbmV3IHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIHByb2Nlc3MgaXMgcmVsZWFzZWQgYnkgdGhlIHZlbmRvciBpdCB3b3VsZCBiZSB2ZXJ5IGhhcmQgZm9yIHRoZW0gdG8gZmluZCBhbmQgcmVwcm9kdWNlIHRoZXNlIGNoYW5nZXMgdG8gdGhlIG5ldyBwcm9jZXNzIHZlcnNpb24uJiN4QTt8VGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgbW9kdWxhcml6YXRpb24gYW5kIGV4dGVuc2liaWxpdHkgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3NlcyB0byBVTUEuICBJbiBvdGhlciB3b3JkcywgaXQgc3VwcG9ydHMgdGFpbG9yaW5nIG9mIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgdGhlbSwgYnV0IGJ5IGRlc2NyaWJpbmcgY2hhbmdlcyBmcm9tIGEgc2VwYXJhdGUgdW5pdCBjYWxsZWQgYSBNZXRob2QgUGx1Zy1pbi4gIFRoaXMgbmV3IGNhcGFiaWxpdHkgaXMgYWNoaWV2ZWQgYnkgYWRkaW5nIG5ldyBjb25jZXB0cyB0byB0aGUgbWV0YS1tb2RlbDogJiN4QTt8LSBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBsdWdpbnMuICBNZXRob2QgUGx1Z2lucyBhcmUgY29udGFpbmVycyBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaXMgcGFydCBvZiBleGFjdGx5IG9uZSBNZXRob2QgUGx1Z2luLCBpLmUuIE1ldGhvZCBQbHVnaW5zIHBhcnRpdGlvbiB0aGUgc3BhY2Ugb2YgYWxsIE1ldGhvZCBFbGVtZW50cy4gICYjeEE7fC0gTWV0aG9kIFBsdWdpbnMgY2FuIGRlZmluZSBleHRlbnNpb25zIHRvIG90aGVyIE1ldGhvZCBQbHVnaW5zLiAgT25lIE1ldGhvZCBQbHVnaW4gY2FuIGRlZmluZSBleHRlbnNpb25zIGZvciBtYW55IG90aGVyIFBsdWdpbnMgYW5kIGNhbiBiZSBleHRlbmRlZCBieSBtYW55IFBsdWdpbnMuJiN4QTt8LSBUaGUgTWV0aG9kIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgYWRkcyBhIG5ldyBzZXQgb2YgcmVsYXRpb25zaGlwcyBhbmQgc2VtYW50aWNzIHRvIHNwZWNpZmljIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlZmluZSBob3cgdGhlc2UgTWV0aG9kIEVsZW1lbnRzIGNhbiBleHRlbmQgZWFjaCBvdGhlciBhY3Jvc3MgdGhlIGJvdW5kYXJ5IG9mIE1ldGhvZCBQbHVnaW5zIG9yIE1ldGhvZCBQYWNrYWdlcyAodG8gYWxsb3cgbW9kdWxhcml6YXRpb24gZXZlbiB3aXRoaW4gb25lIE1ldGhvZCBQbHVnaW4pLiYjeEE7fFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVmaW5lIHRoZSBkZXRhaWxlZCBydWxlcyBmb3IgdGhlc2UgZXh0ZW5zaW9ucyBmb3Igc3BlY2lmaWMgTWV0aG9kIEVsZW1lbnRzLiYjeEE7Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfUm5JZUVleFpFZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX1JuSWVFT3haRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hCYWFfZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX2s5T25zT3huRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUZPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUZ1eFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SbkllR094WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVGLXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9SbkllRmV4WkVkdU9Ock1SZ216NDhBIiB4PSItMjciIHk9Ijg5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfUm5JZUV1eFpFZHVPTnJNUmdtejQ4QSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUm5JZUUteFpFZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMCwgNTU2LCAyMzgxLCAtMjE0M10kWy0yMzgxLCAyMTQzLCAwLCAtNTU2XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il93M3ZOc2V4dUVkdU0xNHVuV2FxUDVRIiBlbGVtZW50PSJfdzN2TnNPeHVFZHVNMTR1bldhcVA1USIgc291cmNlPSJfSEJhYV9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfenpMdlVPeG5FZHV3T2JrSUE2eDFnQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93M3ZOdE94dUVkdU0xNHVuV2FxUDVRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93M3ZOdHV4dUVkdU0xNHVuV2FxUDVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3czdk51T3h1RWR1TTE0dW5XYXFQNVEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnQteHVFZHVNMTR1bldhcVA1USIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3czdk50ZXh1RWR1TTE0dW5XYXFQNVEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3czdk5zdXh1RWR1TTE0dW5XYXFQNVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3czdk5zLXh1RWR1TTE0dW5XYXFQNVEiIHBvaW50cz0iWzgsIDIxLCAtODMsIC04MV0kWzM1LCAxMjMsIC01NiwgMjFdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvWVA0T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiPgotICAgICAgICAgIDxib2R5PjAzPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9SbkllRU94WkVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ii8+Ci0gICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfdzN2TnNPeHVFZHVNMTR1bldhcVA1USIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCIvPgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvWVA4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiPgotICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBREMwMTAyOEQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI1MThCRDcwMUUzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIi8+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQUU3MDczMDNCOCIgbmFtZT0idXNlckNoYW5nZWFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dvWVA5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRndlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUZ3T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIiBuYW1lPSJiYXNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GeXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRnllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0OTYyMDIwRiIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ZUC1lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OTYyMDIwRiI+Ci0gICAgICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG5vdCBkaXJlY3RseSBmcm9tIE1ldGhvZCBFbGVtZW50IGFueW1vcmUuICBUaGlzIGlzIGFjaGlldmVkIHVzaW5nIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBzZW1hbnRpY3MuICBPbmx5IGlmIGFuIGFkb3B0ZXIgb2YgdGhpcyBtZXRhLW1vZGVsIGRlY2lkZXMgdG8gcmVhbGl6ZSBNZXRob2QgUGx1Z2lucywgaGUgd291bGQgZ2V0IHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIGNhcGFiaWxpdGllcyBmb3IgYWxsIENvbnRlbnQgRWxlbWVudHMuCi1Db250ZW50IEVsZW1lbnQgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50LgotPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNThCNjAxOEIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1IiBuYW1lPSJNZXRob2RFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvWVBfdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDk1MDAxRjUiPgotICAgICAgICAgICAgPGJvZHk+TWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxOEFDQTBBMDBFQiIgbmFtZT0ic3VwcHJlc3NlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvaUE0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MThBQ0EwQTAwRUIiPgotICAgICAgICAgICAgICA8Ym9keT5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dvaUE1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM4RTk0RDAwM0YiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvaUE1LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM4RTk0RDAwM0YiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfOXJRUGtleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzlyUVBrT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il85aHQ1RU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29pQTZ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMDAyMDJFQyI+Ci0gICAgICAgICAgICA8Ym9keT5WYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY5QzZBMzAzMzgiIG5hbWU9Im5hIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29pQTdlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjlDNkEzMDMzOCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIGRlZmF1bHQgJnF1b3Q7bm90IGFzc2lnbmVkJnF1b3Q7IHZhbHVlIG9mIGEgVmFyaWFiaWxsaXR5IEVsZW1lbnQncyB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FzZSBubyB2YXJpYWJpbGl0eSBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IGJldHdlZW4gdGhlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxRjAzQzAiIG5hbWU9ImNvbnRyaWJ1dGVzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzB1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMDFGMDNDMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkNvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5IGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgYWx0ZXJpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLCBpLmUuIGluIGFuIGFkZGl0aXZlIGZhc2hpb24uICBQcm9wZXJ0aWVzIGNvbnRyaWJ1dGVkIGFyZTogYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBjb250cmlidXRpb24gaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIGFuIGF1Z21lbnRlZCB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRoYXQgY29tYmluZXMgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIHdheSB0aGlzIGNvbWJpbmF0aW9uIGlzIHJlYWxpemVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbi4gIEZvciBleGFtcGxlLCBTdHJpbmcgYXR0cmlidXRlcyBhcmUgY29uY2F0ZW5hdGVkIHJlc29sdmluZyBlbWJlZGRlZCBjb21tYW5kcyBmb3IgZGVwZW5kZW50IHRleHQgb3IgbWVyZ2luZyB0ZXh0IGZyYWdtZW50cyAoZS5nLiBkZXNjcmlwdGlvbnMgZm9yIGNvbnRlbnQgZWxlbWVudHMpLiAgQWRkaXRpb25hbCBlbGVtZW50cyBpbiB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgKGUuZy4gYWRkaXRpb25hbCBHdWlkYW5jZSBlbGVtZW50cyBvciBUYXNrIERlc2NyaXB0b3JzIG9mIGFuIEFjdGl2aXR5KS4gIERpZmZlcmVudCBlbGVtZW50cyBpbiB0by1vbmUgYXNzb2NpYXRpb25zIGFyZSBpZ25vcmVkIChlLmcuIHRoZSBvbmUgUHJpbWFyeSBQZXJmb3JtZXIgb2YgYSBUYXNrKS4gIE11bHRpcGxlIENvbnRlbnQgRWxlbWVudHMgY2FuIGNvbnRyaWJ1dGUgdG8gdGhlIHNhbWUgYmFzZSBlbGVtZW50IGFuZCBhbGwgb2YgdGhlc2UgY29udHJpYnV0aW9ucyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byB0aGUgYmFzZSBpbiB0aGUgc2FtZSBmYXNoaW9uLiBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOgotYXR0cmlidXRlIHZhbHVlczoJU3RyaW5nIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGNvbmNhdGVuYXRlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LiAgT3RoZXIgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiBhbnkgb3RoZXIgdHlwZSBzdWNoIGFzIEludGVnZXIsIERhdGUgYXJlIGlnbm9yZWQuCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMga2VwdCBhbmQgYW55IGFzc29jaWF0aW9uIGZyb20gdGhlIGNvbnRyaWJ1dGluZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaWdub3JlZC4KLTAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgYWRkZWQgdG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBlbGVtZW50LiAgSWYgYm90aCBWYXJpYWJpbGl0eSBFbGVtZW50cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QgdGhlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgYXNzb2NpYXRpb24gd2lsbCByZW1haW4uCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDE4MDFFMCIgbmFtZT0iZXh0ZW5kcyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvcksxZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxODAxRTAiPgotICAgICAgICAgICAgICA8Ym9keT5FeHRlbnNpb24gYWxsb3dzIE1ldGhvZCBQbHVnaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgQmFzZSBQbHVnaW4gYnkgcHJvdmlkaW5nIGEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIEFzc29jaWF0aW9uIGluc3RhbmNlcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSByZXN1bHQgb2YgaW50ZXJwcmV0YXRpb24gaXMgdGhhdCB0aGUgc3BlY2lhbCBlbGVtZW50IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBiYXNlZC1vbiBoYXMsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuICBIZW5jZSBleHRlbmRzIGlzIG5vdCB1c2VkIHRvIG1vZGlmeSBjb250ZW50IG9mIHRoZSBiYXNlIFBsdWdpbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcgUGx1Z2luIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkIChlLmcuIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUgb2YgcmV2aWV3KS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdmlhIHRoZSBleHRlbmRzIHJlbGF0aW9uc2hpcC4gIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBDYXBhYmlsaXR5IFBhdHRlcm5zIHRvIFByb2Nlc3NlczogQSBwYXR0ZXJuIGlzIGFwcGxpZWQgYnkgZGVmaW5pbmcgYW4gZXh0ZW5kcyByZWxhdGlvbnNoaXBzIGZyb20gYW4gQWN0aXZpdHkgb2YgdGhlIGFwcGx5aW5nIFByb2Nlc3NlcyB0byB0aGUgUGF0dGVybi4gIFRoZSBBY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbnMgaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMgdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIFByb2Nlc3MgYWZ0ZXIgSW50ZXJwcmV0YXRpb24uCi1hdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgZWxlbWVudCBhcmUgaW5oZXJpdGVkIGFuZCB1c2VkIHRvIHBvcHVsYXRlIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGF0dHJpYnV0ZXMuICBJZiB0aGUgc3BlY2lhbCBlbGVtZW50IGF0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcG9wdWxhdGVkIHRoZSBpbmhlcml0ZWQgdmFsdWVzIGFyZSBpZ25vcmVkLiAgCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgaXRzIG93biBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHRoZSBpbmhlcml0ZWQgb25lIGlzIGlnbm9yZWQuCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIGRlZmluZWQgZm9yIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSBzcGVjaWFsIGVsZW1lbnQgY2FuIGFkZCBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIGluc3RhbmNlcy4KLQotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxQzAyODYiIG5hbWU9InJlcGxhY2VzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzJPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMDFDMDI4NiI+Ci0gICAgICAgICAgICAgIDxib2R5PlJlcGxhY2VzIHByb3ZpZGVzIGEgd2F5IGZvciBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byByZXBsYWNlIGEgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHVzZWQgZm9yIE1ldGhvZCBQbHVnaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrLCBvciBBY3Rpdml0aWVzIHdpdGggZWl0aGVyIGEgY29tcGxldGUgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIGZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMgKGUuZy4gUm9sZS1BcnRpZmFjdCByZXNwb25zaWJpbGl0eSkuICBQcm9wZXJ0aWVzIHJlcGxhY2VkIGFyZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBDb250ZW50IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhpcyBuZXcgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0byB3aGljaCBhbGwgaW5jb21pbmcgYXNzb2NpYXRpb25zIHN0aWxsIHBvaW50IGFzIGJlZm9yZSwgYnV0IHdoaWNoIGhhcyBwb3RlbnRpYWxseSBuZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy4gIFRoaXMgcHJvdmlkZXMgYSB2ZXJ5IHBvd2VyZnVsIG1lY2hhbmlzbSB0byByZXBsYWNlLCBmb3IgZXhhbXBsZSwgd2hvbGUgQWN0aXZpdGllcyBpbiBhIFByb2Nlc3Mgd2l0aCBjb21wbGV0ZSBuZXcgcmVhbGl6YXRpb25zIG9mIHRoZSBBY3Rpdml0eS4gIEZvciBpbnN0YW5jZSwgcmVwbGFjaW5nIGFuIEFjdGl2aXR5IGRvaW5nIHVzZSBjYXNlLWJhc2VkIGRlc2lnbiB3aXRoIGFuIGFjdGl2aXR5IGRvaW5nIGFnaWxlIGNvZGUtY2VudHJpYyBkZXZlbG9wbWVudCBkb2luZyB0aGUgc2FtZSB3b3JrIHVzaW5nIGEgZGlmZmVyZW50IGRldmVsb3BtZW50IHRlY2huaXF1ZSB1dGlsaXppbmcgZGlmZmVyZW50IFJvbGVzLCBUYXNrcywgZXRjLiAgQW5vdGhlciBleGFtcGxlLCB3b3VsZCBiZSB0byByZXBsYWNlIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gUkRCTVMgd2l0aCBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIE9PREJNUy4gIEEgVmFyaWFiaWxpdHkgRWxlbWVudCBjYW4gb25seSBiZSByZXBsYWNlZCBieSBvbmUgb3RoZXIgZWxlbWVudCBhdCBhIHRpbWUuICBGb3IgZXhhbXBsZSwgaWYgdHdvIE1ldGhvZCBQbHVnaW5zIHJlcGxhY2UgdGhlIHNhbWUgZWxlbWVudCBvbmx5IG9uZSBNZXRob2QgUGx1Z2luIGNhbiBiZSB1c2VkIGZvciBpbnRlcnByZXRhdGlvbiAoc2VlIGNvbmNlcHQgb2YgTWV0aG9kIENvbmZpZ3VyYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gcmVzb2x2ZSBzdWNoIGNvbmZsaWN0cywgU2VjdGlvbiA3LjEuMikuICBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOgotYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpbmNsdWRpbmcgdW5hc3NpZ25lZCB2YWx1ZXMuCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgcmVwbGFjaW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYWxzbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbi4KLTAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCByZXBsYWNlIGFsbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuCi0KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ2MjhFNEIwMTMzIiBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ2MjhFNUUwMTNCIiBuYW1lPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NUM4RDY3MDAyQTkiIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLM3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ij4KLSAgICAgICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLVZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuCi1WYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuCi1WYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLgotPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9KeFBmNE94WkVkdU9Ock1SZ216NDhBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1Ii8+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMEU2MDNDNyIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY2QjAwMjAyRUMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLNHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwRTYwM0M3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+SWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR28wNzBlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxib2R5Pm5hPC9ib2R5PgotICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EwIj4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUYwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GMHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCIgbmFtZT0iU2VjdGlvbiI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbzA3MC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0Ij4KLSAgICAgICAgICAgIDxib2R5PlNlY3Rpb24gaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGV4dGVuZHMgU2VjdGlvbiBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIDo6IEJhc2ljIEVsZW1lbnRzIHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuIAotRm9yIGV4YW1wbGUsIHdoZW4gYSBUYXNrIGNvbnRyaWJ1dGVzIHRvIGFub3RoZXIgVGFzayBpdHMgUHJlc2VudGF0aW9uIGFzc29jaWF0aW9uIGlzIGNvbnRyaWJ1dGVkIGluY2x1ZGluZyBpdHMgU2VjdGlvbnMgKGkuZS4gaXRzIFN0ZXBzKSwgd2hpY2ggYXJlIG1vZGVsZWQgYXMgcGFydHMgb2YgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBTZWN0aW9ucyBjYW4gYmUgbmVzdGVkIGFuZCB0aGVyZWZvcmUgVGFzayBEZXNjcmlwdGlvbnMgY2FuIGJlIGZsZXhpYmx5IG9yZ2FuaXplZCBpbiBTdGVwcyB3aXRoIHN1Yi1TdGVwcy4gIFNlY3Rpb25zIGFyZSBWYXJpYWJpbGl0eSBFbGVtZW50cyB0aGVtc2VsdmVzLCBzbyB0aGV5IGNhbiBjb250cmlidXRlIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIG1vZGVsIGEgVGFzayBzdGVwIGFzIGEgU2VjdGlvbiBpbnN0YW5jZSB3aXRob3V0IHJlbGF0aW5nIGl0IHRvIGEgVGFzayBEZXNjcmlwdGlvbiB0aGF0IGRpcmVjdGx5IGNvbnRyaWJ1dGVzIHRvIChvciByZXBsYWNlcykgYW5vdGhlciBTZWN0aW9uIHdoaWNoIGlzIHBhcnQgb2YgYSBUYXNrIERlc2NyaXB0aW9uLiAgVGhpcyBjb250cmlidXRpb24gKG9yIHJlcGxhY2VtZW50KSB3b3VsZCBhZGQgbmV3IGRlc2NyaXB0aW9uIHRleHQgdG8gdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24gKG9yIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24pLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnRyaWJ1dGUgbmV3IENoZWNrIExpc3QgaXRlbXMgb3JnYW5pemVkIGFzIFNlY3Rpb25zIHRvIGFuIGV4aXN0aW5nIENoZWNrIExpc3QgKGRlZmluZWQgYXMgZ3VpZGFuY2UpLiAgCi0KLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTU1NjAwMTcwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ii8+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSIgbmFtZT0icHJlZGVjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFOEU2NTAyMTMiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRjJlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUYyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBBRTAzOUQiIG5hbWU9IkFjdGl2aXR5Ij4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvMDcyT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBBRTAzOUQiPgotICAgICAgICAgICAgPGJvZHk+QWN0aXZpdHkgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gZXh0ZW5kIEFjdGl2aXR5IHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuJiN4RDsKLUFjdGl2aXR5IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCB3aGljaCBwcm92aWRlcyBrZXkgbWVjaGFuaXNtIHRvIGVuYWJsZSBkeW5hbWljIGJpbmRpbmcgb2YgQ2FwYWJpbGl0eSBQYXR0ZXJucyBpbiBQcm9jZXNzZXMgYXMgd2VsbCBhcyBQcm9jZXNzIENvbnRyaWJ1dGlvbnMuICBWYXJpYWJpbGl0eSBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5IGZvciBBY3Rpdml0aWVzOiYjeEQ7Ci0tIEV4dGVuZDogVG8gYXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gYSBwcm9jZXNzIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgd2hpY2ggZXh0ZW5kcyB0aGUgcGF0dGVybidzIHRvcC1sZXZlbCBhY3Rpdml0eS4gIFRocm91Z2ggZXh0ZW5zaW9uIHRoZSBleHRlbmRpbmcgQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHBhdHRlcm5zIEJyZWFrZG93biBFbGVtZW50cy4mI3hEOwotLSBSZXBsYWNlOiBUbyByZXBsYWNlIGFuIEFjdGl2aXR5IG9mIGFuIGFwcGxpZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIGFuIGV4aXN0aW5nIHByb2Nlc3MgZm9yIHdoaWNoIG9uZSBkZXZlbG9wcyBhIFByb2Nlc3MgQ29udHJpYnV0aW9uIChvciBhIGNvbWJpbmF0aW9uIG9mIGJvdGgpIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgYW5kIHNwZWNpZnkgdGhlIHJlcGxhY2UgdmFyaWFiaWxpdHkgc3BlY2lhbGl6YXRpb24gYmV0d2VlbiB0aGVtLiYjeEQ7Ci0tIENvbnRyaWJ1dGU6IFRvIGNvbnRyaWJ1dGUgbmV3IEJyZWFrZG93biBFbGVtZW50cyB0byBhbiBleGlzdGluZyBBY3Rpdml0eSBvbmUgd291bGQgZGVmaW5lIGFuIEFjdGl2aXR5IHdpdGggQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVsYXRlcyB2aWEgdGhlIENvbnRyaWJ1dGVzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRvIHRoaXMgZXhpc3RpbmcgQWN0aXZpdHkuICBUaGUgY29udHJpYnV0aW5nIEFjdGl2aXR5J3MgQnJlYWtkb3duIEVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyaWJ1dGVkIEFjdGl2aXR5LiYjeEQ7Ci0mI3hEOwotPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBEMzAyNDUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbzA3M2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1Ij4KLSAgICAgICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGF0IGV2ZXJ5IE1ldGhvZCBQYWNrYWdlIChlaXRoZXIgQ29udGVudCBQYWNrYWdlLCBQcm9jZXNzIFBhY2thZ2UsIG9yIFByb2Nlc3MgQ29tcG9uZW50KSBpcyBwYXJ0IG9mIGV4YWN0bHkgb25lIE1ldGhvZCBQbHVnaW4uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiIG5hbWU9Il9tZXRob2RQbHVnaW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbzA3NGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28wNzRPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciIG5hbWU9IkV4dGVuc2lvbiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28tRnctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyI+Ci0gICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgaG93IE1ldGhvZCBQbHVnaW5zIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zLiAgVGhlIGV4dGVuZGluZyBwbHVnLWluIGNvbnRhaW5zIG5ldyBtZXRob2QgZWxlbWVudHMsIGV4dGVuZHMgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzIGFuZCBwcm9jZXNzZXMgdXNpbmcgY29udGVudCBlbGVtZW50IHZhcmlhYmlsaXR5IG1lY2hhbmlzbXMgKGUuZy4gY29udHJpYnV0aW9uLCByZXBsYWNlLCBldGMuKSwgcHJvdmlkZXMgYWRkaXRpb25hbCBEZWxpdmVyeSBhbmQgQ2FwYWJpbGl0eSBQcm9jZXNzZXMgZm9yIGEgTWV0aG9kIEZyYW1ld29yaywgZXRjLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4IiBuYW1lPSJwbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3Ij4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUZ4LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GeHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EwIiBuYW1lPSJ2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEgXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hby1Gek9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EwIj4KLSAgICAgICAgICAgIDxib2R5PlRoaXMgMS10by1tYW55IGFzc29jaWF0aW9uIGRlZmluZXMgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB0aGF0IGEgbnVtYmVyIG9mIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSByZXByZXNlbnQgYSB2YXJpYXRpb24gb2YgZXhhY3RseSBvbmUgb3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiIG5hbWU9InZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRjBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUZ6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NTAyMTMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSBfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvLUYxZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NTAyMTMiPgotICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgdGhlIG9yZGVyIGluIHdoaWNoIGNvbnRyaWJ1dGVkIFNlY3Rpb25zIHNoYWxsIGJlIGluc2VydGVkIGludG8gYW4gIGV4aXN0aW5nIGxpc3Qgb2YgU2VjdGlvbnMgbWFpbnRhaW5lZCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIj4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUYzT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0IiIG5hbWU9Ik1ldGhvZENvcmUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d2UEYwdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjg3QjRFMDM0QSI+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY4N0I0RTAzNEEiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhmNnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZjctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGY1LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGY2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk2MjMiIHk9IjE0NTE4IiB3aWR0aD0iNDQwMiIgaGVpZ2h0PSIxNjg0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGY5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZi1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhmLWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZjhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZjh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4MzkiIHk9IjExNDAwIiB3aWR0aD0iNDQzMiIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGYtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGZfdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGZfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnQS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZi0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZl9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iODI0MiIgd2lkdGg9IjQ1MzciIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhnQ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ0RlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGdCZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGdCdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjQ5NDAiIHdpZHRoPSI0NTM3IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZ0pPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdLZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhnSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhnSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSIyMjE5IiB3aWR0aD0iNDExNCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdLdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDlFQTAxRTIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGdMdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ011ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnTS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZ0stZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZ0xPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2OCIgeT0iNjk3NCIgd2lkdGg9IjQ3MjAiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnVC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREUyODAwMjVEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhnVS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdWLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ1dPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGdVT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGdVZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0Mzc4IiB5PSI4MTc4IiB3aWR0aD0iMzg0MSIgaGVpZ2h0PSIxNjg0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VRT3hkRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVEteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3g0R3VST3hkRWR1SGplM3BQYWhONEEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VSZXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VSdXhkRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VSLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRQNE1PeGRFZHVIamUzcFBhaE40QSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il94NFA0TWV4ZEVkdUhqZTNwUGFoTjRBIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfeDRHdVFleGRFZHVIamUzcFBhaE40QSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeDRHdVF1eGRFZHVIamUzcFBhaE40QSIgeD0iOTYyMyIgeT0iMTc0ODciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNUQmtPeDVFZHU1LXZWamxmVnNmUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aQ1RCay14NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfWkNUQmxPeDVFZHU1LXZWamxmVnNmUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNjeWtPeDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNjeWtleDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNjeWt1eDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aQ2N5ay14NUVkdTUtdlZqbGZWc2ZRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1pDY3lsT3g1RWR1NS12VmpsZlZzZlEiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9aQ1RCa2V4NUVkdTUtdlZqbGZWc2ZRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9aQ1RCa3V4NUVkdTUtdlZqbGZWc2ZRIiB4PSIxNDI2NSIgeT0iMTc0ODciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d2UEYxT2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTWV0aG9kIENvcmUgcGFja2FnZSBkZWZpbmVzIHRoZSBmdW5kYW1lbnRhbCBjb25jZXB0cyBmb3IgZGVzY3JpYmluZyBhbmQgb3JnYW5pemluZyBtZXRob2QgY29udGVudC4gIFRoZSBwYWNrYWdlIGl0c2VsZiBwcm92aWRlcyBsYXllcnMgYXMgZGVwaWN0ZWQgaW4gZGlhZ3JhbSB0aGF0IGdyYWR1YWxseSBleHRlbmQgdGhlIGNvcmUgY29uY2VwdHMgd2l0aCBtb3JlIGFuZCBtb3JlIGNhcGFiaWxpdGllcyAoaS5lLiBzdXBwb3J0aW5nIGNsYXNzZXMsIGFkZGl0aW9uYWwgYXR0cmlidXRlcywgYW5kIHJlbGF0aW9uc2hpcHMpLiBUaGUgQmFzaWMgRWxlbWVudHMgcGFja2FnZSBkZWZpbmVzIHRoZSByb290IGVsZW1lbnQgZnJvbSB3aGljaCBhbGwgY2xhc3NlcyBpbiB0aGlzIHNwZWNpZmljYXRpb24gaGF2ZSBiZWVuIGRlcml2ZWQuICBDb3JlIENvbnRlbnQgRWxlbWVudHMgZGVmaW5lcyB0aGUgY29yZSBlbGVtZW50cyBvZiBldmVyeSBtZXRob2Qgc3VjaCBhcyByb2xlcywgdGFza3MsIGFuZCB3b3JrIHByb2R1Y3RzLiAgVGhlIG5leHQgbGF5ZXIgYWRkcyBkaWZmZXJlbnQgdHlwZXMgb2YgZ3VpZGFuY2UgdG8gdGhlIGNvcmUgZWxlbWVudHMgc3VjaCBhcyB3b3JrIHByb2R1Y3QgdGVtLXBsYXRlcywgZ3VpZGVsaW5lcywgb3IgY2hlY2tsaXN0cy4gIFRoZSBDYXRlZ29yaWVzIHBhY2thZ2UgcHJvdmlkZXMgcHJlLWRlZmluZWQgYXMgd2VsbCBhcyB1c2VyLWRlZmluYWJsZSBjYXRlZ29yaXphdGlvbnMgb2YgY29yZSBjb250ZW50IGVsZW1lbnRzIGFzIHdlbGwgYXMgZ3VpZGFuY2UgdHlwZXMuICBUaGUgTWV0aG9kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFkZHMgcHJvcGVydGllcyBmb3IgZGV0YWlsZWQgY29udGVudCBkZXNjcmlwdGlvbnMgdG8gdGhlIGVsZW1lbnRzIGRlZmluZWQgYmVsb3cuICBUaGVzZSBkZXNjcmlwdGlvbnMgYXJlIG9wdGlvbmFsIGFkZGl0aW9ucywgd2hpY2ggYW4gaW1wbGVtZW50ZXIgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGZyZWUgdG8gY2hvb3NlIGZyb20uICBGaW5hbGx5LCBNZXRob2QgUGFja2FnZSBkZS1maW5lcyBob3cgdGhlIGVsZW1lbnRzIGRlZmluZWQgaW4gYWxsIGZvdXIgbGF5ZXJzIGJlbG93IGNhbiBiZSBvcmdhbml6ZWQgaW4gcGFja2FnZSBoaWVyYXJjaGllcy4iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9VUjlXc09vV0VkdU9CUFFBMmhLcVVRIiBlbGVtZW50PSJfVVJ6bHNPb1dFZHVPQlBRQTJoS3FVUSIgc291cmNlPSJfSElIZ1QtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZjhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VUjlXcy1vV0VkdU9CUFFBMmhLcVVRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VUjlXdGVvV0VkdU9CUFFBMmhLcVVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VSOVd0LW9XRWR1T0JQUUEyaEtxVVEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVI5V3R1b1dFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1VSOVd0T29XRWR1T0JQUUEyaEtxVVEiIHg9Ii03NzYiIHk9Ii0xMDY1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9VUjlXc2VvV0VkdU9CUFFBMmhLcVVRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1VSOVdzdW9XRWR1T0JQUUEyaEtxVVEiIHBvaW50cz0iWy0zNCwgMzIsIDE0OSwgLTkwXSRbLTEwOSwgMTE5LCA3NCwgLTNdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX04xOWxjZXhNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9OMTlsY094TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9ISUhmLXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxkT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxkdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTjE5bGVPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZC14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTjE5bGRleE1FZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfTjE5bGN1eE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9OMTlsYy14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlsyLCAzMywgMCwgLTg1XSRbMiwgMTUwLCAwLCAzMl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfQ3NFUUlPeGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX0NyNmZJT3hkRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY1dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ3NFUUkteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ3NFUUpleGRFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSi14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NzRVFKdXhkRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Dc0VRSk94ZEVkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9Dc0VRSWV4ZEVkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0NzRVFJdXhkRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy0xODUsIDg3MywgLTIxNDMsIC01NDI0XSRbLTE4NSwgMzY1MSwgLTIxNDMsIC0yNjQ2XSRbMTI0NCwgNTQyNCwgLTcxNCwgLTg3M10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hWMWxFT3g1RWR1NS12VmpsZlZzZlEiIGlkPSIoMC40NjE2NDI2LDAuNzc1NjU2MzQpIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2RkdHRzT3hkRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9kZGo4c094ZEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnQk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmLXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2RkdHRzLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2RkdHR0ZXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZGR0dHQteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0dHV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZGR0dHRPeGRFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZGR0dHNleGRFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9kZHR0c3V4ZEVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlsyLCAzMiwgMiwgLTkyXSRbMTYsIDE1NywgMTYsIDMzXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9lYVc4SWV4ZEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfZWFXOElPeGRFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZjhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lYVc4Sk94ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lYVc4SnV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhLT3hkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZWFXOEoteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2VhVzhKZXhkRWR1SGplM3BQYWhONEEiIHg9Ii0xNDg4IiB5PSItODExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9lYVc4SXV4ZEVkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2VhVzhJLXhkRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWzE1MzUsIDg0NiwgLTE2NDAsIC01NjEwXSRbMzQxMywgMTg3OCwgMjM4LCAtNDU3OF0kWzM0MTMsIDU5MDAsIDIzOCwgLTU1Nl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfVlBSM01PeGVFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX1ZQSUdNT3hlRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdLdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGYtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVlBSM00teGVFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVlBSM05leGVFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9WUFIzTi14ZUVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNOdXhlRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9WUFIzTk94ZUVkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9WUFIzTWV4ZUVkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1ZQUjNNdXhlRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy05MCwgMTEsIDIzOSwgLTFdJFstMjQ1LCA0MywgODQsIDMxXSIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfV3RkRllPeGVFZHVIamUzcFBhaE40QSIgaWQ9IigwLjc3MTY1NTI2LDAuNzQzNDM2NzUpIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JLRURZZXhnRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9SS0VEWU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhnS3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JLRURaT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JLRURadXhnRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRGFPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SS0VEWi14Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUktFRFpleGdFZHVIamUzcFBhaE40QSIgeD0iLTQ4MSIgeT0iLTQ4NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfUktFRFl1eGdFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9SS0VEWS14Z0VkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstMjA5MCwgNDc2LCAzOTQzLCAtNDI4N10kWy02MDU5LCAxNDAzLCAtMjYsIC0zMzYwXSRbLTYwNTksIDQyMDcsIC0yNiwgLTU1Nl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfUnFHT1VleGdFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX1JxR09VT3hnRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGdCT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1ZPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1Z1eGdFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScUdPV094Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09WLXhnRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ScUdPVmV4Z0VkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ScUdPVXV4Z0VkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1JxR09VLXhnRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWzYsIDMzLCAtMiwgLTcwXSRbOTUsIDExMCwgODcsIDddIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1NMVlRJZXhnRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9TTFZUSU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhnVC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NMVlRKT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NMVlRKdXhnRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU0xWVEtPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTFZUSi14Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfU0xWVEpleGdFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfU0xWVEl1eGdFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9TTFZUSS14Z0VkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlsxOTMxLCA4NzMsIC00NzEwLCAtNTEwN10kWzY2MTQsIDI5OTAsIC0yNywgLTI5OTBdJFs2NjE0LCA1NDI0LCAtMjcsIC01NTZdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX25veVRNZXhnRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9ub3lUTU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhmNXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il94NEd1UU94ZEVkdUhqZTNwUGFoTjRBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25veVROT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25veVROdXhnRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE9PeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ub3lUTi14Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbm95VE5leGdFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfbm95VE11eGdFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ub3lUTS14Z0VkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstNywgMzMsIC02LCAtNzBdJFstNywgMTMxLCAtNiwgMjhdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2M2Mm5nT3g1RWR1NS12VmpsZlZzZlEiIGVsZW1lbnQ9Il9jNnRka094NUVkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Il9ISUhmNXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9aQ1RCa094NUVkdTUtdlZqbGZWc2ZRIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5nLXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5oZXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYzYybmgteDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuaHV4NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYzYybmhPeDVFZHU1LXZWamxmVnNmUSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfYzYybmdleDVFZHU1LXZWamxmVnNmUSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9jNjJuZ3V4NUVkdTUtdlZqbGZWc2ZRIiBwb2ludHM9Ils0MSwgMzMsIC0xMzQsIC03NF0kWzkxLCAxMDgsIC04NCwgMV0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDRDM3MDFFRCIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJRN2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUyMSIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlE4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlE5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlE5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJRLU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlE2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlE2LWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDUwIiB5PSIxMTAxOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRLWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlFfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJRX2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzk5NiIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQ09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlEtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlEtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2Nzc5IiB5PSIxMTAxOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQ2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJSRGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzcwOCIgaGVpZ2h0PSIxMTM0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJGT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSR09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlJDdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlJDLWZYRWR1cUhvT0piVVJaUnciIHg9IjczMDgiIHk9IjgzNDgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4RiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUkhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM3MDgiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSSXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUktPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJSR3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJSRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTUxNiIgeT0iMTEwMTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUktlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUkxlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk9PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJSS3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJSSy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA0MiIgeT0iODM1NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJSUGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQ3MCIgaGVpZ2h0PSIxMTM0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSU09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlJPdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlJPLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NzY2IiB5PSI4MzQ4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJYWE3LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYTlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYTl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYS1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWEtdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElhYTdPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1MDciIHk9IjgzNTYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElhYlFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwNjQiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiU09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiU3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlRPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWFiUHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFiUC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTA1IiB5PSI1NjcxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJYWJhdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJkZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElhYlotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYmFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyMCIgeT0iMzAxMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFiZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSIxMTM0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJnLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiaGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJYWJkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWJlT2ZYRWR1cUhvT0piVVJaUnciIHg9IjkxOTMiIHk9IjMxNyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtMMS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa0wzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa0wzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa0w0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMNHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa0wxT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa0wxZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjY2IiB5PSI1NjYxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01FT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa01GT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDM3IiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01GZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTUdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTUhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01ILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElrTUVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc2MyIgeT0iMzAwMyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNS2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01MT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtNTGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzAxNCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01NZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01NdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01NLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01OT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01OZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01OdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01OLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNT09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01LdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01LLWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1MDQiIHk9IjMwMTAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTVQtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01VLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01WT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01WZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01WdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01WLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01XT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01XZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNV3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01UT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01UZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNDQzIiB5PSIyOTkxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01aT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa01hT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTWJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTWItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTWNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01jLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElrTVplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3MTAiIHk9IjMwMDkiIHdpZHRoPSI0NDE3IiBoZWlnaHQ9Ijk3OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNE9vbEVkdVZBN3Z0NXFiSUpRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA0LW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9lSE8wNU9vbEVkdVZBN3Z0NXFiSUpRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNWVvbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNXVvbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNS1vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA2T29sRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2VITzA2ZW9sRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA2dW9sRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2VITzA2LW9sRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA3T29sRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2VITzA3ZW9sRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA3dW9sRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wNy1vbEVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2VITzA0ZW9sRWR1VkE3dnQ1cWJJSlEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2VITzA0dW9sRWR1VkE3dnQ1cWJJSlEiIHg9IjMzMTkiIHk9IjgzNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d2UEYxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFhME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDBGIiBzb3VyY2U9Il9ISVJRNmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWExZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFhMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFhMGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWEwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMywgLTQ3ODksIDIxNjldJFs0NzU1LCAtMjE5NiwgLTgsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWExLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJYWEyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIHNvdXJjZT0iX0hJUlEtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWEzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJYWEydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElhYTItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAzLCAtMjcsIDIxNjldJFstOCwgLTIxOTYsIC04LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWE0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFhNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBzb3VyY2U9Il9ISVJSR2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFhNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFhNC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWE1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMywgNDcxMCwgMjE2OV0kWy00NzQ0LCAtMjE5NiwgLTgsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWE2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJYWJodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVBRTAyQ0UiIHNvdXJjZT0iX0hJYWJadWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWJpdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJYWJoLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElhYmlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCAtODE0OSwgMjE3MF0kWzgxMzYsIC0yMTk2LCAxNCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMMHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTDQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgc291cmNlPSJfSElSUkNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTDUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTDVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtMNWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDMsIC03MTE4LCAyMTY5XSRbNzA5NywgLTIxOTYsIDYsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0w3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDciIHNvdXJjZT0iX0hJUlJLZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa0w4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0w3ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTDd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAzLCAtMjM4MiwgMjE2OV0kWzIzNjEsIC0yMTk2LCA2LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMOC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtMOWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0Q5IiBzb3VyY2U9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTC0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtMOXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa0w5LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgMjM1NCwgMjE2OV0kWy0yMzc1LCAtMjE5NiwgNiwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTF9PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMX2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTF91ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfSElhYTYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01CT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTUF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTF8tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNQU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01MDMsIDcwOTEsIDIxNjldJFstNzExMSwgLTIxOTYsIDYsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01CZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTUJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01JT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIHNvdXJjZT0iX0hJa01FT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01KT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01JZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTAyLCAtNDQxOCwgMjE3MF0kWzQ0MDYsIC0yMTk2LCAxNCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNS09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTU9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDNBRiIgc291cmNlPSJfSElhYlBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTUtlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01QLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTU91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTU8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzOCwgLTUwMywgLTIzOCwgMjE3MF0kWy0yMzgsIC0yMTk3LCAtMjM4LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNUU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01RZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBzb3VyY2U9Il9ISWtNS2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNUS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01ST2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMiwgLTU4MiwgMjE3MF0kWzU2OSwgLTIxOTYsIDE0LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNU2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01TdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNVy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtNUy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01YdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01ZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNWC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNWE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNWGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTMzLCAtNTAzLCAtMTMzLCAyMTcwXSRbLTEzMywgLTIxOTcsIC0xMzMsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01ZdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01kT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0hJa01TLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01kZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTWR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCAzNTE5LCAyMTcwXSRbLTM1MzIsIC0yMTk2LCAxNCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTWUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNZk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTWZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMDA1ODNCMDFFNiIgc291cmNlPSJfSElrTVpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01nLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTWdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTWZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNZi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDIsIDgxNDksIDIxNzBdJFstODE2MiwgLTIxOTYsIDE0LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01oZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9lSFlsNE9vbEVkdVZBN3Z0NXFiSUpRIiBlbGVtZW50PSJfRDNiOG9Pb2tFZHVWQTd2dDVxYklKUSIgc291cmNlPSJfZUhPMDRPb2xFZHVWQTd2dDVxYklKUSIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSFlsNC1vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSFlsNWVvbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VIWWw1dW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9lSFlsNU9vbEVkdVZBN3Z0NXFiSUpRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9lSFlsNGVvbEVkdVZBN3Z0NXFiSUpRIiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2VIWWw0dW9sRWR1VkE3dnQ1cWJJSlEiIHBvaW50cz0iWzE3NDYsIC0xNTksIC04Njc5LCA4NDZdJFs4Nzg0LCAtODQ3LCAtMTY0MSwgMTU4XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcEgyeU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdCIj4KLSAgICAgICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiIG5hbWU9Ikd1aWRhbmNlVHlwZXMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3FVSnRlZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNDlGRjMwMDBFIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNDlGRjMwMDBFIiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RydWN0dXJlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCM0c0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRTAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FRMGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVExT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVExdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVEyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVEydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRM09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQjNHNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCM0c0dWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MDI1IiB5PSIxODM4MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVE0ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE3T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVEzdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUTMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0NjEiIHk9IjIzMTQxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUkllZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUktlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSS3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUkxPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUkh1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSSC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQ1MiIgeT0iMTk3NzgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJMZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSTWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FST2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSUE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSTHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJMLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0OTUyIiB5PSIxNzY2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJTdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJWZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJSLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUlNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1ODgiIHk9IjE1ODQxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUld1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUllPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUll1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlplZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUlYtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSV09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDU3MSIgeT0iMTQxNjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSYXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJiLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJjZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJjLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSZGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSWi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJhT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0NTI4IiB5PSIxMjU4OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJldWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjkzOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQjBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUmQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzY3MyIgeT0iMTA2MDgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0tCMXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCNGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0tCMC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0IxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0Mzc2IiB5PSIyMTI0MiIgd2lkdGg9IjM1NjQiIGhlaWdodD0iMjExNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDS0NDZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NEZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0R1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NELWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0V1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NGT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDS0NCdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENLQ0ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3NCIgeT0iMTAxOTMiIHdpZHRoPSIzNDU0IiBoZWlnaHQ9IjEzNzU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENUellPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUell1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6WmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Wi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6YWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUemEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENUelhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R6WHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTA4NyIgeT0iNDgxNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDVHpjT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUemRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUemQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOHdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzh3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDVHpiZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUemJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQyMTUiIHk9IjM0NDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ2M4eU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4ek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzh6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4enVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzh6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4ME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzgwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4MC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ2M4eGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzh4dWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MzUxIiB5PSI1OTg1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENjODJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4Mi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4M2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4My1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4NGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENjODFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M4MXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDkyNSIgeT0iNTI3NCIgd2lkdGg9IjI5ODgiIGhlaWdodD0iMzY3NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDYzlGT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDYzlFZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjOUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU2NiIgeT0iMjc5NCIgd2lkdGg9IjM1NzMiIGhlaWdodD0iNjkwOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDbXQ1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzAxIiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210NmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210Ni1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210N2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENtdDRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ210NHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iNzk5MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dxVUp0LWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgYWxsIGd1aWRhbmNlIHR5cGVzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIHRvIG90aGVyIGNvbnRlbnQgZWxlbWVudHMuICBBc3NvY2lhdGlvbnMgYW5kIG11bHRpcGxpY2l0aWVzIGhhdmUgYmVlbiBwcmVkZWZpbmVkIG9uIHRoYXQgbGV2ZWwgb2YgZGV0YWlsIHRvIGVuc3VyZSB0aGF0IGd1aWRhbmNlIGlzIG9ubHkgcmVsYXRlZCB0byBhcHByb3ByaWF0ZSBjb250ZW50IGVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIFVNQSBkZWZpbmVzIHRoYXQgb25seSBvbiBjaGVja2xpc3QgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmUgY29udGVudCBlbGVtZW50IGF0IGEgdGltZS4gIE90aGVyIHBhY2thZ2VzIGFkZCB2YXJpYWJpbGl0eSBjYXBhYmlsaXRpZXMgdG8gY2hlY2tsaXN0cyAoYW5kIG90aGVyIGNvbnRlbnQgZWxlbWVudHMpIHRoYXQgYWxsb3dzIHRvIGR5bmFtaWNhbGx5IHByb3ZpZGUgYWRkaXRpb25hbCBjaGVjayBwb2ludHMgb3IgZXZlbiBjaGVjayBwb2ludCBncm91cGluZ3MgdG8gY2hlY2sgbGlzdCBzbyB0aGF0IGFuIGFzc29jaWF0ZWQgY2hlY2sgbGlzdCBhbHdheXMgY29udGFpbnMgdGhlIHJpZ2h0IGNoZWNrIHBvaW50cyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBwYXJ0aWN1bGFyIG1ldGhvZCBjb25maWd1cmF0aW9uIG9yIHByb2Nlc3MuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDQVJQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwQjAiIHNvdXJjZT0iX0hCM0c0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDQVJMZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUlFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDQVJQdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0FSUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTA4MywgLTI0NSwgMjIxOCwgNDY1XSRbLTI0NTUsIC01MzMsIDg0NiwgMTc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQ0FSUk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSENBUlJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0tCNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2IiBzb3VyY2U9Il9IQ0tCMHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tCMHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0I1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCOE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzQyIiB5PSI0NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCOC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTUiIHk9Ii00NzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCOXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCX09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCLXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0JfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NBT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0JfdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NBdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tCNC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDS0I1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3NzgsIDgsIDE3NzgsIDhdJFszMzc4LCA4LCAzMzc4LCA4XSRbMzM3OCwgMjU5MCwgMzM3OCwgMjU5MF0kWzgwNCwgMjU5MCwgODA0LCAyNTkwXSRbODA0LCAxMDU4LCA4MDQsIDEwNThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0tDRmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIiBzb3VyY2U9Il9IQ0FSSGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0ctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0NHZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODA1IiB5PSItMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDSU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0ODIiIHk9IjI3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDSS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ2IiB5PSItMzcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NKdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2MSIgeT0iMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0stZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0tlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0wtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0xlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDTi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENLQ0Z1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tDRi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTgwMywgLTEwMSwgMTEwNDksIDMwOThdJFstMTEyMzUsIC0xMDEsIDE2MTcsIDMwOThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0tDUWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhFIiBzb3VyY2U9Il9IQ0FSTGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0NSZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDU2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA0MSIgeT0iLTI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1RPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjM1IiB5PSIxNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc1IiB5PSItNDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NVdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ5MiIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ1YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ1ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1dlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDWWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENLQ1F1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tDUS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQ2LCA1OSwgMTE1NDgsIDExMjZdJFstMTA3NzgsIDU5LCAxNjE3LCAxMTI2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENLQ1pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyIgc291cmNlPSJfSENBUlJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDYU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkzNiIgeT0iLTI1NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE5OSIgeT0iMTg1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NjdWZYRWR1cUhvT0piVVJaUnciIHg9IjkzNyIgeT0iLTQ1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDZGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzkiIHk9IjMxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NlT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NmT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ2d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ2h1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2hPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDS0NaZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQ1p1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk1NiwgMTYsIDExMTg0LCAtNzQ1XSRbLTEwNTI0LCAxNiwgMTYxNywgLTc0NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDVHkwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiIHNvdXJjZT0iX0hDQVJWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUeTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHkyT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MTQiIHk9IjE2OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE5NSIgeT0iLTI5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5M3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDM5IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzgiIHk9IjI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5Ni1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUeTd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUeTh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeThPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHkwZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENUeTB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkyMiwgMzMsIDExMTY3LCAtMjQwNF0kWy0xMDQ3MywgMzMsIDE2MTcsIC0yNDA0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENUeTgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSIgc291cmNlPSJfSENBUlp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHktZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R5OS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk1MSIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHlfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeV91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNiIgeT0iMjIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpBZWZYRWR1cUhvT0piVVJaUnciIHg9IjExOTIiIHk9Ii0zMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6QS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyMiIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6RWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6RC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6RmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6RS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENUeTlPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ1R5OWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTE0LCAtNDIsIDExMTI1LCAtNDA1NV0kWy0xMDQyMiwgLTQyLCAxNjE3LCAtNDA1NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDVHpGdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiIHNvdXJjZT0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDQVJkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUekd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpIdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDYyIiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6SWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpKT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg5MyIgeT0iLTEwMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpKLWZYRWR1cUhvT0piVVJaUnciIHg9IjUzNyIgeT0iMjExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUektlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUek1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Tk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6TXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUek5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUek4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6T09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6TnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENUekYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ1R6R09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjE3LCAtNjAzNiwgLTEwMDY2LCAtNDJdJFsxMDI3MCwgLTYwMzYsIC0xNDEzLCAtNDJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R6T2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EwIiBzb3VyY2U9Il9IQ0tCMHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpQZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6UWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTEzMiIgeT0iMTM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQzOCIgeT0iLTQzOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Ui1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NDQiIHk9IjE5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpTdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NzgiIHk9Ii0yNjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6VC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6VGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6VS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6VWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpWZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ1R6T3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDVHpPLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzc4LCAtNTAsIDEwOTcyLCA1MTgxXSRbLTExMTMzLCAtNTAsIDE2MTcsIDUxODFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ2M4N2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0IiBzb3VyY2U9Il9IQ2M4eE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M4MU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzg4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M4OWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzMyIiB5PSItMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M4LU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NCIgeT0iMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOC11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzgtLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3OCIgeT0iLTI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzhfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M4X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTYiIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5QS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5QWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5Qi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5QmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlDZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlEZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ2M4N3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDYzg3LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEwNDEsIC0xMDEsIC05OTgyLCAtNzYyXSRbOTUzMywgLTEwMSwgLTE0OTAsIC03NjJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ2M5SU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UxIiBzb3VyY2U9Il9IQ1R6WE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzlKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Si1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5S09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjU1IiB5PSItMjc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Sy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzIiIHk9IjQxNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5THVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjI0IiB5PSItMjc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlNZWZYRWR1cUhvT0piVVJaUnciIHg9Ijk4IiB5PSIzMzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5TnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Tk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5T3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5T09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlQT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5UWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlRT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ2M5SWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDYzlJdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NjIsIC02NywgMTA4NzEsIC0xMDMyXSRbLTk5NTYsIC02NywgMTY3NiwgLTEwMzJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ2M5US1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIiBzb3VyY2U9Il9IQ1R6Yk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzlSLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5U3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Uy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTA1IiB5PSItMzEzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5VHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI2IiB5PSIyODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA5NCIgeT0iMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlWT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1NCIgeT0iLTM3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlWLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlXLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDYzlST2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENjOVJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkyMiwgLTU5LCAxMDc2MSwgLTIzOTZdJFstMTAwMDcsIC01OSwgMTY3NiwgLTIzOTZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ2M5Yi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIiBzb3VyY2U9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M4eE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDbXR3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210eGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTk1IiB5PSItMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210eS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MDEiIHk9Ii0xMTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210emVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210ei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210enVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMCIgeT0iMzIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdDBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdDFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210Mi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210MmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210My1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210M2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjOWNPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M5Y2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjc2LCAyMDMsIC0xMDI2MSwgMF0kWzEwODk2LCAyMDMsIC0xMDQxLCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENtdDhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNiIgc291cmNlPSJfSENtdDRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjODFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ210OU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdC1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY5NyIgeT0iLTIzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdC0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzNyIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdF9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXRfdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg0MiIgeT0iLTIwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211QWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzODQiIHk9IjM1NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211Qi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVDT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211Qy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdUR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdURPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdUV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDbXQ4ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENtdDh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjE1MCwgLTE2LCAtOTEyNywgMTM1NF0kWzk3ODcsIC0xNiwgLTE0OTAsIDEzNTRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ211RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY1IiBzb3VyY2U9Il9IQ210NE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDbXVGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Ry1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzg5IiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzk1IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUllZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzgzIiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM3NyIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdUtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211TU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211TWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211TC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211TmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211TS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENtdUZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ211RmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjE1MCwgMCwgOTUzMywgMjIzNV0kWy0xMDAwNywgMCwgMTY3NiwgMjIzNV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iXy1nN0xzTzBvRWR1dENMRUNOOTZCTnciIGVsZW1lbnQ9Il8tZDh3TU8wb0VkdXRDTEVDTjk2Qk53IiBzb3VyY2U9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0FRM2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THMtMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdGUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THR1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfLWc3THRPMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x0LTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdWUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMdU8wb0VkdXRDTEVDTjk2Qk53IiB4PSItNDc3IiB5PSIyNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdXUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x2TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMdS0wb0VkdXRDTEVDTjk2Qk53IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THZlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THYtMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMdnUwb0VkdXRDTEVDTjk2Qk53IiB4PSIzMTciIHk9IjIzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x3TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMd3Uwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMd2Uwb0VkdXRDTEVDTjk2Qk53IiB4PSItNjY3IiB5PSItMjA4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THctMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x4ZTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1nN0x4dTBvRWR1dENMRUNOOTZCTnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1nN0x4TzBvRWR1dENMRUNOOTZCTnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4c08wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4c3Uwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8taEU4cy0wb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8taEU4c2Uwb0VkdXRDTEVDTjk2Qk53IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHRPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4dHUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8taEU4dC0wb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8taEU4dGUwb0VkdXRDTEVDTjk2Qk53IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHVPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh1dTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLWhFOHUtMG9FZHV0Q0xFQ045NkJOdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWhFOHVlMG9FZHV0Q0xFQ045NkJOdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXy1nN0xzZTBvRWR1dENMRUNOOTZCTnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfLWc3THN1MG9FZHV0Q0xFQ045NkJOdyIgcG9pbnRzPSJbNjUsIDU3LCAtMjYyLCAtMTg0XSRbMjcwLCAyNDUsIC01NywgNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ5RkU3MDNDMSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW9zT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQzVvdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW90LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW91ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW91LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW92ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDNW9zdWZYRWR1cUhvT0piVVJaUnciIHg9IjI2OTM3IiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW93LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW94T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW94dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW95T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW95dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW96T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW96dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW96LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDNW93ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1b3d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjkzNTYiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1bzFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1bzBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjA1NiIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW80T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQzVvNU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW81LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW82ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW82LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW83ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDNW80dWZYRWR1cUhvT0piVVJaUnciIHg9IjE5OTE3IiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFpzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFpzZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERac3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFpzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDNW84ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1bzh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDkxIiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFp3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERad3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp6T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERFp2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREWnYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTkxNyIgeT0iMTAwMDIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp6ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERaMGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFoxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFoxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFoyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFoydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaM09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaenVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFp6LWZYRWR1cUhvT0piVVJaUnciIHg9IjI0NDAwIiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFo0ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo3T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERFozdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREWjMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjYxOCIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERaOGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFotT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaLWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFotdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaX09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaN3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFo3LWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzczIiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWl9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFFMCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERGFBZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFDLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFET2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERFpfdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREWl8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjkxNjQiIHk9IjExNzI5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREYUd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUplZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREYUYtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhR09mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzMxIiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERGFLdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYU1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYU0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFOT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFOZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERGFKLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODI3IiB5PSI0ODM1IiB3aWR0aD0iMzQ3OSIgaGVpZ2h0PSIxMTAwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERNajNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM3NzYiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWozdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1qNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1qNU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1qNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERNajJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNajItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU1MDgiIHk9IjczNDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWotLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRE1qXy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgwMiIgaGVpZ2h0PSI5OTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0JPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0NPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtDdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hETWpfT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNal9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzE3MzkiIHk9IjEwMDIxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERNa0dPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1MjIiIGhlaWdodD0iMTA2NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0ktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERNa0ZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNa0Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4NTAiIHk9IjI4NTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdFT29WRWR1T0JQUUEyaEtxVVEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3RS1vVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il84MjF3Rk9vVkVkdU9CUFFBMmhLcVVRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Zlb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3RnVvVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdGLW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3R09vVkVkdU9CUFFBMmhLcVVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzgyMXdHZW9WRWR1T0JQUUEyaEtxVVEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3R3VvVkVkdU9CUFFBMmhLcVVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzgyMXdHLW9WRWR1T0JQUUEyaEtxVVEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SE9vVkVkdU9CUFFBMmhLcVVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzgyMXdIZW9WRWR1T0JQUUEyaEtxVVEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SHVvVkVkdU9CUFFBMmhLcVVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3SC1vVkVkdU9CUFFBMmhLcVVRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il84MjF3RWVvVkVkdU9CUFFBMmhLcVVRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzgyMXdFdW9WRWR1T0JQUUEyaEtxVVEiIHg9IjE1MTk1IiB5PSIxMDAwOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dxZDZrZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSBkZWZpbmVzIGEgbnVtYmVyIG9mIHByZS1kZWZpbmVkIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzIHRoYXQgY2FuIGJlIHJlbGF0ZWQgdG8gc3BlY2lmaWMgY29udGVudCBlbGVtZW50cy4gIEd1aWRhbmNlIGlzIGEgY29udGVudCBlbGVtZW50IGl0c2VsZiwgc28gaXQgaXMgcG9zc2libGUgdG8gYXNzb2NpYXRlIGd1aWRhbmNlIHRvIGd1aWRhbmNlLiBUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHRheG9ub215IG9mIGFsbCBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYURlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDBCMCIgc291cmNlPSJfSEREWl9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEM1b3dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYUR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhRC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtMzE4LCAwLCAxNzczXSRbMCwgLTE3NzMsIDAsIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYUZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFGZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYVJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0NjZGMDExOSIgc291cmNlPSJfSEM1bzhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYVItZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFTT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzk1MiwgLTMxNywgLTEyMDM5LCA0MDIyXSRbMTE1NjIsIC0zODYyLCAtMTQyOSwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjE5Mzk2MjQ0LDAuMzg3MTI5NzIpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhVC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQ2NzMwMDU1IiBzb3VyY2U9Il9IRERhRnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFVLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhVU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYVVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzQwLCAtMzE3LCAtOTMxNCwgNDAyMl0kWzg5NDIsIC0zODYyLCAtMTExMiwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjE1NjE2ODMsMC43OTI2NDU2KSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYVdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjREMkFCMDNDQSIgc291cmNlPSJfSEREWjNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYVdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFXdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU1NSwgLTMxNywgLTY5NTksIDQwMjJdJFs2NjkzLCAtMzg2MiwgLTgyMSwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhWC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjI4MjE0ODgsMC43NjYwODc4MykiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFZZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDY3QjAyNUQiIHNvdXJjZT0iX0hERFp2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFZdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhWS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzAsIC0zMTcsIC00NjMxLCA0MDIyXSRbNDQ0NSwgLTM4NjIsIC01NTYsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNam9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDlCIiBzb3VyY2U9Il9IRERaN2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWpwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qcE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg1LCAtMzE3LCAtMjM4MiwgNDAyMl0kWzIyNzYsIC0zODYyLCAtMjkxLCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWpxdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNanJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5MCIgc291cmNlPSJfSEM1bzRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qc09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWpydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTMxNywgMzcwLCA0MDIyXSRbLTM0NCwgLTM4NjIsIDUzLCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWpzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNDc3MDYyMDUsMC43NjYwODc4MykiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWp0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNUYiIHNvdXJjZT0iX0hDNW8wT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNanVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWp0dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qdC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTA2LCAtMzE3LCAxMzQ5LCA0MDIyXSRbLTEyOTcsIC0zODYyLCAxNTgsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC41OTY2MjQ3LDAuNzkyNjQ1NikiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWp2dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOTEiIHNvdXJjZT0iX0hERFp6ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNand1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWp2LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qd09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjY1LCAtMzE3LCAzNDM5LCA0MDIyXSRbLTMzMDcsIC0zODYyLCAzOTcsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp4dWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC42OTA3NTM1LDAuNzkyNjQ1NikiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWp4LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNUUiIHNvdXJjZT0iX0hDNW9zT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNanktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWp5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qeWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDIzLCAtMzE3LCA1NDI0LCA0MDIyXSRbLTUyMTIsIC0zODYyLCA2MzUsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp6LWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC43NjYzNDE4LDAuNTc3MTE5NSkiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWowT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNTYiIHNvdXJjZT0iX0hDNW93T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWoxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNajFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWowZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTgyLCAtMzE3LCA3NDg3LCA0MDIyXSRbLTcxNzAsIC0zODYyLCA4OTksIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNajEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWoyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC44NjY4ODg1LDAuNzkyNjQ1NikiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWo2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMUQiIHNvdXJjZT0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hERGFKdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNajdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWo2dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWo2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MCwgLTUwMiwgMCwgMTM1MF0kWy04MCwgLTEyOTYsIDAsIDU1Nl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNajhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWo4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNa0MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMkZBMEMzMDA3QyIgc291cmNlPSJfSERNai0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1rRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNa0RPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWtEZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NjgsIC0zMTgsIDk3ODksIDM5OTVdJFstOTM5MywgLTM4MzYsIDExNjQsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNa0V1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWtFLWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC44ODU5MDQ0MywwLjU3NzExOTUpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1rSk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRERhSnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1rRk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWtLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1rSmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1rSnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01NTUsIDAsIDE1ODhdJFstMjYsIC0xODI1LCAwLCAzMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWtLLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rTE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iXzgyMXdJT29WRWR1T0JQUUEyaEtxVVEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY0QTFENjAyNDUiIHNvdXJjZT0iXzgyMXdFT29WRWR1T0JQUUEyaEtxVVEiIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SS1vVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdKZW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SnVvVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il84MjF3Sk9vVkVkdU9CUFFBMmhLcVVRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfODIxd0llb1ZFZHVPQlBRQTJoS3FVUSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzgyMXdJdW9WRWR1T0JQUUEyaEtxVVEiIHBvaW50cz0iWzc5LCAtMzE3LCAtMTI0NCwgNTIxM10kWzEyMTcsIC01MDUzLCAtMTA2LCA0NzddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BIMnktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5MCI+Ci0gICAgICAgICAgICA8Ym9keT4wMzwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX04xOWxjT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSIgbmFtZT0iQ29uY2VwdCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwUm54dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiPgotICAgICAgICAgICAgICA8Ym9keT5BIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1NiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIiBuYW1lPSJDaGVja2xpc3QiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcFJueXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiIG5hbWU9IkV4YW1wbGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcFJuenVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIj4KLSAgICAgICAgICAgICAgPGJvZHk+QW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCIgbmFtZT0iR3VpZGVsaW5lIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BSbjB1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQ2N0IwMjVEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciIG5hbWU9IlJlcG9ydCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXhzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciPgotICAgICAgICAgICAgICA8Ym9keT5BIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDkwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiIG5hbWU9IlRlbXBsYXRlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDkxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXh1LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPgotICAgICAgICAgICAgICA8Ym9keT5TdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0NjZGMDExOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIiBuYW1lPSJUb29sTWVudG9yIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5QiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUUwIiBuYW1lPSJXaGl0ZXBhcGVyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFFMCI+Ci0gICAgICAgICAgICAgIDxib2R5PldoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDBCMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIiBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwa2lzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiPgotICAgICAgICAgICAgICA8Ym9keT5UZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNEQyQUIwM0NBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiIG5hbWU9IlByYWN0aWNlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BraXQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICZxdW90O01hbmFnZSBSaXNrcyZxdW90OywgJnF1b3Q7Q29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5JnF1b3Q7LCAmcXVvdDtBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50JnF1b3Q7LCBldGMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDY3MzAwNTUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiIG5hbWU9InN1YlByYWN0aWNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1lwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1lwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUprLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUprdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIG5hbWU9IldvcmtQcm9kdWN0IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BraXUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgV29yayBQcm9kdWN0IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyIgbmFtZT0icmVwb3J0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk9yLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9ydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIiBuYW1lPSJ0ZW1wbGF0ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZbHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBQkM4ODAyRDAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKby1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnRPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSnMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSIgbmFtZT0iVGFzayI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwa2l2LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFRhc2sgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZbi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZbnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnJlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSnJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcHVUcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBDb250ZW50IEVsZW1lbnQgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHFPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkdXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk9wdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9wZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3IiBuYW1lPSJleGFtcGxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk91T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk90LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5IiBuYW1lPSJhc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKbk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKbS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciIG5hbWU9InRlcm1EZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiIGFzc29jaWF0aW9uPSJfLWQ4d01PMG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXy1nQnowZTBvRWR1dENMRUNOOTZCTnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1nQnowTzBvRWR1dENMRUNOOTZCTnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcHVUdS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDIyRkEwQzMwMDdDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwdVR2LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiPgotICAgICAgICAgICAgICA8Ym9keT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0QTFENjAyNDUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcDNkb2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIj4KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50cyBjYW4gYmUgcmVsYXRlZCB0byBhbnkgbnVtYmVyIG9mIFN1cHBvcnRpbmcgTWF0ZXJpYWwgZ3VpZGFuY2UgZWxlbWVudHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkcGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2RxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiPgotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiByZWZlciB0byBhbnkgbnVtYmVyIG9mIENvbmNlcHQgZ3VpZGFuY2UuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIF8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcDNkcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIj4KLSAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgY2hlY2sgcG9pbnRzIHJlbGF0ZWQgdG8gYSBwYXJ0aWN1bGFyIGNvbnRlbnQgZWxlbWVudHMuICBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gcmV2aWV3cyBhbmQgaW5zcGVjdGlvbnMgb24gd29yayBwcm9kdWN0cy4KLQotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2R0LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2R0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCBfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3AzZHZPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgYWNjZXNzIHRvIGRldGFpbGVkIEd1aWRlbGluZXMgcmVsYXRlZCB0byB0aGlzIENvbnRlbnQgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT28tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT291ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIF8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcUJPcU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UxIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSZXBvcnQgZXh0cmFjdHMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgV29yayBQcm9kdWN0OyBub3JtYWxseSBkaXJlY3RseSBmcm9tIGEgdG9vbCB0aGF0IG1haW50YWlucyB0aGUgV29yayBQcm9kdWN0cy4gRm9yIGV4YW1wbGUsIGEgUmVwb3J0IGNhbiBwcmVzZW50IGRldGFpbHMgb2YgYW4gQXJ0aWZhY3Qgb3IgYSBzZXQgb2YgQXJ0aWZhY3RzIGZvciB1c2UgaW4gYSB0ZWNobmljYWwgcmV2aWV3LiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3JPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3EtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2IF8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcUJPc2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBzYW1wbGUgb2Ygd2hhdCB0aGUgd29yayBwcm9kdWN0IG1heSBsb29rIGxpa2UsIGFuIGFjdHVhbCBpbnN0YW5jZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3RlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIF8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcUJPdXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIj4KLSAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZGV0YWlsZWQgZ3VpZGFuY2Ugb24gaG93IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdCBpbmRlcGVuZGVudCBvZiBhIHNwZWNpZmljIHNldCBvZiB0YXNrcyBvciBXQlMuICBNYXkgY29udGFpbiBzcGVjaWZpYyBhbGdvcml0aG1zIG9yIGFsdGVybmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1lrLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1lrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSBfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FLWW1PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCI+Ci0gICAgICAgICAgICAgIDxib2R5PkxpbmtzIFRhc2tzIHdpdGggVG9vbCBNZW50b3JzIHdoaWNoIGFyZSBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93IGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIHBlcmZvcm0gdGhlIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1IiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWW5PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWW0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIF8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcUtZb2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcmFjdGljZSBjYW4gYmUgY29tcG9zZWQgb2Ygb3RoZXIgUHJhY3RpY2VzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIF8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcUtZcU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EwIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcmFjdGljZSBjYW4gcmVmZXJlbmNlIGFueSBDb250ZW50IEVsZW1lbnQuICBUaGUgYXNzb2NpYXRpb24gZXhwcmVzc2VzIHRoYXQgdGhpcyBDb250ZW50IEVsZW1lbnQgaXMgcGFydCBvZiBvciBiZWxvbmdzIHRvIHRoaXMgUHJhY3RpY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpsdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSBfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FVSm1PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNEMDMyMSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgd29yayBwcm9kdWN0IGlzIHJlbGF0ZWQgdG8gb25lIG9yIG1vcmUgYXNzZXRzIHRvIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKbi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKbnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MgXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdFIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpwdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyBfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjciIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKcXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKcWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYgXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2IiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpzZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8tZDh3TU8wb0VkdXRDTEVDTjk2Qk53IiBtZW1iZXJFbmQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53IF8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53IiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGFzc29jaWF0aW9uPSJfLWQ4d01PMG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXy1nQnoxTzBvRWR1dENMRUNOOTZCTnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1nQnowLTBvRWR1dENMRUNOOTZCTnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI1IiBuYW1lPSJDYXRlZ29yaWVzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dyZ2NjLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjQ4RkNFMDA2MCI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ4RkNFMDA2MCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkNhdGVnb3JpemF0aW9ucyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERXVXRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERXVXNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRFdVc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTYxMiIgeT0iOTg4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEV1V4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEV1V3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEV1V3dWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMjk0IiB5PSIxMzQxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEZ0ZvZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEV1UwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERXVTB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjExOTIiIHk9Ijk5MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRGdGOS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZfT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGX2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZfdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGXy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dBT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHQXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRGdGOU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0Y5ZWZYRWR1cUhvT0piVVJaUnciIHg9IjI2MjcyIiB5PSI5OTMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERnR0t1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0NzAiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHTWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR011ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR05PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR05lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERnR0otZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERnR0tPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjcxMjciIHk9IjEzNDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjNBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERwUG11ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERwUGwtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQbU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTc1MSIgeT0iOTkzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEcFB6ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEcFB5dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFB5LWZYRWR1cUhvT0piVVJaUnciIHg9IjM0NDU5IiB5PSIxMzIzNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEcFAzZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEcFAydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERwUDItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU2NjEiIHk9Ijk5MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHpBbnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBcU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBcWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHpBbS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekFuT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2Mzc0IiB5PSIzOTQ1IiB3aWR0aD0iNDIzMyIgaGVpZ2h0PSIyMTc1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSER6QTVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1NzIiIGhlaWdodD0iMTE2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBNi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSER6QTRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzg4NTQiIHk9IjEzMzAxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCQTIwMDlDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSER6QTlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iODk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekEtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekEtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBXy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHpBOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekE4dWZYRWR1cUhvT0piVVJaUnciIHg9IjM4Nzc3IiB5PSIxMDAxNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eGxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEOHhtT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eG5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eG4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eG9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEOHhsZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eGx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQwMyIgeT0iOTkzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEOHhzZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4c3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEOHhydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHhyLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0NDgiIHk9IjEyNjY3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEQ4eHdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4eE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4eHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4eU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4eXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEQ4eHZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4di1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAwNiIgeT0iOTkxNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXViLUVPb2pFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElBT29qRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzl1bElBZW9qRWR1VkE3dnQ1cWJJSlEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQXVvakVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElBLW9qRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUJPb2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElCZW9qRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXVsSUJ1b2pFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElCLW9qRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXVsSUNPb2pFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElDZW9qRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXVsSUN1b2pFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElDLW9qRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl1bElET29qRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzl1Yi1FZW9qRWR1VkE3dnQ1cWJJSlEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfOXViLUV1b2pFZHVWQTd2dDVxYklKUSIgeD0iMTY4MjciIHk9IjIwODkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcmdjZGVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifFRoZSBDYXRlZ29yaWVzIHBhY2thZ2UgY29udGFpbnMgY2xhc3NlcyB0aGF0IHByb3ZpZGUgZGlmZmVyZW50IHdheXMgdG8gbG9naWNhbGx5IGNhdGVnb3JpemUgY29udGVudCBlbGVtZW50cy4gIEluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIGNhdGVnb3JpZXMgdGhhdCBoYXZlIGJlZW4gcHJlZGVmaW5lZCBmb3IgbW9zdCBjb250ZW50IGVsZW1lbnQgdHlwZXMgaW4gdGhpcyBtZXRhLW1vZGVsLCBpdCBwcm92aWRlcyB0aGUgY2FwYWJpbGl0eSBmb3IgdXNlcnMgdG8gZGVmaW5lIHRoZWlyIG93biBjdXN0b20gY2F0ZWdvcmllcyBvbiBjb250ZW50IGVsZW1lbnRzLiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiBUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHRheG9ub215IG9mIGFsbCBwcmUtZGVmaW5lZC9zdGFuZGFyZCBjYXRlZ29yeSBtZXRhLWNsYXNzZXMgYXMgd2VsbCBhcyB0aGUgZGVmaW5pdGlvbiBmb3IgQ3VzdG9tIENhdGVnb3J5IGNsYXNzZXMsIHdoaWNoIGNhbiBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyIHRvIGNhdGVnb3JpemVzIGFueSBDb250ZW50IEVsZW1lbnQgYXMgd2VsbCBhcyBjYW4gYmUgbmVzdGVkIHdpdGggb3RoZXIgQ2F0ZWdvcmllcyAoaS5lLiBvdGhlciBjYXRlZ29yaWVzIGNhbiBiZSBkZWZpbmVkIHRvIGJlIGEgc3ViLWNhdGVnb3J5IG9mIGFueSBjdXN0b20gY2F0ZWdvcnkpLiYjeEE7fCYjeEE7Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0ZyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiIHNvdXJjZT0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEV1VzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERnRnNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z0ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIwIiB5PSItMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGdU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDkiIHk9IjI3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGdS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItODgiIHk9Ii0yNzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGdnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzQ4IiB5PSItNTkyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRndlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRngtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGemVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERnRnJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdGci1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODU1LCAtNDIsIDQwMjEsIDhdJFstMzMxOCwgLTQyLCAxNTU3LCA4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERnRjBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OSIgc291cmNlPSJfSERXVXdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERXVTBPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdGMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwIiB5PSI0NDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0YyLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk4IiB5PSItNjM2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0YzdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjMiIHk9IjQ4MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Y0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNDEiIHk9Ii04MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Y3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Y3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Y4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Y4T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRGdGMGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEZ0YwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjIsIC01NjcsIC04LCAyOTg4XSRbLTI2MiwgLTMwNzMsIC04LCA0ODJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdHQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0IiBzb3VyY2U9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0dCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHQy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTkiIHk9Ii0yNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dEdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTE5IiB5PSIzMTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dFZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE4IiB5PSItMzIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0YtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0ctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHSmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHSS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERnR0JPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdHQmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODU1LCA3NiwgLTg1NSwgNzZdJFstMzE4MywgNzYsIC0zMTgzLCA3Nl0kWy0zMTgzLCAxNDY0LCAtMzE4MywgMTQ2NF0kWy00MDYsIDE0NjQsIC00MDYsIDE0NjRdJFstNDA2LCA0ODIsIC00MDYsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0dOdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciIHNvdXJjZT0iX0hEZ0dKdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERnR091ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dQdWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MSIgeT0iMTUwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MDQiIHk9Ii0xMDgyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dST2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yIiB5PSItMjQxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5OSIgeT0iNzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR1RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR1VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHVXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERnR04tZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEZ0dPT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNTUsIC01NjcsIDE4NzksIDI5ODhdJFstMTkzMCwgLTMwNzMsIDMwNCwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERwUHB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSIgc291cmNlPSJfSERnR0p1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERwUGx1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFByT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQcXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxIiB5PSItMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTEiIHk9IjEwNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQiIHk9Ii0zMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQdC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDI1IiB5PSIxMzg1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQeE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQeU9mWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB4dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHBQcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERwUHFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjk2LCAtNTY3LCAtMTY4NCwgMjk4OF0kWzE3MDEsIC0zMDczLCAtMjc5LCA0ODJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHBQNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5IiBzb3VyY2U9Il9IRHBQeWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHBQMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFA3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDAiIHk9Ii0zNzMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFA5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01NyIgeT0iMTE1OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQOS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjIiIHk9Ii0yMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQLXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMiIgeT0iNTc2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUF91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUF8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUF9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QWtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUUFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpBay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpBbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERwUDZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHBQNi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzA0LCAtNTUwLCAtNTAsIDMxMDddJFstMzA0LCAtMzE3NSwgLTUwLCA0ODJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpBcXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNzEyOTUwMTdGIiBzb3VyY2U9Il9IRFdVc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekFydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpBcS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QXJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTEwLCAtNDkxLCAtMTIxMCwgNDg0Ml0kWzEwMzIsIC00MjUwLCAtMjg3LCAxMDgzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBc2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpBdk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU4IiBzb3VyY2U9Il9IRFdVME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekF3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpBdmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QXZ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMzMCwgLTQ5MSwgMzIyNSwgNDg5M10kWy0yODUzLCAtNDMwMSwgNzAyLCAxMDgzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBdy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpBeGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc2IiBzb3VyY2U9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekF5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpBeHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QXgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc3MCwgLTQ5MSwgNzg2NSwgNDg5M10kWy02ODkxLCAtNDMwMSwgMTc0NCwgMTA4M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekF6ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOCIgc291cmNlPSJfSERwUGx1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekExT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBMHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXotZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekEwT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTQzLCAtNDkxLCAxMTcwOSwgNDg5M10kWy0xMDczNSwgLTQ1MDQsIDIxMTYsIDg4MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QTFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekExdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QTEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOCIgc291cmNlPSJfSERwUDJlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBMi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QTJPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekEyZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NzAsIC0zNTUsIDE2Mzk5LCA1MDI5XSRbLTUwNDYsIC0yMzAyLCAxMjEyNCwgMzA4MV0kWy0xNTA1MywgLTQ4NTEsIDIxMTYsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QTN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekEzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QkFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkFFMDI5OCIgc291cmNlPSJfSER6QThPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpCQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QkFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekJBdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzksIC00NTcsIDIwODUzLCA0OTc4XSRbLTgyODgsIC0zOTM3LCAxMzUwNCwgMTQ5OF0kWy0xOTY3NiwgLTUyMDcsIDIxMTYsIDIyOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QkItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekJDT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QkNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiIgc291cmNlPSJfSER6QThPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJELWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpCRGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMwNTgiIHk9IjI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzE3NyIgeT0iOTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTI2IiB5PSIyNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCSGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJKZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJLZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpCQ3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekJDLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMzLCAtNDQ4LCAyMTgyNywgNDk4Nl0kWzMzLCAtNTc1NywgMjE4MjcsIC0zMjFdJFstMTk2NzYsIC01NzU3LCAyMTE2LCAtMzIxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QkxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCIgc291cmNlPSJfSER6QThPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QTRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekJNT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01MDAiIHk9Ii0xIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6Qk5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcyIiB5PSIzODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJOLWZYRWR1cUhvT0piVVJaUnciIHg9IjMiIHk9Ii0xNjA5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJPdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMCIgeT0iNDA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY5IiB5PSItMTg0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QlN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QlNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eGstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eGtlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekJMZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6Qkx1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIDQ0MCwgLTI1NCwgLTMxNjZdJFs1MCwgMzAxNCwgLTI1NCwgLTU5Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHhwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTQiIHNvdXJjZT0iX0hEOHhsT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eHFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHhwZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh4cHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTc2LCAtNDkxLCAtMTIyODUsIDQ4OTNdJFsxMTMzNiwgLTQ1NDYsIC0yMTI1LCA4MzhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEOHhxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRDh4ck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHh6ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiIHNvdXJjZT0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEOHhsT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4ME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eDBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgxZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NCIgeT0iLTM0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5IiB5PSIzMTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2OSIgeT0iMjg5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwMzIiIHk9Ii0zODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4NC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4NGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4NS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4NWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHg2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHg2ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4N09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4N3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHg3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHg3ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh4enVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEOHh6LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzEsIC0xMTgsIDU5NzcsIC0xMThdJFstNTI4MywgLTExOCwgMTYyNSwgLTExOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHg4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiIHNvdXJjZT0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEOHhyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eDlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgtT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk5IiB5PSItMTgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eC11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NiIgeT0iODk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eF9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHhfdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjkiIHk9Ii0xODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5QWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzU5IiB5PSI2NzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5QnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5Qk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5Q3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5Q09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlEdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlET2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5RWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlFT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh4OGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEOHg4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02NjIsIDMxOCwgMjM4LCAtMTkzMV0kWy02NjIsIDE5MzIsIDIzOCwgLTMxN10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHlFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxM0IiIHNvdXJjZT0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eUYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHlGT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh5RmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2MDEsIC01MDgsIC01OTUyLCA0ODc2XSRbNTIxNSwgLTQzMDEsIC0xMzM3LCAxMDgzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRDh5R3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEQ4eUctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh5SE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2IiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5SWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHlJT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5SS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5S3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzQ0IiB5PSItMjA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUxlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTk0IiB5PSItOTcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eU11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eU1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eU51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eU5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5T3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5T09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5UHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5UE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eUhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh5SHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0MTQsIDQ5OSwgNDE0LCA0OTldJFs0MTQsIDE0MzAsIDQxNCwgMTQzMF0kWzIxNTAsIDE0MzAsIDIxNTAsIDE0MzBdJFsyMTUwLCAtNDIsIDIxNTAsIC00Ml0kWzkzMSwgLTQyLCA5MzEsIC00Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0QzbHRvT29rRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il9EM2I4b09va0VkdVZBN3Z0NXFiSUpRIiBzb3VyY2U9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il85dWItRU9vakVkdVZBN3Z0NXFiSUpRIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRDNsdG8tb2tFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EM2x0cGVva0VkdVZBN3Z0NXFiSUpRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRDNsdHB1b2tFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRDNsdHBPb2tFZHVWQTd2dDVxYklKUSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0QzbHRvZW9rRWR1VkE3dnQ1cWJJSlEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9EM2x0b3Vva0VkdVZBN3Z0NXFiSUpRIiBwb2ludHM9IlstNSwgLTQxLCAtNCwgNTldJFstNjMsIC0xMDQsIC02MiwgLTRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FkNmstZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSI+Ci0gICAgICAgICAgICA8Ym9keT4wNDwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9kZGo4c094ZEVkdUhqZTNwUGFoTjRBIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiLz4KLSAgICAgICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9lYVc4SU94ZEVkdUhqZTNwUGFoTjRBIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgbmFtZT0iRGlzY2lwbGluZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVoLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciPgotICAgICAgICAgICAgICA8Ym9keT5BIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxM0IiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMiIG5hbWU9InRhc2tzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY2FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiIG5hbWU9InN1YmRpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NDVBNTkyNTAyNjYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjY2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjY09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMwIiBuYW1lPSJSb2xlU2V0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FuRWktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiIG5hbWU9InJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3E2bWl1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3E2bWllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSIgbmFtZT0iRG9tYWluIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FuRWotZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSI+Ci0gICAgICAgICAgICAgIDxib2R5PkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiIG5hbWU9IndvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1rLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1rdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3IiBuYW1lPSJzdWJkb21haW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JEd2NPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3E2bW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzQSIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FuRWstZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzQSI+Ci0gICAgICAgICAgICAgIDxib2R5PldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyIgbmFtZT0id29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JEd2VlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JEd2VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWdPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCI+Ci0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfRDNiOG9Pb2tFZHVWQTd2dDVxYklKUSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjRFIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcXcxaE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjRFIj4KLSAgICAgICAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4IiBuYW1lPSJkaXNjaXBsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyTmhkdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyTmhkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTgiIG5hbWU9IlRvb2wiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcXcxaU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyV3JZT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyTmhmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTkiIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFqT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTkiPgotICAgICAgICAgICAgICA8Ym9keT5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNzEyOTUwMTdGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5IiBuYW1lPSJyb2xlU2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMwIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyV3JhZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyV3JhT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWtPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBRTAyOTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyYi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcldyYnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NZZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3E2bWctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9sZSBTZXQgY2F0ZWdvcml6ZXMgbWFueSBSb2xlcyBhbmQgYSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBpbiBtYXkgUm9sZSBTZXRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcTZtaC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZtaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzggXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxNm1qT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciPgotICAgICAgICAgICAgICA8Ym9keT5BIERvbWFpbiBjYXRlZ29yaXplcyBtYW55IFdvcmsgUHJvZHVjdHMuIEEgV29yayBQcm9kdWN0IGJlbG9uZ3MgYXQgbW9zdCB0byBvbmUgRG9tYWluLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCIgbmFtZT0iZG9tYWluIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3E2bWtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3E2bWotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcTZtbGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0Ij4KLSAgICAgICAgICAgICAgPGJvZHk+RG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gU3ViZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgb25seSB0byBiZSBjYXRlZ29yaXplZCBhdCB0aGUgbGVhZi1sZXZlbC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiIG5hbWU9Il9kb21haW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyRHdjdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiPgotICAgICAgICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgemVybyBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiIG5hbWU9IndvcmtQcm9kdWN0VHlwZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzQSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HckR3ZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HckR3ZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyRHdlLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiPgotICAgICAgICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIEdyb3VwaW5ncyBncm91cCBtYW55IERpc2NpcGxpbmVzLiAgQSBEaXNjaXBsaW5lIGNhbiBiZSBpbiBtYW55IERpc2NpcGxpbmUgR3JvdXBzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNiIgbmFtZT0iZGlzY2lwbGluZUdyb3VwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjRFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyTmhjLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyTmhjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JOaGVPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVG9vbCBNZW50b3IgZGVzY3JpYmVzIHdvcmsgd2l0aCBleGFjdGx5IG9uZSBUb29sLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSIgbmFtZT0idG9vbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyTmhmT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyTmhlLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTcgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyV3JZdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IEdyb3VwaW5nIGNvbnRhaW5zIG1hbnkgUm9sZSBTZXRzLiBSb2xlIFNldHMgY2FuIGJlIGluIG1hbnkgUm9sZSBTZXQgR3JvdXBpbmdzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyIgbmFtZT0icm9sZVNldEdyb3VwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyV3JadWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyV3JaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiBfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JXcmEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ3VzdG9tQ2F0ZWdvcnkgZ3JvdXBzIHRvZ2V0aGVyIGFueSBudW1iZXIgb2YgQ29udGVudEVsZW1lbnRzIGluY2x1ZGluZyBvdGhlciBDb250ZW50Q2F0ZWdvcnkuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiIgbmFtZT0iY3VzdG9tQ2F0ZWdvcmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFCREVCQTIwMDlDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyV3JjdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyV3JjZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCBfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JXcmRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ3VzdG9tQ2F0ZWdvcnkgY2FuIGhhdmUgYW55IG51bWJlciBvZiBDb250ZW50Q2F0ZWdvcmllcyBkZWZpbmVkIGFzIG5lc3RlZCBzdWJDYXRlZ29yaWVzLiAgVGhlcmVmb3JlLCBvbmUgY291bGQgbmVzdCBDdXN0b21DYXRlZ29yaWVzIGludG8gbi1sZXZlbCBoaWVyYXJjaGllcy4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3IiBuYW1lPSJfY3VzdG9tQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NaT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NZLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMgXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyZ2NadWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiPgotICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBUYXNrIHNob3VsZCBiZSByZWxhdGVkIHRvIGV4YWN0bHkgb25lIERpc2NpcGxpbmUuICBGb3IgbGVnYWN5IHJlYXNvbnMgdGhpcyBpcyBub3QgZW5mb3JjZWQgKGUuZy4gR1MgTWV0aG9kIGRvZXMgbm90IGRlZmluZSBEaXNjaXBsaW5lcywgeWV0KS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiIG5hbWU9ImRpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjYmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjYk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQgXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIiBuYW1lPSJfZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIiBuYW1lPSJCYXNpY0VsZW1lbnRzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dzWjBTZWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjM2RDY2MDJGQiI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2RDY2MDJGQiIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3aE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRUY3Z2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVU1MMiBJbmZyYXN0cnVjdHVyZSIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjdndWZYRWR1cUhvT0piVVJaUnciIHg9IjQ0MTkiIHk9IjUxNiIgd2lkdGg9Ijg4MzkiIGhlaWdodD0iNzA5NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFRjdpZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN2p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN2tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN2t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdsT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFRjdodWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVGN2gtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0OTgiIHk9IjYzMzMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRUY3bWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDM2OCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjduT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3b2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3by1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3cE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRUY3bHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjdsLWZYRWR1cUhvT0piVVJaUnciIHg9IjUzODQiIHk9IjM1OTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRUY3cWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3c2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3dE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRUY3cHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjdwLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDk4IiB5PSI0NDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzamVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQc2tlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MTAiIGhlaWdodD0iMTU0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzanVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNqLWZYRWR1cUhvT0piVVJaUnciIHg9IjYyMTQiIHk9IjExMDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVBzcy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM1MiIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3V1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3ZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN2dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHNzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc3NlZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTI5NiIgeT0iMTIxNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVBzdy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3lPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3l1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN6dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHN3T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc3dlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzk3OSIgeT0iMTY0NDIiIHdpZHRoPSI0NTM4IiBoZWlnaHQ9IjE1NTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVBzOXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQcy0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc19lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc18tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRBZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHM4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQczlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA1NTciIHk9Ijk5MzkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVB0RC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRHdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHRET2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQdERlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYyOCIgeT0iMTM5NDQiIHdpZHRoPSI0NTU1IiBoZWlnaHQ9IjE0ODEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVkycy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjQ4OSIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ2dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFWTJzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMnNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE5MSIgeT0iMTEyMDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjIwMjAzMkEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVkydy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDA4MCIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ6dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFWTJ3T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxMiIgeT0iMTM0NDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVkyMC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMjJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMjNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIzdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFWTIwT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMjBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTUzNyIgeT0iNzk1OCIgd2lkdGg9IjQwNjQiIGhlaWdodD0iMTU1NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dzWjBTLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgbG93ZXN0IGxldmVsIHBhY2thZ2UgaW4gTWV0aG9kIENvcmUgZGVmaW5lcyB0aGUgY2xhc3MgTWV0aG9kIEVsZW1lbnQgZnJvbSB3aGljaCBhbGwgb3RoZXIgY2xhc3NlcyBkZWZpbmVkIGluIHRoZSBzcGVjaWZpY2F0aW9uIGFyZSBkZXJpdmVkIGZyb20uICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhLXN0cnVjdHVyZSBMaWJyYXJ5IGVsZW1lbnQgUGFja2FnZWFibGUgRWxlbWVudHMuICBUaGlzIHBhY2thZ2UgYWxzbyBkZWZpbmVzIGtleSBiYXNpYyBlbGVtZW50cyB1c2VkIHRvIGRlLWZpbmUgYW5kIHN0cnVjdHVyZSBtZXRob2QgY29udGVudCB0eXBlcy4gIEV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuIEEgTW9kZWwgRWxlbWVudCBpcyBwYXJ0IG9mIGEgbWV0aG9kIG1vZGVsIGFuZCBldmVyeSBtZXRob2QgbW9kZWwgcGFydCBpcyBhIE1ldGhvZCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRUY3dGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4QkQwMjhGIiBzb3VyY2U9Il9IRUY3aGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3cGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2dlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjd1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRUY3dHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFRjd0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MzMsIDAsIDEzOTddJFswLCAtMTQxMywgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzZ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVBzaE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY3MUIwM0E4IiBzb3VyY2U9Il9IRUY3cGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNpT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVBzaGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVQc2h1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyOTUsIC0yNTQsIDI5MjEsIDU1OF0kWy0yMDMyLCAtMzk3LCAyMTg0LCA0MTRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNpLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzak9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHNuZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhENDAyMTEiIHNvdXJjZT0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHNqZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc29lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHNudWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVQc24tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIC01MjQsIDAsIDE3MTBdJFs1MCwgLTE0NjQsIDAsIDc3MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc3BPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQc3B1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOTEyMDNDMCIgc291cmNlPSJfSEVGN3BlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQc2plZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzcXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQc3AtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHNxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MTEsIC01MjQsIDM0NTQsIDI1MjNdJFstMzExNSwgLTIyNzcsIDEwNDksIDc3MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc3JlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQc3otZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSIgc291cmNlPSJfSEVQc3YtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQc3YtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyIiB5PSI2MjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNyIgeT0iMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHMzZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzkiIHk9IjU2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHM0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTUwIiB5PSIzMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHM3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHM2LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHM4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHM3LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVBzME9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHMwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MTIsIDc3OCwgLTgxMiwgNzc4XSRbLTgxMiwgMTcxOCwgLTgxMiwgMTcxOF0kWy0zNjE1LCAxNzE4LCAtMzYxNSwgMTcxOF0kWy0zNjE1LCA4NCwgLTM2MTUsIDg0XSRbLTIyNjksIDg0LCAtMjI2OSwgODRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVB0QXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMjcwMTA2IiBzb3VyY2U9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3aGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Qi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdENPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHRCdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVB0QS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHRCT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjQzLCAtNTAzLCAwLCAzMjgwXSRbLTEyNDMsIC0zNDY2LCAwLCAzMTddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHRDZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVB0Q3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHRHLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0hFUHRDLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQdEgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHRJLWZYRWR1cUhvT0piVVJaUnciIHg9IjI0MiIgeT0iMzg5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Si1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQdEp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNCIgeT0iLTM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVB0S2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDYiIHk9IjE0MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MjEiIHk9Ii0yMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJmT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJnT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVB0SE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHRIZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ3NiwgNzE0LCA0MTI3LCAtMTgyNl0kWzQ3NiwgMjYxOSwgNDEyNywgNzldJFstMTQwMiwgMjYxOSwgMjI0OSwgNzldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkyZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBzb3VyY2U9Il9IRVB0Qy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJoLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM0IiB5PSItMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyanVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NTIiIHk9IjE3NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkya2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzkiIHk9Ii0xNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmxPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc0IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMm1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkybi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkycGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyby1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZMmhPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkyaGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjc3LCA1OSwgLTQ2NSwgNDIyNF0kWzQzMTgsIDU5LCAxNTc0LCA0MjI0XSRbNDMxOCwgLTM1ODksIDE1NzQsIDU3NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTJwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hFUHNyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHM4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkycWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMnF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTJwLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZMnFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDU3LCAtNTUwLCAtMTIxOSwgMTYzNF0kWzQ1NywgLTE2MDgsIC0xMjE5LCA1NzVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTJyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkycnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTIzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVDMzM0RjAxOTgiIHNvdXJjZT0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMjQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTI0T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZMjRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTc4NywgMCwgMzgzNV0kWzAsIC00MTA2LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTI1dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkyNS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTI2T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiIHNvdXJjZT0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJyLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMjdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyOC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTI5dWZYRWR1cUhvT0piVVJaUnciIHg9IjYiIHk9Ii0xNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyLWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjciIHk9IjEwOTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyX09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMl8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkzQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkzQU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTNCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTNCT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTNDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTNDT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkyNmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTI2dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDM4LCAxNTksIDE1OCwgLTI4MDRdJFstMjY5OSwgMTU5LCAtNTAzLCAtMjgwNF0kWy0yNjk5LCAyNDYwLCAtNTAzLCAtNTAzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZM0MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUFFMDJDRSIgc291cmNlPSJfSEVZMnItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkzRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZM0RPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkzRGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1NDEsIC01NzUsIC0xNTkxLCAyNDcyXSRbNTQxLCAtMjI3NywgLTE1OTEsIDc3MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZM0V1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTNFLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZM0ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgc291cmNlPSJfSEVQc3YtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkzR09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZM0ZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkzRnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4OTksIC03OTQsIC00MjQsIDc2OTldJFs4OTksIC03NzI2LCAtNDI0LCA3NjddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTNHLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzSE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTNIZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0hFUHM4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbmNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTNIdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZM0gtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwOTEsIDg0LCAyOTg4LCAxODYyXSRbLTM0MzcsIDg0LCAxNjQyLCAxODYyXSRbLTM0MzcsIC05OTksIDE2NDIsIDc3OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbmRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5kZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVpbmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMDA1ODNCMDFFNiIgc291cmNlPSJfSEVQdEMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5mT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRWluZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVpbmQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRWluZU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTcwMSwgLTczNiwgNjM1LCA1MjA3XSRbLTE3MDEsIC01MTczLCA2MzUsIDc3MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbmZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5mdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVpbmYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBDMDBBNiIgc291cmNlPSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnYtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5oZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRWluZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5pT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5oLWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5pZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5pdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjgyIiB5PSIxNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlua2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWlua09mWEVkdXFIb09KYlVSWlJ3IiB4PSI2ODIiIHk9Ii0yMDMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbmxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5sdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbm1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWlubmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWlubS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWlub2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWlubi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVpbmdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRWluZ2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzOCwgLTQ3NiwgMTkwNSwgLTU2ODhdJFstNTEwNywgLTQ3NiwgLTExNjQsIC01Njg4XSRbLTUxMDcsIDQ3MDksIC0xMTY0LCAtNTAzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVpbm91ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NjdBMDBEOSIgc291cmNlPSJfSEVZMnYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5xT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRWlucHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVpbm8tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRWlucE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjMyOCwgLTE1OSwgLTYwMzIsIDk4NjldJFstMjY3MSwgLTE1OSwgLTYzNzUsIDk4NjldJFstMjY3MSwgLTEwMTMzLCAtNjM3NSwgLTEwNV0kWzE3NDcsIC0xMDEzMywgLTE5NTcsIC0xMDVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5xZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWlucXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnFOWWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIj4KLSAgICAgICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfbm95VE1PeGdFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSIvPgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfYzZ0ZGtPeDVFZHU1LXZWamxmVnNmUSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBuYW1lPSJNZXRob2RFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTlotZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUMzMzRGMDE5OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1MCIgbmFtZT0iZ3VpZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnFOYS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDUwIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzY5QVdFZXlGRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzY5QVdFT3lGRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzh6VVhjT3lGRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDQ3IiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dycU5idWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNDciPgotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfUjhJWnNleUZFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfUjhJWnNPeUZFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfVEdDb0VPeUZFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDgiIG5hbWU9Im93bmVkUnVsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEUXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSIgbmFtZT0ibWV0aG9kRWxlbWVudFByb3BlcnR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0NTVFNjIwMjAzMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1RTY1MEMwMEE2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NaMFItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NaMFJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnpYVXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFZ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGMzIxOTAwMjkiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnpYV3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjMyMTkwMDI5Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzNVMTFNZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzNVMTFNT3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzNOc0VVT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIiBuYW1lPSJzZWN0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURTZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURTT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIG5hbWU9IlNlY3Rpb24iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnpYWGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk2MjVEMDIzNCIgbmFtZT0ic2VjdGlvbk5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3I5SVUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MjVEMDIzNCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX28xVlVJZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX28xVlVJT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX290YjhZT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRERjMwMDNBIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3I5SVZ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REYzMDAzQSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzVQVkw4ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzVQVkw4T3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzVIdXZJT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIiBuYW1lPSJzdWJTZWN0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURVdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiIG5hbWU9IkNvbnN0cmFpbnQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJV2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1QUUwMkNFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QThBMUYwMkYzIiBuYW1lPSJib2R5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyOUlYZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOEExRjAyRjMiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il84cGlUNGV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il84cGlUNE95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il84Z2NwVU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc0c1VXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyNzAxMDYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY5QUI5ODAyQjkiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NHNVYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjlBQjk4MDJCOSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzRYd0xFZXlGRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzRYd0xFT3lGRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzVzWkN3T3lGRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1owUS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1owUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTYyMDIwMzJBIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NjdBMDBEOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NUM4MDIxOCIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2R5cjdnZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2R5cjdnT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2RuemhNT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCBfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NHNVhlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIEVsZW1lbnQgY2FuIG93biBtYW55IENvbnN0cmFpbnRzIGRlZmluaW5nIHJ1bGVzIGZvciB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCBfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NRRFJlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29udGVudCBEZXNjcmlwdGlvbiBjYW4gb3B0aW9uYWxseSBiZSBzdHJ1Y3R1cmUgaW50byBTZWN0aW9ucy4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlIHRvIGRlY29tcG9zZWQgU2VjdGlvbiBpbnRvIGEgaGllcmFyY2h5IG9mIFNlY3Rpb25zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyIgbmFtZT0iX2NvbnRlbnREZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFRPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIF8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc1FEVHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+U2VjdGlvbnMgY2FuIGJlIGZ1cnRoZXIgZGVjb21wb3NlZCBpbnRvIG4gbGV2ZWxzIG9mIHN1Yi1zZWN0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEVmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEVk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIF8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc1FEVi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZXNjcmliYWJsZSBFbGVtZW50IGNhbiBjb250YWluIGEgQ29udGVudCBEZXNjcmlwdGlvbiBlbGVtZW50IHRoYXQgc3RvcmVzIHRleHR1YWwgZGVzY3JpcHRpb25zIGZvciB0aGlzIENvbnRlbnQgRWxlbWVudC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgcmVmaW5lZCB3aXRoIHN1Yi1jbGFzc2VzIGFkZGluZyBtb3JlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMuICBBbnkgb2YgdGhlc2Ugc3ViLXR5cGVzIGNhbiBiZSByZWxhdGVkIHRvIGEgQ29udGVudCBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSIgbmFtZT0iX2Rlc2NyaWJhYmxlRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NaMFFPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFd1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwQzAwQTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSBfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciIG5hbWU9Il9tZXRob2RFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTVFNjUwQzAwQTYiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiIG5hbWU9IkNvcmVDb250ZW50RWxlbWVudHMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3RUTU0tZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNDhEREMwMkM3Ij4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNDhEREMwMkM3IiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFaW5yLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5zLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbnRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW50ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbnR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ljT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ljdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1ljLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFaW5yT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbnJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcyMzkiIHk9Ijg1NjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lkT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZZU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1llLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZZy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZZGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lkdWZYRWR1cUhvT0piVVJaUnciIHg9IjYwODYiIHk9Ijc4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1loLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1lpT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lrLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1loZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWWh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU4OCIgeT0iMTExNTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZbU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTgyOCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ltdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1luT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWW5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ludWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWW4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWW9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1lsZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWWx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE0NDMiIHk9IjExMTUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWXFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWXBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZcHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzA1MCIgeT0iODU1OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1l1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDMyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWXRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzIyNiIgeT0iMTExNTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZeU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjQ1NSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1kwLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1l4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWXh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE0NDgiIHk9Ijg1NjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZMk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1kzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1kzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1k0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZNC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZMWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1kxdWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTEiIHk9Ijg1NTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lfLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNaQS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1pDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1pDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1pET2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaRHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNaQU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1pBZWZYRWR1cUhvT0piVVJaUnciIHg9IjExODgyIiB5PSI1OTc3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpYS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEUxaWItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWV1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEUxaWJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpYmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDE1IiB5PSI1OTY2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEUxaWYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWl1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEUxaWZPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpZmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODMiIHk9IjMzNjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpbU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY1OCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWltdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWluT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaW5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWludWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaW4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaW9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWlsZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5MyIgeT0iMzM4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFMWl1dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaXYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaXctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl4ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWl0LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaXVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE0MzciIHk9IjMzNjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdFRNTmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIENvcmUgQ29udGVudCBFbGVtZW50cyBwYWNrYWdlIGRlZmluZXMgdGhlIGNvcmUgZWxlbWVudHMgb2YgZXZlcnkgbWV0aG9kIHN1Y2ggYXMgcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cy4gIFRoaXMgZGlhZ3JhbSBzaG93cyBhIHRheG9ub215IG9mIHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIHRoaXMgcGFja2FnZS4gIEFsbCBDb3JlIENvbnRlbnQgRWxlbWVudHMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBTdGVwLCBhcmUgZGVyaXZlZCBmcm9tIENvbnRlbnQgRWxlbWVudC4gIFN0ZXAgaXMgbm90IGEgQ29udGVudCBFbGVtZW50LCBiZWNhdXNlIGl0IGlzIGRlZmluZWQgYXMgYSBzcGVjaWFsIFNlY3Rpb24gd2hpY2ggd2FzIGRlZmluZWQgaW4gdGhlIGxhc3QgU2VjdGlvbiBhcyBhIHBhcnQgb2YgQ29udGVudCBEZXNjcmlwdGlvbi4gIEluIG90aGVyIHdvcmRzLCBTdGVwIGFscmVhZHkgaXMgYSBkZXNjcmlwdGlvbiBmb3IgY29udGVudCBhbmQgdGhlcmUgZG9lcyBub3QgcmVxdWlyZSBiZWluZyBhIENvbnRlbnQgRWxlbWVudCB3aXRoIGl0cyBvd24gQ29udGVudCBEZXNjcmlwdGlvbiBwYXJ0LiAgU3RlcCBhbmQgVGFzayBhcmUgZGVyaXZlZCBmcm9tIGEgbmV3IGFic3RyYWN0aW9uIGludHJvZHVjZWQgaW4gdGhpcyBwYWNrYWdlIGNhbGwgV29yayBEZWZpbml0aW9uLCB3aGljaCByZXByZXNlbnRzIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciB1bml0cyBvZiB3b3JrLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNZNU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDBGIiBzb3VyY2U9Il9IRXNZaE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1k2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNZNWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWTV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC01ODIyLCAyMDkwXSRbNTgyMCwgLTIwOTEsIC0xLCA1MDJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1k2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZN09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1k3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNEEiIHNvdXJjZT0iX0hFc1lsT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZOC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1k3dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNZNy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTEsIDIwOTBdJFstMSwgLTIwOTEsIC0xLCA1MDJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1k5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZOWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1k5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIHNvdXJjZT0iX0hFc1l0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ktLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWS11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1k5LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNZLU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTAzLCA1ODIwLCAyMDkwXSRbLTU4MjEsIC0yMDkxLCAtMSwgNTAyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZX2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWV91ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNaRC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTFEIiBzb3VyY2U9Il9IRWlucS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1pFLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNaRU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWkVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgNTgwNywgMjA5MF0kWy01ODIxLCAtMjA5MCwgLTE0LCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1pGdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaRi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1pHT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDciIHNvdXJjZT0iX0hFc1lwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lfLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWkhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1pHZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNaR3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTAzLCAxMTYyOCwgMjA5MF0kWy0xMTY0MiwgLTIwOTAsIC0xNCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaSC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWklPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNaSWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBzb3VyY2U9Il9IRXNZMU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1pKZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNaSXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWkktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC01ODM1LCAyMDkwXSRbNTgyMCwgLTIwOTAsIC0xNCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpWU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaVllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpWXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0Q5IiBzb3VyY2U9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWladWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpWS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaVpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC0xNCwgMjA5MF0kWy0xLCAtMjA5MCwgLTE0LCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlhZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpYXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWlpLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODMwRTAxNTAiIHNvdXJjZT0iX0hFMWlhLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFMWllLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpa2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWlqT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpamVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgMjE0MywgMjA5MF0kWy0yMTQ0LCAtMjA5MCwgMCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpa3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaWstZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpcE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9IRXNZMU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpbE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpcGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaXB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC0xLCA0NjgzXSRbLTEsIC00NjgzLCAtMSwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpcS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpcmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBzb3VyY2U9Il9IRTFpYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpbE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpcnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaXItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC0zMTc2LCAyMDkwXSRbMzE3NCwgLTIwOTAsIC0xLCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWl0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpdGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWl4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hFc1lfLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFMWl0dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaXl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWl4LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpeU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQsIC01MDMsIDIyNCwgMjA5MF0kWy0yNTIsIC0yMDkwLCAtMTQsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWl6dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgc291cmNlPSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWWRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaTBPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWkwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAwLCAyMDkwXSRbLTEsIC0yMDkwLCAwLCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWkxdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWkyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIHNvdXJjZT0iX0hFMWllLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lkT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaTNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWkyZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpMnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTAzLCAtNTMxOCwgMjA5MF0kWzUzMTgsIC0yMDkwLCAwLCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWkzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWk0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0hFMWl0dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lkT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWk1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaTVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWk0dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaTQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0LCAtNTAzLCA1NTgzLCAyMDkwXSRbLTU1OTcsIC0yMDkwLCAwLCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWk2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpNmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM3MEEzMDE1MiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNDhEREMwMkM3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVFktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UWWVmWEVkdXFIb09KYlVSWlJ3IiB1bmRlcmxpbmU9InRydWUiIGRlc2NyaXB0aW9uPSJDbGFzcyBEaWFncmFtOiBDb3JlQ29udGVudEVsZW1lbnRzIC8gVGF4b25vbXkiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RZdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMTYiIHk9IjEzNjA1IiB3aWR0aD0iNDMwOCIgaGVpZ2h0PSIxMTM0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEyRUQyMTMwMzJCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RhZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UWnVmWEVkdXFIb09KYlVSWlJ3IiB1bmRlcmxpbmU9InRydWUiIGRlc2NyaXB0aW9uPSJDbGFzcyBEaWFncmFtOiBDb3JlQ29udGVudEVsZW1lbnRzIC8gV29ya1Byb2R1Y3RzIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ5IiB5PSIxMjA5MCIgd2lkdGg9IjQxNTMiIGhlaWdodD0iMTEyNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UYS1mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJ7Um9sZS5tb2RpZmllcyA9IFJvbGUucGVyZm9ybXMub3V0cHV0fSYjeEE7a2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFJVUCYjeEE7IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVGJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTAyOSIgeT0iMTA1MTUiIHdpZHRoPSI2OTA4IiBoZWlnaHQ9IjExMjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRV9UYy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RldWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RmdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFX1RjT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVGNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxOCIgeT0iOTY1IiB3aWR0aD0iMzM5NSIgaGVpZ2h0PSIyNjUwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVfVGctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UaXVmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RqT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UanVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UZ09mWEVkdXFIb09KYlVSWlJ3IiBpdGFsaWM9InRydWUiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVGdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc3NTQiIHk9IjgwNzciIHdpZHRoPSIzNzA4IiBoZWlnaHQ9IjIwNDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRkpFWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkViZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRkpFWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkVZdWZYRWR1cUhvT0piVVJaUnciIHg9IjI0MDUzIiB5PSIxMzgwIiB3aWR0aD0iMjE4NCIgaGVpZ2h0PSIxNjE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZKRWRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFZS1mWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFZi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRkpFY2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkVjdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3ODQ3IiB5PSIxMDY2IiB3aWR0aD0iMzMxOCIgaGVpZ2h0PSIyMzQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RjV0VlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxNZXRob2QgY29udGVudCBpcyBmdW5kYW1lbnRhbGx5IGRlc2NyaWJlZCBieSBkZWZpbmluZyBUYXNrcyBkZXNjcmliZWQgd2l0aCBTdGVwcyB0aGF0IGhhdmUgV29yayBQcm9kdWN0cyBhcyBpbnB1dCBhbmQgb3V0cHV0IGFuZCB3aGljaCBhcmUgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgVGhlIGRpYWdyYW0gZGVwaWN0cyB0aGVzZSBjb3JlIGVsZW1lbnRzIHdpdGggdGhlaXIgcmVsYXRpb25zaGlwcy4gIFRoZSByZWxhdGlvbnNoaXBzIGFyZSBsYWJlbGVkIHdpdGggYSAmcXVvdDtEZWZhdWx0XyZxdW90OyBwcmVmaXgsIGJlY2F1c2UgdGhleSBkZXNjcmliZSB0aGUgJ3N0YW5kYXJkJyBvciAnbm9ybWFsJyB3YXkgb2YgcGVyZm9ybWluZyB0aGUgbWV0aG9kIGRlc2NyaWJlZDsgaS5lLiBkb2luZyB0aGUgd29yayB1bmRlciAnbm9ybWFsJyBjaXJjdW1zdGFuY2VzLCB3aXRoICdub3JtYWwnIGJlaW5nIHdoYXQgdGhlIG1ldGhvZCBhdXRob3IgcGVyY2VpdmVzIGFzIHRoZSBtb3N0IGdlbmVyYWwgY2FzZS4gIEhvd2V2ZXIsIGRpZmZlcmVudCBwcm9jZXNzZXMgd291bGQgYXBwbHkgdGhlc2UgZWxlbWVudHMgaW4gZGlmZmVyZW50IHBhcnRzIG9mIGEgbGlmZWN5Y2xlIGRpZmZlcmVudGx5IGFuZCB0aGVuIG5lZWQgdG8gZGVmaW5lIGNoYW5nZXMgb24gdGhlc2UgcmVsYXRpb25zaGlwcy4gIEZvciBleGFtcGxlLCBpZiBhIFRhc2sgaXMgcGVyZm9ybWVkIGluIG1vcmUgdGhlbiBvbmUgaXRlcmF0aW9uIG9mIGFuIGl0ZXJhdGl2ZSBsaWZlY3ljbGUgbW9kZWwgZGlmZmVyZW50IFJvbGVzIGNvdWxkIGJlIGFkZGVkIHRvIChvciByZW1vdmVkIGZyb20pIHBlcmZvcm1pbmcgdGhlIFRhc2sgYXMgd2VsbCBhcyBkaWZmZXJlbnQgaW5wdXRzIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lLiAgU3VjaCBjaGFuZ2VzIHdvdWxkIGJlIGRlZmluZWQgb24gcHJvY2VzcyBzcGVjaWZpYyBEZXNjcmlwdG9ycyB0aGF0IHJlZmVyZW5jZSBhbmQgaGF2ZSBiZWVuIGRlZmluZWQgYmFzZWQgb24gdGhlc2UgY29yZSBjb250ZW50IGVsZW1lbnRzIChzZWUgUHJvY2VzcyBmb3IgbW9yZSBkZXRhaWxzKS4mI3hBOyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRV9Uai1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1IiBzb3VyY2U9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVGstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MiIgeT0iMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVGwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3NjEiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVG11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4MzkiIHk9Ii0zMTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVG5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUyNSIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVG9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjU2OCIgeT0iLTEyNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ub3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Uby1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UcWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RxLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Uc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RyLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRV9Ua09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFX1RrZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODU0LCA2NTEsIDEzODQzLCA3NDU5XSRbLTE2MjY0LCA2NTEsIC01NjcsIDc0NTldJFstMTYyNjQsIC01NDg2LCAtNTY3LCAxMzIwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVfVHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hFX1RhdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RqLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRV9Ucy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVfVHRPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQyMywgLTU2NywgNTg0LCA3NjJdJFstMTAwNywgLTEzMjksIDAsIDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFX1R0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRV9UdHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFX1R0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiIHNvdXJjZT0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UdS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzM5IiB5PSIyODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ud09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Udi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjQzNyIgeT0iMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Ud3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjkzIiB5PSItMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTAiIHk9Ii0zMjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjE4IiB5PSIxNzk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVDBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UMWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVDJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UMS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVfVHVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRV9UdWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg1NCwgLTIxMSwgMTM4NDMsIDY1OTVdJFstMTQ3OTEsIC0yMTEsIDkwNSwgNjU5NV0kWy0xNDc5MSwgLTU0ODYsIDkwNSwgMTMyMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkVnT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiIHNvdXJjZT0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFaE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NiIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0MzgiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4MiIgeT0iLTI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFanVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjIxIiB5PSIyODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzUiIHk9Ii0zMjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFbU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVuT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVvT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRkpFZ2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGSkVndWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNjU5LCA2NjAsIDEzOTM2LCA2MDldJFstMTM5MDIsIDY2MCwgMTY5MywgNjA5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZKRW8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyIgc291cmNlPSJfSEVfVGItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkVwLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDgiIHk9Ii0yNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMxMiIgeT0iLTI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU0MSIgeT0iMzEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVzZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NTciIHk9Ii0xOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjIiIHk9IjMxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkV1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkV2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRXhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGSkVwT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZKRXBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY5MywgLTc3MCwgLTEzOTAyLCAtNzE5XSRbMTM5MzYsIC03NzAsIC0xNjU5LCAtNzE5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZKRXh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkV5dWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NzUiIHk9IjIxMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFenVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjM3IiB5PSItMjgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzgwIiB5PSIxNTIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjU2OSIgeT0iLTI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUxLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDc5IiB5PSIxNjQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRTNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRTRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFNU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFNHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFNk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRXgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGSkV5T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYyNiwgLTEwMjQsIDcyOCwgNTgzM10kWzIyODYsIC0zNjk5LCAyMzg3LCAzMTU4XSRbNzc4LCAtNTY4OSwgODgwLCAxMTY4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZKRTZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkU3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NzEiIHk9Ii0xNDYwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRThlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3MyIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzYiIHk9Ii03NzMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTktZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjcyIiB5PSIzMDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFLXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzg1IiB5PSItMTA2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkZBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkZBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRkItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRkJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRkMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRkNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGSkU2dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRkpFNi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODcyLCAtMTAyNCwgLTc3MCwgNTgzM10kWy0zMTE1LCAtMzY5OSwgLTMwMTQsIDMxNThdJFstMTIzNiwgLTU2ODksIC0xMTM0LCAxMTY4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZTT1VPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSIgc291cmNlPSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGU09WT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00NyIgeT0iLTEyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09XZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09XT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTYiIHk9Ii0yNzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09XLWZYRWR1cUhvT0piVVJaUnciIHg9IjI4MCIgeT0iLTI1MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09YZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPWHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTYiIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPWWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTYwIiB5PSItMTY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT1p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPYnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPYk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPY09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZTT1VlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRlNPVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQsIDExNjgsIC0xODYsIC01Njg5XSRbLTg0LCA1ODMzLCAtMTg2LCAtMTAyNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGU09jLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09lT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZTT2QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09mLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09nZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NiIgeT0iMzIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2hPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM3MSIgeT0iLTMwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09pT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09pZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09oLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09qZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09pLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2tlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2otZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2xlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2stZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGU09kT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZTT2RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY1OSwgLTUwLCAtMzk3OSwgMF0kWzQ1NDYsIC01MCwgLTEwOTIsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTBBRUVDNjAwQ0EiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdHJ1Y3R1cmUgKHNpbXBsaWZpZWQpIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09sdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRlNPbXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT20tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09uZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09uLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09vZWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09vdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT28tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09wT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09wZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGU09sLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZTT21PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUxNSIgeT0iOTE0IiB3aWR0aD0iMzE3NSIgaGVpZ2h0PSIyNjQxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZiX1ZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfVy1mWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9YZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRmJfVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl9VdWZYRWR1cUhvT0piVVJaUnciIHg9IjExNDcyIiB5PSI5MTQiIHdpZHRoPSI1OTA5IiBoZWlnaHQ9IjI2NDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmJfcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9yZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9yLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9zZWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9zdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX3MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl90T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl90ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGYl9wLWZYRWR1cUhvT0piVVJaUnciIGl0YWxpYz0idHJ1ZSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQ3MiIgeT0iNTQxMCIgd2lkdGg9IjU5MDkiIGhlaWdodD0iMjU5MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0Y1dFLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIG92ZXJ2aWV3IHRvIHRoZSBjb3JlIGNvbnRlbnQgc3RydWN0dXJlIG5vdCBzaG93aW5nIGF0dHJpYnV0ZXMgYW5kIG9ubHkgdGhlIG1vc3QgaW1wb3J0YW50IGFzc29jaWF0aW9ucyBhcyB3ZWxsIGFzIG9taXR0aW5nIGFzc29jaWF0aW9uIHJvbGUgbmFtZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGYl9ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiIHNvdXJjZT0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGU09sdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzciIHk9IjI3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9hT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODEiIHk9IjIyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9hLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9iLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTQ3IiB5PSIyMjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9kdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9kT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9ldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX2Z1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2ZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9mLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX2d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGYl9ZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZiX1l1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI5NTQsIC02NzcsIDgzNzMsIC02NzddJFstOTc0NSwgLTY3NywgMTU4MywgLTY3N10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGYl9nLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiIHNvdXJjZT0iX0hGU09sdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9pT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfaC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjYiIHk9Ii0zMTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjA0IiB5PSItMjIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjUiIHk9Ii0xNzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2xPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9sdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9sLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9uZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9tLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX29lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX24tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9vdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX3BlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX28tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGYl9oT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZiX2hlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTU4MywgMzgxLCAtOTc0NSwgMzgxXSRbODM3MywgMzgxLCAtMjk1NCwgMzgxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiX3R1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSIgc291cmNlPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZTT2x1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl91ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl92T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl91dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTk3IiB5PSItMzgxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1ODEiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl93dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfd2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl94T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzNDYiIHk9Ii0zOTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl95ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl95LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl96T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl95dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl96LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8wT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl96dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGYl90LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZiX3VPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI5NTQsIC04LCA4MzczLCA0NDYxXSRbLTEyMjg1LCAtOCwgLTk1NiwgNDQ2MV0kWy0xMjI4NSwgLTMxNDksIC05NTYsIDEzMjBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmJfMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIiBzb3VyY2U9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiXzNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4MyIgeT0iODQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2OCIgeT0iLTIzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl80LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl81T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl82T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODMiIHk9Ii0xMzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl83T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl83dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl83LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl83ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl84dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl84LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl84ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXy0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXy1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGYl8ydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZiXzItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY3LCAtMTI5NSwgLTY3LCAzMTc1XSRbLTY3LCAtMzE0OSwgLTY3LCAxMzIwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZsSlFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiIgc291cmNlPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpST2ZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSItMTU2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpTT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTQiIHk9IjE0MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpTLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTMiIHk9IjE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSlZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSld1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSldPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKWHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKWU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZsSlFlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmxKUXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjE3NSwgLTEyOTUsIC0yMTc1LCAzMTc1XSRbLTIxNzUsIC0zMTU4LCAtMjE3NSwgMTMxMl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGbEpZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiIHNvdXJjZT0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEphT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTY0IiB5PSItMjI0NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEphdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEphLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NCIgeT0iMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDUiIHk9IjExMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZsSlpPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmxKWmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxOTQ3LCAxMzEyLCAxOTQ3LCAtMzE1OF0kWzE5NDcsIDMxNzUsIDE5NDcsIC0xMjk1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEyRUQyMTMwMzJCIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmxKaXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKa09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEprZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKa3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEprLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKbGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRmxKaC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEppT2ZYRWR1cUhvT0piVVJaUnciIHg9IjgxMjgiIHk9IjM5MjAiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjIwMTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmxKbXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRmxKbC1mWEVkdXFIb09KYlVSWlJ3IiBpdGFsaWM9InRydWUiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSm1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEyOCIgeT0iODIxIiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIyMDE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZsSnMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEp0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2UU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2UXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2Uk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2UnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZsSnNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjU5OCIgeT0iMzkyMCIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMjAxNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGdTZlZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NmZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZmLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NmdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1Nmd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZoT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGdTZkdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NmQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzcwOCIgeT0iMzkyMCIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMjAxNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0Y1dGZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJBIHNpbXBsaWZpZWQgb3ZlcnZpZXcgdG8gV29yayBQcm9kdWN0cy4gV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIEFydGlmYWN0cywgT3V0Y29tZXMsIGFuZCBEZWxpdmVyYWJsZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGbEpwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNEEiIHNvdXJjZT0iX0hGbEpodWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSnF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGbEpwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmxKcU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtMTAxNiwgMCwgMjA4Ml0kWzAsIC0yMDkxLCAwLCAxMDA3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRmxKcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZsSnJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2U2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIiBzb3VyY2U9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKci1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NlRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzMyIgeT0iMTA1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZVZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTkiIHk9IjIzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA1MyIgeT0iLTI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2Vi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzciIHk9Ii00NTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2V2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nld1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzIiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2WHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2WC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2WGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2WS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2WWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZaLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZaZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2YXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZhZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2U3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGdTZTLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE5MzAsIDQyLCAtMjU0MCwgLTMwNTZdJFs0MDg5LCA0MiwgLTM4MSwgLTMwNTZdJFs0MDg5LCAyMDkxLCAtMzgxLCAtMTAwN10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGdTZiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIHNvdXJjZT0iX0hGbEpyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Yi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Y3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NmNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGdTZiZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRnU2YnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQ1NiwgLTEwMTYsIDMwMTQsIDIwODJdJFstMzAwNSwgLTIwOTEsIDE0NjQsIDEwMDddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGdTZjLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRnU2ZE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGdTZoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiIHNvdXJjZT0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2aWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgiIHk9Ii0yNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2anVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2amVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzU5IiB5PSIyODIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZrT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01OSIgeT0iLTMxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2ay1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDAxIiB5PSI3NjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2bHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDEzIiB5PSI3MzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2bS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2bWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2bi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2bmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZvZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2cE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2cHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2aHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGdTZoLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MCwgMTAwNywgNjYwLCAxMDA3XSRbNjYwLCAyNTU2LCA2NjAsIDI1NTZdJFstMzg2OSwgMjU1NiwgLTM4NjksIDI1NTZdJFstMzg2OSwgMjIwLCAtMzg2OSwgMjIwXSRbLTE5MzAsIDIyMCwgLTE5MzAsIDIyMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGdTZxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMEYiIHNvdXJjZT0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2cnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NnJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGdTZxZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRnU2cXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDIyLCAtMTAxNiwgLTI5OTcsIDIwODJdJFsyOTYzLCAtMjA5MSwgLTE0NTYsIDEwMDddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGdTZyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRnU2c09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4NjI3MDFBNiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRhc2tzQW5kU3RlcHMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGNHJST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJRZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0clF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjU5MCIgeT0iNTE5OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGNHJWT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cldlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJYLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJVZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0clV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5NzAiIHk9IjUxNTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJnLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRyaC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJqT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRya2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRya3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyaE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJoZWZYRWR1cUhvT0piVVJaUnciIHg9IjExNTEiIHk9IjI5ODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJrLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRybC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY1OCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cm5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJuZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cm51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cm9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJvZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJvdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJsT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cmxlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE1NCIgeT0iNjc2NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGNHJwLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJzdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJwT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cnBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM0ODciIHk9Ijc0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cjF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHQjFNZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDAzIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMU51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMU9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMU91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFQT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHIxLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cjJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQ0MiIgeT0iNzQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdCMVpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR0IxWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFZdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc0NSIgeT0iODgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RjV0YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRjRyWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9IRjRyUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyVU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJaT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDEiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYwIiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItODEiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJmT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJnT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRjRyWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGNHJZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc2MiwgLTY3LCAtMTA2MTcsIC0xNl0kWzEwNjE3LCAtNjcsIC03NjIsIC0xNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGNHJzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIHNvdXJjZT0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cnQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NjIiIHk9IjI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ2dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNjAiIHk9Ii0zMzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxMiIgeT0iNDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc2IiB5PSItMzMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cngtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyei1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyMWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEY0cnRPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRjRydGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzk3LCAxNjksIDEzOTcsIDE2OV0kWzI1NzMsIDE2OSwgMjU3MywgMTY5XSRbMjU3MywgMTQ4MSwgMjU3MywgMTQ4MV0kWzU0MSwgMTQ4MSwgNTQxLCAxNDgxXSRbNTQxLCA1MjQsIDU0MSwgNTI0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMVBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgc291cmNlPSJfSEY0cjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAwIiB5PSItMTk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNSIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxUy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMiIgeT0iLTE0NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFUdWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjUiIHk9IjIyMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMVctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMVgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFQdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMVAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTkwNSwgMTA2LCAtMzE0OSwgMTA2XSRbNDEyOCwgMTA2LCAtOTI2LCAxMDZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0IxY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBzb3VyY2U9Il9IRjRyMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0IxWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDUiIHk9IjE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzcyIiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFmdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjEiIHk9IjE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFoT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFpdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFpT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFjZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMWN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MDEsIDUwLCA0OTAyLCAtNTBdJFstNDgwOSwgNTAsIDE3OTQsIC01MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFrLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIHNvdXJjZT0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFsT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMWxlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI1LCAtNDkxLCAtMjUsIDE2OTNdJFstMjUsIC0xNjU5LCAtMjUsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMW11ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFtLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMW5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfSEY0clFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cmstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0Ixb09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMW5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFudWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc2MiwgMTg2LCAtNTEzMCwgLTEzMzddJFs0NTU1LCAxMTY4LCAtMTMzNywgLTM1NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMW8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMXBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSEY0cmctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdCMVlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMXB1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxcC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNSwgLTUyNCwgNzYsIDE2MDhdJFsyNSwgLTE2NDIsIDc2LCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODMwRTAxNTAiIHNvdXJjZT0iX0hGNHJVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFyLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMXNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjExLCAtNDgyLCAtNzAyLCAzODg2XSRbMjExLCAtMzg0MywgLTcwMiwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxdGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0IxdC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBzb3VyY2U9Il9IRjRyVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjF1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxdU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMXVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc3MCwgMjAzLCA0NzE1LCAtMTM3MV0kWy00MTU3LCAxMTc2LCAxMzI5LCAtMzk3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxdnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODU0RDAyQkYiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdMbU5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1OZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1PZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1PLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1QZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtUC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR0xtTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHTG1NdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOTcyIiB5PSI5NDgiIHdpZHRoPSIyODUzIiBoZWlnaHQ9IjIyNjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR0xtUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1TdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1UT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1UdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1ULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHTG1RZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdMbVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg0MSIgeT0iODk3IiB3aWR0aD0iMzM2NCIgaGVpZ2h0PSIyMjY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdlaFotZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoYk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoYnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoY09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdlaFpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoWmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTAyIiB5PSI0NzU1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdlaGdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TSmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TSi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0tlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdlaGZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzA2IiB5PSI0NzU1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RtSEVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0xtVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIiBzb3VyY2U9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtTU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaElPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHZWhJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaEplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaEtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoSy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTciIHk9IjI3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhMdWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MjYiIHk9Ii0yNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoTi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhPZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhQZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0xtVWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHTG1VdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0MzAsIC01NzUsIC02MTg5LCAtNjI2XSRbNjE5NywgLTU3NSwgLTE0MjIsIC02MjZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR2VoUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIiBzb3VyY2U9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtTU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHZWhST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODIiIHk9IjMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhVZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NzYiIHk9Ii0yMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoV3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhYT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhZT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR2VoUWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHZWhRdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2NjcsIDYwOSwgLTYxOTEsIDU1Nl0kWzY0MjksIDYwOSwgLTE0MjksIDU1Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHZWhjLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIHNvdXJjZT0iX0hHZWhZLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaGQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHZWhkT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR2VoZGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjIsIC00NTcsIC0xOTIxLCAzMjUxXSRbMTUwNywgLTI1NzMsIC02NzcsIDExMzRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHZWhldWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR2VoZS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHb1NLdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0hHZWhZLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHZWhmT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdvU0x1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TTmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjMiIHk9Ii0yOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU09PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxMCIgeT0iMjU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU08tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU3NyIgeT0iLTI4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NQdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NRdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1NPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU1J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU1N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHb1NLLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdvU0xPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjYxLCA1MywgLTMxNzUsIDUzXSRbMzEyMiwgNTMsIC03MTQsIDUzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdvU1RlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgc291cmNlPSJfSEdlaGZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR29TVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdvU1R1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHb1NULWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjIsIC00NTcsIDE4MjAsIDMyNTFdJFstMTQ0NywgLTI1NzMsIDYzNSwgMTEzNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdvU1ZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHb1NWZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzWjBUZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiPgotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9DcjZmSU94ZEVkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIG5hbWU9IlJvbGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc1owVk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwNyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCIgbmFtZT0ibW9kaWZpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FLT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FNZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIG5hbWU9IlRhc2siPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc2ktTS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5IiBuYW1lPSJwZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdOLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4IiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdRLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnVE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xT3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJOdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJOZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIiBuYW1lPSJzdGVwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4IiBpc0Rlcml2ZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RUTUktZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RUTUl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgbmFtZT0iV29ya1Byb2R1Y3QiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc2ktT09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzRDkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIgbmFtZT0iR3VpZGFuY2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc2ktUE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIj4KLSAgICAgICAgICAgICAgPGJvZHk+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTFEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiIG5hbWU9IkFydGlmYWN0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLVFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiI+Ci0gICAgICAgICAgICAgIDxib2R5PkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMEYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYkpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYkktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJKLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Nzdk0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyQyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYk1PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYkwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4RiIgbmFtZT0iT3V0Y29tZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZOLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPgotICAgICAgICAgICAgICA8Ym9keT5BbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiIG5hbWU9IlN0ZXAiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc3N2Ty1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuCi1BIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODMwRTAxNTAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIgbmFtZT0iV29ya0RlZmluaXRpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc3N2UU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgPGJvZHk+V29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiIG5hbWU9InByZWNvbmRpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0VE1LdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0VE1LZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RUTU1lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RUTU1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCIgbmFtZT0iRGVmYXVsdF9QcmltYXJ5UGVyZm9ybWVyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzMmdNLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiPgotICAgICAgICAgICAgICA8Ym9keT5Sb2xlcyBjYW4gYmUgZGVmaW5lZCB0byBwZXJmb3JtIG1hbnkgVGFza3MsIGJ1dCBldmVyeSBUYXNrIG1heSBoYXZlIG9ubHkgb25lIFJvbGUgdGhhdCBpcyBieSBkZWZhdWx0IHRoZSBwcmltYXJ5IHBlcmZvcm1lciBvZiB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIiBuYW1lPSJwZXJmb3JtcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdPdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdPZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiIG5hbWU9IkRlZmF1bHRfTWFuZGF0b3J5SW5wdXRzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzMmdQT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgbWFuZGF0b3J5IGlucHV0cyBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ1FPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ1AtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiIgbmFtZT0iRGVmYXVsdF9PdXRwdXRzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzMmdSZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3V0cHV0cyBvZiB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIiBuYW1lPSJvdXRwdXRGcm9tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ1NlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ1NPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSIgbmFtZT0iRGVmYXVsdF9Nb2RpZmllcyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2IF8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzX3FJZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmFjdCB0aGF0IFJvbGVzIHBlcmZvcm0gVGFza3MgdGhhdCBoYXZlIFdvcmsgUHJvZHVjdHMgb2YgdGhhdCBwYXJ0aWN1bGFyIHR5cGUgYXMgb3V0cHV0cy4gIC9tb2RpZmllcyBwcm92aWRlcyBhbGwgdGhlIHR5cGVzIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCB0aGUgUm9sZSBwcm9kdWNlcyBvciBtb2RpZmllcyB2aWEgb25lIG9mIHRoZSBUYXNrcyBkZWZpbmVkIHRvIGJlIHBlcmZvcm1lZCBieSB0aGUgUm9sZSwgZWl0aGVyIGFzIHByaW1hcnkgb3IgYWRkaXRpb25hbCBwZXJmb3JtZXIuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2IiBuYW1lPSJtb2RpZmllZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xSmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5IiBuYW1lPSJEZWZhdWx0X1Jlc3BvbnNpYmxlIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEgXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzX3FLdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiPgotICAgICAgICAgICAgICA8Ym9keT5SZXNwb25zaWJpbGl0eSBmb3IgYSB3b3JrIHByb2R1Y3QgaW5kaWNhdGVzIHRoZSByb2xlJ3Mgb3duZXJzaGlwIG9mIGFsbCBpbnN0YW5jZXMgb2YgdGhpcyB3b3JrIHByb2R1Y3QgdHlwZS4gIEZvciBleGFtcGxlLCB0aGUgcm9sZSByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QgYW5zd2VycyB0byBtYW5hZ2VtZW50IGFib3V0IGl0cyBxdWFsaXR5IHN0YXRlLiAgQmVpbmcgcmVzcG9uc2libGUgZm9yIHRoZSB3b3JrIHByb2R1Y3QgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSByb2xlIGlzIHRoZSBvbmx5IG9uZSBtb2RpZnlpbmcgaXQsIGJ1dCBtYWtlcyB1bHRpbWF0ZSBkZWNpc2lvbnMgYWJvdXQgYWNjZXB0aW5nIG9yIHJlamVjdGluZyB0aGVzZSBtb2RpZmljYXRpb25zIHdoZW4gcmV2aWV3aW5nIHRoZXNlIG1vZGlmaWNhdGlvbnMuICBFdmVyeSB3b3JrIHByb2R1Y3QgaGFzIG5vbmUgb3Igb25lIHJvbGUgcmVzcG9uc2libGUgcm9sZS4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xTHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIiBuYW1lPSJEZWZhdWx0X0FkZGl0aW9uYWxQZXJmb3JtZXIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCBfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NfcU0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgYnkgZGVmYXVsdCBjYW4gYmUgYXNzaWduZWQgdG8gaGVscCBjb21wbGV0aW5nIGEgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiIG5hbWU9ImhlbHBzUGVyZm9ybWluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FOLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiIG5hbWU9IkNvbXBvc2l0aW9uIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0SmJJT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiPgotICAgICAgICAgICAgICA8Ym9keT5BcnRpZmFjdCB0eXBlcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBwaHlzaWNhbGx5IGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGlzIGNvbXBvc2VkIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIiBuYW1lPSJEZWZhdWx0RGVsaXZlcmVkV1AiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RKYktlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCBwYXJ0cyBvZiBhIGRlbGl2ZXJhYmxlLCBpLmUuIHRoZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzIGEgRGVsaXZlcmFibGUgY29tcHJpc2VzIG9mLiAgVGhpcyBhZ2dyZWdhdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIFByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIiBuYW1lPSJfZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiTGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIiBuYW1lPSJEZWZhdWx0X09wdGlvbmFsSW5wdXRzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUgXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0SmJNdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3B0aW9uYWwgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiIG5hbWU9Im9wdGlvbmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJPZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyBfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdEpiTy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBkZXJpdmVkIGFzc29jaWF0aW9uIGlzIGEgc2hvcnRjdXQgZm9yIG5hdmlnYXRpb24gYWxvbmcgdGhlIGFzc29jaWF0aW9uIHByb3BlcnRpZXMgQ29udGVudEVsZW1lbnQucHJlc2VudGF0aW9uLnNlY3Rpb25zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YgXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0VE1KdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIGFkZHMgYW4gb3B0aW9uYWwgcHJlLWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcHJlLWNvbmRpdGlvbiBkZWZpbmVzIGFueSBraW5kIG9mIGNvbnN0cmFpbnQgdGhhdCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSB3b3JrIGRlc2NyaWJlZCBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBjYW4gc3RhcnQuIEZvciBleGFtcGxlLCBhIHByZS1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhbiBpbnB1dCBXb3JrIFByb2R1Y3QgbmVlZHMgdG8gYmUgaW4gYSBzcGVjaWZpYyBzdGF0ZSBvciB0aGF0IG90aGVyIHJlbGF0ZWQgd29yayBtdXN0IGJlIGluIGEgY2VydGFpbiBzdGF0ZSAoZS5nLiAnSW5wdXQgZG9jdW1lbnQgWCBoYXMgYmVlbiByZXZpZXdlZCBhbmQgc2lnbmVkIGJ5IGN1c3RvbWVyIEFORCBUYXNrICZxdW90O01hbmFnZW1lbnQgUmV2aWV3JnF1b3Q7IGlzIGNvbXBsZXRlJykgYmVmb3JlIHRoZSBUYXNrIGNhbiBiZWdpbi4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSIgbmFtZT0iX3dvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIF8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdFRNTGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiBhZGRzIGFuIG9wdGlvbmFsIHBvc3QtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwb3N0LWNvbmRpdGlvbiBkZWZpbmVzIGFueSBraW5kIG9mIGNvbnN0cmFpbnQgdGhhdCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSB3b3JrIGRlc2NyaWJlZCBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBjYW4gYmUgZGVjbGFyZWQgY29tcGxldGVkIG9yIGZpbmlzaGVkIGFuZCB3aGljaCBvdGhlciBXb3JrIERlZmluaXRpb25zIG1pZ2h0IGRlcGVuZCB1cG9uIChlLmcuIGZvciB0aGVpciBwcmUtY29uZGl0aW9ucykuICBGb3IgZXhhbXBsZSwgYSBwb3N0LWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGEgd29yayBwcm9kdWN0IGRlZmluZWQgdG8gYmUgdGhlIG91dHB1dCBtdXN0IGJlIGluIGEgc3BlY2lmaWMgc3RhdGUgYmVmb3JlIHRoZSBUYXNrIGNhbiBlbmQgKGUuZy4gJ1VzZSBDYXNlIG11c3QgYmUgaW4gc3RhdGUgZnVsbHkgZGVzY3JpYmVkIGFuZCByZXZpZXdlZCBieSBTeXN0ZW0gQW5hbHlzdCcpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCIgbmFtZT0iX3dvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3Q1Q0ItZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFFMDk5QjgwMDA5Ij4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMDk5QjgwMDA5IiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RydWN0dXJlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR29TV3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NaZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHb1NWLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdvU1dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQzIiB5PSIxNzE4IiB3aWR0aD0iNDcxNSIgaGVpZ2h0PSIyOTYzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y09PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEd4Y09lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1BlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1FlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1JPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEd4Y051ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjTi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTUiIHk9Ijc0NDIiIHdpZHRoPSIzNTk2IiBoZWlnaHQ9IjI0MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNUdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR3hjVXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM1MiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjWGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR3hjVC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNVT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NzUiIHk9Ijc4NTAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdDVDQ2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iTWV0aG9kIFBhY2thZ2UgaXMgZGVmaW5lZCBhcyBhbiBhYnN0cmFjdCBjbGFzcy4gIEl0cyBzcGVjaWFsaXphdGlvbiwgQ29udGVudCBQYWNrYWdlLCBkZWZpbmVzIHRoZSByZWRlZmluaXRpb24gb2YgdGhlIFVNTCBwYWNrYWdlIHRvIGNvbnRhaW4gb25seSBDb250ZW50IEVsZW1lbnRzLiAgTWV0aG9kIFBhY2thZ2VzIGNhbiBiZSBkZWZpbmVkIGFzIGdsb2JhbCAoaS5lLiBhbnkgZWxlbWVudCBpbiBhbnkgb3RoZXIgcGFja2FnZSBjYW4gYWNjZXNzIGl0cyBjb250ZW50cykuICBUaGV5IGNhbiBiZSBuZXN0ZWQgYXMgd2VsbCBhcyBkZWZpbmUgZGVwZW5kZW5jaWVzIHRvIG90aGVyIHBhY2thZ2VzICh2aWEgdGhlIHJldXNlZFBhY2thZ2VzIGFzc29jaWF0aW9uKS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdvU1p1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSIgc291cmNlPSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR29TYXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1NSIgeT0iLTMxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2NlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY0OCIgeT0iLTMyMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ3MiIgeT0iMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMxNCIgeT0iLTM5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NmT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NmdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU2hPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y0VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHb1NaLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdvU2FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjM1MywgLTU2NywgMjM1MywgLTU2N10kWzYyMTQsIC01NjcsIDYyMTQsIC01NjddJFs2MjE0LCAtMjMyOCwgNjIxNCwgLTIzMjhdJFsxMzEyLCAtMjMyOCwgMTMxMiwgLTIzMjhdJFsxMzEyLCAtMTQ4MSwgMTMxMiwgLTE0ODFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR3hjRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1IiBzb3VyY2U9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y0Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk3IiB5PSIxNTAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjk3IiB5PSI2MjciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNIZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MjUiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjSU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTE3IiB5PSIyODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQwIiB5PSIxMzg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y0tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y0xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0t1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEd4Y0UtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR3hjRk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMzUzLCA2MDksIDIzNTMsIDYwOV0kWzYxODAsIDYwOSwgNjE4MCwgNjA5XSRbNjE4MCwgMjgwMiwgNjE4MCwgMjgwMl0kWzE0NzMsIDI4MDIsIDE0NzMsIDI4MDJdJFsxNDczLCAxNDgxLCAxNDczLCAxNDgxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEd4Y1JlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDNBRiIgc291cmNlPSJfSEd4Y05lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNTLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjU2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEd4Y1J1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR3hjUi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQzLCAtMTM5NywgLTI0NSwgNDI0MV0kWy0xNDMsIC00MTU3LCAtMjQ1LCAxNDgxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR3hjVE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEd4Y1RlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR3hjWHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIiBzb3VyY2U9Il9IR3hjTmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR3hjVHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNZdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjWnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjgiIHk9IjMyMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNhZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjYiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgiIHk9IjI5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNiLWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NTEiIHk9Ii0yNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjY3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNmT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNldWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNmdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR3hjWC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHeGNZT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2MDgsIC0xMzUsIC01MTQ3LCAtMzNdJFs1MDgwLCAtMTM1LCAtMTY3NiwgLTMzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNjBFNzIwMDM3IiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR3hjZ3VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVU1MMiBJbmZyYXN0cnVjdHVyZSIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNnLWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMTUiIHk9IjYwMSIgd2lkdGg9IjcwNDQiIGhlaWdodD0iODE0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2h1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHeGNpdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjE1NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdORk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdORnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOR09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tkd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEd4Y2gtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzYxIiB5PSIxMzYzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEc3TkgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NzMiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TktlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tkt1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TkhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTk0IiB5PSI2MTE4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEc3TkwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzNjgiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05NT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tk91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TkxPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOTGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjkyIiB5PSI0MzYwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEc3TlAtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzMDIiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOU09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TlBPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTU5IiB5PSI5MjI4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEc3TmF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1MjIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05iZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05iLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05jZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05jLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOZGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRzdOWi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05hT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM5NzkiIHk9IjExNTQwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEc3TmpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0NTQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOa09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05rZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOa3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05rLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdObE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05sZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdObHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdObC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRzdOaWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05pdWZYRWR1cUhvT0piVVJaUnciIHg9IjQwMTMiIHk9IjEzNDcwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3Q1Q0MtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBNZXRob2QgUGFja2FnZSBwYWNrYWdlIGRlZmluZXMgaG93IHRoZSBtZXRob2QgZWxlbWVudHMgY2FuIGJlIHBoeXNpY2FsbHkgb3JnYW5pemVkIGluIHBhY2thZ2UgaGllcmFyY2hpZXMuICBJdCByZXVzZWQgdGhlIHBhY2thZ2UgY29uY2VwdCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlIExpYnJhcnksIGJ1dCByZWRlZmluZXMgaXQgdG8gcmVzdHJpY3QgQ29udGVudCBQYWNrYWdlcyB0byBvbmx5IGNvbnRhaW4gQ29udGVudCBFbGVtZW50cyBhbmQgbm90IGFueSBQYWNrYWdlYWJsZSBFbGVtZW50cyAoVEJEOiB1cGRhdGUgZGlhZ3JhbSB3aXRoIHtyZWRlZmluZXN9IGNvbnN0cmFpbnQhKS4gVGhlIGRpYWdyYW0gc2hvd3MgdGhlIG92ZXJhbGwgdGF4b25vbXkgaXMgd2hpY2ggTWV0aG9kIFBhY2thZ2UgaXMgZGVmaW5lZCBhcyBhbiBhYnN0cmFjdCBjbGFzcy4gIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05TLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkJDRjAyQTkiIHNvdXJjZT0iX0hHN05HLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05LLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TlQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05UT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TlRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk3OSwgLTc5LCA5NzksIDE5NThdJFstMTk4NSwgLTc5LCAtMjcsIDE5NThdJFstMTk4NSwgLTE3MTksIC0yNywgMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOVXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOVk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBzb3VyY2U9Il9IRzdOSy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR3hjaHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tld1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05XT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOVmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05WdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NCwgLTUxNiwgMTYsIDIyMjZdJFstODQsIC0xOTcyLCAxNiwgNzcwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOVy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOWGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFQzMzNEYwMTk4IiBzb3VyY2U9Il9IRzdOTy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOSy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05ZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOWHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05YLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtNTI0LCAtMTAxNiwgNDM1MV0kWzUwLCAtNDM2MCwgLTEwMTYsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05aZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDQzBBMDFENyIgc291cmNlPSJfSEc3Tlp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3TkctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05mT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3TmQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOZU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NzgsIC00NDgsIC0zODksIDQ2MzFdJFs3NzgsIC00NTYzLCAtMzg5LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05mZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05mLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRDVGODAzOEUiIHNvdXJjZT0iX0hHN05adWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05PLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05oT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05nT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TmdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwMDcsIC00NDgsIDkyMiwgMTc4Nl0kWy0xMDA3LCAtMTcxOCwgOTIyLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05odWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOaC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05tT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAzQUYiIHNvdXJjZT0iX0hHN05pT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05adWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdObS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05uZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdObnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3Tm5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05tZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3Tm11ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ0OCwgMCwgMTQ4MV0kWzAsIC0xNDgxLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05uLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOb09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdG1IRS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIj4KLSAgICAgICAgICAgIDxib2R5PjA1PC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUktFRFlPeGdFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREU0OUVBMDFFMiIvPgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUnFHT1VPeGdFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSIvPgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfU0xWVElPeGdFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQyRERFMjgwMDI1RCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSEctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0MwQTAxRDciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRDVGODAzOEUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTJGQTg1NDAzMEUiIG5hbWU9Imdsb2JhbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSElPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMkZBODU0MDMwRSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR3RtSEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0dlJFLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0dlJFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4IiBuYW1lPSJjaGlsZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Q1Q0J1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Q1Q0JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiIgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdG1ISk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAzQUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0dlJCLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0dlJCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyBfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3R2UkEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29udGVudCBQYWNrYWdlIGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMuICBBIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZSBjYW4gYmUgcGFydCBvZiBvbmx5IG9uZSBwYWNrYWdlIGluc3RhbmNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCIgbmFtZT0iX2NvbnRlbnRQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSQ3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdHZSQ2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIF8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdHZSRE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgYSBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcyBpdCBjb25uZWN0cy4gIFRoZSBwYWNrYWdlIGF0IHRoZSB1c2luZ1BhY2thZ2UgZW5kIGRlcGVuZHMgb24gdGhlIHBhY2thZ2UgYXQgdGhlIHJldXNlZFBhY2thZ2UgZW5kLiAgRm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgaW4gdGhlIGZvcm1lciBwYWNrYWdlIGlzIHVzaW5nIGFuIGVsZW1lbnQgaW4gdGhlIGxhdGVyIGluIGEgcmVsYXRpb25zaGlwIHN1Y2ggYXMgYSBUYXNrIGlzIHVzaW5nIGEgV29yayBQcm9kdWN0cyBhcyBhbiBpbnB1dC4gIFJlZmxleGl2ZSByZXVzZWRQYWNrYWdlIGxpbmtzIChpLmUuIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gaXRzZWxmKSBhcmUgbm90IGFsbG93ZWQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIiBuYW1lPSJ1c2luZ1BhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3R2UkVPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3R2UkQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSIgbmFtZT0iUGFja2FnZU5lc3RpbmciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiBfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3R2UkZlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSI+Ci0gICAgICAgICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gYmUgbmVzdGVkLCBpLmUuIGEgcGFja2FnZSBjYW4gYmUgcGFydCBvZiBhbm90aGVyIHBhY2thZ2UuICBOZXN0ZWQgcGFja2FnZXMgZG8gbm90IG5lZWQgdG8gYmUgb2YgdGhlIHNhbWUgdHlwZSwgZS5nLiBhIENvbnRlbnQgUGFja2FnZSBjYW4gYmUgZGVmaW5lZCBpbnNpZGUgYSBQcm9jZXNzIFBhY2thZ2UgKGRlZmluZSBmb3IgdGhlIFByb2Nlc3MgcGFydCBvZiB0aGlzIG1vZGVsKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiIG5hbWU9Il9tZXRob2RQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdDVDQS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdDVDQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0OUVBMDFFMiIgbmFtZT0iTWV0aG9kQ29yZURlc2NyaXB0aW9ucyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HdXlaNGVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MURFNEFCNDAwOTgiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNEFCNDAwOTgiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1FT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTIyMTAxRDIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtRk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDc1OCIgaGVpZ2h0PSIyNDIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1HdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1IT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1IdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1ILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1FZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQ2MCIgeT0iMTYzMTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1JT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTI1QzAxMzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQwMiIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1LdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1MT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1MdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1MLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1JZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLUl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTg2MiIgeT0iMTYyODEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1NT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMzYzNjAxMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtTk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzkyOCIgaGVpZ2h0PSIzMjY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLU9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1PdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLU8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1QT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1QdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1QLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1NZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLU11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxNjUiIHk9IjEyOTQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUzMTkwMzUwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLVJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ5OTUiIGhlaWdodD0iMTk5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1TZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1TLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1UZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1RdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMjg1IiB5PSIxMjkyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzUxMDAxMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1WT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1XT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLVVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzU0IiB5PSIxMjkyOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYzNjIwMDA5QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1aT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1adWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1hT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzk1NyIgeT0iMTI5MzciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1jT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTM2QTAwRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtZE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDg3NiIgaGVpZ2h0PSIyNDIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lDdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1jZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLWN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQ1NCIgeT0iMTI5MTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISE9JRC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lGT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JR3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISE9JRE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzA2NCIgeT0iOTk5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhPSUgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1NTUiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JS3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISE9JSE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lIZWZYRWR1cUhvT0piVVJaUnciIHg9IjExOTQ2IiB5PSI4NTY4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JYXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhPSWJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0liLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0ljLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JZWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISE9JYS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JYk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTUzMiIgeT0iMzUxMyIgd2lkdGg9IjUxMzAiIGhlaWdodD0iMjIxOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIT0lxdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjE1NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9Jci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9Jc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9Jcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSXAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI0MzciIHk9IjQwMDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVNdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISFg1TnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQ4NyIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1T09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1T3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNU8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVRZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIWDVNLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3MTUiIHk9IjQwMDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVidWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU0QzAzODQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISFg1Y3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNWQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNWVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNWUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVmZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIWDViLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNWNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTE2NCIgeT0iODMwNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d1eVo0LWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTWV0aG9kIENvcmUgRGVzY3JpcHRpb25zIHBhY2thZ2UgZGVmaW5lcyB0aGUgZXhhY3QgbmF0dXJlIG9mIHRleHR1YWwgZGVzY3JpcHRpb25zIHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBmb3IgQ29udGVudCBFbGVtZW50cy4gIFRoZSBkZWNsYXJhdGlvbnMgZm9yIHRoZXNlIGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZmFjdG9yZWQgaW50byB0aGlzIHNlcGFyYXRlIHBhY2thZ2UsIGJlY2F1c2UgZXZlcnkgaW1wbGVtZW50ZXIgb2YgdGhpcyBtZXRhLW1vZGVsIG1pZ2h0IGRlY2lkZSB0byBkZWZpbmUgYSBkaWZmZXJlbnQgc2V0IG9mIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMgZm9yIHRoZWlyIENvbnRlbnQgRWxlbWVudHMuICBIb3dldmVyLCBvbmx5IHRoZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhpcyBwYWNrYWdlIGFyZSB0aGUgc3RhbmRhcmRpemVkIHNldCBmb3IgSUJNJ3MgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlIGFuZCBhcmUgc3VwcG9ydGVkIGZvciBtZXRob2QgY29udGVudCBpbnRlcmNoYW5nZSAoaS5lLiBpbXBvcnQvZXhwb3J0IHNjZW5hcmlvcyBmb3IgZGlmZmVyZW50IGNvbnRlbnQgc291cmNlcykuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lLLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4NTAzODMiIHNvdXJjZT0iX0hIRS1RT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSUwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lMT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSUxlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTk5OSwgMzU1LCAzNzc2XSRbLTIwMywgLTQxOTksIDM1NSwgNTc1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JTXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSU0tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JTk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwNzUwM0M3IiBzb3VyY2U9Il9ISEUtY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JTmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSU51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTEyMTksIC04MzMxLCAzNzU5XSRbOCwgLTI4OTUsIC04MzIyLCAyMDgyXSRbNjA0NSwgLTQ0MTksIC0yMjg2LCA1NThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lPLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JUE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODQ5RTAwMDEiIHNvdXJjZT0iX0hIRS1VT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lQdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNzk1LCAtMzkxMSwgMzc3Nl0kWzgsIC0xNzY5LCAtMzkwMywgMjgwMl0kWzMwNzMsIC0zOTk2LCAtODM4LCA1NzVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lST2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JUmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4ODAxM0YiIHNvdXJjZT0iX0hIRS1ZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lSLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JU09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOCwgLTU4NCwgNTUyOCwgMzc4NF0kWy0xNiwgLTE2NzYsIDU1MjAsIDI2OTJdJFstNDM1MSwgLTM3OTMsIDExODUsIDU3NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lUdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDdCMDFBQyIgc291cmNlPSJfSEhFLUlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JVS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVVPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lVZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ4MiwgLTc5NSwgLTEzNDYsIDIxNTBdJFsxMDY2LCAtMTczNSwgLTc2MiwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lWLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDdEMDM2NCIgc291cmNlPSJfSEhFLUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lXdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDU4LCAtMTIxOSwgMTg4OCwgMjE4NF0kWy0xODk2LCAtMjE5MiwgMTA0OSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDhCMDBBQSIgc291cmNlPSJfSEhFLU1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0laT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0laLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVl1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lZLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04LCAtMTY0MiwgOTg5NywgMzc5M10kWy0xNiwgLTM4MDEsIDk4ODksIDE2MzRdJFstNzYyOCwgLTUwNjMsIDIyNzcsIDM3Ml0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSWFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lhZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSWV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSIgc291cmNlPSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUiIHk9Ii0xNjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JaGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lpT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI4MiIgeT0iMzYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYyMSIgeT0iNDA4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JbHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9Jbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JbXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSWUtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSWZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjU2NSwgNTkyLCAyNTY1LCA1OTJdJFszMTQ5LCA1OTIsIDMxNDksIDU5Ml0kWzMxNDksIDE4ODgsIDMxNDksIDE4ODhdJFsxMTkzLCAxODg4LCAxMTkzLCAxODg4XSRbMTE5MywgMTEwOSwgMTE5MywgMTEwOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0luZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIHNvdXJjZT0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lDLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSW9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0ludWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0luLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzcsIC0xMTA5LCA3NDQyLCAxOTg5XSRbLTE3NywgLTMxNDksIDc0NDIsIC01MF0kWy02MjA2LCAtMzE0OSwgMTQxMywgLTUwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSXBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBzb3VyY2U9Il9ISE9JcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JYXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Qk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1QmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDkiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVDT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVEdWZYRWR1cUhvT0piVVJaUnciIHg9Ii02ODAiIHk9Ii0yMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1RS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1RWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1Ri1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1RmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVHZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVIZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JdC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JdU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMDkxLCA5MywgLTU0NzcsIDI0NV0kWzUwMDMsIDkzLCAtMjU2NSwgMjQ1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhYNUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMDA1ODNCMDFFNiIgc291cmNlPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUMtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhYNUllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhYNUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNzcwLCAwLCAyNDgwXSRbLTUwLCAtMjcyNiwgMCwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISFg1Si1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhYNUtPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISFg1UXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBzb3VyY2U9Il9ISE9JcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISFg1TXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Ui1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVSdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgiIHk9IjIyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODI4IiB5PSItMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVVT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MiIgeT0iMTc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVVLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MiIgeT0iLTM1NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVXT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVWdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVYT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIWDVRLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhYNVJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwOTksIDAsIDU0NjksIDBdJFstNTMyNSwgMCwgMjI0MywgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIWDVaZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0hIWDVNdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lDLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNWFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIWDVadWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIWDVaLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1LCAtNzcwLCAtNzQ5MywgMjQ4MF0kWzI1LCAtMzI1MSwgLTc0OTMsIDBdJFs2MTA0LCAtMzI1MSwgLTE0MTMsIDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIWDViT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISFg1YmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdDVDRGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIj4KLSAgICAgICAgICAgIDxib2R5PjA2PC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfVlBJR01PeGVFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5MCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUyMjEwMUQyIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3RDAzNjQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURFNTM2QTAwRDgiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEEiIG5hbWU9ImJyaWVmT3V0bGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdDVDR09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDBBIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duZFZrZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duZFZrT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0dmajkwT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDBCIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekFlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX25zbllrZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX25zbllrT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX25pVmJNT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDYxMURCMkYwMjBEIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfMkVFdzRleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMkVFdzRPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfMThMWklPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NjExREI0RDAyNDgiIG5hbWU9Im5vdGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9QQmlsOGV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9QQmlsOE95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9PNGNVVU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUyNUMwMTM3IiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3QjAxQUMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURFNTM2QTAwRDgiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMTQiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekNPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxNCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNnByOEFleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNnByOEFPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNmJyVk1PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMUUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pDLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMUUiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ldWxqRWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ldWxqRU95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9la3dSb095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUzMTkwMzUwIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDg1MDM4MyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA3OCIgbmFtZT0ic2tpbGxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pFT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNzgiPgotICAgICAgICAgICAgICAgIDxib2R5Pkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tT1hSd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tT1hSd095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tRGUzY095SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4MiIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4MiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3B0WElVZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3B0WElVT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3BsNTFjT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE0QjM3N0QwMjcyIiBuYW1lPSJzeW5vbnltcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUw4OHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE0QjM3N0QwMjcyIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il83cVd1MGV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il83cVd1ME95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il83ZzBZVU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUzNTEwMDEzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4NDlFMDAwMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4RCIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUw4OS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDhEIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQkdfeklleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQkdfeklPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfQ0tmM2dPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwOTYiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUw4LXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDk2Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQUF6ZndleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQUF6ZndPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfXzQ2SUFPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MzZBMDBEOCIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwNzUwM0M3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEI0IiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnQ4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQjQiPgotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYWttMThleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfYWttMThPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfYWNzM0lPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnQ5ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkUiPgotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYlo4aWdleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfYlo4aWdPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfYlJtZTBPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkYiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnQtT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkYiPgotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0JBSTEwZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0JBSTEwT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0EzNzhFT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGMzYyMDAwOUEiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDg4MDEzRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkUyNTE4MDBEMiIgbmFtZT0iYXR0YWNobWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VWdF9lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkUyNTE4MDBEMiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzc4Vmt3ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzc4Vmt3T3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzcxTHo0T3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGMzYzNjAxMDkiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDhCMDBBQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RjA2MDEzOCIgbmFtZT0iYWRkaXRpb25hbEluZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VWdUF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RjA2MDEzOCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR1pzVWNPeUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR1pqS2dPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfR1MyRmtPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENEVGMDAyN0YiIG5hbWU9InByb2JsZW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VmZTh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUYwMDI3RiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzRXXzF3ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzRXXzF3T3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzRPVzNJT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRFRjgwMTkyIiBuYW1lPSJiYWNrZ3JvdW5kIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1ZmU5ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEVGODAxOTIiPgotICAgICAgICAgICAgICAgIDxib2R5PkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9DYy1BTWV5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9DYy1BTU95SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9DU1BXNE95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDUzMDExRCIgbmFtZT0iZ29hbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VmZS1PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDUzMDExRCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfMFVVRGNleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMFVVRGNPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfMExZSjRPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENEYwMTAyMDYiIG5hbWU9ImFwcGxpY2F0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1ZmUtLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEYwMTAyMDYiPgotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzgwcVQ0ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzgwcVQ0T3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzh0emQ4T3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDVEM0UwMzI1IiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b280T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENUQzRTAzMjUiPgotICAgICAgICAgICAgICAgIDxib2R5Pk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGU0SGtleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGU0SGtPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdUViRW9PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVERTRDMDM4NCIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTRDMDM4NCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZXh0ZW5kcyB0aGUgQ29udGVudCBFbGVtZW50IGRlZmluaXRpb24gdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCByZWZlcmVuY2VzIHRvIGljb25zIHRoYXQgYXJlIHVzZWQgZm9yIHByZXNlbnRpbmcgQ29udGVudCBFbGVtZW50cyBpbiBhIFVNQS1iYXNlZCBtb2RlbGluZyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdoZW4gcHVibGlzaGluZyBDb250ZW50IEVsZW1lbnRzIGludG8gZG9jdW1lbnRhdGlvbiBwcmVzZW50YXRpb24gKGUuZy4gZG9jdW1lbnQgb3IgaHRtbCBwYWdlcykuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNDk1MzcwMzQzIiBuYW1lPSJzaGFwZWljb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTM3MDM0MyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0paSHJRZXlQRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0paSHJRT3lQRWR1RktKb3ZCTDY0WFEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0pPaUw0T3lQRWR1RktKb3ZCTDY0WFEiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNDk1M0MwMzE5IiBuYW1lPSJub2RlaWNvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFNDk1M0MwMzE5Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0ZqMWJ3ZXlQRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0ZqMWJ3T3lQRWR1RktKb3ZCTDY0WFEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0dSbFNrT3lQRWR1RktKb3ZCTDY0WFEiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEFBIiBuYW1lPSJleHRlcm5hbElkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1TDhfLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQUEiPgotICAgICAgICAgICAgICAgIDxib2R5PkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9obzRVZ2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9obzRVZ095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9oZlYtQU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdFNzE2MDM3RiIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdFNzE2MDM3RiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+S2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzFNTXRzZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzFNTXRzT3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzFEWi1FT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREUyODAwMjVEIiBuYW1lPSJXb3JrUHJvZHVjdFN0YXRlcyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HdkZVLU9mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MkRERTlGRTAwM0EiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERTlGRTAwM0EiIHR5cGU9IkNsYXNzIiBuYW1lPSJNZXRob2RMaW5rIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISGhxQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxRC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISGhxQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIaHFBdWZYRWR1cUhvT0piVVJaUnciIHg9IjE5MDIiIHk9IjUzODkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUEwNTAwMDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISGhxRk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxSC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISGhxRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIaHFFdWZYRWR1cUhvT0piVVJaUnciIHg9IjM0MjAiIHk9IjMzODIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFRLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISGhxUi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFUT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxVC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxVXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISGhxUk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIaHFSZWZYRWR1cUhvT0piVVJaUnciIHg9IjQxOTciIHk9IjExODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFVLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUFDMzAxQTUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISGhxVi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTg3OSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFXLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFYZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFZZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFZdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIaHFWT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhocVZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTIwNyIgeT0iMzM2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d2RlUtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhocUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIxMDJENSIgc291cmNlPSJfSEhocUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhocUFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFLT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFLLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocUx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMxNCIgeT0iLTM5MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocU51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocU5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocU91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxUE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxUU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhocUllZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIaHFJdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM0NywgNDQ4LCAtMTI3OCwgLTE2MzRdJFsxMjEwLCAxNTU3LCAtNDE0LCAtNTI0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhocVktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDAzQyIgc291cmNlPSJfSEhocVUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhocVEtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFhZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxWi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFhLWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMwNCIgeT0iNTE5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFmLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFnLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISGhxWk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhocVplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM0NywgLTQ1NywgMTIyNywgMTY3Nl0kWy0xMjAyLCAtMTYxNywgMzcyLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUMzRjAwMzkiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdGF0ZU1hY2hpbmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxejhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzgxMDMyMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXo4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIcXo5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzcwIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXo5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxejl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxei1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHF6LWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxei11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHF6LS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxel9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHF6X2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxel91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxel8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhxejhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHF6OHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5Njg1IiB5PSIxMzI2NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRERDMDMxOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIcTBCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTY2IiBoZWlnaHQ9IjQ1ODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMENlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRW51bWVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwRE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMERlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwRHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISHEwQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIcTBBdWZYRWR1cUhvT0piVVJaUnciIHg9IjIxMjUiIHk9IjY3NDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBELWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISHEwRS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBHdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBIT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwSHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISHEwRU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIcTBFZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwODMzIiB5PSIyMzY1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhxMEktZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwS3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMExlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEx1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhxMElPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwSWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDYyMyIgeT0iMTA2NDgiIHdpZHRoPSIyMzczIiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBVdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISHEwVnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBrOE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGs4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBrOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGs4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBrOU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBrOWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISHEwVS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIcTBWT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg4MzEiIHk9IjEwNDkwIiB3aWR0aD0iMTc2OSIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEgwbFNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsVU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEgwbFJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTA3IiB5PSIxMzE5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzRFMDBCMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIMGxXZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxYZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxZZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxaT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIMGxWdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgwbFYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEyMjYiIHk9IjUwNDYiIHdpZHRoPSIzMDk1IiBoZWlnaHQ9IjE5MDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxidWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFDNDAzMzMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISDBsY3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsZmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISDBsYi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxjT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNjc1IiB5PSI4MzMxIiB3aWR0aD0iMTgyNyIgaGVpZ2h0PSIxMjE5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2SS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVBMDUwMDA4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEg5dkotZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIwMTUiIGhlaWdodD0iODk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Sy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2TGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2TC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2TWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2TXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISDl2Sk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXZKZWZYRWR1cUhvT0piVVJaUnciIHg9IjcxMjAiIHk9IjEzMjY3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3ZQRjBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISHEwTC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMDNDIiBzb3VyY2U9Il9ISHEwSC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwRC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIcTBNLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwTi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk2IiB5PSIzNDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBPdWZYRWR1cUhvT0piVVJaUnciIHg9Ii05ODQiIHk9Ijk3NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyODAiIHk9Ii0zMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwUU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTgiIHk9IjIyNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBSZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBRLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBSLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMFRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxMFMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMFVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxMFQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIcTBNT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhxME1lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjc3LCAtNzk1LCAzNjIzLCA3MjgxXSRbNjc3LCAtODIyMSwgMzYyMywgLTE0M10kWy0xMTAwLCAtODIyMSwgMTg0NSwgLTE0M10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIMGs5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFMTAzOEMiIHNvdXJjZT0iX0hIcXo4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIcTBVdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBrLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGstLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBrX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgway11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIMGs5LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDBrLU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzLCAtNDU3LCA4NjMsIDE5ODFdJFstNzI4LCAtMTY1MSwgMzM4LCA3ODddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIMGtfZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISDBrX3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIMGtfLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QjAxOUIiIHNvdXJjZT0iX0hIcTBVdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIcTBILWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgwbEEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxCLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NDUiIHk9Ii0yMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxDdWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MiIgeT0iMjExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxEZWZYRWR1cUhvT0piVVJaUnciIHg9IjQwMyIgeT0iLTE3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxFT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTYiIHk9IjIxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxFLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbEhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbEllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIMGxBT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEgwbEFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzg3LCAtNTU4LCAtNDkwMiwgLTU1OF0kWzQ3NjYsIC01NTgsIC05MjIsIC01NThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBsSXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTQwM0JCIiBzb3VyY2U9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwSC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxKdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsS3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk0IiB5PSIyNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxMZWZYRWR1cUhvT0piVVJaUnciIHg9IjgwIiB5PSItMjI4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxNT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM2OSIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbE0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxNSIgeT0iLTIyOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxOdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxPdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbFB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbFF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIMGxJLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEgwbEpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzk0LCA1NTUsIC00ODk1LCA1NTVdJFs0NzYzLCA1NTUsIC05MjYsIDU1NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIMGxaZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM2ODAwOTIiIHNvdXJjZT0iX0hIMGxWZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIcTBELWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsYS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgwbGFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIMGxadWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEgwbFotZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTk0OCwgLTUwLCAxODQ1XSRbMCwgLTIyODYsIC01MCwgNTA4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISDBsYk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEgwbGJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBsZnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMDc4IiBzb3VyY2U9Il9ISDBsYnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwSC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxndWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsaHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTgiIHk9IjI5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbGllZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjU4IiB5PSItMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxqT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYyIiB5PSItMTUzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbGotZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTAwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxrdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxsdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbG5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbG11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbG9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbG51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIMGxmLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEgwbGdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODIxLCA1OSwgLTIxNzUsIC0yMjc3XSRbMjg1MywgNTksIC0xNDMsIC0yMjc3XSRbMjg1MywgMTU0OSwgLTE0MywgLTc4N10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIMGxvZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAxNjQiIHNvdXJjZT0iX0hIMGxidWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIcTBVdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dTRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXU1ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NSIgeT0iLTMwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dTZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzg1IiB5PSIyMTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dTYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAwIiB5PSIxMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1N2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1N3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzIiIHk9Ii03MTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1OE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1OHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl1OC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1OGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl1OS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1OWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXUtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXUtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXUtZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1X3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXVfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXVfZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsb3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxvLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MjYsIDIxMiwgMTg3OSwgLTIxNDNdJFstMzA2OSwgMjEyLCAtMjY0LCAtMjE0M10kWy0zMDY5LCAxNTYxLCAtMjY0LCAtNzk0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEg5dkFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZEMDEwMCIgc291cmNlPSJfSEgwbFZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEgwbGJ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl2Qk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzc2IiB5PSIzODEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZDLWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NCIgeT0iLTExMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwIiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2RWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTMiIHk9Ii03NjciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2RS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2RmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2RnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Rk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2R3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2R09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZIdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZIT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2SWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZJT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDl2QWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIOXZBdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMiwgOTUzLCAxMDYsIC0xOTg0XSRbMjEyLCAyMzI4LCAxMDYsIC02MDldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDl2TS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFREYwMTEyIiBzb3VyY2U9Il9ISDl2SS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2T09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dk9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXZOLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDl2Tk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEg5dk5lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzA0LCAtNDU3LCAtMTM3MSwgMTk4MV0kWzExMTcsIC0xNjUxLCAtNTU4LCA3ODddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIOXZPdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISDl2Ty1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIOXZQT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMTAyRDUiIHNvdXJjZT0iX0hIOXZJLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIMGxSZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2UXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dlFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZST2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dlItZlhFZHVxSG9PSmJVUlpSdyIgeD0iODMiIHk9Ii0yODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dlN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzNSIgeT0iLTI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZUZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMTEiIHk9IjU5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZVT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dld1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dldPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dlh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dlhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIOXZQZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDl2UHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTAxNiwgMCwgMzc1OSwgMF0kWy0yOTI5LCAwLCAxODQ1LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEg5dlgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTM5MDE4NiIgc291cmNlPSJfSEg5dkktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEgwbFZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZaZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl2WS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dlotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkzMyIgeT0iLTI4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2YS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQyMyIgeT0iLTE2NDEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Yk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEzNiIgeT0iMzMwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDMzIiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dmRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dmVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Zk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2ZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2ZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2Z2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Zi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEg5dllPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDl2WWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDc2LCAtMzE4LCAtNTM3MSwgNzI3Nl0kWy00NzYsIC04NDY3LCAtNTM3MSwgLTg3M10kWzMzMzQsIC04NDY3LCAtMTU2MSwgLTg3M10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIOXZndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEODAxNDAiIHNvdXJjZT0iX0hIOXZJLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIMGxidWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2aGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2aU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dmh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZpdWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2anVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0OSIgeT0iNDc2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0NDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZrT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc4OCIgeT0iMjUzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2bU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2bHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0NDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2bk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2bXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGY0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZudWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0NDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGY1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hJSGY0LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDl2Zy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIOXZoT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNTksIC0zMTgsIC00ODY5LCA0MzM5XSRbLTE1OSwgLTU2MDksIC00ODY5LCAtOTUyXSRbNDI2MCwgLTU2MDksIC00NTAsIC05NTJdJFs0MjYwLCAtNTI2NiwgLTQ1MCwgLTYwOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX0NuUTVrT3htRWR1d09ia0lBNngxZ0EiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5TU94bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU0teG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRTcwOU5PeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlOZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU51eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5Ti14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU9PeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9FNzA5T2V4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU91eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9FNzA5Ty14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOVBPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9FNzA5UGV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOVB1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTcwOVAteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRTcwOU1leG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9FNzA5TXV4bUVkdXdPYmtJQTZ4MWdBIiB4PSI4NDEyIiB5PSI3MTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBnT3htRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM0RTAwQjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQZy14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HQUZQaE94bUVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGhleG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQaHV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBoLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQaU94bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dBRlBpZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQaXV4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dBRlBpLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQak94bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dBRlBqZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQanV4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HQUZQai14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HQUZQZ2V4bUVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dBRlBndXhtRWR1d09ia0lBNngxZ0EiIHg9IjQ1NzYiIHk9IjU3NDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHRNT3htRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0TS14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9JdGh0Tk94bUVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE5leG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0TnV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHROLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0T094bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0l0aHRPZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0T3V4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0l0aHRPLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0UE94bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0l0aHRQZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0UHV4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JdGh0UC14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9JdGh0TWV4bUVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0l0aHRNdXhtRWR1d09ia0lBNngxZ0EiIHg9IjQ0NjkiIHk9IjMzODUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUlZT3htRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFDNDAzMzMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJWS14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9MZVFJWk94bUVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSVpleG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJWnV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUlaLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJYU94bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0xlUUlhZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJYXV4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0xlUUlhLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJYk94bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0xlUUliZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJYnV4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MZVFJYi14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9MZVFJWWV4bUVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0xlUUlZdXhtRWR1d09ia0lBNngxZ0EiIHg9IjEwODcyIiB5PSIzMzg1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4RU94bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEUteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfUnF4OEZPeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhGZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEZ1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4Ri14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEdPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ScXg4R2V4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEd1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ScXg4Ry14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEhPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ScXg4SGV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEh1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUnF4OEgteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfUnF4OEVleG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ScXg4RXV4bUVkdXdPYmtJQTZ4MWdBIiB4PSI4MDk2IiB5PSIzMzYwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4QU94bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeEEteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfVFFzeEJPeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hCZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeEJ1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4Qi14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeENPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9UUXN4Q2V4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeEN1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9UUXN4Qy14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeERPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9UUXN4RGV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeER1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVFFzeEQteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfVFFzeEFleG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9UUXN4QXV4bUVkdXdPYmtJQTZ4MWdBIiB4PSIxMzE0OCIgeT0iMzM4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0NuUTVrZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSXRodFFPeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgc291cmNlPSJfSXRodE1PeG1FZHV3T2JrSUE2eDFnQSIgdGFyZ2V0PSJfRTcwOU1PeG1FZHV3T2JrSUE2eDFnQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHRRLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRyZU1PeG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0cmVNZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0l0aHRST3htRWR1d09ia0lBNngxZ0EiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9JdGh0UWV4bUVkdXdPYmtJQTZ4MWdBIiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSXRodFF1eG1FZHV3T2JrSUE2eDFnQSIgcG9pbnRzPSJbMjkxLCAtMzE4LCAtMTUzNSwgMTYxNF0kWzEzNzYsIC0xNDU2LCAtNDUwLCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9JdHJlTXV4bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDNjgwMDkyIiBzb3VyY2U9Il9HQUZQZ094bUVkdXdPYmtJQTZ4MWdBIiB0YXJnZXQ9Il9JdGh0TU94bUVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRyZU5leG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdHJlTi14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRyZU9PeG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSXRyZU51eG1FZHV3T2JrSUE2eDFnQSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0l0cmVNLXhtRWR1d09ia0lBNngxZ0EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSXRyZU5PeG1FZHV3T2JrSUE2eDFnQSIgcG9pbnRzPSJbNTMsIC0zNDMsIDUzLCAyMDM4XSRbNTMsIC0yMDYzLCA1MywgMzE4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfT09QandleG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iX09PUGp3T3htRWR1d09ia0lBNngxZ0EiIHNvdXJjZT0iX0xlUUlZT3htRWR1d09ia0lBNngxZ0EiIHRhcmdldD0iX0U3MDlNT3htRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9PT1BqeE94bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX09PUGp4dXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9PT1BqeC14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9PT1BqeGV4bUVkdXdPYmtJQTZ4MWdBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfT09Qand1eG1FZHV3T2JrSUE2eDFnQSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX09PUGp3LXhtRWR1d09ia0lBNngxZ0EiIHBvaW50cz0iWy00MjMsIC0zNDQsIDI1NDAsIDIwMTFdJFstMjM1NSwgLTE4NzksIDYwOCwgNDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfV0VIVDBleG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iX1dFSFQwT3htRWR1d09ia0lBNngxZ0EiIHNvdXJjZT0iX1JxeDhFT3htRWR1d09ia0lBNngxZ0EiIHRhcmdldD0iX0U3MDlNT3htRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XRUhUMU94bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1dFSFQxdXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XRUhUMS14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9XRUhUMWV4bUVkdXdPYmtJQTZ4MWdBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfV0VIVDB1eG1FZHV3T2JrSUE2eDFnQSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1dFSFQwLXhtRWR1d09ia0lBNngxZ0EiIHBvaW50cz0iWy03OSwgLTMxNywgMTA4NSwgMzg5MF0kWy0xMDMyLCAtMzczMSwgMTMyLCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9XZVZ4c2V4bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfV2VWeHNPeG1FZHV3T2JrSUE2eDFnQSIgc291cmNlPSJfVFFzeEFPeG1FZHV3T2JrSUE2eDFnQSIgdGFyZ2V0PSJfRTcwOU1PeG1FZHV3T2JrSUE2eDFnQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1dlVnh0T3htRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfV2VWeHR1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1dlVnh0LXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1dlVnh0ZXhtRWR1d09ia0lBNngxZ0EiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9XZVZ4c3V4bUVkdXdPYmtJQTZ4MWdBIiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfV2VWeHMteG1FZHV3T2JrSUE2eDFnQSIgcG9pbnRzPSJbLTM0NCwgLTM0NCwgMzk5NSwgMzk2OV0kWy0zODYzLCAtMzgzNywgNDc2LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX1VSemxzT29XRWR1T0JQUUEyaEtxVVEiIGltcG9ydGVkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVBMDUwMDA4IiBuYW1lPSJTdGF0ZSI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFREYwMTEyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFQzIxMDJENSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d1eVpfZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d1eVpfT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyIgbmFtZT0icmVnaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERjFDNDAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREYwRDgwMTQwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUiIG5hbWU9InN1Ym1hY2hpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQzRFMDBCMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERjEzOTAxODYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVN2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVN09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBuYW1lPSJUcmFuc2l0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9XRUhUME94bUVkdXdPYmtJQTZ4MWdBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIiBuYW1lPSJ3b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDAzQyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d1N2owdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d1N2owZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSIgbmFtZT0iY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERjFDNDAzMzMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMDc4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTFlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTREIiBuYW1lPSJzb3VyY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUY4QjAxOUIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVM2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVM09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNUEiIG5hbWU9InRhcmdldCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRjk0MDNCQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU1T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU0LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDNEUwMEIzIiBuYW1lPSJTdGF0ZU1hY2hpbmUiPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzY4MDA5MiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSIgbmFtZT0icmVnaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERjFDNDAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREYxRkQwMTAwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTlPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTgtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiIG5hbWU9IlZlcnRleCI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfV2VWeHNPeG1FZHV3T2JrSUE2eDFnQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiIgbmFtZT0iY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERjFDNDAzMzMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMTY0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3U3ajJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3U3ajJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNDMiIG5hbWU9Im91dGdvaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUFDMzAxQTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVGOEIwMTlCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNTgiIG5hbWU9ImluY29taW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUFDMzAxQTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVGOTQwM0JCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTRlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzgxMDMyMyIgbmFtZT0iUHNldWRvU3RhdGUiPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRUUxMDM4QyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVEREMwMzE4IiBuYW1lPSJQc2V1ZG9TdGF0ZUtpbmQiPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERURGNjAyRUUiIG5hbWU9ImluaXRpYWwiLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFMzQwMjg5IiBuYW1lPSJqb2luIi8+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRTM5MDJDQyIgbmFtZT0iZm9yayIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUUzRTAxMUEiIG5hbWU9Imp1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRTQ0MDFFQiIgbmFtZT0iY2hvaWNlIi8+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRTQ5MDEzRSIgbmFtZT0iZW50cnlQb2ludCIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUU1MDAyOTMiIG5hbWU9ImV4aXRQb2ludCIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUU1NjAwODkiIG5hbWU9InRlcm1pbmF0ZSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBuYW1lPSJSZWdpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX09PUGp3T3htRWR1d09ia0lBNngxZ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTQiIG5hbWU9InZlcnRleCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDE2NCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d1N2oxLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d1N2oxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkY4IiBuYW1lPSJ0cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUFDMzAxQTUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMDc4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzRDYiIG5hbWU9InN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUEwNTAwMDgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREYwRDgwMTQwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU3IiBuYW1lPSJzdGF0ZU1hY2hpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQzRFMDBCMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERjFGRDAxMDAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVOS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDMjEwMkQ1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIgXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIiBuYW1lPSJzdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBMDUwMDA4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFQzIxMDJENSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMDNDIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IgXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1IiBuYW1lPSJ0cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUFDMzAxQTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMDNDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAxNjQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCBfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk2Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAwNzgiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGOCBfM0FEQzdCNzQwMjJENDJEREVFRjEwMkZBIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QjAxOUIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0MyBfM0FEQzdCNzQwMjJENDJEREVGOEMwMTREIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NDAzQkIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1OCBfM0FEQzdCNzQwMjJENDJEREVGOTUwMzVBIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEODAxNDAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyBfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzOTAxODYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM1RSBfM0FEQzdCNzQwMjJENDJEREYxM0EwMzYwIj4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNjAiIG5hbWU9InN1Yk1hY2hpbmVTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBMDUwMDA4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMTM5MDE4NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU4T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRDAxMDAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSBfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU3Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMDNCIiBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hd2JZcHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUZGREEyNTAwRkQiPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRkRBMjUwMEZEIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEREI2MDMwNiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Raay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWmxPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFptZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0Raa2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0Raa3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzgxIiB5PSI0NzQ5IiB3aWR0aD0iNDI4NCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFptdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREIzODAxMUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFpudWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0Raby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWm0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWm5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM4MSIgeT0iMTQ1MSIgd2lkdGg9IjQyODQiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tX1Q2Y094d0VkdU0xNHVuV2FxUDVRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUU5OTYwMDlEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1fVDZjLXh3RWR1TTE0dW5XYXFQNVEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il8tX1Q2ZE94d0VkdU0xNHVuV2FxUDVRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tX1Q2ZGV4d0VkdU0xNHVuV2FxUDVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tX1Q2ZHV4d0VkdU0xNHVuV2FxUDVRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tX1Q2ZC14d0VkdU0xNHVuV2FxUDVRIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1fVDZlT3h3RWR1TTE0dW5XYXFQNVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLV9UNmVleHdFZHVNMTR1bldhcVA1USIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXy1fVDZjZXh3RWR1TTE0dW5XYXFQNVEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy1fVDZjdXh3RWR1TTE0dW5XYXFQNVEiIHg9IjE0NTMiIHk9IjgwNDEiIHdpZHRoPSI0Mjg0IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemdPeHhFZHVNMTR1bldhcVA1USIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6Zy14eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfTEFxemhPeHhFZHVNMTR1bldhcVA1USIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemhleHhFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemh1eHhFZHVNMTR1bldhcVA1USIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemgteHhFZHVNMTR1bldhcVA1USIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6aU94eEVkdU0xNHVuV2FxUDVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0xBcXppZXh4RWR1TTE0dW5XYXFQNVEiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9MQXF6Z2V4eEVkdU0xNHVuV2FxUDVRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9MQXF6Z3V4eEVkdU0xNHVuV2FxUDVRIiB4PSI3MzU0IiB5PSI4MDQwIiB3aWR0aD0iNDI4NCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd2JZcU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBMaWJyYXJ5IHBhY2thZ2UgZGVmaW5lcyBjYXBhYmlsaXRpZXMgYXJvdW5kIG1hbmFnaW5nIHdob2xlIGxpYnJhcmllcyBvZiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiAgSXQgYWRkcmVzc2VzIHJlcXVpcmVtZW50cyBhcm91bmQgcGh5c2ljYWxseSBzZXBhcmF0aW5nIGRlc2NyaXB0aW9ucyBvZiBDb250ZW50IEVsZW1lbnRzIGZyb20gdGhlaXIgbW9kZWxlZCByZWxhdGlvbnNoaXBzIGRlZmluaW5nIHNlcGFyYXRlIHVuaXRzIG9mIGNvbnRyb2wuICBJdCBhbHNvIGFkZHJlc3NlcyB0aGUgY29uY2VybiBvZiBzY2FsaW5nIHRvIGxhcmdlIE1ldGhvZCBMaWJyYXJpZXMgYnkgZGVmaW5pbmcgTWV0aG9kIENvbmZpZ3VyYXRpb25zIHRoYXQgZGVmaW5lIHZpc2liaWxpdHkgc3BhY2VzIG9yIHdvcmtpbmcgc2V0cyBmb3IgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgYWxsb3dpbmcgYSBQcm9jZXNzIEVuZ2luZWVyIHRvIGZvY3VzIG9uIHJlbGV2YW50IHBhcnRzIG9mIExpYnJhcnkgaW5zdGVhZCBvZiBzZWVpbmcgdGhlIHdob2xlIGxpYnJhcnkgYWxsIGF0IG9uY2UuICBCeSBkZWZpbmluZyBDb25maWd1cmF0aW9ucyBhcyBzdWJzZXRzIG9mIFBsdWdpbnMgYW5kIE1ldGhvZCBQYWNrYWdlcyB0aGF0IHNoYWxsIGJlIGNvbnNpZGVyZWQgZm9yIHByb2Nlc3MgYXV0aG9yaW5nIG9ubHksIENvbmZpZ3VyYXRpb25zIGFsc28gZGVmaW5lIHRoZSBzcGFjZSBvZiB2YXJpYWJpbGl0eSBpbnRlcnByZXRhdGlvbiB0byBhdm9pZCBjb25mbGljdHMgYW1vbmdzdCAnY29tcGV0aW5nJyBjb250ZW50IChlLmcuIGNvbnRlbnQgdGhhdCByZXBsYWNlcyB0aGUgc2FtZSBlbGVtZW50cykuIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfQV9fX29leE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0FfX19vT3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hLRFptdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFprT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQV9fX3BPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQV9fX3B1eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BX19fcU94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19wLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9BX19fcGV4TUVkdU9Ock1SZ216NDhBIiB5PSItNTMwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9BX19fb3V4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0FfX19vLXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWy0xNCwgODYwLCAtMTQsIC0yNDM1XSRbLTE0LCAyNDQ4LCAtMTQsIC04NDddIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0xBcXprZXh4RWR1TTE0dW5XYXFQNVEiIGVsZW1lbnQ9Il9HTmtCOE94U0VkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IS0Raa09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9MQXF6Z094eEVkdU0xNHVuV2FxUDVRIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpsT3h4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpsdXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxem1PeHhFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6bC14eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTEFxemxleHhFZHVNMTR1bldhcVA1USIgeD0iNDI0IiB5PSItNjQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9MQXF6a3V4eEVkdU0xNHVuV2FxUDVRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0xBcXprLXh4RWR1TTE0dW5XYXFQNVEiIHBvaW50cz0iWy0xNCwgODQ2LCAtMjk3NywgLTI0NDddJFsyOTUwLCAyNDMzLCAtMTMsIC04NjBdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JjcWZNZXgwRWR1NS12VmpsZlZzZlEiIGVsZW1lbnQ9Il9SY3FmTU94MEVkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Il9IS0Raa09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il8tX1Q2Y094d0VkdU0xNHVuV2FxUDVRIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JjenBJT3gwRWR1NS12VmpsZlZzZlEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JjenBJdXgwRWR1NS12VmpsZlZzZlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUmN6cEpPeDBFZHU1LXZWamxmVnNmUSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SY3pwSS14MEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUmN6cElleDBFZHU1LXZWamxmVnNmUSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfUmNxZk11eDBFZHU1LXZWamxmVnNmUSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9SY3FmTS14MEVkdTUtdlZqbGZWc2ZRIiBwb2ludHM9IlstMjMsIDMyLCA4OCwgLTkyXSRbLTg3LCAxNTcsIDI0LCAzM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkRENTUxMDM3QyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RacmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0Rac2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rac3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Racy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0Radk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFpydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFpyLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTIwIiB5PSIxMDE2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFp3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDcyIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWngtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp6T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWnZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWnYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzA4MSIgeT0iMzQzNyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFoyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0RaMnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFozdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFozLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaNWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFoxLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFoyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzU0IiB5PSI1NzgyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU3NTAwNEUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFo2dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo5ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWjUtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWjZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwMyIgeT0iNzk2NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05La09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFODAwMjUyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS05LbE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQzNyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkttT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkttZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkttdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkttLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05Lbi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTktrZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTktrdWZYRWR1cUhvT0piVVJaUnciIHg9IjI1OTkiIHk9IjU3ODIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOS3JlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIyMTgiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lc2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05Lc3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LdE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LdGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LdHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3VPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05LcXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgyOCIgeT0iMzQ0NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LdWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS05LdmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Ldi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Ld09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LeU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTkt1dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTkt1LWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MDM5IiB5PSIzNDcxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkswdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTksxdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOSzItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOSzNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOSzMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTks0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtOSzAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOSzFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzU5NCIgeT0iNTc4MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS05LLU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc0MyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkxBZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05MQS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTks5ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTks5dWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTA2IiB5PSI1NzgyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd2JZcXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtEWnplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODkxMDNBRCIgc291cmNlPSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWnJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFowLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWjBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtEWnp1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS0Raei1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMjM2LCAtMzA0LCAtODkyMywgMjA4Ml0kWzg1OTMsIC0yMDMyLCAtMTU2NiwgMzU1XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtEWjFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS0RaMWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtEWjl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM1MDNBMSIgc291cmNlPSJfSEtEWjV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWi11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtEWjktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS0RaLU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTMzLCAtNTI0LCA0MDM4LCAzOTk2XSRbLTQwMzgsIC0zOTk2LCA1MzMsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLRFpfZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtEWl91ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTktvT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDOTAxOTQiIHNvdXJjZT0iX0hLTktrT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTktwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTktvZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOS291ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTgxMV0kWzAsIC0xODExLCAwLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LcC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTktxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05LeWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjYzIiBzb3VyY2U9Il9IS0RaMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS05LdWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05LeXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTkt5LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE4MTFdJFswLCAtMTgyMCwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LMGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOSzR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkZERjgyMDE2NiIgc291cmNlPSJfSEtOSzB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOSzV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOSzQtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05LNU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTEyNiwgLTUyNCwgMzk1MywgMTgxMV0kWy0zOTM3LCAtMTgxMSwgMTE0MywgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LNnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOSzYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNTE4QzkzMDA4RiIgc291cmNlPSJfSEtOSzB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtOS3FlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOSzctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOSzdPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05LN2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1NTgsIC01MjQsIC0xOTgxLCAxODExXSRbMTk2NCwgLTE4MjAsIC01NzUsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTks4dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTkxEZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBREMwMTAyOEQiIHNvdXJjZT0iX0hLTks5T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFpyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTkxFZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTkxEdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOTEQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgNDE5OV0kWzAsIC00MTY1LCAwLCA1NThdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05MRk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTkxGZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05MRnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI1MThCRDcwMUUzIiBzb3VyY2U9Il9IS05LOU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS05LcWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05MR3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05MRi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTkxHT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01NjcsIC01MjQsIDE5NzIsIDE4MTFdJFstMTk4MSwgLTE4MjAsIDU1OCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOTEhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05MSHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZQRjJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDAzQiI+Ci0gICAgICAgICAgPGJvZHk+MDQ8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURCMzgwMTFFIiBuYW1lPSJMaWJyYXJ5Q29uZmlndXJhdGlvbnMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3Ytc3h1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGMzZEN0IwMzA1Ij4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZEN0IwMzA1IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeUFuZENvbmZpZ3VyYXRpb25zIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkEzeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTN5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTN5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTN6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkEzd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTN3dWZYRWR1cUhvT0piVVJaUnciIHg9IjEwODMiIHk9IjM4MTAiIHdpZHRoPSIzNzI1IiBoZWlnaHQ9IjIzMzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkEzMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkEzMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTMwdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MzkiIHk9IjkxMjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRBLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkE0Qi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Qy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRET2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0RGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTREdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0RC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRFT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0RWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkE0Qk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRCZWZYRWR1cUhvT0piVVJaUnciIHg9IjUwMDUiIHk9Ijk5IiB3aWR0aD0iNTEzMCIgaGVpZ2h0PSIyMjI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0TnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNE91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0UC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0UWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0US1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFJlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNE4tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0T09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTk4NSIgeT0iNzQ1OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTRTdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRWZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTRSLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNFNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ3NCIgeT0iMTA5MzAiIHdpZHRoPSI0MTIzIiBoZWlnaHQ9IjExMDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkE0V3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0WHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0JzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0JzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkE0Vi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRXT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwMzM2IiB5PSIzODEwIiB3aWR0aD0iNDQ2NiIgaGVpZ2h0PSIyMzM2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3Ytc3lPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb25zIHBhY2thZ2UgYWRkcyBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBQbHVnaW5zIGFuZCBzY2FsaW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBhdXRob3Jpbmcgd29yay4gIEl0IGRlZmluZXMgdGhlIGtleSBjb25jZXB0IG9mIExpYnJhcnkgd2hpY2ggY29tcHJpc2VzIG9mIE1ldGhvZCBQbHVnaW5zIGFzIHdlbGwgYXMgTWV0aG9kIENvbmZpZ3VyYXRpb25zLiAgQSBMaWJyYXJ5IHJlcHJlc2VudHMgdGhlIG92ZXJhbGwgcGh5c2ljYWwgY29udGFpbmVyIGZvciBhbGwgTWV0aG9kIEVsZW1lbnRzLiAgTGlicmFyaWVzIHJlcHJlc2VudCBhIHNlcGFyYXRlIE1ldGhvZCAndW5pdmVyc2UnLCBpLmUuIGEgTWV0aG9kIExpYnJhcnkgY2Fubm90IHJlZmVyZW5jZSBlbGVtZW50cyBmcm9tIGFub3RoZXIgTWV0aG9kIExpYnJhcnkuICBBIENvbmZpZ3VyYXRpb24gaXMgYSBzdWJzZXQgb2YgUGx1Z2lucyBhbmQgTWV0aG9kIFBhY2thZ2VzLCBpLmUuIHNlbGVjdGlvbnMgb2YgTWV0aG9kIFBsdWdpbnMgd2l0aCBhIHNlbGVjdGVkIHN1YnNldCBvZiBNZXRob2QgUGFja2FnZXMuICBUaGV5IGFyZSB1c2VkIHRvIGRlZmluZSB3b3JraW5nIHNldHMgZm9yIHByb2Nlc3MgYXV0aG9yaW5nIHByb3ZpZGluZyBhIHByb2Nlc3MgZW5naW5lZXIgb25seSB3aXRoIGxpc3RzIG9mIGVsZW1lbnRzIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHByb2Nlc3Mgd2l0aGluIHN1Y2ggYSBDb25maWd1cmF0aW9uLiAgQ29uZmlndXJhdGlvbnMgYWxzbyBkZWZpbmUgdGhlIHNwYWNlIG9mIHZhcmlhYmlsaXR5IGludGVycHJldGF0aW9uIHRvIGF2b2lkIGNvbmZsaWN0cyBhbW9uZ3N0ICdjb21wZXRpbmcnIGNvbnRlbnQgKGUuZy4gY29udGVudCB0aGF0IHJlcGxhY2VzIHRoZSBzYW1lIGVsZW1lbnRzKSBhcyB3ZWxsIGFzIGRlZmluZSBzZXRzIG9mIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMgZm9yIGV4cG9ydCBhbmQgZGlzdHJpYnV0aW9uLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISkEzNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1IiBzb3VyY2U9Il9ISkEzME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkEzd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTM1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NCIgeT0iLTM5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYwIiB5PSIxNjI2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM3dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzgiIHk9Ii0yNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ2IiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzOU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzLU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMy0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTNfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTNfdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTNfT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0QWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRBT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISkEzNGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKQTM0dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU5LCAtNTc1LCA1OSwgNDE0OF0kWzU5LCAtMzU2NCwgNTksIDExNTldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISkE0RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIiBzb3VyY2U9Il9ISkEzd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0QS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0Ry1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA0IiB5PSItMTY5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTcwIiB5PSIxMzgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNElPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0SWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI3IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNExlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0TU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0TWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0TC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0TmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0TS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpBNEZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISkE0RmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MywgLTExNjgsIC00NDc4LCAyMzM2XSRbOTMsIC0zMzc4LCAtNDQ3OCwgMTI3XSRbMjAwNiwgLTMzNzgsIC0yNTY1LCAxMjddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktCdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1IiBzb3VyY2U9Il9ISkEzd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKS0J1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCdnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTg1IiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzkwIiB5PSIyMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQnhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk2IiB5PSItMTE4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J4LWZYRWR1cUhvT0piVVJaUnciIHg9IjI5NiIgeT0iMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQnl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQnp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCMU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCMHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCMXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQnQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktCdU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODYyLCA2MDEsIC03ODQwLCA2MDFdJFs3ODQwLCA2MDEsIC0xODYyLCA2MDFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktCMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1IiBzb3VyY2U9Il9ISkEzME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKS0IzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODQwIiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I1T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg1MyIgeT0iLTIwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTYxIiB5PSItMTYwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I2dWZYRWR1cUhvT0piVVJaUnciIHg9IjUwMSIgeT0iMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCOS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQjJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktCMi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTA3LCAtMTUyLCAtODE5NSwgNDU3Ml0kWzgwNTEsIC0xNTIsIC0xNjUxLCA0NTcyXSRbODA1MSwgLTM1NTYsIC0xNjUxLCAxMTY4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQl9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiIgc291cmNlPSJfSEpBNEEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0JfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktDQU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NCT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3IiB5PSIxNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjUiIHk9Ii0yMjM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ0V1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0VPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ0Z1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDR3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDR09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDSHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDSE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQl9lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktCX3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNTY1LCAxMDEsIC0yNTY1LCAtMzQwM10kWzUwNDYsIDEwMSwgLTg0LCAtMzQwM10kWzUwNDYsIDIzMzYsIC04NCwgLTExNjhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktDSC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0TnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKS0NJLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDSi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA4IiB5PSIyMjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NLdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDgiIHk9Ii0xMzU1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NMZWZYRWR1cUhvT0piVVJaUnciIHg9IjQyMCIgeT0iLTE2OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjgiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NOZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NNLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NPZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NOLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1BlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ08tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1AtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0NJT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQ0llZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTI0NCwgMTE2NCwgLTMwOTUsIC0xNjE0XSRbMTI0NCwgMjY0NiwgLTMwOTUsIC0xMzJdJFszNDEzLCAyNjQ2LCAtOTI2LCAtMTMyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQ1F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNE51ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktDUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2NSIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzOTUiIHk9Ii0yMjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1VPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjIxIiB5PSIxNTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1UtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY1IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDV09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDVnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDWE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDV3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NYdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NaT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NZdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktDUS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0NST2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NjIsIDM2NCwgLTMyNjgsIC0yNjMzXSRbNTA3MSwgMzY0LCAtNTksIC0yNjMzXSRbNTA3MSwgMjQ4MCwgLTU5LCAtNTE2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQ1plZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTUyMDNCMCIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISlR5c2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMyIiB5PSItMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5dWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5dS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjc5IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM0IiB5PSItMTQ5MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHl3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5eE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHl4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5eU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeXotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0NadWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQ1otZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0MDUsIC0xMTY4LCAtMTQwNSwgLTExNjhdJFstMTQwNSwgLTE5ODksIC0xNDA1LCAtMTk4OV0kWy0zNDk2LCAtMTk4OSwgLTM0OTYsIC0xOTg5XSRbLTM0OTYsIC0zODksIC0zNDk2LCAtMzg5XSRbLTE4NjIsIC0zODksIC0xODYyLCAtMzg5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUeTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NiIgc291cmNlPSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISlR5MU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzIiB5PSIxNzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHkyLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjkiIHk9IjEyNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5M2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU3IiB5PSItMTQzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk0ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIzMCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5Ni1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeTd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeTh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeThPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKVHkwZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpUeTB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDIzLCAtNTU4LCAtNjk0LCA1OTQzXSRbNDIzLCAtNTM0MiwgLTY5NCwgMTE1OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKVHk4LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFDRDAxOEIiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5LWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUeTktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHktdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHktLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNTUiIHk9IjE0NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHlfdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0NCIgeT0iMTk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIwIiB5PSI5OTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Q09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Q2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Qi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6RGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Qy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpFZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpELWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Rk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpFLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISlR5OU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKVHk5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTQzLCAxMTU5LCAtMjUsIC01MzQyXSRbLTExNDMsIDU5NDMsIC0yNSwgLTU1OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKVHpGdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3QzAzNTMiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUekd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpIdWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MjQiIHk9Ii0yMDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6SWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpKT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NiIgeT0iOTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Si1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDkwIiB5PSItNTg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUektlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUek1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Tk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6TXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUek5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUek4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6T09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6TnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUekYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISlR6R09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0MiwgMTE2OCwgMTE1OSwgLTUzMzRdJFs0MiwgNTA4MCwgMTE1OSwgLTE0MjJdJFsyMjE4LCA1MDgwLCAzMzM1LCAtMTQyMl0kWzIyMTgsIDYxODAsIDMzMzUsIC0zMjFdJFs5MzksIDYxODAsIDIwNTcsIC0zMjFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISlR6T2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkEwMzE3IiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHpQZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Ui1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjYxIiB5PSIxNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzQiIHk9IjI2NTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6VC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6VGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6VS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6VWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpWZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISlR6T3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKVHpPLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcxMSwgMTE2OCwgMTgyOCwgLTUzMzRdJFs3MTEsIDQzMzQsIDE4MjgsIC0yMTY3XSRbMzg1MiwgNDMzNCwgNDk2OSwgLTIxNjddJFszODUyLCA2NzM5LCA0OTY5LCAyMzddJFs5MzksIDY3MzksIDIwNTcsIDIzN10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzZBM0VDMDAyNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NGYW1pbHkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKZGp0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKZGpzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkanN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY4IiB5PSI5MTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISmRqeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISmRqd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGp3dWZYRWR1cUhvT0piVVJaUnciIHg9IjkxMTAiIHk9IjM3NzYiIHdpZHRoPSIzMjgyIiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGowT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISmRqMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGoyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGoyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGozZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISmRqMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGowdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMjQiIHk9IjM4NjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd0gyb2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGhvdyBwcm9jZXNzZXMgYXJlIHBhY2thZ2VkIGluIG1ldGhvZGxpYnJhcnkgYW5kIHJlbGF0ZWQgdG8gY29uZmlndXJhdGlvbnMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKZGo0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiIHNvdXJjZT0iX0hKZGp3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKZGowT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRqNU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjk5IiB5PSItMzMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkajZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1IiB5PSIyMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo2LWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDkiIHk9Ii0yMjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkajd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM5IiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkajhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2OSIgeT0iMjMwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkajlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkai1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkai11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkai1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGotLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqX09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkal8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpka0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRrQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRrQU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpkajRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISmRqNHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQ1NiwgMzMsIDY2NzEsIDMzXSRbLTY3MTQsIDMzLCAxNDEzLCAzM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKZGtBLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjMiIHNvdXJjZT0iX0hKZGowT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKZGpzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRrQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGtDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRrQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpka0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKZGtCT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpka0JlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgLTUwLCAyNDg5XSRbMCwgLTI0ODksIC01MCwgNDU3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISmRrQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEpka0MtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZZUHktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEQjM4MDExRSI+Ci0gICAgICAgICAgICA8Ym9keT4wMjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0FfX19vT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2WVAzT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NTY1QkIxMDE1RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZpQTFPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZpQTAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4IiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeHhlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4IiBuYW1lPSJwcm9jZXNzVmlld3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3emVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3ek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSIgbmFtZT0iZGVmYXVsdFZpZXciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEyOTFDRDAxOEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3MGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3ME9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTciIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzZDRTUyMDNCMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN0dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU4RUY3QzAzNTMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zdmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZBMDMxNyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN4T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiIG5hbWU9IlByb2Nlc3NGYW1pbHkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdllQNE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2MyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdnJ4ei1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdnJ4enVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIiBuYW1lPSJQcm9jZXNzIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZpQXctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb2Nlc3MgaW4gdGhlIHBhY2thZ2UgTGlicmFyeSBDb25maWd1cmF0aW9uIGV4dGVuZHMgdGhlIGNsYXNzIFByb2Nlc3Mgd2l0aCBhc3NvY2lhdGlvbiByZWxhdGluZyBhIFByb2Nlc3MgdG8gb25lIGRlZmF1bHQgYW5kIG1hbnkgb3B0aW9uYWwgdmFsaWQgQ29uZmlndXJhdGlvbnMuCi1UaGVzZSBjb25maWd1cmF0aW9ucyBkZXNjcmliZSB2YWxpZCBjb250ZXh0cyBmb3IgdGhlIFByb2Nlc3Mgd2l0aGluIGEgTWV0aG9kIExpYnJhcnkgaW5kaWNhdGluZyB1bmRlciB3aGljaCBDb25maWd1cmF0aW9ucyBhIFByb2Nlc3MgaXMgd2VsbCBkZWZpbmVkLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd2ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd2T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCIgbmFtZT0idmFsaWRDb250ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3h1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSIgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2aUF4LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZGREY4MjAxNjYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjAwNjBDRTAzMzciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjUxOEM5MzAwOEYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdnJ4MXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdnJ4MWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3MtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdmlBemVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2aUEwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2aUEwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZpQTF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgc2VsZWN0aW9uIG9mIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdnJ4dy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdnJ4d3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2cnh5T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiPgotICAgICAgICAgICAgICA8Ym9keT5EZWxpdmVyeSBQcm9jZXNzIGNhbiBiZSBvcmdhbml6ZWQgaW4gbWFueSBQcm9jZXNzIEZhbWlsaWVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSIgbmFtZT0icHJvY2Vzc0ZhbWlsaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeHktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdnJ4MGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBwaHlzaWNhbGx5IGNvbXByaXNlcyBvZiBNZXRob2QgUGx1Z2lucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiIG5hbWU9Il9tZXRob2RMaWJyYXJ5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSBfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZyeDJPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgc3RvcmVzIGEgc2V0IG9mIHByZWRlZmluZWQgTWV0aG9kIENvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHJlZ3VsYXJseSB1c2VkIGJ5IHRoZSBsaWJyYXJ5IGF1dGhvcnMgKGUuZy4gdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgdGhleSBzaGlwIHRvIHRoZWlyIHVzZXJzKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiIG5hbWU9Il9tZXRob2RMaWJyYXJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIF8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdjA3dHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGhhcyBleGFjdGx5IG9uIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB0aGUgY29uZmlndXJhdGlvbiBpbiB3aGljaCB0aGUgcHJvY2VzcyBoYXMgYmVlbiBjcmVhdGVkLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd1dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiBfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3YwN3YtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBjYW4gaGF2ZSBtYW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgdG8gYWxzbyBwcm9kdWNlIHZhbGlkIHJlc3VsdHMuICBQcm9jZXNzIEVsZW1lbnRzIChlLmcuIERlc2NyaXB0b3JzKSB0aGF0IHJlZmVyIHRvIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBzdWNoIGEgY29uZmlndXJhdGlvbiB3b3VsZCBub3QgYmUgc2hvd24gaW4gdGhlIHByb2Nlc3Mgd2hlbiBwdWJsaXNoZWQgb3IgdXNlZCB1bmRlciBzdWNoIGEgY29uZmlndXJhdGlvbi4gIFRoaXMgYWxsb3dzIHRvIGVhc2lseSByZW1vdmUgY29udGVudCBmcm9tIGEgcHJvY2VzcyBieSByZW1vdmluZyBjb250ZW50IHBhY2thZ2VzIHRvIGZyb20gdGhlIHJlbGF0ZWQgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3dy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3d3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTcgXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3l1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI5MUNEMDE4QiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1IF8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI5MUNEMDE4QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXNzT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDcwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBNyBfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Ytc3N1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTUyMDNCMCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoZSBkZWZpbml0aW9uIG9mIGEgY29uZmlndXJhdGlvbiBjYW4gYmUgYmFzZWQgb24gdGhlIGRlZmluaXRpb25zIG9mIG90aGVyIGNvbmZpZ3VyYXRpb25zLiAgRm9yIGV4YW1wbGUsIGEgY29uZmlndXJhdGlvbiBBIGNvdWxkIGJlIGRlZmluZWQgYXMgdGhlIHN1cGVyc2V0IG9mIGNvbmZpZ3VyYXRpb25zIEIsIEMsIGFuZCBEIHBsdXMgYWRkIG1vcmUgc2VsZWN0ZWQgUGx1Z2lucyBhbmQgUGFja2FnZXMuICBJbiBzdWNoIGEgY2FzZSBBIHdvdWxkIGxpc3QgQiwgQywgYW5kIEQgYXMgaXRzIGJhc2VDb25maWd1cmF0aW9ucy4gIElmIGFueSBvZiB0aGVzZSBiYXNlIGNvbmZpZ3VyYXRpb25zIGNoYW5nZXMgYWxsIHVwZGF0ZXMgd291bGQgYmUgYXV0b21hdGljYWxseSB2YWxpZCBmb3IgQSBhcyB3ZWxsIHJlZHVjaW5nIG1haW50YWluYWJpbGl0eSBvdmVyaGVhZCBmb3Igb3ZlcmxhcHBpbmcvZGVwZW5kZW50IGNvbmZpZ3VyYXRpb25zLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zdWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIgXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3dPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZBMDMxNyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIF8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZBMDMxNyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEREI2MDMwNiIgbmFtZT0iTWV0aG9kVW5pdHMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3diWW8tZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFGRURFMDkwM0IwIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFMDkwM0IwIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlb09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNzUwMDRFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZW8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZXBPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NzMiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2VxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2VxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2VyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndlb2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2VvdWZYRWR1cUhvT0piVVJaUnciIHg9IjU4ODciIHk9IjYwMDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU4MDAyNTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndldE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2VzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEp3ZXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAyMiIgeT0iNjAwNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKd2U3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZTh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZTlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZTl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2UtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2U2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEp3ZTYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk4NCIgeT0iMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlLWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTQ3RTUwMTc4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZV9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzODYiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmQ09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndlLXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2UtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MTEiIHk9IjYwMDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZFdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndmRnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzMxOCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndmRS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2ZGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyMCIgeT0iMjk4OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKNlBxdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTM4IiBoZWlnaHQ9IjI0MjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlByT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEo2UHAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTc5IiB5PSIyMzQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRRnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEo2UUd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UUplZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEo2UUYtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZRR09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzAzMCIgeT0iNTkzNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUwtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKNlFNLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UU9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UU91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UVBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFQdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKNlFNT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UU1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY4NDAiIHk9IjU5MzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd2JZcGVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifE1ldGhvZCBhbmQgUHJvY2VzcyBBdXRob3JpbmcgaXMgbm90IGRvbmUgaW4gaXNvbGF0aW9uIGJ5IGEgc2luZ2xlIHByb2Nlc3MgZW5naW5lZXIuICBFc3BlY2lhbGx5LCB3aGVuIGxhcmdlIHNjYWxlIE1ldGhvZCBMaWJyYXJpZXMgc2hhbGwgYmUgbWFpbnRhaW5lZCBpdCBpcyBpbXBvcnRhbnQgdG8gZGVmaW5lIHRoZSByaWdodCBtb2R1bGFyaXphdGlvbiBwcmluY2lwbGVzIHRoYXQgYWxsb3cgY29uY3VycmVudCBkZXZlbG9wbWVudCBvZiBsYXJnZSBzY2FsZSBwcm9jZXNzIGVuZ2luZWVyaW5nIHRlYW1zLiAgTWV0aG9kIFBsdWdpbnMgd2VyZSBhIGZpcnN0IHN0ZXAgb2YgbW9kdWxhcml6YXRpb24uICBIb3dldmVyLCBldmVuIHdvcmtpbmcgd2l0aCBNZXRob2QgUGx1Z2lucyBjYW4gb25seSBzY2FsZSBpbiBsaW1pdGVkIHdheXMgc3VwcG9ydGluZyBvbmx5IHZlcnkgc21hbGwgYXV0aG9yaW5nIHRlYW1zLiAgRm9yIGxhcmdlciBzY2FsZSBtZXRob2QgbGlicmFyaWVzIGNvbmN1cnJlbnQgYWNjZXNzIGFuZCB3b3JraW5nIGV2ZW4gd2l0aGluIGEgTWV0aG9kIFBsdWdpbiBpcyByZXF1aXJlZC4gIFRvIGFkZHJlc3MgdGhlc2UgcmVxdWlyZW1lbnRzIHRoZSBNZXRob2QgVW5pdHMgcGFja2FnZSBleHRlbmRzIE1ldGhvZCBFbGVtZW50cyB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIGEgbmV3IGNhcGFiaWxpdHkgZGVmaW5lZCBhcyBNZXRob2QgVW5pdC4gIEEgTWV0aG9kIFVuaXQgaXMgYSB1bml0IG9mIGNvbnRyb2wgdGhhdCBjYW4gYmUgd29ya2VkIG9uIGJ5IG9uZSBwcm9jZXNzIGVuZ2luZWVyIGFuZCBjYW4gc2VydmUgYXMgb25lIHVuaXQgb2YgdmVyc2lvbiBjb250cm9sLiYjeEE7fFRoZSBkaWFncmFtIHNob3dzIHRoYXQgZm91ciB0eXBlcyBvZiBNZXRob2QgVW5pdHMgaGF2ZSBiZWVuIGRlZmluZWQuICBDb250ZW50IERlc2NyaXB0aW9uIHJlcHJlc2VudGluZyBhbGwgbWFqb3IgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2ssIEFydGlmYWN0LCBHdWlkZWxpbmUsIG9yIFdoaXRlcGFwZXIgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4gIFdoZXJlYXMgZXZlcnkgQ29udGVudCBFbGVtZW50J3MgQ29udGVudCBEZXNjcmlwdGlvbiBjYW4gYmUgc2VlbiBhcyBhbiBlbGVtZW50IHRoYXQgY2FuIGJlIG1haW50YWluZWQgaW4gaXNvbGF0aW9uLCBQcm9jZXNzZXMgYXJlIGtlcHQgYW5kIG1hbmFnZWQgYXMgYSB3aG9sZS4gIElmIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBuZWVkcyB0byBiZSBzcGxpdCBhbmQgaGFuZGxlZCBhcyBzZXBhcmF0ZSB1bml0cyBvZiBjb250cm9sIHRoZW4gbmV3IHByb2Nlc3NlcyBzdWNoIGFzIENhcGFiaWxpdHkgUGF0dGVybnMgd2lsbCBiZSBjcmVhdGVkIGZvciBzdWNoIGEgcmVmYWN0b3JpbmcuICBIZW5jZSwgZXhhY3RseSBvbmUgaW5zdGFuY2Ugb2YgUHJvY2VzcyBzaGFsbCBiZSBzdG9yZWQgaW4gYW4gaW5zdGFuY2Ugb2YgUHJvY2VzcyBDb21wb25lbnQsIHdoaWNoIGlzIGRlZmluZWQgdG8gYmUgdGhlIGNvbnRhaW5lciBmb3IgYSBQcm9jZXNzIGFuZCB0aGVyZWZvcmUgaXRzIE1ldGhvZCBVbml0LiAgRmluYWxseSwgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBMaWJyYXJpZXMgYXJlIGRlZmluZWQgYXMgTWV0aG9kIFVuaXRzLiAgV2hlcmVhcywgdGhlIGZvcm1lciBzdG9yZXMgYWxsICdtb2RlbGVkJyBlbGVtZW50cyBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHN1Y2ggYXMgYWxsIENvbnRlbnQgRWxlbWVudHMgKG9ubHkgdGhlIGRlc2NyaXB0aW9uIGNsYXNzZXMgYXJlIG1haW50YWluZWQgYXMgc2VwYXJhdGUgdW5pdHMpLCB0aGUgbGF0ZXIgZGVmaW5lcyBhIE1ldGhvZCBVbml0IHRvIHN0b3JlIHJlZmVyZW5jZXMgdG8gdGhlIE1ldGhvZCBQbHVnaW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIExpYnJhcnkgYXMgd2VsbCBhcyBNZXRob2QgQ29uZmlndXJhdGlvbnMuJiN4QTsiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UHR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM1MDNBMSIgc291cmNlPSJfSEp3ZW9PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UHQtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlB1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIwMywgLTQ1NywgLTExMTcsIDIzODddJFs3NDUsIC0xNjM0LCAtNTc1LCAxMjEwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQdmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQdi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzkwMTk0IiBzb3VyY2U9Il9ISndlc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlB3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQd09mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UHdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI5NiwgLTQ1NywgMTQ4MSwgMjM4N10kWy0xMDMyLCAtMTYzNCwgNzQ1LCAxMjEwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQeHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQeU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4OTEwM0FEIiBzb3VyY2U9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISndlNmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlB6T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQeWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UHl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI1LCAtMTIxOSwgMjUsIDE2MjVdJFstNTAsIC0yMzE5LCAwLCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB6LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQME9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlAwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NDgwMDAxQUUiIHNvdXJjZT0iX0hKd2UtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UDFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlAwdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQMC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MDIsIC00NTcsIC0zNzY3LCAyMzg3XSRbMjU1NiwgLTE2MzQsIC0xOTEzLCAxMjEwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UDJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQMnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIiBzb3VyY2U9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISndmRXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlAzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY0IiB5PSItMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQiIHk9Ii0yODkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMwMCIgeT0iMjIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UDhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UDlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQOXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UC0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQX09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQLXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UDItZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQM09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjI2OSwgLTUwLCA1MzAwLCAwXSRbLTU5MDksIC01MCwgMTY1OSwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlFKdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZGREY4MjAxNjYiIHNvdXJjZT0iX0hKNlFGdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UUt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlFKLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZRS09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTU2LCAtNTI0LCA0NDI4LCAyMzcwXSRbLTMxMTUsIC0xNjg0LCAyMjY5LCAxMjEwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRTGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UUx1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZRUC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1NjVCQjEwMTVGIiBzb3VyY2U9Il9ISjZRTC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UVJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlFRLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZRUU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UVFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE2MTcsIC01MjQsIDc1NzcsIDIzNzBdJFstNjkyNSwgLTIxODQsIDIyNjksIDcxMV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UVJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlFSLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3SDJwZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiPgotICAgICAgICAgICAgPGJvZHk+MDE8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9HTmtCOE94U0VkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIi8+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9SY3FmTU94MEVkdTUtdlZqbGZWc2ZRIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDE1MUU5OTYwMDlEIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFREU3NTAwNEUiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRUUwQzUwM0ExIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFREU4MDAyNTIiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM5MDE5NCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1IiBuYW1lPSJNZXRob2RVbml0IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dIMnMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEODkxMDNBRCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1QiIgbmFtZT0iYXV0aG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd0gydC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDVCIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNWRHTkVleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNWRHTkVPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNVVUZGNPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNjQiIG5hbWU9ImNoYW5nZURhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dSbm91ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2NCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9VWi1ROGV5TUVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9VWi1ROE95TUVkdUZLSm92Qkw2NFhRIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2RSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dSbnBlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2RSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX05HZTVZZXlGRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX05HZTVZT3lGRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX085WlhzT3lGRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDZGIiBuYW1lPSJ2ZXJzaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5xT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkYiPgotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3NXVFY4ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3NXVFY4T3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3NNVTZrT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkE3RDUyRjAyNDMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hd2JZb2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hd2JZb09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTQ3RTUwMTc4IiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk0ODAwMDFBRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEgXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5ydWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUyRjAyNDMiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBVbml0IGNhbiBoYXZlIGV4YWN0bHkgb25lIENvcHlyaWdodCBTdGF0ZW1lbnQgc2VjdXJpbmcgdGhlIGludGVsbGVjdHVhbCBjYXBpdGFsIGl0IHJlcHJlc2VudHMuICBJdCB3aWxsIGJlIHB1Ymxpc2hlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGNvbmNyZXRlIEVsZW1lbnQuICBOb3RlLCB0aGF0IENvcHlyaWdodCBTdGF0ZW1lbnRzIGZvciBNZXRob2QgTGlicmFyaWVzIGFuZCBNZXRob2QgUGx1Z2lucyBkZWZpbmUgdGhlIGRlZmF1bHQgc3RhdGVtZW50IGZvciBpdHMgY29udGFpbmVkIGVsZW1lbnRzLCB3aGljaCBjYW4gYmUgJ292ZXJ3cml0dGVuJyB3aXRoIHJldmlzZWQgc3RhdGVtZW50cyBmb3IgZXZlcnkgQ29udGVudCBEZXNjcmlwdGlvbiBvciBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiIG5hbWU9Il9tZXRob2RVbml0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbnJGOFVleU1FZHVGS0pvdkJMNjRYUSIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfbnJGOFVPeU1FZHVGS0pvdkJMNjRYUSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5OTRCRjAyODIiIG5hbWU9IlByb2Nlc3NEaWFncmFtcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3d1VGwtZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDE1MzM2MTIwMTUxIj4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNjEyMDE1MSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh3dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRjY2QjAxNTUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLOHh4dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4eS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eHctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eHhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgyMCIgeT0iMzg1MiIgd2lkdGg9IjQ5NTQiIGhlaWdodD0iMTc5NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISzh4ME9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4MGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4MC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eDFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLOHh6ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLOHh6dWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NDEiIHk9IjczNjYiIHdpZHRoPSIzMTQ5IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFFOTk2MDA5RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEs4eDJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4M3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHgzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISzh4MS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4Mk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTU2IiB5PSI2NjgiIHdpZHRoPSIzNTMwIiBoZWlnaHQ9IjE4NjIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExHaWNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMR2lkdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISzh4NGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4NHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDU3IiB5PSIyMDMyIiB3aWR0aD0iMzMzNSIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lkLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMR2llLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITEdpZ09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaWVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaWVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDExNCIgeT0iMTA4MjAiIHdpZHRoPSI0ODc2IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3dVRtZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IHVtYSBkaWFncmFtcyBhcmUgYmFzZWQgb24gdGhlIHVtbDIgZGlhZ3JhbSBpbnRlcmNoYW5nZS4gIFRoZSBtZXRob2QgbW9kZWwgcGFja2FnZSBhY2Nlc3NlcyB0aGVzZSBkaWFncmFtcywgYmVjYXVzZSB0aGUgcHJvY2VzcyBwYWNrYWdlcyBkZWZpbmVkIGluIG1ldGhvZCBtb2RlbHMgcGFja2FnZS9jb250YWluIHRoZSBkaWFncmFtcy4iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITEdpaXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFNTc3NDAwMjNEIiBzb3VyY2U9Il9ISzh4d3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITEdpZC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaWp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExHaWktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITEdpak9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5NDgsIDg5NywgLTE0MzksIC02MDExXSRbMjM2MiwgMjEyNSwgLTI1LCAtNDc4M10kWzIzNzAsIDU3NTcsIC0xNiwgLTExNTFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITEdpa3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMR2lrLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9TYXZZa2VvbEVkdVZBN3Z0NXFiSUpRIiBlbGVtZW50PSJfU2F2WWtPb2xFZHVWQTd2dDVxYklKUSIgc291cmNlPSJfSEs4eDF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEs4eDRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TYXZZbE9vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TYXZZbHVvbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NhdlltT29sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2F2WWwtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1NhdllsZW9sRWR1VkE3dnQ1cWJJSlEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1NhdllrdW9sRWR1VkE3dnQ1cWJJSlEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfU2F2WWstb2xFZHVWQTd2dDVxYklKUSIgcG9pbnRzPSJbNjgsIDE4LCAtMTg5LCAtMzBdJFsyMjIsIDgxLCAtMzUsIDMzXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il95bEQzc094WkVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfeWt3OHdPeFpFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEs4eHd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEs4eHpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il95bEQzcy14WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il95bEQzdGV4WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lsRDN0LXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeWxEM3R1eFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3lsRDN0T3haRWR1T05yTVJnbXo0OEEiIHk9IjEzNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3lsRDNzZXhaRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfeWxEM3N1eFpFZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMiwgMzUsIDUsIC05Nl0kWzE4LCAxNjMsIDIxLCAzMl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfMkQxcnNleFpFZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iXzJEMXJzT3haRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hLOHgxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLOHh3dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMkQxcnRPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMkQxcnR1eFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRDFydU94WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJEMXJ0LXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8yRDFydGV4WkVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8yRDFyc3V4WkVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzJEMXJzLXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzcsIDM2LCA4LCAtODNdJFs5MywgMTE2LCA5NCwgLTNdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3YllydWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5OTRCRjAyODIiPgotICAgICAgICAgIDxib2R5PjA1PC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFFOTk2MDA5RCIgbmFtZT0iVU1BRGlhZ3JhbXMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3d1VGxPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDE1MUU5RTMwMUI4Ij4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MUU5RTMwMUI4IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFMzQwMTU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEs4eGV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNTAiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4Zi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4Z2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4Zy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eGQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4ZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjE5IiB5PSIzODA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4aHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMUZBRjEwMzc2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEs4eGl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwNjQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4anVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4a09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4a3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4bE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4bGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISzh4aC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLOHhpT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODUiIHk9Ijk1MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3dVRsdWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJVTUEgc3VwcG9ydHMgdGhyZWUgdHlwZXMgb2YgZGlhZ3JhbXMuIEhvd2V2ZXIsIHRoaXMgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBkZWZpbmUgdGhlIHN5bnRheCBvZiB0aGVzZSBkaWFncmFtcywgYnV0IHJhdGhlciByZWxpZXMgb24gYSB0b29sIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZXhhY3QgcHJlc2VudGF0aW9uIG9mIHRoZSB0aHJlZSBkaWFncmFtcy4gIFV0aWx6aW5nIHRoZSBVTUwyIERpYWdyYW0gSW50ZXJjaGFuZ2Ugc3BlY2lmaWNhdGlvbiB0aGlzIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgYWxsIHN0cnVjdHVyZXMgdG8gcmVwcmVzZW50IGFuZCBwZXJzaXN0IHRoZXNlIGRpYWdyYW1zLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISzh4bHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwMUVBIiBzb3VyY2U9Il9ISzh4aHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISzh4ZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLOHhtdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4bmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4bi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4bnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODciIHk9Ii0zMzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4b09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4b2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0EzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hLOHhwT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMjkiIHk9Ii0yNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4cHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0EzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4cU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4cC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjQwIiB5PSI5MDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4ck9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4cXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0EzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4c09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4cnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHh0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hLOHhzdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4dGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0EzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4dC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHh1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hLOHh0dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISzh4bC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEs4eG1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNDQ4LCAwLCAtMzEwN10kWzAsIDMwMjIsIDAsIC01MzNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3diWXN1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFFOTk2MDA5RCI+Ci0gICAgICAgICAgICA8Ym9keT4wMjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1NhdllrT29sRWR1VkE3dnQ1cWJJSlEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiLz4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iXzJEMXJzT3haRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MTUxRjY2QjAxNTUiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTFGQUYxMDM3NiIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyIgbmFtZT0iZGlhZ3JhbXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwRTM0MDE1NiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAxRUEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hd3VUa09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hd2tpbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwMUVBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQTMgXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3a2luT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAxRUEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHRoZSBvbmx5IG1lbWJlciBvZiB0aGUgdW1hZGlhZ3JhbXMgcGFja2FnZS4gIEl0IGRlZmluZXMgdGhhdCBEaWFncmFtcyBjYW4gYmUgcGFja2FnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQUQiIG5hbWU9Il9wcm9jZXNzUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMUZBRjEwMzc2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwMUVBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3d1VGstZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3d1VGt1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9HZHBta2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2R6WGtPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI195elU1OFlpbkVkcXR2Ym5mQjJMXzV3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9HZHpYa2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2R6WGt1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX0lOOGs4TW1CRWRxQmNOMVI2RXZXVXc/RGVmYXVsdC9EZWZhdWx0PyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQ/Ii8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9HZHpYay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2R6WGxPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX0lyZEFVTW1CRWRxQmNOMVI2RXZXVXc/RGVwbG95bWVudC9EZXBsb3ltZW50PyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQ/Ii8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9ncU9Rb0FCMkVkdWVxLVZpTFlpZXlRIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfZ3FPUW9RQjJFZHVlcS1WaUxZaWV5USIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI192eS1IVVlpbkVkcXR2Ym5mQjJMXzV3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gIDwvdW1sOk1vZGVsPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doT2ZBT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doRXVBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaFlRQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaE9mQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2hySzhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2hoWjlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doMFU0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dockstdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaDBVNWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaDBVNU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2gtRjRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2gwVTZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doLUY1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doLUY0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaUgyNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaC1GNS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lIMjVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lIMjQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpSDI1LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpSDI1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaVJBMHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaVJBMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lSQTFlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lSQTFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpYXgwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpUkExLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWF4MC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWF4MHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lheDEtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lheDF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpa2kwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpYXgydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWtpMU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWtpMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lraTEtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lraTF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpdHN3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpa2kyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaXRzdy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaXRzd3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2kzZHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2l0c3gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R3LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpM2R3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaTNkeU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaTNkeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2kzZHpPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2kzZHktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqQW5zdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqQW5zZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HakFudU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFudC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pBbnZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pBbnUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqS1lzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqQW53T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaktZdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaktZcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pLWXQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pLWXR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqVUpzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqS1l1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HamRUb09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HalVKcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pkVHBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pkVG8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqZFRxT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HamRUck9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HamRUcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2puRW9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pkVHItZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqbkVwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqbkVvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha0R3a09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HajVfbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tEd21lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tEd21PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drRHdvdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drRHdvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha002Z09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha0R3cXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tNNmllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tNNmlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drTTZrdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drTTZrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha1dyZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha002bXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tXcmllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tXcmlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drV3JrdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drV3JrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha2djZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha1dybXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tnY2llZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tnY2lPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drZ2NrdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drZ2NrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3BtY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha2djbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2twbWVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2twbWVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drcG1ndWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drcG1nZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3pYY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3BtaXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2t6WGdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2t6WGYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drOUljT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drelhpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HazlJZWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HazlJZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xzdlVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xpLVdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZXT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsc3ZWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbHN2WE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xzdllPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xzdlgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsMTVRT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsc3ZZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbDE1Uk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbDE1US1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2wxNVNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2wxNVItZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsX3FRT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsMTVUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbF9xUk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbF9xUS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xfcVRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xfcVRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtSmJRT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsX3FWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbUpiUi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbUpiUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21KYlVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21KYlQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtU2xNT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtSmJXT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbVNsT2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbVNsT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21TbFF1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21TbFFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtY1dNT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtU2xVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWNXT2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWNXT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21jV1F1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21jV1FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtbGdJT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtY1dTdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWxnS2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWxnS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21sZ011ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21sZ01lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtNUNKT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtNUNJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbTVDTHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbTVDTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25DTUVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR201Q01lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01GT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duQ01FLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbkNNR09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNRi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25DTUhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25DTUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duTDlFT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duQ01KT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbkw5R2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbkw5R09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25MOUl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25MOUllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duVnVFT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duTDlLdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HblZ1R2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HblZ1R09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25lNEQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25lNER1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dub3BBT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duZTRHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbnh5OE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbm9wQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR254eTgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR254eTh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dueHk5dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHk5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbnh5LS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbnh5LXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243ajhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR254eV9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2o4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duN2o4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqOXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqOWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243ai1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR243ai1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2pfT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duN2otLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb0ZVOU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb0ZVOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29GVTktZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29GVTl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvRlVfT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvRlUtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb09lNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb0ZVX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ZUDRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ZUDRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvWVA4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvWVA4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb1lQLXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb1lQLWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29pQTRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ZUF91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvaUE0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb2lBNk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb2lBNS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29pQTYtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29pQTZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvckswT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvaUE3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLMC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLMHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzF1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvcksyZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvcksyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLMy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28wNzBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDcxT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvMDcwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbzA3MmVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbzA3Mk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28wNzN1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28wNzNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvLUZ4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvLUZ3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hby1GemVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hby1Gek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28tRjF1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28tRjFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwSDJ5ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwSDJ5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcFJud09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcEgyeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbngtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BSbnh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwUm55LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwUm55dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcFJuei1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcFJuenVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BSbjB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXh0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXhzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4dU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4dC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXh3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXh2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGtpc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4dy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BraXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwa2l1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwa2l0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGtpdk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGtpdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3B1VHNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BraXYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwdVR0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwdVRzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcHVUdk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcHVUdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3B1VHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3B1VHYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwM2RvdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwM2RvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcDNkcS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkcXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3AzZHRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3AzZHMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxQk9vT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwM2R2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUJPcWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUJPcU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FCT3N1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FCT3NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxS1lrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxQk91dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUtZbWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUtZbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FLWW91ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FLWW9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxVUprT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxS1lxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcVVKbWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcVVKbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FkNmstZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVpT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxbkVoLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5Fak9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5FaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWtPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FuRWotZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVsT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxbkVrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcXcxZ2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWhlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxdzFpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcXcxamVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3E2bWdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxNm1oT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxNm1nLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcTZtamVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcTZtak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3E2bWx1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3E2bWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyRHdjLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyRHdjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hck5oY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HckR3ZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JOaGVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JOaGVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyV3JZLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyV3JZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcldyYk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcldyYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JXcmRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JXcmRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyZ2NaLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyZ2NadWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnFOWXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnFOWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JxTmFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTlotZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dycU5iT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dycU5hLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnpYVU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnFOYnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFUtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3J6WFV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyelhWLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyelhWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnpYVy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnpYV3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3I5SVVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3J6WFhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyOUlWT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyOUlVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcjlJVi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3I5SVd1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3I5SVdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzRzVVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyOUlYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1VS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc0c1VXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NHNVdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NHNVYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzRzVYdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzRzVYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc1FEUnVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1FEUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NRRFQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NRRFR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzUURXT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzUURWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc1owVHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1owVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NpLU1PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NaMFZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzaS1OT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzaS1NLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc2ktT2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NpLVBlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NpLVBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzc3ZNT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzaS1RT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2Tk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc3N2TS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Nzdk9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Nzdk4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzc3ZQT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzc3ZPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HczJnTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc3N2UU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ05PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3MyZ00tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzMmdQZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzMmdQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HczJnUnVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HczJnUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NfcUl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NfcUllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzX3FLLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzX3FLdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc19xTk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc19xTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RKYkllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RKYklPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0SmJLdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0SmJLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdEpiTS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdEpiTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RUTUlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RKYk8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0VE1KLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0VE1KdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdFRNTHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdFRNTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RtSEZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RtSEUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0bUhIT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0bUhHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdG1ISWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdG1ISU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3R2UkFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RtSEpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0dlJCT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0dlJBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdHZSRGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdHZSRE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Q1Q0FPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3R2UkZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0NUNEdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0NUNEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdDVDR2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdDVDR09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VDekF1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1Q3pDZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUN6RE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6Qy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VDekVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1TDg4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4OC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUw4OHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VMOC1PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMODktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1TDgtLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1TDgtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0OE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUw4Xy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdDgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdDh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnQ5dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnQ5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0LWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ0LU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdF91ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdF9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmU4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnVBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlOC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdWZlOHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZTl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZTllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmUtZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1ZmUtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlX09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdWZlLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VvbzRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1b281T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b280LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdW9vNk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VvbzYtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1eVo0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b283LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdllQd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdlBGMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZZUHpPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZZUHktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2WVAzZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2WVAzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdmlBd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdllQNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZpQXhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZpQXctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2aUF5T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUF4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdmlBenVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdmlBemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZyeHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZpQTF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2cnh5ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2cnh5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdnJ4MHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdnJ4MGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3YwN3NPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZyeDJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2MDd0LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2MDd0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdjA3d09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdjA3di1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Ytc3MtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Ytc3N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3SDJwdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3SDJwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd0gydE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd0gycy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbm9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dIMnQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5vLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3Um5vdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1JucHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1JucGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbnFlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dSbnFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5yLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3Um5ydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd2JZci1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd2JZcnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3draWtPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3diWXN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3a2luZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3a2luT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdzRFa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd3VUb09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3c0RWstZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3c0RWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3NEVsdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3NEVsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeEJPZ3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeEJPZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hkNmR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJkT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJjLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeHcxWU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3h3MVplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3h3MVpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4Nm1ZZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4Nm1ZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il81R2NZQ2VpZUVkdVFidVk2VXdNU1FnIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkJvb2xlYW4iIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il81R2NZRGVpZUVkdVFidVk2VXdNU1FnIiBiYXNlX0NvbW1lbnQ9Il81R2NZQWVpZUVkdVFidVk2VXdNU1FnIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfQmFzdE1PaWZFZHVRYnVZNlV3TVNRZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX2k3RlRvZWlmRWR1UWJ1WTZVd01TUWciIGJhc2VfQ29tbWVudD0iX2k3RlRvT2lmRWR1UWJ1WTZVd01TUWciLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9XZS1Ra09vRkVkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBBNDAwN0IiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9kVWM2b2VvRkVkdU9CUFFBMmhLcVVRIiBiYXNlX0NvbW1lbnQ9Il9kVWM2b09vRkVkdU9CUFFBMmhLcVVRIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfdjFuSXNPb0ZFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il83Z0hBOE9vRkVkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDNGMDk4OTlDMDBFQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0FHX0ZjT29HRWR1T0JQUUEyaEtxVVEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzRjA5ODlCOTAyOTAiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9FSWRXME9vR0VkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfb2dpR29Pb0hFZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDUwIiBpc0lEPSJ0cnVlIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzUyVGZvT29IRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA0NyIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9KQUlCb09vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MjdBOEExRjAyRjMiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTFJhSHdPb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDBGOUFCOTgwMkI5Ii8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05jYk4wT29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQ1NUU2NUM4MDIxOCIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9QRm5aTU9vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MURGMzIxOTAwMjkiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfUldUQ1lPb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDI3OTYyNUQwMjM0Ii8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1VEUzBJT29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyMUU0REYzMDAzQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9wd3ZZQU9vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MURERkM4RTAwQjYiLz4KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfcDZ4MkVPb1NFZHVPQlBRQTJoS3FVUSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiLz4KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfMXFYcHNPb1NFZHVPQlBRQTJoS3FVUSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiLz4KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfNFotRGdPb1NFZHVPQlBRQTJoS3FVUSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9QNG9zWWVvZUVkdVZBN3Z0NXFiSUpRIiBiYXNlX0NvbW1lbnQ9Il9QNG9zWU9vZUVkdVZBN3Z0NXFiSUpRIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfQ0VJSGtPeDNFZHU1LXZWamxmVnNmUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Eb3VibGUiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjgzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iMDMiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF0ZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVXJpIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVW5saW1pdGVkTmF0dXJhbCIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0cmluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2VxdWVuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkludGVnZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGbG9hdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5GbG9hdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNsYXNzaWZpZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9OYW1lc3BhY2UgIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZXNwYWNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcHJlc3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uc3RyYWludCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib2R5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlcm1EZWZpbml0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZXJtRGVmaW5pdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vQ2xhc3NpZmllciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuJiN4RDsmI3hBO1RoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vQ29udGVudERlc2NyaXB0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4RDsmI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBvcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXBvcnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcGxhdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZW1wbGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkQnkiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdGVwIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4mI3hEOyYjeEE7V29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RlcCIgZVN1cGVyVHlwZXM9IiMvL1NlY3Rpb24gIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLiYjeEQ7JiN4QTtBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hEOyYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgZVR5cGU9IiMvL0FydGlmYWN0IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXJ0aWZhY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNlZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNraWxscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzeW5vbnltcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50cyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkaXRpb25hbEluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ibGVtIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhY2tncm91bmQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ29hbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvaW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc2l0aW9uIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rIiBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtTGluayIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFuY2hvcmFnZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZW1hbnRpY01vZGVsIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzVmlzaWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZmVyZW5jZSIgZU9wcG9zaXRlPSIjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0eSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1MaW5rIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb3J0IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhDb25uZWN0b3IiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvYW5jaG9yYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWRnZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3JhcGhFZGdlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBlVHlwZT0iIy8vRGlhZ3JhbSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpbWVuc2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndpZHRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWZlcmVuY2UiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb3BlcnR5IiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXkiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoRWRnZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFuY2hvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9IjIiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvaW50IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1MaW5rIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtTGluayIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaE5vZGUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzaXplIiBlVHlwZT0iIy8vRGltZW5zaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0VsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGVhZkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXh0RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGV4dCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkltYWdlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIGVUeXBlPSIjLy9VcmkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWltZVR5cGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9seWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xvc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGxpcHNlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1giIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb3RhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydEFuZ2xlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuZEFuZ2xlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNlbnRlciIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gQWN0aXZpdHkgaXMgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLiYjeEQ7JiN4QTtBY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9hZG1hcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvYWRtYXAiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2FibGVBc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFbmFjdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUmVwZWF0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT25nb2luZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya09yZGVyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQbGFubmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPcHRpb25hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwbGFubmluZ0RhdGEiIGVUeXBlPSIjLy9QbGFubmluZ0RhdGEiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0FjdGl2aXR5IiBlT3Bwb3NpdGU9IiMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1pbGVzdG9uZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikl0ZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7SXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO1BoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZWFtUHJvZmlsZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4mI3hEOyYjeEE7V29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLiYjeEQ7JiN4QTtIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlYW1Sb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJUZWFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJUZWFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJvbGUiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9TdGFydCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9GaW5pc2giIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtPcmRlciIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAmI3hEOyYjeEE7KE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pJiN4RDsmI3hBO1RoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtUeXBlIiBlVHlwZT0iIy8vV29ya09yZGVyVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmluaXNoVG9TdGFydCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4mI3hEOyYjeEE7UHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQbGFubmluZ0RhdGEiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLiYjeEQ7JiN4QTtQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuJiN4RDsmI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYW5rIiBlVHlwZT0iIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3IiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4mI3hEOyYjeEE7RGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAmI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiYjeEQ7JiN4QTtBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRhc2siIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3Npc3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvc2l0ZVJvbGUiIGVTdXBlclR5cGVzPSIjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb21wb3NpdGUgUm9sZSBpcyBhIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hEOyYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93dG9TdGFmZiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2FsZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJpc2tMZXZlbCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDaGVja2xpc3QiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sTWVudG9yIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2UiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViUHJhY3RpY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1ZlcnRleCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSZWdpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZ2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1N0YXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1Ym1hY2hpbmUiIGVUeXBlPSIjLy9TdGF0ZU1hY2hpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBlVHlwZT0iIy8vUmVnaW9uIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1ZlcnRleCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRnb2luZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL3NvdXJjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNvbWluZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL3RhcmdldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWdpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJWZXJ0ZXgiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ZlcnRleCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUcmFuc2l0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJTdGF0ZSIgZVR5cGU9IiMvL1N0YXRlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGUvUmVnaW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlTWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSZWdpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZ2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUcmFuc2l0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya0RlZmluaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtEZWZpbml0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1JlZ2lvbiIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZlcnRleCIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvb3V0Z29pbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFyZ2V0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9pbmNvbWluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQc2V1ZG9TdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1ZlcnRleCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUHNldWRvU3RhdGVLaW5kIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImluaXRpYWwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImpvaW4iIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmb3JrIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ianVuY3Rpb24iIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjaG9pY2UiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJlbnRyeVBvaW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXhpdFBvaW50IiB2YWx1ZT0iNiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0idGVybWluYXRlIiB2YWx1ZT0iNyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZGlzY2lwbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvbWFpbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RvbWFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZVNldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVTZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3MiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkQ29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZUlPIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzVmlld3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0VmlldyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NGYW1pbHkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZWxpdmVyeVByb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lbXggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lbXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzY5MzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZW14CisrKyAvZGV2L251bGwKQEAgLTEsMzMyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPgotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMudW1sLm1zbC5tb2RlbCIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9ImNvbS5pYm0ueHRvb2xzLnJ1bWwuZmVhdHVyZSIgdXJsPSIiIHZlcnNpb249IjcuMC4wIi8+PC9zaWduYXR1cmU+Pz4KLTw/Y29tLmlibS54dG9vbHMuZW1mLmNvcmUuc2lnbmF0dXJlIDxzaWduYXR1cmUgaWQ9ImNvbS5pYm0ueHRvb2xzLm1taS51aS5zaWduYXR1cmVzLmRpYWdyYW0iIHZlcnNpb249IjcuMC4wIj48ZmVhdHVyZSBkZXNjcmlwdGlvbj0iIiBuYW1lPSJSYXRpb25hbCBNb2RlbGluZyBQbGF0Zm9ybSAoY29tLmlibS54dG9vbHMucm1wKSIgdXJsPSIiIHZlcnNpb249IjcuMC4wIi8+PC9zaWduYXR1cmU+Pz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6RGVmYXVsdD0iaHR0cDovLy9zY2hlbWFzL0RlZmF1bHQvMSIgeG1sbnM6RWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi9zY2hlbWFzL0Vjb3JlLzMiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovLy9zY2hlbWFzL0RlZmF1bHQvMSBwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX0lOOGs4TW1CRWRxQmNOMVI2RXZXVXc/RGVmYXVsdC9EZWZhdWx0PyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIHBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjX3Z5LUhVWWluRWRxdHZibmZCMkxfNXciPgotICA8dW1sOk1vZGVsIHhtaTppZD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiIG5hbWU9InVtYSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9KN3RHMGV5Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiLz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE4Ty1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE4ZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VU1MMkluZnJhc3RydWN0dXJlTWluaTo6Q29uc3RydWN0cyIgcmVmZXJlbmNlcz0iX3l4S2ZDdS1zRWR1SDU5S1NIVjh2Z0EgX3l4S2ZEZS1zRWR1SDU5S1NIVjh2Z0EgX3l4S2ZFdS1zRWR1SDU5S1NIVjh2Z0EgX3l4S2ZELS1zRWR1SDU5S1NIVjh2Z0EgX3l4S2ZGdS1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBVTy1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBWTy1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBXTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMTh1LXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVTUwySW5mcmFzdHJ1Y3R1cmVNaW5pOjpQcmltaXRpdmVUeXBlcyIgcmVmZXJlbmNlcz0iX3l4VVBaTy1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBhdS1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBhLS1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBiTy1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EgX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMTgtLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpCYXNpY0VsZW1lbnRzIiByZWZlcmVuY2VzPSJfeXh3N1JPLXNFZHVINTlLU0hWOHZnQSBfeXh3N1NlLXNFZHVINTlLU0hWOHZnQSBfeXh3N1R1LXNFZHVINTlLU0hWOHZnQSBfeXh3N1VlLXNFZHVINTlLU0hWOHZnQSBfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSBfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSBfeXh3N1d1LXNFZHVINTlLU0hWOHZnQSBfeXh3N1gtLXNFZHVINTlLU0hWOHZnQSBfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSBfeXh3N1plLXNFZHVINTlLU0hWOHZnQSBfeXh3N2F1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2ItLXNFZHVINTlLU0hWOHZnQSBfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2RlLXNFZHVINTlLU0hWOHZnQSBfeXh3N2N1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2Z1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2ctLXNFZHVINTlLU0hWOHZnQSBfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2lPLXNFZHVINTlLU0hWOHZnQSBfeXh3N2h1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2p1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2pPLXNFZHVINTlLU0hWOHZnQSBfeXh3N2tlLXNFZHVINTlLU0hWOHZnQSBfeXh3N2otLXNFZHVINTlLU0hWOHZnQSBfeXh3N2x1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2xPLXNFZHVINTlLU0hWOHZnQSBfeXh3N20tLXNFZHVINTlLU0hWOHZnQSBfeXh3N21lLXNFZHVINTlLU0hWOHZnQSBfeXg2Rk1lLXNFZHVINTlLU0hWOHZnQSBfeXg2Rk1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOU8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZFBsdWdpbiIgcmVmZXJlbmNlcz0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZCTy1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZCdS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZDZS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZELS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZFdS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZGLS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZKLS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZLdS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZMLS1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJBdS1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJBTy1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJCLS1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJCZS1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJETy1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJDdS1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJFZS1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJELS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMTllLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpHdWlkYW5jZVR5cGVzIiByZWZlcmVuY2VzPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSBfeXoxLTRlLXNFZHVINTlLU0hWOHZnQSBfeXoxLTVPLXNFZHVINTlLU0hWOHZnQSBfeXoxLTUtLXNFZHVINTlLU0hWOHZnQSBfeXoxLTZ1LXNFZHVINTlLU0hWOHZnQSBfeXoxLTdlLXNFZHVINTlLU0hWOHZnQSBfeXoxLThPLXNFZHVINTlLU0hWOHZnQSBfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSBfeXoxLTl1LXNFZHVINTlLU0hWOHZnQSBfeXoxLS1lLXNFZHVINTlLU0hWOHZnQSBfeXoxLV9PLXNFZHVINTlLU0hWOHZnQSBfeXoxX0F1LXNFZHVINTlLU0hWOHZnQSBfeXoxX0JlLXNFZHVINTlLU0hWOHZnQSBfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSBfeXoxX0NlLXNFZHVINTlLU0hWOHZnQSBfeXoxX0RPLXNFZHVINTlLU0hWOHZnQSBfeXoxX0QtLXNFZHVINTlLU0hWOHZnQSBfeXoxX0V1LXNFZHVINTlLU0hWOHZnQSBfeXpfdjRPLXNFZHVINTlLU0hWOHZnQSBfeXpfdjQtLXNFZHVINTlLU0hWOHZnQSBfeXpfdjUtLXNFZHVINTlLU0hWOHZnQSBfeXpfdjZ1LXNFZHVINTlLU0hWOHZnQSBfeXpfdjdlLXNFZHVINTlLU0hWOHZnQSBfeXpfdjhPLXNFZHVINTlLU0hWOHZnQSBfeXpfdjgtLXNFZHVINTlLU0hWOHZnQSBfeXpfdjl1LXNFZHVINTlLU0hWOHZnQSBfeXpfdi1lLXNFZHVINTlLU0hWOHZnQSBfeXpfdl9PLXNFZHVINTlLU0hWOHZnQSBfeXpfdl8tLXNFZHVINTlLU0hWOHZnQSBfeXpfd0JPLXNFZHVINTlLU0hWOHZnQSBfeXpfd0F1LXNFZHVINTlLU0hWOHZnQSBfeXpfd0NlLXNFZHVINTlLU0hWOHZnQSBfeXpfd0ItLXNFZHVINTlLU0hWOHZnQSBfeXpfd0R1LXNFZHVINTlLU0hWOHZnQSBfeXpfd0RPLXNFZHVINTlLU0hWOHZnQSBfeXpfd0UtLXNFZHVINTlLU0hWOHZnQSBfeXpfd0VlLXNFZHVINTlLU0hWOHZnQSBfeXpfd0dPLXNFZHVINTlLU0hWOHZnQSBfeXpfd0Z1LXNFZHVINTlLU0hWOHZnQSBfeXpfd0hlLXNFZHVINTlLU0hWOHZnQSBfeXpfd0ctLXNFZHVINTlLU0hWOHZnQSBfeXpfd0l1LXNFZHVINTlLU0hWOHZnQSBfeXpfd0lPLXNFZHVINTlLU0hWOHZnQSBfeXpfd0otLXNFZHVINTlLU0hWOHZnQSBfeXpfd0plLXNFZHVINTlLU0hWOHZnQSBfeXpfd0xPLXNFZHVINTlLU0hWOHZnQSBfeXpfd0t1LXNFZHVINTlLU0hWOHZnQSBfeTBKZzR1LXNFZHVINTlLU0hWOHZnQSBfeTBKZzRPLXNFZHVINTlLU0hWOHZnQSBfeTBKZzUtLXNFZHVINTlLU0hWOHZnQSBfeTBKZzVlLXNFZHVINTlLU0hWOHZnQSBfeTBKZzYtLXNFZHVINTlLU0hWOHZnQSBfeTBKZzZ1LXNFZHVINTlLU0hWOHZnQSBfeTBKZzctLXNFZHVINTlLU0hWOHZnQSBfeTBKZzd1LXNFZHVINTlLU0hWOHZnQSBfeTBKZzgtLXNFZHVINTlLU0hWOHZnQSBfeTBKZzh1LXNFZHVINTlLU0hWOHZnQSBfeTBKZzktLXNFZHVINTlLU0hWOHZnQSBfeTBKZzl1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOXUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6Ok1ldGhvZENvcmVEZXNjcmlwdGlvbnMiIHJlZmVyZW5jZXM9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIF95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIF95MU1Dc3Utc0VkdUg1OUtTSFY4dmdBIF95MU1DdC0tc0VkdUg1OUtTSFY4dmdBIF95MU1Ddk8tc0VkdUg1OUtTSFY4dmdBIF95MU1Dd08tc0VkdUg1OUtTSFY4dmdBIF95MU1Dc08tc0VkdUg1OUtTSFY4dmdBIF95MU1DeHUtc0VkdUg1OUtTSFY4dmdBIF95MU1DeS0tc0VkdUg1OUtTSFY4dmdBIF95MU1DeE8tc0VkdUg1OUtTSFY4dmdBIF95MU1DMHUtc0VkdUg1OUtTSFY4dmdBIF95MU1DMS0tc0VkdUg1OUtTSFY4dmdBIF95MU1DM08tc0VkdUg1OUtTSFY4dmdBIF95MU1DME8tc0VkdUg1OUtTSFY4dmdBIF95MU1DNC0tc0VkdUg1OUtTSFY4dmdBIF95MU1DNk8tc0VkdUg1OUtTSFY4dmdBIF95MU1DNGUtc0VkdUg1OUtTSFY4dmdBIF95MU1DNy0tc0VkdUg1OUtTSFY4dmdBIF95MU1DOU8tc0VkdUg1OUtTSFY4dmdBIF95MU1DLWUtc0VkdUg1OUtTSFY4dmdBIF95MU1DN2Utc0VkdUg1OUtTSFY4dmdBIF95MU1EQU8tc0VkdUg1OUtTSFY4dmdBIF95MU1DX3Utc0VkdUg1OUtTSFY4dmdBIF95MU1EQi0tc0VkdUg1OUtTSFY4dmdBIF95MU1ERE8tc0VkdUg1OUtTSFY4dmdBIF95MU1ERWUtc0VkdUg1OUtTSFY4dmdBIF95MU1ERnUtc0VkdUg1OUtTSFY4dmdBIF95MU1ERy0tc0VkdUg1OUtTSFY4dmdBIF95MU1ESU8tc0VkdUg1OUtTSFY4dmdBIF95MU1EQmUtc0VkdUg1OUtTSFY4dmdBIF95MU1ESnUtc0VkdUg1OUtTSFY4dmdBIF95MU1ESy0tc0VkdUg1OUtTSFY4dmdBIF95MU1ETU8tc0VkdUg1OUtTSFY4dmdBIF95MU1ETmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE5LS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kTGlicmFyeTo6TWV0aG9kVW5pdHMiIHJlZmVyZW5jZXM9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIF96RHBWY08tc0VkdUg1OUtTSFY4dmdBIF96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIF96TjdTMWUtc0VkdUg1OUtTSFY4dmdBIF96TjdTMnUtc0VkdUg1OUtTSFY4dmdBIF96TjdTM3Utc0VkdUg1OUtTSFY4dmdBIF96TjdTNC0tc0VkdUg1OUtTSFY4dmdBIF96TjdTNk8tc0VkdUg1OUtTSFY4dmdBIF96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIF96T0Vjdy0tc0VkdUg1OUtTSFY4dmdBIF96T0Vjd2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDEtTy1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6Q29yZUNvbnRlbnRFbGVtZW50cyIgcmVmZXJlbmNlcz0iX3l5emRGTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRGLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRIdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRJZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRKTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRKLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRLdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRMZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRPZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRQTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emROdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRRdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRQLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRSZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRTTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRULS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRVdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRWLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRWZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRYTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRXdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRZZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRYLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRadS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRaTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRhLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRhZS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9FdS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9FTy1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9GZS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9HZS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9GLS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9IdS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9ITy1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9JLS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9JZS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9KdS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9KTy1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9LZS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9KLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMS1lLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpQcm9jZXNzVHlwZXMiIHJlZmVyZW5jZXM9Il95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIF95N21Nc08tc0VkdUg1OUtTSFY4dmdBIF95LTRLTS0tc0VkdUg1OUtTSFY4dmdBIF95LTRLTnUtc0VkdUg1OUtTSFY4dmdBIF95LTRLTU8tc0VkdUg1OUtTSFY4dmdBIF95LTRLUE8tc0VkdUg1OUtTSFY4dmdBIF95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIF95LTRLUXUtc0VkdUg1OUtTSFY4dmdBIF95LTRLUC0tc0VkdUg1OUtTSFY4dmdBIF95LTRLUmUtc0VkdUg1OUtTSFY4dmdBIF95LTRLU2Utc0VkdUg1OUtTSFY4dmdBIF95LTRLVE8tc0VkdUg1OUtTSFY4dmdBIF95LTRLVC0tc0VkdUg1OUtTSFY4dmdBIF95LTRLVXUtc0VkdUg1OUtTSFY4dmdBIF95LTRLVmUtc0VkdUg1OUtTSFY4dmdBIF95LTRLV08tc0VkdUg1OUtTSFY4dmdBIF95LTRLVy0tc0VkdUg1OUtTSFY4dmdBIF95X0JVSWUtc0VkdUg1OUtTSFY4dmdBIF95X0JVSk8tc0VkdUg1OUtTSFY4dmdBIF95X0JVSi0tc0VkdUg1OUtTSFY4dmdBIF95X0JVTE8tc0VkdUg1OUtTSFY4dmdBIF95X0JVS3Utc0VkdUg1OUtTSFY4dmdBIF95X0JVTWUtc0VkdUg1OUtTSFY4dmdBIF95X0JVTC0tc0VkdUg1OUtTSFY4dmdBIF95X0JVTnUtc0VkdUg1OUtTSFY4dmdBIF95X0JVTk8tc0VkdUg1OUtTSFY4dmdBIF95X0JVT2Utc0VkdUg1OUtTSFY4dmdBIF95X0JVTi0tc0VkdUg1OUtTSFY4dmdBIF95X0JVUHUtc0VkdUg1OUtTSFY4dmdBIF95X0JVUE8tc0VkdUg1OUtTSFY4dmdBIF95X0JVUS0tc0VkdUg1OUtTSFY4dmdBIF95X0JVUWUtc0VkdUg1OUtTSFY4dmdBIF95X0JVUnUtc0VkdUg1OUtTSFY4dmdBIF95X0JVU3Utc0VkdUg1OUtTSFY4dmdBIF95X0JVU08tc0VkdUg1OUtTSFY4dmdBIF95X0JVVHUtc0VkdUg1OUtTSFY4dmdBIF95X0JVVGUtc0VkdUg1OUtTSFY4dmdBIF95X0JVVS0tc0VkdUg1OUtTSFY4dmdBIF95X0JVVWUtc0VkdUg1OUtTSFY4dmdBIF95X0JVV08tc0VkdUg1OUtTSFY4dmdBIF95X0JVVnUtc0VkdUg1OUtTSFY4dmdBIF95X0JVWGUtc0VkdUg1OUtTSFY4dmdBIF95X0JVVy0tc0VkdUg1OUtTSFY4dmdBIF95X0JVWXUtc0VkdUg1OUtTSFY4dmdBIF95X0JVWU8tc0VkdUg1OUtTSFY4dmdBIF95X0JVWi0tc0VkdUg1OUtTSFY4dmdBIF95X0JVWmUtc0VkdUg1OUtTSFY4dmdBIF95X0JVYk8tc0VkdUg1OUtTSFY4dmdBIF95X0JVYXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDEtdS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6Q2F0ZWdvcmllcyIgcmVmZXJlbmNlcz0iX3kyT2tnLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2todS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tqTy1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tpZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2trdS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tsZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2ttLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2ttTy1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2twTy1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tvZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2txdS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2twLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tzTy1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tyZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t0dS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t1ZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tzLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t2dS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t2Ty1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t3LS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t3ZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t5Ty1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t4dS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t5LS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t5ZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2swTy1zRWR1SDU5S1NIVjh2Z0EgX3kyT2t6dS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2sxZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2swLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2sydS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2syTy1zRWR1SDU5S1NIVjh2Z0EgX3kyT2szLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2szZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s1Ty1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s0dS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s2ZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s1LS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s3ZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelR1XzRPLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpXb3JrUHJvZHVjdFN0YXRlcyIgcmVmZXJlbmNlcz0iX3kzUnRZdS1zRWR1SDU5S1NIVjh2Z0EgX3kzUnRaZS1zRWR1SDU5S1NIVjh2Z0EgX3kzUnRhTy1zRWR1SDU5S1NIVjh2Z0EgX3kzUnRZTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNVdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNWZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNXTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNXLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNVTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNZTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNYdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNaZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNhTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNhLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNZLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNidS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNjTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNlLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNmdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNnZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNndS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNlZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNodS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNoZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNpTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNoLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNpZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNpdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNpLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNqTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNqZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNqLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNqdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNrdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelR1XzRlLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpNZXRob2RQYWNrYWdlIiByZWZlcmVuY2VzPSJfeTRlQU5lLXNFZHVINTlLU0hWOHZnQSBfeTRlQU9PLXNFZHVINTlLU0hWOHZnQSBfeTRlQU8tLXNFZHVINTlLU0hWOHZnQSBfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSBfeTRlQVFlLXNFZHVINTlLU0hWOHZnQSBfeTRlQVB1LXNFZHVINTlLU0hWOHZnQSBfeTRlQVJ1LXNFZHVINTlLU0hWOHZnQSBfeTRlQVJPLXNFZHVINTlLU0hWOHZnQSBfeTRlQVMtLXNFZHVINTlLU0hWOHZnQSBfeTRlQVNlLXNFZHVINTlLU0hWOHZnQSBfeTRlQVVPLXNFZHVINTlLU0hWOHZnQSBfeTRlQVR1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VHVfNHUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByb2Nlc3M6OkJyZWFrZG93biIgcmVmZXJlbmNlcz0iX3k3bU10Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EgX3k3bU10LS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU11dS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU12ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU13LS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU14dS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU15ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU13Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3dldvTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dldyZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dldzTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dldxdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dld0dS1zRWR1SDU5S1NIVjh2Z0EgX3k3dld1Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3dld1dS1zRWR1SDU5S1NIVjh2Z0EgX3k3dldzLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dld3Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3dld4ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dld5Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3dld5LS1zRWR1SDU5S1NIVjh2Z0EgX3k3dld6dS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlcwZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlcxTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dlcxLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3dlczZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlcydS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc0dS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc1ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc2Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc3LS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc4dS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc5ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlctTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dlctLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dldfdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhBZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhCTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhCLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhEZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhFdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhGLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhHdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhIZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhJTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhKdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhJLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhMTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhMLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhNdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhOZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhQZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhPLS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhvTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhwTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhvdS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhxZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhwLS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhydS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhyTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhzLS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhzZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh1Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh0dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh2ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh1LS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh3dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh3Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh4ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh5ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh4LS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh6dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh6Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3NUgwLS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUgwZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUgyTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUgxdS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUgzZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUgyLS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg0dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg0Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg1LS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg1ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg2LS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg2dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg4Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg3dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg5ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg4LS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUgtdS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUgtTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelR1XzQtLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RMaWJyYXJ5OjpMaWJyYXJ5Q29uZmlndXJhdGlvbnMiIHJlZmVyZW5jZXM9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIF96UWRDWS0tc0VkdUg1OUtTSFY4dmdBIF96UWRDWnUtc0VkdUg1OUtTSFY4dmdBIF96UWRDYWUtc0VkdUg1OUtTSFY4dmdBIF96UWRDYk8tc0VkdUg1OUtTSFY4dmdBIF96UWRDYi0tc0VkdUg1OUtTSFY4dmdBIF96UWRDY3Utc0VkdUg1OUtTSFY4dmdBIF96UWRDZGUtc0VkdUg1OUtTSFY4dmdBIF96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIF96UWRDZS0tc0VkdUg1OUtTSFY4dmdBIF96UWRDZU8tc0VkdUg1OUtTSFY4dmdBIF96UWRDZi0tc0VkdUg1OUtTSFY4dmdBIF96UW16WU8tc0VkdUg1OUtTSFY4dmdBIF96UW16YU8tc0VkdUg1OUtTSFY4dmdBIF96UW16YS0tc0VkdUg1OUtTSFY4dmdBIF96UW16WS0tc0VkdUg1OUtTSFY4dmdBIF96UW16Y08tc0VkdUg1OUtTSFY4dmdBIF96UW16YnUtc0VkdUg1OUtTSFY4dmdBIF96UW16ZGUtc0VkdUg1OUtTSFY4dmdBIF96UW16Yy0tc0VkdUg1OUtTSFY4dmdBIF96UW16ZXUtc0VkdUg1OUtTSFY4dmdBIF96UW16ZU8tc0VkdUg1OUtTSFY4dmdBIF96UW16Zi0tc0VkdUg1OUtTSFY4dmdBIF96UW16ZmUtc0VkdUg1OUtTSFY4dmdBIF96UW16Z3Utc0VkdUg1OUtTSFY4dmdBIF96UW16Z08tc0VkdUg1OUtTSFY4dmdBIF96UW16aGUtc0VkdUg1OUtTSFY4dmdBIF96UW16Zy0tc0VkdUg1OUtTSFY4dmdBIF96UW16aXUtc0VkdUg1OUtTSFY4dmdBIF96UW16aU8tc0VkdUg1OUtTSFY4dmdBIF96UW16anUtc0VkdUg1OUtTSFY4dmdBIF96UW16amUtc0VkdUg1OUtTSFY4dmdBIF96UW16a3Utc0VkdUg1OUtTSFY4dmdBIF96UW16a2Utc0VkdUg1OUtTSFY4dmdBIF96UW16bC0tc0VkdUg1OUtTSFY4dmdBIF96UW16bGUtc0VkdUg1OUtTSFY4dmdBIF96UW16bS0tc0VkdUg1OUtTSFY4dmdBIF96UW16bXUtc0VkdUg1OUtTSFY4dmdBIF96UW16bi0tc0VkdUg1OUtTSFY4dmdBIF96UW16bnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV81Ty1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6UHJvY2Vzc0Rlc2NyaXB0aW9ucyIgcmVmZXJlbmNlcz0iX3pCWjV3dS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjV3Ty1zRWR1SDU5S1NIVjh2Z0EgX3pCWjV5ZS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjV6dS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjUwLS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjV4LS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjUydS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjUzLS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjU1Ty1zRWR1SDU5S1NIVjh2Z0EgX3pCWjU2ZS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjU3dS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjU4LS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjUyTy1zRWR1SDU5S1NIVjh2Z0EgX3pCWjUtdS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjVfLS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjUtTy1zRWR1SDU5S1NIVjh2Z0EgX3pCWjZCdS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjZCTy1zRWR1SDU5S1NIVjh2Z0EgX3pCWjZEZS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjZDLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelR1XzVlLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpQcm9jZXNzUGFja2FnZSIgcmVmZXJlbmNlcz0iX3pEcFZkZS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZlTy1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZjTy1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZmdS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZlLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZoTy1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZoLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZqZS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZrdS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZrTy1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZsLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZsZS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZuTy1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZtdS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZvZS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZuLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZwdS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZwTy1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZxLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelR1XzV1LXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzRGlhZ3JhbXM6OlVNQURpYWdyYW1zIiByZWZlcmVuY2VzPSJfekRwVml1LXNFZHVINTlLU0hWOHZnQSBfekxpdE1PLXNFZHVINTlLU0hWOHZnQSBfekxpdE5lLXNFZHVINTlLU0hWOHZnQSBfekxpdE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VDR3NE8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVNTDJEaWFncmFtSW50ZXJjaGFuZ2UiIHJlZmVyZW5jZXM9Il96SkFXa2Utc0VkdUg1OUtTSFY4dmdBIF96SkFXa3Utc0VkdUg1OUtTSFY4dmdBIF96SkFXa08tc0VkdUg1OUtTSFY4dmdBIF96SkFXbGUtc0VkdUg1OUtTSFY4dmdBIF96SkFXbHUtc0VkdUg1OUtTSFY4dmdBIF96SkFXbWUtc0VkdUg1OUtTSFY4dmdBIF96SkFXbk8tc0VkdUg1OUtTSFY4dmdBIF96SkFXbi0tc0VkdUg1OUtTSFY4dmdBIF96SkFXay0tc0VkdUg1OUtTSFY4dmdBIF96SkFXby0tc0VkdUg1OUtTSFY4dmdBIF96SkFXcE8tc0VkdUg1OUtTSFY4dmdBIF96SkFXb3Utc0VkdUg1OUtTSFY4dmdBIF96SkFXcC0tc0VkdUg1OUtTSFY4dmdBIF96SkFXcWUtc0VkdUg1OUtTSFY4dmdBIF96SkFXck8tc0VkdUg1OUtTSFY4dmdBIF96SkFXci0tc0VkdUg1OUtTSFY4dmdBIF96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIF96SkFXdE8tc0VkdUg1OUtTSFY4dmdBIF96SkFXdHUtc0VkdUg1OUtTSFY4dmdBIF96SkFXc3Utc0VkdUg1OUtTSFY4dmdBIF96SkFXdS0tc0VkdUg1OUtTSFY4dmdBIF96SkFXdi0tc0VkdUg1OUtTSFY4dmdBIF96SkFXdWUtc0VkdUg1OUtTSFY4dmdBIF96SkFXeGUtc0VkdUg1OUtTSFY4dmdBIF96SkFXeU8tc0VkdUg1OUtTSFY4dmdBIF96SkFXdy0tc0VkdUg1OUtTSFY4dmdBIF96SkFXemUtc0VkdUg1OUtTSFY4dmdBIF96SkFXME8tc0VkdUg1OUtTSFY4dmdBIF96SkFXeS0tc0VkdUg1OUtTSFY4dmdBIF96SktIa3Utc0VkdUg1OUtTSFY4dmdBIF96SktIay0tc0VkdUg1OUtTSFY4dmdBIF96SktIbE8tc0VkdUg1OUtTSFY4dmdBIF96SktIbC0tc0VkdUg1OUtTSFY4dmdBIF96SktIa08tc0VkdUg1OUtTSFY4dmdBIF96SktIbk8tc0VkdUg1OUtTSFY4dmdBIF96SktIbXUtc0VkdUg1OUtTSFY4dmdBIF96SktIbi0tc0VkdUg1OUtTSFY4dmdBIF96SktIb3Utc0VkdUg1OUtTSFY4dmdBIF96SktIby0tc0VkdUg1OUtTSFY4dmdBIF96SktIcHUtc0VkdUg1OUtTSFY4dmdBIF96SktIbmUtc0VkdUg1OUtTSFY4dmdBIF96SktIcS0tc0VkdUg1OUtTSFY4dmdBIF96SktIci0tc0VkdUg1OUtTSFY4dmdBIF96SktIc3Utc0VkdUg1OUtTSFY4dmdBIF96SktIcWUtc0VkdUg1OUtTSFY4dmdBIF96SktIdC0tc0VkdUg1OUtTSFY4dmdBIF96SktIdGUtc0VkdUg1OUtTSFY4dmdBIF96SktIdmUtc0VkdUg1OUtTSFY4dmdBIF96SktIdS0tc0VkdUg1OUtTSFY4dmdBIF96SktId3Utc0VkdUg1OUtTSFY4dmdBIF96SktId08tc0VkdUg1OUtTSFY4dmdBIF96SktIeGUtc0VkdUg1OUtTSFY4dmdBIF96SktIeWUtc0VkdUg1OUtTSFY4dmdBIF96SktIeC0tc0VkdUg1OUtTSFY4dmdBIF96SktIei0tc0VkdUg1OUtTSFY4dmdBIF96SktIMC0tc0VkdUg1OUtTSFY4dmdBIF96SktIemUtc0VkdUg1OUtTSFY4dmdBIF96SktIMS0tc0VkdUg1OUtTSFY4dmdBIF96SktIMi0tc0VkdUg1OUtTSFY4dmdBIF96SktIM2Utc0VkdUg1OUtTSFY4dmdBIF96SktIMmUtc0VkdUg1OUtTSFY4dmdBIF96SktINHUtc0VkdUg1OUtTSFY4dmdBIF96SktINC0tc0VkdUg1OUtTSFY4dmdBIF96SktINU8tc0VkdUg1OUtTSFY4dmdBIF96SktINWUtc0VkdUg1OUtTSFY4dmdBIF96SktINXUtc0VkdUg1OUtTSFY4dmdBIF96SktINS0tc0VkdUg1OUtTSFY4dmdBIF96SktINE8tc0VkdUg1OUtTSFY4dmdBIF96SktINk8tc0VkdUg1OUtTSFY4dmdBIF96SktINmUtc0VkdUg1OUtTSFY4dmdBIF96SktINi0tc0VkdUg1OUtTSFY4dmdBIF96SktINnUtc0VkdUg1OUtTSFY4dmdBIF96SktIN3Utc0VkdUg1OUtTSFY4dmdBIF96SktINy0tc0VkdUg1OUtTSFY4dmdBIF96SktIOE8tc0VkdUg1OUtTSFY4dmdBIF96SktIOHUtc0VkdUg1OUtTSFY4dmdBIF96SktIOGUtc0VkdUg1OUtTSFY4dmdBIF96SktIOWUtc0VkdUg1OUtTSFY4dmdBIF96SktIOXUtc0VkdUg1OUtTSFY4dmdBIF96SlRSZ08tc0VkdUg1OUtTSFY4dmdBIF96SlRSZ3Utc0VkdUg1OUtTSFY4dmdBIF96SlRSZ2Utc0VkdUg1OUtTSFY4dmdBIF96SlRSaHUtc0VkdUg1OUtTSFY4dmdBIF96SlRSaGUtc0VkdUg1OUtTSFY4dmdBIF96SlRSaXUtc0VkdUg1OUtTSFY4dmdBIF96SlRSaWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQWS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wMDwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxQ1JzTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjA2PC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQU1PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDU8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MkZha08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wNDwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS00Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjAzPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1FPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDE8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkRU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wMjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9KN3RHMU95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjXzAiLz4KLSAgICA8L3BhY2thZ2VJbXBvcnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eEtmQ3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDbGFzc2lmaWVyIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhLZkMtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4S2ZDdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eEtmRE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhVUFVPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhLZkRlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4S2ZEdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eEtmRGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eEtmRC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eEtmRU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhLZkQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eEtmRWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkRlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4S2ZFdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eEtmRS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eEtmRk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eEtmRmUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4S2ZGdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4S2ZGLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eEtmR08tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhVUFVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVHlwZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBVZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQVU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhVUFV1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZGdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4VVBWTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBhY2thZ2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQVmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUFZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4VVBWdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eFVQV08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhVUFYtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZGdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4VVBXTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik5hbWVzcGFjZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBXZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQV08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eFVQV3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEYXRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUFplLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBaTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5EYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVXJpIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUFotLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5EYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU3RyaW5nIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUGFlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4gc29tZSBzdWl0YWJsZSBjaGFyYWN0ZXIgc2V0IHVzZWQgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kZWwuIENoYXJhY3RlciBzZXRzIG1heSBpbmNsdWRlIG5vbi1Sb21hbiBhbHBoYWJldHMgYW5kIGNoYXJhY3RlcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBhdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlNldCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQYS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTZXF1ZW5jZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQYk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJJbnRlZ2VyIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUGJlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBiTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BbiBpbnRlZ2VyIGlzIGEgcHJpbWl0aXZlIHR5cGUgcmVwcmVzZW50aW5nIGludGVnZXIgdmFsdWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJCb29sZWFuIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUGItLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIEJvb2xlYW4gdHlwZSBpcyB1c2VkIGZvciBsb2dpY2FsIGV4cHJlc3Npb24sIGNvbnNpc3Rpbmcgb2YgdGhlIHByZWRlZmluZWQgdmFsdWVzIHRydWUgYW5kIGZhbHNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEb3VibGUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbnN0cmFpbnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3Yy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2N1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdkTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N2RlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYm9keSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2R1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdkZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3ZC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3ZU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3ZWUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4dzdodS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXh3N2gtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZGdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3aU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YWx1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdpZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdpdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdpLS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXh3N2pPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXh3N1R1LXNFZHVINTlLU0hWOHZnQSBfeXh3N2p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdqZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3ak8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgRWxlbWVudCBjYW4gb3duIG1hbnkgQ29uc3RyYWludHMgZGVmaW5pbmcgcnVsZXMgZm9yIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eHc3anUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l4dzdqTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l4dzdqLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l4dzdYLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdrZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3a08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ29udGVudCBEZXNjcmlwdGlvbiBjYW4gb3B0aW9uYWxseSBiZSBzdHJ1Y3R1cmUgaW50byBTZWN0aW9ucy4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlIHRvIGRlY29tcG9zZWQgU2VjdGlvbiBpbnRvIGEgaGllcmFyY2h5IG9mIFNlY3Rpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l4dzdrZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eHc3ai0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2t1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2stLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l4dzdsTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l4dzdiLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdsdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3bGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2xPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlNlY3Rpb25zIGNhbiBiZSBmdXJ0aGVyIGRlY29tcG9zZWQgaW50byBuIGxldmVscyBvZiBzdWItc2VjdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXh3N2x1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3NlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eHc3bE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2wtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N21PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eHc3bWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eHc3bS0tc0VkdUg1OUtTSFY4dmdBIF95eHc3Zy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N211LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdtZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIERlc2NyaWJhYmxlIEVsZW1lbnQgY2FuIGNvbnRhaW4gYSBDb250ZW50IERlc2NyaXB0aW9uIGVsZW1lbnQgdGhhdCBzdG9yZXMgdGV4dHVhbCBkZXNjcmlwdGlvbnMgZm9yIHRoaXMgQ29udGVudCBFbGVtZW50LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBpbnRlbmRlZCB0byBiZSByZWZpbmVkIHdpdGggc3ViLWNsYXNzZXMgYWRkaW5nIG1vcmUgZGVzY3JpcHRpb24gYXR0cmlidXRlcy4gIEFueSBvZiB0aGVzZSBzdWItdHlwZXMgY2FuIGJlIHJlbGF0ZWQgdG8gYSBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXh3N20tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2Rlc2NyaWJhYmxlRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l4dzdtZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3bk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3bmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l4NkZNTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l4dzdVZS1zRWR1SDU5S1NIVjh2Z0EgX3l4NkZNZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l4NkZNZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXg2Rk1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUm9sZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRFdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRFLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibW9kaWZpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il95eXpkWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEZlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZEZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkRi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkYWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZEdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ikd1aWRhbmNlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZE5PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkTmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZE51LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQXJ0aWZhY3QiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkTi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZE51LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkT08tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRPZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5OU9GZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkT3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkTy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRQTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE51LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFBlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRQLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFFPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRQLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkUWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRRdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eTlPRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFEtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFJPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRSZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik91dGNvbWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkUnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFJlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkUi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZFNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU3RlcCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRTZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkU08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuCi1BIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkU3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRTLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRUZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkVHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRULS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZWNvbmRpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N2N1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eTlPSk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFVPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFVlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkVXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Y3Utc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l5OU9KLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkVS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkVk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXl6ZFZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9QcmltYXJ5UGVyZm9ybWVyIiBtZW1iZXJFbmQ9Il95eXpkSHUtc0VkdUg1OUtTSFY4dmdBIF95eXpkVi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFZ1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRWZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Sb2xlcyBjYW4gYmUgZGVmaW5lZCB0byBwZXJmb3JtIG1hbnkgVGFza3MsIGJ1dCBldmVyeSBUYXNrIG1heSBoYXZlIG9ubHkgb25lIFJvbGUgdGhhdCBpcyBieSBkZWZhdWx0IHRoZSBwcmltYXJ5IHBlcmZvcm1lciBvZiB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXl6ZFYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icGVyZm9ybXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZFZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRXTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRXZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eXpkV3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X01hbmRhdG9yeUlucHV0cyIgbWVtYmVyRW5kPSJfeXl6ZFhPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRXLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkV3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG1hbmRhdG9yeSBpbnB1dHMgZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5emRYTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1hbmRhdG9yeUlucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZFd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRYZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRYdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eXpkWC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X091dHB1dHMiIG1lbWJlckVuZD0iX3l5emRZZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRKTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkWU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBvdXRwdXRzIG9mIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eXpkWWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvdXRwdXRGcm9tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRYLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkWXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkWS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXl6ZFpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9Nb2RpZmllcyIgbWVtYmVyRW5kPSJfeXl6ZFp1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZEZPLXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFplLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRaTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmFjdCB0aGF0IFJvbGVzIHBlcmZvcm0gVGFza3MgdGhhdCBoYXZlIFdvcmsgUHJvZHVjdHMgb2YgdGhhdCBwYXJ0aWN1bGFyIHR5cGUgYXMgb3V0cHV0cy4gIC9tb2RpZmllcyBwcm92aWRlcyBhbGwgdGhlIHR5cGVzIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCB0aGUgUm9sZSBwcm9kdWNlcyBvciBtb2RpZmllcyB2aWEgb25lIG9mIHRoZSBUYXNrcyBkZWZpbmVkIHRvIGJlIHBlcmZvcm1lZCBieSB0aGUgUm9sZSwgZWl0aGVyIGFzIHByaW1hcnkgb3IgYWRkaXRpb25hbCBwZXJmb3JtZXIuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXl6ZFp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibW9kaWZpZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iX3l5emRaTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkWi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkYU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXl6ZGFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9SZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfeXl6ZGEtLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRhdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkYWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UmVzcG9uc2liaWxpdHkgZm9yIGEgd29yayBwcm9kdWN0IGluZGljYXRlcyB0aGUgcm9sZSdzIG93bmVyc2hpcCBvZiBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgd29yayBwcm9kdWN0IHR5cGUuICBGb3IgZXhhbXBsZSwgdGhlIHJvbGUgcmVzcG9uc2libGUgZm9yIGEgd29yayBwcm9kdWN0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBhYm91dCBpdHMgcXVhbGl0eSBzdGF0ZS4gIEJlaW5nIHJlc3BvbnNpYmxlIGZvciB0aGUgd29yayBwcm9kdWN0IGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgcm9sZSBpcyB0aGUgb25seSBvbmUgbW9kaWZ5aW5nIGl0LCBidXQgbWFrZXMgdWx0aW1hdGUgZGVjaXNpb25zIGFib3V0IGFjY2VwdGluZyBvciByZWplY3RpbmcgdGhlc2UgbW9kaWZpY2F0aW9ucyB3aGVuIHJldmlld2luZyB0aGVzZSBtb2RpZmljYXRpb25zLiAgRXZlcnkgd29yayBwcm9kdWN0IGhhcyBub25lIG9yIG9uZSByb2xlIHJlc3BvbnNpYmxlIHJvbGUuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5emRhLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkYWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZGJPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZGJlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9FTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfQWRkaXRpb25hbFBlcmZvcm1lciIgbWVtYmVyRW5kPSJfeXk5T0V1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZEotLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9FZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPRU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGFkZGl0aW9uYWwgcm9sZXMgdGhhdCBieSBkZWZhdWx0IGNhbiBiZSBhc3NpZ25lZCB0byBoZWxwIGNvbXBsZXRpbmcgYSBUYXNrLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5OU9FdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImhlbHBzUGVyZm9ybWluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eTlPRU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXk5T0UtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXk5T0ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9GZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbXBvc2l0aW9uIiBtZW1iZXJFbmQ9Il95eXpkT2Utc0VkdUg1OUtTSFY4dmdBIF95eXpkUE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXk5T0Z1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5OU9GZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BcnRpZmFjdCB0eXBlcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBwaHlzaWNhbGx5IGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGlzIGNvbXBvc2VkIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXk5T0YtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdERlbGl2ZXJlZFdQIiBtZW1iZXJFbmQ9Il95eTlPR2Utc0VkdUg1OUtTSFY4dmdBIF95eXpkUXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXk5T0dPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5OU9GLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgdGhlIGRlZmF1bHQgcGFydHMgb2YgYSBkZWxpdmVyYWJsZSwgaS5lLiB0aGUgdHlwZXMgb2Ygd29yayBwcm9kdWN0cyBhIERlbGl2ZXJhYmxlIGNvbXByaXNlcyBvZi4gIFRoaXMgYWdncmVnYXRpb24gY2FuIGJlIG92ZXJyaWRkZW4gaW4gYSBQcm9jZXNzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5OU9HZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kZWxpdmVyYWJsZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3l5emRQLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eTlPRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXk5T0d1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXk5T0ctLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9ITy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfT3B0aW9uYWxJbnB1dHMiIG1lbWJlckVuZD0iX3l5emRLdS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9IdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPSGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0hPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBvcHRpb25hbCBpbnB1dHMgZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5OU9IdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im9wdGlvbmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eTlPSE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXk5T0gtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXk5T0lPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9JZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l5emRMZS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9JLS1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9JdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPSWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBkZXJpdmVkIGFzc29jaWF0aW9uIGlzIGEgc2hvcnRjdXQgZm9yIG5hdmlnYXRpb24gYWxvbmcgdGhlIGFzc29jaWF0aW9uIHByb3BlcnRpZXMgQ29udGVudEVsZW1lbnQucHJlc2VudGF0aW9uLnNlY3Rpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5OU9JLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXk5T0llLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXk5T0pPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXl6ZFQtLXNFZHVINTlLU0hWOHZnQSBfeXk5T0p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9KZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPSk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiBhZGRzIGFuIG9wdGlvbmFsIHByZS1jb25kaXRpb24gdG8gYSBXb3JrIERlZmluaXRpb24uICBBIHByZS1jb25kaXRpb24gZGVmaW5lcyBhbnkga2luZCBvZiBjb25zdHJhaW50IHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgd29yayBkZXNjcmliZWQgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gY2FuIHN0YXJ0LiBGb3IgZXhhbXBsZSwgYSBwcmUtY29uZGl0aW9uIGZvciBhIFRhc2sgY291bGQgZGVmaW5lIHRoYXQgYW4gaW5wdXQgV29yayBQcm9kdWN0IG5lZWRzIHRvIGJlIGluIGEgc3BlY2lmaWMgc3RhdGUgb3IgdGhhdCBvdGhlciByZWxhdGVkIHdvcmsgbXVzdCBiZSBpbiBhIGNlcnRhaW4gc3RhdGUgKGUuZy4gJ0lucHV0IGRvY3VtZW50IFggaGFzIGJlZW4gcmV2aWV3ZWQgYW5kIHNpZ25lZCBieSBjdXN0b21lciBBTkQgVGFzayAmcXVvdDtNYW5hZ2VtZW50IFJldmlldyZxdW90OyBpcyBjb21wbGV0ZScpIGJlZm9yZSB0aGUgVGFzayBjYW4gYmVnaW4uCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPSnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfd29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eTlPSk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPSi0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eXpkVXUtc0VkdUg1OUtTSFY4dmdBIF95eTlPS2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXk5T0tPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5OU9KLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIGFkZHMgYW4gb3B0aW9uYWwgcG9zdC1jb25kaXRpb24gdG8gYSBXb3JrIERlZmluaXRpb24uICBBIHBvc3QtY29uZGl0aW9uIGRlZmluZXMgYW55IGtpbmQgb2YgY29uc3RyYWludCB0aGF0IG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIHdvcmsgZGVzY3JpYmVkIGZvciB0aGUgV29yayBEZWZpbml0aW9uIGNhbiBiZSBkZWNsYXJlZCBjb21wbGV0ZWQgb3IgZmluaXNoZWQgYW5kIHdoaWNoIG90aGVyIFdvcmsgRGVmaW5pdGlvbnMgbWlnaHQgZGVwZW5kIHVwb24gKGUuZy4gZm9yIHRoZWlyIHByZS1jb25kaXRpb25zKS4gIEZvciBleGFtcGxlLCBhIHBvc3QtY29uZGl0aW9uIGZvciBhIFRhc2sgY291bGQgZGVmaW5lIHRoYXQgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCB0byBiZSB0aGUgb3V0cHV0IG11c3QgYmUgaW4gYSBzcGVjaWZpYyBzdGF0ZSBiZWZvcmUgdGhlIFRhc2sgY2FuIGVuZCAoZS5nLiAnVXNlIENhc2UgbXVzdCBiZSBpbiBzdGF0ZSBmdWxseSBkZXNjcmliZWQgYW5kIHJldmlld2VkIGJ5IFN5c3RlbSBBbmFseXN0JykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXk5T0tlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXk5T0otLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLTRlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29uY2VwdCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS00dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtNGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtNC0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLTVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ2hlY2tsaXN0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTVlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtNXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLTUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRXhhbXBsZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS02Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtNS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtNmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLTZ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3VpZGVsaW5lIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTYtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS02dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS03Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtN2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSZXBvcnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtN3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtNy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLThPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGVtcGxhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtOGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLThPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTh1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS05Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+U3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtOWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLTl1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVG9vbE1lbnRvciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS05LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtOXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLS1PLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS0tZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldoaXRlcGFwZXIiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtLXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLS1lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PldoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS0tLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95ejEtNGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtX08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS1fZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtX08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS1fdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXb3JrUHJvZHVjdCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRNZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxX0NPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFdvcmsgUHJvZHVjdCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkTXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6MV9DZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlcG9ydHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS03ZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0Z1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9DdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9DLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXoxX0RPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGVtcGxhdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOE8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dJTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95ejFfRGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95ejFfRHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6MV9ELS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kwSmc2dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95ejFfRU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95ejFfRWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6MV9FdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXpfdl8tLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnOHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXoxX0UtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXoxX0ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRhc2siPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkRy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejFfRmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgVGFzayAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRpb25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZEhPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkSGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRIdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRWZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkSC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkSU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRJZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRXdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkSXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkSS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRKTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im91dHB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkWC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEplLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZEp1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkSi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eTlPRU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEtPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZEtlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkS3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvcHRpb25hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5OU9ITy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkSy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkTE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRMZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0ZXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkU08tc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXk5T0llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRMdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRMLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjRPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0plLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y0ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3Y0dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95el92Xy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kwSmc3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92NU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92NWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXpfdl9PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3ZfZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el92X08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXpfdl91LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6X3ZfLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dBTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el92Xy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXpfd0FlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dBdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dCTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93QS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0F1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudHMgY2FuIGJlIHJlbGF0ZWQgdG8gYW55IG51bWJlciBvZiBTdXBwb3J0aW5nIE1hdGVyaWFsIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dCTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93QXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0JlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0J1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dCLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dDZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y2dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93Q08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0ItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudHMgY2FuIHJlZmVyIHRvIGFueSBudW1iZXIgb2YgQ29uY2VwdCBndWlkYW5jZS4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0NlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dCLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93Q3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93Qy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0RPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0R1LXNFZHVINTlLU0hWOHZnQSBfeXpfdjdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dEZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93RE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UHJvdmlkZXMgY2hlY2sgcG9pbnRzIHJlbGF0ZWQgdG8gYSBwYXJ0aWN1bGFyIGNvbnRlbnQgZWxlbWVudHMuICBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gcmV2aWV3cyBhbmQgaW5zcGVjdGlvbnMgb24gd29yayBwcm9kdWN0cy4KLQotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0R1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0RPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dELS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93RWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93RS0tc0VkdUg1OUtTSFY4dmdBIF95el92OE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0V1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dFZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBkZXRhaWxlZCBHdWlkZWxpbmVzIHJlbGF0ZWQgdG8gdGhpcyBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0UtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0VlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dGTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dGZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93RnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93R08tc0VkdUg1OUtTSFY4dmdBIF95ejFfQ2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0YtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dGdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJlcG9ydCBleHRyYWN0cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBXb3JrIFByb2R1Y3Q7IG5vcm1hbGx5IGRpcmVjdGx5IGZyb20gYSB0b29sIHRoYXQgbWFpbnRhaW5zIHRoZSBXb3JrIFByb2R1Y3RzLiBGb3IgZXhhbXBsZSwgYSBSZXBvcnQgY2FuIHByZXNlbnQgZGV0YWlscyBvZiBhbiBBcnRpZmFjdCBvciBhIHNldCBvZiBBcnRpZmFjdHMgZm9yIHVzZSBpbiBhIHRlY2huaWNhbCByZXZpZXcuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dHTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dGdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93R2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93R3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0ctLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0hlLXNFZHVINTlLU0hWOHZnQSBfeXpfdjgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dITy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93Ry0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBzYW1wbGUgb2Ygd2hhdCB0aGUgd29yayBwcm9kdWN0IG1heSBsb29rIGxpa2UsIGFuIGFjdHVhbCBpbnN0YW5jZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93SGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93Ry0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0h1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0gtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dJTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dJdS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9ETy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93SWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0lPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlByb3ZpZGVzIGRldGFpbGVkIGd1aWRhbmNlIG9uIGhvdyB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QgaW5kZXBlbmRlbnQgb2YgYSBzcGVjaWZpYyBzZXQgb2YgdGFza3Mgb3IgV0JTLiAgTWF5IGNvbnRhaW4gc3BlY2lmaWMgYWxnb3JpdGhtcyBvciBhbHRlcm5hdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaGVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dJdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dJTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93SS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93Sk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0plLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0otLXNFZHVINTlLU0hWOHZnQSBfeXpfdjRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dKdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93SmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+TGlua3MgVGFza3Mgd2l0aCBUb29sIE1lbnRvcnMgd2hpY2ggYXJlIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3cgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gcGVyZm9ybSB0aGUgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93Si0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dKZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93S08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93S2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0t1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXoxX0F1LXNFZHVINTlLU0hWOHZnQSBfeXpfd0xPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dLLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93S3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcmFjdGljZSBjYW4gYmUgY29tcG9zZWQgb2Ygb3RoZXIgUHJhY3RpY2VzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dMTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dLdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kwSmc0Ty1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6MV9CZS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MEpnNGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTBKZzRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJhY3RpY2UgY2FuIHJlZmVyZW5jZSBhbnkgQ29udGVudCBFbGVtZW50LiAgVGhlIGFzc29jaWF0aW9uIGV4cHJlc3NlcyB0aGF0IHRoaXMgQ29udGVudCBFbGVtZW50IGlzIHBhcnQgb2Ygb3IgYmVsb25ncyB0byB0aGlzIFByYWN0aWNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kwSmc0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kwSmc0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnNC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnNU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTBKZzVlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfdjl1LXNFZHVINTlLU0hWOHZnQSBfeTBKZzUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kwSmc1dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MEpnNWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSB3b3JrIHByb2R1Y3QgaXMgcmVsYXRlZCB0byBvbmUgb3IgbW9yZSBhc3NldHMgdG8gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTBKZzUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTBKZzVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kwSmc2Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kwSmc2ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnNnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95ejFfRC0tc0VkdUg1OUtTSFY4dmdBIF95MEpnNi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnNi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95MEpnNnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTBKZzdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTBKZzdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kwSmc3dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kwSmc3LS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y0LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kwSmc3LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTBKZzd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kwSmc4Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kwSmc4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnOHUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95MEpnOC0tc0VkdUg1OUtTSFY4dmdBIF95ejFfRXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnOC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95MEpnOHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTBKZzlPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTBKZzllLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kwSmc5dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3YtZS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc5LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kwSmc5LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kwSmctTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kwSmctZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1Dc08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1Dc2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTFNQzdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUNzdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJyaWVmT3V0bGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQ3MtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUNzdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQ3RPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ3RlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ3R1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQ3QtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DdU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQ3QtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUN1ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUN1dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUN1LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUN2Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlcHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQ3ZlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ3Z1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ3YtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQ3dPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1Dd2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1Dd3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1Ddy0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUN4Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kxTUN4ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95MU1DN2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQ3h1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQ3gtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUN4dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUN5Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUN5ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUN5dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUN5LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1Dek8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQ3ktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUN6ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUN6dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUN6LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNQzBPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1DMGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUMwdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNraWxscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzAtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUMwdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DMU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DMWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DMXUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DMS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzJPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUMxLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DMmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DMnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DMi0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DM08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzeW5vbnltcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzNlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUMzTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUMzdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUMzLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUM0Ty1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNQzRlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1DNHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUM0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUM1Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DNC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzVlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzV1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzUtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DNmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQzZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUM2dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUM2LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUM3Ty1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNQzdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQzd1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DNy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DOE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQzctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DOGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DOHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DOC0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DOU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzllLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUM5Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQy1PLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQy1lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUMtdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DLWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DLS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DX08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DX2Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUNfdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kxTUNfLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREFPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXR0YWNobWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURBZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1EQU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNREF1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREEtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREJPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1EQmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1EQnUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURCLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1EQ08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNRENlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREN1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREMtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNRERPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvYmxlbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNRERlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURETy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ERHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ERC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ERU8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ERWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJiYWNrZ3JvdW5kIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ERXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURFLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURGTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURGZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURGdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImdvYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ERi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNREdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREd1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXBwbGljYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURITy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ERy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ESGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ESHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ESC0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ESU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ESWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNRElPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ESXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ESS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ESk8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdlLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREplLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGRlZmluaXRpb24gb2YgQ29udGVudCBFbGVtZW50IGV4dGVuZHMgdGhlIENvbnRlbnQgRWxlbWVudCBkZWZpbml0aW9uIHZpYSBwYWNrYWdlIG1lcmdlIHdpdGggcmVmZXJlbmNlcyB0byBpY29ucyB0aGF0IGFyZSB1c2VkIGZvciBwcmVzZW50aW5nIENvbnRlbnQgRWxlbWVudHMgaW4gYSBVTUEtYmFzZWQgbW9kZWxpbmcgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyB3aGVuIHB1Ymxpc2hpbmcgQ29udGVudCBFbGVtZW50cyBpbnRvIGRvY3VtZW50YXRpb24gcHJlc2VudGF0aW9uIChlLmcuIGRvY3VtZW50IG9yIGh0bWwgcGFnZXMpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdmTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmQ3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXh3N2ZlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3ZnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3Zi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2Z1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdnTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdnZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdndS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdnLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eHc3bWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ESnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzaGFwZWljb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURKLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ESnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNREtPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREtlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREt1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREstLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibm9kZWljb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURMTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ESy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURMZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURMdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURMLS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa2llLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUm9sZVNldCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2tpdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9raWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2tpLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa2pPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2tqZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tqdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rai0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEb21haW4iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9ra08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa2otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9ra2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2trdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rd2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa2stLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa2xPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rbGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJkb21haW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rai0tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kyT2t4dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rbHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rbC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa21PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa21lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2ttTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Xb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rbXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2ttLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9reWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa25PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa25lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2tuLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Q29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rb08tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa29lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa291LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tvZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rby0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2twTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRpc2NpcGxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t6dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rcGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rcHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa3AtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVG9vbCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2txTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rcC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa3FlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rcXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTl1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rMC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3EtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3JPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tyZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2tydS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rcmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2tyLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa3NPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tpZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2tzZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tzdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rcy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2t0Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rcy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2t0ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa3R1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rM2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3QtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3VPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rdWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2s0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rdXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rdS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPa3ZPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa3Z1LXNFZHVINTlLU0hWOHZnQSBfeTJPa2pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2t2ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rdk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBjYXRlZ29yaXplcyBtYW55IFJvbGVzIGFuZCBhIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGluIG1heSBSb2xlIFNldHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPa3Z1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tpZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2t2LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2t3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rd2Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rdy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9ra3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3d1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2t3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIERvbWFpbiBjYXRlZ29yaXplcyBtYW55IFdvcmsgUHJvZHVjdHMuIEEgV29yayBQcm9kdWN0IGJlbG9uZ3MgYXQgbW9zdCB0byBvbmUgRG9tYWluLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2t3LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRvbWFpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2otLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rd2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2t4dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2t5Ty1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tsZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9reC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3h1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIFN1YmRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIG9ubHkgdG8gYmUgY2F0ZWdvcml6ZWQgYXQgdGhlIGxlYWYtbGV2ZWwuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPa3lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2RvbWFpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2otLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kyT2t4dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2t5ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2t5LS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2ttLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9reXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSB6ZXJvIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2t5LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtQcm9kdWN0VHlwZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2ttTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2t6Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2t6ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9renUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rME8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rcE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3otLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2t6dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIEdyb3VwaW5ncyBncm91cCBtYW55IERpc2NpcGxpbmVzLiAgQSBEaXNjaXBsaW5lIGNhbiBiZSBpbiBtYW55IERpc2NpcGxpbmUgR3JvdXBzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2swTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRpc2NpcGxpbmVHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tvZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2swZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2swdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rMC0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rMWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rcXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPazFPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2swLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGRlc2NyaWJlcyB3b3JrIHdpdGggZXhhY3RseSBvbmUgVG9vbC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rMWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0b29sIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rcC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2swLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rMXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rMS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2syTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2sydS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tzTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rMmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPazJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9sZSBTZXQgR3JvdXBpbmcgY29udGFpbnMgbWFueSBSb2xlIFNldHMuIFJvbGUgU2V0cyBjYW4gYmUgaW4gbWFueSBSb2xlIFNldCBHcm91cGluZ3MuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm9sZVNldEdyb3VwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa3JlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rMk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPazItLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPazNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2szZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2t0dS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2szLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rM3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPazNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ3VzdG9tQ2F0ZWdvcnkgZ3JvdXBzIHRvZ2V0aGVyIGFueSBudW1iZXIgb2YgQ29udGVudEVsZW1lbnRzIGluY2x1ZGluZyBvdGhlciBDb250ZW50Q2F0ZWdvcnkuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2szLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImN1c3RvbUNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tzLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2s0Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2s0ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rdWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rNU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPazQtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2s0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGNhbiBoYXZlIGFueSBudW1iZXIgb2YgQ29udGVudENhdGVnb3JpZXMgZGVmaW5lZCBhcyBuZXN0ZWQgc3ViQ2F0ZWdvcmllcy4gIFRoZXJlZm9yZSwgb25lIGNvdWxkIG5lc3QgQ3VzdG9tQ2F0ZWdvcmllcyBpbnRvIG4tbGV2ZWwgaGllcmFyY2hpZXMuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2s1Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jdXN0b21DYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa3MtLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kyT2s0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rNWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rNXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2s1LS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2tnLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s2ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rNk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPazUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkV2ZXJ5IFRhc2sgc2hvdWxkIGJlIHJlbGF0ZWQgdG8gZXhhY3RseSBvbmUgRGlzY2lwbGluZS4gIEZvciBsZWdhY3kgcmVhc29ucyB0aGlzIGlzIG5vdCBlbmZvcmNlZCAoZS5nLiBHUyBNZXRob2QgZG9lcyBub3QgZGVmaW5lIERpc2NpcGxpbmVzLCB5ZXQpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2s2ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2s2dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2s2LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rN08tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9raHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rN2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rN2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kyT2s3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kzUnRZTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlN0YXRlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M1J0WWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzUnRZdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNoZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M1J0WS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M1J0Wk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M1J0WmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWdpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNlZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTNhM2plLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzUnRadS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzUnRaLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNSdGFPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VibWFjaGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1h1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzanUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNSdGFlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNSdGF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kzYTNVTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRyYW5zaXRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kzYTNVZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM1V1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2gtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNVLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNWTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNWZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM2VlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM1Z1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM1YtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM1dPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNpLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzV2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzV3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzVy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0YXJnZXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNZLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNYTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNYZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTNhM1h1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU3RhdGVNYWNoaW5lIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzWC0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNZTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlZ2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM2VlLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95M2Eza3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM1llLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM1l1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJWZXJ0ZXgiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kzYTNaTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM1plLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzZWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNpZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzWnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzWi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNhTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im91dGdvaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNpLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzYWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzYXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNhLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImluY29taW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNqTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzYk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzYmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTNhM2J1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHNldWRvU3RhdGUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kzYTNiLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il95M2EzY08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQc2V1ZG9TdGF0ZUtpbmQiPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzY2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbml0aWFsIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNjdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImpvaW4iLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2MtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZm9yayIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzZE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJqdW5jdGlvbiIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzZGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjaG9pY2UiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2R1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZW50cnlQb2ludCIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzZC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleGl0UG9pbnQiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2VPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGVybWluYXRlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95M2EzZWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSZWdpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kzYTNldS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM2UtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmVydGV4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kzYTNpZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzZk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzZmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNmdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRyYW5zaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNVTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTNhM2l1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNmLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNnTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM2dlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzUnRZTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2plLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNndS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXRlTWFjaGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1h1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2Eza3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2ctLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2hPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNoZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzUnRZdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNodS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kzYTNodS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M1J0WU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNoZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNoLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNVdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNpTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kzYTNpTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRyYW5zaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNVTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2gtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2llLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNhM2UtLXNFZHVINTlLU0hWOHZnQSBfeTNhM1plLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2l1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNhM2Z1LXNFZHVINTlLU0hWOHZnQSBfeTNhM1ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2ktLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNhM2FPLXNFZHVINTlLU0hWOHZnQSBfeTNhM1dPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2pPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNhM2EtLXNFZHVINTlLU0hWOHZnQSBfeTNhM1ctLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2plLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNSdFplLXNFZHVINTlLU0hWOHZnQSBfeTNhM2dlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2p1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNSdGFPLXNFZHVINTlLU0hWOHZnQSBfeTNhM2otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTNhM2otLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViTWFjaGluZVN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M1J0WU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNqdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2Eza08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2Eza2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2t1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNhM1lPLXNFZHVINTlLU0hWOHZnQSBfeTNhM2d1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kUGFja2FnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFNdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k0ZUFNLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eFVQVk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTRlQU5PLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95NGVBTmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJnbG9iYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFOdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NGVBTmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95NGVBTi0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95NGVBT08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NGVBU2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQU9lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQU91LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95NGVBTy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3k0ZUFUdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NGVBUE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NGVBUGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTRlQVB1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBUC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTRlQVB1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTRlQVFPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95NGVBUWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250ZW50RWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTRlQVJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k0ZUFRdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k0ZUFRLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NGVBUk8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95NGVBUWUtc0VkdUg1OUtTSFY4dmdBIF95NGVBUnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQVJlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k0ZUFSTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBjb250YWlucyBDb250ZW50IEVsZW1lbnRzLiAgQSBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgcGFja2FnZSBpbnN0YW5jZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NGVBUnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudFBhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFQdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NGVBUk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQVItLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQVNPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NGVBU2Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95NGVBUy0tc0VkdUg1OUtTSFY4dmdBIF95NGVBT08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQVN1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k0ZUFTZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgdHdvIHBhY2thZ2VzIGl0IGNvbm5lY3RzLiAgVGhlIHBhY2thZ2UgYXQgdGhlIHVzaW5nUGFja2FnZSBlbmQgZGVwZW5kcyBvbiB0aGUgcGFja2FnZSBhdCB0aGUgcmV1c2VkUGFja2FnZSBlbmQuICBGb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBpbiB0aGUgZm9ybWVyIHBhY2thZ2UgaXMgdXNpbmcgYW4gZWxlbWVudCBpbiB0aGUgbGF0ZXIgaW4gYSByZWxhdGlvbnNoaXAgc3VjaCBhcyBhIFRhc2sgaXMgdXNpbmcgYSBXb3JrIFByb2R1Y3RzIGFzIGFuIGlucHV0LiAgUmVmbGV4aXZlIHJldXNlZFBhY2thZ2UgbGlua3MgKGkuZS4gYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBpdHNlbGYpIGFyZSBub3QgYWxsb3dlZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NGVBUy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ1c2luZ1BhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k0ZUFTZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NGVBVE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NGVBVGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTRlQVR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUGFja2FnZU5lc3RpbmciIG1lbWJlckVuZD0iX3k0ZUFVTy1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFPLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBVC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTRlQVR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gYmUgbmVzdGVkLCBpLmUuIGEgcGFja2FnZSBjYW4gYmUgcGFydCBvZiBhbm90aGVyIHBhY2thZ2UuICBOZXN0ZWQgcGFja2FnZXMgZG8gbm90IG5lZWQgdG8gYmUgb2YgdGhlIHNhbWUgdHlwZSwgZS5nLiBhIENvbnRlbnQgUGFja2FnZSBjYW4gYmUgZGVmaW5lZCBpbnNpZGUgYSBQcm9jZXNzIFBhY2thZ2UgKGRlZmluZSBmb3IgdGhlIFByb2Nlc3MgcGFydCBvZiB0aGlzIG1vZGVsKS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NGVBVU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3k0ZUFUdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NGVBVWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NGVBVXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTdtTXQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWlsZXN0b25lIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTdtTXVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU10LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTdtTXVlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3bU11dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3bU11LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21NdXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+SXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU12Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N21NdmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQaGFzZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3bU12dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21NdmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTdtTXYtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3bU13Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRlYW1Qcm9maWxlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTdtTXdlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU13Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N21Nd3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3bU13LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRlYW1Sb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95N3ZYTy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTdtTXhPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTdtTXhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N21NeHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdXBlclRlYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU13Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SG9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3bU14LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3bU15Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3bU15ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1YlRlYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU13Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SG9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3bU15dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3bU15LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il95N3ZXb08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V29lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldvTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3k3dldvdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldvLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXb3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBhbmQgJnF1b3Q7UGFpbnQgZmVuY2UsJnF1b3Q7ICZxdW90O1BhaW50IGZlbmNlJnF1b3Q7IGNhbid0IHN0YXJ0IHVudGlsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBmaW5pc2hlcy4gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gdHlwZSBvZiBkZXBlbmRlbmN5IGFuZCB0aGUgZGVmYXVsdCBmb3IgYSBuZXcgV29yayBPcmRlciBpbnN0YW5jZS4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTd2V3BPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZmluaXNoVG9GaW5pc2giPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldwZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGFuZCAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwsJnF1b3Q7ICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCZxdW90OyBjYW4ndCBmaW5pc2ggdW50aWwgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBmaW5pc2hlcy4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTd2V3B1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RhcnRUb1N0YXJ0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXcC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3B1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGFuZCAmcXVvdDtMZXZlbCBjb25jcmV0ZSwmcXVvdDsgJnF1b3Q7TGV2ZWwgY29uY3JldGUmcXVvdDsgY2FuJ3QgYmVnaW4gdW50aWwgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGJlZ2lucy4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTd2V3FPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RhcnRUb0ZpbmlzaCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3FlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldxTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIFRoaXMgZGVwZW5kZW5jeSB0eXBlIGNhbiBiZSB1c2VkIGZvciBqdXN0LWluLXRpbWUgc2NoZWR1bGluZyB1cCB0byBhIG1pbGVzdG9uZSBvciB0aGUgcHJvamVjdCBmaW5pc2ggZGF0ZSB0byBtaW5pbWl6ZSB0aGUgcmlzayBvZiBhIEJyZWFrZG93biBFbGVtZW50IGZpbmlzaGluZyBsYXRlIGlmIGl0cyBkZXBlbmRlbnQgQnJlYWtkb3duIEVsZW1lbnRzIHNsaXAuIElmIGEgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoZSBtaWxlc3RvbmUgb3IgcHJvamVjdCBmaW5pc2ggZGF0ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGV4YWN0bHkgd2hlbiBhbmQgeW91IGRvbid0IHdhbnQgYSBsYXRlIGZpbmlzaCB0byBhZmZlY3QgdGhlIGp1c3QtaW4tdGltZSBCcmVha2Rvd24gRWxlbWVudCwgeW91IGNhbiBjcmVhdGUgYW4gU0YgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBCcmVha2Rvd24gRWxlbWVudCB5b3Ugd2FudCBzY2hlZHVsZWQganVzdCBpbiB0aW1lICh0aGUgcHJlZGVjZXNzb3IpIGFuZCBpdHMgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCAodGhlIHN1Y2Nlc3NvcikuIFRoZW4gaWYgeW91IHVwZGF0ZSBwcm9ncmVzcyBvbiB0aGUgc3VjY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LCBpdCB3b24ndCBhZmZlY3QgdGhlIHNjaGVkdWxlZCBkYXRlcyBvZiB0aGUgcHJlZGVjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2V3F1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya09yZGVyIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3EtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldxdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLShOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKQotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dldyTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3JlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibGlua1R5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dldvTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldydS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2V3ItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmluaXNoVG9TdGFydDwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dldzTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dldzZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dldzdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2V3MtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3RPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldzLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5QbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKQotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2V3RlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXdHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGFydERhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBaTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld0LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXdHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld1Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImZpbmlzaERhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBaTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld1ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXdU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXdXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyYW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXdS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3V1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXdmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZXdi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld3Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZWZpeCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3dlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld3Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2V3d1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2V3ctLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTd2V3hPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3hlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNQbGFubmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXeHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3hlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotCi0KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZXeC0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld5Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld5ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXeU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZXeXUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXeS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc09wdGlvbmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXek8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3ktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZXemUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXenUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIb3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2V3otLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzBPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXMGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlcwdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlcwLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzFPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icGxhbm5pbmdEYXRhIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXcy0tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3lfQlVOTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXMWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXMXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlcxLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVUnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzJPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzJlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZXNjcmlwdG9yIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2VzItLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlcydS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIAotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2VzNPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXM2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2VzN1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2VzRPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2VzRlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlcydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXNHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhzZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXNC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXNU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc1ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1vZGlmaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfeTc1SHpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlc1dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlc1LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlc2ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlc2dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlc3Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLQotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2VzdlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlcydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZXN3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc3LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlc4Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlc4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2Vzh1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlc4LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlc5Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXNzaXN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIdS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2Vzl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXLU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleHRlcm5hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh3Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXLWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXLXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlctLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXX08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXX2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dldfdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDBlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dldfLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhBTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3V0cHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgxdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYQXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYQS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhCTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYQmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYQnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhCLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNlbGVjdGVkU3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekJaNkMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhDTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhDZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYQy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlhETy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WERlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYRHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WERlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEQtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEVPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTd2WEVlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhFLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYRXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhGTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhGZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3k3dlhGdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhGLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhyTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYR08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYR2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhHdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImltcGFjdGVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhHLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhITy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEhlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW1wYWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIeGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEh1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEgtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYSU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgyLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYSWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYSXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2WEktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhKTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYSS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDb21wb3NpdGUgUm9sZSBpcyBhIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2WEplLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYSnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhKLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhLTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhLdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2WEstLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYTE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc1JlcGVhdGFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhMZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYTE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2WEx1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEwtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNPbmdvaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYTU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WEwtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dlhNZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhNdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzRXZlbnREcml2ZW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhNLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYTXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi0KLQotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dlhOTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhOZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXcXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgtTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYTnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYTi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYT2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIAotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2WE91LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3dlhPLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dlhQZS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU13LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYUE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WE8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYWdncmVnYXRpb24gYXNzb2NpYXRpb24gc3BlY2lmaWVzIHRoZSByb2xlcyBvZiB0ZWFtIG1lbWJlcnMgd2l0aCBSb2xlIERlc2NyaXB0b3JzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3dlhQZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il90ZWFtUHJvZmlsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXdPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3k3dlhPLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYUHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYUC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SG9PLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTdtTXh1LXNFZHVINTlLU0hWOHZnQSBfeTdtTXllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUhvZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIb08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWxhdGVzIGEgU3ViLVRlYW0gdG8gaXRzIFN1cGVyLVRlYW0sIGkuZS4gdGhlIFRlYW0gdGhhdCBpdCBpcyBwYXJ0IG9mLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SG91LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2V3p1LXNFZHVINTlLU0hWOHZnQSBfeTc1SHBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUhvLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIb3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIgaXMgcmVkdW5kYW50IHRvIHRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRCZWZvcmUuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIcE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3k3NUhvdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIcGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIcHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHAtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTc1SHFlLXNFZHVINTlLU0hWOHZnQSBfeTd2VzctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUhxTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIcC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgVGFzayBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbiBUYXNrLiAgSG93ZXZlciwgYSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIcWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0YXNrRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIcC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHF1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHEtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhyTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3NUhydS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhGLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIcmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbmUgV29yayBQcm9kdWN0LiAgSG93ZXZlciwgYSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhyTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIci0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIc08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHNlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTc1SHMtLXNFZHVINTlLU0hWOHZnQSBfeTd2VzR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUhzdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIc2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgUm9sZSBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbmUgUm9sZS4gIEhvd2V2ZXIsIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHMtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm9sZURlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh0Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUh0ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIdHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtcyIgbWVtYmVyRW5kPSJfeTd2Vzh1LXNFZHVINTlLU0hWOHZnQSBfeTc1SHVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh0LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIdHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCByb2xlcyBuZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlIHJlZmVycmVkIFRhc2suICBJbnN0YW5jZXMgb2YgdGhlc2Ugcm9sZXMgd291bGQgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icGVyZm9ybXNBZGRpdGlvbmFsbHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh1ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUh1dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIdS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJBc3Npc3RzIiBtZW1iZXJFbmQ9Il95N3ZXOWUtc0VkdUg1OUtTSFY4dmdBIF95NzVIdmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHZPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUh1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyBoYXZlIGJlZW4gZGVmaW5lZCBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgdGhhdCBtYXkgcHJvdmlkZSBpbmZvcm1hdGlvbiBvciBhc3Npc3RhbmNlIGhlbHBmdWwsIGJ1dCBub3QgbWFuZGF0b3J5IHRvIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIG5vdCBzaG93IHVwIGFzIHNjaGVkdWxlZCByZXNvdXJjZXMgb24gdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUh2ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFzc2lzdHNJbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIdS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHZ1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHYtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUh3Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkV4dGVybmFsSW5wdXQiIG1lbWJlckVuZD0iX3k3dlctTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVId2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzLCBpLmUuIG5vIGRlZmF1bHRzIHdpbGwgYmUgZGVmaW5lZCBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdXNlZCBhcyBpbnB1dHMgdGhhdCBhcmUgbm90IHByb2R1Y2VkIGJ5IFRhc2tzIHdpdGhpbiB0aGUgc2FtZSBQcm9jZXNzLCBidXQgYnkgYW5vdGhlciBleHRlcm5hbCBwcm9jZXNzIG9yIGFuIHVua25vd24gc291cmNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUh3dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVId08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHctLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHhPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUh4ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkltcGFjdHNEZXBlbmRlbmN5IiBtZW1iZXJFbmQ9Il95N3ZYR3Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYSGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHh1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUh4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc2VtaS1mb3JtYWxseSBzcGVjaWZ5IHRyYWNlYWJpbGl0eSByZWxhdGlvbnNoaXBzIGJldHdlZW4gV29yayBQcm9kdWN0cyB3aXRoaW4gdGhlIHNjb3BlIG9mIGFuIEFjdGl2aXR5LiAgQSBsaW5rIGZyb20gb25lIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHRvIGFub3RoZXIgaW5kaWNhdGVzIHRoYXQgb25lIFdvcmsgUHJvZHVjdCBpcyByZXF1aXJlZCBhcyBpbnB1dCB0byBhIFRhc2sgdGhhdCBwcm9kdWNlcyB0aGUgcmVsYXRlZCBXb3JrIFByb2R1Y3QgKCdpbXBhY3RzJyByb2xlIGVuZCkuICBJdCB3b3VsZCBhbHNvIG1lYW4gdGhhdCBhIGNoYW5nZSBvbiBvbmUgV29yayBQcm9kdWN0IGluc3RhbmNlIG1heSBhZmZlY3QgYSBjaGFuZ2Ugb24gdGhlIHJlbGF0ZWQgcHJvZHVjdC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUh4LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1hbmRhdG9yeUlucHV0IiBtZW1iZXJFbmQ9Il95N3ZXLS0tc0VkdUg1OUtTSFY4dmdBIF95NzVIeWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHlPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUh4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG1hbmRhdG9yeSBmb3IgdGhlIFRhc2sgdG8gYmUgcGVyZm9ybWVkLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUh5ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1hbmRhdG9yeUlucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh5dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUh5LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIek8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNb2RpZmllcyIgbWVtYmVyRW5kPSJfeTd2VzVlLXNFZHVINTlLU0hWOHZnQSBfeTc1SHp1LXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHplLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUh6Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgTW9kaWZpZXMgYXNzb2NpYXRpb24gZGVmaW5lZCBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgYW5kIFRhc2tzIGluIENvcmUgTWV0aG9kIENvbnRlbnQuICBUaGUgc2FtZSBkZXJpdmF0aW9uIHJ1bGUgYXMgZm9yIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudHMgYXBwbGllcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIenUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcm9sZURlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NzVIek8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHotLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDBPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUgwZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik9wdGlvbmFsSW5wdXQiIG1lbWJlckVuZD0iX3k3NUgwLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dldfdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIMHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDBlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgb3B0aW9uYWwgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIMC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJPcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDBlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUgxTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUgxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIMXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJPdXRwdXQiIG1lbWJlckVuZD0iX3k3NUgyTy1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhBZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIMS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDF1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgb3V0cHV0cyBmb3IgcGVyZm9ybWluZyB0aGUgcmVmZXJyZWQgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIMk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvdXRwdXRGcm9tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgxdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIMmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIMnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUGFja2FnZWRXUCIgbWVtYmVyRW5kPSJfeTc1SDNlLXNFZHVINTlLU0hWOHZnQSBfeTd2WElPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUgzTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIMi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+SWYgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZWZlcnMgYXQgdGhlICdkZWxpdmVyYWJsZScgcm9sZSBlbmQgdG8gYSBEZWxpdmVyYWJsZSBXb3JrIFByb2R1Y3QgdGhlbiB0aGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgRGVsaXZlcmFibGUncyBXb3JrIFByb2R1Y3QgcGFydHMuICBBcyBpbmRpY2F0ZWQgZm9yIERlbGl2ZXJhYmxlIGluIHRoZSBDb3JlIE1ldGhvZCBDb250ZW50IHBhY2thZ2UsIHRoaXMgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIHRoZSAnZGVsaXZlcmVkV29ya1Byb2R1Y3RzJyBhc3NvY2lhdGlvbiBvZiB0aGUgV29yayBQcm9kdWN0LCB3aGljaCBzdG9yZXMgdGhlIHJlY29tbWVuZGVkIGRlbGl2ZXJhYmxlIHBhcnRzLCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgZm9yIGV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIM2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWxpdmVyYWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDN1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDMtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUg0Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByaW1hcnlQZXJmb3JtcyIgbWVtYmVyRW5kPSJfeTd2WEJPLXNFZHVINTlLU0hWOHZnQSBfeTc1SDR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUg0ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVINE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBhIGRlc2NyaXB0b3IgZm9yIHRoZSBvbmUgcm9sZSByZXNwb25zaWJsZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHRhc2suICBBbiBpbnN0YW5jZSBvZiB0aGlzIHJvbGUgd291bGQgc2hvdyB1cCBhcyBhIHNjaGVkdWxlZCByZXNvdXJjZSBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUg0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBlcmZvcm1zQXNPd25lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVINE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDQtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDVPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUg1ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJlc3BvbnNpYmxlIiBtZW1iZXJFbmQ9Il95N3ZXNk8tc0VkdUg1OUtTSFY4dmdBIF95NzVINS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDV1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUg1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgcmVzcG9uc2liaWxpdHkgZm9yIFdvcmsgUHJvZHVjdCBpbnN0YW5jZXMuICBJdCBpbmRpY2F0ZXMgb3duZXJzaGlwIGFuZCBmb3IgZXhhbXBsZSB3b3VsZCBkZWZpbmUgdGhlIFJvbGUgdGhhdCBhbnN3ZXJzIHRvIG1hbmFnZW1lbnQgcXVlc3Rpb25zIGFib3V0IHRoZSBxdWFsaXR5IHdvcmsgcHJvZHVjdC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVINS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUg2Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUg2ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVINnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZYSnUtc0VkdUg1OUtTSFY4dmdBIF95NzVINi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVINi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29tcG9zaXRlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEktLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3k3NUg2dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIN08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIN2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDd1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2VzBlLXNFZHVINTlLU0hWOHZnQSBfeTc1SDhPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUg3LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIOE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3k3NUg3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIOGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIOHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDgtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2V3NPLXNFZHVINTlLU0hWOHZnQSBfeTc1SDllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUg5Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIOC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgYXNzb2NpYXRpb24gbGlua3MgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRvIGl0cyBzdWNjZXNzb3IgV29yayBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIOWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsaW5rVG9TdWNjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dldxdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUg5dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUg5LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVILU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95NzVILXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYTmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SC1lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUgtTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCB0byBpdHMgcHJlZGVjZXNzb3IuICBFdmVyeSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGNhbiBoYXZlIHByZWRlY2Vzc29yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgdG8gaXQuICBTcGVjaWZpYyBwcmVkZWNlc3NvciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBXb3JrIE9yZGVyLCB3aGljaCBkZWZpbmVzIHRoZSBraW5kIG9mIHByZWRlY2Vzc29yIGFub3RoZXIgV29yayBCcmVha2Rvd24gRWxlbWVudCByZXByZXNlbnRzIGZvciBhbm90aGVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUgtdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1Y2MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SC1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUgtLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUhfTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeS00S01PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeS00S01lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3ktNEtNTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeS00S011LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLTS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtOTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtOZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S051LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtOLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtPTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95LTRLUC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3ktNEtRTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95LTRLUC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95LTRLUWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtRdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVUwtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtRLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtSTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95LTRLUmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSb2FkbWFwIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeS00S1J1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3ktNEtSZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3ktNEtSLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEaXNjaXBsaW5lIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa2dlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVUlPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2YgVGFza3MgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4gIFRoaXMgaXMgdGhlIGV4dGVuc2lvbnMgb2YgRGlzY2lwbGluZSBkZWZpbmVkIGluIHRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIHRvIEFjdGl2aXRpZXMsIHdoaWNoIHJlcHJlc2VudCB0eXBpY2FsIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIG1lYW5pbmdmdWwgZ3JvdXBpbmdzIG9mIHRoZSBEaXNjaXBsaW5lJ3MgVGFza3MgaW50byB3b3JrZmxvd3MuCi1UYXNrcyByZXByZXNlbnQgZGVzY3JpcHRpb25zIG9mIHdvcmssIHdoaWNoIGFyZSBjYXRlZ29yaXplZCBieSBEaXNjaXBsaW5lcy4gIFRoZSByZWFzb24gdGhhdCBzZXZlcmFsIFRhc2tzIGFyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgdGhlIHNhbWUgRGlzY2lwbGluZSBpcyB0aGF0IHRoZXkgYWxsIHJlcHJlc2VudCBhIHBhcnQgaW4gYWNoaWV2aW5nIGEgaGlnaGVyIGdvYWwgb3IgcGVyZm9ybWluZyB3b3JrIHRoYXQgaXMgYWxsIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEV2ZXJ5IERpc2NpcGxpbmUgZGVmaW5lcyBzdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGl0IGNhdGVnb3JpemVzLiAgU3VjaCBzdGFuZGFyZCB3YXlzIGFyZSBleHByZXNzIGJ5IEFjdGl2aXRpZXMgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBkZWZpbmluZyBob3cgdGhlIFRhc2tzIGNhdGVnb3JpemVkIGJ5IHRoZSBEaXNjaXBsaW5lICd3b3JrIHRvZ2V0aGVyJyBpbiB0aGUgbW9zdCBnZW5lcmljIHdheS4gIFRoZXNlIHJlZmVyZW5jZSB3b3JrZmxvd3MgYXJlIG9mdGVuIHVzZWQgZm9yIGVkdWNhdGluZyBhbmQgdGVhY2hpbmcgcHJhY3RpdGlvbmVycy4gCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rZ3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2tnLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRhc2tzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2s1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9raE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9raGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2todS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1YmRpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTJPazdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2toLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tpTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeV9CVUllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVTTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVSXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVSS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJhY3RpY2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejFfQU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICZxdW90O01hbmFnZSBSaXNrcyZxdW90OywgJnF1b3Q7Q29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5JnF1b3Q7LCAmcXVvdDtBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50JnF1b3Q7LCBldGMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejFfQWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6MV9BdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1YlByYWN0aWNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95el93S3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXoxX0EtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXoxX0JPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfQmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnNE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXoxX0J1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXoxX0ItLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95X0JVSk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVKZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVKdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95X0JVSi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVLTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVSi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0tIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeV9CVUtlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVLdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtQTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVMTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVSy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVUt1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgdHJhY2VhYmlsaXR5IGZvciBhIFByb2Nlc3MgZG9jdW1lbnRpbmcgd2hpY2ggQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIGJlZW4gdXNlZCBmb3IgZGVmaW5pbmcgdGhlIHByb2Nlc3MuICBJdCBkb2N1bWVudHMgYXBwbGljYXRpb25zIG9mIGEgcGF0dGVybiB0aHJvdWdoIGNvcHkgYXMgd2VsbCBhcyBwYXR0ZXJuIGJpbmRpbmcuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVUxPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVS3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVUxlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVUx1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVMLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtRdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVNZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVTU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVUwtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PklmIHRoZSBQbGFuIGhhcyBiZWVuIGNyZWF0ZWQgYmFzZWQgb24gb25lIG9yIG1vcmUgcHJvY2Vzc2VzIChpLmUuIG90aGVyIFBsYW5zLCBDYXBhYmlsaXR5IFBhdHRlcm5zLCBhIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aGVzZSksIHRoZW4gdGhpcyBhc3NvY2lhdGlvbiBjYXB0dXJlcyBhIHRyYWNlIGJhY2sgdG8gdGhlc2Ugc291cmNlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVTWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtQLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVTC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVU11LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVU0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVOTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dlcxTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVOdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVTmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVU5PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoZSBQbGFubmluZ0RhdGEgY2xhc3MgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVTnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVOTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVOLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtTZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVPZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVT08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVU4tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbGlua3MgYW4gQWN0aXZpdHkgdG8gemVybyBvciBtb3JlcyBpbnN0YW5jZXMgb2YgdGhlIFJvYWRtYXAgZ3VpZGFuY2UgdHlwZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVT2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVTi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVU91LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVU8tLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVUE8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95X0JVUHUtc0VkdUg1OUtTSFY4dmdBIF95LTRLTS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVBlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVQTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IHByb3ZpZGUgZWR1Y2F0aW9uIG1hdGVyaWFsIGZvciB0ZWFjaGluZyBzdGFrZWhvbGRlcnMgc3VjaCBhcyBwcm9qZWN0IG1hbmFnZXJzIG9uIGhvdyB0byBwZXJmb3JtIHByb2plY3RzIHRoYXQgZm9sbG93IHRoaXMgRGVsaXZlcnkgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVUHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGVsaXZlcnlQcm9jZXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfeS00S01PLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVQTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVUC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVUU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVFlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeV9CVVEtLXNFZHVINTlLU0hWOHZnQSBfeS00S051LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVRdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVUWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBndWlkYW5jZSBkb2N1bWVudHMgdGhhdCBoYXZlIGJlZW4gcmVsYXRlZCB0byBhIERlbGl2ZXJ5IFByb2Nlc3MgaW5zdGFuY2UgdG8gZGVzY3JpYmUgYW5kIGNoYXJhY3Rlcml6ZSBpdHMgZmVhdHVyZXMgYW5kIGNhcGFiaWxpdGllcy4gVGhlc2UgZG9jdW1lbnRzIGNhbiBiZSB1c2VkIGZvciBzZXZlcmFsIHB1cnBvc2VzIHN1Y2ggYXMgaW50ZXJuYWwgbWFya2V0aW5nIGNvbW11bmljYXRpb25zLCBzYWxlcyB0cmFpbmluZyBhbmQgZ2VuZXJhbCBtZXRob2QgZWR1Y2F0aW9uLiAgRXhhbXBsZXMgZm9yIENvbW11bmljYXRpb25zIE1hdGVyaWFsIGFyZSBIaWdobGlnaHQgRG9jdW1lbnQsIEZhY3QgU2hlZXQsIGFuZCBEZWxpdmVyeSBQcm9jZXNzIFNwZWNpZmljYXRpb24gT3ZlcnZpZXcuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3ktNEtNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVUWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVJPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVJlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVSdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkJyZWFrZG93bk5lc3RpbmciIG1lbWJlckVuZD0iX3k3dlcxLS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU10Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVUi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYmlkaXJlY3Rpb25hbCBhc3NvY2lhdGlvbiByZXByZXNlbnRzIGJyZWFrZG93biBzdHJ1Y3R1cmUgbmVzdGluZy4gIEl0IGRlZmluZXMgYW4gbi1sZXZlbCBoaWVyYXJjaHkgb2YgQWN0aXZpdGllcyBncm91cGluZyB0b2dldGhlciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBvdGhlciBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLgotVGhlIHN1cGVyQWN0aXZpdGllcyByb2xlIGFsbG93cyBuYXZpZ2F0aW9uIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXMgcGFyZW50IEFjdGl2aXR5LiBUaGUgYnJlYWtkb3duRWxlbWVudHMgcm9sZSBhbGxvd3MgbmF2aWdhdGlvbiBmcm9tIGFuIEFjdGl2aXR5IHRvIGl0cyBuZXN0ZWQgQnJlYWtkb3duIEVsZW1lbnRzLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVU08tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95X0JVSWUtc0VkdUg1OUtTSFY4dmdBIF95X0JVU3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVNlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVTTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIG9uZSBtb3JlIHJlZmVyZW5jZSB3b3JrZmxvd3MgZm9yIGEgRGlzY2lwbGluZS4gIFRoZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGRlZmluZSB0aGUgbW9zdCB0eXBpY2FsIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgYSBEaXNjaXBsaW5lLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVTdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVTLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVUTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVVGUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95X0JVSk8tc0VkdUg1OUtTSFY4dmdBIF95X0JVVHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVVHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVVGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVQtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVVPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVVZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtUTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVVLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVVXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY2FuIGJlIHVzZWQgdG8gbGluayBhbGwga2luZHMgb2YgZ2VuZXJhbCBndWlkYW5jZSB0byB0aGUgQWN0aXZpdHkgdGhhdCBpcyBiZWluZyBtYW5hZ2VkIGFzIGdlbmVyYWwgU3VwcG9ydGluZyBNYXRlcmlhbC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVVS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVVWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVWdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtULS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVXTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVVi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktIChvciBQcm9jZXNzLSkgc3BlY2lmaWMgY2hlY2sgcG9pbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHRoZSB3b3JrIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVV08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVVnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVdlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVd1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVXLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtVdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVYZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVWE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBjb25jZXB0cyBvciB3aGl0ZXBhcGVycyB0byB0aGUgQWN0aXZpdHkgcHJvdmlkaW5nIGltcG9ydGFudCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgZG9pbmcgdGhlIHdvcmsgZGVzY3JpYmVkIGJ5IHRoZSBBY3Rpdml0eS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVWGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVVy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVh1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVgtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVZTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtWZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVZdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVWWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY2FuIHByb3ZpZGUgcmVmZXJlbmNlcyB0byBleGFtcGxlcyByZWxldmFudCB0byB0aGlzIHNwZWNpZmljIEFjdGl2aXR5IChvciBQcm9jZXNzKS4gIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVZdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVZTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVWS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVWk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVplLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1dPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVotLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVadS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVWmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBBY3Rpdml0eS1zcGVjaWZpYyBHdWlkZWxpbmVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVaLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVaZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVYWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVWF1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1ctLXNFZHVINTlLU0hWOHZnQSBfeV9CVWJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVhLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVYXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWZlcnMgdG8gUmV1c2FibGUgQXNzZXRzIHNwZWNpZmljIHRvIHRoaXMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVYk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVYXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96Qlo1d08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pCWjV3ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNXd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNXctLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjV3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjV4Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjV4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjV4dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekJaNXgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekJaNXlPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pCWjV3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1eWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1eXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNXllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1eS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1ek8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1emUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1enUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjV6LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1enUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjUwTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjUwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjUwdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjUwLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Imhvd3RvU3RhZmYiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjUxTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1MC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjUxZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjUxdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjUxLS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekJaNTJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pCWjUyZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96Qlo1LU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2NhbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjUyLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1MnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTNPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTNlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTN1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTMtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNTRPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjUzLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1NGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1NHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1NC0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1NU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyaXNrTGV2ZWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjU1ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1NU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjU1dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjU1LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjU2Ty1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjU2ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjU2dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1NmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjU2LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjU3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjU3ZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjU3dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjU3LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1N3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1OE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1OGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1OHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1OC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNTlPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjU4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1OWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1OXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1OS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pCWjUtTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekJaNS1lLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pCWjV4LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1LXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzY29wZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNS0tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjUtdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjVfTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjVfZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjVfdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjVfLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InVzYWdlTm90ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjZBTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1Xy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjZBZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjZBdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjZBLS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekJaNkJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96Qlo2QmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekJaNXdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjZCdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNkItLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjZCdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNkNPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNkNlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNkN1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96Qlo2Qy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZYQi0tc0VkdUg1OUtTSFY4dmdBIF96Qlo2RGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNkRPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjZDLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5MaXN0IHRoZSBzdGVwcyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCB0byBiZSBwZXJmb3JtZWQgZm9yIHRoZSBpbnN0YW5jZSBvZiB0aGUgVGFzayBEZXNjcmlwdG9yLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pCWjZEZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il90YXNrRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pCWjZDLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo2RHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo2RC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekRwVmUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWZk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVmUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96RHBWZmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pEcFZmdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWY08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekRwVm4tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZmLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZnTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekRwVmdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZndS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWZ2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96RHBWZy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pEcFZoTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pEcFZsZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWaGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWaHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pEcFZoLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImludGVyZmFjZUlPIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pEcFZtdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWaU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWaWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekRwVmtPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekRwVmt1LXNFZHVINTlLU0hWOHZnQSBfekRwVmRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZrZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWa08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgdGhlIHJlYWxpemF0aW9uIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhIFByb2Nlc3MgQ29tcG9uZW50IGFuZCBhIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96RHBWa3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWFsaXplZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWY08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pEcFZrTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWay0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWbE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekRwVmxlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekRwVmwtLXNFZHVINTlLU0hWOHZnQSBfekRwVmhPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZsdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWbGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+SW5zdGFuY2VzIG9mIHRoaXMgYXNzb2NpYXRpb24gY29udGFpbiB0aGUgbGlzdCBvZiBUYXNrIERlc2NyaXB0b3JzIHRoYXQgcmVwcmVzZW50IGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pEcFZsLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfekRwVmdlLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pEcFZsZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWbU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWbWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZtdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZoLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZuTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWbS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVm11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY29udGFpbnMgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0IHR5cGUgaW5zdGFuY2VzIHVzZWQgZm9yIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96RHBWbk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVmdlLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pEcFZtdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWbmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWbnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZuLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZmdS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZvZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWb08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVm4tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIFByb2Nlc3MgQ29tcG9uZW50IGl0IHJlZmVycyB0by4gIEEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGV4YWN0bHkgb25lIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pEcFZvZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVmUtLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pEcFZuLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWb3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWby0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekRwVnBPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekRwVmVPLXNFZHVINTlLU0hWOHZnQSBfekRwVnB1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZwZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWcE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBjb250YWlucyBvbmx5IGV4YWN0bHkgb25lIFByb2Nlc3MuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVnB1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZjTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWcE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVnAtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVnFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96RHBWcWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96RHBWamUtc0VkdUg1OUtTSFY4dmdBIF96RHBWcS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVnF1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZxZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgUGFja2FnZSBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIGRlZmluZSBCcmVha2Rvd24gYW5kIFByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbGVtZW50IGluc3RhbmNlIGNhbiBiZSBwYXJ0IG9mIG9ubHkgb25lIFByb2Nlc3MgUGFja2FnZSBpbnN0YW5jZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96RHBWcS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc1BhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb250ZW50RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdWZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfdjV1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIENvbnRlbnQgRWxlbWVudCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkRPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG5vdCBkaXJlY3RseSBmcm9tIE1ldGhvZCBFbGVtZW50IGFueW1vcmUuICBUaGlzIGlzIGFjaGlldmVkIHVzaW5nIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBzZW1hbnRpY3MuICBPbmx5IGlmIGFuIGFkb3B0ZXIgb2YgdGhpcyBtZXRhLW1vZGVsIGRlY2lkZXMgdG8gcmVhbGl6ZSBNZXRob2QgUGx1Z2lucywgaGUgd291bGQgZ2V0IHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIGNhcGFiaWxpdGllcyBmb3IgYWxsIENvbnRlbnQgRWxlbWVudHMuCi1Db250ZW50IEVsZW1lbnQgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50LgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXh3N1Z1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96R0xGRGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y1LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0F1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y2Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3Y2ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjZ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0ItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y2LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3Y3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2hlY2tsaXN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTVPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93RE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjd1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjctLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92OE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJndWlkZWxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dFZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92OGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92OHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y4LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4YW1wbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNS0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dHLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92OU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92OWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y5dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFzc2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXpfdl9PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnNWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdi1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92LWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0ZXJtRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLV9PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnOXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdi11LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdi0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3UXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGRHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5Pk1ldGhvZCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gYWRkcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdmlhIHBhY2thZ2UgbWVyZ2UgdG8gTWV0aG9kIEVsZW1lbnQgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSBuZWVkZWQgZm9yIHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMgaW50cm9kdWNlcyBpbiB0aGlzIHBhY2thZ2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXh3N1EtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZGdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3Uk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJndWlkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3UmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1JPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3UnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3Ui0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3U08tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3U2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3U3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1NlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3Uy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3VE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3VGUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3VHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvd25lZFJ1bGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Y3Utc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l4dzdqTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3VC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3VU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdVZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N2h1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eDZGTU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1V1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1UtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGRC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdXBwcmVzc2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGRU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfekdMRkVlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkUtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZFdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdMRkZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdMRkZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekdMRkZ1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il96R0xGRi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGR08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il96R0xGR2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJuYSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkd1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZHZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIGRlZmF1bHQgJnF1b3Q7bm90IGFzc2lnbmVkJnF1b3Q7IHZhbHVlIG9mIGEgVmFyaWFiaWxsaXR5IEVsZW1lbnQncyB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FzZSBubyB2YXJpYWJpbGl0eSBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IGJldHdlZW4gdGhlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il96R0xGRy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250cmlidXRlcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkhPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZHLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkNvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5IGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgYWx0ZXJpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLCBpLmUuIGluIGFuIGFkZGl0aXZlIGZhc2hpb24uICBQcm9wZXJ0aWVzIGNvbnRyaWJ1dGVkIGFyZTogYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBjb250cmlidXRpb24gaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIGFuIGF1Z21lbnRlZCB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRoYXQgY29tYmluZXMgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIHdheSB0aGlzIGNvbWJpbmF0aW9uIGlzIHJlYWxpemVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbi4gIEZvciBleGFtcGxlLCBTdHJpbmcgYXR0cmlidXRlcyBhcmUgY29uY2F0ZW5hdGVkIHJlc29sdmluZyBlbWJlZGRlZCBjb21tYW5kcyBmb3IgZGVwZW5kZW50IHRleHQgb3IgbWVyZ2luZyB0ZXh0IGZyYWdtZW50cyAoZS5nLiBkZXNjcmlwdGlvbnMgZm9yIGNvbnRlbnQgZWxlbWVudHMpLiAgQWRkaXRpb25hbCBlbGVtZW50cyBpbiB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgKGUuZy4gYWRkaXRpb25hbCBHdWlkYW5jZSBlbGVtZW50cyBvciBUYXNrIERlc2NyaXB0b3JzIG9mIGFuIEFjdGl2aXR5KS4gIERpZmZlcmVudCBlbGVtZW50cyBpbiB0by1vbmUgYXNzb2NpYXRpb25zIGFyZSBpZ25vcmVkIChlLmcuIHRoZSBvbmUgUHJpbWFyeSBQZXJmb3JtZXIgb2YgYSBUYXNrKS4gIE11bHRpcGxlIENvbnRlbnQgRWxlbWVudHMgY2FuIGNvbnRyaWJ1dGUgdG8gdGhlIHNhbWUgYmFzZSBlbGVtZW50IGFuZCBhbGwgb2YgdGhlc2UgY29udHJpYnV0aW9ucyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byB0aGUgYmFzZSBpbiB0aGUgc2FtZSBmYXNoaW9uLiBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOgotYXR0cmlidXRlIHZhbHVlczoJU3RyaW5nIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGNvbmNhdGVuYXRlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LiAgT3RoZXIgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiBhbnkgb3RoZXIgdHlwZSBzdWNoIGFzIEludGVnZXIsIERhdGUgYXJlIGlnbm9yZWQuCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMga2VwdCBhbmQgYW55IGFzc29jaWF0aW9uIGZyb20gdGhlIGNvbnRyaWJ1dGluZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaWdub3JlZC4KLTAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgYWRkZWQgdG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBlbGVtZW50LiAgSWYgYm90aCBWYXJpYWJpbGl0eSBFbGVtZW50cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QgdGhlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgYXNzb2NpYXRpb24gd2lsbCByZW1haW4uCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZIZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4dGVuZHMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZIdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGSGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FeHRlbnNpb24gYWxsb3dzIE1ldGhvZCBQbHVnaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgQmFzZSBQbHVnaW4gYnkgcHJvdmlkaW5nIGEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIEFzc29jaWF0aW9uIGluc3RhbmNlcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSByZXN1bHQgb2YgaW50ZXJwcmV0YXRpb24gaXMgdGhhdCB0aGUgc3BlY2lhbCBlbGVtZW50IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBiYXNlZC1vbiBoYXMsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuICBIZW5jZSBleHRlbmRzIGlzIG5vdCB1c2VkIHRvIG1vZGlmeSBjb250ZW50IG9mIHRoZSBiYXNlIFBsdWdpbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcgUGx1Z2luIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkIChlLmcuIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUgb2YgcmV2aWV3KS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdmlhIHRoZSBleHRlbmRzIHJlbGF0aW9uc2hpcC4gIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBDYXBhYmlsaXR5IFBhdHRlcm5zIHRvIFByb2Nlc3NlczogQSBwYXR0ZXJuIGlzIGFwcGxpZWQgYnkgZGVmaW5pbmcgYW4gZXh0ZW5kcyByZWxhdGlvbnNoaXBzIGZyb20gYW4gQWN0aXZpdHkgb2YgdGhlIGFwcGx5aW5nIFByb2Nlc3NlcyB0byB0aGUgUGF0dGVybi4gIFRoZSBBY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbnMgaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMgdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIFByb2Nlc3MgYWZ0ZXIgSW50ZXJwcmV0YXRpb24uCi1hdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgZWxlbWVudCBhcmUgaW5oZXJpdGVkIGFuZCB1c2VkIHRvIHBvcHVsYXRlIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGF0dHJpYnV0ZXMuICBJZiB0aGUgc3BlY2lhbCBlbGVtZW50IGF0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcG9wdWxhdGVkIHRoZSBpbmhlcml0ZWQgdmFsdWVzIGFyZSBpZ25vcmVkLiAgCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgaXRzIG93biBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHRoZSBpbmhlcml0ZWQgb25lIGlzIGlnbm9yZWQuCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIGRlZmluZWQgZm9yIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSBzcGVjaWFsIGVsZW1lbnQgY2FuIGFkZCBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIGluc3RhbmNlcy4KLQotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il96R0xGSC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXBsYWNlcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRklPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZILS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlJlcGxhY2VzIHByb3ZpZGVzIGEgd2F5IGZvciBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byByZXBsYWNlIGEgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHVzZWQgZm9yIE1ldGhvZCBQbHVnaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrLCBvciBBY3Rpdml0aWVzIHdpdGggZWl0aGVyIGEgY29tcGxldGUgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIGZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMgKGUuZy4gUm9sZS1BcnRpZmFjdCByZXNwb25zaWJpbGl0eSkuICBQcm9wZXJ0aWVzIHJlcGxhY2VkIGFyZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBDb250ZW50IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhpcyBuZXcgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0byB3aGljaCBhbGwgaW5jb21pbmcgYXNzb2NpYXRpb25zIHN0aWxsIHBvaW50IGFzIGJlZm9yZSwgYnV0IHdoaWNoIGhhcyBwb3RlbnRpYWxseSBuZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy4gIFRoaXMgcHJvdmlkZXMgYSB2ZXJ5IHBvd2VyZnVsIG1lY2hhbmlzbSB0byByZXBsYWNlLCBmb3IgZXhhbXBsZSwgd2hvbGUgQWN0aXZpdGllcyBpbiBhIFByb2Nlc3Mgd2l0aCBjb21wbGV0ZSBuZXcgcmVhbGl6YXRpb25zIG9mIHRoZSBBY3Rpdml0eS4gIEZvciBpbnN0YW5jZSwgcmVwbGFjaW5nIGFuIEFjdGl2aXR5IGRvaW5nIHVzZSBjYXNlLWJhc2VkIGRlc2lnbiB3aXRoIGFuIGFjdGl2aXR5IGRvaW5nIGFnaWxlIGNvZGUtY2VudHJpYyBkZXZlbG9wbWVudCBkb2luZyB0aGUgc2FtZSB3b3JrIHVzaW5nIGEgZGlmZmVyZW50IGRldmVsb3BtZW50IHRlY2huaXF1ZSB1dGlsaXppbmcgZGlmZmVyZW50IFJvbGVzLCBUYXNrcywgZXRjLiAgQW5vdGhlciBleGFtcGxlLCB3b3VsZCBiZSB0byByZXBsYWNlIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gUkRCTVMgd2l0aCBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIE9PREJNUy4gIEEgVmFyaWFiaWxpdHkgRWxlbWVudCBjYW4gb25seSBiZSByZXBsYWNlZCBieSBvbmUgb3RoZXIgZWxlbWVudCBhdCBhIHRpbWUuICBGb3IgZXhhbXBsZSwgaWYgdHdvIE1ldGhvZCBQbHVnaW5zIHJlcGxhY2UgdGhlIHNhbWUgZWxlbWVudCBvbmx5IG9uZSBNZXRob2QgUGx1Z2luIGNhbiBiZSB1c2VkIGZvciBpbnRlcnByZXRhdGlvbiAoc2VlIGNvbmNlcHQgb2YgTWV0aG9kIENvbmZpZ3VyYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gcmVzb2x2ZSBzdWNoIGNvbmZsaWN0cywgU2VjdGlvbiA3LjEuMikuICBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOgotYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpbmNsdWRpbmcgdW5hc3NpZ25lZCB2YWx1ZXMuCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgcmVwbGFjaW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYWxzbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbi4KLTAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCByZXBsYWNlIGFsbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuCi0KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkl1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il96R0xGSS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleHRlbmRzUmVwbGFjZXMiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZKZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLgotVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLVZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4KLVZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96R0xGSnUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZKLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRktPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZKLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il96R0xGS2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5uYTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZLdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekdVMkN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHTEZLLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHTEZMTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU2VjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdZLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGTGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlNlY3Rpb24gaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGV4dGVuZHMgU2VjdGlvbiBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIDo6IEJhc2ljIEVsZW1lbnRzIHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuIAotRm9yIGV4YW1wbGUsIHdoZW4gYSBUYXNrIGNvbnRyaWJ1dGVzIHRvIGFub3RoZXIgVGFzayBpdHMgUHJlc2VudGF0aW9uIGFzc29jaWF0aW9uIGlzIGNvbnRyaWJ1dGVkIGluY2x1ZGluZyBpdHMgU2VjdGlvbnMgKGkuZS4gaXRzIFN0ZXBzKSwgd2hpY2ggYXJlIG1vZGVsZWQgYXMgcGFydHMgb2YgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBTZWN0aW9ucyBjYW4gYmUgbmVzdGVkIGFuZCB0aGVyZWZvcmUgVGFzayBEZXNjcmlwdGlvbnMgY2FuIGJlIGZsZXhpYmx5IG9yZ2FuaXplZCBpbiBTdGVwcyB3aXRoIHN1Yi1TdGVwcy4gIFNlY3Rpb25zIGFyZSBWYXJpYWJpbGl0eSBFbGVtZW50cyB0aGVtc2VsdmVzLCBzbyB0aGV5IGNhbiBjb250cmlidXRlIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIG1vZGVsIGEgVGFzayBzdGVwIGFzIGEgU2VjdGlvbiBpbnN0YW5jZSB3aXRob3V0IHJlbGF0aW5nIGl0IHRvIGEgVGFzayBEZXNjcmlwdGlvbiB0aGF0IGRpcmVjdGx5IGNvbnRyaWJ1dGVzIHRvIChvciByZXBsYWNlcykgYW5vdGhlciBTZWN0aW9uIHdoaWNoIGlzIHBhcnQgb2YgYSBUYXNrIERlc2NyaXB0aW9uLiAgVGhpcyBjb250cmlidXRpb24gKG9yIHJlcGxhY2VtZW50KSB3b3VsZCBhZGQgbmV3IGRlc2NyaXB0aW9uIHRleHQgdG8gdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24gKG9yIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24pLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnRyaWJ1dGUgbmV3IENoZWNrIExpc3QgaXRlbXMgb3JnYW5pemVkIGFzIFNlY3Rpb25zIHRvIGFuIGV4aXN0aW5nIENoZWNrIExpc3QgKGRlZmluZWQgYXMgZ3VpZGFuY2UpLiAgCi0KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pHTEZMdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1plLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2VjdGlvbk5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdadS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3WmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1otLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2FPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N2FlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N2F1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3YS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2F1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdiTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdiZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdidS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdiLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1YlNlY3Rpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l4dzdsTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3Y08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3Y2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZMLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJELS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R0xGTU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R0xGTWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQWN0aXZpdHkiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N21Nc2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3ktNEtTTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW50cm9kdWNlZCBpbiB0aGUgcGFja2FnZSBCcmVha2Rvd24gd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGFuZCBpcyB0aGUgYmFzaXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjbGFzcyBQcm9jZXNzLgotRXh0ZW5kcyBBY3Rpdml0eSB3aXRoIGFuIGFzc29jaWF0aW9uIHRvIFJvYWRtYXAuICBUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgYWxzbyBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGV4dGVuc2lvbiBvZiB0aGUgRGlzY2lwbGluZSBjYXRlZ29yeS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGTXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkFjdGl2aXR5IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIGV4dGVuZCBBY3Rpdml0eSB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiYjeEQ7Ci1BY3Rpdml0eSBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2hpY2ggcHJvdmlkZXMga2V5IG1lY2hhbmlzbSB0byBlbmFibGUgZHluYW1pYyBiaW5kaW5nIG9mIENhcGFiaWxpdHkgUGF0dGVybnMgaW4gUHJvY2Vzc2VzIGFzIHdlbGwgYXMgUHJvY2VzcyBDb250cmlidXRpb25zLiAgVmFyaWFiaWxpdHkgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheSBmb3IgQWN0aXZpdGllczomI3hEOwotLSBFeHRlbmQ6IFRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIGEgcHJvY2VzcyBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IHdoaWNoIGV4dGVuZHMgdGhlIHBhdHRlcm4ncyB0b3AtbGV2ZWwgYWN0aXZpdHkuICBUaHJvdWdoIGV4dGVuc2lvbiB0aGUgZXh0ZW5kaW5nIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBwYXR0ZXJucyBCcmVha2Rvd24gRWxlbWVudHMuJiN4RDsKLS0gUmVwbGFjZTogVG8gcmVwbGFjZSBhbiBBY3Rpdml0eSBvZiBhbiBhcHBsaWVkIENhcGFiaWxpdHkgUGF0dGVybiBvciBhbiBleGlzdGluZyBwcm9jZXNzIGZvciB3aGljaCBvbmUgZGV2ZWxvcHMgYSBQcm9jZXNzIENvbnRyaWJ1dGlvbiAob3IgYSBjb21iaW5hdGlvbiBvZiBib3RoKSBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IGFuZCBzcGVjaWZ5IHRoZSByZXBsYWNlIHZhcmlhYmlsaXR5IHNwZWNpYWxpemF0aW9uIGJldHdlZW4gdGhlbS4mI3hEOwotLSBDb250cmlidXRlOiBUbyBjb250cmlidXRlIG5ldyBCcmVha2Rvd24gRWxlbWVudHMgdG8gYW4gZXhpc3RpbmcgQWN0aXZpdHkgb25lIHdvdWxkIGRlZmluZSBhbiBBY3Rpdml0eSB3aXRoIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlbGF0ZXMgdmlhIHRoZSBDb250cmlidXRlcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0byB0aGlzIGV4aXN0aW5nIEFjdGl2aXR5LiAgVGhlIGNvbnRyaWJ1dGluZyBBY3Rpdml0eSdzIEJyZWFrZG93biBFbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250cmlidXRlZCBBY3Rpdml0eS4mI3hEOwotJiN4RDsKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU1zdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTdtTXMtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96R0xGTS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3bU10Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVSdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N21NdGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N21NdHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtTZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvYWRtYXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLUmUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVOLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLU3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLUy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtUTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtUZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtUdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1QtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2hlY2tsaXN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTVPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVVnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1VPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1VlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLVXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb25jZXB0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTRlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVVy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1UtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLVmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleGFtcGxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTUtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVWU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1Z1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLV08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJndWlkZWxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVaZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLV2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLV3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtXLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJldXNhYmxlQXNzZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95el92X08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVhdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLWE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLWGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekdVMkFPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekdVMkF1LXNFZHVINTlLU0hWOHZnQSBfekdMRkJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHVTJBZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R1UyQU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoYXQgZXZlcnkgTWV0aG9kIFBhY2thZ2UgKGVpdGhlciBDb250ZW50IFBhY2thZ2UsIFByb2Nlc3MgUGFja2FnZSwgb3IgUHJvY2VzcyBDb21wb25lbnQpIGlzIHBhcnQgb2YgZXhhY3RseSBvbmUgTWV0aG9kIFBsdWdpbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96R1UyQXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kUGx1Z2luIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekdVMkFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHVTJBLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHVTJCTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekdVMkJlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRXh0ZW5zaW9uIiBtZW1iZXJFbmQ9Il96R1UyQi0tc0VkdUg1OUtTSFY4dmdBIF96R0xGQ2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdVMkJ1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHVTJCZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgaG93IE1ldGhvZCBQbHVnaW5zIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zLiAgVGhlIGV4dGVuZGluZyBwbHVnLWluIGNvbnRhaW5zIG5ldyBtZXRob2QgZWxlbWVudHMsIGV4dGVuZHMgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzIGFuZCBwcm9jZXNzZXMgdXNpbmcgY29udGVudCBlbGVtZW50IHZhcmlhYmlsaXR5IG1lY2hhbmlzbXMgKGUuZy4gY29udHJpYnV0aW9uLCByZXBsYWNlLCBldGMuKSwgcHJvdmlkZXMgYWRkaXRpb25hbCBEZWxpdmVyeSBhbmQgQ2FwYWJpbGl0eSBQcm9jZXNzZXMgZm9yIGEgTWV0aG9kIEZyYW1ld29yaywgZXRjLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pHVTJCLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBsdWdpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekdVMkJlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHVTJDTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHVTJDZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96R1UyQ3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIiBtZW1iZXJFbmQ9Il96R1UyRE8tc0VkdUg1OUtTSFY4dmdBIF96R0xGS3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdVMkMtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHVTJDdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIDEtdG8tbWFueSBhc3NvY2lhdGlvbiBkZWZpbmVzIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgdGhhdCBhIG51bWJlciBvZiBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgcmVwcmVzZW50IGEgdmFyaWF0aW9uIG9mIGV4YWN0bHkgb25lIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pHVTJETy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekdVMkN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHVTJEZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHVTJEdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96R1UyRC0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96R0xGTC0tc0VkdUg1OUtTSFY4dmdBIF96R1UyRWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdVMkVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHVTJELS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyB0aGUgb3JkZXIgaW4gd2hpY2ggY29udHJpYnV0ZWQgU2VjdGlvbnMgc2hhbGwgYmUgaW5zZXJ0ZWQgaW50byBhbiAgZXhpc3RpbmcgbGlzdCBvZiBTZWN0aW9ucyBtYWludGFpbmVkIGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekdVMkVlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3NlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96R1UyRC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdVMkV1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdVMkUtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBvaW50Ij4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXa2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV2t1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ieSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3JhcGhFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXbE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdsZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBvc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV2x1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGFpbmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXbC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXbU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdtZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxpbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0hrTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpLSDd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVdtdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdtLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV25PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYW5jaG9yYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXdy0tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g3LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXbmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVduLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNlbWFudGljTW9kZWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0hxZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpLSDl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVdvTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdvZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV291LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXby0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3aWR0aCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdwTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImhlaWdodCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKQVdwdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3AtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNWaXNpYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3pKQVdxTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3FlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXcXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXcS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdyTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlZmVyZW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3N1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktINmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3JlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3J1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXci0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3VlLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SktINnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3NPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3NlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVdzdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJlZmVyZW5jZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpBV3MtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXdE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfekpBV3RlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3R1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVmZXJlbmNlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktINmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3QtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3VPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXdWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpBV3V1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXdS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJrZXkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXdk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXdmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SkFXdnUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXdi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YWx1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVd3Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVd3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pKQVd3dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV3ctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3JhcGhDb25uZWN0b3IiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKQVd4Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3hlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g3LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXeHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXeC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXeU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJncmFwaEVkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVd5LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDhPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVd5ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVd5dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXeS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHcmFwaEVkZ2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKQVd6Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3plLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYW5jaG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXdy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g4Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXenUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXei0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXME8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3YXlwb2ludHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpLSDhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVcwZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVcwdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIyIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSGtPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0hrZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSGt1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iem9vbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hrLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZpZXdwb3J0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSGxPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIbGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIbHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIbC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaWFncmFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIbmUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIbU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIbWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0htdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkdyYXBoTm9kZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSG0tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIbk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzaXplIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXb3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIbmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEaWFncmFtIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIbnUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSG11LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0huLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIb08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIb2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hvdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZpZXdwb2ludCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hvLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRpYWdyYW1MaW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIa08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIcE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hwdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im5hbWVzcGFjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SlRSZ08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHAtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIcWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIcXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hxLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hyTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0hyZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pKS0hydS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hyLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIOXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHNPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHNlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIc3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaWFncmFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIbmUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKVFJnTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIcy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIdE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHRlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0h0dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idHlwZUluZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIdU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIdWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SktIdXUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h1LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0h2Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SlRSaGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHZ1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHYtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktId08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHdlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0hxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktId3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eEtmRGUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKVFJnZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIdy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIeE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h4ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkxlYWZFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIeHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0h5Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIeGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0h5dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0h5LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pKS0h6Ty1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHplLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iSW1hZ2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0h6dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIeGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHotLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idXJpIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSDBPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSDBlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpLSDB1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDAtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWltZVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIMU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIMWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SktIMXUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0gxLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0gyTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIeGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIMmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQb2x5bGluZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSDJ1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0gxLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIMi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjbG9zZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfekpLSDNPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIM2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3YXlwb2ludHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpUUmllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0gzdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0gzLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIyIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSDRPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRWxsaXBzZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSDRlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0gxLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktINHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjZW50ZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktINC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyYWRpdXNYIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmFkaXVzWSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0g1ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvdGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RhcnRBbmdsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0g1LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVuZEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktINk8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SkFXbHUtc0VkdUg1OUtTSFY4dmdBIF96SkFXcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktINmUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SkFXdHUtc0VkdUg1OUtTSFY4dmdBIF96SkFXck8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktINnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SkFXci0tc0VkdUg1OUtTSFY4dmdBIF96SktINi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96SktINi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGlhZ3JhbUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96SktINnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSDdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSDdlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktIN3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SkFXbWUtc0VkdUg1OUtTSFY4dmdBIF96SktIbE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktINy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SkFXbk8tc0VkdUg1OUtTSFY4dmdBIF96SkFXeGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktIOE8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SkFXeU8tc0VkdUg1OUtTSFY4dmdBIF96SkFXemUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktIOGUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SkFXME8tc0VkdUg1OUtTSFY4dmdBIF96SktIOHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96SktIOHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXeS0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekpLSDhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0g4LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0g5Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDllLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpLSG8tLXNFZHVINTlLU0hWOHZnQSBfekpLSGwtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDl1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV24tLXNFZHVINTlLU0hWOHZnQSBfekpLSHItLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpUUmdPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpLSHB1LXNFZHVINTlLU0hWOHZnQSBfekpLSHN1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpUUmdlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpLSHd1LXNFZHVINTlLU0hWOHZnQSBfekpUUmd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekpUUmd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktId08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekpUUmdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKVFJnLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKVFJoTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SlRSaGUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SktIdmUtc0VkdUg1OUtTSFY4dmdBIF96SlRSaHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96SlRSaHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSHUtLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pKVFJoZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SlRSaC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SlRSaU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpUUmllLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpLSDNlLXNFZHVINTlLU0hWOHZnQSBfekpUUml1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekpUUml1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3BvbHlsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIMmUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekpUUmllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKVFJpLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKVFJqTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekRwVml1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWaS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVml1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pEcFZqTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekRwVmplLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pEcFZxZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWanUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWai0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pMaXRNTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRpYWdyYW1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIbmUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pMaXRNLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TGl0TWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TGl0TXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekxpdE0tLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekxpdE1PLXNFZHVINTlLU0hWOHZnQSBfekxpdE5lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pMaXROTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96TGl0TS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB0aGUgb25seSBtZW1iZXIgb2YgdGhlIHVtYWRpYWdyYW1zIHBhY2thZ2UuICBJdCBkZWZpbmVzIHRoYXQgRGlhZ3JhbXMgY2FuIGJlIHBhY2thZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekxpdE5lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekxpdE0tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pMaXROdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pMaXROLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkFlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96R0xGQS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhVUFZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pON1MwTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idXNlckNoYW5nZWFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfekdMRkJlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGQnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96R1UyQU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdMRkItLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdMRkNPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkNlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYmFzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekdVMkJlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHTEZDdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHTEZDLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96RHBWY08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVmNlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZjTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pEcFZjdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96RHBWYy0tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3pEcFZkTy1zRWR1SDU5S1NIVjh2Z0EiIGtleT0iZXh0ZW5kIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9nZW5lcmFsaXphdGlvbj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96TjdTMGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pEcFZkZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImludGVyZmFjZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekRwVmtPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZkdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZkLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pEcFZlTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekRwVnBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZlZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZldS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kVW5pdCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pON1MwLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfek43UzFPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TjdTMWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhdXRob3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TjdTMXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek43UzFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pON1MxLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pON1MyTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pON1MyZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pON1MydS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNoYW5nZURhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBaTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pON1MyLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96TjdTMnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pON1MzTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pON1MzZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfek43UzN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pON1MzLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96TjdTM3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfek43UzRPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfek43UzRlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfek43UzR1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfek43UzQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmVyc2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfek43UzVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pON1M0LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pON1M1ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pON1M1dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pON1M1LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pON1M2Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96T0Vjd2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfek43UzZlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfek43UzZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdXTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Q29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pPRWN3Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1d1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3Vy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1d1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3WE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3WGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3WHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3WC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzZWN0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eHc3ai0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1lPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1llLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ETU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleHRlcm5hbElkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ETWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNRE1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURNdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUROTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUROZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ETnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNRE5lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+S2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUROLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURPTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURPZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfek9FY3dlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfek43UzZPLXNFZHVINTlLU0hWOHZnQSBfek9FY3ctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pPRWN3dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96T0Vjd2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgVW5pdCBjYW4gaGF2ZSBleGFjdGx5IG9uZSBDb3B5cmlnaHQgU3RhdGVtZW50IHNlY3VyaW5nIHRoZSBpbnRlbGxlY3R1YWwgY2FwaXRhbCBpdCByZXByZXNlbnRzLiAgSXQgd2lsbCBiZSBwdWJsaXNoZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBjb25jcmV0ZSBFbGVtZW50LiAgTm90ZSwgdGhhdCBDb3B5cmlnaHQgU3RhdGVtZW50cyBmb3IgTWV0aG9kIExpYnJhcmllcyBhbmQgTWV0aG9kIFBsdWdpbnMgZGVmaW5lIHRoZSBkZWZhdWx0IHN0YXRlbWVudCBmb3IgaXRzIGNvbnRhaW5lZCBlbGVtZW50cywgd2hpY2ggY2FuIGJlICdvdmVyd3JpdHRlbicgd2l0aCByZXZpc2VkIHN0YXRlbWVudHMgZm9yIGV2ZXJ5IENvbnRlbnQgRGVzY3JpcHRpb24gb3IgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfek9FY3ctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZFVuaXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfek9FY3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pPRWN4Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pPRWN4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFkQ1llLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pRZENZdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ1ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXpidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDWk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDWmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDWnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXpjLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDWi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDYWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9jZXNzVmlld3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemplLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENhdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENhLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2JPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGVmYXVsdFZpZXciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemtlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENiZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENidS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENiLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16bGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2NPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2NlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDY3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtem11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENjLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENkTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2RlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16bnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2R1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2QtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pRZENlTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NGYW1pbHkiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UWRDZWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFkQ2VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96UWRDZXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENlLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXplTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDZk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDZmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2VzcyIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3ktNEtPdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UWRDZnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlByb2Nlc3MgaW4gdGhlIHBhY2thZ2UgTGlicmFyeSBDb25maWd1cmF0aW9uIGV4dGVuZHMgdGhlIGNsYXNzIFByb2Nlc3Mgd2l0aCBhc3NvY2lhdGlvbiByZWxhdGluZyBhIFByb2Nlc3MgdG8gb25lIGRlZmF1bHQgYW5kIG1hbnkgb3B0aW9uYWwgdmFsaWQgQ29uZmlndXJhdGlvbnMuCi1UaGVzZSBjb25maWd1cmF0aW9ucyBkZXNjcmliZSB2YWxpZCBjb250ZXh0cyBmb3IgdGhlIFByb2Nlc3Mgd2l0aGluIGEgTWV0aG9kIExpYnJhcnkgaW5kaWNhdGluZyB1bmRlciB3aGljaCBDb25maWd1cmF0aW9ucyBhIFByb2Nlc3MgaXMgd2VsbCBkZWZpbmVkLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeS00S08tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLUE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95X0JVSi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVLdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLUGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLUHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENmLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXpnLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDZ08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDZ2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UW16WU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YWxpZENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpZZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpZdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96UW16WS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtelpPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpZLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96UW16WmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pRbXpaLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eFVQVk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFtemFPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96UW16ZmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemFlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UW16YS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfelFtemdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpiTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpiZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16YnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16Y08tc0VkdUg1OUtTSFY4dmdBIF96UWRDWS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemItLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16Y08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16YnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemNlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemN1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXpjLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXpkZS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENadS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16ZE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgc2VsZWN0aW9uIG9mIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpkZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpjLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16ZHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16ZC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemVPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemV1LXNFZHVINTlLU0hWOHZnQSBfelFkQ2UtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXplZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16ZU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGVsaXZlcnkgUHJvY2VzcyBjYW4gYmUgb3JnYW5pemVkIGluIG1hbnkgUHJvY2VzcyBGYW1pbGllcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16ZXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9jZXNzRmFtaWxpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENlTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXplLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpmTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16ZmUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16Zi0tc0VkdUg1OUtTSFY4dmdBIF96UW16YU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemZ1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpmZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHBoeXNpY2FsbHkgY29tcHJpc2VzIG9mIE1ldGhvZCBQbHVnaW5zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpmLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RMaWJyYXJ5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfelFtelktLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpmZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXpnTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXphLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpndS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16Z2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgc3RvcmVzIGEgc2V0IG9mIHByZWRlZmluZWQgTWV0aG9kIENvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHJlZ3VsYXJseSB1c2VkIGJ5IHRoZSBsaWJyYXJ5IGF1dGhvcnMgKGUuZy4gdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgdGhleSBzaGlwIHRvIHRoZWlyIHVzZXJzKS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16Z3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kTGlicmFyeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFtelktLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpnTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXpnLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXpoZS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENmLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16aE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBoYXMgZXhhY3RseSBvbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdGhlIGNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggdGhlIHByb2Nlc3MgaGFzIGJlZW4gY3JlYXRlZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16aGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpnLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16aHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16aC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemlPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFteml1LXNFZHVINTlLU0hWOHZnQSBfelFtellPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXppZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16aU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGNhbiBoYXZlIG1hbnkgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCB0byBhbHNvIHByb2R1Y2UgdmFsaWQgcmVzdWx0cy4gIFByb2Nlc3MgRWxlbWVudHMgKGUuZy4gRGVzY3JpcHRvcnMpIHRoYXQgcmVmZXIgdG8gY29udGVudCBwYWNrYWdlcyB0aGF0IGFyZSBkZWZpbmVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHN1Y2ggYSBjb25maWd1cmF0aW9uIHdvdWxkIG5vdCBiZSBzaG93biBpbiB0aGUgcHJvY2VzcyB3aGVuIHB1Ymxpc2hlZCBvciB1c2VkIHVuZGVyIHN1Y2ggYSBjb25maWd1cmF0aW9uLiAgVGhpcyBhbGxvd3MgdG8gZWFzaWx5IHJlbW92ZSBjb250ZW50IGZyb20gYSBwcm9jZXNzIGJ5IHJlbW92aW5nIGNvbnRlbnQgcGFja2FnZXMgdG8gZnJvbSB0aGUgcmVsYXRlZCBjb25maWd1cmF0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXppdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXppLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpqTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16amUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16anUtc0VkdUg1OUtTSFY4dmdBIF96UWRDYWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16anUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpqZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16ai0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16a08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemtlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFkQ2JPLXNFZHVINTlLU0hWOHZnQSBfelFtemt1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemt1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16a2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemstLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemxPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXpsZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRZENiLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpsLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16bHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemxlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoZSBkZWZpbml0aW9uIG9mIGEgY29uZmlndXJhdGlvbiBjYW4gYmUgYmFzZWQgb24gdGhlIGRlZmluaXRpb25zIG9mIG90aGVyIGNvbmZpZ3VyYXRpb25zLiAgRm9yIGV4YW1wbGUsIGEgY29uZmlndXJhdGlvbiBBIGNvdWxkIGJlIGRlZmluZWQgYXMgdGhlIHN1cGVyc2V0IG9mIGNvbmZpZ3VyYXRpb25zIEIsIEMsIGFuZCBEIHBsdXMgYWRkIG1vcmUgc2VsZWN0ZWQgUGx1Z2lucyBhbmQgUGFja2FnZXMuICBJbiBzdWNoIGEgY2FzZSBBIHdvdWxkIGxpc3QgQiwgQywgYW5kIEQgYXMgaXRzIGJhc2VDb25maWd1cmF0aW9ucy4gIElmIGFueSBvZiB0aGVzZSBiYXNlIGNvbmZpZ3VyYXRpb25zIGNoYW5nZXMgYWxsIHVwZGF0ZXMgd291bGQgYmUgYXV0b21hdGljYWxseSB2YWxpZCBmb3IgQSBhcyB3ZWxsIHJlZHVjaW5nIG1haW50YWluYWJpbGl0eSBvdmVyaGVhZCBmb3Igb3ZlcmxhcHBpbmcvZGVwZW5kZW50IGNvbmZpZ3VyYXRpb25zLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16bC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpsZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16bU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16bWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtem11LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFkQ2N1LXNFZHVINTlLU0hWOHZnQSBfelFtem0tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtem0tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16bXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtem5PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtem5lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXpudS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRZENkZS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpuLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpuLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtem51LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfSjd0RzFleUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0o3dEcxdXlDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfeXpVNThZaW5FZHF0dmJuZkIyTF81dyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfSjd0RzEteUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0o3dEcyT3lDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0PyIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfSjd0RzJleUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0o3dEcydXlDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I19JcmRBVU1tQkVkcUJjTjFSNkV2V1V3P0RlcGxveW1lbnQvRGVwbG95bWVudD8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50PyIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfVF9jY29PeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1RfY2NvZXlDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfdnktSFVZaW5FZHF0dmJuZkIyTF81dyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICA8L3VtbDpNb2RlbD4KLSAgPEVjb3JlOkVQYWNrYWdlIHhtaTppZD0iX1U5SXo4T3lDRWR1NS12VmpsZlZzZlEiIGJhc2VfUGFja2FnZT0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiIHBhY2thZ2VOYW1lPSJ1bWEiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hIiBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBXLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4S2ZDLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQWE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eEtmRHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFhlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhLZkVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eFVQWHUtc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eEtmRXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFgtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhLZkYtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBZTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBVZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQWWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQVmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFl1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUFdlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBjZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBZLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eFVQY3Utc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBaTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQYy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQWmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhVUGRPLXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBkZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBaLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eFVQZHUtc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBkLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBhZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eFVQZU8tc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUGF1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4VVBlZS1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUGEtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4ZFpRTy1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBiTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eGRaUWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQYmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhkWlF1LXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Cb29sZWFuIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhkWlEtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUGItLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4ZFpSTy1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRG91YmxlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2Rk11LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1FPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZNLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdRdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2Rk5PLXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N1JPLXNFZHVINTlLU0hWOHZnQSIgaXNJRD0idHJ1ZSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZOZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdSZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2Rk51LXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N1NlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZOLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdTdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGT08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3VmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2Rk9lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1dPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGT3Utc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3V3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2Rk8tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1ctLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZQTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdZLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2RlBlLXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N1plLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZQdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdadS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2RlAtLXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N2F1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZRTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdhLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3Yy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZRdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdkZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3ZHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlJPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2UtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGUmUtc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3ZnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlJ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2YtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGUi0tc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3aU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlNPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2plLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZTZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdrTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGU3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3bGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlMtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N211LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9LdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPSy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkRXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3l5OU9MTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXl6ZEZPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9MZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRHLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfeXk5T0x1LXNFZHVINTlLU0hWOHZnQSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eXpkTGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T0wtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZE1lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9NTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emROTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkTi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T011LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFFPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9NLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRSdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkU2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T05lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFRlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9OdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRWdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkVy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T09PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFlPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9PZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRaZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfeXk5T091LXNFZHVINTlLU0hWOHZnQSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eXpkWnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T08tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZGF1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9QTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9FZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1B1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0dPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9QLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9IZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPSXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1FlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0plLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9RdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9LTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpnLXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtNE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKZy0tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTR1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmdfTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS01ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpnX2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtNk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKZ191LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTYtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmdfLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS03dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtOGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEFlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTlPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhBdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS05LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtLXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEJPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLV9lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhCZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MV9BTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejFfQ08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEItLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxX0ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhDTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3Y1dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQ2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el92X2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEN1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0FPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhDLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dBLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93Q08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaERlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0RlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhEdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dFdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93Ri0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEVPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0hPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhFZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dJZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93SnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEUtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0stLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhGTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kwSmc0ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MEpnNXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenNPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFDUnNPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnpzZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUNzLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6c3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DdU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenMtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQ3gtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp0Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUN6Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DMC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenR1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzJPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp0LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUMzZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DNU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenVlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp1dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUM4Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DOWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenZPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQy11LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp2ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURBZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1EQ08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenYtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNRERlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp3Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURFdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6d2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ERi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWend1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREhPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp3LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURJZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6eE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ESmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenhlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREotLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp4dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURMTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6eC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ETWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenlPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNRE51LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZnTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyRmFrTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWZ2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rZ2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmd1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa2l1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZnLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2trTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rbWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmhlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa24tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZodS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2tvdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rcU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmlPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3J1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZpZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2t0Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rdmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmktLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3d1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZqTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2t4LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWamUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9reXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmp1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3otLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZqLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2sxTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWa08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rMmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmtlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPazN1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZrdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2s0LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWay0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rNk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVUtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQU1PLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFWTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFNdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBVmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBTnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVZ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQVAtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFWLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFSZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBV08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBU3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVdlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQVQtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRvTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3bU1zZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0b2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N21NdU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNG91LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTdtTXUtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRvLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3bU12dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N21Nd2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHBlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V29lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRwdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldvLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHFPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3AtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRxZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXcS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHEtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3J1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRyTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld0Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXdC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHJ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3VlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRyLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld1LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0c08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXdmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHNlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3dlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRzdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld4dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXeWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHRPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3pPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR0ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlcyLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXNE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHQtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2VzdPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR1Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhDLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYRHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHV1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WEUtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR1LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhKTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYS3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WExlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR2dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0di0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHdPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WE9lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR3ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhQTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0d3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIb2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHctLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SG8tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR4Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUhxTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIcmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHh1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHN1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR4LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUh0LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIdk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHllLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHdlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR5dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUh4dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIeU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHpPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHplLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR6ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUgwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0enUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIMS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHotLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDNPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzQwTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUg0ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0MGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVINXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNDB1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDctLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzQwLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUg5Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0MU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVILWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRklPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeS00S01lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZJZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3ktNEtPdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95LTRLUU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkktLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeS00S1J1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZKTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3ktNEtTTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVSU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkp1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVUtPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZKLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVLLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGS08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRktlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVU5lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZLdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVPTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVUGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkxPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVF1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZMZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVSLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVU2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkwtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZNTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVWE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRk11LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVllLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZNLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVadS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVYS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkVPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNXctLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZFZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjV5dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2RXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1ei0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkUtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTFPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZGTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjUyLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2RmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1NE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkZ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTVlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZGLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjU2dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2R08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1Ny0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkdlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTlPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZHdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjUtLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2Ry0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo2QU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNkItLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZIZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjZETy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWck8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWY2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnJlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVmZPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZydS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZndS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWci0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWaS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnNPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVmtlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZzZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZsdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWc3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWbS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnMtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVm9PLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZ0Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWdGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWcXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkZPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkFlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJGZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZETy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyRnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGRHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkYtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJHTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZFLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyR2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGR08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkd1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkd1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJHLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZITy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGSHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkhlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRklPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJIdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZKZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGS08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMklPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkxlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJJZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZNdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R1UyQWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkktLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdVMkJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJKTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHVTJDLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R1UyRU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekxpdE9PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekxpdE5PLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pPRWN4dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pON1MwLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96T0VjeC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96TjdTMXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfek9FY3lPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfek43UzItLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pPRWN5ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pON1MzLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96T0VjeXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96TjdTNU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfek9FY3ktLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfek9FY3d1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpvTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRZENZZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16b2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UWRDZWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtem91LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFkQ2Z1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpvLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpaTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16Yi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenBlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpwdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXplZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16ZnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenFPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemdlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpxZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpoTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16aWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenEtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemx1LXNFZHVINTlLU0hWOHZnQSIvPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZDk2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMiCi0gICAgcnVudGltZUphcj0idHJ1ZSIgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJVbWEiIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLnByZXNlbnRhdGlvbi5VbWFFZGl0b3JQbHVnaW4iIG5vbk5MU01hcmtlcnM9InRydWUiCi0gICAgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0IiByb290RXh0ZW5kc0NsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QiCi0gICAgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIiBjb2RlRm9ybWF0dGluZz0idHJ1ZSIKLSAgICBjb250YWlubWVudFByb3hpZXM9InRydWUiPgotICA8Zm9yZWlnbk1vZGVsPkM6XEhvbWVccGhUTkdcVE5HX2RvY3NcT09BRFxDb250ZW50QXJjaGl0ZWN0dXJlXE1vZGVsc1xVTUEwNFxVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9InVtYS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvaW5pdGlhbCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvam9pbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZm9yayIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvanVuY3Rpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2Nob2ljZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZW50cnlQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZXhpdFBvaW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC90ZXJtaW5hdGUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9uYSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvY29udHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL3JlcGxhY2VzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbENvbnRyaWJ1dGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxSZXBsYWNlbWVudCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kc1JlcGxhY2VzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0RhdGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VyaSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVW5saW1pdGVkTmF0dXJhbCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU3RyaW5nIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NlcXVlbmNlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9JbnRlZ2VyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9GbG9hdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NsYXNzaWZpZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVzcGFjZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9tZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29uc3RyYWludC9ib2R5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdHNBbmRQYXBlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvYXNzZXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvdGVybURlZmluaXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3NoYXBlaWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9ub2RlaWNvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9tYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL3NlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24va2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9zdGVwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0ZXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZS9kZWxpdmVyZWRXb3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL25vdGF0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9sZXZlbHNPZkFkb3B0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC94Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvcG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvYW5jaG9yYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9pc1Zpc2libGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3Byb3BlcnR5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1MaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3ZpZXdwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpbWVuc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL3dpZHRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL2hlaWdodCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS9rZXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS92aWV3cG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoTm9kZS9zaXplIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC90eXBlSW5mbyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTGVhZkVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXh0RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQvdGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JbWFnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vSW1hZ2UvdXJpIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vSW1hZ2UvbWltZVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhpY1ByaW1pdGl2ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvbHlsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS9jbG9zZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUG9seWxpbmUvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsbGlwc2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvcm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3N0YXJ0QW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2VuZEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VsbGlwc2UvY2VudGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JvYWRtYXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jb25jZXB0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JldXNhYmxlQXNzZXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHkvaXNFbmFjdGFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzUmVwZWF0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzT25nb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzRXZlbnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9saW5rVG9QcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZWZpeCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9oYXNNdWx0aXBsZU9jY3VycmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc09wdGlvbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRBZnRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWlsZXN0b25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSXRlcmF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGhhc2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvdGVhbVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvUm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9wcmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL2ZpbmlzaERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvcmFuayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUVudHJ5U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL1Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9zZWxlY3RlZFN0ZXBzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUvYWdncmVnYXRlZFJvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd3RvU3RhZmYiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi9yZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uY2VwdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0V4YW1wbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkZWxpbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2NvbnRlbnRSZWZlcmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvUmVnaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvc3VibWFjaGluZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WZXJ0ZXgiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L291dGdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2luY29taW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZ2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9WZXJ0ZXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1RyYW5zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1N0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZU1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGVNYWNoaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGVNYWNoaW5lL1JlZ2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UcmFuc2l0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL1dvcmtEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL3RhcmdldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9zdWJkaXNjaXBsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldC9yb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2wiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rvb2wvdG9vbE1lbnRvcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2NhdGVnb3JpemVkRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yaWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZWRPblByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2FkbWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZUlPIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3VzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9tZXRob2RQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9iYXNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHRTdGF0ZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQbHVnaW5TZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBhY2thZ2VTZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3Byb2Nlc3NWaWV3cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vZGVmYXVsdFZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2Jhc2VDb25maWd1cmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vc3VidHJhY3RlZENhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9hZGRlZENhdGVnb3J5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkvZGVsaXZlcnlQcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2lucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L1VuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUuZW14IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS9VbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllYTQxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L1VuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUuZW14CisrKyAvZGV2L251bGwKQEAgLTEsMjY5MDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0teHRvb2xzMl91bml2ZXJzYWxfdHlwZV9tYW5hZ2VyLS0+DQotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMubW1pLnVpLnNpZ25hdHVyZXMuZGlhZ3JhbSIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9IlJhdGlvbmFsIE1vZGVsaW5nIFBsYXRmb3JtIChjb20uaWJtLnh0b29scy5ybXApIiB1cmw9IiIgdmVyc2lvbj0iNy4wLjAiLz48L3NpZ25hdHVyZT4/Pg0KLTw/Y29tLmlibS54dG9vbHMuZW1mLmNvcmUuc2lnbmF0dXJlIDxzaWduYXR1cmUgaWQ9ImNvbS5pYm0ueHRvb2xzLnVtbC5tc2wubW9kZWwiIHZlcnNpb249IjcuMC4wIj48ZmVhdHVyZSBkZXNjcmlwdGlvbj0iIiBuYW1lPSJjb20uaWJtLnh0b29scy5ydW1sLmZlYXR1cmUiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+DQotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpEZWZhdWx0PSJodHRwOi8vL3NjaGVtYXMvRGVmYXVsdC8xIiB4bWxuczpFY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyL3NjaGVtYXMvRWNvcmUvMyIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4wL25vdGF0aW9uIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiIHhtbG5zOnVtbG5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4yL1VtbG5vdGF0aW9uIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEgcGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyL3NjaGVtYXMvRWNvcmUvMyBwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI192eS1IVVlpbkVkcXR2Ym5mQjJMXzV3Ij4NCi0gIDx1bWw6TW9kZWwgeG1pOmlkPSIzQURDN0I3NDAyMkQiIG5hbWU9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUiPg0KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0JUTnFBT3hoRWR1SGplM3BQYWhONEEiIHNvdXJjZT0idW1sMi5kaWFncmFtcyIvPg0KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX1A0b3NZT29lRWR1VkE3dnQ1cWJJSlEiIGFubm90YXRlZEVsZW1lbnQ9IjNBREM3Qjc0MDIyRCI+DQotICAgICAgPGJvZHk+R2VuZXJhbCBvcGVuIGlzc3VlIGFuZCB0by1kb3M6JiN4RDsNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7DQotLSBJc3N1ZTogVU1MIDIuMCBuYW1pbmcgY29udmVudGlvbnMgZG9lcyBub3QgYWxsb3cgcGx1cmFsIHJvbGUgbmFtZXMmI3hEOw0KLS0gc3luYyB1cCBuYW1lcyB0byBVSSBuYW1lczsgZS5nLiBQYWNrYWdpbmcgSW5zdHJ1Y3Rpb25zJiN4RDsNCi0tIG1ha2UgQWN0aXZpdHkgdG8gQnJlYWtkb3duIEVsZW1lbnQgYWdncmVnYXRpb24gYSBjb21wb3NpdGlvbiYjeEQ7DQotJiN4RDsNCi1WZXJzaW9uIDEuMC41IGNoYW5nZXM6JiN4RDsNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7DQotLSBhZGRlZCBpc1N1cHBvcnRpbmcgYm9vbGVhbiBhdHRyaWJ1dGUgdG8gbWV0aG9kIHBsdWdpbiYjeEQ7DQotLSBtYXJrZWQgVU1MIERpYWdyYW0gSW50ZXJjaGFuZ2UgYW5kIFByb2Nlc3MgRGlhZ3JhbXMgcGFja2FnZSBhcyBkZXByZWNhdGVkJiN4RDsNCi0gIGRpYWdyYW1zIGFyZSBtYW5hZ2VkIGJ5IHNlcGVyYXRlIG1vZGVscyBiYXNlZCBvbiBVTUwgMiBzaW5jZSAxLjAuNCYjeEQ7DQotLSBtb3ZlZCBQcmltaXRpdmUgVHlwZXMgcGFja2FnZXMgdGhhdCBjb21wcmlzZXMgb2YgYWxsIHByaW1pdGl2ZSB0eXBlcyB1c2VkIGJ5IHRoZSBtb2RlbCYjeEQ7DQotICBmcm9tIEluZHJhc3RydWN0dXJlIE1pbmkgdG8gdGhlIFVNQSB0b3AtbGV2ZWwgcGFja2FnZSYjeEQ7DQotLSByZW1vdmVkIFdvcmsgUHJvZHVjdCBTdGF0ZXMgcGFja2FnZSYjeEQ7DQotLSBjaGFuZ2VkIG11bHRpcGxpY2l0eSBmcm9tIFRhc2sgYW5kIFJvbGUgdG8gbWFueS10by1tYW55JiN4RDsNCi0tIGNoYW5nZWQgbXVsdGlwbGljaXR5IGZyb20gVGFzayBEZXNjcmlwdG9yIHRvIFJvbGUgRGVzY3JpcHRvciB0byBtYW55LXRvLW1hbnkmI3hEOw0KLS0gY2hhbmdlZCBtdWx0aXBsaWNpdHkgYmV0d2VlbiBUb29sIGFuZCBUb29sIE1lbnRvciB0byBtYW50LXRvLW1hbnkmI3hEOw0KLS0gbW92ZWQgUHJlc2VudGF0aW9uIE5hbWUgYXR0cmlidXRlIGZyb20gRGVzY3JpYmFibGUgRWxlbWVudCB0byBNZXRob2QgRWxlbWVudCYjeEQ7DQotICB0byBhbGxvdyBhbGwgZWxlbWVudHMgKGUuZy4gbWV0aG9kIHBsdWdpbiBvciBjb25maWd1cmF0aW9uKSB0byBiZSB0cmFuc2xhdGFibGUgJiN4RDsNCi0tIGFkZGVkIGxvbmdQcmVzZW50YXRpb25OYW1lIGF0dHJpYnV0ZSBmb3IgYWxsIERlc2NyaWJhYmxlRWxlbWVudHMmI3hEOw0KLS0gYWRkZWQgJ2lzQWJzdHJhY3QnIEJvb2xlYW4gYXR0cmlidXRlIChkZWZhdWx0IGlzIGZhbHNlKSB0byBDbGFzc2lmaWVyIGluIFVNTDJJbmZyYXN0cnVjdHVyZU1pbmkmI3hEOw0KLSAgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlcHJlc2VudCBzbG90czsgdXNlZCBvbmx5IGJ5IFdvcmsgUHJvZHVjdHMgaW5pdGlhbGx5JiN4RDsNCi0tIE1vdmVkIGFzc29jaWF0aW9ucyBmcm9tIEFjdGl2aXR5IHRvIGFsbCBvZiBpdHMgYWxsb3dlZCBndWlkYW5jZSB0eXBlIHVwIHRvIEJyZWFrZG93biBFbGVtZW50JiN4RDsNCi0gIHRvIGFsbG93IGF0dGFjaGluZyBndWlkYW5jZSB0byBkZXNjcmlwdG9ycyBhbmQgbWlsZXN0b25lcyYjeEQ7DQotICAoQ2hlY2tsaXN0LCBDb25jZXB0LCBFeGFtcGxlLCBHdWlkZWxpbmUsIFJldXNhYmxlIEFzc2V0LCBTdXBwb3J0aW5nIE1hdGVyaWFsKSYjeEQ7DQotLSBhZGRlZCBvdGhlciBndWlkYW5jZSB0eXBlcyB0byBiZSBsaW5rYWJsZSBmcm9tIEJyZWFrZG93biBFbGVtZW50IGFzIHdlbGwgJiN4RDsNCi0gIChUb29sTWVudG9yLCBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbiwgUmVwb3J0LCBUZW1wbGF0ZSkmI3hEOw0KLS0gZml4ZWQgbXVsdGlwbGljaXR5IG9mIEJyZWFrZG93biBFbGVtZW50IChmb3JtZXIgQWN0aXZpdHkpIHRvIFJldXNhYmxlIEFzc2V0IHRvIG1hbnktdG8tbWFueSYjeEQ7DQotLSBhZGRlZCBhc3NvY2lhdGlvbiBmcm9tIE1pbGVzdG9uZSB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciB3aXRoIHJvbGUgcmVxdWlyZWRSZXN1bHRzJiN4RDsNCi0tIGFkZGVkIHRoZSBuZXcgY29uY2VwdCBvZiBGdWxmaWxsYWJsZSBFbGVtZW50IHRvIHRoZSBtZXRob2QgcGx1Z2luIHBhY2thZ2UgdGhhdCBhbGxvd3MgbW9kZWxpbmcgc2xvdHMmI3hEOw0KLS0gYWRkZWQgY2xhc3MgS2luZCBhcyBuZXcgQ29udGVudCBFbGVtZW50IHRvIEJhc2ljIEVsZW1lbnRzIHRoYXQgYWxsb3dzIGRlZmluaW5nIGxpZ2h0LXdlaWdodCBzdGVyZW90eXBlcyYjeEQ7DQotICBmb3IgTWV0aG9kIEVsZW1lbnRzOyBhIEtpbmQgY2FuIGJlIGFzc2lnbmVkIHRvIGluc3RhbmNlcyBvZiBtdWx0aXBsZSBtZXRhIGNsYXNzZXMgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKSYjeEQ7DQotICB0aGUgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gc3RvcmVkIHRoZSBuYW1lIG9mIHRoZSBhbGxvd2VkIG1ldGFjbGFzc2VzIGFzIHdlbGwgcXVhbGlmaWVzIG9uZSBhcyB0aGUmI3hEOw0KLSAgcHJpbWFyeSBzZWxlY3Rpb24gdG8gYmUgYWJsZSB0byB1c2UgaXRzIGtpbmQgaWNvbnMgaW4gZ3JhcGhpY2FsIHByZXNlbnRhdGlvbnMmI3hEOw0KLS0gYWRkZWQgQ29uZmlndXJhdGlvbiBDYXRlZ29yeSBjb25jZXB0cyB3aGljaCBpcyB1c2VkIHRvIG1vZGVsIHNlbGVjdGlvbiB3aXphcmRzJiN4RDsNCi0tIG1hZGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gYSBDb250ZW50IEVsZW1lbnQgdG8gc3RvcmUgaXQgaW4gcGx1Z2luIHBhY2thZ2VzIGFzIHdlbGwmI3hEOw0KLSYjeEQ7DQotVmVyc2lvbiAxLjAuNCBjaGFuZ2VzOiYjeEQ7DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7DQotLSBBZGRlZCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGNvbnRlbnQgZWxlbWVudCBhbmQgdGVybSBkZWZpbml0aW9uIHRvIGFsbG93IGFzc2lnbmluZyYjeEQ7DQotICBnbG9zc2F5IHRlcm1zIGFzIGd1aWRhbmNlJiN4RDsNCi0tIG1vdmVkIGV4dGVybmFsSUQgYXR0cmlidXRlIHVwIGZyb20gd29yayBwcm9kdWN0IGFuZCBwcm9jZXNzIHRvIGdlbmVyYWwgY29udGVudCBkZXNjcmlwdGlvbiYjeEQ7DQotLSBBZGRlZCB0d28gbmV3IGF0dHJpYnV0ZXMgZm9yIEFydGlmYWN0IERlc2NyaXB0aW9uOiAmI3hEOw0KLSAgcmVwcmVzZW50YXRpb24gYW5kIG5vdGF0aW9uJiN4RDsNCi0tIEFkZGVkIGFkZGl0aW9uYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENvbmZpZ3VyYXRpb24gYW5kIENhdGVnb3JpZXMgdG8gJiN4RDsNCi0gIG1vZGVsIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgd2l0aCBjYXRlZ29yaWVzIGFuZCBuZWdhdGl2ZSBzZXRzJiN4RDsNCi0tIE1hZGUgRG9tYWluIHRvIFdvcmsgUHJvZHVjdCBhc3NvY2lhdGlvbiBtYW55LXRvLW1hbnkmI3hEOw0KLS0gTWFkZSBNZXRob2QgUGFja2FnZSBuZXN0aW5nIGFzc29jaWF0aW9uIHVuaWRpcmVjdGlvbmFsJiN4RDsNCi0tIEFkZGVkIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBmb3IgZGVmaW5pbmcgYXBwbGljYXRpb24gc3BlY2lmaWMgYXR0cmlidXRlcyAmI3hEOw0KLSAgc3VjaCBhcyBwdWJsaWNhdGlvbiBmbGFncyBhbmQgZmxhZ2dpbmcgdXNlciBwbHVnLWlucyYjeEQ7DQotLSBDaGFuZ2VkIDEuLiogbXVsdGlwbGljaXRpZXMgZm9yIHN0YW5kYXJkIGNhdGVnb3JpZXMgdG8gKiYjeEQ7DQotJiN4RDsNCi1WZXJzaW9uIDEuMC4zIGNoYW5nZXM6JiN4RDsNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsNCi0wNy8yNi8wNiYjeEQ7DQotLSBDb3JyZWN0ZWQgZGVmYXVsdCB2YWx1ZSBvZiBNZXRob2RQbHVnaW46OlVzZXJDaGFuZ2VhYmxlIHRvIHRydWUmI3hEOw0KLTA3LzA2LzA2JiN4RDsNCi0tIFJlbW92ZWQgRXN0aW1hdGUgICBhbmQgRXN0aW1hdGlvbiBNZXRyaWMgR3VpZGFuY2UgZWxlbWVudHM7ICYjeEQ7DQotICBvbmx5IGtlcHQgRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uJiN4RDsNCi0wNi8yMC8wNiYjeEQ7DQotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBmcm9tIGRpc2NpcGxpbmUgdG8gYWN0aXZpdHkgdG8gbWFueSB0byBtYW55JiN4RDsNCi0wNi8xNS8wNiYjeEQ7DQotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBvZiByb2xlIGRlc2NyaXB0b3IgdG8gd29yayBwcm9kdWN0cyBkZXNjcmlwdG9yIHRvICYjeEQ7DQotICBtYW55IHRvIG1hbnkmI3hEOw0KLTA2LzEzLzA2JiN4RDsNCi0tIEFkZGVkIGRpcmVjdGlvbnMgdG8gZGVzY3JpcHRvciBhc3NvY2lhdGlvbnMgdG8gYXZvaWQgdGhhdCBkZXNjcmlwdG9ycyYjeEQ7DQotICBhZGRlZCB0byBhbiBhY3Rpdml0eSB2aWEgbG9jYWwgY29udHJpYnV0aW9uIG1vZGlmeSBpbmhlcml0ZWQgZGVzY3JpcHRvcnMmI3hEOw0KLTA1LzAxLzIwMDYmI3hEOw0KLS0gTW92ZWQgVU1MMiBEaWFncmFtIEludGVyY2hhbmdlIHRvIHRvcC1sZXZlbCBwYWNrYWdlJiN4RDsNCi0tIENoYW5nZWQgbXVsdGlwbGljaXR5IG9mIGJyZWFrZG93biBlbGVtZW50cyB0byBhY3Rpdml0aWVzIHRvIDEmI3hEOw0KLS0gTWFkZSBNZXRob2QgQ29uZmlndXJhdGlvbiBhIE1ldGhvZCBVbml0JiN4RDsNCi0tIENoYW5nZWQgbXVsdGlwbGljaXR5IGZvciBUYXNrIHRvIERpc2NpcGxpbmU6IGEgVGFzayBjYW4gbm93IGJlIGNhdGVnb3JpemVkJiN4RDsNCi0gIGJ5IG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSB0byBhbGxvdyBtb2RlbGluZyByZXBsYWNpbmcgZGlzY2lwbGluZXMmI3hEOw0KLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgZm9yIFJvbGUgdG8gV1A6IGEgV1AgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSAmI3hEOw0KLSAgcmVzcG9uc2libGUgUm9sZSB0byBhbGxvdyBtb2RlbGluZyByZXBsYWNpbmcgcm9sZXMmI3hEOw0KLS0gTmVzdGluZyBvZiBkaXNjaXBsaW5lcyYjeEQ7DQotLSBSZW1vdmVkICZxdW90O3dvcmtlZE9uQnkmcXVvdDsgZGVycml2ZWQgcHJvcGVydHkgZm9yIFJvbGVEZXNjcmlwdG9yIHRvIFdQOyYjeEQ7DQotICBtb2RpZmllcyBwcm9wZXJ0eSBpcyBzdWZmaWNpZW50JiN4RDsNCi0tIGFkZGVkIHR3byBtb3JlIHZhcmlhYmlsaXR5IHR5cGVzIHVzZWQgYnkgYWN0aXZpdGllczogbG9jYWxDb250cmlidXRpb24mI3hEOw0KLSAgYW5kIGxvY2FsUmVwbGFjZW1lbnQ7IHRoaXMgY2hhbmdlIGlzIG9ubHkgdGVtcG9yYXJpbHkgdG8gbWluaW1pemUgbWlncmF0aW9ucyYjeEQ7DQotICBpc3N1ZXM6IGluIHRoZSBmdXR1cmUgdGhlc2UgbmVlZCB0byBiZSBtb2RlbGVkIGFzIGluIFNQRU0yIGFzIGEgc2VwZXJhdGUgJiN4RDsNCi0gIEFjdGl2aXR5VXNlIGNsYXNzIGFuZCBBY3Rpdml0eVVzZVR5cGUgZW51bWVyYXRpb24mI3hEOw0KLS0gQ3JlYXRlZCBBY3Rpdml0eSBzcGVjaWFsaXphdGlvbiB0aGF0IGFkZHMgaXNFbmFjdGFibGU9ZmFsc2UgYXR0cmlidXRlIGluJiN4RDsNCi0gIHRoZSBwYWNrYWdlIFByb2Nlc3MgLS0+IFdvcmtmbG93IHBhY2thZ2UmI3hEOw0KLS0gQWRkZWQgZGlyZWN0IGFzc29jaWF0aW9ucyBmcm9tIFdQIGFuZCBUYXNrIHRvIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyYjeEQ7DQotICB1bnRpbCBFc3RpbWF0ZSBpcyB1c2VkOyBhbGxvd3MgbGlua2luZyBvZiBjb25zaWRlcmF0b25zIHRvIHRoZXNlIGVsZW1lbnRzJiN4RDsNCi0tIFJlbW92ZWQgUHJvY2VzcyBDb250cmlidXRpb24gYXMgaXQgaXMgcmVkdW5kYW50IHdpdGggY3JlYXRpbmcgZXh0ZW5kcyAmI3hEOw0KLSAgYmV0d2VlbiBQcm9jZXNzZXMgZGlyZWN0bHk8L2JvZHk+DQotICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU2MjAwMUNGIiBuYW1lPSJVTUwySW5mcmFzdHJ1Y3R1cmVNaW5pIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d4dzFhdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxREYyQzQzMDE1MSI+DQotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYyQzQzMDE1MSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2N0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2N0LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1FZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1FLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkxtRk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2N0T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY3RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU1IiB5PSI4NjMiIHdpZHRoPSIyNTQwIiBoZWlnaHQ9IjE2NzYiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HeHcxYk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgIDwvY29udGVudHM+DQotICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSIgbmFtZT0iQ29uc3RydWN0cyI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d4dzFaLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRERFNjM2MDAwNCI+DQotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU2MzYwMDA0IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJjdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE00cmR1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2OTMiIGhlaWdodD0iMTA4MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyZmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyZi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmdlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hNNHJjLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITTRyZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTM3IiB5PSI5OTYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZ3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hNNHJodWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRya09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJrZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITTRyZy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE00cmhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY1IiB5PSI2ODI0IiB3aWR0aD0iMTUyNCIgaGVpZ2h0PSI3NjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRya3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRybGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hNNHJsdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjSk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjSnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjS09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY0t1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hNNHJrLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITTRybE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTciIHk9IjkxOTMiIHdpZHRoPSIzMzE2IiBoZWlnaHQ9IjEyMTkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2NPT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1BlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1AtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1FlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NRLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNjTmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY051ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTIyMCIgeT0iNTMwMCIgd2lkdGg9IjMxMzIiIGhlaWdodD0iNzEyIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjU09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1QtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1VlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NVLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNjUmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY1J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI0OSIgeT0iMjY2NyIgd2lkdGg9IjMyODYiIGhlaWdodD0iMTEyNCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY2MtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY2Z1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NjT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzE1IiB5PSI1MzUwIiB3aWR0aD0iNDE0MSIgaGVpZ2h0PSI2NTkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNja2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2NsZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY211ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY25PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY251ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NvT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNja3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2stZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ5MSIgeT0iODY2MSIgd2lkdGg9IjIyMjAiIGhlaWdodD0iODI3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d4dzFhZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NLLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhCRDAyOEYiIHNvdXJjZT0iX0hNNHJrdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjTC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NMT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NMZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NDEsIDAsIDE4NDVdJFswLCAtMTg0NSwgMCwgNTQxXSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NNdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NNLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NWT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNBRjAyMDIiIHNvdXJjZT0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hNNHJjdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NWZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NWdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgsIC03OTUsIC00MiwgMTQ5MF0kWzMzLCAtMTc0NCwgLTE2LCA1NDFdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY1hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOTEyMDNDMCIgc291cmNlPSJfSE00cmd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY1h1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY1gtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjY4LCAtNTUwLCAtNDI1OCwgMzM2MV0kWzM5MjAsIC0zMTI0LCAtMTAwNywgNzg3XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NaT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NaZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkI0NTAzRDUiIHNvdXJjZT0iX0hOQ2NOT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjYXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NaLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NhT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NDYsIC01NTAsIDI4NjEsIDE4MzddJFstMjQ3MiwgLTE2MDAsIDEyMzYsIDc4N10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjYmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjYnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBzb3VyY2U9Il9ITkNjYi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2hlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2ctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjZ09mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjZ2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTUwLCAwLCAxODg4XSRbMCwgLTE2NTEsIDAsIDc4N10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjaC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjaU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY3MUIwM0E4IiBzb3VyY2U9Il9ITTRyZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjYi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjaWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjaXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NjIsIC0yMzcsIC00MTY1LCAxMjM2XSRbMzA5MCwgLTkzMSwgLTE4MzcsIDU0MV0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjai1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNja09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjb2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCQ0EwMEU5IiBzb3VyY2U9Il9ITkNja2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjTk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY3BlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjb3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjby1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTQxLCAwLCAyODEwXSRbMCwgLTI4MTAsIDAsIDU0MV0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjcU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjcWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjcXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCQ0YwMkE5IiBzb3VyY2U9Il9ITkNja2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjYi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY3J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjcS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjck9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjAxLCAtNTQxLCAzMTA3LCAyNzYwXSRbLTMwOTgsIC0yNzYwLCA2MDksIDU0MV0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjc2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjc3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyIgbmFtZT0iQ2xhc3NpZmllciIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hkNmR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyI+DQotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGOEJEMDI4RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCIvPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfbFdRd0FjVXlFZHkybXVRMlBRdkhfQSIgbmFtZT0iaXNBYnN0cmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9sVGRlTU1VekVkeTJtdVEyUFF2SF9BIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyIvPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSIgbmFtZT0iRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSI+DQotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiIG5hbWU9Ik5hbWVkRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+DQotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERUNBRjAyMDIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiLz4NCi0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQzhFMDBCNiIgbmFtZT0ibmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9FZ3N5Z2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0Vnc3lnT3lKRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfRVlwcHdPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yZS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ij4NCi0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERjhENDAyMTEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiLz4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiIG5hbWU9IlR5cGUiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4bnJmLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiPg0KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERjcxQjAzQTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGOTEyMDNDMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSIgbmFtZT0iUGFja2FnZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmhPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+DQotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQkNBMDBFOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERGQTQ0MDNBOCIvPg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZCQ0YwMkE5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ii8+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4IiBuYW1lPSJOYW1lc3BhY2UiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4dzFaT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkE0NDAzQTgiPg0KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQjQ1MDNENSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZEMDQwMEYxIiBuYW1lPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3dVRtdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjU2NEZBMDA5NSI+DQotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjU2NEZBMDA5NSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpdk9mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGhvdyBjb3JlIGNvbnRlbnQgZWxlbWVudHMgY2FuIGJlIG9yZ2FuaXplZCBmb3IgaW5zdGFudGlhdGlvbiBpbiBwcm9jZXNzZXMuICBQcm9jZXNzZXMgaGF2ZSBsb2NhbCBzY2hlbWVzIGZhY2lsaXRhdGluZyByZWRlZmluaXRpb24gb2YgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIFJvbGVzLCBUYXNrcywgYW5kIFdvcmtQcm9kdWN0cy4gVGhlcmUgYXJlIHR3byBtYWluIHZhcmlhdGlvbnMgb2YgcHJvY2VzcyBkZWZpbmVkOiBEZWxpdmVyeSBQcm9jZXNzZXMsIHdoaWNoIGRlc2NyaWJlcyBlbmQtdG8tZW5kIHdheXMgb2YgZG9pbmcgYSAmcXVvdDtwcm9qZWN0JnF1b3Q7IGFzIHdlbGwgYXMgQ2FwYWJpbGl0eSBQYXR0ZXJucywgd2hpY2ggcHJvdmlkZSByZXVzdWFibGUgcGFydHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIERlbGl2ZXJ5IFByb2Nlc3Nlcy4mI3hBOyIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l2ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NDg0IiB5PSI0NzU1IiB3aWR0aD0iNzAzNSIgaGVpZ2h0PSI0NTQ2Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l3ZWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgYSBwbHVnaW4gbWVjaGFuaXNtIHdoaWNoIHJlbGllcyBvbiBwYWNrYWdpbmcgYXMgd2VsbCBhcyBuZXcgcmVsYXRpb25zaGlwIHR5cGVzIGZvciBjb250ZW50IGFuZCBwcm9jZXNzIGVsZW1lbnRzIHRoYXQgYWxsb3cgZGVjbGFyaW5nIGNoYW5nZSBkZWx0YXMgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIHNvdXJjZS4iIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzOTMiIHk9IjM1NDYiIHdpZHRoPSI2NTQ0IiBoZWlnaHQ9IjIzMTEiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaXh1ZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0iRGVmaW5lcyBrZXkgY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBXb3JrUHJvZHVjdHMsIFRhc2tzLCB0aGVpciBhdHRyaWJ1dGVzLCBhbmQgdGhlaXIgZGVmYXVsdCByZWxhdGlvbnNoaXBzLiBBbHNvIGRlZmluZXMgYSBiYXNpYyBtZWNoYW5pc21zIHRvIG9yZ2FuaXplIGNvcmUgY29udGVudCBpbiBwYWNrYWdlcy4iIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpeC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDA4IiB5PSI3NzIzIiB3aWR0aD0iNjI4MiIgaGVpZ2h0PSIyODAyIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l5LWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgaG93IHBsdWdpbnMgYXJlIGZ1cnRoZXIgcGFja2FnZWQgaW4gbGlicmFyaWVzIGFzIHdlbGwgYXMgZGVmaW5lcyB0aGUgY29uY2VwdCBvZiBjb25maWd1cmF0aW9ucyBleHRlbmRpbmcgdGhlIHBsdWdpbiBtZWNoYW1pc20uIiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaXpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU5ODQiIHk9IjEzNDUiIHdpZHRoPSI2Mjk5IiBoZWlnaHQ9IjE2OTMiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNZZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQkYiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzWmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzYWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc2F1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzWXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNZLWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4NzYiIHk9IjU4MDUiIHdpZHRoPSIzNjE1IiBoZWlnaHQ9IjE3MTAiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzYi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc2RPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzYk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNiZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4NzYiIHk9IjM0ODciIHdpZHRoPSIzNjE1IiBoZWlnaHQ9IjE3MTAiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRleHQiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExQc2R1ZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSIxMiIgYm9sZD0idHJ1ZSIgZGVzY3JpcHRpb249IklCTSBVbmlmaWVkIE1ldGhvZHMgQXJjaGl0ZWN0dXJlIHYxLjAuNTogQ29uY2VwdHVhbCBNZXRhLU1vZGVsIiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc2QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU1IiB5PSI0NTciIHdpZHRoPSIxMzkxOSIgaGVpZ2h0PSI1MjQiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNrLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0IiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzbC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc25PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzbE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNsZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4NzYiIHk9IjgyNDIiIHdpZHRoPSIzNjE1IiBoZWlnaHQ9IjE3MTAiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNxLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwM0IiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITFBzci1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExQc3RPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzck9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMUHNyZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4NzYiIHk9IjEyNjgiIHdpZHRoPSIzNjE1IiBoZWlnaHQ9IjE3MTAiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3M1R2hrTVBORWR5ekhxS2YzMUJJX3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zNUdoazhQTkVkeXpIcUtmMzFCSV93IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9zNUdobE1QTkVkeXpIcUtmMzFCSV93IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfczVHaGxjUE5FZHl6SHFLZjMxQklfdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zNUdobHNQTkVkeXpIcUtmMzFCSV93IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3M1R2hsOFBORWR5ekhxS2YzMUJJX3ciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zNUdobU1QTkVkeXpIcUtmMzFCSV93IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfczVHaG1jUE5FZHl6SHFLZjMxQklfdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9zNUdoa2NQTkVkeXpIcUtmMzFCSV93IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3M1R2hrc1BORWR5ekhxS2YzMUJJX3ciIHg9Ijg4NzYiIHk9IjExMDk1IiB3aWR0aD0iNDc4NyIgaGVpZ2h0PSIxNDI2Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90NjBkUU1QTkVkeXpIcUtmMzFCSV93IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2MjAwMUNGIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdDYwZFE4UE5FZHl6SHFLZjMxQklfdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfdDYwZFJNUE5FZHl6SHFLZjMxQklfdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3Q2MGRSY1BORWR5ekhxS2YzMUJJX3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdDYwZFJzUE5FZHl6SHFLZjMxQklfdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90NjBkUjhQTkVkeXpIcUtmMzFCSV93IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdDYwZFNNUE5FZHl6SHFLZjMxQklfdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3Q2MGRTY1BORWR5ekhxS2YzMUJJX3ciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfdDYwZFFjUE5FZHl6SHFLZjMxQklfdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il90NjBkUXNQTkVkeXpIcUtmMzFCSV93IiB4PSI4ODc2IiB5PSIxMjk5MCIgd2lkdGg9IjQ3ODciIGhlaWdodD0iMTQyNiIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa2VCZ2tNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhT1lZTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZUJnazhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rZUJnbE1pTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa2VCZ2xjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZUJnbHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tlQmdsOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZUJnbU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa2VCZ21jaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rZUJna2NpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tlQmdrc2lNRWR5eE80RXN1UU9nVGciIHg9Ijg4NzYiIHk9IjE0ODk5Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91OHhJb01pU0VkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZSjRjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3U4eElvOGlTRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3U4eElwTWlTRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91OHhJcGNpU0VkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3U4eElwc2lTRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdTh4SXA4aVNFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3U4eElxTWlTRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il91OHhJcWNpU0VkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3U4eElvY2lTRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdTh4SW9zaVNFZHl4TzRFc3VRT2dUZyIgeD0iMTQ1ODIiIHk9IjE0ODk5Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3d1VG5PZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBVTUEgTWV0YS1Nb2RlbCBpcyBzdHJ1Y3R1cmVkIGFzIGRlcGljdGVkIGluIHRoZSBkaWFncmFtLiAgVGhlIHN0cnVjdHVyZSBkaXZpZGVzIHRoZSBtb2RlbCBpbiBsb2dpY2FsIHVuaXRzLiAgRWFjaCB1bml0IGV4dGVuZHMgdGhlIHVuaXRzIGl0IGRlcGVuZHMgdXBvbiBwcm92aWRpbmcgYWRkaXRpb25hbCBzdHJ1Y3R1cmVzIGFuZCBjYXBhYmlsaXRpZXMuICBPdmVyYWxsIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtIGFwcGxpZWQgdG8gdGhlIHBhY2thZ2VzIHJlYWxpemVzIGEgZ3JhZHVhbCBleHRlbnNpb24gb2YgdGhlIGNhcGFiaWxpdGllcyBtb2RlbGVkIHVuaXQgYnkgdW5pdC4gIEFzIGEgcmVzdWx0LCB1bml0cyBkZWZpbmVkIG9uIGEgbG93ZXIgbGF5ZXIgY2FuIGJlIHJlYWxpemVkIGJ5IGEgVU1BIHN1YnNldC1pbXBsZW1lbnRhdGlvbiB3aXRob3V0IHRoZSBoaWdoZXIgbGV2ZWwgdW5pdHMuICBGb3IgZXhhbXBsZSwgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIGNvdWxkIGJlIGJhc2VkIGp1c3Qgb24gdGhlIE1ldGhvZCBDb3JlIGFuZCBNZXRob2QgUGx1Z2luIHBhY2thZ2VzIHdpdGhvdXQgdXNpbmcgdGhlIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4gIEhvd2V2ZXIsIGlmIHRoZSBQcm9jZXNzIHBhY2thZ2Ugd291bGQgYmUgaW5jbHVkZWQgYXMgd2VsbCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIHRoZW4gYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgUHJvY2VzcyBwYWNrYWdlIHdvdWxkIGJlIG1lcmdlZCBpbnRvIHRoZSBNZXRob2QgUGx1Z2luIHBhY2thZ2UuIi8+DQotICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpdS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzWWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc2UtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBzZk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzUyMiwgLTMyMSwgNTg3NSwgNTldJFstNzQ2NywgLTMyMSwgMTkzMCwgNTldIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNmZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzYS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc2otZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBza09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMjY4LCAtNjM1LCAtMzQzNywgLTQ1N10kWzQ3NjYsIC02MzUsIC0xOTM4LCAtNDU3XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBza2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2t1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjA4NDcxNTAyLDAuODEwODU5MikiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpeGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzay1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc3AtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHNxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQzODUsIDYzNSwgLTE4MTEsIC0yMDNdJFszMTQxLCA0NTcsIC0zMDU2LCAtMzgxXSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzcWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc3F1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITFBzeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSExHaXl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSExQc3EtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHN5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc3llZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTcxMDMsIC05MywgMTczNSwgLTE2XSRbLTMxNTgsIC05MywgNTY4MSwgLTE2XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc3ktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9oYU9ZWU1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJQcm9jZXNzRGlhZ3JhbXNfZGVwcmVjYXRlZCI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2hhT1lZY2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iX2hhT1lZc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX2hhT1lZc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWVk4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWUo0Y2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhT1laTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFPWVpjaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYU9ZWnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWVo4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhT1lhTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhT1lhY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhT1lhc2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhT1lhOGlNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYU9ZYk1pTUVkeXhPNEVzdVFPZ1RnIiB4PSIxODIwIiB5PSIzODUyIiB3aWR0aD0iNDk1NCIgaGVpZ2h0PSIxNzk0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWWQ4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWUpqc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhT1llTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFPWWVjaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYU9ZZXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWWU4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhT1lmTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhT1lmY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhT1lmc2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhT1lmOGlNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYU9ZZ01pTUVkeXhPNEVzdVFPZ1RnIiB4PSIyNTU2IiB5PSI2NjgiIHdpZHRoPSIzNTMwIiBoZWlnaHQ9IjE4NjIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96aDFlQU1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96aDFlQThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3poMWVCTWlNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfemgxZUJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3poMWVCc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96aDFlQjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96aDFlQ01pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il96aDFlQ2NpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il96aDFlQWNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfemgxZUFzaU1FZHl4TzRFc3VRT2dUZyIgeD0iMjI0NyIgeT0iNzYxOSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzN5OThBTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzN5OThBOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfM3k5OEJNaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zeTk4QmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM3k5OEJzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzN5OThCOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzN5OThDTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzN5OThDY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzN5OThBY2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8zeTk4QXNpTUVkeXhPNEVzdVFPZ1RnIiB4PSI0NDE3IiB5PSIxMDkyNiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1TM1hvTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1TM1hvOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfLVMzWHBNaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tUzNYcGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLVMzWHBzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1TM1hwOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1TM1hxTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1TM1hxY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXy1TM1hvY2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8tUzNYb3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSI4OTkzIiB5PSIyNTEyIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZnpwVXdNaVBFZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZnpwVXc4aVBFZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9menBVeE1pUEVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2Z6cFV4Y2lQRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9menBVeHNpUEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZnpwVXg4aVBFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZnpwVXlNaVBFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZnpwVXljaVBFZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfZnpwVXdjaVBFZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2Z6cFV3c2lQRWR5eE80RXN1UU9nVGciIHg9Ii02NjMiIHk9IjEwODc0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX2hhWUphc2lNRWR5eE80RXN1UU9nVGciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IHVtYSBkaWFncmFtcyBhcmUgYmFzZWQgb24gdGhlIHVtbDIgZGlhZ3JhbSBpbnRlcmNoYW5nZS4gIFRoZSBtZXRob2QgbW9kZWwgcGFja2FnZSBhY2Nlc3NlcyB0aGVzZSBkaWFncmFtcywgYmVjYXVzZSB0aGUgcHJvY2VzcyBwYWNrYWdlcyBkZWZpbmVkIGluIG1ldGhvZCBtb2RlbHMgcGFja2FnZS9jb250YWluIHRoZSBkaWFncmFtcy4iLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWUphOGlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlOLXNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYU9ZWThpTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il8zeTk4QU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKYk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmJzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmI4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlKY01pTUVkeXhPNEVzdVFPZ1RnIiB4PSI0NzUiIHk9Ii0xMzQ5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWUpjY2lNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWUpjc2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzk0OCwgODk3LCAtMTQzOSwgLTYwMTFdJFsyMzYyLCAyMTI1LCAtMjUsIC00NzgzXSRbMjM3MCwgNTc1NywgLTE2LCAtMTE1MV0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlKYzhpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlKZGNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZSjFzaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFPWWQ4aU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfLVMzWG9NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmRzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpkOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUplTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUplY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZSmVzaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTIwIiB5PSItNDI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWUplOGlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWUpmTWlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzY4LCAxOCwgLTE4OSwgLTMwXSRbMjIyLCA4MSwgLTM1LCAzM10iLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9fWDJwd01pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iKDAuMjE4NTUxNDYsMC44MTYyNjkzKSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWUpmY2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlOX01pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYU9ZWThpTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il96aDFlQU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKZnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmY4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmdNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmdjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlKZ3NpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMzQ5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWUpnOGlNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlKaE1pTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlsyLCAzNSwgNSwgLTk2XSRbMTgsIDE2MywgMjEsIDMyXSIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iXzFKMTlvTWlNRWR5eE80RXN1UU9nVGciIGlkPSIoMC41MjcwMDg4LDAuNzk4MDM2NDYpIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZSmhjaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWUoxOGlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhT1lkOGlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhT1lZOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpoc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKaDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKaU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKaWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUppc2lNRWR5eE80RXN1UU9nVGciIHg9Ii0yNyIgeT0iLTc0MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlKaThpTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlKak1pTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9Ils3LCAzNiwgOCwgLTgzXSRbOTMsIDExNiwgOTQsIC0zXSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iXzN6SHRBTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9ub3lUTU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il96aDFlQU1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il8zeTk4QU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zekh0QThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM3pIdEJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM3pIdEI4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM3pIdEJzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8zekh0Qk1pTUVkeXhPNEVzdVFPZ1RnIiB4PSItMzIiIHk9Ii02MzMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfM3pIdEFjaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfM3pIdEFzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZnpwVXlzaVBFZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2M2dGRrT3g1RWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iX3poMWVBTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2Z6cFV3TWlQRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2Z6cFV6Y2lQRWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9menBVejhpUEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9menBVMGNpUEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9menBVME1pUEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2Z6cFV6c2lQRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZnpwVXk4aVBFZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZnpwVXpNaVBFZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9oYVlKamNpTUVkeXhPNEVzdVFPZ1RnIiBhbm5vdGF0ZWRFbGVtZW50PSJfaGFPWVlNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDxib2R5PjA1PC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfaGFZSmpzaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iVU1BRGlhZ3JhbXMiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2hhWUpqOGlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iX2hhWUprTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfaGFZSmtNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUprY2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPVGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUprc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlKazhpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iNDI1MCIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKbE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKbGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKbHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpsOGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUptTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUptY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUptc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUptOGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUpuTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpuY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKbnNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUpuOGlNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUpvTWlNRWR5eE80RXN1UU9nVGciIHg9IjIyMTkiIHk9IjM4MDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSm9jaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWUoyTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSm9zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUpvOGlNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIzMDY0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnBNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnBjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnBzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKcDhpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKcU1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKcWNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKcXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKcThpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKck1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKcmNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSnJzaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlKcjhpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlKc01pTUVkeXhPNEVzdVFPZ1RnIiB4PSIxNTg1IiB5PSI5NTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX2hhWUpzY2lNRWR5eE80RXN1UU9nVGciIGRlc2NyaXB0aW9uPSJVTUEgc3VwcG9ydHMgdGhyZWUgdHlwZXMgb2YgZGlhZ3JhbXMuIEhvd2V2ZXIsIHRoaXMgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBkZWZpbmUgdGhlIHN5bnRheCBvZiB0aGVzZSBkaWFncmFtcywgYnV0IHJhdGhlciByZWxpZXMgb24gYSB0b29sIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZXhhY3QgcHJlc2VudGF0aW9uIG9mIHRoZSB0aHJlZSBkaWFncmFtcy4gIFV0aWx6aW5nIHRoZSBVTUwyIERpYWdyYW0gSW50ZXJjaGFuZ2Ugc3BlY2lmaWNhdGlvbiB0aGlzIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgYWxsIHN0cnVjdHVyZXMgdG8gcmVwcmVzZW50IGFuZCBwZXJzaXN0IHRoZXNlIGRpYWdyYW1zLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWUpzc2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlKM01pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlKb2NpTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlKa2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpzOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp0TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnRjaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlKdHNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKdDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZSjNzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp1TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlKdWNpTUVkeXhPNEVzdVFPZ1RnIiB4PSIxODciIHk9Ii0zMzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp1c2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWUozc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKdThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUp2TWlNRWR5eE80RXN1UU9nVGciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp2Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWUoyY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKdnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlKdjhpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMjI5IiB5PSItMjU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKd01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZSjJjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp3Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlKd3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMjQwIiB5PSI5MDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp3OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlKM3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnhNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUp4Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZSnhzaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSng4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZSjJjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp5TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKeWNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUp5c2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp5OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZSjNzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp6TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKemNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUp6c2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp6OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlKMmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSjBNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSjBjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlKMHNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlKMDhpTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWUoxTWlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzAsIDQ0OCwgMCwgLTMxMDddJFswLCAzMDIyLCAwLCAtNTMzXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9oYVlKMWNpTUVkeXhPNEVzdVFPZ1RnIiBhbm5vdGF0ZWRFbGVtZW50PSJfaGFZSmpzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX2hhWUoxc2lNRWR5eE80RXN1UU9nVGciIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiLz4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9oYVlKMThpTUVkeXhPNEVzdVFPZ1RnIiBtZXJnZWRQYWNrYWdlPSJfaGFZSjRjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWUoyTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZSjJjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iZGlhZ3JhbXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9UY2lNRWR5eE80RXN1UU9nVGciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfaGFZSjNNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlKMnNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZSjI4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWUozTWlNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWUoyY2lNRWR5eE80RXN1UU9nVGcgX2hhWUozc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfaGFZSjNjaU1FZHl4TzRFc3VRT2dUZyIgYW5ub3RhdGVkRWxlbWVudD0iX2hhWUozTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB0aGUgb25seSBtZW1iZXIgb2YgdGhlIHVtYWRpYWdyYW1zIHBhY2thZ2UuICBJdCBkZWZpbmVzIHRoYXQgRGlhZ3JhbXMgY2FuIGJlIHBhY2thZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9oYVlKM3NpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJfcHJvY2Vzc1BhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWUoyTWlNRWR5eE80RXN1UU9nVGciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il9oYVlKM01pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWUozOGlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlKNE1pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiIgbmFtZT0iUHJpbWl0aXZlVHlwZXMiPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HeGQ2Y09mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiLz4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiIG5hbWU9IkRhdGUiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3NEVsZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPg0KLSAgICAgICAgICAgIDxib2R5PkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiIG5hbWU9IlVyaSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hCT2dlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSI+DQotICAgICAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgbmFtZT0iU3RyaW5nIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9pN0ZUb09pZkVkdVFidVk2VXdNU1FnIiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICA8Ym9keT5BIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4gc29tZSBzdWl0YWJsZSBjaGFyYWN0ZXIgc2V0IHVzZWQgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kZWwuIENoYXJhY3RlciBzZXRzIG1heSBpbmNsdWRlIG5vbi1Sb21hbiBhbHBoYWJldHMgYW5kIGNoYXJhY3RlcnMuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDNGMDk4OUI5MDI5MCIgbmFtZT0iU2V0Ii8+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0YwOTg5OUMwMEVBIiBuYW1lPSJTZXF1ZW5jZSIvPg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDNDQTAxMEE0MDA3QiIgbmFtZT0iSW50ZWdlciI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfZFVjNm9Pb0ZFZHVPQlBRQTJoS3FVUSIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDNDQTAxMEE0MDA3QiI+DQotICAgICAgICAgICAgPGJvZHk+QW4gaW50ZWdlciBpcyBhIHByaW1pdGl2ZSB0eXBlIHJlcHJlc2VudGluZyBpbnRlZ2VyIHZhbHVlcy48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyIgbmFtZT0iQm9vbGVhbiI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfNUdjWUFlaWVFZHVRYnVZNlV3TVNRZyIgYW5ub3RhdGVkRWxlbWVudD0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgIDxib2R5PkEgQm9vbGVhbiB0eXBlIGlzIHVzZWQgZm9yIGxvZ2ljYWwgZXhwcmVzc2lvbiwgY29uc2lzdGluZyBvZiB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMgdHJ1ZSBhbmQgZmFsc2UuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiIG5hbWU9IkRvdWJsZSIvPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQkYiIG5hbWU9IlByb2Nlc3MiPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hb09lNnVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEZEODU2QjAyNzYiPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ4NTZCMDI3NiIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdxdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3ci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3cC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd3FPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM2MCIgeT0iMTE0NTYiIHdpZHRoPSIzMzk4IiBoZWlnaHQ9IjE2NzYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3c09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfZWhRZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX2VoUnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3c2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd3N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzc4OSIgeT0iODMzNCIgd2lkdGg9IjI1NDAiIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhSLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19laFMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfZWhVT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfZWhTT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX2VoU2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTExIiB5PSI1NTA1IiB3aWR0aD0iMzA5NiIgaGVpZ2h0PSIxNjc2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19uclF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX3hjTWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y05lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y051ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19uclEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfbnJST2ZYRWR1cUhvT0piVVJaUnciIHg9IjMyOTkiIHk9Ii0zMTEiIHdpZHRoPSIzNTIwIiBoZWlnaHQ9IjE2ODQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjU2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjJBMUIwMkU3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfeGNUZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjVXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX3hjU3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR194Y1MtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk1NCIgeT0iMjQ3MCIgd2lkdGg9IjQyMDkiIGhlaWdodD0iMTY4NCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hb09lN09mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifFVNQSBzZXBhcmF0ZXMgcmV1c2FibGUgY29yZSBtZXRob2QgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuICBBIERldmVsb3BtZW50IFByb2Nlc3MgZGVmaW5lcyB0aGUgc3RydWN0dXJlZCB3b3JrIGRlZmluaXRpb25zIHRoYXQgbmVlZCB0byBiZSBwZXJmb3JtZWQgdG8gZGV2ZWxvcCBhIHN5c3RlbSwgZS5nLiBieSBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGZvbGxvd3MgdGhlIHByb2Nlc3MuICBTdWNoIHN0cnVjdHVyZWQgd29yayBkZWZpbml0aW9ucyBkZWxpbmVhdGUgdGhlIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFsb25nIGEgdGltZWxpbmUgb3IgbGlmZWN5Y2xlIGFuZCBvcmdhbml6ZSBpdCBpbiBzbyBjYWxsZWQgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUYXNrcyAoYXMgdGhleSBoYXZlIGJlZW4gaW50cm9kdWNlZCBhcyBwYXJ0IG9mIHRoZSBjb3JlIG1ldGhvZCBjb250ZW50KSBwcm92aWRlIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBwZXJmb3JtZWQgdG8gYWNoaWV2ZSBhIHBhcnRpY3VsYXIgZGV2ZWxvcG1lbnQgZ29hbC4gIEEgVGFzayBkb2VzIG5vdCBsb29rIGF0IHRoZSAnYmlnIHBpY3R1cmUnIG9mIGhvdyB0aGUgd29yayBkZXNjcmliZWQgcmVsYXRlcyB0byBvdGhlciBUYXNrJ3Mgd29yay4gIFRoZXkgaGF2ZSBiZWVuIGRlZmluZWQgYXMgcmV1c2FibGUgY29yZSBtZXRob2QgY29udGVudCBpbmRlcGVuZGVudCBvZiB0aGVpciBwbGFjZW1lbnQgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgQWxsIHRoYXQgaXMgZGVmaW5lZCBmb3IgYSBUYXNrIGFyZSB0aGUgdHlwZXMgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cywgdGhlIGNvbmNyZXRlIHN0ZXBzIHRvIHBlcmZvcm0sIGFzIHdlbGwgYXMgd2hhdCBza2lsbHMgYXJlIHJlcXVpcmVkIHRvIHBlcmZvcm0gdGhlIHdvcmsgKHJvbGVzKS4gIFdoaWNoIFRhc2tzIGhhdmUgdG8gcHJlY2VkZSBhbmQgc3VjY2VlZCBhIFRhc2sgYXMgd2VsbCBhcyB3aGF0IHN0ZXBzIHRvIGZvY3VzIG9uIGF0IHdoYXQgcG9pbnQgb2YgdGltZSBpbiB0aGUgbGlmZWN5Y2xlIGFyZSBpbnRlbnRpb25hbGx5IG5vdCBkZWZpbmVkIGZvciBjb3JlIG1ldGhvZCBjb250ZW50LiAgVGhlIGdvYWwgaXMgcHJvdmlkZSBUYXNrcyB0aGF0IGNhbiBiZSByZXVzZWQgZm9yIG1hbnkgZGlmZmVyZW50IGRldmVsb3BtZW50IHNpdHVhdGlvbnMuJiN4QTt8VGhlIHNjb3BlIG9mIGEgcHJvY2VzcyBpcyB0byBwcm92aWRlIGV4dGVuZGVkIGFzIHdlbGwgYXMgY29uY3JldGUgd29yayBzdHJ1Y3R1cmVzIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHNpdHVhdGlvbi4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIHRha2VzIHJldXNhYmxlIGNvcmUgbWV0aG9kIGVsZW1lbnRzIHN1Y2ggYXMgVGFza3MgYW5kIFdvcmsgUHJvZHVjdHMgYW5kIHJlbGF0ZXMgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRvIGRvIHNvLCBVTUEncyBQcm9jZXNzIFBhY2thZ2UgcHJvdmlkZXMgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgcmVmbGVjdCB0aGUgaW5kdXN0cmllcyBiZXN0IHByYWN0aWNlcy4gIFRoaXMgc2VjdGlvbiBkZWZpbmVzIEJyZWFrZG93biBzdHJ1Y3R1cmUgbWV0YS1tb2RlbHMgdGhhdCBjb21wcmlzZSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgd2hpY2ggYXJlIGhpZ2hlciBsZXZlbCBncm91cGluZ3Mgb2Ygd29yayBjb21wcmlzaW5nIG9mIFRhc2tzIG9yIG90aGVyIEFjdGl2aXRpZXMgZGVmaW5pbmcgc2VxdWVuY2VzIGFuZCBjb25kaXRpb25zIG9uIFRhc2tzLiAgSW4gZmFjdCwgYSBwcm9jZXNzIGlzIGRlZmluZWQgYXMgYSBzcGVjaWFsIGtpbmQgb2YgQWN0aXZpdHkgaXRzZWxmLiAgVGhpcyBicmVha2Rvd24gc3RydWN0dXJlcyBtZXRhLW1vZGVsIGhhcyBiZWVuIGRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbmNyZXRlIGxpZmVjeWNsZSBtb2RlbHMgdGhlIHByb2Nlc3MgZW5naW5lZXIgd2FudHMgdG8gZXhwcmVzcyB3aXRoIHRoZW0uICBJbiBvdGhlciB3b3JkcyB0aGUgbWV0YS1tb2RlbCBpcyBhYmxlIHRvIHJlcHJlc2VudCAnZGlmZmVyZW50IHR5cGVzIG9mJyB3YXRlcmZhbGwgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgaXRlcmF0aXZlIG9yIGluY3JlbWVudGFsIHByb2Nlc3MgbW9kZWxzLiAgRmluYWxseSwgVU1BIGVuYWJsZXMgZGlmZmVyZW50IHR5cGUgb2YgcHJlc2VudGF0aW9ucyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMsIGFzIGlsbHVzdHJhdGVkIHdpdGggZXhhbXBsZSBpbiB0aGUgc2VjdGlvbnMgYmVsb3csIHN1Y2ggYXMgcHJvamVjdCBwbGFuLWxpa2Ugc3RydWN0dXJlZCBsaXN0LCB3b3JrZmxvdyBvciBhY3Rpdml0eSBkaWFncmFtcywgYW5kIHN0YXRpYyBzdHJ1Y3R1cmUgZGlhZ3JhbXMgc2hvdyBpbnB1dHMvb3V0cHV0cyB0byB3b3JrIGFzIHdlbGwgYXMgcGVyZm9ybWluZyByb2xlcy4gIFVNQSdzIFByb2Nlc3MgcGFja2FnZSBleHRlbmRzIHRoZSBjb25jZXB0cyBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIHRocm91Z2ggcGFja2FnZSBtZXJnZSBhcyBkZXBpY3RlZCBpbiB0aGUgZGlhZ3JhbS4gIEJyZWFrZG93biBtZXJnZXMgdGhlIHdob2xlIG9mIE1ldGhvZCBDb3JlIGJ5IG1lcmdpbmcgdGhlIE1ldGhvZCBQYWNrYWdlIHBhY2thZ2UuICBQcm9jZXNzIGlzIHNwZWNpZmllZCBpbiBVTUEgd2l0aCB0aGUgZm9sbG93aW5nIGZpdmUgcGFja2FnZXMuICBUaGUgQnJlYWtkb3duIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYnJlYWtkb3duIGVsZW1lbnRzIHRoYXQgZm9ybSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFByb2Nlc3MgVHlwZXMgZGVmaW5lIFByb2Nlc3NlcyBhcyBzcGVjaWFsIEFjdGl2aXRpZXMgKGRlZmluZWQgaW4gYnJlYWtkb3duIGVsZW1lbnRzKSBhbmQgaW50cm9kdWNlIGRpZmZlcmVudCB0eXBlcyBvZiBQcm9jZXNzZXMgc3VjaCBhcyBEZWxpdmVyeSBQcm9jZXNzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMuICBQcm9jZXNzIFBhY2thZ2UgcmVmaW5lcyB0aGUgTWV0aG9kIFBhY2thZ2UgY29uY2VwdHMgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSB3aXRoIG5ldyBwYWNrYWdlcyB0aGF0IG9yZ2FuaXplIHByb2Nlc3NlcyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBQcm9jZXNzIERlc2NyaXB0aW9ucyBwcm92aWRlcyBwcm9jZXNzIHNwZWNpZmljIGNvbnRlbnQgZGVzY3JpcHRpb25zIGV4dGVuZGluZyB0aGUgdGF4b25vbXkgYmFzZWQgb24gdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gY2xhc3MgZGVmaW5lZCBpbiBNZXRob2QgQ29yZS4gIEZpbmFsbHksIFdvcmtmbG93IGRlZmluZXMgaG93IHByb2Nlc3MgY2FuIGJlIGVuYWN0ZWQgYnkgcHJvdmlkaW5nIGV4dGVuZGVkIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFsbG93IGNyZWF0aW5nIG1vZGVscyBmaXQgZm9yIGluc3RhbnRpYXRpb24gb24gdGhlIE0wIGxldmVsLiAgSW4gb3RoZXIgd29yZHMsIGl0IHByb3ZpZGVzIGEgbWV0YS1zY2hlbWEgZm9yIHdvcmtmbG93IG1vZGVscyB0aGF0IGNhbiBydW4gaW4gYSB3b3JrZmxvdyBzaW11bGF0b3Igc3VjaCBhcyBJQk0gV2Vic3BoZXJlIEJ1c2luZXNzIEludGVncmF0aW9uIE1vZGVsZXIuJiN4QTsiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0R4bnlzT3hNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9EeExHd094TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9HX1V3c09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX1V3cHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55cy14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRHhueXRleE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRHhueXQteE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRHhueXR1eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9EeG55dE94TUVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0R4bnlzZXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0R4bnlzdXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzMsIDMyLCAtNiwgLTg1XSRbMTEsIDE1MCwgMiwgMzNdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRm9QV0VleE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0ZvUFdFT3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0dfZWhSLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfVXdzT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdGT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Gb1BXRnV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Gb1BXR094TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Gb1BXRi14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ZvUFdGZXhNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRm9QV0V1eE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRm9QV0UteE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMiwgMzIsIC04LCAtOTFdJFsxMSwgMTU1LCAxLCAzMl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9JWnRfTWV4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfSVp0X01PeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfR194Y1NlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19laFItZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X05PeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9OdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9PT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9OLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVp0X05leE1FZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9JWnRfTXV4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JWnRfTS14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9Ils4MSwgMTcsIC0xMjcsIC0xNF0kWzE1NywgNjMsIC01MSwgMzJdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfcjBWUklleGhFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX3IwVlJJT3hoRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0dfbnJRdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfeGNTZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJKT3hoRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yMFZSSnV4aEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yMFZSS094aEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yMFZSSi14aEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3IwVlJKZXhoRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfcjBWUkl1eGhFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfcjBWUkkteGhFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTY4LCAzLCAzNDAsIC0yMF0kWy0zMjgsIDE4LCA4MCwgLTVdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1RjUwOTAyMDYiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNaZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR194Y2FlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjYnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjY09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjY3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y2RPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfeGNadWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX3hjWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTIxNiIgeT0iMzE3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOTk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05OZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05PZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05PLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05QZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOUC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183Tk1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05NdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4NzYiIHk9IjE4MDk1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05TZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05TLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05UZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TlFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05RdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMTA3IiB5PSIxODAyNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TlZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05XT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOV2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOWGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05VZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTg1MCIgeT0iMTgwNjkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05aT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05adWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05iLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tll1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM2MSIgeT0iODc3MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05jT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TmRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05lT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05mT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05mdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05jZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTAxIiB5PSI4Nzc5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOaE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05pZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tml1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05pLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05qZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tmp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOai1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TmdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05ndWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MjMiIHk9IjExMDM4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdObmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05vdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05wT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05wdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOcU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183Tm11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05tLWZYRWR1cUhvT0piVVJaUnciIHg9IjIzMzciIHk9IjExMDM4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOdHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN050LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN051LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN052ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN052LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOd2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TnMtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN050T2ZYRWR1cUhvT0piVVJaUnciIHg9IjkzMDQiIHk9IjEzNDAyIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tnd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOeHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN054LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN055LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN056ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tnp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN056LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TjBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOMGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TnctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN054T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwMzIwIiB5PSIxMTA2NSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWEpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYS2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYTGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWEwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhJZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg0NCIgeT0iMTM0MDIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhOT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWE9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWE8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhQLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWE11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjg5MSIgeT0iMTEwMzgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzNzYiIHk9IjE1NjgwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYYi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhkT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhkdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhlT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYZXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWGJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhiZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMDEzIiB5PSIxMTA2NSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhqZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWGtlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NDEiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWG5PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhqdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYai1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3NiIgeT0iMTM0MDIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDU1IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh2dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWHNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI4MjciIHk9IjY0MzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVh3LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSUllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSUktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lKZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYd09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWHdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODkyMyIgeT0iNjQzNCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSVBPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5NDYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSVItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0lPZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JT3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM0NCIgeT0iNDE1NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0ladWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSVotZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JYk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0liZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JYnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0liLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JY09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0ljZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0laT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JWmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjAzNSIgeT0iODc3OSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSWdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0loT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lpT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0lmZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NDgzIiB5PSI4Nzc5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9Ja09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Ja3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lsLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ltZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JbS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSWplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lqdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NzQzIiB5PSI2NDM0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JemVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0kwdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0kxT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0kxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JMk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSXl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0l5LWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDIyIiB5PSIyMTc1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dvT2U3dWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgdGhlIHRheG9ub215IG9mIGFsbCB0aGUgbWFpbiBjbGFzc2VzIG9mIHRoZSBQcm9jZXNzIHBhY2thZ2UuIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HXzdOa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HXzdOZ09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TmxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HXzdOa2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HXzdOa3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjAsIC01MjQsIC0yMjg2LCAxNzYxXSRbMjI1MiwgLTE3NjEsIC02OTQsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdObC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdObU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HXzdOcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HXzdObWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TnJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HXzdOcXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HXzdOcS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQzLCAtNTMzLCA0NjUsIDE3NTJdJFstNDc0LCAtMTc2MSwgMTM1LCA1MjRdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR183TnNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR183TnNlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWFVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgc291cmNlPSJfR183Tk1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWFFPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWFVlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWFV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE0MywgLTUyNCwgLTQwODksIDE4MTFdJFs0MDM4LCAtMTgxMSwgLTExOTMsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYV2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HXzdOUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYV3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYVy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0NDgsIC01MjQsIC0xNTgzLCAxODExXSRbMTU2NiwgLTE4MTEsIC00NjUsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYWU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYWWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYWXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhFIiBzb3VyY2U9Il9HXzdOVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYWS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYWk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDU3LCAtNTI0LCAxNTc0LCAxODExXSRbLTE1NzQsIC0xODExLCA0NTcsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYYWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYYXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYZS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HXzdOc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWGYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYZk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYZmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4MTIsIC01MjQsIC0yODk1LCAxODExXSRbMjg3MCwgLTE4MjAsIC04MzgsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYZ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYZy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYaE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9IQUVYSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWGlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYaGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYaHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNDUsIC01MjQsIC05MjIsIDE4MTFdJFs4OTcsIC0xODIwLCAtMjcwLCA1MTZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWG5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfSEFFWFFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWGplZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWG51ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWG4tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUzMywgMCwgMTc1Ml0kWzAsIC0xNzY5LCAwLCA1MTZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWHBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWHBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSUp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfR183TllPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWHYtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSUotZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSUtPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE1OSwgLTQ1NywgLTQ5MzYsIDE4NzldJFs0NzA3LCAtMTgxMSwgLTEzODgsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JTC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HXzdOY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSU0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JTU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JTWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NzgsIC01MjQsIC0yNzc3LCAxODExXSRbMjc0MywgLTE4MTEsIC04MTIsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JU09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBzb3VyY2U9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JU2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JU3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MjgsIC01MzMsIC0yNDcyLCAxNzUyXSRbMjQ0NiwgLTE3NjksIC03NTMsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JVC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JVU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JVWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VFRjkwMEUyIiBzb3VyY2U9Il9IQUVYci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JVXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JVS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTMzLCAwLCAxNzUyXSRbMCwgLTE3NjksIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JV2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JV3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9IQUVYTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JVy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JWE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTM5LCAtNTI0LCAzMjI1LCAxNzYxXSRbLTMxOTEsIC0xNzYxLCA5NzMsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JWWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JWXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JYy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JWS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSWQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JZE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JZGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4MjEsIC01MjQsIC0yODg3LCAxNzYxXSRbMjgzNiwgLTE3NjksIC04NzIsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JZXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JZS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9Jbk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VENkQwMDg4IiBzb3VyY2U9Il9IQU9Jak9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSW9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JbmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JbnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjM1LCAtNTMzLCAyMTA4LCAxNzUyXSRbLTIxMjUsIC0xNzY5LCA2MTgsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9Jby1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JcGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JcHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JcC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODA0LCAtNTI0LCAyNzUxLCAxNzYxXSRbLTI3NDMsIC0xNzY5LCA4MTIsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9Jck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JcnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9IQUVYTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9Jci1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9Jc09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0MzEsIC01MjQsIC0xNDk4LCAxNzYxXSRbMTQ4MSwgLTE3NjksIC00NDgsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JdGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JdHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JdC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JdU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JdWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxODExXSRbMCwgLTE4MTEsIDAsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JdnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9Jdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9Jd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBzb3VyY2U9Il9IQU9JWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX3hjWmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9Jd2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9Jd3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTIsIC0zMTgsIDE4NTMsIDgxNzVdJFsyMTIsIC0zODM3LCAxODUzLCA0NjU2XSRbLTE1MDgsIC04MTc2LCAxMzMsIDMxN10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JeC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuODcwMDMyNTUsMC40NjU0MDg4KSIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBWDVJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIHNvdXJjZT0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0l5ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQVg1Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBWDVJZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBWDVJdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE0NTZdJFswLCAtMTQ2NCwgMCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVKLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVLT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBWDVLZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0hBT0l5ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfeGNaZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1TC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQVg1TGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBWDVLdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBWDVLLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUyNCwgLTUyNCwgLTE0MDUsIDEzNTRdJFsxMzgwLCAtMTM1NCwgLTU1MCwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVNT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVNZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBWDVNdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0dfN053dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1T09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQVg1TnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBWDVNLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBWDVOT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMsIC01MjQsIDY2MCwgMTc2MV0kWy02NzcsIC0xNzY5LCAxODYsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1T2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1T3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4IiBuYW1lPSJCcmVha2Rvd24iPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0drOUlnT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRjA1RUNEMDM5MCI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNUVDRDAzOTAiIHR5cGU9IkNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMU1qNU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjA4MiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFNajZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFNajYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFNajdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxTWo3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzFNajRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFNajR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODkwMiIgeT0iNjMwMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMU1qOU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQ3MCIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0ME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQxT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0MnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cxTWo4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMU1qOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NTA1IiB5PSIxMTIyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0Mi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMVZ0My1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQ2dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzFWdDNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFWdDNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjk3MyIgeT0iODczNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMThLMWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEsydWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEszT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEszZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEszdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEszLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLNE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cxOEswdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLMC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjI5IiB5PSIxMTIyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMThLNWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4Szd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEs4T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzE4SzR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzE4SzQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQ4NiIgeT0iODczNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlVzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMkZVdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjI2OSIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJGVXNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzODEiIHk9IjYzMDEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJGVXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyRlV3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlV3dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzYyIiB5PSI4NzM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlVfT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyRlZBT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZDLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJGVV9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlVfdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMTAyIiB5PSIxMTIyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMlBGOU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRi1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRi1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRi11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRi0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRl9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRl91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJQRjhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQRjh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTczNyIgeT0iNjQwNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMlBHQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdDZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdDLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdEZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBHRC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyUEdBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEdBdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0NDQiIHk9IjI2MzUiIHdpZHRoPSIzODU5IiBoZWlnaHQ9IjEyMTkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJZM0ZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5NDYiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUFvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUFvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUFwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBcC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyWTNFdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTNFLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk2ODkiIHk9Ijk2NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMmlBenVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUEyZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJpQXktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJpQXpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY2MyIgeT0iMzcxMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMnJ5SU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTg2MiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlLLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJyeUhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkwMCIgeT0iNTY0MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2s5SWd1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBCcmVha2Rvd24gcGFja2FnZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBicmVha2Rvd24gZWxlbWVudHMgdGhhdCBmb3JtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlIGRpYWdyYW0gc2hvd3MgdGhlIHRheG9ub215IG9mIHRoZSBtYWluIGNsYXNzZXMuICBJdCBwcmVzZW50IHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdHkgYW5kIERlc2NyaXB0b3IgYXMgd2VsbCBhcyB0aGVpciBrZXkgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzFWdDYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzFWdDItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0N3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0OE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFWdDctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzFWdDdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzFWdDdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUyLCAtNDU3LCAwLCAyMDgyXSRbMTUyLCAtMjA5MSwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzFWdDh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMVZ0OC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzF5WndPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyIgc291cmNlPSJfRzFNajhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFWdDItZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlady1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzF5WnhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTAiIHk9IjQ1NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5Wnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaeS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzAiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVp6dWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NiIgeT0iMjEyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaMGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NCIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLeE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEt3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLeU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEt4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEt6T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEswT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzF5WndlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzF5Wnd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU1OCwgLTUwLCAxOTMwXSRbMCwgLTIwNDAsIC01MCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMThLOGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HMThLMGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMThLNGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Sy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEstZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0OCIgeT0iNDUwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEtfT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03MiIgeT0iLTM0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S191ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S18tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc2IiB5PSIyMDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExBdWZYRWR1cUhvT0piVVJaUnciIHg9IjU5IiB5PSItMzQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOExCLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TEJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOExDLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TENlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4TEQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMRGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4TEUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMThLOHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMThLOC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzIsIC01NTgsIC02NDMsIDE5MzBdJFszNzIsIC0yMDQ4LCAtNjQzLCA0NDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyRlUwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlUxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyRlUwZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJGVTB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU4NCwgLTQ1NywgMjcxNywgMjA4Ml0kWy0yNzE3LCAtMjA5MSwgNTg0LCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMkZVMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyRlUyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMkZVMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBzb3VyY2U9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMkZVc09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg0IiB5PSItMTM1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgzIiB5PSIxMTA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVNS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzY4IiB5PSItMTM1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVNnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iLTM0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVNy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVOC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlU5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlUtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVS1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJGVTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJGVTItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzM2LCAtNDQ4LCAtNTMzLCAyMDkxXSRbNzM2LCAtMjA5MSwgLTUzMywgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMkZWRE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HMkZVX09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZWRU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2NCIgeT0iNDA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZGLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NCIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3IiB5PSIxOTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZIZWZYRWR1cUhvT0piVVJaUnciIHg9IjU5IiB5PSItMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZJdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVklPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZKdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWS09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRnMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMkZWRGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMkZWRHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjQ1LCAtNTY3LCA2MTgsIDE5MjFdJFstMjQ1LCAtMjA0OCwgNjE4LCA0NDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyUEdFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyUEY4T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEdGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjMzOCIgeT0iLTc3MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBHR09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM4IiB5PSItMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQR0ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQzIiB5PSIyMzciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEdIdWZYRWR1cUhvT0piVVJaUnciIHg9IjUzOSIgeT0iLTQ1NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NSIgeT0iLTEyNTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMnR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkydE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMnV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkydU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkydnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ2T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyd3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyUEdFZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyUEdFdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzE4LCAzODEsIDE5MzgsIC0zMTI0XSRbLTQxMDYsIDM4MSwgLTQ0OCwgLTMxMjRdJFstNDEwNiwgMzA1NiwgLTQ0OCwgLTQ0OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJZMnctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZMngtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJZMnhPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlkyeGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTIsIC00NTcsIC0xMDY2LCAzMDQ4XSRbOTk5LCAtMjg5NSwgLTIyMCwgNjA5XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZMnl1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyeS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJZMnpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzJGVXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZMjBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJZMnplZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlkyenVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDQwLCAtNDU3LCAyOTEyLCAzMDQ4XSRbLTI3NjgsIC0yODk1LCA1ODQsIDYwOV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTIwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZMjFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyWTNDT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0cxOEs0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTNET2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyWTNDZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJZM0N1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjE4LCAtNDU3LCAtMjk4OCwgMjA4Ml0kWzI5NDYsIC0yMDkxLCAtNjYwLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkzRC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTNFT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMmlBcU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBzb3VyY2U9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMmlBck9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMmlBcWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyaUFxdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC02MTgsIDAsIDEyMTBdJFswLCAtMTM4MCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJpQXItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMmlBc09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeHRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeHVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeHRlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4dHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM3LCAtNDU3LCAyMzAyLCA0NjczXSRbLTIzMjgsIC00NjgyLCAyMTEsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnh1LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnh2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnh3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnh2dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnh2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkxNCwgLTQ0OCwgLTY0NTEsIDQ2NV0kWzkxNCwgLTEyNzgsIC02NDUxLCAtMzY0XSRbNTY0NywgLTEyNzgsIC0xNzE4LCAtMzY0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4eGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeDMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzJQRjhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeDQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeDRPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4NGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjQzLCAtNDU3LCAzMDY0LCAyMTMzXSRbLTMwNzMsIC0yMTQyLCA2MzUsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycng1dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnlMT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0cycnlIT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaW91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnlMZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeUx1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIwLCAtNDU3LCAtNzQ1LCAxNDczXSRbNzI4LCAtMTQ4MSwgLTIzNywgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzIxaXBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMjFpcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfUUtVS0lNVkhFZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iX1FGMmc0TVZIRWR5Mm11UTJQUXZIX0EiIHNvdXJjZT0iX0cycnlIT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxVnQyLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtVS0k4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtVS0pjVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLSnNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUUtVS0pNVkhFZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtVS0o4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX1FHU2x3c1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLS2NWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUUtVS0tNVkhFZHkybXVRMlBRdkhfQSIgeD0iLTI2NSIgeT0iLTI2NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtVS0tzVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9RR1Nsd3NWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtVS0xNVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RS1VLSzhWSEVkeTJtdVEyUFF2SF9BIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLTGNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9RRjJnNGNWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtVS0w4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUUtVS0xzVkhFZHkybXVRMlBRdkhfQSIgeD0iMzE3IiB5PSIzNDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1FLVUtNTVZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9RRjJnNGNWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtVS01zVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1FLVUtNY1ZIRWR5Mm11UTJQUXZIX0EiIHg9Ii05MDAiIHk9IjUyOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtkN0lNVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX1FHU2x3c1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS2Q3SXNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUUtkN0k4VkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RS2Q3SWNWSEVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS2Q3Sk1WSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9RRjJnNGNWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtkN0pzVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1FLZDdKOFZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUUtkN0pjVkhFZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtkN0tNVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9RR1Nsd3NWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtkN0tzVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1FLZDdLOFZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUUtkN0tjVkhFZHkybXVRMlBRdkhfQSIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtkN0xNVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX1FGMmc0Y1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS2Q3THNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9RS2Q3TDhWSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1FLZDdMY1ZIRWR5Mm11UTJQUXZIX0EiIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1FLVUtJY1ZIRWR5Mm11UTJQUXZIX0EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBqdW1wTGlua1N0YXR1cz0iQWxsIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1FLVUtJc1ZIRWR5Mm11UTJQUXZIX0EiIHBvaW50cz0iWy0xMzIsIDMxNywgLTU2MDksIC0zMDk2XSRbLTEzMiwgMTk4NCwgLTU2MDksIC0xNDI5XSRbNjE2NSwgMTk4NCwgNjg4LCAtMTQyOV0kWzYxNjUsIDI3NzgsIDY4OCwgLTYzNV0iLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1hRODFvTVZIRWR5Mm11UTJQUXZIX0EiIGlkPSIoMC4zMzU4MDc0NywwLjk0ODExMzIpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1QzUxMzAyMDMiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpcC1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ie0l0ZXJhdGlvbi5wcmVmaXggPSAmcXVvdDtJdGVyYXRpb24mcXVvdDt9JiN4QTsiIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwOTIxIiB5PSIxMzg1OSIgd2lkdGg9IjMxNzUiIGhlaWdodD0iMTI0NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpck9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ie1BoYXNlLnByZWZpeCA9ICZxdW90O1BoYXNlJnF1b3Q7fSYjeEE7IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpcmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc1NCIgeT0iMTM4NTkiIHdpZHRoPSIyODAyIiBoZWlnaHQ9IjEyNDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzIxaXRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMjFpdWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMjFpdS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMjFpdmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzIxaXYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTU4MSIgeT0iMTIwNTYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzIxaXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1za3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zay1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zbC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc21lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTE1MSIgeT0iMTIxMDciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc211ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzItc251ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc24tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zby1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zbS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zbk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzc3NSIgeT0iODE0NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zcnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN0ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zdWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXNxLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXNyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0MTkwIiB5PSIxMzkzNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zdnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN4ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zeWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXN1LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXN2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzUxIiB5PSIxMTcwMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zN2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zOGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXMtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXMtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zX09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXM3dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXM3LWZYRWR1cUhvT0piVVJaUnciIHg9IjExNjU4IiB5PSI3MDI3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNfZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MDA1NzAyNzYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czSWRrZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRW51bWVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRsLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRtZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItc191ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc18tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTQ1OSIgeT0iMTIzNDciIHdpZHRoPSIzMjM0IiBoZWlnaHQ9IjI3MTYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNSbmktZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1Jua09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jua2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1Jua3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JubE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JubGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbmx1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM1JuaU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JuaWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTEyNiIgeT0iODEzNiIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMjExNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM1JucmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm51T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzNSbnF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5xLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2ODE0IiB5PSIxODg4IiB3aWR0aD0iNzUyNiIgaGVpZ2h0PSIyODI3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czYll3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM2JZdnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2JZdi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzYwIiB5PSIxMDM2MyIgd2lkdGg9IjcyMzAiIGhlaWdodD0iMTUyNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM2JZMGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlkzT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzNiWXp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYll6LWZYRWR1cUhvT0piVVJaUnciIHg9IjU2NjQiIHk9IjM3NTAiIHdpZHRoPSI1OTQzIiBoZWlnaHQ9IjIzNTMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsR1NZZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHZpZXcgb24gQnJlYWtkb3duIEVsZW1lbnRzIGZyb20gYSB3b3JrIGJyZWFrZG93biBwZXJzcGVjdGl2ZSBjYWxsZWQgV0JTIChXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUpIHRoYXQgaW5jbHVkZXMgVGFza3MgYW5kIEFjdGl2aXRpZXMgKGJ1dCBhbHNvIHRoZSBub3Rpb24gb2YgTWlsZXN0b25lcyB0aGF0IGRvIG5vdCByZXByZXNlbnQgd29yaykuICBVTUEgYWxzbyBkZWZpbmVzIHR3byBtb3JlIHZpZXdzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYXMgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgYW5kIFRlYW0gUHJvZmlsZSBCcmVha2Rvd24gU3RydWN0dXJlLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyLXN5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiIHNvdXJjZT0iX0cyLXNxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyLXN1dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXN6dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ0IiB5PSI0MDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwMyIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNSIgeT0iMjExIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OCIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zNE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zNU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXM0dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM3T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzItc3ktZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzItc3pPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMzLCAtNTU4LCAxNiwgMjU5MF0kWy0zMywgLTI2NTgsIDE2LCA0OTFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czSWRuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9HMjFpcS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czSWRuZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czSWRudWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC02MjYsIDAsIDEyNTNdJFswLCAtMTM4OCwgMCwgNDkxXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuZ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0cyMWlwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyMWlzT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbmctZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbmhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI1LCAtNjI2LCAyNSwgMTMwM10kWy00MiwgLTE0MzksIDgsIDQ5MV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5oZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm5sLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0cyMWlzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JubmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5tLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm5tT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbm1lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI4NywgLTQ5OSwgMTY0MiwgMjg1M10kWy0xMzI5LCAtMjI5NCwgNjAxLCAxMDU4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbm51ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1Jubi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbm9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzIxaXdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5wdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbnBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbm9lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1Jub3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODYsIC00OTksIC0xMTg1LCAyOTA0XSRbOTM5LCAtMjM0NSwgLTQzMSwgMTA1OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5wLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbnFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm51ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiIHNvdXJjZT0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Judi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbnZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ4IiB5PSItMjc4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm53dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1Jud2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjQiIHk9Ii01NzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm53LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm54ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbnhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0OSIgeT0iLTUwNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbngtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1NiIgeT0iLTI0MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm55LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JueXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ1IiB5PSIzMzQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm56T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbjAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JuMS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm4xZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JuMi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm4yZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm51dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm51LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3NTcsIC02NjIsIDM3NTcsIC02NjJdJFs2MTM4LCAtNjYyLCA2MTM4LCAtNjYyXSRbNjEzOCwgLTIzMjksIDYxMzgsIC0yMzI5XSRbNTAyLCAtMjMyOSwgNTAyLCAtMjMyOV0kWzUwMiwgLTE0MjksIDUwMiwgLTE0MjldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm4zT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0cyLXNtdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm40T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm4zZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbjN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTE2LCAtNDk5LCAtNTI3NCwgNDgzNF0kWzQyMzMsIC0zOTIwLCAtMTU1NywgMTQxM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm40LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbjVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm41ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbjZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc2MyIgeT0iOTIzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm43ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjg0IiB5PSIzMzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjI5IiB5PSItMjcwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDEwIiB5PSItMjU0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllpT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyMyIgeT0iMjYyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllqZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllrZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWWxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWW1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1JuNXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JuNS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzU3LCA4MjAsIDM4MTAsIC01MDU0XSRbNjgyNiwgODIwLCA2ODc5LCAtNTA1NF0kWzY4MjYsIDU3OTQsIDY4NzksIC04MF0kWzEzNDksIDU3OTQsIDE0MDIsIC04MF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNiWW11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSIgc291cmNlPSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNiWW51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ5IiB5PSI1NDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1MyIgeT0iNTMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllxLWZYRWR1cUhvT0piVVJaUnciIHg9IjQyOCIgeT0iLTMyNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZc09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZdE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNiWW0tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNiWW5PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM3NTcsIC03NjcsIC0zNzU3LCAtNzY3XSRbLTUxMDcsIC03NjcsIC01MTA3LCAtNzY3XSRbLTUxMDcsIC0yMzI5LCAtNTEwNywgLTIzMjldJFstODQ3LCAtMjMyOSwgLTg0NywgLTIzMjldJFstODQ3LCAtMTQyOSwgLTg0NywgLTE0MjldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czYlkzZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiIHNvdXJjZT0iX0czYll2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYlk0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2NiIgeT0iMTQ0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1OCIgeT0iLTE2MjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk2LWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MCIgeT0iMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk3dWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MyIgeT0iLTUwOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZOC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZOS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlktLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWS1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWV9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNiWTN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNiWTMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExODUsIC03NjIsIC0xODQ1LCA1NDM1XSRbLTExODUsIC01MDIwLCAtMTg0NSwgMTE3Nl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSmdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCIgc291cmNlPSJfRzNiWXZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKaE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NTAiIHk9IjEwMjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2OCIgeT0iLTE3NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEppLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMzQiIHk9IjE3NzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEpqdWZYRWR1cUhvT0piVVJaUnciIHg9IjE5NCIgeT0iLTE1NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEprdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjkiIHk9IjYzMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2xKbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEpsT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEptZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2xKbXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEptT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEptLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEpudWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSm5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEpvdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSm9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSmdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSmd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzk3LCAtNzYyLCAtMjYyLCA1NDM1XSRbMzk3LCAtNTAyOSwgLTI2MiwgMTE2OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSm8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzItc3V1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzItc211ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC00OTksIC0yNSwgMzA1Nl0kWzI1LCAtMzA3MywgLTI1LCA0ODJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKcXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEpxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKc09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKcmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEpydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MTQsIC00OTksIDU2ODEsIDY3NjRdJFstNTEwNSwgLTYwODcsIDk5MCwgMTE3Nl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEpzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czbEp0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEp1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czbEp0dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0MDUsIC01MTYsIDEwNDgxLCAzNzUwXSRbLTg5MTUsIC0zMjAwLCAyOTcxLCAxMDY2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKdmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSnZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnYtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKd09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyOTcxLCAtNDA2LCAtODk2NiwgMTIxOV0kWzgxNzAsIC0xMTE3LCAtMzc2NywgNTA4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKeHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSngtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzItczdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnlPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKeWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzUzLCAtNDk5LCAzMjA4LCAyMDkxXSRbLTIxNTksIC0xNDEzLCAxODAzLCAxMTc2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVGMUU4MDI4MyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRlYW1CcmVha2Rvd25TdHJ1Y3R1cmUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0czdVRjZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ7Um9sZURlc2NyaXB0b3IubW9kaWZpZXMgPSBSb2xlLnBlcmZvcm1zQXNPd25lci5vdXRwdXQgdW5pb24gUm9sZS5wZXJmb3Jtc0FkZGl0aW9uYWxseS5vdXRwdXQgdW5pb24gUm9sZS5hc3Npc3RzSW4ub3V0cHV0fSIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VGN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA3MjYiIHk9IjE3MzcwIiB3aWR0aD0iNjE0NyIgaGVpZ2h0PSIxODUyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czdVRlZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRoT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzN1VGR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VGQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ5NzciIHk9Ijg4OTAiIHdpZHRoPSIyODYxIiBoZWlnaHQ9IjE3MzUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzN1VGllZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9Ijc1ODYiIGhlaWdodD0iMjY0MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRqdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRrT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRrdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUbE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czdVRodWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVRoLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5OTIiIHk9IjQwNjQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzM0RWplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVrdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVsT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVsdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFbU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czNEVpdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEVpLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NzA1IiB5PSIxMjk1NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMzRFcHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFc2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czNEVvLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEVwT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY2OTciIHk9Ijg1NTkiIHdpZHRoPSIyNzMyIiBoZWlnaHQ9IjIxODQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRCMWZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxaE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxaHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxaC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMWlPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNEIxZXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzI2IiB5PSIxMzIxNiIgd2lkdGg9IjMxNDYiIGhlaWdodD0iMjQyOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNEIyQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjJDZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjJDLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19ZZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfWS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0QjJBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjJBdWZYRWR1cUhvT0piVVJaUnciIHg9IjExMDAiIHk9IjE1NjI5IiB3aWR0aD0iMzc5MyIgaGVpZ2h0PSIxMDU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19aT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0S19hT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2JlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2ItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2NlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19jLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRLX1plZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRLX1p1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDEzMSIgeT0iMTczMzEiIHdpZHRoPSI0MjMzIiBoZWlnaHQ9IjEzMDMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsR1NZLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHZpZXcgb24gYSBwcm9jZXNzIGZyb20gYSBUZWFtIGFuZCBSb2xlIHBlcnNwZWN0aXZlIGNhbGxlZCBUQlMgKFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSkuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzN1VGxlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgc291cmNlPSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VG1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUbmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzc4IiB5PSIzODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VG9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ5NSIgeT0iMzk5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUby1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA1MyIgeT0iMTkyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRwdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzUiIHk9Ii0yNzQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VHEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VHItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUcmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUdC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVR0ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czdVRsdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czdVRsLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNzI1LCAtMjYsIC0yNzI1LCAtMjZdJFstNTY4OCwgLTI2LCAtNTY4OCwgLTI2XSRbLTU2ODgsIC0yOTM3LCAtNTY4OCwgLTI5MzddJFstMTU4NywgLTI5MzcsIC0xNTg3LCAtMjkzN10kWy0xNTg3LCAtMTA1OCwgLTE1ODcsIC0xMDU4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM3VUdU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HM3VUZGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUdk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM3VUdWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czdVR1dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzEsIC04NzIsIDM2OTEsIDM0OTZdJFstMzIzNCwgLTMwNDgsIDEzODgsIDEzMjBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM3VUdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czdVR3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM3VUd2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVR5ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NDUiIHk9Ii00MjciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVjT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5MCIgeT0iMjg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA1OSIgeT0iLTIwNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzUiIHk9IjIyMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFZk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFZ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVmdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVoT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVpT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzN1VHd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzN1VHctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjY5OSwgLTI2LCAyNjk5LCAtMjZdJFs1ODc0LCAtMjYsIDU4NzQsIC0yNl0kWzU4NzQsIC0yOTYzLCA1ODc0LCAtMjk2M10kWzE0MDIsIC0yOTYzLCAxNDAyLCAtMjk2M10kWzE0MDIsIC0xMDU4LCAxNDAyLCAtMTA1OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzM0RW1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzM0RWllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGRlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzM0RW5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzM0RW11ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzM0RW0tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMxMywgLTg3MiwgMTEwOSwgMzE5MV0kWy0xMTM0LCAtMzIwMCwgMjg3LCA4NjNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMzRFb09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czNEVvZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMzRFc3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBzb3VyY2U9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMzRFdHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV1dWZYRWR1cUhvT0piVVJaUnciIHg9IjQzNiIgeT0iMjM4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcxNCIgeT0iLTMzMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM2MCIgeT0iMjQyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV3LWZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSItMjg4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEV5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEV6T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RTBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFenVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RTFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFMHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMzRFcy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMzRFdE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE3NiwgNDIsIC0xMTc2LCA0Ml0kWy0yNTczLCA0MiwgLTI1NzMsIDQyXSRbLTI1NzMsIC0xNzYxLCAtMjU3MywgLTE3NjFdJFstNTAsIC0xNzYxLCAtNTAsIC0xNzYxXSRbLTUwLCAtMTA5MiwgLTUwLCAtMTA5Ml0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzM0RW91ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMWNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxY3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5OTksIC0xMTAwLCAtMjkxMiwgMzE2Nl0kWzI2ODMsIC0yOTQ2LCAtMTIyNywgMTMyMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjFkLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMWVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjFpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMWplZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTciIHk9Ii0zMjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMWtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY3MiIgeT0iLTE5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFsT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NyIgeT0iMjkzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjQiIHk9Ii0xODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMW11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0NiIgeT0iMzM4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFuLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMW5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMW9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxaXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxaS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzk3LCAtOTU2LCAtODk2NiwgLTM0N10kWzgyMzgsIC05NTYsIC0yMTI1LCAtMzQ3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIiBzb3VyY2U9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMzRFaWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjFzT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01MzciIHk9Ii0xOTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg2OCIgeT0iLTM3NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTAiIHk9Ii0zODEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF1dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzgiIHk9IjE1OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzM3IiB5PSItOTczIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjF3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjF4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxek9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxcmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxcnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MywgMTIxMCwgLTEwMjcwLCAxODIwXSRbOTMsIDIwNTcsIC0xMDI3MCwgMjY2N10kWzkyNzksIDIwNTcsIC0xMDgzLCAyNjY3XSRbOTI3OSwgMjU0LCAtMTA4MywgODYzXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfRzN1VGNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRCMXJPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxME9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxMGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODcyLCAtMTE1OSwgMTAyNCwgMTM1NF0kWy0xODk2LCAtMjUxNCwgMCwgMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjEwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjExT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjEyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjExZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMTF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTAzMiwgLTEyMTksIC03OTA3LCAzNDU0XSRbNDAyMSwgLTQ2NTYsIC00OTE5LCAxNl0kWzc1MDEsIC00NjczLCAtMTQzOSwgMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjEyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjEzZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjE0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY2IiB5PSIyNzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODMiIHk9Ii0xMTA5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkwIiB5PSIyNzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE3dWZYRWR1cUhvT0piVVJaUnciIHg9IjExNiIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxOC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxOS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjEtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjEtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMS1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMV9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMTN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMTMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMsIC0xMjEwLCAtMzEzLCAzNTY0XSRbOTMsIC0zNjgzLCAtMzEzLCAxMDkyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEtfZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HNEtfWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEtfZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19mT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIxMCIgeT0iLTM3NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItODAiIHk9Ii0zNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19ndWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTMiIHk9Ii0zNjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19oT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19oZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg0IiB5PSItMzM5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19pdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2lPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19qdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2t1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfa09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2x1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEtfZGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEtfZHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjAsIC02NjAsIC05OTksIDI4OTVdJFs3ODcsIC0yMzQ1LCAtNDMxLCAxMjEwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEtfbC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIiBzb3VyY2U9Il9HNEIyQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEtfWk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX25lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEtfbS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19uLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjQiIHk9Ii0yNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19vZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX291ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY1IiB5PSIzNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19wdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19wZWZYRWR1cUhvT0piVVJaUnciIHg9IjIzNiIgeT0iLTI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA5MyIgeT0iMzgxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19yZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19zZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3VlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfdC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEtfbU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEtfbWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTA4LCA1MjQsIC0zNzU5LCAtMTMwM10kWy01MDgsIDE5MTMsIC0zNzU5LCA4NF0kWzExMzQsIDE5MTMsIC0yMTE2LCA4NF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRLX3V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjk0QUI5MDAxNSIgc291cmNlPSJfRzRCMkFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S193T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRLX3Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRLX3UtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEtfdk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzQ2LCAtNTMzLCAtMzEyNCwgMTE5M10kWzMwNjQsIC0xMTkzLCAtMTQwNSwgNTMzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRLX3dlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEtfd3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVDMzBGMDAyNiIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0QnJlYWtkb3duU3RydWN0dXJlIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3WU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNFV3Wk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Wi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdhZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdhLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdiZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3Yi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0VXdZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXdZdWZYRWR1cUhvT0piVVJaUnciIHg9IjYzNjYiIHk9IjU5MjMiIGhlaWdodD0iOTU0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdjT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0VXdkT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2VlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2UtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2ZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdmLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRVd2NlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjE4OSIgeT0iMTM2OTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Zy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRVd2hPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdpZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdpLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdqZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3ai1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0VXdnZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXdndWZYRWR1cUhvT0piVVJaUnciIHg9IjUxNDMiIHk9IjEwMzI5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZlZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0ZDZmZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZpT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRkNmV1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNmUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUwODciIHk9IjEzMTgyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0ZDZ1ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI3MzY2IiBoZWlnaHQ9IjI0MzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2dnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2di1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2d09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2d2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2d3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNnhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNGQ2dHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2dC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzMzIiB5PSIyMzg3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BSUVRTVZIRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVE4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX25BSUVSTVZIRWR5Mm11UTJQUXZIX0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BSUVSY1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BSUVSc1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BSUVSOFZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVNNVkhFZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbkFJRVNjVkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVNzVkhFZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbkFJRVM4VkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVRNVkhFZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbkFJRVRjVkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVRzVkhFZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX25BSUVUOFZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfbkFJRVFjVkhFZHkybXVRMlBRdkhfQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbkFJRVFzVkhFZHkybXVRMlBRdkhfQSIgeD0iMTI0MyIgeT0iMTMzNjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsUURZZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHZpZXcgb24gYSBwcm9jZXNzIGZyb20gYSBXb3JrIFByb2R1Y3QgcGVyc3BlY3RpdmUgY2FsbGVkIFdQQlMgKFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlKS4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNFV3a09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXdsT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDgyIiB5PSIyNDIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd21PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5OCIgeT0iLTI5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdtLWZYRWR1cUhvT0piVVJaUnciIHg9IjMxIiB5PSIyODEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXduZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXduLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdudWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NjEiIHk9Ii05OTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd29lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTk3IiB5PSItNzYxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3by1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdwdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3BPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3J1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3ck9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3N1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3c09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNFV3a2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNFV3a3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTgyMCwgLTg0NiwgLTE4MjAsIC04NDZdJFstMTgyMCwgLTE5NzIsIC0xODIwLCAtMTk3Ml0kWy02MTg5LCAtMTk3MiwgLTYxODksIC0xOTcyXSRbLTYxODksIDAsIC02MTg5LCAwXSRbLTIxOTIsIDAsIC0yMTkyLCAwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNFV3cy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBzb3VyY2U9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXd0LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTgiIHk9IjMwMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3dS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkxIiB5PSItMzA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUwNSIgeT0iMjk1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3d2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUyOCIgeT0iMjkxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd4T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03NjAiIHk9Ii0yNTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3eC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3eS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3enVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXcwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3MGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd6LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXcwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3MWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXcwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0VXd0T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0VXd0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMjIsIC0yMTEsIDIyMjIsIC0yMTFdJFs1OTgwLCAtMjExLCA1OTgwLCAtMjExXSRbNTk4MCwgLTIwODcsIDU5ODAsIC0yMDg3XSRbOTUyLCAtMjA4NywgOTUyLCAtMjA4N10kWzk1MiwgLTY4OCwgOTUyLCAtNjg4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNFV3MXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3WU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2VWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNFV3MS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNFV3Mk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjA5LCAtNjg4LCAtNzY4LCAzOTQyXSRbLTYwOSwgLTQxNTQsIC03NjgsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0ZDZWT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNlZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0ZDZWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciIHNvdXJjZT0iX0c0VXdjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY5IiB5PSItNDgyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZZZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTMiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZaT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNCIgeT0iMTY2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2Wi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjEiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2YS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2YXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2YmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Yi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2YnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2ZE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZjdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2ZU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZkdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZWLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRkNldPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU3NSwgMCwgMzk5Nl0kWzAsIC0zNzI1LCAwLCA4NDZdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0ZDZpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0ZDZlZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OCIgeT0iLTQ0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2a2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDMiIHk9Ii0yNzMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2bE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTk2IiB5PSI2MTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZsLWZYRWR1cUhvT0piVVJaUnciIHg9IjU1NSIgeT0iMjk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MjciIHk9Ii0yOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNm4tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2bmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2b09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNm8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2b2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2cE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2cC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2cXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2cS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZpdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRkNmktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTc5NCwgODQ2LCAtNzI0NywgLTE2NDJdJFs1MjgzLCAyNDgwLCAtMzc1OSwgLThdJFs3NjYyLCAyNDgwLCAtMTM4MCwgLThdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0ZDZyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c0ZDZlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2c3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZyZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0ZDZydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03OSwgLTMxNywgODk5NiwgNjQzMF0kWy03OSwgLTY3NzMsIDg5OTYsIC0yNl0kWy03OTM4LCAtNjc3MywgMTEzNywgLTI2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNnMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNGQ2dE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNnhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgc291cmNlPSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2eU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNnllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2emVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjgxIiB5PSI3NjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ6LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1MCIgeT0iNTA0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2MC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDU4IiB5PSIyODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg0IiB5PSItMzMxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Mk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDYyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDYzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2NGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2NWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNGQ2eHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2eC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzY4MywgLTQ3NCwgLTM2ODMsIC00NzRdJFstNTExMywgLTQ3NCwgLTUxMTMsIC00NzRdJFstNTExMywgLTIxNDIsIC01MTEzLCAtMjE0Ml0kWy0xNzYxLCAtMjE0MiwgLTE3NjEsIC0yMTQyXSRbLTE3NjEsIC0xMjE5LCAtMTc2MSwgLTEyMTldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0bnJVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c0VXdZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0bnJVZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0bnJVdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00OTksIC01MCwgMzAwNV0kWzAsIC0yMjg2LCAtNTAsIDEyMTldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNG5yVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0bnJXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNG5yV2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJZZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05OSIgeT0iLTczNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTE5IiB5PSI3MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRuclotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzNSIgeT0iLTIzNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yYXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDAiIHk9IjI4OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yYi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJiZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yYy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJjZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJkLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJlLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRucld1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRuclctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzY4MywgLTMwNCwgMzY4MywgLTMwNF0kWzQ3MzIsIC0zMDQsIDQ3MzIsIC0zMDRdJFs0NzMyLCAtMjEwOCwgNDczMiwgLTIxMDhdJFsxMjcwLCAtMjEwOCwgMTI3MCwgLTIxMDhdJFsxMjcwLCAtMTIxOSwgMTI3MCwgLTEyMTldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX25BdDZJTVZIRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il9RRjJnNE1WSEVkeTJtdVEyUFF2SF9BIiBzb3VyY2U9Il9uQUlFUU1WSEVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BdDZJOFZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BdDZKY1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0NkpzVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX25BdDZKTVZIRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BdDZKOFZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9RR1Nsd3NWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0NktjVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25BdDZLTVZIRWR5Mm11UTJQUXZIX0EiIHg9Ii0zNDQiIHk9IjIxMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0NktzVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9RR1Nsd3NWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0NkxNVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQXQ2SzhWSEVkeTJtdVEyUFF2SF9BIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2TGNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9RRjJnNGNWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0Nkw4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkF0NkxzVkhFZHkybXVRMlBRdkhfQSIgeD0iNDciIHk9IjI0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0Nk1NVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX1FGMmc0Y1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2TXNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkF0Nk1jVkhFZHkybXVRMlBRdkhfQSIgeD0iLTkyMSIgeT0iLTEwMzYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BdDZNOFZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9RR1Nsd3NWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0Nk5jVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX25BdDZOc1ZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkF0Nk5NVkhFZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0Nk44VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfUUYyZzRjVkhFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BdDZPY1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQm5TQU1WSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25BdDZPTVZIRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25CblNBY1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfUUdTbHdzVkhFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25CblNBOFZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQm5TQk1WSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25CblNBc1ZIRWR5Mm11UTJQUXZIX0EiIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25CblNCY1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9RRjJnNGNWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkJuU0I4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbkJuU0NNVkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQm5TQnNWSEVkeTJtdVEyUFF2SF9BIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9uQXQ2SWNWSEVkeTJtdVEyUFF2SF9BIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX25BdDZJc1ZIRWR5Mm11UTJQUXZIX0EiIHBvaW50cz0iWzExMTEsIC0yNiwgLTM5MTYsIDI2MjBdJFsyNzUyLCAtMjYsIC0yMjc1LCAyNjIwXSRbNDQxOCwgLTE5NTgsIC02MDksIDY4OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMUMxQ0UzMDNEMyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRlYW1CcmVha2Rvd25TdHJ1Y3R1cmUgKHNpbXBsaWZpZWQpIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNG5yZ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJoZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJoLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJpT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJpZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yaS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0bnJmZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJmdWZYRWR1cUhvT0piVVJaUnciIHg9IjExNzA5IiB5PSI2NzciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRucmtPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIwODIiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ya2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ya3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJsLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJtZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5ybS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0bnJqZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJqdWZYRWR1cUhvT0piVVJaUnciIHg9IjYxNzIiIHk9IjE3ODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRucnFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y1dPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNG5ycHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5ycC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjI2OCIgeT0iMzY2NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjaGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNHhjaWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNqdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNrT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNrdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjbE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0eGNodWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNoLWZYRWR1cUhvT0piVVJaUnciIHg9IjU5MjYiIHk9IjM2NjYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3dlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzR4Y3hlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NDMiIGhlaWdodD0iOTkwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN6T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN6dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN6LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjME9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0eGN3dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGN3LWZYRWR1cUhvT0piVVJaUnciIHg9IjU5NDMiIHk9IjY3MjIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzR4YzN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4YzZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNHhjMi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjM09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDkyIiB5PSI1MTMwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEWS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGEgc2ltcGxpZmllZCB2aWV3IG9uIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgb25seSB0aGUga2V5IGNsYXNzZXMgYW5kIHJlbGF0aW9uc2hpcHMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRucm5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzRucmpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucmZPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ybi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRucm9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRucm5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNG5ybnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDQxLCAtMTg2LCAtNTE1NiwgODgwXSRbNDQ4NywgLTc3OCwgLTE3MTAsIDI4N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0bnJvLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRucnBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNXZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIHNvdXJjZT0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y1llZlhFZHVxSG9PSmJVUlpSdyIgeD0iODA2IiB5PSIyODMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTQiIHk9Ii05MzAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNaLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODQiIHk9IjMxMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjYXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTUiIHk9Ii0zMDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2ItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjYmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2MtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjY2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjZC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNkZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNlZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGNXdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGNXLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNDMsIDAsIDExNDMsIDBdJFsyNjQxLCAwLCAyNjQxLCAwXSRbMjY0MSwgMTkxMywgMjY0MSwgMTkxM10kWzAsIDE5MTMsIDAsIDE5MTNdJFswLCA0NDgsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4Y2ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucmZPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4Y2ZlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNHhjZnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAyNDg5XSRbMCwgLTI0NTUsIDAsIDQ5MV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGNnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y2hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNsZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJqT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNtZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGNsdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGNsLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTQ0OCwgMCwgMTQzMF0kWy01MCwgLTE0MzAsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGNuT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y25lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNudWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNvdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3B1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5IiB5PSIyMzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjcWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjIiIHk9Ii0yOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwNCIgeT0iLTE4OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY5IiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN0T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3ZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3dPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjdnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjbi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGNvT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzMzcsIDAsIC00ODA5LCAwXSRbNDk5NSwgMCwgLTExNTEsIDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGMwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUY5NEFCOTAwMTUiIHNvdXJjZT0iX0c0eGN3ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGMxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGMwdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGMwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTQ5OSwgMCwgMjU5OV0kWy01MCwgLTI2NTAsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGMyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4YzJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGM2dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIHNvdXJjZT0iX0c0eGMydWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0Nm1RZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1ST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzNSIgeT0iNDA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1TT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDIiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1TdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1UT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1TLWZYRWR1cUhvT0piVVJaUnciIHg9IjM5MSIgeT0iMjk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDQiIHk9Ii0zNDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bVUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bVYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1XZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtWC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1YZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGM2LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGM3T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzMywgLTMxNywgLTU1MjksIDExMzhdJFsxMzMsIC0xNjEzLCAtNTUyOSwgLTE1OF0kWzQxMjgsIC0xNjEzLCAtMTUzNCwgLTE1OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzQ2bVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCIgc291cmNlPSJfRzR4Y3dlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzR4YzJ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1adWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzQ2bVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDY4IiB5PSItMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1hLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDYiIHk9IjM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMyIgeT0iLTE1MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MCIgeT0iMTQ3MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtZHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1kT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtZXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1mdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1ndWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzQ2bVllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzQ2bVl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE1MzUsIDAsIDQxNTQsIDE2MTRdJFstNTU1NiwgMCwgMTMzLCAxNjE0XSRbLTU1NTYsIC0xMjk2LCAxMzMsIDMxOF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMUM0NjFDMDJGNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0QnJlYWtkb3duU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzQ2bWgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtak9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtanVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZta09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZta2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWt1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNDZtaE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzA3IiB5PSI5NzMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzQ2bWwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFNlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNDZtbE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtbGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTk2IiB5PSIzMTE1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1RVhWLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFl1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNUVYVk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYVmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDk3IiB5PSI1NDY5IiB3aWR0aD0iNDkxOSIgaGVpZ2h0PSIyMTc1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1RVhyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVh1T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVFWHF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWHEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTA3MSIgeT0iMTExNDIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsUURaZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIHZpZXcgb24gdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIG9ubHkgdGhlIGtleSBjbGFzc2VzIGFuZCByZWxhdGlvbnNoaXBzLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1RVhTdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c0Nm1rLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0Nm1nLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhUdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVhTLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVFWFRPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ5OSwgMCwgMTYzNF0kWzAsIC0xNjM0LCAwLCA0OTldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNUVYVWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1RVhVdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhaLWZYRWR1cUhvT0piVVJaUnciIHg9IjQxNyIgeT0iMTA2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMDciIHk9IjY4MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhidWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjYxIiB5PSI3OTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MjciIHk9IjI5MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM4IiB5PSItMjgyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhlZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhmZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWGdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWGhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNUVYWk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYWmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNDYwLCAtODAsIDI0NjAsIC04MF0kWzQ5NzQsIC04MCwgNDk3NCwgLTgwXSRbNDk3NCwgMjQwNywgNDk3NCwgMjQwN10kWzE1ODcsIDI0MDcsIDE1ODcsIDI0MDddJFsxNTg3LCAxMDg1LCAxNTg3LCAxMDg1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhpdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzM4IiB5PSItMzEzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhqdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2OSIgeT0iMjU5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI5IiB5PSItMzEyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYbE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODEzIiB5PSIxNjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQzIiB5PSI3MzciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWG5PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYbXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWG9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYbnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYcE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhvdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYcU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhwdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVhoLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1RVhpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODM3LCAxMDgzLCAtMTgzNywgMTA4M10kWy0xODM3LCAyMzYyLCAtMTgzNywgMjM2Ml0kWy00MDIxLCAyMzYyLCAtNDAyMSwgMjM2Ml0kWy00MDIxLCAtMjM3LCAtNDAyMSwgLTIzN10kWy0yNDU1LCAtMjM3LCAtMjQ1NSwgLTIzN10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVFWHVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgc291cmNlPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVFWHFlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMSIgeT0iLTY0MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iMTk5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMzIiB5PSItNzQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYeC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDciIHk9Ii0yMDIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk4IiB5PSIxMjAzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVh6LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVgwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWDBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNU9JUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNUVYdXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYdS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYyLCAxMDc1LCAtMTYwLCAtNDAwNF0kWy0yNjIsIDQ1ODgsIC0xNjAsIC00OTFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1T0lSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0Nm1rLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1T0lSLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1T0lTT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MiwgLTEwOTIsIC05MywgMTg1NF0kWy00MiwgLTI0NTUsIC05MywgNDkxXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVPSVRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVPSVQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzVFWHFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzQ2bWstZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVPSVVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVPSVVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM4MCwgLTE2LCAxMjI3LCA4MDA5XSRbNzEyOCwgLTE2LCA2OTc2LCA4MDA5XSRbNzEyOCwgLTgwODUsIDY5NzYsIC01OV0kWzExNTksIC04MDg1LCAxMDA3LCAtNTldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1T0lWLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExQzQ5NDYwMzFFIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93blN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0lYT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0laLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSVdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSVd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTk5NCIgeT0iNjU2MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNU9JYk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ljT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0ljZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ljdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0ljLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lkZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1T0lhZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lhdWZYRWR1cUhvT0piVVJaUnciIHg9IjU1NjIiIHk9IjQzMjYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSWZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JaGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JZWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JZXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDMwIiB5PSI2NjM4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lpT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0lqT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjU5IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Ja09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9Ja2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Ja3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9Jay1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JaWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JaXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjAwIiB5PSI2NjkxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ltT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0luT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0luZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ludWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0luLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSW9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSW8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSXBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lwLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSW1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSW11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM4NiIgeT0iMTUzMiIgd2lkdGg9IjU5MjYiIGhlaWdodD0iMTAwNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNVhTUGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjIxOCIgaGVpZ2h0PSI4NDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1FlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1F1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1JPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1J1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVYU091ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU08tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ5NyIgeT0iNDM1MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTYk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNVhTY09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSI5OTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2QtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2VlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNlLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVYU2JlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI4MyIgeT0iODY1MiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTanVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNVhTa3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTg2MiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2wtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU21PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU21lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU211ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU20tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU25PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNuZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVYU2otZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2tPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTE2NSIgeT0iNjU2MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFotZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgaXMgYSBzaW1wbGlmaWVkIHJlcHJlc2VudGF0aW9uIG9mIGEgV0JTIG9ubHkgc2hvd2luZyBrZXkgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU01PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzVPSWFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNOdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU05PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU01lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU011ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ0OCwgMjU0LCAyMjk0XSRbMCwgLTIyNDMsIDI1NCwgNDk5XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU04tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTT09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU1NlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzAiIHk9Ijc5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjg3IiB5PSItMjYxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNWLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NSIgeT0iLTE5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1dlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTWC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTWS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNaLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1plZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNhLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU2FlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU1N1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU1MtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI5NjMsIC0xMDEsIC0yMjAsIC0yODQ0XSRbLTM1OTgsIC0xMDEsIC04NTUsIC0yODQ0XSRbLTM1OTgsIDIzMTksIC04NTUsIC00MjNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0c1T0lpT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNnT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNmZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNmdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zODEsIC00NDgsIDIyOCwgMTgzN10kWy0zODEsIC0xODYyLCAyMjgsIDQyM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0c1T0llT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTaS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNpZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNodWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNoLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU1NiwgLTMxOCwgLTY2MSwgMTk1OF0kWzU1NiwgLTE5NTgsIC02NjEsIDMxOF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNqT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2plZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNudWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0c1WFNqdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNvdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNuLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNvT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNjQsIDQ0OCwgMTk3MiwgLTE2ODRdJFstMzY0LCAxNjM0LCAxOTcyLCAtNDk5XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3BlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTcHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3AtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU3EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3FPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU3FlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUzNCwgLTMxOCwgMjc3OCwgNjY0MV0kWzE1MzQsIC02NDgyLCAyNzc4LCA0NzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTcnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTYk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTdE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTc2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTc3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MjYsIDMxOCwgLTMyMDIsIC0zOTk1XSRbOTI2LCAxMzIzLCAtMzIwMiwgLTI5OTBdJFsyMzI4LCAxMzIzLCAtMTgwMCwgLTI5OTBdJFsyMzI4LCAzOTk1LCAtMTgwMCwgLTMxOF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN0LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3VPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFN1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c1T0lXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1T0lhT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFN2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFN1dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFN1LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MDYsIC00NTcsIDM1NSwgMTc3OF0kWy00MDYsIC0xNzg2LCAzNTUsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3dlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFN3dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0c1T0lXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFN4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFN3LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFN4T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMTcsIDMxNywgLTM5NywgLTE3NzNdJFstMzE3LCAxNzcyLCAtMzk3LCAtMzE4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3llZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE1ODBGMDBDNCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JSZWxhdGlvbnNoaXBzIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNWhETWVmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiIGRlc2NyaXB0aW9uPSJ7Um9sZURlc2NyaXB0b3IubW9kaWZpZXMgPSBSb2xlLnBlcmZvcm1zQXNPd25lci5vdXRwdXQgdW5pb24gUm9sZS5wZXJmb3Jtc0FkZGl0aW9uYWxseS5vdXRwdXQgdW5pb24gUm9sZS5hc3Npc3RzSW4ub3V0cHV0fSIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVoRE11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc3NzEiIHk9IjIzNzkiIHdpZHRoPSI1NTAzIiBoZWlnaHQ9IjE3NTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhET09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVoRE9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEUHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEUU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEUXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFJPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNWhETnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNWhETi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzMyNCIgeT0iNTc0MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNWhEU2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERUdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERVT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERVdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5JT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOSWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1aERSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1aERSLWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MTcwIiB5PSIxNTEzOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNXFOSnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5LdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5LLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5MT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5MZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5MdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5MLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5NT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOTWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1cU5JLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5KT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI2OTkxIiB5PSI0NjIyIiB3aWR0aD0iNDQ0NSIgaGVpZ2h0PSIzODYwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1cU5XZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5XLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTllPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTll1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5aT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVxTlZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTlYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY4ODIiIHk9Ijg3MjAiIHdpZHRoPSI0NDQ1IiBoZWlnaHQ9IjQ4MTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzV6LVdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM3NTkiIGhlaWdodD0iMTExNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXotVmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotVnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjkyIiB5PSIxMDI2MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNXotYU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1jLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzV6LVplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LVp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODE3OCIgeT0iNDI5MiIgd2lkdGg9IjY1MTAiIGhlaWdodD0iMzkyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRGFlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhbiBvdmVydmlldyB0byBhbGwgRGVzY3JpcHRvciB0eXBlcyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UsIHRoZWlyIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucy4gIFdlIHNlZSB0aGF0IGVhY2ggRGVzY3JpcHRvciB0cmFjZXMgYmFjayB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgdGhleSByZWZlciB0by4gIERlc2NyaXB0b3JzIGFsc28gZGVmaW5lIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zIHRoYW4gdGhlIGFzc29jaWF0aW9ucyBkZWZpbmVkIGFtb25nc3QgdGhlIGNvcmUgY29udGVudCBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBFeHRlcm5hbCBJbnB1dHMgYmV0d2VlbiBUYXNrcyBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFyZSBub3QgZGVmaW5lZCBpbiBDb3JlIE1ldGhvZCBDb250ZW50LCBiZWNhdXNlIGl0IGV4cHJlc3NlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcyBhbmQgbm90IGF2YWlsYWJsZS9rbm93biBmb3IgbWV0aG9kIGNvbnRlbnQuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVxTk11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgc291cmNlPSJfRzVoRE5lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5PT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTk51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOT3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0IiB5PSIyODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5QT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjYiIHk9Ii0yODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5QLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5RZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5RT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwMCIgeT0iMTI4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOUS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MyIgeT0iMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5TT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5UT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOVHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOVXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOTS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOTk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg3OSwgLTI1LCA0MTE0LCAtMjc5XSRbLTM3NzYsIC0yNSwgMjIxOCwgLTI3OV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVxTlplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOYWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU3IiB5PSItMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5iZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04OTUiIHk9Ii0xODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5iLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOY09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MjIiIHk9IjI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjI0IiB5PSIxOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODM1IiB5PSItMjMxMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5lZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5mT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5mdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOZi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5mZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5nLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5oLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVxTlp1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVxTlotZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIxOCwgLTE0MjIsIC03ODkwLCAzMTQ5XSRbODY1MiwgLTE0MjIsIC0xNDU2LCAzMTQ5XSRbODY1MiwgLTI2NDEsIC0xNDU2LCAxOTMwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXFOaU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5qT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjE1IiB5PSItMzIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5rT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTIwIiB5PSItMjU0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNTgiIHk9IjIzNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY1MSIgeT0iLTI2NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFObWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODE3IiB5PSIxMjAzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5udWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTm5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5vdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTm9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTnB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTnF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOaWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOaXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCAxODk2LCAtNzg5MCwgNjQ2OF0kWzExNzE3LCAxODk2LCAxNjA4LCA2NDY4XSRbMTE3MTcsIC0yNjQxLCAxNjA4LCAxOTMwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXFOcS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5yLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0yNjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzNjMiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU50ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTIiIHk9IjI0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwNCIgeT0iMTY4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU52T2ZYRWR1cUhvT0piVVJaUnciIHg9IjYyNiIgeT0iMTExMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotSk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1JdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotS09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1KdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1MT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1MLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1NT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVxTnJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVxTnJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIxOCwgNTksIC03ODkwLCA0NjMxXSRbOTc4NywgNTksIC0zMjEsIDQ2MzFdJFs5Nzg3LCAtMjY0MSwgLTMyMSwgMTkzMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzV6LU1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRzVoRFJlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1OLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LU5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1PdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotT2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MiIgeT0iLTQwNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1QT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MCIgeT0iNTc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotUC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI3IiB5PSItMjM5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NiIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotUi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1SZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1TdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotUy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1TZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1UT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1ULWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1VLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzV6LU11ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzV6LU0tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM1LCAtNTU4LCA4NCwgNDAxM10kWzEzNSwgLTIxNjcsIDg0LCAyNDA0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXotZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1ei1lT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDczIiB5PSIyNTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1IiB5PSIyNzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1mdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTAiIHk9Ii04NjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1ndWZYRWR1cUhvT0piVVJaUnciIHg9Ii01OTQiIHk9IjIyMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjcxIiB5PSItMTE1NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotaXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1pT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotanVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1qT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1rdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1sdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzV6LWRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzV6LWR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUxNCwgLTE5NTUsIDI1MTQsIC0xOTU1XSRbMjUxNCwgLTM1MjIsIDI1MTQsIC0zNTIyXSRbLTkyMiwgLTM1MjIsIC05MjIsIC0zNTIyXSRbLTkyMiwgLTE5NTUsIC05MjIsIC0xOTU1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXotbC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1ei1tLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NDkiIHk9Ii04MzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LW4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgxOSIgeT0iLTQ0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1vdWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSIzMDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1wdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1wZWZYRWR1cUhvT0piVVJaUnciIHg9IjE5OSIgeT0iLTIzNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTEiIHk9IjM0NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotcmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1xLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1yLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei10ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZJLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dkllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzV6LW1PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzV6LW1lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3MDAsIC0xOTU1LCAtMjcwMCwgLTE5NTVdJFstMjcwMCwgLTI2NzUsIC0yNzAwLCAtMjY3NV0kWy03MzgyLCAtMjY3NSwgLTczODIsIC0yNjc1XSRbLTczODIsIC04NTUsIC03MzgyLCAtODU1XSRbLTMyNTEsIC04NTUsIC0zMjUxLCAtODU1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2Sk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIiBzb3VyY2U9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1OXZLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM2MiIgeT0iLTI4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2TE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ4MiIgeT0iLTM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZMLWZYRWR1cUhvT0piVVJaUnciIHg9IjQ0MCIgeT0iMjQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2TXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzIzIiB5PSItMjQxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Tk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZOZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1NSIgeT0iMjM3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZPdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dk9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZQdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Uk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2SmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2SnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIxOCwgNDU3LCAxNTU2MSwgNzYyXSRbLTE0NTI4LCA0NTcsIDMyNTEsIDc2Ml0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dlItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyIgc291cmNlPSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2U3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2Uy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzAiIHk9Ii0yNzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0ODIiIHk9Ii0zMjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4MiIgeT0iMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2VmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjg5IiB5PSItMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZXT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc3NiIgeT0iMjgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZYZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZZZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2WS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dmFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Wi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2U09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2U2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIxOCwgLTExMDAsIDE1NTYxLCAtNzk1XSRbLTE0NTI4LCAtMTEwMCwgMzI1MSwgLTc5NV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0c1aERNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1OXZSLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dmEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzU5dmJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTEwLCA4NzIsIC0yMDMsIC0xMzI5XSRbMzEzLCAyMjAxLCAwLCAwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzU5dmJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNTl2YnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dmItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSIgc291cmNlPSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Y3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2Yy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjkiIHk9Ii0zMDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMxOCIgeT0iMjIyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ1OSIgeT0iLTExOTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZmZWZYRWR1cUhvT0piVVJaUnciIHg9IjQxOCIgeT0iLTI5NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Z09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjA3IiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dmhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Zy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dmllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2aC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2amVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZpLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2a09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2a2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZqLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZjT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZjZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMTgsIDE5NTUsIC01NDUyLCAtMjkyMV0kWzIyMTgsIDM2OTksIC01NDUyLCAtMTE3Nl0kWzU0NTIsIDM2OTksIC0yMjE4LCAtMTE3Nl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dmt1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgc291cmNlPSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2bHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjciIHk9Ii0yNzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyOTkiIHk9Ii0yNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2bmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAxOSIgeT0iMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzMSIgeT0iMjgxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZvLWZYRWR1cUhvT0piVVJaUnciIHg9IjUwNCIgeT0iMjcxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZxT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dnB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dnF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2cnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2c3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2ay1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2bE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjY0NiwgMTk1OCwgLTEwMzE4LCAtMjkxMF0kWy0yNjQ2LCA1ODIxLCAtMTAzMTgsIDk1M10kWzU0NTAsIDU4MjEsIC0yMjIyLCA5NTNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2RzVFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZHNUZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxMCIgeT0iMjU0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Ri1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVHT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzk5IiB5PSIxNzQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Ry1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNiIgeT0iLTMxNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc2IiB5PSIxNTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUllZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTMiIHk9Ijk3NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1SnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1S3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVMdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVNdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNU1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZHNUVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZHNUV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyMjIsIDMxOCwgNTQ1MCwgNTE4Nl0kWy05MDQ4LCAzMTgsIC0xMzc2LCA1MTg2XSRbLTkwNDgsIC0yOTEwLCAtMTM3NiwgMTk1OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZHNU0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1TnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1T09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNkc1Ti1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzQzIiB5PSIyNzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNU8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNjIiIHk9IjI0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVQdWZYRWR1cUhvT0piVVJaUnciIHg9IjMyNyIgeT0iLTIyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQ1IiB5PSItMTA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVST2ZYRWR1cUhvT0piVVJaUnciIHg9IjY1NiIgeT0iMTAyNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1U2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVSLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1VGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVTLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVVZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVWZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZHNU5PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZHNU5lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyMTgsIDgsIDU0NTIsIDQ4ODVdJFstNzk5MiwgOCwgLTMyMSwgNDg4NV0kWy03OTkyLCAtMjkyMSwgLTMyMSwgMTk1NV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZHNVZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyIgc291cmNlPSJfRzV6LVZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZHNVd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1WHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE3IiB5PSI0MjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1WWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY2IiB5PSItMTE3MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM2IiB5PSI0NTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVaLWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NCIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1Yk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzViZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzViLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1Y09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVkT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVlT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZHNVYtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNkc1V09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTY3LCAtNjg1OCwgNDAwNF0kWzMzLCAtMjI5NCwgLTY4MjQsIDIyNzddJFszNTk4LCAtMzQ5NiwgLTMyNTksIDEwNzVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDNENDNTAyNjAiIHR5cGU9IkNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yUmVsYXRpb25zaGlwcyAoc2ltcGxpZmllZCkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2UXFGT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZRcUVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3MDUiIHk9IjI0OTciIHdpZHRoPSIzMjM0IiBoZWlnaHQ9IjEyMDIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZRcUpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxS2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxTGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNlFxSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MDEiIHk9IjIzNzAiIHdpZHRoPSI0NzkyIiBoZWlnaHQ9IjE3NjEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZRcWV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxZi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiRWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiRXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiRS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiRk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYkZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNlFxZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4Nzc5IiB5PSI2MzI0IiB3aWR0aD0iMzM2OSIgaGVpZ2h0PSIxNzc4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFpOVWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGEgc2ltcGxpZmllZCBvdmVydmlldyBvZiB0aGUgZGlmZmVyZW50IERlc2NyaXB0b3IgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIFByb2Nlc3MgcGFja2FnZSBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBub3Qgc2hvd2luZyBjbGFzcyBhdHRyaWJ1dGVzIG9yIGFzc29jaWF0aW9uIHJvbGVzLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2UXFNT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcU5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI3IiB5PSIyNTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcU9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMjQiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcU8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwOSIgeT0iLTQ0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxUnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxU3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFTT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFUdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFVdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZRcU1lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZRcU11ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE2MTcsIDkzLCAxMjcwOCwgLTU5XSRbLTExOTI5LCA5MywgMjM5NiwgLTU5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNlFxVS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIiBzb3VyY2U9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFWLWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MiIgeT0iMjc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFXLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjYiIHk9Ii01MjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFYZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc5NSIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxWWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDUwIiB5PSItMTAwNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxYWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFaLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFhLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFjZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcWItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFkZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcWMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZRcVZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZRcVZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ2NSwgLTYwMSwgMTM4NTksIC03NTNdJFstNDY1LCAtMTkzMCwgMTM4NTksIC0yMDgyXSRbLTEzOTYxLCAtMTkzMCwgMzY0LCAtMjA4Ml0kWy0xMzk2MSwgLTcyOCwgMzY0LCAtODgwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFiRnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTIyIiB5PSIyNjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgyNyIgeT0iOTA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcwOSIgeT0iMjEyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiSi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJMT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJNT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYk5PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYk9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiRi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmFiR09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjg0LCAtODIxLCAtNTE3MywgMzI5M10kWzU0NjksIC04MjEsIC0xMzg4LCAzMjkzXSRbNTQ2OSwgLTM1MTMsIC0xMzg4LCA2MDFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAwIiB5PSIyOTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0MjQiIHk9IjM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzE0IiB5PSItMTY4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJULWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJVLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiT3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmFiTy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjg0LCA2NjAsIC01MTczLCA0Nzc1XSRbODA4NSwgNjYwLCAxMjI3LCA0Nzc1XSRbODA4NSwgLTM1MTMsIDEyMjcsIDYwMV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYlhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmFiWU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODk1IiB5PSIzODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMzciIHk9Ii05NDAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTg1IiB5PSIzOTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJiZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYmN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiY09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYmR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiZXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJlT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJmT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJYZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJYdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2ODQsIC0xMTgsIC01MTczLCAzOTk2XSRbNTgzMywgLTExOCwgLTEwMjQsIDM5OTZdJFs2NTQ0LCAtNTksIC0zMTMsIDQwNTVdJFs2NTQ0LCAtMzUxMywgLTMxMywgNjAxXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFiZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5IiBzb3VyY2U9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJnLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTgiIHk9Ii0yNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5NiIgeT0iLTY3NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFianVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTMiIHk9Ii0yMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJrT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYmxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiay1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYm1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFibC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFibmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJtLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFib09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFib2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJuLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJnT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJnZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2MzQsIDg4MCwgLTU4MzMsIC0zMDgxXSRbMTYzNCwgMTg3MSwgLTU4MzMsIC0yMDkxXSRbNjcyMiwgMTg3MSwgLTc0NSwgLTIwOTFdJFs2NzIyLCAzMDczLCAtNzQ1LCAtODg5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFib3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJwdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTYiIHk9Ii0yNjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYnF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMTYiIHk9Ii0xMzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUxOSIgeT0iLTMxMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbENPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsRGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxDLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsRWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxELWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxGZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxHZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZhYm8tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYnBPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE5NDcsIDg4MCwgLTk0MTQsIC0zMDgxXSRbLTE5NDcsIDQ0NjEsIC05NDE0LCA0OTldJFsxMzUsIDQ0MzYsIC03MzMyLCA0NzRdJFs1NzgyLCA0NDM2LCAtMTY4NCwgNDc0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmpsR3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbElPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2amxIdWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzMiIHk9IjMwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIwMyIgeT0iMjcxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxKZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNTMiIHk9IjE4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbExlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsTU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsTk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxNdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxPT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbE51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxQT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbE91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZqbEctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZqbEhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE2ODQsIC0zMzgsIDU3ODIsIDM2MjNdJFstODM4MiwgLTMzOCwgLTkxNCwgMzYyM10kWy04MzgyLCAtMzA4MSwgLTkxNCwgODgwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmpsUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2amxRZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MDMiIHk9IjMwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTc1IiB5PSItMjExIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxTT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxTLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzMCIgeT0iMjExIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsVHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxVLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxWLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmpsUHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmpsUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQ3MywgLTg4OSwgNTk5NCwgMzA3M10kWy0xNDczLCAtMTI2MSwgNTk5NCwgMjcwMF0kWy02OTU5LCAtMTI2MSwgNTA4LCAyNzAwXSRbLTY5NTksIC0zMDgxLCA1MDgsIDg4MF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTc5MDU0MDIyNSIgdHlwZT0iQ2xhc3MiIG5hbWU9IkFjdGl2aXR5Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNmpsWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNjg5MSIgaGVpZ2h0PSIyNDIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbGFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbGF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbGEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbGJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbGJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdBZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZqbFllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZqbFl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjcxNCIgeT0iMTU4MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXQnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0MtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0QtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdFZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V0EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V0JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjYyOSIgeT0iNzI3MiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXT2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY1OSIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1BlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1B1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1FPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1FlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1F1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdST2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V051ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V04tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzgwNiIgeT0iOTEwMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXVXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdWLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdXZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXWGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdULWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdVT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYxNDYiIHk9IjkxMDEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1otZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V2EtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNTAiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdjT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdjdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdkT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXZHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdhT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdhZWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MTkiIHk9IjUwMzUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2llZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V2plZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXa2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXa3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXbE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V21PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2Njg4IiB5PSI1MDcyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFpOVS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGtleSBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIEFjdGl2aXR5IGluIHRoZSBQcm9jZXNzIEJyZWFrZG93biBwYWNrYWdlLiAgT25lIGNhbiBzZWUgdGhhdCB0aGUgY29uY2VwdHMgb2YgUGhhc2UgYW5kIEl0ZXJhdGlvbiBoYXZlIGJlZW4gZGVmaW5lZCBhcyBzcGVjaWFsIEFjdGl2aXRpZXMuICIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdFdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0c2amxZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V0Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OSIgeT0iMTU5MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDc5IiB5PSItMjQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzOSIgeT0iMTY5MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM2IiB5PSIxODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQxNCIgeT0iLTM0MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXS09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdKdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXTE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdNT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0x1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdOT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V011ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V0UtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V0ZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg1MiwgMTA1OCwgMzcwNCwgLTM4OTBdJFsxODUyLCA1MDAxLCAzNzA0LCA1M10kWy05MjYsIDUwMDEsIDkyNiwgNTNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0c2dFdOZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdTZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdSdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V1ItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMwNCwgLTQ1NywgOTE0LCAxMzcxXSRbLTkyMiwgLTEzODAsIDI5NiwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V1RPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V1h1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzZ0V1R1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V1l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V1gtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXWU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMDQsIC00NTcsIC05NjUsIDEzNzFdJFs5NDgsIC0xMzgwLCAtMzIxLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdadWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXWi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXZU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXZWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTUzLCA1MywgMjUxMywgMjI3Nl0kWy00NDQ1LCA1MywgLTk3OSwgMjI3Nl0kWy00NDQ1LCAtMTkwNSwgLTk3OSwgMzE4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V2Z1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXZi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V2dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzZ0V1otZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZqbFlPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V2hPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V2dlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V2d1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTI3LCAtNDQ4LCAtNTY2NCwgMjI5NF0kWzEyNywgLTI2MjQsIC01NjY0LCAxMThdJFsyMzQ1LCAtMjYyNCwgLTM0NDUsIDExOF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdoLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V2lPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdpZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFduZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdtdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdtLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1LCAtNDU3LCAtMTA5MiwgMTcyN10kWzI1LCAtMTY2NywgLTEwOTIsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2MmY4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzYyZjhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOTJENDAwN0UiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbkFuZEJyZWFrZG93biI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZjl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjUxNjQiIGhlaWdodD0iMjA2NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmYtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmZfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmZfZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmZfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmZfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnQWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmY4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmY5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODA3IiB5PSIxMTg3MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnQnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNzM4MiIgaGVpZ2h0PSIxMTg1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0MtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0QtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdFZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ0EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ0JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTE5OCIgeT0iMTE4NTMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ0Z1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTEwMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdHLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdIZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdILWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnSWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmdFLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjMwIiB5PSIxNTMyNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnSnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDMxOCIgaGVpZ2h0PSIxNjI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0stZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0xPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0xlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0wtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdNZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ0ktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ0pPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDY5OSIgeT0iMTUyOTAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ011ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ051ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iMTEwMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ04tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ09PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdPLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdQZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdQLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmdNLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjkzNjIiIHk9IjE1Mjk5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdRdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdSdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjM1IiBoZWlnaHQ9IjExMDAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnVGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnVC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnUS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTY4IiB5PSIxNTI5OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FROU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzUyMiIgaGVpZ2h0PSIxNTI0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVEtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUS1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUS11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUS0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUV9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUV91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVFfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUThlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVE4dWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MzM5IiB5PSI1MDgwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVJCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODQ0IiBoZWlnaHQ9IjEwNjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUkFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJBdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzYwIiB5PSI5MzkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUkhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5OTciIGhlaWdodD0iMTExNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJJdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJKT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJKdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSS09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVJHdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJHLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc3NDciIHk9IjUzODQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUkxlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjY4NzQiIGhlaWdodD0iMjUwNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJNdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJOT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJOdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FST09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVJLdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJLLWZYRWR1cUhvT0piVVJaUnciIHg9IjU3NTciIHk9Ijc4NDAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUlBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NTciIGhlaWdodD0iMTExNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJRdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJST2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJSdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSU09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVJPdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJPLWZYRWR1cUhvT0piVVJaUnciIHg9IjE4OTMxIiB5PSI4NTM0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0I4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3S0I5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NzA3IiBoZWlnaHQ9IjE1NTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0I5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0ItT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0ItZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCX2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCXy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0tCOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQjlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY4NSIgeT0iMjkyOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0tDR09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTkzMCIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0gtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NJLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdLQ0ZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ0Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcwMjciIHk9IjE1MzQyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGUgYSBnZW5lcmFsIG92ZXJ2aWV3IHRvIHRoZSB0YXhvbm9teSBkZWZpbmVkIGluIFByb2Nlc3MgQnJlYWtkb3duIHByZXNlbnRpbmcgdGhlIHR3byBrZXkgYWJzdHJhY3Rpb25zIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGFuZCBCcmVha2Rvd24gRWxlbWVudCB3aXRoIHRoZWlyIG1vc3QgaW1wb3J0YW50IHN1Yi1jbGFzc2VzLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0c3QVE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJBT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJFZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJFdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NjIsIC03NzAsIDM1NTYsIDM1OThdJFstMzc5MywgLTM4MzUsIDUyNCwgNTMzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUkYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSR09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUlNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjUiIHk9IjM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzU4IiB5PSIzMDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzYiIHk9Ii0yNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJWLWZYRWR1cUhvT0piVVJaUnciIHg9IjgyOSIgeT0iLTI2MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSV3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItODgiIHk9IjM1NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSWC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSWS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJaLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJhLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUmFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUlN1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSUy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNDM3LCAwLCAtNzA3OCwgMF0kWzk3MjgsIDAsIC03ODcsIDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c3QVJPZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJiZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJidWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTgsIDU1MCwgMTIwMiwgLTMyNTldJFstMTE4LCAyNzY4LCAxMjAyLCAtMTA0MV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJjLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0c3QVJPZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVE4T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJlZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJkdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJkLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgsIC01NTgsIDYxOCwgMjY5Ml0kWzgsIC0yNDg5LCA2MTgsIDc2Ml0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJmT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJmdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJHZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJndWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJmLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJnT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtMTI1MywgMCwgMTg5Nl0kWzUwLCAtMjU5MCwgMCwgNTU4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzYyZ0V1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmlPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSaWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MTQsIC01NTgsIC00MDY0LCAyMzg3XSRbMzIwMCwgLTE5MTMsIC0xNzc4LCAxMDMyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSai1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmtPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzYyZ0V1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZ0F1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmtlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmt1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExMDAsIC01NTAsIDM0MjAsIDI4NTNdJFstMTEwMCwgLTI4MTksIDM0MjAsIDU4NF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0I4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQjhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIHNvdXJjZT0iX0c3QVJHZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3S0I4dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NCdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NBLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ0JPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjk0LCAtNTY3LCAtMjA5OSwgMTY2N10kWzE4MDMsIC0xNDU2LCAtOTkwLCA3NzhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDQ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NDdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDQy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9HN0tCOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSQU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDRE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDRGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5NTYsIC03ODcsIC0xNzg2LCAxNDQ3XSRbMjA3NCwgLTE3MDEsIC02NjgsIDUzM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0UtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0c3S0NGT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NKZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ0p1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU2NywgMCwgMjM3OV0kWzAsIC0xOTEzLCAwLCAxMDMyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0stZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDTE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ01lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0x1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDTC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjQ5NywgLTEwNDEsIDY2OTcsIDI3NjhdJFstNjE0NiwgLTI1NTYsIDMwNDgsIDEyNTNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDTk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NOZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDTnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDTi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDT09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI3LCAtNTkyLCAtNDMxLCAyNzYwXSRbLTEyNywgLTIwOTksIC00MzEsIDEyNTNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDUGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NQdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDUC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HNjJnSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDUU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDUWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzUsIC04MTIsIC0xODk2LCAyODQ0XSRbMTM1LCAtMzA2NCwgLTE4OTYsIDU5Ml0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NSdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1ItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NTT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0c2MmdRdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NUT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NTZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ1N1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNDc3LCAtNTEwNiwgNjQwMl0kWy0yNiwgLTMzNjEsIC01MTA2LCAzNTE4XSRbMzU0NiwgLTU4MjEsIC0xNTM0LCAxMDU4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1QtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDVU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ1VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzYyZ011ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZ0F1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NWLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ1V1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ1UtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjcsIC01NTAsIDE2OTMsIDI4NTNdJFs2NywgLTI4MTksIDE2OTMsIDU4NF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1dlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRThDODAwNTYiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdLQ1h1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MDMiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NZLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NaZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NaLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMNGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3S0NXLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NYT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg2NjEiIHk9IjcxNzEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTDV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMNi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMN2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMNy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMOE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTDhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RMNC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTDVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg5OCIgeT0iNDQ4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3VEw5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDE0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMX2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMXy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RMOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RMOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODA1IiB5PSI1MjQwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1DLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3VE1ELWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1FT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1FZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1FdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1HdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdUTURPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1EZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NSIgeT0iMjk4OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN1RNS09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSI5OTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1LdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1LLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTU1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1NLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdUTUplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1KdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1NjgiIHk9IjI5NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsaS1VLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIGdlbmVyYWwgZGVmaW5pdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQuICBQcm9jZXNzIEVsZW1lbnQgaXMgZGVycml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCBkZWZpbmUgaW4gQ29yZSBNZXRob2QgQ29udGVudC4gIEp1c3QgbGlrZSB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBmb3IgbWV0aG9kIGNvbnRlbnQgUHJvY2VzcyBFbGVtZW50IGNvbnRhaW5zIGEgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGNhbiBjb21wcm9zZSBvZiBhIG51bWJlciBvZiBhdHRyaWJ1dGVzIGNvbnRhaW5pbmcgdGV4dHVhbCBkZXNjcnB0aW9ucyBmb3IgdGhlIFByb2Nlc3MgRWxlbWVudC4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBzb3VyY2U9Il9HN0tDV3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RMOHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1CZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1CLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNQnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNQS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNQk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC00NTcsIDAsIDE0NzNdJFstNTAsIC0xNDgxLCAwLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNQ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1DdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNRy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBzb3VyY2U9Il9HN1RNQy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RMNHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1IdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNSE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNSGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAtNzgyMywgMjAxNV0kWzAsIC0xNDM5LCAtNzgyMywgMTEwMF0kWzY0MDAsIC0yMzQ1LCAtMTQyMiwgMTk0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTUl1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNSS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTU5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfRzdUTUMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTUpPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1PdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1QZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMiIHk9IjI2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1QLWZYRWR1cUhvT0piVVJaUnciIHg9IjcwNiIgeT0iLTI4OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAiIHk9IjI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA5IiB5PSItMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1TdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1UdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTVV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNVU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNTmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTU51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY5MywgLTI1LCAtNjE4MCwgMjVdJFs2MDc5LCAtMjUsIC0xNzk0LCAyNV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTVYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfRzdUTUpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTDR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1YZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTVctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdUTVdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1XZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTQ5MSwgMCwgMTk5OF0kWy01MCwgLTE5NzIsIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1YdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTVgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIHNvdXJjZT0iX0c3VEw4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VE1KT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1aT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1ZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1ZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgsIC00NDgsIC00MiwgMTc4Nl0kWzgsIC0xNzUyLCAtNDIsIDQ4Ml0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1aLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTWFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM3NUVBMTAyODUiIHR5cGU9IkNsYXNzIiBuYW1lPSJTZWxlY3RlZFRhc2tTdGVwcyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzUxMDAxMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdjODVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5NzkiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4Nk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4NmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4Ni1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4N09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4N2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4N3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjODctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN2M4NGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M4NHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSI1Mzg5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3Yzg5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzOTc5IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOC1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOC1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOC11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOC0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOF9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOF9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOF91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzhfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdjODhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjODh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUwOSIgeT0iMzY0OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN2M5RGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlFdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlGT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlGdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5R09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3YzlDdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3YzlDLWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MzYiIHk9Ijc2MDgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdjOUhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5SXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5Sk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5SnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5Si1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUtPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN2M5R3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M5Ry1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzU0NiIgeT0iNzU2MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210LXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXRfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN210X3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVBLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVCT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVCZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVCLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211Q2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3bXQtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXRfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0MDUiIHk9IjM5NTMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdtdUYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Ry1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUl1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN211Rk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211RmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDI4OCIgeT0iMTI2OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN211Si1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVMT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVMZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVMdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVNT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211TXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3bXVKT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVKZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTQ0IiB5PSIxMzU0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVYLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3bXVZLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDAzIiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVidWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdtdVlPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdVllZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzc5NyIgeT0iMTM1NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3YzM09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSI5OTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djM1LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2MzJlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2MzJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMCIgeT0iMTM4OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xpLVZlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IkEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24gZGVwaWN0ZWQgaW4gdGhlIGRpYWdyYW0uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvIChzZWUgQ29udHJpYnV0aW9uIGluIHBhY2thZ2UgUGx1Z2luIGZvciBkZXRhaWxzKS4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN2M5QU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg0OUUwMDAxIiBzb3VyY2U9Il9HN2M4NE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN2M4OE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M5Qk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN2M5QWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3YzlBdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MzMsIDAsIDE3MDFdJFswLCAtMTcxOCwgMCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdjOUItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN2M5Q09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdjOUtlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfRzdjOUNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdjOUdlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjOUxlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdjOU1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ0dWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NDYiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ1ZWZYRWR1cUhvT0piVVJaUnciIHg9IjgxMyIgeT0iMjk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjQyMyIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN210N2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ2LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN210OGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQ5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQtZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdjOUt1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN2M5Sy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODQ1LCAwLCAtMTA3MDEsIDBdJFsxMDY5MywgMCwgLTE4NTQsIDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVDdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIHNvdXJjZT0iX0c3YzlDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXQtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVEdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVDLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdURPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMzA4MV0kWzAsIC0zMDkwLCAwLCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN211RWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211TS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBzb3VyY2U9Il9HN2M5R2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211Ti1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN211Tk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN211TmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC01MTYsIDAsIDU2ODFdJFstNTAsIC01NjcyLCAwLCA1MjRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN211T3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVPLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211UE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIiBzb3VyY2U9Il9HN211RS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVST2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MyIgeT0iOTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIiIHk9IjEzNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211VGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzMyIiB5PSItMzAyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVVdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVWdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211V09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211WE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN211UGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN211UHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTM2MywgLTc2LCA0ODg1LCAyNV0kWy00ODUxLCAtNzYsIDEzOTcsIDI1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211ZU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBzb3VyY2U9Il9HN211WC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211Zk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Zi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVnT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3OSIgeT0iLTE3NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Zy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMxIiB5PSIzNTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVodWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211aWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjIxIiB5PSIyNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211amVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211ak9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211ai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211a09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzMC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzMS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVlZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3bXVldWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3MDEsIDI1LCAtNDE0MCwgMjVdJFs0NDQ1LCAyNSwgLTEzOTcsIDI1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN3YzNk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9HN210LXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3YzMk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2Mzd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3YzN09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN3YzNmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN3YzNnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTE2LCAtNTAsIDIwNzRdJFswLCAtMjEwOCwgLTUwLCA0ODJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN3YzNy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djM4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN3YzOGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBzb3VyY2U9Il9HN211WC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3YzMk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3YzOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2My11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMtZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MiIgeT0iMTUyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djNfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2M19PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzg3IiB5PSItMjEyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3YzXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTk5IiB5PSIyNDAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djRBdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MyIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Qk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRCLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NEJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRDLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NENlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0RGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0RWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN3YzOHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3djM4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzEwLCAwLCA0ODkzLCAwXSRbLTQ4MDksIDAsIDE3OTQsIDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkQzMTJGMjAzNTgiIHR5cGU9IkNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3Y0R09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjA2NSIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NElPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRJLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2NEZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NEZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAyNSIgeT0iNDg4NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Sk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3Y0S09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NExPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NExlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NE1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRNLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2NEplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NEp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM5NyIgeT0iNzM5OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0UGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3Y0UWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NFJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8xZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2NFB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NFAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwMzUiIHk9IjczNDciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzc1bzJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8zdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8zLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW80T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW80ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW80dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW80LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW81T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvNWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3NW8xLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3NW8yT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg3MjAiIHk9IjczNzQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhDeXplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MDMiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5enVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5ei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5ME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kwdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kxT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5Mk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4Q3l5dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3l5LWZYRWR1cUhvT0piVVJaUnciIHg9IjgzNTYiIHk9IjE0ODEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhDeTV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5Nk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3k2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3k3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3k3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5OGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4Q3k0LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3k1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjYxMjEiIHk9IjQ1ODAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhNajFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWoyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWoyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWozT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWozZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWozdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4TWowZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWowdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NzMiIHk9IjI0NDYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsaS1WLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN3Y0Tk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HN3Y0Sk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djROLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0T09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN3Y0TmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3djROdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ5MSwgLTQ1NywgLTIzMDIsIDIwMzJdJFsyMjYwLCAtMjA0MCwgLTUzMywgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzd2NE8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN3Y0UE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzc1bzV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzc1bzF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2NEZPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW83T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzc1bzZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzc1bzUtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNzVvNk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAyMDMyXSRbMCwgLTIwNDAsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3NW83ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzc1bzd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4Q3l3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c3djRQZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5eHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3l4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4Q3l3ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhDeXd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTYyNiwgLTQ1NywgMjgyNywgMjAzMl0kWy0yODE5LCAtMjA0MCwgNjM1LCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOEN5eC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3l5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOEN5MmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOEN5eWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOEN5M2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOEN5MnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4Q3kyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDI5NDZdJFswLCAtMjk1NCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhDeTRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOEN5NGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhDeTh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzhDeXllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhDeTR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOEN5OXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjc3IiB5PSI3MDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5LS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhDeS11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1MyIgeT0iLTE2OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN5X2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN6QWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN6QU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTYiIHk9IjMwNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDekF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN6Qk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhDekEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNandPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qdy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4TWp3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qeC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4TWp4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhNanllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp6LWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOE1qemVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzciIHk9Ii0xMjQzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOEN5OC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOEN5OU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE2NCwgMzE3LCAxOTg0LCAtMjc3OF0kWy0xMTY0LCAzMTc1LCAxOTg0LCA4MF0kWy0yMjIyLCAzMTc1LCA5MjYsIDgwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOE1qNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HOEN5NHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOE1qNGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4TWo0dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MDIsIC00NTcsIDI1OTksIDE2NzZdJFstMjYxNiwgLTE2ODQsIDY4NSwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qNk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhNajZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzd2NEpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhNajBPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNajdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhNajZ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOE1qNi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzQ3LCAtNDU3LCAzMzEwLCA0NDcwXSRbLTMzMjcsIC00NDc4LCAzMzAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWo4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4TWo4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c4TWowT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4Q3l5ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWo5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4TWo4LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhNajlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjEzMywgLTMzMCwgLTQzMTgsIDYzNV0kWzQ3NDEsIC03MjgsIC0xNzEwLCAyMzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qLWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWotdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaGhaOU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4Ij4NCi0gICAgICAgICAgICA8Ym9keT4wMTwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfRHhMR3dPeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIgbmFtZT0iQWN0aXZpdHkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2hySy11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+DQotICAgICAgICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uDQotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciLz4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xQdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiIG5hbWU9Ik1pbGVzdG9uZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaDBVNU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9RRjJnNGNWSEVkeTJtdVEyUFF2SF9BIiBuYW1lPSJyZXF1aXJlZFJlc3VsdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il9RRjJnNE1WSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1FHU2x3Y1ZIRWR5Mm11UTJQUXZIX0EiIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9RR1Nsd01WSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIiBuYW1lPSJJdGVyYXRpb24iPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2gwVTZPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+DQotICAgICAgICAgICAgICA8Ym9keT5JdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4NCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikNCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiIG5hbWU9IlBoYXNlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doLUY0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPg0KLSAgICAgICAgICAgICAgPGJvZHk+UGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4NCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIG5hbWU9IlRlYW1Qcm9maWxlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doLUY1LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLg0KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4NCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIiBuYW1lPSJ0ZWFtUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2o1X2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dqNV9rZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiIG5hbWU9InN1cGVyVGVhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3ay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiIG5hbWU9InN1YlRlYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MDA1NzAyNzYiIG5hbWU9IldvcmtPcmRlclR5cGUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lIMjQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiI+DQotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODE5RUQwMUVEIiBuYW1lPSJmaW5pc2hUb1N0YXJ0Ij4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lIMjV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxOUVEMDFFRCI+DQotICAgICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7Q29uc3RydWN0IGZlbmNlJnF1b3Q7IGFuZCAmcXVvdDtQYWludCBmZW5jZSwmcXVvdDsgJnF1b3Q7UGFpbnQgZmVuY2UmcXVvdDsgY2FuJ3Qgc3RhcnQgdW50aWwgJnF1b3Q7Q29uc3RydWN0IGZlbmNlJnF1b3Q7IGZpbmlzaGVzLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB0eXBlIG9mIGRlcGVuZGVuY3kgYW5kIHRoZSBkZWZhdWx0IGZvciBhIG5ldyBXb3JrIE9yZGVyIGluc3RhbmNlLg0KLTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODFDNzIwM0M3IiBuYW1lPSJmaW5pc2hUb0ZpbmlzaCI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpUkEwZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM3MjAzQzciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGFuZCAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwsJnF1b3Q7ICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCZxdW90OyBjYW4ndCBmaW5pc2ggdW50aWwgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBmaW5pc2hlcy4NCi08L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxQkU4MDI5NiIgbmFtZT0ic3RhcnRUb1N0YXJ0Ij4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lSQTFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxQkU4MDI5NiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBhbmQgJnF1b3Q7TGV2ZWwgY29uY3JldGUsJnF1b3Q7ICZxdW90O0xldmVsIGNvbmNyZXRlJnF1b3Q7IGNhbid0IGJlZ2luIHVudGlsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBiZWdpbnMuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM1MTAxM0MiIG5hbWU9InN0YXJ0VG9GaW5pc2giPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaVJBMS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODFDNTEwMTNDIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gVGhpcyBkZXBlbmRlbmN5IHR5cGUgY2FuIGJlIHVzZWQgZm9yIGp1c3QtaW4tdGltZSBzY2hlZHVsaW5nIHVwIHRvIGEgbWlsZXN0b25lIG9yIHRoZSBwcm9qZWN0IGZpbmlzaCBkYXRlIHRvIG1pbmltaXplIHRoZSByaXNrIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgZmluaXNoaW5nIGxhdGUgaWYgaXRzIGRlcGVuZGVudCBCcmVha2Rvd24gRWxlbWVudHMgc2xpcC4gSWYgYSByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhlIG1pbGVzdG9uZSBvciBwcm9qZWN0IGZpbmlzaCBkYXRlLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgZXhhY3RseSB3aGVuIGFuZCB5b3UgZG9uJ3Qgd2FudCBhIGxhdGUgZmluaXNoIHRvIGFmZmVjdCB0aGUganVzdC1pbi10aW1lIEJyZWFrZG93biBFbGVtZW50LCB5b3UgY2FuIGNyZWF0ZSBhbiBTRiBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIEJyZWFrZG93biBFbGVtZW50IHlvdSB3YW50IHNjaGVkdWxlZCBqdXN0IGluIHRpbWUgKHRoZSBwcmVkZWNlc3NvcikgYW5kIGl0cyByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50ICh0aGUgc3VjY2Vzc29yKS4gVGhlbiBpZiB5b3UgdXBkYXRlIHByb2dyZXNzIG9uIHRoZSBzdWNjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQsIGl0IHdvbid0IGFmZmVjdCB0aGUgc2NoZWR1bGVkIGRhdGVzIG9mIHRoZSBwcmVkZWNlc3NvciBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4IiBuYW1lPSJXb3JrT3JkZXIiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lheDB1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+DQotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICANCi0oTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikNCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VENkQwMDg4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxOEVFMDA5RiIgbmFtZT0ibGlua1R5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpYXgxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MThFRTAwOUYiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HaWF4Mk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+ZmluaXNoVG9TdGFydDwvYm9keT4NCi0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSIgbmFtZT0icHJlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HazlJYy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2s5SWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiIG5hbWU9IlBsYW5uaW5nRGF0YSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWF4MnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIj4NCi0gICAgICAgICAgICAgIDxib2R5PlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4NCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuDQotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkNCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRUY5MDBFMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU4RDAwRDkiIG5hbWU9InN0YXJ0RGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1Ij4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lraTAtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNThEMDBEOSI+DQotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE1OUEwMTI5IiBuYW1lPSJmaW5pc2hEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWtpMXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE1OUEwMTI5Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE3NUMwM0RCIiBuYW1lPSJyYW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBBNDAwN0IiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWtpMmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE3NUMwM0RCIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2l0c3d1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVDMzk4MDAzMjQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciLz4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNCNiIgbmFtZT0icHJlZml4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaXRzeC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0I2Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9xV2U5MGV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfcVdlOTBPeUhFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3JIRUdNT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQ0EiIG5hbWU9ImlzUGxhbm5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpM2R3dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQ0EiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuDQotDQotDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2kzZHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0Q0IiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2kzZHgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENCI+DQotICAgICAgICAgICAgICAgIDxib2R5Pkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLg0KLTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dpM2R5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAwNkE2QjAxRkIiIG5hbWU9ImlzT3B0aW9uYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaTNkeS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMDZBNkIwMUZCIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dpM2R6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiIG5hbWU9InByZXNlbnRlZEFmdGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHduT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3bS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0IiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhndWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNjkiIG5hbWU9InBsYW5uaW5nRGF0YSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiUS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xQT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsTy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIgbmFtZT0iRGVzY3JpcHRvciIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HakFuc2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuDQotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIA0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODE0MkJCMDNCNSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HakFudGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+DQotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqQW50LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCIgbmFtZT0iUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002ai1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCIgbmFtZT0ibW9kaWZpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djak9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGMtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhjdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqQW51LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuDQotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uDQotDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCIgbmFtZT0iVGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3cU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd3AtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNmxlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZsT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiIG5hbWU9ImFzc2lzdGVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JndWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiIG5hbWU9ImV4dGVybmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JpLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NnLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIiBuYW1lPSJvcHRpb25hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NtT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djbC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4IiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1kZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1oZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtaE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvT2U0LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hb09lNHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbndPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTJBNUY4NjAyRjYiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pLWXMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMkE1Rjg2MDJGNiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICANCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9LYzFad095SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfS2Nyb3dPeUpFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0tWWUc0T3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTNFQzAxODAzNDAiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaktZdHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEzRUMwMTgwMzQwIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuDQotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLg0KLTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWXRzWG9leUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1l0c1hvT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9ZaEIwb095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIiBuYW1lPSJXb3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002aHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSIgbmFtZT0iaW1wYWN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dybGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyIgbmFtZT0iaW1wYWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dybU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtZi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiIgbmFtZT0iQ29tcG9zaXRlUm9sZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaktZdWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuDQotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUY5NEFCOTAwMTUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhlZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqVUpzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0MwIiBuYW1lPSJpc1JlcGVhdGFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUby1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0MwIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2pkVHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENSIgbmFtZT0iaXNPbmdvaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pkVHAtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENSI+DQotICAgICAgICAgICAgICAgIDxib2R5PklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqZFRxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzREUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUcS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0RFIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLg0KLQ0KLQ0KLTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqZFRyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drOUlmLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HazlJZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUci1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4NCi0gICAgICAgICAgICAgIDxib2R5PlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLg0KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiANCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqbkVvLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhZ2dyZWdhdGlvbiBhc3NvY2lhdGlvbiBzcGVjaWZpZXMgdGhlIHJvbGVzIG9mIHRlYW0gbWVtYmVycyB3aXRoIFJvbGUgRGVzY3JpcHRvcnMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiIG5hbWU9Il90ZWFtUHJvZmlsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dqbkVwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ham5FcHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HajVfbE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBhIFN1Yi1UZWFtIHRvIGl0cyBTdXBlci1UZWFtLCBpLmUuIHRoZSBUZWFtIHRoYXQgaXQgaXMgcGFydCBvZi48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tEd21PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSI+DQotICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gc3RydWN0dXJlcyBhcmUgbmVzdGVkIHN0cnVjdHVyZXMgKHNlZSBzdXBlckFjdGl2aXRpZXMgYXNzb2NpYXRpb24pIHByZXNlbnRlZCBub3JtYWxseSBhcyBpbmRlbnRlZCBsaXN0cy4gIFdpdGhpbiB0aGlzIG5lc3RpbmcgY2hpbGRyZW4gb24gdGhlIHNhbWUgbGV2ZWwgYXJlIG5vdCBzcGVjaWZpY2FsbHkgb3JkZXJlZC4gIEhvd2V2ZXIsIGEgdXNlciBvZiB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgd291bGQgZXhwZWN0IHRvIG9yZGVyIGVsZW1lbnRzIHdpdGhpbiBhIGxpc3QuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHByZXNlbnRhdGlvbiBzZXF1ZW5jZSBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRBZnRlciBpcyByZWR1bmRhbnQgdG8gdGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEJlZm9yZS4gIFRoaXMgcmVkdW5kYW5jeSBpcyByZXF1aXJlZCB0byBzdXBwb3J0IFByb2Nlc3MgQ29udHJpYnV0aW9ucyAoc2VlIHBsdWdpbnMpLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4IiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHduLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3bnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha0R3b2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFRhc2sgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb24gVGFzay4gIEhvd2V2ZXIsIGEgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiIG5hbWU9InRhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHdwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3cE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDggXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha0R3cXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbmUgV29yayBQcm9kdWN0LiAgSG93ZXZlciwgYSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002Zy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tNNmlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBSb2xlIERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uZSBSb2xlLiAgSG93ZXZlciwgYSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiIgbmFtZT0icm9sZURlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNmpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZpLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiIG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1zIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha002a2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIHRoZSByZWZlcnJlZCBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIHNob3cgdXAgYXMgc2NoZWR1bGVkIHJlc291cmNlcyBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIiBuYW1lPSJwZXJmb3Jtc0FkZGl0aW9uYWxseSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002bU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiIgbmFtZT0iQXNzaXN0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tNNm11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyBoYXZlIGJlZW4gZGVmaW5lZCBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgdGhhdCBtYXkgcHJvdmlkZSBpbmZvcm1hdGlvbiBvciBhc3Npc3RhbmNlIGhlbHBmdWwsIGJ1dCBub3QgbWFuZGF0b3J5IHRvIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIG5vdCBzaG93IHVwIGFzIHNjaGVkdWxlZCByZXNvdXJjZXMgb24gdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIiBuYW1lPSJhc3Npc3RzSW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JoZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiIG5hbWU9IkV4dGVybmFsSW5wdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drV3JpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MsIGkuZS4gbm8gZGVmYXVsdHMgd2lsbCBiZSBkZWZpbmVkIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB1c2VkIGFzIGlucHV0cyB0aGF0IGFyZSBub3QgcHJvZHVjZWQgYnkgVGFza3Mgd2l0aGluIHRoZSBzYW1lIFByb2Nlc3MsIGJ1dCBieSBhbm90aGVyIGV4dGVybmFsIHByb2Nlc3Mgb3IgYW4gdW5rbm93biBzb3VyY2UuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyai1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCIgbmFtZT0iSW1wYWN0c0RlcGVuZGVuY3kiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drV3JrZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNlbWktZm9ybWFsbHkgc3BlY2lmeSB0cmFjZWFiaWxpdHkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgd2l0aGluIHRoZSBzY29wZSBvZiBhbiBBY3Rpdml0eS4gIEEgbGluayBmcm9tIG9uZSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciB0byBhbm90aGVyIGluZGljYXRlcyB0aGF0IG9uZSBXb3JrIFByb2R1Y3QgaXMgcmVxdWlyZWQgYXMgaW5wdXQgdG8gYSBUYXNrIHRoYXQgcHJvZHVjZXMgdGhlIHJlbGF0ZWQgV29yayBQcm9kdWN0ICgnaW1wYWN0cycgcm9sZSBlbmQpLiAgSXQgd291bGQgYWxzbyBtZWFuIHRoYXQgYSBjaGFuZ2Ugb24gb25lIFdvcmsgUHJvZHVjdCBpbnN0YW5jZSBtYXkgYWZmZWN0IGEgY2hhbmdlIG9uIHRoZSByZWxhdGVkIHByb2R1Y3QuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiIG5hbWU9Ik1hbmRhdG9yeUlucHV0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEgXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha1dybXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgbWFuZGF0b3J5IGZvciB0aGUgVGFzayB0byBiZSBwZXJmb3JtZWQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiIG5hbWU9Im1hbmRhdG9yeUlucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2h1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NoZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIG5hbWU9Ik1vZGlmaWVzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiIgaXNEZXJpdmVkPSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drZ2NpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBkZXJpdmVkIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIE1vZGlmaWVzIGFzc29jaWF0aW9uIGRlZmluZWQgYmV0d2VlbiBXb3JrIFByb2R1Y3RzIGFuZCBUYXNrcyBpbiBDb3JlIE1ldGhvZCBDb250ZW50LiAgVGhlIHNhbWUgZGVyaXZhdGlvbiBydWxlIGFzIGZvciB0aGUgY29yZSBjb250ZW50IGVsZW1lbnRzIGFwcGxpZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiIG5hbWU9Il9yb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NqLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djanVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5IiBuYW1lPSJPcHRpb25hbElucHV0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha2dja2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgb3B0aW9uYWwgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NsZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djbE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBuYW1lPSJPdXRwdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drZ2NtdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvdXRwdXRzIGZvciBwZXJmb3JtaW5nIHRoZSByZWZlcnJlZCBUYXNrLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2IiBuYW1lPSJvdXRwdXRGcm9tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1jLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtY3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBuYW1lPSJQYWNrYWdlZFdQIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3BtZU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIj4NCi0gICAgICAgICAgICAgIDxib2R5PklmIGEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVmZXJzIGF0IHRoZSAnZGVsaXZlcmFibGUnIHJvbGUgZW5kIHRvIGEgRGVsaXZlcmFibGUgV29yayBQcm9kdWN0IHRoZW4gdGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIERlbGl2ZXJhYmxlJ3MgV29yayBQcm9kdWN0IHBhcnRzLiAgQXMgaW5kaWNhdGVkIGZvciBEZWxpdmVyYWJsZSBpbiB0aGUgQ29yZSBNZXRob2QgQ29udGVudCBwYWNrYWdlLCB0aGlzIGFzc29jaWF0aW9uIG92ZXJyaWRlcyB0aGUgJ2RlbGl2ZXJlZFdvcmtQcm9kdWN0cycgYXNzb2NpYXRpb24gb2YgdGhlIFdvcmsgUHJvZHVjdCwgd2hpY2ggc3RvcmVzIHRoZSByZWNvbW1lbmRlZCBkZWxpdmVyYWJsZSBwYXJ0cywgYnV0IGNhbiBiZSBjdXN0b21pemVkIGZvciBldmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvci4gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiIG5hbWU9ImRlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1mT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIiBuYW1lPSJQcmltYXJ5UGVyZm9ybXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drcG1nZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBhIGRlc2NyaXB0b3IgZm9yIHRoZSBvbmUgcm9sZSByZXNwb25zaWJsZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHRhc2suICBBbiBpbnN0YW5jZSBvZiB0aGlzIHJvbGUgd291bGQgc2hvdyB1cCBhcyBhIHNjaGVkdWxlZCByZXNvdXJjZSBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2IiBuYW1lPSJwZXJmb3Jtc0FzT3duZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWlPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1oLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIG5hbWU9IlJlc3BvbnNpYmxlIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3BtaXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyByZXNwb25zaWJpbGl0eSBmb3IgV29yayBQcm9kdWN0IGluc3RhbmNlcy4gIEl0IGluZGljYXRlcyBvd25lcnNoaXAgYW5kIGZvciBleGFtcGxlIHdvdWxkIGRlZmluZSB0aGUgUm9sZSB0aGF0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBxdWVzdGlvbnMgYWJvdXQgdGhlIHF1YWxpdHkgd29yayBwcm9kdWN0LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4IiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhkZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiBfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5IiBuYW1lPSJfY29tcG9zaXRlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhmZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYZk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQgXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3pYZi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIj4NCi0gICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEJlZm9yZSBpcyByZWR1bmRhbnQgdG8gdGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhoZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSBfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drelhpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgYXNzb2NpYXRpb24gbGlua3MgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRvIGl0cyBzdWNjZXNzb3IgV29yayBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiIgbmFtZT0ibGlua1RvU3VjY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drOUlkdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HazlJZGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UgXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HazlJZU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbGlua3MgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRvIGl0cyBwcmVkZWNlc3Nvci4gIEV2ZXJ5IFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGhhdmUgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB0byBpdC4gIFNwZWNpZmljIHByZWRlY2Vzc29yIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIFdvcmsgT3JkZXIsIHdoaWNoIGRlZmluZXMgdGhlIGtpbmQgb2YgcHJlZGVjZXNzb3IgYW5vdGhlciBXb3JrIEJyZWFrZG93biBFbGVtZW50IHJlcHJlc2VudHMgZm9yIGFub3RoZXIuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UiIG5hbWU9InN1Y2MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drOUllLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfUUYyZzRNVkhFZHkybXVRMlBRdkhfQSIgbWVtYmVyRW5kPSJfUUYyZzRjVkhFZHkybXVRMlBRdkhfQSBfUUdTbHdzVkhFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX1FHU2x3c1ZIRWR5Mm11UTJQUXZIX0EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSIgYXNzb2NpYXRpb249Il9RRjJnNE1WSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1FHU2x4TVZIRWR5Mm11UTJQUXZIX0EiIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9RR1NsdzhWSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiIG5hbWU9IlByb2Nlc3NUeXBlcyI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR21sZ04tZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFFMTAwN0MwMzFGIj4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwMDdDMDMxRiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3MiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWotLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTkyOUU5OTAyOUMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNal91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWpfLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOE1qX09mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiIHVuZGVybGluZT0idHJ1ZSIgZGVzY3JpcHRpb249IkNsYXNzIERpYWdyYW06IFByb2Nlc3NUeXBlcyAvIFByb2Nlc3NCcmVha2Rvd24iIGxpbmVDb2xvcj0iNDE5NDM2OCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qX2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTc5IiB5PSI5NjI2IiB3aWR0aD0iNDQ0NSIgaGVpZ2h0PSIxMTA5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1V4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVeWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVXotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdVd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdVd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjkwIiB5PSIxMDI3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1UxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTk3IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVMmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVMi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVM2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVTMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdVMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdVMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NDIwIiB5PSI3NzQ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1VfZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTIxIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWQXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWQk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWQnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdVLXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdVLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjg5IiB5PSI3NzQ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1ZEZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZHT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVkN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVkMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY1NyIgeT0iMjg1MyIgd2lkdGg9IjIxMTYiIGhlaWdodD0iMzI3NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWVi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOFdWVy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVllPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVll1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVlpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZadWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVldPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVldlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5MTQiIHk9Ijc3OTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtbGdPZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgUHJvY2VzcyBUeXBlcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIFByb2Nlc3MuICBBcyBkZXBpY3RlZCBpbiB0aGlzIGRpYWdyYW0sIGl0IGRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHR5cGVzIG9mIHByb2Nlc3NlcyBuZWVkZWQgdG8gcmVwcmVzZW50IGJ1aWxkaW5nIGJsb2NrcyBmb3Igb3RoZXIgcHJvY2Vzc2VzIChDYXBhYmlsaXR5IFBhdHRlcm4pLCBjb21wbGV0ZSBlbmQtdG8tZW5kIHByb2Nlc3NlcyAoRGVsaXZlcnkgUHJvY2VzcyksIG9yIHByb2Nlc3NlcyB0aGF0IGhhdmUgYmVlbiByZWR1Y2VkIHRvIHRoZSBlc3NlbnRpYWwgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBleHBvcnRpbmcgYW5kIHBsYW5uaW5nIGEgcHJvamVjdCB3aXRoIGEgdGhpcmQtcGFydHkgcGxhbm5pbmcgdG9vbCAoUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSkuICAoTm90ZSwgdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWctaW4gd2lsbCBwcm92aWRlIGFub3RoZXIgdHlwZSBvZiBQcm9jZXNzIGNhbGxlZCBQcm9jZXNzIENvbnRyaWJ1dGlvbi4pICBUaGUgUHJvY2VzcyBUeXBlcyBwYWNrYWdlIGFsc28gZGVmaW5lcyBwcm9jZXNzLXNwZWNpZmljIGV4dGVuc2lvbiB0byBHdWlkYW5jZSBUeXBlcyBhcyB3ZWxsIENhdGVnb3JpZXMuICBXaGVyZWFzIHRoZSBCcmVha2Rvd24gcGFja2FnZSBkZWZpbmVkIHRoZSBiYXNpYyBwaWVjZXMgZm9yIGRlc2NyaWJpbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMsIHRoaXMgcGFja2FnZSB0YWtlcyB0aGVzZSBwaWVjZXMgYW5kIHBsYWNlcyB0aGVtIGludG8gaGlnaGVyIG9yZ2FuaXphdGlvbiBzdHJ1Y3R1cmVzIGZvciBicmVha2Rvd246IFByb2Nlc3Nlcy4gIEEgcHJvY2VzcyBpcyBkZWZpbmVkIGFzIGEgc3BlY2lhbCBBY3Rpdml0eSBhbmQgdGhlcmVmb3JlIGNvbnN0aXR1dGVzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhIGJyZWFrZG93bi4gIEhvd2V2ZXIsIFByb2Nlc3MgY29udGFpbnMgc3BlY2lhbCBwcm9wZXJ0aWVzIGFuZCBleHRlbmRlZCBzZW1hbnRpY3MgdGhhbiBBY3Rpdml0eS4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOFdWR2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2IiBzb3VyY2U9Il9HOFdVLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWSGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZJZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjMiIHk9IjIyOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDg3IiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWSi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTEiIHk9IjI3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWS3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTcxMiIgeT0iLTI1NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWTC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWTS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZNZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZOLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVk5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZPLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVk9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVkd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVkctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg3MiwgLTQ1NywgLTUwMzcsIDMyNTFdJFstODcyLCAtNDUyMSwgLTUwMzcsIC04MTJdJFszMTA3LCAtNDUyMSwgLTEwNTgsIC04MTJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZQT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEUiIHNvdXJjZT0iX0c4V1UtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZQZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZQdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzMSwgLTQ0OCwgLTMyMzQsIDMyNTldJFs5MzEsIC0yNjUwLCAtMzIzNCwgMTA1OF0kWzMxMDcsIC0yNjUwLCAtMTA1OCwgMTA1OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZRLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIHNvdXJjZT0iX0c4V1UwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZTZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZSdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZSLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xOTQsIC00NTcsIDgsIDMyNTFdJFstMTk0LCAtMjA3NCwgOCwgMTYzNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZUT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZUdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1V3T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWVk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZVdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZULWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZVT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExOCwgLTE2NDIsIC0zMywgMjQyMV0kWzExOCwgLTM2MTUsIC0zMywgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCIgc291cmNlPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVlYtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVmEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmVzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZlc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk5IiB5PSIzMjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmVzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMzMSIgeT0iMzY0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZldC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0OTMiIHk9Ii0xNzciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyNSIgeT0iMzE0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ZmV2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ZmV3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZleGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZleWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOFdWYU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWYWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDU4LCAxMTg1LCAtNTY5OCwgLTI1NzNdJFsyNzY4LCAxMTg1LCAtMzk4NywgLTI1NzNdJFsyNzY4LCAzNzE2LCAtMzk4NywgLTQyXSRbNTE5OCwgMzcxNiwgLTE1NTcsIC00Ml0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhmZXpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfRzhXVlYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmUwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhmZTBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhmZXplZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhmZXp1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTQ0OCwgNjU1MywgMzMxMF0kWy0yMDMsIC0zMjQyLCA2NTUzLCA1MTZdJFstNTY5OCwgLTMyNDIsIDEwNTgsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ZmUwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhmZTFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTkyOUU5OTAyOUMiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzQnJlYWtkb3duIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFBzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFBzdWZYRWR1cUhvT0piVVJaUnciIHg9IjkyMjAiIHk9IjExOTYzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFB4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUHdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUHd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY0NTkiIHk9IjQ5NjkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUDFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NzYiIGhlaWdodD0iOTMxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFAwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFAwdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTMxIiB5PSI2MDEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUDVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQNmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQNi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQN2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM0NCIgeT0iODgyMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQX2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFBdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFCT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFCdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRQ09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFAtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFAtLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTAzIiB5PSI1MDcxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekF1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjI1IiBoZWlnaHQ9Ijg5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBdmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBdi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBd2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QXctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpBdGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM4OSIgeT0iMjEzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpBMnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekEzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekE0ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekE0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBNWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekExLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekEyT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg2NTIiIHk9IjE1MjMxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekE4LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QS1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QS11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QS0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QV9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QV9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekFfdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6QThPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QThlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU2NCIgeT0iMTUyMTQiIHdpZHRoPSI0NjMxIiBoZWlnaHQ9IjExNzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6Qkp1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6Qk1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpCSS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpCSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQ4OCIgeT0iMTUxMjkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6Qk51ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCUGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCUC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QlFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpCTS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpCTk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjM1NCIgeT0iMTE5OTYiIHdpZHRoPSIyNzA5IiBoZWlnaHQ9IjIyMzUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzg4Szd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNTAiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLOC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLOWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLOS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4Sy1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HODhLNi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLN09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTk0NiIgeT0iNjg0MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HODhMRU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM1MyIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExGT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExGZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExGLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExHZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMRy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4OExEZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExEdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3OTUiIHk9IjI5MjkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzg4TEtlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzNTMiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TE5PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HODhMSnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMSi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTg5MSIgeT0iMjgyNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkllZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgbWFpbiBzdHJ1Y3R1cmUgdXNlZCB0byByZXByZXNlbnQgYSBwcm9jZXNzLiAgQSBwcm9jZXNzIGlzIHJlcHJlc2VudGVkIGJ5IGEgYnJlYWtkb3duIG9mIEFjdGl2aXRpZXMsIHdoaWNoIGhhcyAiLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHBQOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQOU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHBQOGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4cFA4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYwOSwgLTU0MSwgLTMwNDgsIDI2MDddJFszMDIyLCAtMjYyNCwgLTYzNSwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhwUDktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHBQLU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhwUUNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUC1lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBRRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NCIgeT0iNjY4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFFZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05ODEiIHk9IjI2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM2MiIgeT0iLTMxOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE4NSIgeT0iMjI5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NjQiIHk9Ii0yNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRSGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRSi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFKZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekFzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekFzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4cFFDdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4cFFDLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODc5LCAtMjM4LCAtMTUwOCwgMzUxOV0kWy00NDQ1LCAtMjM4LCAtNDA3NCwgMzUxOV0kWy00NDQ1LCAtMzY1MiwgLTQwNzQsIDEwNV0kWy0xMzIzLCAtMzY1MiwgLTk1MiwgMTA1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpBeE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOHBQME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpBdE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpBeGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekF4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDQ2NSwgMCwgLTE4MjBdJFswLCAxODI4LCAwLCAtNDU3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzh6QXktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBek9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzh6QTV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzh6QTF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QTZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzh6QTUtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzh6QTZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjk2LCAtNTI0LCAtOCwgMjcyNl0kWzI5NiwgLTI3MTcsIC04LCA1MzNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBN2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ekE3dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpBXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HOHpBNy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpBNy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJBLWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NzYiIHk9IjM5MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCQi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIyIiB5PSI2MzYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCQ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjIiIHk9Ii0zNzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJEZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NjciIHk9IjE3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODAyIiB5PSItMTExMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCRmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJFLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCR2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJIZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJJZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzh6QkFPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzh6QkFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTc3LCA1ODQsIDE3NywgNTg0XSRbMTc3LCAyNDQ2LCAxNzcsIDI0NDZdJFstMzQ2MiwgMjQ0NiwgLTM0NjIsIDI0NDZdJFstMzQ2MiwgMzk3LCAtMzQ2MiwgMzk3XSRbLTE5OTgsIDM5NywgLTE5OTgsIDM5N10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzh6QlF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiIgc291cmNlPSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QlJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCU3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjciIHk9IjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTQ3IiB5PSIyNjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJVT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04MDciIHk9Ii0yOTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MSIgeT0iMjQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJXT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S291ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEtvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S29lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S3AtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S3EtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpCUS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHpCUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzU0LCAwLCAxMzU0LCAwXSRbMzM5NSwgMCwgMzM5NSwgMF0kWzMzOTUsIC0xOTIxLCAzMzk1LCAtMTkyMV0kWzE4NiwgLTE5MjEsIDE4NiwgLTE5MjFdJFsxODYsIC0xMTE3LCAxODYsIC0xMTE3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLc09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLcmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEtydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTI2LCAtMTEyNiwgMjQyOSwgMjQyOV0kWy0zMDMxLCAtMzAzMSwgNTI0LCA1MjRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLcy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEt0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLdGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBzb3VyY2U9Il9HOHpCSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEt1ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzMiIHk9Ii00OTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3ZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMyIgeT0iLTI0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt3T2ZYRWR1cUhvT0piVVJaUnciIHg9IjUyNyIgeT0iMzM5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLdy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMiIgeT0iMjEzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLeHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjciIHk9Ii0zNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S3ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S3otZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEswdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLMC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEswZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEsxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLMS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEsxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEt0dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEt0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1MDgsIC0yNywgLTIxOTYsIDIzMDJdJFszNTQ1LCAtMjcsIC0xNTksIDIzMDJdJFszNTQ1LCAtMTIxNywgLTE1OSwgMTExMl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4SzJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzh6Qkl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEszdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4SzNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4SzJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLMnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTY3LCAtNTI0LCAyODg3LCAyNjI0XSRbLTI4NzAsIC0yNjE2LCA1ODQsIDUzM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEszLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEs0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEs1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEs0dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4SzQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzI4LCAtNTkyLCAtMzQzNywgMjcwOV0kWzM0NzEsIC0yNzY4LCAtNjk0LCA1MzNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLNk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEs2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLLXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLX3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLLS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLX09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1MTYsIC0xMDEsIC0xMjYxXSRbMCwgMTI1MywgLTEwMSwgLTUyNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExBZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OExBLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c4OEs2dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OExCT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExCZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzgsIDMxOCwgLTIxMiwgLTE2NjddJFstMjM4LCAxNjY3LCAtMjEyLCAtMzE4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4TEhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzg4TERPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUC1lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TElPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4TEhlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhMSHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MjgsIDUyNCwgLTIyNjksIC0xNjA4XSRbMjI2MCwgMTYwOCwgLTczNiwgLTUyNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExJLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OExOZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0c4OExKZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TE9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TE91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExPZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OExOdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4TE4tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc1MywgNTI0LCAyMzQ1LCAtMTcxMF0kWy0yMzg3LCAxNzEwLCA3MTEsIC01MjRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMUE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExQZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhMUHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HOHBQd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TFJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMUXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhMUC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExRT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NjUsIDUxNiwgMjQ4OSwgLTEzNjNdJFstMjUwNiwgMTM0NiwgOTQ4LCAtNTMzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TFJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMUnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVGNjc4MDA0NSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NHdWlkYW5jZSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN29PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3by1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlGN3BPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NzYiIGhlaWdodD0iOTE0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjdxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjdxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjdyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3ci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5RjdvZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5RjdvdWZYRWR1cUhvT0piVVJaUnciIHg9IjY2NTciIHk9IjEwNzc4IiB3aWR0aD0iMzEyMyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3ME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOUY3MU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjcyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjcyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjczT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjczZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjczdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3My1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5RjcwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5RjcwdWZYRWR1cUhvT0piVVJaUnciIHg9IjY2NTciIHk9IjEyMzYzIiB3aWR0aD0iMzEyMyIgaGVpZ2h0PSIxNjY3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5Rjc0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEZrLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm5PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZudWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQRmtPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRmtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzMTQiIHk9IjE2NTg3IiB3aWR0aD0iNDMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFODYwMTdFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBGby1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY1OSIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZydWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQRm9PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRm9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzMTQiIHk9IjE0ODEzIiB3aWR0aD0iNDMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBGdk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ4ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGeC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEZ1ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzMxNCIgeT0iODU1OSIgd2lkdGg9IjQzMzYiIGhlaWdodD0iNTM5MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBHRXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdGLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdHZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdHLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHSGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEdELWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBHRU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzMxNCIgeT0iMjUzMSIgd2lkdGg9IjQzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0h1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQR0l1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHSi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHS2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0xlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBHSC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQR0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzMTQiIHk9IjM3NTAiIHdpZHRoPSI0MzM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdMdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEdNdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR051ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR04tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR09PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR09lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMmtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJrLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQR0wtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEdNT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzE0IiB5PSI0OTY5IiB3aWR0aD0iNDMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVkybU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJuZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJuLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5WTJsZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkybHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzMxNCIgeT0iNjE4OSIgd2lkdGg9IjQzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlZMnFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkycmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyci1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVkycGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMnB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzMTQiIHk9Ijc0MDgiIHdpZHRoPSI0MzM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5WTJ1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMndlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJ3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlZMnRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMnR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTUxIiB5PSIxMDc3OCIgd2lkdGg9IjQzMzYiIGhlaWdodD0iNjk1MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXZwa01VNkVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTR6Z01VNkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzU0emdjVTZFZHkybXVRMlBRdkhfQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU0emdzVTZFZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU0emc4VTZFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU0emhNVTZFZHkybXVRMlBRdkhfQSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkNrZ01VNkVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkNrZ2NVNkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkNrZ3NVNkVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkNrZzhVNkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkNraE1VNkVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkNraGNVNkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkNraHNVNkVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZDa2g4VTZFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXZwa2NVNkVkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXZwa3NVNkVkeTJtdVEyUFF2SF9BIiB4PSI5NTEiIHk9Ii0xODg0IiB3aWR0aD0iNDMzNiIgaGVpZ2h0PSIxMTM3OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9feWRtVU1pRkVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195bXdRTWlGRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9feW13UWNpRkVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9feW13UXNpRkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9feW13UThpRkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9feW13Uk1pRkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195bXdSY2lGRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX195bXdSc2lGRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195bXdSOGlGRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX195bXdTTWlGRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195bXdTY2lGRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX195bXdTc2lGRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195bXdTOGlGRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9feW13VE1pRkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX195ZG1VY2lGRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9feWRtVXNpRkVkeXhPNEVzdVFPZ1RnIiB4PSIxMzMxNCIgeT0iMTQ4MCIgd2lkdGg9IjQzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE1LWHdNaUdFZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYdzhpR0VkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE1LWHhNaUdFZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE1LWHhjaUdFZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE1LWHhzaUdFZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE1LWHg4aUdFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYeU1pR0VkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITUtYeWNpR0VkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYeXNpR0VkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITUtYeThpR0VkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYek1pR0VkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITUtYemNpR0VkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYenNpR0VkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE1LWHo4aUdFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITUtYd2NpR0VkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE1LWHdzaUdFZHl4TzRFc3VRT2dUZyIgeD0iMTMzMTQiIHk9IjQ3NSIgd2lkdGg9IjQzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU3Jta29NaUlFZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rbzhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfU3Jta3BNaUlFZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU3Jta3BjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU3Jta3BzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU3Jta3A4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rcU1pSUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9Tcm1rcWNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rcXNpSUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9Tcm1rcThpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rck1pSUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9Tcm1rcmNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rcnNpSUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfU3Jta3I4aUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9Tcm1rb2NpSUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfU3Jta29zaUlFZHl4TzRFc3VRT2dUZyIgeD0iMTMzMTQiIHk9Ii01NTgiIHdpZHRoPSI0OTQ0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VpcU00TWlJRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTQ4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX1VpcU01TWlJRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VpcU01Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VpcU01c2lJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VpcU01OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTZNaUlFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVWlxTTZjaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTZzaUlFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVWlxTTY4aUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTdNaUlFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVWlxTTdjaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTdzaUlFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1VpcU03OGlJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfVWlxTTRjaUlFZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1VpcU00c2lJRWR5eE80RXN1UU9nVGciIHg9IjEzMzE0IiB5PSItMTUxMCIgd2lkdGg9IjQzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtdlJJLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYW4gb3ZlcnZpZXcgdG8gdGhlIGRpZmZlcmVudCBQcm9jZXNzLXNwZWNpZmljIEd1aWRhbmNlIFR5cGVzIGFkZGVkIHRvIHRoZSBHdWlkYW5jZSBUeXBlcyBhbHJlYWR5IGRlZmluZWQgaW4gQ29yZSBNZXRob2QgQ29udGVudCBmb3IgUHJvY2Vzc2VzLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5UEZ5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiIHNvdXJjZT0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5RjcwT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEZ6T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNCIgeT0iMTI3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExMSIgeT0iLTIzMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY3IiB5PSIyMDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYyZWZYRWR1cUhvT0piVVJaUnciIHg9IjM2MSIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEYzdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEY0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVBGeWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVBGeXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTUwNywgMjQxMywgODkwNiwgNTg0XSRbLTg5NDAsIDI0MTMsIDE0NzMsIDU4NF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlQRjYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSIgc291cmNlPSJfRzlQRnVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlGNzBPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRjctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGOC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0IiB5PSItMTkyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUyMCIgeT0iNTg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGLWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDAiIHk9Ii0yNzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEZfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM2MSIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdBZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRl8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdCZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQR0EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0NlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBHQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBHQy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVBGN09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVBGN2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjE3MCwgMTQyOSwgNTEwNiwgLTUyOV0kWy01NzE1LCAxNDI5LCAxNTYxLCAtNTI5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVkyeE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2IiBzb3VyY2U9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOUY3NE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkyeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTJ6T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MTkiIHk9IjMwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTJ6LWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MDMiIHk9Ii0xOTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTIwdWZYRWR1cUhvT0piVVJaUnciIHg9IjY2NCIgeT0iMjgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTIxZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1IiB5PSItMjIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTIydWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTIzdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkyeGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVkyeHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAzMzM1LCAtODYxOSwgODRdJFs4ODIyLCAzMzM1LCAtOTgyLCA4NF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlZMjUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSIgc291cmNlPSJfRzlQRm4tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMjYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyNy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTQyIiB5PSItMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI5ZWZYRWR1cUhvT0piVVJaUnciIHg9IjY4OSIgeT0iLTI0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTItZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyLU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgzIiB5PSIxOTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMl9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyLS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0FlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyXy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzQmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNBLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNCLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5WTI2T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTI2ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTMsIC0yNjQsIDEyMjI0LCAyNTY3XSRbLTExOTg2LCAtMjY0LCAxMTkxLCAyNTY3XSIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfZHh6eEFNVTdFZHkybXVRMlBRdkhfQSIgaWQ9IigwLjgxMDAwNDIsMC45MDA5MDYxKSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVkzQ3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1IiBzb3VyY2U9Il9HNXZwa01VNkVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9HOVBGdU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkzRHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNFdWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NjkiIHk9IjI3OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzRmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzR09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTkiIHk9IjMwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjUyIiB5PSItMjQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNJT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNKT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0tPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzSnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0xPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkzQy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVkzRE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCA0NjMxLCAtOTIyOCwgLTIyMjZdJFs4OTA2LCA0NjMxLCAtMTUwNywgLTIyMjZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9OUm5WSU1VN0VkeTJtdVEyUFF2SF9BIiBpZD0iKDAuNzA5Njg2LDAuOTY1NzczNjQpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTNMZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiIHNvdXJjZT0iX0c1dnBrTVU2RWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX0c5UEdEdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTNNZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM05lZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2OSIgeT0iMjA3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNPLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc1MiIgeT0iMjk1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM1AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNQdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OCIgeT0iLTE4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM1FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlua2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlubGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5rLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5sdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5tZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbmwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5uZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlZM0x1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlZM0wtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTQyNzUsIC05MTc3LCAtOF0kWzg4OTgsIC00Mjc1LCAtMTQ2NCwgLThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9WSDV4WU1VNkVkeTJtdVEyUFF2SF9BIiBpZD0iKDAuODU3NjM3MDUsMC4wMzE0OTI3NTUpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW5udWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MDAyNTIiIHNvdXJjZT0iX0c1dnBrTVU2RWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX0c5UEdIdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW5vdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2OSIgeT0iMjU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5xZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5yZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5yT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MCIgeT0iMjk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5yLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMCIgeT0iLTI0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWludE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5zdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW50ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW50LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWludU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW50dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW51ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW52T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW52LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW53T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpbm4tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpbm9PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTMwNDgsIC05MTc3LCAwXSRbODg5OCwgLTMwNDgsIC0xNDY0LCAwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfVjRWSXdNVTZFZHkybXVRMlBRdkhfQSIgaWQ9IigwLjc4NzEyMDgsMC4xNjE5Nzc3NCkiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbndlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfRzlQR0x1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW54LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpbnhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW55dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlueWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjY5IiB5PSIyODMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW55LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW56ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzAxIiB5PSIyODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4IiB5PSItMjgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4xLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4yLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluNGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlud3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWludy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAtMTgyOCwgLTkxNzcsIDBdJFs4ODk4LCAtMTgyOCwgLTE0NjQsIDBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9XZ2tOY01VNkVkeTJtdVEyUFF2SF9BIiBpZD0iKDAuODIyNTEyLDAuMjg0MTY5NjQpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW41T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiIHNvdXJjZT0iX0c1dnBrTVU2RWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX0c5WTJsT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW42T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW42LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2OSIgeT0iMjgxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW43LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW44ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW44LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW44dWZYRWR1cUhvT0piVVJaUnciIHg9IjY3NSIgeT0iMjYyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW45ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNSIgeT0iLTM0MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluLXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4tT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5fZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluX3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5fT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5fLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9BdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9CZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9CdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpbjVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpbjV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzcxLCAzNzgzLCAtODA5NiwgLTc5XSRbODQxNCwgMzc4MywgLTUzLCAtNzldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9YRW44d01VNkVkeTJtdVEyUFF2SF9BIiBpZD0iKDAuOTA2ODY1MzYsMC40MTQ3NTk2KSIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfZTNDUThRYW9FZDJXM2M4UVdDSTdaZyIgaWQ9IigwLjAxMDgzOTQ4NCwwLjc5MjQ1MjgpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW9CLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiIHNvdXJjZT0iX0c1dnBrTVU2RWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX0c5WTJwT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW9DLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9EdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2OSIgeT0iMjI3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9FdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9GT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9GZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MCIgeT0iMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9HT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTAiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvRy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9KT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvSmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9JLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9KdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvS2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9KLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW9DT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW9DZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIDYwOSwgLTkxNzcsIDBdJFs4ODk4LCA2MDksIC0xNDY0LCAwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlvS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOUY3b09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9MZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9MLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlvTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlvSy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWlvTE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4NCwgLTQ2NSwgODQsIDU4MzNdJFs4NCwgLTE0OTgsIDg0LCA0ODAwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlpb01lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvTXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpb00tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgc291cmNlPSJfRzlGNzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlGN29PZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9PZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpb04tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpb05PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpb05lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjcsIC04NDcsIDI3LCAxNjQwXSRbMjcsIC0yMTcwLCAyNywgMzE3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlpb091ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvTy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfY1JSODhNVThFZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iX2NRc0hFTVU4RWR5Mm11UTJQUXZIX0EiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1dnBrTVU2RWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1JSODg4VThFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY1JSODljVThFZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jUlI4OXNVOEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfY1JSODlNVThFZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfY1JSODhjVThFZHkybXVRMlBRdkhfQSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9jUlI4OHNVOEVkeTJtdVEyUFF2SF9BIiBwb2ludHM9IlstMiwgLTEzMiwgLTMsIDE5Ml0kWy0yLCAtMTkzLCAtMywgMTMxXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9uQjlad01pSUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfbkFuOUFNaUlFZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfX3lkbVVNaUZFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQjladzhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQjlaeGNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25COVp4c2lJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9uQjlaeE1pSUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQjlaeDhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfbkF4Rzg4aUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25COVp5Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQjlaeU1pSUVkeXhPNEVzdVFPZ1RnIiB4PSItNzQxIiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25COVp5c2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfbkF4Rzg4aUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEt3TWlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkI5Wnk4aUlFZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3djaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfbkF4RzhNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEt3OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25DSEt3c2lJRWR5eE80RXN1UU9nVGciIHg9IjcxMyIgeT0iMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQ0hLeE1pSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfbkF4RzhNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEt4c2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQ0hLeGNpSUVkeXhPNEVzdVFPZ1RnIiB4PSIxODUiIHk9Ii0yMzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEt4OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9uQXhHODhpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3ljaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX25DSEt5c2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkNIS3lNaUlFZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3k4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfbkF4RzhNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEt6Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQ0hLenNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25DSEt6TWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEt6OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfbkF4Rzg4aUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEswY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQ0hLMHNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25DSEswTWlJRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEswOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9uQXhHOE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNISzFjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbkNISzFzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQ0hLMU1pSUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9uQjlad2NpSUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9uQjlad3NpSUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9Ils4MiwgLTE3LCAtMzg2LCA1OV0kWzM4NiwgLTc5LCAtODIsIC0zXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9wd0FVWU1pSUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfcHYzS2NNaUlFZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfSE1LWHdNaUdFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wd0FVWThpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wd0FVWmNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVac2lJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9wd0FVWk1pSUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wd0FVWjhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfcHYzS2RNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVhY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wd0FVYU1pSUVkeXhPNEVzdVFPZ1RnIiB4PSItNzQyIiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVhc2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfcHYzS2RNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVViTWlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcHdBVWE4aUlFZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWJjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfcHYzS2NjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVViOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3B3QVVic2lJRWR5eE80RXN1UU9nVGciIHg9IjY4NyIgeT0iMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wd0FVY01pSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfcHYzS2NjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVjc2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wd0FVY2NpSUVkeXhPNEVzdVFPZ1RnIiB4PSIyOTAiIHk9Ii0yMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVjOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9wdjNLZE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWRjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3B3QVVkc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcHdBVWRNaUlFZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWQ4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfcHYzS2NjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVlY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9wd0FVZXNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3B3QVVlTWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVlOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfcHYzS2RNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVmY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9wd0FVZnNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3B3QVVmTWlJRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVmOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9wdjNLY2NpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWdjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcHdBVWdzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wd0FVZ01pSUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9wd0FVWWNpSUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9wd0FVWXNpSUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9Ils4MiwgLTIzLCAtMzg2LCA5MV0kWzM4NiwgLTExMywgLTgyLCAxXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9xYWVOc01pSUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfcWFWRHdNaUlFZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfU3Jta29NaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOczhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOdGNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU50c2lJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9xYWVOdE1pSUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOdDhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfcWFWRHhNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU51Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9xYWVOdU1pSUVkeXhPNEVzdVFPZ1RnIiB4PSItNzQyIiB5PSIyMzYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU51c2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfcWFWRHhNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU52TWlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcWFlTnU4aUlFZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTnZjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfcWFWRHdjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU52OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3FhZU52c2lJRWR5eE80RXN1UU9nVGciIHg9IjUwMiIgeT0iMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOd01pSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfcWFWRHdjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU53c2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9xYWVOd2NpSUVkeXhPNEVzdVFPZ1RnIiB4PSItODc0IiB5PSItMjkyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOdzhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfcWFWRHhNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU54Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xYWVOeHNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3FhZU54TWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU54OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX3FhVkR3Y2lJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOeWNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcWFlTnlzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9xYWVOeU1pSUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOeThpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX3FhVkR4TWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOemNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcWFlTnpzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9xYWVOek1pSUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOejhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfcWFWRHdjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU4wY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3FhZU4wc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcWFlTjBNaUlFZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfcWFlTnNjaUlFZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfcWFlTnNzaUlFZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbODIsIC0zMSwgLTM5OCwgMTIyXSRbMzg2LCAtMTU0LCAtOTQsIC0xXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9yUUhjUU1pSUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfclAtU1VNaUlFZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfVWlxTTRNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yUUhjUThpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yUUhjUmNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNSc2lJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9yUUhjUk1pSUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yUUhjUjhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfclAtU1ZNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNTY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9yUUhjU01pSUVkeXhPNEVzdVFPZ1RnIiB4PSItNzQxIiB5PSIyOTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNTc2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfclAtU1ZNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNUTWlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfclFIY1M4aUlFZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1RjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfclAtU1VjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNUOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3JRSGNUc2lJRWR5eE80RXN1UU9nVGciIHg9IjY2MSIgeT0iMjkwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yUUhjVU1pSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfclAtU1VjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNVc2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9yUUhjVWNpSUVkeXhPNEVzdVFPZ1RnIiB4PSItMjciIHk9Ii0yMzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNVOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9yUC1TVk1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1ZjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3JRSGNWc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfclFIY1ZNaUlFZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1Y4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfclAtU1VjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNXY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9yUUhjV3NpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3JRSGNXTWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNXOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfclAtU1ZNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNYY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9yUUhjWHNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3JRSGNYTWlJRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNYOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9yUC1TVWNpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1ljaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfclFIY1lzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9yUUhjWU1pSUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9yUUhjUWNpSUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9yUUhjUXNpSUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9Ils4MiwgLTM5LCAtMzg2LCAxNTBdJFszODYsIC0xOTYsIC04MiwgLTddIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEJDRDAzMUEiIHR5cGU9IkNsYXNzIiBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvd3MiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cnhsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNzI3IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4bWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4bS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4bmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeG4tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOXJ4a2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4a3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSIzNDg3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhvT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cnhwT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4ck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOXJ4b2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4b3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3Njg0IiB5PSIxNjU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEJFRTAwREMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cnh2ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODYyIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4d2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4d3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4eE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4eGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4eHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4eC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHlPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOXJ4dXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4dS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzYiIHk9IjE3NjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeC1lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4LS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhfdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWlnZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWlnLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWloT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpaGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cng5dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cng5LWZYRWR1cUhvT0piVVJaUnciIHg9IjY5MTMiIHk9IjU2MjEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtdlJKZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IHRoZSBjYXRlZ29yeSBkaXNjaXBsaW5lIGhhcyBiZWVuIGV4dGVuZGVkIGluIHRoaXMgcGFja2FnZSB3aXRoIGFuIGFkZGl0b25hbCBhc3NvY2F0aW9uIHRvIEFjdGl2aXR5IHByb3ZpZGluZyBzdGFuZGFyZCBvciByZWZlcmVuY2Ugd2F5cyBvZiBkb2luZyB0aGUgd29yayBkZXNjcmliZWQgYnkgdGhlIERpc2NpcGxpbmUuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlyeHNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzlyeGtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlyeG9PZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeHRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlyeHNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOXJ4c3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAxMzcxXSRbMCwgLTEzODAsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5cnh0LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlyeHVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5cngwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiIHNvdXJjZT0iX0c5cnh1ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5cnhvT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Mk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cngxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Mi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYiIHk9IjMwNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4M2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMyIgeT0iMjk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng0LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTU1IiB5PSItMjIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cng2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cng3T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeDhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4N3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeDlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4OHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOXJ4MC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOXJ4MU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MzEsIC0yNSwgLTU2NzIsIDc2XSRbNTgxNiwgLTI1LCAtNzg3LCA3Nl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzkxaWh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfRzlyeDllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlyeGtPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaWl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzkxaWgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOTFpaU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAxNjc2XSRbMCwgLTE2ODQsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5MWlqZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzkxaWp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzQ0U5RjAyOTEiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzV29ya0RlZmluaXRpb24iPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWlyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzkxaXFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaXF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTEzMCIgeT0iMzM0NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOTFpdk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl4ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpeC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWl1ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5MWl1dWZYRWR1cUhvT0piVVJaUnciIHg9IjI4NTMiIHk9Ijc2MDgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzkxaXpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpMGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpMC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpMWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOTFpeWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpeXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTciIHk9Ijc2MDgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzkxaTNPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTUtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOTFpMmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTAxIiB5PSI1NjMwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1RqZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVGt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVGxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVGx1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVGl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1RpLWZYRWR1cUhvT0piVVJaUnciIHg9IjI4NTMiIHk9IjEyNjgiIGhlaWdodD0iMTM3NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOV9UbmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ubi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ub09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RvZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RvdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RwT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RwdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UcU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1RtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UbS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDc3OCIgeT0iMTI2OCIgaGVpZ2h0PSIxMzIyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q3LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1Q4LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTkxIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9ULU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9ULWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9ULXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9ULS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UX09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UX2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVF91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9UOE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzg5IiB5PSI2OTc0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RfLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1VBLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VQ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VRE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9VQU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9VQWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTI1IiB5PSIxMDE0NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOV9VRS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTcyNyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VIdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVUVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVUVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY1NyIgeT0iODU1OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VS09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkY2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg0NCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRmT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVUtlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVUt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDA2NCIgeT0iMTAyMTkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlka3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1JZGstZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZG51ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLUlka09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlka2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTM2IiB5PSI0NDM4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctSWRyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZHNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZHMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZHRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWR0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1JZHFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZHF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA2NTEiIHk9IjMzNDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1JZDRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZDYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLUlkM2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkM3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTkzIiB5PSI1NjMwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbXZSSi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlfVGdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzkxaTJPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVGhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlfVGdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOV9UZ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxNzYxXSRbMCwgLTE3NjksIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1RoLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlfVGlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1RxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiIHNvdXJjZT0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1RtZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1RyZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1RzZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAyIiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzgiIHk9IjI1OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTc4IiB5PSItMTc1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Udk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1R2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1R3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9UcXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVHEtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjA5MCwgNjA5LCAtNTM0NSwgNjM1XSRbNTgyMSwgNjA5LCAtMTYxNCwgNjM1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOV9Uek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIiBzb3VyY2U9Il9HOV9UaWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9UbWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UME9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwMiIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkwIiB5PSIxNTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4OCIgeT0iLTE3MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UNHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1Q0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UNXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1Q1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q2dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlfVHplZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5X1R6dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NDUsIC0zODksIC01NjIxLCAtMzg5XSRbNjA3MCwgLTM4OSwgLTEzOTcsIC0zODldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1VILWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c5X1VELWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1Q3LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VJLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5X1VJT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVUllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU1MCwgLTQ1NywgMjE0MiwgMTc3OF0kWy0yMTUwLCAtMTc4NiwgNTQxLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOV9VSnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1VKLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkZmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HOV9VS09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkZ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkZnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWRmLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMzMCwgLTQ1NywgLTEzOTcsIDE4MjhdJFsxMzcxLCAtMTgzNywgLTM1NSwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZGh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfRzlfVF8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVUQtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZGl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZGgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkaU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjg3LCAtNDU3LCAxMTM0LCAxODI4XSRbLTExNTEsIC0xODM3LCAyNzAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRqZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWRuLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0c5MWl5T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRvLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWRvT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZG9lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTkyLCAtNTI0LCAtMjA5OSwgMTgxMV0kWzIwODIsIC0xODIwLCAtNjA5LCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkcHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkdU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLUlkcU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkdk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkdWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWR1dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMzMsIDAsIC0yOTQ2LCAwXSRbMzM3OCwgMCwgLTE3MDEsIDBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkd2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HOTFpdU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkd3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkdy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTM1LCAtNTE2LCAtODQsIDE4MjBdJFstMTM1LCAtMTgyMCwgLTg0LCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkeU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR5ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkeXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkenVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkeS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWR6T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MCwgLTUyNCwgLTIyMzUsIDE3MTBdJFsyMjA5LCAtMTcxOCwgLTY4NSwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZDAtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVGllZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZDEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZDFPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZDFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMyMSwgLTUxNiwgLTcyOCwgMzU0N10kWy0zMjEsIC0zNTQ3LCAtNzI4LCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkN09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HLUlkM09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkN2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWQ3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02NDMsIC01MjQsIDIxNTAsIDE3NjFdJFstMjE2NywgLTE3NjksIDYyNiwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkOU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFOEYyMDEyNSIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uVGF4b25vbXkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09jT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU09kT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09kdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2VlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2UtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2ZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09mLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1TT2NlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT2N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODgyMiIgeT0iMTAwNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPaE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09pT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09pZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09pdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09pLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09qT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09qZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09qdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPai1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09nZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU09ndWZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTEiIHk9IjI4ODciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT21lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TT25lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT24tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPb3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPcE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPcHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3FPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPbXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPbS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MDA2IiB5PSI0NzU1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09zdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU090dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU090LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU091T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU091ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3UtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3ZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3YtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU093ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1TT3MtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3RPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU0MjkiIHk9IjQ3NTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TTzh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPOS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPLWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT19lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPNy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPOE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMwMiIgeT0iNzA3OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZZS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllodWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1iWWVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWWVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYzNCIgeT0iNDc1NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZbE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTcyNyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW5lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlluLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1iWWtlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWWt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1NiIgeT0iNjY1NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZcmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllzdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll0T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZdU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYllxdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYllxLWZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTEiIHk9IjQ3NTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1iWXh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWTBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWJZdy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1Njk4IiB5PSI0NzU1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbTVDSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT2tPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09sdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT2xPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT2tlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPa3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTU5LCAtMzM4LCAtNTU5NiwgMTU0MF0kWzQ5MDIsIC0xMzcxLCAtMTg1NCwgNTA4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT2wtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPbU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT3FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgc291cmNlPSJfRy1TT21lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09yLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT3F1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPcS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAzMjM0XSRbMCwgLTMyNDIsIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU09zT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3NlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctU093dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIHNvdXJjZT0iX0ctU09zdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09jT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU094dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU093LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1TT3hPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc0NSwgLTUyNCwgNDc0MSwgMzI4NV0kWy00NzQxLCAtMzI5MywgNzQ1LCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPeWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU095dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPeS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9HLVNPc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPbWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU096dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPei1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08xT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08xZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwIiB5PSIzNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08yZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzYiIHk9Ii0yOTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08yLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUxNyIgeT0iMjM1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU080ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU081ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPNS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPNi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPek9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU096ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODU0LCAtMjUsIDM2MzIsIDI1XSRbLTM2NDAsIC00MiwgMTg0NSwgOF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT191ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TTzd1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BCT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TUEF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNQQnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjgiIHk9IjM5OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUENPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNQQ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTMiIHk9Ii0zNTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYllZdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMyIgeT0iMjIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlladWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZWmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzOCIgeT0iLTM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZYXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYllhT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlliZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZYnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYlliT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlliLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlljdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllkdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT18tZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNQQU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1MTYsIDAsIC0xNjY3XSRbMCwgMTY1OSwgMCwgLTUyNF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1iWW9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRy1iWWtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1iWWQtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1iWW9lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWJZb3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAxNDIyXSRbMCwgLTE0MzAsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYllwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctYll1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0ctYllxZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09nT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZdi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYll2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctYll1dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1iWXUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTM1NF0kWzAsIC0xMzYzLCAwLCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZd09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYll3ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWJZMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HLWJZd3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPZ09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlkxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZMXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWJZMC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctYlkxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MTIsIC01MjQsIDIxMzMsIDEzNTRdJFstMjE0MiwgLTEzNjMsIDgwNCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWTJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZMnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xpLVdlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ4OTFGMDJDRCI+DQotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0ZvUFdFT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEZEODU0NjAwRDgiLz4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2Vi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLg0KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFBIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJWdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiVmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsTnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbE5lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgbmFtZT0iUHJvY2VzcyIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2Vy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuDQotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbF9xUi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2xfcVJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xzdlgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuDQotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3IiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FVT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xVC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMyIiBuYW1lPSJSb2FkbWFwIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsc3ZZLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuDQotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTA1ODIwMzdDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgbmFtZT0iQWN0aXZpdHkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2wxNVEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbnRyb2R1Y2VkIGluIHRoZSBwYWNrYWdlIEJyZWFrZG93biB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgYW5kIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNsYXNzIFByb2Nlc3MuDQotRXh0ZW5kcyBBY3Rpdml0eSB3aXRoIGFuIGFzc29jaWF0aW9uIHRvIFJvYWRtYXAuICBUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgYWxzbyBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGV4dGVuc2lvbiBvZiB0aGUgRGlzY2lwbGluZSBjYXRlZ29yeS4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2NRc0hFTVU4RWR5Mm11UTJQUXZIX0EiIGdlbmVyYWw9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSIgbmFtZT0icm9hZG1hcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJTZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEJFRTAwREMiIG5hbWU9IkRpc2NpcGxpbmUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2wxNVItZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyI+DQotICAgICAgICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2YgVGFza3MgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4gIFRoaXMgaXMgdGhlIGV4dGVuc2lvbnMgb2YgRGlzY2lwbGluZSBkZWZpbmVkIGluIHRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIHRvIEFjdGl2aXRpZXMsIHdoaWNoIHJlcHJlc2VudCB0eXBpY2FsIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIG1lYW5pbmdmdWwgZ3JvdXBpbmdzIG9mIHRoZSBEaXNjaXBsaW5lJ3MgVGFza3MgaW50byB3b3JrZmxvd3MuDQotVGFza3MgcmVwcmVzZW50IGRlc2NyaXB0aW9ucyBvZiB3b3JrLCB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYnkgRGlzY2lwbGluZXMuICBUaGUgcmVhc29uIHRoYXQgc2V2ZXJhbCBUYXNrcyBhcmUgYWxsIGNhdGVnb3JpemVkIGJ5IHRoZSBzYW1lIERpc2NpcGxpbmUgaXMgdGhhdCB0aGV5IGFsbCByZXByZXNlbnQgYSBwYXJ0IGluIGFjaGlldmluZyBhIGhpZ2hlciBnb2FsIG9yIHBlcmZvcm1pbmcgd29yayB0aGF0IGlzIGFsbCByZWxhdGVkIHRvIGVhY2ggb3RoZXIuICBFdmVyeSBEaXNjaXBsaW5lIGRlZmluZXMgc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBpdCBjYXRlZ29yaXplcy4gIFN1Y2ggc3RhbmRhcmQgd2F5cyBhcmUgZXhwcmVzcyBieSBBY3Rpdml0aWVzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMgZGVmaW5pbmcgaG93IHRoZSBUYXNrcyBjYXRlZ29yaXplZCBieSB0aGUgRGlzY2lwbGluZSAnd29yayB0b2dldGhlcicgaW4gdGhlIG1vc3QgZ2VuZXJpYyB3YXkuICBUaGVzZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGFyZSBvZnRlbiB1c2VkIGZvciBlZHVjYXRpbmcgYW5kIHRlYWNoaW5nIHByYWN0aXRpb25lcnMuIA0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFJlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xST2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUU4NjAxN0UiIG5hbWU9IlByYWN0aWNlIj4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUVGRTAxQ0EiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFRPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xTLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsMTVUZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLg0KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOg0KLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuDQotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4NCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMjAyMzgiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiBfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsX3FRLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMjAyMzgiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyB0cmFjZWFiaWxpdHkgZm9yIGEgUHJvY2VzcyBkb2N1bWVudGluZyB3aGljaCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgYmVlbiB1c2VkIGZvciBkZWZpbmluZyB0aGUgcHJvY2Vzcy4gIEl0IGRvY3VtZW50cyBhcHBsaWNhdGlvbnMgb2YgYSBwYXR0ZXJuIHRocm91Z2ggY29weSBhcyB3ZWxsIGFzIHBhdHRlcm4gYmluZGluZy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbF9xU3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2xfcVNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3IF8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xfcVRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiI+DQotICAgICAgICAgICAgICA8Ym9keT5JZiB0aGUgUGxhbiBoYXMgYmVlbiBjcmVhdGVkIGJhc2VkIG9uIG9uZSBvciBtb3JlIHByb2Nlc3NlcyAoaS5lLiBvdGhlciBQbGFucywgQ2FwYWJpbGl0eSBQYXR0ZXJucywgYSBEZWxpdmVyeSBQcm9jZXNzLCBvciBhbnkgY29tYmluYXRpb24gb2YgdGhlc2UpLCB0aGVuIHRoaXMgYXNzb2NpYXRpb24gY2FwdHVyZXMgYSB0cmFjZSBiYWNrIHRvIHRoZXNlIHNvdXJjZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiIG5hbWU9Il9wcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FVLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xVXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNjkgXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbF9xVmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoZSBQbGFubmluZ0RhdGEgY2xhc3MgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSBfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJSdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhbiBBY3Rpdml0eSB0byB6ZXJvIG9yIG1vcmVzIGluc3RhbmNlcyBvZiB0aGUgUm9hZG1hcCBndWlkYW5jZSB0eXBlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5IiBuYW1lPSJhY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiVGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlRPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJULWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBndWlkYW5jZSBkb2N1bWVudHMgdGhhdCBwcm92aWRlIGVkdWNhdGlvbiBtYXRlcmlhbCBmb3IgdGVhY2hpbmcgc3Rha2Vob2xkZXJzIHN1Y2ggYXMgcHJvamVjdCBtYW5hZ2VycyBvbiBob3cgdG8gcGVyZm9ybSBwcm9qZWN0cyB0aGF0IGZvbGxvdyB0aGlzIERlbGl2ZXJ5IFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJVdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJXT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBndWlkYW5jZSBkb2N1bWVudHMgdGhhdCBoYXZlIGJlZW4gcmVsYXRlZCB0byBhIERlbGl2ZXJ5IFByb2Nlc3MgaW5zdGFuY2UgdG8gZGVzY3JpYmUgYW5kIGNoYXJhY3Rlcml6ZSBpdHMgZmVhdHVyZXMgYW5kIGNhcGFiaWxpdGllcy4gVGhlc2UgZG9jdW1lbnRzIGNhbiBiZSB1c2VkIGZvciBzZXZlcmFsIHB1cnBvc2VzIHN1Y2ggYXMgaW50ZXJuYWwgbWFya2V0aW5nIGNvbW11bmljYXRpb25zLCBzYWxlcyB0cmFpbmluZyBhbmQgZ2VuZXJhbCBtZXRob2QgZWR1Y2F0aW9uLiAgRXhhbXBsZXMgZm9yIENvbW11bmljYXRpb25zIE1hdGVyaWFsIGFyZSBIaWdobGlnaHQgRG9jdW1lbnQsIEZhY3QgU2hlZXQsIGFuZCBEZWxpdmVyeSBQcm9jZXNzIFNwZWNpZmljYXRpb24gT3ZlcnZpZXcuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbE0tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xNdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIG5hbWU9IkJyZWFrZG93bk5lc3RpbmciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCBfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtU2xPT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBiaWRpcmVjdGlvbmFsIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgYnJlYWtkb3duIHN0cnVjdHVyZSBuZXN0aW5nLiAgSXQgZGVmaW5lcyBhbiBuLWxldmVsIGhpZXJhcmNoeSBvZiBBY3Rpdml0aWVzIGdyb3VwaW5nIHRvZ2V0aGVyIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIG90aGVyIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuDQotVGhlIHN1cGVyQWN0aXZpdGllcyByb2xlIGFsbG93cyBuYXZpZ2F0aW9uIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXMgcGFyZW50IEFjdGl2aXR5LiBUaGUgYnJlYWtkb3duRWxlbWVudHMgcm9sZSBhbGxvd3MgbmF2aWdhdGlvbiBmcm9tIGFuIEFjdGl2aXR5IHRvIGl0cyBuZXN0ZWQgQnJlYWtkb3duIEVsZW1lbnRzLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYgXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbVNsUWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgb25lIG1vcmUgcmVmZXJlbmNlIHdvcmtmbG93cyBmb3IgYSBEaXNjaXBsaW5lLiAgVGhlIHJlZmVyZW5jZSB3b3JrZmxvd3MgZGVmaW5lIHRoZSBtb3N0IHR5cGljYWwgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiBhIERpc2NpcGxpbmUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciIG5hbWU9Il9kaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjEyNEJFRTAwREMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFNPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xSLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRTAxQ0EiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSBfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0IiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E5RTg2MDE3RSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsVC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIF8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21TbFVlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNhbiBiZSB1c2VkIHRvIGxpbmsgYWxsIGtpbmRzIG9mIGdlbmVyYWwgZ3VpZGFuY2UgdG8gdGhlIEFjdGl2aXR5IHRoYXQgaXMgYmVpbmcgbWFuYWdlZCBhcyBnZW5lcmFsIFN1cHBvcnRpbmcgTWF0ZXJpYWwuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXTnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV05lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIF8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21jV09PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIEFjdGl2aXR5LSAob3IgUHJvY2Vzcy0pIHNwZWNpZmljIGNoZWNrIHBvaW50cy4gIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiByZXZpZXdzIGFuZCBpbnNwZWN0aW9ucyBvbiB0aGUgd29yayBwZXJmb3JtZWQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXUC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV1B1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5IF8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21jV1FlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlbGF0ZXMgY29uY2VwdHMgb3Igd2hpdGVwYXBlcnMgdG8gdGhlIEFjdGl2aXR5IHByb3ZpZGluZyBpbXBvcnRhbnQgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRvaW5nIHRoZSB3b3JrIGRlc2NyaWJlZCBieSB0aGUgQWN0aXZpdHkuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXU09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV1ItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIF8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21jV1N1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNhbiBwcm92aWRlIHJlZmVyZW5jZXMgdG8gZXhhbXBsZXMgcmVsZXZhbnQgdG8gdGhpcyBzcGVjaWZpYyBBY3Rpdml0eSAob3IgUHJvY2VzcykuICA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdKdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnSmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEgXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWxnS09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktc3BlY2lmaWMgR3VpZGVsaW5lcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdMLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnTHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkgXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWxnTWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVmZXJzIHRvIFJldXNhYmxlIEFzc2V0cyBzcGVjaWZpYyB0byB0aGlzIEFjdGl2aXR5IChvciBQcm9jZXNzKS4gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9BZ2VJY2NVOEVkeTJtdVEyUFF2SF9BIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQWdlSWNNVThFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX0c0MlJzTVU2RWR5Mm11UTJQUXZIX0EiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV1BPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dPLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiIG5hbWU9ImNvbmNlcHRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dSZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXUk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIiBuYW1lPSJleGFtcGxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWxnSS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ0l1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWxnTE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ0stZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSIgbmFtZT0icmV1c2FibGVBc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ05lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdOT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV00tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dNdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9uQXhHOE1pSUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ0ZW1wbGF0ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCIgYXNzb2NpYXRpb249Il9uQW45QU1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX25BeEc4c2lJRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9uQXhHOGNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfcHYzS2NjaUlFZHl4TzRFc3VRT2dUZyIgbmFtZT0icmVwb3J0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3IiBhc3NvY2lhdGlvbj0iX3B2M0tjTWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfcHYzS2M4aUlFZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3B2M0tjc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9xYVZEd2NpSUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSIgYXNzb2NpYXRpb249Il9xYVZEd01pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3FhVkR3OGlJRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9xYVZEd3NpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfclAtU1VjaUlFZHl4TzRFc3VRT2dUZyIgbmFtZT0idG9vbG1lbnRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIiBhc3NvY2lhdGlvbj0iX3JQLVNVTWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfclAtU1U4aUlFZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3JQLVNVc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9uQW45QU1pSUVkeXhPNEVzdVFPZ1RnIiBtZW1iZXJFbmQ9Il9uQXhHOE1pSUVkeXhPNEVzdVFPZ1RnIF9uQXhHODhpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfbkF4Rzg4aUlFZHl4TzRFc3VRT2dUZyIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSIgYXNzb2NpYXRpb249Il9uQW45QU1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX25BeEc5Y2lJRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9uQXhHOU1pSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfcHYzS2NNaUlFZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfcHYzS2NjaUlFZHl4TzRFc3VRT2dUZyBfcHYzS2RNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3B2M0tkTWlJRWR5eE80RXN1UU9nVGciIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX0c0MlJzTVU2RWR5Mm11UTJQUXZIX0EiIGFzc29jaWF0aW9uPSJfcHYzS2NNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9wdjNLZHNpSUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfcHYzS2RjaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3FhVkR3TWlJRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX3FhVkR3Y2lJRWR5eE80RXN1UU9nVGcgX3FhVkR4TWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9xYVZEeE1pSUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBhc3NvY2lhdGlvbj0iX3FhVkR3TWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfcWFWRHhzaUlFZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3FhVkR4Y2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9yUC1TVU1pSUVkeXhPNEVzdVFPZ1RnIiBtZW1iZXJFbmQ9Il9yUC1TVWNpSUVkeXhPNEVzdVFPZ1RnIF9yUC1TVk1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfclAtU1ZNaUlFZHl4TzRFc3VRT2dUZyIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSIgYXNzb2NpYXRpb249Il9yUC1TVU1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3JQLVNWc2lJRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9yUC1TVmNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HblZ1SHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY1N0RDODAxOTciPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNTdEQzgwMTk3IiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctbEpaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWxKWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSll1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk3MiIgeT0iMTk4MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWxKdXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKeGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctbEp0LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEp1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjcyNjYiIHk9IjU5MjgiIHdpZHRoPSI0MDQ3IiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSnl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMzEiIGhlaWdodD0iMTEzNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWxKeC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzUxIiB5PSI5MTM1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEoxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctbEoydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEoyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEozT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEozZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEo1ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSjEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSjJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUwNiIgeT0iNjEyOSIgd2lkdGg9IjMzMTgiIGhlaWdodD0iMTc2OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR25WdUlPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgZGVmaW5pdGlvbiBvZiBQcm9jZXNzIFBhY2thZ2UgYW5kIHdoYXQgZWxlbWVudHMgaXQgY2FuIHN0b3JlLiAgVGhlIFByb2Nlc3MgUGFja2FnZSBwYWNrYWdlIGV4dGVuZHMgTWV0aG9kIFBhY2thZ2Ugd2l0aCB0aGUgbmV3IGNvbmNlcHQgb2YgUHJvY2VzcyBQYWNrYWdlLiAgV2hlcmVhcyB0aGUgc3BlY2lhbCBNZXRob2QgUGFja2FnZSBDb250ZW50IFBhY2thZ2VzIHN0b3JlcyBjb3JlIGNvbnRlbnQgZWxlbWVudHMsIHRoZSBQcm9jZXNzIHBhY2thZ2UgaXMgc3BlY2lhbGl6ZWQgaW4gc3RvcmluZyBQcm9jZXNzIEVsZW1lbnRzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCB2ZXJzdXMgUHJvY2VzcyBQYWNrYWdlcyBlbmZvcmNlcyB0aGUgc2VwYXJhdGlvbiBvZiBtZXRob2QgY29udGVudCB2ZXJzdXMgaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gIE1ldGhvZCBjb250ZW50IGlzIGludGVuZGVkIGJlIHJldXNlZCBpbiBtYW55IHByb2Nlc3Nlcy4gIFRoZXJlZm9yZSwgc3RvcmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2VzcyBlbGVtZW50cyBpbiB0aGUgc2FtZSBwYWNrYWdlIHdvdWxkIGVhc2lseSB2aW9sYXRlIHRoaXMgcHJpbmNpcGxlIGFuZCBwcm9jZXNzIG1vZGVscyB3b3VsZCBiZSBiZWNvbWUgdW5uZWNlc3NhcmlseSBjb2hlc2l2ZS4gIFRoZXJlZm9yZSwgVU1BIGVuZm9yY2VzIHRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgYW5kIFByb2Nlc3MgYnkgbm90IGFsbG93aW5nIHRvIHN0b3JlIHRoZW0gaW4gdGhlIHNhbWUgdHlwZSBvZiBwYWNrYWdlLiAiLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWxKY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1IiBzb3VyY2U9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEpkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02MTAiIHk9Ii0zMTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcxNyIgeT0iLTM5MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEplLWZYRWR1cUhvT0piVVJaUnciIHg9IjczOCIgeT0iLTM1MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMyOCIgeT0iLTI5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIzNyIgeT0iLTI1NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKaHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpoT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEppZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKaXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEppT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEppLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpqdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEprZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEprdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1sSmNlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctbEpjdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg0NywgNTAyLCA4NDcsIDUwMl0kWzg0NywgMTgwMiwgODQ3LCAxODAyXSRbNjg4MCwgMTgwMiwgNjg4MCwgMTgwMl0kWzY4ODAsIDI5MSwgNjg4MCwgMjkxXSRbMTYxNCwgMjkxLCAxNjE0LCAyOTFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctbEprLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIHNvdXJjZT0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSmwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODM3IiB5PSItNTA4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEptLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNzMiIHk9Ii04NzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKbnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjg2IiB5PSItMjc3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKb2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTMiIHk9Ii0zMDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3NyIgeT0iLTMzMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKcWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKcmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpxLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp0ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1sSmxPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctbEpsZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2MTQsIDUzLCAxNjE0LCA1M10kWzY4NTMsIDUzLCA2ODUzLCA1M10kWzY4NTMsIC0xOTA1LCA2ODUzLCAtMTkwNV0kWzIzOSwgLTE5MDUsIDIzOSwgLTE5MDVdJFsyMzksIC01MzAsIDIzOSwgLTUzMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1sSjV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDJFNyIgc291cmNlPSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSjZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1sSjUtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1sSjZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjcsIC04ODAsIDE2LCAzMzM1XSRbNjcsIC0zNDAzLCAxNiwgODEyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NllPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2WWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy11Nll1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgc291cmNlPSJfRy1sSnR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Wi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11Nlp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy11NlktZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy11NlpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMzcsIDgwLCAzMjU1LCAtNzldJFstMzYyNSwgODAsIDE2NjcsIC03OV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZhZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NmF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctdTZhLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiIHNvdXJjZT0iX0ctbEoxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEp4dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Y2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZiLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZjLWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2ZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2ZWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4IiB5PSItMTg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZmT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDciIHk9IjE1MzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Z09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2Zi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Z3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2aE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2Zy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2aHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2aWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZoLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2amVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZpLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctdTZiT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctdTZiZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg0LCA4ODAsIC0xNiwgLTE4MTFdJFs4NCwgMjEyNSwgLTE2LCAtNTY3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwQUI2NjAwMzlCIiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy11Nmt1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11Nm5lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLXU2ai1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2a09mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDg5IiB5PSI3NDc2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZudWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctdTZvdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZyZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy11Nm4tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11Nm9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzUxMyIgeT0iNDU4MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLXU2dS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ3T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ4T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2eHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctdTZ1T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZ1ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MzkyIiB5PSIyMzUzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEVWT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVYLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RVVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RVV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQ2NyIgeT0iMTAzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RWJlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFY3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFZE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFZHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFYXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDMxMiIgeT0iNzQ0MiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFaHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVpLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVqZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVqLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFa2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEVnLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVoT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5NTU4IiB5PSI3MzkxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODFFMzAzNDIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEU1ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEU4T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RTR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RTQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1MSIgeT0iMTAzMzciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RS11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RV91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iMTEwMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RkFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxVWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxVS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxVmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFLS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFX09mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDY1OCIgeT0iMTUzMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxV09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0IxWE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFZZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFZLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFaZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxWi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfQjFXZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFXdWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMjA5IiB5PSI0MjkyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HblZ1SXVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IHRvIHRoZSBzcGVjaWZpY2F0aW9uIG9mIFByb2Nlc3MgQ29tcG9uZW50cy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLXU2cnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2bnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2c3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLXU2ci1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctdTZzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NTgsIDAsIDIzMzZdJFswLCAtMjM0NSwgMCwgNTUwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NnRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2dHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRy00RVVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RVllZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzExLCAtNTU4LCAyODk1LCAyMjg2XSRbLTI5MTIsIC0yMjk0LCA2OTQsIDU1MF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEVaLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RWFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEVlZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0ctNEVhZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVmZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEVldWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEVlLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMyLCA4LCA1MDgwLCAtNDJdJFstNTk2OSwgOCwgMTE0MywgLTQyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RWdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFZ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RWt1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCIgc291cmNlPSJfRy00RVVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RWx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4NCIgeT0iLTI5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVuZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMiIgeT0iMzEzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFb09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDU3IiB5PSIyMzciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVvLWZYRWR1cUhvT0piVVJaUnciIHg9IjY5NSIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFcU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVwdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFck9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVzT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEV0T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RWstZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RWxPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM3MSwgLTkzLCAtMTE3MzQsIDI5MDRdJFsxMzA2NCwgLTkzLCAtNDIsIDI5MDRdJFsxMzA2NCwgLTI1MTQsIC00MiwgNDgyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFdGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIiBzb3VyY2U9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLTRFYWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFdWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV2ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNTIiIHk9Ii0yOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM1IiB5PSIxOTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4MSIgeT0iLTMwNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV6ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEUwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RTBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEUxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RTFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RXR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RXQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzODcsIDUwLCA3MjEzLCAtNTBdJFstNzU2OSwgNTAsIDIwMzIsIC01MF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RTJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDFCRDZBMDIzQiIgc291cmNlPSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nm51ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RTNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RTJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwOTEsIC00ODIsIDE0NjIxLCAyMjYwXSRbLTIwOTEsIC0yNDk3LCAxNDYyMSwgMjQ1XSRbLTE0OTk0LCAtMjQ5NywgMTcxOCwgMjQ1XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RTMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RThlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4MjFCMDA4NyIgc291cmNlPSJfRy00RTRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RTh1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFOC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjIsIC00OTEsIC0xMzEyLCAyMzAyXSRbMTI0NCwgLTIyNDMsIC0zMzAsIDU1MF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEUtT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RS1lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjFhT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQjkiIHNvdXJjZT0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZ0LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFiT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfQjFhZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19CMWF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyNTMsIC00OTEsIDM3MjUsIDE0MzldJFstMzY5OSwgLTE0MzksIDEyNzgsIDQ5MV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfQjFiLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19CMWNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjFjZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiIHNvdXJjZT0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFkZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk5IiB5PSItMjk5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM3IiB5PSIxMDIzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MiIgeT0iLTE2MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MCIgeT0iMTAxNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxaC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFoZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxaS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFpZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFqLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWplZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk0IiB5PSI5NzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0Ixay1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFrZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfQjFjdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19CMWMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ5MSwgMCwgMjYwN10kWzAsIC0yNjE2LCAwLCA0ODJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjFsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiIHNvdXJjZT0iX0ctNEU0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFtT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMW5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4NzIiIHk9Ii03NzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMW4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMW91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTczMyIgeT0iLTMwMDAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMXF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMXJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixck9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0Ixc3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFzT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxdHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF0T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfQjFsZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjFsdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMzOCwgNDgyLCAtMTc5NDksIDY1MjddJFszMzgsIDE2NDIsIC0xNzk0OSwgNzY4N10kWzIzNTU0LCAxNjQyLCA1MjY2LCA3Njg3XSRbMjM1NTQsIC02MjU2LCA1MjY2LCAtMjExXSRbMjAwMjMsIC02MjU2LCAxNzM1LCAtMjExXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX0IxdC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIiBzb3VyY2U9Il9HX0IxV09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLTRFLXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF2LWZYRWR1cUhvT0piVVJaUnciIHg9IjQxNCIgeT0iMTkyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixd2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMzgiIHk9IjE4NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA5IiB5PSItNzM2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjF6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjEwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMTFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMTJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxMS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX0IxdU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX0IxdWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MCwgLTQ4MiwgMCwgMjIwOV0kWzUwLCAtMjE0MiwgMCwgNTUwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbTVDSS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ij4NCi0gICAgICAgICAgICA8Ym9keT4wMzwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfcjBWUklPeGhFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbTVDTGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLg0KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX29DUXBjTy1kRWR1NU9PZWp5MDYyNHciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iX29DUXBjZS1kRWR1NU9PZWp5MDYyNHciIGtleT0iZXh0ZW5kIi8+DQotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICA8L2dlbmVyYWxpemF0aW9uPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiIG5hbWU9ImludGVyZmFjZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25DTUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duQ01JZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIiBuYW1lPSJwcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duVnVFLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HblZ1RXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4MUUzMDM0MiIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR201Q01lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4MUUzMDM0MiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODIxQjAwODciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0IiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlKZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5Sk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbkNNRS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAxQkQ2QTAyM0IiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5RnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyIgbmFtZT0iaW50ZXJmYWNlSU8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUhPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlHLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01GLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+UHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuDQotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDJFNyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HblZ1SE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25WdUctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIF8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25DTUctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyB0aGUgcmVhbGl6YXRpb24gcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGEgUHJvY2VzcyBDb21wb25lbnQgYW5kIGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIiBuYW1lPSJyZWFsaXplZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duQ01ILWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbkNNSHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UgXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbkNNSk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIj4NCi0gICAgICAgICAgICAgIDxib2R5Pkluc3RhbmNlcyBvZiB0aGlzIGFzc29jaWF0aW9uIGNvbnRhaW4gdGhlIGxpc3Qgb2YgVGFzayBEZXNjcmlwdG9ycyB0aGF0IHJlcHJlc2VudCBhIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlFdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMgXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbkw5R09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY29udGFpbnMgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0IHR5cGUgaW5zdGFuY2VzIHVzZWQgZm9yIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbi48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5SC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCBfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duTDlJZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgUHJvY2VzcyBDb21wb25lbnQgaXQgcmVmZXJzIHRvLiAgQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgZXhhY3RseSBvbmUgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlLT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5Si1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYgXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbkw5S3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgY29udGFpbnMgb25seSBleGFjdGx5IG9uZSBQcm9jZXNzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duVnVGdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HblZ1RmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYzIF8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25WdUdPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgUGFja2FnZSBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIGRlZmluZSBCcmVha2Rvd24gYW5kIFByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbGVtZW50IGluc3RhbmNlIGNhbiBiZSBwYXJ0IG9mIG9ubHkgb25lIFByb2Nlc3MgUGFja2FnZSBpbnN0YW5jZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGMkExQjAyRTciIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbnMiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dvT2U1LWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRUQ2ODJCMDE3MCI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVENjgyQjAxNzAiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMTA0MTEwMzg3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQzNyIgaGVpZ2h0PSIxOTk4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1mdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1oZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbWQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM5MyIgeT0iODgwNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQxQjYwMEQ4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtaXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTE0NyIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWstZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1sZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbWgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM1MyIgeT0iNjM4MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMTA0NTUwMjA4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtbXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTQzNSIgaGVpZ2h0PSIzMjY4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbW4tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbW9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbW8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1wZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbWwtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbW1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc4OCIgeT0iMTQzNjQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTEwNDc0MDExQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19MbXF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1MzkiIGhlaWdodD0iMTk5OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1yLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1zT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1zZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1zdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1zLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG10T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfTG1wLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfTG1xT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUzNDIiIHk9IjExOTU0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I0OTAwODYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDM2IiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3U2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3U3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3Uy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3VGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1QtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3UWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3UXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzUiIHk9Ijg4MjIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1VPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19Vd1ZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTU0MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdXZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdYZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3WC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdVZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdVdWZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTUiIHk9IjEzOTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2hPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19Vd2lPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MzgiIGhlaWdodD0iMTU0MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdqZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdqLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdrZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3ay1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdoZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdodWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NTgiIHk9IjM1OTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dvT2U2ZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgZGVmaW5pdGlvbiBvZiB0ZXh0dWFsIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgZm9yIFByb2Nlc3NlcyB0aGFuIGZvciBNZXRob2QgQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgVGhlIHJhdGlvbmFsZSBmb3IgdGhpcyBjYW4gYmUgZm91bmQgaW4gcGFja2FnZSBNZXRob2QgVW5pdHMgaW4gd2hpY2ggdGhlIGdyYW51bGFyaXR5IG9mIE1ldGhvZCBVbml0cyBmb3IgdGhlc2UgZWxlbWVudHMgaGFzIGJlZW4gZGVmaW5lZCBkaWZmZXJlbnRseS4gIFdoZXJlYXMgYSBDb250ZW50IERlc2NyaXB0aW9uIE1ldGhvZCBVbml0IGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IENvbnRlbnQgRWxlbWVudCwgUHJvY2VzcyBpcyBtYWludGFpbmVkIGFzIGEgd2hvbGUgaW4gYSBQcm9jZXNzIENvbXBvbmVudCBNZXRob2QgVW5pdC4gIFRoZXJlZm9yZSB0aGUgcGFja2FnZSBNZXRob2QgQ29yZSBEZXNjcmlwdGlvbiBjb250YWlucyBhIHRheG9ub215IG9mIHNwZWNpYWwgQ29udGVudCBEZXNjcmlwdGlvbiBzcGVjaWFsaXphdGlvbiBhbmQgdGhlIFByb2Nlc3MgRGVzY3JpcHRpb25zIHBhY2thZ2UgY29udGFpbnMgZXh0ZW5kZWQgdmVyc2lvbiBvZiBjbGFzc2VzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZSB3aGljaCBtZXJnZSBuZXcgYXR0cmlidXRlcyBmb3IgZGVzY3JpcHRpb24gaW50byB0aGVzZSBjbGFzc2VzIHZpYSBwYWNrYWdlIG1lcmdlLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXdZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OEM4MDAzQkEiIHNvdXJjZT0iX0dfTG1wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfTG1kdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdaT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdZZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd1l1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTEwMDcsIDAsIDIxNDJdJFswLCAtMjE1MCwgMCwgOTk5XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd1otZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3YU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd2FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0E0MDJEMSIgc291cmNlPSJfR19MbWx1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbXB1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Yk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3YnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd2F1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd2EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtMTY0MiwgMCwgMjExNl0kWy01MCwgLTI3NjAsIDAsIDk5OV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdjT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2NlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXdjdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENFOTAyQ0EiIHNvdXJjZT0iX0dfVXdRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfTG1odWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdkdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdjLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfVXdkT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg1NSwgLTU4NCwgLTEyNzgsIDE4NTRdJFs4NTUsIC0xODYyLCAtMTI3OCwgNTc1XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2VlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3ZXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd2UtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4QzZGMDE5NyIgc291cmNlPSJfR19MbWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Z09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2YtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd2ZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd2ZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQxNCwgLTEwMDcsIDE3NjksIDE4MzddJFstNDE0LCAtMjI3NywgMTc2OSwgNTY3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2d1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Zy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd25lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0NDMDM2QSIgc291cmNlPSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19Vd2hPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3b09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd29lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd251ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd24tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgsIC01NzUsIC04LCAyMDE1XSRbLTgsIC0xODIwLCAtOCwgNzcwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd3BPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3cGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25lNER1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyI+DQotICAgICAgICAgICAgPGJvZHk+MDQ8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0ladF9NT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiLz4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRDFCNjAwRDgiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0NDMDM2QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI3RDAwODQiIG5hbWU9InVzYWdlR3VpZGFuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duZTRHLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI3RDAwODQiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0ZZYnJ3ZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9GWWJyd095SkVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfRlFZakFPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNDExMDM4NyIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4QzZGMDE5NyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTBEMUI2MDBEOCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyRTQiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dub3BCT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyRTQiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfN0pFVXdleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzdKRVV3T3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il82X1BEVU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzUyIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dueHk4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNTIiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWmJuWUlleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1pibllJT3lIRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9aUy1aZ095SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEzNzYyODMwMTVBIiBuYW1lPSJob3d0b1N0YWZmIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbnh5OWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEzNzYyODMwMTVBIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1hUcjN3ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9YVHIzd095R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWEtKaFFPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNDU1MDIwOCIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENBNDAyRDEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUUxMDQ3NDAxMUEiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzcxIiBuYW1lPSJzY2FsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR254eS11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3MSI+DQotICAgICAgICAgICAgICAgIDxib2R5Pk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2NsTTBzZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9jbE0wc095R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfY2FlTFlPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3QSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR254eV9lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3QSI+DQotICAgICAgICAgICAgICAgIDxib2R5PkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzZMT3pnZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il82TE96Z095SUVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNkRMcXdPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NCIgbmFtZT0icmlza0xldmVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbjdqOHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzg0Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2dWdlJvZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9nVnZSb095SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZzZQczRPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ajllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NSI+DQotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ZWndTZ2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWVp3U2dPeUhFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1lQVWtJT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOEUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duN2otT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOEUiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXy1rN0NnZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tazdDZ095R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFNWk1PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM5OCIgbmFtZT0idHlwZU9mQ29udHJhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duN2otLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOTgiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9JTDFuZ2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSUwxbmdPeUpFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0lFaXNzT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQ3NDAxMUEiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4QzgwMDNCQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTEwNDExMDM4NyIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUMiIG5hbWU9InNjb3BlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb0ZVOC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0FDIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9lRW1WY2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZUVtVmNPeUhFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2Q3TnY4T3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUQiIG5hbWU9InVzYWdlTm90ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlU5dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUQiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdTFBTkFleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3UxQU5BT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il91cmQyZ095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRDdCNDkwMDg2IiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENFOTAyQ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUUwRDFCNjAwRDgiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRDdCNjUwMzk0IiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlUtLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I2NTAzOTQiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfSFNlV2tleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0hTZVdrT3lKRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9IS2JOME95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMgXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb0ZVX3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIj4NCi0gICAgICAgICAgICAgIDxib2R5Pkxpc3QgdGhlIHN0ZXBzIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvIGJlIHBlcmZvcm1lZCBmb3IgdGhlIGluc3RhbmNlIG9mIHRoZSBUYXNrIERlc2NyaXB0b3IuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiIG5hbWU9Il90YXNrRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvT2U1dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hb09lNWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIiBuYW1lPSJNZXRob2RQbHVnaW4iPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HcEgyd09mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY1N0FDODAzNUUiPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjU3QUM4MDM1RSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1BLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEF6LUJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1CLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1DT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1DZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1DLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LURPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1EZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotRC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEF6LUFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzQ5NSIgeT0iMzg0MyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEF6LU4tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MDQiIGhlaWdodD0iMTYyNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1PdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1QT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1QdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1RT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotUXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEF6LU5PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1OZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MDQiIHk9IjM3MDgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBei1qZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXota09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXota2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWx1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1tT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQXotaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY2MyIgeT0iMTA1MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZELWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEE5dkUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1MDYiIGhlaWdodD0iMTEzNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Rk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2R09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2R3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZHLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2SE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZIZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dkh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBOXZFT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2RWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDE3NiIgeT0iNjY0NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcEgyd3VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtcyBzaG93cyB0aGUgZGVmaW5pdGlvbiBvZiBNZXRob2QgUGx1Z2lucy4gTWV0aG9kIFBsdWdpbnMgZXh0ZW5kIGVhY2ggb3RoZXIgYW5kIGFyZSB0aGUgY29udGFpbmVyIG9mIGFsbCBNZXRob2QgUGFja2FnZXMuIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3IiBzb3VyY2U9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OTgiIHk9IjMxNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1HZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM1IiB5PSI1ODQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4NyIgeT0iNzc4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1IZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMjQiIHk9IjI3MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1JdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc5MiIgeT0iLTMwMyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1KT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1LT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotTHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1NZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotTXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LU1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQXotRWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEF6LUV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjYwNywgLTI0NSwgMjYwNywgLTI0NV0kWzQ4MTcsIC0yNDUsIDQ4MTcsIC0yNDVdJFs0ODE3LCAxODM3LCA0ODE3LCAxODM3XSRbNTUwLCAxODM3LCA1NTAsIDE4MzddJFs1NTAsIDU3NSwgNTUwLCA1NzVdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEF6LVEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSIgc291cmNlPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1TZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1SLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1TLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjMiIHk9IjM2NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTM5IiB5PSItMjg4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM2IiB5PSI0NTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjUiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1XZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1YZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1YdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1YLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1ZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEF6LVJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1SZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyNTIsIC0xMjcsIC03MDk1LCAtMjVdJFs2NzM5LCAtMTI3LCAtMjYwNywgLTI1XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBei1adWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIHNvdXJjZT0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotYXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1iZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTIiIHk9Ii04NTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMDAiIHk9Ii04ODciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI3MSIgeT0iLTIzMyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1lT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyMSIgeT0iMzIzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotZk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotZ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1oT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZ3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1pT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotaHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1aLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQXotYU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjI1MiwgNTAsIC0yMjUyLCA1MF0kWy00NDg3LCA1MCwgLTQ0ODcsIDUwXSRbLTQ0ODcsIDE4NjIsIC00NDg3LCAxODYyXSRbLTEyMTksIDE4NjIsIC0xMjE5LCAxODYyXSRbLTEyMTksIDgxMiwgLTEyMTksIDgxMl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotaWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQXotbXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQXotbS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzEyLCAtODIxLCAtMzU2NCwgMjE3NV0kWzQwMDQsIC0yNDcyLCAtODcyLCA1MjRdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEE5dkJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFEQzAxMDI4RCIgc291cmNlPSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEF6LWllZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZDdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEE5dkItZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEE5dkNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg4OSwgLTU4NCwgMzU4MSwgMjMxMV0kWy0zNjQ5LCAtMjM3MCwgODIxLCA1MjRdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEE5dkgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDQzBBMDFENyIgc291cmNlPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEE5dkQtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZJLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEE5dklPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEE5dkllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQxMywgODEyLCAtMzI1OSwgLTE4NzldJFszNjkxLCAyMTE2LCAtOTgyLCAtNTc1XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZKdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZKLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBOXZLT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjUxOEJENzAxRTMiIHNvdXJjZT0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBOXZELWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2THVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2TE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBOXZLZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBOXZLdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05OTAsIDU3NSwgMzY4MywgLTIyMThdJFstMzc0MiwgMjIxOCwgOTMxLCAtNTc1XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZMLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZNT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUM1RjAwMkUxIiB0eXBlPSJDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50Ij4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hBOXZNdWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIgZGVzY3JpcHRpb249Int2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50LnR5cGUoKSA9PSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LnR5cGUoKX0gOiB7dmFyYWJpbGl0eSBjYW4gb25seSBiZSBkZWZpbmVkIGJldHdlZW4gQ29udGVudEVsZW1lbnRzIG9mIHRoZSBzYW1lIHN1YnR5cGUsIGUuZy4gUm9sZXMgd2l0aCBSb2xlcywgYnV0IG5vdCBSb2xlcyBhbmQgVGFza3N9IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZNLWZYRWR1cUhvT0piVVJaUnciIHg9IjY3MjMiIHk9Ijc3ODgiIHdpZHRoPSI5NTk2IiBoZWlnaHQ9IjE2MjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBOXZPdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTEyIiBoZWlnaHQ9IjQxNjUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRW51bWVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2UU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2UXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2Uk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEE5dk4tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZPT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTk1IiB5PSIyMjA1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQTl2U2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDk2MSIgaGVpZ2h0PSIxNTc0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dlR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2VC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dlVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ0FlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdBLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQTl2UnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZSLWZYRWR1cUhvT0piVVJaUnciIHg9IjIzODkiIHk9IjExNTkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NjIwMjBGIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCSGdqZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhna3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnbE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ21PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCSGdpdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQkhnaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDYzIiB5PSI5NzM4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQkhnbmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ291ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ3BPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhncGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ3B1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhncC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdxT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQkhnbXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCSGdtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NjYiIHk9IjQxOTQiIHdpZHRoPSI2OTg1IiBoZWlnaHQ9IjE1ODMiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCUXFTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcVZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCUXFSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMDM1IiB5PSI4Mjk1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQlFxYS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFkdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQlFxYU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcWFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDUxNyIgeT0iOTcxNCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcEgyeE9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGhvdyBjb250ZW50IGVsZW1lbnRzIGNhbiBkZWZpbmUgdmFyaWF0aW9ucyBvZiBvbmUgYW5kIGFub3RoZXIuICAiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCSGdxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiIHNvdXJjZT0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhncnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCSGdyZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjAzIiB5PSItMzQ5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFwOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjg3IiB5PSItMjY0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXA5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02MDQiIHk9IjIzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXA5LWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MDYiIHk9Ii0zMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXAtdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0MiIgeT0iMjgxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXBfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcF91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFwXy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcF9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxQS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcUFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFCLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFDLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxQ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCSGdxdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQkhncS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4NTUsIDc4NywgODU1LCA3ODddJFs4NTUsIDE2NTEsIDg1NSwgMTY1MV0kWzY2ODAsIDE2NTEsIDY2ODAsIDE2NTFdJFs2NjgwLCAtNTAsIDY2ODAsIC01MF0kWzM0ODgsIC01MCwgMzQ4OCwgLTUwXSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCUXFET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9IQTl2TWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhncWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxRGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCUXFEdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjcsIC04MjEsIDE4NiwgMTQzOV0kWy0zMTMsIC0yMjYwLCAwLCAwXSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFELWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFFT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCUXFJLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNThCNjAxOEIiIHNvdXJjZT0iX0hCSGdpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxSi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCUXFKT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQlFxSmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3OTUsIC00NDgsIC0xNzQ0LCA0NzgzXSRbNzk1LCAtNDQ1MywgLTE3NDQsIDc3OF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxS3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxSy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQlFxWHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUEwRDMwMjQ1IiBzb3VyY2U9Il9IQlFxUmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcVl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxWC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJRcVlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTU5LCAtMzE3LCAtMTQ1NSwgMzMwN10kWzE1OSwgLTI4MzEsIC0xNDU1LCA3OTNdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcVplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcVp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcWQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyIgc291cmNlPSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFlLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFmLWZYRWR1cUhvT0piVVJaUnciIHg9IjQzNSIgeT0iMTkzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzIwIiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5NCIgeT0iNDA3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzI1IiB5PSIzMzkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFqZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFrZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxai1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFrLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcW1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFsLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJRcWVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCUXFlZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc4NywgMjAzLCA3ODcsIDIwM10kWzE5MTMsIDIwMywgMTkxMywgMjAzXSRbMTkxMywgMTM2MywgMTkxMywgMTM2M10kWzgsIDEzNjMsIDgsIDEzNjNdJFs4LCA0NDgsIDgsIDQ0OF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQmFhOU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU1NjAwMTcwIiBzb3VyY2U9Il9IQlFxWi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYS11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJhYS1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQmFhOWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJhYTl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ0OCwgNTAsIDQ3MzJdJFswLCAtNDM5NCwgNTAsIDc4N10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQmFhLS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQmFhX09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9KeFBmNGV4WkVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfSnhQZjRPeFpFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEE5dlJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSnhQZjVPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0p4UGY1dXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0p4UGY1LXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSnhQZjVleFpFZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9KeFBmNHV4WkVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9KeFBmNC14WkVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlstMjMsIC0zMCwgODgsIDEwM10kWy0xMTYsIC0xNjAsIC01LCAtMjddIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU1N0IyMDAwODciIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYV9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQmFiQWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJhYkJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJhYV91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCYWFfLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwMTMiIHk9IjUyMyIgd2lkdGg9IjMxNDgiIGhlaWdodD0iMTA4MyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T25zT3huRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T25zLXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfazlPbnRPeG5FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rOU9udGV4bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnR1eG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T250LXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T251T3huRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2s5T251ZXhuRWR1d09ia0lBNngxZ0EiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2s5T25zZXhuRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rOU9uc3V4bkVkdXdPYmtJQTZ4MWdBIiB4PSI2MzIiIHk9IjMyMjMiIHdpZHRoPSIzMTQ4IiBoZWlnaHQ9IjEwODMiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2VU94bkVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2VS14bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3p6THZWT3huRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdlZleG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZWdXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2Vi14bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2V094bkVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il96ekx2V2V4bkVkdXdPYmtJQTZ4MWdBIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il96ekx2VWV4bkVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfenpMdlV1eG5FZHV3T2JrSUE2eDFnQSIgeD0iNTM5NiIgeT0iMzIyNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcEgyeHVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifFRoZSBNZXRob2QtUGx1Z2luIHBhY2thZ2UgZGVmaW5lcyBleHRlbnNpYmlsaXR5IGFuZCB2YXJpYWJpbGl0eSBtZWNoYW5pc21zIGZvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgSXQgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eSBpbiBkZWZpbmluZyBkaWZmZXJlbnQgdmFyaWFudHMgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBieSBhbGxvd2luZyBjb250ZW50IGFuZCBwcm9jZXNzIGZyYWdtZW50cyB0byBiZSBwbHVnZ2VkLWluIG9uIGRlbWFuZCBjcmVhdGluZyB0YWlsb3JlZCBvciBzcGVjaWFsaXplZCBjb250ZW50IG9ubHkgd2hlbiBpdCBpcyByZXF1aXJlZCBhbmQgd2hpY2ggY2FuIGJlIG1haW50YWluZWQgYXMgc2VwYXJhdGUgdW5pdHMgd29ya2VkIG9uIGJ5IGRpc3RyaWJ1dGVkIHRlYW1zLiYjeEE7fE1ldGhvZHMgYW5kIFByb2Nlc3NlcyBhcmUgbmV2ZXIgZGV2ZWxvcGVkIGluIGlzb2xhdGlvbi4gIE1hbnkgY29uY3VycmVudCB0ZWFtcyBvZiBwcm9jZXNzIGVuZ2luZWVycyBtaWdodCB3b3JrIG9uIGRpZmZlcmVudCBvciB0aGUgc2FtZSBwYXJ0cyBvZiBhIE1ldGhvZCBDb250ZW50IG9yIHBhcnRpY3VsYXIgUHJvY2Vzc2VzLiAgVGhleSBoYXZlIHRvIGVpdGhlciBjb29yZGluYXRlIHRoZWlyIHdvcmsgb3IgcHJlZmVyYWJseSB0byBtb2R1bGFyaXplIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGRlZmluaXRpb25zIHRoYXQgdGhleSBjYW4gd29yayBvbiBpbiBpc29sYXRpb24gd2l0aG91dCBhbnkgc2hhcmVkIHJlc291cmNlIHByb2JsZW1zLiYjeEE7fE1vcmVvdmVyLCB3b3JrIG9uIGEgZGV2ZWxvcG1lbnQgUHJvY2VzcyBpcyBuZXZlciBmaW5hbCBiZWNhdXNlIHRoZXkgaGF2ZSB0byBiZSB0YWlsb3JlZCBmb3IgZXZlcnkgc3BlY2lmaWMgcHJvamVjdCBzaXR1YXRpb24uICBUbyBhdm9pZCBkZXZlbG9waW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBmcm9tIHNjcmF0Y2ggZm9yIGV2ZXJ5IHNwZWNpZmljIHByb2plY3Qgc2l0dWF0aW9uIGEgdHJ1bHkgcmV1c2FibGUgUHJvY2VzcyBhbGxvd3MgZGVmaW5pbmcgbWFueSBkaWZmZXJlbnQgdmFyaWF0aW9ucyBvbiBpdC4gIFRoZXJlZm9yZSwgdGFpbG9yaW5nIGFuZCBleHRlbnNpb24gb2YgcHJlLWRlZmluZWQgcHJvY2Vzc2VzIGlzIGEga2V5IHJlcXVpcmVtZW50IGZvciBvcmdhbml6YXRpb25zIGFkb3B0aW5nIGFuZCBpbXBsZW1lbnRpbmcgcHJvY2Vzc2VzLiAgIEZvciBleGFtcGxlLCBpbWFnZSBhIHNjZW5hcmlvIGluIHdoaWNoIGEgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHB1cmNoYXNlcyBhIHRoaXJkLXBhcnR5IERlbGl2ZXJ5IFByb2Nlc3MgZnJvbSBhIG1ldGhvZCB2ZW5kb3IgYW5kIGl0cyB1bmRlcmx5aW5nIG1ldGhvZCBjb250ZW50LiAgV2hpbGUgaW1wbGVtZW50aW5nIHRoZSBwcm9jZXNzIGluIHRoZWlyIG9yZ2FuaXphdGlvbiB0aGV5IG1pZ2h0IGRpc2NvdmVyIHRoYXQgdGhleSB3b3VsZCBsaWtlIHRvIHRhaWxvciB0aGUgcHJvY2VzcyB0byB0aGVpciBwYXJ0aWN1bGFyIG5lZWRzIGFuZCBvcmdhbml6YXRpb24gc3BlY2lmaWMgdmFyaWF0aW9ucy4gIElmIHRoZXkgd291bGQgZGlyZWN0bHkgbW9kaWZ5IHRoZSBwdXJjaGFzZWQgcHJvY2VzcyB0aGV5IHdvdWxkIG1pbmdsZSB0aGVpciBhZGRpdGlvbnMgYW5kIGNoYW5nZXMgd2l0aCB0aGUgb3JpZ2luYWwgcHJvY2Vzcy4gIElmIGEgbmV3IHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIHByb2Nlc3MgaXMgcmVsZWFzZWQgYnkgdGhlIHZlbmRvciBpdCB3b3VsZCBiZSB2ZXJ5IGhhcmQgZm9yIHRoZW0gdG8gZmluZCBhbmQgcmVwcm9kdWNlIHRoZXNlIGNoYW5nZXMgdG8gdGhlIG5ldyBwcm9jZXNzIHZlcnNpb24uJiN4QTt8VGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgbW9kdWxhcml6YXRpb24gYW5kIGV4dGVuc2liaWxpdHkgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3NlcyB0byBVTUEuICBJbiBvdGhlciB3b3JkcywgaXQgc3VwcG9ydHMgdGFpbG9yaW5nIG9mIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgdGhlbSwgYnV0IGJ5IGRlc2NyaWJpbmcgY2hhbmdlcyBmcm9tIGEgc2VwYXJhdGUgdW5pdCBjYWxsZWQgYSBNZXRob2QgUGx1Zy1pbi4gIFRoaXMgbmV3IGNhcGFiaWxpdHkgaXMgYWNoaWV2ZWQgYnkgYWRkaW5nIG5ldyBjb25jZXB0cyB0byB0aGUgbWV0YS1tb2RlbDogJiN4QTt8LSBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBsdWdpbnMuICBNZXRob2QgUGx1Z2lucyBhcmUgY29udGFpbmVycyBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaXMgcGFydCBvZiBleGFjdGx5IG9uZSBNZXRob2QgUGx1Z2luLCBpLmUuIE1ldGhvZCBQbHVnaW5zIHBhcnRpdGlvbiB0aGUgc3BhY2Ugb2YgYWxsIE1ldGhvZCBFbGVtZW50cy4gICYjeEE7fC0gTWV0aG9kIFBsdWdpbnMgY2FuIGRlZmluZSBleHRlbnNpb25zIHRvIG90aGVyIE1ldGhvZCBQbHVnaW5zLiAgT25lIE1ldGhvZCBQbHVnaW4gY2FuIGRlZmluZSBleHRlbnNpb25zIGZvciBtYW55IG90aGVyIFBsdWdpbnMgYW5kIGNhbiBiZSBleHRlbmRlZCBieSBtYW55IFBsdWdpbnMuJiN4QTt8LSBUaGUgTWV0aG9kIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgYWRkcyBhIG5ldyBzZXQgb2YgcmVsYXRpb25zaGlwcyBhbmQgc2VtYW50aWNzIHRvIHNwZWNpZmljIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlZmluZSBob3cgdGhlc2UgTWV0aG9kIEVsZW1lbnRzIGNhbiBleHRlbmQgZWFjaCBvdGhlciBhY3Jvc3MgdGhlIGJvdW5kYXJ5IG9mIE1ldGhvZCBQbHVnaW5zIG9yIE1ldGhvZCBQYWNrYWdlcyAodG8gYWxsb3cgbW9kdWxhcml6YXRpb24gZXZlbiB3aXRoaW4gb25lIE1ldGhvZCBQbHVnaW4pLiYjeEE7fFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVmaW5lIHRoZSBkZXRhaWxlZCBydWxlcyBmb3IgdGhlc2UgZXh0ZW5zaW9ucyBmb3Igc3BlY2lmaWMgTWV0aG9kIEVsZW1lbnRzLiYjeEE7Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9SbkllRWV4WkVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfUm5JZUVPeFpFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEJhYV9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfazlPbnNPeG5FZHV3T2JrSUE2eDFnQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUZPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVGdXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVHT3haRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVGLXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUm5JZUZleFpFZHVPTnJNUmdtejQ4QSIgeD0iLTI3IiB5PSI4OTkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfUm5JZUV1eFpFZHVPTnJNUmdtejQ4QSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1JuSWVFLXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzAsIDU1NiwgMjM4MSwgLTIxNDNdJFstMjM4MSwgMjE0MywgMCwgLTU1Nl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il93M3ZOc2V4dUVkdU0xNHVuV2FxUDVRIiBlbGVtZW50PSJfdzN2TnNPeHVFZHVNMTR1bldhcVA1USIgc291cmNlPSJfSEJhYV9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfenpMdlVPeG5FZHV3T2JrSUE2eDFnQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnRPeHVFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3czdk50dXh1RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3czdk51T3h1RWR1TTE0dW5XYXFQNVEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3czdk50LXh1RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdzN2TnRleHVFZHVNMTR1bldhcVA1USIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il93M3ZOc3V4dUVkdU0xNHVuV2FxUDVRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfdzN2TnMteHVFZHVNMTR1bldhcVA1USIgcG9pbnRzPSJbOCwgMjEsIC04MywgLTgxXSRbMzUsIDEyMywgLTU2LCAyMV0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX3JncE1vTVZJRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkNsYXNzIiBuYW1lPSJTbG90RnVsZmlsbG1lbnQiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91Vl9DRWNWSUVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfdVZfQ0VNVklFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdVZfQ0ZNVklFZHkybXVRMlBRdkhfQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il91Vl9DRmNWSUVkeTJtdVEyUFF2SF9BIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3VWX0NGc1ZJRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91Vl9DRjhWSUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdVZfQ0dNVklFZHkybXVRMlBRdkhfQSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdVZfQ0djVklFZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3VWX0NHc1ZJRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdVZfQ0c4VklFZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3VWX0NITVZJRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdVZfQ0hjVklFZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3VWX0NIc1ZJRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdVZfQ0g4VklFZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il91Vl9DSU1WSUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfdVZfQ0VzVklFZHkybXVRMlBRdkhfQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3VWX0NFOFZJRWR5Mm11UTJQUXZIX0EiIHg9IjI4MjgiIHk9IjU1MjYiIGhlaWdodD0iMTU4OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p2enJjTVZNRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p2enJjOFZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfWnZ6cmRNVk1FZHkybXVRMlBRdkhfQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9adnpyZGNWTUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnZ6cmRzVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p2enJkOFZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p2enJlTVZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1p2enJlY1ZNRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnZ6cmVzVk1FZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1p2enJlOFZNRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnZ6cmZNVk1FZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1p2enJmY1ZNRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnZ6cmZzVk1FZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9adnpyZjhWTUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfWnZ6cmNjVk1FZHkybXVRMlBRdkhfQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9adnpyY3NWTUVkeTJtdVEyUFF2SF9BIiB4PSIyNTkxIiB5PSI2MzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcGUtVU1WTUVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcGUtVThWTUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3FwZS1WTVZNRWR5Mm11UTJQUXZIX0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcXBlLVZjVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FwZS1Wc1ZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcGUtVjhWTUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcGUtV01WTUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcXBlLVdjVk1FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcGUtV3NWTUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcXBlLVc4Vk1FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcGUtWE1WTUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcXBlLVhjVk1FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcGUtWHNWTUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3FwZS1YOFZNRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9xcGUtVWNWTUVkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3FwZS1Vc1ZNRWR5Mm11UTJQUXZIX0EiIHg9IjI2NzEiIHk9IjI3NzciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BVExPSWNWT0VkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfQVRMT0lNVk9FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQVRMT0pNVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9BVExPSmNWT0VkeTJtdVEyUFF2SF9BIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FUTE9Kc1ZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BVFVZRU1WT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQVRVWUVjVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQVRVWUVzVk9FZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0FUVVlFOFZPRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQVRVWUZNVk9FZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0FUVVlGY1ZPRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQVRVWUZzVk9FZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0FUVVlGOFZPRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQVRVWUdNVk9FZHkybXVRMlBRdkhfQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9BVFVZR2NWT0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfQVRMT0lzVk9FZHkybXVRMlBRdkhfQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0FUTE9JOFZPRWR5Mm11UTJQUXZIX0EiIHg9IjE0ODAiIHk9Ijc5ODgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9DR3A5OE1WT0VkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9DR3A5ODhWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0NHcDk5TVZPRWR5Mm11UTJQUXZIX0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ0dwOTljVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NHcDk5c1ZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9DR3A5OThWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9DR3A5LU1WT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQ0dwOS1jVk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9DR3A5LXNWT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQ0dwOS04Vk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9DR3A5X01WT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQ0dwOV9jVk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9DR3A5X3NWT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0NHcDlfOFZPRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9DR3A5OGNWT0VkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfQ0dwOThzVk9FZHkybXVRMlBRdkhfQSIgeD0iNjA4MyIgeT0iNzk4NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2R5amRRTVZPRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il9keVpzUU1WT0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9keWpkUThWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2R5amRSTVZPRWR5Mm11UTJQUXZIX0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZHlqZFJjVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2R5amRSc1ZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9keWpkUjhWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9keWpkU01WT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZHlqZFNjVk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9keWpkU3NWT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZHlqZFM4Vk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9keWpkVE1WT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZHlqZFRjVk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9keWpkVHNWT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2R5amRUOFZPRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9keWpkUWNWT0VkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZHlqZFFzVk9FZHkybXVRMlBRdkhfQSIgeD0iNDQ3MCIgeT0iNzk4OSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9yZ3BNb2NWSUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9sR1BZTWNWTUVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfbEdQWU1NVk1FZHkybXVRMlBRdkhfQSIgc291cmNlPSJfdVZfQ0VjVklFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfcXBlLVVNVk1FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbEdQWU5NVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2xHWWlJTVZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2xHWWlJY1ZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbEdQWU5jVk1FZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9sR1BZTXNWTUVkeTJtdVEyUFF2SF9BIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9sR1BZTThWTUVkeTJtdVEyUFF2SF9BIiBwb2ludHM9IlstMiwgLTEyLCAxNCwgOTldJFstMTYsIC04NSwgMCwgMjZdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfcXBlLVlNVk1FZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzI3MDEwNiIgc291cmNlPSJfcXBlLVVNVk1FZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfWnZ6cmNNVk1FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcXBvSVFNVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3Fwb0lRc1ZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3Fwb0lROFZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcXBvSVFjVk1FZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9xcGUtWWNWTUVkeTJtdVEyUFF2SF9BIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfcXBlLVlzVk1FZHkybXVRMlBRdkhfQSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfYTQyaHNNVk5FZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iX2E0am13TVZORWR5Mm11UTJQUXZIX0EiIHNvdXJjZT0iX3VWX0NFY1ZJRWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX3VWX0NFY1ZJRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0MmhzOFZORWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJodGNWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJodHNWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2E0Mmh0TVZORWR5Mm11UTJQUXZIX0EiIHg9IjUzMCIgeT0iMzQ0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh0OFZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9hNGpteE1WTkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh1Y1ZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYTQyaHVNVk5FZHkybXVRMlBRdkhfQSIgeD0iMjciIHk9Ii01MDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHVzVk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9hNGpteE1WTkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh2TVZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2E0Mmh1OFZORWR5Mm11UTJQUXZIX0EiIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHZjVk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfYTRqbXdjVk5FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJodjhWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYTQyaHZzVk5FZHkybXVRMlBRdkhfQSIgeD0iLTU1NyIgeT0iLTE4NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJod01WTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfYTRqbXdjVk5FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJod3NWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2E0Mmh3Y1ZORWR5Mm11UTJQUXZIX0EiIHg9Ii0xODYiIHk9IjMxNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJodzhWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfYTRqbXhNVk5FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJoeGNWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2E0Mmh4c1ZORWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9hNDJoeE1WTkVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh4OFZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2E0am13Y1ZORWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHljVk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9hNDJoeXNWTkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYTQyaHlNVk5FZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJoeThWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2E0am14TVZORWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHpjVk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9hNDJoenNWTkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYTQyaHpNVk5FZHkybXVRMlBRdkhfQSIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJoejhWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfYTRqbXdjVk5FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJoMGNWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfYTQyaDBzVk5FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2E0MmgwTVZORWR5Mm11UTJQUXZIX0EiIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfYTQyaHNjVk5FZHkybXVRMlBRdkhfQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2E0Mmhzc1ZORWR5Mm11UTJQUXZIX0EiIHBvaW50cz0iWzE2OTMsIDUzLCAxNjkzLCA1M10kWzMzMzQsIDUzLCAzMzM0LCA1M10kWzMzMzQsIC0xNTYxLCAzMzM0LCAtMTU2MV0kWzEzNDksIC0xNTYxLCAxMzQ5LCAtMTU2MV0kWzEzNDksIC03OTQsIDEzNDksIC03OTRdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZzU3ZDRjVk9FZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iX2c1N2Q0TVZPRWR5Mm11UTJQUXZIX0EiIHNvdXJjZT0iX0FUTE9JY1ZPRWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX3VWX0NFY1ZJRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2c2Rk80TVZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nNkZPNHNWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nNkZPNDhWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2c2Rk80Y1ZPRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZzU3ZDRzVk9FZHkybXVRMlBRdkhfQSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZzU3ZDQ4Vk9FZHkybXVRMlBRdkhfQSIgcG9pbnRzPSJbOCwgLTEyLCAtNTUsIDYzXSRbLTIsIC03NiwgLTY1LCAtMV0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oWUxnSU1WT0VkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfaFlCdklNVk9FZHkybXVRMlBRdkhfQSIgc291cmNlPSJfZHlqZFFNVk9FZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfdVZfQ0VjVklFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaFlMZ0k4Vk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hZTGdKY1ZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hZTGdKc1ZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaFlMZ0pNVk9FZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oWUxnSWNWT0VkeTJtdVEyUFF2SF9BIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oWUxnSXNWT0VkeTJtdVEyUFF2SF9BIiBwb2ludHM9IlstNCwgLTEyLCAxOSwgNjNdJFstMjQsIC0xMDUsIC0xLCAtMzBdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaHkycDhjVk9FZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iX2h5MnA4TVZPRWR5Mm11UTJQUXZIX0EiIHNvdXJjZT0iX0NHcDk4TVZPRWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX3VWX0NFY1ZJRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2h5MnA5TVZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oeTJwOXNWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oeTJwOThWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2h5MnA5Y1ZPRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaHkycDhzVk9FZHkybXVRMlBRdkhfQSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaHkycDg4Vk9FZHkybXVRMlBRdkhfQSIgcG9pbnRzPSJbLTE3LCAtMTIsIDc3LCA2M10kWy05MSwgLTQ1LCAzLCAzMF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1JuSWVFT3haRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiLz4NCi0gICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfdzN2TnNPeHVFZHVNMTR1bldhcVA1USIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCIvPg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ZUDh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCI+DQotICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLg0KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLg0KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuDQotPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFEQzAxMDI4RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI1MThCRDcwMUUzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIi8+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUFFNzA3MzAzQjgiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0tBZl9BQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUFFNzA3MzAzQjgiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RGVmaW5lcyBpZiBhIG1ldGhvZCBwbHVnLWluIGlzIGxvY2tlZCBmb3IgY2hhbmdlcyBvciBub3QuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9Hb1lQOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfcHNMX2tDWDNFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNTdXBwb3J0aW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX1RsRDY4Q1g0RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il9wc0xfa0NYM0VkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgc3VwcG9ydGluZyBtZXRob2QgcGx1Zy1pbiBpcyBhIHBsdWctaW4gdGhhdCBjb250YWlucyBzdXBwb3J0aW5nIGFuZCBvcHRpb25hbCBtZXRob2QgZWxlbWVudHMuIE9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgZnJvbSBub24tc3VwcG9ydGluZyBwbHVnLWluIGFyZSB0byBiZSBjb25zaWRlcmVkIGZvciBpbmNsdXNpb24gaW50byBhIG1ldGhvZCBjb25maWd1cmF0aW9uLiBJbiBvdGhlciB3b3JkcywgaWYgYSBzdXBwb3J0aW5nIG1ldGhvZCBwbHVnLWluIGlzIHNlbGVjdGVkIGZvciBhIGNvbmZpZ3VyYXRpb24gb25seSBpdHMgZWxlbWVudHMgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgb2YgdGhpcyBwbHVnLWluIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uICBBbGwgb3RoZXIgdW5yZWZlcmVuY2VkIGVsZW1lbnRzIHdpbGwgbm90IGJlLiA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0hzOUVnQ1g0RWQyS25KMnlqTlhoV1EiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4IiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSI+DQotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRndlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1Gd09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIiBuYW1lPSJiYXNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyI+DQotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GeWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTQ5NjIwMjBGIiBuYW1lPSJDb250ZW50RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ZUC1lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OTYyMDIwRiI+DQotICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLg0KLUNvbnRlbnQgRWxlbWVudCBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQuDQotPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1OEI2MDE4QiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSIgbmFtZT0iTWV0aG9kRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ZUF91ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSI+DQotICAgICAgICAgICAgPGJvZHk+TWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE4QUNBMEEwMEVCIiBuYW1lPSJzdXBwcmVzc2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvaUE0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MThBQ0EwQTAwRUIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dvaUE1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzOEU5NEQwMDNGIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29pQTUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzhFOTREMDAzRiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il85clFQa2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzlyUVBrT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOWh0NUVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDAyMDJFQyIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBNnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIj4NCi0gICAgICAgICAgICA8Ym9keT5WYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjlDNkEzMDMzOCIgbmFtZT0ibmEiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29pQTdlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjlDNkEzMDMzOCI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBkZWZhdWx0ICZxdW90O25vdCBhc3NpZ25lZCZxdW90OyB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDFGMDNDMCIgbmFtZT0iY29udHJpYnV0ZXMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzB1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMDFGMDNDMCI+DQotICAgICAgICAgICAgICA8Ym9keT5Db250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoNCi1hdHRyaWJ1dGUgdmFsdWVzOglTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgY29uY2F0ZW5hdGVkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBPdGhlciB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIGFueSBvdGhlciB0eXBlIHN1Y2ggYXMgSW50ZWdlciwgRGF0ZSBhcmUgaWdub3JlZC4NCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLg0KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGtlcHQgYW5kIGFueSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBjb250cmlidXRpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGlnbm9yZWQuDQotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBhZGRlZCB0byB0aGUgYWxyZWFkeSBleGlzdGluZyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIGVsZW1lbnQuICBJZiBib3RoIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB0aGVuIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBhc3NvY2lhdGlvbiB3aWxsIHJlbWFpbi4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDE4MDFFMCIgbmFtZT0iZXh0ZW5kcyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLMWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMTgwMUUwIj4NCi0gICAgICAgICAgICAgIDxib2R5PkV4dGVuc2lvbiBhbGxvd3MgTWV0aG9kIFBsdWdpbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBCYXNlIFBsdWdpbiBieSBwcm92aWRpbmcgYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgQXR0cmlidXRlIHZhbHVlcyBhbmQgQXNzb2NpYXRpb24gaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHJlc3VsdCBvZiBpbnRlcnByZXRhdGlvbiBpcyB0aGF0IHRoZSBzcGVjaWFsIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlIGJhc2VkLW9uIGhhcywgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gIEhlbmNlIGV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5IGNvbnRlbnQgb2YgdGhlIGJhc2UgUGx1Z2luLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZyBQbHVnaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQgKGUuZy4gYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiByZXZpZXcpLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcgVmFyaWFiaWxpdHkgRWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB2aWEgdGhlIGV4dGVuZHMgcmVsYXRpb25zaGlwLiAgRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIENhcGFiaWxpdHkgUGF0dGVybnMgdG8gUHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcHMgZnJvbSBhbiBBY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgUHJvY2Vzc2VzIHRvIHRoZSBQYXR0ZXJuLiAgVGhlIEFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9ucyBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycyB0byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgUHJvY2VzcyBhZnRlciBJbnRlcnByZXRhdGlvbi4NCi1hdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgZWxlbWVudCBhcmUgaW5oZXJpdGVkIGFuZCB1c2VkIHRvIHBvcHVsYXRlIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGF0dHJpYnV0ZXMuICBJZiB0aGUgc3BlY2lhbCBlbGVtZW50IGF0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcG9wdWxhdGVkIHRoZSBpbmhlcml0ZWQgdmFsdWVzIGFyZSBpZ25vcmVkLiAgDQotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4NCi0wLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyBpdHMgb3duIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gdGhlIGluaGVyaXRlZCBvbmUgaXMgaWdub3JlZC4NCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIGRlZmluZWQgZm9yIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSBzcGVjaWFsIGVsZW1lbnQgY2FuIGFkZCBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIGluc3RhbmNlcy4NCi0NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDFDMDI4NiIgbmFtZT0icmVwbGFjZXMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzJPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMDFDMDI4NiI+DQotICAgICAgICAgICAgICA8Ym9keT5SZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoNCi1hdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGluY2x1ZGluZyB1bmFzc2lnbmVkIHZhbHVlcy4NCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLg0KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc29jaWF0aW9uIGluc3RhbmNlIGZyb20gdGhlIHJlcGxhY2luZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGFsc28gbm90IGhhdmUgYW4gYXNzb2NpYXRpb24uDQotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IHJlcGxhY2UgYWxsIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4NCi0NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NjI4RTRCMDEzMyIgbmFtZT0ibG9jYWxDb250cmlidXRpb24iLz4NCi0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDYyOEU1RTAxM0IiIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4NCi0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NUM4RDY3MDAyQTkiIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLM3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ij4NCi0gICAgICAgICAgICA8Ym9keT5WYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuDQotVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4NCi1WYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuDQotVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4NCi08L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfSnhQZjRPeFpFZHVPTnJNUmdtejQ4QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSIvPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwRTYwM0M3IiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjZCMDAyMDJFQyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLNHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwRTYwM0M3Ij4NCi0gICAgICAgICAgICAgIDxib2R5PklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR28wNzBlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Ym9keT5uYTwvYm9keT4NCi0gICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCI+DQotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRjAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GMHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCIgbmFtZT0iU2VjdGlvbiI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28wNzAtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCI+DQotICAgICAgICAgICAgPGJvZHk+U2VjdGlvbiBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgZXh0ZW5kcyBTZWN0aW9uIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgOjogQmFzaWMgRWxlbWVudHMgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4gDQotRm9yIGV4YW1wbGUsIHdoZW4gYSBUYXNrIGNvbnRyaWJ1dGVzIHRvIGFub3RoZXIgVGFzayBpdHMgUHJlc2VudGF0aW9uIGFzc29jaWF0aW9uIGlzIGNvbnRyaWJ1dGVkIGluY2x1ZGluZyBpdHMgU2VjdGlvbnMgKGkuZS4gaXRzIFN0ZXBzKSwgd2hpY2ggYXJlIG1vZGVsZWQgYXMgcGFydHMgb2YgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBTZWN0aW9ucyBjYW4gYmUgbmVzdGVkIGFuZCB0aGVyZWZvcmUgVGFzayBEZXNjcmlwdGlvbnMgY2FuIGJlIGZsZXhpYmx5IG9yZ2FuaXplZCBpbiBTdGVwcyB3aXRoIHN1Yi1TdGVwcy4gIFNlY3Rpb25zIGFyZSBWYXJpYWJpbGl0eSBFbGVtZW50cyB0aGVtc2VsdmVzLCBzbyB0aGV5IGNhbiBjb250cmlidXRlIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIG1vZGVsIGEgVGFzayBzdGVwIGFzIGEgU2VjdGlvbiBpbnN0YW5jZSB3aXRob3V0IHJlbGF0aW5nIGl0IHRvIGEgVGFzayBEZXNjcmlwdGlvbiB0aGF0IGRpcmVjdGx5IGNvbnRyaWJ1dGVzIHRvIChvciByZXBsYWNlcykgYW5vdGhlciBTZWN0aW9uIHdoaWNoIGlzIHBhcnQgb2YgYSBUYXNrIERlc2NyaXB0aW9uLiAgVGhpcyBjb250cmlidXRpb24gKG9yIHJlcGxhY2VtZW50KSB3b3VsZCBhZGQgbmV3IGRlc2NyaXB0aW9uIHRleHQgdG8gdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24gKG9yIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24pLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnRyaWJ1dGUgbmV3IENoZWNrIExpc3QgaXRlbXMgb3JnYW5pemVkIGFzIFNlY3Rpb25zIHRvIGFuIGV4aXN0aW5nIENoZWNrIExpc3QgKGRlZmluZWQgYXMgZ3VpZGFuY2UpLiAgDQotDQotPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk1NTYwMDE3MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIvPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIiBuYW1lPSJwcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyI+DQotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRjJlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GMk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIiBuYW1lPSJBY3Rpdml0eSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28wNzJPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FBMEFFMDM5RCI+DQotICAgICAgICAgICAgPGJvZHk+QWN0aXZpdHkgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gZXh0ZW5kIEFjdGl2aXR5IHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuJiN4RDsNCi1BY3Rpdml0eSBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2hpY2ggcHJvdmlkZXMga2V5IG1lY2hhbmlzbSB0byBlbmFibGUgZHluYW1pYyBiaW5kaW5nIG9mIENhcGFiaWxpdHkgUGF0dGVybnMgaW4gUHJvY2Vzc2VzIGFzIHdlbGwgYXMgUHJvY2VzcyBDb250cmlidXRpb25zLiAgVmFyaWFiaWxpdHkgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheSBmb3IgQWN0aXZpdGllczomI3hEOw0KLS0gRXh0ZW5kOiBUbyBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBhIHByb2Nlc3Mgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSB3aGljaCBleHRlbmRzIHRoZSBwYXR0ZXJuJ3MgdG9wLWxldmVsIGFjdGl2aXR5LiAgVGhyb3VnaCBleHRlbnNpb24gdGhlIGV4dGVuZGluZyBBY3Rpdml0eSBpbmhlcml0cyB0aGUgcGF0dGVybnMgQnJlYWtkb3duIEVsZW1lbnRzLiYjeEQ7DQotLSBSZXBsYWNlOiBUbyByZXBsYWNlIGFuIEFjdGl2aXR5IG9mIGFuIGFwcGxpZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIGFuIGV4aXN0aW5nIHByb2Nlc3MgZm9yIHdoaWNoIG9uZSBkZXZlbG9wcyBhIFByb2Nlc3MgQ29udHJpYnV0aW9uIChvciBhIGNvbWJpbmF0aW9uIG9mIGJvdGgpIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgYW5kIHNwZWNpZnkgdGhlIHJlcGxhY2UgdmFyaWFiaWxpdHkgc3BlY2lhbGl6YXRpb24gYmV0d2VlbiB0aGVtLiYjeEQ7DQotLSBDb250cmlidXRlOiBUbyBjb250cmlidXRlIG5ldyBCcmVha2Rvd24gRWxlbWVudHMgdG8gYW4gZXhpc3RpbmcgQWN0aXZpdHkgb25lIHdvdWxkIGRlZmluZSBhbiBBY3Rpdml0eSB3aXRoIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlbGF0ZXMgdmlhIHRoZSBDb250cmlidXRlcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0byB0aGlzIGV4aXN0aW5nIEFjdGl2aXR5LiAgVGhlIGNvbnRyaWJ1dGluZyBBY3Rpdml0eSdzIEJyZWFrZG93biBFbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250cmlidXRlZCBBY3Rpdml0eS4mI3hEOw0KLSYjeEQ7DQotPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FBMEQzMDI0NSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIvPg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaHkycDhNVk9FZHkybXVRMlBRdkhfQSIgZ2VuZXJhbD0iX3VWX0NFTVZJRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbzA3M2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1Ij4NCi0gICAgICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhhdCBldmVyeSBNZXRob2QgUGFja2FnZSAoZWl0aGVyIENvbnRlbnQgUGFja2FnZSwgUHJvY2VzcyBQYWNrYWdlLCBvciBQcm9jZXNzIENvbXBvbmVudCkgaXMgcGFydCBvZiBleGFjdGx5IG9uZSBNZXRob2QgUGx1Z2luLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiIG5hbWU9Il9tZXRob2RQbHVnaW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSI+DQotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28wNzRlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbzA3NE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyIgbmFtZT0iRXh0ZW5zaW9uIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTggXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28tRnctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyI+DQotICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGhvdyBNZXRob2QgUGx1Z2lucyBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucy4gIFRoZSBleHRlbmRpbmcgcGx1Zy1pbiBjb250YWlucyBuZXcgbWV0aG9kIGVsZW1lbnRzLCBleHRlbmRzIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cyBhbmQgcHJvY2Vzc2VzIHVzaW5nIGNvbnRlbnQgZWxlbWVudCB2YXJpYWJpbGl0eSBtZWNoYW5pc21zIChlLmcuIGNvbnRyaWJ1dGlvbiwgcmVwbGFjZSwgZXRjLiksIHByb3ZpZGVzIGFkZGl0aW9uYWwgRGVsaXZlcnkgYW5kIENhcGFiaWxpdHkgUHJvY2Vzc2VzIGZvciBhIE1ldGhvZCBGcmFtZXdvcmssIGV0Yy48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4IiBuYW1lPSJwbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3Ij4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GeC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUZ4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiIG5hbWU9InZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24iIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSBfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hby1Gek9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EwIj4NCi0gICAgICAgICAgICA8Ym9keT5UaGlzIDEtdG8tbWFueSBhc3NvY2lhdGlvbiBkZWZpbmVzIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgdGhhdCBhIG51bWJlciBvZiBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgcmVwcmVzZW50IGEgdmFyaWF0aW9uIG9mIGV4YWN0bHkgb25lIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiIG5hbWU9InZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiPg0KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUYwT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRnotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIF8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvLUYxZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NTAyMTMiPg0KLSAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSBvcmRlciBpbiB3aGljaCBjb250cmlidXRlZCBTZWN0aW9ucyBzaGFsbCBiZSBpbnNlcnRlZCBpbnRvIGFuICBleGlzdGluZyBsaXN0IG9mIFNlY3Rpb25zIG1haW50YWluZWQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbi48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIj4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GM09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUYyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il91Vl9DRU1WSUVkeTJtdVEyUFF2SF9BIiBuYW1lPSJGdWxmaWxsYWJsZUVsZW1lbnQiPg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfbEdQWU1NVk1FZHkybXVRMlBRdkhfQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIvPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfYTRqbXdjVk5FZHkybXVRMlBRdkhfQSIgbmFtZT0iZnVsZmlsbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3VWX0NFTVZJRWR5Mm11UTJQUXZIX0EiIGFzc29jaWF0aW9uPSJfYTRqbXdNVk5FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYTRqbXc4Vk5FZHkybXVRMlBRdkhfQSIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9hNGptd3NWTkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfYTRqbXdNVk5FZHkybXVRMlBRdkhfQSIgbmFtZT0iRnVsZmlsbG1lbnQiIG1lbWJlckVuZD0iX2E0am13Y1ZORWR5Mm11UTJQUXZIX0EgX2E0am14TVZORWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfYTRqbXhNVk5FZHkybXVRMlBRdkhfQSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdVZfQ0VNVklFZHkybXVRMlBRdkhfQSIgYXNzb2NpYXRpb249Il9hNGptd01WTkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9hNHN3c2NWTkVkeTJtdVEyUFF2SF9BIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2E0c3dzTVZORWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9BVExPSU1WT0VkeTJtdVEyUFF2SF9BIiBuYW1lPSJXb3JrUHJvZHVjdCI+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9nNTdkNE1WT0VkeTJtdVEyUFF2SF9BIiBnZW5lcmFsPSJfdVZfQ0VNVklFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2R5WnNRTVZPRWR5Mm11UTJQUXZIX0EiIG5hbWU9IlJvbGUiPg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaFlCdklNVk9FZHkybXVRMlBRdkhfQSIgZ2VuZXJhbD0iX3VWX0NFTVZJRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0IiIG5hbWU9Ik1ldGhvZENvcmUiPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HdlBGMHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY4N0I0RTAzNEEiPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjg3QjRFMDM0QSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGY2dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhmNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhmNS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZjZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTYyMyIgeT0iMTQ1MTgiIHdpZHRoPSI0NDAyIiBoZWlnaHQ9IjE2ODQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGY5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhmLWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhmOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZjh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTUxMCIgeT0iMTE0MTIiIHdpZHRoPSI0NDMyIiBoZWlnaHQ9IjE2NzYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmLXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGZfdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZl8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnQS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhmLS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZl9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iODI0MiIgd2lkdGg9IjQ1MzciIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdCT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZ0NPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdEZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGdCZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhnQnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSI0OTQwIiB3aWR0aD0iNDUzNyIgaGVpZ2h0PSIxNjc2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhnSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ0tlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZ0llZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGdJdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjIyMTkiIHdpZHRoPSI0MTE0IiBoZWlnaHQ9IjE2NzYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGdMdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnTS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhnSy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZ0xPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2OCIgeT0iNjk3NCIgd2lkdGg9IjQ3MjAiIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VRT3hkRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VRLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfeDRHdVJPeGRFZHVIamUzcFBhaE40QSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1UmV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVJ1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VSLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0UDRNT3hkRWR1SGplM3BQYWhONEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3g0UDRNZXhkRWR1SGplM3BQYWhONEEiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3g0R3VRZXhkRWR1SGplM3BQYWhONEEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il94NEd1UXV4ZEVkdUhqZTNwUGFoTjRBIiB4PSI5NjIzIiB5PSIxNzQ4NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDVEJrT3g1RWR1NS12VmpsZlZzZlEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDVEJrLXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfWkNUQmxPeDVFZHU1LXZWamxmVnNmUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aQ2N5a094NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNjeWtleDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrdXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrLXg1RWR1NS12VmpsZlZzZlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1pDY3lsT3g1RWR1NS12VmpsZlZzZlEiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1pDVEJrZXg1RWR1NS12VmpsZlZzZlEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9aQ1RCa3V4NUVkdTUtdlZqbGZWc2ZRIiB4PSIxNDI2NSIgeT0iMTc0ODciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3ZQRjFPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGRlZmluZXMgdGhlIGZ1bmRhbWVudGFsIGNvbmNlcHRzIGZvciBkZXNjcmliaW5nIGFuZCBvcmdhbml6aW5nIG1ldGhvZCBjb250ZW50LiAgVGhlIHBhY2thZ2UgaXRzZWxmIHByb3ZpZGVzIGxheWVycyBhcyBkZXBpY3RlZCBpbiBkaWFncmFtIHRoYXQgZ3JhZHVhbGx5IGV4dGVuZCB0aGUgY29yZSBjb25jZXB0cyB3aXRoIG1vcmUgYW5kIG1vcmUgY2FwYWJpbGl0aWVzIChpLmUuIHN1cHBvcnRpbmcgY2xhc3NlcywgYWRkaXRpb25hbCBhdHRyaWJ1dGVzLCBhbmQgcmVsYXRpb25zaGlwcykuIFRoZSBCYXNpYyBFbGVtZW50cyBwYWNrYWdlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBmcm9tIHdoaWNoIGFsbCBjbGFzc2VzIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBoYXZlIGJlZW4gZGVyaXZlZC4gIENvcmUgQ29udGVudCBFbGVtZW50cyBkZWZpbmVzIHRoZSBjb3JlIGVsZW1lbnRzIG9mIGV2ZXJ5IG1ldGhvZCBzdWNoIGFzIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMuICBUaGUgbmV4dCBsYXllciBhZGRzIGRpZmZlcmVudCB0eXBlcyBvZiBndWlkYW5jZSB0byB0aGUgY29yZSBlbGVtZW50cyBzdWNoIGFzIHdvcmsgcHJvZHVjdCB0ZW0tcGxhdGVzLCBndWlkZWxpbmVzLCBvciBjaGVja2xpc3RzLiAgVGhlIENhdGVnb3JpZXMgcGFja2FnZSBwcm92aWRlcyBwcmUtZGVmaW5lZCBhcyB3ZWxsIGFzIHVzZXItZGVmaW5hYmxlIGNhdGVnb3JpemF0aW9ucyBvZiBjb3JlIGNvbnRlbnQgZWxlbWVudHMgYXMgd2VsbCBhcyBndWlkYW5jZSB0eXBlcy4gIFRoZSBNZXRob2QgQ29udGVudCBEZXNjcmlwdGlvbnMgYWRkcyBwcm9wZXJ0aWVzIGZvciBkZXRhaWxlZCBjb250ZW50IGRlc2NyaXB0aW9ucyB0byB0aGUgZWxlbWVudHMgZGVmaW5lZCBiZWxvdy4gIFRoZXNlIGRlc2NyaXB0aW9ucyBhcmUgb3B0aW9uYWwgYWRkaXRpb25zLCB3aGljaCBhbiBpbXBsZW1lbnRlciBvZiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZnJlZSB0byBjaG9vc2UgZnJvbS4gIEZpbmFsbHksIE1ldGhvZCBQYWNrYWdlIGRlLWZpbmVzIGhvdyB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiBhbGwgZm91ciBsYXllcnMgYmVsb3cgY2FuIGJlIG9yZ2FuaXplZCBpbiBwYWNrYWdlIGhpZXJhcmNoaWVzLiIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfTjE5bGNleE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX04xOWxjT3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hJSGYtdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxkT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZHV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZU94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZC14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX04xOWxkZXhNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfTjE5bGN1eE1FZHVPTnJNUmdtejQ4QSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX04xOWxjLXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzIsIDMzLCAwLCAtODVdJFsyLCAxNTAsIDAsIDMyXSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0NzRVFJT3hkRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9DcjZmSU94ZEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmNXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSS14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ3NFUUpleGRFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ3NFUUoteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ3NFUUp1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Dc0VRSk94ZEVkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0NzRVFJZXhkRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0NzRVFJdXhkRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy0xODUsIDg3MywgLTIxNDMsIC01NDI0XSRbLTE4NSwgMzY1MSwgLTIxNDMsIC0yNjQ2XSRbMTI0NCwgNTQyNCwgLTcxNCwgLTg3M10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oVjFsRU94NUVkdTUtdlZqbGZWc2ZRIiBpZD0iKDAuNDYxNjQyNiwwLjc3NTY1NjM0KSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2RkdHRzT3hkRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9kZGo4c094ZEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnQk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmLXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0cy14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZGR0dHRleGRFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZGR0dHQteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZGR0dHR1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9kZHR0dE94ZEVkdUhqZTNwUGFoTjRBIiB4PSItMzgxIiB5PSIxMzM0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2RkdHRzZXhkRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2RkdHRzdXhkRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWzIsIDMyLCAyLCAtOTJdJFsxNiwgMTU3LCAxNiwgMzNdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZWFXOElleGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX2VhVzhJT3hkRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdCT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhKT3hkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lYVc4SnV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lYVc4S094ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lYVc4Si14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2VhVzhKZXhkRWR1SGplM3BQYWhONEEiIHg9IjcwMCIgeT0iLTEzMDIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZWFXOEl1eGRFZHVIamUzcFBhaE40QSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2VhVzhJLXhkRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWzk1MywgODc0LCAtOTAwLCAtNTYwOV0kWzk1MywgMjAzOCwgLTkwMCwgLTQ0NDVdJFszMDk2LCAyMDM4LCAxMjQzLCAtNDQ0NV0kWzMwOTYsIDU5MjcsIDEyNDMsIC01NTZdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfVlBSM01PeGVFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX1ZQSUdNT3hlRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdLdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGYtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNNLXhlRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9WUFIzTmV4ZUVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9WUFIzTi14ZUVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9WUFIzTnV4ZUVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1ZQUjNOT3hlRWR1SGplM3BQYWhONEEiIHg9Ii0xMzMiIHk9IjQ0MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9WUFIzTWV4ZUVkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9WUFIzTXV4ZUVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstOTAsIDExLCAyMzksIC0xXSRbLTI0NSwgNDMsIDg0LCAzMV0iLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9XdGRGWU94ZUVkdUhqZTNwUGFoTjRBIiBpZD0iKDAuNzcxNjU1MjYsMC43NDM0MzY3NSkiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9SS0VEWWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfUktFRFlPeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZ0t1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRFpPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JLRURadXhnRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JLRURhT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JLRURaLXhnRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUktFRFpleGdFZHVIamUzcFBhaE40QSIgeD0iLTQ4MSIgeT0iLTQ4NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9SS0VEWXV4Z0VkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9SS0VEWS14Z0VkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstMjA5MCwgNDc2LCAzOTQzLCAtNDI4N10kWy02MDU5LCAxNDAzLCAtMjYsIC0zMzYwXSRbLTYwNTksIDQyMDcsIC0yNiwgLTU1Nl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ScUdPVWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfUnFHT1VPeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1ZPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09WdXhnRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09XT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09WLXhnRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUnFHT1ZleGdFZHVIamUzcFBhaE40QSIgeD0iMjYiIHk9Ii03MTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfUnFHT1V1eGdFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUnFHT1UteGdFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbNiwgMzMsIC0yLCAtNzBdJFs5NSwgMTEwLCA4NywgN10iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ub3lUTWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfbm95VE1PeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfeDRHdVFPeGRFZHVIamUzcFBhaE40QSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE5PeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25veVROdXhnRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25veVRPT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25veVROLXhnRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbm95VE5leGdFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ub3lUTXV4Z0VkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ub3lUTS14Z0VkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstNywgMzMsIC02LCAtNzBdJFstNywgMTMxLCAtNiwgMjhdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfYzYybmdPeDVFZHU1LXZWamxmVnNmUSIgZWxlbWVudD0iX2M2dGRrT3g1RWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iX0hJSGY1dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX1pDVEJrT3g1RWR1NS12VmpsZlZzZlEiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5nLXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuaGV4NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuaC14NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuaHV4NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2M2Mm5oT3g1RWR1NS12VmpsZlZzZlEiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfYzYybmdleDVFZHU1LXZWamxmVnNmUSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfYzYybmd1eDVFZHU1LXZWamxmVnNmUSIgcG9pbnRzPSJbNDEsIDMzLCAtMTM0LCAtNzRdJFs5MSwgMTA4LCAtODQsIDFdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0QzNzAxRUQiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUTdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iMTA4MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUS1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlE2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJRNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA1MCIgeT0iMTEwMTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRLWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlFfZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzOTk2IiBoZWlnaHQ9IjEwODMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlFfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJDT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJRLXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3NzkiIHk9IjExMDE4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJSRGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzcwOCIgaGVpZ2h0PSIxMTM0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJFdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJGT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJGdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSR09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUkN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlJDLWZYRWR1cUhvT0piVVJaUnciIHg9IjczMDgiIHk9IjgzNDgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSR2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJIZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzA4IiBoZWlnaHQ9IjEwODMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJLT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJSR3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUkctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1MTYiIHk9IjExMDE4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUktlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJSTGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJNdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJOT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJOdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJST09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUkt1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlJLLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDQyIiB5PSI4MzU2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJSUGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQ3MCIgaGVpZ2h0PSIxMTM0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJRdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJST2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJSdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSU09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUk91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlJPLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NzY2IiB5PSI4MzQ4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFhNy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWE5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWE5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWEtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFhLXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElhYTdPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWE3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTA3IiB5PSI4MzU2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFiUWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzA2NCIgaGVpZ2h0PSIxMDgzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJSdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJTT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJTdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiVE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElhYlB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWJQLWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1MDUiIHk9IjU2NzEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJYWJhdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJkZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWFiWi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYmFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyMCIgeT0iMzAxMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElhYmV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iMTEzNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJYWJkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFiZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTkzIiB5PSIzMTciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa0wxLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa0w0dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtMMU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTDFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2NjYiIHk9IjU2NjEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa01GT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDM3IiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTUdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTUctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTUhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01ILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc2MyIgeT0iMzAwMyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01LZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01MT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTUxlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01NT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01NZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01NLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01OZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01OLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTU9PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01LdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNSy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTA0IiB5PSIzMDEwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtNVC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSI5OTAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01VZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNV2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01XdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNVE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI0NDMiIHk9IjI5OTEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa01hT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTWJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTWItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTWNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01jLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNWmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3MTAiIHk9IjMwMDkiIHdpZHRoPSI0NDE3IiBoZWlnaHQ9Ijk3OSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA0T29sRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA0LW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfZUhPMDVPb2xFZHVWQTd2dDVxYklKUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNWVvbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDV1b2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA1LW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA2T29sRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wNmVvbEVkdVZBN3Z0NXFiSUpRIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA2dW9sRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wNi1vbEVkdVZBN3Z0NXFiSUpRIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA3T29sRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wN2VvbEVkdVZBN3Z0NXFiSUpRIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA3dW9sRWR1VkE3dnQ1cWJJSlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZUhPMDctb2xFZHVWQTd2dDVxYklKUSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2VITzA0ZW9sRWR1VkE3dnQ1cWJJSlEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9lSE8wNHVvbEVkdVZBN3Z0NXFiSUpRIiB4PSIzMzE5IiB5PSI4MzU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d2UEYxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJYWEwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMEYiIHNvdXJjZT0iX0hJUlE2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFhMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJYWEwZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWEwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMywgLTQ3ODksIDIxNjldJFs0NzU1LCAtMjE5NiwgLTgsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFhMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9ISVJRLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFhMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFhMi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDMsIC0yNywgMjE2OV0kWy04LCAtMjE5NiwgLTgsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFhNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBzb3VyY2U9Il9ISVJSR2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFhNC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFhNU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01MDMsIDQ3MTAsIDIxNjldJFstNDc0NCwgLTIxOTYsIC04LCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElhYmh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUFFMDJDRSIgc291cmNlPSJfSElhYlp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWJpdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElhYmgtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElhYmlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCAtODE0OSwgMjE3MF0kWzgxMzYsIC0yMTk2LCAxNCwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0wwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0wwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0w0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMUQiIHNvdXJjZT0iX0hJUlJDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMNS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0w1T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa0w1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgLTcxMTgsIDIxNjldJFs3MDk3LCAtMjE5NiwgNiwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0w3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDciIHNvdXJjZT0iX0hJUlJLZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0w3ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa0w3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgLTIzODIsIDIxNjldJFsyMzYxLCAtMjE5NiwgNiwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0w5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzRDkiIHNvdXJjZT0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0w5dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa0w5LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgMjM1NCwgMjE2OV0kWy0yMzc1LCAtMjE5NiwgNiwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0xfT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0xfZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0xfdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIHNvdXJjZT0iX0hJYWE2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01BZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNQk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0xfLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01BT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMywgNzA5MSwgMjE2OV0kWy03MTExLCAtMjE5NiwgNiwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01CZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01CdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01JT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIHNvdXJjZT0iX0hJa01FT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01JZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01JdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMiwgLTQ0MTgsIDIxNzBdJFs0NDA2LCAtMjE5NiwgMTQsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNSi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNS09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNT2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBzb3VyY2U9Il9ISWFiUGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtNS2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNT3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTU8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzOCwgLTUwMywgLTIzOCwgMjE3MF0kWy0yMzgsIC0yMTk3LCAtMjM4LCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTVF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFENUY4MDM4RSIgc291cmNlPSJfSElrTUtlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01TT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01SdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTVEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTVJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCAtNTgyLCAyMTcwXSRbNTY5LCAtMjE5NiwgMTQsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNU2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNU3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNVy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtNUy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNWE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTVhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzMywgLTUwMywgLTEzMywgMjE3MF0kWy0xMzMsIC0yMTk3LCAtMTMzLCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVl1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTWRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSElrTVMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTWRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTWR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCAzNTE5LCAyMTcwXSRbLTM1MzIsIC0yMTk2LCAxNCwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01lLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01mT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01mZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hJa01aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNZ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01mdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01mLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMiwgODE0OSwgMjE3MF0kWy04MTYyLCAtMjE5NiwgMTQsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9lSFlsNE9vbEVkdVZBN3Z0NXFiSUpRIiBlbGVtZW50PSJfRDNiOG9Pb2tFZHVWQTd2dDVxYklKUSIgc291cmNlPSJfZUhPMDRPb2xFZHVWQTd2dDVxYklKUSIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhZbDQtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VIWWw1ZW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VIWWw1dW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZUhZbDVPb2xFZHVWQTd2dDVxYklKUSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9lSFlsNGVvbEVkdVZBN3Z0NXFiSUpRIiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9lSFlsNHVvbEVkdVZBN3Z0NXFiSUpRIiBwb2ludHM9IlsxNzQ2LCAtMTU5LCAtODY3OSwgODQ2XSRbODc4NCwgLTg0NywgLTE2NDEsIDE1OF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIiBuYW1lPSJHdWlkYW5jZVR5cGVzIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HcVVKdGVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY0OUZGMzAwMEUiPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNDlGRjMwMDBFIiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RydWN0dXJlIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQjNHNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUUwIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FRMGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVExZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVExdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVExLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVEyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVEydWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRM09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCM0c0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCM0c0dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTk3IiB5PSIxODU5MSIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUTRlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRNXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRNk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRNnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FRM3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FRMy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iMjEyMDkiIHdpZHRoPSI0NzYzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJIZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJJZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUkp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUktPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUktlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUkt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJMT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUkh1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUkgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5ODciIHk9IjE5Nzc4IiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSTWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJOdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJPT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJPdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSUE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJMdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJMLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSIxNzM1MSIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUlN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSUi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSU09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iMTU4NDEiIHdpZHRoPSI0NzYzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJXdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUllPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUll1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJaZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUlYtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUldPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5ODciIHk9IjE0MTY0IiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSYXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJiLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJjT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJjZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJjLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSZGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJaLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJhT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSIxMjU4OSIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUmV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iOTM5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJmLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJnZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJnLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCMGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJlT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSIxMDYwOCIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENLQjF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCMi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCM2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCMy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQjRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0tCMC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tCMU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iMjI0MzIiIHdpZHRoPSI0NzYzIiBoZWlnaHQ9IjIxMTYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENLQ0NlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0tDQnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDQi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTc0IiB5PSIxMDE5MyIgd2lkdGg9IjM0NTQiIGhlaWdodD0iMTM3NTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENUellPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUell1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Wk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6WmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Wi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6YU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6YWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6YXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUemEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ1R6WGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R6WHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iNDgxNyIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Yi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENUemNPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6ZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6ZGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6ZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6ZC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4d09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4d2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4d3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOHctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ1R6YmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R6YnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iMzQ0NSIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENjOHlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4ek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4emVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4enVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4ei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4ME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4MGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ2M4eGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M4eHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iNTk4NSIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENjODJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4M09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4M2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4M3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4My1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4NE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4NGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4NHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ2M4MWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M4MXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjgzNCIgeT0iNTI0NyIgd2lkdGg9IjI5ODgiIGhlaWdodD0iMzY3NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ2M5Rk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Ri1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlHZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlHLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlIZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5SC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDYzlFZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzlFdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NjYiIHk9IjI3OTQiIHdpZHRoPSIzNTczIiBoZWlnaHQ9IjY5MDgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENtdDVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzMDEiIGhlaWdodD0iOTkwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210Ny1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDbXQ0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDbXQ0dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSI3OTkyIiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3FVSnQtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBhbGwgZ3VpZGFuY2UgdHlwZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgY29udGVudCBlbGVtZW50cy4gIEFzc29jaWF0aW9ucyBhbmQgbXVsdGlwbGljaXRpZXMgaGF2ZSBiZWVuIHByZWRlZmluZWQgb24gdGhhdCBsZXZlbCBvZiBkZXRhaWwgdG8gZW5zdXJlIHRoYXQgZ3VpZGFuY2UgaXMgb25seSByZWxhdGVkIHRvIGFwcHJvcHJpYXRlIGNvbnRlbnQgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgVU1BIGRlZmluZXMgdGhhdCBvbmx5IG9uIGNoZWNrbGlzdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG9uZSBjb250ZW50IGVsZW1lbnQgYXQgYSB0aW1lLiAgT3RoZXIgcGFja2FnZXMgYWRkIHZhcmlhYmlsaXR5IGNhcGFiaWxpdGllcyB0byBjaGVja2xpc3RzIChhbmQgb3RoZXIgY29udGVudCBlbGVtZW50cykgdGhhdCBhbGxvd3MgdG8gZHluYW1pY2FsbHkgcHJvdmlkZSBhZGRpdGlvbmFsIGNoZWNrIHBvaW50cyBvciBldmVuIGNoZWNrIHBvaW50IGdyb3VwaW5ncyB0byBjaGVjayBsaXN0IHNvIHRoYXQgYW4gYXNzb2NpYXRlZCBjaGVjayBsaXN0IGFsd2F5cyBjb250YWlucyB0aGUgcmlnaHQgY2hlY2sgcG9pbnRzIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgbWV0aG9kIGNvbmZpZ3VyYXRpb24gb3IgcHJvY2Vzcy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0FSUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMEIwIiBzb3VyY2U9Il9IQjNHNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0FSTGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0FSUHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDQVJQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDgzLCAtMjQ1LCAyMjE4LCA0NjVdJFstMjQ1NSwgLTUzMywgODQ2LCAxNzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQ0FSUk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hDQVJSZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0tCNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2IiBzb3VyY2U9Il9IQ0tCMHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tCMHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tCNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEiIHk9IjUzNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCOC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDIwIiB5PSItNDcwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0ItT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0JfT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQi11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0FPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCX3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0JPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tCNC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tCNU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzc4LCA4LCAxNzc4LCA4XSRbMzM3OCwgOCwgMzM3OCwgOF0kWzMzNzgsIDI1OTAsIDMzNzgsIDI1OTBdJFs4MDQsIDI1OTAsIDgwNCwgMjU5MF0kWzgwNCwgMTA1OCwgODA0LCAxMDU4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0tDRmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIiBzb3VyY2U9Il9IQ0FSSGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0ctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDR2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NIZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MDUiIHk9Ii0yNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDSU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0ODIiIHk9IjI3MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg4IiB5PSItMjY2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDSnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjEiIHk9IjM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NLZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDTC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NNLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ01lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NOLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ05lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENLQ0Z1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQ0YtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4MDMsIC0xMDEsIDExMDQ5LCAzMDk4XSRbLTExMjM1LCAtMTAxLCAxNjE3LCAzMDk4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0tDUWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhFIiBzb3VyY2U9Il9IQ0FSTGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDUmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NTZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MjMiIHk9Ii0yODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDVE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MzUiIHk9IjE2OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODk2IiB5PSItMzUyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0OTIiIHk9IjM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDVi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NXZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NYLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NZLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1llZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENLQ1F1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQ1EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0NiwgNTksIDExNTQ4LCAxMTI2XSRbLTEwNzc4LCA1OSwgMTYxNywgMTEyNl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENLQ1pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyIgc291cmNlPSJfSENBUlJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENLQ2FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDYk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTkyIiB5PSItMjU1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjYiIHk9IjI2NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTM3IiB5PSItNDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDZGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzkiIHk9IjMxMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDZXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NlT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NmT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NndWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NodWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2hPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENLQ1plZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQ1p1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk1NiwgMTYsIDExMTg0LCAtNzQ1XSRbLTEwNTI0LCAxNiwgMTYxNywgLTc0NV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENUeTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRSIgc291cmNlPSJfSENBUlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUeTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5Mk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjQ5IiB5PSIxOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5Mi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTk1IiB5PSItMjk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5M2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5M3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzQiIHk9Ii0zNDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzgiIHk9IjI0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R5NXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R5NnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeThPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENUeTBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENUeTB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkyMiwgMzMsIDExMTY3LCAtMjQwNF0kWy0xMDQ3MywgMzMsIDE2MTcsIC0yNDA0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R5OC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM1IiBzb3VyY2U9Il9IQ0FSWnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R5OS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHktLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NjUiIHk9Ii0yMTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHlfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA2IiB5PSIyMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpBZWZYRWR1cUhvT0piVVJaUnciIHg9IjkyOCIgeT0iLTI1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyMiIgeT0iMzA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpDZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpEZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6RC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6RS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ1R5OU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ1R5OWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTE0LCAtNDIsIDExMTI1LCAtNDA1NV0kWy0xMDQyMiwgLTQyLCAxNjE3LCAtNDA1NV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENUekZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNEMDMyMSIgc291cmNlPSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENBUmR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Ry1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUekd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTA0IiB5PSIyNjciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjgxIiB5PSItMjYxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUektPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpKLWZYRWR1cUhvT0piVVJaUnciIHg9IjUzNyIgeT0iMjExIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpMT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpNT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUek1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUek5PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6TXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUek4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUek9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6TnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ1R6Ri1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ1R6R09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjE3LCAtNjAzNiwgLTEwMDY2LCAtNDJdJFsxMDI3MCwgLTYwMzYsIC0xNDEzLCAtNDJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDVHpPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiIHNvdXJjZT0iX0hDS0IwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpQZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcwNyIgeT0iMjE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6US1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpST2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00MzgiIHk9Ii00MzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpSLWZYRWR1cUhvT0piVVJaUnciIHg9IjY0NCIgeT0iMTk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpTdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NzgiIHk9Ii0yNjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6VGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6VWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpWZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHpPdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDVHpPLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzc4LCAtNTAsIDEwOTcyLCA1MTgxXSRbLTExMTMzLCAtNTAsIDE2MTcsIDUxODFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDYzg3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiIHNvdXJjZT0iX0hDYzh4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzgxT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzg4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjODllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI4NCIgeT0iLTE2MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzgtT2ZYRWR1cUhvT0piVVJaUnciIHg9IjU2NiIgeT0iMjc3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M4LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTQiIHk9Ii0yODEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzhfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzhfdWZYRWR1cUhvT0piVVJaUnciIHg9IjcxNiIgeT0iLTI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5QS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5Qi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlCZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlDLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlELWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOURlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjODd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENjODctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTA0MSwgLTEwMSwgLTk5ODIsIC03NjJdJFs5NTMzLCAtMTAxLCAtMTQ5MCwgLTc2Ml0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSIgc291cmNlPSJfSENUelhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjOUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5S09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTcyIiB5PSItMjc4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNCIgeT0iMjU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5THVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODEiIHk9IjIyNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOU1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTgiIHk9IjMzMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5TnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlOT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5T3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlQdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlRdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjOUllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENjOUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc2MiwgLTY3LCAxMDg3MSwgLTEwMzJdJFstOTk1NiwgLTY3LCAxNjc2LCAtMTAzMl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOVEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyIgc291cmNlPSJfSENUemJPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlTZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjOVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Uy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjQwIiB5PSItMzEzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNiIgeT0iMjg4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5VWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MDkiIHk9IjI4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU0IiB5PSItMzcyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlXZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlYZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5WC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5WS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ2M5Uk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M5UmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTIyLCAtNTksIDEwNzYxLCAtMjM5Nl0kWy0xMDAwNywgLTU5LCAxNjc2LCAtMjM5Nl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOWItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCIgc291cmNlPSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOHhPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdHdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210eGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODkwIiB5PSItMjEyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR5LWZYRWR1cUhvT0piVVJaUnciIHg9IjYzNiIgeT0iLTExMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210enVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE5IiB5PSIyOTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210MGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210MXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210MWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210Mk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210Mi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQyZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210My1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDYzljT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDYzljZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2NzYsIDIwMywgLTEwMjYxLCAwXSRbMTA4OTYsIDIwMywgLTEwNDEsIDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDbXQ4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjYiIHNvdXJjZT0iX0hDbXQ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzgxT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDbXQ5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdC1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwNiIgeT0iLTI2NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdC11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MzciIHk9IjI2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdF9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdF91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDk4IiB5PSItMjA0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211QWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzODQiIHk9IjM1NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211QnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211Q3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVDT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVEdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdURPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVFdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENtdDhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENtdDh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjE1MCwgLTE2LCAtOTEyNywgMTM1NF0kWzk3ODcsIC0xNiwgLTE0OTAsIDEzNTRdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDbXVFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjUiIHNvdXJjZT0iX0hDbXQ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzlFT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDbXVGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYwMyIgeT0iLTMyNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVIdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTUiIHk9IjM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUllZlhFZHVxSG9PSmJVUlpSdyIgeD0iODYzIiB5PSItMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzciIHk9IjM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211S2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211TGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVLLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVNZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVOZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdU0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENtdUZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENtdUZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxNTAsIDAsIDk1MzMsIDIyMzVdJFstMTAwMDcsIDAsIDE2NzYsIDIyMzVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iXy1nN0xzTzBvRWR1dENMRUNOOTZCTnciIGVsZW1lbnQ9Il8tZDh3TU8wb0VkdXRDTEVDTjk2Qk53IiBzb3VyY2U9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0FRM2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0xzLTBvRWR1dENMRUNOOTZCTnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x0ZTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THR1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy1nN0x0TzBvRWR1dENMRUNOOTZCTnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x0LTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THVlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1nN0x1TzBvRWR1dENMRUNOOTZCTnciIHg9Ii05NTQiIHk9IjM0MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THV1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THZPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMdS0wb0VkdXRDTEVDTjk2Qk53IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdmUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THYtMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THZ1MG9FZHV0Q0xFQ045NkJOdyIgeD0iNjg3IiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x3TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THd1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1nN0x3ZTBvRWR1dENMRUNOOTZCTnciIHg9Ii0zNTAiIHk9Ii0yMDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x3LTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THhlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1nN0x4dTBvRWR1dENMRUNOOTZCTnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THhPMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHNPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRThzdTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8taEU4cy0wb0VkdXRDTEVDTjk2Qk53Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1oRThzZTBvRWR1dENMRUNOOTZCTnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh0TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh0dTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8taEU4dC0wb0VkdXRDTEVDTjk2Qk53Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1oRTh0ZTBvRWR1dENMRUNOOTZCTnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh1TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHV1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLWhFOHUtMG9FZHV0Q0xFQ045NkJOdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8taEU4dWUwb0VkdXRDTEVDTjk2Qk53IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8tZzdMc2Uwb0VkdXRDTEVDTjk2Qk53IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8tZzdMc3Uwb0VkdXRDTEVDTjk2Qk53IiBwb2ludHM9Ils2NSwgNTcsIC0yNjIsIC0xODRdJFsyNzAsIDI0NSwgLTU3LCA0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNDlGRTcwM0MxIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW9zT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW90T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW90ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW90dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW90LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3VlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3UtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3ZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW92LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1b3NlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1b3N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY5MzciIHk9IjEwMDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW93T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW94T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW94ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW94dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW94LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW96LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1b3dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1b3d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjkzNTYiIHk9IjEwMDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8wT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW8xT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW8zLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1bzBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1bzB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIwNTYiIHk9IjEwMDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW80T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW81T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW81ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW81dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW81LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW83LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1bzRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1bzR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk5MTciIHk9IjEwMDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW84T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFpzZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFpzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFpzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1bzhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1bzh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDkxIiB5PSIxMDAxMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERad2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERad3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERady1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERFp2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFp2LWZYRWR1cUhvT0piVVJaUnciIHg9Ijk5MTciIHk9IjEwMDAyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp6ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFowZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFowdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFowLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFoxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFozT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWnp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREWnotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ0MDAiIHk9IjEwMDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFozZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFo0ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo3T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWjN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREWjMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjYxOCIgeT0iMTAwMTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWjhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaOXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaLU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaLWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaLXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWl9PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaN3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaNy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM3MyIgeT0iMTAwMTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWl9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFFMCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREYUFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhQnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhQ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYURPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaX3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTE2NCIgeT0iMTE3MjkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREYUd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhSC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhSS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUplZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERhRi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhR09mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzMxIiB5PSIxMDAxMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERhS3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFMLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFNZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFNLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFOT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhTmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERGFKLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhS09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTgyNyIgeT0iNDgzNSIgd2lkdGg9IjM0NzkiIGhlaWdodD0iMTEwMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWozT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRE1qM2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzc3NiIgaGVpZ2h0PSIxMTM0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1qNk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hETWoydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTUwOCIgeT0iNzM0NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qLS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRE1qXy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgwMiIgaGVpZ2h0PSI5OTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0JPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0J1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0NPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtDdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERNal9PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNal9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzE3MzkiIHk9IjEwMDIxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hETWtHT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjEwNjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0gtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtJLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERNa0ZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWtGdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODUwIiB5PSIyODUzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdFT29WRWR1T0JQUUEyaEtxVVEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Utb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzgyMXdGT29WRWR1T0JQUUEyaEtxVVEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdGZW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdGdW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdGLW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0dPb1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0dlb1ZFZHVPQlBRQTJoS3FVUSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0d1b1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0ctb1ZFZHVPQlBRQTJoS3FVUSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0hPb1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0hlb1ZFZHVPQlBRQTJoS3FVUSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0h1b1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzgyMXdILW9WRWR1T0JQUUEyaEtxVVEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfODIxd0Vlb1ZFZHVPQlBRQTJoS3FVUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfODIxd0V1b1ZFZHVPQlBRQTJoS3FVUSIgeD0iMTUxOTUiIHk9IjEwMDA5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcWQ2a2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UgZGVmaW5lcyBhIG51bWJlciBvZiBwcmUtZGVmaW5lZCBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcyB0aGF0IGNhbiBiZSByZWxhdGVkIHRvIHNwZWNpZmljIGNvbnRlbnQgZWxlbWVudHMuICBHdWlkYW5jZSBpcyBhIGNvbnRlbnQgZWxlbWVudCBpdHNlbGYsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBndWlkYW5jZSB0byBndWlkYW5jZS4gVGhpcyBkaWFncmFtIHNob3dzIHRoZSB0YXhvbm9teSBvZiBhbGwgZ3VpZGFuY2UgdHlwZXMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYURlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDBCMCIgc291cmNlPSJfSEREWl9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEM1b3dPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYUVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYUR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYUQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTMxOCwgMCwgMTc3M10kWzAsIC0xNzczLCAwLCAzMThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhRk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFGZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQ2NkYwMTE5IiBzb3VyY2U9Il9IQzVvOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhUi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFTT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzk1MiwgLTMxNywgLTEyMDM5LCA0MDIyXSRbMTE1NjIsIC0zODYyLCAtMTQyOSwgNDc3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhVHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuMTkzOTYyNDQsMC4zODcxMjk3MikiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYVQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0NjczMDA1NSIgc291cmNlPSJfSEREYUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYVVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhVWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NDAsIC0zMTcsIC05MzE0LCA0MDIyXSRbODk0MiwgLTM4NjIsIC0xMTEyLCA0NzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFWLWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4xNTYxNjgzLDAuNzkyNjQ1NikiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYVdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjREMkFCMDNDQSIgc291cmNlPSJfSEREWjNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYVdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhV3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1NTUsIC0zMTcsIC02OTU5LCA0MDIyXSRbNjY5MywgLTM4NjIsIC04MjEsIDQ3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFYLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjI4MjE0ODgsMC43NjYwODc4MykiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYVllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0NjdCMDI1RCIgc291cmNlPSJfSEREWnZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYVl1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhWS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzAsIC0zMTcsIC00NjMxLCA0MDIyXSRbNDQ0NSwgLTM4NjIsIC01NTYsIDQ3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWpvZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDlCIiBzb3VyY2U9Il9IRERaN2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qcE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWpwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NSwgLTMxNywgLTIzODIsIDQwMjJdJFsyMjc2LCAtMzg2MiwgLTI5MSwgNDc3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWpyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOTAiIHNvdXJjZT0iX0hDNW80T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWpzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWpyZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtMzE3LCAzNzAsIDQwMjJdJFstMzQ0LCAtMzg2MiwgNTMsIDQ3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWpzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjQ3NzA2MjA1LDAuNzY2MDg3ODMpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWp0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNUYiIHNvdXJjZT0iX0hDNW8wT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWp1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWp0dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwNiwgLTMxNywgMTM0OSwgNDAyMl0kWy0xMjk3LCAtMzg2MiwgMTU4LCA0NzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qdk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC41OTY2MjQ3LDAuNzkyNjQ1NikiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNanZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5MSIgc291cmNlPSJfSEREWnplZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNand1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qd09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjY1LCAtMzE3LCAzNDM5LCA0MDIyXSRbLTMzMDcsIC0zODYyLCAzOTcsIDQ3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjY5MDc1MzUsMC43OTI2NDU2KSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qeC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVFIiBzb3VyY2U9Il9IQzVvc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qeU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWp5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MjMsIC0zMTcsIDU0MjQsIDQwMjJdJFstNTIxMiwgLTM4NjIsIDYzNSwgNDc3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNzY2MzQxOCwwLjU3NzExOTUpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWowT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNTYiIHNvdXJjZT0iX0hDNW93T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWoxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWowZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNajB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU4MiwgLTMxNywgNzQ4NywgNDAyMl0kWy03MTcwLCAtMzg2MiwgODk5LCA0NzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWoyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC44NjY4ODg1LDAuNzkyNjQ1NikiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNajZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgc291cmNlPSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEREYUp1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNajdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNajZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWo2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MCwgLTUwMiwgMCwgMTM1MF0kWy04MCwgLTEyOTYsIDAsIDU1Nl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWo4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNajhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWtDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjJGQTBDMzAwN0MiIHNvdXJjZT0iX0hETWotLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWtELWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWtET2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNa0RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc2OCwgLTMxOCwgOTc4OSwgMzk5NV0kWy05MzkzLCAtMzgzNiwgMTE2NCwgNDc3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNa0V1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rRS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuODg1OTA0NDMsMC41NzcxMTk1KSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1rSk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRERhSnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1rRk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1rS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1rSmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNa0p1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTU1LCAwLCAxNTg4XSRbLTI2LCAtMTgyNSwgMCwgMzE4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNa0stZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rTE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfODIxd0lPb1ZFZHVPQlBRQTJoS3FVUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjRBMUQ2MDI0NSIgc291cmNlPSJfODIxd0VPb1ZFZHVPQlBRQTJoS3FVUSIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SS1vVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SmVvVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdKdW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il84MjF3Sk9vVkVkdU9CUFFBMmhLcVVRIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il84MjF3SWVvVkVkdU9CUFFBMmhLcVVRIiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzgyMXdJdW9WRWR1T0JQUUEyaEtxVVEiIHBvaW50cz0iWzc5LCAtMzE3LCAtMTI0NCwgNTIxM10kWzEyMTcsIC01MDUzLCAtMTA2LCA0NzddIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwSDJ5LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiPg0KLSAgICAgICAgICAgIDxib2R5PjAzPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9OMTlsY094TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ii8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5IiBuYW1lPSJDb25jZXB0Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwUm54dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1NiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiIG5hbWU9IkNoZWNrbGlzdCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcFJueXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyIgbmFtZT0iRXhhbXBsZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcFJuenVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIj4NCi0gICAgICAgICAgICAgIDxib2R5PkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0IiBuYW1lPSJHdWlkZWxpbmUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BSbjB1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCI+DQotICAgICAgICAgICAgICA8Ym9keT5BIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQ2N0IwMjVEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyIgbmFtZT0iUmVwb3J0Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXhzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDkwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCIgbmFtZT0iVGVtcGxhdGUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDkxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXh1LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+U3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0NjZGMDExOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIG5hbWU9IlRvb2xNZW50b3IiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5QiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRTAiIG5hbWU9IldoaXRlcGFwZXIiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFFMCI+DQotICAgICAgICAgICAgICA8Ym9keT5XaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDBCMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwa2lzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNEQyQUIwM0NBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiIgbmFtZT0iUHJhY3RpY2UiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BraXQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQ2NzMwMDU1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCIgbmFtZT0ic3ViUHJhY3RpY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1lwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZcE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSmt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiIgbmFtZT0iV29ya1Byb2R1Y3QiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BraXUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFdvcmsgUHJvZHVjdCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyIgbmFtZT0icmVwb3J0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPci1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3J1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSIgbmFtZT0idGVtcGxhdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1lsdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKby1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUp0T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIiBuYW1lPSJUYXNrIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwa2l2LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBUYXNrIChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdGlvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWW4tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1ludWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKcmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSnJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3B1VHMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIENvbnRlbnQgRWxlbWVudCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkcU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RzT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2R1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiIG5hbWU9Imd1aWRlbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3B1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9wZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciIG5hbWU9ImV4YW1wbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk91T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPdC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5IiBuYW1lPSJhc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSm5PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUptLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53IiBuYW1lPSJ0ZXJtZGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIiBhc3NvY2lhdGlvbj0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLWdCejBlMG9FZHV0Q0xFQ045NkJOdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1nQnowTzBvRWR1dENMRUNOOTZCTnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiIG5hbWU9IlJldXNhYmxlQXNzZXQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3B1VHUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcNCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDIyRkEwQzMwMDdDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwdVR2LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0QTFENjAyNDUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcDNkb2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIj4NCi0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudHMgY2FuIGJlIHJlbGF0ZWQgdG8gYW55IG51bWJlciBvZiBTdXBwb3J0aW5nIE1hdGVyaWFsIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RwT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2RxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50cyBjYW4gcmVmZXIgdG8gYW55IG51bWJlciBvZiBDb25jZXB0IGd1aWRhbmNlLiA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhFIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RydWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkcmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYgXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcDNkcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIj4NCi0gICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGNoZWNrIHBvaW50cyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBjb250ZW50IGVsZW1lbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHdvcmsgcHJvZHVjdHMuDQotDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2R0LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkdHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQgXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcDNkdk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgYWNjZXNzIHRvIGRldGFpbGVkIEd1aWRlbGluZXMgcmVsYXRlZCB0byB0aGlzIENvbnRlbnQgRWxlbWVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT28tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9vdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiBfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxQk9xT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBSZXBvcnQgZXh0cmFjdHMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgV29yayBQcm9kdWN0OyBub3JtYWxseSBkaXJlY3RseSBmcm9tIGEgdG9vbCB0aGF0IG1haW50YWlucyB0aGUgV29yayBQcm9kdWN0cy4gRm9yIGV4YW1wbGUsIGEgUmVwb3J0IGNhbiBwcmVzZW50IGRldGFpbHMgb2YgYW4gQXJ0aWZhY3Qgb3IgYSBzZXQgb2YgQXJ0aWZhY3RzIGZvciB1c2UgaW4gYSB0ZWNobmljYWwgcmV2aWV3LiA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3JPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9xLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiBfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxQk9zZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBzYW1wbGUgb2Ygd2hhdCB0aGUgd29yayBwcm9kdWN0IG1heSBsb29rIGxpa2UsIGFuIGFjdHVhbCBpbnN0YW5jZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3RlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk90T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCBfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxQk91dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiPg0KLSAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZGV0YWlsZWQgZ3VpZGFuY2Ugb24gaG93IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdCBpbmRlcGVuZGVudCBvZiBhIHNwZWNpZmljIHNldCBvZiB0YXNrcyBvciBXQlMuICBNYXkgY29udGFpbiBzcGVjaWZpYyBhbGdvcml0aG1zIG9yIGFsdGVybmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1lrLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZa3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUgXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcUtZbU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkxpbmtzIFRhc2tzIHdpdGggVG9vbCBNZW50b3JzIHdoaWNoIGFyZSBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93IGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIHBlcmZvcm0gdGhlIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWW5PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1ltLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCBfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxS1lvZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcmFjdGljZSBjYW4gYmUgY29tcG9zZWQgb2Ygb3RoZXIgUHJhY3RpY2VzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSBfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxS1lxT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcmFjdGljZSBjYW4gcmVmZXJlbmNlIGFueSBDb250ZW50IEVsZW1lbnQuICBUaGUgYXNzb2NpYXRpb24gZXhwcmVzc2VzIHRoYXQgdGhpcyBDb250ZW50IEVsZW1lbnQgaXMgcGFydCBvZiBvciBiZWxvbmdzIHRvIHRoaXMgUHJhY3RpY2UuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpsdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkgXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcVVKbU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgd29yayBwcm9kdWN0IGlzIHJlbGF0ZWQgdG8gb25lIG9yIG1vcmUgYXNzZXRzIHRvIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5IiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTNDOTNEMDMyMSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKbi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIF8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpwdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKcGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjcgXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKcXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSnFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2IF8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpzZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKc09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfLWQ4d01PMG9FZHV0Q0xFQ045NkJOdyIgbWVtYmVyRW5kPSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyBfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgYXNzb2NpYXRpb249Il8tZDh3TU8wb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXy1nQnoxTzBvRWR1dENMRUNOOTZCTnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tZ0J6MC0wb0VkdXRDTEVDTjk2Qk53Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiIG5hbWU9IkNhdGVnb3JpZXMiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dyZ2NjLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjQ4RkNFMDA2MCI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OEZDRTAwNjAiIHR5cGU9IkNsYXNzIiBuYW1lPSJDYXRlZ29yaXphdGlvbnMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1VzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEV1V0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERXVXNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERXVXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU2MTIiIHk9Ijk4ODAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERXVXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVeWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRFdVd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERXVXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAyOTQiIHk9IjEzNDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEZ0ZvZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERXVTBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERXVTB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjExOTIiIHk9Ijk5MzEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERnRjktZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGX09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGX2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGX3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGXy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHQU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0F1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRGdGOU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdGOWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjI3MiIgeT0iOTkzMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRGdHS3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQ3MCIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dMLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dNZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dNLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dOT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHTmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEZ0dKLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdHS09mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzEyNyIgeT0iMTM0MTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUGx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERwUG11ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQbi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQby1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHBQbC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQbU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTc1MSIgeT0iOTkzMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQeWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHBQemVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAwdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAxT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQMk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEcFB5dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQeS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDQ1OSIgeT0iMTMyMzUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERwUDNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHBQMnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTY2MSIgeT0iOTkzMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHpBbnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBcWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEekFtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekFuT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2Mzc0IiB5PSIzOTQ1IiB3aWR0aD0iNDIzMyIgaGVpZ2h0PSIyMTc1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEekE1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTcyIiBoZWlnaHQ9IjExNjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekE3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSER6QTRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekE0dWZYRWR1cUhvT0piVVJaUnciIHg9IjM4ODU0IiB5PSIxMzMwMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCQTIwMDlDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHpBOU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzAxNCIgaGVpZ2h0PSI4OTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QS1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QS1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QS11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QS0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QV9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QV91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSER6QThlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzg3NzciIHk9IjEwMDE2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eGwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEOHhtT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eG5lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eG4tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eG9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEQ4eGxlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eGx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQwMyIgeT0iOTkzMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRDh4c2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4c3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4dk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEOHhydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4ci1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDQ4IiB5PSIxMjY2NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRDh4d2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4eE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4ek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEOHh2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHh2LWZYRWR1cUhvT0piVVJaUnciIHg9IjExMDA2IiB5PSI5OTE0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1Yi1FT29qRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUFPb2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzl1bElBZW9qRWR1VkE3dnQ1cWJJSlEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElBdW9qRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElBLW9qRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElCT29qRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUJlb2pFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXVsSUJ1b2pFZHVWQTd2dDVxYklKUSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUItb2pFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXVsSUNPb2pFZHVWQTd2dDVxYklKUSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUNlb2pFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXVsSUN1b2pFZHVWQTd2dDVxYklKUSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUMtb2pFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl1bElET29qRWR1VkE3dnQ1cWJJSlEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfOXViLUVlb2pFZHVWQTd2dDVxYklKUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfOXViLUV1b2pFZHVWQTd2dDVxYklKUSIgeD0iMTY4MjciIHk9IjIwODkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dyZ2NkZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8VGhlIENhdGVnb3JpZXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIHRoYXQgcHJvdmlkZSBkaWZmZXJlbnQgd2F5cyB0byBsb2dpY2FsbHkgY2F0ZWdvcml6ZSBjb250ZW50IGVsZW1lbnRzLiAgSW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgY2F0ZWdvcmllcyB0aGF0IGhhdmUgYmVlbiBwcmVkZWZpbmVkIGZvciBtb3N0IGNvbnRlbnQgZWxlbWVudCB0eXBlcyBpbiB0aGlzIG1ldGEtbW9kZWwsIGl0IHByb3ZpZGVzIHRoZSBjYXBhYmlsaXR5IGZvciB1c2VycyB0byBkZWZpbmUgdGhlaXIgb3duIGN1c3RvbSBjYXRlZ29yaWVzIG9uIGNvbnRlbnQgZWxlbWVudHMuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIFRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdGF4b25vbXkgb2YgYWxsIHByZS1kZWZpbmVkL3N0YW5kYXJkIGNhdGVnb3J5IG1ldGEtY2xhc3NlcyBhcyB3ZWxsIGFzIHRoZSBkZWZpbml0aW9uIGZvciBDdXN0b20gQ2F0ZWdvcnkgY2xhc3Nlcywgd2hpY2ggY2FuIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgdG8gY2F0ZWdvcml6ZXMgYW55IENvbnRlbnQgRWxlbWVudCBhcyB3ZWxsIGFzIGNhbiBiZSBuZXN0ZWQgd2l0aCBvdGhlciBDYXRlZ29yaWVzIChpLmUuIG90aGVyIGNhdGVnb3JpZXMgY2FuIGJlIGRlZmluZWQgdG8gYmUgYSBzdWItY2F0ZWdvcnkgb2YgYW55IGN1c3RvbSBjYXRlZ29yeSkuJiN4QTt8JiN4QTsiLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdGcmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2IiBzb3VyY2U9Il9IRFdVME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRFdVc09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdGc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z0ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIwIiB5PSItMjk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDA5IiB5PSIyNzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii04OCIgeT0iLTI3MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGdnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzQ4IiB5PSItNTkyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Z3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRndlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Z4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGemVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRGdGcnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdGci1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODU1LCAtNDIsIDQwMjEsIDhdJFstMzMxOCwgLTQyLCAxNTU3LCA4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdGME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5IiBzb3VyY2U9Il9IRFdVd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRFdVME9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdGMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0YyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMyIgeT0iMjA5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjItZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTgiIHk9Ii02MzYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0YzdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMjgiIHk9IjIxNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGNGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjQxIiB5PSItODA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Y1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Y2dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGN09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRGdGMGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdGMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYyLCAtNTY3LCAtOCwgMjk4OF0kWy0yNjIsIC0zMDczLCAtOCwgNDgyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdHQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0IiBzb3VyY2U9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdHQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dDLWZYRWR1cUhvT0piVVJaUnciIHg9IjI0NCIgeT0iLTU4MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dEdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDAwIiB5PSItNTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0VlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE4IiB5PSItMzIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dHZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0YtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dIZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0ctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHSS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRGdHQk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdHQmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTI2LCAtMjcsIC05MjYsIC0yN10kWy0zMjAxLCAtMjcsIC0zMjAxLCAtMjddJFstMzIwMSwgMTQwMiwgLTMyMDEsIDE0MDJdJFstMTA2LCAxNDAyLCAtMTA2LCAxNDAyXSRbLTEwNiwgMjkxLCAtMTA2LCAyOTFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0dOdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciIHNvdXJjZT0iX0hEZ0dKdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0dPdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1B1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUxIiB5PSIxNTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MDQiIHk9Ii0xMDgyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzAiIHk9Ii0yMTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4NiIgeT0iNzY5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dUT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dVT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUGtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHVXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUGxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRGdHTi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEZ0dPT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNTUsIC01NjcsIDE4NzksIDI5ODhdJFstMTkzMCwgLTMwNzMsIDMwNCwgNDgyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHBQcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5IiBzb3VyY2U9Il9IRGdHSnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHBQbHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQcXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBydWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMSIgeT0iLTEzNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBzZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1MSIgeT0iMTA3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQiIHk9Ii0zMDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyNSIgeT0iMTM4NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQdk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQd09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB2dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB4T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB5T2ZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHBQcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEcFBxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI5NiwgLTU2NywgLTE2ODQsIDI5ODhdJFsxNzAxLCAtMzA3MywgLTI3OSwgNDgyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHBQNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5IiBzb3VyY2U9Il9IRHBQeWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHBQMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFA4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MCIgeT0iLTM3MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFA5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01NyIgeT0iMTE1OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUDktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyIiB5PSItMjIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUC0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFAtdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyIiB5PSI1NzYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUF8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBRQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QWtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBRQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekFrLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBbWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekFsLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEcFA2dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEcFA2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMDQsIC01NTAsIC01MCwgMzEwN10kWy0zMDQsIC0zMTc1LCAtNTAsIDQ4Ml0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjcxMjk1MDE3RiIgc291cmNlPSJfSERXVXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBck9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTAsIC00OTEsIC0xMjEwLCA0ODQyXSRbMTAzMiwgLTQyNTAsIC0yODcsIDEwODNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBc2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekFzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpBdk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU4IiBzb3VyY2U9Il9IRFdVME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBd09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpBdmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekF2dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMzAsIC00OTEsIDMyMjUsIDQ4OTNdJFstMjg1MywgLTQzMDEsIDcwMiwgMTA4M10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekF3LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekF4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzYiIHNvdXJjZT0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekF5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekF4dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QXgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc3MCwgLTQ5MSwgNzg2NSwgNDg5M10kWy02ODkxLCAtNDMwMSwgMTc0NCwgMTA4M10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekF6T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekF6dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTgiIHNvdXJjZT0iX0hEcFBsdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekEwdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekF6LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QTBPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExNDMsIC00OTEsIDExNzA5LCA0ODkzXSRbLTEwNzM1LCAtNDUwNCwgMjExNiwgODgwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QTFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBMXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QTEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOCIgc291cmNlPSJfSERwUDJlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QTJPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBMmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzcwLCAtMzU1LCAxNjM5OSwgNTAyOV0kWy01MDQ2LCAtMjMwMiwgMTIxMjQsIDMwODFdJFstMTUwNTMsIC00ODUxLCAyMTE2LCA1MzNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBM3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekEzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpCQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCQUUwMjk4IiBzb3VyY2U9Il9IRHpBOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpCQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpCQWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekJBdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzksIC00NTcsIDIwODUzLCA0OTc4XSRbLTgyODgsIC0zOTM3LCAxMzUwNCwgMTQ5OF0kWy0xOTY3NiwgLTUyMDcsIDIxMTYsIDIyOF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekJCLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QkNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekJEZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMwNTgiIHk9IjI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCRk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCRi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTc3IiB5PSI5MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTI2IiB5PSIyNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QkgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCSGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QkktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJKZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJLZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekJDdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekJDLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMzLCAtNDQ4LCAyMTgyNywgNDk4Nl0kWzMzLCAtNTc1NywgMjE4MjcsIC0zMjFdJFstMTk2NzYsIC01NzU3LCAyMTE2LCAtMzIxXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpCTE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREUwMjNEIiBzb3VyY2U9Il9IRHpBOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBNE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekJNT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01MDAiIHk9Ii0xIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE3MiIgeT0iMzgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6Qk4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMyIgeT0iLTE2MDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJPdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMCIgeT0iNDA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJQZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02OSIgeT0iLTE4NDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QlF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCUU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCU3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJTT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4a3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4ay1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHhrZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekJMZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekJMdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCA0NDAsIC0yNTQsIC0zMTY2XSRbNTAsIDMwMTQsIC0yNTQsIC01OTJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHhwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTQiIHNvdXJjZT0iX0hEOHhsT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHhxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHhwZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eHB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE3NiwgLTQ5MSwgLTEyMjg1LCA0ODkzXSRbMTEzMzYsIC00NTQ2LCAtMjEyNSwgODM4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEQ4eHEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRDh4ck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eHplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSIgc291cmNlPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEQ4eGxPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4ME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eDBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4MWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODQiIHk9Ii0zNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4Mk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTkiIHk9IjMxOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2OSIgeT0iMjg5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4M2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgzdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDMyIiB5PSItMzgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHg0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHg1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4NmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4N09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4N2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh4enVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh4ei1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTMxLCAtMTE4LCA1OTc3LCAtMTE4XSRbLTUyODMsIC0xMTgsIDE2MjUsIC0xMThdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHg4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiIHNvdXJjZT0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEOHhyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHg5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eC1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTkiIHk9Ii0xODMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NiIgeT0iODk5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY5IiB5PSItMTg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlBZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNTkiIHk9IjY3MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5QnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5Q3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlDT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlEdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eURPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlFdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eDhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eDh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY2MiwgMzE4LCAyMzgsIC0xOTMxXSRbLTY2MiwgMTkzMiwgMjM4LCAtMzE3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh5RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTNCIiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh5Ri1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh5Rk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEOHlGZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYwMSwgLTUwOCwgLTU5NTIsIDQ4NzZdJFs1MjE1LCAtNDMwMSwgLTEzMzcsIDEwODNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRDh5R3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEOHlHLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh5SE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2IiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh5SU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5SS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM0NCIgeT0iLTIwNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5TGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTQiIHk9Ii05NzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eU11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5TU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eU51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5Tk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5T3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlPT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5UHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlQT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHlIZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEOHlIdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQxNCwgNDk5LCA0MTQsIDQ5OV0kWzQxNCwgMTQzMCwgNDE0LCAxNDMwXSRbMjE1MCwgMTQzMCwgMjE1MCwgMTQzMF0kWzIxNTAsIC00MiwgMjE1MCwgLTQyXSRbOTMxLCAtNDIsIDkzMSwgLTQyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9EM2x0b09va0VkdVZBN3Z0NXFiSUpRIiBlbGVtZW50PSJfRDNiOG9Pb2tFZHVWQTd2dDVxYklKUSIgc291cmNlPSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfOXViLUVPb2pFZHVWQTd2dDVxYklKUSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EM2x0by1va0VkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EM2x0cGVva0VkdVZBN3Z0NXFiSUpRIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0QzbHRwdW9rRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9EM2x0cE9va0VkdVZBN3Z0NXFiSUpRIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9EM2x0b2Vva0VkdVZBN3Z0NXFiSUpRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0QzbHRvdW9rRWR1VkE3dnQ1cWJJSlEiIHBvaW50cz0iWy01LCAtNDEsIC00LCA1OV0kWy02MywgLTEwNCwgLTYyLCAtNF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FkNmstZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSI+DQotICAgICAgICAgICAgPGJvZHk+MDQ8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9kZGo4c094ZEVkdUhqZTNwUGFoTjRBIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiLz4NCi0gICAgICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfZWFXOElPeGRFZHVIamUzcFBhaE40QSIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ii8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3IiBuYW1lPSJEaXNjaXBsaW5lIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVoLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0Lg0KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDEzQiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMiIG5hbWU9InRhc2tzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NhdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjYWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NjZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjY09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMwIiBuYW1lPSJSb2xlU2V0Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVpLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiIG5hbWU9InJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1pdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZtaWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBuYW1lPSJEb21haW4iPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FuRWotZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSI+DQotICAgICAgICAgICAgICA8Ym9keT5Eb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuDQotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiIG5hbWU9IndvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcTZtay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3E2bWt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyIgbmFtZT0ic3ViZG9tYWlucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HckR3Y09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3E2bW1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzQSIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVrLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiPg0KLSAgICAgICAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyIgbmFtZT0id29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyRHdlZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HckR3ZU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWdPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCI+DQotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfRDNiOG9Pb2tFZHVWQTd2dDVxYklKUSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcXcxaE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjRFIj4NCi0gICAgICAgICAgICAgIDxib2R5PkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiIG5hbWU9ImRpc2NpcGxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyTmhkdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU4IiBuYW1lPSJUb29sIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTgiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyWU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JOaGZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFqT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTkiPg0KLSAgICAgICAgICAgICAgPGJvZHk+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNzEyOTUwMTdGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXcmFlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyV3JhT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFrT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkFFMDI5OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXcmItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyV3JidWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiIG5hbWU9InN1YkNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY1llZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NZT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxNm1nLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBjYXRlZ29yaXplcyBtYW55IFJvbGVzIGFuZCBhIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGluIG1heSBSb2xlIFNldHMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1oLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZtaHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3IiBuYW1lPSIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxNm1qT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSBXb3JrIFByb2R1Y3RzLiBBIFdvcmsgUHJvZHVjdCBiZWxvbmdzIGF0IG1vc3QgdG8gb25lIERvbWFpbi48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCIgbmFtZT0iZG9tYWluIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1rT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZtai1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcTZtbGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkRvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIFN1YmRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIG9ubHkgdG8gYmUgY2F0ZWdvcml6ZWQgYXQgdGhlIGxlYWYtbGV2ZWwuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiIG5hbWU9Il9kb21haW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiIG5hbWU9IiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JEd2N1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgemVybyBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSIgbmFtZT0id29ya1Byb2R1Y3RUeXBlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjNBIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HckR3ZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JEd2RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JEd2UtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSI+DQotICAgICAgICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIEdyb3VwaW5ncyBncm91cCBtYW55IERpc2NpcGxpbmVzLiAgQSBEaXNjaXBsaW5lIGNhbiBiZSBpbiBtYW55IERpc2NpcGxpbmUgR3JvdXBzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2IiBuYW1lPSJkaXNjaXBsaW5lR3JvdXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyTmhjLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oY3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hck5oZU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgVG9vbCBNZW50b3IgZGVzY3JpYmVzIHdvcmsgd2l0aCBleGFjdGx5IG9uZSBUb29sLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIiBuYW1lPSJ0b29sIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyTmhmT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTcgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcldyWXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUm9sZSBTZXQgR3JvdXBpbmcgY29udGFpbnMgbWFueSBSb2xlIFNldHMuIFJvbGUgU2V0cyBjYW4gYmUgaW4gbWFueSBSb2xlIFNldCBHcm91cGluZ3MuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciIG5hbWU9InJvbGVTZXRHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXclp1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyV3JaZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiBfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyV3JhLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBncm91cHMgdG9nZXRoZXIgYW55IG51bWJlciBvZiBDb250ZW50RWxlbWVudHMgaW5jbHVkaW5nIG90aGVyIENvbnRlbnRDYXRlZ29yeS4gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiIG5hbWU9ImN1c3RvbUNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXcmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyV3JjZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCBfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyV3JkT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIENvbnRlbnRDYXRlZ29yaWVzIGRlZmluZWQgYXMgbmVzdGVkIHN1YkNhdGVnb3JpZXMuICBUaGVyZWZvcmUsIG9uZSBjb3VsZCBuZXN0IEN1c3RvbUNhdGVnb3JpZXMgaW50byBuLWxldmVsIGhpZXJhcmNoaWVzLiA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyIgbmFtZT0iX2N1c3RvbUNhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY1pPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NZLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMgXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcmdjWnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIj4NCi0gICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IFRhc2sgc2hvdWxkIGJlIHJlbGF0ZWQgdG8gZXhhY3RseSBvbmUgRGlzY2lwbGluZS4gIEZvciBsZWdhY3kgcmVhc29ucyB0aGlzIGlzIG5vdCBlbmZvcmNlZCAoZS5nLiBHUyBNZXRob2QgZG9lcyBub3QgZGVmaW5lIERpc2NpcGxpbmVzLCB5ZXQpLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIiBuYW1lPSJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NiZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjYk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQgXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI1MDI2NiIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiIgbmFtZT0iQmFzaWNFbGVtZW50cyI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3NaMFNlZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGMzZENjYwMkZCIj4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2RDY2MDJGQiIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hFRjdnZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJVTUwyIEluZnJhc3RydWN0dXJlIiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3Z3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NDE5IiB5PSI1MTYiIHdpZHRoPSIxMjU0MyIgaGVpZ2h0PSI3MDk1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFRjdpZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3anVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3a09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3a2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3a3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN2xPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRUY3aHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVGN2gtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyMzEiIHk9IjU5ODciIHdpZHRoPSI1ODQ1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFRjdtZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzY4IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjduT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN25lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN251ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN24tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN29PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN29lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN291ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdwT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN2x1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVGN2wtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM4NCIgeT0iMzU5OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRUY3cWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdydWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdzT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdzdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3dE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFRjdwdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjdwLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDk4IiB5PSI0NDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNqZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHNrZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODEwIiBoZWlnaHQ9IjE1NDAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc25PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzanVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzai1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjE0IiB5PSIxMTA5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHNzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzUyIiBoZWlnaHQ9IjEwODMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3Z1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDUxMiIgeT0iMTQzMjciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3YtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQc3ctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN6T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzenVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHN3T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHN3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjM4OTkiIHk9IjE4MzQ3IiB3aWR0aD0iNDUzOCIgaGVpZ2h0PSIxNTU3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHM5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQcy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzX2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzXy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0QU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjI3NSIgeT0iMTEyMDgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQdEQtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRGT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRGdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRHT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0R3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHRET2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHREZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc1NDgiIHk9IjE1ODQ5IiB3aWR0aD0iNDU1NSIgaGVpZ2h0PSIxNDgxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFWTJzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDg5IiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnZ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVkyc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTExIiB5PSIxMzExNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTYyMDIwMzJBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVkydy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDA4MCIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ6dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVZMndPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzMiIgeT0iMTUzNTAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVZMjAtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIydWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIzT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyM3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFWTIwT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTIwZWZYRWR1cUhvT0piVVJaUnciIHg9IjU0NTciIHk9IjgxNDIiIHdpZHRoPSI0MzI4IiBoZWlnaHQ9IjIxOTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMmgyOXNjVlFFZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iXzJoMjlzTVZRRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMmgyOXRNVlFFZHkybXVRMlBRdkhfQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzJoMjl0Y1ZRRWR5Mm11UTJQUXZIX0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJoMjl0c1ZRRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJoMjl0OFZRRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJoMjl1TVZRRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMmgyOXVjVlFFZHkybXVRMlBRdkhfQSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yaDI5dXNWUUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yaDI5dThWUUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yaDI5dk1WUUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yaDI5dmNWUUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yaUF1c01WUUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yaUF1c2NWUUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMmlBdXNzVlFFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8yaDI5c3NWUUVkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8yaDI5czhWUUVkeTJtdVEyUFF2SF9BIiB4PSI4NTQ0IiB5PSIxMjQwNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dndaVU1ubUVkeU4wY29kRVhhUjZnIiBlbGVtZW50PSJfOXZkZVlNbm1FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dndaVThubUVkeU4wY29kRVhhUjZnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfOXZ3WlZNbm1FZHlOMGNvZEVYYVI2ZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXZ3WlZjbm1FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXZ3WlZzbm1FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXY2S1VNbm1FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85djZLVWNubUVkeU4wY29kRVhhUjZnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl2NktVc25tRWR5TjBjb2RFWGFSNmciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl2NktVOG5tRWR5TjBjb2RFWGFSNmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl2NktWTW5tRWR5TjBjb2RFWGFSNmciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl2NktWY25tRWR5TjBjb2RFWGFSNmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl2NktWc25tRWR5TjBjb2RFWGFSNmciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl2NktWOG5tRWR5TjBjb2RFWGFSNmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85djZLV01ubUVkeU4wY29kRVhhUjZnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzl2d1pVY25tRWR5TjBjb2RFWGFSNmciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzl2d1pVc25tRWR5TjBjb2RFWGFSNmciIHg9IjEwMDUzIiB5PSI5MDIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hc1owUy1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIGxvd2VzdCBsZXZlbCBwYWNrYWdlIGluIE1ldGhvZCBDb3JlIGRlZmluZXMgdGhlIGNsYXNzIE1ldGhvZCBFbGVtZW50IGZyb20gd2hpY2ggYWxsIG90aGVyIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiBhcmUgZGVyaXZlZCBmcm9tLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYS1zdHJ1Y3R1cmUgTGlicmFyeSBlbGVtZW50IFBhY2thZ2VhYmxlIEVsZW1lbnRzLiAgVGhpcyBwYWNrYWdlIGFsc28gZGVmaW5lcyBrZXkgYmFzaWMgZWxlbWVudHMgdXNlZCB0byBkZS1maW5lIGFuZCBzdHJ1Y3R1cmUgbWV0aG9kIGNvbnRlbnQgdHlwZXMuICBFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiBBIE1vZGVsIEVsZW1lbnQgaXMgcGFydCBvZiBhIG1ldGhvZCBtb2RlbCBhbmQgZXZlcnkgbWV0aG9kIG1vZGVsIHBhcnQgaXMgYSBNZXRob2QgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRUY3dGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4QkQwMjhGIiBzb3VyY2U9Il9IRUY3aGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3cGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjd1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2dlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3dWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRUY3dHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRUY3dC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTMzLCAwLCAxMzk3XSRbMCwgLTE0MTMsIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNndWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHNoT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjcxQjAzQTgiIHNvdXJjZT0iX0hFRjdwZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNpT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHNoZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVQc2h1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyOTUsIC0yNTQsIDI5MjEsIDU1OF0kWy0yMDMyLCAtMzk3LCAyMTg0LCA0MTRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzaS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNqT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVBzbmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBzb3VyY2U9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzamVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVBzbnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzbi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MCwgLTUyNCwgMCwgMTcxMF0kWzUwLCAtMTQ2NCwgMCwgNzcwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc3BPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQc3B1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOTEyMDNDMCIgc291cmNlPSJfSEVGN3BlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQc2plZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc3F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQc3AtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzcU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzExLCAtNTI0LCAzNDU0LCAyNTIzXSRbLTMxMTUsIC0yMjc3LCAxMDQ5LCA3NzBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVBzei1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5IiBzb3VyY2U9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHMxLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMiIgeT0iNjI2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHMydWZYRWR1cUhvT0piVVJaUnciIHg9IjM3IiB5PSIyODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHMzZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzkiIHk9IjU2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE1MCIgeT0iMzA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHM1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHM2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVBzME9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzMGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODEyLCA3NzgsIC04MTIsIDc3OF0kWy04MTIsIDE3MTgsIC04MTIsIDE3MThdJFstMzYxNSwgMTcxOCwgLTM2MTUsIDE3MThdJFstMzYxNSwgODQsIC0zNjE1LCA4NF0kWy0yMjY5LCA4NCwgLTIyNjksIDg0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVB0QXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMjcwMTA2IiBzb3VyY2U9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3aGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdENPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVB0QnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVB0QS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVB0Qk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4MjAsIC00NzcsIDI5NjMsIDQ2MzBdJFs4MjAsIC00NjA0LCAyOTYzLCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVB0Q2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHRDdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVB0Ry1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBzb3VyY2U9Il9IRVB0Qy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVB0SC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHRJLWZYRWR1cUhvT0piVVJaUnciIHg9IjI0MiIgeT0iMzg5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Si1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHRKdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTQiIHk9Ii0zNTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHRLZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NiIgeT0iMTQzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MjEiIHk9Ii0yMDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMmR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMmV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJmT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJnT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHRIT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHRIZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ3NiwgNzE0LCA0MTI3LCAtMTgyNl0kWzQ3NiwgMjYxOSwgNDEyNywgNzldJFstMTQwMiwgMjYxOSwgMjI0OSwgNzldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTJnLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0hFUHRDLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHM4dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJoLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzNCIgeT0iLTI3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJqdWZYRWR1cUhvT0piVVJaUnciIHg9IjU5MyIgeT0iMjI4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkya09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkya3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkya2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzkiIHk9Ii0xNDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJsT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3NCIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkybWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkybmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJtLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMm8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZMmhPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZMmhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjI3NSwgLTc5LCAtMjY1LCA0MjA3XSRbMzc1NywgLTc5LCAxMjE3LCA0MjA3XSRbMzc1NywgLTM4MzcsIDEyMTcsIDQ0OV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZMnB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSEVQc3ItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkycWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkycS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMnF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZMnAtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZMnFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTAzMiwgLTQ3NywgLTk1MiwgMjY0NV0kWzEwMzIsIC0yNjczLCAtOTUyLCA0NDldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkycmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTJydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkyMy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFQzMzNEYwMTk4IiBzb3VyY2U9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyNC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkyNE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkyNGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNzg3LCAwLCAzODM1XSRbMCwgLTQxMDYsIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTI1dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMjUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTI2T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiIHNvdXJjZT0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJyLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTI3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTI4T2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyOC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2IiB5PSItMTY4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTItZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNyIgeT0iMTA5MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyX3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJfT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkzQXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTNBT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTNCdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZM0JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTNDdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZM0NPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZMjZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZMjZ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMzgsIDE1OSwgMTU4LCAtMjgwNF0kWy0yNjk5LCAxNTksIC01MDMsIC0yODA0XSRbLTI2OTksIDI0NjAsIC01MDMsIC01MDNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTNDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVBRTAyQ0UiIHNvdXJjZT0iX0hFWTJyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTNELWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTNET2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTNEZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU0MSwgLTU3NSwgLTE1OTEsIDI0NzJdJFs1NDEsIC0yMjc3LCAtMTU5MSwgNzcwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZM0V1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzRS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZM0ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgc291cmNlPSJfSEVQc3YtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZM0dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZM0ZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZM0Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODk5LCAtNzk0LCAtNDI0LCA3Njk5XSRbODk5LCAtNzcyNiwgLTQyNCwgNzY3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZM0ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzSE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZM0hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5jLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbmNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZM0h1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZM0gtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzQxLCAtNDc3LCA3MjQ5LCAxOTU4XSRbNzQxLCAtMzQxMywgNzI0OSwgLTk3OF0kWy00MzY1LCAtMzQxMywgMjE0MywgLTk3OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5kT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbmRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFaW5kdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hFUHRDLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5ldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5kLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFaW5lT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzAxLCAtNzM2LCA2MzUsIDUyMDddJFstMTcwMSwgLTUxNzMsIDYzNSwgNzcwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbmZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVpbmYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBDMDBBNiIgc291cmNlPSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnYtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5oZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5pdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5qZWZYRWR1cUhvT0piVVJaUnciIHg9IjY4MiIgeT0iMTc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5rT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY4MiIgeT0iLTIwMzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbmxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWluay1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbm1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWlubC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWlubmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5tLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlub09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWlub2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5uLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5nT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFaW5nZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMTcwLCAtOTc4LCAxOTA1LCAtNzU5M10kWy01NTU3LCAtOTc4LCAtMTQ4MiwgLTc1OTNdJFstNTU1NywgNjExMiwgLTE0ODIsIC01MDNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFaW5vdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjY3QTAwRDkiIHNvdXJjZT0iX0hFWTJ2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5wdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5vLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFaW5wT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzI4LCAtMTU5LCAtNjAzMiwgOTg2OV0kWy0yNjcxLCAtMTU5LCAtNjM3NSwgOTg2OV0kWy0yNjcxLCAtMTAxMzMsIC02Mzc1LCAtMTA1XSRbMTc0NywgLTEwMTMzLCAtMTk1NywgLTEwNV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5xZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbnF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0htemxFTVZVRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il9IbXFiSU1WVUVkeTJtdVEyUFF2SF9BIiBzb3VyY2U9Il8yaDI5c2NWUUVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9IRVBzci1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0htemxFOFZVRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0htemxGY1ZVRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSG16bEZzVlVFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0htemxGTVZVRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0htemxFY1ZVRWR5Mm11UTJQUXZIX0EiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0htemxFc1ZVRWR5Mm11UTJQUXZIX0EiIHBvaW50cz0iWzI1LCA4LCAtMTMyLCAtNjNdJFs3NSwgMjEsIC04MiwgLTUwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9NNEZta01WV0VkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfTTN5RWtNVldFZHkybXVRMlBRdkhfQSIgc291cmNlPSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfMmgyOXNjVlFFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtazhWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtbGNWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1sc1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9NNEZtbE1WV0VkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtbDhWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfTTM3MWtNVldFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1tY1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NNEZtbU1WV0VkeTJtdVEyUFF2SF9BIiB4PSItMjciIHk9IjE4NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbW1zVldFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9NMzcxa01WV0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbW5NVldFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NNEZtbThWV0VkeTJtdVEyUFF2SF9BIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtbmNWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9NM3lFa2NWV0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbW44VldFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTTRGbW5zVldFZHkybXVRMlBRdkhfQSIgeD0iLTEzMyIgeT0iMTg1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtb01WV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfTTN5RWtjVldFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1vc1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NNEZtb2NWV0VkeTJtdVEyUFF2SF9BIiB4PSItMjEyIiB5PSItNTI5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtbzhWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfTTM3MWtNVldFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1wY1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9NNEZtcHNWV0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX000Rm1wTVZXRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1wOFZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX00zeUVrY1ZXRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtcWNWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTTRGbXFzVldFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NNEZtcU1WV0VkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtcThWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX00zNzFrTVZXRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtcmNWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTTRGbXJzVldFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NNEZtck1WV0VkeTJtdVEyUFF2SF9BIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtcjhWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfTTN5RWtjVldFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1zY1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX000Rm1zc1ZXRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTTRGbXNNVldFZHkybXVRMlBRdkhfQSIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfTTRGbWtjVldFZHkybXVRMlBRdkhfQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTTRGbWtzVldFZHkybXVRMlBRdkhfQSIgcG9pbnRzPSJbMTI5NiwgMTA4NSwgLTE3MjAsIC0yODMxXSRbMTI5NiwgMzM4NywgLTE3MjAsIC01MjldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0VpQVR3TW5vRWR5TjBjb2RFWGFSNmciIGVsZW1lbnQ9Il9FZzBBOE1ub0VkeU4wY29kRVhhUjZnIiBzb3VyY2U9Il8yaDI5c2NWUUVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il85dndaVU1ubUVkeU4wY29kRVhhUjZnIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpQVR3OG5vRWR5TjBjb2RFWGFSNmciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpQVR4Y25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlBVHhzbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0VpQVR4TW5vRWR5TjBjb2RFWGFSNmciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0V3TW5vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9FZzl4OGNub0VkeU4wY29kRVhhUjZnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlLRXdzbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0VpS0V3Y25vRWR5TjBjb2RFWGFSNmciIHg9Ii0yNyIgeT0iMjg5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFdzhub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX0VnOXg4Y25vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFeGNub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0VpS0V4TW5vRWR5TjBjb2RFWGFSNmciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0V4c25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX0VnMEE4Y25vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFeU1ub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9FaUtFeDhub0VkeU4wY29kRVhhUjZnIiB4PSItMjYiIHk9Ii0yMTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0V5Y25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9FZzBBOGNub0VkeU4wY29kRVhhUjZnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlLRXk4bm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0VpS0V5c25vRWR5TjBjb2RFWGFSNmciIHg9IjU0IiB5PSIxOTgyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFek1ub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfRWc5eDhjbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0V6c25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9FaUtFejhub0VkeU4wY29kRVhhUjZnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0VpS0V6Y25vRWR5TjBjb2RFWGFSNmciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0UwTW5vRWR5TjBjb2RFWGFSNmciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX0VnMEE4Y25vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFMHNub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRWlLRTA4bm9FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9FaUtFMGNub0VkeU4wY29kRVhhUjZnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFMU1ub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX0VnOXg4Y25vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFMXNub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRWlLRTE4bm9FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9FaUtFMWNub0VkeU4wY29kRVhhUjZnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFMk1ub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfRWcwQThjbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0Uyc25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0VpS0UyOG5vRWR5TjBjb2RFWGFSNmciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRWlLRTJjbm9FZHlOMGNvZEVYYVI2ZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRWlBVHdjbm9FZHlOMGNvZEVYYVI2ZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRWlBVHdzbm9FZHlOMGNvZEVYYVI2ZyIgcG9pbnRzPSJbNjYxLCAtMTU4LCAtMjQ2MSwgMzE3NV0kWzE0NTUsIC0xNTgsIC0xNjY3LCAzMTc1XSRbMTQ1NSwgLTI4MzEsIC0xNjY3LCA1MDJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0xuQUFnY25vRWR5TjBjb2RFWGFSNmciIGVsZW1lbnQ9Il9MbkFBZ01ub0VkeU4wY29kRVhhUjZnIiBzb3VyY2U9Il85dndaVU1ubUVkeU4wY29kRVhhUjZnIiB0YXJnZXQ9Il9IRUY3aGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xuSnhnTW5vRWR5TjBjb2RFWGFSNmciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xuSnhnc25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTG5KeGc4bm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0xuSnhnY25vRWR5TjBjb2RFWGFSNmciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0xuQUFnc25vRWR5TjBjb2RFWGFSNmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBqdW1wTGlua1N0YXR1cz0iQWxsIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0xuQUFnOG5vRWR5TjBjb2RFWGFSNmciIHBvaW50cz0iWzIsIC0yMCwgLTM5LCA5NV0kWy03NywgLTExMSwgLTExOCwgNF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTlllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiI+DQotICAgICAgICAgICAgPGJvZHk+MDE8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX25veVRNT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiLz4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9jNnRka094NUVkdTUtdlZqbGZWc2ZRIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIi8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBuYW1lPSJNZXRob2RFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dycU5aLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVDMzM0RjAxOTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDUwIiBuYW1lPSJndWlkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnFOYS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDUwIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzY5QVdFZXlGRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il82OUFXRU95RkVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOHpVWGNPeUZFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjlBQjk4MDJCOSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NHNVYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjlBQjk4MDJCOSI+DQotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il80WHdMRWV5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNFh3TEVPeUZFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzVzWkN3T3lGRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNDciIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dycU5idWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNDciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfUjhJWnNleUZFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1I4SVpzT3lGRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9UR0NvRU95RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4IiBuYW1lPSJvd25lZFJ1bGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURRdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEUWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1IiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQ1NUU2MjAyMDMyQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTVFNjUwQzAwQTYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NaMFItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzWjBSdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9NM3lFa2NWV0VkeTJtdVEyUFF2SF9BIiBuYW1lPSJraW5kIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8yaDI5c01WUUVkeTJtdVEyUFF2SF9BIiBhc3NvY2lhdGlvbj0iX00zeUVrTVZXRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfTTN5RWs4VldFZHkybXVRMlBRdkhfQSIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX00zeUVrc1ZXRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyelhVdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50Lg0KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyelhWdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYzMjE5MDAyOSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnpYV3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjMyMTkwMDI5Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzNVMTFNZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8zVTExTU95SUVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfM05zRVVPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCIgbmFtZT0ic2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURTT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIG5hbWU9IlNlY3Rpb24iPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFhlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTYyNUQwMjM0IiBuYW1lPSJzZWN0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3I5SVUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MjVEMDIzNCI+DQotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX28xVlVJZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9vMVZVSU95SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfb3RiOFlPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REYzMDAzQSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJVnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRERjMwMDNBIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNVBWTDhleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzVQVkw4T3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il81SHV2SU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIiBuYW1lPSJzdWJTZWN0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEVXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyIgbmFtZT0iQ29uc3RyYWludCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJV2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1QUUwMkNFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4QTFGMDJGMyIgbmFtZT0iYm9keSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3I5SVhlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4QTFGMDJGMyI+DQotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzhwaVQ0ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il84cGlUNE95R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOGdjcFVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzRzVVdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuDQotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDMjcwMTA2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ii8+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiIG5hbWU9InByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1owUS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NaMFF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2MjAyMDMyQSIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY2N0EwMEQ5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NUM4MDIxOCIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9keXI3Z2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZHlyN2dPeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2RuemhNT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCBfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzRzVYZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgRWxlbWVudCBjYW4gb3duIG1hbnkgQ29uc3RyYWludHMgZGVmaW5pbmcgcnVsZXMgZm9yIHRoaXMgZWxlbWVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCBfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzUURSZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb250ZW50IERlc2NyaXB0aW9uIGNhbiBvcHRpb25hbGx5IGJlIHN0cnVjdHVyZSBpbnRvIFNlY3Rpb25zLiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2UgdG8gZGVjb21wb3NlZCBTZWN0aW9uIGludG8gYSBoaWVyYXJjaHkgb2YgU2VjdGlvbnMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciIG5hbWU9Il9jb250ZW50RGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEVE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIF8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NRRFR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSI+DQotICAgICAgICAgICAgICA8Ym9keT5TZWN0aW9ucyBjYW4gYmUgZnVydGhlciBkZWNvbXBvc2VkIGludG8gbiBsZXZlbHMgb2Ygc3ViLXNlY3Rpb25zLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0IiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURWZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEVk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIF8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NRRFYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCI+DQotICAgICAgICAgICAgICA8Ym9keT5BIERlc2NyaWJhYmxlIEVsZW1lbnQgY2FuIGNvbnRhaW4gYSBDb250ZW50IERlc2NyaXB0aW9uIGVsZW1lbnQgdGhhdCBzdG9yZXMgdGV4dHVhbCBkZXNjcmlwdGlvbnMgZm9yIHRoaXMgQ29udGVudCBFbGVtZW50LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBpbnRlbmRlZCB0byBiZSByZWZpbmVkIHdpdGggc3ViLWNsYXNzZXMgYWRkaW5nIG1vcmUgZGVzY3JpcHRpb24gYXR0cmlidXRlcy4gIEFueSBvZiB0aGVzZSBzdWItdHlwZXMgY2FuIGJlIHJlbGF0ZWQgdG8gYSBDb250ZW50IEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiIG5hbWU9Il9kZXNjcmliYWJsZUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1owUU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFd1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwQzAwQTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSBfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3IiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1RTY1MEMwMEE2Ii8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzJoMjlzTVZRRWR5Mm11UTJQUXZIX0EiIG5hbWU9IktpbmQiPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9IbXFiSU1WVUVkeTJtdVEyUFF2SF9BIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX0VnMEE4Y25vRWR5TjBjb2RFWGFSNmciIG5hbWU9ImFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il85dmRlWU1ubUVkeU4wY29kRVhhUjZnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX0VnMEE4TW5vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRWc5eDhNbm9FZHlOMGNvZEVYYVI2ZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0VnMEE4c25vRWR5TjBjb2RFWGFSNmciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9NM3lFa01WV0VkeTJtdVEyUFF2SF9BIiBtZW1iZXJFbmQ9Il9NM3lFa2NWV0VkeTJtdVEyUFF2SF9BIF9NMzcxa01WV0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfTTM3MWtNVldFZHkybXVRMlBRdkhfQSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBhc3NvY2lhdGlvbj0iX00zeUVrTVZXRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfTTM3MWtzVldFZHkybXVRMlBRdkhfQSIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX00zNzFrY1ZXRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il85dmRlWU1ubUVkeU4wY29kRVhhUjZnIiBuYW1lPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX0xuQUFnTW5vRWR5TjBjb2RFWGFSNmciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGNRU0FNbm5FZHlOMGNvZEVYYVI2ZyIgbmFtZT0iaXNQcmltYXJ5RXh0ZW5zaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX0VnMEE4TW5vRWR5TjBjb2RFWGFSNmciIG1lbWJlckVuZD0iX0VnMEE4Y25vRWR5TjBjb2RFWGFSNmcgX0VnOXg4Y25vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9FZzl4OGNub0VkeU4wY29kRVhhUjZnIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8yaDI5c01WUUVkeTJtdVEyUFF2SF9BIiBhc3NvY2lhdGlvbj0iX0VnMEE4TW5vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRWc5eDg4bm9FZHlOMGNvZEVYYVI2ZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0VnOXg4c25vRWR5TjBjb2RFWGFSNmciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiIG5hbWU9IkNvcmVDb250ZW50RWxlbWVudHMiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d0VE1NLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjQ4RERDMDJDNyI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OEREQzAyQzciIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVpbnItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWludE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWludGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWludHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZY2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRWluck9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRWlucmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzIzOSIgeT0iODU2MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZZU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lmZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lmLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lnZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZZy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1lkZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lkdWZYRWR1cUhvT0piVVJaUnciIHg9IjYwODYiIHk9Ijc4NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1loLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZaU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lqZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lqLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lrZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZay1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1loZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lodWZYRWR1cUhvT0piVVJaUnciIHg9IjU1ODgiIHk9IjExMTUyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1ltT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODI4IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZbmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZbi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWW8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZbGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZbHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQ0MyIgeT0iMTExNTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWXFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZcmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZci1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZcGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZcHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzA1MCIgeT0iODU1OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZdU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjAzMiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWXRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWXR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcyMjYiIHk9IjExMTUyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1l5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDU1IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZMGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZeGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZeHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQ0OCIgeT0iODU2MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZMk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1kzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1kzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1k0ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZNC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1kxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1kxdWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTEiIHk9Ijg1NTkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWkEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaQ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaRE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWkR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNaQU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaQWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg4MiIgeT0iNTk3NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpYS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpYi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlkT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlkdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWllT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWllZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpZXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWliT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWliZWZYRWR1cUhvT0piVVJaUnciIHg9IjI0MTUiIHk9IjU5NjYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEUxaWYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpaE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpaHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpaC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpaU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWl1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRTFpZk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpZmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODMiIHk9IjMzNjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEUxaW1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NTgiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWluT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWluZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWludWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWluLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWlsZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlsdWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTMiIHk9IjMzODAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEUxaXV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpdi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpd2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpdy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaXhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRTFpdC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpdU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQzNyIgeT0iMzM2OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RUTU5lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBDb3JlIENvbnRlbnQgRWxlbWVudHMgcGFja2FnZSBkZWZpbmVzIHRoZSBjb3JlIGVsZW1lbnRzIG9mIGV2ZXJ5IG1ldGhvZCBzdWNoIGFzIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMuICBUaGlzIGRpYWdyYW0gc2hvd3MgYSB0YXhvbm9teSBvZiB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGlzIHBhY2thZ2UuICBBbGwgQ29yZSBDb250ZW50IEVsZW1lbnRzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgU3RlcCwgYXJlIGRlcml2ZWQgZnJvbSBDb250ZW50IEVsZW1lbnQuICBTdGVwIGlzIG5vdCBhIENvbnRlbnQgRWxlbWVudCwgYmVjYXVzZSBpdCBpcyBkZWZpbmVkIGFzIGEgc3BlY2lhbCBTZWN0aW9uIHdoaWNoIHdhcyBkZWZpbmVkIGluIHRoZSBsYXN0IFNlY3Rpb24gYXMgYSBwYXJ0IG9mIENvbnRlbnQgRGVzY3JpcHRpb24uICBJbiBvdGhlciB3b3JkcywgU3RlcCBhbHJlYWR5IGlzIGEgZGVzY3JpcHRpb24gZm9yIGNvbnRlbnQgYW5kIHRoZXJlIGRvZXMgbm90IHJlcXVpcmUgYmVpbmcgYSBDb250ZW50IEVsZW1lbnQgd2l0aCBpdHMgb3duIENvbnRlbnQgRGVzY3JpcHRpb24gcGFydC4gIFN0ZXAgYW5kIFRhc2sgYXJlIGRlcml2ZWQgZnJvbSBhIG5ldyBhYnN0cmFjdGlvbiBpbnRyb2R1Y2VkIGluIHRoaXMgcGFja2FnZSBjYWxsIFdvcmsgRGVmaW5pdGlvbiwgd2hpY2ggcmVwcmVzZW50cyBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgdW5pdHMgb2Ygd29yay4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNZNU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDBGIiBzb3VyY2U9Il9IRXNZaE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNZNWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1k1dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtNTgyMiwgMjA5MF0kWzU4MjAsIC0yMDkxLCAtMSwgNTAyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWTYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZN09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWTdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA0QSIgc291cmNlPSJfSEVzWWxPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWTd1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNZNy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTEsIDIwOTBdJFstMSwgLTIwOTEsIC0xLCA1MDJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZOU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1k5ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNZOXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9IRXNZdE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ktZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ktLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZLXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNZOS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1ktT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MDMsIDU4MjAsIDIwOTBdJFstNTgyMSwgLTIwOTEsIC0xLCA1MDJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZX2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1lfdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNaRC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTFEIiBzb3VyY2U9Il9IRWlucS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNaRU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1pFZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MDMsIDU4MDcsIDIwOTBdJFstNTgyMSwgLTIwOTAsIC0xNCwgNTAzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWkZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaRi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWkdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwNyIgc291cmNlPSJfSEVzWXBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWkhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWkdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNaR3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTAzLCAxMTYyOCwgMjA5MF0kWy0xMTY0MiwgLTIwOTAsIC0xNCwgNTAzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWkgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaSU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWkllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfSEVzWTFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWkplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWkl1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNaSS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTU4MzUsIDIwOTBdJFs1ODIwLCAtMjA5MCwgLTE0LCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpWU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpWXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0Q5IiBzb3VyY2U9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpWnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpWS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlaT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMTQsIDIwOTBdJFstMSwgLTIwOTAsIC0xNCwgNTAzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaWFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpYXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaWktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4MzBFMDE1MCIgc291cmNlPSJfSEUxaWEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaWUtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaWpPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpamVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgMjE0MywgMjA5MF0kWy0yMTQ0LCAtMjA5MCwgMCwgNTAzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaWt1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpay1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfSEVzWTFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaXFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaXBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpcHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTEsIDQ2ODNdJFstMSwgLTQ2ODMsIC0xLCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpcS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpcmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBzb3VyY2U9Il9IRTFpYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpbE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpcnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMzE3NiwgMjA5MF0kWzMxNzQsIC0yMDkwLCAtMSwgNTAzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpdGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaXR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaXl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaXgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpeU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQsIC01MDMsIDIyNCwgMjA5MF0kWy0yNTIsIC0yMDkwLCAtMTQsIDUwM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWl6ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWl6LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0hFMWlsT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lkT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWkwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWkwT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaTBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIDAsIDIwOTBdJFstMSwgLTIwOTAsIDAsIDUwM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWkxdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWkyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIHNvdXJjZT0iX0hFMWllLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lkT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWkzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWkyZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgLTUzMTgsIDIwOTBdJFs1MzE4LCAtMjA5MCwgMCwgNTAzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaTRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEUxaXR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWWRPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWk1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaTVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaTR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaTQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0LCAtNTAzLCA1NTgzLCAyMDkwXSRbLTU1OTcsIC0yMDkwLCAwLCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpNk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWk2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzcwQTMwMTUyIiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RydWN0dXJlIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNDhEREMwMkM3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVFllZlhFZHVxSG9PSmJVUlpSdyIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogQ29yZUNvbnRlbnRFbGVtZW50cyAvIFRheG9ub215IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVFl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAxNiIgeT0iMTM2MDUiIHdpZHRoPSI0MzA4IiBoZWlnaHQ9IjExMzQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVFplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMkVEMjEzMDMyQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hFX1RadWZYRWR1cUhvT0piVVJaUnciIHVuZGVybGluZT0idHJ1ZSIgZGVzY3JpcHRpb249IkNsYXNzIERpYWdyYW06IENvcmVDb250ZW50RWxlbWVudHMgLyBXb3JrUHJvZHVjdHMiIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ5IiB5PSIxMjA5MCIgd2lkdGg9IjQxNTMiIGhlaWdodD0iMTEyNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UYS1mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJ7Um9sZS5tb2RpZmllcyA9IFJvbGUucGVyZm9ybXMub3V0cHV0fSYjeEE7a2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFJVUCYjeEE7IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UYk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDI5IiB5PSIxMDUxNSIgd2lkdGg9IjY5MDgiIGhlaWdodD0iMTEyNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRV9UYy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RlT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RldWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RmdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVGNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVGNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxOCIgeT0iOTY1IiB3aWR0aD0iMzM5NSIgaGVpZ2h0PSIyNjUwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFX1RnLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGl1ZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9Uak9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGp1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UZ09mWEVkdXFIb09KYlVSWlJ3IiBpdGFsaWM9InRydWUiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RnZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzU0IiB5PSI4MDc3IiB3aWR0aD0iMzcwOCIgaGVpZ2h0PSIyMDQwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGSkVaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkViLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZKRVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQwNTMiIHk9IjEzODAiIHdpZHRoPSIyMTg0IiBoZWlnaHQ9IjE2MTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZKRWRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFZWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFZS1mWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVmZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFZi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGSkVjZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkVjdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3ODQ3IiB5PSIxMDY2IiB3aWR0aD0iMzMxOCIgaGVpZ2h0PSIyMzQ1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifE1ldGhvZCBjb250ZW50IGlzIGZ1bmRhbWVudGFsbHkgZGVzY3JpYmVkIGJ5IGRlZmluaW5nIFRhc2tzIGRlc2NyaWJlZCB3aXRoIFN0ZXBzIHRoYXQgaGF2ZSBXb3JrIFByb2R1Y3RzIGFzIGlucHV0IGFuZCBvdXRwdXQgYW5kIHdoaWNoIGFyZSBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBUaGUgZGlhZ3JhbSBkZXBpY3RzIHRoZXNlIGNvcmUgZWxlbWVudHMgd2l0aCB0aGVpciByZWxhdGlvbnNoaXBzLiAgVGhlIHJlbGF0aW9uc2hpcHMgYXJlIGxhYmVsZWQgd2l0aCBhICZxdW90O0RlZmF1bHRfJnF1b3Q7IHByZWZpeCwgYmVjYXVzZSB0aGV5IGRlc2NyaWJlIHRoZSAnc3RhbmRhcmQnIG9yICdub3JtYWwnIHdheSBvZiBwZXJmb3JtaW5nIHRoZSBtZXRob2QgZGVzY3JpYmVkOyBpLmUuIGRvaW5nIHRoZSB3b3JrIHVuZGVyICdub3JtYWwnIGNpcmN1bXN0YW5jZXMsIHdpdGggJ25vcm1hbCcgYmVpbmcgd2hhdCB0aGUgbWV0aG9kIGF1dGhvciBwZXJjZWl2ZXMgYXMgdGhlIG1vc3QgZ2VuZXJhbCBjYXNlLiAgSG93ZXZlciwgZGlmZmVyZW50IHByb2Nlc3NlcyB3b3VsZCBhcHBseSB0aGVzZSBlbGVtZW50cyBpbiBkaWZmZXJlbnQgcGFydHMgb2YgYSBsaWZlY3ljbGUgZGlmZmVyZW50bHkgYW5kIHRoZW4gbmVlZCB0byBkZWZpbmUgY2hhbmdlcyBvbiB0aGVzZSByZWxhdGlvbnNoaXBzLiAgRm9yIGV4YW1wbGUsIGlmIGEgVGFzayBpcyBwZXJmb3JtZWQgaW4gbW9yZSB0aGVuIG9uZSBpdGVyYXRpb24gb2YgYW4gaXRlcmF0aXZlIGxpZmVjeWNsZSBtb2RlbCBkaWZmZXJlbnQgUm9sZXMgY291bGQgYmUgYWRkZWQgdG8gKG9yIHJlbW92ZWQgZnJvbSkgcGVyZm9ybWluZyB0aGUgVGFzayBhcyB3ZWxsIGFzIGRpZmZlcmVudCBpbnB1dHMgbWlnaHQgYmUgY29uc2lkZXJlZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUuICBTdWNoIGNoYW5nZXMgd291bGQgYmUgZGVmaW5lZCBvbiBwcm9jZXNzIHNwZWNpZmljIERlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlIGFuZCBoYXZlIGJlZW4gZGVmaW5lZCBiYXNlZCBvbiB0aGVzZSBjb3JlIGNvbnRlbnQgZWxlbWVudHMgKHNlZSBQcm9jZXNzIGZvciBtb3JlIGRldGFpbHMpLiYjeEE7Ii8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVfVGotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGItZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ua3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9Uay1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUyIiB5PSIzMDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVGwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3NjEiIHk9IjI3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xODM5IiB5PSItMzE0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UbmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTI1IiB5PSIyNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ub2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVG9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjU2OCIgeT0iLTEyNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Uby1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UcmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RxLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Uc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9Uc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RyLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFX1RrT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFX1RrZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODU0LCA2NTEsIDEzODQzLCA3NDU5XSRbLTE2MjY0LCA2NTEsIC01NjcsIDc0NTldJFstMTYyNjQsIC01NDg2LCAtNTY3LCAxMzIwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRV9Uc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSEVfVGF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGotZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRV9Ucy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRV9UdE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDIzLCAtNTY3LCA1ODQsIDc2Ml0kWy0xMDA3LCAtMTMyOSwgMCwgMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFX1R0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVfVHR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFX1R0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiIHNvdXJjZT0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVHUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMzOSIgeT0iMjgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R2LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNDM3IiB5PSIyODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Ud3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjkzIiB5PSItMzA0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UeGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTUwIiB5PSItMzIyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTgiIHk9IjE3OTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Uek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVDBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Uei1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UMWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1QwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UMmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1QxLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFX1R1T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFX1R1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODU0LCAtMjExLCAxMzg0MywgNjU5NV0kWy0xNDc5MSwgLTIxMSwgOTA1LCA2NTk1XSRbLTE0NzkxLCAtNTQ4NiwgOTA1LCAxMzIwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRkpFZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4IiBzb3VyY2U9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkVoT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY2IiB5PSIyNjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0MzgiIHk9IjI3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVpLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODIiIHk9Ii0yNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVqdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMjEiIHk9IjI4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzUiIHk9Ii0zMjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWx1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRW11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFbU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFbnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVuT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFb3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVvT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGSkVnZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGSkVndWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNjU5LCA2NjAsIDEzOTM2LCA2MDldJFstMTM5MDIsIDY2MCwgMTY5MywgNjA5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRkpFby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIiBzb3VyY2U9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkVwLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDgiIHk9Ii0yNzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMTIiIHk9Ii0yNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFcnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTQxIiB5PSIzMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVzZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NTciIHk9Ii0xOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzIyIiB5PSIzMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRXVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRXZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFd2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV2LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFeGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV3LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGSkVwT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGSkVwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2OTMsIC03NzAsIC0xMzkwMiwgLTcxOV0kWzEzOTM2LCAtNzcwLCAtMTY1OSwgLTcxOV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZKRXh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFeXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc1IiB5PSIyMTExIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV6dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MzciIHk9Ii0yODMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzgwIiB5PSIxNTIyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NjkiIHk9Ii0yODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNzkiIHk9IjE2NDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRTNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRTRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFM3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFNU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU0dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFNk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU1dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGSkV4LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZKRXlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjI2LCAtMTAyNCwgNzI4LCA1ODMzXSRbMjI4NiwgLTM2OTksIDIzODcsIDMxNThdJFs3NzgsIC01Njg5LCA4ODAsIDExNjhdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkU2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiIHNvdXJjZT0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRTdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3MSIgeT0iLTE0NjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRThlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3MyIgeT0iMjc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTc2IiB5PSItNzczIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFOS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzIiIHk9IjMwOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFLXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzg1IiB5PSItMTA2MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFXy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpGQS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkZBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkZCLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRkJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkZDLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRkNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRTZ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRkpFNi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODcyLCAtMTAyNCwgLTc3MCwgNTgzM10kWy0zMTE1LCAtMzY5OSwgLTMwMTQsIDMxNThdJFstMTIzNiwgLTU2ODksIC0xMTM0LCAxMTY4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRlNPVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIiBzb3VyY2U9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGU09WT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00NyIgeT0iLTEyNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09XZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPV09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk2IiB5PSItMjc4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjgwIiB5PSItMjUzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPWHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTYiIHk9Ii0zNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1llZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2MCIgeT0iLTE2OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPWnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09aT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPYXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09hT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09idWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09jZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09jdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2NPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZTT1VlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZTT1V1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0LCAxMTY4LCAtMTg2LCAtNTY4OV0kWy04NCwgNTgzMywgLTE4NiwgLTEwMjRdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGU09jLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGU09kLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09lLWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjYiIHk9IjMyMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPaE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzcxIiB5PSItMzA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09pZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09qZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2tlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPai1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2xlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRlNPZE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRlNPZGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjU5LCAtNTAsIC0zOTc5LCAwXSRbNDU0NiwgLTUwLCAtMTA5MiwgMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMEFFRUM2MDBDQSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09sdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT21lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGU09tdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09uZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT251ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT24tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT29PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT29lZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPby1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT3BlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRlNPbC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRlNPbU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTE1IiB5PSI5MTQiIHdpZHRoPSIzMTc1IiBoZWlnaHQ9IjI2NDEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZiX1ZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfV2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfVy1mWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9YZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGYl9VZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl9VdWZYRWR1cUhvT0piVVJaUnciIHg9IjExNDcyIiB5PSI5MTQiIHdpZHRoPSI1OTA5IiBoZWlnaHQ9IjI2NDEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZiX3F1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfci1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfc2VmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9zdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9zLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl90T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGYl9wLWZYRWR1cUhvT0piVVJaUnciIGl0YWxpYz0idHJ1ZSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX3FPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE0NzIiIHk9IjU0MTAiIHdpZHRoPSI1OTA5IiBoZWlnaHQ9IjI1OTAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0Y1dFLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIG92ZXJ2aWV3IHRvIHRoZSBjb3JlIGNvbnRlbnQgc3RydWN0dXJlIG5vdCBzaG93aW5nIGF0dHJpYnV0ZXMgYW5kIG9ubHkgdGhlIG1vc3QgaW1wb3J0YW50IGFzc29jaWF0aW9ucyBhcyB3ZWxsIGFzIG9taXR0aW5nIGFzc29jaWF0aW9uIHJvbGUgbmFtZXMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiX1lPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCIgc291cmNlPSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZTT2x1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9adWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzciIHk9IjI3MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzgxIiB5PSIyMjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTQ3IiB5PSIyMjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9jT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9jZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX2R1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX2V1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9mT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9mLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9nT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGYl9ZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl9ZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTU0LCAtNjc3LCA4MzczLCAtNjc3XSRbLTk3NDUsIC02NzcsIDE1ODMsIC02NzddIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGYl9nLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiIHNvdXJjZT0iX0hGU09sdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX2gtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI2IiB5PSItMzE0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9pLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MDQiIHk9Ii0yMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9qZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2tlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODI1IiB5PSItMTcwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9tZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2wtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9uZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX20tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX29lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX3BlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfby1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfaE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmJfaGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTgzLCAzODEsIC05NzQ1LCAzODFdJFs4MzczLCAzODEsIC0yOTU0LCAzODFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGYl90dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiIHNvdXJjZT0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGU09sdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX3V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExOTciIHk9Ii0zODEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl92ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1ODEiIHk9Ii0yNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl93T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl93dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3dlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3hPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM0NiIgeT0iLTM5OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl95LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfek9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl95dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl96ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl96LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfME9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl96dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8xT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8yT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZiX3QtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZiX3VPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI5NTQsIC04LCA4MzczLCA0NDYxXSRbLTEyMjg1LCAtOCwgLTk1NiwgNDQ2MV0kWy0xMjI4NSwgLTMxNDksIC05NTYsIDEzMjBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGYl8yZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiIHNvdXJjZT0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiXzNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4MyIgeT0iODQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl80ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjgiIHk9Ii0yMzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl80LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl81ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODMiIHk9Ii0xMzYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl82ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl82dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl83T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl85dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfOS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl85ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl8tZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGYl8ydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl8yLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02NywgLTEyOTUsIC02NywgMzE3NV0kWy02NywgLTMxNDksIC02NywgMTMyMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZsSlFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiIgc291cmNlPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iLTE1NjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1NCIgeT0iMTQzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpTLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpUdWZYRWR1cUhvT0piVVJaUnciIHg9IjUzIiB5PSIxOTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSlZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSld1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKWHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpYT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKWXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpZT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGbEpRZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGbEpRdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMTc1LCAtMTI5NSwgLTIxNzUsIDMxNzVdJFstMjE3NSwgLTMxNTgsIC0yMTc1LCAxMzEyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmxKWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIiBzb3VyY2U9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEphT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpaLWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NjQiIHk9Ii0yMjQ0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEphLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NCIgeT0iMTM1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpjZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NSIgeT0iMTEwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEplZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpmZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmxKWk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmxKWmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxOTQ3LCAxMzEyLCAxOTQ3LCAtMzE1OF0kWzE5NDcsIDMxNzUsIDE5NDcsIC0xMjk1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEyRUQyMTMwMzJCIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RzIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEppZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmxKaXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpqLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEprT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEprZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEprdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEprLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKbGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGbEpoLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEppT2ZYRWR1cUhvT0piVVJaUnciIHg9IjgxMjgiIHk9IjM5MjAiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjIwMTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZsSm11ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKbi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKby1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSnBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRmxKbC1mWEVkdXFIb09KYlVSWlJ3IiBpdGFsaWM9InRydWUiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEptT2ZYRWR1cUhvT0piVVJaUnciIHg9IjgxMjgiIHk9IjgyMSIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMjAxNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmxKcy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2UU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZRdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZST2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZSdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2U09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGbEpzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpzZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNTk4IiB5PSIzOTIwIiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIyMDE1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGdTZlZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NmZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NmdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1Nmd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZoT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZ1NmR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NmQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzcwOCIgeT0iMzkyMCIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMjAxNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RjV0ZlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IkEgc2ltcGxpZmllZCBvdmVydmlldyB0byBXb3JrIFByb2R1Y3RzLiBXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgQXJ0aWZhY3RzLCBPdXRjb21lcywgYW5kIERlbGl2ZXJhYmxlcy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmxKcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBzb3VyY2U9Il9IRmxKaHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKcXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmxKcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGbEpxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC0xMDE2LCAwLCAyMDgyXSRbMCwgLTIwOTEsIDAsIDEwMDddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRmxKcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGbEpydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2U2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIiBzb3VyY2U9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKci1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZUZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzMiIHk9IjEwNTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE5OSIgeT0iMjM4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA1MyIgeT0iLTI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzc3IiB5PSItNDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2V2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2V3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjMiIHk9IjM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2WC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2WS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZaLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZhLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZ1NlN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NlMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTkzMCwgNDIsIC0yNTQwLCAtMzA1Nl0kWzQwODksIDQyLCAtMzgxLCAtMzA1Nl0kWzQwODksIDIwOTEsIC0zODEsIC0xMDA3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2Yk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9IRmxKci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2Y09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2YmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGdTZidWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDU2LCAtMTAxNiwgMzAxNCwgMjA4Ml0kWy0zMDA1LCAtMjA5MSwgMTQ2NCwgMTAwN10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGdTZjLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NmRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGdTZoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiIHNvdXJjZT0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NmllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4IiB5PSItMjc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZqZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNTkiIHk9IjI4MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZrT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01OSIgeT0iLTMxMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwMSIgeT0iNzY4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZsdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MTMiIHk9IjczOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2bS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZtZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2bi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZuZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nm9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NnBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZ1Nmh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NmgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjYwLCAxMDA3LCA2NjAsIDEwMDddJFs2NjAsIDI1NTYsIDY2MCwgMjU1Nl0kWy0zODY5LCAyNTU2LCAtMzg2OSwgMjU1Nl0kWy0zODY5LCAyMjAsIC0zODY5LCAyMjBdJFstMTkzMCwgMjIwLCAtMTkzMCwgMjIwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2cU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDBGIiBzb3VyY2U9Il9IRnU2ZGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2ck9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2cWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGdTZxdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0MjIsIC0xMDE2LCAtMjk5NywgMjA4Ml0kWzI5NjMsIC0yMDkxLCAtMTQ1NiwgMTAwN10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGdTZyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NnNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODYyNzAxQTYiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXNrc0FuZFN0ZXBzIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRyUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJTZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJTLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJUZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJRZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJRdWZYRWR1cUhvT0piVVJaUnciIHg9IjI1OTAiIHk9IjUxOTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0clZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyV2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyWGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzk3MCIgeT0iNTE1NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRyaC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJqT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJqdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJrT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRya3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJoT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJoZWZYRWR1cUhvT0piVVJaUnciIHg9IjExNTEiIHk9IjI5ODAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0cmwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NTgiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJuT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJuZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJudWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJvT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJvZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyb3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJsT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJsZWZYRWR1cUhvT0piVVJaUnciIHg9IjcxNTQiIHk9IjY3NjQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0cnAtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyck9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRycnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyc09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyc2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRycE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRycGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzQ4NyIgeT0iNzQ1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHQjFNZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDAzIiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMU51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMU9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMU91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFQT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0cjEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cjJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQ0MiIgeT0iNzQ1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHQjFaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR0IxWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDUiIHk9Ijg4MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RjV0YtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGNHJZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJVT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJaT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJaLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJhT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MSIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYwIiB5PSIyNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgxIiB5PSItMjg4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJkdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJldWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRjRyWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRjRyWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NjIsIC02NywgLTEwNjE3LCAtMTZdJFsxMDYxNywgLTY3LCAtNzYyLCAtMTZdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGNHJzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIHNvdXJjZT0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJ0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2MiIgeT0iMjU0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ2dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNjAiIHk9Ii0zMzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ3ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTIiIHk9IjQ1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzYiIHk9Ii0zMzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyeC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyMGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ6LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyMWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHIwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGNHJ0T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGNHJ0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzOTcsIDE2OSwgMTM5NywgMTY5XSRbMjU3MywgMTY5LCAyNTczLCAxNjldJFsyNTczLCAxNDgxLCAyNTczLCAxNDgxXSRbNTQxLCAxNDgxLCA1NDEsIDE0ODFdJFs1NDEsIDUyNCwgNTQxLCA1MjRdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0hGNHIxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAwIiB5PSItMTk1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFTT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjUiIHk9Ii0zNDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFTLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yIiB5PSItMTQ0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFUdWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjUiIHk9IjIyMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxVS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxVi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFYLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMVB1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMVAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTkwNSwgMTA2LCAtMzE0OSwgMTA2XSRbNDEyOCwgMTA2LCAtOTI2LCAxMDZdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFjT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0hGNHIxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHQjFZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA1IiB5PSIxOTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NzIiIHk9Ii0yNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFmdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjEiIHk9IjE5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0IiB5PSIzNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxanVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFqT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0Ixa3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFrT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFjZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFjdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzAxLCA1MCwgNDkwMiwgLTUwXSRbLTQ4MDksIDUwLCAxNzk0LCAtNTBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFrLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIHNvdXJjZT0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJnLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFsT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFsZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNSwgLTQ5MSwgLTI1LCAxNjkzXSRbLTI1LCAtMTY1OSwgLTI1LCA1MjRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxbXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFtLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0Ixbk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9IRjRyUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyay1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0Ixb09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxbmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFudWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc2MiwgMTg2LCAtNTEzMCwgLTEzMzddJFs0NTU1LCAxMTY4LCAtMTMzNywgLTM1NV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFvLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hGNHJnLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHQjFZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFwdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1LCAtNTI0LCA3NiwgMTYwOF0kWzI1LCAtMTY0MiwgNzYsIDQ5MV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODMwRTAxNTAiIHNvdXJjZT0iX0hGNHJVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFyLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMSwgLTQ4MiwgLTcwMiwgMzg4Nl0kWzIxMSwgLTM4NDMsIC03MDIsIDUyNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjF0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjF0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0hGNHJVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJrLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjF1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjF1T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMXVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc3MCwgMjAzLCA0NzE1LCAtMTM3MV0kWy00MTU3LCAxMTc2LCAxMzI5LCAtMzk3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0Ixdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NTREMDJCRiIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1NLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR0xtTk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbU9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbU8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1QLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdMbU1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdMbU11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA5NzIiIHk9Ijk0OCIgd2lkdGg9IjI4NTMiIGhlaWdodD0iMjI2OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR0xtUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1ULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdMbVFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdMbVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg0MSIgeT0iODk3IiB3aWR0aD0iMzM2NCIgaGVpZ2h0PSIyMjY5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHZWhaLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhjdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdlaFpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaFplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkwMiIgeT0iNDc1NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR2VoZ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NJLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NKZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NKLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TS2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHZWhmZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHZWhmdWZYRWR1cUhvT0piVVJaUnciIHg9IjU3MDYiIHk9IjQ3NTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0bUhFZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0xtVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIiBzb3VyY2U9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtTU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaEtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaEstZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3IiB5PSIyNzAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaEx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgyNiIgeT0iLTI1NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoTS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhNZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoTi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhOZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhPLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaE9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhQLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdMbVVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdMbVV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQzMCwgLTU3NSwgLTYxODksIC02MjZdJFs2MTk3LCAtNTc1LCAtMTQyMiwgLTYyNl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdlaFFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCIgc291cmNlPSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdMbU1PZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaFJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhTLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhUdWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MiIgeT0iMzA0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhVZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NzYiIHk9Ii0yMjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoWHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhYT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoWXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhZT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHZWhRZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHZWhRdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2NjcsIDYwOSwgLTYxOTEsIDU1Nl0kWzY0MjksIDYwOSwgLTE0MjksIDU1Nl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdlaGMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfSEdlaFktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaGQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdlaGRPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR2VoZGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjIsIC00NTcsIC0xOTIxLCAzMjUxXSRbMTUwNywgLTI1NzMsIC02NzcsIDExMzRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR2VoZXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHZWhlLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR29TS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9IR2VoWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR2VoZk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR29TTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NOT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU05lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYzIiB5PSItMjk0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TT09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjEwIiB5PSIyNTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU08tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU3NyIgeT0iLTI4NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TUU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NQdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TUk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NRdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NTT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU1J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NUT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU1N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdvU0stZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdvU0xPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjYxLCA1MywgLTMxNzUsIDUzXSRbMzEyMiwgNTMsIC03MTQsIDUzXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR29TVGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBzb3VyY2U9Il9IR2VoZk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR29TVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR29TVHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHb1NULWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjIsIC00NTcsIDE4MjAsIDMyNTFdJFstMTQ0NywgLTI1NzMsIDYzNSwgMTEzNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHb1NWT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdvU1ZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzWjBUZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiPg0KLSAgICAgICAgICAgIDxib2R5PjAyPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9DcjZmSU94ZEVkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIi8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBuYW1lPSJSb2xlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzWjBWT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIA0KLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4IiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FLT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xSi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xTWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcU1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgbmFtZT0iVGFzayI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc2ktTS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLg0KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIA0KLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIA0KLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5IiBuYW1lPSJwZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnTi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ051ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ1EtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdRdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiIG5hbWU9Im91dHB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnVE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ1MtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcU91ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FPZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYk51ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJOZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiIG5hbWU9InN0ZXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiIGlzRGVyaXZlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RUTUktZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0VE1JdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIG5hbWU9IldvcmtQcm9kdWN0IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzaS1PT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLg0KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0Q5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIgbmFtZT0iR3VpZGFuY2UiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLVBPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+DQotICAgICAgICAgICAgICA8Ym9keT5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiIG5hbWU9IkFydGlmYWN0Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzaS1RT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4NCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMEYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiSk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYkktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJKLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiSnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1IiBuYW1lPSJEZWxpdmVyYWJsZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc3N2TS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJNT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiTC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIiBuYW1lPSJPdXRjb21lIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZOLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCIgbmFtZT0iU3RlcCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc3N2Ty1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLg0KLUEgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4MzBFMDE1MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIvPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc3N2UU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4NCi0gICAgICAgICAgICAgIDxib2R5PldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLg0KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiIG5hbWU9InByZWNvbmRpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdFRNS3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RUTUtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdFRNTWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RUTU1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCIgbmFtZT0iRGVmYXVsdF9QcmltYXJ5UGVyZm9ybWVyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnTS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlJvbGVzIGNhbiBiZSBkZWZpbmVkIHRvIHBlcmZvcm0gbWFueSBUYXNrcywgYnV0IGV2ZXJ5IFRhc2sgbWF5IGhhdmUgb25seSBvbmUgUm9sZSB0aGF0IGlzIGJ5IGRlZmF1bHQgdGhlIHByaW1hcnkgcGVyZm9ybWVyIG9mIHRoaXMgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdPdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnT2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIiBuYW1lPSJEZWZhdWx0X01hbmRhdG9yeUlucHV0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3MyZ1BPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgbWFuZGF0b3J5IGlucHV0cyBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnUU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ1AtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiIgbmFtZT0iRGVmYXVsdF9PdXRwdXRzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnUmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBvdXRwdXRzIG9mIHRoaXMgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdTZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnU09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1IiBuYW1lPSJEZWZhdWx0X01vZGlmaWVzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYgXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCIgaXNEZXJpdmVkPSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzX3FJZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBkZXJpdmVkIGZyb20gdGhlIGZhY3QgdGhhdCBSb2xlcyBwZXJmb3JtIFRhc2tzIHRoYXQgaGF2ZSBXb3JrIFByb2R1Y3RzIG9mIHRoYXQgcGFydGljdWxhciB0eXBlIGFzIG91dHB1dHMuICAvbW9kaWZpZXMgcHJvdmlkZXMgYWxsIHRoZSB0eXBlcyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgdGhlIFJvbGUgcHJvZHVjZXMgb3IgbW9kaWZpZXMgdmlhIG9uZSBvZiB0aGUgVGFza3MgZGVmaW5lZCB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIFJvbGUsIGVpdGhlciBhcyBwcmltYXJ5IG9yIGFkZGl0aW9uYWwgcGVyZm9ybWVyLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2IiBuYW1lPSJtb2RpZmllZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcUplZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FKT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiIG5hbWU9IkRlZmF1bHRfUmVzcG9uc2libGUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSBfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzX3FLdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiPg0KLSAgICAgICAgICAgICAgPGJvZHk+UmVzcG9uc2liaWxpdHkgZm9yIGEgd29yayBwcm9kdWN0IGluZGljYXRlcyB0aGUgcm9sZSdzIG93bmVyc2hpcCBvZiBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgd29yayBwcm9kdWN0IHR5cGUuICBGb3IgZXhhbXBsZSwgdGhlIHJvbGUgcmVzcG9uc2libGUgZm9yIGEgd29yayBwcm9kdWN0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBhYm91dCBpdHMgcXVhbGl0eSBzdGF0ZS4gIEJlaW5nIHJlc3BvbnNpYmxlIGZvciB0aGUgd29yayBwcm9kdWN0IGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgcm9sZSBpcyB0aGUgb25seSBvbmUgbW9kaWZ5aW5nIGl0LCBidXQgbWFrZXMgdWx0aW1hdGUgZGVjaXNpb25zIGFib3V0IGFjY2VwdGluZyBvciByZWplY3RpbmcgdGhlc2UgbW9kaWZpY2F0aW9ucyB3aGVuIHJldmlld2luZyB0aGVzZSBtb2RpZmljYXRpb25zLiAgRXZlcnkgd29yayBwcm9kdWN0IGhhcyBub25lIG9yIG9uZSByb2xlIHJlc3BvbnNpYmxlIHJvbGUuIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIiBuYW1lPSIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FMZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiIG5hbWU9IkRlZmF1bHRfQWRkaXRpb25hbFBlcmZvcm1lciIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIF8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NfcU0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYWRkaXRpb25hbCByb2xlcyB0aGF0IGJ5IGRlZmF1bHQgY2FuIGJlIGFzc2lnbmVkIHRvIGhlbHAgY29tcGxldGluZyBhIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiIG5hbWU9ImhlbHBzUGVyZm9ybWluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xTi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcU51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCIgbmFtZT0iQ29tcG9zaXRpb24iIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0SmJJT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QXJ0aWZhY3QgdHlwZXMgY2FuIGJlIGRlZmluZWQgdG8gYmUgcGh5c2ljYWxseSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBpcyBjb21wb3NlZCBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCIgbmFtZT0iRGVmYXVsdERlbGl2ZXJlZFdQIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdEpiS2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCBwYXJ0cyBvZiBhIGRlbGl2ZXJhYmxlLCBpLmUuIHRoZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzIGEgRGVsaXZlcmFibGUgY29tcHJpc2VzIG9mLiAgVGhpcyBhZ2dyZWdhdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiIG5hbWU9Il9kZWxpdmVyYWJsZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiTGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYkxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSIgbmFtZT0iRGVmYXVsdF9PcHRpb25hbElucHV0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIF8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RKYk11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3B0aW9uYWwgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiIgbmFtZT0ib3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJPZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiT09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMgXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSIgaXNEZXJpdmVkPSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0SmJPLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBkZXJpdmVkIGFzc29jaWF0aW9uIGlzIGEgc2hvcnRjdXQgZm9yIG5hdmlnYXRpb24gYWxvbmcgdGhlIGFzc29jaWF0aW9uIHByb3BlcnRpZXMgQ29udGVudEVsZW1lbnQucHJlc2VudGF0aW9uLnNlY3Rpb25zLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIF8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RUTUp1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIGFkZHMgYW4gb3B0aW9uYWwgcHJlLWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcHJlLWNvbmRpdGlvbiBkZWZpbmVzIGFueSBraW5kIG9mIGNvbnN0cmFpbnQgdGhhdCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSB3b3JrIGRlc2NyaWJlZCBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBjYW4gc3RhcnQuIEZvciBleGFtcGxlLCBhIHByZS1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhbiBpbnB1dCBXb3JrIFByb2R1Y3QgbmVlZHMgdG8gYmUgaW4gYSBzcGVjaWZpYyBzdGF0ZSBvciB0aGF0IG90aGVyIHJlbGF0ZWQgd29yayBtdXN0IGJlIGluIGEgY2VydGFpbiBzdGF0ZSAoZS5nLiAnSW5wdXQgZG9jdW1lbnQgWCBoYXMgYmVlbiByZXZpZXdlZCBhbmQgc2lnbmVkIGJ5IGN1c3RvbWVyIEFORCBUYXNrICZxdW90O01hbmFnZW1lbnQgUmV2aWV3JnF1b3Q7IGlzIGNvbXBsZXRlJykgYmVmb3JlIHRoZSBUYXNrIGNhbiBiZWdpbi4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSIgbmFtZT0iX3dvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUgXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdFRNTGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwb3N0LWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcG9zdC1jb25kaXRpb24gZGVmaW5lcyBhbnkga2luZCBvZiBjb25zdHJhaW50IHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgd29yayBkZXNjcmliZWQgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gY2FuIGJlIGRlY2xhcmVkIGNvbXBsZXRlZCBvciBmaW5pc2hlZCBhbmQgd2hpY2ggb3RoZXIgV29yayBEZWZpbml0aW9ucyBtaWdodCBkZXBlbmQgdXBvbiAoZS5nLiBmb3IgdGhlaXIgcHJlLWNvbmRpdGlvbnMpLiAgRm9yIGV4YW1wbGUsIGEgcG9zdC1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIHRvIGJlIHRoZSBvdXRwdXQgbXVzdCBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIGJlZm9yZSB0aGUgVGFzayBjYW4gZW5kIChlLmcuICdVc2UgQ2FzZSBtdXN0IGJlIGluIHN0YXRlIGZ1bGx5IGRlc2NyaWJlZCBhbmQgcmV2aWV3ZWQgYnkgU3lzdGVtIEFuYWx5c3QnKS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCIgbmFtZT0iX3dvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d0NUNCLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRTA5OUI4MDAwOSI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwOTlCODAwMDkiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdHJ1Y3R1cmUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHb1NXdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1plZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR29TVi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR29TV09mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NDMiIHk9IjE3MTgiIHdpZHRoPSI0NzE1IiBoZWlnaHQ9IjI5NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y05lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEd4Y09lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjUHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjUU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjUXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1JPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR3hjTnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjTi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTUiIHk9Ijc0NDIiIHdpZHRoPSIzNTk2IiBoZWlnaHQ9IjI0MzEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1R1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEd4Y1V1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzNTIiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjVi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjV2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1hlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR3hjVC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTc1IiB5PSI3ODUwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdDVDQ2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iTWV0aG9kIFBhY2thZ2UgaXMgZGVmaW5lZCBhcyBhbiBhYnN0cmFjdCBjbGFzcy4gIEl0cyBzcGVjaWFsaXphdGlvbiwgQ29udGVudCBQYWNrYWdlLCBkZWZpbmVzIHRoZSByZWRlZmluaXRpb24gb2YgdGhlIFVNTCBwYWNrYWdlIHRvIGNvbnRhaW4gb25seSBDb250ZW50IEVsZW1lbnRzLiAgTWV0aG9kIFBhY2thZ2VzIGNhbiBiZSBkZWZpbmVkIGFzIGdsb2JhbCAoaS5lLiBhbnkgZWxlbWVudCBpbiBhbnkgb3RoZXIgcGFja2FnZSBjYW4gYWNjZXNzIGl0cyBjb250ZW50cykuICBUaGV5IGNhbiBiZSBuZXN0ZWQgYXMgd2VsbCBhcyBkZWZpbmUgZGVwZW5kZW5jaWVzIHRvIG90aGVyIHBhY2thZ2VzICh2aWEgdGhlIHJldXNlZFBhY2thZ2VzIGFzc29jaWF0aW9uKS4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR29TWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5IiBzb3VyY2U9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR29TYXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NidWZYRWR1cUhvT0piVVJaUnciIHg9IjExNTUiIHk9Ii0zMTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjQ4IiB5PSItMzIzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ3MiIgeT0iMjEyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NkLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMTQiIHk9Ii0zOTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU2ZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU2dPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TaE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NndWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjRWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NodWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHb1NaLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHb1NhT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIzNTMsIC01NjcsIDIzNTMsIC01NjddJFs2MjE0LCAtNTY3LCA2MjE0LCAtNTY3XSRbNjIxNCwgLTIzMjgsIDYyMTQsIC0yMzI4XSRbMTMxMiwgLTIzMjgsIDEzMTIsIC0yMzI4XSRbMTMxMiwgLTE0ODEsIDEzMTIsIC0xNDgxXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR3hjRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1IiBzb3VyY2U9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNGdWZYRWR1cUhvT0piVVJaUnciIHg9IjI5NyIgeT0iMTUwMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2OTciIHk9IjYyNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNIZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MjUiIHk9IjM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxNyIgeT0iMjgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjSS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDAiIHk9IjEzODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y0tPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjSnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y0xPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjTU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNMdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjTk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHeGNFLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHeGNGT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIzNTMsIDYwOSwgMjM1MywgNjA5XSRbNjE4MCwgNjA5LCA2MTgwLCA2MDldJFs2MTgwLCAyODAyLCA2MTgwLCAyODAyXSRbMTQ3MywgMjgwMiwgMTQ3MywgMjgwMl0kWzE0NzMsIDE0ODEsIDE0NzMsIDE0ODFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHeGNSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAzQUYiIHNvdXJjZT0iX0hHeGNOZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNTZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHeGNSdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHeGNSLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDMsIC0xMzk3LCAtMjQ1LCA0MjQxXSRbLTE0MywgLTQxNTcsIC0yNDUsIDE0ODFdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR3hjVE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHeGNUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR3hjWHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIiBzb3VyY2U9Il9IR3hjTmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR3hjVHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNadWZYRWR1cUhvT0piVVJaUnciIHg9IjIyOCIgeT0iMzIzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNhZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjYiIHk9Ii0zNDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNiT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04IiB5PSIyOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk1MSIgeT0iLTI1NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjZE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNjdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjZU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNkdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNmT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2V1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNnT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEd4Y1gtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEd4Y1lPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYwOCwgLTEzNSwgLTUxNDcsIC0zM10kWzUwODAsIC0xMzUsIC0xNjc2LCAtMzNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM2MEU3MjAwMzciIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEd4Y2d1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlVNTDIgSW5mcmFzdHJ1Y3R1cmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNnLWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMTUiIHk9IjYwMSIgd2lkdGg9IjcwNDQiIGhlaWdodD0iODE0NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR3hjaXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxNTQwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05HdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEd4Y2gtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y2lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM2MSIgeT0iMTM2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05IdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOSC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05KT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05KZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05KdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05KLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05LT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05LZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOS3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05IT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05IZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTQiIHk9IjYxMTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEc3TkwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzNjgiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOTk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOTnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOT09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tk91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRzdOTE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOTGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjkyIiB5PSI0MzYwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05PLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05QLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzAyIiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05TdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TlBPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1OSIgeT0iOTIyOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOYXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzUyMiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05iZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05kZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TlotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TmFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzk3OSIgeT0iMTE1NDAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEc3TmpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0NTQiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05rT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05rZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05rdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05rLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05sT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05sZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05sdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdObC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05pZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05pdWZYRWR1cUhvT0piVVJaUnciIHg9IjQwMTMiIHk9IjEzNDcwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdDVDQy1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBQYWNrYWdlIHBhY2thZ2UgZGVmaW5lcyBob3cgdGhlIG1ldGhvZCBlbGVtZW50cyBjYW4gYmUgcGh5c2ljYWxseSBvcmdhbml6ZWQgaW4gcGFja2FnZSBoaWVyYXJjaGllcy4gIEl0IHJldXNlZCB0aGUgcGFja2FnZSBjb25jZXB0IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUgTGlicmFyeSwgYnV0IHJlZGVmaW5lcyBpdCB0byByZXN0cmljdCBDb250ZW50IFBhY2thZ2VzIHRvIG9ubHkgY29udGFpbiBDb250ZW50IEVsZW1lbnRzIGFuZCBub3QgYW55IFBhY2thZ2VhYmxlIEVsZW1lbnRzIChUQkQ6IHVwZGF0ZSBkaWFncmFtIHdpdGgge3JlZGVmaW5lc30gY29uc3RyYWludCEpLiBUaGUgZGlhZ3JhbSBzaG93cyB0aGUgb3ZlcmFsbCB0YXhvbm9teSBpcyB3aGljaCBNZXRob2QgUGFja2FnZSBpcyBkZWZpbmVkIGFzIGFuIGFic3RyYWN0IGNsYXNzLiAiLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOUy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCQ0YwMkE5IiBzb3VyY2U9Il9IRzdORy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOSy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05UdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOVC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOVE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOVGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTc5LCAtNzksIDk3OSwgMTk1OF0kWy0xOTg1LCAtNzksIC0yNywgMTk1OF0kWy0xOTg1LCAtMTcxOSwgLTI3LCAzMThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOVXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05VLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOVk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBzb3VyY2U9Il9IRzdOSy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR3hjaHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05XZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tld1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOVmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOVnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQsIC01MTYsIDE2LCAyMjI2XSRbLTg0LCAtMTk3MiwgMTYsIDc3MF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05XLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05YZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVDMzM0RjAxOTgiIHNvdXJjZT0iX0hHN05PLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05LLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05ZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05YdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05YLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtNTI0LCAtMTAxNiwgNDM1MV0kWzUwLCAtNDM2MCwgLTEwMTYsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05aT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05kdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0MwQTAxRDciIHNvdXJjZT0iX0hHN05adWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05HLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05ldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05kLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05lT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc3OCwgLTQ0OCwgLTM4OSwgNDYzMV0kWzc3OCwgLTQ1NjMsIC0zODksIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05mZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TmZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05mLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRDVGODAzOEUiIHNvdXJjZT0iX0hHN05adWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05PLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05nLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05nT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05nZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDA3LCAtNDQ4LCA5MjIsIDE3ODZdJFstMTAwNywgLTE3MTgsIDkyMiwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3Tmh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOaC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3Tm1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDNBRiIgc291cmNlPSJfSEc3TmlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3Tlp1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdObS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdObmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05udWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3Tm5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3Tm1lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3Tm11ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ0OCwgMCwgMTQ4MV0kWzAsIC0xNDgxLCAwLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdObi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05vT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdG1IRS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIj4NCi0gICAgICAgICAgICA8Ym9keT4wNTwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUktFRFlPeGdFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREU0OUVBMDFFMiIvPg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1JxR09VT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiLz4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSEctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0MwQTAxRDciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiLz4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMkZBODU0MDMwRSIgbmFtZT0iZ2xvYmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSElPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMkZBODU0MDMwRSI+DQotICAgICAgICAgICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR3RtSEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyIgbmFtZT0icmV1c2VkUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3R2UkUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0dlJFdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiIG5hbWU9ImNoaWxkUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Q1Q0J1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0NUNCZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0bUhKT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDNBRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSQi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3R2UkJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIF8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3R2UkEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBjb250YWlucyBDb250ZW50IEVsZW1lbnRzLiAgQSBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgcGFja2FnZSBpbnN0YW5jZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCIgbmFtZT0iX2NvbnRlbnRQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3R2UkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0dlJDZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEgXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdHZSRE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZXMgaXQgY29ubmVjdHMuICBUaGUgcGFja2FnZSBhdCB0aGUgdXNpbmdQYWNrYWdlIGVuZCBkZXBlbmRzIG9uIHRoZSBwYWNrYWdlIGF0IHRoZSByZXVzZWRQYWNrYWdlIGVuZC4gIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IGluIHRoZSBmb3JtZXIgcGFja2FnZSBpcyB1c2luZyBhbiBlbGVtZW50IGluIHRoZSBsYXRlciBpbiBhIHJlbGF0aW9uc2hpcCBzdWNoIGFzIGEgVGFzayBpcyB1c2luZyBhIFdvcmsgUHJvZHVjdHMgYXMgYW4gaW5wdXQuICBSZWZsZXhpdmUgcmV1c2VkUGFja2FnZSBsaW5rcyAoaS5lLiBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIGl0c2VsZikgYXJlIG5vdCBhbGxvd2VkLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIiBuYW1lPSJ1c2luZ1BhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0dlJFT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdHZSRC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1IiBuYW1lPSJQYWNrYWdlTmVzdGluZyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3R2UkZlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSI+DQotICAgICAgICAgICAgICA8Ym9keT5NZXRob2QgUGFja2FnZXMgY2FuIGJlIG5lc3RlZCwgaS5lLiBhIHBhY2thZ2UgY2FuIGJlIHBhcnQgb2YgYW5vdGhlciBwYWNrYWdlLiAgTmVzdGVkIHBhY2thZ2VzIGRvIG5vdCBuZWVkIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsIGUuZy4gYSBDb250ZW50IFBhY2thZ2UgY2FuIGJlIGRlZmluZWQgaW5zaWRlIGEgUHJvY2VzcyBQYWNrYWdlIChkZWZpbmUgZm9yIHRoZSBQcm9jZXNzIHBhcnQgb2YgdGhpcyBtb2RlbCkuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiIG5hbWU9Il9tZXRob2RQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Q1Q0EtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0NUNBdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0OUVBMDFFMiIgbmFtZT0iTWV0aG9kQ29yZURlc2NyaXB0aW9ucyI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3V5WjRlZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFERTRBQjQwMDk4Ij4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0QUI0MDA5OCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1FT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTIyMTAxRDIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1GT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NzU4IiBoZWlnaHQ9IjI0MjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1GZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtR2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtRy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtSGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NDYwIiB5PSIxNjMxNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUyNUMwMTM3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQwMiIgaGVpZ2h0PSIxNTc0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUstZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1MLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLUllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLUl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTg2MiIgeT0iMTYyODEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYzNjM2MDEwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLU5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5MjgiIGhlaWdodD0iMzI2OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1PZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1PdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1PLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1QT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1QZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1QdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtUC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1NZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1NdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTY1IiB5PSIxMjk0NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUzMTkwMzUwIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDk5NSIgaGVpZ2h0PSIxOTk4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1ULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLVFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIyODUiIHk9IjEyOTIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTM1MTAwMTMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1WT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjE1NzQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtV2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtWGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzU0IiB5PSIxMjkyOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjM2MjAwMDlBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1hT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1iLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc5NTciIHk9IjEyOTM3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1jT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTM2QTAwRDgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1kT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0ODc2IiBoZWlnaHQ9IjI0MjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtY2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDU0IiB5PSIxMjkxMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISE9JRC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lHdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSURPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lEZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMTEwIiB5PSI3NjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhPSUgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1NTUiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lKT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lKdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lLT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JS3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIT0lIT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lIZWZYRWR1cUhvT0piVVJaUnciIHg9IjExOTQ2IiB5PSI4NTY4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIT0lidWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0liLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ljT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ljZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JYy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JZGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JZC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISE9JYS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSWJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk1MzIiIHk9IjM1MTMiIHdpZHRoPSI1MTMwIiBoZWlnaHQ9IjIyMTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhPSXF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTU0MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0l0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIT0lwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQzNyIgeT0iNDAwNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1TXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISFg1TnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQ4NyIgaGVpZ2h0PSIxNTQwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1T09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNU8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVRZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhYNU0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3MTUiIHk9IjQwMDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTRDMDM4NCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhYNWN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iMTU3NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVkLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVlZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVlLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1ZmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIWDViLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVjT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUxNjQiIHk9IjgzMDUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d1eVo0LWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTWV0aG9kIENvcmUgRGVzY3JpcHRpb25zIHBhY2thZ2UgZGVmaW5lcyB0aGUgZXhhY3QgbmF0dXJlIG9mIHRleHR1YWwgZGVzY3JpcHRpb25zIHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBmb3IgQ29udGVudCBFbGVtZW50cy4gIFRoZSBkZWNsYXJhdGlvbnMgZm9yIHRoZXNlIGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZmFjdG9yZWQgaW50byB0aGlzIHNlcGFyYXRlIHBhY2thZ2UsIGJlY2F1c2UgZXZlcnkgaW1wbGVtZW50ZXIgb2YgdGhpcyBtZXRhLW1vZGVsIG1pZ2h0IGRlY2lkZSB0byBkZWZpbmUgYSBkaWZmZXJlbnQgc2V0IG9mIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMgZm9yIHRoZWlyIENvbnRlbnQgRWxlbWVudHMuICBIb3dldmVyLCBvbmx5IHRoZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhpcyBwYWNrYWdlIGFyZSB0aGUgc3RhbmRhcmRpemVkIHNldCBmb3IgSUJNJ3MgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlIGFuZCBhcmUgc3VwcG9ydGVkIGZvciBtZXRob2QgY29udGVudCBpbnRlcmNoYW5nZSAoaS5lLiBpbXBvcnQvZXhwb3J0IHNjZW5hcmlvcyBmb3IgZGlmZmVyZW50IGNvbnRlbnQgc291cmNlcykuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSUstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDg1MDM4MyIgc291cmNlPSJfSEhFLVFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSUwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSUxPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSUxlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTk5OSwgMzU1LCAzNzc2XSRbLTIwMywgLTQxOTksIDM1NSwgNTc1XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSU11ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JTS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSU5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDc1MDNDNyIgc291cmNlPSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSU5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JTnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtMTIxOSwgLTgzMzEsIDM3NTldJFs4LCAtMjg5NSwgLTgzMjIsIDIwODJdJFs2MDQ1LCAtNDQxOSwgLTIyODYsIDU1OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lPLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODQ5RTAwMDEiIHNvdXJjZT0iX0hIRS1VT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lQdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTc5NSwgLTM5MTEsIDM3NzZdJFs4LCAtMTc2OSwgLTM5MDMsIDI4MDJdJFszMDczLCAtMzk5NiwgLTgzOCwgNTc1XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JUmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDg4MDEzRiIgc291cmNlPSJfSEhFLVlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVItZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JU09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOCwgLTU4NCwgNTUyOCwgMzc4NF0kWy0xNiwgLTE2NzYsIDU1MjAsIDI2OTJdJFstNDM1MSwgLTM3OTMsIDExODUsIDU3NV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lULWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3QjAxQUMiIHNvdXJjZT0iX0hIRS1JT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIRS1jT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lVLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lVT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDgyLCAtNzk1LCAtMTM0NiwgMjE1MF0kWzEwNjYsIC0xNzM1LCAtNzYyLCAxMjEwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDdEMDM2NCIgc291cmNlPSJfSEhFLUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JV3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTA1OCwgLTEyMTksIDE4ODgsIDIxODRdJFstMTg5NiwgLTIxOTIsIDEwNDksIDEyMTBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JWC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JWWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwOEIwMEFBIiBzb3VyY2U9Il9ISEUtTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0laT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ladWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JWXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lZLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04LCAtMTY0MiwgOTg5NywgMzc5M10kWy0xNiwgLTM4MDEsIDk4ODksIDE2MzRdJFstNzYyOCwgLTUwNjMsIDIyNzcsIDM3Ml0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lhT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSWFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lldWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIHNvdXJjZT0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lmdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUiIHk9Ii0xNjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0loT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjgyIiB5PSIzNjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYyMSIgeT0iNDA4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lrT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lsT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSW1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JbHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSW5PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JbXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JZS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSWZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjU2NSwgNTkyLCAyNTY1LCA1OTJdJFszMTQ5LCA1OTIsIDMxNDksIDU5Ml0kWzMxNDksIDE4ODgsIDMxNDksIDE4ODhdJFsxMTkzLCAxODg4LCAxMTkzLCAxODg4XSRbMTE5MywgMTEwOSwgMTE5MywgMTEwOV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSW5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgc291cmNlPSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUMtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSW9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSW51ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0luLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzcsIC0xMTA5LCA3NDQyLCAxOTg5XSRbLTE3NywgLTMxNDksIDc0NDIsIC01MF0kWy02MjA2LCAtMzE0OSwgMTQxMywgLTUwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSXBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSXR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgc291cmNlPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNUFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1QmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDkiIHk9IjI3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1Q09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1Qy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMyIgeT0iMzA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVEdWZYRWR1cUhvT0piVVJaUnciIHg9Ii02ODAiIHk9Ii0yMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNUUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1RWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Rk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNUYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1RmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVHZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1SC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVIZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0l0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JdU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMDkxLCA5MywgLTU0NzcsIDI0NV0kWzUwMDMsIDkzLCAtMjU2NSwgMjQ1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISFg1SU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBzb3VyY2U9Il9ISE9JcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISFg1SWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhYNUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNzcwLCAwLCAyNDgwXSRbLTUwLCAtMjcyNiwgMCwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhYNUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISFg1S09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhYNVF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhYNU11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Ui1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNVJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgiIHk9IjIyOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVUZWZYRWR1cUhvT0piVVJaUnciIHg9IjgyOCIgeT0iLTI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkyIiB5PSIxNzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVVLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MiIgeT0iLTM1NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1V09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVWdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1WE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVZT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVaT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhYNVEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhYNVJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwOTksIDAsIDU0NjksIDBdJFstNTMyNSwgMCwgMjI0MywgMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhYNVplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEhYNU11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUMtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNWFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhYNVp1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIWDVaLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1LCAtNzcwLCAtNzQ5MywgMjQ4MF0kWzI1LCAtMzI1MSwgLTc0OTMsIDBdJFs2MTA0LCAtMzI1MSwgLTE0MTMsIDBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISFg1Yk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIWDViZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdDVDRGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIj4NCi0gICAgICAgICAgICA8Ym9keT4wNjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfVlBJR01PeGVFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5MCIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MjIxMDFEMiIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDdEMDM2NCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxREU1MzZBMDBEOCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEEiIG5hbWU9ImJyaWVmT3V0bGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Q1Q0dPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQSI+DQotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbmRWa2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25kVmtPeUhFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0dmajkwT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEIiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekFlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX25zbllrZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9uc25Za095SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfbmlWYk1PeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ2MTFEQjJGMDIwRCIgbmFtZT0icmVwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8yRUV3NGV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMkVFdzRPeUlFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzE4TFpJT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NjExREI0RDAyNDgiIG5hbWU9Im5vdGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfUEJpbDhleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1BCaWw4T3lIRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9PNGNVVU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUyNUMwMTM3IiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwN0IwMUFDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxNCIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekNPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxNCI+DQotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNnByOEFleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzZwcjhBT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il82YnJWTU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDFFIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxRSI+DQotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2V1bGpFZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ldWxqRU95R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZWt3Um9PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MzE5MDM1MCIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwODUwMzgzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA3OCIgbmFtZT0ic2tpbGxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6RU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDc4Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLU9YUndleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1PWFJ3T3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tRGUzY095SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDgyIiBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4MiI+DQotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3B0WElVZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9wdFhJVU95SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfcGw1MWNPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNEIzNzdEMDI3MiIgbmFtZT0ic3lub255bXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1TDg4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTRCMzc3RDAyNzIiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzdxV3UwZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il83cVd1ME95R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfN2cwWVVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MzUxMDAxMyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg0OUUwMDAxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4RCIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMODktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4RCI+DQotICAgICAgICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0JHX3pJZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9CR196SU95R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfQ0tmM2dPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA5NiIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUw4LXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDk2Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQUF6ZndleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0FBemZ3T3lKRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9fNDZJQU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4IiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwNzUwM0M3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCNCIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VWdDh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCNCI+DQotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ha20xOGV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfYWttMThPeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2FjczNJT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0OWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJFIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2JaOGlnZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9iWjhpZ095R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfYlJtZTBPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRiIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnQtT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkYiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0JBSTEwZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9CQUkxME95SkVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfQTM3OEVPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYzNjIwMDA5QSIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDg4MDEzRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJFMjUxODAwRDIiIG5hbWU9ImF0dGFjaG1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0X2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCRTI1MTgwMEQyIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNzhWa3dleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzc4Vmt3T3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il83MUx6NE95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjM2MzYwMTA5IiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwOEIwMEFBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RjA2MDEzOCIgbmFtZT0iYWRkaXRpb25hbEluZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnVBdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEYwNjAxMzgiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dac1VjT3lKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HWmpLZ095SkVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfR1MyRmtPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUYwMDI3RiIgbmFtZT0icHJvYmxlbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VmZTh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUYwMDI3RiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzRXXzF3ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il80V18xd095SUVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNE9XM0lPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUY4MDE5MiIgbmFtZT0iYmFja2dyb3VuZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VmZTllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUY4MDE5MiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0NjLUFNZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9DYy1BTU95SkVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfQ1NQVzRPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDUzMDExRCIgbmFtZT0iZ29hbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1ZmUtT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENUQ1MzAxMUQiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzBVVURjZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8wVVVEY095SUVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfMExZSjRPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RjAxMDIwNiIgbmFtZT0iYXBwbGljYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1ZmUtLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEYwMTAyMDYiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzgwcVQ0ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il84MHFUNE95SUVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOHR6ZDhPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDNFMDMyNSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDNFMDMyNSI+DQotICAgICAgICAgICAgICAgIDxib2R5Pk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90ZTRIa2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGU0SGtPeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3VFYkVvT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFREU0QzAzODQiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNEMwMzg0Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZXh0ZW5kcyB0aGUgQ29udGVudCBFbGVtZW50IGRlZmluaXRpb24gdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCByZWZlcmVuY2VzIHRvIGljb25zIHRoYXQgYXJlIHVzZWQgZm9yIHByZXNlbnRpbmcgQ29udGVudCBFbGVtZW50cyBpbiBhIFVNQS1iYXNlZCBtb2RlbGluZyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdoZW4gcHVibGlzaGluZyBDb250ZW50IEVsZW1lbnRzIGludG8gZG9jdW1lbnRhdGlvbiBwcmVzZW50YXRpb24gKGUuZy4gZG9jdW1lbnQgb3IgaHRtbCBwYWdlcykuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU0OTUzNzAzNDMiIG5hbWU9InNoYXBlaWNvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTM3MDM0MyI+DQotICAgICAgICAgICAgICAgIDxib2R5PkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0paSHJRZXlQRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9KWkhyUU95UEVkdUZLSm92Qkw2NFhRIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNDk1M0MwMzE5IiBuYW1lPSJub2RlaWNvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzZ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTNDMDMxOSI+DQotICAgICAgICAgICAgICAgIDxib2R5PkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9GajFid2V5UEVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRmoxYndPeVBFZHVGS0pvdkJMNjRYUSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEFBIiBuYW1lPSJleHRlcm5hbElkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUw4Xy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEFBIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgb3IgbGFiZWwgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQuIFVzZWQgbGlrZSBhIHN5bm9ueW0gdG8gdGhlIG5hbWUuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9obzRVZ2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaG80VWdPeUhFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2hmVi1BT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc3RTcxNjAzN0YiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0U3MTYwMzdGIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+S2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfMU1NdHNleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzFNTXRzT3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8xRFotRU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfT0Z5cEVNbm1FZHlOMGNvZEVYYVI2ZyIgbmFtZT0ibG9uZ1ByZXNlbnRhdGlvbk5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwM0IiIG5hbWU9Ik1ldGhvZExpYnJhcnkiPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hd2JZcHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUZGREEyNTAwRkQiPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkZEQTI1MDBGRCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Raa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUREQjYwMzA2Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Raay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFpsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RabWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0Raa2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWmt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM4MSIgeT0iNDc0OSIgd2lkdGg9IjQyODQiIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFptdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREIzODAxMUUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWm51ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rabi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFpvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFptLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0Rabk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzgxIiB5PSIxNDUxIiB3aWR0aD0iNDI4NCIgaGVpZ2h0PSIxNjc2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemdPeHhFZHVNMTR1bldhcVA1USIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemcteHhFZHVNMTR1bldhcVA1USIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9MQXF6aE94eEVkdU0xNHVuV2FxUDVRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpoZXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6aHV4eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemgteHhFZHVNMTR1bldhcVA1USIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemlPeHhFZHVNMTR1bldhcVA1USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTEFxemlleHhFZHVNMTR1bldhcVA1USIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfTEFxemdleHhFZHVNMTR1bldhcVA1USIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0xBcXpndXh4RWR1TTE0dW5XYXFQNVEiIHg9IjczNTQiIHk9IjgwNDAiIHdpZHRoPSI0Mjg0IiBoZWlnaHQ9IjE2NzYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbjdpd01pVEVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZSmpzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc243aXc4aVRFZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9zbjdpeE1pVEVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NuN2l4Y2lURWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbjdpeHNpVEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc243aXg4aVRFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc243aXlNaVRFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc243aXljaVRFZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfc243aXdjaVRFZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3NuN2l3c2lURWR5eE80RXN1UU9nVGciIHg9IjI0ODUiIHk9IjgwMzkiIHdpZHRoPSIzNTQzIiBoZWlnaHQ9IjE2NjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3diWXFPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBNZXRob2QgTGlicmFyeSBwYWNrYWdlIGRlZmluZXMgY2FwYWJpbGl0aWVzIGFyb3VuZCBtYW5hZ2luZyB3aG9sZSBsaWJyYXJpZXMgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4gIEl0IGFkZHJlc3NlcyByZXF1aXJlbWVudHMgYXJvdW5kIHBoeXNpY2FsbHkgc2VwYXJhdGluZyBkZXNjcmlwdGlvbnMgb2YgQ29udGVudCBFbGVtZW50cyBmcm9tIHRoZWlyIG1vZGVsZWQgcmVsYXRpb25zaGlwcyBkZWZpbmluZyBzZXBhcmF0ZSB1bml0cyBvZiBjb250cm9sLiAgSXQgYWxzbyBhZGRyZXNzZXMgdGhlIGNvbmNlcm4gb2Ygc2NhbGluZyB0byBsYXJnZSBNZXRob2QgTGlicmFyaWVzIGJ5IGRlZmluaW5nIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGRlZmluZSB2aXNpYmlsaXR5IHNwYWNlcyBvciB3b3JraW5nIHNldHMgZm9yIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGFsbG93aW5nIGEgUHJvY2VzcyBFbmdpbmVlciB0byBmb2N1cyBvbiByZWxldmFudCBwYXJ0cyBvZiBMaWJyYXJ5IGluc3RlYWQgb2Ygc2VlaW5nIHRoZSB3aG9sZSBsaWJyYXJ5IGFsbCBhdCBvbmNlLiAgQnkgZGVmaW5pbmcgQ29uZmlndXJhdGlvbnMgYXMgc3Vic2V0cyBvZiBQbHVnaW5zIGFuZCBNZXRob2QgUGFja2FnZXMgdGhhdCBzaGFsbCBiZSBjb25zaWRlcmVkIGZvciBwcm9jZXNzIGF1dGhvcmluZyBvbmx5LCBDb25maWd1cmF0aW9ucyBhbHNvIGRlZmluZSB0aGUgc3BhY2Ugb2YgdmFyaWFiaWxpdHkgaW50ZXJwcmV0YXRpb24gdG8gYXZvaWQgY29uZmxpY3RzIGFtb25nc3QgJ2NvbXBldGluZycgY29udGVudCAoZS5nLiBjb250ZW50IHRoYXQgcmVwbGFjZXMgdGhlIHNhbWUgZWxlbWVudHMpLiIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfQV9fX29leE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0FfX19vT3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hLRFptdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFprT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19wT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BX19fcHV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BX19fcU94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BX19fcC14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0FfX19wZXhNRWR1T05yTVJnbXo0OEEiIHk9Ii03MTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfQV9fX291eE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfQV9fX28teE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbLTE0LCA4NjAsIC0xNCwgLTI0MzVdJFstMTQsIDI0NDgsIC0xNCwgLTg0N10iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9MQXF6a2V4eEVkdU0xNHVuV2FxUDVRIiBlbGVtZW50PSJfR05rQjhPeFNFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfTEFxemdPeHhFZHVNMTR1bldhcVA1USI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemxPeHhFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpsdXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXptT3h4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpsLXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTEFxemxleHhFZHVNMTR1bldhcVA1USIgeD0iNDI0IiB5PSItNjQ1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0xBcXprdXh4RWR1TTE0dW5XYXFQNVEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0xBcXprLXh4RWR1TTE0dW5XYXFQNVEiIHBvaW50cz0iWy0xNCwgODQ2LCAtMjk3NywgLTI0NDddJFsyOTUwLCAyNDMzLCAtMTMsIC04NjBdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfeUVCWUFNaVRFZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX3lBd0JrTWlURWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX0hLRFprT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX3NuN2l3TWlURWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lFQllBOGlURWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il95RUJZQmNpVEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il95RUJZQjhpVEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il95RUJZQnNpVEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3lFQllCTWlURWR5eE80RXN1UU9nVGciIHg9IjMyOSIgeT0iNzEyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3lFQllBY2lURWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3lFQllBc2lURWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy0xOSwgMzIsIDY0LCAtOTNdJFstMTUsIDEzMCwgNjgsIDVdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZERDU1MTAzN0MiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWndlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0NzIiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rad3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaeHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaeU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaeXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFp2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0Radi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzY5IiB5PSI0MDQ0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTc1MDA0RSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0RaNnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo4ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaOWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWjUtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFo2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg5NzUiIHk9Ijg2MjMiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05La09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFODAwMjUyIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTktsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDM3IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS21lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS20tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS25lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktuLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05La2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS2t1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDg0NiIgeT0iODYwOSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOS3JlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIyMTgiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05Lc3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LdE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LdHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3VPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTktxdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDM4IiB5PSI4MjQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTksxdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOSzItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOSzNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOSzMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTks0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05LMC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOSzFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDY4IiB5PSI2MDkxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS05LLU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc0MyIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkstZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSy0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS19PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktfZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS191ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkxBZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05MQS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtOSzllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTks5dWZYRWR1cUhvT0piVVJaUnciIHg9IjQwMjkiIHk9IjQwMzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93aFFIOE03WkVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93aFFIODg3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3doUUg5TTdaRWR5cFQ4RUxiV0phN3ciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfd2hRSDljN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3doUUg5czdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93aFFIOTg3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93aFFILU03WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfd2hRSC1jN1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93aFFILXM3WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfd2hRSC04N1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93aFFIX003WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfd2hRSF9jN1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93aFFIX3M3WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3doUUhfODdaRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il93aFFIOGM3WkVkeXBUOEVMYldKYTd3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfd2hRSDhzN1pFZHlwVDhFTGJXSmE3dyIgeD0iMTc0MzMiIHk9IjY0NTIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPVU03WkVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPVTg3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzBqZk9WTTdaRWR5cFQ4RUxiV0phN3ciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMGpmT1ZjN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9WczdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPVjg3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPV003WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMGpmT1djN1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPV3M3WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMGpmT1c4N1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPWE03WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMGpmT1hjN1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPWHM3WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzBqZk9YODdaRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8wamZPVWM3WkVkeXBUOEVMYldKYTd3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMGpmT1VzN1pFZHlwVDhFTGJXSmE3dyIgeD0iMTMzNTgiIHk9Ijg2MjMiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeWUwZ003YUVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeWUwZzg3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX1p5ZTBoTTdhRWR5cFQ4RUxiV0phN3ciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnllMGhjN2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5ZTBoczdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeWUwaDg3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeWUwaU03YUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWnllMGljN2FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeWUwaXM3YUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWnllMGk4N2FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeWUwak03YUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWnllMGpjN2FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeWUwanM3YUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1p5ZTBqODdhRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9aeWUwZ2M3YUVkeXBUOEVMYldKYTd3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfWnllMGdzN2FFZHlwVDhFTGJXSmE3dyIgeD0iMTA0MjMiIHk9IjEzMjEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsVU03YUVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsVTg3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2NGMmxWTTdhRWR5cFQ4RUxiV0phN3ciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY0YybFZjN2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxWczdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsVjg3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsV003YUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfY0YybFdjN2FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsV3M3YUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfY0YybFc4N2FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsWE03YUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfY0YybFhjN2FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsWHM3YUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2NGMmxYODdhRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9jRjJsVWM3YUVkeXBUOEVMYldKYTd3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfY0YybFVzN2FFZHlwVDhFTGJXSmE3dyIgeD0iMTY4NDciIHk9IjM4MDUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3diWXF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtEWjl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM1MDNBMSIgc291cmNlPSJfSEtEWjV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFotLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFotdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtEWjktZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtEWi1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NSwgLTUwMywgMjM4LCA0MjU5XSRbLTE4NSwgLTM1OTgsIDIzOCwgMTE2NF0kWy0yMTIsIC0zNTk4LCAyMTEsIDExNjRdJFstMjEyLCAtNDQ0NSwgMjExLCAzMTddIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtEWl9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtEWl91ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOS29PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM5MDE5NCIgc291cmNlPSJfSEtOS2tPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTktwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOS29lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOS291ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTExMSwgLTUwMywgLTIyMjMsIDQyNTldJFsxMTExLCAtMzYyNSwgLTIyMjMsIDExMzddJFsyODg0LCAtMzYyNSwgLTQ1MCwgMTEzN10kWzI4ODQsIC00NDQ1LCAtNDUwLCAzMTddIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOS3AtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOS3FPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOSzR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkZERjgyMDE2NiIgc291cmNlPSJfSEtOSzB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTks1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOSzQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOSzVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjM5LCAtMzE3LCAtNzg1OCwgMTc0Nl0kWzIzOSwgLTk1MiwgLTc4NTgsIDExMTFdJFs3NTk0LCAtOTUyLCAtNTAzLCAxMTExXSRbNzU5NCwgLTE3NDYsIC01MDMsIDMxN10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LNmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LNnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05LNi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI1MThDOTMwMDhGIiBzb3VyY2U9Il9IS05LMHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS05LcWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOSzctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05LN09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05LN2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzksIC0zMTcsIC0xNDgyLCAyOTExXSRbLTc5LCAtMjIyMiwgLTE0ODIsIDEwMDZdJFsxNDA3LCAtMjIyMiwgNCwgMTAwNl0kWzE0MDcsIC0yOTEwLCA0LCAzMThdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOTEZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNTE4QkQ3MDFFMyIgc291cmNlPSJfSEtOSzlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtOS3FlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTkxHdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOTEYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOTEdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc2NywgLTUwMywgMTUwOCwgMzMwN10kWy03NjcsIC0yNjUxLCAxNTA4LCAxMTU5XSRbLTIyNzUsIC0yNjUxLCAwLCAxMTU5XSRbLTIyNzUsIC0zNDkzLCAwLCAzMTddIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOTEhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOTEh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfMGpmT2lzN1pFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NTY1QkIxMDE1RiIgc291cmNlPSJfMGpmT1VNN1pFZHlwVDhFTGJXSmE3dyIgdGFyZ2V0PSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMGpmT2pjN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9qODdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9rTTdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMGpmT2pzN1pFZHlwVDhFTGJXSmE3dyIgeT0iLTUzMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8wamZPaTg3WkVkeXBUOEVMYldKYTd3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8wamZPak03WkVkeXBUOEVMYldKYTd3IiBwb2ludHM9IlstODAsIC01MDMsIDUyOTEsIDM4MzZdJFstODAsIC0yNjcyLCA1MjkxLCAxNjY3XSRbLTQyMzQsIC0yNjcyLCAxMTM3LCAxNjY3XSRbLTQyMzQsIC00MDIyLCAxMTM3LCAzMTddIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfMGpmT2tjN1pFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iX3FtZGtnTTdaRWR5cFQ4RUxiV0phN3ciIHNvdXJjZT0iXzBqZk9VTTdaRWR5cFQ4RUxiV0phN3ciIHRhcmdldD0iX3doUUg4TTdaRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9sTTdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPbHM3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wam9fVU03WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzBqZk9sYzdaRWR5cFQ4RUxiV0phN3ciIHk9Ii01MzAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfMGpmT2tzN1pFZHlwVDhFTGJXSmE3dyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfMGpmT2s4N1pFZHlwVDhFTGJXSmE3dyIgcG9pbnRzPSJbODQ2LCAtNTAzLCAtMjc3OSwgMTY2Nl0kWzg0NiwgLTc5NywgLTI3NzksIDEzNzJdJFszNjQ4LCAtNzk3LCAyMywgMTM3Ml0kWzM2NDgsIC0xNjkzLCAyMywgNDc2XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1p5b2xnTTdhRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBREMwMTAyOEQiIHNvdXJjZT0iX0hLTks5T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX1p5ZTBnTTdhRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5b2xnODdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeW9saGM3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeW9saHM3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1p5b2xoTTdhRWR5cFQ4RUxiV0phN3ciIHk9Ii01MzAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfWnlvbGdjN2FFZHlwVDhFTGJXSmE3dyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfWnlvbGdzN2FFZHlwVDhFTGJXSmE3dyIgcG9pbnRzPSJbMjY1LCAtNTAzLCAtNjE2NSwgMjIyMl0kWzI2NSwgLTEyOTcsIC02MTY1LCAxNDI4XSRbNjE5MSwgLTEyOTcsIC0yMzksIDE0MjhdJFs2MTkxLCAtMjI0OSwgLTIzOSwgNDc2XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1p5b2xoODdhRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg5MTAzQUQiIHNvdXJjZT0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX1p5ZTBnTTdhRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5b2xpczdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeW9sak03YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeW9samM3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1p5b2xpODdhRWR5cFQ4RUxiV0phN3ciIHk9Ii01MzAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfWnlvbGlNN2FFZHlwVDhFTGJXSmE3dyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfWnlvbGljN2FFZHlwVDhFTGJXSmE3dyIgcG9pbnRzPSJbLTIxMiwgLTMxOCwgLTIxNzAsIDIyMjJdJFstMjEyLCAtMTExMiwgLTIxNzAsIDE0MjhdJFsxNzE5LCAtMTExMiwgLTIzOSwgMTQyOF0kWzE3MTksIC0yMDY0LCAtMjM5LCA0NzZdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfY0YybFlNN2FFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfd2hRSDhNN1pFZHlwVDhFTGJXSmE3dyIgdGFyZ2V0PSJfY0YybFVNN2FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY0YybFk4N2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxaYzdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxaczdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfY0YybFpNN2FFZHlwVDhFTGJXSmE3dyIgeT0iLTUzMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9jRjJsWWM3YUVkeXBUOEVMYldKYTd3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9jRjJsWXM3YUVkeXBUOEVMYldKYTd3IiBwb2ludHM9IlswLCAtNTAzLCAzNDQsIDIxNDNdJFswLCAtMTMwMiwgMzQ0LCAxMzQ0XSRbMjYsIC0xMzAyLCAzNzAsIDEzNDRdJFsyNiwgLTIxNzAsIDM3MCwgNDc2XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2NHQVdVTTdhRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX2NGMmxVTTdhRWR5cFQ4RUxiV0phN3ciIHRhcmdldD0iX1p5ZTBnTTdhRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NHQVdVODdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jR0FXVmM3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jR0FXVnM3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2NHQVdWTTdhRWR5cFQ4RUxiV0phN3ciIHk9Ii01MzAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfY0dBV1VjN2FFZHlwVDhFTGJXSmE3dyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfY0dBV1VzN2FFZHlwVDhFTGJXSmE3dyIgcG9pbnRzPSJbLTIzOSwgLTUwMywgNjQ1NSwgMTk4NF0kWy0yMzksIC0xMDU5LCA2NDU1LCAxNDI4XSRbLTY5MzMsIC0xMDU5LCAtMjM5LCAxNDI4XSRbLTY5MzMsIC0yMDExLCAtMjM5LCA0NzZdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEQjM4MDExRSIgbmFtZT0iTGlicmFyeUNvbmZpZ3VyYXRpb25zIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hdi1zeHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEYzNkQ3QjAzMDUiPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZEN0IwMzA1IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeUFuZENvbmZpZ3VyYXRpb25zIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkEzeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTN5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTN5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTN6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTN3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTN3dWZYRWR1cUhvT0piVVJaUnciIHg9IjEwODMiIHk9IjM4MTAiIHdpZHRoPSIzNzI1IiBoZWlnaHQ9IjIzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBMzFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzMmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzMi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzM2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkEzMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkEzMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM5IiB5PSI5MTI3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRBLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTRCLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNERPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNERlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNER1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRFdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNEJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNEJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTAwNSIgeT0iOTkiIHdpZHRoPSI1MTMwIiBoZWlnaHQ9IjIyMjYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNE91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0UC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0UWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0US1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Uk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFJlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkE0Ti1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0T09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTgyNSIgeT0iNzQ1OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkE0U3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRULWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRVZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRVLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0VmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTRSLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRTT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk0NzQiIHk9IjEwOTMwIiB3aWR0aD0iNDEyMyIgaGVpZ2h0PSIxMTA5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTRXdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0J0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNFYtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNFdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAzMzYiIHk9IjM4MTAiIHdpZHRoPSI0NDY2IiBoZWlnaHQ9IjIzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUowamNNN0FFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iX21HWTA4TTdBRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUo5dFlNN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX21KOXRZYzdBRWR5cFQ4RUxiV0phN3ciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21KOXRZczdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21KOXRZODdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX21KOXRaTTdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUo5dFpjN0FFZHlwVDhFTGJXSmE3dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbUo5dFpzN0FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUo5dFo4N0FFZHlwVDhFTGJXSmE3dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbUo5dGFNN0FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUo5dGFjN0FFZHlwVDhFTGJXSmE3dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbUo5dGFzN0FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUo5dGE4N0FFZHlwVDhFTGJXSmE3dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX21KOXRiTTdBRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfbUowamNjN0FFZHlwVDhFTGJXSmE3dyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbUowamNzN0FFZHlwVDhFTGJXSmE3dyIgeD0iOTM5MSIgeT0iMTI5MTAiIGhlaWdodD0iOTc5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s1aWQ4TTdaRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZDg4N1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2s1aWQ5TTdaRWR5cFQ4RUxiV0phN3ciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s1aWQ5YzdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s1aWQ5czdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s1aWQ5ODdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZC1NN1pFZHlwVDhFTGJXSmE3dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfazVpZC1jN1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZC1zN1pFZHlwVDhFTGJXSmE3dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfazVpZC04N1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZF9NN1pFZHlwVDhFTGJXSmE3dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfazVpZF9jN1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZF9zN1pFZHlwVDhFTGJXSmE3dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2s1aWRfODdaRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfazVpZDhjN1pFZHlwVDhFTGJXSmE3dyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfazVpZDhzN1pFZHlwVDhFTGJXSmE3dyIgeD0iNjM3NiIgeT0iMzA5NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3Ytc3lPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb25zIHBhY2thZ2UgYWRkcyBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBQbHVnaW5zIGFuZCBzY2FsaW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBhdXRob3Jpbmcgd29yay4gIEl0IGRlZmluZXMgdGhlIGtleSBjb25jZXB0IG9mIExpYnJhcnkgd2hpY2ggY29tcHJpc2VzIG9mIE1ldGhvZCBQbHVnaW5zIGFzIHdlbGwgYXMgTWV0aG9kIENvbmZpZ3VyYXRpb25zLiAgQSBMaWJyYXJ5IHJlcHJlc2VudHMgdGhlIG92ZXJhbGwgcGh5c2ljYWwgY29udGFpbmVyIGZvciBhbGwgTWV0aG9kIEVsZW1lbnRzLiAgTGlicmFyaWVzIHJlcHJlc2VudCBhIHNlcGFyYXRlIE1ldGhvZCAndW5pdmVyc2UnLCBpLmUuIGEgTWV0aG9kIExpYnJhcnkgY2Fubm90IHJlZmVyZW5jZSBlbGVtZW50cyBmcm9tIGFub3RoZXIgTWV0aG9kIExpYnJhcnkuICBBIENvbmZpZ3VyYXRpb24gaXMgYSBzdWJzZXQgb2YgUGx1Z2lucyBhbmQgTWV0aG9kIFBhY2thZ2VzLCBpLmUuIHNlbGVjdGlvbnMgb2YgTWV0aG9kIFBsdWdpbnMgd2l0aCBhIHNlbGVjdGVkIHN1YnNldCBvZiBNZXRob2QgUGFja2FnZXMuICBUaGV5IGFyZSB1c2VkIHRvIGRlZmluZSB3b3JraW5nIHNldHMgZm9yIHByb2Nlc3MgYXV0aG9yaW5nIHByb3ZpZGluZyBhIHByb2Nlc3MgZW5naW5lZXIgb25seSB3aXRoIGxpc3RzIG9mIGVsZW1lbnRzIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHByb2Nlc3Mgd2l0aGluIHN1Y2ggYSBDb25maWd1cmF0aW9uLiAgQ29uZmlndXJhdGlvbnMgYWxzbyBkZWZpbmUgdGhlIHNwYWNlIG9mIHZhcmlhYmlsaXR5IGludGVycHJldGF0aW9uIHRvIGF2b2lkIGNvbmZsaWN0cyBhbW9uZ3N0ICdjb21wZXRpbmcnIGNvbnRlbnQgKGUuZy4gY29udGVudCB0aGF0IHJlcGxhY2VzIHRoZSBzYW1lIGVsZW1lbnRzKSBhcyB3ZWxsIGFzIGRlZmluZSBzZXRzIG9mIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMgZm9yIGV4cG9ydCBhbmQgZGlzdHJpYnV0aW9uLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKQTM0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiIHNvdXJjZT0iX0hKQTMwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTN3T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTM1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQiIHk9Ii0zOTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjAiIHk9IjE2MjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM3dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzgiIHk9Ii0yNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NiIgeT0iMzU2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTM5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMy1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMy1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMy0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM191ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzX09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0QU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISkEzNGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISkEzNHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1OSwgLTU3NSwgNTksIDQxNDhdJFs1OSwgLTM1NjQsIDU5LCAxMTU5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISkE0RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIiBzb3VyY2U9Il9ISkEzd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0QS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0Ri1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDQiIHk9Ii0xNjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTcwIiB5PSIxMzgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjciIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0Si1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNExlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0Sy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0TWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRMLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Tk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0TmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRNLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKQTRGT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKQTRGZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzLCAtMTE2OCwgLTQ0NzgsIDIzMzZdJFs5MywgLTMzNzgsIC00NDc4LCAxMjddJFsyMDA2LCAtMzM3OCwgLTI1NjUsIDEyN10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQnR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSIgc291cmNlPSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQnV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCdnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTg1IiB5PSItMjU0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5MCIgeT0iMjM3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTYiIHk9Ii0xMTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J4LWZYRWR1cUhvT0piVVJaUnciIHg9IjI5NiIgeT0iMzU2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0J6T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQnl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0IwT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQnp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCMHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCMXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktCdC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktCdU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODYyLCA2MDEsIC03ODQwLCA2MDFdJFs3ODQwLCA2MDEsIC0xODYyLCA2MDFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0IyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiIHNvdXJjZT0iX0hKQTMwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKS0IzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg0MCIgeT0iMjc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUzIiB5PSItMjAzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTYxIiB5PSItMTYwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDEiIHk9IjM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCNy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCOC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0I5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0ItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0ItLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQi1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQjJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQjItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUwNywgLTE1MiwgLTgxOTUsIDQ1NzJdJFs4MDUxLCAtMTUyLCAtMTY1MSwgNDU3Ml0kWzgwNTEsIC0zNTU2LCAtMTY1MSwgMTE2OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQl9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiIgc291cmNlPSJfSEpBNEEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQ0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NDdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NyIgeT0iMTY5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NEZWZYRWR1cUhvT0piVVJaUnciIHg9IjkyIiB5PSItMjA3NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDRXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NFT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDRnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NHdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NIdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0hPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQl9lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQl91ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjU2NSwgMTAxLCAtMjU2NSwgLTM0MDNdJFs1MDQ2LCAxMDEsIC04NCwgLTM0MDNdJFs1MDQ2LCAyMzM2LCAtODQsIC0xMTY4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktDSC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0TnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktDSS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NKLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDgiIHk9IjIyOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NLdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDgiIHk9Ii0xMzU1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MjAiIHk9IjI4MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ01PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY4IiB5PSIzNTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ05lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ09lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDUGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NPLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDUWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NQLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0NJT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0NJZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEyNDQsIDExNjQsIC0zMDk1LCAtMTYxNF0kWzEyNDQsIDI2NDYsIC0zMDk1LCAtMTMyXSRbMzQxMywgMjY0NiwgLTkyNiwgLTEzMl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQ1F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNE51ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQ1J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDU3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY1IiB5PSIyNjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzOTUiIHk9Ii0yMjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NVT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYyMSIgeT0iMTUyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDVS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjUiIHk9IjM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDV09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NWdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDWE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NZT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NaT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQ1EtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQ1JPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg2MiwgMzY0LCAtMzI2OCwgLTI2MzNdJFs1MDcxLCAzNjQsIC01OSwgLTI2MzNdJFs1MDcxLCAyNDgwLCAtNTksIC01MTZdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKVHkwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiIHNvdXJjZT0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHkxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzIiB5PSIxNzAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5Mi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY5IiB5PSIxMjU0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5M2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5M3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTciIHk9Ii0xNDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk0ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIzMCIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5NXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5NnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeThPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUeTBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpUeTB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDIzLCAtNTU4LCAtNjk0LCA1OTQzXSRbNDIzLCAtNTM0MiwgLTY5NCwgMTE1OV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUeTgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUNEMDE4QiIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHktZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUeTktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzU1IiB5PSIxNDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeV91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0NCIgeT0iMTk1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpCT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyMCIgeT0iOTk5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpDZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpEZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6RC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6RS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISlR5OU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISlR5OWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE0MywgMTE1OSwgLTI1LCAtNTM0Ml0kWy0xMTQzLCA1OTQzLCAtMjUsIC01NThdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKVHpGdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3QzAzNTMiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHpHdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkyNCIgeT0iLTIwMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6SWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTYiIHk9IjkzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUektPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpKLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOTAiIHk9Ii01ODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6S3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUek1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6THVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Tk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6T09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKVHpGLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKVHpHT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQyLCAxMTY4LCAxMTU5LCAtNTMzNF0kWzQyLCA1MDgwLCAxMTU5LCAtMTQyMl0kWzIyMTgsIDUwODAsIDMzMzUsIC0xNDIyXSRbMjIxOCwgNjE4MCwgMzMzNSwgLTMyMV0kWzkzOSwgNjE4MCwgMjA1NywgLTMyMV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUek9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZBMDMxNyIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUelBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6US1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpSLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjEiIHk9IjE0NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzQiIHk9IjI2NTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUelQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6VGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUelUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6VWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpWZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKVHpPdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKVHpPLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcxMSwgMTE2OCwgMTgyOCwgLTUzMzRdJFs3MTEsIDQzMzQsIDE4MjgsIC0yMTY3XSRbMzg1MiwgNDMzNCwgNDk2OSwgLTIxNjddJFszODUyLCA2NzM5LCA0OTY5LCAyMzddJFs5MzksIDY3MzksIDIwNTcsIDIzN10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfb3l5dzBNN0FFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iX295REo4TTdBRWR5cFQ4RUxiV0phN3ciIHNvdXJjZT0iX21KMGpjTTdBRWR5cFQ4RUxiV0phN3ciIHRhcmdldD0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfb3l5dzA4N0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfb3l5dzFjN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9veXl3MXM3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfb3l5dzFNN0FFZHlwVDhFTGJXSmE3dyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfb3l5dzBjN0FFZHlwVDhFTGJXSmE3dyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9veXl3MHM3QUVkeXBUOEVMYldKYTd3IiBwb2ludHM9Ils1LCAtMTMsIC0zNSwgNzRdJFstMzgsIC04MSwgLTc4LCA2XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il91eXpMY003QUVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfdXhtNG9NN0FFZHlwVDhFTGJXSmE3dyIgc291cmNlPSJfbUowamNNN0FFZHlwVDhFTGJXSmE3dyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eXpMYzg3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eXpMZGM3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ekxkczdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il91eXpMZE03QUVkeXBUOEVMYldKYTd3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eXpMZDg3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfdXh3cG84N0FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ekxlYzdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91eXpMZU03QUVkeXBUOEVMYldKYTd3IiB4PSItMjExNyIgeT0iMzE2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eTg4Y003QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX3V4d3BvODdBRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eTg4Y3M3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3V5ODhjYzdBRWR5cFQ4RUxiV0phN3ciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhjODdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX3V4d3BvTTdBRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eTg4ZGM3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91eTg4ZE03QUVkeXBUOEVMYldKYTd3IiB4PSIyMDEzIiB5PSItMTg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eTg4ZHM3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfdXh3cG9NN0FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhlTTdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91eTg4ZDg3QUVkeXBUOEVMYldKYTd3IiB4PSIxMDA5IiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhlYzdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il91eHdwbzg3QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGU4N0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3V5ODhmTTdBRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdXk4OGVzN0FFZHlwVDhFTGJXSmE3dyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGZjN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfdXh3cG9NN0FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhmODdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il91eTg4Z003QUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3V5ODhmczdBRWR5cFQ4RUxiV0phN3ciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhnYzdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfdXh3cG84N0FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhnODdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il91eTg4aE03QUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3V5ODhnczdBRWR5cFQ4RUxiV0phN3ciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhoYzdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il91eHdwb003QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGg4N0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdXk4OGlNN0FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91eTg4aHM3QUVkeXBUOEVMYldKYTd3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il91eXpMY2M3QUVkeXBUOEVMYldKYTd3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3V5ekxjczdBRWR5cFQ4RUxiV0phN3ciIHBvaW50cz0iWzIxNjksIC0yNiwgLTkyNiwgOTEyOF0kWzcxNzAsIC0yNiwgNDA3NSwgOTEyOF0kWzcxNzAsIC05MjM0LCA0MDc1LCAtODBdJFszMjI4LCAtOTIzNCwgMTMzLCAtODBdIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9qYmxJb003TkVkeXBUOEVMYldKYTd3IiBpZD0iKDAuOTY3NTMyNDYsMC4xODEwNzg3NikiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfcW1ka2djN1pFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iX3FtZGtnTTdaRWR5cFQ4RUxiV0phN3ciIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX2s1aWQ4TTdaRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcW1ka2hNN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcW1ka2hzN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xbW5WZ003WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcW1ka2hjN1pFZHlwVDhFTGJXSmE3dyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfcW1ka2dzN1pFZHlwVDhFTGJXSmE3dyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9xbWRrZzg3WkVkeXBUOEVMYldKYTd3IiBwb2ludHM9IlstODUsIC0zMCwgODgsIDIzXSRbLTExMSwgLTU4LCA2MiwgLTVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc2QTNFQzAwMjciIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISmRqdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKZGpzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGpzdWZYRWR1cUhvT0piVVJaUnciIHg9IjY2OCIgeT0iOTE0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKZGp4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpkandlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkand1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTExMCIgeT0iMzc3NiIgd2lkdGg9IjMyODIiIGhlaWdodD0iMTA4MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGowLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISmRqMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGoyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGoyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGozT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGozZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGozdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKZGowZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGowdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMjQiIHk9IjM4NjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3SDJvZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IHByb2Nlc3NlcyBhcmUgcGFja2FnZWQgaW4gbWV0aG9kbGlicmFyeSBhbmQgcmVsYXRlZCB0byBjb25maWd1cmF0aW9ucy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISmRqNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0IiBzb3VyY2U9Il9ISmRqd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGo1T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02OTkiIHk9Ii0zMzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkajZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1IiB5PSIyMDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ5IiB5PSItMjI5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqN3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzkiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkajhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2OSIgeT0iMjMwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGo5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkajlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkai1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGotdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkai1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkai0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkal91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqX09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpka0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpka0F1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRrQU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISmRqNGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISmRqNHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQ1NiwgMzMsIDY2NzEsIDMzXSRbLTY3MTQsIDMzLCAxNDEzLCAzM10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpka0EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2MyIgc291cmNlPSJfSEpkajBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpkanNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRrQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRrQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGtDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpka0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpka0JPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpka0JlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgLTUwLCAyNDg5XSRbMCwgLTI0ODksIC01MCwgNDU3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEpka0N1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISmRrQy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZZUHktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEQjM4MDExRSI+DQotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0FfX19vT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiLz4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZZUDNPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1NjVCQjEwMTVGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3FtZGtnTTdaRWR5cFQ4RUxiV0phN3ciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZpQTFPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2aUEwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4IiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cnh4dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdnJ4eGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCIgbmFtZT0icHJvY2Vzc1ZpZXdzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd6ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3ek9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1IiBuYW1lPSJkZWZhdWx0VmlldyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI5MUNEMDE4QiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3MGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwNzBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTciIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzZDRTUyMDNCMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zdHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN2ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIiBuYW1lPSJhZGRlZENhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1OTAwNkEwMzE3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN4T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIiBuYW1lPSJQcm9jZXNzRmFtaWx5Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2WVA0T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjYzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh6dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiIG5hbWU9IlByb2Nlc3MiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZpQXctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiI+DQotICAgICAgICAgICAgICA8Ym9keT5Qcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLg0KLVRoZXNlIGNvbmZpZ3VyYXRpb25zIGRlc2NyaWJlIHZhbGlkIGNvbnRleHRzIGZvciB0aGUgUHJvY2VzcyB3aXRoaW4gYSBNZXRob2QgTGlicmFyeSBpbmRpY2F0aW5nIHVuZGVyIHdoaWNoIENvbmZpZ3VyYXRpb25zIGEgUHJvY2VzcyBpcyB3ZWxsIGRlZmluZWQuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd2ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3dk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCIgbmFtZT0idmFsaWRDb250ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd4dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3eGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1IiBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2aUF4LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZGREY4MjAxNjYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI1MThDOTMwMDhGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdnJ4MXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeDFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDdzLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3c3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdmlBemVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgc2VsZWN0aW9uIG9mIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdmlBMGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZpQTBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZpQTF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2cnh5T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RGVsaXZlcnkgUHJvY2VzcyBjYW4gYmUgb3JnYW5pemVkIGluIG1hbnkgUHJvY2VzcyBGYW1pbGllcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSIgbmFtZT0icHJvY2Vzc0ZhbWlsaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cnh6T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdnJ4eS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdnJ4MGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgcGh5c2ljYWxseSBjb21wcmlzZXMgb2YgTWV0aG9kIFBsdWdpbnMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiIG5hbWU9Il9tZXRob2RMaWJyYXJ5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIF8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZyeDJPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHN0b3JlcyBhIHNldCBvZiBwcmVkZWZpbmVkIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGFyZSByZWd1bGFybHkgdXNlZCBieSB0aGUgbGlicmFyeSBhdXRob3JzIChlLmcuIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHRoZXkgc2hpcCB0byB0aGVpciB1c2VycykuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiIG5hbWU9Il9tZXRob2RMaWJyYXJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEgXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdjA3dHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBoYXMgZXhhY3RseSBvbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdGhlIGNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggdGhlIHByb2Nlc3MgaGFzIGJlZW4gY3JlYXRlZC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3dXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3VlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIF8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3YwN3YtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgY2FuIGhhdmUgbWFueSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIHRvIGFsc28gcHJvZHVjZSB2YWxpZCByZXN1bHRzLiAgUHJvY2VzcyBFbGVtZW50cyAoZS5nLiBEZXNjcmlwdG9ycykgdGhhdCByZWZlciB0byBjb250ZW50IHBhY2thZ2VzIHRoYXQgYXJlIGRlZmluZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygc3VjaCBhIGNvbmZpZ3VyYXRpb24gd291bGQgbm90IGJlIHNob3duIGluIHRoZSBwcm9jZXNzIHdoZW4gcHVibGlzaGVkIG9yIHVzZWQgdW5kZXIgc3VjaCBhIGNvbmZpZ3VyYXRpb24uICBUaGlzIGFsbG93cyB0byBlYXNpbHkgcmVtb3ZlIGNvbnRlbnQgZnJvbSBhIHByb2Nlc3MgYnkgcmVtb3ZpbmcgY29udGVudCBwYWNrYWdlcyB0byBmcm9tIHRoZSByZWxhdGVkIGNvbmZpZ3VyYXRpb24uPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3ctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyBfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd5dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3eWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUgXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI5MUNEMDE4QiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zc09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwNzAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzZDRTUyMDNCMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3IF8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Ytc3N1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTUyMDNCMCI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmaW5pdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9ucyBvZiBvdGhlciBjb25maWd1cmF0aW9ucy4gIEZvciBleGFtcGxlLCBhIGNvbmZpZ3VyYXRpb24gQSBjb3VsZCBiZSBkZWZpbmVkIGFzIHRoZSBzdXBlcnNldCBvZiBjb25maWd1cmF0aW9ucyBCLCBDLCBhbmQgRCBwbHVzIGFkZCBtb3JlIHNlbGVjdGVkIFBsdWdpbnMgYW5kIFBhY2thZ2VzLiAgSW4gc3VjaCBhIGNhc2UgQSB3b3VsZCBsaXN0IEIsIEMsIGFuZCBEIGFzIGl0cyBiYXNlQ29uZmlndXJhdGlvbnMuICBJZiBhbnkgb2YgdGhlc2UgYmFzZSBjb25maWd1cmF0aW9ucyBjaGFuZ2VzIGFsbCB1cGRhdGVzIHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdmFsaWQgZm9yIEEgYXMgd2VsbCByZWR1Y2luZyBtYWludGFpbmFiaWxpdHkgb3ZlcmhlYWQgZm9yIG92ZXJsYXBwaW5nL2RlcGVuZGVudCBjb25maWd1cmF0aW9ucy4gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN1ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIgXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NThFRjdDMDM1MyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zd09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3YtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZBMDMxNyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIF8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfbUdZMDhNN0FFZHlwVDhFTGJXSmE3dyIgbmFtZT0iQ29uZmlndXJhdGlvbkNhdGVnb3J5Ij4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfb3lESjhNN0FFZHlwVDhFTGJXSmE3dyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il91eHdwb003QUVkeXBUOEVMYldKYTd3IiBuYW1lPSJjb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFzc29jaWF0aW9uPSJfdXhtNG9NN0FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il91eHdwb3M3QUVkeXBUOEVMYldKYTd3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdXh3cG9jN0FFZHlwVDhFTGJXSmE3dyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il91eG00b003QUVkeXBUOEVMYldKYTd3IiBtZW1iZXJFbmQ9Il91eHdwb003QUVkeXBUOEVMYldKYTd3IF91eHdwbzg3QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdXh3cG84N0FFZHlwVDhFTGJXSmE3dyIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfbUdZMDhNN0FFZHlwVDhFTGJXSmE3dyIgYXNzb2NpYXRpb249Il91eG00b003QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3V4d3BwYzdBRWR5cFQ4RUxiV0phN3ciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il91eHdwcE03QUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiIG5hbWU9Ik1ldGhvZFVuaXRzIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hd2JZby1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUZFREUwOTAzQjAiPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFMDkwM0IwIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZW9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTc1MDA0RSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZXBPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NzMiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2VxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2VxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2VyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2VvZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2VvdWZYRWR1cUhvT0piVVJaUnciIHg9IjU4ODciIHk9IjYwMDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTgwMDI1MiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZXRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0NTQiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndldi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2VzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2VzdWZYRWR1cUhvT0piVVJaUnciIHg9IjkwMjIiIHk9IjYwMDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZTdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlOHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlOU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlOXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZS1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndlNnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndlNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTk1IiB5PSIyNjUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZS1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0N0U1MDE3OCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZV9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzODYiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZBdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZCT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZCdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmQ09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2UtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2UtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE4NTQiIHk9IjYwMDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZkZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzMTgiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmRy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQby1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndmRS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndmRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjAiIHk9IjI5ODgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEo2UHF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MzgiIGhlaWdodD0iMjQyMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlByLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKNlBwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlBxT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MjgiIHk9IjIzNDUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEo2UUd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRSC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRSS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UUplZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISjZRRi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZRR09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzAzMCIgeT0iNjAwNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISjZRTS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFPT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFPdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFQT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRUHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKNlFNT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlFNZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzEwIiB5PSI2MDA0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd2JZcGVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifE1ldGhvZCBhbmQgUHJvY2VzcyBBdXRob3JpbmcgaXMgbm90IGRvbmUgaW4gaXNvbGF0aW9uIGJ5IGEgc2luZ2xlIHByb2Nlc3MgZW5naW5lZXIuICBFc3BlY2lhbGx5LCB3aGVuIGxhcmdlIHNjYWxlIE1ldGhvZCBMaWJyYXJpZXMgc2hhbGwgYmUgbWFpbnRhaW5lZCBpdCBpcyBpbXBvcnRhbnQgdG8gZGVmaW5lIHRoZSByaWdodCBtb2R1bGFyaXphdGlvbiBwcmluY2lwbGVzIHRoYXQgYWxsb3cgY29uY3VycmVudCBkZXZlbG9wbWVudCBvZiBsYXJnZSBzY2FsZSBwcm9jZXNzIGVuZ2luZWVyaW5nIHRlYW1zLiAgTWV0aG9kIFBsdWdpbnMgd2VyZSBhIGZpcnN0IHN0ZXAgb2YgbW9kdWxhcml6YXRpb24uICBIb3dldmVyLCBldmVuIHdvcmtpbmcgd2l0aCBNZXRob2QgUGx1Z2lucyBjYW4gb25seSBzY2FsZSBpbiBsaW1pdGVkIHdheXMgc3VwcG9ydGluZyBvbmx5IHZlcnkgc21hbGwgYXV0aG9yaW5nIHRlYW1zLiAgRm9yIGxhcmdlciBzY2FsZSBtZXRob2QgbGlicmFyaWVzIGNvbmN1cnJlbnQgYWNjZXNzIGFuZCB3b3JraW5nIGV2ZW4gd2l0aGluIGEgTWV0aG9kIFBsdWdpbiBpcyByZXF1aXJlZC4gIFRvIGFkZHJlc3MgdGhlc2UgcmVxdWlyZW1lbnRzIHRoZSBNZXRob2QgVW5pdHMgcGFja2FnZSBleHRlbmRzIE1ldGhvZCBFbGVtZW50cyB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIGEgbmV3IGNhcGFiaWxpdHkgZGVmaW5lZCBhcyBNZXRob2QgVW5pdC4gIEEgTWV0aG9kIFVuaXQgaXMgYSB1bml0IG9mIGNvbnRyb2wgdGhhdCBjYW4gYmUgd29ya2VkIG9uIGJ5IG9uZSBwcm9jZXNzIGVuZ2luZWVyIGFuZCBjYW4gc2VydmUgYXMgb25lIHVuaXQgb2YgdmVyc2lvbiBjb250cm9sLiYjeEE7fFRoZSBkaWFncmFtIHNob3dzIHRoYXQgZm91ciB0eXBlcyBvZiBNZXRob2QgVW5pdHMgaGF2ZSBiZWVuIGRlZmluZWQuICBDb250ZW50IERlc2NyaXB0aW9uIHJlcHJlc2VudGluZyBhbGwgbWFqb3IgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2ssIEFydGlmYWN0LCBHdWlkZWxpbmUsIG9yIFdoaXRlcGFwZXIgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4gIFdoZXJlYXMgZXZlcnkgQ29udGVudCBFbGVtZW50J3MgQ29udGVudCBEZXNjcmlwdGlvbiBjYW4gYmUgc2VlbiBhcyBhbiBlbGVtZW50IHRoYXQgY2FuIGJlIG1haW50YWluZWQgaW4gaXNvbGF0aW9uLCBQcm9jZXNzZXMgYXJlIGtlcHQgYW5kIG1hbmFnZWQgYXMgYSB3aG9sZS4gIElmIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBuZWVkcyB0byBiZSBzcGxpdCBhbmQgaGFuZGxlZCBhcyBzZXBhcmF0ZSB1bml0cyBvZiBjb250cm9sIHRoZW4gbmV3IHByb2Nlc3NlcyBzdWNoIGFzIENhcGFiaWxpdHkgUGF0dGVybnMgd2lsbCBiZSBjcmVhdGVkIGZvciBzdWNoIGEgcmVmYWN0b3JpbmcuICBIZW5jZSwgZXhhY3RseSBvbmUgaW5zdGFuY2Ugb2YgUHJvY2VzcyBzaGFsbCBiZSBzdG9yZWQgaW4gYW4gaW5zdGFuY2Ugb2YgUHJvY2VzcyBDb21wb25lbnQsIHdoaWNoIGlzIGRlZmluZWQgdG8gYmUgdGhlIGNvbnRhaW5lciBmb3IgYSBQcm9jZXNzIGFuZCB0aGVyZWZvcmUgaXRzIE1ldGhvZCBVbml0LiAgRmluYWxseSwgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBMaWJyYXJpZXMgYXJlIGRlZmluZWQgYXMgTWV0aG9kIFVuaXRzLiAgV2hlcmVhcywgdGhlIGZvcm1lciBzdG9yZXMgYWxsICdtb2RlbGVkJyBlbGVtZW50cyBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHN1Y2ggYXMgYWxsIENvbnRlbnQgRWxlbWVudHMgKG9ubHkgdGhlIGRlc2NyaXB0aW9uIGNsYXNzZXMgYXJlIG1haW50YWluZWQgYXMgc2VwYXJhdGUgdW5pdHMpLCB0aGUgbGF0ZXIgZGVmaW5lcyBhIE1ldGhvZCBVbml0IHRvIHN0b3JlIHJlZmVyZW5jZXMgdG8gdGhlIE1ldGhvZCBQbHVnaW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIExpYnJhcnkgYXMgd2VsbCBhcyBNZXRob2QgQ29uZmlndXJhdGlvbnMuJiN4QTsiLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzUwM0ExIiBzb3VyY2U9Il9ISndlb09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQdC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlB1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIwMywgLTQ1NywgLTExMTcsIDIzODddJFs3NDUsIC0xNjM0LCAtNTc1LCAxMjEwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQdnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UHYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM5MDE5NCIgc291cmNlPSJfSEp3ZXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UHctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UHdPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQd2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjk2LCAtNDU3LCAxNDgxLCAyMzg3XSRbLTEwMzIsIC0xNjM0LCA3NDUsIDEyMTBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQeHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQeU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4OTEwM0FEIiBzb3VyY2U9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISndlNmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQek9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQeWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlB5dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNSwgLTEyMTksIDI1LCAxNjI1XSRbLTUwLCAtMjMxOSwgMCwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQME9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UDBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0ODAwMDFBRSIgc291cmNlPSJfSEp3ZS1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UDFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UDB1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQMC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MDIsIC00NTcsIC0zNzY3LCAyMzg3XSRbMjU1NiwgLTE2MzQsIC0xOTEzLCAxMjEwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UDJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQMmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UDJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyIgc291cmNlPSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEp3ZkV1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UDN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY0IiB5PSItMjEyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00NCIgeT0iLTI4OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMwMCIgeT0iMjIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlA4T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlA5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UC1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQOXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UC0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UF9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQLXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQMi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQM09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjI2OSwgLTUwLCA1MzAwLCAwXSRbLTU5MDksIC01MCwgMTY1OSwgMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UUp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkZERjgyMDE2NiIgc291cmNlPSJfSEo2UUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UUt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UUotZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZRS09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTU2LCAtNTI0LCA0NDI4LCAyMzcwXSRbLTMxMTUsIC0xNjg0LCAyMjY5LCAxMjEwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UUxlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRTHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UVAtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NTY1QkIxMDE1RiIgc291cmNlPSJfSEo2UUwtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UVEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UVFPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZRUWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTYxNywgLTUyNCwgNzU3NywgMjM3MF0kWy02OTI1LCAtMjE4NCwgMjI2OSwgNzExXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UVJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRUi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dIMnBlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEREI2MDMwNiI+DQotICAgICAgICAgICAgPGJvZHk+MDE8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0dOa0I4T3hTRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiLz4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il95QXdCa01pVEVkeXhPNEVzdVFPZ1RnIiBtZXJnZWRQYWNrYWdlPSJfaGFZSmpzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVERTc1MDA0RSIgbmFtZT0iTWV0aG9kUGx1Z2luIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRUUwQzUwM0ExIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVERTgwMDI1MiIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM5MDE5NCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiIG5hbWU9Ik1ldGhvZFVuaXQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dIMnMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEODkxMDNBRCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNUIiIG5hbWU9ImF1dGhvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3SDJ0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNUIiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il81ZEdORWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNWRHTkVPeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzVVVGRjT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNjQiIG5hbWU9ImNoYW5nZURhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5vdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNjQiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfVVotUThleU1FZHVGS0pvdkJMNjRYUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1VaLVE4T3lNRWR1RktKb3ZCTDY0WFEiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1JucGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDZFIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfTkdlNVlleUZFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX05HZTVZT3lGRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9POVpYc095RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDZGIiBuYW1lPSJ2ZXJzaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1JucU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDZGIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9zV1RWOGV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfc1dUVjhPeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3NNVTZrT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hd2JZb2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3diWW9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk0N0U1MDE3OCIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTQ4MDAwMUFFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIF8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dSbnJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyI+DQotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBVbml0IGNhbiBoYXZlIGV4YWN0bHkgb25lIENvcHlyaWdodCBTdGF0ZW1lbnQgc2VjdXJpbmcgdGhlIGludGVsbGVjdHVhbCBjYXBpdGFsIGl0IHJlcHJlc2VudHMuICBJdCB3aWxsIGJlIHB1Ymxpc2hlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGNvbmNyZXRlIEVsZW1lbnQuICBOb3RlLCB0aGF0IENvcHlyaWdodCBTdGF0ZW1lbnRzIGZvciBNZXRob2QgTGlicmFyaWVzIGFuZCBNZXRob2QgUGx1Z2lucyBkZWZpbmUgdGhlIGRlZmF1bHQgc3RhdGVtZW50IGZvciBpdHMgY29udGFpbmVkIGVsZW1lbnRzLCB3aGljaCBjYW4gYmUgJ292ZXJ3cml0dGVuJyB3aXRoIHJldmlzZWQgc3RhdGVtZW50cyBmb3IgZXZlcnkgQ29udGVudCBEZXNjcmlwdGlvbiBvciBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSIgbmFtZT0iX21ldGhvZFVuaXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkE3RDUyRjAyNDMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbnJGOFVleU1FZHVGS0pvdkJMNjRYUSIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX25yRjhVT3lNRWR1RktKb3ZCTDY0WFEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iX2hhWUo0Y2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IlVNTDJEaWFncmFtSW50ZXJjaGFuZ2VfZGVwcmVjYXRlZCI+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9oYVlKNHNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il9oYVlKNDhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfaGFZSjQ4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRpYWdyYW1zIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo1TWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPU3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSjVjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZSjVzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo1OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSjZNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKNmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSjZzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUo2OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKN01pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUo3Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKN3NpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUo3OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKOE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKOGNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlKOHNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUo4OGlNRWR5eE80RXN1UU9nVGciIHg9IjE3Nzk2IiB5PSI5ODM4Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKOU1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZTl9jaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo5Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUo5c2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKOThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUotTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSi1jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUotc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSi04aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpfTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSl9jaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpfc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSl84aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtBTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtBY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUtBc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZS0E4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMTMwODIiIHk9IjEyNzg5Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLQk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT0g4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtCY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUtCc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSI2MjMxIiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLQjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtDTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0NjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtDc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLQzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0RNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLRGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0RzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLRDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0VNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0VjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS0VzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLRThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyMjMzNSIgeT0iMzEzMiIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0ZNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9Kc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLRmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLRnNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMjU1NiIgaGVpZ2h0PSIxNTc0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0Y4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLR01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtHY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLR3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0c4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtITWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0hjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtIc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0g4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtJTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtJY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUtJc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZS0k4aU1FZHl4TzRFc3VRT2dUZyIgeD0iNjc0NyIgeT0iNDY0OCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0pNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9PTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLSmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLSnNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMjIwMSIgaGVpZ2h0PSIxMDY2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0o4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLS01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtLY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLS3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0s4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtMTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0xjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtMc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0w4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtNTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtNY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUtNc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZS004aU1FZHl4TzRFc3VRT2dUZyIgeD0iMTI2NjYiIHk9IjEwMjg3Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtOY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUtOc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSI0MzY4IiBoZWlnaHQ9IjExNjgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLTjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtPTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS09jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtPc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLTzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1BNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLUGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1BzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLUDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1FNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS1FjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS1FzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLUThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIxMjE0MSIgeT0iMjk3MSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1JNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9NTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLUmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLUnNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMjkxMiIgaGVpZ2h0PSIxMDY2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1I4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLU01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtTY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLU3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS1M4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtUTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS1RjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtUc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS1Q4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtVTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtVY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUtVc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZS1U4aU1FZHl4TzRFc3VRT2dUZyIgeD0iNDM4NSIgeT0iMTAyMzYiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtWTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPQU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1ZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZS1ZzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjI3NjAiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtWOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1dNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLV2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1dzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtXOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLWE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtYY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLWHNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtYOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLWU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLWWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLWXNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUtZOGlNRWR5eE80RXN1UU9nVGciIHg9IjEzMTQ4IiB5PSI2OTQyIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLWk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT1FNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtaY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUtac2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjE1NzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLWjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUthTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2FjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUthc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLYThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2JNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLYmNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2JzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLYjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2NNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS2NjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS2NzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLYzhpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyMjIzMyIgeT0iNjY4MCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2RNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9XY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLZGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLZHNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMzg0MyIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2Q4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLZU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtlY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLZXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS2U4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtmTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS2ZjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtmc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS2Y4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtnTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtnY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUtnc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZS2c4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMTExMzMiIHk9IjE1NDI2Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLaE1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT1RjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtoY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUtoc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIzMDgxIiBoZWlnaHQ9IjE1NzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLaDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtpTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2ljaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtpc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLaThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2pNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLamNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2pzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLajhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2tNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS2tjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS2tzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLazhpTUVkeXhPNEVzdVFPZ1RnIiB4PSIxNzc2MyIgeT0iMTI0MjAiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtsTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPWmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2xjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZS2xzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjUyMTUiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtsOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS21NaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLbWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS21zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUttOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLbk1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtuY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLbnNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtuOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLb01pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLb2NpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLb3NpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUtvOGlNRWR5eE80RXN1UU9nVGciIHg9IjM1MzkiIHk9IjE3ODY0Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLdE1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2E4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt0Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUt0c2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSI0NTIxIiBoZWlnaHQ9IjEwNjYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLdDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt1TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3VjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt1c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLdThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3ZNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLdmNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3ZzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLdjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3dNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS3djaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS3dzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLdzhpTUVkeXhPNEVzdVFPZ1RnIiB4PSIxNjc4OSIgeT0iMTgxMTAiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt4TWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPZGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3hjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZS3hzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjIzODciIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt4OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3lNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLeWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3lzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUt5OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLek1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUt6Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLenNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUt6OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLME1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLMGNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLMHNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUswOGlNRWR5eE80RXN1UU9nVGciIHg9IjI2NDQxIiB5PSIxMDcwMSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzFNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9kOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLMWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLMXNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMjMzNiIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzE4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLMk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUsyY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLMnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSzI4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUszTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSzNjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUszc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSzM4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUs0TWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUs0Y2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUs0c2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZSzQ4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMjI1MDciIHk9IjEzOTQ4Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLNU1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2ZjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUs1Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUs1c2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjE1NzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLNThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUs2TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUs2c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLNjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzdNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLN2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzdzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLNzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzhNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSzhjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZSzhzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLODhpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyNTM4MyIgeT0iMTM4NDMiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUs5TWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPaDhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzljaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZSzlzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjI5OTciIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUs5OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSy1NaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLLWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSy1zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUstOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLX01pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtfY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLX3NpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtfOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMQU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMQWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlMQXNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUxBOGlNRWR5eE80RXN1UU9nVGciIHg9IjI4ODc5IiB5PSIxMzg1MSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEJNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9rTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMQmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlMQnNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSIzMzAyIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEI4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMQ01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxDY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMQ3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTEM4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxETWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTERjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxEc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTEQ4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxFTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxFY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUxFc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTEU4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMzEzOTQiIHk9IjE3NDQ5Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMRk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZTl9jaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxGY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUxGc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMRjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxHTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEdjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxHc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTEc4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxITWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTEhjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxIc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTEg4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxJTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxJY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUxJc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTEk4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMjc1MjAiIHk9IjIwMTE4Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMSk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2ljaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxKY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUxKc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSI0MDgwIiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMSjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxLTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEtjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxLc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMSzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTExNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMTGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTExzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMTDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTE1NaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTE1jaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZTE1zaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlMTThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyNzA2NyIgeT0iMTc0NTgiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxWTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPY01pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTFZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZTFZzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iMTA2NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxWOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTFdNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMV2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTFdzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxXOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMWE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxYY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMWHNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxYOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMWU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMWWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlMWXNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUxZOGlNRWR5eE80RXN1UU9nVGciIHg9IjEwNjQyIiB5PSIxODIxMSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzJ5ZXNNaU5FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2cyeWVzOGlORWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2cyeWV0TWlORWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nMnlldGNpTkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2cyeWV0c2lORWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzJ5ZXQ4aU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2cyeWV1TWlORWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9nMnlldWNpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzJ5ZXVzaU5FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9nMnlldThpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzJ5ZXZNaU5FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9nMnlldmNpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzJ5ZXZzaU5FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZzJ5ZXY4aU5FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfZzJ5ZXNjaU5FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9nMnllc3NpTkVkeXhPNEVzdVFPZ1RnIiB4PSIxMTc0NSIgeT0iMTMwIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xSUFMWU1pTkVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcUlBTFk4aU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfcUlBTFpNaU5FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FJQUxaY2lORWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcUlBTFpzaU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xSUFMWjhpTkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcUlBTGFNaU5FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xSUFMYWNpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcUlBTGFzaU5FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xSUFMYThpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcUlBTGJNaU5FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xSUFMYmNpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcUlBTGJzaU5FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcUlBTGI4aU5FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfcUlBTFljaU5FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9xSUFMWXNpTkVkeXhPNEVzdVFPZ1RnIiB4PSIxNzMyNyIgeT0iMjAzNDQiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3RBN2dVTWlORWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90QTdnVThpTkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il90QTdnVk1pTkVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdEE3Z1ZjaU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90QTdnVnNpTkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3RBN2dWOGlORWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90QTdnV01pTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3RBN2dXY2lORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90QTdnV3NpTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3RBN2dXOGlORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90QTdnWE1pTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3RBN2dYY2lORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90QTdnWHNpTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il90QTdnWDhpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il90QTdnVWNpTkVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3RBN2dVc2lORWR5eE80RXN1UU9nVGciIHg9IjExNTM0IiB5PSIyMDI0MCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX2hhWUxaTWlNRWR5eE80RXN1UU9nVGciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIGFsbW9zdCBleGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVU1MIDIuMCBEaWFncmFtIEludGVyY2hhbmdlIE1ldGEtTW9kZWwuICBTb21lIGV4dGVuc2lvbnMgaGFkIGJlZW4gYWRkZWQsIGUuZy4gZGVycml2aW5nIGFsbCBub24tdmFsdWUgY2xhc3NlcyBmcm9tIE1ldGhvZEVsZW1lbnQuIEFub3RoZXIgbWlub3IgZGlmZmVyZW5jZSB0byB0aGUgc3RhbmRhcmQgaXMgdGhhdCBSb3NlL0VNRiBkbyBub3Qgc3VwcG9ydCBhdHRyaWJ1dGUgYXJyYXlzLCB3aGljaCBoYXMgYmVlbiBtb2RlbGVkIGhlcmUgd2l0aCBhc3NvY2lhdGlvbnMuICBGb3IgZG9jdW1lbnRhdGlvbiBvZiB0aGUgaW5kaXZpZHVhbCBjbGFzc2VzIHNlZSB0aGUgc3RhbmRhcmQgZG9jdW1lbnQgYXQgd3d3LnVtbC5vcmcuIi8+DQotICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWUxaY2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPb2NpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLSk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlKOU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTFpzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMWjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGFNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUxhY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMYXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT29zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGE4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTGJNaU1FZHl4TzRFc3VRT2dUZyIgeD0iMjciIHk9Ii0yMjkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMYmNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPb3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMYnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTGI4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxjTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9QY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxjY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTGNzaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTE1MCIgeT0iLTQ0OSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxjOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPUGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMZE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMZGNpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMzc4IiB5PSIxMzM3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGRzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9vc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxkOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxlTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxlY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMZXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPUGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMZThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMZk1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMZmNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGZzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPb3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMZjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMZ01pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMZ2NpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGdzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9QY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxnOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTGhNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTGhjaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWUxoc2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTGg4aU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTExMCwgNTI0LCAtOCwgLTE5NjRdJFstMTEwLCAyMDQ4LCAtOCwgLTQ0MF0iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWUxpTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPbWNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLQk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGljaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMaXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGk4aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUxqTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMamNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT0djaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGpzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTGo4aU1FZHl4TzRFc3VRT2dUZyIgeD0iLTM0OSIgeT0iMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGtNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPR2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMa2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTGtzaU1FZHl4TzRFc3VRT2dUZyIgeD0iMjc4IiB5PSItMjgwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGs4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT0k4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGxNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMbGNpTUVkeXhPNEVzdVFPZ1RnIiB4PSI0NTAiIHk9IjE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxsc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPSThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMbDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMbU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSItNDczIiB5PSItMjQ2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTG1jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9HY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxtc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxtOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxuTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMbmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPSThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMbnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMbjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMb01pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTG9jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPR2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMb3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMbzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMcE1pTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHBjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9JOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxwc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTHA4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTHFNaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWUxxY2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTHFzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTMxMTUsIDI2MiwgODAwOSwgNDE0XSRbLTg5NDAsIDI2MiwgMjE4NCwgNDE0XSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTHE4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9tc2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtOTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtGTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMck1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxyY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMcnNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTHI4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxzTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPbThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMc2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMc3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSItODIiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMczhpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPbThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMdE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTHRjaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx0c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9ITWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx0OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTHVNaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTQ3MCIgeT0iMjIxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHVjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9ITWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx1c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUx1OGlNRWR5eE80RXN1UU9nVGciIHg9Ii0zNzciIHk9Ii0yMDMiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMdk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT204aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTHZzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTHY4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx3TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9ITWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx3Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUx3c2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUx3OGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMeE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9tOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx4Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUx4c2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUx4OGlNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMeU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT0hNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHljaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMeXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMeThpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTHpNaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlMemNpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstMjE4NCwgNDMxLCA0MTE0LCAtMTQ0N10kWy0zMTE1LCA0MzEsIDMxODMsIC0xNDQ3XSRbLTMxMTUsIDIwMzIsIDMxODMsIDE1Ml0kWy01MDIwLCAyMDMyLCAxMjc4LCAxNTJdIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlMenNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT29NaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS1JNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS0pNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx6OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDBNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwwY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlMMHNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDA4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9Pc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwxTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUwxY2lNRWR5eE80RXN1UU9nVGciIHg9Ii00MjMiIHk9Ii0yMTkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMMXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9Pc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwxOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMMk1pTUVkeXhPNEVzdVFPZ1RnIiB4PSIxMTAiIHk9IjMzMSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwyY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9OY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwyc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTDI4aU1FZHl4TzRFc3VRT2dUZyIgeD0iNTEiIHk9Ii0yMzYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMM01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT05jaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDNjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTDNzaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTQ5OSIgeT0iMjk3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDM4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9Pc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUw0TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUw0Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUw0c2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMNDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPTmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMNU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMNWNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMNXNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDU4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPT3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMNk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMNmNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMNnNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDY4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9OY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUw3TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTDdjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTDdzaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWUw3OGlNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTDhNaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMTQ1NiwgMzMsIC02NDY4LCAtMTZdJFs2ODI0LCAzMywgLTExMDAsIC0xNl0iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWUw4Y2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPbU1pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLVk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDhzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMODhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDlNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUw5Y2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMOXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT0ZzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDk4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTC1NaU1FZHl4TzRFc3VRT2dUZyIgeD0iMjkyIiB5PSIzOTAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMLWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9Gc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwtc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMLThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIzNDMiIHk9Ii05NTciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMX01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPQThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMX2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxfc2lNRWR5eE80RXN1UU9nVGciIHg9IjkwIiB5PSItMzg5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTF84aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9BOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1BTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1BY2lNRWR5eE80RXN1UU9nVGciIHg9Ii0zMDMiIHk9Ii0xMTY1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUFzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9Gc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1BOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1CTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1CY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNQnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPQThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNQjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNQ01pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNQ2NpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUNzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPRnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNQzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNRE1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNRGNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTURzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9BOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1EOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTUVNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTUVjaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU1Fc2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTUU4aU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTQ3NCwgLTU4NCwgLTI3MCwgMzM3OF0kWy00NzQsIC0zMzc4LCAtMjcwLCA1ODRdIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlNRk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT09jaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS0pNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS1ZNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1GY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUZzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1GOGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlNR01pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTUdjaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU1Hc2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzExMCwgLTU0MSwgLTY1MSwgMjc2MF0kWzYwOSwgLTI3MjYsIC0xNTIsIDU3NV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTUc4aU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU1ITWlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTUhjaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9TOGlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUo1TWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtWTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNSHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1IOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNSU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTUljaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU1Jc2lNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlNSThpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstOTQ4LCAtNTg0LCAzODI2LCAyMzExXSRbLTM4MTAsIC0yMzE5LCA5NjUsIDU3NV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTUpNaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU1KY2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTUpzaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9uOGlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtWTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtSTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNSjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1LTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNS2NpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTUtzaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1LOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPTXNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNTGNpTUVkeXhPNEVzdVFPZ1RnIiB4PSItNzc5IiB5PSItMjcxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUxzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPTXNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTU1NaU1FZHl4TzRFc3VRT2dUZyIgeD0iOTQ5IiB5PSItMzM5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTU1jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT0NjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTU1zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNTThpTUVkeXhPNEVzdVFPZ1RnIiB4PSI5MTQiIHk9Ii00NTciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT0NjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTU5jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTU5zaU1FZHl4TzRFc3VRT2dUZyIgeD0iODg4IiB5PSIxMTk0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTU44aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9Nc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1PTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1PY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1Pc2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPQ2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNUE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNUGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNUHNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVA4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPTXNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNUU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNUWNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNUXNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVE4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9DY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1STWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTVJjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTVJzaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU1SOGlNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTVNNaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTEzODAsIDMxMywgNzMwNiwgLTI5MzddJFstODIyOSwgMzEzLCA0NTcsIC0yOTM3XSRbLTgyMjksIDI3MTcsIDQ1NywgLTUzM10iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU1TY2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPbnNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLVk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLWk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVNzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNUzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVRNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU1UY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNVHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT1JNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVQ4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTVVNaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTMyMiIgeT0iMjIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVVjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPUk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNVXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTVU4aU1FZHl4TzRFc3VRT2dUZyIgeD0iOTk5IiB5PSItMjU0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVZNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT0JzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNVnNpTUVkeXhPNEVzdVFPZ1RnIiB4PSI0NzUiIHk9IjMxMyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1WOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPQnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNV01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNV2NpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyOTciIHk9Ii0zMzkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNV3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT1JNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVc4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTVhNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTVhjaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1Yc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9Cc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1YOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1ZTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1ZY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNWXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9STWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1ZOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1aTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1aY2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNWnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT0JzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVo4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNYU1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNYWNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTWFzaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlNYThpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlsxMzgwLCAtMTEwLCAtNzc2MywgLTU5XSRbNzcwNCwgLTExMCwgLTE0MzksIC01OV0iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU1iTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPcHNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLVk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLZE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNYnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWI4aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU1jTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNY2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT1g4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWNzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTWM4aU1FZHl4TzRFc3VRT2dUZyIgeD0iLTMxMDMiIHk9Ii0yNjIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNZE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9YOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1kY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNZHNpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMjE4MCIgeT0iMjM4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWQ4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT0RNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWVNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNZWNpTUVkeXhPNEVzdVFPZ1RnIiB4PSIzNTE4IiB5PSIyNDYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNZXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT0RNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWU4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTWZNaU1FZHl4TzRFc3VRT2dUZyIgeD0iMjA2MiIgeT0iLTM1NSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1mY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPWDhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNZnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNZjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNZ01pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWdjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT0RNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWdzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTWc4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTWhNaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1oY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT1g4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWhzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTWg4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTWlNaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1pY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPRE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNaXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1pOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1qTWlNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlNamNpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTWpzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTEzODAsIC00MDYsIDkzLCAtODg5MF0kWy0xMDg1NCwgLTQwNiwgLTkzODEsIC04ODkwXSRbLTEwODU0LCA4MDg1LCAtOTM4MSwgLTM5N10kWy0zMzk1LCA4MDg1LCAtMTkyMSwgLTM5N10iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU1qOGlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPVHNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLaE1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlKNU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWtNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNa2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWtzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU1rOGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlNbE1pTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTWxjaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMCwgLTc5NSwgMCwgMTk5OF0kWzAsIC0yMjE4LCAwLCA1NzVdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU1sc2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlNbDhpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU1tTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPcGNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLaE1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLWk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTW1jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNbXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTW04aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU1uTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNbmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT1I4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTW5zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTW44aU1FZHl4TzRFc3VRT2dUZyIgeD0iLTgzMyIgeT0iMzM4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTW9NaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPUjhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNb2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTW9zaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTI5MSIgeT0iLTI5NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1vOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9VOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1wTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTXBjaU1FZHl4TzRFc3VRT2dUZyIgeD0iNzY1IiB5PSI0NTciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNcHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT1U4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXA4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTXFNaU1FZHl4TzRFc3VRT2dUZyIgeD0iNzY1IiB5PSItMTMxMyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1xY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPUjhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNcXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNcThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNck1pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT1U4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXJzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTXI4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTXNNaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1zY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT1I4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXNzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTXM4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTXRNaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU10Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPVThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNdHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU10OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU11TWlNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlNdWNpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU11c2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzE1NDAsIDAsIC0yODI3LCA1NzQwXSRbNDI4NCwgMCwgLTg0LCA1NzQwXSRbNDI4NCwgLTQ5NTMsIC04NCwgNzg3XSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTXU4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9wOGlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtoTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtkTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNdk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU12Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNdnNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTXY4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU13TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPWXNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNd2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNd3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMTI5IiB5PSItNDQ4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXc4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPWXNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNeE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTXhjaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTExMiIgeT0iOTE2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXhzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT1ZzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXg4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNeU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSI1NjkiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNeWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT1ZzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXlzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTXk4aU1FZHl4TzRFc3VRT2dUZyIgeD0iLTU0OSIgeT0iMjc5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXpNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9Zc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU16Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU16c2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU16OGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNME1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPVnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNMGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNMHNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNMDhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTFNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPWXNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNMWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNMXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNMThpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTJNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9Wc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU0yY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTTJzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTTI4aU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU0zTWlNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTTNjaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTg0LCA3ODcsIDYxNjMsIC0yMDA2XSRbLTg0LCAyNDI5LCA2MTYzLCAtMzY0XSRbLTQzMjYsIDI0MjksIDE5MjEsIC0zNjRdIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlNM3NpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT1pzaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS2xNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS2RNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU0zOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTRNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU00Y2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlNNHNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTTQ4aU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU01TWlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzE2MjUsIC01ODQsIC01MjgzLCAxODU0XSRbNTI1NywgLTE4NjIsIC0xNjUxLCA1NzVdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU01Y2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlNNXNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU01OGlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPYk1pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLdE1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLZE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTZNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNNmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTZzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU02OGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlNN01pTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTTdjaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTEyMTAsIC01NDEsIDQ3ODMsIDIwOTldJFstNDY5MCwgLTIwNjUsIDEzMDMsIDU3NV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTTdzaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU03OGlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTThNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9yTWlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUt0TWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX3FJQUxZTWlORWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNOGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU04c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNODhpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTTlNaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU05Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPcmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNOXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNOThpTUVkeXhPNEVzdVFPZ1RnIiB4PSI2MSIgeT0iMzE0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTS1NaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT3JjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTS1jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU0tc2lNRWR5eE80RXN1UU9nVGciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNLThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPYmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNX01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1fY2lNRWR5eE80RXN1UU9nVGciIHg9Ii0yOTgiIHk9IjI4OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1fc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPYmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNXzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOQU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSItMjk4IiB5PSItMTEwMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5BY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPcmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOQXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOQThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOQk1pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT2JjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkJzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTkI4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTkNNaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5DY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT3JjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkNzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTkM4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTkRNaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5EY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPYmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlORHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU5EOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5FTWlNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlORWNpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5Fc2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy0xMzIsIDQ1MCwgMTAzMiwgLTE5MzJdJFstMTMyLCAxNzQ3LCAxMDMyLCAtNjM1XSIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9zUjFsc01pTkVkeXhPNEVzdVFPZ1RnIiBpZD0iKDAuMjMxNzMwMTYsMC42MjIwNjMzNCkiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5FOGlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPc01pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlMSk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlMRk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkZNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlORmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkZzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5GOGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOR01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT3NjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkdjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTkdzaU1FZHl4TzRFc3VRT2dUZyIgeD0iNjUiIHk9Ii0yNjIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlORzhpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPc2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOSE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTkhjaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5Ic2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9qY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5IOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTklNaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTE3NSIgeT0iLTQxNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5JY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPamNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOSXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOSThpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMzcwIiB5PSIxMTUyIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkpNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9zY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5KY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU5Kc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5KOGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOS01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPamNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOS2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOS3NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOSzhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkxNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPc2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOTGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOTHNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOTDhpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTk1NaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9qY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5NY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTk1zaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTk04aU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5OTWlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOTmNpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlswLCA1NzUsIDAsIC0yMzcwXSRbMCwgMjQ0NiwgMCwgLTQ5OV0iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5Oc2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPa2NpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlMQk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLOU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTk44aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOT01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTk9jaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5Pc2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOTzhpTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTlBNaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTk4MiwgLTE2NTksIDE3NjEsIDMwMTRdJFstMjQxMywgLTQwOTcsIDMzMCwgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOUGNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTlBzaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOUDhpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2lzaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZTEpNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZSzlNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5RTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlFjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5Rc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOUThpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTlJNaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5SY2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzE4NiwgLTU4NCwgLTEwODMsIDMwMjJdJFsxMDQ5LCAtMzAzMSwgLTIyMCwgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOUnNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTlI4aU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOU01pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2VNaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZSzFNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS3hNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5TY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlNzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5TOGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOVE1pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTlRjaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5Uc2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzYyNiwgLTU4NCwgLTI4NzgsIDI1NjVdJFsyODQ0LCAtMjU3MywgLTY2MCwgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOVDhpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTlVNaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOVWNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2ZzaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZSzVNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS3hNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5Vc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlU4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5WTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOVmNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTlZzaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5WOGlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzEyNywgLTc5NSwgLTQzMSwgMjU1Nl0kWzQ0OCwgLTI3NzcsIC0xMTAsIDU3NV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTldNaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5XY2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTldzaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9pTWlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUs5TWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUt4TWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOVzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5YTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOWGNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTlhzaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5YOGlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOWU1pTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstNTA4LCAtNTg0LCAyMjM1LCAyNTY1XSRbLTIyNDMsIC0yNTczLCA0OTksIDU3NV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTlljaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5Zc2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTlk4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9NY2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtSTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtWTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOWk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5aY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOWnNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTlo4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5hTWlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOYWNpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlsxNDU2LCAtMzcyLCAtNzIzMCwgMjg3OF0kWzU3MDYsIC0xNDA1LCAtMjk4MCwgMTg0NV0kWzc3MzAsIC0yNjc1LCAtOTU2LCA1NzVdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5hc2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOYThpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5iTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPY2NpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlMVk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLZE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOYnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmI4aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5jTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOY2NpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5jc2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzE2OSwgLTU0MSwgMTYsIDIyMDFdJFsxNjksIC0yMTY3LCAxNiwgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOYzhpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTmRNaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOZGNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT3FNaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZTFZNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfdEE3Z1VNaU5FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5kc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmQ4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5lTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOZWNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmVzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9xY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5lOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5mTWlNRWR5eE80RXN1UU9nVGciIHg9IjE0MyIgeT0iLTM4MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5mY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9xY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5mc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOZjhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmdNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT2NzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmdjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOZ3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSItNjYiIHk9Ii0zNTUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOZzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT2NzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmhNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTmhjaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTM1NCIgeT0iOTgyIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmhzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9xY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5oOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU5pTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5pY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOaXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPY3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOaThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOak1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOamNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmpzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPcWNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOajhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOa01pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOa2NpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmtzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9jc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5rOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTmxNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTmxjaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5sc2lNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlObDhpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlswLCA1MzMsIDAsIC0yMTA4XSRbMCwgMjExNiwgMCwgLTUyNF0iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5tTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPV3NpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLZE1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTm1jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlObXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTm04aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5uTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlObmNpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5uc2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy0xOTIxLCAxOTQsIC0zMTkxLCAxMjY0MF0kWy0xMDA0MSwgMTk0LCAtMTEzMTEsIDEyNjQwXSRbLTEwMDQxLCAtMTI4ODYsIC0xMTMxMSwgLTQ0MF0kWy05MTQsIC0xMjg4NiwgLTIxODQsIC00NDBdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5uOGlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOb01pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5vY2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPSjhpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLRk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTm9zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlObzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnBNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5wY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOcHNpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5wOGlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzU3NSwgLTc4NywgLTU3MjMsIDEwOTJdJFs1NzUsIC0yMDMyLCAtNTcyMywgLTE1Ml0kWzQxMTQsIC0yMDMyLCAtMjE4NCwgLTE1Ml0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTnFNaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5xY2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTnFzaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9FOGlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtOTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2cyeWVzTWlORWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOcThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5yTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOcmNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTnJzaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5yOGlNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTnNNaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTgwLCAtNTAzLCAtMTA2LCAxNzk5XSRbLTgwLCAtMTI3MCwgLTEwNiwgMTAzMl0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTnNjaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOczhpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT0lNaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS0JNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS05NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU50TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnRjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU50c2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOdDhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTnVNaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOdWNpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstMzExNSwgLTQ2NSwgODAwOSwgLTMxM10kWy04OTQwLCAtNDY1LCAyMTg0LCAtMzEzXSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOdXNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTnU4aU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOdk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT0FjaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS1ZNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS05NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU52Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnZzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU52OGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOd01pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTndjaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOd3NpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlszMjEsIC01NzUsIDUyNCwgMzM4Nl0kWzMyMSwgLTMzNzgsIDUyNCwgNTg0XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOdzhpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTnhNaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOeGNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT1FjaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS1pNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS05NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU54c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTng4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU55TWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOeWNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTnlzaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOeThpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstOTMsIC03ODcsIDkyNTQsIDMxMjRdJFstOTMsIC0xNDEzLCA5MjU0LCAyNDk3XSRbLTgzNTYsIC0xNDEzLCA5OTAsIDI0OTddJFstODM1NiwgLTMzMjcsIDk5MCwgNTg0XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOek1pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTnpjaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOenNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2RzaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS3hNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS05NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU56OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjBNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU4wY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOMHNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTjA4aU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOMU1pTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstMzk3LCAtNDc2LCAxMzU5OSwgNzIyM10kWy0zOTcsIC01NzE1LCAxMzU5OSwgMTk4NF0kWy0xMzUyMCwgLTU3MTUsIDQ3NiwgMTk4NF0kWy0xMzUyMCwgLTcxOTcsIDQ3NiwgNTAyXSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOMWNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTjFzaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il9oYVlOMThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJDbGFzcyIgbmFtZT0iVHlwZXMiPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjJNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU5fY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOMmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlOMnNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTk2NCIgaGVpZ2h0PSIxOTY0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjI4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOM01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU4zY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOM3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTjM4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU40TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlONGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjRzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlONDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjVNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTjVjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZTjVzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlONThpTUVkeXhPNEVzdVFPZ1RnIiB4PSI3NDUiIHk9IjY0MyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjZNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9EOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlONmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlONnNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMjc2MCIgaGVpZ2h0PSIxOTY0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjY4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlON01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU43Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlON3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTjc4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU44TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOOGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjhzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOODhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjlNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTjljaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZTjlzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOOThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIzMDU0IiB5PSI2NzEiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9oYVlOLU1pTUVkeXhPNEVzdVFPZ1RnIiBkZXNjcmlwdGlvbj0iVGhlc2UgdHdwIGRhdGEgdHlwZSBhcmUgYmVpbmcgdXNlZCBieSB0aGUgZGlhbWdyYW0gaW50ZXJjaGFuZ2UuICBUaGV5IG1pZ2h0IGJlIHJlcGxhY2VkIHdpdGggdHlwZXMgb2YgdGhlIGltcGxlbWVudGF0aW9uIHBsYXRmb3JtIGFzIGxvbmcgYXMgdGhlIGFsbG93IHRoZSBzYW1lIHR5cGUgb2Ygc2VyaWFsaXphdGlvbiBmb3IgcGVyc2lzdGVuY3kuIi8+DQotICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgIDwvY29udGVudHM+DQotICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9oYVlOLWNpTUVkeXhPNEVzdVFPZ1RnIiBhbm5vdGF0ZWRFbGVtZW50PSJfaGFZSjRjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICA8Ym9keT4wMTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9oYVlOLXNpTUVkeXhPNEVzdVFPZ1RnIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9oYVlOLThpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiLz4NCi0gICAgICA8L3BhY2thZ2VJbXBvcnQ+DQotICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfaGFZTl9NaU1FZHl4TzRFc3VRT2dUZyIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIi8+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlOX2NpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJQb2ludCI+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZTl9zaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0ieCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU5fOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9InkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9BTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9IkdyYXBoRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT0FjaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9Fc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPQXNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJwb3NpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZTl9jaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9BOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9ImNvbnRhaW5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il9oYVlPbU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT0JNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT0JjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPQnNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJsaW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPUU1pTUVkeXhPNEVzdVFPZ1RnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX2hhWU9uc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPQjhpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPQ01pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9DY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImFuY2hvcmFnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT01NaU1FZHl4TzRFc3VRT2dUZyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il9oYVlPbjhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT0NzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT0M4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPRE1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJzZW1hbnRpY01vZGVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPV2NpTUVkeXhPNEVzdVFPZ1RnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX2hhWU9wc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPRGNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPRHNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9EOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9IkRpbWVuc2lvbiI+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT0VNaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0id2lkdGgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPRWNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJoZWlnaHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9Fc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPRThpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT0ZNaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iaXNWaXNpYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX2hhWU9GY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5Pg0KLSAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT0ZzaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPQU1pTUVkeXhPNEVzdVFPZ1RnIiBhc3NvY2lhdGlvbj0iX2hhWU9tTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPRjhpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPR01pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9HY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9InJlZmVyZW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0g4aU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPbWNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT0dzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT0c4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPSE1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJwcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0pzaU1FZHl4TzRFc3VRT2dUZyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il9oYVlPbXNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT0hjaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT0hzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9IOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9IlJlZmVyZW5jZSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT0lNaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9Fc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPSWNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfaGFZT0lzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT0k4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0icmVmZXJlbmNlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPbWNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT0pNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT0pjaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPSnNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJQcm9wZXJ0eSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT0o4aU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9Fc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPS01pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJrZXkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9LY2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9Lc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2hhWU9LOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT0xNaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9MY2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9Mc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2hhWU9MOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPTU1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJHcmFwaENvbm5lY3RvciI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT01jaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9BTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPTXNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9BTWlNRWR5eE80RXN1UU9nVGciIGFzc29jaWF0aW9uPSJfaGFZT244aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9NOGlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9OTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9OY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImdyYXBoRWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT09NaU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPb01pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT05zaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT044aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9PTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9IkdyYXBoRWRnZSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT09jaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9BTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPT3NpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJhbmNob3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9NTWlNRWR5eE80RXN1UU9nVGciIGFzc29jaWF0aW9uPSJfaGFZT29NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9POGlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIyIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9QTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIyIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9QY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IndheXBvaW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZTl9jaU1FZHl4TzRFc3VRT2dUZyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il9oYVlPb2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT1BzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT1A4aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPUU1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJEaWFncmFtTGluayI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT1FjaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9Fc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPUXNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1E4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0idmlld3BvcnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU5fY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPUk1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9BTWlNRWR5eE80RXN1UU9nVGciIGFzc29jaWF0aW9uPSJfaGFZT25zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9SY2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9Sc2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9SOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9UY2lNRWR5eE80RXN1UU9nVGciIGFzc29jaWF0aW9uPSJfaGFZT3BjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9TTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9TY2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT1NzaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iR3JhcGhOb2RlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPUzhpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT0FNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9UTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9InNpemUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9EOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9UY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IkRpYWdyYW0iPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9Uc2lNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPU3NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1Q4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iem9vbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9VTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9VY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1VzaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0idmlld3BvaW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlOX2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1U4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iZGlhZ3JhbUxpbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9RTWlNRWR5eE80RXN1UU9nVGciIGFzc29jaWF0aW9uPSJfaGFZT3BjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9WTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9WY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1ZzaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0ibmFtZXNwYWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPV2NpTUVkeXhPNEVzdVFPZ1RnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX2hhWU9wOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPVjhpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPV01pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9XY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9Xc2lNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPRXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1c4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPWE1pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPWGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9oYVlPWHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9YOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0FNaU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPcHNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT1lNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT1ljaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPWXNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJkaWFncmFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPVGNpTUVkeXhPNEVzdVFPZ1RnIiBhc3NvY2lhdGlvbj0iX2hhWU9wOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPWThpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPWk1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT1pjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9ac2lNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPV2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1o4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0idHlwZUluZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9hTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9hY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2hhWU9hc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPYThpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPYk1pTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT1djaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9iY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIgYXNzb2NpYXRpb249Il9oYVlPck1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT2JzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT2I4aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPY01pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT2NjaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9XY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPY3NpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJlbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiIGFzc29jaWF0aW9uPSJfaGFZT3FNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9jOGlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9kTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT2RjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iTGVhZkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9kc2lNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPRXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPZDhpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJUZXh0RWxlbWVudCI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT2VNaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9kY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPZWNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ0ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPZXNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPZThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9oYVlPZk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT2ZjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iSW1hZ2UiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9mc2lNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPZGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2Y4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0idXJpIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPZ01pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPZ2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9nOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9Im1pbWVUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPaE1pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPaGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9oYVlPaHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT2g4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT2lNaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9kY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9pY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IlBvbHlsaW5lIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPaXNpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT2g4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9pOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9ImNsb3NlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9oYVlPak1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4NCi0gICAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9qY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IndheXBvaW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZTl9jaU1FZHl4TzRFc3VRT2dUZyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il9oYVlPc01pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT2pzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT2o4aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPa01pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJFbGxpcHNlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPa2NpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT2g4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9rc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImNlbnRlciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZTl9jaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9rOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9InJhZGl1c1giIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPbE1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJyYWRpdXNZIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2xjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0icm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPbHNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJzdGFydEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2w4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iZW5kQW5nbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9tTWlNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9BOGlNRWR5eE80RXN1UU9nVGcgX2hhWU9Gc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9tY2lNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9JOGlNRWR5eE80RXN1UU9nVGcgX2hhWU9HY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9tc2lNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9ITWlNRWR5eE80RXN1UU9nVGcgX2hhWU9tOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX2hhWU9tOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9Il9kaWFncmFtRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX2hhWU9tc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPbk1pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPbmNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9uc2lNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9Cc2lNRWR5eE80RXN1UU9nVGcgX2hhWU9STWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9uOGlNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9DY2lNRWR5eE80RXN1UU9nVGcgX2hhWU9Nc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9vTWlNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9OY2lNRWR5eE80RXN1UU9nVGcgX2hhWU9Pc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9vY2lNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9QY2lNRWR5eE80RXN1UU9nVGcgX2hhWU9vc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX2hhWU9vc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9Il9ncmFwaEVkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9PTWlNRWR5eE80RXN1UU9nVGciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il9oYVlPb2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT284aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT3BNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9oYVlPcGNpTUVkeXhPNEVzdVFPZ1RnIiBtZW1iZXJFbmQ9Il9oYVlPVThpTUVkeXhPNEVzdVFPZ1RnIF9oYVlPUjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9oYVlPcHNpTUVkeXhPNEVzdVFPZ1RnIiBtZW1iZXJFbmQ9Il9oYVlPRE1pTUVkeXhPNEVzdVFPZ1RnIF9oYVlPWDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9oYVlPcDhpTUVkeXhPNEVzdVFPZ1RnIiBtZW1iZXJFbmQ9Il9oYVlPVnNpTUVkeXhPNEVzdVFPZ1RnIF9oYVlPWXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9oYVlPcU1pTUVkeXhPNEVzdVFPZ1RnIiBtZW1iZXJFbmQ9Il9oYVlPY3NpTUVkeXhPNEVzdVFPZ1RnIF9oYVlPcWNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9oYVlPcWNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJfY29yZVNlbWFudGljTW9kZWxCcmlkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9jTWlNRWR5eE80RXN1UU9nVGciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il9oYVlPcU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT3FzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT3E4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9yTWlNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9iY2lNRWR5eE80RXN1UU9nVGcgX2hhWU9yY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX2hhWU9yY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9Il91TUFTZW1hbnRpY01vZGVsQnJpZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPYThpTUVkeXhPNEVzdVFPZ1RnIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfaGFZT3JNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9yc2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9yOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9oYVlPc01pTUVkeXhPNEVzdVFPZ1RnIiBtZW1iZXJFbmQ9Il9oYVlPamNpTUVkeXhPNEVzdVFPZ1RnIF9oYVlPc2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9oYVlPc2NpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJfcG9seWxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9pY2lNRWR5eE80RXN1UU9nVGciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il9oYVlPc01pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT3NzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT3M4aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0dkcG1rZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2R6WGtPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfeXpVNThZaW5FZHF0dmJuZkIyTF81dyIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0dkelhrZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2R6WGt1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8iLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQ/Ii8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0dkelhrLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2R6WGxPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I19JcmRBVU1tQkVkcUJjTjFSNkV2V1V3P0RlcGxveW1lbnQvRGVwbG95bWVudD8iLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQ/Ii8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX2dxT1FvQUIyRWR1ZXEtVmlMWWlleVEiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfZ3FPUW9RQjJFZHVlcS1WaUxZaWV5USIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfdnktSFVZaW5FZHF0dmJuZkIyTF81dyIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI18wIi8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgPC91bWw6TW9kZWw+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0docks4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doaFo5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2gwVTRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2hySy11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaDBVNWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaDBVNU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doLUY0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doMFU2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2gtRjVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2gtRjQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaUgyNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaC1GNS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpSDI1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpSDI0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lIMjUtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lIMjV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaVJBMHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaVJBMGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpUkExZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpUkExT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lheDBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lSQTEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWF4MC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWF4MHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpYXgxLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpYXgxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lraTBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lheDJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWtpMU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWtpMC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpa2kxLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpa2kxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2l0c3dPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lraTJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaXRzdy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaXRzd3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpdHN4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2kzZHctZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2kzZHd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaTNkeU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaTNkeC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R6T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpM2R5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pBbnN1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pBbnNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HakFudU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFudC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqQW52T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqQW51LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pLWXNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pBbndPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaktZdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaktZcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqS1l0LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqS1l0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pVSnNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pLWXVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HamRUb09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HalVKcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqZFRwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pkVHFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pkVHAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HamRUck9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HamRUcS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqbkVvT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2puRXBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2puRW8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha0R3a09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HajVfbE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drRHdtZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drRHdtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tEd291ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tEd29lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha002Z09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha0R3cXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drTTZpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drTTZpT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tNNmt1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tNNmtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha1dyZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha002bXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drV3JpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drV3JpT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tXcmt1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tXcmtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha2djZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha1dybXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drZ2NpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drZ2NpT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tnY2t1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tnY2tlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3BtY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha2djbXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drcG1lZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drcG1lT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2twbWd1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2twbWdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3pYY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3BtaXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drelhnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drelhmLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2s5SWNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2t6WGlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HazlJZWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HazlJZU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsaS1XZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xzdldPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xzdlYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbHN2WE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZZT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsc3ZYLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2wxNVFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xzdlktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbDE1Uk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbDE1US1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsMTVTT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsMTVSLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xfcVFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2wxNVRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbF9xUk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbF9xUS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsX3FUZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsX3FUT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21KYlFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xfcVZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbUpiUi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbUpiUnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtSmJVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtSmJULWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21TbE1PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21KYldPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbVNsT2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbVNsT09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtU2xRdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtU2xRZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21jV01PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21TbFVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWNXT2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWNXT09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtY1dRdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtY1dRZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21sZ0lPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21jV1N1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWxnS2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWxnS09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtbGdNdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtbGdNZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR201Q0pPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR201Q0ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbTVDTHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbTVDTGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01FT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtNUNNZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25DTUZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25DTUUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbkNNR09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNRi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01IT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duQ01HLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25MOUVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25DTUpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbkw5R2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbkw5R09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duTDlJdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duTDlJZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25WdUVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25MOUt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HblZ1R2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HblZ1R09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duZTRELWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duZTREdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25vcEFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25lNEctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbnh5OE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbm9wQk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dueHk4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHk4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR254eTl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR254eTllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbnh5LS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbnh5LXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2o4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHlfZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243ajgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR243ajh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqOXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqOWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2otZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duN2otT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243al9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR243ai0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb0ZVOU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb0ZVOC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvRlU5LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvRlU5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29GVV9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29GVS0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb09lNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb0ZVX3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvWVA4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvWVA4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ZUC11ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ZUC1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb2lBNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb1lQX3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvaUE0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29pQTZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29pQTUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb2lBNi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb2lBNnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvckswT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvaUE3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzAtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLMXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLMWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvcksyZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvcksyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzMtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbzA3ME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLNHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDcxT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvMDcwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28wNzJlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28wNzJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbzA3M3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbzA3M2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvLUZ4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvLUZ3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28tRnplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28tRnpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hby1GMXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hby1GMWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwUm53T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwSDJ5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbngtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BSbnh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcFJueS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcFJueXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwUm56LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwUm56dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BSbjB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4dE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4cy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXh1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXh0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4d09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4di1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwa2lzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXh3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BraXMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGtpdU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGtpdC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwa2l2T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwa2l1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3B1VHNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BraXYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcHVUdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcHVUcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwdVR2T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwdVR1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3B1VHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3B1VHYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcDNkb3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwM2RxLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwM2RxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3AzZHRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3AzZHMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUJPb09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkdk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxQk9xZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxQk9xT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FCT3N1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FCT3NlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUtZa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUJPdXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxS1ltZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxS1ltT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FLWW91ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FLWW9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcVVKa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUtZcU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxVUptZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxVUptT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FkNmstZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5FaU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5FaC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVqT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxbkVpLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWtPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FuRWotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5FbE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5Fay1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxdzFnZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFnT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWhlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcXcxaWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxaU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxdzFqZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFqT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3E2bWdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWtPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcTZtaE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcTZtZy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxNm1qZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxNm1qT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3E2bWx1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3E2bWxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HckR3Yy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HckR3Y3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyTmhjT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyRHdlLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JOaGVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JOaGVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcldyWS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcldyWXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyV3JiT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyV3JhLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JXcmRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JXcmRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcmdjWi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcmdjWnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dycU5ZdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dycU5ZZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JxTmFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTlotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnFOYk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnFOYS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyelhVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dycU5idWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFUtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3J6WFV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnpYVi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnpYVnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyelhXLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyelhXdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3I5SVVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3J6WFhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcjlJVk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJVS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyOUlWLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyOUlWdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3I5SVd1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3I5SVdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1VU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJWGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzRzVVLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzRzVVdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NHNVdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NHNVYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1WHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc0c1WGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzUURSdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzUURSZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NRRFQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NRRFR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc1FEV09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1FEVi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzWjBUdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzWjBUZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NpLU1PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NaMFZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc2ktTk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktTS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzaS1PZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzaS1PT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NpLVBlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NpLVBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2TU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktUU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzc3ZOT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzc3ZNLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Nzdk9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Nzdk4tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2UE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc3N2Ty1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzMmdNT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzc3ZRT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ05PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3MyZ00tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HczJnUGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HczJnUE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzMmdSdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzMmdSZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NfcUl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NfcUllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc19xSy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc19xS3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzX3FOT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzX3FNLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RKYkllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RKYklPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdEpiS3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdEpiS2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0SmJNLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0SmJNdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RUTUlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RKYk8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdFRNSi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdFRNSnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0VE1MdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0VE1MZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RtSEZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RtSEUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdG1ISE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdG1IRy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0bUhJZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0bUhJT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3R2UkFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RtSEpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdHZSQk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdHZSQS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0dlJEZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0dlJET2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Q1Q0FPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3R2UkZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdDVDRHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdDVDRGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0NUNHZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0NUNHT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VDekF1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUN6Q2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6Q09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1Q3pET2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pDLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VDekVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4OE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6RS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1TDg4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1TDg4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VMOC1PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMODktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4LS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUw4LXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnQ4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1TDhfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdDgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdDh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0OXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ0OWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnQtZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnQtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdF91ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdF9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlOE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ1QXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmU4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1ZmU4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZTl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZTllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlLWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdWZlLU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmVfT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1ZmUtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VvbzRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdW9vNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1b282T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b281LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VvbzYtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdXlaNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2WVB6T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2WVB5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZZUDNlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZZUDNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdmlBd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdllQNE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2aUF4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUF3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZpQXlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZpQXgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdmlBenVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdmlBemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2cnh3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUExdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZyeHllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZyeHlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdnJ4MHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdnJ4MGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2MDdzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2cngyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3YwN3QtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3YwN3R1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdjA3d09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdjA3di1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2LXNzLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2LXNzdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dIMnB1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dIMnBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd0gydE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd0gycy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5vT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3SDJ0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbm8tZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dSbm91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1JucHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1JucGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5xZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3Um5xT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbnItZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dSbnJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdzRFbHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdzRFbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4Qk9ndWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4Qk9nZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hkNmR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yYy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJkLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJkdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yZi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4dzFZT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJoT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3h3MVplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3h3MVpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il81R2NZQ2VpZUVkdVFidVk2VXdNU1FnIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkJvb2xlYW4iIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfNUdjWURlaWVFZHVRYnVZNlV3TVNRZyIgYmFzZV9Db21tZW50PSJfNUdjWUFlaWVFZHVRYnVZNlV3TVNRZyIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9CYXN0TU9pZkVkdVFidVk2VXdNU1FnIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX2k3RlRvZWlmRWR1UWJ1WTZVd01TUWciIGJhc2VfQ29tbWVudD0iX2k3RlRvT2lmRWR1UWJ1WTZVd01TUWciLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfV2UtUWtPb0ZFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX2RVYzZvZW9GRWR1T0JQUUEyaEtxVVEiIGJhc2VfQ29tbWVudD0iX2RVYzZvT29GRWR1T0JQUUEyaEtxVVEiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfdjFuSXNPb0ZFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfN2dIQThPb0ZFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzRjA5ODk5QzAwRUEiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfQUdfRmNPb0dFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDNGMDk4OUI5MDI5MCIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9FSWRXME9vR0VkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX29naUdvT29IRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNTAiIGlzSUQ9InRydWUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzUyVGZvT29IRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNDciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0pBSUJvT29NRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MjdBOEExRjAyRjMiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0xSYUh3T29NRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEY5QUI5ODAyQjkiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05jYk4wT29NRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0NTVFNjVDODAyMTgiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1BGblpNT29NRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MURGMzIxOTAwMjkiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1JXVENZT29NRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0Mjc5NjI1RDAyMzQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1VEUzBJT29NRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MjFFNERGMzAwM0EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3B3dllBT29NRWR1T0JQUUEyaEtxVVEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MURERkM4RTAwQjYiLz4NCi0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3A2eDJFT29TRWR1T0JQUUEyaEtxVVEiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIi8+DQotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il8xcVhwc09vU0VkdU9CUFFBMmhLcVVRIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiIvPg0KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfNFotRGdPb1NFZHVPQlBRQTJoS3FVUSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfUDRvc1llb2VFZHVWQTd2dDVxYklKUSIgYmFzZV9Db21tZW50PSJfUDRvc1lPb2VFZHVWQTd2dDVxYklKUSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9DRUlIa094M0VkdTUtdlZqbGZWc2ZRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkRvdWJsZSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfSzc5ZTBNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iX2xXUXdBY1V5RWR5Mm11UTJQUXZIX0EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3h3U0VFTVZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEEiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzBUNTNZTVZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0NjExREI0RDAyNDgiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzFKUGo4TVZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0NjExREIyRjAyMEQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzJjc0kwTVZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzNGWDVjTVZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTc3RTcxNjAzN0YiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzRxczRnTVZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMTQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzRxczRnY1ZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMUUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzZ0LS00TVZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MUU0OTUzQzAzMTkiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzZ0LS00Y1ZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MUU0OTUzNzAzNDMiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzhkbDdVTVZiRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MUJFMjUxODAwRDIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0NJdTVNTVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEZENEYwNjAxMzgiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0NJdTVNY1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEZENEYwMTAyMDYiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0NJdTVNc1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEZENEVGODAxOTIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0NJdTVNOFZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEZENUQ1MzAxMUQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0NJdTVOTVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEZENUQzRTAzMjUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0NJdTVOY1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEZENEVGMDAyN0YiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLSmJ3TVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwODIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLSmJ3Y1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwOTYiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLSmJ3c1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQUEiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLSmJ3OFZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNzgiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLSmJ4TVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTRCMzc3RDAyNzIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLSmJ4Y1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwOEQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLVE13TVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLVE13Y1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQjQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0ZLVE13c1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkYiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05GLXA0TVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNTIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE0TVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTM3NjI3RDAwODQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE0Y1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE0c1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MUVEN0I2NTAzOTQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE1TVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTM3NjI4MzAxNUEiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE1Y1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyRTQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE1c1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzN0EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE1OFZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOEUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE2TVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE2Y1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNzEiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE2c1ZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOTgiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE2OFZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUMiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX05HSWE3TVZjRWR5Mm11UTJQUXZIX0EiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzFyeHFNTVlVRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNUIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzJSeFRNTVlVRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNjQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzItZW9NTVlVRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzQ4MXlVTVlVRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkYiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0VZTDBRTVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MjM4RTk0RDAwM0YiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0lfRkc0TVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MThBQ0EwQTAwRUIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1VkYUxZTVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MUFFNzA3MzAzQjgiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX2UzZmtvTVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDQiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX2UzZmtvY1lWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTAwNkE2QjAxRkIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX2UzZmtvc1lWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQ0EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX2UzZmtvOFlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQjYiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX21LOGtJTVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MjgxNDJCQjAzQjUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3JHR1BnTVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTE5QTU5QTAxMjkiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3JHR1BnY1lWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTE5QTc1QzAzREIiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3JHR1Bnc1lWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTE5QTU4RDAwRDkiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3pCQ3MwTVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzREUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3pCQ3MwY1lWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDUiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3pCQ3Mwc1lWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQzAiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzVUT2NrTVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTA4MThFRTAwOUYiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzlvRmtBTVlWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTJBNUY4NjAyRjYiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzlvRmtBY1lWRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MTNFQzAxODAzNDAiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3YySE1jTVlXRWR5amdwc2dDNXBrekEiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEY2QjBFNjAzQzciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfaGFyRVVNaU1FZHl4TzRFc3VRT2dUZyIgYmFzZV9Db21tZW50PSJfaGFZSjNjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9oYXJFVWNpTUVkeXhPNEVzdVFPZ1RnIiBiYXNlX0NvbW1lbnQ9Il9oYVlKMWNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX2hhckVVc2lNRWR5eE80RXN1UU9nVGciIGJhc2VfQ29tbWVudD0iX2hhWUpqY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfaGFyRVU4aU1FZHl4TzRFc3VRT2dUZyIgYmFzZV9Db21tZW50PSJfaGFZTi1jaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNVZZZkVNaU9FZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9FY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzVWWWZFY2lPRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlOX3NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il81VllmRXNpT0VkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT0VNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNVZZZkU4aU9FZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU5fOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0w1dnlJTWlQRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPVXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9TUjRfOE1pUEVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT1Q4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfWGJ6Z0VNaVBFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9GTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX25kdjVzTWlQRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPUThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9uZHY1c2NpUEVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT1FzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMlk2UmNNaVBFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9rc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzJZNlJjY2lQRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPbDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il8yWTZSY3NpUEVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT2s4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMlk2UmM4aVBFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9sTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzJaRUNjTWlQRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPbGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il8yWkVDY2NpUEVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT2xzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRklKdEVNaVFFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9Bc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1BOMDhrTWlRRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPVE1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9UYi1fRU1pUUVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT2c4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfVGNJSkFNaVFFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9mOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX2ZjbERJTWlRRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPaThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9pekF6Y01pUUVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT0tNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfaXpBemNjaVFFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9MTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3Z1ZDlRTWlRRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPSWNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95Q3ZGOE1pUUVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT1c4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfN1J0LUFNaVFFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9aOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX19lMWVzTWlRRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPZWNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9sTzBhSU1ubUVkeU4wY29kRVhhUjZnIiBiYXNlX1Byb3BlcnR5PSJfT0Z5cEVNbm1FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfR2g1U2NNbnBFZHlOMGNvZEVYYVI2ZyIgYmFzZV9Qcm9wZXJ0eT0iX2hjUVNBTW5uRWR5TjBjb2RFWGFSNmciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzloQmNBQ1gzRWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il9wc0xfa0NYM0VkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX1RsTkU0Q1g0RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX1RsRDY4Q1g0RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfS0FmX0FTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfS0FmX0FDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLTwveG1pOlhNST4NCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3Byb3BlcnRpZXMudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS9wcm9wZXJ0aWVzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhZTgzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3Byb3BlcnRpZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTW9kZWwKLT09PT09Ci1Ob24tTkxTIE1hcmtlcnM6CXRydWUKLUNvbnRhaW5tZW50IFByb3hpZXM6CXRydWUKLVN1cHByZXNzIEVNRiBNZXRhZGF0YToJZmFsc2UKLVJvb3QgRXh0ZW5kcyBDbGFzczoJb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0Ci1Sb290IEV4dGVuZHMgSW50ZXJmYWNlOglvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdAotQ29kZSBGb3JtYXR0aW5nOgl0cnVlCi1EeW5hbWljIFRlbXBsYXRlczoJdHJ1ZQotVGVtcGxhdGUgRGlyZWN0b3J5Ogkvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMKLQotUGFja2FnZSAoVW1hKQotPT09PT09PT09PT09PQotQmFzZSBQYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvdW1hLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmE3ODU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvdW1hLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTI4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ1bWEiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNS91bWEuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjA2JiN4RDsmI3hBOzA1JiN4RDsmI3hBOzA0JiN4RDsmI3hBOzAzJiN4RDsmI3hBOzAxJiN4RDsmI3hBOzAyIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNsYXNzaWZpZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzQWJzdHJhY3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0cmluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiBzb21lIHN1aXRhYmxlIGNoYXJhY3RlciBzZXQgdXNlZCB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2RlbC4gQ2hhcmFjdGVyIHNldHMgbWF5IGluY2x1ZGUgbm9uLVJvbWFuIGFscGhhYmV0cyBhbmQgY2hhcmFjdGVycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQm9vbGVhbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Cb29sZWFuIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEJvb2xlYW4gdHlwZSBpcyB1c2VkIGZvciBsb2dpY2FsIGV4cHJlc3Npb24sIGNvbnNpc3Rpbmcgb2YgdGhlIHByZWRlZmluZWQgdmFsdWVzIHRydWUgYW5kIGZhbHNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZXNwYWNlICMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNldCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXF1ZW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW50ZWdlciIgaW5zdGFuY2VDbGFzc05hbWU9ImludCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gaW50ZWdlciBpcyBhIHByaW1pdGl2ZSB0eXBlIHJlcHJlc2VudGluZyBpbnRlZ2VyIHZhbHVlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRG91YmxlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9keSIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiYjeEQ7JiN4QTtNZXRob2QgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGFkZHMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHZpYSBwYWNrYWdlIG1lcmdlIHRvIE1ldGhvZCBFbGVtZW50IGRlZmluZWQgaW4gTWV0aG9kIENvcmUgbmVlZGVkIGZvciB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzIGludHJvZHVjZXMgaW4gdGhpcyBwYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIiBpRD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ia2luZCIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vS2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IktpbmQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuJiN4QTsmI3hEOyYjeEE7VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBDb250ZW50IEVsZW1lbnQgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0NvbnRlbnQgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgbm90IGRpcmVjdGx5IGZyb20gTWV0aG9kIEVsZW1lbnQgYW55bW9yZS4gIFRoaXMgaXMgYWNoaWV2ZWQgdXNpbmcgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIHNlbWFudGljcy4gIE9ubHkgaWYgYW4gYWRvcHRlciBvZiB0aGlzIG1ldGEtbW9kZWwgZGVjaWRlcyB0byByZWFsaXplIE1ldGhvZCBQbHVnaW5zLCBoZSB3b3VsZCBnZXQgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gY2FwYWJpbGl0aWVzIGZvciBhbGwgQ29udGVudCBFbGVtZW50cy4mI3hBO0NvbnRlbnQgRWxlbWVudCBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlcm1kZWZpbml0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZXJtRGVmaW5pdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vQ2xhc3NpZmllciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuJiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuJiN4QTsmI3hEOyYjeEE7VGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIG9yIGxhYmVsIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBlbGVtZW50LiBVc2VkIGxpa2UgYSBzeW5vbnltIHRvIHRoZSBuYW1lLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9uZ1ByZXNlbnRhdGlvbk5hbWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiYjeEQ7JiN4QTtTZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiAmI3hBO0ZvciBleGFtcGxlLCB3aGVuIGEgVGFzayBjb250cmlidXRlcyB0byBhbm90aGVyIFRhc2sgaXRzIFByZXNlbnRhdGlvbiBhc3NvY2lhdGlvbiBpcyBjb250cmlidXRlZCBpbmNsdWRpbmcgaXRzIFNlY3Rpb25zIChpLmUuIGl0cyBTdGVwcyksIHdoaWNoIGFyZSBtb2RlbGVkIGFzIHBhcnRzIG9mIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgU2VjdGlvbnMgY2FuIGJlIG5lc3RlZCBhbmQgdGhlcmVmb3JlIFRhc2sgRGVzY3JpcHRpb25zIGNhbiBiZSBmbGV4aWJseSBvcmdhbml6ZWQgaW4gU3RlcHMgd2l0aCBzdWItU3RlcHMuICBTZWN0aW9ucyBhcmUgVmFyaWFiaWxpdHkgRWxlbWVudHMgdGhlbXNlbHZlcywgc28gdGhleSBjYW4gY29udHJpYnV0ZSB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBtb2RlbCBhIFRhc2sgc3RlcCBhcyBhIFNlY3Rpb24gaW5zdGFuY2Ugd2l0aG91dCByZWxhdGluZyBpdCB0byBhIFRhc2sgRGVzY3JpcHRpb24gdGhhdCBkaXJlY3RseSBjb250cmlidXRlcyB0byAob3IgcmVwbGFjZXMpIGFub3RoZXIgU2VjdGlvbiB3aGljaCBpcyBwYXJ0IG9mIGEgVGFzayBEZXNjcmlwdGlvbi4gIFRoaXMgY29udHJpYnV0aW9uIChvciByZXBsYWNlbWVudCkgd291bGQgYWRkIG5ldyBkZXNjcmlwdGlvbiB0ZXh0IHRvIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uIChvciByZXBsYWNlIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uKS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSB0byBjb250cmlidXRlIG5ldyBDaGVjayBMaXN0IGl0ZW1zIG9yZ2FuaXplZCBhcyBTZWN0aW9ucyB0byBhbiBleGlzdGluZyBDaGVjayBMaXN0IChkZWZpbmVkIGFzIGd1aWRhbmNlKS4gICYjeEE7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbk5hbWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEE7VmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLiYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJuYSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGRlZmF1bHQgJnF1b3Q7bm90IGFzc2lnbmVkJnF1b3Q7IHZhbHVlIG9mIGEgVmFyaWFiaWxsaXR5IEVsZW1lbnQncyB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FzZSBubyB2YXJpYWJpbGl0eSBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IGJldHdlZW4gdGhlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5IGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgYWx0ZXJpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLCBpLmUuIGluIGFuIGFkZGl0aXZlIGZhc2hpb24uICBQcm9wZXJ0aWVzIGNvbnRyaWJ1dGVkIGFyZTogYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBjb250cmlidXRpb24gaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIGFuIGF1Z21lbnRlZCB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRoYXQgY29tYmluZXMgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIHdheSB0aGlzIGNvbWJpbmF0aW9uIGlzIHJlYWxpemVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbi4gIEZvciBleGFtcGxlLCBTdHJpbmcgYXR0cmlidXRlcyBhcmUgY29uY2F0ZW5hdGVkIHJlc29sdmluZyBlbWJlZGRlZCBjb21tYW5kcyBmb3IgZGVwZW5kZW50IHRleHQgb3IgbWVyZ2luZyB0ZXh0IGZyYWdtZW50cyAoZS5nLiBkZXNjcmlwdGlvbnMgZm9yIGNvbnRlbnQgZWxlbWVudHMpLiAgQWRkaXRpb25hbCBlbGVtZW50cyBpbiB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgKGUuZy4gYWRkaXRpb25hbCBHdWlkYW5jZSBlbGVtZW50cyBvciBUYXNrIERlc2NyaXB0b3JzIG9mIGFuIEFjdGl2aXR5KS4gIERpZmZlcmVudCBlbGVtZW50cyBpbiB0by1vbmUgYXNzb2NpYXRpb25zIGFyZSBpZ25vcmVkIChlLmcuIHRoZSBvbmUgUHJpbWFyeSBQZXJmb3JtZXIgb2YgYSBUYXNrKS4gIE11bHRpcGxlIENvbnRlbnQgRWxlbWVudHMgY2FuIGNvbnRyaWJ1dGUgdG8gdGhlIHNhbWUgYmFzZSBlbGVtZW50IGFuZCBhbGwgb2YgdGhlc2UgY29udHJpYnV0aW9ucyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byB0aGUgYmFzZSBpbiB0aGUgc2FtZSBmYXNoaW9uLiBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOiYjeEE7YXR0cmlidXRlIHZhbHVlczomI3g5O1N0cmluZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBjb25jYXRlbmF0ZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4gIE90aGVyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgYW55IG90aGVyIHR5cGUgc3VjaCBhcyBJbnRlZ2VyLCBEYXRlIGFyZSBpZ25vcmVkLiYjeEE7VGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4mI3hBOzAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOiYjeDk7VGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBrZXB0IGFuZCBhbnkgYXNzb2NpYXRpb24gZnJvbSB0aGUgY29udHJpYnV0aW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpZ25vcmVkLiYjeEE7MC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6JiN4OTtBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgYWRkZWQgdG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBlbGVtZW50LiAgSWYgYm90aCBWYXJpYWJpbGl0eSBFbGVtZW50cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QgdGhlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgYXNzb2NpYXRpb24gd2lsbCByZW1haW4uJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFeHRlbnNpb24gYWxsb3dzIE1ldGhvZCBQbHVnaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgQmFzZSBQbHVnaW4gYnkgcHJvdmlkaW5nIGEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIEFzc29jaWF0aW9uIGluc3RhbmNlcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSByZXN1bHQgb2YgaW50ZXJwcmV0YXRpb24gaXMgdGhhdCB0aGUgc3BlY2lhbCBlbGVtZW50IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBiYXNlZC1vbiBoYXMsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuICBIZW5jZSBleHRlbmRzIGlzIG5vdCB1c2VkIHRvIG1vZGlmeSBjb250ZW50IG9mIHRoZSBiYXNlIFBsdWdpbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcgUGx1Z2luIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkIChlLmcuIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUgb2YgcmV2aWV3KS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdmlhIHRoZSBleHRlbmRzIHJlbGF0aW9uc2hpcC4gIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBDYXBhYmlsaXR5IFBhdHRlcm5zIHRvIFByb2Nlc3NlczogQSBwYXR0ZXJuIGlzIGFwcGxpZWQgYnkgZGVmaW5pbmcgYW4gZXh0ZW5kcyByZWxhdGlvbnNoaXBzIGZyb20gYW4gQWN0aXZpdHkgb2YgdGhlIGFwcGx5aW5nIFByb2Nlc3NlcyB0byB0aGUgUGF0dGVybi4gIFRoZSBBY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbnMgaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMgdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIFByb2Nlc3MgYWZ0ZXIgSW50ZXJwcmV0YXRpb24uJiN4QTthdHRyaWJ1dGUgdmFsdWVzOiYjeDk7VmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IGVsZW1lbnQgYXJlIGluaGVyaXRlZCBhbmQgdXNlZCB0byBwb3B1bGF0ZSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBhdHRyaWJ1dGVzLiAgSWYgdGhlIHNwZWNpYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFyZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgaW5oZXJpdGVkIHZhbHVlcyBhcmUgaWdub3JlZC4gICYjeEE7VGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4mI3hBOzAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOiYjeDk7VGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyBpdHMgb3duIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gdGhlIGluaGVyaXRlZCBvbmUgaXMgaWdub3JlZC4mI3hBOzAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOiYjeDk7QXNzb2NpYXRpb24gaW5zdGFuY2VzIGRlZmluZWQgZm9yIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSBzcGVjaWFsIGVsZW1lbnQgY2FuIGFkZCBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIGluc3RhbmNlcy4mI3hBOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcGxhY2VzIHByb3ZpZGVzIGEgd2F5IGZvciBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byByZXBsYWNlIGEgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHVzZWQgZm9yIE1ldGhvZCBQbHVnaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrLCBvciBBY3Rpdml0aWVzIHdpdGggZWl0aGVyIGEgY29tcGxldGUgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIGZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMgKGUuZy4gUm9sZS1BcnRpZmFjdCByZXNwb25zaWJpbGl0eSkuICBQcm9wZXJ0aWVzIHJlcGxhY2VkIGFyZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBDb250ZW50IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhpcyBuZXcgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0byB3aGljaCBhbGwgaW5jb21pbmcgYXNzb2NpYXRpb25zIHN0aWxsIHBvaW50IGFzIGJlZm9yZSwgYnV0IHdoaWNoIGhhcyBwb3RlbnRpYWxseSBuZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy4gIFRoaXMgcHJvdmlkZXMgYSB2ZXJ5IHBvd2VyZnVsIG1lY2hhbmlzbSB0byByZXBsYWNlLCBmb3IgZXhhbXBsZSwgd2hvbGUgQWN0aXZpdGllcyBpbiBhIFByb2Nlc3Mgd2l0aCBjb21wbGV0ZSBuZXcgcmVhbGl6YXRpb25zIG9mIHRoZSBBY3Rpdml0eS4gIEZvciBpbnN0YW5jZSwgcmVwbGFjaW5nIGFuIEFjdGl2aXR5IGRvaW5nIHVzZSBjYXNlLWJhc2VkIGRlc2lnbiB3aXRoIGFuIGFjdGl2aXR5IGRvaW5nIGFnaWxlIGNvZGUtY2VudHJpYyBkZXZlbG9wbWVudCBkb2luZyB0aGUgc2FtZSB3b3JrIHVzaW5nIGEgZGlmZmVyZW50IGRldmVsb3BtZW50IHRlY2huaXF1ZSB1dGlsaXppbmcgZGlmZmVyZW50IFJvbGVzLCBUYXNrcywgZXRjLiAgQW5vdGhlciBleGFtcGxlLCB3b3VsZCBiZSB0byByZXBsYWNlIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gUkRCTVMgd2l0aCBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIE9PREJNUy4gIEEgVmFyaWFiaWxpdHkgRWxlbWVudCBjYW4gb25seSBiZSByZXBsYWNlZCBieSBvbmUgb3RoZXIgZWxlbWVudCBhdCBhIHRpbWUuICBGb3IgZXhhbXBsZSwgaWYgdHdvIE1ldGhvZCBQbHVnaW5zIHJlcGxhY2UgdGhlIHNhbWUgZWxlbWVudCBvbmx5IG9uZSBNZXRob2QgUGx1Z2luIGNhbiBiZSB1c2VkIGZvciBpbnRlcnByZXRhdGlvbiAoc2VlIGNvbmNlcHQgb2YgTWV0aG9kIENvbmZpZ3VyYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gcmVzb2x2ZSBzdWNoIGNvbmZsaWN0cywgU2VjdGlvbiA3LjEuMikuICBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOiYjeEE7YXR0cmlidXRlIHZhbHVlczomI3g5O1ZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaW5jbHVkaW5nIHVuYXNzaWduZWQgdmFsdWVzLiYjeEE7VGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4mI3hBOzAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOiYjeDk7VGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBmcm9tIHRoZSByZXBsYWNpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gcmVzdWx0aW5nIGVsZW1lbnQgd2lsbCBhbHNvIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uLiYjeEE7MC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6JiN4OTtBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCByZXBsYWNlIGFsbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuJiN4QTsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzUmVwbGFjZXMiIHZhbHVlPSI2Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbmNlcHQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2hlY2tsaXN0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXJtRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiBlU3VwZXJUeXBlcz0iIy8vQ2xhc3NpZmllciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUHJpbWFyeUV4dGVuc2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4QTtBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQXJ0aWZhY3QiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXJ0aWZhY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vRnVsZmlsbGFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4mI3hBOyYjeEQ7JiN4QTtUaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFdvcmsgUHJvZHVjdCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwb3J0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVwb3J0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBsYXRlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVtcGxhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRnVsZmlsbGFibGVFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZnVsZmlsbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Z1bGZpbGxhYmxlRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXBvcnQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sTWVudG9yIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGVwIiBlU3VwZXJUeXBlcz0iIy8vU2VjdGlvbiAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuJiN4QTtBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4QTtXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlY29uZGl0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3Rjb25kaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2hpdGVwYXBlciIgZVN1cGVyVHlwZXM9IiMvL0NvbmNlcHQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEE7QSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gJiN4QTtBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4mI3hBOyYjeEQ7JiN4QTtUaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFRhc2sgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3RlcCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vRnVsZmlsbGFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4QTtBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNraWxscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dGFjaG1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkaXRpb25hbEluZm8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ29hbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4mI3hBO0RvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkb21haW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Eb21haW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzY2lwbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiYjeEE7QSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLiYjeEE7JiN4RDsmI3hBO0Rpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiBUYXNrcyBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiAgVGhpcyBpcyB0aGUgZXh0ZW5zaW9ucyBvZiBEaXNjaXBsaW5lIGRlZmluZWQgaW4gdGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gdG8gQWN0aXZpdGllcywgd2hpY2ggcmVwcmVzZW50IHR5cGljYWwgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgbWVhbmluZ2Z1bCBncm91cGluZ3Mgb2YgdGhlIERpc2NpcGxpbmUncyBUYXNrcyBpbnRvIHdvcmtmbG93cy4mI3hBO1Rhc2tzIHJlcHJlc2VudCBkZXNjcmlwdGlvbnMgb2Ygd29yaywgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGJ5IERpc2NpcGxpbmVzLiAgVGhlIHJlYXNvbiB0aGF0IHNldmVyYWwgVGFza3MgYXJlIGFsbCBjYXRlZ29yaXplZCBieSB0aGUgc2FtZSBEaXNjaXBsaW5lIGlzIHRoYXQgdGhleSBhbGwgcmVwcmVzZW50IGEgcGFydCBpbiBhY2hpZXZpbmcgYSBoaWdoZXIgZ29hbCBvciBwZXJmb3JtaW5nIHdvcmsgdGhhdCBpcyBhbGwgcmVsYXRlZCB0byBlYWNoIG90aGVyLiAgRXZlcnkgRGlzY2lwbGluZSBkZWZpbmVzIHN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgaXQgY2F0ZWdvcml6ZXMuICBTdWNoIHN0YW5kYXJkIHdheXMgYXJlIGV4cHJlc3MgYnkgQWN0aXZpdGllcyBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGRlZmluaW5nIGhvdyB0aGUgVGFza3MgY2F0ZWdvcml6ZWQgYnkgdGhlIERpc2NpcGxpbmUgJ3dvcmsgdG9nZXRoZXInIGluIHRoZSBtb3N0IGdlbmVyaWMgd2F5LiAgVGhlc2UgcmVmZXJlbmNlIHdvcmtmbG93cyBhcmUgb2Z0ZW4gdXNlZCBmb3IgZWR1Y2F0aW5nIGFuZCB0ZWFjaGluZyBwcmFjdGl0aW9uZXJzLiAmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vRnVsZmlsbGFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gQWN0aXZpdHkgaXMgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLiYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuJiN4QTsmI3hEOyYjeEE7VGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW50cm9kdWNlZCBpbiB0aGUgcGFja2FnZSBCcmVha2Rvd24gd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGFuZCBpcyB0aGUgYmFzaXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjbGFzcyBQcm9jZXNzLiYjeEE7RXh0ZW5kcyBBY3Rpdml0eSB3aXRoIGFuIGFzc29jaWF0aW9uIHRvIFJvYWRtYXAuICBUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgYWxzbyBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGV4dGVuc2lvbiBvZiB0aGUgRGlzY2lwbGluZSBjYXRlZ29yeS4mI3hBOyYjeEQ7JiN4QTtBY3Rpdml0eSBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCB0byBleHRlbmQgQWN0aXZpdHkgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4mI3hEOyYjeEE7QWN0aXZpdHkgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IHdoaWNoIHByb3ZpZGVzIGtleSBtZWNoYW5pc20gdG8gZW5hYmxlIGR5bmFtaWMgYmluZGluZyBvZiBDYXBhYmlsaXR5IFBhdHRlcm5zIGluIFByb2Nlc3NlcyBhcyB3ZWxsIGFzIFByb2Nlc3MgQ29udHJpYnV0aW9ucy4gIFZhcmlhYmlsaXR5IGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkgZm9yIEFjdGl2aXRpZXM6JiN4RDsmI3hBOy0gRXh0ZW5kOiBUbyBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBhIHByb2Nlc3Mgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSB3aGljaCBleHRlbmRzIHRoZSBwYXR0ZXJuJ3MgdG9wLWxldmVsIGFjdGl2aXR5LiAgVGhyb3VnaCBleHRlbnNpb24gdGhlIGV4dGVuZGluZyBBY3Rpdml0eSBpbmhlcml0cyB0aGUgcGF0dGVybnMgQnJlYWtkb3duIEVsZW1lbnRzLiYjeEQ7JiN4QTstIFJlcGxhY2U6IFRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgb2YgYW4gYXBwbGllZCBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBmb3Igd2hpY2ggb25lIGRldmVsb3BzIGEgUHJvY2VzcyBDb250cmlidXRpb24gKG9yIGEgY29tYmluYXRpb24gb2YgYm90aCkgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSBhbmQgc3BlY2lmeSB0aGUgcmVwbGFjZSB2YXJpYWJpbGl0eSBzcGVjaWFsaXphdGlvbiBiZXR3ZWVuIHRoZW0uJiN4RDsmI3hBOy0gQ29udHJpYnV0ZTogVG8gY29udHJpYnV0ZSBuZXcgQnJlYWtkb3duIEVsZW1lbnRzIHRvIGFuIGV4aXN0aW5nIEFjdGl2aXR5IG9uZSB3b3VsZCBkZWZpbmUgYW4gQWN0aXZpdHkgd2l0aCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWxhdGVzIHZpYSB0aGUgQ29udHJpYnV0ZXMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdG8gdGhpcyBleGlzdGluZyBBY3Rpdml0eS4gIFRoZSBjb250cmlidXRpbmcgQWN0aXZpdHkncyBCcmVha2Rvd24gRWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29udHJpYnV0ZWQgQWN0aXZpdHkuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9hZG1hcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvYWRtYXAiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4QTsmI3hBOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrT3JkZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1BsYW5uZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4mI3hBOyYjeEE7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxhbm5pbmdEYXRhIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1BsYW5uaW5nRGF0YSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0FjdGl2aXR5IiBlT3Bwb3NpdGU9IiMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2FibGVBc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBsYXRlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVtcGxhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwb3J0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVwb3J0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25jb25zaWRlcmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xtZW50b3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4mI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQbGFubmluZ0RhdGEiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLiYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEE7KE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYW5rIiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4QTsoTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikmI3hBO1RoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua1R5cGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV29ya09yZGVyVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmluaXNoVG9TdGFydCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkIiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7Q29uc3RydWN0IGZlbmNlJnF1b3Q7IGFuZCAmcXVvdDtQYWludCBmZW5jZSwmcXVvdDsgJnF1b3Q7UGFpbnQgZmVuY2UmcXVvdDsgY2FuJ3Qgc3RhcnQgdW50aWwgJnF1b3Q7Q29uc3RydWN0IGZlbmNlJnF1b3Q7IGZpbmlzaGVzLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB0eXBlIG9mIGRlcGVuZGVuY3kgYW5kIHRoZSBkZWZhdWx0IGZvciBhIG5ldyBXb3JrIE9yZGVyIGluc3RhbmNlLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgYW5kICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCwmcXVvdDsgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsJnF1b3Q7IGNhbid0IGZpbmlzaCB1bnRpbCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGZpbmlzaGVzLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9TdGFydCIgdmFsdWU9IjIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtQb3VyIGZvdW5kYXRpb24mcXVvdDsgYW5kICZxdW90O0xldmVsIGNvbmNyZXRlLCZxdW90OyAmcXVvdDtMZXZlbCBjb25jcmV0ZSZxdW90OyBjYW4ndCBiZWdpbiB1bnRpbCAmcXVvdDtQb3VyIGZvdW5kYXRpb24mcXVvdDsgYmVnaW5zLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9GaW5pc2giIHZhbHVlPSIzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gVGhpcyBkZXBlbmRlbmN5IHR5cGUgY2FuIGJlIHVzZWQgZm9yIGp1c3QtaW4tdGltZSBzY2hlZHVsaW5nIHVwIHRvIGEgbWlsZXN0b25lIG9yIHRoZSBwcm9qZWN0IGZpbmlzaCBkYXRlIHRvIG1pbmltaXplIHRoZSByaXNrIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgZmluaXNoaW5nIGxhdGUgaWYgaXRzIGRlcGVuZGVudCBCcmVha2Rvd24gRWxlbWVudHMgc2xpcC4gSWYgYSByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhlIG1pbGVzdG9uZSBvciBwcm9qZWN0IGZpbmlzaCBkYXRlLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgZXhhY3RseSB3aGVuIGFuZCB5b3UgZG9uJ3Qgd2FudCBhIGxhdGUgZmluaXNoIHRvIGFmZmVjdCB0aGUganVzdC1pbi10aW1lIEJyZWFrZG93biBFbGVtZW50LCB5b3UgY2FuIGNyZWF0ZSBhbiBTRiBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIEJyZWFrZG93biBFbGVtZW50IHlvdSB3YW50IHNjaGVkdWxlZCBqdXN0IGluIHRpbWUgKHRoZSBwcmVkZWNlc3NvcikgYW5kIGl0cyByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50ICh0aGUgc3VjY2Vzc29yKS4gVGhlbiBpZiB5b3UgdXBkYXRlIHByb2dyZXNzIG9uIHRoZSBzdWNjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQsIGl0IHdvbid0IGFmZmVjdCB0aGUgc2NoZWR1bGVkIGRhdGVzIG9mIHRoZSBwcmVkZWNlc3NvciBCcmVha2Rvd24gRWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2FkbWFwIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLiYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZVNldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVTZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkNhdGVnb3JpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1pbGVzdG9uZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcXVpcmVkUmVzdWx0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4mI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrUHJvZHVjdCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEE7SXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGhhc2UiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hBO1BoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEE7V29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLiYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlYW1Sb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJUZWFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4QTsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lzdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVybmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuJiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4QTtBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3MiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4QTtDb3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuJiN4QTsmI3hEOyYjeEE7UHJvY2VzcyBpbiB0aGUgcGFja2FnZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gZXh0ZW5kcyB0aGUgY2xhc3MgUHJvY2VzcyB3aXRoIGFzc29jaWF0aW9uIHJlbGF0aW5nIGEgUHJvY2VzcyB0byBvbmUgZGVmYXVsdCBhbmQgbWFueSBvcHRpb25hbCB2YWxpZCBDb25maWd1cmF0aW9ucy4mI3hBO1RoZXNlIGNvbmZpZ3VyYXRpb25zIGRlc2NyaWJlIHZhbGlkIGNvbnRleHRzIGZvciB0aGUgUHJvY2VzcyB3aXRoaW4gYSBNZXRob2QgTGlicmFyeSBpbmRpY2F0aW5nIHVuZGVyIHdoaWNoIENvbmZpZ3VyYXRpb25zIGEgUHJvY2VzcyBpcyB3ZWxsIGRlZmluZWQuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWxpZENvbnRleHQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuJiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4QTstIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLiYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc1ZpZXdzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdFZpZXciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRlZENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwb3J0aW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3VwcG9ydGluZyBtZXRob2QgcGx1Zy1pbiBpcyBhIHBsdWctaW4gdGhhdCBjb250YWlucyBzdXBwb3J0aW5nIGFuZCBvcHRpb25hbCBtZXRob2QgZWxlbWVudHMuIE9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgZnJvbSBub24tc3VwcG9ydGluZyBwbHVnLWluIGFyZSB0byBiZSBjb25zaWRlcmVkIGZvciBpbmNsdXNpb24gaW50byBhIG1ldGhvZCBjb25maWd1cmF0aW9uLiBJbiBvdGhlciB3b3JkcywgaWYgYSBzdXBwb3J0aW5nIG1ldGhvZCBwbHVnLWluIGlzIHNlbGVjdGVkIGZvciBhIGNvbmZpZ3VyYXRpb24gb25seSBpdHMgZWxlbWVudHMgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgb2YgdGhpcyBwbHVnLWluIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uICBBbGwgb3RoZXIgdW5yZWZlcmVuY2VkIGVsZW1lbnRzIHdpbGwgbm90IGJlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2UiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93dG9TdGFmZiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJpc2tMZXZlbCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NvcGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSAjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4mI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hBO0Ega2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Qb2ludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaE5vZGUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzaXplIiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpbWVuc2lvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNWaXNpYmxlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlIiBlT3Bwb3NpdGU9IiMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvaW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieCIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUxpbmsiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb3J0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhDb25uZWN0b3IiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpbWVuc2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndpZHRoIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZUlPIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVJbmZvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMZWFmRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRleHRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZXh0IiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkltYWdlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2x5bGluZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbG9zZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGxpcHNlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNlbnRlciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Qb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNZIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb3RhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5kQW5nbGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NGYW1pbHkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZWxpdmVyeVByb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5lbXggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5lbXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMmMxNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZW14CisrKyAvZGV2L251bGwKQEAgLTEsMzQwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4NCi08P2NvbS5pYm0ueHRvb2xzLmVtZi5jb3JlLnNpZ25hdHVyZSA8c2lnbmF0dXJlIGlkPSJjb20uaWJtLnh0b29scy51bWwubXNsLm1vZGVsIiB2ZXJzaW9uPSI3LjAuMCI+PGZlYXR1cmUgZGVzY3JpcHRpb249IiIgbmFtZT0iY29tLmlibS54dG9vbHMucnVtbC5mZWF0dXJlIiB1cmw9IiIgdmVyc2lvbj0iNy4wLjAiLz48L3NpZ25hdHVyZT4/Pg0KLTw/Y29tLmlibS54dG9vbHMuZW1mLmNvcmUuc2lnbmF0dXJlIDxzaWduYXR1cmUgaWQ9ImNvbS5pYm0ueHRvb2xzLm1taS51aS5zaWduYXR1cmVzLmRpYWdyYW0iIHZlcnNpb249IjcuMC4wIj48ZmVhdHVyZSBkZXNjcmlwdGlvbj0iIiBuYW1lPSJSYXRpb25hbCBNb2RlbGluZyBQbGF0Zm9ybSAoY29tLmlibS54dG9vbHMucm1wKSIgdXJsPSIiIHZlcnNpb249IjcuMC4wIi8+PC9zaWduYXR1cmU+Pz4NCi08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOkRlZmF1bHQ9Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEiIHhtbG5zOkVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEgcGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyL3NjaGVtYXMvRWNvcmUvMyBwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI192eS1IVVlpbkVkcXR2Ym5mQjJMXzV3Ij4NCi0gIDx1bWw6TW9kZWwgeG1pOmlkPSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSIgbmFtZT0idW1hIj4NCi0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9KN3RHMGV5Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiLz4NCi0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90azh1OENYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dThTWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVTUwySW5mcmFzdHJ1Y3R1cmVNaW5pOjpDb25zdHJ1Y3RzIiByZWZlcmVuY2VzPSJfdEJWc1RTWDVFZDJLbkoyeWpOWGhXUSBfdEJWc1NpWDVFZDJLbkoyeWpOWGhXUSBfdEJmY2tDWDVFZDJLbkoyeWpOWGhXUSBfdEJmY2xTWDVFZDJLbkoyeWpOWGhXUSBfdEJmY2tpWDVFZDJLbkoyeWpOWGhXUSBfdEJmY21TWDVFZDJLbkoyeWpOWGhXUSBfdEJmY25DWDVFZDJLbkoyeWpOWGhXUSBfdEJmY29DWDVFZDJLbkoyeWpOWGhXUSBfdEJmY3BDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dThpWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcmltaXRpdmVUeXBlcyIgcmVmZXJlbmNlcz0iX3RCZmNzQ1g1RWQyS25KMnlqTlhoV1EgX3RCZmNzaVg1RWQyS25KMnlqTlhoV1EgX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EgX3RCZmN0aVg1RWQyS25KMnlqTlhoV1EgX3RCb21nQ1g1RWQyS25KMnlqTlhoV1EgX3RCb21nU1g1RWQyS25KMnlqTlhoV1EgX3RCb21neVg1RWQyS25KMnlqTlhoV1EgX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RrOHU4eVg1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6QmFzaWNFbGVtZW50cyIgcmVmZXJlbmNlcz0iX3RCOEloQ1g1RWQyS25KMnlqTlhoV1EgX3RCOElpU1g1RWQyS25KMnlqTlhoV1EgX3RCOElqaVg1RWQyS25KMnlqTlhoV1EgX3RCOElreVg1RWQyS25KMnlqTlhoV1EgX3RCOElsaVg1RWQyS25KMnlqTlhoV1EgX3RCOEltU1g1RWQyS25KMnlqTlhoV1EgX3RCOElnU1g1RWQyS25KMnlqTlhoV1EgX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EgX3RCOElvaVg1RWQyS25KMnlqTlhoV1EgX3RCOElweVg1RWQyS25KMnlqTlhoV1EgX3RCOElueVg1RWQyS25KMnlqTlhoV1EgX3RDRlNjeVg1RWQyS25KMnlqTlhoV1EgX3RDRlNlQ1g1RWQyS25KMnlqTlhoV1EgX3RDRlNmU1g1RWQyS25KMnlqTlhoV1EgX3RDRlNjQ1g1RWQyS25KMnlqTlhoV1EgX3RDRlNneVg1RWQyS25KMnlqTlhoV1EgX3RDRlNnQ1g1RWQyS25KMnlqTlhoV1EgX3RDRlNqQ1g1RWQyS25KMnlqTlhoV1EgX3RDRlNpQ1g1RWQyS25KMnlqTlhoV1EgX3RDRlNrU1g1RWQyS25KMnlqTlhoV1EgX3RDRlNqeVg1RWQyS25KMnlqTlhoV1EgX3RDRlNseVg1RWQyS25KMnlqTlhoV1EgX3RDRlNsU1g1RWQyS25KMnlqTlhoV1EgX3RDRlNtaVg1RWQyS25KMnlqTlhoV1EgX3RDRlNtQ1g1RWQyS25KMnlqTlhoV1EgX3RDRlNueVg1RWQyS25KMnlqTlhoV1EgX3RDRlNuU1g1RWQyS25KMnlqTlhoV1EgX3RDRlNwQ1g1RWQyS25KMnlqTlhoV1EgX3RDRlNvaVg1RWQyS25KMnlqTlhoV1EgX3RDRlNxQ1g1RWQyS25KMnlqTlhoV1EgX3RDRlNweVg1RWQyS25KMnlqTlhoV1EgX3RDRlNxeVg1RWQyS25KMnlqTlhoV1EgX3RDRlNxU1g1RWQyS25KMnlqTlhoV1EgX3RDRlNyeVg1RWQyS25KMnlqTlhoV1EgX3RDRlNyaVg1RWQyS25KMnlqTlhoV1EgX3RDRlN0Q1g1RWQyS25KMnlqTlhoV1EgX3RDRlNzaVg1RWQyS25KMnlqTlhoV1EgX3RDRlN0aVg1RWQyS25KMnlqTlhoV1EgX3RDRlN0U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RrOHU5Q1g1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kUGx1Z2luIiByZWZlcmVuY2VzPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSBfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSBfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSBfdERJYlVTWDVFZDJLbkoyeWpOWGhXUSBfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSBfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSBfdFdEWFZDWDVFZDJLbkoyeWpOWGhXUSBfdFdEWFZ5WDVFZDJLbkoyeWpOWGhXUSBfdFdEWFdpWDVFZDJLbkoyeWpOWGhXUSBfdFdEWFhTWDVFZDJLbkoyeWpOWGhXUSBfdFdEWFVDWDVFZDJLbkoyeWpOWGhXUSBfdFdEWFl5WDVFZDJLbkoyeWpOWGhXUSBfdFdEWFppWDVFZDJLbkoyeWpOWGhXUSBfdFdEWGF5WDVFZDJLbkoyeWpOWGhXUSBfdFdOSVV5WDVFZDJLbkoyeWpOWGhXUSBfdFdOSVZpWDVFZDJLbkoyeWpOWGhXUSBfdFdOSVVDWDVFZDJLbkoyeWpOWGhXUSBfdFdOSVd5WDVFZDJLbkoyeWpOWGhXUSBfdFdOSVl5WDVFZDJLbkoyeWpOWGhXUSBfdFdOSVlTWDVFZDJLbkoyeWpOWGhXUSBfdFdOSWFDWDVFZDJLbkoyeWpOWGhXUSBfdFdOSVppWDVFZDJLbkoyeWpOWGhXUSBfdFdOSWJTWDVFZDJLbkoyeWpOWGhXUSBfdFdOSWF5WDVFZDJLbkoyeWpOWGhXUSBfdFdOSWNpWDVFZDJLbkoyeWpOWGhXUSBfdFdOSWNDWDVFZDJLbkoyeWpOWGhXUSBfdFdOSWR5WDVFZDJLbkoyeWpOWGhXUSBfdFdOSWRTWDVFZDJLbkoyeWpOWGhXUSBfdFdOSWV5WDVFZDJLbkoyeWpOWGhXUSBfdFdOSWVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dTlTWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpHdWlkYW5jZVR5cGVzIiByZWZlcmVuY2VzPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSBfdERJYldpWDVFZDJLbkoyeWpOWGhXUSBfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSBfdEVLOUlTWDVFZDJLbkoyeWpOWGhXUSBfdEVLOUpDWDVFZDJLbkoyeWpOWGhXUSBfdEVLOUp5WDVFZDJLbkoyeWpOWGhXUSBfdEVLOUtpWDVFZDJLbkoyeWpOWGhXUSBfdEVLOUxTWDVFZDJLbkoyeWpOWGhXUSBfdEVLOU1DWDVFZDJLbkoyeWpOWGhXUSBfdEVLOU15WDVFZDJLbkoyeWpOWGhXUSBfdEVLOU5pWDVFZDJLbkoyeWpOWGhXUSBfdEVLOU9TWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVBDWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVFpWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVJTWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVB5WDVFZDJLbkoyeWpOWGhXUSBfdEVLOVNTWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVRDWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVR5WDVFZDJLbkoyeWpOWGhXUSBfdEVLOVVpWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVZpWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVdTWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVhTWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVlDWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVl5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdUlDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdUl5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdUppWDVFZDJLbkoyeWpOWGhXUSBfdEVVdUtTWDVFZDJLbkoyeWpOWGhXUSBfdEVVdUxDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdUx5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdU5DWDVFZDJLbkoyeWpOWGhXUSBfdEVVdU1pWDVFZDJLbkoyeWpOWGhXUSBfdEVVdU9TWDVFZDJLbkoyeWpOWGhXUSBfdEVVdU55WDVFZDJLbkoyeWpOWGhXUSBfdEVVdVBpWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVBDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVF5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdVFTWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVNDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVJpWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVRTWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVN5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdVVpWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVVDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVZ5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdVZTWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVhDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVdpWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVh5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdVhTWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVpDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVlpWDVFZDJLbkoyeWpOWGhXUSBfdEVVdWFDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVp5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdWJDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdWF5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdWNDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdWJ5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdWRDWDVFZDJLbkoyeWpOWGhXUSBfdEVVdWN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dTlpWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpNZXRob2RDb3JlRGVzY3JpcHRpb25zIiByZWZlcmVuY2VzPSJfdEI4SW55WDVFZDJLbkoyeWpOWGhXUSBfdENGU2lDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZThpWDVFZDJLbkoyeWpOWGhXUSBfdEZOZTl5WDVFZDJLbkoyeWpOWGhXUSBfdEZOZV9DWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkFDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZThDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkJpWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkN5WDVFZDJLbkoyeWpOWGhXUSBfdEZOZkJDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkVpWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkZ5WDVFZDJLbkoyeWpOWGhXUSBfdEZOZkhDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkVDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkl5WDVFZDJLbkoyeWpOWGhXUSBfdEZOZktDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZklTWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkx5WDVFZDJLbkoyeWpOWGhXUSBfdEZOZk5DWDVFZDJLbkoyeWpOWGhXUSBfdEZOZk9TWDVFZDJLbkoyeWpOWGhXUSBfdEZOZkxTWDVFZDJLbkoyeWpOWGhXUSBfdEZOZlFDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZlBpWDVFZDJLbkoyeWpOWGhXUSBfdEZOZlJ5WDVFZDJLbkoyeWpOWGhXUSBfdEZOZlRDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZlVTWDVFZDJLbkoyeWpOWGhXUSBfdEZOZlZpWDVFZDJLbkoyeWpOWGhXUSBfdEZOZld5WDVFZDJLbkoyeWpOWGhXUSBfdEZOZllDWDVFZDJLbkoyeWpOWGhXUSBfdEZOZlJTWDVFZDJLbkoyeWpOWGhXUSBfdEZOZlppWDVFZDJLbkoyeWpOWGhXUSBfdEZOZmFpWDVFZDJLbkoyeWpOWGhXUSBfdEZOZmJpWDVFZDJLbkoyeWpOWGhXUSBfdEZOZmN5WDVFZDJLbkoyeWpOWGhXUSBfdEZOZmVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dTl5WDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RMaWJyYXJ5OjpNZXRob2RVbml0cyIgcmVmZXJlbmNlcz0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EgX3RUWDJ3Q1g1RWQyS25KMnlqTlhoV1EgX3RXRFhVQ1g1RWQyS25KMnlqTlhoV1EgX3RlMkc5U1g1RWQyS25KMnlqTlhoV1EgX3RlMkctaVg1RWQyS25KMnlqTlhoV1EgX3RlMkdfaVg1RWQyS25KMnlqTlhoV1EgX3RlMkhBeVg1RWQyS25KMnlqTlhoV1EgX3RlMkhDQ1g1RWQyS25KMnlqTlhoV1EgX3RlMkc4aVg1RWQyS25KMnlqTlhoV1EgX3RlMkhEaVg1RWQyS25KMnlqTlhoV1EgX3RlMkhEQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RrOHUtQ1g1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6Q29yZUNvbnRlbnRFbGVtZW50cyIgcmVmZXJlbmNlcz0iX3RESWJWQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJWeVg1RWQyS25KMnlqTlhoV1EgX3RESWJVU1g1RWQyS25KMnlqTlhoV1EgX3RESWJYaVg1RWQyS25KMnlqTlhoV1EgX3RESWJZU1g1RWQyS25KMnlqTlhoV1EgX3RESWJaQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJaeVg1RWQyS25KMnlqTlhoV1EgX3RESWJhaVg1RWQyS25KMnlqTlhoV1EgX3RESWJiU1g1RWQyS25KMnlqTlhoV1EgX3RESWJXaVg1RWQyS25KMnlqTlhoV1EgX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJjeVg1RWQyS25KMnlqTlhoV1EgX3RESWJlU1g1RWQyS25KMnlqTlhoV1EgX3RESWJmQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJkaVg1RWQyS25KMnlqTlhoV1EgX3RESWJnaVg1RWQyS25KMnlqTlhoV1EgX3RESWJmeVg1RWQyS25KMnlqTlhoV1EgX3RESWJoU1g1RWQyS25KMnlqTlhoV1EgX3RESWJpQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJqeVg1RWQyS25KMnlqTlhoV1EgX3RESWJraVg1RWQyS25KMnlqTlhoV1EgX3RESWJqQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJseVg1RWQyS25KMnlqTlhoV1EgX3RESWJsU1g1RWQyS25KMnlqTlhoV1EgX3RESWJuQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJtaVg1RWQyS25KMnlqTlhoV1EgX3RESWJvU1g1RWQyS25KMnlqTlhoV1EgX3RESWJueVg1RWQyS25KMnlqTlhoV1EgX3RESWJwaVg1RWQyS25KMnlqTlhoV1EgX3RESWJwQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJxeVg1RWQyS25KMnlqTlhoV1EgX3RESWJxU1g1RWQyS25KMnlqTlhoV1EgX3RESWJzQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJyaVg1RWQyS25KMnlqTlhoV1EgX3RESWJzeVg1RWQyS25KMnlqTlhoV1EgX3RESWJ0eVg1RWQyS25KMnlqTlhoV1EgX3RESWJ0U1g1RWQyS25KMnlqTlhoV1EgX3RESWJ2Q1g1RWQyS25KMnlqTlhoV1EgX3RESWJ1aVg1RWQyS25KMnlqTlhoV1EgX3RESWJ3U1g1RWQyS25KMnlqTlhoV1EgX3RESWJ2eVg1RWQyS25KMnlqTlhoV1EgX3RESWJ4Q1g1RWQyS25KMnlqTlhoV1EgX3RESWJ3aVg1RWQyS25KMnlqTlhoV1EgX3RESWJ4eVg1RWQyS25KMnlqTlhoV1EgX3RESWJ4U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RrOHUtU1g1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6UHJvY2Vzc1R5cGVzIiByZWZlcmVuY2VzPSJfdEVLOVB5WDVFZDJLbkoyeWpOWGhXUSBfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSBfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSBfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSBfdE9KX2t5WDVFZDJLbkoyeWpOWGhXUSBfdE9KX2xpWDVFZDJLbkoyeWpOWGhXUSBfdE9KX2tDWDVFZDJLbkoyeWpOWGhXUSBfdE9KX25DWDVFZDJLbkoyeWpOWGhXUSBfdE9KX21TWDVFZDJLbkoyeWpOWGhXUSBfdE9KX29pWDVFZDJLbkoyeWpOWGhXUSBfdE9KX255WDVFZDJLbkoyeWpOWGhXUSBfdE9KX3BTWDVFZDJLbkoyeWpOWGhXUSBfdE9KX3FpWDVFZDJLbkoyeWpOWGhXUSBfdE9KX3JpWDVFZDJLbkoyeWpOWGhXUSBfdE9KX3NTWDVFZDJLbkoyeWpOWGhXUSBfdE9KX3RDWDVFZDJLbkoyeWpOWGhXUSBfdE9USmdpWDVFZDJLbkoyeWpOWGhXUSBfdE9USmdDWDVFZDJLbkoyeWpOWGhXUSBfdE9USmh5WDVFZDJLbkoyeWpOWGhXUSBfdE9USmhTWDVFZDJLbkoyeWpOWGhXUSBfdE9USmpDWDVFZDJLbkoyeWpOWGhXUSBfdE9USmlpWDVFZDJLbkoyeWpOWGhXUSBfdE9USmp5WDVFZDJLbkoyeWpOWGhXUSBfdE9USmpTWDVFZDJLbkoyeWpOWGhXUSBfdE9USmxDWDVFZDJLbkoyeWpOWGhXUSBfdE9USmtpWDVFZDJLbkoyeWpOWGhXUSBfdE9USm1TWDVFZDJLbkoyeWpOWGhXUSBfdE9USmx5WDVFZDJLbkoyeWpOWGhXUSBfdE9USm5DWDVFZDJLbkoyeWpOWGhXUSBfdE9USm9DWDVFZDJLbkoyeWpOWGhXUSBfdE9USm5pWDVFZDJLbkoyeWpOWGhXUSBfdE9USnBDWDVFZDJLbkoyeWpOWGhXUSBfdE9USm95WDVFZDJLbkoyeWpOWGhXUSBfdE9USnFTWDVFZDJLbkoyeWpOWGhXUSBfdE9USnB5WDVFZDJLbkoyeWpOWGhXUSBfdE9USnJpWDVFZDJLbkoyeWpOWGhXUSBfdE9USnJDWDVFZDJLbkoyeWpOWGhXUSBfdE9USnN5WDVFZDJLbkoyeWpOWGhXUSBfdE9USnNTWDVFZDJLbkoyeWpOWGhXUSBfdE9USnVDWDVFZDJLbkoyeWpOWGhXUSBfdE9USnRpWDVFZDJLbkoyeWpOWGhXUSBfdE9USnZTWDVFZDJLbkoyeWpOWGhXUSBfdE9USnV5WDVFZDJLbkoyeWpOWGhXUSBfdE9USndpWDVFZDJLbkoyeWpOWGhXUSBfdE9USndDWDVFZDJLbkoyeWpOWGhXUSBfdE9USnhTWDVFZDJLbkoyeWpOWGhXUSBfdE9USnlDWDVFZDJLbkoyeWpOWGhXUSBfdE9USnl5WDVFZDJLbkoyeWpOWGhXUSBfdE9USnppWDVFZDJLbkoyeWpOWGhXUSBfdE9USjBTWDVFZDJLbkoyeWpOWGhXUSBfdE9USjFDWDVFZDJLbkoyeWpOWGhXUSBfdE9USjF5WDVFZDJLbkoyeWpOWGhXUSBfdE9USjJpWDVFZDJLbkoyeWpOWGhXUSBfdE9USjNTWDVFZDJLbkoyeWpOWGhXUSBfdE9USjRDWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmdTWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmdDWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmhTWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmhDWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmlTWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmlDWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmpTWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGxHZjhDWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpDYXRlZ29yaWVzIiByZWZlcmVuY2VzPSJfdEdaeHhDWDVFZDJLbkoyeWpOWGhXUSBfdEdaeHh5WDVFZDJLbkoyeWpOWGhXUSBfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSBfdEdaeHpTWDVFZDJLbkoyeWpOWGhXUSBfdEdaeHlpWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDB5WDVFZDJLbkoyeWpOWGhXUSBfdEdaeDFpWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDBDWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDNDWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDJTWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSBfdEdaeDVTWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDRpWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDZ5WDVFZDJLbkoyeWpOWGhXUSBfdEdaeDZDWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDhTWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDdpWDVFZDJLbkoyeWpOWGhXUSBfdEdqaXd5WDVFZDJLbkoyeWpOWGhXUSBfdEdqaXhpWDVFZDJLbkoyeWpOWGhXUSBfdEdqaXdDWDVFZDJLbkoyeWpOWGhXUSBfdEdqaXl5WDVFZDJLbkoyeWpOWGhXUSBfdEdqaXlTWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTBDWDVFZDJLbkoyeWpOWGhXUSBfdEdqaXppWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTFTWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTB5WDVFZDJLbkoyeWpOWGhXUSBfdEdqaTJDWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTFpWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTNTWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTJ5WDVFZDJLbkoyeWpOWGhXUSBfdEdqaTRpWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTRDWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTV5WDVFZDJLbkoyeWpOWGhXUSBfdEdqaTVTWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTdDWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTZpWDVFZDJLbkoyeWpOWGhXUSBfdEdqaThTWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTd5WDVFZDJLbkoyeWpOWGhXUSBfdEdqaTlpWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTlDWDVFZDJLbkoyeWpOWGhXUSBfdEdqaS1pWDVFZDJLbkoyeWpOWGhXUSBfdEdqaS1TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGxHZjhTWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpNZXRob2RQYWNrYWdlIiByZWZlcmVuY2VzPSJfdEhjNnBTWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnFDWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnF5WDVFZDJLbkoyeWpOWGhXUSBfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnNTWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnJpWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnRpWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnRDWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnV5WDVFZDJLbkoyeWpOWGhXUSBfdEhjNnVTWDVFZDJLbkoyeWpOWGhXUSBfdEhjNndDWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGxHZjhpWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpCcmVha2Rvd24iIHJlZmVyZW5jZXM9Il90S2xISkNYNUVkMktuSjJ5ak5YaFdRIF90S2xISUNYNUVkMktuSjJ5ak5YaFdRIF90S2xIS2lYNUVkMktuSjJ5ak5YaFdRIF90S2xISnlYNUVkMktuSjJ5ak5YaFdRIF90S2xITFNYNUVkMktuSjJ5ak5YaFdRIF90S2xITUNYNUVkMktuSjJ5ak5YaFdRIF90S2xITmlYNUVkMktuSjJ5ak5YaFdRIF90S2xIT1NYNUVkMktuSjJ5ak5YaFdRIF90S2xIUENYNUVkMktuSjJ5ak5YaFdRIF90S2xITXlYNUVkMktuSjJ5ak5YaFdRIF90S2xIUHlYNUVkMktuSjJ5ak5YaFdRIF90S2xIVENYNUVkMktuSjJ5ak5YaFdRIF90S2xIVHlYNUVkMktuSjJ5ak5YaFdRIF90S2xIU1NYNUVkMktuSjJ5ak5YaFdRIF90S2xIVlNYNUVkMktuSjJ5ak5YaFdRIF90S2xIVnlYNUVkMktuSjJ5ak5YaFdRIF90S2xIV1NYNUVkMktuSjJ5ak5YaFdRIF90S2xIVWlYNUVkMktuSjJ5ak5YaFdRIF90S2xIWHlYNUVkMktuSjJ5ak5YaFdRIF90S2xIWkNYNUVkMktuSjJ5ak5YaFdRIF90S2xIWnlYNUVkMktuSjJ5ak5YaFdRIF90S2xIYWlYNUVkMktuSjJ5ak5YaFdRIF90S2xIYlNYNUVkMktuSjJ5ak5YaFdRIF90S2xIY0NYNUVkMktuSjJ5ak5YaFdRIF90S2xIY3lYNUVkMktuSjJ5ak5YaFdRIF90S2xIZGlYNUVkMktuSjJ5ak5YaFdRIF90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIF90S2xIZkNYNUVkMktuSjJ5ak5YaFdRIF90S2xIZVNYNUVkMktuSjJ5ak5YaFdRIF90S2xIZ1NYNUVkMktuSjJ5ak5YaFdRIF90S2xIaENYNUVkMktuSjJ5ak5YaFdRIF90S2xIaHlYNUVkMktuSjJ5ak5YaFdRIF90S2xIZmlYNUVkMktuSjJ5ak5YaFdRIF90S2xIamlYNUVkMktuSjJ5ak5YaFdRIF90S2xIa1NYNUVkMktuSjJ5ak5YaFdRIF90S2xIbENYNUVkMktuSjJ5ak5YaFdRIF90S2xIbHlYNUVkMktuSjJ5ak5YaFdRIF90S2xIbWlYNUVkMktuSjJ5ak5YaFdRIF90S2xIblNYNUVkMktuSjJ5ak5YaFdRIF90S2xIb0NYNUVkMktuSjJ5ak5YaFdRIF90S2xIb3lYNUVkMktuSjJ5ak5YaFdRIF90S2xIcGlYNUVkMktuSjJ5ak5YaFdRIF90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIF90S2xIckNYNUVkMktuSjJ5ak5YaFdRIF90S2xIc1NYNUVkMktuSjJ5ak5YaFdRIF90S2xIdGlYNUVkMktuSjJ5ak5YaFdRIF90S2xIdVNYNUVkMktuSjJ5ak5YaFdRIF90S2xIdkNYNUVkMktuSjJ5ak5YaFdRIF90S2xIdnlYNUVkMktuSjJ5ak5YaFdRIF90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIF90S3VSRXlYNUVkMktuSjJ5ak5YaFdRIF90S3VSRUNYNUVkMktuSjJ5ak5YaFdRIF90S3VSR1NYNUVkMktuSjJ5ak5YaFdRIF90S3VSSENYNUVkMktuSjJ5ak5YaFdRIF90S3VSSHlYNUVkMktuSjJ5ak5YaFdRIF90S3VSSWlYNUVkMktuSjJ5ak5YaFdRIF90S3VSRmlYNUVkMktuSjJ5ak5YaFdRIF90S3VSSlNYNUVkMktuSjJ5ak5YaFdRIF90S3VSS2lYNUVkMktuSjJ5ak5YaFdRIF90S3VSS0NYNUVkMktuSjJ5ak5YaFdRIF90S3VSTFNYNUVkMktuSjJ5ak5YaFdRIF90S3VSTVNYNUVkMktuSjJ5ak5YaFdRIF90S3VSTHlYNUVkMktuSjJ5ak5YaFdRIF90S3VSTmlYNUVkMktuSjJ5ak5YaFdRIF90S3VSTkNYNUVkMktuSjJ5ak5YaFdRIF90S3VST3lYNUVkMktuSjJ5ak5YaFdRIF90S3VST1NYNUVkMktuSjJ5ak5YaFdRIF90S3VSUUNYNUVkMktuSjJ5ak5YaFdRIF90S3VSUGlYNUVkMktuSjJ5ak5YaFdRIF90S3VSUlNYNUVkMktuSjJ5ak5YaFdRIF90S3VSUXlYNUVkMktuSjJ5ak5YaFdRIF90S3VSU2lYNUVkMktuSjJ5ak5YaFdRIF90S3VSU0NYNUVkMktuSjJ5ak5YaFdRIF90S3VSVHlYNUVkMktuSjJ5ak5YaFdRIF90S3VSVFNYNUVkMktuSjJ5ak5YaFdRIF90S3VSVWlYNUVkMktuSjJ5ak5YaFdRIF90S3VSVmlYNUVkMktuSjJ5ak5YaFdRIF90S3VSVkNYNUVkMktuSjJ5ak5YaFdRIF90S3VSV3lYNUVkMktuSjJ5ak5YaFdRIF90S3VSV1NYNUVkMktuSjJ5ak5YaFdRIF90S3VSWUNYNUVkMktuSjJ5ak5YaFdRIF90S3VSWGlYNUVkMktuSjJ5ak5YaFdRIF90S3VSWlNYNUVkMktuSjJ5ak5YaFdRIF90S3VSWXlYNUVkMktuSjJ5ak5YaFdRIF90TEJ6RWlYNUVkMktuSjJ5ak5YaFdRIF90TEJ6RUNYNUVkMktuSjJ5ak5YaFdRIF90TEJ6RnlYNUVkMktuSjJ5ak5YaFdRIF90TEJ6RlNYNUVkMktuSjJ5ak5YaFdRIF90TEJ6SENYNUVkMktuSjJ5ak5YaFdRIF90TEJ6R2lYNUVkMktuSjJ5ak5YaFdRIF90TEJ6SUNYNUVkMktuSjJ5ak5YaFdRIF90TEJ6SHlYNUVkMktuSjJ5ak5YaFdRIF90TEJ6SlNYNUVkMktuSjJ5ak5YaFdRIF90TEJ6SXlYNUVkMktuSjJ5ak5YaFdRIF90TEJ6S2lYNUVkMktuSjJ5ak5YaFdRIF90TEJ6S0NYNUVkMktuSjJ5ak5YaFdRIF90TEJ6THlYNUVkMktuSjJ5ak5YaFdRIF90TEJ6TFNYNUVkMktuSjJ5ak5YaFdRIF90TEs5QVNYNUVkMktuSjJ5ak5YaFdRIF90TEs5QUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90bEdmOHlYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZExpYnJhcnk6OkxpYnJhcnlDb25maWd1cmF0aW9ucyIgcmVmZXJlbmNlcz0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EgX3RoaG5oQ1g1RWQyS25KMnlqTlhoV1EgX3RoaG5oeVg1RWQyS25KMnlqTlhoV1EgX3RoaG5paVg1RWQyS25KMnlqTlhoV1EgX3RoaG5qU1g1RWQyS25KMnlqTlhoV1EgX3RoaG5rQ1g1RWQyS25KMnlqTlhoV1EgX3RoaG5reVg1RWQyS25KMnlqTlhoV1EgX3RoaG5saVg1RWQyS25KMnlqTlhoV1EgX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EgX3RoaG5uQ1g1RWQyS25KMnlqTlhoV1EgX3RoaG5tU1g1RWQyS25KMnlqTlhoV1EgX3RoaG5vQ1g1RWQyS25KMnlqTlhoV1EgX3RoaG5veVg1RWQyS25KMnlqTlhoV1EgX3RoclloQ1g1RWQyS25KMnlqTlhoV1EgX3RoclloeVg1RWQyS25KMnlqTlhoV1EgX3RocllnQ1g1RWQyS25KMnlqTlhoV1EgX3RocllqQ1g1RWQyS25KMnlqTlhoV1EgX3RocllpaVg1RWQyS25KMnlqTlhoV1EgX3RocllrU1g1RWQyS25KMnlqTlhoV1EgX3RocllqeVg1RWQyS25KMnlqTlhoV1EgX3RocllsaVg1RWQyS25KMnlqTlhoV1EgX3RocllsQ1g1RWQyS25KMnlqTlhoV1EgX3RocllteVg1RWQyS25KMnlqTlhoV1EgX3RoclltU1g1RWQyS25KMnlqTlhoV1EgX3RoclluaVg1RWQyS25KMnlqTlhoV1EgX3RoclluQ1g1RWQyS25KMnlqTlhoV1EgX3RocllvU1g1RWQyS25KMnlqTlhoV1EgX3RocllueVg1RWQyS25KMnlqTlhoV1EgX3RocllwaVg1RWQyS25KMnlqTlhoV1EgX3RocllwQ1g1RWQyS25KMnlqTlhoV1EgX3RocllxaVg1RWQyS25KMnlqTlhoV1EgX3RocllxU1g1RWQyS25KMnlqTlhoV1EgX3RocllyaVg1RWQyS25KMnlqTlhoV1EgX3RocllyU1g1RWQyS25KMnlqTlhoV1EgX3RocllzeVg1RWQyS25KMnlqTlhoV1EgX3RocllzU1g1RWQyS25KMnlqTlhoV1EgX3Rocll0eVg1RWQyS25KMnlqTlhoV1EgX3Rocll0aVg1RWQyS25KMnlqTlhoV1EgX3Rocll1eVg1RWQyS25KMnlqTlhoV1EgX3Rocll1aVg1RWQyS25KMnlqTlhoV1EgX3Rocll2aVg1RWQyS25KMnlqTlhoV1EgX3Rocll2Q1g1RWQyS25KMnlqTlhoV1EgX3Rocll3aVg1RWQyS25KMnlqTlhoV1EgX3Rocll3U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RsR2Y5Q1g1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6UHJvY2Vzc0Rlc2NyaXB0aW9ucyIgcmVmZXJlbmNlcz0iX3RRcnZJaVg1RWQyS25KMnlqTlhoV1EgX3RRcnZJQ1g1RWQyS25KMnlqTlhoV1EgX3RRcnZLU1g1RWQyS25KMnlqTlhoV1EgX3RRcnZMaVg1RWQyS25KMnlqTlhoV1EgX3RRcnZNeVg1RWQyS25KMnlqTlhoV1EgX3RRcnZKeVg1RWQyS25KMnlqTlhoV1EgX3RRMWdJaVg1RWQyS25KMnlqTlhoV1EgX3RRMWdKeVg1RWQyS25KMnlqTlhoV1EgX3RRMWdMQ1g1RWQyS25KMnlqTlhoV1EgX3RRMWdNU1g1RWQyS25KMnlqTlhoV1EgX3RRMWdOaVg1RWQyS25KMnlqTlhoV1EgX3RRMWdPeVg1RWQyS25KMnlqTlhoV1EgX3RRMWdJQ1g1RWQyS25KMnlqTlhoV1EgX3RRMWdRaVg1RWQyS25KMnlqTlhoV1EgX3RRMWdSeVg1RWQyS25KMnlqTlhoV1EgX3RRMWdRQ1g1RWQyS25KMnlqTlhoV1EgX3RRMWdUaVg1RWQyS25KMnlqTlhoV1EgX3RRMWdUQ1g1RWQyS25KMnlqTlhoV1EgX3RRMWdWU1g1RWQyS25KMnlqTlhoV1EgX3RRMWdVeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RsR2Y5U1g1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6UHJvY2Vzc1BhY2thZ2UiIHJlZmVyZW5jZXM9Il90VFgyeFNYNUVkMktuSjJ5ak5YaFdRIF90VFgyeUNYNUVkMktuSjJ5ak5YaFdRIF90VFgyd0NYNUVkMktuSjJ5ak5YaFdRIF90VFgyemlYNUVkMktuSjJ5ak5YaFdRIF90VFgyeXlYNUVkMktuSjJ5ak5YaFdRIF90VFgyMUNYNUVkMktuSjJ5ak5YaFdRIF90VFgyMXlYNUVkMktuSjJ5ak5YaFdRIF90VFgyMFNYNUVkMktuSjJ5ak5YaFdRIF90VFgyM1NYNUVkMktuSjJ5ak5YaFdRIF90VFgyMmlYNUVkMktuSjJ5ak5YaFdRIF90VFgyNGlYNUVkMktuSjJ5ak5YaFdRIF90VFgyNENYNUVkMktuSjJ5ak5YaFdRIF90VFgyNXlYNUVkMktuSjJ5ak5YaFdRIF90VFgyNVNYNUVkMktuSjJ5ak5YaFdRIF90VFgyN0NYNUVkMktuSjJ5ak5YaFdRIF90VFgyNmlYNUVkMktuSjJ5ak5YaFdRIF90VFgyOFNYNUVkMktuSjJ5ak5YaFdRIF90VFgyN3lYNUVkMktuSjJ5ak5YaFdRIF90VFgyOWlYNUVkMktuSjJ5ak5YaFdRIF90VFgyOUNYNUVkMktuSjJ5ak5YaFdRIF90VFgyLXlYNUVkMktuSjJ5ak5YaFdRIF90VFgyLVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90bEdmOWlYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByb2Nlc3NEaWFncmFtc19kZXByZWNhdGVkOjpVTUFEaWFncmFtcyIgcmVmZXJlbmNlcz0iX3RUWDIyaVg1RWQyS25KMnlqTlhoV1EgX3RjQTFZQ1g1RWQyS25KMnlqTlhoV1EgX3RjQTFaU1g1RWQyS25KMnlqTlhoV1EgX3RjQTFZeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RsR2Y5eVg1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VU1MMkRpYWdyYW1JbnRlcmNoYW5nZV9kZXByZWNhdGVkIiByZWZlcmVuY2VzPSJfdFl1MzRTWDVFZDJLbkoyeWpOWGhXUSBfdFl1MzRpWDVFZDJLbkoyeWpOWGhXUSBfdFl1MzRDWDVFZDJLbkoyeWpOWGhXUSBfdFl1MzVTWDVFZDJLbkoyeWpOWGhXUSBfdFl1MzVpWDVFZDJLbkoyeWpOWGhXUSBfdFl1MzZTWDVFZDJLbkoyeWpOWGhXUSBfdFl1MzdDWDVFZDJLbkoyeWpOWGhXUSBfdFl1Mzd5WDVFZDJLbkoyeWpOWGhXUSBfdFl1MzR5WDVFZDJLbkoyeWpOWGhXUSBfdFl1Mzh5WDVFZDJLbkoyeWpOWGhXUSBfdFl1MzlDWDVFZDJLbkoyeWpOWGhXUSBfdFl1MzhpWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzRpWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzVDWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzV5WDVFZDJLbkoyeWpOWGhXUSBfdFk0bzZpWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzRDWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzd5WDVFZDJLbkoyeWpOWGhXUSBfdFk0bzhTWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzdTWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzlpWDVFZDJLbkoyeWpOWGhXUSBfdFk0by1pWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzlDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEFDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEF5WDVFZDJLbkoyeWpOWGhXUSBfdFk0b19pWDVFZDJLbkoyeWpOWGhXUSBfdFk0cENDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEN5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cEJpWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEVDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEVTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEVpWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEZTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cERpWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEdpWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEdDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEhTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cElDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cElTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEpDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEd5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cEtTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cExTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cE1DWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEp5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cE5TWDVFZDJLbkoyeWpOWGhXUSBfdFk0cE15WDVFZDJLbkoyeWpOWGhXUSBfdFk0cE95WDVFZDJLbkoyeWpOWGhXUSBfdFk0cE9TWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFFDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFBpWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFF5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cFJ5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cFJTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFRTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFVDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFN5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cFZDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFdDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFdpWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFZpWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFh5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cFlDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFlTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFlpWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFl5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cFpDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cFhTWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTBDWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTBTWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTB5WDVFZDJLbkoyeWpOWGhXUSBfdFpCeTBpWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTFpWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTF5WDVFZDJLbkoyeWpOWGhXUSBfdFpCeTJDWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTJpWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTJTWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTNTWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTNpWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTN5WDVFZDJLbkoyeWpOWGhXUSBfdFpCeTRTWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTRDWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTVTWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTVDWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTZTWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90QlZzU2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDbGFzc2lmaWVyIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCVnNTeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QlZzU2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEJWc1RDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCZmNuQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEJWc1RTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNBYnN0cmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3RCVnNUaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEJmY2tDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QmZja1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEJmY2tDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RCZmNraVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik5hbWVkRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QmZja3lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEJmY2tpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90QmZjbENYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY2tDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90QmZjbFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJuYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RCZmNsaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90QmZjbHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEJmY21DWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90QmZjbVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEJmY21pWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCZmNtU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RCZmNteVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QmZja2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RCZmNuQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlR5cGUiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEJmY25TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCZmNuQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90QmZjbmlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY21TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90QmZjb0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQYWNrYWdlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCZmNvU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QmZjb0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEJmY29pWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCZmNwQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEJmY295WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCZmNtU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEJmY3BDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTmFtZXNwYWNlIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCZmNwU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QmZjcENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90QmZjcGlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY2tpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3RCZmNzQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRhdGUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEJmY3NTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCZmNzQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3RCZmNzaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlVyaSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QmZjc3lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEJmY3NpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5EYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iU3RyaW5nIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCZmN0U1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiBzb21lIHN1aXRhYmxlIGNoYXJhY3RlciBzZXQgdXNlZCB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2RlbC4gQ2hhcmFjdGVyIHNldHMgbWF5IGluY2x1ZGUgbm9uLVJvbWFuIGFscGhhYmV0cyBhbmQgY2hhcmFjdGVycy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfdEJmY3RpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iU2V0Ii8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il90Qm9tZ0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJTZXF1ZW5jZSIvPg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfdEJvbWdTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iSW50ZWdlciI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Qm9tZ2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEJvbWdTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BbiBpbnRlZ2VyIGlzIGEgcHJpbWl0aXZlIHR5cGUgcmVwcmVzZW50aW5nIGludGVnZXIgdmFsdWVzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJCb29sZWFuIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCb21oQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgQm9vbGVhbiB0eXBlIGlzIHVzZWQgZm9yIGxvZ2ljYWwgZXhwcmVzc2lvbiwgY29uc2lzdGluZyBvZiB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMgdHJ1ZSBhbmQgZmFsc2UuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRvdWJsZSIvPg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RDRlNnQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkNvbnN0cmFpbnQiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdENGU2dTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNnQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90Q0ZTZ2lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTZ3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJib2R5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdENGU2hDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNneVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTaFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU2hpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RDRlNoeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdENGU2p5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdENGU2tDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCZmNtU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdENGU2tTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdENGU2tpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RDRlNreVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Q0ZTbENYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RDRlNsU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RCOElreVg1RWQyS25KMnlqTlhoV1EgX3RDRlNseVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdENGU2xpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNsU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgRWxlbWVudCBjYW4gb3duIG1hbnkgQ29uc3RyYWludHMgZGVmaW5pbmcgcnVsZXMgZm9yIHRoaXMgZWxlbWVudC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RDRlNseVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdENGU2xTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90Q0ZTbUNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90QjhJcHlYNUVkMktuSjJ5ak5YaFdRIF90Q0ZTbWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RDRlNtU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Q0ZTbUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgQ29udGVudCBEZXNjcmlwdGlvbiBjYW4gb3B0aW9uYWxseSBiZSBzdHJ1Y3R1cmUgaW50byBTZWN0aW9ucy4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlIHRvIGRlY29tcG9zZWQgU2VjdGlvbiBpbnRvIGEgaGllcmFyY2h5IG9mIFNlY3Rpb25zLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdENGU21pWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2NvbnRlbnREZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SW55WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RDRlNtQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdENGU215WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RDRlNuQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90Q0ZTblNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90Q0ZTZlNYNUVkMktuSjJ5ak5YaFdRIF90Q0ZTbnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RDRlNuaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Q0ZTblNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlNlY3Rpb25zIGNhbiBiZSBmdXJ0aGVyIGRlY29tcG9zZWQgaW50byBuIGxldmVscyBvZiBzdWItc2VjdGlvbnMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90Q0ZTbnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RDRlNuU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdENGU29DWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RDRlNvU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdENGU29pWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdENGU3BDWDVFZDJLbkoyeWpOWGhXUSBfdENGU2pDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Q0ZTb3lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdENGU29pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIERlc2NyaWJhYmxlIEVsZW1lbnQgY2FuIGNvbnRhaW4gYSBDb250ZW50IERlc2NyaXB0aW9uIGVsZW1lbnQgdGhhdCBzdG9yZXMgdGV4dHVhbCBkZXNjcmlwdGlvbnMgZm9yIHRoaXMgQ29udGVudCBFbGVtZW50LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBpbnRlbmRlZCB0byBiZSByZWZpbmVkIHdpdGggc3ViLWNsYXNzZXMgYWRkaW5nIG1vcmUgZGVzY3JpcHRpb24gYXR0cmlidXRlcy4gIEFueSBvZiB0aGVzZSBzdWItdHlwZXMgY2FuIGJlIHJlbGF0ZWQgdG8gYSBDb250ZW50IEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90Q0ZTcENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfZGVzY3JpYmFibGVFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTaUNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdENGU29pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTcFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU3BpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90Q0ZTcHlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90QjhJbGlYNUVkMktuSjJ5ak5YaFdRIF90Q0ZTcUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdENGU3FDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90Q0ZTcHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RDRlNxU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IktpbmQiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90Q0ZTcWlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTcXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdENGU3NpWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90Q0ZTdFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RDRlNyQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Q0ZTclNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdENGU3JpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEI4SW1TWDVFZDJLbkoyeWpOWGhXUSBfdENGU3J5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RDRlNyeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdENGU3JpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTc0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU3NTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RDRlNzaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdENGU3N5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCVnNTaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdENGU3RDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNQcmltYXJ5RXh0ZW5zaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RDRlN0U1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RDRlNxeVg1RWQyS25KMnlqTlhoV1EgX3RDRlN0aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90Q0ZTdGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90Q0ZTcVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RDRlN0U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdENGU3R5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RDRlN1Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iR3VpZGFuY2UiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYmRDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90REliZFNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90REliZGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJBcnRpZmFjdCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90REliZHlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYmRpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLg0KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RESWJlQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RESWJlU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliZGlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJzeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYmVpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJleVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliZkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJkaVg1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdERJYnN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90REliZlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYmZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RESWJmeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlbGl2ZXJhYmxlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJnQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90REliZnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYmdTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYmdpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJ0U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYmd5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJoQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90REliaFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJPdXRjb21lIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJoaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90REliaFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RESWJoeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RESWJpQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlN0ZXAiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYmlTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJpQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuDQotQSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYmlpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RDRlNjQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYml5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJqQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdERJYmpDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iV29ya0RlZmluaXRpb24iIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYmpTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJqQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+V29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuDQotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYmppWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYmp5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJlY29uZGl0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTZ0NYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RESWJ3aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYmtDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJrU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RElia2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTZ0NYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RESWJ4U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYmt5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJsQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RElibFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEZWZhdWx0X1ByaW1hcnlQZXJmb3JtZXIiIG1lbWJlckVuZD0iX3RESWJYaVg1RWQyS25KMnlqTlhoV1EgX3RESWJseVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYmxpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJsU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+Um9sZXMgY2FuIGJlIGRlZmluZWQgdG8gcGVyZm9ybSBtYW55IFRhc2tzLCBidXQgZXZlcnkgVGFzayBtYXkgaGF2ZSBvbmx5IG9uZSBSb2xlIHRoYXQgaXMgYnkgZGVmYXVsdCB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgb2YgdGhpcyBUYXNrLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdERJYmx5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliV2lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJsU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYm1DWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJtU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RElibWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEZWZhdWx0X01hbmRhdG9yeUlucHV0cyIgbWVtYmVyRW5kPSJfdERJYm5DWDVFZDJLbkoyeWpOWGhXUSBfdERJYllTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElibXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYm1pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgbWFuZGF0b3J5IGlucHV0cyBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2suPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElibkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYm1pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90REliblNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYm5pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJueVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlZmF1bHRfT3V0cHV0cyIgbWVtYmVyRW5kPSJfdERJYm9TWDVFZDJLbkoyeWpOWGhXUSBfdERJYlpDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElib0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYm55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3V0cHV0cyBvZiB0aGlzIFRhc2suPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElib1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYm55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElib2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYm95WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJwQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlZmF1bHRfTW9kaWZpZXMiIG1lbWJlckVuZD0iX3RESWJwaVg1RWQyS25KMnlqTlhoV1EgX3RESWJWQ1g1RWQyS25KMnlqTlhoV1EiIGlzRGVyaXZlZD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElicFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYnBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmFjdCB0aGF0IFJvbGVzIHBlcmZvcm0gVGFza3MgdGhhdCBoYXZlIFdvcmsgUHJvZHVjdHMgb2YgdGhhdCBwYXJ0aWN1bGFyIHR5cGUgYXMgb3V0cHV0cy4gIC9tb2RpZmllcyBwcm92aWRlcyBhbGwgdGhlIHR5cGVzIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCB0aGUgUm9sZSBwcm9kdWNlcyBvciBtb2RpZmllcyB2aWEgb25lIG9mIHRoZSBUYXNrcyBkZWZpbmVkIHRvIGJlIHBlcmZvcm1lZCBieSB0aGUgUm9sZSwgZWl0aGVyIGFzIHByaW1hcnkgb3IgYWRkaXRpb25hbCBwZXJmb3JtZXIuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElicGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtb2RpZmllZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliVVNYNUVkMktuSjJ5ak5YaFdRIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfdERJYnBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElicHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYnFDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJxU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlZmF1bHRfUmVzcG9uc2libGUiIG1lbWJlckVuZD0iX3RESWJxeVg1RWQyS25KMnlqTlhoV1EgX3RESWJWeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYnFpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJxU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+UmVzcG9uc2liaWxpdHkgZm9yIGEgd29yayBwcm9kdWN0IGluZGljYXRlcyB0aGUgcm9sZSdzIG93bmVyc2hpcCBvZiBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgd29yayBwcm9kdWN0IHR5cGUuICBGb3IgZXhhbXBsZSwgdGhlIHJvbGUgcmVzcG9uc2libGUgZm9yIGEgd29yayBwcm9kdWN0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBhYm91dCBpdHMgcXVhbGl0eSBzdGF0ZS4gIEJlaW5nIHJlc3BvbnNpYmxlIGZvciB0aGUgd29yayBwcm9kdWN0IGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgcm9sZSBpcyB0aGUgb25seSBvbmUgbW9kaWZ5aW5nIGl0LCBidXQgbWFrZXMgdWx0aW1hdGUgZGVjaXNpb25zIGFib3V0IGFjY2VwdGluZyBvciByZWplY3RpbmcgdGhlc2UgbW9kaWZpY2F0aW9ucyB3aGVuIHJldmlld2luZyB0aGVzZSBtb2RpZmljYXRpb25zLiAgRXZlcnkgd29yayBwcm9kdWN0IGhhcyBub25lIG9yIG9uZSByb2xlIHJlc3BvbnNpYmxlIHJvbGUuIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdERJYnF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliVVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJxU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYnJDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJyU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RElicmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEZWZhdWx0X0FkZGl0aW9uYWxQZXJmb3JtZXIiIG1lbWJlckVuZD0iX3RESWJzQ1g1RWQyS25KMnlqTlhoV1EgX3RESWJaeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYnJ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJyaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGFkZGl0aW9uYWwgcm9sZXMgdGhhdCBieSBkZWZhdWx0IGNhbiBiZSBhc3NpZ25lZCB0byBoZWxwIGNvbXBsZXRpbmcgYSBUYXNrLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdERJYnNDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaGVscHNQZXJmb3JtaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliV2lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJyaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYnNTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJzaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RElic3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDb21wb3NpdGlvbiIgbWVtYmVyRW5kPSJfdERJYmVTWDVFZDJLbkoyeWpOWGhXUSBfdERJYmZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElidENYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYnN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BcnRpZmFjdCB0eXBlcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBwaHlzaWNhbGx5IGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGlzIGNvbXBvc2VkIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdERJYnRTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVmYXVsdERlbGl2ZXJlZFdQIiBtZW1iZXJFbmQ9Il90RElidHlYNUVkMktuSjJ5ak5YaFdRIF90REliZ2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJ0aVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RElidFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCBwYXJ0cyBvZiBhIGRlbGl2ZXJhYmxlLCBpLmUuIHRoZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzIGEgRGVsaXZlcmFibGUgY29tcHJpc2VzIG9mLiAgVGhpcyBhZ2dyZWdhdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElidHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90REliZnlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdERJYnRTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElidUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYnVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJ1aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlZmF1bHRfT3B0aW9uYWxJbnB1dHMiIG1lbWJlckVuZD0iX3RESWJhaVg1RWQyS25KMnlqTlhoV1EgX3RESWJ2Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYnV5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJ1aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG9wdGlvbmFsIGlucHV0cyBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2suPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElidkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJvcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYnVpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElidlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYnZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJ2eVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RESWJiU1g1RWQyS25KMnlqTlhoV1EgX3RESWJ3U1g1RWQyS25KMnlqTlhoV1EiIGlzRGVyaXZlZD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElid0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYnZ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gaXMgYSBzaG9ydGN1dCBmb3IgbmF2aWdhdGlvbiBhbG9uZyB0aGUgYXNzb2NpYXRpb24gcHJvcGVydGllcyBDb250ZW50RWxlbWVudC5wcmVzZW50YXRpb24uc2VjdGlvbnMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElid1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RESWJ2eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdERJYndpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdERJYmp5WDVFZDJLbkoyeWpOWGhXUSBfdERJYnhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElid3lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYndpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIGFkZHMgYW4gb3B0aW9uYWwgcHJlLWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcHJlLWNvbmRpdGlvbiBkZWZpbmVzIGFueSBraW5kIG9mIGNvbnN0cmFpbnQgdGhhdCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSB3b3JrIGRlc2NyaWJlZCBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBjYW4gc3RhcnQuIEZvciBleGFtcGxlLCBhIHByZS1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhbiBpbnB1dCBXb3JrIFByb2R1Y3QgbmVlZHMgdG8gYmUgaW4gYSBzcGVjaWZpYyBzdGF0ZSBvciB0aGF0IG90aGVyIHJlbGF0ZWQgd29yayBtdXN0IGJlIGluIGEgY2VydGFpbiBzdGF0ZSAoZS5nLiAnSW5wdXQgZG9jdW1lbnQgWCBoYXMgYmVlbiByZXZpZXdlZCBhbmQgc2lnbmVkIGJ5IGN1c3RvbWVyIEFORCBUYXNrICZxdW90O01hbmFnZW1lbnQgUmV2aWV3JnF1b3Q7IGlzIGNvbXBsZXRlJykgYmVmb3JlIHRoZSBUYXNrIGNhbiBiZWdpbi4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RESWJ4Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmpDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RESWJ3aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdERJYnhTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdERJYmtpWDVFZDJLbkoyeWpOWGhXUSBfdERJYnh5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElieGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYnhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIGFkZHMgYW4gb3B0aW9uYWwgcG9zdC1jb25kaXRpb24gdG8gYSBXb3JrIERlZmluaXRpb24uICBBIHBvc3QtY29uZGl0aW9uIGRlZmluZXMgYW55IGtpbmQgb2YgY29uc3RyYWludCB0aGF0IG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIHdvcmsgZGVzY3JpYmVkIGZvciB0aGUgV29yayBEZWZpbml0aW9uIGNhbiBiZSBkZWNsYXJlZCBjb21wbGV0ZWQgb3IgZmluaXNoZWQgYW5kIHdoaWNoIG90aGVyIFdvcmsgRGVmaW5pdGlvbnMgbWlnaHQgZGVwZW5kIHVwb24gKGUuZy4gZm9yIHRoZWlyIHByZS1jb25kaXRpb25zKS4gIEZvciBleGFtcGxlLCBhIHBvc3QtY29uZGl0aW9uIGZvciBhIFRhc2sgY291bGQgZGVmaW5lIHRoYXQgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCB0byBiZSB0aGUgb3V0cHV0IG11c3QgYmUgaW4gYSBzcGVjaWZpYyBzdGF0ZSBiZWZvcmUgdGhlIFRhc2sgY2FuIGVuZCAoZS5nLiAnVXNlIENhc2UgbXVzdCBiZSBpbiBzdGF0ZSBmdWxseSBkZXNjcmliZWQgYW5kIHJldmlld2VkIGJ5IFN5c3RlbSBBbmFseXN0JykuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElieHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfd29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJqQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RElieFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RFSzlJU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkNvbmNlcHQiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOUlpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlJU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RFSzlJeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RFSzlKQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkNoZWNrbGlzdCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5SlNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVLOUpDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RFSzlKaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RFSzlKeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkV4YW1wbGUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOUtDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlKeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RFSzlLU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RFSzlLaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ikd1aWRlbGluZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5S3lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVLOUtpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOUxDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOUxTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUmVwb3J0Ij4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFSzlMaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RUs5TFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RFSzlMeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RFSzlNQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlRlbXBsYXRlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFSzlNU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RUs5TUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90RUs5TWlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90RUs5TXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOU5DWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlNeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+U3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RFSzlOU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RFSzlOaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlRvb2xNZW50b3IiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOU55WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlOaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90RUs5T0NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90RUs5T1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXaGl0ZXBhcGVyIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFSzlPaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RUs5T1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PldoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOU95WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RFSzlJU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOVBDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVGVybURlZmluaXRpb24iPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOVBTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlQQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOVBpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVGFzayI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90REliV3lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4NCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiANCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiANCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOVZTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBUYXNrIChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdGlvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RESWJYQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RESWJYU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliakNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RESWJYaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliVVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJsU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYlh5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJZQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliWVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RElibWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJZaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90REliWXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYlpDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ib3V0cHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJueVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYlpTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJaaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliWnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYlVTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RElicmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJhQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90REliYVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYmFpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RElidWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJheVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90REliYkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYmJTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJpQ1g1RWQyS25KMnlqTlhoV1EiIGlzRGVyaXZlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90RElidnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJiaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90REliYnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVZpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlOaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdVZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RUs5VnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVLOVdDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RFSzlXU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVVdUx5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1YXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlXaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5V3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVVdUxDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUmV1c2FibGVBc3NldCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1TFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdUxDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcNCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVVdUxpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVVdUx5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVNQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1THlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVVdU1TWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdU1pWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVVdU5DWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1TXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdU1pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiBiZSByZWxhdGVkIHRvIGFueSBudW1iZXIgb2YgU3VwcG9ydGluZyBNYXRlcmlhbCBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RFVXVOQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1TWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVOU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1TmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdU55WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVVdU9TWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1T0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdU55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiByZWZlciB0byBhbnkgbnVtYmVyIG9mIENvbmNlcHQgZ3VpZGFuY2UuIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdU9TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVOeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdU9pWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVPeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1UENYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1UGlYNUVkMktuSjJ5ak5YaFdRIF90RUs5WXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVQU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1UENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlByb3ZpZGVzIGNoZWNrIHBvaW50cyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBjb250ZW50IGVsZW1lbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHdvcmsgcHJvZHVjdHMuDQotDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1UGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1UENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVQeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1UUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdVFTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVVdVF5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdUlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1UWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdVFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBkZXRhaWxlZCBHdWlkZWxpbmVzIHJlbGF0ZWQgdG8gdGhpcyBDb250ZW50IEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1UXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1UVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVSQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1UlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdVJpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVVdVNDWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1UnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdVJpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFJlcG9ydCBleHRyYWN0cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBXb3JrIFByb2R1Y3Q7IG5vcm1hbGx5IGRpcmVjdGx5IGZyb20gYSB0b29sIHRoYXQgbWFpbnRhaW5zIHRoZSBXb3JrIFByb2R1Y3RzLiBGb3IgZXhhbXBsZSwgYSBSZXBvcnQgY2FuIHByZXNlbnQgZGV0YWlscyBvZiBhbiBBcnRpZmFjdCBvciBhIHNldCBvZiBBcnRpZmFjdHMgZm9yIHVzZSBpbiBhIHRlY2huaWNhbCByZXZpZXcuIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdVNDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdVJpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1U1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdVNpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVTeVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFVXVUU1g1RWQyS25KMnlqTlhoV1EgX3RFVXVJeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVVdVRDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFVXVTeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBzYW1wbGUgb2Ygd2hhdCB0aGUgd29yayBwcm9kdWN0IG1heSBsb29rIGxpa2UsIGFuIGFjdHVhbCBpbnN0YW5jZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RFVXVUU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVTeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdVRpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVUeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1VUNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1VWlYNUVkMktuSjJ5ak5YaFdRIF90RUs5VENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVVU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1VUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlByb3ZpZGVzIGRldGFpbGVkIGd1aWRhbmNlIG9uIGhvdyB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QgaW5kZXBlbmRlbnQgb2YgYSBzcGVjaWZpYyBzZXQgb2YgdGFza3Mgb3IgV0JTLiAgTWF5IGNvbnRhaW4gc3BlY2lmaWMgYWxnb3JpdGhtcyBvciBhbHRlcm5hdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaGVzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdVVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdVVDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1VXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdVZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVWU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFVXVWeVg1RWQyS25KMnlqTlhoV1EgX3RFSzlWaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVVdVZpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFVXVWU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+TGlua3MgVGFza3Mgd2l0aCBUb29sIE1lbnRvcnMgd2hpY2ggYXJlIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3cgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gcGVyZm9ybSB0aGUgVGFzay48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RFVXVWeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliV2lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdVZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1V0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdVdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVXaVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFSzlRaVg1RWQyS25KMnlqTlhoV1EgX3RFVXVYQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVVdVd5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFVXVXaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcmFjdGljZSBjYW4gYmUgY29tcG9zZWQgb2Ygb3RoZXIgUHJhY3RpY2VzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdVhDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5UHlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdVdpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1WFNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RUs5UlNYNUVkMktuSjJ5ak5YaFdRIF90RVV1WHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVYaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1WFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUHJhY3RpY2UgY2FuIHJlZmVyZW5jZSBhbnkgQ29udGVudCBFbGVtZW50LiAgVGhlIGFzc29jaWF0aW9uIGV4cHJlc3NlcyB0aGF0IHRoaXMgQ29udGVudCBFbGVtZW50IGlzIHBhcnQgb2Ygb3IgYmVsb25ncyB0byB0aGlzIFByYWN0aWNlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdVh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5UHlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdVhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1WUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdVlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVZaVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFVXVKaVg1RWQyS25KMnlqTlhoV1EgX3RFVXVaQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVVdVl5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFVXVZaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSB3b3JrIHByb2R1Y3QgaXMgcmVsYXRlZCB0byBvbmUgb3IgbW9yZSBhc3NldHMgdG8gPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1WkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1WWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVaU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1WmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdVp5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVLOVR5WDVFZDJLbkoyeWpOWGhXUSBfdEVVdWFDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RFVXVhQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVaeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdWFTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVhaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1YXlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1YkNYNUVkMktuSjJ5ak5YaFdRIF90RUs5V1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdWJDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1YXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXViU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1YmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdWJ5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVVdWNDWDVFZDJLbkoyeWpOWGhXUSBfdEVLOVVpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RFVXVjQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVieVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdWNTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVjaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1Y3lYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1S1NYNUVkMktuSjJ5ak5YaFdRIF90RVV1ZENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdWRDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1Y3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVkU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1ZGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEZOZThDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RGTmU4U1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90Rk5mTFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmU4aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImJyaWVmT3V0bGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmU4eVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5lOGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmU5Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5lOVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZTlpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5lOXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5lLUNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZTl5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmUtU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5lLWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZS15WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5lX0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5lX1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZV9pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmVfeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZkFDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZkFTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZBaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mQXlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RGTmZCQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90Rk5mQlNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEZOZkxTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mQmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZkJ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZCaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZDQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mQ1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZkNpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mQ3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZEQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mQ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZkRTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZEaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mRHlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RGTmZFQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RGTmZFU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZFaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNraWxscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZFeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mRWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZkZDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZGU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mRmlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZGeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZkdDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZGeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mR1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZkdpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZHeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZkhDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3lub255bXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mSFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZkhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5Pkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZkhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZIeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mSUNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RGTmZJU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RGTmZJaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZJeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mSkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZkl5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZKU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mSmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZkp5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mS0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mS1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZktDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZLaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mS3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZkxDWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90Rk5mTFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEZOZkxpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZkx5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZNQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mTHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZNU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mTWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZk15WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mTkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZOU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mTkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZOaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mTnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZk9DWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mT1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZPaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mT1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mT3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZlBDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZQU1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEZOZlBpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RGTmZQeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZRQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImF0dGFjaG1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZlFTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZRQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mUWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZlF5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZSQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEZOZlJTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RGTmZSaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZSeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZlNDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZSeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZTU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mU2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZlN5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mVENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcm9ibGVtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZlRTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZUQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mVGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZlR5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZVQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZlVTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYmFja2dyb3VuZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZVaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mVVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZlV5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZWQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mVlNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZWaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImdvYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZlZ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZWaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZXQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mV1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZldpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mV3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhcHBsaWNhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZYQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mV3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mWFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZlhpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZYeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZllDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZZU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mWUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZZaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mWXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZlpDWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90Q0ZTaUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdENGU2lTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNpQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+RGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuDQotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZaU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Q0ZTaUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZXh0ZW5kcyB0aGUgQ29udGVudCBFbGVtZW50IGRlZmluaXRpb24gdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCByZWZlcmVuY2VzIHRvIGljb25zIHRoYXQgYXJlIHVzZWQgZm9yIHByZXNlbnRpbmcgQ29udGVudCBFbGVtZW50cyBpbiBhIFVNQS1iYXNlZCBtb2RlbGluZyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdoZW4gcHVibGlzaGluZyBDb250ZW50IEVsZW1lbnRzIGludG8gZG9jdW1lbnRhdGlvbiBwcmVzZW50YXRpb24gKGUuZy4gZG9jdW1lbnQgb3IgaHRtbCBwYWdlcykuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90Q0ZTaWlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJWc1NpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90Q0ZTaXlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTakNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdENGU29pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTalNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU2ppWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZaaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNoYXBlaWNvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3NpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZaeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mWmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZmFDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZhU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mYWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJub2RlaWNvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3NpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZheVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mYWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZiQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mYlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEdaeHlpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUm9sZVNldCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R1p4eXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdaeHlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEdaeHpDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdaeHpTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJVU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaXlTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R1p4emlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdaeHp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RHWngwQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRvbWFpbiI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R1p4MFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdaeDBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Eb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuDQotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RHWngwaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RHWngweVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IndvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppemlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHWngxQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R1p4MVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdaeDFpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3ViZG9tYWlucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDBDWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90R2ppMHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHWngxeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R1p4MkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEdaeDJTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHWngyaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R1p4MlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RHWngyeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RHWngzQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IndvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppMWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHWngzU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R1p4M2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHWng0Q1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90R1p4NFNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90R1p4NGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdaeDR5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHWng0aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEdaeDVDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdaeDVTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGlzY2lwbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWnh3U1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaTJ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R1p4NWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdaeDV5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RHWng2Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlRvb2wiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdaeDZTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHWng2Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90R1p4NmlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90R1p4NnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOU5pWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppNENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHWng3Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R1p4N1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEdaeDdpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHWng3eVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R1p4N2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RHWng4Q1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RHWng4U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4eWlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamk1U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdaeDhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHWng4eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90R2ppd0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDdXN0b21DYXRlZ29yeSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppd1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaXdDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0Lg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEdqaXdpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdqaXd5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdENGU2lDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppNmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHaml4Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R2ppeFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdqaXhpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppN3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHaml4eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R2ppeUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEdqaXlTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEdqaXl5WDVFZDJLbkoyeWpOWGhXUSBfdEdaeHpTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppeWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaXlTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IGNhdGVnb3JpemVzIG1hbnkgUm9sZXMgYW5kIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gbWF5IFJvbGUgU2V0cy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RHaml5eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4eWlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHaml5U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaXpDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHaml6U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90R2ppemlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIG1lbWJlckVuZD0iX3RHamkwQ1g1RWQyS25KMnlqTlhoV1EgX3RHWngweVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdqaXp5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHaml6aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSBXb3JrIFByb2R1Y3RzLiBBIFdvcmsgUHJvZHVjdCBiZWxvbmdzIGF0IG1vc3QgdG8gb25lIERvbWFpbi48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RHamkwQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImRvbWFpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDBDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppemlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHamkwU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R2ppMGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEdqaTB5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEdqaTFTWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDFpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppMUNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaTB5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Eb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBTdWJkb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyBvbmx5IHRvIGJlIGNhdGVnb3JpemVkIGF0IHRoZSBsZWFmLWxldmVsLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEdqaTFTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2RvbWFpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDBDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RHamkweVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEdqaTFpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiBtZW1iZXJFbmQ9Il90R2ppMkNYNUVkMktuSjJ5ak5YaFdRIF90R1p4M0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHamkxeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R2ppMWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSB6ZXJvIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEdqaTJDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0id29ya1Byb2R1Y3RUeXBlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDJTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppMWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHamkyU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R2ppMmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEdqaTJ5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEdqaTNTWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppM0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaTJ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIEdyb3VwaW5ncyBncm91cCBtYW55IERpc2NpcGxpbmVzLiAgQSBEaXNjaXBsaW5lIGNhbiBiZSBpbiBtYW55IERpc2NpcGxpbmUgR3JvdXBzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEdqaTNTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGlzY2lwbGluZUdyb3VwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDRpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppMnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHamkzaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R2ppM3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEdqaTRDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEdqaTRpWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDZ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppNFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaTRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGRlc2NyaWJlcyB3b3JrIHdpdGggZXhhY3RseSBvbmUgVG9vbC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RHamk0aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InRvb2wiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWng2Q1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaTRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R2ppNHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdqaTVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RHamk1U1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RHamk1eVg1RWQyS25KMnlqTlhoV1EgX3RHWng4U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdqaTVpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHamk1U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBHcm91cGluZyBjb250YWlucyBtYW55IFJvbGUgU2V0cy4gUm9sZSBTZXRzIGNhbiBiZSBpbiBtYW55IFJvbGUgU2V0IEdyb3VwaW5ncy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RHamk1eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJvbGVTZXRHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWng3aVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaTVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R2ppNkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdqaTZTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RHamk2aVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RHaml3eVg1RWQyS25KMnlqTlhoV1EgX3RHamk3Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdqaTZ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHamk2aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBncm91cHMgdG9nZXRoZXIgYW55IG51bWJlciBvZiBDb250ZW50RWxlbWVudHMgaW5jbHVkaW5nIG90aGVyIENvbnRlbnRDYXRlZ29yeS4gPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90R2ppN0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjdXN0b21DYXRlZ29yaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R2ppd0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamk2aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaTdTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHamk3aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90R2ppN3lYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90R2ppeGlYNUVkMktuSjJ5ak5YaFdRIF90R2ppOFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHamk4Q1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R2ppN3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgQ3VzdG9tQ2F0ZWdvcnkgY2FuIGhhdmUgYW55IG51bWJlciBvZiBDb250ZW50Q2F0ZWdvcmllcyBkZWZpbmVkIGFzIG5lc3RlZCBzdWJDYXRlZ29yaWVzLiAgVGhlcmVmb3JlLCBvbmUgY291bGQgbmVzdCBDdXN0b21DYXRlZ29yaWVzIGludG8gbi1sZXZlbCBoaWVyYXJjaGllcy4gPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90R2ppOFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfY3VzdG9tQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHaml3Q1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90R2ppN3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHamk4aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R2ppOHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RHamk5Q1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RHWnh4Q1g1RWQyS25KMnlqTlhoV1EgX3RHamk5aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdqaTlTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHamk5Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+RXZlcnkgVGFzayBzaG91bGQgYmUgcmVsYXRlZCB0byBleGFjdGx5IG9uZSBEaXNjaXBsaW5lLiAgRm9yIGxlZ2FjeSByZWFzb25zIHRoaXMgaXMgbm90IGVuZm9yY2VkIChlLmcuIEdTIE1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgRGlzY2lwbGluZXMsIHlldCkuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90R2ppOWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4d1NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamk5Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaTl5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHamktQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90R2ppLVNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90R1p4eHlYNUVkMktuSjJ5ak5YaFdRIF90R2ppLWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEdqaS1pWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWnh3U1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90R2ppLVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RIYzZvU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEhjNm9pWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RIYzZvU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEhjNm95WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCZmNvQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEhjNnBDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEhjNnBTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZ2xvYmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEhjNnBpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RIYzZwU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3RIYzZweVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90SGM2cUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90SGM2dVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RIYzZxU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90SGM2cWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEhjNnF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90SGM2dmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RIYzZyQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90SGM2clNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEhjNnJpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29udGVudFBhY2thZ2UiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEhjNnJ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RIYzZyaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RIYzZzQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90SGM2b1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RIYzZzU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90SGM2dENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RIYzZzaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90SGM2c3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEhjNnRDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEhjNnNTWDVFZDJLbkoyeWpOWGhXUSBfdEhjNnRpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90SGM2dFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEhjNnRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBjb250YWlucyBDb250ZW50IEVsZW1lbnRzLiAgQSBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgcGFja2FnZSBpbnN0YW5jZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RIYzZ0aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9jb250ZW50UGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEhjNnJpWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RIYzZ0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEhjNnR5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RIYzZ1Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEhjNnVTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEhjNnV5WDVFZDJLbkoyeWpOWGhXUSBfdEhjNnFDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90SGM2dWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEhjNnVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgdHdvIHBhY2thZ2VzIGl0IGNvbm5lY3RzLiAgVGhlIHBhY2thZ2UgYXQgdGhlIHVzaW5nUGFja2FnZSBlbmQgZGVwZW5kcyBvbiB0aGUgcGFja2FnZSBhdCB0aGUgcmV1c2VkUGFja2FnZSBlbmQuICBGb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBpbiB0aGUgZm9ybWVyIHBhY2thZ2UgaXMgdXNpbmcgYW4gZWxlbWVudCBpbiB0aGUgbGF0ZXIgaW4gYSByZWxhdGlvbnNoaXAgc3VjaCBhcyBhIFRhc2sgaXMgdXNpbmcgYSBXb3JrIFByb2R1Y3RzIGFzIGFuIGlucHV0LiAgUmVmbGV4aXZlIHJldXNlZFBhY2thZ2UgbGlua3MgKGkuZS4gYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBpdHNlbGYpIGFyZSBub3QgYWxsb3dlZC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RIYzZ1eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InVzaW5nUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RIYzZvU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEhjNnVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90SGM2dkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEhjNnZTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RIYzZ2aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlBhY2thZ2VOZXN0aW5nIiBtZW1iZXJFbmQ9Il90SGM2d0NYNUVkMktuSjJ5ak5YaFdRIF90SGM2cXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RIYzZ2eVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90SGM2dmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gYmUgbmVzdGVkLCBpLmUuIGEgcGFja2FnZSBjYW4gYmUgcGFydCBvZiBhbm90aGVyIHBhY2thZ2UuICBOZXN0ZWQgcGFja2FnZXMgZG8gbm90IG5lZWQgdG8gYmUgb2YgdGhlIHNhbWUgdHlwZSwgZS5nLiBhIENvbnRlbnQgUGFja2FnZSBjYW4gYmUgZGVmaW5lZCBpbnNpZGUgYSBQcm9jZXNzIFBhY2thZ2UgKGRlZmluZSBmb3IgdGhlIFByb2Nlc3MgcGFydCBvZiB0aGlzIG1vZGVsKS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RIYzZ3Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90SGM2b1NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEhjNnZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90SGM2d1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEhjNndpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhKeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik1pbGVzdG9uZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIS0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSEp5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xIS1NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEt1UkZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIS2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZXF1aXJlZFJlc3VsdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExLOUFDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIS3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSExDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhMU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ikl0ZXJhdGlvbiI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xITGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSExTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5JdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4NCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikNCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLbEhMeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S2xISUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhNQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlBoYXNlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhNU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xITUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuDQotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xITWlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S2xITXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJUZWFtUHJvZmlsZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xITkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSE15WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuDQotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLg0KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLbEhOU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhOaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InRlYW1Sb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSS0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhOeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIT0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSE9TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3VwZXJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xITXlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJMU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSE9pWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhPeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFBDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3ViVGVhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSE15WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSTFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhQU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIUGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfdEtsSFB5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iV29ya09yZGVyVHlwZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIUUNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFB5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfdEtsSFFTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZmluaXNoVG9TdGFydCI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhRaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIUVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgYW5kICZxdW90O1BhaW50IGZlbmNlLCZxdW90OyAmcXVvdDtQYWludCBmZW5jZSZxdW90OyBjYW4ndCBzdGFydCB1bnRpbCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgZmluaXNoZXMuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGVwZW5kZW5jeSBhbmQgdGhlIGRlZmF1bHQgZm9yIGEgbmV3IFdvcmsgT3JkZXIgaW5zdGFuY2UuDQotPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il90S2xIUXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJmaW5pc2hUb0ZpbmlzaCI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhSQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIUXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBhbmQgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsLCZxdW90OyAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwmcXVvdDsgY2FuJ3QgZmluaXNoIHVudGlsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgZmluaXNoZXMuDQotPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il90S2xIUlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdGFydFRvU3RhcnQiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIUmlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFJTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBhbmQgJnF1b3Q7TGV2ZWwgY29uY3JldGUsJnF1b3Q7ICZxdW90O0xldmVsIGNvbmNyZXRlJnF1b3Q7IGNhbid0IGJlZ2luIHVudGlsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBiZWdpbnMuDQotPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il90S2xIUnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdGFydFRvRmluaXNoIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFNDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhSeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBUaGlzIGRlcGVuZGVuY3kgdHlwZSBjYW4gYmUgdXNlZCBmb3IganVzdC1pbi10aW1lIHNjaGVkdWxpbmcgdXAgdG8gYSBtaWxlc3RvbmUgb3IgdGhlIHByb2plY3QgZmluaXNoIGRhdGUgdG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYSBCcmVha2Rvd24gRWxlbWVudCBmaW5pc2hpbmcgbGF0ZSBpZiBpdHMgZGVwZW5kZW50IEJyZWFrZG93biBFbGVtZW50cyBzbGlwLiBJZiBhIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGUgbWlsZXN0b25lIG9yIHByb2plY3QgZmluaXNoIGRhdGUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBleGFjdGx5IHdoZW4gYW5kIHlvdSBkb24ndCB3YW50IGEgbGF0ZSBmaW5pc2ggdG8gYWZmZWN0IHRoZSBqdXN0LWluLXRpbWUgQnJlYWtkb3duIEVsZW1lbnQsIHlvdSBjYW4gY3JlYXRlIGFuIFNGIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgQnJlYWtkb3duIEVsZW1lbnQgeW91IHdhbnQgc2NoZWR1bGVkIGp1c3QgaW4gdGltZSAodGhlIHByZWRlY2Vzc29yKSBhbmQgaXRzIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgKHRoZSBzdWNjZXNzb3IpLiBUaGVuIGlmIHlvdSB1cGRhdGUgcHJvZ3Jlc3Mgb24gdGhlIHN1Y2Nlc3NvciBCcmVha2Rvd24gRWxlbWVudCwgaXQgd29uJ3QgYWZmZWN0IHRoZSBzY2hlZHVsZWQgZGF0ZXMgb2YgdGhlIHByZWRlY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S2xIU1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrT3JkZXIiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFNpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhTU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+V29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgDQotKE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pDQotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLbEhTeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S3VSSlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhUQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImxpbmtUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIUHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFRTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhUQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90S2xIVGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+ZmluaXNoVG9TdGFydDwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhUeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLdVJGaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExCektDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIVUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSFVTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S2xIVWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQbGFubmluZ0RhdGEiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFV5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhVaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+UGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLg0KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4NCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKQ0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSFZDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLdVJKU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFZTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3RhcnREYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjc0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFZpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhWU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhWeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImZpbmlzaERhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmNzQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIV0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFZ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhXU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJhbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21nU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIV2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFdTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEtsSGVTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVzY3JpcHRvciIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIZWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSGVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLg0KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiANCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLbEhleVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhmQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdEtsSGZTWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUm9sZURlc2NyaXB0b3IiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSGZ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhmaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSGdDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhlU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGdTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYlVTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSUGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhnaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIZ3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGhDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibW9kaWZpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il90S3VSV1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhoU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIaGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExCekdpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIaUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSGlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhpaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhpeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLg0KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLg0KLQ0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSGpDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhlU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSGpTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLdVJGaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGppWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSTkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhqeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIa0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGtTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhmaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1UlF5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIa2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSGt5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhsQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFzc2lzdGVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhmaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1UlNDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIbFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSGxpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhseVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImV4dGVybmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1UlRTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIbUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSG1TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhtaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJWQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSG15WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhuQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIblNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJvcHRpb25hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJYaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSG5pWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIb0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1Ull5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIb1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSG9pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhveVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIZmlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpGU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSHBDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhwU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIcGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RRMWdVeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSHB5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhxQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSHFpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xIcXlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEtsSGVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIckNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIclNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSHJDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICANCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uDQotPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIcmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSHJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RLbEhzQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSHNTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIc2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSHNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLg0KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhzeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIdENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEtsSHRTWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIdGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VST1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEh0eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIdUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSHVTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaW1wYWN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSVWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEh1aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIdXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSHZDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaW1wYWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSVWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEh2U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIdmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSHZ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEJ6RUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEh3Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xId1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEt1UkVDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29tcG9zaXRlUm9sZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSRVNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UkVDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLg0KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEt1UkVpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhmaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEt1UkV5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliVVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpIeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1UkZDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJGU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S3VSRmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSRnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UkZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLdVJHQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLdVJHU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImlzUmVwZWF0YWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJHaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSR1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdEt1Ukd5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLdVJIQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImlzT25nb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJIU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSSENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdEt1UkhpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLdVJIeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImlzRXZlbnREcml2ZW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSSUNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1Ukh5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4NCi0NCi0NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90S3VSSVNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEt1UklpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhTU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExCekxTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S3VSSXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEt1UkpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLdVJKU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJKaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSSlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLg0KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiANCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLdVJKeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90Q0ZTaUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RLdVJLQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RLdVJLaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhOaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UktTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJLQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhZ2dyZWdhdGlvbiBhc3NvY2lhdGlvbiBzcGVjaWZpZXMgdGhlIHJvbGVzIG9mIHRlYW0gbWVtYmVycyB3aXRoIFJvbGUgRGVzY3JpcHRvcnMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90S3VSS2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfdGVhbVByb2ZpbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhNeVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90S3VSS0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJLeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSTENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1UkxTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEtsSE9TWDVFZDJLbkoyeWpOWGhXUSBfdEtsSFBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSTGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UkxTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlbGF0ZXMgYSBTdWItVGVhbSB0byBpdHMgU3VwZXItVGVhbSwgaS5lLiB0aGUgVGVhbSB0aGF0IGl0IGlzIHBhcnQgb2YuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSTHlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90S2xIYlNYNUVkMktuSjJ5ak5YaFdRIF90S3VSTVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJNQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSTHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90S3VSTVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RLdVJMeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1Uk1pWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJNeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSTkNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90S3VSTmlYNUVkMktuSjJ5ak5YaFdRIF90S2xIamlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJOU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSTkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFRhc2sgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb24gVGFzay4gIEhvd2V2ZXIsIGEgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90S3VSTmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0YXNrRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSTkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJOeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VST0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1Uk9TWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEt1Uk95WDVFZDJLbkoyeWpOWGhXUSBfdEtsSHRpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VST2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1Uk9TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFdvcmsgUHJvZHVjdC4gIEhvd2V2ZXIsIGEgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1Uk95WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJPU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1UlBDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJQU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSUGlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90S3VSUUNYNUVkMktuSjJ5ak5YaFdRIF90S2xIZ1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJQeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSUGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFJvbGUgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFJvbGUuICBIb3dldmVyLCBhIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1UlFDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icm9sZURlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhmaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1UlBpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S3VSUVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEt1UlFpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RLdVJReVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1zIiBtZW1iZXJFbmQ9Il90S2xIa1NYNUVkMktuSjJ5ak5YaFdRIF90S3VSUlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJSQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSUXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIHRoZSByZWZlcnJlZCBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIHNob3cgdXAgYXMgc2NoZWR1bGVkIHJlc291cmNlcyBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1UlJTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icGVyZm9ybXNBZGRpdGlvbmFsbHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhpaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1UlF5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S3VSUmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEt1UlJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RLdVJTQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkFzc2lzdHMiIG1lbWJlckVuZD0iX3RLbEhsQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJTaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UlNTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJTQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MsIGkuZS4gbm8gZGVmYXVsdHMgaGF2ZSBiZWVuIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgbWF5IHByb3ZpZGUgaW5mb3JtYXRpb24gb3IgYXNzaXN0YW5jZSBoZWxwZnVsLCBidXQgbm90IG1hbmRhdG9yeSB0byB0aGUgY29tcGxldGlvbiBvZiB0aGUgVGFzay4gIEluc3RhbmNlcyBvZiB0aGVzZSByb2xlcyB3b3VsZCBub3Qgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RLdVJTaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFzc2lzdHNJbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSU0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJTeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSVENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1UlRTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgbWVtYmVyRW5kPSJfdEtsSGx5WDVFZDJLbkoyeWpOWGhXUSBfdEt1UlR5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSVGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UlRTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyB3aWxsIGJlIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHVzZWQgYXMgaW5wdXRzIHRoYXQgYXJlIG5vdCBwcm9kdWNlZCBieSBUYXNrcyB3aXRoaW4gdGhlIHNhbWUgUHJvY2VzcywgYnV0IGJ5IGFub3RoZXIgZXh0ZXJuYWwgcHJvY2VzcyBvciBhbiB1bmtub3duIHNvdXJjZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RLdVJUeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSVFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJVQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSVVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1UlVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iSW1wYWN0c0RlcGVuZGVuY3kiIG1lbWJlckVuZD0iX3RLbEh1U1g1RWQyS25KMnlqTlhoV1EgX3RLbEh2Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UlV5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJVaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNlbWktZm9ybWFsbHkgc3BlY2lmeSB0cmFjZWFiaWxpdHkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgd2l0aGluIHRoZSBzY29wZSBvZiBhbiBBY3Rpdml0eS4gIEEgbGluayBmcm9tIG9uZSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciB0byBhbm90aGVyIGluZGljYXRlcyB0aGF0IG9uZSBXb3JrIFByb2R1Y3QgaXMgcmVxdWlyZWQgYXMgaW5wdXQgdG8gYSBUYXNrIHRoYXQgcHJvZHVjZXMgdGhlIHJlbGF0ZWQgV29yayBQcm9kdWN0ICgnaW1wYWN0cycgcm9sZSBlbmQpLiAgSXQgd291bGQgYWxzbyBtZWFuIHRoYXQgYSBjaGFuZ2Ugb24gb25lIFdvcmsgUHJvZHVjdCBpbnN0YW5jZSBtYXkgYWZmZWN0IGEgY2hhbmdlIG9uIHRoZSByZWxhdGVkIHByb2R1Y3QuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSVkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgbWVtYmVyRW5kPSJfdEtsSG1pWDVFZDJLbkoyeWpOWGhXUSBfdEt1UlZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSVlNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UlZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG1hbmRhdG9yeSBmb3IgdGhlIFRhc2sgdG8gYmUgcGVyZm9ybWVkLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1UlZpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSVkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJWeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSV0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1UldTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTW9kaWZpZXMiIG1lbWJlckVuZD0iX3RLbEhoQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJXeVg1RWQyS25KMnlqTlhoV1EiIGlzRGVyaXZlZD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSV2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UldTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgTW9kaWZpZXMgYXNzb2NpYXRpb24gZGVmaW5lZCBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgYW5kIFRhc2tzIGluIENvcmUgTWV0aG9kIENvbnRlbnQuICBUaGUgc2FtZSBkZXJpdmF0aW9uIHJ1bGUgYXMgZm9yIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudHMgYXBwbGllcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RLdVJXeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9yb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RLdVJXU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1UlhDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJYU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSWGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJPcHRpb25hbElucHV0IiBtZW1iZXJFbmQ9Il90S3VSWUNYNUVkMktuSjJ5ak5YaFdRIF90S2xIblNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJYeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSWGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgb3B0aW9uYWwgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RLdVJZQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSWGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJZU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSWWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1Ull5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iT3V0cHV0IiBtZW1iZXJFbmQ9Il90S3VSWlNYNUVkMktuSjJ5ak5YaFdRIF90S2xIb0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJaQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSWXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgb3V0cHV0cyBmb3IgcGVyZm9ybWluZyB0aGUgcmVmZXJyZWQgVGFzay48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RLdVJaU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im91dHB1dEZyb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhpaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1Ull5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S3VSWmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEt1Ulp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RMQnpFQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlBhY2thZ2VkV1AiIG1lbWJlckVuZD0iX3RMQnpFaVg1RWQyS25KMnlqTlhoV1EgX3RLbEh2eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdExCekVTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RMQnpFQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+SWYgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZWZlcnMgYXQgdGhlICdkZWxpdmVyYWJsZScgcm9sZSBlbmQgdG8gYSBEZWxpdmVyYWJsZSBXb3JrIFByb2R1Y3QgdGhlbiB0aGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgRGVsaXZlcmFibGUncyBXb3JrIFByb2R1Y3QgcGFydHMuICBBcyBpbmRpY2F0ZWQgZm9yIERlbGl2ZXJhYmxlIGluIHRoZSBDb3JlIE1ldGhvZCBDb250ZW50IHBhY2thZ2UsIHRoaXMgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIHRoZSAnZGVsaXZlcmVkV29ya1Byb2R1Y3RzJyBhc3NvY2lhdGlvbiBvZiB0aGUgV29yayBQcm9kdWN0LCB3aGljaCBzdG9yZXMgdGhlIHJlY29tbWVuZGVkIGRlbGl2ZXJhYmxlIHBhcnRzLCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgZm9yIGV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yLiA8L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RMQnpFaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImRlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpFQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdExCekV5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RMQnpGQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90TEJ6RlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcmltYXJ5UGVyZm9ybXMiIG1lbWJlckVuZD0iX3RLbEhveVg1RWQyS25KMnlqTlhoV1EgX3RMQnpGeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdExCekZpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RMQnpGU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBhIGRlc2NyaXB0b3IgZm9yIHRoZSBvbmUgcm9sZSByZXNwb25zaWJsZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHRhc2suICBBbiBpbnN0YW5jZSBvZiB0aGlzIHJvbGUgd291bGQgc2hvdyB1cCBhcyBhIHNjaGVkdWxlZCByZXNvdXJjZSBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdExCekZ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icGVyZm9ybXNBc093bmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpGU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdExCekdDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RMQnpHU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90TEJ6R2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfdEtsSGh5WDVFZDJLbkoyeWpOWGhXUSBfdExCekhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90TEJ6R3lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdExCekdpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgcmVzcG9uc2liaWxpdHkgZm9yIFdvcmsgUHJvZHVjdCBpbnN0YW5jZXMuICBJdCBpbmRpY2F0ZXMgb3duZXJzaGlwIGFuZCBmb3IgZXhhbXBsZSB3b3VsZCBkZWZpbmUgdGhlIFJvbGUgdGhhdCBhbnN3ZXJzIHRvIG1hbmFnZW1lbnQgcXVlc3Rpb25zIGFib3V0IHRoZSBxdWFsaXR5IHdvcmsgcHJvZHVjdC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RMQnpIQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEJ6R2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RMQnpIU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90TEJ6SGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdExCekh5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEt1UkV5WDVFZDJLbkoyeWpOWGhXUSBfdExCeklDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RMQnpJQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9jb21wb3NpdGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S3VSRUNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdExCekh5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90TEJ6SVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdExCeklpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RMQnpJeVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RLbEhjQ1g1RWQyS25KMnlqTlhoV1EgX3RMQnpKU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdExCekpDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RMQnpJeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RMQnpKU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdExCekl5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90TEJ6SmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdExCekp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RMQnpLQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RLbEhUeVg1RWQyS25KMnlqTlhoV1EgX3RMQnpLaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdExCektTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RMQnpLQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgYXNzb2NpYXRpb24gbGlua3MgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRvIGl0cyBzdWNjZXNzb3IgV29yayBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RMQnpLaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImxpbmtUb1N1Y2Nlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFNTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEJ6S0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RMQnpLeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90TEJ6TENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdExCekxTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdExCekx5WDVFZDJLbkoyeWpOWGhXUSBfdEt1UklpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90TEJ6TGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdExCekxTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCB0byBpdHMgcHJlZGVjZXNzb3IuICBFdmVyeSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGNhbiBoYXZlIHByZWRlY2Vzc29yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgdG8gaXQuICBTcGVjaWZpYyBwcmVkZWNlc3NvciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBXb3JrIE9yZGVyLCB3aGljaCBkZWZpbmVzIHRoZSBraW5kIG9mIHByZWRlY2Vzc29yIGFub3RoZXIgV29yayBCcmVha2Rvd24gRWxlbWVudCByZXByZXNlbnRzIGZvciBhbm90aGVyLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdExCekx5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3VjYyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEt1UkZpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEJ6TFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RMQnpNQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90TEJ6TVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RMSzlBQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RLbEhLaVg1RWQyS25KMnlqTlhoV1EgX3RMSzlBU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90TEs5QVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90S2xISnlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMSzlBQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdExLOUFpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RMSzlBeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90T0pfa0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9KX2tTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPSl9rQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuDQotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90T0pfa2lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdE9KX21TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T0pfa3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlNeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USmtpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T0pfbENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9KX2xTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPSl9saVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TXlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpseVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9KX2x5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPSl9tQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90T0pfbnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T0pfb0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9KX255WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuDQotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90T0pfb1NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdE9KX21TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T0pfb2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpoU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9KX295WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPSl9wQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90T0pfcFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSb2FkbWFwIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPSl9waVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T0pfcFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLg0KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RPSl9weVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RHWnh3U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRpc2NpcGxpbmUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdaeHdpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHWnh3U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0Lg0KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T0pfclNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2YgVGFza3MgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4gIFRoaXMgaXMgdGhlIGV4dGVuc2lvbnMgb2YgRGlzY2lwbGluZSBkZWZpbmVkIGluIHRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIHRvIEFjdGl2aXRpZXMsIHdoaWNoIHJlcHJlc2VudCB0eXBpY2FsIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIG1lYW5pbmdmdWwgZ3JvdXBpbmdzIG9mIHRoZSBEaXNjaXBsaW5lJ3MgVGFza3MgaW50byB3b3JrZmxvd3MuDQotVGFza3MgcmVwcmVzZW50IGRlc2NyaXB0aW9ucyBvZiB3b3JrLCB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYnkgRGlzY2lwbGluZXMuICBUaGUgcmVhc29uIHRoYXQgc2V2ZXJhbCBUYXNrcyBhcmUgYWxsIGNhdGVnb3JpemVkIGJ5IHRoZSBzYW1lIERpc2NpcGxpbmUgaXMgdGhhdCB0aGV5IGFsbCByZXByZXNlbnQgYSBwYXJ0IGluIGFjaGlldmluZyBhIGhpZ2hlciBnb2FsIG9yIHBlcmZvcm1pbmcgd29yayB0aGF0IGlzIGFsbCByZWxhdGVkIHRvIGVhY2ggb3RoZXIuICBFdmVyeSBEaXNjaXBsaW5lIGRlZmluZXMgc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBpdCBjYXRlZ29yaXplcy4gIFN1Y2ggc3RhbmRhcmQgd2F5cyBhcmUgZXhwcmVzcyBieSBBY3Rpdml0aWVzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMgZGVmaW5pbmcgaG93IHRoZSBUYXNrcyBjYXRlZ29yaXplZCBieSB0aGUgRGlzY2lwbGluZSAnd29yayB0b2dldGhlcicgaW4gdGhlIG1vc3QgZ2VuZXJpYyB3YXkuICBUaGVzZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGFyZSBvZnRlbiB1c2VkIGZvciBlZHVjYXRpbmcgYW5kIHRlYWNoaW5nIHByYWN0aXRpb25lcnMuIA0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEdaeHd5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdaeHhDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idGFza3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaTlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R1p4eFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdaeHhpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RHWnh4eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN1YmRpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWnh3U1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdEdqaS1TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R1p4eUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdaeHlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPSl9yaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKbmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPSl9yeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T0pfc0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOVB5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUHJhY3RpY2UiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOVFDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlQeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RFSzlRU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RFSzlRaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN1YlByYWN0aWNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOVB5WDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90RVV1V2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlReVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5UkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVJTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdVhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RUs5UmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVLOVJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPSl9zU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKb3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPSl9zaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T0pfc3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdE9KX3RDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9KX3RTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPSl90Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLg0KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOg0KLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuDQotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4NCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RPSl90aVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEpnQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPSl9uQ1g1RWQyS25KMnlqTlhoV1EgX3RPVEpnaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USmdTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEpnQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyB0cmFjZWFiaWxpdHkgZm9yIGEgUHJvY2VzcyBkb2N1bWVudGluZyB3aGljaCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgYmVlbiB1c2VkIGZvciBkZWZpbmluZyB0aGUgcHJvY2Vzcy4gIEl0IGRvY3VtZW50cyBhcHBsaWNhdGlvbnMgb2YgYSBwYXR0ZXJuIHRocm91Z2ggY29weSBhcyB3ZWxsIGFzIHBhdHRlcm4gYmluZGluZy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPVEpnaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USmdDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKZ3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USmhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEpoU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPSl9vaVg1RWQyS25KMnlqTlhoV1EgX3RPVEpoeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USmhpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEpoU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+SWYgdGhlIFBsYW4gaGFzIGJlZW4gY3JlYXRlZCBiYXNlZCBvbiBvbmUgb3IgbW9yZSBwcm9jZXNzZXMgKGkuZS4gb3RoZXIgUGxhbnMsIENhcGFiaWxpdHkgUGF0dGVybnMsIGEgRGVsaXZlcnkgUHJvY2Vzcywgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZXNlKSwgdGhlbiB0aGlzIGFzc29jaWF0aW9uIGNhcHR1cmVzIGEgdHJhY2UgYmFjayB0byB0aGVzZSBzb3VyY2VzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USmh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90T0pfbnlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USmhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKaUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USmlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEppaVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RLbEhjeVg1RWQyS25KMnlqTlhoV1EgX3RPVEpqQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USml5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEppaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhlIFBsYW5uaW5nRGF0YSBjbGFzcyBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USmpDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90T1RKaWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEpqU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPSl9xaVg1RWQyS25KMnlqTlhoV1EgX3RPVEpqeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USmppWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEpqU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhbiBBY3Rpdml0eSB0byB6ZXJvIG9yIG1vcmVzIGluc3RhbmNlcyBvZiB0aGUgUm9hZG1hcCBndWlkYW5jZSB0eXBlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USmp5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhJQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USmpTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKa0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USmtTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T1RKa2lYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKbENYNUVkMktuSjJ5ak5YaFdRIF90T0pfa3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPVEpreVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T1RKa2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgZ3VpZGFuY2UgZG9jdW1lbnRzIHRoYXQgcHJvdmlkZSBlZHVjYXRpb24gbWF0ZXJpYWwgZm9yIHRlYWNoaW5nIHN0YWtlaG9sZGVycyBzdWNoIGFzIHByb2plY3QgbWFuYWdlcnMgb24gaG93IHRvIHBlcmZvcm0gcHJvamVjdHMgdGhhdCBmb2xsb3cgdGhpcyBEZWxpdmVyeSBQcm9jZXNzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USmxDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RPSl9rQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90T1RKa2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEpsU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKbGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USmx5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9USm1TWDVFZDJLbkoyeWpOWGhXUSBfdE9KX2xpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKbUNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USmx5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiByZWxhdGVkIHRvIGEgRGVsaXZlcnkgUHJvY2VzcyBpbnN0YW5jZSB0byBkZXNjcmliZSBhbmQgY2hhcmFjdGVyaXplIGl0cyBmZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzLiBUaGVzZSBkb2N1bWVudHMgY2FuIGJlIHVzZWQgZm9yIHNldmVyYWwgcHVycG9zZXMgc3VjaCBhcyBpbnRlcm5hbCBtYXJrZXRpbmcgY29tbXVuaWNhdGlvbnMsIHNhbGVzIHRyYWluaW5nIGFuZCBnZW5lcmFsIG1ldGhvZCBlZHVjYXRpb24uICBFeGFtcGxlcyBmb3IgQ29tbXVuaWNhdGlvbnMgTWF0ZXJpYWwgYXJlIEhpZ2hsaWdodCBEb2N1bWVudCwgRmFjdCBTaGVldCwgYW5kIERlbGl2ZXJ5IFByb2Nlc3MgU3BlY2lmaWNhdGlvbiBPdmVydmlldy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPVEptU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90T0pfa0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USmx5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKbWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USm15WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEpuQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkJyZWFrZG93bk5lc3RpbmciIG1lbWJlckVuZD0iX3RLbEhkaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhKQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USm5TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEpuQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBiaWRpcmVjdGlvbmFsIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgYnJlYWtkb3duIHN0cnVjdHVyZSBuZXN0aW5nLiAgSXQgZGVmaW5lcyBhbiBuLWxldmVsIGhpZXJhcmNoeSBvZiBBY3Rpdml0aWVzIGdyb3VwaW5nIHRvZ2V0aGVyIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIG90aGVyIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuDQotVGhlIHN1cGVyQWN0aXZpdGllcyByb2xlIGFsbG93cyBuYXZpZ2F0aW9uIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXMgcGFyZW50IEFjdGl2aXR5LiBUaGUgYnJlYWtkb3duRWxlbWVudHMgcm9sZSBhbGxvd3MgbmF2aWdhdGlvbiBmcm9tIGFuIEFjdGl2aXR5IHRvIGl0cyBuZXN0ZWQgQnJlYWtkb3duIEVsZW1lbnRzLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USm5pWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9KX3JpWDVFZDJLbkoyeWpOWGhXUSBfdE9USm9DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKbnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USm5pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIG9uZSBtb3JlIHJlZmVyZW5jZSB3b3JrZmxvd3MgZm9yIGEgRGlzY2lwbGluZS4gIFRoZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGRlZmluZSB0aGUgbW9zdCB0eXBpY2FsIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgYSBEaXNjaXBsaW5lLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USm9DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWnh3U1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90T1RKbmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEpvU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKb2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USm95WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9KX3NTWDVFZDJLbkoyeWpOWGhXUSBfdE9USnBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPVEpwQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOVB5WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RPVEpveVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USnBTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEpwaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T1RKcHlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKMUNYNUVkMktuSjJ5ak5YaFdRIF90T1RKcVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPVEpxQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T1RKcHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY2FuIGJlIHVzZWQgdG8gbGluayBhbGwga2luZHMgb2YgZ2VuZXJhbCBndWlkYW5jZSB0byB0aGUgQWN0aXZpdHkgdGhhdCBpcyBiZWluZyBtYW5hZ2VkIGFzIGdlbmVyYWwgU3VwcG9ydGluZyBNYXRlcmlhbC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPVEpxU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RPVEpweVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USnFpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEpxeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T1RKckNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKeFNYNUVkMktuSjJ5ak5YaFdRIF90T1RKcmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPVEpyU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T1RKckNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktIChvciBQcm9jZXNzLSkgc3BlY2lmaWMgY2hlY2sgcG9pbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHRoZSB3b3JrIHBlcmZvcm1lZC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPVEpyaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RPVEpyQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USnJ5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEpzQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T1RKc1NYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKeUNYNUVkMktuSjJ5ak5YaFdRIF90T1RKc3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPVEpzaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T1RKc1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBjb25jZXB0cyBvciB3aGl0ZXBhcGVycyB0byB0aGUgQWN0aXZpdHkgcHJvdmlkaW5nIGltcG9ydGFudCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgZG9pbmcgdGhlIHdvcmsgZGVzY3JpYmVkIGJ5IHRoZSBBY3Rpdml0eS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPVEpzeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RPVEpzU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USnRDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEp0U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T1RKdGlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKeXlYNUVkMktuSjJ5ak5YaFdRIF90T1RKdUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPVEp0eVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T1RKdGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY2FuIHByb3ZpZGUgcmVmZXJlbmNlcyB0byBleGFtcGxlcyByZWxldmFudCB0byB0aGlzIHNwZWNpZmljIEFjdGl2aXR5IChvciBQcm9jZXNzKS4gIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USnVDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USnRpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKdVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEp1eVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEp6aVg1RWQyS25KMnlqTlhoV1EgX3RPVEp2U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USnZDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEp1eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBBY3Rpdml0eS1zcGVjaWZpYyBHdWlkZWxpbmVzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USnZTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USnV5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKdmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEp3Q1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEowU1g1RWQyS25KMnlqTlhoV1EgX3RPVEp3aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USndTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEp3Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWZlcnMgdG8gUmV1c2FibGUgQXNzZXRzIHNwZWNpZmljIHRvIHRoaXMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiA8L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPVEp3aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RPVEp3Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USnd5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEp4Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhYQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLbEhYaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S3VSSlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhYeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByZWZpeCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhZQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIWHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuDQotPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIWVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSFlpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RLbEhZeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFpDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNQbGFubmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFpTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhaQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuDQotDQotDQotPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdEtsSFppWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFp5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhhQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIWnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuDQotPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdEtsSGFTWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhhaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImlzT3B0aW9uYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIYXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSGFpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90S2xIYkNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGJTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1Ukx5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIYmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSGJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhjQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEJ6SXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhjU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIY2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGN5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icGxhbm5pbmdEYXRhIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIVWlYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RPVEppaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSGRDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhkU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIZGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhJQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USm5DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIZHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSGVDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T1RKeFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjaGVja2xpc3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5SkNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpyQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USnhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEp4eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T1RKeUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjb25jZXB0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOUlTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKc1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEp5U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKeWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9USnl5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlKeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USnRpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKekNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnpTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPVEp6aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Imd1aWRlbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlLaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USnV5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKenlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USjBDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPVEowU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJldXNhYmxlQXNzZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RVV1TENYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEp3Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USjBpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEoweVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T1RKMUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TXlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpweVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USjFTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEoxaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T1RKMXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0ZW1wbGF0ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlNQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9jNmdDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKMkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USjJTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPVEoyaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlcG9ydHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlMU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9jNmhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKMnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USjNDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPVEozU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImVzdGltYXRpb25jb25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVVdUx5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T2M2aUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEozaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKM3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9USjRDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idG9vbG1lbnRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOU5pWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T2M2akNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEo0U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKNGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9jNmdDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9USjF5WDVFZDJLbkoyeWpOWGhXUSBfdE9jNmdTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPYzZnU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9jNmdDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T2M2Z2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9jNmd5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPYzZoQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEoyaVg1RWQyS25KMnlqTlhoV1EgX3RPYzZoU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T2M2aFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPYzZoQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9jNmhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPYzZoeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T2M2aUNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKM1NYNUVkMktuSjJ5ak5YaFdRIF90T2M2aVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9jNmlTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T2M2aUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPYzZpaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T2M2aXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9jNmpDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9USjRDWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmpTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPYzZqU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9jNmpDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T2M2amlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9jNmp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RRcnZJQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RRcnZJU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RRcnZJaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InVzYWdlR3VpZGFuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UXJ2SXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFFydklpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFFydkpDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RRcnZKU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90UXJ2SmlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RRcnZKeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90UXJ2S0NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFFydklDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UXJ2S1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFFydktpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RRcnZLU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFFydkt5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RRcnZMQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90UXJ2TFNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RRcnZMaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRcnZMeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UXJ2TGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRcnZNQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UXJ2TVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFFydk1pWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UXJ2TXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJob3d0b1N0YWZmIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFFydk5DWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RRcnZNeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFFydk5TWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RRcnZOaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90UXJ2TnlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RRMWdJQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFExZ0lTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RRMWdRQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFExZ0lpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic2NhbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UTFnSXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFExZ0lpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5Pk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdKQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnSlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFExZ0ppWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnSnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFExZ0tDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RRMWdKeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UTFnS1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFExZ0tpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRMWdLeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFExZ0xDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmlza0xldmVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFExZ0xTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RRMWdMQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFExZ0xpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RRMWdMeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90UTFnTUNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RRMWdNU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UTFnTWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFExZ01TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UTFnTXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFExZ05DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRMWdOU1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFExZ05pWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRMWdOeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UTFnTmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UTFnT0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFExZ09TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRMWdPaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFExZ095WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UTFnUENYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFExZ095WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdQU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnUGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFExZ1B5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90UTFnUUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90UTFnUVNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFFydkp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnUWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzY29wZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRMWdReVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UTFnUWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UTFnUkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFExZ1JTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRMWdSaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFExZ1J5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idXNhZ2VOb3RlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRMWdTQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UTFnUnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdTU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnU2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFExZ1N5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90UTFnVENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90UTFnVFNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFFydklDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnVGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UTFnVHlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFExZ1RpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UTFnVUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFExZ1VTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRMWdVaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFExZ1V5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEtsSHBpWDVFZDJLbkoyeWpOWGhXUSBfdFExZ1ZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UTFnVkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFExZ1V5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5MaXN0IHRoZSBzdGVwcyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCB0byBiZSBwZXJmb3JtZWQgZm9yIHRoZSBpbnN0YW5jZSBvZiB0aGUgVGFzayBEZXNjcmlwdG9yLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFExZ1ZTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Rhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFExZ1V5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UTFnVmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFExZ1Z5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RUWDJ5eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RUWDJ6Q1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90VFgyeXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RUWDJ6U1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S2xIZVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RUWDJ6aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90VFgyd0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFRYMjd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyenlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMjBDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90VFgyMFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RUWDIwaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90VFgyMFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90VFgyMHlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90VFgyMUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90VFgyNVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RUWDIxU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90VFgyMWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFRYMjF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaW50ZXJmYWNlSU8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFRYMjZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyMkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMjJTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RUWDI0Q1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RUWDI0aVg1RWQyS25KMnlqTlhoV1EgX3RUWDJ4U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFRYMjRTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RUWDI0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgdGhlIHJlYWxpemF0aW9uIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhIFByb2Nlc3MgQ29tcG9uZW50IGFuZCBhIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RUWDI0aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlYWxpemVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RUWDJ3Q1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFRYMjRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyNHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMjVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RUWDI1U1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RUWDI1eVg1RWQyS25KMnlqTlhoV1EgX3RUWDIxQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFRYMjVpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RUWDI1U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+SW5zdGFuY2VzIG9mIHRoaXMgYXNzb2NpYXRpb24gY29udGFpbiB0aGUgbGlzdCBvZiBUYXNrIERlc2NyaXB0b3JzIHRoYXQgcmVwcmVzZW50IGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFRYMjV5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90VFgyMFNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFRYMjVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyNkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMjZTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90VFgyNmlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90VFgyMXlYNUVkMktuSjJ5ak5YaFdRIF90VFgyN0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RUWDI2eVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90VFgyNmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY29udGFpbnMgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0IHR5cGUgaW5zdGFuY2VzIHVzZWQgZm9yIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbi48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RUWDI3Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90VFgyMFNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFRYMjZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyN1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMjdpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90VFgyN3lYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90VFgyemlYNUVkMktuSjJ5ak5YaFdRIF90VFgyOFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RUWDI4Q1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90VFgyN3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIFByb2Nlc3MgQ29tcG9uZW50IGl0IHJlZmVycyB0by4gIEEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGV4YWN0bHkgb25lIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFRYMjhTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90VFgyeXlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFRYMjd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyOGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMjh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RUWDI5Q1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RUWDJ5Q1g1RWQyS25KMnlqTlhoV1EgX3RUWDI5aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFRYMjlTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RUWDI5Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBjb250YWlucyBvbmx5IGV4YWN0bHkgb25lIFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90VFgyOWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFRYMndDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RUWDI5Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFRYMjl5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RUWDItQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFRYMi1TWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFRYMjNTWDVFZDJLbkoyeWpOWGhXUSBfdFRYMi15WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90VFgyLWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFRYMi1TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgUGFja2FnZSBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIGRlZmluZSBCcmVha2Rvd24gYW5kIFByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbGVtZW50IGluc3RhbmNlIGNhbiBiZSBwYXJ0IG9mIG9ubHkgb25lIFByb2Nlc3MgUGFja2FnZSBpbnN0YW5jZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RUWDIteVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcm9jZXNzUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFRYMjJpWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RUWDItU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEI4SW5TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50Lg0KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFSzlYQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhZQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgbm90IGRpcmVjdGx5IGZyb20gTWV0aG9kIEVsZW1lbnQgYW55bW9yZS4gIFRoaXMgaXMgYWNoaWV2ZWQgdXNpbmcgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIHNlbWFudGljcy4gIE9ubHkgaWYgYW4gYWRvcHRlciBvZiB0aGlzIG1ldGEtbW9kZWwgZGVjaWRlcyB0byByZWFsaXplIE1ldGhvZCBQbHVnaW5zLCBoZSB3b3VsZCBnZXQgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gY2FwYWJpbGl0aWVzIGZvciBhbGwgQ29udGVudCBFbGVtZW50cy4NCi1Db250ZW50IEVsZW1lbnQgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50Lg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEI4SW5pWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RDRlNpQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFdEWFlTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RXTklVQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVhTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOU15WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1TWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlYaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5WHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVlDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlJU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdU55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RUs5WVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVLOVlpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RFSzlZeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlKQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdVBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RUs5WkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVLOVpTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RFVXVJQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Imd1aWRlbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlLaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdVFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1SVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdUlpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RFVXVJeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImV4YW1wbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5SnlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVTeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdUpDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVKU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RVV1SmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFVXVMQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdVlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1SnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdUtDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RFVXVLU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InRlcm1kZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5UENYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVjeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdUtpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVLeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJNZXRob2RFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCOElnaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhZaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5Pk1ldGhvZCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gYWRkcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdmlhIHBhY2thZ2UgbWVyZ2UgdG8gTWV0aG9kIEVsZW1lbnQgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSBuZWVkZWQgZm9yIHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMgaW50cm9kdWNlcyBpbiB0aGlzIHBhY2thZ2UuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90QjhJZ3lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY21TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90QjhJaENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJndWlkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEI4SWhTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOEloQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEI4SWhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RCOEloeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90QjhJaUNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RCOElpU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QjhJaWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEI4SWlTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuDQotPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90QjhJaXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEI4SWpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RCOElqU1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEI4SWppWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCOElqeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QjhJamlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RCOElrQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90QjhJa1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEI4SWtpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90QjhJa3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJvd25lZFJ1bGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTZ0NYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RDRlNsU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEI4SWxDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RCOElsU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90QjhJbGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNqeVg1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdENGU3B5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90QjhJbHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEI4SW1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RCOEltU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImtpbmQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdENGU3JpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90QjhJbWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEI4SW15WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RXRFhZeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN1cHByZXNzZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V0RYWkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdEWFl5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdFdEWFpTWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RXRFhaaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V0RYWnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdEWFppWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90V0RYYUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFdEWGFTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RXRFhhaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfdFdEWGF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhiQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V0RYYXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RXRFhiU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im5hIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdEWGJpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXRFhiU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBkZWZhdWx0ICZxdW90O25vdCBhc3NpZ25lZCZxdW90OyB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RXRFhieVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvbnRyaWJ1dGVzIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdEWGNDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXRFhieVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5Db250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoNCi1hdHRyaWJ1dGUgdmFsdWVzOglTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgY29uY2F0ZW5hdGVkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBPdGhlciB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIGFueSBvdGhlciB0eXBlIHN1Y2ggYXMgSW50ZWdlciwgRGF0ZSBhcmUgaWdub3JlZC4NCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLg0KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGtlcHQgYW5kIGFueSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBjb250cmlidXRpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGlnbm9yZWQuDQotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBhZGRlZCB0byB0aGUgYWxyZWFkeSBleGlzdGluZyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIGVsZW1lbnQuICBJZiBib3RoIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB0aGVuIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBhc3NvY2lhdGlvbiB3aWxsIHJlbWFpbi4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RXRFhjU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImV4dGVuZHMiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V0RYY2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdEWGNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkV4dGVuc2lvbiBhbGxvd3MgTWV0aG9kIFBsdWdpbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBCYXNlIFBsdWdpbiBieSBwcm92aWRpbmcgYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgQXR0cmlidXRlIHZhbHVlcyBhbmQgQXNzb2NpYXRpb24gaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHJlc3VsdCBvZiBpbnRlcnByZXRhdGlvbiBpcyB0aGF0IHRoZSBzcGVjaWFsIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlIGJhc2VkLW9uIGhhcywgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gIEhlbmNlIGV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5IGNvbnRlbnQgb2YgdGhlIGJhc2UgUGx1Z2luLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZyBQbHVnaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQgKGUuZy4gYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiByZXZpZXcpLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcgVmFyaWFiaWxpdHkgRWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB2aWEgdGhlIGV4dGVuZHMgcmVsYXRpb25zaGlwLiAgRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIENhcGFiaWxpdHkgUGF0dGVybnMgdG8gUHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcHMgZnJvbSBhbiBBY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgUHJvY2Vzc2VzIHRvIHRoZSBQYXR0ZXJuLiAgVGhlIEFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9ucyBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycyB0byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgUHJvY2VzcyBhZnRlciBJbnRlcnByZXRhdGlvbi4NCi1hdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgZWxlbWVudCBhcmUgaW5oZXJpdGVkIGFuZCB1c2VkIHRvIHBvcHVsYXRlIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGF0dHJpYnV0ZXMuICBJZiB0aGUgc3BlY2lhbCBlbGVtZW50IGF0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcG9wdWxhdGVkIHRoZSBpbmhlcml0ZWQgdmFsdWVzIGFyZSBpZ25vcmVkLiAgDQotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4NCi0wLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyBpdHMgb3duIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gdGhlIGluaGVyaXRlZCBvbmUgaXMgaWdub3JlZC4NCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIGRlZmluZWQgZm9yIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSBzcGVjaWFsIGVsZW1lbnQgY2FuIGFkZCBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIGluc3RhbmNlcy4NCi0NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RXRFhjeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlcGxhY2VzIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdEWGRDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXRFhjeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5SZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoNCi1hdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGluY2x1ZGluZyB1bmFzc2lnbmVkIHZhbHVlcy4NCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLg0KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc29jaWF0aW9uIGluc3RhbmNlIGZyb20gdGhlIHJlcGxhY2luZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGFsc28gbm90IGhhdmUgYW4gYXNzb2NpYXRpb24uDQotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IHJlcGxhY2UgYWxsIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4NCi0NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RXRFhkU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+DQotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il90V0RYZGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJsb2NhbFJlcGxhY2VtZW50Ii8+DQotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il90V0RYZHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJleHRlbmRzUmVwbGFjZXMiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFdOSVVDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXTklVU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V05JVUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4NCi1WYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLg0KLVZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4NCi1WYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFdOSVVpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFdOSVV5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90V0RYYXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdOSVZDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXTklVeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5JZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90V05JVlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+bmE8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90V05JVmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90V05JVUNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RXTklheVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFdOSVZ5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RXTklXQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iU2VjdGlvbiI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Q0ZTY1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdOSVdTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNjQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+U2VjdGlvbiBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgZXh0ZW5kcyBTZWN0aW9uIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgOjogQmFzaWMgRWxlbWVudHMgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4gDQotRm9yIGV4YW1wbGUsIHdoZW4gYSBUYXNrIGNvbnRyaWJ1dGVzIHRvIGFub3RoZXIgVGFzayBpdHMgUHJlc2VudGF0aW9uIGFzc29jaWF0aW9uIGlzIGNvbnRyaWJ1dGVkIGluY2x1ZGluZyBpdHMgU2VjdGlvbnMgKGkuZS4gaXRzIFN0ZXBzKSwgd2hpY2ggYXJlIG1vZGVsZWQgYXMgcGFydHMgb2YgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBTZWN0aW9ucyBjYW4gYmUgbmVzdGVkIGFuZCB0aGVyZWZvcmUgVGFzayBEZXNjcmlwdGlvbnMgY2FuIGJlIGZsZXhpYmx5IG9yZ2FuaXplZCBpbiBTdGVwcyB3aXRoIHN1Yi1TdGVwcy4gIFNlY3Rpb25zIGFyZSBWYXJpYWJpbGl0eSBFbGVtZW50cyB0aGVtc2VsdmVzLCBzbyB0aGV5IGNhbiBjb250cmlidXRlIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIG1vZGVsIGEgVGFzayBzdGVwIGFzIGEgU2VjdGlvbiBpbnN0YW5jZSB3aXRob3V0IHJlbGF0aW5nIGl0IHRvIGEgVGFzayBEZXNjcmlwdGlvbiB0aGF0IGRpcmVjdGx5IGNvbnRyaWJ1dGVzIHRvIChvciByZXBsYWNlcykgYW5vdGhlciBTZWN0aW9uIHdoaWNoIGlzIHBhcnQgb2YgYSBUYXNrIERlc2NyaXB0aW9uLiAgVGhpcyBjb250cmlidXRpb24gKG9yIHJlcGxhY2VtZW50KSB3b3VsZCBhZGQgbmV3IGRlc2NyaXB0aW9uIHRleHQgdG8gdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24gKG9yIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24pLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnRyaWJ1dGUgbmV3IENoZWNrIExpc3QgaXRlbXMgb3JnYW5pemVkIGFzIFNlY3Rpb25zIHRvIGFuIGV4aXN0aW5nIENoZWNrIExpc3QgKGRlZmluZWQgYXMgZ3VpZGFuY2UpLiAgDQotDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V05JV2lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFdOSVVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTY3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzZWN0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RDRlNkQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Q0ZTY3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdENGU2RTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RDRlNkaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Q0ZTZHlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RDRlNlQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RDRlNlU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Q0ZTZUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdENGU2VpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RDRlNleVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Q0ZTZkNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RDRlNmU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN1YlNlY3Rpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTY0NYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RDRlNuU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdENGU2ZpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RDRlNmeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90V05JV3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90V05JY0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXTklYQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V05JWFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQWN0aXZpdHkiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSElTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhJQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QW4gQWN0aXZpdHkgaXMgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLg0KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0Lg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPSl9xQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xISUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGludHJvZHVjZWQgaW4gdGhlIHBhY2thZ2UgQnJlYWtkb3duIHdpdGggbmV3IGNhcGFiaWxpdGllcyBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgUHJvY2Vzcy4NCi1FeHRlbmRzIEFjdGl2aXR5IHdpdGggYW4gYXNzb2NpYXRpb24gdG8gUm9hZG1hcC4gIFRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBhbHNvIHBhcnRpY2lwYXRlcyBpbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBEaXNjaXBsaW5lIGNhdGVnb3J5Lg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXTklYaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xISUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkFjdGl2aXR5IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIGV4dGVuZCBBY3Rpdml0eSB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiYjeEQ7DQotQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IHdoaWNoIHByb3ZpZGVzIGtleSBtZWNoYW5pc20gdG8gZW5hYmxlIGR5bmFtaWMgYmluZGluZyBvZiBDYXBhYmlsaXR5IFBhdHRlcm5zIGluIFByb2Nlc3NlcyBhcyB3ZWxsIGFzIFByb2Nlc3MgQ29udHJpYnV0aW9ucy4gIFZhcmlhYmlsaXR5IGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkgZm9yIEFjdGl2aXRpZXM6JiN4RDsNCi0tIEV4dGVuZDogVG8gYXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gYSBwcm9jZXNzIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgd2hpY2ggZXh0ZW5kcyB0aGUgcGF0dGVybidzIHRvcC1sZXZlbCBhY3Rpdml0eS4gIFRocm91Z2ggZXh0ZW5zaW9uIHRoZSBleHRlbmRpbmcgQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHBhdHRlcm5zIEJyZWFrZG93biBFbGVtZW50cy4mI3hEOw0KLS0gUmVwbGFjZTogVG8gcmVwbGFjZSBhbiBBY3Rpdml0eSBvZiBhbiBhcHBsaWVkIENhcGFiaWxpdHkgUGF0dGVybiBvciBhbiBleGlzdGluZyBwcm9jZXNzIGZvciB3aGljaCBvbmUgZGV2ZWxvcHMgYSBQcm9jZXNzIENvbnRyaWJ1dGlvbiAob3IgYSBjb21iaW5hdGlvbiBvZiBib3RoKSBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IGFuZCBzcGVjaWZ5IHRoZSByZXBsYWNlIHZhcmlhYmlsaXR5IHNwZWNpYWxpemF0aW9uIGJldHdlZW4gdGhlbS4mI3hEOw0KLS0gQ29udHJpYnV0ZTogVG8gY29udHJpYnV0ZSBuZXcgQnJlYWtkb3duIEVsZW1lbnRzIHRvIGFuIGV4aXN0aW5nIEFjdGl2aXR5IG9uZSB3b3VsZCBkZWZpbmUgYW4gQWN0aXZpdHkgd2l0aCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWxhdGVzIHZpYSB0aGUgQ29udHJpYnV0ZXMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdG8gdGhpcyBleGlzdGluZyBBY3Rpdml0eS4gIFRoZSBjb250cmlidXRpbmcgQWN0aXZpdHkncyBCcmVha2Rvd24gRWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29udHJpYnV0ZWQgQWN0aXZpdHkuJiN4RDsNCi0mI3hEOw0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSElpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLdVJGaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSEl5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJqQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFdOSVh5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RXTklVQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFdOSVlDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RXTklkU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSEpDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USm5DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xISlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSEppWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPSl9xaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJvYWRtYXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90T0pfcFNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpqU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9KX3F5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPSl9yQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90V05JWVNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90V05JWXlYNUVkMktuSjJ5ak5YaFdRIF90V0RYV2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXTklZaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V05JWVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGF0IGV2ZXJ5IE1ldGhvZCBQYWNrYWdlIChlaXRoZXIgQ29udGVudCBQYWNrYWdlLCBQcm9jZXNzIFBhY2thZ2UsIG9yIFByb2Nlc3MgQ29tcG9uZW50KSBpcyBwYXJ0IG9mIGV4YWN0bHkgb25lIE1ldGhvZCBQbHVnaW4uPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90V05JWXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfbWV0aG9kUGx1Z2luIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90V0RYVUNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFdOSVlTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90V05JWkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFdOSVpTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90V05JWmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJFeHRlbnNpb24iIG1lbWJlckVuZD0iX3RXTklhQ1g1RWQyS25KMnlqTlhoV1EgX3RXRFhYU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdOSVp5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXTklaaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGhvdyBNZXRob2QgUGx1Z2lucyBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucy4gIFRoZSBleHRlbmRpbmcgcGx1Zy1pbiBjb250YWlucyBuZXcgbWV0aG9kIGVsZW1lbnRzLCBleHRlbmRzIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cyBhbmQgcHJvY2Vzc2VzIHVzaW5nIGNvbnRlbnQgZWxlbWVudCB2YXJpYWJpbGl0eSBtZWNoYW5pc21zIChlLmcuIGNvbnRyaWJ1dGlvbiwgcmVwbGFjZSwgZXRjLiksIHByb3ZpZGVzIGFkZGl0aW9uYWwgRGVsaXZlcnkgYW5kIENhcGFiaWxpdHkgUHJvY2Vzc2VzIGZvciBhIE1ldGhvZCBGcmFtZXdvcmssIGV0Yy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RXTklhQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InBsdWdpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RXRFhVQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFdOSVppWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90V05JYVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFdOSWFpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RXTklheVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24iIG1lbWJlckVuZD0iX3RXTkliU1g1RWQyS25KMnlqTlhoV1EgX3RXTklWaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdOSWJDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXTklheVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyAxLXRvLW1hbnkgYXNzb2NpYXRpb24gZGVmaW5lcyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHRoYXQgYSBudW1iZXIgb2Ygc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIHJlcHJlc2VudCBhIHZhcmlhdGlvbiBvZiBleGFjdGx5IG9uZSBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiAgU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RXTkliU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RXTklVQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFdOSWF5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90V05JYmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFdOSWJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RXTkljQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RXTklXeVg1RWQyS25KMnlqTlhoV1EgX3RXTkljaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdOSWNTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXTkljQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgdGhlIG9yZGVyIGluIHdoaWNoIGNvbnRyaWJ1dGVkIFNlY3Rpb25zIHNoYWxsIGJlIGluc2VydGVkIGludG8gYW4gIGV4aXN0aW5nIGxpc3Qgb2YgU2VjdGlvbnMgbWFpbnRhaW5lZCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFdOSWNpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3NlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNjQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90V05JY0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXTkljeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V05JZENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFdOSWRTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRnVsZmlsbGFibGVFbGVtZW50Ij4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFdOSWRpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RDRlNpQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFdOSWR5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZnVsZmlsbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RXTklkU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFdOSWVpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90V05JZUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFdOSWVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RXTkllaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkZ1bGZpbGxtZW50IiBtZW1iZXJFbmQ9Il90V05JZHlYNUVkMktuSjJ5ak5YaFdRIF90V05JZXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFdOSWV5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdFdOSWRTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90V05JZWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXTklmQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V05JZlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iV29ya1Byb2R1Y3QiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYmNTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLg0KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFSzlTQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgV29yayBQcm9kdWN0IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYmNpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFdOSWZpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RXTklkU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVNTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVwb3J0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOUxTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1UmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlTaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5U3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVRDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idGVtcGxhdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TUNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVVQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVLOVRTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFSzlUaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RUs5VHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOU5pWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1WnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlVQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5VVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RVV1THlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVieVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVLOVV5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFSzlWQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90REliVVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSb2xlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJVaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90REliVVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICANCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYlV5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFdOSWZ5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RXTklkU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYlZDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibW9kaWZpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il90RElicENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJWU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90REliVmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYlZ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYnFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90REliV0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYldTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZdTM0Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlBvaW50Ij4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFl1MzRTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ieCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WXUzNGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZdTM0eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkdyYXBoRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZdTM1Q1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRvNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZdTM1U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InBvc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZdTM1aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvbnRhaW5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0bzRDWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90WkJ5MENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZdTM1eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WXUzNkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFl1MzZTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibGluayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0cERpWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90WkJ5MWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZdTM2aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WXUzNnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFl1MzdDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYW5jaG9yYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRvX2lYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RaQnkxeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFl1MzdTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZdTM3aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WXUzN3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzZW1hbnRpY01vZGVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwSnlYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RaQnkzaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFl1MzhDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZdTM4U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFl1MzhpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGltZW5zaW9uIj4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFl1Mzh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0id2lkdGgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFl1MzlDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaGVpZ2h0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNG80Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0bzRTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0bzRpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNWaXNpYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90WTRvNHlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRvNUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZdTM0eVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRvNVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0bzVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNG81eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlZmVyZW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0bzdTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90WkJ5MFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNG82Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRvNlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0bzZpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNG85Q1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFpCeTBpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRvNnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0bzdDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNG83U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlJlZmVyZW5jZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNG83aVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRvNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNG83eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfdFk0bzhDWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRvOFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZWZlcmVuY2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRvNENYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnkwU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0bzhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNG84eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0bzlDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUHJvcGVydHkiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRvOVNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0bzRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRvOWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJrZXkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0bzl5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNG8tQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90WTRvLVNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNG8taVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InZhbHVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNG8teVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRvX0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFk0b19TWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRvX2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJHcmFwaENvbm5lY3RvciI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNG9feVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WXUzNHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBBQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFl1MzR5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90WkJ5MXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBBU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwQWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBBeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImdyYXBoRWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0cEJpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90WkJ5MkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBCQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwQlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cEJpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iR3JhcGhFZGdlIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0cEJ5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZdTM0eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cENDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYW5jaG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRvX2lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnkyQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cENTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjIiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBDaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIyIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cEN5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzNENYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RaQnkyU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cERDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBEU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIyIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cERpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGlhZ3JhbUxpbmsiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwRHlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0bzRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwRUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBFU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InZpZXdwb3J0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBFaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFl1MzR5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90WkJ5MWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBFeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwRkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBGU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNHBHeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwRmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cEZ5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwR0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJHcmFwaE5vZGUiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwR1NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFl1MzR5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwR2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzaXplIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzOGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBHeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRpYWdyYW0iPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwSENYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0cEdDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwSFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBIaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwSHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cElDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idmlld3BvaW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBJU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImRpYWdyYW1MaW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwRGlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnkzU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cElpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBJeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwSkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJuYW1lc3BhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNHBKeVg1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFpCeTN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwSlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cEppWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwSnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0cEtDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZNG80Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cEtTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBLaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwS3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFk0cExDWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwTFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZdTM0eVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTNpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwTGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cEx5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBNQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNHBHeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwTVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cE1pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBNeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0cE5DWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZNHBKeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cE5TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idHlwZUluZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cE5pWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBOeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90WTRwT0NYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBPU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwT2lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0cEp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwT3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJlbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnk1Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cFBDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBQU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cFBpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwUHlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0cEp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwUUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJlbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZja0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnk0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cFFTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBRaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cFF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTGVhZkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwUkNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0bzRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwUlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJUZXh0RWxlbWVudCI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBSaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRwUXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBSeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cFNDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBTU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90WTRwU2lYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBTeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkltYWdlIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0cFRDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZNHBReVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFRTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idXJpIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjc2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBUaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwVHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFVDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibWltZVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cFVTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBVaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90WTRwVXlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBWQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwVlNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0cFF5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwVmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQb2x5bGluZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBWeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRwVkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBXQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNsb3NlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdFk0cFdTWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFdpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzNENYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RaQnk2Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cFd5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBYQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIyIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cFhTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRWxsaXBzZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBYaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRwVkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBYeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNlbnRlciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFl1MzRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwWUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyYWRpdXNYIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBZU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJhZGl1c1kiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFlpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFl5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3RhcnRBbmdsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwWkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJlbmRBbmdsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90WkJ5MENYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90WXUzNWlYNUVkMktuSjJ5ak5YaFdRIF90WTRvNUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFpCeTBTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFk0bzhTWDVFZDJLbkoyeWpOWGhXUSBfdFk0bzV5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnkwaVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZNG82aVg1RWQyS25KMnlqTlhoV1EgX3RaQnkweVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90WkJ5MHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfZGlhZ3JhbUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNG80Q1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90WkJ5MGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RaQnkxQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WkJ5MVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnkxaVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZdTM2U1g1RWQyS25KMnlqTlhoV1EgX3RZNHBFaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90WkJ5MXlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90WXUzN0NYNUVkMktuSjJ5ak5YaFdRIF90WTRwQUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFpCeTJDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFk0cEF5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cENDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnkyU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZNHBDeVg1RWQyS25KMnlqTlhoV1EgX3RaQnkyaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90WkJ5MmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwQmlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFpCeTJTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WkJ5MnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFpCeTNDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90WkJ5M1NYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90WTRwSVNYNUVkMktuSjJ5ak5YaFdRIF90WTRwRlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFpCeTNpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFl1Mzd5WDVFZDJLbkoyeWpOWGhXUSBfdFk0cExTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnkzeVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZNHBKQ1g1RWQyS25KMnlqTlhoV1EgX3RZNHBNQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90WkJ5NENYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90WTRwUUNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5NFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFpCeTRTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwUGlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFpCeTRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WkJ5NGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFpCeTR5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnk1Q1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZNHBPeVg1RWQyS25KMnlqTlhoV1EgX3RaQnk1U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90WkJ5NVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfdU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0cE9TWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RaQnk1Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFpCeTVpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RaQnk1eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90WkJ5NkNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90WTRwV2lYNUVkMktuSjJ5ak5YaFdRIF90WkJ5NlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFpCeTZTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3BvbHlsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwVmlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFpCeTZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WkJ5NmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFpCeTZ5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90VFgyMmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90VFgyMnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFRYMjJpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Qcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4NCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFRYMjNDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RIYzZvU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFRYMjNTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S3VSSlNYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RUWDItU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFRYMjNpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RUWDIzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Y0ExWUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJkaWFncmFtcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0cEd5WDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90Y0ExWXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RjQTFZU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Y0ExWWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGNBMVl5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGNBMVlDWDVFZDJLbkoyeWpOWGhXUSBfdGNBMVpTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Y0ExWkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGNBMVl5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHRoZSBvbmx5IG1lbWJlciBvZiB0aGUgdW1hZGlhZ3JhbXMgcGFja2FnZS4gIEl0IGRlZmluZXMgdGhhdCBEaWFncmFtcyBjYW4gYmUgcGFja2FnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RjQTFaU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcm9jZXNzUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFRYMjJpWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RjQTFZeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGNBMVppWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RjQTFaeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFdEWFVDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTWV0aG9kUGx1Z2luIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhVU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V0RYVUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4NCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4NCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFdEWFV5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCZmNvQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdGUyRzhDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RlMkc4aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFdEWFZDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idXNlckNoYW5nZWFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V0RYVlNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdEWFZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkRlZmluZXMgaWYgYSBtZXRob2QgcGx1Zy1pbiBpcyBsb2NrZWQgZm9yIGNoYW5nZXMgb3Igbm90LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3RXRFhWaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RXRFhWeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImlzU3VwcG9ydGluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhXQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V0RYVnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QSBzdXBwb3J0aW5nIG1ldGhvZCBwbHVnLWluIGlzIGEgcGx1Zy1pbiB0aGF0IGNvbnRhaW5zIHN1cHBvcnRpbmcgYW5kIG9wdGlvbmFsIG1ldGhvZCBlbGVtZW50cy4gT25seSB0aGUgZWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBmcm9tIG5vbi1zdXBwb3J0aW5nIHBsdWctaW4gYXJlIHRvIGJlIGNvbnNpZGVyZWQgZm9yIGluY2x1c2lvbiBpbnRvIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEluIG90aGVyIHdvcmRzLCBpZiBhIHN1cHBvcnRpbmcgbWV0aG9kIHBsdWctaW4gaXMgc2VsZWN0ZWQgZm9yIGEgY29uZmlndXJhdGlvbiBvbmx5IGl0cyBlbGVtZW50cyByZWZlcmVuY2VkIGZyb20gb3V0c2lkZSBvZiB0aGlzIHBsdWctaW4gd2lsbCBiZSBjb25zaWRlcmVkIGZvciB0aGUgY29uZmlndXJhdGlvbi4gIEFsbCBvdGhlciB1bnJlZmVyZW5jZWQgZWxlbWVudHMgd2lsbCBub3QgYmUuIDwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3RXRFhXU1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90V0RYV2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90V05JWVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXRFhXeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V0RYWENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RXRFhYU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImJhc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90V0RYVUNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RXTklaaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFdEWFhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RXRFhYeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90VFgyd0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RUWDJ3U1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90VFgyd0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLg0KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RUWDJ3aVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90VFgyMmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdFRYMnd5WDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfdFRYMnhDWDVFZDJLbkoyeWpOWGhXUSIga2V5PSJleHRlbmQiLz4NCi0gICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDwvZ2VuZXJhbGl6YXRpb24+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RlMkc4U1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90ZTJHOGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RUWDJ4U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImludGVyZmFjZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RUWDIwU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFRYMjRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyeGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMnh5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90VFgyeUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RUWDI5Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFRYMnlTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RUWDJ5aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdGUyRzhpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTWV0aG9kVW5pdCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90ZTJHOHlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGUyRzhpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RlMkc5Q1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RlMkc5U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImF1dGhvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90ZTJHOWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGUyRzlTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RlMkc5eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90ZTJHLUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdGUyRy1TWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90ZTJHLWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjaGFuZ2VEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjc0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGUyRy15WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RlMkctaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGUyR19DWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RlMkdfU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90ZTJHX2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RlMkdfeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90ZTJHX2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGUySEFDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RlMkhBU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90ZTJIQWlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RlMkhBeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InZlcnNpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90ZTJIQkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGUySEF5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGUySEJTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RlMkhCaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90ZTJIQnlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RlMkhDQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOU15WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90ZTJIRENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RlMkhDU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90ZTJIQ2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEI4SW55WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCOElvQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RlMkhDeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90ZTJHOGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RCOElvaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCOElveVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QjhJb2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RCOElwQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90QjhJcFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEI4SXBpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90QjhJcHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzZWN0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90Q0ZTbUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RCOElxQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90QjhJcVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZmJpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXh0ZXJuYWxJZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZieVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mYmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgb3IgbGFiZWwgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQuIFVzZWQgbGlrZSBhIHN5bm9ueW0gdG8gdGhlIG5hbWUuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mY0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZmNTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZjaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZmN5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mZENYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZmN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZkU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mZGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZmR5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mZUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJsb25nUHJlc2VudGF0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90ZTJIRENYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90ZTJIQ0NYNUVkMktuSjJ5ak5YaFdRIF90ZTJIRGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RlMkhEU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90ZTJIRENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgY2FuIGhhdmUgZXhhY3RseSBvbmUgQ29weXJpZ2h0IFN0YXRlbWVudCBzZWN1cmluZyB0aGUgaW50ZWxsZWN0dWFsIGNhcGl0YWwgaXQgcmVwcmVzZW50cy4gIEl0IHdpbGwgYmUgcHVibGlzaGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgY29uY3JldGUgRWxlbWVudC4gIE5vdGUsIHRoYXQgQ29weXJpZ2h0IFN0YXRlbWVudHMgZm9yIE1ldGhvZCBMaWJyYXJpZXMgYW5kIE1ldGhvZCBQbHVnaW5zIGRlZmluZSB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQgZm9yIGl0cyBjb250YWluZWQgZWxlbWVudHMsIHdoaWNoIGNhbiBiZSAnb3ZlcndyaXR0ZW4nIHdpdGggcmV2aXNlZCBzdGF0ZW1lbnRzIGZvciBldmVyeSBDb250ZW50IERlc2NyaXB0aW9uIG9yIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdGUySERpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX21ldGhvZFVuaXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RlMkc4aVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGUySERDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90ZTJIRHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGUySEVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGhobmdTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RoaG5naVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90ZTJHOGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RoaG5neVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoaG5oQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFdEWFVDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZaWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RoaG5oU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aGhuaGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoaG5oeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RIYzZvU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWWp5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhuaUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobmlTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aGhuaWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcm9jZXNzVmlld3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWXFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhuaXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobmpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoaG5qU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImRlZmF1bHRWaWV3IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RocllyU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhobmppWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RoaG5qeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGhobmtDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90aGhuZ0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RocllzU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhobmtTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RoaG5raVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aGhua3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWXRpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhubENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobmxTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoaG5saVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWXVpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhubHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobm1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RoaG5tU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3NGYW1pbHkiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGhobm1pWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RoaG5tU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdGhobm15WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGhobm5DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RPSl9rQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWWxDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhublNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobm5pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3MiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9KX21pWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4NCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGhobm55WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+UHJvY2VzcyBpbiB0aGUgcGFja2FnZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gZXh0ZW5kcyB0aGUgY2xhc3MgUHJvY2VzcyB3aXRoIGFzc29jaWF0aW9uIHJlbGF0aW5nIGEgUHJvY2VzcyB0byBvbmUgZGVmYXVsdCBhbmQgbWFueSBvcHRpb25hbCB2YWxpZCBDb25maWd1cmF0aW9ucy4NCi1UaGVzZSBjb25maWd1cmF0aW9ucyBkZXNjcmliZSB2YWxpZCBjb250ZXh0cyBmb3IgdGhlIFByb2Nlc3Mgd2l0aGluIGEgTWV0aG9kIExpYnJhcnkgaW5kaWNhdGluZyB1bmRlciB3aGljaCBDb25maWd1cmF0aW9ucyBhIFByb2Nlc3MgaXMgd2VsbCBkZWZpbmVkLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdE9KX215WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhJQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9KX25DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdE9KX3RDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKZ0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPSl9uU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T0pfbmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGhobm9DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWW55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhub1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobm9pWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aGhub3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ2YWxpZENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWXBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhucENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobnBTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RocllnQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik1ldGhvZExpYnJhcnkiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGhyWWdTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RocllnQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90aHJZZ2lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdGUyRzhpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90aHJZZ3lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY29DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aHJZaENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtZXRob2RQbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90V0RYVUNYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RoclltU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWWhTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RoclloaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aHJZaHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdGhyWW5DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZaUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWWlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RocllpaVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RocllqQ1g1RWQyS25KMnlqTlhoV1EgX3RoaG5oQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGhyWWl5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RocllpaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZakNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90aHJZaWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RocllqU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aHJZamlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWWp5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhyWWtTWDVFZDJLbkoyeWpOWGhXUSBfdGhobmh5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aHJZa0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhyWWp5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RocllrU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RocllqeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWWtpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RocllreVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90aHJZbENYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90aHJZbGlYNUVkMktuSjJ5ak5YaFdRIF90aGhubkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RocllsU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90aHJZbENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkRlbGl2ZXJ5IFByb2Nlc3MgY2FuIGJlIG9yZ2FuaXplZCBpbiBtYW55IFByb2Nlc3MgRmFtaWxpZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZbGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcm9jZXNzRmFtaWxpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RoaG5tU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWWxDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZbHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWW1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RoclltU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RocllteVg1RWQyS25KMnlqTlhoV1EgX3RoclloQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGhyWW1pWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RoclltU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBwaHlzaWNhbGx5IGNvbXByaXNlcyBvZiBNZXRob2QgUGx1Z2lucy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RocllteVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RMaWJyYXJ5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdGhyWWdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RoclltU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWW5DWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhyWWh5WDVFZDJLbkoyeWpOWGhXUSBfdGhyWW5pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aHJZblNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhyWW5DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHN0b3JlcyBhIHNldCBvZiBwcmVkZWZpbmVkIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGFyZSByZWd1bGFybHkgdXNlZCBieSB0aGUgbGlicmFyeSBhdXRob3JzIChlLmcuIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHRoZXkgc2hpcCB0byB0aGVpciB1c2VycykuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZbmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfbWV0aG9kTGlicmFyeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhyWWdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RoclluQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWW55WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhyWW9TWDVFZDJLbkoyeWpOWGhXUSBfdGhobm9DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aHJZb0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhyWW55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgaGFzIGV4YWN0bHkgb24gZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHRoZSBjb25maWd1cmF0aW9uIGluIHdoaWNoIHRoZSBwcm9jZXNzIGhhcyBiZWVuIGNyZWF0ZWQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZb1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdE9KX21TWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RocllueVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWW9pWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RocllveVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90aHJZcENYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90aHJZcGlYNUVkMktuSjJ5ak5YaFdRIF90aGhub3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RocllwU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90aHJZcENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBjYW4gaGF2ZSBtYW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgdG8gYWxzbyBwcm9kdWNlIHZhbGlkIHJlc3VsdHMuICBQcm9jZXNzIEVsZW1lbnRzIChlLmcuIERlc2NyaXB0b3JzKSB0aGF0IHJlZmVyIHRvIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBzdWNoIGEgY29uZmlndXJhdGlvbiB3b3VsZCBub3QgYmUgc2hvd24gaW4gdGhlIHByb2Nlc3Mgd2hlbiBwdWJsaXNoZWQgb3IgdXNlZCB1bmRlciBzdWNoIGEgY29uZmlndXJhdGlvbi4gIFRoaXMgYWxsb3dzIHRvIGVhc2lseSByZW1vdmUgY29udGVudCBmcm9tIGEgcHJvY2VzcyBieSByZW1vdmluZyBjb250ZW50IHBhY2thZ2VzIHRvIGZyb20gdGhlIHJlbGF0ZWQgY29uZmlndXJhdGlvbi48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RocllwaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGhyWXBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZcHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWXFDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RocllxU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RocllxaVg1RWQyS25KMnlqTlhoV1EgX3RoaG5paVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZcWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RocllxU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWXF5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RocllyQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90aHJZclNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90aGhualNYNUVkMktuSjJ5ak5YaFdRIF90aHJZcmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdGhyWXJpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90aHJZclNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RocllyeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aHJZc0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWXNTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhobmtDWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aHJZc2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhyWXNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGUgZGVmaW5pdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9ucyBvZiBvdGhlciBjb25maWd1cmF0aW9ucy4gIEZvciBleGFtcGxlLCBhIGNvbmZpZ3VyYXRpb24gQSBjb3VsZCBiZSBkZWZpbmVkIGFzIHRoZSBzdXBlcnNldCBvZiBjb25maWd1cmF0aW9ucyBCLCBDLCBhbmQgRCBwbHVzIGFkZCBtb3JlIHNlbGVjdGVkIFBsdWdpbnMgYW5kIFBhY2thZ2VzLiAgSW4gc3VjaCBhIGNhc2UgQSB3b3VsZCBsaXN0IEIsIEMsIGFuZCBEIGFzIGl0cyBiYXNlQ29uZmlndXJhdGlvbnMuICBJZiBhbnkgb2YgdGhlc2UgYmFzZSBjb25maWd1cmF0aW9ucyBjaGFuZ2VzIGFsbCB1cGRhdGVzIHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdmFsaWQgZm9yIEEgYXMgd2VsbCByZWR1Y2luZyBtYWludGFpbmFiaWxpdHkgb3ZlcmhlYWQgZm9yIG92ZXJsYXBwaW5nL2RlcGVuZGVudCBjb25maWd1cmF0aW9ucy4gPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZc3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90aHJZc1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3Rocll0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aHJZdFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWXRpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhobmt5WDVFZDJLbkoyeWpOWGhXUSBfdGhyWXR5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3Rocll0eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90aGhuZ0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGhyWXRpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZdUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWXVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3Rocll1aVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RoaG5saVg1RWQyS25KMnlqTlhoV1EgX3Rocll1eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZdXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3Rocll1aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdGhyWXZDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29uZmlndXJhdGlvbkNhdGVnb3J5Ij4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdGhyWXZTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGhyWXZpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZd1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3Rocll2eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aHJZd0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3Rocll3U1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3Rocll2aVg1RWQyS25KMnlqTlhoV1EgX3Rocll3aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZd2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90aHJZdkNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3Rocll3U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWXd5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3Rocll4Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9KN3RHMWV5Q0VkdTUtdlZqbGZWc2ZRIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0o3dEcxdXlDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+DQotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvU3RhbmRhcmQucHJvZmlsZS51bWwjX3l6VTU4WWluRWRxdHZibmZCMkxfNXciLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfMCIvPg0KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4NCi0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9KN3RHMS15Q0VkdTUtdlZqbGZWc2ZRIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0o3dEcyT3lDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+DQotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfSU44azhNbUJFZHFCY04xUjZFdldVdz9EZWZhdWx0L0RlZmF1bHQ/Ii8+DQotICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0PyIvPg0KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4NCi0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9KN3RHMmV5Q0VkdTUtdlZqbGZWc2ZRIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0o3dEcydXlDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+DQotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfSXJkQVVNbUJFZHFCY04xUjZFdldVdz9EZXBsb3ltZW50L0RlcGxveW1lbnQ/Ii8+DQotICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50PyIvPg0KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4NCi0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9UX2Njb095Q0VkdTUtdlZqbGZWc2ZRIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1RfY2NvZXlDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+DQotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjX3Z5LUhVWWluRWRxdHZibmZCMkxfNXciLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfMCIvPg0KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4NCi0gIDwvdW1sOk1vZGVsPg0KLSAgPEVjb3JlOkVQYWNrYWdlIHhtaTppZD0iX1U5SXo4T3lDRWR1NS12VmpsZlZzZlEiIGJhc2VfUGFja2FnZT0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiIHBhY2thZ2VOYW1lPSJ1bWEiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hIiBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41L3VtYS5lY29yZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90QmZjcHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QlZzU3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90QmZjcUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEJWc1RTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90QmZjcVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QmZja1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCZmNxaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCZmNreVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RCZmNxeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90QmZjbFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCZmNyQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCZmNtaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEJmY3JTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEJmY25TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90QmZjcmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QmZjb1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCZmNyeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCZmNwU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfdEJvbWhpWDVFZDJLbkoyeWpOWGhXUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il90QmZjc0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCb21oeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCZmNzU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfdEJvbWlDWDVFZDJLbkoyeWpOWGhXUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfdEJmY3NpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Qm9taVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QmZjc3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3RCb21paVg1RWQyS25KMnlqTlhoV1EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCb21peVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCZmN0U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfdEJvbWpDWDVFZDJLbkoyeWpOWGhXUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3RCZmN0aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfdEJvbWpTWDVFZDJLbkoyeWpOWGhXUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il90Qm9tZ0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3RCb21qaVg1RWQyS25KMnlqTlhoV1EiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3RCb21nU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEJvbWp5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEJvbWdpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il90Qm9ta0NYNUVkMktuSjJ5ak5YaFdRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkJvb2xlYW4iIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEJvbWtTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEJvbWhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il90Qm9ta2lYNUVkMktuSjJ5ak5YaFdRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkRvdWJsZSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q0ZTdWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QjhJZ2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTdXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEI4SWhDWDVFZDJLbkoyeWpOWGhXUSIgaXNJRD0idHJ1ZSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q0ZTdkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QjhJaFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTdlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEI4SWlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q0ZTdmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QjhJaWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTdnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEI4SWppWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q0ZTd0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QjhJanlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDRlN3U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCOEluU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENGU3dpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEI4SW9DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdENGU3d5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RCOElvaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENGU3hDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEI4SW95WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q0ZTeFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Q0ZTY1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTeGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdENGU2N5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q0ZTeHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Q0ZTZENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTeUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdENGU2VDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q1BEY0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Q0ZTZVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDUERjU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RDRlNnU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RDUERjaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Q0ZTZ3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDUERjeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RDRlNoQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENQRGRDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdENGU2lTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdENQRGRTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RDRlNrU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENQRGRpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdENGU2xpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q1BEZHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Q0ZTbVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDUERlQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RDRlNuaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENQRGVTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdENGU295WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdENQRGVpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RDRlN0Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFFTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYlVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfdERSbFFpWDVFZDJLbkoyeWpOWGhXUSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il90REliVkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxReVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJXeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3REUmxSQ1g1RWQyS25KMnlqTlhoV1EiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfdERJYmJTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsUlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90REliY1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxSaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJkQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFJ5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYmR5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsU0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90REliZ0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxTU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJoaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFNpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYmlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsU3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RElialNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxUQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJsaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFRTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYm15WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsVGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RElib0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxUeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJwU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3REUmxVQ1g1RWQyS25KMnlqTlhoV1EiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfdERJYnBpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsVVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RElicWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxVaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJyeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFV5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYnRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsVkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RElidGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxWU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJ1eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFZpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYndDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsVnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RElid3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxXQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJ4aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEVTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOUlpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0RWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5SlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRFeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlLQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEZDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOUt5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0RlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5TGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRGaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlNU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEZ5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOU5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0R0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5TnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRHU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlPaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEdpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOVBTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0R3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5UUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRIQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlTQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEhTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOVZTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0SGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5WENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRIeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVMU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNElDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdU1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0SVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RVV1TXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRJaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVPQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEl5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdVBTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0SkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RVV1UWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRKU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVSeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEppWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdVRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0SnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RVV1VVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRLQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVWaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEtTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdVd5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0S2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RVV1WGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRLeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVZeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEE4Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5lOGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RGaEE4U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RGTmU4eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEE4aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5lOXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RGaEE4eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RGTmUtQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEE5Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5lX0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhBOVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZkFDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQTlpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZCaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQTl5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZkJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQS1DWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZDeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQS1TWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZkRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQS1pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZFaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQS15WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZkV5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQV9DWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZGeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQV9TWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZkdDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQV9pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZIQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQV95WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZkhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkFDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZJeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkFTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZkpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkFpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZLQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkF5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZktTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkJDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZMeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkJTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZk1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkJpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZOQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkJ5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZk5TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkNDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZPU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkNTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZk9pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkNpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZRQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkN5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZlFTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkRDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZSeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkRTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZlNDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkRpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZUQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkR5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZlRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkVDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZVU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkVTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZlVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkVpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZWaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkV5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZlZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkZDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZXeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkZTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZlhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQkZpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmZZQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQkZ5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZllTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCR0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mWlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCR1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZlppWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCR2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mWnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCR3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZmFpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCSENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mYXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCSFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZmJpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCSGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mYnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCSHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZmN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCSUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mZENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCSVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZmVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2ppX0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R1p4d2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHamlfU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHWnh5eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqaV9pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdaeDBTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2ppX3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R1p4MmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampBQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHWng0Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakFTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdaeDR5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqQWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R1p4NlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampBeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHWng3eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakJDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdqaXdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqQlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R2ppeWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampCaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHaml6eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakJ5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdqaTFDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqQ0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R2ppMXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampDU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHamkzQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakNpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdqaTRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqQ3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R2ppNWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampEQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHamk2eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakRTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdqaThDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqRGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R2ppOVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RIYzZ4Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RIYzZvaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEhjNnhTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEhjNnBpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90SGM2eGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90SGM2cnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RIYzZ4eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RIYzZ0U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEhjNnlDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEhjNnVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90SGM2eVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90SGM2dnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlCQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhJU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUJTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSEtDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5QmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xITGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlCeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhNU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUNDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSE5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5Q1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIUUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlDaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhRaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUN5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSFJDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5RENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIUmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlEU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhTQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOURpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSFNpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdExLOUR5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RLbEhUQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUVDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSFRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5RVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIVXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90TEs5RWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEtsSFZTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5RXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIVmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90TEs5RkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEtsSFZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5RlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIV0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90TEs5RmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEtsSFdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5RnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIV2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlHQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhYQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlHU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIWHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlHaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhZQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlHeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIWkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlIQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhaU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlIU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIWnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlIaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhhQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlIeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIYWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlJQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhheVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUlTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSGVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdExLOUlpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RLbEhmQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUl5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSGZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5SkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIaXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlKU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhxaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlKaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIckNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlKeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhyU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlLQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIc1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlLU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhzaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUtpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1UkVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5S3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSRnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90TEs5TENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEt1UkdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5TFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSR2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90TEs5TGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEt1UkhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5THlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSSFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90TEs5TUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEt1Ukh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5TVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSSUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlNaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJKaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOU15WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1UktTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5TkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSTGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlOU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJNQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOU5pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1Uk5TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5TnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VST2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlPQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJQeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdUFDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1UlJDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1QVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSU1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVBaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJUaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdUF5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1UlV5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1QkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSVlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVCU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJXaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdUJpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1Ulh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1QnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSWkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVDQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RMQnpFU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdUNTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdExCekZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1Q2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90TEJ6R3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVDeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RMQnpKQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdURDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdExCektTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1RFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90TEJ6TGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZrQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPSl9rU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNmtTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9KX21pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2a2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T0pfb0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZreVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPSl9waVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNmxDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9KX3FDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2bFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T0pfclNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZsaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPSl90U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNmx5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USmdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2bUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKaGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZtU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEppeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNm1pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USmppWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2bXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKa3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZuQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEptQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNm5TWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USm5TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2bmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKbnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZueVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEpxQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNm9DWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USnJTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2b1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKc2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZvaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEp0eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNm95WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USnZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2cENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKd1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnV0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFFydklpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnV1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UXJ2SXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnV2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFFydktTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnV3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UXJ2S2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnWENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFFydkxpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnWFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UXJ2THlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnWGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFFydk15WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnWHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UXJ2TkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnWUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ0lpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnWVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnSXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnWWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ0p5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnWXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnS0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnWkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ0xDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnWlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnTFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnWmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ01TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnWnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnTWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnYUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ05pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnYVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnTnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnYWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ095WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnYXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnUENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnYkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ1FpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnYlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnUXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnYmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ1J5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnYnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnU0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnY0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFExZ1RpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90UTFnY1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90UTFnVHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdjaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdWQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFRYMl9DWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFRYMndTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90VFgyX1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90VFgyekNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RUWDJfaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RUWDIwaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFRYMl95WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFRYMjJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90VFgzQUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90VFgyNFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RUWDNBU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RUWDI1aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFRYM0FpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFRYMjZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90VFgzQXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90VFgyOENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RUWDNCQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RUWDI5U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFRYM0JTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFRYMi1pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JZ0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYVVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90V05JZ1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFdEWFZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JZ2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYVlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90V05JZ3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFdEWFZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JaENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYV0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXTkloU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXRFhZQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdOSWhpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdEWFlpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFdOSWh5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RXRFhZeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdOSWlDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdEWFpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFdOSWlTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RXRFhaaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdOSWlpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdEWFp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JaXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYYkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXTklqQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXRFhiaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdOSWpTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdEWGNDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JamlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYY2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXTklqeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXRFhkQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdOSWtDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdOSVVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFdXU1FDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RXTklVeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdXU1FTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdOSVZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V1dTUWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V05JV1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXV1NReVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXTklYaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdXU1JDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdOSVlpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V1dTUlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V05JWnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXV1NSaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXTkliQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdXU1J5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdOSWNTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeTdDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZdTM0U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnk3U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WXUzNGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5N2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFl1MzVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeTd5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZdTM4eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnk4Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WXUzOUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5OFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0bzRpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeThpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNG83eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnk4eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRvOWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5OUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0by1pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeTlTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBFQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnk5aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwRVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5OXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cEdpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeS1DWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBIU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnktU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwSUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5LWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cEtTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeS15WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBOU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnlfQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwUnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5X1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cFRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeV9pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBVQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnlfeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwV0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ6QUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cFh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCekFTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBZQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnpBaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwWVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ6QXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cFlpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpMajBDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBZeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaTGowU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwWkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RjQTFhQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RjQTFaQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGUySEVTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGUyRzh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdGUySEVpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RlMkc5U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGUySEV5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGUyRzlpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdGUySEZDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RlMkctaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGUySEZTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGUyRy15WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdGUySEZpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RlMkdfaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGUySEZ5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGUyR195WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdGUySEdDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RlMkhBeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGUySEdTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGUySEJDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90ZTJIR2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90ZTJIRFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3Rocll4U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RoaG5nU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGhyWXhpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGhobm1pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90aHJZeHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90aGhubnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3Rocll5Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RocllnU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGhyWXlTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGhyWWl5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90aHJZeWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90aHJZa0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3Rocll5eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RocllsU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGhyWXpDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGhyWW1pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90aHJZelNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90aHJZblNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3Rocll6aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RocllvQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGhyWXp5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGhyWXBTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90aHJZMENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90aHJZc2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotPC94bWk6WE1JPg0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvdW1hLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4N2EwYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UudW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBtb2RlbFBsdWdpbkNsYXNzPSIiCi0gICAgbm9uTkxTTWFya2Vycz0idHJ1ZSIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0IgotICAgIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIKLSAgICBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIiBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIiBjb2RlRm9ybWF0dGluZz0idHJ1ZSIKLSAgICBpbXBvcnRlcklEPSJjb20uaWJtLnh0b29scy5tb2RlbGVyLnVpLndpemFyZHMuaW50ZXJuYWwuZWNvcmUuaW1wb3J0ZXIuRW14SW1wb3J0ZXJXaXphcmQiCi0gICAgY29udGFpbm1lbnRQcm94aWVzPSJ0cnVlIiBjb21wbGlhbmNlTGV2ZWw9IjUuMCI+Ci0gIDxnZW5Bbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwvaW1wb3J0ZXIvY29tLmlibS54dG9vbHMubW9kZWxlci51aS53aXphcmRzLmludGVybmFsLmVjb3JlLmltcG9ydGVyLkVteEltcG9ydGVyV2l6YXJkIj4KLSAgICA8ZGV0YWlscyBrZXk9IlNVUEVSX0NMQVNTX09SREVSIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iT1BFUkFUSU9OX0JPRElFUyIgdmFsdWU9IklHTk9SRSIvPgotICAgIDxkZXRhaWxzIGtleT0iREVSSVZFRF9GRUFUVVJFUyIgdmFsdWU9IlBST0NFU1MiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkRVUExJQ0FURV9PUEVSQVRJT05fSU5IRVJJVEFOQ0UiIHZhbHVlPSJESVNDQVJEIi8+Ci0gICAgPGRldGFpbHMga2V5PSJSRURFRklOSU5HX09QRVJBVElPTlMiIHZhbHVlPSJSRVBPUlQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkFOTk9UQVRJT05fREVUQUlMUyIgdmFsdWU9IlBST0NFU1MiLz4KLSAgICA8ZGV0YWlscyBrZXk9IlJFREVGSU5JTkdfUFJPUEVSVElFUyIgdmFsdWU9IlJFUE9SVCIvPgotICAgIDxkZXRhaWxzIGtleT0iSU5WQVJJQU5UX0NPTlNUUkFJTlRTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iRFVQTElDQVRFX0ZFQVRVUkVfSU5IRVJJVEFOQ0UiIHZhbHVlPSJESVNDQVJEIi8+Ci0gICAgPGRldGFpbHMga2V5PSJEVVBMSUNBVEVfT1BFUkFUSU9OUyIgdmFsdWU9IkRJU0NBUkQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkNPTU1FTlRTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iRFVQTElDQVRFX0ZFQVRVUkVTIiB2YWx1ZT0iRElTQ0FSRCIvPgotICAgIDxkZXRhaWxzIGtleT0iU1VCU0VUVElOR19QUk9QRVJUSUVTIiB2YWx1ZT0iUkVQT1JUIi8+Ci0gICAgPGRldGFpbHMga2V5PSJFQ09SRV9UQUdHRURfVkFMVUVTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iVU5JT05fUFJPUEVSVElFUyIgdmFsdWU9IlJFUE9SVCIvPgotICA8L2dlbkFubm90YXRpb25zPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uL1VNQSUyMDEuMC41JTIwKFJTTSkvdW1hLmVteDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9InVtYS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzUmVwbGFjZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vQm9vbGVhbiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRGF0ZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVXJpIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NlcXVlbmNlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9JbnRlZ2VyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9Eb3VibGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NsYXNzaWZpZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NsYXNzaWZpZXIvaXNBYnN0cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1R5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db25zdHJhaW50L2JvZHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvbWV0aG9kRWxlbWVudFByb3BlcnR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9raW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0tpbmQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9LaW5kL2FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jb25jZXB0c0FuZFBhcGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9hc3NldHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC90ZXJtZGVmaW5pdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9rZXlDb25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9sb25nUHJlc2VudGF0aW9uTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFVuaXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodFN0YXRlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uY2VwdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0V4YW1wbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXBwbGljYWJsZU1ldGFDbGFzc0luZm8vaXNQcmltYXJ5RXh0ZW5zaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRnVsZmlsbGFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9GdWxmaWxsYWJsZUVsZW1lbnQvZnVsZmlsbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9PdXRjb21lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RlcCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3N0ZXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9ub3RhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9yZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL2V4dGVybmFsRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL3BhY2thZ2luZ0d1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3NraWxscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9hc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9zeW5vbnltcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uL2F0dGFjaG1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2JhY2tncm91bmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2dvYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vbGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0L3JvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViZGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JvYWRtYXBzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzUmVwZWF0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzT25nb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzRXZlbnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9saW5rVG9QcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvY29uY2VwdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9yZXVzYWJsZUFzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvdGVtcGxhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9yZXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3Rvb2xtZW50b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvcHJlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2FkbWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVG9vbC90b29sTWVudG9ycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9yb2xlU2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvY2F0ZWdvcml6ZWRFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L3N1YkNhdGVnb3JpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2dsb2JhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcmV1c2VkUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01pbGVzdG9uZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWlsZXN0b25lL3JlcXVpcmVkUmVzdWx0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUVudHJ5U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3NlbGVjdGVkU3RlcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZWR1Y2F0aW9uTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2NvbW11bmljYXRpb25zTWF0ZXJpYWxzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQbHVnaW5TZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBhY2thZ2VTZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3Byb2Nlc3NWaWV3cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vZGVmYXVsdFZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2Jhc2VDb25maWd1cmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vc3VidHJhY3RlZENhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9hZGRlZENhdGVnb3J5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3VzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9tZXRob2RQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9iYXNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZWRPblByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2NvbnRlbnRSZWZlcmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd3RvU3RhZmYiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi9yZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yL19wcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW0vem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vdmlld3BvaW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhOb2RlL3NpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3Bvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvaXNWaXNpYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9wcm9wZXJ0eSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS9rZXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2ludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay92aWV3cG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS93YXlwb2ludHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpbWVuc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL3dpZHRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL2hlaWdodCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZUlPIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC90eXBlSW5mbyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9MZWFmRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UZXh0RWxlbWVudC90ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0ltYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS9taW1lVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoaWNQcmltaXRpdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2x5bGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9seWxpbmUvY2xvc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1BvbHlsaW5lL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGxpcHNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2NlbnRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvcm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3N0YXJ0QW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2VuZEFuZ2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkvZGVsaXZlcnlQcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2lucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxNjQ4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBVTUEKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5ZGFjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UgCi0gICAgICAgICAgICB1cmkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUiIAotICAgICAgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlIiAvPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UiCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiLz4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlIgotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIi8+ICAgICAgICAgICAgCi0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BY3Rpdml0eS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg2MjNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi0gKiBBY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4KLSAqIAotICogVGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW50cm9kdWNlZCBpbiB0aGUgcGFja2FnZSBCcmVha2Rvd24gd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGFuZCBpcyB0aGUgYmFzaXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjbGFzcyBQcm9jZXNzLgotICogRXh0ZW5kcyBBY3Rpdml0eSB3aXRoIGFuIGFzc29jaWF0aW9uIHRvIFJvYWRtYXAuICBUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgYWxzbyBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGV4dGVuc2lvbiBvZiB0aGUgRGlzY2lwbGluZSBjYXRlZ29yeS4KLSAqIAotICogQWN0aXZpdHkgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gZXh0ZW5kIEFjdGl2aXR5IHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuCi0gKiBBY3Rpdml0eSBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2hpY2ggcHJvdmlkZXMga2V5IG1lY2hhbmlzbSB0byBlbmFibGUgZHluYW1pYyBiaW5kaW5nIG9mIENhcGFiaWxpdHkgUGF0dGVybnMgaW4gUHJvY2Vzc2VzIGFzIHdlbGwgYXMgUHJvY2VzcyBDb250cmlidXRpb25zLiAgVmFyaWFiaWxpdHkgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheSBmb3IgQWN0aXZpdGllczoKLSAqIC0gRXh0ZW5kOiBUbyBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBhIHByb2Nlc3Mgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSB3aGljaCBleHRlbmRzIHRoZSBwYXR0ZXJuJ3MgdG9wLWxldmVsIGFjdGl2aXR5LiAgVGhyb3VnaCBleHRlbnNpb24gdGhlIGV4dGVuZGluZyBBY3Rpdml0eSBpbmhlcml0cyB0aGUgcGF0dGVybnMgQnJlYWtkb3duIEVsZW1lbnRzLgotICogLSBSZXBsYWNlOiBUbyByZXBsYWNlIGFuIEFjdGl2aXR5IG9mIGFuIGFwcGxpZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIGFuIGV4aXN0aW5nIHByb2Nlc3MgZm9yIHdoaWNoIG9uZSBkZXZlbG9wcyBhIFByb2Nlc3MgQ29udHJpYnV0aW9uIChvciBhIGNvbWJpbmF0aW9uIG9mIGJvdGgpIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgYW5kIHNwZWNpZnkgdGhlIHJlcGxhY2UgdmFyaWFiaWxpdHkgc3BlY2lhbGl6YXRpb24gYmV0d2VlbiB0aGVtLgotICogLSBDb250cmlidXRlOiBUbyBjb250cmlidXRlIG5ldyBCcmVha2Rvd24gRWxlbWVudHMgdG8gYW4gZXhpc3RpbmcgQWN0aXZpdHkgb25lIHdvdWxkIGRlZmluZSBhbiBBY3Rpdml0eSB3aXRoIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlbGF0ZXMgdmlhIHRoZSBDb250cmlidXRlcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0byB0aGlzIGV4aXN0aW5nIEFjdGl2aXR5LiAgVGhlIGNvbnRyaWJ1dGluZyBBY3Rpdml0eSdzIEJyZWFrZG93biBFbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250cmlidXRlZCBBY3Rpdml0eS4KLSAqIAotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldFJvYWRtYXBzIDxlbT5Sb2FkbWFwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5IGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQsIEZ1bGZpbGxhYmxlRWxlbWVudCwKLQkJVmFyaWFiaWxpdHlFbGVtZW50LCBXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzCi0JICogQG1vZGVsIG9wcG9zaXRlPSJzdXBlckFjdGl2aXRpZXMiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2FkbWFwczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvYWRtYXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1JvYWRtYXBzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Um9hZG1hcD4gZ2V0Um9hZG1hcHMoKTsKLQotfSAvLyBBY3Rpdml0eQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BY3Rpdml0eURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxMTM4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93dG9TdGFmZiA8ZW0+SG93dG8gU3RhZmY8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5RGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG93dG8gU3RhZmY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhvd3RvU3RhZmYoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhvd3RvU3RhZmYoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SG93dG8gU3RhZmY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhvd3RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhvd3RvU3RhZmYoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBY3Rpdml0eURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmZiMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNnZXRJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gZXh0ZW5kcyBDbGFzc2lmaWVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzUHJpbWFyeUV4dGVuc2lvbihCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTRjODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi0gKiBBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdCBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250YWluZXJBcnRpZmFjdChBcnRpZmFjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGFpbmVkQXJ0aWZhY3RzIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJ0aWZhY3QgZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRhaW5lckFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250YWluZXJBcnRpZmFjdChBcnRpZmFjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdH0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250YWluZXJBcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxBcnRpZmFjdD4gZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0KLX0gLy8gQXJ0aWZhY3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3REZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOWRlNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJ0aWZhY3REZXNjcmlwdGlvbiBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJyaWVmIE91dGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZk91dGxpbmUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJyaWVmT3V0bGluZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlcHJlc2VudGF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Tm90YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90YXRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcnRpZmFjdERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzVjNTllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHRzIDxlbT5Db25jZXB0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEd1aWRlbGluZXMgPGVtPkd1aWRlbGluZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0cyA8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRUZW1wbGF0ZXMgPGVtPlRlbXBsYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRvb2xtZW50b3IgPGVtPlRvb2xtZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICJTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyIgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgIlNvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyIgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgIkN1c3RvbWVyLkFyY2hpdGVjdCIgd291bGQgZGVmaW5lIGEgIkN1c3RvbWVyIiBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgIkFyY2hpdGVjdCIgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotCSAqIAotCSAqIAotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzUGxhbm5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNQbGFubmVkKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc09wdGlvbmFsKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50ZWRBZnRlcihCcmVha2Rvd25FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQnJlYWtkb3duRWxlbWVudCBnZXRQcmVzZW50ZWRBZnRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEFmdGVyKEJyZWFrZG93bkVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50ZWRCZWZvcmUoQnJlYWtkb3duRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEJlZm9yZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50ZWRCZWZvcmUoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQbGFubmluZ0RhdGEgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3VwZXJBY3Rpdml0aWVzKEFjdGl2aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImJyZWFrZG93bkVsZW1lbnRzIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5IGdldFN1cGVyQWN0aXZpdGllcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdGllcyA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBlckFjdGl2aXRpZXMoQWN0aXZpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGVja2xpc3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENoZWNrbGlzdD4gZ2V0Q2hlY2tsaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jZXB0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29uY2VwdD4gZ2V0Q29uY2VwdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEV4YW1wbGU+IGdldEV4YW1wbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWRlbGluZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8R3VpZGVsaW5lPiBnZXRHdWlkZWxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSZXVzYWJsZUFzc2V0PiBnZXRSZXVzYWJsZUFzc2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wbGF0ZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wbGF0ZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9UZW1wbGF0ZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UmVwb3J0PiBnZXRSZXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGdldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sbWVudG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbG1lbnRvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUb29sTWVudG9yPiBnZXRUb29sbWVudG9yKCk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGNkMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVzYWdlR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXNhZ2VHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2FnZUd1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDM3MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotICogQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0gKiAtIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotICogLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLSAqIC0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhcGFiaWxpdHlQYXR0ZXJuIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLX0gLy8gQ2FwYWJpbGl0eVBhdHRlcm4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2hlY2tsaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NoZWNrbGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmY4ZTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2hlY2tsaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2hlY2tsaXN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENoZWNrbGlzdCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gQ2hlY2tsaXN0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NsYXNzaWZpZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2xhc3NpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdhODRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2xhc3NpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2xhc3NpZmllcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllciNnZXRJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENsYXNzaWZpZXIoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzaWZpZXIgZXh0ZW5kcyBUeXBlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNBYnN0cmFjdChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENsYXNzaWZpZXJfSXNBYnN0cmFjdCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyI2dldElzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNBYnN0cmFjdChCb29sZWFuIHZhbHVlKTsKLX0gLy8gQ2xhc3NpZmllcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db21wb3NpdGVSb2xlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4OTFjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9zaXRlIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotICogQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGVzIDxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb3NpdGVSb2xlIGV4dGVuZHMgUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlPiBnZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQotfSAvLyBDb21wb3NpdGVSb2xlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbmNlcHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uY2VwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDkyMTM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uY2VwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbmNlcHQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uY2VwdCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gQ29uY2VwdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25zdHJhaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlOWVhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQjZ2V0Qm9keSA8ZW0+Qm9keTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uc3RyYWludCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvZHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvZHkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnRfQm9keSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJvZHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb2R5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCb2R5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb2R5KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29uc3RyYWludApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjEzYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDb250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRDYXRlZ29yeSBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLX0gLy8gQ29udGVudENhdGVnb3J5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkNThlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb25zIDxlbT5TZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldExvbmdQcmVzZW50YXRpb25OYW1lIDxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnREZXNjcmlwdGlvbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxTZWN0aW9uPiBnZXRTZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciBvciBsYWJlbCB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZWxlbWVudC4gVXNlZCBsaWtlIGEgc3lub255bSB0byB0aGUgbmFtZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsSWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb25nUHJlc2VudGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0xvbmdQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb25nUHJlc2VudGF0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIENvbnRlbnREZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzNGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLSAqIENvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLgotICogCi0gKiBUaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIENvbnRlbnQgRWxlbWVudCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy4KLSAqIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgbm90IGRpcmVjdGx5IGZyb20gTWV0aG9kIEVsZW1lbnQgYW55bW9yZS4gIFRoaXMgaXMgYWNoaWV2ZWQgdXNpbmcgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIHNlbWFudGljcy4gIE9ubHkgaWYgYW4gYWRvcHRlciBvZiB0aGlzIG1ldGEtbW9kZWwgZGVjaWRlcyB0byByZWFsaXplIE1ldGhvZCBQbHVnaW5zLCBoZSB3b3VsZCBnZXQgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gY2FwYWJpbGl0aWVzIGZvciBhbGwgQ29udGVudCBFbGVtZW50cy4KLSAqIENvbnRlbnQgRWxlbWVudCBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHRzQW5kUGFwZXJzIDxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0QXNzZXRzIDxlbT5Bc3NldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0VGVybWRlZmluaXRpb24gPGVtPlRlcm1kZWZpbml0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRFbGVtZW50IGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50LCBWYXJpYWJpbGl0eUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29uY2VwdD4gZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGVja2xpc3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q2hlY2tsaXN0PiBnZXRDaGVja2xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWRlbGluZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEd1aWRlbGluZT4gZ2V0R3VpZGVsaW5lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEV4YW1wbGU+IGdldEV4YW1wbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJldXNhYmxlQXNzZXQ+IGdldEFzc2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlcm1kZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVybWRlZmluaXRpb248L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUZXJtRGVmaW5pdGlvbj4gZ2V0VGVybWRlZmluaXRpb24oKTsKLQotfSAvLyBDb250ZW50RWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50UGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50UGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWJhYTRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50cyA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRQYWNrYWdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRQYWNrYWdlIGV4dGVuZHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0KLX0gLy8gQ29udGVudFBhY2thZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiOWI1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RWxlbWVudChFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgdmFsdWUpOwotCi19IC8vIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzM5OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DdXN0b21DYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudHMgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldFN1YkNhdGVnb3JpZXMgPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tQ2F0ZWdvcnkgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0U3ViQ2F0ZWdvcmllcygpOwotCi19IC8vIEN1c3RvbUNhdGVnb3J5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzU4M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzIDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJhYmxlIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0PiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQotfSAvLyBEZWxpdmVyYWJsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkOTNjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTU3ZWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLSAqIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscyA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJ5UHJvY2VzcyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldEVkdWNhdGlvbk1hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3MKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0YWMxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NhbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NhbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjYWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJpc2sgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJpc2tMZXZlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Umlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVPZkNvbnRyYWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjhkZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi0gKiBUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuCi0gKiAKLSAqIFRoaXMgZGVmaW5pdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZXh0ZW5kcyB0aGUgQ29udGVudCBFbGVtZW50IGRlZmluaXRpb24gdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCByZWZlcmVuY2VzIHRvIGljb25zIHRoYXQgYXJlIHVzZWQgZm9yIHByZXNlbnRpbmcgQ29udGVudCBFbGVtZW50cyBpbiBhIFVNQS1iYXNlZCBtb2RlbGluZyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdoZW4gcHVibGlzaGluZyBDb250ZW50IEVsZW1lbnRzIGludG8gZG9jdW1lbnRhdGlvbiBwcmVzZW50YXRpb24gKGUuZy4gZG9jdW1lbnQgb3IgaHRtbCBwYWdlcykuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaWJhYmxlRWxlbWVudCBleHRlbmRzIE1ldGhvZEVsZW1lbnQsIENsYXNzaWZpZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFwZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNoYXBlaWNvbihVUkkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVyaSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVSSSBnZXRTaGFwZWljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFwZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2hhcGVpY29uKFVSSSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9kZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vZGVpY29uKFVSSSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5VcmkiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVUkkgZ2V0Tm9kZWljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9kZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb2RlaWNvbihVUkkgdmFsdWUpOwotCi19IC8vIERlc2NyaWJhYmxlRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2ODE2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotICogRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIAotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdG9yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwY2ExZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVmaW5lZERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVmaW5lZERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpcHRvckRlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjNlZjk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0RGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFZpZXdwb2ludCA8ZW0+Vmlld3BvaW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaWFncmFtIGV4dGVuZHMgR3JhcGhOb2RlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFpvb20oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1fWm9vbSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRab29tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Wm9vbShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Vmlld3BvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WaWV3cG9pbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Vmlld3BvaW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWaWV3cG9pbnQoUG9pbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbV9WaWV3cG9pbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGdldFZpZXdwb2ludCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFZpZXdwb2ludCA8ZW0+Vmlld3BvaW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9pbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFZpZXdwb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Vmlld3BvaW50KFBvaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpYWdyYW0gTGluazwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmt9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaWFncmFtIExpbms8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtIExpbms8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImRpYWdyYW0iIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PERpYWdyYW1MaW5rPiBnZXREaWFncmFtTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TmFtZXNwYWNlKFNlbWFudGljTW9kZWxCcmlkZ2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImRpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZW1hbnRpY01vZGVsQnJpZGdlIGdldE5hbWVzcGFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZXNwYWNlKFNlbWFudGljTW9kZWxCcmlkZ2UgdmFsdWUpOwotCi19IC8vIERpYWdyYW0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZGRmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRJc1Zpc2libGUgPGVtPklzIFZpc2libGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaWFncmFtRWxlbWVudCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgVmlzaWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc1Zpc2libGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNWaXNpYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgVmlzaWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1Zpc2libGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0Q29udGFpbmVkIDxlbT5Db250YWluZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250YWluZXIoR3JhcGhFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lZCIgdHJhbnNpZW50PSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWxlbWVudCBnZXRDb250YWluZXJfKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRhaW5lcl8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRhaW5lcihHcmFwaEVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2V9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQgPGVtPlJlZmVyZW5jZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkCi0JICogQG1vZGVsIG9wcG9zaXRlPSJyZWZlcmVuY2VkIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSZWZlcmVuY2U+IGdldFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfUHJvcGVydHkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFByb3BlcnR5PiBnZXRQcm9wZXJ0eSgpOwotCi19IC8vIERpYWdyYW1FbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1MaW5rLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYWNiZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW0gTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFpvb20gPGVtPlpvb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUxpbmsoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlhZ3JhbUxpbmsgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRab29tKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19ab29tKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRab29tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFpvb20gPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFpvb20oRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZpZXdwb3J0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WaWV3cG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9ydDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Vmlld3BvcnQoUG9pbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGdldFZpZXdwb3J0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFZpZXdwb3J0IDxlbT5WaWV3cG9ydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Vmlld3BvcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFZpZXdwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWaWV3cG9ydChQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldExpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldExpbmsKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImxpbmsiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0RGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERpYWdyYW0oRGlhZ3JhbSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19EaWFncmFtKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluawotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGlhZ3JhbUxpbmsiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSB2YWx1ZSk7Ci0KLX0gLy8gRGlhZ3JhbUxpbmsKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGltZW5zaW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpbWVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjU1MzIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGltZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpbWVuc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGltZW5zaW9uKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgSU1vZGVsT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGltZW5zaW9uIGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdpZHRoKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaW1lbnNpb25fV2lkdGgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFdpZHRoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldpZHRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V2lkdGgoRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVpZ2h0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhlaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGVpZ2h0KERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaW1lbnNpb25fSGVpZ2h0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRIZWlnaHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGVpZ2h0KERvdWJsZSB2YWx1ZSk7Ci0KLX0gLy8gRGltZW5zaW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkwNjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotICogQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLgotICogCi0gKiBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2YgVGFza3MgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4gIFRoaXMgaXMgdGhlIGV4dGVuc2lvbnMgb2YgRGlzY2lwbGluZSBkZWZpbmVkIGluIHRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIHRvIEFjdGl2aXRpZXMsIHdoaWNoIHJlcHJlc2VudCB0eXBpY2FsIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIG1lYW5pbmdmdWwgZ3JvdXBpbmdzIG9mIHRoZSBEaXNjaXBsaW5lJ3MgVGFza3MgaW50byB3b3JrZmxvd3MuCi0gKiBUYXNrcyByZXByZXNlbnQgZGVzY3JpcHRpb25zIG9mIHdvcmssIHdoaWNoIGFyZSBjYXRlZ29yaXplZCBieSBEaXNjaXBsaW5lcy4gIFRoZSByZWFzb24gdGhhdCBzZXZlcmFsIFRhc2tzIGFyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgdGhlIHNhbWUgRGlzY2lwbGluZSBpcyB0aGF0IHRoZXkgYWxsIHJlcHJlc2VudCBhIHBhcnQgaW4gYWNoaWV2aW5nIGEgaGlnaGVyIGdvYWwgb3IgcGVyZm9ybWluZyB3b3JrIHRoYXQgaXMgYWxsIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEV2ZXJ5IERpc2NpcGxpbmUgZGVmaW5lcyBzdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGl0IGNhdGVnb3JpemVzLiAgU3VjaCBzdGFuZGFyZCB3YXlzIGFyZSBleHByZXNzIGJ5IEFjdGl2aXRpZXMgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBkZWZpbmluZyBob3cgdGhlIFRhc2tzIGNhdGVnb3JpemVkIGJ5IHRoZSBEaXNjaXBsaW5lICd3b3JrIHRvZ2V0aGVyJyBpbiB0aGUgbW9zdCBnZW5lcmljIHdheS4gIFRoZXNlIHJlZmVyZW5jZSB3b3JrZmxvd3MgYXJlIG9mdGVuIHVzZWQgZm9yIGVkdWNhdGluZyBhbmQgdGVhY2hpbmcgcHJhY3RpdGlvbmVycy4gCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0U3ViZGlzY2lwbGluZSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93cyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzY2lwbGluZSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFza3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFza3M8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1Rhc2tzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8VGFzaz4gZ2V0VGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YmRpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViZGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YmRpc2NpcGxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEaXNjaXBsaW5lPiBnZXRTdWJkaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3dzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEFjdGl2aXR5PiBnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQotfSAvLyBEaXNjaXBsaW5lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4Y2YzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lIEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lcyA8ZW0+RGlzY2lwbGluZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzY2lwbGluZUdyb3VwaW5nIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PERpc2NpcGxpbmU+IGdldERpc2NpcGxpbmVzKCk7Ci0KLX0gLy8gRGlzY2lwbGluZUdyb3VwaW5nCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RvbWFpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Eb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1ZTA2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi0gKiBEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRTdWJkb21haW5zIDxlbT5TdWJkb21haW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvbWFpbiBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0PiBnZXRXb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YmRvbWFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJkb21haW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZG9tYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREb21haW5fU3ViZG9tYWlucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RG9tYWluPiBnZXRTdWJkb21haW5zKCk7Ci0KLX0gLy8gRG9tYWluCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjE0YWY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSU1vZGVsT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudCBleHRlbmRzIElNb2RlbE9iamVjdCB7Ci19IC8vIEVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxsaXBzZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGxpcHNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwN2U1ZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGxpcHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxsaXBzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Q2VudGVyIDxlbT5DZW50ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNYIDxlbT5SYWRpdXMgWDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1kgPGVtPlJhZGl1cyBZPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0U3RhcnRBbmdsZSA8ZW0+U3RhcnQgQW5nbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGxpcHNlIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFkaXVzIFg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJhZGl1cyBYPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhZGl1cyBYPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYWRpdXNYKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlX1JhZGl1c1goKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJhZGl1c1goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNYIDxlbT5SYWRpdXMgWDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhZGl1c1goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhZGl1c1goRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhZGl1cyBZPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYWRpdXMgWTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYWRpdXMgWTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFkaXVzWShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9SYWRpdXNZKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRSYWRpdXNZKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhZGl1cyBZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYWRpdXNZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYWRpdXNZKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um90YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvdGF0aW9uKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlX1JvdGF0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRSb3RhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJvdGF0aW9uIDxlbT5Sb3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb3RhdGlvbihEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0YXJ0IEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydEFuZ2xlKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlX1N0YXJ0QW5nbGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFN0YXJ0QW5nbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0QW5nbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0QW5nbGUoRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuZCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuZCBBbmdsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW5kQW5nbGUoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfRW5kQW5nbGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldEVuZEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0RW5kQW5nbGUgPGVtPkVuZCBBbmdsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFbmRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW5kQW5nbGUoRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNlbnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2VudGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNlbnRlcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2VudGVyKFBvaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfQ2VudGVyKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb2ludCBnZXRDZW50ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2VudGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDZW50ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENlbnRlcihQb2ludCB2YWx1ZSk7Ci0KLX0gLy8gRWxsaXBzZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjE1ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0V4YW1wbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI4NzRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEV4YW1wbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhhbXBsZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gRXhhbXBsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9GdWxmaWxsYWJsZUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRnVsZmlsbGFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzhlNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9GdWxmaWxsYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RnVsZmlsbGFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudCNnZXRGdWxmaWxscyA8ZW0+RnVsZmlsbHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRGdWxmaWxsYWJsZUVsZW1lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRnVsZmlsbGFibGVFbGVtZW50IGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZ1bGZpbGxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnVsZmlsbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBnZXRGdWxmaWxscygpOwotCi19IC8vIEZ1bGZpbGxhYmxlRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaENvbm5lY3Rvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaENvbm5lY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmUwY2U1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhDb25uZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggQ29ubmVjdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoQ29ubmVjdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoQ29ubmVjdG9yIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZSA8ZW0+QW5jaG9yYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImFuY2hvcmFnZSIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRBbmNob3IgPGVtPkFuY2hvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFwaCBFZGdlPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWRnZTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yCi0JICogQG1vZGVsIG9wcG9zaXRlPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEdyYXBoRWRnZT4gZ2V0R3JhcGhFZGdlKCk7Ci0KLX0gLy8gR3JhcGhDb25uZWN0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFZGdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjg1M2I5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFZGdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoRWRnZSBleHRlbmRzIEdyYXBoRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5jaG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5jaG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5jaG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWRnZV9BbmNob3IoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImdyYXBoRWRnZSIgbG93ZXI9IjIiIHVwcGVyPSIyIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxHcmFwaENvbm5lY3Rvcj4gZ2V0QW5jaG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldheXBvaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldheXBvaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBsb3dlcj0iMiIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UG9pbnQ+IGdldFdheXBvaW50cygpOwotCi19IC8vIEdyYXBoRWRnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzM1NmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0Q29udGFpbmVkIDxlbT5Db250YWluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluayA8ZW0+TGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFwaEVsZW1lbnQgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc2l0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc2l0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3NpdGlvbihQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGdldFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRQb3NpdGlvbiA8ZW0+UG9zaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc2l0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zaXRpb24oUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudH0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9Db250YWluZWQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfCi0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250YWluZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlhZ3JhbUVsZW1lbnQ+IGdldENvbnRhaW5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmt9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9MaW5rKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJncmFwaEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlhZ3JhbUxpbms+IGdldExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3J9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFuY2hvcmFnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFuY2hvcmFnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJncmFwaEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8R3JhcGhDb25uZWN0b3I+IGdldEFuY2hvcmFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlbWFudGljIE1vZGVsPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlbWFudGljIE1vZGVsPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZW1hbnRpY01vZGVsKFNlbWFudGljTW9kZWxCcmlkZ2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZ3JhcGhFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VtYW50aWNNb2RlbEJyaWRnZSBnZXRTZW1hbnRpY01vZGVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsIDxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlbWFudGljTW9kZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlbWFudGljTW9kZWwoU2VtYW50aWNNb2RlbEJyaWRnZSB2YWx1ZSk7Ci0KLX0gLy8gR3JhcGhFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3MzdkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhOb2RlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoTm9kZSBleHRlbmRzIEdyYXBoRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTaXplKERpbWVuc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaE5vZGVfU2l6ZSgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGltZW5zaW9uIGdldFNpemUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNpemUoRGltZW5zaW9uIHZhbHVlKTsKLQotfSAvLyBHcmFwaE5vZGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhpY1ByaW1pdGl2ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaGljUHJpbWl0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGM4Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaGljUHJpbWl0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaGljIFByaW1pdGl2ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhpY1ByaW1pdGl2ZSBleHRlbmRzIExlYWZFbGVtZW50IHsKLX0gLy8gR3JhcGhpY1ByaW1pdGl2ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZjNDYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHdWlkYW5jZSBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLX0gLy8gR3VpZGFuY2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGFuY2VEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTZlNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudHMgPGVtPkF0dGFjaG1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHdWlkYW5jZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRhY2htZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dGFjaG1lbnRzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0YWNobWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dGFjaG1lbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0YWNobWVudHMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBHdWlkYW5jZURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRlbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkZWxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiMThkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRlbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGVsaW5lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRlbGluZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gR3VpZGVsaW5lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0ltYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzYxZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1hZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SW1hZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1hZ2UgZXh0ZW5kcyBMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcmkoVVJJKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEltYWdlX1VyaSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVyaSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVSSSBnZXRVcmkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0VXJpIDxlbT5Vcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVyaTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVcmkoVVJJIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1pbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW1lIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1pbWVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRJbWFnZV9NaW1lVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1pbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWltZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pbWVUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW1hZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSXRlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0l0ZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDBkYjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSXRlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBJdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLSAqIEl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKQotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEl0ZXJhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVyYXRpb24gZXh0ZW5kcyBBY3Rpdml0eSB7Ci19IC8vIEl0ZXJhdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9LaW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0tpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwNDllMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0tpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5LaW5kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEtpbmQgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QXBwbGljYWJsZU1ldGFDbGFzc0luZm8+IGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLX0gLy8gS2luZApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9MZWFmRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9MZWFmRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjhmOWUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTGVhZkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxlYWYgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TGVhZkVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExlYWZFbGVtZW50IGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQgewotfSAvLyBMZWFmRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwZjBhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3cyA8ZW0+UHJvY2VzcyBWaWV3czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbnMgPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kQ29uZmlndXJhdGlvbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlld3M8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIFZpZXdzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRQcm9jZXNzVmlld3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVmYXVsdFZpZXcoQ29udGVudENhdGVnb3J5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRDYXRlZ29yeSBnZXREZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRWaWV3KENvbnRlbnRDYXRlZ29yeSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb25zKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0QWRkZWRDYXRlZ29yeSgpOwotCi19IC8vIE1ldGhvZENvbmZpZ3VyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjM3MGIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4KLSAqIE1ldGhvZCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gYWRkcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdmlhIHBhY2thZ2UgbWVyZ2UgdG8gTWV0aG9kIEVsZW1lbnQgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSBuZWVkZWQgZm9yIHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMgaW50cm9kdWNlcyBpbiB0aGlzIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEd1aWQgPGVtPkd1aWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlcyA8ZW0+T3duZWQgUnVsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZEVsZW1lbnQgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHdWlkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X0d1aWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGlkPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0R3VpZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEd1aWQgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkd1aWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEd1aWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk93bmVkIFJ1bGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3duZWQgUnVsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb25zdHJhaW50PiBnZXRPd25lZFJ1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfS2luZCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEtpbmQ+IGdldEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN1cHByZXNzZWQoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFN1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBwcmVzc2VkKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0T3JkZXJpbmdHdWlkZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZEVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2NiMDI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudFByb3BlcnR5IGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0ZTU4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZExpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2lucyA8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZExpYnJhcnkgZXh0ZW5kcyBNZXRob2RVbml0LCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2lucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0KLX0gLy8gTWV0aG9kTGlicmFyeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyNDExZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldEdsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UmV1c2VkUGFja2FnZXMgPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldENoaWxkUGFja2FnZXMgPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kUGFja2FnZSBleHRlbmRzIE1ldGhvZEVsZW1lbnQsCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEdsb2JhbChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRHbG9iYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHbG9iYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdsb2JhbChCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZFBhY2thZ2U+IGdldFJldXNlZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGlsZCBQYWNrYWdlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0Q2hpbGRQYWNrYWdlcygpOwotCi0JTWV0aG9kUGFja2FnZSBnZXRQYXJlbnRQYWNrYWdlKCk7Ci0KLX0gLy8gTWV0aG9kUGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkN2U4YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi0gKiBNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLSAqIFNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlcyA8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRCYXNlcyA8ZW0+QmFzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2lzU3VwcG9ydGluZyA8ZW0+U3VwcG9ydGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQbHVnaW4gZXh0ZW5kcyBNZXRob2RVbml0LCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRVc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRCYXNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwcG9ydGluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHN1cHBvcnRpbmcgbWV0aG9kIHBsdWctaW4gaXMgYSBwbHVnLWluIHRoYXQgY29udGFpbnMgc3VwcG9ydGluZyBhbmQgb3B0aW9uYWwgbWV0aG9kIGVsZW1lbnRzLiBPbmx5IHRoZSBlbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2VkIGZyb20gbm9uLXN1cHBvcnRpbmcgcGx1Zy1pbiBhcmUgdG8gYmUgY29uc2lkZXJlZCBmb3IgaW5jbHVzaW9uIGludG8gYSBtZXRob2QgY29uZmlndXJhdGlvbi4gSW4gb3RoZXIgd29yZHMsIGlmIGEgc3VwcG9ydGluZyBtZXRob2QgcGx1Zy1pbiBpcyBzZWxlY3RlZCBmb3IgYSBjb25maWd1cmF0aW9uIG9ubHkgaXRzIGVsZW1lbnRzIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlIG9mIHRoaXMgcGx1Zy1pbiB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBjb25maWd1cmF0aW9uLiAgQWxsIG90aGVyIHVucmVmZXJlbmNlZCBlbGVtZW50cyB3aWxsIG5vdCBiZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwcG9ydGluZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9TdXBwb3J0aW5nKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1N1cHBvcnRpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2lzU3VwcG9ydGluZyA8ZW0+U3VwcG9ydGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTdXBwb3J0aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBwb3J0aW5nKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIE1ldGhvZFBsdWdpbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RVbml0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5NjAyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kVW5pdCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQXV0aG9ycygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRob3JzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURhdGUoRGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EYXRlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGF0ZSBnZXRDaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKERhdGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X1ZlcnNpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29weXJpZ2h0U3RhdGVtZW50KFN1cHBvcnRpbmdNYXRlcmlhbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodFN0YXRlbWVudChTdXBwb3J0aW5nTWF0ZXJpYWwgdmFsdWUpOwotCi19IC8vIE1ldGhvZFVuaXQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWlsZXN0b25lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01pbGVzdG9uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2VjODcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWlsZXN0b25lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSNnZXRSZXF1aXJlZFJlc3VsdHMgPGVtPlJlcXVpcmVkIFJlc3VsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNaWxlc3RvbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWlsZXN0b25lIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcXVpcmVkIFJlc3VsdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldFJlcXVpcmVkUmVzdWx0cygpOwotfSAvLyBNaWxlc3RvbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZWRFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL05hbWVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTlkZjQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXROYW1lZEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkRWxlbWVudCBleHRlbmRzIEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudF9OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWVkRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lc3BhY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWFhMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVzcGFjZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZXNwYWNlIGV4dGVuZHMgTmFtZWRFbGVtZW50IHsKLX0gLy8gTmFtZXNwYWNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL091dGNvbWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvT3V0Y29tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTM1OTZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvT3V0Y29tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0T3V0Y29tZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRjb21lIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotfSAvLyBPdXRjb21lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQ0NjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQYWNrYWdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhY2thZ2UgZXh0ZW5kcyBOYW1lc3BhY2UsIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci19IC8vIFBhY2thZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk0N2U1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlYWJsZUVsZW1lbnQgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgewotfSAvLyBQYWNrYWdlYWJsZUVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGhhc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGhhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0MTAzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaGFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi0gKiBQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQaGFzZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQaGFzZSBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gUGhhc2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGxhbm5pbmdEYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BsYW5uaW5nRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmI5NzY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGxhbm5pbmdEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotICogUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotICogKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsgPGVtPlJhbms8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGEoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGxhbm5pbmdEYXRhIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0RGF0ZShEYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EYXRlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURhdGUgZ2V0U3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnREYXRlKERhdGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoRGF0ZShEYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGF0ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEYXRlIGdldEZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoRGF0ZShEYXRlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhbmsoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9SYW5rKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgZ2V0UmFuaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFuayhpbnQgdmFsdWUpOwotCi19IC8vIFBsYW5uaW5nRGF0YQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2ludC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBkYWU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9pbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRYIDxlbT5YPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkgPGVtPlk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2ludCgpCi0gKiBAbW9kZWwKLSAqIEBleHRlbmRzIElNb2RlbE9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvaW50IGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFgoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvaW50X1goKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WCA8ZW0+WDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0WCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0WChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRZKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2ludF9ZKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRZKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkgPGVtPlk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFkoRG91YmxlIHZhbHVlKTsKLQotfSAvLyBQb2ludApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2x5bGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2x5bGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTU1NmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUG9seWxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9seWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvbHlsaW5lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvbHlsaW5lIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xvc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsb3NlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9zZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsb3NlZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvbHlsaW5lX0Nsb3NlZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRDbG9zZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0Q2xvc2VkIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsb3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xvc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDbG9zZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldheXBvaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldheXBvaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2x5bGluZV9XYXlwb2ludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIGxvd2VyPSIyIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxQb2ludD4gZ2V0V2F5cG9pbnRzKCk7Ci0KLX0gLy8gUG9seWxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhMTcyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ByYWN0aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2VzIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2VzIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJhY3RpY2UgZXh0ZW5kcyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBQcmFjdGljZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxQcmFjdGljZT4gZ2V0U3ViUHJhY3RpY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50UmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QWN0aXZpdHk+IGdldEFjdGl2aXR5UmVmZXJlbmNlcygpOwotCi19IC8vIFByYWN0aWNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWJlNmQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByYWN0aWNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkZGl0aW9uYWxJbmZvKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmxlbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvYmxlbShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvYmxlbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2JsZW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2JsZW0oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhY2tncm91bmQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R29hbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHb2FscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R29hbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHb2FscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFwcGxpY2F0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJhY3RpY2VEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxZjg3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotICogQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotICogCi0gKiBQcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLgotICogVGhlc2UgY29uZmlndXJhdGlvbnMgZGVzY3JpYmUgdmFsaWQgY29udGV4dHMgZm9yIHRoZSBQcm9jZXNzIHdpdGhpbiBhIE1ldGhvZCBMaWJyYXJ5IGluZGljYXRpbmcgdW5kZXIgd2hpY2ggQ29uZmlndXJhdGlvbnMgYSBQcm9jZXNzIGlzIHdlbGwgZGVmaW5lZC4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm5zIDxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzIGV4dGVuZHMgQWN0aXZpdHkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBnZXRJbmNsdWRlc1BhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERlZmF1bHRDb250ZXh0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBnZXREZWZhdWx0Q29udGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRDb250ZXh0KE1ldGhvZENvbmZpZ3VyYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldFZhbGlkQ29udGV4dCgpOwotCi19IC8vIFByb2Nlc3MKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTNlZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi0gKiBVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50IGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2UsIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U+IGdldEludGVyZmFjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5ZmU0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5wcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldF9wcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnQgZ2V0X3Byb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0X3Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldF9wcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVkZWNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRhc2tEZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlSU8oKTsKLQotfSAvLyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExYTg5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY29wZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY29wZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VOb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVc2FnZU5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9jZXNzRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmI0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLSAqIFByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0VsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotfSAvLyBQcm9jZXNzRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRmFtaWx5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NGYW1pbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4YTA2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NGYW1pbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBGYW1pbHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5I2dldERlbGl2ZXJ5UHJvY2Vzc2VzIDxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRmFtaWx5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NGYW1pbHkgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4gZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKTsKLQotfSAvLyBQcm9jZXNzRmFtaWx5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzM1NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLSAqIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IGdldFByb2Nlc3NFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlhZ3JhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlhZ3JhbT4gZ2V0RGlhZ3JhbXMoKTsKLQotfSAvLyBQcm9jZXNzUGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY2NGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLSAqIEEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlZE9uUHJvY2Vzc2VzIDxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWQgT24gUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8b3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzPiBnZXRCYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLX0gLy8gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvcGVydHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0YTAyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldEtleSA8ZW0+S2V5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb3BlcnR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPktleTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LZXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEtleShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvcGVydHlfS2V5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0S2V5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldEtleSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LZXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2V5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWJhNWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlZmVyZW5jZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2UgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbihCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlZmVyZW5jZWQoRGlhZ3JhbUVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRSZWZlcmVuY2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InJlZmVyZW5jZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtRWxlbWVudCBnZXRSZWZlcmVuY2VkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VkKERpYWdyYW1FbGVtZW50IHZhbHVlKTsKLQotfSAvLyBSZWZlcmVuY2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVwb3J0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg3ZDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlcG9ydCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvcnQgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJlcG9ydApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JldXNhYmxlQXNzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxZGRhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JldXNhYmxlQXNzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi0gKiBob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJldXNhYmxlQXNzZXQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmV1c2FibGVBc3NldCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmV1c2FibGVBc3NldApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2FkbWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvYWRtYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwOTA1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvYWRtYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLSAqIEFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2FkbWFwKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvYWRtYXAgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJvYWRtYXAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDM2Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi0gKiBBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGUgZXh0ZW5kcyBDb250ZW50RWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kaWZpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlX01vZGlmaWVzKCkKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldE1vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0KLX0gLy8gUm9sZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzkwMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNraWxsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2tpbGxzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2tpbGxzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNraWxscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN5bm9ueW1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeW5vbnltcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lub255bXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lub255bXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeW5vbnltcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFJvbGVEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE3ZjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVEZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSb2xlKFJvbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZShSb2xlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kaWZpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpCi0JICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE1vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0KLX0gLy8gUm9sZURlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZVNldC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMjE0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAiQW5hbHlzdHMiIFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAiQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0IiwgIlN5c3RlbSBBbmFseXN0IiwgYXMgd2VsbCBhcyAiUmVxdWlyZW1lbnRzIFNwZWNpZmllciIgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0I2dldFJvbGVzIDxlbT5Sb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVNldCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0X1JvbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Um9sZT4gZ2V0Um9sZXMoKTsKLQotfSAvLyBSb2xlU2V0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0R3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxZjQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldCBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0cyA8ZW0+Um9sZSBTZXRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVTZXRHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBTZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGUgU2V0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGUgU2V0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlU2V0PiBnZXRSb2xlU2V0cygpOwotCi19IC8vIFJvbGVTZXRHcm91cGluZwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjM2UxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuCi0gKiBTZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiAKLSAqIEZvciBleGFtcGxlLCB3aGVuIGEgVGFzayBjb250cmlidXRlcyB0byBhbm90aGVyIFRhc2sgaXRzIFByZXNlbnRhdGlvbiBhc3NvY2lhdGlvbiBpcyBjb250cmlidXRlZCBpbmNsdWRpbmcgaXRzIFNlY3Rpb25zIChpLmUuIGl0cyBTdGVwcyksIHdoaWNoIGFyZSBtb2RlbGVkIGFzIHBhcnRzIG9mIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgU2VjdGlvbnMgY2FuIGJlIG5lc3RlZCBhbmQgdGhlcmVmb3JlIFRhc2sgRGVzY3JpcHRpb25zIGNhbiBiZSBmbGV4aWJseSBvcmdhbml6ZWQgaW4gU3RlcHMgd2l0aCBzdWItU3RlcHMuICBTZWN0aW9ucyBhcmUgVmFyaWFiaWxpdHkgRWxlbWVudHMgdGhlbXNlbHZlcywgc28gdGhleSBjYW4gY29udHJpYnV0ZSB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBtb2RlbCBhIFRhc2sgc3RlcCBhcyBhIFNlY3Rpb24gaW5zdGFuY2Ugd2l0aG91dCByZWxhdGluZyBpdCB0byBhIFRhc2sgRGVzY3JpcHRpb24gdGhhdCBkaXJlY3RseSBjb250cmlidXRlcyB0byAob3IgcmVwbGFjZXMpIGFub3RoZXIgU2VjdGlvbiB3aGljaCBpcyBwYXJ0IG9mIGEgVGFzayBEZXNjcmlwdGlvbi4gIFRoaXMgY29udHJpYnV0aW9uIChvciByZXBsYWNlbWVudCkgd291bGQgYWRkIG5ldyBkZXNjcmlwdGlvbiB0ZXh0IHRvIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uIChvciByZXBsYWNlIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uKS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSB0byBjb250cmlidXRlIG5ldyBDaGVjayBMaXN0IGl0ZW1zIG9yZ2FuaXplZCBhcyBTZWN0aW9ucyB0byBhbiBleGlzdGluZyBDaGVjayBMaXN0IChkZWZpbmVkIGFzIGd1aWRhbmNlKS4gIAotICogCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25EZXNjcmlwdGlvbiA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb25zIDxlbT5TdWIgU2VjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3Rpb24gZXh0ZW5kcyBWYXJpYWJpbGl0eUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZWN0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlY3Rpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb24gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY3Rpb25EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdGlvbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU3ViU2VjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFNlY3Rpb24+IGdldFN1YlNlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZWRlY2Vzc29yKFNlY3Rpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN0aW9uIGdldFByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWRlY2Vzc29yKFNlY3Rpb24gdmFsdWUpOwotCi19IC8vIFNlY3Rpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMDQ2NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsIDxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsCi0JICogQG1vZGVsIG9wcG9zaXRlPSJzZW1hbnRpY01vZGVsIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERpYWdyYW0oRGlhZ3JhbSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ibmFtZXNwYWNlIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaWFncmFtKERpYWdyYW0gdmFsdWUpOwotCi19IC8vIFNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmYmEwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgSW5mbzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVJbmZvKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGVJbmZvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZUluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGVJbmZvKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3RlcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjYyMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdGVwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuCi0gKiBBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U3RlcCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdGVwIGV4dGVuZHMgU2VjdGlvbiwgV29ya0RlZmluaXRpb24gewotfSAvLyBTdGVwCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxMmEzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdXBwb3J0aW5nTWF0ZXJpYWwgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFN1cHBvcnRpbmdNYXRlcmlhbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzYjMwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLSAqIEEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotICogQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi0gKiBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LgotICogCi0gKiBUaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFRhc2sgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFN0ZXBzIDxlbT5TdGVwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgZXh0ZW5kcyBDb250ZW50RWxlbWVudCwgV29ya0RlZmluaXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfUGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlPiBnZXRQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0PiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PdXRwdXQoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdD4gZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlPiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0ZXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RlcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19TdGVwcygpCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFN0ZXA+IGdldFN0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfVG9vbE1lbnRvcnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUb29sTWVudG9yPiBnZXRUb29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotfSAvLyBUYXNrCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllZTU1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVycG9zZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBUYXNrRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZjc4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIEEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotICogCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTZWxlY3RlZFN0ZXBzIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQsIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFzayhUYXNrKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1Rhc2soKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2soVGFzayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRBc3Npc3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE91dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Um9sZURlc2NyaXB0b3I+IGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWxlY3RlZCBTdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWxlY3RlZCBTdGVwczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxTZWN0aW9uPiBnZXRTZWxlY3RlZFN0ZXBzKCk7Ci0KLX0gLy8gVGFza0Rlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVhbVByb2ZpbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVhbVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1NjdlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlYW1Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZWFtIFByb2ZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi0gKiBXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi0gKiBIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFRlYW1Sb2xlcyA8ZW0+VGVhbSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZWFtUHJvZmlsZSBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlYW0gUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlYW0gUm9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZWFtIFJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRUZWFtUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIFRlYW08L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3VwZXJUZWFtKFRlYW1Qcm9maWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InN1YlRlYW0iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVhbVByb2ZpbGUgZ2V0U3VwZXJUZWFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3VwZXJUZWFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgVGVhbTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1YlRlYW0oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InN1cGVyVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8VGVhbVByb2ZpbGU+IGdldFN1YlRlYW0oKTsKLQotfSAvLyBUZWFtUHJvZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZW1wbGF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGFkYzQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVtcGxhdGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVtcGxhdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlbXBsYXRlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3M2VkY2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVybSBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZXJtRGVmaW5pdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXJtRGVmaW5pdGlvbiBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVGVybURlZmluaXRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGV4dEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGV4dEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlMTExOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RleHRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGV4dEVsZW1lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dEVsZW1lbnQgZXh0ZW5kcyBMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGV4dChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGV4dEVsZW1lbnRfVGV4dCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRleHRFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2wuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE0ZDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUb29sKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2wgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbF9Ub29sTWVudG9ycygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCk7Ci0KLX0gLy8gVG9vbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Ub29sTWVudG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2xNZW50b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2ZTk1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2xNZW50b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRvb2xNZW50b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG9vbE1lbnRvciBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVG9vbE1lbnRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzY2VhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VHlwZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZSBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci19IC8vIFR5cGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTAwMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQgdmFsdWUpOwotCi19IC8vIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTNhMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVbWFGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgY3JlYXRlUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGNyZWF0ZUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUtpbmQgY3JlYXRlS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gY3JlYXRlU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGNyZWF0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBjcmVhdGVUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0ZXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0ZXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0ZXAgY3JlYXRlU3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdCBjcmVhdGVXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GdWxmaWxsYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GdWxmaWxsYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGdWxmaWxsYWJsZUVsZW1lbnQgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Y29tZSBjcmVhdGVPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRhbmNlRGVzY3JpcHRpb24gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGhhc2UgY3JlYXRlUGhhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlYW1Qcm9maWxlIGNyZWF0ZVRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrT3JkZXIgY3JlYXRlV29ya09yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBsYW5uaW5nRGF0YSBjcmVhdGVQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3Rpdml0eURlc2NyaXB0aW9uIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbmNlcHQgY3JlYXRlQ29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRlbGluZSBjcmVhdGVHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVwb3J0IGNyZWF0ZVJlcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN1cHBvcnRpbmdNYXRlcmlhbCBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUb29sTWVudG9yIGNyZWF0ZVRvb2xNZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldCBjcmVhdGVSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb21haW4gY3JlYXRlRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2wgY3JlYXRlVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnQgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc1BhY2thZ2UgY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0ZhbWlseSBjcmVhdGVQcm9jZXNzRmFtaWx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgY3JlYXRlUG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpYWdyYW1MaW5rIGNyZWF0ZURpYWdyYW1MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaENvbm5lY3RvciBjcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaW1lbnNpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGltZW5zaW9uIGNyZWF0ZURpbWVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVmZXJlbmNlIGNyZWF0ZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWRnZSBjcmVhdGVHcmFwaEVkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBjcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGV4dEVsZW1lbnQgY3JlYXRlVGV4dEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbWFnZSBjcmVhdGVJbWFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9seWxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvbHlsaW5lIGNyZWF0ZVBvbHlsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVsbGlwc2UgY3JlYXRlRWxsaXBzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGdldFVtYVBhY2thZ2UoKTsKLQotfSAvL1VtYUZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZGIzMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDk3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogMDYKLSAqIDA1Ci0gKiAwNAotICogMDMKLSAqIDAxCi0gKiAwMgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAidW1hIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41L3VtYS5lY29yZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYudW1hIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVMRU1FTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVF9fTkFNRSA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FID0gTkFNRURfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UeXBlSW1wbCA8ZW0+VHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRZUEVfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFlQRV9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsIDxlbT5DbGFzc2lmaWVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2xhc3NpZmllcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTEFTU0lGSUVSID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NJRklFUl9fTkFNRSA9IFRZUEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU0lGSUVSX19JU19BQlNUUkFDVCA9IFRZUEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2xhc3NpZmllcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU0lGSUVSX0ZFQVRVUkVfQ09VTlQgPSBUWVBFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFX19OQU1FID0gTkFNRURfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZUltcGwgPGVtPlBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBQ0tBR0UgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFX19OQU1FID0gTkFNRVNQQUNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTkFNRVNQQUNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0dVSUQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0tJTkQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CT0RZID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fS0lORCA9IE1FVEhPRF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsIDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVCA9IDE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1VJRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fS0lORCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsIDxlbT5LaW5kPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBLSU5EID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0tJTkQgPSBDT05URU5UX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19BVVRIT1JTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19WRVJTSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT04gPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORCA9IE1FVEhPRF9VTklUX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFQ1RJT04gPSAxNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsIDxlbT5Sb2xlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1QgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwgPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT04gPSAzNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsIDxlbT5TdGVwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RlcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEVQID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGwgPGVtPkd1aWRhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19LSU5EID0gQ09OVEVOVF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19FWEFNUExFUyA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1QgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkZ1bGZpbGxhYmxlRWxlbWVudEltcGwgPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRnVsZmlsbGFibGVFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJBQkxFID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbCA8ZW0+T3V0Y29tZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE91dGNvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUQ09NRSA9IDM0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRSA9IDYzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04gPSA0MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSA0MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT04gPSA0MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTiA9IDQ0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTiA9IDQ1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTiA9IDQ2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsIDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVCA9IDU0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWSA9IDUzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEl0ZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJVEVSQVRJT04gPSA2ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGhhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEhBU0UgPSA2OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCA8ZW0+VGVhbSBQcm9maWxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRSA9IDcwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1IgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUiA9IDcxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVIgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1IgPSA3MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEUgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSA4MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT04gPSA4MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IDgzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSA4NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsIDxlbT5Db25jZXB0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uY2VwdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05DRVBUID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDSEVDS0xJU1QgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWEFNUExFID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsIDxlbT5HdWlkZWxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlERUxJTkUgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsIDxlbT5SZXBvcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVwb3J0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVBPUlQgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbCA8ZW0+VGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVNUExBVEUgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX0tJTkQgPSBNRVRIT0RfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX05BTUUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19HVUlEID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFZBUklBQklMSVRZX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19PV05FRF9SVUxFUyA9IFZBUklBQklMSVRZX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFZBUklBQklMSVRZX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0tJTkQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TVVBQUkVTU0VEID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX09SREVSSU5HX0dVSURFID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TRUNUSU9OX05BTUUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NVQl9TRUNUSU9OUyA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19QUkVERUNFU1NPUiA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwgPGVtPlRvb2wgTWVudG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUT09MX01FTlRPUiA9IDMxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwgPGVtPldoaXRlcGFwZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXaGl0ZXBhcGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdISVRFUEFQRVIgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbCA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlcm1EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTiA9IDI0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsIDxlbT5QcmFjdGljZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRSA9IDgwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVCA9IDIzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUlkgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbCA8ZW0+Um9sZSBTZXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsIDxlbT5Eb21haW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET01BSU4gPSA0OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbCA8ZW0+VG9vbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTCA9IDYwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElORyA9IDYxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTUyA9IDc1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1MgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbCA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTiA9IDc2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0FETUFQID0gNTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0UgPSA4ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlQgPSA4NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IDEwMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SID0gODY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTiA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fTkFNRSA9IENMQVNTSUZJRVJfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfQUJTVFJBQ1QgPSBDTEFTU0lGSUVSX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiA9IENMQVNTSUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fRkVBVFVSRV9DT1VOVCA9IENMQVNTSUZJRVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PV05FRF9SVUxFUyA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fS0lORCA9IENPTlRFTlRfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HVUlERUxJTkVTID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0ZVTEZJTExTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVQT1JUUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVEVNUExBVEVTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HVUlEID0gV09SS19QUk9EVUNUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0tJTkQgPSBXT1JLX1BST0RVQ1RfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ0hFQ0tMSVNUUyA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0VYQU1QTEVTID0gV09SS19QUk9EVUNUX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19BU1NFVFMgPSBXT1JLX1BST0RVQ1RfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1RFUk1ERUZJTklUSU9OID0gV09SS19QUk9EVUNUX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0ZVTEZJTExTID0gV09SS19QUk9EVUNUX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVQT1JUUyA9IFdPUktfUFJPRFVDVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19URU1QTEFURVMgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19UT09MX01FTlRPUlMgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fR1VJRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklCQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19LSU5EID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HVUlEID0gV09SS19QUk9EVUNUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0tJTkQgPSBXT1JLX1BST0RVQ1RfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ0hFQ0tMSVNUUyA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0VYQU1QTEVTID0gV09SS19QUk9EVUNUX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19BU1NFVFMgPSBXT1JLX1BST0RVQ1RfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1RFUk1ERUZJTklUSU9OID0gV09SS19QUk9EVUNUX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0ZVTEZJTExTID0gV09SS19QUk9EVUNUX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUkVQT1JUUyA9IFdPUktfUFJPRFVDVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19URU1QTEFURVMgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19UT09MX01FTlRPUlMgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dVSUQgPSBXT1JLX1BST0RVQ1RfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX09XTkVEX1JVTEVTID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0tJTkQgPSBXT1JLX1BST0RVQ1RfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU0hBUEVJQ09OID0gV09SS19QUk9EVUNUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19DT05DRVBUU19BTkRfUEFQRVJTID0gV09SS19QUk9EVUNUX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NIRUNLTElTVFMgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVhBTVBMRVMgPSBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQVNTRVRTID0gV09SS19QUk9EVUNUX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1RFUk1ERUZJTklUSU9OID0gV09SS19QUk9EVUNUX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRlVMRklMTFMgPSBXT1JLX1BST0RVQ1RfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1JFUE9SVFMgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19URU1QTEFURVMgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1RPT0xfTUVOVE9SUyA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3V0Y29tZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX05BTUUgPSBTRUNUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19HVUlEID0gU0VDVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1BSRVNFTlRBVElPTl9OQU1FID0gU0VDVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19CUklFRl9ERVNDUklQVElPTiA9IFNFQ1RJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19PV05FRF9SVUxFUyA9IFNFQ1RJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFNFQ1RJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX0tJTkQgPSBTRUNUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19TVVBQUkVTU0VEID0gU0VDVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX09SREVSSU5HX0dVSURFID0gU0VDVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1ZBUklBQklMSVRZX1RZUEUgPSBTRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19TRUNUSU9OX05BTUUgPSBTRUNUSU9OX19TRUNUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1NFQ1RJT05fREVTQ1JJUFRJT04gPSBTRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fU1VCX1NFQ1RJT05TID0gU0VDVElPTl9fU1VCX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fUFJFREVDRVNTT1IgPSBTRUNUSU9OX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19QUkVDT05ESVRJT04gPSBTRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19QT1NUQ09ORElUSU9OID0gU0VDVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfRkVBVFVSRV9DT1VOVCA9IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fS0lORCA9IE1FVEhPRF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05BTUUgPSBDT05DRVBUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HVUlEID0gQ09OQ0VQVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19CUklFRl9ERVNDUklQVElPTiA9IENPTkNFUFRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PV05FRF9SVUxFUyA9IENPTkNFUFRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTkNFUFRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0tJTkQgPSBDT05DRVBUX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TVVBQUkVTU0VEID0gQ09OQ0VQVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX09SREVSSU5HX0dVSURFID0gQ09OQ0VQVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19JU19BQlNUUkFDVCA9IENPTkNFUFRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTiA9IENPTkNFUFRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TSEFQRUlDT04gPSBDT05DRVBUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19OT0RFSUNPTiA9IENPTkNFUFRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19WQVJJQUJJTElUWV9UWVBFID0gQ09OQ0VQVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTkNFUFRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OQ0VQVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTkNFUFRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQ0hFQ0tMSVNUUyA9IENPTkNFUFRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fR1VJREVMSU5FUyA9IENPTkNFUFRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0VYQU1QTEVTID0gQ09OQ0VQVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19BU1NFVFMgPSBDT05DRVBUX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1RFUk1ERUZJTklUSU9OID0gQ09OQ0VQVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX0ZFQVRVUkVfQ09VTlQgPSBDT05DRVBUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PV05FRF9SVUxFUyA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19LSU5EID0gQ09OVEVOVF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QT1NUQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUEVSRk9STUVEX0JZID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTUFOREFUT1JZX0lOUFVUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1VUUFVUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09QVElPTkFMX0lOUFVUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVEVQUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RPT0xfTUVOVE9SUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fS0lORCA9IENPTlRFTlRfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HVUlERUxJTkVTID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19FWEFNUExFUyA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19BU1NFVFMgPSBDT05URU5UX0VMRU1FTlRfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19GVUxGSUxMUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTU9ESUZJRVMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19SRVNQT05TSUJMRV9GT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0lORCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19HVUlEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0tJTkQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19OQU1FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fR1VJRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19LSU5EID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19LSU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19HVUlEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0tJTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19HVUlEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fS0lORCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19LSU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUyA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19LSU5EID0gQ09OVEVOVF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19LSU5EID0gQ09OVEVOVF9DQVRFR09SWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUk9MRVMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgU2V0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0tJTkQgPSBDT05URU5UX0NBVEVHT1JZX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19XT1JLX1BST0RVQ1RTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVQkRPTUFJTlMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvbWFpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19LSU5EID0gQ09OVEVOVF9DQVRFR09SWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVEFTS1MgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YmRpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19HVUlEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19LSU5EID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fS0lORCA9IFBST0NFU1NfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fS0lORCA9IEJSRUFLRE9XTl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SID0gQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HVUlEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PV05FRF9SVUxFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fS0lORCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX0FCU1RSQUNUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19DSEVDS0xJU1RTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0NPTkNFUFRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19FWEFNUExFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HVUlERUxJTkVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1RFTVBMQVRFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUkVQT1JUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19UT09MTUVOVE9SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19GVUxGSUxMUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUE9TVENPTkRJVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JPQURNQVBTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fR1VJRCA9IFBST0NFU1NfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1dORURfUlVMRVMgPSBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fS0lORCA9IFBST0NFU1NfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU1VQUFJFU1NFRCA9IFBST0NFU1NfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05PREVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19SQU5LID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19HVUlEID0gUFJPQ0VTU19FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19PV05FRF9SVUxFUyA9IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19LSU5EID0gUFJPQ0VTU19FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0xJTktfVFlQRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fUFJFRCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9hZG1hcDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1RPT0xfTUVOVE9SUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlEID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19PV05FRF9SVUxFUyA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0VYQU1QTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0tJTkQgPSBDT05URU5UX0NBVEVHT1JZX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBDYXRlZ29yaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fS0lORCA9IE1FVEhPRF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HVUlEID0gTUVUSE9EX1BBQ0tBR0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PV05FRF9SVUxFUyA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0tJTkQgPSBNRVRIT0RfUEFDS0FHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HVUlEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19PV05FRF9SVUxFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19LSU5EID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTk9ERUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19QTEFOTkVEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5URURfQkVGT1JFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBFUl9BQ1RJVklUSUVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0NIRUNLTElTVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0NPTkNFUFRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fRVhBTVBMRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dVSURFTElORVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVVTQUJMRV9BU1NFVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fVEVNUExBVEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUkVQT1JUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1RPT0xNRU5UT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTElOS19UT19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19PUFRJT05BTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0NIRUNLTElTVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQ09OQ0VQVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0VYQU1QTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dVSURFTElORVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fVEVNUExBVEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19SRVBPUlRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1RPT0xNRU5UT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HVUlEID0gREVTQ1JJUFRPUl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PV05FRF9SVUxFUyA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fS0lORCA9IERFU0NSSVBUT1JfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19DSEVDS0xJU1RTID0gREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0NPTkNFUFRTID0gREVTQ1JJUFRPUl9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWEFNUExFUyA9IERFU0NSSVBUT1JfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HVUlERUxJTkVTID0gREVTQ1JJUFRPUl9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFMgPSBERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1RFTVBMQVRFUyA9IERFU0NSSVBUT1JfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVQT1JUUyA9IERFU0NSSVBUT1JfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19UT09MTUVOVE9SID0gREVTQ1JJUFRPUl9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1VJRCA9IEFDVElWSVRZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19LSU5EID0gQUNUSVZJVFlfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfQUJTVFJBQ1QgPSBBQ1RJVklUWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUExBTk5JTkdfREFUQSA9IEFDVElWSVRZX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUEVSX0FDVElWSVRJRVMgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0NIRUNLTElTVFMgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DT05DRVBUUyA9IEFDVElWSVRZX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19FWEFNUExFUyA9IEFDVElWSVRZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dVSURFTElORVMgPSBBQ1RJVklUWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUkVVU0FCTEVfQVNTRVRTID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVEVNUExBVEVTID0gQUNUSVZJVFlfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1JFUE9SVFMgPSBBQ1RJVklUWV9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1RPT0xNRU5UT1IgPSBBQ1RJVklUWV9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19SRVBFQVRBQkxFID0gQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0xJTktfVE9fUFJFREVDRVNTT1IgPSBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19GVUxGSUxMUyA9IEFDVElWSVRZX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSRUFLRE9XTl9FTEVNRU5UUyA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUk9BRE1BUFMgPSBBQ1RJVklUWV9fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SXRlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HVUlEID0gQUNUSVZJVFlfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19PV05FRF9SVUxFUyA9IEFDVElWSVRZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19LSU5EID0gQUNUSVZJVFlfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfQUJTVFJBQ1QgPSBBQ1RJVklUWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBFUl9BQ1RJVklUSUVTID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0NIRUNLTElTVFMgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0NPTkNFUFRTID0gQUNUSVZJVFlfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fRVhBTVBMRVMgPSBBQ1RJVklUWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dVSURFTElORVMgPSBBQ1RJVklUWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19SRVVTQUJMRV9BU1NFVFMgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVEVNUExBVEVTID0gQUNUSVZJVFlfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUkVQT1JUUyA9IEFDVElWSVRZX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1RPT0xNRU5UT1IgPSBBQ1RJVklUWV9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTElOS19UT19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fRlVMRklMTFMgPSBBQ1RJVklUWV9fRlVMRklMTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJFQUtET1dOX0VMRU1FTlRTID0gQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1JPQURNQVBTID0gQUNUSVZJVFlfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBoYXNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0NIRUNLTElTVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19DT05DRVBUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19FWEFNUExFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dVSURFTElORVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUkVVU0FCTEVfQVNTRVRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fVEVNUExBVEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1JFUE9SVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1RPT0xNRU5UT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZWFtIFJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBUZWFtPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VCX1RFQU0gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HVUlEID0gREVTQ1JJUFRPUl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19PV05FRF9SVUxFUyA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19LSU5EID0gREVTQ1JJUFRPUl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0NIRUNLTElTVFMgPSBERVNDUklQVE9SX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0NPTkNFUFRTID0gREVTQ1JJUFRPUl9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fRVhBTVBMRVMgPSBERVNDUklQVE9SX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0dVSURFTElORVMgPSBERVNDUklQVE9SX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFMgPSBERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fVEVNUExBVEVTID0gREVTQ1JJUFRPUl9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVQT1JUUyA9IERFU0NSSVBUT1JfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IERFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1RPT0xNRU5UT1IgPSBERVNDUklQVE9SX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JPTEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dVSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0tJTkQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFRklYID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQ09OQ0VQVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19FWEFNUExFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1VJREVMSU5FUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19URU1QTEFURVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19SRVBPUlRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fVE9PTE1FTlRPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19MSU5LX1RPX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIFN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX05BTUUgPSBST0xFX0RFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HVUlEID0gUk9MRV9ERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19CUklFRl9ERVNDUklQVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19PV05FRF9SVUxFUyA9IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFJPTEVfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0tJTkQgPSBST0xFX0RFU0NSSVBUT1JfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBQUkVTU0VEID0gUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09SREVSSU5HX0dVSURFID0gUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19BQlNUUkFDVCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TSEFQRUlDT04gPSBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19OT0RFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRUZJWCA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfUExBTk5FRCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfT1BUSU9OQUwgPSBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQUZURVIgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QTEFOTklOR19EQVRBID0gUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fU1VQRVJfQUNUSVZJVElFUyA9IFJPTEVfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQ0hFQ0tMSVNUUyA9IFJPTEVfREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0NPTkNFUFRTID0gUk9MRV9ERVNDUklQVE9SX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0VYQU1QTEVTID0gUk9MRV9ERVNDUklQVE9SX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1VJREVMSU5FUyA9IFJPTEVfREVTQ1JJUFRPUl9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVVTQUJMRV9BU1NFVFMgPSBST0xFX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUk9MRV9ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19URU1QTEFURVMgPSBST0xFX0RFU0NSSVBUT1JfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUkVQT1JUUyA9IFJPTEVfREVTQ1JJUFRPUl9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBST0xFX0RFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fVE9PTE1FTlRPUiA9IFJPTEVfREVTQ1JJUFRPUl9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gUk9MRV9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19ST0xFID0gUk9MRV9ERVNDUklQVE9SX19ST0xFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTU9ESUZJRVMgPSBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1VJRCA9IEFDVElWSVRZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0tJTkQgPSBBQ1RJVklUWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19BQlNUUkFDVCA9IEFDVElWSVRZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUExBTk5JTkdfREFUQSA9IEFDVElWSVRZX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQ0hFQ0tMSVNUUyA9IEFDVElWSVRZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DT05DRVBUUyA9IEFDVElWSVRZX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fRVhBTVBMRVMgPSBBQ1RJVklUWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1VJREVMSU5FUyA9IEFDVElWSVRZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19URU1QTEFURVMgPSBBQ1RJVklUWV9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JFUE9SVFMgPSBBQ1RJVklUWV9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVE9PTE1FTlRPUiA9IEFDVElWSVRZX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19SRVBFQVRBQkxFID0gQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FVkVOVF9EUklWRU4gPSBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fRlVMRklMTFMgPSBBQ1RJVklUWV9fRlVMRklMTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JPQURNQVBTID0gQUNUSVZJVFlfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1VJRCA9IFBST0NFU1NfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fT1dORURfUlVMRVMgPSBQUk9DRVNTX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19LSU5EID0gUFJPQ0VTU19fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1NVUEVSX0FDVElWSVRJRVMgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NIRUNLTElTVFMgPSBQUk9DRVNTX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT05DRVBUUyA9IFBST0NFU1NfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FWEFNUExFUyA9IFBST0NFU1NfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dVSURFTElORVMgPSBQUk9DRVNTX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTID0gUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVEVNUExBVEVTID0gUFJPQ0VTU19fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1JFUE9SVFMgPSBQUk9DRVNTX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gUFJPQ0VTU19fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1RPT0xNRU5UT1IgPSBQUk9DRVNTX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19GVUxGSUxMUyA9IFBST0NFU1NfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUk9BRE1BUFMgPSBQUk9DRVNTX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMgPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HVUlEID0gUFJPQ0VTU19fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19PV05FRF9SVUxFUyA9IFBST0NFU1NfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19LSU5EID0gUFJPQ0VTU19fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBFUl9BQ1RJVklUSUVTID0gUFJPQ0VTU19fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NIRUNLTElTVFMgPSBQUk9DRVNTX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NPTkNFUFRTID0gUFJPQ0VTU19fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRVhBTVBMRVMgPSBQUk9DRVNTX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dVSURFTElORVMgPSBQUk9DRVNTX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVEVNUExBVEVTID0gUFJPQ0VTU19fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUkVQT1JUUyA9IFBST0NFU1NfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1RPT0xNRU5UT1IgPSBQUk9DRVNTX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX1JFUEVBVEFCTEUgPSBQUk9DRVNTX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTElOS19UT19QUkVERUNFU1NPUiA9IFBST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRlVMRklMTFMgPSBQUk9DRVNTX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUNPTkRJVElPTiA9IFBST0NFU1NfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJFQUtET1dOX0VMRU1FTlRTID0gUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1JPQURNQVBTID0gUFJPQ0VTU19fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSU5DTFVERVNfUEFUVEVSTlMgPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBTElEX0NPTlRFWFQgPSBQUk9DRVNTX19WQUxJRF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19LSU5EID0gTUVUSE9EX1VOSVRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlld3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0dVSUQgPSBNRVRIT0RfVU5JVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1VOSVRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09XTkVEX1JVTEVTID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19LSU5EID0gTUVUSE9EX1VOSVRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19CQVNFUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19TVVBQT1JUSU5HID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTkFNRSA9IFBST0NFU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dVSUQgPSBQUk9DRVNTX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fS0lORCA9IFBST0NFU1NfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05PREVJQ09OID0gUFJPQ0VTU19fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFRklYID0gUFJPQ0VTU19fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBFUl9BQ1RJVklUSUVTID0gUFJPQ0VTU19fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19DSEVDS0xJU1RTID0gUFJPQ0VTU19fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQ09OQ0VQVFMgPSBQUk9DRVNTX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fRVhBTVBMRVMgPSBQUk9DRVNTX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HVUlERUxJTkVTID0gUFJPQ0VTU19fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1JFVVNBQkxFX0FTU0VUUyA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1RFTVBMQVRFUyA9IFBST0NFU1NfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19SRVBPUlRTID0gUFJPQ0VTU19fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19UT09MTUVOVE9SID0gUFJPQ0VTU19fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX0VWRU5UX0RSSVZFTiA9IFBST0NFU1NfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19MSU5LX1RPX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fRlVMRklMTFMgPSBQUk9DRVNTX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFSSUFCSUxJVFlfVFlQRSA9IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRUNPTkRJVElPTiA9IFBST0NFU1NfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUE9TVENPTkRJVElPTiA9IFBST0NFU1NfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CUkVBS0RPV05fRUxFTUVOVFMgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1JPQURNQVBTID0gUFJPQ0VTU19fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lOQ0xVREVTX1BBVFRFUk5TID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fREVGQVVMVF9DT05URVhUID0gUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBTElEX0NPTlRFWFQgPSBQUk9DRVNTX19WQUxJRF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VkIE9uIFByb2Nlc3NlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HVUlEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0lORCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG93dG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fR1VJRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0tJTkQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fR1VJRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19LSU5EID0gUFJPQ0VTU19ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJpc2sgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0tJTkQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fR1VJRCA9IERFU0NSSVBUT1JfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fT1dORURfUlVMRVMgPSBERVNDUklQVE9SX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19LSU5EID0gREVTQ1JJUFRPUl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVGSVggPSBERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0NIRUNLTElTVFMgPSBERVNDUklQVE9SX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19DT05DRVBUUyA9IERFU0NSSVBUT1JfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19FWEFNUExFUyA9IERFU0NSSVBUT1JfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0dVSURFTElORVMgPSBERVNDUklQVE9SX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVRTID0gREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fVEVNUExBVEVTID0gREVTQ1JJUFRPUl9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1JFUE9SVFMgPSBERVNDUklQVE9SX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1RPT0xNRU5UT1IgPSBERVNDUklQVE9SX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5wcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dVSUQgPSBNRVRIT0RfUEFDS0FHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEVTID0gTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fS0lORCA9IE1FVEhPRF9QQUNLQUdFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUyA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19OQU1FID0gUFJPQ0VTU19QQUNLQUdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fR1VJRCA9IFBST0NFU1NfUEFDS0FHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fT1dORURfUlVMRVMgPSBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19LSU5EID0gUFJPQ0VTU19QQUNLQUdFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fU1VQUFJFU1NFRCA9IFBST0NFU1NfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dMT0JBTCA9IFBST0NFU1NfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1JFVVNFRF9QQUNLQUdFUyA9IFBST0NFU1NfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hJTERfUEFDS0FHRVMgPSBQUk9DRVNTX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTX0VMRU1FTlRTID0gUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fRElBR1JBTVMgPSBQUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVMgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbCA8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRmFtaWx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZID0gMTExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWSA9IDExMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbCA8ZW0+UG9pbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUE9JTlQgPSA5NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCA8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVCA9IDkyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX0tJTkQgPSBNRVRIT0RfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UID0gOTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0tJTkQgPSBESUFHUkFNX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0xJTksgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJQUdSQU1fTElOSyA9IDk2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SID0gOTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0UgPSA5OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwgPGVtPkRpbWVuc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGltZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJTUVOU0lPTiA9IDEwMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwgPGVtPlJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFRkVSRU5DRSA9IDkzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsIDxlbT5Qcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9QRVJUWSA9IDk0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbCA8ZW0+R3JhcGggRWRnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBIX0VER0UgPSA5ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwgPGVtPkdyYXBoIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUkFQSF9OT0RFID0gOTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX05BTUUgPSBHUkFQSF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19HVUlEID0gR1JBUEhfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19PV05FRF9SVUxFUyA9IEdSQVBIX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0tJTkQgPSBHUkFQSF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19TVVBQUkVTU0VEID0gR1JBUEhfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX09SREVSSU5HX0dVSURFID0gR1JBUEhfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0lTX1ZJU0lCTEUgPSBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19DT05UQUlORVIgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19SRUZFUkVOQ0UgPSBHUkFQSF9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19DT05UQUlORUQgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19QT1NJVElPTiA9IEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0xJTksgPSBHUkFQSF9FTEVNRU5UX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQU5DSE9SQUdFID0gR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fU0VNQU5USUNfTU9ERUwgPSBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fU0laRSA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwgPGVtPkRpYWdyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJQUdSQU0gPSA4OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fTkFNRSA9IEdSQVBIX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0dVSUQgPSBHUkFQSF9OT0RFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHUkFQSF9OT0RFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhfTk9ERV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX09XTkVEX1JVTEVTID0gR1JBUEhfTk9ERV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhfTk9ERV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fS0lORCA9IEdSQVBIX05PREVfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1NVUFBSRVNTRUQgPSBHUkFQSF9OT0RFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSF9OT0RFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fSVNfVklTSUJMRSA9IEdSQVBIX05PREVfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0NPTlRBSU5FUiA9IEdSQVBIX05PREVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1JFRkVSRU5DRSA9IEdSQVBIX05PREVfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fUFJPUEVSVFkgPSBHUkFQSF9OT0RFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0NPTlRBSU5FRCA9IEdSQVBIX05PREVfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1BPU0lUSU9OID0gR1JBUEhfTk9ERV9fUE9TSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fTElOSyA9IEdSQVBIX05PREVfX0xJTks7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19BTkNIT1JBR0UgPSBHUkFQSF9OT0RFX19BTkNIT1JBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19TRU1BTlRJQ19NT0RFTCA9IEdSQVBIX05PREVfX1NFTUFOVElDX01PREVMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19TSVpFID0gR1JBUEhfTk9ERV9fU0laRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIExpbms8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0RJQUdSQU1fTElOSyA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fTkFNRVNQQUNFID0gR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fWk9PTSA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vmlld3BvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fVklFV1BPSU5UID0gR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19QUkVTRU5UQVRJT05fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fS0lORCA9IERJQUdSQU1fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fUkVGRVJFTkNFRCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19QUkVTRU5UQVRJT05fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19LSU5EID0gRElBR1JBTV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0tFWSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19WQUxVRSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0lOVF9fWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPSU5UX19ZID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb2ludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0lOVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1BSRVNFTlRBVElPTl9OQU1FID0gRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19LSU5EID0gRElBR1JBTV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fWk9PTSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9ydDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fVklFV1BPUlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fRElBR1JBTSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaWFncmFtIExpbms8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fR1VJRCA9IEdSQVBIX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fT1dORURfUlVMRVMgPSBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fS0lORCA9IEdSQVBIX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fU1VQUFJFU1NFRCA9IEdSQVBIX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX09SREVSSU5HX0dVSURFID0gR1JBUEhfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fSVNfVklTSUJMRSA9IEdSQVBIX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fQ09OVEFJTkVSID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19SRUZFUkVOQ0UgPSBHUkFQSF9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fQ09OVEFJTkVEID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19QT1NJVElPTiA9IEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fTElOSyA9IEdSQVBIX0VMRU1FTlRfX0xJTks7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0FOQ0hPUkFHRSA9IEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fU0VNQU5USUNfTU9ERUwgPSBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19OQU1FID0gR1JBUEhfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fR1VJRCA9IEdSQVBIX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fT1dORURfUlVMRVMgPSBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19LSU5EID0gR1JBUEhfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fU1VQUFJFU1NFRCA9IEdSQVBIX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19PUkRFUklOR19HVUlERSA9IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19JU19WSVNJQkxFID0gR1JBUEhfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQ09OVEFJTkVSID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fUkVGRVJFTkNFID0gR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQ09OVEFJTkVEID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fUE9TSVRJT04gPSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19MSU5LID0gR1JBUEhfRUxFTUVOVF9fTElOSzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0FOQ0hPUkFHRSA9IEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1NFTUFOVElDX01PREVMID0gR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2F5cG9pbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19XQVlQT0lOVFMgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQU5DSE9SID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaCBFZGdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfRkVBVFVSRV9DT1VOVCA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT05fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fS0lORCA9IERJQUdSQU1fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJTUVOU0lPTl9fV0lEVEggPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJTUVOU0lPTl9fSEVJR0hUID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaW1lbnNpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElNRU5TSU9OX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0tJTkQgPSBCUkVBS0RPV05fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19BQlNUUkFDVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQRVJfQUNUSVZJVElFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQ0hFQ0tMSVNUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0NPTkNFUFRTID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0VYQU1QTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1VJREVMSU5FUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19SRVVTQUJMRV9BU1NFVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19URU1QTEFURVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUkVQT1JUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fVE9PTE1FTlRPUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwgPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UID0gMTAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0dVSUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fS0lORCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fSVNfVklTSUJMRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0NPTlRBSU5FUiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1JFRkVSRU5DRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19ESUFHUkFNID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0dSQVBIX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSAxMDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT05fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0tJTkQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU07Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRSA9IDEwNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTl9OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0tJTkQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVIgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0UgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsIDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TGVhZkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UID0gMTA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX0tJTkQgPSBESUFHUkFNX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MZWFmIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwgPGVtPlRleHQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXh0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlQgPSAxMDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fTkFNRSA9IExFQUZfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19HVUlEID0gTEVBRl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IExFQUZfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IExFQUZfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fS0lORCA9IExFQUZfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19TVVBQUkVTU0VEID0gTEVBRl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IExFQUZfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fSVNfVklTSUJMRSA9IExFQUZfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19DT05UQUlORVIgPSBMRUFGX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fUkVGRVJFTkNFID0gTEVBRl9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1RFWFQgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsIDxlbT5JbWFnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJbWFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTUFHRSA9IDEwNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX05BTUUgPSBMRUFGX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19HVUlEID0gTEVBRl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTEVBRl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19CUklFRl9ERVNDUklQVElPTiA9IExFQUZfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19PV05FRF9SVUxFUyA9IExFQUZfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX0tJTkQgPSBMRUFGX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19TVVBQUkVTU0VEID0gTEVBRl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX09SREVSSU5HX0dVSURFID0gTEVBRl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX0lTX1ZJU0lCTEUgPSBMRUFGX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19DT05UQUlORVIgPSBMRUFGX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19SRUZFUkVOQ0UgPSBMRUFGX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fVVJJID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19NSU1FX1RZUEUgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW1hZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfRkVBVFVSRV9DT1VOVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoaWNQcmltaXRpdmVJbXBsIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoaWNQcmltaXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkUgPSAxMDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19OQU1FID0gTEVBRl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fR1VJRCA9IExFQUZfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19QUkVTRU5UQVRJT05fTkFNRSA9IExFQUZfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBMRUFGX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fT1dORURfUlVMRVMgPSBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19LSU5EID0gTEVBRl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fU1VQUFJFU1NFRCA9IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19PUkRFUklOR19HVUlERSA9IExFQUZfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19JU19WSVNJQkxFID0gTEVBRl9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fQ09OVEFJTkVSID0gTEVBRl9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fUkVGRVJFTkNFID0gTEVBRl9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCA8ZW0+UG9seWxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9seWxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UG9seWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkUgPSAxMDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19OQU1FID0gR1JBUEhJQ19QUklNSVRJVkVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19HVUlEID0gR1JBUEhJQ19QUklNSVRJVkVfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHUkFQSElDX1BSSU1JVElWRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSElDX1BSSU1JVElWRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19PV05FRF9SVUxFUyA9IEdSQVBISUNfUFJJTUlUSVZFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhJQ19QUklNSVRJVkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19LSU5EID0gR1JBUEhJQ19QUklNSVRJVkVfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19TVVBQUkVTU0VEID0gR1JBUEhJQ19QUklNSVRJVkVfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSElDX1BSSU1JVElWRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19JU19WSVNJQkxFID0gR1JBUEhJQ19QUklNSVRJVkVfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19DT05UQUlORVIgPSBHUkFQSElDX1BSSU1JVElWRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1JFRkVSRU5DRSA9IEdSQVBISUNfUFJJTUlUSVZFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbG9zZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fQ0xPU0VEID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2F5cG9pbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fV0FZUE9JTlRTID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9seWxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfRkVBVFVSRV9DT1VOVCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwgPGVtPkVsbGlwc2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVMTElQU0UgPSAxMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX05BTUUgPSBHUkFQSElDX1BSSU1JVElWRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fR1VJRCA9IEdSQVBISUNfUFJJTUlUSVZFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHUkFQSElDX1BSSU1JVElWRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBISUNfUFJJTUlUSVZFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fT1dORURfUlVMRVMgPSBHUkFQSElDX1BSSU1JVElWRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhJQ19QUklNSVRJVkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0tJTkQgPSBHUkFQSElDX1BSSU1JVElWRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fU1VQUFJFU1NFRCA9IEdSQVBISUNfUFJJTUlUSVZFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSElDX1BSSU1JVElWRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0lTX1ZJU0lCTEUgPSBHUkFQSElDX1BSSU1JVElWRV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fQ09OVEFJTkVSID0gR1JBUEhJQ19QUklNSVRJVkVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1JFRkVSRU5DRSA9IEdSQVBISUNfUFJJTUlUSVZFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1BST1BFUlRZID0gR1JBUEhJQ19QUklNSVRJVkVfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNlbnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0NFTlRFUiA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBYPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUkFESVVTX1ggPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYWRpdXMgWTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1JBRElVU19ZID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19ST1RBVElPTiA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fU1RBUlRfQU5HTEUgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19FTkRfQU5HTEUgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbGxpcHNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfRkVBVFVSRV9DT1VOVCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fTkFNRSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fR1VJRCA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fT1dORURfUlVMRVMgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fS0lORCA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQVVUSE9SUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0NIQU5HRV9EQVRFID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fVkVSU0lPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fUFJPQ0VTU19WSUVXUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19ERUZBVUxUX1ZJRVcgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19CQVNFX0NPTkZJR1VSQVRJT05TID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1NVQlRSQUNURURfQ0FURUdPUlkgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0FEREVEX0NBVEVHT1JZID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3NlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0dVSUQgPSBNRVRIT0RfVU5JVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX09XTkVEX1JVTEVTID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0tJTkQgPSBNRVRIT0RfVU5JVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVJfVFlQRSA9IDExNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX1RZUEUgPSAxMTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRhdGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLnV0aWwuRGF0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREFURSA9IDExNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VXJpPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5uZXQuVVJJCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVSSSA9IDExODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U3RyaW5nPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVFJJTkcgPSAxMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkJvb2xlYW48L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuQm9vbGVhbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJvb2xlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQk9PTEVBTiA9IDExNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2V0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLlNldAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVQgPSAxMTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNlcXVlbmNlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZXF1ZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVFVRU5DRSA9IDEyMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SW50ZWdlcjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJbnRlZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOVEVHRVIgPSAxMjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRvdWJsZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5Eb3VibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREb3VibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRE9VQkxFID0gMTIyOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyIDxlbT5DbGFzc2lmaWVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNsYXNzaWZpZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENsYXNzaWZpZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyI2dldElzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIjZ2V0SXNBYnN0cmFjdCgpCi0JICogQHNlZSAjZ2V0Q2xhc3NpZmllcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TmFtZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSA8ZW0+UGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROYW1lc3BhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEd1aWQgPGVtPkd1aWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HdWlkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEd1aWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfR3VpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZXMgPGVtPk93bmVkIFJ1bGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Pd25lZCBSdWxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGVzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEtpbmQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50I2dldEJvZHkgPGVtPkJvZHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Cb2R5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50I2dldEJvZHkoKQotCSAqIEBzZWUgI2dldENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnN0cmFpbnRfQm9keSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0c0FuZFBhcGVycyA8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hlY2tsaXN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0cygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEd1aWRlbGluZXMgPGVtPkd1aWRlbGluZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkd1aWRlbGluZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEd1aWRlbGluZXMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkV4YW1wbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlcygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRBc3NldHMgPGVtPkFzc2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRBc3NldHMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldFRlcm1kZWZpbml0aW9uIDxlbT5UZXJtZGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGVybWRlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldFRlcm1kZWZpbml0aW9uKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50IDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaGFwZWljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob2RlaWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24gPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbnMgPGVtPlNlY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCgpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldExvbmdQcmVzZW50YXRpb25OYW1lIDxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9Mb25nUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWN0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25EZXNjcmlwdGlvbiA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9ucyA8ZW0+U3ViIFNlY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgU2VjdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbnMoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3Rpb25fU3ViU2VjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1vZGlmaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldE1vZGlmaWVzKCkKLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlX01vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXBvcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnRzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRlbXBsYXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGVzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3JzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudCA8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GdWxmaWxsYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEZ1bGZpbGxhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50I2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RnVsZmlsbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudCNnZXRGdWxmaWxscygpCi0JICogQHNlZSAjZ2V0RnVsZmlsbGFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPdXRwdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfT3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX09wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0U3RlcHMgPGVtPlN0ZXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdGVwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRTdGVwcygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19TdGVwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfVG9vbE1lbnRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcCA8ZW0+U3RlcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdGVwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTdGVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlIDxlbT5HdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0IDxlbT5BcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0IDxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCgpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cygpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzIDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lIDxlbT5PdXRjb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGNvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldEdsb2JhbCA8ZW0+R2xvYmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2xvYmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldEdsb2JhbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UmV1c2VkUGFja2FnZXMgPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2VzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldENoaWxkUGFja2FnZXMgPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DaGlsZCBQYWNrYWdlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRDaGlsZFBhY2thZ2VzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRzIDxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudHMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24oKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1cnBvc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNraWxsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lub255bXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHRhY2htZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cygpCi0JICogQHNlZSAjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2JsZW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmFja2dyb3VuZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdvYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRSb2FkbWFwcyA8ZW0+Um9hZG1hcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJvYWRtYXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRSb2FkbWFwcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2aXR5X1JvYWRtYXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50IDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9uZ29pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZygpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldExpbmtUb1ByZWRlY2Vzc29yIDxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRMaW5rVG9QcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWZpeDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXgoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzUGxhbm5lZCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNoZWNrbGlzdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q2hlY2tsaXN0cygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHRzIDxlbT5Db25jZXB0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29uY2VwdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q29uY2VwdHMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeGFtcGxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRFeGFtcGxlcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5HdWlkZWxpbmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEd1aWRlbGluZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0cyA8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldHMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRUZW1wbGF0ZXMgPGVtPlRlbXBsYXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGVtcGxhdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRlbXBsYXRlcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9UZW1wbGF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVwb3J0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXBvcnRzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1JlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRvb2xtZW50b3IgPGVtPlRvb2xtZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRvb2xtZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0VG9vbG1lbnRvcigpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9Ub29sbWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSNnZXRSZXF1aXJlZFJlc3VsdHMgPGVtPlJlcXVpcmVkIFJlc3VsdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlcXVpcmVkIFJlc3VsdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSNnZXRSZXF1aXJlZFJlc3VsdHMoKQotCSAqIEBzZWUgI2dldE1pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SXRlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlIDxlbT5QaGFzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBoYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVhbVByb2ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFRlYW1Sb2xlcyA8ZW0+VGVhbSBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGVhbSBSb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0VGVhbVJvbGVzKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U3VwZXIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSgpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TW9kaWZpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldE1vZGlmaWVzKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIgPGVtPldvcmsgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbmsgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkIDxlbT5QcmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya09yZGVyX1ByZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsgPGVtPlJhbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuaygpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yIDxlbT5EZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0U2VsZWN0ZWRTdGVwcyA8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTZWxlY3RlZFN0ZXBzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbXBhY3RlZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbXBhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbXBvc2l0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGVzIDxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlcygpCi0JICogQHNlZSAjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93dG9TdGFmZiA8ZW0+SG93dG8gU3RhZmY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NhbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJpc2sgTGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NvcGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcyA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRvb2xNZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVybURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNnZXRJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2dldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcmFjdGljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2VzIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgUHJhY3RpY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZXMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2VzIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZXMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0VGFza3MoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0U3ViZGlzY2lwbGluZSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViZGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRTdWJkaXNjaXBsaW5lKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93cygpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0I2dldFJvbGVzIDxlbT5Sb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Um9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQjZ2V0Um9sZXMoKQotCSAqIEBzZWUgI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVTZXRfUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERvbWFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+V29yayBQcm9kdWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0cygpCi0JICogQHNlZSAjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWlucyA8ZW0+U3ViZG9tYWluczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViZG9tYWluczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFN1YmRvbWFpbnMoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9tYWluX1N1YmRvbWFpbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lcyA8ZW0+RGlzY2lwbGluZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc2NpcGxpbmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZXMoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wgPGVtPlRvb2w8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU2V0R3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0cyA8ZW0+Um9sZSBTZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2xlIFNldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0cygpCi0JICogQHNlZSAjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yaWVzKCkKLQkgKiBAc2VlICNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbHMgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbHMoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJucyA8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybnMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbGlkIENvbnRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZWRPblByb2Nlc3NlcyA8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VkT25Qcm9jZXNzZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2VzIDxlbT5JbnRlcmZhY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc1BhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpYWdyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXREaWFncmFtcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX0RpYWdyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMgPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBJTzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciA8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciNnZXRfcHJvY2Vzc0NvbXBvbmVudCA8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0X3Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2VzIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2VzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldEJhc2VzIDxlbT5CYXNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRCYXNlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fQmFzZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jaXNTdXBwb3J0aW5nIDxlbT5TdXBwb3J0aW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VwcG9ydGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2lzU3VwcG9ydGluZygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fU3VwcG9ydGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dGhvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycygpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodFN0YXRlbWVudCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9jZXNzIFZpZXdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3cygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb25zIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9ucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5IDxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0ZhbWlseSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSNnZXREZWxpdmVyeVByb2Nlc3NlcyA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkjZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NGYW1pbHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2lucyA8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCA8ZW0+UG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFggPGVtPlg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRYKCkKLQkgKiBAc2VlICNnZXRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9pbnRfWCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkgPGVtPlk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5ZPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRZKCkKLQkgKiBAc2VlICNnZXRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9pbnRfWSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0UG9zaXRpb24gPGVtPlBvc2l0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UG9zaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRQb3NpdGlvbigpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGFpbmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0Q29udGFpbmVkKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluaygpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZSA8ZW0+QW5jaG9yYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BbmNob3JhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UoKQotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsIDxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlNlbWFudGljIE1vZGVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0U2VtYW50aWNNb2RlbCgpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCA8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpYWdyYW1FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlIDxlbT5JcyBWaXNpYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgVmlzaWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAc2VlICNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbUVsZW1lbnRfSXNWaXNpYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Db250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8oKQotCSAqIEBzZWUgI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UHJvcGVydHkoKQotCSAqIEBzZWUgI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpYWdyYW1MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlpvb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFpvb20oKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaWFncmFtTGlua19ab29tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Vmlld3BvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFZpZXdwb3J0KCkKLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtKCkKLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciA8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoQ29ubmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAc2VlICNnZXRHcmFwaENvbm5lY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldFByZXNlbnRhdGlvbigpCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0oKQotCSAqIEBzZWUgI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gPGVtPkRpbWVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaW1lbnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGltZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldpZHRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0V2lkdGgoKQotCSAqIEBzZWUgI2dldERpbWVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGltZW5zaW9uX1dpZHRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGVpZ2h0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0KCkKLQkgKiBAc2VlICNnZXREaW1lbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpbWVuc2lvbl9IZWlnaHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VfSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJlZmVyZW5jZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkKCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5IDxlbT5LZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldEtleSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0tleSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoRWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BbmNob3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRBbmNob3IoKQotCSAqIEBzZWUgI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFZGdlX0FuY2hvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XYXlwb2ludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRXYXlwb2ludHMoKQotCSAqIEBzZWUgI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFZGdlX1dheXBvaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFpvb20gPGVtPlpvb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5ab29tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFpvb20oKQotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpYWdyYW1fWm9vbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5WaWV3cG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50KCkKLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtX1ZpZXdwb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1fRGlhZ3JhbUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlIDxlbT5HcmFwaCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TaXplPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSgpCi0JICogQHNlZSAjZ2V0R3JhcGhOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaE5vZGVfU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvKCkKLQkgKiBAc2VlICNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfVHlwZUluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSA8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQgPGVtPkxlYWYgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MZWFmIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMZWFmRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRleHRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50I2dldFRleHQoKQotCSAqIEBzZWUgI2dldFRleHRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZXh0RWxlbWVudF9UZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlIDxlbT5JbWFnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEltYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0VXJpIDxlbT5Vcmk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vcmk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldFVyaSgpCi0JICogQHNlZSAjZ2V0SW1hZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEltYWdlX1VyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlKCkKLQkgKiBAc2VlICNnZXRJbWFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW1hZ2VfTWltZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZSA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoaWNQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUgPGVtPlBvbHlsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UG9seWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsb3NlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0Q2xvc2VkKCkKLQkgKiBAc2VlICNnZXRQb2x5bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9seWxpbmVfQ2xvc2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2F5cG9pbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRXYXlwb2ludHMoKQotCSAqIEBzZWUgI2dldFBvbHlsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQb2x5bGluZV9XYXlwb2ludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSA8ZW0+RWxsaXBzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGxpcHNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbGxpcHNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNYIDxlbT5SYWRpdXMgWDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhZGl1cyBYPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1goKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYWRpdXMgWTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1koKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJvdGF0aW9uIDxlbT5Sb3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvdGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJvdGF0aW9uKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JvdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IEFuZ2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFN0YXJ0QW5nbGUoKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfU3RhcnRBbmdsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0RW5kQW5nbGUgPGVtPkVuZCBBbmdsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVuZCBBbmdsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9FbmRBbmdsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Q2VudGVyIDxlbT5DZW50ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5DZW50ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Q2VudGVyKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbGxpcHNlX0NlbnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRXb3JrT3JkZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5EYXRlIDxlbT5EYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EYXRlPC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLkRhdGUKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLkRhdGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5uZXQuVVJJIDxlbT5Vcmk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVyaTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubmV0LlVSSQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm5ldC5VUkkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVcmkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TdHJpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0cmluZzwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN0cmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5Cb29sZWFuIDxlbT5Cb29sZWFuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Cb29sZWFuPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLkJvb2xlYW4KLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29sZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLlNldCA8ZW0+U2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TZXQ8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuU2V0Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5TZXQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuTGlzdCA8ZW0+U2VxdWVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNlcXVlbmNlPC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLkxpc3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXF1ZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkludGVnZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SW50ZWdlcjwvZW0+Jy4KLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iaW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SW50ZWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5Eb3VibGUgPGVtPkRvdWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RG91YmxlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLkRvdWJsZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuRG91YmxlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RG91YmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFGYWN0b3J5IGdldFVtYUZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsIDxlbT5DbGFzc2lmaWVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENsYXNzaWZpZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0xBU1NJRklFUiA9IGVJTlNUQU5DRS5nZXRDbGFzc2lmaWVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENMQVNTSUZJRVJfX0lTX0FCU1RSQUNUID0gZUlOU1RBTkNFCi0JCQkJLmdldENsYXNzaWZpZXJfSXNBYnN0cmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlR5cGVJbXBsIDxlbT5UeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVFlQRSA9IGVJTlNUQU5DRS5nZXRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTEVNRU5UID0gZUlOU1RBTkNFLmdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsIDxlbT5OYW1lZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZWRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTkFNRURfRUxFTUVOVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VhYmxlRWxlbWVudEltcGwgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlSW1wbCA8ZW0+UGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwgPGVtPk5hbWVzcGFjZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lc3BhY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVzcGFjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0TmFtZXNwYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19HVUlEID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fS0lORCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0tpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsIDxlbT5Db25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Cb2R5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OU1RSQUlOVF9fQk9EWSA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50X0JvZHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsIDxlbT5LaW5kPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEtpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgS0lORCA9IGVJTlNUQU5DRS5nZXRLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0FTU0VUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1Rlcm1kZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklCQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwgPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9Mb25nUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlY3Rpb25JbXBsIDxlbT5TZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlY3Rpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVElPTiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19TRUNUSU9OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVElPTl9fU1VCX1NFQ1RJT05TID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fU3ViU2VjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVElPTl9fUFJFREVDRVNTT1IgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsIDxlbT5Sb2xlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9fTU9ESUZJRVMgPSBlSU5TVEFOQ0UuZ2V0Um9sZV9Nb2RpZmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX19SRVNQT05TSUJMRV9GT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9fUkVQT1JUUyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9fVEVNUExBVEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkZ1bGZpbGxhYmxlRWxlbWVudEltcGwgPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRnVsZmlsbGFibGVFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRGdWxmaWxsYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRlVMRklMTEFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRGdWxmaWxsYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCA8ZW0+VGFzazwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19PVVRQVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RlcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX1NURVBTID0gZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwgPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0RlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsIDxlbT5TdGVwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN0ZXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU1RFUCA9IGVJTlNUQU5DRS5nZXRTdGVwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VJbXBsIDxlbT5HdWlkYW5jZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREFOQ0UgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlRJRkFDVCA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyIEFydGlmYWN0PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk91dGNvbWVJbXBsIDxlbT5PdXRjb21lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE91dGNvbWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgT1VUQ09NRSA9IGVJTlNUQU5DRS5nZXRPdXRjb21lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIE91dGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEVfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0tfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJBQ1RJQ0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MZXZlbHMgT2YgQWRvcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVklUWV9fUk9BRE1BUFMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfVGVtcGxhdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1JlcG9ydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0VzdGltYXRpb25jb25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1IgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Ub29sbWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWlsZXN0b25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1JTEVTVE9ORSA9IGVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIFJlc3VsdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SXRlcmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElURVJBVElPTiA9IGVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QaGFzZUltcGwgPGVtPlBoYXNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQSEFTRSA9IGVJTlNUQU5DRS5nZXRQaGFzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCA8ZW0+VGVhbSBQcm9maWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZWFtUHJvZmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURUFNX1BST0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlYW0gUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBURUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwgPGVtPldvcmsgT3JkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19PUkRFUiA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX0xJTktfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfTGlua1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX09SREVSX19QUkVEID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9QcmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsIDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQbGFubmluZ0RhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUExBTk5JTkdfREFUQSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19SQU5LID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1RBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBTdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT01QT1NJVEVfUk9MRSA9IGVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsIDxlbT5Db25jZXB0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRDb25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2hlY2tsaXN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENIRUNLTElTVCA9IGVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFeGFtcGxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0RXhhbXBsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRlbGluZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlERUxJTkUgPSBlSU5TVEFOQ0UuZ2V0R3VpZGVsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGwgPGVtPlJlcG9ydDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVBPUlQgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVtcGxhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVNUExBVEUgPSBlSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBlSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwgPGVtPlRvb2wgTWVudG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVE9PTF9NRU5UT1IgPSBlSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsIDxlbT5XaGl0ZXBhcGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdoaXRlcGFwZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0hJVEVQQVBFUiA9IGVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlcm1EZWZpbml0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFUk1fREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXRUZXJtRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPID0gZUlOU1RBTkNFCi0JCQkJLmdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwgPGVtPlByYWN0aWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsIDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkUgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFza3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1RBU0tTID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YmRpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3dzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTID0gZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsIDxlbT5Sb2xlIFNldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfU0VUID0gZUlOU1RBTkNFLmdldFJvbGVTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX1NFVF9fUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwgPGVtPkRvbWFpbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvbWFpbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBET01BSU4gPSBlSU5TVEFOQ0UuZ2V0RG9tYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1dPUktfUFJPRFVDVFMgPSBlSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9NQUlOX19TVUJET01BSU5TID0gZUlOU1RBTkNFLmdldERvbWFpbl9TdWJkb21haW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESVNDSVBMSU5FX0dST1VQSU5HID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzY2lwbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsIDxlbT5Ub29sPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2woKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVE9PTCA9IGVJTlNUQU5DRS5nZXRUb29sKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRPT0xfX1RPT0xfTUVOVE9SUyA9IGVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVRfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENVU1RPTV9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3JpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUllfUFJPQ0VTUyA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ltcGwgPGVtPlByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX19WQUxJRF9DT05URVhUID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENBUEFCSUxJVFlfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZWQgT24gUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvYWRtYXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9BRE1BUCA9IGVJTlNUQU5DRS5nZXRSb2FkbWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5wcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX19wcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFBsdWdpbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlciBDaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BMVUdJTl9fQkFTRVMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BMVUdJTl9fU1VQUE9SVElORyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW5fU3VwcG9ydGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwgPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVkFSSUFCSUxJVFlfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFCi0JCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwgPGVtPk1ldGhvZCBVbml0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFVuaXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19BVVRIT1JTID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQXV0aG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlld3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbCA8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0ZBTUlMWSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRmFtaWx5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsIDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9MSUJSQVJZID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbCA8ZW0+UG9pbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBvaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBPSU5UID0gZUlOU1RBTkNFLmdldFBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9JTlRfX1ggPSBlSU5TVEFOQ0UuZ2V0UG9pbnRfWCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPSU5UX19ZID0gZUlOU1RBTkNFLmdldFBvaW50X1koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsIDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBIX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fTElOSyA9IGVJTlNUQU5DRS5nZXRHcmFwaEVsZW1lbnRfTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCA8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESUFHUkFNX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlhZ3JhbUVsZW1lbnRfSXNWaXNpYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlhZ3JhbUVsZW1lbnRfUHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwgPGVtPkRpYWdyYW0gTGluazwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbUxpbmsoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElBR1JBTV9MSU5LID0gZUlOU1RBTkNFLmdldERpYWdyYW1MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElBR1JBTV9MSU5LX19aT09NID0gZUlOU1RBTkNFLmdldERpYWdyYW1MaW5rX1pvb20oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZpZXdwb3J0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9MSU5LX19WSUVXUE9SVCA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGlua19WaWV3cG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9MSU5LX19ESUFHUkFNID0gZUlOU1RBTkNFLmdldERpYWdyYW1MaW5rX0RpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaENvbm5lY3RvckltcGwgPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaENvbm5lY3RvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhDb25uZWN0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfQ09OTkVDVE9SID0gZUlOU1RBTkNFLmdldEdyYXBoQ29ubmVjdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VNQU5USUNfTU9ERUxfQlJJREdFID0gZUlOU1RBTkNFLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfUHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbCA8ZW0+RGltZW5zaW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGltZW5zaW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJTUVOU0lPTiA9IGVJTlNUQU5DRS5nZXREaW1lbnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElNRU5TSU9OX19XSURUSCA9IGVJTlNUQU5DRS5nZXREaW1lbnNpb25fV2lkdGgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJTUVOU0lPTl9fSEVJR0hUID0gZUlOU1RBTkNFLmdldERpbWVuc2lvbl9IZWlnaHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsIDxlbT5SZWZlcmVuY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZWZlcmVuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVGRVJFTkNFID0gZUlOU1RBTkNFLmdldFJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRSZWZlcmVuY2VfSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRUZFUkVOQ0VfX1JFRkVSRU5DRUQgPSBlSU5TVEFOQ0UuZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwgPGVtPlByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfX0tFWSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9LZXkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbCA8ZW0+R3JhcGggRWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoRWRnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSF9FREdFID0gZUlOU1RBTkNFLmdldEdyYXBoRWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FREdFX19BTkNIT1IgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhFZGdlX0FuY2hvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2F5cG9pbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FREdFX19XQVlQT0lOVFMgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhFZGdlX1dheXBvaW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsIDxlbT5EaWFncmFtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElBR1JBTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElBR1JBTV9fWk9PTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtX1pvb20oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZpZXdwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fX1ZJRVdQT0lOVCA9IGVJTlNUQU5DRS5nZXREaWFncmFtX1ZpZXdwb2ludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX19ESUFHUkFNX0xJTksgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9fTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldERpYWdyYW1fTmFtZXNwYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbCA8ZW0+R3JhcGggTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoTm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSF9OT0RFID0gZUlOU1RBTkNFLmdldEdyYXBoTm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX05PREVfX1NJWkUgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhOb2RlX1NpemUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwgPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTyA9IGVJTlNUQU5DRQotCQkJCS5nZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5MZWFmRWxlbWVudEltcGwgPGVtPkxlYWYgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5MZWFmRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TGVhZkVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTEVBRl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldExlYWZFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGV4dEVsZW1lbnRJbXBsIDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGV4dEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRleHRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFWFRfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRUZXh0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFWFRfRUxFTUVOVF9fVEVYVCA9IGVJTlNUQU5DRS5nZXRUZXh0RWxlbWVudF9UZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsIDxlbT5JbWFnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SW1hZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU1BR0UgPSBlSU5TVEFOQ0UuZ2V0SW1hZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElNQUdFX19VUkkgPSBlSU5TVEFOQ0UuZ2V0SW1hZ2VfVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTUFHRV9fTUlNRV9UWVBFID0gZUlOU1RBTkNFLmdldEltYWdlX01pbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhpY1ByaW1pdGl2ZUltcGwgPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoaWNQcmltaXRpdmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoaWNQcmltaXRpdmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhJQ19QUklNSVRJVkUgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCA8ZW0+UG9seWxpbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9seWxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBvbHlsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBPTFlMSU5FID0gZUlOU1RBTkNFLmdldFBvbHlsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbG9zZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT0xZTElORV9fQ0xPU0VEID0gZUlOU1RBTkNFLmdldFBvbHlsaW5lX0Nsb3NlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2F5cG9pbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQT0xZTElORV9fV0FZUE9JTlRTID0gZUlOU1RBTkNFLmdldFBvbHlsaW5lX1dheXBvaW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsIDxlbT5FbGxpcHNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVsbGlwc2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUxMSVBTRSA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SYWRpdXMgWDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX1JBRElVU19YID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfUmFkaXVzWCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFkaXVzIFk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19SQURJVVNfWSA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX1JhZGl1c1koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fUk9UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9Sb3RhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19TVEFSVF9BTkdMRSA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX1N0YXJ0QW5nbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVuZCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX0VORF9BTkdMRSA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX0VuZEFuZ2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DZW50ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTExJUFNFX19DRU5URVIgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9DZW50ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFdPUktfT1JERVJfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkRhdGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLnV0aWwuRGF0ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREYXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIERBVEUgPSBlSU5TVEFOQ0UuZ2V0RGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VXJpPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5uZXQuVVJJCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVyaSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBVUkkgPSBlSU5TVEFOQ0UuZ2V0VXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TdHJpbmc8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN0cmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBTVFJJTkcgPSBlSU5TVEFOQ0UuZ2V0U3RyaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Cb29sZWFuPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLkJvb2xlYW4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Qm9vbGVhbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBCT09MRUFOID0gZUlOU1RBTkNFLmdldEJvb2xlYW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlNldDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5TZXQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFVCA9IGVJTlNUQU5DRS5nZXRTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlNlcXVlbmNlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VxdWVuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU0VRVUVOQ0UgPSBlSU5TVEFOQ0UuZ2V0U2VxdWVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkludGVnZXI8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SW50ZWdlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBJTlRFR0VSID0gZUlOU1RBTkNFLmdldEludGVnZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkRvdWJsZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5Eb3VibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG91YmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIERPVUJMRSA9IGVJTlNUQU5DRS5nZXREb3VibGUoKTsKLQotCX0KLQotfSAvL1VtYVBhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5RWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyYjY3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFyaWFiaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLSAqIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuCi0gKiBWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuCi0gKiBWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYXJpYWJpbGl0eUVsZW1lbnQgZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Im5hIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJuYSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlFbGVtZW50IGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IHZhbHVlKTsKLQotfSAvLyBWYXJpYWJpbGl0eUVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmYwN2UwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFZhcmlhYmlsaXR5VHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05BX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTkEoMCwgIm5hIiwgIm5hIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDT05UUklCVVRFUygxLCAiY29udHJpYnV0ZXMiLCAiY29udHJpYnV0ZXMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlFWFRFTkRTKDIsICJleHRlbmRzIiwgImV4dGVuZHMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVBMQUNFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVJFUExBQ0VTKDMsICJyZXBsYWNlcyIsICJyZXBsYWNlcyIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9DT05UUklCVVRJT05fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlMT0NBTF9DT05UUklCVVRJT04oNCwgImxvY2FsQ29udHJpYnV0aW9uIiwgImxvY2FsQ29udHJpYnV0aW9uIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlMT0NBTF9SRVBMQUNFTUVOVCg1LCAibG9jYWxSZXBsYWNlbWVudCIsICJsb2NhbFJlcGxhY2VtZW50IiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhURU5EU19SRVBMQUNFUyg2LCAiZXh0ZW5kc1JlcGxhY2VzIiwgImV4dGVuZHNSZXBsYWNlcyIpOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgZGVmYXVsdCAibm90IGFzc2lnbmVkIiB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTkEKLQkgKiBAbW9kZWwgbmFtZT0ibmEiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDb250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLQkgKiBhdHRyaWJ1dGUgdmFsdWVzOglTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgY29uY2F0ZW5hdGVkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBPdGhlciB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIGFueSBvdGhlciB0eXBlIHN1Y2ggYXMgSW50ZWdlciwgRGF0ZSBhcmUgaWdub3JlZC4KLQkgKiBUaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotCSAqIDAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGtlcHQgYW5kIGFueSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBjb250cmlidXRpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGlnbm9yZWQuCi0JICogMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBhZGRlZCB0byB0aGUgYWxyZWFkeSBleGlzdGluZyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIGVsZW1lbnQuICBJZiBib3RoIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB0aGVuIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBhc3NvY2lhdGlvbiB3aWxsIHJlbWFpbi4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVMKLQkgKiBAbW9kZWwgbmFtZT0iY29udHJpYnV0ZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJJQlVURVNfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV4dGVuc2lvbiBhbGxvd3MgTWV0aG9kIFBsdWdpbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBCYXNlIFBsdWdpbiBieSBwcm92aWRpbmcgYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgQXR0cmlidXRlIHZhbHVlcyBhbmQgQXNzb2NpYXRpb24gaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHJlc3VsdCBvZiBpbnRlcnByZXRhdGlvbiBpcyB0aGF0IHRoZSBzcGVjaWFsIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlIGJhc2VkLW9uIGhhcywgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gIEhlbmNlIGV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5IGNvbnRlbnQgb2YgdGhlIGJhc2UgUGx1Z2luLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZyBQbHVnaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQgKGUuZy4gYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiByZXZpZXcpLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcgVmFyaWFiaWxpdHkgRWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB2aWEgdGhlIGV4dGVuZHMgcmVsYXRpb25zaGlwLiAgRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIENhcGFiaWxpdHkgUGF0dGVybnMgdG8gUHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcHMgZnJvbSBhbiBBY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgUHJvY2Vzc2VzIHRvIHRoZSBQYXR0ZXJuLiAgVGhlIEFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9ucyBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycyB0byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgUHJvY2VzcyBhZnRlciBJbnRlcnByZXRhdGlvbi4KLQkgKiBhdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgZWxlbWVudCBhcmUgaW5oZXJpdGVkIGFuZCB1c2VkIHRvIHBvcHVsYXRlIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGF0dHJpYnV0ZXMuICBJZiB0aGUgc3BlY2lhbCBlbGVtZW50IGF0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcG9wdWxhdGVkIHRoZSBpbmhlcml0ZWQgdmFsdWVzIGFyZSBpZ25vcmVkLiAgCi0JICogVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLQkgKiAwLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyBpdHMgb3duIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gdGhlIGluaGVyaXRlZCBvbmUgaXMgaWdub3JlZC4KLQkgKiAwLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIGRlZmluZWQgZm9yIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSBzcGVjaWFsIGVsZW1lbnQgY2FuIGFkZCBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIGluc3RhbmNlcy4KLQkgKiAKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EUwotCSAqIEBtb2RlbCBuYW1lPSJleHRlbmRzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFNfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBSZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLQkgKiBhdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGluY2x1ZGluZyB1bmFzc2lnbmVkIHZhbHVlcy4KLQkgKiBUaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotCSAqIDAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc29jaWF0aW9uIGluc3RhbmNlIGZyb20gdGhlIHJlcGxhY2luZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGFsc28gbm90IGhhdmUgYW4gYXNzb2NpYXRpb24uCi0JICogMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IHJlcGxhY2UgYWxsIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4KLQkgKiAKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVMKLQkgKiBAbW9kZWwgbmFtZT0icmVwbGFjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRVNfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0NPTlRSSUJVVElPTl9WQUxVRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlQKLQkgKiBAbW9kZWwgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9SRVBMQUNFTUVOVF9WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfUkVQTEFDRVMKLQkgKiBAbW9kZWwgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFNfUkVQTEFDRVNfVkFMVUUgPSA2OwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBWYXJpYWJpbGl0eVR5cGVbXSB7Ci0JCQlOQSwgQ09OVFJJQlVURVMsIEVYVEVORFMsIFJFUExBQ0VTLCBMT0NBTF9DT05UUklCVVRJT04sCi0JCQlMT0NBTF9SRVBMQUNFTUVOVCwgRVhURU5EU19SRVBMQUNFUywgfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VmFyaWFiaWxpdHlUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucwotCQkJLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCWNhc2UgTkFfVkFMVUU6Ci0JCQlyZXR1cm4gTkE7Ci0JCWNhc2UgQ09OVFJJQlVURVNfVkFMVUU6Ci0JCQlyZXR1cm4gQ09OVFJJQlVURVM7Ci0JCWNhc2UgRVhURU5EU19WQUxVRToKLQkJCXJldHVybiBFWFRFTkRTOwotCQljYXNlIFJFUExBQ0VTX1ZBTFVFOgotCQkJcmV0dXJuIFJFUExBQ0VTOwotCQljYXNlIExPQ0FMX0NPTlRSSUJVVElPTl9WQUxVRToKLQkJCXJldHVybiBMT0NBTF9DT05UUklCVVRJT047Ci0JCWNhc2UgTE9DQUxfUkVQTEFDRU1FTlRfVkFMVUU6Ci0JCQlyZXR1cm4gTE9DQUxfUkVQTEFDRU1FTlQ7Ci0JCWNhc2UgRVhURU5EU19SRVBMQUNFU19WQUxVRToKLQkJCXJldHVybiBFWFRFTkRTX1JFUExBQ0VTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1doaXRlcGFwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV2hpdGVwYXBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWU2ZDI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV2hpdGVwYXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXaGl0ZXBhcGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdoaXRlcGFwZXIgZXh0ZW5kcyBDb25jZXB0IHsKLX0gLy8gV2hpdGVwYXBlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzRlMWI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldExpbmtUb1ByZWRlY2Vzc29yIDxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNSZXBlYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1JlcGVhdGFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT25nb2luZyhCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotCSAqIAotCSAqIAotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzRXZlbnREcml2ZW4oQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc0V2ZW50RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya09yZGVyPiBnZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCi19IC8vIFdvcmtCcmVha2Rvd25FbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzA5MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi0gKiBXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0RlZmluaXRpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZWNvbmRpdGlvbihDb25zdHJhaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnN0cmFpbnQgZ2V0UHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnN0cmFpbnQgZ2V0UG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgdmFsdWUpOwotCi19IC8vIFdvcmtEZWZpbml0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkZjRiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotICogKE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pCi0gKiBUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrT3JkZXIgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZpbmlzaFRvU3RhcnQiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNzZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9MaW5rVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZpbmlzaFRvU3RhcnQiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyVHlwZSBnZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlZChXb3JrQnJlYWtkb3duRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfUHJlZCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0JyZWFrZG93bkVsZW1lbnQgZ2V0UHJlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZChXb3JrQnJlYWtkb3duRWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gV29ya09yZGVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlclR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGY1MzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gV29ya09yZGVyVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlGSU5JU0hfVE9fU1RBUlQoMCwgImZpbmlzaFRvU3RhcnQiLCAiZmluaXNoVG9TdGFydCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX0ZJTklTSF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUZJTklTSF9UT19GSU5JU0goMSwgImZpbmlzaFRvRmluaXNoIiwgImZpbmlzaFRvRmluaXNoIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fU1RBUlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTVEFSVF9UT19TVEFSVCgyLCAic3RhcnRUb1N0YXJ0IiwgInN0YXJ0VG9TdGFydCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0hfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTVEFSVF9UT19GSU5JU0goMywgInN0YXJ0VG9GaW5pc2giLCAic3RhcnRUb0ZpbmlzaCIpOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgIkNvbnN0cnVjdCBmZW5jZSIgYW5kICJQYWludCBmZW5jZSwiICJQYWludCBmZW5jZSIgY2FuJ3Qgc3RhcnQgdW50aWwgIkNvbnN0cnVjdCBmZW5jZSIgZmluaXNoZXMuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGVwZW5kZW5jeSBhbmQgdGhlIGRlZmF1bHQgZm9yIGEgbmV3IFdvcmsgT3JkZXIgaW5zdGFuY2UuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19TVEFSVAotCSAqIEBtb2RlbCBuYW1lPSJmaW5pc2hUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19TVEFSVF9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgIkFkZCB3aXJpbmciIGFuZCAiSW5zcGVjdCBlbGVjdHJpY2FsLCIgIkluc3BlY3QgZWxlY3RyaWNhbCIgY2FuJ3QgZmluaXNoIHVudGlsICJBZGQgd2lyaW5nIiBmaW5pc2hlcy4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX0ZJTklTSAotCSAqIEBtb2RlbCBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfVE9fRklOSVNIX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgIlBvdXIgZm91bmRhdGlvbiIgYW5kICJMZXZlbCBjb25jcmV0ZSwiICJMZXZlbCBjb25jcmV0ZSIgY2FuJ3QgYmVnaW4gdW50aWwgIlBvdXIgZm91bmRhdGlvbiIgYmVnaW5zLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19TVEFSVAotCSAqIEBtb2RlbCBuYW1lPSJzdGFydFRvU3RhcnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfVE9fU1RBUlRfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gVGhpcyBkZXBlbmRlbmN5IHR5cGUgY2FuIGJlIHVzZWQgZm9yIGp1c3QtaW4tdGltZSBzY2hlZHVsaW5nIHVwIHRvIGEgbWlsZXN0b25lIG9yIHRoZSBwcm9qZWN0IGZpbmlzaCBkYXRlIHRvIG1pbmltaXplIHRoZSByaXNrIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgZmluaXNoaW5nIGxhdGUgaWYgaXRzIGRlcGVuZGVudCBCcmVha2Rvd24gRWxlbWVudHMgc2xpcC4gSWYgYSByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhlIG1pbGVzdG9uZSBvciBwcm9qZWN0IGZpbmlzaCBkYXRlLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgZXhhY3RseSB3aGVuIGFuZCB5b3UgZG9uJ3Qgd2FudCBhIGxhdGUgZmluaXNoIHRvIGFmZmVjdCB0aGUganVzdC1pbi10aW1lIEJyZWFrZG93biBFbGVtZW50LCB5b3UgY2FuIGNyZWF0ZSBhbiBTRiBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIEJyZWFrZG93biBFbGVtZW50IHlvdSB3YW50IHNjaGVkdWxlZCBqdXN0IGluIHRpbWUgKHRoZSBwcmVkZWNlc3NvcikgYW5kIGl0cyByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50ICh0aGUgc3VjY2Vzc29yKS4gVGhlbiBpZiB5b3UgdXBkYXRlIHByb2dyZXNzIG9uIHRoZSBzdWNjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQsIGl0IHdvbid0IGFmZmVjdCB0aGUgc2NoZWR1bGVkIGRhdGVzIG9mIHRoZSBwcmVkZWNlc3NvciBCcmVha2Rvd24gRWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fRklOSVNICi0JICogQG1vZGVsIG5hbWU9InN0YXJ0VG9GaW5pc2giCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfVE9fRklOSVNIX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGVbXSBWQUxVRVNfQVJSQVkgPSBuZXcgV29ya09yZGVyVHlwZVtdIHsKLQkJCUZJTklTSF9UT19TVEFSVCwgRklOSVNIX1RPX0ZJTklTSCwgU1RBUlRfVE9fU1RBUlQsIFNUQVJUX1RPX0ZJTklTSCwgfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxXb3JrT3JkZXJUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucwotCQkJLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJY2FzZSBGSU5JU0hfVE9fU1RBUlRfVkFMVUU6Ci0JCQlyZXR1cm4gRklOSVNIX1RPX1NUQVJUOwotCQljYXNlIEZJTklTSF9UT19GSU5JU0hfVkFMVUU6Ci0JCQlyZXR1cm4gRklOSVNIX1RPX0ZJTklTSDsKLQkJY2FzZSBTVEFSVF9UT19TVEFSVF9WQUxVRToKLQkJCXJldHVybiBTVEFSVF9UT19TVEFSVDsKLQkJY2FzZSBTVEFSVF9UT19GSU5JU0hfVkFMVUU6Ci0JCQlyZXR1cm4gU1RBUlRfVE9fRklOSVNIOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXb3JrT3JkZXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDg4ZWVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLSAqIEEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotICogCi0gKiBUaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFdvcmsgUHJvZHVjdCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdCBleHRlbmRzIENvbnRlbnRFbGVtZW50LCBGdWxmaWxsYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UmVwb3J0PiBnZXRSZXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8VG9vbE1lbnRvcj4gZ2V0VG9vbE1lbnRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi19IC8vIFdvcmtQcm9kdWN0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGIwNGRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFzb25zRm9yTm90TmVlZGluZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWUxMWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLQkgKiBGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3QgZ2V0V29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RlZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzCi0JICogQG1vZGVsIG9wcG9zaXRlPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEltcGFjdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW1wYWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbXBhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA3MmFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdFR5cGUgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdD4gZ2V0V29ya1Byb2R1Y3RzKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3RUeXBlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTEwNmI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0SG93dG9TdGFmZiA8ZW0+SG93dG8gU3RhZmY8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBBY3Rpdml0eURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsdGVybmF0aXZlcyA9IEFMVEVSTkFUSVZFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3d0b1N0YWZmKCkgPGVtPkhvd3RvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3d0b1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIT1dUT19TVEFGRl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93dG9TdGFmZigpIDxlbT5Ib3d0byBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG93dG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob3d0b1N0YWZmID0gSE9XVE9fU1RBRkZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UsIG9sZFB1cnBvc2UsCi0JCQkJCXB1cnBvc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIGFsdGVybmF0aXZlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIG5ld0FsdGVybmF0aXZlcykgewotCQlTdHJpbmcgb2xkQWx0ZXJuYXRpdmVzID0gYWx0ZXJuYXRpdmVzOwotCQlhbHRlcm5hdGl2ZXMgPSBuZXdBbHRlcm5hdGl2ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywKLQkJCQkJb2xkQWx0ZXJuYXRpdmVzLCBhbHRlcm5hdGl2ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvd3RvU3RhZmYoKSB7Ci0JCXJldHVybiBob3d0b1N0YWZmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvd3RvU3RhZmYoU3RyaW5nIG5ld0hvd3RvU3RhZmYpIHsKLQkJU3RyaW5nIG9sZEhvd3RvU3RhZmYgPSBob3d0b1N0YWZmOwotCQlob3d0b1N0YWZmID0gbmV3SG93dG9TdGFmZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYsCi0JCQkJCW9sZEhvd3RvU3RhZmYsIGhvd3RvU3RhZmYpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJcmV0dXJuIGdldEFsdGVybmF0aXZlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJcmV0dXJuIGdldEhvd3RvU3RhZmYoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlzZXRBbHRlcm5hdGl2ZXMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJc2V0SG93dG9TdGFmZigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcyhBTFRFUk5BVElWRVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJc2V0SG93dG9TdGFmZihIT1dUT19TVEFGRl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJcmV0dXJuIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9PSBudWxsID8gYWx0ZXJuYXRpdmVzICE9IG51bGwKLQkJCQkJOiAhQUxURVJOQVRJVkVTX0VERUZBVUxULmVxdWFscyhhbHRlcm5hdGl2ZXMpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJcmV0dXJuIEhPV1RPX1NUQUZGX0VERUZBVUxUID09IG51bGwgPyBob3d0b1N0YWZmICE9IG51bGwKLQkJCQkJOiAhSE9XVE9fU1RBRkZfRURFRkFVTFQuZXF1YWxzKGhvd3RvU3RhZmYpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHB1cnBvc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWx0ZXJuYXRpdmVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG93dG9TdGFmZjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChob3d0b1N0YWZmKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3ZWRmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRGdWxmaWxscyA8ZW0+RnVsZmlsbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFJvYWRtYXBzIDxlbT5Sb2FkbWFwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGZpbGxzKCkgPGVtPkZ1bGZpbGxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bGZpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBmdWxmaWxsczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlFbGVtZW50IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyZWFrZG93bkVsZW1lbnRzKCkgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGJyZWFrZG93bkVsZW1lbnRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9hZG1hcHMoKSA8ZW0+Um9hZG1hcHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9hZG1hcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2FkbWFwPiByb2FkbWFwczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBnZXRGdWxmaWxscygpIHsKLQkJaWYgKGZ1bGZpbGxzID09IG51bGwpIHsKLQkJCWZ1bGZpbGxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KAotCQkJCQlGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0ZVTEZJTExTKTsKLQkJfQotCQlyZXR1cm4gZnVsZmlsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUCi0JCQkJOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwKLQkJCQkJdmFyaWFiaWxpdHlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwKLQkJCQkJCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQlwcmVjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQcmVjb25kaXRpb24pOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBvbGRQcmVjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcmVjb25kaXRpb24KLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBudWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UHJlY29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1ByZWNvbmRpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBudWxsLAotCQkJCQkJCW1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwKLQkJCQkJCQlwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLAotCQkJCQlvbGRQcmVjb25kaXRpb24sIG5ld1ByZWNvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24pIHsKLQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBwcmVjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlY29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbmV3UHJlY29uZGl0aW9uLAotCQkJCQluZXdQcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcG9zdGNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJcG9zdGNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFBvc3Rjb25kaXRpb24pOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gb2xkUG9zdGNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUG9zdGNvbmRpdGlvbi5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQludWxsKTsKLQkJCQlpZiAobmV3UG9zdGNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3N0Y29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJCW1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLAotCQkJCQkJCW9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwKLQkJCQkJb2xkUG9zdGNvbmRpdGlvbiwgbmV3UG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbikgewotCQlpZiAobmV3UG9zdGNvbmRpdGlvbiAhPSBwb3N0Y29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQltc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQltc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3Rjb25kaXRpb24obmV3UG9zdGNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG5ld1Bvc3Rjb25kaXRpb24sCi0JCQkJCW5ld1Bvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxCcmVha2Rvd25FbGVtZW50PiBnZXRCcmVha2Rvd25FbGVtZW50cygpIHsKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnRzID09IG51bGwpIHsKLQkJCWJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KAotCQkJCQlCcmVha2Rvd25FbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMpOwotCQl9Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2FkbWFwPiBnZXRSb2FkbWFwcygpIHsKLQkJaWYgKHJvYWRtYXBzID09IG51bGwpIHsKLQkJCXJvYWRtYXBzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2FkbWFwPihSb2FkbWFwLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUyk7Ci0JCX0KLQkJcmV0dXJuIHJvYWRtYXBzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcmVjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFBvc3Rjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0ZVTEZJTExTOgotCQkJcmV0dXJuIGdldEZ1bGZpbGxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc3Rjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCXJldHVybiBnZXRSb2FkbWFwcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlnZXRGdWxmaWxscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEZ1bGZpbGxhYmxlRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlnZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlnZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUFM6Ci0JCQlnZXRSb2FkbWFwcygpLmNsZWFyKCk7Ci0JCQlnZXRSb2FkbWFwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9hZG1hcD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZShWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlnZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUFM6Ci0JCQlnZXRSb2FkbWFwcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlICE9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIHByZWNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCXJldHVybiBicmVha2Rvd25FbGVtZW50cyAhPSBudWxsICYmICFicmVha2Rvd25FbGVtZW50cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUFM6Ci0JCQlyZXR1cm4gcm9hZG1hcHMgIT0gbnVsbCAmJiAhcm9hZG1hcHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0ZVTEZJTExTOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFyaWFiaWxpdHlUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTAyODVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCBleHRlbmRzIENsYXNzaWZpZXJJbXBsIGltcGxlbWVudHMKLQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUHJpbWFyeUV4dGVuc2lvbigpIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkgPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUHJpbWFyeUV4dGVuc2lvbiA9IElTX1BSSU1BUllfRVhURU5TSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBpc1ByaW1hcnlFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKEJvb2xlYW4gbmV3SXNQcmltYXJ5RXh0ZW5zaW9uKSB7Ci0JCUJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uID0gaXNQcmltYXJ5RXh0ZW5zaW9uOwotCQlpc1ByaW1hcnlFeHRlbnNpb24gPSBuZXdJc1ByaW1hcnlFeHRlbnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQl0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiwKLQkJCQkJb2xkSXNQcmltYXJ5RXh0ZW5zaW9uLCBpc1ByaW1hcnlFeHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQlyZXR1cm4gZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXNldElzUHJpbWFyeUV4dGVuc2lvbigoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXNldElzUHJpbWFyeUV4dGVuc2lvbihJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQlyZXR1cm4gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IGlzUHJpbWFyeUV4dGVuc2lvbiAhPSBudWxsCi0JCQkJCTogIUlTX1BSSU1BUllfRVhURU5TSU9OX0VERUZBVUxULmVxdWFscyhpc1ByaW1hcnlFeHRlbnNpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzUHJpbWFyeUV4dGVuc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1ByaW1hcnlFeHRlbnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzJkNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgQXJ0aWZhY3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfT1VUTElORV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZk91dGxpbmUgPSBCUklFRl9PVVRMSU5FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVwcmVzZW50YXRpb25PcHRpb25zID0gUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXByZXNlbnRhdGlvbigpIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uKCkgPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbiA9IFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGF0aW9uKCkgPGVtPk5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90YXRpb24oKSA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGF0aW9uID0gTk9UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiBicmllZk91dGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyBuZXdCcmllZk91dGxpbmUpIHsKLQkJU3RyaW5nIG9sZEJyaWVmT3V0bGluZSA9IGJyaWVmT3V0bGluZTsKLQkJYnJpZWZPdXRsaW5lID0gbmV3QnJpZWZPdXRsaW5lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FLAotCQkJCQlvbGRCcmllZk91dGxpbmUsIGJyaWVmT3V0bGluZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb25PcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgbmV3UmVwcmVzZW50YXRpb25PcHRpb25zKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPSByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JCXJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IG5ld1JlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywKLQkJCQkJb2xkUmVwcmVzZW50YXRpb25PcHRpb25zLCByZXByZXNlbnRhdGlvbk9wdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nIG5ld1JlcHJlc2VudGF0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbiA9IHJlcHJlc2VudGF0aW9uOwotCQlyZXByZXNlbnRhdGlvbiA9IG5ld1JlcHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTiwKLQkJCQkJb2xkUmVwcmVzZW50YXRpb24sIHJlcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uKFN0cmluZyBuZXdOb3RhdGlvbikgewotCQlTdHJpbmcgb2xkTm90YXRpb24gPSBub3RhdGlvbjsKLQkJbm90YXRpb24gPSBuZXdOb3RhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04sIG9sZE5vdGF0aW9uLAotCQkJCQlub3RhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJcmV0dXJuIGdldEJyaWVmT3V0bGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXJldHVybiBnZXROb3RhdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCXNldEJyaWVmT3V0bGluZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlzZXRSZXByZXNlbnRhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQlzZXROb3RhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlzZXRCcmllZk91dGxpbmUoQlJJRUZfT1VUTElORV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCXNldFJlcHJlc2VudGF0aW9uKFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXNldE5vdGF0aW9uKE5PVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJcmV0dXJuIEJSSUVGX09VVExJTkVfRURFRkFVTFQgPT0gbnVsbCA/IGJyaWVmT3V0bGluZSAhPSBudWxsCi0JCQkJCTogIUJSSUVGX09VVExJTkVfRURFRkFVTFQuZXF1YWxzKGJyaWVmT3V0bGluZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXJldHVybiBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUID09IG51bGwgPyByZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gbnVsbAotCQkJCQk6ICFSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyByZXByZXNlbnRhdGlvbiAhPSBudWxsCi0JCQkJCTogIVJFUFJFU0VOVEFUSU9OX0VERUZBVUxULmVxdWFscyhyZXByZXNlbnRhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQlyZXR1cm4gTk9UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG5vdGF0aW9uICE9IG51bGwKLQkJCQkJOiAhTk9UQVRJT05fRURFRkFVTFQuZXF1YWxzKG5vdGF0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChicmllZk91dGxpbmU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYnJpZWZPdXRsaW5lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXByZXNlbnRhdGlvbk9wdGlvbnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVwcmVzZW50YXRpb25PcHRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXByZXNlbnRhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90YXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobm90YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmUwMzQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsI2dldENvbnRhaW5lckFydGlmYWN0IDxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzIDxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgQXJ0aWZhY3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8QXJ0aWZhY3Q+IGNvbnRhaW5lZEFydGlmYWN0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGdldENvbnRhaW5lckFydGlmYWN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBcnRpZmFjdCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBiYXNpY0dldENvbnRhaW5lckFydGlmYWN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBcnRpZmFjdCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyQXJ0aWZhY3QoCi0JCQlBcnRpZmFjdCBuZXdDb250YWluZXJBcnRpZmFjdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lckFydGlmYWN0LAotCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0IG5ld0NvbnRhaW5lckFydGlmYWN0KSB7Ci0JCWlmIChuZXdDb250YWluZXJBcnRpZmFjdCAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCAmJiBuZXdDb250YWluZXJBcnRpZmFjdCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdDb250YWluZXJBcnRpZmFjdCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdDb250YWluZXJBcnRpZmFjdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyQXJ0aWZhY3QpLmVJbnZlcnNlQWRkKAotCQkJCQkJdGhpcywgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUywKLQkJCQkJCUFydGlmYWN0LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KG5ld0NvbnRhaW5lckFydGlmYWN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNULAotCQkJCQluZXdDb250YWluZXJBcnRpZmFjdCwgbmV3Q29udGFpbmVyQXJ0aWZhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxBcnRpZmFjdD4gZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkgewotCQlpZiAoY29udGFpbmVkQXJ0aWZhY3RzID09IG51bGwpIHsKLQkJCWNvbnRhaW5lZEFydGlmYWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxBcnRpZmFjdD4oCi0JCQkJCUFydGlmYWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTLAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpOwotCQl9Ci0JCXJldHVybiBjb250YWluZWRBcnRpZmFjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KChBcnRpZmFjdCkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDb250YWluZWRBcnRpZmFjdHMoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXJBcnRpZmFjdChudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsIEFydGlmYWN0LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuIGdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJc2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWdldENvbnRhaW5lZEFydGlmYWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRDb250YWluZWRBcnRpZmFjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcnRpZmFjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJc2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXJBcnRpZmFjdCgpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCXJldHVybiBjb250YWluZWRBcnRpZmFjdHMgIT0gbnVsbCAmJiAhY29udGFpbmVkQXJ0aWZhY3RzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQXJ0aWZhY3RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzNDllOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlR3VpZGFuY2UoKSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX0dVSURBTkNFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzYWdlR3VpZGFuY2UgPSBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2VHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHVzYWdlR3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcgbmV3VXNhZ2VHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkVXNhZ2VHdWlkYW5jZSA9IHVzYWdlR3VpZGFuY2U7Ci0JCXVzYWdlR3VpZGFuY2UgPSBuZXdVc2FnZUd1aWRhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSwKLQkJCQkJb2xkVXNhZ2VHdWlkYW5jZSwgdXNhZ2VHdWlkYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXJldHVybiBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXNldFVzYWdlR3VpZGFuY2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXNldFVzYWdlR3VpZGFuY2UoVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJcmV0dXJuIFVTQUdFX0dVSURBTkNFX0VERUZBVUxUID09IG51bGwgPyB1c2FnZUd1aWRhbmNlICE9IG51bGwKLQkJCQkJOiAhVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQuZXF1YWxzKHVzYWdlR3VpZGFuY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVzYWdlR3VpZGFuY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXNhZ2VHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODQ5YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0Q29uY2VwdHMgPGVtPkNvbmNlcHRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFJldXNhYmxlQXNzZXRzIDxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0VG9vbG1lbnRvciA8ZW0+VG9vbG1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNQbGFubmVkKCkgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzUGxhbm5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1BMQU5ORURfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1BsYW5uZWQgPSBJU19QTEFOTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT3B0aW9uYWwoKSA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19PUFRJT05BTF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc09wdGlvbmFsKCkgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc09wdGlvbmFsID0gSVNfT1BUSU9OQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRBZnRlcigpIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBwcmVzZW50ZWRBZnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEJlZm9yZSgpIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEJlZm9yZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBsYW5uaW5nRGF0YSgpIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQbGFubmluZ0RhdGEgcGxhbm5pbmdEYXRhOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cGVyQWN0aXZpdGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5IHN1cGVyQWN0aXZpdGllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoZWNrbGlzdHMoKSA8ZW0+Q2hlY2tsaXN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGVja2xpc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q2hlY2tsaXN0PiBjaGVja2xpc3RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uY2VwdHMoKSA8ZW0+Q29uY2VwdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uY2VwdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDb25jZXB0PiBjb25jZXB0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4YW1wbGVzKCkgPGVtPkV4YW1wbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4YW1wbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXhhbXBsZT4gZXhhbXBsZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkZWxpbmVzKCkgPGVtPkd1aWRlbGluZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZGVsaW5lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEd1aWRlbGluZT4gZ3VpZGVsaW5lczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldXNhYmxlQXNzZXRzKCkgPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXVzYWJsZUFzc2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJldXNhYmxlQXNzZXQ+IHJldXNhYmxlQXNzZXRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBzdXBwb3J0aW5nTWF0ZXJpYWxzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVtcGxhdGVzKCkgPGVtPlRlbXBsYXRlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZW1wbGF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUZW1wbGF0ZT4gdGVtcGxhdGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwb3J0cygpIDxlbT5SZXBvcnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcG9ydHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSZXBvcnQ+IHJlcG9ydHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKSA8ZW0+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbG1lbnRvcigpIDxlbT5Ub29sbWVudG9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2xtZW50b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUb29sTWVudG9yPiB0b29sbWVudG9yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgbmV3UHJlZml4KSB7Ci0JCVN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0JCXByZWZpeCA9IG5ld1ByZWZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIGlzUGxhbm5lZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1BsYW5uZWQoQm9vbGVhbiBuZXdJc1BsYW5uZWQpIHsKLQkJQm9vbGVhbiBvbGRJc1BsYW5uZWQgPSBpc1BsYW5uZWQ7Ci0JCWlzUGxhbm5lZCA9IG5ld0lzUGxhbm5lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLAotCQkJCQlpc1BsYW5uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gaGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKEJvb2xlYW4gbmV3SGFzTXVsdGlwbGVPY2N1cnJlbmNlcykgewotCQlCb29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gbmV3SGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJCQlvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPcHRpb25hbChCb29sZWFuIG5ld0lzT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRJc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQkJaXNPcHRpb25hbCA9IG5ld0lzT3B0aW9uYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMLCBvbGRJc09wdGlvbmFsLAotCQkJCQlpc09wdGlvbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCWlmIChwcmVzZW50ZWRBZnRlciAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlc2VudGVkQWZ0ZXIpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVzZW50ZWRBZnRlciA9IChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRlZEFmdGVyOwotCQkJcHJlc2VudGVkQWZ0ZXIgPSAoQnJlYWtkb3duRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRQcmVzZW50ZWRBZnRlcik7Ci0JCQlpZiAocHJlc2VudGVkQWZ0ZXIgIT0gb2xkUHJlc2VudGVkQWZ0ZXIpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwKLQkJCQkJCQlvbGRQcmVzZW50ZWRBZnRlciwgcHJlc2VudGVkQWZ0ZXIpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlc2VudGVkQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgYmFzaWNHZXRQcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEFmdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRlZEFmdGVyKEJyZWFrZG93bkVsZW1lbnQgbmV3UHJlc2VudGVkQWZ0ZXIpIHsKLQkJQnJlYWtkb3duRWxlbWVudCBvbGRQcmVzZW50ZWRBZnRlciA9IHByZXNlbnRlZEFmdGVyOwotCQlwcmVzZW50ZWRBZnRlciA9IG5ld1ByZXNlbnRlZEFmdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIsCi0JCQkJCW9sZFByZXNlbnRlZEFmdGVyLCBwcmVzZW50ZWRBZnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEJlZm9yZSgpIHsKLQkJaWYgKHByZXNlbnRlZEJlZm9yZSAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlc2VudGVkQmVmb3JlKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlc2VudGVkQmVmb3JlID0gKEludGVybmFsRU9iamVjdCkgcHJlc2VudGVkQmVmb3JlOwotCQkJcHJlc2VudGVkQmVmb3JlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlc2VudGVkQmVmb3JlKTsKLQkJCWlmIChwcmVzZW50ZWRCZWZvcmUgIT0gb2xkUHJlc2VudGVkQmVmb3JlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQkJCW9sZFByZXNlbnRlZEJlZm9yZSwgcHJlc2VudGVkQmVmb3JlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBiYXNpY0dldFByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50ZWRCZWZvcmUoQnJlYWtkb3duRWxlbWVudCBuZXdQcmVzZW50ZWRCZWZvcmUpIHsKLQkJQnJlYWtkb3duRWxlbWVudCBvbGRQcmVzZW50ZWRCZWZvcmUgPSBwcmVzZW50ZWRCZWZvcmU7Ci0JCXByZXNlbnRlZEJlZm9yZSA9IG5ld1ByZXNlbnRlZEJlZm9yZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSwKLQkJCQkJb2xkUHJlc2VudGVkQmVmb3JlLCBwcmVzZW50ZWRCZWZvcmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGdldFBsYW5uaW5nRGF0YSgpIHsKLQkJaWYgKHBsYW5uaW5nRGF0YSAhPSBudWxsICYmICgoRU9iamVjdCkgcGxhbm5pbmdEYXRhKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUGxhbm5pbmdEYXRhID0gKEludGVybmFsRU9iamVjdCkgcGxhbm5pbmdEYXRhOwotCQkJcGxhbm5pbmdEYXRhID0gKFBsYW5uaW5nRGF0YSkgZVJlc29sdmVQcm94eShvbGRQbGFubmluZ0RhdGEpOwotCQkJaWYgKHBsYW5uaW5nRGF0YSAhPSBvbGRQbGFubmluZ0RhdGEpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UGxhbm5pbmdEYXRhID0gKEludGVybmFsRU9iamVjdCkgcGxhbm5pbmdEYXRhOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQbGFubmluZ0RhdGEuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1BsYW5uaW5nRGF0YS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQbGFubmluZ0RhdGEKLQkJCQkJCQkuZUludmVyc2VBZGQoCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJCQktIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCQkJCQludWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCQlvbGRQbGFubmluZ0RhdGEsIHBsYW5uaW5nRGF0YSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBsYW5uaW5nRGF0YSBiYXNpY0dldFBsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG5ld1BsYW5uaW5nRGF0YSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUGxhbm5pbmdEYXRhIG9sZFBsYW5uaW5nRGF0YSA9IHBsYW5uaW5nRGF0YTsKLQkJcGxhbm5pbmdEYXRhID0gbmV3UGxhbm5pbmdEYXRhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQlvbGRQbGFubmluZ0RhdGEsIG5ld1BsYW5uaW5nRGF0YSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG5ld1BsYW5uaW5nRGF0YSkgewotCQlpZiAobmV3UGxhbm5pbmdEYXRhICE9IHBsYW5uaW5nRGF0YSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGxhbm5pbmdEYXRhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwbGFubmluZ0RhdGEpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1BsYW5uaW5nRGF0YSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UGxhbm5pbmdEYXRhKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBsYW5uaW5nRGF0YShuZXdQbGFubmluZ0RhdGEsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQluZXdQbGFubmluZ0RhdGEsIG5ld1BsYW5uaW5nRGF0YSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBnZXRTdXBlckFjdGl2aXRpZXMoKSB7Ci0JCWlmIChzdXBlckFjdGl2aXRpZXMgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHN1cGVyQWN0aXZpdGllcykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN1cGVyQWN0aXZpdGllcyA9IChJbnRlcm5hbEVPYmplY3QpIHN1cGVyQWN0aXZpdGllczsKLQkJCXN1cGVyQWN0aXZpdGllcyA9IChBY3Rpdml0eSkgZVJlc29sdmVQcm94eShvbGRTdXBlckFjdGl2aXRpZXMpOwotCQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBvbGRTdXBlckFjdGl2aXRpZXMpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCQkJb2xkU3VwZXJBY3Rpdml0aWVzLCBzdXBlckFjdGl2aXRpZXMpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXJBY3Rpdml0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBiYXNpY0dldFN1cGVyQWN0aXZpdGllcygpIHsKLQkJcmV0dXJuIHN1cGVyQWN0aXZpdGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMoCi0JCQlBY3Rpdml0eSBuZXdTdXBlckFjdGl2aXRpZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQWN0aXZpdHkgb2xkU3VwZXJBY3Rpdml0aWVzID0gc3VwZXJBY3Rpdml0aWVzOwotCQlzdXBlckFjdGl2aXRpZXMgPSBuZXdTdXBlckFjdGl2aXRpZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCW9sZFN1cGVyQWN0aXZpdGllcywgbmV3U3VwZXJBY3Rpdml0aWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyQWN0aXZpdGllcyhBY3Rpdml0eSBuZXdTdXBlckFjdGl2aXRpZXMpIHsKLQkJaWYgKG5ld1N1cGVyQWN0aXZpdGllcyAhPSBzdXBlckFjdGl2aXRpZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJBY3Rpdml0aWVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLAotCQkJCQkJQWN0aXZpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1N1cGVyQWN0aXZpdGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U3VwZXJBY3Rpdml0aWVzKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLAotCQkJCQkJQWN0aXZpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3VwZXJBY3Rpdml0aWVzKG5ld1N1cGVyQWN0aXZpdGllcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCW5ld1N1cGVyQWN0aXZpdGllcywgbmV3U3VwZXJBY3Rpdml0aWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q2hlY2tsaXN0PiBnZXRDaGVja2xpc3RzKCkgewotCQlpZiAoY2hlY2tsaXN0cyA9PSBudWxsKSB7Ci0JCQljaGVja2xpc3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDaGVja2xpc3Q+KENoZWNrbGlzdC5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUyk7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrbGlzdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q29uY2VwdD4gZ2V0Q29uY2VwdHMoKSB7Ci0JCWlmIChjb25jZXB0cyA9PSBudWxsKSB7Ci0JCQljb25jZXB0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29uY2VwdD4oQ29uY2VwdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFMpOwotCQl9Ci0JCXJldHVybiBjb25jZXB0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxFeGFtcGxlPiBnZXRFeGFtcGxlcygpIHsKLQkJaWYgKGV4YW1wbGVzID09IG51bGwpIHsKLQkJCWV4YW1wbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxFeGFtcGxlPihFeGFtcGxlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUyk7Ci0JCX0KLQkJcmV0dXJuIGV4YW1wbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEd1aWRlbGluZT4gZ2V0R3VpZGVsaW5lcygpIHsKLQkJaWYgKGd1aWRlbGluZXMgPT0gbnVsbCkgewotCQkJZ3VpZGVsaW5lcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8R3VpZGVsaW5lPihHdWlkZWxpbmUuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVMpOwotCQl9Ci0JCXJldHVybiBndWlkZWxpbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJldXNhYmxlQXNzZXQ+IGdldFJldXNhYmxlQXNzZXRzKCkgewotCQlpZiAocmV1c2FibGVBc3NldHMgPT0gbnVsbCkgewotCQkJcmV1c2FibGVBc3NldHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJldXNhYmxlQXNzZXQ+KAotCQkJCQlSZXVzYWJsZUFzc2V0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMpOwotCQl9Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSB7Ci0JCWlmIChzdXBwb3J0aW5nTWF0ZXJpYWxzID09IG51bGwpIHsKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4oCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQl9Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKSB7Ci0JCWlmICh0ZW1wbGF0ZXMgPT0gbnVsbCkgewotCQkJdGVtcGxhdGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUZW1wbGF0ZT4oVGVtcGxhdGUuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUyk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSZXBvcnQ+IGdldFJlcG9ydHMoKSB7Ci0JCWlmIChyZXBvcnRzID09IG51bGwpIHsKLQkJCXJlcG9ydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJlcG9ydD4oUmVwb3J0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcmVwb3J0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGdldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpIHsKLQkJaWYgKGVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA9PSBudWxsKSB7Ci0JCQllc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4oCi0JCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xtZW50b3IoKSB7Ci0JCWlmICh0b29sbWVudG9yID09IG51bGwpIHsKLQkJCXRvb2xtZW50b3IgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRvb2xNZW50b3I+KAotCQkJCQlUb29sTWVudG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SKTsKLQkJfQotCQlyZXR1cm4gdG9vbG1lbnRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlpZiAoc3VwZXJBY3Rpdml0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlckFjdGl2aXRpZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsCi0JCQkJCQlBY3Rpdml0eS5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMoKEFjdGl2aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCXJldHVybiBiYXNpY1NldFBsYW5uaW5nRGF0YShudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJcmV0dXJuIGJhc2ljU2V0U3VwZXJBY3Rpdml0aWVzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJcmV0dXJuIGdldFByZWZpeCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQlyZXR1cm4gZ2V0SXNQbGFubmVkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJcmV0dXJuIGdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXJldHVybiBnZXRJc09wdGlvbmFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVzZW50ZWRBZnRlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBsYW5uaW5nRGF0YSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0UGxhbm5pbmdEYXRhKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCXJldHVybiBiYXNpY0dldFN1cGVyQWN0aXZpdGllcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlyZXR1cm4gZ2V0Q2hlY2tsaXN0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOgotCQkJcmV0dXJuIGdldENvbmNlcHRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlyZXR1cm4gZ2V0RXhhbXBsZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJcmV0dXJuIGdldEd1aWRlbGluZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM6Ci0JCQlyZXR1cm4gZ2V0UmV1c2FibGVBc3NldHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCXJldHVybiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOgotCQkJcmV0dXJuIGdldFRlbXBsYXRlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM6Ci0JCQlyZXR1cm4gZ2V0UmVwb3J0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBnZXRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOgotCQkJcmV0dXJuIGdldFRvb2xtZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCXNldFByZWZpeCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCXNldElzUGxhbm5lZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXNldElzT3B0aW9uYWwoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQlzZXRQcmVzZW50ZWRBZnRlcigoQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlzZXRQcmVzZW50ZWRCZWZvcmUoKEJyZWFrZG93bkVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJc2V0UGxhbm5pbmdEYXRhKChQbGFubmluZ0RhdGEpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJc2V0U3VwZXJBY3Rpdml0aWVzKChBY3Rpdml0eSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlnZXRDaGVja2xpc3RzKCkuY2xlYXIoKTsKLQkJCWdldENoZWNrbGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENoZWNrbGlzdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzoKLQkJCWdldENvbmNlcHRzKCkuY2xlYXIoKTsKLQkJCWdldENvbmNlcHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25jZXB0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJZ2V0RXhhbXBsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEV4YW1wbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCWdldEd1aWRlbGluZXMoKS5jbGVhcigpOwotCQkJZ2V0R3VpZGVsaW5lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3VpZGVsaW5lPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuY2xlYXIoKTsKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmV1c2FibGVBc3NldD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM6Ci0JCQlnZXRUZW1wbGF0ZXMoKS5jbGVhcigpOwotCQkJZ2V0VGVtcGxhdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUZW1wbGF0ZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTOgotCQkJZ2V0UmVwb3J0cygpLmNsZWFyKCk7Ci0JCQlnZXRSZXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXBvcnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOgotCQkJZ2V0VG9vbG1lbnRvcigpLmNsZWFyKCk7Ci0JCQlnZXRUb29sbWVudG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJc2V0SXNQbGFubmVkKElTX1BMQU5ORURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXNldElzT3B0aW9uYWwoSVNfT1BUSU9OQUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCXNldFByZXNlbnRlZEFmdGVyKChCcmVha2Rvd25FbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJc2V0UHJlc2VudGVkQmVmb3JlKChCcmVha2Rvd25FbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJc2V0UGxhbm5pbmdEYXRhKChQbGFubmluZ0RhdGEpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlzZXRTdXBlckFjdGl2aXRpZXMoKEFjdGl2aXR5KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJZ2V0Q2hlY2tsaXN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM6Ci0JCQlnZXRDb25jZXB0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCWdldEd1aWRlbGluZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzoKLQkJCWdldFRlbXBsYXRlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzoKLQkJCWdldFJlcG9ydHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjoKLQkJCWdldFRvb2xtZW50b3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCXJldHVybiBQUkVGSVhfRURFRkFVTFQgPT0gbnVsbCA/IHByZWZpeCAhPSBudWxsIDogIVBSRUZJWF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHByZWZpeCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCXJldHVybiBJU19QTEFOTkVEX0VERUZBVUxUID09IG51bGwgPyBpc1BsYW5uZWQgIT0gbnVsbAotCQkJCQk6ICFJU19QTEFOTkVEX0VERUZBVUxULmVxdWFscyhpc1BsYW5uZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXJldHVybiBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQgPT0gbnVsbCA/IGhhc011bHRpcGxlT2NjdXJyZW5jZXMgIT0gbnVsbAotCQkJCQk6ICFIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGhhc011bHRpcGxlT2NjdXJyZW5jZXMpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJcmV0dXJuIElTX09QVElPTkFMX0VERUZBVUxUID09IG51bGwgPyBpc09wdGlvbmFsICE9IG51bGwKLQkJCQkJOiAhSVNfT1BUSU9OQUxfRURFRkFVTFQuZXF1YWxzKGlzT3B0aW9uYWwpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCXJldHVybiBwcmVzZW50ZWRBZnRlciAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlyZXR1cm4gcHJlc2VudGVkQmVmb3JlICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCXJldHVybiBwbGFubmluZ0RhdGEgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJcmV0dXJuIHN1cGVyQWN0aXZpdGllcyAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlyZXR1cm4gY2hlY2tsaXN0cyAhPSBudWxsICYmICFjaGVja2xpc3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzoKLQkJCXJldHVybiBjb25jZXB0cyAhPSBudWxsICYmICFjb25jZXB0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlyZXR1cm4gZXhhbXBsZXMgIT0gbnVsbCAmJiAhZXhhbXBsZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlyZXR1cm4gZ3VpZGVsaW5lcyAhPSBudWxsICYmICFndWlkZWxpbmVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM6Ci0JCQlyZXR1cm4gcmV1c2FibGVBc3NldHMgIT0gbnVsbCAmJiAhcmV1c2FibGVBc3NldHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbHMgIT0gbnVsbAotCQkJCQkmJiAhc3VwcG9ydGluZ01hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOgotCQkJcmV0dXJuIHRlbXBsYXRlcyAhPSBudWxsICYmICF0ZW1wbGF0ZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM6Ci0JCQlyZXR1cm4gcmVwb3J0cyAhPSBudWxsICYmICFyZXBvcnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIWVzdGltYXRpb25jb25zaWRlcmF0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjoKLQkJCXJldHVybiB0b29sbWVudG9yICE9IG51bGwgJiYgIXRvb2xtZW50b3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWZpeDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzUGxhbm5lZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1BsYW5uZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhhc011bHRpcGxlT2NjdXJyZW5jZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNPcHRpb25hbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc09wdGlvbmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkZGEwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cwotCQlDYXBhYmlsaXR5UGF0dGVybiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNBUEFCSUxJVFlfUEFUVEVSTjsKLQl9Ci0KLX0gLy9DYXBhYmlsaXR5UGF0dGVybkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2M0ZmUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBDaGVja2xpc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENoZWNrbGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0hFQ0tMSVNUOwotCX0KLQotfSAvL0NoZWNrbGlzdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DbGFzc2lmaWVySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NsYXNzaWZpZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2Y2FmNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NsYXNzaWZpZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2xhc3NpZmllcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsI2dldElzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NpZmllckltcGwgZXh0ZW5kcyBUeXBlSW1wbCBpbXBsZW1lbnRzIENsYXNzaWZpZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzQWJzdHJhY3QoKSA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19BQlNUUkFDVF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNBYnN0cmFjdCgpIDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNBYnN0cmFjdCA9IElTX0FCU1RSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzaWZpZXJJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNMQVNTSUZJRVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIGlzQWJzdHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNBYnN0cmFjdChCb29sZWFuIG5ld0lzQWJzdHJhY3QpIHsKLQkJQm9vbGVhbiBvbGRJc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKLQkJaXNBYnN0cmFjdCA9IG5ld0lzQWJzdHJhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIG9sZElzQWJzdHJhY3QsCi0JCQkJCWlzQWJzdHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSX19JU19BQlNUUkFDVDoKLQkJCXJldHVybiBnZXRJc0Fic3RyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdChJU19BQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSX19JU19BQlNUUkFDVDoKLQkJCXJldHVybiBJU19BQlNUUkFDVF9FREVGQVVMVCA9PSBudWxsID8gaXNBYnN0cmFjdCAhPSBudWxsCi0JCQkJCTogIUlTX0FCU1RSQUNUX0VERUZBVUxULmVxdWFscyhpc0Fic3RyYWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc0Fic3RyYWN0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzQWJzdHJhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DbGFzc2lmaWVySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbXBvc2l0ZVJvbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNGVhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9zaXRlIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCNnZXRBZ2dyZWdhdGVkUm9sZXMgPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlSW1wbCBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzCi0JCUNvbXBvc2l0ZVJvbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWdncmVnYXRlZFJvbGVzKCkgPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWdncmVnYXRlZFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZT4gYWdncmVnYXRlZFJvbGVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZVJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlcygpIHsKLQkJaWYgKGFnZ3JlZ2F0ZWRSb2xlcyA9PSBudWxsKSB7Ci0JCQlhZ2dyZWdhdGVkUm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGU+KFJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBhZ2dyZWdhdGVkUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVM6Ci0JCQlyZXR1cm4gZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJZ2V0QWdncmVnYXRlZFJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCXJldHVybiBhZ2dyZWdhdGVkUm9sZXMgIT0gbnVsbCAmJiAhYWdncmVnYXRlZFJvbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29tcG9zaXRlUm9sZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjE3NTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uY2VwdEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBDb25jZXB0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25jZXB0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05DRVBUOwotCX0KLQotfSAvL0NvbmNlcHRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzA2NGU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25zdHJhaW50SW1wbCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnN0cmFpbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvZHkoKSA8ZW0+Qm9keTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9keSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9keSgpIDxlbT5Cb2R5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb2R5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJvZHkgPSBCT0RZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb2R5KCkgewotCQlyZXR1cm4gYm9keTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb2R5KFN0cmluZyBuZXdCb2R5KSB7Ci0JCVN0cmluZyBvbGRCb2R5ID0gYm9keTsKLQkJYm9keSA9IG5ld0JvZHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWSwgb2xkQm9keSwgYm9keSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlyZXR1cm4gZ2V0Qm9keSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJc2V0Qm9keSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWToKLQkJCXNldEJvZHkoQk9EWV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJcmV0dXJuIEJPRFlfRURFRkFVTFQgPT0gbnVsbCA/IGJvZHkgIT0gbnVsbCA6ICFCT0RZX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoYm9keSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYm9keTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChib2R5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29uc3RyYWludEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTlmMGNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfQ0FURUdPUlk7Ci0JfQotCi19IC8vQ29udGVudENhdGVnb3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOTMwOGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRTZWN0aW9ucyA8ZW0+U2VjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSA8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzCi0JCUNvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYWluRGVzY3JpcHRpb24gPSBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbnMoKSA8ZW0+U2VjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzZWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElkKCkgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9JRF9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElkKCkgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsSWQgPSBFWFRFUk5BTF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXlDb25zaWRlcmF0aW9ucygpIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnMgPSBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkdfUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9uZ1ByZXNlbnRhdGlvbk5hbWUgPSBMT05HX1BSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG1haW5EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIG5ld01haW5EZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkTWFpbkRlc2NyaXB0aW9uID0gbWFpbkRlc2NyaXB0aW9uOwotCQltYWluRGVzY3JpcHRpb24gPSBuZXdNYWluRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiwKLQkJCQkJb2xkTWFpbkRlc2NyaXB0aW9uLCBtYWluRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTZWN0aW9uPiBnZXRTZWN0aW9ucygpIHsKLQkJaWYgKHNlY3Rpb25zID09IG51bGwpIHsKLQkJCXNlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxTZWN0aW9uPigKLQkJCQkJU2VjdGlvbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIGV4dGVybmFsSWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxJZChTdHJpbmcgbmV3RXh0ZXJuYWxJZCkgewotCQlTdHJpbmcgb2xkRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQ7Ci0JCWV4dGVybmFsSWQgPSBuZXdFeHRlcm5hbElkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lELCBvbGRFeHRlcm5hbElkLAotCQkJCQlleHRlcm5hbElkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXlDb25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGtleUNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyBuZXdLZXlDb25zaWRlcmF0aW9ucykgewotCQlTdHJpbmcgb2xkS2V5Q29uc2lkZXJhdGlvbnMgPSBrZXlDb25zaWRlcmF0aW9uczsKLQkJa2V5Q29uc2lkZXJhdGlvbnMgPSBuZXdLZXlDb25zaWRlcmF0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMsCi0JCQkJCW9sZEtleUNvbnNpZGVyYXRpb25zLCBrZXlDb25zaWRlcmF0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBsb25nUHJlc2VudGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb25nUHJlc2VudGF0aW9uTmFtZShTdHJpbmcgbmV3TG9uZ1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZExvbmdQcmVzZW50YXRpb25OYW1lID0gbG9uZ1ByZXNlbnRhdGlvbk5hbWU7Ci0JCWxvbmdQcmVzZW50YXRpb25OYW1lID0gbmV3TG9uZ1ByZXNlbnRhdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJb2xkTG9uZ1ByZXNlbnRhdGlvbk5hbWUsIGxvbmdQcmVzZW50YXRpb25OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U2VjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldE1haW5EZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlyZXR1cm4gZ2V0U2VjdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJcmV0dXJuIGdldEV4dGVybmFsSWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBnZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXJldHVybiBnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJc2V0TWFpbkRlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOgotCQkJZ2V0U2VjdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0U2VjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCXNldEV4dGVybmFsSWQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJc2V0S2V5Q29uc2lkZXJhdGlvbnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXNldExvbmdQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJc2V0TWFpbkRlc2NyaXB0aW9uKE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlnZXRTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCXNldEV4dGVybmFsSWQoRVhURVJOQUxfSURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJc2V0S2V5Q29uc2lkZXJhdGlvbnMoS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlzZXRMb25nUHJlc2VudGF0aW9uTmFtZShMT05HX1BSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gbWFpbkRlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMobWFpbkRlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOgotCQkJcmV0dXJuIHNlY3Rpb25zICE9IG51bGwgJiYgIXNlY3Rpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJcmV0dXJuIEVYVEVSTkFMX0lEX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbElkICE9IG51bGwKLQkJCQkJOiAhRVhURVJOQUxfSURfRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsSWQpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCA9PSBudWxsID8ga2V5Q29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQk6ICFLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQuZXF1YWxzKGtleUNvbnNpZGVyYXRpb25zKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlyZXR1cm4gTE9OR19QUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbG9uZ1ByZXNlbnRhdGlvbk5hbWUgIT0gbnVsbAotCQkJCQk6ICFMT05HX1BSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhsb25nUHJlc2VudGF0aW9uTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFpbkRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1haW5EZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXh0ZXJuYWxJZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbElkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBrZXlDb25zaWRlcmF0aW9uczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9uZ1ByZXNlbnRhdGlvbk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobG9uZ1ByZXNlbnRhdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db250ZW50RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDZjMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRDb25jZXB0c0FuZFBhcGVycyA8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEd1aWRlbGluZXMgPGVtPkd1aWRlbGluZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEFzc2V0cyA8ZW0+QXNzZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFRlcm1kZWZpbml0aW9uIDxlbT5UZXJtZGVmaW5pdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRFbGVtZW50SW1wbCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5RWxlbWVudCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBzdXBwb3J0aW5nTWF0ZXJpYWxzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKSA8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25jZXB0c0FuZFBhcGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbmNlcHQ+IGNvbmNlcHRzQW5kUGFwZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hlY2tsaXN0cygpIDxlbT5DaGVja2xpc3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoZWNrbGlzdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDaGVja2xpc3Q+IGNoZWNrbGlzdHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkZWxpbmVzKCkgPGVtPkd1aWRlbGluZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZGVsaW5lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEd1aWRlbGluZT4gZ3VpZGVsaW5lczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4YW1wbGVzKCkgPGVtPkV4YW1wbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4YW1wbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXhhbXBsZT4gZXhhbXBsZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NldHMoKSA8ZW0+QXNzZXRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJldXNhYmxlQXNzZXQ+IGFzc2V0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlcm1kZWZpbml0aW9uKCkgPGVtPlRlcm1kZWZpbml0aW9uPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlcm1kZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGVybURlZmluaXRpb24+IHRlcm1kZWZpbml0aW9uOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUCi0JCQkJOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQlvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQl0aGlzLAotCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsCi0JCQkJCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb25jZXB0PiBnZXRDb25jZXB0c0FuZFBhcGVycygpIHsKLQkJaWYgKGNvbmNlcHRzQW5kUGFwZXJzID09IG51bGwpIHsKLQkJCWNvbmNlcHRzQW5kUGFwZXJzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDb25jZXB0PigKLQkJCQkJQ29uY2VwdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlMpOwotCQl9Ci0JCXJldHVybiBjb25jZXB0c0FuZFBhcGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDaGVja2xpc3Q+IGdldENoZWNrbGlzdHMoKSB7Ci0JCWlmIChjaGVja2xpc3RzID09IG51bGwpIHsKLQkJCWNoZWNrbGlzdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENoZWNrbGlzdD4oQ2hlY2tsaXN0LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUyk7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrbGlzdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8R3VpZGVsaW5lPiBnZXRHdWlkZWxpbmVzKCkgewotCQlpZiAoZ3VpZGVsaW5lcyA9PSBudWxsKSB7Ci0JCQlndWlkZWxpbmVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxHdWlkZWxpbmU+KEd1aWRlbGluZS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVMpOwotCQl9Ci0JCXJldHVybiBndWlkZWxpbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEV4YW1wbGU+IGdldEV4YW1wbGVzKCkgewotCQlpZiAoZXhhbXBsZXMgPT0gbnVsbCkgewotCQkJZXhhbXBsZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEV4YW1wbGU+KEV4YW1wbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUyk7Ci0JCX0KLQkJcmV0dXJuIGV4YW1wbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJldXNhYmxlQXNzZXQ+IGdldEFzc2V0cygpIHsKLQkJaWYgKGFzc2V0cyA9PSBudWxsKSB7Ci0JCQlhc3NldHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJldXNhYmxlQXNzZXQ+KAotCQkJCQlSZXVzYWJsZUFzc2V0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQVNTRVRTKTsKLQkJfQotCQlyZXR1cm4gYXNzZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRlcm1EZWZpbml0aW9uPiBnZXRUZXJtZGVmaW5pdGlvbigpIHsKLQkJaWYgKHRlcm1kZWZpbml0aW9uID09IG51bGwpIHsKLQkJCXRlcm1kZWZpbml0aW9uID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUZXJtRGVmaW5pdGlvbj4oCi0JCQkJCVRlcm1EZWZpbml0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT04pOwotCQl9Ci0JCXJldHVybiB0ZXJtZGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCXJldHVybiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM6Ci0JCQlyZXR1cm4gZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCXJldHVybiBnZXRDaGVja2xpc3RzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlyZXR1cm4gZ2V0R3VpZGVsaW5lcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzoKLQkJCXJldHVybiBnZXRFeGFtcGxlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM6Ci0JCQlyZXR1cm4gZ2V0QXNzZXRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOgotCQkJcmV0dXJuIGdldFRlcm1kZWZpbml0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdXBwb3J0aW5nTWF0ZXJpYWw+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM6Ci0JCQlnZXRDb25jZXB0c0FuZFBhcGVycygpLmNsZWFyKCk7Ci0JCQlnZXRDb25jZXB0c0FuZFBhcGVycygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbmNlcHQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlnZXRDaGVja2xpc3RzKCkuY2xlYXIoKTsKLQkJCWdldENoZWNrbGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENoZWNrbGlzdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCWdldEd1aWRlbGluZXMoKS5jbGVhcigpOwotCQkJZ2V0R3VpZGVsaW5lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3VpZGVsaW5lPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzoKLQkJCWdldEV4YW1wbGVzKCkuY2xlYXIoKTsKLQkJCWdldEV4YW1wbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFeGFtcGxlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM6Ci0JCQlnZXRBc3NldHMoKS5jbGVhcigpOwotCQkJZ2V0QXNzZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXVzYWJsZUFzc2V0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjoKLQkJCWdldFRlcm1kZWZpbml0aW9uKCkuY2xlYXIoKTsKLQkJCWdldFRlcm1kZWZpbml0aW9uKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGVybURlZmluaXRpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCWdldENvbmNlcHRzQW5kUGFwZXJzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJZ2V0R3VpZGVsaW5lcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM6Ci0JCQlnZXRBc3NldHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjoKLQkJCWdldFRlcm1kZWZpbml0aW9uKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGUgIT0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbHMgIT0gbnVsbAotCQkJCQkmJiAhc3VwcG9ydGluZ01hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM6Ci0JCQlyZXR1cm4gY29uY2VwdHNBbmRQYXBlcnMgIT0gbnVsbCAmJiAhY29uY2VwdHNBbmRQYXBlcnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJcmV0dXJuIGNoZWNrbGlzdHMgIT0gbnVsbCAmJiAhY2hlY2tsaXN0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlyZXR1cm4gZ3VpZGVsaW5lcyAhPSBudWxsICYmICFndWlkZWxpbmVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlyZXR1cm4gZXhhbXBsZXMgIT0gbnVsbCAmJiAhZXhhbXBsZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM6Ci0JCQlyZXR1cm4gYXNzZXRzICE9IG51bGwgJiYgIWFzc2V0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOgotCQkJcmV0dXJuIHRlcm1kZWZpbml0aW9uICE9IG51bGwgJiYgIXRlcm1kZWZpbml0aW9uLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkgewotCQlpZiAoc3VwcG9ydGluZ01hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+KAotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YXJpYWJpbGl0eVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZQotCS8vCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAocHJlc2VudGF0aW9uID09IG51bGwpIHsKLQkJCXN1cGVyLnNldE5hbWUobmV3TmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCXN1cGVyLnNldE5hbWUobmV3TmFtZSk7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwgJiYgIW5ld05hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQlwcmVzZW50YXRpb24uc2V0TmFtZShVbWFVdGlsLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbk5hbWUodGhpcykpOwotCQl9Ci0JfQotCi19IC8vQ29udGVudEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmQ3YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudHMgPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzCi0JCUNvbnRlbnRQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnRFbGVtZW50cygpIDxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRFbGVtZW50PiBjb250ZW50RWxlbWVudHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudEVsZW1lbnRzKCkgewotCQlpZiAoY29udGVudEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWNvbnRlbnRFbGVtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8Q29udGVudEVsZW1lbnQ+KAotCQkJCQlDb250ZW50RWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBjb250ZW50RWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldENvbnRlbnRFbGVtZW50cygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCWdldENvbnRlbnRFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlnZXRDb250ZW50RWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250ZW50RWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlnZXRDb250ZW50RWxlbWVudHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50cyAhPSBudWxsICYmICFjb250ZW50RWxlbWVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Db250ZW50UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5ZDNmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgZXh0ZW5kcyBTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQlpbXBsZW1lbnRzIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnQoKSA8ZW0+RWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgZWxlbWVudDsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRFbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG9sZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQkJb2xkRWxlbWVudCwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50IGJhc2ljR2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJRWxlbWVudCBvbGRFbGVtZW50ID0gZWxlbWVudDsKLQkJZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsIG9sZEVsZW1lbnQsCi0JCQkJCWVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzlmYTQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q3VzdG9tIENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsI2dldENhdGVnb3JpemVkRWxlbWVudHMgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsI2dldFN1YkNhdGVnb3JpZXMgPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCUN1c3RvbUNhdGVnb3J5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGVnb3JpemVkRWxlbWVudHMoKSA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4gY2F0ZWdvcml6ZWRFbGVtZW50czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YkNhdGVnb3JpZXMoKSA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViQ2F0ZWdvcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gc3ViQ2F0ZWdvcmllczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDdXN0b21DYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpIHsKLQkJaWYgKGNhdGVnb3JpemVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJY2F0ZWdvcml6ZWRFbGVtZW50cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PigKLQkJCQkJRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBjYXRlZ29yaXplZEVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0U3ViQ2F0ZWdvcmllcygpIHsKLQkJaWYgKHN1YkNhdGVnb3JpZXMgPT0gbnVsbCkgewotCQkJc3ViQ2F0ZWdvcmllcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudENhdGVnb3J5PigKLQkJCQkJQ29udGVudENhdGVnb3J5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMpOwotCQl9Ci0JCXJldHVybiBzdWJDYXRlZ29yaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCXJldHVybiBnZXRTdWJDYXRlZ29yaWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTOgotCQkJZ2V0U3ViQ2F0ZWdvcmllcygpLmNsZWFyKCk7Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gY2F0ZWdvcml6ZWRFbGVtZW50cyAhPSBudWxsCi0JCQkJCSYmICFjYXRlZ29yaXplZEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCQlyZXR1cm4gc3ViQ2F0ZWdvcmllcyAhPSBudWxsICYmICFzdWJDYXRlZ29yaWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ3VzdG9tQ2F0ZWdvcnlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDM1Zjg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsRGVzY3JpcHRpb24gPSBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnaW5nR3VpZGFuY2UgPSBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyBuZXdFeHRlcm5hbERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbERlc2NyaXB0aW9uID0gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IG5ld0V4dGVybmFsRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRFeHRlcm5hbERlc2NyaXB0aW9uLCBleHRlcm5hbERlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHBhY2thZ2luZ0d1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyBuZXdQYWNrYWdpbmdHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkUGFja2FnaW5nR3VpZGFuY2UgPSBwYWNrYWdpbmdHdWlkYW5jZTsKLQkJcGFja2FnaW5nR3VpZGFuY2UgPSBuZXdQYWNrYWdpbmdHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFLAotCQkJCQlvbGRQYWNrYWdpbmdHdWlkYW5jZSwgcGFja2FnaW5nR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXJldHVybiBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlzZXRFeHRlcm5hbERlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlzZXRQYWNrYWdpbmdHdWlkYW5jZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCXJldHVybiBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIUVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlyZXR1cm4gUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUID09IG51bGwgPyBwYWNrYWdpbmdHdWlkYW5jZSAhPSBudWxsCi0JCQkJCTogIVBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVC5lcXVhbHMocGFja2FnaW5nR3VpZGFuY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVybmFsRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFja2FnaW5nR3VpZGFuY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFja2FnaW5nR3VpZGFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjcwZDIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgRGVsaXZlcmFibGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiBkZWxpdmVyZWRXb3JrUHJvZHVjdHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcmFibGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0PiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSB7Ci0JCWlmIChkZWxpdmVyZWRXb3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJZGVsaXZlcmVkV29ya1Byb2R1Y3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdD4oCi0JCQkJCVdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGRlbGl2ZXJlZFdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUzoKLQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTOgotCQkJcmV0dXJuIGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyAhPSBudWxsCi0JCQkJCSYmICFkZWxpdmVyZWRXb3JrUHJvZHVjdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9EZWxpdmVyYWJsZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2MzMwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2FsZSA9IFNDQUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaXNrTGV2ZWwoKSA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSSVNLX0xFVkVMX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaXNrTGV2ZWwoKSA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJpc2tMZXZlbCA9IFJJU0tfTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVPZkNvbnRyYWN0KCkgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVPZkNvbnRyYWN0ID0gVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjYWxlKCkgewotCQlyZXR1cm4gc2NhbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoU3RyaW5nIG5ld1NjYWxlKSB7Ci0JCVN0cmluZyBvbGRTY2FsZSA9IHNjYWxlOwotCQlzY2FsZSA9IG5ld1NjYWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFLCBvbGRTY2FsZSwKLQkJCQkJc2NhbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIG5ld1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gbmV3UHJvamVjdENoYXJhY3RlcmlzdGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MsCi0JCQkJCW9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MsIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpc2tMZXZlbCgpIHsKLQkJcmV0dXJuIHJpc2tMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIG5ld1Jpc2tMZXZlbCkgewotCQlTdHJpbmcgb2xkUmlza0xldmVsID0gcmlza0xldmVsOwotCQlyaXNrTGV2ZWwgPSBuZXdSaXNrTGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCwKLQkJCQkJb2xkUmlza0xldmVsLCByaXNrTGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIG5ld0VzdGltYXRpbmdUZWNobmlxdWUpIHsKLQkJU3RyaW5nIG9sZEVzdGltYXRpbmdUZWNobmlxdWUgPSBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCQllc3RpbWF0aW5nVGVjaG5pcXVlID0gbmV3RXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsCi0JCQkJCW9sZEVzdGltYXRpbmdUZWNobmlxdWUsIGVzdGltYXRpbmdUZWNobmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2UpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFLAotCQkJCQlvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIHR5cGVPZkNvbnRyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVPZkNvbnRyYWN0KFN0cmluZyBuZXdUeXBlT2ZDb250cmFjdCkgewotCQlTdHJpbmcgb2xkVHlwZU9mQ29udHJhY3QgPSB0eXBlT2ZDb250cmFjdDsKLQkJdHlwZU9mQ29udHJhY3QgPSBuZXdUeXBlT2ZDb250cmFjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNULAotCQkJCQlvbGRUeXBlT2ZDb250cmFjdCwgdHlwZU9mQ29udHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXJldHVybiBnZXRTY2FsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCXJldHVybiBnZXRSaXNrTGV2ZWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJcmV0dXJuIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXJldHVybiBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJcmV0dXJuIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJc2V0U2NhbGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlzZXRSaXNrTGV2ZWwoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCXNldFR5cGVPZkNvbnRyYWN0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXNldFNjYWxlKFNDQUxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJc2V0Umlza0xldmVsKFJJU0tfTEVWRUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQlzZXRUeXBlT2ZDb250cmFjdChUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJcmV0dXJuIFNDQUxFX0VERUZBVUxUID09IG51bGwgPyBzY2FsZSAhPSBudWxsIDogIVNDQUxFX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoc2NhbGUpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlyZXR1cm4gUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3RDaGFyYWN0ZXJpc3RpY3MgIT0gbnVsbAotCQkJCQk6ICFQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMocHJvamVjdENoYXJhY3RlcmlzdGljcyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJcmV0dXJuIFJJU0tfTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IHJpc2tMZXZlbCAhPSBudWxsCi0JCQkJCTogIVJJU0tfTEVWRUxfRURFRkFVTFQuZXF1YWxzKHJpc2tMZXZlbCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCXJldHVybiBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9PSBudWxsID8gZXN0aW1hdGluZ1RlY2huaXF1ZSAhPSBudWxsCi0JCQkJCTogIUVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhlc3RpbWF0aW5nVGVjaG5pcXVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXJldHVybiBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3RNZW1iZXJFeHBlcnRpc2UgIT0gbnVsbAotCQkJCQk6ICFQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKHByb2plY3RNZW1iZXJFeHBlcnRpc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCXJldHVybiBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUID09IG51bGwgPyB0eXBlT2ZDb250cmFjdCAhPSBudWxsCi0JCQkJCTogIVRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQuZXF1YWxzKHR5cGVPZkNvbnRyYWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzY2FsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzY2FsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdENoYXJhY3RlcmlzdGljczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByaXNrTGV2ZWw6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmlza0xldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlc3RpbWF0aW5nVGVjaG5pcXVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RNZW1iZXJFeHBlcnRpc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJvamVjdE1lbWJlckV4cGVydGlzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZU9mQ29udHJhY3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodHlwZU9mQ29udHJhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2M2ZGQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRFZHVjYXRpb25NYXRlcmlhbHMgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBEZWxpdmVyeVByb2Nlc3MgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBlZHVjYXRpb25NYXRlcmlhbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGNvbW11bmljYXRpb25zTWF0ZXJpYWxzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldEVkdWNhdGlvbk1hdGVyaWFscygpIHsKLQkJaWYgKGVkdWNhdGlvbk1hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQllZHVjYXRpb25NYXRlcmlhbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4oCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTKTsKLQkJfQotCQlyZXR1cm4gZWR1Y2F0aW9uTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSB7Ci0JCWlmIChjb21tdW5pY2F0aW9uc01hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQljb21tdW5pY2F0aW9uc01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPigKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbW11bmljYXRpb25zTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCWdldEVkdWNhdGlvbk1hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRFZHVjYXRpb25NYXRlcmlhbHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdXBwb3J0aW5nTWF0ZXJpYWw+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTOgotCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZWR1Y2F0aW9uTWF0ZXJpYWxzICE9IG51bGwgJiYgIWVkdWNhdGlvbk1hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMgIT0gbnVsbAotCQkJCQkmJiAhY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9EZWxpdmVyeVByb2Nlc3NJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyNjAxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpYmFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0SXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgRGVzY3JpYmFibGVFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfQUJTVFJBQ1RfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNBYnN0cmFjdCgpIDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNBYnN0cmFjdCA9IElTX0FCU1RSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uKCkgPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudERlc2NyaXB0aW9uIHByZXNlbnRhdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFwZWljb24oKSA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIFNIQVBFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFwZWljb24oKSA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgc2hhcGVpY29uID0gU0hBUEVJQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVpY29uKCkgPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgTk9ERUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVVJJIG5vZGVpY29uID0gTk9ERUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpYmFibGVFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiBpc0Fic3RyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzQWJzdHJhY3QoQm9vbGVhbiBuZXdJc0Fic3RyYWN0KSB7Ci0JCUJvb2xlYW4gb2xkSXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7Ci0JCWlzQWJzdHJhY3QgPSBuZXdJc0Fic3RyYWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNULCBvbGRJc0Fic3RyYWN0LAotCQkJCQlpc0Fic3RyYWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlc2VudGF0aW9uKAotCQkJQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb250ZW50RGVzY3JpcHRpb24gb2xkUHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCQlwcmVzZW50YXRpb24gPSBuZXdQcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRQcmVzZW50YXRpb24sIG5ld1ByZXNlbnRhdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFNoYXBlaWNvbigpIHsKLQkJcmV0dXJuIHNoYXBlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGFwZWljb24oVVJJIG5ld1NoYXBlaWNvbikgewotCQlVUkkgb2xkU2hhcGVpY29uID0gc2hhcGVpY29uOwotCQlzaGFwZWljb24gPSBuZXdTaGFwZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OLCBvbGRTaGFwZWljb24sCi0JCQkJCXNoYXBlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0Tm9kZWljb24oKSB7Ci0JCXJldHVybiBub2RlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlaWNvbihVUkkgbmV3Tm9kZWljb24pIHsKLQkJVVJJIG9sZE5vZGVpY29uID0gbm9kZWljb247Ci0JCW5vZGVpY29uID0gbmV3Tm9kZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04sIG9sZE5vZGVpY29uLAotCQkJCQlub2RlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcmVzZW50YXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJcmV0dXJuIGdldElzQWJzdHJhY3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZXNlbnRhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJcmV0dXJuIGdldFNoYXBlaWNvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQlyZXR1cm4gZ2V0Tm9kZWljb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQlzZXRJc0Fic3RyYWN0KChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJc2V0U2hhcGVpY29uKChVUkkpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJc2V0Tm9kZWljb24oKFVSSSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdChJU19BQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlzZXRTaGFwZWljb24oU0hBUEVJQ09OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJc2V0Tm9kZWljb24oTk9ERUlDT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQlyZXR1cm4gSVNfQUJTVFJBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGlzQWJzdHJhY3QgIT0gbnVsbAotCQkJCQk6ICFJU19BQlNUUkFDVF9FREVGQVVMVC5lcXVhbHMoaXNBYnN0cmFjdCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gcHJlc2VudGF0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlyZXR1cm4gU0hBUEVJQ09OX0VERUZBVUxUID09IG51bGwgPyBzaGFwZWljb24gIT0gbnVsbAotCQkJCQk6ICFTSEFQRUlDT05fRURFRkFVTFQuZXF1YWxzKHNoYXBlaWNvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCXJldHVybiBOT0RFSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbm9kZWljb24gIT0gbnVsbAotCQkJCQk6ICFOT0RFSUNPTl9FREVGQVVMVC5lcXVhbHMobm9kZWljb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gVHlwZS5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IENsYXNzaWZpZXIuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBUeXBlLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ2xhc3NpZmllci5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc0Fic3RyYWN0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzQWJzdHJhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNoYXBlaWNvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzaGFwZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vZGVpY29uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG5vZGVpY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZQotCS8vCi0KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGJhc2ljR2V0UHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbigpCi0JICovCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbiBnZXRQcmVzZW50YXRpb24oKSB7Ci0JCWlmIChwcmVzZW50YXRpb24gaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSBwcmVzZW50YXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBvbGRQcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JCQlwcmVzZW50YXRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRhdGlvbik7Ci0JCQlpZiAocHJlc2VudGF0aW9uICE9IG9sZFByZXNlbnRhdGlvbikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCQkJb2xkUHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb24pKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJLy8JCQlzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24odGhpcykpOwotCQkJaWYgKGVtcHR5UHJlc2VudGF0aW9uID09IG51bGwpIHsKLQkJCQllbXB0eVByZXNlbnRhdGlvbiA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24odGhpcyk7Ci0JCQkJZW1wdHlQcmVzZW50YXRpb24uZUFkYXB0ZXJzKCkuYWRkKGNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJCXJldHVybiBlbXB0eVByZXNlbnRhdGlvbjsKLQkJfQotCi0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbikgewotCQlpZiAobmV3UHJlc2VudGF0aW9uICE9IHByZXNlbnRhdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVzZW50YXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZXNlbnRhdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlc2VudGF0aW9uKG5ld1ByZXNlbnRhdGlvbiwgbXNncyk7Ci0KLQkJCS8vIGN1c3RvbSBjb2RlCi0JCQkvLwotCQkJZW1wdHlQcmVzZW50YXRpb24gPSBudWxsOwotCi0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQluZXdQcmVzZW50YXRpb24sIG5ld1ByZXNlbnRhdGlvbikpOwotCX0KLQotCXByaXZhdGUgQ29udGVudERlc2NyaXB0aW9uIGVtcHR5UHJlc2VudGF0aW9uOwotCi0JcHJpdmF0ZSBBZGFwdGVyIGNoYW5nZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGdldFRhcmdldCgpOwotCQkJCWNvbnRlbnQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCi0JCQkJLy8gZW1wdHlQcmVzZW50YXRpb24gaXMgbW9kaWZpZWQsIGNvbnZlcnQgaXQgdG8gcmVhbCBwcmVzZW50YXRpb24gaWYgbm8gcHJlc2VudGF0aW9uIGlzIHNldCB5ZXQgCi0JCQkJLy8gZm9yIHRoZSBQcm9jZXNzRWxlbWVudAotCQkJCS8vCi0JCQkJaWYgKHByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXNldFByZXNlbnRhdGlvbihjb250ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotfSAvL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGNlNTY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIERlc2NyaXB0b3JEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWZpbmVkRGVzY3JpcHRpb24gPSBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJlZmluZWREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIG5ld1JlZmluZWREZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkUmVmaW5lZERlc2NyaXB0aW9uID0gcmVmaW5lZERlc2NyaXB0aW9uOwotCQlyZWZpbmVkRGVzY3JpcHRpb24gPSBuZXdSZWZpbmVkRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwKLQkJCQkJb2xkUmVmaW5lZERlc2NyaXB0aW9uLCByZWZpbmVkRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCXJldHVybiBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyByZWZpbmVkRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhyZWZpbmVkRGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmluZWREZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZWZpbmVkRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWRlZjM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoQm9vbGVhbiBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpIHsKLQkJQm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXJldHVybiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSAhPSBudWxsCi0JCQkJCTogIUlTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwOTgyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsI2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNWaXNpYmxlKCkgPGVtPklzIFZpc2libGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzVmlzaWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1ZJU0lCTEVfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1Zpc2libGUoKSA8ZW0+SXMgVmlzaWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1Zpc2libGUgPSBJU19WSVNJQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlKCkgPGVtPlJlZmVyZW5jZTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5KCkgPGVtPlByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UHJvcGVydHk+IHByb3BlcnR5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNWaXNpYmxlKCkgewotCQlyZXR1cm4gaXNWaXNpYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzVmlzaWJsZShCb29sZWFuIG5ld0lzVmlzaWJsZSkgewotCQlCb29sZWFuIG9sZElzVmlzaWJsZSA9IGlzVmlzaWJsZTsKLQkJaXNWaXNpYmxlID0gbmV3SXNWaXNpYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSwgb2xkSXNWaXNpYmxlLAotCQkJCQlpc1Zpc2libGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGdldENvbnRhaW5lcl8oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGJhc2ljR2V0Q29udGFpbmVyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250YWluZXIoR3JhcGhFbGVtZW50IG5ld0NvbnRhaW5lciwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXIsCi0JCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihHcmFwaEVsZW1lbnQgbmV3Q29udGFpbmVyKSB7Ci0JCWlmIChuZXdDb250YWluZXIgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSICYmIG5ld0NvbnRhaW5lciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdDb250YWluZXIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Q29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXIpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiwgbmV3Q29udGFpbmVyLAotCQkJCQluZXdDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSZWZlcmVuY2U+IGdldFJlZmVyZW5jZSgpIHsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlyZWZlcmVuY2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8UmVmZXJlbmNlPigKLQkJCQkJUmVmZXJlbmNlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLAotCQkJCQlVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRCk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9wZXJ0eT4gZ2V0UHJvcGVydHkoKSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8UHJvcGVydHk+KAotCQkJCQlQcm9wZXJ0eS5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXIoKEdyYXBoRWxlbWVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRSZWZlcmVuY2UoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRSZWZlcmVuY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELCBHcmFwaEVsZW1lbnQuY2xhc3MsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlyZXR1cm4gZ2V0SXNWaXNpYmxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb250YWluZXJfKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuIGdldFJlZmVyZW5jZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCXJldHVybiBnZXRQcm9wZXJ0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlzZXRJc1Zpc2libGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJc2V0Q29udGFpbmVyKChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJZ2V0UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCWdldFJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmVmZXJlbmNlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCWdldFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCWdldFByb3BlcnR5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQcm9wZXJ0eT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlzZXRJc1Zpc2libGUoSVNfVklTSUJMRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXNldENvbnRhaW5lcigoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJZ2V0UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlyZXR1cm4gSVNfVklTSUJMRV9FREVGQVVMVCA9PSBudWxsID8gaXNWaXNpYmxlICE9IG51bGwKLQkJCQkJOiAhSVNfVklTSUJMRV9FREVGQVVMVC5lcXVhbHMoaXNWaXNpYmxlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuIHJlZmVyZW5jZSAhPSBudWxsICYmICFyZWZlcmVuY2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCXJldHVybiBwcm9wZXJ0eSAhPSBudWxsICYmICFwcm9wZXJ0eS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNWaXNpYmxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzVmlzaWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpYWdyYW1FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjODljNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsI2dldERpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsI2dldFpvb20gPGVtPlpvb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXRWaWV3cG9pbnQgPGVtPlZpZXdwb2ludDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbXBsIGV4dGVuZHMgR3JhcGhOb2RlSW1wbCBpbXBsZW1lbnRzIERpYWdyYW0gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbUxpbmsoKSA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlhZ3JhbUxpbms+IGRpYWdyYW1MaW5rOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlKCkgPGVtPk5hbWVzcGFjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lc3BhY2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Wm9vbSgpIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBaT09NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB6b29tID0gWk9PTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZpZXdwb2ludCgpIDxlbT5WaWV3cG9pbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZpZXdwb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHZpZXdwb2ludDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0Wm9vbSgpIHsKLQkJcmV0dXJuIHpvb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Wm9vbShEb3VibGUgbmV3Wm9vbSkgewotCQlEb3VibGUgb2xkWm9vbSA9IHpvb207Ci0JCXpvb20gPSBuZXdab29tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX1pPT00sIG9sZFpvb20sIHpvb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0Vmlld3BvaW50KCkgewotCQlpZiAodmlld3BvaW50ICE9IG51bGwgJiYgKChFT2JqZWN0KSB2aWV3cG9pbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWaWV3cG9pbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2aWV3cG9pbnQ7Ci0JCQl2aWV3cG9pbnQgPSAoUG9pbnQpIGVSZXNvbHZlUHJveHkob2xkVmlld3BvaW50KTsKLQkJCWlmICh2aWV3cG9pbnQgIT0gb2xkVmlld3BvaW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVCwgb2xkVmlld3BvaW50LAotCQkJCQkJCXZpZXdwb2ludCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2aWV3cG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0Vmlld3BvaW50KCkgewotCQlyZXR1cm4gdmlld3BvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdwb2ludChQb2ludCBuZXdWaWV3cG9pbnQpIHsKLQkJUG9pbnQgb2xkVmlld3BvaW50ID0gdmlld3BvaW50OwotCQl2aWV3cG9pbnQgPSBuZXdWaWV3cG9pbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULCBvbGRWaWV3cG9pbnQsIHZpZXdwb2ludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERpYWdyYW1MaW5rPiBnZXREaWFncmFtTGluaygpIHsKLQkJaWYgKGRpYWdyYW1MaW5rID09IG51bGwpIHsKLQkJCWRpYWdyYW1MaW5rID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PERpYWdyYW1MaW5rPigKLQkJCQkJRGlhZ3JhbUxpbmsuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LLAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTSk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGdldE5hbWVzcGFjZSgpIHsKLQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmICgoRU9iamVjdCkgbmFtZXNwYWNlKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkTmFtZXNwYWNlID0gKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlOwotCQkJbmFtZXNwYWNlID0gKFNlbWFudGljTW9kZWxCcmlkZ2UpIGVSZXNvbHZlUHJveHkob2xkTmFtZXNwYWNlKTsKLQkJCWlmIChuYW1lc3BhY2UgIT0gb2xkTmFtZXNwYWNlKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld05hbWVzcGFjZSA9IChJbnRlcm5hbEVPYmplY3QpIG5hbWVzcGFjZTsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkTmFtZXNwYWNlLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG51bGwpOwotCQkJCWlmIChuZXdOYW1lc3BhY2UuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3TmFtZXNwYWNlLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sCi0JCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBvbGROYW1lc3BhY2UsCi0JCQkJCQkJbmFtZXNwYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZSBiYXNpY0dldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROYW1lc3BhY2UoCi0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIG5ld05hbWVzcGFjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG9sZE5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJbmFtZXNwYWNlID0gbmV3TmFtZXNwYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRSwKLQkJCQkJb2xkTmFtZXNwYWNlLCBuZXdOYW1lc3BhY2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFNlbWFudGljTW9kZWxCcmlkZ2UgbmV3TmFtZXNwYWNlKSB7Ci0JCWlmIChuZXdOYW1lc3BhY2UgIT0gbmFtZXNwYWNlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5hbWVzcGFjZSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3TmFtZXNwYWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdOYW1lc3BhY2UpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TmFtZXNwYWNlKG5ld05hbWVzcGFjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBuZXdOYW1lc3BhY2UsIG5ld05hbWVzcGFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXREaWFncmFtTGluaygpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXROYW1lc3BhY2UoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldERpYWdyYW1MaW5rKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXJldHVybiBiYXNpY1NldE5hbWVzcGFjZShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuIGdldERpYWdyYW1MaW5rKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0TmFtZXNwYWNlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXROYW1lc3BhY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1pPT006Ci0JCQlyZXR1cm4gZ2V0Wm9vbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZpZXdwb2ludCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Vmlld3BvaW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCWdldERpYWdyYW1MaW5rKCkuY2xlYXIoKTsKLQkJCWdldERpYWdyYW1MaW5rKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlhZ3JhbUxpbms+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlzZXROYW1lc3BhY2UoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1pPT006Ci0JCQlzZXRab29tKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVDoKLQkJCXNldFZpZXdwb2ludCgoUG9pbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlnZXREaWFncmFtTGluaygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlzZXROYW1lc3BhY2UoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXNldFpvb20oWk9PTV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlzZXRWaWV3cG9pbnQoKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCXJldHVybiBkaWFncmFtTGluayAhPSBudWxsICYmICFkaWFncmFtTGluay5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlyZXR1cm4gbmFtZXNwYWNlICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19aT09NOgotCQkJcmV0dXJuIFpPT01fRURFRkFVTFQgPT0gbnVsbCA/IHpvb20gIT0gbnVsbCA6ICFaT09NX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoem9vbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlyZXR1cm4gdmlld3BvaW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoem9vbTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh6b29tKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtTGlua0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhNjhlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUxpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsI2dldFpvb20gPGVtPlpvb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUxpbmtJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGlhZ3JhbUxpbmsgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWk9PTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRab29tKCkgPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgem9vbSA9IFpPT01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWaWV3cG9ydCgpIDxlbT5WaWV3cG9ydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Vmlld3BvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCB2aWV3cG9ydDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpYWdyYW0oKSA8ZW0+RGlhZ3JhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW0gZGlhZ3JhbTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0Wm9vbSgpIHsKLQkJcmV0dXJuIHpvb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Wm9vbShEb3VibGUgbmV3Wm9vbSkgewotCQlEb3VibGUgb2xkWm9vbSA9IHpvb207Ci0JCXpvb20gPSBuZXdab29tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTSwgb2xkWm9vbSwgem9vbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRWaWV3cG9ydCgpIHsKLQkJaWYgKHZpZXdwb3J0ICE9IG51bGwgJiYgKChFT2JqZWN0KSB2aWV3cG9ydCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZpZXdwb3J0ID0gKEludGVybmFsRU9iamVjdCkgdmlld3BvcnQ7Ci0JCQl2aWV3cG9ydCA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRWaWV3cG9ydCk7Ci0JCQlpZiAodmlld3BvcnQgIT0gb2xkVmlld3BvcnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgb2xkVmlld3BvcnQsCi0JCQkJCQkJdmlld3BvcnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmlld3BvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0Vmlld3BvcnQoKSB7Ci0JCXJldHVybiB2aWV3cG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChQb2ludCBuZXdWaWV3cG9ydCkgewotCQlQb2ludCBvbGRWaWV3cG9ydCA9IHZpZXdwb3J0OwotCQl2aWV3cG9ydCA9IG5ld1ZpZXdwb3J0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQsIG9sZFZpZXdwb3J0LCB2aWV3cG9ydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCkgewotCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQgJiYgbmV3R3JhcGhFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSywgR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHcmFwaEVsZW1lbnQobmV3R3JhcGhFbGVtZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQsIG5ld0dyYXBoRWxlbWVudCwKLQkJCQkJbmV3R3JhcGhFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCAmJiAoKEVPYmplY3QpIGRpYWdyYW0pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREaWFncmFtID0gKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbTsKLQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgZVJlc29sdmVQcm94eShvbGREaWFncmFtKTsKLQkJCWlmIChkaWFncmFtICE9IG9sZERpYWdyYW0pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNLCBvbGREaWFncmFtLAotCQkJCQkJCWRpYWdyYW0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBiYXNpY0dldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpYWdyYW0oRGlhZ3JhbSBuZXdEaWFncmFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaWFncmFtIG9sZERpYWdyYW0gPSBkaWFncmFtOwotCQlkaWFncmFtID0gbmV3RGlhZ3JhbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU0sCi0JCQkJCW9sZERpYWdyYW0sIG5ld0RpYWdyYW0pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIG5ld0RpYWdyYW0pIHsKLQkJaWYgKG5ld0RpYWdyYW0gIT0gZGlhZ3JhbSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGlhZ3JhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdEaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEaWFncmFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlhZ3JhbShuZXdEaWFncmFtLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU0sIG5ld0RpYWdyYW0sIG5ld0RpYWdyYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGRpYWdyYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSywgRGlhZ3JhbS5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKChEaWFncmFtKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSywgR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJcmV0dXJuIGdldFpvb20oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Vmlld3BvcnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZpZXdwb3J0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEdyYXBoRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCXNldFpvb20oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCXNldFZpZXdwb3J0KChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlzZXRab29tKFpPT01fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCXNldFZpZXdwb3J0KChQb2ludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlzZXREaWFncmFtKChEaWFncmFtKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCXJldHVybiBaT09NX0VERUZBVUxUID09IG51bGwgPyB6b29tICE9IG51bGwgOiAhWk9PTV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHpvb20pOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCXJldHVybiB2aWV3cG9ydCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoem9vbTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh6b29tKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlhZ3JhbUxpbmtJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGltZW5zaW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpbWVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxNWQ4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGltZW5zaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpbWVuc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwjZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbCNnZXRIZWlnaHQgPGVtPkhlaWdodDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpbWVuc2lvbkltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzIERpbWVuc2lvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2lkdGgoKSA8ZW0+V2lkdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBXSURUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgd2lkdGggPSBXSURUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWlnaHQoKSA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIZWlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIEhFSUdIVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWlnaHQoKSA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIZWlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgaGVpZ2h0ID0gSEVJR0hUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElNRU5TSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChEb3VibGUgbmV3V2lkdGgpIHsKLQkJRG91YmxlIG9sZFdpZHRoID0gd2lkdGg7Ci0JCXdpZHRoID0gbmV3V2lkdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSCwgb2xkV2lkdGgsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KERvdWJsZSBuZXdIZWlnaHQpIHsKLQkJRG91YmxlIG9sZEhlaWdodCA9IGhlaWdodDsKLQkJaGVpZ2h0ID0gbmV3SGVpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hULCBvbGRIZWlnaHQsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlyZXR1cm4gZ2V0V2lkdGgoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJcmV0dXJuIGdldEhlaWdodCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQkJc2V0V2lkdGgoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlzZXRIZWlnaHQoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlzZXRXaWR0aChXSURUSF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX0hFSUdIVDoKLQkJCXNldEhlaWdodChIRUlHSFRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSDoKLQkJCXJldHVybiBXSURUSF9FREVGQVVMVCA9PSBudWxsID8gd2lkdGggIT0gbnVsbCA6ICFXSURUSF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHdpZHRoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJcmV0dXJuIEhFSUdIVF9FREVGQVVMVCA9PSBudWxsID8gaGVpZ2h0ICE9IG51bGwgOiAhSEVJR0hUX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoaGVpZ2h0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh3aWR0aDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh3aWR0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGVpZ2h0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhlaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpbWVuc2lvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RkOTVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwjZ2V0RGlzY2lwbGluZXMgPGVtPkRpc2NpcGxpbmVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cwotCQlEaXNjaXBsaW5lR3JvdXBpbmcgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzY2lwbGluZXMoKSA8ZW0+RGlzY2lwbGluZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzY2lwbGluZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxEaXNjaXBsaW5lPiBkaXNjaXBsaW5lczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlzY2lwbGluZT4gZ2V0RGlzY2lwbGluZXMoKSB7Ci0JCWlmIChkaXNjaXBsaW5lcyA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGlzY2lwbGluZT4oCi0JCQkJCURpc2NpcGxpbmUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpOwotCQl9Ci0JCXJldHVybiBkaXNjaXBsaW5lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCXJldHVybiBnZXREaXNjaXBsaW5lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWdldERpc2NpcGxpbmVzKCkuY2xlYXIoKTsKLQkJCWdldERpc2NpcGxpbmVzKCkKLQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzY2lwbGluZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWdldERpc2NpcGxpbmVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOgotCQkJcmV0dXJuIGRpc2NpcGxpbmVzICE9IG51bGwgJiYgIWRpc2NpcGxpbmVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUdyb3VwaW5nSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1NWI0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFN1YmRpc2NpcGxpbmUgPGVtPlN1YmRpc2NpcGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRSZWZlcmVuY2VXb3JrZmxvd3MgPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBEaXNjaXBsaW5lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tzKCkgPGVtPlRhc2tzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGFzaz4gdGFza3M7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJkaXNjaXBsaW5lKCkgPGVtPlN1YmRpc2NpcGxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViZGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpc2NpcGxpbmU+IHN1YmRpc2NpcGxpbmU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxBY3Rpdml0eT4gcmVmZXJlbmNlV29ya2Zsb3dzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGFzaz4gZ2V0VGFza3MoKSB7Ci0JCWlmICh0YXNrcyA9PSBudWxsKSB7Ci0JCQl0YXNrcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8VGFzaz4oVGFzay5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUyk7Ci0JCX0KLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERpc2NpcGxpbmU+IGdldFN1YmRpc2NpcGxpbmUoKSB7Ci0JCWlmIChzdWJkaXNjaXBsaW5lID09IG51bGwpIHsKLQkJCXN1YmRpc2NpcGxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPERpc2NpcGxpbmU+KAotCQkJCQlEaXNjaXBsaW5lLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUpOwotCQl9Ci0JCXJldHVybiBzdWJkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEFjdGl2aXR5PiBnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSB7Ci0JCWlmIChyZWZlcmVuY2VXb3JrZmxvd3MgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlV29ya2Zsb3dzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxBY3Rpdml0eT4oCi0JCQkJCUFjdGl2aXR5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VXb3JrZmxvd3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTdWJkaXNjaXBsaW5lKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJcmV0dXJuIGdldFRhc2tzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJcmV0dXJuIGdldFN1YmRpc2NpcGxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlyZXR1cm4gZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJZ2V0VGFza3MoKS5jbGVhcigpOwotCQkJZ2V0VGFza3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRhc2s+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZ2V0U3ViZGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQlnZXRTdWJkaXNjaXBsaW5lKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzY2lwbGluZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKS5jbGVhcigpOwotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlnZXRUYXNrcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZ2V0U3ViZGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTOgotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJcmV0dXJuIHRhc2tzICE9IG51bGwgJiYgIXRhc2tzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlyZXR1cm4gc3ViZGlzY2lwbGluZSAhPSBudWxsICYmICFzdWJkaXNjaXBsaW5lLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlyZXR1cm4gcmVmZXJlbmNlV29ya2Zsb3dzICE9IG51bGwgJiYgIXJlZmVyZW5jZVdvcmtmbG93cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0Rpc2NpcGxpbmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5M2U1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9tYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbCNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsI2dldFN1YmRvbWFpbnMgPGVtPlN1YmRvbWFpbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERvbWFpbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrUHJvZHVjdHMoKSA8ZW0+V29yayBQcm9kdWN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdD4gd29ya1Byb2R1Y3RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViZG9tYWlucygpIDxlbT5TdWJkb21haW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YmRvbWFpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxEb21haW4+IHN1YmRvbWFpbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9tYWluSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERvbWFpbj4gZ2V0U3ViZG9tYWlucygpIHsKLQkJaWYgKHN1YmRvbWFpbnMgPT0gbnVsbCkgewotCQkJc3ViZG9tYWlucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8RG9tYWluPigKLQkJCQkJRG9tYWluLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YmRvbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YmRvbWFpbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlyZXR1cm4gZ2V0U3ViZG9tYWlucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlnZXRTdWJkb21haW5zKCkuY2xlYXIoKTsKLQkJCWdldFN1YmRvbWFpbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERvbWFpbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZ2V0U3ViZG9tYWlucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gd29ya1Byb2R1Y3RzICE9IG51bGwgJiYgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlyZXR1cm4gc3ViZG9tYWlucyAhPSBudWxsICYmICFzdWJkb21haW5zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vRG9tYWluSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwZmIxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWxlbWVudEltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzCi0JCUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMRU1FTlQ7Ci0JfQotCi19IC8vRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGxpcHNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTc4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsbGlwc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRSb3RhdGlvbiA8ZW0+Um90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldEVuZEFuZ2xlIDxlbT5FbmQgQW5nbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGxpcHNlSW1wbCBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmVJbXBsIGltcGxlbWVudHMgRWxsaXBzZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDZW50ZXIoKSA8ZW0+Q2VudGVyPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDZW50ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBjZW50ZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWCgpIDxlbT5SYWRpdXMgWDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgUkFESVVTX1hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWCgpIDxlbT5SYWRpdXMgWDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSByYWRpdXNYID0gUkFESVVTX1hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWSgpIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgUkFESVVTX1lfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWSgpIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSByYWRpdXNZID0gUkFESVVTX1lfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um90YXRpb24oKSA8ZW0+Um90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBST1RBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3RhdGlvbigpIDxlbT5Sb3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgcm90YXRpb24gPSBST1RBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydEFuZ2xlKCkgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBTVEFSVF9BTkdMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydEFuZ2xlKCkgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHN0YXJ0QW5nbGUgPSBTVEFSVF9BTkdMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRBbmdsZSgpIDxlbT5FbmQgQW5nbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVuZEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBFTkRfQU5HTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kQW5nbGUoKSA8ZW0+RW5kIEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbmRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBlbmRBbmdsZSA9IEVORF9BTkdMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGxpcHNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0UmFkaXVzWCgpIHsKLQkJcmV0dXJuIHJhZGl1c1g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFkaXVzWChEb3VibGUgbmV3UmFkaXVzWCkgewotCQlEb3VibGUgb2xkUmFkaXVzWCA9IHJhZGl1c1g7Ci0JCXJhZGl1c1ggPSBuZXdSYWRpdXNYOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YLCBvbGRSYWRpdXNYLCByYWRpdXNYKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRSYWRpdXNZKCkgewotCQlyZXR1cm4gcmFkaXVzWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYWRpdXNZKERvdWJsZSBuZXdSYWRpdXNZKSB7Ci0JCURvdWJsZSBvbGRSYWRpdXNZID0gcmFkaXVzWTsKLQkJcmFkaXVzWSA9IG5ld1JhZGl1c1k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1ksIG9sZFJhZGl1c1ksIHJhZGl1c1kpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFJvdGF0aW9uKCkgewotCQlyZXR1cm4gcm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um90YXRpb24oRG91YmxlIG5ld1JvdGF0aW9uKSB7Ci0JCURvdWJsZSBvbGRSb3RhdGlvbiA9IHJvdGF0aW9uOwotCQlyb3RhdGlvbiA9IG5ld1JvdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OLCBvbGRSb3RhdGlvbiwgcm90YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFN0YXJ0QW5nbGUoKSB7Ci0JCXJldHVybiBzdGFydEFuZ2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0QW5nbGUoRG91YmxlIG5ld1N0YXJ0QW5nbGUpIHsKLQkJRG91YmxlIG9sZFN0YXJ0QW5nbGUgPSBzdGFydEFuZ2xlOwotCQlzdGFydEFuZ2xlID0gbmV3U3RhcnRBbmdsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRSwgb2xkU3RhcnRBbmdsZSwgc3RhcnRBbmdsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0RW5kQW5nbGUoKSB7Ci0JCXJldHVybiBlbmRBbmdsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRBbmdsZShEb3VibGUgbmV3RW5kQW5nbGUpIHsKLQkJRG91YmxlIG9sZEVuZEFuZ2xlID0gZW5kQW5nbGU7Ci0JCWVuZEFuZ2xlID0gbmV3RW5kQW5nbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFLCBvbGRFbmRBbmdsZSwgZW5kQW5nbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0Q2VudGVyKCkgewotCQlpZiAoY2VudGVyICE9IG51bGwgJiYgKChFT2JqZWN0KSBjZW50ZXIpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRDZW50ZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBjZW50ZXI7Ci0JCQljZW50ZXIgPSAoUG9pbnQpIGVSZXNvbHZlUHJveHkob2xkQ2VudGVyKTsKLQkJCWlmIChjZW50ZXIgIT0gb2xkQ2VudGVyKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUiwgb2xkQ2VudGVyLCBjZW50ZXIpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2VudGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBiYXNpY0dldENlbnRlcigpIHsKLQkJcmV0dXJuIGNlbnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZW50ZXIoUG9pbnQgbmV3Q2VudGVyKSB7Ci0JCVBvaW50IG9sZENlbnRlciA9IGNlbnRlcjsKLQkJY2VudGVyID0gbmV3Q2VudGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUiwgb2xkQ2VudGVyLCBjZW50ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Q2VudGVyKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRDZW50ZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJcmV0dXJuIGdldFJhZGl1c1goKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQkJcmV0dXJuIGdldFJhZGl1c1koKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQkJcmV0dXJuIGdldFJvdGF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJCXJldHVybiBnZXRTdGFydEFuZ2xlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlyZXR1cm4gZ2V0RW5kQW5nbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSOgotCQkJc2V0Q2VudGVyKChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1g6Ci0JCQlzZXRSYWRpdXNYKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQkJc2V0UmFkaXVzWSgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTjoKLQkJCXNldFJvdGF0aW9uKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQkJc2V0U3RhcnRBbmdsZSgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlzZXRFbmRBbmdsZSgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSOgotCQkJc2V0Q2VudGVyKChQb2ludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXNldFJhZGl1c1goUkFESVVTX1hfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCQlzZXRSYWRpdXNZKFJBRElVU19ZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQkJc2V0Um90YXRpb24oUk9UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCQlzZXRTdGFydEFuZ2xlKFNUQVJUX0FOR0xFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCXNldEVuZEFuZ2xlKEVORF9BTkdMRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlyZXR1cm4gY2VudGVyICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXJldHVybiBSQURJVVNfWF9FREVGQVVMVCA9PSBudWxsID8gcmFkaXVzWCAhPSBudWxsCi0JCQkJCTogIVJBRElVU19YX0VERUZBVUxULmVxdWFscyhyYWRpdXNYKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQkJcmV0dXJuIFJBRElVU19ZX0VERUZBVUxUID09IG51bGwgPyByYWRpdXNZICE9IG51bGwKLQkJCQkJOiAhUkFESVVTX1lfRURFRkFVTFQuZXF1YWxzKHJhZGl1c1kpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlyZXR1cm4gUk9UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJvdGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUk9UQVRJT05fRURFRkFVTFQuZXF1YWxzKHJvdGF0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQkJcmV0dXJuIFNUQVJUX0FOR0xFX0VERUZBVUxUID09IG51bGwgPyBzdGFydEFuZ2xlICE9IG51bGwKLQkJCQkJOiAhU1RBUlRfQU5HTEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0QW5nbGUpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJcmV0dXJuIEVORF9BTkdMRV9FREVGQVVMVCA9PSBudWxsID8gZW5kQW5nbGUgIT0gbnVsbAotCQkJCQk6ICFFTkRfQU5HTEVfRURFRkFVTFQuZXF1YWxzKGVuZEFuZ2xlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyYWRpdXNYOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJhZGl1c1gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhZGl1c1k6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmFkaXVzWSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm90YXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocm90YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0QW5nbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3RhcnRBbmdsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW5kQW5nbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZW5kQW5nbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FbGxpcHNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWNmZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cwotCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQl9Ci0KLX0gLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjNjMjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXhhbXBsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhhbXBsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVhBTVBMRTsKLQl9Ci0KLX0gLy9FeGFtcGxlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Z1bGZpbGxhYmxlRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9GdWxmaWxsYWJsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2VkNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Z1bGZpbGxhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5GdWxmaWxsYWJsZUVsZW1lbnRJbXBsI2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZ1bGZpbGxhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRnVsZmlsbGFibGVFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGZpbGxzKCkgPGVtPkZ1bGZpbGxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bGZpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBmdWxmaWxsczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBGdWxmaWxsYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkZVTEZJTExBQkxFX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBnZXRGdWxmaWxscygpIHsKLQkJaWYgKGZ1bGZpbGxzID09IG51bGwpIHsKLQkJCWZ1bGZpbGxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KAotCQkJCQlGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFMpOwotCQl9Ci0JCXJldHVybiBmdWxmaWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCXJldHVybiBnZXRGdWxmaWxscygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCWdldEZ1bGZpbGxzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRnVsZmlsbGFibGVFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOgotCQkJZ2V0RnVsZmlsbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9GdWxmaWxsYWJsZUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllN2ExNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoQ29ubmVjdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIENvbm5lY3RvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaENvbm5lY3RvckltcGwjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhDb25uZWN0b3JJbXBsIGV4dGVuZHMgR3JhcGhFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoQ29ubmVjdG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyYXBoRWRnZSgpIDxlbT5HcmFwaCBFZGdlPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEdyYXBoRWRnZT4gZ3JhcGhFZGdlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoQ29ubmVjdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9DT05ORUNUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCwKLQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50KSB7Ci0JCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCAmJiBuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UsCi0JCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0R3JhcGhFbGVtZW50KG5ld0dyYXBoRWxlbWVudCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5ULCBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJCW5ld0dyYXBoRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEdyYXBoRWRnZT4gZ2V0R3JhcGhFZGdlKCkgewotCQlpZiAoZ3JhcGhFZGdlID09IG51bGwpIHsKLQkJCWdyYXBoRWRnZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZTxHcmFwaEVkZ2U+KAotCQkJCQlHcmFwaEVkZ2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUik7Ci0JCX0KLQkJcmV0dXJuIGdyYXBoRWRnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0R3JhcGhFZGdlKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRHcmFwaEVkZ2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLCBHcmFwaEVsZW1lbnQuY2xhc3MsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0U6Ci0JCQlyZXR1cm4gZ2V0R3JhcGhFZGdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0R3JhcGhFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJZ2V0R3JhcGhFZGdlKCkuY2xlYXIoKTsKLQkJCWdldEdyYXBoRWRnZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3JhcGhFZGdlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0U6Ci0JCQlnZXRHcmFwaEVkZ2UoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuIGdyYXBoRWRnZSAhPSBudWxsICYmICFncmFwaEVkZ2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vR3JhcGhDb25uZWN0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFZGdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWRnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1YjE3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbCNnZXRBbmNob3IgPGVtPkFuY2hvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoRWRnZUltcGwgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJbXBsIGltcGxlbWVudHMgR3JhcGhFZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdheXBvaW50cygpIDxlbT5XYXlwb2ludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2F5cG9pbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UG9pbnQ+IHdheXBvaW50czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFuY2hvcigpIDxlbT5BbmNob3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QW5jaG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3JhcGhDb25uZWN0b3I+IGFuY2hvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaEVkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8R3JhcGhDb25uZWN0b3I+IGdldEFuY2hvcigpIHsKLQkJaWYgKGFuY2hvciA9PSBudWxsKSB7Ci0JCQlhbmNob3IgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QuTWFueUludmVyc2U8R3JhcGhDb25uZWN0b3I+KAotCQkJCQlHcmFwaENvbm5lY3Rvci5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1IsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFKTsKLQkJfQotCQlyZXR1cm4gYW5jaG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFBvaW50PiBnZXRXYXlwb2ludHMoKSB7Ci0JCWlmICh3YXlwb2ludHMgPT0gbnVsbCkgewotCQkJd2F5cG9pbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxQb2ludD4oCi0JCQkJCVBvaW50LmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIHdheXBvaW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0QW5jaG9yKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRXYXlwb2ludHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0QW5jaG9yKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIGdldFdheXBvaW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuIGdldEFuY2hvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlnZXRXYXlwb2ludHMoKS5jbGVhcigpOwotCQkJZ2V0V2F5cG9pbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQb2ludD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCWdldEFuY2hvcigpLmNsZWFyKCk7Ci0JCQlnZXRBbmNob3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEdyYXBoQ29ubmVjdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCWdldFdheXBvaW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlnZXRBbmNob3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIHdheXBvaW50cyAhPSBudWxsICYmICF3YXlwb2ludHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuIGFuY2hvciAhPSBudWxsICYmICFhbmNob3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaEVkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhNDMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0Q29udGFpbmVkIDxlbT5Db250YWluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsI2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0TGluayA8ZW0+TGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsI2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhFbGVtZW50SW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZWQoKSA8ZW0+Q29udGFpbmVkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRhaW5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpYWdyYW1FbGVtZW50PiBjb250YWluZWQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3NpdGlvbigpIDxlbT5Qb3NpdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBwb3NpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlhZ3JhbUxpbms+IGxpbms7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbmNob3JhZ2UoKSA8ZW0+QW5jaG9yYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFuY2hvcmFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEdyYXBoQ29ubmVjdG9yPiBhbmNob3JhZ2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZW1hbnRpY01vZGVsKCkgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZSBzZW1hbnRpY01vZGVsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCWlmIChwb3NpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcG9zaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQb3NpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc2l0aW9uOwotCQkJcG9zaXRpb24gPSAoUG9pbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zaXRpb24pOwotCQkJaWYgKHBvc2l0aW9uICE9IG9sZFBvc2l0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCBvbGRQb3NpdGlvbiwKLQkJCQkJCQlwb3NpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIHBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKFBvaW50IG5ld1Bvc2l0aW9uKSB7Ci0JCVBvaW50IG9sZFBvc2l0aW9uID0gcG9zaXRpb247Ci0JCXBvc2l0aW9uID0gbmV3UG9zaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sIG9sZFBvc2l0aW9uLCBwb3NpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERpYWdyYW1FbGVtZW50PiBnZXRDb250YWluZWQoKSB7Ci0JCWlmIChjb250YWluZWQgPT0gbnVsbCkgewotCQkJY29udGFpbmVkID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nPERpYWdyYW1FbGVtZW50PigKLQkJCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERpYWdyYW1MaW5rPiBnZXRMaW5rKCkgewotCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQlsaW5rID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nPERpYWdyYW1MaW5rPigKLQkJCQkJRGlhZ3JhbUxpbmsuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSywKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEdyYXBoQ29ubmVjdG9yPiBnZXRBbmNob3JhZ2UoKSB7Ci0JCWlmIChhbmNob3JhZ2UgPT0gbnVsbCkgewotCQkJYW5jaG9yYWdlID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nPEdyYXBoQ29ubmVjdG9yPigKLQkJCQkJR3JhcGhDb25uZWN0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGFuY2hvcmFnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZSBnZXRTZW1hbnRpY01vZGVsKCkgewotCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBudWxsICYmICgoRU9iamVjdCkgc2VtYW50aWNNb2RlbCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlbWFudGljTW9kZWwgPSAoSW50ZXJuYWxFT2JqZWN0KSBzZW1hbnRpY01vZGVsOwotCQkJc2VtYW50aWNNb2RlbCA9IChTZW1hbnRpY01vZGVsQnJpZGdlKSBlUmVzb2x2ZVByb3h5KG9sZFNlbWFudGljTW9kZWwpOwotCQkJaWYgKHNlbWFudGljTW9kZWwgIT0gb2xkU2VtYW50aWNNb2RlbCkgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdTZW1hbnRpY01vZGVsID0gKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbDsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkU2VtYW50aWNNb2RlbC5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAobmV3U2VtYW50aWNNb2RlbC5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdTZW1hbnRpY01vZGVsLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCQkJb2xkU2VtYW50aWNNb2RlbCwgc2VtYW50aWNNb2RlbCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZW1hbnRpY01vZGVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGJhc2ljR2V0U2VtYW50aWNNb2RlbCgpIHsKLQkJcmV0dXJuIHNlbWFudGljTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VtYW50aWNNb2RlbCgKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbmV3U2VtYW50aWNNb2RlbCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG9sZFNlbWFudGljTW9kZWwgPSBzZW1hbnRpY01vZGVsOwotCQlzZW1hbnRpY01vZGVsID0gbmV3U2VtYW50aWNNb2RlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQkJb2xkU2VtYW50aWNNb2RlbCwgbmV3U2VtYW50aWNNb2RlbCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZW1hbnRpY01vZGVsKFNlbWFudGljTW9kZWxCcmlkZ2UgbmV3U2VtYW50aWNNb2RlbCkgewotCQlpZiAobmV3U2VtYW50aWNNb2RlbCAhPSBzZW1hbnRpY01vZGVsKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZW1hbnRpY01vZGVsICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzZW1hbnRpY01vZGVsKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdTZW1hbnRpY01vZGVsICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdTZW1hbnRpY01vZGVsKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlbWFudGljTW9kZWwobmV3U2VtYW50aWNNb2RlbCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsIG5ld1NlbWFudGljTW9kZWwsCi0JCQkJCW5ld1NlbWFudGljTW9kZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q29udGFpbmVkKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TGluaygpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0QW5jaG9yYWdlKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCWlmIChzZW1hbnRpY01vZGVsICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzZW1hbnRpY01vZGVsKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFNlbWFudGljTW9kZWwoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldENvbnRhaW5lZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TGluaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRBbmNob3JhZ2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlyZXR1cm4gYmFzaWNTZXRTZW1hbnRpY01vZGVsKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gZ2V0Q29udGFpbmVkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQb3NpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlyZXR1cm4gZ2V0TGluaygpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuIGdldEFuY2hvcmFnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U2VtYW50aWNNb2RlbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlnZXRDb250YWluZWQoKS5jbGVhcigpOwotCQkJZ2V0Q29udGFpbmVkKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCXNldFBvc2l0aW9uKChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCWdldExpbmsoKS5jbGVhcigpOwotCQkJZ2V0TGluaygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlhZ3JhbUxpbms+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlnZXRBbmNob3JhZ2UoKS5jbGVhcigpOwotCQkJZ2V0QW5jaG9yYWdlKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3JhcGhDb25uZWN0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCXNldFNlbWFudGljTW9kZWwoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlnZXRDb250YWluZWQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT046Ci0JCQlzZXRQb3NpdGlvbigoUG9pbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCWdldExpbmsoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJZ2V0QW5jaG9yYWdlKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJc2V0U2VtYW50aWNNb2RlbCgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gY29udGFpbmVkICE9IG51bGwgJiYgIWNvbnRhaW5lZC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCXJldHVybiBwb3NpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiBsaW5rICE9IG51bGwgJiYgIWxpbmsuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuIGFuY2hvcmFnZSAhPSBudWxsICYmICFhbmNob3JhZ2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlyZXR1cm4gc2VtYW50aWNNb2RlbCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhOb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5N2QzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbCNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlSW1wbCBleHRlbmRzIEdyYXBoRWxlbWVudEltcGwgaW1wbGVtZW50cyBHcmFwaE5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIHNpemU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gZ2V0U2l6ZSgpIHsKLQkJaWYgKHNpemUgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHNpemUpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTaXplID0gKEludGVybmFsRU9iamVjdCkgc2l6ZTsKLQkJCXNpemUgPSAoRGltZW5zaW9uKSBlUmVzb2x2ZVByb3h5KG9sZFNpemUpOwotCQkJaWYgKHNpemUgIT0gb2xkU2l6ZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFLCBvbGRTaXplLCBzaXplKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBiYXNpY0dldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIG5ld1NpemUpIHsKLQkJRGltZW5zaW9uIG9sZFNpemUgPSBzaXplOwotCQlzaXplID0gbmV3U2l6ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFLCBvbGRTaXplLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTaXplKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRTaXplKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlzZXRTaXplKChEaW1lbnNpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFOgotCQkJc2V0U2l6ZSgoRGltZW5zaW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlyZXR1cm4gc2l6ZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaE5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhpY1ByaW1pdGl2ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaGljUHJpbWl0aXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA3MzU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaGljUHJpbWl0aXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGhpYyBQcmltaXRpdmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljUHJpbWl0aXZlSW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoaWNQcmltaXRpdmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoaWNQcmltaXRpdmVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBISUNfUFJJTUlUSVZFOwotCX0KLQotfSAvL0dyYXBoaWNQcmltaXRpdmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTMyYjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXR0YWNobWVudHMgPGVtPkF0dGFjaG1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJR3VpZGFuY2VEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudHMoKSA8ZW0+QXR0YWNobWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hNRU5UU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudHMoKSA8ZW0+QXR0YWNobWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dGFjaG1lbnRzID0gQVRUQUNITUVOVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREFOQ0VfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRhY2htZW50cygpIHsKLQkJcmV0dXJuIGF0dGFjaG1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dGFjaG1lbnRzKFN0cmluZyBuZXdBdHRhY2htZW50cykgewotCQlTdHJpbmcgb2xkQXR0YWNobWVudHMgPSBhdHRhY2htZW50czsKLQkJYXR0YWNobWVudHMgPSBuZXdBdHRhY2htZW50czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMsCi0JCQkJCW9sZEF0dGFjaG1lbnRzLCBhdHRhY2htZW50cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXJldHVybiBnZXRBdHRhY2htZW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFM6Ci0JCQlzZXRBdHRhY2htZW50cygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJc2V0QXR0YWNobWVudHMoQVRUQUNITUVOVFNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJcmV0dXJuIEFUVEFDSE1FTlRTX0VERUZBVUxUID09IG51bGwgPyBhdHRhY2htZW50cyAhPSBudWxsCi0JCQkJCTogIUFUVEFDSE1FTlRTX0VERUZBVUxULmVxdWFscyhhdHRhY2htZW50cyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXR0YWNobWVudHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXR0YWNobWVudHMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGM1MDI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEd1aWRhbmNlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUd1aWRhbmNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkYW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREFOQ0U7Ci0JfQotCi19IC8vR3VpZGFuY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRlbGluZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzMzVmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkZWxpbmVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgR3VpZGVsaW5lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkZWxpbmVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQl9Ci0KLX0gLy9HdWlkZWxpbmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODA2NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0ltYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1hZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEltYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgdXJpID0gVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbWVUeXBlKCkgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWltZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWltZVR5cGUoKSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtaW1lVHlwZSA9IE1JTUVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSU1BR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFVSSSBuZXdVcmkpIHsKLQkJVVJJIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLklNQUdFX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLQkJcmV0dXJuIG1pbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKFN0cmluZyBuZXdNaW1lVHlwZSkgewotCQlTdHJpbmcgb2xkTWltZVR5cGUgPSBtaW1lVHlwZTsKLQkJbWltZVR5cGUgPSBuZXdNaW1lVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFLCBvbGRNaW1lVHlwZSwgbWltZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJcmV0dXJuIGdldFVyaSgpOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCXJldHVybiBnZXRNaW1lVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJc2V0VXJpKChVUkkpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlzZXRNaW1lVHlwZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX1VSSToKLQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCXNldE1pbWVUeXBlKE1JTUVfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxUCi0JCQkJCS5lcXVhbHModXJpKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlyZXR1cm4gTUlNRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBtaW1lVHlwZSAhPSBudWxsCi0JCQkJCTogIU1JTUVfVFlQRV9FREVGQVVMVC5lcXVhbHMobWltZVR5cGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVyaTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbWVUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1pbWVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW1hZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0l0ZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5MjU4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgSXRlcmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLklURVJBVElPTjsKLQl9Ci0KLX0gLy9JdGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvS2luZEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9LaW5kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg2ZjlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9LaW5kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5LaW5kSW1wbCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBLaW5kSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEtpbmQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgS2luZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuS0lORDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCWlmIChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9PSBudWxsKSB7Ci0JCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8QXBwbGljYWJsZU1ldGFDbGFzc0luZm8+KAotCQkJCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyk7Ci0JCX0KLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJcmV0dXJuIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5jbGVhcigpOwotCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvICE9IG51bGwKLQkJCQkJJiYgIWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vS2luZEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9MZWFmRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9MZWFmRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2MGZlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTGVhZkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGVhZiBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGVhZkVsZW1lbnRJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTGVhZkVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExlYWZFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5MRUFGX0VMRU1FTlQ7Ci0JfQotCi19IC8vTGVhZkVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjkwOTRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRQcm9jZXNzVmlld3MgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QmFzZUNvbmZpZ3VyYXRpb25zIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGFja2FnZT4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NWaWV3cygpIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NWaWV3cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gcHJvY2Vzc1ZpZXdzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZpZXcoKSA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDb25maWd1cmF0aW9ucygpIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDb25maWd1cmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGJhc2VDb25maWd1cmF0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gc3VidHJhY3RlZENhdGVnb3J5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkZWRDYXRlZ29yeSgpIDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRlZENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudENhdGVnb3J5PiBhZGRlZENhdGVnb3J5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGx1Z2luU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpblNlbGVjdGlvbiA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8TWV0aG9kUGx1Z2luPigKLQkJCQkJTWV0aG9kUGx1Z2luLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQYWNrYWdlU2VsZWN0aW9uID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxNZXRob2RQYWNrYWdlPigKLQkJCQkJTWV0aG9kUGFja2FnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFByb2Nlc3NWaWV3cygpIHsKLQkJaWYgKHByb2Nlc3NWaWV3cyA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzVmlld3MgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbnRlbnRDYXRlZ29yeT4oCi0JCQkJCUNvbnRlbnRDYXRlZ29yeS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NWaWV3czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5IGdldERlZmF1bHRWaWV3KCkgewotCQlpZiAoZGVmYXVsdFZpZXcgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGRlZmF1bHRWaWV3KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVmYXVsdFZpZXcgPSAoSW50ZXJuYWxFT2JqZWN0KSBkZWZhdWx0VmlldzsKLQkJCWRlZmF1bHRWaWV3ID0gKENvbnRlbnRDYXRlZ29yeSkgZVJlc29sdmVQcm94eShvbGREZWZhdWx0Vmlldyk7Ci0JCQlpZiAoZGVmYXVsdFZpZXcgIT0gb2xkRGVmYXVsdFZpZXcpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVywKLQkJCQkJCQlvbGREZWZhdWx0VmlldywgZGVmYXVsdFZpZXcpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBiYXNpY0dldERlZmF1bHRWaWV3KCkgewotCQlyZXR1cm4gZGVmYXVsdFZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZpZXcoQ29udGVudENhdGVnb3J5IG5ld0RlZmF1bHRWaWV3KSB7Ci0JCUNvbnRlbnRDYXRlZ29yeSBvbGREZWZhdWx0VmlldyA9IGRlZmF1bHRWaWV3OwotCQlkZWZhdWx0VmlldyA9IG5ld0RlZmF1bHRWaWV3OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsCi0JCQkJCW9sZERlZmF1bHRWaWV3LCBkZWZhdWx0VmlldykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldEJhc2VDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKGJhc2VDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQliYXNlQ29uZmlndXJhdGlvbnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlpZiAoc3VidHJhY3RlZENhdGVnb3J5ID09IG51bGwpIHsKLQkJCXN1YnRyYWN0ZWRDYXRlZ29yeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudENhdGVnb3J5PigKLQkJCQkJQ29udGVudENhdGVnb3J5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZKTsKLQkJfQotCQlyZXR1cm4gc3VidHJhY3RlZENhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0QWRkZWRDYXRlZ29yeSgpIHsKLQkJaWYgKGFkZGVkQ2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJYWRkZWRDYXRlZ29yeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudENhdGVnb3J5PigKLQkJCQkJQ29udGVudENhdGVnb3J5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCXJldHVybiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzoKLQkJCXJldHVybiBnZXRQcm9jZXNzVmlld3MoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZpZXcoKTsKLQkJCXJldHVybiBiYXNpY0dldERlZmF1bHRWaWV3KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiBnZXRCYXNlQ29uZmlndXJhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIGdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIGdldEFkZGVkQ2F0ZWdvcnkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQlnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQYWNrYWdlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlnZXRQcm9jZXNzVmlld3MoKS5jbGVhcigpOwotCQkJZ2V0UHJvY2Vzc1ZpZXdzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCXNldERlZmF1bHRWaWV3KChDb250ZW50Q2F0ZWdvcnkpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TOgotCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEJhc2VDb25maWd1cmF0aW9ucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQlnZXRBZGRlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQlnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOgotCQkJZ2V0UHJvY2Vzc1ZpZXdzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQlzZXREZWZhdWx0VmlldygoQ29udGVudENhdGVnb3J5KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TOgotCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbiAhPSBudWxsCi0JCQkJCSYmICFtZXRob2RQbHVnaW5TZWxlY3Rpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uICE9IG51bGwKLQkJCQkJJiYgIW1ldGhvZFBhY2thZ2VTZWxlY3Rpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlyZXR1cm4gcHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgIXByb2Nlc3NWaWV3cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJcmV0dXJuIGRlZmF1bHRWaWV3ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbnMgIT0gbnVsbCAmJiAhYmFzZUNvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeSAhPSBudWxsICYmICFzdWJ0cmFjdGVkQ2F0ZWdvcnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhYWRkZWRDYXRlZ29yeS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFiOTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kRWxlbWVudEltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgTWV0aG9kRWxlbWVudCwgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWQoKSA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBndWlkID0gR1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE93bmVkUnVsZXMoKSA8ZW0+T3duZWQgUnVsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3duZWRSdWxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnN0cmFpbnQ+IG93bmVkUnVsZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBtZXRob2RFbGVtZW50UHJvcGVydHk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEtpbmQ+IGtpbmQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwcHJlc3NlZCgpIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gU1VQUFJFU1NFRF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwcmVzc2VkKCkgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHN1cHByZXNzZWQgPSBTVVBQUkVTU0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJpbmdHdWlkZSA9IE9SREVSSU5HX0dVSURFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlpZiAoZ3VpZCA9PSBudWxsIHx8IGd1aWQubGVuZ3RoKCkgPT0gMCkgewotCQkJZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCk7Ci0JCX0KLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHdWlkKFN0cmluZyBuZXdHdWlkKSB7Ci0JCVN0cmluZyBvbGRHdWlkID0gZ3VpZDsKLQkJZ3VpZCA9IG5ld0d1aWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQsIG9sZEd1aWQsIGd1aWQpKTsKLQotCQkvLyBzeW5jaCB1cCB0aGUgcmVzb3VyY2UncyBJRFRvRU9iamVjdE1hcCBhbmQgRU9iamVjdFRvSURNYXAgd2l0aCBuZXdHdWlkCi0JCS8vCi0JCWlmIChlUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQlYTUxSZXNvdXJjZSByZXNvdXJjZSA9ICgoWE1MUmVzb3VyY2UpIGVSZXNvdXJjZSgpKTsKLQkJCXJlc291cmNlLnNldElEKHRoaXMsIG5ld0d1aWQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCUxpc3Q8SUFkYXB0YWJsZT4gZXh0ZW5zaW9ucyA9IEV4dGVuc2lvbkhlbHBlci5nZXRFeHRlbnNpb25zKCJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlIiwgIm1ldGhvZEVsZW1lbnRJQWRhcHRhYmxlIiwgSUFkYXB0YWJsZS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmb3IgKElBZGFwdGFibGUgYWRhcHRhYmxlIDogZXh0ZW5zaW9ucykgewotCQkJT2JqZWN0IHJlc3VsdCA9IGFkYXB0YWJsZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIG5ld1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRhdGlvbk5hbWUgPSBwcmVzZW50YXRpb25OYW1lOwotCQlwcmVzZW50YXRpb25OYW1lID0gbmV3UHJlc2VudGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCW9sZFByZXNlbnRhdGlvbk5hbWUsIHByZXNlbnRhdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmllZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIG5ld0JyaWVmRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZEJyaWVmRGVzY3JpcHRpb24gPSBicmllZkRlc2NyaXB0aW9uOwotCQlicmllZkRlc2NyaXB0aW9uID0gbmV3QnJpZWZEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04sCi0JCQkJCW9sZEJyaWVmRGVzY3JpcHRpb24sIGJyaWVmRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb25zdHJhaW50PiBnZXRPd25lZFJ1bGVzKCkgewotCQlpZiAob3duZWRSdWxlcyA9PSBudWxsKSB7Ci0JCQlvd25lZFJ1bGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxDb25zdHJhaW50PigKLQkJCQkJQ29uc3RyYWludC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMpOwotCQl9Ci0JCXJldHVybiBvd25lZFJ1bGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlpZiAobWV0aG9kRWxlbWVudFByb3BlcnR5ID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8TWV0aG9kRWxlbWVudFByb3BlcnR5PigKLQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxLaW5kPiBnZXRLaW5kKCkgewotCQlpZiAoa2luZCA9PSBudWxsKSB7Ci0JCQlraW5kID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxLaW5kPihLaW5kLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EKTsKLQkJfQotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRTdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2VkKEJvb2xlYW4gbmV3U3VwcHJlc3NlZCkgewotCQlCb29sZWFuIG9sZFN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwotCQlzdXBwcmVzc2VkID0gbmV3U3VwcHJlc3NlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCwgb2xkU3VwcHJlc3NlZCwKLQkJCQkJc3VwcHJlc3NlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIG9yZGVyaW5nR3VpZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcgbmV3T3JkZXJpbmdHdWlkZSkgewotCQlTdHJpbmcgb2xkT3JkZXJpbmdHdWlkZSA9IG9yZGVyaW5nR3VpZGU7Ci0JCW9yZGVyaW5nR3VpZGUgPSBuZXdPcmRlcmluZ0d1aWRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSwKLQkJCQkJb2xkT3JkZXJpbmdHdWlkZSwgb3JkZXJpbmdHdWlkZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRPd25lZFJ1bGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXJldHVybiBnZXRHdWlkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCXJldHVybiBnZXRPd25lZFJ1bGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fS0lORDoKLQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlyZXR1cm4gZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXNldEd1aWQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJc2V0UHJlc2VudGF0aW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCWdldE93bmVkUnVsZXMoKS5jbGVhcigpOwotCQkJZ2V0T3duZWRSdWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29uc3RyYWludD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50UHJvcGVydHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fS0lORDoKLQkJCWdldEtpbmQoKS5jbGVhcigpOwotCQkJZ2V0S2luZCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgS2luZD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJc2V0U3VwcHJlc3NlZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJc2V0T3JkZXJpbmdHdWlkZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCQlzZXRHdWlkKEdVSURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJc2V0UHJlc2VudGF0aW9uTmFtZShQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCWdldE93bmVkUnVsZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EOgotCQkJZ2V0S2luZCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCXNldFN1cHByZXNzZWQoU1VQUFJFU1NFRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlzZXRPcmRlcmluZ0d1aWRlKE9SREVSSU5HX0dVSURFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJcmV0dXJuIEdVSURfRURFRkFVTFQgPT0gbnVsbCA/IGd1aWQgIT0gbnVsbCA6ICFHVUlEX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoZ3VpZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlyZXR1cm4gUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRhdGlvbk5hbWUgIT0gbnVsbAotCQkJCQk6ICFQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMocHJlc2VudGF0aW9uTmFtZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGJyaWVmRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoYnJpZWZEZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCQlyZXR1cm4gb3duZWRSdWxlcyAhPSBudWxsICYmICFvd25lZFJ1bGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHkgIT0gbnVsbAotCQkJCQkmJiAhbWV0aG9kRWxlbWVudFByb3BlcnR5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EOgotCQkJcmV0dXJuIGtpbmQgIT0gbnVsbCAmJiAha2luZC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCXJldHVybiBTVVBQUkVTU0VEX0VERUZBVUxUID09IG51bGwgPyBzdXBwcmVzc2VkICE9IG51bGwKLQkJCQkJOiAhU1VQUFJFU1NFRF9FREVGQVVMVC5lcXVhbHMoc3VwcHJlc3NlZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlyZXR1cm4gT1JERVJJTkdfR1VJREVfRURFRkFVTFQgPT0gbnVsbCA/IG9yZGVyaW5nR3VpZGUgIT0gbnVsbAotCQkJCQk6ICFPUkRFUklOR19HVUlERV9FREVGQVVMVC5lcXVhbHMob3JkZXJpbmdHdWlkZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3VpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChndWlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50YXRpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRhdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJyaWVmRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYnJpZWZEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VwcHJlc3NlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzdXBwcmVzc2VkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlcmluZ0d1aWRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG9yZGVyaW5nR3VpZGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjQwN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NGQyZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0TWV0aG9kUGx1Z2lucyA8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kTGlicmFyeSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5zKCkgPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQbHVnaW4+IG1ldGhvZFBsdWdpbnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUlk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW5zKCkgewotCQlpZiAobWV0aG9kUGx1Z2lucyA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RQbHVnaW4+KAotCQkJCQlNZXRob2RQbHVnaW4uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RDb25maWd1cmF0aW9uPigKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlZmluZWRDb25maWd1cmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TWV0aG9kUGx1Z2lucygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSkKLQkJCQkJLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJcmV0dXJuIGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlnZXRNZXRob2RQbHVnaW5zKCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZFBsdWdpbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCWdldE1ldGhvZFBsdWdpbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJcmV0dXJuIG1ldGhvZFBsdWdpbnMgIT0gbnVsbCAmJiAhbWV0aG9kUGx1Z2lucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiBwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vTWV0aG9kTGlicmFyeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTQ3N2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldEdsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0UmV1c2VkUGFja2FnZXMgPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldENoaWxkUGFja2FnZXMgPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEdMT0JBTF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHbG9iYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGdsb2JhbCA9IEdMT0JBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldXNlZFBhY2thZ2VzKCkgPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXVzZWRQYWNrYWdlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBhY2thZ2U+IHJldXNlZFBhY2thZ2VzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hpbGRQYWNrYWdlcygpIDxlbT5DaGlsZCBQYWNrYWdlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGlsZFBhY2thZ2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGFja2FnZT4gY2hpbGRQYWNrYWdlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRHbG9iYWwoKSB7Ci0JCXJldHVybiBnbG9iYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2xvYmFsKEJvb2xlYW4gbmV3R2xvYmFsKSB7Ci0JCUJvb2xlYW4gb2xkR2xvYmFsID0gZ2xvYmFsOwotCQlnbG9iYWwgPSBuZXdHbG9iYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCwgb2xkR2xvYmFsLCBnbG9iYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRSZXVzZWRQYWNrYWdlcygpIHsKLQkJaWYgKHJldXNlZFBhY2thZ2VzID09IG51bGwpIHsKLQkJCXJldXNlZFBhY2thZ2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxNZXRob2RQYWNrYWdlPigKLQkJCQkJTWV0aG9kUGFja2FnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTKTsKLQkJfQotCQlyZXR1cm4gcmV1c2VkUGFja2FnZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0Q2hpbGRQYWNrYWdlcygpIHsKLQkJaWYgKGNoaWxkUGFja2FnZXMgPT0gbnVsbCkgewotCQkJY2hpbGRQYWNrYWdlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8TWV0aG9kUGFja2FnZT4oCi0JCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRQYWNrYWdlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q2hpbGRQYWNrYWdlcygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJcmV0dXJuIGdldEdsb2JhbCgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzoKLQkJCXJldHVybiBnZXRSZXVzZWRQYWNrYWdlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIGdldENoaWxkUGFja2FnZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCXNldEdsb2JhbCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzoKLQkJCWdldFJldXNlZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCWdldFJldXNlZFBhY2thZ2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGFja2FnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCWdldENoaWxkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCXNldEdsb2JhbChHTE9CQUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzoKLQkJCWdldFJldXNlZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCWdldENoaWxkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCXJldHVybiBHTE9CQUxfRURFRkFVTFQgPT0gbnVsbCA/IGdsb2JhbCAhPSBudWxsIDogIUdMT0JBTF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKGdsb2JhbCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIHJldXNlZFBhY2thZ2VzICE9IG51bGwgJiYgIXJldXNlZFBhY2thZ2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCXJldHVybiBjaGlsZFBhY2thZ2VzICE9IG51bGwgJiYgIWNoaWxkUGFja2FnZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdsb2JhbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChnbG9iYWwpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UGFyZW50UGFja2FnZSgpCi0JICovCi0JcHVibGljIE1ldGhvZFBhY2thZ2UgZ2V0UGFyZW50UGFja2FnZSgpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBlQ29udGFpbmVyKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gKE1ldGhvZFBhY2thZ2UpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9NZXRob2RQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMDhlMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldFVzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldE1ldGhvZFBhY2thZ2VzIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldEJhc2VzIDxlbT5CYXNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjaXNTdXBwb3J0aW5nIDxlbT5TdXBwb3J0aW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kUGx1Z2luIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VyQ2hhbmdlYWJsZSgpIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUID0gQm9vbGVhbi5UUlVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlckNoYW5nZWFibGUoKSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gdXNlckNoYW5nZWFibGUgPSBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlcygpIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQYWNrYWdlPiBtZXRob2RQYWNrYWdlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VzKCkgPGVtPkJhc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1cHBvcnRpbmcoKSA8ZW0+U3VwcG9ydGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdXBwb3J0aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1VQUE9SVElOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdXBwb3J0aW5nKCkgPGVtPlN1cHBvcnRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VwcG9ydGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydGluZyA9IFNVUFBPUlRJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFVzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gdXNlckNoYW5nZWFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbiBuZXdVc2VyQ2hhbmdlYWJsZSkgewotCQlCb29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlID0gdXNlckNoYW5nZWFibGU7Ci0JCXVzZXJDaGFuZ2VhYmxlID0gbmV3VXNlckNoYW5nZWFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLAotCQkJCQlvbGRVc2VyQ2hhbmdlYWJsZSwgdXNlckNoYW5nZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlcygpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2VzID09IG51bGwpIHsKLQkJCW1ldGhvZFBhY2thZ2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RQYWNrYWdlPigKLQkJCQkJTWV0aG9kUGFja2FnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldEJhc2VzKCkgewotCQlpZiAoYmFzZXMgPT0gbnVsbCkgewotCQkJYmFzZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZFBsdWdpbj4oTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTKTsKLQkJfQotCQlyZXR1cm4gYmFzZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0aW5nKCkgewotCQlyZXR1cm4gc3VwcG9ydGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXBwb3J0aW5nKGJvb2xlYW4gbmV3U3VwcG9ydGluZykgewotCQlib29sZWFuIG9sZFN1cHBvcnRpbmcgPSBzdXBwb3J0aW5nOwotCQlzdXBwb3J0aW5nID0gbmV3U3VwcG9ydGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19TVVBQT1JUSU5HLCBvbGRTdXBwb3J0aW5nLAotCQkJCQlzdXBwb3J0aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldE1ldGhvZFBhY2thZ2VzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCXJldHVybiBnZXRVc2VyQ2hhbmdlYWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJcmV0dXJuIGdldE1ldGhvZFBhY2thZ2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19CQVNFUzoKLQkJCXJldHVybiBnZXRCYXNlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fU1VQUE9SVElORzoKLQkJCXJldHVybiBpc1N1cHBvcnRpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCXNldFVzZXJDaGFuZ2VhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19CQVNFUzoKLQkJCWdldEJhc2VzKCkuY2xlYXIoKTsKLQkJCWdldEJhc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19TVVBQT1JUSU5HOgotCQkJc2V0U3VwcG9ydGluZygoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJc2V0VXNlckNoYW5nZWFibGUoVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCWdldE1ldGhvZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJZ2V0QmFzZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fU1VQUE9SVElORzoKLQkJCXNldFN1cHBvcnRpbmcoU1VQUE9SVElOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQlyZXR1cm4gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUID09IG51bGwgPyB1c2VyQ2hhbmdlYWJsZSAhPSBudWxsCi0JCQkJCTogIVVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVC5lcXVhbHModXNlckNoYW5nZWFibGUpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VzICE9IG51bGwgJiYgIW1ldGhvZFBhY2thZ2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJcmV0dXJuIGJhc2VzICE9IG51bGwgJiYgIWJhc2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1NVUFBPUlRJTkc6Ci0JCQlyZXR1cm4gc3VwcG9ydGluZyAhPSBTVVBQT1JUSU5HX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVzZXJDaGFuZ2VhYmxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVzZXJDaGFuZ2VhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdXBwb3J0aW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN1cHBvcnRpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RQbHVnaW5JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kVW5pdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGZkYmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgVW5pdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kVW5pdEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1ldGhvZFVuaXQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvcnMgPSBBVVRIT1JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBDSEFOR0VfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0ZSBjaGFuZ2VEYXRlID0gQ0hBTkdFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNoYW5nZURlc2NyaXB0aW9uID0gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodFN0YXRlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kVW5pdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRDaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gY2hhbmdlRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEYXRlKERhdGUgbmV3Q2hhbmdlRGF0ZSkgewotCQlEYXRlIG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsCi0JCQkJCWNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCW9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ29weXJpZ2h0U3RhdGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50OwotCQkJY29weXJpZ2h0U3RhdGVtZW50ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgZVJlc29sdmVQcm94eShvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpOwotCQkJaWYgKGNvcHlyaWdodFN0YXRlbWVudCAhPSBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgYmFzaWNHZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0U3RhdGVtZW50KFN1cHBvcnRpbmdNYXRlcmlhbCBuZXdDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZENvcHlyaWdodFN0YXRlbWVudCA9IGNvcHlyaWdodFN0YXRlbWVudDsKLQkJY29weXJpZ2h0U3RhdGVtZW50ID0gbmV3Q29weXJpZ2h0U3RhdGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQlvbGRDb3B5cmlnaHRTdGF0ZW1lbnQsIGNvcHlyaWdodFN0YXRlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQlyZXR1cm4gQVVUSE9SU19FREVGQVVMVCA9PSBudWxsID8gYXV0aG9ycyAhPSBudWxsCi0JCQkJCTogIUFVVEhPUlNfRURFRkFVTFQuZXF1YWxzKGF1dGhvcnMpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJcmV0dXJuIENIQU5HRV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEYXRlICE9IG51bGwKLQkJCQkJOiAhQ0hBTkdFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNoYW5nZURhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXJldHVybiBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwKLQkJCQkJOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdXRob3JzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFVuaXRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01pbGVzdG9uZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyYWM3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwjZ2V0UmVxdWlyZWRSZXN1bHRzIDxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lSW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1pbGVzdG9uZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXF1aXJlZFJlc3VsdHMoKSA8ZW0+UmVxdWlyZWQgUmVzdWx0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXF1aXJlZFJlc3VsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHJlcXVpcmVkUmVzdWx0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNaWxlc3RvbmVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1JTEVTVE9ORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldFJlcXVpcmVkUmVzdWx0cygpIHsKLQkJaWYgKHJlcXVpcmVkUmVzdWx0cyA9PSBudWxsKSB7Ci0JCQlyZXF1aXJlZFJlc3VsdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFMpOwotCQl9Ci0JCXJldHVybiByZXF1aXJlZFJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTOgotCQkJcmV0dXJuIGdldFJlcXVpcmVkUmVzdWx0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFM6Ci0JCQlnZXRSZXF1aXJlZFJlc3VsdHMoKS5jbGVhcigpOwotCQkJZ2V0UmVxdWlyZWRSZXN1bHRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUUzoKLQkJCWdldFJlcXVpcmVkUmVzdWx0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFM6Ci0JCQlyZXR1cm4gcmVxdWlyZWRSZXN1bHRzICE9IG51bGwgJiYgIXJlcXVpcmVkUmVzdWx0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01pbGVzdG9uZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg4YjZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWRFbGVtZW50SW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTmFtZWRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTmFtZWRFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVzcGFjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lc3BhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZmViZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVzcGFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZXNwYWNlSW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlOYW1lc3BhY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRVNQQUNFOwotCX0KLQotfSAvL05hbWVzcGFjZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzc0NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRjb21lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0Y29tZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBPdXRjb21lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRjb21lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5PVVRDT01FOwotCX0KLQotfSAvL091dGNvbWVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWI4NjVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZUltcGwgZXh0ZW5kcyBOYW1lc3BhY2VJbXBsIGltcGxlbWVudHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFOwotCX0KLQotfSAvL1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5MDQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VhYmxlRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEFDS0FHRUFCTEVfRUxFTUVOVDsKLQl9Ci0KLX0gLy9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGhhc2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGhhc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTFjNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgUGhhc2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBoYXNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QSEFTRTsKLQl9Ci0KLX0gLy9QaGFzZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU1OWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldFJhbmsgPGVtPlJhbms8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGFubmluZ0RhdGFJbXBsIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJUGxhbm5pbmdEYXRhIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGUgU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0ZSBzdGFydERhdGUgPSBTVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBGSU5JU0hfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0ZSBmaW5pc2hEYXRlID0gRklOSVNIX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuaygpIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSQU5LX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmsoKSA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCByYW5rID0gUkFOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQbGFubmluZ0RhdGFJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0U3RhcnREYXRlKCkgewotCQlyZXR1cm4gc3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZShEYXRlIG5ld1N0YXJ0RGF0ZSkgewotCQlEYXRlIG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwKLQkJCQkJc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0RmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIGZpbmlzaERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoRGF0ZShEYXRlIG5ld0ZpbmlzaERhdGUpIHsKLQkJRGF0ZSBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsCi0JCQkJCWZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJhbmsoKSB7Ci0JCXJldHVybiByYW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmsoaW50IG5ld1JhbmspIHsKLQkJaW50IG9sZFJhbmsgPSByYW5rOwotCQlyYW5rID0gbmV3UmFuazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LLCBvbGRSYW5rLCByYW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXJldHVybiBnZXRTdGFydERhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0UmFuaygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXNldFN0YXJ0RGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlzZXRGaW5pc2hEYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJc2V0UmFuaygoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlzZXRGaW5pc2hEYXRlKEZJTklTSF9EQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlzZXRSYW5rKFJBTktfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXJldHVybiBTVEFSVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGFydERhdGUgIT0gbnVsbAotCQkJCQk6ICFTVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhzdGFydERhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlyZXR1cm4gRklOSVNIX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaERhdGUgIT0gbnVsbAotCQkJCQk6ICFGSU5JU0hfREFURV9FREVGQVVMVC5lcXVhbHMoZmluaXNoRGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJcmV0dXJuIHJhbmsgIT0gUkFOS19FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzdGFydERhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hEYXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhbms6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmFuayk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BsYW5uaW5nRGF0YUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2ludEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2ludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmYTJiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9pbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb2ludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbCNnZXRYIDxlbT5YPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsI2dldFkgPGVtPlk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2ludEltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzIFBvaW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYKCkgPGVtPlg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WCgpIDxlbT5YPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHggPSBYX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFkoKSA8ZW0+WTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRZKCkgPGVtPlk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgeSA9IFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBPSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0WCgpIHsKLQkJcmV0dXJuIHg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0WChEb3VibGUgbmV3WCkgewotCQlEb3VibGUgb2xkWCA9IHg7Ci0JCXggPSBuZXdYOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBPSU5UX19YLCBvbGRYLCB4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRZKCkgewotCQlyZXR1cm4geTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRZKERvdWJsZSBuZXdZKSB7Ci0JCURvdWJsZSBvbGRZID0geTsKLQkJeSA9IG5ld1k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUE9JTlRfX1ksIG9sZFksIHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWDoKLQkJCXJldHVybiBnZXRYKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXJldHVybiBnZXRZKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJc2V0WCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXNldFkoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJc2V0WChYX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJc2V0WShZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJcmV0dXJuIFhfRURFRkFVTFQgPT0gbnVsbCA/IHggIT0gbnVsbCA6ICFYX0VERUZBVUxULmVxdWFscyh4KTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJcmV0dXJuIFlfRURFRkFVTFQgPT0gbnVsbCA/IHkgIT0gbnVsbCA6ICFZX0VERUZBVUxULmVxdWFscyh5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh4OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoeSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvaW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvbHlsaW5lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvbHlsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDZjNWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2x5bGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9seWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwjZ2V0Q2xvc2VkIDxlbT5DbG9zZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2x5bGluZUltcGwgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlSW1wbCBpbXBsZW1lbnRzIFBvbHlsaW5lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbG9zZWQoKSA8ZW0+Q2xvc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbG9zZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDTE9TRURfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbG9zZWQoKSA8ZW0+Q2xvc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbG9zZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNsb3NlZCA9IENMT1NFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdheXBvaW50cygpIDxlbT5XYXlwb2ludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2F5cG9pbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UG9pbnQ+IHdheXBvaW50czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2x5bGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2xvc2VkKCkgewotCQlyZXR1cm4gY2xvc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsb3NlZChCb29sZWFuIG5ld0Nsb3NlZCkgewotCQlCb29sZWFuIG9sZENsb3NlZCA9IGNsb3NlZDsKLQkJY2xvc2VkID0gbmV3Q2xvc2VkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQsIG9sZENsb3NlZCwgY2xvc2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UG9pbnQ+IGdldFdheXBvaW50cygpIHsKLQkJaWYgKHdheXBvaW50cyA9PSBudWxsKSB7Ci0JCQl3YXlwb2ludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFBvaW50PigKLQkJCQkJUG9pbnQuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIHdheXBvaW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFdheXBvaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlyZXR1cm4gZ2V0Q2xvc2VkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIGdldFdheXBvaW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJc2V0Q2xvc2VkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCWdldFdheXBvaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUG9pbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRDoKLQkJCXNldENsb3NlZChDTE9TRURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCWdldFdheXBvaW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJcmV0dXJuIENMT1NFRF9FREVGQVVMVCA9PSBudWxsID8gY2xvc2VkICE9IG51bGwgOiAhQ0xPU0VEX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoY2xvc2VkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gd2F5cG9pbnRzICE9IG51bGwgJiYgIXdheXBvaW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xvc2VkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNsb3NlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvbHlsaW5lSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5YzhmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVByYWN0aWNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxJbmZvKCkgPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFERElUSU9OQUxfSU5GT19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IEFERElUSU9OQUxfSU5GT19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9ibGVtKCkgPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9ibGVtID0gUFJPQkxFTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kKCkgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBiYWNrZ3JvdW5kID0gQkFDS0dST1VORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHb2FscygpIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdPQUxTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHb2FscygpIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ29hbHMgPSBHT0FMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXBwbGljYXRpb24gPSBBUFBMSUNBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsZXZlbHNPZkFkb3B0aW9uID0gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgbmV3QWRkaXRpb25hbEluZm8pIHsKLQkJU3RyaW5nIG9sZEFkZGl0aW9uYWxJbmZvID0gYWRkaXRpb25hbEluZm87Ci0JCWFkZGl0aW9uYWxJbmZvID0gbmV3QWRkaXRpb25hbEluZm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywKLQkJCQkJb2xkQWRkaXRpb25hbEluZm8sIGFkZGl0aW9uYWxJbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9ibGVtKCkgewotCQlyZXR1cm4gcHJvYmxlbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtKFN0cmluZyBuZXdQcm9ibGVtKSB7Ci0JCVN0cmluZyBvbGRQcm9ibGVtID0gcHJvYmxlbTsKLQkJcHJvYmxlbSA9IG5ld1Byb2JsZW07Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0sIG9sZFByb2JsZW0sCi0JCQkJCXByb2JsZW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBiYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIG5ld0JhY2tncm91bmQpIHsKLQkJU3RyaW5nIG9sZEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOwotCQliYWNrZ3JvdW5kID0gbmV3QmFja2dyb3VuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCwgb2xkQmFja2dyb3VuZCwKLQkJCQkJYmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R29hbHMoKSB7Ci0JCXJldHVybiBnb2FsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHb2FscyhTdHJpbmcgbmV3R29hbHMpIHsKLQkJU3RyaW5nIG9sZEdvYWxzID0gZ29hbHM7Ci0JCWdvYWxzID0gbmV3R29hbHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTLCBvbGRHb2FscywgZ29hbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRBcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQlhcHBsaWNhdGlvbiA9IG5ld0FwcGxpY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwKLQkJCQkJb2xkQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gbGV2ZWxzT2ZBZG9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyBuZXdMZXZlbHNPZkFkb3B0aW9uKSB7Ci0JCVN0cmluZyBvbGRMZXZlbHNPZkFkb3B0aW9uID0gbGV2ZWxzT2ZBZG9wdGlvbjsKLQkJbGV2ZWxzT2ZBZG9wdGlvbiA9IG5ld0xldmVsc09mQWRvcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwKLQkJCQkJb2xkTGV2ZWxzT2ZBZG9wdGlvbiwgbGV2ZWxzT2ZBZG9wdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJcmV0dXJuIGdldFByb2JsZW0oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJcmV0dXJuIGdldEJhY2tncm91bmQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCXJldHVybiBnZXRHb2FscygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJcmV0dXJuIGdldExldmVsc09mQWRvcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXNldEFkZGl0aW9uYWxJbmZvKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJc2V0UHJvYmxlbSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXNldEJhY2tncm91bmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJc2V0R29hbHMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJc2V0QXBwbGljYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXNldExldmVsc09mQWRvcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlzZXRBZGRpdGlvbmFsSW5mbyhBRERJVElPTkFMX0lORk9fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQlzZXRQcm9ibGVtKFBST0JMRU1fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQlzZXRCYWNrZ3JvdW5kKEJBQ0tHUk9VTkRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJc2V0R29hbHMoR09BTFNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJc2V0QXBwbGljYXRpb24oQVBQTElDQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXNldExldmVsc09mQWRvcHRpb24oTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlyZXR1cm4gQURESVRJT05BTF9JTkZPX0VERUZBVUxUID09IG51bGwgPyBhZGRpdGlvbmFsSW5mbyAhPSBudWxsCi0JCQkJCTogIUFERElUSU9OQUxfSU5GT19FREVGQVVMVC5lcXVhbHMoYWRkaXRpb25hbEluZm8pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQlyZXR1cm4gUFJPQkxFTV9FREVGQVVMVCA9PSBudWxsID8gcHJvYmxlbSAhPSBudWxsCi0JCQkJCTogIVBST0JMRU1fRURFRkFVTFQuZXF1YWxzKHByb2JsZW0pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQlyZXR1cm4gQkFDS0dST1VORF9FREVGQVVMVCA9PSBudWxsID8gYmFja2dyb3VuZCAhPSBudWxsCi0JCQkJCTogIUJBQ0tHUk9VTkRfRURFRkFVTFQuZXF1YWxzKGJhY2tncm91bmQpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJcmV0dXJuIEdPQUxTX0VERUZBVUxUID09IG51bGwgPyBnb2FscyAhPSBudWxsIDogIUdPQUxTX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoZ29hbHMpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJcmV0dXJuIEFQUExJQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBhcHBsaWNhdGlvbiAhPSBudWxsCi0JCQkJCTogIUFQUExJQ0FUSU9OX0VERUZBVUxULmVxdWFscyhhcHBsaWNhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJcmV0dXJuIExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWxzT2ZBZG9wdGlvbiAhPSBudWxsCi0JCQkJCTogIUxFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVC5lcXVhbHMobGV2ZWxzT2ZBZG9wdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWRkaXRpb25hbEluZm86ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWRkaXRpb25hbEluZm8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2JsZW06ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJvYmxlbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFja2dyb3VuZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChiYWNrZ3JvdW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnb2FsczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChnb2Fscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXBwbGljYXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXBwbGljYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsc09mQWRvcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGV2ZWxzT2ZBZG9wdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NGY0NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldFN1YlByYWN0aWNlcyA8ZW0+U3ViIFByYWN0aWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRDb250ZW50UmVmZXJlbmNlcyA8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldEFjdGl2aXR5UmVmZXJlbmNlcyA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFByYWN0aWNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YlByYWN0aWNlcygpIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YlByYWN0aWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFByYWN0aWNlPiBzdWJQcmFjdGljZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZW50UmVmZXJlbmNlcygpIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGVudFJlZmVyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDb250ZW50RWxlbWVudD4gY29udGVudFJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxBY3Rpdml0eT4gYWN0aXZpdHlSZWZlcmVuY2VzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQcmFjdGljZT4gZ2V0U3ViUHJhY3RpY2VzKCkgewotCQlpZiAoc3ViUHJhY3RpY2VzID09IG51bGwpIHsKLQkJCXN1YlByYWN0aWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8UHJhY3RpY2U+KAotCQkJCQlQcmFjdGljZS5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YlByYWN0aWNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudFJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb250ZW50UmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQljb250ZW50UmVmZXJlbmNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudEVsZW1lbnQ+KAotCQkJCQlDb250ZW50RWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJfQotCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8QWN0aXZpdHk+IGdldEFjdGl2aXR5UmVmZXJlbmNlcygpIHsKLQkJaWYgKGFjdGl2aXR5UmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVJlZmVyZW5jZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEFjdGl2aXR5PigKLQkJCQkJQWN0aXZpdHkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U3ViUHJhY3RpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gZ2V0U3ViUHJhY3RpY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGdldENvbnRlbnRSZWZlcmVuY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUzoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5jbGVhcigpOwotCQkJZ2V0U3ViUHJhY3RpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQcmFjdGljZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVM6Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM6Ci0JCQlnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzoKLQkJCWdldENvbnRlbnRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOgotCQkJcmV0dXJuIHN1YlByYWN0aWNlcyAhPSBudWxsICYmICFzdWJQcmFjdGljZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzoKLQkJCXJldHVybiBjb250ZW50UmVmZXJlbmNlcyAhPSBudWxsICYmICFjb250ZW50UmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUzoKLQkJCXJldHVybiBhY3Rpdml0eVJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhYWN0aXZpdHlSZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJhY3RpY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNDBlMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsI2dldF9wcm9jZXNzQ29tcG9uZW50IDxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0X3Byb2Nlc3NDb21wb25lbnQoKSA8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldF9wcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudCBfcHJvY2Vzc0NvbXBvbmVudDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRfcHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJaWYgKF9wcm9jZXNzQ29tcG9uZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIF9wcm9jZXNzQ29tcG9uZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkX3Byb2Nlc3NDb21wb25lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBfcHJvY2Vzc0NvbXBvbmVudDsKLQkJCV9wcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIGVSZXNvbHZlUHJveHkob2xkX3Byb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKF9wcm9jZXNzQ29tcG9uZW50ICE9IG9sZF9wcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQl0aGlzLAotCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQsCi0JCQkJCQkJb2xkX3Byb2Nlc3NDb21wb25lbnQsIF9wcm9jZXNzQ29tcG9uZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9wcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGJhc2ljR2V0X3Byb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBfcHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRfcHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG5ld19wcm9jZXNzQ29tcG9uZW50KSB7Ci0JCVByb2Nlc3NDb21wb25lbnQgb2xkX3Byb2Nlc3NDb21wb25lbnQgPSBfcHJvY2Vzc0NvbXBvbmVudDsKLQkJX3Byb2Nlc3NDb21wb25lbnQgPSBuZXdfcHJvY2Vzc0NvbXBvbmVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJb2xkX3Byb2Nlc3NDb21wb25lbnQsIF9wcm9jZXNzQ29tcG9uZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0X3Byb2Nlc3NDb21wb25lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldF9wcm9jZXNzQ29tcG9uZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJc2V0X3Byb2Nlc3NDb21wb25lbnQoKFByb2Nlc3NDb21wb25lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVDoKLQkJCXNldF9wcm9jZXNzQ29tcG9uZW50KChQcm9jZXNzQ29tcG9uZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJcmV0dXJuIF9wcm9jZXNzQ29tcG9uZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjMzFjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRJbnRlcmZhY2VzIDxlbT5JbnRlcmZhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbXBsIGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2VJbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0NvbXBvbmVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGNoYW5nZURhdGUgPSBDSEFOR0VfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodFN0YXRlbWVudDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyZmFjZXMoKSA8ZW0+SW50ZXJmYWNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3MoKSA8ZW0+UHJvY2VzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgbmV3QXV0aG9ycykgewotCQlTdHJpbmcgb2xkQXV0aG9ycyA9IGF1dGhvcnM7Ci0JCWF1dGhvcnMgPSBuZXdBdXRob3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTLCBvbGRBdXRob3JzLCBhdXRob3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0Q2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIGNoYW5nZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGF0ZShEYXRlIG5ld0NoYW5nZURhdGUpIHsKLQkJRGF0ZSBvbGRDaGFuZ2VEYXRlID0gY2hhbmdlRGF0ZTsKLQkJY2hhbmdlRGF0ZSA9IG5ld0NoYW5nZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFLCBvbGRDaGFuZ2VEYXRlLAotCQkJCQljaGFuZ2VEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyBuZXdDaGFuZ2VEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQ2hhbmdlRGVzY3JpcHRpb24gPSBjaGFuZ2VEZXNjcmlwdGlvbjsKLQkJY2hhbmdlRGVzY3JpcHRpb24gPSBuZXdDaGFuZ2VEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRDaGFuZ2VEZXNjcmlwdGlvbiwgY2hhbmdlRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlpZiAoY29weXJpZ2h0U3RhdGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIGNvcHlyaWdodFN0YXRlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENvcHlyaWdodFN0YXRlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGNvcHlyaWdodFN0YXRlbWVudDsKLQkJCWNvcHlyaWdodFN0YXRlbWVudCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGVSZXNvbHZlUHJveHkob2xkQ29weXJpZ2h0U3RhdGVtZW50KTsKLQkJCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gb2xkQ29weXJpZ2h0U3RhdGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJCW9sZENvcHlyaWdodFN0YXRlbWVudCwgY29weXJpZ2h0U3RhdGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGJhc2ljR2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodFN0YXRlbWVudChTdXBwb3J0aW5nTWF0ZXJpYWwgbmV3Q29weXJpZ2h0U3RhdGVtZW50KSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQgPSBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCWNvcHlyaWdodFN0YXRlbWVudCA9IG5ld0NvcHlyaWdodFN0YXRlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPiBnZXRJbnRlcmZhY2VzKCkgewotCQlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPigKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyk7Ci0JCX0KLQkJcmV0dXJuIGludGVyZmFjZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZiAocHJvY2VzcyAhPSBudWxsICYmICgoRU9iamVjdCkgcHJvY2VzcykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzOwotCQkJcHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGVSZXNvbHZlUHJveHkob2xkUHJvY2Vzcyk7Ci0JCQlpZiAocHJvY2VzcyAhPSBvbGRQcm9jZXNzKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Byb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcm9jZXNzLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQcm9jZXNzLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Byb2Nlc3MKLQkJCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG9sZFByb2Nlc3MsCi0JCQkJCQkJcHJvY2VzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgYmFzaWNHZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9jZXNzKAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG9sZFByb2Nlc3MgPSBwcm9jZXNzOwotCQlwcm9jZXNzID0gbmV3UHJvY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQkJb2xkUHJvY2VzcywgbmV3UHJvY2Vzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChuZXdQcm9jZXNzICE9IHByb2Nlc3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByb2Nlc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Byb2Nlc3MpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJvY2VzcyhuZXdQcm9jZXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbmV3UHJvY2VzcywKLQkJCQkJbmV3UHJvY2VzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXJldHVybiBiYXNpY1NldFByb2Nlc3MobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVM6Ci0JCQlyZXR1cm4gZ2V0SW50ZXJmYWNlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJvY2VzcygpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCWdldEludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJZ2V0SW50ZXJmYWNlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJc2V0QXV0aG9ycyhBVVRIT1JTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXNldENoYW5nZURhdGUoQ0hBTkdFX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTOgotCQkJZ2V0SW50ZXJmYWNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCXJldHVybiBBVVRIT1JTX0VERUZBVUxUID09IG51bGwgPyBhdXRob3JzICE9IG51bGwKLQkJCQkJOiAhQVVUSE9SU19FREVGQVVMVC5lcXVhbHMoYXV0aG9ycyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbAotCQkJCQk6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVM6Ci0JCQlyZXR1cm4gaW50ZXJmYWNlcyAhPSBudWxsICYmICFpbnRlcmZhY2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJcmV0dXJuIHByb2Nlc3MgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IE1ldGhvZFVuaXQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBNZXRob2RVbml0LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhvcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzlhYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkgPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRhc2tEZXNjcmlwdG9yPiBpbnRlcmZhY2VTcGVjaWZpY2F0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyZmFjZUlPKCkgPGVtPkludGVyZmFjZSBJTzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2VJTygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gaW50ZXJmYWNlSU87Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRhc2tEZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpIHsKLQkJaWYgKGludGVyZmFjZVNwZWNpZmljYXRpb25zID09IG51bGwpIHsKLQkJCWludGVyZmFjZVNwZWNpZmljYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxUYXNrRGVzY3JpcHRvcj4oCi0JCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzLAotCQkJCQl0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VJTygpIHsKLQkJaWYgKGludGVyZmFjZUlPID09IG51bGwpIHsKLQkJCWludGVyZmFjZUlPID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCQl9Ci0JCXJldHVybiBpbnRlcmZhY2VJTzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpKQotCQkJCQkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbnRlcmZhY2VJTygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJcmV0dXJuIGdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCXJldHVybiBnZXRJbnRlcmZhY2VJTygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGFza0Rlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCWdldEludGVyZmFjZUlPKCkuY2xlYXIoKTsKLQkJCWdldEludGVyZmFjZUlPKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCXJldHVybiBpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyAhPSBudWxsCi0JCQkJCSYmICFpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCXJldHVybiBpbnRlcmZhY2VJTyAhPSBudWxsICYmICFpbnRlcmZhY2VJTy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlYWFiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjb3BlID0gU0NPUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfTk9URVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlTm90ZXMoKSA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNhZ2VOb3RlcyA9IFVTQUdFX05PVEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5ld1Njb3BlKSB7Ci0JCVN0cmluZyBvbGRTY29wZSA9IHNjb3BlOwotCQlzY29wZSA9IG5ld1Njb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCBvbGRTY29wZSwgc2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiB1c2FnZU5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIG5ld1VzYWdlTm90ZXMpIHsKLQkJU3RyaW5nIG9sZFVzYWdlTm90ZXMgPSB1c2FnZU5vdGVzOwotCQl1c2FnZU5vdGVzID0gbmV3VXNhZ2VOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywgb2xkVXNhZ2VOb3RlcywKLQkJCQkJdXNhZ2VOb3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJcmV0dXJuIGdldFNjb3BlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCXJldHVybiBnZXRVc2FnZU5vdGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJc2V0U2NvcGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlzZXRVc2FnZU5vdGVzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCXNldFNjb3BlKFNDT1BFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJc2V0VXNhZ2VOb3RlcyhVU0FHRV9OT1RFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCXJldHVybiBTQ09QRV9FREVGQVVMVCA9PSBudWxsID8gc2NvcGUgIT0gbnVsbCA6ICFTQ09QRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHNjb3BlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJcmV0dXJuIFVTQUdFX05PVEVTX0VERUZBVUxUID09IG51bGwgPyB1c2FnZU5vdGVzICE9IG51bGwKLQkJCQkJOiAhVVNBR0VfTk9URVNfRURFRkFVTFQuZXF1YWxzKHVzYWdlTm90ZXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjb3BlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNjb3BlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1c2FnZU5vdGVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVzYWdlTm90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzJkOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2Nlc3NFbGVtZW50SW1wbCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0VsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRUxFTUVOVDsKLQl9Ci0KLX0gLy9Qcm9jZXNzRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRmFtaWx5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZDA5NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBGYW1pbHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbCNnZXREZWxpdmVyeVByb2Nlc3NlcyA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlseUltcGwgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NGYW1pbHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGVsaXZlcnlQcm9jZXNzPiBkZWxpdmVyeVByb2Nlc3NlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRmFtaWx5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0ZBTUlMWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxEZWxpdmVyeVByb2Nlc3M+IGdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkgewotCQlpZiAoZGVsaXZlcnlQcm9jZXNzZXMgPT0gbnVsbCkgewotCQkJZGVsaXZlcnlQcm9jZXNzZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4oCi0JCQkJCURlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTKTsKLQkJfQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUzoKLQkJCXJldHVybiBnZXREZWxpdmVyeVByb2Nlc3NlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTOgotCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZWxpdmVyeVByb2Nlc3M+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUzoKLQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzZXMgIT0gbnVsbCAmJiAhZGVsaXZlcnlQcm9jZXNzZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzRmFtaWx5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNTkxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRJbmNsdWRlc1BhdHRlcm5zIDxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlc1BhdHRlcm5zKCkgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVzUGF0dGVybnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gaW5jbHVkZXNQYXR0ZXJuczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRDb250ZXh0KCkgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb250ZXh0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRDb250ZXh0KCkgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gdmFsaWRDb250ZXh0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IGdldEluY2x1ZGVzUGF0dGVybnMoKSB7Ci0JCWlmIChpbmNsdWRlc1BhdHRlcm5zID09IG51bGwpIHsKLQkJCWluY2x1ZGVzUGF0dGVybnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPigKLQkJCQkJQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMpOwotCQl9Ci0JCXJldHVybiBpbmNsdWRlc1BhdHRlcm5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb250ZXh0KCkgewotCQlpZiAoZGVmYXVsdENvbnRleHQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGRlZmF1bHRDb250ZXh0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVmYXVsdENvbnRleHQgPSAoSW50ZXJuYWxFT2JqZWN0KSBkZWZhdWx0Q29udGV4dDsKLQkJCWRlZmF1bHRDb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVSZXNvbHZlUHJveHkob2xkRGVmYXVsdENvbnRleHQpOwotCQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG9sZERlZmF1bHRDb250ZXh0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCwKLQkJCQkJCQlvbGREZWZhdWx0Q29udGV4dCwgZGVmYXVsdENvbnRleHQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gYmFzaWNHZXREZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250ZXh0KE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3RGVmYXVsdENvbnRleHQpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBvbGREZWZhdWx0Q29udGV4dCA9IGRlZmF1bHRDb250ZXh0OwotCQlkZWZhdWx0Q29udGV4dCA9IG5ld0RlZmF1bHRDb250ZXh0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCwgb2xkRGVmYXVsdENvbnRleHQsCi0JCQkJCWRlZmF1bHRDb250ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gZ2V0VmFsaWRDb250ZXh0KCkgewotCQlpZiAodmFsaWRDb250ZXh0ID09IG51bGwpIHsKLQkJCXZhbGlkQ29udGV4dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oCi0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzoKLQkJCXJldHVybiBnZXRJbmNsdWRlc1BhdHRlcm5zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCXJldHVybiBiYXNpY0dldERlZmF1bHRDb250ZXh0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJcmV0dXJuIGdldFZhbGlkQ29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzoKLQkJCWdldEluY2x1ZGVzUGF0dGVybnMoKS5jbGVhcigpOwotCQkJZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENhcGFiaWxpdHlQYXR0ZXJuPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJc2V0RGVmYXVsdENvbnRleHQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQlnZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJZ2V0VmFsaWRDb250ZXh0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kQ29uZmlndXJhdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzoKLQkJCWdldEluY2x1ZGVzUGF0dGVybnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJc2V0RGVmYXVsdENvbnRleHQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzoKLQkJCXJldHVybiBpbmNsdWRlc1BhdHRlcm5zICE9IG51bGwgJiYgIWluY2x1ZGVzUGF0dGVybnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJcmV0dXJuIHZhbGlkQ29udGV4dCAhPSBudWxsICYmICF2YWxpZENvbnRleHQuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTIwNzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NFbGVtZW50cygpIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NFbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFByb2Nlc3NFbGVtZW50PiBwcm9jZXNzRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtcygpIDxlbT5EaWFncmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpYWdyYW0+IGRpYWdyYW1zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UHJvY2Vzc0VsZW1lbnQ+IGdldFByb2Nlc3NFbGVtZW50cygpIHsKLQkJaWYgKHByb2Nlc3NFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFByb2Nlc3NFbGVtZW50PigKLQkJCQkJUHJvY2Vzc0VsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERpYWdyYW0+IGdldERpYWdyYW1zKCkgewotCQlpZiAoZGlhZ3JhbXMgPT0gbnVsbCkgewotCQkJZGlhZ3JhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPERpYWdyYW0+KAotCQkJCQlEaWFncmFtLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0UHJvY2Vzc0VsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0RGlhZ3JhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJcmV0dXJuIGdldERpYWdyYW1zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCWdldFByb2Nlc3NFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlnZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQcm9jZXNzRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlnZXREaWFncmFtcygpLmNsZWFyKCk7Ci0JCQlnZXREaWFncmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlhZ3JhbT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlnZXRQcm9jZXNzRWxlbWVudHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCWdldERpYWdyYW1zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCXJldHVybiBwcm9jZXNzRWxlbWVudHMgIT0gbnVsbCAmJiAhcHJvY2Vzc0VsZW1lbnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlyZXR1cm4gZGlhZ3JhbXMgIT0gbnVsbCAmJiAhZGlhZ3JhbXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyZmE0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwjZ2V0QmFzZWRPblByb2Nlc3NlcyA8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkgPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8b3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzPiBiYXNlZE9uUHJvY2Vzc2VzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcz4gZ2V0QmFzZWRPblByb2Nlc3NlcygpIHsKLQkJaWYgKGJhc2VkT25Qcm9jZXNzZXMgPT0gbnVsbCkgewotCQkJYmFzZWRPblByb2Nlc3NlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8b3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzPigKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VkT25Qcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTOgotCQkJcmV0dXJuIGdldEJhc2VkT25Qcm9jZXNzZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTOgotCQkJZ2V0QmFzZWRPblByb2Nlc3NlcygpLmNsZWFyKCk7Ci0JCQlnZXRCYXNlZE9uUHJvY2Vzc2VzKCkKLQkJCQkJLmFkZEFsbCgKLQkJCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCWdldEJhc2VkT25Qcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTOgotCQkJcmV0dXJuIGJhc2VkT25Qcm9jZXNzZXMgIT0gbnVsbCAmJiAhYmFzZWRPblByb2Nlc3Nlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGYzZTAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0S2V5IDxlbT5LZXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUHJvcGVydHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5ID0gS0VZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIG5ld0tleSkgewotCQlTdHJpbmcgb2xkS2V5ID0ga2V5OwotCQlrZXkgPSBuZXdLZXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWSwgb2xkS2V5LCBrZXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJCXJldHVybiBnZXRLZXkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQkJc2V0S2V5KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCXNldFZhbHVlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQkJc2V0S2V5KEtFWV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQkJcmV0dXJuIEtFWV9FREVGQVVMVCA9PSBudWxsID8ga2V5ICE9IG51bGwgOiAhS0VZX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoa2V5KTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChrZXk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2V5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb3BlcnR5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYmQxZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlSW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJlZmVyZW5jZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkgPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA9IElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkKCkgPGVtPlJlZmVyZW5jZWQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtRWxlbWVudCByZWZlcmVuY2VkOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVGRVJFTkNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oCi0JCQlCb29sZWFuIG5ld0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKSB7Ci0JCUJvb2xlYW4gb2xkSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPSBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbjsKLQkJaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPSBuZXdJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04sCi0JCQkJCW9sZElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uLCBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRWxlbWVudCBnZXRSZWZlcmVuY2VkKCkgewotCQlpZiAocmVmZXJlbmNlZCAhPSBudWxsICYmICgoRU9iamVjdCkgcmVmZXJlbmNlZCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJlZmVyZW5jZWQgPSAoSW50ZXJuYWxFT2JqZWN0KSByZWZlcmVuY2VkOwotCQkJcmVmZXJlbmNlZCA9IChEaWFncmFtRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRSZWZlcmVuY2VkKTsKLQkJCWlmIChyZWZlcmVuY2VkICE9IG9sZFJlZmVyZW5jZWQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VELCBvbGRSZWZlcmVuY2VkLAotCQkJCQkJCXJlZmVyZW5jZWQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVsZW1lbnQgYmFzaWNHZXRSZWZlcmVuY2VkKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWZlcmVuY2VkKERpYWdyYW1FbGVtZW50IG5ld1JlZmVyZW5jZWQsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURpYWdyYW1FbGVtZW50IG9sZFJlZmVyZW5jZWQgPSByZWZlcmVuY2VkOwotCQlyZWZlcmVuY2VkID0gbmV3UmVmZXJlbmNlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQsCi0JCQkJCW9sZFJlZmVyZW5jZWQsIG5ld1JlZmVyZW5jZWQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZChEaWFncmFtRWxlbWVudCBuZXdSZWZlcmVuY2VkKSB7Ci0JCWlmIChuZXdSZWZlcmVuY2VkICE9IHJlZmVyZW5jZWQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlZmVyZW5jZWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHJlZmVyZW5jZWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLAotCQkJCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1JlZmVyZW5jZWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1JlZmVyZW5jZWQpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLAotCQkJCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVmZXJlbmNlZChuZXdSZWZlcmVuY2VkLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQsIG5ld1JlZmVyZW5jZWQsCi0JCQkJCW5ld1JlZmVyZW5jZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJaWYgKHJlZmVyZW5jZWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHJlZmVyZW5jZWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLAotCQkJCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0UmVmZXJlbmNlZCgoRGlhZ3JhbUVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCXJldHVybiBiYXNpY1NldFJlZmVyZW5jZWQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXJldHVybiBnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWQoKTsKLQkJCXJldHVybiBiYXNpY0dldFJlZmVyZW5jZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OOgotCQkJc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCXNldFJlZmVyZW5jZWQoKERpYWdyYW1FbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OOgotCQkJc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlzZXRSZWZlcmVuY2VkKChEaWFncmFtRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gIT0gbnVsbAotCQkJCQk6ICFJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOWFkYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJlcG9ydCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVwb3J0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVBPUlQ7Ci0JfQotCi19IC8vUmVwb3J0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzOGM4Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmV1c2FibGVBc3NldEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBSZXVzYWJsZUFzc2V0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXVzYWJsZUFzc2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVVTQUJMRV9BU1NFVDsKLQl9Ci0KLX0gLy9SZXVzYWJsZUFzc2V0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkNTQ0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2FkbWFwSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJvYWRtYXAgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvYWRtYXBJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPQURNQVA7Ci0JfQotCi19IC8vUm9hZG1hcEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjBhOGE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlSb2xlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNraWxscygpIDxlbT5Ta2lsbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJTExTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2tpbGxzID0gU0tJTExTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhc3NpZ25tZW50QXBwcm9hY2hlcyA9IEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTk9OWU1TX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lub255bXMgPSBTWU5PTllNU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTa2lsbHMoKSB7Ci0JCXJldHVybiBza2lsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2tpbGxzKFN0cmluZyBuZXdTa2lsbHMpIHsKLQkJU3RyaW5nIG9sZFNraWxscyA9IHNraWxsczsKLQkJc2tpbGxzID0gbmV3U2tpbGxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUywgb2xkU2tpbGxzLCBza2lsbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzKSB7Ci0JCVN0cmluZyBvbGRBc3NpZ25tZW50QXBwcm9hY2hlcyA9IGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlhc3NpZ25tZW50QXBwcm9hY2hlcyA9IG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUywKLQkJCQkJb2xkQXNzaWdubWVudEFwcHJvYWNoZXMsIGFzc2lnbm1lbnRBcHByb2FjaGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeW5vbnltcygpIHsKLQkJcmV0dXJuIHN5bm9ueW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bm9ueW1zKFN0cmluZyBuZXdTeW5vbnltcykgewotCQlTdHJpbmcgb2xkU3lub255bXMgPSBzeW5vbnltczsKLQkJc3lub255bXMgPSBuZXdTeW5vbnltczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUywgb2xkU3lub255bXMsCi0JCQkJCXN5bm9ueW1zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJcmV0dXJuIGdldFNraWxscygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJcmV0dXJuIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCXJldHVybiBnZXRTeW5vbnltcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlzZXRTa2lsbHMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlzZXRTeW5vbnltcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJc2V0U2tpbGxzKFNLSUxMU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQlzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlzZXRTeW5vbnltcyhTWU5PTllNU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlyZXR1cm4gU0tJTExTX0VERUZBVUxUID09IG51bGwgPyBza2lsbHMgIT0gbnVsbCA6ICFTS0lMTFNfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhza2lsbHMpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJcmV0dXJuIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9PSBudWxsID8gYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gbnVsbAotCQkJCQk6ICFBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGFzc2lnbm1lbnRBcHByb2FjaGVzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJcmV0dXJuIFNZTk9OWU1TX0VERUZBVUxUID09IG51bGwgPyBzeW5vbnltcyAhPSBudWxsCi0JCQkJCTogIVNZTk9OWU1TX0VERUZBVUxULmVxdWFscyhzeW5vbnltcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2tpbGxzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNraWxscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXNzaWdubWVudEFwcHJvYWNoZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5bm9ueW1zOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5bm9ueW1zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQxYzNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZSgpIDxlbT5Sb2xlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZSByb2xlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiByZXNwb25zaWJsZUZvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGdldFJvbGUoKSB7Ci0JCWlmIChyb2xlICE9IG51bGwgJiYgKChFT2JqZWN0KSByb2xlKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUm9sZSA9IChJbnRlcm5hbEVPYmplY3QpIHJvbGU7Ci0JCQlyb2xlID0gKFJvbGUpIGVSZXNvbHZlUHJveHkob2xkUm9sZSk7Ci0JCQlpZiAocm9sZSAhPSBvbGRSb2xlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgb2xkUm9sZSwgcm9sZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGJhc2ljR2V0Um9sZSgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZShSb2xlIG5ld1JvbGUpIHsKLQkJUm9sZSBvbGRSb2xlID0gcm9sZTsKLQkJcm9sZSA9IG5ld1JvbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFLCBvbGRSb2xlLCByb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2RpZmllcygpIHsKLQkJTGlzdCBwZXJmb3JtcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnModGhpcyk7Ci0JCUludGVybmFsRUxpc3QgbW9kaWZpZXMgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0KAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcyk7Ci0JCWlmIChwZXJmb3JtcyAhPSBudWxsICYmIHBlcmZvcm1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHBlcmZvcm1zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpLm5leHQoKTsKLQotCQkJCS8vIGZvciBlYWNoIHRhc2ssIGdldCBvdXRwdXQgd29yayBwcm9kdWN0OwotCQkJCUxpc3Qgb3V0cHV0V1BzID0gdGQuZ2V0T3V0cHV0KCk7Ci0JCQkJaWYgKG91dHB1dFdQcyAhPSBudWxsICYmIG91dHB1dFdQcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvdXRwdXRXUHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0Ci0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAod3BkICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoIW1vZGlmaWVzLmNvbnRhaW5zKHdwZCkpIHsKLQkJCQkJCQkJbW9kaWZpZXMuYWRkKHdwZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldFJlc3BvbnNpYmxlRm9yKCkgewotCQlpZiAocmVzcG9uc2libGVGb3IgPT0gbnVsbCkgewotCQkJcmVzcG9uc2libGVGb3IgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUik7Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRSb2xlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTOgotCQkJcmV0dXJuIGdldE1vZGlmaWVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCXJldHVybiBnZXRSZXNwb25zaWJsZUZvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQlzZXRSb2xlKChSb2xlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTOgotCQkJZ2V0TW9kaWZpZXMoKS5jbGVhcigpOwotCQkJZ2V0TW9kaWZpZXMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCXNldFJvbGUoKFJvbGUpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUzoKLQkJCWdldE1vZGlmaWVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJcmV0dXJuIHJvbGUgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gIWdldE1vZGlmaWVzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZXR1cm4gcmVzcG9uc2libGVGb3IgIT0gbnVsbCAmJiAhcmVzcG9uc2libGVGb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGZhMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJvbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsZmlsbHMoKSA8ZW0+RnVsZmlsbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVsZmlsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGZ1bGZpbGxzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IHJlc3BvbnNpYmxlRm9yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBnZXRGdWxmaWxscygpIHsKLQkJaWYgKGZ1bGZpbGxzID09IG51bGwpIHsKLQkJCWZ1bGZpbGxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KAotCQkJCQlGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFMpOwotCQl9Ci0JCXJldHVybiBmdWxmaWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVzKCkgewotCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHModGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldFJlc3BvbnNpYmxlRm9yKCkgewotCQlpZiAocmVzcG9uc2libGVGb3IgPT0gbnVsbCkgewotCQkJcmVzcG9uc2libGVGb3IgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzcG9uc2libGVGb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZ2V0RnVsZmlsbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX01PRElGSUVTOgotCQkJcmV0dXJuIGdldE1vZGlmaWVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZXR1cm4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlnZXRGdWxmaWxscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEZ1bGZpbGxhYmxlRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX01PRElGSUVTOgotCQkJZ2V0TW9kaWZpZXMoKS5jbGVhcigpOwotCQkJZ2V0TW9kaWZpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX01PRElGSUVTOgotCQkJZ2V0TW9kaWZpZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gIWdldE1vZGlmaWVzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yICE9IG51bGwgJiYgIXJlc3BvbnNpYmxlRm9yLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vUm9sZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQ4MWU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldFJvbGVTZXRzIDxlbT5Sb2xlIFNldHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVTZXRHcm91cGluZyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlU2V0cygpIDxlbT5Sb2xlIFNldHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZVNldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlU2V0PiByb2xlU2V0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0R3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUX0dST1VQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGVTZXQ+IGdldFJvbGVTZXRzKCkgewotCQlpZiAocm9sZVNldHMgPT0gbnVsbCkgewotCQkJcm9sZVNldHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGVTZXQ+KFJvbGVTZXQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVTZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM6Ci0JCQlyZXR1cm4gZ2V0Um9sZVNldHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzoKLQkJCWdldFJvbGVTZXRzKCkuY2xlYXIoKTsKLQkJCWdldFJvbGVTZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlU2V0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM6Ci0JCQlnZXRSb2xlU2V0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJcmV0dXJuIHJvbGVTZXRzICE9IG51bGwgJiYgIXJvbGVTZXRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZVNldEdyb3VwaW5nSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzOWMzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbCNnZXRSb2xlcyA8ZW0+Um9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBSb2xlU2V0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVzKCkgPGVtPlJvbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZT4gcm9sZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZT4gZ2V0Um9sZXMoKSB7Ci0JCWlmIChyb2xlcyA9PSBudWxsKSB7Ci0JCQlyb2xlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZT4oUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVMpOwotCQl9Ci0JCXJldHVybiByb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlyZXR1cm4gZ2V0Um9sZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJZ2V0Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJcmV0dXJuIHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZVNldEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYTQ3NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JbXBsIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNlY3Rpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZWN0aW9uTmFtZSA9IFNFQ1RJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUSU9OX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25EZXNjcmlwdGlvbiA9IFNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJTZWN0aW9ucygpIDxlbT5TdWIgU2VjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzdWJTZWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yKCkgPGVtPlByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gcHJlZGVjZXNzb3I7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nIG5ld1NlY3Rpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRTZWN0aW9uTmFtZSA9IHNlY3Rpb25OYW1lOwotCQlzZWN0aW9uTmFtZSA9IG5ld1NlY3Rpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRSwgb2xkU2VjdGlvbk5hbWUsCi0JCQkJCXNlY3Rpb25OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBzZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdTZWN0aW9uRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZFNlY3Rpb25EZXNjcmlwdGlvbiA9IHNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJc2VjdGlvbkRlc2NyaXB0aW9uID0gbmV3U2VjdGlvbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04sCi0JCQkJCW9sZFNlY3Rpb25EZXNjcmlwdGlvbiwgc2VjdGlvbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8U2VjdGlvbj4gZ2V0U3ViU2VjdGlvbnMoKSB7Ci0JCWlmIChzdWJTZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlzdWJTZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8U2VjdGlvbj4oCi0JCQkJCVNlY3Rpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gc3ViU2VjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb24gZ2V0UHJlZGVjZXNzb3IoKSB7Ci0JCWlmIChwcmVkZWNlc3NvciAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlZGVjZXNzb3IpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVkZWNlc3NvciA9IChJbnRlcm5hbEVPYmplY3QpIHByZWRlY2Vzc29yOwotCQkJcHJlZGVjZXNzb3IgPSAoU2VjdGlvbikgZVJlc29sdmVQcm94eShvbGRQcmVkZWNlc3Nvcik7Ci0JCQlpZiAocHJlZGVjZXNzb3IgIT0gb2xkUHJlZGVjZXNzb3IpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1IsIG9sZFByZWRlY2Vzc29yLAotCQkJCQkJCXByZWRlY2Vzc29yKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGJhc2ljR2V0UHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiBwcmVkZWNlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVkZWNlc3NvcihTZWN0aW9uIG5ld1ByZWRlY2Vzc29yKSB7Ci0JCVNlY3Rpb24gb2xkUHJlZGVjZXNzb3IgPSBwcmVkZWNlc3NvcjsKLQkJcHJlZGVjZXNzb3IgPSBuZXdQcmVkZWNlc3NvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUiwgb2xkUHJlZGVjZXNzb3IsCi0JCQkJCXByZWRlY2Vzc29yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YlNlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJcmV0dXJuIGdldFNlY3Rpb25OYW1lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJcmV0dXJuIGdldFN1YlNlY3Rpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVkZWNlc3NvcigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlZGVjZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJc2V0U2VjdGlvbk5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCXNldFNlY3Rpb25EZXNjcmlwdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlnZXRTdWJTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRTdWJTZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJc2V0UHJlZGVjZXNzb3IoKFNlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQlzZXRTZWN0aW9uTmFtZShTRUNUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCXNldFNlY3Rpb25EZXNjcmlwdGlvbihTRUNUSU9OX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCWdldFN1YlNlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJc2V0UHJlZGVjZXNzb3IoKFNlY3Rpb24pIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJcmV0dXJuIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbk5hbWUgIT0gbnVsbAotCQkJCQk6ICFTRUNUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlY3Rpb25OYW1lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCXJldHVybiBzdWJTZWN0aW9ucyAhPSBudWxsICYmICFzdWJTZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXJldHVybiBwcmVkZWNlc3NvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlY3Rpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlY3Rpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZWN0aW9uRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VjdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOWQ1NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uKCkgPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbigpIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50YXRpb24gPSBQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VNQU5USUNfTU9ERUxfQlJJREdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbihTdHJpbmcgbmV3UHJlc2VudGF0aW9uKSB7Ci0JCVN0cmluZyBvbGRQcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JCXByZXNlbnRhdGlvbiA9IG5ld1ByZXNlbnRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiwKLQkJCQkJb2xkUHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBuZXdHcmFwaEVsZW1lbnQsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50LAotCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBuZXdHcmFwaEVsZW1lbnQpIHsKLQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UICYmIG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQkJR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEdyYXBoRWxlbWVudChuZXdHcmFwaEVsZW1lbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCwKLQkJCQkJbmV3R3JhcGhFbGVtZW50LCBuZXdHcmFwaEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERpYWdyYW0pIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBiYXNpY0dldERpYWdyYW0oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRGlhZ3JhbSkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGlhZ3JhbShEaWFncmFtIG5ld0RpYWdyYW0sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RGlhZ3JhbSwKLQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBuZXdEaWFncmFtKSB7Ci0JCWlmIChuZXdEaWFncmFtICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0gJiYgbmV3RGlhZ3JhbSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdEaWFncmFtKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0RpYWdyYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RpYWdyYW0pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRSwgRGlhZ3JhbS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREaWFncmFtKG5ld0RpYWdyYW0sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwgbmV3RGlhZ3JhbSwKLQkJCQkJbmV3RGlhZ3JhbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldERpYWdyYW0oKERpYWdyYW0pIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCXJldHVybiBiYXNpY1NldERpYWdyYW0obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldERpYWdyYW0oKTsKLQkJCXJldHVybiBiYXNpY0dldERpYWdyYW0oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRHcmFwaEVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCXNldFByZXNlbnRhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlzZXREaWFncmFtKChEaWFncmFtKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJc2V0UHJlc2VudGF0aW9uKFBSRVNFTlRBVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlzZXREaWFncmFtKChEaWFncmFtKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUFJFU0VOVEFUSU9OX0VERUZBVUxULmVxdWFscyhwcmVzZW50YXRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZXNlbnRhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcmVzZW50YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTUwZjVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCWltcGxlbWVudHMgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVJbmZvKCkgPGVtPlR5cGUgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU5GT19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUluZm8oKSA8ZW0+VHlwZSBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlSW5mbyA9IFRZUEVfSU5GT19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlSW5mbygpIHsKLQkJcmV0dXJuIHR5cGVJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVJbmZvKFN0cmluZyBuZXdUeXBlSW5mbykgewotCQlTdHJpbmcgb2xkVHlwZUluZm8gPSB0eXBlSW5mbzsKLQkJdHlwZUluZm8gPSBuZXdUeXBlSW5mbzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPLAotCQkJCQlvbGRUeXBlSW5mbywgdHlwZUluZm8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJcmV0dXJuIGdldFR5cGVJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk86Ci0JCQlzZXRUeXBlSW5mbygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCXNldFR5cGVJbmZvKFRZUEVfSU5GT19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJcmV0dXJuIFRZUEVfSU5GT19FREVGQVVMVCA9PSBudWxsID8gdHlwZUluZm8gIT0gbnVsbAotCQkJCQk6ICFUWVBFX0lORk9fRURFRkFVTFQuZXF1YWxzKHR5cGVJbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlSW5mbzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N0ZXBJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlODZkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGVwSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwSW1wbCBleHRlbmRzIFNlY3Rpb25JbXBsIGltcGxlbWVudHMgU3RlcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdGVwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVEVQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UHJlY29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1ByZWNvbmRpdGlvbgotCQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwKLQkJCQkJCQlwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZWNvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UG9zdGNvbmRpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJCW1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sCi0JCQkJCQkJcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLX0gLy9TdGVwSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzFkY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1VQUE9SVElOR19NQVRFUklBTDsKLQl9Ci0KLX0gLy9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1MmZjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwjZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVRhc2tEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVElWRVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UsIG9sZFB1cnBvc2UsIHB1cnBvc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIGFsdGVybmF0aXZlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIG5ld0FsdGVybmF0aXZlcykgewotCQlTdHJpbmcgb2xkQWx0ZXJuYXRpdmVzID0gYWx0ZXJuYXRpdmVzOwotCQlhbHRlcm5hdGl2ZXMgPSBuZXdBbHRlcm5hdGl2ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLCBvbGRBbHRlcm5hdGl2ZXMsCi0JCQkJCWFsdGVybmF0aXZlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gZ2V0UHVycG9zZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJcmV0dXJuIGdldEFsdGVybmF0aXZlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJc2V0UHVycG9zZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlzZXRBbHRlcm5hdGl2ZXMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJc2V0QWx0ZXJuYXRpdmVzKEFMVEVSTkFUSVZFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIFBVUlBPU0VfRURFRkFVTFQgPT0gbnVsbCA/IHB1cnBvc2UgIT0gbnVsbAotCQkJCQk6ICFQVVJQT1NFX0VERUZBVUxULmVxdWFscyhwdXJwb3NlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsCi0JCQkJCTogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwdXJwb3NlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsdGVybmF0aXZlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYXNrRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZWQ3YWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRGVmYXVsdFZhbHVlTWFuYWdlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0U2VsZWN0ZWRTdGVwcyA8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYXNrRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDQxOTQxNDY2NDI3MzkxMDg2M0w7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID0gQm9vbGVhbi5UUlVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrKCkgPGVtPlRhc2s8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrIHRhc2s7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZURlc2NyaXB0b3I+IGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaXN0ZWRCeSgpIDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3Npc3RlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZURlc2NyaXB0b3I+IGFzc2lzdGVkQnk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElucHV0KCkgPGVtPkV4dGVybmFsIElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGV4dGVybmFsSW5wdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5kYXRvcnlJbnB1dCgpIDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IG1hbmRhdG9yeUlucHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWxJbnB1dCgpIDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBvcHRpb25hbElucHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0KCkgPGVtPk91dHB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRwdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IG91dHB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlRGVzY3JpcHRvcj4gcGVyZm9ybWVkUHJpbWFyaWx5Qnk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWxlY3RlZFN0ZXBzKCkgPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlbGVjdGVkU3RlcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzZWxlY3RlZFN0ZXBzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlCb29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLAotCQkJCQlvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGdldFRhc2soKSB7Ci0JCWlmICh0YXNrICE9IG51bGwgJiYgKChFT2JqZWN0KSB0YXNrKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVGFzayA9IChJbnRlcm5hbEVPYmplY3QpIHRhc2s7Ci0JCQl0YXNrID0gKFRhc2spIGVSZXNvbHZlUHJveHkob2xkVGFzayk7Ci0JCQlpZiAodGFzayAhPSBvbGRUYXNrKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSywgb2xkVGFzaywgdGFzaykpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGJhc2ljR2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFzayhUYXNrIG5ld1Rhc2spIHsKLQkJVGFzayBvbGRUYXNrID0gdGFzazsKLQkJdGFzayA9IG5ld1Rhc2s7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZURlc2NyaXB0b3I+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlpZiAoYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPT0gbnVsbCkgewotCQkJYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGVEZXNjcmlwdG9yPigKLQkJCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZURlc2NyaXB0b3I+IGdldEFzc2lzdGVkQnkoKSB7Ci0JCWlmIChhc3Npc3RlZEJ5ID09IG51bGwpIHsKLQkJCWFzc2lzdGVkQnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGVEZXNjcmlwdG9yPigKLQkJCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lzdGVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRFeHRlcm5hbElucHV0KCkgewotCQlpZiAoZXh0ZXJuYWxJbnB1dCA9PSBudWxsKSB7Ci0JCQlleHRlcm5hbElucHV0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVybmFsSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRNYW5kYXRvcnlJbnB1dCgpIHsKLQkJaWYgKG1hbmRhdG9yeUlucHV0ID09IG51bGwpIHsKLQkJCW1hbmRhdG9yeUlucHV0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBtYW5kYXRvcnlJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCWlmIChvcHRpb25hbElucHV0ID09IG51bGwpIHsKLQkJCW9wdGlvbmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gb3B0aW9uYWxJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE91dHB1dCgpIHsKLQkJaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0JCQlvdXRwdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSB7Ci0JCWlmIChwZXJmb3JtZWRQcmltYXJpbHlCeSA9PSBudWxsKSB7Ci0JCQlwZXJmb3JtZWRQcmltYXJpbHlCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkpOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTZWN0aW9uPiBnZXRTZWxlY3RlZFN0ZXBzKCkgewotCQlpZiAoc2VsZWN0ZWRTdGVwcyA9PSBudWxsKSB7Ci0JCQlzZWxlY3RlZFN0ZXBzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxTZWN0aW9uPihTZWN0aW9uLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZFN0ZXBzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFRhc2soKTsKLQkJCXJldHVybiBiYXNpY0dldFRhc2soKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCXJldHVybiBnZXRBc3Npc3RlZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJcmV0dXJuIGdldEV4dGVybmFsSW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJcmV0dXJuIGdldE1hbmRhdG9yeUlucHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJcmV0dXJuIGdldE91dHB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJcmV0dXJuIGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTOgotCQkJcmV0dXJuIGdldFNlbGVjdGVkU3RlcHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCXNldFRhc2soKFRhc2spIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZURlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJZ2V0QXNzaXN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZURlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPdXRwdXQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQlnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmNsZWFyKCk7Ci0JCQlnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGVEZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCWdldFNlbGVjdGVkU3RlcHMoKS5jbGVhcigpOwotCQkJZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJc2V0VGFzaygoVGFzaykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJZ2V0QXNzaXN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCWdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFM6Ci0JCQlnZXRTZWxlY3RlZFN0ZXBzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlICE9IG51bGwKLQkJCQkJOiAhSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJcmV0dXJuIHRhc2sgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSAhPSBudWxsCi0JCQkJCSYmICFhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJcmV0dXJuIGFzc2lzdGVkQnkgIT0gbnVsbCAmJiAhYXNzaXN0ZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJcmV0dXJuIGV4dGVybmFsSW5wdXQgIT0gbnVsbCAmJiAhZXh0ZXJuYWxJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCXJldHVybiBtYW5kYXRvcnlJbnB1dCAhPSBudWxsICYmICFtYW5kYXRvcnlJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJcmV0dXJuIG9wdGlvbmFsSW5wdXQgIT0gbnVsbCAmJiAhb3B0aW9uYWxJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCXJldHVybiBvdXRwdXQgIT0gbnVsbCAmJiAhb3V0cHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCXJldHVybiBwZXJmb3JtZWRQcmltYXJpbHlCeSAhPSBudWxsCi0JCQkJCSYmICFwZXJmb3JtZWRQcmltYXJpbHlCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTOgotCQkJcmV0dXJuIHNlbGVjdGVkU3RlcHMgIT0gbnVsbCAmJiAhc2VsZWN0ZWRTdGVwcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEZXNjcmlwdG9yLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IERlc2NyaXB0b3IuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBCZWdpbiBvZiBjdXN0b20gY29kZSAKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCXN0YXRpYyB7Ci0JCS8vIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEJyZWFrZG93bkVsZW1lbnQuaXNQbGFubmVkCi0JCS8vCi0JCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0U3RhdGljRGVmYXVsdFZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksIEJvb2xlYW4uRkFMU0UpOwotCX0KLX0gLy9UYXNrRGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzI3MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRTdGVwcyA8ZW0+U3RlcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0ltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwb3N0Y29uZGl0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyZm9ybWVkQnkoKSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZT4gcGVyZm9ybWVkQnk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5kYXRvcnlJbnB1dCgpIDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdD4gbWFuZGF0b3J5SW5wdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRwdXQoKSA8ZW0+T3V0cHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dHB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiBvdXRwdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZT4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbElucHV0KCkgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdD4gb3B0aW9uYWxJbnB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2xNZW50b3JzKCkgPGVtPlRvb2wgTWVudG9yczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sTWVudG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRvb2xNZW50b3I+IHRvb2xNZW50b3JzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTSzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCXByZWNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWNvbmRpdGlvbik7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG9sZFByZWNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFByZWNvbmRpdGlvbi5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1ByZWNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQcmVjb25kaXRpb24KLQkJCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBvbGRQcmVjb25kaXRpb24sCi0JCQkJCQkJcHJlY29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLAotCQkJCQlvbGRQcmVjb25kaXRpb24sIG5ld1ByZWNvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24pIHsKLQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBwcmVjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZWNvbmRpdGlvbihuZXdQcmVjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwgbmV3UHJlY29uZGl0aW9uLAotCQkJCQluZXdQcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcG9zdGNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJcG9zdGNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFBvc3Rjb25kaXRpb24pOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gb2xkUG9zdGNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUG9zdGNvbmRpdGlvbgotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCQltc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLAotCQkJCQkJCXBvc3Rjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3Rjb25kaXRpb24obmV3UG9zdGNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGU+IGdldFBlcmZvcm1lZEJ5KCkgewotCQlpZiAocGVyZm9ybWVkQnkgPT0gbnVsbCkgewotCQkJcGVyZm9ybWVkQnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGU+KFJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZKTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlpZiAobWFuZGF0b3J5SW5wdXQgPT0gbnVsbCkgewotCQkJbWFuZGF0b3J5SW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gbWFuZGF0b3J5SW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldE91dHB1dCgpIHsKLQkJaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0JCQlvdXRwdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PihXb3JrUHJvZHVjdC5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQpOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZT4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZT4oCi0JCQkJCVJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCX0KLQkJcmV0dXJuIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0PiBnZXRPcHRpb25hbElucHV0KCkgewotCQlpZiAob3B0aW9uYWxJbnB1dCA9PSBudWxsKSB7Ci0JCQlvcHRpb25hbElucHV0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdD4oCi0JCQkJCVdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gb3B0aW9uYWxJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0ZXBzKCkgewotCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxUb29sTWVudG9yPiBnZXRUb29sTWVudG9ycygpIHsKLQkJaWYgKHRvb2xNZW50b3JzID09IG51bGwpIHsKLQkJCXRvb2xNZW50b3JzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUb29sTWVudG9yPigKLQkJCQkJVG9vbE1lbnRvci5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlMpOwotCQl9Ci0JCXJldHVybiB0b29sTWVudG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJaWYgKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9PSBudWxsKSB7Ci0JCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4oCi0JCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcmVjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlY29uZGl0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc3Rjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBnZXRQZXJmb3JtZWRCeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJcmV0dXJuIGdldE1hbmRhdG9yeUlucHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19TVEVQUzoKLQkJCXJldHVybiBnZXRTdGVwcygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIGdldFRvb2xNZW50b3JzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQlnZXRQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQlnZXRQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJZ2V0T3V0cHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fU1RFUFM6Ci0JCQlnZXRTdGVwcygpLmNsZWFyKCk7Ci0JCQlnZXRTdGVwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RlcD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCWdldFRvb2xNZW50b3JzKCkKLQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVG9vbE1lbnRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQlnZXRQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19TVEVQUzoKLQkJCWdldFN0ZXBzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIHByZWNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBwb3N0Y29uZGl0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gcGVyZm9ybWVkQnkgIT0gbnVsbCAmJiAhcGVyZm9ybWVkQnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0ICE9IG51bGwgJiYgIW1hbmRhdG9yeUlucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCXJldHVybiBvdXRwdXQgIT0gbnVsbCAmJiAhb3V0cHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgIT0gbnVsbAotCQkJCQkmJiAhYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gb3B0aW9uYWxJbnB1dCAhPSBudWxsICYmICFvcHRpb25hbElucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1NURVBTOgotCQkJcmV0dXJuICFnZXRTdGVwcygpLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUzoKLQkJCXJldHVybiB0b29sTWVudG9ycyAhPSBudWxsICYmICF0b29sTWVudG9ycy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyAhPSBudWxsCi0JCQkJCSYmICFlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLX0gLy9UYXNrSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlYW1Qcm9maWxlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlYW1Qcm9maWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzI0YjY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlYW0gUHJvZmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRUZWFtUm9sZXMgPGVtPlRlYW0gUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUZWFtUHJvZmlsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZWFtUm9sZXMoKSA8ZW0+VGVhbSBSb2xlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZWFtUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlRGVzY3JpcHRvcj4gdGVhbVJvbGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwZXJUZWFtKCkgPGVtPlN1cGVyIFRlYW08L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cGVyVGVhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRlYW1Qcm9maWxlIHN1cGVyVGVhbTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YlRlYW0oKSA8ZW0+U3ViIFRlYW08L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViVGVhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRlYW1Qcm9maWxlPiBzdWJUZWFtOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlYW1Qcm9maWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZURlc2NyaXB0b3I+IGdldFRlYW1Sb2xlcygpIHsKLQkJaWYgKHRlYW1Sb2xlcyA9PSBudWxsKSB7Ci0JCQl0ZWFtUm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGVEZXNjcmlwdG9yPigKLQkJCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gdGVhbVJvbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBnZXRTdXBlclRlYW0oKSB7Ci0JCWlmIChzdXBlclRlYW0gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHN1cGVyVGVhbSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN1cGVyVGVhbSA9IChJbnRlcm5hbEVPYmplY3QpIHN1cGVyVGVhbTsKLQkJCXN1cGVyVGVhbSA9IChUZWFtUHJvZmlsZSkgZVJlc29sdmVQcm94eShvbGRTdXBlclRlYW0pOwotCQkJaWYgKHN1cGVyVGVhbSAhPSBvbGRTdXBlclRlYW0pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNLCBvbGRTdXBlclRlYW0sCi0JCQkJCQkJc3VwZXJUZWFtKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyVGVhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGUgYmFzaWNHZXRTdXBlclRlYW0oKSB7Ci0JCXJldHVybiBzdXBlclRlYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3VwZXJUZWFtKFRlYW1Qcm9maWxlIG5ld1N1cGVyVGVhbSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVGVhbVByb2ZpbGUgb2xkU3VwZXJUZWFtID0gc3VwZXJUZWFtOwotCQlzdXBlclRlYW0gPSBuZXdTdXBlclRlYW07Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNLAotCQkJCQlvbGRTdXBlclRlYW0sIG5ld1N1cGVyVGVhbSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUgbmV3U3VwZXJUZWFtKSB7Ci0JCWlmIChuZXdTdXBlclRlYW0gIT0gc3VwZXJUZWFtKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzdXBlclRlYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHN1cGVyVGVhbSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSwgVGVhbVByb2ZpbGUuY2xhc3MsCi0JCQkJCQltc2dzKTsKLQkJCWlmIChuZXdTdXBlclRlYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1N1cGVyVGVhbSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSwgVGVhbVByb2ZpbGUuY2xhc3MsCi0JCQkJCQltc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN1cGVyVGVhbShuZXdTdXBlclRlYW0sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSwgbmV3U3VwZXJUZWFtLAotCQkJCQluZXdTdXBlclRlYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxUZWFtUHJvZmlsZT4gZ2V0U3ViVGVhbSgpIHsKLQkJaWYgKHN1YlRlYW0gPT0gbnVsbCkgewotCQkJc3ViVGVhbSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDxUZWFtUHJvZmlsZT4oCi0JCQkJCVRlYW1Qcm9maWxlLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0sCi0JCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQkJfQotCQlyZXR1cm4gc3ViVGVhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0U3VwZXJUZWFtKChUZWFtUHJvZmlsZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YlRlYW0oKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXJldHVybiBiYXNpY1NldFN1cGVyVGVhbShudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTdWJUZWFtKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCXJldHVybiBnZXRUZWFtUm9sZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTdXBlclRlYW0oKTsKLQkJCXJldHVybiBiYXNpY0dldFN1cGVyVGVhbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCXJldHVybiBnZXRTdWJUZWFtKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCWdldFRlYW1Sb2xlcygpLmNsZWFyKCk7Ci0JCQlnZXRUZWFtUm9sZXMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXNldFN1cGVyVGVhbSgoVGVhbVByb2ZpbGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlnZXRTdWJUZWFtKCkuY2xlYXIoKTsKLQkJCWdldFN1YlRlYW0oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRlYW1Qcm9maWxlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCWdldFRlYW1Sb2xlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlzZXRTdXBlclRlYW0oKFRlYW1Qcm9maWxlKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlnZXRTdWJUZWFtKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCXJldHVybiB0ZWFtUm9sZXMgIT0gbnVsbCAmJiAhdGVhbVJvbGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXJldHVybiBzdXBlclRlYW0gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlyZXR1cm4gc3ViVGVhbSAhPSBudWxsICYmICFzdWJUZWFtLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vVGVhbVByb2ZpbGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVtcGxhdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVtcGxhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmM2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVGVtcGxhdGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URU1QTEFURTsKLQl9Ci0KLX0gLy9UZW1wbGF0ZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiNzY5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVybSBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVybURlZmluaXRpb25JbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVGVybURlZmluaXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlcm1EZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JfQotCi19IC8vVGVybURlZmluaXRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjJkOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRleHRFbGVtZW50SW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRleHRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXh0KCkgPGVtPlRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0ZXh0ID0gVEVYVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZXh0RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVYVF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQ7Ci0JCXRleHQgPSBuZXdUZXh0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVCwgb2xkVGV4dCwgdGV4dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCXJldHVybiBnZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCXNldFRleHQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCXNldFRleHQoVEVYVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlyZXR1cm4gVEVYVF9FREVGQVVMVCA9PSBudWxsID8gdGV4dCAhPSBudWxsIDogIVRFWFRfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0ZXh0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UZXh0RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZmFjOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgVG9vbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sTWVudG9ycygpIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUb29sTWVudG9yPiB0b29sTWVudG9yczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRvb2xNZW50b3I+KAotCQkJCQlUb29sTWVudG9yLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHRvb2xNZW50b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SUzoKLQkJCXJldHVybiBnZXRUb29sTWVudG9ycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlnZXRUb29sTWVudG9ycygpCi0JCQkJCS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRvb2xNZW50b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vVG9vbEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTRjNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xNZW50b3JJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVG9vbE1lbnRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9NRU5UT1I7Ci0JfQotCi19IC8vVG9vbE1lbnRvckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UeXBlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1R5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzExYzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1R5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZUltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgVHlwZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVFlQRTsKLQl9Ci0KLX0gLy9UeXBlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzNzFkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJaW1wbGVtZW50cyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnQoKSA8ZW0+RWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKChFT2JqZWN0KSBlbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnQ7Ci0JCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkRWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBvbGRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQkJb2xkRWxlbWVudCwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGJhc2ljR2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChNZXRob2RFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBvbGRFbGVtZW50ID0gZWxlbWVudDsKLQkJZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwgb2xkRWxlbWVudCwKLQkJCQkJZWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYUZhY3RvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYmFjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgVW1hRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJVW1hRmFjdG9yeSB0aGVVbWFGYWN0b3J5ID0gKFVtYUZhY3RvcnkpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJCS5nZXRFRmFjdG9yeSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41L3VtYS5lY29yZSIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZVVtYUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVVbWFGYWN0b3J5OwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IFVtYUZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBhY2thZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbnN0cmFpbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUtpbmQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTZWN0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDb25jZXB0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNoZWNrbGlzdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHdWlkZWxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUV4YW1wbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBcnRpZmFjdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVXb3JrUHJvZHVjdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJlcG9ydCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRlbXBsYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVG9vbE1lbnRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGVsaXZlcmFibGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU91dGNvbWUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVA6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVN0ZXAoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdoaXRlcGFwZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0s6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRhc2soKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJvbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZVNldCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEb21haW4oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkc6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlzY2lwbGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFjdGl2aXR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQbGFubmluZ0RhdGEoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtPcmRlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9hZG1hcCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVE9PTDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVG9vbCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkc6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVNaWxlc3RvbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlSXRlcmF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QSEFTRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUGhhc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDb21wb3NpdGVSb2xlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJhY3RpY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1I6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlhZ3JhbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3JhcGhOb2RlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJlZmVyZW5jZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb3BlcnR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUG9pbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOSzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlhZ3JhbUxpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUdyYXBoRWRnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaW1lbnNpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGV4dEVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVJbWFnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBvbHlsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVFbGxpcHNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0ZhbWlseSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFOgotCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUUklORzoKLQkJCXJldHVybiBjcmVhdGVTdHJpbmdGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJPT0xFQU46Ci0JCQlyZXR1cm4gY3JlYXRlQm9vbGVhbkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREFURToKLQkJCXJldHVybiBjcmVhdGVEYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5VUkk6Ci0JCQlyZXR1cm4gY3JlYXRlVXJpRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVQ6Ci0JCQlyZXR1cm4gY3JlYXRlU2V0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVFVRU5DRToKLQkJCXJldHVybiBjcmVhdGVTZXF1ZW5jZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuSU5URUdFUjoKLQkJCXJldHVybiBjcmVhdGVJbnRlZ2VyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET1VCTEU6Ci0JCQlyZXR1cm4gY3JlYXRlRG91YmxlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfVFlQRToKLQkJCXJldHVybiBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVFJJTkc6Ci0JCQlyZXR1cm4gY29udmVydFN0cmluZ1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CT09MRUFOOgotCQkJcmV0dXJuIGNvbnZlcnRCb29sZWFuVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRBVEU6Ci0JCQlyZXR1cm4gY29udmVydERhdGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuVVJJOgotCQkJcmV0dXJuIGNvbnZlcnRVcmlUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VUOgotCQkJcmV0dXJuIGNvbnZlcnRTZXRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VRVUVOQ0U6Ci0JCQlyZXR1cm4gY29udmVydFNlcXVlbmNlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklOVEVHRVI6Ci0JCQlyZXR1cm4gY29udmVydEludGVnZXJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuRE9VQkxFOgotCQkJcmV0dXJuIGNvbnZlcnREb3VibGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBjcmVhdGVQYWNrYWdlKCkgewotCQlQYWNrYWdlSW1wbCBwYWNrYWdlXyA9IG5ldyBQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gcGFja2FnZV87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpIHsKLQkJQ29uc3RyYWludEltcGwgY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gY29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCBtZXRob2RFbGVtZW50UHJvcGVydHkgPSBuZXcgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBLaW5kIGNyZWF0ZUtpbmQoKSB7Ci0JCUtpbmRJbXBsIGtpbmQgPSBuZXcgS2luZEltcGwoKTsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbkltcGwgY29udGVudERlc2NyaXB0aW9uID0gbmV3IENvbnRlbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCkgewotCQlTZWN0aW9uSW1wbCBzZWN0aW9uID0gbmV3IFNlY3Rpb25JbXBsKCk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoKSB7Ci0JCVJvbGVJbXBsIHJvbGUgPSBuZXcgUm9sZUltcGwoKTsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgY3JlYXRlVGFzaygpIHsKLQkJVGFza0ltcGwgdGFzayA9IG5ldyBUYXNrSW1wbCgpOwotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RlcCBjcmVhdGVTdGVwKCkgewotCQlTdGVwSW1wbCBzdGVwID0gbmV3IFN0ZXBJbXBsKCk7Ci0JCXJldHVybiBzdGVwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpIHsKLQkJQXJ0aWZhY3RJbXBsIGFydGlmYWN0ID0gbmV3IEFydGlmYWN0SW1wbCgpOwotCQlyZXR1cm4gYXJ0aWZhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGNyZWF0ZVdvcmtQcm9kdWN0KCkgewotCQlXb3JrUHJvZHVjdEltcGwgd29ya1Byb2R1Y3QgPSBuZXcgV29ya1Byb2R1Y3RJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRnVsZmlsbGFibGVFbGVtZW50IGNyZWF0ZUZ1bGZpbGxhYmxlRWxlbWVudCgpIHsKLQkJRnVsZmlsbGFibGVFbGVtZW50SW1wbCBmdWxmaWxsYWJsZUVsZW1lbnQgPSBuZXcgRnVsZmlsbGFibGVFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gZnVsZmlsbGFibGVFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZSgpIHsKLQkJRGVsaXZlcmFibGVJbXBsIGRlbGl2ZXJhYmxlID0gbmV3IERlbGl2ZXJhYmxlSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcmFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGNvbWUgY3JlYXRlT3V0Y29tZSgpIHsKLQkJT3V0Y29tZUltcGwgb3V0Y29tZSA9IG5ldyBPdXRjb21lSW1wbCgpOwotCQlyZXR1cm4gb3V0Y29tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoKSB7Ci0JCUNvbnRlbnRQYWNrYWdlSW1wbCBjb250ZW50UGFja2FnZSA9IG5ldyBDb250ZW50UGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0aW9uIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSB7Ci0JCUFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGFydGlmYWN0RGVzY3JpcHRpb24gPSBuZXcgQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgd29ya1Byb2R1Y3REZXNjcmlwdGlvbiA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkgewotCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb24gY3JlYXRlUm9sZURlc2NyaXB0aW9uKCkgewotCQlSb2xlRGVzY3JpcHRpb25JbXBsIHJvbGVEZXNjcmlwdGlvbiA9IG5ldyBSb2xlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvbiBjcmVhdGVUYXNrRGVzY3JpcHRpb24oKSB7Ci0JCVRhc2tEZXNjcmlwdGlvbkltcGwgdGFza0Rlc2NyaXB0aW9uID0gbmV3IFRhc2tEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VEZXNjcmlwdGlvbiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkgewotCQlHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCBndWlkYW5jZURlc2NyaXB0aW9uID0gbmV3IEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBndWlkYW5jZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCVByYWN0aWNlRGVzY3JpcHRpb25JbXBsIHByYWN0aWNlRGVzY3JpcHRpb24gPSBuZXcgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCkgewotCQlBY3Rpdml0eUltcGwgYWN0aXZpdHkgPSBuZXcgQWN0aXZpdHlJbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZSgpIHsKLQkJTWlsZXN0b25lSW1wbCBtaWxlc3RvbmUgPSBuZXcgTWlsZXN0b25lSW1wbCgpOwotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKCkgewotCQlJdGVyYXRpb25JbXBsIGl0ZXJhdGlvbiA9IG5ldyBJdGVyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBpdGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBoYXNlIGNyZWF0ZVBoYXNlKCkgewotCQlQaGFzZUltcGwgcGhhc2UgPSBuZXcgUGhhc2VJbXBsKCk7Ci0JCXJldHVybiBwaGFzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGUgY3JlYXRlVGVhbVByb2ZpbGUoKSB7Ci0JCVRlYW1Qcm9maWxlSW1wbCB0ZWFtUHJvZmlsZSA9IG5ldyBUZWFtUHJvZmlsZUltcGwoKTsKLQkJcmV0dXJuIHRlYW1Qcm9maWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvcigpIHsKLQkJUm9sZURlc2NyaXB0b3JJbXBsIHJvbGVEZXNjcmlwdG9yID0gbmV3IFJvbGVEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlciBjcmVhdGVXb3JrT3JkZXIoKSB7Ci0JCVdvcmtPcmRlckltcGwgd29ya09yZGVyID0gbmV3IFdvcmtPcmRlckltcGwoKTsKLQkJcmV0dXJuIHdvcmtPcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpIHsKLQkJUGxhbm5pbmdEYXRhSW1wbCBwbGFubmluZ0RhdGEgPSBuZXcgUGxhbm5pbmdEYXRhSW1wbCgpOwotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpIHsKLQkJVGFza0Rlc2NyaXB0b3JJbXBsIHRhc2tEZXNjcmlwdG9yID0gbmV3IFRhc2tEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgd29ya1Byb2R1Y3REZXNjcmlwdG9yID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKCkgewotCQlDb21wb3NpdGVSb2xlSW1wbCBjb21wb3NpdGVSb2xlID0gbmV3IENvbXBvc2l0ZVJvbGVJbXBsKCk7Ci0JCXJldHVybiBjb21wb3NpdGVSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkgewotCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA9IG5ldyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGVzY3JpcHRpb24gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpIHsKLQkJQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgYWN0aXZpdHlEZXNjcmlwdGlvbiA9IG5ldyBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA9IG5ldyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIHByb2Nlc3NEZXNjcmlwdGlvbiA9IG5ldyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSB7Ci0JCURlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KCkgewotCQlDb25jZXB0SW1wbCBjb25jZXB0ID0gbmV3IENvbmNlcHRJbXBsKCk7Ci0JCXJldHVybiBjb25jZXB0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCkgewotCQlDaGVja2xpc3RJbXBsIGNoZWNrbGlzdCA9IG5ldyBDaGVja2xpc3RJbXBsKCk7Ci0JCXJldHVybiBjaGVja2xpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpIHsKLQkJRXhhbXBsZUltcGwgZXhhbXBsZSA9IG5ldyBFeGFtcGxlSW1wbCgpOwotCQlyZXR1cm4gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGVsaW5lIGNyZWF0ZUd1aWRlbGluZSgpIHsKLQkJR3VpZGVsaW5lSW1wbCBndWlkZWxpbmUgPSBuZXcgR3VpZGVsaW5lSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGVsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlcG9ydCBjcmVhdGVSZXBvcnQoKSB7Ci0JCVJlcG9ydEltcGwgcmVwb3J0ID0gbmV3IFJlcG9ydEltcGwoKTsKLQkJcmV0dXJuIHJlcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlSW1wbCB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IG5ldyBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsKCk7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpIHsKLQkJVG9vbE1lbnRvckltcGwgdG9vbE1lbnRvciA9IG5ldyBUb29sTWVudG9ySW1wbCgpOwotCQlyZXR1cm4gdG9vbE1lbnRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKCkgewotCQlXaGl0ZXBhcGVySW1wbCB3aGl0ZXBhcGVyID0gbmV3IFdoaXRlcGFwZXJJbXBsKCk7Ci0JCXJldHVybiB3aGl0ZXBhcGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbigpIHsKLQkJVGVybURlZmluaXRpb25JbXBsIHRlcm1EZWZpbml0aW9uID0gbmV3IFRlcm1EZWZpbml0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGVybURlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPSBuZXcgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKSB7Ci0JCVByYWN0aWNlSW1wbCBwcmFjdGljZSA9IG5ldyBQcmFjdGljZUltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoKSB7Ci0JCVJldXNhYmxlQXNzZXRJbXBsIHJldXNhYmxlQXNzZXQgPSBuZXcgUmV1c2FibGVBc3NldEltcGwoKTsKLQkJcmV0dXJuIHJldXNhYmxlQXNzZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgY3JlYXRlRGlzY2lwbGluZSgpIHsKLQkJRGlzY2lwbGluZUltcGwgZGlzY2lwbGluZSA9IG5ldyBEaXNjaXBsaW5lSW1wbCgpOwotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCkgewotCQlSb2xlU2V0SW1wbCByb2xlU2V0ID0gbmV3IFJvbGVTZXRJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb21haW4gY3JlYXRlRG9tYWluKCkgewotCQlEb21haW5JbXBsIGRvbWFpbiA9IG5ldyBEb21haW5JbXBsKCk7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZUltcGwgd29ya1Byb2R1Y3RUeXBlID0gbmV3IFdvcmtQcm9kdWN0VHlwZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpIHsKLQkJRGlzY2lwbGluZUdyb3VwaW5nSW1wbCBkaXNjaXBsaW5lR3JvdXBpbmcgPSBuZXcgRGlzY2lwbGluZUdyb3VwaW5nSW1wbCgpOwotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCVRvb2xJbXBsIHRvb2wgPSBuZXcgVG9vbEltcGwoKTsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCVJvbGVTZXRHcm91cGluZ0ltcGwgcm9sZVNldEdyb3VwaW5nID0gbmV3IFJvbGVTZXRHcm91cGluZ0ltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCUN1c3RvbUNhdGVnb3J5SW1wbCBjdXN0b21DYXRlZ29yeSA9IG5ldyBDdXN0b21DYXRlZ29yeUltcGwoKTsKLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkgewotCQlEZWxpdmVyeVByb2Nlc3NJbXBsIGRlbGl2ZXJ5UHJvY2VzcyA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkgewotCQlDYXBhYmlsaXR5UGF0dGVybkltcGwgY2FwYWJpbGl0eVBhdHRlcm4gPSBuZXcgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsKCk7Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IG5ldyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2FkbWFwIGNyZWF0ZVJvYWRtYXAoKSB7Ci0JCVJvYWRtYXBJbXBsIHJvYWRtYXAgPSBuZXcgUm9hZG1hcEltcGwoKTsKLQkJcmV0dXJuIHJvYWRtYXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnQgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEltcGwgcHJvY2Vzc0NvbXBvbmVudCA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2UgY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSB7Ci0JCVByb2Nlc3NQYWNrYWdlSW1wbCBwcm9jZXNzUGFja2FnZSA9IG5ldyBQcm9jZXNzUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkgewotCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGNyZWF0ZU1ldGhvZFBsdWdpbigpIHsKLQkJTWV0aG9kUGx1Z2luSW1wbCBtZXRob2RQbHVnaW4gPSBuZXcgTWV0aG9kUGx1Z2luSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kUGx1Z2luOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIG1ldGhvZENvbmZpZ3VyYXRpb24gPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbHkgY3JlYXRlUHJvY2Vzc0ZhbWlseSgpIHsKLQkJUHJvY2Vzc0ZhbWlseUltcGwgcHJvY2Vzc0ZhbWlseSA9IG5ldyBQcm9jZXNzRmFtaWx5SW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0ZhbWlseTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5SW1wbCBtZXRob2RMaWJyYXJ5ID0gbmV3IE1ldGhvZExpYnJhcnlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBjcmVhdGVQb2ludCgpIHsKLQkJUG9pbnRJbXBsIHBvaW50ID0gbmV3IFBvaW50SW1wbCgpOwotCQlyZXR1cm4gcG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1MaW5rIGNyZWF0ZURpYWdyYW1MaW5rKCkgewotCQlEaWFncmFtTGlua0ltcGwgZGlhZ3JhbUxpbmsgPSBuZXcgRGlhZ3JhbUxpbmtJbXBsKCk7Ci0JCXJldHVybiBkaWFncmFtTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhDb25uZWN0b3IgY3JlYXRlR3JhcGhDb25uZWN0b3IoKSB7Ci0JCUdyYXBoQ29ubmVjdG9ySW1wbCBncmFwaENvbm5lY3RvciA9IG5ldyBHcmFwaENvbm5lY3RvckltcGwoKTsKLQkJcmV0dXJuIGdyYXBoQ29ubmVjdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gY3JlYXRlRGltZW5zaW9uKCkgewotCQlEaW1lbnNpb25JbXBsIGRpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb25JbXBsKCk7Ci0JCXJldHVybiBkaW1lbnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZmVyZW5jZSBjcmVhdGVSZWZlcmVuY2UoKSB7Ci0JCVJlZmVyZW5jZUltcGwgcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZUltcGwoKTsKLQkJcmV0dXJuIHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoKSB7Ci0JCVByb3BlcnR5SW1wbCBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eUltcGwoKTsKLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVkZ2UgY3JlYXRlR3JhcGhFZGdlKCkgewotCQlHcmFwaEVkZ2VJbXBsIGdyYXBoRWRnZSA9IG5ldyBHcmFwaEVkZ2VJbXBsKCk7Ci0JCXJldHVybiBncmFwaEVkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gY3JlYXRlRGlhZ3JhbSgpIHsKLQkJRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IG5ldyBEaWFncmFtSW1wbCgpOwotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZSgpIHsKLQkJR3JhcGhOb2RlSW1wbCBncmFwaE5vZGUgPSBuZXcgR3JhcGhOb2RlSW1wbCgpOwotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBjcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpIHsKLQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50ID0gbmV3IFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgdW1hU2VtYW50aWNNb2RlbEJyaWRnZSA9IG5ldyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpOwotCQlyZXR1cm4gdW1hU2VtYW50aWNNb2RlbEJyaWRnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSB7Ci0JCUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSA9IG5ldyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwoKTsKLQkJcmV0dXJuIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXh0RWxlbWVudCBjcmVhdGVUZXh0RWxlbWVudCgpIHsKLQkJVGV4dEVsZW1lbnRJbXBsIHRleHRFbGVtZW50ID0gbmV3IFRleHRFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gdGV4dEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlIGNyZWF0ZUltYWdlKCkgewotCQlJbWFnZUltcGwgaW1hZ2UgPSBuZXcgSW1hZ2VJbXBsKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9seWxpbmUgY3JlYXRlUG9seWxpbmUoKSB7Ci0JCVBvbHlsaW5lSW1wbCBwb2x5bGluZSA9IG5ldyBQb2x5bGluZUltcGwoKTsKLQkJcmV0dXJuIHBvbHlsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGxpcHNlIGNyZWF0ZUVsbGlwc2UoKSB7Ci0JCUVsbGlwc2VJbXBsIGVsbGlwc2UgPSBuZXcgRWxsaXBzZUltcGwoKTsKLQkJcmV0dXJuIGVsbGlwc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBXb3JrT3JkZXJUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSByZXN1bHQgPSBWYXJpYWJpbGl0eVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEYXRlIGNyZWF0ZURhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChEYXRlKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREYXRlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgY3JlYXRlVXJpRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoVVJJKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVcmlUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTdHJpbmdGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdHJpbmdUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGNyZWF0ZUJvb2xlYW5Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Qm9vbGVhblRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNldCBjcmVhdGVTZXRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTZXQpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNldFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGVTZXF1ZW5jZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChMaXN0KSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXF1ZW5jZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgY3JlYXRlSW50ZWdlckZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbnRlZ2VyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGNyZWF0ZURvdWJsZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChEb3VibGUpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERvdWJsZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpIHsKLQkJcmV0dXJuIChVbWFQYWNrYWdlKSBnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFVtYVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL1VtYUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg1NjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgVW1hUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2xhc3NpZmllckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0eXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZWRFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5hbWVzcGFjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGtpbmRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZnVsZmlsbGFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya0RlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc3RlcEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkYW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRjb21lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudFBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaWxlc3RvbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaXRlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBoYXNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlYW1Qcm9maWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtPcmRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwbGFubmluZ0RhdGFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29tcG9zaXRlUm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbmNlcHRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2hlY2tsaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4YW1wbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGVsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXBvcnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVtcGxhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRvb2xNZW50b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2hpdGVwYXBlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZXJtRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcmFjdGljZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXVzYWJsZUFzc2V0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc2NpcGxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudENhdGVnb3J5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZG9tYWluRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcnlQcm9jZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9hZG1hcEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGx1Z2luRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RVbml0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0ZhbWlseUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RMaWJyYXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGdyYXBoRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaWFncmFtRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaWFncmFtTGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaENvbm5lY3RvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpbWVuc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZWZlcmVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhFZGdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhOb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGVhZkVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGV4dEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW1hZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwb2x5bGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbGxpcHNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gd29ya09yZGVyVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdmFyaWFiaWxpdHlUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGF0ZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB1cmlFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc3RyaW5nRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJvb2xlYW5FRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2V0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHNlcXVlbmNlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGludGVnZXJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZG91YmxlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVW1hUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFVtYUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpCi0JCQlyZXR1cm4gKFVtYVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJCS5nZXRFUGFja2FnZShVbWFQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJVW1hUGFja2FnZUltcGwgdGhlVW1hUGFja2FnZSA9IChVbWFQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgVW1hUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCS5nZXRFUGFja2FnZShlTlNfVVJJKQotCQkJCTogbmV3IFVtYVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVVbWFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlVW1hUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVVbWFQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVVbWFQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2xhc3NpZmllcigpIHsKLQkJcmV0dXJuIGNsYXNzaWZpZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNsYXNzaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXROYW1lZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBuYW1lZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gcGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfR3VpZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfS2luZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIGNvbnN0cmFpbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uc3RyYWludF9Cb2R5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGtpbmRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29udGVudEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X1Rlcm1kZWZpbml0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmliYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0xvbmdQcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdGlvbigpIHsKLQkJcmV0dXJuIHNlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3Rpb25fU3ViU2VjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIHJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZV9Nb2RpZmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RnVsZmlsbGFibGVFbGVtZW50KCkgewotCQlyZXR1cm4gZnVsZmlsbGFibGVFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBmdWxmaWxsYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2soKSB7Ci0JCXJldHVybiB0YXNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfUGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3V0cHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfU3RlcHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfVG9vbE1lbnRvcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gd29ya0RlZmluaXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U3RlcCgpIHsKLQkJcmV0dXJuIHN0ZXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJ0aWZhY3QoKSB7Ci0JCXJldHVybiBhcnRpZmFjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhcnRpZmFjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhcnRpZmFjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGVsaXZlcmFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGNvbWUoKSB7Ci0JCXJldHVybiBvdXRjb21lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5KCkgewotCQlyZXR1cm4gYWN0aXZpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9Sb2FkbWFwcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1RlbXBsYXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUmVwb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9Ub29sbWVudG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtaWxlc3RvbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEl0ZXJhdGlvbigpIHsKLQkJcmV0dXJuIGl0ZXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBoYXNlKCkgewotCQlyZXR1cm4gcGhhc2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZWFtUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRlYW1Qcm9maWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtPcmRlcigpIHsKLQkJcmV0dXJuIHdvcmtPcmRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya09yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya09yZGVyX1ByZWQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya09yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRWxlbWVudCgpIHsKLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tcG9zaXRlUm9sZSgpIHsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29tcG9zaXRlUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGNvbmNlcHRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiBjaGVja2xpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZXhhbXBsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuIGd1aWRlbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlcG9ydCgpIHsKLQkJcmV0dXJuIHJlcG9ydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gdGVtcGxhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gdG9vbE1lbnRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdoaXRlcGFwZXIoKSB7Ci0JCXJldHVybiB3aGl0ZXBhcGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmFjdGljZSgpIHsKLQkJcmV0dXJuIHByYWN0aWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gcmV1c2FibGVBc3NldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfVGFza3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5KCkgewotCQlyZXR1cm4gY29udGVudENhdGVnb3J5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVNldCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZVNldF9Sb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlU2V0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREb21haW4oKSB7Ci0JCXJldHVybiBkb21haW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkb21haW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb21haW5fU3ViZG9tYWlucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkb21haW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2woKSB7Ci0JCXJldHVybiB0b29sRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRvb2xfVG9vbE1lbnRvcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdG9vbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVNldEdyb3VwaW5nKCkgewotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEN1c3RvbUNhdGVnb3J5KCkgewotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2VzcygpIHsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSB7Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9hZG1hcCgpIHsKLQkJcmV0dXJuIHJvYWRtYXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX0RpYWdyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIG1ldGhvZFBsdWdpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9CYXNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fU3VwcG9ydGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFZhcmlhYmlsaXR5RWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpIHsKLQkJcmV0dXJuIG1ldGhvZFVuaXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NGYW1pbHkoKSB7Ci0JCXJldHVybiBwcm9jZXNzRmFtaWx5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0ZhbWlseUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIG1ldGhvZExpYnJhcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb2ludCgpIHsKLQkJcmV0dXJuIHBvaW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvaW50X1goKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcG9pbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb2ludF9ZKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHBvaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCXJldHVybiBncmFwaEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X1Bvc2l0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0xpbmsoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpYWdyYW1FbGVtZW50KCkgewotCQlyZXR1cm4gZGlhZ3JhbUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbUVsZW1lbnRfSXNWaXNpYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfUHJvcGVydHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpYWdyYW1MaW5rKCkgewotCQlyZXR1cm4gZGlhZ3JhbUxpbmtFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbUxpbmtfWm9vbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkaWFncmFtTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpYWdyYW1MaW5rX1ZpZXdwb3J0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3JhcGhDb25uZWN0b3IoKSB7Ci0JCXJldHVybiBncmFwaENvbm5lY3RvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhDb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhDb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSB7Ci0JCXJldHVybiBzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpbWVuc2lvbigpIHsKLQkJcmV0dXJuIGRpbWVuc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fV2lkdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGltZW5zaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGltZW5zaW9uX0hlaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkaW1lbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VfSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcmVmZXJlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0tleSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaEVkZ2UoKSB7Ci0JCXJldHVybiBncmFwaEVkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFZGdlX0FuY2hvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbV9ab29tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX1ZpZXdwb2ludCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3JhcGhOb2RlKCkgewotCQlyZXR1cm4gZ3JhcGhOb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoTm9kZV9TaXplKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoTm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSB7Ci0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJcmV0dXJuIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGVhZkVsZW1lbnQoKSB7Ci0JCXJldHVybiBsZWFmRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRleHRFbGVtZW50KCkgewotCQlyZXR1cm4gdGV4dEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGV4dEVsZW1lbnRfVGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB0ZXh0RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbWFnZV9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgaW1hZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbWFnZV9NaW1lVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBpbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIGdyYXBoaWNQcmltaXRpdmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb2x5bGluZSgpIHsKLQkJcmV0dXJuIHBvbHlsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvbHlsaW5lX0Nsb3NlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwb2x5bGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBvbHlsaW5lX1dheXBvaW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwb2x5bGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWxsaXBzZSgpIHsKLQkJcmV0dXJuIGVsbGlwc2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9SYWRpdXNYKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1koKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsbGlwc2VfUm90YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsbGlwc2VfU3RhcnRBbmdsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9FbmRBbmdsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RWxsaXBzZV9DZW50ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRXb3JrT3JkZXJUeXBlKCkgewotCQlyZXR1cm4gd29ya09yZGVyVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERhdGUoKSB7Ci0JCXJldHVybiBkYXRlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VXJpKCkgewotCQlyZXR1cm4gdXJpRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RyaW5nKCkgewotCQlyZXR1cm4gc3RyaW5nRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Qm9vbGVhbigpIHsKLQkJcmV0dXJuIGJvb2xlYW5FRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTZXQoKSB7Ci0JCXJldHVybiBzZXRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIHNlcXVlbmNlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SW50ZWdlcigpIHsKLQkJcmV0dXJuIGludGVnZXJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREb3VibGUoKSB7Ci0JCXJldHVybiBkb3VibGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChVbWFGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkKLQkJCXJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJY2xhc3NpZmllckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDTEFTU0lGSUVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjbGFzc2lmaWVyRUNsYXNzLCBDTEFTU0lGSUVSX19JU19BQlNUUkFDVCk7Ci0KLQkJdHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUWVBFKTsKLQotCQlwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFDS0FHRUFCTEVfRUxFTUVOVCk7Ci0KLQkJbmFtZWRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE5BTUVEX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKG5hbWVkRWxlbWVudEVDbGFzcywgTkFNRURfRUxFTUVOVF9fTkFNRSk7Ci0KLQkJZWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTEVNRU5UKTsKLQotCQlwYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBQ0tBR0UpOwotCi0JCW5hbWVzcGFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FU1BBQ0UpOwotCi0JCWNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uc3RyYWludEVDbGFzcywgQ09OU1RSQUlOVF9fQk9EWSk7Ci0KLQkJbWV0aG9kRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0dVSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsCi0JCQkJTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fS0lORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSk7Ci0KLQkJbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MsCi0JCQkJTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQlraW5kRUNsYXNzID0gY3JlYXRlRUNsYXNzKEtJTkQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGtpbmRFQ2xhc3MsIEtJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQotCQljb250ZW50RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLAotCQkJCUNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLAotCQkJCUNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0FTU0VUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT04pOwotCi0JCWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklCQUJMRV9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsCi0JCQkJREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsCi0JCQkJREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsCi0JCQkJREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04pOwotCi0JCWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FKTsKLQotCQltZXRob2RVbml0RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9VTklUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQVVUSE9SUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fVkVSU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQpOwotCi0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQotCQlndWlkYW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRSk7Ci0KLQkJc2VjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19TRUNUSU9OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NVQl9TRUNUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fUFJFREVDRVNTT1IpOwotCi0JCXZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhWQVJJQUJJTElUWV9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLAotCQkJCVZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpOwotCi0JCWNvbmNlcHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OQ0VQVCk7Ci0KLQkJY2hlY2tsaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENIRUNLTElTVCk7Ci0KLQkJZ3VpZGVsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURFTElORSk7Ci0KLQkJZXhhbXBsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWEFNUExFKTsKLQotCQlyZXVzYWJsZUFzc2V0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFVVNBQkxFX0FTU0VUKTsKLQotCQl0ZXJtRGVmaW5pdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVJNX0RFRklOSVRJT04pOwotCi0JCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcywKLQkJCQlBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT04pOwotCi0JCWFydGlmYWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSVElGQUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXJ0aWZhY3RFQ2xhc3MsIEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTKTsKLQotCQl3b3JrUHJvZHVjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1JFUE9SVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdEVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCi0JCWZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGVUxGSUxMQUJMRV9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmdWxmaWxsYWJsZUVsZW1lbnRFQ2xhc3MsCi0JCQkJRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFMpOwotCi0JCXJlcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVBPUlQpOwotCi0JCXRlbXBsYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFTVBMQVRFKTsKLQotCQl0b29sTWVudG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRPT0xfTUVOVE9SKTsKLQotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJZGVsaXZlcmFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUkFCTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlbGl2ZXJhYmxlRUNsYXNzLAotCQkJCURFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUyk7Ci0KLQkJb3V0Y29tZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPVVRDT01FKTsKLQotCQlzdGVwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNURVApOwotCi0JCXdvcmtEZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfREVGSU5JVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya0RlZmluaXRpb25FQ2xhc3MsIFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQotCQl3aGl0ZXBhcGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdISVRFUEFQRVIpOwotCi0JCXRhc2tFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX09VVFBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX1NURVBTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19UT09MX01FTlRPUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCi0JCXJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUVDbGFzcywgUk9MRV9fTU9ESUZJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVFQ2xhc3MsIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUlRJRkFDVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HKTsKLQotCQlkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJBQkxFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFKTsKLQotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMpOwotCi0JCXRhc2tEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUyk7Ci0KLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkFDVElDRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04pOwotCi0JCXJvbGVTZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTZXRFQ2xhc3MsIFJPTEVfU0VUX19ST0xFUyk7Ci0KLQkJY29udGVudENhdGVnb3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfQ0FURUdPUlkpOwotCi0JCWRvbWFpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET01BSU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19XT1JLX1BST0RVQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb21haW5FQ2xhc3MsIERPTUFJTl9fU1VCRE9NQUlOUyk7Ci0KLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFMpOwotCi0JCWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNDSVBMSU5FX0dST1VQSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsCi0JCQkJRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpOwotCi0JCWRpc2NpcGxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fVEFTS1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MpOwotCi0JCWFjdGl2aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19ST0FETUFQUyk7Ci0KLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19CUkVBS0RPV05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SKTsKLQotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1IpOwotCi0JCXByb2Nlc3NFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfRUxFTUVOVCk7Ci0KLQkJcGxhbm5pbmdEYXRhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBMQU5OSU5HX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKHBsYW5uaW5nRGF0YUVDbGFzcywgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19SQU5LKTsKLQotCQl3b3JrT3JkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19PUkRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya09yZGVyRUNsYXNzLCBXT1JLX09SREVSX19MSU5LX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fUFJFRCk7Ci0KLQkJcm9hZG1hcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0FETUFQKTsKLQotCQl0b29sRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRPT0wpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRvb2xFQ2xhc3MsIFRPT0xfX1RPT0xfTUVOVE9SUyk7Ci0KLQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfU0VUX0dST1VQSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMpOwotCi0JCWN1c3RvbUNhdGVnb3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENVU1RPTV9DQVRFR09SWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsCi0JCQkJQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMpOwotCi0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19HTE9CQUwpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyk7Ci0KLQkJY29udGVudFBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50UGFja2FnZUVDbGFzcywKLQkJCQlDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpOwotCi0JCW1pbGVzdG9uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSUxFU1RPTkUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1pbGVzdG9uZUVDbGFzcywgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0KLQkJZGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdG9yRUNsYXNzLAotCQkJCURFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSk7Ci0KLQkJaXRlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElURVJBVElPTik7Ci0KLQkJcGhhc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEhBU0UpOwotCi0JCXRlYW1Qcm9maWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFQU1fUFJPRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VCX1RFQU0pOwotCi0JCXJvbGVEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fUk9MRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJdGFza0Rlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTS19ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19UQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywKLQkJCQlUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywKLQkJCQlUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTKTsKLQotCQljb21wb3NpdGVSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTVBPU0lURV9ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb3NpdGVSb2xlRUNsYXNzLCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUyk7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJZX1BST0NFU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTKTsKLQotCQlwcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzRUNsYXNzLCBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCi0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzID0gY3JlYXRlRUNsYXNzKENBUEFCSUxJVFlfUEFUVEVSTik7Ci0KLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSk7Ci0KLQkJbWV0aG9kUGx1Z2luRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QTFVHSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19CQVNFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19TVVBQT1JUSU5HKTsKLQotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywKLQkJCQlQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMpOwotCi0JCXByYWN0aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMpOwotCi0JCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSk7Ci0KLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRik7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUKTsKLQotCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTKTsKLQotCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04pOwotCi0JCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzLAotCQkJCVBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MpOwotCi0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsCi0JCQkJUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGFja2FnZUVDbGFzcywgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyk7Ci0KLQkJZGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESUFHUkFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRUNsYXNzLCBESUFHUkFNX19ESUFHUkFNX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FQ2xhc3MsIERJQUdSQU1fX05BTUVTUEFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fWk9PTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fVklFV1BPSU5UKTsKLQotCQlncmFwaE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfTk9ERSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhOb2RlRUNsYXNzLCBHUkFQSF9OT0RFX19TSVpFKTsKLQotCQlncmFwaEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwpOwotCi0JCWRpYWdyYW1FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU1fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRWxlbWVudEVDbGFzcywgRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FbGVtZW50RUNsYXNzLCBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZKTsKLQotCQlyZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVGRVJFTkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VFQ2xhc3MsCi0JCQkJUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWZlcmVuY2VFQ2xhc3MsIFJFRkVSRU5DRV9fUkVGRVJFTkNFRCk7Ci0KLQkJcHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fS0VZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQlwb2ludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT0lOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9pbnRFQ2xhc3MsIFBPSU5UX19YKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb2ludEVDbGFzcywgUE9JTlRfX1kpOwotCi0JCWRpYWdyYW1MaW5rRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU1fTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fWk9PTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fVklFV1BPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1MaW5rRUNsYXNzLCBESUFHUkFNX0xJTktfX0RJQUdSQU0pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1MaW5rRUNsYXNzLCBESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpOwotCi0JCWdyYXBoQ29ubmVjdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0NPTk5FQ1RPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhDb25uZWN0b3JFQ2xhc3MsIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhDb25uZWN0b3JFQ2xhc3MsIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCk7Ci0KLQkJZ3JhcGhFZGdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0VER0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWRnZUVDbGFzcywgR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVkZ2VFQ2xhc3MsIEdSQVBIX0VER0VfX0FOQ0hPUik7Ci0KLQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRU1BTlRJQ19NT0RFTF9CUklER0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCVNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCk7Ci0KLQkJZGltZW5zaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJTUVOU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGltZW5zaW9uRUNsYXNzLCBESU1FTlNJT05fX1dJRFRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaW1lbnNpb25FQ2xhc3MsIERJTUVOU0lPTl9fSEVJR0hUKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0KLQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLAotCQkJCVNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8pOwotCi0JCXVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU1BX1NFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UKTsKLQotCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQpOwotCi0JCWxlYWZFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKExFQUZfRUxFTUVOVCk7Ci0KLQkJdGV4dEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVYVF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZXh0RWxlbWVudEVDbGFzcywgVEVYVF9FTEVNRU5UX19URVhUKTsKLQotCQlpbWFnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW1hZ2VFQ2xhc3MsIElNQUdFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKGltYWdlRUNsYXNzLCBJTUFHRV9fTUlNRV9UWVBFKTsKLQotCQlncmFwaGljUHJpbWl0aXZlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBISUNfUFJJTUlUSVZFKTsKLQotCQlwb2x5bGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT0xZTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9seWxpbmVFQ2xhc3MsIFBPTFlMSU5FX19DTE9TRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvbHlsaW5lRUNsYXNzLCBQT0xZTElORV9fV0FZUE9JTlRTKTsKLQotCQllbGxpcHNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMTElQU0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX0NFTlRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fUkFESVVTX1gpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX1JBRElVU19ZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19ST1RBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fU1RBUlRfQU5HTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX0VORF9BTkdMRSk7Ci0KLQkJcHJvY2Vzc0ZhbWlseUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0ZBTUlMWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0ZhbWlseUVDbGFzcywKLQkJCQlQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTKTsKLQotCQltZXRob2RMaWJyYXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsCi0JCQkJTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl2YXJpYWJpbGl0eVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFZBUklBQklMSVRZX1RZUEUpOwotCQl3b3JrT3JkZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShXT1JLX09SREVSX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCXN0cmluZ0VEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTVFJJTkcpOwotCQlib29sZWFuRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEJPT0xFQU4pOwotCQlkYXRlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERBVEUpOwotCQl1cmlFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVVJJKTsKLQkJc2V0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFVCk7Ci0JCXNlcXVlbmNlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFUVVFTkNFKTsKLQkJaW50ZWdlckVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJTlRFR0VSKTsKLQkJZG91YmxlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERPVUJMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJY2xhc3NpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFR5cGUoKSk7Ci0JCXR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RWxlbWVudCgpKTsKLQkJcGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVzcGFjZSgpKTsKLQkJcGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbmFtZXNwYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQljb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlraW5kRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2xhc3NpZmllcigpKTsKLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkYW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlzZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkpOwotCQl2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQljb25jZXB0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWNoZWNrbGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkZWxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXhhbXBsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyZXVzYWJsZUFzc2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlcm1EZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLmdldEVTdXBlclR5cGVzKCkKLQkJCQkuYWRkKHRoaXMuZ2V0Q2xhc3NpZmllcigpKTsKLQkJYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGdWxmaWxsYWJsZUVsZW1lbnQoKSk7Ci0JCWZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJcmVwb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRvb2xNZW50b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCW91dGNvbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJc3RlcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3Rpb24oKSk7Ci0JCXN0ZXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQl3aGl0ZXBhcGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29uY2VwdCgpKTsKLQkJdGFza0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl0YXNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCXJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJcm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpKTsKLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpCi0JCQkJLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcm9sZVNldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJY29udGVudENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWRvbWFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RnVsZmlsbGFibGVFbGVtZW50KCkpOwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJYWN0aXZpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXByb2Nlc3NFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJd29ya09yZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXJvYWRtYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdG9vbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCQljb250ZW50UGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCW1pbGVzdG9uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQlkZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJaXRlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCXBoYXNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJcHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQljYXBhYmlsaXR5UGF0dGVybkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCXByYWN0aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCWRpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaE5vZGUoKSk7Ci0JCWdyYXBoTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoRWxlbWVudCgpKTsKLQkJZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJcmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCXByb3BlcnR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWdyYXBoQ29ubmVjdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhFbGVtZW50KCkpOwotCQlncmFwaEVkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaEVsZW1lbnQoKSk7Ci0JCXNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSk7Ci0JCWNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJbGVhZkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJdGV4dEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMZWFmRWxlbWVudCgpKTsKLQkJaW1hZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMZWFmRWxlbWVudCgpKTsKLQkJZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExlYWZFbGVtZW50KCkpOwotCQlwb2x5bGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoaWNQcmltaXRpdmUoKSk7Ci0JCWVsbGlwc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaGljUHJpbWl0aXZlKCkpOwotCQlwcm9jZXNzRmFtaWx5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoCi0JCQkJY2xhc3NpZmllckVDbGFzcywKLQkJCQlDbGFzc2lmaWVyLmNsYXNzLAotCQkJCSJDbGFzc2lmaWVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzQWJzdHJhY3QiLCAiZmFsc2UiLCAxLCAxLCBDbGFzc2lmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcyh0eXBlRUNsYXNzLCBUeXBlLmNsYXNzLAotCQkJCSJUeXBlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlQYWNrYWdlYWJsZUVsZW1lbnQuY2xhc3MsCi0JCQkJIlBhY2thZ2VhYmxlRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQluYW1lZEVsZW1lbnRFQ2xhc3MsCi0JCQkJTmFtZWRFbGVtZW50LmNsYXNzLAotCQkJCSJOYW1lZEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm5hbWUiLCAiIiwgMCwgMSwgTmFtZWRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQllbGVtZW50RUNsYXNzLAotCQkJCUVsZW1lbnQuY2xhc3MsCi0JCQkJIkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGFja2FnZUVDbGFzcywKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UuY2xhc3MsCi0JCQkJIlBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW5hbWVzcGFjZUVDbGFzcywKLQkJCQlOYW1lc3BhY2UuY2xhc3MsCi0JCQkJIk5hbWVzcGFjZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb25zdHJhaW50RUNsYXNzLAotCQkJCUNvbnN0cmFpbnQuY2xhc3MsCi0JCQkJIkNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q29uc3RyYWludF9Cb2R5KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYm9keSIsICIiLCAwLCAxLCBDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RFbGVtZW50RUNsYXNzLAotCQkJCU1ldGhvZEVsZW1lbnQuY2xhc3MsCi0JCQkJIk1ldGhvZEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X0d1aWQoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJndWlkIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcmVzZW50YXRpb25OYW1lIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYnJpZWZEZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlcygpLAotCQkJCXRoaXMuZ2V0Q29uc3RyYWludCgpLAotCQkJCW51bGwsCi0JCQkJIm93bmVkUnVsZXMiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLAotCQkJCXRoaXMuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kRWxlbWVudFByb3BlcnR5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCksCi0JCQkJdGhpcy5nZXRLaW5kKCksCi0JCQkJbnVsbCwKLQkJCQkia2luZCIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkic3VwcHJlc3NlZCIsICJmYWxzZSIsIDEsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkib3JkZXJpbmdHdWlkZSIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MsCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLAotCQkJCSJNZXRob2RFbGVtZW50UHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidmFsdWUiLCAiIiwgMCwgMSwgTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlraW5kRUNsYXNzLAotCQkJCUtpbmQuY2xhc3MsCi0JCQkJIktpbmQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLAotCQkJCXRoaXMuZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSwKLQkJCQludWxsLAotCQkJCSJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsIG51bGwsIDAsIC0xLCBLaW5kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb250ZW50RWxlbWVudEVDbGFzcywKLQkJCQlDb250ZW50RWxlbWVudC5jbGFzcywKLQkJCQkiQ29udGVudEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCXRoaXMuZ2V0Q29uY2VwdCgpLAotCQkJCW51bGwsCi0JCQkJImNvbmNlcHRzQW5kUGFwZXJzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJdGhpcy5nZXRDaGVja2xpc3QoKSwKLQkJCQludWxsLAotCQkJCSJjaGVja2xpc3RzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJdGhpcy5nZXRHdWlkZWxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJndWlkZWxpbmVzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCXRoaXMuZ2V0RXhhbXBsZSgpLAotCQkJCW51bGwsCi0JCQkJImV4YW1wbGVzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQl0aGlzLmdldFJldXNhYmxlQXNzZXQoKSwKLQkJCQludWxsLAotCQkJCSJhc3NldHMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X1Rlcm1kZWZpbml0aW9uKCksCi0JCQkJdGhpcy5nZXRUZXJtRGVmaW5pdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInRlcm1kZWZpbml0aW9uIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLAotCQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywKLQkJCQkiRGVzY3JpYmFibGVFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkicHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQl0aGlzLmdldFVyaSgpLAotCQkJCSJzaGFwZWljb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLAotCQkJCXRoaXMuZ2V0VXJpKCksCi0JCQkJIm5vZGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQ29udGVudERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJtYWluRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInNlY3Rpb25zIiwgbnVsbCwgMCwgLTEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImV4dGVybmFsSWQiLCAiIiwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImtleUNvbnNpZGVyYXRpb25zIiwgIiIsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJsb25nUHJlc2VudGF0aW9uTmFtZSIsIG51bGwsIDEsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZFVuaXRFQ2xhc3MsCi0JCQkJTWV0aG9kVW5pdC5jbGFzcywKLQkJCQkiTWV0aG9kVW5pdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQXV0aG9ycygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImF1dGhvcnMiLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJjaGFuZ2VEZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfVmVyc2lvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInZlcnNpb24iLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkiY29weXJpZ2h0U3RhdGVtZW50IiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywKLQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkJIlN1cHBvcnRpbmdNYXRlcmlhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGFuY2VFQ2xhc3MsCi0JCQkJR3VpZGFuY2UuY2xhc3MsCi0JCQkJIkd1aWRhbmNlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXNlY3Rpb25FQ2xhc3MsCi0JCQkJU2VjdGlvbi5jbGFzcywKLQkJCQkiU2VjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2VjdGlvbk5hbWUiLCAiIiwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInNlY3Rpb25EZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlY3Rpb25fU3ViU2VjdGlvbnMoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJzdWJTZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJwcmVkZWNlc3NvciIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLAotCQkJCSJWYXJpYWJpbGl0eUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkidmFyaWFiaWxpdHlUeXBlIiwgIm5hIiwgMSwgMSwgVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJdGhpcy5nZXRWYXJpYWJpbGl0eUVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiwgbnVsbCwgMSwgMSwgVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29uY2VwdEVDbGFzcywKLQkJCQlDb25jZXB0LmNsYXNzLAotCQkJCSJDb25jZXB0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljaGVja2xpc3RFQ2xhc3MsCi0JCQkJQ2hlY2tsaXN0LmNsYXNzLAotCQkJCSJDaGVja2xpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWd1aWRlbGluZUVDbGFzcywKLQkJCQlHdWlkZWxpbmUuY2xhc3MsCi0JCQkJIkd1aWRlbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZXhhbXBsZUVDbGFzcywKLQkJCQlFeGFtcGxlLmNsYXNzLAotCQkJCSJFeGFtcGxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyZXVzYWJsZUFzc2V0RUNsYXNzLAotCQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsCi0JCQkJIlJldXNhYmxlQXNzZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRlcm1EZWZpbml0aW9uRUNsYXNzLAotCQkJCVRlcm1EZWZpbml0aW9uLmNsYXNzLAotCQkJCSJUZXJtRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MsCi0JCQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uY2xhc3MsCi0JCQkJIkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc1ByaW1hcnlFeHRlbnNpb24iLCBudWxsLCAxLCAxLCBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFydGlmYWN0RUNsYXNzLAotCQkJCUFydGlmYWN0LmNsYXNzLAotCQkJCSJBcnRpZmFjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpLAotCQkJCXRoaXMuZ2V0QXJ0aWZhY3QoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCSJjb250YWluZXJBcnRpZmFjdCIsIG51bGwsIDAsIDEsIEFydGlmYWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0KCksCi0JCQkJdGhpcy5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpLAotCQkJCSJjb250YWluZWRBcnRpZmFjdHMiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RUNsYXNzLAotCQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJCSJXb3JrUHJvZHVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQkJdGhpcy5nZXRSZXBvcnQoKSwKLQkJCQludWxsLAotCQkJCSJyZXBvcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCQl0aGlzLmdldFRlbXBsYXRlKCksCi0JCQkJbnVsbCwKLQkJCQkidGVtcGxhdGVzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCW51bGwsCi0JCQkJImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MsCi0JCQkJIkZ1bGZpbGxhYmxlRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSwKLQkJCQl0aGlzLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImZ1bGZpbGxzIiwgbnVsbCwgMCwgLTEsIEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJlcG9ydEVDbGFzcywKLQkJCQlSZXBvcnQuY2xhc3MsCi0JCQkJIlJlcG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdGVtcGxhdGVFQ2xhc3MsCi0JCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkJIlRlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0b29sTWVudG9yRUNsYXNzLAotCQkJCVRvb2xNZW50b3IuY2xhc3MsCi0JCQkJIlRvb2xNZW50b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcywKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuY2xhc3MsCi0JCQkJIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVsaXZlcmFibGVFQ2xhc3MsCi0JCQkJRGVsaXZlcmFibGUuY2xhc3MsCi0JCQkJIkRlbGl2ZXJhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcmFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlvdXRjb21lRUNsYXNzLAotCQkJCU91dGNvbWUuY2xhc3MsCi0JCQkJIk91dGNvbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN0ZXBFQ2xhc3MsCi0JCQkJU3RlcC5jbGFzcywKLQkJCQkiU3RlcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya0RlZmluaXRpb25FQ2xhc3MsCi0JCQkJV29ya0RlZmluaXRpb24uY2xhc3MsCi0JCQkJIldvcmtEZWZpbml0aW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCksCi0JCQkJdGhpcy5nZXRDb25zdHJhaW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpLAotCQkJCXRoaXMuZ2V0Q29uc3RyYWludCgpLAotCQkJCW51bGwsCi0JCQkJInBvc3Rjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd2hpdGVwYXBlckVDbGFzcywKLQkJCQlXaGl0ZXBhcGVyLmNsYXNzLAotCQkJCSJXaGl0ZXBhcGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRUNsYXNzLAotCQkJCVRhc2suY2xhc3MsCi0JCQkJIlRhc2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJInBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19PdXRwdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX1N0ZXBzKCksCi0JCQkJdGhpcy5nZXRTdGVwKCksCi0JCQkJbnVsbCwKLQkJCQkic3RlcHMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQludWxsLAotCQkJCSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVFQ2xhc3MsCi0JCQkJUm9sZS5jbGFzcywKLQkJCQkiUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlX01vZGlmaWVzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIm1vZGlmaWVzIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQXJ0aWZhY3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJyaWVmT3V0bGluZSIsICIiLCAwLCAxLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVwcmVzZW50YXRpb25PcHRpb25zIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlcHJlc2VudGF0aW9uIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm5vdGF0aW9uIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImltcGFjdE9mTm90SGF2aW5nIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlYXNvbnNGb3JOb3ROZWVkaW5nIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJleHRlcm5hbERlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInBhY2thZ2luZ0d1aWRhbmNlIiwgIiIsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlSb2xlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlJvbGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2tpbGxzIiwgIiIsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhc3NpZ25tZW50QXBwcm9hY2hlcyIsICIiLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic3lub255bXMiLCAiIiwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJVGFza0Rlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJUYXNrRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWx0ZXJuYXRpdmVzIiwgIiIsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJHdWlkYW5jZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhdHRhY2htZW50cyIsICIiLCAwLCAxLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlByYWN0aWNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFkZGl0aW9uYWxJbmZvIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJvYmxlbSIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJhY2tncm91bmQiLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZ29hbHMiLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYXBwbGljYXRpb24iLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJsZXZlbHNPZkFkb3B0aW9uIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVTZXRFQ2xhc3MsCi0JCQkJUm9sZVNldC5jbGFzcywKLQkJCQkiUm9sZVNldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlU2V0X1JvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkicm9sZXMiLCBudWxsLCAwLCAtMSwgUm9sZVNldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRDYXRlZ29yeUVDbGFzcywKLQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsCi0JCQkJIkNvbnRlbnRDYXRlZ29yeSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkb21haW5FQ2xhc3MsCi0JCQkJRG9tYWluLmNsYXNzLAotCQkJCSJEb21haW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJ3b3JrUHJvZHVjdHMiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREb21haW5fU3ViZG9tYWlucygpLAotCQkJCXRoaXMuZ2V0RG9tYWluKCksCi0JCQkJbnVsbCwKLQkJCQkic3ViZG9tYWlucyIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0VHlwZUVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdFR5cGUuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIndvcmtQcm9kdWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsCi0JCQkJRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLAotCQkJCSJEaXNjaXBsaW5lR3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksCi0JCQkJdGhpcy5nZXREaXNjaXBsaW5lKCksCi0JCQkJbnVsbCwKLQkJCQkiZGlzY2lwbGluZXMiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGlzY2lwbGluZUVDbGFzcywKLQkJCQlEaXNjaXBsaW5lLmNsYXNzLAotCQkJCSJEaXNjaXBsaW5lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpc2NpcGxpbmVfVGFza3MoKSwKLQkJCQl0aGlzLmdldFRhc2soKSwKLQkJCQludWxsLAotCQkJCSJ0YXNrcyIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSwKLQkJCQl0aGlzLmdldERpc2NpcGxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJzdWJkaXNjaXBsaW5lIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJbnVsbCwKLQkJCQkicmVmZXJlbmNlV29ya2Zsb3dzIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhY3Rpdml0eUVDbGFzcywKLQkJCQlBY3Rpdml0eS5jbGFzcywKLQkJCQkiQWN0aXZpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCksCi0JCQkJImJyZWFrZG93bkVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9Sb2FkbWFwcygpLAotCQkJCXRoaXMuZ2V0Um9hZG1hcCgpLAotCQkJCW51bGwsCi0JCQkJInJvYWRtYXBzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkJIldvcmtCcmVha2Rvd25FbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzUmVwZWF0YWJsZSIsICJmYWxzZSIsIDEsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc09uZ29pbmciLCAiZmFsc2UiLCAxLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzRXZlbnREcml2ZW4iLCAiZmFsc2UiLCAxLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCXRoaXMuZ2V0V29ya09yZGVyKCksCi0JCQkJbnVsbCwKLQkJCQkibGlua1RvUHJlZGVjZXNzb3IiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkJIkJyZWFrZG93bkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByZWZpeCIsICIiLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzUGxhbm5lZCIsICJ0cnVlIiwgMSwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIsICJmYWxzZSIsIDEsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzT3B0aW9uYWwiLCAiZmFsc2UiLCAxLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVzZW50ZWRBZnRlciIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCksCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJlc2VudGVkQmVmb3JlIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSwKLQkJCQl0aGlzLmdldFBsYW5uaW5nRGF0YSgpLAotCQkJCW51bGwsCi0JCQkJInBsYW5uaW5nRGF0YSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJdGhpcy5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkJCSJzdXBlckFjdGl2aXRpZXMiLCBudWxsLCAxLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQl0aGlzLmdldENoZWNrbGlzdCgpLAotCQkJCW51bGwsCi0JCQkJImNoZWNrbGlzdHMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLAotCQkJCXRoaXMuZ2V0Q29uY2VwdCgpLAotCQkJCW51bGwsCi0JCQkJImNvbmNlcHRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQl0aGlzLmdldEV4YW1wbGUoKSwKLQkJCQludWxsLAotCQkJCSJleGFtcGxlcyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQl0aGlzLmdldEd1aWRlbGluZSgpLAotCQkJCW51bGwsCi0JCQkJImd1aWRlbGluZXMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpLAotCQkJCXRoaXMuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCW51bGwsCi0JCQkJInJldXNhYmxlQXNzZXRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkic3VwcG9ydGluZ01hdGVyaWFscyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1RlbXBsYXRlcygpLAotCQkJCXRoaXMuZ2V0VGVtcGxhdGUoKSwKLQkJCQludWxsLAotCQkJCSJ0ZW1wbGF0ZXMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCksCi0JCQkJdGhpcy5nZXRSZXBvcnQoKSwKLQkJCQludWxsLAotCQkJCSJyZXBvcnRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQludWxsLAotCQkJCSJlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Ub29sbWVudG9yKCksCi0JCQkJdGhpcy5nZXRUb29sTWVudG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidG9vbG1lbnRvciIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MsCi0JCQkJUHJvY2Vzc0VsZW1lbnQuY2xhc3MsCi0JCQkJIlByb2Nlc3NFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBsYW5uaW5nRGF0YUVDbGFzcywKLQkJCQlQbGFubmluZ0RhdGEuY2xhc3MsCi0JCQkJIlBsYW5uaW5nRGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCksCi0JCQkJdGhpcy5nZXREYXRlKCksCi0JCQkJInN0YXJ0RGF0ZSIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkiZmluaXNoRGF0ZSIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSwKLQkJCQl0aGlzLmdldEludGVnZXIoKSwKLQkJCQkicmFuayIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtPcmRlckVDbGFzcywKLQkJCQlXb3JrT3JkZXIuY2xhc3MsCi0JCQkJIldvcmtPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSwKLQkJCQl0aGlzLmdldFdvcmtPcmRlclR5cGUoKSwKLQkJCQkibGlua1R5cGUiLCAiZmluaXNoVG9TdGFydCIsIDEsIDEsIFdvcmtPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrT3JkZXJfUHJlZCgpLAotCQkJCXRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVkIiwgbnVsbCwgMSwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9hZG1hcEVDbGFzcywKLQkJCQlSb2FkbWFwLmNsYXNzLAotCQkJCSJSb2FkbWFwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0b29sRUNsYXNzLAotCQkJCVRvb2wuY2xhc3MsCi0JCQkJIlRvb2wiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VG9vbF9Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFRvb2wuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsCi0JCQkJUm9sZVNldEdyb3VwaW5nLmNsYXNzLAotCQkJCSJSb2xlU2V0R3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJdGhpcy5nZXRSb2xlU2V0KCksCi0JCQkJbnVsbCwKLQkJCQkicm9sZVNldHMiLCBudWxsLCAwLCAtMSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsCi0JCQkJQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsCi0JCQkJIkN1c3RvbUNhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImNhdGVnb3JpemVkRWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJInN1YkNhdGVnb3JpZXMiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RQYWNrYWdlRUNsYXNzLAotCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsCi0JCQkJIk1ldGhvZFBhY2thZ2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJnbG9iYWwiLCAiZmFsc2UiLCAxLCAxLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJyZXVzZWRQYWNrYWdlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJjaGlsZFBhY2thZ2VzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRQYWNrYWdlRUNsYXNzLAotCQkJCUNvbnRlbnRQYWNrYWdlLmNsYXNzLAotCQkJCSJDb250ZW50UGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY29udGVudEVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltaWxlc3RvbmVFQ2xhc3MsCi0JCQkJTWlsZXN0b25lLmNsYXNzLAotCQkJCSJNaWxlc3RvbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkicmVxdWlyZWRSZXN1bHRzIiwgbnVsbCwgMCwgLTEsIE1pbGVzdG9uZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWN0aXZpdHlFbnRyeVN0YXRlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhY3Rpdml0eUV4aXRTdGF0ZSIsICIiLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIldvcmtQcm9kdWN0IiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLAotCQkJCSJpbXBhY3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwKLQkJCQkiaW1wYWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJkZWxpdmVyYWJsZVBhcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJEZXNjcmlwdG9yIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiwgInRydWUiLCAxLCAxLCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWl0ZXJhdGlvbkVDbGFzcywKLQkJCQlJdGVyYXRpb24uY2xhc3MsCi0JCQkJIkl0ZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGhhc2VFQ2xhc3MsCi0JCQkJUGhhc2UuY2xhc3MsCi0JCQkJIlBoYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZWFtUHJvZmlsZUVDbGFzcywKLQkJCQlUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkiVGVhbVByb2ZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJInRlYW1Sb2xlcyIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLAotCQkJCSJzdXBlclRlYW0iLCBudWxsLCAxLCAxLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGUoKSwKLQkJCQl0aGlzLmdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLAotCQkJCSJzdWJUZWFtIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIlJvbGVEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJSb2xlIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJtb2RpZmllcyIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJyZXNwb25zaWJsZUZvciIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJUYXNrRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksCi0JCQkJdGhpcy5nZXRUYXNrKCksCi0JCQkJbnVsbCwKLQkJCQkiVGFzayIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJhc3Npc3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJleHRlcm5hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJwZXJmb3JtZWRQcmltYXJpbHlCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInNlbGVjdGVkU3RlcHMiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb21wb3NpdGVSb2xlRUNsYXNzLAotCQkJCUNvbXBvc2l0ZVJvbGUuY2xhc3MsCi0JCQkJIkNvbXBvc2l0ZVJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJhZ2dyZWdhdGVkUm9sZXMiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlEZWxpdmVyeVByb2Nlc3MuY2xhc3MsCi0JCQkJIkRlbGl2ZXJ5UHJvY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJlZHVjYXRpb25NYXRlcmlhbHMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwKLQkJCQl0aGlzLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCW51bGwsCi0JCQkJImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NFQ2xhc3MsCi0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLAotCQkJCSJQcm9jZXNzIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCksCi0JCQkJdGhpcy5nZXRDYXBhYmlsaXR5UGF0dGVybigpLAotCQkJCW51bGwsCi0JCQkJImluY2x1ZGVzUGF0dGVybnMiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkiZGVmYXVsdENvbnRleHQiLCBudWxsLCAxLCAxLCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkidmFsaWRDb250ZXh0IiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLAotCQkJCUNhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLAotCQkJCSJDYXBhYmlsaXR5UGF0dGVybiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJCSJNZXRob2RDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iLCBudWxsLCAxLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIsIG51bGwsIDEsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2Vzc1ZpZXdzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJImRlZmF1bHRWaWV3IiwgbnVsbCwgMSwgMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQludWxsLAotCQkJCSJiYXNlQ29uZmlndXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJInN1YnRyYWN0ZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJImFkZGVkQ2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZFBsdWdpbkVDbGFzcywKLQkJCQlNZXRob2RQbHVnaW4uY2xhc3MsCi0JCQkJIk1ldGhvZFBsdWdpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkidXNlckNoYW5nZWFibGUiLCAidHJ1ZSIsIDEsIDEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQYWNrYWdlcyIsIG51bGwsIDEsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJiYXNlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFBsdWdpbl9TdXBwb3J0aW5nKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksCi0JCQkJInN1cHBvcnRpbmciLCBudWxsLCAwLCAxLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLAotCQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLAotCQkJCSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzKCksCi0JCQkJbnVsbCwKLQkJCQkiYmFzZWRPblByb2Nlc3NlcyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByYWN0aWNlRUNsYXNzLAotCQkJCVByYWN0aWNlLmNsYXNzLAotCQkJCSJQcmFjdGljZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKSwKLQkJCQl0aGlzLmdldFByYWN0aWNlKCksCi0JCQkJbnVsbCwKLQkJCQkic3ViUHJhY3RpY2VzIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJdGhpcy5nZXRDb250ZW50RWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImNvbnRlbnRSZWZlcmVuY2VzIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJbnVsbCwKLQkJCQkiYWN0aXZpdHlSZWZlcmVuY2VzIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidXNhZ2VHdWlkYW5jZSIsICIiLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQWN0aXZpdHlEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhbHRlcm5hdGl2ZXMiLCAiIiwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJob3d0b1N0YWZmIiwgIiIsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInNjYWxlIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJpc2tMZXZlbCIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZXN0aW1hdGluZ1RlY2huaXF1ZSIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJvamVjdE1lbWJlckV4cGVydGlzZSIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInR5cGVPZkNvbnRyYWN0IiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2NvcGUiLCAiIiwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidXNhZ2VOb3RlcyIsICIiLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlEZXNjcmlwdG9yRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVmaW5lZERlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX19wcm9jZXNzQ29tcG9uZW50KCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzQ29tcG9uZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiX3Byb2Nlc3NDb21wb25lbnQiLCBudWxsLCAxLCAxLCBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLAotCQkJCVByb2Nlc3NDb21wb25lbnQuY2xhc3MsCi0JCQkJIlByb2Nlc3NDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCksCi0JCQkJbnVsbCwKLQkJCQkiaW50ZXJmYWNlcyIsIG51bGwsIDEsIC0xLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSwKLQkJCQl0aGlzLmdldFByb2Nlc3MoKSwKLQkJCQludWxsLAotCQkJCSJwcm9jZXNzIiwgbnVsbCwgMSwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MsCi0JCQkJUHJvY2Vzc1BhY2thZ2UuY2xhc3MsCi0JCQkJIlByb2Nlc3NQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpLAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcm9jZXNzRWxlbWVudHMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKSwKLQkJCQl0aGlzLmdldERpYWdyYW0oKSwKLQkJCQludWxsLAotCQkJCSJkaWFncmFtcyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGlhZ3JhbUVDbGFzcywKLQkJCQlEaWFncmFtLmNsYXNzLAotCQkJCSJEaWFncmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1fRGlhZ3JhbUxpbmsoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1MaW5rKCksCi0JCQkJdGhpcy5nZXREaWFncmFtTGlua19EaWFncmFtKCksCi0JCQkJImRpYWdyYW1MaW5rIiwgbnVsbCwgMCwgLTEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1fTmFtZXNwYWNlKCksCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCksCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSwKLQkJCQkibmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaWFncmFtX1pvb20oKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJ6b29tIiwgbnVsbCwgMCwgMSwgRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbV9WaWV3cG9pbnQoKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkidmlld3BvaW50IiwgbnVsbCwgMSwgMSwgRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoTm9kZUVDbGFzcywKLQkJCQlHcmFwaE5vZGUuY2xhc3MsCi0JCQkJIkdyYXBoTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaE5vZGVfU2l6ZSgpLAotCQkJCXRoaXMuZ2V0RGltZW5zaW9uKCksCi0JCQkJbnVsbCwKLQkJCQkic2l6ZSIsIG51bGwsIDEsIDEsIEdyYXBoTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoRWxlbWVudEVDbGFzcywKLQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsCi0JCQkJIkdyYXBoRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1FbGVtZW50KCksCi0JCQkJdGhpcy5nZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKSwKLQkJCQkiY29udGFpbmVkIiwgbnVsbCwgMCwgLTEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkicG9zaXRpb24iLCBudWxsLCAxLCAxLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9MaW5rKCksCi0JCQkJdGhpcy5nZXREaWFncmFtTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCksCi0JCQkJImxpbmsiLCBudWxsLCAwLCAtMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKSwKLQkJCQl0aGlzLmdldEdyYXBoQ29ubmVjdG9yKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKSwKLQkJCQkiYW5jaG9yYWdlIiwgbnVsbCwgMCwgLTEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKSwKLQkJCQkic2VtYW50aWNNb2RlbCIsIG51bGwsIDEsIDEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsCi0JCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsCi0JCQkJIkRpYWdyYW1FbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGlhZ3JhbUVsZW1lbnRfSXNWaXNpYmxlKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzVmlzaWJsZSIsICJ0cnVlIiwgMSwgMSwgRGlhZ3JhbUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKSwKLQkJCQkiY29udGFpbmVyIiwgbnVsbCwgMCwgMSwgRGlhZ3JhbUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpLAotCQkJCXRoaXMuZ2V0UmVmZXJlbmNlKCksCi0JCQkJdGhpcy5nZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpLAotCQkJCSJyZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgRGlhZ3JhbUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCksCi0JCQkJdGhpcy5nZXRQcm9wZXJ0eSgpLAotCQkJCW51bGwsCi0JCQkJInByb3BlcnR5IiwgbnVsbCwgMCwgLTEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyZWZlcmVuY2VFQ2xhc3MsCi0JCQkJUmVmZXJlbmNlLmNsYXNzLAotCQkJCSJSZWZlcmVuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UmVmZXJlbmNlX0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIiwgImZhbHNlIiwgMSwgMSwgUmVmZXJlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCksCi0JCQkJdGhpcy5nZXREaWFncmFtRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCksCi0JCQkJInJlZmVyZW5jZWQiLCBudWxsLCAxLCAxLCBSZWZlcmVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9wZXJ0eUVDbGFzcywKLQkJCQlQcm9wZXJ0eS5jbGFzcywKLQkJCQkiUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJvcGVydHlfS2V5KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkia2V5IiwgIiIsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidmFsdWUiLCAiIiwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBvaW50RUNsYXNzLAotCQkJCVBvaW50LmNsYXNzLAotCQkJCSJQb2ludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQb2ludF9YKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkieCIsIG51bGwsIDEsIDEsIFBvaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQb2ludF9ZKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkieSIsIG51bGwsIDEsIDEsIFBvaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGlhZ3JhbUxpbmtFQ2xhc3MsCi0JCQkJRGlhZ3JhbUxpbmsuY2xhc3MsCi0JCQkJIkRpYWdyYW1MaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERpYWdyYW1MaW5rX1pvb20oKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJ6b29tIiwgbnVsbCwgMSwgMSwgRGlhZ3JhbUxpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1MaW5rX1ZpZXdwb3J0KCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJInZpZXdwb3J0IiwgbnVsbCwgMSwgMSwgRGlhZ3JhbUxpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1MaW5rX0RpYWdyYW0oKSwKLQkJCQl0aGlzLmdldERpYWdyYW0oKSwKLQkJCQl0aGlzLmdldERpYWdyYW1fRGlhZ3JhbUxpbmsoKSwKLQkJCQkiZGlhZ3JhbSIsIG51bGwsIDEsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50X0xpbmsoKSwKLQkJCQkiZ3JhcGhFbGVtZW50IiwgbnVsbCwgMSwgMSwgRGlhZ3JhbUxpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaENvbm5lY3RvckVDbGFzcywKLQkJCQlHcmFwaENvbm5lY3Rvci5jbGFzcywKLQkJCQkiR3JhcGhDb25uZWN0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCksCi0JCQkJdGhpcy5nZXRHcmFwaEVkZ2UoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWRnZV9BbmNob3IoKSwKLQkJCQkiZ3JhcGhFZGdlIiwgbnVsbCwgMCwgLTEsIEdyYXBoQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpLAotCQkJCSJncmFwaEVsZW1lbnQiLCBudWxsLCAxLCAxLCBHcmFwaENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoRWRnZUVDbGFzcywKLQkJCQlHcmFwaEVkZ2UuY2xhc3MsCi0JCQkJIkdyYXBoRWRnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJIndheXBvaW50cyIsIG51bGwsIDIsIC0xLCBHcmFwaEVkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFZGdlX0FuY2hvcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhDb25uZWN0b3IoKSwKLQkJCQl0aGlzLmdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpLAotCQkJCSJhbmNob3IiLCBudWxsLCAyLCAyLCBHcmFwaEVkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsCi0JCQkJIlNlbWFudGljTW9kZWxCcmlkZ2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTZW1hbnRpY01vZGVsQnJpZGdlX1ByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByZXNlbnRhdGlvbiIsICIiLCAwLCAxLCBTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbSgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKSwKLQkJCQkiZGlhZ3JhbSIsIG51bGwsIDAsIDEsIFNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCksCi0JCQkJImdyYXBoRWxlbWVudCIsIG51bGwsIDAsIDEsIFNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaW1lbnNpb25FQ2xhc3MsCi0JCQkJRGltZW5zaW9uLmNsYXNzLAotCQkJCSJEaW1lbnNpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGltZW5zaW9uX1dpZHRoKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkid2lkdGgiLCBudWxsLCAxLCAxLCBEaW1lbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERpbWVuc2lvbl9IZWlnaHQoKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJoZWlnaHQiLCBudWxsLCAxLCAxLCBEaW1lbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLAotCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsCi0JCQkJIlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpLAotCQkJCXRoaXMuZ2V0VGFza0Rlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImludGVyZmFjZUlPIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLAotCQkJCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmNsYXNzLAotCQkJCSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInR5cGVJbmZvIiwgIiIsIDAsIDEsIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl1bWFTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsCi0JCQkJIlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCksCi0JCQkJdGhpcy5nZXRNZXRob2RFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiZWxlbWVudCIsIG51bGwsIDEsIDEsIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlDb3JlU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywKLQkJCQkiQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0RWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImVsZW1lbnQiLCBudWxsLCAxLCAxLCBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWxlYWZFbGVtZW50RUNsYXNzLAotCQkJCUxlYWZFbGVtZW50LmNsYXNzLAotCQkJCSJMZWFmRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZXh0RWxlbWVudEVDbGFzcywKLQkJCQlUZXh0RWxlbWVudC5jbGFzcywKLQkJCQkiVGV4dEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0VGV4dEVsZW1lbnRfVGV4dCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInRleHQiLCAiIiwgMCwgMSwgVGV4dEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWltYWdlRUNsYXNzLAotCQkJCUltYWdlLmNsYXNzLAotCQkJCSJJbWFnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRJbWFnZV9VcmkoKSwKLQkJCQl0aGlzLmdldFVyaSgpLAotCQkJCSJ1cmkiLCBudWxsLCAwLCAxLCBJbWFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0SW1hZ2VfTWltZVR5cGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJtaW1lVHlwZSIsICIiLCAwLCAxLCBJbWFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcywKLQkJCQlHcmFwaGljUHJpbWl0aXZlLmNsYXNzLAotCQkJCSJHcmFwaGljUHJpbWl0aXZlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBvbHlsaW5lRUNsYXNzLAotCQkJCVBvbHlsaW5lLmNsYXNzLAotCQkJCSJQb2x5bGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQb2x5bGluZV9DbG9zZWQoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiY2xvc2VkIiwgInRydWUiLCAxLCAxLCBQb2x5bGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQb2x5bGluZV9XYXlwb2ludHMoKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkid2F5cG9pbnRzIiwgbnVsbCwgMiwgLTEsIFBvbHlsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQllbGxpcHNlRUNsYXNzLAotCQkJCUVsbGlwc2UuY2xhc3MsCi0JCQkJIkVsbGlwc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RWxsaXBzZV9DZW50ZXIoKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY2VudGVyIiwgbnVsbCwgMSwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9SYWRpdXNYKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkicmFkaXVzWCIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfUmFkaXVzWSgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInJhZGl1c1kiLCBudWxsLCAxLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX1JvdGF0aW9uKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkicm90YXRpb24iLCBudWxsLCAxLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX1N0YXJ0QW5nbGUoKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJzdGFydEFuZ2xlIiwgbnVsbCwgMSwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9FbmRBbmdsZSgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJImVuZEFuZ2xlIiwgbnVsbCwgMSwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NGYW1pbHlFQ2xhc3MsCi0JCQkJUHJvY2Vzc0ZhbWlseS5jbGFzcywKLQkJCQkiUHJvY2Vzc0ZhbWlseSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzRmFtaWx5X0RlbGl2ZXJ5UHJvY2Vzc2VzKCksCi0JCQkJdGhpcy5nZXREZWxpdmVyeVByb2Nlc3MoKSwKLQkJCQludWxsLAotCQkJCSJkZWxpdmVyeVByb2Nlc3NlcyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzRmFtaWx5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kTGlicmFyeUVDbGFzcywKLQkJCQlNZXRob2RMaWJyYXJ5LmNsYXNzLAotCQkJCSJNZXRob2RMaWJyYXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kUGx1Z2luKCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kUGx1Z2lucyIsIG51bGwsIDAsIC0xLCBNZXRob2RMaWJyYXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkicHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0odmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5jbGFzcywKLQkJCQkiVmFyaWFiaWxpdHlUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwKLQkJCQlWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTKTsKLQotCQlpbml0RUVudW0od29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLmNsYXNzLCAiV29ya09yZGVyVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShzdHJpbmdFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywKLQkJCQkiU3RyaW5nIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGJvb2xlYW5FRGF0YVR5cGUsIEJvb2xlYW4uY2xhc3MsCi0JCQkJIkJvb2xlYW4iLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZGF0ZUVEYXRhVHlwZSwgRGF0ZS5jbGFzcywKLQkJCQkiRGF0ZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZSh1cmlFRGF0YVR5cGUsIGphdmEubmV0LlVSSS5jbGFzcywKLQkJCQkiVXJpIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNldEVEYXRhVHlwZSwgU2V0LmNsYXNzLAotCQkJCSJTZXQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc2VxdWVuY2VFRGF0YVR5cGUsIExpc3QuY2xhc3MsCi0JCQkJIlNlcXVlbmNlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGludGVnZXJFRGF0YVR5cGUsIGludC5jbGFzcywKLQkJCQkiSW50ZWdlciIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShkb3VibGVFRGF0YVR5cGUsIERvdWJsZS5jbGFzcywKLQkJCQkiRG91YmxlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9VbWFQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WYXJpYWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVmFyaWFiaWxpdHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBmZmY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WYXJpYWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmlsaXR5RWxlbWVudEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFZhcmlhYmlsaXR5RWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5RWxlbWVudCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQKLQkJCQk6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQlvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQl0aGlzLAotCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LAotCQkJCQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQl0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlICE9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YXJpYWJpbGl0eVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFyaWFiaWxpdHlFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV2hpdGVwYXBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3OGY3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV2hpdGVwYXBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXaGl0ZXBhcGVySW1wbCBleHRlbmRzIENvbmNlcHRJbXBsIGltcGxlbWVudHMgV2hpdGVwYXBlciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2hpdGVwYXBlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV0hJVEVQQVBFUjsKLQl9Ci0KLX0gLy9XaGl0ZXBhcGVySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJlOWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0TGlua1RvUHJlZGVjZXNzb3IgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFdvcmtCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfUkVQRUFUQUJMRV9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1JlcGVhdGFibGUgPSBJU19SRVBFQVRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT25nb2luZygpIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19PTkdPSU5HX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT25nb2luZygpIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzT25nb2luZyA9IElTX09OR09JTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzRXZlbnREcml2ZW4gPSBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVG9QcmVkZWNlc3NvcigpIDxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUb1ByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya09yZGVyPiBsaW5rVG9QcmVkZWNlc3NvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBpc1JlcGVhdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4gbmV3SXNSZXBlYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlID0gaXNSZXBlYXRhYmxlOwotCQlpc1JlcGVhdGFibGUgPSBuZXdJc1JlcGVhdGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwKLQkJCQkJb2xkSXNSZXBlYXRhYmxlLCBpc1JlcGVhdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbmdvaW5nKEJvb2xlYW4gbmV3SXNPbmdvaW5nKSB7Ci0JCUJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlpc09uZ29pbmcgPSBuZXdJc09uZ29pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywKLQkJCQkJb2xkSXNPbmdvaW5nLCBpc09uZ29pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gaXNFdmVudERyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4gbmV3SXNFdmVudERyaXZlbikgewotCQlCb29sZWFuIG9sZElzRXZlbnREcml2ZW4gPSBpc0V2ZW50RHJpdmVuOwotCQlpc0V2ZW50RHJpdmVuID0gbmV3SXNFdmVudERyaXZlbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sCi0JCQkJCW9sZElzRXZlbnREcml2ZW4sIGlzRXZlbnREcml2ZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrT3JkZXI+IGdldExpbmtUb1ByZWRlY2Vzc29yKCkgewotCQlpZiAobGlua1RvUHJlZGVjZXNzb3IgPT0gbnVsbCkgewotCQkJbGlua1RvUHJlZGVjZXNzb3IgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtPcmRlcj4oCi0JCQkJCVdvcmtPcmRlci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SKTsKLQkJfQotCQlyZXR1cm4gbGlua1RvUHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXJldHVybiBnZXRJc1JlcGVhdGFibGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlyZXR1cm4gZ2V0SXNPbmdvaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlyZXR1cm4gZ2V0SXNFdmVudERyaXZlbigpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCXJldHVybiBnZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJc2V0SXNSZXBlYXRhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJc2V0SXNPbmdvaW5nKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlzZXRJc0V2ZW50RHJpdmVuKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrT3JkZXI+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXNldElzUmVwZWF0YWJsZShJU19SRVBFQVRBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlzZXRJc09uZ29pbmcoSVNfT05HT0lOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlzZXRJc0V2ZW50RHJpdmVuKElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXJldHVybiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID09IG51bGwgPyBpc1JlcGVhdGFibGUgIT0gbnVsbAotCQkJCQk6ICFJU19SRVBFQVRBQkxFX0VERUZBVUxULmVxdWFscyhpc1JlcGVhdGFibGUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCXJldHVybiBJU19PTkdPSU5HX0VERUZBVUxUID09IG51bGwgPyBpc09uZ29pbmcgIT0gbnVsbAotCQkJCQk6ICFJU19PTkdPSU5HX0VERUZBVUxULmVxdWFscyhpc09uZ29pbmcpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJcmV0dXJuIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCA9PSBudWxsID8gaXNFdmVudERyaXZlbiAhPSBudWxsCi0JCQkJCTogIUlTX0VWRU5UX0RSSVZFTl9FREVGQVVMVC5lcXVhbHMoaXNFdmVudERyaXZlbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJcmV0dXJuIGxpbmtUb1ByZWRlY2Vzc29yICE9IG51bGwgJiYgIWxpbmtUb1ByZWRlY2Vzc29yLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1JlcGVhdGFibGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNSZXBlYXRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc09uZ29pbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNPbmdvaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0V2ZW50RHJpdmVuOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzRXZlbnREcml2ZW4pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmYjM0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV29ya0RlZmluaXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrRGVmaW5pdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJCW9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlY29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZWNvbmRpdGlvbihuZXdQcmVjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UG9zdGNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3N0Y29uZGl0aW9uCi0JCQkJCQkJLmVJbnZlcnNlQWRkKAotCQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG5ld1Bvc3Rjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbiwgbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFBvc3Rjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlY29uZGl0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gcHJlY29uZGl0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Xb3JrRGVmaW5pdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya09yZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODM5ZTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldFByZWQgPGVtPlByZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrT3JkZXJJbXBsIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJbXBsIGltcGxlbWVudHMgV29ya09yZGVyIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVHlwZSgpIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgTElOS19UWVBFX0VERUZBVUxUID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVHlwZSgpIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVyVHlwZSBsaW5rVHlwZSA9IExJTktfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWQoKSA8ZW0+UHJlZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCkgewotCQlyZXR1cm4gbGlua1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSBuZXdMaW5rVHlwZSkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWxpbmtUeXBlID0gbmV3TGlua1R5cGUgPT0gbnVsbCA/IExJTktfVFlQRV9FREVGQVVMVCA6IG5ld0xpbmtUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRSwgb2xkTGlua1R5cGUsIGxpbmtUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGdldFByZWQoKSB7Ci0JCWlmIChwcmVkICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVkKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlZCA9IChJbnRlcm5hbEVPYmplY3QpIHByZWQ7Ci0JCQlwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWQpOwotCQkJaWYgKHByZWQgIT0gb2xkUHJlZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVELCBvbGRQcmVkLCBwcmVkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGJhc2ljR2V0UHJlZCgpIHsKLQkJcmV0dXJuIHByZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZChXb3JrQnJlYWtkb3duRWxlbWVudCBuZXdQcmVkKSB7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50IG9sZFByZWQgPSBwcmVkOwotCQlwcmVkID0gbmV3UHJlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVELCBvbGRQcmVkLCBwcmVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJcmV0dXJuIGdldExpbmtUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWQoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJc2V0TGlua1R5cGUoKFdvcmtPcmRlclR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQ6Ci0JCQlzZXRQcmVkKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCXNldExpbmtUeXBlKExJTktfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJc2V0UHJlZCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJcmV0dXJuIGxpbmtUeXBlICE9IExJTktfVFlQRV9FREVGQVVMVDsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQ6Ci0JCQlyZXR1cm4gcHJlZCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxpbmtUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxpbmtUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya09yZGVySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjMzFkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGltcGFjdE9mTm90SGF2aW5nID0gSU1QQUNUX09GX05PVF9IQVZJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYXNvbnNGb3JOb3ROZWVkaW5nID0gUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwKLQkJCQkJcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiBpbXBhY3RPZk5vdEhhdmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgbmV3SW1wYWN0T2ZOb3RIYXZpbmcpIHsKLQkJU3RyaW5nIG9sZEltcGFjdE9mTm90SGF2aW5nID0gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWltcGFjdE9mTm90SGF2aW5nID0gbmV3SW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywKLQkJCQkJb2xkSW1wYWN0T2ZOb3RIYXZpbmcsIGltcGFjdE9mTm90SGF2aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyBuZXdSZWFzb25zRm9yTm90TmVlZGluZykgewotCQlTdHJpbmcgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcgPSByZWFzb25zRm9yTm90TmVlZGluZzsKLQkJcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBuZXdSZWFzb25zRm9yTm90TmVlZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORywKLQkJCQkJb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcsIHJlYXNvbnNGb3JOb3ROZWVkaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQlyZXR1cm4gZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQlyZXR1cm4gZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJc2V0UHVycG9zZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJc2V0SW1wYWN0T2ZOb3RIYXZpbmcoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCXNldEltcGFjdE9mTm90SGF2aW5nKElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQlzZXRSZWFzb25zRm9yTm90TmVlZGluZyhSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsCi0JCQkJCTogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCXJldHVybiBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9PSBudWxsID8gaW1wYWN0T2ZOb3RIYXZpbmcgIT0gbnVsbAotCQkJCQk6ICFJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVC5lcXVhbHMoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXJldHVybiBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCA9PSBudWxsID8gcmVhc29uc0Zvck5vdE5lZWRpbmcgIT0gbnVsbAotCQkJCQk6ICFSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMocmVhc29uc0Zvck5vdE5lZWRpbmcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHB1cnBvc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW1wYWN0T2ZOb3RIYXZpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYXNvbnNGb3JOb3ROZWVkaW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlYXNvbnNGb3JOb3ROZWVkaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTE4M2Y5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3Rpdml0eUVudHJ5U3RhdGUgPSBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3Rpdml0eUV4aXRTdGF0ZSA9IEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrUHJvZHVjdCgpIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RlZEJ5KCkgPGVtPkltcGFjdGVkIEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGltcGFjdGVkQnk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RzKCkgPGVtPkltcGFjdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gaW1wYWN0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlbGl2ZXJhYmxlUGFydHMoKSA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZGVsaXZlcmFibGVQYXJ0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFbnRyeVN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgbmV3QWN0aXZpdHlFbnRyeVN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUVudHJ5U3RhdGUgPSBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZSA9IG5ld0FjdGl2aXR5RW50cnlTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUsCi0JCQkJCW9sZEFjdGl2aXR5RW50cnlTdGF0ZSwgYWN0aXZpdHlFbnRyeVN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RXhpdFN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUV4aXRTdGF0ZSkgewotCQlTdHJpbmcgb2xkQWN0aXZpdHlFeGl0U3RhdGUgPSBhY3Rpdml0eUV4aXRTdGF0ZTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUgPSBuZXdBY3Rpdml0eUV4aXRTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSwKLQkJCQkJb2xkQWN0aXZpdHlFeGl0U3RhdGUsIGFjdGl2aXR5RXhpdFN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGdldFdvcmtQcm9kdWN0KCkgewotCQlpZiAod29ya1Byb2R1Y3QgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHdvcmtQcm9kdWN0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkV29ya1Byb2R1Y3QgPSAoSW50ZXJuYWxFT2JqZWN0KSB3b3JrUHJvZHVjdDsKLQkJCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBlUmVzb2x2ZVByb3h5KG9sZFdvcmtQcm9kdWN0KTsKLQkJCWlmICh3b3JrUHJvZHVjdCAhPSBvbGRXb3JrUHJvZHVjdCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNULAotCQkJCQkJCW9sZFdvcmtQcm9kdWN0LCB3b3JrUHJvZHVjdCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3QgYmFzaWNHZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG5ld1dvcmtQcm9kdWN0KSB7Ci0JCVdvcmtQcm9kdWN0IG9sZFdvcmtQcm9kdWN0ID0gd29ya1Byb2R1Y3Q7Ci0JCXdvcmtQcm9kdWN0ID0gbmV3V29ya1Byb2R1Y3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCwKLQkJCQkJb2xkV29ya1Byb2R1Y3QsIHdvcmtQcm9kdWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbXBhY3RlZEJ5KCkgewotCQlpZiAoaW1wYWN0ZWRCeSA9PSBudWxsKSB7Ci0JCQlpbXBhY3RlZEJ5ID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Lk1hbnlJbnZlcnNlPFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlksCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCQl9Ci0JCXJldHVybiBpbXBhY3RlZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW1wYWN0cygpIHsKLQkJaWYgKGltcGFjdHMgPT0gbnVsbCkgewotCQkJaW1wYWN0cyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZTxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQkJfQotCQlyZXR1cm4gaW1wYWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldERlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCWlmIChkZWxpdmVyYWJsZVBhcnRzID09IG51bGwpIHsKLQkJCWRlbGl2ZXJhYmxlUGFydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMpOwotCQl9Ci0JCXJldHVybiBkZWxpdmVyYWJsZVBhcnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbXBhY3RlZEJ5KCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEltcGFjdHMoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEltcGFjdGVkQnkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbXBhY3RzKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXJldHVybiBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRXb3JrUHJvZHVjdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuIGdldEltcGFjdGVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJcmV0dXJuIGdldEltcGFjdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCXJldHVybiBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCXNldEFjdGl2aXR5RXhpdFN0YXRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQlzZXRXb3JrUHJvZHVjdCgoV29ya1Byb2R1Y3QpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCWdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJZ2V0SW1wYWN0ZWRCeSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRJbXBhY3RzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZShBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCXNldEFjdGl2aXR5RXhpdFN0YXRlKEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXNldFdvcmtQcm9kdWN0KChXb3JrUHJvZHVjdCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlnZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXJldHVybiBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCA9PSBudWxsID8gYWN0aXZpdHlFbnRyeVN0YXRlICE9IG51bGwKLQkJCQkJOiAhQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQuZXF1YWxzKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCXJldHVybiBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUV4aXRTdGF0ZSAhPSBudWxsCi0JCQkJCTogIUFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQuZXF1YWxzKGFjdGl2aXR5RXhpdFN0YXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQlyZXR1cm4gd29ya1Byb2R1Y3QgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCXJldHVybiBpbXBhY3RlZEJ5ICE9IG51bGwgJiYgIWltcGFjdGVkQnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlyZXR1cm4gaW1wYWN0cyAhPSBudWxsICYmICFpbXBhY3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCXJldHVybiBkZWxpdmVyYWJsZVBhcnRzICE9IG51bGwgJiYgIWRlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFjdGl2aXR5RW50cnlTdGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhY3Rpdml0eUVudHJ5U3RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdGl2aXR5RXhpdFN0YXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RXhpdFN0YXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmM3NTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RnVsZmlsbHMgPGVtPkZ1bGZpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxmaWxscygpIDxlbT5GdWxmaWxsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdWxmaWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZnVsZmlsbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRzKCkgPGVtPlJlcG9ydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJlcG9ydD4gcmVwb3J0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBsYXRlcygpIDxlbT5UZW1wbGF0ZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcGxhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGVtcGxhdGU+IHRlbXBsYXRlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2xNZW50b3JzKCkgPGVtPlRvb2wgTWVudG9yczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sTWVudG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRvb2xNZW50b3I+IHRvb2xNZW50b3JzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCkgewotCQlpZiAoZnVsZmlsbHMgPT0gbnVsbCkgewotCQkJZnVsZmlsbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oCi0JCQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTKTsKLQkJfQotCQlyZXR1cm4gZnVsZmlsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UmVwb3J0PiBnZXRSZXBvcnRzKCkgewotCQlpZiAocmVwb3J0cyA9PSBudWxsKSB7Ci0JCQlyZXBvcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSZXBvcnQ+KFJlcG9ydC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFMpOwotCQl9Ci0JCXJldHVybiByZXBvcnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKSB7Ci0JCWlmICh0ZW1wbGF0ZXMgPT0gbnVsbCkgewotCQkJdGVtcGxhdGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUZW1wbGF0ZT4oVGVtcGxhdGUuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURVMpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VG9vbE1lbnRvcj4gZ2V0VG9vbE1lbnRvcnMoKSB7Ci0JCWlmICh0b29sTWVudG9ycyA9PSBudWxsKSB7Ci0JCQl0b29sTWVudG9ycyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8VG9vbE1lbnRvcj4oCi0JCQkJCVRvb2xNZW50b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMpOwotCQl9Ci0JCXJldHVybiB0b29sTWVudG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJaWYgKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9PSBudWxsKSB7Ci0JCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4oCi0JCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUzoKLQkJCXJldHVybiBnZXRGdWxmaWxscygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJcmV0dXJuIGdldFJlcG9ydHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTOgotCQkJcmV0dXJuIGdldFRlbXBsYXRlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCWdldEZ1bGZpbGxzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRnVsZmlsbGFibGVFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJZ2V0UmVwb3J0cygpLmNsZWFyKCk7Ci0JCQlnZXRSZXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXBvcnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCWdldFRlbXBsYXRlcygpLmNsZWFyKCk7Ci0JCQlnZXRUZW1wbGF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRlbXBsYXRlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlnZXRUb29sTWVudG9ycygpCi0JCQkJCS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRvb2xNZW50b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFM6Ci0JCQlnZXRSZXBvcnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTOgotCQkJZ2V0VGVtcGxhdGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJcmV0dXJuIHJlcG9ydHMgIT0gbnVsbCAmJiAhcmVwb3J0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCXJldHVybiB0ZW1wbGF0ZXMgIT0gbnVsbCAmJiAhdGVtcGxhdGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTE5YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3RUeXBlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0cygpIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiB3b3JrUHJvZHVjdHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0V29ya1Byb2R1Y3RzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KAotCQkJCQlXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gd29ya1Byb2R1Y3RzICE9IG51bGwgJiYgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0VHlwZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBmYjc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0Mzg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQXNzb2NpYXRpb25IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDc0ZWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBuYXZpZ2F0aW5nIGFuZCBxdWVyeWluZyBiaWRpcmVjdGlvbmFsIGFzc29jaWF0aW9ucyBhbW9uZwotICogdGhlIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uSGVscGVyIHsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYSB0YXNrIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVGFza19EaXNjaXBsaW5lcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUYXNrLmNsYXNzLAotCQkJIlRhc2tfRGlzY2lwbGluZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggYXJlCi0JICogY3JlYXRlZCBmcm9tIGEgc3BlY2lmaWMgdGFzay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUYXNrX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUYXNrLmNsYXNzLAotCQkJIlRhc2tfVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZG9tYWlucyB3aGljaCBhIHdvcmsgcHJvZHVjdAotCSAqIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X0RvbWFpbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfRG9tYWlucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFza3Mgd2hpY2ggcHJvZHVjZSBhIHdvcmsKLQkgKiBwcm9kdWN0IGFzIGFuIG91dHB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCB1c2UgYSB3b3JrCi0JICogcHJvZHVjdCBhcyBhIG1hbmRhdG9yeSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X0lucHV0VG9fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHdvcmsgcHJvZHVjdCB0eXBlcyB3aGljaCBhCi0JICogd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcmVzcG9uc2libGUgcm9sZXMgZm9yIGEgd29yawotCSAqIHByb2R1Y3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyYWJsZXMgd2hpY2ggYSB3b3JrCi0JICogcHJvZHVjdCBpcyBjb250YWluZWQgaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X0RlbGl2ZXJhYmxlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB0aGF0IHVzZSBhIHdvcmsgcHJvZHVjdAotCSAqIGFzIGFuIG9wdGlvbmFsIGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JICogd2hpY2ggYXJlIGNyZWF0ZWQgZnJvbSBhIHdvcmsgcHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdERlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByaW1hcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfUHJpbWFyeV9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUHJpbWFyeV9UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc2Vjb25kYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1NlY29uZGFyeV9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfU2Vjb25kYXJ5X1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIHNldHMgd2hpY2ggYSByb2xlIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZV9Sb2xlU2V0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUm9sZVNldHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbXBvc2l0ZSByb2xlcyB3aGljaAotCSAqIGluY2x1ZGVzIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX0NvbXBvc2l0ZVJvbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9Db21wb3NpdGVSb2xlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlCi0JICogY3JlYXRlZCBmcm9tIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1JvbGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUm9sZURlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogY2hlY2tsaXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDaGVja2xpc3RfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNoZWNrbGlzdC5jbGFzcywKLQkJCSJDaGVja2xpc3RfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgY2hlY2tsaXN0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENoZWNrbGlzdF9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDaGVja2xpc3QuY2xhc3MsCi0JCQkiQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBjb25jZXB0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbmNlcHRfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJDb25jZXB0X0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhbiBleGFtcGxlIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEV4YW1wbGVfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJFeGFtcGxlX0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhIFJldXNhYmxlQXNzZXQgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUmV1c2FibGVBc3NldF9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb25jZXB0LmNsYXNzLAotCQkJIlJldXNhYmxlQXNzZXRfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIGNvbmNlcHQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbmNlcHRfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNvbmNlcHQuY2xhc3MsCi0JCQkiQ29uY2VwdF9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGFuCi0JICogZXhhbXBsZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRXhhbXBsZV9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJRXhhbXBsZS5jbGFzcywKLQkJCSJFeGFtcGxlX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUmVwb3J0X1dvcmtQcm9kdWN0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSZXBvcnQuY2xhc3MsCi0JCQkiUmVwb3J0X1dvcmtQcm9kdWN0cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFza3Mgd2hpY2ggYQotCSAqIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJlcG9ydC5jbGFzcywKLQkJCSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0cyB3aGljaCBhCi0JICogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfV29ya1Byb2R1Y3RzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJlcG9ydC5jbGFzcywKLQkJCSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIHJldXNhYmxlIGFzc2V0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSZXVzYWJsZUFzc2V0X0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSZXVzYWJsZUFzc2V0LmNsYXNzLAotCQkJIlJldXNhYmxlQXNzZXRfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSByb2FkbWFwIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvYWRtYXBfQWN0aXZpdGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvYWRtYXAuY2xhc3MsCi0JCQkiUm9hZG1hcF9BY3Rpdml0ZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBmdWxmaWxscyBlbGVtZW50cyB3aGljaCBhIHdvcmtwcm9kdWN0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEZ1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywKLQkJCSJGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgc3VwcG9ydGluZwotCSAqIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJIlN1cHBvcnRpbmdNYXRlcmlhbF9CcmVha2Rvd25FbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogc3VwcG9ydGluZyBtYXRlcmlhbCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIHdoaWNoIGEKLQkgKiBjb21tdW5pY2F0aW9uIHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9Db21tdW5pY2F0aW9uc19EZWxpdmVyeVByb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0NvbW11bmljYXRpb25zX0RlbGl2ZXJ5UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyB3aGljaCBhbgotCSAqIGVkdWNhdGlvbiBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfRWR1Y2F0aW9uX0RlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfRWR1Y2F0aW9uX0RlbGl2ZXJ5UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgdW5pdHMgd2hpY2ggYQotCSAqIGNvcHlyaWdodCBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQ29weXJpZ2h0U3RhdGVtZW50X01ldGhvZFVuaXRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfQ29weXJpZ2h0U3RhdGVtZW50X01ldGhvZFBsdWdpbnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBndWlkZWxpbmUgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEd1aWRlbGluZV9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJR3VpZGVsaW5lLmNsYXNzLAotCQkJIkd1aWRlbGluZV9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBndWlkZWxpbmUKLQkgKiBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgR3VpZGVsaW5lX0JyZWFrZG93bkVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUd1aWRlbGluZS5jbGFzcywKLQkJCSJHdWlkZWxpbmVfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHdvcmsgcHJvZHVjdHMgd2hpY2ggYQotCSAqIHRlbXBsYXRlIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUZW1wbGF0ZV9Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkiVGVtcGxhdGVfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRvb2wgd2hpY2ggYSB0b29sIG1lbnRvciBpcwotCSAqIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRvb2xNZW50b3JfVG9vbHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCSJUb29sTWVudG9yX1Rvb2xzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCBhIHRvb2wgbWVudG9yIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRvb2xNZW50b3JfVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCSJUb29sTWVudG9yX1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB3b3JrIHByb2R1Y3RzIHdoaWNoIGEgdG9vbAotCSAqIG1lbnRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVG9vbE1lbnRvcl9Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkiVG9vbE1lbnRvcl9Xb3JrUHJvZHVjdHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgd2hpY2ggYQotCSAqIGRlc2NyaWJhYmxlIGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIERlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywKLQkJCSJDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcmFjdGljZXMgcmVmZXJlbmNlZCBieSBhCi0JICogY29udGVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb250ZW50RWxlbWVudC5jbGFzcywKLQkJCSJDb250ZW50RWxlbWVudF9QcmFjdGljZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieQotCSAqIGEgbWV0aG9kIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kUGx1Z2luX0RpcmVjdEV4dGVuc2lvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJIk1ldGhvZFBsdWdpbl9EaXJlY3RFeHRlbnNpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBtZXRob2QgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RQbHVnaW5fTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJIk1ldGhvZFBsdWdpbl9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBwYWNrYWdlcwotCSAqIHVzZWQvcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBhY2thZ2VfVXNpbmdQYWNrYWdlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RQYWNrYWdlLmNsYXNzLAotCQkJIk1ldGhvZFBhY2thZ2VfVXNpbmdQYWNrYWdlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIG1ldGhvZCBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGFja2FnZS5jbGFzcywKLQkJCSJNZXRob2RQYWNrYWdlX01ldGhvZENvbmZpZ3VyYXRpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBDdXN0b21DYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDdXN0b21DYXRlZ29yeV9NZXRob2RDb25maWd1cmF0aW9ucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDdXN0b21DYXRlZ29yeS5jbGFzcywKLQkJCSJDdXN0b21DYXRlZ29yeV9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURpc2NpcGxpbmUuY2xhc3MsCi0JCQkiRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmVzIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUgKGllLCBhIHN1YmRpc2NpcGxpbmUpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1YmRpc2NpcGxpbmVfRGlzY2lwbGluZSA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlEaXNjaXBsaW5lLmNsYXNzLAotCQkJIlN1YmRpc2NpcGxpbmVfRGlzY2lwbGluZSIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIHNldCBncm91cGluZ3Mgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgcm9sZSBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlU2V0LmNsYXNzLAotCQkJIlJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc3VjY2Vzc29yIG9mIGEgd29yayBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrT3JkZXJfU3VjY2Vzc29yID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtPcmRlci5jbGFzcywKLQkJCSJXb3JrT3JkZXJfU3VjY2Vzc29yIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHN1Y2Nlc3NvciBsaW5rIG9mIGEgd29yawotCSAqIGJyZWFrZG93biBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1N1Y2Nlc3NvciA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywKLQkJCSJXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9TdWNjZXNzb3IiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfUHJlZCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBpbW1lZGlhdGUgdmFyaWF0aWVzIG9mIGEKLQkgKiB2YXJpYWJpbGl0eSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLAotCQkJIlZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBzdWNjZXNzb3JzIHRvIGEgc2VjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTZWN0aW9uX1N1Y2Nlc3NvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU2VjdGlvbi5jbGFzcywKLQkJCSJTZWN0aW9uX1N1Y2Nlc3NvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggYQotCSAqIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFNlY3Rpb25fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVNlY3Rpb24uY2xhc3MsCi0JCQkiU2VjdGlvbl9UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0ZWFtIHByb2ZpbGVzIHdoaWNoIGluY2x1ZGVzCi0JICogYSBzcGVjaWZpYyByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfVGVhbVByb2ZpbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJIlJvbGVEZXNjcmlwdG9yX1RlYW1Qcm9maWxlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcmltYXJ5IHRhc2sgZGVzY3JpcHRvcnMKLQkgKiBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCSJSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWRkaXRpb25hbCB0YXNrIGRlc2NyaXB0b3JzCi0JICogcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFzc2lzdGluZyB0YXNrIGRlc2NyaXB0b3JzCi0JICogcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVwZW5kZW50IHByb2Nlc3NlcwotCSAqIHJlZmVyZW5jZWQgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RDb25maWd1cmF0aW9uX0RlcGVuZGVudFByb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJIk1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB2YWxpZCBwcm9jZXNzZXMgcmVmZXJlbmNlZCBpbgotCSAqIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kQ29uZmlndXJhdGlvbl9WYWxpZENvbnRleHRfUHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsCi0JCQkiTWV0aG9kQ29uZmlndXJhdGlvbl9WYWxpZENvbnRleHRfUHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaAotCSAqIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbiBvdXRwdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYQotCSAqIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG9wdGlvbmFsIGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYQotCSAqIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG1hbmRhdG9yeSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhCi0JICogd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4gZXh0ZXJuYWwgaW5wdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCB0cnVlKTsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcm9sZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUKLQkgKiByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycyB3aGljaAotCSAqIGNvbnRhaW4gYSBzcGVjaWZpYyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhbiBhY3Rpdml0eQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBBY3Rpdml0eV9EaXNjaXBsaW5lcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlBY3Rpdml0eS5jbGFzcywKLQkJCSJBY3Rpdml0eV9EaXNjaXBsaW5lcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByYWN0aWNlcyB3aGljaCBhbiBhY3Rpdml0eQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBBY3Rpdml0eV9QcmF0aWNlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlBY3Rpdml0eS5jbGFzcywKLQkJCSJBY3Rpdml0eV9QcmF0aWNlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIHBsYW5uaW5nIHRlbXBsYXRlcwotCSAqIHdoaWNoIGEgcHJvY2VzcyBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUHJvY2Vzcy5jbGFzcywKLQkJCSJQcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJvY2VzZXNzIHdoaWNoIHJlZmVyZW5jZXMgYQotCSAqIGNhcGFiaWxpdHkgcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDYXBhYmlsaXR5UGF0dGVybl9Db25zdW1pbmdQcm9jZXNzZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MsCi0JCQkiQ2FwYWJpbGl0eVBhdHRlcm5fQ29uc3VtaW5nUHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGJyZWFrZG93biBlbGVtZW50IHdoaWNoIGlzCi0JICogZGlzcGxheWVkIGJlZm9yZSBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkiQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIHRydWUsCi0JCQlmYWxzZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGJyZWFrZG93biBlbGVtZW50IHdoaWNoIGlzCi0JICogZGlzcGxheWVkIGFmdGVyIGEgYnJlYWtkb3duIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlciA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlCcmVha2Rvd25FbGVtZW50LmNsYXNzLAotCQkJIkJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLCB0cnVlLAotCQkJZmFsc2UpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBVTUEgc2VtYXRpYyBtb2RlbCBicmlkZ2VzCi0JICogcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZEVsZW1lbnRfVU1BU2VtYXRpY01vZGVsQnJpZGdlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RFbGVtZW50LmNsYXNzLAotCQkJIk1ldGhvZEVsZW1lbnRfVU1BU2VtYXRpY01vZGVsQnJpZGdlcyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLCB0cnVlLAotCQkJZmFsc2UpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IHByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzOwotCi0Jc3RhdGljIHsKLQkJcmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgcHJlZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFzc29jaWF0aW9uSGVscGVyIG9iamVjdCA9IG5ldyBBc3NvY2lhdGlvbkhlbHBlcigpOwotCQlGaWVsZFtdIGZpZWxkcyA9IG9iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJCWludCBtb2QgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtb2QpICYmIE1vZGlmaWVyLmlzU3RhdGljKG1vZCkKLQkJCQkJJiYgTW9kaWZpZXIuaXNGaW5hbChtb2QpCi0JCQkJCSYmIGZpZWxkLmdldFR5cGUoKSA9PSBPcHBvc2l0ZUZlYXR1cmUuY2xhc3MpIHsKLQkJCQl0cnkgewotCQkJCQlwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5hZGQoZmllbGQuZ2V0KG9iamVjdCkpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogU3lzdGVtLm91dAotCQkgKiAucHJpbnRsbigiQXNzb2NpYXRpb25IZWxwZXIucmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpOgotCQkgKiBkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzOiAiICsgcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMuc2l6ZSgpKTsKLQkJICogLy8kTk9OLU5MUy0xJCBTeXN0ZW0ub3V0LnByaW50bG4ocHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMpOwotCQkgKi8KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUucmVnaXN0ZXJPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmVkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycyB3aGljaCBjb250YWluIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QKLQkgKiBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgZGVsaXZlcmFibGUgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbgotCSAqIGV4dGVybmFsIGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFeHRlcm5hbElucHV0VG8oV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwZCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYQotCSAqIG1hbmRhdG9yeSBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWFuZGF0b3J5SW5wdXRUbyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4KLQkgKiBvcHRpb25hbCBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3B0aW9uYWxJbnB1dFRvKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHdoaWNoIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCSAqIGFzIGFuIG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3V0cHV0RnJvbShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHdwZAotCSAqICAgICAgICAgICAgYSB3b3JrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSB3cGQKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0aGUgZGVwZW5kZW50IHByb2Nlc3NlcyByZWZlcmVuY2VkIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVwZW5kZW50UHJvY2Vzc2VzKE1ldGhvZENvbmZpZ3VyYXRpb24gZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKE1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZWFtIHByb2ZpbGVzIHdoaWNoIGluY2x1ZGVzIGEgc3BlY2lmaWMgcm9sZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRlYW0gcHJvZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKFJvbGVEZXNjcmlwdG9yIGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9UZWFtUHJvZmlsZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByYWN0aWNlcyByZWZlcmVuY2VkIGJ5IGEgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByYWN0aWNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmFjdGljZXMoQ29udGVudEVsZW1lbnQgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKENvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdG9vbCB3aGljaCBhIHRvb2wgbWVudG9yIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHRvb2wgbWVudG9yCi0JICogQHJldHVybiBhIHRvb2wKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8PyBleHRlbmRzIFRvb2xNZW50b3I+IGdldFRvb2xzKFRvb2xNZW50b3IgdG9vbE1lbnRvcikgewotCQlyZXR1cm4gKExpc3Q8PyBleHRlbmRzIFRvb2xNZW50b3I+KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB0b29sTWVudG9yKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShUb29sTWVudG9yX1Rvb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdWNjZXNzb3JzIHRvIGEgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBzZWN0aW9uCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygc2VjdGlvbnMgdGhhdCBhcmUgcG9zdGlvbmVkIGFmdGVyIHRoZSBnaXZlbiBzZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFN1Y2Nlc3NvcnMoU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgc2VjdGlvbikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoU2VjdGlvbl9TdWNjZXNzb3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbW1lZGlhdGUgdmFyaWF0aWVzIG9mIGEgdmFyaWFiaWxpdHkgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgaW1tZWRpYXRlIHZhcmlhdGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJbW1lZGlhdGVWYXJpZXRpZXMoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShWYXJpYWJpbGl0eUVsZW1lbnRfSW1tZWRpYXRlVmFyaWV0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmltYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgYSByb2xlCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UHJpbWFyeVRhc2tzKFJvbGUgcm9sZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVfUHJpbWFyeV9UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2Vjb25kYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgYSByb2xlCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2Vjb25kYXJ5VGFza3MoUm9sZSByb2xlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZV9TZWNvbmRhcnlfVGFza3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1Y2Nlc3NvciBsaW5rIG9mIGEgd29yayBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBicmVhayBkb3duIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBsaW5rcyB0byB3b3JrIGJyZWFrZG93biBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMaW5rVG9TdWNjZXNzb3IoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvU3VjY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdWNjZXNzb3Igb2YgYSB3b3JrIG9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrT3JkZXIKLQkgKiAgICAgICAgICAgIGEgd29yayBvcmRlcgotCSAqIEByZXR1cm4gYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBnZXRTdWNjZXNzb3IoV29ya09yZGVyIHdvcmtPcmRlcikgewotCQlyZXR1cm4gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3b3JrT3JkZXIpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtPcmRlcl9TdWNjZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2tzIHdoaWNoIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgYXMgYW4gb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRPdXRwdXR0aW5nVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFza3Mgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGFzIGEgbWFuZGF0b3J5IGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfTWFuZGF0b3J5SW5wdXRUb19UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzcG9uc2libGUgcm9sZXMgZm9yIGEgd29yayBwcm9kdWN0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZXNwb25zaWJsZVJvbGVzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgd3AuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiB3b3JrIHByb2R1Y3RzIGZvciB3aGljaCBnaXZlbiB3b3JrIHByb2R1Y3QgZnVsZmlsbHMuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RnVsbEZpbGxzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgd3AuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgcHJvZHVjdHMgbW9kaWZpZWQgYnkgYSByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB3b3JrIHByb2R1Y3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKFJvbGUgcm9sZSkgewotCQlMaXN0IHBlcmZvcm1zID0gZ2V0UHJpbWFyeVRhc2tzKHJvbGUpOwotCQlMaXN0IG1vZGlmaWVzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJaWYgKHBlcmZvcm1zICE9IG51bGwgJiYgcGVyZm9ybXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gcGVyZm9ybXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGkubmV4dCgpOwotCi0JCQkJLy8gZm9yIGVhY2ggdGFzaywgZ2V0IG91dHB1dCB3b3JrIHByb2R1Y3Q7Ci0JCQkJTGlzdCBvdXRwdXRXUHMgPSB0YXNrLmdldE91dHB1dCgpOwotCQkJCWlmIChvdXRwdXRXUHMgIT0gbnVsbCAmJiBvdXRwdXRXUHMuc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0V1BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCWlmICghbW9kaWZpZXMuY29udGFpbnMod3ApKSB7Ci0JCQkJCQkJCW1vZGlmaWVzLmFkZCh3cCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGVzIHRoYXQgbW9kaWZ5IGEgd29yayBwcm9kdWN0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNb2RpZmllZEJ5KFdvcmtQcm9kdWN0IHdwKSB7Ci0JCUxpc3Qgb3V0cHV0RnJvbSA9IEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dHRpbmdUYXNrcyh3cCk7Ci0JCVVuaXF1ZUVMaXN0PFJvbGU+IG1vZGlmaWVzID0gbmV3IFVuaXF1ZUVMaXN0PFJvbGU+KCk7Ci0JCWlmIChvdXRwdXRGcm9tICE9IG51bGwgJiYgb3V0cHV0RnJvbS5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0RnJvbS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8JZm9yIGVhY2ggdGFzayBnZXQsIGdldCBwcmltYXJ5IHBlcmZvcm1lciByb2xlCi0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQltb2RpZmllcy5hZGRBbGwodGFzay5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY2lwbGluZSBncm91cGluZ3Mgd2hpY2ggY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUuCi0JICogCi0JICogQHBhcmFtIGRpc2NpcGxpbmUKLQkgKiAgICAgICAgICAgIGEgZGlzY2lwbGluZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGRpc2NpcGxpbmUgZ3JvdXBpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERpc2NpcGxpbmVHcm91cHMoRGlzY2lwbGluZSBkaXNjaXBsaW5lKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZGlzY2lwbGluZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjaXBsaW5lIHdoaWNoIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBzdWJkaXNjaXBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBkaXNjaXBsaW5lCi0JICogICAgICAgICAgICBhIGRpc2NpcGxpbmUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkaXNjaXBsaW5lIGdyb3VwaW5ncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREaXNjaXBsaW5lKERpc2NpcGxpbmUgc3ViZGlzY2lwbGluZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHN1YmRpc2NpcGxpbmUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFN1YmRpc2NpcGxpbmVfRGlzY2lwbGluZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZG9tYWlucyB3aGljaCBhIHdvcmsgcHJvZHVjdCBpcyBjYXRlZ29yaXplZCB1bmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGRvbWFpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREb21haW5zKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3ApCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X0RvbWFpbnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgc2V0IGdyb3VwaW5ncyB3aGljaCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgcm9sZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJvbGVTZXQKLQkgKiAgICAgICAgICAgIGEgcm9sZSBzZXQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIHNldCBncm91cGluZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um9sZVNldEdyb3VwcyhSb2xlU2V0IHJvbGVTZXQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlU2V0KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlU2V0X1JvbGVTZXRHcm91cHBpbmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByb2xlIHNldHMgd2hpY2ggYSByb2xlIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIHNldHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um9sZVNldHMoUm9sZSByb2xlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZV9Sb2xlU2V0cyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIGEgdGFzay4KLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqICAgICAgICAgICAgYSB0YXNrCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUYXNrRGVzY3JpcHRvcnMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiAoTGlzdCkgdGFzay5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShUYXNrX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYSB0YXNrIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogICAgICAgICAgICBhIHRhc2sKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkaXNjaXBsaW5lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREaXNjaXBsaW5lcyhUYXNrIHRhc2spIHsKLQkJcmV0dXJuIChMaXN0KSB0YXNrLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFRhc2tfRGlzY2lwbGluZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc2NpcGxpbmVzIHdoaWNoIGFuIGFjdGl2aXR5IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiAgICAgICAgICAgIGFuIGFjdGl2aXR5Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgZGlzY2lwbGluZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGlzY2lwbGluZXMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJcmV0dXJuIChMaXN0KSBhY3Rpdml0eS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShBY3Rpdml0eV9EaXNjaXBsaW5lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJpbWFyeSB0YXNrIGRlc2NyaXB0b3JzIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZURlc2MpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkZGl0aW9uYWwgdGFzayBkZXNjcmlwdG9ycyBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGVEZXNjKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhc3Npc3RpbmcgdGFzayBkZXNjcmlwdG9ycyBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlRGVzYykKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd29yayBwcm9kdWN0IHR5cGVzIHdoaWNoIGEgd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB3b3JrIHByb2R1Y3QgdHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V29ya1Byb2R1Y3RUeXBlcyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXN0b20gY2F0ZWdvcmllcyB3aGljaCBhIGRlc2NyaWJhYmxlIGVsZW1lbnQgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGguCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIGRlc2NyaWJhYmxlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBjdXN0b20gY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDdXN0b21DYXRlZ29yaWVzKERlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIERlbGl2ZXJhYmxlcyB3aGljaCBhIFdvcmtQcm9kdWN0IGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSBXb3JrUHJvZHVjdCBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgRGVsaXZlcmFibGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERlbGl2ZXJhYmxlcyhXb3JrUHJvZHVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRQbHVnaW5EaXJlY3RFeHRlbnNpb25zKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIChMaXN0PE1ldGhvZFBsdWdpbj4pICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBsdWdpbikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kUGx1Z2luX0RpcmVjdEV4dGVuc2lvbnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgZWxlbWVudCByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVNldCByZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgZU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudDsKLQotCQlpZiAoZU9iai5iYXNpY0dldE9wcG9zaXRlRmVhdHVyZU1hcCgpID09IG51bGwpCi0JCQlyZXR1cm4gcmVmZXJlbmNlczsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlyZWZlcmVuY2VzLmFkZEFsbCgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlcy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+IGdldFJlZmVyZW5jZU1hcChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gb2JqZWN0VG9GZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4oKTsKLQotCQlNdWx0aVJlc291cmNlRU9iamVjdCBlT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCi0JCWlmIChlT2JqLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG9iamVjdFRvRmVhdHVyZXNNYXA7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSBvYmplY3RUb0ZlYXR1cmVzTWFwCi0JCQkJCQkJLmdldChvYmplY3QpOwotCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJCQkJCW9iamVjdFRvRmVhdHVyZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQkJOwotCQkJfSBlbHNlIHsKLQkJCQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gb2JqZWN0VG9GZWF0dXJlc01hcAotCQkJCQkJCS5nZXQob2JqZWN0KTsKLQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCQkJCQlvYmplY3RUb0ZlYXR1cmVzTWFwLnB1dChvYmplY3QsIGZlYXR1cmVzKTsKLQkJCQkJfQotCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iamVjdFRvRmVhdHVyZXNNYXA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGluaXQoKSB7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBzZXQgb2YgZWxlbWVudHMsIHJldHVybnMgdGhlIHNldCBvZiB0aG9zZSBlbGVtZW50cyBwbHVzIGFueQotCSAqIHZhcmlhYmlsaXR5IGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50U2V0Ci0JICogICAgICAgICAgICBhIHNldCBvZiBtZXRob2QgZWxlbWVudHMgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJpbGl0eQotCSAqICAgICAgICAgICAgZWxlbWVudHMKLQkgKiBAcGFyYW0gZ2V0QmFzZXMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZWN1cnNlIGludG8gdGhlIHZhcmlhYmlsaXR5IGJhc2UKLQkgKiAgICAgICAgICAgIGVsZW1lbnRzICgidXAgdGhlIHRyZWUiKQotCSAqIEBwYXJhbSBnZXRDaGlsZHJlbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJlY3Vyc2UgaW50byB0aGUgdmFyaWV0aWVzICgiZG93biB0aGUKLQkgKiAgICAgICAgICAgIHRyZWUiKQotCSAqIEByZXR1cm4gYSBjb2xsZWN0aXZlIHNldCBvZiBtZXRob2QgZWxlbWVudHMgcGx1cyB0aGUgYXNzb2NpYXRlZAotCSAqICAgICAgICAgdmFyaWFiaWxpdHkgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRWYXJpYWJpbGl0eUVsZW1lbnRzKFNldCBlbGVtZW50U2V0LCBib29sZWFuIGdldEJhc2VzLAotCQkJYm9vbGVhbiBnZXRDaGlsZHJlbikgewotCQlpZiAoZWxlbWVudFNldCAhPSBudWxsICYmICFlbGVtZW50U2V0LmlzRW1wdHkoKSkgewotCQkJU2V0IHZhclNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvOwotCQkJCQlpZiAoZ2V0Q2hpbGRyZW4pCi0JCQkJCQl2YXJTZXQuYWRkQWxsKGdldEltbWVkaWF0ZVZhcmlldGllcyhlbGVtZW50KSk7Ci0JCQkJCWlmIChnZXRCYXNlcwotCQkJCQkJCSYmIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpCi0JCQkJCQl2YXJTZXQuYWRkKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodmFyU2V0LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZWxlbWVudFNldDsKLQkJCWlmIChlbGVtZW50U2V0LmNvbnRhaW5zQWxsKHZhclNldCkpCi0JCQkJcmV0dXJuIGVsZW1lbnRTZXQ7Ci0JCQllbGVtZW50U2V0LmFkZEFsbCh2YXJTZXQpOwotCQkJZWxlbWVudFNldC5hZGRBbGwoZ2V0VmFyaWFiaWxpdHlFbGVtZW50cyhlbGVtZW50U2V0LCBnZXRCYXNlcywKLQkJCQkJZ2V0Q2hpbGRyZW4pKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudFNldDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL0NvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1ZTc4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGNyZWF0aW9uIG9mIGNvbnRlbnQgZGVzY3JpcHRpb25zLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeSB7Ci0KLQkvLyBNYXBzIENvbnRlbnRFbGVtZW50IGltcGxlbWVudGF0aW9uIENsYXNzIHRvIENvbnRlbnREZXNjaXB0aW9uSW5mby4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8RUNsYXNzLCBFQ2xhc3M+IGNvbnRlbnREZXNjQ2xhc3NNYXAgPSBuZXcgSGFzaE1hcDxFQ2xhc3MsIEVDbGFzcz4oKTsKLQotCXN0YXRpYyB7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGFtcGxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0KLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dCgKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0KLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBoYXNlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uVHlwZShFQ2xhc3MgZGVzY3JpYmFibGVFbGVtZW50VHlwZSkgewotCQlFQ2xhc3MgdHlwZSA9IChFQ2xhc3MpIGNvbnRlbnREZXNjQ2xhc3NNYXAuZ2V0KGRlc2NyaWJhYmxlRWxlbWVudFR5cGUpOwotCQlpZih0eXBlID09IG51bGwgJiYgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkuaXNTdXBlclR5cGVPZihkZXNjcmliYWJsZUVsZW1lbnRUeXBlKSkgewotCQkJdHlwZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBjb250ZW50RGVzY0NsYXNzTWFwLmdldChlLmVDbGFzcygpKTsKLQkJaWYgKGVDbGFzcyA9PSBudWxsKSB7Ci0JCQllQ2xhc3MgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfQotCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZShlQ2xhc3MpOwotCQljb250ZW50LnNldE5hbWUoVW1hVXRpbC5jcmVhdGVDb250ZW50RGVzY3JpcHRpb25OYW1lKGUpKTsKLQkJY29udGVudC5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKGUuZ2V0R3VpZCgpKSk7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCBmb3IgdGhlIGdpdmVuIENvbnRlbnRFbGVtZW50IGFuZAotCSAqIHNhdmUgaXQgdG8gYSBmaWxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihEZXNjcmliYWJsZUVsZW1lbnQgZSkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RWxlbWVudCBlKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHNhdmVDb250ZW50T25seQotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKERlc2NyaWJhYmxlRWxlbWVudCBlKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUsIGJvb2xlYW4gc2F2ZUNvbnRlbnRPbmx5KSB7Ci0JCS8vIGlmICggZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkvLyB7Ci0JCS8vIHJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKENvbnRlbnRFbGVtZW50KWUsIHNhdmVDb250ZW50T25seSk7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyByZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKGUpOwotCi0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnRFbGVtZW50IGUsCi0JCQlib29sZWFuIHNhdmVDb250ZW50T25seSkgewotCQlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKERlc2NyaWJhYmxlRWxlbWVudCkgZSk7Ci0KLQkJLy8gU2V0IGRlc2NyaXB0aW9ucyA9IChTZXQpCi0JCS8vIGNvbnRlbnREZXNjcmlwdGlvbnNNYXAuZ2V0KGRlc2NJbmZvLnBhY2thZ2VOYW1lKTsKLQkJLy8gaWYoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJLy8gZGVzY3JpcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gY29udGVudERlc2NyaXB0aW9uc01hcC5wdXQoZGVzY0luZm8ucGFja2FnZU5hbWUsIGRlc2NyaXB0aW9ucyk7Ci0JCS8vIH0KLQkJLy8gZGVzY3JpcHRpb25zLmFkZChkZXNjcmlwdGlvbik7Ci0KLQkJLy8gc2F2aW5nIENvbnRlbnREZXNjcmlwdGlvbiByaWdodCBhZnRlciBpdHMgY3JlYXRpb24gaXQgbm8gbG9uZ2VyCi0JCS8vIG5lZWRlZCBzaW5jZSBDb250ZW50RGVzY3JpcHRpb24gaXMKLQkJLy8gbm93IGNvbnRhaW5lZCBieSBhIERlc2NyaWJhYmxlRWxlbWVudAotCQkvLwotCQkvLyBpZihsaWJQZXJzaXN0ZXIgIT0gbnVsbCkgewotCQkvLyBsaWJQZXJzaXN0ZXIuc2F2ZShlLCBkZXNjcmlwdGlvbiwgc2F2ZUNvbnRlbnRPbmx5KTsKLQkJLy8gfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgZ2V0Q29udGVudERlc2NyaXB0aW9uc01hcCgpIHsKLQkvLyByZXR1cm4gY29udGVudERlc2NyaXB0aW9uc01hcDsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJlc2VudGF0aW9uKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50SW1wbCkgewotCQkJcmV0dXJuICgoQ29udGVudEVsZW1lbnRJbXBsKSBlKS5iYXNpY0dldFByZXNlbnRhdGlvbigpICE9IG51bGw7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50SW1wbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VsZW1lbnRJbXBsKSBlKS5iYXNpY0dldFByZXNlbnRhdGlvbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyhEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlyZXR1cm4gKEVDbGFzcykgY29udGVudERlc2NDbGFzc01hcC5nZXQoZS5lQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIE1lc3NhZ2VEaWdlc3QgbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7Ci0JCVN0cmluZyBpbnB1dCA9IGFyZ3NbMF07Ci0JCS8vIGJ5dGVbXSBoYXNoID0gbWQ1LmRpZ2VzdChpbnB1dC5nZXRCeXRlcygpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJpbnB1dDogJyIgKyBpbnB1dCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkphdmEncyBoYXNoIGNvZGU6ICIgKyBpbnB1dC5oYXNoQ29kZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhhc2ggbGVuZ3RoOiAiICsgaGFzaC5sZW5ndGgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2U2NCBlbmNvZGVkOiAiICsKLQkJLy8gRGF0YVZhbHVlLkJhc2U2NC5lbmNvZGUoaGFzaCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBHVUlEOiAiICsgVW1hVXRpbC5nZW5lcmF0ZUdVSUQoaW5wdXQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvTWVzc2FnZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGE4OGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZW5jZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4Y2VwdGlvbiBEVU1NWV9FWENFUFRJT04gPSBuZXcgRXhjZXB0aW9uKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTA0NjgyNjU2NjgzMDEzNDMzTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZywgRFVNTVlfRVhDRVBUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBhbiBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgYW4gZXhjZXB0aW9uIG9iamVjdAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzI2MWExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24KLWVycl9jYW5ub3RNb2RpZnkwPUNhbm5vdCBtb2RpZnkgJyd7MH0nJwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYUFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkMWJmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVtYVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9IG5ldyBVbWFTd2l0Y2g8QWRhcHRlcj4oKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ2xhc3NpZmllcihDbGFzc2lmaWVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNsYXNzaWZpZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVR5cGUoVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrYWdlKG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lc3BhY2UoTmFtZXNwYWNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU5hbWVzcGFjZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29uc3RyYWludChDb25zdHJhaW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkoTWV0aG9kRWxlbWVudFByb3BlcnR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlS2luZChLaW5kIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUtpbmRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RVbml0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlR3VpZGFuY2UoR3VpZGFuY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlY3Rpb24oU2VjdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZWN0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29uY2VwdChDb25jZXB0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRXhhbXBsZShFeGFtcGxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJldXNhYmxlQXNzZXQoUmV1c2FibGVBc3NldCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oCi0JCQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm9BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUFydGlmYWN0KEFydGlmYWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRnVsZmlsbGFibGVFbGVtZW50KEZ1bGZpbGxhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVGdWxmaWxsYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVwb3J0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUZW1wbGF0ZShUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVG9vbE1lbnRvcihUb29sTWVudG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlT3V0Y29tZShPdXRjb21lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0ZXAoU3RlcCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTdGVwQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUYXNrQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlKFJvbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihBcnRpZmFjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZURlc2NyaXB0aW9uKFJvbGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihQcmFjdGljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVTZXQoUm9sZVNldCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlU2V0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRG9tYWluKERvbWFpbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEb21haW5BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlzY2lwbGluZShEaXNjaXBsaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQnJlYWtkb3duRWxlbWVudChCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya09yZGVyKFdvcmtPcmRlciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvYWRtYXAoUm9hZG1hcCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2FkbWFwQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVG9vbEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZVNldEdyb3VwaW5nKFJvbGVTZXRHcm91cGluZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQaGFzZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVGVhbVByb2ZpbGUoVGVhbVByb2ZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgKLQkJCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJhY3RpY2UoUHJhY3RpY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigKLQkJCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oCi0JCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoCi0JCQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoTm9kZShHcmFwaE5vZGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3JhcGhOb2RlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlhZ3JhbUVsZW1lbnQoRGlhZ3JhbUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJlZmVyZW5jZShSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9pbnQoUG9pbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUG9pbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURpYWdyYW1MaW5rKERpYWdyYW1MaW5rIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpYWdyYW1MaW5rQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHcmFwaENvbm5lY3RvcihHcmFwaENvbm5lY3RvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaENvbm5lY3RvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JhcGhFZGdlKEdyYXBoRWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaEVkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlbWFudGljTW9kZWxCcmlkZ2UoU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaW1lbnNpb24oRGltZW5zaW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpbWVuc2lvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KAotCQkJCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VVTUFTZW1hbnRpY01vZGVsQnJpZGdlKFVNQVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoCi0JCQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUxlYWZFbGVtZW50KExlYWZFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUxlYWZFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXh0RWxlbWVudChUZXh0RWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZXh0RWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlSW1hZ2UoSW1hZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSW1hZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoaWNQcmltaXRpdmUoR3JhcGhpY1ByaW1pdGl2ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaGljUHJpbWl0aXZlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQb2x5bGluZShQb2x5bGluZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQb2x5bGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRWxsaXBzZShFbGxpcHNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVsbGlwc2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NGYW1pbHkoUHJvY2Vzc0ZhbWlseSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRmFtaWx5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyIDxlbT5DbGFzc2lmaWVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDbGFzc2lmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSA8ZW0+UGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lc3BhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCA8ZW0+Q29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVLaW5kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQgPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0ZXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UgPGVtPkd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIgPGVtPldvcmsgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IgPGVtPkRlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm9BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudENhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiA8ZW0+RG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wgPGVtPlRvb2w8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkbWFwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYXJpYWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSA8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgPGVtPlBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9pbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCA8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1MaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaENvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIDxlbT5EaW1lbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGltZW5zaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlZmVyZW5jZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhFZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlIDxlbT5HcmFwaCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50IDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMZWFmRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGV4dEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UgPGVtPkltYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW1hZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZSA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoaWNQcmltaXRpdmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUgPGVtPlBvbHlsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9seWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSA8ZW0+RWxsaXBzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9VbWFBZGFwdGVyRmFjdG9yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmYzg0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBVTUEgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVtYVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBVbWFSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBVbWFSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9jYW5ub3RNb2RpZnkwOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVW1hUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzNiZmUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFTd2l0Y2g8VD4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9IGVsc2UgewotCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4gZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8gZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOiBkb1N3aXRjaCgKLQkJCQkJZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSOiB7Ci0JCQlDbGFzc2lmaWVyIGNsYXNzaWZpZXIgPSAoQ2xhc3NpZmllcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVFlQRTogewotCQkJVHlwZSB0eXBlID0gKFR5cGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUeXBlKHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0eXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0eXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHsKLQkJCVBhY2thZ2VhYmxlRWxlbWVudCBwYWNrYWdlYWJsZUVsZW1lbnQgPSAoUGFja2FnZWFibGVFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UOiB7Ci0JCQlOYW1lZEVsZW1lbnQgbmFtZWRFbGVtZW50ID0gKE5hbWVkRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChuYW1lZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5FTEVNRU5UOiB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QQUNLQUdFOiB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgcGFja2FnZV8gPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUGFja2FnZShwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZV8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTkFNRVNQQUNFOiB7Ci0JCQlOYW1lc3BhY2UgbmFtZXNwYWNlID0gKE5hbWVzcGFjZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobmFtZXNwYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDogewotCQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gKENvbnN0cmFpbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb25zdHJhaW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UOiB7Ci0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6IHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXRob2RFbGVtZW50UHJvcGVydHkgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuS0lORDogewotCQkJS2luZCBraW5kID0gKEtpbmQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VLaW5kKGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UOiB7Ci0JCQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UOiB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT046IHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUOiB7Ci0JCQlNZXRob2RVbml0IG1ldGhvZFVuaXQgPSAoTWV0aG9kVW5pdCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDogewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiB7Ci0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046IHsKLQkJCVNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlU2VjdGlvbihzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlQ6IHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2YXJpYWJpbGl0eUVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh2YXJpYWJpbGl0eUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOiB7Ci0JCQlDb25jZXB0IGNvbmNlcHQgPSAoQ29uY2VwdCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbmNlcHQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOiB7Ci0JCQlDaGVja2xpc3QgY2hlY2tsaXN0ID0gKENoZWNrbGlzdCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNoZWNrbGlzdChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOiB7Ci0JCQlHdWlkZWxpbmUgZ3VpZGVsaW5lID0gKEd1aWRlbGluZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUd1aWRlbGluZShndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRTogewotCQkJRXhhbXBsZSBleGFtcGxlID0gKEV4YW1wbGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VFeGFtcGxlKGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOiB7Ci0JCQlSZXVzYWJsZUFzc2V0IHJldXNhYmxlQXNzZXQgPSAoUmV1c2FibGVBc3NldCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJldXNhYmxlQXNzZXQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOiB7Ci0JCQlUZXJtRGVmaW5pdGlvbiB0ZXJtRGVmaW5pdGlvbiA9IChUZXJtRGVmaW5pdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRlcm1EZWZpbml0aW9uKHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86IHsKLQkJCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6IHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQXJ0aWZhY3QoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHsKLQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVDogewotCQkJRnVsZmlsbGFibGVFbGVtZW50IGZ1bGZpbGxhYmxlRWxlbWVudCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGZ1bGZpbGxhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOiB7Ci0JCQlSZXBvcnQgcmVwb3J0ID0gKFJlcG9ydCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJlcG9ydChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6IHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVGVtcGxhdGUodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjogewotCQkJVG9vbE1lbnRvciB0b29sTWVudG9yID0gKFRvb2xNZW50b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUb29sTWVudG9yKHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6IHsKLQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSAoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRTogewotCQkJRGVsaXZlcmFibGUgZGVsaXZlcmFibGUgPSAoRGVsaXZlcmFibGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZShkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6IHsKLQkJCU91dGNvbWUgb3V0Y29tZSA9IChPdXRjb21lKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlT3V0Y29tZShvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNURVA6IHsKLQkJCVN0ZXAgc3RlcCA9IChTdGVwKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlU3RlcChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlU2VjdGlvbihzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24oc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT046IHsKLQkJCVdvcmtEZWZpbml0aW9uIHdvcmtEZWZpbml0aW9uID0gKFdvcmtEZWZpbml0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24od29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOiB7Ci0JCQlXaGl0ZXBhcGVyIHdoaXRlcGFwZXIgPSAoV2hpdGVwYXBlcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdoaXRlcGFwZXIod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbmNlcHQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEFTSzogewotCQkJVGFzayB0YXNrID0gKFRhc2spIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUYXNrKHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24odGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEU6IHsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUm9sZShyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046IHsKLQkJCUFydGlmYWN0RGVzY3JpcHRpb24gYXJ0aWZhY3REZXNjcmlwdGlvbiA9IChBcnRpZmFjdERlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjogewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046IHsKLQkJCURlbGl2ZXJhYmxlRGVzY3JpcHRpb24gZGVsaXZlcmFibGVEZXNjcmlwdGlvbiA9IChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcmFibGVEZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046IHsKLQkJCVJvbGVEZXNjcmlwdGlvbiByb2xlRGVzY3JpcHRpb24gPSAoUm9sZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OOiB7Ci0JCQlUYXNrRGVzY3JpcHRpb24gdGFza0Rlc2NyaXB0aW9uID0gKFRhc2tEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT046IHsKLQkJCUd1aWRhbmNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChHdWlkYW5jZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiB7Ci0JCQlQcmFjdGljZURlc2NyaXB0aW9uIHByYWN0aWNlRGVzY3JpcHRpb24gPSAoUHJhY3RpY2VEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByYWN0aWNlRGVzY3JpcHRpb24ocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDogewotCQkJUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlU2V0KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZOiB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY29udGVudENhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOiB7Ci0JCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURvbWFpbihkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOiB7Ci0JCQlXb3JrUHJvZHVjdFR5cGUgd29ya1Byb2R1Y3RUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0VHlwZSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkc6IHsKLQkJCURpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZUdyb3VwaW5nKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogewotCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaXNjaXBsaW5lKGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWTogewotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24oYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdvcmtCcmVha2Rvd25FbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UOiB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiB7Ci0JCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOiB7Ci0JCQlQbGFubmluZ0RhdGEgcGxhbm5pbmdEYXRhID0gKFBsYW5uaW5nRGF0YSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVBsYW5uaW5nRGF0YShwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSOiB7Ci0JCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtPcmRlcih3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0FETUFQOiB7Ci0JCQlSb2FkbWFwIHJvYWRtYXAgPSAoUm9hZG1hcCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJvYWRtYXAocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVE9PTDogewotCQkJVG9vbCB0b29sID0gKFRvb2wpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUb29sKHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzogewotCQkJUm9sZVNldEdyb3VwaW5nIHJvbGVTZXRHcm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlU2V0R3JvdXBpbmcocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6IHsKLQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ3VzdG9tQ2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0U6IHsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IChNZXRob2RQYWNrYWdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRTogewotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50UGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiB7Ci0JCQlNaWxlc3RvbmUgbWlsZXN0b25lID0gKE1pbGVzdG9uZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU1pbGVzdG9uZShtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOiB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd29ya1Byb2R1Y3REZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUjogewotCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjogewotCQkJSXRlcmF0aW9uIGl0ZXJhdGlvbiA9IChJdGVyYXRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VJdGVyYXRpb24oaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOiB7Ci0JCQlQaGFzZSBwaGFzZSA9IChQaGFzZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVBoYXNlKHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6IHsKLQkJCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gKFRlYW1Qcm9maWxlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVGVhbVByb2ZpbGUodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjogewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUjogewotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRvcih0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcih0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEU6IHsKLQkJCUNvbXBvc2l0ZVJvbGUgY29tcG9zaXRlUm9sZSA9IChDb21wb3NpdGVSb2xlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29tcG9zaXRlUm9sZShjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzogewotCQkJRGVsaXZlcnlQcm9jZXNzIGRlbGl2ZXJ5UHJvY2VzcyA9IChEZWxpdmVyeVByb2Nlc3MpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3MoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTUzogewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24ocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiB7Ci0JCQlDYXBhYmlsaXR5UGF0dGVybiBjYXBhYmlsaXR5UGF0dGVybiA9IChDYXBhYmlsaXR5UGF0dGVybikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2VzcyhjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbiA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOOiB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZFBsdWdpbihtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2UobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOiB7Ci0JCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IChQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6IHsKLQkJCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJhY3RpY2UocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjogewotCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA9IChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiB7Ci0JCQlBY3Rpdml0eURlc2NyaXB0aW9uIGFjdGl2aXR5RGVzY3JpcHRpb24gPSAoQWN0aXZpdHlEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046IHsKLQkJCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT046IHsKLQkJCVByb2Nlc3NEZXNjcmlwdGlvbiBwcm9jZXNzRGVzY3JpcHRpb24gPSAoUHJvY2Vzc0Rlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOiB7Ci0JCQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1I6IHsKLQkJCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yID0gKFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVDogewotCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTTogewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaWFncmFtKGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaE5vZGUoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERTogewotCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IChHcmFwaE5vZGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VHcmFwaE5vZGUoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UOiB7Ci0JCQlHcmFwaEVsZW1lbnQgZ3JhcGhFbGVtZW50ID0gKEdyYXBoRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UOiB7Ci0JCQlEaWFncmFtRWxlbWVudCBkaWFncmFtRWxlbWVudCA9IChEaWFncmFtRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlhZ3JhbUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFOiB7Ci0JCQlSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFJlZmVyZW5jZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJlZmVyZW5jZShyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFk6IHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvcGVydHkocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UOiB7Ci0JCQlQb2ludCBwb2ludCA9IChQb2ludCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVBvaW50KHBvaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOSzogewotCQkJRGlhZ3JhbUxpbmsgZGlhZ3JhbUxpbmsgPSAoRGlhZ3JhbUxpbmspIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaWFncmFtTGluayhkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlhZ3JhbUxpbmspOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SOiB7Ci0JCQlHcmFwaENvbm5lY3RvciBncmFwaENvbm5lY3RvciA9IChHcmFwaENvbm5lY3RvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoQ29ubmVjdG9yKGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFOiB7Ci0JCQlHcmFwaEVkZ2UgZ3JhcGhFZGdlID0gKEdyYXBoRWRnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoRWRnZShncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaEVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBzZW1hbnRpY01vZGVsQnJpZGdlID0gKFNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT046IHsKLQkJCURpbWVuc2lvbiBkaW1lbnNpb24gPSAoRGltZW5zaW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGltZW5zaW9uKGRpbWVuc2lvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U6IHsKLQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDogewotCQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgPSAoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2Uoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U6IHsKLQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgdW1hU2VtYW50aWNNb2RlbEJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZSh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0U6IHsKLQkJCUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlID0gKENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5MRUFGX0VMRU1FTlQ6IHsKLQkJCUxlYWZFbGVtZW50IGxlYWZFbGVtZW50ID0gKExlYWZFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGxlYWZFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVDogewotCQkJVGV4dEVsZW1lbnQgdGV4dEVsZW1lbnQgPSAoVGV4dEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUZXh0RWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRTogewotCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VJbWFnZShpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSElDX1BSSU1JVElWRTogewotCQkJR3JhcGhpY1ByaW1pdGl2ZSBncmFwaGljUHJpbWl0aXZlID0gKEdyYXBoaWNQcmltaXRpdmUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VHcmFwaGljUHJpbWl0aXZlKGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkU6IHsKLQkJCVBvbHlsaW5lIHBvbHlsaW5lID0gKFBvbHlsaW5lKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUG9seWxpbmUocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaGljUHJpbWl0aXZlKHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0U6IHsKLQkJCUVsbGlwc2UgZWxsaXBzZSA9IChFbGxpcHNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRWxsaXBzZShlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhpY1ByaW1pdGl2ZShlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZOiB7Ci0JCQlQcm9jZXNzRmFtaWx5IHByb2Nlc3NGYW1pbHkgPSAoUHJvY2Vzc0ZhbWlseSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NGYW1pbHkocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24ocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6IHsKLQkJCU1ldGhvZExpYnJhcnkgbWV0aG9kTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kTGlicmFyeShtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNsYXNzaWZpZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DbGFzc2lmaWVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ2xhc3NpZmllcihDbGFzc2lmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVR5cGUoVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBhY2thZ2Uob3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VOYW1lc3BhY2UoTmFtZXNwYWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnN0cmFpbnQoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPktpbmQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlS2luZChLaW5kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU2VjdGlvbihTZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3QoV29ya1Byb2R1Y3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GdWxmaWxsYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRnVsZmlsbGFibGVFbGVtZW50KEZ1bGZpbGxhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGVwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RlcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVN0ZXAoU3RlcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUd1aWRhbmNlKEd1aWRhbmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQXJ0aWZhY3QoQXJ0aWZhY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihBcnRpZmFjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZURlc2NyaXB0aW9uKFJvbGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrRGVzY3JpcHRpb24oVGFza0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihHdWlkYW5jZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihQcmFjdGljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQWN0aXZpdHkoQWN0aXZpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoV29ya0JyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGVhbVByb2ZpbGUoVGVhbVByb2ZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihBY3Rpdml0eURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKERlc2NyaXB0b3JEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRXhhbXBsZShFeGFtcGxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZW1wbGF0ZShUZW1wbGF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVG9vbE1lbnRvcihUb29sTWVudG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdoaXRlcGFwZXIoV2hpdGVwYXBlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGVybURlZmluaXRpb24oVGVybURlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyhBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUmV1c2FibGVBc3NldChSZXVzYWJsZUFzc2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb21haW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb21haW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3RUeXBlKFdvcmtQcm9kdWN0VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvYWRtYXAoUm9hZG1hcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc1BhY2thZ2UoUHJvY2Vzc1BhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcihQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RVbml0KE1ldGhvZFVuaXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzRmFtaWx5KFByb2Nlc3NGYW1pbHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQb2ludChQb2ludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEaWFncmFtRWxlbWVudChEaWFncmFtRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGlhZ3JhbUxpbmsoRGlhZ3JhbUxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUdyYXBoQ29ubmVjdG9yKEdyYXBoQ29ubmVjdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKFNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpbWVuc2lvbihEaW1lbnNpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJlZmVyZW5jZShSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHcmFwaEVkZ2UoR3JhcGhFZGdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHcmFwaE5vZGUoR3JhcGhOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVU1BU2VtYW50aWNNb2RlbEJyaWRnZShVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoQ29yZVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxlYWYgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxlYWYgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUxlYWZFbGVtZW50KExlYWZFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZXh0RWxlbWVudChUZXh0RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUltYWdlKEltYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3JhcGhpY1ByaW1pdGl2ZShHcmFwaGljUHJpbWl0aXZlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUG9seWxpbmUoUG9seWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGxpcHNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRWxsaXBzZShFbGxpcHNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1VtYVN3aXRjaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGRiNDE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBhY2Nlc3NpbmcgYW5kIHVwZGF0aW5nIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW1hVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZmVhdHVyZSB2YWx1ZXMgb2YgYW4gb2xkIG1ldGhvZCBlbGVtZW50IHdpdGggdGhlCi0JICogY29ycmVzcG9uZGluZyBmZWF0dXJlIHZhbHVlcyBvZiBhIG5ldyBtZXRob2QgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBbGwgZmVhdHVyZXMgYXJlIHVwZGF0ZWQgZXhjZXB0IGZvciB0aGUgR1VJRCBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBvbGRFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgb2xkIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIG5ld0VsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZShNZXRob2RFbGVtZW50IG9sZEVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJTGlzdCBmZWF0dXJlcyA9IG9sZEVsZW1lbnQuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmZWF0dXJlcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkpIHsKLQkJCQkJLy8gZG9uJ3QgcmVwbGFjZSBHVUlECi0JCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld0VsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQkJb2xkRWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbW9kZWwgb2JqZWN0IGhhcyBhIGRpcmVjdCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtb2RlbCBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgbW9kZWwgb2JqZWN0IGlzIGNvbnRhaW5lZCBieQotCSAqICAgICAgICAgYSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEaXJlY3RSZXNvdXJjZShFT2JqZWN0IGUpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQlyZXR1cm4gKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jb250YWlucyhlKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYWxsIHJlc291cmNlcyBvd25lZCBieSB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlc291cmNlcyhFT2JqZWN0IGUpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCWdldFJlc291cmNlcyhlLCByZXNvdXJjZXMpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UmVzb3VyY2VzKEVPYmplY3QgZSwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWlmIChVbWFVdGlsLmhhc0RpcmVjdFJlc291cmNlKGUpKSB7Ci0JCQlyZXNvdXJjZXMuYWRkKGUuZVJlc291cmNlKCkpOwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlnZXRSZXNvdXJjZXMoKEVPYmplY3QpIGl0ZXIubmV4dCgpLCByZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHNwZWNpZmljIHR5cGUgb2YgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqICAgICAgICAgICAgYSBub3RpZmllcgotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIHRoZSBhZGFwdGVyIGNsYXNzCi0JICogQHJldHVybiBhbiA8Y29kZT5BZGFwdGVyPGNvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqLCBDbGFzcyBjbHMpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IGVPYmouZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBhZGFwdGVycyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxBZGFwdGVycyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJZm9yIChUcmVlSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IGVPYmplY3QuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlvLmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgcGFja2FnZXMKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGFja2FnZSBuYW1lCi0JICogQHJldHVybiBhIG1ldGhvZCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZmluZE1ldGhvZFBhY2thZ2UoTGlzdCBtZXRob2RQYWNrYWdlcywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RQYWNrYWdlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IG1ldGhvZFBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSkgb2JqOwotCQkJCWlmIChuYW1lLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gcGtnOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIG1ldGhvZCBlbGVtZW50IHBhdGggZnJhZ21lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZmluZE1ldGhvZFBhY2thZ2UoTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTWV0aG9kUGFja2FnZSBwa2cgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBtZXRob2RQbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlwa2cgPSBmaW5kTWV0aG9kUGFja2FnZShsaXN0LCBwYXRoW2ldKTsKLQkJCWlmIChwa2cgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgYWN0aXZpdHkgb2YgYSBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBhY3Rpdml0eSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBhY3Rpdml0eSBvZiBhIHdvcmsgb3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqICAgICAgICAgICAgYSB3b3JrIG9yZGVyCi0JICogQHJldHVybiB0aGUgcGFyZW50IGFjdGl2aXR5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRPd25pbmdBY3Rpdml0eShXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgd29ya09yZGVyLmVDb250YWluZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgcGFja2FnZXMKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBjb250ZW50IHBhY2thZ2UgbmFtZQotCSAqIEByZXR1cm4gYSBjb250ZW50IHBhY2thZ2Ugd2l0aCB0aGUgbWF0aGNpbmcgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgZmluZENvbnRlbnRQYWNrYWdlKExpc3QgbWV0aG9kUGFja2FnZXMsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gbWV0aG9kUGFja2FnZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvYmogPSBtZXRob2RQYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iajsKLQkJCQlpZiAobmFtZS5lcXVhbHMocGtnLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHBrZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbWV0aG9kIGVsZW1lbnQgcGF0aCBmcmFnbWVudHMKLQkgKiBAcmV0dXJuIGEgY29udGVudCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRQYWNrYWdlIGZpbmRDb250ZW50UGFja2FnZShNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBtZXRob2RQbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlwa2cgPSBmaW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFtpXSk7Ci0JCQlpZiAocGtnID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWxpc3QgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQl9Ci0JCXJldHVybiBwa2c7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCBwbHVnLWluIG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgTWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbWV0aG9kIHBsdWctaW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oRU9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoRU9iamVjdCBvYmogPSBlbGVtZW50OyBvYmogIT0gbnVsbDsgb2JqID0gb2JqLmVDb250YWluZXIoKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiAoTWV0aG9kUGx1Z2luKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCBsaWJyYXJ5IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXJldHVybiAoTWV0aG9kTGlicmFyeSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0VG9wQ29udGFpbmVyKEVPYmplY3QgZWxlbWVudCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG51bGw7Ci0JCWZvciAoRU9iamVjdCBvYmogPSBlbGVtZW50LmVDb250YWluZXIoKTsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWNvbnRhaW5lciA9IG9iajsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwkJCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGNvbnRlbnQgcGFja2FnZSBvZiBhIGNvbnRlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBjb250ZW50IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgY29udGVudCBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBnZXRDb250ZW50UGFja2FnZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZXR1cm4gKENvbnRlbnRQYWNrYWdlKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IHByb2Nlc3MgcGFja2FnZSBvZiBhIHByb2Nlc3MgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBQcm9jZXNzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgcHJvY2VzcyBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBnZXRQcm9jZXNzUGFja2FnZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gKFByb2Nlc3NQYWNrYWdlKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGRpYWdyYW0gb2YgYSBkaWFncmFtIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgZGlhZ3JhbSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGFyZW50IGRpYWdyYW0gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW0gZ2V0RGlhZ3JhbShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCXJldHVybiAoRGlhZ3JhbSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGVsZW1lbnQgaXMgY29udGFpbmVkIGJ5IGEgc3BlY2lmaWMgY29udGVudAotCSAqIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29udGVudFBhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBwYWNrYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgY29udGFpbmVkIGJ5IHRoZQotCSAqICAgICAgICAgY29udGVudCBwYWNrYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnlDb250ZW50UGFja2FnZShFT2JqZWN0IGVsZW1lbnQsCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSkgewotCQlyZXR1cm4gaXNDb250YWluZWRCeShlbGVtZW50LCBjb250ZW50UGFja2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtb2RlbCBvYmplY3QgaXMgY29udGFpbmVkIGJ5IGEgc3BlY2lmaWMgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogICAgICAgICAgICBhIG1vZGVsIG9iamVjdAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIGEgY29udGFpbmVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9kZWwgb2JqZWN0IGlzIGNvbnRhaW5lZCBieSB0aGUKLQkgKiAgICAgICAgIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEVPYmplY3QgZU9iaiwgT2JqZWN0IGNvbnRhaW5lcikgewotCQlpZiAoZU9iaiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVPYmouZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gb2JqCi0JCQkJLmVDb250YWluZXIoKSkgewotCQkJaWYgKG9iaiA9PSBjb250YWluZXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEgdW5pcXVlIElELgotCSAqIAotCSAqIEByZXR1cm4gYSB1bmlxdWUgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZUdVSUQoKSB7Ci0JCXJldHVybiBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudCBkZXNjcmlwdGlvbiBuYW1lIG9mIGEgZ2l2ZW4gbWV0aG9kCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBzdWl0YWJsZSBjb250ZW50IGRlc2NyaXB0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25OYW1lKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXROYW1lKCkgKyAnLCcgKyBlLmdldEd1aWQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsU3VwZXJzKExpc3Qgc3VwZXJzLCBWYXJpYWJpbGl0eUVsZW1lbnQgZSwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmIChiYXNlICE9IG51bGwgJiYgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlCi0JCQkJJiYgIXN1cGVycy5jb250YWlucyhiYXNlKSkgewotCQkJc3VwZXJzLmFkZChiYXNlKTsKLQkJCWdldEFsbFN1cGVycyhzdXBlcnMsIGJhc2UsIHR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFN1cGVyc0JvdGgoTGlzdCBzdXBlcnMsIFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUxLCBWYXJpYWJpbGl0eVR5cGUgdHlwZTIpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbAotCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IHR5cGUxIHx8IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gdHlwZTIpCi0JCQkJJiYgIXN1cGVycy5jb250YWlucyhiYXNlKSkgewotCQkJc3VwZXJzLmFkZChiYXNlKTsKLQkJCWdldEFsbFN1cGVyc0JvdGgoc3VwZXJzLCBiYXNlLCB0eXBlMSwgdHlwZTIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2xhc3Mgb2YgYSBjb250ZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRFbGVtZW50Ci0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZWxlbWVudCBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0Q2xhc3NPZkNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50KSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpCi0JCQlyZXR1cm4gUm9sZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykKLQkJCXJldHVybiBUYXNrLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCXJldHVybiBXb3JrUHJvZHVjdC5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQlyZXR1cm4gR3VpZGFuY2UuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikKLQkJCXJldHVybiBEb21haW4uY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpCi0JCQlyZXR1cm4gRGlzY2lwbGluZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJcmV0dXJuIERpc2NpcGxpbmVHcm91cGluZy5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCkKLQkJCXJldHVybiBSb2xlU2V0LmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpCi0JCQlyZXR1cm4gUm9sZVNldEdyb3VwaW5nLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQlyZXR1cm4gV29ya1Byb2R1Y3RUeXBlLmNsYXNzOwotCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IHdvcmsgb3JkZXIgZm9yIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJlZGVjZXNzb3Igd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgd29yayBvcmRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYywKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYywKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQsIGJvb2xlYW4gbGluaykgewotCQlXb3JrT3JkZXIgd28gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJd28uc2V0UHJlZChwcmVkKTsKLQkJaWYobGluaykgewotCQkJc3VjYy5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmFkZCh3byk7Ci0JCX0KLQkJcmV0dXJuIHdvOwotCX0JCi0KLQkvKioKLQkgKiBMb2NhdGVzIHRoZSB3b3JrIG9yZGVyIGFzc29jaWF0ZWQgd2l0aCB0d28gd29yayBicmVha2Rvd24gZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByZWRlY2Vzc29yIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgd29yayBvcmRlciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGZpbmRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwKLQkJCU9iamVjdCBwcmVkZWNlc3NvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAod29ya09yZGVyLmdldFByZWQoKSA9PSBwcmVkZWNlc3NvcikKLQkJCQlyZXR1cm4gd29ya09yZGVyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHdvcmsgb3JkZXIgYXNzb2NpYXRlZCB3aXRoIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4gSWYKLQkgKiBpbmNsdWRlQmFzZSBpcyB0cnVlLCB3aWxsIGNvbGxlY3QgV29ya09yZGVyIGZvciBiYXNlIGVsZW1lbnQgb2YgdGhlCi0JICogcHJlZGVjZXNzb3IgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqIEBwYXJhbSBpbmNsdWRlQmFzZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248V29ya09yZGVyPiBmaW5kV29ya09yZGVyKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsIFdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRlY2Vzc29yLCBib29sZWFuIGluY2x1ZGVCYXNlKSB7Ci0JCWlmKCFpbmNsdWRlQmFzZSkgewotCQkJV29ya09yZGVyIHdvID0gZmluZFdvcmtPcmRlcihlLCBwcmVkZWNlc3Nvcik7Ci0JCQlyZXR1cm4gKENvbGxlY3Rpb248V29ya09yZGVyPikgKHdvID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qod28pKTsKLQkJfQotCQlBcnJheUxpc3Q8V29ya09yZGVyPiB3b3JrT3JkZXJzID0gbmV3IEFycmF5TGlzdDxXb3JrT3JkZXI+KCk7Ci0JCWNvbGxlY3RXb3JrT3JkZXJzKHdvcmtPcmRlcnMsIGUsIHByZWRlY2Vzc29yKTsKLQkJcmV0dXJuIHdvcmtPcmRlcnM7Ci0JfQotCQotCS8qKgotCSAqIENvbGxlY3RzIHRoZSBXb3JrT3JkZXIgb2JqZWN0cyBhc3NvY2lhdGVkIGJldHdlZW4gdGhlIHNwZWNpZmllZCB3b3JrCi0JICogYnJlYWtkb3duIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4gYW5kIHRoZSBwcmVkZWNlc3NvciBvciBhbnkgb2YgaXRzIGJhc2UgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcnMKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0V29ya09yZGVycyhDb2xsZWN0aW9uPFdvcmtPcmRlcj4gd29ya09yZGVycywKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUsIE9iamVjdCBwcmVkZWNlc3NvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAod29ya09yZGVyLmdldFByZWQoKSA9PSBwcmVkZWNlc3NvcikgewotCQkJCXdvcmtPcmRlcnMuYWRkKHdvcmtPcmRlcik7Ci0JCQl9Ci0JCX0KLQkJaWYocHJlZGVjZXNzb3IgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KXByZWRlY2Vzc29yKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJY29sbGVjdFdvcmtPcmRlcnMod29ya09yZGVycywgZSwgdmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgd29yayBvcmRlciBhc3NvY2lhdGVkIHdpdGggdHdvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcmVkZWNlc3NvciB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcmVtb3ZlZCB3b3JrIG9yZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgcmVtb3ZlV29ya09yZGVyKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlPYmplY3QgcHJlZGVjZXNzb3IpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgb3JkZXIgPSAoV29ya09yZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob3JkZXIuZ2V0UHJlZCgpID09IHByZWRlY2Vzc29yKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJcmV0dXJuIG9yZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBwcm9jZXNzIGNvbXBvbmVudCBvZiBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50LCB0eXBpY2FsbHkgYSBwcm9jZXNzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgcHJvY2VzcyBjb21wb25lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NDb21wb25lbnQgZ2V0UHJvY2Vzc0NvbXBvbmVudChNZXRob2RFbGVtZW50IGUpIHsKLQkJRU9iamVjdCBjb250YWluZXI7Ci0JCWZvciAoY29udGFpbmVyID0gZTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIGNvbnRhaW5lcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCB1bml0IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbWV0aG9kIHVuaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFVuaXQgZ2V0TWV0aG9kVW5pdChNZXRob2RFbGVtZW50IGUpIHsKLQkJRU9iamVjdCBjb250YWluZXI7Ci0JCWZvciAoY29udGFpbmVyID0gZTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoKE1ldGhvZFVuaXQpIGNvbnRhaW5lcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBwbHVnLWluIGhhcyBtZXRob2QgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UKLQkgKiBlbGVtZW50cyBpbiBhIGJhc2UgcGx1Zy1pbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIGlzIGEgZXhwZW5zaXZlIGNhbGwgdG8gbWFrZSBmb3IgYSBsYXJnZSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHBhcmFtIGJhc2UKLQkgKiAgICAgICAgICAgIGEgYmFzZSBtZXRob2QgcGx1Zy1pbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBtZXRob2QgcGx1Zy1pbiBjb250YWluCi0JICogICAgICAgICBtZXRob2QgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgZWxlbWVudHMgaW4gYSBiYXNlIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1JlZmVyZW5jZShNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RQbHVnaW4gYmFzZSkgewotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBwbHVnaW4KLQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCi0JCQlpZiAoZiAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKQotCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihyZWYpID09IGJhc2UpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0KLQkJCS8vIGlnbm9yZSBQcm9jZXNzRWxlbWVudCBiL2MgaXQgY2FuIHJlZmVyZW5jZXMgYW55dGhpbmcKLQkJCS8vCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiBhIG1ldGhvZCBwbHVnLWluIHRoYXQgcG9pbnQgdG8gZWxlbWVudHMKLQkgKiBpbiBhIGJhc2UgcGx1Zy1pbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIGlzIGEgZXhwZW5zaXZlIGNhbGwgdG8gbWFrZSBmb3IgYSBsYXJnZSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHBhcmFtIGJhc2UKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJTWV0aG9kUGx1Z2luIGJhc2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQotCQkJLy8gaWdub3JlIFByb2Nlc3NFbGVtZW50IGIvYyBpdCBjYW4gcmVmZXJlbmNlcyBhbnl0aGluZwotCQkJLy8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZWxlbWVudAotCQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCWlmIChnZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkJCSgoQ29sbGVjdGlvbikgZWxlbWVudC5lR2V0KGYpKS5yZW1vdmUocmVmKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQuZVNldChmLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobXNnKTsKLQkJCUlTdGF0dXMgc3RhdHVzZXNbXSA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJCXN0ckJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHN0YXR1c2VzW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQltc2cgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAobXNnICE9IG51bGwgJiYgbXNnLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQltc2cgPSBudWxsOwotCQl9Ci0JCXJldHVybiBtc2c7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgR1VJRCB1c2luZyBhIGJhc2UgR1VJRC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUdVSUQKLQkgKiAgICAgICAgICAgIGEgYmFzZSBHVUlECi0JICogQHJldHVybiBhIHVuaXF1ZSBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdlbmVyYXRlR1VJRChTdHJpbmcgYmFzZUdVSUQpIHsKLQkJcmV0dXJuIEdVSUQuZ2VuZXJhdGUoYmFzZUdVSUQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEdVSUQgewotCQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG1kNSA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZURpZ2VzdCBnZXRNRDUoKSB7Ci0JCQlpZiAobWQ1ID09IG51bGwpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKEdVSUQuY2xhc3MpIHsKLQkJCQkJaWYgKG1kNSA9PSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbWQ1OwotCQl9Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2VuZXJhdGUoU3RyaW5nIGJhc2VHVUlEKSB7Ci0JCQlNZXNzYWdlRGlnZXN0IG1kNSA9IGdldE1ENSgpOwotCQkJbWQ1LnVwZGF0ZShiYXNlR1VJRC5nZXRCeXRlcygpKTsKLQkJCWJ5dGVbXSBoYXNoID0gbWQ1LmRpZ2VzdCgpOwotCQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzIzXTsKLQkJCWJ1ZmZlclswXSA9ICctJzsKLQotCQkJLy8gRG8gYSBiYXNlIDY0IGNvbnZlcnNpb24gYnkgdHVybmluZyBldmVyeSAzIGJ5dGVzIGludG8gNCBiYXNlIDY0Ci0JCQkvLyBjaGFyYWN0ZXJzCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKLQkJCQlidWZmZXJbNCAqIGkgKyAxXSA9IEJBU0U2NF9ESUdJVFNbKGhhc2hbaSAqIDNdID4+IDIpICYgMHgzRl07Ci0JCQkJYnVmZmVyWzQgKiBpICsgMl0gPSBCQVNFNjRfRElHSVRTWygoaGFzaFtpICogM10gPDwgNCkgJiAweDMwKQotCQkJCQkJfCAoKGhhc2hbaSAqIDMgKyAxXSA+PiA0KSAmIDB4RildOwotCQkJCWJ1ZmZlcls0ICogaSArIDNdID0gQkFTRTY0X0RJR0lUU1soKGhhc2hbaSAqIDMgKyAxXSA8PCAyKSAmIDB4M0MpCi0JCQkJCQl8ICgoaGFzaFtpICogMyArIDJdID4+IDYpICYgMHgzKV07Ci0JCQkJYnVmZmVyWzQgKiBpICsgNF0gPSBCQVNFNjRfRElHSVRTW2hhc2hbaSAqIDMgKyAyXSAmIDB4M0ZdOwotCQkJfQotCi0JCQkvLyBIYW5kbGUgdGhlIGxhc3QgYnl0ZSBhdCB0aGUgZW5kLgotCQkJLy8KLQkJCWJ1ZmZlclsyMV0gPSBCQVNFNjRfRElHSVRTWyhoYXNoWzE1XSA+PiAyKSAmIDB4M0ZdOwotCQkJYnVmZmVyWzIyXSA9IEJBU0U2NF9ESUdJVFNbKGhhc2hbMTVdIDw8IDQpICYgMHgzMF07Ci0KLQkJCXJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQkFTRTY0X0RJR0lUUyA9IHsgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsCi0JCQkJJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywKLQkJCQknUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYScsICdiJywgJ2MnLAotCQkJCSdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsCi0JCQkJJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsICcwJywKLQkJCQknMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnLScsICdfJyB9OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihnZW5lcmF0ZUdVSUQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzc3NmViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzg0MmZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBDb21tb24gcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlZTJkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxOGUyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgRmViIDAxIDE3OjAzOjQ1IFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9SZXNvdXJjZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzljZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb247c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5BY3RpdmF0b3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQsCi0gb3JnLmVjbGlwc2UudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMsCi0gb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24udXRpbAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMzRmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhY2QxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgVmFsaWRhdGlvbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhN2ZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5jb25zdHJhaW50UHJvdmlkZXJzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmxpYnJhcnkuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJNZXRob2QgTGlicmFyeSBDb25zdHJhaW50cyIvPgotICAgICAgPGNvbnN0cmFpbnRQcm92aWRlcgotICAgICAgICAgICAgY2FjaGU9InRydWUiCi0gICAgICAgICAgICA+Ci0gICAgICAgICA8cGFja2FnZSBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiLz4KLSAgICAgICAgIDxjb25zdHJhaW50cyBjYXRlZ29yaWVzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5saWJyYXJ5LmNhdGVnb3J5Ij4KLSAgICAgICAgICAgIDxjb25zdHJhaW50Ci0gICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTmFtZUNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTmFtZUNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBsYW5nPSJKYXZhIgotICAgICAgICAgICAgICAgICAgbW9kZT0iQmF0Y2giCi0gICAgICAgICAgICAgICAgICBuYW1lPSJOYW1lIENvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBzZXZlcml0eT0iRVJST1IiCi0gICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlPSIxIj4KLSAgICAgICAgICAgICAgIDxtZXNzYWdlPgotICAgICAgICAgICAgICAgICAgQSB7MH0gaGFzIGJlZW4gZm91bmQgdG8gaGF2ZSBjaGlsZHJlbiB3aXRoIGludmFsaWQgbmFtZSBvciBwcmVzZW50YXRpb24gbmFtZQotICAgICAgICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgICAgPC9jb25zdHJhaW50PgotICAgICAgICAgICAgPGNvbnN0cmFpbnQKLSAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5SZWxhdGlvbnNoaXBDb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlJlbGF0aW9uc2hpcENvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBsYW5nPSJKYXZhIgotICAgICAgICAgICAgICAgICAgbW9kZT0iQmF0Y2giCi0gICAgICAgICAgICAgICAgICBuYW1lPSJSZWxhdGlvbnNoaXAgQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIHNldmVyaXR5PSJFUlJPUiIKLSAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU9IjIiPgotICAgICAgICAgICAgICAgPG1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICBBIHswfSBoYXMgYmVlbiBmb3VuZCB0byBoYXZlIGludmFsaWQgcmVsYXRpb25zaGlwCi0gICAgICAgICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICAgICA8L2NvbnN0cmFpbnRzPgotICAgICAgPC9jb25zdHJhaW50UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRCaW5kaW5ncyI+Ci0gICAgICA8Y2xpZW50Q29udGV4dAotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5saWJyYXJ5LmRlZmF1bHRDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9jbGllbnRDb250ZXh0PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi50cmF2ZXJzYWwiPgotICAgICAgPHRyYXZlcnNhbFN0cmF0ZWd5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5IgotICAgICAgICAgICAgbmFtZXNwYWNlVXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4KLSAgICAgIDxzdGFydHVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsLlN0YXJ0dXAiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9BY3RpdmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2MzNiNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL0xpYnJhcnlFVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vTGlicmFyeUVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4NDEzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vTGlicmFyeUVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpY0NoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkV2YWx1YXRpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklDb25zdHJhaW50U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUJhdGNoVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUNvbnN0cmFpbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUNvbnN0cmFpbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5Nb2RlbFZhbGlkYXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklBZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5VmFsaWRhdGlvbk1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLnV0aWwuVmFsaWRhdGlvblN0YXR1czsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgcGx1Z3MgdGhlIEVNRiBNb2RlbCBWYWxpZGF0aW9uIFNlcnZpY2UgQVBJIGludG8gdGhlCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3J9IEFQSS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlFVmFsaWRhdG9yIGV4dGVuZHMgRU9iamVjdFZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgZmVhdHVyZVRvUHJvcGVydHlNYXAgPSBjcmVhdGVGZWF0dXJlVG9BdHRyaWJ1dGVNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENUWF9BREFQVEVSX0ZBQ1RPUllfUFJPVklERVIgPSAiQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUiA9ICJDVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVFhfQ09OU1RSQUlOVF9GSUxURVIgPSAiQ1RYX0NPTlNUUkFJTlRfRklMVEVSIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUkFJTlRfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubGlicmFyeS5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIE1hcCBjcmVhdGVGZWF0dXJlVG9BdHRyaWJ1dGVNYXAoKSB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQltYXAucHV0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKTsKLQkJbWFwLnB1dChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCS8qKgotCSAqIE1vZGVsIFZhbGlkYXRpb24gU2VydmljZSBpbnRlcmZhY2UgZm9yIGJhdGNoIHZhbGlkYXRpb24gb2YgRU1GIGVsZW1lbnRzLgotCSAqLwotCXByaXZhdGUgZmluYWwgSUJhdGNoVmFsaWRhdG9yIGJhdGNoVmFsaWRhdG9yOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgbWUuCi0JICovCi0JcHVibGljIExpYnJhcnlFVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCi0JCWJhdGNoVmFsaWRhdG9yID0gKElCYXRjaFZhbGlkYXRvcikgTW9kZWxWYWxpZGF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLm5ld1ZhbGlkYXRvcihFdmFsdWF0aW9uTW9kZS5CQVRDSCk7Ci0JCWJhdGNoVmFsaWRhdG9yLnNldEluY2x1ZGVMaXZlQ29uc3RyYWludHModHJ1ZSk7Ci0JCWJhdGNoVmFsaWRhdG9yLnNldFJlcG9ydFN1Y2Nlc3NlcyhmYWxzZSk7Ci0JCWJhdGNoVmFsaWRhdG9yLmFkZENvbnN0cmFpbnRGaWx0ZXIobmV3IElDb25zdHJhaW50RmlsdGVyKCkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSUNvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnQsCi0JCQkJCUVPYmplY3QgdGFyZ2V0KSB7Ci0JCQkJU2V0PENhdGVnb3J5PiBjYXRlZ29yaWVzID0gY29uc3RyYWludC5nZXRDYXRlZ29yaWVzKCk7Ci0JCQkJaWYoY2F0ZWdvcmllcyAhPSBudWxsICYmICFjYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yPENhdGVnb3J5PiBpdGVyYXRvciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ2F0ZWdvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKENPTlNUUkFJTlRfQ0FURUdPUlkuZXF1YWxzKGNhdGVnb3J5LmdldElkKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVPYmplY3QgZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLAotCQkJTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlKGVPYmplY3QuZUNsYXNzKCksIGVPYmplY3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRzIHZhbGlkYXRpb24gYnkgZGVsZWdhdGlvbiB0byB0aGUgRU1GIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVDbGFzcyBlQ2xhc3MsIEVPYmplY3QgZU9iamVjdCwKLQkJCURpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJLy8gZmlyc3QsIGRvIHdoYXRldmVyIHRoZSBiYXNpYyBFY29yZVZhbGlkYXRvciBkb2VzCi0JCS8vIHN1cGVyLnZhbGlkYXRlKGVDbGFzcywgZU9iamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlib29sZWFuIGNpcmN1bGFyQ2hlY2tPayA9IHRydWU7Ci0JCURlcGVuZGVuY3lWYWxpZGF0aW9uTWdyIG1nciA9IChEZXBlbmRlbmN5VmFsaWRhdGlvbk1ncikgY29udGV4dC5nZXQoQ1RYX0RFUEVOREVOQ1lfVkFMSURBVElPTl9NR1IpOwotCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2sgJiYgbWdyICE9IG51bGwgJiYgCi0JCQkJKGVPYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgfHwgZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCXN0YXR1cyA9IG1nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeSgoTWV0aG9kRWxlbWVudCkgZU9iamVjdCk7Ci0JCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCWNpcmN1bGFyQ2hlY2tPayA9IGZhbHNlOwotCQkJCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCWlmKFN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJCS8vbXNnID0gTkxTLmJpbmQoVmFsaWRhdGlvblJlc291cmNlcy5jaXJjdWxhckRlcGVuZGVuY3lfZXJyb3IsIHJlZi5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0TmFtZSgpLCByZWYuZ2V0TmFtZSgpKTsKLQkJCQkJbXNnID0gVmFsaWRhdGlvblJlc291cmNlcy5jaXJjdWxhckRlcGVuZGVuY3lfZXJyb3I7Ci0JCQkJfQotCQkJCWFwcGVuZERpYWdub3N0aWNzKHN0YXR1cywgZGlhZ25vc3RpY3MpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBubyBwb2ludCBpbiB2YWxpZGF0aW5nIGlmIHdlIGNhbid0IHJlcG9ydCByZXN1bHRzCi0JCWlmIChkaWFnbm9zdGljcyAhPSBudWxsKSB7Ci0JCQkvLyBpZiBFTUYgTW9kZSBWYWxpZGF0aW9uIFNlcnZpY2UgYWxyZWFkeSBjb3ZlcmVkIHRoZSBzdWItdHJlZSwKLQkJCS8vIHdoaWNoIGl0IGRvZXMgZm9yIGVmZmljaWVudCBjb21wdXRhdGlvbiBhbmQgZXJyb3IgcmVwb3J0aW5nLAotCQkJLy8gdGhlbiBkb24ndCByZXBlYXQgKHRoZSBEaWFnbm9zdGljaWFuIGRvZXMgdGhlIHJlY3Vyc2lvbgotCQkJLy8gZXh0ZXJuYWxseSkuIElmIHRoZXJlIGlzIG5vIGNvbnRleHQgbWFwLCB0aGVuIHdlIGNhbid0Ci0JCQkvLyBoZWxwIGl0Ci0JCQlpZiAoIWhhc1Byb2Nlc3NlZChlT2JqZWN0LCBjb250ZXh0KSkgewotCQkJCWlmIChnZXRUcmF2ZXJzYWxUeXBlKGNvbnRleHQpID09IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5ERUVQKSB7Ci0JCQkJCWJhdGNoVmFsaWRhdG9yCi0JCQkJCQkJLnNldFRyYXZlcnNhbFN0cmF0ZWd5KExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5kZWVwVHJhdmVyc2FsU3RyYXRlZ3kpOwotCQkJCX0KLQkJCQkKLQkJCQlJQ29uc3RyYWludEZpbHRlciBmaWx0ZXIgPSAoSUNvbnN0cmFpbnRGaWx0ZXIpIGNvbnRleHQuZ2V0KENUWF9DT05TVFJBSU5UX0ZJTFRFUik7Ci0JCQkJaWYoZmlsdGVyICE9IG51bGwpIHsKLQkJCQkJYmF0Y2hWYWxpZGF0b3IuYWRkQ29uc3RyYWludEZpbHRlcihmaWx0ZXIpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlzdGF0dXMgPSBiYXRjaFZhbGlkYXRvci52YWxpZGF0ZShlT2JqZWN0LAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCQkJYmF0Y2hWYWxpZGF0b3IucmVtb3ZlQ29uc3RyYWludEZpbHRlcihmaWx0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHJvY2Vzc2VkKGVPYmplY3QsIGNvbnRleHQsIHN0YXR1cyk7Ci0KLQkJCQlhcHBlbmREaWFnbm9zdGljcyhzdGF0dXMsIGRpYWdub3N0aWNzKTsKLQkJCX0KLQkJfQotCi0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlT2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJdmFsaWRhdGVQcm9jZXNzKHByb2MsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaXJjdWxhckNoZWNrT2sgJiYgc3RhdHVzLmlzT0soKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gZGlhZ25vc3RpY3MKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUHJvY2VzcyhQcm9jZXNzIHByb2MsIGZpbmFsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywKLQkJCU1hcCBjb250ZXh0KSB7Ci0JCU9iamVjdCBvID0gY29udGV4dC5nZXQoQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUik7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlQcm92aWRlcikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNsYXNzIEZpbHRlcmVkQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciB7Ci0JCQkKLQkJCXB1YmxpYyBGaWx0ZXJlZEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCk7Ci0JCQl9Ci0JCQkKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgY2hpbGQpIHsKLQkJCQlyZXR1cm4gY2hpbGQgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQ7Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN1cGVyLmdldENoaWxkcmVuKG8pOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQl8fCAoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkJJiYgISgoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQpLmlzUmVhZE9ubHkoKSkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQkJfQotCQkJCQlpZiAoYWNjZXB0KGNoaWxkKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJZmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSk7Ci0JCQkJCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJCQkJZmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJCQkJCQl9Ci0JCQkJCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBjaGlsZDsKLQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJLy9jb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJGaWx0ZXJlZEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yLmdldENoaWxkcmVuKCk6IHZhbGlkYXRpbmcgJyIgKyBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJLmNyZWF0ZVZhbGlkYXRvcihvLCBudWxsLAotCQkJCQkJCQkJCQkJKEVPYmplY3QpIGNoaWxkLCBmZWF0dXJlLAotCQkJCQkJCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJCVN0cmluZyBwcm9wID0gKFN0cmluZykgZmVhdHVyZVRvUHJvcGVydHlNYXAuZ2V0KGZlYXR1cmUpOwotCQkJCQkJCQlTdHJpbmcgbmFtZTsKLQkJCQkJCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyICYmIHByb3AgIT0gbnVsbCkgewotCQkJCQkJCQkJbmFtZSA9ICgoSUJTSXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuZ2V0QXR0cmlidXRlKGNoaWxkLCBwcm9wKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCW5hbWUgPSAoU3RyaW5nKSBlLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpOwotCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCWFwcGVuZERpYWdub3N0aWNzKG5ldyBWYWxpZGF0aW9uU3RhdHVzKAotCQkJCQkJCQkJCQlJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGUsIGZlYXR1cmUpLAotCQkJCQkJCQkJCQlkaWFnbm9zdGljcyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCQlJQWRhcHRlckZhY3RvcnlQcm92aWRlciBwcm92aWRlciA9IChJQWRhcHRlckZhY3RvcnlQcm92aWRlcikgbzsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgRmlsdGVyZWRBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihwcm92aWRlcgotCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJOwotCQkKLQkJaXRlcmF0b3IgPSBuZXcgRmlsdGVyZWRBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihwcm92aWRlci5nZXRUQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKSB7Ci0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlICNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBjaGlsZCkgewotCQkJCXJldHVybiBjaGlsZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IGNoaWxkIGluc3RhbmNlb2YgVGVhbVByb2ZpbGU7Ci0JCQl9Ci0JCX07Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCTsKLQkJCi0JCWl0ZXJhdG9yID0gbmV3IEZpbHRlcmVkQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IocHJvdmlkZXIuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IGNoaWxkKSB7Ci0JCQkJcmV0dXJuIGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCQkJfQotCQl9OwotCQlmb3IgKDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpdGVyYXRvci5uZXh0KCkpCi0JCQk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFRyYXZlcnNhbFR5cGUoTWFwIGNvbnRleHQpIHsKLQkJT2JqZWN0IHR5cGUgPSBjb250ZXh0LmdldChMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuVFJBVkVSU0FMX1RZUEUpOwotCQlyZXR1cm4gKHR5cGUgaW5zdGFuY2VvZiBOdW1iZXIgJiYgKChOdW1iZXIpIHR5cGUpLmludFZhbHVlKCkgPT0gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LkRFRVApID8gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LkRFRVAKLQkJCQk6IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5TSEFET1c7Ci0JfQotCi0JLyoqCi0JICogRGlyZWN0IHZhbGlkYXRpb24gb2Yge0BsaW5rIEVEYXRhVHlwZX1zIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEVNRgotCSAqIHZhbGlkYXRpb24gZnJhbWV3b3JrOyB0aGV5IGFyZSB2YWxpZGF0ZWQgaW5kaXJlY3RseSB2aWEgdGhlCi0JICoge0BsaW5rIEVPYmplY3R9cyB0aGF0IGhvbGQgdGhlaXIgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCB2YWx1ZSwKLQkJCURpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKGVEYXRhVHlwZSwgdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBoYXZlIGEgY29udGV4dCBtYXAsIHJlY29yZCB0aGlzIG9iamVjdCdzIDxjb2RlPnN0YXR1czwvY29kZT4gaW4KLQkgKiBpdCBzbyB0aGF0IHdlIHdpbGwga25vdyBsYXRlciB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGl0IGFuZCBpdHMgc3ViLXRyZWUuCi0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIGFuIGVsZW1lbnQgdGhhdCB3ZSBoYXZlIHZhbGlkYXRlZAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50J3MgdmFsaWRhdGlvbiBzdGF0dXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc2VkKEVPYmplY3QgZU9iamVjdCwgTWFwIGNvbnRleHQsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWNvbnRleHQucHV0KGVPYmplY3QsIHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgd2UgaGF2ZSBwcm9jZXNzZWQgdGhpcyA8Y29kZT5lT2JqZWN0PC9jb2RlPiBiZWZvcmUsCi0JICogYnkgYXV0b21hdGljIHJlY3Vyc2lvbiBvZiB0aGUgRU1GIE1vZGVsIFZhbGlkYXRpb24gU2VydmljZS4gVGhpcyBpcyBvbmx5Ci0JICogcG9zc2libGUgaWYgd2UgZG8sIGluZGVlZCwgaGF2ZSBhIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIGFuIGVsZW1lbnQgdG8gYmUgdmFsaWRhdGVkICh3ZSBob3BlIG5vdCkKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZXh0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgIHRoZSA8Y29kZT5lT2JqZWN0PC9jb2RlPiBvciBvbmUgb2YgaXRzIGNvbnRhaW5lcnMgaGFzIGFscmVhZHkKLQkgKiAgICAgICAgIGJlZW4gdmFsaWRhdGVkOyA8Y29kZT5mYWxzZTwvY29kZT4sIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNQcm9jZXNzZWQoRU9iamVjdCBlT2JqZWN0LCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCS8vIHRoaXMgaXMgTyhObG9nTikgYnV0IHRoZXJlJ3Mgbm8gaGVscGluZyBpdAotCQkJd2hpbGUgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChjb250ZXh0LmNvbnRhaW5zS2V5KGVPYmplY3QpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWVPYmplY3QgPSBudWxsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVPYmplY3QgPSBlT2JqZWN0LmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RhdHVzIHJlc3VsdCBmcm9tIHRoZSBFTUYgdmFsaWRhdGlvbiBzZXJ2aWNlIHRvIGRpYWdub3N0aWNzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBFTUYgdmFsaWRhdGlvbiBzZXJ2aWNlJ3Mgc3RhdHVzIHJlc3VsdAotCSAqIEBwYXJhbSBkaWFnbm9zdGljcwotCSAqICAgICAgICAgICAgYSBkaWFnbm9zdGljIGNoYWluIHRvIGFjY3VtdWxhdGUgcmVzdWx0cyBvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmREaWFnbm9zdGljcyhJU3RhdHVzIHN0YXR1cywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzKSB7Ci0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERpYWdub3N0aWNzKGNoaWxkcmVuW2ldLCBkaWFnbm9zdGljcyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RhdHVzIGluc3RhbmNlb2YgSUNvbnN0cmFpbnRTdGF0dXMpIHsKLQkJCWRpYWdub3N0aWNzLmFkZChuZXcgQmFzaWNEaWFnbm9zdGljKHN0YXR1cy5nZXRTZXZlcml0eSgpLCBzdGF0dXMKLQkJCQkJLmdldFBsdWdpbigpLCBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLAotCQkJCQkoKElDb25zdHJhaW50U3RhdHVzKSBzdGF0dXMpLmdldFJlc3VsdExvY3VzKCkudG9BcnJheSgpKSk7Ci0JCX0gZWxzZSBpZiAoc3RhdHVzIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0dXMpIHsKLQkJCWRpYWdub3N0aWNzLmFkZChuZXcgQmFzaWNEaWFnbm9zdGljKHN0YXR1cy5nZXRTZXZlcml0eSgpLCBzdGF0dXMKLQkJCQkJLmdldFBsdWdpbigpLCBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLAotCQkJCQluZXcgT2JqZWN0W10geyAoKG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdHVzKSBzdGF0dXMpCi0JCQkJCQkJLmdldENoZWNrZWRPYmplY3QoKSB9KSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaWFnbm9zdGljcy5hZGQobmV3IEJhc2ljRGlhZ25vc3RpYyhzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgc3RhdHVzCi0JCQkJCS5nZXRQbHVnaW4oKSwgc3RhdHVzLmdldENvZGUoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSwKLQkJCQkJbnVsbCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MmE0MjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotY2lyY3VsYXJEZXBlbmRlbmN5X2Vycm9yPUN5Y2xlcyBmb3VuZCBpbiB0aGUgZGVwZW5kZW5jeSBncmFwaCBvZiB0aGUgYXNzb2NpYXRpb24gezB9LnsxfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDU0NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNpcmN1bGFyRGVwZW5kZW5jeV9lcnJvcjsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBWYWxpZGF0aW9uUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRpb25SZXNvdXJjZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL0xpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL0xpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIzNDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbC5Db250ZW50VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuQWJzdHJhY3RUcmF2ZXJzYWxTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLklUcmF2ZXJzYWxTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFRyYXZlcnNhbFN0cmF0ZWd5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFWRVJTQUxfVFlQRSA9ICJUUkFWRVJTQUxfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUcmF2ZXJzYWwgc3RyYXRlZ3kgdHlwZSBjb25zdGFudCBmb3Igc2hhZG93IHRyYXZlcnNhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQURPVyA9IDA7Ci0JCi0JLyoqCi0JICogVHJhdmVyc2FsIHN0cmF0ZWd5IHR5cGUgY29uc3RhbnQgZm9yIGRlZXAgdHJhdmVyc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVFUCA9IDE7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJVHJhdmVyc2FsU3RyYXRlZ3kgZGVlcFRyYXZlcnNhbFN0cmF0ZWd5ID0gbmV3IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneShERUVQKTsKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIExpYnJhcnlJdGVyYXRvciBleHRlbmRzIENvbnRlbnRUcmVlSXRlcmF0b3IgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTE3NTQyODAyNzUwMzQ0MDk3MEw7Ci0JCXByaXZhdGUgaW50IHRyYXZlcnNhbFR5cGUgPSBERUVQOwotCQkKLQkJcHJvdGVjdGVkIExpYnJhcnlJdGVyYXRvcihDb2xsZWN0aW9uIGVtZk9iamVjdHMpIHsKLQkJCXN1cGVyKGVtZk9iamVjdHMpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIG9iamVjdAotCQkgKiBAcGFyYW0gaXNSZXNvbHZlUHJveGllcwotCQkgKi8KLQkJcHVibGljIExpYnJhcnlJdGVyYXRvcihDb2xsZWN0aW9uIGVPYmplY3RzLCBib29sZWFuIGlzUmVzb2x2ZVByb3hpZXMsIGludCB0cmF2ZXJzYWxUeXBlLCBib29sZWFuIGRpc2pvaW50KSB7Ci0JCQlzdXBlcihkaXNqb2ludCA/IG1ha2VUYXJnZXRzRGlzam9pbnQoZU9iamVjdHMpIDogZU9iamVjdHMsIGlzUmVzb2x2ZVByb3hpZXMpOwotCQkJdGhpcy50cmF2ZXJzYWxUeXBlICA9IHRyYXZlcnNhbFR5cGU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmF0b3I8Pz4gZ2V0RU9iamVjdENoaWxkcmVuKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZih0cmF2ZXJzYWxUeXBlID09IERFRVApIHsKLQkJCQlpZighKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQl8fCAob2JqZWN0IGluc3RhbmNlb2YgQ29uc3RyYWludCB8fCBvYmplY3QgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkpIAotCQkJCXsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVPYmplY3RDaGlsZHJlbihvYmplY3QpOwotCQkJfQotCQkJCi0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiBnZXRFT2JqZWN0Q2hpbGRyZW4oKEN1c3RvbUNhdGVnb3J5KW9iamVjdCwgVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTLAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUlkpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQl8fCBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpIG9iamVjdDsKLQkJCQlpZihUbmdVdGlsLmlzUHJlZGVmaW5lZChwa2cpICYmIE1vZGVsU3RydWN0dXJlLkNVU1RPTV9DQVRFR09SWV9QQUNLQUdFX05BTUUuZXF1YWxzKHBrZy5nZXROYW1lKCkpKSB7Ci0JCQkJCS8vIHRoaXMgaXMgdGhlIGNvbnRlbnQgcGFja2FnZSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgY3VzdG9tIGNhdGVnb3JpZXMKLQkJCQkJLy8gcmV0dXJuIHJvb3QgY3VzdG9tIGNhdGVnb3J5IGFzIGl0cyBvbmx5IGNoaWxkCi0JCQkJCS8vCi0JCQkJCUNvbnRlbnRQYWNrYWdlIGhpZGRlblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBrZwotCQkJCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCksIE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQkJCQlpZiAoaGlkZGVuUGtnICE9IG51bGwgJiYgIWhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybiBoaWRkZW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBnZXRFT2JqZWN0Q2hpbGRyZW4ocGtnLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXJldHVybiBnZXRFT2JqZWN0Q2hpbGRyZW4oCi0JCQkJCQkoTWV0aG9kTGlicmFyeSkgb2JqZWN0LAotCQkJCQkJbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMgfSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gZ2V0RU9iamVjdENoaWxkcmVuKChFT2JqZWN0KSBvYmplY3QsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCA9PSB0aGlzLm9iamVjdCkgewotCQkJCXJldHVybiAoKENvbGxlY3Rpb24pb2JqZWN0KS5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQl9Ci0JCQotCQlwcml2YXRlIEl0ZXJhdG9yIGdldEVPYmplY3RDaGlsZHJlbihFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCQlFQ29udGVudHNFTGlzdCBsaXN0ID0gbmV3IEVDb250ZW50c0VMaXN0KGVPYmplY3QsIGZlYXR1cmVzKTsKLQkJCXJldHVybiBpc1Jlc29sdmVQcm94aWVzKCkgPyBsaXN0Lml0ZXJhdG9yKCkgOiBsaXN0LmJhc2ljSXRlcmF0b3IoKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJdGVyYXRvciBnZXRFT2JqZWN0Q2hpbGRyZW4oRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwgRUNsYXNzIGVDbGFzcykgewotCQkJSXRlcmF0b3IgaXRlcjsKLQkJCWlmKHJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCWJvb2xlYW4gcmVzb2x2ZSA9IGlzUmVzb2x2ZVByb3hpZXMoKTsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgZU9iamVjdC5lR2V0KHJlZmVyZW5jZSwgcmVzb2x2ZSk7Ci0JCQkJaXRlciA9ICFyZXNvbHZlICYmIChsaXN0IGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgPyAoKEludGVybmFsRUxpc3QpbGlzdCkuYmFzaWNJdGVyYXRvcigpIDogbGlzdC5pdGVyYXRvcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gZU9iamVjdC5lR2V0KHJlZmVyZW5jZSwgaXNSZXNvbHZlUHJveGllcygpKTsKLQkJCQlpdGVyID0gdmFsdWUgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpLml0ZXJhdG9yKCkgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQlpZihlQ2xhc3MgPT0gbnVsbCkgewotCQkJCXJldHVybiBpdGVyOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYoZUNsYXNzLmlzSW5zdGFuY2UobykpIHsKLQkJCQkJCWxpc3QuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBjb3VudEVsZW1lbnRzKENvbGxlY3Rpb24gdHJhdmVyc2FsUm9vdHMsIGludCB0cmF2ZXJzYWxUeXBlKSB7Ci0JCXJldHVybiBjb3VudEVsZW1lbnRzKHRyYXZlcnNhbFJvb3RzLCB0cnVlLCB0cmF2ZXJzYWxUeXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50RWxlbWVudHMoQ29sbGVjdGlvbiB0cmF2ZXJzYWxSb290cywgYm9vbGVhbiBtYWtlRGlzam9pbnQsIGludCB0cmF2ZXJzYWxUeXBlKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihJdGVyYXRvciBpdGVyID0gbmV3IExpYnJhcnlJdGVyYXRvcih0cmF2ZXJzYWxSb290cywgdHJ1ZSwgdHJhdmVyc2FsVHlwZSwgbWFrZURpc2pvaW50KTsgaXRlci5oYXNOZXh0KCk7IGNvdW50KyspIHsKLQkJCWl0ZXIubmV4dCgpOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gcm9vdHM7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbnRleHRDaGFuZ2VkID0gdHJ1ZTsKLQotCXByaXZhdGUgaW50IHR5cGUgPSBERUVQOwotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIG1lLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3koaW50IHRyYXZlcnNhbFR5cGUpIHsKLQkJdGhpcy50eXBlICA9IHRyYXZlcnNhbFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0VHJhdmVyc2FsKAotCQkJQ29sbGVjdGlvbiB0cmF2ZXJzYWxSb290cywKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQotCQlyb290cyA9IG1ha2VUYXJnZXRzRGlzam9pbnQodHJhdmVyc2FsUm9vdHMpOwotCQkKLQkJc3VwZXIuc3RhcnRUcmF2ZXJzYWwodHJhdmVyc2FsUm9vdHMsIHByb2dyZXNzTW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRSb290cygpIHsKLQkJcmV0dXJuIHJvb3RzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogSW1wbGVtZW50cyB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvdW50RWxlbWVudHMoQ29sbGVjdGlvbiBpZ25vcmVkKSB7Ci0JCXJldHVybiBjb3VudEVsZW1lbnRzKGdldFJvb3RzKCksIGZhbHNlLCB0eXBlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEltcGxlbWVudHMgdGhlIGluaGVyaXRlZCBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGNyZWF0ZUl0ZXJhdG9yKENvbGxlY3Rpb24gaWdub3JlZCkgewotCQlyZXR1cm4gbmV3IExpYnJhcnlJdGVyYXRvcihnZXRSb290cygpLCB0cnVlLCB0eXBlLCBmYWxzZSkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU2NTMxMzQ5ODkyMzU2NjM5NzNMOwotCi0JCQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogPT0gZ2V0Um9vdHMoKSkgewotCQkJCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBkZWxlZ2F0ZSA9Ci0JCQkJCQkJZ2V0Um9vdHMoKS5pdGVyYXRvcigpOwotCQkJCQkJCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQkJCXJldHVybiBkZWxlZ2F0ZS5oYXNOZXh0KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJCQkvLyBpZiBJJ20gYmVpbmcgYXNrZWQgZm9yIG15IG5leHQgZWxlbWVudCwgdGhlbgotCQkJCQkJCS8vICAgIHdlIGFyZSBzdGVwcGluZyB0byBhbm90aGVyIHRyYXZlcnNhbCByb290Ci0JCQkJCQkJY29udGV4dENoYW5nZWQgPSB0cnVlOwotCQkJCQkJCQotCQkJCQkJCXJldHVybiBkZWxlZ2F0ZS5uZXh0KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQkJCQlkZWxlZ2F0ZS5yZW1vdmUoKTsKLQkJCQkJCX19OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCS8vIHRoaXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBhZ2FpbiB0aGUgbmV4dCB0aW1lIHdlIHRlc3QgaGFzTmV4dCgpIGF0Ci0JCQkJLy8gICAgdGhlIHRyYXZlcnNhbCByb290IGxldmVsCi0JCQkJY29udGV4dENoYW5nZWQgPSBmYWxzZTsKLQkJCQkKLQkJCQlyZXR1cm4gc3VwZXIubmV4dCgpOwotCQkJfX07Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50Q29udGV4dENoYW5nZWQoKSB7Ci0JCXJldHVybiBjb250ZXh0Q2hhbmdlZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXQgbWFrZVRhcmdldHNEaXNqb2ludChDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJU2V0IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwotCQkKLQkJLy8gZW5zdXJlIHRoYXQgYW55IGNvbnRhaW5lZCAoZGVzY2VuZGVudCkgZWxlbWVudHMgb2Ygb3RoZXIgZWxlbWVudHMKLQkJLy8gICAgdGhhdCB3ZSBpbmNsdWRlIGFyZSBub3QgaW5jbHVkZWQsIGJlY2F1c2UgdGhleSB3aWxsIGJlCi0JCS8vICAgIHRyYXZlcnNlZCBieSByZWN1cnNpb24sIGFueXdheQotCQkKLQkJZm9yIChJdGVyYXRvciBvdXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgb3V0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvdXRlck5leHQgPSAoRU9iamVjdClvdXRlci5uZXh0KCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaW5uZXIgPSByZXN1bHQuaXRlcmF0b3IoKTsgaW5uZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgaW5uZXJOZXh0ID0gKEVPYmplY3QpaW5uZXIubmV4dCgpOwotCQkJCQotCQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcihpbm5lck5leHQsIG91dGVyTmV4dCkpIHsKLQkJCQkJb3V0ZXJOZXh0ID0gbnVsbDsgIC8vIGZvcmdldCB0aGlzIG9uZQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChvdXRlck5leHQgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQob3V0ZXJOZXh0KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL05hbWVDb25zdHJhaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTmFtZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyZjZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTmFtZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLkFic3RyYWN0TW9kZWxDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLkVNRkV2ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24udXRpbC5WYWxpZGF0aW9uU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0TW9kZWxDb25zdHJhaW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRUNsYXNzW10gQ09OVEVOVF9FTEVNRU5UX1RZUEVTID0gZ2V0Q29udGVudEVsZW1lbnRUeXBlcygpOwotLy8KLS8vCXByaXZhdGUgc3RhdGljIEVDbGFzc1tdIGdldENvbnRlbnRFbGVtZW50VHlwZXMoKSB7Ci0vLwkJQXJyYXlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgdHlwZSA9IGl0ZXIubmV4dCgpOwotLy8JCQlpZih0eXBlIGluc3RhbmNlb2YgRUNsYXNzICYmIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5ULmlzU3VwZXJUeXBlT2YoKEVDbGFzcykgdHlwZSkpIHsKLS8vCQkJCXR5cGVzLmFkZCh0eXBlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlFQ2xhc3NbXSBlQ2xhc3NlcyA9IG5ldyBFQ2xhc3NbdHlwZXMuc2l6ZSgpXTsKLS8vCQl0eXBlcy50b0FycmF5KGVDbGFzc2VzKTsKLS8vCQlyZXR1cm4gZUNsYXNzZXM7Ci0vLwl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNhbkNoZWNrKE9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiBlT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgZU9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCQl8fCBlT2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQl8fCBlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCXx8ICgoZU9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlIHx8IGVPYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgJiYgVW1hVXRpbAotCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoKE1ldGhvZEVsZW1lbnQpIGVPYmopID09IG51bGwpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLkFic3RyYWN0TW9kZWxDb25zdHJhaW50I3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB7Ci0JCUVPYmplY3QgZU9iaiA9IGN0eC5nZXRUYXJnZXQoKTsKLQkJRU1GRXZlbnRUeXBlIGVUeXBlID0gY3R4LmdldEV2ZW50VHlwZSgpOwotCi0JCWlmKERFQlVHKSB7Ci0JCQlpZihlT2JqIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBlT2JqOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTmFtZUNvbnN0cmFpbnQudmFsaWRhdGUoKTogIiArIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSkgKyAiOiAnIiArIGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCWlmKGVPYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJfQotCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbiB0aGUgY2FzZSBvZiBiYXRjaCBtb2RlLgotCQlpZiAoZVR5cGUgPT0gRU1GRXZlbnRUeXBlLk5VTEwpIHsKLQkJCWlmKChlT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZU9iaikpKQotCQkJewotCQkJCS8vIHNraXAgdmFsaWRhdGluZyBwcmVkZWZpbmVkIG1ldGhvZCBlbGVtZW50cywgQ29udGVudERlc2NyaXB0aW9uCi0JCQkJLy8KLQkJCQlyZXR1cm4gY3R4LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLQkJCX0KLQkJCQotCQkJLy8gdmFsaWRhdGUgb2JqZWN0J3MgbmFtZQotCQkJLy8KLQkJCWlmKGVPYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KWVPYmo7Ci0JCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKHBhcmVudCwgY2MpOwotCQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoY2MuZ2V0TmFtZSgpKTsKLQkJCQkJaWYobXNnICE9IG51bGwpIHsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGNjLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpKTsKLQkJCQkJfQotCQkJCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKHBhcmVudCwgY2MpOwotCQkJCQltc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChjYy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCQlpZihtc2cgIT0gbnVsbCkgewotCQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywgY2MsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNhbkNoZWNrKGVPYmopKSAKLQkJCXsKLQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpZU9iajsKLQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoZU9iai5lQ29udGFpbmVyKCksIGUpOwotCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChlLmdldE5hbWUoKSk7Ci0JCQkJaWYobXNnICE9IG51bGwpIHsKLQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywgZSwgVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKSk7Ci0JCQkJfQotLyoJCQkJaWYoZU9iaiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQlEZXNjcmliYWJsZUVsZW1lbnQgZGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlT2JqOwotCQkJCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKGVPYmouZUNvbnRhaW5lcigpLCBkZSk7Ci0JCQkJCW1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGRlLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLCBlLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSkpOwotCQkJCQl9Ci0JCQkJfSovCi0JCQl9Ci0JCQkKLS8vCQkJLy8gdmFsaWRhdGUgbmFtZSBvZiB0aGUgY2hpbGRyZW4KLS8vCQkJLy8KLS8vCQkJaWYoZU9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLS8vCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihlT2JqLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywgCi0vLwkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTik7Ci0vLwkJCQlpZighc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCW11bHRpU3RhdHVzLm1lcmdlKHN0YXR1cyk7Ci0vLwkJCQl9Ci0vLwkJCQlzdGF0dXMgPSBjaGVja0NoaWxkcmVuKGVPYmosIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMsIAotLy8JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OKTsKLS8vCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQllbHNlIGlmKGVPYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotLy8JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBlT2JqOwotLy8JCQkJYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0vLwkJCQlpZihUbmdVdGlsLmlzUHJlZGVmaW5lZChwa2cpKSB7Ci0vLwkJCQkJU3RyaW5nIG5hbWUgPSBwa2cuZ2V0TmFtZSgpOwotLy8JCQkJCWlmKE1vZGVsU3RydWN0dXJlLkRJU0NJUExJTkVfUEFDS0FHRV9OQU1FLmVxdWFscyhuYW1lKSkgewotLy8JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNoZWNrQ2hpbGRyZW4oZU9iaiwgVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsIAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORSk7CQkJCQotLy8JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCQkJfQotLy8JCQkJCQljaGVja2VkID0gdHJ1ZTsKLS8vCQkJCQl9Ci0vLwkJCQkJZWxzZSBpZiAoTW9kZWxTdHJ1Y3R1cmUuUk9MRV9TRVRfUEFDS0FHRV9OQU1FLmVxdWFscyhuYW1lKSkgewotLy8JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNoZWNrQ2hpbGRyZW4oZU9iaiwgVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsIAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVQpOwkJCQkKLS8vCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQkJCW11bHRpU3RhdHVzLm1lcmdlKHN0YXR1cyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJY2hlY2tlZCA9IHRydWU7Ci0vLwkJCQkJfQotLy8JCQkJCWVsc2UgaWYgKCEoTW9kZWxTdHJ1Y3R1cmUuQ09SRV9DT05URU5UX1BBQ0FLR0VfTkFNRS5lcXVhbHMobmFtZSkpKSB7Ci0vLwkJCQkJCWNoZWNrZWQgPSB0cnVlOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWlmKCFjaGVja2VkKSB7Ci0vLwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDT05URU5UX0VMRU1FTlRfVFlQRVMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBjaGVja0NoaWxkcmVuKGVPYmosIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLCAKLS8vCQkJCQkJCQlDT05URU5UX0VMRU1FTlRfVFlQRVNbaV0pOwkJCQkKLS8vCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQkJCW11bHRpU3RhdHVzLm1lcmdlKHN0YXR1cyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJZWxzZSBpZihlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLS8vCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihlT2JqLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywgCi0vLwkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFKTsKLS8vCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCX0KLS8vCQkJfQotCQkJCi0JCQlpZihtdWx0aVN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gY3R4LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBtdWx0aVN0YXR1czsKLQkJCX0KLQkJCQotCQkvLyBJbiB0aGUgY2FzZSBvZiBsaXZlIG1vZGUuCi0JCX0gZWxzZSB7Ci0JCQlPYmplY3QgbmV3VmFsdWUgPSBjdHguZ2V0RmVhdHVyZU5ld1ZhbHVlKCk7Ci0JCQkKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsIHx8ICgoU3RyaW5nKW5ld1ZhbHVlKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGN0eC5jcmVhdGVGYWlsdXJlU3RhdHVzKG5ldyBPYmplY3RbXSB7ZU9iai5lQ2xhc3MoKS5nZXROYW1lKCl9KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGN0eC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hpbGRGaWx0ZXIgZXh0ZW5kcyBUeXBlRmlsdGVyIHsKLQotCQlwcml2YXRlIFNldCBjaGVja2VkQ2hpbGRyZW47Ci0KLQkJcHVibGljIENoaWxkRmlsdGVyKEVDbGFzcyBlQ2xhc3MsIFNldCBjaGVja2VkQ2hpbGRyZW4pIHsKLQkJCXN1cGVyKGVDbGFzcyk7Ci0JCQl0aGlzLmNoZWNrZWRDaGlsZHJlbiA9IGNoZWNrZWRDaGlsZHJlbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoY2hlY2tlZENoaWxkcmVuLmNvbnRhaW5zKG9iaikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgY2hlY2tDaGlsZHJlbihFT2JqZWN0IG9iamVjdCwgRVJlZmVyZW5jZSBjaGlsZEZlYXR1cmUsCi0JCQlFQ2xhc3MgZUNsYXNzKSB7Ci0JCUxpc3Qgc3RhdHVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvYmplY3QuZUdldChjaGlsZEZlYXR1cmUpOwotCQlTZXQgY2hlY2tlZENoaWxkcmVuID0gbmV3IEhhc2hTZXQoKTsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG5ldyBDaGlsZEZpbHRlcihlQ2xhc3MsIGNoZWNrZWRDaGlsZHJlbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVWYWxpZGF0b3Iob2JqZWN0LCBjaGlsZEZlYXR1cmUsIGNoaWxkRmlsdGVyLAotCQkJCQkJCQljaGlsZCwgVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKTsKLQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGNoaWxkOwotCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCXN0YXR1c0xpc3QuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywKLQkJCQkJCQllLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuY3JlYXRlVmFsaWRhdG9yKAotCQkJCQkJCQlvYmplY3QsCi0JCQkJCQkJCWNoaWxkRmVhdHVyZSwKLQkJCQkJCQkJY2hpbGRGaWx0ZXIsCi0JCQkJCQkJCWNoaWxkLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBjaGlsZDsKLQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlzdGF0dXNMaXN0Ci0JCQkJCQkJLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJbXNnLAotCQkJCQkJCQkJZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghc3RhdHVzTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWlmIChzdGF0dXNMaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQkJcmV0dXJuIChJU3RhdHVzKSBzdGF0dXNMaXN0LmdldCgwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVN0YXR1c1tdIG5ld0NoaWxkcmVuID0gbmV3IElTdGF0dXNbc3RhdHVzTGlzdC5zaXplKCldOwotCQkJCXN0YXR1c0xpc3QudG9BcnJheShuZXdDaGlsZHJlbik7Ci0JCQkJcmV0dXJuIG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuUExVR0lOX0lELCAwLCBuZXdDaGlsZHJlbiwKLQkJCQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9SZWxhdGlvbnNoaXBDb25zdHJhaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvUmVsYXRpb25zaGlwQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTVlY2EyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9SZWxhdGlvbnNoaXBDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uRU1GRXZlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsLlZhbGlkYXRpb25TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gcmVmZXJlbmNlc1RvQ2hlY2tGb3JDaXJjdWxhckRlcGVuZGVuY3kgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7Ci0JCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTCi0JCQksIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVAotCQkJLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMKLQkJCSwgVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMKLQkJCSwgVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTCi0JfSk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5BYnN0cmFjdE1vZGVsQ29uc3RyYWludCN2YWxpZGF0ZShvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgewotCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2spIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUVPYmplY3QgZU9iaiA9IGN0eC5nZXRUYXJnZXQoKTsKLQkJRU1GRXZlbnRUeXBlIGVUeXBlID0gY3R4LmdldEV2ZW50VHlwZSgpOwotCQkKLQkJaWYoREVCVUcpIHsKLQkJCWlmKGVPYmogaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGVPYmo7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbnNoaXBDb25zdHJhaW50LnZhbGlkYXRlKCk6ICIgKyBUbmdVdGlsLmdldFR5cGVUZXh0KGUpICsgIjogJyIgKyBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQotCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbiB0aGUgY2FzZSBvZiBiYXRjaCBtb2RlLgotCQlpZiAoZVR5cGUgPT0gRU1GRXZlbnRUeXBlLk5VTEwpIHsKLQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KHJlZmVyZW5jZXNUb0NoZWNrRm9yQ2lyY3VsYXJEZXBlbmRlbmN5KTsKLQkJCWZlYXR1cmVzLnJldGFpbkFsbChlT2JqLmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKExpc3QpZU9iai5lR2V0KHJlZikpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShlT2JqLCByZWYsIG8pOwotCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgbXNnID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQkJCQlpZihTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCQkJCQltc2cgPSBOTFMuYmluZChWYWxpZGF0aW9uUmVzb3VyY2VzLmNpcmN1bGFyRGVwZW5kZW5jeV9lcnJvciwgcmVmLmdldEVDb250YWluaW5nQ2xhc3MoKS5nZXROYW1lKCksIHJlZi5nZXROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLCBlT2JqLCByZWYpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJT2JqZWN0IG8gPSBlT2JqLmVHZXQocmVmKTsKLQkJCQkJaWYobyAhPSBudWxsKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGVPYmosIHJlZiwgbyk7Ci0JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCWlmKFN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJCQkJCW1zZyA9IE5MUy5iaW5kKFZhbGlkYXRpb25SZXNvdXJjZXMuY2lyY3VsYXJEZXBlbmRlbmN5X2Vycm9yLCByZWYuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldE5hbWUoKSwgcmVmLmdldE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGVPYmosIHJlZikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZihtdWx0aVN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gY3R4LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBtdWx0aVN0YXR1czsKLQkJCX0JCQkKLQkJfSAKLQkJCi0JCXJldHVybiBjdHguY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1N0YXJ0dXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1N0YXJ0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjMzE3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vdXRpbC9TdGFydHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkxpYnJhcnlFVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdGFydHVwOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTdGFydHVwI2Vhcmx5U3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgewotCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dCgKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRSwKLQkJCQluZXcgTGlicmFyeUVWYWxpZGF0b3IoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vdXRpbC9WYWxpZGF0aW9uU3RhdHVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vdXRpbC9WYWxpZGF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZDQ3YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL3V0aWwvVmFsaWRhdGlvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24udXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdGF0dXMgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXR1cyB7Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGNoZWNrZWRPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKEFjdGl2YXRvci5QTFVHSU5fSUQsIHNldmVyaXR5LCBjb2RlLCBtZXNzYWdlLCBjaGVja2VkT2JqZWN0LCBmZWF0dXJlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxNjRiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJydW50aW1lIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jdnNpZ25vcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2YTdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXJ1bnRpbWUKLWJpbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzMmE5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi54bWwudW1hPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwMDFjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNUaHUgTWF5IDAzIDE2OjU2OjU3IFBEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2Q9VVRGOAotZW5jb2RpbmcvL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDcwNDAzMTQyNS54c2Q9VVRGOAotZW5jb2RpbmcvL3NyYy9tb2RlbC9VTUEueHNkPVVURjgKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjQxYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmYjE2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBidWlsZC5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDQganRoYW0gRXhwICQKLQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4MTRmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4KLSMgPC9jb3B5cmlnaHQ+Ci0jCi0jICRJZDogcGx1Z2luLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowNCBqdGhhbSBFeHAgJAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wbHVnaW5OYW1lID0gRVBGIFhNTCBVTUEgTW9kZWwKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzNWIxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowNCBqdGhhbSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICA8cGFja2FnZSAKLSAgICAgICB1cmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlIiAvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgPHBhcnNlciAKLSAgICAgICB0eXBlPSJ1bWEiIAotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsLlVtYVJlc291cmNlRmFjdG9yeUltcGwiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwODMwMDczNi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmM0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRVBGIFVNQSBYTUwgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvRmluaXNoIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9GaW5pc2giLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRyaWJ1dGVzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxDb250cmlidXRpb24iLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPd25lZFJ1bGUiIHR5cGU9InVtYTpDb25zdHJhaW50Ij4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25zdHJhaW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VjdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY3Rpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFwcGxpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhY2tncm91bmQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkdvYWxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkxldmVsc09mQWRvcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9ibGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdE9mTm90SGF2aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJpZWZPdXRsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdpbmdHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2tpbGxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTeW5vbnltcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRhdGlvbiIgdHlwZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJub2RlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uY2VwdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNoZWNrbGlzdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhhbXBsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGVsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25NZXRyaWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW5nTWV0cmljIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvYWRtYXAiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sTWVudG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldoaXRlcGFwZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbmNlcHQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZWZpbmVzIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRlcm1EZWZpbml0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY3Rpdml0eVJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudFJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViUHJhY3RpY2UiIHR5cGU9InVtYTpQcmFjdGljZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhaW5lZEFydGlmYWN0IiB0eXBlPSJ1bWE6QXJ0aWZhY3QiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3V0Y29tZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFzayI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtEZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJEaXNjaXBsaW5lIiB0eXBlPSJ1bWE6RGlzY2lwbGluZSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlV29ya2Zsb3ciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlzY2lwbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEb21haW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJkb21haW4iIHR5cGU9InVtYTpEb21haW4iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Pcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAiQW5hbHlzdHMiIFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAiQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0IiwgIlN5c3RlbSBBbmFseXN0IiwgYXMgd2VsbCBhcyAiUmVxdWlyZW1lbnRzIFNwZWNpZmllciIgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlU2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yaXplZEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkNhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2VkUGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2xvYmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudEVsZW1lbnQiIHR5cGU9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IG9ubHkgY29udGFpbnMgQ29udGVudCBDYXRlZ29yeSBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudENhdGVnb3J5IiB0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQbGFubmluZ0RhdGEiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBQcm9jZXNzIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0RGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmluaXNoRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InJhbmsiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGVkQWZ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGVkQmVmb3JlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBsYW5uaW5nRGF0YSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlckFjdGl2aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUGxhbm5lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrT3JkZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnbG9iYWwgdW5pcXVlIGlkIGZvciBhIHdvcmsgb3JkZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGlua1R5cGUiIHR5cGU9InVtYTpXb3JrT3JkZXJUeXBlIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InVtYTpXb3JrT3JkZXIiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNSZXBlYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09uZ29pbmciIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzRXZlbnREcml2ZW4iIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbGVzdG9uZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIHR5cGU9InVtYTpCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2FkbWFwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJc0VuYWN0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQaGFzZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlcmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikhvd1RvU3RhZmYiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmaW5lZERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NvcGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVXNhZ2VOb3RlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSaXNrTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW5nVGVjaG5pcXVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZDb250cmFjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dEZyb20iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyYWJsZVBhcnRzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaXN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RlcCIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Um9sZURlc2NyaXB0b3IiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlZFJvbGUiIHR5cGU9InVtYTpSb2xlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlYW1Qcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbmNsdWRlc1BhdHRlcm4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlZhbGlkQ29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFZHVjYXRpb25NYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZVByb2Nlc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NFbGVtZW50IiB0eXBlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJ1bWE6VGFza0Rlc2NyaXB0b3IiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZUlPIiB0eXBlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NQYWNrYWdlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZSIgdHlwZT0idW1hOlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2VzcyIgdHlwZT0idW1hOlByb2Nlc3MiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlQ29uZmlndXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0VmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzVmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RMaWJyYXJ5IiB0eXBlPSJ1bWE6TWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA5MDcxMzM0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kc1JlcGxhY2VzIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVkRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpOYW1lZEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3duZWRSdWxlIiB0eXBlPSJ1bWE6Q29uc3RyYWludCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlY3Rpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWN0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kVW5pdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iS2V5Q29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsSW5mbyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBcHBsaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYWNrZ3JvdW5kIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHb2FscyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMZXZlbHNPZkFkb3B0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvYmxlbSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RPZk5vdEhhdmluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWFzb25zRm9yTm90TmVlZGluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyaWVmT3V0bGluZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnaW5nR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNraWxscyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3lub255bXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50YXRpb24iIHR5cGU9InVtYTpDb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXBlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibm9kZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmNlcHQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGVja2xpc3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkV4YW1wbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRlbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uTWV0cmljIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2FkbWFwIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXBvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbE1lbnRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaGl0ZXBhcGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb25jZXB0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybURlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWN0aXZpdHlSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlByYWN0aWNlIiB0eXBlPSJ1bWE6UHJhY3RpY2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWluZWRBcnRpZmFjdCIgdHlwZT0idW1hOkFydGlmYWN0Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViRGlzY2lwbGluZSIgdHlwZT0idW1hOkRpc2NpcGxpbmUiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpc2NpcGxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRG9tYWluIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViZG9tYWluIiB0eXBlPSJ1bWE6RG9tYWluIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+T3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZVNldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcml6ZWRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNlZFBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRFbGVtZW50IiB0eXBlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgdHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdGFydERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImZpbmlzaERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyYW5rIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEFmdGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEJlZm9yZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQbGFubmluZ0RhdGEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJBY3Rpdml0eSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICJTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyIgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgIlNvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyIgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgIkN1c3RvbWVyLkFyY2hpdGVjdCIgd291bGQgZGVmaW5lIGEgIkN1c3RvbWVyIiBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgIkFyY2hpdGVjdCIgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1BsYW5uZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZ2xvYmFsIHVuaXF1ZSBpZCBmb3IgYSB3b3JrIG9yZGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImxpbmtUeXBlIiB0eXBlPSJ1bWE6V29ya09yZGVyVHlwZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ1bWE6V29ya09yZGVyIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUmVwZWF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPbmdvaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0V2ZW50RHJpdmVuIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNaWxlc3RvbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiB0eXBlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9hZG1hcCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNFbmFjdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGhhc2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLik8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3dUb1N0YWZmIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmluZWREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjb3BlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVzYWdlTm90ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZGVsaXZlcnkgcGF0dGVybnMgYW5kIG1vZGVscy4gSXQgaXMgdXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFByb2Nlc3MgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdENoYXJhY3RlcmlzdGljcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmlza0xldmVsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGluZ1RlY2huaXF1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHlwZU9mQ29udHJhY3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZVJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXRGcm9tIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmFibGVQYXJ0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkUHJpbWFyaWx5QnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lzdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0ZXAiIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlJvbGVEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFnZ3JlZ2F0ZWRSb2xlIiB0eXBlPSJ1bWE6Um9sZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW5jbHVkZXNQYXR0ZXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0Q29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJWYWxpZENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaWFncmFtVVJJIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBVUkkgb2YgdGhlIGRpYWdyYW0gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVkdWNhdGlvbk1hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlUHJvY2VzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIHR5cGU9InVtYTpQcm9jZXNzRWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iIHR5cGU9InVtYTpUYXNrRGVzY3JpcHRvciIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlSU8iIHR5cGU9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc1BhY2thZ2UiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlIiB0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzIiB0eXBlPSJ1bWE6UHJvY2VzcyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlckNoYW5nZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VDb25maWd1cmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW5TZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0b29sIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDcwNDAzMTQyNS54c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA3MDQwMzE0MjUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTdiMTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDcwNDAzMTQyNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIj4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzUmVwbGFjZXMiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPd25lZFJ1bGUiIHR5cGU9InVtYTpDb25zdHJhaW50Ij4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5IiB0eXBlPSJ1bWE6TWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLQkgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLQkgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotCSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VjdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY3Rpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kVW5pdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iS2V5Q29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4JCQkJCi0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbEluZm8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXBwbGljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFja2dyb3VuZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR29hbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGV2ZWxzT2ZBZG9wdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2JsZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0T2ZOb3RIYXZpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTm90YXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+CQkJCQkKLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGF0aW9uIiB0eXBlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFwZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5vZGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25jZXB0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2hlY2tsaXN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeGFtcGxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkZWxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbk1ldHJpYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9hZG1hcCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2xNZW50b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2hpdGVwYXBlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29uY2VwdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjdGl2aXR5UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJQcmFjdGljZSIgdHlwZT0idW1hOlByYWN0aWNlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcG9ydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFpbmVkQXJ0aWZhY3QiIHR5cGU9InVtYTpBcnRpZmFjdCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPdXRjb21lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNQbGFubmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtPcmRlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsaW5rVHlwZSIgdHlwZT0idW1hOldvcmtPcmRlclR5cGUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0idW1hOldvcmtPcmRlciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1JlcGVhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT25nb2luZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNFdmVudERyaXZlbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzRW5hY3RhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBoYXNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG93VG9TdGFmZiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZpbmVkRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY29wZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVc2FnZU5vdGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSaXNrTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW5nVGVjaG5pcXVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZDb250cmFjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dEZyb20iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyYWJsZVBhcnRzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaXN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RlcCIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Um9sZURlc2NyaXB0b3IiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlZFJvbGUiIHR5cGU9InVtYTpSb2xlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlYW1Qcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbmNsdWRlc1BhdHRlcm4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlZhbGlkQ29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpYWdyYW1VUkkiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIFVSSSBvZiB0aGUgZGlhZ3JhbSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRWR1Y2F0aW9uTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0tIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VQcm9jZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzRWxlbWVudCIgdHlwZT0idW1hOlByb2Nlc3NFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIgdHlwZT0idW1hOlRhc2tEZXNjcmlwdG9yIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VJTyIgdHlwZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzUGFja2FnZSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2UiIHR5cGU9InVtYTpQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3MiIHR5cGU9InVtYTpQcm9jZXNzIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUNvbmZpZ3VyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdFZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc1ZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YnRyYWN0ZWRDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkZWRDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idG9vbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdG9vbCB0aGF0IGdlbmVyYXRlZCB0aGUgWE1MIGZpbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RMaWJyYXJ5IiB0eXBlPSJ1bWE6TWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA4MDEyNzA5NDIueHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwODAxMjcwOTQyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllNjQwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA4MDEyNzA5NDIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNSI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kc1JlcGxhY2VzIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVkRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpOYW1lZEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyI+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1ByaW1hcnlFeHRlbnNpb24iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIHR5cGU9InVtYTpNZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0cmFpbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFwcGxpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhY2tncm91bmQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkdvYWxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkxldmVsc09mQWRvcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9ibGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdE9mTm90SGF2aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJpZWZPdXRsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOb3RhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdpbmdHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2tpbGxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTeW5vbnltcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50YXRpb24iIHR5cGU9InVtYTpDb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRnVsZmlsbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXBlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibm9kZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0Fic3RyYWN0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJLaW5kIj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmNlcHQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGVja2xpc3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkV4YW1wbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRlbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uTWV0cmljIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2FkbWFwIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXBvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbE1lbnRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaGl0ZXBhcGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb25jZXB0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybURlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWN0aXZpdHlSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlByYWN0aWNlIiB0eXBlPSJ1bWE6UHJhY3RpY2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWluZWRBcnRpZmFjdCIgdHlwZT0idW1hOkFydGlmYWN0Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUGxhbm5lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrT3JkZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnbG9iYWwgdW5pcXVlIGlkIGZvciBhIHdvcmsgb3JkZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGlua1R5cGUiIHR5cGU9InVtYTpXb3JrT3JkZXJUeXBlIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InVtYTpXb3JrT3JkZXIiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNSZXBlYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09uZ29pbmciIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzRXZlbnREcml2ZW4iIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbGVzdG9uZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVpcmVkUmVzdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2FkbWFwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNFbmFjdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGhhc2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLik8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3dUb1N0YWZmIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmluZWREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjb3BlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVzYWdlTm90ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJpc2tMZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpbmdUZWNobmlxdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkNvbnRyYWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0RnJvbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJhYmxlUGFydHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZFByaW1hcmlseUJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3Npc3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGVwIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpSb2xlRGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVkUm9sZSIgdHlwZT0idW1hOlJvbGUiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVhbVByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlclRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkluY2x1ZGVzUGF0dGVybiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlhZ3JhbVVSSSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgVVJJIG9mIHRoZSBkaWFncmFtIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFZHVjYXRpb25NYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZVByb2Nlc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NFbGVtZW50IiB0eXBlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJ1bWE6VGFza0Rlc2NyaXB0b3IiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZUlPIiB0eXBlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NQYWNrYWdlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZSIgdHlwZT0idW1hOlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2VzcyIgdHlwZT0idW1hOlByb2Nlc3MiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlQ29uZmlndXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0VmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzVmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VidHJhY3RlZENhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRlZENhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0b29sIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMzNTk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyODM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41IiBuc1ByZWZpeD0idW1hIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZpdHkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlY29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvc3Rjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2FkbWFwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9hZG1hcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW5hY3RhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0VuYWN0YWJsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3Rpdml0eURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd1RvU3RhZmYiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSG93VG9TdGFmZiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlB1cnBvc2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUHJpbWFyeUV4dGVuc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNQcmltYXJ5RXh0ZW5zaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4RDsmI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFydGlmYWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9BcnRpZmFjdCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWluZWRBcnRpZmFjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyaWVmT3V0bGluZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVzZW50ZWRBZnRlciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwbGFubmluZ0RhdGEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBsYW5uaW5nRGF0YSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBlckFjdGl2aXR5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdXBlckFjdGl2aXR5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoZWNrbGlzdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNoZWNrbGlzdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmNlcHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25jZXB0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4YW1wbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkZWxpbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXVzYWJsZUFzc2V0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2FibGVBc3NldCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndoaXRlcGFwZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXaGl0ZXBhcGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc09wdGlvbmFsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1BsYW5uZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idXNhZ2VHdWlkYW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNoZWNrbGlzdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hEOyYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wb3NpdGVSb2xlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFnZ3JlZ2F0ZWRSb2xlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25jZXB0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJtYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudENhdGVnb3J5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50Q2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudERlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iS2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlY3Rpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZXh0ZXJuYWxJZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuJiN4RDsmI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudEVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoZWNrbGlzdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNoZWNrbGlzdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmNlcHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25jZXB0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4YW1wbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkZWxpbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXVzYWJsZUFzc2V0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2FibGVBc3NldCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndoaXRlcGFwZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXaGl0ZXBhcGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50UGFja2FnZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudEVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1c3RvbUNhdGVnb3J5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yaXplZEVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJDYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YkNhdGVnb3J5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcmFibGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBhY2thZ2luZ0d1aWRhbmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLiYjeEQ7JiN4QTtBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJ5UHJvY2VzcyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXA0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6NDciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo0NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVkdWNhdGlvbk1hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6NDciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2FsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjYWxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJpc2tMZXZlbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSaXNrTGV2ZWwiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vQ29udGVudERlc2NyaXB0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZXNlbnRhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmdWxmaWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnVsZmlsbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0Fic3RyYWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc0Fic3RyYWN0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibm9kZWljb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzaGFwZWljb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4mI3hEOyYjeEE7RGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiYjeEQ7JiN4QTtBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEaXNjaXBsaW5lIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkRpc2NpcGxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlzY2lwbGluZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJEaXNjaXBsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3ciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWZlcmVuY2VXb3JrZmxvdyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEaXNjaXBsaW5lR3JvdXBpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NpcGxpbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEaXNjaXBsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9jdW1lbnRSb290Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0ibWl4ZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWl4ZWQiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50V2lsZGNhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iOm1peGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhNTE5TUHJlZml4TWFwIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhtbG5zOnByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4U0lTY2hlbWFMb2NhdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4c2k6c2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kQ29uZmlndXJhdGlvbiIgdXBwZXJCb3VuZD0iLTIiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RMaWJyYXJ5IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZExpYnJhcnkiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kTGlicmFyeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbiIgdXBwZXJCb3VuZD0iLTIiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4mI3hEOyYjeEE7RG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRvbWFpbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1Byb2R1Y3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Eb21haW4iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViZG9tYWluIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW9uTWV0cmljIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbk1ldHJpYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW5nTWV0cmljIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeGFtcGxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRhbmNlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF0dGFjaG1lbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkZWxpbmUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikl0ZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXRlcmF0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJLaW5kIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iS2luZCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VmlldyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFZpZXciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvY2Vzc1ZpZXciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzVmlldyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJ0cmFjdGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZEVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29uc3RyYWludCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3duZWRSdWxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImJyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ib3JkZXJpbmdHdWlkZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgJnF1b3Q7ZXh0ZW5kcyZxdW90OyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzdXBwcmVzc2VkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhbHVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZExpYnJhcnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZENvbmZpZ3VyYXRpb24iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2wiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvb2wgdGhhdCBnZW5lcmF0ZWQgdGhlIFhNTCBmaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InRvb2wiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldXNlZFBhY2thZ2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXVzZWRQYWNrYWdlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6OSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGFja2FnZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdsb2JhbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBsdWdpbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBhY2thZ2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InVzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RVbml0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3B5cmlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvcHlyaWdodCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJhdXRob3JzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNoYW5nZURhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmVyc2lvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXF1aXJlZFJlc3VsdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlcXVpcmVkUmVzdWx0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGNvbWUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbXB0eSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO1BoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhhc2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZmluaXNoRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icmFuayIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InN0YXJ0RGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByYWN0aWNlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2aXR5UmVmZXJlbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QcmFjdGljZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJQcmFjdGljZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmFjdGljZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhY2tncm91bmQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYWNrZ3JvdW5kIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHb2FscyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsc09mQWRvcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2JsZW0iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3MiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluY2x1ZGVzUGF0dGVybiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluY2x1ZGVzUGF0dGVybiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdENvbnRleHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsaWRDb250ZXh0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsaWRDb250ZXh0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpYWdyYW1VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFVSSSBvZiB0aGUgZGlhZ3JhbSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkaWFncmFtVVJJIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLiYjeEQ7JiN4QTtVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3B5cmlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvcHlyaWdodCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2UiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyZmFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImF1dGhvcnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2hhbmdlRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2ZXJzaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyZmFjZUlPIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NvcGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjb3BlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVXNhZ2VOb3RlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4mI3hEOyYjeEE7UHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzRWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4RDsmI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwNCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjQ3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VQcm9jZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZVByb2Nlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo0NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXBvcnQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwb3J0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hEOyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldXNhYmxlQXNzZXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4RDsmI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvYWRtYXAiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNpYmxlRm9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2tpbGxzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTeW5vbnltcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNwb25zaWJsZUZvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVTZXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGUiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlU2V0R3JvdXBpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVTZXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlU2V0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbiIgZVR5cGU9IiMvL1NlY3Rpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViU2VjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic2VjdGlvbk5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlY29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvc3Rjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyZm9ybWVkQnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJmb3JtZWRCeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0cHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0cHV0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPcHRpb25hbElucHV0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2xNZW50b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sTWVudG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsdGVybmF0aXZlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVycG9zZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiYjeEQ7JiN4QTtBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrRGVzY3JpcHRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFzayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lzdGVkQnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3Npc3RlZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsSW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9wdGlvbmFsSW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRwdXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRwdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RlcCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZWFtUHJvZmlsZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4mI3hEOyYjeEE7V29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLiYjeEQ7JiN4QTtIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZWFtUHJvZmlsZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZSIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBlclRlYW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdXBlclRlYW0iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJUZWFtIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViVGVhbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGVtcGxhdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGVybURlZmluaXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b29sTWVudG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9vbE1lbnRvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2xNZW50b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIgdmFsdWU9IjYiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlT2JqZWN0IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFyaWFiaWxpdHlUeXBlOk9iamVjdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9IlZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldoaXRlcGFwZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrT3JkZXIiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzRXZlbnREcml2ZW4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc09uZ29pbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1JlcGVhdGFibGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEQ7JiN4QTtXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRGVmaW5pdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUG9zdGNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya09yZGVyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6MCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJsaW5rVHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrT3JkZXJUeXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9TdGFydCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9GaW5pc2giIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtPcmRlclR5cGVPYmplY3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrT3JkZXJUeXBlOk9iamVjdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9IldvcmtPcmRlclR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3QiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4RDsmI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXBvcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXBvcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZW1wbGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRlbXBsYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9vbE1lbnRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2xNZW50b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVycG9zZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtQcm9kdWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNpYmxlUm9sZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElucHV0VG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbElucHV0VG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RlZEJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW1wYWN0ZWRCeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbXBhY3RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmRhdG9yeUlucHV0VG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbElucHV0VG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPcHRpb25hbElucHV0VG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRwdXRGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0cHV0RnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAmI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4mI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImFjdGl2aXR5RXhpdFN0YXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3RUeXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWZlMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iIiBtb2RlbE5hbWU9IlVNQSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5lZGl0LlVNQUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXRvci5VTUFFZGl0b3JQbHVnaW4iIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0IgotICAgIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGwiIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSIiCi0gICAgdGVzdFN1aXRlQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnRlc3RzLlVNQUFsbFRlc3RzIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS54c2QuZWNvcmUuaW1wb3J0ZXIiCi0gICAgY29tcGxpYW5jZUxldmVsPSI1LjAiPgotICA8Zm9yZWlnbk1vZGVsPkVQRl9TY2hlbWFfMjAwODAxMjcwOTQyLnhzZDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYueG1sIiByZXNvdXJjZT0iWE1MIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJVTUEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9uYSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvY29udHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL3JlcGxhY2VzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbENvbnRyaWJ1dGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxSZXBsYWNlbWVudCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kc1JlcGxhY2VzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGVPYmplY3QiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGVPYmplY3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BY3Rpdml0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvcG9zdGNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3JvYWRtYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd1RvU3RhZmYiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvL2lzUHJpbWFyeUV4dGVuc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BcnRpZmFjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FydGlmYWN0L2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL2JyaWVmT3V0bGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vbm90YXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRBZnRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9ncm91cDEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2NoZWNrbGlzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvY29uY2VwdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvZXhhbXBsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvZ3VpZGVsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9yZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3doaXRlcGFwZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29uc3RyYWludC9tYWluRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UvY29udGVudENhdGVnb3J5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9rZXlDb25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9yZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvd2hpdGVwYXBlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2dyb3VwNCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvZnVsZmlsbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9pc0Fic3RyYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3NoYXBlaWNvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi9yZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGlzY2lwbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmUvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZS90YXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViRGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3ciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RvY3VtZW50Um9vdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC9taXhlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QveE1MTlNQcmVmaXhNYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L3hTSVNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC9tZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC9tZXRob2RMaWJyYXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC9tZXRob2RQbHVnaW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRG9tYWluL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb21haW4vc3ViZG9tYWluIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Fc3RpbWF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0VzdGltYXRlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0VzdGltYXRlL2VzdGltYXRpb25NZXRyaWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Fc3RpbWF0ZS9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRXN0aW1hdGluZ01ldHJpYyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0V4YW1wbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9HdWlkZWxpbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9LaW5kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9LaW5kL2FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vZGVmYXVsdFZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3Byb2Nlc3NWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9zdWJ0cmFjdGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2FkZGVkQ2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9tZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3Rvb2wiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvbWV0aG9kUGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3JlZmVyZW5jZWRNZXRob2RQbHVnaW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01pbGVzdG9uZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWlsZXN0b25lL3JlcXVpcmVkUmVzdWx0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL2RpYWdyYW1VUkkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jb3B5cmlnaHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9wcm9jZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvdmVyc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvZ3JvdXA0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZVByb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Sb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3NraWxscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9zeW5vbnltcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0b3Ivcm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlU2V0L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXQvcm9sZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL2VzdGltYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3N0ZXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZS9yb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVG9vbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rvb2wvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVG9vbC90b29sTWVudG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvcHJlZGVjZXNzb3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc0V2ZW50RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya09yZGVyL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya09yZGVyL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvZXN0aW1hdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L3Rvb2xNZW50b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivd29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvcmVzcG9uc2libGVSb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL29wdGlvbmFsSW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9vdXRwdXRGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RXhpdFN0YXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS54c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZTg3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRVBGIFVNQSBYTUwgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp1bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvRmluaXNoIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9GaW5pc2giLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRyaWJ1dGVzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxDb250cmlidXRpb24iLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPd25lZFJ1bGUiIHR5cGU9InVtYTpDb25zdHJhaW50Ij4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25zdHJhaW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VjdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY3Rpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kVW5pdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFkZGl0aW9uYWxJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFwcGxpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhY2tncm91bmQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkdvYWxzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxldmVsc09mQWRvcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9ibGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkltcGFjdE9mTm90SGF2aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnJpZWZPdXRsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdpbmdHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2tpbGxzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTeW5vbnltcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50YXRpb24iIHR5cGU9InVtYTpDb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXBlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibm9kZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmNlcHQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGVja2xpc3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkV4YW1wbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRlbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uTWV0cmljIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2FkbWFwIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXBvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbE1lbnRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaGl0ZXBhcGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb25jZXB0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybURlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWN0aXZpdHlSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlByYWN0aWNlIiB0eXBlPSJ1bWE6UHJhY3RpY2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWluZWRBcnRpZmFjdCIgdHlwZT0idW1hOkFydGlmYWN0Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViRGlzY2lwbGluZSIgdHlwZT0idW1hOkRpc2NpcGxpbmUiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpc2NpcGxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRG9tYWluIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViZG9tYWluIiB0eXBlPSJ1bWE6RG9tYWluIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+T3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZVNldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcml6ZWRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNlZFBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRFbGVtZW50IiB0eXBlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgdHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdGFydERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImZpbmlzaERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyYW5rIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlc2VudGVkQWZ0ZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlc2VudGVkQmVmb3JlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBsYW5uaW5nRGF0YSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJBY3Rpdml0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNQbGFubmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtPcmRlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGlua1R5cGUiIHR5cGU9InVtYTpXb3JrT3JkZXJUeXBlIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InVtYTpXb3JrT3JkZXIiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNSZXBlYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09uZ29pbmciIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzRXZlbnREcml2ZW4iIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbGVzdG9uZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIHR5cGU9InVtYTpCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2FkbWFwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJc0VuYWN0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQaGFzZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlcmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSG93VG9TdGFmZiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmaW5lZERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTY29wZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJVc2FnZU5vdGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2NhbGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tMZXZlbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVzdGltYXRpbmdUZWNobmlxdWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlR5cGVPZkNvbnRyYWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyYWJsZVBhcnRzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmZvcm1lZFByaW1hcmlseUJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaXN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RlcCIgdHlwZT0idW1hOlNlY3Rpb24iLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Um9sZURlc2NyaXB0b3IiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlZFJvbGUiIHR5cGU9InVtYTpSb2xlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlYW1Qcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJJbmNsdWRlc1BhdHRlcm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVmYXVsdENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlZhbGlkQ29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFZHVjYXRpb25NYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZVByb2Nlc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NFbGVtZW50IiB0eXBlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJ1bWE6VGFza0Rlc2NyaXB0b3IiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZUlPIiB0eXBlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NQYWNrYWdlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW50ZXJmYWNlIiB0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2VzcyIgdHlwZT0idW1hOlByb2Nlc3MiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJCYXNlQ29uZmlndXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlZmF1bHRWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9jZXNzVmlldyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RMaWJyYXJ5IiB0eXBlPSJ1bWE6TWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBhNWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQWN0aXZpdHkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLSAqIEFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBY3Rpdml0eScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5IGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bvc3Rjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JyZWFrZG93bkVsZW1lbnQnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxCcmVha2Rvd25FbGVtZW50PiBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2FkbWFwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9hZG1hcDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUm9hZG1hcCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSb2FkbWFwJyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNFbmFjdGFibGUoKQotCSAqIEBzZWUgI3Vuc2V0SXNFbmFjdGFibGUoKQotCSAqIEBzZWUgI3NldElzRW5hY3RhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J0lzRW5hY3RhYmxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNpc0lzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFbmFjdGFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Im5hIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLX0gLy8gQWN0aXZpdHkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljMzkxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93VG9TdGFmZiA8ZW0+SG93IFRvIFN0YWZmPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQWN0aXZpdHlEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5RGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbHRlcm5hdGl2ZXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvdyBUbyBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SG93VG9TdGFmZihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIb3dUb1N0YWZmJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhvd1RvU3RhZmYoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93VG9TdGFmZiA8ZW0+SG93IFRvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3cgVG8gU3RhZmY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhvd1RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhvd1RvU3RhZmYoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBY3Rpdml0eURlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyYjU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YSx2IDEuMSAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNpc0lzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvJyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNzZXRJc1ByaW1hcnlFeHRlbnNpb24oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUHJpbWFyeUV4dGVuc2lvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2lzSXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICN1bnNldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUHJpbWFyeUV4dGVuc2lvbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3NldElzUHJpbWFyeUV4dGVuc2lvbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2lzSXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3NldElzUHJpbWFyeUV4dGVuc2lvbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0KLX0gLy8gQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDNhZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotICogQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FydGlmYWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJ0aWZhY3QgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGFpbmVkQXJ0aWZhY3QnIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxBcnRpZmFjdD4gZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKTsKLQotfSAvLyBBcnRpZmFjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXJ0aWZhY3REZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODk3MzVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcnRpZmFjdERlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FydGlmYWN0RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdERlc2NyaXB0aW9uIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QnJpZWZPdXRsaW5lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQnJpZWZPdXRsaW5lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJyaWVmT3V0bGluZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlcHJlc2VudGF0aW9uT3B0aW9ucyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXByZXNlbnRhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVwcmVzZW50YXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcHJlc2VudGF0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90YXRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcnRpZmFjdERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmU2ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0JyZWFrZG93bkVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGVkQWZ0ZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRlZEFmdGVyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEFmdGVyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEJlZm9yZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRlZEJlZm9yZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEJlZm9yZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQbGFubmluZ0RhdGEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQbGFubmluZ0RhdGEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQbGFubmluZ0RhdGEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwZXJBY3Rpdml0eShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdXBlckFjdGl2aXR5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN1cGVyQWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBlckFjdGl2aXR5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2hlY2tsaXN0JyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uY2VwdCcgZ3JvdXA9JyNncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeGFtcGxlJyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR3VpZGVsaW5lJyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmV1c2FibGVBc3NldCcgZ3JvdXA9JyNncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1cHBvcnRpbmdNYXRlcmlhbCcgZ3JvdXA9JyNncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9XaGl0ZXBhcGVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1doaXRlcGFwZXInIGdyb3VwPScjZ3JvdXA6MTgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3Vuc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzT3B0aW9uYWwoKQotCSAqIEBzZWUgI3Vuc2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjc2V0SXNPcHRpb25hbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNPcHRpb25hbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzT3B0aW9uYWwoKQotCSAqIEBzZWUgI3Vuc2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc09wdGlvbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzT3B0aW9uYWwoKQotCSAqIEBzZWUgI2lzSXNPcHRpb25hbCgpCi0JICogQHNlZSAjc2V0SXNPcHRpb25hbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNPcHRpb25hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUGxhbm5lZCgpCi0JICogQHNlZSAjdW5zZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI3NldElzUGxhbm5lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc1BsYW5uZWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNQbGFubmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUGxhbm5lZCgpCi0JICogQHNlZSAjdW5zZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1BsYW5uZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICNpc0lzUGxhbm5lZCgpCi0JICogQHNlZSAjc2V0SXNQbGFubmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUGxhbm5lZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICNpc0lzUGxhbm5lZCgpCi0JICogQHNlZSAjc2V0SXNQbGFubmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncHJlZml4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWZpeCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEJyZWFrZG93bkVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGM0OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVc2FnZUd1aWRhbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd1c2FnZUd1aWRhbmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVzYWdlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU3MWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYXBhYmlsaXR5UGF0dGVybi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi0gKiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLSAqIC0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0gKiAtIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotICogLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2FwYWJpbGl0eVBhdHRlcm4nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDYXBhYmlsaXR5UGF0dGVybiBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotfSAvLyBDYXBhYmlsaXR5UGF0dGVybgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlZDdkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2hlY2tsaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENoZWNrbGlzdC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENoZWNrbGlzdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2hlY2tsaXN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tsaXN0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDaGVja2xpc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29tcG9zaXRlUm9sZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzMDc0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb3NpdGVSb2xlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9zaXRlIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLSAqIEEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGUgPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb21wb3NpdGVSb2xlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9zaXRlUm9sZSBleHRlbmRzIFJvbGVEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZ2dyZWdhdGVkUm9sZScgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlKCk7Ci0KLX0gLy8gQ29tcG9zaXRlUm9sZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25jZXB0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29uY2VwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmEzMjJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25jZXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbmNlcHQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbmNlcHQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbmNlcHQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25jZXB0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDb25jZXB0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTRlZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29uc3RyYWludC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnN0cmFpbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbWFpbkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29uc3RyYWludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNzgxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRDYXRlZ29yeScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRDYXRlZ29yeSBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLX0gLy8gQ29udGVudENhdGVnb3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZDQ0NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5UGFja2FnZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IG9ubHkgY29udGFpbnMgQ29udGVudCBDYXRlZ29yeSBFbGVtZW50cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50Q2F0ZWdvcnlQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudENhdGVnb3J5UGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRlbnRDYXRlZ29yeScgZ3JvdXA9JyNncm91cDoxMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLX0gLy8gQ29udGVudENhdGVnb3J5UGFja2FnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmNzQ0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50RGVzY3JpcHRpb24gZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYWluRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdLZXlDb25zaWRlcmF0aW9ucyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2VjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdleHRlcm5hbElkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb250ZW50RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA2MjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudEVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLSAqIENvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFdoaXRlcGFwZXIgPGVtPldoaXRlcGFwZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGVudEVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50RWxlbWVudCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjE0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2hlY2tsaXN0JyBncm91cD0nI2dyb3VwOjE0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbmNlcHQnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4YW1wbGUnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR3VpZGVsaW5lJyBncm91cD0nI2dyb3VwOjE0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldXNhYmxlQXNzZXQnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwcG9ydGluZ01hdGVyaWFsJyBncm91cD0nI2dyb3VwOjE0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1doaXRlcGFwZXInIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotfSAvLyBDb250ZW50RWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50UGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZWZhYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRQYWNrYWdlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRQYWNrYWdlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50UGFja2FnZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRQYWNrYWdlIGV4dGVuZHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGVudEVsZW1lbnQnIGdyb3VwPScjZ3JvdXA6MTMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotfSAvLyBDb250ZW50UGFja2FnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DdXN0b21DYXRlZ29yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzk4ODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEN1c3RvbUNhdGVnb3J5LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q3VzdG9tIENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldFN1YkNhdGVnb3J5IDxlbT5TdWIgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0N1c3RvbUNhdGVnb3J5JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tQ2F0ZWdvcnkgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhdGVnb3JpemVkRWxlbWVudCcgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViQ2F0ZWdvcnknIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFN1YkNhdGVnb3J5KCk7Ci0KLX0gLy8gQ3VzdG9tQ2F0ZWdvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGY3NzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVsaXZlcmFibGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyYWJsZSBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGl2ZXJlZFdvcmtQcm9kdWN0JyBncm91cD0nI2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpOwotCi19IC8vIERlbGl2ZXJhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTZjOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWxpdmVyYWJsZURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BhY2thZ2luZ0d1aWRhbmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVsaXZlcmFibGVEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0NGM5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJ5UHJvY2Vzcy5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLSAqIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWwgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJ5UHJvY2Vzcycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJ5UHJvY2VzcyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NfR3JvdXA0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6NDcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbW11bmljYXRpb25zTWF0ZXJpYWwnIGdyb3VwPScjZ3JvdXA6NDcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWR1Y2F0aW9uTWF0ZXJpYWwnIGdyb3VwPScjZ3JvdXA6NDcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVkdWNhdGlvbk1hdGVyaWFsKCk7Ci0KLX0gLy8gRGVsaXZlcnlQcm9jZXNzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwNmM2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NhbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTY2FsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTY2FsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjYWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdENoYXJhY3RlcmlzdGljcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJpc2sgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJpc2sgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJpc2tMZXZlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSaXNrTGV2ZWwnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Umlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJpc2sgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJpc2tMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Umlza0xldmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpbmdUZWNobmlxdWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2plY3RNZW1iZXJFeHBlcnRpc2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGVPZkNvbnRyYWN0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGVPZkNvbnRyYWN0KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzg5YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpYmFibGVFbGVtZW50LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpYmFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLSAqIFRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0RnVsZmlsbCA8ZW0+RnVsZmlsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2lzSXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Rlc2NyaWJhYmxlRWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaWJhYmxlRWxlbWVudCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVzZW50YXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZ1bGZpbGw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GdWxmaWxsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfRnVsZmlsbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGdWxmaWxsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRGdWxmaWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNBYnN0cmFjdCgpCi0JICogQHNlZSAjdW5zZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNzZXRJc0Fic3RyYWN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9Jc0Fic3RyYWN0KCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzQWJzdHJhY3QnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2lzSXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI3Vuc2V0SXNBYnN0cmFjdCgpCi0JICogQHNlZSAjaXNJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Fic3RyYWN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBzZWUgI3NldElzQWJzdHJhY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2lzSXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBzZWUgI3NldElzQWJzdHJhY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9kZWljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdub2RlaWNvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb2RlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9kZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb2RlaWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2hhcGVpY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3NoYXBlaWNvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTaGFwZWljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNoYXBlaWNvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlc2NyaWJhYmxlRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFmY2I0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0b3IuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotICogRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNTeW5jaHJvbml6ZWRXaXRoU291cmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi19IC8vIERlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGZhNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZmluZWREZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVmaW5lZERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpcHRvckRlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNjhhOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi0gKiBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93IDxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGlzY2lwbGluZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmUgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1Rhc2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzaycgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIERpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfU3ViRGlzY2lwbGluZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJEaXNjaXBsaW5lJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8RGlzY2lwbGluZT4gZ2V0U3ViRGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVmZXJlbmNlV29ya2Zsb3cnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJlZmVyZW5jZVdvcmtmbG93KCk7Ci0KLX0gLy8gRGlzY2lwbGluZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhZWJjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmVHcm91cGluZy5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEaXNjaXBsaW5lR3JvdXBpbmcnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lR3JvdXBpbmcgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Rpc2NpcGxpbmUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldERpc2NpcGxpbmUoKTsKLQotfSAvLyBEaXNjaXBsaW5lR3JvdXBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9jdW1lbnRSb290LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9jdW1lbnRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTVjM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvY3VtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nJyBraW5kPSdtaXhlZCciCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50Um9vdCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01peGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50V2lsZGNhcmQnIG5hbWU9JzptaXhlZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnk8b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nPiIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3htbG5zOnByZWZpeCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5PG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZz4iIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd4c2k6c2NoZW1hTG9jYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB1cHBlcj0iLTIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZENvbmZpZ3VyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kTGlicmFyeScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi0JICogTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi0JICogU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB1cHBlcj0iLTIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBsdWdpbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiB2YWx1ZSk7Ci0KLX0gLy8gRG9jdW1lbnRSb290ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvbWFpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvbWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY1NTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Eb21haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9tYWluLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9tYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi0gKiBEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRTdWJkb21haW4gPGVtPlN1YmRvbWFpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW4oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RvbWFpbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvbWFpbiBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtQcm9kdWN0JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YmRvbWFpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YmRvbWFpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluX1N1YmRvbWFpbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJkb21haW4nIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxEb21haW4+IGdldFN1YmRvbWFpbigpOwotCi19IC8vIERvbWFpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjY5OWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVsZW1lbnQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBleHRlbmRzIEVEYXRhT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLX0gLy8gRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOGYwM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gTWV0cmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25NZXRyaWMnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRpb25NZXRyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotfSAvLyBFc3RpbWF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW5nTWV0cmljLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGluZ01ldHJpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ5YTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW5nTWV0cmljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRpbmdNZXRyaWMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGluZyBNZXRyaWM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRpbmdNZXRyaWMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRpbmdNZXRyaWMnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFc3RpbWF0aW5nTWV0cmljIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW5nTWV0cmljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2JlMmJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0V4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiMjA0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeGFtcGxlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEV4YW1wbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4YW1wbGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGFtcGxlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFeGFtcGxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxZDAxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGFuY2UuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdHdWlkYW5jZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBHdWlkYW5jZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2VEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTA0ZGNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50IDxlbT5BdHRhY2htZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0d1aWRhbmNlRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHdWlkYW5jZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRhY2htZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dGFjaG1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dGFjaG1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXR0YWNobWVudCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRhY2htZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dGFjaG1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dGFjaG1lbnQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBHdWlkYW5jZURlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmI5MDY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkZWxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGVsaW5lLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRHdWlkZWxpbmUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0d1aWRlbGluZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRlbGluZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gR3VpZGVsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0l0ZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0l0ZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ4NWI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9JdGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSXRlcmF0aW9uLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkl0ZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLSAqIEl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0SXRlcmF0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdJdGVyYXRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVyYXRpb24gZXh0ZW5kcyBBY3Rpdml0eSB7Ci19IC8vIEl0ZXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9LaW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjY5NzU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9LaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEtpbmQuamF2YSx2IDEuMSAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+S2luZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRLaW5kKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdLaW5kJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgS2luZCBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotfSAvLyBLaW5kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiOTczOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb24gPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3IDxlbT5Qcm9jZXNzIFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZENvbmZpZ3VyYXRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZUNvbmZpZ3VyYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEJhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGx1Z2luU2VsZWN0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZVNlbGVjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VmlldyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFZpZXcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFZpZXcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZpZXcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzcyBWaWV3PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBWaWV3PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2Nlc3NWaWV3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRQcm9jZXNzVmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YnRyYWN0ZWRDYXRlZ29yeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FkZGVkQ2F0ZWdvcnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFkZGVkQ2F0ZWdvcnkoKTsKLQotfSAvLyBNZXRob2RDb25maWd1cmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODFhNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZEVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlIDxlbT5Pd25lZCBSdWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RFbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pd25lZCBSdWxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPd25lZFJ1bGUnIGdyb3VwPScjZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kRWxlbWVudFByb3BlcnR5JyBncm91cD0nI2dyb3VwOjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nYnJpZWZEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfSWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBVc2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J29yZGVyaW5nR3VpZGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0T3JkZXJpbmdHdWlkZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9yZGVyaW5nR3VpZGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ByZXNlbnRhdGlvbk5hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAiZXh0ZW5kcyIgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24sIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjdW5zZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNzZXRTdXBwcmVzc2VkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdzdXBwcmVzc2VkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI3Vuc2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBwcmVzc2VkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBzZWUgI3NldFN1cHByZXNzZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFN1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U3VwcHJlc3NlZCgpOwotCi19IC8vIE1ldGhvZEVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDMyMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50UHJvcGVydHkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWV0aG9kRWxlbWVudFByb3BlcnR5JyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudFByb3BlcnR5IGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFsdWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RFbGVtZW50UHJvcGVydHkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kTGlicmFyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMGY3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RMaWJyYXJ5LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0VG9vbCA8ZW0+VG9vbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RMaWJyYXJ5JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kTGlicmFyeSBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBsdWdpbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZENvbmZpZ3VyYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG9vbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfVG9vbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3Rvb2wnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VG9vbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRUb29sIDxlbT5Ub29sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb29sKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kTGlicmFyeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjlkZWQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RQYWNrYWdlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UmV1c2VkUGFja2FnZSA8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kUGFja2FnZSBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXVzZWRQYWNrYWdlJyBncm91cD0nI2dyb3VwOjknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJldXNlZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZScgZ3JvdXA9JyNncm91cDo5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2xvYmFsKCkKLQkgKiBAc2VlICN1bnNldEdsb2JhbCgpCi0JICogQHNlZSAjc2V0R2xvYmFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2dsb2JhbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNHbG9iYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEdsb2JhbCgpCi0JICogQHNlZSAjdW5zZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHbG9iYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAc2VlICNzZXRHbG9iYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEdsb2JhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0R2xvYmFsKCkKLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQHNlZSAjc2V0R2xvYmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRHbG9iYWwoKTsKLQotfSAvLyBNZXRob2RQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q0MDZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBsdWdpbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLSAqIE1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotICogU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RQbHVnaW4nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQbHVnaW4gZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBhY2thZ2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd1c2VyQ2hhbmdlYWJsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNVc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICN1bnNldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVc2VyQ2hhbmdlYWJsZSgpOwotCi19IC8vIE1ldGhvZFBsdWdpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RVbml0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjEwNTY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RVbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RVbml0LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFVuaXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RVbml0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kVW5pdCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHlyaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29weXJpZ2h0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29weXJpZ2h0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvcHlyaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdXRob3JzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nYXV0aG9ycyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdXRob3JzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhvcnMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2hhbmdlRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0Q2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZURhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nY2hhbmdlRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmVyc2lvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RVbml0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzgwYjg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NaWxlc3RvbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWlsZXN0b25lLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSNnZXRSZXF1aXJlZFJlc3VsdCA8ZW0+UmVxdWlyZWQgUmVzdWx0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWlsZXN0b25lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWlsZXN0b25lIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXF1aXJlZFJlc3VsdCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVxdWlyZWRSZXN1bHQoKTsKLX0gLy8gTWlsZXN0b25lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FkNWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9OYW1lZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZWRFbGVtZW50LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TmFtZWRFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lZEVsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZEVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXROYW1lZEVsZW1lbnRfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J25hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBOYW1lZEVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL091dGNvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOWQxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRjb21lLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGNvbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRPdXRjb21lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRjb21lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0Y29tZSBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLX0gLy8gT3V0Y29tZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4NTdhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBhY2thZ2VhYmxlRWxlbWVudC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDgganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQYWNrYWdlYWJsZUVsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlYWJsZUVsZW1lbnQgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgewotfSAvLyBQYWNrYWdlYWJsZUVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGhhc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDUyMmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQaGFzZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaGFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLSAqIFBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGhhc2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1BoYXNlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGhhc2UgZXh0ZW5kcyBBY3Rpdml0eSB7Ci19IC8vIFBoYXNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BsYW5uaW5nRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BsYW5uaW5nRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYxNGMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QbGFubmluZ0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBsYW5uaW5nRGF0YS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLSAqIFBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLSAqIChOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGEoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1BsYW5uaW5nRGF0YScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBsYW5uaW5nRGF0YSBleHRlbmRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZmluaXNoRGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldEZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFuayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9SYW5rKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncmFuayciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSYW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFuayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnREYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdzdGFydERhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYTUxHcmVnb3JpYW5DYWxlbmRhciBnZXRTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnREYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKTsKLQotfSAvLyBQbGFubmluZ0RhdGEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDQ2OWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlIDxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2UgPGVtPlN1YiBQcmFjdGljZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJhY3RpY2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmFjdGljZSBleHRlbmRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdGl2aXR5UmVmZXJlbmNlJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRBY3Rpdml0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGVudFJlZmVyZW5jZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29udGVudFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9TdWJQcmFjdGljZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJQcmFjdGljZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFByYWN0aWNlPiBnZXRTdWJQcmFjdGljZSgpOwotCi19IC8vIFByYWN0aWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOGI4ZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByYWN0aWNlRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcmFjdGljZURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJhY3RpY2VEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkaXRpb25hbEluZm8nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFwcGxpY2F0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBcHBsaWNhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QmFja2dyb3VuZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYWNrZ3JvdW5kJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmFja2dyb3VuZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R29hbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R29hbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0dvYWxzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEdvYWxzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R29hbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHb2FscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxzIE9mIEFkb3B0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsc09mQWRvcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxzT2ZBZG9wdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2JsZW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2JsZW0oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvYmxlbSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2JsZW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2JsZW0oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcmFjdGljZURlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODZjMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3MuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLSAqIENvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybiA8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREaWFncmFtVVJJIDxlbT5EaWFncmFtIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9jZXNzJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2VzcyBleHRlbmRzIEFjdGl2aXR5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW5jbHVkZXNQYXR0ZXJuJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlc1BhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdENvbnRleHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRDb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRDb250ZXh0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsaWRDb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRWYWxpZENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpYWdyYW0gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgVVJJIG9mIHRoZSBkaWFncmFtIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlhZ3JhbVVSSShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfRGlhZ3JhbVVSSSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2RpYWdyYW1VUkknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGlhZ3JhbVVSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREaWFncmFtVVJJIDxlbT5EaWFncmFtIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbSBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpYWdyYW1VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERpYWdyYW1VUkkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9jZXNzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OGQyMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NDb21wb25lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLSAqIFVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NDb21wb25lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50IGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHlyaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29weXJpZ2h0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29weXJpZ2h0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvcHlyaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW50ZXJmYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBnZXRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhdXRob3JzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2NoYW5nZURhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYTUxHcmVnb3JpYW5DYWxlbmRhciBnZXRDaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhbmdlRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyMjYyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24gPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmZhY2VTcGVjaWZpY2F0aW9uJyBncm91cD0nI2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8VGFza0Rlc2NyaXB0b3I+IGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW50ZXJmYWNlSU8nIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEludGVyZmFjZUlPKCk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxMWZkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjb3BlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Njb3BlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjb3BlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjb3BlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVzYWdlTm90ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVc2FnZU5vdGVzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVzYWdlTm90ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9jZXNzRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDVhMzZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRWxlbWVudC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotICogUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NFbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0VsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotfSAvLyBQcm9jZXNzRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGYzZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NQYWNrYWdlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLSAqIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc1BhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc1BhY2thZ2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzRWxlbWVudCcgZ3JvdXA9JyNncm91cDoxMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFByb2Nlc3NFbGVtZW50PiBnZXRQcm9jZXNzRWxlbWVudCgpOwotCi19IC8vIFByb2Nlc3NQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2OGMxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi0gKiBBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZVByb2Nlc3MgPGVtPkJhc2UgUHJvY2VzczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFByb2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvY2VzczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvY2VzczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZVByb2Nlc3MnIGdyb3VwPScjZ3JvdXA6NDcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEJhc2VQcm9jZXNzKCk7Ci0KLX0gLy8gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmVwb3J0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDg4OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXBvcnQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UmVwb3J0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXBvcnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvcnQgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJlcG9ydApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmV1c2FibGVBc3NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQ5NjFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJldXNhYmxlQXNzZXQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi0gKiBob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UmV1c2FibGVBc3NldCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmV1c2FibGVBc3NldCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJldXNhYmxlQXNzZXQgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJldXNhYmxlQXNzZXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9hZG1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvYWRtYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwNjc4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9hZG1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2FkbWFwLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLSAqIEFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvYWRtYXAoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvYWRtYXAnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2FkbWFwIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSb2FkbWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmJhMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLSAqIEEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNpYmxlRm9yJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXNwb25zaWJsZUZvcigpOwotCi19IC8vIFJvbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OGIyMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50QXBwcm9hY2hlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTa2lsbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NraWxscyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTa2lsbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNraWxscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TeW5vbnltczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3lub255bXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3lub255bXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lub255bXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lub255bXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjBmZTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSb2xlRGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVEZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSb2xlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSb2xlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNwb25zaWJsZUZvciciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ4M2JiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIE9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVTZXQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0IGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldF9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldF9Sb2xlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJvbGUoKTsKLQotfSAvLyBSb2xlU2V0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM0YWMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0R3JvdXBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZVNldEdyb3VwaW5nLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSb2xlU2V0R3JvdXBpbmcnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0R3JvdXBpbmcgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGUgU2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBTZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGVTZXQnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJvbGVTZXQoKTsKLQotfSAvLyBSb2xlU2V0R3JvdXBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwNjc4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb24gPGVtPlN1YiBTZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTZWN0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3ViU2VjdGlvbihTZWN0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1N1YlNlY3Rpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViU2VjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gZ2V0U3ViU2VjdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN1YlNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YlNlY3Rpb24oU2VjdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWRlY2Vzc29yKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVkZWNlc3NvciciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZGVjZXNzb3IoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZWN0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU2VjdGlvbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdzZWN0aW9uTmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZWN0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eVR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCi19IC8vIFNlY3Rpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjk0MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTdXBwb3J0aW5nTWF0ZXJpYWwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3VwcG9ydGluZ01hdGVyaWFsJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3VwcG9ydGluZ01hdGVyaWFsIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBTdXBwb3J0aW5nTWF0ZXJpYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFzay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkZGU1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFzay5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotICogQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi0gKiBBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLSAqIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2soKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rhc2snIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlY29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3N0Y29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bvc3Rjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfUGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyZm9ybWVkQnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYW5kYXRvcnlJbnB1dCcgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX091dHB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRwdXQnIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE91dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkaXRpb25hbGx5UGVyZm9ybWVkQnknIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09wdGlvbmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX0VzdGltYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRlJyBncm91cD0nI2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKTsKLQotfSAvLyBUYXNrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRjMjBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0Rlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza0Rlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FsdGVybmF0aXZlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRhc2tEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2NkZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi0gKiBBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwIDxlbT5TdGVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrRGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFzayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1Rhc2soKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzayciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXNrKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmZvcm1lZFByaW1hcmlseUJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyZm9ybWVkUHJpbWFyaWx5QnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkaXRpb25hbGx5UGVyZm9ybWVkQnknIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3Npc3RlZEJ5JyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRBc3Npc3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbElucHV0JyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuZGF0b3J5SW5wdXQnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPcHRpb25hbElucHV0JyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRPcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dHB1dCcgZ3JvdXA9JyNncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RlcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGVwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U2VjdGlvbj4gZ2V0U3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNTeW5jaHJvbml6ZWRXaXRoU291cmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi19IC8vIFRhc2tEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlYW1Qcm9maWxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRlMjc1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlYW1Qcm9maWxlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotICogV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotICogSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUZWFtUHJvZmlsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlYW1Qcm9maWxlIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9Sb2xlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIFRlYW08L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwZXJUZWFtJyBncm91cD0nI2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRTdXBlclRlYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgVGVhbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YlRlYW0nIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFN1YlRlYW0oKTsKLQotfSAvLyBUZWFtUHJvZmlsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZW1wbGF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjY2RhYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlbXBsYXRlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZW1wbGF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGVtcGxhdGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZW1wbGF0ZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVGVtcGxhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVybURlZmluaXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJlNTZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZXJtRGVmaW5pdGlvbi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZWZpbmVzIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRlcm1EZWZpbml0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlcm1EZWZpbml0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUZXJtRGVmaW5pdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlcm1EZWZpbml0aW9uIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUZXJtRGVmaW5pdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Ub29sLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDg5YTMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRvb2wuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRvb2woKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rvb2wnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUb29sIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbF9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbF9Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKTsKLQotfSAvLyBUb29sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2xNZW50b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Ub29sTWVudG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGY3OTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2xNZW50b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbE1lbnRvci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sTWVudG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUb29sTWVudG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG9vbE1lbnRvciBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVG9vbE1lbnRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzVhZDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFGYWN0b3J5LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnQgY3JlYXRlQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbmNlcHQgY3JlYXRlQ29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGNyZWF0ZUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudENhdGVnb3J5IGNyZWF0ZUNvbnRlbnRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudENhdGVnb3J5UGFja2FnZSBjcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRFbGVtZW50IGNyZWF0ZUNvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJhYmxlRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaWJhYmxlRWxlbWVudCBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRvciBjcmVhdGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG9tYWluIGNyZWF0ZURvbWFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFc3RpbWF0ZSBjcmVhdGVFc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVzdGltYXRpbmdNZXRyaWMgY3JlYXRlRXN0aW1hdGluZ01ldHJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRhbmNlIGNyZWF0ZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGFuY2VEZXNjcmlwdGlvbiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHdWlkZWxpbmUgY3JlYXRlR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUtpbmQgY3JlYXRlS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQYWNrYWdlIGNyZWF0ZU1ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kUGx1Z2luIGNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFVuaXQgY3JlYXRlTWV0aG9kVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlOYW1lZEVsZW1lbnQgY3JlYXRlTmFtZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGNvbWUgY3JlYXRlT3V0Y29tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYWNrYWdlYWJsZUVsZW1lbnQgY3JlYXRlUGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGhhc2UgY3JlYXRlUGhhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByYWN0aWNlIGNyZWF0ZVByYWN0aWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2VEZXNjcmlwdGlvbiBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgY3JlYXRlUHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnQgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NFbGVtZW50IGNyZWF0ZVByb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVwb3J0IGNyZWF0ZVJlcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2FkbWFwIGNyZWF0ZVJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZSBjcmVhdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldCBjcmVhdGVSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrIGNyZWF0ZVRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlYW1Qcm9maWxlIGNyZWF0ZVRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2wgY3JlYXRlVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0JyZWFrZG93bkVsZW1lbnQgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtEZWZpbml0aW9uIGNyZWF0ZVdvcmtEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtPcmRlciBjcmVhdGVXb3JrT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0IGNyZWF0ZVdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGdldFVtYVBhY2thZ2UoKTsKLQotfSAvL1VtYUZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNkZjU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzE4OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVBhY2thZ2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAidW1hIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gInVtYSI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUxFTUVOVCA9IDI5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsIDxlbT5OYW1lZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlRfX05BTUUgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsIDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2VhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlQgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fR1JPVVAgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fSUQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVCA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0dST1VQID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19JRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fRlVMRklMTCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQID0gUFJPQ0VTU19FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRSA9IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTCA9IFBST0NFU1NfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVCA9IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSA4MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0ZVTEZJTEwgPSBCUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORSA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fRlVMRklMTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TSEFQRUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUExBTk5JTkdfREFUQSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HUk9VUDEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQ0hFQ0tMSVNUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19DT05DRVBUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fRVhBTVBMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1VJREVMSU5FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1dISVRFUEFQRVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1JPVVAyID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFREVDRVNTT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19SRVBFQVRBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFQ09ORElUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQMyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JPQURNQVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19FTkFDVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVQgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19BVVRIT1JTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19WRVJTSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwgPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT04gPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVCA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dST1VQID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19JRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fRlVMRklMTCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dST1VQMSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkUgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1QgPSA4MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0dST1VQID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRlVMRklMTCA9IENPTlRFTlRfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAyID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VTVElNQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVQT1JUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQID0gV09SS19QUk9EVUNUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fSUQgPSBXT1JLX1BST0RVQ1RfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRlVMRklMTCA9IFdPUktfUFJPRFVDVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTk9ERUlDT04gPSBXT1JLX1BST0RVQ1RfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HUk9VUDEgPSBXT1JLX1BST0RVQ1RfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DSEVDS0xJU1QgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVhBTVBMRSA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HVUlERUxJTkUgPSBXT1JLX1BST0RVQ1RfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fV0hJVEVQQVBFUiA9IFdPUktfUFJPRFVDVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQMiA9IFdPUktfUFJPRFVDVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1JFUE9SVCA9IFdPUktfUFJPRFVDVF9fUkVQT1JUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVE9PTF9NRU5UT1IgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQMyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXJ0aWZhY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IDg0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19HUk9VUCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIE91dGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1JPVVAgPSBBQ1RJVklUWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fT1dORURfUlVMRSA9IEFDVElWSVRZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSUQgPSBBQ1RJVklUWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19GVUxGSUxMID0gQUNUSVZJVFlfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19BQlNUUkFDVCA9IEFDVElWSVRZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWSA9IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dST1VQMSA9IEFDVElWSVRZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DSEVDS0xJU1QgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0NPTkNFUFQgPSBBQ1RJVklUWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HVUlERUxJTkUgPSBBQ1RJVklUWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVCA9IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fV0hJVEVQQVBFUiA9IEFDVElWSVRZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HUk9VUDIgPSBBQ1RJVklUWV9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FVkVOVF9EUklWRU4gPSBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVDT05ESVRJT04gPSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HUk9VUDMgPSBBQ1RJVklUWV9fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVCA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19ST0FETUFQID0gQUNUSVZJVFlfX1JPQURNQVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfRU5BQ1RBQkxFID0gQUNUSVZJVFlfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTiA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0RJQUdSQU1fVVJJID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTkFNRSA9IFBST0NFU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1JPVVAgPSBQUk9DRVNTX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX09XTkVEX1JVTEUgPSBQUk9DRVNTX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lEID0gUFJPQ0VTU19fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19GVUxGSUxMID0gUFJPQ0VTU19fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1JPVVAxID0gUFJPQ0VTU19fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19DSEVDS0xJU1QgPSBQUk9DRVNTX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0VYQU1QTEUgPSBQUk9DRVNTX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HVUlERUxJTkUgPSBQUk9DRVNTX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fV0hJVEVQQVBFUiA9IFBST0NFU1NfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUExBTk5FRCA9IFBST0NFU1NfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVERUNFU1NPUiA9IFBST0NFU1NfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX1JFUEVBVEFCTEUgPSBQUk9DRVNTX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HUk9VUDMgPSBQUk9DRVNTX19HUk9VUDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1JPQURNQVAgPSBQUk9DRVNTX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfRU5BQ1RBQkxFID0gUFJPQ0VTU19fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSU5DTFVERVNfUEFUVEVSTiA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRElBR1JBTV9VUkkgPSBQUk9DRVNTX19ESUFHUkFNX1VSSTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlEQU5DRSA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dST1VQID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fRlVMRklMTCA9IENPTlRFTlRfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDSEVDS0xJU1QgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsIDxlbT5EZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1IgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0ZVTEZJTEwgPSBCUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0NIRUNLTElTVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQ09OQ0VQVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0VYQU1QTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dVSURFTElORSA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19XSElURVBBUEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fR1JPVVAgPSBERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBERVNDUklQVE9SX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lEID0gREVTQ1JJUFRPUl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19GVUxGSUxMID0gREVTQ1JJUFRPUl9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFkgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fR1JPVVAxID0gREVTQ1JJUFRPUl9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19DSEVDS0xJU1QgPSBERVNDUklQVE9SX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19DT05DRVBUID0gREVTQ1JJUFRPUl9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0VYQU1QTEUgPSBERVNDUklQVE9SX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HVUlERUxJTkUgPSBERVNDUklQVE9SX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQgPSBERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fV0hJVEVQQVBFUiA9IERFU0NSSVBUT1JfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVGSVggPSBERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEUgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0dST1VQID0gUk9MRV9ERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fT1dORURfUlVMRSA9IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUk9MRV9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19CUklFRl9ERVNDUklQVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSUQgPSBST0xFX0RFU0NSSVBUT1JfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09SREVSSU5HX0dVSURFID0gUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5UQVRJT05fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBQUkVTU0VEID0gUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5UQVRJT04gPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fRlVMRklMTCA9IFJPTEVfREVTQ1JJUFRPUl9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19BQlNUUkFDVCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTk9ERUlDT04gPSBST0xFX0RFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TSEFQRUlDT04gPSBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFU0VOVEVEX0FGVEVSID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQkVGT1JFID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUExBTk5JTkdfREFUQSA9IFJPTEVfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBFUl9BQ1RJVklUWSA9IFJPTEVfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1JPVVAxID0gUk9MRV9ERVNDUklQVE9SX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQ0hFQ0tMSVNUID0gUk9MRV9ERVNDUklQVE9SX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0NPTkNFUFQgPSBST0xFX0RFU0NSSVBUT1JfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0VYQU1QTEUgPSBST0xFX0RFU0NSSVBUT1JfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1VJREVMSU5FID0gUk9MRV9ERVNDUklQVE9SX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVVTQUJMRV9BU1NFVCA9IFJPTEVfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1dISVRFUEFQRVIgPSBST0xFX0RFU0NSSVBUT1JfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFJPTEVfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX09QVElPTkFMID0gUk9MRV9ERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX1BMQU5ORUQgPSBST0xFX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRUZJWCA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBST0xFX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JPTEUgPSBST0xFX0RFU0NSSVBUT1JfX1JPTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1JPVVAyID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRSA9IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9GRUFUVVJFX0NPVU5UID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsIDxlbT5Db25jZXB0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25jZXB0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25jZXB0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTkNFUFQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsIDxlbT5Db25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEwgPSBDT05URU5UX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRSA9IDQzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDEgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0UgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR1JPVVAgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PV05FRF9SVUxFID0gTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19JRCA9IE1FVEhPRF9QQUNLQUdFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR1JPVVAxID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0dST1VQMiA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWSA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEUgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUCA9IFdPUktfUFJPRFVDVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09XTkVEX1JVTEUgPSBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0lEID0gV09SS19QUk9EVUNUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0ZVTEZJTEwgPSBXT1JLX1BST0RVQ1RfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fSVNfQUJTVFJBQ1QgPSBXT1JLX1BST0RVQ1RfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU0hBUEVJQ09OID0gV09SS19QUk9EVUNUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fR1JPVVAxID0gV09SS19QUk9EVUNUX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ0hFQ0tMSVNUID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0NPTkNFUFQgPSBXT1JLX1BST0RVQ1RfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0VYQU1QTEUgPSBXT1JLX1BST0RVQ1RfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fR1VJREVMSU5FID0gV09SS19QUk9EVUNUX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfUFJPRFVDVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1dISVRFUEFQRVIgPSBXT1JLX1BST0RVQ1RfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVkFSSUFCSUxJVFlfVFlQRSA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUDIgPSBXT1JLX1BST0RVQ1RfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0VTVElNQVRFID0gV09SS19QUk9EVUNUX19FU1RJTUFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19SRVBPUlQgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1RFTVBMQVRFID0gV09SS19QUk9EVUNUX19URU1QTEFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1RPT0xfTUVOVE9SID0gV09SS19QUk9EVUNUX19UT09MX01FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUDMgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1QgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT04gPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19HUk9VUCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUCA9IFBST0NFU1NfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX09XTkVEX1JVTEUgPSBQUk9DRVNTX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lEID0gUFJPQ0VTU19fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0ZVTEZJTEwgPSBQUk9DRVNTX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX05PREVJQ09OID0gUFJPQ0VTU19fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQMSA9IFBST0NFU1NfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FWEFNUExFID0gUFJPQ0VTU19fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDIgPSBQUk9DRVNTX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQMyA9IFBST0NFU1NfX0dST1VQMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ESUFHUkFNX1VSSSA9IFBST0NFU1NfX0RJQUdSQU1fVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0ID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTiA9IDU3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0dST1VQID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0lEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fR1JPVVAgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19JRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1RBU0sgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkUgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsIDxlbT5Eb2N1bWVudCBSb290PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01JWEVEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlkgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET01BSU4gPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fV09SS19QUk9EVUNUID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VCRE9NQUlOID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Eb21haW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbCA8ZW0+RXN0aW1hdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFURSA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0dST1VQMiA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gTWV0cmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbCA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpbmdNZXRyaWNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpbmdNZXRyaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUMgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXhhbXBsZUltcGwgPGVtPkV4YW1wbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkV4YW1wbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhBTVBMRSA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEl0ZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJVEVSQVRJT04gPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1JPVVAgPSBBQ1RJVklUWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PV05FRF9SVUxFID0gQUNUSVZJVFlfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JRCA9IEFDVElWSVRZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19GVUxGSUxMID0gQUNUSVZJVFlfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX0FCU1RSQUNUID0gQUNUSVZJVFlfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5URURfQUZURVIgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUEVSX0FDVElWSVRZID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUDEgPSBBQ1RJVklUWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DSEVDS0xJU1QgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQ09OQ0VQVCA9IEFDVElWSVRZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fRVhBTVBMRSA9IEFDVElWSVRZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HVUlERUxJTkUgPSBBQ1RJVklUWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1JFVVNBQkxFX0FTU0VUID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fV0hJVEVQQVBFUiA9IEFDVElWSVRZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFRklYID0gQUNUSVZJVFlfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1JPVVAyID0gQUNUSVZJVFlfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX0VWRU5UX0RSSVZFTiA9IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUDMgPSBBQ1RJVklUWV9fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSRUFLRE9XTl9FTEVNRU5UID0gQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUk9BRE1BUCA9IEFDVElWSVRZX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRU5BQ1RBQkxFID0gQUNUSVZJVFlfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkl0ZXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLktpbmRJbXBsIDxlbT5LaW5kPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5LaW5kSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEtJTkQgPSAzODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1dORURfUlVMRSA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fSUQgPSBNRVRIT0RfVU5JVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVcgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fT1dORURfUlVMRSA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fSUQgPSBNRVRIT0RfVU5JVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU4gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19UT09MID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU4gPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DT1BZUklHSFQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU4gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwgPGVtPk1pbGVzdG9uZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fR1JPVVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19GVUxGSUxMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTk9ERUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5URURfQkVGT1JFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQRVJfQUNUSVZJVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fR1JPVVAxID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19DSEVDS0xJU1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19DT05DRVBUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0VYQU1QTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HVUlERUxJTkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fV0hJVEVQQVBFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dST1VQMiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIFJlc3VsdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE91dGNvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUQ09NRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUCA9IFdPUktfUFJPRFVDVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fSUQgPSBXT1JLX1BST0RVQ1RfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0ZVTEZJTEwgPSBXT1JLX1BST0RVQ1RfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU0hBUEVJQ09OID0gV09SS19QUk9EVUNUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUDEgPSBXT1JLX1BST0RVQ1RfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NIRUNLTElTVCA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NPTkNFUFQgPSBXT1JLX1BST0RVQ1RfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVhBTVBMRSA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dVSURFTElORSA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfUFJPRFVDVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19XSElURVBBUEVSID0gV09SS19QUk9EVUNUX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1JPVVAyID0gV09SS19QUk9EVUNUX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0VTVElNQVRFID0gV09SS19QUk9EVUNUX19FU1RJTUFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUkVQT1JUID0gV09SS19QUk9EVUNUX19SRVBPUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1RFTVBMQVRFID0gV09SS19QUk9EVUNUX19URU1QTEFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVE9PTF9NRU5UT1IgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk91dGNvbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBoYXNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSEFTRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTkFNRSA9IEFDVElWSVRZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1JPVVAgPSBBQ1RJVklUWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX09XTkVEX1JVTEUgPSBBQ1RJVklUWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lEID0gQUNUSVZJVFlfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19GVUxGSUxMID0gQUNUSVZJVFlfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfQUJTVFJBQ1QgPSBBQ1RJVklUWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQRVJfQUNUSVZJVFkgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1JPVVAxID0gQUNUSVZJVFlfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19DSEVDS0xJU1QgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19DT05DRVBUID0gQUNUSVZJVFlfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0VYQU1QTEUgPSBBQ1RJVklUWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HVUlERUxJTkUgPSBBQ1RJVklUWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fV0hJVEVQQVBFUiA9IEFDVElWSVRZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dST1VQMiA9IEFDVElWSVRZX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUDMgPSBBQ1RJVklUWV9fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1JPQURNQVAgPSBBQ1RJVklUWV9fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRU5BQ1RBQkxFID0gQUNUSVZJVFlfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QaGFzZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQSA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19HUk9VUCA9IFBST0NFU1NfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1dORURfUlVMRSA9IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0ZVTEZJTEwgPSBQUk9DRVNTX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19JU19BQlNUUkFDVCA9IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU0hBUEVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUkFOSyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwgPGVtPlByYWN0aWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0UgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HUk9VUDIgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTiA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R29hbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0UgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PV05FRF9SVUxFID0gTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19JRCA9IE1FVEhPRF9QQUNLQUdFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAxID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMiA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlQgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUCA9IFBST0NFU1NfUEFDS0FHRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09XTkVEX1JVTEUgPSBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0lEID0gUFJPQ0VTU19QQUNLQUdFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fU1VQUFJFU1NFRCA9IFBST0NFU1NfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUDEgPSBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1JFVVNFRF9QQUNLQUdFID0gUFJPQ0VTU19QQUNLQUdFX19SRVVTRURfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX01FVEhPRF9QQUNLQUdFID0gUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fR0xPQkFMID0gUFJPQ0VTU19QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fR1JPVVAyID0gUFJPQ0VTU19QQUNLQUdFX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTU19FTEVNRU5UID0gUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVCA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04gPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IDU2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEFUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0ZVTEZJTEwgPSBCUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQRVJfQUNUSVZJVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMSA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0NIRUNLTElTVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19DT05DRVBUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19FWEFNUExFID0gQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dVSURFTElORSA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUkVVU0FCTEVfQVNTRVQgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19XSElURVBBUEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19PUFRJT05BTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDIgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUCA9IFBST0NFU1NfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX09XTkVEX1JVTEUgPSBQUk9DRVNTX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lEID0gUFJPQ0VTU19fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0ZVTEZJTEwgPSBQUk9DRVNTX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05PREVJQ09OID0gUFJPQ0VTU19fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMSA9IFBST0NFU1NfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19FWEFNUExFID0gUFJPQ0VTU19fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDIgPSBQUk9DRVNTX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMyA9IFBST0NFU1NfX0dST1VQMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ESUFHUkFNX1VSSSA9IFBST0NFU1NfX0RJQUdSQU1fVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0ID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJlcG9ydEltcGwgPGVtPlJlcG9ydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVQT1JUID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2FkbWFwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2FkbWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPQURNQVAgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2FkbWFwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsIDxlbT5Sb2xlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEUgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dST1VQMiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsIDxlbT5Sb2xlIFNldDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX1NFVCA9IDY3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1JPTEUgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgU2V0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElORyA9IDY4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VDVElPTiA9IDY5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VCX1NFQ1RJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRURFQ0VTU09SID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUwgPSA3MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0sgPSA3MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVDT05ESVRJT04gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BPU1RDT05ESVRJT04gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJGT1JNRURfQlkgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HUk9VUDIgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19NQU5EQVRPUllfSU5QVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRQVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RPT0xfTUVOVE9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTiA9IDcyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SID0gNzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19GVUxGSUxMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAxID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19DSEVDS0xJU1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19DT05DRVBUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0VYQU1QTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HVUlERUxJTkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fV0hJVEVQQVBFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1RBU0sgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HUk9VUDMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RlcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVEVQID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCA8ZW0+VGVhbSBQcm9maWxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFID0gNzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fRlVMRklMTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19JU19BQlNUUkFDVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9BQ1RJVklUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQ0hFQ0tMSVNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0NPTkNFUFQgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0VYQU1QTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1VJREVMSU5FID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19SRVVTQUJMRV9BU1NFVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1dISVRFUEFQRVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dST1VQMiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUk9MRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFTVBMQVRFID0gNzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVtcGxhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbCA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVybURlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OID0gNzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTCA9IDc3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19GVUxGSUxMID0gQ09OVEVOVF9DQVRFR09SWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVE9PTF9NRU5UT1IgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1IgPSA3ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV2hpdGVwYXBlckltcGwgPGVtPldoaXRlcGFwZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdoaXRlcGFwZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUiA9IDc5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19OQU1FID0gQ09OQ0VQVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fR1JPVVAgPSBDT05DRVBUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PV05FRF9SVUxFID0gQ09OQ0VQVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05DRVBUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19JRCA9IENPTkNFUFRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fT1JERVJJTkdfR1VJREUgPSBDT05DRVBUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NVUFBSRVNTRUQgPSBDT05DRVBUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTiA9IENPTkNFUFRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19GVUxGSUxMID0gQ09OQ0VQVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0lTX0FCU1RSQUNUID0gQ09OQ0VQVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19OT0RFSUNPTiA9IENPTkNFUFRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NIQVBFSUNPTiA9IENPTkNFUFRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0dST1VQMSA9IENPTkNFUFRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0NIRUNLTElTVCA9IENPTkNFUFRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19DT05DRVBUID0gQ09OQ0VQVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19FWEFNUExFID0gQ09OQ0VQVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0dVSURFTElORSA9IENPTkNFUFRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUkVVU0FCTEVfQVNTRVQgPSBDT05DRVBUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OQ0VQVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19XSElURVBBUEVSID0gQ09OQ0VQVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTkNFUFRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05DRVBUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9GRUFUVVJFX0NPVU5UID0gQ09OQ0VQVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwgPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTiA9IDgxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwgPGVtPldvcmsgT3JkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVIgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19MSU5LX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgT3JkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSA4NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05BTUUgPSBERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAgPSBERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSUQgPSBERVNDUklQVE9SX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19GVUxGSUxMID0gREVTQ1JJUFRPUl9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IERFU0NSSVBUT1JfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMSA9IERFU0NSSVBUT1JfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19DSEVDS0xJU1QgPSBERVNDUklQVE9SX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0NPTkNFUFQgPSBERVNDUklQVE9SX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWEFNUExFID0gREVTQ1JJUFRPUl9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HVUlERUxJTkUgPSBERVNDUklQVE9SX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVCA9IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMID0gREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV0hJVEVQQVBFUiA9IERFU0NSSVBUT1JfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUX1RPID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEUgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19GVUxGSUxMID0gQ09OVEVOVF9DQVRFR09SWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9UWVBFID0gODc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVJfVFlQRSA9IDg4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfVFlQRV9PQkpFQ1QgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V29yayBPcmRlciBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX09SREVSX1RZUEVfT0JKRUNUID0gOTA7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5IDxlbT5BY3Rpdml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJvYWRtYXAoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Sb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93VG9TdGFmZiA8ZW0+SG93IFRvIFN0YWZmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG93IFRvIFN0YWZmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0X0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0KCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24gPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSgpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0eSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3QoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDb25jZXB0KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEV4YW1wbGUoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0V2hpdGVwYXBlcigpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUGxhbm5lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29tcG9zaXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRDb21wb3NpdGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGUgPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZSgpCi0JICogQHNlZSAjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCA8ZW0+Q29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50I2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50I2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Db250ZW50Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbigpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0KCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHQoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGUoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEd1aWRlbGluZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFJldXNhYmxlQXNzZXQoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFdoaXRlcGFwZXIoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnQgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50IDxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcnkgPGVtPlN1YiBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3ViIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlI2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0IDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwNDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRHcm91cDQoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbCA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjYWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmlzayBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50IDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0RnVsZmlsbCA8ZW0+RnVsZmlsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RnVsZmlsbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRGdWxmaWxsKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNpc0lzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Jc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob2RlaWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yIDxlbT5EZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgRGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0U3ViRGlzY2lwbGluZSgpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRSZWZlcmVuY2VXb3JrZmxvdyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93KCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9tYWluX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFN1YmRvbWFpbiA8ZW0+U3ViZG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJkb21haW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWluKCkKLQkgKiBAc2VlICNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEVzdGltYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uTWV0cmljIDxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uTWV0cmljKCkKLQkgKiBAc2VlICNnZXRFc3RpbWF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0RXN0aW1hdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYyA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHRhY2htZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50KCkKLQkgKiBAc2VlICNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb24gPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXcgPGVtPlByb2Nlc3MgVmlldzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UHJvY2VzcyBWaWV3PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlldygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlIDxlbT5Pd25lZCBSdWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Pd25lZCBSdWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0VG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2woKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZExpYnJhcnlfVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2UoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2xvYmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFVuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvcHlyaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0IDxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlcXVpcmVkIFJlc3VsdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSNnZXRSZXF1aXJlZFJlc3VsdCgpCi0JICogQHNlZSAjZ2V0TWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROYW1lZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWUgPGVtPk91dGNvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGNvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlIDxlbT5QaGFzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFuazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2UgPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2UgPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2UgPGVtPlN1YiBQcmFjdGljZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2UoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9TdWJQcmFjdGljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmFja2dyb3VuZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R29hbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvYmxlbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm4gPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybigpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGlhZ3JhbVVSSSA8ZW0+RGlhZ3JhbSBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaWFncmFtIFVSSTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGlhZ3JhbVVSSSgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19EaWFncmFtVVJJKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvcHlyaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZSA8ZW0+SW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NvcGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzYWdlIE5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwNDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEdyb3VwNCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VQcm9jZXNzIDxlbT5CYXNlIFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJhc2UgUHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VQcm9jZXNzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNraWxsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lub255bXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU2V0X1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0KCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdWIgU2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0T3V0cHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRUb29sTWVudG9yKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1Rvb2xNZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2soKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PdXRwdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPdXRwdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwIDxlbT5TdGVwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdGVwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0U3RlcCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1N0ZXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZWFtUHJvZmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0Um9sZSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1cGVyIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3ViIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ub29sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUb29sX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRUb29sTWVudG9yKCkKLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUb29sX1Rvb2xNZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZWRlY2Vzc29yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciA8ZW0+V29yayBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9yKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZVJvbGUgPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlUm9sZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dFRvIDxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXh0ZXJuYWwgSW5wdXQgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dFRvKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW1wYWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0VG8gPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0IFRvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0VG8oKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dFRvIDxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dFRvKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3V0cHV0RnJvbSA8ZW0+T3V0cHV0IEZyb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk91dHB1dCBGcm9tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE91dHB1dEZyb20oKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFdvcmtPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhcmlhYmlsaXR5VHlwZTpPYmplY3QnIGJhc2VUeXBlPSdWYXJpYWJpbGl0eVR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V29yayBPcmRlciBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya09yZGVyVHlwZTpPYmplY3QnIGJhc2VUeXBlPSdXb3JrT3JkZXJUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFdvcmtPcmRlclR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwgPGVtPkFjdGl2aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19QT1NUQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX0dST1VQMyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Hcm91cDMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1JPQURNQVAgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPID0gZUlOU1RBTkNFLmdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsIDxlbT5BcnRpZmFjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlRJRkFDVCA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9fR1JPVVAzID0gZUlOU1RBTkNFLmdldEFydGlmYWN0X0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkIEFydGlmYWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OID0gZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfV2hpdGVwYXBlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDQVBBQklMSVRZX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDaGVja2xpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPU0lURV9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9TSVRFX1JPTEVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25jZXB0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTkNFUFQgPSBlSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbCA8ZW0+Q29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORSA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX1BBQ0tBR0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ1VTVE9NX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENVU1RPTV9DQVRFR09SWV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJQkFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19GVUxGSUxMID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9Jc0Fic3RyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fVEFTSyA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvdzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkVfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvY3VtZW50Um9vdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBET0NVTUVOVF9ST09UID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPQ1VNRU5UX1JPT1RfX01JWEVEID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9NaXhlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZExpYnJhcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREb21haW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRE9NQUlOID0gZUlOU1RBTkNFLmdldERvbWFpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBET01BSU5fX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREb21haW5fR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPTUFJTl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1NVQkRPTUFJTiA9IGVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTEVNRU5UID0gZUlOU1RBTkNFLmdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsIDxlbT5Fc3RpbWF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFURSA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFU1RJTUFURV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEVzdGltYXRlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBNZXRyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGluZ01ldHJpY0ltcGwgPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGluZ01ldHJpYygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU5HX01FVFJJQyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXhhbXBsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREFOQ0UgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURFTElORSA9IGVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSVRFUkFUSU9OID0gZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5LaW5kSW1wbCA8ZW0+S2luZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuS2luZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEtpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgS0lORCA9IGVJTlNUQU5DRS5nZXRLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBlSU5TVEFOQ0UuZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0dST1VQID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3JvdXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0lEID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfTElCUkFSWV9fVE9PTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X1Rvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQUNLQUdFX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwgPGVtPk1ldGhvZCBVbml0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfVU5JVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNSUxFU1RPTkUgPSBlSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZCBSZXN1bHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUID0gZUlOU1RBTkNFLmdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsIDxlbT5OYW1lZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTkFNRURfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOQU1FRF9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsIDxlbT5PdXRjb21lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5PdXRjb21lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBPVVRDT01FID0gZUlOU1RBTkNFLmdldE91dGNvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBBQ0tBR0VBQkxFX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBoYXNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGhhc2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEhBU0UgPSBlSU5TVEFOQ0UuZ2V0UGhhc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGxhbm5pbmdEYXRhKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBMQU5OSU5HX0RBVEEgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SYW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fUkFOSyA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGFfUmFuaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwgPGVtPlByYWN0aWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBSQUNUSUNFID0gZUlOU1RBTkNFLmdldFByYWN0aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUkFDVElDRV9fU1VCX1BSQUNUSUNFID0gZUlOU1RBTkNFLmdldFByYWN0aWNlX1N1YlByYWN0aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJBQ1RJQ0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MZXZlbHMgT2YgQWRvcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19ESUFHUkFNX1VSSSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzX0RpYWdyYW1VUkkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QQUNLQUdFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfUEFDS0FHRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXBvcnRJbXBsIDxlbT5SZXBvcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJlcG9ydEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVBPUlQgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsIDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJldXNhYmxlQXNzZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2FkbWFwSW1wbCA8ZW0+Um9hZG1hcDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9hZG1hcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvYWRtYXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9BRE1BUCA9IGVJTlNUQU5DRS5nZXRSb2FkbWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsIDxlbT5Sb2xlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFID0gZUlOU1RBTkNFLmdldFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFJvbGVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN5bm9ueW1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsIDxlbT5Sb2xlIFNldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVQgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1NFVF9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFJvbGVTZXRfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1NFVF9fUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NFVF9HUk9VUElORyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUID0gZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsIDxlbT5TZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRUNUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVElPTl9fU1VCX1NFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fU0VDVElPTl9OQU1FID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBlSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFzaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLID0gZUlOU1RBTkNFLmdldFRhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1BSRUNPTkRJVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrX1ByZWNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRUYXNrX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19PVVRQVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX0VTVElNQVRFID0gZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0tfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19UQVNLID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1NURVAgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCA8ZW0+VGVhbSBQcm9maWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFQU1fUFJPRklMRSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURUFNX1BST0ZJTEVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fUk9MRSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBlciBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0gPSBlSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgVGVhbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlbXBsYXRlSW1wbCA8ZW0+VGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVtcGxhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVNUExBVEUgPSBlSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVybURlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVSTV9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsIDxlbT5Ub29sPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MID0gZUlOU1RBTkNFLmdldFRvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVE9PTF9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFRvb2xfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVE9PTF9fVE9PTF9NRU5UT1IgPSBlSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVE9PTF9NRU5UT1IgPSBlSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbCA8ZW0+V2hpdGVwYXBlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdoaXRlcGFwZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0hJVEVQQVBFUiA9IGVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtEZWZpbml0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfT1JERVIgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX09SREVSX19JRCA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX0xJTktfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfTGlua1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9fRVNUSU1BVEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19SRVBPUlQgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19URU1QTEFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1IgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST00gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFdPUktfT1JERVJfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFZBUklBQklMSVRZX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5VHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+V29yayBPcmRlciBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgV09SS19PUkRFUl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCk7Ci0KLQl9Ci0KLX0gLy9VbWFQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDdlYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFyaWFiaWxpdHlUeXBlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhcmlhYmlsaXR5VHlwZSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFZhcmlhYmlsaXR5VHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5BKDAsICJuYSIsICJuYSIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ09OVFJJQlVURVMoMSwgImNvbnRyaWJ1dGVzIiwgImNvbnRyaWJ1dGVzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhURU5EUygyLCAiZXh0ZW5kcyIsICJleHRlbmRzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlSRVBMQUNFUygzLCAicmVwbGFjZXMiLCAicmVwbGFjZXMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTE9DQUxfQ09OVFJJQlVUSU9OKDQsICJsb2NhbENvbnRyaWJ1dGlvbiIsICJsb2NhbENvbnRyaWJ1dGlvbiIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTE9DQUxfUkVQTEFDRU1FTlQoNSwgImxvY2FsUmVwbGFjZW1lbnQiLCAibG9jYWxSZXBsYWNlbWVudCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHMgUmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EU19SRVBMQUNFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVYVEVORFNfUkVQTEFDRVMoNiwgImV4dGVuZHNSZXBsYWNlcyIsICJleHRlbmRzUmVwbGFjZXMiKTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TmE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkEKLQkgKiBAbW9kZWwgbmFtZT0ibmEiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTCi0JICogQG1vZGVsIG5hbWU9ImNvbnRyaWJ1dGVzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRSSUJVVEVTX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EUwotCSAqIEBtb2RlbCBuYW1lPSJleHRlbmRzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFNfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUExBQ0VTCi0JICogQG1vZGVsIG5hbWU9InJlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VTX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0NPTlRSSUJVVElPTgotCSAqIEBtb2RlbCBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9DT05UUklCVVRJT05fVkFMVUUgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfUkVQTEFDRU1FTlRfVkFMVUUgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFID0gNjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVmFyaWFiaWxpdHlUeXBlW10gewotCQkJTkEsCi0JCQlDT05UUklCVVRFUywKLQkJCUVYVEVORFMsCi0JCQlSRVBMQUNFUywKLQkJCUxPQ0FMX0NPTlRSSUJVVElPTiwKLQkJCUxPQ0FMX1JFUExBQ0VNRU5ULAotCQkJRVhURU5EU19SRVBMQUNFUywKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VmFyaWFiaWxpdHlUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOQV9WQUxVRTogcmV0dXJuIE5BOwotCQkJY2FzZSBDT05UUklCVVRFU19WQUxVRTogcmV0dXJuIENPTlRSSUJVVEVTOwotCQkJY2FzZSBFWFRFTkRTX1ZBTFVFOiByZXR1cm4gRVhURU5EUzsKLQkJCWNhc2UgUkVQTEFDRVNfVkFMVUU6IHJldHVybiBSRVBMQUNFUzsKLQkJCWNhc2UgTE9DQUxfQ09OVFJJQlVUSU9OX1ZBTFVFOiByZXR1cm4gTE9DQUxfQ09OVFJJQlVUSU9OOwotCQkJY2FzZSBMT0NBTF9SRVBMQUNFTUVOVF9WQUxVRTogcmV0dXJuIExPQ0FMX1JFUExBQ0VNRU5UOwotCQkJY2FzZSBFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFOiByZXR1cm4gRVhURU5EU19SRVBMQUNFUzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1doaXRlcGFwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9XaGl0ZXBhcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2VhNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1doaXRlcGFwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2hpdGVwYXBlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdoaXRlcGFwZXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1doaXRlcGFwZXInIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXaGl0ZXBhcGVyIGV4dGVuZHMgQ29uY2VwdCB7Ci19IC8vIFdoaXRlcGFwZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjhmODhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrQnJlYWtkb3duRWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWRlY2Vzc29yJyBncm91cD0nI2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8V29ya09yZGVyPiBnZXRQcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3NldElzRXZlbnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc0V2ZW50RHJpdmVuJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjdW5zZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzRXZlbnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3NldElzRXZlbnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzT25nb2luZygpCi0JICogQHNlZSAjdW5zZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI3NldElzT25nb2luZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNPbmdvaW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzT25nb2luZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICN1bnNldElzT25nb2luZygpCi0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT25nb2luZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzT25nb2luZygpCi0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBzZWUgI3NldElzT25nb2luZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3Vuc2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUmVwZWF0YWJsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1JlcGVhdGFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNSZXBlYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzUmVwZWF0YWJsZSgpOwotCi19IC8vIFdvcmtCcmVha2Rvd25FbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5MmFhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0RlZmluaXRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotICogV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrRGVmaW5pdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtEZWZpbml0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlY29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV29ya0RlZmluaXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTRiNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya09yZGVyLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIE9yZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi0gKiBUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya09yZGVyJyBraW5kPSdzaW1wbGUnIgotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrT3JkZXIgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9WYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSc6MCcga2luZD0nc2ltcGxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX0lkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmaW5pc2hUb1N0YXJ0IjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNzZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfTGlua1R5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmaW5pc2hUb1N0YXJ0IiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2xpbmtUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyVHlwZSBnZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSAjaXNTZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjdW5zZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMaW5rVHlwZSgpOwotCi19IC8vIFdvcmtPcmRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzUyM2NhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXJUeXBlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJUeXBlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrT3JkZXJUeXBlJyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gV29ya09yZGVyVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX1NUQVJUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRklOSVNIX1RPX1NUQVJUKDAsICJmaW5pc2hUb1N0YXJ0IiwgImZpbmlzaFRvU3RhcnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0hfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlGSU5JU0hfVE9fRklOSVNIKDEsICJmaW5pc2hUb0ZpbmlzaCIsICJmaW5pc2hUb0ZpbmlzaCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RBUlRfVE9fU1RBUlQoMiwgInN0YXJ0VG9TdGFydCIsICJzdGFydFRvU3RhcnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fRklOSVNIX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RBUlRfVE9fRklOSVNIKDMsICJzdGFydFRvRmluaXNoIiwgInN0YXJ0VG9GaW5pc2giKTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlQKLQkgKiBAbW9kZWwgbmFtZT0iZmluaXNoVG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfVE9fU1RBUlRfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmluaXNoIFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RmluaXNoIFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fRklOSVNICi0JICogQG1vZGVsIG5hbWU9ImZpbmlzaFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19GSU5JU0hfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUCi0JICogQG1vZGVsIG5hbWU9InN0YXJ0VG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UT19TVEFSVF9WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0gKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb0ZpbmlzaCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UT19GSU5JU0hfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBXb3JrT3JkZXJUeXBlW10gewotCQkJRklOSVNIX1RPX1NUQVJULAotCQkJRklOSVNIX1RPX0ZJTklTSCwKLQkJCVNUQVJUX1RPX1NUQVJULAotCQkJU1RBUlRfVE9fRklOSVNILAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFdvcmtPcmRlclR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgRklOSVNIX1RPX1NUQVJUX1ZBTFVFOiByZXR1cm4gRklOSVNIX1RPX1NUQVJUOwotCQkJY2FzZSBGSU5JU0hfVE9fRklOSVNIX1ZBTFVFOiByZXR1cm4gRklOSVNIX1RPX0ZJTklTSDsKLQkJCWNhc2UgU1RBUlRfVE9fU1RBUlRfVkFMVUU6IHJldHVybiBTVEFSVF9UT19TVEFSVDsKLQkJCWNhc2UgU1RBUlRfVE9fRklOSVNIX1ZBTFVFOiByZXR1cm4gU1RBUlRfVE9fRklOSVNIOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXb3JrT3JkZXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkY2JmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi0gKiBBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrUHJvZHVjdCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlcG9ydCcgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcGxhdGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGVtcGxhdGUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUb29sTWVudG9yJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRUb29sTWVudG9yKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2NGMwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbXBhY3RPZk5vdEhhdmluZyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWFzb25zRm9yTm90TmVlZGluZyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEzZGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlUm9sZSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dFRvIDxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0VG8gPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXRUbyA8ZW0+T3B0aW9uYWwgSW5wdXQgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRPdXRwdXRGcm9tIDxlbT5PdXRwdXQgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrUHJvZHVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrUHJvZHVjdCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtQcm9kdWN0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBSb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc3BvbnNpYmxlUm9sZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzcG9uc2libGVSb2xlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlc3BvbnNpYmxlUm9sZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlUm9sZSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNwb25zaWJsZVJvbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0IFRvPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxJbnB1dFRvJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFeHRlcm5hbElucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbXBhY3RlZEJ5JyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRJbXBhY3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0czwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW1wYWN0cycgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0SW1wYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01hbmRhdG9yeUlucHV0VG8nIGdyb3VwPScjZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0IFRvPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09wdGlvbmFsSW5wdXRUbycgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3B0aW9uYWxJbnB1dFRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0IEZyb208L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgRnJvbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0cHV0RnJvbScgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0RnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGl2ZXJhYmxlUGFydHMnIGdyb3VwPScjZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2FjdGl2aXR5RW50cnlTdGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotCSAqIEZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhY3Rpdml0eUV4aXRTdGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWRiYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdFR5cGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0VHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0VHlwZSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtQcm9kdWN0JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRXb3JrUHJvZHVjdCgpOwotCi19IC8vIFdvcmtQcm9kdWN0VHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFmNzkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvd1RvU3RhZmYoKSA8ZW0+SG93IFRvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3dUb1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIT1dfVE9fU1RBRkZfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93VG9TdGFmZigpIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd1RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaG93VG9TdGFmZiA9IEhPV19UT19TVEFGRl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIGFsdGVybmF0aXZlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIG5ld0FsdGVybmF0aXZlcykgewotCQlTdHJpbmcgb2xkQWx0ZXJuYXRpdmVzID0gYWx0ZXJuYXRpdmVzOwotCQlhbHRlcm5hdGl2ZXMgPSBuZXdBbHRlcm5hdGl2ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywgb2xkQWx0ZXJuYXRpdmVzLCBhbHRlcm5hdGl2ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvd1RvU3RhZmYoKSB7Ci0JCXJldHVybiBob3dUb1N0YWZmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvd1RvU3RhZmYoU3RyaW5nIG5ld0hvd1RvU3RhZmYpIHsKLQkJU3RyaW5nIG9sZEhvd1RvU3RhZmYgPSBob3dUb1N0YWZmOwotCQlob3dUb1N0YWZmID0gbmV3SG93VG9TdGFmZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGLCBvbGRIb3dUb1N0YWZmLCBob3dUb1N0YWZmKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UsIG9sZFB1cnBvc2UsIHB1cnBvc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlyZXR1cm4gZ2V0SG93VG9TdGFmZigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlzZXRIb3dUb1N0YWZmKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlzZXRIb3dUb1N0YWZmKEhPV19UT19TVEFGRl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbCA6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlyZXR1cm4gSE9XX1RPX1NUQUZGX0VERUZBVUxUID09IG51bGwgPyBob3dUb1N0YWZmICE9IG51bGwgOiAhSE9XX1RPX1NUQUZGX0VERUZBVUxULmVxdWFscyhob3dUb1N0YWZmKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWx0ZXJuYXRpdmVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvd1RvU3RhZmY6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhvd1RvU3RhZmYpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzkzMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRCcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBBY3Rpdml0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVjb25kaXRpb24gPSBQUkVDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3N0Y29uZGl0aW9uID0gUE9TVENPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VuYWN0YWJsZSgpIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFbmFjdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FTkFDVEFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFbmFjdGFibGUoKSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWN0YWJsZSA9IElTX0VOQUNUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRW5hY3RhYmxlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWN0YWJsZUVTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyBuZXdQcmVjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDMoKSB7Ci0JCWlmIChncm91cDMgPT0gbnVsbCkgewotCQkJZ3JvdXAzID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSb2FkbWFwKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19ST0FETUFQKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzRW5hY3RhYmxlKCkgewotCQlyZXR1cm4gaXNFbmFjdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFbmFjdGFibGUoYm9vbGVhbiBuZXdJc0VuYWN0YWJsZSkgewotCQlib29sZWFuIG9sZElzRW5hY3RhYmxlID0gaXNFbmFjdGFibGU7Ci0JCWlzRW5hY3RhYmxlID0gbmV3SXNFbmFjdGFibGU7Ci0JCWJvb2xlYW4gb2xkSXNFbmFjdGFibGVFU2V0ID0gaXNFbmFjdGFibGVFU2V0OwotCQlpc0VuYWN0YWJsZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEUsIG9sZElzRW5hY3RhYmxlLCBpc0VuYWN0YWJsZSwgIW9sZElzRW5hY3RhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNFbmFjdGFibGUoKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbmFjdGFibGUgPSBpc0VuYWN0YWJsZTsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZUVTZXQgPSBpc0VuYWN0YWJsZUVTZXQ7Ci0JCWlzRW5hY3RhYmxlID0gSVNfRU5BQ1RBQkxFX0VERUZBVUxUOwotCQlpc0VuYWN0YWJsZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEUsIG9sZElzRW5hY3RhYmxlLCBJU19FTkFDVEFCTEVfRURFRkFVTFQsIG9sZElzRW5hY3RhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiBpc0VuYWN0YWJsZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVN0cmluZyBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWJvb2xlYW4gb2xkVmFyaWFiaWxpdHlUeXBlRVNldCA9IHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JCXZhcmlhYmlsaXR5VHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSwgIW9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCwgb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QnJlYWtkb3duRWxlbWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQOgotCQkJCXJldHVybiBnZXRSb2FkbWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQlyZXR1cm4gaXNJc0VuYWN0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQOgotCQkJCWdldFJvYWRtYXAoKS5jbGVhcigpOwotCQkJCWdldFJvYWRtYXAoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXNldElzRW5hY3RhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbihQUkVDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlzZXRQb3N0Y29uZGl0aW9uKFBPU1RDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJZ2V0Um9hZG1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQkJdW5zZXRJc0VuYWN0YWJsZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQl1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMzoKLQkJCQlyZXR1cm4gZ3JvdXAzICE9IG51bGwgJiYgIWdyb3VwMy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0QnJlYWtkb3duRWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUDoKLQkJCQlyZXR1cm4gIWdldFJvYWRtYXAoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQlyZXR1cm4gaXNTZXRJc0VuYWN0YWJsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwgOiAhVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHModmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRW5hY3RhYmxlOiAiKTsKLQkJaWYgKGlzRW5hY3RhYmxlRVNldCkgcmVzdWx0LmFwcGVuZChpc0VuYWN0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5VHlwZTogIik7Ci0JCWlmICh2YXJpYWJpbGl0eVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEyOTBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwjaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKSA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNQcmltYXJ5RXh0ZW5zaW9uKCkgPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmltYXJ5RXh0ZW5zaW9uID0gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFByaW1hcnkgRXh0ZW5zaW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1hcnlFeHRlbnNpb25FU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBpc1ByaW1hcnlFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKGJvb2xlYW4gbmV3SXNQcmltYXJ5RXh0ZW5zaW9uKSB7Ci0JCWJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uID0gaXNQcmltYXJ5RXh0ZW5zaW9uOwotCQlpc1ByaW1hcnlFeHRlbnNpb24gPSBuZXdJc1ByaW1hcnlFeHRlbnNpb247Ci0JCWJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uRVNldCA9IGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQ7Ci0JCWlzUHJpbWFyeUV4dGVuc2lvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiwgb2xkSXNQcmltYXJ5RXh0ZW5zaW9uLCBpc1ByaW1hcnlFeHRlbnNpb24sICFvbGRJc1ByaW1hcnlFeHRlbnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCWJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uID0gaXNQcmltYXJ5RXh0ZW5zaW9uOwotCQlib29sZWFuIG9sZElzUHJpbWFyeUV4dGVuc2lvbkVTZXQgPSBpc1ByaW1hcnlFeHRlbnNpb25FU2V0OwotCQlpc1ByaW1hcnlFeHRlbnNpb24gPSBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVDsKLQkJaXNQcmltYXJ5RXh0ZW5zaW9uRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OLCBvbGRJc1ByaW1hcnlFeHRlbnNpb24sIElTX1BSSU1BUllfRVhURU5TSU9OX0VERUZBVUxULCBvbGRJc1ByaW1hcnlFeHRlbnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBpc1ByaW1hcnlFeHRlbnNpb25FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQkJcmV0dXJuIGlzSXNQcmltYXJ5RXh0ZW5zaW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJCXNldElzUHJpbWFyeUV4dGVuc2lvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCQl1bnNldElzUHJpbWFyeUV4dGVuc2lvbigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCQlyZXR1cm4gaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzUHJpbWFyeUV4dGVuc2lvbjogIik7Ci0JCWlmIChpc1ByaW1hcnlFeHRlbnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKGlzUHJpbWFyeUV4dGVuc2lvbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JhOWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgQXJ0aWZhY3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyaWVmT3V0bGluZSgpIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX09VVExJTkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZk91dGxpbmUgPSBCUklFRl9PVVRMSU5FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnMgPSBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uKCkgPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb24oKSA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uID0gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90YXRpb24oKSA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RhdGlvbigpIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb24gPSBOT1RBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiBicmllZk91dGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyBuZXdCcmllZk91dGxpbmUpIHsKLQkJU3RyaW5nIG9sZEJyaWVmT3V0bGluZSA9IGJyaWVmT3V0bGluZTsKLQkJYnJpZWZPdXRsaW5lID0gbmV3QnJpZWZPdXRsaW5lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FLCBvbGRCcmllZk91dGxpbmUsIGJyaWVmT3V0bGluZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb25PcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgbmV3UmVwcmVzZW50YXRpb25PcHRpb25zKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPSByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JCXJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IG5ld1JlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywgb2xkUmVwcmVzZW50YXRpb25PcHRpb25zLCByZXByZXNlbnRhdGlvbk9wdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nIG5ld1JlcHJlc2VudGF0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbiA9IHJlcHJlc2VudGF0aW9uOwotCQlyZXByZXNlbnRhdGlvbiA9IG5ld1JlcHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTiwgb2xkUmVwcmVzZW50YXRpb24sIHJlcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uKFN0cmluZyBuZXdOb3RhdGlvbikgewotCQlTdHJpbmcgb2xkTm90YXRpb24gPSBub3RhdGlvbjsKLQkJbm90YXRpb24gPSBuZXdOb3RhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04sIG9sZE5vdGF0aW9uLCBub3RhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlyZXR1cm4gZ2V0QnJpZWZPdXRsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQkJcmV0dXJuIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQkJcmV0dXJuIGdldE5vdGF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlzZXRCcmllZk91dGxpbmUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQkJCXNldFJlcHJlc2VudGF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQkJc2V0Tm90YXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlzZXRCcmllZk91dGxpbmUoQlJJRUZfT1VUTElORV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQkJCXNldFJlcHJlc2VudGF0aW9uKFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJCXNldE5vdGF0aW9uKE5PVEFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlyZXR1cm4gQlJJRUZfT1VUTElORV9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZPdXRsaW5lICE9IG51bGwgOiAhQlJJRUZfT1VUTElORV9FREVGQVVMVC5lcXVhbHMoYnJpZWZPdXRsaW5lKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCQlyZXR1cm4gUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9PSBudWxsID8gcmVwcmVzZW50YXRpb25PcHRpb25zICE9IG51bGwgOiAhUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVC5lcXVhbHMocmVwcmVzZW50YXRpb25PcHRpb25zKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQkJcmV0dXJuIFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyByZXByZXNlbnRhdGlvbiAhPSBudWxsIDogIVJFUFJFU0VOVEFUSU9OX0VERUZBVUxULmVxdWFscyhyZXByZXNlbnRhdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJCXJldHVybiBOT1RBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbm90YXRpb24gIT0gbnVsbCA6ICFOT1RBVElPTl9FREVGQVVMVC5lcXVhbHMobm90YXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYnJpZWZPdXRsaW5lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChicmllZk91dGxpbmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uT3B0aW9uczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVwcmVzZW50YXRpb25PcHRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXByZXNlbnRhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVwcmVzZW50YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3RhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkZWNhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0SW1wbCNnZXRDb250YWluZWRBcnRpZmFjdCA8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgQXJ0aWZhY3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDMoKSB7Ci0JCWlmIChncm91cDMgPT0gbnVsbCkgewotCQkJZ3JvdXAzID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PEFydGlmYWN0PiBnZXRDb250YWluZWRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnRhaW5lZEFydGlmYWN0KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lZEFydGlmYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5jbGVhcigpOwotCQkJCWdldENvbnRhaW5lZEFydGlmYWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcnRpZmFjdD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQlnZXRHcm91cDMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCWdldENvbnRhaW5lZEFydGlmYWN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCXJldHVybiAhZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1MTQyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VHdWlkYW5jZSgpIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VHdWlkYW5jZSgpIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZUd1aWRhbmNlID0gVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCkgewotCQlyZXR1cm4gdXNhZ2VHdWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2FnZUd1aWRhbmNlKFN0cmluZyBuZXdVc2FnZUd1aWRhbmNlKSB7Ci0JCVN0cmluZyBvbGRVc2FnZUd1aWRhbmNlID0gdXNhZ2VHdWlkYW5jZTsKLQkJdXNhZ2VHdWlkYW5jZSA9IG5ld1VzYWdlR3VpZGFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFLCBvbGRVc2FnZUd1aWRhbmNlLCB1c2FnZUd1aWRhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCQlyZXR1cm4gZ2V0VXNhZ2VHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJCXNldFVzYWdlR3VpZGFuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJc2V0VXNhZ2VHdWlkYW5jZShVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJCXJldHVybiBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCA9PSBudWxsID8gdXNhZ2VHdWlkYW5jZSAhPSBudWxsIDogIVVTQUdFX0dVSURBTkNFX0VERUZBVUxULmVxdWFscyh1c2FnZUd1aWRhbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVzYWdlR3VpZGFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVzYWdlR3VpZGFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmRlMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQWZ0ZXIoKSA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VOVEVEX0FGVEVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEFmdGVyKCkgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGVkQWZ0ZXIgPSBQUkVTRU5URURfQUZURVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQmVmb3JlKCkgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRCZWZvcmUoKSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRlZEJlZm9yZSA9IFBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxhbm5pbmdEYXRhKCkgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBTk5JTkdfREFUQV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbGFubmluZ0RhdGEoKSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBsYW5uaW5nRGF0YSA9IFBMQU5OSU5HX0RBVEFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwZXJBY3Rpdml0eSgpIDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwZXJBY3Rpdml0eSgpIDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdXBlckFjdGl2aXR5ID0gU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBIYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfT1BUSU9OQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09wdGlvbmFsID0gSVNfT1BUSU9OQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIE9wdGlvbmFsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09wdGlvbmFsRVNldDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUGxhbm5lZCgpIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUGxhbm5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1BMQU5ORURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNQbGFubmVkKCkgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BsYW5uZWQgPSBJU19QTEFOTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBQbGFubmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BsYW5uZWRFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCXJldHVybiBwcmVzZW50ZWRBZnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50ZWRBZnRlcihTdHJpbmcgbmV3UHJlc2VudGVkQWZ0ZXIpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRlZEFmdGVyID0gcHJlc2VudGVkQWZ0ZXI7Ci0JCXByZXNlbnRlZEFmdGVyID0gbmV3UHJlc2VudGVkQWZ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwgb2xkUHJlc2VudGVkQWZ0ZXIsIHByZXNlbnRlZEFmdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiBwcmVzZW50ZWRCZWZvcmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGVkQmVmb3JlKFN0cmluZyBuZXdQcmVzZW50ZWRCZWZvcmUpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRlZEJlZm9yZSA9IHByZXNlbnRlZEJlZm9yZTsKLQkJcHJlc2VudGVkQmVmb3JlID0gbmV3UHJlc2VudGVkQmVmb3JlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLCBvbGRQcmVzZW50ZWRCZWZvcmUsIHByZXNlbnRlZEJlZm9yZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYW5uaW5nRGF0YShTdHJpbmcgbmV3UGxhbm5pbmdEYXRhKSB7Ci0JCVN0cmluZyBvbGRQbGFubmluZ0RhdGEgPSBwbGFubmluZ0RhdGE7Ci0JCXBsYW5uaW5nRGF0YSA9IG5ld1BsYW5uaW5nRGF0YTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwgb2xkUGxhbm5pbmdEYXRhLCBwbGFubmluZ0RhdGEpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1cGVyQWN0aXZpdHkoKSB7Ci0JCXJldHVybiBzdXBlckFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyQWN0aXZpdHkoU3RyaW5nIG5ld1N1cGVyQWN0aXZpdHkpIHsKLQkJU3RyaW5nIG9sZFN1cGVyQWN0aXZpdHkgPSBzdXBlckFjdGl2aXR5OwotCQlzdXBlckFjdGl2aXR5ID0gbmV3U3VwZXJBY3Rpdml0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFksIG9sZFN1cGVyQWN0aXZpdHksIHN1cGVyQWN0aXZpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDEpOwotCQl9Ci0JCXJldHVybiBncm91cDE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q2hlY2tsaXN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENvbmNlcHQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbiBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzKSB7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQlib29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQ7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzLCAhb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldDsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVDsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMsIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCwgb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBpc09wdGlvbmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzT3B0aW9uYWwoYm9vbGVhbiBuZXdJc09wdGlvbmFsKSB7Ci0JCWJvb2xlYW4gb2xkSXNPcHRpb25hbCA9IGlzT3B0aW9uYWw7Ci0JCWlzT3B0aW9uYWwgPSBuZXdJc09wdGlvbmFsOwotCQlib29sZWFuIG9sZElzT3B0aW9uYWxFU2V0ID0gaXNPcHRpb25hbEVTZXQ7Ci0JCWlzT3B0aW9uYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsIG9sZElzT3B0aW9uYWwsIGlzT3B0aW9uYWwsICFvbGRJc09wdGlvbmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNPcHRpb25hbCgpIHsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsRVNldCA9IGlzT3B0aW9uYWxFU2V0OwotCQlpc09wdGlvbmFsID0gSVNfT1BUSU9OQUxfRURFRkFVTFQ7Ci0JCWlzT3B0aW9uYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsIG9sZElzT3B0aW9uYWwsIElTX09QVElPTkFMX0VERUZBVUxULCBvbGRJc09wdGlvbmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNQbGFubmVkKCkgewotCQlyZXR1cm4gaXNQbGFubmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzUGxhbm5lZChib29sZWFuIG5ld0lzUGxhbm5lZCkgewotCQlib29sZWFuIG9sZElzUGxhbm5lZCA9IGlzUGxhbm5lZDsKLQkJaXNQbGFubmVkID0gbmV3SXNQbGFubmVkOwotCQlib29sZWFuIG9sZElzUGxhbm5lZEVTZXQgPSBpc1BsYW5uZWRFU2V0OwotCQlpc1BsYW5uZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLCBpc1BsYW5uZWQsICFvbGRJc1BsYW5uZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1BsYW5uZWQoKSB7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkID0gaXNQbGFubmVkOwotCQlib29sZWFuIG9sZElzUGxhbm5lZEVTZXQgPSBpc1BsYW5uZWRFU2V0OwotCQlpc1BsYW5uZWQgPSBJU19QTEFOTkVEX0VERUZBVUxUOwotCQlpc1BsYW5uZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLCBJU19QTEFOTkVEX0VERUZBVUxULCBvbGRJc1BsYW5uZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1BsYW5uZWQoKSB7Ci0JCXJldHVybiBpc1BsYW5uZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgbmV3UHJlZml4KSB7Ci0JCVN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0JCXByZWZpeCA9IG5ld1ByZWZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRlZEJlZm9yZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJCXJldHVybiBnZXRQbGFubmluZ0RhdGEoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJcmV0dXJuIGdldFN1cGVyQWN0aXZpdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiBnZXRDaGVja2xpc3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlyZXR1cm4gZ2V0Q29uY2VwdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gZ2V0R3VpZGVsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCXJldHVybiBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiBnZXRXaGl0ZXBhcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCQlyZXR1cm4gaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQlyZXR1cm4gaXNJc09wdGlvbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXJldHVybiBpc0lzUGxhbm5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJCXJldHVybiBnZXRQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXNldFByZXNlbnRlZEFmdGVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlzZXRQcmVzZW50ZWRCZWZvcmUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJCXNldFBsYW5uaW5nRGF0YSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXNldFN1cGVyQWN0aXZpdHkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29uY2VwdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCWdldEV4YW1wbGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5jbGVhcigpOwotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCWdldFdoaXRlcGFwZXIoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJCXNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQlzZXRJc09wdGlvbmFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCQlzZXRJc1BsYW5uZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQkJc2V0UHJlZml4KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCQlzZXRQcmVzZW50ZWRBZnRlcihQUkVTRU5URURfQUZURVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlzZXRQcmVzZW50ZWRCZWZvcmUoUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJCXNldFBsYW5uaW5nRGF0YShQTEFOTklOR19EQVRBX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXNldFN1cGVyQWN0aXZpdHkoU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJZ2V0V2hpdGVwYXBlcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQl1bnNldElzT3B0aW9uYWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJdW5zZXRJc1BsYW5uZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXJldHVybiBQUkVTRU5URURfQUZURVJfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRlZEFmdGVyICE9IG51bGwgOiAhUFJFU0VOVEVEX0FGVEVSX0VERUZBVUxULmVxdWFscyhwcmVzZW50ZWRBZnRlcik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQkJcmV0dXJuIFBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRlZEJlZm9yZSAhPSBudWxsIDogIVBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRlZEJlZm9yZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJcmV0dXJuIFBMQU5OSU5HX0RBVEFfRURFRkFVTFQgPT0gbnVsbCA/IHBsYW5uaW5nRGF0YSAhPSBudWxsIDogIVBMQU5OSU5HX0RBVEFfRURFRkFVTFQuZXF1YWxzKHBsYW5uaW5nRGF0YSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXJldHVybiBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCA9PSBudWxsID8gc3VwZXJBY3Rpdml0eSAhPSBudWxsIDogIVNVUEVSX0FDVElWSVRZX0VERUZBVUxULmVxdWFscyhzdXBlckFjdGl2aXR5KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiAhZ2V0Q2hlY2tsaXN0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOgotCQkJCXJldHVybiAhZ2V0Q29uY2VwdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlyZXR1cm4gIWdldEV4YW1wbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gIWdldEd1aWRlbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJcmV0dXJuICFnZXRSZXVzYWJsZUFzc2V0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiAhZ2V0V2hpdGVwYXBlcigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJCXJldHVybiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNPcHRpb25hbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXJldHVybiBpc1NldElzUGxhbm5lZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQkJcmV0dXJuIFBSRUZJWF9FREVGQVVMVCA9PSBudWxsID8gcHJlZml4ICE9IG51bGwgOiAhUFJFRklYX0VERUZBVUxULmVxdWFscyhwcmVmaXgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlc2VudGVkQWZ0ZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRlZEFmdGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50ZWRCZWZvcmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRlZEJlZm9yZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGxhbm5pbmdEYXRhOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwbGFubmluZ0RhdGEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1cGVyQWN0aXZpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1cGVyQWN0aXZpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAxKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOiAiKTsKLQkJaWYgKGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0KSByZXN1bHQuYXBwZW5kKGhhc011bHRpcGxlT2NjdXJyZW5jZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc09wdGlvbmFsOiAiKTsKLQkJaWYgKGlzT3B0aW9uYWxFU2V0KSByZXN1bHQuYXBwZW5kKGlzT3B0aW9uYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1BsYW5uZWQ6ICIpOwotCQlpZiAoaXNQbGFubmVkRVNldCkgcmVzdWx0LmFwcGVuZChpc1BsYW5uZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVmaXg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0JyZWFrZG93bkVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjYmU5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcGFiaWxpdHkgUGF0dGVybjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhcGFiaWxpdHlQYXR0ZXJuSW1wbCBleHRlbmRzIFByb2Nlc3NJbXBsIGltcGxlbWVudHMgQ2FwYWJpbGl0eVBhdHRlcm4gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXBhYmlsaXR5UGF0dGVybkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNBUEFCSUxJVFlfUEFUVEVSTjsKLQl9Ci0KLX0gLy9DYXBhYmlsaXR5UGF0dGVybkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjExNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDaGVja2xpc3RJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgQ2hlY2tsaXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hlY2tsaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0hFQ0tMSVNUOwotCX0KLQotfSAvL0NoZWNrbGlzdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5YTQ3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9zaXRlUm9sZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCNnZXRBZ2dyZWdhdGVkUm9sZSA8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUltcGwgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBDb21wb3NpdGVSb2xlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGVSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JPTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxSb2xlPiBnZXRBZ2dyZWdhdGVkUm9sZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEFnZ3JlZ2F0ZWRSb2xlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJcmV0dXJuIGdldEFnZ3JlZ2F0ZWRSb2xlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJZ2V0QWdncmVnYXRlZFJvbGUoKS5jbGVhcigpOwotCQkJCWdldEFnZ3JlZ2F0ZWRSb2xlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJZ2V0QWdncmVnYXRlZFJvbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJcmV0dXJuICFnZXRBZ2dyZWdhdGVkUm9sZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29tcG9zaXRlUm9sZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNjdlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb25jZXB0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENvbmNlcHQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25jZXB0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OQ0VQVDsKLQl9Ci0KLX0gLy9Db25jZXB0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQ1MjQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb25zdHJhaW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cmFpbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBDb25zdHJhaW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1haW5EZXNjcmlwdGlvbiA9IE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBtYWluRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdNYWluRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZE1haW5EZXNjcmlwdGlvbiA9IG1haW5EZXNjcmlwdGlvbjsKLQkJbWFpbkRlc2NyaXB0aW9uID0gbmV3TWFpbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT04sIG9sZE1haW5EZXNjcmlwdGlvbiwgbWFpbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldE1haW5EZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbihNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBtYWluRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhtYWluRGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFpbkRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYWluRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25zdHJhaW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwNmM2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9DQVRFR09SWTsKLQl9Ci0KLX0gLy9Db250ZW50Q2F0ZWdvcnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNGFmZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldENvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udGVudENhdGVnb3J5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRDYXRlZ29yeSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCWdldENvbnRlbnRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudENhdGVnb3J5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlnZXRDb250ZW50Q2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuICFnZXRDb250ZW50Q2F0ZWdvcnkoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjc4MDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldFNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYWluRGVzY3JpcHRpb24gPSBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXlDb25zaWRlcmF0aW9ucygpIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbigpIDxlbT5TZWN0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzZWN0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxJZCA9IEVYVEVSTkFMX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBtYWluRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdNYWluRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZE1haW5EZXNjcmlwdGlvbiA9IG1haW5EZXNjcmlwdGlvbjsKLQkJbWFpbkRlc2NyaXB0aW9uID0gbmV3TWFpbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04sIG9sZE1haW5EZXNjcmlwdGlvbiwgbWFpbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXlDb25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGtleUNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyBuZXdLZXlDb25zaWRlcmF0aW9ucykgewotCQlTdHJpbmcgb2xkS2V5Q29uc2lkZXJhdGlvbnMgPSBrZXlDb25zaWRlcmF0aW9uczsKLQkJa2V5Q29uc2lkZXJhdGlvbnMgPSBuZXdLZXlDb25zaWRlcmF0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMsIG9sZEtleUNvbnNpZGVyYXRpb25zLCBrZXlDb25zaWRlcmF0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTZWN0aW9uPiBnZXRTZWN0aW9uKCkgewotCQlpZiAoc2VjdGlvbiA9PSBudWxsKSB7Ci0JCQlzZWN0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNlY3Rpb24+KFNlY3Rpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTik7Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbElkKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyBuZXdFeHRlcm5hbElkKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbElkID0gZXh0ZXJuYWxJZDsKLQkJZXh0ZXJuYWxJZCA9IG5ld0V4dGVybmFsSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsIG9sZEV4dGVybmFsSWQsIGV4dGVybmFsSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY3Rpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBnZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJcmV0dXJuIGdldFNlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJc2V0TWFpbkRlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQkJc2V0S2V5Q29uc2lkZXJhdGlvbnMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJZ2V0U2VjdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlzZXRFeHRlcm5hbElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlzZXRLZXlDb25zaWRlcmF0aW9ucyhLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOgotCQkJCWdldFNlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlzZXRFeHRlcm5hbElkKEVYVEVSTkFMX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBtYWluRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhtYWluRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID09IG51bGwgPyBrZXlDb25zaWRlcmF0aW9ucyAhPSBudWxsIDogIUtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVC5lcXVhbHMoa2V5Q29uc2lkZXJhdGlvbnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJcmV0dXJuIHNlY3Rpb24gIT0gbnVsbCAmJiAhc2VjdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQkJcmV0dXJuIEVYVEVSTkFMX0lEX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbElkICE9IG51bGwgOiAhRVhURVJOQUxfSURfRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsSWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFpbkRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYWluRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGtleUNvbnNpZGVyYXRpb25zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXh0ZXJuYWxJZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnREZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjBiMjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudEVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmFyaWFiaWxpdHkgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRHdWlkZWxpbmUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0V2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlTdHJpbmcgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSwgIW9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQsIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlyZXR1cm4gZ2V0Q2hlY2tsaXN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOgotCQkJCXJldHVybiBnZXRDb25jZXB0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJcmV0dXJuIGdldEd1aWRlbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJcmV0dXJuIGdldFJldXNhYmxlQXNzZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlyZXR1cm4gZ2V0V2hpdGVwYXBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCWdldENoZWNrbGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlnZXRDb25jZXB0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCWdldEV4YW1wbGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlnZXRHdWlkZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEd1aWRlbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlnZXRFeGFtcGxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQl1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlyZXR1cm4gIWdldENoZWNrbGlzdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJcmV0dXJuICFnZXRDb25jZXB0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlyZXR1cm4gIWdldEV4YW1wbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJcmV0dXJuICFnZXRHdWlkZWxpbmUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlyZXR1cm4gIWdldFJldXNhYmxlQXNzZXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlyZXR1cm4gIWdldFdoaXRlcGFwZXIoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwgOiAhVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHModmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5VHlwZTogIik7Ci0JCWlmICh2YXJpYWJpbGl0eVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db250ZW50RWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50UGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDhhYmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudFBhY2thZ2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb250ZW50UGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb250ZW50RWxlbWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlnZXRDb250ZW50RWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudEVsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRFbGVtZW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlnZXRDb250ZW50RWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0Q29udGVudEVsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnRQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NzY3MzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDdXN0b21DYXRlZ29yeUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkN1c3RvbSBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsI2dldENhdGVnb3JpemVkRWxlbWVudCA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0U3ViQ2F0ZWdvcnkgPGVtPlN1YiBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBDdXN0b21DYXRlZ29yeSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDdXN0b21DYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENhdGVnb3JpemVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFN1YkNhdGVnb3J5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldFN1YkNhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQ6Ci0JCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWToKLQkJCQlnZXRTdWJDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViQ2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UOgotCQkJCWdldENhdGVnb3JpemVkRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZOgotCQkJCWdldFN1YkNhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZOgotCQkJCXJldHVybiAhZ2V0U3ViQ2F0ZWdvcnkoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0N1c3RvbUNhdGVnb3J5SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTNjYTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsRGVzY3JpcHRpb24gPSBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdpbmdHdWlkYW5jZSA9IFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyBuZXdFeHRlcm5hbERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbERlc2NyaXB0aW9uID0gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IG5ld0V4dGVybmFsRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OLCBvbGRFeHRlcm5hbERlc2NyaXB0aW9uLCBleHRlcm5hbERlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHBhY2thZ2luZ0d1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyBuZXdQYWNrYWdpbmdHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkUGFja2FnaW5nR3VpZGFuY2UgPSBwYWNrYWdpbmdHdWlkYW5jZTsKLQkJcGFja2FnaW5nR3VpZGFuY2UgPSBuZXdQYWNrYWdpbmdHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFLCBvbGRQYWNrYWdpbmdHdWlkYW5jZSwgcGFja2FnaW5nR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCQlyZXR1cm4gZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCQlzZXRFeHRlcm5hbERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXNldFBhY2thZ2luZ0d1aWRhbmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXNldEV4dGVybmFsRGVzY3JpcHRpb24oRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXNldFBhY2thZ2luZ0d1aWRhbmNlKFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSBudWxsIDogIUVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXJldHVybiBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHBhY2thZ2luZ0d1aWRhbmNlICE9IG51bGwgOiAhUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxULmVxdWFscyhwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHRlcm5hbERlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYWNrYWdpbmdHdWlkYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFja2FnaW5nR3VpZGFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyY2I0NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBEZWxpdmVyYWJsZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuIGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUOgotCQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUOgotCQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gIWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyYWJsZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZhYjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NhbGUgPSBTQ0FMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaXNrTGV2ZWwoKSA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSSVNLX0xFVkVMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmlza0xldmVsID0gUklTS19MRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVzdGltYXRpbmdUZWNobmlxdWUgPSBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU9mQ29udHJhY3QgPSBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjYWxlKCkgewotCQlyZXR1cm4gc2NhbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoU3RyaW5nIG5ld1NjYWxlKSB7Ci0JCVN0cmluZyBvbGRTY2FsZSA9IHNjYWxlOwotCQlzY2FsZSA9IG5ld1NjYWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFLCBvbGRTY2FsZSwgc2NhbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIG5ld1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gbmV3UHJvamVjdENoYXJhY3RlcmlzdGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUywgb2xkUHJvamVjdENoYXJhY3RlcmlzdGljcywgcHJvamVjdENoYXJhY3RlcmlzdGljcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Umlza0xldmVsKCkgewotCQlyZXR1cm4gcmlza0xldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpc2tMZXZlbChTdHJpbmcgbmV3Umlza0xldmVsKSB7Ci0JCVN0cmluZyBvbGRSaXNrTGV2ZWwgPSByaXNrTGV2ZWw7Ci0JCXJpc2tMZXZlbCA9IG5ld1Jpc2tMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMLCBvbGRSaXNrTGV2ZWwsIHJpc2tMZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIHsKLQkJcmV0dXJuIGVzdGltYXRpbmdUZWNobmlxdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcgbmV3RXN0aW1hdGluZ1RlY2huaXF1ZSkgewotCQlTdHJpbmcgb2xkRXN0aW1hdGluZ1RlY2huaXF1ZSA9IGVzdGltYXRpbmdUZWNobmlxdWU7Ci0JCWVzdGltYXRpbmdUZWNobmlxdWUgPSBuZXdFc3RpbWF0aW5nVGVjaG5pcXVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFLCBvbGRFc3RpbWF0aW5nVGVjaG5pcXVlLCBlc3RpbWF0aW5nVGVjaG5pcXVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgewotCQlyZXR1cm4gcHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFN0cmluZyBuZXdQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gcHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFLCBvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIHR5cGVPZkNvbnRyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVPZkNvbnRyYWN0KFN0cmluZyBuZXdUeXBlT2ZDb250cmFjdCkgewotCQlTdHJpbmcgb2xkVHlwZU9mQ29udHJhY3QgPSB0eXBlT2ZDb250cmFjdDsKLQkJdHlwZU9mQ29udHJhY3QgPSBuZXdUeXBlT2ZDb250cmFjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNULCBvbGRUeXBlT2ZDb250cmFjdCwgdHlwZU9mQ29udHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQkJcmV0dXJuIGdldFNjYWxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQkJcmV0dXJuIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXJldHVybiBnZXRSaXNrTGV2ZWwoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJcmV0dXJuIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlzZXRTY2FsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQkJc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCQlzZXRSaXNrTGV2ZWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXNldEVzdGltYXRpbmdUZWNobmlxdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJCXNldFR5cGVPZkNvbnRyYWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQkJc2V0U2NhbGUoU0NBTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCQlzZXRSaXNrTGV2ZWwoUklTS19MRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXNldEVzdGltYXRpbmdUZWNobmlxdWUoRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQkJc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJCXNldFR5cGVPZkNvbnRyYWN0KFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJCXJldHVybiBTQ0FMRV9FREVGQVVMVCA9PSBudWxsID8gc2NhbGUgIT0gbnVsbCA6ICFTQ0FMRV9FREVGQVVMVC5lcXVhbHMoc2NhbGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJCXJldHVybiBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdENoYXJhY3RlcmlzdGljcyAhPSBudWxsIDogIVBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxULmVxdWFscyhwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXJldHVybiBSSVNLX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyByaXNrTGV2ZWwgIT0gbnVsbCA6ICFSSVNLX0xFVkVMX0VERUZBVUxULmVxdWFscyhyaXNrTGV2ZWwpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXJldHVybiBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9PSBudWxsID8gZXN0aW1hdGluZ1RlY2huaXF1ZSAhPSBudWxsIDogIUVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxULmVxdWFscyhlc3RpbWF0aW5nVGVjaG5pcXVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQkJcmV0dXJuIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdE1lbWJlckV4cGVydGlzZSAhPSBudWxsIDogIVBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVC5lcXVhbHMocHJvamVjdE1lbWJlckV4cGVydGlzZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCQlyZXR1cm4gVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9PSBudWxsID8gdHlwZU9mQ29udHJhY3QgIT0gbnVsbCA6ICFUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxULmVxdWFscyh0eXBlT2ZDb250cmFjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzY2FsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NhbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJpc2tMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmlza0xldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlc3RpbWF0aW5nVGVjaG5pcXVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlc3RpbWF0aW5nVGVjaG5pcXVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlT2ZDb250cmFjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZU9mQ29udHJhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNWZmM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcnlQcm9jZXNzSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWwgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0ltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJ5UHJvY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXA0KCkgPGVtPkdyb3VwNDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwNDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDQoKSB7Ci0JCWlmIChncm91cDQgPT0gbnVsbCkgewotCQkJZ3JvdXA0ID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQNCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwNDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXA0KCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFZHVjYXRpb25NYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwNCgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0OgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwNCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXA0KCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwNCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCWdldEVkdWNhdGlvbk1hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJZ2V0R3JvdXA0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUw6Ci0JCQkJZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTDoKLQkJCQlnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0OgotCQkJCXJldHVybiBncm91cDQgIT0gbnVsbCAmJiAhZ3JvdXA0LmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlyZXR1cm4gIWdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwNCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzcwYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRGdWxmaWxsIDxlbT5GdWxmaWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVzY3JpYmFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb24gcHJlc2VudGF0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsZmlsbCgpIDxlbT5GdWxmaWxsPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bGZpbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGZ1bGZpbGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19BQlNUUkFDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3QgPSBJU19BQlNUUkFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgQWJzdHJhY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3RFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVpY29uKCkgPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vZGVpY29uID0gTk9ERUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcGVpY29uKCkgPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFQRUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcGVpY29uKCkgPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNoYXBlaWNvbiA9IFNIQVBFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmliYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBvbGRQcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JCXByZXNlbnRhdGlvbiA9IG5ld1ByZXNlbnRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG9sZFByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbikgewotCQlpZiAobmV3UHJlc2VudGF0aW9uICE9IHByZXNlbnRhdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZXNlbnRhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlc2VudGF0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlc2VudGF0aW9uKG5ld1ByZXNlbnRhdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwgbmV3UHJlc2VudGF0aW9uLCBuZXdQcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRGdWxmaWxsKCkgewotCQlpZiAoZnVsZmlsbCA9PSBudWxsKSB7Ci0JCQlmdWxmaWxsID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEwpOwotCQl9Ci0JCXJldHVybiBmdWxmaWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIGlzQWJzdHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNBYnN0cmFjdChib29sZWFuIG5ld0lzQWJzdHJhY3QpIHsKLQkJYm9vbGVhbiBvbGRJc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKLQkJaXNBYnN0cmFjdCA9IG5ld0lzQWJzdHJhY3Q7Ci0JCWJvb2xlYW4gb2xkSXNBYnN0cmFjdEVTZXQgPSBpc0Fic3RyYWN0RVNldDsKLQkJaXNBYnN0cmFjdEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNULCBvbGRJc0Fic3RyYWN0LCBpc0Fic3RyYWN0LCAhb2xkSXNBYnN0cmFjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzQWJzdHJhY3QoKSB7Ci0JCWJvb2xlYW4gb2xkSXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7Ci0JCWJvb2xlYW4gb2xkSXNBYnN0cmFjdEVTZXQgPSBpc0Fic3RyYWN0RVNldDsKLQkJaXNBYnN0cmFjdCA9IElTX0FCU1RSQUNUX0VERUZBVUxUOwotCQlpc0Fic3RyYWN0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QsIG9sZElzQWJzdHJhY3QsIElTX0FCU1RSQUNUX0VERUZBVUxULCBvbGRJc0Fic3RyYWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIGlzQWJzdHJhY3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZWljb24oKSB7Ci0JCXJldHVybiBub2RlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlaWNvbihTdHJpbmcgbmV3Tm9kZWljb24pIHsKLQkJU3RyaW5nIG9sZE5vZGVpY29uID0gbm9kZWljb247Ci0JCW5vZGVpY29uID0gbmV3Tm9kZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04sIG9sZE5vZGVpY29uLCBub2RlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGVpY29uKCkgewotCQlyZXR1cm4gc2hhcGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoYXBlaWNvbihTdHJpbmcgbmV3U2hhcGVpY29uKSB7Ci0JCVN0cmluZyBvbGRTaGFwZWljb24gPSBzaGFwZWljb247Ci0JCXNoYXBlaWNvbiA9IG5ld1NoYXBlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04sIG9sZFNoYXBlaWNvbiwgc2hhcGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVzZW50YXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw6Ci0JCQkJcmV0dXJuIGdldEZ1bGZpbGwoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gaXNJc0Fic3RyYWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJCXJldHVybiBnZXROb2RlaWNvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U2hhcGVpY29uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJCXNldFByZXNlbnRhdGlvbigoQ29udGVudERlc2NyaXB0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDoKLQkJCQlnZXRGdWxmaWxsKCkuY2xlYXIoKTsKLQkJCQlnZXRGdWxmaWxsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJc2V0SXNBYnN0cmFjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkJc2V0Tm9kZWljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlzZXRTaGFwZWljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJc2V0UHJlc2VudGF0aW9uKChDb250ZW50RGVzY3JpcHRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw6Ci0JCQkJZ2V0RnVsZmlsbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJCXVuc2V0SXNBYnN0cmFjdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCQlzZXROb2RlaWNvbihOT0RFSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlzZXRTaGFwZWljb24oU0hBUEVJQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJcmV0dXJuIHByZXNlbnRhdGlvbiAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw6Ci0JCQkJcmV0dXJuIGZ1bGZpbGwgIT0gbnVsbCAmJiAhZnVsZmlsbC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIGlzU2V0SXNBYnN0cmFjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJCXJldHVybiBOT0RFSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbm9kZWljb24gIT0gbnVsbCA6ICFOT0RFSUNPTl9FREVGQVVMVC5lcXVhbHMobm9kZWljb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlyZXR1cm4gU0hBUEVJQ09OX0VERUZBVUxUID09IG51bGwgPyBzaGFwZWljb24gIT0gbnVsbCA6ICFTSEFQRUlDT05fRURFRkFVTFQuZXF1YWxzKHNoYXBlaWNvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmdWxmaWxsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmdWxmaWxsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0Fic3RyYWN0OiAiKTsKLQkJaWYgKGlzQWJzdHJhY3RFU2V0KSByZXN1bHQuYXBwZW5kKGlzQWJzdHJhY3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub2RlaWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9kZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNoYXBlaWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2hhcGVpY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpYmFibGVFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1ZTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmluZWREZXNjcmlwdGlvbiA9IFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJlZmluZWREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIG5ld1JlZmluZWREZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkUmVmaW5lZERlc2NyaXB0aW9uID0gcmVmaW5lZERlc2NyaXB0aW9uOwotCQlyZWZpbmVkRGVzY3JpcHRpb24gPSBuZXdSZWZpbmVkRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwgb2xkUmVmaW5lZERlc2NyaXB0aW9uLCByZWZpbmVkRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJCXNldFJlZmluZWREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlZmluZWREZXNjcmlwdGlvbiAhPSBudWxsIDogIVJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWZpbmVkRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiNDcyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvckltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpIHsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgIW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOwotCQlpZiAoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkgcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpcHRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkODg1YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsI2dldERpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERpc2NpcGxpbmVHcm91cGluZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldERpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuIGdldERpc2NpcGxpbmUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FOgotCQkJCWdldERpc2NpcGxpbmUoKS5jbGVhcigpOwotCQkJCWdldERpc2NpcGxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJZ2V0RGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FOgotCQkJCXJldHVybiAhZ2V0RGlzY2lwbGluZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUdyb3VwaW5nSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMxNjg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEaXNjaXBsaW5lSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0U3ViRGlzY2lwbGluZSA8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0UmVmZXJlbmNlV29ya2Zsb3cgPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERpc2NpcGxpbmUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0VGFzaygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19UQVNLKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8RGlzY2lwbGluZT4gZ2V0U3ViRGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlV29ya2Zsb3coKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN1YkRpc2NpcGxpbmUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLOgotCQkJCXJldHVybiBnZXRUYXNrKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuIGdldFN1YkRpc2NpcGxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZVdvcmtmbG93KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTSzoKLQkJCQlnZXRUYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRUYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJZ2V0U3ViRGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViRGlzY2lwbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzY2lwbGluZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZVdvcmtmbG93KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlnZXRTdWJEaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XOgotCQkJCWdldFJlZmVyZW5jZVdvcmtmbG93KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJcmV0dXJuICFnZXRUYXNrKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCXJldHVybiAhZ2V0U3ViRGlzY2lwbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJcmV0dXJuICFnZXRSZWZlcmVuY2VXb3JrZmxvdygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjIxYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJvb3RJbXBsIGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRSb290IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhNTE5TUHJlZml4TWFwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwPFN0cmluZywgU3RyaW5nPiB4U0lTY2hlbWFMb2NhdGlvbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFJvb3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldE1peGVkKCkgewotCQlpZiAobWl4ZWQgPT0gbnVsbCkgewotCQkJbWl4ZWQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXA8U3RyaW5nLFN0cmluZz4oRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQl9Ci0JCXJldHVybiB4TUxOU1ByZWZpeE1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXA8U3RyaW5nLFN0cmluZz4oRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pZ2V0TWl4ZWQoKS5nZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG5ld01ldGhvZENvbmZpZ3VyYXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OLCBuZXdNZXRob2RDb25maWd1cmF0aW9uLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3TWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04sIG5ld01ldGhvZENvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiAoTWV0aG9kTGlicmFyeSlnZXRNaXhlZCgpLmdldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbmV3TWV0aG9kTGlicmFyeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlksIG5ld01ldGhvZExpYnJhcnksIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBuZXdNZXRob2RMaWJyYXJ5KSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSwgbmV3TWV0aG9kTGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoTWV0aG9kUGx1Z2luKWdldE1peGVkKCkuZ2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBuZXdNZXRob2RQbHVnaW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4sIG5ld01ldGhvZFBsdWdpbiwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBuZXdNZXRob2RQbHVnaW4pIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4sIG5ld01ldGhvZFBsdWdpbik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRYTUxOU1ByZWZpeE1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRNZXRob2RDb25maWd1cmF0aW9uKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZExpYnJhcnkobnVsbCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRNZXRob2RQbHVnaW4obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRNaXhlZCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQkJCQllbHNlIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpLm1hcCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpLm1hcCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlzZXRNZXRob2RMaWJyYXJ5KChNZXRob2RMaWJyYXJ5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTjoKLQkJCQlzZXRNZXRob2RQbHVnaW4oKE1ldGhvZFBsdWdpbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJc2V0TWV0aG9kTGlicmFyeSgoTWV0aG9kTGlicmFyeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTjoKLQkJCQlzZXRNZXRob2RQbHVnaW4oKE1ldGhvZFBsdWdpbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICF4U0lTY2hlbWFMb2NhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW4oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9jdW1lbnRSb290SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjZjY1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb21haW5JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9tYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0U3ViZG9tYWluIDxlbT5TdWJkb21haW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERvbWFpbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1dPUktfUFJPRFVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PERvbWFpbj4gZ2V0U3ViZG9tYWluKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fU1VCRE9NQUlOKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3ViZG9tYWluKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlyZXR1cm4gZ2V0U3ViZG9tYWluKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVDoKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlnZXRTdWJkb21haW4oKS5jbGVhcigpOwotCQkJCWdldFN1YmRvbWFpbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRG9tYWluPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVDoKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCWdldFN1YmRvbWFpbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiAhZ2V0V29ya1Byb2R1Y3QoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJcmV0dXJuICFnZXRTdWJkb21haW4oKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RvbWFpbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzOGIzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbXBsIGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMgRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FTEVNRU5UOwotCX0KLQotfSAvL0VsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyZWI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbCNnZXRFc3RpbWF0aW9uTWV0cmljIDxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXN0aW1hdGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbk1ldHJpYygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW9uTWV0cmljKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCWdldEVzdGltYXRpb25NZXRyaWMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQzoKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRpb25NZXRyaWMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VzdGltYXRlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW5nTWV0cmljSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTdjYWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGluZyBNZXRyaWM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0aW5nTWV0cmljSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEVzdGltYXRpbmdNZXRyaWMgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0aW5nTWV0cmljSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVNUSU1BVElOR19NRVRSSUM7Ci0JfQotCi19IC8vRXN0aW1hdGluZ01ldHJpY0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzhlMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0JfQotCi19IC8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjlmNTBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4YW1wbGVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXhhbXBsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4YW1wbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FWEFNUExFOwotCX0KLQotfSAvL0V4YW1wbGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NWQ2NzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBHdWlkYW5jZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudCgpIDxlbT5BdHRhY2htZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dGFjaG1lbnQoKSA8ZW0+QXR0YWNobWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0YWNobWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRhY2htZW50ID0gQVRUQUNITUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREFOQ0VfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRhY2htZW50KCkgewotCQlyZXR1cm4gYXR0YWNobWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRhY2htZW50KFN0cmluZyBuZXdBdHRhY2htZW50KSB7Ci0JCVN0cmluZyBvbGRBdHRhY2htZW50ID0gYXR0YWNobWVudDsKLQkJYXR0YWNobWVudCA9IG5ld0F0dGFjaG1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQsIG9sZEF0dGFjaG1lbnQsIGF0dGFjaG1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJcmV0dXJuIGdldEF0dGFjaG1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UOgotCQkJCXNldEF0dGFjaG1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVDoKLQkJCQlzZXRBdHRhY2htZW50KEFUVEFDSE1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UOgotCQkJCXJldHVybiBBVFRBQ0hNRU5UX0VERUZBVUxUID09IG51bGwgPyBhdHRhY2htZW50ICE9IG51bGwgOiAhQVRUQUNITUVOVF9FREVGQVVMVC5lcXVhbHMoYXR0YWNobWVudCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRhY2htZW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRhY2htZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQ0ODM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkYW5jZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREFOQ0U7Ci0JfQotCi19IC8vR3VpZGFuY2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTMwOWMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRlbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGVsaW5lSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGVsaW5lSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEd1aWRlbGluZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQl9Ci0KLX0gLy9HdWlkZWxpbmVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmY5ZGRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0l0ZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSXRlcmF0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SXRlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSXRlcmF0aW9uSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzIEl0ZXJhdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLklURVJBVElPTjsKLQl9Ci0KLX0gLy9JdGVyYXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvS2luZEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0tpbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MTgyMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvS2luZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEtpbmRJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+S2luZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5LaW5kSW1wbCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBLaW5kSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEtpbmQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBLaW5kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuS0lORDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJaWYgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID09IG51bGwpIHsKLQkJCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJfQotCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJCXJldHVybiBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuY2xlYXIoKTsKLQkJCQlnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCQlnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvICE9IG51bGwgJiYgIWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0tpbmRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjODg2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldEJhc2VDb25maWd1cmF0aW9uIDxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRQcm9jZXNzVmlldyA8ZW0+UHJvY2VzcyBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlQ29uZmlndXJhdGlvbigpIDxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGJhc2VDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmlldygpIDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZJRVdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZpZXcoKSA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmlldyA9IERFRkFVTFRfVklFV19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NWaWV3KCkgPGVtPlByb2Nlc3MgVmlldzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzVmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gcHJvY2Vzc1ZpZXc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHN1YnRyYWN0ZWRDYXRlZ29yeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGVkQ2F0ZWdvcnkoKSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkZWRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gYWRkZWRDYXRlZ29yeTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChiYXNlQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQliYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGx1Z2luU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpblNlbGVjdGlvbiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWaWV3KCkgewotCQlyZXR1cm4gZGVmYXVsdFZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZpZXcoU3RyaW5nIG5ld0RlZmF1bHRWaWV3KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VmlldyA9IGRlZmF1bHRWaWV3OwotCQlkZWZhdWx0VmlldyA9IG5ld0RlZmF1bHRWaWV3OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsIG9sZERlZmF1bHRWaWV3LCBkZWZhdWx0VmlldykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFByb2Nlc3NWaWV3KCkgewotCQlpZiAocHJvY2Vzc1ZpZXcgPT0gbnVsbCkgewotCQkJcHJvY2Vzc1ZpZXcgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NWaWV3OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJaWYgKHN1YnRyYWN0ZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlzdWJ0cmFjdGVkQ2F0ZWdvcnkgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBzdWJ0cmFjdGVkQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QWRkZWRDYXRlZ29yeSgpIHsKLQkJaWYgKGFkZGVkQ2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJYWRkZWRDYXRlZ29yeSA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBhZGRlZENhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRCYXNlQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWaWV3KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlyZXR1cm4gZ2V0UHJvY2Vzc1ZpZXcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRBZGRlZENhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRCYXNlQ29uZmlndXJhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXNldERlZmF1bHRWaWV3KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXOgotCQkJCWdldFByb2Nlc3NWaWV3KCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9jZXNzVmlldygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRCYXNlQ29uZmlndXJhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXNldERlZmF1bHRWaWV3KERFRkFVTFRfVklFV19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVc6Ci0JCQkJZ2V0UHJvY2Vzc1ZpZXcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiAhYmFzZUNvbmZpZ3VyYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uICE9IG51bGwgJiYgIW1ldGhvZFBsdWdpblNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbiAhPSBudWxsICYmICFtZXRob2RQYWNrYWdlU2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXJldHVybiBERUZBVUxUX1ZJRVdfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWaWV3ICE9IG51bGwgOiAhREVGQVVMVF9WSUVXX0VERUZBVUxULmVxdWFscyhkZWZhdWx0Vmlldyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlyZXR1cm4gcHJvY2Vzc1ZpZXcgIT0gbnVsbCAmJiAhcHJvY2Vzc1ZpZXcuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJCXJldHVybiBzdWJ0cmFjdGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhc3VidHJhY3RlZENhdGVnb3J5LmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhYWRkZWRDYXRlZ29yeS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChiYXNlQ29uZmlndXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFzZUNvbmZpZ3VyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZFBsdWdpblNlbGVjdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWV0aG9kUGx1Z2luU2VsZWN0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXRob2RQYWNrYWdlU2VsZWN0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VmlldzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdFZpZXcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2Nlc3NWaWV3OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9jZXNzVmlldyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VidHJhY3RlZENhdGVnb3J5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdWJ0cmFjdGVkQ2F0ZWdvcnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFkZGVkQ2F0ZWdvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFkZGVkQ2F0ZWdvcnkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RDb25maWd1cmF0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTBkNDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE93bmVkUnVsZSA8ZW0+T3duZWQgUnVsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlcmluZ0d1aWRlKCkgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlcmluZ0d1aWRlKCkgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9yZGVyaW5nR3VpZGUgPSBPUkRFUklOR19HVUlERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1VQUFJFU1NFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdXBwcmVzc2VkKCkgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3NlZCA9IFNVUFBSRVNTRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFN1cHByZXNzZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1cHByZXNzZWRFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxDb25zdHJhaW50PiBnZXRPd25lZFJ1bGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmllZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIG5ld0JyaWVmRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZEJyaWVmRGVzY3JpcHRpb24gPSBicmllZkRlc2NyaXB0aW9uOwotCQlicmllZkRlc2NyaXB0aW9uID0gbmV3QnJpZWZEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04sIG9sZEJyaWVmRGVzY3JpcHRpb24sIGJyaWVmRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gb3JkZXJpbmdHdWlkZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyBuZXdPcmRlcmluZ0d1aWRlKSB7Ci0JCVN0cmluZyBvbGRPcmRlcmluZ0d1aWRlID0gb3JkZXJpbmdHdWlkZTsKLQkJb3JkZXJpbmdHdWlkZSA9IG5ld09yZGVyaW5nR3VpZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLCBvbGRPcmRlcmluZ0d1aWRlLCBvcmRlcmluZ0d1aWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuZXdQcmVzZW50YXRpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRQcmVzZW50YXRpb25OYW1lID0gcHJlc2VudGF0aW9uTmFtZTsKLQkJcHJlc2VudGF0aW9uTmFtZSA9IG5ld1ByZXNlbnRhdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FLCBvbGRQcmVzZW50YXRpb25OYW1lLCBwcmVzZW50YXRpb25OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2VkKGJvb2xlYW4gbmV3U3VwcHJlc3NlZCkgewotCQlib29sZWFuIG9sZFN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwotCQlzdXBwcmVzc2VkID0gbmV3U3VwcHJlc3NlZDsKLQkJYm9vbGVhbiBvbGRTdXBwcmVzc2VkRVNldCA9IHN1cHByZXNzZWRFU2V0OwotCQlzdXBwcmVzc2VkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQsIG9sZFN1cHByZXNzZWQsIHN1cHByZXNzZWQsICFvbGRTdXBwcmVzc2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U3VwcHJlc3NlZCgpIHsKLQkJYm9vbGVhbiBvbGRTdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKLQkJYm9vbGVhbiBvbGRTdXBwcmVzc2VkRVNldCA9IHN1cHByZXNzZWRFU2V0OwotCQlzdXBwcmVzc2VkID0gU1VQUFJFU1NFRF9FREVGQVVMVDsKLQkJc3VwcHJlc3NlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCBvbGRTdXBwcmVzc2VkLCBTVVBQUkVTU0VEX0VERUZBVUxULCBvbGRTdXBwcmVzc2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3VwcHJlc3NlZCgpIHsKLQkJcmV0dXJuIHN1cHByZXNzZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPd25lZFJ1bGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gZ2V0T3duZWRSdWxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXJldHVybiBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJcmV0dXJuIGlzU3VwcHJlc3NlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCWdldE93bmVkUnVsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3duZWRSdWxlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25zdHJhaW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCQlzZXRCcmllZkRlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCQlzZXRPcmRlcmluZ0d1aWRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJc2V0UHJlc2VudGF0aW9uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJc2V0U3VwcHJlc3NlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCWdldE93bmVkUnVsZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCQlzZXRPcmRlcmluZ0d1aWRlKE9SREVSSU5HX0dVSURFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXNldFByZXNlbnRhdGlvbk5hbWUoUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQl1bnNldFN1cHByZXNzZWQoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gIWdldE93bmVkUnVsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuICFnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZEZXNjcmlwdGlvbiAhPSBudWxsIDogIUJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhicmllZkRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXJldHVybiBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9PSBudWxsID8gb3JkZXJpbmdHdWlkZSAhPSBudWxsIDogIU9SREVSSU5HX0dVSURFX0VERUZBVUxULmVxdWFscyhvcmRlcmluZ0d1aWRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcmVzZW50YXRpb25OYW1lICE9IG51bGwgOiAhUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRhdGlvbk5hbWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXJldHVybiBpc1NldFN1cHByZXNzZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYnJpZWZEZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYnJpZWZEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlcmluZ0d1aWRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmRlcmluZ0d1aWRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50YXRpb25OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVzZW50YXRpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdXBwcmVzc2VkOiAiKTsKLQkJaWYgKHN1cHByZXNzZWRFU2V0KSByZXN1bHQuYXBwZW5kKHN1cHByZXNzZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTQwZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXRob2RFbGVtZW50UHJvcGVydHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTViOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZExpYnJhcnlJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCNnZXRUb29sIDxlbT5Ub29sPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZExpYnJhcnkgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBsdWdpbigpIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kUGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sKCkgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbCgpIDxlbT5Ub29sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvb2wgPSBUT09MX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCWlmIChtZXRob2RQbHVnaW4gPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1ldGhvZFBsdWdpbj4oTWV0aG9kUGx1Z2luLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2woKSB7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2woU3RyaW5nIG5ld1Rvb2wpIHsKLQkJU3RyaW5nIG9sZFRvb2wgPSB0b29sOwotCQl0b29sID0gbmV3VG9vbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTCwgb2xkVG9vbCwgdG9vbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZFBsdWdpbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJcmV0dXJuIGdldFRvb2woKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBsdWdpbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGx1Z2luPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MOgotCQkJCXNldFRvb2woKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MOgotCQkJCXNldFRvb2woVE9PTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIG1ldGhvZFBsdWdpbiAhPSBudWxsICYmICFtZXRob2RQbHVnaW4uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbiAhPSBudWxsICYmICFtZXRob2RDb25maWd1cmF0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTDoKLQkJCQlyZXR1cm4gVE9PTF9FREVGQVVMVCA9PSBudWxsID8gdG9vbCAhPSBudWxsIDogIVRPT0xfRURFRkFVTFQuZXF1YWxzKHRvb2wpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodG9vbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG9vbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZExpYnJhcnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZTE5ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBhY2thZ2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdMT0JBTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2xvYmFsID0gR0xPQkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBHbG9iYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdsb2JhbEVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXVzZWRQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHbG9iYWwoYm9vbGVhbiBuZXdHbG9iYWwpIHsKLQkJYm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWdsb2JhbCA9IG5ld0dsb2JhbDsKLQkJYm9vbGVhbiBvbGRHbG9iYWxFU2V0ID0gZ2xvYmFsRVNldDsKLQkJZ2xvYmFsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCwgb2xkR2xvYmFsLCBnbG9iYWwsICFvbGRHbG9iYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRHbG9iYWwoKSB7Ci0JCWJvb2xlYW4gb2xkR2xvYmFsID0gZ2xvYmFsOwotCQlib29sZWFuIG9sZEdsb2JhbEVTZXQgPSBnbG9iYWxFU2V0OwotCQlnbG9iYWwgPSBHTE9CQUxfRURFRkFVTFQ7Ci0JCWdsb2JhbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUwsIG9sZEdsb2JhbCwgR0xPQkFMX0VERUZBVUxULCBvbGRHbG9iYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRHbG9iYWwoKSB7Ci0JCXJldHVybiBnbG9iYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXRob2RQYWNrYWdlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0UmV1c2VkUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJcmV0dXJuIGlzR2xvYmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U6Ci0JCQkJZ2V0UmV1c2VkUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmV1c2VkUGFja2FnZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQYWNrYWdlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJc2V0R2xvYmFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U6Ci0JCQkJZ2V0UmV1c2VkUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCQl1bnNldEdsb2JhbCgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlyZXR1cm4gIWdldFJldXNlZFBhY2thZ2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiAhZ2V0TWV0aG9kUGFja2FnZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJCXJldHVybiBpc1NldEdsb2JhbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdsb2JhbDogIik7Ci0JCWlmIChnbG9iYWxFU2V0KSByZXN1bHQuYXBwZW5kKGdsb2JhbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyM2I1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RQbHVnaW5JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4gPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldE1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkgPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiByZWZlcmVuY2VkTWV0aG9kUGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFja2FnZSgpIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGFja2FnZT4gbWV0aG9kUGFja2FnZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VyQ2hhbmdlYWJsZSgpIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzZXJDaGFuZ2VhYmxlID0gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBVc2VyIENoYW5nZWFibGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzZXJDaGFuZ2VhYmxlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQbHVnaW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSB7Ci0JCWlmIChyZWZlcmVuY2VkTWV0aG9kUGx1Z2luID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZWRNZXRob2RQbHVnaW4gPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZE1ldGhvZFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZXRob2RQYWNrYWdlPihNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gdXNlckNoYW5nZWFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbiBuZXdVc2VyQ2hhbmdlYWJsZSkgewotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlID0gdXNlckNoYW5nZWFibGU7Ci0JCXVzZXJDaGFuZ2VhYmxlID0gbmV3VXNlckNoYW5nZWFibGU7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGVFU2V0ID0gdXNlckNoYW5nZWFibGVFU2V0OwotCQl1c2VyQ2hhbmdlYWJsZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSwgb2xkVXNlckNoYW5nZWFibGUsIHVzZXJDaGFuZ2VhYmxlLCAhb2xkVXNlckNoYW5nZWFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRVc2VyQ2hhbmdlYWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRVc2VyQ2hhbmdlYWJsZSA9IHVzZXJDaGFuZ2VhYmxlOwotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlRVNldCA9IHVzZXJDaGFuZ2VhYmxlRVNldDsKLQkJdXNlckNoYW5nZWFibGUgPSBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQ7Ci0JCXVzZXJDaGFuZ2VhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLCBvbGRVc2VyQ2hhbmdlYWJsZSwgVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxULCBvbGRVc2VyQ2hhbmdlYWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gdXNlckNoYW5nZWFibGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZFBhY2thZ2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQkJcmV0dXJuIGlzVXNlckNoYW5nZWFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCWdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQYWNrYWdlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlzZXRVc2VyQ2hhbmdlYWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQl1bnNldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiByZWZlcmVuY2VkTWV0aG9kUGx1Z2luICE9IG51bGwgJiYgIXJlZmVyZW5jZWRNZXRob2RQbHVnaW4uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiBtZXRob2RQYWNrYWdlICE9IG51bGwgJiYgIW1ldGhvZFBhY2thZ2UuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gaXNTZXRVc2VyQ2hhbmdlYWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVmZXJlbmNlZE1ldGhvZFBsdWdpbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmZXJlbmNlZE1ldGhvZFBsdWdpbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNlckNoYW5nZWFibGU6ICIpOwotCQlpZiAodXNlckNoYW5nZWFibGVFU2V0KSByZXN1bHQuYXBwZW5kKHVzZXJDaGFuZ2VhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBsdWdpbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kVW5pdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzNWY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kVW5pdEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVW5pdEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHQoKSA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlSSUdIVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHQoKSA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29weXJpZ2h0ID0gQ09QWVJJR0hUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYTUxHcmVnb3JpYW5DYWxlbmRhciBDSEFOR0VfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgY2hhbmdlRGF0ZSA9IENIQU5HRV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNoYW5nZURlc2NyaXB0aW9uID0gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kVW5pdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0KCkgewotCQlyZXR1cm4gY29weXJpZ2h0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChTdHJpbmcgbmV3Q29weXJpZ2h0KSB7Ci0JCVN0cmluZyBvbGRDb3B5cmlnaHQgPSBjb3B5cmlnaHQ7Ci0JCWNvcHlyaWdodCA9IG5ld0NvcHlyaWdodDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hULCBvbGRDb3B5cmlnaHQsIGNvcHlyaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgbmV3QXV0aG9ycykgewotCQlTdHJpbmcgb2xkQXV0aG9ycyA9IGF1dGhvcnM7Ci0JCWF1dGhvcnMgPSBuZXdBdXRob3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTLCBvbGRBdXRob3JzLCBhdXRob3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3Q2hhbmdlRGF0ZSkgewotCQlYTUxHcmVnb3JpYW5DYWxlbmRhciBvbGRDaGFuZ2VEYXRlID0gY2hhbmdlRGF0ZTsKLQkJY2hhbmdlRGF0ZSA9IG5ld0NoYW5nZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFLCBvbGRDaGFuZ2VEYXRlLCBjaGFuZ2VEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyBuZXdDaGFuZ2VEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQ2hhbmdlRGVzY3JpcHRpb24gPSBjaGFuZ2VEZXNjcmlwdGlvbjsKLQkJY2hhbmdlRGVzY3JpcHRpb24gPSBuZXdDaGFuZ2VEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLCBvbGRDaGFuZ2VEZXNjcmlwdGlvbiwgY2hhbmdlRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXJldHVybiBnZXRDb3B5cmlnaHQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gZ2V0QXV0aG9ycygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlRGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFQ6Ci0JCQkJc2V0Q29weXJpZ2h0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZSgoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoQ09QWVJJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJc2V0QXV0aG9ycyhBVVRIT1JTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJCXNldENoYW5nZURhdGUoQ0hBTkdFX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlyZXR1cm4gQ09QWVJJR0hUX0VERUZBVUxUID09IG51bGwgPyBjb3B5cmlnaHQgIT0gbnVsbCA6ICFDT1BZUklHSFRfRURFRkFVTFQuZXF1YWxzKGNvcHlyaWdodCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIEFVVEhPUlNfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcnMgIT0gbnVsbCA6ICFBVVRIT1JTX0VERUZBVUxULmVxdWFscyhhdXRob3JzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIENIQU5HRV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEYXRlICE9IG51bGwgOiAhQ0hBTkdFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNoYW5nZURhdGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29weXJpZ2h0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3B5cmlnaHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhvcnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFVuaXRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU3ZmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01pbGVzdG9uZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1pbGVzdG9uZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbCNnZXRSZXF1aXJlZFJlc3VsdCA8ZW0+UmVxdWlyZWQgUmVzdWx0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lSW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1pbGVzdG9uZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVxdWlyZWRSZXN1bHQoKSA8ZW0+UmVxdWlyZWQgUmVzdWx0PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcXVpcmVkUmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiByZXF1aXJlZFJlc3VsdDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNaWxlc3RvbmVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NSUxFU1RPTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmVxdWlyZWRSZXN1bHQoKSB7Ci0JCWlmIChyZXF1aXJlZFJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXF1aXJlZFJlc3VsdCA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVCk7Ci0JCX0KLQkJcmV0dXJuIHJlcXVpcmVkUmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVDoKLQkJCQlyZXR1cm4gZ2V0UmVxdWlyZWRSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVDoKLQkJCQlnZXRSZXF1aXJlZFJlc3VsdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVxdWlyZWRSZXN1bHQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQ6Ci0JCQkJZ2V0UmVxdWlyZWRSZXN1bHQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUOgotCQkJCXJldHVybiByZXF1aXJlZFJlc3VsdCAhPSBudWxsICYmICFyZXF1aXJlZFJlc3VsdC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZXF1aXJlZFJlc3VsdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVxdWlyZWRSZXN1bHQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NaWxlc3RvbmVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY3OTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL05hbWVkRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE5hbWVkRWxlbWVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkRWxlbWVudEltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE5hbWVkRWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTmFtZWRFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZhNGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGNvbWVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgT3V0Y29tZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGNvbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5PVVRDT01FOwotCX0KLQotfSAvL091dGNvbWVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQ3YjdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZWFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBOYW1lZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZWFibGVFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEFDS0FHRUFCTEVfRUxFTUVOVDsKLQl9Ci0KLX0gLy9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGhhc2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhYTc5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGhhc2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgUGhhc2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFOwotCX0KLQotfSAvL1BoYXNlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmODU4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQbGFubmluZ0RhdGFJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldFJhbmsgPGVtPlJhbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGFubmluZ0RhdGFJbXBsIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJbXBsIGltcGxlbWVudHMgUGxhbm5pbmdEYXRhIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYTUxHcmVnb3JpYW5DYWxlbmRhciBGSU5JU0hfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZmluaXNoRGF0ZSA9IEZJTklTSF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmsoKSA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmFuayA9IFJBTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYTUxHcmVnb3JpYW5DYWxlbmRhciBTVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBzdGFydERhdGUgPSBTVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldEZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiBmaW5pc2hEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3RmluaXNoRGF0ZSkgewotCQlYTUxHcmVnb3JpYW5DYWxlbmRhciBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsIGZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJhbmsoKSB7Ci0JCXJldHVybiByYW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmsoU3RyaW5nIG5ld1JhbmspIHsKLQkJU3RyaW5nIG9sZFJhbmsgPSByYW5rOwotCQlyYW5rID0gbmV3UmFuazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LLCBvbGRSYW5rLCByYW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldFN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXJ0RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3U3RhcnREYXRlKSB7Ci0JCVhNTEdyZWdvcmlhbkNhbGVuZGFyIG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwgc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXJldHVybiBnZXRGaW5pc2hEYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCQlyZXR1cm4gZ2V0UmFuaygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0RGF0ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZSgoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXNldFJhbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJc2V0U3RhcnREYXRlKChYTUxHcmVnb3JpYW5DYWxlbmRhciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCQlzZXRGaW5pc2hEYXRlKEZJTklTSF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCQlzZXRSYW5rKFJBTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZShTVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCQlyZXR1cm4gRklOSVNIX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaERhdGUgIT0gbnVsbCA6ICFGSU5JU0hfREFURV9FREVGQVVMVC5lcXVhbHMoZmluaXNoRGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCQlyZXR1cm4gUkFOS19FREVGQVVMVCA9PSBudWxsID8gcmFuayAhPSBudWxsIDogIVJBTktfRURFRkFVTFQuZXF1YWxzKHJhbmspOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsIDogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaW5pc2hEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2hEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByYW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyYW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BsYW5uaW5nRGF0YUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYjY1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBQcmFjdGljZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURESVRJT05BTF9JTkZPX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxJbmZvKCkgPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBBRERJVElPTkFMX0lORk9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXBwbGljYXRpb24oKSA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXBwbGljYXRpb24gPSBBUFBMSUNBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kKCkgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFja2dyb3VuZCgpIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhY2tncm91bmQgPSBCQUNLR1JPVU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09BTFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R29hbHMoKSA8ZW0+R29hbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdvYWxzID0gR09BTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsZXZlbHNPZkFkb3B0aW9uID0gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9ibGVtKCkgPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvYmxlbSA9IFBST0JMRU1fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgbmV3QWRkaXRpb25hbEluZm8pIHsKLQkJU3RyaW5nIG9sZEFkZGl0aW9uYWxJbmZvID0gYWRkaXRpb25hbEluZm87Ci0JCWFkZGl0aW9uYWxJbmZvID0gbmV3QWRkaXRpb25hbEluZm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywgb2xkQWRkaXRpb25hbEluZm8sIGFkZGl0aW9uYWxJbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyBuZXdBcHBsaWNhdGlvbikgewotCQlTdHJpbmcgb2xkQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKLQkJYXBwbGljYXRpb24gPSBuZXdBcHBsaWNhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04sIG9sZEFwcGxpY2F0aW9uLCBhcHBsaWNhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGJhY2tncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChTdHJpbmcgbmV3QmFja2dyb3VuZCkgewotCQlTdHJpbmcgb2xkQmFja2dyb3VuZCA9IGJhY2tncm91bmQ7Ci0JCWJhY2tncm91bmQgPSBuZXdCYWNrZ3JvdW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5ELCBvbGRCYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHb2FscygpIHsKLQkJcmV0dXJuIGdvYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdvYWxzKFN0cmluZyBuZXdHb2FscykgewotCQlTdHJpbmcgb2xkR29hbHMgPSBnb2FsczsKLQkJZ29hbHMgPSBuZXdHb2FsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMsIG9sZEdvYWxzLCBnb2FscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpIHsKLQkJcmV0dXJuIGxldmVsc09mQWRvcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcgbmV3TGV2ZWxzT2ZBZG9wdGlvbikgewotCQlTdHJpbmcgb2xkTGV2ZWxzT2ZBZG9wdGlvbiA9IGxldmVsc09mQWRvcHRpb247Ci0JCWxldmVsc09mQWRvcHRpb24gPSBuZXdMZXZlbHNPZkFkb3B0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04sIG9sZExldmVsc09mQWRvcHRpb24sIGxldmVsc09mQWRvcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2JsZW0oKSB7Ci0JCXJldHVybiBwcm9ibGVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW0oU3RyaW5nIG5ld1Byb2JsZW0pIHsKLQkJU3RyaW5nIG9sZFByb2JsZW0gPSBwcm9ibGVtOwotCQlwcm9ibGVtID0gbmV3UHJvYmxlbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSwgb2xkUHJvYmxlbSwgcHJvYmxlbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJCXJldHVybiBnZXRBZGRpdGlvbmFsSW5mbygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlyZXR1cm4gZ2V0QmFja2dyb3VuZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCQlyZXR1cm4gZ2V0R29hbHMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJCXJldHVybiBnZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQkJcmV0dXJuIGdldFByb2JsZW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJc2V0QWRkaXRpb25hbEluZm8oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQkJc2V0QmFja2dyb3VuZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXNldEdvYWxzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJCXNldExldmVsc09mQWRvcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXNldFByb2JsZW0oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJCXNldEFkZGl0aW9uYWxJbmZvKEFERElUSU9OQUxfSU5GT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbihBUFBMSUNBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJCXNldEJhY2tncm91bmQoQkFDS0dST1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCQlzZXRHb2FscyhHT0FMU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJc2V0TGV2ZWxzT2ZBZG9wdGlvbihMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCQlzZXRQcm9ibGVtKFBST0JMRU1fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJcmV0dXJuIEFERElUSU9OQUxfSU5GT19FREVGQVVMVCA9PSBudWxsID8gYWRkaXRpb25hbEluZm8gIT0gbnVsbCA6ICFBRERJVElPTkFMX0lORk9fRURFRkFVTFQuZXF1YWxzKGFkZGl0aW9uYWxJbmZvKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIEFQUExJQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBhcHBsaWNhdGlvbiAhPSBudWxsIDogIUFQUExJQ0FUSU9OX0VERUZBVUxULmVxdWFscyhhcHBsaWNhdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQkJcmV0dXJuIEJBQ0tHUk9VTkRfRURFRkFVTFQgPT0gbnVsbCA/IGJhY2tncm91bmQgIT0gbnVsbCA6ICFCQUNLR1JPVU5EX0VERUZBVUxULmVxdWFscyhiYWNrZ3JvdW5kKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQkJcmV0dXJuIEdPQUxTX0VERUZBVUxUID09IG51bGwgPyBnb2FscyAhPSBudWxsIDogIUdPQUxTX0VERUZBVUxULmVxdWFscyhnb2Fscyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCQlyZXR1cm4gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID09IG51bGwgPyBsZXZlbHNPZkFkb3B0aW9uICE9IG51bGwgOiAhTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxULmVxdWFscyhsZXZlbHNPZkFkb3B0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCQlyZXR1cm4gUFJPQkxFTV9FREVGQVVMVCA9PSBudWxsID8gcHJvYmxlbSAhPSBudWxsIDogIVBST0JMRU1fRURFRkFVTFQuZXF1YWxzKHByb2JsZW0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWRkaXRpb25hbEluZm86ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFkZGl0aW9uYWxJbmZvKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhcHBsaWNhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXBwbGljYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJhY2tncm91bmQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJhY2tncm91bmQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdvYWxzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChnb2Fscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxzT2ZBZG9wdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWxzT2ZBZG9wdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvYmxlbTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvYmxlbSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkYmFkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByYWN0aWNlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRBY3Rpdml0eVJlZmVyZW5jZSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRDb250ZW50UmVmZXJlbmNlIDxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0U3ViUHJhY3RpY2UgPGVtPlN1YiBQcmFjdGljZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFByYWN0aWNlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEFjdGl2aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENvbnRlbnRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8UHJhY3RpY2U+IGdldFN1YlByYWN0aWNlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3ViUHJhY3RpY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRSZWZlcmVuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCXJldHVybiBnZXRTdWJQcmFjdGljZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFOgotCQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRBY3Rpdml0eVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlnZXRDb250ZW50UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlnZXRTdWJQcmFjdGljZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViUHJhY3RpY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFByYWN0aWNlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJZ2V0Q29udGVudFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJZ2V0U3ViUHJhY3RpY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuICFnZXRBY3Rpdml0eVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuICFnZXRDb250ZW50UmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJcmV0dXJuICFnZXRTdWJQcmFjdGljZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGQ2NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NDb21wb25lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q29weXJpZ2h0IDxlbT5Db3B5cmlnaHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbXBsIGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2VJbXBsIGltcGxlbWVudHMgUHJvY2Vzc0NvbXBvbmVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3B5cmlnaHQgPSBDT1BZUklHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmZhY2UoKSA8ZW0+SW50ZXJmYWNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGludGVyZmFjZV87Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZXNzKCkgPGVtPlByb2Nlc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhNTEdyZWdvcmlhbkNhbGVuZGFyIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBjaGFuZ2VEYXRlID0gQ0hBTkdFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyBuZXdDb3B5cmlnaHQpIHsKLQkJU3RyaW5nIG9sZENvcHlyaWdodCA9IGNvcHlyaWdodDsKLQkJY29weXJpZ2h0ID0gbmV3Q29weXJpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQsIG9sZENvcHlyaWdodCwgY29weXJpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgZ2V0SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gaW50ZXJmYWNlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBuZXdJbnRlcmZhY2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvbGRJbnRlcmZhY2UgPSBpbnRlcmZhY2VfOwotCQlpbnRlcmZhY2VfID0gbmV3SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG9sZEludGVyZmFjZSwgbmV3SW50ZXJmYWNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBuZXdJbnRlcmZhY2UpIHsKLQkJaWYgKG5ld0ludGVyZmFjZSAhPSBpbnRlcmZhY2VfKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnRlcmZhY2VfICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWludGVyZmFjZV8pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0ludGVyZmFjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnRlcmZhY2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW50ZXJmYWNlKG5ld0ludGVyZmFjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG5ld0ludGVyZmFjZSwgbmV3SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvbGRQcm9jZXNzID0gcHJvY2VzczsKLQkJcHJvY2VzcyA9IG5ld1Byb2Nlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG9sZFByb2Nlc3MsIG5ld1Byb2Nlc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChuZXdQcm9jZXNzICE9IHByb2Nlc3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJvY2VzcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJvY2VzcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJvY2VzcyhuZXdQcm9jZXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG5ld1Byb2Nlc3MsIG5ld1Byb2Nlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcnMoKSB7Ci0JCXJldHVybiBhdXRob3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcnMoU3RyaW5nIG5ld0F1dGhvcnMpIHsKLQkJU3RyaW5nIG9sZEF1dGhvcnMgPSBhdXRob3JzOwotCQlhdXRob3JzID0gbmV3QXV0aG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUywgb2xkQXV0aG9ycywgYXV0aG9ycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYTUxHcmVnb3JpYW5DYWxlbmRhciBnZXRDaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gY2hhbmdlRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyIG5ld0NoYW5nZURhdGUpIHsKLQkJWE1MR3JlZ29yaWFuQ2FsZW5kYXIgb2xkQ2hhbmdlRGF0ZSA9IGNoYW5nZURhdGU7Ci0JCWNoYW5nZURhdGUgPSBuZXdDaGFuZ2VEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSwgb2xkQ2hhbmdlRGF0ZSwgY2hhbmdlRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgbmV3Q2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZENoYW5nZURlc2NyaXB0aW9uID0gY2hhbmdlRGVzY3JpcHRpb247Ci0JCWNoYW5nZURlc2NyaXB0aW9uID0gbmV3Q2hhbmdlRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiwgb2xkQ2hhbmdlRGVzY3JpcHRpb24sIGNoYW5nZURlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnRlcmZhY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJvY2VzcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIGdldENvcHlyaWdodCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldEludGVyZmFjZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXJldHVybiBnZXRQcm9jZXNzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENoYW5nZURhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUOgotCQkJCXNldENvcHlyaWdodCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlzZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJc2V0QXV0aG9ycygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXNldENoYW5nZURhdGUoKFhNTEdyZWdvcmlhbkNhbGVuZGFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJc2V0Q29weXJpZ2h0KENPUFlSSUdIVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJc2V0SW50ZXJmYWNlKChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlzZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUOgotCQkJCXJldHVybiBDT1BZUklHSFRfRURFRkFVTFQgPT0gbnVsbCA/IGNvcHlyaWdodCAhPSBudWxsIDogIUNPUFlSSUdIVF9FREVGQVVMVC5lcXVhbHMoY29weXJpZ2h0KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFOgotCQkJCXJldHVybiBpbnRlcmZhY2VfICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJcmV0dXJuIHByb2Nlc3MgIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gQVVUSE9SU19FREVGQVVMVCA9PSBudWxsID8gYXV0aG9ycyAhPSBudWxsIDogIUFVVEhPUlNfRURFRkFVTFQuZXF1YWxzKGF1dGhvcnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbCA6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsIDogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb3B5cmlnaHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvcHlyaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmYzcxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8VGFza0Rlc2NyaXB0b3I+IGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW50ZXJmYWNlSU8oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJcmV0dXJuIGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlSU8oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGFza0Rlc2NyaXB0b3I+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJZ2V0SW50ZXJmYWNlSU8oKS5jbGVhcigpOwotCQkJCWdldEludGVyZmFjZUlPKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCWdldEludGVyZmFjZUlPKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gIWdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJcmV0dXJuICFnZXRJbnRlcmZhY2VJTygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzEzZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjb3BlKCkgPGVtPlNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjb3BlID0gU0NPUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZU5vdGVzID0gVVNBR0VfTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5ld1Njb3BlKSB7Ci0JCVN0cmluZyBvbGRTY29wZSA9IHNjb3BlOwotCQlzY29wZSA9IG5ld1Njb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCBvbGRTY29wZSwgc2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiB1c2FnZU5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIG5ld1VzYWdlTm90ZXMpIHsKLQkJU3RyaW5nIG9sZFVzYWdlTm90ZXMgPSB1c2FnZU5vdGVzOwotCQl1c2FnZU5vdGVzID0gbmV3VXNhZ2VOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywgb2xkVXNhZ2VOb3RlcywgdXNhZ2VOb3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCQlyZXR1cm4gZ2V0U2NvcGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0VXNhZ2VOb3RlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQkJc2V0U2NvcGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXNldFVzYWdlTm90ZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCQlzZXRTY29wZShTQ09QRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXNldFVzYWdlTm90ZXMoVVNBR0VfTk9URVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXJldHVybiBTQ09QRV9FREVGQVVMVCA9PSBudWxsID8gc2NvcGUgIT0gbnVsbCA6ICFTQ09QRV9FREVGQVVMVC5lcXVhbHMoc2NvcGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXJldHVybiBVU0FHRV9OT1RFU19FREVGQVVMVCA9PSBudWxsID8gdXNhZ2VOb3RlcyAhPSBudWxsIDogIVVTQUdFX05PVEVTX0VERUZBVUxULmVxdWFscyh1c2FnZU5vdGVzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjb3BlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY29wZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNhZ2VOb3RlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXNhZ2VOb3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JiY2EwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRWxlbWVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0VsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0VMRU1FTlQ7Ci0JfQotCi19IC8vUHJvY2Vzc0VsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjczODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRJbmNsdWRlc1BhdHRlcm4gPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0RGlhZ3JhbVVSSSA8ZW0+RGlhZ3JhbSBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVzUGF0dGVybigpIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVzUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gaW5jbHVkZXNQYXR0ZXJuOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRDb250ZXh0KCkgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVYVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0Q29udGV4dCgpIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDb250ZXh0ID0gREVGQVVMVF9DT05URVhUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRDb250ZXh0KCkgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiB2YWxpZENvbnRleHQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbVVSSSgpIDxlbT5EaWFncmFtIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlhZ3JhbVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbVVSSSgpIDxlbT5EaWFncmFtIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlhZ3JhbVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaWFncmFtVVJJID0gRElBR1JBTV9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZXNQYXR0ZXJuKCkgewotCQlpZiAoaW5jbHVkZXNQYXR0ZXJuID09IG51bGwpIHsKLQkJCWluY2x1ZGVzUGF0dGVybiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZXNQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29udGV4dChTdHJpbmcgbmV3RGVmYXVsdENvbnRleHQpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDb250ZXh0ID0gZGVmYXVsdENvbnRleHQ7Ci0JCWRlZmF1bHRDb250ZXh0ID0gbmV3RGVmYXVsdENvbnRleHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhULCBvbGREZWZhdWx0Q29udGV4dCwgZGVmYXVsdENvbnRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRWYWxpZENvbnRleHQoKSB7Ci0JCWlmICh2YWxpZENvbnRleHQgPT0gbnVsbCkgewotCQkJdmFsaWRDb250ZXh0ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCQl9Ci0JCXJldHVybiB2YWxpZENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtVVJJKCkgewotCQlyZXR1cm4gZGlhZ3JhbVVSSTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtVVJJKFN0cmluZyBuZXdEaWFncmFtVVJJKSB7Ci0JCVN0cmluZyBvbGREaWFncmFtVVJJID0gZGlhZ3JhbVVSSTsKLQkJZGlhZ3JhbVVSSSA9IG5ld0RpYWdyYW1VUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkksIG9sZERpYWdyYW1VUkksIGRpYWdyYW1VUkkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZXNQYXR0ZXJuKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXJldHVybiBnZXREZWZhdWx0Q29udGV4dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIGdldFZhbGlkQ29udGV4dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RJQUdSQU1fVVJJOgotCQkJCXJldHVybiBnZXREaWFncmFtVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlnZXRJbmNsdWRlc1BhdHRlcm4oKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlzZXREZWZhdWx0Q29udGV4dCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlnZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJCWdldFZhbGlkQ29udGV4dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RJQUdSQU1fVVJJOgotCQkJCXNldERpYWdyYW1VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlzZXREZWZhdWx0Q29udGV4dChERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RJQUdSQU1fVVJJOgotCQkJCXNldERpYWdyYW1VUkkoRElBR1JBTV9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGluY2x1ZGVzUGF0dGVybiAhPSBudWxsICYmICFpbmNsdWRlc1BhdHRlcm4uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlyZXR1cm4gREVGQVVMVF9DT05URVhUX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0Q29udGV4dCAhPSBudWxsIDogIURFRkFVTFRfQ09OVEVYVF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdENvbnRleHQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIHZhbGlkQ29udGV4dCAhPSBudWxsICYmICF2YWxpZENvbnRleHQuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RJQUdSQU1fVVJJOgotCQkJCXJldHVybiBESUFHUkFNX1VSSV9FREVGQVVMVCA9PSBudWxsID8gZGlhZ3JhbVVSSSAhPSBudWxsIDogIURJQUdSQU1fVVJJX0VERUZBVUxULmVxdWFscyhkaWFncmFtVVJJKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGluY2x1ZGVzUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5jbHVkZXNQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0Q29udGV4dDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdENvbnRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbGlkQ29udGV4dDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsaWRDb250ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaWFncmFtVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaWFncmFtVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWRmYTliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cyBQcm9jZXNzUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxQcm9jZXNzRWxlbWVudD4gZ2V0UHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9jZXNzRWxlbWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldFByb2Nlc3NFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlnZXRQcm9jZXNzRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvY2Vzc0VsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFByb2Nlc3NFbGVtZW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlnZXRQcm9jZXNzRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0UHJvY2Vzc0VsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTljYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCNnZXRCYXNlUHJvY2VzcyA8ZW0+QmFzZSBQcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXA0KCkgPGVtPkdyb3VwNDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwNDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwNCgpIHsKLQkJaWYgKGdyb3VwNCA9PSBudWxsKSB7Ci0JCQlncm91cDQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0KTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEJhc2VQcm9jZXNzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXA0KCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwNCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQ6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXA0KCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlyZXR1cm4gZ2V0QmFzZVByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwNCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1M6Ci0JCQkJZ2V0QmFzZVByb2Nlc3MoKS5jbGVhcigpOwotCQkJCWdldEJhc2VQcm9jZXNzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQlnZXRHcm91cDQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1M6Ci0JCQkJZ2V0QmFzZVByb2Nlc3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQlyZXR1cm4gZ3JvdXA0ICE9IG51bGwgJiYgIWdyb3VwNC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTOgotCQkJCXJldHVybiAhZ2V0QmFzZVByb2Nlc3MoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwNCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwYjU1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlcG9ydEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBSZXBvcnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXBvcnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVBPUlQ7Ci0JfQotCi19IC8vUmVwb3J0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzM1N2QyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJldXNhYmxlQXNzZXRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXVzYWJsZUFzc2V0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJldXNhYmxlQXNzZXQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXVzYWJsZUFzc2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVVU0FCTEVfQVNTRVQ7Ci0JfQotCi19IC8vUmV1c2FibGVBc3NldEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlMTlkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2FkbWFwSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2FkbWFwSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJvYWRtYXAgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2FkbWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9BRE1BUDsKLQl9Ci0KLX0gLy9Sb2FkbWFwSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4MmNhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgUm9sZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXNzaWdubWVudEFwcHJvYWNoZXMgPSBBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2tpbGxzKCkgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2tpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lMTFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2tpbGxzKCkgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2tpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNraWxscyA9IFNLSUxMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTk9OWU1TX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeW5vbnltcyA9IFNZTk9OWU1TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIHsKLQkJcmV0dXJuIGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZyBuZXdBc3NpZ25tZW50QXBwcm9hY2hlcykgewotCQlTdHJpbmcgb2xkQXNzaWdubWVudEFwcHJvYWNoZXMgPSBhc3NpZ25tZW50QXBwcm9hY2hlczsKLQkJYXNzaWdubWVudEFwcHJvYWNoZXMgPSBuZXdBc3NpZ25tZW50QXBwcm9hY2hlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMsIG9sZEFzc2lnbm1lbnRBcHByb2FjaGVzLCBhc3NpZ25tZW50QXBwcm9hY2hlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2tpbGxzKCkgewotCQlyZXR1cm4gc2tpbGxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNraWxscyhTdHJpbmcgbmV3U2tpbGxzKSB7Ci0JCVN0cmluZyBvbGRTa2lsbHMgPSBza2lsbHM7Ci0JCXNraWxscyA9IG5ld1NraWxsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMsIG9sZFNraWxscywgc2tpbGxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeW5vbnltcygpIHsKLQkJcmV0dXJuIHN5bm9ueW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bm9ueW1zKFN0cmluZyBuZXdTeW5vbnltcykgewotCQlTdHJpbmcgb2xkU3lub255bXMgPSBzeW5vbnltczsKLQkJc3lub255bXMgPSBuZXdTeW5vbnltczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUywgb2xkU3lub255bXMsIHN5bm9ueW1zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCQlyZXR1cm4gZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQkJcmV0dXJuIGdldFNraWxscygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXJldHVybiBnZXRTeW5vbnltcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQkJc2V0U2tpbGxzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCQlzZXRTeW5vbnltcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCQlzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQkJc2V0U2tpbGxzKFNLSUxMU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXNldFN5bm9ueW1zKFNZTk9OWU1TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQkJcmV0dXJuIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9PSBudWxsID8gYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gbnVsbCA6ICFBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQuZXF1YWxzKGFzc2lnbm1lbnRBcHByb2FjaGVzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQkJcmV0dXJuIFNLSUxMU19FREVGQVVMVCA9PSBudWxsID8gc2tpbGxzICE9IG51bGwgOiAhU0tJTExTX0VERUZBVUxULmVxdWFscyhza2lsbHMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXJldHVybiBTWU5PTllNU19FREVGQVVMVCA9PSBudWxsID8gc3lub255bXMgIT0gbnVsbCA6ICFTWU5PTllNU19FREVGQVVMVC5lcXVhbHMoc3lub255bXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXNzaWdubWVudEFwcHJvYWNoZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFzc2lnbm1lbnRBcHByb2FjaGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBza2lsbHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNraWxscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3lub255bXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN5bm9ueW1zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGVmZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRvckltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMgUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlKCkgPGVtPlJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZSgpIDxlbT5Sb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGUgPSBST0xFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiByZXNwb25zaWJsZUZvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJvbGUoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIG5ld1JvbGUpIHsKLQkJU3RyaW5nIG9sZFJvbGUgPSByb2xlOwotCQlyb2xlID0gbmV3Um9sZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUsIG9sZFJvbGUsIHJvbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJaWYgKHJlc3BvbnNpYmxlRm9yID09IG51bGwpIHsKLQkJCXJlc3BvbnNpYmxlRm9yID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzcG9uc2libGVGb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlyZXR1cm4gZ2V0Um9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiBnZXRSZXNwb25zaWJsZUZvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlzZXRSb2xlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXNldFJvbGUoUk9MRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkJcmV0dXJuIFJPTEVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGUgIT0gbnVsbCA6ICFST0xFX0VERUZBVUxULmVxdWFscyhyb2xlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlyZXR1cm4gcmVzcG9uc2libGVGb3IgIT0gbnVsbCAmJiAhcmVzcG9uc2libGVGb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocm9sZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzcG9uc2libGVGb3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3BvbnNpYmxlRm9yKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzE3N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUm9sZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX19SRVNQT05TSUJMRV9GT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlyZXR1cm4gIWdldFJlc3BvbnNpYmxlRm9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzZDA5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldFJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBSb2xlU2V0R3JvdXBpbmcgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEdyb3VwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJvbGVTZXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJcmV0dXJuIGdldFJvbGVTZXQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUOgotCQkJCWdldFJvbGVTZXQoKS5jbGVhcigpOwotCQkJCWdldFJvbGVTZXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJZ2V0Um9sZVNldCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUOgotCQkJCXJldHVybiAhZ2V0Um9sZVNldCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZVNldEdyb3VwaW5nSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQ1NmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlU2V0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgUm9sZVNldCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJvbGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCWdldFJvbGUoKS5jbGVhcigpOwotCQkJCWdldFJvbGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRToKLQkJCQlyZXR1cm4gIWdldFJvbGUoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JvbGVTZXRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMmNhZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlY3Rpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNlY3Rpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YlNlY3Rpb24oKSA8ZW0+U3ViIFNlY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YlNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uIHN1YlNlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3IoKSA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVERUNFU1NPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvcigpIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlZGVjZXNzb3IgPSBQUkVERUNFU1NPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uTmFtZSgpIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25OYW1lID0gU0VDVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmFyaWFiaWxpdHkgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBnZXRTdWJTZWN0aW9uKCkgewotCQlyZXR1cm4gc3ViU2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdWJTZWN0aW9uKFNlY3Rpb24gbmV3U3ViU2VjdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZWN0aW9uIG9sZFN1YlNlY3Rpb24gPSBzdWJTZWN0aW9uOwotCQlzdWJTZWN0aW9uID0gbmV3U3ViU2VjdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgb2xkU3ViU2VjdGlvbiwgbmV3U3ViU2VjdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ViU2VjdGlvbihTZWN0aW9uIG5ld1N1YlNlY3Rpb24pIHsKLQkJaWYgKG5ld1N1YlNlY3Rpb24gIT0gc3ViU2VjdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3ViU2VjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdWJTZWN0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U3ViU2VjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdWJTZWN0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdWJTZWN0aW9uKG5ld1N1YlNlY3Rpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbmV3U3ViU2VjdGlvbiwgbmV3U3ViU2VjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiBwcmVkZWNlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVkZWNlc3NvcihTdHJpbmcgbmV3UHJlZGVjZXNzb3IpIHsKLQkJU3RyaW5nIG9sZFByZWRlY2Vzc29yID0gcHJlZGVjZXNzb3I7Ci0JCXByZWRlY2Vzc29yID0gbmV3UHJlZGVjZXNzb3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1IsIG9sZFByZWRlY2Vzc29yLCBwcmVkZWNlc3NvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBzZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmcgbmV3U2VjdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNlY3Rpb25OYW1lID0gc2VjdGlvbk5hbWU7Ci0JCXNlY3Rpb25OYW1lID0gbmV3U2VjdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FLCBvbGRTZWN0aW9uTmFtZSwgc2VjdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJU3RyaW5nIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUIDogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSwgIW9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxULCBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdWJTZWN0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJcmV0dXJuIGdldFN1YlNlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlY3Rpb25OYW1lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJc2V0U3ViU2VjdGlvbigoU2VjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXNldFByZWRlY2Vzc29yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJCXNldFNlY3Rpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJc2V0U3ViU2VjdGlvbigoU2VjdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQkJc2V0UHJlZGVjZXNzb3IoUFJFREVDRVNTT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlzZXRTZWN0aW9uTmFtZShTRUNUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlyZXR1cm4gc3ViU2VjdGlvbiAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiBQUkVERUNFU1NPUl9FREVGQVVMVCA9PSBudWxsID8gcHJlZGVjZXNzb3IgIT0gbnVsbCA6ICFQUkVERUNFU1NPUl9FREVGQVVMVC5lcXVhbHMocHJlZGVjZXNzb3IpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlyZXR1cm4gU0VDVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZWN0aW9uTmFtZSAhPSBudWxsIDogIVNFQ1RJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VjdGlvbk5hbWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbCA6ICFWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlZGVjZXNzb3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWRlY2Vzc29yKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlY3Rpb25OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZWN0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlUeXBlOiAiKTsKLQkJaWYgKHZhcmlhYmlsaXR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlY3Rpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGE0MmZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBTdXBwb3J0aW5nTWF0ZXJpYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVVBQT1JUSU5HX01BVEVSSUFMOwotCX0KLQotfSAvL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzcyY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFRhc2tEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsIG9sZEFsdGVybmF0aXZlcywgYWx0ZXJuYXRpdmVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJcmV0dXJuIGdldEFsdGVybmF0aXZlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJc2V0UHVycG9zZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbCA6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWx0ZXJuYXRpdmVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYXNrRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmMDJkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0U3RlcCA8ZW0+U3RlcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhc2tEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2soKSA8ZW0+VGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YXNrID0gVEFTS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwZXJmb3JtZWRQcmltYXJpbHlCeSA9IFBFUkZPUk1FRF9QUklNQVJJTFlfQllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RlcCgpIDxlbT5TdGVwPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0ZXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzdGVwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFzayhTdHJpbmcgbmV3VGFzaykgewotCQlTdHJpbmcgb2xkVGFzayA9IHRhc2s7Ci0JCXRhc2sgPSBuZXdUYXNrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSywgb2xkVGFzaywgdGFzaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSB7Ci0JCXJldHVybiBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShTdHJpbmcgbmV3UGVyZm9ybWVkUHJpbWFyaWx5QnkpIHsKLQkJU3RyaW5nIG9sZFBlcmZvcm1lZFByaW1hcmlseUJ5ID0gcGVyZm9ybWVkUHJpbWFyaWx5Qnk7Ci0JCXBlcmZvcm1lZFByaW1hcmlseUJ5ID0gbmV3UGVyZm9ybWVkUHJpbWFyaWx5Qnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZLCBvbGRQZXJmb3JtZWRQcmltYXJpbHlCeSwgcGVyZm9ybWVkUHJpbWFyaWx5QnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDMoKSB7Ci0JCWlmIChncm91cDMgPT0gbnVsbCkgewotCQkJZ3JvdXAzID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFeHRlcm5hbElucHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRPcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE91dHB1dCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFNlY3Rpb24+IGdldFN0ZXAoKSB7Ci0JCWlmIChzdGVwID09IG51bGwpIHsKLQkJCXN0ZXAgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U2VjdGlvbj4oU2VjdGlvbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVApOwotCQl9Ci0JCXJldHVybiBzdGVwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsICFvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN0ZXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXJldHVybiBnZXRUYXNrKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJCXJldHVybiBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMygpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlyZXR1cm4gZ2V0QXNzaXN0ZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsSW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJcmV0dXJuIGdldE91dHB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUDoKLQkJCQlyZXR1cm4gZ2V0U3RlcCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkJc2V0VGFzaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJCXNldFBlcmZvcm1lZFByaW1hcmlseUJ5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCWdldEFzc2lzdGVkQnkoKS5jbGVhcigpOwotCQkJCWdldEFzc2lzdGVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCWdldEV4dGVybmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCWdldE91dHB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUDoKLQkJCQlnZXRTdGVwKCkuY2xlYXIoKTsKLQkJCQlnZXRTdGVwKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlzZXRUYXNrKFRBU0tfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJZ2V0QXNzaXN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCWdldFN0ZXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQl1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlyZXR1cm4gVEFTS19FREVGQVVMVCA9PSBudWxsID8gdGFzayAhPSBudWxsIDogIVRBU0tfRURFRkFVTFQuZXF1YWxzKHRhc2spOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQlyZXR1cm4gUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCA9PSBudWxsID8gcGVyZm9ybWVkUHJpbWFyaWx5QnkgIT0gbnVsbCA6ICFQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxULmVxdWFscyhwZXJmb3JtZWRQcmltYXJpbHlCeSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gIWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJcmV0dXJuICFnZXRBc3Npc3RlZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRFeHRlcm5hbElucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldE9wdGlvbmFsSW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJcmV0dXJuICFnZXRPdXRwdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiBzdGVwICE9IG51bGwgJiYgIXN0ZXAuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFzazogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFzayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyZm9ybWVkUHJpbWFyaWx5Qnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmZvcm1lZFByaW1hcmlseUJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOiAiKTsKLQkJaWYgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tEZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2JkMTFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0ltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyZm9ybWVkQnkoKSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBwZXJmb3JtZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyBuZXdQcmVjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChwZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlwZXJmb3JtZWRCeSA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRNYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE91dHB1dCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19PVVRQVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX0VTVElNQVRFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0VG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19UT09MX01FTlRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIGdldFBlcmZvcm1lZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE1hbmRhdG9yeUlucHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1VUUFVUOgotCQkJCXJldHVybiBnZXRPdXRwdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVEU6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuIGdldFRvb2xNZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1VUUFVUOgotCQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0cHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVEU6Ci0JCQkJZ2V0RXN0aW1hdGUoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCWdldFRvb2xNZW50b3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbihQUkVDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oUE9TVENPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBQUkVDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHByZWNvbmRpdGlvbiAhPSBudWxsIDogIVBSRUNPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocHJlY29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiBwZXJmb3JtZWRCeSAhPSBudWxsICYmICFwZXJmb3JtZWRCeS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJcmV0dXJuICFnZXRPdXRwdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gIWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0T3B0aW9uYWxJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlY29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvc3Rjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvc3Rjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmZvcm1lZEJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwZXJmb3JtZWRCeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYXNrSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlYW1Qcm9maWxlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmYyYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZWFtUHJvZmlsZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlYW0gUHJvZmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRlYW1Qcm9maWxlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJvbGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19ST0xFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTdXBlclRlYW0oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTdWJUZWFtKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCXJldHVybiBnZXRTdXBlclRlYW0oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJCXJldHVybiBnZXRTdWJUZWFtKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJZ2V0Um9sZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCQlnZXRTdXBlclRlYW0oKS5jbGVhcigpOwotCQkJCWdldFN1cGVyVGVhbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJZ2V0U3ViVGVhbSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViVGVhbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJZ2V0Um9sZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCQlnZXRTdXBlclRlYW0oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJcmV0dXJuICFnZXRSb2xlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCQlyZXR1cm4gIWdldFN1cGVyVGVhbSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJCXJldHVybiAhZ2V0U3ViVGVhbSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGVhbVByb2ZpbGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVtcGxhdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczMTA2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVtcGxhdGVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVGVtcGxhdGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFTVBMQVRFOwotCX0KLQotfSAvL1RlbXBsYXRlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTQ3YWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlcm1EZWZpbml0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXJtRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZXJtRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlcm1EZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVSTV9ERUZJTklUSU9OOwotCX0KLQotfSAvL1Rlcm1EZWZpbml0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTViNWFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUb29sSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgVG9vbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfX1RPT0xfTUVOVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuIGdldFRvb2xNZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlnZXRUb29sTWVudG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SOgotCQkJCXJldHVybiAhZ2V0VG9vbE1lbnRvcigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVG9vbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmYzNmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUb29sTWVudG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUb29sTWVudG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfTUVOVE9SOwotCX0KLQotfSAvL1Rvb2xNZW50b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzIxZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFGYWN0b3J5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFVtYUZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVtYUZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCVVtYUZhY3RvcnkgdGhlVW1hRmFjdG9yeSA9IChVbWFGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUiKTsgCi0JCQlpZiAodGhlVW1hRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVVtYUZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgVW1hRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQWN0aXZpdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVBcnRpZmFjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQnJlYWtkb3duRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVDaGVja2xpc3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29uY2VwdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb25zdHJhaW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRDYXRlZ29yeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyYWJsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURpc2NpcGxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURvbWFpbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVFc3RpbWF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJTkdfTUVUUklDOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXN0aW1hdGluZ01ldHJpYygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6IHJldHVybiAoRU9iamVjdCljcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXhhbXBsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlR3VpZGFuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6IHJldHVybiAoRU9iamVjdCljcmVhdGVHdWlkZWxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVJdGVyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5LSU5EOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlS2luZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kVW5pdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1pbGVzdG9uZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVOYW1lZEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5PVVRDT01FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlT3V0Y29tZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QSEFTRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBoYXNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJhY3RpY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2VzcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlcG9ydCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPQURNQVA6IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2FkbWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGVTZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVTZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0s6IHJldHVybiAoRU9iamVjdCljcmVhdGVUYXNrKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2tEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRlbXBsYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVG9vbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVG9vbE1lbnRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVXaGl0ZXBhcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya0RlZmluaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya09yZGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya1Byb2R1Y3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFZhcmlhYmlsaXR5VHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCkgewotCQlBY3Rpdml0eUltcGwgYWN0aXZpdHkgPSBuZXcgQWN0aXZpdHlJbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBhY3Rpdml0eURlc2NyaXB0aW9uID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gbmV3IEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkgewotCQlBcnRpZmFjdEltcGwgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3RJbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3REZXNjcmlwdGlvbiBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBhcnRpZmFjdERlc2NyaXB0aW9uID0gbmV3IEFydGlmYWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGNyZWF0ZUJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRJbXBsIGJyZWFrZG93bkVsZW1lbnQgPSBuZXcgQnJlYWtkb3duRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gbmV3IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSB7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuSW1wbCBjYXBhYmlsaXR5UGF0dGVybiA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkltcGwoKTsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCkgewotCQlDaGVja2xpc3RJbXBsIGNoZWNrbGlzdCA9IG5ldyBDaGVja2xpc3RJbXBsKCk7Ci0JCXJldHVybiBjaGVja2xpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZSgpIHsKLQkJQ29tcG9zaXRlUm9sZUltcGwgY29tcG9zaXRlUm9sZSA9IG5ldyBDb21wb3NpdGVSb2xlSW1wbCgpOwotCQlyZXR1cm4gY29tcG9zaXRlUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KCkgewotCQlDb25jZXB0SW1wbCBjb25jZXB0ID0gbmV3IENvbmNlcHRJbXBsKCk7Ci0JCXJldHVybiBjb25jZXB0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGNyZWF0ZUNvbnN0cmFpbnQoKSB7Ci0JCUNvbnN0cmFpbnRJbXBsIGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIGNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBjcmVhdGVDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCUNvbnRlbnRDYXRlZ29yeUltcGwgY29udGVudENhdGVnb3J5ID0gbmV3IENvbnRlbnRDYXRlZ29yeUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5UGFja2FnZSBjcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkgewotCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlID0gbmV3IENvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotCQlDb250ZW50RGVzY3JpcHRpb25JbXBsIGNvbnRlbnREZXNjcmlwdGlvbiA9IG5ldyBDb250ZW50RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50IGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkgewotCQlDb250ZW50RWxlbWVudEltcGwgY29udGVudEVsZW1lbnQgPSBuZXcgQ29udGVudEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoKSB7Ci0JCUNvbnRlbnRQYWNrYWdlSW1wbCBjb250ZW50UGFja2FnZSA9IG5ldyBDb250ZW50UGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnlJbXBsIGN1c3RvbUNhdGVnb3J5ID0gbmV3IEN1c3RvbUNhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCkgewotCQlEZWxpdmVyYWJsZUltcGwgZGVsaXZlcmFibGUgPSBuZXcgRGVsaXZlcmFibGVJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkgewotCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkgewotCQlEZWxpdmVyeVByb2Nlc3NJbXBsIGRlbGl2ZXJ5UHJvY2VzcyA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPSBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50IGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJRGVzY3JpYmFibGVFbGVtZW50SW1wbCBkZXNjcmliYWJsZUVsZW1lbnQgPSBuZXcgRGVzY3JpYmFibGVFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpYmFibGVFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yIGNyZWF0ZURlc2NyaXB0b3IoKSB7Ci0JCURlc2NyaXB0b3JJbXBsIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSB7Ci0JCURlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCkgewotCQlEaXNjaXBsaW5lSW1wbCBkaXNjaXBsaW5lID0gbmV3IERpc2NpcGxpbmVJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGRpc2NpcGxpbmVHcm91cGluZyA9IG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKSB7Ci0JCURvY3VtZW50Um9vdEltcGwgZG9jdW1lbnRSb290ID0gbmV3IERvY3VtZW50Um9vdEltcGwoKTsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9tYWluIGNyZWF0ZURvbWFpbigpIHsKLQkJRG9tYWluSW1wbCBkb21haW4gPSBuZXcgRG9tYWluSW1wbCgpOwotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKSB7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRlIGNyZWF0ZUVzdGltYXRlKCkgewotCQlFc3RpbWF0ZUltcGwgZXN0aW1hdGUgPSBuZXcgRXN0aW1hdGVJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXN0aW1hdGluZ01ldHJpYyBjcmVhdGVFc3RpbWF0aW5nTWV0cmljKCkgewotCQlFc3RpbWF0aW5nTWV0cmljSW1wbCBlc3RpbWF0aW5nTWV0cmljID0gbmV3IEVzdGltYXRpbmdNZXRyaWNJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0aW5nTWV0cmljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpIHsKLQkJRXhhbXBsZUltcGwgZXhhbXBsZSA9IG5ldyBFeGFtcGxlSW1wbCgpOwotCQlyZXR1cm4gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoKSB7Ci0JCUd1aWRhbmNlSW1wbCBndWlkYW5jZSA9IG5ldyBHdWlkYW5jZUltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSB7Ci0JCUd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGd1aWRhbmNlRGVzY3JpcHRpb24gPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRlbGluZSBjcmVhdGVHdWlkZWxpbmUoKSB7Ci0JCUd1aWRlbGluZUltcGwgZ3VpZGVsaW5lID0gbmV3IEd1aWRlbGluZUltcGwoKTsKLQkJcmV0dXJuIGd1aWRlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbigpIHsKLQkJSXRlcmF0aW9uSW1wbCBpdGVyYXRpb24gPSBuZXcgSXRlcmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gaXRlcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBLaW5kIGNyZWF0ZUtpbmQoKSB7Ci0JCUtpbmRJbXBsIGtpbmQgPSBuZXcgS2luZEltcGwoKTsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgbWV0aG9kQ29uZmlndXJhdGlvbiA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KCkgewotCQlNZXRob2RFbGVtZW50SW1wbCBtZXRob2RFbGVtZW50ID0gbmV3IE1ldGhvZEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeSgpIHsKLQkJTWV0aG9kTGlicmFyeUltcGwgbWV0aG9kTGlicmFyeSA9IG5ldyBNZXRob2RMaWJyYXJ5SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZSBjcmVhdGVNZXRob2RQYWNrYWdlKCkgewotCQlNZXRob2RQYWNrYWdlSW1wbCBtZXRob2RQYWNrYWdlID0gbmV3IE1ldGhvZFBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCkgewotCQlNZXRob2RQbHVnaW5JbXBsIG1ldGhvZFBsdWdpbiA9IG5ldyBNZXRob2RQbHVnaW5JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQbHVnaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFVuaXQgY3JlYXRlTWV0aG9kVW5pdCgpIHsKLQkJTWV0aG9kVW5pdEltcGwgbWV0aG9kVW5pdCA9IG5ldyBNZXRob2RVbml0SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kVW5pdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZSgpIHsKLQkJTWlsZXN0b25lSW1wbCBtaWxlc3RvbmUgPSBuZXcgTWlsZXN0b25lSW1wbCgpOwotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZEVsZW1lbnQgY3JlYXRlTmFtZWRFbGVtZW50KCkgewotCQlOYW1lZEVsZW1lbnRJbXBsIG5hbWVkRWxlbWVudCA9IG5ldyBOYW1lZEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBuYW1lZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGNvbWUgY3JlYXRlT3V0Y29tZSgpIHsKLQkJT3V0Y29tZUltcGwgb3V0Y29tZSA9IG5ldyBPdXRjb21lSW1wbCgpOwotCQlyZXR1cm4gb3V0Y29tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZWFibGVFbGVtZW50IGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJUGFja2FnZWFibGVFbGVtZW50SW1wbCBwYWNrYWdlYWJsZUVsZW1lbnQgPSBuZXcgUGFja2FnZWFibGVFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gcGFja2FnZWFibGVFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQaGFzZSBjcmVhdGVQaGFzZSgpIHsKLQkJUGhhc2VJbXBsIHBoYXNlID0gbmV3IFBoYXNlSW1wbCgpOwotCQlyZXR1cm4gcGhhc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBsYW5uaW5nRGF0YSBjcmVhdGVQbGFubmluZ0RhdGEoKSB7Ci0JCVBsYW5uaW5nRGF0YUltcGwgcGxhbm5pbmdEYXRhID0gbmV3IFBsYW5uaW5nRGF0YUltcGwoKTsKLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKSB7Ci0JCVByYWN0aWNlSW1wbCBwcmFjdGljZSA9IG5ldyBQcmFjdGljZUltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCVByYWN0aWNlRGVzY3JpcHRpb25JbXBsIHByYWN0aWNlRGVzY3JpcHRpb24gPSBuZXcgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgY3JlYXRlUHJvY2VzcygpIHsKLQkJUHJvY2Vzc0ltcGwgcHJvY2VzcyA9IG5ldyBQcm9jZXNzSW1wbCgpOwotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkgewotCQlQcm9jZXNzQ29tcG9uZW50SW1wbCBwcm9jZXNzQ29tcG9uZW50ID0gbmV3IFByb2Nlc3NDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgcHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnQgY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCVByb2Nlc3NFbGVtZW50SW1wbCBwcm9jZXNzRWxlbWVudCA9IG5ldyBQcm9jZXNzRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpIHsKLQkJUHJvY2Vzc1BhY2thZ2VJbXBsIHByb2Nlc3NQYWNrYWdlID0gbmV3IFByb2Nlc3NQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkgewotCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPSBuZXcgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydCgpIHsKLQkJUmVwb3J0SW1wbCByZXBvcnQgPSBuZXcgUmVwb3J0SW1wbCgpOwotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoKSB7Ci0JCVJldXNhYmxlQXNzZXRJbXBsIHJldXNhYmxlQXNzZXQgPSBuZXcgUmV1c2FibGVBc3NldEltcGwoKTsKLQkJcmV0dXJuIHJldXNhYmxlQXNzZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpIHsKLQkJUm9hZG1hcEltcGwgcm9hZG1hcCA9IG5ldyBSb2FkbWFwSW1wbCgpOwotCQlyZXR1cm4gcm9hZG1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKCkgewotCQlSb2xlSW1wbCByb2xlID0gbmV3IFJvbGVJbXBsKCk7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb24gY3JlYXRlUm9sZURlc2NyaXB0aW9uKCkgewotCQlSb2xlRGVzY3JpcHRpb25JbXBsIHJvbGVEZXNjcmlwdGlvbiA9IG5ldyBSb2xlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkgewotCQlSb2xlRGVzY3JpcHRvckltcGwgcm9sZURlc2NyaXB0b3IgPSBuZXcgUm9sZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCkgewotCQlSb2xlU2V0SW1wbCByb2xlU2V0ID0gbmV3IFJvbGVTZXRJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkgewotCQlSb2xlU2V0R3JvdXBpbmdJbXBsIHJvbGVTZXRHcm91cGluZyA9IG5ldyBSb2xlU2V0R3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbigpIHsKLQkJU2VjdGlvbkltcGwgc2VjdGlvbiA9IG5ldyBTZWN0aW9uSW1wbCgpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsSW1wbCBzdXBwb3J0aW5nTWF0ZXJpYWwgPSBuZXcgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCgpOwotCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soKSB7Ci0JCVRhc2tJbXBsIHRhc2sgPSBuZXcgVGFza0ltcGwoKTsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvbiBjcmVhdGVUYXNrRGVzY3JpcHRpb24oKSB7Ci0JCVRhc2tEZXNjcmlwdGlvbkltcGwgdGFza0Rlc2NyaXB0aW9uID0gbmV3IFRhc2tEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSB7Ci0JCVRhc2tEZXNjcmlwdG9ySW1wbCB0YXNrRGVzY3JpcHRvciA9IG5ldyBUYXNrRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBjcmVhdGVUZWFtUHJvZmlsZSgpIHsKLQkJVGVhbVByb2ZpbGVJbXBsIHRlYW1Qcm9maWxlID0gbmV3IFRlYW1Qcm9maWxlSW1wbCgpOwotCQlyZXR1cm4gdGVhbVByb2ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZUltcGwgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGVJbXBsKCk7Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oKSB7Ci0JCVRlcm1EZWZpbml0aW9uSW1wbCB0ZXJtRGVmaW5pdGlvbiA9IG5ldyBUZXJtRGVmaW5pdGlvbkltcGwoKTsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCVRvb2xJbXBsIHRvb2wgPSBuZXcgVG9vbEltcGwoKTsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpIHsKLQkJVG9vbE1lbnRvckltcGwgdG9vbE1lbnRvciA9IG5ldyBUb29sTWVudG9ySW1wbCgpOwotCQlyZXR1cm4gdG9vbE1lbnRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKCkgewotCQlXaGl0ZXBhcGVySW1wbCB3aGl0ZXBhcGVyID0gbmV3IFdoaXRlcGFwZXJJbXBsKCk7Ci0JCXJldHVybiB3aGl0ZXBhcGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIHdvcmtCcmVha2Rvd25FbGVtZW50ID0gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtEZWZpbml0aW9uIGNyZWF0ZVdvcmtEZWZpbml0aW9uKCkgewotCQlXb3JrRGVmaW5pdGlvbkltcGwgd29ya0RlZmluaXRpb24gPSBuZXcgV29ya0RlZmluaXRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpIHsKLQkJV29ya09yZGVySW1wbCB3b3JrT3JkZXIgPSBuZXcgV29ya09yZGVySW1wbCgpOwotCQlyZXR1cm4gd29ya09yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdCBjcmVhdGVXb3JrUHJvZHVjdCgpIHsKLQkJV29ya1Byb2R1Y3RJbXBsIHdvcmtQcm9kdWN0ID0gbmV3IFdvcmtQcm9kdWN0SW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgd29ya1Byb2R1Y3REZXNjcmlwdGlvbiA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkgewotCQlXb3JrUHJvZHVjdFR5cGVJbXBsIHdvcmtQcm9kdWN0VHlwZSA9IG5ldyBXb3JrUHJvZHVjdFR5cGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZhcmlhYmlsaXR5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFdvcmtPcmRlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlRnJvbVN0cmluZyhVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGNyZWF0ZVdvcmtPcmRlclR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlclR5cGVGcm9tU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUl9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtPcmRlclR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpIHsKLQkJcmV0dXJuIChVbWFQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vVW1hRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTU3NjUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzEwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgVW1hUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNoZWNrbGlzdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21wb3NpdGVSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbmNlcHRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudFBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc2NpcGxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvY3VtZW50Um9vdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb21haW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlc3RpbWF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlc3RpbWF0aW5nTWV0cmljRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleGFtcGxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGVsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGl0ZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBraW5kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kTGlicmFyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBsdWdpbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RVbml0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbGVzdG9uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0Y29tZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGhhc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGxhbm5pbmdEYXRhRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlcG9ydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXVzYWJsZUFzc2V0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvYWRtYXBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVNldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0Rlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVhbVByb2ZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVtcGxhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVybURlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sTWVudG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdoaXRlcGFwZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya0RlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya09yZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHZhcmlhYmlsaXR5VHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gd29ya09yZGVyVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVtYVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBVbWFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVtYVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFVtYVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVW1hUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVVtYVBhY2thZ2VJbXBsIHRoZVVtYVBhY2thZ2UgPSAoVW1hUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgVW1hUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBVbWFQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVVbWFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlVW1hUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVVbWFQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVVbWFQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHkoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUm9hZG1hcCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJ0aWZhY3QoKSB7Ci0JCXJldHVybiBhcnRpZmFjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdF9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1doaXRlcGFwZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hlY2tsaXN0KCkgewotCQlyZXR1cm4gY2hlY2tsaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tcG9zaXRlUm9sZSgpIHsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbmNlcHQoKSB7Ci0JCXJldHVybiBjb25jZXB0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIGNvbnN0cmFpbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250ZW50UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZV9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmliYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1Rhc2soKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREb2N1bWVudFJvb3QoKSB7Ci0JCXJldHVybiBkb2N1bWVudFJvb3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIGRvbWFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb21haW5fR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9tYWluX1N1YmRvbWFpbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIGVzdGltYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVzdGltYXRlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVzdGltYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVzdGltYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXN0aW1hdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVzdGltYXRpbmdNZXRyaWMoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW5nTWV0cmljRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGV4YW1wbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ3VpZGVsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SXRlcmF0aW9uKCkgewotCQlyZXR1cm4gaXRlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWtpbmRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIG1ldGhvZExpYnJhcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZExpYnJhcnlfVG9vbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiBtZXRob2RQbHVnaW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpIHsKLQkJcmV0dXJuIG1ldGhvZFVuaXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltaWxlc3RvbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVkRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Y29tZSgpIHsKLQkJcmV0dXJuIG91dGNvbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQaGFzZSgpIHsKLQkJcmV0dXJuIHBoYXNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmFjdGljZSgpIHsKLQkJcmV0dXJuIHByYWN0aWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByYWN0aWNlX1N1YlByYWN0aWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0RpYWdyYW1VUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRWxlbWVudCgpIHsKLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BhY2thZ2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXBvcnQoKSB7Ci0JCXJldHVybiByZXBvcnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gcmV1c2FibGVBc3NldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvYWRtYXAoKSB7Ci0JCXJldHVybiByb2FkbWFwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIHJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVTZXQoKSB7Ci0JCXJldHVybiByb2xlU2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTZXRfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVNldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTZXRfUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVTZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWN0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3Rpb25fU3ViU2VjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1ByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3V0cHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Ub29sTWVudG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1N0ZXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVhbVByb2ZpbGUoKSB7Ci0JCXJldHVybiB0ZWFtUHJvZmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1JvbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIHRlbXBsYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2woKSB7Ci0JCXJldHVybiB0b29sRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRvb2xfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdG9vbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRvb2xfVG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRvb2xFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiB0b29sTWVudG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIHdoaXRlcGFwZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gd29ya0RlZmluaXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtPcmRlcigpIHsKLQkJcmV0dXJuIHdvcmtPcmRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRXb3JrT3JkZXJUeXBlKCkgewotCQlyZXR1cm4gd29ya09yZGVyVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChVbWFGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWFjdGl2aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1BSRUNPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19QT1NUQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0dST1VQMyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19ST0FETUFQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUpOwotCi0JCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFlfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQotCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MsIEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTik7Ci0KLQkJYXJ0aWZhY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJUSUZBQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fR1JPVVAzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVCk7Ci0KLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUlRJRkFDVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTik7Ci0KLQkJYnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCUkVBS0RPV05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDEpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgpOwotCi0JCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UpOwotCi0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzID0gY3JlYXRlRUNsYXNzKENBUEFCSUxJVFlfUEFUVEVSTik7Ci0KLQkJY2hlY2tsaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENIRUNLTElTVCk7Ci0KLQkJY29tcG9zaXRlUm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QT1NJVEVfUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9zaXRlUm9sZUVDbGFzcywgQ09NUE9TSVRFX1JPTEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29tcG9zaXRlUm9sZUVDbGFzcywgQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRSk7Ci0KLQkJY29uY2VwdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05DRVBUKTsKLQotCQljb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlNUUkFJTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnN0cmFpbnRFQ2xhc3MsIENPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT04pOwotCi0JCWNvbnRlbnRDYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0NBVEVHT1JZKTsKLQotCQljb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSk7Ci0KLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0KLQkJY29udGVudEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19HUk9VUDEpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSk7Ci0KLQkJY29udGVudFBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50UGFja2FnZUVDbGFzcywgQ09OVEVOVF9QQUNLQUdFX19HUk9VUDIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLCBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCk7Ci0KLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1VTVE9NX0NBVEVHT1JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjdXN0b21DYXRlZ29yeUVDbGFzcywgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSk7Ci0KLQkJZGVsaXZlcmFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUkFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRUNsYXNzLCBERUxJVkVSQUJMRV9fR1JPVVAzKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZUVDbGFzcywgREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1QpOwotCi0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUkFCTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSk7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJZX1BST0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0KTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCk7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUKTsKLQotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJQkFCTEVfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywgREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04pOwotCi0JCWRlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckVDbGFzcywgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OKTsKLQotCQlkaXNjaXBsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fVEFTSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVyk7Ci0KLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkVfR1JPVVBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywgRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsIERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkUpOwotCi0JCWRvY3VtZW50Um9vdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET0NVTUVOVF9ST09UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOKTsKLQotCQlkb21haW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRE9NQUlOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb21haW5FQ2xhc3MsIERPTUFJTl9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb21haW5FQ2xhc3MsIERPTUFJTl9fV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb21haW5FQ2xhc3MsIERPTUFJTl9fU1VCRE9NQUlOKTsKLQotCQllbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMRU1FTlQpOwotCi0JCWVzdGltYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXN0aW1hdGVFQ2xhc3MsIEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXN0aW1hdGVFQ2xhc3MsIEVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQllc3RpbWF0aW5nTWV0cmljRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVTVElNQVRJTkdfTUVUUklDKTsKLQotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJZXhhbXBsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWEFNUExFKTsKLQotCQlndWlkYW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRSk7Ci0KLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQpOwotCi0JCWd1aWRlbGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlERUxJTkUpOwotCi0JCWl0ZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJVEVSQVRJT04pOwotCi0JCWtpbmRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoS0lORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoa2luZEVDbGFzcywgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCi0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSk7Ci0KLQkJbWV0aG9kRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEKTsKLQotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQltZXRob2RMaWJyYXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kTGlicmFyeUVDbGFzcywgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fVE9PTCk7Ci0KLQkJbWV0aG9kUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19HTE9CQUwpOwotCi0JCW1ldGhvZFBsdWdpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUpOwotCi0JCW1ldGhvZFVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1VOSVQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DT1BZUklHSFQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19BVVRIT1JTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19WRVJTSU9OKTsKLQotCQltaWxlc3RvbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlMRVNUT05FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtaWxlc3RvbmVFQ2xhc3MsIE1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUKTsKLQotCQluYW1lZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWRFbGVtZW50RUNsYXNzLCBOQU1FRF9FTEVNRU5UX19OQU1FKTsKLQotCQlvdXRjb21lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVENPTUUpOwotCi0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUNLQUdFQUJMRV9FTEVNRU5UKTsKLQotCQlwaGFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSEFTRSk7Ci0KLQkJcGxhbm5pbmdEYXRhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBMQU5OSU5HX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKHBsYW5uaW5nRGF0YUVDbGFzcywgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBsYW5uaW5nRGF0YUVDbGFzcywgUExBTk5JTkdfREFUQV9fUkFOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFKTsKLQotCQlwcmFjdGljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkFDVElDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRSk7Ci0KLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkFDVElDRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSk7Ci0KLQkJcHJvY2Vzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRUNsYXNzLCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRUNsYXNzLCBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RJQUdSQU1fVVJJKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04pOwotCi0JCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCi0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTKTsKLQotCQlwcm9jZXNzRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0VMRU1FTlQpOwotCi0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsIFBST0NFU1NfUEFDS0FHRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGFja2FnZUVDbGFzcywgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQpOwotCi0JCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1MpOwotCi0JCXJlcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVBPUlQpOwotCi0JCXJldXNhYmxlQXNzZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVVU0FCTEVfQVNTRVQpOwotCi0JCXJvYWRtYXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9BRE1BUCk7Ci0KLQkJcm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRUNsYXNzLCBST0xFX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVFQ2xhc3MsIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyk7Ci0KLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCi0JCXJvbGVTZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRFQ2xhc3MsIFJPTEVfU0VUX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRFQ2xhc3MsIFJPTEVfU0VUX19ST0xFKTsKLQotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVRfR1JPVVBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQpOwotCi0JCXNlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU1VCX1NFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1BSRURFQ0VTU09SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU0VDVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFKTsKLQotCQlzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1VQUE9SVElOR19NQVRFUklBTCk7Ci0KLQkJdGFza0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1BPU1RDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX09VVFBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX0VTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19UT09MX01FTlRPUik7Ci0KLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCi0JCXRhc2tEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fVEFTSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fU1RFUCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQl0ZWFtUHJvZmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURUFNX1BST0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRlYW1Qcm9maWxlRUNsYXNzLCBURUFNX1BST0ZJTEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VCX1RFQU0pOwotCi0JCXRlbXBsYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFTVBMQVRFKTsKLQotCQl0ZXJtRGVmaW5pdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVJNX0RFRklOSVRJT04pOwotCi0JCXRvb2xFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodG9vbEVDbGFzcywgVE9PTF9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0b29sRUNsYXNzLCBUT09MX19UT09MX01FTlRPUik7Ci0KLQkJdG9vbE1lbnRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUT09MX01FTlRPUik7Ci0KLQkJd2hpdGVwYXBlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXSElURVBBUEVSKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSk7Ci0KLQkJd29ya0RlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19ERUZJTklUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCi0JCXdvcmtPcmRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX09SREVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX0xJTktfVFlQRSk7Ci0KLQkJd29ya1Byb2R1Y3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX0VTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19SRVBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19UT09MX01FTlRPUik7Ci0KLQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyk7Ci0KLQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE8pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE8pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFKTsKLQotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywgV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCBXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJdmFyaWFiaWxpdHlUeXBlRUVudW0gPSBjcmVhdGVFRW51bShWQVJJQUJJTElUWV9UWVBFKTsKLQkJd29ya09yZGVyVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oV09SS19PUkRFUl9UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQl2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVkFSSUFCSUxJVFlfVFlQRV9PQkpFQ1QpOwotCQl3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFdPUktfT1JERVJfVFlQRV9PQkpFQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQljYXBhYmlsaXR5UGF0dGVybkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCWNoZWNrbGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQljb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCWNvbmNlcHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJY29uc3RyYWludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRDYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQljb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJZGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJZGlzY2lwbGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkb21haW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWVzdGltYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWVzdGltYXRpbmdNZXRyaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWV4YW1wbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZ3VpZGFuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJZ3VpZGVsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWl0ZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlraW5kRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1pbGVzdG9uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQluYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbGVtZW50KCkpOwotCQlvdXRjb21lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJcGhhc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXByYWN0aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXByb2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NQYWNrYWdlKCkpOwotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlyZXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcmV1c2FibGVBc3NldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyb2FkbWFwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCXJvbGVTZXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJc2VjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl0YXNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0ZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl0ZXJtRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl0b29sRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQl0b29sTWVudG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXdoaXRlcGFwZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb25jZXB0KCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlFQ2xhc3MsIEFjdGl2aXR5LmNsYXNzLCAiQWN0aXZpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicG9zdGNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSwgdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCksIG51bGwsICJicmVha2Rvd25FbGVtZW50IiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Sb2FkbWFwKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9hZG1hcCIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzRW5hY3RhYmxlIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCksIHRoaXMuZ2V0VmFyaWFiaWxpdHlUeXBlKCksICJ2YXJpYWJpbGl0eVR5cGUiLCAibmEiLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIkFjdGl2aXR5RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWx0ZXJuYXRpdmVzIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaG93VG9TdGFmZiIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1cnBvc2UiLCBudWxsLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MsIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmNsYXNzLCAiQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1ByaW1hcnlFeHRlbnNpb24iLCBudWxsLCAwLCAxLCBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXJ0aWZhY3RFQ2xhc3MsIEFydGlmYWN0LmNsYXNzLCAiQXJ0aWZhY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0X0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIEFydGlmYWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKSwgdGhpcy5nZXRBcnRpZmFjdCgpLCBudWxsLCAiY29udGFpbmVkQXJ0aWZhY3QiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAiQXJ0aWZhY3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJicmllZk91dGxpbmUiLCBudWxsLCAwLCAxLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlcHJlc2VudGF0aW9uT3B0aW9ucyIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXByZXNlbnRhdGlvbiIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJub3RhdGlvbiIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAiQnJlYWtkb3duRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZXNlbnRlZEFmdGVyIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVzZW50ZWRCZWZvcmUiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBsYW5uaW5nRGF0YSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cGVyQWN0aXZpdHkiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoZWNrbGlzdCIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29uY2VwdCIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJndWlkZWxpbmUiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJldXNhYmxlQXNzZXQiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VwcG9ydGluZ01hdGVyaWFsIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1doaXRlcGFwZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3aGl0ZXBhcGVyIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzT3B0aW9uYWwiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzUGxhbm5lZCIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVmaXgiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MsICJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidXNhZ2VHdWlkYW5jZSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLCBDYXBhYmlsaXR5UGF0dGVybi5jbGFzcywgIkNhcGFiaWxpdHlQYXR0ZXJuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY2hlY2tsaXN0RUNsYXNzLCBDaGVja2xpc3QuY2xhc3MsICJDaGVja2xpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjb21wb3NpdGVSb2xlRUNsYXNzLCBDb21wb3NpdGVSb2xlLmNsYXNzLCAiQ29tcG9zaXRlUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBDb21wb3NpdGVSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpLCB0aGlzLmdldFJvbGUoKSwgbnVsbCwgImFnZ3JlZ2F0ZWRSb2xlIiwgbnVsbCwgMCwgLTEsIENvbXBvc2l0ZVJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb25jZXB0RUNsYXNzLCBDb25jZXB0LmNsYXNzLCAiQ29uY2VwdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbnN0cmFpbnRFQ2xhc3MsIENvbnN0cmFpbnQuY2xhc3MsICJDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1haW5EZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50Q2F0ZWdvcnlFQ2xhc3MsIENvbnRlbnRDYXRlZ29yeS5jbGFzcywgIkNvbnRlbnRDYXRlZ29yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsICJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpLCB0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLCBudWxsLCAiY29udGVudENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIkNvbnRlbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1haW5EZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAia2V5Q29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAxLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCksIHRoaXMuZ2V0U2VjdGlvbigpLCBudWxsLCAic2VjdGlvbiIsIG51bGwsIDAsIC0xLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXh0ZXJuYWxJZCIsIG51bGwsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDb250ZW50RWxlbWVudC5jbGFzcywgIkNvbnRlbnRFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoZWNrbGlzdCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb25jZXB0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4YW1wbGUiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJndWlkZWxpbmUiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2FibGVBc3NldCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cHBvcnRpbmdNYXRlcmlhbCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3aGl0ZXBhcGVyIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAwLCAxLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksIHRoaXMuZ2V0VmFyaWFiaWxpdHlUeXBlKCksICJ2YXJpYWJpbGl0eVR5cGUiLCAibmEiLCAwLCAxLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29udGVudFBhY2thZ2VFQ2xhc3MsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCAiQ29udGVudFBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKSwgdGhpcy5nZXRDb250ZW50RWxlbWVudCgpLCBudWxsLCAiY29udGVudEVsZW1lbnQiLCBudWxsLCAwLCAtMSwgQ29udGVudFBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjdXN0b21DYXRlZ29yeUVDbGFzcywgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICJDdXN0b21DYXRlZ29yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRlZ29yaXplZEVsZW1lbnQiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1YkNhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlbGl2ZXJhYmxlRUNsYXNzLCBEZWxpdmVyYWJsZS5jbGFzcywgIkRlbGl2ZXJhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyYWJsZV9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBEZWxpdmVyYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVsaXZlcmVkV29ya1Byb2R1Y3QiLCBudWxsLCAwLCAtMSwgRGVsaXZlcmFibGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywgIkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4dGVybmFsRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGFja2FnaW5nR3VpZGFuY2UiLCBudWxsLCAwLCAxLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICJEZWxpdmVyeVByb2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwNCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbW11bmljYXRpb25zTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZWR1Y2F0aW9uTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjYWxlIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJpc2tMZXZlbCIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGluZ1RlY2huaXF1ZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvamVjdE1lbWJlckV4cGVydGlzZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGVPZkNvbnRyYWN0IiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIkRlc2NyaWJhYmxlRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpLCB0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpLCBudWxsLCAicHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfRnVsZmlsbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImZ1bGZpbGwiLCBudWxsLCAwLCAtMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNBYnN0cmFjdCIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJub2RlaWNvbiIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNoYXBlaWNvbiIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0b3JFQ2xhc3MsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IuY2xhc3MsICJEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLCBudWxsLCAwLCAxLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmluZWREZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRpc2NpcGxpbmVFQ2xhc3MsIERpc2NpcGxpbmUuY2xhc3MsICJEaXNjaXBsaW5lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lX1Rhc2soKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0YXNrIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKSwgdGhpcy5nZXREaXNjaXBsaW5lKCksIG51bGwsICJzdWJEaXNjaXBsaW5lIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZWZlcmVuY2VXb3JrZmxvdyIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCAiRGlzY2lwbGluZUdyb3VwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaXNjaXBsaW5lIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmVHcm91cGluZy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkb2N1bWVudFJvb3RFQ2xhc3MsIERvY3VtZW50Um9vdC5jbGFzcywgIkRvY3VtZW50Um9vdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4U0lTY2hlbWFMb2NhdGlvbiIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9NZXRob2RDb25maWd1cmF0aW9uKCksIHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLCBudWxsLCAibWV0aG9kQ29uZmlndXJhdGlvbiIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpLCB0aGlzLmdldE1ldGhvZExpYnJhcnkoKSwgbnVsbCwgIm1ldGhvZExpYnJhcnkiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpLCB0aGlzLmdldE1ldGhvZFBsdWdpbigpLCBudWxsLCAibWV0aG9kUGx1Z2luIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkb21haW5FQ2xhc3MsIERvbWFpbi5jbGFzcywgIkRvbWFpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9tYWluX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERvbWFpbl9Xb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtQcm9kdWN0IiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvbWFpbl9TdWJkb21haW4oKSwgdGhpcy5nZXREb21haW4oKSwgbnVsbCwgInN1YmRvbWFpbiIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbGVtZW50RUNsYXNzLCBFbGVtZW50LmNsYXNzLCAiRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGVzdGltYXRlRUNsYXNzLCBFc3RpbWF0ZS5jbGFzcywgIkVzdGltYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFc3RpbWF0ZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBFc3RpbWF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW9uTWV0cmljIiwgbnVsbCwgMCwgLTEsIEVzdGltYXRlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIEVzdGltYXRlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVzdGltYXRpbmdNZXRyaWNFQ2xhc3MsIEVzdGltYXRpbmdNZXRyaWMuY2xhc3MsICJFc3RpbWF0aW5nTWV0cmljIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLCBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuY2xhc3MsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhleGFtcGxlRUNsYXNzLCBFeGFtcGxlLmNsYXNzLCAiRXhhbXBsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGd1aWRhbmNlRUNsYXNzLCBHdWlkYW5jZS5jbGFzcywgIkd1aWRhbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywgR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcywgIkd1aWRhbmNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dGFjaG1lbnQiLCBudWxsLCAwLCAxLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZ3VpZGVsaW5lRUNsYXNzLCBHdWlkZWxpbmUuY2xhc3MsICJHdWlkZWxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpdGVyYXRpb25FQ2xhc3MsIEl0ZXJhdGlvbi5jbGFzcywgIkl0ZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGtpbmRFQ2xhc3MsIEtpbmQuY2xhc3MsICJLaW5kIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLCBudWxsLCAwLCAtMSwgS2luZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAiTWV0aG9kQ29uZmlndXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJhc2VDb25maWd1cmF0aW9uIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1ldGhvZFBsdWdpblNlbGVjdGlvbiIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlZmF1bHRWaWV3IiwgbnVsbCwgMCwgMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2Nlc3NWaWV3IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1YnRyYWN0ZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWRkZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICJNZXRob2RFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKSwgdGhpcy5nZXRDb25zdHJhaW50KCksIG51bGwsICJvd25lZFJ1bGUiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSwgbnVsbCwgIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJicmllZkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3JkZXJpbmdHdWlkZSIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZXNlbnRhdGlvbk5hbWUiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAic3VwcHJlc3NlZCIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywgTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCAiTWV0aG9kRWxlbWVudFByb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1ldGhvZExpYnJhcnkuY2xhc3MsICJNZXRob2RMaWJyYXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpLCB0aGlzLmdldE1ldGhvZFBsdWdpbigpLCBudWxsLCAibWV0aG9kUGx1Z2luIiwgbnVsbCwgMCwgLTEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpLCB0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgIm1ldGhvZENvbmZpZ3VyYXRpb24iLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbCIsIG51bGwsIDAsIDEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQYWNrYWdlRUNsYXNzLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAiTWV0aG9kUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2VkUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGFja2FnZV9NZXRob2RQYWNrYWdlKCksIHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLCBudWxsLCAibWV0aG9kUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJnbG9iYWwiLCBudWxsLCAwLCAxLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQbHVnaW5FQ2xhc3MsIE1ldGhvZFBsdWdpbi5jbGFzcywgIk1ldGhvZFBsdWdpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCksIHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLCBudWxsLCAibWV0aG9kUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJ1c2VyQ2hhbmdlYWJsZSIsIG51bGwsIDAsIDEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kVW5pdEVDbGFzcywgTWV0aG9kVW5pdC5jbGFzcywgIk1ldGhvZFVuaXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29weXJpZ2h0IiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXV0aG9ycyIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjaGFuZ2VEZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWlsZXN0b25lRUNsYXNzLCBNaWxlc3RvbmUuY2xhc3MsICJNaWxlc3RvbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlcXVpcmVkUmVzdWx0IiwgbnVsbCwgMCwgLTEsIE1pbGVzdG9uZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhuYW1lZEVsZW1lbnRFQ2xhc3MsIE5hbWVkRWxlbWVudC5jbGFzcywgIk5hbWVkRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTmFtZWRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mob3V0Y29tZUVDbGFzcywgT3V0Y29tZS5jbGFzcywgIk91dGNvbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MsIFBhY2thZ2VhYmxlRWxlbWVudC5jbGFzcywgIlBhY2thZ2VhYmxlRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBoYXNlRUNsYXNzLCBQaGFzZS5jbGFzcywgIlBoYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocGxhbm5pbmdEYXRhRUNsYXNzLCBQbGFubmluZ0RhdGEuY2xhc3MsICJQbGFubmluZ0RhdGEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldERhdGVUaW1lKCksICJmaW5pc2hEYXRlIiwgbnVsbCwgMCwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQbGFubmluZ0RhdGFfUmFuaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJhbmsiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgInN0YXJ0RGF0ZSIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByYWN0aWNlRUNsYXNzLCBQcmFjdGljZS5jbGFzcywgIlByYWN0aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWN0aXZpdHlSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29udGVudFJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByYWN0aWNlX1N1YlByYWN0aWNlKCksIHRoaXMuZ2V0UHJhY3RpY2UoKSwgbnVsbCwgInN1YlByYWN0aWNlIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIlByYWN0aWNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRpdGlvbmFsSW5mbyIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhcHBsaWNhdGlvbiIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJhY2tncm91bmQiLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZ29hbHMiLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJsZXZlbHNPZkFkb3B0aW9uIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvYmxlbSIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzRUNsYXNzLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzLmNsYXNzLCAiUHJvY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbmNsdWRlc1BhdHRlcm4iLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWZhdWx0Q29udGV4dCIsIG51bGwsIDAsIDEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsaWRDb250ZXh0IiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzX0RpYWdyYW1VUkkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaWFncmFtVVJJIiwgbnVsbCwgMCwgMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICJQcm9jZXNzQ29tcG9uZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvcHlyaWdodCIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCksIHRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpLCBudWxsLCAiaW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksIHRoaXMuZ2V0UHJvY2VzcygpLCBudWxsLCAicHJvY2VzcyIsIG51bGwsIDEsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF1dGhvcnMiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgImNoYW5nZURhdGUiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hhbmdlRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb24oKSwgdGhpcy5nZXRUYXNrRGVzY3JpcHRvcigpLCBudWxsLCAiaW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCksIHRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksIG51bGwsICJpbnRlcmZhY2VJTyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICJQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjb3BlIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInVzYWdlTm90ZXMiLCBudWxsLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzRWxlbWVudEVDbGFzcywgUHJvY2Vzc0VsZW1lbnQuY2xhc3MsICJQcm9jZXNzRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIlByb2Nlc3NQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCksIHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSwgbnVsbCwgInByb2Nlc3NFbGVtZW50IiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCAiUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwNCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXA0IiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJiYXNlUHJvY2VzcyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZXBvcnRFQ2xhc3MsIFJlcG9ydC5jbGFzcywgIlJlcG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHJldXNhYmxlQXNzZXRFQ2xhc3MsIFJldXNhYmxlQXNzZXQuY2xhc3MsICJSZXVzYWJsZUFzc2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mocm9hZG1hcEVDbGFzcywgUm9hZG1hcC5jbGFzcywgIlJvYWRtYXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlRUNsYXNzLCBSb2xlLmNsYXNzLCAiUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3BvbnNpYmxlRm9yIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICJSb2xlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFzc2lnbm1lbnRBcHByb2FjaGVzIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2tpbGxzIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzeW5vbnltcyIsIG51bGwsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIlJvbGVEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZSIsIG51bGwsIDAsIDEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3BvbnNpYmxlRm9yIiwgbnVsbCwgMCwgLTEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVTZXRFQ2xhc3MsIFJvbGVTZXQuY2xhc3MsICJSb2xlU2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0X0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0X1JvbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2xlIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsICJSb2xlU2V0R3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvbGVTZXQiLCBudWxsLCAwLCAtMSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlY3Rpb25FQ2xhc3MsIFNlY3Rpb24uY2xhc3MsICJTZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN0aW9uX1N1YlNlY3Rpb24oKSwgdGhpcy5nZXRTZWN0aW9uKCksIG51bGwsICJzdWJTZWN0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWRlY2Vzc29yIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNlY3Rpb25OYW1lIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCksIHRoaXMuZ2V0VmFyaWFiaWxpdHlUeXBlKCksICJ2YXJpYWJpbGl0eVR5cGUiLCAibmEiLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MsIFN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgIlN1cHBvcnRpbmdNYXRlcmlhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHRhc2tFQ2xhc3MsIFRhc2suY2xhc3MsICJUYXNrIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX1ByZWNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUG9zdGNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBvc3Rjb25kaXRpb24iLCBudWxsLCAwLCAxLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX1BlcmZvcm1lZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGVyZm9ybWVkQnkiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYW5kYXRvcnlJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19PdXRwdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19PcHRpb25hbElucHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Fc3RpbWF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRlIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Ub29sTWVudG9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbE1lbnRvciIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAiVGFza0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWx0ZXJuYXRpdmVzIiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1cnBvc2UiLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YXNrRGVzY3JpcHRvckVDbGFzcywgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICJUYXNrRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhc2siLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwZXJmb3JtZWRQcmltYXJpbHlCeSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXNzaXN0ZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleHRlcm5hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYW5kYXRvcnlJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcHRpb25hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpLCB0aGlzLmdldFNlY3Rpb24oKSwgbnVsbCwgInN0ZXAiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGVhbVByb2ZpbGVFQ2xhc3MsIFRlYW1Qcm9maWxlLmNsYXNzLCAiVGVhbVByb2ZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGVhbVByb2ZpbGVfUm9sZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvbGUiLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdXBlclRlYW0iLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3ViVGVhbSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0ZW1wbGF0ZUVDbGFzcywgVGVtcGxhdGUuY2xhc3MsICJUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHRlcm1EZWZpbml0aW9uRUNsYXNzLCBUZXJtRGVmaW5pdGlvbi5jbGFzcywgIlRlcm1EZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModG9vbEVDbGFzcywgVG9vbC5jbGFzcywgIlRvb2wiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRvb2xfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVG9vbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRvb2xfVG9vbE1lbnRvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRvb2xNZW50b3IiLCBudWxsLCAwLCAtMSwgVG9vbC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0b29sTWVudG9yRUNsYXNzLCBUb29sTWVudG9yLmNsYXNzLCAiVG9vbE1lbnRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdoaXRlcGFwZXJFQ2xhc3MsIFdoaXRlcGFwZXIuY2xhc3MsICJXaGl0ZXBhcGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAiV29ya0JyZWFrZG93bkVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSwgdGhpcy5nZXRXb3JrT3JkZXIoKSwgbnVsbCwgInByZWRlY2Vzc29yIiwgbnVsbCwgMCwgLTEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzRXZlbnREcml2ZW4iLCBudWxsLCAwLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNPbmdvaW5nIiwgbnVsbCwgMCwgMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzUmVwZWF0YWJsZSIsIG51bGwsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV29ya0RlZmluaXRpb24uY2xhc3MsICJXb3JrRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwb3N0Y29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrT3JkZXJFQ2xhc3MsIFdvcmtPcmRlci5jbGFzcywgIldvcmtPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya09yZGVyX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtPcmRlcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSwgdGhpcy5nZXRXb3JrT3JkZXJUeXBlKCksICJsaW5rVHlwZSIsICJmaW5pc2hUb1N0YXJ0IiwgMCwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdEVDbGFzcywgV29ya1Byb2R1Y3QuY2xhc3MsICJXb3JrUHJvZHVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRlIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVwb3J0IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0ZW1wbGF0ZSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0b29sTWVudG9yIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaW1wYWN0T2ZOb3RIYXZpbmciLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwdXJwb3NlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlYXNvbnNGb3JOb3ROZWVkaW5nIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JrUHJvZHVjdCIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3BvbnNpYmxlUm9sZSIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleHRlcm5hbElucHV0VG8iLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbXBhY3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaW1wYWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hbmRhdG9yeUlucHV0VG8iLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9wdGlvbmFsSW5wdXRUbyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm91dHB1dEZyb20iLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWxpdmVyYWJsZVBhcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3Rpdml0eUVudHJ5U3RhdGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2aXR5RXhpdFN0YXRlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICJXb3JrUHJvZHVjdFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JrUHJvZHVjdCIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bSh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLmNsYXNzLCAiVmFyaWFiaWxpdHlUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpOwotCi0JCWluaXRFRW51bSh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuY2xhc3MsICJXb3JrT3JkZXJUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZSh2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUsIFZhcmlhYmlsaXR5VHlwZS5jbGFzcywgIlZhcmlhYmlsaXR5VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZSh3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlLCBXb3JrT3JkZXJUeXBlLmNsYXNzLCAiV29ya09yZGVyVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYWN0aXZpdHlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFjdGl2aXR5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQnJlYWtkb3duRWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Sb2FkbWFwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvYWRtYXAiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJJc0VuYWN0YWJsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFjdGl2aXR5RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBbHRlcm5hdGl2ZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJIb3dUb1N0YWZmIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHVycG9zZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzUHJpbWFyeUV4dGVuc2lvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXJ0aWZhY3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFydGlmYWN0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdF9Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRhaW5lZEFydGlmYWN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJBcnRpZmFjdERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQnJpZWZPdXRsaW5lIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXByZXNlbnRhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk5vdGF0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChicmVha2Rvd25FbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJCcmVha2Rvd25FbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRlZEFmdGVyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRlZEJlZm9yZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQbGFubmluZ0RhdGEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1cGVyQWN0aXZpdHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNoZWNrbGlzdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29uY2VwdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXhhbXBsZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJHdWlkZWxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJldXNhYmxlQXNzZXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfV2hpdGVwYXBlcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXaGl0ZXBhcGVyIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc09wdGlvbmFsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzUGxhbm5lZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJwcmVmaXgiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ1c2FnZUd1aWRhbmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjYXBhYmlsaXR5UGF0dGVybkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ2FwYWJpbGl0eVBhdHRlcm4iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjaGVja2xpc3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNoZWNrbGlzdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbXBvc2l0ZVJvbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbXBvc2l0ZVJvbGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDozMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFnZ3JlZ2F0ZWRSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb25jZXB0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb25jZXB0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29uc3RyYWludEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29uc3RyYWludCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibWFpbkRlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb250ZW50Q2F0ZWdvcnlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb250ZW50Q2F0ZWdvcnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNYWluRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJLZXlDb25zaWRlcmF0aW9ucyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTZWN0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImV4dGVybmFsSWQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb250ZW50RWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfR3JvdXAxKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29uY2VwdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkV4YW1wbGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJldXNhYmxlQXNzZXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1cHBvcnRpbmdNYXRlcmlhbCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldoaXRlcGFwZXIiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb250ZW50UGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudFBhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29udGVudEVsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDdXN0b21DYXRlZ29yeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2F0ZWdvcml6ZWRFbGVtZW50IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YkNhdGVnb3J5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyYWJsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcmFibGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJhYmxlX0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVsaXZlcmVkV29ya1Byb2R1Y3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXh0ZXJuYWxEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQYWNrYWdpbmdHdWlkYW5jZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZWxpdmVyeVByb2Nlc3MiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjQ3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbW11bmljYXRpb25zTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NDciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVkdWNhdGlvbk1hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjQ3IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTY2FsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmlza0xldmVsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpbmdUZWNobmlxdWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvamVjdE1lbWJlckV4cGVydGlzZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVHlwZU9mQ29udHJhY3QiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpYmFibGVFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmliYWJsZUVsZW1lbnRfRnVsZmlsbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJGdWxmaWxsIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9Jc0Fic3RyYWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNBYnN0cmFjdCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibm9kZWljb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzaGFwZWljb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVmaW5lZERlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkaXNjaXBsaW5lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEaXNjaXBsaW5lIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9UYXNrKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRhc2siLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YkRpc2NpcGxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZWZlcmVuY2VXb3JrZmxvdyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEaXNjaXBsaW5lR3JvdXBpbmciLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZG9jdW1lbnRSb290RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICIiLAotCQkJICJraW5kIiwgIm1peGVkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NaXhlZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50V2lsZGNhcmQiLAotCQkJICJuYW1lIiwgIjptaXhlZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ4bWxuczpwcmVmaXgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAieHNpOnNjaGVtYUxvY2F0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RDb25maWd1cmF0aW9uIiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RMaWJyYXJ5IiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpbiIsCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZG9tYWluRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEb21haW4iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9Xb3JrUHJvZHVjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb21haW5fU3ViZG9tYWluKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YmRvbWFpbiIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVzdGltYXRlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXN0aW1hdGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpb25NZXRyaWMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGluZ01ldHJpY0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXN0aW1hdGluZ01ldHJpYyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXhhbXBsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXhhbXBsZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGd1aWRhbmNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJHdWlkYW5jZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRhbmNlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQXR0YWNobWVudCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGVsaW5lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJHdWlkZWxpbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChpdGVyYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkl0ZXJhdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoa2luZEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiS2luZCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kQ29uZmlndXJhdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCYXNlQ29uZmlndXJhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWZhdWx0VmlldyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2Nlc3NWaWV3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YnRyYWN0ZWRDYXRlZ29yeSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkZWRDYXRlZ29yeSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3duZWRSdWxlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kRWxlbWVudFByb3BlcnR5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImJyaWVmRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZEVsZW1lbnRfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAib3JkZXJpbmdHdWlkZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAicHJlc2VudGF0aW9uTmFtZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAic3VwcHJlc3NlZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFsdWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZExpYnJhcnlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZExpYnJhcnkiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidG9vbCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kUGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kUGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJldXNlZFBhY2thZ2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6OSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGFja2FnZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImdsb2JhbCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kUGx1Z2luRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RQbHVnaW4iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGFja2FnZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ1c2VyQ2hhbmdlYWJsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kVW5pdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kVW5pdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29weXJpZ2h0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0F1dGhvcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJhdXRob3JzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEYXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY2hhbmdlRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZlcnNpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1pbGVzdG9uZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWlsZXN0b25lIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVxdWlyZWRSZXN1bHQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG5hbWVkRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTmFtZWRFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXROYW1lZEVsZW1lbnRfTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgIm5hbWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG91dGNvbWVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk91dGNvbWUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlBhY2thZ2VhYmxlRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBoYXNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQaGFzZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBsYW5uaW5nRGF0YUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUGxhbm5pbmdEYXRhIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJmaW5pc2hEYXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQbGFubmluZ0RhdGFfUmFuaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInJhbmsiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzdGFydERhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByYWN0aWNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcmFjdGljZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBY3Rpdml0eVJlZmVyZW5jZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRlbnRSZWZlcmVuY2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViUHJhY3RpY2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByYWN0aWNlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxJbmZvIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFwcGxpY2F0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQmFja2dyb3VuZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJHb2FscyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkxldmVsc09mQWRvcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9ibGVtIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbmNsdWRlc1BhdHRlcm4iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWZhdWx0Q29udGV4dCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJWYWxpZENvbnRleHQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NfRGlhZ3JhbVVSSSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImRpYWdyYW1VUkkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3NDb21wb25lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvcHlyaWdodCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbnRlcmZhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2Nlc3MiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImF1dGhvcnMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW50ZXJmYWNlSU8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0Rlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNjb3BlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJVc2FnZU5vdGVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0VsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzUGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc1BhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvY2Vzc0VsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDo0NyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCYXNlUHJvY2VzcyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo0NyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVwb3J0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSZXBvcnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXVzYWJsZUFzc2V0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSZXVzYWJsZUFzc2V0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9hZG1hcEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9hZG1hcCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlc3BvbnNpYmxlRm9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBc3NpZ25tZW50QXBwcm9hY2hlcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTa2lsbHMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTeW5vbnltcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZURlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVEZXNjcmlwdG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVzcG9uc2libGVGb3IiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVTZXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVTZXQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlU2V0X1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZVNldEdyb3VwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSb2xlU2V0R3JvdXBpbmciLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvbGVTZXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlY3Rpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlNlY3Rpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fU3ViU2VjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJTZWN0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlZGVjZXNzb3IiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzZWN0aW9uTmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlN1cHBvcnRpbmdNYXRlcmlhbCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRhc2siLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUHJlY29uZGl0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZWNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX1BlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBlcmZvcm1lZEJ5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1hbmRhdG9yeUlucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfT3V0cHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk91dHB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPcHRpb25hbElucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfRXN0aW1hdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRhc2tEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWx0ZXJuYXRpdmVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQdXJwb3NlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0YXNrRGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFza0Rlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGFzayIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQZXJmb3JtZWRQcmltYXJpbHlCeSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQXNzaXN0ZWRCeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkV4dGVybmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWFuZGF0b3J5SW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPcHRpb25hbElucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPdXRwdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdGVwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVhbVByb2ZpbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlYW1Qcm9maWxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUZWFtUHJvZmlsZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwZXJUZWFtIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViVGVhbSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVtcGxhdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlbXBsYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVybURlZmluaXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlcm1EZWZpbml0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodG9vbEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVG9vbCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VG9vbF9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRvb2xfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0b29sTWVudG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodmFyaWFiaWxpdHlUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlZhcmlhYmlsaXR5VHlwZTpPYmplY3QiLAotCQkJICJiYXNlVHlwZSIsICJWYXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdoaXRlcGFwZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldoaXRlcGFwZXIiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya0JyZWFrZG93bkVsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlZGVjZXNzb3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc0V2ZW50RHJpdmVuIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc09uZ29pbmciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzUmVwZWF0YWJsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya0RlZmluaXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtEZWZpbml0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya09yZGVyRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrT3JkZXIiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrT3JkZXJfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiOjAiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya09yZGVyX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaWQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImxpbmtUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrT3JkZXJUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtPcmRlclR5cGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya09yZGVyVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya09yZGVyVHlwZTpPYmplY3QiLAotCQkJICJiYXNlVHlwZSIsICJXb3JrT3JkZXJUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrUHJvZHVjdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3QiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVwb3J0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRlbXBsYXRlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVG9vbE1lbnRvciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW1wYWN0T2ZOb3RIYXZpbmciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQdXJwb3NlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlYXNvbnNGb3JOb3ROZWVkaW5nIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0RGVzY3JpcHRvciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVzcG9uc2libGVSb2xlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXh0ZXJuYWxJbnB1dFRvIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkltcGFjdGVkQnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW1wYWN0cyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNYW5kYXRvcnlJbnB1dFRvIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3B0aW9uYWxJbnB1dFRvIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk91dHB1dEZyb20iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVsaXZlcmFibGVQYXJ0cyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImFjdGl2aXR5RW50cnlTdGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYWN0aXZpdHlFeGl0U3RhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3RUeXBlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwotCX0KLQotfSAvL1VtYVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV2hpdGVwYXBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlMDczOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXaGl0ZXBhcGVySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXaGl0ZXBhcGVySW1wbCBleHRlbmRzIENvbmNlcHRJbXBsIGltcGxlbWVudHMgV2hpdGVwYXBlciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCX0KLQotfSAvL1doaXRlcGFwZXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ2ZWFkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRXZlbnREcml2ZW4oKSA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFdmVudERyaXZlbiA9IElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRXZlbnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V2ZW50RHJpdmVuRVNldDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzT25nb2luZygpIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX09OR09JTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZ29pbmcgPSBJU19PTkdPSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBPbmdvaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZ29pbmdFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNSZXBlYXRhYmxlKCkgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfUkVQRUFUQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFJlcGVhdGFibGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVwZWF0YWJsZUVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxXb3JrT3JkZXI+IGdldFByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiBpc0V2ZW50RHJpdmVuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzRXZlbnREcml2ZW4oYm9vbGVhbiBuZXdJc0V2ZW50RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkSXNFdmVudERyaXZlbiA9IGlzRXZlbnREcml2ZW47Ci0JCWlzRXZlbnREcml2ZW4gPSBuZXdJc0V2ZW50RHJpdmVuOwotCQlib29sZWFuIG9sZElzRXZlbnREcml2ZW5FU2V0ID0gaXNFdmVudERyaXZlbkVTZXQ7Ci0JCWlzRXZlbnREcml2ZW5FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sIG9sZElzRXZlbnREcml2ZW4sIGlzRXZlbnREcml2ZW4sICFvbGRJc0V2ZW50RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNFdmVudERyaXZlbigpIHsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuID0gaXNFdmVudERyaXZlbjsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuRVNldCA9IGlzRXZlbnREcml2ZW5FU2V0OwotCQlpc0V2ZW50RHJpdmVuID0gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUOwotCQlpc0V2ZW50RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOLCBvbGRJc0V2ZW50RHJpdmVuLCBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQsIG9sZElzRXZlbnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gaXNFdmVudERyaXZlbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbmdvaW5nKGJvb2xlYW4gbmV3SXNPbmdvaW5nKSB7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlpc09uZ29pbmcgPSBuZXdJc09uZ29pbmc7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nRVNldCA9IGlzT25nb2luZ0VTZXQ7Ci0JCWlzT25nb2luZ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcsIG9sZElzT25nb2luZywgaXNPbmdvaW5nLCAhb2xkSXNPbmdvaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNPbmdvaW5nKCkgewotCQlib29sZWFuIG9sZElzT25nb2luZyA9IGlzT25nb2luZzsKLQkJYm9vbGVhbiBvbGRJc09uZ29pbmdFU2V0ID0gaXNPbmdvaW5nRVNldDsKLQkJaXNPbmdvaW5nID0gSVNfT05HT0lOR19FREVGQVVMVDsKLQkJaXNPbmdvaW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywgb2xkSXNPbmdvaW5nLCBJU19PTkdPSU5HX0VERUZBVUxULCBvbGRJc09uZ29pbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gaXNSZXBlYXRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzUmVwZWF0YWJsZShib29sZWFuIG5ld0lzUmVwZWF0YWJsZSkgewotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZSA9IGlzUmVwZWF0YWJsZTsKLQkJaXNSZXBlYXRhYmxlID0gbmV3SXNSZXBlYXRhYmxlOwotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZUVTZXQgPSBpc1JlcGVhdGFibGVFU2V0OwotCQlpc1JlcGVhdGFibGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFLCBvbGRJc1JlcGVhdGFibGUsIGlzUmVwZWF0YWJsZSwgIW9sZElzUmVwZWF0YWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzUmVwZWF0YWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRJc1JlcGVhdGFibGUgPSBpc1JlcGVhdGFibGU7Ci0JCWJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlRVNldCA9IGlzUmVwZWF0YWJsZUVTZXQ7Ci0JCWlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0JCWlzUmVwZWF0YWJsZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUsIG9sZElzUmVwZWF0YWJsZSwgSVNfUkVQRUFUQUJMRV9FREVGQVVMVCwgb2xkSXNSZXBlYXRhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gaXNSZXBlYXRhYmxlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByZWRlY2Vzc29yKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXJldHVybiBpc0lzRXZlbnREcml2ZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlyZXR1cm4gaXNJc09uZ29pbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCQlyZXR1cm4gaXNJc1JlcGVhdGFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I6Ci0JCQkJZ2V0UHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJCWdldFByZWRlY2Vzc29yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrT3JkZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXNldElzRXZlbnREcml2ZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQkJc2V0SXNPbmdvaW5nKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXNldElzUmVwZWF0YWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlnZXRQcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCQl1bnNldElzRXZlbnREcml2ZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQl1bnNldElzT25nb2luZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXVuc2V0SXNSZXBlYXRhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gIWdldFByZWRlY2Vzc29yKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNTZXRJc0V2ZW50RHJpdmVuKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlyZXR1cm4gaXNTZXRJc09uZ29pbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXJldHVybiBpc1NldElzUmVwZWF0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRXZlbnREcml2ZW46ICIpOwotCQlpZiAoaXNFdmVudERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQoaXNFdmVudERyaXZlbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT25nb2luZzogIik7Ci0JCWlmIChpc09uZ29pbmdFU2V0KSByZXN1bHQuYXBwZW5kKGlzT25nb2luZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzUmVwZWF0YWJsZTogIik7Ci0JCWlmIChpc1JlcGVhdGFibGVFU2V0KSByZXN1bHQuYXBwZW5kKGlzUmVwZWF0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjhjMWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0RlZmluaXRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0RlZmluaXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVjb25kaXRpb24gPSBQUkVDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3N0Y29uZGl0aW9uID0gUE9TVENPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrRGVmaW5pdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIG5ld1ByZWNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlzZXRQcmVjb25kaXRpb24oUFJFQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oUE9TVENPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gUE9TVENPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcG9zdGNvbmRpdGlvbiAhPSBudWxsIDogIVBPU1RDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHBvc3Rjb25kaXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlY29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvc3Rjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvc3Rjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrRGVmaW5pdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGU2NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya09yZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya09yZGVySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya09yZGVySW1wbCBleHRlbmRzIEVEYXRhT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdvcmtPcmRlciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVHlwZSgpIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgTElOS19UWVBFX0VERUZBVUxUID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVHlwZSgpIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVyVHlwZSBsaW5rVHlwZSA9IExJTktfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGluayBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsaW5rVHlwZUVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBnZXRMaW5rVHlwZSgpIHsKLQkJcmV0dXJuIGxpbmtUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUgbmV3TGlua1R5cGUpIHsKLQkJV29ya09yZGVyVHlwZSBvbGRMaW5rVHlwZSA9IGxpbmtUeXBlOwotCQlsaW5rVHlwZSA9IG5ld0xpbmtUeXBlID09IG51bGwgPyBMSU5LX1RZUEVfRURFRkFVTFQgOiBuZXdMaW5rVHlwZTsKLQkJYm9vbGVhbiBvbGRMaW5rVHlwZUVTZXQgPSBsaW5rVHlwZUVTZXQ7Ci0JCWxpbmtUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFLCBvbGRMaW5rVHlwZSwgbGlua1R5cGUsICFvbGRMaW5rVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExpbmtUeXBlKCkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWJvb2xlYW4gb2xkTGlua1R5cGVFU2V0ID0gbGlua1R5cGVFU2V0OwotCQlsaW5rVHlwZSA9IExJTktfVFlQRV9FREVGQVVMVDsKLQkJbGlua1R5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEUsIG9sZExpbmtUeXBlLCBMSU5LX1RZUEVfRURFRkFVTFQsIG9sZExpbmtUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGlua1R5cGUoKSB7Ci0JCXJldHVybiBsaW5rVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCQlyZXR1cm4gZ2V0TGlua1R5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXNldExpbmtUeXBlKChXb3JrT3JkZXJUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQkJdW5zZXRMaW5rVHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRMaW5rVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbmtUeXBlOiAiKTsKLQkJaWYgKGxpbmtUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChsaW5rVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrT3JkZXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzRkMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW1wYWN0T2ZOb3RIYXZpbmcgPSBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYXNvbnNGb3JOb3ROZWVkaW5nID0gUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGFjdE9mTm90SGF2aW5nKCkgewotCQlyZXR1cm4gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nIG5ld0ltcGFjdE9mTm90SGF2aW5nKSB7Ci0JCVN0cmluZyBvbGRJbXBhY3RPZk5vdEhhdmluZyA9IGltcGFjdE9mTm90SGF2aW5nOwotCQlpbXBhY3RPZk5vdEhhdmluZyA9IG5ld0ltcGFjdE9mTm90SGF2aW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcsIG9sZEltcGFjdE9mTm90SGF2aW5nLCBpbXBhY3RPZk5vdEhhdmluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSB7Ci0JCXJldHVybiByZWFzb25zRm9yTm90TmVlZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFzb25zRm9yTm90TmVlZGluZyhTdHJpbmcgbmV3UmVhc29uc0Zvck5vdE5lZWRpbmcpIHsKLQkJU3RyaW5nIG9sZFJlYXNvbnNGb3JOb3ROZWVkaW5nID0gcmVhc29uc0Zvck5vdE5lZWRpbmc7Ci0JCXJlYXNvbnNGb3JOb3ROZWVkaW5nID0gbmV3UmVhc29uc0Zvck5vdE5lZWRpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORywgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcsIHJlYXNvbnNGb3JOb3ROZWVkaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJcmV0dXJuIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCQlyZXR1cm4gZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJc2V0SW1wYWN0T2ZOb3RIYXZpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCQlzZXRJbXBhY3RPZk5vdEhhdmluZyhJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJCXJldHVybiBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9PSBudWxsID8gaW1wYWN0T2ZOb3RIYXZpbmcgIT0gbnVsbCA6ICFJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVC5lcXVhbHMoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQkJcmV0dXJuIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID09IG51bGwgPyByZWFzb25zRm9yTm90TmVlZGluZyAhPSBudWxsIDogIVJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxULmVxdWFscyhyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBhY3RPZk5vdEhhdmluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYXNvbnNGb3JOb3ROZWVkaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQxNGEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldFJlc3BvbnNpYmxlUm9sZSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0RXh0ZXJuYWxJbnB1dFRvIDxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldE1hbmRhdG9yeUlucHV0VG8gPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldE9wdGlvbmFsSW5wdXRUbyA8ZW0+T3B0aW9uYWwgSW5wdXQgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRPdXRwdXRGcm9tIDxlbT5PdXRwdXQgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3QoKSA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0KCkgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd29ya1Byb2R1Y3QgPSBXT1JLX1BST0RVQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVSb2xlKCkgPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0lCTEVfUk9MRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZVJvbGUoKSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3BvbnNpYmxlUm9sZSA9IFJFU1BPTlNJQkxFX1JPTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3Rpdml0eUVudHJ5U3RhdGUgPSBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3Rpdml0eUV4aXRTdGF0ZSA9IEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtQcm9kdWN0KFN0cmluZyBuZXdXb3JrUHJvZHVjdCkgewotCQlTdHJpbmcgb2xkV29ya1Byb2R1Y3QgPSB3b3JrUHJvZHVjdDsKLQkJd29ya1Byb2R1Y3QgPSBuZXdXb3JrUHJvZHVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNULCBvbGRXb3JrUHJvZHVjdCwgd29ya1Byb2R1Y3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNpYmxlUm9sZSgpIHsKLQkJcmV0dXJuIHJlc3BvbnNpYmxlUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNwb25zaWJsZVJvbGUoU3RyaW5nIG5ld1Jlc3BvbnNpYmxlUm9sZSkgewotCQlTdHJpbmcgb2xkUmVzcG9uc2libGVSb2xlID0gcmVzcG9uc2libGVSb2xlOwotCQlyZXNwb25zaWJsZVJvbGUgPSBuZXdSZXNwb25zaWJsZVJvbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEUsIG9sZFJlc3BvbnNpYmxlUm9sZSwgcmVzcG9uc2libGVSb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEV4dGVybmFsSW5wdXRUbygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE8pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRJbXBhY3RzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRNYW5kYXRvcnlJbnB1dFRvKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE8pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXRUbygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE8pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE91dHB1dEZyb20oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXREZWxpdmVyYWJsZVBhcnRzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUVudHJ5U3RhdGUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2aXR5RW50cnlTdGF0ZSA9IGFjdGl2aXR5RW50cnlTdGF0ZTsKLQkJYWN0aXZpdHlFbnRyeVN0YXRlID0gbmV3QWN0aXZpdHlFbnRyeVN0YXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSwgb2xkQWN0aXZpdHlFbnRyeVN0YXRlLCBhY3Rpdml0eUVudHJ5U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5RXhpdFN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFeGl0U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIG5ld0FjdGl2aXR5RXhpdFN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUV4aXRTdGF0ZSA9IGFjdGl2aXR5RXhpdFN0YXRlOwotCQlhY3Rpdml0eUV4aXRTdGF0ZSA9IG5ld0FjdGl2aXR5RXhpdFN0YXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFLCBvbGRBY3Rpdml0eUV4aXRTdGF0ZSwgYWN0aXZpdHlFeGl0U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFOgotCQkJCXJldHVybiBnZXRSZXNwb25zaWJsZVJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE86Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsSW5wdXRUbygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQlyZXR1cm4gZ2V0SW1wYWN0ZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCXJldHVybiBnZXRJbXBhY3RzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXRUbygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dFRvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQkJCXJldHVybiBnZXRPdXRwdXRGcm9tKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCXJldHVybiBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCXJldHVybiBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXNldFdvcmtQcm9kdWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRToKLQkJCQlzZXRSZXNwb25zaWJsZVJvbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE86Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlcm5hbElucHV0VG8oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCWdldEltcGFjdHMoKS5jbGVhcigpOwotCQkJCWdldEltcGFjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotCQkJCWdldE1hbmRhdG9yeUlucHV0VG8oKS5jbGVhcigpOwotCQkJCWdldE1hbmRhdG9yeUlucHV0VG8oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlnZXRPcHRpb25hbElucHV0VG8oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST006Ci0JCQkJZ2V0T3V0cHV0RnJvbSgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0cHV0RnJvbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuY2xlYXIoKTsKLQkJCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFeGl0U3RhdGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXNldFdvcmtQcm9kdWN0KFdPUktfUFJPRFVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFOgotCQkJCXNldFJlc3BvbnNpYmxlUm9sZShSRVNQT05TSUJMRV9ST0xFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE86Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJCWdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCQlnZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTzoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPOgotCQkJCWdldE9wdGlvbmFsSW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTToKLQkJCQlnZXRPdXRwdXRGcm9tKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFeGl0U3RhdGUoQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gV09SS19QUk9EVUNUX0VERUZBVUxUID09IG51bGwgPyB3b3JrUHJvZHVjdCAhPSBudWxsIDogIVdPUktfUFJPRFVDVF9FREVGQVVMVC5lcXVhbHMod29ya1Byb2R1Y3QpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFOgotCQkJCXJldHVybiBSRVNQT05TSUJMRV9ST0xFX0VERUZBVUxUID09IG51bGwgPyByZXNwb25zaWJsZVJvbGUgIT0gbnVsbCA6ICFSRVNQT05TSUJMRV9ST0xFX0VERUZBVUxULmVxdWFscyhyZXNwb25zaWJsZVJvbGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gIWdldEV4dGVybmFsSW5wdXRUbygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJcmV0dXJuICFnZXRJbXBhY3RlZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCXJldHVybiAhZ2V0SW1wYWN0cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotCQkJCXJldHVybiAhZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0JCQkJcmV0dXJuICFnZXRPcHRpb25hbElucHV0VG8oKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQkJCXJldHVybiAhZ2V0T3V0cHV0RnJvbSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJcmV0dXJuICFnZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQlyZXR1cm4gQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RW50cnlTdGF0ZSAhPSBudWxsIDogIUFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxULmVxdWFscyhhY3Rpdml0eUVudHJ5U3RhdGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCXJldHVybiBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUV4aXRTdGF0ZSAhPSBudWxsIDogIUFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQuZXF1YWxzKGFjdGl2aXR5RXhpdFN0YXRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdvcmtQcm9kdWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrUHJvZHVjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzcG9uc2libGVSb2xlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNwb25zaWJsZVJvbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3Rpdml0eUVudHJ5U3RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZpdHlFeGl0U3RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RXhpdFN0YXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYjg2MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0SW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19FU1RJTUFURSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmVwb3J0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fUkVQT1JUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFURToKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCXJldHVybiBnZXRSZXBvcnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFOgotCQkJCXJldHVybiBnZXRUZW1wbGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuIGdldFRvb2xNZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJZ2V0RXN0aW1hdGUoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJZ2V0UmVwb3J0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXBvcnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFOgotCQkJCWdldFRlbXBsYXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRUZW1wbGF0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRFOgotCQkJCWdldEVzdGltYXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCWdldFJlcG9ydCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJZ2V0VGVtcGxhdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRFOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCXJldHVybiAhZ2V0UmVwb3J0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJcmV0dXJuICFnZXRUZW1wbGF0ZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOgotCQkJCXJldHVybiAhZ2V0VG9vbE1lbnRvcigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDFhZTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0VHlwZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3RUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuICFnZXRXb3JrUHJvZHVjdCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlMjhkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2YTE5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgWE1MIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOWNlNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NTUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVtYVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBVbWFTd2l0Y2g8QWRhcHRlcj4oKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyhBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm9BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGVja2xpc3QoQ2hlY2tsaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKENvbnRlbnRDYXRlZ29yeVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50RGVzY3JpcHRpb24oQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyeVByb2Nlc3MoRGVsaXZlcnlQcm9jZXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNjaXBsaW5lKERpc2NpcGxpbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb21haW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFc3RpbWF0ZShFc3RpbWF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFc3RpbWF0aW5nTWV0cmljKEVzdGltYXRpbmdNZXRyaWMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJdGVyYXRpb24oSXRlcmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VLaW5kKEtpbmQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUtpbmRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkoTWV0aG9kRWxlbWVudFByb3BlcnR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RVbml0KE1ldGhvZFVuaXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNaWxlc3RvbmUoTWlsZXN0b25lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUGhhc2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQbGFubmluZ0RhdGFBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzRGVzY3JpcHRpb24oUHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzRWxlbWVudChQcm9jZXNzRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0VsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZXBvcnQoUmVwb3J0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXBvcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2FkbWFwKFJvYWRtYXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlKFJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlU2V0KFJvbGVTZXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlU2V0R3JvdXBpbmcoUm9sZVNldEdyb3VwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrRGVzY3JpcHRpb24oVGFza0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZW1wbGF0ZShUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRvb2xBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0RlZmluaXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkgPGVtPkFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljIDxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2UgPGVtPkd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVLaW5kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWUgPGVtPk91dGNvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb24gPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50IDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIgPGVtPldvcmsgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3ZmVjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgVW1hUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL1VtYVJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDJkNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVJlc291cmNlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsLlVtYVJlc291cmNlRmFjdG9yeUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gY3VzdG9taXphdGlvbiBoZXJlLCBKaW5odWEgWGkgMDQvMjgvMjAwNgotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQkvLyByZXR1cm4gc3VwZXIuY3JlYXRlWE1MU2F2ZSgpOwotCQlyZXR1cm4gbmV3IFVtYVhNTFNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewotCQlYTUxIZWxwZXJJbXBsIGhlbHBlciA9IG5ldyBYTUxIZWxwZXJJbXBsKHRoaXMpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCQkJaWYgKHByZWZpeC5lcXVhbHMoInVtYSIpKSB7CQkvLyROT04tTkxTLTEkCi0JCQkJCXVyaSA9IFVtYVBhY2thZ2UuZU5TX1VSSTsKLQkJCQl9Ci0JCQkJc3VwZXIuYWRkUHJlZml4KHByZWZpeCwgdXJpKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0JCi19IC8vIFVtYVJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0YzVmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFTd2l0Y2guamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hU3dpdGNoPFQ+IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFVtYVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWTogewotCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQWN0aXZpdHkoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiB7Ci0JCQkJQWN0aXZpdHlEZXNjcmlwdGlvbiBhY3Rpdml0eURlc2NyaXB0aW9uID0gKEFjdGl2aXR5RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86IHsKLQkJCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9IChBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUOiB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBcnRpZmFjdChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046IHsKLQkJCQlBcnRpZmFjdERlc2NyaXB0aW9uIGFydGlmYWN0RGVzY3JpcHRpb24gPSAoQXJ0aWZhY3REZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjogewotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPSAoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTjogewotCQkJCUNhcGFiaWxpdHlQYXR0ZXJuIGNhcGFiaWxpdHlQYXR0ZXJuID0gKENhcGFiaWxpdHlQYXR0ZXJuKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3MoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6IHsKLQkJCQlDaGVja2xpc3QgY2hlY2tsaXN0ID0gKENoZWNrbGlzdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUNoZWNrbGlzdChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogewotCQkJCUNvbXBvc2l0ZVJvbGUgY29tcG9zaXRlUm9sZSA9IChDb21wb3NpdGVSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29tcG9zaXRlUm9sZShjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOiB7Ci0JCQkJQ29uY2VwdCBjb25jZXB0ID0gKENvbmNlcHQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb25jZXB0KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDogewotCQkJCUNvbnN0cmFpbnQgY29uc3RyYWludCA9IChDb25zdHJhaW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29uc3RyYWludChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWTogewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250ZW50Q2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0U6IHsKLQkJCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPSAoQ29udGVudENhdGVnb3J5UGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjogewotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVDogewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6IHsKLQkJCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWTogewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ3VzdG9tQ2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRTogewotCQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlID0gKERlbGl2ZXJhYmxlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcmFibGUoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1M6IHsKLQkJCQlEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2Vzcyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURlbGl2ZXJ5UHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3MoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVDogewotCQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZXNjcmliYWJsZUVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUjogewotCQkJCURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChEZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTjogewotCQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRvckRlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkU6IHsKLQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURpc2NpcGxpbmUoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzogewotCQkJCURpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZUdyb3VwaW5nKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UOiB7Ci0JCQkJRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCA9IChEb2N1bWVudFJvb3QpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEb2N1bWVudFJvb3QoZG9jdW1lbnRSb290KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOiB7Ci0JCQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEb21haW4oZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVMRU1FTlQ6IHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFOiB7Ci0JCQkJRXN0aW1hdGUgZXN0aW1hdGUgPSAoRXN0aW1hdGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VFc3RpbWF0ZShlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElOR19NRVRSSUM6IHsKLQkJCQlFc3RpbWF0aW5nTWV0cmljIGVzdGltYXRpbmdNZXRyaWMgPSAoRXN0aW1hdGluZ01ldHJpYyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUVzdGltYXRpbmdNZXRyaWMoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOiB7Ci0JCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRTogewotCQkJCUV4YW1wbGUgZXhhbXBsZSA9IChFeGFtcGxlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRXhhbXBsZShleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiB7Ci0JCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjogewotCQkJCUd1aWRhbmNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChHdWlkYW5jZURlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOiB7Ci0JCQkJR3VpZGVsaW5lIGd1aWRlbGluZSA9IChHdWlkZWxpbmUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VHdWlkZWxpbmUoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOiB7Ci0JCQkJSXRlcmF0aW9uIGl0ZXJhdGlvbiA9IChJdGVyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VJdGVyYXRpb24oaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuS0lORDogewotCQkJCUtpbmQga2luZCA9IChLaW5kKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlS2luZChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoa2luZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoa2luZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGtpbmQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoa2luZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OOiB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UOiB7Ci0JCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6IHsKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6IHsKLQkJCQlNZXRob2RMaWJyYXJ5IG1ldGhvZExpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZExpYnJhcnkobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0U6IHsKLQkJCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSAoTWV0aG9kUGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46IHsKLQkJCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZFBsdWdpbihtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVDogewotCQkJCU1ldGhvZFVuaXQgbWV0aG9kVW5pdCA9IChNZXRob2RVbml0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiB7Ci0JCQkJTWlsZXN0b25lIG1pbGVzdG9uZSA9IChNaWxlc3RvbmUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VNaWxlc3RvbmUobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHsKLQkJCQlOYW1lZEVsZW1lbnQgbmFtZWRFbGVtZW50ID0gKE5hbWVkRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChuYW1lZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobmFtZWRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuT1VUQ09NRTogewotCQkJCU91dGNvbWUgb3V0Y29tZSA9IChPdXRjb21lKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlT3V0Y29tZShvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHsKLQkJCQlQYWNrYWdlYWJsZUVsZW1lbnQgcGFja2FnZWFibGVFbGVtZW50ID0gKFBhY2thZ2VhYmxlRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6IHsKLQkJCQlQaGFzZSBwaGFzZSA9IChQaGFzZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVBoYXNlKHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQTogewotCQkJCVBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGEgPSAoUGxhbm5pbmdEYXRhKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUGxhbm5pbmdEYXRhKHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRTogewotCQkJCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJhY3RpY2UocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJUHJhY3RpY2VEZXNjcmlwdGlvbiBwcmFjdGljZURlc2NyaXB0aW9uID0gKFByYWN0aWNlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTOiB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jZXNzID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVDogewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U6IHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPSAoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT046IHsKLQkJCQlQcm9jZXNzRGVzY3JpcHRpb24gcHJvY2Vzc0Rlc2NyaXB0aW9uID0gKFByb2Nlc3NEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiB7Ci0JCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogewotCQkJCVByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BhY2thZ2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURTogewotCQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlID0gKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3MocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6IHsKLQkJCQlSZXBvcnQgcmVwb3J0ID0gKFJlcG9ydCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJlcG9ydChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5SRVVTQUJMRV9BU1NFVDogewotCQkJCVJldXNhYmxlQXNzZXQgcmV1c2FibGVBc3NldCA9IChSZXVzYWJsZUFzc2V0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUmV1c2FibGVBc3NldChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJPQURNQVA6IHsKLQkJCQlSb2FkbWFwIHJvYWRtYXAgPSAoUm9hZG1hcCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvYWRtYXAocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFOiB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlKHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTjogewotCQkJCVJvbGVEZXNjcmlwdGlvbiByb2xlRGVzY3JpcHRpb24gPSAoUm9sZURlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjogewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVQ6IHsKLQkJCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVTZXQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkc6IHsKLQkJCQlSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVTZXRHcm91cGluZyhyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjogewotCQkJCVNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlU2VjdGlvbihzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDogewotCQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzdXBwb3J0aW5nTWF0ZXJpYWwgPSAoU3VwcG9ydGluZ01hdGVyaWFsKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlU3VwcG9ydGluZ01hdGVyaWFsKHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0s6IHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzayl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRhc2sodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OOiB7Ci0JCQkJVGFza0Rlc2NyaXB0aW9uIHRhc2tEZXNjcmlwdGlvbiA9IChUYXNrRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRvcih0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOiB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUZWFtUHJvZmlsZSh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURTogewotCQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVGVtcGxhdGUodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjogewotCQkJCVRlcm1EZWZpbml0aW9uIHRlcm1EZWZpbml0aW9uID0gKFRlcm1EZWZpbml0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVGVybURlZmluaXRpb24odGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0w6IHsKLQkJCQlUb29sIHRvb2wgPSAoVG9vbCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRvb2wodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6IHsKLQkJCQlUb29sTWVudG9yIHRvb2xNZW50b3IgPSAoVG9vbE1lbnRvcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRvb2xNZW50b3IodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOiB7Ci0JCQkJV2hpdGVwYXBlciB3aGl0ZXBhcGVyID0gKFdoaXRlcGFwZXIpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXaGl0ZXBhcGVyKHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbmNlcHQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOiB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd29ya0JyZWFrZG93bkVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT046IHsKLQkJCQlXb3JrRGVmaW5pdGlvbiB3b3JrRGVmaW5pdGlvbiA9IChXb3JrRGVmaW5pdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHsKLQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtPcmRlcih3b3JrT3JkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHsKLQkJCQlXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjogewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24gd29ya1Byb2R1Y3REZXNjcmlwdGlvbiA9IChXb3JrUHJvZHVjdERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbih3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd29ya1Byb2R1Y3REZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRTogewotCQkJCVdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3RUeXBlKHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQXJ0aWZhY3QoQXJ0aWZhY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ2hlY2tsaXN0KENoZWNrbGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29uc3RyYWludChDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoQ29udGVudENhdGVnb3J5UGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50RGVzY3JpcHRpb24oQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVsaXZlcmFibGUoRGVsaXZlcmFibGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVsaXZlcnlQcm9jZXNzKERlbGl2ZXJ5UHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlc2NyaXB0b3IoRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRWxlbWVudChFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRXN0aW1hdGUoRXN0aW1hdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFc3RpbWF0aW5nTWV0cmljKEVzdGltYXRpbmdNZXRyaWMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oR3VpZGFuY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3VpZGVsaW5lKEd1aWRlbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VLaW5kKEtpbmQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkoTWV0aG9kRWxlbWVudFByb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kUGFja2FnZShNZXRob2RQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RVbml0KE1ldGhvZFVuaXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGFja2FnZWFibGVFbGVtZW50KFBhY2thZ2VhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByYWN0aWNlRGVzY3JpcHRpb24oUHJhY3RpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzRGVzY3JpcHRpb24oUHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzRWxlbWVudChQcm9jZXNzRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc1BhY2thZ2UoUHJvY2Vzc1BhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9hZG1hcChSb2FkbWFwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVTZXQoUm9sZVNldCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU2VjdGlvbihTZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hU3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxQcm9jZXNzb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQwNGZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFYTUxQcm9jZXNzb3IuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFYTUxQcm9jZXNzb3IgZXh0ZW5kcyBYTUxQcm9jZXNzb3IgewotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFYTUxQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRSkpOwotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFJlc291cmNlLkZhY3Rvcnk+IGdldFJlZ2lzdHJhdGlvbnMoKSB7Ci0JCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQl9Ci0JCXJldHVybiByZWdpc3RyYXRpb25zOwotCX0KLQotfSAvL1VtYVhNTFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MU2F2ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFNhdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDk2MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MU2F2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFNhdmVJbXBsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY3VzdG9taXplIHRoZSBYTUxTYXZlSW1wbCB0byBzYXZlIHRoZSBzdHJpbmcgdGFncyBhcyBDREFUQQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFVtYVhNTFNhdmVJbXBsIGV4dGVuZHMgWE1MU2F2ZUltcGwgewotCi0JcHVibGljIHN0YXRpYyBMaXN0IGNkYXRhRmVhdHVyZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCQotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImFsdGVybmF0aXZlcyIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoIm1haW5EZXNjcmlwdGlvbiIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImhvd1RvU3RhZmYiKTsKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJrZXlDb25zaWRlcmF0aW9ucyIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInB1cnBvc2UiKTsJCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgic2NvcGUiKTsJCQkJCS8vIFByb2Nlc3NEZXNjcmlwdGlvbgotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInVzYWdlTm90ZXMiKTsJCQkvLyBQcm9jZXNzRGVzY3JpcHRpb24KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzQ0RBVEFGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmLCBib29sZWFuIGlzQXR0cmlidXRlKSB7Ci0JCQotCQlpZiAoIGlzQXR0cmlidXRlICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotLy8JCWlmICggZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSAKLS8vCQkJfHwgZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkKLS8vCQkJfHwgZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCkKLS8vCQkpIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0Iik7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGNkYXRhRmVhdHVyZU5hbWVzLmNvbnRhaW5zKGYuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGhlbHBlcgotCSAqLwotCXB1YmxpYyBVbWFYTUxTYXZlSW1wbChYTUxIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGhlbHBlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMgTWFwCi0JICogQHBhcmFtIGhlbHBlciBYTUxIZWxwZXIKLQkgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nCi0JICovCi0JcHVibGljIFVtYVhNTFNhdmVJbXBsKE1hcCBvcHRpb25zLCBYTUxIZWxwZXIgaGVscGVyLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJc3VwZXIob3B0aW9ucywgaGVscGVyLCBlbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhdHlwZVZhbHVlKE9iamVjdCB2YWx1ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGYsCi0JCQlib29sZWFuIGlzQXR0cmlidXRlKSB7CQotCQkKLQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKCIiKSApIHsKLQkJCXJldHVybiAiIjsKLQkJfQkJCQkKLQkJCi0JCWlmICggaXNDREFUQUZlYXR1cmUoZiwgaXNBdHRyaWJ1dGUpICkgewotCQkJU3RyaW5nIHN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcmVwbGFjZWQgPSAiXV0+IjsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIuaW5kZXhPZihyZXBsYWNlZCkgPj0gMCkgewotCQkJCXN0ciA9IHN0ci5yZXBsYWNlQWxsKHJlcGxhY2VkLCAiXV1dXT48IVtDREFUQVs+IiApOwkvLyROT04tTkxTLTEkCS8vMTc1Mzk1Ci0JCQl9Ci0JCQlyZXR1cm4gIjwhW0NEQVRBWyIgKyBzdHIgKyAiXV0+IjsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldERhdGF0eXBlVmFsdWUodmFsdWUsIGYsIGlzQXR0cmlidXRlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTlmY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHRoZSBYTUwgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy8ucHJvamVjdCBiLzEuNS9yZWxlbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTA3ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yZWxlbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYWxsRWxlbWVudHMueG1sIGIvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL2FsbEVsZW1lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwMWM0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYWxsRWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iYWxsRWxlbWVudHMgRGVsZWdhdG9yIj4KLQkKLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTwhLS0gUnVuIGEgZ2l2ZW4gJHt0YXJnZXR9IG9uIGFsbCBlbGVtZW50cyBiZWluZyBidWlsdCAgICAgICAgICAgICAgICAgICAgIC0tPgotIAk8IS0tIFJlcGxhY2UgZWxlbWVudC5pZCB3aXRoIHRoZSBpZCBvZiB0aGUgdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuICAgIC0tPgotCTwhLS0gSWYgZWxlbWVudC5pZCBkb2VzIG5vdCBleGlzdCBpbiAke2J1aWxkRGlyZWN0b3J5fS9mZWF0dXJlcy9lbGVtZW50LmlkICAgLS0+Ci0JPCEtLSBvciAke2Jhc2VMb2NhdGlvbn0vZmVhdHVyZXMvZWxlbWVudC5pZCwgdGhlbiB5b3UgbXVzdCBwcm92aWRlIHRoZSAgICAgICAtLT4KLQk8IS0tIGxvY2F0aW9uIGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5ICJwbHVnaW5QYXRoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotIAk8IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAgICAgICAgICAgICAtLT4KLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHNEZWxlZ2F0b3IiPgotIAkJPGFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSIke3RhcmdldH0iPgotCSAJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZmVhdHVyZSIgLz4KLQkgCQk8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlIiAvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLSAKLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTwhLS0gVGFyZ2V0cyB0byBhc3NlbWJsZSB0aGUgYnVpbHQgZWxlbWVudHMgZm9yIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbnMgIC0tPgotIAk8IS0tIFRoZXNlIGdlbmVyYWxseSBjYWxsIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibGUgc2NyaXB0cyAobmFtZWQgaW4gICAgICAgICAtLT4KLSAJPCEtLSAke2Fzc2VtYmxlU2NyaXB0TmFtZX0pIGJ1dCBtYXkgYWxzbyBhZGQgcHJlIGFuZCBwb3N0IHByb2Nlc3NpbmcgICAgICAgLS0+Ci0gCTwhLS0gQWRkIG9uZSB0YXJnZXQgZm9yIGVhY2ggcm9vdCBlbGVtZW50IGFuZCBlYWNoIGNvbmZpZ3VyYXRpb24gICAgICAgICAgIC0tPgotIAk8IS0tIFJlcGxhY2UgZWxlbWVudC5pZCB3aXRoIHRoZSBpZCBvZiB0aGUgdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQgICAtLT4KLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAJPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlLndpbjMyLndpbjMyLng4NiI+Ci0gCQk8YW50IGFudGZpbGU9IiR7YXNzZW1ibGVTY3JpcHROYW1lfSIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJjaGl2ZU5hbWUiIHZhbHVlPSIke2FyY2hpdmVOYW1lUHJlZml4fS0ke3RndFZlcn0tJHtidWlsZExhYmVsfS13aW4zMi56aXAiLz4KLQkJPC9hbnQ+Ci0gCTwvdGFyZ2V0PgotCi0gCTx0YXJnZXQgbmFtZT0iYXNzZW1ibGUub3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS5saW51eC5ndGsueDg2Ij4KLSAJCTxhbnQgYW50ZmlsZT0iJHthc3NlbWJsZVNjcmlwdE5hbWV9IiBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmNoaXZlTmFtZSIgdmFsdWU9IiR7YXJjaGl2ZU5hbWVQcmVmaXh9LSR7dGd0VmVyfS0ke2J1aWxkTGFiZWx9LWxpbnV4LnppcCIvPgotCQk8L2FudD4KLSAJPC90YXJnZXQ+Ci0KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5NjI0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBhcmFtZXRlcnMgZGVzY3JpYmluZyBob3cgYW5kIHdoZXJlIHRvIGV4ZWN1dGUgdGhlIGJ1aWxkLgotIyBUeXBpY2FsIHVzZXJzIG5lZWQgb25seSB1cGRhdGUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotIyAgICBiYXNlTG9jYXRpb24gLSB3aGVyZSB0aGluZ3MgeW91IGFyZSBidWlsZGluZyBhZ2FpbnN0IGFyZSBpbnN0YWxsZWQKLSMgICAgYm9vdGNsYXNzcGF0aCAtIFRoZSBiYXNlIGphcnMgdG8gY29tcGlsZSBhZ2FpbnN0ICh0eXBpY2FseSBydC5qYXIpCi0jICAgIGNvbmZpZ3MgLSB0aGUgbGlzdCBvZiB7b3MsIHdzLCBhcmNofSBjb25maWd1cmF0aW9ucyB0byBidWlsZC4gIAotIwotIyBPZiBjb3Vyc2UgYW55IG9mIHRoZSBzZXR0aW5ncyBoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNwZWMnaW5nIAotIyB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgKGUuZy4sIC1EYmFzZUxvY2F0aW9uPWQ6L2VjbGlwc2UKLQotIyMjIyMjIyMjIyMjIyBQUk9EVUNUL1BBQ0tBR0lORyBDT05UUk9MICMjIyMjIyMjIyMjIyMKLSNwcm9kdWN0PS9wbHVnaW4gb3IgZmVhdHVyZSBpZC9wYXRoL3RvLy5wcm9kdWN0Ci1wcm9kdWN0PW9yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdAotcnVuUGFja2FnZXI9dHJ1ZQotCi0jU2V0IHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIHRoYXQgd2lsbCByZXN1bHQgZnJvbSB0aGUgcHJvZHVjdCBidWlsZC4KLWFyY2hpdmVOYW1lUHJlZml4PWVwZi1jb21wb3NlcgotCi0jIFRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBhcmNoaXZlLgotYXJjaGl2ZVByZWZpeD1lcGYtY29tcG9zZXIKLQotIyBUaGUgbG9jYXRpb24gdW5kZXJ3aGljaCBhbGwgb2YgdGhlIGJ1aWxkIG91dHB1dCB3aWxsIGJlIGNvbGxlY3RlZC4KLWNvbGxlY3RpbmdGb2xkZXI9JHthcmNoaXZlUHJlZml4fQotCi0jIFRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgVGhpcyAKLSMgdmFsdWUgaXMgYSAnJicgc2VwYXJhdGVkIGxpc3Qgb2YgJywnIHNlcGFyYXRlIHRyaXBsZXMuICBGb3IgZXhhbXBsZSwgCi0jICAgICBjb25maWdzPXdpbjMyLHdpbjMyLHg4NiAmIGxpbnV4LG1vdGlmLHg4NgotIyBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyAqLCosKgotI2NvbmZpZ3M9d2luMzIsIHdpbjMyLCB4ODYgJiBcCi0jCWxpbnV4LCBndGssIHBwYyAmXAotIyBsaW51eCwgZ3RrLCB4ODYgJiBcCi0jCWxpbnV4LCBndGssIHg4Nl82NCAmIFwKLSMJbGludXgsIG1vdGlmLCB4ODYgJiBcCi0jCXNvbGFyaXMsIG1vdGlmLCBzcGFyYyAmIFwKLSMJc29sYXJpcywgZ3RrLCBzcGFyYyAmIFwKLSMJYWl4LCBtb3RpZiwgcHBjICYgXAotIwlocHV4LCBtb3RpZiwgUEFfUklTQyAmIFwKLSMJbWFjb3N4LCBjYXJib24sIHBwYwotCi0jY29uZmlncz13aW4zMix3aW4zMix4ODYKLWNvbmZpZ3M9d2luMzIsd2luMzIseDg2ICYgbGludXgsZ3RrLHg4NgotCi0jIEJ5IGRlZmF1bHQgUERFIGNyZWF0ZXMgb25lIGFyY2hpdmUgKHJlc3VsdCkgcGVyIGVudHJ5IGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KLSMgU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRyeSB3aWxsIGNhdXNlIFBERSB0byBvbmx5IGNyZWF0ZSBvbmUgb3V0cHV0IGNvbnRhaW5pbmcgYWxsIAotIyBhcnRpZmFjdHMgZm9yIGFsbCB0aGUgcGxhdGZvcm1zIGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KLSNncm91cENvbmZpZ3VyYXRpb25zPXRydWUKLQotI1RoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUuIEJ5IGRlZmF1bHQgYSB6aXAgaXMgY3JlYXRlZCB1c2luZyBhbnRaaXAuCi0jVGhlIGxpc3QgY2FuIG9ubHkgY29udGFpbiB0aGUgY29uZmlndXJhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2lyZWQgZm9ybWF0IGlzIGRpZmZlcmVudCB0aGFuIHppcC4KLSNhcmNoaXZlc0Zvcm1hdD13aW4zMiwgd2luMzIsIHg4NiAtIGFudFppcCYgXAotIwlsaW51eCwgZ3RrLCBwcGMgLSBhbnRaaXAgJlwKLSMgICAgbGludXgsIGd0aywgeDg2IC0gYW50WmlwJiBcCi0jCWxpbnV4LCBndGssIHg4Nl82NCAtIGFudFppcCYgXAotIyBsaW51eCwgbW90aWYsIHg4NiAtIGFudFppcCYgXAotIwlzb2xhcmlzLCBtb3RpZiwgc3BhcmMgLSBhbnRaaXAmIFwKLSMJc29sYXJpcywgZ3RrLCBzcGFyYyAtIGFudFppcCYgXAotIwlhaXgsIG1vdGlmLCBwcGMgLSBhbnRaaXAmIFwKLSMJaHB1eCwgbW90aWYsIFBBX1JJU0MgLSBhbnRaaXAmIFwKLSMJbWFjb3N4LCBjYXJib24sIHBwYyAtIGFudFppcAotCi0jYXJjaGl2ZXNGb3JtYXQ9d2luMzIsd2luMzIseDg2IC0gZm9sZGVyJlwKLSMgICAgbGludXgsIGd0aywgeDg2IC0gZm9sZGVyCi1hcmNoaXZlc0Zvcm1hdD13aW4zMix3aW4zMix4ODYgLSBhbnRaaXAmXAotICAgIGxpbnV4LCBndGssIHg4NiAtIGFudFppcAotCQotI1NldCB0byB0cnVlIGlmIHlvdSB3YW50IHRoZSBvdXRwdXQgdG8gYmUgcmVhZHkgZm9yIGFuIHVwZGF0ZSBqYXIgKG5vIHNpdGUueG1sIGdlbmVyYXRlZCkKLSNvdXRwdXRVcGRhdGVKYXJzID0gZmFsc2UKLQotI1NldCB0byB0cnVlIGZvciBKbmxwIGdlbmVyYXRpb24KLSNjb2RlYmFzZSBzaG91bGQgYmUgYSBVUkwgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3Qgb2YgYWxsIHJlbGF0aXZlIFVSTHMgaW4gdGhlIG91dHB1dC4KLSNnZW5lcmF0ZUpubHA9ZmFsc2UKLSNqbmxwLmNvZGViYXNlPTxjb2RlYmFzZSB1cmw+Ci0jam5scC5qMnNlPTxqMnNlIHZlcnNpb24+Ci0jam5scC5sb2NhbGU9PGEgbG9jYWxlPgotCi0jU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc2lnbiBqYXJzCi0jc2lnbkphcnM9ZmFsc2UKLSNzaWduLmFsaWFzPTxhbGlhcz4KLSNzaWduLmtleXN0b3JlPTxrZXlzdG9yZSBsb2NhdGlvbj4KLSNzaWduLnN0b3JlcGFzcz08a2V5c3RvcmUgcGFzc3dvcmQ+Ci0KLSNBcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgemlwIGV4ZWN1dGFibGUKLXppcGFyZ3M9Ci0KLSNBcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgdGFyIGV4ZWN1dGFibGUKLXRhcmFyZ3M9Ci0KLSNDb250cm9sIHRoZSBjcmVhdGlvbiBvZiBhIGZpbGUgY29udGFpbmluZyB0aGUgdmVyc2lvbiBpbmNsdWRlZCBpbiBlYWNoIGNvbmZpZ3VyYXRpb24gLSBvbiBieSBkZWZhdWx0IAotI2dlbmVyYXRlVmVyc2lvbnNMaXN0cz1mYWxzZQotCi0jIyMjIyMjIyMjIyMjIyBCVUlMRCBOQU1JTkcgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgYnVpbGQgZWxlbWVudHMgYXJlIGZldGNoZWQgYW5kIHdoZXJlCi0jIHRoZSBidWlsZCB0YWtlcyBwbGFjZS4KLWJ1aWxkRGlyZWN0b3J5PSR7YnVpbGRlcn0vYnVpbGQKLQotIyBUeXBlIG9mIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dC4gIFR5cGljYWxseSB0aGlzIHZhbHVlIGlzCi0jIG9uZSBvZiBJLCBOLCBNLCBTLCAuLi4KLWJ1aWxkVHlwZT1OCi0KLSNidWlsZElkIGlzIHNldCBpbiBydW4uYmF0Ci0jIElEIG9mIHRoZSBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQuCi0jYnVpbGRJZD0yMDA3MDIxNS0yMTUwCi10Z3RWZXI9MS4yLjAKLXRndE1pbGVzdG9uZT1NMgotCi0jIExhYmVsIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci0jIENyZWF0ZXMgYSBmb2xkZXIgbmFtZWQgYXMgJHtidWlsTGFiZWx9IGluIHRoZSBvdXRwdXQgbG9jYXRpb24KLWJ1aWxkTGFiZWw9JHtidWlsZFR5cGV9LiR7YnVpbGRJZH0KLQotIyBUaW1lc3RhbXAgZm9yIHRoZSBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQKLXRpbWVzdGFtcD0wMDcKLQotI1RoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgcXVhbGlmaWVyIG9mIGEgcGx1Z2luIG9yIGZlYXR1cmUgd2hlbiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgdmFsdWUgY29tcHV0ZWQgYnkgcGRlLgotI1RoZSB2YWx1ZSB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBwbHVnaW4gb3IgZmVhdHVyZXMgaW5kaWNhdGluZyBidWlsZC5wcm9wZXJ0aWVzLCBxdWFsaWZpZXIgPSBjb250ZXh0IAotI2ZvcmNlQ29udGV4dFF1YWxpZmllcj08dGhlIHZhbHVlIGZvciB0aGUgcXVhbGlmaWVyPgotCi0jRW5hYmxlIC8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIHN1ZmZpeCBmb3IgdGhlIGZlYXR1cmVzIHRoYXQgdXNlIC5xdWFsaWZpZXIuIAotI1RoZSBnZW5lcmF0ZWQgc3VmZml4IGlzIGNvbXB1dGVkIGFjY29yZGluZyB0byB0aGUgY29udGVudCBvZiB0aGUgZmVhdHVyZSAgIAotI2dlbmVyYXRlRmVhdHVyZVZlcnNpb25TdWZmaXg9dHJ1ZQotCi0jIyMjIyMjIyMjIyMjIEJBU0UgQ09OVFJPTCAjIyMjIyMjIyMjIyMjCi0jIFNldHRpbmdzIGZvciB0aGUgYmFzZSBFY2xpcHNlIGNvbXBvbmVudHMgYW5kIEphdmEgY2xhc3MgbGlicmFyaWVzIAotIyBhZ2FpbnN0IHdoaWNoIHlvdSBhcmUgYnVpbGRpbmcuCi0jIEJhc2UgbG9jYXRpb24gZm9yIGFueXRoaW5nIHRoZSBidWlsZCBuZWVkcyB0byBjb21waWxlIGFnYWluc3QuICBGb3IgZXhhbXBsZSwKLSMgaW4gbW9zdCBSQ1AgYXBwIG9yIGEgcGx1Zy1pbiwgIHRoZSBiYXNlTG9jYXRpb24gc2hvdWxkIGJlIHRoZSBsb2NhdGlvbiBvZiBhIHByZXZpb3VzbHkKLSMgaW5zdGFsbGVkIEVjbGlwc2UgYWdhaW5zdCB3aGljaCB0aGUgYXBwbGljYXRpb24gb3IgcGx1Zy1pbiBjb2RlIHdpbGwgYmUgY29tcGlsZWQgYW5kIHRoZSBSQ1AgZGVsdGEgcGFjay4KLQotI09zL1dzL0FyY2gvbmwgb2YgdGhlIGVjbGlwc2Ugc3BlY2lmaWVkIGJ5IGJhc2VMb2NhdGlvbgotYmFzZW9zPXdpbjMyCi1iYXNld3M9d2luMzIKLWJhc2VhcmNoPXg4NgotCi0jcGx1Z2luUGF0aCBpcyBhIGxpc3Qgb2YgbG9jYXRpb25zIGluIHdoaWNoIHRvIGZpbmQgcGx1Z2lucyBhbmQgZmVhdHVyZXMuICBUaGlzIGxpc3QgaXMgc2VwYXJhdGVkIGJ5IHRoZSBwbGF0Zm9ybSBmaWxlIHNlcGFyYXRvciAoOyBvciA6KQotI2EgbG9jYXRpb24gaXMgb25lIG9mOiAgCi0jLSB0aGUgbG9jYXRpb24gb2YgdGhlIGphciBvciBmb2xkZXIgdGhhdCBpcyB0aGUgcGx1Z2luIG9yIGZlYXR1cmUgOiAvcGF0aC90by9mb28uamFyIG9yIC9wYXRoL3RvL2ZvbwotIy0gYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhIC9wbHVnaW5zIG9yIC9mZWF0dXJlcyBzdWJkaXJlY3RvcnkKLSMtIHRoZSBsb2NhdGlvbiBvZiBhIGZlYXR1cmUueG1sLCBvciBmb3IgMi4xIHN0eWxlIHBsdWdpbnMsIHRoZSBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbAotI3BsdWdpblBhdGg9Ci0KLXNraXBCYXNlPXRydWUKLWVjbGlwc2VVUkw9PHVybCBmb3IgZWNsaXBzZSBkb3dubG9hZCBzaXRlPgotZWNsaXBzZUJ1aWxkSWQ9PElkIG9mIEVjbGlwc2UgYnVpbGQgdG8gZ2V0PgotZWNsaXBzZUJhc2VVUkw9JHtlY2xpcHNlVVJMfS9lY2xpcHNlLXBsYXRmb3JtLSR7ZWNsaXBzZUJ1aWxkSWR9LXdpbjMyLnppcAotCi0KLSMjIyMjIyMjIyMjIyMgTUFQIEZJTEUgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi0jIFRoaXMgc2VjdGlvbiBkZWZpbmVzIENWUyB0YWdzIHRvIHVzZSB3aGVuIGZldGNoaW5nIHRoZSBtYXAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4KLSMgSWYgeW91IHdhbnQgdG8gZmV0Y2ggdGhlIG1hcCBmaWxlIGZyb20gcmVwb3NpdG9yeSAvIGxvY2F0aW9uLCBjaGFuZ2UgdGhlIGdldE1hcEZpbGVzIHRhcmdldCBpbiB0aGUgY3VzdG9tVGFyZ2V0cy54bWwKLQotI3NraXBNYXBzPXRydWUKLSNtYXBzUmVwbz06cHNlcnZlcjphbm9ueW1vdXNAZXhhbXBsZS5jb20vcGF0aC90by9yZXBvCi1tYXBzUmVwbz0ke2N2c0luZm99QGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5Ci0jbWFwc1Jvb3Q9cGF0aC90by9tYXBzCi1tYXBzUm9vdD1vcmcuZWNsaXBzZS5lcGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmVsZW5nL21hcHMKLW1hcHNDaGVja291dFRhZz1IRUFECi0jbWFwc0NoZWNrb3V0VGFnPXYke2J1aWxkSWR9Ci0KLXRhZ01hcHM9dHJ1ZQotbWFwc1RhZ1RhZz12JHtidWlsZElkfQotCi0jIyMjIyMjIyMjIyMjIFVQREFURSBTSVRFIEZJTEUgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi11cGRhdGVTaXRlUmVwbz0ke2N2c0luZm99QGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9vcmcuZWNsaXBzZQotdXBkYXRlU2l0ZUZpbGU9d3d3L2VwZi9kb3dubG9hZHMvdG9vbC90b29sX2Rvd25sb2Fkcy5waHAKLXVwZGF0ZVNpdGVDaGVja291dFRhZz1IRUFECi11cGRhdGVTaXRlRGVzdGluYXRpb249Ci0KLQotIyMjIyMjIyMjIyMjIFJFUE9TSVRPUlkgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBzZWN0aW9uIGRlZmluZXMgcHJvcGVydGllcyBwYXJhbWV0ZXJpemluZyB0aGUgcmVwb3NpdG9yaWVzIHdoZXJlIHBsdWdpbnMsIGZyYWdtZW50cwotIyBidW5kbGVzIGFuZCBmZWF0dXJlcyBhcmUgYmVpbmcgb2J0YWluZWQgZnJvbS4gCi0KLSMgVGhlIHRhZ3MgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgZWxlbWVudHMgdG8gYnVpbGQuCi0jIEJ5IGRlZmF1bHQgdGhlYnVpbGRlciB3aWxsIHVzZSB3aGF0ZXZlciBpcyBpbiB0aGUgbWFwcy4gIAotIyBUaGlzIHZhbHVlIHRha2VzIHRoZSBmb3JtIG9mIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBpZGVudGlmaWVyIChsaWtlIHVzZWQgaW4gdGhlIG1hcCBmaWxlcykgYW5kIHRoZSAKLSMgb3ZlcnJpZGluZyB2YWx1ZQotIyBGb3IgZXhhbXBsZSBmZXRjaFRhZz1DVlM9SEVBRCwgU1ZOPXYyMDA1MDEwMQotI2ZldGNoVGFnPVIxXzBfQlJBTkNICi0jZmV0Y2hUYWc9SEVBRAotI3NraXBGZXRjaD10cnVlCi0KLQotIyMjIyMjIyMjIyMjIyBKQVZBIENPTVBJTEVSIE9QVElPTlMgIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGxvY2F0aW9uIG9mIHRoZSBKYXZhIGphcnMgdG8gY29tcGlsZSBhZ2FpbnN0LiAgVHlwaWNhbGx5IHRoZSBydC5qYXIgZm9yIHlvdXIgSkRLL0pSRQotYm9vdGNsYXNzcGF0aD0ke2phdmEuaG9tZX0vbGliL2NvcmUuamFyOyR7amF2YS5ob21lfS9saWIvY2hhcnNldHMuamFyOyR7amF2YS5ob21lfS9saWIvQkQuamFyOyR7amF2YS5ob21lfS9saWIvZGVwbG95Lmphcjske2phdmEuaG9tZX0vbGliL2dyYXBoaWNzLmphcjske2phdmEuaG9tZX0vbGliL2libWNlcnRwYXRocHJvdmlkZXIuamFyOyR7amF2YS5ob21lfS9saWIvaWJtY2Z3Lmphcjske2phdmEuaG9tZX0vbGliL2libWphYXNhY3RpdmVsbS5qYXI7JHtqYXZhLmhvbWV9L2xpYi9pYm1qYWFzbG0uamFyOyR7amF2YS5ob21lfS9saWIvaWJtamNlZncuamFyOyR7amF2YS5ob21lfS9saWIvaWJtamdzc3Byb3ZpZGVyLmphcjske2phdmEuaG9tZX0vbGliL2libWpzc2Vwcm92aWRlcjIuamFyOyR7amF2YS5ob21lfS9saWIvaWJtb3JiLmphcjske2phdmEuaG9tZX0vbGliL2libW9yYmFwaS5qYXI7JHtqYXZhLmhvbWV9L2xpYi9pYm1wa2NzLmphcjske2phdmEuaG9tZX0vbGliL2phdmF3cy5qYXI7JHtqYXZhLmhvbWV9L2xpYi9wbHVnaW4uamFyOyR7amF2YS5ob21lfS9saWIvc2VjdXJpdHkuamFyOyR7amF2YS5ob21lfS9saWIvc2VydmVyLmphcjske2phdmEuaG9tZX0vbGliL3ZtLmphcjske2phdmEuaG9tZX0vbGliL3htbC5qYXI7JHtqYXZhLmhvbWV9L2xpYi9ydC5qYXIKLQotIyBzcGVjaWZpYyBKUkUgbG9jYXRpb25zIHRvIGNvbXBpbGUgYWdhaW5zdC4gVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGNvbXBpbGUgYnVuZGxlcyBzcGVjaWZ5aW5nIGEgCi0jIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50LiBVbmNvbW1lbnQgYW5kIHNldCB2YWx1ZXMgZm9yIGVudmlyb25tZW50cyB0aGF0IHlvdSBzdXBwb3J0Ci0jQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMD0gL3BhdGgvdG8vcnQuamFyCi0jQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMT0KLSNPU0dpL01pbmltdW0tMS4wPQotI09TR2kvTWluaW11bS0xLjE9Ci0jSlJFLTEuMT0KLSNKMlNFLTEuMj0KLSNKMlNFLTEuMz0KLSNKMlNFLTEuND0KLSNKMlNFLTEuNT0KLSNKYXZhU0UtMS42PQotI1BlcnNvbmFsSmF2YS0xLjE9Ci0jUGVyc29uYWxKYXZhLTEuMj0KLSNDREMtMS4wL1BlcnNvbmFsQmFzaXMtMS4wPQotI0NEQy0xLjAvUGVyc29uYWxKYXZhLTEuMD0KLSNDREMtMS4xL1BlcnNvbmFsQmFzaXMtMS4xPQotI0NEQy0xLjEvUGVyc29uYWxKYXZhLTEuMT0KLQotIyBTcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSBjb21waWxlciBsb2cgd2hlbiBlY2xpcHNlIGpkdCBpcyB1c2VkCi1sb2dFeHRlbnNpb249LmxvZwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgZGVidWcgaW5mbyBpbiB0aGUgb3V0cHV0IGphcnMKLWphdmFjRGVidWdJbmZvPXRydWUgCi0KLSMgV2hldGhlciBvciBub3QgdG8gZmFpbCB0aGUgYnVpbGQgaWYgdGhlcmUgYXJlIGNvbXBpbGVyIGVycm9ycwotamF2YWNGYWlsT25FcnJvcj10cnVlCi0KLSMgRW5hYmxlIG9yIGRpc2FibGUgdmVyYm9zZSBtb2RlIG9mIHRoZSBjb21waWxlcgotI2phdmFjVmVyYm9zZT10cnVlCi0KLSMgRXh0cmEgYXJndW1lbnRzIGZvciB0aGUgY29tcGlsZXIuIFRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgamF2YSBjb21waWxlciBiZWluZyB1c2VkLgotI2NvbXBpbGVyQXJnPS1nCi1jb21waWxlckFyZz0tbm93YXJuCi0KLSMgRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlLiBUaGlzIHZhbHVlIGlzIHVzZWQgd2hlbiBjb21waWxpbmcgcGx1Zy1pbnMgdGhhdCBkbyBub3Qgc2V0IHRoZSBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudCBvciBzZXQgamF2YWNTb3VyY2UgaW4gYnVpbGQucHJvcGVydGllcwotamF2YWNTb3VyY2U9MS41Ci0KLSMgRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIGJ5dGUgY29kZSB0YXJnZXRlZC4gVGhpcyB2YWx1ZSBpcyB1c2VkIHdoZW4gY29tcGlsaW5nIHBsdWctaW5zIHRoYXQgZG8gbm90IHNldCB0aGUgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgb3Igc2V0IGphdmFjVGFyZ2V0IGluIGJ1aWxkLnByb3BlcnRpZXMuCi1qYXZhY1RhcmdldD0xLjUKLQotCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvY3VzdG9tVGFyZ2V0cy54bWwgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvY3VzdG9tVGFyZ2V0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNWExMzguLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL2N1c3RvbVRhcmdldHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJ1biBhIGdpdmVuICR7dGFyZ2V0fSBvbiBhbGwgZWxlbWVudHMgYmVpbmcgYnVpbHQgLS0+Ci0JPCEtLSBBZGQgb24gPGFudD4gdGFzayBmb3IgZWFjaCB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdC4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHByb3BlcnR5IG5hbWU9ImFsbEVsZW1lbnRzRmlsZSIgdmFsdWU9IiR7YnVpbGRlcn0vYWxsRWxlbWVudHMueG1sIi8+Ci0JPGltcG9ydCBmaWxlPSIke2FsbEVsZW1lbnRzRmlsZX0iLz4KLQotCTx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHMiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzRGVsZWdhdG9yIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJnZXRCYXNlQ29tcG9uZW50cyIgZGVwZW5kcz0iY2hlY2tMb2NhbEJhc2UiIHVubGVzcz0ic2tpcEJhc2UiPgotCQk8Z2V0IHNyYz0iJHtlY2xpcHNlQmFzZVVSTH0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9Ly4uL3RlbXAtYmFzZS56aXAiLz4KLQkJPHVuemlwIGRlc3Q9IiR7YmFzZX0iIG92ZXJ3cml0ZT0idHJ1ZSIgc3JjPSIke2J1aWxkRGlyZWN0b3J5fS8uLi90ZW1wLWJhc2UuemlwIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNoZWNrTG9jYWxCYXNlIj4KLQkJPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2V9IiBwcm9wZXJ0eT0ic2tpcEJhc2UiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQ2hlY2sgb3V0IG1hcCBmaWxlcyBmcm9tIGNvcnJlY3QgcmVwb3NpdG9yeSAtLT4KLQk8IS0tIFJlcGxhY2UgdmFsdWVzIGZvciBtYXBzQ2hlY2tvdXRUYWcgYXMgZGVzaXJlZC4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJnZXRNYXBGaWxlcyIgZGVwZW5kcz0iY2hlY2tMb2NhbE1hcHMiIHVubGVzcz0ic2tpcE1hcHMiPgotCQk8IS0tIDxwcm9wZXJ0eSBuYW1lPSJtYXBzQ2hlY2tvdXRUYWciIHZhbHVlPSJIRUFEIi8+IC0tPgotCQk8Y3ZzIGN2c1Jvb3Q9IiR7bWFwc1JlcG99IiBwYWNrYWdlPSIke21hcHNSb290fSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vbWFwcyIgdGFnPSIke21hcHNDaGVja291dFRhZ30iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2hlY2tMb2NhbE1hcHMiPgotCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJza2lwTWFwcyIgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vbWFwcyIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ0YWdNYXBGaWxlcyIgaWY9InRhZ01hcHMiPgotCQk8Y3ZzIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMvJHttYXBzUm9vdH0iIGNvbW1hbmQ9InRhZyAke21hcHNUYWdUYWd9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIHVubGVzcz0ibm9jbGVhbiI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsRWxlbWVudHMiPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImNsZWFuRWxlbWVudCIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuQnVpbGREaXIiPgotCQk8ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSIgCi0JCQkJaW5jbHVkZXM9IioqLyoiCi0JCQkJZGVmYXVsdGV4Y2x1ZGVzPSJubyIKLQkJCS8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnYXRoZXJMb2dzIj4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS9jb21waWxlbG9ncyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJnYXRoZXJMb2dzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPHVuemlwIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRMYWJlbH0vY29tcGlsZWxvZ3MiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L2ZlYXR1cmVzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmxvZy56aXAiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC91bnppcD4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlQWJvdXRNYXBwaW5ncyI+Ci0JCTxyZXBsYWNlIGRpcj0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucyIgdmFsdWU9IiR7YnVpbGRJZH0iIHRva2VuPSJAYnVpbGRJZEAiPgotCQkJPGluY2x1ZGUgbmFtZT0iKiovYWJvdXQubWFwcGluZ3MiIC8+Ci0JCTwvcmVwbGFjZT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InVwZGF0ZVJjcEluaUZpbGUiPgotCQk8cmVwbGFjZSBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9IiB2YWx1ZT0iJHtidWlsZElkfSIgdG9rZW49IkBidWlsZElkQCI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqKi9lcGYuaW5pIiAvPgotCQk8L3JlcGxhY2U+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJ1cGRhdGVCdWlsZFN0YXRlIj4KLQkJPHRzdGFtcD4KLQkJCTxmb3JtYXQgcHJvcGVydHk9ImJ1aWxkRGF0ZSIgcGF0dGVybj0ieXl5eS1NTS1kIi8+Ci0JCTwvdHN0YW1wPgotCQk8cHJvcGVydHkgbmFtZT0iY3VycmVudEJ1aWxkU3RhdGVGaWxlIiB2YWx1ZT0iJHtidWlsZFN0YXRlRGlyfS90YWcuY3VycmVudC5wcm9wZXJ0aWVzIi8+Ci0JCTxwcm9wZXJ0eSBmaWxlPSIke2N1cnJlbnRCdWlsZFN0YXRlRmlsZX0iIHByZWZpeD0icHJldiIvPgotCQk8cHJvcGVydHkgbmFtZT0icHJldi5idWlsZERhdGUiIHZhbHVlPSIke2J1aWxkRGF0ZX0iLz4KLQkJPHBhdGggaWQ9ImJ1aWxkRGlyVGVtcFBhdGgiIGxvY2F0aW9uPSIke2J1aWxkRGlyZWN0b3J5fSIvPgotCQk8cGF0aGNvbnZlcnQgZGlyc2VwPSIvIiBwcm9wZXJ0eT0iYnVpbGREaXJlY3RvcnlQYXRoIiByZWZpZD0iYnVpbGREaXJUZW1wUGF0aCIvPgotCQk8cHJvcGVydHlmaWxlCi0JCSAgICBmaWxlPSIke2N1cnJlbnRCdWlsZFN0YXRlRmlsZX0iCi0JCSAgICBjb21tZW50PSJMYXN0IGJ1aWxkIElEIGFuZCBkYXRlIj4KLQkJICA8ZW50cnkga2V5PSJidWlsZElkIiB2YWx1ZT0iJHtidWlsZElkfSIvPgotCQkgIDxlbnRyeSBrZXk9ImJ1aWxkRGF0ZSIgdmFsdWU9IiR7YnVpbGREYXRlfSIvPgotCQkgIDxlbnRyeSBrZXk9ImJ1aWxkRGlyIiB2YWx1ZT0iJHtidWlsZERpcmVjdG9yeVBhdGh9Ii8+Ci0JCTwvcHJvcGVydHlmaWxlPgotCQk8ZWNobyBmaWxlPSIke2J1aWxkU3RhdGVEaXJ9Ly4uLyR7YnVpbGRJZH0uYnVncyI+aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/cXVlcnlfZm9ybWF0PWFkdmFuY2VkJmFtcDtzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO3Nob3J0X2Rlc2M9JmFtcDtwcm9kdWN0PUVQRiZhbXA7bG9uZ19kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO2xvbmdfZGVzYz0mYW1wO2J1Z19maWxlX2xvY190eXBlPWFsbHdvcmRzc3Vic3RyJmFtcDtidWdfZmlsZV9sb2M9JmFtcDtzdGF0dXNfd2hpdGVib2FyZF90eXBlPWFsbHdvcmRzc3Vic3RyJmFtcDtzdGF0dXNfd2hpdGVib2FyZD0mYW1wO2tleXdvcmRzX3R5cGU9YWxsd29yZHMmYW1wO2tleXdvcmRzPSZhbXA7ZW1haWx0eXBlMT1zdWJzdHJpbmcmYW1wO2VtYWlsMT0mYW1wO2VtYWlsdHlwZTI9c3Vic3RyaW5nJmFtcDtlbWFpbDI9JmFtcDtidWdpZHR5cGU9aW5jbHVkZSZhbXA7YnVnX2lkPSZhbXA7dm90ZXM9JmFtcDtjaGZpZWxkZnJvbT0ke3ByZXYuYnVpbGREYXRlfSZhbXA7Y2hmaWVsZHRvPSR7YnVpbGREYXRlfSZhbXA7Y2hmaWVsZD1yZXNvbHV0aW9uJmFtcDtjaGZpZWxkdmFsdWU9JmFtcDtjbWR0eXBlPWRvaXQmYW1wO29yZGVyPVJldXNlK3NhbWUrc29ydCthcytsYXN0K3RpbWUmYW1wO2ZpZWxkMC0wLTA9bm9vcCZhbXA7dHlwZTAtMC0wPW5vb3AmYW1wO3ZhbHVlMC0wLTA9Ci08L2VjaG8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tCi0JPHRhcmdldCBuYW1lPSJwdXNoMlNpdGUiPgotCQk8cHJvcGVydHkgbmFtZT0idXBTY3JpcHRBcmdzIiB2YWx1ZT0iLi4uIi8+Ci0JCTxleGVjIGRpcj0iJHtidWlsZGVyfSIgZXhlY3V0YWJsZT0iJHt1cFNjcmlwdH0iIG91dHB1dD0iZXBmX3B1c2gyc3ZyLm91dHB1dC50eHQiPgotCQkJPGFyZyBsaW5lPSIke3VwU2NyaXB0QXJnc30iLz4KLQkJPC9leGVjPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjaGVja291dERMUGciPgotCQk8Y3ZzIGN2c1Jvb3Q9IiR7dXBkYXRlU2l0ZVJlcG99IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9lcGZTaXRlIiBwYWNrYWdlPSIke3VwZGF0ZVNpdGVGaWxlfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ1cGRhdGVETFBnIiBkZXBlbmRzPSJjaGVja291dERMUGciPgotCQk8cHJvcGVydHkgbmFtZT0iY29tbWl0TXNnIiB2YWx1ZT0iTmlnaHRseV9CdWlsZHMiLz4KLQkJPHByb3BlcnR5IG5hbWU9InVwZGF0ZVBhZ2VBcmdzIiB2YWx1ZT0iJHt0Z3RWZXJ9ICR7dGd0TWlsZXN0b25lfSAke2VwZi5idWlsZElkfSAke2J1aWxkRGlyZWN0b3J5fS9lcGZTaXRlLyR7dXBkYXRlU2l0ZUZpbGV9Ii8+Ci0JCTxleGVjIGRpcj0iJHtidWlsZGVyfSIgZXhlY3V0YWJsZT0iczovYmluL2VwZl9jaGFuZ2VwYWdlLmNtZCIgb3V0cHV0PSJlcGZfY2hhbmdlcGFnZS5vdXRwdXQudHh0Ij4KLQkJCTxhcmcgbGluZT0iJHt1cGRhdGVQYWdlQXJnc30iLz4KLQkJPC9leGVjPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjb21taXRETFBnIiBkZXBlbmRzPSJ1cGRhdGVETFBnIiB1bmxlc3M9Im5vRExQZyI+Ci0JCTxjdnMgY3ZzUm9vdD0iJHt1cGRhdGVTaXRlUmVwb30iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L2VwZlNpdGUvJHt1cGRhdGVTaXRlRmlsZX0iIGNvbW1hbmQ9ImNoZWNraW4gLW0gJHtjb21taXRNc2d9ICR7dXBkYXRlU2l0ZUZpbGV9Ii8+Ci0JPC90YXJnZXQ+Ci0JLS0+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBzZXR1cCAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVNldHVwIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbkJ1aWxkRGlyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHNldHVwIGJ1dCBiZWZvcmUgc3RhcnRpbmcgdGhlIGJ1aWxkIHByb3BlciAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RTZXR1cCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2V0QmFzZUNvbXBvbmVudHMiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIGZldGNoaW5nIHRoZSBidWlsZCBlbGVtZW50cyAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZUZldGNoIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgZmV0Y2hpbmcgdGhlIGJ1aWxkIGVsZW1lbnRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdEZldGNoIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdNYXBGaWxlcyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdlbmVyYXRlQWJvdXRNYXBwaW5ncyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InVwZGF0ZVJjcEluaUZpbGUiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGJ1aWxkIHNjcmlwdHMuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlR2VuZXJhdGUiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBnZW5lcmF0aW5nIHRoZSBidWlsZCBzY3JpcHRzLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RHZW5lcmF0ZSI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY2xlYW4iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgdGhlIGJ1aWxkLnhtbHMgZm9yIHRoZSBlbGVtZW50cyBiZWluZyBidWlsdC4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVQcm9jZXNzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgcnVubmluZyB0aGUgYnVpbGQueG1scyBmb3IgdGhlIGVsZW1lbnRzIGJlaW5nIGJ1aWx0LiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RQcm9jZXNzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgYXNzZW1ibGUuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlQXNzZW1ibGUiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciAgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0QXNzZW1ibGUiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBwYWNrYWdlLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVBhY2thZ2UiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciAgcnVubmluZyBwYWNrYWdlLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RQYWNrYWdlIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIGJ1aWxkIGlzIGRvbmUuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdEJ1aWxkIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnYXRoZXJMb2dzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0idXBkYXRlQnVpbGRTdGF0ZSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyB0byB0ZXN0IHRoZSBidWlsZCByZXN1bHRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0idGVzdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIHRvIHB1Ymxpc2ggdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwdWJsaXNoIj4KLQkJPCEtLQotCQk8YW50Y2FsbCB0YXJnZXQ9InB1c2gyU2l0ZSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbW1pdERMUGciLz4KLQkJLS0+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IllvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2hlbiBpbnZva2luZyB0aGlzIGZpbGUiLz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3JlYWRtZS50eHQgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjZTE5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXJ1bi5iYXQJCQliYXRjaCBmaWxlIHRvIHJ1biBoZWFkbGVzcyBidWlsZAotYnVpbGQucHJvcGVydGllcwljb250YWlucyBidWlsZCBvcHRpb25zCi1hbGxFbGVtZW50cy54bWwJCWJ1aWxkIHNjcmlwdAotY3VzdG9tVGFyZ2V0cy54bWwJYnVpbGQgc2NyaXB0Ci1yZWFkbWUudHh0CQl0aGlzIGZpbGUKLWJ1aWxkLwkJCWRpcmVjdG9yeSBjb250YWluaW5nIHNvdXJjZSBwdWxsZWQgZnJvbSBDVlMgYW5kIGJ1aWxkIG91dHB1dCAtIHRvIGJlIGNsZWFuZWQgdXAgYWZ0ZXIgZXZlcnkgYnVpbGQKLXRlbXBsYXRlcy8JCWRpcmVjdG9yeSBjb250YWluaW5nIHRlbXBsYXRlIGZpbGVzIGZyb20gZWNsaXBzZQotd29ya3NwYWNlLwkJd29ya3NwYWNlIGNyZWF0ZWQgYnkgRWNsaXBzZSBJREUgYXMgbWVudGlvbmVkIGluIDEuNgotCi0KLU1vcmUgRGV0YWlsZWQgSW5zdHJ1Y3Rpb25zCi0KLTEuIFNldCB1cCBIZWFkbGVzcyBCdWlsZCBFbnZpcm9ubWVudAotCi0gIDEuMSBJbnN0YWxsIEpTREsgaXMgb24gdGhlIHN5c3RlbSBhbmQgbWFrZSBzdXJlIGphdmEuZXhlIGlzIGF2YWlsYWJsZSBvbiBzeXN0ZW0gUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gW0pBVkFFWEVdCi0gIDEuMiBJbnN0YWxsIEFwYWNoZSBBTlQgb24gdGhlIHN5c3RlbSBhbmQgbWFrZSBzdXJlIHRoZSBBbnQgYmluYXJpZXMgYXJlIGFjY2Vzc2libGUgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgMS4zIEluc3RhbGwgSUVTIG9yIE9wZW4tU291cmNlIEVjbGlwc2UgU0RQIGlzIG9uIHRoZSBzeXN0ZW0gYW5kIG5vdGUgdGhlIGluc3RhbGwgbG9jYXRpb24gb2YgRWNsaXBzZSBbRUNMSVBTRUhPTUVdCi0gIDEuNCBPYnRhaW4gdGhlIHBsdWdpbnMgb3JnLmVjbGlwc2UucGRlLmJ1aWxkIGFuZCBoYXZlIHRoaXMgcGx1Z2luIGluIHRoZSBFY2xpcHNlIFNEUCBbU0NSSVBUU0hPTUVdCi0gIDEuNSBPYnRhaW4gdGhlIEhFQURMRVNTIGJ1aWxkIHNjcmlwdHMgYW5kIHB1dCB0aGVtIGl0IGEgZGlyZWN0b3J5IGJ5IHRoZW1zZWx2ZXMgW0JVSUxESE9NRV0KLSAgMS42IFN0YXJ0IEVjbGlwc2UgU0RQIGFuZCBkZWZpbmUgYSB3b3Jrc3BhY2UgbG9jYXRpb24gW1dPUktTUEFDRV0uICBBbGxvdyB0aGUgSURFIHRvIHN0YXJ0IGZ1bGx5IGFuZCB0aGVuIGV4aXQuICBPbmx5IHRoZSB3b3Jrc3BhY2UgaXMgbmVlZGVkLgotCi0KLTIuIEN1c3RvbWl6ZSB0aGUgSGVhZGxlc3MgQnVpbGQgU2NyaXB0cwotCi0gIDIuMSBNb2RpZnkgcnVuLmJhdCBmaWxlIHRvIHN1aXQgeW91ciBlbnZpcm9ubWVudC4KLSAgMi4yIE1vZGlmeSBidWlsZC5wcm9wZXJ0aWVzIG1ha2luZyBzdXJlIHRoYXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBhZGRyZXNzZWQuCi0gICAgICAgIHByb2R1Y3Q9Ci0gICAgICAgIGJ1aWxkRGlyZWN0b3J5PQotICAgICAgICBiYXNlPQotICAgICAgICBiYXNlTG9jYXRpb249Ci0gICAgICAgIG1hcHNSZXBvPQotICAgICAgICBtYXBzUm9vdD0KLSAgICAgICAgZmV0Y2hUYWc9Ci0gIDIuMyBNb2RpZnkgYWxsRWxlbWVudHMueG1sCi0JUHJvdmlkZSB0aGUgY29ycmVjdCB0b3AgbGV2ZWwgZmVhdHVyZSBiZWluZyBidWlsdC4KLQlQcm92aWRlIHRoZSBjb3JyZWN0IGVsZW1lbnRQYXRoIHByb3BlcnR5IGluIHRoZSBhbGxFbGVtZW50c0RlbGVnYXRvciB0YXJnZXQuCi0KLSAgMi40IE1ha2Ugc3VyZSB0aGUgbWFwIGZpbGVzIGluIG9yZy5lY2xpcHNlLmVwZi5yZWxlbmcvbWFwcyBhcmUgYWNjdXJhdGUKLQotCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvcnVuLmJhdCBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9ydW4uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTUxM2YyLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9ydW4uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotQGVjaG8gb2ZmCi1zZXRsb2NhbAotCi1SRU0gVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBoZWFkbGVzcyBidWlsZCBzY3JpcHRzICYgcmVzb3VyY2UgZmlsZXMgbGl2ZS4KLXNldCBCVUlMREhPTUU9JX5kcDAKLQotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNICogICAgICAgICAgQ0hBTkdFIFRIRVNFIFNFVFRJTkdTICAgICAgICAgKgotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1SRU0gVGhlIEpSRSBqYXZhLmV4ZSB0byBiZSB1c2VkCi1zZXQgSkFWQUVYRT1DOlxiaW5camRrXHN1blxiaW5camF2YS5leGUKLQotUkVNIHRoZSBFY2xpcHNlIHRvIHVzZQotc2V0IEVDTElQU0VIT01FPUM6XGJpblxzZHBcMy4yLjJcZWNsaXBzZQotCi1SRU0gQ1ZTIGxvZ2luIGluZm8gLSBwcm92aWRlIENWUyB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkCi1SRU0gOmV4dHNzaDo8dXNlcm5hbWU+OjxwYXNzd29yZD4KLVJFTSBwdXQgIiIgYXJvdW5kIHRoZSB2YWx1ZSBpZiBpdCBjb250YWlucyBub24tYWxwaGFudW1lcmljIGNoYXJzCi1zZXQgQ1ZTSU5GTz06cHNlcnZlcjphbm9ueW1vdXMKLQotUkVNIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0YWcuY3VycmVudC5wcm9wZXJ0aWVzCi1TRVQgQlVJTERTVEFURURJUj1TOlxwcm9qZWN0c1xlcGZcMS4yLjBcc3RhdGUKLQotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNICogICAgIERPIE5PVCBDSEFOR0UgVEhFU0UgU0VUVElOR1MgICAgICAgKgotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1SRU0gVGhlIEVjbGlwc2Ugc3RhcnR1cC5qYXIKLXNldCBTVEFSVFVQSkFSPSIlRUNMSVBTRUhPTUUlXHN0YXJ0dXAuamFyIgotCi1SRU0gVGhlIHNjcmlwdHMgZGlyZWN0b3J5IGluIHRoZSBvcmcuZWNsaXBzZS5wZGUuYnVpbGQgRWNsaXBzZSBwbHVnaW4uCi1zZXQgU0NSSVBUU0hPTUU9IiVFQ0xJUFNFSE9NRSVccGx1Z2luc1xvcmcuZWNsaXBzZS5wZGUuYnVpbGRfMy4yLjEucjMyMV92MjAwNjA4MjNcc2NyaXB0cyIKLQotUkVNIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgaGVhZGxlc3MgYnVpbGQgc2NyaXB0cyAmIHJlc291cmNlIGZpbGVzIGxpdmUuCi1SRU0gc2V0IEJVSUxESE9NRT1DOlxidWlsZHNcZXBmXzExMFxoZWFkbGVzcwotc2V0IEJVSUxESE9NRT0lfmRwMAotCi1SRU0gVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wb3JhcnkgYnVpbGQgd29ya3NwYWNlCi1zZXQgV09SS1NQQUNFPSVCVUlMREhPTUUlXHdvcmtzcGFjZQotCi1SRU0gVGhlIGJ1aWxkZmlsZSB0byB1c2UgZm9yIHRoZSBidWlsZAotc2V0IEJVSUxERklMRT1idWlsZC54bWwKLQotUkVNIFRoZSBidWlsZGVyIGRpcmVjdG9yeSBjb250YWluaW5nIGJ1aWxkLnByb3BlcnRpZXMKLVJFTSBidWlsZC5wcm9wZXJ0aWVzLCBhbGxFbGVtZW50cy54bWwgYW5kIGN1c3RvbVRhcmdldHMueG1sIG5lZWRzIHRvIGJlIGluIHRoZSBzYW1lIHBsYWNlCi1zZXQgQlVJTERFUkRJUj0lQlVJTERIT01FJQotCi1zZXQgSE9VUj0ldGltZTp+MCwyJQotaWYgIiVIT1VSOn4wLDElIj09IiAiIHNldCBIT1VSPTAldGltZTp+MSwxJQotc2V0IEJVSUxESUQ9JWRhdGU6fi00JSVkYXRlOn40LDIlJWRhdGU6fjcsMiUtJUhPVVIlJXRpbWU6fjMsMiUKLQotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi1pZiBub3QgZXhpc3QgJUpBVkFFWEUlIGVjaG8gRVJST1I6IGluY29ycmVjdCBqYXZhLmV4ZT0lSkFWQUVYRSUsIGVkaXQgdGhpcyBmaWxlIGFuZCBjb3JyZWN0IHRoZSBKQVZBRVhFIGVudmFyCi1pZiBub3QgZXhpc3QgJUpBVkFFWEUlIGdvdG8gZG9uZQotCi1pZiBub3QgZXhpc3QgJVNUQVJUVVBKQVIlIGVjaG8gRVJST1I6IGluY29ycmVjdCBzdGFydHVwLmphcj0lU1RBUlRVUEpBUiUsIGVkaXQgdGhpcyBmaWxlIGFuZCBjb3JyZWN0IHRoZSBTVEFSVFVQSkFSIGVudmFyCi1pZiBub3QgZXhpc3QgJVNUQVJUVVBKQVIlIGdvdG8gZG9uZQotCi1pZiBub3QgZXhpc3QgJUJVSUxERVJESVIlIGVjaG8gRVJST1I6IGluY29ycmVjdCBidWlsZGVyZGlyPSVCVUlMREVSRElSJSwgZWRpdCB0aGlzIGZpbGUgYW5kIGNvcnJlY3QgdGhlIEJVSUxERVJESVIgZW52YXIKLWlmIG5vdCBleGlzdCAlQlVJTERFUkRJUiUgZ290byBkb25lCi0KLWlmIG5vdCBleGlzdCAlQlVJTERTVEFURURJUiUgZWNobyBFUlJPUjogaW5jb3JyZWN0IGJ1aWxkU3RhdGVEaXI9JUJVSUxEU1RBVEVESVIlLCBlZGl0IHRoaXMgZmlsZSBhbmQgY29ycmVjdCB0aGUgQlVJTERTVEFURURJUiBlbnZhcgotaWYgbm90IGV4aXN0ICVCVUlMRFNUQVRFRElSJSBnb3RvIGRvbmUKLQotCi06cnVuCi0KLXB1c2hkICVTQ1JJUFRTSE9NRSUKLQotaWYgbm90IGV4aXN0ICVCVUlMREZJTEUlIGVjaG8gRVJST1I6IGluY29ycmVjdCBidWlsZGZpbGU9JUJVSUxERklMRSUsIGVkaXQgdGhpcyBmaWxlIGFuZCBjb3JyZWN0IHRoZSBCVUlMREZJTEUgZW52YXIKLWlmIG5vdCBleGlzdCAlQlVJTERGSUxFJSBnb3RvIGRvbmUKLQotQGVjaG8gb24KLQotcmQgL3MgL3EgJVdPUktTUEFDRSUKLQotJUpBVkFFWEUlIC1jcCAlU1RBUlRVUEpBUiUgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluIC1ub3VwZGF0ZSAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyIC1kYXRhICVXT1JLU1BBQ0UlIC1idWlsZGZpbGUgJUJVSUxERklMRSUgLURidWlsZGVyPSVCVUlMREVSRElSJSAtRGJ1aWxkSWQ9JUJVSUxESUQlIC1EYnVpbGRTdGF0ZURpcj0lQlVJTERTVEFURURJUiUgLURjdnNJbmZvPSVDVlNJTkZPJSAtRGJhc2VMb2NhdGlvbj0lRUNMSVBTRUhPTUUlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5Ci0KLUBlY2hvIG9mZgotcG9wZAotCi06ZG9uZQotUkVNIHBhdXNlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2FsbEVsZW1lbnRzLnhtbCBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvYWxsRWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVlYzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvYWxsRWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iYWxsRWxlbWVudHMgRGVsZWdhdG9yIj4KLQkKLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTwhLS0gUnVuIGEgZ2l2ZW4gJHt0YXJnZXR9IG9uIGFsbCBlbGVtZW50cyBiZWluZyBidWlsdCAgICAgICAgICAgICAgICAgICAgIC0tPgotIAk8IS0tIFJlcGxhY2UgZWxlbWVudC5pZCB3aXRoIHRoZSBpZCBvZiB0aGUgdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuICAgIC0tPgotCTwhLS0gSWYgZWxlbWVudC5pZCBkb2VzIG5vdCBleGlzdCBpbiAke2J1aWxkRGlyZWN0b3J5fS9mZWF0dXJlcy9lbGVtZW50LmlkICAgLS0+Ci0JPCEtLSBvciAke2Jhc2VMb2NhdGlvbn0vZmVhdHVyZXMvZWxlbWVudC5pZCwgdGhlbiB5b3UgbXVzdCBwcm92aWRlIHRoZSAgICAgICAtLT4KLQk8IS0tIGxvY2F0aW9uIGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5ICJwbHVnaW5QYXRoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotIAk8IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAgICAgICAgICAgICAtLT4KLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHNEZWxlZ2F0b3IiPgotIAkJPGFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSIke3RhcmdldH0iPgotCSAJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZmVhdHVyZSIgLz4KLQkgCQk8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJlbGVtZW50LmlkIiAvPgotIAkJPC9hbnQ+Ci0gCTwvdGFyZ2V0PgotIAotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPCEtLSBUYXJnZXRzIHRvIGFzc2VtYmxlIHRoZSBidWlsdCBlbGVtZW50cyBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9ucyAgLS0+Ci0gCTwhLS0gVGhlc2UgZ2VuZXJhbGx5IGNhbGwgdGhlIGdlbmVyYXRlZCBhc3NlbWJsZSBzY3JpcHRzIChuYW1lZCBpbiAgICAgICAgIC0tPgotIAk8IS0tICR7YXNzZW1ibGVTY3JpcHROYW1lfSkgYnV0IG1heSBhbHNvIGFkZCBwcmUgYW5kIHBvc3QgcHJvY2Vzc2luZyAgICAgICAtLT4KLSAJPCEtLSBBZGQgb25lIHRhcmdldCBmb3IgZWFjaCByb290IGVsZW1lbnQgYW5kIGVhY2ggY29uZmlndXJhdGlvbiAgICAgICAgICAgLS0+Ci0gCTwhLS0gUmVwbGFjZSBlbGVtZW50LmlkIHdpdGggdGhlIGlkIG9mIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdCAgIC0tPgotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5lbGVtZW50LmlkWy5jb25maWcuc3BlY10iPgotIAkJPGFudCBhbnRmaWxlPSIke2Fzc2VtYmxlU2NyaXB0TmFtZX0iIGRpcj0iJHtidWlsZERpcmVjdG9yeX0iLz4KLSAJPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTk1ODUuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGFyYW1ldGVycyBkZXNjcmliaW5nIGhvdyBhbmQgd2hlcmUgdG8gZXhlY3V0ZSB0aGUgYnVpbGQuCi0jIFR5cGljYWwgdXNlcnMgbmVlZCBvbmx5IHVwZGF0ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0jICAgIGJhc2VMb2NhdGlvbiAtIHdoZXJlIHRoaW5ncyB5b3UgYXJlIGJ1aWxkaW5nIGFnYWluc3QgYXJlIGluc3RhbGxlZAotIyAgICBib290Y2xhc3NwYXRoIC0gVGhlIGJhc2UgamFycyB0byBjb21waWxlIGFnYWluc3QgKHR5cGljYWx5IHJ0LmphcikKLSMgICAgY29uZmlncyAtIHRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgCi0jCi0jIE9mIGNvdXJzZSBhbnkgb2YgdGhlIHNldHRpbmdzIGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3BlYydpbmcgCi0jIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSAoZS5nLiwgLURiYXNlTG9jYXRpb249ZDovZWNsaXBzZQotCi0jIyMjIyMjIyMjIyMjIFBST0RVQ1QvUEFDS0FHSU5HIENPTlRST0wgIyMjIyMjIyMjIyMjIwotcHJvZHVjdD0vcGx1Z2luIG9yIGZlYXR1cmUgaWQvcGF0aC90by8ucHJvZHVjdAotcnVuUGFja2FnZXI9dHJ1ZQotCi0jU2V0IHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIHRoYXQgd2lsbCByZXN1bHQgZnJvbSB0aGUgcHJvZHVjdCBidWlsZC4KLSNhcmNoaXZlTmFtZVByZWZpeD0KLQotIyBUaGUgcHJlZml4IHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgYXJjaGl2ZS4KLWFyY2hpdmVQcmVmaXg9PG91dHB1dCBhcmNoaXZlIHJvb3Q+Ci0KLSMgVGhlIGxvY2F0aW9uIHVuZGVyd2hpY2ggYWxsIG9mIHRoZSBidWlsZCBvdXRwdXQgd2lsbCBiZSBjb2xsZWN0ZWQuCi1jb2xsZWN0aW5nRm9sZGVyPSR7YXJjaGl2ZVByZWZpeH0KLQotIyBUaGUgbGlzdCBvZiB7b3MsIHdzLCBhcmNofSBjb25maWd1cmF0aW9ucyB0byBidWlsZC4gIFRoaXMgCi0jIHZhbHVlIGlzIGEgJyYnIHNlcGFyYXRlZCBsaXN0IG9mICcsJyBzZXBhcmF0ZSB0cmlwbGVzLiAgRm9yIGV4YW1wbGUsIAotIyAgICAgY29uZmlncz13aW4zMix3aW4zMix4ODYgJiBsaW51eCxtb3RpZix4ODYKLSMgQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgKiwqLCoKLSNjb25maWdzPXdpbjMyLCB3aW4zMiwgeDg2ICYgXAotIwlsaW51eCwgZ3RrLCBwcGMgJlwKLSMgbGludXgsIGd0aywgeDg2ICYgXAotIwlsaW51eCwgZ3RrLCB4ODZfNjQgJiBcCi0jCWxpbnV4LCBtb3RpZiwgeDg2ICYgXAotIwlzb2xhcmlzLCBtb3RpZiwgc3BhcmMgJiBcCi0jCXNvbGFyaXMsIGd0aywgc3BhcmMgJiBcCi0jCWFpeCwgbW90aWYsIHBwYyAmIFwKLSMJaHB1eCwgbW90aWYsIFBBX1JJU0MgJiBcCi0jCW1hY29zeCwgY2FyYm9uLCBwcGMKLQotIyBCeSBkZWZhdWx0IFBERSBjcmVhdGVzIG9uZSBhcmNoaXZlIChyZXN1bHQpIHBlciBlbnRyeSBsaXN0ZWQgaW4gdGhlIGNvbmZpZ3MgcHJvcGVydHkuCi0jIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnkgd2lsbCBjYXVzZSBQREUgdG8gb25seSBjcmVhdGUgb25lIG91dHB1dCBjb250YWluaW5nIGFsbCAKLSMgYXJ0aWZhY3RzIGZvciBhbGwgdGhlIHBsYXRmb3JtcyBsaXN0ZWQgaW4gdGhlIGNvbmZpZ3MgcHJvcGVydHkuCi0jZ3JvdXBDb25maWd1cmF0aW9ucz10cnVlCi0KLSNUaGUgZm9ybWF0IG9mIHRoZSBhcmNoaXZlLiBCeSBkZWZhdWx0IGEgemlwIGlzIGNyZWF0ZWQgdXNpbmcgYW50WmlwLgotI1RoZSBsaXN0IGNhbiBvbmx5IGNvbnRhaW4gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHdoaWNoIHRoZSBkZXNpcmVkIGZvcm1hdCBpcyBkaWZmZXJlbnQgdGhhbiB6aXAuCi0jYXJjaGl2ZXNGb3JtYXQ9d2luMzIsIHdpbjMyLCB4ODYgLSBhbnRaaXAmIFwKLSMJbGludXgsIGd0aywgcHBjIC0gYW50WmlwICZcCi0jICAgIGxpbnV4LCBndGssIHg4NiAtIGFudFppcCYgXAotIwlsaW51eCwgZ3RrLCB4ODZfNjQgLSBhbnRaaXAmIFwKLSMgbGludXgsIG1vdGlmLCB4ODYgLSBhbnRaaXAmIFwKLSMJc29sYXJpcywgbW90aWYsIHNwYXJjIC0gYW50WmlwJiBcCi0jCXNvbGFyaXMsIGd0aywgc3BhcmMgLSBhbnRaaXAmIFwKLSMJYWl4LCBtb3RpZiwgcHBjIC0gYW50WmlwJiBcCi0jCWhwdXgsIG1vdGlmLCBQQV9SSVNDIC0gYW50WmlwJiBcCi0jCW1hY29zeCwgY2FyYm9uLCBwcGMgLSBhbnRaaXAKLQkKLSNTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgb3V0cHV0IHRvIGJlIHJlYWR5IGZvciBhbiB1cGRhdGUgamFyIChubyBzaXRlLnhtbCBnZW5lcmF0ZWQpCi0jb3V0cHV0VXBkYXRlSmFycyA9IGZhbHNlCi0KLSNTZXQgdG8gdHJ1ZSBmb3IgSm5scCBnZW5lcmF0aW9uCi0jY29kZWJhc2Ugc2hvdWxkIGJlIGEgVVJMIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByb290IG9mIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoZSBvdXRwdXQuCi0jZ2VuZXJhdGVKbmxwPWZhbHNlCi0jam5scC5jb2RlYmFzZT08Y29kZWJhc2UgdXJsPgotI2pubHAuajJzZT08ajJzZSB2ZXJzaW9uPgotI2pubHAubG9jYWxlPTxhIGxvY2FsZT4KLQotI1NldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHNpZ24gamFycwotI3NpZ25KYXJzPWZhbHNlCi0jc2lnbi5hbGlhcz08YWxpYXM+Ci0jc2lnbi5rZXlzdG9yZT08a2V5c3RvcmUgbG9jYXRpb24+Ci0jc2lnbi5zdG9yZXBhc3M9PGtleXN0b3JlIHBhc3N3b3JkPgotCi0jQXJndW1lbnRzIHRvIHNlbmQgdG8gdGhlIHppcCBleGVjdXRhYmxlCi16aXBhcmdzPQotCi0jQXJndW1lbnRzIHRvIHNlbmQgdG8gdGhlIHRhciBleGVjdXRhYmxlCi10YXJhcmdzPQotCi0jQ29udHJvbCB0aGUgY3JlYXRpb24gb2YgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHZlcnNpb24gaW5jbHVkZWQgaW4gZWFjaCBjb25maWd1cmF0aW9uIC0gb24gYnkgZGVmYXVsdCAKLSNnZW5lcmF0ZVZlcnNpb25zTGlzdHM9ZmFsc2UKLQotIyMjIyMjIyMjIyMjIyMgQlVJTEQgTkFNSU5HIENPTlRST0wgIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGJ1aWxkIGVsZW1lbnRzIGFyZSBmZXRjaGVkIGFuZCB3aGVyZQotIyB0aGUgYnVpbGQgdGFrZXMgcGxhY2UuCi1idWlsZERpcmVjdG9yeT0ke3VzZXIuaG9tZX0vZWNsaXBzZS5idWlsZAotCi0jIFR5cGUgb2YgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0LiAgVHlwaWNhbGx5IHRoaXMgdmFsdWUgaXMKLSMgb25lIG9mIEksIE4sIE0sIFMsIC4uLgotYnVpbGRUeXBlPUkKLQotIyBJRCBvZiB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0LgotYnVpbGRJZD1UZXN0QnVpbGQKLQotIyBMYWJlbCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAotYnVpbGRMYWJlbD0ke2J1aWxkVHlwZX0uJHtidWlsZElkfQotCi0jIFRpbWVzdGFtcCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAotdGltZXN0YW1wPTAwNwotCi0jVGhlIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBxdWFsaWZpZXIgb2YgYSBwbHVnaW4gb3IgZmVhdHVyZSB3aGVuIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSB2YWx1ZSBjb21wdXRlZCBieSBwZGUuCi0jVGhlIHZhbHVlIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHBsdWdpbiBvciBmZWF0dXJlcyBpbmRpY2F0aW5nIGJ1aWxkLnByb3BlcnRpZXMsIHF1YWxpZmllciA9IGNvbnRleHQgCi0jZm9yY2VDb250ZXh0UXVhbGlmaWVyPTx0aGUgdmFsdWUgZm9yIHRoZSBxdWFsaWZpZXI+Ci0KLSNFbmFibGUgLyBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGEgc3VmZml4IGZvciB0aGUgZmVhdHVyZXMgdGhhdCB1c2UgLnF1YWxpZmllci4gCi0jVGhlIGdlbmVyYXRlZCBzdWZmaXggaXMgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmZWF0dXJlICAgCi0jZ2VuZXJhdGVGZWF0dXJlVmVyc2lvblN1ZmZpeD10cnVlCi0KLSMjIyMjIyMjIyMjIyMgQkFTRSBDT05UUk9MICMjIyMjIyMjIyMjIyMKLSMgU2V0dGluZ3MgZm9yIHRoZSBiYXNlIEVjbGlwc2UgY29tcG9uZW50cyBhbmQgSmF2YSBjbGFzcyBsaWJyYXJpZXMgCi0jIGFnYWluc3Qgd2hpY2ggeW91IGFyZSBidWlsZGluZy4KLSMgQmFzZSBsb2NhdGlvbiBmb3IgYW55dGhpbmcgdGhlIGJ1aWxkIG5lZWRzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIEZvciBleGFtcGxlLAotIyBpbiBtb3N0IFJDUCBhcHAgb3IgYSBwbHVnLWluLCAgdGhlIGJhc2VMb2NhdGlvbiBzaG91bGQgYmUgdGhlIGxvY2F0aW9uIG9mIGEgcHJldmlvdXNseQotIyBpbnN0YWxsZWQgRWNsaXBzZSBhZ2FpbnN0IHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBvciBwbHVnLWluIGNvZGUgd2lsbCBiZSBjb21waWxlZCBhbmQgdGhlIFJDUCBkZWx0YSBwYWNrLgotCi1iYXNlPTxwYXRoL3RvL3BhcmVudC9vZi9lY2xpcHNlPgotYmFzZUxvY2F0aW9uPSR7YmFzZX0vZWNsaXBzZQotI09zL1dzL0FyY2gvbmwgb2YgdGhlIGVjbGlwc2Ugc3BlY2lmaWVkIGJ5IGJhc2VMb2NhdGlvbgotYmFzZW9zPXdpbjMyCi1iYXNld3M9d2luMzIKLWJhc2VhcmNoPXg4NgotCi0jcGx1Z2luUGF0aCBpcyBhIGxpc3Qgb2YgbG9jYXRpb25zIGluIHdoaWNoIHRvIGZpbmQgcGx1Z2lucyBhbmQgZmVhdHVyZXMuICBUaGlzIGxpc3QgaXMgc2VwYXJhdGVkIGJ5IHRoZSBwbGF0Zm9ybSBmaWxlIHNlcGFyYXRvciAoOyBvciA6KQotI2EgbG9jYXRpb24gaXMgb25lIG9mOiAgCi0jLSB0aGUgbG9jYXRpb24gb2YgdGhlIGphciBvciBmb2xkZXIgdGhhdCBpcyB0aGUgcGx1Z2luIG9yIGZlYXR1cmUgOiAvcGF0aC90by9mb28uamFyIG9yIC9wYXRoL3RvL2ZvbwotIy0gYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhIC9wbHVnaW5zIG9yIC9mZWF0dXJlcyBzdWJkaXJlY3RvcnkKLSMtIHRoZSBsb2NhdGlvbiBvZiBhIGZlYXR1cmUueG1sLCBvciBmb3IgMi4xIHN0eWxlIHBsdWdpbnMsIHRoZSBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbAotI3BsdWdpblBhdGg9Ci0KLXNraXBCYXNlPXRydWUKLWVjbGlwc2VVUkw9PHVybCBmb3IgZWNsaXBzZSBkb3dubG9hZCBzaXRlPgotZWNsaXBzZUJ1aWxkSWQ9PElkIG9mIEVjbGlwc2UgYnVpbGQgdG8gZ2V0PgotZWNsaXBzZUJhc2VVUkw9JHtlY2xpcHNlVVJMfS9lY2xpcHNlLXBsYXRmb3JtLSR7ZWNsaXBzZUJ1aWxkSWR9LXdpbjMyLnppcAotCi0KLSMjIyMjIyMjIyMjIyMgTUFQIEZJTEUgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi0jIFRoaXMgc2VjdGlvbiBkZWZpbmVzIENWUyB0YWdzIHRvIHVzZSB3aGVuIGZldGNoaW5nIHRoZSBtYXAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4KLSMgSWYgeW91IHdhbnQgdG8gZmV0Y2ggdGhlIG1hcCBmaWxlIGZyb20gcmVwb3NpdG9yeSAvIGxvY2F0aW9uLCBjaGFuZ2UgdGhlIGdldE1hcEZpbGVzIHRhcmdldCBpbiB0aGUgY3VzdG9tVGFyZ2V0cy54bWwKLQotc2tpcE1hcHM9dHJ1ZQotbWFwc1JlcG89OnBzZXJ2ZXI6YW5vbnltb3VzQGV4YW1wbGUuY29tL3BhdGgvdG8vcmVwbwotbWFwc1Jvb3Q9cGF0aC90by9tYXBzCi1tYXBzQ2hlY2tvdXRUYWc9SEVBRAotCi0jdGFnTWFwcz10cnVlCi1tYXBzVGFnVGFnPXYke2J1aWxkSWR9Ci0KLQotIyMjIyMjIyMjIyMjIFJFUE9TSVRPUlkgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBzZWN0aW9uIGRlZmluZXMgcHJvcGVydGllcyBwYXJhbWV0ZXJpemluZyB0aGUgcmVwb3NpdG9yaWVzIHdoZXJlIHBsdWdpbnMsIGZyYWdtZW50cwotIyBidW5kbGVzIGFuZCBmZWF0dXJlcyBhcmUgYmVpbmcgb2J0YWluZWQgZnJvbS4gCi0KLSMgVGhlIHRhZ3MgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgZWxlbWVudHMgdG8gYnVpbGQuCi0jIEJ5IGRlZmF1bHQgdGhlYnVpbGRlciB3aWxsIHVzZSB3aGF0ZXZlciBpcyBpbiB0aGUgbWFwcy4gIAotIyBUaGlzIHZhbHVlIHRha2VzIHRoZSBmb3JtIG9mIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBpZGVudGlmaWVyIChsaWtlIHVzZWQgaW4gdGhlIG1hcCBmaWxlcykgYW5kIHRoZSAKLSMgb3ZlcnJpZGluZyB2YWx1ZQotIyBGb3IgZXhhbXBsZSBmZXRjaFRhZz1DVlM9SEVBRCwgU1ZOPXYyMDA1MDEwMQotIyBmZXRjaFRhZz1IRUFECi1za2lwRmV0Y2g9dHJ1ZQotCi0KLSMjIyMjIyMjIyMjIyMgSkFWQSBDT01QSUxFUiBPUFRJT05TICMjIyMjIyMjIyMjIyMjCi0jIFRoZSBsb2NhdGlvbiBvZiB0aGUgSmF2YSBqYXJzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIFR5cGljYWxseSB0aGUgcnQuamFyIGZvciB5b3VyIEpESy9KUkUKLSNib290Y2xhc3NwYXRoPSR7amF2YS5ob21lfS9saWIvcnQuamFyCi0KLSMgc3BlY2lmaWMgSlJFIGxvY2F0aW9ucyB0byBjb21waWxlIGFnYWluc3QuIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBjb21waWxlIGJ1bmRsZXMgc3BlY2lmeWluZyBhIAotIyBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudC4gVW5jb21tZW50IGFuZCBzZXQgdmFsdWVzIGZvciBlbnZpcm9ubWVudHMgdGhhdCB5b3Ugc3VwcG9ydAotI0NEQy0xLjAvRm91bmRhdGlvbi0xLjA9IC9wYXRoL3RvL3J0LmphcgotI0NEQy0xLjEvRm91bmRhdGlvbi0xLjE9Ci0jT1NHaS9NaW5pbXVtLTEuMD0KLSNPU0dpL01pbmltdW0tMS4xPQotI0pSRS0xLjE9Ci0jSjJTRS0xLjI9Ci0jSjJTRS0xLjM9Ci0jSjJTRS0xLjQ9Ci0jSjJTRS0xLjU9Ci0jSmF2YVNFLTEuNj0KLSNQZXJzb25hbEphdmEtMS4xPQotI1BlcnNvbmFsSmF2YS0xLjI9Ci0jQ0RDLTEuMC9QZXJzb25hbEJhc2lzLTEuMD0KLSNDREMtMS4wL1BlcnNvbmFsSmF2YS0xLjA9Ci0jQ0RDLTEuMS9QZXJzb25hbEJhc2lzLTEuMT0KLSNDREMtMS4xL1BlcnNvbmFsSmF2YS0xLjE9Ci0KLSMgU3BlY2lmeSB0aGUgb3V0cHV0IGZvcm1hdCBvZiB0aGUgY29tcGlsZXIgbG9nIHdoZW4gZWNsaXBzZSBqZHQgaXMgdXNlZAotbG9nRXh0ZW5zaW9uPS5sb2cKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGRlYnVnIGluZm8gaW4gdGhlIG91dHB1dCBqYXJzCi1qYXZhY0RlYnVnSW5mbz1mYWxzZSAKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBmYWlsIHRoZSBidWlsZCBpZiB0aGVyZSBhcmUgY29tcGlsZXIgZXJyb3JzCi1qYXZhY0ZhaWxPbkVycm9yPXRydWUKLQotIyBFbmFibGUgb3IgZGlzYWJsZSB2ZXJib3NlIG1vZGUgb2YgdGhlIGNvbXBpbGVyCi1qYXZhY1ZlcmJvc2U9dHJ1ZQotCi0jIEV4dHJhIGFyZ3VtZW50cyBmb3IgdGhlIGNvbXBpbGVyLiBUaGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGphdmEgY29tcGlsZXIgYmVpbmcgdXNlZC4KLSNjb21waWxlckFyZz0KLQotIyBEZWZhdWx0IHZhbHVlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUuIFRoaXMgdmFsdWUgaXMgdXNlZCB3aGVuIGNvbXBpbGluZyBwbHVnLWlucyB0aGF0IGRvIG5vdCBzZXQgdGhlIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IG9yIHNldCBqYXZhY1NvdXJjZSBpbiBidWlsZC5wcm9wZXJ0aWVzCi0jamF2YWNTb3VyY2U9MS4zCi0KLSMgRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIGJ5dGUgY29kZSB0YXJnZXRlZC4gVGhpcyB2YWx1ZSBpcyB1c2VkIHdoZW4gY29tcGlsaW5nIHBsdWctaW5zIHRoYXQgZG8gbm90IHNldCB0aGUgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgb3Igc2V0IGphdmFjVGFyZ2V0IGluIGJ1aWxkLnByb3BlcnRpZXMuCi0jamF2YWNUYXJnZXQ9MS4xCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9jdXN0b21UYXJnZXRzLnhtbCBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvY3VzdG9tVGFyZ2V0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzI1NmYuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9jdXN0b21UYXJnZXRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSdW4gYSBnaXZlbiAke3RhcmdldH0gb24gYWxsIGVsZW1lbnRzIGJlaW5nIGJ1aWx0IC0tPgotCTwhLS0gQWRkIG9uIDxhbnQ+IHRhc2sgZm9yIGVhY2ggdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJhbGxFbGVtZW50c0ZpbGUiIHZhbHVlPSIke2J1aWxkZXJ9L2FsbEVsZW1lbnRzLnhtbCIvPgotCTxpbXBvcnQgZmlsZT0iJHthbGxFbGVtZW50c0ZpbGV9Ii8+Ci0JPHRhcmdldCBuYW1lPSJhbGxFbGVtZW50cyI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsRWxlbWVudHNEZWxlZ2F0b3IiLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImdldEJhc2VDb21wb25lbnRzIiBkZXBlbmRzPSJjaGVja0xvY2FsQmFzZSIgdW5sZXNzPSJza2lwQmFzZSI+Ci0JCTxnZXQgc3JjPSIke2VjbGlwc2VCYXNlVVJMfSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vLi4vdGVtcC1iYXNlLnppcCIvPgotCQk8dW56aXAgZGVzdD0iJHtiYXNlfSIgb3ZlcndyaXRlPSJ0cnVlIiBzcmM9IiR7YnVpbGREaXJlY3Rvcnl9Ly4uL3RlbXAtYmFzZS56aXAiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2hlY2tMb2NhbEJhc2UiPgotCQk8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZX0iIHByb3BlcnR5PSJza2lwQmFzZSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBDaGVjayBvdXQgbWFwIGZpbGVzIGZyb20gY29ycmVjdCByZXBvc2l0b3J5IC0tPgotCTwhLS0gUmVwbGFjZSB2YWx1ZXMgZm9yIG1hcHNDaGVja291dFRhZyBhcyBkZXNpcmVkLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImdldE1hcEZpbGVzIiBkZXBlbmRzPSJjaGVja0xvY2FsTWFwcyIgdW5sZXNzPSJza2lwTWFwcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXBzQ2hlY2tvdXRUYWciIHZhbHVlPSJIRUFEIi8+Ci0JCTxjdnMgY3ZzUm9vdD0iJHttYXBzUmVwb30iIHBhY2thZ2U9IiR7bWFwc1Jvb3R9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIiB0YWc9IiR7bWFwc0NoZWNrb3V0VGFnfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjaGVja0xvY2FsTWFwcyI+Ci0JCTxhdmFpbGFibGUgcHJvcGVydHk9InNraXBNYXBzIiBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InRhZ01hcEZpbGVzIiBpZj0idGFnTWFwcyI+Ci0JCTxjdnMgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vbWFwcy8ke21hcHNSb290fSIgY29tbWFuZD0idGFnICR7bWFwc1RhZ1RhZ30iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgdW5sZXNzPSJub2NsZWFuIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGxFbGVtZW50cyI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iY2xlYW5FbGVtZW50Ii8+Ci0JCTwvYW50Y2FsbD4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyTG9ncyI+Ci0JCTxta2RpciBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRMYWJlbH0vY29tcGlsZWxvZ3MiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGxFbGVtZW50cyI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iZ2F0aGVyTG9ncyIvPgotCQk8L2FudGNhbGw+Ci0JCTx1bnppcCBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkTGFiZWx9L2NvbXBpbGVsb2dzIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9mZWF0dXJlcyI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5sb2cuemlwIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvdW56aXA+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBzZXR1cCAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVNldHVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgc2V0dXAgYnV0IGJlZm9yZSBzdGFydGluZyB0aGUgYnVpbGQgcHJvcGVyIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFNldHVwIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnZXRCYXNlQ29tcG9uZW50cyIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZmV0Y2hpbmcgdGhlIGJ1aWxkIGVsZW1lbnRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlRmV0Y2giPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0RmV0Y2giPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgYnVpbGQgc2NyaXB0cy4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVHZW5lcmF0ZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIGdlbmVyYXRpbmcgdGhlIGJ1aWxkIHNjcmlwdHMuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdEdlbmVyYXRlIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyB0aGUgYnVpbGQueG1scyBmb3IgdGhlIGVsZW1lbnRzIGJlaW5nIGJ1aWx0LiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVByb2Nlc3MiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBydW5uaW5nIHRoZSBidWlsZC54bWxzIGZvciB0aGUgZWxlbWVudHMgYmVpbmcgYnVpbHQuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFByb2Nlc3MiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVBc3NlbWJsZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIGFzc2VtYmxlLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RBc3NlbWJsZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBydW5uaW5nIHBhY2thZ2UuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlUGFja2FnZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIHBhY2thZ2UuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFBhY2thZ2UiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgYnVpbGQgaXMgZG9uZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0QnVpbGQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlckxvZ3MiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gdG8gdGVzdCB0aGUgYnVpbGQgcmVzdWx0cyAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InRlc3QiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyB0byBwdWJsaXNoIHRoZSBidWlsZCByZXN1bHRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHVibGlzaCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IllvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2hlbiBpbnZva2luZyB0aGlzIGZpbGUiLz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvbWFwcy9lcGZfZW4ubWFwIGIvMS41L3JlbGVuZy9tYXBzL2VwZl9lbi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjVlOWMuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9tYXBzL2VwZl9lbi5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmU9djIwMDgwNjI3LTExMTcsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlPXYyMDA4MDYyNC0xMzExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmU9djIwMDgwNjI0LTEzMTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZT12MjAwODA2MjQtMTMxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlPXYyMDA4MDYyNC0xMzExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQud2luMzIuZmVhdHVyZT1IRUFELDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQud2luMzIuZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQubGludXguZmVhdHVyZT1IRUFELDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubGludXguZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlPXYyMDA4MDUxNC0yMjAzLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aT12MjAwODA3MDItMTQyOCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmJhc2U9djIwMDgwNzAxLTE0NDgsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuY29tbW9uPXYyMDA4MDcwNS0xOTI5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24KLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U9djIwMDgwNTAxLTE0MzMsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aT12MjAwODA0MzAtMTcwOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODY9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZD12MjAwODA2MjctMTYwOCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZD12MjAwODA2MjctMTYwOCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlPXYyMDA4MDcwMS0xNDQ4LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0PXYyMDA4MDYyNi0xMTI0LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD12MjAwODA3MDItMTMzNiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpPXYyMDA4MDYyNi0xMTI0LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZD12MjAwODA2MjctMTYwOCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmRvYz12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmV4cG9ydD12MjAwODA1MjgtMTczOCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A9djIwMDgwNjI2LTE0NTcsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sPXYyMDA4MDQzMC0xNzA5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jPXYyMDA4MDUyMC0xNjU0LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ9djIwMDgwNzAxLTEyNDMsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sPXYyMDA4MDYyNi0xNDU3LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk9djIwMDgwNzAzLTA5MDYsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0PXYyMDA4MDcwMS0xMzU4LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpPXYyMDA4MDYyNS0xOTE3LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZT12MjAwODA2MjMtMTAwNSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpPXYyMDA4MDYyNC0xNDU4LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pPXYyMDA4MDMxNy0xNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaT12MjAwODA0MzAtMTcwOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW09djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nPXYyMDA4MDcwMi0xMzQyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk9djIwMDgwNzAyLTEzNDIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmNwPXYyMDA4MDUwMS0xNzU1LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmNwLnVpPXYyMDA4MDYxNi0xODQ4LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ9djIwMDgwNjEwLTIyMjUsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlYXJjaD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aT12MjAwODA2MDktMTk0Myw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzPXYyMDA4MDUwMi0xODE2LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi51aT12MjAwODA0MDItMTIxMCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYudWkuaW50cm89djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYT12MjAwODA1MzAtMTcyMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZT12MjAwODA2MjUtMTkxNyw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0PXYyMDA4MDUxOS0xNzM2LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnhtbC51bWE9djIwMDgwNDMwLTE3MDksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL21hcHMvZXBmX25sczEubWFwIGIvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMxLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhNWQyOS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL21hcHMvZXBmX25sczEubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sczE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMxCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sczE9djIwMDcxMDE4LTE4NTksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sczEKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudW1hLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyLm1hcCBiLzEuNS9yZWxlbmcvbWFwcy9lcGZfbmxzMi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTg2N2UuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyLm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmxzMgotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyPXYyMDA3MTAxOC0xODU5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvbWFwcy9lcGZfbmxzMmEubWFwIGIvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyYS5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDc2YjQuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyYS5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmxzMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMyYQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyYT12MjAwNzEwMTgtMTg1OSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmxzMmEKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51bWEubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL21hcHMvZXBmX3Rlc3RzLm1hcCBiLzEuNS9yZWxlbmcvbWFwcy9lcGZfdGVzdHMubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTViZTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvbWFwcy9lcGZfdGVzdHMubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlPXYyMDA4MDIxMS0xODM5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM9djIwMDgwMjExLTE4MzksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cz12MjAwODAyMTEtMTgzOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cz12MjAwODAyMTgtMTc0Niw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHM9djIwMDgwMjExLTE4MzksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi50ZXN0cz12MjAwODAyMTEtMTgzOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzLmh0bWwgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyMzIwOS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNzkgKzAsMCBAQAot77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiCi14bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTAiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDEwIj4KLTxsaW5rIHJlbD1GaWxlLUxpc3QgaHJlZj0icmVsZWFzZS1ub3Rlc19maWxlcy9maWxlbGlzdC54bWwiPgotPGxpbmsgcmVsPUVkaXQtVGltZS1EYXRhIGhyZWY9InJlbGVhc2Utbm90ZXNfZmlsZXMvZWRpdGRhdGEubXNvIj4KLTwhLS1baWYgIW1zb10+Ci08c3R5bGU+Ci12XDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9Ci1vXDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9Ci13XDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9Ci0uc2hhcGUge2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpO30KLTwvc3R5bGU+Ci08IVtlbmRpZl0tLT4KLTx0aXRsZT5JQk0gUmF0aW9uYWwgTWV0aG9kIENvbXBvc2VyIC0gUmVsZWFzZSBOb3RlczwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOkF1dGhvcj5JQk1fVVNFUjwvbzpBdXRob3I+Ci0gIDxvOkxhc3RBdXRob3I+SUJNX1VTRVI8L286TGFzdEF1dGhvcj4KLSAgPG86UmV2aXNpb24+OTwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjI0PC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA2LTA0LTE5VDIyOjU1OjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNi0wNC0yMVQyMjoxNjowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz4xPC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xOTU4PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjExMTYzPC9vOkNoYXJhY3RlcnM+Ci0gIDxvOkNvbXBhbnk+SUJNPC9vOkNvbXBhbnk+Ci0gIDxvOkxpbmVzPjkzPC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjI2PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjEzMDk1PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjEwLjY3MzU8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpTcGVsbGluZ1N0YXRlPkNsZWFuPC93OlNwZWxsaW5nU3RhdGU+Ci0gIDx3OkdyYW1tYXJTdGF0ZT5DbGVhbjwvdzpHcmFtbWFyU3RhdGU+Ci0gIDx3OkJyb3dzZXJMZXZlbD5NaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyNDwvdzpCcm93c2VyTGV2ZWw+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLSBAZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OldpbmdkaW5nczsKLQlwYW5vc2UtMTo1IDAgMCAwIDAgMCAwIDAgMCAwOwotCW1zby1mb250LWNoYXJzZXQ6MjsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTphdXRvOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTowIDI2ODQzNTQ1NiAwIDAgLTIxNDc0ODM2NDggMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLSBwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotaDEKLQl7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCW1zby1vdXRsaW5lLWxldmVsOjE7Ci0JZm9udC1zaXplOjI0LjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQlmb250LXdlaWdodDpib2xkO30KLWgyCi0Je21zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQltc28tb3V0bGluZS1sZXZlbDoyOwotCWZvbnQtc2l6ZToxOC4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JZm9udC13ZWlnaHQ6Ym9sZDt9Ci1oMwotCXttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JbXNvLW91dGxpbmUtbGV2ZWw6MzsKLQlmb250LXNpemU6MTMuNXB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCWZvbnQtd2VpZ2h0OmJvbGQ7fQotYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluawotCXtjb2xvcjpibHVlOwotCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci0JdGV4dC11bmRlcmxpbmU6c2luZ2xlO30KLWE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZAotCXtjb2xvcjpibHVlOwotCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci0JdGV4dC11bmRlcmxpbmU6c2luZ2xlO30KLXAKLQl7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotY29kZQotCXtmb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1hc2NpaS1mb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1oYW5zaS1mb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7fQotc3Bhbi5TcGVsbEUKLQl7bXNvLXN0eWxlLW5hbWU6IiI7Ci0JbXNvLXNwbC1lOnllczt9Ci1zcGFuLkdyYW1FCi0Je21zby1zdHlsZS1uYW1lOiIiOwotCW1zby1ncmFtLWU6eWVzO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotIC8qIExpc3QgRGVmaW5pdGlvbnMgKi8KLSBAbGlzdCBsMAotCXttc28tbGlzdC1pZDo4MDg4MDI2MzsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6MjA3NDEwMDgyNjt9Ci1AbGlzdCBsMDpsZXZlbDEKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Ou+CtzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6U3ltYm9sO30KLUBsaXN0IGwxCi0Je21zby1saXN0LWlkOjE2NDcxMjk0NTsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTEzMDY2MTU2OTY7fQotQGxpc3QgbDE6bGV2ZWwxCi0Je21zby1sZXZlbC1zdGFydC1hdDozOwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDIKLQl7bXNvLWxpc3QtaWQ6MjA3NDk3NTY3OwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotODM0MjE5NTMyO30KLUBsaXN0IGwyOmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDI6bGV2ZWwyCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDpvOwotCW1zby1sZXZlbC10YWItc3RvcDoxLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsKLQltc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AbGlzdCBsMjpsZXZlbDMKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjEuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDI6bGV2ZWw0Ci0Je21zby1sZXZlbC10YWItc3RvcDoyLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwyOmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjpsZXZlbDYKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDI6bGV2ZWw3Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwyOmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjpsZXZlbDkKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDMKLQl7bXNvLWxpc3QtaWQ6MzIwODE0NDIzOwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotNDc3OTgyNzI2O30KLUBsaXN0IGwzOmxldmVsMQotCXttc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw0Ci0Je21zby1saXN0LWlkOjM5NjgyNjgyNDsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTQ1Njg3MTQzMDt9Ci1AbGlzdCBsNDpsZXZlbDEKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Ou+CtzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6U3ltYm9sO30KLUBsaXN0IGw0OmxldmVsMgotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ6bzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Ci0JbXNvLWJpZGktZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQGxpc3QgbDQ6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw0OmxldmVsNAotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsNDpsZXZlbDUKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDQ6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw0OmxldmVsNwotCXttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsNDpsZXZlbDgKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDQ6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw1Ci0Je21zby1saXN0LWlkOjQ5MjE4MzMzNTsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE4MTgwODUyNTY7fQotQGxpc3QgbDU6bGV2ZWwxCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDrvgrc7Ci0JbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OlN5bWJvbDt9Ci1AbGlzdCBsNTpsZXZlbDIKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Om87Ci0JbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBsaXN0IGw2Ci0Je21zby1saXN0LWlkOjUxNTE5Mjc4MzsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE5OTk0NjgxODA7fQotQGxpc3QgbDY6bGV2ZWwxCi0Je21zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDcKLQl7bXNvLWxpc3QtaWQ6NTgwNzE2NzEzOwotCW1zby1saXN0LXR5cGU6aHlicmlkOwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotOTE3MDc2MTMyIDY3Njk4NzAzIDY3Njk4NjkxIDY3Njk4NjkzIDY3Njk4Njg5IDY3Njk4NjkxIDY3Njk4NjkzIDY3Njk4Njg5IDY3Njk4NjkxIDY3Njk4NjkzO30KLUBsaXN0IGw3OmxldmVsMQotCXttc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw4Ci0Je21zby1saXN0LWlkOjY1NTQ1MDI5NDsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTM4NzE3MDEzMjt9Ci1AbGlzdCBsODpsZXZlbDEKLQl7bXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsODpsZXZlbDIKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDg6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw4OmxldmVsNAotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsODpsZXZlbDUKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDg6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw4OmxldmVsNwotCXttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsODpsZXZlbDgKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDg6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw5Ci0Je21zby1saXN0LWlkOjg3NTg0NzI4NDsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE5ODc2NzUzMjY7fQotQGxpc3QgbDk6bGV2ZWwxCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDrvgrc7Ci0JbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OlN5bWJvbDt9Ci1AbGlzdCBsOTpsZXZlbDIKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Om87Ci0JbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBsaXN0IGwxMAotCXttc28tbGlzdC1pZDo5NjkwMTY1NDA7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjEzOTA5NDM2NTY7fQotQGxpc3QgbDEwOmxldmVsMQotCXttc28tbGV2ZWwtc3RhcnQtYXQ6NDsKLQltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMDpsZXZlbDIKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Om87Ci0JbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBsaXN0IGwxMQotCXttc28tbGlzdC1pZDo5OTU1NzI5OTc7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjE2MTMyNTA0NDI7fQotQGxpc3QgbDExOmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDEyCi0Je21zby1saXN0LWlkOjEwMDk3OTQxMzY7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjE0NjY3MTMzNjA7fQotQGxpc3QgbDEyOmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDEyOmxldmVsMgotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ6bzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Ci0JbXNvLWJpZGktZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQGxpc3QgbDEyOmxldmVsMwotCXttc28tbGV2ZWwtdGFiLXN0b3A6MS41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTI6bGV2ZWw0Ci0Je21zby1sZXZlbC10YWItc3RvcDoyLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMjpsZXZlbDUKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDEyOmxldmVsNgotCXttc28tbGV2ZWwtdGFiLXN0b3A6My4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTI6bGV2ZWw3Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMjpsZXZlbDgKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDEyOmxldmVsOQotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTMKLQl7bXNvLWxpc3QtaWQ6MTAxMTEwOTA0MTsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTM4NzQwNTkxMjt9Ci1AbGlzdCBsMTM6bGV2ZWwxCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDrvgrc7Ci0JbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OlN5bWJvbDt9Ci1AbGlzdCBsMTM6bGV2ZWwyCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMzpsZXZlbDMKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjEuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDEzOmxldmVsNAotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTM6bGV2ZWw1Ci0Je21zby1sZXZlbC10YWItc3RvcDoyLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMzpsZXZlbDYKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDEzOmxldmVsNwotCXttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTM6bGV2ZWw4Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMzpsZXZlbDkKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE0Ci0Je21zby1saXN0LWlkOjEwNzMyMzg3NDg7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOi0yODEwOTU1MzA7fQotQGxpc3QgbDE0OmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDE0OmxldmVsMgotCXttc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTQ6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNDpsZXZlbDQKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE0OmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTQ6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNDpsZXZlbDcKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE0OmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTQ6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNQotCXttc28tbGlzdC1pZDoxMDk1MzE4OTkwOwotCW1zby1saXN0LXRlbXBsYXRlLWlkczoyMDI0NjgwMTI0O30KLUBsaXN0IGwxNTpsZXZlbDEKLQl7bXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTU6bGV2ZWwyCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDpvOwotCW1zby1sZXZlbC10YWItc3RvcDoxLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsKLQltc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AbGlzdCBsMTU6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNTpsZXZlbDQKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE1OmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTU6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNTpsZXZlbDcKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE1OmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTU6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNgotCXttc28tbGlzdC1pZDoxMTAzNDU4NjE3OwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotMTIzODQ1NDM2Mjt9Ci1AbGlzdCBsMTY6bGV2ZWwxCi0Je21zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE2OmxldmVsMgotCXttc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTY6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNjpsZXZlbDQKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE2OmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTY6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNjpsZXZlbDcKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE2OmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTY6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNwotCXttc28tbGlzdC1pZDoxNDk4OTU0NTU3OwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotMTYxMjk0OTE1MDt9Ci1AbGlzdCBsMTc6bGV2ZWwxCi0Je21zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE4Ci0Je21zby1saXN0LWlkOjE4MjY3Nzg1MDM7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjc2MDg5MzUyMDt9Ci1AbGlzdCBsMTg6bGV2ZWwxCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDrvgrc7Ci0JbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OlN5bWJvbDt9Ci1AbGlzdCBsMTkKLQl7bXNvLWxpc3QtaWQ6MjA0NDIwODY0MDsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6Mjk5MTI5NTk4O30KLUBsaXN0IGwxOTpsZXZlbDEKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Ou+CtzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6U3ltYm9sO30KLUBsaXN0IGwyMAotCXttc28tbGlzdC1pZDoyMDg5MTgzNzQ2OwotCW1zby1saXN0LXRlbXBsYXRlLWlkczozNjA2MzY0ODA7fQotQGxpc3QgbDIwOmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDIwOmxldmVsMgotCXttc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjA6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwyMDpsZXZlbDQKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDIwOmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjA6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwyMDpsZXZlbDcKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDIwOmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjA6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLW9sCi0Je21hcmdpbi1ib3R0b206MGluO30KLXVsCi0Je21hcmdpbi1ib3R0b206MGluO30KLS0tPgotPC9zdHlsZT4KLTwhLS1baWYgZ3RlIG1zbyAxMF0+Ci08c3R5bGU+Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLSB0YWJsZS5Nc29Ob3JtYWxUYWJsZQotCXttc28tc3R5bGUtbmFtZToiVGFibGUgTm9ybWFsIjsKLQltc28tdHN0eWxlLXJvd2JhbmQtc2l6ZTowOwotCW1zby10c3R5bGUtY29sYmFuZC1zaXplOjA7Ci0JbXNvLXN0eWxlLW5vc2hvdzp5ZXM7Ci0JbXNvLXN0eWxlLXBhcmVudDoiIjsKLQltc28tcGFkZGluZy1hbHQ6MGluIDUuNHB0IDBpbiA1LjRwdDsKLQltc28tcGFyYS1tYXJnaW46MGluOwotCW1zby1wYXJhLW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci08L3N0eWxlPgotPCFbZW5kaWZdLS0+Ci08bWV0YSBuYW1lPWNvcHlyaWdodCBjb250ZW50PSIoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA2Ij4KLTxtZXRhIG5hbWU9REMucmlnaHRzLm93bmVyIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDYiPgotPG1ldGEgbmFtZT1zZWN1cml0eSBjb250ZW50PXB1YmxpYz4KLTxtZXRhIG5hbWU9Um9ib3RzIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyI+Ci08bWV0YSBodHRwLWVxdWl2PVBJQ1MtTGFiZWwKLWNvbnRlbnQ9IihQSUNTLTEuMSAmcXVvdDtodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCZxdW90OyBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgJnF1b3Q7aHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwmcXVvdDsgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICZxdW90O2h0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyZxdW90OyBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpIj4KLTxtZXRhIG5hbWU9REMuRm9ybWF0IGNvbnRlbnQ9WEhUTUw+Ci08bWV0YSBuYW1lPURDLkxhbmd1YWdlIGNvbnRlbnQ9ZW4tdXM+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIExpY2Vuc2VkIE1hdGVyaWFscyBQcm9wZXJ0eSBvZiBJQk0gLS0+PCEtLSBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0tPjwhLS0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgLS0+PCEtLSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIC0tPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIGxpbms9Ymx1ZSB2bGluaz1ibHVlIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxoMT5FUEYgQ29tcG9zZXIgUmVsZWFzZSBOb3RlczwvaDE+Ci0KLTxwPjxzdHJvbmc+UmVsZWFzZSAxLjAtTTI8L3N0cm9uZz48L3A+Ci0KLTxoMj48YSBuYW1lPWludHJvPjwvYT48bzpwPiZuYnNwOzwvbzpwPjwvaDI+Ci0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPgotCi08cD5UaGlzIGlzIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiBFUEYgQ29tcG9zZXIuIFRoZSBtYWluIGZlYXR1cmVzIGFkZGVkIGluIHRoaXMKLXJlbGVhc2UgaW5jbHVkZSB0aGUgZm9sbG93aW5nOjwvcD4KLQotPHVsIHR5cGU9ZGlzYz4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDIgbGV2ZWwxIGxmbzM7dGFiLXN0b3BzOmxpc3QgLjVpbic+U3VwcG9ydCBmb3IgTGludXggcGxhdGZvcm1zPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDIgbGV2ZWwxIGxmbzM7dGFiLXN0b3BzOmxpc3QgLjVpbic+U2V2ZXJhbCBmdW5jdGlvbmFsCi0gICAgIGltcHJvdmVtZW50cyBhbmQgZml4ZXM8L2xpPgotPC91bD4KLQotPGgyPjxhIG5hbWU9cmVxdWlyZW1lbnRzPjwvYT5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9oMj4KLQotPGgzPjxhIG5hbWU9aGFyZHdhcmU+PC9hPkhhcmR3YXJlIFJlcXVpcmVtZW50czwvaDM+Ci0KLTx1bCB0eXBlPWRpc2M+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw0IGxldmVsMSBsZm82O3RhYi1zdG9wczpsaXN0IC41aW4nPjxzcGFuIGNsYXNzPUdyYW1FPkludGVsKFRNKQotICAgICBQZW50aXVtwq4gSUlJIDgwMCBNSHogb3IgaGlnaGVyIHByb2Nlc3Nvci48L3NwYW4+IDwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw0IGxldmVsMSBsZm82O3RhYi1zdG9wczpsaXN0IC41aW4nPjxzcGFuIGNsYXNzPUdyYW1FPjc2ODwvc3Bhbj4KLSAgICAgTUIgUkFNIG1pbmltdW0uIE1vcmUgbWVtb3J5IDxzcGFuIGNsYXNzPUdyYW1FPmlzIHJlY29tbWVuZGVkPC9zcGFuPiBhcyBpdAotICAgICBpbXByb3ZlcyByZXNwb25zaXZlbmVzcy4gPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDQgbGV2ZWwxIGxmbzY7dGFiLXN0b3BzOmxpc3QgLjVpbic+RGlzayBzcGFjZTogPC9saT4KLSA8dWwgdHlwZT1jaXJjbGU+Ci0gIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDoKLSAgICAgIGF1dG87bXNvLWxpc3Q6bDQgbGV2ZWwyIGxmbzY7dGFiLXN0b3BzOmxpc3QgMS4waW4nPjxzcGFuIGNsYXNzPUdyYW1FPjUwCi0gICAgICBNQiB0byBpbnN0YWxsIEVQRiBDb21wb3Nlci48L3NwYW4+IDwvbGk+Ci0gPC91bD4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDQgbGV2ZWwxIGxmbzY7dGFiLXN0b3BzOmxpc3QgLjVpbic+PHNwYW4gY2xhc3M9R3JhbUU+RGlzcGxheQotICAgICByZXNvbHV0aW9uIG9mIDEwMjQgeCA3NjggeCAyNTYtY29sb3IgdmlkZW8gcmVzb2x1dGlvbiwgb3IgaGlnaGVyLjwvc3Bhbj4KLSAgICAgSGlnaC1jb2xvciBvciB0cnVlLWNvbG9yIHJlY29tbWVuZGVkPC9saT4KLTwvdWw+Ci0KLTxoMz48YSBuYW1lPXNvZnR3YXJlPjwvYT5Tb2Z0d2FyZSBSZXF1aXJlbWVudHM8L2gzPgotCi08cD5UaGUgZm9sbG93aW5nIHNvZnR3YXJlIDxzcGFuIGNsYXNzPUdyYW1FPm11c3QgYmUgaW5zdGFsbGVkPC9zcGFuPiBiZWZvcmUgeW91Ci1pbnN0YWxsIEVQRiBDb21wb3NlcjogPC9wPgotCi08dWwgdHlwZT1kaXNjPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTIgbGV2ZWwxIGxmbzk7dGFiLXN0b3BzOmxpc3QgLjVpbic+T25lIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgb3BlcmF0aW5nIHN5c3RlbXM6IDwvbGk+Ci0gPHVsIHR5cGU9Y2lyY2xlPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxMiBsZXZlbDIgbGZvOTt0YWItc3RvcHM6bGlzdCAxLjBpbic+V2luZG93c8KuIFhQCi0gICAgICBQcm9mZXNzaW9uYWwgd2l0aCBTZXJ2aWNlIFBhY2tzIDEgYW5kIDIgPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPldpbmRvd3MgMjAwMAotICAgICAgUHJvZmVzc2lvbmFsIHdpdGggU2VydmljZSBQYWNrIDQgPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPldpbmRvd3MgMjAwMwotICAgICAgRW50ZXJwcmlzZSBFZGl0aW9uIHdpdGggU2VydmljZSBQYWNrIDE8L2xpPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxMiBsZXZlbDIgbGZvOTt0YWItc3RvcHM6bGlzdCAxLjBpbic+UmVkIEhhdCBFbnRlcnByaXNlCi0gICAgICBMaW51eCA0IFdTPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPlNVU0UgTGludXggU0xFUyA5IFNQMzwvbGk+Ci0gPC91bD4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDEyIGxldmVsMSBsZm85O3RhYi1zdG9wczpsaXN0IC41aW4nPk9uZSBvZiB0aGUgZm9sbG93aW5nCi0gICAgIGJyb3dzZXJzOjwvbGk+Ci0gPHVsIHR5cGU9Y2lyY2xlPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxMiBsZXZlbDIgbGZvOTt0YWItc3RvcHM6bGlzdCAxLjBpbic+SW50ZXJuZXQgRXhwbG9yZXLCrgotICAgICAgNi4wIHdpdGggU2VydmljZSBQYWNrIDE8L2xpPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxMiBsZXZlbDIgbGZvOTt0YWItc3RvcHM6bGlzdCAxLjBpbic+SW50ZXJuZXQgRXhwbG9yZXIgNS41Ci0gICAgICB3aXRoIFNlcnZpY2UgUGFjayAyPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPjxzcGFuIGNsYXNzPVNwZWxsRT5Nb3ppbGxhPC9zcGFuPgotICAgICAgMS43LjEyPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPjxzcGFuIGNsYXNzPVNwZWxsRT5GaXJlZm94PC9zcGFuPgotICAgICAgMS4wLjcgb3IgMS41PGEgbmFtZT1vdGhlcj48L2E+PC9saT4KLSA8L3VsPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTIgbGV2ZWwxIGxmbzk7dGFiLXN0b3BzOmxpc3QgLjVpbic+TWluaW11bSBTVU7CriBKUkUgMS40LjIsIG9yCi0gICAgIGxhdGVyLCBpcyByZWNvbW1lbmRlZC4gPC9saT4KLTwvdWw+Ci0KLTxoMj48YSBuYW1lPWluc3RhbGxpbmc+PC9hPjxhIG5hbWU9ZmVhdHVyZXM+PC9hPk5ldyBGZWF0dXJlczwvaDI+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD5UaGUgbWFpbiBuZXcgZmVhdHVyZXMgaW4gRVBGIENvbXBvc2VyIDxzcGFuIGNsYXNzPUdyYW1FPmFyZQotZGVzY3JpYmVkPC9zcGFuPiBiZWxvdy4gPC9wPgotCi08aDM+RXhwb3J0IHRvIE1pY3Jvc29mdCBQcm9qZWN0PC9oMz4KLQotPHA+WW91IGNhbiBub3cgZXhwb3J0IGEgcHJvY2VzcyB0byBNaWNyb3NvZnQgUHJvamVjdC4gWW91IGNhbiBkbyB0aGlzIGFzCi1mb2xsb3dzOjwvcD4KLQotPG9sIHN0YXJ0PTEgdHlwZT0xPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsOCBsZXZlbDEgbGZvMTI7dGFiLXN0b3BzOmxpc3QgLjVpbic+U3RhcnQgRVBGIENvbXBvc2VyIGFuZCBvcGVuCi0gICAgIHRoZSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIHByb2Nlc3MgeW91IHdhbnQgdG8gZXhwb3J0LjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw4IGxldmVsMSBsZm8xMjt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgPHN0cm9uZz5GaWxlLSZndDtFeHBvcnQ8L3N0cm9uZz4uCi0gICAgIFRoaXMgc3RhcnRzIHRoZSBFeHBvcnQgd2l6YXJkLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw4IGxldmVsMSBsZm8xMjt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgPHN0cm9uZz5NaWNyb3NvZnQKLSAgICAgUHJvamVjdCBUZW1wbGF0ZTwvc3Ryb25nPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9R3JhbUU+PHN0cm9uZz5OZXh0PC9zdHJvbmc+PC9zcGFuPi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsOCBsZXZlbDEgbGZvMTI7dGFiLXN0b3BzOmxpc3QgLjVpbic+Q2hvb3NlIHRoZSB0eXBlIG9mIHByb2Nlc3MKLSAgICAgdG8gZXhwb3J0IC0gQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MgYW5kIHNlbGVjdCB0aGUgcHJvY2VzcwotICAgICB5b3Ugd2FudCB0byBleHBvcnQuIElmIHRoZXJlIDxzcGFuIGNsYXNzPUdyYW1FPmlzPC9zcGFuPiBtb3JlIHRoYW4gb25lCi0gICAgIENvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLCBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24geW91Ci0gICAgIHdhbnQgdG8gdXNlLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw4IGxldmVsMSBsZm8xMjt0YWItc3RvcHM6bGlzdCAuNWluJz5Zb3UgY2FuIGNob29zZSB0byBwdWJsaXNoCi0gICAgIHRoZSBjb25maWd1cmF0aW9uIGF0IHRoZSBzYW1lIHRpbWUgYnkgY2hlY2tpbmcgdGhlICZxdW90O1B1Ymxpc2ggdGhlCi0gICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMmcXVvdDsgY2hlY2tib3guIFlvdSBjYW4gYWxzbyBjaG9vc2UgdG8gb25seSBleHBvcnQKLSAgICAgdGFza3MgYW5kIGFjdGl2aXRpZXMgd2l0aCB0aGUgUGxhbm5lZCBhdHRyaWJ1dGUgc2V0IHRvIHRydWUuIElmIHlvdSBkbyBub3QKLSAgICAgY2hlY2sgdGhpcyBib3gsIGFsbCBhY3Rpdml0aWVzIGFuZCB0YXNrcyBpbiB0aGUgc2VsZWN0ZWQgcHJvY2VzcyA8c3BhbgotICAgICBjbGFzcz1HcmFtRT53aWxsIGJlIGV4cG9ydGVkPC9zcGFuPi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsOCBsZXZlbDEgbGZvMTI7dGFiLXN0b3BzOmxpc3QgLjVpbic+UHJvdmlkZSBhIG5hbWUgZm9yIHlvdXIgZXhwb3J0ZWQKLSAgICAgdGVtcGxhdGUgZmlsZSBhbmQgc2VsZWN0IGEgbG9jYXRpb24gZm9yIHRoZSBmaWxlLiBDbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsOCBsZXZlbDEgbGZvMTI7dGFiLXN0b3BzOmxpc3QgLjVpbic+WW91IGNhbiBvcGVuIHRoZSBYTUwgZmlsZQotICAgICB0aGF0IDxzcGFuIGNsYXNzPUdyYW1FPmlzIGV4cG9ydGVkPC9zcGFuPiB1c2luZyBNaWNyb3NvZnQgUHJvamVjdCAyMDAzIG9yCi0gICAgIGxhdGVyLiBUaGUgWE1MIGZpbGUgZm9ybWF0IDxzcGFuIGNsYXNzPUdyYW1FPmlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZDwvc3Bhbj4KLSAgICAgaW4gZWFybGllciB2ZXJzaW9ucy48L2xpPgotPC9vbD4KLQotPGgzPjxhIG5hbWU9c3luY2hyb25pemF0aW9uPjwvYT5TeW5jaHJvbml6YXRpb24gb2YgUHJvY2Vzc2VzIHRvIE1ldGhvZCBFbGVtZW50czwvaDM+Ci0KLTxwPldoZW4gYSBkZXNjcmlwdG9yIDxzcGFuIGNsYXNzPUdyYW1FPmlzIGNyZWF0ZWQ8L3NwYW4+IGluIGEgcHJvY2VzcywgaXQgaGFzCi10aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIGl0cyBjb3JyZXNwb25kaW5nIGJhc2UgZWxlbWVudC4gSWYgdGhlIGJhc2UgZWxlbWVudCBpcwotY2hhbmdlZCwgdGhlIGNoYW5nZXMgPHNwYW4gY2xhc3M9R3JhbUU+YXJlIG5vdCBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZDwvc3Bhbj4KLWluIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvcnMuIFN5bmNocm9uaXphdGlvbiBhbGxvd3MgeW91IHRvIHVwZGF0ZSBkZXNjcmlwdG9ycwotaW4gYSBwcm9jZXNzIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgbWV0aG9kIGVsZW1lbnQuCi1UaGlzIG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHByb2Nlc3NlcyB1cCB0byBkYXRlIHdpdGggY2hhbmdlcyBtYWRlIHRvIG1ldGhvZAotZWxlbWVudHMgYWZ0ZXIgdGhleSA8c3BhbiBjbGFzcz1HcmFtRT5hcmUgdXNlZDwvc3Bhbj4gaW4gcHJvY2Vzc2VzLjwvcD4KLQotPHA+RWFjaCBkZXNjcmlwdG9yIGhhcyBhIG5ldyBwcm9wZXJ0eSwgdGhlICZxdW90O1N5bmNocm9uaXplZCB3aXRoIHNvdXJjZSZxdW90OwotZmxhZywgd2hpY2ggY2FuIGJlIHNldCBpZiB5b3Ugd2FudCB0byBzeW5jaHJvbml6ZSB0aGUgZWxlbWVudCB3aXRoIGl0cyBiYXNlCi1tZXRob2QgZWxlbWVudC48L3A+Ci0KLTxwPjxzcGFuIGNsYXNzPUdyYW1FPlRoZXJlIGlzIGEgbmV3IHN5bmNocm9uaXphdGlvbiB3aXphcmQgdGhhdDwvc3Bhbj4gYWxsb3dzCi15b3UgdG8gY2hvb3NlIHRoZSBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSBpbiBhIGRlc2NyaXB0b3IgZnJvbSB0aGUgY29ycmVzcG9uZGluZwotYmFzZSBlbGVtZW50LjwvcD4KLQotPHA+PHNwYW4gY2xhc3M9R3JhbUU+VG8gb3BlbiB0aGUgc3luY2hyb25pemF0aW9uIHdpemFyZCwgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLAotcmlnaHQtY2xpY2sgb24gYW55IGJyZWFrZG93biBlbGVtZW50IGFuZCBzZWxlY3QgJnF1b3Q7Q3VzdG9tCi1TeW5jaHJvbml6YXRpb24mcXVvdDsuPC9zcGFuPiBUaGUgd2l6YXJkIGV4cGxhaW5zIHRoZSBmZWF0dXJlIGFuZCBhbGxvd3MgeW91IHRvCi1zZWxlY3Qgd2hpY2ggcHJvcGVydGllcyB0byB1cGRhdGUgZnJvbSB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLQotPHA+WW91IGNhbiBhbHNvIHVwZGF0ZSBhbGwgZWxlbWVudHMgYnkgPHNwYW4gY2xhc3M9R3JhbUU+cmlnaHQtY2xpY2tpbmc8L3NwYW4+Ci1vbiBhIGJyZWFrZG93biBlbGVtZW50IGFuZCBzZWxlY3RpbmcgJnF1b3Q7RGVmYXVsdCBTeW5jaHJvbml6YXRpb24gZnJvbSBNZXRob2QKLUNvbnRlbnQmcXVvdDsuPC9wPgotCi08cD5UaGUgc3luY2hyb25pemF0aW9uIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUgZm9yIGRlc2NyaXB0b3JzIGFuZCBhY3Rpdml0aWVzLgotSWYgeW91IGFwcGx5IHN5bmNocm9uaXphdGlvbiBmb3IgYW4gYWN0aXZpdHksIGFsbCBkZXNjcmlwdG9ycyB3aXRoaW4gdGhlCi1hY3Rpdml0eSB0aGF0IGhhdmUgdGhlICZxdW90O1N5bmNocm9uaXplZCB3aXRoIHNvdXJjZSZxdW90OyBmbGFnIGNoZWNrZWQgPHNwYW4KLWNsYXNzPUdyYW1FPndpbGwgYmUgc3luY2hyb25pemVkPC9zcGFuPi48L3A+Ci0KLTxoMz5JbXByb3ZlbWVudHMgdG8gRGlhZ3JhbXM8L2gzPgotCi08cD5XaGVuIGFuIGVsZW1lbnQgaW4gYW4gZXh0ZW5kZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIDxzcGFuIGNsYXNzPUdyYW1FPmlzCi1zdXBwcmVzc2VkPC9zcGFuPiBpbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20KLXRoZSBjb3JyZXNwb25kaW5nIGRpYWdyYW1zLiBXaGVuIGVsZW1lbnRzIDxzcGFuIGNsYXNzPUdyYW1FPmFyZSByZW1vdmVkPC9zcGFuPgotZnJvbSBhIGRpYWdyYW0sIHRoZSByZXN1bHRpbmcgZGlhZ3JhbSBtYXkgbm90IGJlIHNhdGlzZmFjdG9yeS4gRm9yIGV4YW1wbGUsIHlvdQotbWF5IGhhdmUgbGFyZ2UgZW1wdHkgc3BhY2VzIHRoYXQgc2VlbSBpbmFwcHJvcHJpYXRlLiBZb3UgbWF5IGFsc28gaGF2ZSBub2RlcwotdGhhdCA8c3BhbiBjbGFzcz1HcmFtRT5hcmUgbm90IGNvbm5lY3RlZDwvc3Bhbj4gdG8gYW55dGhpbmcuIFlvdSBjYW4gbWFudWFsbHkKLW1vZGlmeSB0aGVzZSBkaWFncmFtcyB0byBpbXByb3ZlIHRoZWlyIGFwcGVhcmFuY2UuIFlvdSA8c3BhbiBjbGFzcz1HcmFtRT53b24ndDwvc3Bhbj4KLWJlIGFibGUgdG8gbWFrZSBjb25uZWN0aW9ucyB0byBub2RlcyB0aGF0IGFyZSBleHRlbnNpb25zIHRvIG90aGVyIHByb2Nlc3MKLWVsZW1lbnRzICh0aGV5IGFwcGVhciB3aXRoIGdyZWVuIGl0YWxpYyB0ZXh0IHVuZGVyIHRoZSBub2RlKS4gVG8gZW5hYmxlIHRoZQotYWJpbGl0eSB0byBjb25uZWN0IHRvIHRoZXNlIG5vZGVzIG9uIHlvdXIgZGlhZ3JhbSwgbG9jYXRlIHRoZSBub2RlIGluIHRoZSB3b3JrCi1icmVha2Rvd24gc3RydWN0dXJlIChXQlMpIHZpZXcuIENob29zZSAnTG9jYWwgQ29udHJpYnV0aW9uJyBmcm9tIHRoaXMgZWxlbWVudCdzCi1jb250ZXh0IG1lbnUuPC9wPgotCi08cD5JdCBpcyBub3cgcG9zc2libGUgdG8gYXNzb2NpYXRlIGEgZGlhZ3JhbSBwcm9kdWNlZCBpbiBhbiBleHRlcm5hbCBncmFwaGljcwotdG9vbCB3aXRoIGFuIGVsZW1lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiA8c3BhbiBjbGFzcz1HcmFtRT5UbyB1c2UgdGhpcwotZmFjaWxpdHksIGluIHRoZSBwcm9jZXNzIGVkaXRvciwgcmlnaHQtY2xpY2sgb24gYW4gYWN0aXZpdHkgYW5kIHNlbGVjdAotRGlhZ3JhbXMmZ3Q7VXNlciBEZWZpbmVkIERpYWdyYW1zLjwvc3Bhbj4gWW91IGNhbiBzZWxlY3Qgd2hpY2ggdHlwZSBvZiB1c2VyCi1kZWZpbmVkIGRpYWdyYW0geW91IHdhbnQgdG8gdXNlIGFuZCBzZWxlY3QgdGhlIGRpYWdyYW0gZmlsZS48L3A+Ci0KLTxwPllvdSBjYW4gbm93IHJlc2l6ZSB0aGUgbm9kZXMgb24gYW4gYWN0aXZpdHkgZGlhZ3JhbSB0byB3cmFwIHRoZSBuYW1lIG9mIHRoZQotbm9kZS4gPHNwYW4gY2xhc3M9R3JhbUU+T24gYW4gYWN0aXZpdHkgZGlhZ3JhbSBjbGljayBvbiBhbiBhY3Rpdml0eSBvciBhIHRhc2sKLWRlc2NyaXB0b3IuPC9zcGFuPiBBIGJveCB3aXRoIGhhbmRsZXMgPHNwYW4gY2xhc3M9R3JhbUU+aXMgZGlzcGxheWVkPC9zcGFuPgotYXJvdW5kIHRoZSBub2RlLiBVc2UgdGhlIGhhbmRsZXMgb24gdGhlIHNpZGUgb2YgdGhlIGJveCB0byByZWR1Y2Ugb3IgaW5jcmVhc2UKLXRoZSB3aWR0aCBvZiB0aGUgYm94LiBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHkgb3IgdGFzayBkZXNjcmlwdG9yIHdpbGwgd3JhcAotd2l0aGluIHRoZSBuZXcgc2l6ZS48L3A+Ci0KLTxoMz5JbXByb3ZlbWVudHMgdG8gR3VpZGFuY2U8L2gzPgotCi08cD5BIG5ldyB0eXBlIG9mIGd1aWRhbmNlIC0gZXN0aW1hdGluZyBjb25zaWRlcmF0aW9ucyA8c3BhbiBjbGFzcz1HcmFtRT5oYXMKLWJlZW4gYWRkZWQ8L3NwYW4+LiBUaGUgZXN0aW1hdGluZyBjb25zaWRlcmF0aW9ucyBndWlkYW5jZSBhbGxvd3MgeW91IHRvIGFkZAotZ3VpZGFuY2UgYXJvdW5kIGhvdyB0byBlc3RpbWF0ZSBlZmZvcnQgZm9yIHRhc2tzIGFuZCB3b3JrIHByb2R1Y3RzLiA8L3A+Ci0KLTxwPkEgZ3VpZGFuY2UgZWxlbWVudCBjYW4gbm93IGhhdmUgYXNzb2NpYXRlZCBndWlkYW5jZSBlbGVtZW50cy4gV2Ugbm93IHN1cHBvcnQKLWFkZGluZyBndWlkYW5jZSBlbGVtZW50cyB0byBvdGhlciBndWlkYW5jZSBlbGVtZW50cyB1c2luZyBhIG5ldyBHdWlkYW5jZSB0YWIgb24KLXRoZSBndWlkYW5jZSBlbGVtZW50IGVkaXRvci48L3A+Ci0KLTxwPkEgVGVtcGxhdGUgY2FuIG5vdyBoYXZlIG11bHRpcGxlIGZpbGUgYXR0YWNobWVudHMuPC9wPgotCi08aDM+U3VwcG9ydCBmb3IgVGVhbSBQcm9maWxlczwvaDM+Ci0KLTxwPkluIGEgcHJvY2Vzcywgcm9sZXMgPHNwYW4gY2xhc3M9R3JhbUU+Y2FuIG5vdyBiZSBvcmdhbml6ZWQ8L3NwYW4+IGludG8KLXRlYW1zLiBZb3UgZG8gdGhpcyBhcyBmb2xsb3dzOjwvcD4KLQotPG9sIHN0YXJ0PTEgdHlwZT0xPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTYgbGV2ZWwxIGxmbzE1O3RhYi1zdG9wczpsaXN0IC41aW4nPjxzcGFuIGNsYXNzPUdyYW1FPk9uIHRoZQotICAgICBUZWFtIEFsbG9jYXRpb24gdmlldyBpbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHJpZ2h0LWNsaWNrIG9uIGFuIGFjdGl2aXR5Ljwvc3Bhbj4KLSAgICAgU2VsZWN0IE5ldyBDaGlsZCBvciBOZXcgU2libGluZywgYW5kIHRoZW4gc2VsZWN0IFRlYW0gUHJvZmlsZS4gVGhlIFRlYW0KLSAgICAgUHJvZmlsZSA8c3BhbiBjbGFzcz1HcmFtRT53aWxsIGJlIGFkZGVkPC9zcGFuPiBhcyBhIGJyZWFrZG93biBlbGVtZW50IGFuZAotICAgICB5b3UgY2FuIGVkaXQgaXRzIGluZm9ybWF0aW9uIGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE2IGxldmVsMSBsZm8xNTt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgYSByb2xlIGRlc2NyaXB0b3IKLSAgICAgYW5kIG9wZW4gdGhlIHByb3BlcnRpZXMgdmlldy4gVGhlIFRlYW0gdGFiIGFsbG93cyB5b3UgdG8gYXNzaWduIHRoZSByb2xlCi0gICAgIHRvIG9uZSBvciBtb3JlIHRlYW1zLjwvbGk+Ci08L29sPgotCi08cD5Zb3UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgdG8gb3JnYW5pemUgdGhlIHJvbGVzIGluIGEgcHJvY2VzcyBpbnRvIHRlYW1zIGFuZAotc3ViLXRlYW1zLiBUaGUgbWFrZS11cCBvZiB0ZWFtcyBjYW4gYmUgZGlmZmVyZW50IGluIGRpZmZlcmVudCBwYXJ0cyBvZiBhCi1wcm9jZXNzLjwvcD4KLQotPGgzPkltcHJvdmVtZW50cyB0byBQdWJsaXNoZWQgV2ViIFNpdGVzPC9oMz4KLQotPHA+VGhlIHB1YmxpY2F0aW9uIG9mIHByb2Nlc3MgaW5mb3JtYXRpb24gPHNwYW4gY2xhc3M9R3JhbUU+aGFzIGJlZW4gaW1wcm92ZWQ8L3NwYW4+Ci1hcyBmb2xsb3dzOjwvcD4KLQotPHVsIHR5cGU9ZGlzYz4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDIwIGxldmVsMSBsZm8xODt0YWItc3RvcHM6bGlzdCAuNWluJz5UaGUgV29yayBCcmVha2Rvd24KLSAgICAgU3RydWN0dXJlIHRhYiBub3cgc2hvd3MgYSAmcXVvdDtjb25zb2xpZGF0ZWQgdmlldyZxdW90OyBvZiB0YXNrcyB3aXRoCi0gICAgIHRoZWlyIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzLiBUaGUgZGlzcGxheSBpcyBsaW1pdGVkIHRvIDxzcGFuCi0gICAgIGNsYXNzPUdyYW1FPjM8L3NwYW4+IGxldmVscywgc28gc29tZXRpbWVzIHRoZSB0YXNrcyBhbmQgcm9sZXMgbWF5IG5vdCBiZQotICAgICB2aXNpYmxlIGJlY2F1c2UgdGhleSBhcmUgdG9vIGRlZXAgaW4gdGhlIGhpZXJhcmNoeSB0byBiZSBzZWVuLiBUbyBzZWUgdGhlCi0gICAgIGRlZXBlciBsZXZlbHMsIGh5cGVybGluayB0byBhIGxvd2VyIGxldmVsLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwyMCBsZXZlbDEgbGZvMTg7dGFiLXN0b3BzOmxpc3QgLjVpbic+VGhlIFRlYW0gQWxsb2NhdGlvbiB0YWIgbm93Ci0gICAgIHNob3dzIGFsbCByb2xlcyAncm9sbGVkLXVwJyB0byB0aGUgc2VsZWN0ZWQgYWN0aXZpdHkgd2l0aCB0aGVpciBhc3NvY2lhdGVkCi0gICAgIHdvcmsgcHJvZHVjdHMgYW5kIHRhc2tzLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwyMCBsZXZlbDEgbGZvMTg7dGFiLXN0b3BzOmxpc3QgLjVpbic+VGhlIFdvcmsgUHJvZHVjdCBVc2FnZSB0YWIKLSAgICAgbm93IHNob3dzIGFsbCB3b3JrIHByb2R1Y3RzICdyb2xsZWQtdXAnIHRvIHRoZSBzZWxlY3RlZCBhY3Rpdml0eSB3aXRoCi0gICAgIHRoZWlyIGFzc29jaWF0ZWQgd29yayBwcm9kdWN0cyBhbmQgdGFza3MuPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDIwIGxldmVsMSBsZm8xODt0YWItc3RvcHM6bGlzdCAuNWluJz5FYWNoIG9mIHRoZSBhYm92ZSB0YWIKLSAgICAgZGlzcGxheXMgcHJvdmlkZSBjb2xsYXBzZSAvIGV4cGFuZCBhdCB0aGUgYWN0aXZpdHkvdGFzaywgcm9sZSBhbmQgd29yawotICAgICBwcm9kdWN0LjwvbGk+Ci08L3VsPgotCi08cD5UaGVzZSBjaGFuZ2VzIHByb3ZpZGUgY2xlYXJlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgPHNwYW4gY2xhc3M9R3JhbUU+cHJvY2VzcwotYW5kIGltcHJvdmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHJvbGVzPC9zcGFuPiBhbmQgd29yayBwcm9kdWN0cy48L3A+Ci0KLTxoMz5JbXByb3ZlZCBOYXZpZ2F0aW9uIGJldHdlZW4gVmlld3MgYW5kIEVsZW1lbnRzPC9oMz4KLQotPHA+SW4gdGhlIGxpYnJhcnkgdmlldywgeW91IGNhbiBuYXZpZ2F0ZSB0byB2YXJpYWJpbGl0eSBlbGVtZW50cyBmb3IgYSBiYXNlCi1lbGVtZW50LiA8c3BhbiBjbGFzcz1HcmFtRT5SaWdodC1jbGljayBvbiBhbiBlbGVtZW50IGFuZCBzZWxlY3QgJnF1b3Q7T3BlbiB2aWEKLVZhcmlhYmlsaXR5IEVsZW1lbnRzJnF1b3Q7Ljwvc3Bhbj4gQSBzZWxlY3QgZGlhbG9nIDxzcGFuIGNsYXNzPUdyYW1FPmlzIG9wZW5lZDwvc3Bhbj4KLXRoYXQgbGlzdHMgdGhlIGJhc2UgZWxlbWVudCBhbmQgYWxsIHZhcmlhYmlsaXR5IGVsZW1lbnRzIHRoYXQgYXJlIGJhc2VkIG9uIHRoZQotc2VsZWN0ZWQgZWxlbWVudC4gWW91IGNhbiB0aGVuIG9wZW4gYW4gZWxlbWVudCBieSBkb3VibGUtY2xpY2tpbmcgb24gaXQuIFlvdQotY2FuIGFsc28gZG8gdGhpcyBmcm9tIGEgdmFyaWFiaWxpdHkgZWxlbWVudCB0byBmaW5kIHRoZSBiYXNlIGVsZW1lbnQuPC9wPgotCi08cD5UaGUgYWJpbGl0eSB0byBsaW5rIGJldHdlZW4gdGhlIGxpYnJhcnkgdmlldyBhbmQgb3RoZXIgdmlld3MgPHNwYW4KLWNsYXNzPUdyYW1FPmhhcyBiZWVuIGVuaGFuY2VkPC9zcGFuPiBhcyBmb2xsb3dzOjwvcD4KLQotPHVsIHR5cGU9ZGlzYz4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE0IGxldmVsMSBsZm8yMTt0YWItc3RvcHM6bGlzdCAuNWluJz5XaGlsZSBpbiB0aGUgcHJvY2VzcwotICAgICBlZGl0b3IsIHlvdSBjYW4gbGluayBmcm9tIGEgZGVzY3JpcHRvciB0byB0aGUgYmFzZSBtZXRob2QgZWxlbWVudC4gPHNwYW4KLSAgICAgY2xhc3M9R3JhbUU+UmlnaHQtY2xpY2sgb24gYSBkZXNjcmlwdG9yIGluIGEgYnJlYWtkb3duIGFuZCBzZWxlY3QKLSAgICAgJnF1b3Q7U2hvdyBMaW5rZWQgRWxlbWVudCBpbiBMaWJyYXJ5IFZpZXcmcXVvdDsuPC9zcGFuPiA8c3BhbiBjbGFzcz1HcmFtRT5UaGVyZQotICAgICBpcyBhbHNvIGEgdG9vbGJhciBidXR0b24gdGhhdDwvc3Bhbj4gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgY29udGV4dAotICAgICBtZW51IGl0ZW0uPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE0IGxldmVsMSBsZm8yMTt0YWItc3RvcHM6bGlzdCAuNWluJz5XaGlsZSBpbiB0aGUgY29uZmlndXJhdGlvbgotICAgICB2aWV3LCB5b3UgY2FuIGxvY2F0ZSBhIG1ldGhvZCBlbGVtZW50IGluIHRoZSBsaWJyYXJ5IHZpZXcuIDxzcGFuCi0gICAgIGNsYXNzPUdyYW1FPlJpZ2h0LWNsaWNrIG9uIGEgcHJvY2VzcyBlbGVtZW50IGFuZCBzZWxlY3QgJnF1b3Q7U2hvdyBpbgotICAgICBMaWJyYXJ5IFZpZXcmcXVvdDsuPC9zcGFuPjwvbGk+Ci08L3VsPgotCi08cD5JbiBlYWNoIGNhc2UsIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgbWV0aG9kIGVsZW1lbnQgPHNwYW4gY2xhc3M9R3JhbUU+aXMKLWhpZ2hsaWdodGVkPC9zcGFuPiBpbiB0aGUgbGlicmFyeSB2aWV3LiBUaGVyZSBjb3VsZCBiZSBjb250cmlidXRvcnMgdG8gdGhpcwotZWxlbWVudCB0aGF0IGFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCByb2xlcywgb3Igd29yayBwcm9kdWN0cy4gWW91IGNhbiB1c2UKLSZxdW90O09wZW4gdmlhIFZhcmlhYmlsaXR5IEVsZW1lbnRzJnF1b3Q7IGRlc2NyaWJlZCBhYm92ZSB0byBsb2NhdGUgdmFyaWFiaWxpdHkKLWVsZW1lbnRzLjwvcD4KLQotPGgzPkEgZmV3IG90aGVyIGltcHJvdmVtZW50czwvaDM+Ci0KLTx1bCB0eXBlPWRpc2M+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwxMyBsZXZlbDEgbGZvMjQ7dGFiLXN0b3BzOmxpc3QgLjVpbic+VGhlcmUgYXJlIG5vdyB0b29sYmFyCi0gICAgIGJ1dHRvbnMgaW4gdGhlIHByb2Nlc3MgZWRpdG9yIHRvIG1vdmUgYWN0aXZpdGllcy90YXNrcyB1cCBvciBkb3duLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwxMyBsZXZlbDEgbGZvMjQ7dGFiLXN0b3BzOmxpc3QgLjVpbic+JnF1b3Q7Q29udHJpYnV0ZXMgdG88c3BhbgotICAgICBjbGFzcz1HcmFtRT4uLiZxdW90Ozwvc3Bhbj4gaW5mb3JtYXRpb24gaXMgbm93IG9uIGFsbCB0YWJzIGluIGVkaXRvcnMuPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDEzIGxldmVsMSBsZm8yNDt0YWItc3RvcHM6bGlzdCAuNWluJz5Vc2VyIGNhbiBjdXN0b21pemUgd2hhdAotICAgICBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIHByb2Nlc3MgZWRpdG9yczwvbGk+Ci08L3VsPgotCi08aDI+PGEgbmFtZT1sb2NhbGl6ZWQ+PC9hPjxhIG5hbWU9dG9vbGluZz48L2E+S25vd24gRVBGIENvbXBvc2VyIElzc3VlczwvaDI+Ci0KLTxvbCBzdGFydD0xIHR5cGU9MT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE1IGxldmVsMSBsZm8yNzt0YWItc3RvcHM6bGlzdCAuNWluJz5XaGVuIHVzaW5nIHRoZSBuZXcgPGEKLSAgICAgaHJlZj0iI3N5bmNocm9uaXphdGlvbiI+c3luY2hyb25pemF0aW9uIGZlYXR1cmU8L2E+LCBhZnRlciBlYWNoCi0gICAgIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb24gb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcywKLSAgICAgcGxlYXNlIHNhdmUgaXQgYmVmb3JlIGRvaW5nIGFub3RoZXIgc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbi4gVGhpcyBpcyB0bwotICAgICBwcmV2ZW50IHRvbyBtYW55IG9iamVjdHMgYmVpbmcgc3RvcmVkIGluIHRoZSB1bmRvIGNvbW1hbmQgc3RhY2suIEhhdmluZwotICAgICB0b28gbXVjaCBpbiB0aGUgdW5kbyBjb21tYW5kIHN0YWNrIG1heSBjYXVzZSB0b28gbXVjaCBtZW1vcnkgY29uc3VtcHRpb24uPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE1IGxldmVsMSBsZm8yNzt0YWItc3RvcHM6bGlzdCAuNWluJz5FUEYgQ29tcG9zZXIgKEVQRikgPHNwYW4KLSAgICAgY2xhc3M9R3JhbUU+aXMgbm90IGRlc2lnbmVkPC9zcGFuPiBmb3IgY29uY3VycmVudCB0ZWFtIGF1dGhvcmluZyBvbiB0aGUKLSAgICAgc2FtZSBpbnN0YW5jZSBvZiBhIG1ldGhvZCBsaWJyYXJ5LiBIb3dldmVyLCB0aGVyZSBpcyBhIDxzcGFuIGNsYXNzPVNwZWxsRT53aGl0ZXBhcGVyPC9zcGFuPgotICAgICBvbiAmcXVvdDtVc2luZyBFUEYgd2l0aCBhIFZlcnNpb24gQ29udHJvbCBTeXN0ZW0mcXVvdDsgYXZhaWxhYmxlIG9uIHRoZQotICAgICBFUEYgcHJvamVjdCB3ZWIgc2l0ZSBhdDogPC9saT4KLTwvb2w+Ci0KLTxwIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmLzwvYT48L3A+Ci0KLTxwIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz5UaGlzIGV4cGxhaW5zIGhvdyB5b3UgY2FuIHVzZSBhIHZlcnNpb24gY29udHJvbAotc3lzdGVtIHRvIG1haW50YWluIHlvdXIgRVBGIENvbXBvc2VyIGxpYnJhcnkuPC9wPgotCi08b2wgc3RhcnQ9MyB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwxNSBsZXZlbDEgbGZvMjc7dGFiLXN0b3BzOmxpc3QgLjVpbic+SWYgeW91IHVzZSBvbmUgb2YgdGhlCi0gICAgIGZvbGxvd2luZyBFUEYgNy4wLjEgZmVhdHVyZXMgaW4geW91ciBjb250ZW50IGxpYnJhcnksIHlvdSBtYXkgbm90IGJlIGFibGUKLSAgICAgb3BlbiB0aGUgbGlicmFyeSB1c2luZyBFUEYgNy4wIHRvb2wuIDwvbGk+Ci08L29sPgotCi08cCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+QTogQWRkZWQgbW9yZSB0aGFuIG9uZSBhdHRhY2htZW50IHRvIGEgdGVtcGxhdGU8L3A+Ci0KLTxwIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz5COiBDcmVhdGVkIHRlYW0gcHJvZmlsZTwvcD4KLQotPHAgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIGNsYXNzPUdyYW1FPkM6IEN1c3RvbWl6ZWQgYWN0aXZpdHkgZGlhZ3JhbXMKLXRoYXQgY29udGFpbiBzdXBwcmVzc2VkIGFjdGl2aXRpZXMgb3IgdGFza3MuPC9zcGFuPiBUaGVzZSBkaWFncmFtcyB3aWxsIG5vdAotaGF2ZSBhIGRlc2lyYWJsZSBsb29rIHdoZW4gdmlld2VkIHVzaW5nIEVQRiA3LjAsIGJlY2F1c2UgdGhlIHN1cHByZXNzZWQKLWVsZW1lbnRzIHdpbGwgcmVhcHBlYXIuPC9wPgotCi08cCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+WW91IG11c3QgdXNlIEVQRiBDb21wb3NlciB0byB1c2UgYSBsaWJyYXJ5IHdpdGgKLXRoZXNlIGZlYXR1cmVzLjwvcD4KLQotPG9sIHN0YXJ0PTQgdHlwZT0xPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPiZxdW90O0xpbmsgd2l0aAotICAgICBFZGl0b3ImcXVvdDsgYnV0dG9uIGRvZXMgbm90IGxvY2F0ZSBDdXN0b20gQ2F0ZWdvcmllcywgYnV0IHdpbGwgZXhwYW5kCi0gICAgIGRvd24gdG8gdGhlICZxdW90O0N1c3RvbSBDYXRlZ29yaWVzJnF1b3Q7IFVJIGZvbGRlciBpbiB0aGUgTGlicmFyeSBWaWV3LjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwxNSBsZXZlbDEgbGZvMjc7dGFiLXN0b3BzOmxpc3QgLjVpbic+RWRpdG9yIHRleHQgZmllbGRzIDxzcGFuCi0gICAgIGNsYXNzPUdyYW1FPmNhbm5vdCBiZSByZWFkPC9zcGFuPiBpbiBIaWdoIGNvbnRyYXN0IG1vZGUuIFdoZW4gSGlnaAotICAgICBDb250cmFzdCBtb2RlIGlzIDxzcGFuIGNsYXNzPUdyYW1FPmFjdGl2YXRlZDwvc3Bhbj4gYXMgRVBGIGlzIHJ1bm5pbmcsCi0gICAgIHRleHQgaW4gbm9uLXJpY2gtdGV4dCBmaWVsZHMgYmVjb21lcyB1bnJlYWRhYmxlLiBUaGlzIGlzIGFuIEVjbGlwc2UgcGxhdGZvcm0KLSAgICAgYnVnLiBUaGUgd29ya2Fyb3VuZCBpcyB0byByZXN0YXJ0IEVQRi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYQotICAgICBjb25maWd1cmF0aW9uIHRoYXQgPHNwYW4gY2xhc3M9R3JhbUU+aXMgdXNlZDwvc3Bhbj4gYnkgYW4gYWN0aXZlIHByb2Nlc3MKLSAgICAgZWRpdG9yLCB0aGUgY2hhbmdlcyB0byB0aGUgY29uZmlndXJhdGlvbiBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVkCi0gICAgIGluIHRoZSBwcm9jZXNzIGVkaXRvci4gVGhlIHdvcmthcm91bmQgaXMgdG8gcmUtc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uCi0gICAgIGFnYWluIGluIHRoZSBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIgb3IgdXNlIHJlZnJlc2ggaW4gdGhlIGNvbnRleHQgbWVudQotICAgICBvciBjbG9zZSBhbmQgcmVvcGVuIHRoZSBwcm9jZXNzIGVkaXRvci48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPkRyYWcgYW5kIGRyb3AgYSBjYXBhYmlsaXR5Ci0gICAgIHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyBmcm9tIGxpYnJhcnkgdmlldyB0byBhIHJpY2gtdGV4dCBlZGl0b3IgbWF5Ci0gICAgIG5vdCBjcmVhdGUgdGhlIGRlc2lyZWQgbWV0aG9kIGVsZW1lbnQgbGluay4gVG8gY3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQKLSAgICAgbGluayB0byBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzLCBleHBhbmQgYSByaWNoLXRleHQKLSAgICAgZWRpdG9yLCBjbGljayBvbiAnYWRkIGxpbmsnIGJ1dHRvbiwgc2VsZWN0IHRoZSBkZXNpcmVkIGxpbmsgdHlwZSwgY2xpY2sKLSAgICAgQnJvd3NlLCBuYXZpZ2F0ZSB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MsIGV4cGFuZCBpdAotICAgICBhbmQgc2VsZWN0IHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MuPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE1IGxldmVsMSBsZm8yNzt0YWItc3RvcHM6bGlzdCAuNWluJz5XaW5kb3dzIGhhcyBhIGxpbWl0ZWQKLSAgICAgb3ZlcmFsbCBudW1iZXIgb2Ygc3lzdGVtIGhhbmRsZXMuIFdoZW4gdGhlIHN5c3RlbSBydW5zIG91dCBvZiBzeXN0ZW0KLSAgICAgaGFuZGxlcywgRVBGIHdpbGwgbm90IGZ1bmN0aW9uIHByb3Blcmx5LiBGb3IgZXhhbXBsZSwgZG91YmxlLWNsaWNraW5nIG9uIGEKLSAgICAgbWV0aG9kIGVsZW1lbnQgd2lsbCBub3QgYnJpbmcgdXAgdGhlIGVkaXRvci4gWW91IG5lZWQgdG8gY2xvc2UgRVBGIGFuZAotICAgICBjbG9zZSBvdGhlciBhcHBsaWNhdGlvbnMgdG8gYnJpbmcgdGhlIGF2YWlsYWJsZSBzeXN0ZW0gaGFuZGxlcyB0byBhCi0gICAgIHJlYXNvbmFibGUgbGV2ZWwgYW5kIHN0YXJ0IEVQRiBhZ2Fpbi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPkNoYW5nZXMgbWFkZSB0byB0aGUgYmFzZQotICAgICBBY3Rpdml0eSBEaWFncmFtIG9mIGFuIGFjdGl2aXR5IDxzcGFuIGNsYXNzPUdyYW1FPmFyZSBub3QgYXV0b21hdGljYWxseQotICAgICByZWZsZWN0ZWQ8L3NwYW4+IGluIGFueSBleHRlbnNpb25zIG9mIHRoZSBhY3Rpdml0eS4gVG8gc2VlIHRoZSBjaGFuZ2VzLAotICAgICBvcGVuIHRoZSBBY3Rpdml0eSBEaWFncmFtIG9mIGVhY2ggYWN0aXZpdHkgdGhhdCBleHRlbmRzIHRoZSBtb2RpZmllZCBvbmUsCi0gICAgIHJpZ2h0IGNsaWNrIG9uIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBkaWFncmFtIGFuZCBjaG9vc2UgJnF1b3Q7UmVmcmVzaCBmcm9tCi0gICAgIEJhc2UmcXVvdDsuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGRpYWdyYW0uIFNhdmUgdGhlIGNoYW5nZS48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPkluIHRoZSBSaWNoIFRleHQgRWRpdG9yLCBpdAotICAgICBpcyBub3QgcG9zc2libGUgdG8gaW5wdXQgYWNjZW50ZWQgY2hhcmFjdGVycyB0aGF0IHJlcXVpcmUgPHNwYW4KLSAgICAgY2xhc3M9R3JhbUU+Mjwvc3Bhbj4ga2V5IGNvbWJpbmF0aW9ucy4gPHNwYW4gY2xhc3M9R3JhbUU+Rm9yIGV4YW1wbGUsICdgJwotICAgICBhbmQgJ2EnIHRvIHByb2R1Y2UgJzxzcGFuIGNsYXNzPVNwZWxsRT7DoDwvc3Bhbj4nLjwvc3Bhbj4gPHNwYW4KLSAgICAgY2xhc3M9R3JhbUU+VGhpcyBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIEVjbGlwc2UgU1dUIEJyb3dzZXIgd2lkZ2V0IHRoYXQgd2UKLSAgICAgdXNlLjwvc3Bhbj4gU2VlIDxjb2RlPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMxMDE3PC9zcGFuPjwvY29kZT4KLSAgICAgZm9yIG1vcmUgaW5mby4gV29ya2Fyb3VuZHMgYXJlOjwvbGk+Ci0gPHVsIHR5cGU9Y2lyY2xlPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxNSBsZXZlbDIgbGZvMjc7dGFiLXN0b3BzOmxpc3QgMS4waW4nPlVzZSBBbHQga2V5IGNvZGVzIHRvCi0gICAgICBlbnRlciB0aGUgYWNjZW50ZWQgY2hhcmFjdGVycy4gRm9yIGEgbGlzdGluZyBvZiBBbHQga2V5IGNvZGVzIG9uIFdpbmRvd3MsCi0gICAgICBzZWUgPGNvZGU+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmh0dHA6Ly90bHQuaXRzLnBzdS5lZHUvc3VnZ2VzdGlvbnMvaW50ZXJuYXRpb25hbC9hY2NlbnRzL2NvZGVhbHQuaHRtbDwvc3Bhbj48L2NvZGU+LjwvbGk+Ci0gIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDoKLSAgICAgIGF1dG87bXNvLWxpc3Q6bDE1IGxldmVsMiBsZm8yNzt0YWItc3RvcHM6bGlzdCAxLjBpbic+VHlwZSB0aGUgYWNjZW50ZWQKLSAgICAgIGNoYXJhY3RlcnMgaW4gYSA8c3BhbiBjbGFzcz1HcmFtRT5ub24gcmljaDwvc3Bhbj4gdGV4dCBmaWVsZCAobGlrZSBCcmllZgotICAgICAgRGVzY3JpcHRpb24pLCBhbmQgY3V0IGFuZCBwYXN0ZSB0aGUgY2hhcmFjdGVycyBvbnRvIHRoZSByaWNoIHRleHQgZmllbGQKLSAgICAgIG9yIGVkaXRvci48L2xpPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxNSBsZXZlbDIgbGZvMjc7dGFiLXN0b3BzOmxpc3QgMS4waW4nPkV4cGFuZCB0aGUgcmljaCB0ZXh0Ci0gICAgICBmaWVsZCwgc2VsZWN0IHRoZSBIVE1MIHRhYiBhbmQgZW50ZXIgdGhlIGFjY2VudGVkIGNoYXJhY3RlcnMgaW4gdGhlIEhUTUwKLSAgICAgIHNvdXJjZSBlZGl0b3IuPC9saT4KLSA8L3VsPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPkluIHRoZSBSaWNoIFRleHQgRWRpdG9yLAotICAgICBmb3JtYXR0aW5nIG9mIHRleHQgaW5zaWRlICZsdDtwcmUmZ3Q7Li4uJmx0Oy9wcmUmZ3Q7IG1heSBub3QgYmUgZnVsbHkKLSAgICAgcHJlc2VydmVkLjwvbGk+Ci08L29sPgotCi08aDI+VmVyc2lvbiBjb250cm9sIHN1cHBvcnQgaW4gRVBGPG86cD48L286cD48L2gyPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotbWFyZ2luLWxlZnQ6LjI1aW4nPjxzcGFuIGNsYXNzPVNwZWxsRT48Yj48aT5DbGVhckNhc2U8L2k+PC9iPjwvc3Bhbj48Yj48aT4KLVJlbW90ZSBDbGllbnQgKENDUkMpPG86cD48L286cD48L2k+PC9iPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLW1hcmdpbi1sZWZ0Oi4yNWluJz48Yj5JbnN0YWxsIENDUkMgZnJvbSA8c3BhbiBjbGFzcz1TcGVsbEU+Q2xlYXJDYXNlPC9zcGFuPgotc2VydmVyPG86cD48L286cD48L2I+PC9wPgotCi08b2wgc3RhcnQ9MSB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz48c3BhbiBjbGFzcz1HcmFtRT5NZW51IEhlbHAKLSAgICAgLyBTb2Z0d2FyZSBVcGRhdGVzIC8gRmluZCBhbmQgSW5zdGFsbOKApjwvc3Bhbj48bzpwPjwvbzpwPjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgPGIgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0OgotICAgICBub3JtYWwnPlNlYXJjaCBmb3IgbmV3IGZlYXR1cmVzIHRvIGluc3RhbGwgPC9iPnRoZW4gY2xpY2sgPGIKLSAgICAgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0Om5vcm1hbCc+TmV4dDwvYj48YnI+Ci0gICAgIDwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZXR5cGUgaWQ9Il94MDAwMF90NzUiIGNvb3Jkc2l6ZT0iMjE2MDAsMjE2MDAiCi0gICAgICBvOnNwdD0iNzUiIG86cHJlZmVycmVsYXRpdmU9InQiIHBhdGg9Im1ANEA1bEA0QDExQDlAMTFAOUA1eGUiIGZpbGxlZD0iZiIKLSAgICAgIHN0cm9rZWQ9ImYiPgotICAgICAgPHY6c3Ryb2tlIGpvaW5zdHlsZT0ibWl0ZXIiLz4KLSAgICAgIDx2OmZvcm11bGFzPgotICAgICAgIDx2OmYgZXFuPSJpZiBsaW5lRHJhd24gcGl4ZWxMaW5lV2lkdGggMCIvPgotICAgICAgIDx2OmYgZXFuPSJzdW0gQDAgMSAwIi8+Ci0gICAgICAgPHY6ZiBlcW49InN1bSAwIDAgQDEiLz4KLSAgICAgICA8djpmIGVxbj0icHJvZCBAMiAxIDIiLz4KLSAgICAgICA8djpmIGVxbj0icHJvZCBAMyAyMTYwMCBwaXhlbFdpZHRoIi8+Ci0gICAgICAgPHY6ZiBlcW49InByb2QgQDMgMjE2MDAgcGl4ZWxIZWlnaHQiLz4KLSAgICAgICA8djpmIGVxbj0ic3VtIEAwIDAgMSIvPgotICAgICAgIDx2OmYgZXFuPSJwcm9kIEA2IDEgMiIvPgotICAgICAgIDx2OmYgZXFuPSJwcm9kIEA3IDIxNjAwIHBpeGVsV2lkdGgiLz4KLSAgICAgICA8djpmIGVxbj0ic3VtIEA4IDIxNjAwIDAiLz4KLSAgICAgICA8djpmIGVxbj0icHJvZCBANyAyMTYwMCBwaXhlbEhlaWdodCIvPgotICAgICAgIDx2OmYgZXFuPSJzdW0gQDEwIDIxNjAwIDAiLz4KLSAgICAgIDwvdjpmb3JtdWxhcz4KLSAgICAgIDx2OnBhdGggbzpleHRydXNpb25vaz0iZiIgZ3JhZGllbnRzaGFwZW9rPSJ0IiBvOmNvbm5lY3R0eXBlPSJyZWN0Ii8+Ci0gICAgICA8bzpsb2NrIHY6ZXh0PSJlZGl0IiBhc3BlY3RyYXRpbz0idCIvPgotICAgICA8L3Y6c2hhcGV0eXBlPjx2OnNoYXBlIGlkPSJfeDAwMDBfaTEwMjUiIHR5cGU9IiNfeDAwMDBfdDc1IiBzdHlsZT0nd2lkdGg6NmluOwotICAgICAgaGVpZ2h0OjM4MS43NXB0Jz4KLSAgICAgIDx2OmltYWdlZGF0YSBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDEucG5nIiBvOnRpdGxlPSIiLz4KLSAgICAgPC92OnNoYXBlPjwhW2VuZGlmXS0tPjwhW2lmICF2bWxdPjxpbWcgYm9yZGVyPTAgd2lkdGg9NTc2IGhlaWdodD01MDkKLSAgICAgc3JjPSJyZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDAyLmpwZyIgdjpzaGFwZXM9Il94MDAwMF9pMTAyNSI+PCFbZW5kaWZdPjwvbGk+Ci08L29sPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvJz48bzpwPiZuYnNwOzwvbzpwPjwvcD4KLQotPG9sIHN0YXJ0PTMgdHlwZT0xPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsNyBsZXZlbDEgbGZvMzA7dGFiLXN0b3BzOmxpc3QgLjVpbic+RW50ZXIgbmV3IHJlbW90ZSB1cGRhdGUgc2l0ZQotICAgICBmb3IgQ0NSQzxicj4KLSAgICAgPCEtLVtpZiBndGUgdm1sIDFdPjx2OnNoYXBlIGlkPSJfeDAwMDBfaTEwMjYiIHR5cGU9IiNfeDAwMDBfdDc1IiBzdHlsZT0nd2lkdGg6MjY3cHQ7Ci0gICAgICBoZWlnaHQ6MTEwLjI1cHQnPgotICAgICAgPHY6aW1hZ2VkYXRhIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwMy5wbmciIG86dGl0bGU9IiIvPgotICAgICA8L3Y6c2hhcGU+PCFbZW5kaWZdLS0+PCFbaWYgIXZtbF0+PGltZyBib3JkZXI9MCB3aWR0aD0zNTYgaGVpZ2h0PTE0NwotICAgICBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDQuanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDI2Ij48IVtlbmRpZl0+PGJyPgotICAgICA8YnI+Ci0gICAgIDwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDMzIiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjZpbjsKLSAgICAgIGhlaWdodDozODEuNzVwdCc+Ci0gICAgICA8djppbWFnZWRhdGEgc3JjPSJyZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA1LnBuZyIgbzp0aXRsZT0iIi8+Ci0gICAgIDwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTU3NiBoZWlnaHQ9NTA5Ci0gICAgIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNi5qcGciIHY6c2hhcGVzPSJfeDAwMDBfaTEwMzMiPjwhW2VuZGlmXT48YnI+Ci0gICAgIHRoZW4gY2xpY2sgPGIgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0Om5vcm1hbCc+RmluaXNoPC9iPjxvOnA+PC9vOnA+PC9saT4KLTwvb2w+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08b2wgc3RhcnQ9NCB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgPGIgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0OgotICAgICBub3JtYWwnPlJhdGlvbmFsIDxzcGFuIGNsYXNzPVNwZWxsRT5DbGVhckNhc2U8L3NwYW4+IFJlbW90ZSBDbGllbnQgZm9yCi0gICAgIEVjbGlwc2U8L2I+IHRoZW4gY2xpY2sgPGIgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0Om5vcm1hbCc+TmV4dDwvYj48YnI+Ci0gICAgIDwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDMyIiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjZpbjsKLSAgICAgIGhlaWdodDo1aW4nPgotICAgICAgPHY6aW1hZ2VkYXRhIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNy5wbmciIG86dGl0bGU9IiIvPgotICAgICA8L3Y6c2hhcGU+PCFbZW5kaWZdLS0+PCFbaWYgIXZtbF0+PGltZyBib3JkZXI9MCB3aWR0aD01NzYgaGVpZ2h0PTQ4MAotICAgICBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDguanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDMyIj48IVtlbmRpZl0+PC9saT4KLTwvb2w+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08b2wgc3RhcnQ9NSB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz5Gb2xsb3cgdGhlIG9uLXNjcmVlbgotICAgICBpbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBDQ1JDIHRvIFJNQzxicj4KLSAgICAgPCEtLVtpZiBndGUgdm1sIDFdPjx2OnNoYXBlIGlkPSJfeDAwMDBfaTEwMzEiIHR5cGU9IiNfeDAwMDBfdDc1IiBzdHlsZT0nd2lkdGg6NmluOwotICAgICAgaGVpZ2h0OjVpbic+Ci0gICAgICA8djppbWFnZWRhdGEgc3JjPSJyZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA5LnBuZyIgbzp0aXRsZT0iIi8+Ci0gICAgIDwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTU3NiBoZWlnaHQ9NDgwCi0gICAgIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMC5qcGciIHY6c2hhcGVzPSJfeDAwMDBfaTEwMzEiPjwhW2VuZGlmXT48YnIKLSAgICAgc3R5bGU9J21zby1zcGVjaWFsLWNoYXJhY3RlcjpsaW5lLWJyZWFrJz4KLSAgICAgPCFbaWYgIXN1cHBvcnRMaW5lQnJlYWtOZXdMaW5lXT48YnIgc3R5bGU9J21zby1zcGVjaWFsLWNoYXJhY3RlcjpsaW5lLWJyZWFrJz4KLSAgICAgPCFbZW5kaWZdPjwvbGk+Ci08L29sPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvJz48bzpwPiZuYnNwOzwvbzpwPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLW1hcmdpbi1sZWZ0Oi41aW4nPjwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDMwIiB0eXBlPSIjX3gwMDAwX3Q3NSIKLSBzdHlsZT0nd2lkdGg6NmluO2hlaWdodDo1aW4nPgotIDx2OmltYWdlZGF0YSBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTEucG5nIiBvOnRpdGxlPSIiLz4KLTwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTU3NiBoZWlnaHQ9NDgwCi1zcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTIuanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDMwIj48IVtlbmRpZl0+PGJyCi1zdHlsZT0nbXNvLXNwZWNpYWwtY2hhcmFjdGVyOmxpbmUtYnJlYWsnPgotPCFbaWYgIXN1cHBvcnRMaW5lQnJlYWtOZXdMaW5lXT48YnIgc3R5bGU9J21zby1zcGVjaWFsLWNoYXJhY3RlcjpsaW5lLWJyZWFrJz4KLTwhW2VuZGlmXT48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08b2wgc3RhcnQ9NiB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz5DbGljayBvbiA8YgotICAgICBzdHlsZT0nbXNvLWJpZGktZm9udC13ZWlnaHQ6bm9ybWFsJz5JbnN0YWxsIEFsbDwvYj4gd2hlbiB5b3Ugc2VlIHRoZSBiZWxvdwotICAgICBzY3JlZW48YnI+Ci0gICAgIDwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDI5IiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjZpbjsKLSAgICAgIGhlaWdodDo1aW4nPgotICAgICAgPHY6aW1hZ2VkYXRhIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMy5wbmciIG86dGl0bGU9IiIvPgotICAgICA8L3Y6c2hhcGU+PCFbZW5kaWZdLS0+PCFbaWYgIXZtbF0+PGltZyBib3JkZXI9MCB3aWR0aD01NzYgaGVpZ2h0PTQ4MAotICAgICBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTQuanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDI5Ij48IVtlbmRpZl0+PGJyCi0gICAgIHN0eWxlPSdtc28tc3BlY2lhbC1jaGFyYWN0ZXI6bGluZS1icmVhayc+Ci0gICAgIDwhW2lmICFzdXBwb3J0TGluZUJyZWFrTmV3TGluZV0+PGJyIHN0eWxlPSdtc28tc3BlY2lhbC1jaGFyYWN0ZXI6bGluZS1icmVhayc+Ci0gICAgIDwhW2VuZGlmXT48L2xpPgotPC9vbD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLW1hcmdpbi1sZWZ0Oi41aW4nPkNsaWNrIG9uIDxiIHN0eWxlPSdtc28tYmlkaS1mb250LXdlaWdodDpub3JtYWwnPkFwcGx5IENoYW5nZXM8L2I+Ci13aGVuIHlvdSBzZWUgdGhlIGZvbGxvd2luZyBkaWFsb2cgYm94PGJyPgotPCEtLVtpZiBndGUgdm1sIDFdPjx2OnNoYXBlIGlkPSJfeDAwMDBfaTEwMjciIHR5cGU9IiNfeDAwMDBfdDc1IiBzdHlsZT0nd2lkdGg6MzMwLjc1cHQ7Ci0gaGVpZ2h0OjEwOS41cHQnPgotIDx2OmltYWdlZGF0YSBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTUucG5nIiBvOnRpdGxlPSIiLz4KLTwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTQ0MSBoZWlnaHQ9MTQ2Ci1zcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTYuanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDI3Ij48IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci1tYXJnaW4tbGVmdDouMjVpbic+PGI+PGk+Q1ZTPG86cD48L286cD48L2k+PC9iPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLW1hcmdpbi1sZWZ0Oi4yNWluJz48Yj5TZXR0aW5nIHVwPGJyPgotPC9iPjwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDI4IiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjZpbjsKLSBoZWlnaHQ6MzkwLjc1cHQnPgotIDx2OmltYWdlZGF0YSBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTcucG5nIiBvOnRpdGxlPSIiLz4KLTwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTU3NiBoZWlnaHQ9NTIxCi1zcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTguanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDI4Ij48IVtlbmRpZl0+PGI+PG86cD48L286cD48L2I+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotbWFyZ2luLWxlZnQ6LjI1aW4nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotbWFyZ2luLWxlZnQ6LjI1aW4nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotbWFyZ2luLWxlZnQ6LjI1aW4nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvZmlsZWxpc3QueG1sIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ZpbGVsaXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzNGU4MS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvZmlsZWxpc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAot77u/PHhtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiPgotIDxvOk1haW5GaWxlIEhSZWY9Ii4uL3JlbGVhc2Utbm90ZXMuaHRtbCIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMDEucG5nIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAwMi5qcGciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDAzLnBuZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMDQuanBnIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAwNS5wbmciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDA2LmpwZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMDcucG5nIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAwOC5qcGciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDA5LnBuZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMTAuanBnIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAxMS5wbmciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDEyLmpwZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMTMucG5nIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAxNC5qcGciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDE1LnBuZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMTYuanBnIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAxNy5wbmciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDE4LmpwZyIvPgotIDxvOkZpbGUgSFJlZj0iZmlsZWxpc3QueG1sIi8+Ci08L3htbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDEucG5nIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiMmYzNS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDAyLmpwZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZWMwMDQuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDAyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwMy5wbmcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNkZjBiLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDQuanBnIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkM2EyYy4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA1LnBuZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2I4NTUuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNi5qcGcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDg0ZWUwLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDcucG5nIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMDIyMC4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA4LmpwZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwOC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjEzZWMuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwOS5wbmcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODllNzE0Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTAuanBnIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDEwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlMjRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDExLnBuZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDc2M2MuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMi5qcGcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjgxOWQxLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTMucG5nIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0MmU2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE0LmpwZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjZlODcuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxNS5wbmcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU2MjVhLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTYuanBnIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkNzBmMC4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE3LnBuZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTRlOWUuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxOC5qcGcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTguanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzY3NTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxOC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTU5ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY0NTg2OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21tb24gVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzk5NzIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0IHN1aXRlIGZvciBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShDb21tb25UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJLy8kSlVuaXQtQkVHSU4kCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJVdGlsVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYTUxVdGlsVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWZXJzaW9uVXRpbFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRVBGVmVyc2lvbnNUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVQRlZlcnNpb25UZXN0LmNsYXNzKTsKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0ZDJhZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5FUEZWZXJzaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEVQRlZlcnNpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVQRlZlcnNpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUb29sVmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjIiKSx2ZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMaWJyYXJ5VmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjAuNC4xIiksdmVyc2lvbi5nZXRMaWJyYXJ5VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WE1MU2NoZW1hVmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjAuMSIpLHZlcnNpb24uZ2V0WE1MU2NoZW1hVmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvb2xWZXJzaW9uVG8oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlVG9vbFZlcnNpb25UbyhuZXcgVmVyc2lvbigiMS4yIikpID09IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMyIpKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oIjAuOSIpKSA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlTGlicmFyeVZlcnNpb25UbygpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVMaWJyYXJ5VmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuNC4xIikpID09IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZUxpYnJhcnlWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMC40LjIiKSkgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVMaWJyYXJ5VmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuMi4wIikpID4gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVYTUxTY2hlbWFWZXJzaW9uVG8oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuMSIpKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVYTUxTY2hlbWFWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMC4yIikpIDwgMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIwLjkuOSIpKSA+IDApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvbnNUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyZWZlZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5FUEZWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotCi1wdWJsaWMgY2xhc3MgRVBGVmVyc2lvbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVQRlZlcnNpb25zVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VycmVudFZlcnNpb24oKSB7Ci0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gKEVQRlZlcnNpb25zKVZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEVQRlZlcnNpb24oIjEuMiIsIjEuMC40LjEiLCIxLjAuMSIpLCB2ZXJzaW9ucy5nZXRDdXJyZW50VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSAoRVBGVmVyc2lvbnMpVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRVBGVmVyc2lvbigiMS4wIiwiMS4wLjMuMCIsIjEuMC4wIiksIHZlcnNpb25zLmdldFZlcnNpb24oIjEuMCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsVmVyc2lvbnMoKSB7Ci0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gKEVQRlZlcnNpb25zKVZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlMaXN0IGV4cGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZXhwZWN0ZWRMaXN0LmFkZChuZXcgRVBGVmVyc2lvbigiMS4wIiwiMS4wLjMuMCIsIjEuMC4wIikpOwotCQlleHBlY3RlZExpc3QuYWRkKG5ldyBFUEZWZXJzaW9uKCIxLjEiLCIxLjAuNC4wIiwiMS4wLjAiKSk7Ci0JCWV4cGVjdGVkTGlzdC5hZGQobmV3IEVQRlZlcnNpb24oIjEuMiIsIjEuMC40LjEiLCIxLjAuMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTGlzdCwgdmVyc2lvbnMuZ2V0QWxsVmVyc2lvbnMoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9TdHJVdGlsVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvU3RyVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwYTQ0ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9TdHJVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbCBjbGFzc2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0clV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN0clV0aWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBTdHJVdGlsLmlzTnVsbCgpIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc051bGwobnVsbCkpOwotCSAgICBhc3NlcnRUcnVlKFN0clV0aWwuaXNOdWxsKCIiKSk7Ci0JICAgIGFzc2VydEZhbHNlKFN0clV0aWwuaXNOdWxsKCJIZWxsbyIpKTsJICAgIAotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgU3RyVXRpbC5pc0JsYW5rKCkgbWV0aG9kLgotCSAqLwkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNCbGFuaygpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBhc3NlcnRUcnVlKFN0clV0aWwuaXNCbGFuayhudWxsKSk7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc0JsYW5rKCIiKSk7Ci0JICAgIGFzc2VydEZhbHNlKFN0clV0aWwuaXNCbGFuaygiSGVsbG8iKSk7CSAgICAKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvVmVyc2lvblV0aWxUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9WZXJzaW9uVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5YTAwOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9WZXJzaW9uVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLQotcHVibGljIGNsYXNzIFZlcnNpb25VdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBWZXJzaW9uVXRpbFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbFRvb2xJRHMoKSB7Ci0JCVNldCB0b29sSURzID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b29sSURzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCWFzc2VydFRydWUodG9vbElELmVxdWFscygiZXBmIikgfHwgdG9vbElELmVxdWFscygicm1jIikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZlcnNpb25zKCkgewotCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlhc3NlcnROb3ROdWxsKHZlcnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpIHsKLQkJYXNzZXJ0RmFsc2UoVmVyc2lvblV0aWwuaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlYWRWZXJzaW9uc0Zyb21GaWxlKCkgewotCQkvLyB0ZXN0IG5vLXZlcnNpb25zLWluLWZpbGUgY2FzZQotCQlGaWxlIHhtaUZpbGUgPSBjcmVhdGVUZXN0WE1JRmlsZSgiIik7Ci0JCWlmICh4bWlGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlNYXAgdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9ucyk7Ci0JCXhtaUZpbGUuZGVsZXRlKCk7Ci0JCi0JCS8vIHRlc3QgZXBmLW9ubHkgY2FzZQotCQl4bWlGaWxlID0gY3JlYXRlVGVzdFhNSUZpbGUoImVwZjp2ZXJzaW9uPVwiMS4wLjBcIiIpOwotCQlpZiAoeG1pRmlsZSA9PSBudWxsKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJU3RyaW5nIGVwZlZlciA9IChTdHJpbmcpdmVyc2lvbnMuZ2V0KCJlcGYiKTsKLQkJYXNzZXJ0VHJ1ZShlcGZWZXIuZXF1YWxzKCIxLjAuMCIpKTsKLQkJeG1pRmlsZS5kZWxldGUoKTsKLQkKLQkJLy8gdGVzdCBtdWx0aXBsZSB2ZXJzaW9ucyBjYXNlCi0JCXhtaUZpbGUgPSBjcmVhdGVUZXN0WE1JRmlsZSgiZXBmOnZlcnNpb249XCIxLjAuMFwiIHJtYzp2ZXJzaW9uPVwiNy4xLjBcIiIpOwotCQlpZiAoeG1pRmlsZSA9PSBudWxsKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJZXBmVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoImVwZiIpOwotCQlTdHJpbmcgcm1jVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoInJtYyIpOwotCQlhc3NlcnRUcnVlKGVwZlZlci5lcXVhbHMoIjEuMC4wIikpOwotCQlhc3NlcnRUcnVlKHJtY1Zlci5lcXVhbHMoIjcuMS4wIikpOwotCQl4bWlGaWxlLmRlbGV0ZSgpOwotCQkKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gdGVzdCBYTUwgZmlsZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyB0ZXN0IG5vLXZlcnNpb25zLWluLWZpbGUgY2FzZQotCQlGaWxlIHhtbEZpbGUgPSBjcmVhdGVUZXN0WE1MRmlsZSgiIik7Ci0JCWlmICh4bWxGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtbEZpbGUpOwotCQlhc3NlcnROdWxsKHZlcnNpb25zKTsKLQkJeG1sRmlsZS5kZWxldGUoKTsKLQkKLQkJLy8gdGVzdCBlcGYtb25seSBjYXNlCi0JCXhtbEZpbGUgPSBjcmVhdGVUZXN0WE1MRmlsZSgidG9vbD1cImVwZj0xLjAuMFwiIik7Ci0JCWlmICh4bWxGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtbEZpbGUpOwotCQllcGZWZXIgPSAoU3RyaW5nKXZlcnNpb25zLmdldCgiZXBmIik7Ci0JCWFzc2VydFRydWUoZXBmVmVyLmVxdWFscygiMS4wLjAiKSk7Ci0JCXhtbEZpbGUuZGVsZXRlKCk7Ci0JCi0JCS8vIHRlc3QgbXVsdGlwbGUgdmVyc2lvbnMgY2FzZQotCQl4bWxGaWxlID0gY3JlYXRlVGVzdFhNTEZpbGUoInRvb2w9XCJlcGY9MS4wLjA7cm1jPTcuMS4wXCIiKTsKLQkJaWYgKHhtbEZpbGUgPT0gbnVsbCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXZlcnNpb25zID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoeG1sRmlsZSk7Ci0JCWVwZlZlciA9IChTdHJpbmcpdmVyc2lvbnMuZ2V0KCJlcGYiKTsKLQkJcm1jVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoInJtYyIpOwotCQlhc3NlcnRUcnVlKGVwZlZlci5lcXVhbHMoIjEuMC4wIikpOwotCQlhc3NlcnRUcnVlKHJtY1Zlci5lcXVhbHMoIjcuMS4wIikpOwotCQl4bWxGaWxlLmRlbGV0ZSgpOwotCX0KLQkKLQlwcml2YXRlIEZpbGUgY3JlYXRlVGVzdFhNSUZpbGUoU3RyaW5nIHZlcnNpb25BdHRyaWJ1dGVzKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIHhtaUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJFUEZfSlVOSVRfIiwgIi54bWkiKTsKLQkJCVN0cmluZyB4bWlUZXh0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKwotCQkJICAgICJcbjx4bWk6WE1JIHhtaTp2ZXJzaW9uPVwiMi4wXCIgeG1sbnM6eG1pPVwiaHR0cDovL3d3dy5vbWcub3JnL1hNSVwiIiArCi0JCQkgICAgIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIiArCi0JCQkgICAgIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZVwiIiArIAotCQkJICAgICIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9XCJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlXCIgIiArIAotCQkJICAgIHZlcnNpb25BdHRyaWJ1dGVzICsgIj5cbi4uLlxuPC94bWk6WE1JPlxuIjsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoeG1pRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgeG1pVGV4dCk7Ci0JCQlyZXR1cm4geG1pRmlsZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlc3RYTUxGaWxlKFN0cmluZyB2ZXJzaW9uQXR0cmlidXRlcykgewotCQl0cnkgewotCQkJRmlsZSB4bWxGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiRVBGX0pVTklUXyIsICIueG1sIik7Ci0JCQlTdHJpbmcgeG1sVGV4dCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICsKLQkJCQkiXG48dW1hOk1ldGhvZExpYnJhcnkgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiIgKwotCQkJCSJ4bWxuczp1bWE9XCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjNcIiAiICsKLQkJCQl2ZXJzaW9uQXR0cmlidXRlcyArCi0JCQkJIiBuYW1lPVwiYVwiIGJyaWVmRGVzY3JpcHRpb249XCJcIiBpZD1cIl9IVm5HOERMNUVkdTQyTjBYUzdvblVnXCIiICsKLQkJCQkib3JkZXJpbmdHdWlkZT1cIlwiIHN1cHByZXNzZWQ9XCJmYWxzZVwiIGF1dGhvcnM9XCJcIiBjaGFuZ2VEZXNjcmlwdGlvbj1cIlwiIHZlcnNpb249XCJcIj4iICsKLQkJCQkiXG4uLi5cbjwvdW1hOk1ldGhvZExpYnJhcnk+IjsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoeG1sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgeG1sVGV4dCk7Ci0JCQlyZXR1cm4geG1sRmlsZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9YTUxVdGlsVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvWE1MVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljZjJjMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9YTUxVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3Igb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFhNTFV0aWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgWE1MVXRpbC5lc2NhcGVBdHRyKCkgbWV0aG9kLgotCSAqLwkKLQlwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlQXR0cigpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBTdHJpbmcgcmVzdWx0ID0gWE1MVXRpbC5lc2NhcGUoIjxiPkhlbGxvPC9iPiIpOwotCSAgICBhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIiZsdDtiJmd0O0hlbGxvJmx0Oy9iJmd0OyIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGI4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcyZmQwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBEaWFncmFtIFRlc3RzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMuRGlhZ3JhbVRlc3RQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdENhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDcxYTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0qIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgRGlhZ3JhbSBKVW5pdCB0ZXN0IGNhc2VzLgotKiAKLSogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSogQHNpbmNlIDEuMgotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlTGlicmFyeU9uRXhpdCA9IGZhbHNlOwotCi0JcHVibGljIERpYWdyYW1UZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUZXN0TWV0aG9kTGlicmFyeSgpOwotCQkKLQkJLy8gYWN0aXZhdGUgdGhlIEF1dGhvcmluZyBwbHVnaW5zIHRvIGluaXRpYWxpemUgc29tZXRoaW5nCi0JCS8vIHRoZSByZWFzb24gdG8gcHV0IGl0IGFmdGVyIHRoZSBsaWJyYXJ5IGlzIGNyZWF0ZWQgaXMgdG8gYXZvaWQgdGhlIE9wZW4gTGlicmFyeSBkaWFsb2cKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0UGx1Z2luLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDQ0N2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotKiBUaGUgVGVzdHMgcGx1Zy1pbiBjbGFzcy4KLSogCi0qIEBhdXRob3IJU2hpbHBhIFRvcmFza2FyCi0qIEBzaW5jZQkxLjIKLSovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBEaWFncmFtVGVzdFBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERpYWdyYW1UZXN0UGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBEaWFncmFtVGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODM4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0IHN1aXRlIGZvciBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRGlhZ3JhbVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERpYWdyYW1VSVNlcnZpY2VUZXN0LmNsYXNzKTsKLQkJCi0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVUlTZXJ2aWNlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVUlTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRjZWVkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVVJU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1VSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlTZXJ2aWNlIGNsYXNzZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVUlTZXJ2aWNlVGVzdCBleHRlbmRzIERpYWdyYW1UZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElEaWFncmFtVUlTZXJ2aWNlIGRpYWdyYW1VSVNlcnZpY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVVJU2VydmljZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIERpYWdhbVVJU2VydmljZS5jcmVhdGVEaWFncmFtIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlhZ3JhbSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIGNyZWF0ZSBtZXRob2QgcGx1Z2luCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlcgotCQkJCS5jcmVhdGVNZXRob2RQbHVnaW4oIlRlc3QgUGx1Z2luIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkicDEiKTsKLQotCQkvLyBjcmVhdGUgY29uZmlndXJhdGlvbgotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyCi0JCQkJLmNyZWF0ZUNvbmZpZ3VyYXRpb24oIlRlc3QgQ29uZmlnIik7Ci0KLQkJLy8gY3JlYXRlIHByb2Nlc3MKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oCi0JCQkJcGx1Z2luLCAiY3AxIiwgY29uZmlnKTsKLQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgKLQkJCQkoUHJvY2Vzc0NvbXBvbmVudCkgY3AxLmVDb250YWluZXIoKSk7Ci0KLQkJLy8gY3JlYXRlIHRhc2sKLQkJVGFzayB0YXNrMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAiVGFzazEiKTsKLQkJVGFzayB0YXNrMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAiVGFzazIiKTsKLQkJVGFza1tdIHRhc2tzID0gbmV3IFRhc2tbXSB7IHRhc2sxLCB0YXNrMiB9OwotCi0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgIkExIiwKLQkJCQl0YXNrcyk7Ci0JCUFjdGl2aXR5IGFjdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgIkEyIiwKLQkJCQl0YXNrcyk7Ci0KLQkJZGlhZ3JhbVVJU2VydmljZSA9IG5ldyBEaWFncmFtVUlTZXJ2aWNlKCk7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKGNwMSwgdGhpcyk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlUcmFuc2FjdGlvbiB0eCA9ICBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsCi0JCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQotCQkJZGlhZ3JhbSA9IGRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlQWN0aXZpdHlEaWFncmFtKGNwMSk7Ci0JCi0JCQlOb2RlIGFjdDFOb2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sICBhY3QxKTsKLQkJCU5vZGUgaW5pdGlhbE5vZGUgPSBkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgSURpYWdyYW1VSVNlcnZpY2UuSU5JVElBTF9OT0RFLCAiaW5pdGlhbCIpOwotCQkJTm9kZSBhY3QyTm9kZSA9IGRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCBhY3QyKTsKLQkJCU5vZGUgZGVjaXNpb25Ob2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIElEaWFncmFtVUlTZXJ2aWNlLkRFQ0lTSU9OX05PREUsICJkZWNpc2lvbiIpOwotCQkJTm9kZSBlbmROb2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIElEaWFncmFtVUlTZXJ2aWNlLkZJTkFMX05PREUsICJlbmQiKTsKLQkJCQotCQkJZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVFZGdlKGRpYWdyYW0sIGluaXRpYWxOb2RlLCBhY3QxTm9kZSwgImxpbmsxIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgYWN0MU5vZGUsIGRlY2lzaW9uTm9kZSwgImxpbmsyIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgZGVjaXNpb25Ob2RlLCBhY3QyTm9kZSwgImxpbmszIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgYWN0Mk5vZGUsIGVuZE5vZGUsICJsaW5rNCIpOwotCQkJCQkJCi0JCQlMaXN0IG5vZGVzID0gZGlhZ3JhbVVJU2VydmljZS5nZXROb2RlcyhkaWFncmFtLCBjcDEsIElEaWFncmFtVUlTZXJ2aWNlLkFDVElWSVRZX05PREUpOwotCQkJaWYgKCFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKiBBQ1RJVklUWSBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJbm9kZXMgPSBkaWFncmFtVUlTZXJ2aWNlLmdldE5vZGVzKGRpYWdyYW0sIGNwMSwgSURpYWdyYW1VSVNlcnZpY2UuSU5JVElBTF9OT0RFKTsKLQkJCWlmICghbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiogSW5pdGlhbCBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJbm9kZXMgPSBkaWFncmFtVUlTZXJ2aWNlLmdldE5vZGVzKGRpYWdyYW0sIGNwMSwgSURpYWdyYW1VSVNlcnZpY2UuREVDSVNJT05fTk9ERSk7Ci0JCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIERlY2lzaW9uIE5vZGVzIC0gIik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihub2Rlcy5nZXQoaSkpOwotCQkJfQotCQkJCi0JCQlub2RlcyA9IGRpYWdyYW1VSVNlcnZpY2UuZ2V0QWxsTm9kZXMoZGlhZ3JhbSk7Ci0JCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIEFMTCBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJYXNzZXJ0VHJ1ZSghbm9kZXMuaXNFbXB0eSgpKTsKLQkJCQotCQkJTGlzdCBlZGdlcyA9IGRpYWdyYW1VSVNlcnZpY2UuZ2V0RWRnZXMoZGlhZ3JhbSk7Ci0JCQlpZiAoIWVkZ2VzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIEFMTCBFZGdlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IGVkZ2VzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZWRnZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJYXNzZXJ0VHJ1ZSghZWRnZXMuaXNFbXB0eSgpKTsKLQkJCi0JCQkvLyBzYXZlIGRpYWdyYW0KLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJdHguY29tbWl0KCk7Ci0JCQlyZXNvdXJjZS5zYXZlKG51bGwpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZmM5MDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjcudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2Ny50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MzVkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2Ny50YworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3Q+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiI+Ci0JPC9PcGVuTGlicmFyeT4KLQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNDM4NjdtIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTQzODY3bSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0UGx1Z2lucyBpbXBvcnRGb2xkZXJOYW1lPSIxNDM4NjdlIj4KLQk8L0ltcG9ydFBsdWdpbnM+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiIgPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9QbHVnX0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9QbHVnX0EvcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiYmRjOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvUGx1Z19BL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgZXBmOnZlcnNpb249IjEuMC4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiBndWlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIvPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUGx1Z19BIiBndWlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsY1V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb250ZW50IiBndWlkPSJfekJHbGNVemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGNremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGMwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGRVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il96QkdsZFV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZGt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX3pCR2xka3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlRvb2xzIiBndWlkPSJfekJHbGQwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfekJHbGVFemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZWt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il96QkdsZWt6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX3pCR2xlMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfekJHbGUwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfekJHbGZFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8wSFpmSUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBndWlkPSJfMEhaZklFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il8wc0taRUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJuZXdfcm9sZSIgZ3VpZD0iXzBzS1pFRXppRWR1c1RMX0kzakpRdEEiIHByZXNlbnRhdGlvbk5hbWU9Ik5ldyBSb2xlIi8+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZlV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il96QkdsZlV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfekJHbGZremlFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfekJHbGYwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il96QkdsZjB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdlL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhNDEzYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiBlcGY6dmVyc2lvbj0iMS4wLjAiIHhtaTppZD0iXzJtT1NBRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfMm1PU0FFemlFZHVzVExfSTNqSlF0QSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZkV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY2t6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZDB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZUV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGVremlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdlL2V4cG9ydC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvZXhwb3J0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExMzQwOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvZXhwb3J0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il94S011TUV6aUVkdXNUTF9JM2pKUXRBIiBndWlkPSJfeEtNdU1FemlFZHVzVExfSTNqSlF0QSI+Ci08c3ViTWFuYWdlcnMgeG1pOmlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiPgotPC9zdWJNYW5hZ2Vycz4KLTxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hLUzAwRXppRWR1c1RMX0kzakpRdEEiIGlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgdXJpPSIiPgotPC9yZXNvdXJjZURlc2NyaXB0b3JzPgotPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJNc0VremlFZHVzVExfSTNqSlF0QSIgaWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIj4KLTwvcmVzb3VyY2VEZXNjcmlwdG9ycz4KLTxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3pCTXNFMHppRWR1c1RMX0kzakpRdEEiIGlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0EvcGx1Z2luLnhtaSI+Ci08L3Jlc291cmNlRGVzY3JpcHRvcnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iMTQzODY3bSIgZ3VpZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiPgotPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiPgotPC9tZXRob2RQbHVnaW5zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYyZTdkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTQzODY3bTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9QbHVnX0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmViM2NkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlBsdWdfQSIgZ3VpZD0iX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGNVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX3pCR2xjVXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il96QkdsY2t6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il96QkdsYzB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZEV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX3pCR2xkRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfekJHbGRVemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGRremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il96QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZDB6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJUb29scyIgZ3VpZD0iX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xlRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il96QkdsZVV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfekJHbGVremlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il96QkdsZTB6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZkV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMEhaZklFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0ibmV3X2NvbnRlbnRfcGFja2FnZSIgZ3VpZD0iXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgeG1pOmlkPSJfMHNLWkVFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0ibmV3X3JvbGUiIGd1aWQ9Il8wc0taRUV6aUVkdXNUTF9JM2pKUXRBIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgUm9sZSIvPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfekJHbGZVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZmt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3pCR2xmMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQV9yZW5hbWVkL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Mzk0MTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQbHVnX0FfcmVuYW1lZCIgZ3VpZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UThVempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX0JJOVE4VXpqRWR1c1RMX0kzakpRdEEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4a3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9CSTlROGt6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4MHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9CSTlRODB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROUV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX0JJOVE5RXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5VXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfQkk5UTlVempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTlrempFZHVzVExfSTNqSlF0QSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9CSTlROWt6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROTB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJUb29scyIgZ3VpZD0iX0JJOVE5MHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEtRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtRXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEtVXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLVV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5US1rempFZHVzVExfSTNqSlF0QSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfQkk5US1rempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9CSTlRLTB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtMHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX0V6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX0JJOVFfRXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX1V6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9CSTlRX1V6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JJOVFfa3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfQkk5UV9rempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQkk5UV8wempFZHVzVExfSTNqSlF0QSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9CSTlRXzB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjdkOTYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iXzJtT1NBRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfMm1PU0FFemlFZHVzVExfSTNqSlF0QSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZkV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY2t6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZDB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZUV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGVremlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vY29uZmlndXJhdGlvbnMvQ29uZmlnX0FfcmVuYW1lZC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQV9yZW5hbWVkLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyOGE3MC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQV9yZW5hbWVkLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX0RIczFrRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BX3JlbmFtZWQiIGd1aWQ9Il9ESHMxa0V6akVkdXNUTF9JM2pKUXRBIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2QzYjdhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfeEtNdU1FemlFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX3hLTXVNRXppRWR1c1RMX0kzakpRdEEiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fQkk5UThFempFZHVzVExfSTNqSlF0QSNfQkk5UkFVempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJNc0VVemlFZHVzVExfSTNqSlF0QSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hLUzAwRXppRWR1c1RMX0kzakpRdEEiIGlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il96Qk1zRWt6aUVkdXNUTF9JM2pKUXRBIiBpZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CSTlSQWt6akVkdXNUTF9JM2pKUXRBIiBpZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CSTlSQTB6akVkdXNUTF9JM2pKUXRBIiBpZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3p5M09zTGNfRWR1UTF2TmRKZUppRlEiIGlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0EvcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSIxNDM4NjdtIiBndWlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfQkk5UThFempFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEjX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il96QkdsY0V6aUVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNFemlFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0MDI3ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNDM4NjdtIDI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL1BsdWdfQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL1BsdWdfQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2MyOTBmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9QbHVnX0EvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQbHVnX0EiIGd1aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4VXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9CSTlROFV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROGt6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfQkk5UThrempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRODB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEb21haW5zIiBndWlkPSJfQkk5UTgwempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTlFempFZHVzVExfSTNqSlF0QSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9CSTlROUV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROVV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX0JJOVE5VXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5a3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfQkk5UTlrempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTkwempFZHVzVExfSTNqSlF0QSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9CSTlROTB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRLUV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLUV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRLVV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfQkk5US1VempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEta3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX0JJOVEta3pqRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfQkk5US0wempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLTB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UV9FempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il9CSTlRX0V6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQkk5UV9VempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfQkk5UV9VempFZHVzVExfSTNqSlF0QSIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX2t6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX0JJOVFfa3pqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JJOVFfMHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfQkk5UV8wempFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTRhN2YuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX0RIczFrRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfREhzMWtFempFZHVzVExfSTNqSlF0QSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FlN2Y4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3hLTXVNRXppRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il94S011TUV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfQkk5UkFVempFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEjX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il94S1MwMEV6aUVkdXNUTF9JM2pKUXRBIiBpZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJNc0VremlFZHVzVExfSTNqSlF0QSIgaWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQkk5UkFrempFZHVzVExfSTNqSlF0QSIgaWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQkk5UkEwempFZHVzVExfSTNqSlF0QSIgaWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IjE0Mzg2N20iIGd1aWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fQkk5UThFempFZHVzVExfSTNqSlF0QSNfQkk5UThFempFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDIudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDczYTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDIudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iPgotCTwvT3BlbkxpYnJhcnk+Ci0KLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTUwNzAybSI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1MDcwMm0iPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydENvbmZpZ3VyYXRpb24gaW1wb3J0Rm9sZGVyTmFtZT0iMTUwNzAyZSI+Ci0JPC9JbXBvcnRDb25maWd1cmF0aW9uPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iID4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzg2NjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTUwNzAyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyNDcxYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgbmFtZT0iY3AsX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4xPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4xPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+MTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4xPC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPjE8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPjE8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT4xPC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+MTwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNjM2RhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfUldEQ01VMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX1JXRENNVTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JXRENNazIxRWR1REE2RG56U3ljS1EiIGlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcCIgZ3VpZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcCIgZ3VpZD0iX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIGJyaWVmRGVzY3JpcHRpb249IjEiIHByZXNlbnRhdGlvbk5hbWU9ImNwIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgaHJlZj0idW1hOi8vLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWcjLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFjMWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfUlY4N2trMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX1JWODdrazIxRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9SV0RDTVUyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfUldEQ01VMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdsVTIxRWR1REE2RG56U3ljS1EiIGlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgdXJpPSJyb2xlcy9uZXdfcm9sZV8xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdsazIxRWR1REE2RG56U3ljS1EiIGlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgdXJpPSJ0YXNrcy9uZXdfdGFzayUyMDEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUldEQ01FMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQbHVnQSIgZ3VpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il81YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJUb29scyIgZ3VpZD0iXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXzViUzVURTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY29udGVudF9wYWNrYWdlXzEiIGd1aWQ9Il9fa1MzMEUyMEVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld19yb2xlXzEiIGd1aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgUm9sZSAxIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgaHJlZj0idW1hOi8vLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEjLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIHhtaTppZD0iX0dlclFBRTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld190YXNrIDEiIGd1aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgVGFzayAxIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgaHJlZj0idW1hOi8vLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEjLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZhNGNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9yb2xlcy9uZXdfcm9sZV8xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgbmFtZT0ibmV3X3JvbGUsX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBhdXRob3JzPSIxIiBjaGFuZ2VEYXRlPSIyMDA2LTA5LTI2VDE2OjE2OjQxLjU4MC0wNzAwIiBjaGFuZ2VEZXNjcmlwdGlvbj0iMSI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2tpbGxzPjE8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPjE8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+MTwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzE5NGY3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0iLF9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgY2hhbmdlRGF0ZT0iMjAwNi0wOS0yNlQxNjoxNzowMS45NzktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+MTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPjE8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+MTwvYWx0ZXJuYXRpdmVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiOWJmNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvY29uZmlndXJhdGlvbnMvQ29uZmlnQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29uZmlnQSIgZ3VpZD0iXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiPgotICA8bWV0aG9kUGx1Z2luU2VsZWN0aW9uIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UUUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UlUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U1UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI19fa1MzMEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19KUlJUY0UyMUVkdURBNkRuelN5Y0tRI19KUlJUY0UyMUVkdURBNkRuelN5Y0tRIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MmNiYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9SVjg3a0UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSJfUlY4N2tFMjFFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX1JWODdrazIxRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI19SVjg3a2syMUVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2tVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdrMDIxRWR1REE2RG56U3ljS1EiIGlkPSJfUlY4N2trMjFFZHVEQTZEbnpTeWNLUSIgdXJpPSJQbHVnQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2xFMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiB1cmk9IlBsdWdBL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iMTUwNzAybSIgZ3VpZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UUUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5MmU1NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1MDcwMm08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI0NzFhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIG5hbWU9ImNwLF9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+MTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPjE8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+MTwvYWx0ZXJuYXRpdmVzPgotICA8aG93dG9TdGFmZj4xPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD4xPC9leHRlcm5hbElkPgotICA8c2NvcGU+MTwvc2NvcGU+Ci0gIDx1c2FnZU5vdGVzPjE8L3VzYWdlTm90ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjUxODkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Il9KU09Wc0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9KU09Wc1UyMUVkdURBNkRuelN5Y0tRIiBpZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3AiIGd1aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3AiIGd1aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJjcCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIGhyZWY9InVtYTovLy1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIy1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vXzNPbm1VRTIwRWR1REE2RG56U3ljS1EjXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vXzNPbm1VRTIwRWR1REE2RG56U3ljS1EjXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTcwYWIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiIGd1aWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9Gd3ZMOFUyMUVkdURBNkRuelN5Y0tRIiBpZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIHVyaT0icm9sZXMvbmV3X3JvbGVfMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9INHBUb0UyMUVkdURBNkRuelN5Y0tRIiBpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIHVyaT0idGFza3MvbmV3X3Rhc2slMjAxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pSWGFFVTIxRWR1REE2RG56U3ljS1EiIGlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iUGx1Z0EiIGd1aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il81YlM1UVUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UlUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfNWJTNVMwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX19rUzMwRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV8xIiBndWlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfcm9sZV8xIiBndWlkPSJfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFJvbGUgMSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIGhyZWY9InVtYTovLy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfdGFzayAxIiBndWlkPSJfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFRhc2sgMSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGhyZWY9InVtYTovLy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VDAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGIzMGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIG5hbWU9Im5ld19yb2xlXzEsX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBhdXRob3JzPSIxIiBjaGFuZ2VEYXRlPSIyMDA2LTA5LTI2VDE2OjE2OjQxLjU4MC0wNzAwIiBjaGFuZ2VEZXNjcmlwdGlvbj0iMSI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2tpbGxzPjE8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPjE8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+MTwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhMDBhMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0ibmV3X3Rhc2sgMSxfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGNoYW5nZURhdGU9IjIwMDYtMDktMjZUMTY6MTc6MDEuOTc5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPjE8L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPjE8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT4xPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPjE8L2FsdGVybmF0aXZlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI5YmY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbmZpZ0EiIGd1aWQ9Il84ZmQwNEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVURTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UVUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VFUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VDAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U2syMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdhYmYwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfM090czhFMjBFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iXzNPdHM4RTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNPdHM4VTIwRWR1REE2RG56U3ljS1EiIGlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81YmZHZ2syMEVkdURBNkRuelN5Y0tRIiBpZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiIHVyaT0iUGx1Z0EvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzVibE5JRTIwRWR1REE2RG56U3ljS1EiIGlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSJQbHVnQS9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IjE1MDcwMm0iIGd1aWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5MmU1NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNTA3MDJtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3BtL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjI5ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIiBuYW1lPSJjcCxfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPm08L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjkzMzMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pTT1ZzVTIxRWR1REE2RG56U3ljS1EiIGlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcG0iIGd1aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3BtIiBndWlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iY3BtIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgaHJlZj0idW1hOi8vLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWcjLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTU4Y2YxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9KU09Wc0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0Z3dkw4VTIxRWR1REE2RG56U3ljS1EiIGlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgdXJpPSJyb2xlcy9uZXdfcm9sZV9tLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0g0cFRvRTIxRWR1REE2RG56U3ljS1EiIGlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgdXJpPSJ0YXNrcy9uZXdfdGFzayUyMG0ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSlJYYUVVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcG0vbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iUGx1Z0EiIGd1aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il81YlM1UVUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UlUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfNWJTNVMwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX19rUzMwRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV8xIiBndWlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfcm9sZV9tIiBndWlkPSJfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFJvbGUgbSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIGhyZWY9InVtYTovLy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfdGFzayBtIiBndWlkPSJfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFRhc2sgbSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGhyZWY9InVtYTovLy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VDAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9yb2xlcy9uZXdfcm9sZV9tLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9yb2xlcy9uZXdfcm9sZV9tLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiNTVmOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBuYW1lPSJuZXdfcm9sZV9tLF9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgYXV0aG9ycz0ibSIgY2hhbmdlRGF0ZT0iMjAwNi0wOS0yNlQxNjoxNjo0MS41ODAtMDcwMCIgY2hhbmdlRGVzY3JpcHRpb249IjEiIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxza2lsbHM+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0Ozwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+MTwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz4xPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgbS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjA0OWQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL3Rhc2tzL25ld190YXNrIG0ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0ibmV3X3Rhc2sgbSxfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGNoYW5nZURhdGU9IjIwMDYtMDktMjZUMTY6MTc6MDEuOTc5LTA3MDAiIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI5YmY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il84ZmQwNEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb25maWdBIiBndWlkPSJfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UWsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjX19rUzMwRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdhYmYwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzNPdHM4RTIwRWR1REE2RG56U3ljS1EiIGd1aWQ9Il8zT3RzOEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViZkdnVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8zT3RzOFUyMEVkdURBNkRuelN5Y0tRIiBpZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNWJmR2drMjBFZHVEQTZEbnpTeWNLUSIgaWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIiB1cmk9IlBsdWdBL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81YmxOSUUyMEVkdURBNkRuelN5Y0tRIiBpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIHVyaT0iUGx1Z0EvcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSIxNTA3MDJtIiBndWlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMi50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI3OTU2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyLnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdD4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU3OTMyZ29sZGVuIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU3OTMyZ29sZGVuIj4KLQk8L09wZW5MaWJyYXJ5PgotCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1NzkzMm0iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTc5MzJtIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRYbWwgaW1wb3J0Rm9sZGVyTmFtZT0iMTU3OTMyZSI+Ci0JPC9JbXBvcnRYbWw+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IjE1NzkzMmdvbGRlbiIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMzMiCi0JCXVzZU5hbWVBc0lkPSJ0cnVlIj4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmUvMTU3OTMyZS54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmUvMTU3OTMyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzNlOWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJlLzE1NzkzMmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVtYTpNZXRob2RMaWJyYXJ5IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiBuYW1lPSIxNTc5MzJtIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfZUdoMm9FMnJFZHVXSmRmWjlnbjZKUSIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHRvb2w9ImVwZj0xLjIuMCI+Ci0gIDxNZXRob2RQbHVnaW4gbmFtZT0ibmV3X3BsdWctaW4iIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9mNDhQY0UyckVkdVdKZGZaOWduNkpRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgdXNlckNoYW5nZWFibGU9InRydWUiPgotICAgIDxNZXRob2RQYWNrYWdlIHhzaTp0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5UGFja2FnZSIgbmFtZT0iQ29udGVudENhdGVnb3JpZXMiIGlkPSJfa0VwYTRFMnJFZHVXSmRmWjlnbjZKUSIvPgotICA8L01ldGhvZFBsdWdpbj4KLTwvdW1hOk1ldGhvZExpYnJhcnk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDM5YThlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTU3OTMyZ29sZGVuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2I5ZTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9wb1pYVUUyckVkdWlHNTNOcXZFNEhnIiBndWlkPSJfcG9aWFVFMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iXzIwU0owRTJyRWR1dzBPdWxNYjJKMnciIGhyZWY9InVtYTovL19mNDhQY0UyckVkdVdKZGZaOWduNkpRI18yMFNKMEUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcG9sa2tFMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9wb1RRc0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3FiZm9NVTJyRWR1aUc1M05xdkU0SGciIGlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcWJmb01rMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9Im5ld19wbHVnLWluX3JlbmFtZWQvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzIwU0owVTJyRWR1dzBPdWxNYjJKMnciIGlkPSJfMjBTSjBFMnJFZHV3ME91bE1iMkoydyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfMjBTSjBrMnJFZHV3ME91bE1iMkoydyIgaWQ9Il9mNDhQY0UyckVkdVdKZGZaOWduNkpRIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfZUdoMm9FMnJFZHVXSmRmWjlnbjZKUSIgbmFtZT0iMTU3OTMybSIgZ3VpZD0iX2VHaDJvRTJyRWR1V0pkZlo5Z242SlEiPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYlpoa0UyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSIgaHJlZj0idW1hOi8vX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEjX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5Zjk4MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfMjBTSjBFMnJFZHV3ME91bE1iMkoydyIgZ3VpZD0iXzIwU0owRTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEiIG5hbWU9Im5ld19wbHVnLWluIiBndWlkPSJfZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VUUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDb250ZW50IiBndWlkPSJfMno1dlVFMnJFZHV3ME91bE1iMkoydyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlVVMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iXzJ6NXZVVTJyRWR1dzBPdWxNYjJKMnciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlVrMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iXzJ6NXZVazJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZVMDJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfMno1dlUwMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlZFMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il8yejV2VkUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VlUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iXzJ6NXZWVTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZWazJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IlRvb2xzIiBndWlkPSJfMno1dlZrMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlYwMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfMno1dlYwMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dldFMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iXzJ6NXZXRTJyRWR1dzBPdWxNYjJKMnciPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2V1UyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il8yejV2V1UyckVkdXcwT3VsTWIySjJ3Ij4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iXzJ6NXZXazJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfMno1dldrMnJFZHV3ME91bE1iMkoydyIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VzAyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXzJ6NXZXMDJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8yejV2WEUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il8yejV2WEUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzJ6NXZYVTJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfMno1dlhVMnJFZHV3ME91bE1iMkoydyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfMno1dlhrMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il8yejV2WGsyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbl9yZW5hbWVkL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbl9yZW5hbWVkL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODYwY2IuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbmV3X3BsdWctaW5fcmVuYW1lZC9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgZ3VpZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9Im5ld19wbHVnLWluX3JlbmFtZWQiIGd1aWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9xYlpoa1UyckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoa2syckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfcWJaaGtrMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoazAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJEb21haW5zIiBndWlkPSJfcWJaaGswMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGxFMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9xYlpobEUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobFUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX3FiWmhsVTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfcWJaaGxrMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGwwMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9xYlpobDAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobUUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobVUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfcWJaaG1VMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX3FiWmhtazJyRWR1aUc1M05xdkU0SGciPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfcWJaaG0wMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobTAyckVkdWlHNTNOcXZFNEhnIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhuRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfcWJaaG5FMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3FiWmhuVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX3FiWmhuVTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfcWJaaG5rMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il9xYlpobmsyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobjAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX3FiWmhuMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcyMmU0YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNTc5MzJtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmNDY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9wb1pYVUUyckVkdWlHNTNOcXZFNEhnIiBndWlkPSJfcG9aWFVFMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcG9sa2tFMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9wb1RRc0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3FiZm9NVTJyRWR1aUc1M05xdkU0SGciIGlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcWJmb01rMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfcG9UUXNFMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iMTU3OTMybSIgZ3VpZD0iX3BvVFFzRTJyRWR1aUc1M05xdkU0SGciPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYlpoa0UyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJtL25ld19wbHVnLWluL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2YjU3Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGd1aWQ9Il9xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJuZXdfcGx1Zy1pbiIgZ3VpZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGtVMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX3FiWmhrVTJyRWR1aUc1M05xdkU0SGciPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9xYlpoa2syckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrMDJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9xYlpoazAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobEUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX3FiWmhsRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfcWJaaGxVMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGxrMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9xYlpobGsyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobDAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJUb29scyIgZ3VpZD0iX3FiWmhsMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobVUyckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaG1rMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iSGlkZGVuIiBndWlkPSJfcWJaaG1rMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9xYlpobTAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobkUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX3FiWmhuRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoblUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9xYlpoblUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3FiWmhuazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfcWJaaG5rMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfcWJaaG4wMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9xYlpobjAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNS50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1MzU5MC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdD4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNWdvbGRlbiI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1ODkxM24xNTg5MjVnb2xkZW4iPgotCTwvT3BlbkxpYnJhcnk+Ci0KLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNW0iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTg5MTNuMTU4OTI1bSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0WG1sIGltcG9ydEZvbGRlck5hbWU9IjE1ODkxM24xNTg5MjVlIj4KLQk8L0ltcG9ydFhtbD4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNWdvbGRlbiIKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIyMSIKLQkJdXNlTmFtZUFzSWQ9InRydWUiPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVlLzE1ODkxM24xNTg5MjVlLnhtbCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVlLzE1ODkxM24xNTg5MjVlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlNmNlMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1ZS8xNTg5MTNuMTU4OTI1ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVtYTpNZXRob2RMaWJyYXJ5IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiBuYW1lPSIxNTg5MTNuMTU4OTI1bSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB0b29sPSJlcGY9MS4yLjAiPgotICA8TWV0aG9kUGx1Z2luIG5hbWU9Im5ld19wbHVnLWluIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLSAgICA8TWV0aG9kUGFja2FnZSB4c2k6dHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiIG5hbWU9IkNvbnRlbnRDYXRlZ29yaWVzIiBpZD0iX0dUNjRvRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8TWV0aG9kUGFja2FnZSB4c2k6dHlwZT0idW1hOkNvbnRlbnRQYWNrYWdlIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfRDFmSFVFNVJFZHVHa3FXR3p3cG43USIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgZ2xvYmFsPSJmYWxzZSIvPgotICAgIDxNZXRob2RQYWNrYWdlIHhzaTp0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudCIgbmFtZT0iY3AiIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9DZUw5TUU1UkVkdUdrcVdHendwbjdRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci0gICAgICA8UHJvY2VzcyB4c2k6dHlwZT0idW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBuYW1lPSJjcCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iX0NlTDlNVTVSRWR1R2txV0d6d3BuN1EiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHByZXNlbnRhdGlvbk5hbWU9ImNwIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUGxhbm5lZD0idHJ1ZSIgcHJlZml4PSIiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBJc0VuYWN0YWJsZT0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotICAgICAgICA8UHJlc2VudGF0aW9uIHhzaTp0eXBlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIiBuYW1lPSJjcCxfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB1c2FnZUd1aWRhbmNlPSIiIGV4dGVybmFsSWQ9IiI+Ci0gICAgICAgICAgPE1haW5EZXNjcmlwdGlvbj48L01haW5EZXNjcmlwdGlvbj4KLSAgICAgICAgICA8S2V5Q29uc2lkZXJhdGlvbnM+PC9LZXlDb25zaWRlcmF0aW9ucz4KLSAgICAgICAgICA8QWx0ZXJuYXRpdmVzPjwvQWx0ZXJuYXRpdmVzPgotICAgICAgICAgIDxIb3dUb1N0YWZmPjwvSG93VG9TdGFmZj4KLSAgICAgICAgICA8UHVycG9zZT48L1B1cnBvc2U+Ci0gICAgICAgICAgPFNjb3BlPjwvU2NvcGU+Ci0gICAgICAgICAgPFVzYWdlTm90ZXM+PC9Vc2FnZU5vdGVzPgotICAgICAgICA8L1ByZXNlbnRhdGlvbj4KLSAgICAgICAgPERlZmF1bHRDb250ZXh0Pl9BZ0JuWUU1UkVkdUdrcVdHendwbjdRPC9EZWZhdWx0Q29udGV4dD4KLSAgICAgICAgPFZhbGlkQ29udGV4dD5fQWdCbllFNVJFZHVHa3FXR3p3cG43UTwvVmFsaWRDb250ZXh0PgotICAgICAgPC9Qcm9jZXNzPgotICAgIDwvTWV0aG9kUGFja2FnZT4KLSAgPC9NZXRob2RQbHVnaW4+Ci0gIDxNZXRob2RDb25maWd1cmF0aW9uIG5hbWU9ImMiIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci0gICAgPE1ldGhvZFBsdWdpblNlbGVjdGlvbj5fLVBERFFFNVFFZHVHa3FXR3p3cG43UTwvTWV0aG9kUGx1Z2luU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl9DZUw5TUU1UkVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl8tUEREVFU1UUVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl8tUEREUVU1UUVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICA8L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L3VtYTpNZXRob2RMaWJyYXJ5PgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGQ3NmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1ODkxM24xNTg5MjVnb2xkZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9jb25maWd1cmF0aW9ucy9jLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vY29uZmlndXJhdGlvbnMvYy54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTMyMGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9jb25maWd1cmF0aW9ucy9jLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjIiBndWlkPSJfQWdCbllFNVJFZHVHa3FXR3p3cG43USI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREVFU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFVNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fQ2VMOU1FNVJFZHVHa3FXR3p3cG43USNfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERURTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUlU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFrNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERSRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUTA1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFIwNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERUazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUms1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFQwNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERTVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREU0U1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFNrNVFFZHVHa3FXR3p3cG43USIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmNWYwNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfOHpGYmtFNVFFZHVHa3FXR3p3cG43USIgZ3VpZD0iXzh6RmJrRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBKSjRVNVFFZHVHa3FXR3p3cG43USIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzh6Um8wRTVRRWR1R2txV0d6d3BuN1EiIGlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8tUEpKNGs1UUVkdUdrcVdHendwbjdRIiBpZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIHVyaT0ibmV3X3BsdWctaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy1QSko0MDVRRWR1R2txV0d6d3BuN1EiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IjE1ODkxM24xNTg5MjVtIiBndWlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdmZWJkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiBuYW1lPSJjcCxfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgZ3VpZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3OTc2Ni4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9ucTdnb1U1UkVkdU9vcHE1VGV2WWF3IiBndWlkPSJfbnE3Z29VNVJFZHVPb3BxNVRldllhdyI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbnE3Z29rNVJFZHVPb3BxNVRldllhdyIgaWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX0NlTDlNRTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0NlTDlNVTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiBocmVmPSJ1bWE6Ly8tdDcySndicXZLOXU0c3RqMzFicUNvZyMtdDcySndicXZLOXU0c3RqMzFicUNvZyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzAwN2IzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIG5hbWU9ImNwLF9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBndWlkPSItdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3BfcmVuYW1lZC9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNDkzYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGd1aWQ9Il9MY1JTZ1U1UkVkdUdrcVdHendwbjdRIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MY1JTZ2s1UkVkdUdrcVdHendwbjdRIiBpZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIgbmFtZT0iY3BfcmVuYW1lZCIgZ3VpZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjcF9yZW5hbWVkIiBndWlkPSJfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBocmVmPSJ1bWE6Ly8tdkJkZnVpazV1amhKZVZLeXpWN19ZQSMtdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwYWU3NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBndWlkPSJfLVBKSjRVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MY1JTZ1U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX25xN2dvVTVSRWR1T29wcTVUZXZZYXciIGhyZWY9InVtYTovL19DZUw5TUU1UkVkdUdrcVdHendwbjdRI19ucTdnb1U1UkVkdU9vcHE1VGV2WWF3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGJ5eFlVNVJFZHVHa3FXR3p3cG43USIgaWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX25xN2dvRTVSRWR1T29wcTVUZXZZYXciIGlkPSJfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0ibmV3X3BsdWctaW4iIGd1aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il8tUEREUVU1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUWs1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfLVBERFFrNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUTA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfLVBERFEwNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFJFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il8tUEREUkU1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUlU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXy1QRERSVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfLVBERFJrNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFIwNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iVG9vbHMiIGd1aWQ9Il8tUEREUjA1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREU0U1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il8tUEREU0U1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREU1U1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfLVBERFNVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXy1QRERTazVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfLVBERFMwNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il8tUEREUzA1UUVkdUdrcVdHendwbjdRIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERURTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfLVBERFRFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9LUnJ1c0U1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlX3JlbmFtZWQiIGd1aWQ9Il9LUnJ1c0U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9EMWZIVUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBndWlkPSJfRDFmSFVFNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9DZUw5TUU1UkVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fQ2VMOU1FNVJFZHVHa3FXR3p3cG43USNfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVGs1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXy1QRERUazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfLVBERFQwNVFFZHVHa3FXR3p3cG43USIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhMjMyYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1ODkxM24xNTg5MjVtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2NvbmZpZ3VyYXRpb25zL2MueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vY29uZmlndXJhdGlvbnMvYy54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMGFjODIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vY29uZmlndXJhdGlvbnMvYy54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjIiBndWlkPSJfQWdCbllFNVJFZHVHa3FXR3p3cG43USI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREVFU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFVNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY1ZjA2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfOHpGYmtFNVFFZHVHa3FXR3p3cG43USIgZ3VpZD0iXzh6RmJrRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBKSjRVNVFFZHVHa3FXR3p3cG43USIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzh6Um8wRTVRRWR1R2txV0d6d3BuN1EiIGlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8tUEpKNGs1UUVkdUdrcVdHendwbjdRIiBpZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIHVyaT0ibmV3X3BsdWctaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy1QSko0MDVRRWR1R2txV0d6d3BuN1EiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IjE1ODkxM24xNTg5MjVtIiBndWlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDA3YjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBuYW1lPSJjcCxfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgZ3VpZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFkNjhjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9MY1JTZ1U1UkVkdUdrcVdHendwbjdRIiBndWlkPSJfTGNSU2dVNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGNSU2drNVJFZHVHa3FXR3p3cG43USIgaWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0xic3F3VTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBocmVmPSJ1bWE6Ly8tdkJkZnVpazV1amhKZVZLeXpWN19ZQSMtdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTNmZGVkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBndWlkPSJfLVBKSjRVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MY1JTZ1U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGJ5eFlVNVJFZHVHa3FXR3p3cG43USIgaWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfcGx1Zy1pbiIgZ3VpZD0iXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFFVNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXy1QRERRVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il8tUEREUWs1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il8tUEREUTA1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUkU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXy1QRERSRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfLVBERFJVNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFJrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il8tUEREUms1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUjA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJUb29scyIgZ3VpZD0iXy1QRERSMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il8tUEREU1U1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFNrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iSGlkZGVuIiBndWlkPSJfLVBERFNrNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il8tUEREUzA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVEU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXy1QRERURTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfS1JydXNFNVJFZHVHa3FXR3p3cG43USIgbmFtZT0ibmV3X2NvbnRlbnRfcGFja2FnZSIgZ3VpZD0iX0tScnVzRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVFU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il8tUEREVFU1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vX0xic3F3RTVSRWR1R2txV0d6d3BuN1EjX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfLVBERFRrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il8tUEREVGs1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVDA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXy1QRERUMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZGIwMWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5QYXJpczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBBMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkOGJmZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDE2ZGIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljVWpRT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNValFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNValFPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgQTEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWNValF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0ljVWpRLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY1VqUk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JY20zT2V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zT3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWNtM08teDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBBMSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0ljbTNQT3g0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zUC14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNQZXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNRdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zUHV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNQLXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNQT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1FPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNRZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1F1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNQZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNRLXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zUk94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWNtM1JleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWNtM1J1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNTZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjEgcHJlc25ldCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1IteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1MteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNTT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1NleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1J1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zU3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNTLXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zUi14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zVE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1RleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0ljbTNUdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0ljbTNULXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zVXV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNVT3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNWT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNVdXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNULXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1UteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVk94NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWNtM1VPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1ZleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNWdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVi14NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWNtM1dPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JY20zV094NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JY20zVi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNXZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1d1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1cteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNtM1hPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNtM09leDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQWN0MSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zWU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWNtM091eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNZZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM1l1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zWS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNaT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljbTNadXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIwIiB5PSIxNjkiIHdpZHRoPSIxNTgiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNtM1oteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNQdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY20zYU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljbTNhZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNtM2F1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY20zYS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY20zYmV4NEVkdTJPbzZxLW5IV2dnIiB4PSI4NiIgeT0iMSIgd2lkdGg9Ijg0IiBoZWlnaHQ9IjE0OCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zYnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1F1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNiLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM2NPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zY2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNjdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljbTNkT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjkxIiB5PSIyNDIiIHdpZHRoPSI3NCIgaGVpZ2h0PSIxMTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNtM2RleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0ljbTNST3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY20zZHV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljbTNkLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNtM2VPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY20zZWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY20zZS14NEVkdTJPbzZxLW5IV2dnIiB4PSIyMCIgeT0iNzkzIiB3aWR0aD0iMTk2IiBoZWlnaHQ9IjUzIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljbTNmT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JY20zU094NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNtM2ZleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY20zZnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljbTNmLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNtM2dPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNtM2d1eDRFZHUyT282cS1uSFdnZyIgeD0iMTMwIiB5PSI3MDYiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zZy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1MteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNoT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM2hleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zaHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNoLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczl3T3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iODY2IiB3aWR0aD0iNzMiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljczl3ZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JY20zVGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNzOXd1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY3M5dy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljczl4T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNzOXhleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNzOXgteDRFZHUyT282cS1uSFdnZyIgeD0iMjAiIHk9IjExMDUiIHdpZHRoPSIxOTYiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOXlPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNVZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5eWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczl5dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOXkteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5ek94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5enV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjEwMTgiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5ei14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1ZPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczkwT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOTBleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5MHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczkwLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczkxZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMTE3OCIgd2lkdGg9IjczIiBoZWlnaHQ9IjExMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5MXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWNtM1Z1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczkxLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOTJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5MmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczkydXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczkzT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIwIiB5PSI0ODEiIHdpZHRoPSIxMjQiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOTNleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNWLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5M3V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczkzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOTRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5NGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5NC14NEVkdTJPbzZxLW5IV2dnIiB4PSI3NiIgeT0iMzk0IiB3aWR0aD0iNzQiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOTVPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNXdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5NWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczk1dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOTUteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5Nk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5NnV4NEVkdTJPbzZxLW5IV2dnIiB4PSI3NiIgeT0iNTU0IiB3aWR0aD0iNzQiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0ljbTNYZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JY20zWHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM1gteDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGUyYWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX2RGMk80RUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9kRjJPNEVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9kRjJPNFVBdkVkcUZxSXU4LWNrb2xnIiBpZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfZEJodmtFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQ1AgQTEiIGd1aWQ9Il9kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVpTendFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQWN0MSIgZ3VpZD0iX2VaU3p3RUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQWN0MSIgZ3VpZD0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHN1cGVyQWN0aXZpdGllcz0iX2RCaHZrVUF2RWRxRnFJdTgtY2tvbGciIGJyZWFrZG93bkVsZW1lbnRzPSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyBfakJGZVFFQXZFZHFGcUl1OC1ja29sZyBfanZTQkFFQXZFZHFGcUl1OC1ja29sZyBfanZTQkFVQXZFZHFGcUl1OC1ja29sZyBfanZTQkFrQXZFZHFGcUl1OC1ja29sZyBfanZTQkEwQXZFZHFGcUl1OC1ja29sZyBfanZTQkJFQXZFZHFGcUl1OC1ja29sZyBfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lFQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyBfYTBna3dFQTNFZHFGcUl1OC1ja29sZyBfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyBfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyBfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19BMSIgZ3VpZD0iX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGcgX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfN004bnNBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHZGNE1CQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHprSWdCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0ExIiBndWlkPSJfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgcmVzcG9uc2libGVGb3I9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzU1emswQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0icm9sZV9BMiIgZ3VpZD0iX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGd1aWQ9Il9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGcgX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGcgX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfZ0dFZXBFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9nR0VlcEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19CMSIgZ3VpZD0iX2pCRmVRRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDRBcUFCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDU4anNCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDhWSlVCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0IxIiBndWlkPSJfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiByZXNwb25zaWJsZUZvcj0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGcgX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0IyIiBndWlkPSJfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IxIiBndWlkPSJfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19tcUozQUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgZ3VpZD0iX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfanZiSzhFQXZFZHFGcUl1OC1ja29sZyBfanZiSzhVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjEiIGd1aWQ9Il9qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2Yks4RUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IxIiBndWlkPSJfanZiSzhFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19tcUozQUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdmJLOFVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0IxIiBndWlkPSJfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InRhc2tfQjIiIGd1aWQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIgbWFuZGF0b3J5SW5wdXQ9Il9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBvcHRpb25hbElucHV0PSJfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyIgb3V0cHV0PSJfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX3F1UXBBQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfa1lfc1lFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgZ3VpZD0iX2tZX3NZVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyBfa1pKZFlVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX25xRldFQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2tZX3NZa0F2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il9rWV9zWWtBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfa1pKZFlVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9InRhc2tfQTIiIGd1aWQ9Il9hMGdrd0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2ExdGVvRUEzRWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9hMmRGZ0VBM0VkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9hM01zWUVBM0VkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGkyQllCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2EyZEZnRUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBndWlkPSJfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIF9hNDFySUVBM0VkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTRHRVFFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2E0MXJJRUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il9hNDFySUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX3dfVEZrRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGa0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZrVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGa1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URmtrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZrMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGazBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZsRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGbFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URmxVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZsa0F2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9IjE2OS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URmwwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZsMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URm1FQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjE1OC4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGbVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm1VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZta0F2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9IjQ4MS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URm0wQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZtMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URm5FQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjEyNC4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGblVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm5VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZua0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGbjBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm4wQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGb0VBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URm9VQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZvVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGb2tBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URm8wQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZvMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnBFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZwVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGcFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnBrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZwMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGcDBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZxRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGcVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnFVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZxa0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGcTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnEwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGckVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnJVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZyVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGcmtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnIwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZyMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnNFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZzVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGc1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnNrQXZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iNzkzLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGczBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnMwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGdEVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ0VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGdFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnRrQXZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iMTEwNS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnQwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ0MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnVFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjE5Ni4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGdVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnVVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZ1a0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGdTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnUwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGdkVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnZVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ2VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGdmtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnYwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ2MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URndFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ3VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGd1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URndrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZ3MEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGdzBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfanZTQkJFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZ4RUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGeFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnhVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZ4a0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGeDBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URngwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGeUVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnlVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ5VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGeWtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnkwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ5MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnpFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ6VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGelVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnprQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZ6MEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGejBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEYwRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGMFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjBVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEYwa0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGMDBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjAwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZX3NZa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGMUVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19jMmtFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJrRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il93X2Mya1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMmtVQXZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfYzJra0F2RWRxRnFJdTgtY2tvbGciIHg9Ijg2LjAiIHk9IjEuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il93X2MybTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMm0wQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfd19jMm1rQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il96VUtyUlVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclJVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfelVLclJFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il82VjRhY1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfNlY0YWNVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfNlY0YWNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9udWE2b1VBd0VkcUZxSXU4LWNrb2xnIiBndWlkPSJfbnVhNm9VQXdFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfbnVhNm9FQXdFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fb0xaZ0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX29MWmdFQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfX252VW9FQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfd19jMm1rQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJta0F2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3dfYzJtMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3pVS3JSRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUkVBdkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il96VUtyUlVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il82VjRhY0VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfNlY0YWNFQXZFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfNlY0YWNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfbnVhNm9FQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX251YTZvRUF3RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX251YTZvVUF3RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19udlVvRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fbnZVb0VBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fb0xaZ0VBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19jMmswQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJrMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19jMmxFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iMTQ4LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X2MybFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMmxVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3dfYzJsa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X2MybGtBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19jMmwwQXZFZHFGcUl1OC1ja29sZyIgeD0iOTEuMCIgeT0iMjQyLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X2MybUVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMm1FQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X2MybVVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzQuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3pVS3JNRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTUVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfelVLck1VQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JNVUF2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il96VUtyTWtBdkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iNzA2LjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfelVLclIwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JSMEF2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3pVS3JSa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3BFeFlFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19wRXhZRUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX19vb0ZjRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3pVS3JSa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUmtBdkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il96VUtyUjBBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9fb29GY0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX29vRmNFQTZFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfX3BFeFlFQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3pVS3JNMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTTBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3pVS3JORUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3My4wIiBoZWlnaHQ9IjY3LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il96VUtyTlVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLck5VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3pVS3JOa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTmtBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfelVLck4wQXZFZHFGcUl1OC1ja29sZyIgeD0iMTMwLjAiIHk9Ijg2Ni4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLck9FQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JPRUF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLck9VQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iMTExLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il96VUtyT2tBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLck9rQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3pVS3JPMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTzBBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfelVLclBFQXZFZHFGcUl1OC1ja29sZyIgeD0iMTMwLjAiIHk9IjEwMTguMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il96VUtyU1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclNVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfelVLclNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fcDBZUUVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX3AwWVFFQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfX3BoZFVFQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfelVLclNFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JTRUF2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3pVS3JTVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19waGRVRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fcGhkVUVBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fcDBZUUVBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLclBVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JQVUF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLclBrQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3pVS3JQMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUDBBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfelVLclFFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JRRUF2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il96VUtyUVVBdkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMTE3OC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLclFrQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JRa0F2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLclEwQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iMTExLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fbTE4d0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX20xOHdFQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX19tMTh3VUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fbTE4d1VBNkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX20xOHdrQTZFZHFGcUl1OC1ja29sZyIgeD0iNzYuMCIgeT0iMzk0LjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3FSRU1VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19xUkVNVUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX19xUkVNRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19xUkVNRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fcVJFTUVBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fcVJFTVVBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX20xOHcwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19tMTh3MEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9hMGdrd0VBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX20xOHhFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ijc0LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19uU29zRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fblNvc0VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfX25Tb3NVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19uU29zVUE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fblNvc2tBNkVkcUZxSXU4LWNrb2xnIiB4PSI3Ni4wIiB5PSI1NTQuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19uU29zMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fblNvczBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfYTBna3dFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19uU290RUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3NC4wIiBoZWlnaHQ9IjExMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGMVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjFVQXZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L2RpYWdyYW1zPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfbm0wZDBFQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX25tMGQwRUF3RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfbm0wZDBVQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX25tMGQwVUF3RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvZGlhZ3JhbXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX2RCaHZrVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9IkNQIEExIiBndWlkPSJfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQTEiIGJyZWFrZG93bkVsZW1lbnRzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiIGhyZWY9InVtYTovLy05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIy05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0ICJhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2NvbnRlbnQueG1pIiAiYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9jb250ZW50LnhtaSIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzMzMzEuLjAwMDAwMDAKLS0tICJhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2NvbnRlbnQueG1pIgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciPgotICA8bWFpbkRlc2NyaXB0aW9uPkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cycga2V5IGNvbjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPiZsdDtwJmd0OwotICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJwotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCAmbHQ7c3Ryb25nJmd0O2VsZW1lbnRzJyBhbHRlcm4mbHQ7L3N0cm9uZyZndDs8L2FsdGVybmF0aXZlcz4KLSAgPGhvd3RvU3RhZmY+Q1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIHN0YWZmPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD5leHRlcm5JRDpDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyc8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cycgc2NvcGU8L3Njb3BlPgotICA8dXNhZ2VOb3Rlcz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyd1c2FnZTwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvZGlhZ3JhbS54bWkiICJiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2RpYWdyYW0ueG1pIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyMGNhMS4uMDAwMDAwMAotLS0gImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvZGlhZ3JhbS54bWkiCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljT2NvT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNPY29leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNPY29PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0ljT2NvdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JY09jby14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNPY3BPeDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvbW9kZWwueG1pIiAiYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9tb2RlbC54bWkiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDYyMjUxLi4wMDAwMDAwCi0tLSAiYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9tb2RlbC54bWkiCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfY25XbUVCQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iX2NuV21FQkJORWRxQnM3S2hkVkxSTEEiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2NuV21FUkJORWRxQnM3S2hkVkxSTEEiIGlkPSItYnEwMG84djEyRFhVVkZ0Q25pSk5jZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIiBuYW1lPSJDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyciIGd1aWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIj4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfRVcwOU1EMEtFZHFqQUk3N0RIdkJ3QSIgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBndWlkPSJfRVcwOU1EMEtFZHFqQUk3N0RIdkJ3QSI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGd1aWQ9Il9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBzdXBlckFjdGl2aXRpZXM9Il9hSFVTUVJCTkVkcUJzN0toZFZMUkxBIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotICAgICAgICA8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfWnFKTzhFQXRFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX1pxSk84RUF0RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfWnFKTzhVQXRFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX1pxSk84VUF0RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICAgIDwvZGlhZ3JhbXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9IkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyIgZ3VpZD0iX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmQ1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIiBwcmVzZW50YXRpb25OYW1lPSJDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyciIGJyZWFrZG93bkVsZW1lbnRzPSJfRVhhekVEMEtFZHFqQUk3N0RIdkJ3QSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciIGhyZWY9InVtYTovLy1icTAwbzh2MTJEWFVWRnRDbmlKTmNnIy1icTAwbzh2MTJEWFVWRnRDbmlKTmNnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlZmFkMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOmlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyIgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBndWlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGUgc3ViY2F0ZWdvcmllcyBvZiBwcm9jZXNzIGFyZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm4uJmFtcDtuYnNwOyBBIGRlbGl2ZXJ5IHByb2Nlc3MgZGVmaW5lcyBhIGNvbXBsZXRlCi0gICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmYW1wO25ic3A7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvcgotZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8cHVycG9zZT5UaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3IKLWV4dGVuZCB0aGUgcGF0dGVybiZhbXA7bmJzcDtyZXBlYXRlZGx5IHRvIGNyZWF0ZSBhcyBtYW55IGl0ZXJhdGlvbnMgYXMgbmVjZXNzYXJ5IGZvciB0aGUgcGFydGljdWxhciBkZWxpdmVyeSBwcm9jZXNzLiAmbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvCi0gICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gZm9yIHRoZSBkaXNjaXBsaW5lLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgSW4gdGhlIEluY2VwdGlvbiBQaGFzZSwgYW5hbHlzaXMgYW5kIGRlc2lnbiBpcyBjb25jZXJuZWQgd2l0aCBlc3RhYmxpc2hpbmcgd2hldGhlciB0aGUgc3lzdGVtIGFzIGVudmlzaW9uZWQgaXMKLSAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250Ci0gICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50Ci0gICAgKGJlY2F1c2UsIGZvciBleGFtcGxlLCB0aGUgZG9tYWluIGlzIHdlbGwgdW5kZXJzdG9vZCwgdGhlIHN5c3RlbSBpcyBub3Qgbm92ZWwsIGFuZCBzbyBvbikgdGhlbiB0aGlzIHdvcmtmbG93IGRldGFpbCBtYXkKLSAgICBiZSBvbWl0dGVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nCi0gICAgcG9pbnQgZm9yIHRoZSBtYWluIGFuYWx5c2lzIHdvcmsuIElmIHRoZSBhcmNoaXRlY3R1cmUgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBwcm9kdWNlZCBpbiBwcmV2aW91cwotICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvCi0gICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspCi0gICAgYW5kIGFuYWx5emluZyBiZWhhdmlvciBhbmQgY3JlYXRpbmcgYW4gaW5pdGlhbCBzZXQgb2YgZWxlbWVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvCi0gICAgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9uIHRoZSBzeXN0ZW0uIElmIHRoZSBzeXN0ZW0gaW5jbHVkZXMgYSBkYXRhYmFzZSwgdGhlbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUKLSAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OwotJmx0Oy9wJmd0OyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvCi0gICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gZm9yIHRoZSBkaXNjaXBsaW5lLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgSW4gdGhlIEluY2VwdGlvbiBQaGFzZSwgYW5hbHlzaXMgYW5kIGRlc2lnbiBpcyBjb25jZXJuZWQgd2l0aCBlc3RhYmxpc2hpbmcgd2hldGhlciB0aGUgc3lzdGVtIGFzIGVudmlzaW9uZWQgaXMKLSAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250Ci0gICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50Ci0gICAgKGJlY2F1c2UsIGZvciBleGFtcGxlLCB0aGUgZG9tYWluIGlzIHdlbGwgdW5kZXJzdG9vZCwgdGhlIHN5c3RlbSBpcyBub3Qgbm92ZWwsIGFuZCBzbyBvbikgdGhlbiB0aGlzIHdvcmtmbG93IGRldGFpbCBtYXkKLSAgICBiZSBvbWl0dGVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nCi0gICAgcG9pbnQgZm9yIHRoZSBtYWluIGFuYWx5c2lzIHdvcmsuIElmIHRoZSBhcmNoaXRlY3R1cmUgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBwcm9kdWNlZCBpbiBwcmV2aW91cwotICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvCi0gICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspCi0gICAgYW5kIGFuYWx5emluZyBiZWhhdmlvciBhbmQgY3JlYXRpbmcgYW4gaW5pdGlhbCBzZXQgb2YgZWxlbWVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvCi0gICAgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9uIHRoZSBzeXN0ZW0uIElmIHRoZSBzeXN0ZW0gaW5jbHVkZXMgYSBkYXRhYmFzZSwgdGhlbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUKLSAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OwotJmx0Oy9wJmd0OwotJmFtcDtuYnNwOyZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC9ob3d0b1N0YWZmPgotICAgIDxleHRlcm5hbElkPkVYdGVybmFsIElEOkNQMSB3aXRoIGFsbCBlbGVtZW50czwvZXh0ZXJuYWxJZD4KLSAgICA8c2NvcGU+Jmx0O3AmZ3Q7Ci0gICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8KLSAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcwotICAgIGZlYXNpYmxlLCBhbmQgd2l0aCBhc3Nlc3NpbmcgcG90ZW50aWFsIHRlY2hub2xvZ2llcyBmb3IgdGhlIHNvbHV0aW9uIChpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYXJjaHN5bi5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQKLSAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heQotICAgIGJlIG9taXR0ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBUaGUgZWFybHkgRWxhYm9yYXRpb24gUGhhc2UgZm9jdXNlcyBvbiBjcmVhdGluZyBhbiBpbml0aWFsIGFyY2hpdGVjdHVyZSBmb3IgdGhlIHN5c3RlbSAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcKLSAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzCi0gICAgaXRlcmF0aW9ucywgaW4gcHJldmlvdXMgcHJvamVjdHMsIG9yIGlzIG9idGFpbmVkIGZyb20gYW4gYXBwbGljYXRpb24gZnJhbWV3b3JrKSwgdGhlIGZvY3VzIG9mIHRoZSB3b3JrIGNoYW5nZXMgdG8KLSAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykKLSAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDMuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7QW5hbHl6ZSBCZWhhdmlvciZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFmdGVyIHRoZSBpbml0aWFsIGVsZW1lbnRzIGFyZSBpZGVudGlmaWVkLCB0aGV5IGFyZSBmdXJ0aGVyIHJlZmluZWQuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ0Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8KLSAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIHRoZSBEYXRhYmFzZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7IG9jY3VycyBpbiBwYXJhbGxlbC4gVGhlIHJlc3VsdCBpcyBhbiBpbml0aWFsIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIGFyZQotICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7Ci0mbHQ7L3AmZ3Q7JmFtcDtuYnNwOyZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC9zY29wZT4KLSAgICA8dXNhZ2VOb3Rlcz4mbHQ7cCZndDsKLSAgICBUaGUgc3ViY2F0ZWdvcmllcyBvZiBwcm9jZXNzIGFyZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm4uJmFtcDtuYnNwOyBBIGRlbGl2ZXJ5IHByb2Nlc3MgZGVmaW5lcyBhIGNvbXBsZXRlCi0gICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuCi0mbHQ7L3AmZ3Q7PC91c2FnZU5vdGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIHhtaTppZD0iLVlWVFpSRTVveTVvR2N1ZTFYWGgzZFEiIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLVlWVFpSRTVveTVvR2N1ZTFYWGgzZFEiPgotICAgIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgVGhpcyBXb3JrZmxvdyBEZXRhaWw6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7dWwmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cwotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcwotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7RGVzY3JpYmVzJmx0Oy9iJmd0OyB0aGUgb3JnYW5pemF0aW9uIG9mIHRoZSBzeXN0ZW0ncyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbgotICAgICAgICAgICAgICAgIGVmZm9ydC4KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICZsdDsvdWwmZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIEtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MgotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXkzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTQKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk2Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTcKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UKLSAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mCi0gICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3Ci0gICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwKLSAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluCi0gICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldwotICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLgotJmx0Oy9wJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBBbHRlcmFudGl2ZXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBBbHRlcjEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQWx0ZXIyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIEFsdGVyMwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L29sJmd0OzwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZQotICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQKLSAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0KLSAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZQotICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUKLSAgICBwYWlkIHRvIHNwZWNpZmljIHRlY2hub2xvZ3kgaXNzdWVzLiBUaGlzIHdpbGwgZm9yY2UgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIHRvIHNoaWZ0IG1lbWJlcnMgb3IgZXhwYW5kIHRvIGluY2x1ZGUgcGVvcGxlCi0gICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQKLSAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZQotICAgIGJ1aWxkIG1hbmFnZW1lbnQgcHJvY2VzcyBpcyB1c2VmdWwgdG8gaGF2ZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgdGVhbSBub3QgYmUgY29tcG9zZWQgb2YgYSBsYXJnZSBleHRlbmRlZCB0ZWFtLiBBIHN0cmF0ZWd5IGZvcgotICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0Ci0gICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZQotICAgIHNwZWNpZmljIGV4cGVydGlzZSBtYXkgYmUgYm9ycm93ZWQgb3IgY29udHJhY3RlZCBmcm9tIG90aGVyIG9yZ2FuaXphdGlvbnM7IHRoZXkgY2FuIGJlIGJyb3VnaHQgaW4gYXMgc3BlY2lmaWMgaXNzdWVzCi0gICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuCi0mbHQ7L3AmZ3Q7PC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiBuYW1lPSJJdGVyYXRpb24xLF9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItVlJVQ1NoQXZYcnNMZ3M3UFp6SGdVdyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIENyZWF0ZSBhbiBpbml0aWFsIHNrZXRjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0gCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBEZWZpbmUgYW4gaW5pdGlhbCBzZXQgb2YgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGVsZW1lbnRzIHRvIHVzZSBhcyB0aGUgYmFzaXMgZm9yIGFuYWx5c2lzCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhbmFseXNpcyBtZWNoYW5pc21zCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIERlZmluZSB0aGUgaW5pdGlhbCBsYXllcmluZyBhbmQgb3JnYW5pemF0aW9uIG9mIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgRGVmaW5lIHRoZSB1c2UtY2FzZSByZWFsaXphdGlvbnMgdG8gYmUgYWRkcmVzc2VkIGluIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIEtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTExCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTIyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTMzCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlCi0gICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9JnF1b3Q7Jmd0O0FyY2hpdGVjdHVyYWwgQW5hbHlzaXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3syODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9JnF1b3Q7Jmd0O1VzZS1DYXNlIEFuYWx5c2lzJmx0Oy9hJmd0Oy4gUGVyZm9ybSBhbiBpbml0aWFsIHBhc3MgYXQgdGhlIGFyY2hpdGVjdHVyZSBpbiAmbHQ7YQotICAgIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UKLSAgICBjYXNlcywgcGVyZm9ybWluZyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy91c2VfY2FzZV9hbmFseXNpcyx7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fSZxdW90OyZndDtVc2UtQ2FzZSBBbmFseXNpcyZsdDsvYSZndDsgb24gZWFjaCBvbmUuIEFmdGVyIChvciBhcykgZWFjaCB1c2UgY2FzZSBpcwotICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbQotICAgIGFuZCB0byBhZGRyZXNzIHBvdGVudGlhbCBhcmNoaXRlY3R1cmFsIHByb2JsZW1zIHdoaWNoIGFyZSBpZGVudGlmaWVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgV2hlcmUgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGZyb20gYSBwcmlvciBwcm9qZWN0IG9yIGl0ZXJhdGlvbiksIGNoYW5nZSByZXF1ZXN0cyBtYXkgbmVlZCB0byBiZQotICAgIGNyZWF0ZWQgdG8gY2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgdG8gYWNjb3VudCBmb3IgdGhlIG5ldyBiZWhhdmlvciB0aGUgc3lzdGVtIG11c3Qgc3VwcG9ydC4gVGhlc2UgY2hhbmdlcyBtYXkgYmUgdG8gYW55Ci0gICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4KLSZsdDsvcCZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxwdXJwb3NlPiZsdDtwJmd0OwotICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBBbHRlcm5hdGl2ZXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3JvbGVzL3JvbGVfQTEueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7cm9sZV9BMS54bWkmbHQ7L2EmZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDthIGhyZWY9JnF1b3Q7Li4vdGFza3MvdGFza19BMi54bWkmcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDt0YXNrX0EyLnhtaSZsdDsvYSZndDsKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDs8L2FsdGVybmF0aXZlcz4KLSAgICA8aG93dG9TdGFmZj4mbHQ7cCZndDsKLSAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUKLSAgICB0eXBpY2FsbHkgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGluY2x1ZGUgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZAotICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbQotICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlCi0gICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuCi0mbHQ7L3AmZ3Q7PC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLW5VSDB2b0Q3Um9LUWdQVDByYk93UVEiIG5hbWU9InRhc2tfQjIsX01jWUgwRHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1uVUgwdm9EN1JvS1FnUFQwcmJPd1FRIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAga2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O29sJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazMKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgIHVzYWdlIGd1aWRhbmNlIGZvciB0YXNrX0IyCi0mbHQ7L3AmZ3Q7Ci0mbHQ7dGFibGUgY2VsbHNwYWNpbmc9JnF1b3Q7MiZxdW90OyBjZWxscGFkZGluZz0mcXVvdDsyJnF1b3Q7IHdpZHRoPSZxdW90OzE4MCZxdW90OyBib3JkZXI9JnF1b3Q7MSZxdW90OyZndDsKLSAgICAmbHQ7dGJvZHkmZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90Ym9keSZndDsKLSZsdDsvdGFibGUmZ3Q7Ci0mbHQ7dGFibGUgY2VsbHNwYWNpbmc9JnF1b3Q7MiZxdW90OyBjZWxscGFkZGluZz0mcXVvdDsyJnF1b3Q7IHdpZHRoPSZxdW90OzE4MCZxdW90OyBib3JkZXI9JnF1b3Q7MSZxdW90OyZndDsKLSAgICAmbHQ7dGJvZHkmZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjEKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIGMyCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICBjMwotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgYzQKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtyb3cmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjIKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgYXNkCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRzZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkc2YKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtyb3cmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjMKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MjgmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1dHRvbnMuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzMzNyZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZHNmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByNAotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHNkZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByNQotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkYWYKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgc2RmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90Ym9keSZndDsKLSZsdDsvdGFibGUmZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy9wYXBlcnMuaHRtJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7cGFwZXJzLmh0bSZsdDsvYSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb246Ci0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1hREU0eUZ6RV9tX24yUEl6Y090NHJBIiBuYW1lPSJ0YXNrX0EyLF9KQ3JCRUR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItYURFNHlGekVfbV9uMlBJemNPdDRyQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIGtleXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrazEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2syCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtrMwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L29sJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHRhc2tfQjIKLSZsdDsvcCZndDsKLSZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OwotICAgICZsdDt0Ym9keSZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMQotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgYzIKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIGMzCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICBjNAotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMgotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBhc2QKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZHNmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRzZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMwotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsyOCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvYnV0dG9ucy5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MzM3JnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkc2YKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHI0Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgc2RmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHI1Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRhZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBzZGYKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTImcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1bGxldDEuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzEyJnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAmbHQ7L3Rib2R5Jmd0OwotJmx0Oy90YWJsZSZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlRhc2sgQTIncyByZWZpbmVkIGRlc2NyaXB0aW9uPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiBuYW1lPSJ3cERlc2MxLF9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItNXQ4R3RvTDRJQm94ZmF6QklfMGNyQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTp3cERlc2MxPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTp3cERlc2MxPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZDogd3BEZXNjMQotJmx0Oy9wJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItaWZtUU5CNXkxUlpLRjFIcm0zQ2RSQSIgbmFtZT0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMSxfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLWlmbVFOQjV5MVJaS0YxSHJtM0NkUkEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBrZXlzOgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAga2V5MSxrZXkyCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICB1c2FnZToKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UKLSAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mCi0gICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3Ci0gICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwKLSAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluCi0gICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldwotICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmx0O2JyIC8mZ3Q7Ci0gICAgJmx0O2JyIC8mZ3Q7Ci0gICAgJmFtcDtuYnNwOwotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItcE84TGVjZUdYaktlYXB1TG9GZmt4QSIgbmFtZT0icm9sZURlc2MxLF9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItcE84TGVjZUdYaktlYXB1TG9GZmt4QSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIGtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIGtleTEKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIGtleTIKLSZsdDsvcCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDt1c2FnZSBmb3Igcm9sZUExJmFtcDtuYnNwOwotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVEZXNjMTwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItX1RoLWp2NWptMGgwZjBtRmhLdHFnUSIgbmFtZT0icm9sZURlc2MyLF9ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItX1RoLWp2NWptMGgwZjBtRmhLdHFnUSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleSBjb25zaWRlcmF0aW9uIGZvciByb2xlQTI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMgotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVBMgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTIKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLUJrdjZWVGRNcGc0YkQwWWtmSFo0ZGciIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMgotJmx0Oy9wJmd0OwotJmx0O3RhYmxlIGNlbGxzcGFjaW5nPSZxdW90OzImcXVvdDsgY2VsbHBhZGRpbmc9JnF1b3Q7MiZxdW90OyB3aWR0aD0mcXVvdDsxODAmcXVvdDsgYm9yZGVyPSZxdW90OzEmcXVvdDsmZ3Q7Ci0gICAgJmx0O3Rib2R5Jmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIDEKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICB6Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIDIKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgMwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICA0Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICB6Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIDUKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICZsdDsvdGJvZHkmZ3Q7Ci0mbHQ7L3RhYmxlJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyIgbmFtZT0idGFzayB3aXRoIG5vIGxpbmtzLF81akpZQUR6a0VkcTV5c0ZPTnIxQkdRIiBndWlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTp0YXNrIHdpdGggbm8gbGlua3M8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOnRhc2sgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQ6dGFzayB3aXRoIG5vIGxpbmtzCi0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5RGVzY3JpcHRpb24geG1pOmlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyIgbmFtZT0iQWN0aXZpdHkyLF9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGlzIFdvcmtmbG93IERldGFpbDoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIFByb3ZpZGVzIHRoZSBuYXR1cmFsICZsdDtiJmd0O3RyYW5zaXRpb24gZnJvbSBhbmFseXNpcyZsdDsvYiZndDsgYWN0aXZpdGllcyAmbHQ7YiZndDt0byBkZXNpZ24mbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMsIGlkZW50aWZ5aW5nOiAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBlbGVtZW50cyBmcm9tIGFuYWx5c2lzIGVsZW1lbnRzCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBtZWNoYW5pc21zIGZyb20gcmVsYXRlZCBhbmFseXNpcyBtZWNoYW5pc21zCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAmbHQ7L3VsJmd0OwotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSdzICZsdDtiJmd0O3J1bi10aW1lIGFuZCBkZXBsb3ltZW50IGFyY2hpdGVjdHVyZSZsdDsvYiZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7T3JnYW5pemVzIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCZsdDsvYiZndDsgc28gYXMgdG8gbWFrZSB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gc2VhbWxlc3MKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7TWFpbnRhaW5zIHRoZSBjb25zaXN0ZW5jeSBhbmQgaW50ZWdyaXR5IG9mIHRoZSBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7LCBlbnN1cmluZyB0aGF0OiAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIG5ldyBkZXNpZ24gZWxlbWVudHMgaWRlbnRpZmllZCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIGFyZSBpbnRlZ3JhdGVkIHdpdGggcHJlLWV4aXN0aW5nIGRlc2lnbiBlbGVtZW50cy4KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgbWF4aW1hbCByZS11c2Ugb2YgYXZhaWxhYmxlIGNvbXBvbmVudHMgYW5kIGRlc2lnbiBlbGVtZW50cyBpcyBhY2hpZXZlZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgZGVzaWduCi0gICAgICAgICAgICAgICAgZWZmb3J0LgotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgS2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXkyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTMKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NAotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk1Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTYKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZQotICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YKLSAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcKLSAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLAotICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4KLSAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3Ci0gICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cHVycG9zZT4mbHQ7cCZndDsKLSAgICBQdXJwb3NlIG9mIHRoaXMgYWN0aXZpdHkgaXMgdG8gaGF2ZSB0YXNrcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHRvIG90aGVyIHRhc2tzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzcxJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIEFsdGVyYW50aXZlczoKLSZsdDsvcCZndDsKLSZsdDtvbCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIEFsdGVyMQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBBbHRlcjIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQWx0ZXIzCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvb2wmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci0gICAgPGhvd3RvU3RhZmY+Jmx0O3AmZ3Q7Ci0gICAgVGhlc2UgYWN0aXZpdGllcyBhcmUgYmVzdCBjYXJyaWVkIG91dCBieSBhIHNtYWxsIHRlYW0gc3RhZmZlZCBieSBjcm9zcy1mdW5jdGlvbmFsIHRlYW0gbWVtYmVycy4gSXNzdWVzIHRoYXQgYXJlCi0gICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZAotICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbQotICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlCi0gICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZQotICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUKLSAgICB3aXRoIGRpc3RyaWJ1dGlvbiBhbmQgZGVwbG95bWVudCBleHBlcnRpc2UgKGlmIHRob3NlIGlzc3VlcyBhcmUgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50KS4gSW4gb3JkZXIgdG8gdW5kZXJzdGFuZAotICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlCi0gICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yCi0gICAgY291bnRlcmluZyB0aGlzIHRyZW5kIGlzIHRvIHJldGFpbiBhIHJlbGF0aXZlbHkgc21hbGwgY29yZSB0ZWFtIHdpdGggYSBzYXRlbGxpdGUgZ3JvdXAgb2YgZXh0ZW5kZWQgdGVhbSBtZW1iZXJzIHRoYXQKLSAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlCi0gICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMKLSAgICBuZWVkIHRvIGJlIGFkZHJlc3NlZC4KLSZsdDsvcCZndDs8L2hvd3RvU3RhZmY+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItQllfX3RpandSclY0MVlVclhJdFUwdyIgbmFtZT0icm9sZV9BMixfSkM5OEFEemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLUJZX190aWp3UnJWNDFZVXJYSXRVMHciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXlzIGNvbnNpZGVyYXRpb246Um9sZSBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6Um9sZSBBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24gOiBSb2xlIEEyCi0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1ET1pyUl9zWnd3cGNVdGNvdS1qSXlRIiBuYW1lPSJyb2xlX0ExLF9KQzk4QVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItRE9aclJfc1p3d3BjVXRjb3Utakl5USI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTE6a2V5IGNvbnNpZGVyYXRpb248L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPlJvbGUgQTE6dXNhZ2U8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5Sb2xlIEExOlJlZmluZWQgZGVzY3JpcHRpb248L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLWFyRnJKaXNCeVA5MFlDck1iLWl5amciIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rczwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQgZGVzY3JpcHRpb24gOiByb2xlRGVzYyB3aXRoIG5vIGxpbmtzPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii01T2VHUEg4SlJ6U1JBRlB6QmdIbkpBIiBuYW1lPSJyb2xlX0IyLF9NYzB6d0R6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItNU9lR1BIOEpSelNSQUZQekJnSG5KQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpSb2xlIEIyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpSb2xlIEIyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpSb2xlIEIyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1ZZXJJakRySWxld2Q4aURoSVNNZzFnIiBuYW1lPSJyb2xlX0IxLF9NYzB6d1R6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItWWVySWpEcklsZXdkOGlEaElTTWcxZyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpSb2xlIEIxPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpSb2xlIEIxPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDogUm9sZSBCMTwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItbmNMaFU0dmhnNmRob0VLVFRrS2tEUSIgbmFtZT0id3BEZXNjMixfVEN1NElEemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLW5jTGhVNHZoZzZkaG9FS1RUa0trRFEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6d3BkZXNjMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6d3BkZXNjMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IHdwZGVzYzI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItaG1DQ3ItREtaNnpyOFM2RFhkcWZTQSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0pDOThBanpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1obUNDci1ES1o2enI4UzZEWGRxZlNBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5IDogQXJ0aWZhY3QgQTI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOiBBcnRpZmFjdCBBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IEFydGlmYWN0IEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1DREpvX29ZQ2REaTV2cDhJNjl2OU93IiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfSkM5OEF6emxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLUNESm9fb1lDZERpNXZwOEk2OXY5T3ciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXlzOiBEZWxpdmVyYWJsZSBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IERlbGl2ZXJhYmxlIEEyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpEZWxpdmVyYWJsZSBBMjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItUU45UkdMNWNuMFNsYlV3bkdWMkdfQSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0pESHRBRHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1RTjlSR0w1Y24wU2xiVXduR1YyR19BIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5czpBcnRpZmFjdCBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6QXJ0aWZhY3QgQTI8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5yZWZpbmVkOkFydGlmYWN0IEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii0xalREcVM0UnZfUEFFSFlGcGVvam1BIiBuYW1lPSJvdXRjb21lX0EyLF9KREh0QVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItMWpURHFTNFJ2X1BBRUhZRnBlb2ptQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpPdXRjb21lIEEyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpPdXRjb21lIEEyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpPdXRjb21lIEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1EYWt6bXZBLXFod0dFU0NmWksxMXNRIiBuYW1lPSJhcnRpZmFjdF9CMixfTWRSZnNEemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLURha3ptdkEtcWh3R0VTQ2ZaSzExc1EiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6QXJ0aWZhY3QgQjI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOkFydGlmYWN0IEIyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpBcnRpZmFjdCBCMjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItTGFEeUF1anhCa1BUaHIyOHQyWGR3ZyIgbmFtZT0iZGVsaXZlcmFibGVfQjIsX01kUmZzVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1MYUR5QXVqeEJrUFRocjI4dDJYZHdnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OkRlbGl2ZXJhYmxlIEIyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpEZWxpdmVyYWJsZSBCMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6RGVsaXZlcmFibGUgQjI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLW5UdDZIM3JYeXRVc09xcEpMRVFqZHciIG5hbWU9Im91dGNvbWVfQjIsX01ka2FvVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1uVHQ2SDNyWHl0VXNPcXBKTEVRamR3Ij4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDs8L3VzYWdlR3VpZGFuY2U+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBndWlkPSItekJBczExUmdMZ19ZU2JzN0Jka1N1USI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTEmYW1wO25ic3A7IGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgVGFzayBBMSZhbXA7bmJzcDsgZ3VpZGFuY2UKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsKLSAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9zeW5jZWQuZ2lmJnF1b3Q7Ci0gICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvaGVscGJvb2suZ2lmJnF1b3Q7Ci0gICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+VGFzayBBMSZhbXA7bmJzcDsgcmVmaW5lZCBkZXNjcmlwdGlvbjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSIteWItTEdpa2NBNU1QZVI4TDNZVzJDQSIgbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLXliLUxHaWtjQTVNUGVSOEwzWVcyQ0EiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5UYXNrIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+VGFzayBBMiBndWlkYW5jZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlRhc2sgQTIgcmVmaW5lZCBkZXNjcmlwdGlvbjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItd0JWd25LTkE3dnhQWnBZNWgwbmpCUSIgbmFtZT0icm9sZV9BMSxfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLXdCVnduS05BN3Z4UFpwWTVoMG5qQlEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Um9sZSBBMSBndWlkYW5jZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFJvbGUgQTEgcmVmaW5lZCBkZXNjCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OwotICAgICB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLV9qM2Y4ZGp3S3hzS2FDSERuSklxVkEiIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBBMiBrZXkKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2NyZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwMV9hLmdpZiZxdW90OwotICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Um9sZSBBMiB1c2FnZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlJvbGUgQTIgcmVmaW5lZCBkZXNjPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9kaWFncmFtLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU4Y2RiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2RpYWdyYW0ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4wL25vdGF0aW9uIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JSGdKME94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lIZ0owZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lIZ0owT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JSGdKMHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSUhnSjAteDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lIZ0oxT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lIc1hFT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlBoYXNlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRGFrUWNEemlFZHE1eXNGT05yMUJHUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSUhzWEVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSUhzWEVPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUGhhc2UxIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0lIc1hFdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JSHNYRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSUhzWEZPeDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSUhzWEZleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6SXRlcmF0aW9uIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRUZWcndUemlFZHE1eXNGT05yMUJHUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSUhzWEZ1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSUhzWEZleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iSXRlcmF0aW9uMSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JSHNYRi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSUhzWEdPeDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lIc1hHZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lNRnU2ZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRTczcklUemlFZHE1eXNGT05yMUJHUSIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU2dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JTUZ1Ni14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJyb2xlRGVzYzEiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JTUZ1N094NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSU1GdTcteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFza19MaW5rZWRfVG9fVGFza0ExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JTUZ1N2V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JTUZ1OGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSU1GdTd1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JTUZ1Ny14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JTUZ1N094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lNRnU4T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IndwRGVzYzEgaXMgbGlua2VkIHRvIGFydGlmYWN0Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU4ZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JTUZ1N2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JTUZ1OHV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJ3cERlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JTUZ1OC14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSU1GdTlPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0icm9sZURlc2MyIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSU1GdTlleDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lNRnUtT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSU1GdTl1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSU1GdS11eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU5LXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSU1GdS1PeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSU1GdTlleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JTUZ1LWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJ3cERlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JTUZ1LXV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSU1GdTl1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSU1GdS0teDRFZHUyT282cS1uSFdnZyIgbmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JTUZ1X094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JTUZ1NmV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3Rpdml0eTEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVVaV1VPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lNRnU2dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVVpXVWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lVWldVdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVVaV1UteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVVpXVk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVkVFc094NEVkdTJPbzZxLW5IV2dnIiB4PSIxMCIgeT0iMTg2Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWUVI4T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1N3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZRUjhleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVlFSOHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWUVI4LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZRUjlPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZRUjl1eDRFZHUyT282cS1uSFdnZyIgeD0iLTEyIiB5PSI0OSIgd2lkdGg9IjE1MSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVldZa094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSU1GdThleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWV1lrZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZXWWt1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVldZay14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWV1lsT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWV1lsdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjY5IiB5PSIyOTciIHdpZHRoPSI5NiIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVldZbC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSU1GdTgteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWV1ltT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZXWW1leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVldZbXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWV1ltLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWV1luZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIxMSIgeT0iMTI5IiB3aWR0aD0iMjEwIiBoZWlnaHQ9IjUyIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWV1ludXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1OS14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZXWW4teDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVldZb094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWV1lvZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZXWW91eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZXWXBPeDRFZHUyT282cS1uSFdnZyIgeD0iMzQyIiB5PSI1MiIgd2lkdGg9IjYzIiBoZWlnaHQ9IjUyIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWV1lwZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1LXV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZXWXB1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVldZcC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWV1lxT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZXWXFleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZXWXEteDRFZHUyT282cS1uSFdnZyIgeD0iMjc0IiB5PSIyNTUiIHdpZHRoPSIxNTQiIGhlaWdodD0iNTIiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSU1GdV9leDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lNRnVfdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JTUZ1Xy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JVmlsMnV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsMi14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSVZpbDNPeDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lWaWwzZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRFJfUUVERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSVZpbDNleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSVZpbDNPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsM3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSVZpbDMteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsNE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMERSX1FFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsNGV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRHVyTTBERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSVZpbDR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JVmlsNU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lWaWw1T3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSVZpbDVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzI5Wm5BRURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsNXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsNS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18yOVpuQWtERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JVmlsNk94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JVmlsMnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3Rpdml0eTIiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbDdPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lWaWwyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsN2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWw3dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbDcteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsOE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmlsOHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWwzT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsOU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWw5ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbDl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmlsLWV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbC11eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw0T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsLS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWxfT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbF9leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsX3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltQU94NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lWaWw0dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltQXV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1BLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltQmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltQi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltQ2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1DdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUMteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltRE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltRHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUQteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw1dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltRU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1FZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltRmV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSVZpbDZleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lWaWw2dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVmlsNi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il9JV0hOa094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIzMDAxIiBlbGVtZW50PSJfSVZpbDNleDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lYY3FVT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDQiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0lYY3FVZXg0RWR1Mk9vNnEtbkhXZ2ciIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Um91dGluZ1N0eWxlIiB4bWk6aWQ9Il9JV0hOa2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lXSE5rdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JV0hOay14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JYUNFUU94NEVkdTJPbzZxLW5IV2dnIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfSWFDRVFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMzAwMSIgZWxlbWVudD0iX0lWaWw1T3g0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0iX0lWaW1DT3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lWaW1DT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYUlLNE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA0Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9JYUlLNGV4NEVkdTJPbzZxLW5IV2dnIiB5PSI0MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlJvdXRpbmdTdHlsZSIgeG1pOmlkPSJfSWFDRVF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYUNFUS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWFDRVJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSWFJSzR1eDRFZHUyT282cS1uSFdnZyIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgPC9lZGdlcz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2JiNGIxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il80eWMzc1R6Z0VkcTV5c0ZPTnIxQkdRIiBndWlkPSJfNHljM3NUemdFZHE1eXNGT05yMUJHUSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNHljM3NqemdFZHE1eXNGT05yMUJHUSIgaWQ9Ii1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd3lEbndEemlFZHE1eXNGT05yMUJHUSIgaWQ9Ii1ZVlRaUkU1b3k1b0djdWUxWFhoM2RRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUDJXdzBUemtFZHE1eXNGT05yMUJHUSIgaWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTC02VFFEem1FZHE1eXNGT05yMUJHUSIgaWQ9Ii1uVUgwdm9EN1JvS1FnUFQwcmJPd1FRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfaW9WLVFEem1FZHE1eXNGT05yMUJHUSIgaWQ9Ii1hREU0eUZ6RV9tX24yUEl6Y090NHJBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNEhONG9EejhFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1pZm1RTkI1eTFSWktGMUhybTNDZFJBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNEkyM1lEejhFZHFFWnBUSzBXQVVkdyIgaWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbU5mb2tEejlFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1wTzhMZWNlR1hqS2VhcHVMb0Zma3hBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM2pWVEFEejlFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1fVGgtanY1am0waDBmMG1GaEt0cWdRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRmhERHNEMEJFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTFlHOXNEMEJFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1UUnhoeEFzMXhPS05SckZDRVBwQWx3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfV2U5cmNEMERFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1BZHdBam41dlJDbkVRUUxVYVlKMWR3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfaEZhRnNEMERFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1CWV9fdGlqd1JyVjQxWVVyWEl0VTB3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRVROUU1EMEVFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1ET1pyUl9zWnd3cGNVdGNvdS1qSXlRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfU2FFZE1EMEVFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSWNfb3NEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii01T2VHUEg4SlJ6U1JBRlB6QmdIbkpBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSWRJeW9EMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1ZZXJJakRySWxld2Q4aURoSVNNZzFnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTDR5YUlEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1uY0xoVTR2aGc2ZGhvRUtUVGtLa0RRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVURFVDhEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1yRFhvVzZiV1pfN21rTF9FOVdjeWhnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYWJaU2dEMElFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1obUNDci1ES1o2enI4UzZEWGRxZlNBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTUw3R29EMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1DREpvX29ZQ2REaTV2cDhJNjl2OU93IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUWgwdjREMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1RTjlSR0w1Y24wU2xiVXduR1YyR19BIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfc1pnQllEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii0xalREcVM0UnZfUEFFSFlGcGVvam1BIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdmZQRFFEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1EYWt6bXZBLXFod0dFU0NmWksxMXNRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOGc5TklEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1MYUR5QXVqeEJrUFRocjI4dDJYZHdnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcTYwYTREMGZFZHFOTV9ZUDUzSEtCdyIgaWQ9Ii1uVHQ2SDNyWHl0VXNPcXBKTEVRamR3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOEYtRFVFREVFZHFPOU0zZnVrWUFfQSIgaWQ9Ii16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfX0dNVEVFREVFZHFPOU0zZnVrWUFfQSIgaWQ9Ii15Yi1MR2lrY0E1TVBlUjhMM1lXMkNBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfR19XQW9FREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii13QlZ3bktOQTd2eFBacFk1aDBuakJRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT3JFOVFFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgZ3VpZD0iXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9EYUhrZ0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJQaGFzZTEiIGd1aWQ9Il9EYUhrZ0R6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9FRlZyd0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJJdGVyYXRpb24xIiBndWlkPSJfRUZWcndEemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJBY3Rpdml0eTEiIGd1aWQ9Il9FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJBY3Rpdml0eTEiIGd1aWQ9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJ0cnVlIiBzdXBlckFjdGl2aXRpZXM9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBicmVha2Rvd25FbGVtZW50cz0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EgX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EgX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EgX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EgX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EgX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EgXzF4NTdBRHprRWRxNXlzRk9OcjFCR1EgXzNfVU53RHprRWRxNXlzRk9OcjFCR1EgXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZVlRaUkU1b3k1b0djdWUxWFhoM2RRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtWVZUWlJFNW95NW9HY3VlMVhYaDNkUSIvPgotICAgICAgICAgICAgPHJvYWRtYXBzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8c3VwcG9ydGluZ01hdGVyaWFscyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNoZWNrbGlzdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNvbmNlcHRzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8ZXhhbXBsZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxndWlkZWxpbmVzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8cmV1c2FibGVBc3NldHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGd1aWQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0ExIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrX0xpbmtlZF9Ub19UYXNrQTEiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgbWFuZGF0b3J5SW5wdXQ9Il9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBvdXRwdXQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1pZm1RTkI1eTFSWktGMUhybTNDZFJBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtaWZtUU5CNXkxUlpLRjFIcm0zQ2RSQSIvPgotICAgICAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHprSWdCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIGd1aWQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIgbWFuZGF0b3J5SW5wdXQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBvdXRwdXQ9Il9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtQmt2NlZUZE1wZzRiRDBZa2ZIWjRkZyIvPgotICAgICAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RuZGJvQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJyb2xlRGVzYzEiIGd1aWQ9Il9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzEgbGlua2VkIHRvIHJvbGVBMSIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MxIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXBPOExlY2VHWGpLZWFwdUxvRmZreEEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1wTzhMZWNlR1hqS2VhcHVMb0Zma3hBIi8+Ci0gICAgICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9InJvbGVEZXNjMiIgZ3VpZD0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InJvbGVEZXNjMiBsaW5rZWQgdG8gcm9sZUEyIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYzIiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fVGgtanY1am0waDBmMG1GaEt0cWdRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtX1RoLWp2NWptMGgwZjBtRmhLdHFnUSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIgbmFtZT0id3BEZXNjMSIgZ3VpZD0iX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InRoaXMgd3AgaXMgbGlua2VkIHRvIGFydGlmYWN0IiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MxIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgcHJlZml4PSJwcmVmaXgiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtNXQ4R3RvTDRJQm94ZmF6QklfMGNyQSIvPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ3cERlc2MyIiBndWlkPSJfVEN1NElEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIgZGVsaXZlcmFibGVQYXJ0cz0iX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EgX1hzWHEwRHprRWRxNXlzRk9OcjFCR1EgX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1uY0xoVTR2aGc2ZGhvRUtUVGtLa0RRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtbmNMaFU0dmhnNmRob0VLVFRrS2tEUSIvPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9Xcl95OER6a0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfV3JfeThEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9Yc1hxMER6a0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX1hzWHEwRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBndWlkPSJfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1yRFhvVzZiV1pfN21rTF9FOVdjeWhnIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfM19VTndEemtFZHE1eXNGT05yMUJHUSIgbmFtZT0icm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgZ3VpZD0iXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOnJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtYXJGckppc0J5UDkwWUNyTWItaXlqZyIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgZ3VpZD0iXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOnRhc2sgd2l0aCBubyBsaW5rcyIgcHJlc2VudGF0aW9uTmFtZT0idGFzayB3aXRoIG5vIGxpbmtzIiBzdXBlckFjdGl2aXRpZXM9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLVRSeGh4QXMxeE9LTlJyRkNFUHBBbHciLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfUk1ON0VEemxFZHE1eXNGT05yMUJHUSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9STU43RUR6bEVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX2Y2cHdVRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3VUR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3VVR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1VUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3VWp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdVenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3VXp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3VkR6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3VlR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1ZUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3Vmp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdWenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3Vnp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3V0R6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3V1R6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1dUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3V2p6akVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSIxODYuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3V3p6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1d6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd1hEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1hUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdYVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1hqempFZHE1eXNGT05yMUJHUSIgeD0iMjExLjAiIHk9IjEyOS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdYenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3WHp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3WUR6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iMjEwLjAiIGhlaWdodD0iNTIuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1lUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdZVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1lqempFZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3WXp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1l6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd1pEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1pUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdaVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1pqempFZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3Wnp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1p6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd2FEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjdQbU1EempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NRHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfZjdQbU1UempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NVHpqRWRxNXlzRk9OcjFCR1EiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjdQbU1qempFZHE1eXNGT05yMUJHUSIgeD0iLTEyLjAiIHk9IjQ5LjAiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX2Y3aklNVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN2pJTVR6akVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9mN2pJTUR6akVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9nV1hiOFR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZ1dYYjhUempFZHE1eXNGT05yMUJHUSIgYW5jaG9yPSJfZ1dYYjhEempFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfc1FvUHNUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX3NRb1BzVHo5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX3NRb1BzRHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3RpbG0wVHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il90aWxtMFR6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il90aWxtMER6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il94SDZ1d1R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfeEg2dXdUejlFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfeEg2dXdEejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfMFU5U2dUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzBVOVNnVHo5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iXzBVOVNnRHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iXzhpRWQ2eno5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNnp6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il84aUVkNmp6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9ZZHJpUVQwQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWWRyaVFUMEFFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfWWRyaVFEMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfWXc1Wk1UMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1l3NVpNVDBBRWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX1l3NVpNRDBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3lLWEFNVDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTVQwZUVkcU5NX1lQNTNIS0J3IiBhbmNob3I9Il95S1hBTUQwZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il95aURIY0QwZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfeWlESGNEMGVFZHFOTV9ZUDUzSEtCdyIgYW5jaG9yPSJfeWg1OWdEMGVFZHFOTV9ZUDUzSEtCdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX2Y3aklNRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN2pJTUR6akVkcTV5c0ZPTnIxQkdRIiBncmFwaEVkZ2U9Il9mN2pJTVR6akVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfZ1dYYjhEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2dXWGI4RHpqRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX2dXWGI4VHpqRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9zUW9Qc0R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfc1FvUHNEejlFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfc1FvUHNUejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3RpbG0wRHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il90aWxtMER6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il90aWxtMFR6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeEg2dXdEejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX3hINnV3RHo5RWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX3hINnV3VHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il8wVTlTZ0R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfMFU5U2dEejlFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfMFU5U2dUejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iXzhpRWQ2ano5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNmp6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il84aUVkNnp6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfWWRyaVFEMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1lkcmlRRDBBRWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX1lkcmlRVDBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9ZdzVaTUQwQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWXc1Wk1EMEFFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfWXc1Wk1UMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3lLWEFNRDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTUQwZUVkcU5NX1lQNTNIS0J3IiBncmFwaEVkZ2U9Il95S1hBTVQwZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeWg1OWdEMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3loNTlnRDBlRWRxTk1fWVA1M0hLQnciIGdyYXBoRWRnZT0iX3lpREhjRDBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjdQbU16empFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NenpqRWRxNXlzRk9OcjFCR1EiIGVsZW1lbnQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX2Y3UG1ORHpqRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSIxNTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mN1BtTlR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU5UempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9mN1BtTmp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU5qempFZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mN1BtTnp6akVkcTV5c0ZPTnIxQkdRIiB4PSI2OS4wIiB5PSIyOTcuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mN1BtT0R6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU9EempFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjdQbU9UempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ijk2LjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfOGlFZDREejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0RHo5RWRxRVpwVEswV0FVZHciPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfOGlFZDRUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0VHo5RWRxRVpwVEswV0FVZHciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfOGlFZDRqejlFZHFFWnBUSzBXQVVkdyIgeD0iMzQyLjAiIHk9IjUyLjAiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iXzhpRWQ3VHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkN1R6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il84aUVkN0R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9ZZHJpUXowQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWWRyaVF6MEFFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfWWRyaVFqMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfWXc1Wk16MEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1l3NVpNejBBRWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX1l3NVpNajBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3lLWEFNejBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTXowZUVkcU5NX1lQNTNIS0J3IiBhbmNob3I9Il95S1hBTWowZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il95aURIY2owZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfeWlESGNqMGVFZHFOTV9ZUDUzSEtCdyIgYW5jaG9yPSJfeWlESGNUMGVFZHFOTV9ZUDUzSEtCdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iXzhpRWQ3RHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkN0R6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il84aUVkN1R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfWWRyaVFqMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1lkcmlRajBBRWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX1lkcmlRejBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9ZdzVaTWowQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWXc1Wk1qMEFFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfWXc1Wk16MEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3lLWEFNajBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTWowZUVkcU5NX1lQNTNIS0J3IiBncmFwaEVkZ2U9Il95S1hBTXowZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeWlESGNUMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3lpREhjVDBlRWRxTk1fWVA1M0hLQnciIGdyYXBoRWRnZT0iX3lpREhjajBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfOGlFZDR6ejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0eno5RWRxRVpwVEswV0FVZHciIGVsZW1lbnQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iXzhpRWQ1RHo5RWRxRVpwVEswV0FVZHciIHdpZHRoPSI2My4wIiBoZWlnaHQ9IjUyLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iXzhpRWQ1VHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNVR6OUVkcUVacFRLMFdBVWR3Ij4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iXzhpRWQ1ano5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNWp6OUVkcUVacFRLMFdBVWR3IiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iXzhpRWQ1eno5RWRxRVpwVEswV0FVZHciIHg9IjI3NC4wIiB5PSIyNTUuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il84aUVkNkR6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfOGlFZDZEejlFZHFFWnBUSzBXQVVkdyIgZWxlbWVudD0iX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfOGlFZDZUejlFZHFFWnBUSzBXQVVkdyIgd2lkdGg9IjE1NC4wIiBoZWlnaHQ9IjUyLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjZ5NlFEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2eTZRRHpqRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JTNmdFRHpsRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkFjdGl2aXR5MiIgZ3VpZD0iX0JTNmdFRHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIHhtaTppZD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkFjdGl2aXR5MiIgZ3VpZD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IkFjdGl2aXR5MiBjb250YWluaW5kIERuRCB0YXNrcyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBwcmVmaXg9IlByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIgYnJlYWtkb3duRWxlbWVudHM9Il8wRFJfUUVERUVkcU85TTNmdWtZQV9BIF8wRGs2TUVERUVkcU85TTNmdWtZQV9BIF8wRGs2TVVERUVkcU85TTNmdWtZQV9BIF8wRHVyTUVERUVkcU85TTNmdWtZQV9BIF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIF8wRHVyTWtERUVkcU85TTNmdWtZQV9BIF8wRHVyTTBERUVkcU85TTNmdWtZQV9BIF8yODg3RUVERUVkcU85TTNmdWtZQV9BIF8yOVpuQUVERUVkcU85TTNmdWtZQV9BIF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIF8yOVpuQWtERUVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLUFkd0FqbjV2UkNuRVFRTFVhWUoxZHciLz4KLSAgICAgICAgICAgIDxyb2FkbWFwcyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPHN1cHBvcnRpbmdNYXRlcmlhbHMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICAgIDxjaGVja2xpc3RzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I191ckxkY0I4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPGV4YW1wbGVzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I195UXpnVUI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8Z3VpZGVsaW5lcyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPHJldXNhYmxlQXNzZXRzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182N2s0RUI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfMERSX1FFREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0idGFza19BMSIgZ3VpZD0iXzBEUl9RRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgIiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIG1hbmRhdG9yeUlucHV0PSJfMER1ck1FREVFZHFPOU0zZnVrWUFfQSBfMER1ck1VREVFZHFPOU0zZnVrWUFfQSIgb3B0aW9uYWxJbnB1dD0iXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIG91dHB1dD0iXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfMERrNk1FREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXpCQXMxMVJnTGdfWVNiczdCZGtTdVEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIi8+Ci0gICAgICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfN004bnNBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R2RjRNQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9InJvbGVfQTEiIGd1aWQ9Il8wRGs2TUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiByZXNwb25zaWJsZUZvcj0iXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii13QlZ3bktOQTd2eFBacFk1aDBuakJRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtd0JWd25LTkE3dnhQWnBZNWgwbmpCUSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzU1emswQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRGs2TVVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfMERrNk1VREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtX2ozZjhkandLeHNLYUNIRG5KSXFWQSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il8wRHVyTUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfMER1ck1VREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRHVyTWtERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgZ3VpZD0iXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBkZWxpdmVyYWJsZVBhcnRzPSJfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSBfMEVVaEVVREVFZHFPOU0zZnVrWUFfQSBfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il8wRHVyTTBERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRVVoRVVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iXzBFVWhFa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il8yODg3RUVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJ0YXNrX0EyIiBndWlkPSJfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMiAiIHByZWZpeD0iUHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIG1hbmRhdG9yeUlucHV0PSJfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgb3B0aW9uYWxJbnB1dD0iXzI5Wm5BVURFRWRxTzlNM2Z1a1lBX0EiIG91dHB1dD0iXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfMERrNk1VREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXliLUxHaWtjQTVNUGVSOEwzWVcyQ0EiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy15Yi1MR2lrY0E1TVBlUjhMM1lXMkNBIi8+Ci0gICAgICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOVpuQUVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzI5Wm5BRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMjlabkFVREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGd1aWQ9Il8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIgZGVsaXZlcmFibGVQYXJ0cz0iXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EgXzI5c2g4VURFRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOVpuQWtERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfMjlabkFrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOXNoOEVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iXzI5c2g4VURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfTmdEODhEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg4RHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDg4VHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q4OFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDg4anptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEODh6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg4enptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEODlEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEODlUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg5VHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEODlqem1FZHE1eXNGT05yMUJHUSIgeD0iMTAuMCIgeT0iMTg2LjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEODl6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg5enptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOC1Eem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOC1Uem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDgtVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOC1qem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q4LXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOC16em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q4X0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q4X1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOF9Uem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q4X2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDhfenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q4X3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlBRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlBVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5QVR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlBanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUF6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlBenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUJEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUJUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlCVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUJqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5Qnp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUJ6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5Q0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q5Q1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUNUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q5Q2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlDenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5Q3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlERHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlEVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlEanptRWRxNXlzRk9OcjFCR1EiIHg9IjEwLjAiIHk9IjU4NC4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlEenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RHp6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlFRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlFVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RVR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlFanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUV6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlFenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUZEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUZUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlGVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUZqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5Rnp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUZ6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5R0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q5R1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUdUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q5R2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlHenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5R3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlIRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlIVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5SFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlIanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUh6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlIenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUlEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdOdDhEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnQ4RHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfTmdOdDhUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnQ4VHptRWRxNXlzRk9OcjFCR1EiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdOdDhqem1FZHE1eXNGT05yMUJHUSIgeD0iMTAuMCIgeT0iNjAuMCIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfTmdOdUJUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCVHptRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX05nTnVCRHptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX04wN1pzVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OMDdac1R6bUVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9OMDdac0R6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfTmdOdUJEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCRHptRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX05nTnVCVHptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9OMDdac0R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTjA3WnNEem1FZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfTjA3WnNUem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050OHp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDh6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050OUR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050OVR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDlUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ050OWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDlqem1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ050OXp6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSIzMTIuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050LUR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC1Eem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050LVR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050LWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC1qem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ050LXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC16em1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ050X0R6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSI0NDguMCIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfTmdOdUJ6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCenptRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX05nTnVCanptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX04wN1pzenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OMDdac3p6bUVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9OMDdac2p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfTmdOdUJqem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCanptRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX05nTnVCenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9OMDdac2p6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTjA3WnNqem1FZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfTjA3WnN6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050X1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdF9Uem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050X2p6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050X3p6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdF96em1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ051QUR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUFEem1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ051QVR6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSI3MjAuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ051QWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUFqem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ051QXp6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlJVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5SVR6bUVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICA8L2RpYWdyYW1zPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6SXRlcmF0aW9uIiB4bWk6aWQ9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJJdGVyYXRpb24xIiBndWlkPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBpc09uZ29pbmc9InRydWUiIGJyZWFrZG93bkVsZW1lbnRzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSBfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtVlJVQ1NoQXZYcnNMZ3M3UFp6SGdVdyIvPgotICAgICAgICAgIDxyb2FkbWFwcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfWXVrZ1FBLVZFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxzdXBwb3J0aW5nTWF0ZXJpYWxzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPGNoZWNrbGlzdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX09WTFZjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8ZXhhbXBsZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3VhaldjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Z3VpZGVsaW5lcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxyZXVzYWJsZUFzc2V0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX3JrVzhrRDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il9ya1c4a0QwZUVkcU5NX1lQNTNIS0J3Ij4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9ya1c4a1QwZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfcmtXOGtUMGVFZHFOTV9ZUDUzSEtCdyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlBoYXNlIiB4bWk6aWQ9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJQaGFzZTEiIGd1aWQ9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb25OYW1lPSJQaGFzZTEiIHN1cGVyQWN0aXZpdGllcz0iXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiIGJyZWFrZG93bkVsZW1lbnRzPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX2V3bHc4RHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9ld2x3OER6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZXdsdzhUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2V3bHc4VHpqRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfRGFrUWNEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPGRpYWdyYW1zIHhtaTppZD0iX2Jjc1hRRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9iY3NYUUR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Jjc1hRVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9iY3NYUVR6akVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8L2RpYWdyYW1zPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGd1aWQ9Il80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJlYWtkb3duRWxlbWVudHM9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLUUtZDRKY3UyOTdyeFVxOGx0ZThxbnciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0YzRkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTppZD0iLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXciIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzLF9adFpiTVVERkVkcU85TTNmdWtZQV9BIiBndWlkPSItaWNPNnBJSGRabTlWeHljLUpaOVV5dyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj5tYWluOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvbWFpbkRlc2NyaXB0aW9uPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5LZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC91c2FnZUd1aWRhbmNlPgotICAgIDxwdXJwb3NlPlB1cnBvc2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9wdXJwb3NlPgotICAgIDxhbHRlcm5hdGl2ZXM+YWx0ZXJuYXRpdmVzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPkhvdyB0byBzdGFmZjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L2hvd3RvU3RhZmY+Ci0gICAgPGV4dGVybmFsSWQ+RXh0ZXJuYWwgSUQ6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9leHRlcm5hbElkPgotICAgIDxzY29wZT5zY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L3Njb3BlPgotICAgIDx1c2FnZU5vdGVzPnVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvdXNhZ2VOb3Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiBuYW1lPSIsX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIj4KLSAgICA8bWFpbkRlc2NyaXB0aW9uPm1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvbWFpbkRlc2NyaXB0aW9uPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cHVycG9zZT5wdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHM8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz5hbHRlcm5hdGl2ZXM6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPmhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmViMzc3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lheTVSdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbERobDhFREZFZHFPOU0zZnVrWUFfQSIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lheTVSLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTVVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JYXk1U094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0lheTVTZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JYXk1VE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEEzIGV4dGVuZHMgVGFzayBBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWF5NVN1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWF5NVR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lheTVTLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWF5NVRPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWF5NVNleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYXk1VGV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lheTVUdXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JYXk1U3V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYXk1VC14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcWhtTkVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JYXk1VU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JYXk1UnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJhY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWF5NVZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lheTVSLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYXk1VmV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lheTVWdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWF5NVYteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYXk1V094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYXk1V3V4NEVkdTJPbzZxLW5IV2dnIiB4PSIzMCIgeT0iODgiIHdpZHRoPSIyMjgiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWF5NVcteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lheTVTLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYXk1WE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lheTVYZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWF5NVh1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYXk1WC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYXk1WWV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxNDMiIHk9IjEiIHdpZHRoPSI4NCIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYXk1WXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWF5NVR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lheTVZLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWF5NVpPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYXk1WmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lheTVadXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lheTVhT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjE0MyIgeT0iMTc1IiB3aWR0aD0iODQiIGhlaWdodD0iODMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWF5NVVleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lheTVVdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JYXk1VS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JYTRfNC14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JYTRfNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWE0XzVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQVVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWE0XzV1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lhNF82ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JYTRfNS14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JYTRfN2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWE0XzZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JYTRfNmV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JYTRfNXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lhNF82dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQkVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYTRfNi14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0XzdPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JYTRfN2V4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWE0XzUteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0Xzd1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0XzcteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWE0XzhPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWE0XzQteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYTRfOU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWE0XzVPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lhNF85ZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWE0Xzl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYTRfOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lhNF8tT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lhNF8tdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjMwIiB5PSIyMzYiIHdpZHRoPSIyMjEiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWE0Xy0teDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lhNF82T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYTRfX094NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNF9fZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWE0X191eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYTRfXy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYTVBQWV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzIiIHk9IjEiIHdpZHRoPSI5NCIgaGVpZ2h0PSIyMTUiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWE1QUF1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lhNF83ZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYTVBQS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNUFCT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWE1QUJleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYTVBQnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYTVBQ094NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzciIHk9IjMyMyIgd2lkdGg9Ijg0IiBoZWlnaHQ9IjE2NiIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JYTRfOGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWE0Xzh1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNF84LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMzljMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9aekRYUVVERkVkcU85TTNmdWtZQV9BIiBndWlkPSJfWnpEWFFVREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWnpEWFFrREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1pY082cElIZFptOVZ4eWMtSlo5VXl3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdEdGNHdVREdFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EiIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBndWlkPSJfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgZ3VpZD0iX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBndWlkPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfWnRaYk1VREZFZHFPOU0zZnVrWUFfQSIgYnJlYWtkb3duRWxlbWVudHM9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIF9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTVVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIF9HcWhtTTBEUUVkcXJoc1poM1FOQU1RIF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiBocmVmPSJ1bWE6Ly8taWNPNnBJSGRabTlWeHljLUpaOVV5dyMtU3JjVlMtN2RTWURFMlJwbTdTSWt5QSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBuYW1lPSJ0YXNrX0EzIiBndWlkPSJfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IFRhc2sgQTMiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEgX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiIG1hbmRhdG9yeUlucHV0PSJfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIgb3B0aW9uYWxJbnB1dD0iX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIG91dHB1dD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19vVWx1RUVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI19yQ1d3VUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI191bXlnWUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI192eDVCa0VEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190bmRib0JCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQTMiIGd1aWQ9Il9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJicmllZiA6IFJvbGUgQTMiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTMgZXh0ZW5kcyBSb2xlIEEyIiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1FRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9BMiIgZ3VpZD0iX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgcmVzcG9uc2libGVGb3I9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIF9HcWhtTTBEUUVkcXJoc1poM1FOQU1RIF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9BMSIgZ3VpZD0iX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHN1cGVyQWN0aXZpdGllcz0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBndWlkPSJfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGRlbGl2ZXJhYmxlUGFydHM9Il9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIF9HcXF3SVVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU5FRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il9HcXF3SVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX19wbGRrRURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxka0VEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRrVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxka1VEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZGtrRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRrMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkazBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRsRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkbFVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZGxVRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRsa0RRRWRxcmhzWmgzUU5BTVEiIHg9IjMwLjAiIHk9Ijg4LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkbDBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZGwwRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkbUVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iMjI4LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRtVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbVVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZG1rRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRtMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbTBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FobU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRuRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkblVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZG5VRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRua0RRRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkbjBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZG4wRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkb0VEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3BsZG9VRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRvVURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcGxkb2tEUUVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3BsZG8wRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRvMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3BsZHBFRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRwVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkcFVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZHBrRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRwMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkcDBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRxRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkcVVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHFVRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRxa0RRRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkcTBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHEwRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkckVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3A0WWdFRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFlnRURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9fcDRZZ1VEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWdVRFFFZHFyaHNaaDNRTkFNUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wNFlna0RRRWRxcmhzWmgzUU5BTVEiIHg9IjE0My4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3FDSmdVRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19xQ0pnVURRRWRxcmhzWmgzUU5BTVEiIGFuY2hvcj0iX19xQ0pnRURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19xQ0pnRURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcUNKZ0VEUUVkcXJoc1poM1FOQU1RIiBncmFwaEVkZ2U9Il9fcUNKZ1VEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3A0WWcwRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFlnMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3A0WWhFRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wNFloVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcDRZaFVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfX3A0WWhrRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFloa0RRRWRxcmhzWmgzUU5BTVEiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcDRZaDBEUUVkcXJoc1poM1FOQU1RIiB4PSIxNDMuMCIgeT0iMTc1LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcDRZaUVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWlFRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcDRZaVVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iODQuMCIgaGVpZ2h0PSI4My4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkclVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHJVRFFFZHFyaHNaaDNRTkFNUSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L2RpYWdyYW1zPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZFhEZDhFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX2RYRGQ4RURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIHN1cGVyQWN0aXZpdGllcz0iX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyZWFrZG93bkVsZW1lbnRzPSJfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0idGFza19CMiIgZ3VpZD0iX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX2w1eVVBa0RQRWRxcmhzWmgzUU5BTVEgX2w1eVVBMERQRWRxcmhzWmgzUU5BTVEiIG1hbmRhdG9yeUlucHV0PSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIgb3B0aW9uYWxJbnB1dD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEgX2w1eVVDRURQRWRxcmhzWmgzUU5BTVEiIG91dHB1dD0iX2w1eVVDVURQRWRxcmhzWmgzUU5BTVEgX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19vcVlzd0I4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19xeXU1VUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I191Q0JiUUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVBVURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIHJlc3BvbnNpYmxlRm9yPSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVBa0RQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQjEiIGd1aWQ9Il9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQTBEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVCRURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iX2w1eVVCVURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il9sNXlVQmtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBndWlkPSJfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGRlbGl2ZXJhYmxlUGFydHM9Il9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIF9sNTdkOFVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGd1aWQ9Il9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgZGVsaXZlcmFibGVQYXJ0cz0iX2w1N2Q4a0RQRWRxcmhzWmgzUU5BTVEgX2w1N2Q4MERQRWRxcmhzWmgzUU5BTVEgX2w1N2Q5RURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJhcnRpZmFjdF9CMiIgZ3VpZD0iX2w1N2Q4RURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDU3ZDhVRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0ib3V0Y29tZV9CMiIgZ3VpZD0iX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il9sNTdkOGtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1N2Q4MERQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfbDU3ZDlFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxkaWFncmFtcyB4bWk6aWQ9Il9COUdfWUVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1lFRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfWVVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1lVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19Za0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfWTBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1kwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfWkVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX1pVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19aVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfWmtEUkVkcXJoc1poM1FOQU1RIiB4PSIzMC4wIiB5PSIyMzYuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19aMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfWjBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19hRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSIyMjEuMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2FVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19hVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfYWtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2EwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19hMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2JFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19iVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfYlVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2JrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19iMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfYjBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19jRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfY1VEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2NVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19ja0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfYzBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2MwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVCRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfZEVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2RVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19kVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfZGtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2QwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19kMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2VFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19lVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfZVVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2VrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19lMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfZTBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19mRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfZlVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2ZVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19ma0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfZjBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2YwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfZ0VEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2dVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19nVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfZ2tEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2cwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19nMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2hFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19oVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfaFVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2hrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19oMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfaDBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19pRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfaVVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2lVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19pa0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfaTBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2kwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfakVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2prRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19qa0RSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9COUdfajBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2owRFJFZHFyaHNaaDNRTkFNUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19rRURSRWRxcmhzWmgzUU5BTVEiIHg9IjEzMi4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfQjlHX21VRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19tVURSRWRxcmhzWmgzUU5BTVEiIGFuY2hvcj0iX0I5R19tRURSRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX0I5R19tRURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfbUVEUkVkcXJoc1poM1FOQU1RIiBncmFwaEVkZ2U9Il9COUdfbVVEUkVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2tVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19rVURSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2trRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijk0LjAiIGhlaWdodD0iMjE1LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfazBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2swRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX0I5R19sRURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfbEVEUkVkcXJoc1poM1FOQU1RIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2xVRFJFZHFyaHNaaDNRTkFNUSIgeD0iMTM3LjAiIHk9IjMyMy4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2xrRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19sa0RSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2wwRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iMTY2LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19qVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfalVEUkVkcXJoc1poM1FOQU1RIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9adFpiTVVERkVkcU85TTNmdWtZQV9BIiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlc2VudGF0aW9uTmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyZWFrZG93bkVsZW1lbnRzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSBfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXciIGhyZWY9InVtYTovLy1pY082cElIZFptOVZ4eWMtSlo5VXl3Iy1pY082cElIZFptOVZ4eWMtSlo5VXl3Ii8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvRWRpdG9yTG9hZC5ydGYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9FZGl0b3JMb2FkLnJ0ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5YzEwNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9FZGl0b3JMb2FkLnJ0ZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2FwcGxpZWRpcy5naWYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9hcHBsaWVkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVmMWIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2FwcGxpZWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idWxsZXQxLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1bGxldDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM4YzI0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1bGxldDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvYnV0dG9ucy5qcGcgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idXR0b25zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0YjJkMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idXR0b25zLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyZDYyZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9uaV9nZXRTdGFydGVkLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL25pX2dldFN0YXJ0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Q4Y2EwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL25pX2dldFN0YXJ0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcGFwZXJzLmh0bSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3BhcGVycy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWQzZDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcGFwZXJzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0gCi0gPGh0bWw+Ci0KLTxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4gPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJvdGhlciI+ICA8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iPiAKLTx0aXRsZT5XaGl0ZSBQYXBlcnM8L3RpdGxlPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSIuLi9yb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0KLTxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiPgotPG1ldGEgbmFtZT0iUHJvZ0lkIiBjb250ZW50PSJGcm9udFBhZ2UuRWRpdG9yLkRvY3VtZW50Ij4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLSAKLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQgdmFsaWduPSJ0b3AiPgotCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLQotLy9UZWxsIHRoZSBUcmVlUGF0aCB0byB1cGRhdGUgaXRzZWxmCi12YXIgdGhlUGF0aCA9ICIiOwotdmFyIHR5cGUgPSB0eXBlb2YgcGFyZW50Lm9yeV9idXR0b247Ci1pZiAodHlwZSAhPSAidW5kZWZpbmVkIikgewotCSB0eXBlID0gdHlwZW9mIHBhcmVudC5vcnlfYnV0dG9uLmdldFRyZWVQYXRoKCk7Ci0JIGlmICh0eXBlICE9ICJ1bmRlZmluZWQiKSB7Ci0JIAkgdGhlUGF0aCA9IHBhcmVudC5vcnlfYnV0dG9uLmdldFRyZWVQYXRoKCk7Ci0JIH0KLX0KLWRvY3VtZW50LndyaXRlKHRoZVBhdGgpOwotLS0+Ci08L3NjcmlwdD4KLQotIAotCi0KLQotPGgxIGNsYXNzPSJiYW5uZXIiPjxiPlJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzczombmJzcDtXaGl0ZSBQYXBlcnM8L2I+PC9oMT4KLTxwIGNsYXNzPSJiYW5uZXIiPlRoZSBSVVAgaW5jbHVkZXMgYSBudW1iZXIgb2Ygd2hpdGUgcGFwZXJzLCBsaXN0ZWQgYmVsb3cuPC9wPgotPHVsPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfZGlzY2lwbGluZXMuaHRtIj5EaXNjaXBsaW5lczwvYT48dWw+Ci08bGk+PGEgaHJlZj0iYXBwcm11Yy5odG0iPkFwcGx5aW5nIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IHdpdGggVXNlIENhc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idHJhY2VhYmlsaXR5Lmh0bSI+VHJhY2VhYmlsaXR5IFN0cmF0ZWdpZXMgZm9yIE1hbmFnaW5nIFJlcXVpcmVtZW50cyB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19yZXF1aXJlbWVudHMuaHRtIj5SZXF1aXJlbWVudHM8L2E+PHVsPgotPGxpPjxhIGhyZWY9ImFwcHJtdWMuaHRtIj5BcHBseWluZyBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InVzZWNhc2UuaHRtIj5UaGUgRXN0aW1hdGlvbiBvZiBFZmZvcnQgQmFzZWQgb24gVXNlIENhc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idHJhY2VhYmlsaXR5Lmh0bSI+VHJhY2VhYmlsaXR5IFN0cmF0ZWdpZXMgZm9yIE1hbmFnaW5nIFJlcXVpcmVtZW50cyB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRlbmVzcy5odG0iPlRoZSBUZW4gRXNzZW50aWFscyBvZiBSVVA8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfYXJjaGl0ZWN0dXJlLmh0bSI+QXJjaGl0ZWN0dXJlPC9hPjx1bD4KLTxsaT48YSBocmVmPSJsYXllcmluZ19zdHJhdGVnaWVzLmh0bSI+TGF5ZXJpbmcgU3RyYXRlZ2llczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19kZXNpZ24uaHRtIj5EZXNpZ248L2E+PHVsPgotPGxpPjxhIGhyZWY9InhwcmVmYWN0Lmh0bSI+UlVQL1hQIEd1aWRlbGluZXM6IFRlc3QtZmlyc3QgRGVzaWduIGFuZCBSZWZhY3RvcmluZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNpcy5odG0iPkRldmVsb3BpbmcgTGFyZ2UtU2NhbGUgU3lzdGVtcyB3aXRoIHRoZSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3M8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfaW1wbGVtZW50YXRpb24uaHRtIj5JbXBsZW1lbnRhdGlvbjwvYT48dWw+Ci08bGk+PGEgaHJlZj0ieHByZWZhY3QuaHRtIj5SVVAvWFAgR3VpZGVsaW5lczogVGVzdC1maXJzdCBEZXNpZ24gYW5kIFJlZmFjdG9yaW5nPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ieHBwYWlyLmh0bSI+UlVQL1hQIEd1aWRlbGluZXM6IFBhaXIgUHJvZ3JhbW1pbmc8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfYXNzZXNzbWVudC5odG0iPkFzc2Vzc21lbnQ8L2E+PHVsPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvYXNzZXNzbWVudC9wY190ZXN0Lmh0bSI+VGVzdDwvYT48dWw+Ci08bGk+PGEgaHJlZj0icnRfdGVzdC5odG0iPlRlc3RpbmcgRW1iZWRkZWQgU3lzdGVtczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSIuLi9jb21wb25lbnRzL3BjX21hbmFnZW1lbnQuaHRtIj5NYW5hZ2VtZW50PC9hPjx1bD4KLTxsaT48YSBocmVmPSIuLi9jb21wb25lbnRzL21hbmFnZW1lbnQvcGNfY2NtLmh0bSI+Q29uZmlndXJhdGlvbiAmIENoYW5nZSBNYW5hZ2VtZW50PC9hPjx1bD4KLTxsaT48YSBocmVmPSJjb250ZW50bWdtdC5odG0iPkNvbnRlbnQgTWFuYWdlbWVudCBVc2luZyB0aGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idGVuZXNzLmh0bSI+VGhlIFRlbiBFc3NlbnRpYWxzIG9mIFJVUDwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idGVuZXNzLmh0bSI+VGhlIFRlbiBFc3NlbnRpYWxzIG9mIFJVUDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRyYW5zd2ZhbGwuaHRtIj5Gcm9tIFdhdGVyZmFsbCB0byBJdGVyYXRpdmUgTGlmZWN5Y2xlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idXNlY2FzZS5odG0iPlRoZSBFc3RpbWF0aW9uIG9mIEVmZm9ydCBCYXNlZCBvbiBVc2UgQ2FzZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJydXB4cC5odG0iPkEgQ29tcGFyaXNvbiBvZiBSVVAgYW5kIFhQPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic21wcm9qLmh0bSI+VXNpbmcgdGhlIFJVUCBmb3IgU21hbGwgUHJvamVjdHM6IEV4cGFuZGluZyB1cG9uIGVYdHJlbWUgUHJvZ3JhbW1pbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSJydXBjbW0uaHRtIj5SZWFjaGluZyBDTU0gTGV2ZWxzIDIgYW5kIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwcm9jZXNzX21hdHVyaXR5Lmh0bSI+QW4gRW5hYmxlciBmb3IgSGlnaGVyIFByb2Nlc3MgTWF0dXJpdHk8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzaXMuaHRtIj5EZXZlbG9waW5nIExhcmdlLVNjYWxlIFN5c3RlbXMgd2l0aCB0aGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idmFyaWFudHMuaHRtIj5TeXN0ZW0gVmFyaWFudHM8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfdG9vbHMuaHRtIj5Ub29sczwvYT48dWw+Ci08bGk+PGEgaHJlZj0iLi4vdG9vbG1lbnQveGRlX2VjbGlwc2UvbW9kZWxfc3RydWN0dXJlX2d1aWRlbGluZXMuaHRtIj5Nb2RlbCBTdHJ1Y3R1cmUgR3VpZGVsaW5lcyBmb3IgUmF0aW9uYWwgWERFIERldmVsb3BlciAtIEphdmEgUGxhdGZvcm0gRWRpdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ii4uL3Rvb2xtZW50L3hkZV92c25ldC9tb2RlbF9zdHJ1Y3R1cmVfZ3VpZGVsaW5lcy5odG0iPk1vZGVsIFN0cnVjdHVyZSBHdWlkZWxpbmVzIGZvciBSYXRpb25hbCBYREUgRGV2ZWxvcGVyIC0gLk5FVCBFZGl0aW9uPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci0KLTxwPklmIHlvdSBoYXZlIEludGVybmV0IGFjY2VzcywmbmJzcDsgc29tZSBvZiB0aGUgUlVQIHdoaXRlIHBhcGVycyBjYW4gYmUgZG93bmxvYWRlZCAKLSAgZnJvbSZuYnNwO3RoZSA8YSBocmVmPSJodHRwOi8vd3d3LTMwNi5pYm0uY29tL3NvZnR3YXJlL3JhdGlvbmFsL2luZm8vbGl0ZXJhdHVyZS93aGl0ZXBhcGVycy5qc3AiIHRhcmdldD0iX2JsYW5rIj5JQk0gV2ViIHNpdGUuPC9hPjwvcD4KLTxicj48YnI+Ci0KLSAKLTxkaXYgY2xhc3M9Im1hcmdpbnMyMCI+Ci08cD4KLSA8YSBocmVmPSIuLi9jb3B5cml0ZS9jb3B5cml0ZS5odG0iPgotIDxmb250IHNpemU9Ii0yIj4mY29weTsgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTg3LCAyMDA0LiBBbGwgUmlnaHRzIFJlc2VydmVkLjwvZm9udD4KLSA8L2E+Ci08L3A+Ci08L2Rpdj4KLQotCi08L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0Ij48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KLTxwPgotPGEgaHJlZj0iLi4vaW5kZXguaHRtIj48L2E+Ci08L3A+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotCi1mdW5jdGlvbiBsb2FkVG9wKCkKLXsKLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpCi0gIHsKLQkgdmFyIG1zZyA9ICJUaGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGFscmVhZHkgZGlzcGxheWVkIHVzaW5nIGZyYW1lcyI7Ci0gICAgIGFsZXJ0KG1zZyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7Ci0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKwotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOwotCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7Ci0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpCi0gICAgewotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkKLQl7Ci0JCXdpbmRvdy5jbG9zZSgpOwotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkKLQl9Ci0JZWxzZQotCXsKLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsKLQl9Ci0gICAgfQotICAgfQotfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotICBmdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkKLSAgewotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsKLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZi5zdWJzdHJpbmcoMCxkb2N1bWVudC5saW5rc1tpXS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOwotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsKLSAgICAgICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQKLWxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLU1TRlBob3ZlciA9Ci0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwKLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsKLQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpCi0gIHsKLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7Ci0gICAgIGEuc3JjPWltZzsKLSAgICAgcmV0dXJuIGE7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLSAgICBpZihNU0ZQaG92ZXIpCi0gICAgewotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL3J1cDEuZ2lmJykpOwotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL3J1cDFfYS5naWYnKSk7Ci0gICAgfQotLy8gLS0+Ci0KLS8vZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90Ci12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsKLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7Ci0JLy8gc3BsaXQgYWx0IHRleHQgb3V0IHRvIGFsbG93IHRyYW5zbGF0aW9uCi0JdmFyIGFsdFRleHQgPSAiRGlzcGxheSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgdXNpbmcgZnJhbWVzIjsKLQlkb2N1bWVudC53cml0ZSgiPGEgaHJlZj1cIkphdmFTY3JpcHQ6bG9hZFRvcCgpO1wiIG9ubW91c2VvdmVyPVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBCbHVlLnNyYzsgc2VsZi5zdGF0dXM9JyAnOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIuLi9pbWFnZXMvcnVwMS5naWYiKTsKLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbHQ9XCIiKTsKLSAgICAgICAgZG9jdW1lbnQud3JpdGUoYWx0VGV4dCk7Ci0gICAgICAgIGRvY3VtZW50LndyaXRlKCJcIiBuYW1lPVwiSG9tZVwiIHdpZHRoPVwiMjZcIiBoZWlnaHQ9XCIxNjdcIj48L2E+Iik7Ci0KLX0KLWVsc2UgewotCXZhciBuYnNwID0gIiZuYnNwOyI7Ci0JZG9jdW1lbnQud3JpdGUobmJzcCk7Ci19Ci08L3NjcmlwdD4KLQotPC90ZD48L3RyPjwvdGFibGU+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4KLTxwIGFsaWduPSJyaWdodCI+PHNtYWxsPjxzbWFsbD5SYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MmbmJzcDsmbmJzcDsgCi08aW1nIGJvcmRlcj0iMCIgYWx0PSIyMDAzLjA2LjE1IiBzcmM9Ii4uL2ltYWdlcy9ydXB2ZXJzaW9uLmdpZiI+Ci08L3NtYWxsPjwvc21hbGw+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotIAotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cC5qcGcgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdmNTM2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAxX2EuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwMV9hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5NjM4ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAxX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cF9wbGF0Zm9ybS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMGM3ODAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3N5bmNlZC5naWYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA5MzRiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxMmFiMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii01UlRLMUdPZkJtMmNjT2puMWluZnN3IiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEsX01LUG5rQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii01UlRLMUdPZkJtMmNjT2puMWluZnN3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUzOjE1LjgyOC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Q3VzdG9tIENhdGVnb3J5IEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjMzMDEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVnBoejY1WjFCOS1ySU1KS2pYN2gwQSIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItVnBoejY1WjFCOS1ySU1KS2pYN2gwQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxODowMjowNy4xNzItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q3VzdG9tIENhdGVnb3J5IEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkN1c3RvbSBDYXRlZ29yeSBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQ1MWEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWpxU3JiRlpZOUdiNGpwRGlZU1pjRlEiIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgZ3VpZD0iLWpxU3JiRlpZOUdiNGpwRGlZU1pjRlEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTg6MDE6MjYuODI4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5TdWItQ3VzdG9tIENhdGVnb3J5IEExLjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlZWJiOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3IiBuYW1lPSJkZWxQcm9jUGFrX0ExLjEsX3VxNUs4Uk0xRWRxcW5kaS1nRHV4cHciIGd1aWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Ij4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxQcm9jUGFrIEExLjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsUHJvY1BhayBBMS4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPkRlbFByb2NQYWsgQTEuMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5EZWxQcm9jUGFrIEExLjEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPkRlbFByb2NQYWsgQTEuMSBzdGFmZjwvaG93dG9TdGFmZj4KLSAgPGV4dGVybmFsSWQ+RGVsUHJvY1BhayBBMS4xIGV4dGVybklEPC9leHRlcm5hbElkPgotICA8c2NvcGU+RGVsUHJvY1BhayBBMS4xIHNjb3BlPC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+RGVsUHJvY1BhayBBMS4xIHVzYWdlPC91c2FnZU5vdGVzPgotICA8c2NhbGU+RGVsUHJvY1BhayBBMS4xIHNjYWxlPC9zY2FsZT4KLSAgPHByb2plY3RDaGFyYWN0ZXJpc3RpY3M+RGVsUHJvY1BhayBBMS4xIGNoYXI8L3Byb2plY3RDaGFyYWN0ZXJpc3RpY3M+Ci0gIDxyaXNrTGV2ZWw+RGVsUHJvY1BhayBBMS4xIHJpc2s8L3Jpc2tMZXZlbD4KLSAgPGVzdGltYXRpbmdUZWNobmlxdWU+RGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2VzdGltYXRpbmcgdGVjaCZsdDshLS1TdGFydEZyYWdtZW50LS0mZ3Q7Jmx0OyEtLUVuZEZyYWdtZW50LS0mZ3Q7PC9lc3RpbWF0aW5nVGVjaG5pcXVlPgotICA8cHJvamVjdE1lbWJlckV4cGVydGlzZT5EZWxQcm9jUGFrIEExLjEgZXhwZXJ0aXNlPC9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPgotICA8dHlwZU9mQ29udHJhY3Q+RGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2NvbnRyYWN0PC90eXBlT2ZDb250cmFjdD4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jUGFrX0ExLjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjIyOTEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il91dW4wWUJNMUVkcXFuZGktZ0R1eHB3IiBndWlkPSJfdXVuMFlCTTFFZHFxbmRpLWdEdXhwdyI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdXVuMFlSTTFFZHFxbmRpLWdEdXhwdyIgaWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHciIG5hbWU9ImRlbFByb2NQYWtfQTEuMSIgZ3VpZD0iX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHciPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgeG1pOmlkPSJfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBndWlkPSJfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvY1BhayBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxQcm9jUGFrIEExLjEgcHJlc2VudCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTYzdXNnUVdGalZfZ0htUVlNM1JVeXciIGhyZWY9InVtYTovLy02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Iy02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Ii8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQTEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5MDdjNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVThfTEd2TVNvZi1kYjI0YUZBTWI2dyIgbmFtZT0iRGVsUHJvYyBBMSxfVzZhNGNSQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iLVU4X0xHdk1Tb2YtZGIyNGFGQU1iNnciPgotICA8bWFpbkRlc2NyaXB0aW9uPkRlbFByb2MgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsUHJvYyBBMSBrZXkgY29uPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+RGVsUHJvYyBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5EZWxQcm9jIEExIGFsdGVybjwvYWx0ZXJuYXRpdmVzPgotICA8aG93dG9TdGFmZj5EZWxQcm9jIEExIHN0YWZmPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD5EZWxQcm9jIEExIGV4dGVybklEPC9leHRlcm5hbElkPgotICA8c2NvcGU+RGVsUHJvYyBBMSBzY29wZTwvc2NvcGU+Ci0gIDx1c2FnZU5vdGVzPkRlbFByb2MgQTEgdXNhZ2U8L3VzYWdlTm90ZXM+Ci0gIDxzY2FsZT5EZWxQcm9jIEExIHNjYWxlPC9zY2FsZT4KLSAgPHByb2plY3RDaGFyYWN0ZXJpc3RpY3M+RGVsUHJvYyBBMSBwcm9qIGNoYXI8L3Byb2plY3RDaGFyYWN0ZXJpc3RpY3M+Ci0gIDxyaXNrTGV2ZWw+RGVsUHJvYyBBMSByaXNrPC9yaXNrTGV2ZWw+Ci0gIDxlc3RpbWF0aW5nVGVjaG5pcXVlPkRlbFByb2MgQTEgZXN0IHRlY2g8L2VzdGltYXRpbmdUZWNobmlxdWU+Ci0gIDxwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPkRlbFByb2MgQTEgZXhwZXJ0aXNlPC9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPgotICA8dHlwZU9mQ29udHJhY3Q+RGVsUHJvYyBBMSBjb250eXBlPC90eXBlT2ZDb250cmFjdD4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4ZjFlYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9YVlk5TUJCTkVkcUJzN0toZFZMUkxBIiBndWlkPSJfWFZZOU1CQk5FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWFZpdU1CQk5FZHFCczdLaGRWTFJMQSIgaWQ9Ii1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9ImRlbFByb2NfQTEiIGd1aWQ9Il9XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3MiIHhtaTppZD0iX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9ImRlbFByb2NfQTEiIGd1aWQ9Il9XNmE0Y1JCTkVkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxQcm9jIEExIHByZXNlbnQiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3IiBocmVmPSJ1bWE6Ly8tVThfTEd2TVNvZi1kYjI0YUZBTWI2dyMtVThfTEd2TVNvZi1kYjI0YUZBTWI2dyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kaXNjaXBsaW5lZ3JvdXBpbmdzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTBiNzkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEsX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQyOjM3Ljc4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EaXNjaXBsaW5lIEdyb3VwaW5nIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2ZjZWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1HYUdsNWtISjR4S0NfU2hnNloxNlpnIiBuYW1lPSJkaXNjaXBsaW5lX0ExLF9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0yMlQxMDo0NTowMi45NjktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGlzY2lwbGluZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EaXNjaXBsaW5lIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWI0NThhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIgbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVEwbGlhNXlFeU5YV2QtS05KNmNHckEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NDQ6MTQuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRpc2NpcGxpbmUgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGlzY2lwbGluZSBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWY1Zjg1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciIG5hbWU9ImRvbWFpbl9BMSxfRkV6TzRBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTk6MTU6MzUuMDMxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERvbWFpbiBBMSBtYWluCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Eb21haW4gQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvZG9tYWluX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NTZiNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3IiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQ3OjI4Ljc2Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Eb21haW4gQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RG9tYWluIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL3N1Yl9kb21haW5fQTEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYmNhMGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIgbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNzo0Njo1My45MjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3ViLURvbWFpbiBBMS4xIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlN1Yi1Eb21haW4gQTEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZmI2YzkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW9XbzNVQ2lmWDRJY19WQklDV3dxUnciIG5hbWU9ImNoZWNrbGlzdF9BMSxfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLW9XbzNVQ2lmWDRJY19WQklDV3dxUnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzQuMTI1LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkNoZWNrbGlzdCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YzM0ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSjlVcjlzbXBRdXZWR3B1RzlpX3drUSIgbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItSjlVcjlzbXBRdXZWR3B1RzlpX3drUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozNi4yMTktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q2hlY2tsaXN0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxMjg3OC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIgbmFtZT0iY29uY2VwdF9BMSxfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTZ5N2FCUXQzY0NTQkxvOHNtTVJlbUEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzAuOTM4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIENvbmNlcHQgQTEgY29udGVudAotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtDb25jZXB0IEEyIHByZXNlbnQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHdpdGggdHlwZTomYW1wO25ic3A7Jmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmtXaXRoVHlwZSZxdW90OwotICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtDb25jZXB0OiBDb25jZXB0IEEyIHByZXNlbnQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHdpdGggdXNlciB0ZXh0OiZhbXA7bmJzcDsgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmtXaXRoVXNlclRleHQmcXVvdDsKLSAgICBocmVmPSZxdW90Oy4vLi4vLi4vLi4vUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIsX09WTFZjQS1URWRxTDJPMVBKVjljWkEuaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDk4ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MjQuNTc4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkNvbmNlcHQgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjY1MjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tLmlibS51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6Y29tLmlibS51bWE9Imh0dHA6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlIiB4bWk6aWQ9Ii02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIiBuYW1lPSJjb25jZXB0X0ExLF9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozMC45MzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q29uY2VwdCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L2NvbS5pYm0udW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvcmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MmU3YjAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2NDQxZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQTk0OXdIZFRGcUczV3M2My1xOUIydyIgbmFtZT0iZXhhbXBsZV9BMSxfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUE5NDl3SGRURnFHM1dzNjMtcTlCMnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzguOTY5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkV4YW1wbGUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0MTI0NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgbmFtZT0iZXhhbXBsZV9BMixfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NDEuMDE2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkV4YW1wbGUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmNlMDVmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjQzLjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5HdWlkZWxpbmUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NGE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NDUuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkd1aWRlbGluZSBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEuMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS4xLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxN2I1MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii05eFA0ZDdiYTZvc3dHa1BlcFhXa193IiBuYW1lPSJwcmFjdGljZV9BMS4xLF8tRlNVZ0EtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItOXhQNGQ3YmE2b3N3R2tQZXBYV2tfdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToyMC43MDMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQTEuMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxhZGRpdGlvbmFsSW5mbz5QcmFjdGljZSBBMS4xIGFkZDwvYWRkaXRpb25hbEluZm8+Ci0gIDxwcm9ibGVtPlByYWN0aWNlIEExLjEgcHJvYmxlbTwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQTEuMSBiYWNrPC9iYWNrZ3JvdW5kPgotICA8Z29hbHM+UHJhY3RpY2UgQTEuMSBnb2FsPC9nb2Fscz4KLSAgPGFwcGxpY2F0aW9uPlByYWN0aWNlIEExLjEgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQTEuMSBsZXZlbDwvbGV2ZWxzT2ZBZG9wdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTYzMzJiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTguMjk3LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlByYWN0aWNlIEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEExIGFkZDwvYWRkaXRpb25hbEluZm8+Ci0gIDxwcm9ibGVtPlByYWN0aWNlIEExIHByb2JsZW08L3Byb2JsZW0+Ci0gIDxiYWNrZ3JvdW5kPlByYWN0aWNlIEExIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBBMSBnb2FsPC9nb2Fscz4KLSAgPGFwcGxpY2F0aW9uPlByYWN0aWNlIEExIGFwcDwvYXBwbGljYXRpb24+Ci0gIDxsZXZlbHNPZkFkb3B0aW9uPlByYWN0aWNlIEExIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJkYmMzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVI5c1F6b0pqUW00LU5CeFVxYUxXTGciIG5hbWU9InByYWN0aWNlX0EyLjEsX0pyZ3d3QS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1SOXNRem9KalFtNC1OQnhVcWFMV0xnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjI1LjA5NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBBMi4xIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEEyLjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQTIuMSBwcm9ibGVtPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBBMi4xIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBBMi4xIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQTIuMSBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBBMi4xIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGQyZTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU5jU01UZmhNbHR0UFVLMkY2d1hnRWciIG5hbWU9InByYWN0aWNlX0EyLF9FcGZvWUEtVkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToyMy4wOTQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQTIgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQTIgcHJvYmxlbTwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQTIgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEEyIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQTIgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQTIgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmYwMTAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIG5hbWU9InJlcG9ydF9BMSxfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NTEuNDIyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJlcG9ydCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmM2ZmNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgbmFtZT0icmVwb3J0X0EyLF9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo1My45ODQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmVwb3J0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBmYzRhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyIgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0xaEhFT0w4cXl4VE1NUjc3NVVHZnJ3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjI3LjIxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5SZXVzYWJsZSBBc3NldCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjdjOTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTdnbEdZaUphczloWkdrSjljY1E1S1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MjkuNDIyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjY2NzguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteG9EWmFxcjdKLXdmMmxCN3JTalNadyIgbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXhvRFphcXI3Si13ZjJsQjdyU2pTWnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MDQuMDQ3LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvYWRtYXAgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODNkOWU5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUowc3p3cktiaUwySm0tRmlmUXRJOXciIG5hbWU9InJvYWRtYXBfQTIsX1l1a2dRQS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1KMHN6d3JLYmlMMkptLUZpZlF0STl3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjA2Ljg1OS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2FkbWFwIEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDViZjYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii00NkFKbEF2dDVCRFlmTDlfZy0yUjd3IiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExLF9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMTowMS4yODEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3VwcG9ydGluZyBNYXRlcmlhbCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJiNjBjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMixfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTd3NTNqRk96d3BOQmdlQ0RfQV92WWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MDMuNTE2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjNmY2OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1jOXNiOURpNE1ZbVItUm9vRmtQM2p3IiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NTYuNDg0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlbXBsYXRlIEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFmY2EzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWhMU09Xckc1YmlTWC1QQWtfM0JiOUEiIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItaExTT1dyRzViaVNYLVBBa18zQmI5QSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo1OC45NTMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGVtcGxhdGUgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwYjgzYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjEyLjE0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZXJtIERlZmluaXRpb24gQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Y5ZDA0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6NDIuNjU2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYWRjZDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyIgbmFtZT0idG9vbG1lbnRvcl9BMSxfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXA0eGtRbVB6RXFhblhuMWtTYldZQWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MDUuODI4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2xtZW50b3IgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTUwYzg4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXN4VnEtNWFhSWUzenQ1YUV1bjhGQ2ciIG5hbWU9InRvb2xtZW50b3JfQTIsX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjA4LjU5NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sbWVudG9yIEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNDZhZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItN1BaSExGU0tWTHNZT0FObjBnR3FJdyIgbmFtZT0id2hpdGVwYXBlcl9BMSxfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTMuMzU5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkYmFlMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItdEdERmloNVQxbHRWbk1aZWY4QTc2dyIgbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXRHREZpaDVUMWx0Vm5NWmVmOEE3NnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTUuNTc4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGIxZmNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzZsSzJBQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Il82bEsyQUEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfWFZZOU1CQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEjX1hWWTlNQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfY25XbUVCQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2NuV21FQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfdXVuMFlCTTFFZHFxbmRpLWdEdXhwdyIgaHJlZj0idW1hOi8vX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHcjX3V1bjBZQk0xRWRxcW5kaS1nRHV4cHciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNHljM3NUemdFZHE1eXNGT05yMUJHUSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzR5YzNzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfZEYyTzRFQXZFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2RGMk80RUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfWnpEWFFVREZFZHFPOU0zZnVrWUFfQSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX1p6RFhRVURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82bEsyQVEtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIHVyaT0icm9sZXMvcm9sZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83Tl93a0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciIHVyaT0icm9sZXMvcm9sZV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83T0k2Z0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHciIHVyaT0idGFza3MvdGFza19BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83N1M3Y0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLTEzcThKSkFhMGl4NnJETVpBcXd5MXciIHVyaT0idGFza3MvdGFza19BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FOEFSZ0EtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEiIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0Y3TFBnQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItSlRXS241ZDRDTGM0S0ZRTURURnBTUSIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSEVWM0FBLVJFZHFMMk8xUEpWOWNaQSIgaWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiB1cmk9Indvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JSW1KVUEtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEiIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0EyLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSkNITFFBLVJFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1BYlhSZzQ0TDhUeHg0Q2tCMmh4NU5RIiB1cmk9Indvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9LQnZjUUEtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIHVyaT0id29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0t3MHYwQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItM29keUJ5SWV6UlJYZ1FnZUh1TTZTQSIgdXJpPSJ3b3JrcHJvZHVjdHMvb3V0Y29tZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9GYlUxVUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIHVyaT0id29ya3Byb2R1Y3RzL291dGNvbWVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTkRlNWdBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1vV28zVUNpZlg0SWNfVkJJQ1d3cVJ3IiB1cmk9Imd1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9PQ055b0EtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTZ5N2FCUXQzY0NTQkxvOHNtTVJlbUEiIHVyaT0iZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT2tWb1FBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3IiB1cmk9Imd1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1A4MjZZQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyIgdXJpPSJndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUTVnSTBBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVFdSR01BLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1YUmVCTGRONGlMYnZhZmZCd2ViTkN3IiB1cmk9Imd1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9abFVDWUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTFoSEVPTDhxeXhUTU1SNzc1VUdmcnciIHVyaT0iZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2FHR2JRQS1TRWRxTDJPMVBKVjljWkEiIGlkPSIteG9EWmFxcjdKLXdmMmxCN3JTalNadyIgdXJpPSJndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9iRms3UUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3ciIHVyaT0iZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oSGhQa0EtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciIHVyaT0iZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oOHR5TUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLXA0eGtRbVB6RXFhblhuMWtTYldZQWciIHVyaT0iZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT1dOM1FBLVRFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03UFpITEZTS1ZMc1lPQU5uMGdHcUl3IiB1cmk9Imd1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2tzSXdZQS1URWRxTDJPMVBKVjljWkEiIGlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgdXJpPSJndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il91Ykp6WUEtVEVkcUwyTzFQSlY5Y1pBIiBpZD0iLUo5VXI5c21wUXV2VkdwdUc5aV93a1EiIHVyaT0iZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzZZN004QS1URWRxTDJPMVBKVjljWkEiIGlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgdXJpPSJndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HcnROTUEtVUVkcUwyTzFQSlY5Y1pBIiBpZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIHVyaT0iZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1F3eFlzQS1VRWRxTDJPMVBKVjljWkEiIGlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgdXJpPSJndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbVFKcllBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdG1TTGNBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03dzUzakZPendwTkJnZUNEX0FfdllnIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM1lTUkFBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiB1cmk9Imd1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0VxX2RNQS1WRWRxTDJPMVBKVjljWkEiIGlkPSItOXhQNGQ3YmE2b3N3R2tQZXBYV2tfdyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0ExLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRXJTWUlBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii10R0RGaWg1VDFsdFZuTVplZjhBNzZ3IiB1cmk9Imd1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1NOQ3M4QS1WRWRxTDJPMVBKVjljWkEiIGlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1NOTWQ4QS1WRWRxTDJPMVBKVjljWkEiIGlkPSItUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWXZLOU1BLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIiB1cmk9Imd1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9vSC02UUEtVkVkcUwyTzFQSlY5Y1pBIiBpZD0iLUowc3p3cktiaUwySm0tRmlmUXRJOXciIHVyaT0iZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcnlycVlBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii04QlBSSWdfU2JIVHdRQWlBWnk4M1B3IiB1cmk9Imd1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzJhVS1nQS1WRWRxTDJPMVBKVjljWkEiIGlkPSItTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSIgdXJpPSJndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9DNWRfd1EtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIHVyaT0iZGlzY2lwbGluZWdyb3VwaW5ncy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0QxWU9ZQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgdXJpPSJkaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0VaSkN3QS1XRWRxTDJPMVBKVjljWkEiIGlkPSItUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIgdXJpPSJkaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0ZxcEc0QS1XRWRxTDJPMVBKVjljWkEiIGlkPSItTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIgdXJpPSJkb21haW5zL2RvbWFpbl9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HT3RkUUEtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciIHVyaT0iZG9tYWlucy9kb21haW5fQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRzVCbGtBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1LRDcyRW81bE1NUHA3YlM4b1BCdlB3IiB1cmk9ImRvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0lHTnhjQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pZNnZjQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItY2xmREEwUE02eExJanloU3AxaUxRUSIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0tHendNQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIgdXJpPSJyb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0xoMng0QS1XRWRxTDJPMVBKVjljWkEiIGlkPSIteTA0d1BFMTAtU0I4aUZudTVjWGFNQSIgdXJpPSJ0b29scy90b29sX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX01LWXhnQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItenpCUC01NEd1UVdmVlR6NjBTZFFzdyIgdXJpPSJ0b29scy90b29sX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX09TbDBJQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItNVJUSzFHT2ZCbTJjY09qbjFpbmZzdyIgdXJpPSJjdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9UUXVpRUEtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLVZwaHo2NVoxQjktcklNSktqWDdoMEEiIHVyaT0iY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOVA4d1FCQktFZHFCczdLaGRWTFJMQSIgaWQ9Ii1qcVNyYkZaWTlHYjRqcERpWVNaY0ZRIiB1cmk9ImN1c3RvbWNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy11NE1ZQkJLRWRxQnM3S2hkVkxSTEEiIGlkPSItV0dhOU5RSi1iTTVVWjBKdVlfQUVQdyIgdXJpPSJyb2xlc2V0cy9yb2xlX3NldF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fWGFNQUJCS0VkcUJzN0toZFZMUkxBIiBpZD0iLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXciIHVyaT0icm9sZXNldHMvcm9sZV9zZXRfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVzYza1lCQk5FZHFCczdLaGRWTFJMQSIgaWQ9Il9XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIiB1cmk9ImRlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQTEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYUlmLUFCQk5FZHFCczdLaGRWTFJMQSIgaWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMGV4dGVuZGluZyUyMCdDUDElMjB3aXRoJTIwYWxsJTIwZWxlbWVudHMnL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3VzaUpzQk0xRWRxcW5kaS1nRHV4cHciIGlkPSJfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIgdXJpPSJkZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jUGFrX0ExLjEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNHRGUGdEemdFZHE1eXNGT05yMUJHUSIgaWQ9Il80c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUDElMjB3aXRoJTIwYWxsJTIwZWxlbWVudHMvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZER3a01FQXZFZHFGcUl1OC1ja29sZyIgaWQ9Il9kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMEExL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1p1YjlBRURGRWRxTzlNM2Z1a1lBX0EiIGlkPSJfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvQ1AyJTIwY29udGFpbmluZyUyMHZhcmlhYmlsaXR5JTIwZWxlbWVudHMvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd1dGZlVFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnIiB1cmk9InRhc2tzL3Rhc2tfQTMueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfX0NNdWNFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3IiB1cmk9InJvbGVzL3JvbGVfQTMueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iUGx1ZyBBIiBndWlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxJUS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il95VWVMSVEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSWctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfeVVlTElnLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSXctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJEb21haW5zIiBndWlkPSJfeVVlTEl3LVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEb21haW4iIHhtaTppZD0iX0ZFek80QS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRvbWFpbl9BMSIgZ3VpZD0iX0ZFek80QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiB3b3JrUHJvZHVjdHM9Il9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIgaHJlZj0idW1hOi8vLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUncjLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciLz4KLSAgICAgICAgICAgIDxzdWJkb21haW5zIHhtaTppZD0iX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9InN1Yl9kb21haW5fQTEuMSIgZ3VpZD0iX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yi1Eb21haW4gQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViLURvbWFpbiBBMS4xIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiB3b3JrUHJvZHVjdHM9Il9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1LRDcyRW81bE1NUHA3YlM4b1BCdlB3IiBocmVmPSJ1bWE6Ly8tS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyMtS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIvPgotICAgICAgICAgICAgPC9zdWJkb21haW5zPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RG9tYWluIiB4bWk6aWQ9Il9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkb21haW5fQTIiIGd1aWQ9Il9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgd29ya1Byb2R1Y3RzPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciIGhyZWY9InVtYTovLy0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3Iy0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxKQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfeVVlTEpBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEaXNjaXBsaW5lR3JvdXBpbmciIHhtaTppZD0iX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiIGd1aWQ9Il9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIGRpc2NpcGxpbmVzPSJfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIGhyZWY9InVtYTovLy1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIy1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEaXNjaXBsaW5lIiB4bWk6aWQ9Il9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkaXNjaXBsaW5lX0ExIiBndWlkPSJfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgdGFza3M9Il83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgaHJlZj0idW1hOi8vLUdhR2w1a0hKNHhLQ19TaGc2WjE2WmcjLUdhR2w1a0hKNHhLQ19TaGc2WjE2WmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmUiIHhtaTppZD0iX0R6dlBvQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRpc2NpcGxpbmVfQTIiIGd1aWQ9Il9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiB0YXNrcz0iXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1RMGxpYTV5RXlOWFdkLUtOSjZjR3JBIiBocmVmPSJ1bWE6Ly8tUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSMtUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSlEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX3lVZUxKUS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZVNldEdyb3VwaW5nIiB4bWk6aWQ9Il9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX3NldF9ncm91cGluZ19BMSIgZ3VpZD0iX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEdyb3VwaW5nIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBHcm91cGluZyBBMSBwcmVzZW50IiByb2xlU2V0cz0iXzlQcDFVQkJLRWRxQnM3S2hkVkxSTEEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIiBocmVmPSJ1bWE6Ly8tRlY5OUswVk03ZjRjbEFVa1lib0ZPUSMtRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZVNldCIgeG1pOmlkPSJfOVBwMVVCQktFZHFCczdLaGRWTFJMQSIgbmFtZT0icm9sZV9zZXRfQTEiIGd1aWQ9Il85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHJvbGVzPSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVdHYTlOUUotYk01VVowSnVZX0FFUHciIGhyZWY9InVtYTovLy1XR2E5TlFKLWJNNVVaMEp1WV9BRVB3Iy1XR2E5TlFKLWJNNVVaMEp1WV9BRVB3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0IiB4bWk6aWQ9Il8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBuYW1lPSJyb2xlX3NldF9BMiIgZ3VpZD0iXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcm9sZXM9Il82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTFJHbGVISXBOczVNYjlRQU9HZlpRdyIgaHJlZj0idW1hOi8vLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXcjLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTEpnLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il95VWVMSmctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0VHlwZSIgeG1pOmlkPSJfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEiIGd1aWQ9Il9IZ2hEWUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHdvcmtQcm9kdWN0cz0iXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEgX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEgX0lJU25VQS1SRWRxTDJPMVBKVjljWkEgX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIiBocmVmPSJ1bWE6Ly8tVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyMtVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3RUeXBlIiB4bWk6aWQ9Il9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMiIgZ3VpZD0iX0lGblVnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgd29ya1Byb2R1Y3RzPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWNsZkRBMFBNNnhMSWp5aFNwMWlMUVEiIGhyZWY9InVtYTovLy1jbGZEQTBQTTZ4TElqeWhTcDFpTFFRIy1jbGZEQTBQTTZ4TElqeWhTcDFpTFFRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxKdy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlRvb2xzIiBndWlkPSJfeVVlTEp3LVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUb29sIiB4bWk6aWQ9Il9LeGJhZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0b29sX0ExIiBndWlkPSJfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteTA0d1BFMTAtU0I4aUZudTVjWGFNQSIgaHJlZj0idW1hOi8vLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEjLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2wiIHhtaTppZD0iX0xoYUY4QS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xfQTIiIGd1aWQ9Il9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3IiBocmVmPSJ1bWE6Ly8tenpCUC01NEd1UVdmVlR6NjBTZFFzdyMtenpCUC01NEd1UVdmVlR6NjBTZFFzdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMS0EtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il95VWVMS0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMS1EtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfeVVlTEtRLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il95VWVMS3ctUEVkcUwyTzFQSlY5Y1pBIiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfTUtQbmtBLVdFZHFMMk8xUEpWOWNaQSBfT1NTU0lBLVdFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEiIGd1aWQ9Il9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNVJUSzFHT2ZCbTJjY09qbjFpbmZzdyIgaHJlZj0idW1hOi8vLTVSVEsxR09mQm0yY2NPam4xaW5mc3cjLTVSVEsxR09mQm0yY2NPam4xaW5mc3ciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiBocmVmPSIjXzdkWFlVQkJLRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIGhyZWY9IiNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgaHJlZj0iI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0iI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0iI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSIjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNUemdFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgaHJlZj0idW1hOi8vX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHcjX3VxNUs4Uk0xRWRxcW5kaS1nRHV4cHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTIiIGd1aWQ9Il9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSBfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSBfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVZwaHo2NVoxQjktcklNSktqWDdoMEEiIGhyZWY9InVtYTovLy1WcGh6NjVaMUI5LXJJTUpLalg3aDBBIy1WcGh6NjVaMUI5LXJJTUpLalg3aDBBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIiBndWlkPSJfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iXzU1emswQS1QRWRxTDJPMVBKVjljWkEgX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1qcVNyYkZaWTlHYjRqcERpWVNaY0ZRIiBocmVmPSJ1bWE6Ly8tanFTcmJGWlk5R2I0anBEaVlTWmNGUSMtanFTcmJGWlk5R2I0anBEaVlTWmNGUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTExBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il95VWVMTEEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3ppX3p3QS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV9BMSIgZ3VpZD0iX3ppX3p3QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNvblBhayBBMSBicmllZiI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX0ExIiBndWlkPSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHJlc3BvbnNpYmxlRm9yPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSBfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIGhyZWY9InVtYTovLy1nN205OEpsOGFSYlY2bmZPR1VwR25nIy1nN205OEpsOGFSYlY2bmZPR1VwR25nIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVzcG9uc2libGVGb3I9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSHhrY1ZpSHU1N2JER3VsNDIxckJ2ZyIgaHJlZj0idW1hOi8vLUh4a2NWaUh1NTdiREd1bDQyMXJCdmcjLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIHhtaTppZD0iXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9InRhc2tfQTEiIGd1aWQ9Il83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExICIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHBlcmZvcm1lZEJ5PSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIgbWFuZGF0b3J5SW5wdXQ9Il9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIF85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBvdXRwdXQ9Il9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIG9wdGlvbmFsSW5wdXQ9Il9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3IiBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyMtUzFpZ0xTaTZBSV92bHV6V09DdTZUdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0idGFza19BMiIgZ3VpZD0iXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgKCBleHRlbmRlZCBieSBUYXNrIEEzICkiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBwZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIG1hbmRhdG9yeUlucHV0PSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgb3V0cHV0PSJfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBvcHRpb25hbElucHV0PSJfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyIgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjLTEzcThKSkFhMGl4NnJETVpBcXd5MXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiB4bWk6aWQ9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEiIGhyZWY9InVtYTovLy1uOVRKUWEwRkp2R19hdkRYYUFUaklRIy1uOVRKUWEwRkp2R19hdkRYYUFUaklRIi8+Ci0gICAgICAgICAgICA8Y29udGFpbmVkQXJ0aWZhY3RzIHhtaTppZD0iX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiBocmVmPSJ1bWE6Ly8tOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSMtOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSIvPgotICAgICAgICAgICAgPC9jb250YWluZWRBcnRpZmFjdHM+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgeG1pOmlkPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSBfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1NNYzNFQS1WRWRxTDJPMVBKVjljWkEiIHJlcG9ydHM9Il9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIiB0ZW1wbGF0ZXM9Il9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIiBocmVmPSJ1bWE6Ly8tSlRXS241ZDRDTGM0S0ZRTURURnBTUSMtSlRXS241ZDRDTGM0S0ZRTURURnBTUSIvPgotICAgICAgICAgICAgPGNvbnRhaW5lZEFydGlmYWN0cyB4bWk6aWQ9Il9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJhcnRpZmFjdF9BMi4xIiBndWlkPSJfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIuMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSIgaHJlZj0idW1hOi8vLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEjLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkQXJ0aWZhY3RzPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIHhtaTppZD0iX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBndWlkPSJfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIiBkZWxpdmVyZWRXb3JrUHJvZHVjdHM9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIF9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQWJYUmc0NEw4VHh4NENrQjJoeDVOUSIgaHJlZj0idW1hOi8vLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEjLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiB4bWk6aWQ9Il9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgZ3VpZD0iX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSIgZGVsaXZlcmVkV29ya1Byb2R1Y3RzPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIGhyZWY9InVtYTovLy1NZHFvYS1ueHdFSGZBSmNvQTZYTktRIy1NZHFvYS1ueHdFSGZBSmNvQTZYTktRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTNvZHlCeUllelJSWGdRZ2VIdU02U0EiIGhyZWY9InVtYTovLy0zb2R5QnlJZXpSUlhnUWdlSHVNNlNBIy0zb2R5QnlJZXpSUlhnUWdlSHVNNlNBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIGhyZWY9InVtYTovLy00R2JBV0diODdBbHotR3pfR185cDFnIy00R2JBV0diODdBbHotR3pfR185cDFnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDaGVja2xpc3QiIHhtaTppZD0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9ImNoZWNrbGlzdF9BMSIgZ3VpZD0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1vV28zVUNpZlg0SWNfVkJJQ1d3cVJ3IiBocmVmPSJ1bWE6Ly8tb1dvM1VDaWZYNEljX1ZCSUNXd3FSdyMtb1dvM1VDaWZYNEljX1ZCSUNXd3FSdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29uY2VwdCIgeG1pOmlkPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0iY29uY2VwdF9BMSIgZ3VpZD0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNvbmNlcHQgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkNvbmNlcHQgQTEgcHJlc2VudCIgc2hhcGVpY29uPSJmaWxlOi9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy90cmFuLWx1dS9JQk0vTWV0aG9kTGlicmFyaWVzL3BhcmlzL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIiBocmVmPSJ1bWE6Ly8tNnk3YUJRdDNjQ1NCTG84c21NUmVtQSMtNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RXhhbXBsZSIgeG1pOmlkPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZXhhbXBsZV9BMSIgZ3VpZD0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUE5NDl3SGRURnFHM1dzNjMtcTlCMnciIGhyZWY9InVtYTovLy1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3Iy1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkZWxpbmUiIHhtaTppZD0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9Imd1aWRlbGluZV9BMSIgZ3VpZD0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBocmVmPSJ1bWE6Ly8tXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyMtXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2UiIHhtaTppZD0iX1A4allZQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InByYWN0aWNlX0ExIiBndWlkPSJfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEExIHByZXNlbnQiIGNvbnRlbnRSZWZlcmVuY2VzPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfTUtQbmtBLVdFZHFMMk8xUEpWOWNaQSBfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSBfRkV6TzRBLVdFZHFMMk8xUEpWOWNaQSBfOVBwMVVCQktFZHFCczdLaGRWTFJMQSBfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSBfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSBfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSBfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSBfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSBfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSBfRXBmb1lBLVZFZHFMMk8xUEpWOWNaQSBfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSBfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSBfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSBfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSBfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSBfN004bnNBLVBFZHFMMk8xUEpWOWNaQSBfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSBfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSBfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSBfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSBfN2RYWVVCQktFZHFCczdLaGRWTFJMQSBfQ0NWamNBLVdFZHFMMk8xUEpWOWNaQSBfR09aN1FBLVdFZHFMMk8xUEpWOWNaQSBfSlluMGdBLVdFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiIGhyZWY9InVtYTovLy1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIy1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIi8+Ci0gICAgICAgICAgICA8c3ViUHJhY3RpY2VzIHhtaTppZD0iXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InByYWN0aWNlX0ExLjEiIGd1aWQ9Il8tRlNVZ0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBBMS4xIHByZXNlbnQiPgotICAgICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTl4UDRkN2JhNm9zd0drUGVwWFdrX3ciIGhyZWY9InVtYTovLy05eFA0ZDdiYTZvc3dHa1BlcFhXa193Iy05eFA0ZDdiYTZvc3dHa1BlcFhXa193Ii8+Ci0gICAgICAgICAgICA8L3N1YlByYWN0aWNlcz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJlcG9ydCIgeG1pOmlkPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0icmVwb3J0X0ExIiBndWlkPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIGhyZWY9InVtYTovLy1YUmVCTGRONGlMYnZhZmZCd2ViTkN3Iy1YUmVCTGRONGlMYnZhZmZCd2ViTkN3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXVzYWJsZUFzc2V0IiB4bWk6aWQ9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMSIgZ3VpZD0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyIgaHJlZj0idW1hOi8vLTFoSEVPTDhxeXhUTU1SNzc1VUdmcncjLTFoSEVPTDhxeXhUTU1SNzc1VUdmcnciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvYWRtYXAiIHhtaTppZD0iX1prMzlnQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InJvYWRtYXBfQTEiIGd1aWQ9Il9aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii14b0RaYXFyN0otd2YybEI3clNqU1p3IiBocmVmPSJ1bWE6Ly8teG9EWmFxcjdKLXdmMmxCN3JTalNadyMteG9EWmFxcjdKLXdmMmxCN3JTalNadyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6U3VwcG9ydGluZ01hdGVyaWFsIiB4bWk6aWQ9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExIiBndWlkPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyIgaHJlZj0idW1hOi8vLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3cjLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlbXBsYXRlIiB4bWk6aWQ9Il9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0ZW1wbGF0ZV9BMSIgZ3VpZD0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItYzlzYjlEaTRNWW1SLVJvb0ZrUDNqdyIgaHJlZj0idW1hOi8vLWM5c2I5RGk0TVltUi1Sb29Ga1AzancjLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xtZW50b3JfQTEiIGd1aWQ9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1wNHhrUW1QekVxYW5YbjFrU2JXWUFnIiBocmVmPSJ1bWE6Ly8tcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyMtcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0id2hpdGVwYXBlcl9BMSIgZ3VpZD0iX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXciIGhyZWY9InVtYTovLy03UFpITEZTS1ZMc1lPQU5uMGdHcUl3Iy03UFpITEZTS1ZMc1lPQU5uMGdHcUl3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb25jZXB0IiB4bWk6aWQ9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjb25jZXB0X0EyIiBndWlkPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgaHJlZj0idW1hOi8vLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWcjLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNoZWNrbGlzdCIgeG1pOmlkPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgbmFtZT0iY2hlY2tsaXN0X0EyIiBndWlkPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUo5VXI5c21wUXV2VkdwdUc5aV93a1EiIGhyZWY9InVtYTovLy1KOVVyOXNtcFF1dlZHcHVHOWlfd2tRIy1KOVVyOXNtcFF1dlZHcHVHOWlfd2tRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpFeGFtcGxlIiB4bWk6aWQ9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJleGFtcGxlX0EyIiBndWlkPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgaHJlZj0idW1hOi8vLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmcjLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRlbGluZSIgeG1pOmlkPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZ3VpZGVsaW5lX0EyIiBndWlkPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIGhyZWY9InVtYTovLy1QY1p0dFYtc2MtRWNVUXdCLVpoQUl3Iy1QY1p0dFYtc2MtRWNVUXdCLVpoQUl3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXBvcnQiIHhtaTppZD0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InJlcG9ydF9BMiIgZ3VpZD0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii01TG5kbWR4eGJHMU0xTWZwQVBLcEFRIiBocmVmPSJ1bWE6Ly8tNUxuZG1keHhiRzFNMU1mcEFQS3BBUSMtNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InRlbXBsYXRlX0EyIiBndWlkPSJfWlhxOUVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIiBocmVmPSJ1bWE6Ly8taExTT1dyRzViaVNYLVBBa18zQmI5QSMtaExTT1dyRzViaVNYLVBBa18zQmI5QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6U3VwcG9ydGluZ01hdGVyaWFsIiB4bWk6aWQ9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBndWlkPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyIgaHJlZj0idW1hOi8vLTd3NTNqRk96d3BOQmdlQ0RfQV92WWcjLTd3NTNqRk96d3BOQmdlQ0RfQV92WWciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xtZW50b3JfQTIiIGd1aWQ9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiBocmVmPSJ1bWE6Ly8tc3hWcS01YWFJZTN6dDVhRXVuOEZDZyMtc3hWcS01YWFJZTN6dDVhRXVuOEZDZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgbmFtZT0id2hpdGVwYXBlcl9BMiIgZ3VpZD0iXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXRHREZpaDVUMWx0Vm5NWmVmOEE3NnciIGhyZWY9InVtYTovLy10R0RGaWg1VDFsdFZuTVplZjhBNzZ3Iy10R0RGaWg1VDFsdFZuTVplZjhBNzZ3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZSIgeG1pOmlkPSJfRXBmb1lBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icHJhY3RpY2VfQTIiIGd1aWQ9Il9FcGZvWUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTIgcHJlc2VudCIgY29udGVudFJlZmVyZW5jZXM9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIF82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIF9QOGpZWUEtU0VkcUwyTzFQSlY5Y1pBIF9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIF9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIF82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIF9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIF9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgaHJlZj0idW1hOi8vLU5jU01UZmhNbHR0UFVLMkY2d1hnRWcjLU5jU01UZmhNbHR0UFVLMkY2d1hnRWciLz4KLSAgICAgICAgICAgIDxzdWJQcmFjdGljZXMgeG1pOmlkPSJfSnJnd3dBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icHJhY3RpY2VfQTIuMSIgZ3VpZD0iX0pyZ3d3QS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCI+Ci0gICAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyIgaHJlZj0idW1hOi8vLVI5c1F6b0pqUW00LU5CeFVxYUxXTGcjLVI5c1F6b0pqUW00LU5CeFVxYUxXTGciLz4KLSAgICAgICAgICAgIDwvc3ViUHJhY3RpY2VzPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmV1c2FibGVBc3NldCIgeG1pOmlkPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icmV1c2FibGVfYXNzZXRfQTIiIGd1aWQ9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTdnbEdZaUphczloWkdrSjljY1E1S1EiIGhyZWY9InVtYTovLy03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIy03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2FkbWFwIiB4bWk6aWQ9Il9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2FkbWFwX0EyIiBndWlkPSJfWXVrZ1FBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSjBzendyS2JpTDJKbS1GaWZRdEk5dyIgaHJlZj0idW1hOi8vLUowc3p3cktiaUwySm0tRmlmUXRJOXcjLUowc3p3cktiaUwySm0tRmlmUXRJOXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlcm1EZWZpbml0aW9uIiB4bWk6aWQ9Il9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTIiIGd1aWQ9Il9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIGhyZWY9InVtYTovLy04QlBSSWdfU2JIVHdRQWlBWnk4M1B3Iy04QlBSSWdfU2JIVHdRQWlBWnk4M1B3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUZXJtRGVmaW5pdGlvbiIgeG1pOmlkPSJfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0idGVybV9kZWZpbml0aW9uX0ExIiBndWlkPSJfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBocmVmPSJ1bWE6Ly8tTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSMtTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0idGFza19BMyIgZ3VpZD0iX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiBUYXNrIEEzIiBvcmRlcmluZ0d1aWRlPSImbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtBU0NJSSZxdW90Oz8mZ3Q7ICZsdDtjb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsOk9yZGVySW5mb0NvbGxlY3Rpb24geG1pOnZlcnNpb249JnF1b3Q7Mi4wJnF1b3Q7IHhtbG5zOnhtaT0mcXVvdDtodHRwOi8vd3d3Lm9tZy5vcmcvWE1JJnF1b3Q7IHhtbG5zOmNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw9JnF1b3Q7aHR0cDovLy9jb20vaWJtL3VtYS9lZGl0L3RuZy91dGlsL21vZGVsLmVjb3JlJnF1b3Q7Jmd0OyAgICZsdDtvcmRlckluZm9zIG5hbWU9JnF1b3Q7c2VjdGlvbnMmcXVvdDsgdGltZXN0YW1wPSZxdW90OzExMjk3NDcyNjQxMDkmcXVvdDsmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3JDV3dVRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190aTJCWUJCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdW15Z1lFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RrN3NFQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O192eDVCa0VEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgJmx0Oy9vcmRlckluZm9zJmd0OyAmbHQ7L2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiZndDsgIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEzIGV4dGVuZHMgVGFzayBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PSJfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgcGVyZm9ybWVkQnk9Il84Wk42QUVERkVkcU85TTNmdWtZQV9BIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnIiBocmVmPSJ1bWE6Ly8tYlI5VFgxYlo2VzlSWTVJdklQR1VqZyMtYlI5VFgxYlo2VzlSWTVJdklQR1VqZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgeG1pOmlkPSJfOFpONkFFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0icm9sZV9BMyIgZ3VpZD0iXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3IiBocmVmPSJ1bWE6Ly8tWXVtZHNVT0hGVmhHa2V3d0lDTmRndyMtWXVtZHNVT0hGVmhHa2V3d0lDTmRndyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfeVVlTExRLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfeVVlTExRLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjYXBQYXRQYWtfQTEiIGd1aWQ9Il9UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il80c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNEemdFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19adFpiTUVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfYUhVU1FCQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfZEJodmtFQXZFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfeVVlTExnLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il95VWVMTGctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiIGhyZWY9InVtYTovL19XNmE0Y0JCTkVkcUJzN0toZFZMUkxBI19XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfalVOZm9CQk5FZHFCczdLaGRWTFJMQSIgbmFtZT0iZGVsUHJvY1BhayBBMSIgZ3VpZD0iX2pVTmZvQkJORWRxQnM3S2hkVkxSTEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il91cTVLOEJNMUVkcXFuZGktZ0R1eHB3IiBocmVmPSJ1bWE6Ly9fdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyNfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il95VWVMTHctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX3lVZUxMdy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4Zjk4Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIG5hbWU9InJvbGVfQTEsXzU1emswQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1nN205OEpsOGFSYlY2bmZPR1VwR25nIiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE4VDE2OjA0OjEwLjYwOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEExIHNraWxsczwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+Um9sZSBBMSBhc3NpZ248L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+Um9sZSBBMSBzeW48L3N5bm9ueW1zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExNTFjYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1IeGtjVmlIdTU3YkRHdWw0MjFyQnZnIiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE5VDEwOjMyOjM1LjQyMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEEyIHNraWxsczwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+Um9sZSBBMiBhc3NpZ248L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+Um9sZSBBMiBzeW48L3N5bm9ueW1zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EzLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EzLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2NjMwNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMy54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVl1bWRzVU9IRlZoR2tld3dJQ05kZ3ciIG5hbWU9Im5ld19yb2xlLF84Wk42QUVERkVkcU85TTNmdWtZQV9BIiBndWlkPSItWXVtZHNVT0hGVmhHa2V3d0lDTmRndyIgY2hhbmdlRGF0ZT0iMjAwNS0xMC0xOVQxMDoyOTo1OS40NTMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+bWFpbjogUm9sZSBBMzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OiBSb2xlIEEzPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5za2lsbHM6IFJvbGUgQTM8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPmFzc2lnbm1lbnQ6IFJvbGUgQTM8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+c3lub255bW5zIDogUm9sZSBBMzwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmUwOTFjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIgbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQTEsX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQ5OjMxLjY0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBHcm91cGluZyBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBHcm91cGluZyBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXNldHMvcm9sZV9zZXRfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWIxYTk0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVdHYTlOUUotYk01VVowSnVZX0FFUHciIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBndWlkPSItV0dhOU5RSi1iTTVVWjBKdVlfQUVQdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0yMlQxMDo0NzoyMy4yNTAtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Um9sZSBTZXQgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBTZXQgQTExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDVmMzMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTFJHbGVISXBOczVNYjlRQU9HZlpRdyIgbmFtZT0icm9sZV9zZXRfQTIsXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIGd1aWQ9Ii1MUkdsZUhJcE5zNU1iOVFBT0dmWlF3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUwOjQwLjMyOC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMTlhNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdGFza3MvdGFza19BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3IiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItUzFpZ0xTaTZBSV92bHV6V09DdTZUdyIgY2hhbmdlRGF0ZT0iMjAwNS0xMC0xOVQxMDoyODozOS40MjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGFzayBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il90dkY0TUJCUEVkcUJzN0toZFZMUkxBIiBuYW1lPSJTdGVwIEExLjEiIGd1aWQ9Il90dkY0TUJCUEVkcUJzN0toZFZMUkxBIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPmFscGhhPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il90emtJZ0JCUEVkcUJzN0toZFZMUkxBIiBuYW1lPSJTdGVwIEExLjIiIGd1aWQ9Il90emtJZ0JCUEVkcUJzN0toZFZMUkxBIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPmJldGE8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiIG5hbWU9IlN0ZXAgQTEuMyIgZ3VpZD0iX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Z2FtbWE8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+VGFzayBBMSBwdXJwb3NlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQTEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmQ3YjcxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTEzcThKSkFhMGl4NnJETVpBcXd5MXciIG5hbWU9InRhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3IiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE5VDEwOjI5OjIyLjU0Ny0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UYXNrIEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiIG5hbWU9IlN0ZXAgQTIuMSIgZ3VpZD0iX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcHV0IHlvdXIgcmlnaHQgZm9vdCBpbgotJmx0Oy9wJmd0Ozwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIgbmFtZT0iU3RlcCBBMi4yIiBndWlkPSJfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5wdXQgeW91ciByaWdodCBmb290IG91dDwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIgbmFtZT0iU3RlcCBBMi4zIiBndWlkPSJfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5EbyB0aGUgaG9rZXktcG9rZXk8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+VGFzayBBMiBwdXJwb3NlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQTIgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTMueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTMueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNhZjNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0EzLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamciIG5hbWU9Iixfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamciIGNoYW5nZURhdGU9IjIwMDUtMTAtMTlUMTA6Mjc6NDMuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPm1haW46IFRhc2sgQTM8L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3JDV3dVRURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9IlN0ZXAgQTMuMSIgZ3VpZD0iX3JDV3dVRURQRWRxcmhzWmgzUU5BTVEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+U3RlcCBBMy4xPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il91bXlnWUVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJTdGVwIEEzLjIiIGd1aWQ9Il91bXlnWUVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPlN0ZXAgQTMuMjwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdng1QmtFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iU3RlcCBBMy4zIiBndWlkPSJfdng1QmtFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5TdGVwIEEzLjM8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPmtleXM6IFRhc2sgQTM8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5wdXJwb3NlOiBUYXNrIEEzPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPmFsdGVybmF0aXZlczogVGFzayBBMzwvYWx0ZXJuYXRpdmVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MjcwMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEiIG5hbWU9InRvb2xfQTEsX0t4YmFnQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii15MDR3UEUxMC1TQjhpRm51NWNYYU1BIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUyOjA3LjIwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRvb2wgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzNiZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rvb2xzL3Rvb2xfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3IiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItenpCUC01NEd1UVdmVlR6NjBTZFFzdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNzo1MjozNC41NzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VG9vbCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Ub29sIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMDBiYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1uOVRKUWEwRkp2R19hdkRYYUFUaklRIiBuYW1lPSJhcnRpZmFjdF9BMSB4LF85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItbjlUSlFhMEZKdkdfYXZEWGFBVGpJUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wN1QxNDo1Mjo0NC45ODQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+QXJ0aWZhY3QgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+QXJ0aWZhY3QgQTEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBBMSBwdXJwb3NlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+QXJ0aWZhY3QgQTEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkFydGlmYWN0IEExIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+QXJ0aWZhY3QgQTEgYnJpZWY8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5BcnRpZmFjdCBBMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTkxZjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1VRlJvZUFLSGRYWDJTU0IxS1VYdFlBIiBuYW1lPSJhcnRpZmFjdF9BMi4xLF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xN1QxOTo0NDowNy43ODEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQTIuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5BcnRpZmFjdCBBMi4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPkFydGlmYWN0IEEyLjEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBBMi4xIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMi4xIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBBMi4xIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+QXJ0aWZhY3QgQTIuMSBicmllZjwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPkFydGlmYWN0IEEyLjEgcmVwPC9yZXByZXNlbnRhdGlvbk9wdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOWIzYWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSlRXS241ZDRDTGM0S0ZRTURURnBTUSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE3VDE5OjQxOjI0LjM5MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5BcnRpZmFjdCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5BcnRpZmFjdCBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5BcnRpZmFjdCBBMiB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkFydGlmYWN0IEEyIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+QXJ0aWZhY3QgQTIgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5BcnRpZmFjdCBBMiBicmllZjwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPkFydGlmYWN0IEEyIHJlcDwvcmVwcmVzZW50YXRpb25PcHRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDYyYTI1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEiIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItQWJYUmc0NEw4VHh4NENrQjJoeDVOUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDoyOTo1OS4zOTEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQTEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEExIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBBMSByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBBMSBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBBMSBwa2c8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY0N2UzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItTWRxb2Etbnh3RUhmQUpjb0E2WE5LUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDoxNS4xNzItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQTIgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBBMiBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEEyJmFtcDtuYnNwO2ltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBBMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBBMiBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBBMiBwa2c8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YjQ2MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItM29keUJ5SWV6UlJYZ1FnZUh1TTZTQSIgbmFtZT0ib3V0Y29tZV9BMSxfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTNvZHlCeUllelJSWGdRZ2VIdU02U0EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MTguMTg4LTA3MDAiIGNoYW5nZURlc2NyaXB0aW9uPSIgT3V0Y29tZSBBMSAiPgotICA8bWFpbkRlc2NyaXB0aW9uPk91dGNvbWUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+T3V0Y29tZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5PdXRjb21lIEExIHVuaXF1ZTwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+T3V0Y29tZSBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPk91dGNvbWUgQTEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPk91dGNvbWUgQTEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvb3V0Y29tZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjFlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIG5hbWU9Im91dGNvbWVfQTIsX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii00R2JBV0diODdBbHotR3pfR185cDFnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjIxLjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5PdXRjb21lIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPk91dGNvbWUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+T3V0Y29tZSBBMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPk91dGNvbWUgQTEgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5PdXRjb21lIEExIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5PdXRjb21lIEExIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvc3ViX2FydGlmYWN0X0ExLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmE1YzQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE4OjA0OjE5LjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5TdWJfQXJ0aWZhY3QgQTEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5TdWJfQXJ0aWZhY3QgQTEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5TdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMS4xIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBBMS4xIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+U3ViX0FydGlmYWN0IEExLjEgYnJpZWY8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5TdWJfQXJ0aWZhY3QgQTEuMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjdjOGYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEsX0hnaERZQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE4OjAyOjQ0LjEyNS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Xb3JrIFByb2R1Y3QgVHlwZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Xb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1NDc2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWNsZkRBMFBNNnhMSWp5aFNwMWlMUVEiIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItY2xmREEwUE02eExJanloU3AxaUxRUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxODowMzoxNi4zNDQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+V29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+V29yayBQcm9kdWN0IFR5cGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzZTA4NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii13eWJIS1VkbFhiREZHMEhPUGhBSjZRIiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iLXd5YkhLVWRsWGJERkcwSE9QaEFKNlEiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzU1NjlmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4wL25vdGF0aW9uIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljX1JvT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW9rQTVFZHFGcUl1OC1ja29sZyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNfUm9leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNfUm9PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgQjEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWNfUm91eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0ljX1JvLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY19ScE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPHVtbDpBY3Rpdml0eSB4bWk6aWQ9Il9JZV9jd094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3QxIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSWVfY3dleDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJ1bWFfZWxlbWVudCI+Ci0gICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0llX2N3dXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWVfY3cteDRFZHUyT282cS1uSFdnZyIga2V5PSJ0eXBlIiB2YWx1ZT0iQWN0aXZpdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfSWdKVFVPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBBMSBwcmVzZW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9JZ1Zna094NEVkdTJPbzZxLW5IV2dnIiBzb3VyY2U9InVtYV9lbGVtZW50Ij4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JZ1Zna2V4NEVkdTJPbzZxLW5IV2dnIiBrZXk9InVyaSIgdmFsdWU9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWdWZ2t1eDRFZHUyT282cS1uSFdnZyIga2V5PSJ0eXBlIiB2YWx1ZT0iVGFzayIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9ub2RlPgotICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9JaDNLa3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEIxIHByZXNuZXQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0loM0trLXg0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0idW1hX2VsZW1lbnQiPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tsT3g0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JaDNLbGV4NEVkdTJPbzZxLW5IV2dnIiBrZXk9InR5cGUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L25vZGU+Ci0gICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIHhtaTppZD0iX0loM0tuLXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgcHJlc2VudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSWgzS29PeDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJ1bWFfZWxlbWVudCI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWgzS29leDRFZHUyT282cS1uSFdnZyIga2V5PSJ1cmkiIHZhbHVlPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tvdXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idHlwZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvbm9kZT4KLSAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfSWgzS3JPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBBMiAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0loM0tyZXg0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0idW1hX2VsZW1lbnQiPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tydXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JaDNLci14NEVkdTJPbzZxLW5IV2dnIiBrZXk9InR5cGUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L25vZGU+Ci0gIDwvdW1sOkFjdGl2aXR5PgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JZlJ3b094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBRCIgZWxlbWVudD0iX0llX2N3T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdDEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWhrMnNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwOSIgZWxlbWVudD0iX0lnSlRVT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaHhEOE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0trT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWhrMnNleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaGsyc3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0loazJzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWhrMnRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWgzS2tleDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0tsdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDkiIGVsZW1lbnQ9Il9JaDNLa3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS25PeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDNLbmV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0loM0tsLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWgzS21PeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaDNLbWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0loM0ttdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0loM0tudXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDNLby14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDA5IiBlbGVtZW50PSJfSWgzS24teDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0txZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS3F1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaDNLcE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0loM0twZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWgzS3B1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaDNLcC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaDNLcS14NEVkdTJPbzZxLW5IV2dnIiB4PSIxMjkiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0tzT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDkiIGVsZW1lbnQ9Il9JaDNLck94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWg5Uk1PeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDlSTWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0loM0tzZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWgzS3N1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaDNLcy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0loM0t0T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0loOVJNdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JZlJ3b2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWZSd291eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lmUndvLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lpVnIwT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIwZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JaVZyMHV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjAteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnIxdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVNVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjFPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjJleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIxZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjF1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjAteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyMS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjJPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lua0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyMmV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjFPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjJ1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZazBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JaVZyM094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JaVZyM2V4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjRPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBCMSBwcmVzbmV0Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyM3V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyNHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjMteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyNE94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyM2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI0ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZblVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjR1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnIzdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI0LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWlWcjVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbDBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjV1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI2ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjUteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjYteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnI2T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjZleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyNnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnI2LXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JaVZyNS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyN094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbGtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjdleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0lpVnI3dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQTIgIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbVVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjcteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI4dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQTIgIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyOE94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyOU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjhleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyOHV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyNy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI4LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjlPeDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI4T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI5ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lpVnI5dXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lpVnIwT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdDEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWci11eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lpVnIwZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZyLS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnJfT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWcl9leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZyX3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzQU94NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0FleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIxZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzQXV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNBLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0JPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzQmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzQi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0NPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIyZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzQ2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNDdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0MteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzRE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzRHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0QteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lpVnIyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzRU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNFZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0V1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzRmV4NEVkdTJPbzZxLW5IV2dnIiB4PSIyMCIgeT0iODgiIHdpZHRoPSIxOTYiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0Z1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIzLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzRi14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNHT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0dleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzR3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzSE94NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjEiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaVZzSGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpVnNIdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWc0gteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaVZzSU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpVnNJZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlVT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMTYxIiB3aWR0aD0iNzMiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lpYnlVZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JaVZyNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWlieVV1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaWJ5VS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lpYnlWT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWlieVZleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWlieVYteDRFZHUyT282cS1uSFdnZyIgeD0iMjAiIHk9IjQwMCIgd2lkdGg9IjE5NiIgaGVpZ2h0PSI1MyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5V094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjZPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlXZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieVd1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5Vy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnlYT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlYdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMzEzIiB3aWR0aD0iNzMiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlieVgteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnI2LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaWJ5WU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpYnlZZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlieVl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaWJ5WS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaWJ5WmV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjQ3MyIgd2lkdGg9IjczIiBoZWlnaHQ9IjExMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5WnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWlWcjdleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlaLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWFPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5YWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnlhdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnliT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5YmV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjhleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlidXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWIteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5Y094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnljZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnljLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5ZE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjlPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlkZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5ZC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnllT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlldXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JaVZyOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWlWci1PeDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnItZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSB4bWk6aWQ9Il9JalN0OE94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDhleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDh1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbUVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDgteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiB0eXBlPSIzIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OU94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1luVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OXV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHR5cGU9IjMiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3Q5LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3QtT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWxFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3QtZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgdHlwZT0iMyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbGtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdC11eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdC0teDRFZHUyT282cS1uSFdnZyIgbmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbTBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdF9PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiB0eXBlPSIzIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lqWTBrT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IldQREQiIGVsZW1lbnQ9Il9JalN0OE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3QxIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqZTdNT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjBPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCMGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqZTdNZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWplN011eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JamU3TS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqZTdOT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqbEIwdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCMC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdDh1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEIyZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjJ1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JamxCMU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqbEIxZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpsQjF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JamxCMS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JamxCMi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q4LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCNHV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEI0LXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpsQjNleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JamxCM3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqbEIzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpsQjRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpsQjVPeDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEI1ZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJY2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqbEI1dXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpsQjUteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JamxCNk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqbEI2ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqckljdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJYy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdDlleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqckllZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWV1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanJJZE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqcklkZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpySWR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanJJZC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanJJZS14NEVkdTJPbzZxLW5IV2dnIiB4PSIxNDIiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklmT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OXV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWd1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJZy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqcklmZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpySWZ1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanJJZi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqcklnT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqckloT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjI5MSIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWhleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q5LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJaS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklqT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpySWh1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanJJaC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqcklpT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpySWlleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpySWpleDRFZHUyT282cS1uSFdnZyIgeD0iNDMwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJanV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdC1PeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklsT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWxleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanJJai14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqcklrT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpySWtleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanJJa3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanJJbHV4NEVkdTJPbzZxLW5IV2dnIiB4PSI1NjIiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklsLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0LWV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySW5leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJbnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqckltT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpySW1leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanJJbXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqckltLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqeFBFT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjcxMSIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3QtdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQRi14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBHT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWp4UEV1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanhQRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqeFBGT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWp4UEZleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWp4UEdleDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBHdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0LS14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UElPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQSWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqeFBHLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWp4UEhPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanhQSGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqeFBIdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqeFBJdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQSS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdF9PeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBLZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEt1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanhQSk94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqeFBKZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWp4UEp1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanhQSi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanhQSy14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWpZMGtleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lqWTBrdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9Jalkway14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDQ3MGIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfNTl3Q3dFQTVFZHFGcUl1OC1ja29sZyIgZ3VpZD0iXzU5d0N3RUE1RWRxRnFJdTgtY2tvbGciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzU5d0N3VUE1RWRxRnFJdTgtY2tvbGciIGlkPSItd3liSEtVZGxYYkRGRzBIT1BoQUo2USIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il81NnhuUUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJDUCBCMSIgZ3VpZD0iXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81NjdZUUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJBY3QxIiBndWlkPSJfNTY3WVFFQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJBY3QxIiBndWlkPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WW9rQTVFZHFGcUl1OC1ja29sZyIgYnJlYWtkb3duRWxlbWVudHM9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIF81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIF81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIF81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIF81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIF81NjdZazBBNUVkcUZxSXU4LWNrb2xnIF81NjdZbDBBNUVkcUZxSXU4LWNrb2xnIF81NjdZblVBNUVkcUZxSXU4LWNrb2xnIF81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbFVBNUVkcUZxSXU4LWNrb2xnIF81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIF81NjdZUWtBNUVkcUZxSXU4LWNrb2xnIF81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIF81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIF81NjdZUmtBNUVkcUZxSXU4LWNrb2xnIF81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIF81NjdZajBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0ExIiBndWlkPSJfNTY3WVNVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyBfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I191Q0JiUUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQTEiIGd1aWQ9Il81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiByZXNwb25zaWJsZUZvcj0iXzU2N1lua0E1RWRxRnFJdTgtY2tvbGcgXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lua0E1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgZ3VpZD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfNTY3WVFVQTVFZHFGcUl1OC1ja29sZyBfNTY3WWtrQTVFZHFGcUl1OC1ja29sZyBfNTY3WW5FQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1luRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfNTY3WW5FQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZa2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iXzU2N1lra0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVFVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iXzU2N1lRVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0IxIiBndWlkPSJfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMSBwcmVzbmV0IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WWswQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19YVTZMVUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UNThqc0I4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UOFZKVUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQjEiIGd1aWQ9Il81NjdZazBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIHJlc3BvbnNpYmxlRm9yPSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyBfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il81NjdZbDBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il81NjdZblVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0IxIiBndWlkPSJfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il81NjdZUzBBNUVkcUZxSXU4LWNrb2xnIF81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWkhmMllCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMSIgZ3VpZD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVMwQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il81NjdZUzBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lURUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjEiIGd1aWQ9Il81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19CMiIgZ3VpZD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il81NjdZazBBNUVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfb3FZc3dCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfcXVRcEFCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfcXl1NVVCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il81NjdZUWtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBndWlkPSJfNTY3WWxFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il81NjdZa1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbWtBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWxrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMiIgZ3VpZD0iXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW1rQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il81NjdZbWtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lrVUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il81NjdZa1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19BMiIgZ3VpZD0iXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WWtFQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1ltMEE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190bmRib0JCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGd1aWQ9Il81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iXzU2N1lSVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZajBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZU2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iXzU2N1lSVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfcmF4RkFFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JheEZBRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfcmJOSjRFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JiTko0RUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9yYk5KNFVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMC4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfcmJOSjRrQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JiTko0a0E2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfcmJOSjQwQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3JiTko1RUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9yYk5KNUVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfcmJOSjVVQTZFZHFGcUl1OC1ja29sZyIgeD0iMTI5LjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9yYk5KNWtBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmJOSjVrQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9yYk5KNTBBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9yYXhGQVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmF4RkFVQTZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJXb3JrZmxvdyIgZWxlbWVudD0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfc0FkekVFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekVVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6RWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekUwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkekZFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpGVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6RlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkekZrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpGMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6RjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpHRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6R1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekdVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpHa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6RzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekcwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6SEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekhVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpIVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6SGtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekgwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpIMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkeklFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpJVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6SVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkeklrQTZFZHFGcUl1OC1ja29sZyIgeD0iMTAuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpJMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6STBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpKRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6SlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekpVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpKa0E2RWRxRnFJdTgtY2tvbGciIHg9IjE0Mi4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekowQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpKMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkektFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpLVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6S1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkektrQTZFZHFGcUl1OC1ja29sZyIgeD0iMjkxLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6SzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekswQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6TEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekxVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpMVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6TGtBNkVkcUZxSXU4LWNrb2xnIiB4PSI0MzAuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpMMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6TDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpNRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6TVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek1VQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpNa0E2RWRxRnFJdTgtY2tvbGciIHg9IjU2Mi4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0Fkek0wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpNMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0Fkek5FQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpOVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6TlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0Fkek5rQTZFZHFGcUl1OC1ja29sZyIgeD0iNzExLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6TjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek4wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6T0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0Fkek9VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpPVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6T2tBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0Fkek8wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpPMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkelBFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpQVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UFVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkelBrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpQMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpRRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6UVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelFVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpRa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6UTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelEwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6UkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6UlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelJVQTZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSIgZWxlbWVudD0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfdTM1VE1FQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VE1VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUTWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VE0wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VE5FQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVROVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUTlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VE5rQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVROMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUTjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRPRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUT1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE9VQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRPa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUTzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE8wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUUEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFBVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRQVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUUGtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFAwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRQMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFFFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRRVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUUVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFFrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRRMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUUTBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRSRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUUlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFJVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRSa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUUjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFIwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUU0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFNVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRTVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUU2tBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFMwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRTMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFRFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRUVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVFVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFRrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRUMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRVRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUVVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFVVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRVa0E2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9Ijg4LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUVTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFUwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUVkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRWVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFZrQTZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iNDAwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUVjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFYwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUV0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRXVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUV1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFdrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRXMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRYRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUWFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFhVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRYa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUWDBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFgwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUWUVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFlVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRZVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUWWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFkwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRZMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbFVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFpFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRaVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUWlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFprQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRaMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUWjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRhRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUYVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGFVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRha0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUYTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGEwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUYkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VGJVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRiVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUYmtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGIwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRiMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGNFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRjVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUY1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGNrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRjMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUYzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWxrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRkRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUZFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGRVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRka0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUZDBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGQwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUZUVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VGVVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRlVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUZWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGUwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRlMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGZFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRmVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGZrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRmMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRnRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUZ1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGdVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRna0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUZzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGcwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUaEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTRWX0lFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9JRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il91NFZfSVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0lVQTZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3U0Vl9Ja0E2RWRxRnFJdTgtY2tvbGciIHg9IjEzMC4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfdTRmd0tVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndLVUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3U0ZndLRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3U0ZndLRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3S0VBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il91NGZ3S1VBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTRWX0kwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9JMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTRWX0pFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0Vl9KVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NFZfSlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRWX0prQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9Ka0E2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NFZfSjBBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMTYxLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91NFZfS0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0tFQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91NFZfS1VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0Vl9La0E2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NFZfS2tBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRWX0swQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9LMEE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NGZ3SUVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMzEzLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfdTRmd0swQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndLMEE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3U0ZndLa0E2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3U0ZndLa0E2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3S2tBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il91NGZ3SzBBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTRmd0lVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndJVUE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTRmd0lrQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0ZndJMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3STBBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRmd0pFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndKRUE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NGZ3SlVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iNDczLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91NGZ3SmtBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRmd0prQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91NGZ3SjBBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGhVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRoVUE2RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPGRpYWdyYW1zIHhtaTppZD0iXzU2eG5RVUE1RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il81NnhuUVVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iXzU2eG5Ra0E1RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il81NnhuUWtBNUVkcUZxSXU4LWNrb2xnIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iXzU2N1lva0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L2RpYWdyYW1zPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il81NjdZb2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJDUCBCMSIgZ3VpZD0iXzU2N1lva0E1RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbk5hbWU9IkNQIEIxIiBicmVha2Rvd25FbGVtZW50cz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii13eWJIS1VkbFhiREZHMEhPUGhBSjZRIiBocmVmPSJ1bWE6Ly8td3liSEtVZGxYYkRGRzBIT1BoQUo2USMtd3liSEtVZGxYYkRGRzBIT1BoQUo2USIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDczMjk5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIG5hbWU9ImNhcFBhdF9CMS4xLF9JUGRaNFI4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItb0V1T2RlV0pjdEdmVE5ZVXo4MlpuZyIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEuMS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2YTYzMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0lUQ1NVQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9JVENTVUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JVENTVVI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxLjEiIGd1aWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSVBkWjRSODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxLjEiIGd1aWQ9Il9JUGRaNFI4MUVkcWdCSVR1SUNMSkV3IiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEuMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIGhyZWY9InVtYTovLy1vRXVPZGVXSmN0R2ZUTllVejgyWm5nIy1vRXVPZGVXSmN0R2ZUTllVejgyWm5nIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4Y2FjOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWDgzSzFvOWJzcGxOZTFfYV9LVTJGUSIgbmFtZT0iY2FwUGF0X0IxLF9FNkV5Y1I4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItWDgzSzFvOWJzcGxOZTFfYV9LVTJGUSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkyODc1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0U4bWlBQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9FOG1pQUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FOHdUQUI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLVg4M0sxbzlic3BsTmUxX2FfS1UyRlEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxIiBndWlkPSJfRTZFeWNCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0U2RXljUjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImNhcFBhdF9CMSIgZ3VpZD0iX0U2RXljUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImNhcFBhdF9CMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVg4M0sxbzlic3BsTmUxX2FfS1UyRlEiIGhyZWY9InVtYTovLy1YODNLMW85YnNwbE5lMV9hX0tVMkZRIy1YODNLMW85YnNwbE5lMV9hX0tVMkZRIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRlYTNhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWXpjS2FUM0dZWlhSa1kzWk1yX21SZyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLjEsX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjE0OjQ0LjA3OC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQjEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DdXN0b20gQ2F0ZWdvcnkgQjEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJkZTM1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSxfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDU6NDAuNjQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkN1c3RvbSBDYXRlZ29yeSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DdXN0b20gQ2F0ZWdvcnkgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxZjJhNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQjIsXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjA2OjEyLjgxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Q3VzdG9tIENhdGVnb3J5IEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ODQzMzUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIiBuYW1lPSJkZWxQcm9jX0IxLjEsX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS4xL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDY5MWEzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfVjNMTXdCODFFZHFnQklUdUlDTEpFdyIgZ3VpZD0iX1YzTE13QjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1YzTE13UjgxRWRxZ0JJVHVJQ0xKRXciIGlkPSItVkxBWFZocUVZMnRVNzBFU1padjdGZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9WMFY3TUI4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkZWxQcm9jX0IxLjEiIGd1aWQ9Il9WMFY3TUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3MiIHhtaTppZD0iX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRlbFByb2NfQjEuMSIgZ3VpZD0iX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEuMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVZMQVhWaHFFWTJ0VTcwRVNaWnY3RmciIGhyZWY9InVtYTovLy1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIy1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyNjE2ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3IiBuYW1lPSJkZWxQcm9jX0IxLF9SZnh1c1I4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTcwZGZjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX1JpS1VVQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9SaUtVVUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SaUtVVVI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLWNkUkNDQ0YxMVZoN1JJSWVKX2tmNHciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY19CMSIgZ3VpZD0iX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgeG1pOmlkPSJfUmZ4dXNSODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY19CMSIgZ3VpZD0iX1JmeHVzUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3IiBocmVmPSJ1bWE6Ly8tY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyMtY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kaXNjaXBsaW5lZ3JvdXBpbmdzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2MyYTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTZydm0zdXZ6cUkweThoLTFQdlZmN0EiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQjEsX1NaTXhZQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii02cnZtM3V2enFJMHk4aC0xUHZWZjdBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjAwOjE5LjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EaXNjaXBsaW5lIEdyb3VwaW5nIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjY2OTUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIiBuYW1lPSJkaXNjaXBsaW5lX0IxLF9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSItRmVmSm1hQk1VblBGTFpoOUZTdV85ZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzowMDo1Ny43MTktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGlzY2lwbGluZSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EaXNjaXBsaW5lIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA0YzE5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaEU1TlZQek1CY2Z2WFZPNHVsbzFyQSIgbmFtZT0iZGlzY2lwbGluZV9CMixfaDlmbHNCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDE6MzQuMjUwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERpc2NpcGxpbmUgQjIgbWFpbgotJmx0Oy9wJmd0OzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGlzY2lwbGluZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTk3NDhiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIG5hbWU9ImRvbWFpbl9CMSxfbWRyellCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDI6MDQuNzgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRvbWFpbiBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Eb21haW4gQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RvbWFpbnMvZG9tYWluX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYWYxZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiBuYW1lPSJkb21haW5fQjIsX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjAyOjM3Ljc1MC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Eb21haW4gQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RG9tYWluIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxMWU2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgbmFtZT0iY2hlY2tsaXN0X0IxLF91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyNzoyMi42NTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q2hlY2tsaXN0IEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTEzYmQyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1XN3dESFZlSVFFRFA1OWU5RDQxS3V3IiBuYW1lPSJjaGVja2xpc3RfQjIsX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1XN3dESFZlSVFFRFA1OWU5RDQxS3V3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjI4OjA0LjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DaGVja2xpc3QgQjIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzcyZDVlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEiIG5hbWU9ImNvbmNlcHRfQjEsX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1uLUhXWmlLZlhxOVJSUktlRk9CMFVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjE2OjAxLjczNC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Db25jZXB0IEIxIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1YmZmNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii02THBPZ2ljV1NodzJDZEJoVlpIcTB3IiBuYW1lPSJjb25jZXB0X0IyLF94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoxNjoyNy44MTItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q29uY2VwdCBCMiBjb250ZXh0PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDk4MDQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEiIG5hbWU9ImV4YW1wbGVfQjEsX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1iRC0yaUVHUmhkTDd1aGs5VmdZMWlRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjI4OjM3LjU3OC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5FeGFtcGxlIEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTM0YmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU9ka1FON2d5VXpkYi1sVjVLSFFzOUEiIG5hbWU9Im5ld19leGFtcGxlX0IyLF96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyOToxOC4wOTQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RXhhbXBsZSBCMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjAyNWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIG5hbWU9Imd1aWRlbGluZV9CMSxfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6Mzc6NTUuMTg4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkd1aWRlbGluZSBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhZWJmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgbmFtZT0iZ3VpZGVsaW5lX0IyLF8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0Njo1NC40MzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+R3VpZGVsaW5lIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjJkZmY4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciIG5hbWU9InByYWN0aWNlX0IxLjEsXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1nVnZCMFB4Uks3NU14b09kbTkzMF93IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQzOjQ4LjE3Mi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBCMS4xIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEIxLjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQjEuMSBwcm9iPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBCMS4xIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBCMS4xIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQjEuMSBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBCMS4xIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZDY2ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEiIG5hbWU9InByYWN0aWNlX0IxLF8xSS1uVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSIteU5zS3d3UDhCWmZzMTJQYlpBNUFlUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0MjowMC4wNDctMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQjEgcHJvYjwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQjEgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEIxIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQjEgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQjEgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwYTAyMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSIgbmFtZT0icHJhY3RpY2VfQjIsXzRpMWZFQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQwOjUwLjczNC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBCMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxhZGRpdGlvbmFsSW5mbz5QcmFjdGljZSBCMiBhZGQ8L2FkZGl0aW9uYWxJbmZvPgotICA8cHJvYmxlbT5QcmFjdGljZSBCMiBwcm9iPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBCMiBiYWNrPC9iYWNrZ3JvdW5kPgotICA8Z29hbHM+UHJhY3RpY2UgQjIgZ29hbDwvZ29hbHM+Ci0gIDxhcHBsaWNhdGlvbj5QcmFjdGljZSZhbXA7bmJzcDsgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQjIgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNmNhZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIG5hbWU9InJlcG9ydF9CMSxfNWtqYXdCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6Mzg6MzguMzkxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJlcG9ydCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ4M2MzYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgbmFtZT0icmVwb3J0X0IyLF82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjozOTowNy42NTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmVwb3J0IEIyIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA0NTMyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZV9wQkczZDkwOU5CME92bmZRb0o5QSIgbmFtZT0icmV1c2FibGVfYXNzZXRfQjEsXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1lX3BCRzNkOTA5TkIwT3ZuZlFvSjlBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQ2OjE5LjI1MC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5SZXVzYWJsZSBBc3NldCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGQzMmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0wYTIzZy1hUWhjWnJUSDdwMnJ0eUFRIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9CMixfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTBhMjNnLWFRaGNaclRIN3AycnR5QVEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDA6MDAuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJldXNhYmxlIEFzc2V0IEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDBhMzYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZWFKWnJXZUZWYzRQRU1BOUt2MTBEQSIgbmFtZT0icm9hZG1hcF9CMSxfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWVhSlpyV2VGVmM0UEVNQTlLdjEwREEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MzY6MDIuODEyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvYWRtYXAgQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTNiY2QzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciIG5hbWU9InJvYWRtYXBfQjIsXy1nd1BBQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii0zblE1SmdQSUUxSm16UW1USVpoS3RnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjM1OjM1LjcxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2FkbWFwIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjEyZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxLF9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItSkZpanktRTl2blo1UUpaSlQxQUEyQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0NTozMS4yMzQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3VwcG9ydGluZyBNYXRlcmlhbCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlkZTMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMixfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWlsYk5PYXE2MzV2SkdlYjZ1aENQVEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDQ6NTIuMTcyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgQ29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3Jlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy9yZXNvdXJjZXMvVGVtcGxhdGUgZm9yIFBhc3RlIFRlc3QgQ2FzZXMuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE5MDcyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3Jlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDcwYTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZWE2ZHczQmpfTmZwblRmbDBoXzdIQSIgbmFtZT0idGVtcGxhdGVfQjEsX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjM2OjUxLjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZW1wbGF0ZSBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4ZTMxMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiBuYW1lPSJ0ZW1wbGF0ZV9CMixfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLVRHaWpma0thbDQ4ZzA2cXRqSFZISmciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjQ6NTQuNjQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlbXBsYXRlIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGF0dGFjaG1lbnRzPnJlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2M8L2F0dGFjaG1lbnRzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3N2ZmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEsX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjIzOjU1LjQ4NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZXJtIERlZmluaXRpb24gQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJlNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXBTU3h0TU5QNWlzeG9tMUdlOVRCM2ciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMixfR0VTNDhCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLXBTU3h0TU5QNWlzeG9tMUdlOVRCM2ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjM6MTAuMzU5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRlcm0gRGVmaW5pdGlvbiBCMiBjb250ZW50Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNmRlZjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIgbmFtZT0idG9vbG1lbnRvcl9CMSxfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjA6MzQuNTMxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2xtZW50b3IgQjEgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDZhZDZiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUJ2bkFmR1hEaWJjSk00ZF83cVdYUVEiIG5hbWU9InRvb2xtZW50b3JfQjIsX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjE5OjQ0LjIwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sbWVudG9yIEIyIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwZjkzNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNkNkbTRTOEJBNFVfVmE1TlVvWFlzdyIgbmFtZT0id2hpdGVwYXBlcl9CMSxfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTZDZG00UzhCQTRVX1ZhNU5Vb1hZc3ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MTk6MDcuMjgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQjEgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MTYxNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItakk3Tm53R0ZEUy16SlctamtxSmRNQSIgbmFtZT0id2hpdGVwYXBlcl9CMixfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWpJN05ud0dGRFMtekpXLWprcUpkTUEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MTg6MzYuODkxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQjIgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIzM2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0pSNnhzQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Il9KUjZ4c0I4UEVkcXNoTU5TSTA3WE9nIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfRThtaUFCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX0U2RXljQjgxRWRxZ0JJVHVJQ0xKRXcjX0U4bWlBQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfSVRDU1VCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX0lQZFo0QjgxRWRxZ0JJVHVJQ0xKRXcjX0lUQ1NVQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfUmlLVVVCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JpS1VVQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfVjNMTXdCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YzTE13QjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNTl3Q3dFQTVFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU5d0N3RUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9KUjZ4c1I4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiIHVyaT0icm9sZXMvcm9sZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SWGNIVUI4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUZpZGVEMDFwVURVWE1YRXNWcnMzR1EiIHVyaT0icm9sZXMvcm9sZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9YV0dlSUI4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLWxZanI2Vml0TDFWbm5GTk83OFh1WXciIHVyaT0idGFza3MvdGFza19CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9aTWtRZ0I4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciIHVyaT0idGFza3MvdGFza19CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fTFhFZ1I4bUVkcTFPby1Eb3dkcEJnIiBpZD0iLS11Z2l2ejExTDZMYmpPdnY1M3JfVGciIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0tIdUVZQjhuRWRxMU9vLURvd2RwQmciIGlkPSItTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYUlVYU1COG5FZHExT28tRG93ZHBCZyIgaWQ9Ii1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIiB1cmk9Indvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9iV1o5OEI4bkVkcTFPby1Eb3dkcEJnIiBpZD0iLUhOWExIMUhnZG43MldYRzc3QUhHWkEiIHVyaT0id29ya3Byb2R1Y3RzL291dGNvbWVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbnNVS3NCOG5FZHExT28tRG93ZHBCZyIgaWQ9Ii15YlRQdVZPNFJHd25fd1FsdkFXYWF3IiB1cmk9Indvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1ZrNDEwQjhvRWRxMU9vLURvd2RwQmciIGlkPSItS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIgdXJpPSJ3b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd0Z4ek1COHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1HYWktMHZDbnFCMFdnS2NrMWJtbnB3IiB1cmk9Imd1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il93N0hmd0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciIHVyaT0iZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hvSHZzQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSIgdXJpPSJndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il95UlpXTUI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTZMcE9naWNXU2h3MkNkQmhWWkhxMHciIHVyaT0iZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJZb3NCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1iRC0yaUVHUmhkTDd1aGs5VmdZMWlRIiB1cmk9Imd1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3psY1lBQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIgdXJpPSJndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8wUkdrSUI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIHVyaT0iZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzFKbEVRQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgdXJpPSJndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNGs3SndCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNGxFNndCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1nVnZCMFB4Uks3NU14b09kbTkzMF93IiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81bGN5b0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLUR4bE10dktpdVZIdS1rdFoyVTJaVEEiIHVyaT0iZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82UG5KOEI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIHVyaT0iZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzY4S3Q4QjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgdXJpPSJndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfN3h6OGdCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1lX3BCRzNkOTA5TkIwT3ZuZlFvSjlBIiB1cmk9Imd1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il84aUdKOEI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTBhMjNnLWFRaGNaclRIN3AycnR5QVEiIHVyaT0iZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzlHYzBNQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItZWFKWnJXZUZWYzRQRU1BOUt2MTBEQSIgdXJpPSJndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fYjZQc0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciIHVyaT0iZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQlBpd2dCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQ19KczhCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRF9yVjBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRXFjS0VCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfR0ZDZjBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiB1cmk9Imd1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0dwR1BJQjhzRWRxUXZPalg4ZG9DQ3ciIGlkPSItcFNTeHRNTlA1aXN4b20xR2U5VEIzZyIgdXJpPSJndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9INVJka0I4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiIHVyaT0iZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSXdzMDBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiB1cmk9Imd1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0plbWNvQjhzRWRxUXZPalg4ZG9DQ3ciIGlkPSItNkNkbTRTOEJBNFVfVmE1TlVvWFlzdyIgdXJpPSJndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9laWFOb0I4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLWpJN05ud0dGRFMtekpXLWprcUpkTUEiIHVyaT0iZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfY1o5RW9COHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii02cnZtM3V2enFJMHk4aC0xUHZWZjdBIiB1cmk9ImRpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oLUdDb0I4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLUZlZkptYUJNVW5QRkxaaDlGU3VfOWciIHVyaT0iZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9tZC11VUI4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIHVyaT0iZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9yYmhtWUI4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIHVyaT0iZG9tYWlucy9kb21haW5fQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdnVtbElCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiB1cmk9ImRvbWFpbnMvZG9tYWluX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3lDM0d3Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItZmg4WG85SUlxMkZaeURkcDFlaWRvZyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3piT240Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzBONWE4Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItZnZzeVg2NVpzZUsyeDhCTmJMYnBsUSIgdXJpPSJyb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzB1WVIwQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItWWxqRVlHQjRmUENFNUx2VDREYVB0QSIgdXJpPSJ0b29scy90b29sX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNGTEtFQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItM18tQWF6enNfbDQzSE9PRzhEQXNZdyIgdXJpPSJ0b29scy90b29sX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNzZzI0Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItV1BxaHhVcHg0dUc2V3lyNVVqZm9pZyIgdXJpPSJjdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80dFZhc0I4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLThYZlBtdDU1SE5CVlV5X2ZXU3ZONVEiIHVyaT0iY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZEhVUEFCODBFZHFnQklUdUlDTEpFdyIgaWQ9Ii1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIiB1cmk9ImN1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRTY5alFCODFFZHFnQklUdUlDTEpFdyIgaWQ9Il9FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3IiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSVFOQXdCODFFZHFnQklUdUlDTEpFdyIgaWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3IiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEuMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SZ2hWa0I4MUVkcWdCSVR1SUNMSkV3IiBpZD0iX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciIHVyaT0iZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9WMHluSUI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciIHVyaT0iZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS4xL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzBadXpVQjg1RWRxTnZlbHliRFhaRlEiIGlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgdXJpPSJyb2xlc2V0cy9yb2xlX3NldF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82UURHY0I4NUVkcU52ZWx5YkRYWkZRIiBpZD0iLWtIdTNINGVfOElrREUxSWFieTVxZ3ciIHVyaT0icm9sZXNldHMvcm9sZV9zZXRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNTltNDBFQTVFZHFGcUl1OC1ja29sZyIgaWQ9Il81NnhuUUVBNUVkcUZxSXU4LWNrb2xnIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMEIxL21vZGVsLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IlBsdWcgQiIgZ3VpZD0iX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHciIGJyaWVmRGVzY3JpcHRpb249IlBsdWcgQiBicmllZiIgYXV0aG9ycz0iUGx1ZyBCIGFydGh1ciI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1d1JNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDb250ZW50IiBndWlkPSJfZWN5NXdSTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXdoTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX2VjeTV3aE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXd4TTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX2VjeTV3eE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RG9tYWluIiB4bWk6aWQ9Il9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkb21haW5fQjEiIGd1aWQ9Il9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgd29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIGhyZWY9InVtYTovLy1rRmpreG9nSjRqQU96LWdXUVBzcUxBIy1rRmpreG9nSjRqQU96LWdXUVBzcUxBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEb21haW4iIHhtaTppZD0iX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRvbWFpbl9CMiIgZ3VpZD0iX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiB3b3JrUHJvZHVjdHM9Il9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVWphVm8zb3lsTHRtT2JXMWUyNXR0dyIgaHJlZj0idW1hOi8vLVVqYVZvM295bEx0bU9iVzFlMjV0dHcjLVVqYVZvM295bEx0bU9iVzFlMjV0dHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXhCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9lY3k1eEJNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmVHcm91cGluZyIgeG1pOmlkPSJfU1pNeFlCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGlzY2lwbGluZV9ncm91cGluZ19CMSIgZ3VpZD0iX1NaTXhZQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgcHJlc2VudCIgZGlzY2lwbGluZXM9Il9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNnJ2bTN1dnpxSTB5OGgtMVB2VmY3QSIgaHJlZj0idW1hOi8vLTZydm0zdXZ6cUkweThoLTFQdlZmN0EjLTZydm0zdXZ6cUkweThoLTFQdlZmN0EiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmUiIHhtaTppZD0iX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRpc2NpcGxpbmVfQjEiIGd1aWQ9Il9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiB0YXNrcz0iX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIiBocmVmPSJ1bWE6Ly8tRmVmSm1hQk1VblBGTFpoOUZTdV85ZyMtRmVmSm1hQk1VblBGTFpoOUZTdV85ZyIvPgotICAgICAgICAgICAgPHJlZmVyZW5jZVdvcmtmbG93cyBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNSODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGlzY2lwbGluZSIgeG1pOmlkPSJfaDlmbHNCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGlzY2lwbGluZV9CMiIgZ3VpZD0iX2g5ZmxzQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHRhc2tzPSJfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIGhyZWY9InVtYTovLy1oRTVOVlB6TUJjZnZYVk80dWxvMXJBIy1oRTVOVlB6TUJjZnZYVk80dWxvMXJBIi8+Ci0gICAgICAgICAgICA8cmVmZXJlbmNlV29ya2Zsb3dzIGhyZWY9InVtYTovL19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3I19JUGRaNFI4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VjeTV4Uk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfZWN5NXhSTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0R3JvdXBpbmciIHhtaTppZD0iX3phVlFBQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxIiBndWlkPSJfemFWUUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEdyb3VwaW5nIEIxIHByZXNlbnQiIHJvbGVTZXRzPSJfdVBBV2NCODVFZHFOdmVseWJEWFpGUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEiIGhyZWY9InVtYTovLy1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIy1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0IiB4bWk6aWQ9Il91UEFXY0I4NUVkcU52ZWx5YkRYWkZRIiBuYW1lPSJyb2xlX3NldF9CMSIgZ3VpZD0iX3VQQVdjQjg1RWRxTnZlbHliRFhaRlEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcm9sZXM9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgaHJlZj0idW1hOi8vLU5Md1pwVmU0M0EzcEV2MUwwbm13bUEjLU5Md1pwVmU0M0EzcEV2MUwwbm13bUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVTZXQiIHhtaTppZD0iXzBZX01jQjg1RWRxTnZlbHliRFhaRlEiIG5hbWU9InJvbGVfc2V0X0IyIiBndWlkPSJfMFlfTWNCODVFZHFOdmVseWJEWFpGUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByb2xlcz0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1rSHUzSDRlXzhJa0RFMUlhYnk1cWd3IiBocmVmPSJ1bWE6Ly8ta0h1M0g0ZV84SWtERTFJYWJ5NXFndyMta0h1M0g0ZV84SWtERTFJYWJ5NXFndyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eGhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX2VjeTV4aE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3RUeXBlIiB4bWk6aWQ9Il94S3NJb0I4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMSIgZ3VpZD0iX3hLc0lvQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgd29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2ciIGhyZWY9InVtYTovLy1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIy1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdFR5cGUiIHhtaTppZD0iX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0IyIiBndWlkPSJfeUNrTDBCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiB3b3JrUHJvZHVjdHM9Il9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgaHJlZj0idW1hOi8vLUtvVW51MmJMX0ZfT18zMFNkNVBKOXcjLUtvVW51MmJMX0ZfT18zMFNkNVBKOXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXh4TTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9lY3k1eHhNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2wiIHhtaTppZD0iXzBOY3ZBQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9InRvb2xfQjEiIGd1aWQ9Il8wTmN2QUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZbGpFWUdCNGZQQ0U1THZUNERhUHRBIiBocmVmPSJ1bWE6Ly8tWWxqRVlHQjRmUENFNUx2VDREYVB0QSMtWWxqRVlHQjRmUENFNUx2VDREYVB0QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbCIgeG1pOmlkPSJfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0idG9vbF9CMiIgZ3VpZD0iXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQjIgcHJlc2VudGF0aW9uIiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItM18tQWF6enNfbDQzSE9PRzhEQXNZdyIgaHJlZj0idW1hOi8vLTNfLUFhenpzX2w0M0hPT0c4REFzWXcjLTNfLUFhenpzX2w0M0hPT0c4REFzWXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXlCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfZWN5NXlCTTNFZHFxbmRpLWdEdXhwdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXlSTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX2VjeTV5Uk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eWhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il9lY3k1eWhNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX2VjeTV5eE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfZWN5NXl4TTNFZHFxbmRpLWdEdXhwdyIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iXzNFU1pRQjh5RWRxZ0JJVHVJQ0xKRXcgXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxIiBndWlkPSJfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIGhyZWY9InVtYTovLy1XUHFoeFVweDR1RzZXeXI1VWpmb2lnIy1XUHFoeFVweDR1RzZXeXI1VWpmb2lnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgaHJlZj0iI19YZlRkb0I4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiBocmVmPSIjX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIGhyZWY9IiNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9IiNfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9IiNfWkhmMllCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0iI19jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZb2tBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IyIiBndWlkPSJfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjIgcHJlc2VudCIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cgX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmcgX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBocmVmPSJ1bWE6Ly8tOFhmUG10NTVITkJWVXlfZldTdk41USMtOFhmUG10NTVITkJWVXlfZldTdk41USIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMS4xIiBndWlkPSJfWGZUZG9CODBFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBCMS4xIHByZXNlbnRhdGlvbiI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVl6Y0thVDNHWVpYUmtZM1pNcl9tUmciIGhyZWY9InVtYTovLy1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIy1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1ekJNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIgbmFtZT0iY29udGVudF9wYWNrYWdlX0IxIiBndWlkPSJfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uIFBhayBCMSBicmllZiI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBuYW1lPSJyb2xlX0IxIiBndWlkPSJfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVzcG9uc2libGVGb3I9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIF9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItRmMydVlYQV80N3M3dFJUQm1tS1F2USIgaHJlZj0idW1hOi8vLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEjLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il9LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByZXNwb25zaWJsZUZvcj0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX25xRldFQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GaWRlRDAxcFVEVVhNWEVzVnJzM0dRIiBocmVmPSJ1bWE6Ly8tRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSMtRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0idGFza19CMSIgZ3VpZD0iX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIHBlcmZvcm1lZEJ5PSJfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgbWFuZGF0b3J5SW5wdXQ9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBvdXRwdXQ9Il9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG9wdGlvbmFsSW5wdXQ9Il9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3IiBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyMtbFlqcjZWaXRMMVZubkZOTzc4WHVZdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0idGFza19CMiIgZ3VpZD0iX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiBwZXJmb3JtZWRCeT0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG1hbmRhdG9yeUlucHV0PSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgb3V0cHV0PSJfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBvcHRpb25hbElucHV0PSJfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSjN6MElHZmplaGl0MHVGYlRKY2E3ZyIgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciLz4KLSAgICAgICAgICAgIDx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgeG1pOmlkPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIHJlcG9ydHM9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiB0ZW1wbGF0ZXM9Il9DOTBRTUI4c0VkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0tdWdpdnoxMUw2TGJqT3Z2NTNyX1RnIiBocmVmPSJ1bWE6Ly8tLXVnaXZ6MTFMNkxiak92djUzcl9UZyMtLXVnaXZ6MTFMNkxiak92djUzcl9UZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIHhtaTppZD0iX195RzdjQjhtRWRxMU9vLURvd2RwQmciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByZXBvcnRzPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgdGVtcGxhdGVzPSJfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyIgaHJlZj0idW1hOi8vLU1qZWVlZF9wX01ReWdyVzdEQmtBcmcjLU1qZWVlZF9wX01ReWdyVzdEQmtBcmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiB4bWk6aWQ9Il9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgZ3VpZD0iX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgZGVsaXZlcmVkV29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWd1Zng0UmFGd2hpVWhoQmtvcTN2WmciIGhyZWY9InVtYTovLy1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIy1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfSDRPVXNCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUhOWExIMUhnZG43MldYRzc3QUhHWkEiIGhyZWY9InVtYTovLy1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIy1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJvdXRjb21lX0IxIiBndWlkPSJfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciIGhyZWY9InVtYTovLy15YlRQdVZPNFJHd25fd1FsdkFXYWF3Iy15YlRQdVZPNFJHd25fd1FsdkFXYWF3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgeG1pOmlkPSJfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGd1aWQ9Il9ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHJlcG9ydHM9Il82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiB0ZW1wbGF0ZXM9Il9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIGRlbGl2ZXJlZFdvcmtQcm9kdWN0cz0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1LeE5zRndnOWNONC0xczViczN4WklnIiBocmVmPSJ1bWE6Ly8tS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyMtS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2hlY2tsaXN0IiB4bWk6aWQ9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJjaGVja2xpc3RfQjEiIGd1aWQ9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQjEiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgaHJlZj0idW1hOi8vLUdhaS0wdkNucUIwV2dLY2sxYm1ucHcjLUdhaS0wdkNucUIwV2dLY2sxYm1ucHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNoZWNrbGlzdCIgeG1pOmlkPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iY2hlY2tsaXN0X0IyIiBndWlkPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciIGhyZWY9InVtYTovLy1XN3dESFZlSVFFRFA1OWU5RDQxS3V3Iy1XN3dESFZlSVFFRFA1OWU5RDQxS3V3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb25jZXB0IiB4bWk6aWQ9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJjb25jZXB0X0IxIiBndWlkPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSIgaHJlZj0idW1hOi8vLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEjLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbmNlcHQiIHhtaTppZD0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9ImNvbmNlcHRfQjIiIGd1aWQ9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii02THBPZ2ljV1NodzJDZEJoVlpIcTB3IiBocmVmPSJ1bWE6Ly8tNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyMtNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RXhhbXBsZSIgeG1pOmlkPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iZXhhbXBsZV9CMSIgZ3VpZD0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgcmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItYkQtMmlFR1JoZEw3dWhrOVZnWTFpUSIgaHJlZj0idW1hOi8vLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEjLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkV4YW1wbGUiIHhtaTppZD0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9ImV4YW1wbGVfQjIiIGd1aWQ9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1PZGtRTjdneVV6ZGItbFY1S0hRczlBIiBocmVmPSJ1bWE6Ly8tT2RrUU43Z3lVemRiLWxWNUtIUXM5QSMtT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGVsaW5lIiB4bWk6aWQ9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJndWlkZWxpbmVfQjEiIGd1aWQ9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ikd1aWRlbGluZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMGkzRExDb2FJNHhoV19zMzRMcDdKdyIgaHJlZj0idW1hOi8vLTBpM0RMQ29hSTR4aFdfczM0THA3SncjLTBpM0RMQ29hSTR4aFdfczM0THA3SnciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRlbGluZSIgeG1pOmlkPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iZ3VpZGVsaW5lX0IyIiBndWlkPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQjIiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1heEtSR0xHeGJ2M0ZFMkhIbUVicWR3IiBocmVmPSJ1bWE6Ly8tYXhLUkdMR3hidjNGRTJISG1FYnFkdyMtYXhLUkdMR3hidjNGRTJISG1FYnFkdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2UiIHhtaTppZD0iXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InByYWN0aWNlX0IxIiBndWlkPSJfMUktblVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxIHByZXNlbnQiIGNvbnRlbnRSZWZlcmVuY2VzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyBfY1k1N3dCOHlFZHFnQklUdUlDTEpFdyBfbWRyellCOHlFZHFnQklUdUlDTEpFdyBfdVBBV2NCODVFZHFOdmVseWJEWFpGUSBfME5jdkFCOHlFZHFnQklUdUlDTEpFdyBfeEtzSW9COHlFZHFnQklUdUlDTEpFdyBfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyBfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyBfemtaUElCOHJFZHFRdk9qWDhkb0NDdyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyBfNGkxZkVCOHJFZHFRdk9qWDhkb0NDdyBfNWtqYXdCOHJFZHFRdk9qWDhkb0NDdyBfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyBfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyBfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyBfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyBfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyBfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyBfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyBfWGZUZG9CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEiIGhyZWY9InVtYTovLy15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIy15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIi8+Ci0gICAgICAgICAgICA8c3ViUHJhY3RpY2VzIHhtaTppZD0iXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InByYWN0aWNlX0IxLjEiIGd1aWQ9Il8ydk0tUUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBCMS4xIHByZXNlbnQiPgotICAgICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciIGhyZWY9InVtYTovLy1nVnZCMFB4Uks3NU14b09kbTkzMF93Iy1nVnZCMFB4Uks3NU14b09kbTkzMF93Ii8+Ci0gICAgICAgICAgICA8L3N1YlByYWN0aWNlcz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlIiB4bWk6aWQ9Il80aTFmRUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJwcmFjdGljZV9CMiIgZ3VpZD0iXzRpMWZFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBCMiBwcmVzZW50IiBjb250ZW50UmVmZXJlbmNlcz0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3cgX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX25xRldFQjhuRWRxMU9vLURvd2RwQmcgX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3cgXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3cgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmcgXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3cgXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3cgXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3cgXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3cgXy1nd1BBQjhyRWRxUXZPalg4ZG9DQ3cgX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2cgX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3cgX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cgX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3cgX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3cgXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXcgX2g5ZmxzQjh5RWRxZ0JJVHVJQ0xKRXcgX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXcgXzBZX01jQjg1RWRxTnZlbHliRFhaRlEgXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXcgX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIiBocmVmPSJ1bWE6Ly8tRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSMtRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmVwb3J0IiB4bWk6aWQ9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyZXBvcnRfQjEiIGd1aWQ9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNmlNT1hLamhQVE1xcGFnNTRiUTN3dyIgaHJlZj0idW1hOi8vLTZpTU9YS2poUFRNcXBhZzU0YlEzd3cjLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJlcG9ydCIgeG1pOmlkPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icmVwb3J0X0IyIiBndWlkPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXU1RGE4THhmUVJoSDZMaDVjdl9iWkEiIGhyZWY9InVtYTovLy11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIy11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXVzYWJsZUFzc2V0IiB4bWk6aWQ9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyZXVzYWJsZV9hc3NldF9CMSIgZ3VpZD0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZV9wQkczZDkwOU5CME92bmZRb0o5QSIgaHJlZj0idW1hOi8vLWVfcEJHM2Q5MDlOQjBPdm5mUW9KOUEjLWVfcEJHM2Q5MDlOQjBPdm5mUW9KOUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJldXNhYmxlQXNzZXQiIHhtaTppZD0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyIiBndWlkPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0wYTIzZy1hUWhjWnJUSDdwMnJ0eUFRIiBocmVmPSJ1bWE6Ly8tMGEyM2ctYVFoY1pyVEg3cDJydHlBUSMtMGEyM2ctYVFoY1pyVEg3cDJydHlBUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9hZG1hcCIgeG1pOmlkPSJfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icm9hZG1hcF9CMSIgZ3VpZD0iXzhoV2pFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWVhSlpyV2VGVmM0UEVNQTlLdjEwREEiIGhyZWY9InVtYTovLy1lYUpacldlRlZjNFBFTUE5S3YxMERBIy1lYUpacldlRlZjNFBFTUE5S3YxMERBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2FkbWFwIiB4bWk6aWQ9Il8tZ3dQQUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyb2FkbWFwX0IyIiBndWlkPSJfLWd3UEFCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBCMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItM25RNUpnUElFMUptelFtVElaaEt0ZyIgaHJlZj0idW1hOi8vLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGcjLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlN1cHBvcnRpbmdNYXRlcmlhbCIgeG1pOmlkPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMSIgZ3VpZD0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUpGaWp5LUU5dm5aNVFKWkpUMUFBMkEiIGhyZWY9InVtYTovLy1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIy1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpTdXBwb3J0aW5nTWF0ZXJpYWwiIHhtaTppZD0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiIGd1aWQ9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIiBocmVmPSJ1bWE6Ly8taWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSMtaWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlbXBsYXRlX0IxIiBndWlkPSJfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiBocmVmPSJ1bWE6Ly8tZWE2ZHczQmpfTmZwblRmbDBoXzdIQSMtZWE2ZHczQmpfTmZwblRmbDBoXzdIQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlbXBsYXRlX0IyIiBndWlkPSJfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiBocmVmPSJ1bWE6Ly8tVEdpamZrS2FsNDhnMDZxdGpIVkhKZyMtVEdpamZrS2FsNDhnMDZxdGpIVkhKZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVybURlZmluaXRpb24iIHhtaTppZD0iX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMSIgZ3VpZD0iX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZC01UVJqN3FKbXpuNjJDRS1fRTZVQSIgaHJlZj0idW1hOi8vLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEjLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlcm1EZWZpbml0aW9uIiB4bWk6aWQ9Il9HRVM0OEI4c0VkcVF2T2pYOGRvQ0N3IiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjIiIGd1aWQ9Il9HRVM0OEI4c0VkcVF2T2pYOGRvQ0N3IiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQjIgYnJpZWYiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1wU1N4dE1OUDVpc3hvbTFHZTlUQjNnIiBocmVmPSJ1bWE6Ly8tcFNTeHRNTlA1aXN4b20xR2U5VEIzZyMtcFNTeHRNTlA1aXN4b20xR2U5VEIzZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbE1lbnRvciIgeG1pOmlkPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0idG9vbG1lbnRvcl9CMSIgZ3VpZD0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50byBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbG1lbnRvciBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIgaHJlZj0idW1hOi8vLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEjLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRvb2xtZW50b3JfQjIiIGd1aWQ9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiBocmVmPSJ1bWE6Ly8tQnZuQWZHWERpYmNKTTRkXzdxV1hRUSMtQnZuQWZHWERpYmNKTTRkXzdxV1hRUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0id2hpdGVwYXBlcl9CMSIgZ3VpZD0iX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTZDZG00UzhCQTRVX1ZhNU5Vb1hZc3ciIGhyZWY9InVtYTovLy02Q2RtNFM4QkE0VV9WYTVOVW9YWXN3Iy02Q2RtNFM4QkE0VV9WYTVOVW9YWXN3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXaGl0ZXBhcGVyIiB4bWk6aWQ9Il9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBuYW1lPSJ3aGl0ZXBhcGVyX0IyIiBndWlkPSJfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBCMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItakk3Tm53R0ZEUy16SlctamtxSmRNQSIgaHJlZj0idW1hOi8vLWpJN05ud0dGRFMtekpXLWprcUpkTUEjLWpJN05ud0dGRFMtekpXLWprcUpkTUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNl91cE1CODBFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0UGFrX0IxIiBndWlkPSJfNl91cE1CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX19VNVNvQjgwRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImNhcFBhdFBha19CMS4xIiBndWlkPSJfX1U1U29CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NnhuUUVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VjeTV6aE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfZWN5NXpoTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfTDZKaThCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY1Bha19CMSIgZ3VpZD0iX0w2Smk4QjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfTjBmSXNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY1Bha19CMS4xIiBndWlkPSJfTjBmSXNCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfVjBWN01CODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9SZnh1c0I4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fUmZ4dXNCODFFZHFnQklUdUlDTEpFdyNfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1enhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX2VjeTV6eE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgICA8YmFzZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTIxZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXMvcm9sZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiIG5hbWU9InJvbGVfQjEsX0E5RFlnQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Ii1GYzJ1WVhBXzQ3czd0UlRCbW1LUXZRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDEyOjQ3OjIzLjE0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEIxIHNraWxsPC9za2lsbHM+Ci0gIDxhc3NpZ25tZW50QXBwcm9hY2hlcz5Sb2xlIEIxIGFzc2lnbjwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz5Sb2xlIEIxIHN5bjwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E5MjhhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSIgbmFtZT0icm9sZV9CMixfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iLUZpZGVEMDFwVURVWE1YRXNWcnMzR1EiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTI6NDg6MjEuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8c2tpbGxzPlJvbGUgQjIgc2tpbGw8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPlJvbGUgQjIgYXNzPC9hc3NpZ25tZW50QXBwcm9hY2hlcz4KLSAgPHN5bm9ueW1zPlJvbGUgQjIgc3luPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYWIzYjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIiBuYW1lPSJyb2xlX3NldF9ncm91cGluZ19CMSxfemFWUUFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTY6MjUuNTAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgU2V0IEdyb3VwaW5nIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgU2V0IEdyb3VwaW5nIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDU0MTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgbmFtZT0icm9sZV9zZXRfQjEsX3VQQVdjQjg1RWRxTnZlbHliRFhaRlEiIGd1aWQ9Ii1OTHdacFZlNDNBM3BFdjFMMG5td21BIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjUzOjA3LjM3NS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldHMvcm9sZV9zZXRfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdjYWMzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWtIdTNINGVfOElrREUxSWFieTVxZ3ciIG5hbWU9InJvbGVfc2V0X0IyLF8wWV9NY0I4NUVkcU52ZWx5YkRYWkZRIiBndWlkPSIta0h1M0g0ZV84SWtERTFJYWJ5NXFndyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzo1Mzo0My41NDctMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBTZXQgQjIgbWFpbgotJmx0Oy9wJmd0OzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBTZXQgQjIga2V5Ci0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjU0NWMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItbFlqcjZWaXRMMVZubkZOTzc4WHVZdyIgbmFtZT0idGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iLWxZanI2Vml0TDFWbm5GTk83OFh1WXciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTI6NTA6NDcuMjAzLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRhc2sgQjEgbWFpbiAmYW1wO2FtcDsgXCBcXCAmcXVvdDsgJyAlICZhbXA7Z3Q7ICZhbXA7bHQ7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIxLjEiIGd1aWQ9Il9UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPnVwPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9UNThqc0I4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIxLjIiIGd1aWQ9Il9UNThqc0I4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERvd24KLSZsdDsvcCZndDs8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX1Q4VkpVQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjEuMyIgZ3VpZD0iX1Q4VkpVQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+T3Zlcjwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5UYXNrIEIxIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQjEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGEwOWFmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90YXNrcy90YXNrX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciIG5hbWU9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Ii1KM3owSUdmamVoaXQwdUZiVEpjYTdnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDEyOjUwOjA3LjcwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UYXNrIEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjIuMSIgZ3VpZD0iX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+RWluPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIyLjIiIGd1aWQ9Il9xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFp3ZWkKLSZsdDsvcCZndDs8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjIuMyIgZ3VpZD0iX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgRHJlaQotJmx0Oy9wJmd0Ozwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5UYXNrIEIyIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQjIgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZjNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWWxqRVlHQjRmUENFNUx2VDREYVB0QSIgbmFtZT0idG9vbF9CMSxfME5jdkFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVlsakVZR0I0ZlBDRTVMdlQ0RGFQdEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTU6MjkuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2wgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VG9vbCBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3NDFhNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdG9vbHMvdG9vbF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTNfLUFhenpzX2w0M0hPT0c4REFzWXciIG5hbWU9InRvb2xfQjIsXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii0zXy1BYXp6c19sNDNIT09HOERBc1l3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjE1OjU4LjcxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sIEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRvb2wgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2EzMDU1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLS11Z2l2ejExTDZMYmpPdnY1M3JfVGciIG5hbWU9ImFydGlmYWN0X0IxLF9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBndWlkPSItLXVnaXZ6MTFMNkxiak92djUzcl9UZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTozNzo0MC4wNzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+QXJ0aWZhY3QgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+QXJ0aWZhY3QgQjEgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBCMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkFydGlmYWN0IEIxIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBCMSByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8YnJpZWZPdXRsaW5lPkFydGlmYWN0IEIxIG91dGxpbmU8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5BcnRpZmFjdCBCMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwYjNkYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1NamVlZWRfcF9NUXlnclc3REJrQXJnIiBuYW1lPSJhcnRpZmFjdF9CMixfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgZ3VpZD0iLU1qZWVlZF9wX01ReWdyVzdEQmtBcmciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTU6Mzk6MDQuOTY5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkFydGlmYWN0IEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkFydGlmYWN0IEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPkFydGlmYWN0IEIyIHVuaXF1ZSBJRDwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+QXJ0aWZhY3QgQjIgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBCMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+QXJ0aWZhY3QgQjIgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5BcnRpZmFjdCBCMiBvdXRsaW5lPC9icmllZk91dGxpbmU+Ci0gIDxyZXByZXNlbnRhdGlvbk9wdGlvbnM+QXJ0aWZhY3QgQjIgcmVwPC9yZXByZXNlbnRhdGlvbk9wdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWI1ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZ3VmeDRSYUZ3aGlVaGhCa29xM3ZaZyIgbmFtZT0iZGVsaXZlcmFibGVfQjEsX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGd1aWQ9Ii1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjQyOjE0Ljc4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EZWxpdmVyYWJsZSBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5EZWxpdmVyYWJsZSBCMSB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkRlbGl2ZXJhYmxlIEIxIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+RGVsaXZlcmFibGUgQjEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkRlbGl2ZXJhYmxlIEIxIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxleHRlcm5hbERlc2NyaXB0aW9uPkRlbGl2ZXJhYmxlIEIxIGV4dGVybjwvZXh0ZXJuYWxEZXNjcmlwdGlvbj4KLSAgPHBhY2thZ2luZ0d1aWRhbmNlPkRlbGl2ZXJhYmxlIEIxIHBhY2s8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBkYjQyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUt4TnNGd2c5Y040LTFzNWJzM3haSWciIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIiBndWlkPSItS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTo0MzozMC41NjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQjIgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBCMiBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEIyIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBCMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBCMiBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBCMiBwYWNrPC9wYWNrYWdpbmdHdWlkYW5jZT4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTU2MTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciIG5hbWU9Im91dGNvbWVfQjEsX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciIGd1aWQ9Ii15YlRQdVZPNFJHd25fd1FsdkFXYWF3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjQ3OjM4LjEwOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5PdXRjb21lIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPk91dGNvbWUgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+T3V0Y29tZSBCMSB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPk91dGNvbWUgQjEgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5PdXRjb21lIEIxIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5PdXRjb21lIEIxIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL291dGNvbWVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFkNDZmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIiBuYW1lPSJvdXRjb21lX0IyLF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBndWlkPSItSE5YTEgxSGdkbjcyV1hHNzdBSEdaQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTo0NjowMS4xNTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+T3V0Y29tZSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5PdXRjb21lIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPk91dGNvbWUgQjIgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5PdXRjb21lIEIyIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+T3V0Y29tZSBCMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+T3V0Y29tZSBCMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMTY2MzYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMSxfeEtzSW9COHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTc6MjguNDg0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldvcmsgUHJvZHVjdCBUeXBlIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPldvcmsgUHJvZHVjdCBUeXBlIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGY1YmQxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIsX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1Lb1VudTJiTF9GX09fMzBTZDVQSjl3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjA0OjU1Ljc2Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Xb3JrIFByb2R1Y3QgVHlwZSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Xb3JrIFByb2R1Y3QgVHlwZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBBLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3MmRjZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9Db25maWcgQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIgbmFtZT0iQ29uZmlnIEEiIGd1aWQ9Il9ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIiBicmllZkRlc2NyaXB0aW9uPSJDb25maWcgQSBkZXNjcmlwdGlvbiI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxMQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSVEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfemlfendBLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxMUS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRGFIa2dEemlFZHE1eXNGT05yMUJHUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0VGVnJ3RHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfQlM2Z0VEemxFZHE1eXNGT05yMUJHUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19kWERkOEVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZVpTendFQXZFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FCQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX0VXMDlNRDBLRWRxakFJNzdESHZCd0EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMTGctUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfalVOZm9CQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyNfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fVzZhNGNCQk5FZHFCczdLaGRWTFJMQSNfVzZhNGNCQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d1JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182X3VwTUI4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX1U1U29CODBFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTZ4blFFQTVFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1emhNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfTDZKaThCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX04wZklzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSnctUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTElnLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxKZy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSkEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTEtRLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSlEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTEl3LVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV4aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d2hNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXhCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV4eE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d3hNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXlSTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV5aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1eFJNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxwcm9jZXNzVmlld3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBCLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBCLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlN2I1Ny4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9Db25maWcgQi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfVUxxQklCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ29uZmlnIEIiIGd1aWQ9Il9VTHFCSUJNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d1JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182X3VwTUI4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX1U1U29CODBFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTZ4blFFQTVFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1emhNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfTDZKaThCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX04wZklzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPHByb2Nlc3NWaWV3cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjXzNFU1pRQjh5RWRxZ0JJVHVJQ0xKRXciLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvY29uZmlndXJhdGlvbnMvcHJvY19GYW1pbHlfQS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9wcm9jX0ZhbWlseV9BLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwYjliMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9wcm9jX0ZhbWlseV9BLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NGYW1pbHkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX1lVaUFBQjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9InByb2NfRmFtaWx5X0EiIGd1aWQ9Il9ZVWlBQUI4MUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJwcm9jX0ZhbWlseV9BIGRlc2NyaXB0aW9uIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRjYjExLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfcXp3eXdRLVBFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iX3F6d3l3US1QRWRxTDJPMVBKVjljWkEiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il82bEsyQUEtUEVkcUwyTzFQSlY5Y1pBIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmxLMkFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9KUjZ4c0I4UEVkcXNoTU5TSTA3WE9nIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfSlI2eHNCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3F6d3l3Zy1QRWRxTDJPMVBKVjljWkEiIGlkPSJfcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il95VW44SUEtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiIHVyaT0iUGx1ZyUyMEEvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VkUGxzQk0zRWRxcW5kaS1nRHV4cHciIGlkPSJfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIgdXJpPSJQbHVnJTIwQi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlBhcmlzIiBndWlkPSJfcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9lY3k1d0JNM0VkcXFuZGktZ0R1eHB3IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy8xc3RUZXN0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjljOGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iLi4vRXhwb3J0SW1wb3J0L1BhcmlzIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iUGFyaXMiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEV4cG9ydFBsdWdpbnMgZXhwb3J0Rm9sZGVyTmFtZT0iRXhwb3J0ZWQwMDEiPgotCTwvRXhwb3J0UGx1Z2lucz4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iQmFzZV8xIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRQbHVnaW5zIGltcG9ydEZvbGRlck5hbWU9IkV4cG9ydGVkMDAxIj4KLQk8L0ltcG9ydFBsdWdpbnM+Ci0JCi0JPE91dHB1dExpYnJhcnkgZGlzYWJsZT0idHJ1ZSIgLz4KLQkKLQk8T3V0cHV0UGx1Z2luIHBhdGg9IlBsdWcgQSIgcmVjdXJzaXZlPSJmYWxzZSI+Ci0JPC9PdXRwdXRQbHVnaW4+Ci0JCi0JPE91dHB1dENvbmZpZ3VyYXRpb24gcGF0aD0iQ29uZmlnIEEiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0Q29uZmlndXJhdGlvbj4KLQkKLQk8T3V0cHV0TWV0aG9kRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0TWV0aG9kRWxlbWVudD4KLQotCTxPdXRwdXRNZXRob2RFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIiByZWN1cnNpdmU9InRydWUiPgotCTwvT3V0cHV0TWV0aG9kRWxlbWVudD4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGMzMDUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODY2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IG5hbWU9IkJhc2VfMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08TWV0aG9kUGx1Z2luIG5hbWU9IlBsdWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEb21haW5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEb21haW4gbmFtZT0iZG9tYWluX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZG9tYWluX0ExLF9GRXpPNEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxOToxNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEb21haW4gQTEgbWFpbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTxEb21haW4gbmFtZT0ic3ViX2RvbWFpbl9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWItRG9tYWluIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1Eb21haW4gQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0Njo1MyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3ViLURvbWFpbiBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWItRG9tYWluIEExLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L0RvbWFpbj4KLTwvRG9tYWluPgotPERvbWFpbiBuYW1lPSJkb21haW5fQTIiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEb21haW4gQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyL2FydGlmYWN0X0EyLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExLF9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0MjozNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQTEsX0M1ZF93QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJNb24gQXVnIDIyIDEwOjQ1OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L3Rhc2tzPgotPC9EaXNjaXBsaW5lPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NDQ6MTQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvdGFza3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExLF9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0OTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iTW9uIEF1ZyAyMiAxMDo0NzoyMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEExMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0EyLF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MDo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJXUCBUeXBlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFdvcmtQcm9kdWN0VHlwZSBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSxfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDI6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08V29ya1Byb2R1Y3RUeXBlIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMzoxNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IldvcmsgUHJvZHVjdCBUeXBlIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvV29ya1Byb2R1Y3RUeXBlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJUb29scyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFRvb2wgbmFtZT0idG9vbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9BMSxfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NTI6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08VG9vbCBuYW1lPSJ0b29sX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MjozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9TdGFuZGFyZENhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJIaWRkZW4iIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExLF9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MzoxNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEvZGVsUHJvY1Bha19BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMjowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDE6MjYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29yZUNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJDb25QYWsgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIE9jdCAxOCAxNjowNDoxMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHNraWxscz0iUm9sZSBBMSBza2lsbHMiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEExIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQTEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxSb2xlIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjMyOjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEEyIGtleSIgc2tpbGxzPSJSb2xlIEEyIHNraWxscyIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQTIgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBBMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFRhc2sgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIE9jdCAxOSAxMDoyODozOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSBrZXkiIHB1cnBvc2U9IlRhc2sgQTEgcHVycG9zZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEExIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJhbHBoYSI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJiZXRhIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImdhbW1hIj4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08VGFzayBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICggZXh0ZW5kZWQgYnkgVGFzayBBMyApIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjk6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRhc2sgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTIga2V5IiBwdXJwb3NlPSJUYXNrIEEyIHB1cnBvc2UiIGFsdGVybmF0aXZlcz0iVGFzayBBMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBwdXQgeW91ciByaWdodCBmb290IGluJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0icHV0IHlvdXIgcmlnaHQgZm9vdCBvdXQiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRG8gdGhlIGhva2V5LXBva2V5Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExIHgsXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgU2VwIDA3IDE0OjUyOjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMSB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEExIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMSByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjA0OjE5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViX0FydGlmYWN0IEExLjEga2V5IiBleHRlcm5hbElkPSJTdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWUiIHB1cnBvc2U9IlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMS4xIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEExLjEgcmVhc29uIiBicmllZk91dGxpbmU9IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IlN1Yl9BcnRpZmFjdCBBMS4xIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08Y29udGFpbmVyQXJ0aWZhY3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvY29udGFpbmVyQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPC9BcnRpZmFjdD4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgQXVnIDE3IDE5OjQxOjI0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTIga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMiB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEEyIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTIgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTIgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMi4xIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMi4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIuMSxfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBBdWcgMTcgMTk6NDQ6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEEyLjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEEyLjEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMi4xIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTIuMSBwdXJwb3NlIiBpbXBhY3RPZk5vdEhhdmluZz0iQXJ0aWZhY3QgQTIuMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMi4xIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEEyLjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxjb250YWluZXJBcnRpZmFjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRhaW5lckFydGlmYWN0PgotPC9BcnRpZmFjdD4KLTwvQXJ0aWZhY3Q+Ci08RGVsaXZlcmFibGUgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxEZWxpdmVyYWJsZURlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDoyOTo1OSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRlbGl2ZXJhYmxlIEExIGtleSIgZXh0ZXJuYWxJZD0iRGVsaXZlcmFibGUgQTEgdW5pcXVlIiBwdXJwb3NlPSJEZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkRlbGl2ZXJhYmxlIEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkRlbGl2ZXJhYmxlIEExIHJlYXNvbiIgZXh0ZXJuYWxEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgZXh0ZXJuIiBwYWNrYWdpbmdHdWlkYW5jZT0iRGVsaXZlcmFibGUgQTEgcGtnIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjE1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQTIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBBMiB1bmlxdWUiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEEyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQTImYW1wO25ic3A7aW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQTIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBBMiBwa2ciPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiBPdXRjb21lIEExICIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQTEgdW5pcXVlIiBwdXJwb3NlPSJPdXRjb21lIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEExIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEExIHVuaXF1ZSIgcHVycG9zZT0iT3V0Y29tZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQTEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBBMSByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPENoZWNrbGlzdCBuYW1lPSJjaGVja2xpc3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjaGVja2xpc3RfQTEsX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ2hlY2tsaXN0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMSBwcmVzZW50IiBzaGFwZWljb249ImZpbGU6L0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL3RyYW4tbHV1L0lCTS9NZXRob2RMaWJyYXJpZXMvcGFyaXMvUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNvbmNlcHRfQTEsX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIENvbmNlcHQgQTEgY29udGVudCYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Q29uY2VwdCBBMiBwcmVzZW50Jmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRWxlbWVudCB3aXRoIHR5cGU6JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rV2l0aFR5cGUmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O19PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBJnF1b3Q7Jmd0O0NvbmNlcHQ6IENvbmNlcHQgQTIgcHJlc2VudCZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEVsZW1lbnQgd2l0aCB1c2VyIHRleHQ6JmFtcDtuYnNwOyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGlua1dpdGhVc2VyVGV4dCZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NvbmNlcHQ+Ci08RXhhbXBsZSBuYW1lPSJleGFtcGxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJleGFtcGxlX0ExLF9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEExIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEExIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0ExLjEsXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMS4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTEuMSBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMS4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMS4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMS4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTEuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9wcmFjdGljZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9BMS9zdWJfZG9tYWluX0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFJlcG9ydCBuYW1lPSJyZXBvcnRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXBvcnRfQTEsX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmVwb3J0PgotPFJldXNhYmxlQXNzZXQgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjI3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXVzYWJsZUFzc2V0PgotPFJvYWRtYXAgbmFtZT0icm9hZG1hcF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUm9hZG1hcD4KLTxTdXBwb3J0aW5nTWF0ZXJpYWwgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSxfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvU3VwcG9ydGluZ01hdGVyaWFsPgotPFRlbXBsYXRlIG5hbWU9InRlbXBsYXRlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08R3VpZGFuY2VEZXNjcmlwdGlvbiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGF0dGFjaG1lbnRzPSIiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQTEsX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjA1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0ExIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0ExLF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxDaGVja2xpc3QgbmFtZT0iY2hlY2tsaXN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NoZWNrbGlzdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImV4YW1wbGVfQTIsX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08UmVwb3J0IG5hbWU9InJlcG9ydF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJlcG9ydF9BMixfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXBvcnQ+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9IiI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyLF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0EyLF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQTIsX0VwZm9ZQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBBMiBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMiBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEEyIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0EyLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMi4xLF9Kcmd3d0EtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEEyLjEgcHJvYmxlbSIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQTIuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTIuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEEyLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3ByYWN0aWNlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UmV1c2FibGVBc3NldCBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JldXNhYmxlQXNzZXQ+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0EyLF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDowNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6NDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjEyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGFzayBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0FTQ0lJJnF1b3Q7PyZndDsgJmx0O2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiB4bWk6dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsgeG1sbnM6eG1pPSZxdW90O2h0dHA6Ly93d3cub21nLm9yZy9YTUkmcXVvdDsgeG1sbnM6Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbD0mcXVvdDtodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUmcXVvdDsmZ3Q7ICAgJmx0O29yZGVySW5mb3MgbmFtZT0mcXVvdDtzZWN0aW9ucyZxdW90OyB0aW1lc3RhbXA9JnF1b3Q7MTEyOTc0NzI2NDEwOSZxdW90OyZndDsgICAgICZsdDtnVUlEcyZndDtfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O191bXlnWUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3Z4NUJrRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190bmRib0JCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAmbHQ7L29yZGVySW5mb3MmZ3Q7ICZsdDsvY29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uJmd0OyAiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSIsX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI3OjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBUYXNrIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogVGFzayBBMyIgcHVycG9zZT0icHVycG9zZTogVGFzayBBMyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IFRhc2sgQTMiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMy4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iU3RlcCBBMy4xIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTMuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IlN0ZXAgQTMuMiI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEzLjMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJTdGVwIEEzLjMiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMiPgotPC9wZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4yIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3N0ZXBzPgotPC9UYXNrPgotPFJvbGUgbmFtZT0icm9sZV9BMyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0ibmV3X3JvbGUsXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI5OjU5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBSb2xlIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OiBSb2xlIEEzIiBza2lsbHM9InNraWxsczogUm9sZSBBMyIgYXNzaWdubWVudEFwcHJvYWNoZXM9ImFzc2lnbm1lbnQ6IFJvbGUgQTMiIHN5bm9ueW1zPSJzeW5vbnltbnMgOiBSb2xlIEEzIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTMiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPC9Sb2xlPgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJjYXBQYXRQYWtfQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUGhhc2UxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJJdGVyYXRpb24xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkxIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9InRydWUiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJmFwb3M7cyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbiYjMTM7JiMxMDsgICAgICAgICAgICAgICAgZWZmb3J0LiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk0JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTUmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk3JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVyYW50aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZCYjMTM7JiMxMDsgICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtJiMxMzsmIzEwOyAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZSYjMTM7JiMxMDsgICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZSYjMTM7JiMxMDsgICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZSYjMTM7JiMxMDsgICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQmIzEzOyYjMTA7ICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlJiMxMzsmIzEwOyAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3ImIzEzOyYjMTA7ICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0JiMxMzsmIzEwOyAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlJiMxMzsmIzEwOyAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcyYjMTM7JiMxMDsgICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvQWN0aXZpdHkxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYyB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0ExIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX1Rhc2tBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEsX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXlzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAga2V5MSxrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2U6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQgZGVzY3JpcHRpb24mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFzayBsaW5rZWQgdG8gdGFza0EyIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgJmx0O3Rib2R5Jmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDEmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICAyJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgNCYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICA1JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy90Ym9keSZndDsmIzEzOyYjMTA7Jmx0Oy90YWJsZSZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvVGFzaz4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVEZXNjMSIgYnJpZWZEZXNjcmlwdGlvbj0icm9sZURlc2MxIGxpbmtlZCB0byByb2xlQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjMSIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlRGVzYzEsX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkxJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0O3VzYWdlIGZvciByb2xlQTEmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0icmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZURlc2MxIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZURlc2MyIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzIgbGlua2VkIHRvIHJvbGVBMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MyIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjMixfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXkgY29uc2lkZXJhdGlvbiBmb3Igcm9sZUEyIiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZUEyJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MxIiBicmllZkRlc2NyaXB0aW9uPSJ0aGlzIHdwIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzEsX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OndwRGVzYzEiIHVzYWdlR3VpZGFuY2U9InVzYWdlOndwRGVzYzEiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkOiB3cERlc2MxJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMiIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ3cERlc2MyLF9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTp3cGRlc2MyIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp3cGRlc2MyIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQ6IHdwZGVzYzIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfWHNYcTBEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkOiB3cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkIGRlc2NyaXB0aW9uIDogcm9sZURlc2Mgd2l0aCBubyBsaW5rcyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6dGFzayB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MsXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OnRhc2sgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZDp0YXNrIHdpdGggbm8gbGlua3MmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3Rpdml0eTIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5MiIgYnJpZWZEZXNjcmlwdGlvbj0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3Rpdml0eTIsX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIFdvcmtmbG93IERldGFpbDomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgUHJvdmlkZXMgdGhlIG5hdHVyYWwgJmx0O2ImZ3Q7dHJhbnNpdGlvbiBmcm9tIGFuYWx5c2lzJmx0Oy9iJmd0OyBhY3Rpdml0aWVzICZsdDtiJmd0O3RvIGRlc2lnbiZsdDsvYiZndDsgYWN0aXZpdGllcywgaWRlbnRpZnlpbmc6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIGVsZW1lbnRzIGZyb20gYW5hbHlzaXMgZWxlbWVudHMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIG1lY2hhbmlzbXMgZnJvbSByZWxhdGVkIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSZhcG9zO3MgJmx0O2ImZ3Q7cnVuLXRpbWUgYW5kIGRlcGxveW1lbnQgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtPcmdhbml6ZXMgdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsJmx0Oy9iJmd0OyBzbyBhcyB0byBtYWtlIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBzZWFtbGVzcyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtNYWludGFpbnMgdGhlIGNvbnNpc3RlbmN5IGFuZCBpbnRlZ3JpdHkgb2YgdGhlIGFyY2hpdGVjdHVyZSZsdDsvYiZndDssIGVuc3VyaW5nIHRoYXQ6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgbmV3IGRlc2lnbiBlbGVtZW50cyBpZGVudGlmaWVkIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gYXJlIGludGVncmF0ZWQgd2l0aCBwcmUtZXhpc3RpbmcgZGVzaWduIGVsZW1lbnRzLiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBtYXhpbWFsIHJlLXVzZSBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBhbmQgZGVzaWduIGVsZW1lbnRzIGlzIGFjaGlldmVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIHRoZSBkZXNpZ24mIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGVmZm9ydC4mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEtleSBjb25zaWRlcmF0aW9uczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NCYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk1JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTYmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcykuIFRoZSBpbml0aWFsIGZvY3VzIHdpbGwgYmUgb24gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24sezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mJiMxMzsmIzEwOyAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2luY29ycG9yYXRlX2Rlc2lnbl9lbGVtZW50cyx7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3JiMxMzsmIzEwOyAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9ydW50aW1lX2FyY2hpdGVjdHVyZSx7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0mcXVvdDsmZ3Q7RGVzY3JpYmUgRGlzdHJpYnV0aW9uJmx0Oy9hJmd0OywgcmVzcGVjdGl2ZWx5LiBBcyB0aGVzZSBpc3N1ZXMgYXJlIGNvbnNpZGVyZWQsJiMxMzsmIzEwOyAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluJiMxMzsmIzEwOyAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3JiMxMzsmIzEwOyAgICBvZiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IGlzIHJlZmluZWQsIGFzIHdlbGwpLiBUaGUgcmVzdWx0aW5nIGFyY2hpdGVjdHVyZSBpcyByZXZpZXdlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2Ugb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBoYXZlIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gb3RoZXIgdGFza3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cC5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGFsdGVybmF0aXZlcz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBbHRlcmFudGl2ZXM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O29sJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQmIzEzOyYjMTA7ICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbSYjMTM7JiMxMDsgICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UmIzEzOyYjMTA7ICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUmIzEzOyYjMTA7ICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUmIzEzOyYjMTA7ICAgIHdpdGggZGlzdHJpYnV0aW9uIGFuZCBkZXBsb3ltZW50IGV4cGVydGlzZSAoaWYgdGhvc2UgaXNzdWVzIGFyZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQpLiBJbiBvcmRlciB0byB1bmRlcnN0YW5kJiMxMzsmIzEwOyAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZSYjMTM7JiMxMDsgICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yJiMxMzsmIzEwOyAgICBjb3VudGVyaW5nIHRoaXMgdHJlbmQgaXMgdG8gcmV0YWluIGEgcmVsYXRpdmVseSBzbWFsbCBjb3JlIHRlYW0gd2l0aCBhIHNhdGVsbGl0ZSBncm91cCBvZiBleHRlbmRlZCB0ZWFtIG1lbWJlcnMgdGhhdCYjMTM7JiMxMDsgICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZSYjMTM7JiMxMDsgICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMmIzEzOyYjMTA7ICAgIG5lZWQgdG8gYmUgYWRkcmVzc2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL0FjdGl2aXR5MiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9hZG1hcF9CMSI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvQWN0aXZpdHk+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEmYW1wO25ic3A7IGtleSIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUYXNrIEExJmFtcDtuYnNwOyBndWlkYW5jZSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvc3luY2VkLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IlRhc2sgQTEmYW1wO25ic3A7IHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHVzYWdlR3VpZGFuY2U9IlJvbGUgQTEgZ3VpZGFuY2UiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEExIHJlZmluZWQgZGVzYyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEEyIGtleSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTY3JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsmIzEzOyYjMTA7ICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cDFfYS5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiB1c2FnZUd1aWRhbmNlPSJSb2xlIEEyIHVzYWdlIiByZWZpbmVkRGVzY3JpcHRpb249IlJvbGUgQTIgcmVmaW5lZCBkZXNjIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEEyIGtleSIgdXNhZ2VHdWlkYW5jZT0iVGFzayBBMiBndWlkYW5jZSIgcmVmaW5lZERlc2NyaXB0aW9uPSJUYXNrIEEyIHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxJdGVyYXRpb24gbmFtZT0iSXRlcmF0aW9uMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJ0cnVlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9Ikl0ZXJhdGlvbjEsX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQ3JlYXRlIGFuIGluaXRpYWwgc2tldGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbSAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgZWxlbWVudHMgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgYW5hbHlzaXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBpbml0aWFsIGxheWVyaW5nIGFuZCBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIHVzZS1jYXNlIHJlYWxpemF0aW9ucyB0byBiZSBhZGRyZXNzZWQgaW4gdGhlIGN1cnJlbnQgaXRlcmF0aW9uJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkzMyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7LiBQZXJmb3JtIGFuIGluaXRpYWwgcGFzcyBhdCB0aGUgYXJjaGl0ZWN0dXJlIGluICZsdDthJiMxMzsmIzEwOyAgICBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UmIzEzOyYjMTA7ICAgIGNhc2VzLCBwZXJmb3JtaW5nICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7IG9uIGVhY2ggb25lLiBBZnRlciAob3IgYXMpIGVhY2ggdXNlIGNhc2UgaXMmIzEzOyYjMTA7ICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgYW5kIHRvIGFkZHJlc3MgcG90ZW50aWFsIGFyY2hpdGVjdHVyYWwgcHJvYmxlbXMgd2hpY2ggYXJlIGlkZW50aWZpZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBXaGVyZSB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgZnJvbSBhIHByaW9yIHByb2plY3Qgb3IgaXRlcmF0aW9uKSwgY2hhbmdlIHJlcXVlc3RzIG1heSBuZWVkIHRvIGJlJiMxMzsmIzEwOyAgICBjcmVhdGVkIHRvIGNoYW5nZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgYmVoYXZpb3IgdGhlIHN5c3RlbSBtdXN0IHN1cHBvcnQuIFRoZXNlIGNoYW5nZXMgbWF5IGJlIHRvIGFueSYjMTM7JiMxMDsgICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVybmF0aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2EgaHJlZj0mcXVvdDsuLi9yb2xlcy9yb2xlX0ExLnhtaSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3JvbGVfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3Rhc2tzL3Rhc2tfQTIueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7dGFza19BMi54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kJiMxMzsmIzEwOyAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0mIzEzOyYjMTA7ICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlJiMxMzsmIzEwOyAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL0FjdGl2aXR5MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9BY3Rpdml0eTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMiI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvSXRlcmF0aW9uPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQaGFzZSBuYW1lPSJQaGFzZTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUGhhc2UxIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iUGhhc2UxLF9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvUGhhc2UxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTwvUGhhc2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHN1YmNhdGVnb3JpZXMgb2YgcHJvY2VzcyBhcmUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJuLiZhbXA7bmJzcDsgQSBkZWxpdmVyeSBwcm9jZXNzIGRlZmluZXMgYSBjb21wbGV0ZSYjMTM7JiMxMDsgICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSJUaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3ImIzEzOyYjMTA7ZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvciYjMTM7JiMxMDtleHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy4gJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBleHRlcm5hbElkPSJFWHRlcm5hbCBJRDpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHNjb3BlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiB1c2FnZU5vdGVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBzdWJjYXRlZ29yaWVzIG9mIHByb2Nlc3MgYXJlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIGNhcGFiaWxpdHkgcGF0dGVybi4mYW1wO25ic3A7IEEgZGVsaXZlcnkgcHJvY2VzcyBkZWZpbmVzIGEgY29tcGxldGUmIzEzOyYjMTA7ICAgIG9yIGVuZC10by1lbmQgcHJvY2Vzcy4mYW1wO25ic3A7IEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgcHJvY2VzcyBmcmFnbWVudCB1c2VkIHRvIGNvbXBvc2UgYSBkZWxpdmVyeSBwcm9jZXNzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9QaGFzZTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iLF9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249Im1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJwdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGFsdGVybmF0aXZlcz0iYWx0ZXJuYXRpdmVzOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGhvd3RvU3RhZmY9ImhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EzLF9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy90YXNrX0EzIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMyxfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvUm9sZT4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMsX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIGV4dGVuZHMgVGFzayBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjIsX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9vdXRwdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjEiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyIGV4dGVuZGVkIGJ5IFJvbGUgQTMiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMsX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0ibWFpbjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGtleUNvbnNpZGVyYXRpb25zPSJLZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJQdXJwb3NlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBob3d0b1N0YWZmPSJIb3cgdG8gc3RhZmY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBleHRlcm5hbElkPSJFeHRlcm5hbCBJRDogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHNjb3BlPSJzY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHVzYWdlTm90ZXM9InVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBicmllZkRlc2NyaXB0aW9uPSJicmllZkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsga2V5IGNvbiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsICZsdDtzdHJvbmcmZ3Q7ZWxlbWVudHMmYXBvczsgYWx0ZXJuJmx0Oy9zdHJvbmcmZ3Q7IiBob3d0b1N0YWZmPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IHN0YWZmIiBleHRlcm5hbElkPSJleHRlcm5JRDpDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBzY29wZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBzY29wZSIgdXNhZ2VOb3Rlcz0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zO3VzYWdlIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3QxLF9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9BY3QxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIxIHByZXNuZXQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IxLF9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjEsX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMSxfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMSxfanZTQkEwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IxIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9qdmJLOEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMixfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTIsX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfYTQxcklFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL0FjdDEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0ExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvYyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsUHJvYyBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkRlbFByb2MgQTEsX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxQcm9jIEExIGtleSBjb24iIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iRGVsUHJvYyBBMSBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJEZWxQcm9jIEExIGFsdGVybiIgaG93dG9TdGFmZj0iRGVsUHJvYyBBMSBzdGFmZiIgZXh0ZXJuYWxJZD0iRGVsUHJvYyBBMSBleHRlcm5JRCIgc2NvcGU9IkRlbFByb2MgQTEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2MgQTEgdXNhZ2UiIHNjYWxlPSJEZWxQcm9jIEExIHNjYWxlIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSJEZWxQcm9jIEExIHByb2ogY2hhciIgcmlza0xldmVsPSJEZWxQcm9jIEExIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2MgQTEgZXN0IHRlY2giIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IkRlbFByb2MgQTEgZXhwZXJ0aXNlIiB0eXBlT2ZDb250cmFjdD0iRGVsUHJvYyBBMSBjb250eXBlIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEvZGVsUHJvY19BMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWsgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWsgQTEvZGVsUHJvY1Bha19BMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jUGFrIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbFByb2NQYWsgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImRlbFByb2NQYWtfQTEuMSxfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbFByb2NQYWsgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsUHJvY1BhayBBMS4xIGtleSIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSJEZWxQcm9jUGFrIEExLjEgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iRGVsUHJvY1BhayBBMS4xIGFsdCIgaG93dG9TdGFmZj0iRGVsUHJvY1BhayBBMS4xIHN0YWZmIiBleHRlcm5hbElkPSJEZWxQcm9jUGFrIEExLjEgZXh0ZXJuSUQiIHNjb3BlPSJEZWxQcm9jUGFrIEExLjEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2NQYWsgQTEuMSB1c2FnZSIgc2NhbGU9IkRlbFByb2NQYWsgQTEuMSBzY2FsZSIgcHJvamVjdENoYXJhY3RlcmlzdGljcz0iRGVsUHJvY1BhayBBMS4xIGNoYXIiIHJpc2tMZXZlbD0iRGVsUHJvY1BhayBBMS4xIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtlc3RpbWF0aW5nIHRlY2gmbHQ7IS0tU3RhcnRGcmFnbWVudC0tJmd0OyZsdDshLS1FbmRGcmFnbWVudC0tJmd0OyIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iRGVsUHJvY1BhayBBMS4xIGV4cGVydGlzZSIgdHlwZU9mQ29udHJhY3Q9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtjb250cmFjdCI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZFBsdWdpbiBuYW1lPSJQbHVnIEIiIGJyaWVmRGVzY3JpcHRpb249IlBsdWcgQiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iUGx1ZyBCIGFydGh1ciIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB1c2VyQ2hhbmdlYWJsZT0idHJ1ZSI+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29udGVudCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iRG9tYWlucyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RG9tYWluIG5hbWU9ImRvbWFpbl9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRvbWFpbl9CMSxfbWRyellCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDI6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRvbWFpbiBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Eb21haW4+Ci08RG9tYWluIG5hbWU9ImRvbWFpbl9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRvbWFpbl9CMixfcmFvT2dCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDI6MzcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRvbWFpbiBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEIyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0IxIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0IxLF9TWk14WUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowMDoxOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBCMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQjEsX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjAwOjU3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMSI+Ci08L3Rhc2tzPgotPHJlZmVyZW5jZVdvcmtmbG93cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdF9CMS9jYXBQYXRfQjEiPgotPC9yZWZlcmVuY2VXb3JrZmxvd3M+Ci08L0Rpc2NpcGxpbmU+Ci08RGlzY2lwbGluZSBuYW1lPSJkaXNjaXBsaW5lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX0IyLF9oOWZsc0I4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowMTozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEaXNjaXBsaW5lIEIyIG1haW4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvdGFza3M+Ci08cmVmZXJlbmNlV29ya2Zsb3dzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEvY2FwUGF0X0IxLjEvY2FwUGF0X0IxLjEiPgotPC9yZWZlcmVuY2VXb3JrZmxvd3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxLF96YVZRQUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzoxNjoyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0IxIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0IxLF91UEFXY0I4NUVkcU52ZWx5YkRYWkZRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzo1MzowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPFJvbGVTZXQgbmFtZT0icm9sZV9zZXRfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfQjIsXzBZX01jQjg1RWRxTnZlbHliRFhaRlEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjUzOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFJvbGUgU2V0IEIyIG1haW4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUm9sZSBTZXQgQjIga2V5JiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvbGVfQjIiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iV1AgVHlwZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxXb3JrUHJvZHVjdFR5cGUgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjEsX3hLc0lvQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjE3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iV29yayBQcm9kdWN0IFR5cGUgQjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L1dvcmtQcm9kdWN0VHlwZT4KLTxXb3JrUHJvZHVjdFR5cGUgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIsX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjA0OjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iV29yayBQcm9kdWN0IFR5cGUgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlRvb2xzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08VG9vbCBuYW1lPSJ0b29sX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0IxLF8wTmN2QUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzoxNToyOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBCMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTxUb29sIG5hbWU9InRvb2xfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQjIgcHJlc2VudGF0aW9uIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9CMixfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MTU6NTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQjIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvU3RhbmRhcmRDYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iSGlkZGVuIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX2VjeTV5eE0zRWRxcW5kaS1nRHV4cHciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08L0NvbnRlbnRQYWNrYWdlPgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSxfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDU6NDAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9DUCBCMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMixfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDY6MTIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMS4xIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEIxLjEgcHJlc2VudGF0aW9uIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLjEsX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjE0OjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIxLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNvcmVDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQiPgotPC9wYXJlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9ImNvbnRlbnRfcGFja2FnZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uIFBhayBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFJvbGUgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTI6NDc6MjMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvbGUgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgQjEga2V5IiBza2lsbHM9IlJvbGUgQjEgc2tpbGwiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEIxIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQjEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGU+Ci08Um9sZSBuYW1lPSJyb2xlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxMjo0ODoyMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBCMiBrZXkiIHNraWxscz0iUm9sZSBCMiBza2lsbCIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQjIgYXNzIiBzeW5vbnltcz0iUm9sZSBCMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxUYXNrIG5hbWU9InRhc2tfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08VGFza0Rlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDEyOjUwOjQ3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRhc2sgQjEgbWFpbiAmYW1wO2FtcDsgXCBcXCAmcXVvdDsgJmFwb3M7ICUgJmFtcDtndDsgJmFtcDtsdDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQjEga2V5IiBwdXJwb3NlPSJUYXNrIEIxIHBvcnBvaXNlIiBhbHRlcm5hdGl2ZXM9IlRhc2sgQjEgYWx0Ij4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249InVwIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRG93biYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249Ik92ZXIiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC9vdXRwdXQ+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08c3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMS90YXNrX0IxLF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjEuMiI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc3RlcHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvVGFzaz4KLTxUYXNrIG5hbWU9InRhc2tfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxMjo1MDowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBCMiBrZXkiIHB1cnBvc2U9IlRhc2sgQjIgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iVGFzayBCMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBCMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRWluIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjIuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgWndlaSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjIuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRHJlaSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIvdGFza19CMixfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNTozNzo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEIxIGtleSIgZXh0ZXJuYWxJZD0iQXJ0aWZhY3QgQjEgdW5pcXVlIElEIiBwdXJwb3NlPSJBcnRpZmFjdCBCMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEIxIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEIxIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBCMSBvdXRsaW5lIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEIxIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IxIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3RlbXBsYXRlX0IxIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IxIj4KLTwvdG9vbE1lbnRvcnM+Ci08L0FydGlmYWN0PgotPEFydGlmYWN0IG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6Mzk6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJBcnRpZmFjdCBCMiBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEIyIHVuaXF1ZSBJRCIgcHVycG9zZT0iQXJ0aWZhY3QgQjIgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBCMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBCMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQjIgb3V0bGluZSIgcmVwcmVzZW50YXRpb25PcHRpb25zPSJBcnRpZmFjdCBCMiByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9BcnRpZmFjdD4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjEsX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQyOjE0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQjEga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBCMSB1bmlxdWUgSUQiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEIxIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQjEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQjEgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBCMSBwYWNrIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMSI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTwvRGVsaXZlcmFibGU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6NDY6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQjIga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEIyIHVuaXF1ZSBJRCIgcHVycG9zZT0iT3V0Y29tZSBCMiBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQjIgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBCMiByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPE91dGNvbWUgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQ3OjM4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJPdXRjb21lIEIxIGtleSIgZXh0ZXJuYWxJZD0iT3V0Y29tZSBCMSB1bmlxdWUgSUQiIHB1cnBvc2U9Ik91dGNvbWUgQjEgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJPdXRjb21lIEIxIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9Ik91dGNvbWUgQjEgcmVhc29uIj4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvT3V0Y29tZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjIsX25xRldFQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQzOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQjIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBCMiB1bmlxdWUgSUQiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEIyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQjIgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQjIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBCMiBwYWNrIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjIiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTwvRGVsaXZlcmFibGU+Ci08Q2hlY2tsaXN0IG5hbWU9ImNoZWNrbGlzdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIxIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNoZWNrbGlzdF9CMSxfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjc6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DaGVja2xpc3Q+Ci08Q2hlY2tsaXN0IG5hbWU9ImNoZWNrbGlzdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNoZWNrbGlzdF9CMixfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjg6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DaGVja2xpc3Q+Ci08Q29uY2VwdCBuYW1lPSJjb25jZXB0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjb25jZXB0X0IxLF93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoxNjowMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBCMSBjb250ZXh0IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Db25jZXB0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9CMixfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MTY6MjcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQjIgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgcmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZXhhbXBsZV9CMSxfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjg6MzcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvRXhhbXBsZT4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Im5ld19leGFtcGxlX0IyLF96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyOToxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQjEsX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM3OjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEIyIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZ3VpZGVsaW5lX0IyLF8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0Njo1NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0d1aWRlbGluZT4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQjEsXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQyOjAwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQjEgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBCMSBwcm9iIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBCMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQjEgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEIxIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0IxLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEIxLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9CMS4xLF8ydk0tUUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0Mzo0OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQjEuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEIxLjEgcHJvYiIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQjEuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQjEuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQjEuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEIxLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzL3Rvb2xfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcHJhY3RpY2VfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvYWRtYXBfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9CMixfNGkxZkVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6NDA6NTAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBCMiBhZGQiIHByb2JsZW09IlByYWN0aWNlIEIyIHByb2IiIGJhY2tncm91bmQ9IlByYWN0aWNlIEIyIGJhY2siIGdvYWxzPSJQcmFjdGljZSBCMiBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UmYW1wO25ic3A7IGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQjIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3ByYWN0aWNlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3ByYWN0aWNlX0IxL3ByYWN0aWNlX0IxLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvYWRtYXBfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucy9kb21haW5fQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scy90b29sX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPC9QcmFjdGljZT4KLTxSZXBvcnQgbmFtZT0icmVwb3J0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmVwb3J0X0IxLF81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozODozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmVwb3J0IEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JlcG9ydD4KLTxSZXBvcnQgbmFtZT0icmVwb3J0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmVwb3J0X0IyLF82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozOTowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmVwb3J0IEIyIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JlcG9ydD4KLTxSZXVzYWJsZUFzc2V0IG5hbWU9InJldXNhYmxlX2Fzc2V0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IxLF82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0NjoxOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmV1c2FibGVBc3NldD4KLTxSZXVzYWJsZUFzc2V0IG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyLF83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0MDowMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmV1c2FibGVBc3NldD4KLTxSb2FkbWFwIG5hbWU9InJvYWRtYXBfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvYWRtYXBfQjEsXzhoV2pFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM2OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2FkbWFwIEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JvYWRtYXA+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0IyLF8tZ3dQQUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxLF9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0NTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08U3VwcG9ydGluZ01hdGVyaWFsIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIsX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQ0OjUyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIENvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1N1cHBvcnRpbmdNYXRlcmlhbD4KLTxUZW1wbGF0ZSBuYW1lPSJ0ZW1wbGF0ZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEd1aWRhbmNlRGVzY3JpcHRpb24gbmFtZT0idGVtcGxhdGVfQjEsX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM2OjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhdHRhY2htZW50cz0iIj4KLTwvR3VpZGFuY2VEZXNjcmlwdGlvbj4KLTwvVGVtcGxhdGU+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0IyLF9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyNDo1NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9InJlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEsX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjIzOjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGVybURlZmluaXRpb24gbmFtZT0idGVybV9kZWZpbml0aW9uX0IyIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBCMiBicmllZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMixfR0VTNDhCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MjM6MTAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGVybSBEZWZpbml0aW9uIEIyIGNvbnRlbnQmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG8gQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQjEsX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjIwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIxIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0IyLF9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoxOTo0NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBCMiBjb250ZXh0IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9CMSxfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MTk6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjEgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxXaGl0ZXBhcGVyIG5hbWU9IndoaXRlcGFwZXJfQjIiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndoaXRlcGFwZXJfQjIsX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjE4OjM2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEIyIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1doaXRlcGFwZXI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImNhcFBhdFBha19CMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImNhcFBhdFBha19CMS4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJjYXBQYXRfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJjYXBQYXRfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEuMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iY2FwUGF0X0IxLjEsX0lQZFo0UjgxRWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iIiBhbHRlcm5hdGl2ZXM9IiIgaG93dG9TdGFmZj0iIiBleHRlcm5hbElkPSIiIHNjb3BlPSIiIHVzYWdlTm90ZXM9IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xL2NhcFBhdF9CMS4xIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJjYXBQYXRfQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9ImNhcFBhdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImNhcFBhdF9CMSxfRTZFeWNSODFFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0X0IxL2NhcFBhdF9CMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AgQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdDEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdDEsXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL0FjdDEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzU2N1luRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfNTY3WWtrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzU2N1lRVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjEsXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfNTY3WWswQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IxIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMixfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF81NjdZblVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IxLF81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjEsXzU2N1lTMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IxLF81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IyLF81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjIsXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfNTY3WW1rQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsXzU2N1lrVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0EyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF81NjdZUlVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iV29ya2Zsb3ciPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5Ij4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AgQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNQIEExLF9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvQWN0MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9DUCBCMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJkZWxQcm9jUGFrX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWtfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0IxLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xL2RlbFByb2NfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RGVsaXZlcnlQcm9jZXNzIG5hbWU9ImRlbFByb2NfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJkZWxQcm9jX0IxLjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iZGVsUHJvY19CMS4xLF9WMFY3TVI4MUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiIHNjYWxlPSIiIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M9IiIgcmlza0xldmVsPSIiIGVzdGltYXRpbmdUZWNobmlxdWU9IiIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iIiB0eXBlT2ZDb250cmFjdD0iIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xL2RlbFByb2NfQjEuMS9kZWxQcm9jX0IxLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPERlbGl2ZXJ5UHJvY2VzcyBuYW1lPSJkZWxQcm9jX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iZGVsUHJvY19CMSxfUmZ4dXNSODFFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIiBzY2FsZT0iIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSIiIHJpc2tMZXZlbD0iIiBlc3RpbWF0aW5nVGVjaG5pcXVlPSIiIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IiIgdHlwZU9mQ29udHJhY3Q9IiI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEvZGVsUHJvY19CMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPGJhc2VzIHBhdGg9IlBsdWcgQSI+Ci08L2Jhc2VzPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kQ29uZmlndXJhdGlvbiBuYW1lPSJDb25maWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uZmlnIEEgZGVzY3JpcHRpb24iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiPgotPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBwYXRoPSJQbHVnIEEiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGx1Z2luU2VsZWN0aW9uIHBhdGg9IlBsdWcgQiI+Ci08L21ldGhvZFBsdWdpblNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50Ij4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50Ij4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3NlcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMS9jYXBQYXRfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdF9CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMS9kZWxQcm9jUGFrX0IxLjEvZGVsUHJvY19CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxwcm9jZXNzVmlld3MgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMSI+Ci08L3Byb2Nlc3NWaWV3cz4KLTwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTxNZXRob2RDb25maWd1cmF0aW9uIG5hbWU9IkNvbmZpZyBCIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiPgotPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBwYXRoPSJQbHVnIEIiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudCI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0X0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMS9kZWxQcm9jX0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY19CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08cHJvY2Vzc1ZpZXdzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEiPgotPC9wcm9jZXNzVmlld3M+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L01ldGhvZExpYnJhcnk+Ci08TWV0aG9kUGx1Z2luIG5hbWU9IlBsdWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEb21haW5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEb21haW4gbmFtZT0iZG9tYWluX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZG9tYWluX0ExLF9GRXpPNEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxOToxNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEb21haW4gQTEgbWFpbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTxEb21haW4gbmFtZT0ic3ViX2RvbWFpbl9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWItRG9tYWluIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1Eb21haW4gQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0Njo1MyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3ViLURvbWFpbiBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWItRG9tYWluIEExLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L0RvbWFpbj4KLTwvRG9tYWluPgotPERvbWFpbiBuYW1lPSJkb21haW5fQTIiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEb21haW4gQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyL2FydGlmYWN0X0EyLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExLF9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0MjozNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQTEsX0M1ZF93QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJNb24gQXVnIDIyIDEwOjQ1OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L3Rhc2tzPgotPC9EaXNjaXBsaW5lPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NDQ6MTQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvdGFza3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExLF9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0OTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iTW9uIEF1ZyAyMiAxMDo0NzoyMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEExMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0EyLF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MDo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJXUCBUeXBlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFdvcmtQcm9kdWN0VHlwZSBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSxfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDI6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08V29ya1Byb2R1Y3RUeXBlIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMzoxNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IldvcmsgUHJvZHVjdCBUeXBlIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvV29ya1Byb2R1Y3RUeXBlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJUb29scyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFRvb2wgbmFtZT0idG9vbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9BMSxfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NTI6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08VG9vbCBuYW1lPSJ0b29sX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MjozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9TdGFuZGFyZENhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJIaWRkZW4iIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExLF9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MzoxNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEvZGVsUHJvY1Bha19BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMjowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDE6MjYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29yZUNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJDb25QYWsgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIE9jdCAxOCAxNjowNDoxMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHNraWxscz0iUm9sZSBBMSBza2lsbHMiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEExIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQTEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxSb2xlIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjMyOjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEEyIGtleSIgc2tpbGxzPSJSb2xlIEEyIHNraWxscyIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQTIgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBBMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFRhc2sgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIE9jdCAxOSAxMDoyODozOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSBrZXkiIHB1cnBvc2U9IlRhc2sgQTEgcHVycG9zZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEExIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJhbHBoYSI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJiZXRhIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImdhbW1hIj4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08VGFzayBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICggZXh0ZW5kZWQgYnkgVGFzayBBMyApIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjk6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRhc2sgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTIga2V5IiBwdXJwb3NlPSJUYXNrIEEyIHB1cnBvc2UiIGFsdGVybmF0aXZlcz0iVGFzayBBMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBwdXQgeW91ciByaWdodCBmb290IGluJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0icHV0IHlvdXIgcmlnaHQgZm9vdCBvdXQiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRG8gdGhlIGhva2V5LXBva2V5Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExIHgsXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgU2VwIDA3IDE0OjUyOjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMSB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEExIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMSByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjA0OjE5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViX0FydGlmYWN0IEExLjEga2V5IiBleHRlcm5hbElkPSJTdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWUiIHB1cnBvc2U9IlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMS4xIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEExLjEgcmVhc29uIiBicmllZk91dGxpbmU9IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IlN1Yl9BcnRpZmFjdCBBMS4xIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08Y29udGFpbmVyQXJ0aWZhY3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvY29udGFpbmVyQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPC9BcnRpZmFjdD4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgQXVnIDE3IDE5OjQxOjI0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTIga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMiB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEEyIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTIgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTIgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMi4xIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMi4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIuMSxfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBBdWcgMTcgMTk6NDQ6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEEyLjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEEyLjEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMi4xIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTIuMSBwdXJwb3NlIiBpbXBhY3RPZk5vdEhhdmluZz0iQXJ0aWZhY3QgQTIuMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMi4xIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEEyLjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxjb250YWluZXJBcnRpZmFjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRhaW5lckFydGlmYWN0PgotPC9BcnRpZmFjdD4KLTwvQXJ0aWZhY3Q+Ci08RGVsaXZlcmFibGUgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxEZWxpdmVyYWJsZURlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDoyOTo1OSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRlbGl2ZXJhYmxlIEExIGtleSIgZXh0ZXJuYWxJZD0iRGVsaXZlcmFibGUgQTEgdW5pcXVlIiBwdXJwb3NlPSJEZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkRlbGl2ZXJhYmxlIEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkRlbGl2ZXJhYmxlIEExIHJlYXNvbiIgZXh0ZXJuYWxEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgZXh0ZXJuIiBwYWNrYWdpbmdHdWlkYW5jZT0iRGVsaXZlcmFibGUgQTEgcGtnIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjE1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQTIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBBMiB1bmlxdWUiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEEyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQTImYW1wO25ic3A7aW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQTIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBBMiBwa2ciPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiBPdXRjb21lIEExICIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQTEgdW5pcXVlIiBwdXJwb3NlPSJPdXRjb21lIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEExIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEExIHVuaXF1ZSIgcHVycG9zZT0iT3V0Y29tZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQTEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBBMSByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPENoZWNrbGlzdCBuYW1lPSJjaGVja2xpc3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjaGVja2xpc3RfQTEsX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ2hlY2tsaXN0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMSBwcmVzZW50IiBzaGFwZWljb249ImZpbGU6L0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL3RyYW4tbHV1L0lCTS9NZXRob2RMaWJyYXJpZXMvcGFyaXMvUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNvbmNlcHRfQTEsX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIENvbmNlcHQgQTEgY29udGVudCYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Q29uY2VwdCBBMiBwcmVzZW50Jmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRWxlbWVudCB3aXRoIHR5cGU6JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rV2l0aFR5cGUmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O19PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBJnF1b3Q7Jmd0O0NvbmNlcHQ6IENvbmNlcHQgQTIgcHJlc2VudCZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEVsZW1lbnQgd2l0aCB1c2VyIHRleHQ6JmFtcDtuYnNwOyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGlua1dpdGhVc2VyVGV4dCZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NvbmNlcHQ+Ci08RXhhbXBsZSBuYW1lPSJleGFtcGxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJleGFtcGxlX0ExLF9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEExIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEExIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0ExLjEsXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMS4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTEuMSBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMS4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMS4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMS4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTEuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9wcmFjdGljZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9BMS9zdWJfZG9tYWluX0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFJlcG9ydCBuYW1lPSJyZXBvcnRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXBvcnRfQTEsX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmVwb3J0PgotPFJldXNhYmxlQXNzZXQgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjI3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXVzYWJsZUFzc2V0PgotPFJvYWRtYXAgbmFtZT0icm9hZG1hcF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUm9hZG1hcD4KLTxTdXBwb3J0aW5nTWF0ZXJpYWwgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSxfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvU3VwcG9ydGluZ01hdGVyaWFsPgotPFRlbXBsYXRlIG5hbWU9InRlbXBsYXRlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08R3VpZGFuY2VEZXNjcmlwdGlvbiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGF0dGFjaG1lbnRzPSIiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQTEsX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjA1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0ExIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0ExLF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxDaGVja2xpc3QgbmFtZT0iY2hlY2tsaXN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NoZWNrbGlzdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImV4YW1wbGVfQTIsX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08UmVwb3J0IG5hbWU9InJlcG9ydF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJlcG9ydF9BMixfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXBvcnQ+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9IiI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyLF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0EyLF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQTIsX0VwZm9ZQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBBMiBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMiBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEEyIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0EyLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMi4xLF9Kcmd3d0EtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEEyLjEgcHJvYmxlbSIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQTIuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTIuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEEyLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3ByYWN0aWNlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UmV1c2FibGVBc3NldCBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JldXNhYmxlQXNzZXQ+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0EyLF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDowNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6NDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjEyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGFzayBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0FTQ0lJJnF1b3Q7PyZndDsgJmx0O2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiB4bWk6dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsgeG1sbnM6eG1pPSZxdW90O2h0dHA6Ly93d3cub21nLm9yZy9YTUkmcXVvdDsgeG1sbnM6Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbD0mcXVvdDtodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUmcXVvdDsmZ3Q7ICAgJmx0O29yZGVySW5mb3MgbmFtZT0mcXVvdDtzZWN0aW9ucyZxdW90OyB0aW1lc3RhbXA9JnF1b3Q7MTEyOTc0NzI2NDEwOSZxdW90OyZndDsgICAgICZsdDtnVUlEcyZndDtfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O191bXlnWUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3Z4NUJrRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190bmRib0JCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAmbHQ7L29yZGVySW5mb3MmZ3Q7ICZsdDsvY29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uJmd0OyAiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSIsX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI3OjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBUYXNrIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogVGFzayBBMyIgcHVycG9zZT0icHVycG9zZTogVGFzayBBMyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IFRhc2sgQTMiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMy4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iU3RlcCBBMy4xIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTMuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IlN0ZXAgQTMuMiI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEzLjMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJTdGVwIEEzLjMiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMiPgotPC9wZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4yIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3N0ZXBzPgotPC9UYXNrPgotPFJvbGUgbmFtZT0icm9sZV9BMyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0ibmV3X3JvbGUsXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI5OjU5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBSb2xlIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OiBSb2xlIEEzIiBza2lsbHM9InNraWxsczogUm9sZSBBMyIgYXNzaWdubWVudEFwcHJvYWNoZXM9ImFzc2lnbm1lbnQ6IFJvbGUgQTMiIHN5bm9ueW1zPSJzeW5vbnltbnMgOiBSb2xlIEEzIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTMiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPC9Sb2xlPgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJjYXBQYXRQYWtfQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUGhhc2UxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJJdGVyYXRpb24xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkxIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9InRydWUiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJmFwb3M7cyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbiYjMTM7JiMxMDsgICAgICAgICAgICAgICAgZWZmb3J0LiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk0JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTUmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk3JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVyYW50aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZCYjMTM7JiMxMDsgICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtJiMxMzsmIzEwOyAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZSYjMTM7JiMxMDsgICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZSYjMTM7JiMxMDsgICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZSYjMTM7JiMxMDsgICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQmIzEzOyYjMTA7ICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlJiMxMzsmIzEwOyAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3ImIzEzOyYjMTA7ICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0JiMxMzsmIzEwOyAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlJiMxMzsmIzEwOyAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcyYjMTM7JiMxMDsgICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvQWN0aXZpdHkxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYyB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0ExIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX1Rhc2tBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEsX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXlzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAga2V5MSxrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2U6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQgZGVzY3JpcHRpb24mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFzayBsaW5rZWQgdG8gdGFza0EyIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgJmx0O3Rib2R5Jmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDEmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICAyJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgNCYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICA1JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy90Ym9keSZndDsmIzEzOyYjMTA7Jmx0Oy90YWJsZSZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvVGFzaz4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVEZXNjMSIgYnJpZWZEZXNjcmlwdGlvbj0icm9sZURlc2MxIGxpbmtlZCB0byByb2xlQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjMSIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlRGVzYzEsX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkxJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0O3VzYWdlIGZvciByb2xlQTEmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0icmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZURlc2MxIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZURlc2MyIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzIgbGlua2VkIHRvIHJvbGVBMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MyIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjMixfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXkgY29uc2lkZXJhdGlvbiBmb3Igcm9sZUEyIiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZUEyJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MxIiBicmllZkRlc2NyaXB0aW9uPSJ0aGlzIHdwIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzEsX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OndwRGVzYzEiIHVzYWdlR3VpZGFuY2U9InVzYWdlOndwRGVzYzEiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkOiB3cERlc2MxJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMiIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ3cERlc2MyLF9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTp3cGRlc2MyIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp3cGRlc2MyIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQ6IHdwZGVzYzIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfWHNYcTBEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkOiB3cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkIGRlc2NyaXB0aW9uIDogcm9sZURlc2Mgd2l0aCBubyBsaW5rcyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6dGFzayB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MsXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OnRhc2sgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZDp0YXNrIHdpdGggbm8gbGlua3MmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3Rpdml0eTIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5MiIgYnJpZWZEZXNjcmlwdGlvbj0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3Rpdml0eTIsX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIFdvcmtmbG93IERldGFpbDomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgUHJvdmlkZXMgdGhlIG5hdHVyYWwgJmx0O2ImZ3Q7dHJhbnNpdGlvbiBmcm9tIGFuYWx5c2lzJmx0Oy9iJmd0OyBhY3Rpdml0aWVzICZsdDtiJmd0O3RvIGRlc2lnbiZsdDsvYiZndDsgYWN0aXZpdGllcywgaWRlbnRpZnlpbmc6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIGVsZW1lbnRzIGZyb20gYW5hbHlzaXMgZWxlbWVudHMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIG1lY2hhbmlzbXMgZnJvbSByZWxhdGVkIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSZhcG9zO3MgJmx0O2ImZ3Q7cnVuLXRpbWUgYW5kIGRlcGxveW1lbnQgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtPcmdhbml6ZXMgdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsJmx0Oy9iJmd0OyBzbyBhcyB0byBtYWtlIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBzZWFtbGVzcyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtNYWludGFpbnMgdGhlIGNvbnNpc3RlbmN5IGFuZCBpbnRlZ3JpdHkgb2YgdGhlIGFyY2hpdGVjdHVyZSZsdDsvYiZndDssIGVuc3VyaW5nIHRoYXQ6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgbmV3IGRlc2lnbiBlbGVtZW50cyBpZGVudGlmaWVkIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gYXJlIGludGVncmF0ZWQgd2l0aCBwcmUtZXhpc3RpbmcgZGVzaWduIGVsZW1lbnRzLiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBtYXhpbWFsIHJlLXVzZSBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBhbmQgZGVzaWduIGVsZW1lbnRzIGlzIGFjaGlldmVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIHRoZSBkZXNpZ24mIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGVmZm9ydC4mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEtleSBjb25zaWRlcmF0aW9uczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NCYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk1JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTYmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcykuIFRoZSBpbml0aWFsIGZvY3VzIHdpbGwgYmUgb24gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24sezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mJiMxMzsmIzEwOyAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2luY29ycG9yYXRlX2Rlc2lnbl9lbGVtZW50cyx7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3JiMxMzsmIzEwOyAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9ydW50aW1lX2FyY2hpdGVjdHVyZSx7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0mcXVvdDsmZ3Q7RGVzY3JpYmUgRGlzdHJpYnV0aW9uJmx0Oy9hJmd0OywgcmVzcGVjdGl2ZWx5LiBBcyB0aGVzZSBpc3N1ZXMgYXJlIGNvbnNpZGVyZWQsJiMxMzsmIzEwOyAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluJiMxMzsmIzEwOyAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3JiMxMzsmIzEwOyAgICBvZiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IGlzIHJlZmluZWQsIGFzIHdlbGwpLiBUaGUgcmVzdWx0aW5nIGFyY2hpdGVjdHVyZSBpcyByZXZpZXdlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2Ugb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBoYXZlIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gb3RoZXIgdGFza3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cC5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGFsdGVybmF0aXZlcz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBbHRlcmFudGl2ZXM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O29sJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQmIzEzOyYjMTA7ICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbSYjMTM7JiMxMDsgICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UmIzEzOyYjMTA7ICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUmIzEzOyYjMTA7ICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUmIzEzOyYjMTA7ICAgIHdpdGggZGlzdHJpYnV0aW9uIGFuZCBkZXBsb3ltZW50IGV4cGVydGlzZSAoaWYgdGhvc2UgaXNzdWVzIGFyZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQpLiBJbiBvcmRlciB0byB1bmRlcnN0YW5kJiMxMzsmIzEwOyAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZSYjMTM7JiMxMDsgICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yJiMxMzsmIzEwOyAgICBjb3VudGVyaW5nIHRoaXMgdHJlbmQgaXMgdG8gcmV0YWluIGEgcmVsYXRpdmVseSBzbWFsbCBjb3JlIHRlYW0gd2l0aCBhIHNhdGVsbGl0ZSBncm91cCBvZiBleHRlbmRlZCB0ZWFtIG1lbWJlcnMgdGhhdCYjMTM7JiMxMDsgICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZSYjMTM7JiMxMDsgICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMmIzEzOyYjMTA7ICAgIG5lZWQgdG8gYmUgYWRkcmVzc2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL0FjdGl2aXR5MiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9hZG1hcF9CMSI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvQWN0aXZpdHk+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEmYW1wO25ic3A7IGtleSIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUYXNrIEExJmFtcDtuYnNwOyBndWlkYW5jZSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvc3luY2VkLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IlRhc2sgQTEmYW1wO25ic3A7IHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHVzYWdlR3VpZGFuY2U9IlJvbGUgQTEgZ3VpZGFuY2UiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEExIHJlZmluZWQgZGVzYyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEEyIGtleSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTY3JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsmIzEzOyYjMTA7ICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cDFfYS5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiB1c2FnZUd1aWRhbmNlPSJSb2xlIEEyIHVzYWdlIiByZWZpbmVkRGVzY3JpcHRpb249IlJvbGUgQTIgcmVmaW5lZCBkZXNjIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEEyIGtleSIgdXNhZ2VHdWlkYW5jZT0iVGFzayBBMiBndWlkYW5jZSIgcmVmaW5lZERlc2NyaXB0aW9uPSJUYXNrIEEyIHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxJdGVyYXRpb24gbmFtZT0iSXRlcmF0aW9uMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJ0cnVlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9Ikl0ZXJhdGlvbjEsX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQ3JlYXRlIGFuIGluaXRpYWwgc2tldGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbSAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgZWxlbWVudHMgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgYW5hbHlzaXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBpbml0aWFsIGxheWVyaW5nIGFuZCBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIHVzZS1jYXNlIHJlYWxpemF0aW9ucyB0byBiZSBhZGRyZXNzZWQgaW4gdGhlIGN1cnJlbnQgaXRlcmF0aW9uJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkzMyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7LiBQZXJmb3JtIGFuIGluaXRpYWwgcGFzcyBhdCB0aGUgYXJjaGl0ZWN0dXJlIGluICZsdDthJiMxMzsmIzEwOyAgICBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UmIzEzOyYjMTA7ICAgIGNhc2VzLCBwZXJmb3JtaW5nICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7IG9uIGVhY2ggb25lLiBBZnRlciAob3IgYXMpIGVhY2ggdXNlIGNhc2UgaXMmIzEzOyYjMTA7ICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgYW5kIHRvIGFkZHJlc3MgcG90ZW50aWFsIGFyY2hpdGVjdHVyYWwgcHJvYmxlbXMgd2hpY2ggYXJlIGlkZW50aWZpZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBXaGVyZSB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgZnJvbSBhIHByaW9yIHByb2plY3Qgb3IgaXRlcmF0aW9uKSwgY2hhbmdlIHJlcXVlc3RzIG1heSBuZWVkIHRvIGJlJiMxMzsmIzEwOyAgICBjcmVhdGVkIHRvIGNoYW5nZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgYmVoYXZpb3IgdGhlIHN5c3RlbSBtdXN0IHN1cHBvcnQuIFRoZXNlIGNoYW5nZXMgbWF5IGJlIHRvIGFueSYjMTM7JiMxMDsgICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVybmF0aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2EgaHJlZj0mcXVvdDsuLi9yb2xlcy9yb2xlX0ExLnhtaSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3JvbGVfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3Rhc2tzL3Rhc2tfQTIueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7dGFza19BMi54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kJiMxMzsmIzEwOyAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0mIzEzOyYjMTA7ICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlJiMxMzsmIzEwOyAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL0FjdGl2aXR5MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9BY3Rpdml0eTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMiI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvSXRlcmF0aW9uPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQaGFzZSBuYW1lPSJQaGFzZTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUGhhc2UxIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iUGhhc2UxLF9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvUGhhc2UxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTwvUGhhc2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHN1YmNhdGVnb3JpZXMgb2YgcHJvY2VzcyBhcmUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJuLiZhbXA7bmJzcDsgQSBkZWxpdmVyeSBwcm9jZXNzIGRlZmluZXMgYSBjb21wbGV0ZSYjMTM7JiMxMDsgICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSJUaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3ImIzEzOyYjMTA7ZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvciYjMTM7JiMxMDtleHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy4gJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBleHRlcm5hbElkPSJFWHRlcm5hbCBJRDpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHNjb3BlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiB1c2FnZU5vdGVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBzdWJjYXRlZ29yaWVzIG9mIHByb2Nlc3MgYXJlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIGNhcGFiaWxpdHkgcGF0dGVybi4mYW1wO25ic3A7IEEgZGVsaXZlcnkgcHJvY2VzcyBkZWZpbmVzIGEgY29tcGxldGUmIzEzOyYjMTA7ICAgIG9yIGVuZC10by1lbmQgcHJvY2Vzcy4mYW1wO25ic3A7IEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgcHJvY2VzcyBmcmFnbWVudCB1c2VkIHRvIGNvbXBvc2UgYSBkZWxpdmVyeSBwcm9jZXNzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9QaGFzZTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iLF9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249Im1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJwdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGFsdGVybmF0aXZlcz0iYWx0ZXJuYXRpdmVzOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGhvd3RvU3RhZmY9ImhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EzLF9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy90YXNrX0EzIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMyxfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvUm9sZT4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMsX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIGV4dGVuZHMgVGFzayBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjIsX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9vdXRwdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjEiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyIGV4dGVuZGVkIGJ5IFJvbGUgQTMiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMsX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0ibWFpbjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGtleUNvbnNpZGVyYXRpb25zPSJLZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJQdXJwb3NlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBob3d0b1N0YWZmPSJIb3cgdG8gc3RhZmY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBleHRlcm5hbElkPSJFeHRlcm5hbCBJRDogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHNjb3BlPSJzY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHVzYWdlTm90ZXM9InVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBicmllZkRlc2NyaXB0aW9uPSJicmllZkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsga2V5IGNvbiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsICZsdDtzdHJvbmcmZ3Q7ZWxlbWVudHMmYXBvczsgYWx0ZXJuJmx0Oy9zdHJvbmcmZ3Q7IiBob3d0b1N0YWZmPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IHN0YWZmIiBleHRlcm5hbElkPSJleHRlcm5JRDpDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBzY29wZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBzY29wZSIgdXNhZ2VOb3Rlcz0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zO3VzYWdlIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3QxLF9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9BY3QxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIxIHByZXNuZXQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IxLF9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjEsX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMSxfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMSxfanZTQkEwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IxIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9qdmJLOEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMixfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTIsX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfYTQxcklFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL0FjdDEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0ExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvYyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsUHJvYyBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkRlbFByb2MgQTEsX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxQcm9jIEExIGtleSBjb24iIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iRGVsUHJvYyBBMSBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJEZWxQcm9jIEExIGFsdGVybiIgaG93dG9TdGFmZj0iRGVsUHJvYyBBMSBzdGFmZiIgZXh0ZXJuYWxJZD0iRGVsUHJvYyBBMSBleHRlcm5JRCIgc2NvcGU9IkRlbFByb2MgQTEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2MgQTEgdXNhZ2UiIHNjYWxlPSJEZWxQcm9jIEExIHNjYWxlIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSJEZWxQcm9jIEExIHByb2ogY2hhciIgcmlza0xldmVsPSJEZWxQcm9jIEExIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2MgQTEgZXN0IHRlY2giIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IkRlbFByb2MgQTEgZXhwZXJ0aXNlIiB0eXBlT2ZDb250cmFjdD0iRGVsUHJvYyBBMSBjb250eXBlIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEvZGVsUHJvY19BMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWsgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWsgQTEvZGVsUHJvY1Bha19BMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jUGFrIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbFByb2NQYWsgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImRlbFByb2NQYWtfQTEuMSxfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbFByb2NQYWsgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsUHJvY1BhayBBMS4xIGtleSIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSJEZWxQcm9jUGFrIEExLjEgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iRGVsUHJvY1BhayBBMS4xIGFsdCIgaG93dG9TdGFmZj0iRGVsUHJvY1BhayBBMS4xIHN0YWZmIiBleHRlcm5hbElkPSJEZWxQcm9jUGFrIEExLjEgZXh0ZXJuSUQiIHNjb3BlPSJEZWxQcm9jUGFrIEExLjEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2NQYWsgQTEuMSB1c2FnZSIgc2NhbGU9IkRlbFByb2NQYWsgQTEuMSBzY2FsZSIgcHJvamVjdENoYXJhY3RlcmlzdGljcz0iRGVsUHJvY1BhayBBMS4xIGNoYXIiIHJpc2tMZXZlbD0iRGVsUHJvY1BhayBBMS4xIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtlc3RpbWF0aW5nIHRlY2gmbHQ7IS0tU3RhcnRGcmFnbWVudC0tJmd0OyZsdDshLS1FbmRGcmFnbWVudC0tJmd0OyIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iRGVsUHJvY1BhayBBMS4xIGV4cGVydGlzZSIgdHlwZU9mQ29udHJhY3Q9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtjb250cmFjdCI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzEvMm5kVGVzdC50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS8ybmRUZXN0LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTViMWYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS8ybmRUZXN0LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJ0cnVlIj4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iLi4vLi4vRXhwb3J0SW1wb3J0L1BhcmlzIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iUGFyaXMiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEV4cG9ydENvbmZpZ3VyYXRpb24gZXhwb3J0Rm9sZGVyTmFtZT0iRXhwb3J0MDAwMSIgc2VsZWN0ZWRDb25maWdOYW1lPSJDb25maWcgQSI+Ci0JPC9FeHBvcnRDb25maWd1cmF0aW9uPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJCYXNlXzEiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydENvbmZpZ3VyYXRpb24gaW1wb3J0Rm9sZGVyTmFtZT0iRXhwb3J0MDAwMSI+Ci0JPC9JbXBvcnRDb25maWd1cmF0aW9uPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMCIKLQkJdXNlTmFtZUFzSWQ9ImZhbHNlIj4KLQkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS9TdWJTdWIvM3JkVGVzdC50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS9TdWJTdWIvM3JkVGVzdC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4MzgzMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzEvU3ViU3ViLzNyZFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIuLi8uLi8uLi9FeHBvcnRJbXBvcnQvUGFyaXMiPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJQYXJpcyI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8RXhwb3J0WG1sIGV4cG9ydEZvbGRlck5hbWU9IkV4cG9ydDAwMDEiPgotCTwvRXhwb3J0WG1sPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJCYXNlXzEiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydFhtbCBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIiBtZXJnZT0iZmFsc2UiPgotCTwvSW1wb3J0WG1sPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMjgiIAotCQllbGVtZW50Q291bnQ9IjM3MCIKLQkJdXNlTmFtZUFzSWQ9InRydWUiPgotCQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzFzdFRlc3QudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMXN0VGVzdC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMzA4Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMXN0VGVzdC50YworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0idHJ1ZSI+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9Ii4uLy4uL0V4cG9ydEltcG9ydC9QYXJpcyI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IlBhcmlzIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxFeHBvcnRQbHVnaW5zIGV4cG9ydEZvbGRlck5hbWU9IkV4cG9ydGVkMDAxIj4KLQk8L0V4cG9ydFBsdWdpbnM+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IkJhc2VfMSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0UGx1Z2lucyBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnRlZDAwMSI+Ci0JPC9JbXBvcnRQbHVnaW5zPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMCIKLQkJdXNlTmFtZUFzSWQ9ImZhbHNlIj4KLQkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMi8ybmRUZXN0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzJuZFRlc3QudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmEyODcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzJuZFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIuLi8uLi9FeHBvcnRJbXBvcnQvUGFyaXMiPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJQYXJpcyI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8RXhwb3J0Q29uZmlndXJhdGlvbiBleHBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIiBzZWxlY3RlZENvbmZpZ05hbWU9IkNvbmZpZyBBIj4KLQk8L0V4cG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IkJhc2VfMSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0Q29uZmlndXJhdGlvbiBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIj4KLQk8L0ltcG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IlBhcmlzIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIwIgotCQl1c2VOYW1lQXNJZD0iZmFsc2UiPgotCQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvZWRpdEFsbEVsZW1lbnRzLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvZWRpdEFsbEVsZW1lbnRzLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAyNmNmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL2VkaXRBbGxFbGVtZW50cy50YworKysgL2Rldi9udWxsCkBAIC0xLDU1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi08IS0tIFRoaXMgY2FzZSBpbmNsdWRlcyBjcmVhdGluZyBhbmQgZWRpdG5nIGFsbW9zdCBldmVyeSB0eXBlIG9mIG1laHRvZCBlbGVtZW50IC0tPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJhbGxFbGVtZW50cyI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi08IS0tIFBsdWcgQSAtLT4KLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnIEEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1ZyBBIgotCQlhdXRob3JzPSJQbHVnIEEgQXV0aG9yIgkKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCi08IS0tIGNvbnRlbnRfcGFja2FnZV9BMSAtLT4KLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDb250ZW50UGFja2FnZSIKLQkJbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBjb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIENvbmZpZ19BIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgQ29uZmlnX0EiCi0JCT4KLQkgIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JICAJPFZhbHVlPlBsdWcgQTwvVmFsdWU+Ci0gIAkgIDwvbWV0aG9kUGx1Z2luU2VsZWN0aW9uPgotCQkJCQkKLQkgIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotCSAgCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTE8L1ZhbHVlPgotICAJICA8L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkKLQkKLTwhLS0gcm9sZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJbmFtZT0icm9sZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvbGUgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEExIGtleSIKLQkJCXNraWxscz0iUm9sZSBBMSBza2lsbHMiCi0JCQlhc3NpZ25tZW50QXBwcm9hY2hlcz0iUm9sZSBBMSBhc3NpZyBBcHAiCi0JCQlzeW5vbnltcz0iUm9sZSBzeW4iCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSB0YXNrX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUYXNrIgotCQluYW1lPSJ0YXNrX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEga2V5IgotCQkJc2tpbGxzPSJUYXNrIEExIHNraWxscyIKLQkJCWFzc2lnbm1lbnRBcHByb2FjaGVzPSJUYXNrIEExIGFzc2lnIEFwcCIKLQkJCXN5bm9ueW1zPSJUYXNrIHN5biIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCQkKLQkJPG93bmVkUnVsZXMgYm9keT0iQm9keSAxIiAvPgotCQk8b3duZWRSdWxlcyBib2R5PSJCb2R5IDIiIC8+Ci0JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGFydGlmYWN0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJBcnRpZmFjdCIKLQkJbmFtZT0iYXJ0aWZhY3RfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmlmYWN0IEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZpZmFjdCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotPCEtLSBkZWxpdmVyYWJsZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iRGVsaXZlcmFibGUiCi0JCW5hbWU9ImRlbGl2ZXJhYmxlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEZWxpdmVyYWJsZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotPCEtLSBvdXRjb21lX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJPdXRjb21lIgotCQluYW1lPSJvdXRjb21lX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBjb25jZXB0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDb25jZXB0IgotCQluYW1lPSJjb25jZXB0X0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNvbmNlcHQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGNoZWNrbGlzdF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ2hlY2tsaXN0IgotCQluYW1lPSJjaGVja2xpc3RfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJDaGVja2xpc3QgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBleGFtcGxlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJFeGFtcGxlIgotCQluYW1lPSJleGFtcGxlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkV4YW1wbGUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkKLQkKLTwhLS0gZ3VpZGVsaW5lX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJHdWlkZWxpbmUiCi0JCW5hbWU9Imd1aWRlbGluZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9Ikd1aWRlbGluZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkKLQkJCi08IS0tIHJlcG9ydF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUmVwb3J0IgotCQluYW1lPSJyZXBvcnRfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSZXBvcnQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIHRlbXBsYXRlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUZW1wbGF0ZSIKLQkJbmFtZT0idGVtcGxhdGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRlbXBsYXRlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSBzdXBwb3J0aW5nX21hdGVyaWFsX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJTdXBwb3J0aW5nTWF0ZXJpYWwiCi0JCW5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nX21hdGVyaWFsIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iU3VwcG9ydGluZ19tYXRlcmlhbCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gdG9vbG1lbnRvcl9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iVG9vbE1lbnRvciIKLQkJbmFtZT0idG9vbG1lbnRvcl9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJUb29sbWVudG9yIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQotCi08IS0tIHdoaXRlcGFwZXJfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IldoaXRlcGFwZXIiCi0JCW5hbWU9IndoaXRlcGFwZXJfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iV2hpdGVwYXBlciBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIHByYWN0aWNlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJQcmFjdGljZSIKLQkJbmFtZT0icHJhY3RpY2VfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlByYWN0aWNlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSByZXVzYWJsZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUmV1c2FibGVBc3NldCIKLQkJbmFtZT0icmV1c2FibGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJldXNhYmxlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLTwhLS0gcm9hZG1hcF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9hZG1hcCIKLQkJbmFtZT0icm9hZG1hcF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSb2FkbWFwIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSB0ZXJtX2RlZmluaXRpb25fQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRlcm1EZWZpbml0aW9uIgotCQluYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJUZXJtX2RlZmluaXRpb24gQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJUZXJtX2RlZmluaXRpb24gQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGRpc2NpcGxpbmVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkRpc2NpcGxpbmUiCi0JCW5hbWU9ImRpc2NpcGxpbmVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHRhc2tzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExPC9WYWx1ZT4KLQkJPC90YXNrcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEaXNjaXBsaW5lR3JvdXBpbmciCi0JCW5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiCi0JCT4JCQkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lR3JvdXBpbmcgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lR3JvdXBpbmcgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPGRpc2NpcGxpbmVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMTwvVmFsdWU+Ci0JCTwvZGlzY2lwbGluZXM+CQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCQotPCEtLSBkaXNjaXBsaW5lX0EyIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEaXNjaXBsaW5lIgotCQluYW1lPSJkaXNjaXBsaW5lX0EyIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEEyIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkJCQkJCQotCQkKLTwhLS0gZG9tYWluX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEb21haW4iCi0JCW5hbWU9ImRvbWFpbl9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkRvbWFpbiBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8c3ViZG9tYWlucyAKLQkJCW5hbWU9InN1Yl9kb21haW5fQTEiCi0JCQk+Ci0JCQk8cHJlc2VudGF0aW9uCi0JCQkJbWFpbkRlc2NyaXB0aW9uPSJTdWIgRG9tYWluIEExIG1haW4iCi0JCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlN1YiBEb21haW4gQTEga2V5IgotCQkJCT4JCQkKLQkJCTwvcHJlc2VudGF0aW9uPgotCQk8L3N1YmRvbWFpbnM+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQotCQkKLTwhLS0gd29ya19wcm9kdWN0X3R5cGVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IldvcmtQcm9kdWN0VHlwZSIKLQkJbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iV29ya1Byb2R1Y3RUeXBlIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iV29ya1Byb2R1Y3RUeXBlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSByb2xlX3NldF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldCIKLQkJbmFtZT0icm9sZV9zZXRfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9sZVNldCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHJvbGVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExPC9WYWx1ZT4KLQkJPC9yb2xlcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSByb2xlX3NldF9ncm91cGluZ19BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldEdyb3VwaW5nIgotCQluYW1lPSJyb2xlX3NldF9ncm91cGluZ19BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyIKLQkJPgkJCQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvbGVTZXRHcm91cGluZyBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXRHcm91cGluZyBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8cm9sZVNldHM+Ci0JCQk8VmFsdWU+UGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMTwvVmFsdWU+Ci0JCTwvcm9sZVNldHM+CQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCQotPCEtLSByb2xlX3NldF9BMiAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldCIKLQkJbmFtZT0icm9sZV9zZXRfQTIiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9sZVNldCBBMiBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXQgQTIga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHJvbGVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExPC9WYWx1ZT4KLQkJPC9yb2xlcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JCi08IS0tIHRvb2xfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRvb2wiCi0JCW5hbWU9InRvb2xfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gc3ViX2N1c3RvbV9jYXRlZ29yeV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ3VzdG9tQ2F0ZWdvcnkiCi0JCW5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJzdWJfY3VzdG9tX2NhdGVnb3J5X0ExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gY3VzdG9tX2NhdGVnb3J5X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDdXN0b21DYXRlZ29yeSIKLQkJbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iY3VzdG9tX2NhdGVnb3J5X0ExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iY3VzdG9tX2NhdGVnb3J5X0ExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxjYXRlZ29yaXplZEVsZW1lbnRzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExPC9WYWx1ZT4KLQkJPC9jYXRlZ29yaXplZEVsZW1lbnRzPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8IS0tIGN1c3RvbV9jYXRlZ29yeV9BMiAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ3VzdG9tQ2F0ZWdvcnkiCi0JCW5hbWU9ImN1c3RvbV9jYXRlZ29yeV9BMiIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249ImN1c3RvbV9jYXRlZ29yeV9BMiBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9ImN1c3RvbV9jYXRlZ29yeV9BMiBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkN1c3RvbUNhdGVnb3J5IgotCQlwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuL0N1c3RvbSBDYXRlZ29yaWVzIgotCQk+CQotCQk8Y2F0ZWdvcml6ZWRFbGVtZW50cz4KLQkJCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExPC9WYWx1ZT4KLQkJCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyPC9WYWx1ZT4JCQkKLQkJPC9jYXRlZ29yaXplZEVsZW1lbnRzPgkJCQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkJCQkJCQotCQkKLTwhLS0gY2FwUGF0UGFrX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJQcm9jZXNzUGFja2FnZSIKLQkJbmFtZT0iY2FwUGF0UGFrX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCT4JCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gQ1AxIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJbmFtZT0iQ1AxIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkNQMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNQMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgotCQk8dmFsaWRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC92YWxpZENvbnRleHQ+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCi0JCi08IS0tIENQMV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCW5hbWU9IkNQMV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkNQMV9BMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNQMV9BMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgotCQk8dmFsaWRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC92YWxpZENvbnRleHQ+CQkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCi0JCi08IS0tIGRlbFByb2NQYWtfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJQcm9jZXNzUGFja2FnZSIKLQkJbmFtZT0iZGVsUHJvY1Bha19BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzIgotCQk+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLTwhLS0gRFAxIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEZWxpdmVyeVByb2Nlc3MiCi0JCW5hbWU9IkRQMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRFAxIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iRFAxIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+Ci0JCTx2YWxpZENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L3ZhbGlkQ29udGV4dD4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCi0JCQotCTxPdXRwdXRMaWJyYXJ5IG91dHB1dEZpbGVOYW1lPSJ0LnhtbCIvPgkKLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2YTZhNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnRjCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi08IS0tIDEuIENyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeSAtLT4JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9ImtlbHZpbkNhc2UiPgotCTwvT3BlbkxpYnJhcnk+CQotCQotPCEtLSAyLiBDcmVhdGUgYSBuZXcgcGx1Z2luXzEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9InBsdWdpbl8xIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBsdWdpbl8xIgotCQlhdXRob3JzPSJLZWx2aW4iCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCQotPCEtLSAzLiBDcmVhdGUgYSBuZXcgY29udGVudFBhY2thZ2VfMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ29udGVudFBhY2thZ2UiCi0JCW5hbWU9ImNvbnRlbnRQYWNrYWdlXzEiCi0JCXBhcmVudFBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSA0LiBDcmVhdGUgYSBuZXcgdGFza18xIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUYXNrIgotCQluYW1lPSJ0YXNrXzEiCi0JCXBhcmVudFBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudFBhY2thZ2VfMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0YXNrXzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gNS4gQ3JlYXRlIGEgbmV3IGNvbmZpZ18xIHRoYXQgaW5jbHVkZXMgcGx1Z2luXzEgJiBjb250ZW50UGFja2FnZV8xIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iY29uZmlnXzEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY29uZmlnXzEiCi0JCT4KLQkgIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JICAJPFZhbHVlPnBsdWdpbl8xPC9WYWx1ZT4KLSAgCSAgPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JCQkJCQotCSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci0JICAJPFZhbHVlPnBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudFBhY2thZ2VfMTwvVmFsdWU+Ci0gIAkgIDwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSA2LiBDcmVhdGUgYSBuZXcgY3BfMSB1c2luZyBjb25maWdfMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iY3BfMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBjcF8xIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPmNvbmZpZ18xPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4KLQkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCi08IS0tIDYuIEFkZCBhIG5ldyB0ZF8xIHRvIGNwXzEgdGhhdCBpcyBsaW5rZWQgdG8gdGFza18xIC0tPgkJCQotCTxOZXdNZXRob2RFbGVtZW50IAotCQl0eXBlPSJUYXNrRGVzY3JpcHRvciIKLQkJcGFyZW50UGF0aD0icGx1Z2luXzEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMSIKLQkJbmFtZT0idGRfMSIKLQkJPgotCQk8VGFzaz4KLQkJCTxWYWx1ZT5wbHVnaW5fMS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRQYWNrYWdlXzEvdGFza18xPC9WYWx1ZT4KLQkJPC9UYXNrPgkJCQkKLQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gNy4gU3VwcHJlc3MgdGRfMSAtLT4JCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgCi0JCXR5cGU9IlRhc2tEZXNjcmlwdG9yIgotCQlwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL3RkXzEiCi0JCXN1cHByZXNzZWQ9InRydWUiCi0JCT4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4gCQkJCi0JCi0JPE91dHB1dExpYnJhcnkgb3V0cHV0RmlsZU5hbWU9InQueG1sIi8+CQotCQotCTxDb21wYXJlVG9Hb2xkZW5GaWxlICAKLQkJZ29sZGVuRmlsZU5hbWU9ImtlbHZpbkNhc2UueG1sIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzNSIKLQkJPgotCTwvQ29tcGFyZVRvR29sZGVuRmlsZT4KLQkKLQkJCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL2tlbHZpbkNhc2UueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTM3M2QuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfZWI5LWNOQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0ia2VsdmluQ2FzZSIgb3JkZXJpbmdHdWlkZT0iIiBwYXRoPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08TWV0aG9kUGx1Z2luIGF1dGhvcnM9IktlbHZpbiIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBwbHVnaW5fMSIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iX2VoZi1zTkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9InBsdWdpbl8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi1zZEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXN0QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtczlCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdE5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXRkQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi10dEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdDlCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXVOQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdWRCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi11dEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il9laGYtdTlCV0VkeVNLT2NDTEx0VFpRIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1QbENGRTR4bzVvM1hPNWZsRXJZak5RIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX2VoZi11OUJXRWR5U0tPY0NMTHRUWlEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdk5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9lbWQtUU5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJjb250ZW50UGFja2FnZV8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFRhc2sgYnJpZWZEZXNjcmlwdGlvbj0iIiBndWlkPSJfZW0yWXdOQldFZHlTS09jQ0xMdFRaUSIgaXNBYnN0cmFjdD0iZmFsc2UiIG5hbWU9InRhc2tfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii0tN2tqeVVqUmZtdE9qa1Fwc0N6SFdRIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGFza18xIiBuYW1lPSJ0YXNrXzEsX2VtMll3TkJXRWR5U0tPY0NMTHRUWlEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwdXJwb3NlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08L1Rhc2s+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdmRCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VySnA4TkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9ImNwXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9lc3hha2RCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJ0ZF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFRhc2tEZXNjcmlwdG9yIGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iX2VzeGFrTkJXRWR5U0tPY0NMTHRUWlEiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc0Fic3RyYWN0PSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1BsYW5uZWQ9InRydWUiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgbmFtZT0idGRfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVmaXg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLUdQWU1uNThYZXphOThlTEFTbkJ3VHciIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJ0ZF8xLF9lc3hha05CV0VkeVNLT2NDTEx0VFpRIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2FnZUd1aWRhbmNlPSIiIHZlcnNpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0icGx1Z2luXzEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9jcF8xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0icGx1Z2luXzEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50UGFja2FnZV8xL3Rhc2tfMSI+Ci08L1Rhc2s+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwXzEiIGd1aWQ9Il9lcTljc2RCV0VkeVNLT2NDTEx0VFpRIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1MSlNXSXBvVEktazhuTmlUa2NwZ3pnIiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIiBuYW1lPSJjcF8xLF9lcTljc2RCV0VkeVNLT2NDTEx0VFpRIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHVycG9zZT0iIiBzY29wZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNhZ2VHdWlkYW5jZT0iIiB1c2FnZU5vdGVzPSIiIHZlcnNpb249IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL3RkXzEvdGRfMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9ImNvbmZpZ18xIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXZ0QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi12OUJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNvbmZpZ18xIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfZXFsQ01OQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iY29uZmlnXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxtZXRob2RQbHVnaW5TZWxlY3Rpb24gcGF0aD0icGx1Z2luXzEiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRQYWNrYWdlXzEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPC9NZXRob2RMaWJyYXJ5PgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1YzUxMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnRjCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld0xpYiI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwXzEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY3BfMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEiCQotCQk+CQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGNwXzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkKLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xIgotCQluYW1lPSJhY3RfMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBhY3RfMSIKLQkJPgkJCQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgYWN0XzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iUGhhc2UiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL2FjdF8xIgotCQluYW1lPSJwaGFzZV8xIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBoYXNlXzEiCi0JCT4JCQkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCQotCQotCTxPdXRwdXRMaWJyYXJ5IC8+CQotCQotCTxDb21wYXJlVG9Hb2xkZW5GaWxlICBkaXNhYmxlPSJmYWxzZSIKLQkJZ29sZGVuRmlsZU5hbWU9Im5ld0FjdGl2aXRpZXMueG1sIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzNCIKLQkJPgotCTwvQ29tcGFyZVRvR29sZGVuRmlsZT4KLQkKLQkJCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld0FjdGl2aXRpZXMueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGEwODAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfb09zMTBORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0ibmV3TGliIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iU29tZWJvZHkiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfb1VVOHNORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iUGx1Z19BIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVThzZER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHN0RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4czlEd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dE5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHRkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh0dER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dDlEd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHVORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dWREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh1dER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il9vVVU4dTlEd0VkeU03UHkxbXNTYVdnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1zTVdRYnM2M1FkTTZCQXlFQlhvUGRRIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX29VVTh1OUR3RWR5TTdQeTFtc1NhV2ciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dk5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHZkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFByb2Nlc3NDb21wb25lbnQgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vWHdFSWREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb2FJcHdkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iYWN0XzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb2FuSzRkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0icGhhc2VfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxQaGFzZSBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBoYXNlXzEiIGd1aWQ9Il9vYW5LNE5Ed0VkeU03UHkxbXNTYVdnIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJwaGFzZV8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIGFsdGVybmF0aXZlcz0iIiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZXh0ZXJuYWxJZD0iIiBndWlkPSItTUdGamFLRUp3b3dPdEM2NmJzRDM1dyIgaG93dG9TdGFmZj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0icGhhc2VfMSxfb2FuSzRORHdFZHlNN1B5MW1zU2FXZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHB1cnBvc2U9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzYWdlR3VpZGFuY2U9IiIgdmVyc2lvbj0iIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEvYWN0XzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1BoYXNlPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxBY3Rpdml0eSBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGFjdF8xIiBndWlkPSJfb2FJcHdORHdFZHlNN1B5MW1zU2FXZyIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzQWJzdHJhY3Q9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUGxhbm5lZD0idHJ1ZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgbmFtZT0iYWN0XzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlZml4PSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJGcmkgRmViIDAxIDEwOjA4OjAzIFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1UclZmdHlIUXJHNWc4VE5JVjNoTzJ3IiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBhY3RfMSIgbmFtZT0iYWN0XzEsX29hSXB3TkR3RWR5TTdQeTFtc1NhV2ciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwdXJwb3NlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2FnZUd1aWRhbmNlPSIiIHZlcnNpb249IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL2NwXzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEvcGhhc2VfMS9waGFzZV8xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwXzEiIGd1aWQ9Il9vWHdFSU5Ed0VkeU03UHkxbXNTYVdnIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJGcmkgRmViIDAxIDEwOjA4OjAzIFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1fWGE2cTRTZVV0VHI0ZDhQN2VvcUFnIiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIiBuYW1lPSJjcF8xLF9vWHdFSU5Ed0VkeU03UHkxbXNTYVdnIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHVycG9zZT0iIiBzY29wZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNhZ2VHdWlkYW5jZT0iIiB1c2FnZU5vdGVzPSIiIHZlcnNpb249IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9hY3RfMS9hY3RfMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IkNvbmZpZ19BIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHZ0RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh2OUR3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IkZyaSBGZWIgMDEgMTA6MDg6MDMgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il9vV19QSU5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDb25maWdfQSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPC9NZXRob2RMaWJyYXJ5PgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdNZXRob2RFbGVtZW50cy50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTI3ZmJiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnRjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld0xpYiI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIKLQkJbmFtZT0iUGx1Z1Rlc3QiCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX1Rlc3QiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJSTUMgdGVhbSBtZW1iZXIgQSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9IlBsdWdfQiIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0IiCi0JCWF1dGhvcnM9IlJNQyB0ZWFtIG1lbWJlciBCIgkKLQkJPgotCQk8YmFzZXM+Ci0JCQk8VmFsdWU+UGx1Z19BPC9WYWx1ZT4KLQkJPC9iYXNlcz4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIgotCQlwYXRoPSJQbHVnX0IiCi0JCT4KLQkJPGJhc2VzPgotCQkJPFZhbHVlPlBsdWdfQTA8L1ZhbHVlPgotCQk8L2Jhc2VzPgkJCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkJCQotCQkJCi0JPE5ld01ldGhvZENvbmZpZ3VyYXRpb24gZGlzYWJsZT0iZmFsc2UiCi0JCW5hbWU9IkNvbmZpZ19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RDb25maWd1cmF0aW9uPgotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkNvbnRlbnRQYWNrYWdlIgotCQluYW1lPSJDb250ZW50UGFja2FnZV8xIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9Db3JlQ29udGVudCIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJbmFtZT0icm9sZV8xIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9Db3JlQ29udGVudC9Db250ZW50UGFja2FnZV8xIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ29yZUNvbnRlbnQvQ29udGVudFBhY2thZ2VfMS9yb2xlXzEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IlJvbGUgMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpcyBhIGJyaWVmIGRzZXNjcmlwdGlvbiBvZiBSb2xlIDEiCi0JCT4KLQkJPHByZXNlbnRhdGlvbiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgUm9sZSAxIj4KLQkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkJCi0JCi0JPE91dHB1dExpYnJhcnkgZGlzYWJsZT0iZmFsc2UiIC8+Ci0JCi0JPE91dHB1dFBsdWdpbiBwYXRoPSJQbHVnX0EiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0UGx1Z2luPgotCQotCTxPdXRwdXRDb25maWd1cmF0aW9uIHBhdGg9IkNvbmZpZ19BIiByZWN1cnNpdmU9ImZhbHNlIj4KLQk8L091dHB1dENvbmZpZ3VyYXRpb24+Ci0JCi0JPENvbXBhcmVUb0dvbGRlbkZpbGUgCi0JCWdvbGRlbkZpbGVOYW1lPSJuZXdNZXRob2RFbGVtZW50cy54bWwiIAotCQlkaWZmQ291bnQ9IjAiIAotCQllbGVtZW50Q291bnQ9IjY0IgotCQk+Ci0JPC9Db21wYXJlVG9Hb2xkZW5GaWxlPgotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTBlMWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNUJaYVlOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0ibmV3TGliIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxNZXRob2RQbHVnaW4gY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVIT1ZrTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlBsdWdUZXN0IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZrZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVmt0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WazlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbE5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVmxkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZsdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbDlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm1OQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZtdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il81SE9WbTlCVkVkeWZhTGFKWXZXNFFnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii02SF9jRFFNX1FBYnpHNnlmUElKeFZBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsXzVIT1ZtOUJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9Wbk5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm5kQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm50QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZuOUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZFBsdWdpbiBhdXRob3JzPSJSTUMgdGVhbSBtZW1iZXIgQSIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81TzlWUWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJQbHVnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlF0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUTlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZSTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRvbWFpbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZSZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRpc2NpcGxpbmVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUnRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJSb2xlU2V0cyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlI5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iV1AgVHlwZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZTTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlRvb2xzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWU2RCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZTdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlM5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iSGlkZGVuIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPEN1c3RvbUNhdGVnb3J5IGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVPOVZUTkJWRWR5ZmFMYUpZdlc0UWciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLWFaQlNQcGFrVUluclc1MHF0R2pIa1EiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfNU85VlROQlZFZHlmYUxhSll2VzRRZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvcmVDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVUY3pzTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnRQYWNrYWdlXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Um9sZSBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGlzIGEgYnJpZWYgZHNlc2NyaXB0aW9uIG9mIFJvbGUgMSIgZ3VpZD0iXzVUcEE4TkJWRWR5ZmFMYUpZdlc0UWciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJyb2xlXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSAxIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIGFzc2lnbm1lbnRBcHByb2FjaGVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQwOjI1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii15WlBfcTlSLUhZUjNpX2doQ3JOSWdBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgUm9sZSAxIiBuYW1lPSJyb2xlXzEsXzVUcEE4TkJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBza2lsbHM9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHN5bm9ueW1zPSIiIHZlcnNpb249IiI+Ci08L1JvbGVEZXNjcmlwdGlvbj4KLTwvUm9sZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUOUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWVU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L01ldGhvZFBsdWdpbj4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iUk1DIHRlYW0gbWVtYmVyIEIiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19CIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQwOjI0IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVBWdndOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUGx1Z19CIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ3ZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnd0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2dzlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eE5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnhkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ4dEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eDlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnlOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ5dEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il81UFZ2eTlCVkVkeWZhTGFKWXZXNFFnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1xc1FKLS1ySk9hVklhOVBjNm1kNmpBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsXzVQVnZ5OUJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2ek5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnpkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnp0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ6OUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxiYXNlcyBwYXRoPSJQbHVnX0EiPgotPC9iYXNlcz4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IlRodSBKYW4gMzEgMTU6NDA6MjQgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81T2UwSU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb25maWdfVGVzdCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVAwUTROQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29uZmlnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTwvTWV0aG9kTGlicmFyeT4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iUk1DIHRlYW0gbWVtYmVyIEEiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNU85VlFkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUGx1Z19BIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IlBsdWdfQSIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlF0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlQ5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZVTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVAwUTROQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29uZmlnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcGF0aD0iQ29uZmlnX0EiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L1Rlc3Rlck91dHB1dD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4udGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmVjMTA1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4udGMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0ibmV3TGliIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxOZXdNZXRob2RQbHVnaW4gCi0JCW5hbWU9Ik15IDFzdCBwbHVnaW4iCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gYWJveXQgdGhlIDFzdCBwbHVnaW4iCi0JCWF1dGhvcnM9Im5hbWUgMSwgbmFtZTIsIG5hbWUzIGV0YyIJCi0JCT4JCi0JPC9OZXdNZXRob2RQbHVnaW4+Ci0JCi0JPE5ld01ldGhvZFBsdWdpbiBkaXNhYmxlPSJmYWxzZSIKLQkJbmFtZT0iTXkgMm5kIHBsdWdpbiIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBhYm95dCB0aGUgMm5kIHBsdWdpbiIKLQkJYXV0aG9ycz0ibmFtZSAxMSwgbmFtZTIyLCBuYW1lMzMgZXRjIgkKLQkJPgotCQk8YmFzZXM+Ci0JCQk8VmFsdWU+TXkgMXN0IHBsdWdpbjwvVmFsdWU+Ci0JCTwvYmFzZXM+CQkJCi0JPC9OZXdNZXRob2RQbHVnaW4+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld01ldGhvZFBsdWdpbiI+Ci0JPC9Db3B5TGlicmFyeT4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0ibmV3TWV0aG9kUGx1Z2luIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzMyIKLQkJdXNlTmFtZUFzSWQ9InRydWUiCi0JCT4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4JCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4vTXkgMXN0IHBsdWdpbi9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAxc3QgcGx1Z2luL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZGNiZmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAxc3QgcGx1Z2luL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgcm1jOnZlcnNpb249IjcuMS4wIiBlcGY6dmVyc2lvbj0iMS4wLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX2VVN05VRnUwRWR1c3FPY1VqeGNSMXciIGd1aWQ9Il9lVTdOVUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9lVTFHc0Z1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJNeSAxc3QgcGx1Z2luIiBndWlkPSJfZVUxR3NGdTBFZHVzcU9jVWp4Y1IxdyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBhYm95dCB0aGUgMXN0IHBsdWdpbiIgYXV0aG9ycz0ibmFtZSAxLCBuYW1lMiwgbmFtZTMgZXRjIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUdzVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9lVTFHc1Z1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHc2x1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfZVUxR3NsdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHczF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEb21haW5zIiBndWlkPSJfZVUxR3MxdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3RGdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9lVTFHdEZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdFZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX2VVMUd0VnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd0bHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfZVUxR3RsdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3QxdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9lVTFHdDF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdUZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9lVTFHdUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdVZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfZVUxR3VWdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd1bHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX2VVMUd1bHUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfZVUxR3UxdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9lVTFHdTF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3ZGdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il9lVTFHdkZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVUxR3ZWdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfZVUxR3ZWdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdmx1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX2VVMUd2bHUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VVMUd2MXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfZVUxR3YxdTBFZHVzcU9jVWp4Y1IxdyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAybmQgcGx1Z2luL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDJuZCBwbHVnaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMDVhZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDJuZCBwbHVnaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBybWM6dmVyc2lvbj0iNy4xLjAiIGVwZjp2ZXJzaW9uPSIxLjAuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfZVZOaE1GdTBFZHVzcU9jVWp4Y1IxdyIgZ3VpZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9Ik15IDJuZCBwbHVnaW4iIGd1aWQ9Il9lVkhha0Z1MEVkdXNxT2NVanhjUjF3IiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIGFib3l0IHRoZSAybmQgcGx1Z2luIiBhdXRob3JzPSJuYW1lIDExLCBuYW1lMjIsIG5hbWUzMyBldGMiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWtWdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX2VWSGFrVnUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFrbHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9lVkhha2x1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFrMXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9lVkhhazF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbEZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX2VWSGFsRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFsVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfZVZIYWxWdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWxsdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9lVkhhbGx1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbDF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJUb29scyIgZ3VpZD0iX2VWSGFsMXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFtRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX2VWSGFtRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFtVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9lVkhhbVZ1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYW1sdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iSGlkZGVuIiBndWlkPSJfZVZIYW1sdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9lVkhhbTF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX2VWSGFtMXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbkZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX2VWSGFuRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhblZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9lVkhhblZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VWSGFubHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfZVZIYW5sdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVZIYW4xdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9lVkhhbjF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPGJhc2VzIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmMDkzNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHJtYzp2ZXJzaW9uPSI3LjEuMCIgZXBmOnZlcnNpb249IjEuMC4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9lUDNISUZ1MEVkdXNxT2NVanhjUjF3IiBndWlkPSJfZVAzSElGdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX2VVN05VRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTdOVUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVkhha0Z1MEVkdXNxT2NVanhjUjF3I19lVk5oTUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZVAzSElWdTBFZHVzcU9jVWp4Y1IxdyIgaWQ9Il9lUHhBZ0Z1MEVkdXNxT2NVanhjUjF3IiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VVN05VVnUwRWR1c3FPY1VqeGNSMXciIGlkPSJfZVU3TlVGdTBFZHVzcU9jVWp4Y1IxdyIgdXJpPSJNeSUyMDFzdCUyMHBsdWdpbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZVU3TlVsdTBFZHVzcU9jVWp4Y1IxdyIgaWQ9Il9lVTFHc0Z1MEVkdXNxT2NVanhjUjF3IiB1cmk9Ik15JTIwMXN0JTIwcGx1Z2luL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9lVk5oTVZ1MEVkdXNxT2NVanhjUjF3IiBpZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciIHVyaT0iTXklMjAybmQlMjBwbHVnaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VWTmhNbHUwRWR1c3FPY1VqeGNSMXciIGlkPSJfZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyIgdXJpPSJNeSUyMDJuZCUyMHBsdWdpbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX2VQeEFnRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9Im5ld0xpYiIgZ3VpZD0iX2VQeEFnRnUwRWR1c3FPY1VqeGNSMXciPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyIgaHJlZj0idW1hOi8vX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXcjX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjIxNDgudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjIxNDgudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMGI0OGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTYyMTQ4LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9InRydWUiPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNjIxNDgiPgotCTwvT3BlbkxpYnJhcnk+CQotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9IlBsdWdfQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiCi0JCWF1dGhvcnM9IlNvbWVib2R5IgkKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxOZXdNZXRob2RFbGVtZW50IAotCQl0eXBlPSJNZXRob2RDb25maWd1cmF0aW9uIgotCQluYW1lPSJDb25maWdfQSIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJCIgotCQlwcmVzZW50YXRpb25OYW1lPSJCIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIEIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CIgotCQluYW1lPSJCMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQjEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CL0IxIgotCQluYW1lPSJCMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQjIiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBBIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDIgotCQlwcmVzZW50YXRpb25OYW1lPSJDIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIEMiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CIgotCQl2YXJpYWJpbGl0eVR5cGU9ImNvbnRyaWJ1dGVzIgotCQk+CQkJCQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIEIiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0E8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgQyI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0IvQjEvQjIiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBCMiI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQzwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgCi0JCWVycm9yQ291bnQ9IjEiCi0JCWNpcmN1bGFyRWxlbWVudENvdW50PSI1IgotCQk+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjk1MDEudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjk1MDEudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTA0ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTY5NTAxLnRjCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSIgdmVyYm9zZT0idHJ1ZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE2OTUwMSI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iY3AxIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwMSIKLQkJbmFtZT0iYTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iY3AyIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcDIiCi0JCW5hbWU9ImEyIgotCQlwcmVzZW50YXRpb25OYW1lPSJhMiIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3AxL2ExIgotCQl2YXJpYWJpbGl0eVR5cGU9ImNvbnRyaWJ1dGVzIgotCQk+CQkJCQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGExIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcDIvYTI8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIGVycm9yQ291bnQ9IjAiPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwMjk0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwMjk0LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWY2ZjU5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE3MDI5NC50YworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE3MDI5NCI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCQkJCQkJCQotCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1BhIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUGEiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhIgotCQluYW1lPSJhMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhL2ExIgotCQluYW1lPSJhMTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImExMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEvYTExIgotCQluYW1lPSJhMTExIgotCQlwcmVzZW50YXRpb25OYW1lPSJhMTExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkNQYiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1BiIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYiIKLQkJbmFtZT0iYjEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImIxIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9iMSIKLQkJbmFtZT0iYjExIgotCQlwcmVzZW50YXRpb25OYW1lPSJiMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiL2IxL2IxMSIKLQkJbmFtZT0iYjExMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYjExMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iY29udHJpYnV0ZXMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGIvYjE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEvYTExL2ExMTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9iMTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgCi0JCWVycm9yQ291bnQ9IjIiCi0JCWNpcmN1bGFyRWxlbWVudENvdW50PSI5IgotCQk+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzA1OTcudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzA1OTcudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWYyNDUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwNTk3LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTcwNTk3Ij4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJTb21lYm9keSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUDEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkNQMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AyIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1AzIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUDMiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AxIgotCQluYW1lPSJDUDIiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMiIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AyIgotCQluYW1lPSJDUDMiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMyIKLQkJPgkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDMiCi0JCW5hbWU9IkNQMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AxIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0KLQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDEvQ1AyIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDI8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkKLQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDIvQ1AzIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDM8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDMvQ1AxIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIAotCQllcnJvckNvdW50PSIxIgotCQljaXJjdWxhckVsZW1lbnRDb3VudD0iNiIKLQkJPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcxMDI4LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcxMDI4LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ0ZDc0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE3MTAyOC50YworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE3MTAyOCI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkKLQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUGEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQYSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYSIKLQkJbmFtZT0iQTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9BMSIKLQkJbmFtZT0iQTExIgotCQlwcmVzZW50YXRpb25OYW1lPSJBMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1BiIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUGIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYiIKLQkJbmFtZT0iQjEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkIxIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9CMSIKLQkJbmFtZT0iQjExIgotCQlwcmVzZW50YXRpb25OYW1lPSJCMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9BMS9BMTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9CMS9CMTE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGIvQjEvQjExIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgQjExIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvQTE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIAotCQllcnJvckNvdW50PSIxIgotCQljaXJjdWxhckVsZW1lbnRDb3VudD0iMyIKLQkJPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmRiODQ3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IExpYnJhcnkgVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlciwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLlRlc3RzUGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5YzUxMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIExpYnJhcmllcy8KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlEaWZmQW5hbHl6b3IuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlEaWZmQW5hbHl6b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhNDFmOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5RGlmZkFuYWx5em9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0VHJhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotCi0vKioKLSAqIENsYXNzIHRvIGFuYWx5emUgdGhlIGRpZmZlcm5lY2VzIGJldHdlZW4gdHdvIG1ldGhvZCBsaWJyYXJpZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlEaWZmQW5hbHl6b3IgewotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXN0VHJhY2VyIHRyYWNlcjsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliMTsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGJpMjsKLQlwcml2YXRlIGJvb2xlYW4gZ3JlZWR5ID0gdHJ1ZTsKLQlwcml2YXRlIGludCBjb21wYXJlT3B0aW9uID0gMTsJCS8vMDogZWxlbWVudDEgYW5kIGVsZW1lbnQyIGFyZSBvbiBlcXVhbCBmb290aW5nLCAvLzE6IGVsZW1lbnQxIGlzIGEgc3VwZXIgc2V0IG9mIGVsZW1lbnQyCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb0FuYWx5emUgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBjb21wYXJlUmVzdWx0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZGlmZkNvdW50ID0gMDsKLQlwcml2YXRlIGludCBlbGVtQ29tcGFyZWRDb3VudCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVtcHR5U3RyaW5nID0gIiI7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBlbXB0eUxpbmUgPSBQYXR0ZXJuLmNvbXBpbGUoIlxccyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJpbSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljICBib29sZWFuIHNraXBSZWYgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlTmFtZUFzMm5kSWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBTZXQgc2tpcEZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIExpYnJhcnlEaWZmQW5hbHl6b3IoVGVzdFRyYWNlciB0LCBNZXRob2RMaWJyYXJ5IGwxLCBNZXRob2RMaWJyYXJ5IGwyKSB7Ci0JCXRyYWNlciA9IHQ7Ci0JCWxpYjEgPSBsMTsKLQkJbGJpMiA9IGwyOwotCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKChNZXRob2RMaWJyYXJ5KSBsaWIxKTsKLQkJTGlicmFyeVV0aWwubG9hZEFsbCgoTWV0aG9kTGlicmFyeSkgbGJpMik7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VHJpbShib29sZWFuIGIpIHsKLQkJdHJpbSA9IGI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTa2lwUmVmKGJvb2xlYW4gYikgewotCQlza2lwUmVmID0gYjsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeGNsdWRlZEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXNraXBGZWF0dXJlU2V0LmFkZChmZWF0dXJlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplKCkgewotCQlpZiAoISBuZWVkVG9BbmFseXplKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY29tcGFyZVJlc3VsdCA9IGVsZW1lbnRFcXVhbHMobGliMSwgbGJpMik7Ci0JCW5lZWRUb0FuYWx5emUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKCkgewotCQlhbmFseXplKCk7Ci0JCXJldHVybiBjb21wYXJlUmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHcmVlZHkoYm9vbGVhbiBiKSB7Ci0JCWlmIChncmVlZHkgIT0gYikgewotCQkJbmVlZFRvQW5hbHl6ZSA9IHRydWU7Ci0JCX0KLQkJZ3JlZWR5ID0gYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyZU9wdGlvbihpbnQgaXgpIHsKLQkJaWYgKGNvbXBhcmVPcHRpb24gIT0gaXgpIHsKLQkJCW5lZWRUb0FuYWx5emUgPSB0cnVlOwotCQl9Ci0JCWNvbXBhcmVPcHRpb24gPSBpeDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZU5hbWVBczJuZElkKGJvb2xlYW4gYikgewotCQl1c2VOYW1lQXMybmRJZCA9IGI7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQlpZiAodHJhY2VyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cmFjZXIudHJhY2UobGluZSk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCX0KLQl9Ci0JCi0JLy9Ub3AgZW50cnkgZm9yIGNvbXBhcml6b24KLQlwdWJsaWMgYm9vbGVhbiBlbGVtZW50RXF1YWxzKE1ldGhvZEVsZW1lbnQgZWxlbTEsICBNZXRob2RFbGVtZW50IGVsZW0yKSB7Ci0JCWRpZmZDb3VudCA9IDA7Ci0JCWVsZW1Db21wYXJlZENvdW50ID0gMDsKLQkJdHJhY2UoIiIpOwotCQl0cmFjZSgiZWxlbWVudEVxdWFscyAtPiAiKTsKLQkJdHJhY2UoImVsZW0xOiAiICsgZWxlbTEpOwotCQl0cmFjZSgiZWxlbTI6ICIgKyBlbGVtMiArICJcbiIpOwotCQljb21wYXJlKG5ldyBBcnJheUxpc3QoKSwgZWxlbTEsIGVsZW0yLCBuZXcgSGFzaE1hcCgpKTsKLQkJdHJhY2UoImVsZW1lbnRFcXVhbHMgPC0gZGlmZnM6ICIgKyBkaWZmQ291bnQgKyAiLCBlbGVtZW50czogIiArIGVsZW1Db21wYXJlZENvdW50ICsgIlxuIik7Ci0JCXJldHVybiBkaWZmQ291bnQgPT0gMDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCAgTWV0aG9kRWxlbWVudCBlbGVtMiwgTWFwIGNvbXBhcmVkRWxlbU1hcCkgewotCQlwYXRoLmFkZChlbGVtMSk7Ci0JCWVsZW1Db21wYXJlZENvdW50Kys7Ci0JCWNvbXBhcmVfKHBhdGgsIGVsZW0xLCBlbGVtMiwgY29tcGFyZWRFbGVtTWFwKTsKLQkJcGF0aC5yZW1vdmUocGF0aC5zaXplKCkgLSAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVfKExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgIE1ldGhvZEVsZW1lbnQgZWxlbTIsIE1hcCBjb21wYXJlZEVsZW1NYXApIHsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCXRyYWNlKCJwYXRoOiAiICsgcGF0aFRvU3RyaW5nKHBhdGgpKTsKLQkJfQkJCQkKLQkJCi0JCWJvb2xlYW4gdG9wTGV2ZWwgPSBlbGVtMSA9PSBsaWIxICYmIGVsZW0yID09IGxiaTI7Ci0JCWJvb2xlYW4gY2hlY2tFcXVhbFNpemUgPSBjb21wYXJlT3B0aW9uID09IDAgJiYgIXRvcExldmVsOwotCQkKLQkJTGlzdCBjb250ZW50TGlzdDEgPSBlbGVtMS5lQ29udGVudHMoKTsKLQkJTGlzdCBjb250ZW50TGlzdDIgPSBlbGVtMi5lQ29udGVudHMoKTsKLQkJaW50IHN6MSA9IGNvbnRlbnRMaXN0MS5zaXplKCk7Ci0JCWludCBzejIgPSBjb250ZW50TGlzdDIuc2l6ZSgpOwotCQkKLQkJaWYgKCBjaGVja0VxdWFsU2l6ZSAmJiBzejEgIT0gc3oyKSB7Ci0JCQlTdHJpbmcgbXNnID0gInN6MSAhPSBzejI6ICIgKyBzejEgKyAiICE9ICIgKyBzejI7Ci0JCQlsb2dXYXJuaW5nKG1zZywgcGF0aCwgZWxlbTEsIGVsZW0yKTsJCQotCQl9CQkKLQkJCi0JCWludCBlbGVtQ291bnQxID0gMDsKLQkJSGFzaE1hcCBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSGFzaE1hcCBlbGVtZW50TmFtZU1hcCA9IHVzZU5hbWVBczJuZElkID8gbmV3IEhhc2hNYXAoKSA6IG51bGw7Ci0JCUhhc2hNYXAgZWxlbWVudENoaWxkTWFwID0gdXNlTmFtZUFzMm5kSWQgPyBuZXcgSGFzaE1hcCgpIDogbnVsbDsKLQkJZm9yIChpbnQgaT0wOyBpIDwgc3oxOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjb250ZW50TGlzdDEuZ2V0KGkpOwotCQkJaWYgKHRvQ2hlY2tPYmplY3Qob2JqKSkgewotCQkJCWVsZW1Db3VudDErKzsKLQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRHdWlkKCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQkJCWlmICghIGNvbXBhcmVkRWxlbU1hcC5jb250YWluc0tleShndWlkKSkgewotCQkJCQllbGVtZW50TWFwLnB1dChndWlkLCBvYmopOwotCQkJCQlpZiAodXNlTmFtZUFzMm5kSWQpIHsKLQkJCQkJCU9iamVjdCBvYmpJbk1hcCA9IGVsZW1lbnROYW1lTWFwLmdldChuYW1lKTsKLQkJCQkJCWlmIChvYmpJbk1hcCA9PSBudWxsKSB7Ci0JCQkJCQkJZWxlbWVudE5hbWVNYXAucHV0KG5hbWUsIG9iaik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUxpc3QgbGlzdCA9IG51bGw7Ci0JCQkJCQkJaWYgKG9iakluTWFwIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJCQlsaXN0ID0gKExpc3QpIG9iakluTWFwOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCWxpc3QuYWRkKG9iakluTWFwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbGlzdC5hZGQob2JqKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJTGlzdCBjaGlsZExpc3QgPSBudWxsOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQljaGlsZExpc3QgPSAoKE1ldGhvZFBhY2thZ2UpIG9iaikuZUNvbnRlbnRzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY2hpbGRMaXN0ICE9IG51bGwgJiYgISBjaGlsZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBjaDAgPSAoTWV0aG9kRWxlbWVudCkgY2hpbGRMaXN0LmdldCgwKTsKLQkJCQkJCQllbGVtZW50Q2hpbGRNYXAucHV0KGNoMC5nZXRHdWlkKCksIG9iaik7Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWNvbXBhcmVkRWxlbU1hcC5wdXQoZ3VpZCwgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IGVsZW1Db3VudDIgPSAwOwotCQlmb3IgKGludCBpPTA7IGkgPCBzejI7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGNvbnRlbnRMaXN0Mi5nZXQoaSk7Ci0JCQlpZiAodG9DaGVja09iamVjdChvYmopKSB7Ci0JCQkJZWxlbUNvdW50MisrOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtQ291bnQxIDwgZWxlbUNvdW50MiB8fCBlbGVtQ291bnQxID4gZWxlbUNvdW50MiAmJiBjaGVja0VxdWFsU2l6ZSkgewotCQkJU3RyaW5nIG1zZyA9ICJlbGVtQ291bnQxICE9IGVsZW1Db3VudDI6ICIgKyBlbGVtQ291bnQxICsgIiAhPSAiICsgZWxlbUNvdW50MjsKLQkJCWxvZ0RpZmYobXNnLCBwYXRoLCBlbGVtMSwgZWxlbTIpOwotCQkJaWYgKCFncmVlZHkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaWYgKCEgKGVsZW0xIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCUxpc3QgcHJvcGVydGllcyA9IGVsZW0xLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVByb3BlcnR5IGVwID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBlcC5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJCQlpZiAoc2tpcEZlYXR1cmVTZXQuY29udGFpbnMoZmVhdHVyZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlPYmplY3QgdmFsMSA9ICIxIC4uLiA/IjsKLQkJCQlPYmplY3QgdmFsMiA9ICIyIC4uLiA/IjsKLQkJCQl0cnkgewotCQkJCQl2YWwxID0gZWxlbTEuZUdldChmZWF0dXJlKTsKLQkJCQkJdmFsMiA9IGVsZW0yLmVHZXQoZmVhdHVyZSk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsJCQkJCQotCQkJCX0KLQkJCQlpZiAoISBmZWF0dXJlVmFsdWVFcXVhbHModmFsMSwgdmFsMikpIHsKLQkJCQkJaWYgKGZlYXR1cmUuZ2V0TmFtZSgpICE9ICJndWlkIiB8fCAhdXNlTmFtZUFzMm5kSWQpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSAiRGlmZiB2YWx1ZXMgaW4gZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJCQkJbG9nRGlmZihtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgdmFsMSwgdmFsMik7Ci0JCQkJCQlpZiAoIWdyZWVkeSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQkvL0NvbXBhcmUgZm9yIGNvbnRhaW5lZCBlbGVtZW50cwkJCi0JCWZvciAoaW50IGk9MDsgaSA8IHN6MjsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gY29udGVudExpc3QyLmdldChpKTsKLQkJCWlmICghIHRvQ2hlY2tPYmplY3Qob2JqKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IHN1YkVsZW0yID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCU1ldGhvZEVsZW1lbnQgc3ViRWxlbTEgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudE1hcC5nZXQoc3ViRWxlbTIuZ2V0R3VpZCgpKTsKLQkJCWlmICh1c2VOYW1lQXMybmRJZCAmJiBzdWJFbGVtMSA9PSBudWxsKSB7Ci0JCQkJT2JqZWN0IHN1Yk9iajEgPSBlbGVtZW50TmFtZU1hcC5nZXQoc3ViRWxlbTIuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoc3ViT2JqMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJc3ViRWxlbTEgPSAoTWV0aG9kRWxlbWVudCkgIHN1Yk9iajE7Ci0JCQkJfSBlbHNlIGlmIChzdWJPYmoxIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlsb2dXYXJuaW5nKCJzdWJPYmoxIGlzIGxpc3Q6ICIgKyBzdWJPYmoxLnRvU3RyaW5nKCksIHBhdGgsIHN1YkVsZW0xLCBzdWJFbGVtMik7CQkJCi0JCQkJfQotCQkJCWlmIChzdWJFbGVtMSA9PSBudWxsICYmIHN1YkVsZW0yIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlMaXN0IGNoaWxkTGlzdCA9ICgoTWV0aG9kUGFja2FnZSkgc3ViRWxlbTIpLmVDb250ZW50cygpOwotCQkJCQlpZiAoY2hpbGRMaXN0ICE9IG51bGwgJiYgISBjaGlsZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGNoMCA9IChNZXRob2RFbGVtZW50KSBjaGlsZExpc3QuZ2V0KDApOwotCQkJCQkJc3ViRWxlbTEgPSAgKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRDaGlsZE1hcC5nZXQoY2gwLmdldEd1aWQoKSk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfQotCQkJaWYgKHN1YkVsZW0xID09IG51bGwpIHsKLQkJCQlsb2dEaWZmKCJzdWJFbGVtMSA9PSBudWxsIiAsIHBhdGgsIHN1YkVsZW0xLCBzdWJFbGVtMik7CQkJCi0JCQkJaWYgKCFncmVlZHkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0JCQkKLQkJCWNvbXBhcmUocGF0aCwgc3ViRWxlbTEsIHN1YkVsZW0yLCBjb21wYXJlZEVsZW1NYXApOwkJCQotCQkJaWYgKGRpZmZDb3VudCA+IDAgJiYgIWdyZWVkeSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQkJCQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBmZWF0dXJlVmFsdWVFcXVhbHMoT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWlmICh2YWwxID09IG51bGwpIHsKLQkJCXJldHVybiB2YWwyID09IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh2YWwyID09IG51bGwpIHsKLQkJCXJldHVybiB2YWwxID09IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh2YWwxIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJaWYgKCEgKHZhbDEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWJvb2xlYW4gYiAgPSAoKE1ldGhvZEVsZW1lbnQpIHZhbDEpLmdldEd1aWQoKS5lcXVhbHMoKChNZXRob2RFbGVtZW50KSB2YWwxKS5nZXRHdWlkKCkpOwotCQkJaWYgKCFiICYmIHVzZU5hbWVBczJuZElkKSB7Ci0JCQkJYiA9ICgoTWV0aG9kRWxlbWVudCkgdmFsMSkuZ2V0TmFtZSgpLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpIHZhbDEpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYjsKLQkJfQkJCQkKLQkJCi0JCWludCBvcHRpb24gPSAwOyAJLy8wOiBub3QgdG8gY29tcGFyZSBsaXN0IHZhbHVlcwotCQkJCQkJCS8vMTogICAgICAgIGNvbXBhcmUgbGlzdCB2YWx1ZXMKLQkJCQkJCQkvLzI6CQljb21wYXJlIHNpemUgc3RyaWN0bHkKLQkJaWYgKG9wdGlvbiA+IDAgJiYgdmFsMSBpbnN0YW5jZW9mIExpc3QpIHsJCQkKLQkJCWlmICghICh2YWwyIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaXN0IGwxID0gKExpc3QpIHZhbDE7Ci0JCQlMaXN0IGwyID0gKExpc3QpIHZhbDI7Ci0JCQlpZiAobDEuc2l6ZSgpIDwgbDIuc2l6ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAob3B0aW9uID4gMSAmJiBsMS5zaXplKCkgPiBsMi5zaXplKCkpIHsJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJYm9vbGVhbiBtZSA9IGwxLnNpemUoKSA9PSAwID8gZmFsc2UgOiBsMS5nZXQoMCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50OwotCQkJaWYgKG1lKSB7Ci0JCQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJTWFwIG5hbWVNYXAgPSB1c2VOYW1lQXMybmRJZCA/IG5ldyBIYXNoTWFwKCkgOiBudWxsOwotCQkJCWZvciAoaW50IGk9MDsgaTxsMS5zaXplKCk7IGkrKykgewotCQkJCQlNZXRob2RFbGVtZW50IGUxID0gKE1ldGhvZEVsZW1lbnQpIGwxLmdldChpKTsKLQkJCQkJbWFwLnB1dChlMS5nZXRHdWlkKCksIGUxKTsKLQkJCQkJaWYgKHVzZU5hbWVBczJuZElkKSB7Ci0JCQkJCQluYW1lTWFwLnB1dChlMS5nZXROYW1lKCksIGUxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKGludCBpPTA7IGk8bDIuc2l6ZSgpOyBpKyspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlMiA9IChNZXRob2RFbGVtZW50KSBsMi5nZXQoaSk7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBtYXAuY29udGFpbnNLZXkoZTIuZ2V0R3VpZCgpKSB8fCAKLQkJCQkJCQl1c2VOYW1lQXMybmRJZCAmJiBuYW1lTWFwLmNvbnRhaW5zS2V5KGUyLmdldE5hbWUoKSk7Ci0JCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0JCQkJCQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8bDEuc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKCEgKGZlYXR1cmVWYWx1ZUVxdWFscyhsMS5nZXQoaSksIGwyLmdldChpKSkpKSAgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCWlmICh2YWwxIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlpZiAoISh2YWwyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVN0cmluZyBzdHIxID0gKFN0cmluZykgdmFsMTsKLQkJCVN0cmluZyBzdHIyID0gKFN0cmluZykgdmFsMjsKLQkJCWlmIChza2lwUmVmKSB7Ci0JCQkJc3RyMSA9IHJlcGxhY2VSZWZXaXRoRHVtbXkoc3RyMSk7Ci0JCQkJc3RyMiA9IHJlcGxhY2VSZWZXaXRoRHVtbXkoc3RyMik7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0cmltKSB7Ci0JCQkJc3RyMSA9IHN0cjEudHJpbSgpOwotCQkJCXN0cjIgPSBzdHIyLnRyaW0oKTsKLQkJCQlpZiAodXNlTmFtZUFzMm5kSWQgJiYgc3RyMS5sZW5ndGgoKSA+IDI1MCAmJiBzdHIyLmxlbmd0aCgpID4gMjUwKSB7Ci0JCQkJCXN0cjEgPSBzdHIxLnN1YnN0cmluZygwLCAyNTApOwotCQkJCQlzdHIyID0gc3RyMi5zdWJzdHJpbmcoMCwgMjUwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyMS5lcXVhbHMoc3RyMik7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGludCBpbmNEaWZmQ291bnQoKSB7Ci0JCXJldHVybiArK2RpZmZDb3VudDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGlmZlByb21wdCgpIHsKLQkJcmV0dXJuICJEXyIgKyBkaWZmQ291bnQgKyAiPiAiOwkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1zZywgTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCBNZXRob2RFbGVtZW50IGVsZW0yKSB7Ci0JCWxvZyhtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgZmFsc2UpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgTWV0aG9kRWxlbWVudCBlbGVtMikgewotCQlsb2cobXNnLCBwYXRoLCBlbGVtMSwgZWxlbTIsIHRydWUpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZywgTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCBNZXRob2RFbGVtZW50IGVsZW0yLCBib29sZWFuIGRpZmYpIHsKLQkJaWYgKGRpZmYpIHsKLQkJCWluY0RpZmZDb3VudCgpOwotCQl9Ci0JCVN0cmluZyBwcm9tcHQgPSBkaWZmID8gZ2V0RGlmZlByb21wdCgpIDogIldhcm5pbmc+ICI7Ci0JCXRyYWNlKHByb21wdCArICJwYXRoOiAiICsgcGF0aFRvU3RyaW5nKHBhdGgpKTsKLQkJdHJhY2UocHJvbXB0ICsgIm1zZzogIiArIG1zZyk7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbTAgPSAoTWV0aG9kRWxlbWVudCkgcGF0aC5nZXQocGF0aC5zaXplKCkgLSAxKTsKLQkJaWYgKGVsZW0wICE9IGVsZW0xKSB7Ci0JCQl0cmFjZShwcm9tcHQgKyBnZXRFbGVtU3RyaW5nKGVsZW0wLCAiZWxlbTAiKSk7Ci0JCX0KLQkJdHJhY2UocHJvbXB0ICsgZ2V0RWxlbVN0cmluZyhlbGVtMSwgImVsZW0xIikpOwotCQl0cmFjZShwcm9tcHQgKyBnZXRFbGVtU3RyaW5nKGVsZW0yLCAiZWxlbTIiKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1TdHJpbmcoTWV0aG9kRWxlbWVudCBlbGVtLCBTdHJpbmcgbGFiZWwpIHsKLQkJU3RyaW5nIHN0ciA9IGxhYmVsOwotCQlpZiAoZWxlbSA9PSBudWxsKSB7Ci0JCQlzdHIgKz0gIiAtPiBudWxsIjsKLQkJfSBlbHNlIHsJCQotCQkJc3RyICs9ICIgLT4gdHlwZTogIiArIGdldENsYXNzTGFzdE5hbWUoZWxlbSkgKyAiLCBuYW1lOiAiICsgZWxlbS5nZXROYW1lKCkgKyAiLCBndWlkOiAiICsgZWxlbS5nZXRHdWlkKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NMYXN0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWludCBpeCA9IHN0ci5sYXN0SW5kZXhPZigiLiIpICsgMTsKLQkJcmV0dXJuIHN0ci5zdWJzdHJpbmcoaXgpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgTWV0aG9kRWxlbWVudCBlbGVtMiwgT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWxvZyhtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgdHJ1ZSk7Ci0JCVN0cmluZyBwcm9tcHQgPSBnZXREaWZmUHJvbXB0KCk7Ci0JCXRyYWNlKHByb21wdCArICJ2YWwxOiAiICsgdmFsMSk7Ci0JCXRyYWNlKHByb21wdCArICJ2YWwyOiAiICsgdmFsMik7CQotCQl0cmFjZSgiIik7Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGF0aFRvU3RyaW5nKExpc3QgcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpPTA7IGk8cGF0aC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIHBhdGguZ2V0KGkpOwotCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1Zi5hcHBlbmQoIjoiKTsKLQkJCX0KLQkJCWJ1Zi5hcHBlbmQoZWxlbS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREaWZmQ291bnQoKSB7Ci0JCXJldHVybiBkaWZmQ291bnQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RWxlbUNvbXBhcmVkQ291bnQoKSB7Ci0JCXJldHVybiBlbGVtQ29tcGFyZWRDb3VudDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHRvQ2hlY2tPYmplY3QoT2JqZWN0IG9iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHVzZU5hbWVBczJuZElkICYmIG9iaiBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEdyYXBoTm9kZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VSZWZXaXRoRHVtbXkoU3RyaW5nIHNvdXJjZSkgewkJCi0JCVN0cmluZyByZXQgPSByZXBsYWNlUmVmV2l0aER1bW15KHNvdXJjZSwgUmVzb3VyY2VTY2FubmVyLnBfc3JjX3JlZiwgZW1wdHlTdHJpbmcpOwotCQlyZXQgPSByZXBsYWNlUmVmV2l0aER1bW15KHJldCwgUmVzb3VyY2VTY2FubmVyLnBfaHJlZl9yZWYsIGVtcHR5U3RyaW5nKTsKLQkJcmV0ID0gcmVwbGFjZVJlZldpdGhEdW1teShyZXQsIGVtcHR5TGluZSwgZW1wdHlTdHJpbmcpOwotCQlpZiAoZmFsc2UgJiYgIXNvdXJjZS5lcXVhbHMocmV0KSkgewotCQkJdHJhY2UoIkxEPiBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJdHJhY2UoIkxEPiByZXQ6ICAgICIgKyByZXQpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VSZWZXaXRoRHVtbXkoU3RyaW5nIHNvdXJjZSwgUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihzb3VyY2UpOwotCQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwkJCQkJCQotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVwbGFjZSk7CQotCQl9Ci0KLQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeUp1bml0VGVzdFNlcnZpY2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzYzYTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeUp1bml0VGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5SnVuaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIExpYnJhcnlUZXN0ZXIgc2VydmljZSBhbmQgaXMgdXNlZCBpbiBMaWJyYXJ5SnVuaXRUZXN0LiAgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBleHRlbmRzIFRlc3RGb2xkZXJTZXR1cCBpbXBsZW1lbnRzIFRlc3RUcmFjZXIgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0R3JvdXBOYW1lID0gIkp1bml0VGVzdHMiOwotCXByaXZhdGUgc3RhdGljIEZpbGUgdGVzdEdyb3VwOwotCQkKLQlwcml2YXRlIExpYnJhcnlUZXN0ZXIgdGVzdGVyOwotCQotCXByaXZhdGUgc3RhdGljIE1hcCBpbnN0YW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgRmlsZSB0b3BDbGVhblVwRm9sZGVyOwotCQotCXByaXZhdGUgTGlicmFyeUp1bml0VGVzdFNlcnZpY2UgKCkgewotCQl0ZXN0ZXIgPSBMaWJyYXJ5VGVzdGVyRmFjdG9yeS5uZXdUZXN0ZXIoZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIGdldEluc3RhbmNlKExpYnJhcnlKdW5pdFRlc3QgdGVzdENhc2UpIHsKLQkJQ2xhc3MgdGVzdENsYXNzID0gdGVzdENhc2UuZ2V0Q2xhc3MoKTsgCi0JCUxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIGluc3RhbmNlID0gKExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlKSBpbnN0YW5jZXMuZ2V0KHRlc3RDbGFzcyk7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSgpOwotCQkJaW5zdGFuY2VzLnB1dCh0ZXN0Q2xhc3MsIGluc3RhbmNlKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0R3JvdXAoKSB7Ci0JCWlmICh0ZXN0R3JvdXAgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRUZXN0SG9tZSgpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyB0ZXN0R3JvdXBOYW1lOwotCQkJdGVzdEdyb3VwID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHRlc3RHcm91cDsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGZyb20gTGlicmFyeUp1bml0VGVzdCdzIHNldFVwIG1ldGhvZCB0byB1cGRhdGUgdGVzdGVyJ3MKLQkgKiBmb2xkZXIgc2V0dXAuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXAoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIEZpbGUgdGVzdERpciwgTGlicmFyeUp1bml0VGVzdCB0ZXN0Q2FzZSkgewotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RTb3VyY2UodGVzdFJvb3RTb3VyY2UpOwotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RXb3JraW5nKHRlc3RSb290V29ya2luZyk7Ci0JCUZpbGUgcGFyZW50ID0gdGVzdFJvb3RXb3JraW5nLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKHRvcENsZWFuVXBGb2xkZXIgPT0gbnVsbCkgewotCQkJdG9wQ2xlYW5VcEZvbGRlciA9IHBhcmVudDsKLQkJfSBlbHNlIGlmICghIHRvcENsZWFuVXBGb2xkZXIuZXF1YWxzKHBhcmVudCkpewotCQkJLy9Xb24ndCBoYXBwZW4gZm9yIG5vdwotCQl9Ci0JCXRlc3Rlci5vcGVuQ3VyclRlc3REaXIodGVzdERpcik7Ci0JfQkKLQkKLQkvKioKLQkgKiBDYWxsZWQgZnJvbSBMaWJyYXJ5SnVuaXRUZXN0J3MgdGVhckRvd24gbWV0aG9kIHRvIGNsZWFyIHNvbWUKLQkgKiByZXNvdXJjZXMgaW4gdGVzdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlYXJEb3duKExpYnJhcnlKdW5pdFRlc3QgdGVzdENhc2UpIHsKLQkJdGVzdGVyLmNsb3NlQ3VyclRlc3REaXIoKTsKLQkJaWYgKHRlc3Rlci5pbmNFeGVjdXRlZFRlc3RDb3VudCgpID09IHRlc3RDYXNlLm51bVRlc3RDYXNlcygpKSB7Ci0JCQl0ZXN0ZXIuZG9uZVdpdGhBbGxUZXN0cyhnZXRUZXN0R3JvdXAoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgdGVzdCBjb21tYW5kIGluc3RhbmNlIG9mIHRoZSB0cHllICJjbHMiLgotCSAqLwotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJcmV0dXJuIHRlc3RlciA9PSBudWxsID8gbnVsbCA6IHRlc3Rlci5uZXdUZXN0Q29tbWFuZChjbHMpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjaW5nIG1ldGhvZCB0aGF0IGNhbiBiZSBjYWxsZWQgYnkgaW4gTGlicmFyeUp1bml0VGVzdCdzIGNvZGUuCi0JICovCi0JcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJaWYgKHRlc3RlciAhPSBudWxsKSB7Ci0JCQl0ZXN0ZXIudHJhY2UobGluZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5VGVzdFNlcnZpY2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJhZTBiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHVzZWQgaW4gSlVuaXQgdGVzdHMgZm9yIGxpYnJhcnkgZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RTZXJ2aWNlIHsJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVRlc3RTZXJ2aWNlIGluc3RhbmNlID0gbmV3IExpYnJhcnlUZXN0U2VydmljZSgpOwkKLQkJCi0JcHJpdmF0ZSBMaWJyYXJ5VGVzdFNlcnZpY2UoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVRlc3RTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQkKLQkJCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZUxpYnJhcnkoU3RyaW5nIHBhdGgsIFN0cmluZyBsaWJOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXBhcmFtcy5wdXQoImxpYnJhcnkucGF0aCIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkobGliTmFtZSwgInhtaSIsIHBhcmFtcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWIpOwotCQkJcmV0dXJuIGxpYjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogY2xvc2UgdGhlIHRlbXAgbGlicmFyeSBhbmQgZGVsZXRlIHRoZSBsaWJyYXJ5IHJlc291cmNlIGZpbGVzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUxpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJaWYgKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChsaWIgIT0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCUZpbGUgbGliRm9sZGVyID0gbmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkKLQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwkJCi0JCQkKLQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChsaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCQkJCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5W10gbGliID0gbmV3IE1ldGhvZExpYnJhcnlbMV07Ci0JCWxpYlswXSA9IG51bGw7Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QocGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWxpYlswXSA9IExpYnJhcnlVdGlsLmxvYWRMaWJyYXJ5KHBhdGggKyBGaWxlLnNlcGFyYXRvciArICJsaWJyYXJ5LnhtaSIpOwotCQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5jbG9zZVByb2plY3QocGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBsaWJbMF07Ci0JfQkJCi0JCi0JcHVibGljIHZvaWQgZGVsZXRlRm9sZGVyKEZpbGUgZm9sZGVyKSB7Ci0JCWlmIChmb2xkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWZvbGRlci5kZWxldGUoKTsKLQl9CQkJCi0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoTGlzdCBlbGVtZW50cywgU3RyaW5nIG5hbWUpIHsKLQkJaW50IHN6ID0gZWxlbWVudHMgPT0gbnVsbCA/IDAgOiBlbGVtZW50cy5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgPyAoTWV0aG9kRWxlbWVudCkgb2JqIDogbnVsbDsKLQkJCWlmIChlbGVtICE9IG51bGwgJiYgZWxlbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVsZW07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0ZXJGYWN0b3J5LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5VGVzdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGJkMWRjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuTGlicmFyeVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5MaWJyYXJ5VGVzdGVySW1wbDsKLQotLyoqCi0gKiBDbGFzcyBmYWN0b3J5IGZvciBMaWJyYXJ5VGVzZXIgaW5zdGFuY2VzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VGVzdGVyRmFjdG9yeSB7CQotCQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVRlc3RlciBuZXdUZXN0ZXIoYm9vbGVhbiB0cmFjZSkgewkJCQotCQlyZXR1cm4gbmV3IExpYnJhcnlUZXN0ZXJJbXBsKHRyYWNlKTsKLQl9Ci0JCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL091dHB1dERpZmZBbmFseXpvci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvT3V0cHV0RGlmZkFuYWx5em9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjJiZGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvT3V0cHV0RGlmZkFuYWx5em9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBDbGFzcyB0byBhbmFseXplIHRoZSBkaWZmZXJuZWNlcyBiZXR3ZWVuIHR3byBsaWJyYXJ5IHRlc3RlciBvdXRwdXRzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXREaWZmQW5hbHl6b3IgewotCQotCXByaXZhdGUgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXN0VHJhY2VyIHRyYWNlcjsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFRvQW5hbHl6ZSA9IHRydWU7IAotCXByaXZhdGUgRmlsZSBmMTsKLQlwcml2YXRlIEZpbGUgZjI7Ci0JcHJpdmF0ZSBEb2N1bWVudCBkMTsKLQlwcml2YXRlIERvY3VtZW50IGQyOwotCXByaXZhdGUgaW50IGRpZmZDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZWxlbUNvbXBhcmVkQ291bnQgPSAwOwotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhjbHVkZUd1aWRGcm9tTmFtZSA9IHRydWU7Ci0JLy9NYXkgd2FudCB0byB1c2UgZmVhdHVyZSBjbGFzc2VzIGRpcmVjdGx5IGluc3RlYWQgb2YgbmFtZXMgbGF0ZXIKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBleGNsdWRlZEZlYXR1cmVzID0gewotCQkiZ3VpZCIsCi0JCSJjaGFuZ2VEYXRlIgotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IGV4Y2x1ZGVkRmVhdHVyZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4Y2x1ZGVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWV4Y2x1ZGVkRmVhdHVyZVNldC5hZGQoZXhjbHVkZWRGZWF0dXJlc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE91dHB1dERpZmZBbmFseXpvcihUZXN0VHJhY2VyIHQsIERvY3VtZW50IGQxLCBEb2N1bWVudCBkMiwgRmlsZSBmMSwgRmlsZSBmMikgewotCQl0cmFjZXIgPSB0OwotCQl0aGlzLmYxID0gZjE7Ci0JCXRoaXMuZjIgPSBmMjsKLQkJdGhpcy5kMSA9IGQxID09IG51bGwgPyBnZXREb2N1bWVudChmMSkgOiBkMTsKLQkJdGhpcy5kMiA9IGQyID09IG51bGwgPyBnZXREb2N1bWVudChmMikgOiBkMjsKLQl9CQkKLQkKLQlwcml2YXRlIERvY3VtZW50IGdldERvY3VtZW50KEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gWE1MVXRpbC5sb2FkWG1sKGZpbGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJdHJhY2VyLnRyYWNlKGxpbmUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYW5hbHl6ZSgpIHsKLQkJdHJhY2UoIk91dHB1dERpZmZBbmFseXpvci5hbmFseXplIC0+Iik7Ci0JCXRyYWNlKCJmMTogIiArIGYxLmdldEFic29sdXRlUGF0aCgpKTsKLQkJdHJhY2UoImYyOiAiICsgZjIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cmFjZSgiIik7CQkKLQkJYW5hbHl6ZV8oKTsKLQkJdHJhY2UoIk91dHB1dERpZmZBbmFseXpvci5hbmFseXplIDwtIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplXygpIHsKLQkJaWYgKCEgbmVlZFRvQW5hbHl6ZSkgewotCQkJdHJhY2UoIm5vIG5lZWQgdG8gYW5hbHlzZSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNvbXBhcmVSb290KGQxLmdldERvY3VtZW50RWxlbWVudCgpLCBkMi5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCW5lZWRUb0FuYWx5emUgPSBmYWxzZTsKLQl9Ci0JCi0vLwlUb3AgZW50cnkgZm9yIG1ldGhvZCBlbGVtZW50IGNvbXBhcmlzb24KLQlwdWJsaWMgdm9pZCBjb21wYXJlUm9vdChFbGVtZW50IHJvb3QxLCAgRWxlbWVudCByb290MikgewkJCi0JCWRpZmZDb3VudCA9IDA7Ci0JCWVsZW1Db21wYXJlZENvdW50ID0gMTsJCQotCQl0cmFjZSgiIik7Ci0JCXRyYWNlKCJjb21wYXJlUm9vdCAtPiAiKTsKLQkKLQkJTGlzdCBlbGVtZW50TGlzdDEgPSBjb2xsZWN0RWxlbWVudHMocm9vdDEuZ2V0Q2hpbGROb2RlcygpKTsKLQkJTGlzdCBlbGVtZW50TGlzdDIgPSBjb2xsZWN0RWxlbWVudHMocm9vdDIuZ2V0Q2hpbGROb2RlcygpKTsJCQotCQlpbnQgc3oxID0gZWxlbWVudExpc3QxLnNpemUoKTsKLQkJaW50IHN6MiA9IGVsZW1lbnRMaXN0Mi5zaXplKCk7Ci0KLQkJaWYgKHN6MSAhPSBzejIpIHsKLQkJCVN0cmluZyBtc2cgPSAicm9vdCBjaGlsZCBlbGVtZW50czogc3oxICE9IHN6MiAtPiAiICsgSW50ZWdlci50b1N0cmluZyhzejEpICsgIiAhPSAiICsgSW50ZWdlci50b1N0cmluZyhzejIpOwotCQkJbG9nRGlmZihtc2csIHJvb3QxLCByb290Mik7Ci0JCX0KLQkJCi0JCWludCBzeiA9IHN6MSA8IHN6MiA/IHN6MSA6IHN6MjsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCWNvbXBhcmUoKEVsZW1lbnQpIGVsZW1lbnRMaXN0MS5nZXQoaSksIChFbGVtZW50KSBlbGVtZW50TGlzdDIuZ2V0KGkpKTsKLQkJfQotCQkKLQkJdHJhY2UoImNvbXBhcmVSb290IDwtIGRpZmZzOiAiICsgZGlmZkNvdW50ICsgIiwgZWxlbWVudHM6ICIgKyBlbGVtQ29tcGFyZWRDb3VudCArICJcbiIpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgY29sbGVjdEVsZW1lbnRzKE5vZGVMaXN0IG5vZGVMaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJZWxlbWVudHMuYWRkKG5vZGUpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcGFyZShFbGVtZW50IG5vZGUxLCAgRWxlbWVudCBub2RlMikgewotCQl0cmFjZSgiY29tcGFyZSAtPiAiKTsKLQkJY29tcGFyZUlubmVyKG5vZGUxLCBub2RlMik7Ci0JCXRyYWNlKCJjb21wYXJlIDwtICIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcGFyZUlubmVyKEVsZW1lbnQgbm9kZTEsICBFbGVtZW50IG5vZGUyKSB7Ci0JCWVsZW1Db21wYXJlZENvdW50Kys7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQl0cmFjZSgiY29tcGFyZUlubmVyLCBub2RlMTogIiArIG91dHB1dFN0cmluZyhub2RlMSkpOwotCQkJdHJhY2UoImNvbXBhcmVJbm5lciwgbm9kZTI6ICIgKyBvdXRwdXRTdHJpbmcobm9kZTEpKTsKLQkJCXRyYWNlKCIiKTsKLQkJfQotCQkKLQkJYXR0cmlidXRlRXF1YWxzKG5vZGUxLCBub2RlMik7Ci0JCQkKLQkJTGlzdCBlbGVtZW50TGlzdDEgPSBjb2xsZWN0RWxlbWVudHMobm9kZTEuZ2V0Q2hpbGROb2RlcygpKTsKLQkJTGlzdCBlbGVtZW50TGlzdDIgPSBjb2xsZWN0RWxlbWVudHMobm9kZTIuZ2V0Q2hpbGROb2RlcygpKTsJCQotCQlpbnQgc3oxID0gZWxlbWVudExpc3QxLnNpemUoKTsKLQkJaW50IHN6MiA9IGVsZW1lbnRMaXN0Mi5zaXplKCk7Ci0KLQkJaWYgKHN6MSAhPSBzejIpIHsKLQkJCVN0cmluZyBtc2cgPSAiQ2hpbGQgZWxlbWVudHM6IHN6MSAhPSBzejIgLT4gIiArIEludGVnZXIudG9TdHJpbmcoc3oxKSArICIgIT0gIiArIEludGVnZXIudG9TdHJpbmcoc3oyKTsKLQkJCWxvZ0RpZmYobXNnLCBub2RlMSwgbm9kZTIpOwotCQl9Ci0JCQotCQlpbnQgc3ogPSBzejEgPCBzejIgPyBzejEgOiBzejI7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQljb21wYXJlSW5uZXIoKEVsZW1lbnQpIGVsZW1lbnRMaXN0MS5nZXQoaSksIChFbGVtZW50KSBlbGVtZW50TGlzdDIuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhdHRyaWJ1dGVFcXVhbHMoRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMikgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCQotCQlOYW1lZE5vZGVNYXAgYXR0czEgPSBub2RlMS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRzMiA9IG5vZGUyLmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IHN6MSA9IGF0dHMxLmdldExlbmd0aCgpOwotCQlpbnQgc3oyID0gYXR0czIuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzejEgIT0gc3oyKSB7Ci0JCQlsb2dEaWZmKCJBdHRyaWJ1dGVzOiBzejEgIT0gc3oyIiwgbm9kZTEsIG5vZGUyKTsKLQkJCXJldCA9IGZhbHNlOwotCQl9Ci0JCWludCBzeiA9IHN6MSA8IHN6MiA/IHN6MSA6IHN6MjsJCQotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJU3RyaW5nIGF0dE5hbWUgPSBhdHRzMS5pdGVtKGkpLmdldE5vZGVOYW1lKCk7Ci0JCQlpZiAoZXhjbHVkZWRGZWF0dXJlU2V0LmNvbnRhaW5zKGF0dE5hbWUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdmFsMSA9IG5vZGUxLmdldEF0dHJpYnV0ZShhdHROYW1lKTsKLQkJCVN0cmluZyB2YWwyID0gbm9kZTIuZ2V0QXR0cmlidXRlKGF0dE5hbWUpOwotCQkJaWYgKGF0dE5hbWUuZXF1YWxzKCJuYW1lIikgJiYgZXhjbHVkZUd1aWRGcm9tTmFtZSkgewotCQkJCWludCBpeCA9IHZhbDEuaW5kZXhPZigiLCIpOwotCQkJCWlmIChpeCA+IDApIHsKLQkJCQkJdmFsMSA9IHZhbDEuc3Vic3RyaW5nKDAsIGl4KTsKLQkJCQl9Ci0JCQkJaXggPSB2YWwyLmluZGV4T2YoIiwiKTsKLQkJCQlpZiAoaXggPiAwKSB7Ci0JCQkJCXZhbDIgPSB2YWwyLnN1YnN0cmluZygwLCBpeCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCEgdmFsdWVFcXVhbHModmFsMSwgdmFsMikpIHsKLQkJCQlTdHJpbmcgbXNnID0gYXR0TmFtZSArICIgdmFsdWVzIG5vdCB0aGUgc2FtZSEiOwotCQkJCWxvZ0RpZmYobXNnLCBub2RlMSwgbm9kZTIsIHZhbDEsIHZhbDIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdmFsdWVFcXVhbHMoT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWlmICh2YWwxID09IG51bGwpIHsKLQkJCXZhbDEgPSAiIjsKLQkJfQotCQkKLQkJaWYgKHZhbDIgPT0gbnVsbCkgewotCQkJdmFsMiA9ICIiOwotCQl9Ci0JCQotCQlpZiAodmFsMSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIHN0cjEgPSAoU3RyaW5nKSB2YWwxOwotCQkJU3RyaW5nIHN0cjIgPSAoU3RyaW5nKSB2YWwyOwotCQkJcmV0dXJuIHN0cjEuZXF1YWxzKHN0cjIpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIEVsZW1lbnQgbm9kZTEsIEVsZW1lbnQgbm9kZTIsIE9iamVjdCB2YWwxLCBPYmplY3QgdmFsMikgewotCQlsb2cobXNnLCBub2RlMSwgbm9kZTIsIHRydWUpOwotCQlTdHJpbmcgcHJvbXB0ID0gZ2V0RGlmZlByb21wdCgpOwotCQl0cmFjZShwcm9tcHQgKyAidmFsMTogIiArIHZhbDEpOwotCQl0cmFjZShwcm9tcHQgKyAidmFsMjogIiArIHZhbDIpOwkKLQkJdHJhY2UoIiIpOwotCX0JCi0JCQotCXByaXZhdGUgaW50IGluY0RpZmZDb3VudCgpIHsKLQkJcmV0dXJuICsrZGlmZkNvdW50OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWZmUHJvbXB0KCkgewotCQlyZXR1cm4gIkRfIiArIGRpZmZDb3VudCArICI+ICI7CQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGxvZ0RpZmYoU3RyaW5nIG1zZywgRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMikgewotCQlsb2cobXNnLCBub2RlMSwgbm9kZTIsIHRydWUpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZywgRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMiwgYm9vbGVhbiBkaWZmKSB7Ci0JCWlmIChkaWZmKSB7Ci0JCQlpbmNEaWZmQ291bnQoKTsKLQkJfQotCQlTdHJpbmcgcHJvbXB0ID0gZGlmZiA/IGdldERpZmZQcm9tcHQoKSA6ICJXYXJuaW5nPiAiOwotCQkvL3RyYWNlKHByb21wdCArICJwYXRoOiAiICsgcGF0aFN0cmluZyhub2RlMSkpOwotCQl0cmFjZShwcm9tcHQgKyAibXNnOiAiICsgbXNnKTsKLQkJdHJhY2UocHJvbXB0ICsgIm5vZGUxOiAiICsgb3V0cHV0U3RyaW5nKG5vZGUxKSk7Ci0JCXRyYWNlKHByb21wdCArICJub2RlMjogIiArIG91dHB1dFN0cmluZyhub2RlMikpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBwYXRoU3RyaW5nKEVsZW1lbnQgbm9kZSkgewotCQlTdGFjayBwYXRocyA9IG5ldyBTdGFjaygpOwotCQlOb2RlIGN1cnJOb2RlID0gbm9kZTsKLQkJd2hpbGUgKGN1cnJOb2RlICE9IG51bGwgJiYgY3Vyck5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoRWxlbWVudCkgY3Vyck5vZGUpLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQkJcGF0aHMucHVzaChuYW1lKTsKLQkJCWN1cnJOb2RlID0gY3Vyck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCVN0cmluZyByZXQgPSAiIjsKLQkJd2hpbGUoISBwYXRocy5pc0VtcHR5KCkpIHsKLQkJCXJldCArPSAiLyIgKyBwYXRocy5wb3AoKTsKLQkJfQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoKSB7Ci0JCWFuYWx5emUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIG91dHB1dFN0cmluZyhFbGVtZW50IG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQkKLQkJU3RyaW5nIHR5cGUgPSBub2RlLmdldEF0dHJpYnV0ZSgidHlwZSIpOwotCQlyZXR1cm4gdHlwZSArICI6ICIgKyBwYXRoU3RyaW5nKG5vZGUpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldERpZmZDb3VudCgpIHsKLQkJcmV0dXJuIGRpZmZDb3VudDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRFbGVtQ29tcGFyZWRDb3VudCgpIHsKLQkJcmV0dXJuIGVsZW1Db21wYXJlZENvdW50OwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvUWFUZXN0U2VydmljZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvUWFUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTcwZjUwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1FhVGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLklUZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIExpYnJhcnlUZXN0ZXIgc2VydmljZSB0byBydW4gdGVzdCBjb21tYW5kIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUWFUZXN0U2VydmljZSBpbXBsZW1lbnRzIElUZXN0Rm9sZGVyU2V0dXAgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0R3JvdXBOYW1lID0gIlRlc3RDb21tYW5kRmlsZVRlc3RzIjsKLQlwcml2YXRlIHN0YXRpYyBGaWxlIHRlc3RHcm91cDsJCQotCQotCXByaXZhdGUgTGlicmFyeVRlc3RlciB0ZXN0ZXI7Ci0JcHJpdmF0ZSBJVGVzdEZvbGRlclNldHVwIHRlc3RGb2xkZXJTZXR1cDsKLQkKLQlwdWJsaWMgc3RhdGljIEZpbGVGaWx0ZXIgdGNGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCXJldHVybiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoVGVzdENvbW1hbmQuVGVzdE5hbWVFeHQpOwotCQl9OwkJCQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBGaWxlRmlsdGVyIGRpckZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJcmV0dXJuIHBhdGhuYW1lLmlzRGlyZWN0b3J5KCk7Ci0JCX07CQkJCi0JfTsKLQkKLQlwdWJsaWMgUWFUZXN0U2VydmljZShJVGVzdEZvbGRlclNldHVwIHRlc3RGb2xkZXJTZXR1cCwgYm9vbGVhbiB0cmFjZSkgewotCQl0aGlzLnRlc3RGb2xkZXJTZXR1cCA9IHRlc3RGb2xkZXJTZXR1cDsKLQkJdGVzdGVyID0gTGlicmFyeVRlc3RlckZhY3RvcnkubmV3VGVzdGVyKHRyYWNlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRvcCB0ZXN0IHJvb3Qgc291cmNlIGZvbGRlciBmaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKSB7Ci0JCXJldHVybiB0ZXN0Rm9sZGVyU2V0dXAuZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRlc3QgaG9tZSBmb2xkZXIgZmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldFRlc3RIb21lKCkgewotCQlyZXR1cm4gdGVzdEZvbGRlclNldHVwLmdldFRlc3RIb21lKCk7Ci0JfQkKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIEZpbGUgZ2V0VGVzdEdyb3VwKCkgewotCQlpZiAodGVzdEdyb3VwID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0VGVzdEhvbWUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgdGVzdEdyb3VwTmFtZTsKLQkJCXRlc3RHcm91cCA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCXJldHVybiB0ZXN0R3JvdXA7Ci0JfQotCQotCS8qKgotCSAqIFBpY2tzIHVwIGFuZCBydW5zIGFsbCB0ZXN0IGNvbW1hbmQgZmlsZXMgdW5kZXIgInN0YXJ0aW5nVGVzdFJvb3RTb3VyY2UiCi0JICogZm9sZGVyIHJlY3Vyc2l2ZWx5LiBUZXN0IHdvcmtpbmcgbG9jYXRpb24gc3RhcnRzIGZyb20gInN0YXJ0aW5nVGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkFsbENhc2VzKEZpbGUgc3RhcnRpbmdUZXN0Um9vdFNvdXJjZSwgRmlsZSBzdGFydGluZ1Rlc3RSb290V29ya2luZykgewkKLQkJU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cmF2ZXJzZUZvbGRlcihzdGFydGluZ1Rlc3RSb290U291cmNlLCBzdGFydGluZ1Rlc3RSb290V29ya2luZywgZXJyb3JNc2dCdWYsIHRydWUpOwotCQl0ZXN0ZXIuY2xvc2VDdXJyVGVzdERpcigpOwotCQl0ZXN0ZXIuZG9uZVdpdGhBbGxUZXN0cyhnZXRUZXN0R3JvdXAoKSk7Ci0JCXJldHVybiBlcnJvck1zZ0J1Zi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBQaWNrcyB1cCBhbmQgcnVucyBhbGwgbG9jYWwgdGVzdCBjb21tYW5kIGZpbGVzIHVuZGVyICJ0ZXN0Um9vdFNvdXJjZSIKLQkgKiBmb2xkZXIuIFRlc3Qgd29ya2luZyBsb2NhdGlvbiBpcyBnaXZlbiBieSAidGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkxvY2FsQ2FzZXMoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcpIHsJCi0JCVN0cmluZ0J1ZmZlciBlcnJvck1zZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJhdmVyc2VGb2xkZXIodGVzdFJvb3RTb3VyY2UsIHRlc3RSb290V29ya2luZywgZXJyb3JNc2dCdWYsIGZhbHNlKTsKLQkJcmV0dXJuIGVycm9yTXNnQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgdGhlIHRlc3QgY29tbWFuZCBmaWxlICJ0Y0ZpbGUiIHdpdGggdGVzdCByb290IHNvdXJjZSBmb2xkZXIKLQkgKiBnaXZlbiBieSAidGVzdFJvb3RTb3VyY2UiIGFuZCB0ZXN0IHJvb3Qgd29ya2luZyBmb2xkZXIgZ2l2ZW4gYnkKLQkgKiAidGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkNhc2UoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIEZpbGUgdGNGaWxlKSB7CQotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RTb3VyY2UodGVzdFJvb3RTb3VyY2UpOwotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RXb3JraW5nKHRlc3RSb290V29ya2luZyk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgZXJyb3JNc2dCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJ1bkNhc2UoZXJyb3JNc2dCdWYsIHRjRmlsZSk7Ci0JCXJldHVybiBlcnJvck1zZ0J1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdHJhdmVyc2VGb2xkZXIoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIAotCQkJU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmLCBib29sZWFuIHJlY3Vyc3V2ZWx5KSB7CQkKLQkJCQkJCi0JCUZpbGUgZmlsZXNbXSA9IHRlc3RSb290U291cmNlLmxpc3RGaWxlcyh0Y0ZpbHRlcik7Ci0JCWV4ZWN1dGVUQ0ZpbGVzKHRlc3RSb290U291cmNlLCB0ZXN0Um9vdFdvcmtpbmcsICBmaWxlcywgZXJyb3JNc2dCdWYpOwotCQlpZiAoISByZWN1cnN1dmVseSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJRmlsZSBkaXJzW10gPSB0ZXN0Um9vdFNvdXJjZS5saXN0RmlsZXMoZGlyRmlsdGVyKTsKLQkJaW50IHN6ID0gZGlycyA9PSBudWxsID8gMCA6IGRpcnMubGVuZ3RoOwotCQlpZiAoc3ogPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlGaWxlIGRpciA9IGRpcnNbaV07Ci0JCQlTdHJpbmcgcGF0aCA9IHRlc3RSb290V29ya2luZy5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgZGlyLmdldE5hbWUoKSAKLQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvcjsKLQkJCXRyYXZlcnNlRm9sZGVyKGRpciwgbmV3IEZpbGUocGF0aCksIGVycm9yTXNnQnVmLCByZWN1cnN1dmVseSk7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBleGVjdXRlVENGaWxlcyhGaWxlIHRlc3RSb290U291cmNlLCBGaWxlIHRlc3RSb290V29ya2luZywgRmlsZSB0Y0ZpbGVzW10sIFN0cmluZ0J1ZmZlciBlcnJvck1zZ0J1ZikgewotCQlpbnQgc3ogPSB0Y0ZpbGVzID09IG51bGwgPyAwIDogdGNGaWxlcy5sZW5ndGg7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQkKLQkJdGVzdGVyLnNldFRlc3RSb290U291cmNlKHRlc3RSb290U291cmNlKTsKLQkJdGVzdGVyLnNldFRlc3RSb290V29ya2luZyh0ZXN0Um9vdFdvcmtpbmcpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUZpbGUgdGNGaWxlID0gdGNGaWxlc1tpXTsKLQkJCXJ1bkNhc2UoZXJyb3JNc2dCdWYsIHRjRmlsZSk7CQkJCi0JCX0JCQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJ1bkNhc2UoU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmLCBGaWxlIHRjRmlsZSkgewkKLQkJdGVzdGVyLnNldFRlc3QodGNGaWxlKTsKLQkJVENFeGVSZXBseUxpc3QgcmVzdWx0ID0gdGVzdGVyLmV4ZWN1dGUoKTsKLQkJaWYgKCEgcmVzdWx0LnBhc3NpbmcoKSkgewotCQkJU3RyaW5nIG1zZyA9IHJlc3VsdC5nZXRTdW1tYXJ5UmVwbHkoKTsKLQkJCWVycm9yTXNnQnVmLmFwcGVuZCgiXG4iICsgbXNnKTsKLQkJCXRlc3Rlci50cmFjZShtc2cpOwotCQl9Ci0JfQotCQotCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjAxOGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdENvbW1hbmRGaWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEpVTklUIHRlc3Qgb24gcnVuaW5nIGEgdGVzdCBjb21tYW5kIGZpbGUgaW4gdHJhY2UgbW9kZQotICogZm9yIGRlYnVnIHB1cnBvc2UuCi0gKiBUaGUgbG9jYXRpb24gb2YgdGVzdCBmaWxlIGlzIGhhcmQgY29kZWQgZm9yIG5vdy4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21tYW5kRmlsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogVGVzdCBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdG9wVGVzdFJvb3RTb3VyY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW10gPSB7Ci0vKgkJIlRlc3RDb21tYW5kcyIsCi0JCSJuZXdNZXRob2RQbHVnaW4iLAotCQkibmV3TWV0aG9kUGx1Z2luLnRjIiovCi0vKgkJCi0JCSJFeHBvcnRJbXBvcnQiLAotCQkiQnVnc18xIiwKLQkJIjE1MDcwMiIsCi0JCSIxNTA3MDIudGMiKi8JCQotCQkKLQkJIlRlc3RDb21tYW5kcyIsCi0JCSJuZXdNZXRob2RFbGVtZW50cyIsCi0JCSJuZXdNZXRob2RFbGVtZW50cy50YyIKLQkJCi0vKgkJIlRlc3RDb21tYW5kcyIsCi0JCSJrZWx2aW5DYXNlLnRjIiovCi0JCQotLyoJCSJWYWxpZGF0aW9uIiwKLQkJIkJ1Z3MiLAotCQkiMTcxMDI4LnRjIiovCi0JfTsKLQkJCi0JcHJpdmF0ZSBRYVRlc3RTZXJ2aWNlIHNlcnZpY2UgPSBuZXcJUWFUZXN0U2VydmljZShuZXcgVGVzdEZvbGRlclNldHVwKCksIHRydWUpOwotCQotCXB1YmxpYyBUZXN0Q29tbWFuZEZpbGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHRlc3QgcnVucyB0aGUgZ2l2ZW4gdGVzdCBjb21tYW5kIGZpbGUuCi0JICovIAotCXB1YmxpYyB2b2lkIHRlc3RPbmVDYXNlKCkgewotCQlydW5UZXN0T25lQ2FzZShzZXJ2aWNlLCB0Y0ZpbGVQYXRoRnJvbVRvcFJvb3RTb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuVGVzdE9uZUNhc2UoUWFUZXN0U2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW10pIHsKLQkJU3RyaW5nIHBhdGggPSBzZXJ2aWNlLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkvL3BhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBMb25nLnRvSGV4U3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCkpICsgRmlsZS5zZXBhcmF0b3I7CQkKLQkJRmlsZSB0ZXN0Um9vdFdvcmtpbmcgPSBuZXcgRmlsZShwYXRoKTsKLQkJTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCkuZGVsZXRlRm9sZGVyKHRlc3RSb290V29ya2luZyk7Ci0JCQotCQlGaWxlIHRvcFRlc3RSb290U291cmNlID0gc2VydmljZS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpOwotCQkKLQkJcGF0aCA9IHRvcFRlc3RSb290U291cmNlLmdldEFic29sdXRlUGF0aCgpOwotCQlmb3IgKGludCBpPTA7IGk8dGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW2ldOwotCQl9Ci0JCUZpbGUgdGNGaWxlID0gbmV3IEZpbGUocGF0aCk7CQkKLQkJCi0JCVN0cmluZyBlcnJvck1zZyA9IHNlcnZpY2UucnVuQ2FzZSh0Y0ZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0ZXN0Um9vdFdvcmtpbmcsIHRjRmlsZSk7Ci0JCWFzc2VydFRydWUoZXJyb3JNc2csIGVycm9yTXNnLmxlbmd0aCgpID09IDApOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0cy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdENvbW1hbmRGaWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0NDFjYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogSlVOSVQgdGVzdCBvbiB0ZXN0IGNvbW1hbmQgZmlsZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21tYW5kRmlsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgUWFUZXN0U2VydmljZSBzZXJ2aWNlID0gbmV3CVFhVGVzdFNlcnZpY2UobmV3IFRlc3RGb2xkZXJTZXR1cCgpLCBmYWxzZSk7Ci0JCi0JcHVibGljIFRlc3RDb21tYW5kRmlsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCQkJCQkKLQkJCQotCS8qKgotCSAqIFRoaXMgdGVzdCBwaWNrcyB1cCBhbmQgcnVucyBhbGwgdGVzdCBjb21tYW5kIGZpbGVzIHVuZGVyIHRoZQotCSAqIGZvbGRlciBzZXJ2aWNlLmdldFRvcFRlc3RSb290U291cmNlKCkgcmVjdXJzaXZlbHkuIAotCSAqLyAKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsQ2FzZXMoKSB7Ci0JCXJ1blRlc3RBbGxDYXNlcyhzZXJ2aWNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1blRlc3RBbGxDYXNlcyhRYVRlc3RTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJU3RyaW5nIHBhdGggPSBzZXJ2aWNlLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkKLQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzczpTU1MiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KG5ldyBEYXRlKCkpOwotCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJyAnLCAnXycpOwotCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJzonLCAnLScpOwotCQkKLQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIGR0U3RyICsgRmlsZS5zZXBhcmF0b3I7Ci0JCVN0cmluZyBlcnJvck1zZyA9IHNlcnZpY2UucnVuQWxsQ2FzZXMoc2VydmljZS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpLCBuZXcgRmlsZShwYXRoKSk7Ci0JCWFzc2VydFRydWUoZXJyb3JNc2csIGVycm9yTXNnLmxlbmd0aCgpID09IDApOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Rm9sZGVyU2V0dXAuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RGb2xkZXJTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc5MzQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RGb2xkZXJTZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLklUZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuVGVzdHNQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzZXRzIHRoZSB0b3AgZm9sZGVyIGxvY2F0aW9ucyBmb3IgTGlicmFyeVRlc3RlciAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RGb2xkZXJTZXR1cCBpbXBsZW1lbnRzIElUZXN0Rm9sZGVyU2V0dXAgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdG9wVGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZSAoVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxQYXRoKCkgKyAgCi0JCQkiTGlicmFyaWVzIiArIEZpbGUuc2VwYXJhdG9yICsgIjEuMC4wIiArIEZpbGUuc2VwYXJhdG9yKSA7Ci0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdGVzdEhvbWUgPSBuZXcgRmlsZSAoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMiQKLQkJCSsgIkVQRiIgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdG9wIHRlc3Qgcm9vdCBzb3VyY2UgZm9sZGVyIGZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRUb3BUZXN0Um9vdFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRvcFRlc3RSb290U291cmNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGVzdCBob21lIGZvbGRlciBmaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VGVzdEhvbWUoKSB7Ci0JCXJldHVybiB0ZXN0SG9tZTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0ZXJPdXRwdXRVdGlsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0ZXJPdXRwdXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTkyZTQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdGVyT3V0cHV0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHRlc3RlciBvdXRwdXQgbWFuaXB1bGF0aW9ucwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdGVyT3V0cHV0VXRpbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdFRyYWNlciB0cmFjZXI7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldFRyYWNlcihUZXN0VHJhY2VyIHQpIHsKLQkJdHJhY2VyID0gdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7Ci0JCWlmICh0cmFjZXIgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQl9IGVsc2UgewotCQkJdHJhY2VyLnRyYWNlKGxpbmUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIG5hbWUpIHsKLQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pIG5hbWVNYXAuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIG5hbWUpIHsKLQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG5hbWVNYXAuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRfKGxpYiwgcGF0aCx0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVzb2x2ZVByb2Nlc3NFbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGdldE1ldGhvZEVsZW1lbnRfKGxpYiwgcGF0aCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgcmVzb2x2ZVByb2Nlc3NFbGVtZW50KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlMaXN0IGNoaWxkcmVuID0gcGtnLmdldFByb2Nlc3NFbGVtZW50cygpOwotCQkJaWYgKGNoaWxkcmVuLnNpemUoKSA9PSAxICYmIAotCQkJCQkoKFByb2Nlc3NFbGVtZW50KSBjaGlsZHJlbi5nZXQoMCkpLmdldE5hbWUoKS5lcXVhbHMocGtnLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIGNoaWxkcmVuLmdldCgwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBsaWI7Ci0JCX0KLQkJTGlzdCBwYXRocyA9IHBhcnNlTWV0aG9kRWxlbWVudFBhdGgocGF0aCk7Ci0JCWludCBzeiA9IHBhdGhzLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQkJTWV0aG9kRWxlbWVudCBtZSA9IGdldEZpcnN0TWV0aG9kRWxlbWVudChsaWIsIChTdHJpbmcpIHBhdGhzLmdldCgwKSk7Ci0JCWlmIChtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKGludCBpPTE7IGk8c3o7IGkrKykgewotCQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChtZS5lQ29udGVudHMoKSk7Ci0JCQltZSA9IChNZXRob2RFbGVtZW50KSBuYW1lTWFwLmdldChwYXRocy5nZXQoaSkpOwotCQkJaWYgKG1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRGaXJzdE1ldGhvZEVsZW1lbnQoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBmaXJzdFBhdGgpIHsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IGdldE1ldGhvZFBsdWdpbihsaWIsIGZpcnN0UGF0aCk7Ci0JCWlmIChtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWU7Ci0JCX0KLQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24obGliLCBmaXJzdFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NFbGVtZW50IGdldFByb2Nlc3NFbGVtZW50KE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgcGF0aCkgewotCQlpbnQgaXggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7Ci0JCVN0cmluZyBwYXJlbnRQYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaXgpOwotCQlTdHJpbmcgbmFtZSA9IHBhdGguc3Vic3RyaW5nKGl4ICsgMSk7Ci0JCQotCQlQcm9jZXNzUGFja2FnZSBvdXRlclBhcmVudCA9IGdldFByb2Nlc3NFbGVtZW50UGFyZW50KGxpYiwgcGFyZW50UGF0aCk7Ci0JCQotCQlNYXAgbmFtZU1hcCA9IGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKG91dGVyUGFyZW50LmdldENoaWxkUGFja2FnZXMoKSk7Ci0JCVByb2Nlc3NQYWNrYWdlIGlubmVyUGFyZW50ID0gKFByb2Nlc3NQYWNrYWdlKSBuYW1lTWFwLmdldChuYW1lKTsKLQkJaWYgKGlubmVyUGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgaW5uZXJQYXJlbnQpLmdldFByb2Nlc3MoKTsKLQkJfQotCQlMaXN0IHBlcyA9IGlubmVyUGFyZW50LmdldFByb2Nlc3NFbGVtZW50cygpOwotCQlpZiAocGVzLnNpemUoKSAhPSAxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwZXMuc2l6ZSgpID09ICIgKyBwZXMuc2l6ZSgpICsgIiAhPSAxIik7Ci0JCX0KLQkJCi0JCXJldHVybiAoUHJvY2Vzc0VsZW1lbnQpIHBlcy5nZXQoMCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc1BhY2thZ2UgZ2V0UHJvY2Vzc0VsZW1lbnRQYXJlbnQoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBwYXJlbnRQYXRoKSB7Ci0JCQlyZXR1cm4gKFByb2Nlc3NQYWNrYWdlKSBnZXRNZXRob2RFbGVtZW50XyhsaWIsIHBhcmVudFBhdGgsIGZhbHNlKTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBwYXJzZU1ldGhvZEVsZW1lbnRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCVN0cmluZyBuYW1lID0gcGF0aDsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWludCBpeCA9IHBhdGguaW5kZXhPZigiLyIpOwotCQkJaWYgKGl4IDwgMCkgewotCQkJCXJldC5hZGQocGF0aCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXQuYWRkKHBhdGguc3Vic3RyaW5nKDAsIGl4KSk7Ci0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoaXggKyAxKTsKLQkJfQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKExpc3QgY29udGVudHMpIHsKLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29udGVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjb250ZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJbmFtZU1hcC5wdXQoZWxlbS5nZXROYW1lKCksIGVsZW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lTWFwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXRQYXRoKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKG1lIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCWlmIChtZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBtZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiBtZS5nZXROYW1lKCk7Ci0JCX0KLQkJU3RhY2sgc3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJTWV0aG9kRWxlbWVudCBjdXJyTWUgPSBtZTsKLQkJd2hpbGUgKCEgKGN1cnJNZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGN1cnJNZS5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhY2sucHVzaChuYW1lKTsKLQkJCX0KLQkJCU1ldGhvZEVsZW1lbnQgb2xkTWUgPSBjdXJyTWU7Ci0JCQljdXJyTWUgPSAoTWV0aG9kRWxlbWVudCkgY3Vyck1lLmVDb250YWluZXIoKTsKLQkJCWlmIChjdXJyTWUgPT0gbnVsbCApIHsKLQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBjdXJyTWUgPT0gbnVsbCwgb2xkTWU6ICIgKyBvbGRNZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVN0cmluZyBwYXRoID0gIiI7Ci0JCXdoaWxlICghIHN0YWNrLmlzRW1wdHkoKSkgewotCQkJcGF0aCArPSAoU3RyaW5nKSBzdGFjay5wb3AoKSArICIvIjsJCQkKLQkJfQotCQlpbnQgaXggPSBwYXRoLmxlbmd0aCgpIC0gMTsKLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGl4KTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93KFN0cmluZyBtc2csIExpc3QgbGlzdCkgewotCQl0cmFjZShtc2cpOwotCQlmb3IgKGludCBpPTA7IGk8bGlzdC5zaXplKCk7IGkrKykgewotCQkJdHJhY2UoImxpc3RbIiArIGkgKyAiXSIgKyBsaXN0LmdldChpKSk7Ci0JCX0KLQkJdHJhY2UoIiIpOwotCX0KLQkJCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvSVRlc3RGb2xkZXJTZXR1cC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvSVRlc3RGb2xkZXJTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGVhMWMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL0lUZXN0Rm9sZGVyU2V0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUZXN0Rm9sZGVyU2V0dXAgewotCi0JLyoqCi0JICogUmV0dXJuIHRvcCB0ZXN0IHJvb3Qgc291cmNlIGZvbGRlciBmaWxlCi0JICovCi0JRmlsZSBnZXRUb3BUZXN0Um9vdFNvdXJjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0ZXN0IGhvbWUgZm9sZGVyIGZpbGUKLQkgKi8KLQlGaWxlIGdldFRlc3RIb21lKCk7CQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeUp1bml0VGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeUp1bml0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjkzZDIyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL0xpYnJhcnlKdW5pdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgVGVzdENhc2UKLSAqIGNsYXNzZXMgdGhhdCB3YW50IHRvIHVzZSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZS4gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeUp1bml0VGVzdCB7Ci0JCi0JLyoKLQkgKiBOdW1iZXIgb2YgdGVzdCBjYXNlcyBpbiB0aGUgaW1wbGVtZW50aW5nCi0JICogVGVzdENhc2UgY2xhc3MuIEl0IGlzIHVzZWQgYnkgTGlicmFyeUp1bml0VGVzdFNlcnZpY2UKLQkgKiB0byBkZXRlcm1pbmUgd2hlbiB0byBjbGVhciB1cCBzb21lIHRlc3RlciByZXNvdXJjZXMuCi0JICovCi0JaW50IG51bVRlc3RDYXNlcygpOwotCQotCS8qCi0JICogTmFtZSBvZiB0aGUgdGVzdCBjbGFzcyBpbnN0YW5jZQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5VGVzdGVyLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YjE0MjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVXNlZCBpbiBKVW5pdCB0ZXN0cyAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5VGVzdGVyIGV4dGVuZHMgVGVzdFRyYWNlciB7CQotCQotCVRlc3RDb21tYW5kIG5ld1Rlc3RDb21tYW5kKENsYXNzIGNscyk7CQotCQotCXZvaWQgc2V0VGVzdFJvb3RTb3VyY2UoRmlsZSBkaXJGaWxlKTsKLQkKLQl2b2lkIHNldFRlc3RSb290V29ya2luZyhGaWxlIGRpckZpbGUpOwotCQotCXZvaWQgb3BlbkN1cnJUZXN0RGlyKEZpbGUgZGlyRmlsZSk7Ci0JCi0Jdm9pZCBjbG9zZUN1cnJUZXN0RGlyKCk7Ci0JCi0Jdm9pZCBkb25lV2l0aEFsbFRlc3RzKEZpbGUgdG9wQ2xlYW5VcEZvbGRlcik7CQotCQkKLQl2b2lkIHNldFRlc3QoRmlsZSB0ZXN0RmlsZSk7CQkJCi0JCi0JaW50IGluY0V4ZWN1dGVkVGVzdENvdW50KCk7Ci0JCi0Jdm9pZCB0cmFjZShTdHJpbmcgbGluZSk7Ci0JCi0JVENFeGVSZXBseUxpc3QgZXhlY3V0ZSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE5M2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1RDRXhlUmVwbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgcmVwbHkgZnJvbSBhIHRlc3QgY29tbWFuZCBleGVjdXRpb24gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVENFeGVSZXBseSB7Ci0JU3RyaW5nIGdldExhc3RNc2coKTsKLQlMaXN0IGdldE1zZ3MoKTsKLQlib29sZWFuIHBhc3NpbmcoKTsJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5TGlzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4MDc5ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyByZXBseSBmcm9tIGEgdGVzdCBjb21tYW5kIGV4ZWN1dGlvbiAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBUQ0V4ZVJlcGx5TGlzdCB7Ci0JaW50IHNpemUoKTsKLQlUQ0V4ZVJlcGx5IGl0ZW0oaW50IGkpOwotCVN0cmluZyBnZXRTdW1tYXJ5UmVwbHkoKTsKLQlib29sZWFuIHBhc3NpbmcoKTsJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0Q29tbWFuZC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZWNkMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RDb21tYW5kIHsJCQkJCi0JCi0JU3RyaW5nIFRlc3ROYW1lRXh0ID0gIi50YyI7Ci0JCi0JLy9BbGwgdGhlIHRhZ3Mgd2lsbCBiZSBmb3JtYWxseSBzcGVjaWZpZWQgYW5kIHJlYWQgZnJvbQotCS8vYSBzY2hlbWEgbGF0ZXIuCi0JCi0JLy9BdHRyaWJ1dGUgdGFncwotCVN0cmluZyBBVF9FeHRJZCA9ICJleHRJZCI7Ci0JU3RyaW5nIEFUX0Rpc2FibGUgPSAiZGlzYWJsZSI7Ci0JU3RyaW5nIEFUX0xpYkZvbGRlck5hbWUgPSAibGliRm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0V4cG9ydEZvbGRlck5hbWUgPSAiZXhwb3J0Rm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0ltcG9ydEZvbGRlck5hbWUgPSAiaW1wb3J0Rm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0dvbGRlbkxpYkZvbGRlck5hbWUgPSAiZ29sZGVuTGliRm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX1NlbGVjdGVkQ29uZmlnTmFtZSA9ICJzZWxlY3RlZENvbmZpZ05hbWUiOwotCVN0cmluZyBBVF9EaWZmQ291bnQgPSAiZGlmZkNvdW50IjsKLQlTdHJpbmcgQVRfRWxlbWVudENvdW50ID0gImVsZW1lbnRDb3VudCI7Ci0JU3RyaW5nIEFUX1VzZU5hbWVBc0lkPSAidXNlTmFtZUFzSWQiOwotCVN0cmluZyBBVF9NZXJnZSA9ICJtZXJnZSI7Ci0JU3RyaW5nIEFUX05hbWUgPSAibmFtZSI7Ci0JU3RyaW5nIEFUX1R5cGUgPSAidHlwZSI7Ci0JU3RyaW5nIEFUX0JyaWVmRGVzY3JpcHRpb24gPSAiYnJpZWZEZXNjcmlwdGlvbiI7Ci0JU3RyaW5nIEFUX0F1dGhvcnMgPSAiYXV0aG9ycyI7Ci0JU3RyaW5nIEFUX1BhcmVudFBhdGg9InBhcmVudFBhdGgiOwotCVN0cmluZyBBVF9QYXJlbnRFeHRJZD0icGFyZW50RXh0SWQiOwotCVN0cmluZyBBVF9QYXRoPSJwYXRoIjsKLQlTdHJpbmcgQVRfUmVjdXJzaXZlPSJyZWN1cnNpdmUiOwotCVN0cmluZyBBVF9Hb2xkZW5GaWxlTmFtZSA9ICJnb2xkZW5GaWxlTmFtZSI7Ci0JU3RyaW5nIEFUX091dHB1dEZpbGVOYW1lID0gIm91dHB1dEZpbGVOYW1lIjsKLQlTdHJpbmcgQVRfRXJyb3JDb3VudCA9ICJlcnJvckNvdW50IjsKLQlTdHJpbmcgQVRfQ2lyY3VsYXJFbGVtZW50Q291bnQgPSAiY2lyY3VsYXJFbGVtZW50Q291bnQiOwotCVN0cmluZyBBVF9WZXJib3NlID0gInZlcmJvc2UiOwotCQkKLQkvL1ZhbHVlIGVsZW1lbnQgdGFncwotCVN0cmluZyBWVF9iYXNlcyA9ICJiYXNlcyI7Ci0JU3RyaW5nIFZUX1ZhbHVlID0gIlZhbHVlIjsKLQkJCQkKLQlTdHJpbmcgdGFnTmFtZSgpOwotCS8vTGlicmFyeVRlc3RlciBnZXRUZXN0ZXIoKTsJCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSk7Ci0JU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSk7Ci0Jdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpOwotCVRDRXhlUmVwbHkgZXhlY3V0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdFRyYWNlci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdFRyYWNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDgyY2Y3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1Rlc3RUcmFjZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RUcmFjZXIgewotCXZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9FeHBvcnRJbXBvcnRUZXN0SW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9FeHBvcnRJbXBvcnRUZXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY4M2M1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvRXhwb3J0SW1wb3J0VGVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwb3J0SW1wb3J0VGVzdEltcGwgZXh0ZW5kcyBMaWJyYXJ5SnVuaXRUZXN0SW1wbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNvdXJjZUZvbGRlck5hbWUgPSAiRXhwb3J0SW1wb3J0IjsKLQlwcml2YXRlIHN0YXRpYyAgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0ZXN0Um9vdFdvcmtpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRmlsZSBkZWZhdWx0VGVzdERpcjsgCi0JCi0JcHVibGljIEV4cG9ydEltcG9ydFRlc3RJbXBsKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEZpbGUgZ2V0VGVzdFJvb3RTb3VyY2UoKSB7Ci0JCWlmICh0ZXN0Um9vdFNvdXJjZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldFNlcnZpY2UoKS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIHNvdXJjZUZvbGRlck5hbWUgKyAgRmlsZS5zZXBhcmF0b3I7Ci0JCQl0ZXN0Um9vdFNvdXJjZSA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCXJldHVybiB0ZXN0Um9vdFNvdXJjZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBGaWxlIGdldFRlc3RSb290V29ya2luZygpIHsKLQkJRmlsZSB0ZXN0Um9vdFdvcmtpbmcgPSAoRmlsZSkgdGVzdFJvb3RXb3JraW5nTWFwLmdldChnZXRDbGFzcygpKTsKLQkJaWYgKHRlc3RSb290V29ya2luZyA9PSBudWxsKSB7Ci0JCQlDbGFzcyBjbHMgPSBnZXRDbGFzcygpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCQkKLQkJCVNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3M6U1NTIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkdFN0ciA9IHNkZi5mb3JtYXQobmV3IERhdGUoKSk7Ci0JCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJyAnLCAnXycpOwotCQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCc6JywgJy0nKTsKLQkJCQotCQkJU3RyaW5nIHBhdGggPSBnZXRTZXJ2aWNlKCkuZ2V0VGVzdEdyb3VwKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgY2xzLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZU5hbWUubGVuZ3RoKCkgKyAxKTsKLQkJCXBhdGggKz0gIl8iICsgZHRTdHIgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCXRlc3RSb290V29ya2luZyA9IG5ldyBGaWxlKHBhdGgpOwotCQkJdGVzdFJvb3RXb3JraW5nTWFwLnB1dChnZXRDbGFzcygpLCB0ZXN0Um9vdFdvcmtpbmcpOwotCQl9Ci0JCXJldHVybiB0ZXN0Um9vdFdvcmtpbmc7Ci0JfQotCQotCXByb3RlY3RlZCBGaWxlIGdldERlZmF1bHRUZXN0RGlyKCkgewotCQlpZiAoZGVmYXVsdFRlc3REaXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRUZXN0Um9vdFdvcmtpbmcoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgZ2V0TmFtZSgpOyAKLQkJCWRlZmF1bHRUZXN0RGlyID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJCi0JCXJldHVybiBkZWZhdWx0VGVzdERpcjsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5SnVuaXRUZXN0SW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5SnVuaXRUZXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODExNzBlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvTGlicmFyeUp1bml0VGVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuTGlicmFyeUp1bml0VGVzdDsKLQotLyoqCi0gKiBMaWJyYXJ5IGp1bml0IHRlc3QgYmFzZSBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlicmFyeUp1bml0VGVzdEltcGwgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIExpYnJhcnlKdW5pdFRlc3QgewotCi0JcHJpdmF0ZSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlOwkKLQkKLQlwdWJsaWMgTGlicmFyeUp1bml0VGVzdEltcGwoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXNlcnZpY2UgPSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZS5nZXRJbnN0YW5jZSh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZ2V0VGVzdFJvb3RTb3VyY2UoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRUZXN0Um9vdFdvcmtpbmcoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXREZWZhdWx0VGVzdERpcigpOwotCQotCQotCXB1YmxpYyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBnZXRTZXJ2aWNlKCkgewotCQlyZXR1cm4gc2VydmljZTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXNlcnZpY2Uuc2V0VXAoZ2V0VGVzdFJvb3RTb3VyY2UoKSwgZ2V0VGVzdFJvb3RXb3JraW5nKCksIGdldERlZmF1bHRUZXN0RGlyKCksIHRoaXMpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJc2VydmljZS50ZWFyRG93bih0aGlzKTsKLQl9CQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmRTZXRVcCgpIHsKLQkJc2VydmljZS50cmFjZSgiZW5kU2V0VXA6ICIgKyBnZXROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmRUZWFyRG93bigpIHsJCQotCQlzZXJ2aWNlLnRyYWNlKCJlbmRUZWFyRG93bjogIiArIGdldE5hbWUoKSk7Ci0JCXNlcnZpY2UudHJhY2UoIiIpOwkKLQl9CQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5VGVzdGVySW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5VGVzdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNjOTZlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvTGlicmFyeVRlc3RlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RlckltcGwgaW1wbGVtZW50cyBMaWJyYXJ5VGVzdGVyIHsKLQkKLQlwcml2YXRlIFRlc3RDb21tYW5kTWdyIHRlc3RDb21tYW5kTWdyOwotCQotCXB1YmxpYyBMaWJyYXJ5VGVzdGVySW1wbChib29sZWFuIHRyYWNlKSB7Ci0JCXRlc3RDb21tYW5kTWdyID0gbmV3IFRlc3RDb21tYW5kTWdyKHRyYWNlKTsKLQl9CQkJCi0JCi0JcHVibGljIHZvaWQgc2V0VGVzdFJvb3RTb3VyY2UoRmlsZSBkaXJGaWxlKSB7Ci0JCXRlc3RDb21tYW5kTWdyLnNldFRlc3RSb290U291cmNlKGRpckZpbGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFdvcmtpbmcoRmlsZSBkaXJGaWxlKSB7Ci0JCXRlc3RDb21tYW5kTWdyLnNldFRlc3RSb290V29ya2luZyhkaXJGaWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3BlbkN1cnJUZXN0RGlyKEZpbGUgZGlyRmlsZSkgewotCQl0ZXN0Q29tbWFuZE1nci5vcGVuQ3VyclRlc3REaXIoZGlyRmlsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlQ3VyclRlc3REaXIoKSB7Ci0JCXRlc3RDb21tYW5kTWdyLmNsb3NlQ3VyclRlc3REaXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9uZVdpdGhBbGxUZXN0cyhGaWxlIHRvcENsZWFuVXBGb2xkZXIpIHsKLQkJdGVzdENvbW1hbmRNZ3IuZG9uZVdpdGhBbGxUZXN0cyh0b3BDbGVhblVwRm9sZGVyKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0Q3VyclRlc3REaXIoKSB7Ci0JCXJldHVybiB0ZXN0Q29tbWFuZE1nci5nZXRDdXJyVGVzdERpcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0KEZpbGUgdGVzdEZpbGUpIHsKLQkJdGVzdENvbW1hbmRNZ3Iuc2V0VGVzdCh0ZXN0RmlsZSk7Ci0JfQkJCi0JCi0JcHVibGljIFRDRXhlUmVwbHlMaXN0IGV4ZWN1dGUoKSB7Ci0JCXJldHVybiB0ZXN0Q29tbWFuZE1nci5leGVjdXRlKCk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQl0ZXN0Q29tbWFuZE1nci50cmFjZShsaW5lKTsKLQl9CQotCQotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJcmV0dXJuIHRlc3RDb21tYW5kTWdyLm5ld1Rlc3RDb21tYW5kKGNscyk7Ci0JfQkJCi0JCi0JcHVibGljIGludCBpbmNFeGVjdXRlZFRlc3RDb3VudCgpIHsKLQkJcmV0dXJuIHRlc3RDb21tYW5kTWdyLmluY0V4ZWN1dGVkVGVzdENvdW50KCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMjRjZjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENOZXdNZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFVzZWQgaW4gSlVuaXQgdGVzdHMgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0Q29tbWFuZEltcGwgaW1wbGVtZW50cyBUZXN0Q29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBUQ05ld01ldGhvZEVsZW1lbnQgbmV3TWV0aG9kRWxlbWVudCA9IG5ldyBUQ05ld01ldGhvZEVsZW1lbnQoKTsgCi0JCi0JcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgVGVzdENvbW1hbmRNZ3Igb3duZXI7Ci0JcHJpdmF0ZSBNYXAgYXR0dGlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRPd25lcihUZXN0Q29tbWFuZE1nciBtZ3IpIHsKLQkJb3duZXIgPSBtZ3I7Ci0JfQotCQotCXByb3RlY3RlZCBNYXAgZ2V0QXR0cmlidXRlTWFwKCkgewotCQlyZXR1cm4gYXR0dGlidXRlTWFwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlpZiAoYXR0VmFsdWUgIT0gbnVsbCAmJiBhdHRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCWF0dHRpYnV0ZU1hcC5wdXQoYXR0TmFtZSwgYXR0VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBhdHROYW1lKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBhdHR0aWJ1dGVNYXAucmVtb3ZlKGF0dE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSkgewotCQlyZXR1cm4gKFN0cmluZykgYXR0dGlidXRlTWFwLmdldChhdHROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXNldEF0dHJpYnV0ZShBVF9WZXJib3NlLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9WZXJib3NlKSk7Ci0JCXZlcmJvc2UgPSBwYXJzZUJvb2xlYW4oQVRfVmVyYm9zZSwgdmVyYm9zZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGdldFZlcmJvc2UoKSB7Ci0JCXJldHVybiB2ZXJib3NlOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VDaGlsZHJlbihFbGVtZW50IGVsZW1lbnQpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlc3RDb21tYW5kTWdyIGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIHRhZ05hbWUoKSB7Ci0JCXJldHVybiBvd25lciA9PSBudWxsID8gbnVsbCA6IG93bmVyLmdldFRhZ05hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHBhcnNlQm9vbGVhbihTdHJpbmcgYXR0LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgdG9DaGVja1N0ciA9IGRlZmF1bHRWYWx1ZSA/ICJmYWxzZSIgOiAidHJ1ZSI7Ci0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoYXR0KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5lcXVhbHNJZ25vcmVDYXNlKHRvQ2hlY2tTdHIpKSB7Ci0JCQlyZXR1cm4gIWRlZmF1bHRWYWx1ZTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgcGFyc2VJbnRlZ2VyKFN0cmluZyBhdHQsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGF0dCAhPSBudWxsICYmIGF0dC5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGF0dCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIEVDbGFzcyBnZXRFQ2xhc3MoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ld01ldGhvZEVsZW1lbnQuZ2V0RUNsYXNzKHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQluZXdNZXRob2RFbGVtZW50LnNhdmUoZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBsaW5lKSB7Ci0JCWdldE93bmVyKCkubG9nKGxpbmUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRNZ3IuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRNZ3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2MzVkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL1Rlc3RDb21tYW5kTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeURpZmZBbmFseXpvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5SnVuaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RUcmFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvR29sZGVuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb21wYXJlVG9MaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvcHlMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0VkaXRNZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4ZVJlcGx5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeGVSZXBseUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4cG9ydENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0UGx1Z2luczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDSW1wb3J0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENJbXBvcnRQbHVnaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0ltcG9ydFhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENOZXdNZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ05ld01ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDTmV3TWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ091dHB1dE1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbW1hbmRNZ3IgaW1wbGVtZW50cyBUZXN0VHJhY2VyIHsJCi0JCi0JLy9BbGwgdGhlIHRhZ3Mgd2lsbCBiZSBmb3JtYWxseSBzcGVjaWZpZWQgYW5kIHJlYWQgZnJvbQotCS8vYSBzY2hlbWEgbGF0ZXIuCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0NvcHlMaWJyYXJ5ID0gIkNvcHlMaWJyYXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENPcGVuTGlicmFyeSA9ICJPcGVuTGlicmFyeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRXhwb3J0UGx1Z2lucyA9ICJFeHBvcnRQbHVnaW5zIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENJbXBvcnRQbHVnaW5zID0gIkltcG9ydFBsdWdpbnMiOwkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFeHBvcnRDb25maWd1cmF0aW9uID0gIkV4cG9ydENvbmZpZ3VyYXRpb24iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0ltcG9ydENvbmZpZ3VyYXRpb24gPSAiSW1wb3J0Q29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRXhwb3J0WG1sID0gIkV4cG9ydFhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDSW1wb3J0WG1sID0gIkltcG9ydFhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDQ29tcGFyZVRvTGlicmFyeSA9ICJDb21wYXJlVG9MaWJyYXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENDb21wYXJlVG9Hb2xkZW5GaWxlID0gIkNvbXBhcmVUb0dvbGRlbkZpbGUiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ05ld01ldGhvZFBsdWdpbiA9ICJOZXdNZXRob2RQbHVnaW4iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ05ld01ldGhvZENvbmZpZ3VyYXRpb24gPSAiTmV3TWV0aG9kQ29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDTmV3TWV0aG9kRWxlbWVudCA9ICJOZXdNZXRob2RFbGVtZW50IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFZGl0TWV0aG9kRWxlbWVudCA9ICJFZGl0TWV0aG9kRWxlbWVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgPSAiQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2siOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VuZCA9ICJFbmQiOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VkaXRQbHVnaW49IkVkaXRQbHVnaW4iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VkaXRDb25maWd1cmF0aW9uPSJFZGl0Q29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRWRpdENvbnRlbnRQYWNrYWdlPSJFZGl0Q29udGVudFBhY2thZ2UiOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRDT3V0cHV0TGlicmFyeT0iT3V0cHV0TGlicmFyeSI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVENPdXRwdXRQbHVnaW49Ik91dHB1dFBsdWdpbiI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVENPdXRwdXRDb25maWd1cmF0aW9uPSJPdXRwdXRDb25maWd1cmF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQ091dHB1dE1ldGhvZEVsZW1lbnQ9Ik91dHB1dE1ldGhvZEVsZW1lbnQiOwotCQkKLQlwcml2YXRlIGJvb2xlYW4gdHJhY2UgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRmlsZXMgPSB0cnVlOwotCQotCXByaXZhdGUgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQlwcml2YXRlIEZpbGUgdGVzdFJvb3RXb3JraW5nOwotCXByaXZhdGUgRmlsZSBjdXJyVGVzdERpcjsKLQlwcml2YXRlIFN0cmluZyBvdXRwdXRQYXRoOwotCXByaXZhdGUgRG9jdW1lbnQgb3V0cHV0RG9jdW1lbnQ7Ci0JcHJpdmF0ZSBQcmludFN0cmVhbSB0ZXN0Um9vdE91dDsKLQlwcml2YXRlIFByaW50U3RyZWFtIGN1cnJUZXN0T3V0OwotCXByaXZhdGUgaW50IGV4ZWN1dGVkVGVzdENvdW50ID0gMDsJCi0JCQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlUZXN0U2VydmljZSBzZXJ2aWNlID0gTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBGaWxlIHRlc3RGaWxlOwotCXByaXZhdGUgTGlzdCB0ZXN0Q29tbWFuZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaWJyYXJ5SnVuaXRUZXN0IGp1bml0VGVzdENhc2U7Ci0JCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGN1cnJlbnRCYXNlTGliOwotCXByaXZhdGUgTWFwIGFsbExpYnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGFsbEV4cG9ydHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwkKLQkKLQlwcml2YXRlIHN0YXRpYyBNYXAgdGNDbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIHRjVGFnTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBQcmludFN0cmVhbSBsb2dQUyA9IFN5c3RlbS5vdXQ7Ci0JCi0Jc3RhdGljIHsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDQ29weUxpYnJhcnksIFRDQ29weUxpYnJhcnkuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPcGVuTGlicmFyeSwgVENPcGVuTGlicmFyeS5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0V4cG9ydFBsdWdpbnMsIFRDRXhwb3J0UGx1Z2lucy5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0ltcG9ydFBsdWdpbnMsIFRDSW1wb3J0UGx1Z2lucy5jbGFzcyk7CQkKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRXhwb3J0Q29uZmlndXJhdGlvbiwgVENFeHBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDSW1wb3J0Q29uZmlndXJhdGlvbiwgVENJbXBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRXhwb3J0WG1sLCBUQ0V4cG9ydFhtbC5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0ltcG9ydFhtbCwgVENJbXBvcnRYbWwuY2xhc3MpOwkJCi0JCWFkZFRvVGNDbGFzc01hcChUQ0NvbXBhcmVUb0xpYnJhcnksIFRDQ29tcGFyZVRvTGlicmFyeS5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0NvbXBhcmVUb0dvbGRlbkZpbGUsIFRDQ29tcGFyZVRvR29sZGVuRmlsZS5jbGFzcyk7Ci0JCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENOZXdNZXRob2RQbHVnaW4sIFRDTmV3TWV0aG9kUGx1Z2luLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDTmV3TWV0aG9kQ29uZmlndXJhdGlvbiwgVENOZXdNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzKTsJCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENOZXdNZXRob2RFbGVtZW50LCBUQ05ld01ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0TWV0aG9kRWxlbWVudCwgVENFZGl0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0UGx1Z2luLCBUQ0VkaXRNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRWRpdENvbmZpZ3VyYXRpb24sIFRDRWRpdE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0Q29udGVudFBhY2thZ2UsIFRDRWRpdE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQkKLQkJYWRkVG9UY0NsYXNzTWFwKFRDT3V0cHV0TGlicmFyeSwgVENPdXRwdXRNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDT3V0cHV0UGx1Z2luLCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPdXRwdXRDb25maWd1cmF0aW9uLCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPdXRwdXRNZXRob2RFbGVtZW50LCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjaywgVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjay5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9UY0NsYXNzTWFwKFN0cmluZyBlbGVtZW50TmFtZSwgQ2xhc3MgY2xzKSB7Ci0JCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YW5jZSA9IGNscy5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFRlc3RDb21tYW5kKSB7Ci0JCQl0Y0NsYXNzTWFwLnB1dChlbGVtZW50TmFtZSwgaW5zdGFuY2UpOwotCQkJdGNUYWdOYW1lTWFwLnB1dChjbHMsIGVsZW1lbnROYW1lKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIFRlc3RDb21tYW5kTWdyKGJvb2xlYW4gdHJhY2UpIHsKLQkJaWYgKHRyYWNlKSB7Ci0JCQl0aGlzLnRyYWNlID0gdHJhY2U7Ci0JCQl0aGlzLnJlbW92ZUZpbGVzID0gIXRyYWNlOwotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhZ05hbWUoVGVzdENvbW1hbmQgdGNJbnN0YW5jZSkgewotCQlyZXR1cm4gKFN0cmluZykgdGNUYWdOYW1lTWFwLmdldCh0Y0luc3RhbmNlLmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFNvdXJjZShGaWxlIGRpckZpbGUpIHsKLQkJdGVzdFJvb3RTb3VyY2UgPSBkaXJGaWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFdvcmtpbmcoRmlsZSBkaXJGaWxlKSB7Ci0JCWJvb2xlYW4gbmVlZFRvQ3JlYXRlT3V0cHV0RmlsZSA9IHRlc3RSb290V29ya2luZyA9PSBudWxsIHx8Ci0JCQkJCQkJCSEgdGVzdFJvb3RXb3JraW5nLmVxdWFscyhkaXJGaWxlKTsKLQkJCi0JCXRlc3RSb290V29ya2luZyA9IGRpckZpbGU7Ci0JCQotCQlpZiAodHJhY2UgJiYgbmVlZFRvQ3JlYXRlT3V0cHV0RmlsZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoISB0ZXN0Um9vdFdvcmtpbmcuZXhpc3RzKCkpIHsJCQkJCQotCQkJCQlpZiAoISBta0Rpcih0ZXN0Um9vdFdvcmtpbmcpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCQkJdGVzdFJvb3RPdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHBhdGggPSB0ZXN0Um9vdFdvcmtpbmcuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICJ0cmFjZXMub3V0IjsKLQkJCQl0ZXN0Um9vdE91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1rRGlyKEZpbGUgZmlsZSkgewotCQlGaWxlIHBGaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CQkKLQkJaWYgKCEgcEZpbGUuZXhpc3RzKCkpIHsJCQkJCQotCQkJaWYgKCEgbWtEaXIocEZpbGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlLm1rZGlyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9wZW5DdXJyVGVzdERpcihGaWxlIGRpckZpbGUpIHsKLQkJY3VyclRlc3REaXIgPSBkaXJGaWxlOwotCQkKLQkJdHJ5IHsKLQkJCWlmICghIGN1cnJUZXN0RGlyLmV4aXN0cygpKSB7Ci0JCQkJY3VyclRlc3REaXIubWtkaXIoKTsKLQkJCX0KLQkJCVN0cmluZyBwYXRoID0gY3VyclRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCWlmICh0cmFjZSkgewotCQkJCWN1cnJUZXN0T3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGggKyAidHJhY2Uub3V0IikpOwotCQkJfQotCQkJb3V0cHV0UGF0aCA9IHBhdGggKyAib3V0cHV0LnhtbCI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZUN1cnJUZXN0RGlyKCkgewotCQljbG9zZUxpYnJhcnkoZ2V0Q3VycmVudEJhc2VMaWIoKSk7Ci0JCWlmIChjdXJyVGVzdE91dCAhPSBudWxsKSB7Ci0JCQljdXJyVGVzdE91dC5jbG9zZSgpOwotCQkJY3VyclRlc3RPdXQgPSBudWxsOwotCQl9Ci0JCWNsZWFyT3V0cHV0RG9jdW1lbnQoKTsKLQkJYWxsTGlicyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCWFsbEV4cG9ydHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQljbG9zZUZvbGRlcihjdXJyVGVzdERpcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvbmVXaXRoQWxsVGVzdHMoRmlsZSB0b3BDbGVhblVwRm9sZGVyKSB7Ci0JCWNsb3NlQWxsRXhwb3J0UHJvamVjdHMoKTsKLQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCXRlc3RSb290T3V0LmNsb3NlKCk7Ci0JCX0KLQkJY2xvc2VGb2xkZXIodG9wQ2xlYW5VcEZvbGRlcik7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEN1cnJUZXN0RGlyKCkgewotCQlyZXR1cm4gY3VyclRlc3REaXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRlc3QoRmlsZSB0ZXN0RmlsZSkgewotCQl0aGlzLnRlc3RGaWxlID0gdGVzdEZpbGU7CQkKLQl9CQotCQotCXB1YmxpYyBGaWxlIGdldFRlc3RGaWxlKCkgewotCQlyZXR1cm4gdGVzdEZpbGU7CQkKLQl9CQotCQotCQotCXB1YmxpYyBMaWJyYXJ5VGVzdFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5TGlzdCBleGVjdXRlKCkgewotCQl0cmFjZSgiQmVnaW4gZXhlY3V0aW5nOiAiICsgdGVzdEZpbGUpOwotCi0JCVRDRXhlUmVwbHlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCUV4Y2VwdGlvbiBsb2FkRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxvYWRlZCA9IGxvYWRUZXN0KCk7CQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2FkRXhjZXB0aW9uID0gZTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCWlmIChsb2FkZWQpIHsJCQkKLQkJCVN0cmluZyBwYXRoID0gdGVzdFJvb3RXb3JraW5nLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyB0ZXN0RmlsZS5nZXROYW1lKCkgKyAiLmRpciI7Ci0JCQlvcGVuQ3VyclRlc3REaXIobmV3IEZpbGUgKHBhdGgpKTsKLQkJCXJlc3VsdCA9IGV4ZWN1dGVDb21tYW5kcygpOwkJCi0JCQljbG9zZUN1cnJUZXN0RGlyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXcgVENFeGVSZXBseUxpc3RJbXBsKCk7Ci0JCQlpZiAobG9hZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1zZyA9ICJUZXN0IGxvYWQgZmFpbGVkOiAiICsgbG9hZEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCk7Ci0JCQkJKChUQ0V4ZVJlcGx5TGlzdEltcGwpIHJlc3VsdCkuYWRkKG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKSk7Ci0JCQkJdHJhY2UobXNnKTsKLQkJCX0gZWxzZSB7CQkJCi0JCQkJdHJhY2UoIlRlc3QgZGlzYWJsZWQiKTsKLQkJCX0KLQkJfQotCQkKLQkJdHJhY2UoIkVuZCBleGVjdXRpbmcgIDogIiArIHRlc3RGaWxlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRlc3RDb21tYW5kTGlzdC5jbGVhcigpOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbCh0ZXN0RmlsZSk7CQotCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKHJvb3QuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0Rpc2FibGUpLmVxdWFscygidHJ1ZSIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CQkJCQotCQl9Ci0JCWJvb2xlYW4gdmVyYm9zZSA9IHJvb3QuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX1ZlcmJvc2UpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQkJTm9kZUxpc3Qgbm9kZXMgPSByb290LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHN6ID0gbm9kZXMgPT0gbnVsbCA/IDAgOiBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9WZXJib3NlLCAidHJ1ZSIpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShUQ0VuZCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWFkZENvbW1hbmQobm9kZSk7Ci0JCQl9Ci0JCX0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5TGlzdCBleGVjdXRlQ29tbWFuZHMoKSB7Ci0JCVRDRXhlUmVwbHlMaXN0SW1wbCByZXN1bHQgPSBuZXcgVENFeGVSZXBseUxpc3RJbXBsKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx0ZXN0Q29tbWFuZExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVRlc3RDb21tYW5kSW1wbCBjb21tYW5kID0gKFRlc3RDb21tYW5kSW1wbCkgdGVzdENvbW1hbmRMaXN0LmdldChpKTsKLQkJCVRDRXhlUmVwbHkgcmVwbHkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXBseSA9IGNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJlcGx5ID0gbmV3IFRDRXhlUmVwbHlJbXBsKGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQocmVwbHkpOwotCQkJCWlmICghcmVwbHkucGFzc2luZygpKSB7Ci0JCQkJCWxvZygiXG5UaGUgZm9sbG93aW5nIGNvbW1hbmQgaXMgbm90IHBhc3Npbmc6IFxuIiArICBjb21tYW5kLmdldEVsZW1lbnQoKSArICJcbiIpOwotCQkJCX0KLQkJCX0KLQkJfQkJCQotCQkKLQkJU3RyaW5nIGxpbmUgPSB0ZXN0RmlsZS5nZXROYW1lKCkgKyAiIGlzICI7Ci0JCVN0cmluZyBkaXJTdHIgPSAidGVzdFJvb3RTb3VyY2U6ICIgKyB0ZXN0Um9vdFNvdXJjZSAKLQkJCQkJCSsgIiwgdGVzdFJvb3RXb3JraW5nOiAiICsgdGVzdFJvb3RXb3JraW5nOwotCQlpZiAocmVzdWx0LnBhc3NpbmcoKSkgewotCQkJbGluZSArPSAicGFzc2luZy4gIiArIGRpclN0cjsKLQkJfSBlbHNlIHsKLQkJCWxpbmUgKz0gImZhaWxpbmchICIgKyBkaXJTdHI7Ci0JCX0KLQkJcmVzdWx0LnNldFN1bW1hcnlSZXBseShsaW5lKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCXRlc3RSb290T3V0LnByaW50bG4obGluZSk7Ci0JCX0KLQkJCi0JCWlmIChjdXJyVGVzdE91dCAhPSBudWxsKSB7Ci0JCQljdXJyVGVzdE91dC5wcmludGxuKGxpbmUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDb21tYW5kKE5vZGUgbm9kZSkgewotCQlpZiAoICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmICghIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0Rpc2FibGUpLmVxdWFscygidHJ1ZSIpKSB7Ci0JCQlUZXN0Q29tbWFuZCBjb21tYW5kID0gbmV3VGVzdENvbW1hbmQoZWxlbWVudC5nZXRUYWdOYW1lKCkpOwotCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWNvbW1hbmQucGFyc2UoZWxlbWVudCk7Ci0JCQkJdGVzdENvbW1hbmRMaXN0LmFkZChjb21tYW5kKTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChTdHJpbmcgY29tYW5kTmFtZSkgewotCQlPYmplY3Qgb2JqID0gdGNDbGFzc01hcC5nZXQoY29tYW5kTmFtZSk7Ci0JCXJldHVybiBvYmogPT0gbnVsbCA/IG51bGwgOiBuZXdUZXN0Q29tbWFuZChvYmouZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJVGVzdENvbW1hbmQgcmV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldCA9IChUZXN0Q29tbWFuZCkgY2xzLm5ld0luc3RhbmNlKCk7Ci0JCQkoKFRlc3RDb21tYW5kSW1wbCkgcmV0KS5zZXRPd25lcih0aGlzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpZk5ld1RoZW5CdWlsZERlYWZhdWx0TGliKSB7Ci0JCWlmIChjdXJyZW50QmFzZUxpYiAhPSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjdXJyZW50QmFzZUxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewkJCQotCQkJCXJldHVybiBjdXJyZW50QmFzZUxpYjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGFsbEV4cG9ydHMuY29udGFpbnNLZXkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlzZXJ2aWNlLmNsb3NlTGlicmFyeShjdXJyZW50QmFzZUxpYik7Ci0JCQotCQljdXJyZW50QmFzZUxpYiA9IG51bGw7Ci0JCVN0cmluZyBsaWJQYXRoID0gKFN0cmluZykgYWxsTGlicy5nZXQobmFtZSk7Ci0JCWlmIChsaWJQYXRoID09IG51bGwpIHsKLQkJCWxpYlBhdGggPSBjdXJyVGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbmFtZTsJCi0JCQl0cnkgewotCQkJCWN1cnJlbnRCYXNlTGliID0gY29weUZyb21UZXN0TGlicyhsaWJQYXRoLCBuYW1lKSA/ICAKLQkJCQkJCQkJWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnkobGliUGF0aCkgOiBudWxsOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkJCi0JCQl9Ci0JCQlpZiAoY3VycmVudEJhc2VMaWIgPT0gbnVsbCkgewotCQkJCWN1cnJlbnRCYXNlTGliID0gc2VydmljZS5jcmVhdGVMaWJyYXJ5KGxpYlBhdGgsIG5hbWUpOwotCQkJCWlmIChpZk5ld1RoZW5CdWlsZERlYWZhdWx0TGliKSB7Ci0JCQkJCWJ1aWxkRGVmYXVsdExpYnJhcnkoKTsKLQkJCQl9Ci0JCQkJdHJhY2UoIkJhc2UgbGliIFwiIiArIG5hbWUgKyAiXCIgaXMgY3JlYXRlZC4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdHJhY2UoIkJhc2UgbGliIFwiIiArIG5hbWUgKyAiXCIgaXMgY29waWVkIGZyb20gdGVzdExpYnMgYW5kIGxhb2RlZC4iKTsKLQkJCX0KLQkJCWFsbExpYnMucHV0KG5hbWUsIGxpYlBhdGgpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQljdXJyZW50QmFzZUxpYiA9IFhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5KGxpYlBhdGgpOwotCQkJCXRyYWNlKCJCYXNlIGxpYiBcIiIgKyBuYW1lICsgIlwiIGlzIGxvYWRlZC4iKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBjdXJyZW50QmFzZUxpYjsKLQl9CQkJCi0JCi0JcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZE5vbkJhc2VMaWIoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGxpYlBhdGggPSAoU3RyaW5nKSBhbGxMaWJzLmdldChuYW1lKTsKLQkJaWYgKGxpYlBhdGggPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2UubG9hZExpYnJhcnkobGliUGF0aCk7Ci0JfQkJCQotCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEN1cnJlbnRCYXNlTGliKCkgewotCQlyZXR1cm4gY3VycmVudEJhc2VMaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRCYXNlTGliKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCWN1cnJlbnRCYXNlTGliID0gbGliOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbG9hZEJhc2VMaWIobmFtZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYk9yQnVpbGRCYXNlV2l0aERlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGxvYWRCYXNlTGliKG5hbWUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRJbXBvcnRGaWxlKFN0cmluZyBpbXBvcnRGb2xkZXJOYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBhbGxFeHBvcnRzLmdldChpbXBvcnRGb2xkZXJOYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJZmlsZSA9IG5ldyBGaWxlKHRlc3RSb290U291cmNlLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBpbXBvcnRGb2xkZXJOYW1lKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXB1YmxpYyBGaWxlIHJlZ2lzdGVyRXhwb3J0RGVzdGluYXRpb24oU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNYTUwpIHsKLQkJaWYgKGFsbExpYnMuY29udGFpbnNLZXkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBhbGxFeHBvcnRzLmdldChuYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBjdXJyVGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbmFtZTsKLQkJCWlmIChpc1hNTCkgewotCQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBuYW1lICsgIi54bWwiOwotCQkJfQotCQkJZmlsZSA9ICBuZXcgRmlsZShwYXRoKTsKLQkJCWFsbEV4cG9ydHMucHV0KG5hbWUsIGZpbGUpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0JCi0JCi0JcHVibGljIHZvaWQgY2xvc2VMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXNlcnZpY2UuY2xvc2VMaWJyYXJ5KGxpYik7Ci0JCXNldEN1cnJlbnRCYXNlTGliKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZUZvbGRlcihGaWxlIGZvbGRlcikgewotCQlpZiAocmVtb3ZlRmlsZXMpIHsKLQkJCXNlcnZpY2UuZGVsZXRlRm9sZGVyKGZvbGRlcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBpbmNFeGVjdXRlZFRlc3RDb3VudCgpIHsKLQkJcmV0dXJuICsrZXhlY3V0ZWRUZXN0Q291bnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlQWxsRXhwb3J0UHJvamVjdHMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBhbGxFeHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpdC5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChmaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKXsJCQkJCQotCQkJfQotCQl9CQotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZUxpYnMoTWV0aG9kTGlicmFyeSBsaWIxLCAgTWV0aG9kTGlicmFyeSBsaWIyKSB7Ci0JCXJldHVybiBjb21wYXJlTGlicyhsaWIxLCBsaWIyLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbXBhcmVMaWJzKE1ldGhvZExpYnJhcnkgbGliMSwgIE1ldGhvZExpYnJhcnkgbGliMiwgYm9vbGVhbiB1c2VOYW1lQXMybmRJZCkgewotCQlMaWJyYXJ5RGlmZkFuYWx5em9yIGFuYWx5em9yID0gbmV3IExpYnJhcnlEaWZmQW5hbHl6b3IodGhpcywgbGliMSwgbGliMik7Ci0JCWFuYWx5em9yLnNldEdyZWVkeSh0cmFjZSk7Ci0JCWFuYWx5em9yLnNldFVzZU5hbWVBczJuZElkKHVzZU5hbWVBczJuZElkKTsKLQkJcmV0dXJuIGFuYWx5em9yLmNvbXBhcmUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZUxpYnMoTWV0aG9kTGlicmFyeSBsaWIxLCAgTWV0aG9kTGlicmFyeSBsaWIyLCBpbnQgZGlmZkNvdW50LCBpbnQgZWxlbUNvbXBhcmVkQ291bnQsIGJvb2xlYW4gdXNlTmFtZUFzMm5kSWQpIHsKLQkJaWYgKGRpZmZDb3VudCA9PSAwICYmIGVsZW1Db21wYXJlZENvdW50ID09IDApIHsKLQkJCXJldHVybiBjb21wYXJlTGlicyhsaWIxLCBsaWIyLCB1c2VOYW1lQXMybmRJZCk7Ci0JCX0KLQkJTGlicmFyeURpZmZBbmFseXpvciBhbmFseXpvciA9IG5ldyBMaWJyYXJ5RGlmZkFuYWx5em9yKHRoaXMsIGxpYjEsIGxpYjIpOwotCQlhbmFseXpvci5zZXRHcmVlZHkodHJ1ZSk7Ci0JCWFuYWx5em9yLnNldFVzZU5hbWVBczJuZElkKHVzZU5hbWVBczJuZElkKTsKLQkJYW5hbHl6b3IuY29tcGFyZSgpOwotCQlyZXR1cm4gCWFuYWx5em9yLmdldERpZmZDb3VudCgpID09IGRpZmZDb3VudCAmJgotCQkJIAlhbmFseXpvci5nZXRFbGVtQ29tcGFyZWRDb3VudCgpID09IGVsZW1Db21wYXJlZENvdW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZERlZmF1bHRMaWJyYXJ5KCkgewkJCi0JCXRyYWNlKCJidWlsZERlZmF1bHRMaWJyYXJ5IC0+Iik7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJQbHVnX0EiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oIkNvbmZpZ19BIik7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7CQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoY3AyLCBjcDEpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uCi0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AxLmVDb250YWluZXIoKSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMi5lQ29udGFpbmVyKCkpOwotCQkKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJZmluYWwgU3RyaW5nIGNwMV90ZXh0ID0gImNwMSBtYWluIGRlc2MiOwotCQlmaW5hbCBTdHJpbmcgY3AyX3RleHQgPSAiY3AyIG1haW4gZGVzYyI7Ci0JCQkKLQkJY3AxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjcDFfdGV4dCk7Ci0JCWNwMi5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY3AyX3RleHQpOwotCi0JCXRyYWNlKCJidWlsZERlZmF1bHRMaWJyYXJ5IDwtIik7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29weUZyb21UZXN0TGlicyhTdHJpbmcgbGliUGF0aCwgU3RyaW5nIHJlbExpYk5hbWVQYXRoKSB7Ci0JCUZpbGUgc291cmNlID0gbmV3IEZpbGUodGVzdFJvb3RTb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHJlbExpYk5hbWVQYXRoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBzb3VyY2UuZ2V0TmFtZSgpOwotCQlGaWxlIGxpYkxpc3RbXSA9IHNvdXJjZS5nZXRQYXJlbnRGaWxlKCkubGlzdEZpbGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxsaWJMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBsaWJMaXN0W2ldOwotCQkJaWYgKGxpYk5hbWUuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUobGliUGF0aCk7Ci0JCQkJUGx1Z2luSW1wb3J0aW5nU2VydmljZS5jb3B5RGlyKHNvdXJjZSwgdGFyZ2V0KTsKLQkJCQlhbGxMaWJzLnB1dChsaWJOYW1lLCBsaWJQYXRoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBEb2N1bWVudCBnZXRPdXRwdXREb2N1bWVudCgpIHsKLQkJaWYgKG91dHB1dERvY3VtZW50ID09IG51bGwpIHsJCQkKLQkJCXRyeSB7Ci0JCQkJb3V0cHV0RG9jdW1lbnQgPSBYTUxVdGlsLmNyZWF0ZURvY3VtZW50KCk7Ci0JCSAgICAgICAgRWxlbWVudCByb290ID0gb3V0cHV0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVGVzdGVyT3V0cHV0Iik7Ci0JCSAgICAgICAgb3V0cHV0RG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dHB1dERvY3VtZW50OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJPdXRwdXREb2N1bWVudCgpIHsKLQkJb3V0cHV0RG9jdW1lbnQgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFBhdGgoKSB7Ci0JCXJldHVybiBvdXRwdXRQYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2coU3RyaW5nIGxpbmUpIHsKLQkJbG9nUFMucHJpbnRsbihsaW5lKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMmMzY2UuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lJbmZvTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5UcmFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfQ2lyY3VsYXJFbGVtZW50Q291bnQsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0NpcmN1bGFyRWxlbWVudENvdW50KSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlpbnQgZXJyb3JDb3VudCA9IHBhcnNlSW50ZWdlcihnZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCksIDApOwotCQlpbnQgY2lyY3VsYXJFbGVtZW50Q291bnQgPSBwYXJzZUludGVnZXIoZ2V0QXR0cmlidXRlKEFUX0NpcmN1bGFyRWxlbWVudENvdW50KSwgMCk7Ci0JCWZpbmFsIFRlc3RDb21tYW5kTWdyIG93bmVyID0gZ2V0T3duZXIoKTsKLQkJCi0JCVRyYWNlciB0cmFjZXIgPSBuZXcgVHJhY2VyKCkgewotCQkJcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJCQlvd25lci50cmFjZShsaW5lKTsKLQkJCX0KLQkJfTsKLQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3Iob3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKSk7Ci0JCURlcGVuZGVuY3lJbmZvTWdyLkNoZWNrUmVzdWx0IGNoZWNrUmVzdWx0ID0gaW5mb01nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeSh0cmFjZXIpOwotCQkKLQkJaWYgKGNoZWNrUmVzdWx0LmdldEVycm9yQ291bnQoKSAhPSBlcnJvckNvdW50IHx8IAotCQkJCWNoZWNrUmVzdWx0LmdldENpcmN1bGFyRWxlbWVudENvdW50KCkgIT0gY2lyY3VsYXJFbGVtZW50Q291bnQpIHsKLQkJCVN0cmluZyBtc2cgPSAiY2hlY2tSZXN1bHQuZ2V0RXJyb3JDb3VudCgpID0gIiArIGNoZWNrUmVzdWx0LmdldEVycm9yQ291bnQoKSArICJcbiI7Ci0JCQltc2cgKz0gImNoZWNrUmVzdWx0LmdldENpcmN1bGFyRWxlbWVudENvdW50KCkgPSAiICsgY2hlY2tSZXN1bHQuZ2V0Q2lyY3VsYXJFbGVtZW50Q291bnQoKTsKLQkJCW93bmVyLnRyYWNlKG1zZyk7Ci0JCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKG1zZywgZmFsc2UpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0dvbGRlbkZpbGUuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvR29sZGVuRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjM2MGZhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvR29sZGVuRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5PdXRwdXREaWZmQW5hbHl6b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDQ29tcGFyZVRvR29sZGVuRmlsZSBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9Hb2xkZW5GaWxlTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfR29sZGVuRmlsZU5hbWUpKTsKLQkJc2V0QXR0cmlidXRlKEFUX0RpZmZDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9FbGVtZW50Q291bnQsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGdvbGRlbkZpbGVOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0dvbGRlbkZpbGVOYW1lKTsKLQkJaW50IGRpZmZDb3VudCA9IHBhcnNlSW50ZWdlcihnZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KSwgMCk7Ci0JCWludCBlbGVtZW50Q291bnQgPSBwYXJzZUludGVnZXIoZ2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCksIDApOwkKLQkJVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQkKLQkJRG9jdW1lbnQgb3V0cHV0RG9jdW1lbnQgPSBvd25lci5nZXRPdXRwdXREb2N1bWVudCgpOwotCQlpZiAob3V0cHV0RG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBvdXRwdXRQYXRoID0gb3duZXIuZ2V0T3V0cHV0UGF0aCgpOwotCQl0cnkgewotCQkJWE1MVXRpbC5zYXZlRG9jdW1lbnQob3V0cHV0RG9jdW1lbnQsIG91dHB1dFBhdGgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCVN0cmluZyBwYXRoID0gb3duZXIuZ2V0VGVzdEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaW50IGl4ID0gcGF0aC5sYXN0SW5kZXhPZigiLiIpOwotCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaXgpICsgIi54bWwiOwotCQlGaWxlIGdvbGRlbk91dHB1dCA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoZ29sZGVuT3V0cHV0LmV4aXN0cygpKSB7Ci0JCQlPdXRwdXREaWZmQW5hbHl6b3IgYW5hbHlzb3IgPSBuZXcgT3V0cHV0RGlmZkFuYWx5em9yKG93bmVyLCBudWxsLCBvdXRwdXREb2N1bWVudCwKLQkJCQkJZ29sZGVuT3V0cHV0LCBuZXcgRmlsZShvdXRwdXRQYXRoKSk7Ci0JCQlhbmFseXNvci5jb21wYXJlKCk7Ci0JCQlpZiAoYW5hbHlzb3IuZ2V0RGlmZkNvdW50KCkgIT0gZGlmZkNvdW50IHx8Ci0JCQkJCWVsZW1lbnRDb3VudCAhPSAwICYmIGFuYWx5c29yLmdldEVsZW1Db21wYXJlZENvdW50KCkgIT0gZWxlbWVudENvdW50KSB7CQkJCQotCQkJCVN0cmluZyBtc2cgPSAiT3VwdHV0IGFuZCBnb2xkZW4gZmlsZSBjb21wYXJpc29uIGZhaWxzISAiOwotCQkJCW93bmVyLnRyYWNlKG1zZyk7Ci0JCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDb21wYXJlVG9MaWJyYXJ5LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExZTM1ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0NvbXBhcmVUb0xpYnJhcnkgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfR29sZGVuTGliRm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfR29sZGVuTGliRm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50LCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9EaWZmQ291bnQpKTsKLQkJc2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50KSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9Vc2VOYW1lQXNJZCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfVXNlTmFtZUFzSWQpKTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCVN0cmluZyBnb2xkZW5MaWJGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0dvbGRlbkxpYkZvbGRlck5hbWUpOwotCQlpbnQgZGlmZkNvdW50ID0gMDsKLQkJaW50IGVsZW1lbnRDb3VudCA9IDA7Ci0JCWJvb2xlYW4gdXNlTmFtZUFzSWQgPSBmYWxzZTsKLQkJCi0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCWRpZmZDb3VudCA9IEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQotCQlzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCWVsZW1lbnRDb3VudCA9IEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQkJCi0JCXN0ciA9IGdldEF0dHJpYnV0ZShBVF9Vc2VOYW1lQXNJZCk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQl1c2VOYW1lQXNJZCA9IHN0ci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7Ci0JCX0JCi0JCQotCQlUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCU1ldGhvZExpYnJhcnkgZ29sZGVuTGliICA9IG93bmVyLmxvYWROb25CYXNlTGliKGdvbGRlbkxpYkZvbGRlck5hbWUpOwotCQlNZXRob2RMaWJyYXJ5IGN1ckxpYiAgPSBvd25lci5nZXRDdXJyZW50QmFzZUxpYigpOwkKLQkJaWYgKHVzZU5hbWVBc0lkKSB7Ci0JCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5maXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGdvbGRlbkxpYiwgY3VyTGliKTsKLQkJfQotCQlib29sZWFuIHJlc3VsdCA9IG93bmVyLmNvbXBhcmVMaWJzKGdvbGRlbkxpYiwgY3VyTGliLCBkaWZmQ291bnQsIGVsZW1lbnRDb3VudCwgdXNlTmFtZUFzSWQpOwotCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKCIiLCByZXN1bHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29weUxpYnJhcnkuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29weUxpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkYTFjZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvcHlMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENDb3B5TGlicmFyeSBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJc2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUpKTsKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIHJlbExpYk5hbWVQYXRoID0gZ2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUpOwotCQlpbnQgaXggPSByZWxMaWJOYW1lUGF0aC5sYXN0SW5kZXhPZigiLyIpOwkJCi0JCVN0cmluZyBsaWJGb2xkZXJOYW1lID0gaXggPCAwID8gcmVsTGliTmFtZVBhdGggOiByZWxMaWJOYW1lUGF0aC5zdWJzdHJpbmcoaXggKyAxKTsKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRPd25lcigpLmdldEN1cnJUZXN0RGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGxpYkZvbGRlck5hbWU7CQotCQlnZXRPd25lcigpLmNvcHlGcm9tVGVzdExpYnMobGliUGF0aCwgcmVsTGliTmFtZVBhdGgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzg5MjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFZGl0TWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3Rlck91dHB1dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRWRpdE1ldGhvZEVsZW1lbnQgZXh0ZW5kcyBUQ0VkaXRNZXRob2RFbGVtZW50QmFzZSB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQotCQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnRCYXNlLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODg2Y2NlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnRCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdGVyT3V0cHV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRDRWRpdE1ldGhvZEVsZW1lbnRCYXNlIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCQotCQotCXN0YXRpYyBjbGFzcyBUYWdEYXRhIHsKLQkJcHVibGljIE1hcCBhdHRNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQlwdWJsaWMgTWFwIHJlZk1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JfQotCQotCXByaXZhdGUgRUNsYXNzIGVjbGFzczsKLQlwcml2YXRlIFRhZ0RhdGEgdGFnRGF0YTsKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQlwcml2YXRlIE1hcCByZWZWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVjbGFzc0RhdGFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTGlzdCBjaGlsZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiBpc0NoaWxkQ29tbWFuZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBUZXN0Q29tbWFuZCBuZXdDaGlsZENvbW1hbmQoQ2xhc3MgdHlwZSkgewotCQl0cnkgewotCQkJVENFZGl0TWV0aG9kRWxlbWVudEJhc2UgY29tbWFuZCA9IChUQ0VkaXRNZXRob2RFbGVtZW50QmFzZSkgdHlwZS5uZXdJbnN0YW5jZSgpOwotCQkJY29tbWFuZC5zZXRPd25lcihnZXRPd25lcigpKTsKLQkJCWNvbW1hbmQuc2V0SXNDaGlsZENvbW1hbmQodHJ1ZSk7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5ld0NoaWxkQ29tbWFuZDogIiArIHR5cGUpOwotCQkJfQotCQkJcmV0dXJuIGNvbW1hbmQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJaW5pdChlbGVtZW50KTsKLQkJcGFyc2VBdHRyaWJ1dGVzKCk7CQkKLQkJcGFyc2VWYWx1ZUNoaWxkcmVuKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX1R5cGUpOwotCQllY2xhc3MgPSBtZXRob2RFbGVtZW50ID09IG51bGwgPyBnZXRFQ2xhc3ModHlwZSkgOiBtZXRob2RFbGVtZW50LmVDbGFzcygpOwotCQlpZiAoZWNsYXNzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0YWdEYXRhID0gKFRhZ0RhdGEpIGVjbGFzc0RhdGFNYXAuZ2V0KGVjbGFzcyk7Ci0JCWlmICh0YWdEYXRhICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCXRhZ0RhdGEgPSBuZXcgVGFnRGF0YSgpOwotCQllY2xhc3NEYXRhTWFwLnB1dChlY2xhc3MsIHRhZ0RhdGEpOwotCQkKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVjbGFzczogIiArIGVjbGFzcy5nZXROYW1lKCkpOwotCQkJVGVzdGVyT3V0cHV0VXRpbC5zaG93KCJlY2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKSIsIGVjbGFzcy5nZXRFQWxsQXR0cmlidXRlcygpKTsKLQkJCVRlc3Rlck91dHB1dFV0aWwuc2hvdygiZWNsYXNzLmdldEVBbGxSZWZlcmVuY2VzKCkiLCBlY2xhc3MuZ2V0RUFsbFJlZmVyZW5jZXMoKSk7Ci0JCX0KLQkJCi0JCWFkZFRvRWNsYXNzRGF0YU1hcChlY2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKSwgdGFnRGF0YS5hdHRNYXApOwotCQlhZGRUb0VjbGFzc0RhdGFNYXAoZWNsYXNzLmdldEVBbGxSZWZlcmVuY2VzKCksIHRhZ0RhdGEucmVmTWFwKTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRUb0VjbGFzc0RhdGFNYXAoTGlzdCBmZWF0dXJlcywgTWFwIGZlYU1hcCkgewotCQlib29sZWFuIHZlcmJvc2UgPSBnZXRWZXJib3NlKCk7Ci0JCWJvb2xlYW4gaXNSZWYgPSBmYWxzZTsKLQkJaWYgKHZlcmJvc2UpIHsKLQkJCWlmIChmZWFNYXAgPT0gdGFnRGF0YS5hdHRNYXApIHsKLQkJCQlsb2coIlxuQXR0cmlidXRlIGZlYXR1ZXMgZm9yICIgKyAiXCIiICsgZWNsYXNzLmdldE5hbWUoKSArICJcIjogIik7Ci0JCQl9IGVsc2UgaWYgKGZlYU1hcCA9PSB0YWdEYXRhLnJlZk1hcCkgewotCQkJCWxvZygiXG5SZWZlcmVuY2UgZmVhdHVlcyBmb3IgIiArICJcIiIgKyBlY2xhc3MuZ2V0TmFtZSgpICsgIlwiOiAiKTsKLQkJCQlpc1JlZiA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsJCQkKLQkJCWZlYU1hcC5wdXQoZmVhdHVyZS5nZXROYW1lKCksIGZlYXR1cmUpOwotCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQlTdHJpbmcgbGluZSA9ICIiOwotCQkJCWlmIChpc1JlZikgewotCQkJCQlsaW5lICs9ICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNDb250YWlubWVudCgpID8KLQkJCQkJCQkiY29udGFpbmVkLCAiIDogInJlZmVycmVkICwgIjsKLQkJCQkJbGluZSArPSAoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmlzTWFueSgpID8KLQkJCQkJCQkibWFueSAgIC0+ICIgOiAic2luZ2xlIC0+ICI7Ci0JCQkJfQotCQkJCWxpbmUgKz0gZmVhdHVyZS5nZXROYW1lKCkgKyAiOiAiOwotCQkJCWxpbmUgKz0gaXNSZWYgPyAoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmdldEVSZWZlcmVuY2VUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKQotCQkJCQkJCTogKChFQXR0cmlidXRlKSBmZWF0dXJlKS5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3NOYW1lKCk7Ci0JCQkJbG9nKGxpbmUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlQXR0cmlidXRlcygpIHsKLQkJc2V0QXR0cmlidXRlKEFUX1R5cGUsIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoQVRfVHlwZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUGF0aCwgZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShBVF9QYXRoKSk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFnRGF0YS5hdHRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgYXRfdGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlzZXRBdHRyaWJ1dGUoYXRfdGFnLCBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKGF0X3RhZykpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlVmFsdWVDaGlsZHJlbigpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRhZ0RhdGEucmVmTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGNoaWxkVGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlzZXRBdHRyaWJ1dGUoY2hpbGRUYWcsIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoY2hpbGRUYWcpKTsKLQkJCXBhcnNlQ2hpbGRUYWdBc1ZhbHVlKGNoaWxkVGFnKTsJCQkJCQkJCQkKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUNoaWxkVGFnQXNWYWx1ZShTdHJpbmcgY2hpbGRUYWcpIHsKLQkJTm9kZUxpc3QgY25vZGVzID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnKTsKLQkJaWYgKGNub2RlcyA9PSBudWxsIHx8IGNub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRWxlbWVudCBjRWxlbWVudCA9IChFbGVtZW50KSBjbm9kZXMuaXRlbSgwKTsKLQkJY25vZGVzID0gY0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVlRfVmFsdWUpOwkKLQkJaWYgKGNub2RlcyA9PSBudWxsIHx8IGNub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdCB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCB2RWxlbSA9IChFbGVtZW50KSBjbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHZFbGVtLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKLQkJCXZhbHVlTGlzdC5hZGQodmFsdWUpOwotCQl9Ci0JCXJlZlZhbHVlTWFwLnB1dChjaGlsZFRhZywgdmFsdWVMaXN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9CQotCQotCXByb3RlY3RlZCBUYWdEYXRhIGdldFRhZ0RhdGEoKSB7Ci0JCXJldHVybiB0YWdEYXRhOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcGFyc2VDaGlsZFRhZ0FzQ29tbWFuZChFbGVtZW50IGNFbGVtZW50LCBTdHJpbmcgY2hpbGRUYWcpIHsKLQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gKEVSZWZlcmVuY2UpIHRhZ0RhdGEucmVmTWFwLmdldChjaGlsZFRhZyk7Ci0JCWlmICghIGZlYXR1cmUuaXNDb250YWlubWVudCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJVENFZGl0TWV0aG9kRWxlbWVudEJhc2UgY2hpbGRDb21tYW5kID0gKFRDRWRpdE1ldGhvZEVsZW1lbnRCYXNlKSBuZXdDaGlsZENvbW1hbmQoVENFZGl0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCU9iamVjdCBmZWF0dXJlT2JqID0gbWV0aG9kRWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBvd25lckxpc3QgPSAoTGlzdCkgZmVhdHVyZU9iajsKLQkJCWZlYXR1cmVPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZmVhdHVyZS5nZXRFUmVmZXJlbmNlVHlwZSgpKTsKLQkJCW93bmVyTGlzdC5hZGQoZmVhdHVyZU9iaik7Ci0JCX0gCi0JCWNoaWxkQ29tbWFuZC5zZXRNZXRob2RFbGVtZW50KChNZXRob2RFbGVtZW50KSBmZWF0dXJlT2JqKTsKLQkJaWYgKGdldFZlcmJvc2UoKSkgewotCQkJY0VsZW1lbnQuc2V0QXR0cmlidXRlKEFUX1ZlcmJvc2UsICJ0cnVlIik7Ci0JCX0KLQkJY2hpbGRDb21tYW5kLnBhcnNlKGNFbGVtZW50KTsKLQkJYWRkVG9DaGlsZENvbW1hbmRzKGNoaWxkQ29tbWFuZCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGFyc2VDb21tYW5kQ2hpbGRyZW4oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YWdEYXRhLnJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBjaGlsZFRhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJTm9kZUxpc3QgY25vZGVzID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnKTsKLQkJCWlmIChjbm9kZXMgPT0gbnVsbCB8fCBjbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZm9yIChpbnQgaT0wOyBpPGNub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBjRWxlbWVudCA9IChFbGVtZW50KSBjbm9kZXMuaXRlbShpKTsKLQkJCQlwYXJzZUNoaWxkVGFnQXNDb21tYW5kKGNFbGVtZW50LCBjaGlsZFRhZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBUQ0V4ZVJlcGx5IGV4ZWN1dGVDaGlsZENvbW1hbmRzKCkgewotCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRDb21tYW5kcy5zaXplKCk7IGkrKykgewotCQkJVGVzdENvbW1hbmQgY29tbWFuZCA9IChUZXN0Q29tbWFuZCkgY2hpbGRDb21tYW5kcy5nZXQoaSk7Ci0JCQlUQ0V4ZVJlcGx5IHJlc3VsdCA9IGNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQucGFzc2luZygpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsJCQotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBnZXRPd25lcigpLmdldEN1cnJlbnRCYXNlTGliKCk7CQkKLQkJU3RyaW5nIHBhdGggPSBnZXRBdHRyaWJ1dGUoQVRfUGF0aCk7Ci0JCWlmIChtZXRob2RFbGVtZW50ID09IG51bGwpIHsKLQkJCWlmIChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZWNsYXNzKSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJbWV0aG9kRWxlbWVudCA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0UHJvY2Vzc0VsZW1lbnQoY3VyckxpYiwgcGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZEVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1ldGhvZEVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcGFyc2VDb21tYW5kQ2hpbGRyZW4oKTsKLQkJCi0JCWVTZXRCeUF0dHJpYnV0ZXMoKTsKLQkJZVNldEJ5VmFsdWVDaGlsZHJlbigpOwotCQkKLQkJZXhlY3V0ZUNoaWxkQ29tbWFuZHMoKTsKLQkJCi0JCWlmICghIGdldElzQ2hpbGRDb21tYW5kKCkpIHsKLQkJCXNhdmUobWV0aG9kRWxlbWVudCk7Ci0JCQkvL3NhdmUoKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBlU2V0QnlBdHRyaWJ1dGVzKCkgewotCQlNYXAgYXR0TWFwID0gZ2V0VGFnRGF0YSgpLmF0dE1hcDsKLQkJTWFwIGF0dHJpYnV0ZU1hcCA9IGdldEF0dHJpYnV0ZU1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGF0X3RhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJRUF0dHJpYnV0ZSBlYXR0ID0gKEVBdHRyaWJ1dGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFRGF0YVR5cGUgZGF0YVR5cGUgPSBlYXR0LmdldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQlTdHJpbmcgYXRfdmFsID0gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChhdF90YWcpOwotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhdF90YWc6ICIgKyBhdF90YWcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGF0X3ZhbDogIiArIGF0X3ZhbCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWF0dDogIiArIGVhdHQpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGRhdGFUeXBlOiAiICsgZGF0YVR5cGUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCQl9CQkJCi0JCQlpZiAoYXRfdmFsID09IG51bGwgfHwgYXRfdmFsLmxlbmd0aCgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCBuZXdWYWx1ZSA9IGdldEVTZXRWYWx1ZShkYXRhVHlwZSwgYXRfdmFsKTsKLQkJCQotCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKLQkJCQltZXRob2RFbGVtZW50LmVTZXQoZWF0dCwgbmV3VmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2coIlxuV2FybmluZzogbm90IGhhbmRsZWQgZGF0YVR5cGU6ICIgKyBkYXRhVHlwZS5nZXRJbnN0YW5jZUNsYXNzTmFtZSgpKTsKLQkJCX0KLQkJfQotCQlFQXR0cmlidXRlIGRhdGVBdHQgPSAoRUF0dHJpYnV0ZSkgYXR0TWFwLmdldCgiY2hhbmdlRGF0ZSIpOwotCQlpZiAoZGF0ZUF0dCAhPSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50LmVTZXQoZGF0ZUF0dCwgbmV3IERhdGUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RVNldFZhbHVlKEVEYXRhVHlwZSBkYXRhVHlwZSwgU3RyaW5nIHN0clZhbCkgewotCQlDbGFzcyBjbHMgPSBkYXRhVHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7CQkKLQkJaWYgKGNscy5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotCQkJcmV0dXJuIHN0clZhbDsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhCb29sZWFuLmNsYXNzKSkgewotCQkJYm9vbGVhbiBiID0gc3RyVmFsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQkJCWlmICghYiAmJiAhc3RyVmFsLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgQm9vbGVhbihiKTsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhEYXRlLmNsYXNzKSkgewotCQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOwotCQkJRGF0ZSBkYXRlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZGF0ZSA9IHNkZi5wYXJzZShzdHJWYWwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGF0ZTsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuY2xhc3MpKSB7Ci0JCQlpZiAoc3RyVmFsLmVxdWFscygiY29udHJpYnV0ZXMiKSkgewotCQkJCXJldHVybiBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVM7Ci0JCQl9Ci0JCQlpZiAoc3RyVmFsLmVxdWFscygiZXh0ZW5kcyIpKSB7Ci0JCQkJcmV0dXJuIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTOwotCQkJfQotCQkJaWYgKHN0clZhbC5lcXVhbHMoInJlcGxhY2VzIikpIHsKLQkJCQlyZXR1cm4gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZVNldEJ5VmFsdWVDaGlsZHJlbigpIHsKLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwkKLQkJTWFwIHJlZk1hcCA9IGdldFRhZ0RhdGEoKS5yZWZNYXA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVmX3RhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJRVJlZmVyZW5jZSBlcmVmID0gKEVSZWZlcmVuY2UpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFQ2xhc3NpZmllciBlVHlwZSA9IGVyZWYuZ2V0RVR5cGUoKTsKLQkJCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHJlZlZhbHVlTWFwLmdldChyZWZfdGFnKTsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVmX3RhZzogIiArIHJlZl90YWcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHZhbHVlTGlzdDogIiArIHZhbHVlTGlzdCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZXJlZjogIiArIGVyZWYpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVUeXBlOiAiICsgZVR5cGUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCQl9Ci0JCQkKLQkJCWludCBzeiA9IHZhbHVlTGlzdCA9PSBudWxsID8gMCA6IHZhbHVlTGlzdC5zaXplKCk7Ci0JCQlpZiAoc3ogPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGVyZWYuaXNNYW55KCkpIHsKLQkJCQlMaXN0IG93bmVyTGlzdCA9IChMaXN0KSBtZXRob2RFbGVtZW50LmVHZXQoZXJlZik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCQkJU3RyaW5nIHJlZlBhdGggPSAoU3RyaW5nKSB2YWx1ZUxpc3QuZ2V0KGkpOwotCQkJCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcmVmUGF0aCk7Ci0JCQkJCWlmIChyZWZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCW93bmVyTGlzdC5hZGQocmVmRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHN6ID09IDEpewotCQkJCVN0cmluZyByZWZQYXRoID0gKFN0cmluZykgdmFsdWVMaXN0LmdldCgwKTsKLQkJCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcmVmUGF0aCk7Ci0JCQkJaWYgKGVyZWYuZ2V0TmFtZSgpLmVxdWFscygidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIpIAotCQkJCQkJJiYgcmVmRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJcmVmRWxlbWVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudClyZWZFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCW1ldGhvZEVsZW1lbnQuZVNldChlcmVmLCByZWZFbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SXNDaGlsZENvbW1hbmQoYm9vbGVhbiBiKSB7Ci0JCWlzQ2hpbGRDb21tYW5kID0gYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0SXNDaGlsZENvbW1hbmQoKSB7Ci0JCXJldHVybiBpc0NoaWxkQ29tbWFuZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9DaGlsZENvbW1hbmRzKFRlc3RDb21tYW5kIGNvbW1hbmQpIHsKLQkJY2hpbGRDb21tYW5kcy5hZGQoY29tbWFuZCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlJbXBsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4ZVJlcGx5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTdkNjJlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci0KLS8qKgotICogSW1wbGVtZW50aW5nIFRDRXhlUmVwbHkKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRXhlUmVwbHlJbXBsIGltcGxlbWVudHMgVENFeGVSZXBseSB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHBhc3NpbmcgPSB0cnVlOwotCXByaXZhdGUgTGlzdCBtc2dzOwotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5SW1wbChTdHJpbmcgbXNnLCBib29sZWFuIHBhc3NpbmcpIHsKLQkJYWRkTXNnKG1zZyk7Ci0JCXNldFBhc3NpbmcocGFzc2luZyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdE1zZygpIHsKLQkJaW50IHN6ID0gbXNncyA9PSBudWxsID8gMCA6IG1zZ3Muc2l6ZSgpOwkJCQotCQlyZXR1cm4gc3ogPT0gMCA/IG51bGwgOiAoU3RyaW5nKSBtc2dzLmdldChzeiAtIDEpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRNc2dzKCkgewotCQlyZXR1cm4gbXNnczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGFzc2luZygpIHsKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1zZyhTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCB8fCBtc2cubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtc2dzID09IG51bGwpIHsKLQkJCW1zZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJbXNncy5hZGQobXNnKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFzc2luZyhib29sZWFuIGIpIHsKLQkJcGFzc2luZyA9IGI7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4ZVJlcGx5TGlzdEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMwNmMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5TGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRpbmcgQ0V4ZVJlcGx5TGlzdAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBUQ0V4ZVJlcGx5TGlzdEltcGwgaW1wbGVtZW50cyBUQ0V4ZVJlcGx5TGlzdCB7Ci0JTGlzdCByZXBseUxpc3QgPSBudWxsOwotCVN0cmluZyAJc3VtbWFyeVJlcGx5OwotCQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHJlcGx5TGlzdCA9PSBudWxsID8gMCA6IHJlcGx5TGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIFRDRXhlUmVwbHkgaXRlbShpbnQgaSkgewotCQlyZXR1cm4gKFRDRXhlUmVwbHkpIHJlcGx5TGlzdC5nZXQoaSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHBhc3NpbmcoKSB7CQotCQlmb3IgKGludCBpPTA7IGk8c2l6ZSgpOyBpKyspIHsKLQkJCWlmICghIGl0ZW0oaSkucGFzc2luZygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChUQ0V4ZVJlcGx5IHJlcGx5KSB7Ci0JCWlmIChyZXBseUxpc3QgPT0gbnVsbCkgewotCQkJcmVwbHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJlcGx5TGlzdC5hZGQocmVwbHkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5UmVwbHkoU3RyaW5nIHN0cikgewotCQlzdW1tYXJ5UmVwbHkgPSBzdHI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeVJlcGx5KCkgewotCQlyZXR1cm4gc3VtbWFyeVJlcGx5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjY2NkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENFeHBvcnRDb25maWd1cmF0aW9uIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfU2VsZWN0ZWRDb25maWdOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9TZWxlY3RlZENvbmZpZ05hbWUpKTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCVRlc3RDb21tYW5kTWdyIG93bmVyID0gZ2V0T3duZXIoKTsKLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gb3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJaWYgKGN1cnJMaWIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBleHBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0V4cG9ydEZvbGRlck5hbWUpOwkJCi0JCVN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfU2VsZWN0ZWRDb25maWdOYW1lKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIExpYnJhcnlUZXN0U2VydmljZS5nZXRFbGVtZW50Ci0JCQkJCQkoY3VyckxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgc2VsZWN0ZWRDb25maWdOYW1lKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRmlsZSBleHBvcnRGb2xkZXIgPSBvd25lci5yZWdpc3RlckV4cG9ydERlc3RpbmF0aW9uKGV4cG9ydEZvbGRlck5hbWUsIGZhbHNlKTsJCQkJCi0JCWZpbmFsIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEoKTsKLQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShjdXJyTGliLmdldE5hbWUoKSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihleHBvcnRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlkYXRhLmV4cG9ydE9uZUNvbmZpZyA9IHRydWU7Ci0JCWRhdGEuZXhwb3J0Q29uZmlnU3BlY3MgPSBmYWxzZTsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRhdGEuc2VsZWN0ZWRDb25maWdzLmFkZChjb25maWcpOwotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCShuZXcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydFBsdWdpbnMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0UGx1Z2lucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI2NmVjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0UGx1Z2lucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0V4cG9ydFBsdWdpbnMgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJTGlzdCBzZWxlY3RlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KGdldE93bmVyKCkuZ2V0Q3VycmVudEJhc2VMaWIoKS5nZXRNZXRob2RQbHVnaW5zKCkpOwkKLQkJCi0JCWludCBzeiA9IHNlbGVjdGVkUGx1Z2lucyA9PSBudWxsID8gMCA6IHNlbGVjdGVkUGx1Z2lucy5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsgCi0JCX0KLQkJCi0JCVN0cmluZyBleHBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0V4cG9ydEZvbGRlck5hbWUpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgc2VsZWN0ZWRQbHVnaW5zLmdldCgwKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZSBleHBvcnRGb2xkZXIgPSBnZXRPd25lcigpLnJlZ2lzdGVyRXhwb3J0RGVzdGluYXRpb24oZXhwb3J0Rm9sZGVyTmFtZSwgZmFsc2UpOwotCQkKLQkJZmluYWwgUGx1Z2luRXhwb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShmaWxlLmdldE5hbWUoKSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihleHBvcnRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlkYXRhLnNldFNlbGVjdGVkUGx1Z2lucyhzZWxlY3RlZFBsdWdpbnMpOwotCQlkYXRhLmJ1aWxkQXNzb2NpYXRlZENvbmZpZ01hcCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkobmV3IFBsdWdpbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRYbWwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0WG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTdkZWQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRXhwb3J0WG1sIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQlTdHJpbmcgZXhwb3J0Rm9sZGVyTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lKTsKLQkJCi0JCU1ldGhvZExpYnJhcnkgbGliID0gb3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZSBleHBvcnRGaWxlID0gb3duZXIucmVnaXN0ZXJFeHBvcnREZXN0aW5hdGlvbihleHBvcnRGb2xkZXJOYW1lLCB0cnVlKTsJCQotCQkKLQkJZmluYWwgRXhwb3J0WE1MRGF0YSBkYXRhID0gbmV3IEV4cG9ydFhNTERhdGEoKTsKLQkJZGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZKTsKLQkJZGF0YS5zZXRYTUxGaWxlKGV4cG9ydEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCShuZXcgRXhwb3J0WE1MU2VydmljZShkYXRhKSkuZG9FeHBvcnQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENJbXBvcnRDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNmUxMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkVsZW1lbnREaWZmVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDSW1wb3J0Q29uZmlndXJhdGlvbiBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQotCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJZmluYWwgVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQlTdHJpbmcgaW1wb3J0Rm9sZGVyTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lKTsKLQkJCi0JCUZpbGUgZmlsZSA9IG93bmVyLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnREYXRhKCk7Ci0JCWRhdGEubGxEYXRhLnNldExpYk5hbWUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCi0KLQkJZmluYWwgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgaW1wb3J0U2VydmljZSA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZShkYXRhKTsKLQkJaW1wb3J0U2VydmljZS5hbmFseXplKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoaW1wb3J0U2VydmljZS5nZXREaWZmVHJlZSgpKTsKLQkJZGF0YS5pbXBvcnRMaXN0LmNsZWFyKCk7Ci0JCWZvciAoIGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrICkgewotCQkJZGF0YS5pbXBvcnRMaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCX0KLQkJCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbXBvcnRTZXJ2aWNlLnBlcmZvcm1JbXBvcnQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliICA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJb3duZXIuc2V0Q3VycmVudEJhc2VMaWIobGliKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGFibGUoRWxlbWVudERpZmZUcmVlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG5vZGUuaXNPbGRPbmx5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlNZXRob2RFbGVtZW50IGJhc2UgPSBub2RlLmdldEJhc2VFbGVtZW50KCk7Ci0JCWlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkmJiBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKChNZXRob2RQYWNrYWdlKWJhc2UpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0Tm9kZXMoRWxlbWVudERpZmZUcmVlIG5vZGUsIEFycmF5TGlzdCBzZWxlY3RlZE5vZGVzKSB7Ci0JCWlmICghIHNlbGVjdGFibGUobm9kZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZWxlY3RlZE5vZGVzLmFkZChub2RlKTsKLQkJTGlzdCBjbm9kZXMgPSBub2RlLmdldENoaWxkcmVuKCk7Ci0JCWludCBzeiA9IGNub2RlcyA9PSBudWxsID8gMCA6IGNub2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlFbGVtZW50RGlmZlRyZWUgY25vZGUgPSAoRWxlbWVudERpZmZUcmVlKSBjbm9kZXMuZ2V0KGkpOwotCQkJc2VsZWN0Tm9kZXMoY25vZGUsIHNlbGVjdGVkTm9kZXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RWxlbWVudHMoRWxlbWVudERpZmZUcmVlIHJvb3QpIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNlbGVjdE5vZGVzKHJvb3QsIHNlbGVjdGVkTm9kZXMpOwotCQlyZXR1cm4gc2VsZWN0ZWROb2Rlcy50b0FycmF5KCk7Ci0JfQotCQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENJbXBvcnRQbHVnaW5zLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFBsdWdpbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3Yjg1ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFBsdWdpbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0ltcG9ydFBsdWdpbnMgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGltcG9ydEZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCQotCQlGaWxlIGZpbGUgPSBnZXRPd25lcigpLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgVENFeGVSZXBseUltcGwoIkNhbiBub3QgbG9jYXRlIGltcG9ydEZvbGRlck5hbWU6ICIgKyBpbXBvcnRGb2xkZXJOYW1lLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCVBsdWdpbkltcG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5JbXBvcnREYXRhKCk7Ci0JCWRhdGEubGxEYXRhLnNldExpYk5hbWUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCQotCQlmaW5hbCBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIGltcG9ydFNlcnZpY2UgPSBuZXcgUGx1Z2luSW1wb3J0aW5nU2VydmljZShkYXRhKTsKLQkJaW1wb3J0U2VydmljZS52YWxpZGF0ZShudWxsKTsKLQkJTGlzdCBpbXBvcnRQbHVnaW5zID0gZGF0YS5nZXRQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IGltcG9ydFBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCVBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbmZvKSBpbXBvcnRQbHVnaW5zLmdldChpKTsKLQkJCWluZm8uc2VsZWN0ZWQgPSB0cnVlOwotCQl9Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW1wb3J0U2VydmljZS5wZXJmb3JtSW1wb3J0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiAgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCWdldE93bmVyKCkuc2V0Q3VycmVudEJhc2VMaWIobGliKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0WG1sLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI1MjIxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0WG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlcy5JbXBvcnRYTUxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZE1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENJbXBvcnRYbWwgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTWVyZ2UsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX01lcmdlKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlmaW5hbCBUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCVN0cmluZyBpbXBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0ltcG9ydEZvbGRlck5hbWUpOwotCQlib29sZWFuIG1lcmdlID0gZmFsc2U7Ci0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfTWVyZ2UpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgewotCQkJbWVyZ2UgPSBmYWxzZTsKLQkJfQotCQkKLQkJRmlsZSBmaWxlMCA9IG93bmVyLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlMC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGZpbGUwLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlMC5nZXROYW1lKCkgKyAiLnhtbCI7Ci0JCQlmaWxlMCA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCQotCQlmaW5hbCBGaWxlIGZpbGUgPSBmaWxlMDsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhIGZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQkJCi0JCWZpbmFsIGJvb2xlYW4gb3ZlcndyaXRlID0gISBtZXJnZTsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCUltcG9ydFhNTFNlcnZpY2UgaW1wb3J0U2VydmljZSA9IG5ldyBJbXBvcnRYTUxTZXJ2aWNlKCk7Ci0JCQkJCWltcG9ydFNlcnZpY2Uuc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7Ci0JCQkJCWltcG9ydFNlcnZpY2UubG9hZFhtbChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCQkJCQotCQkJCQlpbXBvcnRTZXJ2aWNlLmRvSW1wb3J0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiAgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCW93bmVyLnNldEN1cnJlbnRCYXNlTGliKGxpYik7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZjMzNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlZFBsdWdpbnM7Ci0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbikpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJCi0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUX05hbWUpOwotCQlTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbiA9IGdldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCi0JCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQkJCQkJbmFtZSwKLQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCQljb25maWcuc2V0QnJpZWZEZXNjcmlwdGlvbihicmllZkRlc2NyaXB0aW9uKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCWlmICghUGVyc3BlY3RpdmVMaXN0VXRpbC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl0cnkgewotCQkJcGVyc2lzdGVyLnNhdmUoY29uZmlnKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kRWxlbWVudC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDNlMzAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdGVyT3V0cHV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZEVsZW1lbnQgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwcml2YXRlIHN0YXRpYyBNYXAgdHlwZUNsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsJCi0Jc3RhdGljIHsKLQkJVW1hRmFjdG9yeSB1ZiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJNZXRob2RQbHVnaW4iLCB1Zi5jcmVhdGVNZXRob2RQbHVnaW4oKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIk1ldGhvZENvbmZpZ3VyYXRpb24iLCB1Zi5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJDb250ZW50UGFja2FnZSIsIHVmLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSb2xlIiwgdWYuY3JlYXRlUm9sZSgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVGFzayIsIHVmLmNyZWF0ZVRhc2soKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkFydGlmYWN0IiwgdWYuY3JlYXRlQXJ0aWZhY3QoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkRlbGl2ZXJhYmxlIiwgdWYuY3JlYXRlRGVsaXZlcmFibGUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIk91dGNvbWUiLCB1Zi5jcmVhdGVPdXRjb21lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJDb25jZXB0IiwgdWYuY3JlYXRlQ29uY2VwdCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiQ2hlY2tsaXN0IiwgdWYuY3JlYXRlQ2hlY2tsaXN0KCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJFeGFtcGxlIiwgdWYuY3JlYXRlRXhhbXBsZSgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiR3VpZGVsaW5lIiwgdWYuY3JlYXRlR3VpZGVsaW5lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSZXBvcnQiLCB1Zi5jcmVhdGVSZXBvcnQoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlRlbXBsYXRlIiwgdWYuY3JlYXRlVGVtcGxhdGUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlN1cHBvcnRpbmdNYXRlcmlhbCIsIHVmLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVG9vbE1lbnRvciIsIHVmLmNyZWF0ZVRvb2xNZW50b3IoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIldoaXRlcGFwZXIiLCB1Zi5jcmVhdGVXaGl0ZXBhcGVyKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJQcmFjdGljZSIsIHVmLmNyZWF0ZVByYWN0aWNlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSZXVzYWJsZUFzc2V0IiwgdWYuY3JlYXRlUmV1c2FibGVBc3NldCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiUm9hZG1hcCIsIHVmLmNyZWF0ZVJvYWRtYXAoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlRlcm1EZWZpbml0aW9uIiwgdWYuY3JlYXRlVGVybURlZmluaXRpb24oKS5lQ2xhc3MoKSk7Ci0JCQkJCi0JCXR5cGVDbGFzc01hcC5wdXQoIkRpc2NpcGxpbmUiLCB1Zi5jcmVhdGVEaXNjaXBsaW5lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJEaXNjaXBsaW5lR3JvdXBpbmciLCB1Zi5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkRvbWFpbiIsIHVmLmNyZWF0ZURvbWFpbigpLmVDbGFzcygpKTsJCQotCQl0eXBlQ2xhc3NNYXAucHV0KCJXb3JrUHJvZHVjdFR5cGUiLCB1Zi5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKS5lQ2xhc3MoKSk7CQkKLQkJdHlwZUNsYXNzTWFwLnB1dCgiUm9sZVNldCIsIHVmLmNyZWF0ZVJvbGVTZXQoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlJvbGVTZXRHcm91cGluZyIsIHVmLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVG9vbCIsIHVmLmNyZWF0ZVRvb2woKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkN1c3RvbUNhdGVnb3J5IiwgdWYuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKS5lQ2xhc3MoKSk7Ci0JCQotCQl0eXBlQ2xhc3NNYXAucHV0KCJQcm9jZXNzUGFja2FnZSIsIHVmLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJBY3Rpdml0eSIsIHVmLmNyZWF0ZUFjdGl2aXR5KCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJQaGFzZSIsIHVmLmNyZWF0ZVBoYXNlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJJdGVyYXRpb24iLCB1Zi5jcmVhdGVJdGVyYXRpb24oKS5lQ2xhc3MoKSk7CQkKLQkJdHlwZUNsYXNzTWFwLnB1dCgiQ2FwYWJpbGl0eVBhdHRlcm4iLCB1Zi5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiRGVsaXZlcnlQcm9jZXNzIiwgdWYuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJUYXNrRGVzY3JpcHRvciIsIHVmLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkuZUNsYXNzKCkpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBUZXN0Q29tbWFuZEltcGwgZGVsZWdhdGU7Ci0JCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikuZXF1YWxzKCJNZXRob2RQbHVnaW4iKSkgewotCQkJZGVsZWdhdGUgPSBuZXcgVENOZXdNZXRob2RQbHVnaW4oKTsKLQkJCWRlbGVnYXRlLnNldE93bmVyKGdldE93bmVyKCkpOwotCQkJZGVsZWdhdGUucGFyc2UoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfVHlwZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfVHlwZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUGFyZW50UGF0aCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfUGFyZW50UGF0aCkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5leGVjdXRlKCk7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9IGdldEF0dHJpYnV0ZShBVF9UeXBlKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfTmFtZSk7Ci0JCVN0cmluZyBwYXJlbnRQYXRoID0gZ2V0QXR0cmlidXRlKEFUX1BhcmVudFBhdGgpOwotCQkKLQkJRUNsYXNzIGVDbGFzcyA9IGdldEVDbGFzcyh0eXBlKTsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZUNsYXNzKTsKLQkJbWUuc2V0TmFtZShuYW1lKTsKLQkJbWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQlUQ0V4ZVJlcGx5IHJlcGx5ID0gYWRkVG9MaWIocGFyZW50UGF0aCwgbWUpOwotCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhcmVwbHkucGFzc2luZygpKSB7Ci0JCQlyZXR1cm4gcmVwbHk7Ci0JCX0KLQkJcmV0dXJuIGV4ZWN1dGVFZGl0KG5hbWUsIHBhcmVudFBhdGgpOwotCX0KLQotCXByaXZhdGUgVENFeGVSZXBseSBleGVjdXRlRWRpdChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudFBhdGgpIHsJCQotCQkvL1RvIGRvOiBjaGVjayB0byBzZWUgaWYgZWRpdCBpcyBuZWVkZWQuIFJldHVybiBpZiBub3QgbmVlZGVkLgotCQkKLQkJVGVzdENvbW1hbmRJbXBsIGVkaXQgPSBuZXcgVENFZGl0TWV0aG9kRWxlbWVudCgpOwotCQllZGl0LnNldE93bmVyKGdldE93bmVyKCkpOwotCQllZGl0LnBhcnNlKGdldEVsZW1lbnQoKSk7Ci0JCVN0cmluZyBwYXRoID0gcGFyZW50UGF0aCA9PSBudWxsIHx8IHBhcmVudFBhdGgubGVuZ3RoKCkgPT0gMCA/IG5hbWUgIDogcGFyZW50UGF0aCArICIvIiArIG5hbWU7CQkKLQkJZWRpdC5yZW1vdmVBdHRyaWJ1dGUoQVRfTmFtZSk7Ci0JCWVkaXQucmVtb3ZlQXR0cmlidXRlKEFUX1BhcmVudFBhdGgpOwotCQllZGl0LnNldEF0dHJpYnV0ZShBVF9QYXRoLCBwYXRoKTsKLQkJCi0JCXJldHVybiBlZGl0LmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcml2YXRlIFRDRXhlUmVwbHkgYWRkVG9MaWIoU3RyaW5nIHBhcmVudFBhdGgsIE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIGFkZFByb2Nlc3NFbGVtZW50VG9MaWIocGFyZW50UGF0aCwgKFByb2Nlc3NFbGVtZW50KSBtZSk7Ci0JCX0KLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlNZXRob2RFbGVtZW50IHBhcmVudE1lID0gVGVzdGVyT3V0cHV0VXRpbC5nZXRNZXRob2RFbGVtZW50KGN1cnJMaWIsIHBhcmVudFBhdGgpOwotCQlpZiAocGFyZW50TWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbCgicGFyZW50TWUgPT0gbnVsbCIsIGZhbHNlKTsKLQkJfQkJCi0JCWFkZFRvUGFyZW50KG1lLCBwYXJlbnRNZSk7Ci0KLQkJc2F2ZShtZSk7Ci0JCS8vc2F2ZShwYXJlbnRNZSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBUQ0V4ZVJlcGx5IGFkZFByb2Nlc3NFbGVtZW50VG9MaWIoU3RyaW5nIHBhcmVudFBhdGgsIFByb2Nlc3NFbGVtZW50IHBlKSB7Ci0JCU1ldGhvZExpYnJhcnkgY3VyckxpYiA9IGdldE93bmVyKCkuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50TWUgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldFByb2Nlc3NFbGVtZW50UGFyZW50KGN1cnJMaWIsIHBhcmVudFBhdGgpOwotCQlpZiAocGFyZW50TWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbCgicGFyZW50TWUgPT0gbnVsbCIsIGZhbHNlKTsKLQkJfQotCQlpZiAocGUgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiB8fCBwZSBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewkJCQotCi0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQkJcGMuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQkJcGMuc2V0TmFtZShwZS5nZXROYW1lKCkpOwotCQkJcGFyZW50TWUuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwYyk7Ci0JCQlwYy5zZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHBlKTsJCQkKLQkJCWFkZFRvUGFyZW50KHBlLCBwYyk7Ci0JCQkKLQkJfSBlbHNlIGlmIChwZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgcGU7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnLnNldE5hbWUocGUuZ2V0TmFtZSgpKTsKLQkJCXBhcmVudE1lLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTs7Ci0JCQlhZGRUb1BhcmVudChwZSwgcGtnKTsKLQkJCQotCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gcGFyZW50TWUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ID8gCi0JCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50TWUpLmdldFByb2Nlc3MoKSA6Ci0JCQkJCShBY3Rpdml0eSkgcGFyZW50TWUuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuZ2V0KDApOwotCQkJcGFyZW50QWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGJlKTsKLQkJfQotCi0JCXNhdmUocGFyZW50TWUpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQotCXByaXZhdGUgdm9pZCBhZGRUb1BhcmVudChNZXRob2RFbGVtZW50IG1lLCBNZXRob2RFbGVtZW50IHBhcmVudE1lKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0Q29udGFpbm1lbnRGZWF0dXJlKHBhcmVudE1lLCBtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5XYXJuaW5nOiBjb250YWlubWVudCBmZWF0dXJlIG5vdCByZWdpc3RlcmVkISIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCAgIldhcm5pbmc6IHBhcmVudE1lOiAiICsgcGFyZW50TWUpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCAgIldhcm5pbmc6ICAgICAgIG1lOiAiICsgbWUpOwotCQl9IGVsc2UgaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUVMaXN0IGVsaXN0ID0gQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kLmdldE93bmVyTGlzdChwYXJlbnRNZSwgZmVhdHVyZSk7IAotCQkJTGlzdCBjID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYy5hZGQobWUpOwkJCi0JCQllbGlzdC5hZGRBbGwoYyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJlbnRNZS5lU2V0KGZlYXR1cmUsIG1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgRUNsYXNzIGdldEVDbGFzcyhTdHJpbmcgdHlwZSkgewotCQlFQ2xhc3MgcmV0ID0gKEVDbGFzcykgdHlwZUNsYXNzTWFwLmdldCh0eXBlKTsKLQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuV2FybmluZzogXCIiICsgdHlwZSArIAotCQkJCQkiXCIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gXCJ0eXBlQ2xhc3NNYXBcIiEiKTsKLQkJfQotCQlyZXR1cm4gcmV0OwkJCi0JfQotCQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRhaW5tZW50RmVhdHVyZShFT2JqZWN0IG93bmVyLCBFT2JqZWN0IGVvYmopIHsKLQkJVW1hUGFja2FnZSB1cCA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gdXAuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCk7Ci0JCQl9Ci0JCQlpZiAoZW9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZXR1cm4gdXAuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCX0KLQkJfQkJCi0JCQotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXJldHVybiB1cC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gdXAuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmIChlb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQlyZXR1cm4gdXAuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCWlmIChlb2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgfHwKLQkJCQllb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UJKSB7Ci0JCQkJcmV0dXJuIHVwLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJZmluYWwgSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRQZXJzaXN0ZXJGb3IoZWxlbWVudC5lUmVzb3VyY2UoKSkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJZmluYWwgUmVzb3VyY2UgcmVzID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kUGx1Z2luLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZhNzk2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZFBsdWdpbiBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQotCQotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VkUGx1Z2luczsKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9OYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9OYW1lKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9BdXRob3JzLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9BdXRob3JzKSk7Ci0JCXBhcnNlQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlQ2hpbGRyZW4oRWxlbWVudCBlbGVtZW50KSB7Ci0JCU5vZGVMaXN0IGNub2RlcyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVlRfYmFzZXMpOwotCQlpZiAoY25vZGVzID09IG51bGwgfHwgY25vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbGVtZW50IGNFbGVtZW50ID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKDApOwotCQljbm9kZXMgPSBjRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShWVF9WYWx1ZSk7CQotCQlpZiAoY25vZGVzID09IG51bGwgfHwgY25vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlyZWZlcmVuY2VkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IHZFbGVtID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIHZhbHVlID0gdkVsZW0uZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOwotCQkJcmVmZXJlbmNlZFBsdWdpbnMuYWRkKHZhbHVlKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVF9OYW1lKTsKLQkJU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBnZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbik7Ci0JCVN0cmluZyBhdXRob3JzID0gZ2V0QXR0cmlidXRlKEFUX0F1dGhvcnMpOwotCQkKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBuZXcgVENFeGVSZXBseUltcGwoIkVtcHR5IHBsdWdpbiBuYW1lIiwgZmFsc2UpOwotCQl9Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5VXRpbC5jaGVja1BsdWdpbk5hbWUobnVsbCwgbmFtZSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKTsKLQkJfQotCQkJCQotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQkJTGlzdCBwbHVnaW5zID0gY3VyckxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQkKLQkJCS8vIENyZWF0ZSB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGFkZCBpdCB0byB0aGUgY3VycmVudCBtZXRob2QKLQkJCS8vIGxpYnJhcnkuCi0JCQlmaW5hbCBNZXRob2RQbHVnaW4gbmV3UGx1Z2luID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQluZXdQbHVnaW4uc2V0TmFtZShTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWUpKTsKLQkJCW5ld1BsdWdpbi5zZXRCcmllZkRlc2NyaXB0aW9uKGJyaWVmRGVzY3JpcHRpb24pOwotCQkJbmV3UGx1Z2luLnNldEF1dGhvcnMoYXV0aG9ycyk7Ci0JCQkKLQkJCWludCBzeiA9IHJlZmVyZW5jZWRQbHVnaW5zID09IG51bGwgPyAwIDogcmVmZXJlbmNlZFBsdWdpbnMuc2l6ZSgpOwotCQkJaWYgKHN6ID4gMCAmJiAhIHBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCQkJU3RyaW5nIHJlZmVyZWROYW1lID0gKFN0cmluZykgcmVmZXJlbmNlZFBsdWdpbnMuZ2V0KGkpOwotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgTGlicmFyeVRlc3RTZXJ2aWNlLmdldEVsZW1lbnQKLQkJCQkJCShwbHVnaW5zLCByZWZlcmVkTmFtZSk7Ci0JCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJbmV3UGx1Z2luLmdldEJhc2VzKCkuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRNZXRob2RQbHVnaW4oTW9kZWxTdG9yYWdlLmluaXRpYWxpemUobmV3UGx1Z2luKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPcGVuTGlicmFyeS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPcGVuTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDc1NjYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDT3BlbkxpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ09wZW5MaWJyYXJ5IGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGxpYkZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSk7CQotCQlnZXRPd25lcigpLmxvYWRCYXNlTGliKGxpYkZvbGRlck5hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPdXRwdXRNZXRob2RFbGVtZW50LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ091dHB1dE1ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMjE3Ni4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ091dHB1dE1ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3Rlck91dHB1dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDT3V0cHV0TWV0aG9kRWxlbWVudCBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7Ci0KLQkvL01heSB3YW50IHRvIHVzZSBmZWF0dXJlIGNsYXNzZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBuYW1lcyBsYXRlcgotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVkRmVhdHVyZXMgPSB7Ci0JCS8vImd1aWQiLAotCQkvLyJnVUlEcyIKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIFNldCBleGNsdWRlZEZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCQotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGk9MDsgaTxleGNsdWRlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleGNsdWRlZEZlYXR1cmVTZXQuYWRkKGV4Y2x1ZGVkRmVhdHVyZXNbaV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCVN0cmluZyBwYXRoOwotCXByaXZhdGUgRG9jdW1lbnQgZG9jOwotCXByaXZhdGUgTWFwIHN5c3RlbVBrZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBFbGVtZW50IHJvb3Q7Ci0JcHJpdmF0ZSBib29sZWFuIHJlY3Vyc2l2ZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZTsKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCWRvYyA9IGdldE93bmVyKCkuZ2V0T3V0cHV0RG9jdW1lbnQoKTsKLQkJLy9TdHJpbmcgdGFnTmFtZSA9IHRhZ05hbWUoKTsgbmVlZCB0byBmaXggdGFnTmFtZSgpIG1laHRvZAotCQl0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQotCQlzZXRBdHRyaWJ1dGUoQVRfUGF0aCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfUGF0aCkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUmVjdXJzaXZlLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9SZWN1cnNpdmUpKTsKLQkJc2V0QXR0cmlidXRlKEFUX091dHB1dEZpbGVOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9PdXRwdXRGaWxlTmFtZSkpOwkKLQl9CQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewkKLQkJcGF0aCA9IGdldEF0dHJpYnV0ZShBVF9QYXRoKTsKLQkJcmVjdXJzaXZlID0gcGFyc2VCb29sZWFuKEFUX1JlY3Vyc2l2ZSwgcmVjdXJzaXZlKTsKLQkJCi0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlyb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQotCQlpZiAodGFnTmFtZS5lcXVhbHMoVGVzdENvbW1hbmRNZ3IuVENPdXRwdXRMaWJyYXJ5KSkgewotCQkJb3V0cHV0TWV0aG9kRWxlbWVudChsaWIsIHJvb3QpOwotCQl9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKFRlc3RDb21tYW5kTWdyLlRDT3V0cHV0UGx1Z2luKSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0TWV0aG9kUGx1Z2luKGxpYiwgcGF0aCk7Ci0JCQlvdXRwdXRNZXRob2RFbGVtZW50KHBsdWdpbiwgcm9vdCk7Ci0JCX0gZWxzZSBpZiAodGFnTmFtZS5lcXVhbHMoVGVzdENvbW1hbmRNZ3IuVENPdXRwdXRDb25maWd1cmF0aW9uKSkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb24obGliLCBwYXRoKTsKLQkJCW91dHB1dE1ldGhvZEVsZW1lbnQoY29uZmlnLCByb290KTsKLQkJfSBlbHNlIGlmICh0YWdOYW1lLmVxdWFscyhUZXN0Q29tbWFuZE1nci5UQ091dHB1dE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQlNZXRob2RFbGVtZW50IG1lID0gVGVzdGVyT3V0cHV0VXRpbC5nZXRNZXRob2RFbGVtZW50KGxpYiwgcGF0aCk7Ci0JCQlvdXRwdXRNZXRob2RFbGVtZW50KG1lLCByb290KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJb3V0cHV0VG9GaWxlKCk7CQkKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdXRwdXRUb0ZpbGUoKSB7Ci0JCVN0cmluZyBvdXRwdXRGaWxlTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9PdXRwdXRGaWxlTmFtZSk7Ci0JCWlmIChvdXRwdXRGaWxlTmFtZSA9PSBudWxsIHx8IG91dHB1dEZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb3V0cHV0UGF0aCA9IGdldE93bmVyKCkuZ2V0T3V0cHV0UGF0aCgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShvdXRwdXRQYXRoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCW91dHB1dFBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBvdXRwdXRGaWxlTmFtZTsKLQkJCi0JCURvY3VtZW50IG91dHB1dERvY3VtZW50ID0gZ2V0T3duZXIoKS5nZXRPdXRwdXREb2N1bWVudCgpOwotCQl0cnkgewotCQkJWE1MVXRpbC5zYXZlRG9jdW1lbnQob3V0cHV0RG9jdW1lbnQsIG91dHB1dFBhdGgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRwdXRNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRWxlbWVudCBwYXJlbnROb2RlKSB7CQotCQlFbGVtZW50IG5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudChnZXRUeXBlKGVsZW1lbnQpKTsJCQotCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQlpZiAocGFyZW50Tm9kZSA9PSByb290KSB7Ci0JCQlub2RlLnNldEF0dHJpYnV0ZSgicGF0aCIsIHBhdGgpOwotCQl9Ci0JCW91dHB1dEZlYXR1cmVzKGVsZW1lbnQsIG5vZGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3V0cHV0UmVmZXJlbmNlKEVSZWZlcmVuY2UgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFbGVtZW50IHBhcmVudE5vZGUpIHsKLQkJRWxlbWVudCBub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoZmVhdHVyZS5nZXROYW1lKCkpOwotCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQlub2RlLnNldEF0dHJpYnV0ZSgicGF0aCIsIFRlc3Rlck91dHB1dFV0aWwuZ2V0T3V0cHV0UGF0aChlbGVtZW50KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRwdXRGZWF0dXJlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVsZW1lbnQgbm9kZSkgewotCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJRVByb3BlcnR5IGVwID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVwLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJaWYgKGV4Y2x1ZGVkRmVhdHVyZVNldC5jb250YWlucyhmZWF0dXJlLmdldE5hbWUoKSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQlpZiAoISByZWN1cnNpdmUgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gcm9vdCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRVJlZmVyZW5jZSByZWZGZWF0dXJlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlvdXRwdXRMaXN0RmVhdHVyZShyZWZGZWF0dXJlLCAoTGlzdCkgdmFsdWUsIG5vZGUpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChyZWZGZWF0dXJlLmlzQ29udGFpbm1lbnQoKSkgewotCQkJCQkJb3V0cHV0TWV0aG9kRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgdmFsdWUsIG5vZGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb3V0cHV0UmVmZXJlbmNlKHJlZkZlYXR1cmUsIChNZXRob2RFbGVtZW50KSB2YWx1ZSwgbm9kZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGxvY2FsRGVidWcpewotCQkJCQlnZXRPd25lcigpLnRyYWNlKCJXYXJuaW5nPiB2YWx1ZSBpcyBvZiBub24tb3V0cHV0IHR5cGU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCW5vZGUuc2V0QXR0cmlidXRlKGZlYXR1cmUuZ2V0TmFtZSgpLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3V0cHV0TGlzdEZlYXR1cmUoRVJlZmVyZW5jZSBmZWF0dXJlLCBMaXN0IGxpc3QsIEVsZW1lbnQgcGFyZW50Tm9kZSkgewotCQlpbnQgc3ogPSBsaXN0ID09IG51bGwgPyAwIDogbGlzdC5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCWdldE93bmVyKCkudHJhY2UoIldhcm5pbmc+IGxpc3QuZ2V0KDApIGlzIG9mIHR5cGU6ICIgKyBsaXN0LmdldCgwKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBjb250YWlubWVudCA9IGZlYXR1cmUuaXNDb250YWlubWVudCgpOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbnRhaW5tZW50KSB7Ci0JCQkJb3V0cHV0TWV0aG9kRWxlbWVudChlbGVtZW50LCBwYXJlbnROb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0UmVmZXJlbmNlKGZlYXR1cmUsIGVsZW1lbnQsIHBhcmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGNsc05hbWUgPSBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWludCBpeCA9IGNsc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDE7Ci0JCVN0cmluZyB0eXBlID0gY2xzTmFtZS5zdWJzdHJpbmcoaXgpOwotCQlpeCA9IHR5cGUubGFzdEluZGV4T2YoIkltcGwiKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgaXggKyA0ID09ICB0eXBlLmxlbmd0aCgpKSB7Ci0JCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgaXgpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0JCi0JCi0JCi0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9BYnN0cmFjdExpYnJhcnlUZXN0Q2FzZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9BYnN0cmFjdExpYnJhcnlUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTc1ODNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvQWJzdHJhY3RMaWJyYXJ5VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBKVW5pdCB0ZXN0IGNhc2VzIHRoYXQgbmVlZHMgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpYnJhcnlUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVMaWJyYXJ5T25FeGl0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgQWJzdHJhY3RMaWJyYXJ5VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQlvcGVuTGlicmFyeSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGVsZXRlTGlicmFyeU9uRXhpdCkgewotCQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IG9wZW5MaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxpYlBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImVwZi5saWJyYXJ5Iik7Ci0JCWlmKGxpYlBhdGggPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgIkxpYnJhcmllcyIgKyBGaWxlLnNlcGFyYXRvciArICJPcGVuVVAiOwotCQkJaWYobmV3IEZpbGUocGF0aCwgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKS5leGlzdHMoKSkgewotCQkJCWxpYlBhdGggPSBwYXRoOwotCQkJfQotCQl9Ci0JCWlmIChsaWJQYXRoICE9IG51bGwpIHsKLQkJCWxpYnJhcnkgPSBYTUlMaWJyYXJ5VXRpbC5vcGVuTWV0aG9kTGlicmFyeShsaWJQYXRoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJyYXJ5ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGVzdE1ldGhvZExpYnJhcnkoKTsKLQkJCWRlbGV0ZUxpYnJhcnlPbkV4aXQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IHJlb3BlbkxpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9EZXBlbmRlbmN5Q2hlY2tlclRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvRGVwZW5kZW5jeUNoZWNrZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTE3OWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9EZXBlbmRlbmN5Q2hlY2tlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUNoZWNrZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeUNoZWNrZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXIjY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tDaXJjdWxhckRlcGVuZGVuY3koKSB7Ci0JCS8qCi0JCXBsdWdpbjEgPC0gcGx1Z2luMiA8LSBwbHVnaW4zIAotCQkJCQl8Ci0JCSAgICAgICAgICAgIHYKLQkJICAgICAgICAgICBwbHVnaW40IC0+IHBsdWdpbjUJCSAgICAgICAgICAgCi0JCSovCi0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJcGx1Z2luMS5zZXROYW1lKCJwbHVnaW4xIik7Ci0JCWxpYi5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbjEpOwotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJcGx1Z2luMi5zZXROYW1lKCJwbHVnaW4yIik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCWxpYi5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbjIpOwotCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4zID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjMuc2V0TmFtZSgicGx1Z2luMyIpOwotCQlwbHVnaW4zLmdldEJhc2VzKCkuYWRkKHBsdWdpbjIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4zKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW40ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjQuc2V0TmFtZSgicGx1Z2luNCIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW40KTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW41ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjUuc2V0TmFtZSgicGx1Z2luNSIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW41KTsKLQotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjQpOwotCQlwbHVnaW40LmdldEJhc2VzKCkuYWRkKHBsdWdpbjUpOwotCi0KLQkJYXNzZXJ0RmFsc2UoRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGx1Z2luMSwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgcGx1Z2luMykuaXNPSygpKTsKLQkJYXNzZXJ0RmFsc2UoRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGx1Z2luNSwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgcGx1Z2luMykuaXNPSygpKTsKLQkJYXNzZXJ0VHJ1ZShEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShwbHVnaW41LCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTLCBwbHVnaW4xKS5pc09LKCkpOwotCQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlTZXJ2aWNlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5U2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiOTIxYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9YTUkgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9YTUkgPSAicGx1Z2luLnhtaSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9MSUJSQVJZXzEgPSAibGlicmFyeV8xIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOXzEgPSAicGx1Z2luXzEiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBjcmVhdGlvbiBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q3JlYXRlTWV0aG9kTGlicmFyeSgpIHsKLQkJdHJ5IHsKLQkJCUxpYnJhcnlUZXN0SGVscGVyCi0JCQkJCS5jcmVhdGVUZXN0TWV0aG9kTGlicmFyeShMaWJyYXJ5VGVzdEhlbHBlci5URU1QX1RFU1RfRElSCi0JCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIFRFU1RfTElCUkFSWV8xKTsKLQkJCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlUZXN0SGVscGVyLlRFTVBfVEVTVF9ESVIKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIFRFU1RfTElCUkFSWV8xICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBMSUJSQVJZX1hNSSk7Ci0JCQlhc3NlcnRUcnVlKGxpYkZpbGUuZXhpc3RzKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIGNyZWF0aW9uIG9mIGEgbWV0aG9kIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDcmVhdGVNZXRob2RQbHVnaW4oKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQlwbHVnaW4uc2V0TmFtZShURVNUX1BMVUdJTl8xKTsKLQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLmFkZE1ldGhvZFBsdWdpbihNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pKTsKLQkJCX0KLQotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoTGlicmFyeVRlc3RIZWxwZXIuVEVNUF9URVNUX0RJUgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgVEVTVF9MSUJSQVJZXzEgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIFRFU1RfUExVR0lOXzEgKyBGaWxlLnNlcGFyYXRvciArIFBMVUdJTl9YTUkpOwotCQkJYXNzZXJ0VHJ1ZShwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQotCQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0SGVscGVyLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Mjk0NTUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBtYW5pcHVsYXRlIGEgdGVzdCBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlUZXN0SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBfVEVTVF9ESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0yJAotCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QiICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX1hNSSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1JX1RZUEUgPSAieG1pIjsgLy8kTk9OLU5MUy0xJAkJCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRlc3QgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwYXRoID0gVEVNUF9URVNUX0RJUgotCQkJCSsgTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKQotCQkJCSsgRmlsZS5zZXBhcmF0b3I7Ci0JCQotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXBhcmFtcy5wdXQoImxpYnJhcnkucGF0aCIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkoTElCUkFSWV9YTUksIFhNSV9UWVBFLCBwYXJhbXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXN0IG1ldGhvZCBsaWJyYXJ5IG9uIGEgZ2l2ZW4gcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgY3JlYXRlVGVzdE1ldGhvZExpYnJhcnkoU3RyaW5nIHBhdGgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gVEVNUF9URVNUX0RJUgotCQkJCQkrIExvbmcKLQkJCQkJCQkudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldFRpbWVJbk1pbGxpcygpKSArIEZpbGUuc2VwYXJhdG9yOwotCQl9Ci0JCQotCQkvLyBJZiB0aGUgbGlicmFyeSBwYXRoIGFscmVhZHkgZXhpc3RzLCBkZWxldGUgaXQuCi0JCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKGxpYnJhcnlQYXRoLmV4aXN0cygpKSB7Ci0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlsaWJyYXJ5UGF0aC5kZWxldGUoKTsJCQkKLQkJfQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KCJsaWJyYXJ5LnBhdGgiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KExJQlJBUllfWE1JLCBYTUlfVFlQRSwgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgYW5kIGRlbGV0ZSB0aGUgbGlicmFyeSByZXNvdXJjZSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VMaWJyYXJ5KCkgewotCQl0cnkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gRGVsZXRlIHRoZSBsaWJyYXJ5IGZvbGRlciBhbmQgZmlsZXMuCi0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhwYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXBhdGguZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUxpYnJhcnkoKSB7Ci0JCXRyeSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVDb25maWd1cmF0aW9uKG5hbWUsIEVjb3JlVXRpbAotCQkJCS5nZW5lcmF0ZVVVSUQoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luKG5hbWUsIEVjb3JlVXRpbAotCQkJCQkuZ2VuZXJhdGVVVUlEKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoTWV0aG9kUGx1Z2luIHBsdWdpbiwgU3RyaW5nIG5hbWUpIHsKLQkJRGlzY2lwbGluZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pLmNyZWF0ZURpc2NpcGxpbmUoKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJvbGVTZXQgY3JlYXRlUm9sZVNldChNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmFtZSkgewotCQlSb2xlU2V0IGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbikKLQkJCQkuY3JlYXRlUm9sZVNldCgpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9tYWluIGNyZWF0ZURvbWFpbihNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmFtZSkgewotCQlEb21haW4gZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVEb21haW4oKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZSgKLQkJCQlwbHVnaW4pLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUN1c3RvbUNhdGVnb3J5IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnkgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UoCi0JCQkJcGx1Z2luKS5jcmVhdGVDdXN0b21DYXRlZ29yeShwYXJlbnQpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLQotCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2UobnVsbCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZShNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlwbHVnaW4gPSBjcmVhdGVNZXRob2RQbHVnaW4oInRlc3QgcGx1Z2luIik7Ci0JCX0KLQkJQ29udGVudFBhY2thZ2UgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UoCi0JCQkJcGx1Z2luKS5jcmVhdGVDb250ZW50UGFja2FnZShudWxsKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhc2sgY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJVGFzayBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZVRhc2socGtnKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJvbGUgY3JlYXRlUm9sZShDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJUm9sZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZVJvbGUocGtnKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KENvbnRlbnRQYWNrYWdlIHBrZywgU3RyaW5nIG5hbWUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQlBcnRpZmFjdCBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZUFydGlmYWN0KHBrZyk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJR3VpZGFuY2UgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVHdWlkYW5jZShwa2cpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdChDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJQ2hlY2tsaXN0IGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbikKLQkJCQkuY3JlYXRlQ2hlY2tsaXN0KHBrZyk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKAotCQkJQ29udGVudFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyBjb250ZW50KSB7Ci0JCVNlY3Rpb24gZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKTsKLQkJZS5zZXRTZWN0aW9uTmFtZShuYW1lKTsKLQkJZS5zZXRTZWN0aW9uRGVzY3JpcHRpb24oY29udGVudCk7Ci0JCWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCWRlc2MuZ2V0U2VjdGlvbnMoKS5hZGQoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZyBuYW1lLCBNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpIHsKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKAotCQkJCXBsdWdpbikuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oZGVmYXVsdENvbmZpZyk7Ci0JCWNwLnNldE5hbWUobmFtZSk7Ci0JCSgoUHJvY2Vzc0NvbXBvbmVudCkgY3AuZUNvbnRhaW5lcigpKS5zZXROYW1lKG5hbWUpOwotCi0JCXNhdmVMaWJyYXJ5KCk7Ci0KLQkJcmV0dXJuIGNwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUFjdGl2aXR5IHN1cGVyQWN0aXZpdHksIFN0cmluZyBuYW1lLCBUYXNrW10gdGFza3MpIHsKLQkJUGx1Z2luU2VydmljZSBzdmMgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbik7Ci0JCUFjdGl2aXR5IGFjdCA9IHN2Yy5jcmVhdGVBY3Rpdml0eShzdXBlckFjdGl2aXR5KTsKLQkJYWN0LnNldE5hbWUobmFtZSk7Ci0JCXNhdmVMaWJyYXJ5KCk7Ci0KLQkJaWYgKHRhc2tzICE9IG51bGwgJiYgdGFza3MubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykgewotCQkJCXN2Yy5hZGRUYXNrVG9BY3Rpdml0eShhY3QsIHRhc2tzW2ldKTsKLQkJCX0KLQkJCXNhdmVMaWJyYXJ5KCk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRlbmRzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGJhc2UpOwotCQllbGVtZW50LnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRyaWJ1dGVzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGJhc2UpOwotCQllbGVtZW50LnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZXBsYWNlcyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCWVsZW1lbnQuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChiYXNlKTsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0cy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiNzc1YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3RDb21tYW5kRmlsZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydC5Db25maWdFeHBvcnRJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0LlBsdWdpbkV4cG9ydEltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQuWG1sRXhwb3J0SW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkFjdGl2aXR5VmFyaWFiaWxpdHlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkF0dHJpYnV0ZUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkNvcHlyaWdodFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHkuSW5jb21pbmcwMUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkluY29taW5nMG5GZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eS5PdXRnb2luZzAxRmVhdHVyZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHkuT3V0Z29pbmcwbkZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LlJlZ3Jlc3Npb25UZXN0OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShMaWJyYXJ5VGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlicmFyeVNlcnZpY2VUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE91dGdvaW5nMDFGZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPdXRnb2luZzBuRmVhdHVyZVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW5jb21pbmcwMUZlYXR1cmVUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEluY29taW5nMG5GZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBdHRyaWJ1dGVGZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb3B5cmlnaHRUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZ3Jlc3Npb25UZXN0LmNsYXNzKTsJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBY3Rpdml0eVZhcmlhYmlsaXR5VGVzdC5jbGFzcyk7CQotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RDb21tYW5kRmlsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBsdWdpbkV4cG9ydEltcG9ydC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb25maWdFeHBvcnRJbXBvcnQuY2xhc3MpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEV4cG9ydEltcG9ydC5jbGFzcyk7Ci0JCQotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvVGVzdHNQbHVnaW4uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2YWQyMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL1Rlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0qIFRoZSBUZXN0cyBwbHVnLWluIGNsYXNzLgotKiAKLSogQGF1dGhvcglXZWlwaW5nIEx1Ci0qIEBzaW5jZQkxLjAKLSovCi1wdWJsaWMgY2xhc3MgVGVzdHNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBUZXN0c1BsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFRlc3RzUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9Db25maWdFeHBvcnRJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMjI5OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9Db25maWdFeHBvcnRJbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnRXhwb3J0SW1wb3J0IGV4dGVuZHMgRXhwb3J0SW1wb3J0VGVzdEltcGwgewotCi0JcHVibGljIENvbmZpZ0V4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQkJCi0JCQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IENvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQkJCQotCQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0NvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5M2FjZDguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5SnVuaXRUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb3B5TGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0ltcG9ydENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDT3BlbkxpYnJhcnk7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdFeHBvcnRJbXBvcnRUZXN0MDAwMSBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlIHsKLQkKLQlwdWJsaWMgQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEoRXhwb3J0SW1wb3J0VGVzdEltcGwgb3duZXIpIHsKLQkJc3VwZXIob3duZXIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyB0ZXN0TmFtZSkgewotCQlMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlID0gZ2V0T3duZXIoKS5nZXRTZXJ2aWNlKCk7Ci0JCQotCQlUZXN0Q29tbWFuZCB0Y3NbXSA9IG5ldyBUZXN0Q29tbWFuZFs2XTsKLQkJCi0JCXRjc1swXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENDb3B5TGlicmFyeS5jbGFzcyk7Ci0JCXRjc1swXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7Ci0JCQotCQl0Y3NbMV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzJdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0V4cG9ydENvbmZpZ3VyYXRpb24uY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCXRjc1syXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfU2VsZWN0ZWRDb25maWdOYW1lLCAiQ29uZmlnIEEiKTsKLQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJdGNzWzRdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9JbXBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzVdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0NvbXBhcmVUb0xpYnJhcnkuY2xhc3MpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0dvbGRlbkxpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9FeHBvcnRJbXBvcnQuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVkMmRhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5RYVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5UZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuVGVzdHNQbHVnaW47Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydEltcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZSAoVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxQYXRoKCkgKyAgCi0JCSJMaWJyYXJpZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiMS4wLjAiICsgRmlsZS5zZXBhcmF0b3IgKyAiRXhwb3J0SW1wb3J0Iik7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGVzdFJvb3RQYXJlbnQgPSAgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yIAotCQkJCQkJCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QiICsgRmlsZS5zZXBhcmF0b3I7Ci0KLQkKLQkKLQlwcml2YXRlIFFhVGVzdFNlcnZpY2Ugc2VydmljZSA9IG5ldwlRYVRlc3RTZXJ2aWNlKG5ldyBUZXN0Rm9sZGVyU2V0dXAoKSwgdHJ1ZSk7Ci0JCi0JcHVibGljIEV4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhc2UoKSB7CQkKLQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gIjFzdFRlc3QudGMiOwotCQlGaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCQlyZXR1cm4gcGF0aG5hbWUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoZmlsZU5hbWUpOwotCQkJfTsJCQkKLQkJfTsKLQkJCi0JCUZpbGUgZmlsZXNbXSA9IHRlc3RSb290U291cmNlLmxpc3RGaWxlcyhmaWx0ZXIpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkgewotCQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZSArICIgY2Fubm90IGJlIGZvdW5kISIsIGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gbmV3IEZpbGUodGVzdFJvb3RQYXJlbnQgKyAiRXhwb3J0SW1wb3J0T25lQ2FzZSIpOwotCQlTdHJpbmcgZXJyb3JNc2cgPSBzZXJ2aWNlLnJ1bkNhc2UodGVzdFJvb3RTb3VyY2UsIHRlc3RSb290V29ya2luZywgZmlsZXNbMF0pOwotCQlhc3NlcnRUcnVlKGVycm9yTXNnLCBlcnJvck1zZy5sZW5ndGgoKSA9PSAwKTsKLQl9CQotCQkJCi0JcHVibGljIHZvaWQgdGVzdExvY2FsQ2FzZXMoKSB7Ci0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gbmV3IEZpbGUodGVzdFJvb3RQYXJlbnQgKyAiRXhwb3J0SW1wb3J0Iik7CQkKLQkJU3RyaW5nIGVycm9yTXNnID0gc2VydmljZS5ydW5Mb2NhbENhc2VzKHRlc3RSb290U291cmNlLCB0ZXN0Um9vdFdvcmtpbmcpOwotCQlhc3NlcnRUcnVlKGVycm9yTXNnLCBlcnJvck1zZy5sZW5ndGgoKSA9PSAwKTsKLQl9CQotCQkJCQotCQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzc1YzcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JcHJpdmF0ZSBFeHBvcnRJbXBvcnRUZXN0SW1wbCBvd25lcjsKLQkKLQlwdWJsaWMgRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UoRXhwb3J0SW1wb3J0VGVzdEltcGwgb3duZXIpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgRXhwb3J0SW1wb3J0VGVzdEltcGwgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9CQotCQotCWFic3RyYWN0IHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHRlc3ROYW1lKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvUGx1Z2luRXhwb3J0SW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjRmMmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvUGx1Z2luRXhwb3J0SW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydEltcG9ydCBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RJbXBsIHsKLQotCXB1YmxpYyBQbHVnaW5FeHBvcnRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkJCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsJCQotCQllbmRTZXRVcCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWVuZFRlYXJEb3duKCk7Ci0JfQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDE7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IFBsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9QbHVnaW5FeHBvcnRJbXBvcnRUZXN0MDAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAyZWQ1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvbXBhcmVUb0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29weUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0UGx1Z2luczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENJbXBvcnRQbHVnaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRXhwb3J0SW1wb3J0VGVzdDAwMDEgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JCi0JcHVibGljIFBsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxKEV4cG9ydEltcG9ydFRlc3RJbXBsIG93bmVyKSB7Ci0JCXN1cGVyKG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgdGVzdE5hbWUpIHsJCQotCQlMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlID0gZ2V0T3duZXIoKS5nZXRTZXJ2aWNlKCk7Ci0JCQotCQlUZXN0Q29tbWFuZCB0Y3NbXSA9IG5ldyBUZXN0Q29tbWFuZFs2XTsKLQkJCi0JCXRjc1swXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENDb3B5TGlicmFyeS5jbGFzcyk7Ci0JCXRjc1swXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7Ci0JCQotCQl0Y3NbMV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzJdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0V4cG9ydFBsdWdpbnMuY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRQbHVnaW5zLmNsYXNzKTsKLQkJdGNzWzRdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9JbXBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzVdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0NvbXBhcmVUb0xpYnJhcnkuY2xhc3MpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0dvbGRlbkxpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1N0YW5kQWxvbmVUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9TdGFuZEFsb25lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVhMGY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1N0YW5kQWxvbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRBbG9uZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlUZXN0U2VydmljZSBzZXJ2aWNlID0gTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCk7Ci0JCi0JcHVibGljIFN0YW5kQWxvbmVUZXN0KCkgewotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdDAwMDEoKSB7Ci0KLSAJCS8vTGlicmFyeURpZmZBbmFseXpvci5zZXRUcmltKHRydWUpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3Iuc2V0VXNlTmFtZUFzMm5kSWQodHJ1ZSk7Ci0JCS8vTGlicmFyeURpZmZBbmFseXpvci5hZGRFeGNsdWRlZEZlYXR1cmUoInZlcnNpb24iKTsKLQkJLy9MaWJyYXJ5RGlmZkFuYWx5em9yLmFkZEV4Y2x1ZGVkRmVhdHVyZSgibmFtZSIpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3IuYWRkRXhjbHVkZWRGZWF0dXJlKCJwcmVzZW50YXRpb25OYW1lIik7Ci0JCS8vTGlicmFyeURpZmZBbmFseXpvci5hZGRFeGNsdWRlZEZlYXR1cmUoIm1haW5EZXNjcmlwdGlvbiIpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3IuYWRkRXhjbHVkZWRGZWF0dXJlKCJzZWN0aW9uRGVzY3JpcHRpb24iKTsJCi0JCQotCQlUZXN0Q29tbWFuZE1nciB0Y01nciA9IG5ldyBUZXN0Q29tbWFuZE1ncih0cnVlKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxMaWJzXFw3MlxcIik7Ci0JCXRjTWdyLm9wZW5DdXJyVGVzdERpcihmaWxlKTsKLQkJCi0JCVN0cmluZyBsaWIxUGF0aCA9ICJDOlxcTGlic1xcNzJcXE9wZW5VcDcyIjsKLQkJU3RyaW5nIGxpYjJQYXRoID0gIkM6XFxMaWJzXFw3MlxcYSI7CQkKLQkJTWV0aG9kTGlicmFyeSBsaWIxID0gc2VydmljZS5sb2FkTGlicmFyeShsaWIxUGF0aCk7Ci0JCU1ldGhvZExpYnJhcnkgbGliMiA9IHNlcnZpY2UubG9hZExpYnJhcnkobGliMlBhdGgpOwotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5maXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGxpYjEsIGxpYjIpOwotCQl0Y01nci50cmFjZSgiQ29tcGFyaW5nIGxpYnJhcmllcyAtPiBCZWdpbiIpOwotCQl0Y01nci50cmFjZSgibGliMTogIiArIGxpYjFQYXRoKTsKLQkJdGNNZ3IudHJhY2UoImxpYjI6ICIgKyBsaWIyUGF0aCk7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSB0Y01nci5jb21wYXJlTGlicyhsaWIxLCBsaWIyLCAwLCAwLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQpOwotCQl0Y01nci50cmFjZSgiQ29tcGFyaW5nIGxpYnJhcmllcyA8LSBFbmQgIik7Ci0JfQkJCi0JCQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmQ5NGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLQotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWG1sRXhwb3J0SW1wb3J0IGV4dGVuZHMgRXhwb3J0SW1wb3J0VGVzdEltcGwgewotCi0JcHVibGljIFhtbEV4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IFhtbEV4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDE1MjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5SnVuaXRUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb3B5TGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDSW1wb3J0WG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JCi0JcHVibGljIFhtbEV4cG9ydEltcG9ydFRlc3QwMDAxKEV4cG9ydEltcG9ydFRlc3RJbXBsIG93bmVyKSB7Ci0JCXN1cGVyKG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgdGVzdE5hbWUpIHsKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2Ugc2VydmljZSA9IGdldE93bmVyKCkuZ2V0U2VydmljZSgpOwotCQkKLQkJVGVzdENvbW1hbmQgdGNzW10gPSBuZXcgVGVzdENvbW1hbmRbNl07Ci0JCQotCQl0Y3NbMF0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDQ29weUxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMF0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzFdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzFdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiUGFyaXMiKTsKLQkJCi0JCXRjc1syXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENFeHBvcnRYbWwuY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRYbWwuY2xhc3MpOwotCQl0Y3NbNF0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0ltcG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbNV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDQ29tcGFyZVRvTGlicmFyeS5jbGFzcyk7Ci0JCXRjc1s1XS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfR29sZGVuTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7CQkKLQkJdGNzWzVdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9EaWZmQ291bnQsICIyOCIpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0VsZW1lbnRDb3VudCwgIjM3MCIpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX1VzZU5hbWVBc0lkLCAidHJ1ZSIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQkJCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3NThjZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ05ld01ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDT3BlbkxpYnJhcnk7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RJbXBsIHsKLQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3QwMDAxXzE2OTUwMSgpIHsKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLQkJCi0JCVRlc3RDb21tYW5kIHRjc1tdID0gbmV3IFRlc3RDb21tYW5kWzhdOwotCQkKLQkJdGNzWzBdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzBdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiMTY5NTAxIik7Ci0JCQotLyoJCXRjc1sxXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENOZXdNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJdGNzWzFdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9UeXBlLCAiTWV0aG9kUGx1Z2luIik7Ci0JCXRjc1sxXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTmFtZSwgIlBsdWcgQSIpOwkqLwkJCQkJCQkJCQkJCi0JCQotCQlib29sZWFuIHBhc3NpbmcgPSB0cnVlOwotCQlmb3IgKGludCBpPTA7IGk8dGNzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGNzW2ldICE9IG51bGwpIHsKLQkJCQlUQ0V4ZVJlcGx5IHJlcGx5ID0gdGNzW2ldLmV4ZWN1dGUoKTsKLQkJCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCQlwYXNzaW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUocGFzc2luZyk7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiNzNmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5MaWJyYXJ5SnVuaXRUZXN0SW1wbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25UZXN0SW1wbCBleHRlbmRzIExpYnJhcnlKdW5pdFRlc3RJbXBsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc291cmNlRm9sZGVyTmFtZSA9ICJWYWxpZGF0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyAgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0ZXN0Um9vdFdvcmtpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRmlsZSBkZWZhdWx0VGVzdERpcjsgCi0JCi0JcHVibGljIFZhbGlkYXRpb25UZXN0SW1wbChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBGaWxlIGdldFRlc3RSb290U291cmNlKCkgewotCQlpZiAodGVzdFJvb3RTb3VyY2UgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRTZXJ2aWNlKCkuZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBzb3VyY2VGb2xkZXJOYW1lICsgIEZpbGUuc2VwYXJhdG9yOwotCQkJdGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZShwYXRoKTsKLQkJfQotCQlyZXR1cm4gdGVzdFJvb3RTb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0Um9vdFdvcmtpbmcoKSB7Ci0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gKEZpbGUpIHRlc3RSb290V29ya2luZ01hcC5nZXQoZ2V0Q2xhc3MoKSk7Ci0JCWlmICh0ZXN0Um9vdFdvcmtpbmcgPT0gbnVsbCkgewotCQkJQ2xhc3MgY2xzID0gZ2V0Q2xhc3MoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGNscy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJCi0JCQlTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIGhoOm1tOnNzOlNTUyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KG5ldyBEYXRlKCkpOwotCQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCWR0U3RyID0gZHRTdHIucmVwbGFjZSgnOicsICctJyk7Ci0JCQkKLQkJCVN0cmluZyBwYXRoID0gZ2V0U2VydmljZSgpLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIGNscy5nZXROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VOYW1lLmxlbmd0aCgpICsgMSk7Ci0JCQlwYXRoICs9ICJfIiArIGR0U3RyICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQl0ZXN0Um9vdFdvcmtpbmcgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXRlc3RSb290V29ya2luZ01hcC5wdXQoZ2V0Q2xhc3MoKSwgdGVzdFJvb3RXb3JraW5nKTsKLQkJfQotCQlyZXR1cm4gdGVzdFJvb3RXb3JraW5nOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXREZWZhdWx0VGVzdERpcigpIHsKLQkJaWYgKGRlZmF1bHRUZXN0RGlyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0VGVzdFJvb3RXb3JraW5nKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGdldE5hbWUoKTsgCi0JCQlkZWZhdWx0VGVzdERpciA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZGVmYXVsdFRlc3REaXI7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3YjYxOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0FjdGl2aXR5VmFyaWFiaWxpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIGFjdGl2aXR5IHZhcmFpYmlsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFjdGl2aXR5VmFyaWFiaWxpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2NwX2NvbnRyaWJ1dGlvbl9mb3JfYXR0cmlidXRlcygpIHsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDEiLCBjb25maWcpOwotCQkKLQkJLy8gbm93IGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AyIiwgY29uZmlnKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGNwMiwgY3AxKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbgotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMS5lQ29udGFpbmVyKCkpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDIuZUNvbnRhaW5lcigpKTsKLQkJCi0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCWZpbmFsIFN0cmluZyBjcDFfdGV4dCA9ICJjcDEgbWFpbiBkZXNjIjsKLQkJZmluYWwgU3RyaW5nIGNwMl90ZXh0ID0gImNwMiBtYWluIGRlc2MiOwotCQkJCi0JCWNwMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY3AxX3RleHQpOwotCQljcDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNwMl90ZXh0KTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgIHRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjcDEuZ2V0UHJlc2VudGF0aW9uKCksIGNwMSwgZmVhdHVyZSwgY29uZmlnKTsKLQkJaW50IGkxID0gdGV4dC5pbmRleE9mKGNwMV90ZXh0KTsKLQkJaW50IGkyID0gdGV4dC5pbmRleE9mKGNwMl90ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShpMSA+PSAwICk7Ci0JCWFzc2VydFRydWUoaTIgPiBpMSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfY3BfY29udHJpYnV0aW9uX2Zvcl9ndWlkYW5jZXMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCUNoZWNrbGlzdCBjazEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiY2sxIik7Ci0JCUNoZWNrbGlzdCBjazIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiY2syIik7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCi0JCS8vIG5vdyBjcmVhdGUgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AxIiwgY29uZmlnKTsKLQkJY3AxLmdldENoZWNrbGlzdHMoKS5hZGQoY2sxKTsKLQkJCi0JCS8vIG5vdyBjcmVhdGUgYSBjb250cmlidXRpbmcgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7Ci0JCWNwMi5nZXRDaGVja2xpc3RzKCkuYWRkKGNrMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhjcDIsIGNwMSk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDEuZUNvbnRhaW5lcigpKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AyLmVDb250YWluZXIoKSk7Ci0JCQotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoY3AxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoY2sxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoY2syKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfY3BfY29udHJpYnV0aW9uX2Zvcl9icmVha2Rvd25FbGVtZW50cygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQotCQkvLyBub3cgY3JlYXRlIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgImFjdDEiLCBudWxsKTsKLQkJCi0JCS8vIG5vdyBjcmVhdGUgYSBjb250cmlidXRpbmcgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMiwgImFjdDIiLCBudWxsKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGNwMiwgY3AxKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbgotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMS5lQ29udGFpbmVyKCkpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDIuZUNvbnRhaW5lcigpKTsKLQkJCi0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGNwMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGFjdDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhY3QyKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfYWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfd2l0aF9jb250cmlidXRvcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJCi0JCS8vIGZpcnN0IHNldCBvZiB0YXNrLCByb2xlLCB3cHMKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExMSIpOwotCQlBcnRpZmFjdCBhMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEyIik7Ci0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIxKTsKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTFfMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGExXzIpOwotCQl0MS5nZXRPdXRwdXQoKS5hZGQoYTFfMik7Ci0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExXzEpOwotCQkKLQkJLy8gc2Vjb25kIHNldCBvZiB0YXNrLCByb2xlLCB3cHMKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAidDIiKTsKLQkJQXJ0aWZhY3QgYTJfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyMSIpOwotCQlBcnRpZmFjdCBhMl8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIyIik7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTJfMSk7Ci0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyXzIpOwotCQl0Mi5nZXRPdXRwdXQoKS5hZGQoYTJfMik7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyXzEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQotCQkvLyBub3cgY3JlYXRlIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgImFjdDEiLCBuZXcgVGFza1tde3QxfSk7Ci0JCQotCQkvLyBub3cgY3JlYXRlIGEgY29udHJpYnV0aW5nIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDIiLCBjb25maWcpOwotCQlBY3Rpdml0eSBhY3QyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQWN0aXZpdHkocGx1Z2luLCBjcDEsICJhY3QyIiwgbmV3IFRhc2tbXXt0Mn0pOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoY3AyLCBjcDEpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uCi0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AxLmVDb250YWluZXIoKSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMi5lQ29udGFpbmVyKCkpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShjcDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhY3QxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYWN0MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzMzg4NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0F0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgYXR0cmlidXRlIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVGZWF0dXJlVGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlRmVhdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX21haW5EZXNjcmlwdGlvbl93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgdGV4dDsKLQkJCi0JCWZpbmFsIFN0cmluZyB0MXRleHQgPSAiLS10MSB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDJ0ZXh0ID0gIi0tdDIgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQzdGV4dCA9ICItLXQzIHRleHQtLSI7Ci0JCQotCQl0MS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDF0ZXh0KTsKLQkJdDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQydGV4dCk7Ci0JCXQzLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0M3RleHQpOwotCQkKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQxLmdldFByZXNlbnRhdGlvbigpLCB0MSwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQxdGV4dCwgdGV4dCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MiwgdDEpOwotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDEuZ2V0UHJlc2VudGF0aW9uKCksIHQxLCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRUcnVlKHRleHQgIT0gbnVsbCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDF0ZXh0KSA+PSAwIAotCQkJCSYmIHRleHQuaW5kZXhPZih0MnRleHQpID49IDAgKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0MS5nZXRQcmVzZW50YXRpb24oKSwgdDEsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydFRydWUodGV4dCAhPSBudWxsIAotCQkJCSYmIHRleHQuaW5kZXhPZih0MXRleHQpID49IDAgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQydGV4dCkgPj0gMCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDN0ZXh0KSA+PSAwICk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX21haW5EZXNjcmlwdGlvbl93aXRoX3JlcGxhY2VycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIHRleHQ7Ci0JCVRhc2sgdDsKLQkJCi0JCWZpbmFsIFN0cmluZyB0MXRleHQgPSAiLS10MSB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDJ0ZXh0ID0gIi0tdDIgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQzdGV4dCA9ICItLXQzIHRleHQtLSI7Ci0JCQotCQl0MS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDF0ZXh0KTsKLQkJdDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQydGV4dCk7Ci0JCXQzLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0M3RleHQpOwotCQkKLQkJLy8gMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQl0ID0gKFRhc2spQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDIsIHQpOyAgLy8gaWYgdGhpcyBmYWlsLCB0aGUgcmVtYWluaW5nIGNvZGUgd2lsbCBub3QgYmUgZXhlY3V0ZWQKLQotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodC5nZXRQcmVzZW50YXRpb24oKSwgdCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQydGV4dCwgdGV4dCk7Ci0JCQotCQkvLyAyCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0Mik7Ci0JCXQgPSAoVGFzaylDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MywgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCi0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0LmdldFByZXNlbnRhdGlvbigpLCB0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDN0ZXh0LCB0ZXh0KTsKLQotCQkvLyAzCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0MSk7Ci0JCXQgPSAoVGFzaylDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MSwgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCi0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0LmdldFByZXNlbnRhdGlvbigpLCB0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDF0ZXh0LCB0ZXh0KTsKLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfbWFpbkRlc2NyaXB0aW9uX3dpdGhfZXh0ZW5kZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0OwotCQkKLQkJZmluYWwgU3RyaW5nIHQxdGV4dCA9ICItLXQxIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0MnRleHQgPSAiLS10MiB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDN0ZXh0ID0gIi0tdDMgdGV4dC0tIjsKLQkJCi0JCXQxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0MXRleHQpOwotCQl0My5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDN0ZXh0KTsKLQkKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0PT1udWxsIHx8IHRleHQuZXF1YWxzKCIiKSk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0Mi5nZXRQcmVzZW50YXRpb24oKSwgdDIsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscyh0MXRleHQsIHRleHQpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDEpOwotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDMuZ2V0UHJlc2VudGF0aW9uKCksIHQzLCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDN0ZXh0LCB0ZXh0KTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfbWFpbkRlc2NyaXB0aW9uX3dpdGhfcmVwbGFjZXJfY29udHJpYnV0b3JfZXh0ZW5kZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCVRhc2sgdDQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQ0Iik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0OwotCQlUYXNrIHQ7Ci0JCQotCQlmaW5hbCBTdHJpbmcgdDF0ZXh0ID0gIi0tdDEgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQydGV4dCA9ICItLXQyIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0M3RleHQgPSAiLS10MyB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDR0ZXh0ID0gIi0tdDQgdGV4dC0tIjsKLQkJCi0JCXQxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0MXRleHQpOwotCQl0Mi5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDJ0ZXh0KTsKLQkJdDMuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQzdGV4dCk7Ci0JCS8vdDQuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQ0dGV4dCk7Ci0JCQotCQkvLyAxCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDQsIHQxKTsKLQotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDQuZ2V0UHJlc2VudGF0aW9uKCksIHQ0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDJ0ZXh0LCB0ZXh0KTsKLQkJCi0JCS8vIDIKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQyKTsKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQ0LmdldFByZXNlbnRhdGlvbigpLCB0NCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQydGV4dCkgPj0gMCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDN0ZXh0KSA+PSAwICk7Ci0KLQkJLy8gMyBzaW5jZSB0MyBjb250cmlidXRlcyB0byB0NCwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIGJhc2UgaXMgbm90IGluaGVyaXRlZC4KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQ0KTsKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQ0LmdldFByZXNlbnRhdGlvbigpLCB0NCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQzdGV4dCkgPj0gMCApOwotCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9Db3B5cmlnaHRUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0NvcHlyaWdodFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmN2ZkNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0NvcHlyaWdodFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLQotLyoqCi0gKiB0ZXN0IGNhc2UgZm9yIGNvcHlyaWdodCB0ZXh0IHJlYWxpemF0aW9uCi0gKiAKLSAqIFdoZW4gYSBjb250cmlidXRpbmcgZWxlbWVudCBoYXMgYSBjb3B5cmlnaHQsIAotICogaXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBjb3B5cmlnaHQgb2YgdGhlIHBhcmVudCBlbGVtZW50IG9uIHRoZSBmaW5hbCBwdWJsaXNoZWQgcGFnZS4KLQotCUFsc28sIHdoZW4gYW4gZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIGEgY29weXJpZ2h0LCAKLQl0aGUgcHVibGlzaGVkIHBhZ2UgZm9yIHRoZSBleHRlbmRpbmcgZWxlbWVudCBzaG91bGQgCi0JaGF2ZSB0aGUgcGFyZW50IGVsZW1lbnQncyBjb3B5cmlnaHQgZm9sbG93ZWQgYnkgdGhlIGV4dGVuZGluZyBlbGVtZW50cyBjb3B5cmlnaHQuCi0KLQlGb3IgcmVwbGFjZXMsIHRoZSByZXBsYWNpbmcgY29weXJpZ2h0IHNob3VsZCBiZSBwcmVzZW50LgotCQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5cmlnaHRUZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0X3RleHRfMSA9ICI9PT09PT09PT09PT09PT09IFRoaXMgaXMgY29weXJpZ2h0IHRleHQgMSA9PT09PT09PT09PT09PT09PT09IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0X3RleHRfMiA9ICI9PT09PT09PT09PT09PT09IFRoaXMgaXMgY29weXJpZ2h0IHRleHQgMiA9PT09PT09PT09PT09PT09PT09IjsKLQkKLQlwdWJsaWMgQ29weXJpZ2h0VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvcHlyaWdodCgpIHsKLQkJCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodF8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKHBrZzEsICJjb3B5cmlnaHQgMSIpOwotCQljb3B5cmlnaHRfMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY29weXJpZ2h0X3RleHRfMSk7Ci0JCXBsdWdpbjEuc2V0Q29weXJpZ2h0U3RhdGVtZW50KGNvcHlyaWdodF8xKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMiIpOwotCQlDb250ZW50UGFja2FnZSBwa2cyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMiwgInAyIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cyLCAiY29weXJpZ2h0IDIiKTsKLQkJY29weXJpZ2h0XzIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzIpOwotCQlwbHVnaW4yLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzEpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjIpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cyKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMSwgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MiIpOwotCi0JCVN0cmluZyB0ZXh0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KHQxLCBjb25maWcpOwotCQlpbnQgaW5kZXgxID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzEpOwotCQlhc3NlcnRUcnVlKGluZGV4MT49MCk7Ci0JCQotCQl0ZXh0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KHQyLCBjb25maWcpOwotCQlpbnQgaW5kZXgyID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIpOwotCQlhc3NlcnRUcnVlKGluZGV4Mj49MCk7Ci0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9jb250cmlidXRvcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMSwgInAxIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cxLCAiY29weXJpZ2h0IDEiKTsKLQkJY29weXJpZ2h0XzEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzEpOwotCQlwbHVnaW4xLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMSk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMiwgImNvcHlyaWdodCAyIik7Ci0JCWNvcHlyaWdodF8yLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJcGx1Z2luMi5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4xKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzIpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cxLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMiwgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MyIpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MSwgY29uZmlnKTsKLQkJaW50IGluZGV4MSA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8xKTsJCQotCQlpbnQgaW5kZXgyID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIpOwotCQlpbnQgaW5kZXgzID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIsIGluZGV4MiArIGNvcHlyaWdodF90ZXh0XzIubGVuZ3RoKCkpOwotCQlhc3NlcnRUcnVlKGluZGV4MT49MCk7Ci0JCWFzc2VydFRydWUoaW5kZXgyPj0wKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDM8MCk7IC8vIHQyIGFuZCB0MyBoYXMgdGhlIHNhbWUgY29weXJpZ2h0LCBzaG91bGQgb25seSBzaG93IG9uY2UKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9yZXBsYWNlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodF8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKHBrZzEsICJjb3B5cmlnaHQgMSIpOwotCQljb3B5cmlnaHRfMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY29weXJpZ2h0X3RleHRfMSk7Ci0JCXBsdWdpbjEuc2V0Q29weXJpZ2h0U3RhdGVtZW50KGNvcHlyaWdodF8xKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMiIpOwotCQlDb250ZW50UGFja2FnZSBwa2cyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMiwgInAyIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cyLCAiY29weXJpZ2h0IDIiKTsKLQkJY29weXJpZ2h0XzIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzIpOwotCQlwbHVnaW4yLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjEpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cxKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4yKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMik7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzEsICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cyLCAidDIiKTsKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQkKLQkJU3RyaW5nIHRleHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDIsIGNvbmZpZyk7Ci0JCWludCBpbmRleDEgPSB0ZXh0LmluZGV4T2YoY29weXJpZ2h0X3RleHRfMSk7CQkKLQkJaW50IGluZGV4MiA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDEgPCAwKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDIgPj0gMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMSwgInAxIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cxLCAiY29weXJpZ2h0IDEiKTsKLQkJY29weXJpZ2h0XzEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzEpOwotCQlwbHVnaW4xLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMSk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMiwgImNvcHlyaWdodCAyIik7Ci0JCWNvcHlyaWdodF8yLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJcGx1Z2luMi5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4xKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzIpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cxLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMiwgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MyIpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDIpOwotCQkKLQkJaW50IGluZGV4MSwgaW5kZXgyLCBpbmRleDM7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MSwgY29uZmlnKTsKLQkJaW5kZXgxID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzEpOwkKLQkJYXNzZXJ0VHJ1ZShpbmRleDE+PTApOwotCQkKLQkJdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MiwgY29uZmlnKTsJCi0JCWluZGV4MSA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8xKTsJCi0JCWluZGV4MiA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDEgPj0gMCk7Ci0JCWFzc2VydFRydWUoaW5kZXgyID4gaW5kZXgxKTsgLy8gYmFzZSBjb3B5cmlnaHQgY29tZXMgZmlyc3QKLQotCQlTdHJpbmcgdGV4dDMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDMsIGNvbmZpZyk7CQotCQlhc3NlcnRFcXVhbHModGV4dCwgdGV4dDMpOyAvLyB0MiBhbmQgdDMgaGFzIHRoZSBzYW1lIGNvcHlyaWdodCwgc2hvdWxkIG9ubHkgc2hvdyBvbmNlLCBzbyBzYW1lIGFzIGFib3ZlCQkKLQl9Ci0JCi0JLyoqCi0JICogUjAwMzgzODU1IC0gU2FtZSBjb3B5cmlnaHQgbWVzc2FnZSBnZXRzIHJlYWxpemVkIHR3aWNlCi0JICogU3RlcHMgdG8gcmVwcm9kdWNlOgotCQkwLiBDcmVhdGUgYSBjb25maWcgaW5jbHVkZSBwbHVnaW4gWCBhbmQgWS4KLQkJMS4gQXNzaWduIGNvcHlyaWdodCBBIHRvIHBsdWdpbiBYLgotCQkyLiBBc3NpZ24gY29weXJpZ2h0IEEgdG8gcGx1Z2luIFkuCi0JCTMuIEhhdmUgYSB0YXNrIE0gaW4gcGx1Z2luIFkgdG8gY29udHJpYnV0ZSB0YXNrIE4gaW4gcGx1Z2luIFguCi0JCTQuIHByZXZpZXcgdGFzayBOIGFuZCB5b3Ugd2lsbCBiZSB0aGUgY29weXJpZ2h0IGRpc3BsYWVkIHR3aWNlIGF0IHRoZSBib3R0b20uCi0JICoKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X1IwMDM4Mzg1NSgpIHsKLQkJCi0JCS8vIHNhbWUgYXMgdGhlIGxhc3QgcGFydCBvZiB0ZXN0Q29weXJpZ2h0X3dpdGhfY29udHJpYnV0b3JzKCkKLQkJdGVzdENvcHlyaWdodF93aXRoX2NvbnRyaWJ1dG9ycygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvRnVsZmlsbG1lbnRUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0Z1bGZpbGxtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTEyODYxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvRnVsZmlsbG1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciBmdWxmaWxsbWVudCByZWFsaXphdGlvbgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIEZ1bGZpbGxtZW50VGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRnVsZmlsbG1lbnRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QwMSgpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJCi0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCQotCQlBcnRpZmFjdCBzbG90MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgInNsb3QxIik7Ci0JCUFydGlmYWN0IHNsb3QyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAic2xvdDIiKTsKLQkJc2xvdDEuc2V0SXNBYnN0cmFjdCh0cnVlKTsKLQkJc2xvdDIuc2V0SXNBYnN0cmFjdCh0cnVlKTsKLQkJc2xvdDEuc2V0UHJlc2VudGF0aW9uTmFtZSgiYl9zbG90Iik7Ci0JCXNsb3QyLnNldFByZXNlbnRhdGlvbk5hbWUoImFfc2xvdCIpOwotCQkKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlhMS5nZXRGdWxmaWxscygpLmFkZChzbG90MSk7Ci0JCWExLmdldEZ1bGZpbGxzKCkuYWRkKHNsb3QyKTsKLQkJCi0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsKLQkJYTIuZ2V0RnVsZmlsbHMoKS5hZGQoc2xvdDEpOwotCQlhMi5nZXRGdWxmaWxscygpLmFkZChzbG90Mik7Ci0JCQotCQlhMS5zZXRQcmVzZW50YXRpb25OYW1lKCJiX2ExIik7Ci0JCWEyLnNldFByZXNlbnRhdGlvbk5hbWUoImFfYTIiKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZTsKLQkJTGlzdCBpdGVtczsKLQkJCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHNsb3QxKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoc2xvdDIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCQotCQlvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoYTEsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscyhzbG90MiwgaXRlbXMuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHNsb3QxLCBpdGVtcy5nZXQoMSkpOwotCQkKLQkJb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5GdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50czsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQoc2xvdDEsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoYTIsIGl0ZW1zLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyhhMSwgaXRlbXMuZ2V0KDEpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMDFGZWF0dXJlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9JbmNvbWluZzAxRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwNmU3ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMDFGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIGluY29taW5nIDAuLjEgZmVhdHVyZSB2YXJhaWJpbGl0eS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEluY29taW5nMDFGZWF0dXJlVGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSW5jb21pbmcwMUZlYXR1cmVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rfd29ya1Byb2R1Y3RfRG9tYWluKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlEb21haW4gZDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVEb21haW4ocGx1Z2luLCAiZDEiKTsKLQkJRG9tYWluIGQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlRG9tYWluKHBsdWdpbiwgImQyIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWluczsKLQkJCi0JCS8vIHNpbmNlIDEuMiwgdGhpcyBpcyBhIHRvLW1hbnkgZmVhdHVyZSwgbm90IHRvLW9uZQotCQkvLyBjYXNlIDEKLQkJZDEuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGExKTsKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhkMiwgaXRlbXMuZ2V0KDApKTsKLQkJCi0JCS8vIGNhc2UgMjogCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGQyLCBkMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZDEsIGl0ZW1zLmdldCgwKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSAzOiAKLQkJLy8gaWYgZDIgcmVwbGFjZXMgZDEsIGl0J3Mgb3V0Z29pbmcgdG8tbWFueSBhc3NvY2lhdGlvbiBpcyByZXBhbGNlZCwgCi0JCS8vIGkuZSB0aGUgZW5kIHJlc3VsdCBpcyBkMiAtPiBhMiwgYnV0IGExIGRvZXMgbm90IGhhdmUgYSBkb21haW4KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoZDIsIGQxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGl0ZW1zLnNpemUoKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSA0OiAKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyhkMiwgZDEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoZDIsIGl0ZW1zLmdldCgxKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3dvcmtQcm9kdWN0X0RvbWFpbl93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJRG9tYWluIGQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlRG9tYWluKHBsdWdpbiwgImQxIik7Ci0JCURvbWFpbiBkMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZURvbWFpbihwbHVnaW4sICJkMiIpOwotCQlEb21haW4gZDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVEb21haW4ocGx1Z2luLCAiZDMiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSAyOiAKLQkJZDEuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGExKTsKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoZDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhkMikpOwotCQkJCQotCQkvLyBjYXNlIDM6IG1vcmUgdGhhbiBjb250cmlidXRvcnMsIHJldHVybiBudWxsCi0JCWQxLmdldFdvcmtQcm9kdWN0cygpLnJlbW92ZShhMSk7Ci0JCWQyLmdldFdvcmtQcm9kdWN0cygpLmFkZChhMik7Ci0JCWQzLmdldFdvcmtQcm9kdWN0cygpLmFkZChhMyk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGEzLCBhMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGQyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoZDMpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMG5GZWF0dXJlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9JbmNvbWluZzBuRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwNmJmYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMG5GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciBpbmNvbWluZyAwLi5uIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNvbWluZzBuRmVhdHVyZVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEluY29taW5nMG5GZWF0dXJlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8qKgotCSAqIHNpbmNlIDEuMG00LCBhIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcwotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93b3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlBcnRpZmFjdCBhMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExIik7Ci0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQlMaXN0IGxpc3QgPSByMS5nZXRSZXNwb25zaWJsZUZvcigpOwotCQlsaXN0LmFkZChhMSk7Ci0JCWxpc3QuYWRkKGExKTsKLQkJCi0JCS8vIGNhc2UgMQotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQkvLyBjYXNlIDI6IAotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCQotCQkvLyBjYXNlIDM6IAotCQkvLyBzaW5jZSByMiByZXBsYWNlcyByMSwgdGhlIGVuZCByZXN1bHQgaXMgcjIgLT4gYTIsIAotCQkvLyByMSBkb2VzIG5vdCBleGlzdCBhbnkgbW9yZSwgc28gYTEgaGFzIG5vIHJlc3BvbnNpYmxlIHJvbGUKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHIyLCByMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVtcy5zaXplKCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCS8vIGNhc2UgNDogCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTIpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHIyLCByMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQkvLyBjYXNlIDU6IGJvdGggcjEgYW5kIHIyIHJlc3BvbnNpYmxlIGZvciBhMQotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7IC8vIHRoaXMgbmVlZCB0byB3YWl0IHRpbGwgdGhlIG9wcG9zaXRlIGZlYXR1cmUgY2hhbmdlIGZyb20gcGhvbmcgaXMgZGVsaXZlcmVkCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGl0ZW1zLnNpemUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3dvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXNfd2l0aF9jb250cmlidXRvcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCVJvbGUgcjMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIzIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzOwotCQlMaXN0IGl0ZW1zOwotCQkKLQkJLy8gY2FzZSAxCi0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCS8vIGNhc2UgMjogCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTIpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3Rfd29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlc193aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotLy8JCVJvbGUgcjMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIzIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotLy8JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKGEyLCBhMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzAxRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvT3V0Z29pbmcwMUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTcxYzEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzAxRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgMC4uMSBmZWF0dXJlIHZhcmFpYmlsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0Z29pbmcwMUZlYXR1cmVUZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBPdXRnb2luZzAxRmVhdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnkoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCQotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19wZXJmb3JtZWRCeV93aXRoX2NvbnRyaWJ1dG9yKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCQotCQkvLyB0MiBjb250cmlidXRlcyB0byB0MSwgc2luY2UgdDEgYWxyZWFkeSBoYXMgYSB0by1vbmUgYXNzb2NpYXRpb24sIAotCQkvLyB0aGUgb25lIGZyb20gdGhlIGNvbnRyaWJ1dG9yIGlzIGlnbm9yZWQKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJLy9NZXRob2RFbGVtZW50IHIgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfZnJvbV9jb250cmlidXRvcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLS8vCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQkKLQkJLy8gZG9uJ3Qgc2V0IHBlcmZvcm1lciBpbiB0MSwgc28gaXQgd2lsbCBnZXQgZnJvbSB0aGUgY29udHJpYnV0b3IKLQkJLy90MS5zZXRQZXJmb3JtZWRCeShyMSk7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsKLQkJCi0JCS8vIHQyIGNvbnRyaWJ1dGVzIHRvIHQxLCBzaW5jZSB0MSBkb2VzIG5vdCBoYXZlIGEgdG8tb25lIGFzc29jaWF0aW9uLCAKLQkJLy8gdGhlIG9uZSBmcm9tIHRoZSBjb250cmlidXRvciBpcyB1c2VkCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjIsIHIpOwotCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3BlcmZvcm1lZEJ5X3dpdGhfY29udHJpYnV0b3JzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotLy8JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0KLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJUm9sZSByMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjMiKTsKLQotCQkvLyBkb24ndCBzZXQgcGVyZm9ybWVyIGluIHQxLCBzbyBpdCB3aWxsIGdldCBmcm9tIHRoZSBjb250cmlidXRvcgotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCXQzLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIzKTsKLQkJCi0JCS8vIHQyIGFuZCB0MyBib3RoIGNvbnRyaWJ1dGUgdG8gdDEsIGV2ZW4gdGhvdWdoIHQxIGRvZXMgbm90IGhhdmUgYSB0by1vbmUgYXNzb2NpYXRpb24sIAotCQkvLyB0aGUgb25lcyBmcm9tIHRoZSBjb250cmlidXRvcnMgYXJlIGlnbm9yZWQgc2luY2UgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9yZXBsYWNlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJCi0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIxKTsKLQkJdDIuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MiwgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9yZXBsYWNlcl9ub19wZXJmb3JtZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCQotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCQotCQkvLyB0MiBoYXMgbm8gcHJpbWFyeSBwZXJmb3JtZXIKLS8vCQl0Mi5zZXRQZXJmb3JtZWRCeShyMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQyLCB0KTsgIC8vIGlmIHRoaXMgZmFpbCwgdGhlIHJlbWFpbmluZyBjb2RlIHdpbGwgbm90IGJlIGV4ZWN1dGVkCi0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkKLQkJaWYgKEVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQlhc3NlcnRFcXVhbHMocjEsIHIpOyAgCi0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMobnVsbCwgcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3BlcmZvcm1lZEJ5X3dpdGhfcmVwbGFjZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQlSb2xlIHIzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMyIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCXQzLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIzKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJLy8gaWYgbW9yZSB0aGFuIG9uZSByZXBsYWNlciwgYWxsIHJlcGxhY2VycyBhcmUgaWdub3JlZAotCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MSwgdCk7IAotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0vLwkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLS8vCQlSb2xlIHIzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMyIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MiwgdDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCQlNZXRob2RFbGVtZW50IHI7Ci0JCQotCQkvLyBjYXNlIDE6Ci0JCS8vdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQobnVsbCk7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsJCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhudWxsLCByKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmlzRW1wdHkoKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQkJCi0JCS8vIGNhc2UgMjoKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0KLQkJLy9yID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjEsIHIpOwotCQlsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRUcnVlKGxpc3Quc2l6ZSgpID09IDIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgxKSk7Ci0JCQotCQkvLyBjYXNlIDM6Ci0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJdDIuZ2V0UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCS8vdDIuZ2V0UGVyZm9ybWVkQnkoKS5hZGQobnVsbCk7Ci0KLQkJLy9yID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjEsIHIpOwotCQlsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjEsIGxpc3QuZ2V0KDApKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzBuRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvT3V0Z29pbmcwbkZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWM5N2QuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzBuRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciAwLi5uIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRnb2luZzBuRmVhdHVyZVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE91dGdvaW5nMG5GZWF0dXJlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBjb250cmlidXRlcyB0byBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiByZXBsYWNlcyBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBleHRlbmRzIGExCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX01hbmRhdG9yeUlucHV0X3dpdGhfY29udHJpYnV0b3IoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg0LCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBjb250cmlidXRlcyB0byBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygzLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCQotCQkvLyBob3cgYWJvdXQgYTMgcmVwbGFjZXMgYTEKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoYTMsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhNCByZXBsYWNlcyBhMSB0b286IGEzIGFuZCBhMyB3aWxsIGJlIGlnbm9yZWQsIGEyIGlzIHJlc3VsdGluZyB0byBhMSwgc28gb25seSBnZXQgYTEKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoYTQsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19NYW5kYXRvcnlJbnB1dF93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7CQotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyKTsKLQkJCi0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJQXJ0aWZhY3QgYTQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNCIpOwkKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTMpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNCk7Ci0KLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJQXJ0aWZhY3QgYTUgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNSIpOwotCQl0My5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNSk7Ci0JCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCB0MyBjb250cmlidXRlcyB0byB0Miwgc2FtZSByZXN1bHQKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQyKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQkJCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19NYW5kYXRvcnlJbnB1dF93aXRoX3JlcGxhY2VycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7CQotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyKTsKLQkJCi0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJQXJ0aWZhY3QgYTQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNCIpOwkKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTMpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNCk7Ci0JCi0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCUFydGlmYWN0IGE1ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTUiKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTUpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJTWV0aG9kRWxlbWVudCB0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDIsIHQpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTMpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNCkpOwotCQkKLQkJLy8gaG93IGFib3V0IHQzIHJlcGxhY2VzIHRvIHQyCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0Mik7Ci0JCQotCQl0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDMsIHQpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQotCQkvLyBob3cgYWJvdXQgdDMgcmVwbGFjZXMgdG8gdDEsIHNvIHQyIGFuZCB0MyBib3RoIHJlcGxhY2VzIHQxLCB0aCBlcmVwbGFjZXIgaXMgaWdub3JlZAotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MywgdDEpOwotCQkKLQkJdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQxLCB0KTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfTWFuZGF0b3J5SW5wdXRfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCi0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCUFydGlmYWN0IGE1ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTUiKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTUpOwotCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDMsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTMpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MywgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMywgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNSkpOwotCQkKLQkJLy8gaG93IGFib3V0IHQzIGV4dGVuZHMgdDIKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDIpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQzLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg1LCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNSkpOwotCi0JfQotCQotCS8vIHRlc3QgdGhlIHNlY3Rpb25zCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3N0ZXBzX3dpdGhfY29udHJpYnV0b3JzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCi0JCS8vIHRoZXNlIHR3byBzaG91bGQgZ2VuZXJhdGUgdGhlIHNhbWUgcmVzdWx0Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKTsKLQkJTGlzdCBpdGVtczsKLQkJCQkKLQkJU2VjdGlvbiBzMV8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczEiLCAidDFzMSIpOwotCQlTZWN0aW9uIHMxXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQxLmdldFByZXNlbnRhdGlvbigpLCAidDFzMiIsICJ0MXMyIik7Ci0KLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczEiLCAidDJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMiIsICJ0MnMyIik7Ci0KLQkJU2VjdGlvbiBzM18xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0My5nZXRQcmVzZW50YXRpb24oKSwgInQzczEiLCAidDNzMSIpOwotCQlTZWN0aW9uIHMzXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQzLmdldFByZXNlbnRhdGlvbigpLCAidDNzMiIsICJ0M3MyIik7Ci0JCQotCQkvLyBjYXNlIDEKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MS5nZXRQcmVzZW50YXRpb24oKSwgdDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlMiwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCS8vIGNhc2UgMgotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MiwgdDEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLmdldFByZXNlbnRhdGlvbigpLCB0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JfQotCQotCS8vIHRlc3QgdGhlIHNlY3Rpb25zIGZvciByZXBsYWNlcnMKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfc3RlcHNfd2l0aF9yZXBsYWNlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkKLQkJLy8gdGhlc2UgdHdvIHNob3VsZCBnZW5lcmF0ZSB0aGUgc2FtZSByZXN1bHQKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUyID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpOwotCQlMaXN0IGl0ZW1zOwotCQlUYXNrIHQ7Ci0JCQotCQlTZWN0aW9uIHMxXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQxLmdldFByZXNlbnRhdGlvbigpLCAidDFzMSIsICJ0MXMxIik7Ci0JCVNlY3Rpb24gczFfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMyIiwgInQxczIiKTsKLQotCQlTZWN0aW9uIHMyXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMSIsICJ0MnMxIik7Ci0JCVNlY3Rpb24gczJfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDIuZ2V0UHJlc2VudGF0aW9uKCksICJ0MnMyIiwgInQyczIiKTsKLQotCQlTZWN0aW9uIHMzXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQzLmdldFByZXNlbnRhdGlvbigpLCAidDNzMSIsICJ0M3MxIik7Ci0JCVNlY3Rpb24gczNfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDMuZ2V0UHJlc2VudGF0aW9uKCksICJ0M3MyIiwgInQzczIiKTsKLQkJCi0KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXModDIsIHQxKTsKLQkJdCA9IChUYXNrKUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQyLCB0KTsgIAotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodC5nZXRQcmVzZW50YXRpb24oKSwgdCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodCwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzIpKTsKLQotCX0KLQkKLQkvLyB0ZXN0IHRoZSBzZWN0aW9ucwotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19zdGVwc193aXRoX2V4dGVuZGVycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQotCQkvLyB0aGVzZSB0d28gc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIHJlc3VsdAotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCk7Ci0JCUxpc3QgaXRlbXM7Ci0JCQkJCi0JCVNlY3Rpb24gczFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMxIiwgInQxczEiKTsKLQkJU2VjdGlvbiBzMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczIiLCAidDFzMiIpOwotCi0JCVNlY3Rpb24gczJfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDIuZ2V0UHJlc2VudGF0aW9uKCksICJ0MnMxIiwgInQyczEiKTsKLQkJU2VjdGlvbiBzMl8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczIiLCAidDJzMiIpOwotCi0vLwkJU2VjdGlvbiBzM18xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0My5nZXRQcmVzZW50YXRpb24oKSwgInQzczEiLCAidDNzMSIpOwotLy8JCVNlY3Rpb24gczNfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDMuZ2V0UHJlc2VudGF0aW9uKCksICJ0M3MyIiwgInQzczIiKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDEpOwotCi0JCS8vIGNhc2UgMQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCS8vIGNhc2UgMiwgdDMgaGFzIG5vIHN0ZXBzLCB0aGlzIHdhcyBvbmNlIGEgYnVnIHNpbmNlIHRoZSBjb250ZW50RGVzY3JpcHRpb24gb2JqZWN0IGlzIG5vdCBjcmVhdGVkCi0JCS8vIGFuZCB0aGUgcmVhbGl6YXRpb24gZmFpbGVkCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDMuZ2V0UHJlc2VudGF0aW9uKCksIHQzLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MywgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1JlZ3Jlc3Npb25UZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1JlZ3Jlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGZhOTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9SZWdyZXNzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIHJlY29yZCBhbGwgYnVncyByZWxhdGluZyB0byByYXJpYWJpbGl0eSBzbyB0aGF0IHdlIGNhbiBkbyByZWdyZXNzaW9uIHRlc3Qgb24gdGhvc2UgaXNzdWVzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlZ3Jlc3Npb25UZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVncmVzc2lvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIAkxNDA4NzVJbmFiaWxpdHkgdG8gYWRkIHJlc3BvbnNpYmxlIGZvciByZWxhdGlvbnNoaXAgdG8gYSB3b3JrIHByb2R1Y3QKLQkgKiAKLQkgCUlmIEkgbWFrZSBhIHJvbGUsIFIyLCBpbiBhIHBsdWctaW4sIFAyLCByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QsIFdQMiwKLQkJdGhhdCBjb250cmlidXRlcyB0byBhIHdvcmsgcHJvZHVjdCwgV1AxLCBpbiBhbm90aGVyIHBsdWctaW4sIFAxLCB0aGF0Ci0JCXJlc3BvbnNpYmlsaXR5IGRvZXMgbm90IGFwcGVhciB0byBiZSBhZGRlZC4gIFNwZWNpZmljYWxseSwgdGhlIGZhY3QgdGhhdCBSMiBpcwotCQlyZXNwb25zaWJpbGUgZm9yIFdQMSBpcyBub3QgZGlzcGxheWVkIGluIHRoZSBCcm93c2UgcGVyc3BlY3RpdmUgZm9yIGEKLQkJY29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zIGJvdGggcGx1Zy1pbnMuICBBbHNvLCB0aGUgZmFjdCB0aGF0IFIyIGlzCi0JCXJlc3BvbnNpYmxlIGZvciBXUDIgaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgUHJldmlldyB0YWIgZm9yIFIyIG9yIFdQMgotCQkKLQkJSWYgdGhlIGJhc2UgZG9lcyBub3QgaGF2ZSBhbiBpbmNvbWluZyByZWxhdGlvbnNoaXAsIHRoZW4gaXQgc2hvdWxkIGJlIGFibGUgdG8KLQkJYmUgY29udHJpYnV0ZWQuICBJbiB0aGlzIGV4YW1wbGUsIFdQMSBkaWQgbm90IGhhdmUgYSByZXNwb25zaWJsZSByb2xlCi0JCXJlbGF0aW9uc2hpcC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfMTQwODc1KCkgewotCQkvLyB0aGlzIHNob3VsZCBub3QgYmUgYW4gaXNzdWUgYW55IG1vcmUgc2luY2UgMS4wbTQuCi0JCS8vIFdQIC0tPiBSb2xlIGlzIHRvIG1hbnkgYXNzb2NpYXRpb24gbm93LgotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCi0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCQotLy8JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZzEsICJyMSIpOwotCQlBcnRpZmFjdCB3cDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2cxLCAid3AxIik7Ci0JCQotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2cyLCAicjIiKTsKLQkJQXJ0aWZhY3Qgd3AyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnMiwgIndwMiIpOwotCQkKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQod3AyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMod3AyLCB3cDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjEpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cxKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4yKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMik7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUxpc3QgaXRlbXM7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cDEpKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUod3AyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCi0JfQotCQotCS8qKgotCSAqIDE0Mzg3MSAtIEFuIGV4dGVuZGluZyBjaGVja2xpc3Qgd2l0aCBubyBpdGVtcyBkb2VzIG5vdCByZWFsaXplIHRoZSBiYXNlIGNoZWNrbGlzdCBpdGVtcwotCSAqIAotCQlIYXZlIGEgYmFzZSB0YXNrLCBUYXNrIEEsIHdpdGggc29tZSBzdGVwcy4KLQkJRXh0ZW5kIGl0IHdpdGggYSBuZXcgVGFzayBCLCB3aGljaCBoYXMgbm8gc3RlcHMuCi0JCQotCQlCcm93c2luZyBUYXNrIEIgc2hvdWxkIHNob3cgdGhlIHN0ZXBzIG9mIFRhc2sgQSwgYnV0IGl0IGRvZXMgbm90LgotCQlJZiBUYXNrIEIgaXMgc3Vic2VxdWVudGx5IGFzc2lnbmVkIHNvbWUgc3RlcHMsIHRoZW4gYWxsIHdpbGwgYmUgcmVhbGl6ZWQgaW4gdGhlCi0JCWJyb3dzZXIuICBGdXJ0aGVyLCBpZiB0aGUgVGFzayBCJ3Mgc3RlcHMgYXJlIHRoZW4gZGVsZXRlZCwgdGhlIHJlYWxpemF0aW9uIHdpbGwKLQkJc3RpbGwgc2hvdyBUYXNrIEEncyBzdGVwcy4KLQkJCi0JCVRoZSBkZXNjcmlwdGlvbiBhcHBsaWVzIHRvIGNoZWNrbGlzdHMsIGFuZCBzaG91bGQgcmVhZDoKLQkJSGF2ZSBhIGJhc2UgY2hlY2tsaXN0LCBDaGVja2xpc3QgQSwgd2l0aCBzb21lIGNoZWNrbGlzdCBpdGVtcy4KLQkJRXh0ZW5kIGl0IHdpdGggYSBuZXcgQ2hlY2tsaXN0IEIsIHdoaWNoIGhhcyBubyBpdGVtcy4KLQkJCi0JCUJyb3dzaW5nIENoZWNrbGlzdCBCIHNob3VsZCBzaG93IHRoZSBzdGVwcyBvZiBDaGVja2xpc3QgQSwgYnV0IGl0IGRvZXMgbm90LgotCQlJZiBDaGVja2xpc3QgQiBpcyBzdWJzZXF1ZW50bHkgYXNzaWduZWQgc29tZSBpdGVtcywgdGhlbiBhbGwgd2lsbCBiZSByZWFsaXplZAotCQlpbiB0aGUgYnJvd3Nlci4gIEZ1cnRoZXIsIGlmIHRoZSBDaGVja2xpc3QgQidzIGl0ZW1zIGFyZSB0aGVuIGRlbGV0ZWQsIHRoZQotCQlyZWFsaXphdGlvbiB3aWxsIHN0aWxsIHNob3cgQ2hlY2tsaXN0IEEncyBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0XzE0Mzg3MV90YXNrX3N0ZXBzKCkgewkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQotCQkvLyB0aGVzZSB0d28gc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIHJlc3VsdAotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCk7Ci0JCUxpc3QgaXRlbXM7Ci0JCQkJCi0JCVNlY3Rpb24gczFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMxIiwgInQxczEiKTsKLQkJU2VjdGlvbiBzMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczIiLCAidDFzMiIpOwotCQkKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUyLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0KLQkJLy8gdGhlbiBzZXQgdGhlIHNlY3Rpb25zIGZvciB0YXNrIDIKLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczEiLCAidDJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMiIsICJ0MnMyIik7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0Mi5nZXRQcmVzZW50YXRpb24oKSwgdDIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUyLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg0LCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzIpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0XzE0Mzg3MV9jaGVja2xpc3RfaXRlbXMoKSB7CQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlDaGVja2xpc3QgYzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiYzEiKTsKLQkJQ2hlY2tsaXN0IGMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2hlY2tsaXN0KHBrZywgImMyIik7Ci0JCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQkJTGlzdCBpdGVtczsKLQkJCQkKLQkJU2VjdGlvbiBzMV8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbihjMS5nZXRQcmVzZW50YXRpb24oKSwgImMxczEiLCAiYzFzMSIpOwotCQlTZWN0aW9uIHMxXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKGMxLmdldFByZXNlbnRhdGlvbigpLCAiYzFzMiIsICJjMXMyIik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKGMyLCBjMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGMyLmdldFByZXNlbnRhdGlvbigpLCBjMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCS8vIHRoZW4gc2V0IHRoZSBzZWN0aW9ucyBmb3IgY2hlY2tsaXN0IDIKLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbihjMi5nZXRQcmVzZW50YXRpb24oKSwgImMyczEiLCAiYzJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKGMyLmdldFByZXNlbnRhdGlvbigpLCAiYzJzMiIsICJjMnMyIik7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShjMi5nZXRQcmVzZW50YXRpb24oKSwgYzIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JfQotCQotCS8qKgotCSAqIDE0NjE1MyAtIFZhcmlhYmlsaXR5OiBJbmNvbWluZyB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgbm90IHByZXNlcnZlZCBpbiB0aGUgY2FzZSBvZiByb2xlIHJlcGxhY2VtZW50IGFuZCBleHRlbnNpb24KLQkgKiAKLQkJU1RFUFM6Ci0JCTEuIGNyZWF0ZSByb2xlQSBhbmQgcm9sZUIuIEFzc2lnbiB0aGVtIHRvIHJvbGVzZXRBIGFuZCByb2xlc2V0QiByZXNwZWN0aXZlbHkKLQkJMi4gc2V0IHJvbGVBIHRvIHJlcGxhY2Ugcm9sZUIgYW5kIGJyb3dzZQotCQlyZXN1bHRzPT4gYnJvd3Npbmcgc2hvd3Mgcm9sZUEgaW4gcm9sZXNldEEgb25seS4gCi0JCWV4cGVjdCByZXN1bHRzPT4gcm9sZUEgc2hvdWxkIGJlIGluIHJvbGVzZXRBIGFuZCByb2xlc2V0QgotCQkKLQkJU2ltaWxhciBpc3N1ZSB3aGVuIHJvbGVBIGlzIGV4dGVuZGluZyByb2xlQgotCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0XzE0NjE1M193aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlSb2xlU2V0IHJzMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMxIik7Ci0JCVJvbGVTZXQgcnMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVTZXRzOwotCQlMaXN0IGl0ZW1zOwotCQkKLQkJcnMxLmdldFJvbGVzKCkuYWRkKHIxKTsKLQkJcnMyLmdldFJvbGVzKCkuYWRkKHIyKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHIyLCByMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJzMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHIyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczIpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfMTQ2MTUzX3dpdGhfY29udHJpYnV0b3IoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCVJvbGVTZXQgcnMxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczEiKTsKLQkJUm9sZVNldCByczIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlU2V0KHBsdWdpbiwgInJzMiIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQlyczEuZ2V0Um9sZXMoKS5hZGQocjEpOwotCQlyczIuZ2V0Um9sZXMoKS5hZGQocjIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMocjIsIHIxKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyczIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocjEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMikpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF8xNDYxNTNfd2l0aF9leHRlbmRlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJUm9sZVNldCByczEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlU2V0KHBsdWdpbiwgInJzMSIpOwotCQlSb2xlU2V0IHJzMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMyIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0czsKLQkJTGlzdCBpdGVtczsKLQkJCi0JCXJzMS5nZXRSb2xlcygpLmFkZChyMSk7Ci0JCXJzMi5nZXRSb2xlcygpLmFkZChyMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHIyLCByMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJzMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMSkpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHIxLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocjIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMikpOwotCX0KLQkKLQkvKioKLQkgKiBSMDAzODIxMjAgLSBBdXRob3Jpbmc6ICBFeHRlbmRpbmcgYSBiYXNlIHRoYXQgaGFzIGJlZW4gcmVwbGFjZWQsIGRvZXMgbm90IGV4dGVuZCB0aGUgcmVwbGFjZW1lbnQKLQkgKiBMZXQgQSwgQiwgYW5kIEMgYmUgZWxlbWVudHMgb3IgY2F0ZWdvcmllcy4KLQkJMS4gIExldCBBIGV4dGVuZCBCLgotCQkyLiAgTGV0IEMgcmVwbGFjZSBCLiAgICAgICAgICAob3JkZXIgZG9lcyBub3QgbWF0dGVyKQotCQkKLQkJUmVzdWx0OgotCQkKLQkJQSBleHRlbmRzIHRoZSBhc3NvY2lhdGlvbnMgb2YgQiwgZXZlbiB0aG91Z2ggQiBpcyBiZWluZyByZXBsYWNlZC4KLQkJCi0JCVNob3VsZCBiZToKLQkJCi0JCUEgZXh0ZW5kcyB0aGUgYXNzb2NpYXRpb25zIG9mIHRoZSByZXBsYWNlbWVudCwgQy4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUjAwMzgyMTIwX3Rhc2tfTWFuZGF0b3J5SW5wdXRfd2l0aF9yZXBsYWNlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdEEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdEEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0QS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHRCID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXRCLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdEIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCQotCQlUYXNrIHRDID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQlBcnRpZmFjdCBhNSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImE1Iik7Ci0JCXRDLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGE1KTsKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHRBLCB0Qik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHRDLCB0Qik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodEEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQotCX0KLQkKLQkvKioKLQkgKiBSMDAzODIzMjcgLSByZXBsYWNlZCBlbGVtZW50IGRvZXMgbm90IHNob3cgaW5jb21pbmcgcmVsYXRpb25zaGlwcwotCSAqIGUuZy4gcmVwbGFjZSBhIHdvcmsgcHJvZHVjdDogdGhlIHB1Ymxpc2hlZCBwYWdlIGRvZXMgbm90IHNob3cgdGhlIFRhc2tzIAotCSAqIHRoZSB3b3JrcHJvZHVjdCBpcyBpbnB1dC9vdXRwdXQgdG8uICAKLQkgKiBJdCBzaG91bGQgbGlzdCBhbGwgdGhlIFRhc2tzIGZyb20gdGhlIHJlcGxhY2VkIGVsZW1lbnQuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1IwMDM4MjMyN190YXNrX01hbmRhdG9yeUlucHV0X3dpdGhfcmVwbGFjZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwkJCi0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJCi0JCS8vIHQxLCB0MyAtPiBhMSwgdDItPmEyLCBhMiAtcmVwbGFjZS0+YTEKLQkJLy8gYTEncyB0YXNrcyBzaG91bGQgYmUgdDEsIHQyLHQzCi0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGExKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyhhMiwgYTEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygzLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnModDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh0MikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHQzKSk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogUjAwMzgyOTcyIC0gQXV0aG9yaW5nOiBXaGVuIHN1Yi1hcnRpZmFjdCBleHRlbmRzIHBhcmVudCBhcnRpZmFjdCwKLQkgKiB0aGF0IHN1YiBhcnRpZmFjdCBoYXMgaW5maW5pdGUgbG9vcCBpbiBjb25maWd1cmF0aW9uIGV4cGxvcmVyIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9SMDAzODI5NzJfYXJ0aWZhY3RfU3ViQXJ0aWZhY3RzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlBcnRpZmFjdCBhMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExIik7Ci0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsJCi0JCQotCQkvLyBhMSBjb250YWlucyBhMiwgYTIgZXh0ZW5kcyBhMQotCQkvLyB3aGF0J3MgYTEncyBjaGlsZHJlcz8gYTIKLQkJLy8gd2hhdCdzIGEyJ3MgY2hpbGRyZW4/IGEyPyBOT09PTyEKLQkJCi0JCWExLmdldENvbnRhaW5lZEFydGlmYWN0cygpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMoYTIsIGExKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCQotCQkvLyBhMidzIGNvbnRhaW5lZCBhcmZpZmFjdHMgc2hvdWxkIGNvbnRhaW4gdGhlIG9uZXMgZnJvbSB0aGUgYmFzZSwgd2hpY2ggaW5jbHVkZSBpdHNlbGYKLQkJLy8gc2hvdWxkIG5vdCBjb250YWluIGl0c2VsZgotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVtcy5zaXplKCkpOwkJCi0JCQotCX0KLQkKLQkvKiogCi0JICogUjAwMzgzNTI4IC0gQnJvd3Npbmc6ICBBIHJlcGxhY2luZyByb2xlIGRvZXMgbm90IHBpY2sgdXAgdGhlIHRhc2socykgZm9yIHdoaWNoIHRoZSByZXBsYWNlZCByb2xlIHdhcyBwcmltYXJ5IHBlcmZvcm1lcgotCSAqIAotCSAqCUxldCBSb2xlIEEgYmUgcHJpbWFyeSBwZXJmb3JtZXIgZm9yIFRhc2sgQSwKLSAgIAkJUm9sZSBCIGJlIHByaW1hcnkgcGVyZm9ybWVyIGZvciBUYXNrIEIuCi0KLQkJTm93IGhhdmUgUm9sZSBCIHJlcGxhY2UgUm9sZSBBLgotCQkKLQkJQnJvd3NlIFJvbGUgQiBhbmQgc2hvdWxkIGV4cGVjdCBpdCB0byBiZSB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgZm9yIFRhc2sgQSBhcyB3ZWxsIGFzIFRhc2sgQi4KLQkJSXQgb25seSBzaG93cyBUYXNrIEIuCi0JCQotCQlCcm93c2UgVGFzayBBIGFuZCBpdCBjb3JyZWN0bHkgc2hvd3MgdGhhdCBSb2xlIEIgaXMgdGhlIHByaW1hcnkgcGVyZm9ybWVyLgotCSAqLwotCXB1YmxpYyB2b2lkIFIwMDM4MzUyOF9yb2xlX3Rhc2tzX3dpdGhfcmVwYWxjZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdEEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgckEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdEIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgckIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCQotCQl0QS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyQSk7Ci0JCXRCLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHJCKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHJCLCByQSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJCi0JCS8vIG91dGdvaW5nIGZlYXR1cmUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCU1ldGhvZEVsZW1lbnQgciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHRBLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyQiwgcik7CQotCQkKLQkJciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHRCLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyQiwgcik7CQotCQkKLQkJLy8gaW5jb21pbmcgZmVhdHVyZQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3M7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyQiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHRBKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnModEIpKTsKLQotCX0KLQkKLQkvKioKLQkgKiAxNDYxNTMgLSBWYXJpYWJpbGl0eTogSW5jb21pbmcgdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBwcmVzZXJ2ZWQgaW4gdGhlIGNhc2Ugb2Ygcm9sZSByZXBsYWNlbWVudAotCSAqIAotCSAqIFNURVBTOgotCQkxLiBjcmVhdGUgcm9sZUEgYW5kIHJvbGVCLiBBc3NpZ24gdGhlbSB0byByb2xlc2V0QSBhbmQgcm9sZXNldEIgcmVzcGVjdGl2ZWx5Ci0JCTIuIHNldCByb2xlQSB0byByZXBsYWNlIHJvbGVCIGFuZCBicm93c2UKLQkJcmVzdWx0cz0+IGJyb3dzaW5nIHNob3dzIHJvbGVBIGluIHJvbGVzZXRBIG9ubHkuIAotCQlleHBlY3QgcmVzdWx0cz0+IHJvbGVBIHNob3VsZCBiZSBpbiByb2xlc2V0QSBhbmQgcm9sZXNldEIKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfMTQ2MTUzX3JvbGVfcm9sZXNldF93aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlSb2xlU2V0IHJzMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMxIik7Ci0JCVJvbGVTZXQgcnMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJcnMxLmdldFJvbGVzKCkuYWRkKHIxKTsKLQkJcnMyLmdldFJvbGVzKCkuYWRkKHIyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocnMxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocnMyKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiAxNTIyMzAgLSBCcm93c2luZzogUm9sZTwtLT5XUCByZWxhdGlvbnNoaXAgc2hvd3MgaW5jb25zaXN0YW5jeQotCSAqIAkxLiBjcmVhdGUgcm9sZTEgcmVzcG9uc2libGUgZm9yIHdwMQotCQkyLiBjcmVhdGUgcm9sZTIgcmVzcG9uc2libGUgZm9yIHdwMgotCQkzLiBoYXMgd3AyIHJlcGxhY3Mgd3AxLCBhbmQgd3AxIGNvbnRyaWJ1dGUgdG8gd3AKLQkJNC4gYnJvd3Npbmcgc2hvd3MgdGhhdAotCQkKLQkJaW4gd3AsIGl0IHNob3dzIHRoYXQgYm90aCByb2xlMSBhbmQgcm9sZTIgYXJlIHJlc3BvbnNpYmxlCi0JCWluIHJvbGUxLCB0aGUgcmVsYXRpb25zaGlwIHNob3dzIGl0IGlzIHJlc3BvbnNpYmxlIGZvciB3cAotCQlidXQgaW4gcm9sZTIsIHRoZSByZWxhdGlvbnNoaXAgc2hvd3Mgbm8gd3AKLQkJCi0JCVRvIGJlIGNvbnNpc3RhbnQsIHdwIHNob3VsZCBiZSBzaG93aW5nIGluIHJvbGUyJ3MgcmVsYXRpb25zaGlwIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF8xNTIyMzBfcm9sZV93cCgpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJQXJ0aWZhY3Qgd3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAid3AxIik7Ci0JCUFydGlmYWN0IHdwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgIndwMiIpOwotCQlBcnRpZmFjdCB3cCA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgIndwIik7Ci0JCQkJCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHdwMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHdwMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHdwMSwgd3ApOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh3cDIsIHdwMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBib3RoIHIxIGFuZCByMiByZXNwb25zaWJsZSBmb3Igd3AKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh3cCwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1ZhcmlhYmxpdHlCYXNlVGVzdENhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvVmFyaWFibGl0eUJhc2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWRkNGQzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvVmFyaWFibGl0eUJhc2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotCi0vKioKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KCk7Ci0JCQotCQkvLyBhY3RpdmF0ZSB0aGUgQXV0aG9yaW5nIHBsdWdpbnMgdG8gaW5pdGlhbGl6ZSBzb21ldGhpbmcKLQkJLy8gdGhlIHJlYXNvbiB0byBwdXQgaXQgYWZ0ZXIgdGhlIGxpYnJhcnkgaXMgY3JlYXRlZCBpcyB0byBhdm9pZCB0aGUgT3BlbiBMaWJyYXJ5IGRpYWxvZwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5jbG9zZUxpYnJhcnkoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLy5jbGFzc3BhdGggYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTZkNjYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwMDllMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIFJpY2hUZXh0IFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuUmljaFRleHRUZXN0c1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvYnVpbGQucHJvcGVydGllcyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZDNhNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9pY29ucy9zYW1wbGUuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvaWNvbnMvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvcGx1Z2luLnhtbCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmM2I2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iRVBGIFRlc3RzIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlJpY2ggVGV4dCBUZXN0IFZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICByYXRpbz0iMC41IgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlRhc2tMaXN0IgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJyaWdodCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9ycy5IVE1MRWRpdG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLkhUTUxFZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9ycy5IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiICAgICAgICAgICAgCi0gICAgICAgICAgICBuYW1lPSJIVE1MIEVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imh0bWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIj4KLSAgICAgIDwvZWRpdG9yPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLk11bHRpUGFnZUhUTUxFZGl0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmVkaXRvcnMuTXVsdGlQYWdlSFRNTEVkaXRvciIgICAgICAgICAgIAotICAgICAgICAgICAgbmFtZT0iTXVsdGktcGFnZSBIVE1MIEVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imh0bWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+ICAgICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQwYWMxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9SaWNoVGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dCBjbGFzc2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIFN0clV0aWwuaXNOdWxsKCkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkgICAgYXNzZXJ0VHJ1ZShTdHJVdGlsLmlzTnVsbChudWxsKSk7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc051bGwoIiIpKTsKLQkgICAgYXNzZXJ0RmFsc2UoU3RyVXRpbC5pc051bGwoIkhlbGxvIikpOwkgICAgCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9SaWNoVGV4dFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjdiMjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogSlVuaXQgdGVzdCBzdWl0ZSBmb3Igb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShSaWNoVGV4dFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJLy9zdWl0ZS5hZGRUZXN0U3VpdGUoU3RyVXRpbFRlc3QuY2xhc3MpOwotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvUmljaFRleHRUZXN0c1BsdWdpbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmZDUxZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvUmljaFRleHRUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUmljaFRleHQgVGVzdHMgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFJpY2hUZXh0VGVzdHNQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmljaFRleHRUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmljaFRleHRUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0Jsb2NrVGFnQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9CbG9ja1RhZ0NvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI0NGM0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0Jsb2NrVGFnQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuQmxvY2tUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBDb250cmlidXRlcyBhIGNvbWJvIGNvbnRhaW5pbmcgSFRNTCBibG9jayB0YWdzIHRvIGEgdG9vbCBiYXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUYWdDb250cmlidXRpb24gZXh0ZW5kcyBDb250cm9sQ29udHJpYnV0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBDb250cmlidXRpb24gSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVUSU9OX0lEID0gQmxvY2tUYWdDb250cmlidXRpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBUaGUgYmxvY2sgdGFnIGNvbWJvLgotCXByaXZhdGUgc3RhdGljIENvbWJvIGJsb2NrVGFnQ29tYm87Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgVGhlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBCbG9ja1RhZ0NvbnRyaWJ1dGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIoQ09OVFJJQlVUSU9OX0lEKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb24jY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJsb2NrVGFnQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5QQVJBR1JBUEguZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuSEVBRElOR18xLmdldE5hbWUoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uYWRkKEJsb2NrVGFnLkhFQURJTkdfMi5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5IRUFESU5HXzMuZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuSEVBRElOR180LmdldE5hbWUoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uYWRkKEJsb2NrVGFnLkhFQURJTkdfNS5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5IRUFESU5HXzYuZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuQUREUkVTUy5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5QUkVGT1JNQVRURURfVEVYVC5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLnNldFZpc2libGVJdGVtQ291bnQoYmxvY2tUYWdDb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uc2VsZWN0KDApOwotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJYmxvY2tUYWdDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPYmplY3QgZXZlbnRTcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKGV2ZW50U3JjIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBldmVudFNyYzsKLQkJCQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBCbG9ja1RhZy5nZXRCbG9ja1RhZyhpbmRleCkuZ2V0VmFsdWUoKTsKLQkJCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GT1JNQVRfQkxPQ0ssCi0JCQkJCQkJCXZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9KTsKLQkJfQotCi0JCXJldHVybiBibG9ja1RhZ0NvbWJvOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YWViNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlICdib2xkJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvbGRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQm9sZEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJvbGRBY3Rpb25fdG9vbFRpcFRleHQpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQk9MRCwgbnVsbCk7CQkJCi0JCX0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250TmFtZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvRm9udE5hbWVDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDNiZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250TmFtZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuRm9udE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBDb250cmlidXRlcyBhIGNvbWJvIGNvbnRhaW5pbmcgSFRNTCBmb250IG5hbWVzIHRvIGEgdG9vbCBiYXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnROYW1lQ29udHJpYnV0aW9uIGV4dGVuZHMgQ29udHJvbENvbnRyaWJ1dGlvbiB7Ci0JCi0JLyoqCi0JICogVGhlIENvbnRyaWJ1dGlvbiBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRJT05fSUQgPSBGb250TmFtZUNvbnRyaWJ1dGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCS8vIFRoZSBmb250IG5hbWUgY29tYm8uCi0JcHJpdmF0ZSBzdGF0aWMgQ29tYm8gZm9udE5hbWVDb21ibzsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbQlyaWNoVGV4dAlUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEZvbnROYW1lQ29udHJpYnV0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihDT05UUklCVVRJT05fSUQpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb24jY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZvbnROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQpOwotCQlmb250TmFtZUNvbWJvLmFkZChGb250TmFtZS5ERUZBVUxULmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLkFSSUFMLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLkNPVVJJRVJfTkVXLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLlRJTUVTX05FV19ST01BTi5nZXROYW1lKCkpOwotCQlmb250TmFtZUNvbWJvLmFkZChGb250TmFtZS5WRVJEQU5BLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudChmb250TmFtZUNvbWJvLmdldEl0ZW1Db3VudCgpKTsJCQotCQlmb250TmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWZvbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT2JqZWN0IGV2ZW50U3JjID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJCWlmIChldmVudFNyYyBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQkJCQlDb21ibyBjb21ibyA9IChDb21ibylldmVudFNyYzsKLQkJCQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBGb250TmFtZS5nZXRGb250TmFtZShpbmRleCkuZ2V0VmFsdWUoKTsKLQkJCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9OQU1FLCB2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSk7Ci0JCX0KLQkJCi0JCXJldHVybiBmb250TmFtZUNvbWJvOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250U2l6ZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvRm9udFNpemVDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkYzg4NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250U2l6ZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJvbENvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIENvbnRyaWJ1dGVzIGEgY29tYm8gY29udGFpbmluZyBIVE1MIGZvbnQgc2l6ZXMgdG8gYSB0b29sIGJhci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udFNpemVDb250cmlidXRpb24gZXh0ZW5kcyBDb250cm9sQ29udHJpYnV0aW9uIHsKLQkKLQkvKioKLQkgKiBUaGUgQ29udHJpYnV0aW9uIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVElPTl9JRCA9IEZvbnRTaXplQ29udHJpYnV0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQkKLQkvLyBUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0JCi0JLy8gVGhlIGZvbnQgc2l6ZSBjb21iby4KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBmb250U2l6ZUNvbWJvOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtCXJpY2hUZXh0CVRoZSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRm9udFNpemVDb250cmlidXRpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKENPTlRSSUJVVElPTl9JRCk7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJvbENvbnRyaWJ1dGlvbiNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZm9udFNpemVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCk7Ci0JCWZvbnRTaXplQ29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemVDb21iby5hZGQoIjIiKTsgLy8kTk9OLU5MUy0xJAotCQlmb250U2l6ZUNvbWJvLmFkZCgiMyIpOyAvLyROT04tTkxTLTEkCi0JCWZvbnRTaXplQ29tYm8uYWRkKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemVDb21iby5hZGQoIjUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb250U2l6ZUNvbWJvLmFkZCgiNiIpOyAvLyROT04tTkxTLTEkCi0JCWZvbnRTaXplQ29tYm8uYWRkKCI3Iik7IC8vJE5PTi1OTFMtMSQJCQotCQlmb250U2l6ZUNvbWJvLnNldFZpc2libGVJdGVtQ291bnQoZm9udFNpemVDb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWZvbnRTaXplQ29tYm8uc2VsZWN0KDIpOwotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJZm9udFNpemVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPYmplY3QgZXZlbnRTcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKGV2ZW50U3JjIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKWV2ZW50U3JjOwotCQkJCQkJaW50IGZvbnRTaXplID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSArIDE7Ci0JCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfU0laRSwgIiIgKyBmb250U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX07Ci0JCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIGZvbnRTaXplQ29tYm87Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWU2M2UuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRhbGljQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSXRhbGljQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLml0YWxpY0FjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSVRBTElDLCBudWxsKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMzJmMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLkhUTUxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCByaWNoIHRleHQgYWN0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSaWNoVGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSFRNTEVkaXRvciBlZGl0b3IgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmljaFRleHRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZlRWRpdG9yCi0JICogICAgICAgICAgICB0aGUgYWN0aXZlIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEhUTUxFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChIVE1MRWRpdG9yKSBhY3RpdmVFZGl0b3I7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFiNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJzY3JpcHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdWJzY3JpcHRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJvbGRBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQsIG51bGwpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMGEyNTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAndW5kZXJsaW5lJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5kZXJsaW5lQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVW5kZXJsaW5lQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1VOREVSTElORSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuVU5ERVJMSU5FLCBudWxsKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDc1YjkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvSFRNTEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0KLS8qKgotICogQSBIVE1MIGVkaXRvciBidWlsdCB3aXRoIGEgcmljaCB0ZXh0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxFZGl0b3IgZXh0ZW5kcyBFZGl0b3JQYXJ0IHsKLQotCS8vIFRoZSBSaWNoIFRleHQgY29udHJvbC4KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNldFNpdGUoc2l0ZSk7Ci0JCQlzZXRJbnB1dChpbnB1dCk7Ci0JCQlzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCXJpY2hUZXh0ID0gbmV3IFJpY2hUZXh0KHBhcmVudCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmljaFRleHQgPSBudWxsOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2Rpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIGEgcmljaCB0ZXh0IGNvbW1hbmQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgYSBjb21tYS1kZWxpbWl0ZWQgY29tbWFuZHMgYXNzY2lhdGVkIHdpdGggdGhlIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtcykgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgcGFyYW1zKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvSFRNTEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4Y2Q4Mi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnMuQm9sZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9ucy5JdGFsaWNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnMuVW5kZXJsaW5lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEEgSFRNTCBlZGl0b3IgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBlZGl0b3I7Ci0JcHJpdmF0ZSBCb2xkQWN0aW9uIGJvbGRBY3Rpb247Ci0JcHJpdmF0ZSBJdGFsaWNBY3Rpb24gaXRhbGljQWN0aW9uOwotCXByaXZhdGUgVW5kZXJsaW5lQWN0aW9uIHVuZGVybGluZUFjdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQoSUFjdGlvbkJhcnMsIElXb3JrYmVuY2hQYWdlKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgIAlzdXBlci5pbml0KGJhcnMsIHBhZ2UpOwotICAgIAlib2xkQWN0aW9uID0gbmV3IEJvbGRBY3Rpb24oKTsKLSAgICAJaXRhbGljQWN0aW9uID0gbmV3IEl0YWxpY0FjdGlvbigpOwotICAgIAl1bmRlcmxpbmVBY3Rpb24gPSBuZXcgVW5kZXJsaW5lQWN0aW9uKCk7Ci0gICAgCQotICAgIAlJVG9vbEJhck1hbmFnZXIgdG9vbEJhciA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAJCi0gICAgCXRvb2xCYXIuYWRkKGJvbGRBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZChpdGFsaWNBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZCh1bmRlcmxpbmVBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIAkKLSAgICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotICAgIAllZGl0b3IgPSBhY3RpdmVFZGl0b3I7Ci0gICAgCWJvbGRBY3Rpb24uc2V0QWN0aXZlRWRpdG9yKGVkaXRvcik7Ci0gICAgCWl0YWxpY0FjdGlvbi5zZXRBY3RpdmVFZGl0b3IoZWRpdG9yKTsKLSAgICAJdW5kZXJsaW5lQWN0aW9uLnNldEFjdGl2ZUVkaXRvcihlZGl0b3IpOwotICAgIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI3NldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvTXVsdGlQYWdlSFRNTEVkaXRvci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvTXVsdGlQYWdlSFRNTEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzIwOWM1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9lZGl0b3JzL011bHRpUGFnZUhUTUxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmVkaXRvcnM7Ci0KLS8qKgotICogQSBtdWx0aS1wYWdlIEhUTUwgZWRpdG9yIGJ1aWx0IHdpdGggYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLQotcHVibGljIGNsYXNzIE11bHRpUGFnZUhUTUxFZGl0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IHsKLQkKLQkvLyBUaGUgUmljaCBUZXh0IGVkaXRvci4KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dEVkaXRvcjsKLQkKLQkvLyBUaGUgSFRNTCBzb3VyY2UgZWRpdG9yLgotCXByaXZhdGUgVGV4dCBodG1sRWRpdG9yOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpUGFnZUhUTUxFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JICAgIHNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7CQotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVQYWdlKCkKLQkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLSAgICAJY3JlYXRlUmljaFRleHRQYWdlKCk7Ci0gICAgCWNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgUmljaCBUZXh0IHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmljaFRleHRQYWdlKCkgewotCQlyaWNoVGV4dEVkaXRvciA9IG5ldyBSaWNoVGV4dChnZXRDb250YWluZXIoKSwgU1dULk5PTkUpOwotCQlpbnQgaW5kZXggPSBhZGRQYWdlKHJpY2hUZXh0RWRpdG9yLmdldENvbnRyb2woKSk7Ci0JCXNldFBhZ2VUZXh0KGluZGV4LCAiUmljaCBUZXh0Iik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIEhUTUwgU291cmNlIHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpIHsKLSAgICAJaHRtbEVkaXRvciA9IG5ldyBUZXh0KGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWludCBpbmRleCA9IGFkZFBhZ2UoaHRtbEVkaXRvcik7Ci0JCXNldFBhZ2VUZXh0KGluZGV4LCAiSFRNTCIpOwotICAgIH0gICAgCi0gICAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjcGFnZUNoYW5nZShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQkJc3dpdGNoIChuZXdQYWdlSW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQlyaWNoVGV4dEVkaXRvci5zZXRUZXh0KGh0bWxFZGl0b3IuZ2V0VGV4dCgpKTsJCQkKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlodG1sRWRpdG9yLnNldFRleHQocmljaFRleHRFZGl0b3IuZ2V0VGV4dCgpKTsJCQkKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkaXNEaXJ0eSgpCi0JICovICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8gIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8gICAgCi0gICAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvUmljaFRleHRUZXN0RWRpdG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9SaWNoVGV4dFRlc3RFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0MDk3Ny4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9SaWNoVGV4dFRlc3RFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZEltYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZExpbmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRPcmRlcmVkTGlzdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRUYWJsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRVbm9yZGVyZWRMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJsb2NrVGFnQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJvbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udE5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFNpemVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFN0eWxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkluZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JdGFsaWNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSnVzdGlmeUNlbnRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5RnVsbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5TGVmdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5UmlnaHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuT3V0ZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5TdWJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuU3VwZXJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuVGlkeUFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlVuZGVybGluZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgYmFzZSByaWNoIHRleHQgZWRpdG9yIGFuZCBwb3B1bGF0ZXMgaXRzIHRvb2wgYmFyIHdpdGggc29tZSB1c2VmdWwKLSAqIGFjdGlvbiBpdGVtcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0VGVzdEVkaXRvciBleHRlbmRzIFJpY2hUZXh0RWRpdG9yIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgZm9yIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHlwZXJsaW5rcyBpbiB0aGUgZWRpdG9yCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRlc3RFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIGVkaXRvclNpdGUpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBSaWNoIFRleHQgZWRpdG9yIHRvb2wgYmFyIHdpdGggYWN0aW9uIGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSB0b29sQmFyCi0JICogICAgICAgICAgICBUaGUgUmljaCB0ZXh0IGVkaXRvciB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG9vbEJhcihJUmljaFRleHRUb29sQmFyIHRvb2xCYXIpIHsKLS8qCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFN0eWxlQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEJsb2NrVGFnQWN0aW9uKCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udE5hbWVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFNpemVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ3V0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IENvcHlBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgUGFzdGVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQm9sZEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBJdGFsaWNBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgVW5kZXJsaW5lQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFN1YnNjcmlwdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBTdXBlcnNjcmlwdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBUaWR5QWN0aW9uR3JvdXAodGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUxlZnRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUNlbnRlckFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBKdXN0aWZ5UmlnaHRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUZ1bGxBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkT3JkZXJlZExpc3RBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBPdXRkZW50QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEluZGVudEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCWlmIChyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpICE9IG51bGwpCi0JCQl0b29sQmFyLmFkZEFjdGlvbihyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZExpbmVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkTGlua0FjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRJbWFnZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRUYWJsZUFjdGlvbih0aGlzKSk7Ki8KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy92aWV3cy9SaWNoVGV4dFRlc3RWaWV3LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvdmlld3MvUmljaFRleHRUZXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY3NzgyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy92aWV3cy9SaWNoVGV4dFRlc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkTGlua0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRUYWJsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkJsb2NrVGFnQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkZvbnROYW1lQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkZvbnRTaXplQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogQSB0ZXN0IHZpZXcgY29udGFpbmluZyBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCQotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJpY2hUZXh0VGVzdFZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkKLQkJcmljaFRleHQgPSBuZXcgUmljaFRleHQoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWlmIChyaWNoVGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXJpY2hUZXh0LnNldFRleHQoIjxoMz5IZWxsbyBXb3JsZDwvaDM+Iik7Ci0JCQotCQlBY3Rpb24gYm9sZEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQpOwotCQkJfQotCQl9OwotCQlib2xkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19CT0xEKTsKLQkJCi0JCUFjdGlvbiBpdGFsaWNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JVEFMSUMpOwotCQkJfQotCQl9OwotCQlpdGFsaWNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7CQkKLQkJCi0JCUFjdGlvbiB1bmRlcmxpbmVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5VTkRFUkxJTkUpOwotCQkJfQotCQl9OwotCQl1bmRlcmxpbmVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1VOREVSTElORSk7Ci0JCQotCQlBY3Rpb24gc3Vic2NyaXB0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VCU0NSSVBUKTsKLQkJCX0KLQkJfTsKLQkJc3Vic2NyaXB0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19TVUJTQ1JJUFQpOwotCQkKLQkJQWN0aW9uIHN1cGVyc2NyaXB0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VQRVJTQ1JJUFQpOwotCQkJfQotCQl9OwotCQlzdXBlcnNjcmlwdEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfU1VQRVJTQ1JJUFQpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlMZWZ0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9MRUZUKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUxlZnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfTEVGVCk7Ci0JCQotCQlBY3Rpb24ganVzdGlmeUNlbnRlckFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfQ0VOVEVSKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUNlbnRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9DRU5URVIpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlSaWdodEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfUklHSFQpOwotCQkJfQotCQl9OwotCQlqdXN0aWZ5UmlnaHRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfUklHSFQpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlGdWxsQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9GVUxMKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUZ1bGxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfRlVMTCk7CQkKLQkJCi0JCUFjdGlvbiBhZGRPcmRlcmVkTGlzdEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9PUkRFUkVEX0xJU1QpOwotCQkJfQotCQl9OwotCQlhZGRPcmRlcmVkTGlzdEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX09SREVSRURfTElTVCk7Ci0JCQotCQlBY3Rpb24gYWRkVW5vcmRlcmVkTGlzdEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9VTk9SREVSRURfTElTVCk7Ci0JCQl9Ci0JCX07Ci0JCWFkZFVub3JkZXJlZExpc3RBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCQotCQlBY3Rpb24gb3V0ZGVudEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLk9VVERFTlQpOwotCQkJfQotCQl9OwotCQlvdXRkZW50QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19PVVRERU5UKTsKLQkJCi0JCUFjdGlvbiBpbmRlbnRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JTkRFTlQpOwotCQkJfQotCQl9OwotCQlpbmRlbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lOREVOVCk7Ci0JCQotCQlBY3Rpb24gYWRkTGluZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9MSU5FKTsKLQkJCX0KLQkJfTsKLQkJYWRkTGluZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0xJTkUpOwkJCi0JCQotCQlBY3Rpb24gYWRkTGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkTGlua0RpYWxvZyBkaWFsb2cgPSBuZXcgQWRkTGlua0RpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBudWxsKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCUxpbmsgbGluayA9IGRpYWxvZy5nZXRMaW5rKCk7Ci0JCQkJaWYgKGxpbmsuZ2V0VVJMKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfTElOSywgbGluay5nZXRVUkwoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRMaW5rQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfTElOSyk7Ci0JCQotCQlBY3Rpb24gYWRkSW1hZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFkZEltYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRJbWFnZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCUltYWdlIGltYWdlID0gZGlhbG9nLmdldEltYWdlKCk7Ci0JCQkJaWYgKGltYWdlLmdldFVSTCgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLCBpbWFnZS5nZXRVUkwoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRJbWFnZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJCi0JCUFjdGlvbiBhZGRUYWJsZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkVGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFRhYmxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJVGFibGUgdGFibGUgPSBkaWFsb2cuZ2V0VGFibGUoKTsKLQkJCQlpbnQgcm93cyA9IHRhYmxlLmdldFJvd3MoKTsKLQkJCQlpbnQgY29scyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCQlTdHJpbmcgd2lkdGggPSB0YWJsZS5nZXRXaWR0aCgpOwotCQkJCWlmIChyb3dzID4gMCAmJiBjb2xzID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX1RBQkxFLCByb3dzICsgIicsICciICsgY29scyArICInLCAnIiArIHdpZHRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRUYWJsZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX1RBQkxFKTsKLQkJCi0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNZ3IgPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQotCQl0b29sQmFyTWdyLmFkZChuZXcgQmxvY2tUYWdDb250cmlidXRpb24ocmljaFRleHQpKTsJCQotCQl0b29sQmFyTWdyLmFkZChuZXcgRm9udE5hbWVDb250cmlidXRpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IEZvbnRTaXplQ29udHJpYnV0aW9uKHJpY2hUZXh0KSk7CQkKLQkJCi0JCXRvb2xCYXJNZ3IuYWRkKGJvbGRBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChpdGFsaWNBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZCh1bmRlcmxpbmVBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0b29sQmFyTWdyLmFkZChzdWJzY3JpcHRBY3Rpb24pOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKHN1cGVyc2NyaXB0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeUxlZnRBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChqdXN0aWZ5Q2VudGVyQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeVJpZ2h0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeUZ1bGxBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKGFkZE9yZGVyZWRMaXN0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoYWRkVW5vcmRlcmVkTGlzdEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CQkKLQkJdG9vbEJhck1nci5hZGQob3V0ZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKGluZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRvb2xCYXJNZ3IuYWRkKGFkZExpbmVBY3Rpb24pOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKGFkZExpbmtBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChhZGRJbWFnZUFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKGFkZFRhYmxlQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcigpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0M2M0Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNGY2ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzY0YTM2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVQRiBUZXN0cyBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS41LjAiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLy5jbGFzc3BhdGggYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTE2OGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZmYzOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFjZThjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc291cmNlLmVwZnRlc3RzLmphciA9IHNyYy8KLW91dHB1dC5lcGZ0ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZXBmdGVzdHMuamFyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvQWxsVGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi90ZXN0cy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE1ZWY3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMuQ29tbW9uVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RzOwotCi0vKioKLSAqIEpVbml0IFRlc3RzIGZvciBFUEYgQ29tcG9zZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQJCQotCQlzdWl0ZS5hZGRUZXN0KENvbW1vblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KExpYnJhcnlUZXN0cy5zdWl0ZSgpKTsJCQotCQkvLyRKVW5pdC1FTkQkCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3Rlc3RzL3VpL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXJUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvdWkvVXNlckludGVyYWN0aW9uSGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5M2Q1Yy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvdWkvVXNlckludGVyYWN0aW9uSGFuZGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudGVzdHMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI3LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNzZWxlY3QoamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIGJvb2xlYW4sIGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlbGVjdCgpIHsKLQkJZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNzZWxlY3RPbmUoaW50W10sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlbGVjdE9uZSgpIHsKLQkJZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNyZXF1ZXN0SW5wdXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdElucHV0KCkgewotCQlMaXN0IGlucHV0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpPTA7IGk8MjsgaSsrKXsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkKCJJdGVtMSIpOwotCQkJbGlzdC5hZGQoIkl0ZW0yIik7Ci0JCQlVc2VySW5wdXQgaW5wdXQgPSBuZXcgVXNlcklucHV0KCJMYWJlbCBOYW1lIitpLCBpLCB0cnVlLCBsaXN0LAotCQkJCQkJCW5ldyBJdGVtTGFiZWxQcm92aWRlcigpLCBudWxsLCBudWxsKTsKLQkJCWlucHV0cy5hZGQoaW5wdXQpOwotCQl9Ci0JCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQl1aUhhbmRsZXIucmVxdWVzdElucHV0KCJUZXN0aW5nIFRpdGxlIiwgIk5pY2UgbWVzc2FnZSIsIGlucHV0cyk7Ci0JCQotCQlmb3IoSXRlcmF0b3IgaXQgPSBpbnB1dHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3Qgb3ggPSBpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByaW50IDogIisgKChVc2VySW5wdXQpb3gpLmdldElucHV0KCkpOwotCQl9Ci0JCS8vZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNZXNzZW5nZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCi0JCUlNZXNzZW5nZXIgbWVzc2VuZ2VyID0gdWlIYW5kbGVyLmdldE1lc3NlbmdlcigpOwotCi0JCS8vIFdlIGFyZSB0ZXN0aW5nIG1lc3NhZ2UgZGlhbG9ncyBidXQgRXJyb3JEaWFsb2cuQVVUT01BVEVEX01PREUgaXMgc2V0Ci0JCS8vIHRvIHRydWUgYnkgRWNsaXBzZSB3aGlsZSBydW5uaW5nIEpVbml0IHRlc3QuIFNvIHdlIHNldCB0aGlzIGZsYWcKLQkJLy8gYmFjayB0byBmYWxzZS4KLQkJLy8KLQkJRXJyb3JEaWFsb2cuQVVUT01BVEVEX01PREUgPSBmYWxzZTsKLQotCQkvLyB0ZXN0IHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCQkvLwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJtZXNzYWdlIik7Ci0JCW1lc3Nlbmdlci5zaG93RXJyb3IobnVsbCwgIk5VTEwgdGl0bGUiKTsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcihudWxsLCBudWxsKTsKLQotCQkvLyB0ZXN0IHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKQotCQkvLwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJOVUwgc3RhdHVzIiwgbnVsbCk7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IFRlc3RzUGx1Z2luLlBMVUdJTl9JRDsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcigidGl0bGUiLCAibWVzc2FnZSIsIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywKLQkJCQlwbHVnaW5JRCwgMCwgIk9LIHN0YXR1cyIsIG51bGwpKTsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcigidGl0bGUiLCAibWVzc2FnZSIsIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQlwbHVnaW5JRCwgMCwgIkVSUk9SIHN0YXR1cyIsIG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJInJ1bnRpbWUgZXhjZXB0aW9uIikpKTsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklELCAwLCAiIiwgbnVsbCk7Ci0JCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBwbHVnaW5JRCwgMCwgIk9LIHN0YXR1cyIsIG51bGwpKTsKLQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklELCAwLCAiRVJST1Igc3RhdHVzIiwKLQkJCQluZXcgUnVudGltZUV4Y2VwdGlvbigicnVudGltZSBleGNlcHRpb24iKSkpOwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJtZXNzYWdlIiwgc3RhdHVzKTsKLQl9Ci19Cg==